/ Hex Artifact Content
Login

Artifact 1ab82a27ed4f1e8dc640b7ca0ffb074c4233e495:


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 64 62   if( (pBtree->db
14c0: 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
14d0: 5f 4f 74 61 4d 6f 64 65 29 0a 20 20 20 7c 7c 20  _OtaMode).   || 
14e0: 28 70 42 74 72 65 65 2d 3e 73 68 61 72 61 62 6c  (pBtree->sharabl
14f0: 65 3d 3d 30 29 0a 20 20 20 7c 7c 20 28 65 4c 6f  e==0).   || (eLo
1500: 63 6b 54 79 70 65 3d 3d 52 45 41 44 5f 4c 4f 43  ckType==READ_LOC
1510: 4b 20 26 26 20 28 70 42 74 72 65 65 2d 3e 64 62  K && (pBtree->db
1520: 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
1530: 5f 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64  _ReadUncommitted
1540: 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75  )).  ){.    retu
1550: 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  rn 1;.  }..  /* 
1560: 49 66 20 74 68 65 20 63 6c 69 65 6e 74 20 69 73  If the client is
1570: 20 72 65 61 64 69 6e 67 20 20 6f 72 20 77 72 69   reading  or wri
1580: 74 69 6e 67 20 61 6e 20 69 6e 64 65 78 20 61 6e  ting an index an
1590: 64 20 74 68 65 20 73 63 68 65 6d 61 20 69 73 0a  d the schema is.
15a0: 20 20 2a 2a 20 6e 6f 74 20 6c 6f 61 64 65 64 2c    ** not loaded,
15b0: 20 74 68 65 6e 20 69 74 20 69 73 20 74 6f 6f 20   then it is too 
15c0: 64 69 66 66 69 63 75 6c 74 20 74 6f 20 61 63 74  difficult to act
15d0: 75 61 6c 6c 79 20 63 68 65 63 6b 20 74 6f 20 73  ually check to s
15e0: 65 65 20 69 66 0a 20 20 2a 2a 20 74 68 65 20 63  ee if.  ** the c
15f0: 6f 72 72 65 63 74 20 6c 6f 63 6b 73 20 61 72 65  orrect locks are
1600: 20 68 65 6c 64 2e 20 20 53 6f 20 64 6f 20 6e 6f   held.  So do no
1610: 74 20 62 6f 74 68 65 72 20 2d 20 6a 75 73 74 20  t bother - just 
1620: 72 65 74 75 72 6e 20 74 72 75 65 2e 0a 20 20 2a  return true..  *
1630: 2a 20 54 68 69 73 20 63 61 73 65 20 64 6f 65 73  * This case does
1640: 20 6e 6f 74 20 63 6f 6d 65 20 75 70 20 76 65 72   not come up ver
1650: 79 20 6f 66 74 65 6e 20 61 6e 79 68 6f 77 2e 0a  y often anyhow..
1660: 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 49 6e 64    */.  if( isInd
1670: 65 78 20 26 26 20 28 21 70 53 63 68 65 6d 61 20  ex && (!pSchema 
1680: 7c 7c 20 28 70 53 63 68 65 6d 61 2d 3e 73 63 68  || (pSchema->sch
1690: 65 6d 61 46 6c 61 67 73 26 44 42 5f 53 63 68 65  emaFlags&DB_Sche
16a0: 6d 61 4c 6f 61 64 65 64 29 3d 3d 30 29 20 29 7b  maLoaded)==0) ){
16b0: 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
16c0: 20 7d 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20   }..  /* Figure 
16d0: 6f 75 74 20 74 68 65 20 72 6f 6f 74 2d 70 61 67  out the root-pag
16e0: 65 20 74 68 61 74 20 74 68 65 20 6c 6f 63 6b 20  e that the lock 
16f0: 73 68 6f 75 6c 64 20 62 65 20 68 65 6c 64 20 6f  should be held o
1700: 6e 2e 20 46 6f 72 20 74 61 62 6c 65 0a 20 20 2a  n. For table.  *
1710: 2a 20 62 2d 74 72 65 65 73 2c 20 74 68 69 73 20  * b-trees, this 
1720: 69 73 20 6a 75 73 74 20 74 68 65 20 72 6f 6f 74  is just the root
1730: 20 70 61 67 65 20 6f 66 20 74 68 65 20 62 2d 74   page of the b-t
1740: 72 65 65 20 62 65 69 6e 67 20 72 65 61 64 20 6f  ree being read o
1750: 72 0a 20 20 2a 2a 20 77 72 69 74 74 65 6e 2e 20  r.  ** written. 
1760: 46 6f 72 20 69 6e 64 65 78 20 62 2d 74 72 65 65  For index b-tree
1770: 73 2c 20 69 74 20 69 73 20 74 68 65 20 72 6f 6f  s, it is the roo
1780: 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 61 73  t page of the as
1790: 73 6f 63 69 61 74 65 64 0a 20 20 2a 2a 20 74 61  sociated.  ** ta
17a0: 62 6c 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20 69  ble.  */.  if( i
17b0: 73 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 48 61  sIndex ){.    Ha
17c0: 73 68 45 6c 65 6d 20 2a 70 3b 0a 20 20 20 20 66  shElem *p;.    f
17d0: 6f 72 28 70 3d 73 71 6c 69 74 65 48 61 73 68 46  or(p=sqliteHashF
17e0: 69 72 73 74 28 26 70 53 63 68 65 6d 61 2d 3e 69  irst(&pSchema->i
17f0: 64 78 48 61 73 68 29 3b 20 70 3b 20 70 3d 73 71  dxHash); p; p=sq
1800: 6c 69 74 65 48 61 73 68 4e 65 78 74 28 70 29 29  liteHashNext(p))
1810: 7b 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70  {.      Index *p
1820: 49 64 78 20 3d 20 28 49 6e 64 65 78 20 2a 29 73  Idx = (Index *)s
1830: 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 70 29  qliteHashData(p)
1840: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 64 78  ;.      if( pIdx
1850: 2d 3e 74 6e 75 6d 3d 3d 28 69 6e 74 29 69 52 6f  ->tnum==(int)iRo
1860: 6f 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69 54  ot ){.        iT
1870: 61 62 20 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c  ab = pIdx->pTabl
1880: 65 2d 3e 74 6e 75 6d 3b 0a 20 20 20 20 20 20 7d  e->tnum;.      }
1890: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
18a0: 20 20 20 20 69 54 61 62 20 3d 20 69 52 6f 6f 74      iTab = iRoot
18b0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 61 72  ;.  }..  /* Sear
18c0: 63 68 20 66 6f 72 20 74 68 65 20 72 65 71 75 69  ch for the requi
18d0: 72 65 64 20 6c 6f 63 6b 2e 20 45 69 74 68 65 72  red lock. Either
18e0: 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e   a write-lock on
18f0: 20 72 6f 6f 74 2d 70 61 67 65 20 69 54 61 62 2c   root-page iTab,
1900: 20 61 20 0a 20 20 2a 2a 20 77 72 69 74 65 2d 6c   a .  ** write-l
1910: 6f 63 6b 20 6f 6e 20 74 68 65 20 73 63 68 65 6d  ock on the schem
1920: 61 20 74 61 62 6c 65 2c 20 6f 72 20 28 69 66 20  a table, or (if 
1930: 74 68 65 20 63 6c 69 65 6e 74 20 69 73 20 72 65  the client is re
1940: 61 64 69 6e 67 29 20 61 0a 20 20 2a 2a 20 72 65  ading) a.  ** re
1950: 61 64 2d 6c 6f 63 6b 20 6f 6e 20 69 54 61 62 20  ad-lock on iTab 
1960: 77 69 6c 6c 20 73 75 66 66 69 63 65 2e 20 52 65  will suffice. Re
1970: 74 75 72 6e 20 31 20 69 66 20 61 6e 79 20 6f 66  turn 1 if any of
1980: 20 74 68 65 73 65 20 61 72 65 20 66 6f 75 6e 64   these are found
1990: 2e 20 20 2a 2f 0a 20 20 66 6f 72 28 70 4c 6f 63  .  */.  for(pLoc
19a0: 6b 3d 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70  k=pBtree->pBt->p
19b0: 4c 6f 63 6b 3b 20 70 4c 6f 63 6b 3b 20 70 4c 6f  Lock; pLock; pLo
19c0: 63 6b 3d 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 29  ck=pLock->pNext)
19d0: 7b 0a 20 20 20 20 69 66 28 20 70 4c 6f 63 6b 2d  {.    if( pLock-
19e0: 3e 70 42 74 72 65 65 3d 3d 70 42 74 72 65 65 20  >pBtree==pBtree 
19f0: 0a 20 20 20 20 20 26 26 20 28 70 4c 6f 63 6b 2d  .     && (pLock-
1a00: 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62 20 7c 7c  >iTable==iTab ||
1a10: 20 28 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 3d 3d   (pLock->eLock==
1a20: 57 52 49 54 45 5f 4c 4f 43 4b 20 26 26 20 70 4c  WRITE_LOCK && pL
1a30: 6f 63 6b 2d 3e 69 54 61 62 6c 65 3d 3d 31 29 29  ock->iTable==1))
1a40: 0a 20 20 20 20 20 26 26 20 70 4c 6f 63 6b 2d 3e  .     && pLock->
1a50: 65 4c 6f 63 6b 3e 3d 65 4c 6f 63 6b 54 79 70 65  eLock>=eLockType
1a60: 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72   .    ){.      r
1a70: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
1a80: 20 7d 0a 0a 20 20 2f 2a 20 46 61 69 6c 65 64 20   }..  /* Failed 
1a90: 74 6f 20 66 69 6e 64 20 74 68 65 20 72 65 71 75  to find the requ
1aa0: 69 72 65 64 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20  ired lock. */.  
1ab0: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64  return 0;.}.#end
1ac0: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42  if /* SQLITE_DEB
1ad0: 55 47 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51  UG */..#ifdef SQ
1ae0: 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a  LITE_DEBUG./*.**
1af0: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
1b00: 20 6d 61 79 20 62 65 20 75 73 65 64 20 61 73 20   may be used as 
1b10: 70 61 72 74 20 6f 66 20 61 73 73 65 72 74 28 29  part of assert()
1b20: 20 73 74 61 74 65 6d 65 6e 74 73 20 6f 6e 6c 79   statements only
1b30: 2e 20 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 52 65 74  . ****.**.** Ret
1b40: 75 72 6e 20 74 72 75 65 20 69 66 20 69 74 20 77  urn true if it w
1b50: 6f 75 6c 64 20 62 65 20 69 6c 6c 65 67 61 6c 20  ould be illegal 
1b60: 66 6f 72 20 70 42 74 72 65 65 20 74 6f 20 77 72  for pBtree to wr
1b70: 69 74 65 20 69 6e 74 6f 20 74 68 65 0a 2a 2a 20  ite into the.** 
1b80: 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 72  table or index r
1b90: 6f 6f 74 65 64 20 61 74 20 69 52 6f 6f 74 20 62  ooted at iRoot b
1ba0: 65 63 61 75 73 65 20 6f 74 68 65 72 20 73 68 61  ecause other sha
1bb0: 72 65 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20  red connections 
1bc0: 61 72 65 0a 2a 2a 20 73 69 6d 75 6c 74 61 6e 65  are.** simultane
1bd0: 6f 75 73 6c 79 20 72 65 61 64 69 6e 67 20 74 68  ously reading th
1be0: 61 74 20 73 61 6d 65 20 74 61 62 6c 65 20 6f 72  at same table or
1bf0: 20 69 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 49 74   index..**.** It
1c00: 20 69 73 20 69 6c 6c 65 67 61 6c 20 66 6f 72 20   is illegal for 
1c10: 70 42 74 72 65 65 20 74 6f 20 77 72 69 74 65 20  pBtree to write 
1c20: 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 42 74  if some other Bt
1c30: 72 65 65 20 6f 62 6a 65 63 74 20 74 68 61 74 0a  ree object that.
1c40: 2a 2a 20 73 68 61 72 65 73 20 74 68 65 20 73 61  ** shares the sa
1c50: 6d 65 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65  me BtShared obje
1c60: 63 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  ct is currently 
1c70: 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69  reading or writi
1c80: 6e 67 0a 2a 2a 20 74 68 65 20 69 52 6f 6f 74 20  ng.** the iRoot 
1c90: 74 61 62 6c 65 2e 20 20 45 78 63 65 70 74 2c 20  table.  Except, 
1ca0: 69 66 20 74 68 65 20 6f 74 68 65 72 20 42 74 72  if the other Btr
1cb0: 65 65 20 6f 62 6a 65 63 74 20 68 61 73 20 74 68  ee object has th
1cc0: 65 0a 2a 2a 20 72 65 61 64 2d 75 6e 63 6f 6d 6d  e.** read-uncomm
1cd0: 69 74 74 65 64 20 66 6c 61 67 20 73 65 74 2c 20  itted flag set, 
1ce0: 74 68 65 6e 20 69 74 20 69 73 20 4f 4b 20 66 6f  then it is OK fo
1cf0: 72 20 74 68 65 20 6f 74 68 65 72 20 6f 62 6a 65  r the other obje
1d00: 63 74 20 74 6f 0a 2a 2a 20 68 61 76 65 20 61 20  ct to.** have a 
1d10: 72 65 61 64 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a  read cursor..**.
1d20: 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  ** For example, 
1d30: 62 65 66 6f 72 65 20 77 72 69 74 69 6e 67 20 74  before writing t
1d40: 6f 20 61 6e 79 20 70 61 72 74 20 6f 66 20 74 68  o any part of th
1d50: 65 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78  e table or index
1d60: 0a 2a 2a 20 72 6f 6f 74 65 64 20 61 74 20 70 61  .** rooted at pa
1d70: 67 65 20 69 52 6f 6f 74 2c 20 6f 6e 65 20 73 68  ge iRoot, one sh
1d80: 6f 75 6c 64 20 63 61 6c 6c 3a 0a 2a 2a 0a 2a 2a  ould call:.**.**
1d90: 20 20 20 20 61 73 73 65 72 74 28 20 21 68 61 73      assert( !has
1da0: 52 65 61 64 43 6f 6e 66 6c 69 63 74 73 28 70 42  ReadConflicts(pB
1db0: 74 72 65 65 2c 20 69 52 6f 6f 74 29 20 29 3b 0a  tree, iRoot) );.
1dc0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 68 61  */.static int ha
1dd0: 73 52 65 61 64 43 6f 6e 66 6c 69 63 74 73 28 42  sReadConflicts(B
1de0: 74 72 65 65 20 2a 70 42 74 72 65 65 2c 20 50 67  tree *pBtree, Pg
1df0: 6e 6f 20 69 52 6f 6f 74 29 7b 0a 20 20 42 74 43  no iRoot){.  BtC
1e00: 75 72 73 6f 72 20 2a 70 3b 0a 20 20 66 6f 72 28  ursor *p;.  for(
1e10: 70 3d 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70  p=pBtree->pBt->p
1e20: 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e  Cursor; p; p=p->
1e30: 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20  pNext){.    if( 
1e40: 70 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 69 52 6f  p->pgnoRoot==iRo
1e50: 6f 74 20 0a 20 20 20 20 20 26 26 20 70 2d 3e 70  ot .     && p->p
1e60: 42 74 72 65 65 21 3d 70 42 74 72 65 65 0a 20 20  Btree!=pBtree.  
1e70: 20 20 20 26 26 20 30 3d 3d 28 70 2d 3e 70 42 74     && 0==(p->pBt
1e80: 72 65 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26  ree->db->flags &
1e90: 20 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f   SQLITE_ReadUnco
1ea0: 6d 6d 69 74 74 65 64 29 0a 20 20 20 20 29 7b 0a  mmitted).    ){.
1eb0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
1ec0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
1ed0: 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 20 20  rn 0;.}.#endif  
1ee0: 20 20 2f 2a 20 23 69 66 64 65 66 20 53 51 4c 49    /* #ifdef SQLI
1ef0: 54 45 5f 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a  TE_DEBUG */../*.
1f00: 2a 2a 20 51 75 65 72 79 20 74 6f 20 73 65 65 20  ** Query to see 
1f10: 69 66 20 42 74 72 65 65 20 68 61 6e 64 6c 65 20  if Btree handle 
1f20: 70 20 6d 61 79 20 6f 62 74 61 69 6e 20 61 20 6c  p may obtain a l
1f30: 6f 63 6b 20 6f 66 20 74 79 70 65 20 65 4c 6f 63  ock of type eLoc
1f40: 6b 20 0a 2a 2a 20 28 52 45 41 44 5f 4c 4f 43 4b  k .** (READ_LOCK
1f50: 20 6f 72 20 57 52 49 54 45 5f 4c 4f 43 4b 29 20   or WRITE_LOCK) 
1f60: 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 77 69 74  on the table wit
1f70: 68 20 72 6f 6f 74 2d 70 61 67 65 20 69 54 61 62  h root-page iTab
1f80: 2e 20 52 65 74 75 72 6e 0a 2a 2a 20 53 51 4c 49  . Return.** SQLI
1f90: 54 45 5f 4f 4b 20 69 66 20 74 68 65 20 6c 6f 63  TE_OK if the loc
1fa0: 6b 20 6d 61 79 20 62 65 20 6f 62 74 61 69 6e 65  k may be obtaine
1fb0: 64 20 28 62 79 20 63 61 6c 6c 69 6e 67 0a 2a 2a  d (by calling.**
1fc0: 20 73 65 74 53 68 61 72 65 64 43 61 63 68 65 54   setSharedCacheT
1fd0: 61 62 6c 65 4c 6f 63 6b 28 29 29 2c 20 6f 72 20  ableLock()), or 
1fe0: 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 20 69 66  SQLITE_LOCKED if
1ff0: 20 6e 6f 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   not..*/.static 
2000: 69 6e 74 20 71 75 65 72 79 53 68 61 72 65 64 43  int querySharedC
2010: 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 42 74  acheTableLock(Bt
2020: 72 65 65 20 2a 70 2c 20 50 67 6e 6f 20 69 54 61  ree *p, Pgno iTa
2030: 62 2c 20 75 38 20 65 4c 6f 63 6b 29 7b 0a 20 20  b, u8 eLock){.  
2040: 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
2050: 70 2d 3e 70 42 74 3b 0a 20 20 42 74 4c 6f 63 6b  p->pBt;.  BtLock
2060: 20 2a 70 49 74 65 72 3b 0a 0a 20 20 61 73 73 65   *pIter;..  asse
2070: 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  rt( sqlite3Btree
2080: 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b  HoldsMutex(p) );
2090: 0a 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b  .  assert( eLock
20a0: 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 65  ==READ_LOCK || e
20b0: 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b  Lock==WRITE_LOCK
20c0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
20d0: 3e 64 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  >db!=0 );.  asse
20e0: 72 74 28 20 21 28 70 2d 3e 64 62 2d 3e 66 6c 61  rt( !(p->db->fla
20f0: 67 73 26 53 51 4c 49 54 45 5f 52 65 61 64 55 6e  gs&SQLITE_ReadUn
2100: 63 6f 6d 6d 69 74 74 65 64 29 7c 7c 65 4c 6f 63  committed)||eLoc
2110: 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 7c 7c 69  k==WRITE_LOCK||i
2120: 54 61 62 3d 3d 31 20 29 3b 0a 20 20 0a 20 20 2f  Tab==1 );.  .  /
2130: 2a 20 49 66 20 72 65 71 75 65 73 74 69 6e 67 20  * If requesting 
2140: 61 20 77 72 69 74 65 2d 6c 6f 63 6b 2c 20 74 68  a write-lock, th
2150: 65 6e 20 74 68 65 20 42 74 72 65 65 20 6d 75 73  en the Btree mus
2160: 74 20 68 61 76 65 20 61 6e 20 6f 70 65 6e 20 77  t have an open w
2170: 72 69 74 65 0a 20 20 2a 2a 20 74 72 61 6e 73 61  rite.  ** transa
2180: 63 74 69 6f 6e 20 6f 6e 20 74 68 69 73 20 66 69  ction on this fi
2190: 6c 65 2e 20 41 6e 64 2c 20 6f 62 76 69 6f 75 73  le. And, obvious
21a0: 6c 79 2c 20 66 6f 72 20 74 68 69 73 20 74 6f 20  ly, for this to 
21b0: 62 65 20 73 6f 20 74 68 65 72 65 20 0a 20 20 2a  be so there .  *
21c0: 2a 20 6d 75 73 74 20 62 65 20 61 6e 20 6f 70 65  * must be an ope
21d0: 6e 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  n write transact
21e0: 69 6f 6e 20 6f 6e 20 74 68 65 20 66 69 6c 65 20  ion on the file 
21f0: 69 74 73 65 6c 66 2e 0a 20 20 2a 2f 0a 20 20 61  itself..  */.  a
2200: 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52 45  ssert( eLock==RE
2210: 41 44 5f 4c 4f 43 4b 20 7c 7c 20 28 70 3d 3d 70  AD_LOCK || (p==p
2220: 42 74 2d 3e 70 57 72 69 74 65 72 20 26 26 20 70  Bt->pWriter && p
2230: 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
2240: 5f 57 52 49 54 45 29 20 29 3b 0a 20 20 61 73 73  _WRITE) );.  ass
2250: 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44  ert( eLock==READ
2260: 5f 4c 4f 43 4b 20 7c 7c 20 70 42 74 2d 3e 69 6e  _LOCK || pBt->in
2270: 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41  Transaction==TRA
2280: 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 0a 20  NS_WRITE );.  . 
2290: 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65   /* This routine
22a0: 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74   is a no-op if t
22b0: 68 65 20 73 68 61 72 65 64 2d 63 61 63 68 65 20  he shared-cache 
22c0: 69 73 20 6e 6f 74 20 65 6e 61 62 6c 65 64 20 2a  is not enabled *
22d0: 2f 0a 20 20 69 66 28 20 21 70 2d 3e 73 68 61 72  /.  if( !p->shar
22e0: 61 62 6c 65 20 29 7b 0a 20 20 20 20 72 65 74 75  able ){.    retu
22f0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
2300: 7d 0a 0a 20 20 2f 2a 20 49 66 20 73 6f 6d 65 20  }..  /* If some 
2310: 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e  other connection
2320: 20 69 73 20 68 6f 6c 64 69 6e 67 20 61 6e 20 65   is holding an e
2330: 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2c 20 74  xclusive lock, t
2340: 68 65 0a 20 20 2a 2a 20 72 65 71 75 65 73 74 65  he.  ** requeste
2350: 64 20 6c 6f 63 6b 20 6d 61 79 20 6e 6f 74 20 62  d lock may not b
2360: 65 20 6f 62 74 61 69 6e 65 64 2e 0a 20 20 2a 2f  e obtained..  */
2370: 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 57 72 69  .  if( pBt->pWri
2380: 74 65 72 21 3d 70 20 26 26 20 28 70 42 74 2d 3e  ter!=p && (pBt->
2390: 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 45  btsFlags & BTS_E
23a0: 58 43 4c 55 53 49 56 45 29 21 3d 30 20 29 7b 0a  XCLUSIVE)!=0 ){.
23b0: 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65      sqlite3Conne
23c0: 63 74 69 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e  ctionBlocked(p->
23d0: 64 62 2c 20 70 42 74 2d 3e 70 57 72 69 74 65 72  db, pBt->pWriter
23e0: 2d 3e 64 62 29 3b 0a 20 20 20 20 72 65 74 75 72  ->db);.    retur
23f0: 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f  n SQLITE_LOCKED_
2400: 53 48 41 52 45 44 43 41 43 48 45 3b 0a 20 20 7d  SHAREDCACHE;.  }
2410: 0a 0a 20 20 66 6f 72 28 70 49 74 65 72 3d 70 42  ..  for(pIter=pB
2420: 74 2d 3e 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b  t->pLock; pIter;
2430: 20 70 49 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e   pIter=pIter->pN
2440: 65 78 74 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  ext){.    /* The
2450: 20 63 6f 6e 64 69 74 69 6f 6e 20 28 70 49 74 65   condition (pIte
2460: 72 2d 3e 65 4c 6f 63 6b 21 3d 65 4c 6f 63 6b 29  r->eLock!=eLock)
2470: 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   in the followin
2480: 67 20 69 66 28 2e 2e 2e 29 20 0a 20 20 20 20 2a  g if(...) .    *
2490: 2a 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 61  * statement is a
24a0: 20 73 69 6d 70 6c 69 66 69 63 61 74 69 6f 6e 20   simplification 
24b0: 6f 66 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  of:.    **.    *
24c0: 2a 20 20 20 28 65 4c 6f 63 6b 3d 3d 57 52 49 54  *   (eLock==WRIT
24d0: 45 5f 4c 4f 43 4b 20 7c 7c 20 70 49 74 65 72 2d  E_LOCK || pIter-
24e0: 3e 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f  >eLock==WRITE_LO
24f0: 43 4b 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  CK).    **.    *
2500: 2a 20 73 69 6e 63 65 20 77 65 20 6b 6e 6f 77 20  * since we know 
2510: 74 68 61 74 20 69 66 20 65 4c 6f 63 6b 3d 3d 57  that if eLock==W
2520: 52 49 54 45 5f 4c 4f 43 4b 2c 20 74 68 65 6e 20  RITE_LOCK, then 
2530: 6e 6f 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74  no other connect
2540: 69 6f 6e 0a 20 20 20 20 2a 2a 20 6d 61 79 20 68  ion.    ** may h
2550: 6f 6c 64 20 61 20 57 52 49 54 45 5f 4c 4f 43 4b  old a WRITE_LOCK
2560: 20 6f 6e 20 61 6e 79 20 74 61 62 6c 65 20 69 6e   on any table in
2570: 20 74 68 69 73 20 66 69 6c 65 20 28 73 69 6e 63   this file (sinc
2580: 65 20 74 68 65 72 65 20 63 61 6e 0a 20 20 20 20  e there can.    
2590: 2a 2a 20 6f 6e 6c 79 20 62 65 20 61 20 73 69 6e  ** only be a sin
25a0: 67 6c 65 20 77 72 69 74 65 72 29 2e 0a 20 20 20  gle writer)..   
25b0: 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
25c0: 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 52 45  pIter->eLock==RE
25d0: 41 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49 74 65 72  AD_LOCK || pIter
25e0: 2d 3e 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c  ->eLock==WRITE_L
25f0: 4f 43 4b 20 29 3b 0a 20 20 20 20 61 73 73 65 72  OCK );.    asser
2600: 74 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c  t( eLock==READ_L
2610: 4f 43 4b 20 7c 7c 20 70 49 74 65 72 2d 3e 70 42  OCK || pIter->pB
2620: 74 72 65 65 3d 3d 70 20 7c 7c 20 70 49 74 65 72  tree==p || pIter
2630: 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f  ->eLock==READ_LO
2640: 43 4b 29 3b 0a 20 20 20 20 69 66 28 20 70 49 74  CK);.    if( pIt
2650: 65 72 2d 3e 70 42 74 72 65 65 21 3d 70 20 26 26  er->pBtree!=p &&
2660: 20 70 49 74 65 72 2d 3e 69 54 61 62 6c 65 3d 3d   pIter->iTable==
2670: 69 54 61 62 20 26 26 20 70 49 74 65 72 2d 3e 65  iTab && pIter->e
2680: 4c 6f 63 6b 21 3d 65 4c 6f 63 6b 20 29 7b 0a 20  Lock!=eLock ){. 
2690: 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e       sqlite3Conn
26a0: 65 63 74 69 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d  ectionBlocked(p-
26b0: 3e 64 62 2c 20 70 49 74 65 72 2d 3e 70 42 74 72  >db, pIter->pBtr
26c0: 65 65 2d 3e 64 62 29 3b 0a 20 20 20 20 20 20 69  ee->db);.      i
26d0: 66 28 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f  f( eLock==WRITE_
26e0: 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  LOCK ){.        
26f0: 61 73 73 65 72 74 28 20 70 3d 3d 70 42 74 2d 3e  assert( p==pBt->
2700: 70 57 72 69 74 65 72 20 29 3b 0a 20 20 20 20 20  pWriter );.     
2710: 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73     pBt->btsFlags
2720: 20 7c 3d 20 42 54 53 5f 50 45 4e 44 49 4e 47 3b   |= BTS_PENDING;
2730: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
2740: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43  eturn SQLITE_LOC
2750: 4b 45 44 5f 53 48 41 52 45 44 43 41 43 48 45 3b  KED_SHAREDCACHE;
2760: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
2770: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
2780: 0a 23 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49  .#endif /* !SQLI
2790: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
27a0: 41 43 48 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  ACHE */..#ifndef
27b0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41   SQLITE_OMIT_SHA
27c0: 52 45 44 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20  RED_CACHE./*.** 
27d0: 41 64 64 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68  Add a lock on th
27e0: 65 20 74 61 62 6c 65 20 77 69 74 68 20 72 6f 6f  e table with roo
27f0: 74 2d 70 61 67 65 20 69 54 61 62 6c 65 20 74 6f  t-page iTable to
2800: 20 74 68 65 20 73 68 61 72 65 64 2d 62 74 72 65   the shared-btre
2810: 65 20 75 73 65 64 0a 2a 2a 20 62 79 20 42 74 72  e used.** by Btr
2820: 65 65 20 68 61 6e 64 6c 65 20 70 2e 20 50 61 72  ee handle p. Par
2830: 61 6d 65 74 65 72 20 65 4c 6f 63 6b 20 6d 75 73  ameter eLock mus
2840: 74 20 62 65 20 65 69 74 68 65 72 20 52 45 41 44  t be either READ
2850: 5f 4c 4f 43 4b 20 6f 72 20 0a 2a 2a 20 57 52 49  _LOCK or .** WRI
2860: 54 45 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 54  TE_LOCK..**.** T
2870: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 73 73  his function ass
2880: 75 6d 65 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69  umes the followi
2890: 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 61 29 20  ng:.**.**   (a) 
28a0: 54 68 65 20 73 70 65 63 69 66 69 65 64 20 42 74  The specified Bt
28b0: 72 65 65 20 6f 62 6a 65 63 74 20 70 20 69 73 20  ree object p is 
28c0: 63 6f 6e 6e 65 63 74 65 64 20 74 6f 20 61 20 73  connected to a s
28d0: 68 61 72 61 62 6c 65 0a 2a 2a 20 20 20 20 20 20  harable.**      
28e0: 20 64 61 74 61 62 61 73 65 20 28 6f 6e 65 20 77   database (one w
28f0: 69 74 68 20 74 68 65 20 42 74 53 68 61 72 65 64  ith the BtShared
2900: 2e 73 68 61 72 61 62 6c 65 20 66 6c 61 67 20 73  .sharable flag s
2910: 65 74 29 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20  et), and.**.**  
2920: 20 28 62 29 20 4e 6f 20 6f 74 68 65 72 20 42 74   (b) No other Bt
2930: 72 65 65 20 6f 62 6a 65 63 74 73 20 68 6f 6c 64  ree objects hold
2940: 20 61 20 6c 6f 63 6b 20 74 68 61 74 20 63 6f 6e   a lock that con
2950: 66 6c 69 63 74 73 0a 2a 2a 20 20 20 20 20 20 20  flicts.**       
2960: 77 69 74 68 20 74 68 65 20 72 65 71 75 65 73 74  with the request
2970: 65 64 20 6c 6f 63 6b 20 28 69 2e 65 2e 20 71 75  ed lock (i.e. qu
2980: 65 72 79 53 68 61 72 65 64 43 61 63 68 65 54 61  erySharedCacheTa
2990: 62 6c 65 4c 6f 63 6b 28 29 20 68 61 73 0a 2a 2a  bleLock() has.**
29a0: 20 20 20 20 20 20 20 61 6c 72 65 61 64 79 20 62         already b
29b0: 65 65 6e 20 63 61 6c 6c 65 64 20 61 6e 64 20 72  een called and r
29c0: 65 74 75 72 6e 65 64 20 53 51 4c 49 54 45 5f 4f  eturned SQLITE_O
29d0: 4b 29 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45  K)..**.** SQLITE
29e0: 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20  _OK is returned 
29f0: 69 66 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 61  if the lock is a
2a00: 64 64 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c  dded successfull
2a10: 79 2e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  y. SQLITE_NOMEM 
2a20: 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64 20  .** is returned 
2a30: 69 66 20 61 20 6d 61 6c 6c 6f 63 20 61 74 74 65  if a malloc atte
2a40: 6d 70 74 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74  mpt fails..*/.st
2a50: 61 74 69 63 20 69 6e 74 20 73 65 74 53 68 61 72  atic int setShar
2a60: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
2a70: 28 42 74 72 65 65 20 2a 70 2c 20 50 67 6e 6f 20  (Btree *p, Pgno 
2a80: 69 54 61 62 6c 65 2c 20 75 38 20 65 4c 6f 63 6b  iTable, u8 eLock
2a90: 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
2aa0: 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42  Bt = p->pBt;.  B
2ab0: 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 20 3d 20 30  tLock *pLock = 0
2ac0: 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70 49 74 65  ;.  BtLock *pIte
2ad0: 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  r;..  assert( sq
2ae0: 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d  lite3BtreeHoldsM
2af0: 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61 73 73  utex(p) );.  ass
2b00: 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44  ert( eLock==READ
2b10: 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d  _LOCK || eLock==
2b20: 57 52 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20  WRITE_LOCK );.  
2b30: 61 73 73 65 72 74 28 20 70 2d 3e 64 62 21 3d 30  assert( p->db!=0
2b40: 20 29 3b 0a 0a 20 20 2f 2a 20 41 20 63 6f 6e 6e   );..  /* A conn
2b50: 65 63 74 69 6f 6e 20 77 69 74 68 20 74 68 65 20  ection with the 
2b60: 72 65 61 64 2d 75 6e 63 6f 6d 6d 69 74 74 65 64  read-uncommitted
2b70: 20 66 6c 61 67 20 73 65 74 20 77 69 6c 6c 20 6e   flag set will n
2b80: 65 76 65 72 20 74 72 79 20 74 6f 0a 20 20 2a 2a  ever try to.  **
2b90: 20 6f 62 74 61 69 6e 20 61 20 72 65 61 64 2d 6c   obtain a read-l
2ba0: 6f 63 6b 20 75 73 69 6e 67 20 74 68 69 73 20 66  ock using this f
2bb0: 75 6e 63 74 69 6f 6e 2e 20 54 68 65 20 6f 6e 6c  unction. The onl
2bc0: 79 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 62 74 61  y read-lock obta
2bd0: 69 6e 65 64 0a 20 20 2a 2a 20 62 79 20 61 20 63  ined.  ** by a c
2be0: 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 20 72 65 61  onnection in rea
2bf0: 64 2d 75 6e 63 6f 6d 6d 69 74 74 65 64 20 6d 6f  d-uncommitted mo
2c00: 64 65 20 69 73 20 6f 6e 20 74 68 65 20 73 71 6c  de is on the sql
2c10: 69 74 65 5f 6d 61 73 74 65 72 20 0a 20 20 2a 2a  ite_master .  **
2c20: 20 74 61 62 6c 65 2c 20 61 6e 64 20 74 68 61 74   table, and that
2c30: 20 6c 6f 63 6b 20 69 73 20 6f 62 74 61 69 6e 65   lock is obtaine
2c40: 64 20 69 6e 20 42 74 72 65 65 42 65 67 69 6e 54  d in BtreeBeginT
2c50: 72 61 6e 73 28 29 2e 20 20 2a 2f 0a 20 20 61 73  rans().  */.  as
2c60: 73 65 72 74 28 20 30 3d 3d 28 70 2d 3e 64 62 2d  sert( 0==(p->db-
2c70: 3e 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 52 65  >flags&SQLITE_Re
2c80: 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64 29 20 7c  adUncommitted) |
2c90: 7c 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c  | eLock==WRITE_L
2ca0: 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 69  OCK );..  /* Thi
2cb0: 73 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c  s function shoul
2cc0: 64 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64  d only be called
2cd0: 20 6f 6e 20 61 20 73 68 61 72 61 62 6c 65 20 62   on a sharable b
2ce0: 2d 74 72 65 65 20 61 66 74 65 72 20 69 74 20 0a  -tree after it .
2cf0: 20 20 2a 2a 20 68 61 73 20 62 65 65 6e 20 64 65    ** has been de
2d00: 74 65 72 6d 69 6e 65 64 20 74 68 61 74 20 6e 6f  termined that no
2d10: 20 6f 74 68 65 72 20 62 2d 74 72 65 65 20 68 6f   other b-tree ho
2d20: 6c 64 73 20 61 20 63 6f 6e 66 6c 69 63 74 69 6e  lds a conflictin
2d30: 67 20 6c 6f 63 6b 2e 20 20 2a 2f 0a 20 20 61 73  g lock.  */.  as
2d40: 73 65 72 74 28 20 70 2d 3e 73 68 61 72 61 62 6c  sert( p->sharabl
2d50: 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 53  e );.  assert( S
2d60: 51 4c 49 54 45 5f 4f 4b 3d 3d 71 75 65 72 79 53  QLITE_OK==queryS
2d70: 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
2d80: 6f 63 6b 28 70 2c 20 69 54 61 62 6c 65 2c 20 65  ock(p, iTable, e
2d90: 4c 6f 63 6b 29 20 29 3b 0a 0a 20 20 2f 2a 20 46  Lock) );..  /* F
2da0: 69 72 73 74 20 73 65 61 72 63 68 20 74 68 65 20  irst search the 
2db0: 6c 69 73 74 20 66 6f 72 20 61 6e 20 65 78 69 73  list for an exis
2dc0: 74 69 6e 67 20 6c 6f 63 6b 20 6f 6e 20 74 68 69  ting lock on thi
2dd0: 73 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 66 6f  s table. */.  fo
2de0: 72 28 70 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f  r(pIter=pBt->pLo
2df0: 63 6b 3b 20 70 49 74 65 72 3b 20 70 49 74 65 72  ck; pIter; pIter
2e00: 3d 70 49 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a  =pIter->pNext){.
2e10: 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 69      if( pIter->i
2e20: 54 61 62 6c 65 3d 3d 69 54 61 62 6c 65 20 26 26  Table==iTable &&
2e30: 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65 3d 3d   pIter->pBtree==
2e40: 70 20 29 7b 0a 20 20 20 20 20 20 70 4c 6f 63 6b  p ){.      pLock
2e50: 20 3d 20 70 49 74 65 72 3b 0a 20 20 20 20 20 20   = pIter;.      
2e60: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
2e70: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 61 62  ..  /* If the ab
2e80: 6f 76 65 20 73 65 61 72 63 68 20 64 69 64 20 6e  ove search did n
2e90: 6f 74 20 66 69 6e 64 20 61 20 42 74 4c 6f 63 6b  ot find a BtLock
2ea0: 20 73 74 72 75 63 74 20 61 73 73 6f 63 69 61 74   struct associat
2eb0: 69 6e 67 20 42 74 72 65 65 20 70 0a 20 20 2a 2a  ing Btree p.  **
2ec0: 20 77 69 74 68 20 74 61 62 6c 65 20 69 54 61 62   with table iTab
2ed0: 6c 65 2c 20 61 6c 6c 6f 63 61 74 65 20 6f 6e 65  le, allocate one
2ee0: 20 61 6e 64 20 6c 69 6e 6b 20 69 74 20 69 6e 74   and link it int
2ef0: 6f 20 74 68 65 20 6c 69 73 74 2e 0a 20 20 2a 2f  o the list..  */
2f00: 0a 20 20 69 66 28 20 21 70 4c 6f 63 6b 20 29 7b  .  if( !pLock ){
2f10: 0a 20 20 20 20 70 4c 6f 63 6b 20 3d 20 28 42 74  .    pLock = (Bt
2f20: 4c 6f 63 6b 20 2a 29 73 71 6c 69 74 65 33 4d 61  Lock *)sqlite3Ma
2f30: 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28  llocZero(sizeof(
2f40: 42 74 4c 6f 63 6b 29 29 3b 0a 20 20 20 20 69 66  BtLock));.    if
2f50: 28 20 21 70 4c 6f 63 6b 20 29 7b 0a 20 20 20 20  ( !pLock ){.    
2f60: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2f70: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20  NOMEM;.    }.   
2f80: 20 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65 20 3d   pLock->iTable =
2f90: 20 69 54 61 62 6c 65 3b 0a 20 20 20 20 70 4c 6f   iTable;.    pLo
2fa0: 63 6b 2d 3e 70 42 74 72 65 65 20 3d 20 70 3b 0a  ck->pBtree = p;.
2fb0: 20 20 20 20 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74      pLock->pNext
2fc0: 20 3d 20 70 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 20   = pBt->pLock;. 
2fd0: 20 20 20 70 42 74 2d 3e 70 4c 6f 63 6b 20 3d 20     pBt->pLock = 
2fe0: 70 4c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  pLock;.  }..  /*
2ff0: 20 53 65 74 20 74 68 65 20 42 74 4c 6f 63 6b 2e   Set the BtLock.
3000: 65 4c 6f 63 6b 20 76 61 72 69 61 62 6c 65 20 74  eLock variable t
3010: 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6f 66  o the maximum of
3020: 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63   the current loc
3030: 6b 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 72  k.  ** and the r
3040: 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 2e 20 54  equested lock. T
3050: 68 69 73 20 6d 65 61 6e 73 20 69 66 20 61 20 77  his means if a w
3060: 72 69 74 65 2d 6c 6f 63 6b 20 77 61 73 20 61 6c  rite-lock was al
3070: 72 65 61 64 79 20 68 65 6c 64 0a 20 20 2a 2a 20  ready held.  ** 
3080: 61 6e 64 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20  and a read-lock 
3090: 72 65 71 75 65 73 74 65 64 2c 20 77 65 20 64 6f  requested, we do
30a0: 6e 27 74 20 69 6e 63 6f 72 72 65 63 74 6c 79 20  n't incorrectly 
30b0: 64 6f 77 6e 67 72 61 64 65 20 74 68 65 20 6c 6f  downgrade the lo
30c0: 63 6b 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ck..  */.  asser
30d0: 74 28 20 57 52 49 54 45 5f 4c 4f 43 4b 3e 52 45  t( WRITE_LOCK>RE
30e0: 41 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28  AD_LOCK );.  if(
30f0: 20 65 4c 6f 63 6b 3e 70 4c 6f 63 6b 2d 3e 65 4c   eLock>pLock->eL
3100: 6f 63 6b 20 29 7b 0a 20 20 20 20 70 4c 6f 63 6b  ock ){.    pLock
3110: 2d 3e 65 4c 6f 63 6b 20 3d 20 65 4c 6f 63 6b 3b  ->eLock = eLock;
3120: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53  .  }..  return S
3130: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64  QLITE_OK;.}.#end
3140: 69 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d  if /* !SQLITE_OM
3150: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20  IT_SHARED_CACHE 
3160: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
3170: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
3180: 41 43 48 45 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61  ACHE./*.** Relea
3190: 73 65 20 61 6c 6c 20 74 68 65 20 74 61 62 6c 65  se all the table
31a0: 20 6c 6f 63 6b 73 20 28 6c 6f 63 6b 73 20 6f 62   locks (locks ob
31b0: 74 61 69 6e 65 64 20 76 69 61 20 63 61 6c 6c 73  tained via calls
31c0: 20 74 6f 0a 2a 2a 20 74 68 65 20 73 65 74 53 68   to.** the setSh
31d0: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
31e0: 63 6b 28 29 20 70 72 6f 63 65 64 75 72 65 29 20  ck() procedure) 
31f0: 68 65 6c 64 20 62 79 20 42 74 72 65 65 20 6f 62  held by Btree ob
3200: 6a 65 63 74 20 70 2e 0a 2a 2a 0a 2a 2a 20 54 68  ject p..**.** Th
3210: 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 75  is function assu
3220: 6d 65 73 20 74 68 61 74 20 42 74 72 65 65 20 70  mes that Btree p
3230: 20 68 61 73 20 61 6e 20 6f 70 65 6e 20 72 65 61   has an open rea
3240: 64 20 6f 72 20 77 72 69 74 65 20 0a 2a 2a 20 74  d or write .** t
3250: 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66 20 69  ransaction. If i
3260: 74 20 64 6f 65 73 20 6e 6f 74 2c 20 74 68 65 6e  t does not, then
3270: 20 74 68 65 20 42 54 53 5f 50 45 4e 44 49 4e 47   the BTS_PENDING
3280: 20 66 6c 61 67 0a 2a 2a 20 6d 61 79 20 62 65 20   flag.** may be 
3290: 69 6e 63 6f 72 72 65 63 74 6c 79 20 63 6c 65 61  incorrectly clea
32a0: 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  red..*/.static v
32b0: 6f 69 64 20 63 6c 65 61 72 41 6c 6c 53 68 61 72  oid clearAllShar
32c0: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
32d0: 73 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42  s(Btree *p){.  B
32e0: 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
32f0: 2d 3e 70 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20  ->pBt;.  BtLock 
3300: 2a 2a 70 70 49 74 65 72 20 3d 20 26 70 42 74 2d  **ppIter = &pBt-
3310: 3e 70 4c 6f 63 6b 3b 0a 0a 20 20 61 73 73 65 72  >pLock;..  asser
3320: 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48  t( sqlite3BtreeH
3330: 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a  oldsMutex(p) );.
3340: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 73 68 61    assert( p->sha
3350: 72 61 62 6c 65 20 7c 7c 20 30 3d 3d 2a 70 70 49  rable || 0==*ppI
3360: 74 65 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ter );.  assert(
3370: 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 30 20 29 3b   p->inTrans>0 );
3380: 0a 0a 20 20 77 68 69 6c 65 28 20 2a 70 70 49 74  ..  while( *ppIt
3390: 65 72 20 29 7b 0a 20 20 20 20 42 74 4c 6f 63 6b  er ){.    BtLock
33a0: 20 2a 70 4c 6f 63 6b 20 3d 20 2a 70 70 49 74 65   *pLock = *ppIte
33b0: 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  r;.    assert( (
33c0: 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20  pBt->btsFlags & 
33d0: 42 54 53 5f 45 58 43 4c 55 53 49 56 45 29 3d 3d  BTS_EXCLUSIVE)==
33e0: 30 20 7c 7c 20 70 42 74 2d 3e 70 57 72 69 74 65  0 || pBt->pWrite
33f0: 72 3d 3d 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65  r==pLock->pBtree
3400: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
3410: 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 2d 3e 69  pLock->pBtree->i
3420: 6e 54 72 61 6e 73 3e 3d 70 4c 6f 63 6b 2d 3e 65  nTrans>=pLock->e
3430: 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 69 66 28 20  Lock );.    if( 
3440: 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 3d 3d 70  pLock->pBtree==p
3450: 20 29 7b 0a 20 20 20 20 20 20 2a 70 70 49 74 65   ){.      *ppIte
3460: 72 20 3d 20 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74  r = pLock->pNext
3470: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
3480: 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65 21 3d 31  pLock->iTable!=1
3490: 20 7c 7c 20 70 4c 6f 63 6b 3d 3d 26 70 2d 3e 6c   || pLock==&p->l
34a0: 6f 63 6b 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ock );.      if(
34b0: 20 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65 21 3d   pLock->iTable!=
34c0: 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  1 ){.        sql
34d0: 69 74 65 33 5f 66 72 65 65 28 70 4c 6f 63 6b 29  ite3_free(pLock)
34e0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
34f0: 6c 73 65 7b 0a 20 20 20 20 20 20 70 70 49 74 65  lse{.      ppIte
3500: 72 20 3d 20 26 70 4c 6f 63 6b 2d 3e 70 4e 65 78  r = &pLock->pNex
3510: 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  t;.    }.  }..  
3520: 61 73 73 65 72 74 28 20 28 70 42 74 2d 3e 62 74  assert( (pBt->bt
3530: 73 46 6c 61 67 73 20 26 20 42 54 53 5f 50 45 4e  sFlags & BTS_PEN
3540: 44 49 4e 47 29 3d 3d 30 20 7c 7c 20 70 42 74 2d  DING)==0 || pBt-
3550: 3e 70 57 72 69 74 65 72 20 29 3b 0a 20 20 69 66  >pWriter );.  if
3560: 28 20 70 42 74 2d 3e 70 57 72 69 74 65 72 3d 3d  ( pBt->pWriter==
3570: 70 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e 70 57  p ){.    pBt->pW
3580: 72 69 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 70  riter = 0;.    p
3590: 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d 20  Bt->btsFlags &= 
35a0: 7e 28 42 54 53 5f 45 58 43 4c 55 53 49 56 45 7c  ~(BTS_EXCLUSIVE|
35b0: 42 54 53 5f 50 45 4e 44 49 4e 47 29 3b 0a 20 20  BTS_PENDING);.  
35c0: 7d 65 6c 73 65 20 69 66 28 20 70 42 74 2d 3e 6e  }else if( pBt->n
35d0: 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 32 20 29  Transaction==2 )
35e0: 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 66 75  {.    /* This fu
35f0: 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
3600: 20 77 68 65 6e 20 42 74 72 65 65 20 70 20 69 73   when Btree p is
3610: 20 63 6f 6e 63 6c 75 64 69 6e 67 20 69 74 73 20   concluding its 
3620: 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74  .    ** transact
3630: 69 6f 6e 2e 20 49 66 20 74 68 65 72 65 20 63 75  ion. If there cu
3640: 72 72 65 6e 74 6c 79 20 65 78 69 73 74 73 20 61  rrently exists a
3650: 20 77 72 69 74 65 72 2c 20 61 6e 64 20 70 20 69   writer, and p i
3660: 73 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 74 68 61  s not.    ** tha
3670: 74 20 77 72 69 74 65 72 2c 20 74 68 65 6e 20 74  t writer, then t
3680: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6c 6f 63  he number of loc
3690: 6b 73 20 68 65 6c 64 20 62 79 20 63 6f 6e 6e 65  ks held by conne
36a0: 63 74 69 6f 6e 73 20 6f 74 68 65 72 0a 20 20 20  ctions other.   
36b0: 20 2a 2a 20 74 68 61 6e 20 74 68 65 20 77 72 69   ** than the wri
36c0: 74 65 72 20 6d 75 73 74 20 62 65 20 61 62 6f 75  ter must be abou
36d0: 74 20 74 6f 20 64 72 6f 70 20 74 6f 20 7a 65 72  t to drop to zer
36e0: 6f 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 0a  o. In this case.
36f0: 20 20 20 20 2a 2a 20 73 65 74 20 74 68 65 20 42      ** set the B
3700: 54 53 5f 50 45 4e 44 49 4e 47 20 66 6c 61 67 20  TS_PENDING flag 
3710: 74 6f 20 30 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  to 0..    **.   
3720: 20 2a 2a 20 49 66 20 74 68 65 72 65 20 69 73 20   ** If there is 
3730: 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 61 20  not currently a 
3740: 77 72 69 74 65 72 2c 20 74 68 65 6e 20 42 54 53  writer, then BTS
3750: 5f 50 45 4e 44 49 4e 47 20 6d 75 73 74 0a 20 20  _PENDING must.  
3760: 20 20 2a 2a 20 62 65 20 7a 65 72 6f 20 61 6c 72    ** be zero alr
3770: 65 61 64 79 2e 20 53 6f 20 74 68 69 73 20 6e 65  eady. So this ne
3780: 78 74 20 6c 69 6e 65 20 69 73 20 68 61 72 6d 6c  xt line is harml
3790: 65 73 73 20 69 6e 20 74 68 61 74 20 63 61 73 65  ess in that case
37a0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 42 74  ..    */.    pBt
37b0: 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d 20 7e 42  ->btsFlags &= ~B
37c0: 54 53 5f 50 45 4e 44 49 4e 47 3b 0a 20 20 7d 0a  TS_PENDING;.  }.
37d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
37e0: 6e 63 74 69 6f 6e 20 63 68 61 6e 67 65 73 20 61  nction changes a
37f0: 6c 6c 20 77 72 69 74 65 2d 6c 6f 63 6b 73 20 68  ll write-locks h
3800: 65 6c 64 20 62 79 20 42 74 72 65 65 20 70 20 69  eld by Btree p i
3810: 6e 74 6f 20 72 65 61 64 2d 6c 6f 63 6b 73 2e 0a  nto read-locks..
3820: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64  */.static void d
3830: 6f 77 6e 67 72 61 64 65 41 6c 6c 53 68 61 72 65  owngradeAllShare
3840: 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73  dCacheTableLocks
3850: 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74  (Btree *p){.  Bt
3860: 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
3870: 3e 70 42 74 3b 0a 20 20 69 66 28 20 70 42 74 2d  >pBt;.  if( pBt-
3880: 3e 70 57 72 69 74 65 72 3d 3d 70 20 29 7b 0a 20  >pWriter==p ){. 
3890: 20 20 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b     BtLock *pLock
38a0: 3b 0a 20 20 20 20 70 42 74 2d 3e 70 57 72 69 74  ;.    pBt->pWrit
38b0: 65 72 20 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d  er = 0;.    pBt-
38c0: 3e 62 74 73 46 6c 61 67 73 20 26 3d 20 7e 28 42  >btsFlags &= ~(B
38d0: 54 53 5f 45 58 43 4c 55 53 49 56 45 7c 42 54 53  TS_EXCLUSIVE|BTS
38e0: 5f 50 45 4e 44 49 4e 47 29 3b 0a 20 20 20 20 66  _PENDING);.    f
38f0: 6f 72 28 70 4c 6f 63 6b 3d 70 42 74 2d 3e 70 4c  or(pLock=pBt->pL
3900: 6f 63 6b 3b 20 70 4c 6f 63 6b 3b 20 70 4c 6f 63  ock; pLock; pLoc
3910: 6b 3d 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 29 7b  k=pLock->pNext){
3920: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
3930: 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 41  Lock->eLock==REA
3940: 44 5f 4c 4f 43 4b 20 7c 7c 20 70 4c 6f 63 6b 2d  D_LOCK || pLock-
3950: 3e 70 42 74 72 65 65 3d 3d 70 20 29 3b 0a 20 20  >pBtree==p );.  
3960: 20 20 20 20 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b      pLock->eLock
3970: 20 3d 20 52 45 41 44 5f 4c 4f 43 4b 3b 0a 20 20   = READ_LOCK;.  
3980: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 65 6e 64 69    }.  }.}..#endi
3990: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
39a0: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20 2a 2f  _SHARED_CACHE */
39b0: 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65  ..static void re
39c0: 6c 65 61 73 65 50 61 67 65 28 4d 65 6d 50 61 67  leasePage(MemPag
39d0: 65 20 2a 70 50 61 67 65 29 3b 20 20 2f 2a 20 46  e *pPage);  /* F
39e0: 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65  orward reference
39f0: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 2a 2a 2a 20 54 68   */../*.***** Th
3a00: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
3a10: 65 64 20 69 6e 73 69 64 65 20 6f 66 20 61 73 73  ed inside of ass
3a20: 65 72 74 28 29 20 6f 6e 6c 79 20 2a 2a 2a 2a 0a  ert() only ****.
3a30: 2a 2a 0a 2a 2a 20 56 65 72 69 66 79 20 74 68 61  **.** Verify tha
3a40: 74 20 74 68 65 20 63 75 72 73 6f 72 20 68 6f 6c  t the cursor hol
3a50: 64 73 20 74 68 65 20 6d 75 74 65 78 20 6f 6e 20  ds the mutex on 
3a60: 69 74 73 20 42 74 53 68 61 72 65 64 0a 2a 2f 0a  its BtShared.*/.
3a70: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
3a80: 42 55 47 0a 73 74 61 74 69 63 20 69 6e 74 20 63  BUG.static int c
3a90: 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
3aa0: 42 74 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20  BtCursor *p){.  
3ab0: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 6d  return sqlite3_m
3ac0: 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 70 42 74  utex_held(p->pBt
3ad0: 2d 3e 6d 75 74 65 78 29 3b 0a 7d 0a 23 65 6e 64  ->mutex);.}.#end
3ae0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 61 6c 69  if../*.** Invali
3af0: 64 61 74 65 20 74 68 65 20 6f 76 65 72 66 6c 6f  date the overflo
3b00: 77 20 63 61 63 68 65 20 6f 66 20 74 68 65 20 63  w cache of the c
3b10: 75 72 73 6f 72 20 70 61 73 73 65 64 20 61 73 20  ursor passed as 
3b20: 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
3b30: 6e 74 2e 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 68  nt..** on the sh
3b40: 61 72 65 64 20 62 74 72 65 65 20 73 74 72 75 63  ared btree struc
3b50: 74 75 72 65 20 70 42 74 2e 0a 2a 2f 0a 23 64 65  ture pBt..*/.#de
3b60: 66 69 6e 65 20 69 6e 76 61 6c 69 64 61 74 65 4f  fine invalidateO
3b70: 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70 43 75  verflowCache(pCu
3b80: 72 29 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61  r) (pCur->curFla
3b90: 67 73 20 26 3d 20 7e 42 54 43 46 5f 56 61 6c 69  gs &= ~BTCF_Vali
3ba0: 64 4f 76 66 6c 29 0a 0a 2f 2a 0a 2a 2a 20 49 6e  dOvfl)../*.** In
3bb0: 76 61 6c 69 64 61 74 65 20 74 68 65 20 6f 76 65  validate the ove
3bc0: 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20  rflow page-list 
3bd0: 63 61 63 68 65 20 66 6f 72 20 61 6c 6c 20 63 75  cache for all cu
3be0: 72 73 6f 72 73 20 6f 70 65 6e 65 64 0a 2a 2a 20  rsors opened.** 
3bf0: 6f 6e 20 74 68 65 20 73 68 61 72 65 64 20 62 74  on the shared bt
3c00: 72 65 65 20 73 74 72 75 63 74 75 72 65 20 70 42  ree structure pB
3c10: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
3c20: 64 20 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f  d invalidateAllO
3c30: 76 65 72 66 6c 6f 77 43 61 63 68 65 28 42 74 53  verflowCache(BtS
3c40: 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 42  hared *pBt){.  B
3c50: 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 61 73  tCursor *p;.  as
3c60: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
3c70: 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
3c80: 74 65 78 29 20 29 3b 0a 20 20 66 6f 72 28 70 3d  tex) );.  for(p=
3c90: 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b  pBt->pCursor; p;
3ca0: 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20   p=p->pNext){.  
3cb0: 20 20 69 6e 76 61 6c 69 64 61 74 65 4f 76 65 72    invalidateOver
3cc0: 66 6c 6f 77 43 61 63 68 65 28 70 29 3b 0a 20 20  flowCache(p);.  
3cd0: 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  }.}..#ifndef SQL
3ce0: 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f  ITE_OMIT_INCRBLO
3cf0: 42 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  B./*.** This fun
3d00: 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
3d10: 62 65 66 6f 72 65 20 6d 6f 64 69 66 79 69 6e 67  before modifying
3d20: 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
3d30: 20 61 20 74 61 62 6c 65 0a 2a 2a 20 74 6f 20 69   a table.** to i
3d40: 6e 76 61 6c 69 64 61 74 65 20 61 6e 79 20 69 6e  nvalidate any in
3d50: 63 72 62 6c 6f 62 20 63 75 72 73 6f 72 73 20 74  crblob cursors t
3d60: 68 61 74 20 61 72 65 20 6f 70 65 6e 20 6f 6e 20  hat are open on 
3d70: 74 68 65 0a 2a 2a 20 72 6f 77 20 6f 72 20 6f 6e  the.** row or on
3d80: 65 20 6f 66 20 74 68 65 20 72 6f 77 73 20 62 65  e of the rows be
3d90: 69 6e 67 20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a  ing modified..**
3da0: 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20  .** If argument 
3db0: 69 73 43 6c 65 61 72 54 61 62 6c 65 20 69 73 20  isClearTable is 
3dc0: 74 72 75 65 2c 20 74 68 65 6e 20 74 68 65 20 65  true, then the e
3dd0: 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 73 20 6f  ntire contents o
3de0: 66 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65 20 69  f the.** table i
3df0: 73 20 61 62 6f 75 74 20 74 6f 20 62 65 20 64 65  s about to be de
3e00: 6c 65 74 65 64 2e 20 49 6e 20 74 68 69 73 20 63  leted. In this c
3e10: 61 73 65 20 69 6e 76 61 6c 69 64 61 74 65 20 61  ase invalidate a
3e20: 6c 6c 20 69 6e 63 72 62 6c 6f 62 0a 2a 2a 20 63  ll incrblob.** c
3e30: 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 61  ursors open on a
3e40: 6e 79 20 72 6f 77 20 77 69 74 68 69 6e 20 74 68  ny row within th
3e50: 65 20 74 61 62 6c 65 20 77 69 74 68 20 72 6f 6f  e table with roo
3e60: 74 2d 70 61 67 65 20 70 67 6e 6f 52 6f 6f 74 2e  t-page pgnoRoot.
3e70: 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  .**.** Otherwise
3e80: 2c 20 69 66 20 61 72 67 75 6d 65 6e 74 20 69 73  , if argument is
3e90: 43 6c 65 61 72 54 61 62 6c 65 20 69 73 20 66 61  ClearTable is fa
3ea0: 6c 73 65 2c 20 74 68 65 6e 20 74 68 65 20 72 6f  lse, then the ro
3eb0: 77 20 77 69 74 68 0a 2a 2a 20 72 6f 77 69 64 20  w with.** rowid 
3ec0: 69 52 6f 77 20 69 73 20 62 65 69 6e 67 20 72 65  iRow is being re
3ed0: 70 6c 61 63 65 64 20 6f 72 20 64 65 6c 65 74 65  placed or delete
3ee0: 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  d. In this case 
3ef0: 69 6e 76 61 6c 69 64 61 74 65 0a 2a 2a 20 6f 6e  invalidate.** on
3f00: 6c 79 20 74 68 6f 73 65 20 69 6e 63 72 62 6c 6f  ly those incrblo
3f10: 62 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f  b cursors open o
3f20: 6e 20 74 68 61 74 20 73 70 65 63 69 66 69 63 20  n that specific 
3f30: 72 6f 77 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  row..*/.static v
3f40: 6f 69 64 20 69 6e 76 61 6c 69 64 61 74 65 49 6e  oid invalidateIn
3f50: 63 72 62 6c 6f 62 43 75 72 73 6f 72 73 28 0a 20  crblobCursors(. 
3f60: 20 42 74 72 65 65 20 2a 70 42 74 72 65 65 2c 20   Btree *pBtree, 
3f70: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
3f80: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f  database file to
3f90: 20 63 68 65 63 6b 20 2a 2f 0a 20 20 69 36 34 20   check */.  i64 
3fa0: 69 52 6f 77 2c 20 20 20 20 20 20 20 20 20 20 20  iRow,           
3fb0: 20 20 20 20 2f 2a 20 54 68 65 20 72 6f 77 69 64      /* The rowid
3fc0: 20 74 68 61 74 20 6d 69 67 68 74 20 62 65 20 63   that might be c
3fd0: 68 61 6e 67 69 6e 67 20 2a 2f 0a 20 20 69 6e 74  hanging */.  int
3fe0: 20 69 73 43 6c 65 61 72 54 61 62 6c 65 20 20 20   isClearTable   
3ff0: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
4000: 61 6c 6c 20 72 6f 77 73 20 61 72 65 20 62 65 69  all rows are bei
4010: 6e 67 20 64 65 6c 65 74 65 64 20 2a 2f 0a 29 7b  ng deleted */.){
4020: 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a  .  BtCursor *p;.
4030: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
4040: 3d 20 70 42 74 72 65 65 2d 3e 70 42 74 3b 0a 20  = pBtree->pBt;. 
4050: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
4060: 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28  BtreeHoldsMutex(
4070: 70 42 74 72 65 65 29 20 29 3b 0a 20 20 66 6f 72  pBtree) );.  for
4080: 28 70 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b  (p=pBt->pCursor;
4090: 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b   p; p=p->pNext){
40a0: 0a 20 20 20 20 69 66 28 20 28 70 2d 3e 63 75 72  .    if( (p->cur
40b0: 46 6c 61 67 73 20 26 20 42 54 43 46 5f 49 6e 63  Flags & BTCF_Inc
40c0: 72 62 6c 6f 62 29 21 3d 30 0a 20 20 20 20 20 26  rblob)!=0.     &
40d0: 26 20 28 69 73 43 6c 65 61 72 54 61 62 6c 65 20  & (isClearTable 
40e0: 7c 7c 20 70 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3d  || p->info.nKey=
40f0: 3d 69 52 6f 77 29 0a 20 20 20 20 29 7b 0a 20 20  =iRow).    ){.  
4100: 20 20 20 20 70 2d 3e 65 53 74 61 74 65 20 3d 20      p->eState = 
4110: 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a  CURSOR_INVALID;.
4120: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 65 6c      }.  }.}..#el
4130: 73 65 0a 20 20 2f 2a 20 53 74 75 62 20 66 75 6e  se.  /* Stub fun
4140: 63 74 69 6f 6e 20 77 68 65 6e 20 49 4e 43 52 42  ction when INCRB
4150: 4c 4f 42 20 69 73 20 6f 6d 69 74 74 65 64 20 2a  LOB is omitted *
4160: 2f 0a 20 20 23 64 65 66 69 6e 65 20 69 6e 76 61  /.  #define inva
4170: 6c 69 64 61 74 65 49 6e 63 72 62 6c 6f 62 43 75  lidateIncrblobCu
4180: 72 73 6f 72 73 28 78 2c 79 2c 7a 29 0a 23 65 6e  rsors(x,y,z).#en
4190: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
41a0: 49 54 5f 49 4e 43 52 42 4c 4f 42 20 2a 2f 0a 0a  IT_INCRBLOB */..
41b0: 2f 2a 0a 2a 2a 20 53 65 74 20 62 69 74 20 70 67  /*.** Set bit pg
41c0: 6e 6f 20 6f 66 20 74 68 65 20 42 74 53 68 61 72  no of the BtShar
41d0: 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 62  ed.pHasContent b
41e0: 69 74 76 65 63 2e 20 54 68 69 73 20 69 73 20 63  itvec. This is c
41f0: 61 6c 6c 65 64 20 0a 2a 2a 20 77 68 65 6e 20 61  alled .** when a
4200: 20 70 61 67 65 20 74 68 61 74 20 70 72 65 76 69   page that previ
4210: 6f 75 73 6c 79 20 63 6f 6e 74 61 69 6e 65 64 20  ously contained 
4220: 64 61 74 61 20 62 65 63 6f 6d 65 73 20 61 20 66  data becomes a f
4230: 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 0a 2a  ree-list leaf .*
4240: 2a 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  * page..**.** Th
4250: 65 20 42 74 53 68 61 72 65 64 2e 70 48 61 73 43  e BtShared.pHasC
4260: 6f 6e 74 65 6e 74 20 62 69 74 76 65 63 20 65 78  ontent bitvec ex
4270: 69 73 74 73 20 74 6f 20 77 6f 72 6b 20 61 72 6f  ists to work aro
4280: 75 6e 64 20 61 6e 20 6f 62 73 63 75 72 65 0a 2a  und an obscure.*
4290: 2a 20 62 75 67 20 63 61 75 73 65 64 20 62 79 20  * bug caused by 
42a0: 74 68 65 20 69 6e 74 65 72 61 63 74 69 6f 6e 20  the interaction 
42b0: 6f 66 20 74 77 6f 20 75 73 65 66 75 6c 20 49 4f  of two useful IO
42c0: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 73   optimizations s
42d0: 75 72 72 6f 75 6e 64 69 6e 67 0a 2a 2a 20 66 72  urrounding.** fr
42e0: 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67  ee-list leaf pag
42f0: 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20 57  es:.**.**   1) W
4300: 68 65 6e 20 61 6c 6c 20 64 61 74 61 20 69 73 20  hen all data is 
4310: 64 65 6c 65 74 65 64 20 66 72 6f 6d 20 61 20 70  deleted from a p
4320: 61 67 65 20 61 6e 64 20 74 68 65 20 70 61 67 65  age and the page
4330: 20 62 65 63 6f 6d 65 73 0a 2a 2a 20 20 20 20 20   becomes.**     
4340: 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61   a free-list lea
4350: 66 20 70 61 67 65 2c 20 74 68 65 20 70 61 67 65  f page, the page
4360: 20 69 73 20 6e 6f 74 20 77 72 69 74 74 65 6e 20   is not written 
4370: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  to the database.
4380: 2a 2a 20 20 20 20 20 20 28 61 73 20 66 72 65 65  **      (as free
4390: 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65 73  -list leaf pages
43a0: 20 63 6f 6e 74 61 69 6e 20 6e 6f 20 6d 65 61 6e   contain no mean
43b0: 69 6e 67 66 75 6c 20 64 61 74 61 29 2e 20 53 6f  ingful data). So
43c0: 6d 65 74 69 6d 65 73 0a 2a 2a 20 20 20 20 20 20  metimes.**      
43d0: 73 75 63 68 20 61 20 70 61 67 65 20 69 73 20 6e  such a page is n
43e0: 6f 74 20 65 76 65 6e 20 6a 6f 75 72 6e 61 6c 6c  ot even journall
43f0: 65 64 20 28 61 73 20 69 74 20 77 69 6c 6c 20 6e  ed (as it will n
4400: 6f 74 20 62 65 20 6d 6f 64 69 66 69 65 64 2c 0a  ot be modified,.
4410: 2a 2a 20 20 20 20 20 20 77 68 79 20 62 6f 74 68  **      why both
4420: 65 72 20 6a 6f 75 72 6e 61 6c 6c 69 6e 67 20 69  er journalling i
4430: 74 3f 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 29 20  t?)..**.**   2) 
4440: 57 68 65 6e 20 61 20 66 72 65 65 2d 6c 69 73 74  When a free-list
4450: 20 6c 65 61 66 20 70 61 67 65 20 69 73 20 72 65   leaf page is re
4460: 75 73 65 64 2c 20 69 74 73 20 63 6f 6e 74 65 6e  used, its conten
4470: 74 20 69 73 20 6e 6f 74 20 72 65 61 64 0a 2a 2a  t is not read.**
4480: 20 20 20 20 20 20 66 72 6f 6d 20 74 68 65 20 64        from the d
4490: 61 74 61 62 61 73 65 20 6f 72 20 77 72 69 74 74  atabase or writt
44a0: 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  en to the journa
44b0: 6c 20 66 69 6c 65 20 28 77 68 79 20 73 68 6f 75  l file (why shou
44c0: 6c 64 20 69 74 0a 2a 2a 20 20 20 20 20 20 62 65  ld it.**      be
44d0: 2c 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61  , if it is not a
44e0: 74 20 61 6c 6c 20 6d 65 61 6e 69 6e 67 66 75 6c  t all meaningful
44f0: 3f 29 2e 0a 2a 2a 0a 2a 2a 20 42 79 20 74 68 65  ?)..**.** By the
4500: 6d 73 65 6c 76 65 73 2c 20 74 68 65 73 65 20 6f  mselves, these o
4510: 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 77 6f 72  ptimizations wor
4520: 6b 20 66 69 6e 65 20 61 6e 64 20 70 72 6f 76 69  k fine and provi
4530: 64 65 20 61 20 68 61 6e 64 79 0a 2a 2a 20 70 65  de a handy.** pe
4540: 72 66 6f 72 6d 61 6e 63 65 20 62 6f 6f 73 74 20  rformance boost 
4550: 74 6f 20 62 75 6c 6b 20 64 65 6c 65 74 65 20 6f  to bulk delete o
4560: 72 20 69 6e 73 65 72 74 20 6f 70 65 72 61 74 69  r insert operati
4570: 6f 6e 73 2e 20 48 6f 77 65 76 65 72 2c 20 69 66  ons. However, if
4580: 0a 2a 2a 20 61 20 70 61 67 65 20 69 73 20 6d 6f  .** a page is mo
4590: 76 65 64 20 74 6f 20 74 68 65 20 66 72 65 65 2d  ved to the free-
45a0: 6c 69 73 74 20 61 6e 64 20 74 68 65 6e 20 72 65  list and then re
45b0: 75 73 65 64 20 77 69 74 68 69 6e 20 74 68 65 20  used within the 
45c0: 73 61 6d 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74  same.** transact
45d0: 69 6f 6e 2c 20 61 20 70 72 6f 62 6c 65 6d 20 63  ion, a problem c
45e0: 6f 6d 65 73 20 75 70 2e 20 49 66 20 74 68 65 20  omes up. If the 
45f0: 70 61 67 65 20 69 73 20 6e 6f 74 20 6a 6f 75 72  page is not jour
4600: 6e 61 6c 6c 65 64 20 77 68 65 6e 0a 2a 2a 20 69  nalled when.** i
4610: 74 20 69 73 20 6d 6f 76 65 64 20 74 6f 20 74 68  t is moved to th
4620: 65 20 66 72 65 65 2d 6c 69 73 74 20 61 6e 64 20  e free-list and 
4630: 69 74 20 69 73 20 61 6c 73 6f 20 6e 6f 74 20 6a  it is also not j
4640: 6f 75 72 6e 61 6c 6c 65 64 20 77 68 65 6e 20 69  ournalled when i
4650: 74 0a 2a 2a 20 69 73 20 65 78 74 72 61 63 74 65  t.** is extracte
4660: 64 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 2d  d from the free-
4670: 6c 69 73 74 20 61 6e 64 20 72 65 75 73 65 64 2c  list and reused,
4680: 20 74 68 65 6e 20 74 68 65 20 6f 72 69 67 69 6e   then the origin
4690: 61 6c 20 64 61 74 61 0a 2a 2a 20 6d 61 79 20 62  al data.** may b
46a0: 65 20 6c 6f 73 74 2e 20 49 6e 20 74 68 65 20 65  e lost. In the e
46b0: 76 65 6e 74 20 6f 66 20 61 20 72 6f 6c 6c 62 61  vent of a rollba
46c0: 63 6b 2c 20 69 74 20 6d 61 79 20 6e 6f 74 20 62  ck, it may not b
46d0: 65 20 70 6f 73 73 69 62 6c 65 0a 2a 2a 20 74 6f  e possible.** to
46e0: 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74   restore the dat
46f0: 61 62 61 73 65 20 74 6f 20 69 74 73 20 6f 72 69  abase to its ori
4700: 67 69 6e 61 6c 20 63 6f 6e 66 69 67 75 72 61 74  ginal configurat
4710: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73  ion..**.** The s
4720: 6f 6c 75 74 69 6f 6e 20 69 73 20 74 68 65 20 42  olution is the B
4730: 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74  tShared.pHasCont
4740: 65 6e 74 20 62 69 74 76 65 63 2e 20 57 68 65 6e  ent bitvec. When
4750: 65 76 65 72 20 61 20 70 61 67 65 20 69 73 20 0a  ever a page is .
4760: 2a 2a 20 6d 6f 76 65 64 20 74 6f 20 62 65 63 6f  ** moved to beco
4770: 6d 65 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c  me a free-list l
4780: 65 61 66 20 70 61 67 65 2c 20 74 68 65 20 63 6f  eaf page, the co
4790: 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20  rresponding bit 
47a0: 69 73 0a 2a 2a 20 73 65 74 20 69 6e 20 74 68 65  is.** set in the
47b0: 20 62 69 74 76 65 63 2e 20 57 68 65 6e 65 76 65   bitvec. Wheneve
47c0: 72 20 61 20 6c 65 61 66 20 70 61 67 65 20 69 73  r a leaf page is
47d0: 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
47e0: 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 0a 2a  the free-list,.*
47f0: 2a 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 32  * optimization 2
4800: 20 61 62 6f 76 65 20 69 73 20 6f 6d 69 74 74 65   above is omitte
4810: 64 20 69 66 20 74 68 65 20 63 6f 72 72 65 73 70  d if the corresp
4820: 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 20 61 6c  onding bit is al
4830: 72 65 61 64 79 0a 2a 2a 20 73 65 74 20 69 6e 20  ready.** set in 
4840: 42 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e  BtShared.pHasCon
4850: 74 65 6e 74 2e 20 54 68 65 20 63 6f 6e 74 65 6e  tent. The conten
4860: 74 73 20 6f 66 20 74 68 65 20 62 69 74 76 65 63  ts of the bitvec
4870: 20 61 72 65 20 63 6c 65 61 72 65 64 0a 2a 2a 20   are cleared.** 
4880: 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 65 76  at the end of ev
4890: 65 72 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ery transaction.
48a0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
48b0: 74 72 65 65 53 65 74 48 61 73 43 6f 6e 74 65 6e  treeSetHasConten
48c0: 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c  t(BtShared *pBt,
48d0: 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 69   Pgno pgno){.  i
48e0: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
48f0: 4b 3b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 70  K;.  if( !pBt->p
4900: 48 61 73 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20  HasContent ){.  
4910: 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 3c 3d    assert( pgno<=
4920: 70 42 74 2d 3e 6e 50 61 67 65 20 29 3b 0a 20 20  pBt->nPage );.  
4930: 20 20 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65    pBt->pHasConte
4940: 6e 74 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76  nt = sqlite3Bitv
4950: 65 63 43 72 65 61 74 65 28 70 42 74 2d 3e 6e 50  ecCreate(pBt->nP
4960: 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 21 70  age);.    if( !p
4970: 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20  Bt->pHasContent 
4980: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
4990: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
49a0: 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  }.  }.  if( rc==
49b0: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 67 6e  SQLITE_OK && pgn
49c0: 6f 3c 3d 73 71 6c 69 74 65 33 42 69 74 76 65 63  o<=sqlite3Bitvec
49d0: 53 69 7a 65 28 70 42 74 2d 3e 70 48 61 73 43 6f  Size(pBt->pHasCo
49e0: 6e 74 65 6e 74 29 20 29 7b 0a 20 20 20 20 72 63  ntent) ){.    rc
49f0: 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63   = sqlite3Bitvec
4a00: 53 65 74 28 70 42 74 2d 3e 70 48 61 73 43 6f 6e  Set(pBt->pHasCon
4a10: 74 65 6e 74 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d  tent, pgno);.  }
4a20: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
4a30: 0a 2f 2a 0a 2a 2a 20 51 75 65 72 79 20 74 68 65  ./*.** Query the
4a40: 20 42 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f   BtShared.pHasCo
4a50: 6e 74 65 6e 74 20 76 65 63 74 6f 72 2e 0a 2a 2a  ntent vector..**
4a60: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
4a70: 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e  n is called when
4a80: 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61   a free-list lea
4a90: 66 20 70 61 67 65 20 69 73 20 72 65 6d 6f 76 65  f page is remove
4aa0: 64 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 66 72  d from the.** fr
4ab0: 65 65 2d 6c 69 73 74 20 66 6f 72 20 72 65 75 73  ee-list for reus
4ac0: 65 2e 20 49 74 20 72 65 74 75 72 6e 73 20 66 61  e. It returns fa
4ad0: 6c 73 65 20 69 66 20 69 74 20 69 73 20 73 61 66  lse if it is saf
4ae0: 65 20 74 6f 20 72 65 74 72 69 65 76 65 20 74 68  e to retrieve th
4af0: 65 0a 2a 2a 20 70 61 67 65 20 66 72 6f 6d 20 74  e.** page from t
4b00: 68 65 20 70 61 67 65 72 20 6c 61 79 65 72 20 77  he pager layer w
4b10: 69 74 68 20 74 68 65 20 27 6e 6f 2d 63 6f 6e 74  ith the 'no-cont
4b20: 65 6e 74 27 20 66 6c 61 67 20 73 65 74 2e 20 54  ent' flag set. T
4b30: 72 75 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a  rue otherwise..*
4b40: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72  /.static int btr
4b50: 65 65 47 65 74 48 61 73 43 6f 6e 74 65 6e 74 28  eeGetHasContent(
4b60: 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50  BtShared *pBt, P
4b70: 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 42 69 74  gno pgno){.  Bit
4b80: 76 65 63 20 2a 70 20 3d 20 70 42 74 2d 3e 70 48  vec *p = pBt->pH
4b90: 61 73 43 6f 6e 74 65 6e 74 3b 0a 20 20 72 65 74  asContent;.  ret
4ba0: 75 72 6e 20 28 70 20 26 26 20 28 70 67 6e 6f 3e  urn (p && (pgno>
4bb0: 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 69 7a  sqlite3BitvecSiz
4bc0: 65 28 70 29 20 7c 7c 20 73 71 6c 69 74 65 33 42  e(p) || sqlite3B
4bd0: 69 74 76 65 63 54 65 73 74 28 70 2c 20 70 67 6e  itvecTest(p, pgn
4be0: 6f 29 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  o)));.}../*.** C
4bf0: 6c 65 61 72 20 28 64 65 73 74 72 6f 79 29 20 74  lear (destroy) t
4c00: 68 65 20 42 74 53 68 61 72 65 64 2e 70 48 61 73  he BtShared.pHas
4c10: 43 6f 6e 74 65 6e 74 20 62 69 74 76 65 63 2e 20  Content bitvec. 
4c20: 54 68 69 73 20 73 68 6f 75 6c 64 20 62 65 0a 2a  This should be.*
4c30: 2a 20 69 6e 76 6f 6b 65 64 20 61 74 20 74 68 65  * invoked at the
4c40: 20 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66 20 65   conclusion of e
4c50: 61 63 68 20 77 72 69 74 65 2d 74 72 61 6e 73 61  ach write-transa
4c60: 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ction..*/.static
4c70: 20 76 6f 69 64 20 62 74 72 65 65 43 6c 65 61 72   void btreeClear
4c80: 48 61 73 43 6f 6e 74 65 6e 74 28 42 74 53 68 61  HasContent(BtSha
4c90: 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 73 71 6c  red *pBt){.  sql
4ca0: 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72 6f  ite3BitvecDestro
4cb0: 79 28 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65  y(pBt->pHasConte
4cc0: 6e 74 29 3b 0a 20 20 70 42 74 2d 3e 70 48 61 73  nt);.  pBt->pHas
4cd0: 43 6f 6e 74 65 6e 74 20 3d 20 30 3b 0a 7d 0a 0a  Content = 0;.}..
4ce0: 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 6c  /*.** Release al
4cf0: 6c 20 6f 66 20 74 68 65 20 61 70 50 61 67 65 5b  l of the apPage[
4d00: 5d 20 70 61 67 65 73 20 66 6f 72 20 61 20 63 75  ] pages for a cu
4d10: 72 73 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rsor..*/.static 
4d20: 76 6f 69 64 20 62 74 72 65 65 52 65 6c 65 61 73  void btreeReleas
4d30: 65 41 6c 6c 43 75 72 73 6f 72 50 61 67 65 73 28  eAllCursorPages(
4d40: 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
4d50: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
4d60: 69 3d 30 3b 20 69 3c 3d 70 43 75 72 2d 3e 69 50  i=0; i<=pCur->iP
4d70: 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 72  age; i++){.    r
4d80: 65 6c 65 61 73 65 50 61 67 65 28 70 43 75 72 2d  eleasePage(pCur-
4d90: 3e 61 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20 20  >apPage[i]);.   
4da0: 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d   pCur->apPage[i]
4db0: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 43 75 72   = 0;.  }.  pCur
4dc0: 2d 3e 69 50 61 67 65 20 3d 20 2d 31 3b 0a 7d 0a  ->iPage = -1;.}.
4dd0: 0a 0a 2f 2a 0a 2a 2a 20 53 61 76 65 20 74 68 65  ../*.** Save the
4de0: 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20   current cursor 
4df0: 70 6f 73 69 74 69 6f 6e 20 69 6e 20 74 68 65 20  position in the 
4e00: 76 61 72 69 61 62 6c 65 73 20 42 74 43 75 72 73  variables BtCurs
4e10: 6f 72 2e 6e 4b 65 79 20 0a 2a 2a 20 61 6e 64 20  or.nKey .** and 
4e20: 42 74 43 75 72 73 6f 72 2e 70 4b 65 79 2e 20 54  BtCursor.pKey. T
4e30: 68 65 20 63 75 72 73 6f 72 27 73 20 73 74 61 74  he cursor's stat
4e40: 65 20 69 73 20 73 65 74 20 74 6f 20 43 55 52 53  e is set to CURS
4e50: 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 2e 0a  OR_REQUIRESEEK..
4e60: 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72  **.** The caller
4e70: 20 6d 75 73 74 20 65 6e 73 75 72 65 20 74 68 61   must ensure tha
4e80: 74 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  t the cursor is 
4e90: 76 61 6c 69 64 20 28 68 61 73 20 65 53 74 61 74  valid (has eStat
4ea0: 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 29  e==CURSOR_VALID)
4eb0: 0a 2a 2a 20 70 72 69 6f 72 20 74 6f 20 63 61 6c  .** prior to cal
4ec0: 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e  ling this routin
4ed0: 65 2e 20 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69  e.  .*/.static i
4ee0: 6e 74 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73  nt saveCursorPos
4ef0: 69 74 69 6f 6e 28 42 74 43 75 72 73 6f 72 20 2a  ition(BtCursor *
4f00: 70 43 75 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  pCur){.  int rc;
4f10: 0a 0a 20 20 61 73 73 65 72 74 28 20 43 55 52 53  ..  assert( CURS
4f20: 4f 52 5f 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e  OR_VALID==pCur->
4f30: 65 53 74 61 74 65 20 29 3b 0a 20 20 61 73 73 65  eState );.  asse
4f40: 72 74 28 20 30 3d 3d 70 43 75 72 2d 3e 70 4b 65  rt( 0==pCur->pKe
4f50: 79 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63  y );.  assert( c
4f60: 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
4f70: 70 43 75 72 29 20 29 3b 0a 0a 20 20 72 63 20 3d  pCur) );..  rc =
4f80: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79   sqlite3BtreeKey
4f90: 53 69 7a 65 28 70 43 75 72 2c 20 26 70 43 75 72  Size(pCur, &pCur
4fa0: 2d 3e 6e 4b 65 79 29 3b 0a 20 20 61 73 73 65 72  ->nKey);.  asser
4fb0: 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc==SQLITE_OK
4fc0: 20 29 3b 20 20 2f 2a 20 4b 65 79 53 69 7a 65 28   );  /* KeySize(
4fd0: 29 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20 2a 2f  ) cannot fail */
4fe0: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69  ..  /* If this i
4ff0: 73 20 61 6e 20 69 6e 74 4b 65 79 20 74 61 62 6c  s an intKey tabl
5000: 65 2c 20 74 68 65 6e 20 74 68 65 20 61 62 6f 76  e, then the abov
5010: 65 20 63 61 6c 6c 20 74 6f 20 42 74 72 65 65 4b  e call to BtreeK
5020: 65 79 53 69 7a 65 28 29 0a 20 20 2a 2a 20 73 74  eySize().  ** st
5030: 6f 72 65 73 20 74 68 65 20 69 6e 74 65 67 65 72  ores the integer
5040: 20 6b 65 79 20 69 6e 20 70 43 75 72 2d 3e 6e 4b   key in pCur->nK
5050: 65 79 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ey. In this case
5060: 20 74 68 69 73 20 76 61 6c 75 65 20 69 73 0a 20   this value is. 
5070: 20 2a 2a 20 61 6c 6c 20 74 68 61 74 20 69 73 20   ** all that is 
5080: 72 65 71 75 69 72 65 64 2e 20 4f 74 68 65 72 77  required. Otherw
5090: 69 73 65 2c 20 69 66 20 70 43 75 72 20 69 73 20  ise, if pCur is 
50a0: 6e 6f 74 20 6f 70 65 6e 20 6f 6e 20 61 6e 20 69  not open on an i
50b0: 6e 74 4b 65 79 0a 20 20 2a 2a 20 74 61 62 6c 65  ntKey.  ** table
50c0: 2c 20 74 68 65 6e 20 6d 61 6c 6c 6f 63 20 73 70  , then malloc sp
50d0: 61 63 65 20 66 6f 72 20 61 6e 64 20 73 74 6f 72  ace for and stor
50e0: 65 20 74 68 65 20 70 43 75 72 2d 3e 6e 4b 65 79  e the pCur->nKey
50f0: 20 62 79 74 65 73 20 6f 66 20 6b 65 79 20 0a 20   bytes of key . 
5100: 20 2a 2a 20 64 61 74 61 2e 0a 20 20 2a 2f 0a 20   ** data..  */. 
5110: 20 69 66 28 20 30 3d 3d 70 43 75 72 2d 3e 61 70   if( 0==pCur->ap
5120: 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20  Page[0]->intKey 
5130: 29 7b 0a 20 20 20 20 76 6f 69 64 20 2a 70 4b 65  ){.    void *pKe
5140: 79 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  y = sqlite3Mallo
5150: 63 28 20 70 43 75 72 2d 3e 6e 4b 65 79 20 29 3b  c( pCur->nKey );
5160: 0a 20 20 20 20 69 66 28 20 70 4b 65 79 20 29 7b  .    if( pKey ){
5170: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
5180: 74 65 33 42 74 72 65 65 4b 65 79 28 70 43 75 72  te3BtreeKey(pCur
5190: 2c 20 30 2c 20 28 69 6e 74 29 70 43 75 72 2d 3e  , 0, (int)pCur->
51a0: 6e 4b 65 79 2c 20 70 4b 65 79 29 3b 0a 20 20 20  nKey, pKey);.   
51b0: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
51c0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
51d0: 70 43 75 72 2d 3e 70 4b 65 79 20 3d 20 70 4b 65  pCur->pKey = pKe
51e0: 79 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  y;.      }else{.
51f0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
5200: 66 72 65 65 28 70 4b 65 79 29 3b 0a 20 20 20 20  free(pKey);.    
5210: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
5220: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
5230: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20  _NOMEM;.    }.  
5240: 7d 0a 20 20 61 73 73 65 72 74 28 20 21 70 43 75  }.  assert( !pCu
5250: 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e  r->apPage[0]->in
5260: 74 4b 65 79 20 7c 7c 20 21 70 43 75 72 2d 3e 70  tKey || !pCur->p
5270: 4b 65 79 20 29 3b 0a 0a 20 20 69 66 28 20 72 63  Key );..  if( rc
5280: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
5290: 20 20 20 62 74 72 65 65 52 65 6c 65 61 73 65 41     btreeReleaseA
52a0: 6c 6c 43 75 72 73 6f 72 50 61 67 65 73 28 70 43  llCursorPages(pC
52b0: 75 72 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 65  ur);.    pCur->e
52c0: 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 52  State = CURSOR_R
52d0: 45 51 55 49 52 45 53 45 45 4b 3b 0a 20 20 7d 0a  EQUIRESEEK;.  }.
52e0: 0a 20 20 69 6e 76 61 6c 69 64 61 74 65 4f 76 65  .  invalidateOve
52f0: 72 66 6c 6f 77 43 61 63 68 65 28 70 43 75 72 29  rflowCache(pCur)
5300: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
5310: 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66  ../* Forward ref
5320: 65 72 65 6e 63 65 20 2a 2f 0a 73 74 61 74 69 63  erence */.static
5330: 20 69 6e 74 20 53 51 4c 49 54 45 5f 4e 4f 49 4e   int SQLITE_NOIN
5340: 4c 49 4e 45 20 73 61 76 65 43 75 72 73 6f 72 73  LINE saveCursors
5350: 4f 6e 4c 69 73 74 28 42 74 43 75 72 73 6f 72 2a  OnList(BtCursor*
5360: 2c 50 67 6e 6f 2c 42 74 43 75 72 73 6f 72 2a 29  ,Pgno,BtCursor*)
5370: 3b 0a 0a 2f 2a 0a 2a 2a 20 53 61 76 65 20 74 68  ;../*.** Save th
5380: 65 20 70 6f 73 69 74 69 6f 6e 73 20 6f 66 20 61  e positions of a
5390: 6c 6c 20 63 75 72 73 6f 72 73 20 28 65 78 63 65  ll cursors (exce
53a0: 70 74 20 70 45 78 63 65 70 74 29 20 74 68 61 74  pt pExcept) that
53b0: 20 61 72 65 20 6f 70 65 6e 20 6f 6e 0a 2a 2a 20   are open on.** 
53c0: 74 68 65 20 74 61 62 6c 65 20 77 69 74 68 20 72  the table with r
53d0: 6f 6f 74 2d 70 61 67 65 20 69 52 6f 6f 74 2e 20  oot-page iRoot. 
53e0: 20 22 53 61 76 69 6e 67 20 74 68 65 20 63 75 72   "Saving the cur
53f0: 73 6f 72 20 70 6f 73 69 74 69 6f 6e 22 20 6d 65  sor position" me
5400: 61 6e 73 20 74 68 61 74 0a 2a 2a 20 74 68 65 20  ans that.** the 
5410: 6c 6f 63 61 74 69 6f 6e 20 69 6e 20 74 68 65 20  location in the 
5420: 62 74 72 65 65 20 69 73 20 72 65 6d 65 6d 62 65  btree is remembe
5430: 72 65 64 20 69 6e 20 73 75 63 68 20 61 20 77 61  red in such a wa
5440: 79 20 74 68 61 74 20 69 74 20 63 61 6e 20 62 65  y that it can be
5450: 0a 2a 2a 20 6d 6f 76 65 64 20 62 61 63 6b 20 74  .** moved back t
5460: 6f 20 74 68 65 20 73 61 6d 65 20 73 70 6f 74 20  o the same spot 
5470: 61 66 74 65 72 20 74 68 65 20 62 74 72 65 65 20  after the btree 
5480: 68 61 73 20 62 65 65 6e 20 6d 6f 64 69 66 69 65  has been modifie
5490: 64 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74  d.  This.** rout
54a0: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 6a 75  ine is called ju
54b0: 73 74 20 62 65 66 6f 72 65 20 63 75 72 73 6f 72  st before cursor
54c0: 20 70 45 78 63 65 70 74 20 69 73 20 75 73 65 64   pExcept is used
54d0: 20 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 0a 2a   to modify the.*
54e0: 2a 20 74 61 62 6c 65 2c 20 66 6f 72 20 65 78 61  * table, for exa
54f0: 6d 70 6c 65 20 69 6e 20 42 74 72 65 65 44 65 6c  mple in BtreeDel
5500: 65 74 65 28 29 20 6f 72 20 42 74 72 65 65 49 6e  ete() or BtreeIn
5510: 73 65 72 74 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 6d  sert()..**.** Im
5520: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6e 6f 74  plementation not
5530: 65 3a 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  e:  This routine
5540: 20 6d 65 72 65 6c 79 20 63 68 65 63 6b 73 20 74   merely checks t
5550: 6f 20 73 65 65 20 69 66 20 61 6e 79 20 63 75 72  o see if any cur
5560: 73 6f 72 73 0a 2a 2a 20 6e 65 65 64 20 74 6f 20  sors.** need to 
5570: 62 65 20 73 61 76 65 64 2e 20 20 49 74 20 63 61  be saved.  It ca
5580: 6c 6c 73 20 6f 75 74 20 74 6f 20 73 61 76 65 43  lls out to saveC
5590: 75 72 73 6f 72 73 4f 6e 4c 69 73 74 28 29 20 69  ursorsOnList() i
55a0: 6e 20 74 68 65 20 28 75 6e 75 73 75 61 6c 29 0a  n the (unusual).
55b0: 2a 2a 20 65 76 65 6e 74 20 74 68 61 74 20 63 75  ** event that cu
55c0: 72 73 6f 72 73 20 61 72 65 20 69 6e 20 6e 65 65  rsors are in nee
55d0: 64 20 74 6f 20 62 65 69 6e 67 20 73 61 76 65 64  d to being saved
55e0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
55f0: 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 42  saveAllCursors(B
5600: 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67  tShared *pBt, Pg
5610: 6e 6f 20 69 52 6f 6f 74 2c 20 42 74 43 75 72 73  no iRoot, BtCurs
5620: 6f 72 20 2a 70 45 78 63 65 70 74 29 7b 0a 20 20  or *pExcept){.  
5630: 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 61  BtCursor *p;.  a
5640: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
5650: 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
5660: 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
5670: 74 28 20 70 45 78 63 65 70 74 3d 3d 30 20 7c 7c  t( pExcept==0 ||
5680: 20 70 45 78 63 65 70 74 2d 3e 70 42 74 3d 3d 70   pExcept->pBt==p
5690: 42 74 20 29 3b 0a 20 20 66 6f 72 28 70 3d 70 42  Bt );.  for(p=pB
56a0: 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70  t->pCursor; p; p
56b0: 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  =p->pNext){.    
56c0: 69 66 28 20 70 21 3d 70 45 78 63 65 70 74 20 26  if( p!=pExcept &
56d0: 26 20 28 30 3d 3d 69 52 6f 6f 74 20 7c 7c 20 70  & (0==iRoot || p
56e0: 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f  ->pgnoRoot==iRoo
56f0: 74 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  t) ) break;.  }.
5700: 20 20 72 65 74 75 72 6e 20 70 20 3f 20 73 61 76    return p ? sav
5710: 65 43 75 72 73 6f 72 73 4f 6e 4c 69 73 74 28 70  eCursorsOnList(p
5720: 2c 20 69 52 6f 6f 74 2c 20 70 45 78 63 65 70 74  , iRoot, pExcept
5730: 29 20 3a 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  ) : SQLITE_OK;.}
5740: 0a 0a 2f 2a 20 54 68 69 73 20 68 65 6c 70 65 72  ../* This helper
5750: 20 72 6f 75 74 69 6e 65 20 74 6f 20 73 61 76 65   routine to save
5760: 41 6c 6c 43 75 72 73 6f 72 73 20 64 6f 65 73 20  AllCursors does 
5770: 74 68 65 20 61 63 74 75 61 6c 20 77 6f 72 6b 20  the actual work 
5780: 6f 66 20 73 61 76 69 6e 67 0a 2a 2a 20 74 68 65  of saving.** the
5790: 20 63 75 72 73 6f 72 73 20 69 66 20 61 6e 64 20   cursors if and 
57a0: 77 68 65 6e 20 61 20 63 75 72 73 6f 72 20 69 73  when a cursor is
57b0: 20 66 6f 75 6e 64 20 74 68 61 74 20 61 63 74 75   found that actu
57c0: 61 6c 6c 79 20 72 65 71 75 69 72 65 73 20 73 61  ally requires sa
57d0: 76 69 6e 67 2e 0a 2a 2a 20 54 68 65 20 63 6f 6d  ving..** The com
57e0: 6d 6f 6e 20 63 61 73 65 20 69 73 20 74 68 61 74  mon case is that
57f0: 20 6e 6f 20 63 75 72 73 6f 72 73 20 6e 65 65 64   no cursors need
5800: 20 74 6f 20 62 65 20 73 61 76 65 64 2c 20 73 6f   to be saved, so
5810: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
5820: 0a 2a 2a 20 62 72 6f 6b 65 6e 20 6f 75 74 20 66  .** broken out f
5830: 72 6f 6d 20 69 74 73 20 63 61 6c 6c 65 72 20 74  rom its caller t
5840: 6f 20 61 76 6f 69 64 20 75 6e 6e 65 63 65 73 73  o avoid unnecess
5850: 61 72 79 20 73 74 61 63 6b 20 70 6f 69 6e 74 65  ary stack pointe
5860: 72 20 6d 6f 76 65 6d 65 6e 74 2e 0a 2a 2f 0a 73  r movement..*/.s
5870: 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45  tatic int SQLITE
5880: 5f 4e 4f 49 4e 4c 49 4e 45 20 73 61 76 65 43 75  _NOINLINE saveCu
5890: 72 73 6f 72 73 4f 6e 4c 69 73 74 28 0a 20 20 42  rsorsOnList(.  B
58a0: 74 43 75 72 73 6f 72 20 2a 70 2c 20 20 20 20 20  tCursor *p,     
58b0: 20 20 20 20 2f 2a 20 54 68 65 20 66 69 72 73 74      /* The first
58c0: 20 63 75 72 73 6f 72 20 74 68 61 74 20 6e 65 65   cursor that nee
58d0: 64 73 20 73 61 76 69 6e 67 20 2a 2f 0a 20 20 50  ds saving */.  P
58e0: 67 6e 6f 20 69 52 6f 6f 74 2c 20 20 20 20 20 20  gno iRoot,      
58f0: 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 73 61 76 65      /* Only save
5900: 20 63 75 72 73 6f 72 20 77 69 74 68 20 74 68 69   cursor with thi
5910: 73 20 69 52 6f 6f 74 2e 20 53 61 76 65 20 61 6c  s iRoot. Save al
5920: 6c 20 69 66 20 7a 65 72 6f 20 2a 2f 0a 20 20 42  l if zero */.  B
5930: 74 43 75 72 73 6f 72 20 2a 70 45 78 63 65 70 74  tCursor *pExcept
5940: 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 73 61      /* Do not sa
5950: 76 65 20 74 68 69 73 20 63 75 72 73 6f 72 20 2a  ve this cursor *
5960: 2f 0a 29 7b 0a 20 20 64 6f 7b 0a 20 20 20 20 69  /.){.  do{.    i
5970: 66 28 20 70 21 3d 70 45 78 63 65 70 74 20 26 26  f( p!=pExcept &&
5980: 20 28 30 3d 3d 69 52 6f 6f 74 20 7c 7c 20 70 2d   (0==iRoot || p-
5990: 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f 74  >pgnoRoot==iRoot
59a0: 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  ) ){.      if( p
59b0: 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
59c0: 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 20 20  _VALID ){.      
59d0: 20 20 69 6e 74 20 72 63 20 3d 20 73 61 76 65 43    int rc = saveC
59e0: 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29  ursorPosition(p)
59f0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 53 51  ;.        if( SQ
5a00: 4c 49 54 45 5f 4f 4b 21 3d 72 63 20 29 7b 0a 20  LITE_OK!=rc ){. 
5a10: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
5a20: 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rc;.        }.  
5a30: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
5a40: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e     testcase( p->
5a50: 69 50 61 67 65 3e 30 20 29 3b 0a 20 20 20 20 20  iPage>0 );.     
5a60: 20 20 20 62 74 72 65 65 52 65 6c 65 61 73 65 41     btreeReleaseA
5a70: 6c 6c 43 75 72 73 6f 72 50 61 67 65 73 28 70 29  llCursorPages(p)
5a80: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
5a90: 20 20 20 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74      p = p->pNext
5aa0: 3b 0a 20 20 7d 77 68 69 6c 65 28 20 70 20 29 3b  ;.  }while( p );
5ab0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
5ac0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  _OK;.}../*.** Cl
5ad0: 65 61 72 20 74 68 65 20 63 75 72 72 65 6e 74 20  ear the current 
5ae0: 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 2e  cursor position.
5af0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
5b00: 42 74 72 65 65 43 6c 65 61 72 43 75 72 73 6f 72  BtreeClearCursor
5b10: 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
5b20: 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  {.  assert( curs
5b30: 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
5b40: 72 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  r) );.  sqlite3_
5b50: 66 72 65 65 28 70 43 75 72 2d 3e 70 4b 65 79 29  free(pCur->pKey)
5b60: 3b 0a 20 20 70 43 75 72 2d 3e 70 4b 65 79 20 3d  ;.  pCur->pKey =
5b70: 20 30 3b 0a 20 20 70 43 75 72 2d 3e 65 53 74 61   0;.  pCur->eSta
5b80: 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41  te = CURSOR_INVA
5b90: 4c 49 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  LID;.}../*.** In
5ba0: 20 74 68 69 73 20 76 65 72 73 69 6f 6e 20 6f 66   this version of
5bb0: 20 42 74 72 65 65 4d 6f 76 65 74 6f 2c 20 70 4b   BtreeMoveto, pK
5bc0: 65 79 20 69 73 20 61 20 70 61 63 6b 65 64 20 69  ey is a packed i
5bd0: 6e 64 65 78 20 72 65 63 6f 72 64 0a 2a 2a 20 73  ndex record.** s
5be0: 75 63 68 20 61 73 20 69 73 20 67 65 6e 65 72 61  uch as is genera
5bf0: 74 65 64 20 62 79 20 74 68 65 20 4f 50 5f 4d 61  ted by the OP_Ma
5c00: 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f 64 65 2e  keRecord opcode.
5c10: 20 20 55 6e 70 61 63 6b 20 74 68 65 0a 2a 2a 20    Unpack the.** 
5c20: 72 65 63 6f 72 64 20 61 6e 64 20 74 68 65 6e 20  record and then 
5c30: 63 61 6c 6c 20 42 74 72 65 65 4d 6f 76 65 74 6f  call BtreeMoveto
5c40: 55 6e 70 61 63 6b 65 64 28 29 20 74 6f 20 64 6f  Unpacked() to do
5c50: 20 74 68 65 20 77 6f 72 6b 2e 0a 2a 2f 0a 73 74   the work..*/.st
5c60: 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 4d 6f  atic int btreeMo
5c70: 76 65 74 6f 28 0a 20 20 42 74 43 75 72 73 6f 72  veto(.  BtCursor
5c80: 20 2a 70 43 75 72 2c 20 20 20 20 20 2f 2a 20 43   *pCur,     /* C
5c90: 75 72 73 6f 72 20 6f 70 65 6e 20 6f 6e 20 74 68  ursor open on th
5ca0: 65 20 62 74 72 65 65 20 74 6f 20 62 65 20 73 65  e btree to be se
5cb0: 61 72 63 68 65 64 20 2a 2f 0a 20 20 63 6f 6e 73  arched */.  cons
5cc0: 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20 20 20  t void *pKey,   
5cd0: 2f 2a 20 50 61 63 6b 65 64 20 6b 65 79 20 69 66  /* Packed key if
5ce0: 20 74 68 65 20 62 74 72 65 65 20 69 73 20 61 6e   the btree is an
5cf0: 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 36 34 20   index */.  i64 
5d00: 6e 4b 65 79 2c 20 20 20 20 20 20 20 20 20 20 20  nKey,           
5d10: 2f 2a 20 49 6e 74 65 67 65 72 20 6b 65 79 20 66  /* Integer key f
5d20: 6f 72 20 74 61 62 6c 65 73 2e 20 20 53 69 7a 65  or tables.  Size
5d30: 20 6f 66 20 70 4b 65 79 20 66 6f 72 20 69 6e 64   of pKey for ind
5d40: 69 63 65 73 20 2a 2f 0a 20 20 69 6e 74 20 62 69  ices */.  int bi
5d50: 61 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  as,           /*
5d60: 20 42 69 61 73 20 73 65 61 72 63 68 20 74 6f 20   Bias search to 
5d70: 74 68 65 20 68 69 67 68 20 65 6e 64 20 2a 2f 0a  the high end */.
5d80: 20 20 69 6e 74 20 2a 70 52 65 73 20 20 20 20 20    int *pRes     
5d90: 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 73        /* Write s
5da0: 65 61 72 63 68 20 72 65 73 75 6c 74 73 20 68 65  earch results he
5db0: 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  re */.){.  int r
5dc0: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
5dd0: 20 20 20 20 20 20 2f 2a 20 53 74 61 74 75 73 20        /* Status 
5de0: 63 6f 64 65 20 2a 2f 0a 20 20 55 6e 70 61 63 6b  code */.  Unpack
5df0: 65 64 52 65 63 6f 72 64 20 2a 70 49 64 78 4b 65  edRecord *pIdxKe
5e00: 79 3b 20 20 20 2f 2a 20 55 6e 70 61 63 6b 65 64  y;   /* Unpacked
5e10: 20 69 6e 64 65 78 20 6b 65 79 20 2a 2f 0a 20 20   index key */.  
5e20: 63 68 61 72 20 61 53 70 61 63 65 5b 32 30 30 5d  char aSpace[200]
5e30: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65  ;          /* Te
5e40: 6d 70 20 73 70 61 63 65 20 66 6f 72 20 70 49 64  mp space for pId
5e50: 78 4b 65 79 20 2d 20 74 6f 20 61 76 6f 69 64 20  xKey - to avoid 
5e60: 61 20 6d 61 6c 6c 6f 63 20 2a 2f 0a 20 20 63 68  a malloc */.  ch
5e70: 61 72 20 2a 70 46 72 65 65 20 3d 20 30 3b 0a 0a  ar *pFree = 0;..
5e80: 20 20 69 66 28 20 70 4b 65 79 20 29 7b 0a 20 20    if( pKey ){.  
5e90: 20 20 61 73 73 65 72 74 28 20 6e 4b 65 79 3d 3d    assert( nKey==
5ea0: 28 69 36 34 29 28 69 6e 74 29 6e 4b 65 79 20 29  (i64)(int)nKey )
5eb0: 3b 0a 20 20 20 20 70 49 64 78 4b 65 79 20 3d 20  ;.    pIdxKey = 
5ec0: 73 71 6c 69 74 65 33 56 64 62 65 41 6c 6c 6f 63  sqlite3VdbeAlloc
5ed0: 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 28 0a  UnpackedRecord(.
5ee0: 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 70 4b          pCur->pK
5ef0: 65 79 49 6e 66 6f 2c 20 61 53 70 61 63 65 2c 20  eyInfo, aSpace, 
5f00: 73 69 7a 65 6f 66 28 61 53 70 61 63 65 29 2c 20  sizeof(aSpace), 
5f10: 26 70 46 72 65 65 0a 20 20 20 20 29 3b 0a 20 20  &pFree.    );.  
5f20: 20 20 69 66 28 20 70 49 64 78 4b 65 79 3d 3d 30    if( pIdxKey==0
5f30: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
5f40: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 73 71 6c 69  _NOMEM;.    sqli
5f50: 74 65 33 56 64 62 65 52 65 63 6f 72 64 55 6e 70  te3VdbeRecordUnp
5f60: 61 63 6b 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e  ack(pCur->pKeyIn
5f70: 66 6f 2c 20 28 69 6e 74 29 6e 4b 65 79 2c 20 70  fo, (int)nKey, p
5f80: 4b 65 79 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20  Key, pIdxKey);. 
5f90: 20 20 20 69 66 28 20 70 49 64 78 4b 65 79 2d 3e     if( pIdxKey->
5fa0: 6e 46 69 65 6c 64 3d 3d 30 20 29 7b 0a 20 20 20  nField==0 ){.   
5fb0: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
5fc0: 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 2d  (pCur->pKeyInfo-
5fd0: 3e 64 62 2c 20 70 46 72 65 65 29 3b 0a 20 20 20  >db, pFree);.   
5fe0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
5ff0: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
6000: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
6010: 20 20 70 49 64 78 4b 65 79 20 3d 20 30 3b 0a 20    pIdxKey = 0;. 
6020: 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65   }.  rc = sqlite
6030: 33 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61  3BtreeMovetoUnpa
6040: 63 6b 65 64 28 70 43 75 72 2c 20 70 49 64 78 4b  cked(pCur, pIdxK
6050: 65 79 2c 20 6e 4b 65 79 2c 20 62 69 61 73 2c 20  ey, nKey, bias, 
6060: 70 52 65 73 29 3b 0a 20 20 69 66 28 20 70 46 72  pRes);.  if( pFr
6070: 65 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ee ){.    sqlite
6080: 33 44 62 46 72 65 65 28 70 43 75 72 2d 3e 70 4b  3DbFree(pCur->pK
6090: 65 79 49 6e 66 6f 2d 3e 64 62 2c 20 70 46 72 65  eyInfo->db, pFre
60a0: 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  e);.  }.  return
60b0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
60c0: 73 74 6f 72 65 20 74 68 65 20 63 75 72 73 6f 72  store the cursor
60d0: 20 74 6f 20 74 68 65 20 70 6f 73 69 74 69 6f 6e   to the position
60e0: 20 69 74 20 77 61 73 20 69 6e 20 28 6f 72 20 61   it was in (or a
60f0: 73 20 63 6c 6f 73 65 20 74 6f 20 61 73 20 70 6f  s close to as po
6100: 73 73 69 62 6c 65 29 0a 2a 2a 20 77 68 65 6e 20  ssible).** when 
6110: 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69  saveCursorPositi
6120: 6f 6e 28 29 20 77 61 73 20 63 61 6c 6c 65 64 2e  on() was called.
6130: 20 4e 6f 74 65 20 74 68 61 74 20 74 68 69 73 20   Note that this 
6140: 63 61 6c 6c 20 64 65 6c 65 74 65 73 20 74 68 65  call deletes the
6150: 20 0a 2a 2a 20 73 61 76 65 64 20 70 6f 73 69 74   .** saved posit
6160: 69 6f 6e 20 69 6e 66 6f 20 73 74 6f 72 65 64 20  ion info stored 
6170: 62 79 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73  by saveCursorPos
6180: 69 74 69 6f 6e 28 29 2c 20 73 6f 20 74 68 65 72  ition(), so ther
6190: 65 20 63 61 6e 20 62 65 0a 2a 2a 20 61 74 20 6d  e can be.** at m
61a0: 6f 73 74 20 6f 6e 65 20 65 66 66 65 63 74 69 76  ost one effectiv
61b0: 65 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50  e restoreCursorP
61c0: 6f 73 69 74 69 6f 6e 28 29 20 63 61 6c 6c 20 61  osition() call a
61d0: 66 74 65 72 20 65 61 63 68 20 0a 2a 2a 20 73 61  fter each .** sa
61e0: 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  veCursorPosition
61f0: 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ()..*/.static in
6200: 74 20 62 74 72 65 65 52 65 73 74 6f 72 65 43 75  t btreeRestoreCu
6210: 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 42 74 43  rsorPosition(BtC
6220: 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
6230: 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74  int rc;.  assert
6240: 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
6250: 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ex(pCur) );.  as
6260: 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
6270: 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55 49  te>=CURSOR_REQUI
6280: 52 45 53 45 45 4b 20 29 3b 0a 20 20 69 66 28 20  RESEEK );.  if( 
6290: 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
62a0: 52 53 4f 52 5f 46 41 55 4c 54 20 29 7b 0a 20 20  RSOR_FAULT ){.  
62b0: 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 73    return pCur->s
62c0: 6b 69 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 70  kipNext;.  }.  p
62d0: 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
62e0: 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20  RSOR_INVALID;.  
62f0: 72 63 20 3d 20 62 74 72 65 65 4d 6f 76 65 74 6f  rc = btreeMoveto
6300: 28 70 43 75 72 2c 20 70 43 75 72 2d 3e 70 4b 65  (pCur, pCur->pKe
6310: 79 2c 20 70 43 75 72 2d 3e 6e 4b 65 79 2c 20 30  y, pCur->nKey, 0
6320: 2c 20 26 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78  , &pCur->skipNex
6330: 74 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  t);.  if( rc==SQ
6340: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73  LITE_OK ){.    s
6350: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75 72  qlite3_free(pCur
6360: 2d 3e 70 4b 65 79 29 3b 0a 20 20 20 20 70 43 75  ->pKey);.    pCu
6370: 72 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a 20 20 20  r->pKey = 0;.   
6380: 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
6390: 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
63a0: 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74  LID || pCur->eSt
63b0: 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41  ate==CURSOR_INVA
63c0: 4c 49 44 20 29 3b 0a 20 20 20 20 69 66 28 20 70  LID );.    if( p
63d0: 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 26 26  Cur->skipNext &&
63e0: 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
63f0: 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20  URSOR_VALID ){. 
6400: 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74       pCur->eStat
6410: 65 20 3d 20 43 55 52 53 4f 52 5f 53 4b 49 50 4e  e = CURSOR_SKIPN
6420: 45 58 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  EXT;.    }.  }. 
6430: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
6440: 64 65 66 69 6e 65 20 72 65 73 74 6f 72 65 43 75  define restoreCu
6450: 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29 20  rsorPosition(p) 
6460: 5c 0a 20 20 28 70 2d 3e 65 53 74 61 74 65 3e 3d  \.  (p->eState>=
6470: 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45  CURSOR_REQUIRESE
6480: 45 4b 20 3f 20 5c 0a 20 20 20 20 20 20 20 20 20  EK ? \.         
6490: 62 74 72 65 65 52 65 73 74 6f 72 65 43 75 72 73  btreeRestoreCurs
64a0: 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29 20 3a 20  orPosition(p) : 
64b0: 5c 0a 20 20 20 20 20 20 20 20 20 53 51 4c 49 54  \.         SQLIT
64c0: 45 5f 4f 4b 29 0a 0a 2f 2a 0a 2a 2a 20 44 65 74  E_OK)../*.** Det
64d0: 65 72 6d 69 6e 65 20 77 68 65 74 68 65 72 20 6f  ermine whether o
64e0: 72 20 6e 6f 74 20 61 20 63 75 72 73 6f 72 20 68  r not a cursor h
64f0: 61 73 20 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68  as moved from th
6500: 65 20 70 6f 73 69 74 69 6f 6e 20 77 68 65 72 65  e position where
6510: 0a 2a 2a 20 69 74 20 77 61 73 20 6c 61 73 74 20  .** it was last 
6520: 70 6c 61 63 65 64 2c 20 6f 72 20 68 61 73 20 62  placed, or has b
6530: 65 65 6e 20 69 6e 76 61 6c 69 64 61 74 65 64 20  een invalidated 
6540: 66 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 72 65  for any other re
6550: 61 73 6f 6e 2e 0a 2a 2a 20 43 75 72 73 6f 72 73  ason..** Cursors
6560: 20 63 61 6e 20 6d 6f 76 65 20 77 68 65 6e 20 74   can move when t
6570: 68 65 20 72 6f 77 20 74 68 65 79 20 61 72 65 20  he row they are 
6580: 70 6f 69 6e 74 69 6e 67 20 61 74 20 69 73 20 64  pointing at is d
6590: 65 6c 65 74 65 64 20 6f 75 74 0a 2a 2a 20 66 72  eleted out.** fr
65a0: 6f 6d 20 75 6e 64 65 72 20 74 68 65 6d 2c 20 66  om under them, f
65b0: 6f 72 20 65 78 61 6d 70 6c 65 2e 20 20 43 75 72  or example.  Cur
65c0: 73 6f 72 20 6d 69 67 68 74 20 61 6c 73 6f 20 6d  sor might also m
65d0: 6f 76 65 20 69 66 20 61 20 62 74 72 65 65 0a 2a  ove if a btree.*
65e0: 2a 20 69 73 20 72 65 62 61 6c 61 6e 63 65 64 2e  * is rebalanced.
65f0: 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 69 6e 67 20 74  .**.** Calling t
6600: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 74 68  his routine with
6610: 20 61 20 4e 55 4c 4c 20 63 75 72 73 6f 72 20 70   a NULL cursor p
6620: 6f 69 6e 74 65 72 20 72 65 74 75 72 6e 73 20 66  ointer returns f
6630: 61 6c 73 65 2e 0a 2a 2a 0a 2a 2a 20 55 73 65 20  alse..**.** Use 
6640: 74 68 65 20 73 65 70 61 72 61 74 65 20 73 71 6c  the separate sql
6650: 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 52  ite3BtreeCursorR
6660: 65 73 74 6f 72 65 28 29 20 72 6f 75 74 69 6e 65  estore() routine
6670: 20 74 6f 20 72 65 73 74 6f 72 65 20 61 20 63 75   to restore a cu
6680: 72 73 6f 72 0a 2a 2a 20 62 61 63 6b 20 74 6f 20  rsor.** back to 
6690: 77 68 65 72 65 20 69 74 20 6f 75 67 68 74 20 74  where it ought t
66a0: 6f 20 62 65 20 69 66 20 74 68 69 73 20 72 6f 75  o be if this rou
66b0: 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74 72 75  tine returns tru
66c0: 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
66d0: 33 42 74 72 65 65 43 75 72 73 6f 72 48 61 73 4d  3BtreeCursorHasM
66e0: 6f 76 65 64 28 42 74 43 75 72 73 6f 72 20 2a 70  oved(BtCursor *p
66f0: 43 75 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  Cur){.  return p
6700: 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52  Cur->eState!=CUR
6710: 53 4f 52 5f 56 41 4c 49 44 3b 0a 7d 0a 0a 2f 2a  SOR_VALID;.}../*
6720: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
6730: 20 72 65 73 74 6f 72 65 73 20 61 20 63 75 72 73   restores a curs
6740: 6f 72 20 62 61 63 6b 20 74 6f 20 69 74 73 20 6f  or back to its o
6750: 72 69 67 69 6e 61 6c 20 70 6f 73 69 74 69 6f 6e  riginal position
6760: 20 61 66 74 65 72 20 69 74 0a 2a 2a 20 68 61 73   after it.** has
6770: 20 62 65 65 6e 20 6d 6f 76 65 64 20 62 79 20 73   been moved by s
6780: 6f 6d 65 20 6f 75 74 73 69 64 65 20 61 63 74 69  ome outside acti
6790: 76 69 74 79 20 28 73 75 63 68 20 61 73 20 61 20  vity (such as a 
67a0: 62 74 72 65 65 20 72 65 62 61 6c 61 6e 63 65 20  btree rebalance 
67b0: 6f 72 0a 2a 2a 20 61 20 72 6f 77 20 68 61 76 69  or.** a row havi
67c0: 6e 67 20 62 65 65 6e 20 64 65 6c 65 74 65 64 20  ng been deleted 
67d0: 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 74  out from under t
67e0: 68 65 20 63 75 72 73 6f 72 29 2e 20 20 0a 2a 2a  he cursor).  .**
67f0: 0a 2a 2a 20 4f 6e 20 73 75 63 63 65 73 73 2c 20  .** On success, 
6800: 74 68 65 20 2a 70 44 69 66 66 65 72 65 6e 74 52  the *pDifferentR
6810: 6f 77 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  ow parameter is 
6820: 66 61 6c 73 65 20 69 66 20 74 68 65 20 63 75 72  false if the cur
6830: 73 6f 72 20 69 73 20 6c 65 66 74 0a 2a 2a 20 70  sor is left.** p
6840: 6f 69 6e 74 69 6e 67 20 61 74 20 65 78 61 63 74  ointing at exact
6850: 6c 79 20 74 68 65 20 73 61 6d 65 20 72 6f 77 2e  ly the same row.
6860: 20 20 2a 70 44 69 66 66 65 72 6e 74 52 6f 77 20    *pDifferntRow 
6870: 69 73 20 74 68 65 20 72 6f 77 20 74 68 65 20 63  is the row the c
6880: 75 72 73 6f 72 0a 2a 2a 20 77 61 73 20 70 6f 69  ursor.** was poi
6890: 6e 74 69 6e 67 20 74 6f 20 68 61 73 20 62 65 65  nting to has bee
68a0: 6e 20 64 65 6c 65 74 65 64 2c 20 66 6f 72 63 69  n deleted, forci
68b0: 6e 67 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f  ng the cursor to
68c0: 20 70 6f 69 6e 74 20 74 6f 20 73 6f 6d 65 0a 2a   point to some.*
68d0: 2a 20 6e 65 61 72 62 79 20 72 6f 77 2e 0a 2a 2a  * nearby row..**
68e0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
68f0: 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20   should only be 
6900: 63 61 6c 6c 65 64 20 66 6f 72 20 61 20 63 75 72  called for a cur
6910: 73 6f 72 20 74 68 61 74 20 6a 75 73 74 20 72 65  sor that just re
6920: 74 75 72 6e 65 64 0a 2a 2a 20 54 52 55 45 20 66  turned.** TRUE f
6930: 72 6f 6d 20 73 71 6c 69 74 65 33 42 74 72 65 65  rom sqlite3Btree
6940: 43 75 72 73 6f 72 48 61 73 4d 6f 76 65 64 28 29  CursorHasMoved()
6950: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
6960: 42 74 72 65 65 43 75 72 73 6f 72 52 65 73 74 6f  BtreeCursorResto
6970: 72 65 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  re(BtCursor *pCu
6980: 72 2c 20 69 6e 74 20 2a 70 44 69 66 66 65 72 65  r, int *pDiffere
6990: 6e 74 52 6f 77 29 7b 0a 20 20 69 6e 74 20 72 63  ntRow){.  int rc
69a0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  ;..  assert( pCu
69b0: 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  r!=0 );.  assert
69c0: 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d  ( pCur->eState!=
69d0: 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
69e0: 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75    rc = restoreCu
69f0: 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75  rsorPosition(pCu
6a00: 72 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a  r);.  if( rc ){.
6a10: 20 20 20 20 2a 70 44 69 66 66 65 72 65 6e 74 52      *pDifferentR
6a20: 6f 77 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75  ow = 1;.    retu
6a30: 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28  rn rc;.  }.  if(
6a40: 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43   pCur->eState!=C
6a50: 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 4e  URSOR_VALID || N
6a60: 45 56 45 52 28 70 43 75 72 2d 3e 73 6b 69 70 4e  EVER(pCur->skipN
6a70: 65 78 74 21 3d 30 29 20 29 7b 0a 20 20 20 20 2a  ext!=0) ){.    *
6a80: 70 44 69 66 66 65 72 65 6e 74 52 6f 77 20 3d 20  pDifferentRow = 
6a90: 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  1;.  }else{.    
6aa0: 2a 70 44 69 66 66 65 72 65 6e 74 52 6f 77 20 3d  *pDifferentRow =
6ab0: 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
6ac0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23   SQLITE_OK;.}..#
6ad0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
6ae0: 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a  IT_AUTOVACUUM./*
6af0: 0a 2a 2a 20 47 69 76 65 6e 20 61 20 70 61 67 65  .** Given a page
6b00: 20 6e 75 6d 62 65 72 20 6f 66 20 61 20 72 65 67   number of a reg
6b10: 75 6c 61 72 20 64 61 74 61 62 61 73 65 20 70 61  ular database pa
6b20: 67 65 2c 20 72 65 74 75 72 6e 20 74 68 65 20 70  ge, return the p
6b30: 61 67 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 66 6f  age.** number fo
6b40: 72 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61  r the pointer-ma
6b50: 70 20 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74  p page that cont
6b60: 61 69 6e 73 20 74 68 65 20 65 6e 74 72 79 20 66  ains the entry f
6b70: 6f 72 20 74 68 65 0a 2a 2a 20 69 6e 70 75 74 20  or the.** input 
6b80: 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 0a  page number..**.
6b90: 2a 2a 20 52 65 74 75 72 6e 20 30 20 28 6e 6f 74  ** Return 0 (not
6ba0: 20 61 20 76 61 6c 69 64 20 70 61 67 65 29 20 66   a valid page) f
6bb0: 6f 72 20 70 67 6e 6f 3d 3d 31 20 73 69 6e 63 65  or pgno==1 since
6bc0: 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 6e 6f 20   there is.** no 
6bd0: 70 6f 69 6e 74 65 72 20 6d 61 70 20 61 73 73 6f  pointer map asso
6be0: 63 69 61 74 65 64 20 77 69 74 68 20 70 61 67 65  ciated with page
6bf0: 20 31 2e 20 20 54 68 65 20 69 6e 74 65 67 72 69   1.  The integri
6c00: 74 79 5f 63 68 65 63 6b 20 6c 6f 67 69 63 0a 2a  ty_check logic.*
6c10: 2a 20 72 65 71 75 69 72 65 73 20 74 68 61 74 20  * requires that 
6c20: 70 74 72 6d 61 70 50 61 67 65 6e 6f 28 2a 2c 31  ptrmapPageno(*,1
6c30: 29 21 3d 31 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  )!=1..*/.static 
6c40: 50 67 6e 6f 20 70 74 72 6d 61 70 50 61 67 65 6e  Pgno ptrmapPagen
6c50: 6f 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c  o(BtShared *pBt,
6c60: 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 69   Pgno pgno){.  i
6c70: 6e 74 20 6e 50 61 67 65 73 50 65 72 4d 61 70 50  nt nPagesPerMapP
6c80: 61 67 65 3b 0a 20 20 50 67 6e 6f 20 69 50 74 72  age;.  Pgno iPtr
6c90: 4d 61 70 2c 20 72 65 74 3b 0a 20 20 61 73 73 65  Map, ret;.  asse
6ca0: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
6cb0: 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
6cc0: 78 29 20 29 3b 0a 20 20 69 66 28 20 70 67 6e 6f  x) );.  if( pgno
6cd0: 3c 32 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  <2 ) return 0;. 
6ce0: 20 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61 67   nPagesPerMapPag
6cf0: 65 20 3d 20 28 70 42 74 2d 3e 75 73 61 62 6c 65  e = (pBt->usable
6d00: 53 69 7a 65 2f 35 29 2b 31 3b 0a 20 20 69 50 74  Size/5)+1;.  iPt
6d10: 72 4d 61 70 20 3d 20 28 70 67 6e 6f 2d 32 29 2f  rMap = (pgno-2)/
6d20: 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61 67 65  nPagesPerMapPage
6d30: 3b 0a 20 20 72 65 74 20 3d 20 28 69 50 74 72 4d  ;.  ret = (iPtrM
6d40: 61 70 2a 6e 50 61 67 65 73 50 65 72 4d 61 70 50  ap*nPagesPerMapP
6d50: 61 67 65 29 20 2b 20 32 3b 20 0a 20 20 69 66 28  age) + 2; .  if(
6d60: 20 72 65 74 3d 3d 50 45 4e 44 49 4e 47 5f 42 59   ret==PENDING_BY
6d70: 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a  TE_PAGE(pBt) ){.
6d80: 20 20 20 20 72 65 74 2b 2b 3b 0a 20 20 7d 0a 20      ret++;.  }. 
6d90: 20 72 65 74 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a   return ret;.}..
6da0: 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 6e 20 65  /*.** Write an e
6db0: 6e 74 72 79 20 69 6e 74 6f 20 74 68 65 20 70 6f  ntry into the po
6dc0: 69 6e 74 65 72 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a  inter map..**.**
6dd0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 75 70   This routine up
6de0: 64 61 74 65 73 20 74 68 65 20 70 6f 69 6e 74 65  dates the pointe
6df0: 72 20 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 20  r map entry for 
6e00: 70 61 67 65 20 6e 75 6d 62 65 72 20 27 6b 65 79  page number 'key
6e10: 27 0a 2a 2a 20 73 6f 20 74 68 61 74 20 69 74 20  '.** so that it 
6e20: 6d 61 70 73 20 74 6f 20 74 79 70 65 20 27 65 54  maps to type 'eT
6e30: 79 70 65 27 20 61 6e 64 20 70 61 72 65 6e 74 20  ype' and parent 
6e40: 70 61 67 65 20 6e 75 6d 62 65 72 20 27 70 67 6e  page number 'pgn
6e50: 6f 27 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 2a 70 52  o'..**.** If *pR
6e60: 43 20 69 73 20 69 6e 69 74 69 61 6c 6c 79 20 6e  C is initially n
6e70: 6f 6e 2d 7a 65 72 6f 20 28 6e 6f 6e 2d 53 51 4c  on-zero (non-SQL
6e80: 49 54 45 5f 4f 4b 29 20 74 68 65 6e 20 74 68 69  ITE_OK) then thi
6e90: 73 20 72 6f 75 74 69 6e 65 20 69 73 0a 2a 2a 20  s routine is.** 
6ea0: 61 20 6e 6f 2d 6f 70 2e 20 20 49 66 20 61 6e 20  a no-op.  If an 
6eb0: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68  error occurs, th
6ec0: 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 72  e appropriate er
6ed0: 72 6f 72 20 63 6f 64 65 20 69 73 20 77 72 69 74  ror code is writ
6ee0: 74 65 6e 0a 2a 2a 20 69 6e 74 6f 20 2a 70 52 43  ten.** into *pRC
6ef0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
6f00: 20 70 74 72 6d 61 70 50 75 74 28 42 74 53 68 61   ptrmapPut(BtSha
6f10: 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6b  red *pBt, Pgno k
6f20: 65 79 2c 20 75 38 20 65 54 79 70 65 2c 20 50 67  ey, u8 eType, Pg
6f30: 6e 6f 20 70 61 72 65 6e 74 2c 20 69 6e 74 20 2a  no parent, int *
6f40: 70 52 43 29 7b 0a 20 20 44 62 50 61 67 65 20 2a  pRC){.  DbPage *
6f50: 70 44 62 50 61 67 65 3b 20 20 2f 2a 20 54 68 65  pDbPage;  /* The
6f60: 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67   pointer map pag
6f70: 65 20 2a 2f 0a 20 20 75 38 20 2a 70 50 74 72 6d  e */.  u8 *pPtrm
6f80: 61 70 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ap;      /* The 
6f90: 70 6f 69 6e 74 65 72 20 6d 61 70 20 64 61 74 61  pointer map data
6fa0: 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 50 74 72 6d   */.  Pgno iPtrm
6fb0: 61 70 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 70  ap;     /* The p
6fc0: 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20  ointer map page 
6fd0: 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 74 20  number */.  int 
6fe0: 6f 66 66 73 65 74 3b 20 20 20 20 20 20 20 2f 2a  offset;       /*
6ff0: 20 4f 66 66 73 65 74 20 69 6e 20 70 6f 69 6e 74   Offset in point
7000: 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20  er map page */. 
7010: 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
7020: 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
7030: 65 20 66 72 6f 6d 20 73 75 62 66 75 6e 63 74 69  e from subfuncti
7040: 6f 6e 73 20 2a 2f 0a 0a 20 20 69 66 28 20 2a 70  ons */..  if( *p
7050: 52 43 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20  RC ) return;..  
7060: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
7070: 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
7080: 6d 75 74 65 78 29 20 29 3b 0a 20 20 2f 2a 20 54  mutex) );.  /* T
7090: 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61  he master-journa
70a0: 6c 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6d 75  l page number mu
70b0: 73 74 20 6e 65 76 65 72 20 62 65 20 75 73 65 64  st never be used
70c0: 20 61 73 20 61 20 70 6f 69 6e 74 65 72 20 6d 61   as a pointer ma
70d0: 70 20 70 61 67 65 20 2a 2f 0a 20 20 61 73 73 65  p page */.  asse
70e0: 72 74 28 20 30 3d 3d 50 54 52 4d 41 50 5f 49 53  rt( 0==PTRMAP_IS
70f0: 50 41 47 45 28 70 42 74 2c 20 50 45 4e 44 49 4e  PAGE(pBt, PENDIN
7100: 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
7110: 29 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ) );..  assert( 
7120: 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
7130: 29 3b 0a 20 20 69 66 28 20 6b 65 79 3d 3d 30 20  );.  if( key==0 
7140: 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 53 51  ){.    *pRC = SQ
7150: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
7160: 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  T;.    return;. 
7170: 20 7d 0a 20 20 69 50 74 72 6d 61 70 20 3d 20 50   }.  iPtrmap = P
7180: 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74  TRMAP_PAGENO(pBt
7190: 2c 20 6b 65 79 29 3b 0a 20 20 72 63 20 3d 20 73  , key);.  rc = s
71a0: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70  qlite3PagerGet(p
71b0: 42 74 2d 3e 70 50 61 67 65 72 2c 20 69 50 74 72  Bt->pPager, iPtr
71c0: 6d 61 70 2c 20 26 70 44 62 50 61 67 65 29 3b 0a  map, &pDbPage);.
71d0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
71e0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52 43 20  _OK ){.    *pRC 
71f0: 3d 20 72 63 3b 0a 20 20 20 20 72 65 74 75 72 6e  = rc;.    return
7200: 3b 0a 20 20 7d 0a 20 20 6f 66 66 73 65 74 20 3d  ;.  }.  offset =
7210: 20 50 54 52 4d 41 50 5f 50 54 52 4f 46 46 53 45   PTRMAP_PTROFFSE
7220: 54 28 69 50 74 72 6d 61 70 2c 20 6b 65 79 29 3b  T(iPtrmap, key);
7230: 0a 20 20 69 66 28 20 6f 66 66 73 65 74 3c 30 20  .  if( offset<0 
7240: 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 53 51  ){.    *pRC = SQ
7250: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
7260: 54 3b 0a 20 20 20 20 67 6f 74 6f 20 70 74 72 6d  T;.    goto ptrm
7270: 61 70 5f 65 78 69 74 3b 0a 20 20 7d 0a 20 20 61  ap_exit;.  }.  a
7280: 73 73 65 72 74 28 20 6f 66 66 73 65 74 20 3c 3d  ssert( offset <=
7290: 20 28 69 6e 74 29 70 42 74 2d 3e 75 73 61 62 6c   (int)pBt->usabl
72a0: 65 53 69 7a 65 2d 35 20 29 3b 0a 20 20 70 50 74  eSize-5 );.  pPt
72b0: 72 6d 61 70 20 3d 20 28 75 38 20 2a 29 73 71 6c  rmap = (u8 *)sql
72c0: 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
72d0: 28 70 44 62 50 61 67 65 29 3b 0a 0a 20 20 69 66  (pDbPage);..  if
72e0: 28 20 65 54 79 70 65 21 3d 70 50 74 72 6d 61 70  ( eType!=pPtrmap
72f0: 5b 6f 66 66 73 65 74 5d 20 7c 7c 20 67 65 74 34  [offset] || get4
7300: 62 79 74 65 28 26 70 50 74 72 6d 61 70 5b 6f 66  byte(&pPtrmap[of
7310: 66 73 65 74 2b 31 5d 29 21 3d 70 61 72 65 6e 74  fset+1])!=parent
7320: 20 29 7b 0a 20 20 20 20 54 52 41 43 45 28 28 22   ){.    TRACE(("
7330: 50 54 52 4d 41 50 5f 55 50 44 41 54 45 3a 20 25  PTRMAP_UPDATE: %
7340: 64 2d 3e 28 25 64 2c 25 64 29 5c 6e 22 2c 20 6b  d->(%d,%d)\n", k
7350: 65 79 2c 20 65 54 79 70 65 2c 20 70 61 72 65 6e  ey, eType, paren
7360: 74 29 29 3b 0a 20 20 20 20 2a 70 52 43 3d 20 72  t));.    *pRC= r
7370: 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
7380: 57 72 69 74 65 28 70 44 62 50 61 67 65 29 3b 0a  Write(pDbPage);.
7390: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
73a0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70  TE_OK ){.      p
73b0: 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d 20 3d  Ptrmap[offset] =
73c0: 20 65 54 79 70 65 3b 0a 20 20 20 20 20 20 70 75   eType;.      pu
73d0: 74 34 62 79 74 65 28 26 70 50 74 72 6d 61 70 5b  t4byte(&pPtrmap[
73e0: 6f 66 66 73 65 74 2b 31 5d 2c 20 70 61 72 65 6e  offset+1], paren
73f0: 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 70  t);.    }.  }..p
7400: 74 72 6d 61 70 5f 65 78 69 74 3a 0a 20 20 73 71  trmap_exit:.  sq
7410: 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
7420: 70 44 62 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a  pDbPage);.}../*.
7430: 2a 2a 20 52 65 61 64 20 61 6e 20 65 6e 74 72 79  ** Read an entry
7440: 20 66 72 6f 6d 20 74 68 65 20 70 6f 69 6e 74 65   from the pointe
7450: 72 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  r map..**.** Thi
7460: 73 20 72 6f 75 74 69 6e 65 20 72 65 74 72 69 65  s routine retrie
7470: 76 65 73 20 74 68 65 20 70 6f 69 6e 74 65 72 20  ves the pointer 
7480: 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 20 70 61  map entry for pa
7490: 67 65 20 27 6b 65 79 27 2c 20 77 72 69 74 69 6e  ge 'key', writin
74a0: 67 0a 2a 2a 20 74 68 65 20 74 79 70 65 20 61 6e  g.** the type an
74b0: 64 20 70 61 72 65 6e 74 20 70 61 67 65 20 6e 75  d parent page nu
74c0: 6d 62 65 72 20 74 6f 20 2a 70 45 54 79 70 65 20  mber to *pEType 
74d0: 61 6e 64 20 2a 70 50 67 6e 6f 20 72 65 73 70 65  and *pPgno respe
74e0: 63 74 69 76 65 6c 79 2e 0a 2a 2a 20 41 6e 20 65  ctively..** An e
74f0: 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
7500: 75 72 6e 65 64 20 69 66 20 73 6f 6d 65 74 68 69  urned if somethi
7510: 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2c 20 6f  ng goes wrong, o
7520: 74 68 65 72 77 69 73 65 20 53 51 4c 49 54 45 5f  therwise SQLITE_
7530: 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  OK..*/.static in
7540: 74 20 70 74 72 6d 61 70 47 65 74 28 42 74 53 68  t ptrmapGet(BtSh
7550: 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20  ared *pBt, Pgno 
7560: 6b 65 79 2c 20 75 38 20 2a 70 45 54 79 70 65 2c  key, u8 *pEType,
7570: 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 29 7b 0a 20   Pgno *pPgno){. 
7580: 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65   DbPage *pDbPage
7590: 3b 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74  ;   /* The point
75a0: 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20  er map page */. 
75b0: 20 69 6e 74 20 69 50 74 72 6d 61 70 3b 20 20 20   int iPtrmap;   
75c0: 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d      /* Pointer m
75d0: 61 70 20 70 61 67 65 20 69 6e 64 65 78 20 2a 2f  ap page index */
75e0: 0a 20 20 75 38 20 2a 70 50 74 72 6d 61 70 3b 20  .  u8 *pPtrmap; 
75f0: 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
7600: 20 6d 61 70 20 70 61 67 65 20 64 61 74 61 20 2a   map page data *
7610: 2f 0a 20 20 69 6e 74 20 6f 66 66 73 65 74 3b 20  /.  int offset; 
7620: 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
7630: 20 6f 66 20 65 6e 74 72 79 20 69 6e 20 70 6f 69   of entry in poi
7640: 6e 74 65 72 20 6d 61 70 20 2a 2f 0a 20 20 69 6e  nter map */.  in
7650: 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  t rc;..  assert(
7660: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
7670: 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
7680: 29 3b 0a 0a 20 20 69 50 74 72 6d 61 70 20 3d 20  );..  iPtrmap = 
7690: 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42  PTRMAP_PAGENO(pB
76a0: 74 2c 20 6b 65 79 29 3b 0a 20 20 72 63 20 3d 20  t, key);.  rc = 
76b0: 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
76c0: 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 69 50 74  pBt->pPager, iPt
76d0: 72 6d 61 70 2c 20 26 70 44 62 50 61 67 65 29 3b  rmap, &pDbPage);
76e0: 0a 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a  .  if( rc!=0 ){.
76f0: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
7700: 20 7d 0a 20 20 70 50 74 72 6d 61 70 20 3d 20 28   }.  pPtrmap = (
7710: 75 38 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65  u8 *)sqlite3Page
7720: 72 47 65 74 44 61 74 61 28 70 44 62 50 61 67 65  rGetData(pDbPage
7730: 29 3b 0a 0a 20 20 6f 66 66 73 65 74 20 3d 20 50  );..  offset = P
7740: 54 52 4d 41 50 5f 50 54 52 4f 46 46 53 45 54 28  TRMAP_PTROFFSET(
7750: 69 50 74 72 6d 61 70 2c 20 6b 65 79 29 3b 0a 20  iPtrmap, key);. 
7760: 20 69 66 28 20 6f 66 66 73 65 74 3c 30 20 29 7b   if( offset<0 ){
7770: 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
7780: 72 55 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b  rUnref(pDbPage);
7790: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
77a0: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
77b0: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6f  .  }.  assert( o
77c0: 66 66 73 65 74 20 3c 3d 20 28 69 6e 74 29 70 42  ffset <= (int)pB
77d0: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 35 20  t->usableSize-5 
77e0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 54  );.  assert( pET
77f0: 79 70 65 21 3d 30 20 29 3b 0a 20 20 2a 70 45 54  ype!=0 );.  *pET
7800: 79 70 65 20 3d 20 70 50 74 72 6d 61 70 5b 6f 66  ype = pPtrmap[of
7810: 66 73 65 74 5d 3b 0a 20 20 69 66 28 20 70 50 67  fset];.  if( pPg
7820: 6e 6f 20 29 20 2a 70 50 67 6e 6f 20 3d 20 67 65  no ) *pPgno = ge
7830: 74 34 62 79 74 65 28 26 70 50 74 72 6d 61 70 5b  t4byte(&pPtrmap[
7840: 6f 66 66 73 65 74 2b 31 5d 29 3b 0a 0a 20 20 73  offset+1]);..  s
7850: 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
7860: 28 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28  (pDbPage);.  if(
7870: 20 2a 70 45 54 79 70 65 3c 31 20 7c 7c 20 2a 70   *pEType<1 || *p
7880: 45 54 79 70 65 3e 35 20 29 20 72 65 74 75 72 6e  EType>5 ) return
7890: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
78a0: 42 4b 50 54 3b 0a 20 20 72 65 74 75 72 6e 20 53  BKPT;.  return S
78b0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6c  QLITE_OK;.}..#el
78c0: 73 65 20 2f 2a 20 69 66 20 64 65 66 69 6e 65 64  se /* if defined
78d0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
78e0: 4f 56 41 43 55 55 4d 20 2a 2f 0a 20 20 23 64 65  OVACUUM */.  #de
78f0: 66 69 6e 65 20 70 74 72 6d 61 70 50 75 74 28 77  fine ptrmapPut(w
7900: 2c 78 2c 79 2c 7a 2c 72 63 29 0a 20 20 23 64 65  ,x,y,z,rc).  #de
7910: 66 69 6e 65 20 70 74 72 6d 61 70 47 65 74 28 77  fine ptrmapGet(w
7920: 2c 78 2c 79 2c 7a 29 20 53 51 4c 49 54 45 5f 4f  ,x,y,z) SQLITE_O
7930: 4b 0a 20 20 23 64 65 66 69 6e 65 20 70 74 72 6d  K.  #define ptrm
7940: 61 70 50 75 74 4f 76 66 6c 50 74 72 28 78 2c 20  apPutOvflPtr(x, 
7950: 79 2c 20 72 63 29 0a 23 65 6e 64 69 66 0a 0a 2f  y, rc).#endif../
7960: 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 62 74 72  *.** Given a btr
7970: 65 65 20 70 61 67 65 20 61 6e 64 20 61 20 63 65  ee page and a ce
7980: 6c 6c 20 69 6e 64 65 78 20 28 30 20 6d 65 61 6e  ll index (0 mean
7990: 73 20 74 68 65 20 66 69 72 73 74 20 63 65 6c 6c  s the first cell
79a0: 20 6f 6e 0a 2a 2a 20 74 68 65 20 70 61 67 65 2c   on.** the page,
79b0: 20 31 20 6d 65 61 6e 73 20 74 68 65 20 73 65 63   1 means the sec
79c0: 6f 6e 64 20 63 65 6c 6c 2c 20 61 6e 64 20 73 6f  ond cell, and so
79d0: 20 66 6f 72 74 68 29 20 72 65 74 75 72 6e 20 61   forth) return a
79e0: 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74   pointer.** to t
79f0: 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 2e  he cell content.
7a00: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
7a10: 69 6e 65 20 77 6f 72 6b 73 20 6f 6e 6c 79 20 66  ine works only f
7a20: 6f 72 20 70 61 67 65 73 20 74 68 61 74 20 64 6f  or pages that do
7a30: 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 6f 76 65   not contain ove
7a40: 72 66 6c 6f 77 20 63 65 6c 6c 73 2e 0a 2a 2f 0a  rflow cells..*/.
7a50: 23 64 65 66 69 6e 65 20 66 69 6e 64 43 65 6c 6c  #define findCell
7a60: 28 50 2c 49 29 20 5c 0a 20 20 28 28 50 29 2d 3e  (P,I) \.  ((P)->
7a70: 61 44 61 74 61 20 2b 20 28 28 50 29 2d 3e 6d 61  aData + ((P)->ma
7a80: 73 6b 50 61 67 65 20 26 20 67 65 74 32 62 79 74  skPage & get2byt
7a90: 65 28 26 28 50 29 2d 3e 61 43 65 6c 6c 49 64 78  e(&(P)->aCellIdx
7aa0: 5b 32 2a 28 49 29 5d 29 29 29 0a 23 64 65 66 69  [2*(I)]))).#defi
7ab0: 6e 65 20 66 69 6e 64 43 65 6c 6c 76 32 28 44 2c  ne findCellv2(D,
7ac0: 4d 2c 4f 2c 49 29 20 28 44 2b 28 4d 26 67 65 74  M,O,I) (D+(M&get
7ad0: 32 62 79 74 65 28 44 2b 28 4f 2b 32 2a 28 49 29  2byte(D+(O+2*(I)
7ae0: 29 29 29 29 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  )))).../*.** Thi
7af0: 73 20 61 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78  s a more complex
7b00: 20 76 65 72 73 69 6f 6e 20 6f 66 20 66 69 6e 64   version of find
7b10: 43 65 6c 6c 28 29 20 74 68 61 74 20 77 6f 72 6b  Cell() that work
7b20: 73 20 66 6f 72 0a 2a 2a 20 70 61 67 65 73 20 74  s for.** pages t
7b30: 68 61 74 20 64 6f 20 63 6f 6e 74 61 69 6e 20 6f  hat do contain o
7b40: 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73 2e 0a 2a  verflow cells..*
7b50: 2f 0a 73 74 61 74 69 63 20 75 38 20 2a 66 69 6e  /.static u8 *fin
7b60: 64 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28 4d 65  dOverflowCell(Me
7b70: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e  mPage *pPage, in
7b80: 74 20 69 43 65 6c 6c 29 7b 0a 20 20 69 6e 74 20  t iCell){.  int 
7b90: 69 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  i;.  assert( sql
7ba0: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
7bb0: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
7bc0: 78 29 20 29 3b 0a 20 20 66 6f 72 28 69 3d 70 50  x) );.  for(i=pP
7bd0: 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2d 31  age->nOverflow-1
7be0: 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20  ; i>=0; i--){.  
7bf0: 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20 6b 20 3d    int k;.    k =
7c00: 20 70 50 61 67 65 2d 3e 61 69 4f 76 66 6c 5b 69   pPage->aiOvfl[i
7c10: 5d 3b 0a 20 20 20 20 69 66 28 20 6b 3c 3d 69 43  ];.    if( k<=iC
7c20: 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ell ){.      if(
7c30: 20 6b 3d 3d 69 43 65 6c 6c 20 29 7b 0a 20 20 20   k==iCell ){.   
7c40: 20 20 20 20 20 72 65 74 75 72 6e 20 70 50 61 67       return pPag
7c50: 65 2d 3e 61 70 4f 76 66 6c 5b 69 5d 3b 0a 20 20  e->apOvfl[i];.  
7c60: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 43 65 6c      }.      iCel
7c70: 6c 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  l--;.    }.  }. 
7c80: 20 72 65 74 75 72 6e 20 66 69 6e 64 43 65 6c 6c   return findCell
7c90: 28 70 50 61 67 65 2c 20 69 43 65 6c 6c 29 3b 0a  (pPage, iCell);.
7ca0: 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 73 65 20 61  }../*.** Parse a
7cb0: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 62 6c   cell content bl
7cc0: 6f 63 6b 20 61 6e 64 20 66 69 6c 6c 20 69 6e 20  ock and fill in 
7cd0: 74 68 65 20 43 65 6c 6c 49 6e 66 6f 20 73 74 72  the CellInfo str
7ce0: 75 63 74 75 72 65 2e 20 20 54 68 65 72 65 0a 2a  ucture.  There.*
7cf0: 2a 20 61 72 65 20 74 77 6f 20 76 65 72 73 69 6f  * are two versio
7d00: 6e 73 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74  ns of this funct
7d10: 69 6f 6e 2e 20 20 62 74 72 65 65 50 61 72 73 65  ion.  btreeParse
7d20: 43 65 6c 6c 28 29 20 74 61 6b 65 73 20 61 20 0a  Cell() takes a .
7d30: 2a 2a 20 63 65 6c 6c 20 69 6e 64 65 78 20 61 73  ** cell index as
7d40: 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
7d50: 6d 65 6e 74 20 61 6e 64 20 62 74 72 65 65 50 61  ment and btreePa
7d60: 72 73 65 43 65 6c 6c 50 74 72 28 29 20 0a 2a 2a  rseCellPtr() .**
7d70: 20 74 61 6b 65 73 20 61 20 70 6f 69 6e 74 65 72   takes a pointer
7d80: 20 74 6f 20 74 68 65 20 62 6f 64 79 20 6f 66 20   to the body of 
7d90: 74 68 65 20 63 65 6c 6c 20 61 73 20 69 74 73 20  the cell as its 
7da0: 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e  second argument.
7db0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
7dc0: 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  btreeParseCellPt
7dd0: 72 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  r(.  MemPage *pP
7de0: 61 67 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  age,         /* 
7df0: 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  Page containing 
7e00: 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 38  the cell */.  u8
7e10: 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20   *pCell,        
7e20: 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
7e30: 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 74 65 78   to the cell tex
7e40: 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f  t. */.  CellInfo
7e50: 20 2a 70 49 6e 66 6f 20 20 20 20 20 20 20 20 20   *pInfo         
7e60: 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69 73 20  /* Fill in this 
7e70: 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a  structure */.){.
7e80: 20 20 75 38 20 2a 70 49 74 65 72 3b 20 20 20 20    u8 *pIter;    
7e90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72            /* For
7ea0: 20 73 63 61 6e 6e 69 6e 67 20 74 68 72 6f 75 67   scanning throug
7eb0: 68 20 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 33 32  h pCell */.  u32
7ec0: 20 6e 50 61 79 6c 6f 61 64 3b 20 20 20 20 20 20   nPayload;      
7ed0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
7ee0: 66 20 62 79 74 65 73 20 6f 66 20 63 65 6c 6c 20  f bytes of cell 
7ef0: 70 61 79 6c 6f 61 64 20 2a 2f 0a 0a 20 20 61 73  payload */..  as
7f00: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
7f10: 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
7f20: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
7f30: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
7f40: 6c 65 61 66 3d 3d 30 20 7c 7c 20 70 50 61 67 65  leaf==0 || pPage
7f50: 2d 3e 6c 65 61 66 3d 3d 31 20 29 3b 0a 20 20 69  ->leaf==1 );.  i
7f60: 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  f( pPage->intKey
7f70: 4c 65 61 66 20 29 7b 0a 20 20 20 20 61 73 73 65  Leaf ){.    asse
7f80: 72 74 28 20 70 50 61 67 65 2d 3e 63 68 69 6c 64  rt( pPage->child
7f90: 50 74 72 53 69 7a 65 3d 3d 30 20 29 3b 0a 20 20  PtrSize==0 );.  
7fa0: 20 20 70 49 74 65 72 20 3d 20 70 43 65 6c 6c 20    pIter = pCell 
7fb0: 2b 20 67 65 74 56 61 72 69 6e 74 33 32 28 70 43  + getVarint32(pC
7fc0: 65 6c 6c 2c 20 6e 50 61 79 6c 6f 61 64 29 3b 0a  ell, nPayload);.
7fd0: 20 20 20 20 70 49 74 65 72 20 2b 3d 20 67 65 74      pIter += get
7fe0: 56 61 72 69 6e 74 28 70 49 74 65 72 2c 20 28 75  Varint(pIter, (u
7ff0: 36 34 2a 29 26 70 49 6e 66 6f 2d 3e 6e 4b 65 79  64*)&pInfo->nKey
8000: 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  );.  }else if( p
8010: 50 61 67 65 2d 3e 6e 6f 50 61 79 6c 6f 61 64 20  Page->noPayload 
8020: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
8030: 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69  Page->childPtrSi
8040: 7a 65 3d 3d 34 20 29 3b 0a 20 20 20 20 70 49 6e  ze==4 );.    pIn
8050: 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 34 20 2b 20  fo->nSize = 4 + 
8060: 67 65 74 56 61 72 69 6e 74 28 26 70 43 65 6c 6c  getVarint(&pCell
8070: 5b 34 5d 2c 20 28 75 36 34 2a 29 26 70 49 6e 66  [4], (u64*)&pInf
8080: 6f 2d 3e 6e 4b 65 79 29 3b 0a 20 20 20 20 70 49  o->nKey);.    pI
8090: 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20 3d 20  nfo->nPayload = 
80a0: 30 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c  0;.    pInfo->nL
80b0: 6f 63 61 6c 20 3d 20 30 3b 0a 20 20 20 20 70 49  ocal = 0;.    pI
80c0: 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77 20 3d  nfo->iOverflow =
80d0: 20 30 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 70   0;.    pInfo->p
80e0: 50 61 79 6c 6f 61 64 20 3d 20 30 3b 0a 20 20 20  Payload = 0;.   
80f0: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 65 6c 73 65   return;.  }else
8100: 7b 0a 20 20 20 20 70 49 74 65 72 20 3d 20 70 43  {.    pIter = pC
8110: 65 6c 6c 20 2b 20 70 50 61 67 65 2d 3e 63 68 69  ell + pPage->chi
8120: 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20 20 20 70  ldPtrSize;.    p
8130: 49 74 65 72 20 2b 3d 20 67 65 74 56 61 72 69 6e  Iter += getVarin
8140: 74 33 32 28 70 49 74 65 72 2c 20 6e 50 61 79 6c  t32(pIter, nPayl
8150: 6f 61 64 29 3b 0a 20 20 20 20 70 49 6e 66 6f 2d  oad);.    pInfo-
8160: 3e 6e 4b 65 79 20 3d 20 6e 50 61 79 6c 6f 61 64  >nKey = nPayload
8170: 3b 0a 20 20 7d 0a 20 20 70 49 6e 66 6f 2d 3e 6e  ;.  }.  pInfo->n
8180: 50 61 79 6c 6f 61 64 20 3d 20 6e 50 61 79 6c 6f  Payload = nPaylo
8190: 61 64 3b 0a 20 20 70 49 6e 66 6f 2d 3e 70 50 61  ad;.  pInfo->pPa
81a0: 79 6c 6f 61 64 20 3d 20 70 49 74 65 72 3b 0a 20  yload = pIter;. 
81b0: 20 74 65 73 74 63 61 73 65 28 20 6e 50 61 79 6c   testcase( nPayl
81c0: 6f 61 64 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c  oad==pPage->maxL
81d0: 6f 63 61 6c 20 29 3b 0a 20 20 74 65 73 74 63 61  ocal );.  testca
81e0: 73 65 28 20 6e 50 61 79 6c 6f 61 64 3d 3d 70 50  se( nPayload==pP
81f0: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20  age->maxLocal+1 
8200: 29 3b 0a 20 20 69 66 28 20 6e 50 61 79 6c 6f 61  );.  if( nPayloa
8210: 64 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  d<=pPage->maxLoc
8220: 61 6c 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69  al ){.    /* Thi
8230: 73 20 69 73 20 74 68 65 20 28 65 61 73 79 29 20  s is the (easy) 
8240: 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 72  common case wher
8250: 65 20 74 68 65 20 65 6e 74 69 72 65 20 70 61 79  e the entire pay
8260: 6c 6f 61 64 20 66 69 74 73 0a 20 20 20 20 2a 2a  load fits.    **
8270: 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70 61   on the local pa
8280: 67 65 2e 20 20 4e 6f 20 6f 76 65 72 66 6c 6f 77  ge.  No overflow
8290: 20 69 73 20 72 65 71 75 69 72 65 64 2e 0a 20 20   is required..  
82a0: 20 20 2a 2f 0a 20 20 20 20 70 49 6e 66 6f 2d 3e    */.    pInfo->
82b0: 6e 53 69 7a 65 20 3d 20 6e 50 61 79 6c 6f 61 64  nSize = nPayload
82c0: 20 2b 20 28 75 31 36 29 28 70 49 74 65 72 20 2d   + (u16)(pIter -
82d0: 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20 69 66 28   pCell);.    if(
82e0: 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 3c 34 20   pInfo->nSize<4 
82f0: 29 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d  ) pInfo->nSize =
8300: 20 34 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e   4;.    pInfo->n
8310: 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 6e 50 61  Local = (u16)nPa
8320: 79 6c 6f 61 64 3b 0a 20 20 20 20 70 49 6e 66 6f  yload;.    pInfo
8330: 2d 3e 69 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b  ->iOverflow = 0;
8340: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
8350: 20 49 66 20 74 68 65 20 70 61 79 6c 6f 61 64 20   If the payload 
8360: 77 69 6c 6c 20 6e 6f 74 20 66 69 74 20 63 6f 6d  will not fit com
8370: 70 6c 65 74 65 6c 79 20 6f 6e 20 74 68 65 20 6c  pletely on the l
8380: 6f 63 61 6c 20 70 61 67 65 2c 20 77 65 20 68 61  ocal page, we ha
8390: 76 65 0a 20 20 20 20 2a 2a 20 74 6f 20 64 65 63  ve.    ** to dec
83a0: 69 64 65 20 68 6f 77 20 6d 75 63 68 20 74 6f 20  ide how much to 
83b0: 73 74 6f 72 65 20 6c 6f 63 61 6c 6c 79 20 61 6e  store locally an
83c0: 64 20 68 6f 77 20 6d 75 63 68 20 74 6f 20 73 70  d how much to sp
83d0: 69 6c 6c 20 6f 6e 74 6f 0a 20 20 20 20 2a 2a 20  ill onto.    ** 
83e0: 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20  overflow pages. 
83f0: 20 54 68 65 20 73 74 72 61 74 65 67 79 20 69 73   The strategy is
8400: 20 74 6f 20 6d 69 6e 69 6d 69 7a 65 20 74 68 65   to minimize the
8410: 20 61 6d 6f 75 6e 74 20 6f 66 20 75 6e 75 73 65   amount of unuse
8420: 64 0a 20 20 20 20 2a 2a 20 73 70 61 63 65 20 6f  d.    ** space o
8430: 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  n overflow pages
8440: 20 77 68 69 6c 65 20 6b 65 65 70 69 6e 67 20 74   while keeping t
8450: 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 6c 6f 63  he amount of loc
8460: 61 6c 20 73 74 6f 72 61 67 65 0a 20 20 20 20 2a  al storage.    *
8470: 2a 20 69 6e 20 62 65 74 77 65 65 6e 20 6d 69 6e  * in between min
8480: 4c 6f 63 61 6c 20 61 6e 64 20 6d 61 78 4c 6f 63  Local and maxLoc
8490: 61 6c 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  al..    **.    *
84a0: 2a 20 57 61 72 6e 69 6e 67 3a 20 20 63 68 61 6e  * Warning:  chan
84b0: 67 69 6e 67 20 74 68 65 20 77 61 79 20 6f 76 65  ging the way ove
84c0: 72 66 6c 6f 77 20 70 61 79 6c 6f 61 64 20 69 73  rflow payload is
84d0: 20 64 69 73 74 72 69 62 75 74 65 64 20 69 6e 20   distributed in 
84e0: 61 6e 79 0a 20 20 20 20 2a 2a 20 77 61 79 20 77  any.    ** way w
84f0: 69 6c 6c 20 72 65 73 75 6c 74 20 69 6e 20 61 6e  ill result in an
8500: 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65 20 66 69   incompatible fi
8510: 6c 65 20 66 6f 72 6d 61 74 2e 0a 20 20 20 20 2a  le format..    *
8520: 2f 0a 20 20 20 20 69 6e 74 20 6d 69 6e 4c 6f 63  /.    int minLoc
8530: 61 6c 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20  al;  /* Minimum 
8540: 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61  amount of payloa
8550: 64 20 68 65 6c 64 20 6c 6f 63 61 6c 6c 79 20 2a  d held locally *
8560: 2f 0a 20 20 20 20 69 6e 74 20 6d 61 78 4c 6f 63  /.    int maxLoc
8570: 61 6c 3b 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20  al;  /* Maximum 
8580: 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61  amount of payloa
8590: 64 20 68 65 6c 64 20 6c 6f 63 61 6c 6c 79 20 2a  d held locally *
85a0: 2f 0a 20 20 20 20 69 6e 74 20 73 75 72 70 6c 75  /.    int surplu
85b0: 73 3b 20 20 20 2f 2a 20 4f 76 65 72 66 6c 6f 77  s;   /* Overflow
85c0: 20 70 61 79 6c 6f 61 64 20 61 76 61 69 6c 61 62   payload availab
85d0: 6c 65 20 66 6f 72 20 6c 6f 63 61 6c 20 73 74 6f  le for local sto
85e0: 72 61 67 65 20 2a 2f 0a 0a 20 20 20 20 6d 69 6e  rage */..    min
85f0: 4c 6f 63 61 6c 20 3d 20 70 50 61 67 65 2d 3e 6d  Local = pPage->m
8600: 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 6d 61 78  inLocal;.    max
8610: 4c 6f 63 61 6c 20 3d 20 70 50 61 67 65 2d 3e 6d  Local = pPage->m
8620: 61 78 4c 6f 63 61 6c 3b 0a 20 20 20 20 73 75 72  axLocal;.    sur
8630: 70 6c 75 73 20 3d 20 6d 69 6e 4c 6f 63 61 6c 20  plus = minLocal 
8640: 2b 20 28 6e 50 61 79 6c 6f 61 64 20 2d 20 6d 69  + (nPayload - mi
8650: 6e 4c 6f 63 61 6c 29 25 28 70 50 61 67 65 2d 3e  nLocal)%(pPage->
8660: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
8670: 2d 20 34 29 3b 0a 20 20 20 20 74 65 73 74 63 61  - 4);.    testca
8680: 73 65 28 20 73 75 72 70 6c 75 73 3d 3d 6d 61 78  se( surplus==max
8690: 4c 6f 63 61 6c 20 29 3b 0a 20 20 20 20 74 65 73  Local );.    tes
86a0: 74 63 61 73 65 28 20 73 75 72 70 6c 75 73 3d 3d  tcase( surplus==
86b0: 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20  maxLocal+1 );.  
86c0: 20 20 69 66 28 20 73 75 72 70 6c 75 73 20 3c 3d    if( surplus <=
86d0: 20 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20   maxLocal ){.   
86e0: 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c     pInfo->nLocal
86f0: 20 3d 20 28 75 31 36 29 73 75 72 70 6c 75 73 3b   = (u16)surplus;
8700: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
8710: 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20    pInfo->nLocal 
8720: 3d 20 28 75 31 36 29 6d 69 6e 4c 6f 63 61 6c 3b  = (u16)minLocal;
8730: 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 6e 66 6f  .    }.    pInfo
8740: 2d 3e 69 4f 76 65 72 66 6c 6f 77 20 3d 20 28 75  ->iOverflow = (u
8750: 31 36 29 28 26 70 49 6e 66 6f 2d 3e 70 50 61 79  16)(&pInfo->pPay
8760: 6c 6f 61 64 5b 70 49 6e 66 6f 2d 3e 6e 4c 6f 63  load[pInfo->nLoc
8770: 61 6c 5d 20 2d 20 70 43 65 6c 6c 29 3b 0a 20 20  al] - pCell);.  
8780: 20 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d    pInfo->nSize =
8790: 20 70 49 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f   pInfo->iOverflo
87a0: 77 20 2b 20 34 3b 0a 20 20 7d 0a 7d 0a 73 74 61  w + 4;.  }.}.sta
87b0: 74 69 63 20 76 6f 69 64 20 62 74 72 65 65 50 61  tic void btreePa
87c0: 72 73 65 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61  rseCell(.  MemPa
87d0: 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20  ge *pPage,      
87e0: 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61     /* Page conta
87f0: 69 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a  ining the cell *
8800: 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c 2c 20 20  /.  int iCell,  
8810: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
8820: 68 65 20 63 65 6c 6c 20 69 6e 64 65 78 2e 20 20  he cell index.  
8830: 46 69 72 73 74 20 63 65 6c 6c 20 69 73 20 30 20  First cell is 0 
8840: 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70  */.  CellInfo *p
8850: 49 6e 66 6f 20 20 20 20 20 20 20 20 20 2f 2a 20  Info         /* 
8860: 46 69 6c 6c 20 69 6e 20 74 68 69 73 20 73 74 72  Fill in this str
8870: 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 62  ucture */.){.  b
8880: 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
8890: 28 70 50 61 67 65 2c 20 66 69 6e 64 43 65 6c 6c  (pPage, findCell
88a0: 28 70 50 61 67 65 2c 20 69 43 65 6c 6c 29 2c 20  (pPage, iCell), 
88b0: 70 49 6e 66 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pInfo);.}../*.**
88c0: 20 43 6f 6d 70 75 74 65 20 74 68 65 20 74 6f 74   Compute the tot
88d0: 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  al number of byt
88e0: 65 73 20 74 68 61 74 20 61 20 43 65 6c 6c 20 6e  es that a Cell n
88f0: 65 65 64 73 20 69 6e 20 74 68 65 20 63 65 6c 6c  eeds in the cell
8900: 0a 2a 2a 20 64 61 74 61 20 61 72 65 61 20 6f 66  .** data area of
8910: 20 74 68 65 20 62 74 72 65 65 2d 70 61 67 65 2e   the btree-page.
8920: 20 20 54 68 65 20 72 65 74 75 72 6e 20 6e 75 6d    The return num
8930: 62 65 72 20 69 6e 63 6c 75 64 65 73 20 74 68 65  ber includes the
8940: 20 63 65 6c 6c 0a 2a 2a 20 64 61 74 61 20 68 65   cell.** data he
8950: 61 64 65 72 20 61 6e 64 20 74 68 65 20 6c 6f 63  ader and the loc
8960: 61 6c 20 70 61 79 6c 6f 61 64 2c 20 62 75 74 20  al payload, but 
8970: 6e 6f 74 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77  not any overflow
8980: 20 70 61 67 65 20 6f 72 0a 2a 2a 20 74 68 65 20   page or.** the 
8990: 73 70 61 63 65 20 75 73 65 64 20 62 79 20 74 68  space used by th
89a0: 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 2e 0a  e cell pointer..
89b0: 2a 2f 0a 73 74 61 74 69 63 20 75 31 36 20 63 65  */.static u16 ce
89c0: 6c 6c 53 69 7a 65 50 74 72 28 4d 65 6d 50 61 67  llSizePtr(MemPag
89d0: 65 20 2a 70 50 61 67 65 2c 20 75 38 20 2a 70 43  e *pPage, u8 *pC
89e0: 65 6c 6c 29 7b 0a 20 20 75 38 20 2a 70 49 74 65  ell){.  u8 *pIte
89f0: 72 20 3d 20 70 43 65 6c 6c 20 2b 20 70 50 61 67  r = pCell + pPag
8a00: 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b  e->childPtrSize;
8a10: 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20   /* For looping 
8a20: 6f 76 65 72 20 62 79 74 65 73 20 6f 66 20 70 43  over bytes of pC
8a30: 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 45 6e  ell */.  u8 *pEn
8a40: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
8a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8a60: 20 20 2f 2a 20 45 6e 64 20 6d 61 72 6b 20 66 6f    /* End mark fo
8a70: 72 20 61 20 76 61 72 69 6e 74 20 2a 2f 0a 20 20  r a varint */.  
8a80: 75 33 32 20 6e 53 69 7a 65 3b 20 20 20 20 20 20  u32 nSize;      
8a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8aa0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
8ab0: 20 76 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e   value to return
8ac0: 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   */..#ifdef SQLI
8ad0: 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 54 68  TE_DEBUG.  /* Th
8ae0: 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64  e value returned
8af0: 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
8b00: 6e 20 73 68 6f 75 6c 64 20 61 6c 77 61 79 73 20  n should always 
8b10: 62 65 20 74 68 65 20 73 61 6d 65 20 61 73 0a 20  be the same as. 
8b20: 20 2a 2a 20 74 68 65 20 28 43 65 6c 6c 49 6e 66   ** the (CellInf
8b30: 6f 2e 6e 53 69 7a 65 29 20 76 61 6c 75 65 20 66  o.nSize) value f
8b40: 6f 75 6e 64 20 62 79 20 64 6f 69 6e 67 20 61 20  ound by doing a 
8b50: 66 75 6c 6c 20 70 61 72 73 65 20 6f 66 20 74 68  full parse of th
8b60: 65 0a 20 20 2a 2a 20 63 65 6c 6c 2e 20 49 66 20  e.  ** cell. If 
8b70: 53 51 4c 49 54 45 5f 44 45 42 55 47 20 69 73 20  SQLITE_DEBUG is 
8b80: 64 65 66 69 6e 65 64 2c 20 61 6e 20 61 73 73 65  defined, an asse
8b90: 72 74 28 29 20 61 74 20 74 68 65 20 62 6f 74 74  rt() at the bott
8ba0: 6f 6d 20 6f 66 0a 20 20 2a 2a 20 74 68 69 73 20  om of.  ** this 
8bb0: 66 75 6e 63 74 69 6f 6e 20 76 65 72 69 66 69 65  function verifie
8bc0: 73 20 74 68 61 74 20 74 68 69 73 20 69 6e 76 61  s that this inva
8bd0: 72 69 61 6e 74 20 69 73 20 6e 6f 74 20 76 69 6f  riant is not vio
8be0: 6c 61 74 65 64 2e 20 2a 2f 0a 20 20 43 65 6c 6c  lated. */.  Cell
8bf0: 49 6e 66 6f 20 64 65 62 75 67 69 6e 66 6f 3b 0a  Info debuginfo;.
8c00: 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c    btreeParseCell
8c10: 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  Ptr(pPage, pCell
8c20: 2c 20 26 64 65 62 75 67 69 6e 66 6f 29 3b 0a 23  , &debuginfo);.#
8c30: 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 70 50 61  endif..  if( pPa
8c40: 67 65 2d 3e 6e 6f 50 61 79 6c 6f 61 64 20 29 7b  ge->noPayload ){
8c50: 0a 20 20 20 20 70 45 6e 64 20 3d 20 26 70 49 74  .    pEnd = &pIt
8c60: 65 72 5b 39 5d 3b 0a 20 20 20 20 77 68 69 6c 65  er[9];.    while
8c70: 28 20 28 2a 70 49 74 65 72 2b 2b 29 26 30 78 38  ( (*pIter++)&0x8
8c80: 30 20 26 26 20 70 49 74 65 72 3c 70 45 6e 64 20  0 && pIter<pEnd 
8c90: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
8ca0: 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69  Page->childPtrSi
8cb0: 7a 65 3d 3d 34 20 29 3b 0a 20 20 20 20 72 65 74  ze==4 );.    ret
8cc0: 75 72 6e 20 28 75 31 36 29 28 70 49 74 65 72 20  urn (u16)(pIter 
8cd0: 2d 20 70 43 65 6c 6c 29 3b 0a 20 20 7d 0a 20 20  - pCell);.  }.  
8ce0: 6e 53 69 7a 65 20 3d 20 2a 70 49 74 65 72 3b 0a  nSize = *pIter;.
8cf0: 20 20 69 66 28 20 6e 53 69 7a 65 3e 3d 30 78 38    if( nSize>=0x8
8d00: 30 20 29 7b 0a 20 20 20 20 70 45 6e 64 20 3d 20  0 ){.    pEnd = 
8d10: 26 70 49 74 65 72 5b 39 5d 3b 0a 20 20 20 20 6e  &pIter[9];.    n
8d20: 53 69 7a 65 20 26 3d 20 30 78 37 66 3b 0a 20 20  Size &= 0x7f;.  
8d30: 20 20 64 6f 7b 0a 20 20 20 20 20 20 6e 53 69 7a    do{.      nSiz
8d40: 65 20 3d 20 28 6e 53 69 7a 65 3c 3c 37 29 20 7c  e = (nSize<<7) |
8d50: 20 28 2a 2b 2b 70 49 74 65 72 20 26 20 30 78 37   (*++pIter & 0x7
8d60: 66 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20  f);.    }while( 
8d70: 2a 28 70 49 74 65 72 29 3e 3d 30 78 38 30 20 26  *(pIter)>=0x80 &
8d80: 26 20 70 49 74 65 72 3c 70 45 6e 64 20 29 3b 0a  & pIter<pEnd );.
8d90: 20 20 7d 0a 20 20 70 49 74 65 72 2b 2b 3b 0a 20    }.  pIter++;. 
8da0: 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b   if( pPage->intK
8db0: 65 79 20 29 7b 0a 20 20 20 20 2f 2a 20 70 49 74  ey ){.    /* pIt
8dc0: 65 72 20 6e 6f 77 20 70 6f 69 6e 74 73 20 61 74  er now points at
8dd0: 20 74 68 65 20 36 34 2d 62 69 74 20 69 6e 74 65   the 64-bit inte
8de0: 67 65 72 20 6b 65 79 20 76 61 6c 75 65 2c 20 61  ger key value, a
8df0: 20 76 61 72 69 61 62 6c 65 20 6c 65 6e 67 74 68   variable length
8e00: 20 0a 20 20 20 20 2a 2a 20 69 6e 74 65 67 65 72   .    ** integer
8e10: 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  . The following 
8e20: 62 6c 6f 63 6b 20 6d 6f 76 65 73 20 70 49 74 65  block moves pIte
8e30: 72 20 74 6f 20 70 6f 69 6e 74 20 61 74 20 74 68  r to point at th
8e40: 65 20 66 69 72 73 74 20 62 79 74 65 0a 20 20 20  e first byte.   
8e50: 20 2a 2a 20 70 61 73 74 20 74 68 65 20 65 6e 64   ** past the end
8e60: 20 6f 66 20 74 68 65 20 6b 65 79 20 76 61 6c 75   of the key valu
8e70: 65 2e 20 2a 2f 0a 20 20 20 20 70 45 6e 64 20 3d  e. */.    pEnd =
8e80: 20 26 70 49 74 65 72 5b 39 5d 3b 0a 20 20 20 20   &pIter[9];.    
8e90: 77 68 69 6c 65 28 20 28 2a 70 49 74 65 72 2b 2b  while( (*pIter++
8ea0: 29 26 30 78 38 30 20 26 26 20 70 49 74 65 72 3c  )&0x80 && pIter<
8eb0: 70 45 6e 64 20 29 3b 0a 20 20 7d 0a 20 20 74 65  pEnd );.  }.  te
8ec0: 73 74 63 61 73 65 28 20 6e 53 69 7a 65 3d 3d 70  stcase( nSize==p
8ed0: 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29  Page->maxLocal )
8ee0: 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 53  ;.  testcase( nS
8ef0: 69 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c  ize==pPage->maxL
8f00: 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 69 66 28 20  ocal+1 );.  if( 
8f10: 6e 53 69 7a 65 3c 3d 70 50 61 67 65 2d 3e 6d 61  nSize<=pPage->ma
8f20: 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 6e 53  xLocal ){.    nS
8f30: 69 7a 65 20 2b 3d 20 28 75 33 32 29 28 70 49 74  ize += (u32)(pIt
8f40: 65 72 20 2d 20 70 43 65 6c 6c 29 3b 0a 20 20 20  er - pCell);.   
8f50: 20 69 66 28 20 6e 53 69 7a 65 3c 34 20 29 20 6e   if( nSize<4 ) n
8f60: 53 69 7a 65 20 3d 20 34 3b 0a 20 20 7d 65 6c 73  Size = 4;.  }els
8f70: 65 7b 0a 20 20 20 20 69 6e 74 20 6d 69 6e 4c 6f  e{.    int minLo
8f80: 63 61 6c 20 3d 20 70 50 61 67 65 2d 3e 6d 69 6e  cal = pPage->min
8f90: 4c 6f 63 61 6c 3b 0a 20 20 20 20 6e 53 69 7a 65  Local;.    nSize
8fa0: 20 3d 20 6d 69 6e 4c 6f 63 61 6c 20 2b 20 28 6e   = minLocal + (n
8fb0: 53 69 7a 65 20 2d 20 6d 69 6e 4c 6f 63 61 6c 29  Size - minLocal)
8fc0: 20 25 20 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e   % (pPage->pBt->
8fd0: 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 29 3b  usableSize - 4);
8fe0: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e  .    testcase( n
8ff0: 53 69 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78  Size==pPage->max
9000: 4c 6f 63 61 6c 20 29 3b 0a 20 20 20 20 74 65 73  Local );.    tes
9010: 74 63 61 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50  tcase( nSize==pP
9020: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20  age->maxLocal+1 
9030: 29 3b 0a 20 20 20 20 69 66 28 20 6e 53 69 7a 65  );.    if( nSize
9040: 3e 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c  >pPage->maxLocal
9050: 20 29 7b 0a 20 20 20 20 20 20 6e 53 69 7a 65 20   ){.      nSize 
9060: 3d 20 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20  = minLocal;.    
9070: 7d 0a 20 20 20 20 6e 53 69 7a 65 20 2b 3d 20 34  }.    nSize += 4
9080: 20 2b 20 28 75 31 36 29 28 70 49 74 65 72 20 2d   + (u16)(pIter -
9090: 20 70 43 65 6c 6c 29 3b 0a 20 20 7d 0a 20 20 61   pCell);.  }.  a
90a0: 73 73 65 72 74 28 20 6e 53 69 7a 65 3d 3d 64 65  ssert( nSize==de
90b0: 62 75 67 69 6e 66 6f 2e 6e 53 69 7a 65 20 7c 7c  buginfo.nSize ||
90c0: 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20   CORRUPT_DB );. 
90d0: 20 72 65 74 75 72 6e 20 28 75 31 36 29 6e 53 69   return (u16)nSi
90e0: 7a 65 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51  ze;.}..#ifdef SQ
90f0: 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 20 54 68  LITE_DEBUG./* Th
9100: 69 73 20 76 61 72 69 61 74 69 6f 6e 20 6f 6e 20  is variation on 
9110: 63 65 6c 6c 53 69 7a 65 50 74 72 28 29 20 69 73  cellSizePtr() is
9120: 20 75 73 65 64 20 69 6e 73 69 64 65 20 6f 66 20   used inside of 
9130: 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65  assert() stateme
9140: 6e 74 73 0a 2a 2a 20 6f 6e 6c 79 2e 20 2a 2f 0a  nts.** only. */.
9150: 73 74 61 74 69 63 20 75 31 36 20 63 65 6c 6c 53  static u16 cellS
9160: 69 7a 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  ize(MemPage *pPa
9170: 67 65 2c 20 69 6e 74 20 69 43 65 6c 6c 29 7b 0a  ge, int iCell){.
9180: 20 20 72 65 74 75 72 6e 20 63 65 6c 6c 53 69 7a    return cellSiz
9190: 65 50 74 72 28 70 50 61 67 65 2c 20 66 69 6e 64  ePtr(pPage, find
91a0: 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65 6c  Cell(pPage, iCel
91b0: 6c 29 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23  l));.}.#endif..#
91c0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
91d0: 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a  IT_AUTOVACUUM./*
91e0: 0a 2a 2a 20 49 66 20 74 68 65 20 63 65 6c 6c 20  .** If the cell 
91f0: 70 43 65 6c 6c 2c 20 70 61 72 74 20 6f 66 20 70  pCell, part of p
9200: 61 67 65 20 70 50 61 67 65 20 63 6f 6e 74 61 69  age pPage contai
9210: 6e 73 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20  ns a pointer.** 
9220: 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70  to an overflow p
9230: 61 67 65 2c 20 69 6e 73 65 72 74 20 61 6e 20 65  age, insert an e
9240: 6e 74 72 79 20 69 6e 74 6f 20 74 68 65 20 70 6f  ntry into the po
9250: 69 6e 74 65 72 2d 6d 61 70 0a 2a 2a 20 66 6f 72  inter-map.** for
9260: 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61   the overflow pa
9270: 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ge..*/.static vo
9280: 69 64 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c  id ptrmapPutOvfl
9290: 50 74 72 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  Ptr(MemPage *pPa
92a0: 67 65 2c 20 75 38 20 2a 70 43 65 6c 6c 2c 20 69  ge, u8 *pCell, i
92b0: 6e 74 20 2a 70 52 43 29 7b 0a 20 20 43 65 6c 6c  nt *pRC){.  Cell
92c0: 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 69 66 28  Info info;.  if(
92d0: 20 2a 70 52 43 20 29 20 72 65 74 75 72 6e 3b 0a   *pRC ) return;.
92e0: 20 20 61 73 73 65 72 74 28 20 70 43 65 6c 6c 21    assert( pCell!
92f0: 3d 30 20 29 3b 0a 20 20 62 74 72 65 65 50 61 72  =0 );.  btreePar
9300: 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c  seCellPtr(pPage,
9310: 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a   pCell, &info);.
9320: 20 20 69 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72    if( info.iOver
9330: 66 6c 6f 77 20 29 7b 0a 20 20 20 20 50 67 6e 6f  flow ){.    Pgno
9340: 20 6f 76 66 6c 20 3d 20 67 65 74 34 62 79 74 65   ovfl = get4byte
9350: 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76  (&pCell[info.iOv
9360: 65 72 66 6c 6f 77 5d 29 3b 0a 20 20 20 20 70 74  erflow]);.    pt
9370: 72 6d 61 70 50 75 74 28 70 50 61 67 65 2d 3e 70  rmapPut(pPage->p
9380: 42 74 2c 20 6f 76 66 6c 2c 20 50 54 52 4d 41 50  Bt, ovfl, PTRMAP
9390: 5f 4f 56 45 52 46 4c 4f 57 31 2c 20 70 50 61 67  _OVERFLOW1, pPag
93a0: 65 2d 3e 70 67 6e 6f 2c 20 70 52 43 29 3b 0a 20  e->pgno, pRC);. 
93b0: 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a   }.}.#endif.../*
93c0: 0a 2a 2a 20 44 65 66 72 61 67 6d 65 6e 74 20 74  .** Defragment t
93d0: 68 65 20 70 61 67 65 20 67 69 76 65 6e 2e 20 20  he page given.  
93e0: 41 6c 6c 20 43 65 6c 6c 73 20 61 72 65 20 6d 6f  All Cells are mo
93f0: 76 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20 65 6e  ved to the.** en
9400: 64 20 6f 66 20 74 68 65 20 70 61 67 65 20 61 6e  d of the page an
9410: 64 20 61 6c 6c 20 66 72 65 65 20 73 70 61 63 65  d all free space
9420: 20 69 73 20 63 6f 6c 6c 65 63 74 65 64 20 69 6e   is collected in
9430: 74 6f 20 6f 6e 65 0a 2a 2a 20 62 69 67 20 46 72  to one.** big Fr
9440: 65 65 42 6c 6b 20 74 68 61 74 20 6f 63 63 75 72  eeBlk that occur
9450: 73 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68 65  s in between the
9460: 20 68 65 61 64 65 72 20 61 6e 64 20 63 65 6c 6c   header and cell
9470: 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 61 72 72 61  .** pointer arra
9480: 79 20 61 6e 64 20 74 68 65 20 63 65 6c 6c 20 63  y and the cell c
9490: 6f 6e 74 65 6e 74 20 61 72 65 61 2e 0a 2a 2a 0a  ontent area..**.
94a0: 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  ** EVIDENCE-OF: 
94b0: 52 2d 34 34 35 38 32 2d 36 30 31 33 38 20 53 51  R-44582-60138 SQ
94c0: 4c 69 74 65 20 6d 61 79 20 66 72 6f 6d 20 74 69  Lite may from ti
94d0: 6d 65 20 74 6f 20 74 69 6d 65 20 72 65 6f 72 67  me to time reorg
94e0: 61 6e 69 7a 65 20 61 0a 2a 2a 20 62 2d 74 72 65  anize a.** b-tre
94f0: 65 20 70 61 67 65 20 73 6f 20 74 68 61 74 20 74  e page so that t
9500: 68 65 72 65 20 61 72 65 20 6e 6f 20 66 72 65 65  here are no free
9510: 62 6c 6f 63 6b 73 20 6f 72 20 66 72 61 67 6d 65  blocks or fragme
9520: 6e 74 20 62 79 74 65 73 2c 20 61 6c 6c 0a 2a 2a  nt bytes, all.**
9530: 20 75 6e 75 73 65 64 20 62 79 74 65 73 20 61 72   unused bytes ar
9540: 65 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74  e contained in t
9550: 68 65 20 75 6e 61 6c 6c 6f 63 61 74 65 64 20 73  he unallocated s
9560: 70 61 63 65 20 72 65 67 69 6f 6e 2c 20 61 6e 64  pace region, and
9570: 20 61 6c 6c 0a 2a 2a 20 63 65 6c 6c 73 20 61 72   all.** cells ar
9580: 65 20 70 61 63 6b 65 64 20 74 69 67 68 74 6c 79  e packed tightly
9590: 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
95a0: 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74  he page..*/.stat
95b0: 69 63 20 69 6e 74 20 64 65 66 72 61 67 6d 65 6e  ic int defragmen
95c0: 74 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70  tPage(MemPage *p
95d0: 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 69 3b 20  Page){.  int i; 
95e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
95f0: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
9600: 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 70 63 3b  ter */.  int pc;
9610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9620: 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
9630: 66 20 74 68 65 20 69 2d 74 68 20 63 65 6c 6c 20  f the i-th cell 
9640: 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20 20 20  */.  int hdr;   
9650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9660: 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 74 68 65  /* Offset to the
9670: 20 70 61 67 65 20 68 65 61 64 65 72 20 2a 2f 0a   page header */.
9680: 20 20 69 6e 74 20 73 69 7a 65 3b 20 20 20 20 20    int size;     
9690: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
96a0: 53 69 7a 65 20 6f 66 20 61 20 63 65 6c 6c 20 2a  Size of a cell *
96b0: 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c 65 53 69  /.  int usableSi
96c0: 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ze;            /
96d0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 73 61 62  * Number of usab
96e0: 6c 65 20 62 79 74 65 73 20 6f 6e 20 61 20 70 61  le bytes on a pa
96f0: 67 65 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c  ge */.  int cell
9700: 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 20  Offset;         
9710: 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20     /* Offset to 
9720: 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  the cell pointer
9730: 20 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20   array */.  int 
9740: 63 62 72 6b 3b 20 20 20 20 20 20 20 20 20 20 20  cbrk;           
9750: 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
9760: 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e   to the cell con
9770: 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20 69  tent area */.  i
9780: 6e 74 20 6e 43 65 6c 6c 3b 20 20 20 20 20 20 20  nt nCell;       
9790: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
97a0: 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 6f 6e 20  ber of cells on 
97b0: 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 75 6e  the page */.  un
97c0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74  signed char *dat
97d0: 61 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  a;       /* The 
97e0: 70 61 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 75  page data */.  u
97f0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 74 65  nsigned char *te
9800: 6d 70 3b 20 20 20 20 20 20 20 2f 2a 20 54 65 6d  mp;       /* Tem
9810: 70 20 61 72 65 61 20 66 6f 72 20 63 65 6c 6c 20  p area for cell 
9820: 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 75 6e 73  content */.  uns
9830: 69 67 6e 65 64 20 63 68 61 72 20 2a 73 72 63 3b  igned char *src;
9840: 20 20 20 20 20 20 20 20 2f 2a 20 53 6f 75 72 63          /* Sourc
9850: 65 20 6f 66 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a  e of content */.
9860: 20 20 69 6e 74 20 69 43 65 6c 6c 46 69 72 73 74    int iCellFirst
9870: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
9880: 46 69 72 73 74 20 61 6c 6c 6f 77 61 62 6c 65 20  First allowable 
9890: 63 65 6c 6c 20 69 6e 64 65 78 20 2a 2f 0a 20 20  cell index */.  
98a0: 69 6e 74 20 69 43 65 6c 6c 4c 61 73 74 3b 20 20  int iCellLast;  
98b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61             /* La
98c0: 73 74 20 70 6f 73 73 69 62 6c 65 20 63 65 6c 6c  st possible cell
98d0: 20 69 6e 64 65 78 20 2a 2f 0a 0a 0a 20 20 61 73   index */...  as
98e0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
98f0: 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
9900: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
9910: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
9920: 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20 61 73  ->pBt!=0 );.  as
9930: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74  sert( pPage->pBt
9940: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3c 3d 20  ->usableSize <= 
9950: 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f  SQLITE_MAX_PAGE_
9960: 53 49 5a 45 20 29 3b 0a 20 20 61 73 73 65 72 74  SIZE );.  assert
9970: 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  ( pPage->nOverfl
9980: 6f 77 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ow==0 );.  asser
9990: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
99a0: 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
99b0: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 74 65  ->mutex) );.  te
99c0: 6d 70 20 3d 20 30 3b 0a 20 20 73 72 63 20 3d 20  mp = 0;.  src = 
99d0: 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44  data = pPage->aD
99e0: 61 74 61 3b 0a 20 20 68 64 72 20 3d 20 70 50 61  ata;.  hdr = pPa
99f0: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20  ge->hdrOffset;. 
9a00: 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 70 50   cellOffset = pP
9a10: 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 3b  age->cellOffset;
9a20: 0a 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65  .  nCell = pPage
9a30: 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72  ->nCell;.  asser
9a40: 74 28 20 6e 43 65 6c 6c 3d 3d 67 65 74 32 62 79  t( nCell==get2by
9a50: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 29  te(&data[hdr+3])
9a60: 20 29 3b 0a 20 20 75 73 61 62 6c 65 53 69 7a 65   );.  usableSize
9a70: 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75   = pPage->pBt->u
9a80: 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 63 62 72  sableSize;.  cbr
9a90: 6b 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a  k = usableSize;.
9aa0: 20 20 69 43 65 6c 6c 46 69 72 73 74 20 3d 20 63    iCellFirst = c
9ab0: 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 6e 43  ellOffset + 2*nC
9ac0: 65 6c 6c 3b 0a 20 20 69 43 65 6c 6c 4c 61 73 74  ell;.  iCellLast
9ad0: 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 20 2d 20   = usableSize - 
9ae0: 34 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  4;.  for(i=0; i<
9af0: 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  nCell; i++){.   
9b00: 20 75 38 20 2a 70 41 64 64 72 3b 20 20 20 20 20   u8 *pAddr;     
9b10: 2f 2a 20 54 68 65 20 69 2d 74 68 20 63 65 6c 6c  /* The i-th cell
9b20: 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 20 20   pointer */.    
9b30: 70 41 64 64 72 20 3d 20 26 64 61 74 61 5b 63 65  pAddr = &data[ce
9b40: 6c 6c 4f 66 66 73 65 74 20 2b 20 69 2a 32 5d 3b  llOffset + i*2];
9b50: 0a 20 20 20 20 70 63 20 3d 20 67 65 74 32 62 79  .    pc = get2by
9b60: 74 65 28 70 41 64 64 72 29 3b 0a 20 20 20 20 74  te(pAddr);.    t
9b70: 65 73 74 63 61 73 65 28 20 70 63 3d 3d 69 43 65  estcase( pc==iCe
9b80: 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20 20 20 74  llFirst );.    t
9b90: 65 73 74 63 61 73 65 28 20 70 63 3d 3d 69 43 65  estcase( pc==iCe
9ba0: 6c 6c 4c 61 73 74 20 29 3b 0a 23 69 66 20 21 64  llLast );.#if !d
9bb0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
9bc0: 41 42 4c 45 5f 4f 56 45 52 53 49 5a 45 5f 43 45  ABLE_OVERSIZE_CE
9bd0: 4c 4c 5f 43 48 45 43 4b 29 0a 20 20 20 20 2f 2a  LL_CHECK).    /*
9be0: 20 54 68 65 73 65 20 63 6f 6e 64 69 74 69 6f 6e   These condition
9bf0: 73 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62  s have already b
9c00: 65 65 6e 20 76 65 72 69 66 69 65 64 20 69 6e 20  een verified in 
9c10: 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 0a  btreeInitPage().
9c20: 20 20 20 20 2a 2a 20 69 66 20 53 51 4c 49 54 45      ** if SQLITE
9c30: 5f 45 4e 41 42 4c 45 5f 4f 56 45 52 53 49 5a 45  _ENABLE_OVERSIZE
9c40: 5f 43 45 4c 4c 5f 43 48 45 43 4b 20 69 73 20 64  _CELL_CHECK is d
9c50: 65 66 69 6e 65 64 20 0a 20 20 20 20 2a 2f 0a 20  efined .    */. 
9c60: 20 20 20 69 66 28 20 70 63 3c 69 43 65 6c 6c 46     if( pc<iCellF
9c70: 69 72 73 74 20 7c 7c 20 70 63 3e 69 43 65 6c 6c  irst || pc>iCell
9c80: 4c 61 73 74 20 29 7b 0a 20 20 20 20 20 20 72 65  Last ){.      re
9c90: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
9ca0: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
9cb0: 23 65 6e 64 69 66 0a 20 20 20 20 61 73 73 65 72  #endif.    asser
9cc0: 74 28 20 70 63 3e 3d 69 43 65 6c 6c 46 69 72 73  t( pc>=iCellFirs
9cd0: 74 20 26 26 20 70 63 3c 3d 69 43 65 6c 6c 4c 61  t && pc<=iCellLa
9ce0: 73 74 20 29 3b 0a 20 20 20 20 73 69 7a 65 20 3d  st );.    size =
9cf0: 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61   cellSizePtr(pPa
9d00: 67 65 2c 20 26 73 72 63 5b 70 63 5d 29 3b 0a 20  ge, &src[pc]);. 
9d10: 20 20 20 63 62 72 6b 20 2d 3d 20 73 69 7a 65 3b     cbrk -= size;
9d20: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
9d30: 49 54 45 5f 45 4e 41 42 4c 45 5f 4f 56 45 52 53  ITE_ENABLE_OVERS
9d40: 49 5a 45 5f 43 45 4c 4c 5f 43 48 45 43 4b 29 0a  IZE_CELL_CHECK).
9d50: 20 20 20 20 69 66 28 20 63 62 72 6b 3c 69 43 65      if( cbrk<iCe
9d60: 6c 6c 46 69 72 73 74 20 29 7b 0a 20 20 20 20 20  llFirst ){.     
9d70: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
9d80: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
9d90: 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 69 66 28   }.#else.    if(
9da0: 20 63 62 72 6b 3c 69 43 65 6c 6c 46 69 72 73 74   cbrk<iCellFirst
9db0: 20 7c 7c 20 70 63 2b 73 69 7a 65 3e 75 73 61 62   || pc+size>usab
9dc0: 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  leSize ){.      
9dd0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
9de0: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
9df0: 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 61 73 73  }.#endif.    ass
9e00: 65 72 74 28 20 63 62 72 6b 2b 73 69 7a 65 3c 3d  ert( cbrk+size<=
9e10: 75 73 61 62 6c 65 53 69 7a 65 20 26 26 20 63 62  usableSize && cb
9e20: 72 6b 3e 3d 69 43 65 6c 6c 46 69 72 73 74 20 29  rk>=iCellFirst )
9e30: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
9e40: 63 62 72 6b 2b 73 69 7a 65 3d 3d 75 73 61 62 6c  cbrk+size==usabl
9e50: 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 74 65 73  eSize );.    tes
9e60: 74 63 61 73 65 28 20 70 63 2b 73 69 7a 65 3d 3d  tcase( pc+size==
9e70: 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20  usableSize );.  
9e80: 20 20 70 75 74 32 62 79 74 65 28 70 41 64 64 72    put2byte(pAddr
9e90: 2c 20 63 62 72 6b 29 3b 0a 20 20 20 20 69 66 28  , cbrk);.    if(
9ea0: 20 74 65 6d 70 3d 3d 30 20 29 7b 0a 20 20 20 20   temp==0 ){.    
9eb0: 20 20 69 6e 74 20 78 3b 0a 20 20 20 20 20 20 69    int x;.      i
9ec0: 66 28 20 63 62 72 6b 3d 3d 70 63 20 29 20 63 6f  f( cbrk==pc ) co
9ed0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 74 65  ntinue;.      te
9ee0: 6d 70 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  mp = sqlite3Page
9ef0: 72 54 65 6d 70 53 70 61 63 65 28 70 50 61 67 65  rTempSpace(pPage
9f00: 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a  ->pBt->pPager);.
9f10: 20 20 20 20 20 20 78 20 3d 20 67 65 74 32 62 79        x = get2by
9f20: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29  te(&data[hdr+5])
9f30: 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26  ;.      memcpy(&
9f40: 74 65 6d 70 5b 78 5d 2c 20 26 64 61 74 61 5b 78  temp[x], &data[x
9f50: 5d 2c 20 28 63 62 72 6b 2b 73 69 7a 65 29 20 2d  ], (cbrk+size) -
9f60: 20 78 29 3b 0a 20 20 20 20 20 20 73 72 63 20 3d   x);.      src =
9f70: 20 74 65 6d 70 3b 0a 20 20 20 20 7d 0a 20 20 20   temp;.    }.   
9f80: 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b 63 62   memcpy(&data[cb
9f90: 72 6b 5d 2c 20 26 73 72 63 5b 70 63 5d 2c 20 73  rk], &src[pc], s
9fa0: 69 7a 65 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65  ize);.  }.  asse
9fb0: 72 74 28 20 63 62 72 6b 3e 3d 69 43 65 6c 6c 46  rt( cbrk>=iCellF
9fc0: 69 72 73 74 20 29 3b 0a 20 20 70 75 74 32 62 79  irst );.  put2by
9fd0: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c  te(&data[hdr+5],
9fe0: 20 63 62 72 6b 29 3b 0a 20 20 64 61 74 61 5b 68   cbrk);.  data[h
9ff0: 64 72 2b 31 5d 20 3d 20 30 3b 0a 20 20 64 61 74  dr+1] = 0;.  dat
a000: 61 5b 68 64 72 2b 32 5d 20 3d 20 30 3b 0a 20 20  a[hdr+2] = 0;.  
a010: 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b  data[hdr+7] = 0;
a020: 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b  .  memset(&data[
a030: 69 43 65 6c 6c 46 69 72 73 74 5d 2c 20 30 2c 20  iCellFirst], 0, 
a040: 63 62 72 6b 2d 69 43 65 6c 6c 46 69 72 73 74 29  cbrk-iCellFirst)
a050: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
a060: 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
a070: 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
a080: 67 65 29 20 29 3b 0a 20 20 69 66 28 20 63 62 72  ge) );.  if( cbr
a090: 6b 2d 69 43 65 6c 6c 46 69 72 73 74 21 3d 70 50  k-iCellFirst!=pP
a0a0: 61 67 65 2d 3e 6e 46 72 65 65 20 29 7b 0a 20 20  age->nFree ){.  
a0b0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
a0c0: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
a0d0: 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
a0e0: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  E_OK;.}../*.** S
a0f0: 65 61 72 63 68 20 74 68 65 20 66 72 65 65 2d 6c  earch the free-l
a100: 69 73 74 20 6f 6e 20 70 61 67 65 20 70 50 67 20  ist on page pPg 
a110: 66 6f 72 20 73 70 61 63 65 20 74 6f 20 73 74 6f  for space to sto
a120: 72 65 20 61 20 63 65 6c 6c 20 6e 42 79 74 65 20  re a cell nByte 
a130: 62 79 74 65 73 20 69 6e 0a 2a 2a 20 73 69 7a 65  bytes in.** size
a140: 2e 20 49 66 20 6f 6e 65 20 63 61 6e 20 62 65 20  . If one can be 
a150: 66 6f 75 6e 64 2c 20 72 65 74 75 72 6e 20 61 20  found, return a 
a160: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 73  pointer to the s
a170: 70 61 63 65 20 61 6e 64 20 72 65 6d 6f 76 65 20  pace and remove 
a180: 69 74 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 66  it.** from the f
a190: 72 65 65 2d 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20  ree-list..**.** 
a1a0: 49 66 20 6e 6f 20 73 75 69 74 61 62 6c 65 20 73  If no suitable s
a1b0: 70 61 63 65 20 63 61 6e 20 62 65 20 66 6f 75 6e  pace can be foun
a1c0: 64 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69  d on the free-li
a1d0: 73 74 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e  st, return NULL.
a1e0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
a1f0: 74 69 6f 6e 20 6d 61 79 20 64 65 74 65 63 74 20  tion may detect 
a200: 63 6f 72 72 75 70 74 69 6f 6e 20 77 69 74 68 69  corruption withi
a210: 6e 20 70 50 67 2e 20 20 49 66 20 63 6f 72 72 75  n pPg.  If corru
a220: 70 74 69 6f 6e 20 69 73 0a 2a 2a 20 64 65 74 65  ption is.** dete
a230: 63 74 65 64 20 74 68 65 6e 20 2a 70 52 63 20 69  cted then *pRc i
a240: 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f  s set to SQLITE_
a250: 43 4f 52 52 55 50 54 20 61 6e 64 20 4e 55 4c 4c  CORRUPT and NULL
a260: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a   is returned..**
a270: 0a 2a 2a 20 49 66 20 61 20 73 6c 6f 74 20 6f 66  .** If a slot of
a280: 20 61 74 20 6c 65 61 73 74 20 6e 42 79 74 65 20   at least nByte 
a290: 62 79 74 65 73 20 69 73 20 66 6f 75 6e 64 20 62  bytes is found b
a2a0: 75 74 20 63 61 6e 6e 6f 74 20 62 65 20 75 73 65  ut cannot be use
a2b0: 64 20 62 65 63 61 75 73 65 20 0a 2a 2a 20 74 68  d because .** th
a2c0: 65 72 65 20 61 72 65 20 61 6c 72 65 61 64 79 20  ere are already 
a2d0: 61 74 20 6c 65 61 73 74 20 36 30 20 66 72 61 67  at least 60 frag
a2e0: 6d 65 6e 74 65 64 20 62 79 74 65 73 20 6f 6e 20  mented bytes on 
a2f0: 74 68 65 20 70 61 67 65 2c 20 72 65 74 75 72 6e  the page, return
a300: 20 4e 55 4c 4c 2e 0a 2a 2a 20 49 6e 20 74 68 69   NULL..** In thi
a310: 73 20 63 61 73 65 2c 20 69 66 20 70 62 44 65 66  s case, if pbDef
a320: 72 61 67 20 70 61 72 61 6d 65 74 65 72 20 69 73  rag parameter is
a330: 20 6e 6f 74 20 4e 55 4c 4c 2c 20 73 65 74 20 2a   not NULL, set *
a340: 70 62 44 65 66 72 61 67 20 74 6f 20 74 72 75 65  pbDefrag to true
a350: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 38 20 2a  ..*/.static u8 *
a360: 70 61 67 65 46 69 6e 64 53 6c 6f 74 28 4d 65 6d  pageFindSlot(Mem
a370: 50 61 67 65 20 2a 70 50 67 2c 20 69 6e 74 20 6e  Page *pPg, int n
a380: 42 79 74 65 2c 20 69 6e 74 20 2a 70 52 63 2c 20  Byte, int *pRc, 
a390: 69 6e 74 20 2a 70 62 44 65 66 72 61 67 29 7b 0a  int *pbDefrag){.
a3a0: 20 20 63 6f 6e 73 74 20 69 6e 74 20 68 64 72 20    const int hdr 
a3b0: 3d 20 70 50 67 2d 3e 68 64 72 4f 66 66 73 65 74  = pPg->hdrOffset
a3c0: 3b 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 61  ;.  u8 * const a
a3d0: 44 61 74 61 20 3d 20 70 50 67 2d 3e 61 44 61 74  Data = pPg->aDat
a3e0: 61 3b 0a 20 20 69 6e 74 20 69 41 64 64 72 3b 0a  a;.  int iAddr;.
a3f0: 20 20 69 6e 74 20 70 63 3b 0a 20 20 69 6e 74 20    int pc;.  int 
a400: 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 50 67  usableSize = pPg
a410: 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
a420: 65 3b 0a 0a 20 20 66 6f 72 28 69 41 64 64 72 3d  e;..  for(iAddr=
a430: 68 64 72 2b 31 3b 20 28 70 63 20 3d 20 67 65 74  hdr+1; (pc = get
a440: 32 62 79 74 65 28 26 61 44 61 74 61 5b 69 41 64  2byte(&aData[iAd
a450: 64 72 5d 29 29 3e 30 3b 20 69 41 64 64 72 3d 70  dr]))>0; iAddr=p
a460: 63 29 7b 0a 20 20 20 20 69 6e 74 20 73 69 7a 65  c){.    int size
a470: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
a480: 53 69 7a 65 20 6f 66 20 74 68 65 20 66 72 65 65  Size of the free
a490: 20 73 6c 6f 74 20 2a 2f 0a 20 20 20 20 2f 2a 20   slot */.    /* 
a4a0: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30  EVIDENCE-OF: R-0
a4b0: 36 38 36 36 2d 33 39 31 32 35 20 46 72 65 65 62  6866-39125 Freeb
a4c0: 6c 6f 63 6b 73 20 61 72 65 20 61 6c 77 61 79 73  locks are always
a4d0: 20 63 6f 6e 6e 65 63 74 65 64 20 69 6e 20 6f 72   connected in or
a4e0: 64 65 72 20 6f 66 0a 20 20 20 20 2a 2a 20 69 6e  der of.    ** in
a4f0: 63 72 65 61 73 69 6e 67 20 6f 66 66 73 65 74 2e  creasing offset.
a500: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 63 3e 75   */.    if( pc>u
a510: 73 61 62 6c 65 53 69 7a 65 2d 34 20 7c 7c 20 70  sableSize-4 || p
a520: 63 3c 69 41 64 64 72 2b 34 20 29 7b 0a 20 20 20  c<iAddr+4 ){.   
a530: 20 20 20 2a 70 52 63 20 3d 20 53 51 4c 49 54 45     *pRc = SQLITE
a540: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
a550: 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
a560: 20 20 20 7d 0a 20 20 20 20 2f 2a 20 45 56 49 44     }.    /* EVID
a570: 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 32 37 31 30  ENCE-OF: R-22710
a580: 2d 35 33 33 32 38 20 54 68 65 20 74 68 69 72 64  -53328 The third
a590: 20 61 6e 64 20 66 6f 75 72 74 68 20 62 79 74 65   and fourth byte
a5a0: 73 20 6f 66 20 65 61 63 68 0a 20 20 20 20 2a 2a  s of each.    **
a5b0: 20 66 72 65 65 62 6c 6f 63 6b 20 66 6f 72 6d 20   freeblock form 
a5c0: 61 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74  a big-endian int
a5d0: 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68  eger which is th
a5e0: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66 72  e size of the fr
a5f0: 65 65 62 6c 6f 63 6b 0a 20 20 20 20 2a 2a 20 69  eeblock.    ** i
a600: 6e 20 62 79 74 65 73 2c 20 69 6e 63 6c 75 64 69  n bytes, includi
a610: 6e 67 20 74 68 65 20 34 2d 62 79 74 65 20 68 65  ng the 4-byte he
a620: 61 64 65 72 2e 20 2a 2f 0a 20 20 20 20 73 69 7a  ader. */.    siz
a630: 65 20 3d 20 67 65 74 32 62 79 74 65 28 26 61 44  e = get2byte(&aD
a640: 61 74 61 5b 70 63 2b 32 5d 29 3b 0a 20 20 20 20  ata[pc+2]);.    
a650: 69 66 28 20 73 69 7a 65 3e 3d 6e 42 79 74 65 20  if( size>=nByte 
a660: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 78 20 3d  ){.      int x =
a670: 20 73 69 7a 65 20 2d 20 6e 42 79 74 65 3b 0a 20   size - nByte;. 
a680: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 78       testcase( x
a690: 3d 3d 34 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ==4 );.      tes
a6a0: 74 63 61 73 65 28 20 78 3d 3d 33 20 29 3b 0a 20  tcase( x==3 );. 
a6b0: 20 20 20 20 20 69 66 28 20 78 3c 34 20 29 7b 0a       if( x<4 ){.
a6c0: 20 20 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45          /* EVIDE
a6d0: 4e 43 45 2d 4f 46 3a 20 52 2d 31 31 34 39 38 2d  NCE-OF: R-11498-
a6e0: 35 38 30 32 32 20 49 6e 20 61 20 77 65 6c 6c 2d  58022 In a well-
a6f0: 66 6f 72 6d 65 64 20 62 2d 74 72 65 65 20 70 61  formed b-tree pa
a700: 67 65 2c 20 74 68 65 20 74 6f 74 61 6c 0a 20 20  ge, the total.  
a710: 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20        ** number 
a720: 6f 66 20 62 79 74 65 73 20 69 6e 20 66 72 61 67  of bytes in frag
a730: 6d 65 6e 74 73 20 6d 61 79 20 6e 6f 74 20 65 78  ments may not ex
a740: 63 65 65 64 20 36 30 2e 20 2a 2f 0a 20 20 20 20  ceed 60. */.    
a750: 20 20 20 20 69 66 28 20 61 44 61 74 61 5b 68 64      if( aData[hd
a760: 72 2b 37 5d 3e 3d 36 30 20 29 7b 0a 20 20 20 20  r+7]>=60 ){.    
a770: 20 20 20 20 20 20 69 66 28 20 70 62 44 65 66 72        if( pbDefr
a780: 61 67 20 29 20 2a 70 62 44 65 66 72 61 67 20 3d  ag ) *pbDefrag =
a790: 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65   1;.          re
a7a0: 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 20 20  turn 0;.        
a7b0: 7d 0a 20 20 20 20 20 20 20 20 2f 2a 20 52 65 6d  }.        /* Rem
a7c0: 6f 76 65 20 74 68 65 20 73 6c 6f 74 20 66 72 6f  ove the slot fro
a7d0: 6d 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e  m the free-list.
a7e0: 20 55 70 64 61 74 65 20 74 68 65 20 6e 75 6d 62   Update the numb
a7f0: 65 72 20 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a  er of.        **
a800: 20 66 72 61 67 6d 65 6e 74 65 64 20 62 79 74 65   fragmented byte
a810: 73 20 77 69 74 68 69 6e 20 74 68 65 20 70 61 67  s within the pag
a820: 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 6d 65  e. */.        me
a830: 6d 63 70 79 28 26 61 44 61 74 61 5b 69 41 64 64  mcpy(&aData[iAdd
a840: 72 5d 2c 20 26 61 44 61 74 61 5b 70 63 5d 2c 20  r], &aData[pc], 
a850: 32 29 3b 0a 20 20 20 20 20 20 20 20 61 44 61 74  2);.        aDat
a860: 61 5b 68 64 72 2b 37 5d 20 2b 3d 20 28 75 38 29  a[hdr+7] += (u8)
a870: 78 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  x;.      }else i
a880: 66 28 20 73 69 7a 65 2b 70 63 20 3e 20 75 73 61  f( size+pc > usa
a890: 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  bleSize ){.     
a8a0: 20 20 20 2a 70 52 63 20 3d 20 53 51 4c 49 54 45     *pRc = SQLITE
a8b0: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
a8c0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b         return 0;
a8d0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
a8e0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 6c 6f        /* The slo
a8f0: 74 20 72 65 6d 61 69 6e 73 20 6f 6e 20 74 68 65  t remains on the
a900: 20 66 72 65 65 2d 6c 69 73 74 2e 20 52 65 64 75   free-list. Redu
a910: 63 65 20 69 74 73 20 73 69 7a 65 20 74 6f 20 61  ce its size to a
a920: 63 63 6f 75 6e 74 0a 20 20 20 20 20 20 20 20 20  ccount.         
a930: 2a 2a 20 66 6f 72 20 74 68 65 20 70 6f 72 74 69  ** for the porti
a940: 6f 6e 20 75 73 65 64 20 62 79 20 74 68 65 20 6e  on used by the n
a950: 65 77 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 2a  ew allocation. *
a960: 2f 0a 20 20 20 20 20 20 20 20 70 75 74 32 62 79  /.        put2by
a970: 74 65 28 26 61 44 61 74 61 5b 70 63 2b 32 5d 2c  te(&aData[pc+2],
a980: 20 78 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   x);.      }.   
a990: 20 20 20 72 65 74 75 72 6e 20 26 61 44 61 74 61     return &aData
a9a0: 5b 70 63 20 2b 20 78 5d 3b 0a 20 20 20 20 7d 0a  [pc + x];.    }.
a9b0: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 30 3b    }..  return 0;
a9c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61  .}../*.** Alloca
a9d0: 74 65 20 6e 42 79 74 65 20 62 79 74 65 73 20 6f  te nByte bytes o
a9e0: 66 20 73 70 61 63 65 20 66 72 6f 6d 20 77 69 74  f space from wit
a9f0: 68 69 6e 20 74 68 65 20 42 2d 54 72 65 65 20 70  hin the B-Tree p
aa00: 61 67 65 20 70 61 73 73 65 64 0a 2a 2a 20 61 73  age passed.** as
aa10: 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
aa20: 65 6e 74 2e 20 57 72 69 74 65 20 69 6e 74 6f 20  ent. Write into 
aa30: 2a 70 49 64 78 20 74 68 65 20 69 6e 64 65 78 20  *pIdx the index 
aa40: 69 6e 74 6f 20 70 50 61 67 65 2d 3e 61 44 61 74  into pPage->aDat
aa50: 61 5b 5d 0a 2a 2a 20 6f 66 20 74 68 65 20 66 69  a[].** of the fi
aa60: 72 73 74 20 62 79 74 65 20 6f 66 20 61 6c 6c 6f  rst byte of allo
aa70: 63 61 74 65 64 20 73 70 61 63 65 2e 20 52 65 74  cated space. Ret
aa80: 75 72 6e 20 65 69 74 68 65 72 20 53 51 4c 49 54  urn either SQLIT
aa90: 45 5f 4f 4b 20 6f 72 0a 2a 2a 20 61 6e 20 65 72  E_OK or.** an er
aaa0: 72 6f 72 20 63 6f 64 65 20 28 75 73 75 61 6c 6c  ror code (usuall
aab0: 79 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  y SQLITE_CORRUPT
aac0: 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c  )..**.** The cal
aad0: 6c 65 72 20 67 75 61 72 61 6e 74 65 65 73 20 74  ler guarantees t
aae0: 68 61 74 20 74 68 65 72 65 20 69 73 20 73 75 66  hat there is suf
aaf0: 66 69 63 69 65 6e 74 20 73 70 61 63 65 20 74 6f  ficient space to
ab00: 20 6d 61 6b 65 20 74 68 65 0a 2a 2a 20 61 6c 6c   make the.** all
ab10: 6f 63 61 74 69 6f 6e 2e 20 20 54 68 69 73 20 72  ocation.  This r
ab20: 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 6e 65 65  outine might nee
ab30: 64 20 74 6f 20 64 65 66 72 61 67 6d 65 6e 74 20  d to defragment 
ab40: 69 6e 20 6f 72 64 65 72 20 74 6f 20 62 72 69 6e  in order to brin
ab50: 67 0a 2a 2a 20 61 6c 6c 20 74 68 65 20 73 70 61  g.** all the spa
ab60: 63 65 20 74 6f 67 65 74 68 65 72 2c 20 68 6f 77  ce together, how
ab70: 65 76 65 72 2e 20 20 54 68 69 73 20 72 6f 75 74  ever.  This rout
ab80: 69 6e 65 20 77 69 6c 6c 20 61 76 6f 69 64 20 75  ine will avoid u
ab90: 73 69 6e 67 0a 2a 2a 20 74 68 65 20 66 69 72 73  sing.** the firs
aba0: 74 20 74 77 6f 20 62 79 74 65 73 20 70 61 73 74  t two bytes past
abb0: 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65   the cell pointe
abc0: 72 20 61 72 65 61 20 73 69 6e 63 65 20 70 72 65  r area since pre
abd0: 73 75 6d 61 62 6c 79 20 74 68 69 73 0a 2a 2a 20  sumably this.** 
abe0: 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 62 65  allocation is be
abf0: 69 6e 67 20 6d 61 64 65 20 69 6e 20 6f 72 64 65  ing made in orde
ac00: 72 20 74 6f 20 69 6e 73 65 72 74 20 61 20 6e 65  r to insert a ne
ac10: 77 20 63 65 6c 6c 2c 20 73 6f 20 77 65 20 77 69  w cell, so we wi
ac20: 6c 6c 0a 2a 2a 20 61 6c 73 6f 20 65 6e 64 20 75  ll.** also end u
ac30: 70 20 6e 65 65 64 69 6e 67 20 61 20 6e 65 77 20  p needing a new 
ac40: 63 65 6c 6c 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f  cell pointer..*/
ac50: 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f  .static int allo
ac60: 63 61 74 65 53 70 61 63 65 28 4d 65 6d 50 61 67  cateSpace(MemPag
ac70: 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 6e 42  e *pPage, int nB
ac80: 79 74 65 2c 20 69 6e 74 20 2a 70 49 64 78 29 7b  yte, int *pIdx){
ac90: 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 68 64 72  .  const int hdr
aca0: 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66   = pPage->hdrOff
acb0: 73 65 74 3b 20 20 20 20 2f 2a 20 4c 6f 63 61 6c  set;    /* Local
acc0: 20 63 61 63 68 65 20 6f 66 20 70 50 61 67 65 2d   cache of pPage-
acd0: 3e 68 64 72 4f 66 66 73 65 74 20 2a 2f 0a 20 20  >hdrOffset */.  
ace0: 75 38 20 2a 20 63 6f 6e 73 74 20 64 61 74 61 20  u8 * const data 
acf0: 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 20  = pPage->aData; 
ad00: 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63 61       /* Local ca
ad10: 63 68 65 20 6f 66 20 70 50 61 67 65 2d 3e 61 44  che of pPage->aD
ad20: 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 74 6f 70  ata */.  int top
ad30: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
ad40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
ad50: 20 46 69 72 73 74 20 62 79 74 65 20 6f 66 20 63   First byte of c
ad60: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
ad70: 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   */.  int rc = S
ad80: 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
ad90: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
ada0: 74 65 67 65 72 20 72 65 74 75 72 6e 20 63 6f 64  teger return cod
adb0: 65 20 2a 2f 0a 20 20 69 6e 74 20 67 61 70 3b 20  e */.  int gap; 
adc0: 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
add0: 62 79 74 65 20 6f 66 20 67 61 70 20 62 65 74 77  byte of gap betw
ade0: 65 65 6e 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  een cell pointer
adf0: 73 20 61 6e 64 20 63 65 6c 6c 20 63 6f 6e 74 65  s and cell conte
ae00: 6e 74 20 2a 2f 0a 20 20 0a 20 20 61 73 73 65 72  nt */.  .  asser
ae10: 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
ae20: 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
ae30: 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
ae40: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70  assert( pPage->p
ae50: 42 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Bt );.  assert( 
ae60: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
ae70: 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
ae80: 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
ae90: 74 28 20 6e 42 79 74 65 3e 3d 30 20 29 3b 20 20  t( nByte>=0 );  
aea0: 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c 20  /* Minimum cell 
aeb0: 73 69 7a 65 20 69 73 20 34 20 2a 2f 0a 20 20 61  size is 4 */.  a
aec0: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 46  ssert( pPage->nF
aed0: 72 65 65 3e 3d 6e 42 79 74 65 20 29 3b 0a 20 20  ree>=nByte );.  
aee0: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
aef0: 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20  Overflow==0 );. 
af00: 20 61 73 73 65 72 74 28 20 6e 42 79 74 65 20 3c   assert( nByte <
af10: 20 28 69 6e 74 29 28 70 50 61 67 65 2d 3e 70 42   (int)(pPage->pB
af20: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 38 29  t->usableSize-8)
af30: 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70   );..  assert( p
af40: 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74  Page->cellOffset
af50: 20 3d 3d 20 68 64 72 20 2b 20 31 32 20 2d 20 34   == hdr + 12 - 4
af60: 2a 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 3b 0a  *pPage->leaf );.
af70: 20 20 67 61 70 20 3d 20 70 50 61 67 65 2d 3e 63    gap = pPage->c
af80: 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70 50  ellOffset + 2*pP
af90: 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 61 73  age->nCell;.  as
afa0: 73 65 72 74 28 20 67 61 70 3c 3d 36 35 35 33 36  sert( gap<=65536
afb0: 20 29 3b 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43   );.  /* EVIDENC
afc0: 45 2d 4f 46 3a 20 52 2d 32 39 33 35 36 2d 30 32  E-OF: R-29356-02
afd0: 33 39 31 20 49 66 20 74 68 65 20 64 61 74 61 62  391 If the datab
afe0: 61 73 65 20 75 73 65 73 20 61 20 36 35 35 33 36  ase uses a 65536
aff0: 2d 62 79 74 65 20 70 61 67 65 20 73 69 7a 65 0a  -byte page size.
b000: 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 72 65 73    ** and the res
b010: 65 72 76 65 64 20 73 70 61 63 65 20 69 73 20 7a  erved space is z
b020: 65 72 6f 20 28 74 68 65 20 75 73 75 61 6c 20 76  ero (the usual v
b030: 61 6c 75 65 20 66 6f 72 20 72 65 73 65 72 76 65  alue for reserve
b040: 64 20 73 70 61 63 65 29 0a 20 20 2a 2a 20 74 68  d space).  ** th
b050: 65 6e 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  en the cell cont
b060: 65 6e 74 20 6f 66 66 73 65 74 20 6f 66 20 61 6e  ent offset of an
b070: 20 65 6d 70 74 79 20 70 61 67 65 20 77 61 6e 74   empty page want
b080: 73 20 74 6f 20 62 65 20 36 35 35 33 36 2e 0a 20  s to be 65536.. 
b090: 20 2a 2a 20 48 6f 77 65 76 65 72 2c 20 74 68 61   ** However, tha
b0a0: 74 20 69 6e 74 65 67 65 72 20 69 73 20 74 6f 6f  t integer is too
b0b0: 20 6c 61 72 67 65 20 74 6f 20 62 65 20 73 74 6f   large to be sto
b0c0: 72 65 64 20 69 6e 20 61 20 32 2d 62 79 74 65 20  red in a 2-byte 
b0d0: 75 6e 73 69 67 6e 65 64 0a 20 20 2a 2a 20 69 6e  unsigned.  ** in
b0e0: 74 65 67 65 72 2c 20 73 6f 20 61 20 76 61 6c 75  teger, so a valu
b0f0: 65 20 6f 66 20 30 20 69 73 20 75 73 65 64 20 69  e of 0 is used i
b100: 6e 20 69 74 73 20 70 6c 61 63 65 2e 20 2a 2f 0a  n its place. */.
b110: 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65    top = get2byte
b120: 4e 6f 74 5a 65 72 6f 28 26 64 61 74 61 5b 68 64  NotZero(&data[hd
b130: 72 2b 35 5d 29 3b 0a 20 20 69 66 28 20 67 61 70  r+5]);.  if( gap
b140: 3e 74 6f 70 20 29 20 72 65 74 75 72 6e 20 53 51  >top ) return SQ
b150: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
b160: 54 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72  T;..  /* If ther
b170: 65 20 69 73 20 65 6e 6f 75 67 68 20 73 70 61 63  e is enough spac
b180: 65 20 62 65 74 77 65 65 6e 20 67 61 70 20 61 6e  e between gap an
b190: 64 20 74 6f 70 20 66 6f 72 20 6f 6e 65 20 6d 6f  d top for one mo
b1a0: 72 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 0a  re cell pointer.
b1b0: 20 20 2a 2a 20 61 72 72 61 79 20 65 6e 74 72 79    ** array entry
b1c0: 20 6f 66 66 73 65 74 2c 20 61 6e 64 20 69 66 20   offset, and if 
b1d0: 74 68 65 20 66 72 65 65 6c 69 73 74 20 69 73 20  the freelist is 
b1e0: 6e 6f 74 20 65 6d 70 74 79 2c 20 74 68 65 6e 20  not empty, then 
b1f0: 73 65 61 72 63 68 20 74 68 65 0a 20 20 2a 2a 20  search the.  ** 
b200: 66 72 65 65 6c 69 73 74 20 6c 6f 6f 6b 69 6e 67  freelist looking
b210: 20 66 6f 72 20 61 20 66 72 65 65 20 73 6c 6f 74   for a free slot
b220: 20 62 69 67 20 65 6e 6f 75 67 68 20 74 6f 20 73   big enough to s
b230: 61 74 69 73 66 79 20 74 68 65 20 72 65 71 75 65  atisfy the reque
b240: 73 74 2e 0a 20 20 2a 2f 0a 20 20 74 65 73 74 63  st..  */.  testc
b250: 61 73 65 28 20 67 61 70 2b 32 3d 3d 74 6f 70 20  ase( gap+2==top 
b260: 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 67  );.  testcase( g
b270: 61 70 2b 31 3d 3d 74 6f 70 20 29 3b 0a 20 20 74  ap+1==top );.  t
b280: 65 73 74 63 61 73 65 28 20 67 61 70 3d 3d 74 6f  estcase( gap==to
b290: 70 20 29 3b 0a 20 20 69 66 28 20 67 61 70 2b 32  p );.  if( gap+2
b2a0: 3c 3d 74 6f 70 20 26 26 20 28 64 61 74 61 5b 68  <=top && (data[h
b2b0: 64 72 2b 31 5d 20 7c 7c 20 64 61 74 61 5b 68 64  dr+1] || data[hd
b2c0: 72 2b 32 5d 29 20 29 7b 0a 20 20 20 20 69 6e 74  r+2]) ){.    int
b2d0: 20 62 44 65 66 72 61 67 20 3d 20 30 3b 0a 20 20   bDefrag = 0;.  
b2e0: 20 20 75 38 20 2a 70 53 70 61 63 65 20 3d 20 70    u8 *pSpace = p
b2f0: 61 67 65 46 69 6e 64 53 6c 6f 74 28 70 50 61 67  ageFindSlot(pPag
b300: 65 2c 20 6e 42 79 74 65 2c 20 26 72 63 2c 20 26  e, nByte, &rc, &
b310: 62 44 65 66 72 61 67 29 3b 0a 20 20 20 20 69 66  bDefrag);.    if
b320: 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
b330: 3b 0a 20 20 20 20 69 66 28 20 62 44 65 66 72 61  ;.    if( bDefra
b340: 67 20 29 20 67 6f 74 6f 20 64 65 66 72 61 67 6d  g ) goto defragm
b350: 65 6e 74 5f 70 61 67 65 3b 0a 20 20 20 20 69 66  ent_page;.    if
b360: 28 20 70 53 70 61 63 65 20 29 7b 0a 20 20 20 20  ( pSpace ){.    
b370: 20 20 61 73 73 65 72 74 28 20 70 53 70 61 63 65    assert( pSpace
b380: 3e 3d 64 61 74 61 20 26 26 20 28 70 53 70 61 63  >=data && (pSpac
b390: 65 20 2d 20 64 61 74 61 29 3c 36 35 35 33 36 20  e - data)<65536 
b3a0: 29 3b 0a 20 20 20 20 20 20 2a 70 49 64 78 20 3d  );.      *pIdx =
b3b0: 20 28 69 6e 74 29 28 70 53 70 61 63 65 20 2d 20   (int)(pSpace - 
b3c0: 64 61 74 61 29 3b 0a 20 20 20 20 20 20 72 65 74  data);.      ret
b3d0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
b3e0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54     }.  }..  /* T
b3f0: 68 65 20 72 65 71 75 65 73 74 20 63 6f 75 6c 64  he request could
b400: 20 6e 6f 74 20 62 65 20 66 75 6c 66 69 6c 6c 65   not be fulfille
b410: 64 20 75 73 69 6e 67 20 61 20 66 72 65 65 6c 69  d using a freeli
b420: 73 74 20 73 6c 6f 74 2e 20 20 43 68 65 63 6b 0a  st slot.  Check.
b430: 20 20 2a 2a 20 74 6f 20 73 65 65 20 69 66 20 64    ** to see if d
b440: 65 66 72 61 67 6d 65 6e 74 61 74 69 6f 6e 20 69  efragmentation i
b450: 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 20 20 2a  s necessary..  *
b460: 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20 67 61  /.  testcase( ga
b470: 70 2b 32 2b 6e 42 79 74 65 3d 3d 74 6f 70 20 29  p+2+nByte==top )
b480: 3b 0a 20 20 69 66 28 20 67 61 70 2b 32 2b 6e 42  ;.  if( gap+2+nB
b490: 79 74 65 3e 74 6f 70 20 29 7b 0a 20 64 65 66 72  yte>top ){. defr
b4a0: 61 67 6d 65 6e 74 5f 70 61 67 65 3a 0a 20 20 20  agment_page:.   
b4b0: 20 74 65 73 74 63 61 73 65 28 20 70 50 61 67 65   testcase( pPage
b4c0: 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20  ->nCell==0 );.  
b4d0: 20 20 72 63 20 3d 20 64 65 66 72 61 67 6d 65 6e    rc = defragmen
b4e0: 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  tPage(pPage);.  
b4f0: 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
b500: 6e 20 72 63 3b 0a 20 20 20 20 74 6f 70 20 3d 20  n rc;.    top = 
b510: 67 65 74 32 62 79 74 65 4e 6f 74 5a 65 72 6f 28  get2byteNotZero(
b520: 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20  &data[hdr+5]);. 
b530: 20 20 20 61 73 73 65 72 74 28 20 67 61 70 2b 6e     assert( gap+n
b540: 42 79 74 65 3c 3d 74 6f 70 20 29 3b 0a 20 20 7d  Byte<=top );.  }
b550: 0a 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  ...  /* Allocate
b560: 20 6d 65 6d 6f 72 79 20 66 72 6f 6d 20 74 68 65   memory from the
b570: 20 67 61 70 20 69 6e 20 62 65 74 77 65 65 6e 20   gap in between 
b580: 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  the cell pointer
b590: 20 61 72 72 61 79 0a 20 20 2a 2a 20 61 6e 64 20   array.  ** and 
b5a0: 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
b5b0: 20 61 72 65 61 2e 20 20 54 68 65 20 62 74 72 65   area.  The btre
b5c0: 65 49 6e 69 74 50 61 67 65 28 29 20 63 61 6c 6c  eInitPage() call
b5d0: 20 68 61 73 20 61 6c 72 65 61 64 79 0a 20 20 2a   has already.  *
b5e0: 2a 20 76 61 6c 69 64 61 74 65 64 20 74 68 65 20  * validated the 
b5f0: 66 72 65 65 6c 69 73 74 2e 20 20 47 69 76 65 6e  freelist.  Given
b600: 20 74 68 61 74 20 74 68 65 20 66 72 65 65 6c 69   that the freeli
b610: 73 74 20 69 73 20 76 61 6c 69 64 2c 20 74 68 65  st is valid, the
b620: 72 65 0a 20 20 2a 2a 20 69 73 20 6e 6f 20 77 61  re.  ** is no wa
b630: 79 20 74 68 61 74 20 74 68 65 20 61 6c 6c 6f 63  y that the alloc
b640: 61 74 69 6f 6e 20 63 61 6e 20 65 78 74 65 6e 64  ation can extend
b650: 20 6f 66 66 20 74 68 65 20 65 6e 64 20 6f 66 20   off the end of 
b660: 74 68 65 20 70 61 67 65 2e 0a 20 20 2a 2a 20 54  the page..  ** T
b670: 68 65 20 61 73 73 65 72 74 28 29 20 62 65 6c 6f  he assert() belo
b680: 77 20 76 65 72 69 66 69 65 73 20 74 68 65 20 70  w verifies the p
b690: 72 65 76 69 6f 75 73 20 73 65 6e 74 65 6e 63 65  revious sentence
b6a0: 2e 0a 20 20 2a 2f 0a 20 20 74 6f 70 20 2d 3d 20  ..  */.  top -= 
b6b0: 6e 42 79 74 65 3b 0a 20 20 70 75 74 32 62 79 74  nByte;.  put2byt
b6c0: 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20  e(&data[hdr+5], 
b6d0: 74 6f 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20  top);.  assert( 
b6e0: 74 6f 70 2b 6e 42 79 74 65 20 3c 3d 20 28 69 6e  top+nByte <= (in
b6f0: 74 29 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  t)pPage->pBt->us
b700: 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 2a 70  ableSize );.  *p
b710: 49 64 78 20 3d 20 74 6f 70 3b 0a 20 20 72 65 74  Idx = top;.  ret
b720: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
b730: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
b740: 20 73 65 63 74 69 6f 6e 20 6f 66 20 74 68 65 20   section of the 
b750: 70 50 61 67 65 2d 3e 61 44 61 74 61 20 74 6f 20  pPage->aData to 
b760: 74 68 65 20 66 72 65 65 6c 69 73 74 2e 0a 2a 2a  the freelist..**
b770: 20 54 68 65 20 66 69 72 73 74 20 62 79 74 65 20   The first byte 
b780: 6f 66 20 74 68 65 20 6e 65 77 20 66 72 65 65 20  of the new free 
b790: 62 6c 6f 63 6b 20 69 73 20 70 50 61 67 65 2d 3e  block is pPage->
b7a0: 61 44 61 74 61 5b 69 53 74 61 72 74 5d 0a 2a 2a  aData[iStart].**
b7b0: 20 61 6e 64 20 74 68 65 20 73 69 7a 65 20 6f 66   and the size of
b7c0: 20 74 68 65 20 62 6c 6f 63 6b 20 69 73 20 69 53   the block is iS
b7d0: 69 7a 65 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a  ize bytes..**.**
b7e0: 20 41 64 6a 61 63 65 6e 74 20 66 72 65 65 62 6c   Adjacent freebl
b7f0: 6f 63 6b 73 20 61 72 65 20 63 6f 61 6c 65 73 63  ocks are coalesc
b800: 65 64 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74  ed..**.** Note t
b810: 68 61 74 20 65 76 65 6e 20 74 68 6f 75 67 68 20  hat even though 
b820: 74 68 65 20 66 72 65 65 62 6c 6f 63 6b 20 6c 69  the freeblock li
b830: 73 74 20 77 61 73 20 63 68 65 63 6b 65 64 20 62  st was checked b
b840: 79 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28  y btreeInitPage(
b850: 29 2c 0a 2a 2a 20 74 68 61 74 20 72 6f 75 74 69  ),.** that routi
b860: 6e 65 20 77 69 6c 6c 20 6e 6f 74 20 64 65 74 65  ne will not dete
b870: 63 74 20 6f 76 65 72 6c 61 70 20 62 65 74 77 65  ct overlap betwe
b880: 65 6e 20 63 65 6c 6c 73 20 6f 72 20 66 72 65 65  en cells or free
b890: 62 6c 6f 63 6b 73 2e 20 20 4e 6f 72 0a 2a 2a 20  blocks.  Nor.** 
b8a0: 64 6f 65 73 20 69 74 20 64 65 74 65 63 74 20 63  does it detect c
b8b0: 65 6c 6c 73 20 6f 72 20 66 72 65 65 62 6c 6f 63  ells or freebloc
b8c0: 6b 73 20 74 68 61 74 20 65 6e 63 72 6f 75 63 68  ks that encrouch
b8d0: 20 69 6e 74 6f 20 74 68 65 20 72 65 73 65 72 76   into the reserv
b8e0: 65 64 20 62 79 74 65 73 0a 2a 2a 20 61 74 20 74  ed bytes.** at t
b8f0: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70 61  he end of the pa
b900: 67 65 2e 20 20 53 6f 20 64 6f 20 61 64 64 69 74  ge.  So do addit
b910: 69 6f 6e 61 6c 20 63 6f 72 72 75 70 74 69 6f 6e  ional corruption
b920: 20 63 68 65 63 6b 73 20 69 6e 73 69 64 65 20 74   checks inside t
b930: 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 61  his.** routine a
b940: 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  nd return SQLITE
b950: 5f 43 4f 52 52 55 50 54 20 69 66 20 61 6e 79 20  _CORRUPT if any 
b960: 70 72 6f 62 6c 65 6d 73 20 61 72 65 20 66 6f 75  problems are fou
b970: 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nd..*/.static in
b980: 74 20 66 72 65 65 53 70 61 63 65 28 4d 65 6d 50  t freeSpace(MemP
b990: 61 67 65 20 2a 70 50 61 67 65 2c 20 75 31 36 20  age *pPage, u16 
b9a0: 69 53 74 61 72 74 2c 20 75 31 36 20 69 53 69 7a  iStart, u16 iSiz
b9b0: 65 29 7b 0a 20 20 75 31 36 20 69 50 74 72 3b 20  e){.  u16 iPtr; 
b9c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b9d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
b9e0: 64 64 72 65 73 73 20 6f 66 20 70 74 72 20 74 6f  ddress of ptr to
b9f0: 20 6e 65 78 74 20 66 72 65 65 62 6c 6f 63 6b 20   next freeblock 
ba00: 2a 2f 0a 20 20 75 31 36 20 69 46 72 65 65 42 6c  */.  u16 iFreeBl
ba10: 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
ba20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
ba30: 64 72 65 73 73 20 6f 66 20 74 68 65 20 6e 65 78  dress of the nex
ba40: 74 20 66 72 65 65 62 6c 6f 63 6b 20 2a 2f 0a 20  t freeblock */. 
ba50: 20 75 38 20 68 64 72 3b 20 20 20 20 20 20 20 20   u8 hdr;        
ba60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ba70: 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 68         /* Page h
ba80: 65 61 64 65 72 20 73 69 7a 65 2e 20 20 30 20 6f  eader size.  0 o
ba90: 72 20 31 30 30 20 2a 2f 0a 20 20 75 38 20 6e 46  r 100 */.  u8 nF
baa0: 72 61 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20  rag = 0;        
bab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bac0: 20 2f 2a 20 52 65 64 75 63 74 69 6f 6e 20 69 6e   /* Reduction in
bad0: 20 66 72 61 67 6d 65 6e 74 61 74 69 6f 6e 20 2a   fragmentation *
bae0: 2f 0a 20 20 75 31 36 20 69 4f 72 69 67 53 69 7a  /.  u16 iOrigSiz
baf0: 65 20 3d 20 69 53 69 7a 65 3b 20 20 20 20 20 20  e = iSize;      
bb00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69            /* Ori
bb10: 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 69  ginal value of i
bb20: 53 69 7a 65 20 2a 2f 0a 20 20 75 33 32 20 69 4c  Size */.  u32 iL
bb30: 61 73 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74  ast = pPage->pBt
bb40: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34 3b 20  ->usableSize-4; 
bb50: 2f 2a 20 4c 61 72 67 65 73 74 20 70 6f 73 73 69  /* Largest possi
bb60: 62 6c 65 20 66 72 65 65 62 6c 6f 63 6b 20 6f 66  ble freeblock of
bb70: 66 73 65 74 20 2a 2f 0a 20 20 75 33 32 20 69 45  fset */.  u32 iE
bb80: 6e 64 20 3d 20 69 53 74 61 72 74 20 2b 20 69 53  nd = iStart + iS
bb90: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
bba0: 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 70 61  /* First byte pa
bbb0: 73 74 20 74 68 65 20 69 53 74 61 72 74 20 62 75  st the iStart bu
bbc0: 66 66 65 72 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  ffer */.  unsign
bbd0: 65 64 20 63 68 61 72 20 2a 64 61 74 61 20 3d 20  ed char *data = 
bbe0: 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 20 20 20  pPage->aData;   
bbf0: 2f 2a 20 50 61 67 65 20 63 6f 6e 74 65 6e 74 20  /* Page content 
bc00: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  */..  assert( pP
bc10: 61 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20  age->pBt!=0 );. 
bc20: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
bc30: 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
bc40: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
bc50: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 53   );.  assert( iS
bc60: 74 61 72 74 3e 3d 70 50 61 67 65 2d 3e 68 64 72  tart>=pPage->hdr
bc70: 4f 66 66 73 65 74 2b 36 2b 70 50 61 67 65 2d 3e  Offset+6+pPage->
bc80: 63 68 69 6c 64 50 74 72 53 69 7a 65 20 29 3b 0a  childPtrSize );.
bc90: 20 20 61 73 73 65 72 74 28 20 43 4f 52 52 55 50    assert( CORRUP
bca0: 54 5f 44 42 20 7c 7c 20 69 45 6e 64 20 3c 3d 20  T_DB || iEnd <= 
bcb0: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
bcc0: 6c 65 53 69 7a 65 20 29 3b 0a 20 20 61 73 73 65  leSize );.  asse
bcd0: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
bce0: 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
bcf0: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
bd00: 73 73 65 72 74 28 20 69 53 69 7a 65 3e 3d 34 20  ssert( iSize>=4 
bd10: 29 3b 20 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20  );   /* Minimum 
bd20: 63 65 6c 6c 20 73 69 7a 65 20 69 73 20 34 20 2a  cell size is 4 *
bd30: 2f 0a 20 20 61 73 73 65 72 74 28 20 69 53 74 61  /.  assert( iSta
bd40: 72 74 3c 3d 69 4c 61 73 74 20 29 3b 0a 0a 20 20  rt<=iLast );..  
bd50: 2f 2a 20 4f 76 65 72 77 72 69 74 65 20 64 65 6c  /* Overwrite del
bd60: 65 74 65 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  eted information
bd70: 20 77 69 74 68 20 7a 65 72 6f 73 20 77 68 65 6e   with zeros when
bd80: 20 74 68 65 20 73 65 63 75 72 65 5f 64 65 6c 65   the secure_dele
bd90: 74 65 0a 20 20 2a 2a 20 6f 70 74 69 6f 6e 20 69  te.  ** option i
bda0: 73 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 20 20 69  s enabled */.  i
bdb0: 66 28 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 62  f( pPage->pBt->b
bdc0: 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 53 45  tsFlags & BTS_SE
bdd0: 43 55 52 45 5f 44 45 4c 45 54 45 20 29 7b 0a 20  CURE_DELETE ){. 
bde0: 20 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b     memset(&data[
bdf0: 69 53 74 61 72 74 5d 2c 20 30 2c 20 69 53 69 7a  iStart], 0, iSiz
be00: 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68  e);.  }..  /* Th
be10: 65 20 6c 69 73 74 20 6f 66 20 66 72 65 65 62 6c  e list of freebl
be20: 6f 63 6b 73 20 6d 75 73 74 20 62 65 20 69 6e 20  ocks must be in 
be30: 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e  ascending order.
be40: 20 20 46 69 6e 64 20 74 68 65 20 0a 20 20 2a 2a    Find the .  **
be50: 20 73 70 6f 74 20 6f 6e 20 74 68 65 20 6c 69 73   spot on the lis
be60: 74 20 77 68 65 72 65 20 69 53 74 61 72 74 20 73  t where iStart s
be70: 68 6f 75 6c 64 20 62 65 20 69 6e 73 65 72 74 65  hould be inserte
be80: 64 2e 0a 20 20 2a 2f 0a 20 20 68 64 72 20 3d 20  d..  */.  hdr = 
be90: 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
bea0: 3b 0a 20 20 69 50 74 72 20 3d 20 68 64 72 20 2b  ;.  iPtr = hdr +
beb0: 20 31 3b 0a 20 20 69 66 28 20 64 61 74 61 5b 69   1;.  if( data[i
bec0: 50 74 72 2b 31 5d 3d 3d 30 20 26 26 20 64 61 74  Ptr+1]==0 && dat
bed0: 61 5b 69 50 74 72 5d 3d 3d 30 20 29 7b 0a 20 20  a[iPtr]==0 ){.  
bee0: 20 20 69 46 72 65 65 42 6c 6b 20 3d 20 30 3b 20    iFreeBlk = 0; 
bef0: 20 2f 2a 20 53 68 6f 72 74 63 75 74 20 66 6f 72   /* Shortcut for
bf00: 20 74 68 65 20 63 61 73 65 20 77 68 65 6e 20 74   the case when t
bf10: 68 65 20 66 72 65 65 6c 69 73 74 20 69 73 20 65  he freelist is e
bf20: 6d 70 74 79 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b  mpty */.  }else{
bf30: 0a 20 20 20 20 77 68 69 6c 65 28 20 28 69 46 72  .    while( (iFr
bf40: 65 65 42 6c 6b 20 3d 20 67 65 74 32 62 79 74 65  eeBlk = get2byte
bf50: 28 26 64 61 74 61 5b 69 50 74 72 5d 29 29 3e 30  (&data[iPtr]))>0
bf60: 20 26 26 20 69 46 72 65 65 42 6c 6b 3c 69 53 74   && iFreeBlk<iSt
bf70: 61 72 74 20 29 7b 0a 20 20 20 20 20 20 69 66 28  art ){.      if(
bf80: 20 69 46 72 65 65 42 6c 6b 3c 69 50 74 72 2b 34   iFreeBlk<iPtr+4
bf90: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
bfa0: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
bfb0: 20 20 20 20 20 69 50 74 72 20 3d 20 69 46 72 65       iPtr = iFre
bfc0: 65 42 6c 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  eBlk;.    }.    
bfd0: 69 66 28 20 69 46 72 65 65 42 6c 6b 3e 69 4c 61  if( iFreeBlk>iLa
bfe0: 73 74 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  st ) return SQLI
bff0: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
c000: 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 46 72  .    assert( iFr
c010: 65 65 42 6c 6b 3e 69 50 74 72 20 7c 7c 20 69 46  eeBlk>iPtr || iF
c020: 72 65 65 42 6c 6b 3d 3d 30 20 29 3b 0a 20 20 0a  reeBlk==0 );.  .
c030: 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70      /* At this p
c040: 6f 69 6e 74 3a 0a 20 20 20 20 2a 2a 20 20 20 20  oint:.    **    
c050: 69 46 72 65 65 42 6c 6b 3a 20 20 20 46 69 72 73  iFreeBlk:   Firs
c060: 74 20 66 72 65 65 62 6c 6f 63 6b 20 61 66 74 65  t freeblock afte
c070: 72 20 69 53 74 61 72 74 2c 20 6f 72 20 7a 65 72  r iStart, or zer
c080: 6f 20 69 66 20 6e 6f 6e 65 0a 20 20 20 20 2a 2a  o if none.    **
c090: 20 20 20 20 69 50 74 72 3a 20 20 20 20 20 20 20      iPtr:       
c0a0: 54 68 65 20 61 64 64 72 65 73 73 20 6f 66 20 61  The address of a
c0b0: 20 70 6f 69 6e 74 65 72 20 69 46 72 65 65 42 6c   pointer iFreeBl
c0c0: 6b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  k.    **.    ** 
c0d0: 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
c0e0: 69 46 72 65 65 42 6c 6b 20 73 68 6f 75 6c 64 20  iFreeBlk should 
c0f0: 62 65 20 63 6f 61 6c 65 73 63 65 64 20 6f 6e 74  be coalesced ont
c100: 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 69 53 74  o the end of iSt
c110: 61 72 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  art..    */.    
c120: 69 66 28 20 69 46 72 65 65 42 6c 6b 20 26 26 20  if( iFreeBlk && 
c130: 69 45 6e 64 2b 33 3e 3d 69 46 72 65 65 42 6c 6b  iEnd+3>=iFreeBlk
c140: 20 29 7b 0a 20 20 20 20 20 20 6e 46 72 61 67 20   ){.      nFrag 
c150: 3d 20 69 46 72 65 65 42 6c 6b 20 2d 20 69 45 6e  = iFreeBlk - iEn
c160: 64 3b 0a 20 20 20 20 20 20 69 66 28 20 69 45 6e  d;.      if( iEn
c170: 64 3e 69 46 72 65 65 42 6c 6b 20 29 20 72 65 74  d>iFreeBlk ) ret
c180: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
c190: 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 69  PT_BKPT;.      i
c1a0: 45 6e 64 20 3d 20 69 46 72 65 65 42 6c 6b 20 2b  End = iFreeBlk +
c1b0: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
c1c0: 69 46 72 65 65 42 6c 6b 2b 32 5d 29 3b 0a 20 20  iFreeBlk+2]);.  
c1d0: 20 20 20 20 69 53 69 7a 65 20 3d 20 69 45 6e 64      iSize = iEnd
c1e0: 20 2d 20 69 53 74 61 72 74 3b 0a 20 20 20 20 20   - iStart;.     
c1f0: 20 69 46 72 65 65 42 6c 6b 20 3d 20 67 65 74 32   iFreeBlk = get2
c200: 62 79 74 65 28 26 64 61 74 61 5b 69 46 72 65 65  byte(&data[iFree
c210: 42 6c 6b 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 0a  Blk]);.    }.  .
c220: 20 20 20 20 2f 2a 20 49 66 20 69 50 74 72 20 69      /* If iPtr i
c230: 73 20 61 6e 6f 74 68 65 72 20 66 72 65 65 62 6c  s another freebl
c240: 6f 63 6b 20 28 74 68 61 74 20 69 73 2c 20 69 66  ock (that is, if
c250: 20 69 50 74 72 20 69 73 20 6e 6f 74 20 74 68 65   iPtr is not the
c260: 20 66 72 65 65 6c 69 73 74 0a 20 20 20 20 2a 2a   freelist.    **
c270: 20 70 6f 69 6e 74 65 72 20 69 6e 20 74 68 65 20   pointer in the 
c280: 70 61 67 65 20 68 65 61 64 65 72 29 20 74 68 65  page header) the
c290: 6e 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20 69  n check to see i
c2a0: 66 20 69 53 74 61 72 74 20 73 68 6f 75 6c 64 20  f iStart should 
c2b0: 62 65 0a 20 20 20 20 2a 2a 20 63 6f 61 6c 65 73  be.    ** coales
c2c0: 63 65 64 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64  ced onto the end
c2d0: 20 6f 66 20 69 50 74 72 2e 0a 20 20 20 20 2a 2f   of iPtr..    */
c2e0: 0a 20 20 20 20 69 66 28 20 69 50 74 72 3e 68 64  .    if( iPtr>hd
c2f0: 72 2b 31 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  r+1 ){.      int
c300: 20 69 50 74 72 45 6e 64 20 3d 20 69 50 74 72 20   iPtrEnd = iPtr 
c310: 2b 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  + get2byte(&data
c320: 5b 69 50 74 72 2b 32 5d 29 3b 0a 20 20 20 20 20  [iPtr+2]);.     
c330: 20 69 66 28 20 69 50 74 72 45 6e 64 2b 33 3e 3d   if( iPtrEnd+3>=
c340: 69 53 74 61 72 74 20 29 7b 0a 20 20 20 20 20 20  iStart ){.      
c350: 20 20 69 66 28 20 69 50 74 72 45 6e 64 3e 69 53    if( iPtrEnd>iS
c360: 74 61 72 74 20 29 20 72 65 74 75 72 6e 20 53 51  tart ) return SQ
c370: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
c380: 54 3b 0a 20 20 20 20 20 20 20 20 6e 46 72 61 67  T;.        nFrag
c390: 20 2b 3d 20 69 53 74 61 72 74 20 2d 20 69 50 74   += iStart - iPt
c3a0: 72 45 6e 64 3b 0a 20 20 20 20 20 20 20 20 69 53  rEnd;.        iS
c3b0: 69 7a 65 20 3d 20 69 45 6e 64 20 2d 20 69 50 74  ize = iEnd - iPt
c3c0: 72 3b 0a 20 20 20 20 20 20 20 20 69 53 74 61 72  r;.        iStar
c3d0: 74 20 3d 20 69 50 74 72 3b 0a 20 20 20 20 20 20  t = iPtr;.      
c3e0: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
c3f0: 6e 46 72 61 67 3e 64 61 74 61 5b 68 64 72 2b 37  nFrag>data[hdr+7
c400: 5d 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ] ) return SQLIT
c410: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
c420: 20 20 20 20 64 61 74 61 5b 68 64 72 2b 37 5d 20      data[hdr+7] 
c430: 2d 3d 20 6e 46 72 61 67 3b 0a 20 20 7d 0a 20 20  -= nFrag;.  }.  
c440: 69 66 28 20 69 53 74 61 72 74 3d 3d 67 65 74 32  if( iStart==get2
c450: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
c460: 5d 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  ]) ){.    /* The
c470: 20 6e 65 77 20 66 72 65 65 62 6c 6f 63 6b 20 69   new freeblock i
c480: 73 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69  s at the beginni
c490: 6e 67 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 63  ng of the cell c
c4a0: 6f 6e 74 65 6e 74 20 61 72 65 61 2c 0a 20 20 20  ontent area,.   
c4b0: 20 2a 2a 20 73 6f 20 6a 75 73 74 20 65 78 74 65   ** so just exte
c4c0: 6e 64 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  nd the cell cont
c4d0: 65 6e 74 20 61 72 65 61 20 72 61 74 68 65 72 20  ent area rather 
c4e0: 74 68 61 6e 20 63 72 65 61 74 65 20 61 6e 6f 74  than create anot
c4f0: 68 65 72 0a 20 20 20 20 2a 2a 20 66 72 65 65 6c  her.    ** freel
c500: 69 73 74 20 65 6e 74 72 79 20 2a 2f 0a 20 20 20  ist entry */.   
c510: 20 69 66 28 20 69 50 74 72 21 3d 68 64 72 2b 31   if( iPtr!=hdr+1
c520: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
c530: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
c540: 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74     put2byte(&dat
c550: 61 5b 68 64 72 2b 31 5d 2c 20 69 46 72 65 65 42  a[hdr+1], iFreeB
c560: 6c 6b 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74  lk);.    put2byt
c570: 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20  e(&data[hdr+5], 
c580: 69 45 6e 64 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  iEnd);.  }else{.
c590: 20 20 20 20 2f 2a 20 49 6e 73 65 72 74 20 74 68      /* Insert th
c5a0: 65 20 6e 65 77 20 66 72 65 65 62 6c 6f 63 6b 20  e new freeblock 
c5b0: 69 6e 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73  into the freelis
c5c0: 74 20 2a 2f 0a 20 20 20 20 70 75 74 32 62 79 74  t */.    put2byt
c5d0: 65 28 26 64 61 74 61 5b 69 50 74 72 5d 2c 20 69  e(&data[iPtr], i
c5e0: 53 74 61 72 74 29 3b 0a 20 20 20 20 70 75 74 32  Start);.    put2
c5f0: 62 79 74 65 28 26 64 61 74 61 5b 69 53 74 61 72  byte(&data[iStar
c600: 74 5d 2c 20 69 46 72 65 65 42 6c 6b 29 3b 0a 20  t], iFreeBlk);. 
c610: 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74     put2byte(&dat
c620: 61 5b 69 53 74 61 72 74 2b 32 5d 2c 20 69 53 69  a[iStart+2], iSi
c630: 7a 65 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  ze);.  }.  pPage
c640: 2d 3e 6e 46 72 65 65 20 2b 3d 20 69 4f 72 69 67  ->nFree += iOrig
c650: 53 69 7a 65 3b 0a 20 20 72 65 74 75 72 6e 20 53  Size;.  return S
c660: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
c670: 2a 2a 20 44 65 63 6f 64 65 20 74 68 65 20 66 6c  ** Decode the fl
c680: 61 67 73 20 62 79 74 65 20 28 74 68 65 20 66 69  ags byte (the fi
c690: 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20  rst byte of the 
c6a0: 68 65 61 64 65 72 29 20 66 6f 72 20 61 20 70 61  header) for a pa
c6b0: 67 65 0a 2a 2a 20 61 6e 64 20 69 6e 69 74 69 61  ge.** and initia
c6c0: 6c 69 7a 65 20 66 69 65 6c 64 73 20 6f 66 20 74  lize fields of t
c6d0: 68 65 20 4d 65 6d 50 61 67 65 20 73 74 72 75 63  he MemPage struc
c6e0: 74 75 72 65 20 61 63 63 6f 72 64 69 6e 67 6c 79  ture accordingly
c6f0: 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 74 68 65  ..**.** Only the
c700: 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6d 62 69   following combi
c710: 6e 61 74 69 6f 6e 73 20 61 72 65 20 73 75 70 70  nations are supp
c720: 6f 72 74 65 64 2e 20 20 41 6e 79 74 68 69 6e 67  orted.  Anything
c730: 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 69 6e   different.** in
c740: 64 69 63 61 74 65 73 20 61 20 63 6f 72 72 75 70  dicates a corrup
c750: 74 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73  t database files
c760: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20  :.**.**         
c770: 50 54 46 5f 5a 45 52 4f 44 41 54 41 0a 2a 2a 20  PTF_ZERODATA.** 
c780: 20 20 20 20 20 20 20 20 50 54 46 5f 5a 45 52 4f          PTF_ZERO
c790: 44 41 54 41 20 7c 20 50 54 46 5f 4c 45 41 46 0a  DATA | PTF_LEAF.
c7a0: 2a 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f 4c  **         PTF_L
c7b0: 45 41 46 44 41 54 41 20 7c 20 50 54 46 5f 49 4e  EAFDATA | PTF_IN
c7c0: 54 4b 45 59 0a 2a 2a 20 20 20 20 20 20 20 20 20  TKEY.**         
c7d0: 50 54 46 5f 4c 45 41 46 44 41 54 41 20 7c 20 50  PTF_LEAFDATA | P
c7e0: 54 46 5f 49 4e 54 4b 45 59 20 7c 20 50 54 46 5f  TF_INTKEY | PTF_
c7f0: 4c 45 41 46 0a 2a 2f 0a 73 74 61 74 69 63 20 69  LEAF.*/.static i
c800: 6e 74 20 64 65 63 6f 64 65 46 6c 61 67 73 28 4d  nt decodeFlags(M
c810: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69  emPage *pPage, i
c820: 6e 74 20 66 6c 61 67 42 79 74 65 29 7b 0a 20 20  nt flagByte){.  
c830: 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20 20  BtShared *pBt;  
c840: 20 20 20 2f 2a 20 41 20 63 6f 70 79 20 6f 66 20     /* A copy of 
c850: 70 50 61 67 65 2d 3e 70 42 74 20 2a 2f 0a 0a 20  pPage->pBt */.. 
c860: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
c870: 68 64 72 4f 66 66 73 65 74 3d 3d 28 70 50 61 67  hdrOffset==(pPag
c880: 65 2d 3e 70 67 6e 6f 3d 3d 31 20 3f 20 31 30 30  e->pgno==1 ? 100
c890: 20 3a 20 30 29 20 29 3b 0a 20 20 61 73 73 65 72   : 0) );.  asser
c8a0: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
c8b0: 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
c8c0: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70 50  ->mutex) );.  pP
c8d0: 61 67 65 2d 3e 6c 65 61 66 20 3d 20 28 75 38 29  age->leaf = (u8)
c8e0: 28 66 6c 61 67 42 79 74 65 3e 3e 33 29 3b 20 20  (flagByte>>3);  
c8f0: 61 73 73 65 72 74 28 20 50 54 46 5f 4c 45 41 46  assert( PTF_LEAF
c900: 20 3d 3d 20 31 3c 3c 33 20 29 3b 0a 20 20 66 6c   == 1<<3 );.  fl
c910: 61 67 42 79 74 65 20 26 3d 20 7e 50 54 46 5f 4c  agByte &= ~PTF_L
c920: 45 41 46 3b 0a 20 20 70 50 61 67 65 2d 3e 63 68  EAF;.  pPage->ch
c930: 69 6c 64 50 74 72 53 69 7a 65 20 3d 20 34 2d 34  ildPtrSize = 4-4
c940: 2a 70 50 61 67 65 2d 3e 6c 65 61 66 3b 0a 20 20  *pPage->leaf;.  
c950: 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74  pBt = pPage->pBt
c960: 3b 0a 20 20 69 66 28 20 66 6c 61 67 42 79 74 65  ;.  if( flagByte
c970: 3d 3d 28 50 54 46 5f 4c 45 41 46 44 41 54 41 20  ==(PTF_LEAFDATA 
c980: 7c 20 50 54 46 5f 49 4e 54 4b 45 59 29 20 29 7b  | PTF_INTKEY) ){
c990: 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45  .    /* EVIDENCE
c9a0: 2d 4f 46 3a 20 52 2d 30 33 36 34 30 2d 31 33 34  -OF: R-03640-134
c9b0: 31 35 20 41 20 76 61 6c 75 65 20 6f 66 20 35 20  15 A value of 5 
c9c0: 6d 65 61 6e 73 20 74 68 65 20 70 61 67 65 20 69  means the page i
c9d0: 73 20 61 6e 20 69 6e 74 65 72 69 6f 72 0a 20 20  s an interior.  
c9e0: 20 20 2a 2a 20 74 61 62 6c 65 20 62 2d 74 72 65    ** table b-tre
c9f0: 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 61  e page. */.    a
ca00: 73 73 65 72 74 28 20 28 50 54 46 5f 4c 45 41 46  ssert( (PTF_LEAF
ca10: 44 41 54 41 7c 50 54 46 5f 49 4e 54 4b 45 59 29  DATA|PTF_INTKEY)
ca20: 3d 3d 35 20 29 3b 0a 20 20 20 20 2f 2a 20 45 56  ==5 );.    /* EV
ca30: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 30 35  IDENCE-OF: R-205
ca40: 30 31 2d 36 31 37 39 36 20 41 20 76 61 6c 75 65  01-61796 A value
ca50: 20 6f 66 20 31 33 20 6d 65 61 6e 73 20 74 68 65   of 13 means the
ca60: 20 70 61 67 65 20 69 73 20 61 20 6c 65 61 66 0a   page is a leaf.
ca70: 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 62 2d 74      ** table b-t
ca80: 72 65 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20  ree page. */.   
ca90: 20 61 73 73 65 72 74 28 20 28 50 54 46 5f 4c 45   assert( (PTF_LE
caa0: 41 46 44 41 54 41 7c 50 54 46 5f 49 4e 54 4b 45  AFDATA|PTF_INTKE
cab0: 59 7c 50 54 46 5f 4c 45 41 46 29 3d 3d 31 33 20  Y|PTF_LEAF)==13 
cac0: 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 6e  );.    pPage->in
cad0: 74 4b 65 79 20 3d 20 31 3b 0a 20 20 20 20 70 50  tKey = 1;.    pP
cae0: 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20  age->intKeyLeaf 
caf0: 3d 20 70 50 61 67 65 2d 3e 6c 65 61 66 3b 0a 20  = pPage->leaf;. 
cb00: 20 20 20 70 50 61 67 65 2d 3e 6e 6f 50 61 79 6c     pPage->noPayl
cb10: 6f 61 64 20 3d 20 21 70 50 61 67 65 2d 3e 6c 65  oad = !pPage->le
cb20: 61 66 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d  af;.    pPage->m
cb30: 61 78 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d  axLocal = pBt->m
cb40: 61 78 4c 65 61 66 3b 0a 20 20 20 20 70 50 61 67  axLeaf;.    pPag
cb50: 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 42  e->minLocal = pB
cb60: 74 2d 3e 6d 69 6e 4c 65 61 66 3b 0a 20 20 7d 65  t->minLeaf;.  }e
cb70: 6c 73 65 20 69 66 28 20 66 6c 61 67 42 79 74 65  lse if( flagByte
cb80: 3d 3d 50 54 46 5f 5a 45 52 4f 44 41 54 41 20 29  ==PTF_ZERODATA )
cb90: 7b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43  {.    /* EVIDENC
cba0: 45 2d 4f 46 3a 20 52 2d 32 37 32 32 35 2d 35 33  E-OF: R-27225-53
cbb0: 39 33 36 20 41 20 76 61 6c 75 65 20 6f 66 20 32  936 A value of 2
cbc0: 20 6d 65 61 6e 73 20 74 68 65 20 70 61 67 65 20   means the page 
cbd0: 69 73 20 61 6e 20 69 6e 74 65 72 69 6f 72 0a 20  is an interior. 
cbe0: 20 20 20 2a 2a 20 69 6e 64 65 78 20 62 2d 74 72     ** index b-tr
cbf0: 65 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20  ee page. */.    
cc00: 61 73 73 65 72 74 28 20 28 50 54 46 5f 5a 45 52  assert( (PTF_ZER
cc10: 4f 44 41 54 41 29 3d 3d 32 20 29 3b 0a 20 20 20  ODATA)==2 );.   
cc20: 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
cc30: 20 52 2d 31 36 35 37 31 2d 31 31 36 31 35 20 41   R-16571-11615 A
cc40: 20 76 61 6c 75 65 20 6f 66 20 31 30 20 6d 65 61   value of 10 mea
cc50: 6e 73 20 74 68 65 20 70 61 67 65 20 69 73 20 61  ns the page is a
cc60: 20 6c 65 61 66 0a 20 20 20 20 2a 2a 20 69 6e 64   leaf.    ** ind
cc70: 65 78 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20  ex b-tree page. 
cc80: 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  */.    assert( (
cc90: 50 54 46 5f 5a 45 52 4f 44 41 54 41 7c 50 54 46  PTF_ZERODATA|PTF
cca0: 5f 4c 45 41 46 29 3d 3d 31 30 20 29 3b 0a 20 20  _LEAF)==10 );.  
ccb0: 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20    pPage->intKey 
ccc0: 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  = 0;.    pPage->
ccd0: 69 6e 74 4b 65 79 4c 65 61 66 20 3d 20 30 3b 0a  intKeyLeaf = 0;.
cce0: 20 20 20 20 70 50 61 67 65 2d 3e 6e 6f 50 61 79      pPage->noPay
ccf0: 6c 6f 61 64 20 3d 20 30 3b 0a 20 20 20 20 70 50  load = 0;.    pP
cd00: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20  age->maxLocal = 
cd10: 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20  pBt->maxLocal;. 
cd20: 20 20 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63     pPage->minLoc
cd30: 61 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e 4c 6f 63  al = pBt->minLoc
cd40: 61 6c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  al;.  }else{.   
cd50: 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
cd60: 20 52 2d 34 37 36 30 38 2d 35 36 34 36 39 20 41   R-47608-56469 A
cd70: 6e 79 20 6f 74 68 65 72 20 76 61 6c 75 65 20 66  ny other value f
cd80: 6f 72 20 74 68 65 20 62 2d 74 72 65 65 20 70 61  or the b-tree pa
cd90: 67 65 20 74 79 70 65 20 69 73 0a 20 20 20 20 2a  ge type is.    *
cda0: 2a 20 61 6e 20 65 72 72 6f 72 2e 20 2a 2f 0a 20  * an error. */. 
cdb0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
cdc0: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
cdd0: 20 7d 0a 20 20 70 50 61 67 65 2d 3e 6d 61 78 31   }.  pPage->max1
cde0: 62 79 74 65 50 61 79 6c 6f 61 64 20 3d 20 70 42  bytePayload = pB
cdf0: 74 2d 3e 6d 61 78 31 62 79 74 65 50 61 79 6c 6f  t->max1bytePaylo
ce00: 61 64 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ad;.  return SQL
ce10: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
ce20: 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
ce30: 61 75 78 69 6c 69 61 72 79 20 69 6e 66 6f 72 6d  auxiliary inform
ce40: 61 74 69 6f 6e 20 66 6f 72 20 61 20 64 69 73 6b  ation for a disk
ce50: 20 62 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 52 65   block..**.** Re
ce60: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
ce70: 6e 20 73 75 63 63 65 73 73 2e 20 20 49 66 20 77  n success.  If w
ce80: 65 20 73 65 65 20 74 68 61 74 20 74 68 65 20 70  e see that the p
ce90: 61 67 65 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20  age does.** not 
cea0: 63 6f 6e 74 61 69 6e 20 61 20 77 65 6c 6c 2d 66  contain a well-f
ceb0: 6f 72 6d 65 64 20 64 61 74 61 62 61 73 65 20 70  ormed database p
cec0: 61 67 65 2c 20 74 68 65 6e 20 72 65 74 75 72 6e  age, then return
ced0: 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 52 52   .** SQLITE_CORR
cee0: 55 50 54 2e 20 20 4e 6f 74 65 20 74 68 61 74 20  UPT.  Note that 
cef0: 61 20 72 65 74 75 72 6e 20 6f 66 20 53 51 4c 49  a return of SQLI
cf00: 54 45 5f 4f 4b 20 64 6f 65 73 20 6e 6f 74 0a 2a  TE_OK does not.*
cf10: 2a 20 67 75 61 72 61 6e 74 65 65 20 74 68 61 74  * guarantee that
cf20: 20 74 68 65 20 70 61 67 65 20 69 73 20 77 65 6c   the page is wel
cf30: 6c 2d 66 6f 72 6d 65 64 2e 20 20 49 74 20 6f 6e  l-formed.  It on
cf40: 6c 79 20 73 68 6f 77 73 20 74 68 61 74 0a 2a 2a  ly shows that.**
cf50: 20 77 65 20 66 61 69 6c 65 64 20 74 6f 20 64 65   we failed to de
cf60: 74 65 63 74 20 61 6e 79 20 63 6f 72 72 75 70 74  tect any corrupt
cf70: 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ion..*/.static i
cf80: 6e 74 20 62 74 72 65 65 49 6e 69 74 50 61 67 65  nt btreeInitPage
cf90: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29  (MemPage *pPage)
cfa0: 7b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  {..  assert( pPa
cfb0: 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20  ge->pBt!=0 );.  
cfc0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
cfd0: 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
cfe0: 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
cff0: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
d000: 2d 3e 70 67 6e 6f 3d 3d 73 71 6c 69 74 65 33 50  ->pgno==sqlite3P
d010: 61 67 65 72 50 61 67 65 6e 75 6d 62 65 72 28 70  agerPagenumber(p
d020: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
d030: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
d040: 65 20 3d 3d 20 73 71 6c 69 74 65 33 50 61 67 65  e == sqlite3Page
d050: 72 47 65 74 45 78 74 72 61 28 70 50 61 67 65 2d  rGetExtra(pPage-
d060: 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61  >pDbPage) );.  a
d070: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 61 44  ssert( pPage->aD
d080: 61 74 61 20 3d 3d 20 73 71 6c 69 74 65 33 50 61  ata == sqlite3Pa
d090: 67 65 72 47 65 74 44 61 74 61 28 70 50 61 67 65  gerGetData(pPage
d0a0: 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20  ->pDbPage) );.. 
d0b0: 20 69 66 28 20 21 70 50 61 67 65 2d 3e 69 73 49   if( !pPage->isI
d0c0: 6e 69 74 20 29 7b 0a 20 20 20 20 75 31 36 20 70  nit ){.    u16 p
d0d0: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  c;            /*
d0e0: 20 41 64 64 72 65 73 73 20 6f 66 20 61 20 66 72   Address of a fr
d0f0: 65 65 62 6c 6f 63 6b 20 77 69 74 68 69 6e 20 70  eeblock within p
d100: 50 61 67 65 2d 3e 61 44 61 74 61 5b 5d 20 2a 2f  Page->aData[] */
d110: 0a 20 20 20 20 75 38 20 68 64 72 3b 20 20 20 20  .    u8 hdr;    
d120: 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
d130: 74 20 74 6f 20 62 65 67 69 6e 6e 69 6e 67 20 6f  t to beginning o
d140: 66 20 70 61 67 65 20 68 65 61 64 65 72 20 2a 2f  f page header */
d150: 0a 20 20 20 20 75 38 20 2a 64 61 74 61 3b 20 20  .    u8 *data;  
d160: 20 20 20 20 20 20 20 20 2f 2a 20 45 71 75 61 6c          /* Equal
d170: 20 74 6f 20 70 50 61 67 65 2d 3e 61 44 61 74 61   to pPage->aData
d180: 20 2a 2f 0a 20 20 20 20 42 74 53 68 61 72 65 64   */.    BtShared
d190: 20 2a 70 42 74 3b 20 20 20 20 20 20 20 20 2f 2a   *pBt;        /*
d1a0: 20 54 68 65 20 6d 61 69 6e 20 62 74 72 65 65 20   The main btree 
d1b0: 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 20  structure */.   
d1c0: 20 69 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 3b   int usableSize;
d1d0: 20 20 20 20 2f 2a 20 41 6d 6f 75 6e 74 20 6f 66      /* Amount of
d1e0: 20 75 73 61 62 6c 65 20 73 70 61 63 65 20 6f 6e   usable space on
d1f0: 20 65 61 63 68 20 70 61 67 65 20 2a 2f 0a 20 20   each page */.  
d200: 20 20 75 31 36 20 63 65 6c 6c 4f 66 66 73 65 74    u16 cellOffset
d210: 3b 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 66  ;    /* Offset f
d220: 72 6f 6d 20 73 74 61 72 74 20 6f 66 20 70 61 67  rom start of pag
d230: 65 20 74 6f 20 66 69 72 73 74 20 63 65 6c 6c 20  e to first cell 
d240: 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 20 20 69  pointer */.    i
d250: 6e 74 20 6e 46 72 65 65 3b 20 20 20 20 20 20 20  nt nFree;       
d260: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75    /* Number of u
d270: 6e 75 73 65 64 20 62 79 74 65 73 20 6f 6e 20 74  nused bytes on t
d280: 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 69  he page */.    i
d290: 6e 74 20 74 6f 70 3b 20 20 20 20 20 20 20 20 20  nt top;         
d2a0: 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20    /* First byte 
d2b0: 6f 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  of the cell cont
d2c0: 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20 20 20  ent area */.    
d2d0: 69 6e 74 20 69 43 65 6c 6c 46 69 72 73 74 3b 20  int iCellFirst; 
d2e0: 20 20 20 2f 2a 20 46 69 72 73 74 20 61 6c 6c 6f     /* First allo
d2f0: 77 61 62 6c 65 20 63 65 6c 6c 20 6f 72 20 66 72  wable cell or fr
d300: 65 65 62 6c 6f 63 6b 20 6f 66 66 73 65 74 20 2a  eeblock offset *
d310: 2f 0a 20 20 20 20 69 6e 74 20 69 43 65 6c 6c 4c  /.    int iCellL
d320: 61 73 74 3b 20 20 20 20 20 2f 2a 20 4c 61 73 74  ast;     /* Last
d330: 20 70 6f 73 73 69 62 6c 65 20 63 65 6c 6c 20 6f   possible cell o
d340: 72 20 66 72 65 65 62 6c 6f 63 6b 20 6f 66 66 73  r freeblock offs
d350: 65 74 20 2a 2f 0a 0a 20 20 20 20 70 42 74 20 3d  et */..    pBt =
d360: 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 0a 20 20   pPage->pBt;..  
d370: 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68    hdr = pPage->h
d380: 64 72 4f 66 66 73 65 74 3b 0a 20 20 20 20 64 61  drOffset;.    da
d390: 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74  ta = pPage->aDat
d3a0: 61 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  a;.    /* EVIDEN
d3b0: 43 45 2d 4f 46 3a 20 52 2d 32 38 35 39 34 2d 30  CE-OF: R-28594-0
d3c0: 32 38 39 30 20 54 68 65 20 6f 6e 65 2d 62 79 74  2890 The one-byt
d3d0: 65 20 66 6c 61 67 20 61 74 20 6f 66 66 73 65 74  e flag at offset
d3e0: 20 30 20 69 6e 64 69 63 61 74 69 6e 67 0a 20 20   0 indicating.  
d3f0: 20 20 2a 2a 20 74 68 65 20 62 2d 74 72 65 65 20    ** the b-tree 
d400: 70 61 67 65 20 74 79 70 65 2e 20 2a 2f 0a 20 20  page type. */.  
d410: 20 20 69 66 28 20 64 65 63 6f 64 65 46 6c 61 67    if( decodeFlag
d420: 73 28 70 50 61 67 65 2c 20 64 61 74 61 5b 68 64  s(pPage, data[hd
d430: 72 5d 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c  r]) ) return SQL
d440: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
d450: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42  ;.    assert( pB
d460: 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3d 35 31 32  t->pageSize>=512
d470: 20 26 26 20 70 42 74 2d 3e 70 61 67 65 53 69 7a   && pBt->pageSiz
d480: 65 3c 3d 36 35 35 33 36 20 29 3b 0a 20 20 20 20  e<=65536 );.    
d490: 70 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65 20  pPage->maskPage 
d4a0: 3d 20 28 75 31 36 29 28 70 42 74 2d 3e 70 61 67  = (u16)(pBt->pag
d4b0: 65 53 69 7a 65 20 2d 20 31 29 3b 0a 20 20 20 20  eSize - 1);.    
d4c0: 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
d4d0: 20 3d 20 30 3b 0a 20 20 20 20 75 73 61 62 6c 65   = 0;.    usable
d4e0: 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61 62  Size = pBt->usab
d4f0: 6c 65 53 69 7a 65 3b 0a 20 20 20 20 70 50 61 67  leSize;.    pPag
d500: 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20  e->cellOffset = 
d510: 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 68 64 72  cellOffset = hdr
d520: 20 2b 20 38 20 2b 20 70 50 61 67 65 2d 3e 63 68   + 8 + pPage->ch
d530: 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20 20 20  ildPtrSize;.    
d540: 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20  pPage->aDataEnd 
d550: 3d 20 26 64 61 74 61 5b 75 73 61 62 6c 65 53 69  = &data[usableSi
d560: 7a 65 5d 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  ze];.    pPage->
d570: 61 43 65 6c 6c 49 64 78 20 3d 20 26 64 61 74 61  aCellIdx = &data
d580: 5b 63 65 6c 6c 4f 66 66 73 65 74 5d 3b 0a 20 20  [cellOffset];.  
d590: 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
d5a0: 3a 20 52 2d 35 38 30 31 35 2d 34 38 31 37 35 20  : R-58015-48175 
d5b0: 54 68 65 20 74 77 6f 2d 62 79 74 65 20 69 6e 74  The two-byte int
d5c0: 65 67 65 72 20 61 74 20 6f 66 66 73 65 74 20 35  eger at offset 5
d5d0: 20 64 65 73 69 67 6e 61 74 65 73 0a 20 20 20 20   designates.    
d5e0: 2a 2a 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  ** the start of 
d5f0: 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
d600: 20 61 72 65 61 2e 20 41 20 7a 65 72 6f 20 76 61   area. A zero va
d610: 6c 75 65 20 66 6f 72 20 74 68 69 73 20 69 6e 74  lue for this int
d620: 65 67 65 72 20 69 73 0a 20 20 20 20 2a 2a 20 69  eger is.    ** i
d630: 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 36 35  nterpreted as 65
d640: 35 33 36 2e 20 2a 2f 0a 20 20 20 20 74 6f 70 20  536. */.    top 
d650: 3d 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65 72  = get2byteNotZer
d660: 6f 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b  o(&data[hdr+5]);
d670: 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45  .    /* EVIDENCE
d680: 2d 4f 46 3a 20 52 2d 33 37 30 30 32 2d 33 32 37  -OF: R-37002-327
d690: 37 34 20 54 68 65 20 74 77 6f 2d 62 79 74 65 20  74 The two-byte 
d6a0: 69 6e 74 65 67 65 72 20 61 74 20 6f 66 66 73 65  integer at offse
d6b0: 74 20 33 20 67 69 76 65 73 20 74 68 65 0a 20 20  t 3 gives the.  
d6c0: 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 63    ** number of c
d6d0: 65 6c 6c 73 20 6f 6e 20 74 68 65 20 70 61 67 65  ells on the page
d6e0: 2e 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 2d 3e  . */.    pPage->
d6f0: 6e 43 65 6c 6c 20 3d 20 67 65 74 32 62 79 74 65  nCell = get2byte
d700: 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 29 3b 0a  (&data[hdr+3]);.
d710: 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e      if( pPage->n
d720: 43 65 6c 6c 3e 4d 58 5f 43 45 4c 4c 28 70 42 74  Cell>MX_CELL(pBt
d730: 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 6f  ) ){.      /* To
d740: 20 6d 61 6e 79 20 63 65 6c 6c 73 20 66 6f 72 20   many cells for 
d750: 61 20 73 69 6e 67 6c 65 20 70 61 67 65 2e 20 20  a single page.  
d760: 54 68 65 20 70 61 67 65 20 6d 75 73 74 20 62 65  The page must be
d770: 20 63 6f 72 72 75 70 74 20 2a 2f 0a 20 20 20 20   corrupt */.    
d780: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
d790: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
d7a0: 20 20 7d 0a 20 20 20 20 74 65 73 74 63 61 73 65    }.    testcase
d7b0: 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d  ( pPage->nCell==
d7c0: 4d 58 5f 43 45 4c 4c 28 70 42 74 29 20 29 3b 0a  MX_CELL(pBt) );.
d7d0: 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
d7e0: 4f 46 3a 20 52 2d 32 34 30 38 39 2d 35 37 39 37  OF: R-24089-5797
d7f0: 39 20 49 66 20 61 20 70 61 67 65 20 63 6f 6e 74  9 If a page cont
d800: 61 69 6e 73 20 6e 6f 20 63 65 6c 6c 73 20 28 77  ains no cells (w
d810: 68 69 63 68 20 69 73 20 6f 6e 6c 79 0a 20 20 20  hich is only.   
d820: 20 2a 2a 20 70 6f 73 73 69 62 6c 65 20 66 6f 72   ** possible for
d830: 20 61 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20   a root page of 
d840: 61 20 74 61 62 6c 65 20 74 68 61 74 20 63 6f 6e  a table that con
d850: 74 61 69 6e 73 20 6e 6f 20 72 6f 77 73 29 20 74  tains no rows) t
d860: 68 65 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f  hen the.    ** o
d870: 66 66 73 65 74 20 74 6f 20 74 68 65 20 63 65 6c  ffset to the cel
d880: 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 77  l content area w
d890: 69 6c 6c 20 65 71 75 61 6c 20 74 68 65 20 70 61  ill equal the pa
d8a0: 67 65 20 73 69 7a 65 20 6d 69 6e 75 73 20 74 68  ge size minus th
d8b0: 65 0a 20 20 20 20 2a 2a 20 62 79 74 65 73 20 6f  e.    ** bytes o
d8c0: 66 20 72 65 73 65 72 76 65 64 20 73 70 61 63 65  f reserved space
d8d0: 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  . */.    assert(
d8e0: 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20   pPage->nCell>0 
d8f0: 7c 7c 20 74 6f 70 3d 3d 75 73 61 62 6c 65 53 69  || top==usableSi
d900: 7a 65 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42  ze || CORRUPT_DB
d910: 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 41 20 6d 61   );..    /* A ma
d920: 6c 66 6f 72 6d 65 64 20 64 61 74 61 62 61 73 65  lformed database
d930: 20 70 61 67 65 20 6d 69 67 68 74 20 63 61 75 73   page might caus
d940: 65 20 75 73 20 74 6f 20 72 65 61 64 20 70 61 73  e us to read pas
d950: 74 20 74 68 65 20 65 6e 64 0a 20 20 20 20 2a 2a  t the end.    **
d960: 20 6f 66 20 70 61 67 65 20 77 68 65 6e 20 70 61   of page when pa
d970: 72 73 69 6e 67 20 61 20 63 65 6c 6c 2e 20 20 0a  rsing a cell.  .
d980: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
d990: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63  e following bloc
d9a0: 6b 20 6f 66 20 63 6f 64 65 20 63 68 65 63 6b 73  k of code checks
d9b0: 20 65 61 72 6c 79 20 74 6f 20 73 65 65 20 69 66   early to see if
d9c0: 20 61 20 63 65 6c 6c 20 65 78 74 65 6e 64 73 0a   a cell extends.
d9d0: 20 20 20 20 2a 2a 20 70 61 73 74 20 74 68 65 20      ** past the 
d9e0: 65 6e 64 20 6f 66 20 61 20 70 61 67 65 20 62 6f  end of a page bo
d9f0: 75 6e 64 61 72 79 20 61 6e 64 20 63 61 75 73 65  undary and cause
da00: 73 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  s SQLITE_CORRUPT
da10: 20 74 6f 20 62 65 20 0a 20 20 20 20 2a 2a 20 72   to be .    ** r
da20: 65 74 75 72 6e 65 64 20 69 66 20 69 74 20 64 6f  eturned if it do
da30: 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  es..    */.    i
da40: 43 65 6c 6c 46 69 72 73 74 20 3d 20 63 65 6c 6c  CellFirst = cell
da50: 4f 66 66 73 65 74 20 2b 20 32 2a 70 50 61 67 65  Offset + 2*pPage
da60: 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 20 20 69 43 65  ->nCell;.    iCe
da70: 6c 6c 4c 61 73 74 20 3d 20 75 73 61 62 6c 65 53  llLast = usableS
da80: 69 7a 65 20 2d 20 34 3b 0a 23 69 66 20 64 65 66  ize - 4;.#if def
da90: 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
daa0: 4c 45 5f 4f 56 45 52 53 49 5a 45 5f 43 45 4c 4c  LE_OVERSIZE_CELL
dab0: 5f 43 48 45 43 4b 29 0a 20 20 20 20 7b 0a 20 20  _CHECK).    {.  
dac0: 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20      int i;      
dad0: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69        /* Index i
dae0: 6e 74 6f 20 74 68 65 20 63 65 6c 6c 20 70 6f 69  nto the cell poi
daf0: 6e 74 65 72 20 61 72 72 61 79 20 2a 2f 0a 20 20  nter array */.  
db00: 20 20 20 20 69 6e 74 20 73 7a 3b 20 20 20 20 20      int sz;     
db10: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
db20: 20 61 20 63 65 6c 6c 20 2a 2f 0a 0a 20 20 20 20   a cell */..    
db30: 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
db40: 61 66 20 29 20 69 43 65 6c 6c 4c 61 73 74 2d 2d  af ) iCellLast--
db50: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
db60: 20 69 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b   i<pPage->nCell;
db70: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70   i++){.        p
db80: 63 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  c = get2byte(&da
db90: 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74 2b 69 2a  ta[cellOffset+i*
dba0: 32 5d 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  2]);.        tes
dbb0: 74 63 61 73 65 28 20 70 63 3d 3d 69 43 65 6c 6c  tcase( pc==iCell
dbc0: 46 69 72 73 74 20 29 3b 0a 20 20 20 20 20 20 20  First );.       
dbd0: 20 74 65 73 74 63 61 73 65 28 20 70 63 3d 3d 69   testcase( pc==i
dbe0: 43 65 6c 6c 4c 61 73 74 20 29 3b 0a 20 20 20 20  CellLast );.    
dbf0: 20 20 20 20 69 66 28 20 70 63 3c 69 43 65 6c 6c      if( pc<iCell
dc00: 46 69 72 73 74 20 7c 7c 20 70 63 3e 69 43 65 6c  First || pc>iCel
dc10: 6c 4c 61 73 74 20 29 7b 0a 20 20 20 20 20 20 20  lLast ){.       
dc20: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
dc30: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
dc40: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
dc50: 20 73 7a 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74   sz = cellSizePt
dc60: 72 28 70 50 61 67 65 2c 20 26 64 61 74 61 5b 70  r(pPage, &data[p
dc70: 63 5d 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  c]);.        tes
dc80: 74 63 61 73 65 28 20 70 63 2b 73 7a 3d 3d 75 73  tcase( pc+sz==us
dc90: 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20  ableSize );.    
dca0: 20 20 20 20 69 66 28 20 70 63 2b 73 7a 3e 75 73      if( pc+sz>us
dcb0: 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20  ableSize ){.    
dcc0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
dcd0: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
dce0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
dcf0: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21 70    }.      if( !p
dd00: 50 61 67 65 2d 3e 6c 65 61 66 20 29 20 69 43 65  Page->leaf ) iCe
dd10: 6c 6c 4c 61 73 74 2b 2b 3b 0a 20 20 20 20 7d 20  llLast++;.    } 
dd20: 20 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a   .#endif..    /*
dd30: 20 43 6f 6d 70 75 74 65 20 74 68 65 20 74 6f 74   Compute the tot
dd40: 61 6c 20 66 72 65 65 20 73 70 61 63 65 20 6f 6e  al free space on
dd50: 20 74 68 65 20 70 61 67 65 0a 20 20 20 20 2a 2a   the page.    **
dd60: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
dd70: 32 33 35 38 38 2d 33 34 34 35 30 20 54 68 65 20  23588-34450 The 
dd80: 74 77 6f 2d 62 79 74 65 20 69 6e 74 65 67 65 72  two-byte integer
dd90: 20 61 74 20 6f 66 66 73 65 74 20 31 20 67 69 76   at offset 1 giv
dda0: 65 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 73 74  es the.    ** st
ddb0: 61 72 74 20 6f 66 20 74 68 65 20 66 69 72 73 74  art of the first
ddc0: 20 66 72 65 65 62 6c 6f 63 6b 20 6f 6e 20 74 68   freeblock on th
ddd0: 65 20 70 61 67 65 2c 20 6f 72 20 69 73 20 7a 65  e page, or is ze
dde0: 72 6f 20 69 66 20 74 68 65 72 65 20 61 72 65 20  ro if there are 
ddf0: 6e 6f 0a 20 20 20 20 2a 2a 20 66 72 65 65 62 6c  no.    ** freebl
de00: 6f 63 6b 73 2e 20 2a 2f 0a 20 20 20 20 70 63 20  ocks. */.    pc 
de10: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
de20: 5b 68 64 72 2b 31 5d 29 3b 0a 20 20 20 20 6e 46  [hdr+1]);.    nF
de30: 72 65 65 20 3d 20 64 61 74 61 5b 68 64 72 2b 37  ree = data[hdr+7
de40: 5d 20 2b 20 74 6f 70 3b 20 20 2f 2a 20 49 6e 69  ] + top;  /* Ini
de50: 74 20 6e 46 72 65 65 20 74 6f 20 6e 6f 6e 2d 66  t nFree to non-f
de60: 72 65 65 62 6c 6f 63 6b 20 66 72 65 65 20 73 70  reeblock free sp
de70: 61 63 65 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65  ace */.    while
de80: 28 20 70 63 3e 30 20 29 7b 0a 20 20 20 20 20 20  ( pc>0 ){.      
de90: 75 31 36 20 6e 65 78 74 2c 20 73 69 7a 65 3b 0a  u16 next, size;.
dea0: 20 20 20 20 20 20 69 66 28 20 70 63 3c 69 43 65        if( pc<iCe
deb0: 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63 3e 69 43  llFirst || pc>iC
dec0: 65 6c 6c 4c 61 73 74 20 29 7b 0a 20 20 20 20 20  ellLast ){.     
ded0: 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
dee0: 46 3a 20 52 2d 35 35 35 33 30 2d 35 32 39 33 30  F: R-55530-52930
def0: 20 49 6e 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65   In a well-forme
df00: 64 20 62 2d 74 72 65 65 20 70 61 67 65 2c 20 74  d b-tree page, t
df10: 68 65 72 65 20 77 69 6c 6c 0a 20 20 20 20 20 20  here will.      
df20: 20 20 2a 2a 20 61 6c 77 61 79 73 20 62 65 20 61    ** always be a
df30: 74 20 6c 65 61 73 74 20 6f 6e 65 20 63 65 6c 6c  t least one cell
df40: 20 62 65 66 6f 72 65 20 74 68 65 20 66 69 72 73   before the firs
df50: 74 20 66 72 65 65 62 6c 6f 63 6b 2e 0a 20 20 20  t freeblock..   
df60: 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
df70: 2a 2a 20 4f 72 2c 20 74 68 65 20 66 72 65 65 62  ** Or, the freeb
df80: 6c 6f 63 6b 20 69 73 20 6f 66 66 20 74 68 65 20  lock is off the 
df90: 65 6e 64 20 6f 66 20 74 68 65 20 70 61 67 65 0a  end of the page.
dfa0: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
dfb0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
dfc0: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a  _CORRUPT_BKPT; .
dfd0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 65        }.      ne
dfe0: 78 74 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  xt = get2byte(&d
dff0: 61 74 61 5b 70 63 5d 29 3b 0a 20 20 20 20 20 20  ata[pc]);.      
e000: 73 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28  size = get2byte(
e010: 26 64 61 74 61 5b 70 63 2b 32 5d 29 3b 0a 20 20  &data[pc+2]);.  
e020: 20 20 20 20 69 66 28 20 28 6e 65 78 74 3e 30 20      if( (next>0 
e030: 26 26 20 6e 65 78 74 3c 3d 70 63 2b 73 69 7a 65  && next<=pc+size
e040: 2b 33 29 20 7c 7c 20 70 63 2b 73 69 7a 65 3e 75  +3) || pc+size>u
e050: 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20  sableSize ){.   
e060: 20 20 20 20 20 2f 2a 20 46 72 65 65 20 62 6c 6f       /* Free blo
e070: 63 6b 73 20 6d 75 73 74 20 62 65 20 69 6e 20 61  cks must be in a
e080: 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 20  scending order. 
e090: 41 6e 64 20 74 68 65 20 6c 61 73 74 20 62 79 74  And the last byt
e0a0: 65 20 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a 20  e of.        ** 
e0b0: 74 68 65 20 66 72 65 65 2d 62 6c 6f 63 6b 20 6d  the free-block m
e0c0: 75 73 74 20 6c 69 65 20 6f 6e 20 74 68 65 20 64  ust lie on the d
e0d0: 61 74 61 62 61 73 65 20 70 61 67 65 2e 20 20 2a  atabase page.  *
e0e0: 2f 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  /.        return
e0f0: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
e100: 42 4b 50 54 3b 20 0a 20 20 20 20 20 20 7d 0a 20  BKPT; .      }. 
e110: 20 20 20 20 20 6e 46 72 65 65 20 3d 20 6e 46 72       nFree = nFr
e120: 65 65 20 2b 20 73 69 7a 65 3b 0a 20 20 20 20 20  ee + size;.     
e130: 20 70 63 20 3d 20 6e 65 78 74 3b 0a 20 20 20 20   pc = next;.    
e140: 7d 0a 0a 20 20 20 20 2f 2a 20 41 74 20 74 68 69  }..    /* At thi
e150: 73 20 70 6f 69 6e 74 2c 20 6e 46 72 65 65 20 63  s point, nFree c
e160: 6f 6e 74 61 69 6e 73 20 74 68 65 20 73 75 6d 20  ontains the sum 
e170: 6f 66 20 74 68 65 20 6f 66 66 73 65 74 20 74 6f  of the offset to
e180: 20 74 68 65 20 73 74 61 72 74 0a 20 20 20 20 2a   the start.    *
e190: 2a 20 6f 66 20 74 68 65 20 63 65 6c 6c 2d 63 6f  * of the cell-co
e1a0: 6e 74 65 6e 74 20 61 72 65 61 20 70 6c 75 73 20  ntent area plus 
e1b0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 72  the number of fr
e1c0: 65 65 20 62 79 74 65 73 20 77 69 74 68 69 6e 0a  ee bytes within.
e1d0: 20 20 20 20 2a 2a 20 74 68 65 20 63 65 6c 6c 2d      ** the cell-
e1e0: 63 6f 6e 74 65 6e 74 20 61 72 65 61 2e 20 49 66  content area. If
e1f0: 20 74 68 69 73 20 69 73 20 67 72 65 61 74 65 72   this is greater
e200: 20 74 68 61 6e 20 74 68 65 20 75 73 61 62 6c 65   than the usable
e210: 2d 73 69 7a 65 0a 20 20 20 20 2a 2a 20 6f 66 20  -size.    ** of 
e220: 74 68 65 20 70 61 67 65 2c 20 74 68 65 6e 20 74  the page, then t
e230: 68 65 20 70 61 67 65 20 6d 75 73 74 20 62 65 20  he page must be 
e240: 63 6f 72 72 75 70 74 65 64 2e 20 54 68 69 73 20  corrupted. This 
e250: 63 68 65 63 6b 20 61 6c 73 6f 0a 20 20 20 20 2a  check also.    *
e260: 2a 20 73 65 72 76 65 73 20 74 6f 20 76 65 72 69  * serves to veri
e270: 66 79 20 74 68 61 74 20 74 68 65 20 6f 66 66 73  fy that the offs
e280: 65 74 20 74 6f 20 74 68 65 20 73 74 61 72 74 20  et to the start 
e290: 6f 66 20 74 68 65 20 63 65 6c 6c 2d 63 6f 6e 74  of the cell-cont
e2a0: 65 6e 74 0a 20 20 20 20 2a 2a 20 61 72 65 61 2c  ent.    ** area,
e2b0: 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68   according to th
e2c0: 65 20 70 61 67 65 20 68 65 61 64 65 72 2c 20 6c  e page header, l
e2d0: 69 65 73 20 77 69 74 68 69 6e 20 74 68 65 20 70  ies within the p
e2e0: 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  age..    */.    
e2f0: 69 66 28 20 6e 46 72 65 65 3e 75 73 61 62 6c 65  if( nFree>usable
e300: 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 72 65  Size ){.      re
e310: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
e320: 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20 20 20 7d  UPT_BKPT; .    }
e330: 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 46 72 65  .    pPage->nFre
e340: 65 20 3d 20 28 75 31 36 29 28 6e 46 72 65 65 20  e = (u16)(nFree 
e350: 2d 20 69 43 65 6c 6c 46 69 72 73 74 29 3b 0a 20  - iCellFirst);. 
e360: 20 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74     pPage->isInit
e370: 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 1;.  }.  retu
e380: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
e390: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 75 70 20 61 20  ./*.** Set up a 
e3a0: 72 61 77 20 70 61 67 65 20 73 6f 20 74 68 61 74  raw page so that
e3b0: 20 69 74 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20 61   it looks like a
e3c0: 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20 68   database page h
e3d0: 6f 6c 64 69 6e 67 0a 2a 2a 20 6e 6f 20 65 6e 74  olding.** no ent
e3e0: 72 69 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ries..*/.static 
e3f0: 76 6f 69 64 20 7a 65 72 6f 50 61 67 65 28 4d 65  void zeroPage(Me
e400: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e  mPage *pPage, in
e410: 74 20 66 6c 61 67 73 29 7b 0a 20 20 75 6e 73 69  t flags){.  unsi
e420: 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61 20  gned char *data 
e430: 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a  = pPage->aData;.
e440: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
e450: 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20  = pPage->pBt;.  
e460: 75 38 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e  u8 hdr = pPage->
e470: 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 75 31 36  hdrOffset;.  u16
e480: 20 66 69 72 73 74 3b 0a 0a 20 20 61 73 73 65 72   first;..  asser
e490: 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 50  t( sqlite3PagerP
e4a0: 61 67 65 6e 75 6d 62 65 72 28 70 50 61 67 65 2d  agenumber(pPage-
e4b0: 3e 70 44 62 50 61 67 65 29 3d 3d 70 50 61 67 65  >pDbPage)==pPage
e4c0: 2d 3e 70 67 6e 6f 20 29 3b 0a 20 20 61 73 73 65  ->pgno );.  asse
e4d0: 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
e4e0: 47 65 74 45 78 74 72 61 28 70 50 61 67 65 2d 3e  GetExtra(pPage->
e4f0: 70 44 62 50 61 67 65 29 20 3d 3d 20 28 76 6f 69  pDbPage) == (voi
e500: 64 2a 29 70 50 61 67 65 20 29 3b 0a 20 20 61 73  d*)pPage );.  as
e510: 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
e520: 65 72 47 65 74 44 61 74 61 28 70 50 61 67 65 2d  erGetData(pPage-
e530: 3e 70 44 62 50 61 67 65 29 20 3d 3d 20 64 61 74  >pDbPage) == dat
e540: 61 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  a );.  assert( s
e550: 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
e560: 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
e570: 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65  bPage) );.  asse
e580: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
e590: 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
e5a0: 78 29 20 29 3b 0a 20 20 69 66 28 20 70 42 74 2d  x) );.  if( pBt-
e5b0: 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f  >btsFlags & BTS_
e5c0: 53 45 43 55 52 45 5f 44 45 4c 45 54 45 20 29 7b  SECURE_DELETE ){
e5d0: 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 64 61 74  .    memset(&dat
e5e0: 61 5b 68 64 72 5d 2c 20 30 2c 20 70 42 74 2d 3e  a[hdr], 0, pBt->
e5f0: 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 68 64 72  usableSize - hdr
e600: 29 3b 0a 20 20 7d 0a 20 20 64 61 74 61 5b 68 64  );.  }.  data[hd
e610: 72 5d 20 3d 20 28 63 68 61 72 29 66 6c 61 67 73  r] = (char)flags
e620: 3b 0a 20 20 66 69 72 73 74 20 3d 20 68 64 72 20  ;.  first = hdr 
e630: 2b 20 28 28 66 6c 61 67 73 26 50 54 46 5f 4c 45  + ((flags&PTF_LE
e640: 41 46 29 3d 3d 30 20 3f 20 31 32 20 3a 20 38 29  AF)==0 ? 12 : 8)
e650: 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61  ;.  memset(&data
e660: 5b 68 64 72 2b 31 5d 2c 20 30 2c 20 34 29 3b 0a  [hdr+1], 0, 4);.
e670: 20 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20    data[hdr+7] = 
e680: 30 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64  0;.  put2byte(&d
e690: 61 74 61 5b 68 64 72 2b 35 5d 2c 20 70 42 74 2d  ata[hdr+5], pBt-
e6a0: 3e 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20  >usableSize);.  
e6b0: 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20 28  pPage->nFree = (
e6c0: 75 31 36 29 28 70 42 74 2d 3e 75 73 61 62 6c 65  u16)(pBt->usable
e6d0: 53 69 7a 65 20 2d 20 66 69 72 73 74 29 3b 0a 20  Size - first);. 
e6e0: 20 64 65 63 6f 64 65 46 6c 61 67 73 28 70 50 61   decodeFlags(pPa
e6f0: 67 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 50  ge, flags);.  pP
e700: 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20  age->cellOffset 
e710: 3d 20 66 69 72 73 74 3b 0a 20 20 70 50 61 67 65  = first;.  pPage
e720: 2d 3e 61 44 61 74 61 45 6e 64 20 3d 20 26 64 61  ->aDataEnd = &da
e730: 74 61 5b 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  ta[pBt->usableSi
e740: 7a 65 5d 3b 0a 20 20 70 50 61 67 65 2d 3e 61 43  ze];.  pPage->aC
e750: 65 6c 6c 49 64 78 20 3d 20 26 64 61 74 61 5b 66  ellIdx = &data[f
e760: 69 72 73 74 5d 3b 0a 20 20 70 50 61 67 65 2d 3e  irst];.  pPage->
e770: 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20  nOverflow = 0;. 
e780: 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70 61   assert( pBt->pa
e790: 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70  geSize>=512 && p
e7a0: 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c 3d 36 35  Bt->pageSize<=65
e7b0: 35 33 36 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e  536 );.  pPage->
e7c0: 6d 61 73 6b 50 61 67 65 20 3d 20 28 75 31 36 29  maskPage = (u16)
e7d0: 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d  (pBt->pageSize -
e7e0: 20 31 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 43   1);.  pPage->nC
e7f0: 65 6c 6c 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  ell = 0;.  pPage
e800: 2d 3e 69 73 49 6e 69 74 20 3d 20 31 3b 0a 7d 0a  ->isInit = 1;.}.
e810: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20  ../*.** Convert 
e820: 61 20 44 62 50 61 67 65 20 6f 62 74 61 69 6e 65  a DbPage obtaine
e830: 64 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72  d from the pager
e840: 20 69 6e 74 6f 20 61 20 4d 65 6d 50 61 67 65 20   into a MemPage 
e850: 75 73 65 64 20 62 79 0a 2a 2a 20 74 68 65 20 62  used by.** the b
e860: 74 72 65 65 20 6c 61 79 65 72 2e 0a 2a 2f 0a 73  tree layer..*/.s
e870: 74 61 74 69 63 20 4d 65 6d 50 61 67 65 20 2a 62  tatic MemPage *b
e880: 74 72 65 65 50 61 67 65 46 72 6f 6d 44 62 50 61  treePageFromDbPa
e890: 67 65 28 44 62 50 61 67 65 20 2a 70 44 62 50 61  ge(DbPage *pDbPa
e8a0: 67 65 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 42  ge, Pgno pgno, B
e8b0: 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20  tShared *pBt){. 
e8c0: 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20   MemPage *pPage 
e8d0: 3d 20 28 4d 65 6d 50 61 67 65 2a 29 73 71 6c 69  = (MemPage*)sqli
e8e0: 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61  te3PagerGetExtra
e8f0: 28 70 44 62 50 61 67 65 29 3b 0a 20 20 70 50 61  (pDbPage);.  pPa
e900: 67 65 2d 3e 61 44 61 74 61 20 3d 20 73 71 6c 69  ge->aData = sqli
e910: 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28  te3PagerGetData(
e920: 70 44 62 50 61 67 65 29 3b 0a 20 20 70 50 61 67  pDbPage);.  pPag
e930: 65 2d 3e 70 44 62 50 61 67 65 20 3d 20 70 44 62  e->pDbPage = pDb
e940: 50 61 67 65 3b 0a 20 20 70 50 61 67 65 2d 3e 70  Page;.  pPage->p
e950: 42 74 20 3d 20 70 42 74 3b 0a 20 20 70 50 61 67  Bt = pBt;.  pPag
e960: 65 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a  e->pgno = pgno;.
e970: 20 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73    pPage->hdrOffs
e980: 65 74 20 3d 20 70 50 61 67 65 2d 3e 70 67 6e 6f  et = pPage->pgno
e990: 3d 3d 31 20 3f 20 31 30 30 20 3a 20 30 3b 0a 20  ==1 ? 100 : 0;. 
e9a0: 20 72 65 74 75 72 6e 20 70 50 61 67 65 3b 20 0a   return pPage; .
e9b0: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 70  }../*.** Get a p
e9c0: 61 67 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67  age from the pag
e9d0: 65 72 2e 20 20 49 6e 69 74 69 61 6c 69 7a 65 20  er.  Initialize 
e9e0: 74 68 65 20 4d 65 6d 50 61 67 65 2e 70 42 74 20  the MemPage.pBt 
e9f0: 61 6e 64 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e 61  and.** MemPage.a
ea00: 44 61 74 61 20 65 6c 65 6d 65 6e 74 73 20 69 66  Data elements if
ea10: 20 6e 65 65 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 49   needed..**.** I
ea20: 66 20 74 68 65 20 6e 6f 43 6f 6e 74 65 6e 74 20  f the noContent 
ea30: 66 6c 61 67 20 69 73 20 73 65 74 2c 20 69 74 20  flag is set, it 
ea40: 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20 64 6f  means that we do
ea50: 20 6e 6f 74 20 63 61 72 65 20 61 62 6f 75 74 0a   not care about.
ea60: 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  ** the content o
ea70: 66 20 74 68 65 20 70 61 67 65 20 61 74 20 74 68  f the page at th
ea80: 69 73 20 74 69 6d 65 2e 20 20 53 6f 20 64 6f 20  is time.  So do 
ea90: 6e 6f 74 20 67 6f 20 74 6f 20 74 68 65 20 64 69  not go to the di
eaa0: 73 6b 0a 2a 2a 20 74 6f 20 66 65 74 63 68 20 74  sk.** to fetch t
eab0: 68 65 20 63 6f 6e 74 65 6e 74 2e 20 20 4a 75 73  he content.  Jus
eac0: 74 20 66 69 6c 6c 20 69 6e 20 74 68 65 20 63 6f  t fill in the co
ead0: 6e 74 65 6e 74 20 77 69 74 68 20 7a 65 72 6f 73  ntent with zeros
eae0: 20 66 6f 72 20 6e 6f 77 2e 0a 2a 2a 20 49 66 20   for now..** If 
eaf0: 69 6e 20 74 68 65 20 66 75 74 75 72 65 20 77 65  in the future we
eb00: 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 50 61 67   call sqlite3Pag
eb10: 65 72 57 72 69 74 65 28 29 20 6f 6e 20 74 68 69  erWrite() on thi
eb20: 73 20 70 61 67 65 2c 20 74 68 61 74 0a 2a 2a 20  s page, that.** 
eb30: 6d 65 61 6e 73 20 77 65 20 68 61 76 65 20 73 74  means we have st
eb40: 61 72 74 65 64 20 74 6f 20 62 65 20 63 6f 6e 63  arted to be conc
eb50: 65 72 6e 65 64 20 61 62 6f 75 74 20 63 6f 6e 74  erned about cont
eb60: 65 6e 74 20 61 6e 64 20 74 68 65 20 64 69 73 6b  ent and the disk
eb70: 0a 2a 2a 20 72 65 61 64 20 73 68 6f 75 6c 64 20  .** read should 
eb80: 6f 63 63 75 72 20 61 74 20 74 68 61 74 20 70 6f  occur at that po
eb90: 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  int..*/.static i
eba0: 6e 74 20 62 74 72 65 65 47 65 74 50 61 67 65 28  nt btreeGetPage(
ebb0: 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
ebc0: 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62  ,       /* The b
ebd0: 74 72 65 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70  tree */.  Pgno p
ebe0: 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20 2f  gno,           /
ebf0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  * Number of the 
ec00: 70 61 67 65 20 74 6f 20 66 65 74 63 68 20 2a 2f  page to fetch */
ec10: 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50  .  MemPage **ppP
ec20: 61 67 65 2c 20 20 20 20 2f 2a 20 52 65 74 75 72  age,    /* Retur
ec30: 6e 20 74 68 65 20 70 61 67 65 20 69 6e 20 74 68  n the page in th
ec40: 69 73 20 70 61 72 61 6d 65 74 65 72 20 2a 2f 0a  is parameter */.
ec50: 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20    int flags     
ec60: 20 20 20 20 20 20 20 2f 2a 20 50 41 47 45 52 5f         /* PAGER_
ec70: 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 6f 72  GET_NOCONTENT or
ec80: 20 50 41 47 45 52 5f 47 45 54 5f 52 45 41 44 4f   PAGER_GET_READO
ec90: 4e 4c 59 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  NLY */.){.  int 
eca0: 72 63 3b 0a 20 20 44 62 50 61 67 65 20 2a 70 44  rc;.  DbPage *pD
ecb0: 62 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74  bPage;..  assert
ecc0: 28 20 66 6c 61 67 73 3d 3d 30 20 7c 7c 20 66 6c  ( flags==0 || fl
ecd0: 61 67 73 3d 3d 50 41 47 45 52 5f 47 45 54 5f 4e  ags==PAGER_GET_N
ece0: 4f 43 4f 4e 54 45 4e 54 20 7c 7c 20 66 6c 61 67  OCONTENT || flag
ecf0: 73 3d 3d 50 41 47 45 52 5f 47 45 54 5f 52 45 41  s==PAGER_GET_REA
ed00: 44 4f 4e 4c 59 20 29 3b 0a 20 20 61 73 73 65 72  DONLY );.  asser
ed10: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
ed20: 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
ed30: 29 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ) );.  rc = sqli
ed40: 74 65 33 50 61 67 65 72 41 63 71 75 69 72 65 28  te3PagerAcquire(
ed50: 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 67 6e  pBt->pPager, pgn
ed60: 6f 2c 20 28 44 62 50 61 67 65 2a 2a 29 26 70 44  o, (DbPage**)&pD
ed70: 62 50 61 67 65 2c 20 66 6c 61 67 73 29 3b 0a 20  bPage, flags);. 
ed80: 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
ed90: 20 72 63 3b 0a 20 20 2a 70 70 50 61 67 65 20 3d   rc;.  *ppPage =
eda0: 20 62 74 72 65 65 50 61 67 65 46 72 6f 6d 44 62   btreePageFromDb
edb0: 50 61 67 65 28 70 44 62 50 61 67 65 2c 20 70 67  Page(pDbPage, pg
edc0: 6e 6f 2c 20 70 42 74 29 3b 0a 20 20 72 65 74 75  no, pBt);.  retu
edd0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
ede0: 0a 2f 2a 0a 2a 2a 20 52 65 74 72 69 65 76 65 20  ./*.** Retrieve 
edf0: 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20  a page from the 
ee00: 70 61 67 65 72 20 63 61 63 68 65 2e 20 49 66 20  pager cache. If 
ee10: 74 68 65 20 72 65 71 75 65 73 74 65 64 20 70 61  the requested pa
ee20: 67 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 61 6c 72  ge is not.** alr
ee30: 65 61 64 79 20 69 6e 20 74 68 65 20 70 61 67 65  eady in the page
ee40: 72 20 63 61 63 68 65 20 72 65 74 75 72 6e 20 4e  r cache return N
ee50: 55 4c 4c 2e 20 49 6e 69 74 69 61 6c 69 7a 65 20  ULL. Initialize 
ee60: 74 68 65 20 4d 65 6d 50 61 67 65 2e 70 42 74 20  the MemPage.pBt 
ee70: 61 6e 64 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e 61  and.** MemPage.a
ee80: 44 61 74 61 20 65 6c 65 6d 65 6e 74 73 20 69 66  Data elements if
ee90: 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61 74   needed..*/.stat
eea0: 69 63 20 4d 65 6d 50 61 67 65 20 2a 62 74 72 65  ic MemPage *btre
eeb0: 65 50 61 67 65 4c 6f 6f 6b 75 70 28 42 74 53 68  ePageLookup(BtSh
eec0: 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20  ared *pBt, Pgno 
eed0: 70 67 6e 6f 29 7b 0a 20 20 44 62 50 61 67 65 20  pgno){.  DbPage 
eee0: 2a 70 44 62 50 61 67 65 3b 0a 20 20 61 73 73 65  *pDbPage;.  asse
eef0: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
ef00: 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
ef10: 78 29 20 29 3b 0a 20 20 70 44 62 50 61 67 65 20  x) );.  pDbPage 
ef20: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f  = sqlite3PagerLo
ef30: 6f 6b 75 70 28 70 42 74 2d 3e 70 50 61 67 65 72  okup(pBt->pPager
ef40: 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70  , pgno);.  if( p
ef50: 44 62 50 61 67 65 20 29 7b 0a 20 20 20 20 72 65  DbPage ){.    re
ef60: 74 75 72 6e 20 62 74 72 65 65 50 61 67 65 46 72  turn btreePageFr
ef70: 6f 6d 44 62 50 61 67 65 28 70 44 62 50 61 67 65  omDbPage(pDbPage
ef80: 2c 20 70 67 6e 6f 2c 20 70 42 74 29 3b 0a 20 20  , pgno, pBt);.  
ef90: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
efa0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
efb0: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61  e size of the da
efc0: 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e 20 70  tabase file in p
efd0: 61 67 65 73 2e 20 49 66 20 74 68 65 72 65 20 69  ages. If there i
efe0: 73 20 61 6e 79 20 6b 69 6e 64 20 6f 66 0a 2a 2a  s any kind of.**
eff0: 20 65 72 72 6f 72 2c 20 72 65 74 75 72 6e 20 28   error, return (
f000: 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 2d 31  (unsigned int)-1
f010: 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 6e  )..*/.static Pgn
f020: 6f 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74  o btreePagecount
f030: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b  (BtShared *pBt){
f040: 0a 20 20 72 65 74 75 72 6e 20 70 42 74 2d 3e 6e  .  return pBt->n
f050: 50 61 67 65 3b 0a 7d 0a 75 33 32 20 73 71 6c 69  Page;.}.u32 sqli
f060: 74 65 33 42 74 72 65 65 4c 61 73 74 50 61 67 65  te3BtreeLastPage
f070: 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 61 73  (Btree *p){.  as
f080: 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72  sert( sqlite3Btr
f090: 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20  eeHoldsMutex(p) 
f0a0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 28 70  );.  assert( ((p
f0b0: 2d 3e 70 42 74 2d 3e 6e 50 61 67 65 29 26 30 78  ->pBt->nPage)&0x
f0c0: 38 30 30 30 30 30 30 29 3d 3d 30 20 29 3b 0a 20  8000000)==0 );. 
f0d0: 20 72 65 74 75 72 6e 20 62 74 72 65 65 50 61 67   return btreePag
f0e0: 65 63 6f 75 6e 74 28 70 2d 3e 70 42 74 29 3b 0a  ecount(p->pBt);.
f0f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 70  }../*.** Get a p
f100: 61 67 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67  age from the pag
f110: 65 72 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a  er and initializ
f120: 65 20 69 74 2e 20 20 54 68 69 73 20 72 6f 75 74  e it.  This rout
f130: 69 6e 65 20 69 73 20 6a 75 73 74 20 61 0a 2a 2a  ine is just a.**
f140: 20 63 6f 6e 76 65 6e 69 65 6e 63 65 20 77 72 61   convenience wra
f150: 70 70 65 72 20 61 72 6f 75 6e 64 20 73 65 70 61  pper around sepa
f160: 72 61 74 65 20 63 61 6c 6c 73 20 74 6f 20 62 74  rate calls to bt
f170: 72 65 65 47 65 74 50 61 67 65 28 29 20 61 6e 64  reeGetPage() and
f180: 20 0a 2a 2a 20 62 74 72 65 65 49 6e 69 74 50 61   .** btreeInitPa
f190: 67 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  ge()..**.** If a
f1a0: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
f1b0: 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20 2a  then the value *
f1c0: 70 70 50 61 67 65 20 69 73 20 73 65 74 20 74 6f  ppPage is set to
f1d0: 20 69 73 20 75 6e 64 65 66 69 6e 65 64 2e 20 49   is undefined. I
f1e0: 74 0a 2a 2a 20 6d 61 79 20 72 65 6d 61 69 6e 20  t.** may remain 
f1f0: 75 6e 63 68 61 6e 67 65 64 2c 20 6f 72 20 69 74  unchanged, or it
f200: 20 6d 61 79 20 62 65 20 73 65 74 20 74 6f 20 61   may be set to a
f210: 6e 20 69 6e 76 61 6c 69 64 20 76 61 6c 75 65 2e  n invalid value.
f220: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67  .*/.static int g
f230: 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28 0a 20  etAndInitPage(. 
f240: 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20   BtShared *pBt, 
f250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f260: 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
f270: 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20   file */.  Pgno 
f280: 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20  pgno,           
f290: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
f2a0: 6d 62 65 72 20 6f 66 20 74 68 65 20 70 61 67 65  mber of the page
f2b0: 20 74 6f 20 67 65 74 20 2a 2f 0a 20 20 4d 65 6d   to get */.  Mem
f2c0: 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20  Page **ppPage,  
f2d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
f2e0: 57 72 69 74 65 20 74 68 65 20 70 61 67 65 20 70  Write the page p
f2f0: 6f 69 6e 74 65 72 20 68 65 72 65 20 2a 2f 0a 20  ointer here */. 
f300: 20 69 6e 74 20 62 52 65 61 64 6f 6e 6c 79 20 20   int bReadonly  
f310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f320: 20 2f 2a 20 50 41 47 45 52 5f 47 45 54 5f 52 45   /* PAGER_GET_RE
f330: 41 44 4f 4e 4c 59 20 6f 72 20 30 20 2a 2f 0a 29  ADONLY or 0 */.)
f340: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73  {.  int rc;.  as
f350: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
f360: 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
f370: 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
f380: 28 20 62 52 65 61 64 6f 6e 6c 79 3d 3d 50 41 47  ( bReadonly==PAG
f390: 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20  ER_GET_READONLY 
f3a0: 7c 7c 20 62 52 65 61 64 6f 6e 6c 79 3d 3d 30 20  || bReadonly==0 
f3b0: 29 3b 0a 0a 20 20 69 66 28 20 70 67 6e 6f 3e 62  );..  if( pgno>b
f3c0: 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42  treePagecount(pB
f3d0: 74 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  t) ){.    rc = S
f3e0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
f3f0: 50 54 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  PT;.  }else{.   
f400: 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61   rc = btreeGetPa
f410: 67 65 28 70 42 74 2c 20 70 67 6e 6f 2c 20 70 70  ge(pBt, pgno, pp
f420: 50 61 67 65 2c 20 62 52 65 61 64 6f 6e 6c 79 29  Page, bReadonly)
f430: 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
f440: 4c 49 54 45 5f 4f 4b 20 26 26 20 28 2a 70 70 50  LITE_OK && (*ppP
f450: 61 67 65 29 2d 3e 69 73 49 6e 69 74 3d 3d 30 20  age)->isInit==0 
f460: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 62 74  ){.      rc = bt
f470: 72 65 65 49 6e 69 74 50 61 67 65 28 2a 70 70 50  reeInitPage(*ppP
f480: 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  age);.      if( 
f490: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
f4a0: 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65  .        release
f4b0: 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20  Page(*ppPage);. 
f4c0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
f4d0: 0a 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 67  ..  testcase( pg
f4e0: 6e 6f 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  no==0 );.  asser
f4f0: 74 28 20 70 67 6e 6f 21 3d 30 20 7c 7c 20 72 63  t( pgno!=0 || rc
f500: 3d 3d 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  ==SQLITE_CORRUPT
f510: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   );.  return rc;
f520: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73  .}../*.** Releas
f530: 65 20 61 20 4d 65 6d 50 61 67 65 2e 20 20 54 68  e a MemPage.  Th
f540: 69 73 20 73 68 6f 75 6c 64 20 62 65 20 63 61 6c  is should be cal
f550: 6c 65 64 20 6f 6e 63 65 20 66 6f 72 20 65 61 63  led once for eac
f560: 68 20 70 72 69 6f 72 0a 2a 2a 20 63 61 6c 6c 20  h prior.** call 
f570: 74 6f 20 62 74 72 65 65 47 65 74 50 61 67 65 2e  to btreeGetPage.
f580: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
f590: 72 65 6c 65 61 73 65 50 61 67 65 28 4d 65 6d 50  releasePage(MemP
f5a0: 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 69  age *pPage){.  i
f5b0: 66 28 20 70 50 61 67 65 20 29 7b 0a 20 20 20 20  f( pPage ){.    
f5c0: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 61  assert( pPage->a
f5d0: 44 61 74 61 20 29 3b 0a 20 20 20 20 61 73 73 65  Data );.    asse
f5e0: 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 20 29  rt( pPage->pBt )
f5f0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
f600: 61 67 65 2d 3e 70 44 62 50 61 67 65 21 3d 30 20  age->pDbPage!=0 
f610: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  );.    assert( s
f620: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78  qlite3PagerGetEx
f630: 74 72 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61  tra(pPage->pDbPa
f640: 67 65 29 20 3d 3d 20 28 76 6f 69 64 2a 29 70 50  ge) == (void*)pP
f650: 61 67 65 20 29 3b 0a 20 20 20 20 61 73 73 65 72  age );.    asser
f660: 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  t( sqlite3PagerG
f670: 65 74 44 61 74 61 28 70 50 61 67 65 2d 3e 70 44  etData(pPage->pD
f680: 62 50 61 67 65 29 3d 3d 70 50 61 67 65 2d 3e 61  bPage)==pPage->a
f690: 44 61 74 61 20 29 3b 0a 20 20 20 20 61 73 73 65  Data );.    asse
f6a0: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
f6b0: 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
f6c0: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 20  t->mutex) );.   
f6d0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
f6e0: 65 66 4e 6f 74 4e 75 6c 6c 28 70 50 61 67 65 2d  efNotNull(pPage-
f6f0: 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a 7d  >pDbPage);.  }.}
f700: 0a 0a 2f 2a 0a 2a 2a 20 44 75 72 69 6e 67 20 61  ../*.** During a
f710: 20 72 6f 6c 6c 62 61 63 6b 2c 20 77 68 65 6e 20   rollback, when 
f720: 74 68 65 20 70 61 67 65 72 20 72 65 6c 6f 61 64  the pager reload
f730: 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e  s information in
f740: 74 6f 20 74 68 65 20 63 61 63 68 65 0a 2a 2a 20  to the cache.** 
f750: 73 6f 20 74 68 61 74 20 74 68 65 20 63 61 63 68  so that the cach
f760: 65 20 69 73 20 72 65 73 74 6f 72 65 64 20 74 6f  e is restored to
f770: 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 74   its original st
f780: 61 74 65 20 61 74 20 74 68 65 20 73 74 61 72 74  ate at the start
f790: 20 6f 66 0a 2a 2a 20 74 68 65 20 74 72 61 6e 73   of.** the trans
f7a0: 61 63 74 69 6f 6e 2c 20 66 6f 72 20 65 61 63 68  action, for each
f7b0: 20 70 61 67 65 20 72 65 73 74 6f 72 65 64 20 74   page restored t
f7c0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
f7d0: 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  alled..**.** Thi
f7e0: 73 20 72 6f 75 74 69 6e 65 20 6e 65 65 64 73 20  s routine needs 
f7f0: 74 6f 20 72 65 73 65 74 20 74 68 65 20 65 78 74  to reset the ext
f800: 72 61 20 64 61 74 61 20 73 65 63 74 69 6f 6e 20  ra data section 
f810: 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  at the end of th
f820: 65 0a 2a 2a 20 70 61 67 65 20 74 6f 20 61 67 72  e.** page to agr
f830: 65 65 20 77 69 74 68 20 74 68 65 20 72 65 73 74  ee with the rest
f840: 6f 72 65 64 20 64 61 74 61 2e 0a 2a 2f 0a 73 74  ored data..*/.st
f850: 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 52 65  atic void pageRe
f860: 69 6e 69 74 28 44 62 50 61 67 65 20 2a 70 44 61  init(DbPage *pDa
f870: 74 61 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  ta){.  MemPage *
f880: 70 50 61 67 65 3b 0a 20 20 70 50 61 67 65 20 3d  pPage;.  pPage =
f890: 20 28 4d 65 6d 50 61 67 65 20 2a 29 73 71 6c 69   (MemPage *)sqli
f8a0: 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61  te3PagerGetExtra
f8b0: 28 70 44 61 74 61 29 3b 0a 20 20 61 73 73 65 72  (pData);.  asser
f8c0: 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 50  t( sqlite3PagerP
f8d0: 61 67 65 52 65 66 63 6f 75 6e 74 28 70 44 61 74  ageRefcount(pDat
f8e0: 61 29 3e 30 20 29 3b 0a 20 20 69 66 28 20 70 50  a)>0 );.  if( pP
f8f0: 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 7b 0a 20  age->isInit ){. 
f900: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
f910: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
f920: 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
f930: 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69   );.    pPage->i
f940: 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 20 20 69  sInit = 0;.    i
f950: 66 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 50  f( sqlite3PagerP
f960: 61 67 65 52 65 66 63 6f 75 6e 74 28 70 44 61 74  ageRefcount(pDat
f970: 61 29 3e 31 20 29 7b 0a 20 20 20 20 20 20 2f 2a  a)>1 ){.      /*
f980: 20 70 50 61 67 65 20 6d 69 67 68 74 20 6e 6f 74   pPage might not
f990: 20 62 65 20 61 20 62 74 72 65 65 20 70 61 67 65   be a btree page
f9a0: 3b 20 20 69 74 20 6d 69 67 68 74 20 62 65 20 61  ;  it might be a
f9b0: 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 0a  n overflow page.
f9c0: 20 20 20 20 20 20 2a 2a 20 6f 72 20 70 74 72 6d        ** or ptrm
f9d0: 61 70 20 70 61 67 65 20 6f 72 20 61 20 66 72 65  ap page or a fre
f9e0: 65 20 70 61 67 65 2e 20 20 49 6e 20 74 68 6f 73  e page.  In thos
f9f0: 65 20 63 61 73 65 73 2c 20 74 68 65 20 66 6f 6c  e cases, the fol
fa00: 6c 6f 77 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20  lowing.      ** 
fa10: 63 61 6c 6c 20 74 6f 20 62 74 72 65 65 49 6e 69  call to btreeIni
fa20: 74 50 61 67 65 28 29 20 77 69 6c 6c 20 6c 69 6b  tPage() will lik
fa30: 65 6c 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ely return SQLIT
fa40: 45 5f 43 4f 52 52 55 50 54 2e 0a 20 20 20 20 20  E_CORRUPT..     
fa50: 20 2a 2a 20 42 75 74 20 6e 6f 20 68 61 72 6d 20   ** But no harm 
fa60: 69 73 20 64 6f 6e 65 20 62 79 20 74 68 69 73 2e  is done by this.
fa70: 20 20 41 6e 64 20 69 74 20 69 73 20 76 65 72 79    And it is very
fa80: 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 0a   important that.
fa90: 20 20 20 20 20 20 2a 2a 20 62 74 72 65 65 49 6e        ** btreeIn
faa0: 69 74 50 61 67 65 28 29 20 62 65 20 63 61 6c 6c  itPage() be call
fab0: 65 64 20 6f 6e 20 65 76 65 72 79 20 62 74 72 65  ed on every btre
fac0: 65 20 70 61 67 65 20 73 6f 20 77 65 20 6d 61 6b  e page so we mak
fad0: 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63  e.      ** the c
fae0: 61 6c 6c 20 66 6f 72 20 65 76 65 72 79 20 70 61  all for every pa
faf0: 67 65 20 74 68 61 74 20 63 6f 6d 65 73 20 69 6e  ge that comes in
fb00: 20 66 6f 72 20 72 65 2d 69 6e 69 74 69 6e 67 2e   for re-initing.
fb10: 20 2a 2f 0a 20 20 20 20 20 20 62 74 72 65 65 49   */.      btreeI
fb20: 6e 69 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a  nitPage(pPage);.
fb30: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
fb40: 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 62 75  ** Invoke the bu
fb50: 73 79 20 68 61 6e 64 6c 65 72 20 66 6f 72 20 61  sy handler for a
fb60: 20 62 74 72 65 65 2e 0a 2a 2f 0a 73 74 61 74 69   btree..*/.stati
fb70: 63 20 69 6e 74 20 62 74 72 65 65 49 6e 76 6f 6b  c int btreeInvok
fb80: 65 42 75 73 79 48 61 6e 64 6c 65 72 28 76 6f 69  eBusyHandler(voi
fb90: 64 20 2a 70 41 72 67 29 7b 0a 20 20 42 74 53 68  d *pArg){.  BtSh
fba0: 61 72 65 64 20 2a 70 42 74 20 3d 20 28 42 74 53  ared *pBt = (BtS
fbb0: 68 61 72 65 64 2a 29 70 41 72 67 3b 0a 20 20 61  hared*)pArg;.  a
fbc0: 73 73 65 72 74 28 20 70 42 74 2d 3e 64 62 20 29  ssert( pBt->db )
fbd0: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
fbe0: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
fbf0: 42 74 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  Bt->db->mutex) )
fc00: 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  ;.  return sqlit
fc10: 65 33 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64  e3InvokeBusyHand
fc20: 6c 65 72 28 26 70 42 74 2d 3e 64 62 2d 3e 62 75  ler(&pBt->db->bu
fc30: 73 79 48 61 6e 64 6c 65 72 29 3b 0a 7d 0a 0a 2f  syHandler);.}../
fc40: 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 64 61 74 61  *.** Open a data
fc50: 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 0a 2a  base file..** .*
fc60: 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 74  * zFilename is t
fc70: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64  he name of the d
fc80: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49  atabase file.  I
fc90: 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e  f zFilename is N
fca0: 55 4c 4c 0a 2a 2a 20 74 68 65 6e 20 61 6e 20 65  ULL.** then an e
fcb0: 70 68 65 6d 65 72 61 6c 20 64 61 74 61 62 61 73  phemeral databas
fcc0: 65 20 69 73 20 63 72 65 61 74 65 64 2e 20 20 54  e is created.  T
fcd0: 68 65 20 65 70 68 65 6d 65 72 61 6c 20 64 61 74  he ephemeral dat
fce0: 61 62 61 73 65 20 6d 69 67 68 74 0a 2a 2a 20 62  abase might.** b
fcf0: 65 20 65 78 63 6c 75 73 69 76 65 6c 79 20 69 6e  e exclusively in
fd00: 20 6d 65 6d 6f 72 79 2c 20 6f 72 20 69 74 20 6d   memory, or it m
fd10: 69 67 68 74 20 75 73 65 20 61 20 64 69 73 6b 2d  ight use a disk-
fd20: 62 61 73 65 64 20 6d 65 6d 6f 72 79 20 63 61 63  based memory cac
fd30: 68 65 2e 0a 2a 2a 20 45 69 74 68 65 72 20 77 61  he..** Either wa
fd40: 79 2c 20 74 68 65 20 65 70 68 65 6d 65 72 61 6c  y, the ephemeral
fd50: 20 64 61 74 61 62 61 73 65 20 77 69 6c 6c 20 62   database will b
fd60: 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  e automatically 
fd70: 64 65 6c 65 74 65 64 20 0a 2a 2a 20 77 68 65 6e  deleted .** when
fd80: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f   sqlite3BtreeClo
fd90: 73 65 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a  se() is called..
fda0: 2a 2a 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61  **.** If zFilena
fdb0: 6d 65 20 69 73 20 22 3a 6d 65 6d 6f 72 79 3a 22  me is ":memory:"
fdc0: 20 74 68 65 6e 20 61 6e 20 69 6e 2d 6d 65 6d 6f   then an in-memo
fdd0: 72 79 20 64 61 74 61 62 61 73 65 20 69 73 20 63  ry database is c
fde0: 72 65 61 74 65 64 0a 2a 2a 20 74 68 61 74 20 69  reated.** that i
fdf0: 73 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  s automatically 
fe00: 64 65 73 74 72 6f 79 65 64 20 77 68 65 6e 20 69  destroyed when i
fe10: 74 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a  t is closed..**.
fe20: 2a 2a 20 54 68 65 20 22 66 6c 61 67 73 22 20 70  ** The "flags" p
fe30: 61 72 61 6d 65 74 65 72 20 69 73 20 61 20 62 69  arameter is a bi
fe40: 74 6d 61 73 6b 20 74 68 61 74 20 6d 69 67 68 74  tmask that might
fe50: 20 63 6f 6e 74 61 69 6e 20 62 69 74 73 20 6c 69   contain bits li
fe60: 6b 65 0a 2a 2a 20 42 54 52 45 45 5f 4f 4d 49 54  ke.** BTREE_OMIT
fe70: 5f 4a 4f 55 52 4e 41 4c 20 61 6e 64 2f 6f 72 20  _JOURNAL and/or 
fe80: 42 54 52 45 45 5f 4d 45 4d 4f 52 59 2e 0a 2a 2a  BTREE_MEMORY..**
fe90: 0a 2a 2a 20 49 66 20 74 68 65 20 64 61 74 61 62  .** If the datab
fea0: 61 73 65 20 69 73 20 61 6c 72 65 61 64 79 20 6f  ase is already o
feb0: 70 65 6e 65 64 20 69 6e 20 74 68 65 20 73 61 6d  pened in the sam
fec0: 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
fed0: 63 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 77 65 20  ction.** and we 
fee0: 61 72 65 20 69 6e 20 73 68 61 72 65 64 20 63 61  are in shared ca
fef0: 63 68 65 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74  che mode, then t
ff00: 68 65 20 6f 70 65 6e 20 77 69 6c 6c 20 66 61 69  he open will fai
ff10: 6c 20 77 69 74 68 20 61 6e 0a 2a 2a 20 53 51 4c  l with an.** SQL
ff20: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 65  ITE_CONSTRAINT e
ff30: 72 72 6f 72 2e 20 20 57 65 20 63 61 6e 6e 6f 74  rror.  We cannot
ff40: 20 61 6c 6c 6f 77 20 74 77 6f 20 6f 72 20 6d 6f   allow two or mo
ff50: 72 65 20 42 74 53 68 61 72 65 64 0a 2a 2a 20 6f  re BtShared.** o
ff60: 62 6a 65 63 74 73 20 69 6e 20 74 68 65 20 73 61  bjects in the sa
ff70: 6d 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  me database conn
ff80: 65 63 74 69 6f 6e 20 73 69 6e 63 65 20 64 6f 69  ection since doi
ff90: 6e 67 20 73 6f 20 77 69 6c 6c 20 6c 65 61 64 0a  ng so will lead.
ffa0: 2a 2a 20 74 6f 20 70 72 6f 62 6c 65 6d 73 20 77  ** to problems w
ffb0: 69 74 68 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2f 0a  ith locking..*/.
ffc0: 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
ffd0: 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f  Open(.  sqlite3_
ffe0: 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20  vfs *pVfs,      
fff0: 2f 2a 20 56 46 53 20 74 6f 20 75 73 65 20 66 6f  /* VFS to use fo
10000 72 20 74 68 69 73 20 62 2d 74 72 65 65 20 2a 2f  r this b-tree */
10010 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
10020 46 69 6c 65 6e 61 6d 65 2c 20 20 2f 2a 20 4e 61  Filename,  /* Na
10030 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 63  me of the file c
10040 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 42 54  ontaining the BT
10050 72 65 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  ree database */.
10060 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20    sqlite3 *db,  
10070 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 73 73            /* Ass
10080 6f 63 69 61 74 65 64 20 64 61 74 61 62 61 73 65  ociated database
10090 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 42 74 72   handle */.  Btr
100a0 65 65 20 2a 2a 70 70 42 74 72 65 65 2c 20 20 20  ee **ppBtree,   
100b0 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
100c0 74 6f 20 6e 65 77 20 42 74 72 65 65 20 6f 62 6a  to new Btree obj
100d0 65 63 74 20 77 72 69 74 74 65 6e 20 68 65 72 65  ect written here
100e0 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c   */.  int flags,
100f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10100 20 4f 70 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e   Options */.  in
10110 74 20 76 66 73 46 6c 61 67 73 20 20 20 20 20 20  t vfsFlags      
10120 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 70        /* Flags p
10130 61 73 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f  assed through to
10140 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70   sqlite3_vfs.xOp
10150 65 6e 28 29 20 2a 2f 0a 29 7b 0a 20 20 42 74 53  en() */.){.  BtS
10160 68 61 72 65 64 20 2a 70 42 74 20 3d 20 30 3b 20  hared *pBt = 0; 
10170 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
10180 68 61 72 65 64 20 70 61 72 74 20 6f 66 20 62 74  hared part of bt
10190 72 65 65 20 73 74 72 75 63 74 75 72 65 20 2a 2f  ree structure */
101a0 0a 20 20 42 74 72 65 65 20 2a 70 3b 20 20 20 20  .  Btree *p;    
101b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
101c0 20 20 2f 2a 20 48 61 6e 64 6c 65 20 74 6f 20 72    /* Handle to r
101d0 65 74 75 72 6e 20 2a 2f 0a 20 20 73 71 6c 69 74  eturn */.  sqlit
101e0 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 4f  e3_mutex *mutexO
101f0 70 65 6e 20 3d 20 30 3b 20 20 2f 2a 20 50 72 65  pen = 0;  /* Pre
10200 76 65 6e 74 73 20 61 20 72 61 63 65 20 63 6f 6e  vents a race con
10210 64 69 74 69 6f 6e 2e 20 54 69 63 6b 65 74 20 23  dition. Ticket #
10220 33 35 33 37 20 2a 2f 0a 20 20 69 6e 74 20 72 63  3537 */.  int rc
10230 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
10240 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75           /* Resu
10250 6c 74 20 63 6f 64 65 20 66 72 6f 6d 20 74 68 69  lt code from thi
10260 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  s function */.  
10270 75 38 20 6e 52 65 73 65 72 76 65 3b 20 20 20 20  u8 nReserve;    
10280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
10290 2a 20 42 79 74 65 20 6f 66 20 75 6e 75 73 65 64  * Byte of unused
102a0 20 73 70 61 63 65 20 6f 6e 20 65 61 63 68 20 70   space on each p
102b0 61 67 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  age */.  unsigne
102c0 64 20 63 68 61 72 20 7a 44 62 48 65 61 64 65 72  d char zDbHeader
102d0 5b 31 30 30 5d 3b 20 20 2f 2a 20 44 61 74 61 62  [100];  /* Datab
102e0 61 73 65 20 68 65 61 64 65 72 20 63 6f 6e 74 65  ase header conte
102f0 6e 74 20 2a 2f 0a 0a 20 20 2f 2a 20 54 72 75 65  nt */..  /* True
10300 20 69 66 20 6f 70 65 6e 69 6e 67 20 61 6e 20 65   if opening an e
10310 70 68 65 6d 65 72 61 6c 2c 20 74 65 6d 70 6f 72  phemeral, tempor
10320 61 72 79 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  ary database */.
10330 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 73 54 65    const int isTe
10340 6d 70 44 62 20 3d 20 7a 46 69 6c 65 6e 61 6d 65  mpDb = zFilename
10350 3d 3d 30 20 7c 7c 20 7a 46 69 6c 65 6e 61 6d 65  ==0 || zFilename
10360 5b 30 5d 3d 3d 30 3b 0a 0a 20 20 2f 2a 20 53 65  [0]==0;..  /* Se
10370 74 20 74 68 65 20 76 61 72 69 61 62 6c 65 20 69  t the variable i
10380 73 4d 65 6d 64 62 20 74 6f 20 74 72 75 65 20 66  sMemdb to true f
10390 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  or an in-memory 
103a0 64 61 74 61 62 61 73 65 2c 20 6f 72 20 0a 20 20  database, or .  
103b0 2a 2a 20 66 61 6c 73 65 20 66 6f 72 20 61 20 66  ** false for a f
103c0 69 6c 65 2d 62 61 73 65 64 20 64 61 74 61 62 61  ile-based databa
103d0 73 65 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20  se..  */.#ifdef 
103e0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f  SQLITE_OMIT_MEMO
103f0 52 59 44 42 0a 20 20 63 6f 6e 73 74 20 69 6e 74  RYDB.  const int
10400 20 69 73 4d 65 6d 64 62 20 3d 20 30 3b 0a 23 65   isMemdb = 0;.#e
10410 6c 73 65 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20  lse.  const int 
10420 69 73 4d 65 6d 64 62 20 3d 20 28 7a 46 69 6c 65  isMemdb = (zFile
10430 6e 61 6d 65 20 26 26 20 73 74 72 63 6d 70 28 7a  name && strcmp(z
10440 46 69 6c 65 6e 61 6d 65 2c 20 22 3a 6d 65 6d 6f  Filename, ":memo
10450 72 79 3a 22 29 3d 3d 30 29 0a 20 20 20 20 20 20  ry:")==0).      
10460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10470 20 7c 7c 20 28 69 73 54 65 6d 70 44 62 20 26 26   || (isTempDb &&
10480 20 73 71 6c 69 74 65 33 54 65 6d 70 49 6e 4d 65   sqlite3TempInMe
10490 6d 6f 72 79 28 64 62 29 29 0a 20 20 20 20 20 20  mory(db)).      
104a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
104b0 20 7c 7c 20 28 76 66 73 46 6c 61 67 73 20 26 20   || (vfsFlags & 
104c0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 45 4d 4f  SQLITE_OPEN_MEMO
104d0 52 59 29 21 3d 30 3b 0a 23 65 6e 64 69 66 0a 0a  RY)!=0;.#endif..
104e0 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20    assert( db!=0 
104f0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 56 66  );.  assert( pVf
10500 73 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  s!=0 );.  assert
10510 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
10520 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20  held(db->mutex) 
10530 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 66 6c  );.  assert( (fl
10540 61 67 73 26 30 78 66 66 29 3d 3d 66 6c 61 67 73  ags&0xff)==flags
10550 20 29 3b 20 20 20 2f 2a 20 66 6c 61 67 73 20 66   );   /* flags f
10560 69 74 20 69 6e 20 38 20 62 69 74 73 20 2a 2f 0a  it in 8 bits */.
10570 0a 20 20 2f 2a 20 4f 6e 6c 79 20 61 20 42 54 52  .  /* Only a BTR
10580 45 45 5f 53 49 4e 47 4c 45 20 64 61 74 61 62 61  EE_SINGLE databa
10590 73 65 20 63 61 6e 20 62 65 20 42 54 52 45 45 5f  se can be BTREE_
105a0 55 4e 4f 52 44 45 52 45 44 20 2a 2f 0a 20 20 61  UNORDERED */.  a
105b0 73 73 65 72 74 28 20 28 66 6c 61 67 73 20 26 20  ssert( (flags & 
105c0 42 54 52 45 45 5f 55 4e 4f 52 44 45 52 45 44 29  BTREE_UNORDERED)
105d0 3d 3d 30 20 7c 7c 20 28 66 6c 61 67 73 20 26 20  ==0 || (flags & 
105e0 42 54 52 45 45 5f 53 49 4e 47 4c 45 29 21 3d 30  BTREE_SINGLE)!=0
105f0 20 29 3b 0a 0a 20 20 2f 2a 20 41 20 42 54 52 45   );..  /* A BTRE
10600 45 5f 53 49 4e 47 4c 45 20 64 61 74 61 62 61 73  E_SINGLE databas
10610 65 20 69 73 20 61 6c 77 61 79 73 20 61 20 74 65  e is always a te
10620 6d 70 6f 72 61 72 79 20 61 6e 64 2f 6f 72 20 65  mporary and/or e
10630 70 68 65 6d 65 72 61 6c 20 2a 2f 0a 20 20 61 73  phemeral */.  as
10640 73 65 72 74 28 20 28 66 6c 61 67 73 20 26 20 42  sert( (flags & B
10650 54 52 45 45 5f 53 49 4e 47 4c 45 29 3d 3d 30 20  TREE_SINGLE)==0 
10660 7c 7c 20 69 73 54 65 6d 70 44 62 20 29 3b 0a 0a  || isTempDb );..
10670 20 20 69 66 28 20 69 73 4d 65 6d 64 62 20 29 7b    if( isMemdb ){
10680 0a 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 42 54  .    flags |= BT
10690 52 45 45 5f 4d 45 4d 4f 52 59 3b 0a 20 20 7d 0a  REE_MEMORY;.  }.
106a0 20 20 69 66 28 20 28 76 66 73 46 6c 61 67 73 20    if( (vfsFlags 
106b0 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  & SQLITE_OPEN_MA
106c0 49 4e 5f 44 42 29 21 3d 30 20 26 26 20 28 69 73  IN_DB)!=0 && (is
106d0 4d 65 6d 64 62 20 7c 7c 20 69 73 54 65 6d 70 44  Memdb || isTempD
106e0 62 29 20 29 7b 0a 20 20 20 20 76 66 73 46 6c 61  b) ){.    vfsFla
106f0 67 73 20 3d 20 28 76 66 73 46 6c 61 67 73 20 26  gs = (vfsFlags &
10700 20 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41   ~SQLITE_OPEN_MA
10710 49 4e 5f 44 42 29 20 7c 20 53 51 4c 49 54 45 5f  IN_DB) | SQLITE_
10720 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 3b 0a 20 20  OPEN_TEMP_DB;.  
10730 7d 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 4d  }.  p = sqlite3M
10740 61 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a 65 6f 66  allocZero(sizeof
10750 28 42 74 72 65 65 29 29 3b 0a 20 20 69 66 28 20  (Btree));.  if( 
10760 21 70 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  !p ){.    return
10770 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
10780 20 7d 0a 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20   }.  p->inTrans 
10790 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20  = TRANS_NONE;.  
107a0 70 2d 3e 64 62 20 3d 20 64 62 3b 0a 23 69 66 6e  p->db = db;.#ifn
107b0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
107c0 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 70  SHARED_CACHE.  p
107d0 2d 3e 6c 6f 63 6b 2e 70 42 74 72 65 65 20 3d 20  ->lock.pBtree = 
107e0 70 3b 0a 20 20 70 2d 3e 6c 6f 63 6b 2e 69 54 61  p;.  p->lock.iTa
107f0 62 6c 65 20 3d 20 31 3b 0a 23 65 6e 64 69 66 0a  ble = 1;.#endif.
10800 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
10810 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
10820 5f 43 41 43 48 45 29 20 26 26 20 21 64 65 66 69  _CACHE) && !defi
10830 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
10840 44 49 53 4b 49 4f 29 0a 20 20 2f 2a 0a 20 20 2a  DISKIO).  /*.  *
10850 2a 20 49 66 20 74 68 69 73 20 42 74 72 65 65 20  * If this Btree 
10860 69 73 20 61 20 63 61 6e 64 69 64 61 74 65 20 66  is a candidate f
10870 6f 72 20 73 68 61 72 65 64 20 63 61 63 68 65 2c  or shared cache,
10880 20 74 72 79 20 74 6f 20 66 69 6e 64 20 61 6e 0a   try to find an.
10890 20 20 2a 2a 20 65 78 69 73 74 69 6e 67 20 42 74    ** existing Bt
108a0 53 68 61 72 65 64 20 6f 62 6a 65 63 74 20 74 68  Shared object th
108b0 61 74 20 77 65 20 63 61 6e 20 73 68 61 72 65 20  at we can share 
108c0 77 69 74 68 0a 20 20 2a 2f 0a 20 20 69 66 28 20  with.  */.  if( 
108d0 69 73 54 65 6d 70 44 62 3d 3d 30 20 26 26 20 28  isTempDb==0 && (
108e0 69 73 4d 65 6d 64 62 3d 3d 30 20 7c 7c 20 28 76  isMemdb==0 || (v
108f0 66 73 46 6c 61 67 73 26 53 51 4c 49 54 45 5f 4f  fsFlags&SQLITE_O
10900 50 45 4e 5f 55 52 49 29 21 3d 30 29 20 29 7b 0a  PEN_URI)!=0) ){.
10910 20 20 20 20 69 66 28 20 76 66 73 46 6c 61 67 73      if( vfsFlags
10920 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53   & SQLITE_OPEN_S
10930 48 41 52 45 44 43 41 43 48 45 20 29 7b 0a 20 20  HAREDCACHE ){.  
10940 20 20 20 20 69 6e 74 20 6e 46 75 6c 6c 50 61 74      int nFullPat
10950 68 6e 61 6d 65 20 3d 20 70 56 66 73 2d 3e 6d 78  hname = pVfs->mx
10960 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20 20 20  Pathname+1;.    
10970 20 20 63 68 61 72 20 2a 7a 46 75 6c 6c 50 61 74    char *zFullPat
10980 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d  hname = sqlite3M
10990 61 6c 6c 6f 63 28 6e 46 75 6c 6c 50 61 74 68 6e  alloc(nFullPathn
109a0 61 6d 65 29 3b 0a 20 20 20 20 20 20 4d 55 54 45  ame);.      MUTE
109b0 58 5f 4c 4f 47 49 43 28 20 73 71 6c 69 74 65 33  X_LOGIC( sqlite3
109c0 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 53 68 61  _mutex *mutexSha
109d0 72 65 64 3b 20 29 0a 20 20 20 20 20 20 70 2d 3e  red; ).      p->
109e0 73 68 61 72 61 62 6c 65 20 3d 20 31 3b 0a 20 20  sharable = 1;.  
109f0 20 20 20 20 69 66 28 20 21 7a 46 75 6c 6c 50 61      if( !zFullPa
10a00 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20  thname ){.      
10a10 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
10a20 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
10a30 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
10a40 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
10a50 28 20 69 73 4d 65 6d 64 62 20 29 7b 0a 20 20 20  ( isMemdb ){.   
10a60 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 46 75 6c       memcpy(zFul
10a70 6c 50 61 74 68 6e 61 6d 65 2c 20 7a 46 69 6c 65  lPathname, zFile
10a80 6e 61 6d 65 2c 20 73 71 6c 69 74 65 33 53 74 72  name, sqlite3Str
10a90 6c 65 6e 33 30 28 7a 46 69 6c 65 6e 61 6d 65 29  len30(zFilename)
10aa0 2b 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  +1);.      }else
10ab0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
10ac0 71 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61 74 68  qlite3OsFullPath
10ad0 6e 61 6d 65 28 70 56 66 73 2c 20 7a 46 69 6c 65  name(pVfs, zFile
10ae0 6e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20  name,.          
10af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10b00 20 20 20 20 20 20 20 20 20 6e 46 75 6c 6c 50 61           nFullPa
10b10 74 68 6e 61 6d 65 2c 20 7a 46 75 6c 6c 50 61 74  thname, zFullPat
10b20 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  hname);.        
10b30 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
10b40 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
10b50 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b  (zFullPathname);
10b60 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
10b70 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20  e3_free(p);.    
10b80 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
10b90 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
10ba0 20 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 48   }.#if SQLITE_TH
10bb0 52 45 41 44 53 41 46 45 0a 20 20 20 20 20 20 6d  READSAFE.      m
10bc0 75 74 65 78 4f 70 65 6e 20 3d 20 73 71 6c 69 74  utexOpen = sqlit
10bd0 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c  e3MutexAlloc(SQL
10be0 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43  ITE_MUTEX_STATIC
10bf0 5f 4f 50 45 4e 29 3b 0a 20 20 20 20 20 20 73 71  _OPEN);.      sq
10c00 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
10c10 72 28 6d 75 74 65 78 4f 70 65 6e 29 3b 0a 20 20  r(mutexOpen);.  
10c20 20 20 20 20 6d 75 74 65 78 53 68 61 72 65 64 20      mutexShared 
10c30 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c  = sqlite3MutexAl
10c40 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
10c50 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b  _STATIC_MASTER);
10c60 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  .      sqlite3_m
10c70 75 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78  utex_enter(mutex
10c80 53 68 61 72 65 64 29 3b 0a 23 65 6e 64 69 66 0a  Shared);.#endif.
10c90 20 20 20 20 20 20 66 6f 72 28 70 42 74 3d 47 4c        for(pBt=GL
10ca0 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73  OBAL(BtShared*,s
10cb0 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68  qlite3SharedCach
10cc0 65 4c 69 73 74 29 3b 20 70 42 74 3b 20 70 42 74  eList); pBt; pBt
10cd0 3d 70 42 74 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  =pBt->pNext){.  
10ce0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 42        assert( pB
10cf0 74 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 20  t->nRef>0 );.   
10d00 20 20 20 20 20 69 66 28 20 30 3d 3d 73 74 72 63       if( 0==strc
10d10 6d 70 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  mp(zFullPathname
10d20 2c 20 73 71 6c 69 74 65 33 50 61 67 65 72 46 69  , sqlite3PagerFi
10d30 6c 65 6e 61 6d 65 28 70 42 74 2d 3e 70 50 61 67  lename(pBt->pPag
10d40 65 72 2c 20 30 29 29 0a 20 20 20 20 20 20 20 20  er, 0)).        
10d50 20 20 20 20 20 20 20 20 20 26 26 20 73 71 6c 69           && sqli
10d60 74 65 33 50 61 67 65 72 56 66 73 28 70 42 74 2d  te3PagerVfs(pBt-
10d70 3e 70 50 61 67 65 72 29 3d 3d 70 56 66 73 20 29  >pPager)==pVfs )
10d80 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
10d90 69 44 62 3b 0a 20 20 20 20 20 20 20 20 20 20 66  iDb;.          f
10da0 6f 72 28 69 44 62 3d 64 62 2d 3e 6e 44 62 2d 31  or(iDb=db->nDb-1
10db0 3b 20 69 44 62 3e 3d 30 3b 20 69 44 62 2d 2d 29  ; iDb>=0; iDb--)
10dc0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 42 74  {.            Bt
10dd0 72 65 65 20 2a 70 45 78 69 73 74 69 6e 67 20 3d  ree *pExisting =
10de0 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42   db->aDb[iDb].pB
10df0 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  t;.            i
10e00 66 28 20 70 45 78 69 73 74 69 6e 67 20 26 26 20  f( pExisting && 
10e10 70 45 78 69 73 74 69 6e 67 2d 3e 70 42 74 3d 3d  pExisting->pBt==
10e20 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  pBt ){.         
10e30 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74       sqlite3_mut
10e40 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 53 68  ex_leave(mutexSh
10e50 61 72 65 64 29 3b 0a 20 20 20 20 20 20 20 20 20  ared);.         
10e60 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74       sqlite3_mut
10e70 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 4f 70  ex_leave(mutexOp
10e80 65 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  en);.           
10e90 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
10ea0 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a  zFullPathname);.
10eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
10ec0 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20  lite3_free(p);. 
10ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74               ret
10ee0 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54  urn SQLITE_CONST
10ef0 52 41 49 4e 54 3b 0a 20 20 20 20 20 20 20 20 20  RAINT;.         
10f00 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
10f10 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 42  .          p->pB
10f20 74 20 3d 20 70 42 74 3b 0a 20 20 20 20 20 20 20  t = pBt;.       
10f30 20 20 20 70 42 74 2d 3e 6e 52 65 66 2b 2b 3b 0a     pBt->nRef++;.
10f40 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
10f50 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
10f60 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
10f70 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74  _mutex_leave(mut
10f80 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20  exShared);.     
10f90 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 46   sqlite3_free(zF
10fa0 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  ullPathname);.  
10fb0 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54    }.#ifdef SQLIT
10fc0 45 5f 44 45 42 55 47 0a 20 20 20 20 65 6c 73 65  E_DEBUG.    else
10fd0 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e 20 64 65  {.      /* In de
10fe0 62 75 67 20 6d 6f 64 65 2c 20 77 65 20 6d 61 72  bug mode, we mar
10ff0 6b 20 61 6c 6c 20 70 65 72 73 69 73 74 65 6e 74  k all persistent
11000 20 64 61 74 61 62 61 73 65 73 20 61 73 20 73 68   databases as sh
11010 61 72 61 62 6c 65 0a 20 20 20 20 20 20 2a 2a 20  arable.      ** 
11020 65 76 65 6e 20 77 68 65 6e 20 74 68 65 79 20 61  even when they a
11030 72 65 20 6e 6f 74 2e 20 20 54 68 69 73 20 65 78  re not.  This ex
11040 65 72 63 69 73 65 73 20 74 68 65 20 6c 6f 63 6b  ercises the lock
11050 69 6e 67 20 63 6f 64 65 20 61 6e 64 0a 20 20 20  ing code and.   
11060 20 20 20 2a 2a 20 67 69 76 65 73 20 6d 6f 72 65     ** gives more
11070 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 66 6f 72   opportunity for
11080 20 61 73 73 65 72 74 73 28 73 71 6c 69 74 65 33   asserts(sqlite3
11090 5f 6d 75 74 65 78 5f 68 65 6c 64 28 29 29 0a 20  _mutex_held()). 
110a0 20 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e       ** statemen
110b0 74 73 20 74 6f 20 66 69 6e 64 20 6c 6f 63 6b 69  ts to find locki
110c0 6e 67 20 70 72 6f 62 6c 65 6d 73 2e 0a 20 20 20  ng problems..   
110d0 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 2d 3e 73     */.      p->s
110e0 68 61 72 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20  harable = 1;.   
110f0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 23 65   }.#endif.  }.#e
11100 6e 64 69 66 0a 20 20 69 66 28 20 70 42 74 3d 3d  ndif.  if( pBt==
11110 30 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20  0 ){.    /*.    
11120 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
11130 20 61 73 73 65 72 74 73 20 6d 61 6b 65 20 73 75   asserts make su
11140 72 65 20 74 68 61 74 20 73 74 72 75 63 74 75 72  re that structur
11150 65 73 20 75 73 65 64 20 62 79 20 74 68 65 20 62  es used by the b
11160 74 72 65 65 20 61 72 65 0a 20 20 20 20 2a 2a 20  tree are.    ** 
11170 74 68 65 20 72 69 67 68 74 20 73 69 7a 65 2e 20  the right size. 
11180 20 54 68 69 73 20 69 73 20 74 6f 20 67 75 61 72   This is to guar
11190 64 20 61 67 61 69 6e 73 74 20 73 69 7a 65 20 63  d against size c
111a0 68 61 6e 67 65 73 20 74 68 61 74 20 72 65 73 75  hanges that resu
111b0 6c 74 0a 20 20 20 20 2a 2a 20 77 68 65 6e 20 63  lt.    ** when c
111c0 6f 6d 70 69 6c 69 6e 67 20 6f 6e 20 61 20 64 69  ompiling on a di
111d0 66 66 65 72 65 6e 74 20 61 72 63 68 69 74 65 63  fferent architec
111e0 74 75 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ture..    */.   
111f0 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28   assert( sizeof(
11200 69 36 34 29 3d 3d 38 20 7c 7c 20 73 69 7a 65 6f  i64)==8 || sizeo
11210 66 28 69 36 34 29 3d 3d 34 20 29 3b 0a 20 20 20  f(i64)==4 );.   
11220 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28   assert( sizeof(
11230 75 36 34 29 3d 3d 38 20 7c 7c 20 73 69 7a 65 6f  u64)==8 || sizeo
11240 66 28 75 36 34 29 3d 3d 34 20 29 3b 0a 20 20 20  f(u64)==4 );.   
11250 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28   assert( sizeof(
11260 75 33 32 29 3d 3d 34 20 29 3b 0a 20 20 20 20 61  u32)==4 );.    a
11270 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 75 31  ssert( sizeof(u1
11280 36 29 3d 3d 32 20 29 3b 0a 20 20 20 20 61 73 73  6)==2 );.    ass
11290 65 72 74 28 20 73 69 7a 65 6f 66 28 50 67 6e 6f  ert( sizeof(Pgno
112a0 29 3d 3d 34 20 29 3b 0a 20 20 0a 20 20 20 20 70  )==4 );.  .    p
112b0 42 74 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  Bt = sqlite3Mall
112c0 6f 63 5a 65 72 6f 28 20 73 69 7a 65 6f 66 28 2a  ocZero( sizeof(*
112d0 70 42 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20  pBt) );.    if( 
112e0 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  pBt==0 ){.      
112f0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
11300 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 74  M;.      goto bt
11310 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20  ree_open_out;.  
11320 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c    }.    rc = sql
11330 69 74 65 33 50 61 67 65 72 4f 70 65 6e 28 70 56  ite3PagerOpen(pV
11340 66 73 2c 20 26 70 42 74 2d 3e 70 50 61 67 65 72  fs, &pBt->pPager
11350 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20  , zFilename,.   
11360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11370 20 20 20 20 20 20 20 45 58 54 52 41 5f 53 49 5a         EXTRA_SIZ
11380 45 2c 20 66 6c 61 67 73 2c 20 76 66 73 46 6c 61  E, flags, vfsFla
11390 67 73 2c 20 70 61 67 65 52 65 69 6e 69 74 29 3b  gs, pageReinit);
113a0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
113b0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
113c0 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 4d  sqlite3PagerSetM
113d0 6d 61 70 4c 69 6d 69 74 28 70 42 74 2d 3e 70 50  mapLimit(pBt->pP
113e0 61 67 65 72 2c 20 64 62 2d 3e 73 7a 4d 6d 61 70  ager, db->szMmap
113f0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
11400 6c 69 74 65 33 50 61 67 65 72 52 65 61 64 46 69  lite3PagerReadFi
11410 6c 65 68 65 61 64 65 72 28 70 42 74 2d 3e 70 50  leheader(pBt->pP
11420 61 67 65 72 2c 73 69 7a 65 6f 66 28 7a 44 62 48  ager,sizeof(zDbH
11430 65 61 64 65 72 29 2c 7a 44 62 48 65 61 64 65 72  eader),zDbHeader
11440 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
11450 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
11460 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 74 72  {.      goto btr
11470 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20  ee_open_out;.   
11480 20 7d 0a 20 20 20 20 70 42 74 2d 3e 6f 70 65 6e   }.    pBt->open
11490 46 6c 61 67 73 20 3d 20 28 75 38 29 66 6c 61 67  Flags = (u8)flag
114a0 73 3b 0a 20 20 20 20 70 42 74 2d 3e 64 62 20 3d  s;.    pBt->db =
114b0 20 64 62 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   db;.    sqlite3
114c0 50 61 67 65 72 53 65 74 42 75 73 79 68 61 6e 64  PagerSetBusyhand
114d0 6c 65 72 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  ler(pBt->pPager,
114e0 20 62 74 72 65 65 49 6e 76 6f 6b 65 42 75 73 79   btreeInvokeBusy
114f0 48 61 6e 64 6c 65 72 2c 20 70 42 74 29 3b 0a 20  Handler, pBt);. 
11500 20 20 20 70 2d 3e 70 42 74 20 3d 20 70 42 74 3b     p->pBt = pBt;
11510 0a 20 20 0a 20 20 20 20 70 42 74 2d 3e 70 43 75  .  .    pBt->pCu
11520 72 73 6f 72 20 3d 20 30 3b 0a 20 20 20 20 70 42  rsor = 0;.    pB
11530 74 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a 20  t->pPage1 = 0;. 
11540 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 50 61     if( sqlite3Pa
11550 67 65 72 49 73 72 65 61 64 6f 6e 6c 79 28 70 42  gerIsreadonly(pB
11560 74 2d 3e 70 50 61 67 65 72 29 20 29 20 70 42 74  t->pPager) ) pBt
11570 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54  ->btsFlags |= BT
11580 53 5f 52 45 41 44 5f 4f 4e 4c 59 3b 0a 23 69 66  S_READ_ONLY;.#if
11590 64 65 66 20 53 51 4c 49 54 45 5f 53 45 43 55 52  def SQLITE_SECUR
115a0 45 5f 44 45 4c 45 54 45 0a 20 20 20 20 70 42 74  E_DELETE.    pBt
115b0 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54  ->btsFlags |= BT
115c0 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 3b  S_SECURE_DELETE;
115d0 0a 23 65 6e 64 69 66 0a 20 20 20 20 2f 2a 20 45  .#endif.    /* E
115e0 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 31  VIDENCE-OF: R-51
115f0 38 37 33 2d 33 39 36 31 38 20 54 68 65 20 70 61  873-39618 The pa
11600 67 65 20 73 69 7a 65 20 66 6f 72 20 61 20 64 61  ge size for a da
11610 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 0a 20  tabase file is. 
11620 20 20 20 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64     ** determined
11630 20 62 79 20 74 68 65 20 32 2d 62 79 74 65 20 69   by the 2-byte i
11640 6e 74 65 67 65 72 20 6c 6f 63 61 74 65 64 20 61  nteger located a
11650 74 20 61 6e 20 6f 66 66 73 65 74 20 6f 66 20 31  t an offset of 1
11660 36 20 62 79 74 65 73 20 66 72 6f 6d 0a 20 20 20  6 bytes from.   
11670 20 2a 2a 20 74 68 65 20 62 65 67 69 6e 6e 69 6e   ** the beginnin
11680 67 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  g of the databas
11690 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 70  e file. */.    p
116a0 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 28  Bt->pageSize = (
116b0 7a 44 62 48 65 61 64 65 72 5b 31 36 5d 3c 3c 38  zDbHeader[16]<<8
116c0 29 20 7c 20 28 7a 44 62 48 65 61 64 65 72 5b 31  ) | (zDbHeader[1
116d0 37 5d 3c 3c 31 36 29 3b 0a 20 20 20 20 69 66 28  7]<<16);.    if(
116e0 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c 35   pBt->pageSize<5
116f0 31 32 20 7c 7c 20 70 42 74 2d 3e 70 61 67 65 53  12 || pBt->pageS
11700 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 50  ize>SQLITE_MAX_P
11710 41 47 45 5f 53 49 5a 45 0a 20 20 20 20 20 20 20  AGE_SIZE.       
11720 20 20 7c 7c 20 28 28 70 42 74 2d 3e 70 61 67 65    || ((pBt->page
11730 53 69 7a 65 2d 31 29 26 70 42 74 2d 3e 70 61 67  Size-1)&pBt->pag
11740 65 53 69 7a 65 29 21 3d 30 20 29 7b 0a 20 20 20  eSize)!=0 ){.   
11750 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65     pBt->pageSize
11760 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51   = 0;.#ifndef SQ
11770 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
11780 43 55 55 4d 0a 20 20 20 20 20 20 2f 2a 20 49 66  CUUM.      /* If
11790 20 74 68 65 20 6d 61 67 69 63 20 6e 61 6d 65 20   the magic name 
117a0 22 3a 6d 65 6d 6f 72 79 3a 22 20 77 69 6c 6c 20  ":memory:" will 
117b0 63 72 65 61 74 65 20 61 6e 20 69 6e 2d 6d 65 6d  create an in-mem
117c0 6f 72 79 20 64 61 74 61 62 61 73 65 2c 20 74 68  ory database, th
117d0 65 6e 0a 20 20 20 20 20 20 2a 2a 20 6c 65 61 76  en.      ** leav
117e0 65 20 74 68 65 20 61 75 74 6f 56 61 63 75 75 6d  e the autoVacuum
117f0 20 6d 6f 64 65 20 61 74 20 30 20 28 64 6f 20 6e   mode at 0 (do n
11800 6f 74 20 61 75 74 6f 2d 76 61 63 75 75 6d 29 2c  ot auto-vacuum),
11810 20 65 76 65 6e 20 69 66 0a 20 20 20 20 20 20 2a   even if.      *
11820 2a 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  * SQLITE_DEFAULT
11830 5f 41 55 54 4f 56 41 43 55 55 4d 20 69 73 20 74  _AUTOVACUUM is t
11840 72 75 65 2e 20 4f 6e 20 74 68 65 20 6f 74 68 65  rue. On the othe
11850 72 20 68 61 6e 64 2c 20 69 66 0a 20 20 20 20 20  r hand, if.     
11860 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   ** SQLITE_OMIT_
11870 4d 45 4d 4f 52 59 44 42 20 68 61 73 20 62 65 65  MEMORYDB has bee
11880 6e 20 64 65 66 69 6e 65 64 2c 20 74 68 65 6e 20  n defined, then 
11890 22 3a 6d 65 6d 6f 72 79 3a 22 20 69 73 20 6a 75  ":memory:" is ju
118a0 73 74 20 61 0a 20 20 20 20 20 20 2a 2a 20 72 65  st a.      ** re
118b0 67 75 6c 61 72 20 66 69 6c 65 2d 6e 61 6d 65 2e  gular file-name.
118c0 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
118d0 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 61 70  e auto-vacuum ap
118e0 70 6c 69 65 73 20 61 73 20 70 65 72 20 6e 6f 72  plies as per nor
118f0 6d 61 6c 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  mal..      */.  
11900 20 20 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d      if( zFilenam
11910 65 20 26 26 20 21 69 73 4d 65 6d 64 62 20 29 7b  e && !isMemdb ){
11920 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e 61 75  .        pBt->au
11930 74 6f 56 61 63 75 75 6d 20 3d 20 28 53 51 4c 49  toVacuum = (SQLI
11940 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56  TE_DEFAULT_AUTOV
11950 41 43 55 55 4d 20 3f 20 31 20 3a 20 30 29 3b 0a  ACUUM ? 1 : 0);.
11960 20 20 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 63          pBt->inc
11970 72 56 61 63 75 75 6d 20 3d 20 28 53 51 4c 49 54  rVacuum = (SQLIT
11980 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41  E_DEFAULT_AUTOVA
11990 43 55 55 4d 3d 3d 32 20 3f 20 31 20 3a 20 30 29  CUUM==2 ? 1 : 0)
119a0 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
119b0 0a 20 20 20 20 20 20 6e 52 65 73 65 72 76 65 20  .      nReserve 
119c0 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 0;.    }else{.
119d0 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43        /* EVIDENC
119e0 45 2d 4f 46 3a 20 52 2d 33 37 34 39 37 2d 34 32  E-OF: R-37497-42
119f0 34 31 32 20 54 68 65 20 73 69 7a 65 20 6f 66 20  412 The size of 
11a00 74 68 65 20 72 65 73 65 72 76 65 64 20 72 65 67  the reserved reg
11a10 69 6f 6e 20 69 73 0a 20 20 20 20 20 20 2a 2a 20  ion is.      ** 
11a20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68  determined by th
11a30 65 20 6f 6e 65 2d 62 79 74 65 20 75 6e 73 69 67  e one-byte unsig
11a40 6e 65 64 20 69 6e 74 65 67 65 72 20 66 6f 75 6e  ned integer foun
11a50 64 20 61 74 20 61 6e 20 6f 66 66 73 65 74 20 6f  d at an offset o
11a60 66 20 32 30 0a 20 20 20 20 20 20 2a 2a 20 69 6e  f 20.      ** in
11a70 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
11a80 66 69 6c 65 20 68 65 61 64 65 72 2e 20 2a 2f 0a  file header. */.
11a90 20 20 20 20 20 20 6e 52 65 73 65 72 76 65 20 3d        nReserve =
11aa0 20 7a 44 62 48 65 61 64 65 72 5b 32 30 5d 3b 0a   zDbHeader[20];.
11ab0 20 20 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c        pBt->btsFl
11ac0 61 67 73 20 7c 3d 20 42 54 53 5f 50 41 47 45 53  ags |= BTS_PAGES
11ad0 49 5a 45 5f 46 49 58 45 44 3b 0a 23 69 66 6e 64  IZE_FIXED;.#ifnd
11ae0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
11af0 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20  UTOVACUUM.      
11b00 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
11b10 3d 20 28 67 65 74 34 62 79 74 65 28 26 7a 44 62  = (get4byte(&zDb
11b20 48 65 61 64 65 72 5b 33 36 20 2b 20 34 2a 34 5d  Header[36 + 4*4]
11b30 29 3f 31 3a 30 29 3b 0a 20 20 20 20 20 20 70 42  )?1:0);.      pB
11b40 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20  t->incrVacuum = 
11b50 28 67 65 74 34 62 79 74 65 28 26 7a 44 62 48 65  (get4byte(&zDbHe
11b60 61 64 65 72 5b 33 36 20 2b 20 37 2a 34 5d 29 3f  ader[36 + 7*4])?
11b70 31 3a 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  1:0);.#endif.   
11b80 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69   }.    rc = sqli
11b90 74 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73  te3PagerSetPages
11ba0 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  ize(pBt->pPager,
11bb0 20 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2c   &pBt->pageSize,
11bc0 20 6e 52 65 73 65 72 76 65 29 3b 0a 20 20 20 20   nReserve);.    
11bd0 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62 74  if( rc ) goto bt
11be0 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20  ree_open_out;.  
11bf0 20 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a    pBt->usableSiz
11c00 65 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  e = pBt->pageSiz
11c10 65 20 2d 20 6e 52 65 73 65 72 76 65 3b 0a 20 20  e - nReserve;.  
11c20 20 20 61 73 73 65 72 74 28 20 28 70 42 74 2d 3e    assert( (pBt->
11c30 70 61 67 65 53 69 7a 65 20 26 20 37 29 3d 3d 30  pageSize & 7)==0
11c40 20 29 3b 20 20 2f 2a 20 38 2d 62 79 74 65 20 61   );  /* 8-byte a
11c50 6c 69 67 6e 6d 65 6e 74 20 6f 66 20 70 61 67 65  lignment of page
11c60 53 69 7a 65 20 2a 2f 0a 20 20 20 0a 23 69 66 20  Size */.   .#if 
11c70 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
11c80 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
11c90 45 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53  E) && !defined(S
11ca0 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49  QLITE_OMIT_DISKI
11cb0 4f 29 0a 20 20 20 20 2f 2a 20 41 64 64 20 74 68  O).    /* Add th
11cc0 65 20 6e 65 77 20 42 74 53 68 61 72 65 64 20 6f  e new BtShared o
11cd0 62 6a 65 63 74 20 74 6f 20 74 68 65 20 6c 69 6e  bject to the lin
11ce0 6b 65 64 20 6c 69 73 74 20 73 68 61 72 61 62 6c  ked list sharabl
11cf0 65 20 42 74 53 68 61 72 65 64 73 2e 0a 20 20 20  e BtShareds..   
11d00 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 73   */.    if( p->s
11d10 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 20  harable ){.     
11d20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20 73 71   MUTEX_LOGIC( sq
11d30 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74  lite3_mutex *mut
11d40 65 78 53 68 61 72 65 64 3b 20 29 0a 20 20 20 20  exShared; ).    
11d50 20 20 70 42 74 2d 3e 6e 52 65 66 20 3d 20 31 3b    pBt->nRef = 1;
11d60 0a 20 20 20 20 20 20 4d 55 54 45 58 5f 4c 4f 47  .      MUTEX_LOG
11d70 49 43 28 20 6d 75 74 65 78 53 68 61 72 65 64 20  IC( mutexShared 
11d80 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c  = sqlite3MutexAl
11d90 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
11da0 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b  _STATIC_MASTER);
11db0 29 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c 49  ).      if( SQLI
11dc0 54 45 5f 54 48 52 45 41 44 53 41 46 45 20 26 26  TE_THREADSAFE &&
11dd0 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
11de0 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74 65 78 20  nfig.bCoreMutex 
11df0 29 7b 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e  ){.        pBt->
11e00 6d 75 74 65 78 20 3d 20 73 71 6c 69 74 65 33 4d  mutex = sqlite3M
11e10 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45  utexAlloc(SQLITE
11e20 5f 4d 55 54 45 58 5f 46 41 53 54 29 3b 0a 20 20  _MUTEX_FAST);.  
11e30 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6d        if( pBt->m
11e40 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20  utex==0 ){.     
11e50 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
11e60 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20  _NOMEM;.        
11e70 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c    db->mallocFail
11e80 65 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ed = 0;.        
11e90 20 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65    goto btree_ope
11ea0 6e 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d  n_out;.        }
11eb0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
11ec0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
11ed0 65 72 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b  er(mutexShared);
11ee0 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 4e 65 78  .      pBt->pNex
11ef0 74 20 3d 20 47 4c 4f 42 41 4c 28 42 74 53 68 61  t = GLOBAL(BtSha
11f00 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72  red*,sqlite3Shar
11f10 65 64 43 61 63 68 65 4c 69 73 74 29 3b 0a 20 20  edCacheList);.  
11f20 20 20 20 20 47 4c 4f 42 41 4c 28 42 74 53 68 61      GLOBAL(BtSha
11f30 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72  red*,sqlite3Shar
11f40 65 64 43 61 63 68 65 4c 69 73 74 29 20 3d 20 70  edCacheList) = p
11f50 42 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  Bt;.      sqlite
11f60 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75  3_mutex_leave(mu
11f70 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20  texShared);.    
11f80 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 23 69  }.#endif.  }..#i
11f90 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
11fa0 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
11fb0 43 48 45 29 20 26 26 20 21 64 65 66 69 6e 65 64  CHE) && !defined
11fc0 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53  (SQLITE_OMIT_DIS
11fd0 4b 49 4f 29 0a 20 20 2f 2a 20 49 66 20 74 68 65  KIO).  /* If the
11fe0 20 6e 65 77 20 42 74 72 65 65 20 75 73 65 73 20   new Btree uses 
11ff0 61 20 73 68 61 72 61 62 6c 65 20 70 42 74 53 68  a sharable pBtSh
12000 61 72 65 64 2c 20 74 68 65 6e 20 6c 69 6e 6b 20  ared, then link 
12010 74 68 65 20 6e 65 77 0a 20 20 2a 2a 20 42 74 72  the new.  ** Btr
12020 65 65 20 69 6e 74 6f 20 74 68 65 20 6c 69 73 74  ee into the list
12030 20 6f 66 20 61 6c 6c 20 73 68 61 72 61 62 6c 65   of all sharable
12040 20 42 74 72 65 65 73 20 66 6f 72 20 74 68 65 20   Btrees for the 
12050 73 61 6d 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  same connection.
12060 0a 20 20 2a 2a 20 54 68 65 20 6c 69 73 74 20 69  .  ** The list i
12070 73 20 6b 65 70 74 20 69 6e 20 61 73 63 65 6e 64  s kept in ascend
12080 69 6e 67 20 6f 72 64 65 72 20 62 79 20 70 42 74  ing order by pBt
12090 20 61 64 64 72 65 73 73 2e 0a 20 20 2a 2f 0a 20   address..  */. 
120a0 20 69 66 28 20 70 2d 3e 73 68 61 72 61 62 6c 65   if( p->sharable
120b0 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
120c0 20 20 20 42 74 72 65 65 20 2a 70 53 69 62 3b 0a     Btree *pSib;.
120d0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64      for(i=0; i<d
120e0 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
120f0 20 20 20 20 69 66 28 20 28 70 53 69 62 20 3d 20      if( (pSib = 
12100 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 29 21  db->aDb[i].pBt)!
12110 3d 30 20 26 26 20 70 53 69 62 2d 3e 73 68 61 72  =0 && pSib->shar
12120 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20  able ){.        
12130 77 68 69 6c 65 28 20 70 53 69 62 2d 3e 70 50 72  while( pSib->pPr
12140 65 76 20 29 7b 20 70 53 69 62 20 3d 20 70 53 69  ev ){ pSib = pSi
12150 62 2d 3e 70 50 72 65 76 3b 20 7d 0a 20 20 20 20  b->pPrev; }.    
12160 20 20 20 20 69 66 28 20 70 2d 3e 70 42 74 3c 70      if( p->pBt<p
12170 53 69 62 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20  Sib->pBt ){.    
12180 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d        p->pNext =
12190 20 70 53 69 62 3b 0a 20 20 20 20 20 20 20 20 20   pSib;.         
121a0 20 70 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20   p->pPrev = 0;. 
121b0 20 20 20 20 20 20 20 20 20 70 53 69 62 2d 3e 70           pSib->p
121c0 50 72 65 76 20 3d 20 70 3b 0a 20 20 20 20 20 20  Prev = p;.      
121d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
121e0 20 20 20 77 68 69 6c 65 28 20 70 53 69 62 2d 3e     while( pSib->
121f0 70 4e 65 78 74 20 26 26 20 70 53 69 62 2d 3e 70  pNext && pSib->p
12200 4e 65 78 74 2d 3e 70 42 74 3c 70 2d 3e 70 42 74  Next->pBt<p->pBt
12210 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
12220 70 53 69 62 20 3d 20 70 53 69 62 2d 3e 70 4e 65  pSib = pSib->pNe
12230 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  xt;.          }.
12240 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65            p->pNe
12250 78 74 20 3d 20 70 53 69 62 2d 3e 70 4e 65 78 74  xt = pSib->pNext
12260 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70  ;.          p->p
12270 50 72 65 76 20 3d 20 70 53 69 62 3b 0a 20 20 20  Prev = pSib;.   
12280 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 4e         if( p->pN
12290 65 78 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ext ){.         
122a0 20 20 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72     p->pNext->pPr
122b0 65 76 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20  ev = p;.        
122c0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 53    }.          pS
122d0 69 62 2d 3e 70 4e 65 78 74 20 3d 20 70 3b 0a 20  ib->pNext = p;. 
122e0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
122f0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
12300 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
12310 0a 20 20 2a 70 70 42 74 72 65 65 20 3d 20 70 3b  .  *ppBtree = p;
12320 0a 0a 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74  ..btree_open_out
12330 3a 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  :.  if( rc!=SQLI
12340 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
12350 20 70 42 74 20 26 26 20 70 42 74 2d 3e 70 50 61   pBt && pBt->pPa
12360 67 65 72 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ger ){.      sql
12370 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28 70  ite3PagerClose(p
12380 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20  Bt->pPager);.   
12390 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66   }.    sqlite3_f
123a0 72 65 65 28 70 42 74 29 3b 0a 20 20 20 20 73 71  ree(pBt);.    sq
123b0 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20  lite3_free(p);. 
123c0 20 20 20 2a 70 70 42 74 72 65 65 20 3d 20 30 3b     *ppBtree = 0;
123d0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
123e0 20 49 66 20 74 68 65 20 42 2d 54 72 65 65 20 77   If the B-Tree w
123f0 61 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  as successfully 
12400 6f 70 65 6e 65 64 2c 20 73 65 74 20 74 68 65 20  opened, set the 
12410 70 61 67 65 72 2d 63 61 63 68 65 20 73 69 7a 65  pager-cache size
12420 20 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 64   to the.    ** d
12430 65 66 61 75 6c 74 20 76 61 6c 75 65 2e 20 45 78  efault value. Ex
12440 63 65 70 74 2c 20 77 68 65 6e 20 6f 70 65 6e 69  cept, when openi
12450 6e 67 20 6f 6e 20 61 6e 20 65 78 69 73 74 69 6e  ng on an existin
12460 67 20 73 68 61 72 65 64 20 70 61 67 65 72 2d 63  g shared pager-c
12470 61 63 68 65 2c 0a 20 20 20 20 2a 2a 20 64 6f 20  ache,.    ** do 
12480 6e 6f 74 20 63 68 61 6e 67 65 20 74 68 65 20 70  not change the p
12490 61 67 65 72 2d 63 61 63 68 65 20 73 69 7a 65 2e  ager-cache size.
124a0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
124b0 73 71 6c 69 74 65 33 42 74 72 65 65 53 63 68 65  sqlite3BtreeSche
124c0 6d 61 28 70 2c 20 30 2c 20 30 29 3d 3d 30 20 29  ma(p, 0, 0)==0 )
124d0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  {.      sqlite3P
124e0 61 67 65 72 53 65 74 43 61 63 68 65 73 69 7a 65  agerSetCachesize
124f0 28 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 2c  (p->pBt->pPager,
12500 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
12510 43 41 43 48 45 5f 53 49 5a 45 29 3b 0a 20 20 20  CACHE_SIZE);.   
12520 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6d 75 74   }.  }.  if( mut
12530 65 78 4f 70 65 6e 20 29 7b 0a 20 20 20 20 61 73  exOpen ){.    as
12540 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
12550 74 65 78 5f 68 65 6c 64 28 6d 75 74 65 78 4f 70  tex_held(mutexOp
12560 65 6e 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  en) );.    sqlit
12570 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d  e3_mutex_leave(m
12580 75 74 65 78 4f 70 65 6e 29 3b 0a 20 20 7d 0a 20  utexOpen);.  }. 
12590 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
125a0 2a 0a 2a 2a 20 44 65 63 72 65 6d 65 6e 74 20 74  *.** Decrement t
125b0 68 65 20 42 74 53 68 61 72 65 64 2e 6e 52 65 66  he BtShared.nRef
125c0 20 63 6f 75 6e 74 65 72 2e 20 20 57 68 65 6e 20   counter.  When 
125d0 69 74 20 72 65 61 63 68 65 73 20 7a 65 72 6f 2c  it reaches zero,
125e0 0a 2a 2a 20 72 65 6d 6f 76 65 20 74 68 65 20 42  .** remove the B
125f0 74 53 68 61 72 65 64 20 73 74 72 75 63 74 75 72  tShared structur
12600 65 20 66 72 6f 6d 20 74 68 65 20 73 68 61 72 69  e from the shari
12610 6e 67 20 6c 69 73 74 2e 20 20 52 65 74 75 72 6e  ng list.  Return
12620 0a 2a 2a 20 74 72 75 65 20 69 66 20 74 68 65 20  .** true if the 
12630 42 74 53 68 61 72 65 64 2e 6e 52 65 66 20 63 6f  BtShared.nRef co
12640 75 6e 74 65 72 20 72 65 61 63 68 65 73 20 7a 65  unter reaches ze
12650 72 6f 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a  ro and return.**
12660 20 66 61 6c 73 65 20 69 66 20 69 74 20 69 73 20   false if it is 
12670 73 74 69 6c 6c 20 70 6f 73 69 74 69 76 65 2e 0a  still positive..
12680 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65  */.static int re
12690 6d 6f 76 65 46 72 6f 6d 53 68 61 72 69 6e 67 4c  moveFromSharingL
126a0 69 73 74 28 42 74 53 68 61 72 65 64 20 2a 70 42  ist(BtShared *pB
126b0 74 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  t){.#ifndef SQLI
126c0 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
126d0 41 43 48 45 0a 20 20 4d 55 54 45 58 5f 4c 4f 47  ACHE.  MUTEX_LOG
126e0 49 43 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  IC( sqlite3_mute
126f0 78 20 2a 70 4d 61 73 74 65 72 3b 20 29 0a 20 20  x *pMaster; ).  
12700 42 74 53 68 61 72 65 64 20 2a 70 4c 69 73 74 3b  BtShared *pList;
12710 0a 20 20 69 6e 74 20 72 65 6d 6f 76 65 64 20 3d  .  int removed =
12720 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73   0;..  assert( s
12730 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6e 6f 74  qlite3_mutex_not
12740 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
12750 20 29 3b 0a 20 20 4d 55 54 45 58 5f 4c 4f 47 49   );.  MUTEX_LOGI
12760 43 28 20 70 4d 61 73 74 65 72 20 3d 20 73 71 6c  C( pMaster = sql
12770 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53  ite3MutexAlloc(S
12780 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54  QLITE_MUTEX_STAT
12790 49 43 5f 4d 41 53 54 45 52 29 3b 20 29 0a 20 20  IC_MASTER); ).  
127a0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
127b0 74 65 72 28 70 4d 61 73 74 65 72 29 3b 0a 20 20  ter(pMaster);.  
127c0 70 42 74 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69  pBt->nRef--;.  i
127d0 66 28 20 70 42 74 2d 3e 6e 52 65 66 3c 3d 30 20  f( pBt->nRef<=0 
127e0 29 7b 0a 20 20 20 20 69 66 28 20 47 4c 4f 42 41  ){.    if( GLOBA
127f0 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69  L(BtShared*,sqli
12800 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69  te3SharedCacheLi
12810 73 74 29 3d 3d 70 42 74 20 29 7b 0a 20 20 20 20  st)==pBt ){.    
12820 20 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65    GLOBAL(BtShare
12830 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64  d*,sqlite3Shared
12840 43 61 63 68 65 4c 69 73 74 29 20 3d 20 70 42 74  CacheList) = pBt
12850 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 65 6c  ->pNext;.    }el
12860 73 65 7b 0a 20 20 20 20 20 20 70 4c 69 73 74 20  se{.      pList 
12870 3d 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65  = GLOBAL(BtShare
12880 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64  d*,sqlite3Shared
12890 43 61 63 68 65 4c 69 73 74 29 3b 0a 20 20 20 20  CacheList);.    
128a0 20 20 77 68 69 6c 65 28 20 41 4c 57 41 59 53 28    while( ALWAYS(
128b0 70 4c 69 73 74 29 20 26 26 20 70 4c 69 73 74 2d  pList) && pList-
128c0 3e 70 4e 65 78 74 21 3d 70 42 74 20 29 7b 0a 20  >pNext!=pBt ){. 
128d0 20 20 20 20 20 20 20 70 4c 69 73 74 3d 70 4c 69         pList=pLi
128e0 73 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  st->pNext;.     
128f0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 41 4c 57   }.      if( ALW
12900 41 59 53 28 70 4c 69 73 74 29 20 29 7b 0a 20 20  AYS(pList) ){.  
12910 20 20 20 20 20 20 70 4c 69 73 74 2d 3e 70 4e 65        pList->pNe
12920 78 74 20 3d 20 70 42 74 2d 3e 70 4e 65 78 74 3b  xt = pBt->pNext;
12930 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
12940 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 54 48     if( SQLITE_TH
12950 52 45 41 44 53 41 46 45 20 29 7b 0a 20 20 20 20  READSAFE ){.    
12960 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
12970 66 72 65 65 28 70 42 74 2d 3e 6d 75 74 65 78 29  free(pBt->mutex)
12980 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 6d 6f  ;.    }.    remo
12990 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 73  ved = 1;.  }.  s
129a0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
129b0 76 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 72  ve(pMaster);.  r
129c0 65 74 75 72 6e 20 72 65 6d 6f 76 65 64 3b 0a 23  eturn removed;.#
129d0 65 6c 73 65 0a 20 20 72 65 74 75 72 6e 20 31 3b  else.  return 1;
129e0 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
129f0 20 4d 61 6b 65 20 73 75 72 65 20 70 42 74 2d 3e   Make sure pBt->
12a00 70 54 6d 70 53 70 61 63 65 20 70 6f 69 6e 74 73  pTmpSpace points
12a10 20 74 6f 20 61 6e 20 61 6c 6c 6f 63 61 74 69 6f   to an allocatio
12a20 6e 20 6f 66 20 0a 2a 2a 20 4d 58 5f 43 45 4c 4c  n of .** MX_CELL
12a30 5f 53 49 5a 45 28 70 42 74 29 20 62 79 74 65 73  _SIZE(pBt) bytes
12a40 20 77 69 74 68 20 61 20 34 2d 62 79 74 65 20 70   with a 4-byte p
12a50 72 65 66 69 78 20 66 6f 72 20 61 20 6c 65 66 74  refix for a left
12a60 2d 63 68 69 6c 64 0a 2a 2a 20 70 6f 69 6e 74 65  -child.** pointe
12a70 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  r..*/.static voi
12a80 64 20 61 6c 6c 6f 63 61 74 65 54 65 6d 70 53 70  d allocateTempSp
12a90 61 63 65 28 42 74 53 68 61 72 65 64 20 2a 70 42  ace(BtShared *pB
12aa0 74 29 7b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e  t){.  if( !pBt->
12ab0 70 54 6d 70 53 70 61 63 65 20 29 7b 0a 20 20 20  pTmpSpace ){.   
12ac0 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20   pBt->pTmpSpace 
12ad0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 4d 61 6c  = sqlite3PageMal
12ae0 6c 6f 63 28 20 70 42 74 2d 3e 70 61 67 65 53 69  loc( pBt->pageSi
12af0 7a 65 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 4f 6e  ze );..    /* On
12b00 65 20 6f 66 20 74 68 65 20 75 73 65 73 20 6f 66  e of the uses of
12b10 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20   pBt->pTmpSpace 
12b20 69 73 20 74 6f 20 66 6f 72 6d 61 74 20 63 65 6c  is to format cel
12b30 6c 73 20 62 65 66 6f 72 65 0a 20 20 20 20 2a 2a  ls before.    **
12b40 20 69 6e 73 65 72 74 69 6e 67 20 74 68 65 6d 20   inserting them 
12b50 69 6e 74 6f 20 61 20 6c 65 61 66 20 70 61 67 65  into a leaf page
12b60 20 28 66 75 6e 63 74 69 6f 6e 20 66 69 6c 6c 49   (function fillI
12b70 6e 43 65 6c 6c 28 29 29 2e 20 49 66 0a 20 20 20  nCell()). If.   
12b80 20 2a 2a 20 61 20 63 65 6c 6c 20 69 73 20 6c 65   ** a cell is le
12b90 73 73 20 74 68 61 6e 20 34 20 62 79 74 65 73 20  ss than 4 bytes 
12ba0 69 6e 20 73 69 7a 65 2c 20 69 74 20 69 73 20 72  in size, it is r
12bb0 6f 75 6e 64 65 64 20 75 70 20 74 6f 20 34 20 62  ounded up to 4 b
12bc0 79 74 65 73 0a 20 20 20 20 2a 2a 20 62 79 20 74  ytes.    ** by t
12bd0 68 65 20 76 61 72 69 6f 75 73 20 72 6f 75 74 69  he various routi
12be0 6e 65 73 20 74 68 61 74 20 6d 61 6e 69 70 75 6c  nes that manipul
12bf0 61 74 65 20 62 69 6e 61 72 79 20 63 65 6c 6c 73  ate binary cells
12c00 2e 20 57 68 69 63 68 0a 20 20 20 20 2a 2a 20 63  . Which.    ** c
12c10 61 6e 20 6d 65 61 6e 20 74 68 61 74 20 66 69 6c  an mean that fil
12c20 6c 49 6e 43 65 6c 6c 28 29 20 6f 6e 6c 79 20 69  lInCell() only i
12c30 6e 69 74 69 61 6c 69 7a 65 73 20 74 68 65 20 66  nitializes the f
12c40 69 72 73 74 20 32 20 6f 72 20 33 0a 20 20 20 20  irst 2 or 3.    
12c50 2a 2a 20 62 79 74 65 73 20 6f 66 20 70 54 6d 70  ** bytes of pTmp
12c60 53 70 61 63 65 2c 20 62 75 74 20 74 68 61 74 20  Space, but that 
12c70 74 68 65 20 66 69 72 73 74 20 34 20 62 79 74 65  the first 4 byte
12c80 73 20 61 72 65 20 63 6f 70 69 65 64 20 66 72 6f  s are copied fro
12c90 6d 0a 20 20 20 20 2a 2a 20 69 74 20 69 6e 74 6f  m.    ** it into
12ca0 20 61 20 64 61 74 61 62 61 73 65 20 70 61 67 65   a database page
12cb0 2e 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61 63  . This is not ac
12cc0 74 75 61 6c 6c 79 20 61 20 70 72 6f 62 6c 65 6d  tually a problem
12cd0 2c 20 62 75 74 20 69 74 0a 20 20 20 20 2a 2a 20  , but it.    ** 
12ce0 64 6f 65 73 20 63 61 75 73 65 20 61 20 76 61 6c  does cause a val
12cf0 67 72 69 6e 64 20 65 72 72 6f 72 20 77 68 65 6e  grind error when
12d00 20 74 68 65 20 31 20 6f 72 20 32 20 62 79 74 65   the 1 or 2 byte
12d10 73 20 6f 66 20 75 6e 69 74 69 61 6c 69 7a 65 64  s of unitialized
12d20 20 0a 20 20 20 20 2a 2a 20 64 61 74 61 20 69 73   .    ** data is
12d30 20 70 61 73 73 65 64 20 74 6f 20 73 79 73 74 65   passed to syste
12d40 6d 20 63 61 6c 6c 20 77 72 69 74 65 28 29 2e 20  m call write(). 
12d50 53 6f 20 74 6f 20 61 76 6f 69 64 20 74 68 69 73  So to avoid this
12d60 20 65 72 72 6f 72 2c 0a 20 20 20 20 2a 2a 20 7a   error,.    ** z
12d70 65 72 6f 20 74 68 65 20 66 69 72 73 74 20 34 20  ero the first 4 
12d80 62 79 74 65 73 20 6f 66 20 74 65 6d 70 20 73 70  bytes of temp sp
12d90 61 63 65 20 68 65 72 65 2e 0a 20 20 20 20 2a 2a  ace here..    **
12da0 0a 20 20 20 20 2a 2a 20 41 6c 73 6f 3a 20 20 50  .    ** Also:  P
12db0 72 6f 76 69 64 65 20 66 6f 75 72 20 62 79 74 65  rovide four byte
12dc0 73 20 6f 66 20 69 6e 69 74 69 61 6c 69 7a 65 64  s of initialized
12dd0 20 73 70 61 63 65 20 62 65 66 6f 72 65 20 74 68   space before th
12de0 65 0a 20 20 20 20 2a 2a 20 62 65 67 69 6e 6e 69  e.    ** beginni
12df0 6e 67 20 6f 66 20 70 54 6d 70 53 70 61 63 65 20  ng of pTmpSpace 
12e00 61 73 20 61 6e 20 61 72 65 61 20 61 76 61 69 6c  as an area avail
12e10 61 62 6c 65 20 74 6f 20 70 72 65 70 65 6e 64 20  able to prepend 
12e20 74 68 65 0a 20 20 20 20 2a 2a 20 6c 65 66 74 2d  the.    ** left-
12e30 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 20 74 6f  child pointer to
12e40 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
12e50 66 20 61 20 63 65 6c 6c 2e 0a 20 20 20 20 2a 2f  f a cell..    */
12e60 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 70 54  .    if( pBt->pT
12e70 6d 70 53 70 61 63 65 20 29 7b 0a 20 20 20 20 20  mpSpace ){.     
12e80 20 6d 65 6d 73 65 74 28 70 42 74 2d 3e 70 54 6d   memset(pBt->pTm
12e90 70 53 70 61 63 65 2c 20 30 2c 20 38 29 3b 0a 20  pSpace, 0, 8);. 
12ea0 20 20 20 20 20 70 42 74 2d 3e 70 54 6d 70 53 70       pBt->pTmpSp
12eb0 61 63 65 20 2b 3d 20 34 3b 0a 20 20 20 20 7d 0a  ace += 4;.    }.
12ec0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65    }.}../*.** Fre
12ed0 65 20 74 68 65 20 70 42 74 2d 3e 70 54 6d 70 53  e the pBt->pTmpS
12ee0 70 61 63 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a  pace allocation.
12ef0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
12f00 72 65 65 54 65 6d 70 53 70 61 63 65 28 42 74 53  reeTempSpace(BtS
12f10 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69  hared *pBt){.  i
12f20 66 28 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63  f( pBt->pTmpSpac
12f30 65 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e 70 54  e ){.    pBt->pT
12f40 6d 70 53 70 61 63 65 20 2d 3d 20 34 3b 0a 20 20  mpSpace -= 4;.  
12f50 20 20 73 71 6c 69 74 65 33 50 61 67 65 46 72 65    sqlite3PageFre
12f60 65 28 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65  e(pBt->pTmpSpace
12f70 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70 54 6d 70  );.    pBt->pTmp
12f80 53 70 61 63 65 20 3d 20 30 3b 0a 20 20 7d 0a 7d  Space = 0;.  }.}
12f90 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e  ../*.** Close an
12fa0 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 61   open database a
12fb0 6e 64 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6c  nd invalidate al
12fc0 6c 20 63 75 72 73 6f 72 73 2e 0a 2a 2f 0a 69 6e  l cursors..*/.in
12fd0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c  t sqlite3BtreeCl
12fe0 6f 73 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  ose(Btree *p){. 
12ff0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
13000 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74 43 75 72   p->pBt;.  BtCur
13010 73 6f 72 20 2a 70 43 75 72 3b 0a 0a 20 20 2f 2a  sor *pCur;..  /*
13020 20 43 6c 6f 73 65 20 61 6c 6c 20 63 75 72 73 6f   Close all curso
13030 72 73 20 6f 70 65 6e 65 64 20 76 69 61 20 74 68  rs opened via th
13040 69 73 20 68 61 6e 64 6c 65 2e 20 20 2a 2f 0a 20  is handle.  */. 
13050 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
13060 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64  _mutex_held(p->d
13070 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73  b->mutex) );.  s
13080 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
13090 28 70 29 3b 0a 20 20 70 43 75 72 20 3d 20 70 42  (p);.  pCur = pB
130a0 74 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 77 68  t->pCursor;.  wh
130b0 69 6c 65 28 20 70 43 75 72 20 29 7b 0a 20 20 20  ile( pCur ){.   
130c0 20 42 74 43 75 72 73 6f 72 20 2a 70 54 6d 70 20   BtCursor *pTmp 
130d0 3d 20 70 43 75 72 3b 0a 20 20 20 20 70 43 75 72  = pCur;.    pCur
130e0 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a   = pCur->pNext;.
130f0 20 20 20 20 69 66 28 20 70 54 6d 70 2d 3e 70 42      if( pTmp->pB
13100 74 72 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20  tree==p ){.     
13110 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f   sqlite3BtreeClo
13120 73 65 43 75 72 73 6f 72 28 70 54 6d 70 29 3b 0a  seCursor(pTmp);.
13130 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
13140 52 6f 6c 6c 62 61 63 6b 20 61 6e 79 20 61 63 74  Rollback any act
13150 69 76 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ive transaction 
13160 61 6e 64 20 66 72 65 65 20 74 68 65 20 68 61 6e  and free the han
13170 64 6c 65 20 73 74 72 75 63 74 75 72 65 2e 0a 20  dle structure.. 
13180 20 2a 2a 20 54 68 65 20 63 61 6c 6c 20 74 6f 20   ** The call to 
13190 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c  sqlite3BtreeRoll
131a0 62 61 63 6b 28 29 20 64 72 6f 70 73 20 61 6e 79  back() drops any
131b0 20 74 61 62 6c 65 2d 6c 6f 63 6b 73 20 68 65 6c   table-locks hel
131c0 64 20 62 79 0a 20 20 2a 2a 20 74 68 69 73 20 68  d by.  ** this h
131d0 61 6e 64 6c 65 2e 0a 20 20 2a 2f 0a 20 20 73 71  andle..  */.  sq
131e0 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61  lite3BtreeRollba
131f0 63 6b 28 70 2c 20 53 51 4c 49 54 45 5f 4f 4b 2c  ck(p, SQLITE_OK,
13200 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74   0);.  sqlite3Bt
13210 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 0a 20 20  reeLeave(p);..  
13220 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  /* If there are 
13230 73 74 69 6c 6c 20 6f 74 68 65 72 20 6f 75 74 73  still other outs
13240 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63  tanding referenc
13250 65 73 20 74 6f 20 74 68 65 20 73 68 61 72 65 64  es to the shared
13260 2d 62 74 72 65 65 0a 20 20 2a 2a 20 73 74 72 75  -btree.  ** stru
13270 63 74 75 72 65 2c 20 72 65 74 75 72 6e 20 6e 6f  cture, return no
13280 77 2e 20 54 68 65 20 72 65 6d 61 69 6e 64 65 72  w. The remainder
13290 20 6f 66 20 74 68 69 73 20 70 72 6f 63 65 64 75   of this procedu
132a0 72 65 20 63 6c 65 61 6e 73 20 0a 20 20 2a 2a 20  re cleans .  ** 
132b0 75 70 20 74 68 65 20 73 68 61 72 65 64 2d 62 74  up the shared-bt
132c0 72 65 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ree..  */.  asse
132d0 72 74 28 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f 63  rt( p->wantToLoc
132e0 6b 3d 3d 30 20 26 26 20 70 2d 3e 6c 6f 63 6b 65  k==0 && p->locke
132f0 64 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 21 70  d==0 );.  if( !p
13300 2d 3e 73 68 61 72 61 62 6c 65 20 7c 7c 20 72 65  ->sharable || re
13310 6d 6f 76 65 46 72 6f 6d 53 68 61 72 69 6e 67 4c  moveFromSharingL
13320 69 73 74 28 70 42 74 29 20 29 7b 0a 20 20 20 20  ist(pBt) ){.    
13330 2f 2a 20 54 68 65 20 70 42 74 20 69 73 20 6e 6f  /* The pBt is no
13340 20 6c 6f 6e 67 65 72 20 6f 6e 20 74 68 65 20 73   longer on the s
13350 68 61 72 69 6e 67 20 6c 69 73 74 2c 20 73 6f 20  haring list, so 
13360 77 65 20 63 61 6e 20 61 63 63 65 73 73 0a 20 20  we can access.  
13370 20 20 2a 2a 20 69 74 20 77 69 74 68 6f 75 74 20    ** it without 
13380 68 61 76 69 6e 67 20 74 6f 20 68 6f 6c 64 20 74  having to hold t
13390 68 65 20 6d 75 74 65 78 2e 0a 20 20 20 20 2a 2a  he mutex..    **
133a0 0a 20 20 20 20 2a 2a 20 43 6c 65 61 6e 20 6f 75  .    ** Clean ou
133b0 74 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65  t and delete the
133c0 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74   BtShared object
133d0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
133e0 65 72 74 28 20 21 70 42 74 2d 3e 70 43 75 72 73  ert( !pBt->pCurs
133f0 6f 72 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  or );.    sqlite
13400 33 50 61 67 65 72 43 6c 6f 73 65 28 70 42 74 2d  3PagerClose(pBt-
13410 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66  >pPager);.    if
13420 28 20 70 42 74 2d 3e 78 46 72 65 65 53 63 68 65  ( pBt->xFreeSche
13430 6d 61 20 26 26 20 70 42 74 2d 3e 70 53 63 68 65  ma && pBt->pSche
13440 6d 61 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d  ma ){.      pBt-
13450 3e 78 46 72 65 65 53 63 68 65 6d 61 28 70 42 74  >xFreeSchema(pBt
13460 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20  ->pSchema);.    
13470 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  }.    sqlite3DbF
13480 72 65 65 28 30 2c 20 70 42 74 2d 3e 70 53 63 68  ree(0, pBt->pSch
13490 65 6d 61 29 3b 0a 20 20 20 20 66 72 65 65 54 65  ema);.    freeTe
134a0 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20  mpSpace(pBt);.  
134b0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
134c0 42 74 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65  Bt);.  }..#ifnde
134d0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  f SQLITE_OMIT_SH
134e0 41 52 45 44 5f 43 41 43 48 45 0a 20 20 61 73 73  ARED_CACHE.  ass
134f0 65 72 74 28 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f  ert( p->wantToLo
13500 63 6b 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ck==0 );.  asser
13510 74 28 20 70 2d 3e 6c 6f 63 6b 65 64 3d 3d 30 20  t( p->locked==0 
13520 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 65  );.  if( p->pPre
13530 76 20 29 20 70 2d 3e 70 50 72 65 76 2d 3e 70 4e  v ) p->pPrev->pN
13540 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a  ext = p->pNext;.
13550 20 20 69 66 28 20 70 2d 3e 70 4e 65 78 74 20 29    if( p->pNext )
13560 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76   p->pNext->pPrev
13570 20 3d 20 70 2d 3e 70 50 72 65 76 3b 0a 23 65 6e   = p->pPrev;.#en
13580 64 69 66 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66  dif..  sqlite3_f
13590 72 65 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ree(p);.  return
135a0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
135b0 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
135c0 6c 69 6d 69 74 20 6f 6e 20 74 68 65 20 6e 75 6d  limit on the num
135d0 62 65 72 20 6f 66 20 70 61 67 65 73 20 61 6c 6c  ber of pages all
135e0 6f 77 65 64 20 69 6e 20 74 68 65 20 63 61 63 68  owed in the cach
135f0 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 78  e..**.** The max
13600 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 63  imum number of c
13610 61 63 68 65 20 70 61 67 65 73 20 69 73 20 73 65  ache pages is se
13620 74 20 74 6f 20 74 68 65 20 61 62 73 6f 6c 75 74  t to the absolut
13630 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 6d 78  e.** value of mx
13640 50 61 67 65 2e 20 20 49 66 20 6d 78 50 61 67 65  Page.  If mxPage
13650 20 69 73 20 6e 65 67 61 74 69 76 65 2c 20 74 68   is negative, th
13660 65 20 70 61 67 65 72 20 77 69 6c 6c 0a 2a 2a 20  e pager will.** 
13670 6f 70 65 72 61 74 65 20 61 73 79 6e 63 68 72 6f  operate asynchro
13680 6e 6f 75 73 6c 79 20 2d 20 69 74 20 77 69 6c 6c  nously - it will
13690 20 6e 6f 74 20 73 74 6f 70 20 74 6f 20 64 6f 20   not stop to do 
136a0 66 73 79 6e 63 28 29 73 0a 2a 2a 20 74 6f 20 69  fsync()s.** to i
136b0 6e 73 75 72 65 20 64 61 74 61 20 69 73 20 77 72  nsure data is wr
136c0 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64 69 73  itten to the dis
136d0 6b 20 73 75 72 66 61 63 65 20 62 65 66 6f 72 65  k surface before
136e0 0a 2a 2a 20 63 6f 6e 74 69 6e 75 69 6e 67 2e 20  .** continuing. 
136f0 20 54 72 61 6e 73 61 63 74 69 6f 6e 73 20 73 74   Transactions st
13700 69 6c 6c 20 77 6f 72 6b 20 69 66 20 73 79 6e 63  ill work if sync
13710 68 72 6f 6e 6f 75 73 20 69 73 20 6f 66 66 2c 0a  hronous is off,.
13720 2a 2a 20 61 6e 64 20 74 68 65 20 64 61 74 61 62  ** and the datab
13730 61 73 65 20 63 61 6e 6e 6f 74 20 62 65 20 63 6f  ase cannot be co
13740 72 72 75 70 74 65 64 20 69 66 20 74 68 69 73 20  rrupted if this 
13750 70 72 6f 67 72 61 6d 0a 2a 2a 20 63 72 61 73 68  program.** crash
13760 65 73 2e 20 20 42 75 74 20 69 66 20 74 68 65 20  es.  But if the 
13770 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d  operating system
13780 20 63 72 61 73 68 65 73 20 6f 72 20 74 68 65 72   crashes or ther
13790 65 20 69 73 0a 2a 2a 20 61 6e 20 61 62 72 75 70  e is.** an abrup
137a0 74 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20  t power failure 
137b0 77 68 65 6e 20 73 79 6e 63 68 72 6f 6e 6f 75 73  when synchronous
137c0 20 69 73 20 6f 66 66 2c 20 74 68 65 20 64 61 74   is off, the dat
137d0 61 62 61 73 65 0a 2a 2a 20 63 6f 75 6c 64 20 62  abase.** could b
137e0 65 20 6c 65 66 74 20 69 6e 20 61 6e 20 69 6e 63  e left in an inc
137f0 6f 6e 73 69 73 74 65 6e 74 20 61 6e 64 20 75 6e  onsistent and un
13800 72 65 63 6f 76 65 72 61 62 6c 65 20 73 74 61 74  recoverable stat
13810 65 2e 0a 2a 2a 20 53 79 6e 63 68 72 6f 6e 6f 75  e..** Synchronou
13820 73 20 69 73 20 6f 6e 20 62 79 20 64 65 66 61 75  s is on by defau
13830 6c 74 20 73 6f 20 64 61 74 61 62 61 73 65 20 63  lt so database c
13840 6f 72 72 75 70 74 69 6f 6e 20 69 73 20 6e 6f 74  orruption is not
13850 0a 2a 2a 20 6e 6f 72 6d 61 6c 6c 79 20 61 20 77  .** normally a w
13860 6f 72 72 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  orry..*/.int sql
13870 69 74 65 33 42 74 72 65 65 53 65 74 43 61 63 68  ite3BtreeSetCach
13880 65 53 69 7a 65 28 42 74 72 65 65 20 2a 70 2c 20  eSize(Btree *p, 
13890 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 42  int mxPage){.  B
138a0 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
138b0 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28  ->pBt;.  assert(
138c0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
138d0 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78  eld(p->db->mutex
138e0 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ) );.  sqlite3Bt
138f0 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 73  reeEnter(p);.  s
13900 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 43 61  qlite3PagerSetCa
13910 63 68 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61  chesize(pBt->pPa
13920 67 65 72 2c 20 6d 78 50 61 67 65 29 3b 0a 20 20  ger, mxPage);.  
13930 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
13940 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  e(p);.  return S
13950 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66  QLITE_OK;.}..#if
13960 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
13970 5f 53 49 5a 45 3e 30 0a 2f 2a 0a 2a 2a 20 43 68  _SIZE>0./*.** Ch
13980 61 6e 67 65 20 74 68 65 20 6c 69 6d 69 74 20 6f  ange the limit o
13990 6e 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20  n the amount of 
139a0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
139b0 65 20 74 68 61 74 20 6d 61 79 20 62 65 0a 2a 2a  e that may be.**
139c0 20 6d 65 6d 6f 72 79 20 6d 61 70 70 65 64 2e 0a   memory mapped..
139d0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
139e0 72 65 65 53 65 74 4d 6d 61 70 4c 69 6d 69 74 28  reeSetMmapLimit(
139f0 42 74 72 65 65 20 2a 70 2c 20 73 71 6c 69 74 65  Btree *p, sqlite
13a00 33 5f 69 6e 74 36 34 20 73 7a 4d 6d 61 70 29 7b  3_int64 szMmap){
13a10 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
13a20 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73   = p->pBt;.  ass
13a30 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
13a40 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d  ex_held(p->db->m
13a50 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74  utex) );.  sqlit
13a60 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
13a70 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  .  sqlite3PagerS
13a80 65 74 4d 6d 61 70 4c 69 6d 69 74 28 70 42 74 2d  etMmapLimit(pBt-
13a90 3e 70 50 61 67 65 72 2c 20 73 7a 4d 6d 61 70 29  >pPager, szMmap)
13aa0 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
13ab0 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
13ac0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
13ad0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
13ae0 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30  _MAX_MMAP_SIZE>0
13af0 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67   */../*.** Chang
13b00 65 20 74 68 65 20 77 61 79 20 64 61 74 61 20 69  e the way data i
13b10 73 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b  s synced to disk
13b20 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 69 6e 63   in order to inc
13b30 72 65 61 73 65 20 6f 72 20 64 65 63 72 65 61 73  rease or decreas
13b40 65 0a 2a 2a 20 68 6f 77 20 77 65 6c 6c 20 74 68  e.** how well th
13b50 65 20 64 61 74 61 62 61 73 65 20 72 65 73 69 73  e database resis
13b60 74 73 20 64 61 6d 61 67 65 20 64 75 65 20 74 6f  ts damage due to
13b70 20 4f 53 20 63 72 61 73 68 65 73 20 61 6e 64 20   OS crashes and 
13b80 70 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65  power.** failure
13b90 73 2e 20 20 4c 65 76 65 6c 20 31 20 69 73 20 74  s.  Level 1 is t
13ba0 68 65 20 73 61 6d 65 20 61 73 20 61 73 79 6e 63  he same as async
13bb0 68 72 6f 6e 6f 75 73 20 28 6e 6f 20 73 79 6e 63  hronous (no sync
13bc0 73 28 29 20 6f 63 63 75 72 20 61 6e 64 0a 2a 2a  s() occur and.**
13bd0 20 74 68 65 72 65 20 69 73 20 61 20 68 69 67 68   there is a high
13be0 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20   probability of 
13bf0 64 61 6d 61 67 65 29 20 20 4c 65 76 65 6c 20 32  damage)  Level 2
13c00 20 69 73 20 74 68 65 20 64 65 66 61 75 6c 74 2e   is the default.
13c10 20 20 54 68 65 72 65 0a 2a 2a 20 69 73 20 61 20    There.** is a 
13c20 76 65 72 79 20 6c 6f 77 20 62 75 74 20 6e 6f 6e  very low but non
13c30 2d 7a 65 72 6f 20 70 72 6f 62 61 62 69 6c 69 74  -zero probabilit
13c40 79 20 6f 66 20 64 61 6d 61 67 65 2e 20 20 4c 65  y of damage.  Le
13c50 76 65 6c 20 33 20 72 65 64 75 63 65 73 20 74 68  vel 3 reduces th
13c60 65 0a 2a 2a 20 70 72 6f 62 61 62 69 6c 69 74 79  e.** probability
13c70 20 6f 66 20 64 61 6d 61 67 65 20 74 6f 20 6e 65   of damage to ne
13c80 61 72 20 7a 65 72 6f 20 62 75 74 20 77 69 74 68  ar zero but with
13c90 20 61 20 77 72 69 74 65 20 70 65 72 66 6f 72 6d   a write perform
13ca0 61 6e 63 65 20 72 65 64 75 63 74 69 6f 6e 2e 0a  ance reduction..
13cb0 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
13cc0 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41  E_OMIT_PAGER_PRA
13cd0 47 4d 41 53 0a 69 6e 74 20 73 71 6c 69 74 65 33  GMAS.int sqlite3
13ce0 42 74 72 65 65 53 65 74 50 61 67 65 72 46 6c 61  BtreeSetPagerFla
13cf0 67 73 28 0a 20 20 42 74 72 65 65 20 2a 70 2c 20  gs(.  Btree *p, 
13d00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13d10 54 68 65 20 62 74 72 65 65 20 74 6f 20 73 65 74  The btree to set
13d20 20 74 68 65 20 73 61 66 65 74 79 20 6c 65 76 65   the safety leve
13d30 6c 20 6f 6e 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  l on */.  unsign
13d40 65 64 20 70 67 46 6c 61 67 73 20 20 20 20 20 20  ed pgFlags      
13d50 20 2f 2a 20 56 61 72 69 6f 75 73 20 50 41 47 45   /* Various PAGE
13d60 52 5f 2a 20 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a  R_* flags */.){.
13d70 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
13d80 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65  = p->pBt;.  asse
13d90 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
13da0 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75  x_held(p->db->mu
13db0 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65  tex) );.  sqlite
13dc0 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
13dd0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65    sqlite3PagerSe
13de0 74 46 6c 61 67 73 28 70 42 74 2d 3e 70 50 61 67  tFlags(pBt->pPag
13df0 65 72 2c 20 70 67 46 6c 61 67 73 29 3b 0a 20 20  er, pgFlags);.  
13e00 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
13e10 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  e(p);.  return S
13e20 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64  QLITE_OK;.}.#end
13e30 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  if../*.** Return
13e40 20 54 52 55 45 20 69 66 20 74 68 65 20 67 69 76   TRUE if the giv
13e50 65 6e 20 62 74 72 65 65 20 69 73 20 73 65 74 20  en btree is set 
13e60 74 6f 20 73 61 66 65 74 79 20 6c 65 76 65 6c 20  to safety level 
13e70 31 2e 20 20 49 6e 20 6f 74 68 65 72 0a 2a 2a 20  1.  In other.** 
13e80 77 6f 72 64 73 2c 20 72 65 74 75 72 6e 20 54 52  words, return TR
13e90 55 45 20 69 66 20 6e 6f 20 73 79 6e 63 28 29 20  UE if no sync() 
13ea0 6f 63 63 75 72 73 20 6f 6e 20 74 68 65 20 64 69  occurs on the di
13eb0 73 6b 20 66 69 6c 65 73 2e 0a 2a 2f 0a 69 6e 74  sk files..*/.int
13ec0 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 79 6e   sqlite3BtreeSyn
13ed0 63 44 69 73 61 62 6c 65 64 28 42 74 72 65 65 20  cDisabled(Btree 
13ee0 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  *p){.  BtShared 
13ef0 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
13f00 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72   int rc;.  asser
13f10 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
13f20 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74  _held(p->db->mut
13f30 65 78 29 20 29 3b 20 20 0a 20 20 73 71 6c 69 74  ex) );  .  sqlit
13f40 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
13f50 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 20 26  .  assert( pBt &
13f60 26 20 70 42 74 2d 3e 70 50 61 67 65 72 20 29 3b  & pBt->pPager );
13f70 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
13f80 61 67 65 72 4e 6f 73 79 6e 63 28 70 42 74 2d 3e  agerNosync(pBt->
13f90 70 50 61 67 65 72 29 3b 0a 20 20 73 71 6c 69 74  pPager);.  sqlit
13fa0 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
13fb0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
13fc0 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
13fd0 65 20 64 65 66 61 75 6c 74 20 70 61 67 65 73 20  e default pages 
13fe0 73 69 7a 65 20 61 6e 64 20 74 68 65 20 6e 75 6d  size and the num
13ff0 62 65 72 20 6f 66 20 72 65 73 65 72 76 65 64 20  ber of reserved 
14000 62 79 74 65 73 20 70 65 72 20 70 61 67 65 2e 0a  bytes per page..
14010 2a 2a 20 4f 72 2c 20 69 66 20 74 68 65 20 70 61  ** Or, if the pa
14020 67 65 20 73 69 7a 65 20 68 61 73 20 61 6c 72 65  ge size has alre
14030 61 64 79 20 62 65 65 6e 20 66 69 78 65 64 2c 20  ady been fixed, 
14040 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45  return SQLITE_RE
14050 41 44 4f 4e 4c 59 20 0a 2a 2a 20 77 69 74 68 6f  ADONLY .** witho
14060 75 74 20 63 68 61 6e 67 69 6e 67 20 61 6e 79 74  ut changing anyt
14070 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  hing..**.** The 
14080 70 61 67 65 20 73 69 7a 65 20 6d 75 73 74 20 62  page size must b
14090 65 20 61 20 70 6f 77 65 72 20 6f 66 20 32 20 62  e a power of 2 b
140a0 65 74 77 65 65 6e 20 35 31 32 20 61 6e 64 20 36  etween 512 and 6
140b0 35 35 33 36 2e 20 20 49 66 20 74 68 65 20 70 61  5536.  If the pa
140c0 67 65 0a 2a 2a 20 73 69 7a 65 20 73 75 70 70 6c  ge.** size suppl
140d0 69 65 64 20 64 6f 65 73 20 6e 6f 74 20 6d 65 65  ied does not mee
140e0 74 20 74 68 69 73 20 63 6f 6e 73 74 72 61 69 6e  t this constrain
140f0 74 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20  t then the page 
14100 73 69 7a 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 63  size is not.** c
14110 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 50 61  hanged..**.** Pa
14120 67 65 20 73 69 7a 65 73 20 61 72 65 20 63 6f 6e  ge sizes are con
14130 73 74 72 61 69 6e 65 64 20 74 6f 20 62 65 20 61  strained to be a
14140 20 70 6f 77 65 72 20 6f 66 20 74 77 6f 20 73 6f   power of two so
14150 20 74 68 61 74 20 74 68 65 20 72 65 67 69 6f 6e   that the region
14160 0a 2a 2a 20 6f 66 20 74 68 65 20 64 61 74 61 62  .** of the datab
14170 61 73 65 20 66 69 6c 65 20 75 73 65 64 20 66 6f  ase file used fo
14180 72 20 6c 6f 63 6b 69 6e 67 20 28 62 65 67 69 6e  r locking (begin
14190 6e 69 6e 67 20 61 74 20 50 45 4e 44 49 4e 47 5f  ning at PENDING_
141a0 42 59 54 45 2c 0a 2a 2a 20 74 68 65 20 66 69 72  BYTE,.** the fir
141b0 73 74 20 62 79 74 65 20 70 61 73 74 20 74 68 65  st byte past the
141c0 20 31 47 42 20 62 6f 75 6e 64 61 72 79 2c 20 30   1GB boundary, 0
141d0 78 34 30 30 30 30 30 30 30 29 20 6e 65 65 64 73  x40000000) needs
141e0 20 74 6f 20 6f 63 63 75 72 0a 2a 2a 20 61 74 20   to occur.** at 
141f0 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
14200 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49   a page..**.** I
14210 66 20 70 61 72 61 6d 65 74 65 72 20 6e 52 65 73  f parameter nRes
14220 65 72 76 65 20 69 73 20 6c 65 73 73 20 74 68 61  erve is less tha
14230 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65  n zero, then the
14240 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 65 72   number of reser
14250 76 65 64 0a 2a 2a 20 62 79 74 65 73 20 70 65 72  ved.** bytes per
14260 20 70 61 67 65 20 69 73 20 6c 65 66 74 20 75 6e   page is left un
14270 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  changed..**.** I
14280 66 20 74 68 65 20 69 46 69 78 21 3d 30 20 74 68  f the iFix!=0 th
14290 65 6e 20 74 68 65 20 42 54 53 5f 50 41 47 45 53  en the BTS_PAGES
142a0 49 5a 45 5f 46 49 58 45 44 20 66 6c 61 67 20 69  IZE_FIXED flag i
142b0 73 20 73 65 74 20 73 6f 20 74 68 61 74 20 74 68  s set so that th
142c0 65 20 70 61 67 65 20 73 69 7a 65 0a 2a 2a 20 61  e page size.** a
142d0 6e 64 20 61 75 74 6f 76 61 63 75 75 6d 20 6d 6f  nd autovacuum mo
142e0 64 65 20 63 61 6e 20 6e 6f 20 6c 6f 6e 67 65 72  de can no longer
142f0 20 62 65 20 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a   be changed..*/.
14300 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
14310 53 65 74 50 61 67 65 53 69 7a 65 28 42 74 72 65  SetPageSize(Btre
14320 65 20 2a 70 2c 20 69 6e 74 20 70 61 67 65 53 69  e *p, int pageSi
14330 7a 65 2c 20 69 6e 74 20 6e 52 65 73 65 72 76 65  ze, int nReserve
14340 2c 20 69 6e 74 20 69 46 69 78 29 7b 0a 20 20 69  , int iFix){.  i
14350 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
14360 4b 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  K;.  BtShared *p
14370 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61  Bt = p->pBt;.  a
14380 73 73 65 72 74 28 20 6e 52 65 73 65 72 76 65 3e  ssert( nReserve>
14390 3d 2d 31 20 26 26 20 6e 52 65 73 65 72 76 65 3c  =-1 && nReserve<
143a0 3d 32 35 35 20 29 3b 0a 20 20 73 71 6c 69 74 65  =255 );.  sqlite
143b0 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
143c0 20 20 69 66 28 20 70 42 74 2d 3e 62 74 73 46 6c    if( pBt->btsFl
143d0 61 67 73 20 26 20 42 54 53 5f 50 41 47 45 53 49  ags & BTS_PAGESI
143e0 5a 45 5f 46 49 58 45 44 20 29 7b 0a 20 20 20 20  ZE_FIXED ){.    
143f0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
14400 65 28 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  e(p);.    return
14410 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
14420 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 52 65 73  ;.  }.  if( nRes
14430 65 72 76 65 3c 30 20 29 7b 0a 20 20 20 20 6e 52  erve<0 ){.    nR
14440 65 73 65 72 76 65 20 3d 20 70 42 74 2d 3e 70 61  eserve = pBt->pa
14450 67 65 53 69 7a 65 20 2d 20 70 42 74 2d 3e 75 73  geSize - pBt->us
14460 61 62 6c 65 53 69 7a 65 3b 0a 20 20 7d 0a 20 20  ableSize;.  }.  
14470 61 73 73 65 72 74 28 20 6e 52 65 73 65 72 76 65  assert( nReserve
14480 3e 3d 30 20 26 26 20 6e 52 65 73 65 72 76 65 3c  >=0 && nReserve<
14490 3d 32 35 35 20 29 3b 0a 20 20 69 66 28 20 70 61  =255 );.  if( pa
144a0 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70  geSize>=512 && p
144b0 61 67 65 53 69 7a 65 3c 3d 53 51 4c 49 54 45 5f  ageSize<=SQLITE_
144c0 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 26 26  MAX_PAGE_SIZE &&
144d0 0a 20 20 20 20 20 20 20 20 28 28 70 61 67 65 53  .        ((pageS
144e0 69 7a 65 2d 31 29 26 70 61 67 65 53 69 7a 65 29  ize-1)&pageSize)
144f0 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ==0 ){.    asser
14500 74 28 20 28 70 61 67 65 53 69 7a 65 20 26 20 37  t( (pageSize & 7
14510 29 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  )==0 );.    asse
14520 72 74 28 20 21 70 42 74 2d 3e 70 50 61 67 65 31  rt( !pBt->pPage1
14530 20 26 26 20 21 70 42 74 2d 3e 70 43 75 72 73 6f   && !pBt->pCurso
14540 72 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70 61  r );.    pBt->pa
14550 67 65 53 69 7a 65 20 3d 20 28 75 33 32 29 70 61  geSize = (u32)pa
14560 67 65 53 69 7a 65 3b 0a 20 20 20 20 66 72 65 65  geSize;.    free
14570 54 65 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a  TempSpace(pBt);.
14580 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74    }.  rc = sqlit
14590 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73 69  e3PagerSetPagesi
145a0 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  ze(pBt->pPager, 
145b0 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2c 20  &pBt->pageSize, 
145c0 6e 52 65 73 65 72 76 65 29 3b 0a 20 20 70 42 74  nReserve);.  pBt
145d0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70  ->usableSize = p
145e0 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 28  Bt->pageSize - (
145f0 75 31 36 29 6e 52 65 73 65 72 76 65 3b 0a 20 20  u16)nReserve;.  
14600 69 66 28 20 69 46 69 78 20 29 20 70 42 74 2d 3e  if( iFix ) pBt->
14610 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f  btsFlags |= BTS_
14620 50 41 47 45 53 49 5a 45 5f 46 49 58 45 44 3b 0a  PAGESIZE_FIXED;.
14630 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
14640 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
14650 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
14660 74 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74  turn the current
14670 6c 79 20 64 65 66 69 6e 65 64 20 70 61 67 65 20  ly defined page 
14680 73 69 7a 65 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  size.*/.int sqli
14690 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65 53  te3BtreeGetPageS
146a0 69 7a 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  ize(Btree *p){. 
146b0 20 72 65 74 75 72 6e 20 70 2d 3e 70 42 74 2d 3e   return p->pBt->
146c0 70 61 67 65 53 69 7a 65 3b 0a 7d 0a 0a 23 69 66  pageSize;.}..#if
146d0 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
146e0 48 41 53 5f 43 4f 44 45 43 29 20 7c 7c 20 64 65  HAS_CODEC) || de
146f0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42  fined(SQLITE_DEB
14700 55 47 29 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  UG)./*.** This f
14710 75 6e 63 74 69 6f 6e 20 69 73 20 73 69 6d 69 6c  unction is simil
14720 61 72 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72  ar to sqlite3Btr
14730 65 65 47 65 74 52 65 73 65 72 76 65 28 29 2c 20  eeGetReserve(), 
14740 65 78 63 65 70 74 20 74 68 61 74 20 69 74 0a 2a  except that it.*
14750 2a 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 63 61  * may only be ca
14760 6c 6c 65 64 20 69 66 20 69 74 20 69 73 20 67 75  lled if it is gu
14770 61 72 61 6e 74 65 65 64 20 74 68 61 74 20 74 68  aranteed that th
14780 65 20 62 2d 74 72 65 65 20 6d 75 74 65 78 20 69  e b-tree mutex i
14790 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20 68 65 6c  s already.** hel
147a0 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73  d..**.** This is
147b0 20 75 73 65 66 75 6c 20 69 6e 20 6f 6e 65 20 73   useful in one s
147c0 70 65 63 69 61 6c 20 63 61 73 65 20 69 6e 20 74  pecial case in t
147d0 68 65 20 62 61 63 6b 75 70 20 41 50 49 20 63 6f  he backup API co
147e0 64 65 20 77 68 65 72 65 20 69 74 20 69 73 0a 2a  de where it is.*
147f0 2a 20 6b 6e 6f 77 6e 20 74 68 61 74 20 74 68 65  * known that the
14800 20 73 68 61 72 65 64 20 62 2d 74 72 65 65 20 6d   shared b-tree m
14810 75 74 65 78 20 69 73 20 68 65 6c 64 2c 20 62 75  utex is held, bu
14820 74 20 74 68 65 20 6d 75 74 65 78 20 6f 6e 20 74  t the mutex on t
14830 68 65 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  he .** database 
14840 68 61 6e 64 6c 65 20 74 68 61 74 20 6f 77 6e 73  handle that owns
14850 20 2a 70 20 69 73 20 6e 6f 74 2e 20 49 6e 20 74   *p is not. In t
14860 68 69 73 20 63 61 73 65 20 69 66 20 73 71 6c 69  his case if sqli
14870 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 29 0a  te3BtreeEnter().
14880 2a 2a 20 77 65 72 65 20 74 6f 20 62 65 20 63 61  ** were to be ca
14890 6c 6c 65 64 2c 20 69 74 20 6d 69 67 68 74 20 63  lled, it might c
148a0 6f 6c 6c 69 64 65 20 77 69 74 68 20 73 6f 6d 65  ollide with some
148b0 20 6f 74 68 65 72 20 6f 70 65 72 61 74 69 6f 6e   other operation
148c0 20 6f 6e 20 74 68 65 0a 2a 2a 20 64 61 74 61 62   on the.** datab
148d0 61 73 65 20 68 61 6e 64 6c 65 20 74 68 61 74 20  ase handle that 
148e0 6f 77 6e 73 20 2a 70 2c 20 63 61 75 73 69 6e 67  owns *p, causing
148f0 20 75 6e 64 65 66 69 6e 65 64 20 62 65 68 61 76   undefined behav
14900 69 6f 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ior..*/.int sqli
14910 74 65 33 42 74 72 65 65 47 65 74 52 65 73 65 72  te3BtreeGetReser
14920 76 65 4e 6f 4d 75 74 65 78 28 42 74 72 65 65 20  veNoMutex(Btree 
14930 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73  *p){.  assert( s
14940 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
14950 64 28 70 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  d(p->pBt->mutex)
14960 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e   );.  return p->
14970 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20  pBt->pageSize - 
14980 70 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  p->pBt->usableSi
14990 7a 65 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ze;.}.#endif /* 
149a0 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43  SQLITE_HAS_CODEC
149b0 20 7c 7c 20 53 51 4c 49 54 45 5f 44 45 42 55 47   || SQLITE_DEBUG
149c0 20 2a 2f 0a 0a 23 69 66 20 21 64 65 66 69 6e 65   */..#if !define
149d0 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41  d(SQLITE_OMIT_PA
149e0 47 45 52 5f 50 52 41 47 4d 41 53 29 20 7c 7c 20  GER_PRAGMAS) || 
149f0 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
14a00 4f 4d 49 54 5f 56 41 43 55 55 4d 29 0a 2f 2a 0a  OMIT_VACUUM)./*.
14a10 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
14a20 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66  mber of bytes of
14a30 20 73 70 61 63 65 20 61 74 20 74 68 65 20 65 6e   space at the en
14a40 64 20 6f 66 20 65 76 65 72 79 20 70 61 67 65 20  d of every page 
14a50 74 68 61 74 0a 2a 2a 20 61 72 65 20 69 6e 74 65  that.** are inte
14a60 6e 74 75 61 6c 6c 79 20 6c 65 66 74 20 75 6e 75  ntually left unu
14a70 73 65 64 2e 20 20 54 68 69 73 20 69 73 20 74 68  sed.  This is th
14a80 65 20 22 72 65 73 65 72 76 65 64 22 20 73 70 61  e "reserved" spa
14a90 63 65 20 74 68 61 74 20 69 73 0a 2a 2a 20 73 6f  ce that is.** so
14aa0 6d 65 74 69 6d 65 73 20 75 73 65 64 20 62 79 20  metimes used by 
14ab0 65 78 74 65 6e 73 69 6f 6e 73 2e 0a 2a 2f 0a 69  extensions..*/.i
14ac0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 47  nt sqlite3BtreeG
14ad0 65 74 52 65 73 65 72 76 65 28 42 74 72 65 65 20  etReserve(Btree 
14ae0 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20  *p){.  int n;.  
14af0 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
14b00 72 28 70 29 3b 0a 20 20 6e 20 3d 20 70 2d 3e 70  r(p);.  n = p->p
14b10 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70  Bt->pageSize - p
14b20 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
14b30 65 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  e;.  sqlite3Btre
14b40 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
14b50 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn n;.}../*.** 
14b60 53 65 74 20 74 68 65 20 6d 61 78 69 6d 75 6d 20  Set the maximum 
14b70 70 61 67 65 20 63 6f 75 6e 74 20 66 6f 72 20 61  page count for a
14b80 20 64 61 74 61 62 61 73 65 20 69 66 20 6d 78 50   database if mxP
14b90 61 67 65 20 69 73 20 70 6f 73 69 74 69 76 65 2e  age is positive.
14ba0 0a 2a 2a 20 4e 6f 20 63 68 61 6e 67 65 73 20 61  .** No changes a
14bb0 72 65 20 6d 61 64 65 20 69 66 20 6d 78 50 61 67  re made if mxPag
14bc0 65 20 69 73 20 30 20 6f 72 20 6e 65 67 61 74 69  e is 0 or negati
14bd0 76 65 2e 0a 2a 2a 20 52 65 67 61 72 64 6c 65 73  ve..** Regardles
14be0 73 20 6f 66 20 74 68 65 20 76 61 6c 75 65 20 6f  s of the value o
14bf0 66 20 6d 78 50 61 67 65 2c 20 72 65 74 75 72 6e  f mxPage, return
14c00 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 70 61 67   the maximum pag
14c10 65 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e 74 20  e count..*/.int 
14c20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 61 78 50  sqlite3BtreeMaxP
14c30 61 67 65 43 6f 75 6e 74 28 42 74 72 65 65 20 2a  ageCount(Btree *
14c40 70 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a  p, int mxPage){.
14c50 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74    int n;.  sqlit
14c60 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
14c70 0a 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 50 61  .  n = sqlite3Pa
14c80 67 65 72 4d 61 78 50 61 67 65 43 6f 75 6e 74 28  gerMaxPageCount(
14c90 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  p->pBt->pPager, 
14ca0 6d 78 50 61 67 65 29 3b 0a 20 20 73 71 6c 69 74  mxPage);.  sqlit
14cb0 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
14cc0 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a  .  return n;.}..
14cd0 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 42 54  /*.** Set the BT
14ce0 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 20  S_SECURE_DELETE 
14cf0 66 6c 61 67 20 69 66 20 6e 65 77 46 6c 61 67 20  flag if newFlag 
14d00 69 73 20 30 20 6f 72 20 31 2e 20 20 49 66 20 6e  is 0 or 1.  If n
14d10 65 77 46 6c 61 67 20 69 73 20 2d 31 2c 0a 2a 2a  ewFlag is -1,.**
14d20 20 74 68 65 6e 20 6d 61 6b 65 20 6e 6f 20 63 68   then make no ch
14d30 61 6e 67 65 73 2e 20 20 41 6c 77 61 79 73 20 72  anges.  Always r
14d40 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20  eturn the value 
14d50 6f 66 20 74 68 65 20 42 54 53 5f 53 45 43 55 52  of the BTS_SECUR
14d60 45 5f 44 45 4c 45 54 45 0a 2a 2a 20 73 65 74 74  E_DELETE.** sett
14d70 69 6e 67 20 61 66 74 65 72 20 74 68 65 20 63 68  ing after the ch
14d80 61 6e 67 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ange..*/.int sql
14d90 69 74 65 33 42 74 72 65 65 53 65 63 75 72 65 44  ite3BtreeSecureD
14da0 65 6c 65 74 65 28 42 74 72 65 65 20 2a 70 2c 20  elete(Btree *p, 
14db0 69 6e 74 20 6e 65 77 46 6c 61 67 29 7b 0a 20 20  int newFlag){.  
14dc0 69 6e 74 20 62 3b 0a 20 20 69 66 28 20 70 3d 3d  int b;.  if( p==
14dd0 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
14de0 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
14df0 72 28 70 29 3b 0a 20 20 69 66 28 20 6e 65 77 46  r(p);.  if( newF
14e00 6c 61 67 3e 3d 30 20 29 7b 0a 20 20 20 20 70 2d  lag>=0 ){.    p-
14e10 3e 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26  >pBt->btsFlags &
14e20 3d 20 7e 42 54 53 5f 53 45 43 55 52 45 5f 44 45  = ~BTS_SECURE_DE
14e30 4c 45 54 45 3b 0a 20 20 20 20 69 66 28 20 6e 65  LETE;.    if( ne
14e40 77 46 6c 61 67 20 29 20 70 2d 3e 70 42 74 2d 3e  wFlag ) p->pBt->
14e50 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f  btsFlags |= BTS_
14e60 53 45 43 55 52 45 5f 44 45 4c 45 54 45 3b 0a 20  SECURE_DELETE;. 
14e70 20 7d 20 0a 20 20 62 20 3d 20 28 70 2d 3e 70 42   } .  b = (p->pB
14e80 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54  t->btsFlags & BT
14e90 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 29  S_SECURE_DELETE)
14ea0 21 3d 30 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  !=0;.  sqlite3Bt
14eb0 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
14ec0 65 74 75 72 6e 20 62 3b 0a 7d 0a 23 65 6e 64 69  eturn b;.}.#endi
14ed0 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51  f /* !defined(SQ
14ee0 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f  LITE_OMIT_PAGER_
14ef0 50 52 41 47 4d 41 53 29 20 7c 7c 20 21 64 65 66  PRAGMAS) || !def
14f00 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
14f10 5f 56 41 43 55 55 4d 29 20 2a 2f 0a 0a 2f 2a 0a  _VACUUM) */../*.
14f20 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 27 61  ** Change the 'a
14f30 75 74 6f 2d 76 61 63 75 75 6d 27 20 70 72 6f 70  uto-vacuum' prop
14f40 65 72 74 79 20 6f 66 20 74 68 65 20 64 61 74 61  erty of the data
14f50 62 61 73 65 2e 20 49 66 20 74 68 65 20 27 61 75  base. If the 'au
14f60 74 6f 56 61 63 75 75 6d 27 0a 2a 2a 20 70 61 72  toVacuum'.** par
14f70 61 6d 65 74 65 72 20 69 73 20 6e 6f 6e 2d 7a 65  ameter is non-ze
14f80 72 6f 2c 20 74 68 65 6e 20 61 75 74 6f 2d 76 61  ro, then auto-va
14f90 63 75 75 6d 20 6d 6f 64 65 20 69 73 20 65 6e 61  cuum mode is ena
14fa0 62 6c 65 64 2e 20 49 66 20 7a 65 72 6f 2c 20 69  bled. If zero, i
14fb0 74 0a 2a 2a 20 69 73 20 64 69 73 61 62 6c 65 64  t.** is disabled
14fc0 2e 20 54 68 65 20 64 65 66 61 75 6c 74 20 76 61  . The default va
14fd0 6c 75 65 20 66 6f 72 20 74 68 65 20 61 75 74 6f  lue for the auto
14fe0 2d 76 61 63 75 75 6d 20 70 72 6f 70 65 72 74 79  -vacuum property
14ff0 20 69 73 20 0a 2a 2a 20 64 65 74 65 72 6d 69 6e   is .** determin
15000 65 64 20 62 79 20 74 68 65 20 53 51 4c 49 54 45  ed by the SQLITE
15010 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43  _DEFAULT_AUTOVAC
15020 55 55 4d 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 69 6e  UUM macro..*/.in
15030 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65  t sqlite3BtreeSe
15040 74 41 75 74 6f 56 61 63 75 75 6d 28 42 74 72 65  tAutoVacuum(Btre
15050 65 20 2a 70 2c 20 69 6e 74 20 61 75 74 6f 56 61  e *p, int autoVa
15060 63 75 75 6d 29 7b 0a 23 69 66 64 65 66 20 53 51  cuum){.#ifdef SQ
15070 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
15080 43 55 55 4d 0a 20 20 72 65 74 75 72 6e 20 53 51  CUUM.  return SQ
15090 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 23  LITE_READONLY;.#
150a0 65 6c 73 65 0a 20 20 42 74 53 68 61 72 65 64 20  else.  BtShared 
150b0 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
150c0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
150d0 5f 4f 4b 3b 0a 20 20 75 38 20 61 76 20 3d 20 28  _OK;.  u8 av = (
150e0 75 38 29 61 75 74 6f 56 61 63 75 75 6d 3b 0a 0a  u8)autoVacuum;..
150f0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
15100 74 65 72 28 70 29 3b 0a 20 20 69 66 28 20 28 70  ter(p);.  if( (p
15110 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42  Bt->btsFlags & B
15120 54 53 5f 50 41 47 45 53 49 5a 45 5f 46 49 58 45  TS_PAGESIZE_FIXE
15130 44 29 21 3d 30 20 26 26 20 28 61 76 20 3f 31 3a  D)!=0 && (av ?1:
15140 30 29 21 3d 70 42 74 2d 3e 61 75 74 6f 56 61 63  0)!=pBt->autoVac
15150 75 75 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  uum ){.    rc = 
15160 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b  SQLITE_READONLY;
15170 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 42  .  }else{.    pB
15180 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20  t->autoVacuum = 
15190 61 76 20 3f 31 3a 30 3b 0a 20 20 20 20 70 42 74  av ?1:0;.    pBt
151a0 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 61  ->incrVacuum = a
151b0 76 3d 3d 32 20 3f 31 3a 30 3b 0a 20 20 7d 0a 20  v==2 ?1:0;.  }. 
151c0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
151d0 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
151e0 72 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a  rc;.#endif.}../*
151f0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 76  .** Return the v
15200 61 6c 75 65 20 6f 66 20 74 68 65 20 27 61 75 74  alue of the 'aut
15210 6f 2d 76 61 63 75 75 6d 27 20 70 72 6f 70 65 72  o-vacuum' proper
15220 74 79 2e 20 49 66 20 61 75 74 6f 2d 76 61 63 75  ty. If auto-vacu
15230 75 6d 20 69 73 20 0a 2a 2a 20 65 6e 61 62 6c 65  um is .** enable
15240 64 20 31 20 69 73 20 72 65 74 75 72 6e 65 64 2e  d 1 is returned.
15250 20 4f 74 68 65 72 77 69 73 65 20 30 2e 0a 2a 2f   Otherwise 0..*/
15260 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
15270 65 47 65 74 41 75 74 6f 56 61 63 75 75 6d 28 42  eGetAutoVacuum(B
15280 74 72 65 65 20 2a 70 29 7b 0a 23 69 66 64 65 66  tree *p){.#ifdef
15290 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
152a0 4f 56 41 43 55 55 4d 0a 20 20 72 65 74 75 72 6e  OVACUUM.  return
152b0 20 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55   BTREE_AUTOVACUU
152c0 4d 5f 4e 4f 4e 45 3b 0a 23 65 6c 73 65 0a 20 20  M_NONE;.#else.  
152d0 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65  int rc;.  sqlite
152e0 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
152f0 20 20 72 63 20 3d 20 28 0a 20 20 20 20 28 21 70    rc = (.    (!p
15300 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ->pBt->autoVacuu
15310 6d 29 3f 42 54 52 45 45 5f 41 55 54 4f 56 41 43  m)?BTREE_AUTOVAC
15320 55 55 4d 5f 4e 4f 4e 45 3a 0a 20 20 20 20 28 21  UUM_NONE:.    (!
15330 70 2d 3e 70 42 74 2d 3e 69 6e 63 72 56 61 63 75  p->pBt->incrVacu
15340 75 6d 29 3f 42 54 52 45 45 5f 41 55 54 4f 56 41  um)?BTREE_AUTOVA
15350 43 55 55 4d 5f 46 55 4c 4c 3a 0a 20 20 20 20 42  CUUM_FULL:.    B
15360 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f  TREE_AUTOVACUUM_
15370 49 4e 43 52 0a 20 20 29 3b 0a 20 20 73 71 6c 69  INCR.  );.  sqli
15380 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
15390 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 23  ;.  return rc;.#
153a0 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  endif.}.../*.** 
153b0 47 65 74 20 61 20 72 65 66 65 72 65 6e 63 65 20  Get a reference 
153c0 74 6f 20 70 50 61 67 65 31 20 6f 66 20 74 68 65  to pPage1 of the
153d0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
153e0 20 54 68 69 73 20 77 69 6c 6c 0a 2a 2a 20 61 6c   This will.** al
153f0 73 6f 20 61 63 71 75 69 72 65 20 61 20 72 65 61  so acquire a rea
15400 64 6c 6f 63 6b 20 6f 6e 20 74 68 61 74 20 66 69  dlock on that fi
15410 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45  le..**.** SQLITE
15420 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20  _OK is returned 
15430 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 49 66 20  on success.  If 
15440 74 68 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 20  the file is not 
15450 61 0a 2a 2a 20 77 65 6c 6c 2d 66 6f 72 6d 65 64  a.** well-formed
15460 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
15470 74 68 65 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  then SQLITE_CORR
15480 55 50 54 20 69 73 20 72 65 74 75 72 6e 65 64 2e  UPT is returned.
15490 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20  .** SQLITE_BUSY 
154a0 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 74  is returned if t
154b0 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 6c  he database is l
154c0 6f 63 6b 65 64 2e 20 20 53 51 4c 49 54 45 5f 4e  ocked.  SQLITE_N
154d0 4f 4d 45 4d 0a 2a 2a 20 69 73 20 72 65 74 75 72  OMEM.** is retur
154e0 6e 65 64 20 69 66 20 77 65 20 72 75 6e 20 6f 75  ned if we run ou
154f0 74 20 6f 66 20 6d 65 6d 6f 72 79 2e 20 0a 2a 2f  t of memory. .*/
15500 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 6f 63 6b  .static int lock
15510 42 74 72 65 65 28 42 74 53 68 61 72 65 64 20 2a  Btree(BtShared *
15520 70 42 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  pBt){.  int rc; 
15530 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15540 52 65 73 75 6c 74 20 63 6f 64 65 20 66 72 6f 6d  Result code from
15550 20 73 75 62 66 75 6e 63 74 69 6f 6e 73 20 2a 2f   subfunctions */
15560 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
15570 65 31 3b 20 20 20 20 20 2f 2a 20 50 61 67 65 20  e1;     /* Page 
15580 31 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  1 of the databas
15590 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  e file */.  int 
155a0 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20  nPage;          
155b0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
155c0 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61 62  ges in the datab
155d0 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61  ase */.  int nPa
155e0 67 65 46 69 6c 65 20 3d 20 30 3b 20 20 20 2f 2a  geFile = 0;   /*
155f0 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
15600 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
15610 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e   file */.  int n
15620 50 61 67 65 48 65 61 64 65 72 3b 20 20 20 20 20  PageHeader;     
15630 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
15640 65 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  es in the databa
15650 73 65 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20  se according to 
15660 68 64 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  hdr */..  assert
15670 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
15680 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
15690 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42   );.  assert( pB
156a0 74 2d 3e 70 50 61 67 65 31 3d 3d 30 20 29 3b 0a  t->pPage1==0 );.
156b0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
156c0 67 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 70 42  gerSharedLock(pB
156d0 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 69 66  t->pPager);.  if
156e0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
156f0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 72  ) return rc;.  r
15700 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65  c = btreeGetPage
15710 28 70 42 74 2c 20 31 2c 20 26 70 50 61 67 65 31  (pBt, 1, &pPage1
15720 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  , 0);.  if( rc!=
15730 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
15740 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 44 6f 20  rn rc;..  /* Do 
15750 73 6f 6d 65 20 63 68 65 63 6b 69 6e 67 20 74 6f  some checking to
15760 20 68 65 6c 70 20 69 6e 73 75 72 65 20 74 68 65   help insure the
15770 20 66 69 6c 65 20 77 65 20 6f 70 65 6e 65 64 20   file we opened 
15780 72 65 61 6c 6c 79 20 69 73 0a 20 20 2a 2a 20 61  really is.  ** a
15790 20 76 61 6c 69 64 20 64 61 74 61 62 61 73 65 20   valid database 
157a0 66 69 6c 65 2e 20 0a 20 20 2a 2f 0a 20 20 6e 50  file. .  */.  nP
157b0 61 67 65 20 3d 20 6e 50 61 67 65 48 65 61 64 65  age = nPageHeade
157c0 72 20 3d 20 67 65 74 34 62 79 74 65 28 32 38 2b  r = get4byte(28+
157d0 28 75 38 2a 29 70 50 61 67 65 31 2d 3e 61 44 61  (u8*)pPage1->aDa
157e0 74 61 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61  ta);.  sqlite3Pa
157f0 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74  gerPagecount(pBt
15800 2d 3e 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65  ->pPager, &nPage
15810 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 6e 50 61  File);.  if( nPa
15820 67 65 3d 3d 30 20 7c 7c 20 6d 65 6d 63 6d 70 28  ge==0 || memcmp(
15830 32 34 2b 28 75 38 2a 29 70 50 61 67 65 31 2d 3e  24+(u8*)pPage1->
15840 61 44 61 74 61 2c 20 39 32 2b 28 75 38 2a 29 70  aData, 92+(u8*)p
15850 50 61 67 65 31 2d 3e 61 44 61 74 61 2c 34 29 21  Page1->aData,4)!
15860 3d 30 20 29 7b 0a 20 20 20 20 6e 50 61 67 65 20  =0 ){.    nPage 
15870 3d 20 6e 50 61 67 65 46 69 6c 65 3b 0a 20 20 7d  = nPageFile;.  }
15880 0a 20 20 69 66 28 20 6e 50 61 67 65 3e 30 20 29  .  if( nPage>0 )
15890 7b 0a 20 20 20 20 75 33 32 20 70 61 67 65 53 69  {.    u32 pageSi
158a0 7a 65 3b 0a 20 20 20 20 75 33 32 20 75 73 61 62  ze;.    u32 usab
158b0 6c 65 53 69 7a 65 3b 0a 20 20 20 20 75 38 20 2a  leSize;.    u8 *
158c0 70 61 67 65 31 20 3d 20 70 50 61 67 65 31 2d 3e  page1 = pPage1->
158d0 61 44 61 74 61 3b 0a 20 20 20 20 72 63 20 3d 20  aData;.    rc = 
158e0 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42 3b 0a 20  SQLITE_NOTADB;. 
158f0 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
15900 46 3a 20 52 2d 34 33 37 33 37 2d 33 39 39 39 39  F: R-43737-39999
15910 20 45 76 65 72 79 20 76 61 6c 69 64 20 53 51 4c   Every valid SQL
15920 69 74 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  ite database fil
15930 65 20 62 65 67 69 6e 73 0a 20 20 20 20 2a 2a 20  e begins.    ** 
15940 77 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69  with the followi
15950 6e 67 20 31 36 20 62 79 74 65 73 20 28 69 6e 20  ng 16 bytes (in 
15960 68 65 78 29 3a 20 35 33 20 35 31 20 34 63 20 36  hex): 53 51 4c 6
15970 39 20 37 34 20 36 35 20 32 30 20 36 36 20 36 66  9 74 65 20 66 6f
15980 20 37 32 20 36 64 0a 20 20 20 20 2a 2a 20 36 31   72 6d.    ** 61
15990 20 37 34 20 32 30 20 33 33 20 30 30 2e 20 2a 2f   74 20 33 00. */
159a0 0a 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28  .    if( memcmp(
159b0 70 61 67 65 31 2c 20 7a 4d 61 67 69 63 48 65 61  page1, zMagicHea
159c0 64 65 72 2c 20 31 36 29 21 3d 30 20 29 7b 0a 20  der, 16)!=0 ){. 
159d0 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f       goto page1_
159e0 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20  init_failed;.   
159f0 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54   }..#ifdef SQLIT
15a00 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 20 20 69  E_OMIT_WAL.    i
15a10 66 28 20 70 61 67 65 31 5b 31 38 5d 3e 31 20 29  f( page1[18]>1 )
15a20 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 62 74 73  {.      pBt->bts
15a30 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 52 45 41  Flags |= BTS_REA
15a40 44 5f 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20 20  D_ONLY;.    }.  
15a50 20 20 69 66 28 20 70 61 67 65 31 5b 31 39 5d 3e    if( page1[19]>
15a60 31 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  1 ){.      goto 
15a70 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65  page1_init_faile
15a80 64 3b 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20  d;.    }.#else. 
15a90 20 20 20 69 66 28 20 70 61 67 65 31 5b 31 38 5d     if( page1[18]
15aa0 3e 32 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d  >2 ){.      pBt-
15ab0 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53  >btsFlags |= BTS
15ac0 5f 52 45 41 44 5f 4f 4e 4c 59 3b 0a 20 20 20 20  _READ_ONLY;.    
15ad0 7d 0a 20 20 20 20 69 66 28 20 70 61 67 65 31 5b  }.    if( page1[
15ae0 31 39 5d 3e 32 20 29 7b 0a 20 20 20 20 20 20 67  19]>2 ){.      g
15af0 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66  oto page1_init_f
15b00 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a 20 20  ailed;.    }..  
15b10 20 20 2f 2a 20 49 66 20 74 68 65 20 77 72 69 74    /* If the writ
15b20 65 20 76 65 72 73 69 6f 6e 20 69 73 20 73 65 74  e version is set
15b30 20 74 6f 20 32 2c 20 74 68 69 73 20 64 61 74 61   to 2, this data
15b40 62 61 73 65 20 73 68 6f 75 6c 64 20 62 65 20 61  base should be a
15b50 63 63 65 73 73 65 64 0a 20 20 20 20 2a 2a 20 69  ccessed.    ** i
15b60 6e 20 57 41 4c 20 6d 6f 64 65 2e 20 49 66 20 74  n WAL mode. If t
15b70 68 65 20 6c 6f 67 20 69 73 20 6e 6f 74 20 61 6c  he log is not al
15b80 72 65 61 64 79 20 6f 70 65 6e 2c 20 6f 70 65 6e  ready open, open
15b90 20 69 74 20 6e 6f 77 2e 20 54 68 65 6e 20 0a 20   it now. Then . 
15ba0 20 20 20 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c     ** return SQL
15bb0 49 54 45 5f 4f 4b 20 61 6e 64 20 72 65 74 75 72  ITE_OK and retur
15bc0 6e 20 77 69 74 68 6f 75 74 20 70 6f 70 75 6c 61  n without popula
15bd0 74 69 6e 67 20 42 74 53 68 61 72 65 64 2e 70 50  ting BtShared.pP
15be0 61 67 65 31 2e 0a 20 20 20 20 2a 2a 20 54 68 65  age1..    ** The
15bf0 20 63 61 6c 6c 65 72 20 64 65 74 65 63 74 73 20   caller detects 
15c00 74 68 69 73 20 61 6e 64 20 63 61 6c 6c 73 20 74  this and calls t
15c10 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 67 61  his function aga
15c20 69 6e 2e 20 54 68 69 73 20 69 73 0a 20 20 20 20  in. This is.    
15c30 2a 2a 20 72 65 71 75 69 72 65 64 20 61 73 20 74  ** required as t
15c40 68 65 20 76 65 72 73 69 6f 6e 20 6f 66 20 70 61  he version of pa
15c50 67 65 20 31 20 63 75 72 72 65 6e 74 6c 79 20 69  ge 1 currently i
15c60 6e 20 74 68 65 20 70 61 67 65 31 20 62 75 66 66  n the page1 buff
15c70 65 72 0a 20 20 20 20 2a 2a 20 6d 61 79 20 6e 6f  er.    ** may no
15c80 74 20 62 65 20 74 68 65 20 6c 61 74 65 73 74 20  t be the latest 
15c90 76 65 72 73 69 6f 6e 20 2d 20 74 68 65 72 65 20  version - there 
15ca0 6d 61 79 20 62 65 20 61 20 6e 65 77 65 72 20 6f  may be a newer o
15cb0 6e 65 20 69 6e 20 74 68 65 20 6c 6f 67 0a 20 20  ne in the log.  
15cc0 20 20 2a 2a 20 66 69 6c 65 2e 0a 20 20 20 20 2a    ** file..    *
15cd0 2f 0a 20 20 20 20 69 66 28 20 70 61 67 65 31 5b  /.    if( page1[
15ce0 31 39 5d 3d 3d 32 20 26 26 20 28 70 42 74 2d 3e  19]==2 && (pBt->
15cf0 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 4e  btsFlags & BTS_N
15d00 4f 5f 57 41 4c 29 3d 3d 30 20 29 7b 0a 20 20 20  O_WAL)==0 ){.   
15d10 20 20 20 69 6e 74 20 69 73 4f 70 65 6e 20 3d 20     int isOpen = 
15d20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  0;.      rc = sq
15d30 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 57 61  lite3PagerOpenWa
15d40 6c 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26  l(pBt->pPager, &
15d50 69 73 4f 70 65 6e 29 3b 0a 20 20 20 20 20 20 69  isOpen);.      i
15d60 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
15d70 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   ){.        goto
15d80 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c   page1_init_fail
15d90 65 64 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  ed;.      }else 
15da0 69 66 28 20 69 73 4f 70 65 6e 3d 3d 30 20 29 7b  if( isOpen==0 ){
15db0 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65  .        release
15dc0 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a 20 20  Page(pPage1);.  
15dd0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
15de0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a  ITE_OK;.      }.
15df0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
15e00 45 5f 4e 4f 54 41 44 42 3b 0a 20 20 20 20 7d 0a  E_NOTADB;.    }.
15e10 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 45  #endif..    /* E
15e20 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 35  VIDENCE-OF: R-15
15e30 34 36 35 2d 32 30 38 31 33 20 54 68 65 20 6d 61  465-20813 The ma
15e40 78 69 6d 75 6d 20 61 6e 64 20 6d 69 6e 69 6d 75  ximum and minimu
15e50 6d 20 65 6d 62 65 64 64 65 64 20 70 61 79 6c 6f  m embedded paylo
15e60 61 64 0a 20 20 20 20 2a 2a 20 66 72 61 63 74 69  ad.    ** fracti
15e70 6f 6e 73 20 61 6e 64 20 74 68 65 20 6c 65 61 66  ons and the leaf
15e80 20 70 61 79 6c 6f 61 64 20 66 72 61 63 74 69 6f   payload fractio
15e90 6e 20 76 61 6c 75 65 73 20 6d 75 73 74 20 62 65  n values must be
15ea0 20 36 34 2c 20 33 32 2c 20 61 6e 64 20 33 32 2e   64, 32, and 32.
15eb0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
15ec0 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 65 73 69  he original desi
15ed0 67 6e 20 61 6c 6c 6f 77 65 64 20 74 68 65 73 65  gn allowed these
15ee0 20 61 6d 6f 75 6e 74 73 20 74 6f 20 76 61 72 79   amounts to vary
15ef0 2c 20 62 75 74 20 61 73 20 6f 66 0a 20 20 20 20  , but as of.    
15f00 2a 2a 20 76 65 72 73 69 6f 6e 20 33 2e 36 2e 30  ** version 3.6.0
15f10 2c 20 77 65 20 72 65 71 75 69 72 65 20 74 68 65  , we require the
15f20 6d 20 74 6f 20 62 65 20 66 69 78 65 64 2e 0a 20  m to be fixed.. 
15f30 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6d 65     */.    if( me
15f40 6d 63 6d 70 28 26 70 61 67 65 31 5b 32 31 5d 2c  mcmp(&page1[21],
15f50 20 22 5c 31 30 30 5c 30 34 30 5c 30 34 30 22 2c   "\100\040\040",
15f60 33 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 67  3)!=0 ){.      g
15f70 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66  oto page1_init_f
15f80 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20  ailed;.    }.   
15f90 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
15fa0 20 52 2d 35 31 38 37 33 2d 33 39 36 31 38 20 54   R-51873-39618 T
15fb0 68 65 20 70 61 67 65 20 73 69 7a 65 20 66 6f 72  he page size for
15fc0 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65   a database file
15fd0 20 69 73 0a 20 20 20 20 2a 2a 20 64 65 74 65 72   is.    ** deter
15fe0 6d 69 6e 65 64 20 62 79 20 74 68 65 20 32 2d 62  mined by the 2-b
15ff0 79 74 65 20 69 6e 74 65 67 65 72 20 6c 6f 63 61  yte integer loca
16000 74 65 64 20 61 74 20 61 6e 20 6f 66 66 73 65 74  ted at an offset
16010 20 6f 66 20 31 36 20 62 79 74 65 73 20 66 72 6f   of 16 bytes fro
16020 6d 0a 20 20 20 20 2a 2a 20 74 68 65 20 62 65 67  m.    ** the beg
16030 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 64 61  inning of the da
16040 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a  tabase file. */.
16050 20 20 20 20 70 61 67 65 53 69 7a 65 20 3d 20 28      pageSize = (
16060 70 61 67 65 31 5b 31 36 5d 3c 3c 38 29 20 7c 20  page1[16]<<8) | 
16070 28 70 61 67 65 31 5b 31 37 5d 3c 3c 31 36 29 3b  (page1[17]<<16);
16080 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45  .    /* EVIDENCE
16090 2d 4f 46 3a 20 52 2d 32 35 30 30 38 2d 32 31 36  -OF: R-25008-216
160a0 38 38 20 54 68 65 20 73 69 7a 65 20 6f 66 20 61  88 The size of a
160b0 20 70 61 67 65 20 69 73 20 61 20 70 6f 77 65 72   page is a power
160c0 20 6f 66 20 74 77 6f 0a 20 20 20 20 2a 2a 20 62   of two.    ** b
160d0 65 74 77 65 65 6e 20 35 31 32 20 61 6e 64 20 36  etween 512 and 6
160e0 35 35 33 36 20 69 6e 63 6c 75 73 69 76 65 2e 20  5536 inclusive. 
160f0 2a 2f 0a 20 20 20 20 69 66 28 20 28 28 70 61 67  */.    if( ((pag
16100 65 53 69 7a 65 2d 31 29 26 70 61 67 65 53 69 7a  eSize-1)&pageSiz
16110 65 29 21 3d 30 0a 20 20 20 20 20 7c 7c 20 70 61  e)!=0.     || pa
16120 67 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41  geSize>SQLITE_MA
16130 58 5f 50 41 47 45 5f 53 49 5a 45 20 0a 20 20 20  X_PAGE_SIZE .   
16140 20 20 7c 7c 20 70 61 67 65 53 69 7a 65 3c 3d 32    || pageSize<=2
16150 35 36 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  56 .    ){.     
16160 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74   goto page1_init
16170 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20  _failed;.    }. 
16180 20 20 20 61 73 73 65 72 74 28 20 28 70 61 67 65     assert( (page
16190 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 0a  Size & 7)==0 );.
161a0 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
161b0 4f 46 3a 20 52 2d 35 39 33 31 30 2d 35 31 32 30  OF: R-59310-5120
161c0 35 20 54 68 65 20 22 72 65 73 65 72 76 65 64 20  5 The "reserved 
161d0 73 70 61 63 65 22 20 73 69 7a 65 20 69 6e 20 74  space" size in t
161e0 68 65 20 31 2d 62 79 74 65 0a 20 20 20 20 2a 2a  he 1-byte.    **
161f0 20 69 6e 74 65 67 65 72 20 61 74 20 6f 66 66 73   integer at offs
16200 65 74 20 32 30 20 69 73 20 74 68 65 20 6e 75 6d  et 20 is the num
16210 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20  ber of bytes of 
16220 73 70 61 63 65 20 61 74 20 74 68 65 20 65 6e 64  space at the end
16230 20 6f 66 0a 20 20 20 20 2a 2a 20 65 61 63 68 20   of.    ** each 
16240 70 61 67 65 20 74 6f 20 72 65 73 65 72 76 65 20  page to reserve 
16250 66 6f 72 20 65 78 74 65 6e 73 69 6f 6e 73 2e 20  for extensions. 
16260 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45  .    **.    ** E
16270 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 37  VIDENCE-OF: R-37
16280 34 39 37 2d 34 32 34 31 32 20 54 68 65 20 73 69  497-42412 The si
16290 7a 65 20 6f 66 20 74 68 65 20 72 65 73 65 72 76  ze of the reserv
162a0 65 64 20 72 65 67 69 6f 6e 20 69 73 0a 20 20 20  ed region is.   
162b0 20 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 62   ** determined b
162c0 79 20 74 68 65 20 6f 6e 65 2d 62 79 74 65 20 75  y the one-byte u
162d0 6e 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20  nsigned integer 
162e0 66 6f 75 6e 64 20 61 74 20 61 6e 20 6f 66 66 73  found at an offs
162f0 65 74 20 6f 66 20 32 30 0a 20 20 20 20 2a 2a 20  et of 20.    ** 
16300 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  into the databas
16310 65 20 66 69 6c 65 20 68 65 61 64 65 72 2e 20 2a  e file header. *
16320 2f 0a 20 20 20 20 75 73 61 62 6c 65 53 69 7a 65  /.    usableSize
16330 20 3d 20 70 61 67 65 53 69 7a 65 20 2d 20 70 61   = pageSize - pa
16340 67 65 31 5b 32 30 5d 3b 0a 20 20 20 20 69 66 28  ge1[20];.    if(
16350 20 28 75 33 32 29 70 61 67 65 53 69 7a 65 21 3d   (u32)pageSize!=
16360 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b  pBt->pageSize ){
16370 0a 20 20 20 20 20 20 2f 2a 20 41 66 74 65 72 20  .      /* After 
16380 72 65 61 64 69 6e 67 20 74 68 65 20 66 69 72 73  reading the firs
16390 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61  t page of the da
163a0 74 61 62 61 73 65 20 61 73 73 75 6d 69 6e 67 20  tabase assuming 
163b0 61 20 70 61 67 65 20 73 69 7a 65 0a 20 20 20 20  a page size.    
163c0 20 20 2a 2a 20 6f 66 20 42 74 53 68 61 72 65 64    ** of BtShared
163d0 2e 70 61 67 65 53 69 7a 65 2c 20 77 65 20 68 61  .pageSize, we ha
163e0 76 65 20 64 69 73 63 6f 76 65 72 65 64 20 74 68  ve discovered th
163f0 61 74 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65  at the page-size
16400 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 61 63 74   is.      ** act
16410 75 61 6c 6c 79 20 70 61 67 65 53 69 7a 65 2e 20  ually pageSize. 
16420 55 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62  Unlock the datab
16430 61 73 65 2c 20 6c 65 61 76 65 20 70 42 74 2d 3e  ase, leave pBt->
16440 70 50 61 67 65 31 20 61 74 0a 20 20 20 20 20 20  pPage1 at.      
16450 2a 2a 20 7a 65 72 6f 20 61 6e 64 20 72 65 74 75  ** zero and retu
16460 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 54 68  rn SQLITE_OK. Th
16470 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 63 61  e caller will ca
16480 6c 6c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ll this function
16490 0a 20 20 20 20 20 20 2a 2a 20 61 67 61 69 6e 20  .      ** again 
164a0 77 69 74 68 20 74 68 65 20 63 6f 72 72 65 63 74  with the correct
164b0 20 70 61 67 65 2d 73 69 7a 65 2e 0a 20 20 20 20   page-size..    
164c0 20 20 2a 2f 0a 20 20 20 20 20 20 72 65 6c 65 61    */.      relea
164d0 73 65 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a  sePage(pPage1);.
164e0 20 20 20 20 20 20 70 42 74 2d 3e 75 73 61 62 6c        pBt->usabl
164f0 65 53 69 7a 65 20 3d 20 75 73 61 62 6c 65 53 69  eSize = usableSi
16500 7a 65 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70  ze;.      pBt->p
16510 61 67 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69  ageSize = pageSi
16520 7a 65 3b 0a 20 20 20 20 20 20 66 72 65 65 54 65  ze;.      freeTe
16530 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20  mpSpace(pBt);.  
16540 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
16550 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65  PagerSetPagesize
16560 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70  (pBt->pPager, &p
16570 42 74 2d 3e 70 61 67 65 53 69 7a 65 2c 0a 20 20  Bt->pageSize,.  
16580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
165a0 20 70 61 67 65 53 69 7a 65 2d 75 73 61 62 6c 65   pageSize-usable
165b0 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 72 65 74  Size);.      ret
165c0 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
165d0 20 20 69 66 28 20 28 70 42 74 2d 3e 64 62 2d 3e    if( (pBt->db->
165e0 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 52  flags & SQLITE_R
165f0 65 63 6f 76 65 72 79 4d 6f 64 65 29 3d 3d 30 20  ecoveryMode)==0 
16600 26 26 20 6e 50 61 67 65 3e 6e 50 61 67 65 46 69  && nPage>nPageFi
16610 6c 65 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  le ){.      rc =
16620 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
16630 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f  BKPT;.      goto
16640 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c   page1_init_fail
16650 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a  ed;.    }.    /*
16660 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
16670 32 38 33 31 32 2d 36 34 37 30 34 20 48 6f 77 65  28312-64704 Howe
16680 76 65 72 2c 20 74 68 65 20 75 73 61 62 6c 65 20  ver, the usable 
16690 73 69 7a 65 20 69 73 20 6e 6f 74 20 61 6c 6c 6f  size is not allo
166a0 77 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 62 65  wed to.    ** be
166b0 20 6c 65 73 73 20 74 68 61 6e 20 34 38 30 2e 20   less than 480. 
166c0 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
166d0 69 66 20 74 68 65 20 70 61 67 65 20 73 69 7a 65  if the page size
166e0 20 69 73 20 35 31 32 2c 20 74 68 65 6e 20 74 68   is 512, then th
166f0 65 0a 20 20 20 20 2a 2a 20 72 65 73 65 72 76 65  e.    ** reserve
16700 64 20 73 70 61 63 65 20 73 69 7a 65 20 63 61 6e  d space size can
16710 6e 6f 74 20 65 78 63 65 65 64 20 33 32 2e 20 2a  not exceed 32. *
16720 2f 0a 20 20 20 20 69 66 28 20 75 73 61 62 6c 65  /.    if( usable
16730 53 69 7a 65 3c 34 38 30 20 29 7b 0a 20 20 20 20  Size<480 ){.    
16740 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69    goto page1_ini
16750 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a  t_failed;.    }.
16760 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a      pBt->pageSiz
16770 65 20 3d 20 70 61 67 65 53 69 7a 65 3b 0a 20 20  e = pageSize;.  
16780 20 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a    pBt->usableSiz
16790 65 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a  e = usableSize;.
167a0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
167b0 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
167c0 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75     pBt->autoVacu
167d0 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28 26  um = (get4byte(&
167e0 70 61 67 65 31 5b 33 36 20 2b 20 34 2a 34 5d 29  page1[36 + 4*4])
167f0 3f 31 3a 30 29 3b 0a 20 20 20 20 70 42 74 2d 3e  ?1:0);.    pBt->
16800 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 28 67 65  incrVacuum = (ge
16810 74 34 62 79 74 65 28 26 70 61 67 65 31 5b 33 36  t4byte(&page1[36
16820 20 2b 20 37 2a 34 5d 29 3f 31 3a 30 29 3b 0a 23   + 7*4])?1:0);.#
16830 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20  endif.  }..  /* 
16840 6d 61 78 4c 6f 63 61 6c 20 69 73 20 74 68 65 20  maxLocal is the 
16850 6d 61 78 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f  maximum amount o
16860 66 20 70 61 79 6c 6f 61 64 20 74 6f 20 73 74 6f  f payload to sto
16870 72 65 20 6c 6f 63 61 6c 6c 79 20 66 6f 72 0a 20  re locally for. 
16880 20 2a 2a 20 61 20 63 65 6c 6c 2e 20 20 4d 61 6b   ** a cell.  Mak
16890 65 20 73 75 72 65 20 69 74 20 69 73 20 73 6d 61  e sure it is sma
168a0 6c 6c 20 65 6e 6f 75 67 68 20 73 6f 20 74 68 61  ll enough so tha
168b0 74 20 61 74 20 6c 65 61 73 74 20 6d 69 6e 46 61  t at least minFa
168c0 6e 6f 75 74 0a 20 20 2a 2a 20 63 65 6c 6c 73 20  nout.  ** cells 
168d0 63 61 6e 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20  can will fit on 
168e0 6f 6e 65 20 70 61 67 65 2e 20 20 57 65 20 61 73  one page.  We as
168f0 73 75 6d 65 20 61 20 31 30 2d 62 79 74 65 20 70  sume a 10-byte p
16900 61 67 65 20 68 65 61 64 65 72 2e 0a 20 20 2a 2a  age header..  **
16910 20 42 65 73 69 64 65 73 20 74 68 65 20 70 61 79   Besides the pay
16920 6c 6f 61 64 2c 20 74 68 65 20 63 65 6c 6c 20 6d  load, the cell m
16930 75 73 74 20 73 74 6f 72 65 3a 0a 20 20 2a 2a 20  ust store:.  ** 
16940 20 20 20 20 32 2d 62 79 74 65 20 70 6f 69 6e 74      2-byte point
16950 65 72 20 74 6f 20 74 68 65 20 63 65 6c 6c 0a 20  er to the cell. 
16960 20 2a 2a 20 20 20 20 20 34 2d 62 79 74 65 20 63   **     4-byte c
16970 68 69 6c 64 20 70 6f 69 6e 74 65 72 0a 20 20 2a  hild pointer.  *
16980 2a 20 20 20 20 20 39 2d 62 79 74 65 20 6e 4b 65  *     9-byte nKe
16990 79 20 76 61 6c 75 65 0a 20 20 2a 2a 20 20 20 20  y value.  **    
169a0 20 34 2d 62 79 74 65 20 6e 44 61 74 61 20 76 61   4-byte nData va
169b0 6c 75 65 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62  lue.  **     4-b
169c0 79 74 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  yte overflow pag
169d0 65 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 53  e pointer.  ** S
169e0 6f 20 61 20 63 65 6c 6c 20 63 6f 6e 73 69 73 74  o a cell consist
169f0 73 20 6f 66 20 61 20 32 2d 62 79 74 65 20 70 6f  s of a 2-byte po
16a00 69 6e 74 65 72 2c 20 61 20 68 65 61 64 65 72 20  inter, a header 
16a10 77 68 69 63 68 20 69 73 20 61 73 20 6d 75 63 68  which is as much
16a20 20 61 73 0a 20 20 2a 2a 20 31 37 20 62 79 74 65   as.  ** 17 byte
16a30 73 20 6c 6f 6e 67 2c 20 30 20 74 6f 20 4e 20 62  s long, 0 to N b
16a40 79 74 65 73 20 6f 66 20 70 61 79 6c 6f 61 64 2c  ytes of payload,
16a50 20 61 6e 64 20 61 6e 20 6f 70 74 69 6f 6e 61 6c   and an optional
16a60 20 34 20 62 79 74 65 20 6f 76 65 72 66 6c 6f 77   4 byte overflow
16a70 0a 20 20 2a 2a 20 70 61 67 65 20 70 6f 69 6e 74  .  ** page point
16a80 65 72 2e 0a 20 20 2a 2f 0a 20 20 70 42 74 2d 3e  er..  */.  pBt->
16a90 6d 61 78 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29  maxLocal = (u16)
16aa0 28 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ((pBt->usableSiz
16ab0 65 2d 31 32 29 2a 36 34 2f 32 35 35 20 2d 20 32  e-12)*64/255 - 2
16ac0 33 29 3b 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c 6f  3);.  pBt->minLo
16ad0 63 61 6c 20 3d 20 28 75 31 36 29 28 28 70 42 74  cal = (u16)((pBt
16ae0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29  ->usableSize-12)
16af0 2a 33 32 2f 32 35 35 20 2d 20 32 33 29 3b 0a 20  *32/255 - 23);. 
16b00 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66 20 3d 20   pBt->maxLeaf = 
16b10 28 75 31 36 29 28 70 42 74 2d 3e 75 73 61 62 6c  (u16)(pBt->usabl
16b20 65 53 69 7a 65 20 2d 20 33 35 29 3b 0a 20 20 70  eSize - 35);.  p
16b30 42 74 2d 3e 6d 69 6e 4c 65 61 66 20 3d 20 28 75  Bt->minLeaf = (u
16b40 31 36 29 28 28 70 42 74 2d 3e 75 73 61 62 6c 65  16)((pBt->usable
16b50 53 69 7a 65 2d 31 32 29 2a 33 32 2f 32 35 35 20  Size-12)*32/255 
16b60 2d 20 32 33 29 3b 0a 20 20 69 66 28 20 70 42 74  - 23);.  if( pBt
16b70 2d 3e 6d 61 78 4c 6f 63 61 6c 3e 31 32 37 20 29  ->maxLocal>127 )
16b80 7b 0a 20 20 20 20 70 42 74 2d 3e 6d 61 78 31 62  {.    pBt->max1b
16b90 79 74 65 50 61 79 6c 6f 61 64 20 3d 20 31 32 37  ytePayload = 127
16ba0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
16bb0 42 74 2d 3e 6d 61 78 31 62 79 74 65 50 61 79 6c  Bt->max1bytePayl
16bc0 6f 61 64 20 3d 20 28 75 38 29 70 42 74 2d 3e 6d  oad = (u8)pBt->m
16bd0 61 78 4c 6f 63 61 6c 3b 0a 20 20 7d 0a 20 20 61  axLocal;.  }.  a
16be0 73 73 65 72 74 28 20 70 42 74 2d 3e 6d 61 78 4c  ssert( pBt->maxL
16bf0 65 61 66 20 2b 20 32 33 20 3c 3d 20 4d 58 5f 43  eaf + 23 <= MX_C
16c00 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20 29 3b  ELL_SIZE(pBt) );
16c10 0a 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d  .  pBt->pPage1 =
16c20 20 70 50 61 67 65 31 3b 0a 20 20 70 42 74 2d 3e   pPage1;.  pBt->
16c30 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 3b 0a 20  nPage = nPage;. 
16c40 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
16c50 4b 3b 0a 0a 70 61 67 65 31 5f 69 6e 69 74 5f 66  K;..page1_init_f
16c60 61 69 6c 65 64 3a 0a 20 20 72 65 6c 65 61 73 65  ailed:.  release
16c70 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a 20 20  Page(pPage1);.  
16c80 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b  pBt->pPage1 = 0;
16c90 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
16ca0 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
16cb0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
16cc0 20 6e 75 6d 62 65 72 20 6f 66 20 63 75 72 73 6f   number of curso
16cd0 72 73 20 6f 70 65 6e 20 6f 6e 20 70 42 74 2e 20  rs open on pBt. 
16ce0 54 68 69 73 20 69 73 20 66 6f 72 20 75 73 65 0a  This is for use.
16cf0 2a 2a 20 69 6e 20 61 73 73 65 72 74 28 29 20 65  ** in assert() e
16d00 78 70 72 65 73 73 69 6f 6e 73 2c 20 73 6f 20 69  xpressions, so i
16d10 74 20 69 73 20 6f 6e 6c 79 20 63 6f 6d 70 69 6c  t is only compil
16d20 65 64 20 69 66 20 4e 44 45 42 55 47 20 69 73 20  ed if NDEBUG is 
16d30 6e 6f 74 0a 2a 2a 20 64 65 66 69 6e 65 64 2e 0a  not.** defined..
16d40 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 77 72 69 74 65  **.** Only write
16d50 20 63 75 72 73 6f 72 73 20 61 72 65 20 63 6f 75   cursors are cou
16d60 6e 74 65 64 20 69 66 20 77 72 4f 6e 6c 79 20 69  nted if wrOnly i
16d70 73 20 74 72 75 65 2e 20 20 49 66 20 77 72 4f 6e  s true.  If wrOn
16d80 6c 79 20 69 73 0a 2a 2a 20 66 61 6c 73 65 20 74  ly is.** false t
16d90 68 65 6e 20 61 6c 6c 20 63 75 72 73 6f 72 73 20  hen all cursors 
16da0 61 72 65 20 63 6f 75 6e 74 65 64 2e 0a 2a 2a 0a  are counted..**.
16db0 2a 2a 20 46 6f 72 20 74 68 65 20 70 75 72 70 6f  ** For the purpo
16dc0 73 65 73 20 6f 66 20 74 68 69 73 20 72 6f 75 74  ses of this rout
16dd0 69 6e 65 2c 20 61 20 63 75 72 73 6f 72 20 69 73  ine, a cursor is
16de0 20 61 6e 79 20 63 75 72 73 6f 72 20 74 68 61 74   any cursor that
16df0 0a 2a 2a 20 69 73 20 63 61 70 61 62 6c 65 20 6f  .** is capable o
16e00 66 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69  f reading or wri
16e10 74 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61  ting to the data
16e20 62 61 73 65 2e 20 20 43 75 72 73 6f 72 73 20 74  base.  Cursors t
16e30 68 61 74 0a 2a 2a 20 68 61 76 65 20 62 65 65 6e  hat.** have been
16e40 20 74 72 69 70 70 65 64 20 69 6e 74 6f 20 74 68   tripped into th
16e50 65 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 73  e CURSOR_FAULT s
16e60 74 61 74 65 20 61 72 65 20 6e 6f 74 20 63 6f 75  tate are not cou
16e70 6e 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  nted..*/.static 
16e80 69 6e 74 20 63 6f 75 6e 74 56 61 6c 69 64 43 75  int countValidCu
16e90 72 73 6f 72 73 28 42 74 53 68 61 72 65 64 20 2a  rsors(BtShared *
16ea0 70 42 74 2c 20 69 6e 74 20 77 72 4f 6e 6c 79 29  pBt, int wrOnly)
16eb0 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  {.  BtCursor *pC
16ec0 75 72 3b 0a 20 20 69 6e 74 20 72 20 3d 20 30 3b  ur;.  int r = 0;
16ed0 0a 20 20 66 6f 72 28 70 43 75 72 3d 70 42 74 2d  .  for(pCur=pBt-
16ee0 3e 70 43 75 72 73 6f 72 3b 20 70 43 75 72 3b 20  >pCursor; pCur; 
16ef0 70 43 75 72 3d 70 43 75 72 2d 3e 70 4e 65 78 74  pCur=pCur->pNext
16f00 29 7b 0a 20 20 20 20 69 66 28 20 28 77 72 4f 6e  ){.    if( (wrOn
16f10 6c 79 3d 3d 30 20 7c 7c 20 28 70 43 75 72 2d 3e  ly==0 || (pCur->
16f20 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f  curFlags & BTCF_
16f30 57 72 69 74 65 46 6c 61 67 29 21 3d 30 29 0a 20  WriteFlag)!=0). 
16f40 20 20 20 20 26 26 20 70 43 75 72 2d 3e 65 53 74      && pCur->eSt
16f50 61 74 65 21 3d 43 55 52 53 4f 52 5f 46 41 55 4c  ate!=CURSOR_FAUL
16f60 54 20 29 20 72 2b 2b 3b 20 0a 20 20 7d 0a 20 20  T ) r++; .  }.  
16f70 72 65 74 75 72 6e 20 72 3b 0a 7d 0a 23 65 6e 64  return r;.}.#end
16f80 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  if../*.** If the
16f90 72 65 20 61 72 65 20 6e 6f 20 6f 75 74 73 74 61  re are no outsta
16fa0 6e 64 69 6e 67 20 63 75 72 73 6f 72 73 20 61 6e  nding cursors an
16fb0 64 20 77 65 20 61 72 65 20 6e 6f 74 20 69 6e 20  d we are not in 
16fc0 74 68 65 20 6d 69 64 64 6c 65 0a 2a 2a 20 6f 66  the middle.** of
16fd0 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62   a transaction b
16fe0 75 74 20 74 68 65 72 65 20 69 73 20 61 20 72 65  ut there is a re
16ff0 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  ad lock on the d
17000 61 74 61 62 61 73 65 2c 20 74 68 65 6e 0a 2a 2a  atabase, then.**
17010 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 75 6e   this routine un
17020 72 65 66 73 20 74 68 65 20 66 69 72 73 74 20 70  refs the first p
17030 61 67 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  age of the datab
17040 61 73 65 20 66 69 6c 65 20 77 68 69 63 68 20 0a  ase file which .
17050 2a 2a 20 68 61 73 20 74 68 65 20 65 66 66 65 63  ** has the effec
17060 74 20 6f 66 20 72 65 6c 65 61 73 69 6e 67 20 74  t of releasing t
17070 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2a  he read lock..**
17080 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 69 73 20  .** If there is 
17090 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e  a transaction in
170a0 20 70 72 6f 67 72 65 73 73 2c 20 74 68 69 73 20   progress, this 
170b0 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
170c0 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  op..*/.static vo
170d0 69 64 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66  id unlockBtreeIf
170e0 55 6e 75 73 65 64 28 42 74 53 68 61 72 65 64 20  Unused(BtShared 
170f0 2a 70 42 74 29 7b 0a 20 20 61 73 73 65 72 74 28  *pBt){.  assert(
17100 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
17110 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
17120 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63 6f 75  );.  assert( cou
17130 6e 74 56 61 6c 69 64 43 75 72 73 6f 72 73 28 70  ntValidCursors(p
17140 42 74 2c 30 29 3d 3d 30 20 7c 7c 20 70 42 74 2d  Bt,0)==0 || pBt-
17150 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3e 54  >inTransaction>T
17160 52 41 4e 53 5f 4e 4f 4e 45 20 29 3b 0a 20 20 69  RANS_NONE );.  i
17170 66 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  f( pBt->inTransa
17180 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 4e 4f 4e  ction==TRANS_NON
17190 45 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65 31  E && pBt->pPage1
171a0 21 3d 30 20 29 7b 0a 20 20 20 20 4d 65 6d 50 61  !=0 ){.    MemPa
171b0 67 65 20 2a 70 50 61 67 65 31 20 3d 20 70 42 74  ge *pPage1 = pBt
171c0 2d 3e 70 50 61 67 65 31 3b 0a 20 20 20 20 61 73  ->pPage1;.    as
171d0 73 65 72 74 28 20 70 50 61 67 65 31 2d 3e 61 44  sert( pPage1->aD
171e0 61 74 61 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ata );.    asser
171f0 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 52  t( sqlite3PagerR
17200 65 66 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61  efcount(pBt->pPa
17210 67 65 72 29 3d 3d 31 20 29 3b 0a 20 20 20 20 70  ger)==1 );.    p
17220 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a  Bt->pPage1 = 0;.
17230 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
17240 70 50 61 67 65 31 29 3b 0a 20 20 7d 0a 7d 0a 0a  pPage1);.  }.}..
17250 2f 2a 0a 2a 2a 20 49 66 20 70 42 74 20 70 6f 69  /*.** If pBt poi
17260 6e 74 73 20 74 6f 20 61 6e 20 65 6d 70 74 79 20  nts to an empty 
17270 66 69 6c 65 20 74 68 65 6e 20 63 6f 6e 76 65 72  file then conver
17280 74 20 74 68 61 74 20 65 6d 70 74 79 20 66 69 6c  t that empty fil
17290 65 0a 2a 2a 20 69 6e 74 6f 20 61 20 6e 65 77 20  e.** into a new 
172a0 65 6d 70 74 79 20 64 61 74 61 62 61 73 65 20 62  empty database b
172b0 79 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74  y initializing t
172c0 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66  he first page of
172d0 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65  .** the database
172e0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
172f0 6e 65 77 44 61 74 61 62 61 73 65 28 42 74 53 68  newDatabase(BtSh
17300 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 4d 65  ared *pBt){.  Me
17310 6d 50 61 67 65 20 2a 70 50 31 3b 0a 20 20 75 6e  mPage *pP1;.  un
17320 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74  signed char *dat
17330 61 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  a;.  int rc;..  
17340 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
17350 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
17360 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20  mutex) );.  if( 
17370 70 42 74 2d 3e 6e 50 61 67 65 3e 30 20 29 7b 0a  pBt->nPage>0 ){.
17380 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
17390 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 50 31 20  E_OK;.  }.  pP1 
173a0 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20  = pBt->pPage1;. 
173b0 20 61 73 73 65 72 74 28 20 70 50 31 21 3d 30 20   assert( pP1!=0 
173c0 29 3b 0a 20 20 64 61 74 61 20 3d 20 70 50 31 2d  );.  data = pP1-
173d0 3e 61 44 61 74 61 3b 0a 20 20 72 63 20 3d 20 73  >aData;.  rc = s
173e0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
173f0 28 70 50 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a  (pP1->pDbPage);.
17400 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
17410 6e 20 72 63 3b 0a 20 20 6d 65 6d 63 70 79 28 64  n rc;.  memcpy(d
17420 61 74 61 2c 20 7a 4d 61 67 69 63 48 65 61 64 65  ata, zMagicHeade
17430 72 2c 20 73 69 7a 65 6f 66 28 7a 4d 61 67 69 63  r, sizeof(zMagic
17440 48 65 61 64 65 72 29 29 3b 0a 20 20 61 73 73 65  Header));.  asse
17450 72 74 28 20 73 69 7a 65 6f 66 28 7a 4d 61 67 69  rt( sizeof(zMagi
17460 63 48 65 61 64 65 72 29 3d 3d 31 36 20 29 3b 0a  cHeader)==16 );.
17470 20 20 64 61 74 61 5b 31 36 5d 20 3d 20 28 75 38    data[16] = (u8
17480 29 28 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  )((pBt->pageSize
17490 3e 3e 38 29 26 30 78 66 66 29 3b 0a 20 20 64 61  >>8)&0xff);.  da
174a0 74 61 5b 31 37 5d 20 3d 20 28 75 38 29 28 28 70  ta[17] = (u8)((p
174b0 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3e 31 36  Bt->pageSize>>16
174c0 29 26 30 78 66 66 29 3b 0a 20 20 64 61 74 61 5b  )&0xff);.  data[
174d0 31 38 5d 20 3d 20 31 3b 0a 20 20 64 61 74 61 5b  18] = 1;.  data[
174e0 31 39 5d 20 3d 20 31 3b 0a 20 20 61 73 73 65 72  19] = 1;.  asser
174f0 74 28 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  t( pBt->usableSi
17500 7a 65 3c 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a  ze<=pBt->pageSiz
17510 65 20 26 26 20 70 42 74 2d 3e 75 73 61 62 6c 65  e && pBt->usable
17520 53 69 7a 65 2b 32 35 35 3e 3d 70 42 74 2d 3e 70  Size+255>=pBt->p
17530 61 67 65 53 69 7a 65 29 3b 0a 20 20 64 61 74 61  ageSize);.  data
17540 5b 32 30 5d 20 3d 20 28 75 38 29 28 70 42 74 2d  [20] = (u8)(pBt-
17550 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 42 74 2d  >pageSize - pBt-
17560 3e 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20  >usableSize);.  
17570 64 61 74 61 5b 32 31 5d 20 3d 20 36 34 3b 0a 20  data[21] = 64;. 
17580 20 64 61 74 61 5b 32 32 5d 20 3d 20 33 32 3b 0a   data[22] = 32;.
17590 20 20 64 61 74 61 5b 32 33 5d 20 3d 20 33 32 3b    data[23] = 32;
175a0 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b  .  memset(&data[
175b0 32 34 5d 2c 20 30 2c 20 31 30 30 2d 32 34 29 3b  24], 0, 100-24);
175c0 0a 20 20 7a 65 72 6f 50 61 67 65 28 70 50 31 2c  .  zeroPage(pP1,
175d0 20 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f   PTF_INTKEY|PTF_
175e0 4c 45 41 46 7c 50 54 46 5f 4c 45 41 46 44 41 54  LEAF|PTF_LEAFDAT
175f0 41 20 29 3b 0a 20 20 70 42 74 2d 3e 62 74 73 46  A );.  pBt->btsF
17600 6c 61 67 73 20 7c 3d 20 42 54 53 5f 50 41 47 45  lags |= BTS_PAGE
17610 53 49 5a 45 5f 46 49 58 45 44 3b 0a 23 69 66 6e  SIZE_FIXED;.#ifn
17620 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
17630 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 61 73 73  AUTOVACUUM.  ass
17640 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56 61  ert( pBt->autoVa
17650 63 75 75 6d 3d 3d 31 20 7c 7c 20 70 42 74 2d 3e  cuum==1 || pBt->
17660 61 75 74 6f 56 61 63 75 75 6d 3d 3d 30 20 29 3b  autoVacuum==0 );
17670 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
17680 69 6e 63 72 56 61 63 75 75 6d 3d 3d 31 20 7c 7c  incrVacuum==1 ||
17690 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d   pBt->incrVacuum
176a0 3d 3d 30 20 29 3b 0a 20 20 70 75 74 34 62 79 74  ==0 );.  put4byt
176b0 65 28 26 64 61 74 61 5b 33 36 20 2b 20 34 2a 34  e(&data[36 + 4*4
176c0 5d 2c 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  ], pBt->autoVacu
176d0 75 6d 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28  um);.  put4byte(
176e0 26 64 61 74 61 5b 33 36 20 2b 20 37 2a 34 5d 2c  &data[36 + 7*4],
176f0 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d   pBt->incrVacuum
17700 29 3b 0a 23 65 6e 64 69 66 0a 20 20 70 42 74 2d  );.#endif.  pBt-
17710 3e 6e 50 61 67 65 20 3d 20 31 3b 0a 20 20 64 61  >nPage = 1;.  da
17720 74 61 5b 33 31 5d 20 3d 20 31 3b 0a 20 20 72 65  ta[31] = 1;.  re
17730 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
17740 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c  }../*.** Initial
17750 69 7a 65 20 74 68 65 20 66 69 72 73 74 20 70 61  ize the first pa
17760 67 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ge of the databa
17770 73 65 20 66 69 6c 65 20 28 63 72 65 61 74 69 6e  se file (creatin
17780 67 20 61 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  g a database.** 
17790 63 6f 6e 73 69 73 74 69 6e 67 20 6f 66 20 61 20  consisting of a 
177a0 73 69 6e 67 6c 65 20 70 61 67 65 20 61 6e 64 20  single page and 
177b0 6e 6f 20 73 63 68 65 6d 61 20 6f 62 6a 65 63 74  no schema object
177c0 73 29 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54  s). Return SQLIT
177d0 45 5f 4f 4b 0a 2a 2a 20 69 66 20 73 75 63 63 65  E_OK.** if succe
177e0 73 73 66 75 6c 2c 20 6f 72 20 61 6e 20 53 51 4c  ssful, or an SQL
177f0 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 6f  ite error code o
17800 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 69 6e 74  therwise..*/.int
17810 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 77   sqlite3BtreeNew
17820 44 62 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  Db(Btree *p){.  
17830 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65  int rc;.  sqlite
17840 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
17850 20 20 70 2d 3e 70 42 74 2d 3e 6e 50 61 67 65 20    p->pBt->nPage 
17860 3d 20 30 3b 0a 20 20 72 63 20 3d 20 6e 65 77 44  = 0;.  rc = newD
17870 61 74 61 62 61 73 65 28 70 2d 3e 70 42 74 29 3b  atabase(p->pBt);
17880 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
17890 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
178a0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  n rc;.}../*.** A
178b0 74 74 65 6d 70 74 20 74 6f 20 73 74 61 72 74 20  ttempt to start 
178c0 61 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69 6f  a new transactio
178d0 6e 2e 20 41 20 77 72 69 74 65 2d 74 72 61 6e 73  n. A write-trans
178e0 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 73 74 61  action.** is sta
178f0 72 74 65 64 20 69 66 20 74 68 65 20 73 65 63 6f  rted if the seco
17900 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e  nd argument is n
17910 6f 6e 7a 65 72 6f 2c 20 6f 74 68 65 72 77 69 73  onzero, otherwis
17920 65 20 61 20 72 65 61 64 2d 0a 2a 2a 20 74 72 61  e a read-.** tra
17930 6e 73 61 63 74 69 6f 6e 2e 20 20 49 66 20 74 68  nsaction.  If th
17940 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
17950 74 20 69 73 20 32 20 6f 72 20 6d 6f 72 65 20 61  t is 2 or more a
17960 6e 64 20 65 78 63 6c 75 73 69 76 65 0a 2a 2a 20  nd exclusive.** 
17970 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 73  transaction is s
17980 74 61 72 74 65 64 2c 20 6d 65 61 6e 69 6e 67 20  tarted, meaning 
17990 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 70 72  that no other pr
179a0 6f 63 65 73 73 20 69 73 20 61 6c 6c 6f 77 65 64  ocess is allowed
179b0 0a 2a 2a 20 74 6f 20 61 63 63 65 73 73 20 74 68  .** to access th
179c0 65 20 64 61 74 61 62 61 73 65 2e 20 20 41 20 70  e database.  A p
179d0 72 65 65 78 69 73 74 69 6e 67 20 74 72 61 6e 73  reexisting trans
179e0 61 63 74 69 6f 6e 20 6d 61 79 20 6e 6f 74 20 62  action may not b
179f0 65 0a 2a 2a 20 75 70 67 72 61 64 65 64 20 74 6f  e.** upgraded to
17a00 20 65 78 63 6c 75 73 69 76 65 20 62 79 20 63 61   exclusive by ca
17a10 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69  lling this routi
17a20 6e 65 20 61 20 73 65 63 6f 6e 64 20 74 69 6d 65  ne a second time
17a30 20 2d 20 74 68 65 0a 2a 2a 20 65 78 63 6c 75 73   - the.** exclus
17a40 69 76 69 74 79 20 66 6c 61 67 20 6f 6e 6c 79 20  ivity flag only 
17a50 77 6f 72 6b 73 20 66 6f 72 20 61 20 6e 65 77 20  works for a new 
17a60 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a  transaction..**.
17a70 2a 2a 20 41 20 77 72 69 74 65 2d 74 72 61 6e 73  ** A write-trans
17a80 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 73  action must be s
17a90 74 61 72 74 65 64 20 62 65 66 6f 72 65 20 61 74  tarted before at
17aa0 74 65 6d 70 74 69 6e 67 20 61 6e 79 20 0a 2a 2a  tempting any .**
17ab0 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20   changes to the 
17ac0 64 61 74 61 62 61 73 65 2e 20 20 4e 6f 6e 65 20  database.  None 
17ad0 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
17ae0 20 72 6f 75 74 69 6e 65 73 20 0a 2a 2a 20 77 69   routines .** wi
17af0 6c 6c 20 77 6f 72 6b 20 75 6e 6c 65 73 73 20 61  ll work unless a
17b00 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
17b10 73 74 61 72 74 65 64 20 66 69 72 73 74 3a 0a 2a  started first:.*
17b20 2a 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65  *.**      sqlite
17b30 33 42 74 72 65 65 43 72 65 61 74 65 54 61 62 6c  3BtreeCreateTabl
17b40 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69  e().**      sqli
17b50 74 65 33 42 74 72 65 65 43 72 65 61 74 65 49 6e  te3BtreeCreateIn
17b60 64 65 78 28 29 0a 2a 2a 20 20 20 20 20 20 73 71  dex().**      sq
17b70 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61 72 54  lite3BtreeClearT
17b80 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20 73  able().**      s
17b90 71 6c 69 74 65 33 42 74 72 65 65 44 72 6f 70 54  qlite3BtreeDropT
17ba0 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20 73  able().**      s
17bb0 71 6c 69 74 65 33 42 74 72 65 65 49 6e 73 65 72  qlite3BtreeInser
17bc0 74 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69  t().**      sqli
17bd0 74 65 33 42 74 72 65 65 44 65 6c 65 74 65 28 29  te3BtreeDelete()
17be0 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33  .**      sqlite3
17bf0 42 74 72 65 65 55 70 64 61 74 65 4d 65 74 61 28  BtreeUpdateMeta(
17c00 29 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 69 6e  ).**.** If an in
17c10 69 74 69 61 6c 20 61 74 74 65 6d 70 74 20 74 6f  itial attempt to
17c20 20 61 63 71 75 69 72 65 20 74 68 65 20 6c 6f 63   acquire the loc
17c30 6b 20 66 61 69 6c 73 20 62 65 63 61 75 73 65 20  k fails because 
17c40 6f 66 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74 69  of lock contenti
17c50 6f 6e 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64 61  on.** and the da
17c60 74 61 62 61 73 65 20 77 61 73 20 70 72 65 76 69  tabase was previ
17c70 6f 75 73 6c 79 20 75 6e 6c 6f 63 6b 65 64 2c 20  ously unlocked, 
17c80 74 68 65 6e 20 69 6e 76 6f 6b 65 20 74 68 65 20  then invoke the 
17c90 62 75 73 79 20 68 61 6e 64 6c 65 72 0a 2a 2a 20  busy handler.** 
17ca0 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e 65 2e  if there is one.
17cb0 20 20 42 75 74 20 69 66 20 74 68 65 72 65 20 77    But if there w
17cc0 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 61 20  as previously a 
17cd0 72 65 61 64 2d 6c 6f 63 6b 2c 20 64 6f 20 6e 6f  read-lock, do no
17ce0 74 0a 2a 2a 20 69 6e 76 6f 6b 65 20 74 68 65 20  t.** invoke the 
17cf0 62 75 73 79 20 68 61 6e 64 6c 65 72 20 2d 20 6a  busy handler - j
17d00 75 73 74 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ust return SQLIT
17d10 45 5f 42 55 53 59 2e 20 20 53 51 4c 49 54 45 5f  E_BUSY.  SQLITE_
17d20 42 55 53 59 20 69 73 20 0a 2a 2a 20 72 65 74 75  BUSY is .** retu
17d30 72 6e 65 64 20 77 68 65 6e 20 74 68 65 72 65 20  rned when there 
17d40 69 73 20 61 6c 72 65 61 64 79 20 61 20 72 65 61  is already a rea
17d50 64 2d 6c 6f 63 6b 20 69 6e 20 6f 72 64 65 72 20  d-lock in order 
17d60 74 6f 20 61 76 6f 69 64 20 61 20 64 65 61 64 6c  to avoid a deadl
17d70 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 75 70 70 6f  ock..**.** Suppo
17d80 73 65 20 74 68 65 72 65 20 61 72 65 20 74 77 6f  se there are two
17d90 20 70 72 6f 63 65 73 73 65 73 20 41 20 61 6e 64   processes A and
17da0 20 42 2e 20 20 41 20 68 61 73 20 61 20 72 65 61   B.  A has a rea
17db0 64 20 6c 6f 63 6b 20 61 6e 64 20 42 20 68 61 73  d lock and B has
17dc0 0a 2a 2a 20 61 20 72 65 73 65 72 76 65 64 20 6c  .** a reserved l
17dd0 6f 63 6b 2e 20 20 42 20 74 72 69 65 73 20 74 6f  ock.  B tries to
17de0 20 70 72 6f 6d 6f 74 65 20 74 6f 20 65 78 63 6c   promote to excl
17df0 75 73 69 76 65 20 62 75 74 20 69 73 20 62 6c 6f  usive but is blo
17e00 63 6b 65 64 20 62 65 63 61 75 73 65 0a 2a 2a 20  cked because.** 
17e10 6f 66 20 41 27 73 20 72 65 61 64 20 6c 6f 63 6b  of A's read lock
17e20 2e 20 20 41 20 74 72 69 65 73 20 74 6f 20 70 72  .  A tries to pr
17e30 6f 6d 6f 74 65 20 74 6f 20 72 65 73 65 72 76 65  omote to reserve
17e40 64 20 62 75 74 20 69 73 20 62 6c 6f 63 6b 65 64  d but is blocked
17e50 20 62 79 20 42 2e 0a 2a 2a 20 4f 6e 65 20 6f 72   by B..** One or
17e60 20 74 68 65 20 6f 74 68 65 72 20 6f 66 20 74 68   the other of th
17e70 65 20 74 77 6f 20 70 72 6f 63 65 73 73 65 73 20  e two processes 
17e80 6d 75 73 74 20 67 69 76 65 20 77 61 79 20 6f 72  must give way or
17e90 20 74 68 65 72 65 20 63 61 6e 20 62 65 0a 2a 2a   there can be.**
17ea0 20 6e 6f 20 70 72 6f 67 72 65 73 73 2e 20 20 42   no progress.  B
17eb0 79 20 72 65 74 75 72 6e 69 6e 67 20 53 51 4c 49  y returning SQLI
17ec0 54 45 5f 42 55 53 59 20 61 6e 64 20 6e 6f 74 20  TE_BUSY and not 
17ed0 69 6e 76 6f 6b 69 6e 67 20 74 68 65 20 62 75 73  invoking the bus
17ee0 79 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a 20 77 68  y callback.** wh
17ef0 65 6e 20 41 20 61 6c 72 65 61 64 79 20 68 61 73  en A already has
17f00 20 61 20 72 65 61 64 20 6c 6f 63 6b 2c 20 77 65   a read lock, we
17f10 20 65 6e 63 6f 75 72 61 67 65 20 41 20 74 6f 20   encourage A to 
17f20 67 69 76 65 20 75 70 20 61 6e 64 20 6c 65 74 20  give up and let 
17f30 42 0a 2a 2a 20 70 72 6f 63 65 65 64 2e 0a 2a 2f  B.** proceed..*/
17f40 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
17f50 65 42 65 67 69 6e 54 72 61 6e 73 28 42 74 72 65  eBeginTrans(Btre
17f60 65 20 2a 70 2c 20 69 6e 74 20 77 72 66 6c 61 67  e *p, int wrflag
17f70 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 70 42  ){.  sqlite3 *pB
17f80 6c 6f 63 6b 20 3d 20 30 3b 0a 20 20 42 74 53 68  lock = 0;.  BtSh
17f90 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
17fa0 42 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  Bt;.  int rc = S
17fb0 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 73 71 6c  QLITE_OK;..  sql
17fc0 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
17fd0 29 3b 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72  );.  btreeIntegr
17fe0 69 74 79 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66  ity(p);..  /* If
17ff0 20 74 68 65 20 62 74 72 65 65 20 69 73 20 61 6c   the btree is al
18000 72 65 61 64 79 20 69 6e 20 61 20 77 72 69 74 65  ready in a write
18010 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 6f 72  -transaction, or
18020 20 69 74 0a 20 20 2a 2a 20 69 73 20 61 6c 72 65   it.  ** is alre
18030 61 64 79 20 69 6e 20 61 20 72 65 61 64 2d 74 72  ady in a read-tr
18040 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 61 20  ansaction and a 
18050 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e  read-transaction
18060 0a 20 20 2a 2a 20 69 73 20 72 65 71 75 65 73 74  .  ** is request
18070 65 64 2c 20 74 68 69 73 20 69 73 20 61 20 6e 6f  ed, this is a no
18080 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  -op..  */.  if( 
18090 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  p->inTrans==TRAN
180a0 53 5f 57 52 49 54 45 20 7c 7c 20 28 70 2d 3e 69  S_WRITE || (p->i
180b0 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 52 45  nTrans==TRANS_RE
180c0 41 44 20 26 26 20 21 77 72 66 6c 61 67 29 20 29  AD && !wrflag) )
180d0 7b 0a 20 20 20 20 67 6f 74 6f 20 74 72 61 6e 73  {.    goto trans
180e0 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 20 20 61 73  _begun;.  }.  as
180f0 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61  sert( pBt->inTra
18100 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f  nsaction==TRANS_
18110 57 52 49 54 45 20 7c 7c 20 49 66 4e 6f 74 4f 6d  WRITE || IfNotOm
18120 69 74 41 56 28 70 42 74 2d 3e 62 44 6f 54 72 75  itAV(pBt->bDoTru
18130 6e 63 61 74 65 29 3d 3d 30 20 29 3b 0a 0a 20 20  ncate)==0 );..  
18140 2f 2a 20 57 72 69 74 65 20 74 72 61 6e 73 61 63  /* Write transac
18150 74 69 6f 6e 73 20 61 72 65 20 6e 6f 74 20 70 6f  tions are not po
18160 73 73 69 62 6c 65 20 6f 6e 20 61 20 72 65 61 64  ssible on a read
18170 2d 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 20 2a  -only database *
18180 2f 0a 20 20 69 66 28 20 28 70 42 74 2d 3e 62 74  /.  if( (pBt->bt
18190 73 46 6c 61 67 73 20 26 20 42 54 53 5f 52 45 41  sFlags & BTS_REA
181a0 44 5f 4f 4e 4c 59 29 21 3d 30 20 26 26 20 77 72  D_ONLY)!=0 && wr
181b0 66 6c 61 67 20 29 7b 0a 20 20 20 20 72 63 20 3d  flag ){.    rc =
181c0 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
181d0 3b 0a 20 20 20 20 67 6f 74 6f 20 74 72 61 6e 73  ;.    goto trans
181e0 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 0a 23 69 66  _begun;.  }..#if
181f0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
18200 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20  _SHARED_CACHE.  
18210 2f 2a 20 49 66 20 61 6e 6f 74 68 65 72 20 64 61  /* If another da
18220 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 68 61  tabase handle ha
18230 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 65 64  s already opened
18240 20 61 20 77 72 69 74 65 20 74 72 61 6e 73 61 63   a write transac
18250 74 69 6f 6e 20 0a 20 20 2a 2a 20 6f 6e 20 74 68  tion .  ** on th
18260 69 73 20 73 68 61 72 65 64 2d 62 74 72 65 65 20  is shared-btree 
18270 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 61 20  structure and a 
18280 73 65 63 6f 6e 64 20 77 72 69 74 65 20 74 72 61  second write tra
18290 6e 73 61 63 74 69 6f 6e 20 69 73 0a 20 20 2a 2a  nsaction is.  **
182a0 20 72 65 71 75 65 73 74 65 64 2c 20 72 65 74 75   requested, retu
182b0 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44  rn SQLITE_LOCKED
182c0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 77 72  ..  */.  if( (wr
182d0 66 6c 61 67 20 26 26 20 70 42 74 2d 3e 69 6e 54  flag && pBt->inT
182e0 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e  ransaction==TRAN
182f0 53 5f 57 52 49 54 45 29 0a 20 20 20 7c 7c 20 28  S_WRITE).   || (
18300 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20  pBt->btsFlags & 
18310 42 54 53 5f 50 45 4e 44 49 4e 47 29 21 3d 30 0a  BTS_PENDING)!=0.
18320 20 20 29 7b 0a 20 20 20 20 70 42 6c 6f 63 6b 20    ){.    pBlock 
18330 3d 20 70 42 74 2d 3e 70 57 72 69 74 65 72 2d 3e  = pBt->pWriter->
18340 64 62 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  db;.  }else if( 
18350 77 72 66 6c 61 67 3e 31 20 29 7b 0a 20 20 20 20  wrflag>1 ){.    
18360 42 74 4c 6f 63 6b 20 2a 70 49 74 65 72 3b 0a 20  BtLock *pIter;. 
18370 20 20 20 66 6f 72 28 70 49 74 65 72 3d 70 42 74     for(pIter=pBt
18380 2d 3e 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20  ->pLock; pIter; 
18390 70 49 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65  pIter=pIter->pNe
183a0 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  xt){.      if( p
183b0 49 74 65 72 2d 3e 70 42 74 72 65 65 21 3d 70 20  Iter->pBtree!=p 
183c0 29 7b 0a 20 20 20 20 20 20 20 20 70 42 6c 6f 63  ){.        pBloc
183d0 6b 20 3d 20 70 49 74 65 72 2d 3e 70 42 74 72 65  k = pIter->pBtre
183e0 65 2d 3e 64 62 3b 0a 20 20 20 20 20 20 20 20 62  e->db;.        b
183f0 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
18400 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 42    }.  }.  if( pB
18410 6c 6f 63 6b 20 29 7b 0a 20 20 20 20 73 71 6c 69  lock ){.    sqli
18420 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f  te3ConnectionBlo
18430 63 6b 65 64 28 70 2d 3e 64 62 2c 20 70 42 6c 6f  cked(p->db, pBlo
18440 63 6b 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51  ck);.    rc = SQ
18450 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52  LITE_LOCKED_SHAR
18460 45 44 43 41 43 48 45 3b 0a 20 20 20 20 67 6f 74  EDCACHE;.    got
18470 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20  o trans_begun;. 
18480 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
18490 41 6e 79 20 72 65 61 64 2d 6f 6e 6c 79 20 6f 72  Any read-only or
184a0 20 72 65 61 64 2d 77 72 69 74 65 20 74 72 61 6e   read-write tran
184b0 73 61 63 74 69 6f 6e 20 69 6d 70 6c 69 65 73 20  saction implies 
184c0 61 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 0a  a read-lock on .
184d0 20 20 2a 2a 20 70 61 67 65 20 31 2e 20 53 6f 20    ** page 1. So 
184e0 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 73 68  if some other sh
184f0 61 72 65 64 2d 63 61 63 68 65 20 63 6c 69 65 6e  ared-cache clien
18500 74 20 61 6c 72 65 61 64 79 20 68 61 73 20 61 20  t already has a 
18510 77 72 69 74 65 2d 6c 6f 63 6b 20 0a 20 20 2a 2a  write-lock .  **
18520 20 6f 6e 20 70 61 67 65 20 31 2c 20 74 68 65 20   on page 1, the 
18530 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 61 6e 6e  transaction cann
18540 6f 74 20 62 65 20 6f 70 65 6e 65 64 2e 20 2a 2f  ot be opened. */
18550 0a 20 20 72 63 20 3d 20 71 75 65 72 79 53 68 61  .  rc = querySha
18560 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
18570 6b 28 70 2c 20 4d 41 53 54 45 52 5f 52 4f 4f 54  k(p, MASTER_ROOT
18580 2c 20 52 45 41 44 5f 4c 4f 43 4b 29 3b 0a 20 20  , READ_LOCK);.  
18590 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72  if( SQLITE_OK!=r
185a0 63 20 29 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62  c ) goto trans_b
185b0 65 67 75 6e 3b 0a 0a 20 20 70 42 74 2d 3e 62 74  egun;..  pBt->bt
185c0 73 46 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f 49  sFlags &= ~BTS_I
185d0 4e 49 54 49 41 4c 4c 59 5f 45 4d 50 54 59 3b 0a  NITIALLY_EMPTY;.
185e0 20 20 69 66 28 20 70 42 74 2d 3e 6e 50 61 67 65    if( pBt->nPage
185f0 3d 3d 30 20 29 20 70 42 74 2d 3e 62 74 73 46 6c  ==0 ) pBt->btsFl
18600 61 67 73 20 7c 3d 20 42 54 53 5f 49 4e 49 54 49  ags |= BTS_INITI
18610 41 4c 4c 59 5f 45 4d 50 54 59 3b 0a 20 20 64 6f  ALLY_EMPTY;.  do
18620 20 7b 0a 20 20 20 20 2f 2a 20 43 61 6c 6c 20 6c   {.    /* Call l
18630 6f 63 6b 42 74 72 65 65 28 29 20 75 6e 74 69 6c  ockBtree() until
18640 20 65 69 74 68 65 72 20 70 42 74 2d 3e 70 50 61   either pBt->pPa
18650 67 65 31 20 69 73 20 70 6f 70 75 6c 61 74 65 64  ge1 is populated
18660 20 6f 72 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b 42   or.    ** lockB
18670 74 72 65 65 28 29 20 72 65 74 75 72 6e 73 20 73  tree() returns s
18680 6f 6d 65 74 68 69 6e 67 20 6f 74 68 65 72 20 74  omething other t
18690 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 6c  han SQLITE_OK. l
186a0 6f 63 6b 42 74 72 65 65 28 29 0a 20 20 20 20 2a  ockBtree().    *
186b0 2a 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c  * may return SQL
186c0 49 54 45 5f 4f 4b 20 62 75 74 20 6c 65 61 76 65  ITE_OK but leave
186d0 20 70 42 74 2d 3e 70 50 61 67 65 31 20 73 65 74   pBt->pPage1 set
186e0 20 74 6f 20 30 20 69 66 20 61 66 74 65 72 0a 20   to 0 if after. 
186f0 20 20 20 2a 2a 20 72 65 61 64 69 6e 67 20 70 61     ** reading pa
18700 67 65 20 31 20 69 74 20 64 69 73 63 6f 76 65 72  ge 1 it discover
18710 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65 2d  s that the page-
18720 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
18730 62 61 73 65 20 0a 20 20 20 20 2a 2a 20 66 69 6c  base .    ** fil
18740 65 20 69 73 20 6e 6f 74 20 70 42 74 2d 3e 70 61  e is not pBt->pa
18750 67 65 53 69 7a 65 2e 20 49 6e 20 74 68 69 73 20  geSize. In this 
18760 63 61 73 65 20 6c 6f 63 6b 42 74 72 65 65 28 29  case lockBtree()
18770 20 77 69 6c 6c 20 75 70 64 61 74 65 0a 20 20 20   will update.   
18780 20 2a 2a 20 70 42 74 2d 3e 70 61 67 65 53 69 7a   ** pBt->pageSiz
18790 65 20 74 6f 20 74 68 65 20 70 61 67 65 2d 73 69  e to the page-si
187a0 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 6f  ze of the file o
187b0 6e 20 64 69 73 6b 2e 0a 20 20 20 20 2a 2f 0a 20  n disk..    */. 
187c0 20 20 20 77 68 69 6c 65 28 20 70 42 74 2d 3e 70     while( pBt->p
187d0 50 61 67 65 31 3d 3d 30 20 26 26 20 53 51 4c 49  Page1==0 && SQLI
187e0 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20 6c 6f 63  TE_OK==(rc = loc
187f0 6b 42 74 72 65 65 28 70 42 74 29 29 20 29 3b 0a  kBtree(pBt)) );.
18800 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
18810 49 54 45 5f 4f 4b 20 26 26 20 77 72 66 6c 61 67  ITE_OK && wrflag
18820 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70   ){.      if( (p
18830 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42  Bt->btsFlags & B
18840 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 29 21 3d 30  TS_READ_ONLY)!=0
18850 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
18860 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
18870 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
18880 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
18890 74 65 33 50 61 67 65 72 42 65 67 69 6e 28 70 42  te3PagerBegin(pB
188a0 74 2d 3e 70 50 61 67 65 72 2c 77 72 66 6c 61 67  t->pPager,wrflag
188b0 3e 31 2c 73 71 6c 69 74 65 33 54 65 6d 70 49 6e  >1,sqlite3TempIn
188c0 4d 65 6d 6f 72 79 28 70 2d 3e 64 62 29 29 3b 0a  Memory(p->db));.
188d0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
188e0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
188f0 20 20 20 20 20 20 20 72 63 20 3d 20 6e 65 77 44         rc = newD
18900 61 74 61 62 61 73 65 28 70 42 74 29 3b 0a 20 20  atabase(pBt);.  
18910 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
18920 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28      }.  .    if(
18930 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
18940 7b 0a 20 20 20 20 20 20 75 6e 6c 6f 63 6b 42 74  {.      unlockBt
18950 72 65 65 49 66 55 6e 75 73 65 64 28 70 42 74 29  reeIfUnused(pBt)
18960 3b 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65  ;.    }.  }while
18970 28 20 28 72 63 26 30 78 46 46 29 3d 3d 53 51 4c  ( (rc&0xFF)==SQL
18980 49 54 45 5f 42 55 53 59 20 26 26 20 70 42 74 2d  ITE_BUSY && pBt-
18990 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d  >inTransaction==
189a0 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 0a 20 20  TRANS_NONE &&.  
189b0 20 20 20 20 20 20 20 20 62 74 72 65 65 49 6e 76          btreeInv
189c0 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 28 70  okeBusyHandler(p
189d0 42 74 29 20 29 3b 0a 0a 20 20 69 66 28 20 72 63  Bt) );..  if( rc
189e0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
189f0 20 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e     if( p->inTran
18a00 73 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b  s==TRANS_NONE ){
18a10 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 54 72 61  .      pBt->nTra
18a20 6e 73 61 63 74 69 6f 6e 2b 2b 3b 0a 23 69 66 6e  nsaction++;.#ifn
18a30 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
18a40 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 20  SHARED_CACHE.   
18a50 20 20 20 69 66 28 20 70 2d 3e 73 68 61 72 61 62     if( p->sharab
18a60 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  le ){.        as
18a70 73 65 72 74 28 20 70 2d 3e 6c 6f 63 6b 2e 70 42  sert( p->lock.pB
18a80 74 72 65 65 3d 3d 70 20 26 26 20 70 2d 3e 6c 6f  tree==p && p->lo
18a90 63 6b 2e 69 54 61 62 6c 65 3d 3d 31 20 29 3b 0a  ck.iTable==1 );.
18aa0 20 20 20 20 20 20 20 20 70 2d 3e 6c 6f 63 6b 2e          p->lock.
18ab0 65 4c 6f 63 6b 20 3d 20 52 45 41 44 5f 4c 4f 43  eLock = READ_LOC
18ac0 4b 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6c 6f  K;.        p->lo
18ad0 63 6b 2e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e  ck.pNext = pBt->
18ae0 70 4c 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20 70  pLock;.        p
18af0 42 74 2d 3e 70 4c 6f 63 6b 20 3d 20 26 70 2d 3e  Bt->pLock = &p->
18b00 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 7d 0a 23 65  lock;.      }.#e
18b10 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 70  ndif.    }.    p
18b20 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 28 77 72 66  ->inTrans = (wrf
18b30 6c 61 67 3f 54 52 41 4e 53 5f 57 52 49 54 45 3a  lag?TRANS_WRITE:
18b40 54 52 41 4e 53 5f 52 45 41 44 29 3b 0a 20 20 20  TRANS_READ);.   
18b50 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e   if( p->inTrans>
18b60 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
18b70 6f 6e 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d  on ){.      pBt-
18b80 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d  >inTransaction =
18b90 20 70 2d 3e 69 6e 54 72 61 6e 73 3b 0a 20 20 20   p->inTrans;.   
18ba0 20 7d 0a 20 20 20 20 69 66 28 20 77 72 66 6c 61   }.    if( wrfla
18bb0 67 20 29 7b 0a 20 20 20 20 20 20 4d 65 6d 50 61  g ){.      MemPa
18bc0 67 65 20 2a 70 50 61 67 65 31 20 3d 20 70 42 74  ge *pPage1 = pBt
18bd0 2d 3e 70 50 61 67 65 31 3b 0a 23 69 66 6e 64 65  ->pPage1;.#ifnde
18be0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  f SQLITE_OMIT_SH
18bf0 41 52 45 44 5f 43 41 43 48 45 0a 20 20 20 20 20  ARED_CACHE.     
18c00 20 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e 70   assert( !pBt->p
18c10 57 72 69 74 65 72 20 29 3b 0a 20 20 20 20 20 20  Writer );.      
18c20 70 42 74 2d 3e 70 57 72 69 74 65 72 20 3d 20 70  pBt->pWriter = p
18c30 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 62 74 73  ;.      pBt->bts
18c40 46 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f 45 58  Flags &= ~BTS_EX
18c50 43 4c 55 53 49 56 45 3b 0a 20 20 20 20 20 20 69  CLUSIVE;.      i
18c60 66 28 20 77 72 66 6c 61 67 3e 31 20 29 20 70 42  f( wrflag>1 ) pB
18c70 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42  t->btsFlags |= B
18c80 54 53 5f 45 58 43 4c 55 53 49 56 45 3b 0a 23 65  TS_EXCLUSIVE;.#e
18c90 6e 64 69 66 0a 0a 20 20 20 20 20 20 2f 2a 20 49  ndif..      /* I
18ca0 66 20 74 68 65 20 64 62 2d 73 69 7a 65 20 68 65  f the db-size he
18cb0 61 64 65 72 20 66 69 65 6c 64 20 69 73 20 69 6e  ader field is in
18cc0 63 6f 72 72 65 63 74 20 28 61 73 20 69 74 20 6d  correct (as it m
18cd0 61 79 20 62 65 20 69 66 20 61 6e 20 6f 6c 64 0a  ay be if an old.
18ce0 20 20 20 20 20 20 2a 2a 20 63 6c 69 65 6e 74 20        ** client 
18cf0 68 61 73 20 62 65 65 6e 20 77 72 69 74 69 6e 67  has been writing
18d00 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
18d10 6c 65 29 2c 20 75 70 64 61 74 65 20 69 74 20 6e  le), update it n
18d20 6f 77 2e 20 44 6f 69 6e 67 0a 20 20 20 20 20 20  ow. Doing.      
18d30 2a 2a 20 74 68 69 73 20 73 6f 6f 6e 65 72 20 72  ** this sooner r
18d40 61 74 68 65 72 20 74 68 61 6e 20 6c 61 74 65 72  ather than later
18d50 20 6d 65 61 6e 73 20 74 68 65 20 64 61 74 61 62   means the datab
18d60 61 73 65 20 73 69 7a 65 20 63 61 6e 20 73 61 66  ase size can saf
18d70 65 6c 79 20 0a 20 20 20 20 20 20 2a 2a 20 72 65  ely .      ** re
18d80 2d 72 65 61 64 20 74 68 65 20 64 61 74 61 62 61  -read the databa
18d90 73 65 20 73 69 7a 65 20 66 72 6f 6d 20 70 61 67  se size from pag
18da0 65 20 31 20 69 66 20 61 20 73 61 76 65 70 6f 69  e 1 if a savepoi
18db0 6e 74 20 6f 72 20 74 72 61 6e 73 61 63 74 69 6f  nt or transactio
18dc0 6e 0a 20 20 20 20 20 20 2a 2a 20 72 6f 6c 6c 62  n.      ** rollb
18dd0 61 63 6b 20 6f 63 63 75 72 73 20 77 69 74 68 69  ack occurs withi
18de0 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  n the transactio
18df0 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  n..      */.    
18e00 20 20 69 66 28 20 70 42 74 2d 3e 6e 50 61 67 65    if( pBt->nPage
18e10 21 3d 67 65 74 34 62 79 74 65 28 26 70 50 61 67  !=get4byte(&pPag
18e20 65 31 2d 3e 61 44 61 74 61 5b 32 38 5d 29 20 29  e1->aData[28]) )
18e30 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
18e40 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
18e50 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65  (pPage1->pDbPage
18e60 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
18e70 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
18e80 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79            put4by
18e90 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
18ea0 61 5b 32 38 5d 2c 20 70 42 74 2d 3e 6e 50 61 67  a[28], pBt->nPag
18eb0 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  e);.        }.  
18ec0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
18ed0 0a 0a 74 72 61 6e 73 5f 62 65 67 75 6e 3a 0a 20  ..trans_begun:. 
18ee0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
18ef0 4f 4b 20 26 26 20 77 72 66 6c 61 67 20 29 7b 0a  OK && wrflag ){.
18f00 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61 6c 6c      /* This call
18f10 20 6d 61 6b 65 73 20 73 75 72 65 20 74 68 61 74   makes sure that
18f20 20 74 68 65 20 70 61 67 65 72 20 68 61 73 20 74   the pager has t
18f30 68 65 20 63 6f 72 72 65 63 74 20 6e 75 6d 62 65  he correct numbe
18f40 72 20 6f 66 0a 20 20 20 20 2a 2a 20 6f 70 65 6e  r of.    ** open
18f50 20 73 61 76 65 70 6f 69 6e 74 73 2e 20 49 66 20   savepoints. If 
18f60 74 68 65 20 73 65 63 6f 6e 64 20 70 61 72 61 6d  the second param
18f70 65 74 65 72 20 69 73 20 67 72 65 61 74 65 72 20  eter is greater 
18f80 74 68 61 6e 20 30 20 61 6e 64 0a 20 20 20 20 2a  than 0 and.    *
18f90 2a 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  * the sub-journa
18fa0 6c 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  l is not already
18fb0 20 6f 70 65 6e 2c 20 74 68 65 6e 20 69 74 20 77   open, then it w
18fc0 69 6c 6c 20 62 65 20 6f 70 65 6e 65 64 20 68 65  ill be opened he
18fd0 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  re..    */.    r
18fe0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
18ff0 4f 70 65 6e 53 61 76 65 70 6f 69 6e 74 28 70 42  OpenSavepoint(pB
19000 74 2d 3e 70 50 61 67 65 72 2c 20 70 2d 3e 64 62  t->pPager, p->db
19010 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20  ->nSavepoint);. 
19020 20 7d 0a 0a 20 20 62 74 72 65 65 49 6e 74 65 67   }..  btreeInteg
19030 72 69 74 79 28 70 29 3b 0a 20 20 73 71 6c 69 74  rity(p);.  sqlit
19040 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
19050 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
19060 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
19070 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
19080 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 70  ./*.** Set the p
19090 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69  ointer-map entri
190a0 65 73 20 66 6f 72 20 61 6c 6c 20 63 68 69 6c 64  es for all child
190b0 72 65 6e 20 6f 66 20 70 61 67 65 20 70 50 61 67  ren of page pPag
190c0 65 2e 20 41 6c 73 6f 2c 20 69 66 0a 2a 2a 20 70  e. Also, if.** p
190d0 50 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 63 65  Page contains ce
190e0 6c 6c 73 20 74 68 61 74 20 70 6f 69 6e 74 20 74  lls that point t
190f0 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  o overflow pages
19100 2c 20 73 65 74 20 74 68 65 20 70 6f 69 6e 74 65  , set the pointe
19110 72 0a 2a 2a 20 6d 61 70 20 65 6e 74 72 69 65 73  r.** map entries
19120 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f   for the overflo
19130 77 20 70 61 67 65 73 20 61 73 20 77 65 6c 6c 2e  w pages as well.
19140 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
19150 65 74 43 68 69 6c 64 50 74 72 6d 61 70 73 28 4d  etChildPtrmaps(M
19160 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a  emPage *pPage){.
19170 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
19180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19190 20 20 20 20 20 2f 2a 20 43 6f 75 6e 74 65 72 20       /* Counter 
191a0 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  variable */.  in
191b0 74 20 6e 43 65 6c 6c 3b 20 20 20 20 20 20 20 20  t nCell;        
191c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
191d0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 65   /* Number of ce
191e0 6c 6c 73 20 69 6e 20 70 61 67 65 20 70 50 61 67  lls in page pPag
191f0 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  e */.  int rc;  
19200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19210 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
19220 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 42 74  urn code */.  Bt
19230 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50  Shared *pBt = pP
19240 61 67 65 2d 3e 70 42 74 3b 0a 20 20 75 38 20 69  age->pBt;.  u8 i
19250 73 49 6e 69 74 4f 72 69 67 20 3d 20 70 50 61 67  sInitOrig = pPag
19260 65 2d 3e 69 73 49 6e 69 74 3b 0a 20 20 50 67 6e  e->isInit;.  Pgn
19270 6f 20 70 67 6e 6f 20 3d 20 70 50 61 67 65 2d 3e  o pgno = pPage->
19280 70 67 6e 6f 3b 0a 0a 20 20 61 73 73 65 72 74 28  pgno;..  assert(
19290 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
192a0 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
192b0 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 63 20 3d  mutex) );.  rc =
192c0 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 70   btreeInitPage(p
192d0 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21  Page);.  if( rc!
192e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
192f0 20 20 67 6f 74 6f 20 73 65 74 5f 63 68 69 6c 64    goto set_child
19300 5f 70 74 72 6d 61 70 73 5f 6f 75 74 3b 0a 20 20  _ptrmaps_out;.  
19310 7d 0a 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67  }.  nCell = pPag
19320 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20 66 6f 72  e->nCell;..  for
19330 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69  (i=0; i<nCell; i
19340 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70 43 65  ++){.    u8 *pCe
19350 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50  ll = findCell(pP
19360 61 67 65 2c 20 69 29 3b 0a 0a 20 20 20 20 70 74  age, i);..    pt
19370 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28 70  rmapPutOvflPtr(p
19380 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 72 63  Page, pCell, &rc
19390 29 3b 0a 0a 20 20 20 20 69 66 28 20 21 70 50 61  );..    if( !pPa
193a0 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
193b0 20 20 50 67 6e 6f 20 63 68 69 6c 64 50 67 6e 6f    Pgno childPgno
193c0 20 3d 20 67 65 74 34 62 79 74 65 28 70 43 65 6c   = get4byte(pCel
193d0 6c 29 3b 0a 20 20 20 20 20 20 70 74 72 6d 61 70  l);.      ptrmap
193e0 50 75 74 28 70 42 74 2c 20 63 68 69 6c 64 50 67  Put(pBt, childPg
193f0 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45  no, PTRMAP_BTREE
19400 2c 20 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20  , pgno, &rc);.  
19410 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21    }.  }..  if( !
19420 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
19430 20 20 20 50 67 6e 6f 20 63 68 69 6c 64 50 67 6e     Pgno childPgn
19440 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50  o = get4byte(&pP
19450 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65  age->aData[pPage
19460 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b  ->hdrOffset+8]);
19470 0a 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70  .    ptrmapPut(p
19480 42 74 2c 20 63 68 69 6c 64 50 67 6e 6f 2c 20 50  Bt, childPgno, P
19490 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 67 6e  TRMAP_BTREE, pgn
194a0 6f 2c 20 26 72 63 29 3b 0a 20 20 7d 0a 0a 73 65  o, &rc);.  }..se
194b0 74 5f 63 68 69 6c 64 5f 70 74 72 6d 61 70 73 5f  t_child_ptrmaps_
194c0 6f 75 74 3a 0a 20 20 70 50 61 67 65 2d 3e 69 73  out:.  pPage->is
194d0 49 6e 69 74 20 3d 20 69 73 49 6e 69 74 4f 72 69  Init = isInitOri
194e0 67 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  g;.  return rc;.
194f0 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 77 68 65  }../*.** Somewhe
19500 72 65 20 6f 6e 20 70 50 61 67 65 20 69 73 20 61  re on pPage is a
19510 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 61 67 65   pointer to page
19520 20 69 46 72 6f 6d 2e 20 20 4d 6f 64 69 66 79 20   iFrom.  Modify 
19530 74 68 69 73 20 70 6f 69 6e 74 65 72 20 73 6f 0a  this pointer so.
19540 2a 2a 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74  ** that it point
19550 73 20 74 6f 20 69 54 6f 2e 20 50 61 72 61 6d 65  s to iTo. Parame
19560 74 65 72 20 65 54 79 70 65 20 64 65 73 63 72 69  ter eType descri
19570 62 65 73 20 74 68 65 20 74 79 70 65 20 6f 66 20  bes the type of 
19580 70 6f 69 6e 74 65 72 20 74 6f 0a 2a 2a 20 62 65  pointer to.** be
19590 20 6d 6f 64 69 66 69 65 64 2c 20 61 73 20 20 66   modified, as  f
195a0 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 50 54  ollows:.**.** PT
195b0 52 4d 41 50 5f 42 54 52 45 45 3a 20 20 20 20 20  RMAP_BTREE:     
195c0 70 50 61 67 65 20 69 73 20 61 20 62 74 72 65 65  pPage is a btree
195d0 2d 70 61 67 65 2e 20 54 68 65 20 70 6f 69 6e 74  -page. The point
195e0 65 72 20 70 6f 69 6e 74 73 20 61 74 20 61 20 63  er points at a c
195f0 68 69 6c 64 20 0a 2a 2a 20 20 20 20 20 20 20 20  hild .**        
19600 20 20 20 20 20 20 20 20 20 20 20 70 61 67 65 20             page 
19610 6f 66 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  of pPage..**.** 
19620 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31  PTRMAP_OVERFLOW1
19630 3a 20 70 50 61 67 65 20 69 73 20 61 20 62 74 72  : pPage is a btr
19640 65 65 2d 70 61 67 65 2e 20 54 68 65 20 70 6f 69  ee-page. The poi
19650 6e 74 65 72 20 70 6f 69 6e 74 73 20 61 74 20 61  nter points at a
19660 6e 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20 20 20  n overflow.**   
19670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19680 70 61 67 65 20 70 6f 69 6e 74 65 64 20 74 6f 20  page pointed to 
19690 62 79 20 6f 6e 65 20 6f 66 20 74 68 65 20 63 65  by one of the ce
196a0 6c 6c 73 20 6f 6e 20 70 50 61 67 65 2e 0a 2a 2a  lls on pPage..**
196b0 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f 56 45 52 46  .** PTRMAP_OVERF
196c0 4c 4f 57 32 3a 20 70 50 61 67 65 20 69 73 20 61  LOW2: pPage is a
196d0 6e 20 6f 76 65 72 66 6c 6f 77 2d 70 61 67 65 2e  n overflow-page.
196e0 20 54 68 65 20 70 6f 69 6e 74 65 72 20 70 6f 69   The pointer poi
196f0 6e 74 73 20 61 74 20 74 68 65 20 6e 65 78 74 0a  nts at the next.
19700 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
19710 20 20 20 20 20 6f 76 65 72 66 6c 6f 77 20 70 61       overflow pa
19720 67 65 20 69 6e 20 74 68 65 20 6c 69 73 74 2e 0a  ge in the list..
19730 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f  */.static int mo
19740 64 69 66 79 50 61 67 65 50 6f 69 6e 74 65 72 28  difyPagePointer(
19750 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
19760 50 67 6e 6f 20 69 46 72 6f 6d 2c 20 50 67 6e 6f  Pgno iFrom, Pgno
19770 20 69 54 6f 2c 20 75 38 20 65 54 79 70 65 29 7b   iTo, u8 eType){
19780 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
19790 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
197a0 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
197b0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
197c0 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
197d0 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
197e0 50 61 67 65 29 20 29 3b 0a 20 20 69 66 28 20 65  Page) );.  if( e
197f0 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45  Type==PTRMAP_OVE
19800 52 46 4c 4f 57 32 20 29 7b 0a 20 20 20 20 2f 2a  RFLOW2 ){.    /*
19810 20 54 68 65 20 70 6f 69 6e 74 65 72 20 69 73 20   The pointer is 
19820 61 6c 77 61 79 73 20 74 68 65 20 66 69 72 73 74  always the first
19830 20 34 20 62 79 74 65 73 20 6f 66 20 74 68 65 20   4 bytes of the 
19840 70 61 67 65 20 69 6e 20 74 68 69 73 20 63 61 73  page in this cas
19850 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 67  e.  */.    if( g
19860 65 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61  et4byte(pPage->a
19870 44 61 74 61 29 21 3d 69 46 72 6f 6d 20 29 7b 0a  Data)!=iFrom ){.
19880 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
19890 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
198a0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 75 74 34  ;.    }.    put4
198b0 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74  byte(pPage->aDat
198c0 61 2c 20 69 54 6f 29 3b 0a 20 20 7d 65 6c 73 65  a, iTo);.  }else
198d0 7b 0a 20 20 20 20 75 38 20 69 73 49 6e 69 74 4f  {.    u8 isInitO
198e0 72 69 67 20 3d 20 70 50 61 67 65 2d 3e 69 73 49  rig = pPage->isI
198f0 6e 69 74 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  nit;.    int i;.
19900 20 20 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 0a 0a      int nCell;..
19910 20 20 20 20 62 74 72 65 65 49 6e 69 74 50 61 67      btreeInitPag
19920 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 6e 43  e(pPage);.    nC
19930 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65  ell = pPage->nCe
19940 6c 6c 3b 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30  ll;..    for(i=0
19950 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b  ; i<nCell; i++){
19960 0a 20 20 20 20 20 20 75 38 20 2a 70 43 65 6c 6c  .      u8 *pCell
19970 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67   = findCell(pPag
19980 65 2c 20 69 29 3b 0a 20 20 20 20 20 20 69 66 28  e, i);.      if(
19990 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f   eType==PTRMAP_O
199a0 56 45 52 46 4c 4f 57 31 20 29 7b 0a 20 20 20 20  VERFLOW1 ){.    
199b0 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66      CellInfo inf
199c0 6f 3b 0a 20 20 20 20 20 20 20 20 62 74 72 65 65  o;.        btree
199d0 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61  ParseCellPtr(pPa
199e0 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f  ge, pCell, &info
199f0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  );.        if( i
19a00 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 0a 20 20  nfo.iOverflow.  
19a10 20 20 20 20 20 20 20 26 26 20 70 43 65 6c 6c 2b         && pCell+
19a20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 2b 33  info.iOverflow+3
19a30 3c 3d 70 50 61 67 65 2d 3e 61 44 61 74 61 2b 70  <=pPage->aData+p
19a40 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65 0a 20  Page->maskPage. 
19a50 20 20 20 20 20 20 20 20 26 26 20 69 46 72 6f 6d          && iFrom
19a60 3d 3d 67 65 74 34 62 79 74 65 28 26 70 43 65 6c  ==get4byte(&pCel
19a70 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77  l[info.iOverflow
19a80 5d 29 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20  ]).        ){.  
19a90 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
19aa0 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76  (&pCell[info.iOv
19ab0 65 72 66 6c 6f 77 5d 2c 20 69 54 6f 29 3b 0a 20  erflow], iTo);. 
19ac0 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
19ad0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
19ae0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69  }else{.        i
19af0 66 28 20 67 65 74 34 62 79 74 65 28 70 43 65 6c  f( get4byte(pCel
19b00 6c 29 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20  l)==iFrom ){.   
19b10 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
19b20 70 43 65 6c 6c 2c 20 69 54 6f 29 3b 0a 20 20 20  pCell, iTo);.   
19b30 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
19b40 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
19b50 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28      }.  .    if(
19b60 20 69 3d 3d 6e 43 65 6c 6c 20 29 7b 0a 20 20 20   i==nCell ){.   
19b70 20 20 20 69 66 28 20 65 54 79 70 65 21 3d 50 54     if( eType!=PT
19b80 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20 0a 20  RMAP_BTREE || . 
19b90 20 20 20 20 20 20 20 20 20 67 65 74 34 62 79 74           get4byt
19ba0 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e(&pPage->aData[
19bb0 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
19bc0 2b 38 5d 29 21 3d 69 46 72 6f 6d 20 29 7b 0a 20  +8])!=iFrom ){. 
19bd0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
19be0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
19bf0 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  T;.      }.     
19c00 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65   put4byte(&pPage
19c10 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68  ->aData[pPage->h
19c20 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20 69 54 6f  drOffset+8], iTo
19c30 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 50  );.    }..    pP
19c40 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 69 73  age->isInit = is
19c50 49 6e 69 74 4f 72 69 67 3b 0a 20 20 7d 0a 20 20  InitOrig;.  }.  
19c60 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
19c70 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65  ;.}.../*.** Move
19c80 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62 61   the open databa
19c90 73 65 20 70 61 67 65 20 70 44 62 50 61 67 65 20  se page pDbPage 
19ca0 74 6f 20 6c 6f 63 61 74 69 6f 6e 20 69 46 72 65  to location iFre
19cb0 65 50 61 67 65 20 69 6e 20 74 68 65 20 0a 2a 2a  ePage in the .**
19cc0 20 64 61 74 61 62 61 73 65 2e 20 54 68 65 20 70   database. The p
19cd0 44 62 50 61 67 65 20 72 65 66 65 72 65 6e 63 65  DbPage reference
19ce0 20 72 65 6d 61 69 6e 73 20 76 61 6c 69 64 2e 0a   remains valid..
19cf0 2a 2a 0a 2a 2a 20 54 68 65 20 69 73 43 6f 6d 6d  **.** The isComm
19d00 69 74 20 66 6c 61 67 20 69 6e 64 69 63 61 74 65  it flag indicate
19d10 73 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20  s that there is 
19d20 6e 6f 20 6e 65 65 64 20 74 6f 20 72 65 6d 65 6d  no need to remem
19d30 62 65 72 20 74 68 61 74 0a 2a 2a 20 74 68 65 20  ber that.** the 
19d40 6a 6f 75 72 6e 61 6c 20 6e 65 65 64 73 20 74 6f  journal needs to
19d50 20 62 65 20 73 79 6e 63 28 29 65 64 20 62 65 66   be sync()ed bef
19d60 6f 72 65 20 64 61 74 61 62 61 73 65 20 70 61 67  ore database pag
19d70 65 20 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f 20  e pDbPage->pgno 
19d80 0a 2a 2a 20 63 61 6e 20 62 65 20 77 72 69 74 74  .** can be writt
19d90 65 6e 20 74 6f 2e 20 54 68 65 20 63 61 6c 6c 65  en to. The calle
19da0 72 20 68 61 73 20 61 6c 72 65 61 64 79 20 70 72  r has already pr
19db0 6f 6d 69 73 65 64 20 6e 6f 74 20 74 6f 20 77 72  omised not to wr
19dc0 69 74 65 20 74 6f 20 74 68 61 74 0a 2a 2a 20 70  ite to that.** p
19dd0 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  age..*/.static i
19de0 6e 74 20 72 65 6c 6f 63 61 74 65 50 61 67 65 28  nt relocatePage(
19df0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
19e00 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42  ,           /* B
19e10 74 72 65 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  tree */.  MemPag
19e20 65 20 2a 70 44 62 50 61 67 65 2c 20 20 20 20 20  e *pDbPage,     
19e30 20 20 20 2f 2a 20 4f 70 65 6e 20 70 61 67 65 20     /* Open page 
19e40 74 6f 20 6d 6f 76 65 20 2a 2f 0a 20 20 75 38 20  to move */.  u8 
19e50 65 54 79 70 65 2c 20 20 20 20 20 20 20 20 20 20  eType,          
19e60 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
19e70 20 6d 61 70 20 27 74 79 70 65 27 20 65 6e 74 72   map 'type' entr
19e80 79 20 66 6f 72 20 70 44 62 50 61 67 65 20 2a 2f  y for pDbPage */
19e90 0a 20 20 50 67 6e 6f 20 69 50 74 72 50 61 67 65  .  Pgno iPtrPage
19ea0 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  ,           /* P
19eb0 6f 69 6e 74 65 72 20 6d 61 70 20 27 70 61 67 65  ointer map 'page
19ec0 2d 6e 6f 27 20 65 6e 74 72 79 20 66 6f 72 20 70  -no' entry for p
19ed0 44 62 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f  DbPage */.  Pgno
19ee0 20 69 46 72 65 65 50 61 67 65 2c 20 20 20 20 20   iFreePage,     
19ef0 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f 63 61       /* The loca
19f00 74 69 6f 6e 20 74 6f 20 6d 6f 76 65 20 70 44 62  tion to move pDb
19f10 50 61 67 65 20 74 6f 20 2a 2f 0a 20 20 69 6e 74  Page to */.  int
19f20 20 69 73 43 6f 6d 6d 69 74 20 20 20 20 20 20 20   isCommit       
19f30 20 20 20 20 20 20 2f 2a 20 69 73 43 6f 6d 6d 69        /* isCommi
19f40 74 20 66 6c 61 67 20 70 61 73 73 65 64 20 74 6f  t flag passed to
19f50 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 6f 76   sqlite3PagerMov
19f60 65 70 61 67 65 20 2a 2f 0a 29 7b 0a 20 20 4d 65  epage */.){.  Me
19f70 6d 50 61 67 65 20 2a 70 50 74 72 50 61 67 65 3b  mPage *pPtrPage;
19f80 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74     /* The page t
19f90 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 20 70  hat contains a p
19fa0 6f 69 6e 74 65 72 20 74 6f 20 70 44 62 50 61 67  ointer to pDbPag
19fb0 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 44 62 50  e */.  Pgno iDbP
19fc0 61 67 65 20 3d 20 70 44 62 50 61 67 65 2d 3e 70  age = pDbPage->p
19fd0 67 6e 6f 3b 0a 20 20 50 61 67 65 72 20 2a 70 50  gno;.  Pager *pP
19fe0 61 67 65 72 20 3d 20 70 42 74 2d 3e 70 50 61 67  ager = pBt->pPag
19ff0 65 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  er;.  int rc;.. 
1a000 20 61 73 73 65 72 74 28 20 65 54 79 70 65 3d 3d   assert( eType==
1a010 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32  PTRMAP_OVERFLOW2
1a020 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41   || eType==PTRMA
1a030 50 5f 4f 56 45 52 46 4c 4f 57 31 20 7c 7c 20 0a  P_OVERFLOW1 || .
1a040 20 20 20 20 20 20 65 54 79 70 65 3d 3d 50 54 52        eType==PTR
1a050 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20 65 54 79  MAP_BTREE || eTy
1a060 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50  pe==PTRMAP_ROOTP
1a070 41 47 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  AGE );.  assert(
1a080 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
1a090 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
1a0a0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 44 62  );.  assert( pDb
1a0b0 50 61 67 65 2d 3e 70 42 74 3d 3d 70 42 74 20 29  Page->pBt==pBt )
1a0c0 3b 0a 0a 20 20 2f 2a 20 4d 6f 76 65 20 70 61 67  ;..  /* Move pag
1a0d0 65 20 69 44 62 50 61 67 65 20 66 72 6f 6d 20 69  e iDbPage from i
1a0e0 74 73 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74  ts current locat
1a0f0 69 6f 6e 20 74 6f 20 70 61 67 65 20 6e 75 6d 62  ion to page numb
1a100 65 72 20 69 46 72 65 65 50 61 67 65 20 2a 2f 0a  er iFreePage */.
1a110 20 20 54 52 41 43 45 28 28 22 41 55 54 4f 56 41    TRACE(("AUTOVA
1a120 43 55 55 4d 3a 20 4d 6f 76 69 6e 67 20 25 64 20  CUUM: Moving %d 
1a130 74 6f 20 66 72 65 65 20 70 61 67 65 20 25 64 20  to free page %d 
1a140 28 70 74 72 20 70 61 67 65 20 25 64 20 74 79 70  (ptr page %d typ
1a150 65 20 25 64 29 5c 6e 22 2c 20 0a 20 20 20 20 20  e %d)\n", .     
1a160 20 69 44 62 50 61 67 65 2c 20 69 46 72 65 65 50   iDbPage, iFreeP
1a170 61 67 65 2c 20 69 50 74 72 50 61 67 65 2c 20 65  age, iPtrPage, e
1a180 54 79 70 65 29 29 3b 0a 20 20 72 63 20 3d 20 73  Type));.  rc = s
1a190 71 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65 70  qlite3PagerMovep
1a1a0 61 67 65 28 70 50 61 67 65 72 2c 20 70 44 62 50  age(pPager, pDbP
1a1b0 61 67 65 2d 3e 70 44 62 50 61 67 65 2c 20 69 46  age->pDbPage, iF
1a1c0 72 65 65 50 61 67 65 2c 20 69 73 43 6f 6d 6d 69  reePage, isCommi
1a1d0 74 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  t);.  if( rc!=SQ
1a1e0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
1a1f0 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
1a200 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f 20 3d 20  pDbPage->pgno = 
1a210 69 46 72 65 65 50 61 67 65 3b 0a 0a 20 20 2f 2a  iFreePage;..  /*
1a220 20 49 66 20 70 44 62 50 61 67 65 20 77 61 73 20   If pDbPage was 
1a230 61 20 62 74 72 65 65 2d 70 61 67 65 2c 20 74 68  a btree-page, th
1a240 65 6e 20 69 74 20 6d 61 79 20 68 61 76 65 20 63  en it may have c
1a250 68 69 6c 64 20 70 61 67 65 73 20 61 6e 64 2f 6f  hild pages and/o
1a260 72 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 74 68 61  r cells.  ** tha
1a270 74 20 70 6f 69 6e 74 20 74 6f 20 6f 76 65 72 66  t point to overf
1a280 6c 6f 77 20 70 61 67 65 73 2e 20 54 68 65 20 70  low pages. The p
1a290 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 69  ointer map entri
1a2a0 65 73 20 66 6f 72 20 61 6c 6c 20 74 68 65 73 65  es for all these
1a2b0 0a 20 20 2a 2a 20 70 61 67 65 73 20 6e 65 65 64  .  ** pages need
1a2c0 20 74 6f 20 62 65 20 63 68 61 6e 67 65 64 2e 0a   to be changed..
1a2d0 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 44 62    **.  ** If pDb
1a2e0 50 61 67 65 20 69 73 20 61 6e 20 6f 76 65 72 66  Page is an overf
1a2f0 6c 6f 77 20 70 61 67 65 2c 20 74 68 65 6e 20 74  low page, then t
1a300 68 65 20 66 69 72 73 74 20 34 20 62 79 74 65 73  he first 4 bytes
1a310 20 6d 61 79 20 73 74 6f 72 65 20 61 0a 20 20 2a   may store a.  *
1a320 2a 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73  * pointer to a s
1a330 75 62 73 65 71 75 65 6e 74 20 6f 76 65 72 66 6c  ubsequent overfl
1a340 6f 77 20 70 61 67 65 2e 20 49 66 20 74 68 69 73  ow page. If this
1a350 20 69 73 20 74 68 65 20 63 61 73 65 2c 20 74 68   is the case, th
1a360 65 6e 0a 20 20 2a 2a 20 74 68 65 20 70 6f 69 6e  en.  ** the poin
1a370 74 65 72 20 6d 61 70 20 6e 65 65 64 73 20 74 6f  ter map needs to
1a380 20 62 65 20 75 70 64 61 74 65 64 20 66 6f 72 20   be updated for 
1a390 74 68 65 20 73 75 62 73 65 71 75 65 6e 74 20 6f  the subsequent o
1a3a0 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 0a 20 20  verflow page..  
1a3b0 2a 2f 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d  */.  if( eType==
1a3c0 50 54 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20  PTRMAP_BTREE || 
1a3d0 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f  eType==PTRMAP_RO
1a3e0 4f 54 50 41 47 45 20 29 7b 0a 20 20 20 20 72 63  OTPAGE ){.    rc
1a3f0 20 3d 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61   = setChildPtrma
1a400 70 73 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20  ps(pDbPage);.   
1a410 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1a420 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  OK ){.      retu
1a430 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d  rn rc;.    }.  }
1a440 65 6c 73 65 7b 0a 20 20 20 20 50 67 6e 6f 20 6e  else{.    Pgno n
1a450 65 78 74 4f 76 66 6c 20 3d 20 67 65 74 34 62 79  extOvfl = get4by
1a460 74 65 28 70 44 62 50 61 67 65 2d 3e 61 44 61 74  te(pDbPage->aDat
1a470 61 29 3b 0a 20 20 20 20 69 66 28 20 6e 65 78 74  a);.    if( next
1a480 4f 76 66 6c 21 3d 30 20 29 7b 0a 20 20 20 20 20  Ovfl!=0 ){.     
1a490 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20   ptrmapPut(pBt, 
1a4a0 6e 65 78 74 4f 76 66 6c 2c 20 50 54 52 4d 41 50  nextOvfl, PTRMAP
1a4b0 5f 4f 56 45 52 46 4c 4f 57 32 2c 20 69 46 72 65  _OVERFLOW2, iFre
1a4c0 65 50 61 67 65 2c 20 26 72 63 29 3b 0a 20 20 20  ePage, &rc);.   
1a4d0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1a4e0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1a4f0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
1a500 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
1a510 2f 2a 20 46 69 78 20 74 68 65 20 64 61 74 61 62  /* Fix the datab
1a520 61 73 65 20 70 6f 69 6e 74 65 72 20 6f 6e 20 70  ase pointer on p
1a530 61 67 65 20 69 50 74 72 50 61 67 65 20 74 68 61  age iPtrPage tha
1a540 74 20 70 6f 69 6e 74 65 64 20 61 74 20 69 44 62  t pointed at iDb
1a550 50 61 67 65 20 73 6f 0a 20 20 2a 2a 20 74 68 61  Page so.  ** tha
1a560 74 20 69 74 20 70 6f 69 6e 74 73 20 61 74 20 69  t it points at i
1a570 46 72 65 65 50 61 67 65 2e 20 41 6c 73 6f 20 66  FreePage. Also f
1a580 69 78 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d  ix the pointer m
1a590 61 70 20 65 6e 74 72 79 20 66 6f 72 0a 20 20 2a  ap entry for.  *
1a5a0 2a 20 69 50 74 72 50 61 67 65 2e 0a 20 20 2a 2f  * iPtrPage..  */
1a5b0 0a 20 20 69 66 28 20 65 54 79 70 65 21 3d 50 54  .  if( eType!=PT
1a5c0 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b  RMAP_ROOTPAGE ){
1a5d0 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47  .    rc = btreeG
1a5e0 65 74 50 61 67 65 28 70 42 74 2c 20 69 50 74 72  etPage(pBt, iPtr
1a5f0 50 61 67 65 2c 20 26 70 50 74 72 50 61 67 65 2c  Page, &pPtrPage,
1a600 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21   0);.    if( rc!
1a610 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1a620 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1a630 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71     }.    rc = sq
1a640 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
1a650 70 50 74 72 50 61 67 65 2d 3e 70 44 62 50 61 67  pPtrPage->pDbPag
1a660 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  e);.    if( rc!=
1a670 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1a680 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
1a690 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20 20 20  PtrPage);.      
1a6a0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
1a6b0 0a 20 20 20 20 72 63 20 3d 20 6d 6f 64 69 66 79  .    rc = modify
1a6c0 50 61 67 65 50 6f 69 6e 74 65 72 28 70 50 74 72  PagePointer(pPtr
1a6d0 50 61 67 65 2c 20 69 44 62 50 61 67 65 2c 20 69  Page, iDbPage, i
1a6e0 46 72 65 65 50 61 67 65 2c 20 65 54 79 70 65 29  FreePage, eType)
1a6f0 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67  ;.    releasePag
1a700 65 28 70 50 74 72 50 61 67 65 29 3b 0a 20 20 20  e(pPtrPage);.   
1a710 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1a720 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 74 72 6d  OK ){.      ptrm
1a730 61 70 50 75 74 28 70 42 74 2c 20 69 46 72 65 65  apPut(pBt, iFree
1a740 50 61 67 65 2c 20 65 54 79 70 65 2c 20 69 50 74  Page, eType, iPt
1a750 72 50 61 67 65 2c 20 26 72 63 29 3b 0a 20 20 20  rPage, &rc);.   
1a760 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
1a770 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72  rc;.}../* Forwar
1a780 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 72 65  d declaration re
1a790 71 75 69 72 65 64 20 62 79 20 69 6e 63 72 56 61  quired by incrVa
1a7a0 63 75 75 6d 53 74 65 70 28 29 2e 20 2a 2f 0a 73  cuumStep(). */.s
1a7b0 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61  tatic int alloca
1a7c0 74 65 42 74 72 65 65 50 61 67 65 28 42 74 53 68  teBtreePage(BtSh
1a7d0 61 72 65 64 20 2a 2c 20 4d 65 6d 50 61 67 65 20  ared *, MemPage 
1a7e0 2a 2a 2c 20 50 67 6e 6f 20 2a 2c 20 50 67 6e 6f  **, Pgno *, Pgno
1a7f0 2c 20 75 38 29 3b 0a 0a 2f 2a 0a 2a 2a 20 50 65  , u8);../*.** Pe
1a800 72 66 6f 72 6d 20 61 20 73 69 6e 67 6c 65 20 73  rform a single s
1a810 74 65 70 20 6f 66 20 61 6e 20 69 6e 63 72 65 6d  tep of an increm
1a820 65 6e 74 61 6c 2d 76 61 63 75 75 6d 2e 20 49 66  ental-vacuum. If
1a830 20 73 75 63 63 65 73 73 66 75 6c 2c 20 72 65 74   successful, ret
1a840 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  urn.** SQLITE_OK
1a850 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f  . If there is no
1a860 20 77 6f 72 6b 20 74 6f 20 64 6f 20 28 61 6e 64   work to do (and
1a870 20 74 68 65 72 65 66 6f 72 65 20 6e 6f 20 70 6f   therefore no po
1a880 69 6e 74 20 69 6e 20 0a 2a 2a 20 63 61 6c 6c 69  int in .** calli
1a890 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ng this function
1a8a0 20 61 67 61 69 6e 29 2c 20 72 65 74 75 72 6e 20   again), return 
1a8b0 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 20 4f 72 2c  SQLITE_DONE. Or,
1a8c0 20 69 66 20 61 6e 20 65 72 72 6f 72 20 0a 2a 2a   if an error .**
1a8d0 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20   occurs, return 
1a8e0 73 6f 6d 65 20 6f 74 68 65 72 20 65 72 72 6f 72  some other error
1a8f0 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 72   code..**.** Mor
1a900 65 20 73 70 65 63 69 66 69 63 61 6c 6c 79 2c 20  e specifically, 
1a910 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 74  this function at
1a920 74 65 6d 70 74 73 20 74 6f 20 72 65 2d 6f 72 67  tempts to re-org
1a930 61 6e 69 7a 65 20 74 68 65 20 64 61 74 61 62 61  anize the databa
1a940 73 65 20 73 6f 20 0a 2a 2a 20 74 68 61 74 20 74  se so .** that t
1a950 68 65 20 6c 61 73 74 20 70 61 67 65 20 6f 66 20  he last page of 
1a960 74 68 65 20 66 69 6c 65 20 63 75 72 72 65 6e 74  the file current
1a970 6c 79 20 69 6e 20 75 73 65 20 69 73 20 6e 6f 20  ly in use is no 
1a980 6c 6f 6e 67 65 72 20 69 6e 20 75 73 65 2e 0a 2a  longer in use..*
1a990 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 6e  *.** Parameter n
1a9a0 46 69 6e 20 69 73 20 74 68 65 20 6e 75 6d 62 65  Fin is the numbe
1a9b0 72 20 6f 66 20 70 61 67 65 73 20 74 68 61 74 20  r of pages that 
1a9c0 74 68 69 73 20 64 61 74 61 62 61 73 65 20 77 6f  this database wo
1a9d0 75 6c 64 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 77  uld contain.** w
1a9e0 65 72 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ere this functio
1a9f0 6e 20 63 61 6c 6c 65 64 20 75 6e 74 69 6c 20 69  n called until i
1aa00 74 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45  t returns SQLITE
1aa10 5f 44 4f 4e 45 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  _DONE..**.** If 
1aa20 74 68 65 20 62 43 6f 6d 6d 69 74 20 70 61 72 61  the bCommit para
1aa30 6d 65 74 65 72 20 69 73 20 6e 6f 6e 2d 7a 65 72  meter is non-zer
1aa40 6f 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  o, this function
1aa50 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 74 68   assumes that th
1aa60 65 20 0a 2a 2a 20 63 61 6c 6c 65 72 20 77 69 6c  e .** caller wil
1aa70 6c 20 6b 65 65 70 20 63 61 6c 6c 69 6e 67 20 69  l keep calling i
1aa80 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28 29 20  ncrVacuumStep() 
1aa90 75 6e 74 69 6c 20 69 74 20 72 65 74 75 72 6e 73  until it returns
1aaa0 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 0a 2a 2a   SQLITE_DONE .**
1aab0 20 6f 72 20 61 6e 20 65 72 72 6f 72 2e 20 62 43   or an error. bC
1aac0 6f 6d 6d 69 74 20 69 73 20 70 61 73 73 65 64 20  ommit is passed 
1aad0 74 72 75 65 20 66 6f 72 20 61 6e 20 61 75 74 6f  true for an auto
1aae0 2d 76 61 63 75 75 6d 2d 6f 6e 2d 63 6f 6d 6d 69  -vacuum-on-commi
1aaf0 74 20 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 2c  t .** operation,
1ab00 20 6f 72 20 66 61 6c 73 65 20 66 6f 72 20 61 6e   or false for an
1ab10 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63   incremental vac
1ab20 75 75 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  uum..*/.static i
1ab30 6e 74 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65  nt incrVacuumSte
1ab40 70 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c  p(BtShared *pBt,
1ab50 20 50 67 6e 6f 20 6e 46 69 6e 2c 20 50 67 6e 6f   Pgno nFin, Pgno
1ab60 20 69 4c 61 73 74 50 67 2c 20 69 6e 74 20 62 43   iLastPg, int bC
1ab70 6f 6d 6d 69 74 29 7b 0a 20 20 50 67 6e 6f 20 6e  ommit){.  Pgno n
1ab80 46 72 65 65 4c 69 73 74 3b 20 20 20 20 20 20 20  FreeList;       
1ab90 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1aba0 20 70 61 67 65 73 20 73 74 69 6c 6c 20 6f 6e 20   pages still on 
1abb0 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 2a 2f  the free-list */
1abc0 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73  .  int rc;..  as
1abd0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
1abe0 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
1abf0 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
1ac00 28 20 69 4c 61 73 74 50 67 3e 6e 46 69 6e 20 29  ( iLastPg>nFin )
1ac10 3b 0a 0a 20 20 69 66 28 20 21 50 54 52 4d 41 50  ;..  if( !PTRMAP
1ac20 5f 49 53 50 41 47 45 28 70 42 74 2c 20 69 4c 61  _ISPAGE(pBt, iLa
1ac30 73 74 50 67 29 20 26 26 20 69 4c 61 73 74 50 67  stPg) && iLastPg
1ac40 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  !=PENDING_BYTE_P
1ac50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20  AGE(pBt) ){.    
1ac60 75 38 20 65 54 79 70 65 3b 0a 20 20 20 20 50 67  u8 eType;.    Pg
1ac70 6e 6f 20 69 50 74 72 50 61 67 65 3b 0a 0a 20 20  no iPtrPage;..  
1ac80 20 20 6e 46 72 65 65 4c 69 73 74 20 3d 20 67 65    nFreeList = ge
1ac90 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61  t4byte(&pBt->pPa
1aca0 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b  ge1->aData[36]);
1acb0 0a 20 20 20 20 69 66 28 20 6e 46 72 65 65 4c 69  .    if( nFreeLi
1acc0 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  st==0 ){.      r
1acd0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e  eturn SQLITE_DON
1ace0 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 63  E;.    }..    rc
1acf0 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70 42 74   = ptrmapGet(pBt
1ad00 2c 20 69 4c 61 73 74 50 67 2c 20 26 65 54 79 70  , iLastPg, &eTyp
1ad10 65 2c 20 26 69 50 74 72 50 61 67 65 29 3b 0a 20  e, &iPtrPage);. 
1ad20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1ad30 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
1ad40 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
1ad50 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54     if( eType==PT
1ad60 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b  RMAP_ROOTPAGE ){
1ad70 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
1ad80 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
1ad90 54 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  T;.    }..    if
1ada0 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  ( eType==PTRMAP_
1adb0 46 52 45 45 50 41 47 45 20 29 7b 0a 20 20 20 20  FREEPAGE ){.    
1adc0 20 20 69 66 28 20 62 43 6f 6d 6d 69 74 3d 3d 30    if( bCommit==0
1add0 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 52   ){.        /* R
1ade0 65 6d 6f 76 65 20 74 68 65 20 70 61 67 65 20 66  emove the page f
1adf0 72 6f 6d 20 74 68 65 20 66 69 6c 65 73 20 66 72  rom the files fr
1ae00 65 65 2d 6c 69 73 74 2e 20 54 68 69 73 20 69 73  ee-list. This is
1ae10 20 6e 6f 74 20 72 65 71 75 69 72 65 64 0a 20 20   not required.  
1ae20 20 20 20 20 20 20 2a 2a 20 69 66 20 62 43 6f 6d        ** if bCom
1ae30 6d 69 74 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2e  mit is non-zero.
1ae40 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20 74   In that case, t
1ae50 68 65 20 66 72 65 65 2d 6c 69 73 74 20 77 69 6c  he free-list wil
1ae60 6c 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  l be.        ** 
1ae70 74 72 75 6e 63 61 74 65 64 20 74 6f 20 7a 65 72  truncated to zer
1ae80 6f 20 61 66 74 65 72 20 74 68 69 73 20 66 75 6e  o after this fun
1ae90 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2c 20 73  ction returns, s
1aea0 6f 20 69 74 20 64 6f 65 73 6e 27 74 20 0a 20 20  o it doesn't .  
1aeb0 20 20 20 20 20 20 2a 2a 20 6d 61 74 74 65 72 20        ** matter 
1aec0 69 66 20 69 74 20 73 74 69 6c 6c 20 63 6f 6e 74  if it still cont
1aed0 61 69 6e 73 20 73 6f 6d 65 20 67 61 72 62 61 67  ains some garbag
1aee0 65 20 65 6e 74 72 69 65 73 2e 0a 20 20 20 20 20  e entries..     
1aef0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 50 67     */.        Pg
1af00 6e 6f 20 69 46 72 65 65 50 67 3b 0a 20 20 20 20  no iFreePg;.    
1af10 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 46 72      MemPage *pFr
1af20 65 65 50 67 3b 0a 20 20 20 20 20 20 20 20 72 63  eePg;.        rc
1af30 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65   = allocateBtree
1af40 50 61 67 65 28 70 42 74 2c 20 26 70 46 72 65 65  Page(pBt, &pFree
1af50 50 67 2c 20 26 69 46 72 65 65 50 67 2c 20 69 4c  Pg, &iFreePg, iL
1af60 61 73 74 50 67 2c 20 42 54 41 4c 4c 4f 43 5f 45  astPg, BTALLOC_E
1af70 58 41 43 54 29 3b 0a 20 20 20 20 20 20 20 20 69  XACT);.        i
1af80 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1af90 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
1afa0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
1afb0 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72   }.        asser
1afc0 74 28 20 69 46 72 65 65 50 67 3d 3d 69 4c 61 73  t( iFreePg==iLas
1afd0 74 50 67 20 29 3b 0a 20 20 20 20 20 20 20 20 72  tPg );.        r
1afe0 65 6c 65 61 73 65 50 61 67 65 28 70 46 72 65 65  eleasePage(pFree
1aff0 50 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  Pg);.      }.   
1b000 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20   } else {.      
1b010 50 67 6e 6f 20 69 46 72 65 65 50 67 3b 20 20 20  Pgno iFreePg;   
1b020 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
1b030 65 78 20 6f 66 20 66 72 65 65 20 70 61 67 65 20  ex of free page 
1b040 74 6f 20 6d 6f 76 65 20 70 4c 61 73 74 50 67 20  to move pLastPg 
1b050 74 6f 20 2a 2f 0a 20 20 20 20 20 20 4d 65 6d 50  to */.      MemP
1b060 61 67 65 20 2a 70 4c 61 73 74 50 67 3b 0a 20 20  age *pLastPg;.  
1b070 20 20 20 20 75 38 20 65 4d 6f 64 65 20 3d 20 42      u8 eMode = B
1b080 54 41 4c 4c 4f 43 5f 41 4e 59 3b 20 20 20 2f 2a  TALLOC_ANY;   /*
1b090 20 4d 6f 64 65 20 70 61 72 61 6d 65 74 65 72 20   Mode parameter 
1b0a0 66 6f 72 20 61 6c 6c 6f 63 61 74 65 42 74 72 65  for allocateBtre
1b0b0 65 50 61 67 65 28 29 20 2a 2f 0a 20 20 20 20 20  ePage() */.     
1b0c0 20 50 67 6e 6f 20 69 4e 65 61 72 20 3d 20 30 3b   Pgno iNear = 0;
1b0d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6e 65             /* ne
1b0e0 61 72 62 79 20 70 61 72 61 6d 65 74 65 72 20 66  arby parameter f
1b0f0 6f 72 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65  or allocateBtree
1b100 50 61 67 65 28 29 20 2a 2f 0a 0a 20 20 20 20 20  Page() */..     
1b110 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61   rc = btreeGetPa
1b120 67 65 28 70 42 74 2c 20 69 4c 61 73 74 50 67 2c  ge(pBt, iLastPg,
1b130 20 26 70 4c 61 73 74 50 67 2c 20 30 29 3b 0a 20   &pLastPg, 0);. 
1b140 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
1b150 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1b160 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
1b170 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49     }..      /* I
1b180 66 20 62 43 6f 6d 6d 69 74 20 69 73 20 7a 65 72  f bCommit is zer
1b190 6f 2c 20 74 68 69 73 20 6c 6f 6f 70 20 72 75 6e  o, this loop run
1b1a0 73 20 65 78 61 63 74 6c 79 20 6f 6e 63 65 20 61  s exactly once a
1b1b0 6e 64 20 70 61 67 65 20 70 4c 61 73 74 50 67 0a  nd page pLastPg.
1b1c0 20 20 20 20 20 20 2a 2a 20 69 73 20 73 77 61 70        ** is swap
1b1d0 70 65 64 20 77 69 74 68 20 74 68 65 20 66 69 72  ped with the fir
1b1e0 73 74 20 66 72 65 65 20 70 61 67 65 20 70 75 6c  st free page pul
1b1f0 6c 65 64 20 6f 66 66 20 74 68 65 20 66 72 65 65  led off the free
1b200 20 6c 69 73 74 2e 0a 20 20 20 20 20 20 2a 2a 0a   list..      **.
1b210 20 20 20 20 20 20 2a 2a 20 4f 6e 20 74 68 65 20        ** On the 
1b220 6f 74 68 65 72 20 68 61 6e 64 2c 20 69 66 20 62  other hand, if b
1b230 43 6f 6d 6d 69 74 20 69 73 20 67 72 65 61 74 65  Commit is greate
1b240 72 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65  r than zero, the
1b250 6e 20 6b 65 65 70 0a 20 20 20 20 20 20 2a 2a 20  n keep.      ** 
1b260 6c 6f 6f 70 69 6e 67 20 75 6e 74 69 6c 20 61 20  looping until a 
1b270 66 72 65 65 2d 70 61 67 65 20 6c 6f 63 61 74 65  free-page locate
1b280 64 20 77 69 74 68 69 6e 20 74 68 65 20 66 69 72  d within the fir
1b290 73 74 20 6e 46 69 6e 20 70 61 67 65 73 0a 20 20  st nFin pages.  
1b2a0 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 66 69      ** of the fi
1b2b0 6c 65 20 69 73 20 66 6f 75 6e 64 2e 0a 20 20 20  le is found..   
1b2c0 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
1b2d0 62 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b 0a 20 20  bCommit==0 ){.  
1b2e0 20 20 20 20 20 20 65 4d 6f 64 65 20 3d 20 42 54        eMode = BT
1b2f0 41 4c 4c 4f 43 5f 4c 45 3b 0a 20 20 20 20 20 20  ALLOC_LE;.      
1b300 20 20 69 4e 65 61 72 20 3d 20 6e 46 69 6e 3b 0a    iNear = nFin;.
1b310 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64 6f        }.      do
1b320 20 7b 0a 20 20 20 20 20 20 20 20 4d 65 6d 50 61   {.        MemPa
1b330 67 65 20 2a 70 46 72 65 65 50 67 3b 0a 20 20 20  ge *pFreePg;.   
1b340 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61       rc = alloca
1b350 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c  teBtreePage(pBt,
1b360 20 26 70 46 72 65 65 50 67 2c 20 26 69 46 72 65   &pFreePg, &iFre
1b370 65 50 67 2c 20 69 4e 65 61 72 2c 20 65 4d 6f 64  ePg, iNear, eMod
1b380 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  e);.        if( 
1b390 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1b3a0 0a 20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61  .          relea
1b3b0 73 65 50 61 67 65 28 70 4c 61 73 74 50 67 29 3b  sePage(pLastPg);
1b3c0 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
1b3d0 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a  n rc;.        }.
1b3e0 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
1b3f0 61 67 65 28 70 46 72 65 65 50 67 29 3b 0a 20 20  age(pFreePg);.  
1b400 20 20 20 20 7d 77 68 69 6c 65 28 20 62 43 6f 6d      }while( bCom
1b410 6d 69 74 20 26 26 20 69 46 72 65 65 50 67 3e 6e  mit && iFreePg>n
1b420 46 69 6e 20 29 3b 0a 20 20 20 20 20 20 61 73 73  Fin );.      ass
1b430 65 72 74 28 20 69 46 72 65 65 50 67 3c 69 4c 61  ert( iFreePg<iLa
1b440 73 74 50 67 20 29 3b 0a 20 20 20 20 20 20 0a 20  stPg );.      . 
1b450 20 20 20 20 20 72 63 20 3d 20 72 65 6c 6f 63 61       rc = reloca
1b460 74 65 50 61 67 65 28 70 42 74 2c 20 70 4c 61 73  tePage(pBt, pLas
1b470 74 50 67 2c 20 65 54 79 70 65 2c 20 69 50 74 72  tPg, eType, iPtr
1b480 50 61 67 65 2c 20 69 46 72 65 65 50 67 2c 20 62  Page, iFreePg, b
1b490 43 6f 6d 6d 69 74 29 3b 0a 20 20 20 20 20 20 72  Commit);.      r
1b4a0 65 6c 65 61 73 65 50 61 67 65 28 70 4c 61 73 74  eleasePage(pLast
1b4b0 50 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  Pg);.      if( r
1b4c0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1b4d0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
1b4e0 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  c;.      }.    }
1b4f0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 62 43 6f 6d  .  }..  if( bCom
1b500 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 64 6f  mit==0 ){.    do
1b510 20 7b 0a 20 20 20 20 20 20 69 4c 61 73 74 50 67   {.      iLastPg
1b520 2d 2d 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20  --;.    }while( 
1b530 69 4c 61 73 74 50 67 3d 3d 50 45 4e 44 49 4e 47  iLastPg==PENDING
1b540 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
1b550 7c 7c 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45  || PTRMAP_ISPAGE
1b560 28 70 42 74 2c 20 69 4c 61 73 74 50 67 29 20 29  (pBt, iLastPg) )
1b570 3b 0a 20 20 20 20 70 42 74 2d 3e 62 44 6f 54 72  ;.    pBt->bDoTr
1b580 75 6e 63 61 74 65 20 3d 20 31 3b 0a 20 20 20 20  uncate = 1;.    
1b590 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 69 4c 61  pBt->nPage = iLa
1b5a0 73 74 50 67 3b 0a 20 20 7d 0a 20 20 72 65 74 75  stPg;.  }.  retu
1b5b0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
1b5c0 0a 2f 2a 0a 2a 2a 20 54 68 65 20 64 61 74 61 62  ./*.** The datab
1b5d0 61 73 65 20 6f 70 65 6e 65 64 20 62 79 20 74 68  ase opened by th
1b5e0 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
1b5f0 20 69 73 20 61 6e 20 61 75 74 6f 2d 76 61 63 75   is an auto-vacu
1b600 75 6d 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 6e  um database.** n
1b610 4f 72 69 67 20 70 61 67 65 73 20 69 6e 20 73 69  Orig pages in si
1b620 7a 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 6e 46  ze containing nF
1b630 72 65 65 20 66 72 65 65 20 70 61 67 65 73 2e 20  ree free pages. 
1b640 52 65 74 75 72 6e 20 74 68 65 20 65 78 70 65 63  Return the expec
1b650 74 65 64 20 0a 2a 2a 20 73 69 7a 65 20 6f 66 20  ted .** size of 
1b660 74 68 65 20 64 61 74 61 62 61 73 65 20 69 6e 20  the database in 
1b670 70 61 67 65 73 20 66 6f 6c 6c 6f 77 69 6e 67 20  pages following 
1b680 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 6f  an auto-vacuum o
1b690 70 65 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  peration..*/.sta
1b6a0 74 69 63 20 50 67 6e 6f 20 66 69 6e 61 6c 44 62  tic Pgno finalDb
1b6b0 53 69 7a 65 28 42 74 53 68 61 72 65 64 20 2a 70  Size(BtShared *p
1b6c0 42 74 2c 20 50 67 6e 6f 20 6e 4f 72 69 67 2c 20  Bt, Pgno nOrig, 
1b6d0 50 67 6e 6f 20 6e 46 72 65 65 29 7b 0a 20 20 69  Pgno nFree){.  i
1b6e0 6e 74 20 6e 45 6e 74 72 79 3b 20 20 20 20 20 20  nt nEntry;      
1b6f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1b700 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72  * Number of entr
1b710 69 65 73 20 6f 6e 20 6f 6e 65 20 70 74 72 6d 61  ies on one ptrma
1b720 70 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f  p page */.  Pgno
1b730 20 6e 50 74 72 6d 61 70 3b 20 20 20 20 20 20 20   nPtrmap;       
1b740 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1b750 75 6d 62 65 72 20 6f 66 20 50 74 72 4d 61 70 20  umber of PtrMap 
1b760 70 61 67 65 73 20 74 6f 20 62 65 20 66 72 65 65  pages to be free
1b770 64 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 46 69 6e  d */.  Pgno nFin
1b780 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1b790 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
1b7a0 20 76 61 6c 75 65 20 2a 2f 0a 0a 20 20 6e 45 6e   value */..  nEn
1b7b0 74 72 79 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c  try = pBt->usabl
1b7c0 65 53 69 7a 65 2f 35 3b 0a 20 20 6e 50 74 72 6d  eSize/5;.  nPtrm
1b7d0 61 70 20 3d 20 28 6e 46 72 65 65 2d 6e 4f 72 69  ap = (nFree-nOri
1b7e0 67 2b 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28  g+PTRMAP_PAGENO(
1b7f0 70 42 74 2c 20 6e 4f 72 69 67 29 2b 6e 45 6e 74  pBt, nOrig)+nEnt
1b800 72 79 29 2f 6e 45 6e 74 72 79 3b 0a 20 20 6e 46  ry)/nEntry;.  nF
1b810 69 6e 20 3d 20 6e 4f 72 69 67 20 2d 20 6e 46 72  in = nOrig - nFr
1b820 65 65 20 2d 20 6e 50 74 72 6d 61 70 3b 0a 20 20  ee - nPtrmap;.  
1b830 69 66 28 20 6e 4f 72 69 67 3e 50 45 4e 44 49 4e  if( nOrig>PENDIN
1b840 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
1b850 20 26 26 20 6e 46 69 6e 3c 50 45 4e 44 49 4e 47   && nFin<PENDING
1b860 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
1b870 29 7b 0a 20 20 20 20 6e 46 69 6e 2d 2d 3b 0a 20  ){.    nFin--;. 
1b880 20 7d 0a 20 20 77 68 69 6c 65 28 20 50 54 52 4d   }.  while( PTRM
1b890 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 6e  AP_ISPAGE(pBt, n
1b8a0 46 69 6e 29 20 7c 7c 20 6e 46 69 6e 3d 3d 50 45  Fin) || nFin==PE
1b8b0 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
1b8c0 70 42 74 29 20 29 7b 0a 20 20 20 20 6e 46 69 6e  pBt) ){.    nFin
1b8d0 2d 2d 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  --;.  }..  retur
1b8e0 6e 20 6e 46 69 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n nFin;.}../*.**
1b8f0 20 41 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63   A write-transac
1b900 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 6f 70 65  tion must be ope
1b910 6e 65 64 20 62 65 66 6f 72 65 20 63 61 6c 6c 69  ned before calli
1b920 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ng this function
1b930 2e 0a 2a 2a 20 49 74 20 70 65 72 66 6f 72 6d 73  ..** It performs
1b940 20 61 20 73 69 6e 67 6c 65 20 75 6e 69 74 20 6f   a single unit o
1b950 66 20 77 6f 72 6b 20 74 6f 77 61 72 64 73 20 61  f work towards a
1b960 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61  n incremental va
1b970 63 75 75 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  cuum..**.** If t
1b980 68 65 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76  he incremental v
1b990 61 63 75 75 6d 20 69 73 20 66 69 6e 69 73 68 65  acuum is finishe
1b9a0 64 20 61 66 74 65 72 20 74 68 69 73 20 66 75 6e  d after this fun
1b9b0 63 74 69 6f 6e 20 68 61 73 20 72 75 6e 2c 0a 2a  ction has run,.*
1b9c0 2a 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73  * SQLITE_DONE is
1b9d0 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 69 74   returned. If it
1b9e0 20 69 73 20 6e 6f 74 20 66 69 6e 69 73 68 65 64   is not finished
1b9f0 2c 20 62 75 74 20 6e 6f 20 65 72 72 6f 72 20 6f  , but no error o
1ba00 63 63 75 72 72 65 64 2c 0a 2a 2a 20 53 51 4c 49  ccurred,.** SQLI
1ba10 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
1ba20 64 2e 20 4f 74 68 65 72 77 69 73 65 20 61 6e 20  d. Otherwise an 
1ba30 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
1ba40 65 2e 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  e. .*/.int sqlit
1ba50 65 33 42 74 72 65 65 49 6e 63 72 56 61 63 75 75  e3BtreeIncrVacuu
1ba60 6d 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69  m(Btree *p){.  i
1ba70 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72 65  nt rc;.  BtShare
1ba80 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
1ba90 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ..  sqlite3Btree
1baa0 45 6e 74 65 72 28 70 29 3b 0a 20 20 61 73 73 65  Enter(p);.  asse
1bab0 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73  rt( pBt->inTrans
1bac0 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52  action==TRANS_WR
1bad0 49 54 45 20 26 26 20 70 2d 3e 69 6e 54 72 61 6e  ITE && p->inTran
1bae0 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29  s==TRANS_WRITE )
1baf0 3b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 61 75  ;.  if( !pBt->au
1bb00 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  toVacuum ){.    
1bb10 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45  rc = SQLITE_DONE
1bb20 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 50  ;.  }else{.    P
1bb30 67 6e 6f 20 6e 4f 72 69 67 20 3d 20 62 74 72 65  gno nOrig = btre
1bb40 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 3b  ePagecount(pBt);
1bb50 0a 20 20 20 20 50 67 6e 6f 20 6e 46 72 65 65 20  .    Pgno nFree 
1bb60 3d 20 67 65 74 34 62 79 74 65 28 26 70 42 74 2d  = get4byte(&pBt-
1bb70 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  >pPage1->aData[3
1bb80 36 5d 29 3b 0a 20 20 20 20 50 67 6e 6f 20 6e 46  6]);.    Pgno nF
1bb90 69 6e 20 3d 20 66 69 6e 61 6c 44 62 53 69 7a 65  in = finalDbSize
1bba0 28 70 42 74 2c 20 6e 4f 72 69 67 2c 20 6e 46 72  (pBt, nOrig, nFr
1bbb0 65 65 29 3b 0a 0a 20 20 20 20 69 66 28 20 6e 4f  ee);..    if( nO
1bbc0 72 69 67 3c 6e 46 69 6e 20 29 7b 0a 20 20 20 20  rig<nFin ){.    
1bbd0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
1bbe0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
1bbf0 7d 65 6c 73 65 20 69 66 28 20 6e 46 72 65 65 3e  }else if( nFree>
1bc00 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
1bc10 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 70  saveAllCursors(p
1bc20 42 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  Bt, 0, 0);.     
1bc30 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1bc40 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  OK ){.        in
1bc50 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72 66  validateAllOverf
1bc60 6c 6f 77 43 61 63 68 65 28 70 42 74 29 3b 0a 20  lowCache(pBt);. 
1bc70 20 20 20 20 20 20 20 72 63 20 3d 20 69 6e 63 72         rc = incr
1bc80 56 61 63 75 75 6d 53 74 65 70 28 70 42 74 2c 20  VacuumStep(pBt, 
1bc90 6e 46 69 6e 2c 20 6e 4f 72 69 67 2c 20 30 29 3b  nFin, nOrig, 0);
1bca0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
1bcb0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1bcc0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
1bcd0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
1bce0 74 65 28 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  te(pBt->pPage1->
1bcf0 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
1bd00 20 20 70 75 74 34 62 79 74 65 28 26 70 42 74 2d    put4byte(&pBt-
1bd10 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 32  >pPage1->aData[2
1bd20 38 5d 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 3b  8], pBt->nPage);
1bd30 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
1bd40 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  se{.      rc = S
1bd50 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20  QLITE_DONE;.    
1bd60 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42  }.  }.  sqlite3B
1bd70 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
1bd80 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1bd90 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1bda0 20 69 73 20 63 61 6c 6c 65 64 20 70 72 69 6f 72   is called prior
1bdb0 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72   to sqlite3Pager
1bdc0 43 6f 6d 6d 69 74 20 77 68 65 6e 20 61 20 74 72  Commit when a tr
1bdd0 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20  ansaction.** is 
1bde0 63 6f 6d 6d 69 74 74 65 64 20 66 6f 72 20 61 6e  committed for an
1bdf0 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74   auto-vacuum dat
1be00 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  abase..**.** If 
1be10 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
1be20 75 72 6e 65 64 2c 20 74 68 65 6e 20 2a 70 6e 54  urned, then *pnT
1be30 72 75 6e 63 20 69 73 20 73 65 74 20 74 6f 20 74  runc is set to t
1be40 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  he number of pag
1be50 65 73 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61  es.** the databa
1be60 73 65 20 66 69 6c 65 20 73 68 6f 75 6c 64 20 62  se file should b
1be70 65 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20 64  e truncated to d
1be80 75 72 69 6e 67 20 74 68 65 20 63 6f 6d 6d 69 74  uring the commit
1be90 20 70 72 6f 63 65 73 73 2e 20 0a 2a 2a 20 69 2e   process. .** i.
1bea0 65 2e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  e. the database 
1beb0 68 61 73 20 62 65 65 6e 20 72 65 6f 72 67 61 6e  has been reorgan
1bec0 69 7a 65 64 20 73 6f 20 74 68 61 74 20 6f 6e 6c  ized so that onl
1bed0 79 20 74 68 65 20 66 69 72 73 74 20 2a 70 6e 54  y the first *pnT
1bee0 72 75 6e 63 0a 2a 2a 20 70 61 67 65 73 20 61 72  runc.** pages ar
1bef0 65 20 69 6e 20 75 73 65 2e 0a 2a 2f 0a 73 74 61  e in use..*/.sta
1bf00 74 69 63 20 69 6e 74 20 61 75 74 6f 56 61 63 75  tic int autoVacu
1bf10 75 6d 43 6f 6d 6d 69 74 28 42 74 53 68 61 72 65  umCommit(BtShare
1bf20 64 20 2a 70 42 74 29 7b 0a 20 20 69 6e 74 20 72  d *pBt){.  int r
1bf30 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1bf40 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
1bf50 20 70 42 74 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pBt->pPager;.  
1bf60 56 56 41 5f 4f 4e 4c 59 28 20 69 6e 74 20 6e 52  VVA_ONLY( int nR
1bf70 65 66 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  ef = sqlite3Page
1bf80 72 52 65 66 63 6f 75 6e 74 28 70 50 61 67 65 72  rRefcount(pPager
1bf90 29 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ) );..  assert( 
1bfa0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
1bfb0 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
1bfc0 3b 0a 20 20 69 6e 76 61 6c 69 64 61 74 65 41 6c  ;.  invalidateAl
1bfd0 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70  lOverflowCache(p
1bfe0 42 74 29 3b 0a 20 20 61 73 73 65 72 74 28 70 42  Bt);.  assert(pB
1bff0 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 3b 0a  t->autoVacuum);.
1c000 20 20 69 66 28 20 21 70 42 74 2d 3e 69 6e 63 72    if( !pBt->incr
1c010 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 50 67  Vacuum ){.    Pg
1c020 6e 6f 20 6e 46 69 6e 3b 20 20 20 20 20 20 20 20  no nFin;        
1c030 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
1c040 67 65 73 20 69 6e 20 64 61 74 61 62 61 73 65 20  ges in database 
1c050 61 66 74 65 72 20 61 75 74 6f 76 61 63 75 75 6d  after autovacuum
1c060 69 6e 67 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20  ing */.    Pgno 
1c070 6e 46 72 65 65 3b 20 20 20 20 20 20 20 20 2f 2a  nFree;        /*
1c080 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
1c090 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74   on the freelist
1c0a0 20 69 6e 69 74 69 61 6c 6c 79 20 2a 2f 0a 20 20   initially */.  
1c0b0 20 20 50 67 6e 6f 20 69 46 72 65 65 3b 20 20 20    Pgno iFree;   
1c0c0 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 78 74       /* The next
1c0d0 20 70 61 67 65 20 74 6f 20 62 65 20 66 72 65 65   page to be free
1c0e0 64 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 4f  d */.    Pgno nO
1c0f0 72 69 67 3b 20 20 20 20 20 20 20 20 2f 2a 20 44  rig;        /* D
1c100 61 74 61 62 61 73 65 20 73 69 7a 65 20 62 65 66  atabase size bef
1c110 6f 72 65 20 66 72 65 65 69 6e 67 20 2a 2f 0a 0a  ore freeing */..
1c120 20 20 20 20 6e 4f 72 69 67 20 3d 20 62 74 72 65      nOrig = btre
1c130 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 3b  ePagecount(pBt);
1c140 0a 20 20 20 20 69 66 28 20 50 54 52 4d 41 50 5f  .    if( PTRMAP_
1c150 49 53 50 41 47 45 28 70 42 74 2c 20 6e 4f 72 69  ISPAGE(pBt, nOri
1c160 67 29 20 7c 7c 20 6e 4f 72 69 67 3d 3d 50 45 4e  g) || nOrig==PEN
1c170 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
1c180 42 74 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  Bt) ){.      /* 
1c190 49 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62  It is not possib
1c1a0 6c 65 20 74 6f 20 63 72 65 61 74 65 20 61 20 64  le to create a d
1c1b0 61 74 61 62 61 73 65 20 66 6f 72 20 77 68 69 63  atabase for whic
1c1c0 68 20 74 68 65 20 66 69 6e 61 6c 20 70 61 67 65  h the final page
1c1d0 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 65 69 74  .      ** is eit
1c1e0 68 65 72 20 61 20 70 6f 69 6e 74 65 72 2d 6d 61  her a pointer-ma
1c1f0 70 20 70 61 67 65 20 6f 72 20 74 68 65 20 70 65  p page or the pe
1c200 6e 64 69 6e 67 2d 62 79 74 65 20 70 61 67 65 2e  nding-byte page.
1c210 20 49 66 20 6f 6e 65 0a 20 20 20 20 20 20 2a 2a   If one.      **
1c220 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c   is encountered,
1c230 20 74 68 69 73 20 69 6e 64 69 63 61 74 65 73 20   this indicates 
1c240 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20 20 20  corruption..    
1c250 20 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72    */.      retur
1c260 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
1c270 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a 20 20  _BKPT;.    }..  
1c280 20 20 6e 46 72 65 65 20 3d 20 67 65 74 34 62 79    nFree = get4by
1c290 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d  te(&pBt->pPage1-
1c2a0 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 20  >aData[36]);.   
1c2b0 20 6e 46 69 6e 20 3d 20 66 69 6e 61 6c 44 62 53   nFin = finalDbS
1c2c0 69 7a 65 28 70 42 74 2c 20 6e 4f 72 69 67 2c 20  ize(pBt, nOrig, 
1c2d0 6e 46 72 65 65 29 3b 0a 20 20 20 20 69 66 28 20  nFree);.    if( 
1c2e0 6e 46 69 6e 3e 6e 4f 72 69 67 20 29 20 72 65 74  nFin>nOrig ) ret
1c2f0 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
1c300 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 69 66 28  PT_BKPT;.    if(
1c310 20 6e 46 69 6e 3c 6e 4f 72 69 67 20 29 7b 0a 20   nFin<nOrig ){. 
1c320 20 20 20 20 20 72 63 20 3d 20 73 61 76 65 41 6c       rc = saveAl
1c330 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20 30 2c  lCursors(pBt, 0,
1c340 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66   0);.    }.    f
1c350 6f 72 28 69 46 72 65 65 3d 6e 4f 72 69 67 3b 20  or(iFree=nOrig; 
1c360 69 46 72 65 65 3e 6e 46 69 6e 20 26 26 20 72 63  iFree>nFin && rc
1c370 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 46 72  ==SQLITE_OK; iFr
1c380 65 65 2d 2d 29 7b 0a 20 20 20 20 20 20 72 63 20  ee--){.      rc 
1c390 3d 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70  = incrVacuumStep
1c3a0 28 70 42 74 2c 20 6e 46 69 6e 2c 20 69 46 72 65  (pBt, nFin, iFre
1c3b0 65 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20  e, 1);.    }.   
1c3c0 20 69 66 28 20 28 72 63 3d 3d 53 51 4c 49 54 45   if( (rc==SQLITE
1c3d0 5f 44 4f 4e 45 20 7c 7c 20 72 63 3d 3d 53 51 4c  _DONE || rc==SQL
1c3e0 49 54 45 5f 4f 4b 29 20 26 26 20 6e 46 72 65 65  ITE_OK) && nFree
1c3f0 3e 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  >0 ){.      rc =
1c400 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
1c410 74 65 28 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  te(pBt->pPage1->
1c420 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
1c430 70 75 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70  put4byte(&pBt->p
1c440 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d  Page1->aData[32]
1c450 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 75 74 34  , 0);.      put4
1c460 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65  byte(&pBt->pPage
1c470 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20 30 29  1->aData[36], 0)
1c480 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65  ;.      put4byte
1c490 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  (&pBt->pPage1->a
1c4a0 44 61 74 61 5b 32 38 5d 2c 20 6e 46 69 6e 29 3b  Data[28], nFin);
1c4b0 0a 20 20 20 20 20 20 70 42 74 2d 3e 62 44 6f 54  .      pBt->bDoT
1c4c0 72 75 6e 63 61 74 65 20 3d 20 31 3b 0a 20 20 20  runcate = 1;.   
1c4d0 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20     pBt->nPage = 
1c4e0 6e 46 69 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20  nFin;.    }.    
1c4f0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1c500 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  K ){.      sqlit
1c510 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28  e3PagerRollback(
1c520 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20  pPager);.    }. 
1c530 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 52   }..  assert( nR
1c540 65 66 3e 3d 73 71 6c 69 74 65 33 50 61 67 65 72  ef>=sqlite3Pager
1c550 52 65 66 63 6f 75 6e 74 28 70 50 61 67 65 72 29  Refcount(pPager)
1c560 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   );.  return rc;
1c570 0a 7d 0a 0a 23 65 6c 73 65 20 2f 2a 20 69 66 6e  .}..#else /* ifn
1c580 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1c590 41 55 54 4f 56 41 43 55 55 4d 20 2a 2f 0a 23 20  AUTOVACUUM */.# 
1c5a0 64 65 66 69 6e 65 20 73 65 74 43 68 69 6c 64 50  define setChildP
1c5b0 74 72 6d 61 70 73 28 78 29 20 53 51 4c 49 54 45  trmaps(x) SQLITE
1c5c0 5f 4f 4b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  _OK.#endif../*.*
1c5d0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64  * This routine d
1c5e0 6f 65 73 20 74 68 65 20 66 69 72 73 74 20 70 68  oes the first ph
1c5f0 61 73 65 20 6f 66 20 61 20 74 77 6f 2d 70 68 61  ase of a two-pha
1c600 73 65 20 63 6f 6d 6d 69 74 2e 20 20 54 68 69 73  se commit.  This
1c610 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 63 61 75 73   routine.** caus
1c620 65 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f  es a rollback jo
1c630 75 72 6e 61 6c 20 74 6f 20 62 65 20 63 72 65 61  urnal to be crea
1c640 74 65 64 20 28 69 66 20 69 74 20 64 6f 65 73 20  ted (if it does 
1c650 6e 6f 74 20 61 6c 72 65 61 64 79 20 65 78 69 73  not already exis
1c660 74 29 0a 2a 2a 20 61 6e 64 20 70 6f 70 75 6c 61  t).** and popula
1c670 74 65 64 20 77 69 74 68 20 65 6e 6f 75 67 68 20  ted with enough 
1c680 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 73 6f 20 74  information so t
1c690 68 61 74 20 69 66 20 61 20 70 6f 77 65 72 20 6c  hat if a power l
1c6a0 6f 73 73 20 6f 63 63 75 72 73 0a 2a 2a 20 74 68  oss occurs.** th
1c6b0 65 20 64 61 74 61 62 61 73 65 20 63 61 6e 20 62  e database can b
1c6c0 65 20 72 65 73 74 6f 72 65 64 20 74 6f 20 69 74  e restored to it
1c6d0 73 20 6f 72 69 67 69 6e 61 6c 20 73 74 61 74 65  s original state
1c6e0 20 62 79 20 70 6c 61 79 69 6e 67 20 62 61 63 6b   by playing back
1c6f0 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e  .** the journal.
1c700 20 20 54 68 65 6e 20 74 68 65 20 63 6f 6e 74 65    Then the conte
1c710 6e 74 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  nts of the journ
1c720 61 6c 20 61 72 65 20 66 6c 75 73 68 65 64 20 6f  al are flushed o
1c730 75 74 20 74 6f 0a 2a 2a 20 74 68 65 20 64 69 73  ut to.** the dis
1c740 6b 2e 20 20 41 66 74 65 72 20 74 68 65 20 6a 6f  k.  After the jo
1c750 75 72 6e 61 6c 20 69 73 20 73 61 66 65 6c 79 20  urnal is safely 
1c760 6f 6e 20 6f 78 69 64 65 2c 20 74 68 65 20 63 68  on oxide, the ch
1c770 61 6e 67 65 73 20 74 6f 20 74 68 65 0a 2a 2a 20  anges to the.** 
1c780 64 61 74 61 62 61 73 65 20 61 72 65 20 77 72 69  database are wri
1c790 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 64 61  tten into the da
1c7a0 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20  tabase file and 
1c7b0 66 6c 75 73 68 65 64 20 74 6f 20 6f 78 69 64 65  flushed to oxide
1c7c0 2e 0a 2a 2a 20 41 74 20 74 68 65 20 65 6e 64 20  ..** At the end 
1c7d0 6f 66 20 74 68 69 73 20 63 61 6c 6c 2c 20 74 68  of this call, th
1c7e0 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
1c7f0 61 6c 20 73 74 69 6c 6c 20 65 78 69 73 74 73 20  al still exists 
1c800 6f 6e 20 74 68 65 0a 2a 2a 20 64 69 73 6b 20 61  on the.** disk a
1c810 6e 64 20 77 65 20 61 72 65 20 73 74 69 6c 6c 20  nd we are still 
1c820 68 6f 6c 64 69 6e 67 20 61 6c 6c 20 6c 6f 63 6b  holding all lock
1c830 73 2c 20 73 6f 20 74 68 65 20 74 72 61 6e 73 61  s, so the transa
1c840 63 74 69 6f 6e 20 68 61 73 20 6e 6f 74 0a 2a 2a  ction has not.**
1c850 20 63 6f 6d 6d 69 74 74 65 64 2e 20 20 53 65 65   committed.  See
1c860 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
1c870 6d 69 74 50 68 61 73 65 54 77 6f 28 29 20 66 6f  mitPhaseTwo() fo
1c880 72 20 74 68 65 20 73 65 63 6f 6e 64 20 70 68 61  r the second pha
1c890 73 65 20 6f 66 20 74 68 65 0a 2a 2a 20 63 6f 6d  se of the.** com
1c8a0 6d 69 74 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a  mit process..**.
1c8b0 2a 2a 20 54 68 69 73 20 63 61 6c 6c 20 69 73 20  ** This call is 
1c8c0 61 20 6e 6f 2d 6f 70 20 69 66 20 6e 6f 20 77 72  a no-op if no wr
1c8d0 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
1c8e0 69 73 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74  is currently act
1c8f0 69 76 65 20 6f 6e 20 70 42 74 2e 0a 2a 2a 0a 2a  ive on pBt..**.*
1c900 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 73 79 6e  * Otherwise, syn
1c910 63 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  c the database f
1c920 69 6c 65 20 66 6f 72 20 74 68 65 20 62 74 72 65  ile for the btre
1c930 65 20 70 42 74 2e 20 7a 4d 61 73 74 65 72 20 70  e pBt. zMaster p
1c940 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 74 68 65 20  oints to.** the 
1c950 6e 61 6d 65 20 6f 66 20 61 20 6d 61 73 74 65 72  name of a master
1c960 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68   journal file th
1c970 61 74 20 73 68 6f 75 6c 64 20 62 65 20 77 72 69  at should be wri
1c980 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 0a 2a 2a  tten into the.**
1c990 20 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75 72   individual jour
1c9a0 6e 61 6c 20 66 69 6c 65 2c 20 6f 72 20 69 73 20  nal file, or is 
1c9b0 4e 55 4c 4c 2c 20 69 6e 64 69 63 61 74 69 6e 67  NULL, indicating
1c9c0 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   no master journ
1c9d0 61 6c 20 66 69 6c 65 20 0a 2a 2a 20 28 73 69 6e  al file .** (sin
1c9e0 67 6c 65 20 64 61 74 61 62 61 73 65 20 74 72 61  gle database tra
1c9f0 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a  nsaction)..**.**
1ca00 20 57 68 65 6e 20 74 68 69 73 20 69 73 20 63 61   When this is ca
1ca10 6c 6c 65 64 2c 20 74 68 65 20 6d 61 73 74 65 72  lled, the master
1ca20 20 6a 6f 75 72 6e 61 6c 20 73 68 6f 75 6c 64 20   journal should 
1ca30 61 6c 72 65 61 64 79 20 68 61 76 65 20 62 65 65  already have bee
1ca40 6e 0a 2a 2a 20 63 72 65 61 74 65 64 2c 20 70 6f  n.** created, po
1ca50 70 75 6c 61 74 65 64 20 77 69 74 68 20 74 68 69  pulated with thi
1ca60 73 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65  s journal pointe
1ca70 72 20 61 6e 64 20 73 79 6e 63 65 64 20 74 6f 20  r and synced to 
1ca80 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65  disk..**.** Once
1ca90 20 74 68 69 73 20 69 73 20 72 6f 75 74 69 6e 65   this is routine
1caa0 20 68 61 73 20 72 65 74 75 72 6e 65 64 2c 20 74   has returned, t
1cab0 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67 20 72 65  he only thing re
1cac0 71 75 69 72 65 64 20 74 6f 20 63 6f 6d 6d 69 74  quired to commit
1cad0 0a 2a 2a 20 74 68 65 20 77 72 69 74 65 2d 74 72  .** the write-tr
1cae0 61 6e 73 61 63 74 69 6f 6e 20 66 6f 72 20 74 68  ansaction for th
1caf0 69 73 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  is database file
1cb00 20 69 73 20 74 6f 20 64 65 6c 65 74 65 20 74 68   is to delete th
1cb10 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 69 6e  e journal..*/.in
1cb20 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  t sqlite3BtreeCo
1cb30 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 42 74 72  mmitPhaseOne(Btr
1cb40 65 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61  ee *p, const cha
1cb50 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69  r *zMaster){.  i
1cb60 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
1cb70 4b 3b 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72  K;.  if( p->inTr
1cb80 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans==TRANS_WRITE
1cb90 20 29 7b 0a 20 20 20 20 42 74 53 68 61 72 65 64   ){.    BtShared
1cba0 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
1cbb0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
1cbc0 45 6e 74 65 72 28 70 29 3b 0a 23 69 66 6e 64 65  Enter(p);.#ifnde
1cbd0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
1cbe0 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28  TOVACUUM.    if(
1cbf0 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
1cc00 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 61   ){.      rc = a
1cc10 75 74 6f 56 61 63 75 75 6d 43 6f 6d 6d 69 74 28  utoVacuumCommit(
1cc20 70 42 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  pBt);.      if( 
1cc30 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1cc40 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1cc50 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
1cc60 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
1cc70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1cc80 20 20 20 20 69 66 28 20 70 42 74 2d 3e 62 44 6f      if( pBt->bDo
1cc90 54 72 75 6e 63 61 74 65 20 29 7b 0a 20 20 20 20  Truncate ){.    
1cca0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72    sqlite3PagerTr
1ccb0 75 6e 63 61 74 65 49 6d 61 67 65 28 70 42 74 2d  uncateImage(pBt-
1ccc0 3e 70 50 61 67 65 72 2c 20 70 42 74 2d 3e 6e 50  >pPager, pBt->nP
1ccd0 61 67 65 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  age);.    }.#end
1cce0 69 66 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  if.    rc = sqli
1ccf0 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68  te3PagerCommitPh
1cd00 61 73 65 4f 6e 65 28 70 42 74 2d 3e 70 50 61 67  aseOne(pBt->pPag
1cd10 65 72 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b  er, zMaster, 0);
1cd20 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
1cd30 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a 20  eLeave(p);.  }. 
1cd40 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1cd50 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
1cd60 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 66 72 6f  on is called fro
1cd70 6d 20 62 6f 74 68 20 42 74 72 65 65 43 6f 6d 6d  m both BtreeComm
1cd80 69 74 50 68 61 73 65 54 77 6f 28 29 20 61 6e 64  itPhaseTwo() and
1cd90 20 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 29   BtreeRollback()
1cda0 0a 2a 2a 20 61 74 20 74 68 65 20 63 6f 6e 63 6c  .** at the concl
1cdb0 75 73 69 6f 6e 20 6f 66 20 61 20 74 72 61 6e 73  usion of a trans
1cdc0 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  action..*/.stati
1cdd0 63 20 76 6f 69 64 20 62 74 72 65 65 45 6e 64 54  c void btreeEndT
1cde0 72 61 6e 73 61 63 74 69 6f 6e 28 42 74 72 65 65  ransaction(Btree
1cdf0 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64   *p){.  BtShared
1ce00 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
1ce10 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
1ce20 70 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28  p->db;.  assert(
1ce30 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c   sqlite3BtreeHol
1ce40 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 0a 23  dsMutex(p) );..#
1ce50 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1ce60 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
1ce70 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65  pBt->bDoTruncate
1ce80 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 69   = 0;.#endif.  i
1ce90 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 54 52  f( p->inTrans>TR
1cea0 41 4e 53 5f 4e 4f 4e 45 20 26 26 20 64 62 2d 3e  ANS_NONE && db->
1ceb0 6e 56 64 62 65 52 65 61 64 3e 31 20 29 7b 0a 20  nVdbeRead>1 ){. 
1cec0 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61     /* If there a
1ced0 72 65 20 6f 74 68 65 72 20 61 63 74 69 76 65 20  re other active 
1cee0 73 74 61 74 65 6d 65 6e 74 73 20 74 68 61 74 20  statements that 
1cef0 62 65 6c 6f 6e 67 20 74 6f 20 74 68 69 73 20 64  belong to this d
1cf00 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 68  atabase.    ** h
1cf10 61 6e 64 6c 65 2c 20 64 6f 77 6e 67 72 61 64 65  andle, downgrade
1cf20 20 74 6f 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20   to a read-only 
1cf30 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65  transaction. The
1cf40 20 6f 74 68 65 72 20 73 74 61 74 65 6d 65 6e 74   other statement
1cf50 73 0a 20 20 20 20 2a 2a 20 6d 61 79 20 73 74 69  s.    ** may sti
1cf60 6c 6c 20 62 65 20 72 65 61 64 69 6e 67 20 66 72  ll be reading fr
1cf70 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  om the database.
1cf80 20 20 2a 2f 0a 20 20 20 20 64 6f 77 6e 67 72 61    */.    downgra
1cf90 64 65 41 6c 6c 53 68 61 72 65 64 43 61 63 68 65  deAllSharedCache
1cfa0 54 61 62 6c 65 4c 6f 63 6b 73 28 70 29 3b 0a 20  TableLocks(p);. 
1cfb0 20 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20     p->inTrans = 
1cfc0 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20 7d 65  TRANS_READ;.  }e
1cfd0 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74  lse{.    /* If t
1cfe0 68 65 20 68 61 6e 64 6c 65 20 68 61 64 20 61 6e  he handle had an
1cff0 79 20 6b 69 6e 64 20 6f 66 20 74 72 61 6e 73 61  y kind of transa
1d000 63 74 69 6f 6e 20 6f 70 65 6e 2c 20 64 65 63 72  ction open, decr
1d010 65 6d 65 6e 74 20 74 68 65 20 0a 20 20 20 20 2a  ement the .    *
1d020 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f  * transaction co
1d030 75 6e 74 20 6f 66 20 74 68 65 20 73 68 61 72 65  unt of the share
1d040 64 20 62 74 72 65 65 2e 20 49 66 20 74 68 65 20  d btree. If the 
1d050 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e  transaction coun
1d060 74 20 0a 20 20 20 20 2a 2a 20 72 65 61 63 68 65  t .    ** reache
1d070 73 20 30 2c 20 73 65 74 20 74 68 65 20 73 68 61  s 0, set the sha
1d080 72 65 64 20 73 74 61 74 65 20 74 6f 20 54 52 41  red state to TRA
1d090 4e 53 5f 4e 4f 4e 45 2e 20 54 68 65 20 75 6e 6c  NS_NONE. The unl
1d0a0 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64  ockBtreeIfUnused
1d0b0 28 29 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 62  ().    ** call b
1d0c0 65 6c 6f 77 20 77 69 6c 6c 20 75 6e 6c 6f 63 6b  elow will unlock
1d0d0 20 74 68 65 20 70 61 67 65 72 2e 20 20 2a 2f 0a   the pager.  */.
1d0e0 20 20 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61      if( p->inTra
1d0f0 6e 73 21 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29  ns!=TRANS_NONE )
1d100 7b 0a 20 20 20 20 20 20 63 6c 65 61 72 41 6c 6c  {.      clearAll
1d110 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
1d120 4c 6f 63 6b 73 28 70 29 3b 0a 20 20 20 20 20 20  Locks(p);.      
1d130 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f  pBt->nTransactio
1d140 6e 2d 2d 3b 0a 20 20 20 20 20 20 69 66 28 20 30  n--;.      if( 0
1d150 3d 3d 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74  ==pBt->nTransact
1d160 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ion ){.        p
1d170 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
1d180 6e 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a  n = TRANS_NONE;.
1d190 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
1d1a0 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20 63 75     /* Set the cu
1d1b0 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  rrent transactio
1d1c0 6e 20 73 74 61 74 65 20 74 6f 20 54 52 41 4e 53  n state to TRANS
1d1d0 5f 4e 4f 4e 45 20 61 6e 64 20 75 6e 6c 6f 63 6b  _NONE and unlock
1d1e0 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 70 61 67   the .    ** pag
1d1f0 65 72 20 69 66 20 74 68 69 73 20 63 61 6c 6c 20  er if this call 
1d200 63 6c 6f 73 65 64 20 74 68 65 20 6f 6e 6c 79 20  closed the only 
1d210 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 72  read or write tr
1d220 61 6e 73 61 63 74 69 6f 6e 2e 20 20 2a 2f 0a 20  ansaction.  */. 
1d230 20 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20     p->inTrans = 
1d240 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20  TRANS_NONE;.    
1d250 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75  unlockBtreeIfUnu
1d260 73 65 64 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 20  sed(pBt);.  }.. 
1d270 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28   btreeIntegrity(
1d280 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d  p);.}../*.** Com
1d290 6d 69 74 20 74 68 65 20 74 72 61 6e 73 61 63 74  mit the transact
1d2a0 69 6f 6e 20 63 75 72 72 65 6e 74 6c 79 20 69 6e  ion currently in
1d2b0 20 70 72 6f 67 72 65 73 73 2e 0a 2a 2a 0a 2a 2a   progress..**.**
1d2c0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 6d   This routine im
1d2d0 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 73 65 63  plements the sec
1d2e0 6f 6e 64 20 70 68 61 73 65 20 6f 66 20 61 20 32  ond phase of a 2
1d2f0 2d 70 68 61 73 65 20 63 6f 6d 6d 69 74 2e 20 20  -phase commit.  
1d300 54 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74  The.** sqlite3Bt
1d310 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  reeCommitPhaseOn
1d320 65 28 29 20 72 6f 75 74 69 6e 65 20 64 6f 65 73  e() routine does
1d330 20 74 68 65 20 66 69 72 73 74 20 70 68 61 73 65   the first phase
1d340 20 61 6e 64 20 73 68 6f 75 6c 64 0a 2a 2a 20 62   and should.** b
1d350 65 20 69 6e 76 6f 6b 65 64 20 70 72 69 6f 72 20  e invoked prior 
1d360 74 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20  to calling this 
1d370 72 6f 75 74 69 6e 65 2e 20 20 54 68 65 20 73 71  routine.  The sq
1d380 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
1d390 50 68 61 73 65 4f 6e 65 28 29 0a 2a 2a 20 72 6f  PhaseOne().** ro
1d3a0 75 74 69 6e 65 20 64 69 64 20 61 6c 6c 20 74 68  utine did all th
1d3b0 65 20 77 6f 72 6b 20 6f 66 20 77 72 69 74 69 6e  e work of writin
1d3c0 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 75  g information ou
1d3d0 74 20 74 6f 20 64 69 73 6b 20 61 6e 64 20 66 6c  t to disk and fl
1d3e0 75 73 68 69 6e 67 20 74 68 65 0a 2a 2a 20 63 6f  ushing the.** co
1d3f0 6e 74 65 6e 74 73 20 73 6f 20 74 68 61 74 20 74  ntents so that t
1d400 68 65 79 20 61 72 65 20 77 72 69 74 74 65 6e 20  hey are written 
1d410 6f 6e 74 6f 20 74 68 65 20 64 69 73 6b 20 70 6c  onto the disk pl
1d420 61 74 74 65 72 2e 20 20 41 6c 6c 20 74 68 69 73  atter.  All this
1d430 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 68 61 73 20  .** routine has 
1d440 74 6f 20 64 6f 20 69 73 20 64 65 6c 65 74 65 20  to do is delete 
1d450 6f 72 20 74 72 75 6e 63 61 74 65 20 6f 72 20 7a  or truncate or z
1d460 65 72 6f 20 74 68 65 20 68 65 61 64 65 72 20 69  ero the header i
1d470 6e 20 74 68 65 0a 2a 2a 20 74 68 65 20 72 6f 6c  n the.** the rol
1d480 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 28 77  lback journal (w
1d490 68 69 63 68 20 63 61 75 73 65 73 20 74 68 65 20  hich causes the 
1d4a0 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 6f 20 63  transaction to c
1d4b0 6f 6d 6d 69 74 29 20 61 6e 64 0a 2a 2a 20 64 72  ommit) and.** dr
1d4c0 6f 70 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20  op locks..**.** 
1d4d0 4e 6f 72 6d 61 6c 6c 79 2c 20 69 66 20 61 6e 20  Normally, if an 
1d4e0 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69  error occurs whi
1d4f0 6c 65 20 74 68 65 20 70 61 67 65 72 20 6c 61 79  le the pager lay
1d500 65 72 20 69 73 20 61 74 74 65 6d 70 74 69 6e 67  er is attempting
1d510 20 74 6f 20 0a 2a 2a 20 66 69 6e 61 6c 69 7a 65   to .** finalize
1d520 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   the underlying 
1d530 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68  journal file, th
1d540 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
1d550 72 6e 73 20 61 6e 20 65 72 72 6f 72 20 61 6e 64  rns an error and
1d560 0a 2a 2a 20 74 68 65 20 75 70 70 65 72 20 6c 61  .** the upper la
1d570 79 65 72 20 77 69 6c 6c 20 61 74 74 65 6d 70 74  yer will attempt
1d580 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 20 48 6f 77   a rollback. How
1d590 65 76 65 72 2c 20 69 66 20 74 68 65 20 73 65 63  ever, if the sec
1d5a0 6f 6e 64 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20  ond argument.** 
1d5b0 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 74 68 65 6e  is non-zero then
1d5c0 20 74 68 69 73 20 62 2d 74 72 65 65 20 74 72 61   this b-tree tra
1d5d0 6e 73 61 63 74 69 6f 6e 20 69 73 20 70 61 72 74  nsaction is part
1d5e0 20 6f 66 20 61 20 6d 75 6c 74 69 2d 66 69 6c 65   of a multi-file
1d5f0 20 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e   .** transaction
1d600 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20  . In this case, 
1d610 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
1d620 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
1d630 20 63 6f 6d 6d 69 74 74 65 64 20 0a 2a 2a 20 28   committed .** (
1d640 62 79 20 64 65 6c 65 74 69 6e 67 20 61 20 6d 61  by deleting a ma
1d650 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
1d660 65 29 20 61 6e 64 20 74 68 65 20 63 61 6c 6c 65  e) and the calle
1d670 72 20 77 69 6c 6c 20 69 67 6e 6f 72 65 20 74 68  r will ignore th
1d680 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 73  is .** functions
1d690 20 72 65 74 75 72 6e 20 63 6f 64 65 2e 20 53 6f   return code. So
1d6a0 2c 20 65 76 65 6e 20 69 66 20 61 6e 20 65 72 72  , even if an err
1d6b0 6f 72 20 6f 63 63 75 72 73 20 69 6e 20 74 68 65  or occurs in the
1d6c0 20 70 61 67 65 72 20 6c 61 79 65 72 2c 0a 2a 2a   pager layer,.**
1d6d0 20 72 65 73 65 74 20 74 68 65 20 62 2d 74 72 65   reset the b-tre
1d6e0 65 20 6f 62 6a 65 63 74 73 20 69 6e 74 65 72 6e  e objects intern
1d6f0 61 6c 20 73 74 61 74 65 20 74 6f 20 69 6e 64 69  al state to indi
1d700 63 61 74 65 20 74 68 61 74 20 74 68 65 20 77 72  cate that the wr
1d710 69 74 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69  ite.** transacti
1d720 6f 6e 20 68 61 73 20 62 65 65 6e 20 63 6c 6f 73  on has been clos
1d730 65 64 2e 20 54 68 69 73 20 69 73 20 71 75 69 74  ed. This is quit
1d740 65 20 73 61 66 65 2c 20 61 73 20 74 68 65 20 70  e safe, as the p
1d750 61 67 65 72 20 77 69 6c 6c 20 68 61 76 65 0a 2a  ager will have.*
1d760 2a 20 74 72 61 6e 73 69 74 69 6f 6e 65 64 20 74  * transitioned t
1d770 6f 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74  o the error stat
1d780 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 69  e..**.** This wi
1d790 6c 6c 20 72 65 6c 65 61 73 65 20 74 68 65 20 77  ll release the w
1d7a0 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  rite lock on the
1d7b0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
1d7c0 20 49 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65   If there.** are
1d7d0 20 6e 6f 20 61 63 74 69 76 65 20 63 75 72 73 6f   no active curso
1d7e0 72 73 2c 20 69 74 20 61 6c 73 6f 20 72 65 6c 65  rs, it also rele
1d7f0 61 73 65 73 20 74 68 65 20 72 65 61 64 20 6c 6f  ases the read lo
1d800 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ck..*/.int sqlit
1d810 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
1d820 73 65 54 77 6f 28 42 74 72 65 65 20 2a 70 2c 20  seTwo(Btree *p, 
1d830 69 6e 74 20 62 43 6c 65 61 6e 75 70 29 7b 0a 0a  int bCleanup){..
1d840 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73    if( p->inTrans
1d850 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 20 72  ==TRANS_NONE ) r
1d860 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1d870 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
1d880 6e 74 65 72 28 70 29 3b 0a 20 20 62 74 72 65 65  nter(p);.  btree
1d890 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 0a 20  Integrity(p);.. 
1d8a0 20 2f 2a 20 49 66 20 74 68 65 20 68 61 6e 64 6c   /* If the handl
1d8b0 65 20 68 61 73 20 61 20 77 72 69 74 65 2d 74 72  e has a write-tr
1d8c0 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 2c 20  ansaction open, 
1d8d0 63 6f 6d 6d 69 74 20 74 68 65 20 73 68 61 72 65  commit the share
1d8e0 64 2d 62 74 72 65 65 73 20 0a 20 20 2a 2a 20 74  d-btrees .  ** t
1d8f0 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 73  ransaction and s
1d900 65 74 20 74 68 65 20 73 68 61 72 65 64 20 73 74  et the shared st
1d910 61 74 65 20 74 6f 20 54 52 41 4e 53 5f 52 45 41  ate to TRANS_REA
1d920 44 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  D..  */.  if( p-
1d930 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
1d940 57 52 49 54 45 20 29 7b 0a 20 20 20 20 69 6e 74  WRITE ){.    int
1d950 20 72 63 3b 0a 20 20 20 20 42 74 53 68 61 72 65   rc;.    BtShare
1d960 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
1d970 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74  .    assert( pBt
1d980 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d  ->inTransaction=
1d990 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a  =TRANS_WRITE );.
1d9a0 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
1d9b0 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3e 30 20  >nTransaction>0 
1d9c0 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
1d9d0 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68  te3PagerCommitPh
1d9e0 61 73 65 54 77 6f 28 70 42 74 2d 3e 70 50 61 67  aseTwo(pBt->pPag
1d9f0 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  er);.    if( rc!
1da00 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 43  =SQLITE_OK && bC
1da10 6c 65 61 6e 75 70 3d 3d 30 20 29 7b 0a 20 20 20  leanup==0 ){.   
1da20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c     sqlite3BtreeL
1da30 65 61 76 65 28 70 29 3b 0a 20 20 20 20 20 20 72  eave(p);.      r
1da40 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
1da50 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73      pBt->inTrans
1da60 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 52  action = TRANS_R
1da70 45 41 44 3b 0a 20 20 20 20 62 74 72 65 65 43 6c  EAD;.    btreeCl
1da80 65 61 72 48 61 73 43 6f 6e 74 65 6e 74 28 70 42  earHasContent(pB
1da90 74 29 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65  t);.  }..  btree
1daa0 45 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70  EndTransaction(p
1dab0 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
1dac0 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
1dad0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
1dae0 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 62 6f 74 68 20  ../*.** Do both 
1daf0 70 68 61 73 65 73 20 6f 66 20 61 20 63 6f 6d 6d  phases of a comm
1db00 69 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  it..*/.int sqlit
1db10 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 28 42 74  e3BtreeCommit(Bt
1db20 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72  ree *p){.  int r
1db30 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  c;.  sqlite3Btre
1db40 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 72 63 20  eEnter(p);.  rc 
1db50 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  = sqlite3BtreeCo
1db60 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 2c 20  mmitPhaseOne(p, 
1db70 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  0);.  if( rc==SQ
1db80 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
1db90 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
1dba0 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70  CommitPhaseTwo(p
1dbb0 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  , 0);.  }.  sqli
1dbc0 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
1dbd0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
1dbe0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
1dbf0 74 69 6e 65 20 73 65 74 73 20 74 68 65 20 73 74  tine sets the st
1dc00 61 74 65 20 74 6f 20 43 55 52 53 4f 52 5f 46 41  ate to CURSOR_FA
1dc10 55 4c 54 20 61 6e 64 20 74 68 65 20 65 72 72 6f  ULT and the erro
1dc20 72 0a 2a 2a 20 63 6f 64 65 20 74 6f 20 65 72 72  r.** code to err
1dc30 43 6f 64 65 20 66 6f 72 20 65 76 65 72 79 20 63  Code for every c
1dc40 75 72 73 6f 72 20 6f 6e 20 61 6e 79 20 42 74 53  ursor on any BtS
1dc50 68 61 72 65 64 20 74 68 61 74 20 70 42 74 72 65  hared that pBtre
1dc60 65 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 2e  e.** references.
1dc70 20 20 4f 72 20 69 66 20 74 68 65 20 77 72 69 74    Or if the writ
1dc80 65 4f 6e 6c 79 20 66 6c 61 67 20 69 73 20 73 65  eOnly flag is se
1dc90 74 20 74 6f 20 31 2c 20 74 68 65 6e 20 6f 6e 6c  t to 1, then onl
1dca0 79 0a 2a 2a 20 74 72 69 70 20 77 72 69 74 65 20  y.** trip write 
1dcb0 63 75 72 73 6f 72 73 20 61 6e 64 20 6c 65 61 76  cursors and leav
1dcc0 65 20 72 65 61 64 20 63 75 72 73 6f 72 73 20 75  e read cursors u
1dcd0 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20  nchanged..**.** 
1dce0 45 76 65 72 79 20 63 75 72 73 6f 72 20 69 73 20  Every cursor is 
1dcf0 61 20 63 61 6e 64 69 64 61 74 65 20 74 6f 20 62  a candidate to b
1dd00 65 20 74 72 69 70 70 65 64 2c 20 69 6e 63 6c 75  e tripped, inclu
1dd10 64 69 6e 67 20 63 75 72 73 6f 72 73 0a 2a 2a 20  ding cursors.** 
1dd20 74 68 61 74 20 62 65 6c 6f 6e 67 20 74 6f 20 6f  that belong to o
1dd30 74 68 65 72 20 64 61 74 61 62 61 73 65 20 63 6f  ther database co
1dd40 6e 6e 65 63 74 69 6f 6e 73 20 74 68 61 74 20 68  nnections that h
1dd50 61 70 70 65 6e 20 74 6f 20 62 65 0a 2a 2a 20 73  appen to be.** s
1dd60 68 61 72 69 6e 67 20 74 68 65 20 63 61 63 68 65  haring the cache
1dd70 20 77 69 74 68 20 70 42 74 72 65 65 2e 0a 2a 2a   with pBtree..**
1dd80 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1dd90 20 67 65 74 73 20 63 61 6c 6c 65 64 20 77 68 65   gets called whe
1dda0 6e 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63  n a rollback occ
1ddb0 75 72 73 2e 20 49 66 20 74 68 65 20 77 72 69 74  urs. If the writ
1ddc0 65 4f 6e 6c 79 0a 2a 2a 20 66 6c 61 67 20 69 73  eOnly.** flag is
1ddd0 20 74 72 75 65 2c 20 74 68 65 6e 20 6f 6e 6c 79   true, then only
1dde0 20 77 72 69 74 65 2d 63 75 72 73 6f 72 73 20 6e   write-cursors n
1ddf0 65 65 64 20 62 65 20 74 72 69 70 70 65 64 20 2d  eed be tripped -
1de00 20 72 65 61 64 2d 6f 6e 6c 79 0a 2a 2a 20 63 75   read-only.** cu
1de10 72 73 6f 72 73 20 73 61 76 65 20 74 68 65 69 72  rsors save their
1de20 20 63 75 72 72 65 6e 74 20 70 6f 73 69 74 69 6f   current positio
1de30 6e 73 20 73 6f 20 74 68 61 74 20 74 68 65 79 20  ns so that they 
1de40 6d 61 79 20 63 6f 6e 74 69 6e 75 65 20 0a 2a 2a  may continue .**
1de50 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 72   following the r
1de60 6f 6c 6c 62 61 63 6b 2e 20 4f 72 2c 20 69 66 20  ollback. Or, if 
1de70 77 72 69 74 65 4f 6e 6c 79 20 69 73 20 66 61 6c  writeOnly is fal
1de80 73 65 2c 20 61 6c 6c 20 63 75 72 73 6f 72 73 20  se, all cursors 
1de90 61 72 65 20 0a 2a 2a 20 74 72 69 70 70 65 64 2e  are .** tripped.
1dea0 20 49 6e 20 67 65 6e 65 72 61 6c 2c 20 77 72 69   In general, wri
1deb0 74 65 4f 6e 6c 79 20 69 73 20 66 61 6c 73 65 20  teOnly is false 
1dec0 69 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  if the transacti
1ded0 6f 6e 20 62 65 69 6e 67 0a 2a 2a 20 72 6f 6c 6c  on being.** roll
1dee0 65 64 20 62 61 63 6b 20 6d 6f 64 69 66 69 65 64  ed back modified
1def0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63   the database sc
1df00 68 65 6d 61 2e 20 49 6e 20 74 68 69 73 20 63 61  hema. In this ca
1df10 73 65 20 62 2d 74 72 65 65 20 72 6f 6f 74 0a 2a  se b-tree root.*
1df20 2a 20 70 61 67 65 73 20 6d 61 79 20 62 65 20 6d  * pages may be m
1df30 6f 76 65 64 20 6f 72 20 64 65 6c 65 74 65 64 20  oved or deleted 
1df40 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
1df50 65 20 61 6c 74 6f 67 65 74 68 65 72 2c 20 6d 61  e altogether, ma
1df60 6b 69 6e 67 0a 2a 2a 20 69 74 20 75 6e 73 61 66  king.** it unsaf
1df70 65 20 66 6f 72 20 72 65 61 64 20 63 75 72 73 6f  e for read curso
1df80 72 73 20 74 6f 20 63 6f 6e 74 69 6e 75 65 2e 0a  rs to continue..
1df90 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 77 72 69  **.** If the wri
1dfa0 74 65 4f 6e 6c 79 20 66 6c 61 67 20 69 73 20 74  teOnly flag is t
1dfb0 72 75 65 20 61 6e 64 20 61 6e 20 65 72 72 6f 72  rue and an error
1dfc0 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20   is encountered 
1dfd0 77 68 69 6c 65 20 0a 2a 2a 20 73 61 76 69 6e 67  while .** saving
1dfe0 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 6f 73   the current pos
1dff0 69 74 69 6f 6e 20 6f 66 20 61 20 72 65 61 64 2d  ition of a read-
1e000 6f 6e 6c 79 20 63 75 72 73 6f 72 2c 20 61 6c 6c  only cursor, all
1e010 20 63 75 72 73 6f 72 73 2c 20 0a 2a 2a 20 69 6e   cursors, .** in
1e020 63 6c 75 64 69 6e 67 20 61 6c 6c 20 72 65 61 64  cluding all read
1e030 2d 63 75 72 73 6f 72 73 20 61 72 65 20 74 72 69  -cursors are tri
1e040 70 70 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49  pped..**.** SQLI
1e050 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
1e060 64 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 2c  d if successful,
1e070 20 6f 72 20 69 66 20 61 6e 20 65 72 72 6f 72 20   or if an error 
1e080 6f 63 63 75 72 73 20 77 68 69 6c 65 0a 2a 2a 20  occurs while.** 
1e090 73 61 76 69 6e 67 20 61 20 63 75 72 73 6f 72 20  saving a cursor 
1e0a0 70 6f 73 69 74 69 6f 6e 2c 20 61 6e 20 53 51 4c  position, an SQL
1e0b0 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a  ite error code..
1e0c0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
1e0d0 72 65 65 54 72 69 70 41 6c 6c 43 75 72 73 6f 72  reeTripAllCursor
1e0e0 73 28 42 74 72 65 65 20 2a 70 42 74 72 65 65 2c  s(Btree *pBtree,
1e0f0 20 69 6e 74 20 65 72 72 43 6f 64 65 2c 20 69 6e   int errCode, in
1e100 74 20 77 72 69 74 65 4f 6e 6c 79 29 7b 0a 20 20  t writeOnly){.  
1e110 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 69  BtCursor *p;.  i
1e120 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
1e130 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 28 77  K;..  assert( (w
1e140 72 69 74 65 4f 6e 6c 79 3d 3d 30 20 7c 7c 20 77  riteOnly==0 || w
1e150 72 69 74 65 4f 6e 6c 79 3d 3d 31 29 20 26 26 20  riteOnly==1) && 
1e160 42 54 43 46 5f 57 72 69 74 65 46 6c 61 67 3d 3d  BTCF_WriteFlag==
1e170 31 20 29 3b 0a 20 20 69 66 28 20 70 42 74 72 65  1 );.  if( pBtre
1e180 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  e ){.    sqlite3
1e190 42 74 72 65 65 45 6e 74 65 72 28 70 42 74 72 65  BtreeEnter(pBtre
1e1a0 65 29 3b 0a 20 20 20 20 66 6f 72 28 70 3d 70 42  e);.    for(p=pB
1e1b0 74 72 65 65 2d 3e 70 42 74 2d 3e 70 43 75 72 73  tree->pBt->pCurs
1e1c0 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78  or; p; p=p->pNex
1e1d0 74 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b  t){.      int i;
1e1e0 0a 20 20 20 20 20 20 69 66 28 20 77 72 69 74 65  .      if( write
1e1f0 4f 6e 6c 79 20 26 26 20 28 70 2d 3e 63 75 72 46  Only && (p->curF
1e200 6c 61 67 73 20 26 20 42 54 43 46 5f 57 72 69 74  lags & BTCF_Writ
1e210 65 46 6c 61 67 29 3d 3d 30 20 29 7b 0a 20 20 20  eFlag)==0 ){.   
1e220 20 20 20 20 20 69 66 28 20 70 2d 3e 65 53 74 61       if( p->eSta
1e230 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
1e240 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
1e250 20 3d 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73   = saveCursorPos
1e260 69 74 69 6f 6e 28 70 29 3b 0a 20 20 20 20 20 20  ition(p);.      
1e270 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1e280 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1e290 20 20 20 20 20 28 76 6f 69 64 29 73 71 6c 69 74       (void)sqlit
1e2a0 65 33 42 74 72 65 65 54 72 69 70 41 6c 6c 43 75  e3BtreeTripAllCu
1e2b0 72 73 6f 72 73 28 70 42 74 72 65 65 2c 20 72 63  rsors(pBtree, rc
1e2c0 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
1e2d0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
1e2e0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
1e2f0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1e300 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
1e310 43 6c 65 61 72 43 75 72 73 6f 72 28 70 29 3b 0a  ClearCursor(p);.
1e320 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74          p->eStat
1e330 65 20 3d 20 43 55 52 53 4f 52 5f 46 41 55 4c 54  e = CURSOR_FAULT
1e340 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 73 6b 69  ;.        p->ski
1e350 70 4e 65 78 74 20 3d 20 65 72 72 43 6f 64 65 3b  pNext = errCode;
1e360 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66  .      }.      f
1e370 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 2d 3e 69 50  or(i=0; i<=p->iP
1e380 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  age; i++){.     
1e390 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
1e3a0 2d 3e 61 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20  ->apPage[i]);.  
1e3b0 20 20 20 20 20 20 70 2d 3e 61 70 50 61 67 65 5b        p->apPage[
1e3c0 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  i] = 0;.      }.
1e3d0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
1e3e0 33 42 74 72 65 65 4c 65 61 76 65 28 70 42 74 72  3BtreeLeave(pBtr
1e3f0 65 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ee);.  }.  retur
1e400 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
1e410 6f 6c 6c 62 61 63 6b 20 74 68 65 20 74 72 61 6e  ollback the tran
1e420 73 61 63 74 69 6f 6e 20 69 6e 20 70 72 6f 67 72  saction in progr
1e430 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 72  ess..**.** If tr
1e440 69 70 43 6f 64 65 20 69 73 20 6e 6f 74 20 53 51  ipCode is not SQ
1e450 4c 49 54 45 5f 4f 4b 20 74 68 65 6e 20 63 75 72  LITE_OK then cur
1e460 73 6f 72 73 20 77 69 6c 6c 20 62 65 20 69 6e 76  sors will be inv
1e470 61 6c 69 64 61 74 65 64 20 28 74 72 69 70 70 65  alidated (trippe
1e480 64 29 2e 0a 2a 2a 20 4f 6e 6c 79 20 77 72 69 74  d)..** Only writ
1e490 65 20 63 75 72 73 6f 72 73 20 61 72 65 20 74 72  e cursors are tr
1e4a0 69 70 70 65 64 20 69 66 20 77 72 69 74 65 4f 6e  ipped if writeOn
1e4b0 6c 79 20 69 73 20 74 72 75 65 20 62 75 74 20 61  ly is true but a
1e4c0 6c 6c 20 63 75 72 73 6f 72 73 20 61 72 65 0a 2a  ll cursors are.*
1e4d0 2a 20 74 72 69 70 70 65 64 20 69 66 20 77 72 69  * tripped if wri
1e4e0 74 65 4f 6e 6c 79 20 69 73 20 66 61 6c 73 65 2e  teOnly is false.
1e4f0 20 20 41 6e 79 20 61 74 74 65 6d 70 74 20 74 6f    Any attempt to
1e500 20 75 73 65 0a 2a 2a 20 61 20 74 72 69 70 70 65   use.** a trippe
1e510 64 20 63 75 72 73 6f 72 20 77 69 6c 6c 20 72 65  d cursor will re
1e520 73 75 6c 74 20 69 6e 20 61 6e 20 65 72 72 6f 72  sult in an error
1e530 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 69 6c  ..**.** This wil
1e540 6c 20 72 65 6c 65 61 73 65 20 74 68 65 20 77 72  l release the wr
1e550 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ite lock on the 
1e560 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
1e570 49 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20  If there.** are 
1e580 6e 6f 20 61 63 74 69 76 65 20 63 75 72 73 6f 72  no active cursor
1e590 73 2c 20 69 74 20 61 6c 73 6f 20 72 65 6c 65 61  s, it also relea
1e5a0 73 65 73 20 74 68 65 20 72 65 61 64 20 6c 6f 63  ses the read loc
1e5b0 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  k..*/.int sqlite
1e5c0 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 42  3BtreeRollback(B
1e5d0 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 74 72 69  tree *p, int tri
1e5e0 70 43 6f 64 65 2c 20 69 6e 74 20 77 72 69 74 65  pCode, int write
1e5f0 4f 6e 6c 79 29 7b 0a 20 20 69 6e 74 20 72 63 3b  Only){.  int rc;
1e600 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
1e610 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 4d 65 6d   = p->pBt;.  Mem
1e620 50 61 67 65 20 2a 70 50 61 67 65 31 3b 0a 0a 20  Page *pPage1;.. 
1e630 20 61 73 73 65 72 74 28 20 77 72 69 74 65 4f 6e   assert( writeOn
1e640 6c 79 3d 3d 31 20 7c 7c 20 77 72 69 74 65 4f 6e  ly==1 || writeOn
1e650 6c 79 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ly==0 );.  asser
1e660 74 28 20 74 72 69 70 43 6f 64 65 3d 3d 53 51 4c  t( tripCode==SQL
1e670 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41  ITE_ABORT_ROLLBA
1e680 43 4b 20 7c 7c 20 74 72 69 70 43 6f 64 65 3d 3d  CK || tripCode==
1e690 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 73  SQLITE_OK );.  s
1e6a0 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
1e6b0 28 70 29 3b 0a 20 20 69 66 28 20 74 72 69 70 43  (p);.  if( tripC
1e6c0 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  ode==SQLITE_OK )
1e6d0 7b 0a 20 20 20 20 72 63 20 3d 20 74 72 69 70 43  {.    rc = tripC
1e6e0 6f 64 65 20 3d 20 73 61 76 65 41 6c 6c 43 75 72  ode = saveAllCur
1e6f0 73 6f 72 73 28 70 42 74 2c 20 30 2c 20 30 29 3b  sors(pBt, 0, 0);
1e700 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 77 72  .    if( rc ) wr
1e710 69 74 65 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20 7d  iteOnly = 0;.  }
1e720 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 53  else{.    rc = S
1e730 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
1e740 69 66 28 20 74 72 69 70 43 6f 64 65 20 29 7b 0a  if( tripCode ){.
1e750 20 20 20 20 69 6e 74 20 72 63 32 20 3d 20 73 71      int rc2 = sq
1e760 6c 69 74 65 33 42 74 72 65 65 54 72 69 70 41 6c  lite3BtreeTripAl
1e770 6c 43 75 72 73 6f 72 73 28 70 2c 20 74 72 69 70  lCursors(p, trip
1e780 43 6f 64 65 2c 20 77 72 69 74 65 4f 6e 6c 79 29  Code, writeOnly)
1e790 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63  ;.    assert( rc
1e7a0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28  ==SQLITE_OK || (
1e7b0 77 72 69 74 65 4f 6e 6c 79 3d 3d 30 20 26 26 20  writeOnly==0 && 
1e7c0 72 63 32 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 20  rc2==SQLITE_OK) 
1e7d0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 32 21 3d  );.    if( rc2!=
1e7e0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d  SQLITE_OK ) rc =
1e7f0 20 72 63 32 3b 0a 20 20 7d 0a 20 20 62 74 72 65   rc2;.  }.  btre
1e800 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 0a  eIntegrity(p);..
1e810 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73    if( p->inTrans
1e820 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b  ==TRANS_WRITE ){
1e830 0a 20 20 20 20 69 6e 74 20 72 63 32 3b 0a 0a 20  .    int rc2;.. 
1e840 20 20 20 61 73 73 65 72 74 28 20 54 52 41 4e 53     assert( TRANS
1e850 5f 57 52 49 54 45 3d 3d 70 42 74 2d 3e 69 6e 54  _WRITE==pBt->inT
1e860 72 61 6e 73 61 63 74 69 6f 6e 20 29 3b 0a 20 20  ransaction );.  
1e870 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33 50    rc2 = sqlite3P
1e880 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70 42 74  agerRollback(pBt
1e890 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69  ->pPager);.    i
1e8a0 66 28 20 72 63 32 21 3d 53 51 4c 49 54 45 5f 4f  f( rc2!=SQLITE_O
1e8b0 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
1e8c0 72 63 32 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  rc2;.    }..    
1e8d0 2f 2a 20 54 68 65 20 72 6f 6c 6c 62 61 63 6b 20  /* The rollback 
1e8e0 6d 61 79 20 68 61 76 65 20 64 65 73 74 72 6f 79  may have destroy
1e8f0 65 64 20 74 68 65 20 70 50 61 67 65 31 2d 3e 61  ed the pPage1->a
1e900 44 61 74 61 20 76 61 6c 75 65 2e 20 20 53 6f 0a  Data value.  So.
1e910 20 20 20 20 2a 2a 20 63 61 6c 6c 20 62 74 72 65      ** call btre
1e920 65 47 65 74 50 61 67 65 28 29 20 6f 6e 20 70 61  eGetPage() on pa
1e930 67 65 20 31 20 61 67 61 69 6e 20 74 6f 20 6d 61  ge 1 again to ma
1e940 6b 65 0a 20 20 20 20 2a 2a 20 73 75 72 65 20 70  ke.    ** sure p
1e950 50 61 67 65 31 2d 3e 61 44 61 74 61 20 69 73 20  Page1->aData is 
1e960 73 65 74 20 63 6f 72 72 65 63 74 6c 79 2e 20 2a  set correctly. *
1e970 2f 0a 20 20 20 20 69 66 28 20 62 74 72 65 65 47  /.    if( btreeG
1e980 65 74 50 61 67 65 28 70 42 74 2c 20 31 2c 20 26  etPage(pBt, 1, &
1e990 70 50 61 67 65 31 2c 20 30 29 3d 3d 53 51 4c 49  pPage1, 0)==SQLI
1e9a0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69  TE_OK ){.      i
1e9b0 6e 74 20 6e 50 61 67 65 20 3d 20 67 65 74 34 62  nt nPage = get4b
1e9c0 79 74 65 28 32 38 2b 28 75 38 2a 29 70 50 61 67  yte(28+(u8*)pPag
1e9d0 65 31 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20  e1->aData);.    
1e9e0 20 20 74 65 73 74 63 61 73 65 28 20 6e 50 61 67    testcase( nPag
1e9f0 65 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66  e==0 );.      if
1ea00 28 20 6e 50 61 67 65 3d 3d 30 20 29 20 73 71 6c  ( nPage==0 ) sql
1ea10 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75  ite3PagerPagecou
1ea20 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  nt(pBt->pPager, 
1ea30 26 6e 50 61 67 65 29 3b 0a 20 20 20 20 20 20 74  &nPage);.      t
1ea40 65 73 74 63 61 73 65 28 20 70 42 74 2d 3e 6e 50  estcase( pBt->nP
1ea50 61 67 65 21 3d 6e 50 61 67 65 20 29 3b 0a 20 20  age!=nPage );.  
1ea60 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d      pBt->nPage =
1ea70 20 6e 50 61 67 65 3b 0a 20 20 20 20 20 20 72 65   nPage;.      re
1ea80 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65 31  leasePage(pPage1
1ea90 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  );.    }.    ass
1eaa0 65 72 74 28 20 63 6f 75 6e 74 56 61 6c 69 64 43  ert( countValidC
1eab0 75 72 73 6f 72 73 28 70 42 74 2c 20 31 29 3d 3d  ursors(pBt, 1)==
1eac0 30 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e  0 );.    pBt->in
1ead0 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52  Transaction = TR
1eae0 41 4e 53 5f 52 45 41 44 3b 0a 20 20 20 20 62 74  ANS_READ;.    bt
1eaf0 72 65 65 43 6c 65 61 72 48 61 73 43 6f 6e 74 65  reeClearHasConte
1eb00 6e 74 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 20 20  nt(pBt);.  }..  
1eb10 62 74 72 65 65 45 6e 64 54 72 61 6e 73 61 63 74  btreeEndTransact
1eb20 69 6f 6e 28 70 29 3b 0a 20 20 73 71 6c 69 74 65  ion(p);.  sqlite
1eb30 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
1eb40 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1eb50 2f 2a 0a 2a 2a 20 53 74 61 72 74 20 61 20 73 74  /*.** Start a st
1eb60 61 74 65 6d 65 6e 74 20 73 75 62 74 72 61 6e 73  atement subtrans
1eb70 61 63 74 69 6f 6e 2e 20 54 68 65 20 73 75 62 74  action. The subt
1eb80 72 61 6e 73 61 63 74 69 6f 6e 20 63 61 6e 20 62  ransaction can b
1eb90 65 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b  e rolled.** back
1eba0 20 69 6e 64 65 70 65 6e 64 65 6e 74 6c 79 20 6f   independently o
1ebb0 66 20 74 68 65 20 6d 61 69 6e 20 74 72 61 6e 73  f the main trans
1ebc0 61 63 74 69 6f 6e 2e 20 59 6f 75 20 6d 75 73 74  action. You must
1ebd0 20 73 74 61 72 74 20 61 20 74 72 61 6e 73 61 63   start a transac
1ebe0 74 69 6f 6e 20 0a 2a 2a 20 62 65 66 6f 72 65 20  tion .** before 
1ebf0 73 74 61 72 74 69 6e 67 20 61 20 73 75 62 74 72  starting a subtr
1ec00 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 73  ansaction. The s
1ec10 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  ubtransaction is
1ec20 20 65 6e 64 65 64 20 61 75 74 6f 6d 61 74 69 63   ended automatic
1ec30 61 6c 6c 79 20 0a 2a 2a 20 69 66 20 74 68 65 20  ally .** if the 
1ec40 6d 61 69 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e  main transaction
1ec50 20 63 6f 6d 6d 69 74 73 20 6f 72 20 72 6f 6c 6c   commits or roll
1ec60 73 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 74  s back..**.** St
1ec70 61 74 65 6d 65 6e 74 20 73 75 62 74 72 61 6e 73  atement subtrans
1ec80 61 63 74 69 6f 6e 73 20 61 72 65 20 75 73 65 64  actions are used
1ec90 20 61 72 6f 75 6e 64 20 69 6e 64 69 76 69 64 75   around individu
1eca0 61 6c 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  al SQL statement
1ecb0 73 0a 2a 2a 20 74 68 61 74 20 61 72 65 20 63 6f  s.** that are co
1ecc0 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e 20 61  ntained within a
1ecd0 20 42 45 47 49 4e 2e 2e 2e 43 4f 4d 4d 49 54 20   BEGIN...COMMIT 
1ece0 62 6c 6f 63 6b 2e 20 20 49 66 20 61 20 63 6f 6e  block.  If a con
1ecf0 73 74 72 61 69 6e 74 0a 2a 2a 20 65 72 72 6f 72  straint.** error
1ed00 20 6f 63 63 75 72 73 20 77 69 74 68 69 6e 20 74   occurs within t
1ed10 68 65 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68  he statement, th
1ed20 65 20 65 66 66 65 63 74 20 6f 66 20 74 68 61 74  e effect of that
1ed30 20 6f 6e 65 20 73 74 61 74 65 6d 65 6e 74 0a 2a   one statement.*
1ed40 2a 20 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64 20  * can be rolled 
1ed50 62 61 63 6b 20 77 69 74 68 6f 75 74 20 68 61 76  back without hav
1ed60 69 6e 67 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20  ing to rollback 
1ed70 74 68 65 20 65 6e 74 69 72 65 20 74 72 61 6e 73  the entire trans
1ed80 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20  action..**.** A 
1ed90 73 74 61 74 65 6d 65 6e 74 20 73 75 62 2d 74 72  statement sub-tr
1eda0 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 69 6d 70  ansaction is imp
1edb0 6c 65 6d 65 6e 74 65 64 20 61 73 20 61 6e 20 61  lemented as an a
1edc0 6e 6f 6e 79 6d 6f 75 73 20 73 61 76 65 70 6f 69  nonymous savepoi
1edd0 6e 74 2e 20 54 68 65 0a 2a 2a 20 76 61 6c 75 65  nt. The.** value
1ede0 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73   passed as the s
1edf0 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65 72 20  econd parameter 
1ee00 69 73 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d  is the total num
1ee10 62 65 72 20 6f 66 20 73 61 76 65 70 6f 69 6e 74  ber of savepoint
1ee20 73 2c 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20  s,.** including 
1ee30 74 68 65 20 6e 65 77 20 61 6e 6f 6e 79 6d 6f 75  the new anonymou
1ee40 73 20 73 61 76 65 70 6f 69 6e 74 2c 20 6f 70 65  s savepoint, ope
1ee50 6e 20 6f 6e 20 74 68 65 20 42 2d 54 72 65 65 2e  n on the B-Tree.
1ee60 20 69 2e 65 2e 20 69 66 20 74 68 65 72 65 0a 2a   i.e. if there.*
1ee70 2a 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20  * are no active 
1ee80 73 61 76 65 70 6f 69 6e 74 73 20 61 6e 64 20 6e  savepoints and n
1ee90 6f 20 6f 74 68 65 72 20 73 74 61 74 65 6d 65 6e  o other statemen
1eea0 74 2d 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 6f  t-transactions o
1eeb0 70 65 6e 2c 0a 2a 2a 20 69 53 74 61 74 65 6d 65  pen,.** iStateme
1eec0 6e 74 20 69 73 20 31 2e 20 54 68 69 73 20 61 6e  nt is 1. This an
1eed0 6f 6e 79 6d 6f 75 73 20 73 61 76 65 70 6f 69 6e  onymous savepoin
1eee0 74 20 63 61 6e 20 62 65 20 72 65 6c 65 61 73 65  t can be release
1eef0 64 20 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63 6b  d or rolled back
1ef00 0a 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 73 71  .** using the sq
1ef10 6c 69 74 65 33 42 74 72 65 65 53 61 76 65 70 6f  lite3BtreeSavepo
1ef20 69 6e 74 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a  int() function..
1ef30 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
1ef40 72 65 65 42 65 67 69 6e 53 74 6d 74 28 42 74 72  reeBeginStmt(Btr
1ef50 65 65 20 2a 70 2c 20 69 6e 74 20 69 53 74 61 74  ee *p, int iStat
1ef60 65 6d 65 6e 74 29 7b 0a 20 20 69 6e 74 20 72 63  ement){.  int rc
1ef70 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
1ef80 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 73 71  t = p->pBt;.  sq
1ef90 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
1efa0 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d  p);.  assert( p-
1efb0 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
1efc0 57 52 49 54 45 20 29 3b 0a 20 20 61 73 73 65 72  WRITE );.  asser
1efd0 74 28 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67  t( (pBt->btsFlag
1efe0 73 20 26 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c  s & BTS_READ_ONL
1eff0 59 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  Y)==0 );.  asser
1f000 74 28 20 69 53 74 61 74 65 6d 65 6e 74 3e 30 20  t( iStatement>0 
1f010 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 53 74  );.  assert( iSt
1f020 61 74 65 6d 65 6e 74 3e 70 2d 3e 64 62 2d 3e 6e  atement>p->db->n
1f030 53 61 76 65 70 6f 69 6e 74 20 29 3b 0a 20 20 61  Savepoint );.  a
1f040 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72  ssert( pBt->inTr
1f050 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53  ansaction==TRANS
1f060 5f 57 52 49 54 45 20 29 3b 0a 20 20 2f 2a 20 41  _WRITE );.  /* A
1f070 74 20 74 68 65 20 70 61 67 65 72 20 6c 65 76 65  t the pager leve
1f080 6c 2c 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74  l, a statement t
1f090 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 20  ransaction is a 
1f0a0 73 61 76 65 70 6f 69 6e 74 20 77 69 74 68 0a 20  savepoint with. 
1f0b0 20 2a 2a 20 61 6e 20 69 6e 64 65 78 20 67 72 65   ** an index gre
1f0c0 61 74 65 72 20 74 68 61 6e 20 61 6c 6c 20 73 61  ater than all sa
1f0d0 76 65 70 6f 69 6e 74 73 20 63 72 65 61 74 65 64  vepoints created
1f0e0 20 65 78 70 6c 69 63 69 74 6c 79 20 75 73 69 6e   explicitly usin
1f0f0 67 0a 20 20 2a 2a 20 53 51 4c 20 73 74 61 74 65  g.  ** SQL state
1f100 6d 65 6e 74 73 2e 20 49 74 20 69 73 20 69 6c 6c  ments. It is ill
1f110 65 67 61 6c 20 74 6f 20 6f 70 65 6e 2c 20 72 65  egal to open, re
1f120 6c 65 61 73 65 20 6f 72 20 72 6f 6c 6c 62 61 63  lease or rollbac
1f130 6b 20 61 6e 79 0a 20 20 2a 2a 20 73 75 63 68 20  k any.  ** such 
1f140 73 61 76 65 70 6f 69 6e 74 73 20 77 68 69 6c 65  savepoints while
1f150 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74   the statement t
1f160 72 61 6e 73 61 63 74 69 6f 6e 20 73 61 76 65 70  ransaction savep
1f170 6f 69 6e 74 20 69 73 20 61 63 74 69 76 65 2e 0a  oint is active..
1f180 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69    */.  rc = sqli
1f190 74 65 33 50 61 67 65 72 4f 70 65 6e 53 61 76 65  te3PagerOpenSave
1f1a0 70 6f 69 6e 74 28 70 42 74 2d 3e 70 50 61 67 65  point(pBt->pPage
1f1b0 72 2c 20 69 53 74 61 74 65 6d 65 6e 74 29 3b 0a  r, iStatement);.
1f1c0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
1f1d0 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
1f1e0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
1f1f0 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
1f200 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69  t to this functi
1f210 6f 6e 2c 20 6f 70 2c 20 69 73 20 61 6c 77 61 79  on, op, is alway
1f220 73 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  s SAVEPOINT_ROLL
1f230 42 41 43 4b 0a 2a 2a 20 6f 72 20 53 41 56 45 50  BACK.** or SAVEP
1f240 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2e 20 54 68  OINT_RELEASE. Th
1f250 69 73 20 66 75 6e 63 74 69 6f 6e 20 65 69 74 68  is function eith
1f260 65 72 20 72 65 6c 65 61 73 65 73 20 6f 72 20 72  er releases or r
1f270 6f 6c 6c 73 20 62 61 63 6b 20 74 68 65 0a 2a 2a  olls back the.**
1f280 20 73 61 76 65 70 6f 69 6e 74 20 69 64 65 6e 74   savepoint ident
1f290 69 66 69 65 64 20 62 79 20 70 61 72 61 6d 65 74  ified by paramet
1f2a0 65 72 20 69 53 61 76 65 70 6f 69 6e 74 2c 20 64  er iSavepoint, d
1f2b0 65 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20  epending on the 
1f2c0 76 61 6c 75 65 20 0a 2a 2a 20 6f 66 20 6f 70 2e  value .** of op.
1f2d0 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c  .**.** Normally,
1f2e0 20 69 53 61 76 65 70 6f 69 6e 74 20 69 73 20 67   iSavepoint is g
1f2f0 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65  reater than or e
1f300 71 75 61 6c 20 74 6f 20 7a 65 72 6f 2e 20 48 6f  qual to zero. Ho
1f310 77 65 76 65 72 2c 20 69 66 20 6f 70 20 69 73 0a  wever, if op is.
1f320 2a 2a 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  ** SAVEPOINT_ROL
1f330 4c 42 41 43 4b 2c 20 74 68 65 6e 20 69 53 61 76  LBACK, then iSav
1f340 65 70 6f 69 6e 74 20 6d 61 79 20 61 6c 73 6f 20  epoint may also 
1f350 62 65 20 2d 31 2e 20 49 6e 20 74 68 69 73 20 63  be -1. In this c
1f360 61 73 65 20 74 68 65 20 0a 2a 2a 20 63 6f 6e 74  ase the .** cont
1f370 65 6e 74 73 20 6f 66 20 74 68 65 20 65 6e 74 69  ents of the enti
1f380 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61  re transaction a
1f390 72 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20  re rolled back. 
1f3a0 54 68 69 73 20 69 73 20 64 69 66 66 65 72 65 6e  This is differen
1f3b0 74 0a 2a 2a 20 66 72 6f 6d 20 61 20 6e 6f 72 6d  t.** from a norm
1f3c0 61 6c 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 72  al transaction r
1f3d0 6f 6c 6c 62 61 63 6b 2c 20 61 73 20 6e 6f 20 6c  ollback, as no l
1f3e0 6f 63 6b 73 20 61 72 65 20 72 65 6c 65 61 73 65  ocks are release
1f3f0 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20 74 72 61  d and the.** tra
1f400 6e 73 61 63 74 69 6f 6e 20 72 65 6d 61 69 6e 73  nsaction remains
1f410 20 6f 70 65 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71   open..*/.int sq
1f420 6c 69 74 65 33 42 74 72 65 65 53 61 76 65 70 6f  lite3BtreeSavepo
1f430 69 6e 74 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  int(Btree *p, in
1f440 74 20 6f 70 2c 20 69 6e 74 20 69 53 61 76 65 70  t op, int iSavep
1f450 6f 69 6e 74 29 7b 0a 20 20 69 6e 74 20 72 63 20  oint){.  int rc 
1f460 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
1f470 66 28 20 70 20 26 26 20 70 2d 3e 69 6e 54 72 61  f( p && p->inTra
1f480 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  ns==TRANS_WRITE 
1f490 29 7b 0a 20 20 20 20 42 74 53 68 61 72 65 64 20  ){.    BtShared 
1f4a0 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
1f4b0 20 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 53     assert( op==S
1f4c0 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45  AVEPOINT_RELEASE
1f4d0 20 7c 7c 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e   || op==SAVEPOIN
1f4e0 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 3b 0a 20 20  T_ROLLBACK );.  
1f4f0 20 20 61 73 73 65 72 74 28 20 69 53 61 76 65 70    assert( iSavep
1f500 6f 69 6e 74 3e 3d 30 20 7c 7c 20 28 69 53 61 76  oint>=0 || (iSav
1f510 65 70 6f 69 6e 74 3d 3d 2d 31 20 26 26 20 6f 70  epoint==-1 && op
1f520 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  ==SAVEPOINT_ROLL
1f530 42 41 43 4b 29 20 29 3b 0a 20 20 20 20 73 71 6c  BACK) );.    sql
1f540 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
1f550 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
1f560 74 65 33 50 61 67 65 72 53 61 76 65 70 6f 69 6e  te3PagerSavepoin
1f570 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6f  t(pBt->pPager, o
1f580 70 2c 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a  p, iSavepoint);.
1f590 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1f5a0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69  TE_OK ){.      i
1f5b0 66 28 20 69 53 61 76 65 70 6f 69 6e 74 3c 30 20  f( iSavepoint<0 
1f5c0 26 26 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67  && (pBt->btsFlag
1f5d0 73 20 26 20 42 54 53 5f 49 4e 49 54 49 41 4c 4c  s & BTS_INITIALL
1f5e0 59 5f 45 4d 50 54 59 29 21 3d 30 20 29 7b 0a 20  Y_EMPTY)!=0 ){. 
1f5f0 20 20 20 20 20 20 20 70 42 74 2d 3e 6e 50 61 67         pBt->nPag
1f600 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  e = 0;.      }. 
1f610 20 20 20 20 20 72 63 20 3d 20 6e 65 77 44 61 74       rc = newDat
1f620 61 62 61 73 65 28 70 42 74 29 3b 0a 20 20 20 20  abase(pBt);.    
1f630 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 67    pBt->nPage = g
1f640 65 74 34 62 79 74 65 28 32 38 20 2b 20 70 42 74  et4byte(28 + pBt
1f650 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 29  ->pPage1->aData)
1f660 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ;..      /* The 
1f670 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 77 61  database size wa
1f680 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74  s written into t
1f690 68 65 20 6f 66 66 73 65 74 20 32 38 20 6f 66 20  he offset 28 of 
1f6a0 74 68 65 20 68 65 61 64 65 72 0a 20 20 20 20 20  the header.     
1f6b0 20 2a 2a 20 77 68 65 6e 20 74 68 65 20 74 72 61   ** when the tra
1f6c0 6e 73 61 63 74 69 6f 6e 20 73 74 61 72 74 65 64  nsaction started
1f6d0 2c 20 73 6f 20 77 65 20 6b 6e 6f 77 20 74 68 61  , so we know tha
1f6e0 74 20 74 68 65 20 76 61 6c 75 65 20 61 74 20 6f  t the value at o
1f6f0 66 66 73 65 74 0a 20 20 20 20 20 20 2a 2a 20 32  ffset.      ** 2
1f700 38 20 69 73 20 6e 6f 6e 7a 65 72 6f 2e 20 2a 2f  8 is nonzero. */
1f710 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1f720 42 74 2d 3e 6e 50 61 67 65 3e 30 20 29 3b 0a 20  Bt->nPage>0 );. 
1f730 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
1f740 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
1f750 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
1f760 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20  }../*.** Create 
1f770 61 20 6e 65 77 20 63 75 72 73 6f 72 20 66 6f 72  a new cursor for
1f780 20 74 68 65 20 42 54 72 65 65 20 77 68 6f 73 65   the BTree whose
1f790 20 72 6f 6f 74 20 69 73 20 6f 6e 20 74 68 65 20   root is on the 
1f7a0 70 61 67 65 0a 2a 2a 20 69 54 61 62 6c 65 2e 20  page.** iTable. 
1f7b0 49 66 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 63  If a read-only c
1f7c0 75 72 73 6f 72 20 69 73 20 72 65 71 75 65 73 74  ursor is request
1f7d0 65 64 2c 20 69 74 20 69 73 20 61 73 73 75 6d 65  ed, it is assume
1f7e0 64 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 63 61  d that.** the ca
1f7f0 6c 6c 65 72 20 61 6c 72 65 61 64 79 20 68 61 73  ller already has
1f800 20 61 74 20 6c 65 61 73 74 20 61 20 72 65 61 64   at least a read
1f810 2d 6f 6e 6c 79 20 74 72 61 6e 73 61 63 74 69 6f  -only transactio
1f820 6e 20 6f 70 65 6e 0a 2a 2a 20 6f 6e 20 74 68 65  n open.** on the
1f830 20 64 61 74 61 62 61 73 65 20 61 6c 72 65 61 64   database alread
1f840 79 2e 20 49 66 20 61 20 77 72 69 74 65 2d 63 75  y. If a write-cu
1f850 72 73 6f 72 20 69 73 20 72 65 71 75 65 73 74 65  rsor is requeste
1f860 64 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 63  d, then.** the c
1f870 61 6c 6c 65 72 20 69 73 20 61 73 73 75 6d 65 64  aller is assumed
1f880 20 74 6f 20 68 61 76 65 20 61 6e 20 6f 70 65 6e   to have an open
1f890 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
1f8a0 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77 72 46  on..**.** If wrF
1f8b0 6c 61 67 3d 3d 30 2c 20 74 68 65 6e 20 74 68 65  lag==0, then the
1f8c0 20 63 75 72 73 6f 72 20 63 61 6e 20 6f 6e 6c 79   cursor can only
1f8d0 20 62 65 20 75 73 65 64 20 66 6f 72 20 72 65 61   be used for rea
1f8e0 64 69 6e 67 2e 0a 2a 2a 20 49 66 20 77 72 46 6c  ding..** If wrFl
1f8f0 61 67 3d 3d 31 2c 20 74 68 65 6e 20 74 68 65 20  ag==1, then the 
1f900 63 75 72 73 6f 72 20 63 61 6e 20 62 65 20 75 73  cursor can be us
1f910 65 64 20 66 6f 72 20 72 65 61 64 69 6e 67 20 6f  ed for reading o
1f920 72 20 66 6f 72 0a 2a 2a 20 77 72 69 74 69 6e 67  r for.** writing
1f930 20 69 66 20 6f 74 68 65 72 20 63 6f 6e 64 69 74   if other condit
1f940 69 6f 6e 73 20 66 6f 72 20 77 72 69 74 69 6e 67  ions for writing
1f950 20 61 72 65 20 61 6c 73 6f 20 6d 65 74 2e 20 20   are also met.  
1f960 54 68 65 73 65 0a 2a 2a 20 61 72 65 20 74 68 65  These.** are the
1f970 20 63 6f 6e 64 69 74 69 6f 6e 73 20 74 68 61 74   conditions that
1f980 20 6d 75 73 74 20 62 65 20 6d 65 74 20 69 6e 20   must be met in 
1f990 6f 72 64 65 72 20 66 6f 72 20 77 72 69 74 69 6e  order for writin
1f9a0 67 20 74 6f 0a 2a 2a 20 62 65 20 61 6c 6c 6f 77  g to.** be allow
1f9b0 65 64 3a 0a 2a 2a 0a 2a 2a 20 31 3a 20 20 54 68  ed:.**.** 1:  Th
1f9c0 65 20 63 75 72 73 6f 72 20 6d 75 73 74 20 68 61  e cursor must ha
1f9d0 76 65 20 62 65 65 6e 20 6f 70 65 6e 65 64 20 77  ve been opened w
1f9e0 69 74 68 20 77 72 46 6c 61 67 3d 3d 31 0a 2a 2a  ith wrFlag==1.**
1f9f0 0a 2a 2a 20 32 3a 20 20 4f 74 68 65 72 20 64 61  .** 2:  Other da
1fa00 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
1fa10 6e 73 20 74 68 61 74 20 73 68 61 72 65 20 74 68  ns that share th
1fa20 65 20 73 61 6d 65 20 70 61 67 65 72 20 63 61 63  e same pager cac
1fa30 68 65 0a 2a 2a 20 20 20 20 20 62 75 74 20 77 68  he.**     but wh
1fa40 69 63 68 20 61 72 65 20 6e 6f 74 20 69 6e 20 74  ich are not in t
1fa50 68 65 20 52 45 41 44 5f 55 4e 43 4f 4d 4d 49 54  he READ_UNCOMMIT
1fa60 54 45 44 20 73 74 61 74 65 20 6d 61 79 20 6e 6f  TED state may no
1fa70 74 20 68 61 76 65 0a 2a 2a 20 20 20 20 20 63 75  t have.**     cu
1fa80 72 73 6f 72 73 20 6f 70 65 6e 20 77 69 74 68 20  rsors open with 
1fa90 77 72 46 6c 61 67 3d 3d 30 20 6f 6e 20 74 68 65  wrFlag==0 on the
1faa0 20 73 61 6d 65 20 74 61 62 6c 65 2e 20 20 4f 74   same table.  Ot
1fab0 68 65 72 77 69 73 65 0a 2a 2a 20 20 20 20 20 74  herwise.**     t
1fac0 68 65 20 63 68 61 6e 67 65 73 20 6d 61 64 65 20  he changes made 
1fad0 62 79 20 74 68 69 73 20 77 72 69 74 65 20 63 75  by this write cu
1fae0 72 73 6f 72 20 77 6f 75 6c 64 20 62 65 20 76 69  rsor would be vi
1faf0 73 69 62 6c 65 20 74 6f 0a 2a 2a 20 20 20 20 20  sible to.**     
1fb00 74 68 65 20 72 65 61 64 20 63 75 72 73 6f 72 73  the read cursors
1fb10 20 69 6e 20 74 68 65 20 6f 74 68 65 72 20 64 61   in the other da
1fb20 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
1fb30 6e 2e 0a 2a 2a 0a 2a 2a 20 33 3a 20 20 54 68 65  n..**.** 3:  The
1fb40 20 64 61 74 61 62 61 73 65 20 6d 75 73 74 20 62   database must b
1fb50 65 20 77 72 69 74 61 62 6c 65 20 28 6e 6f 74 20  e writable (not 
1fb60 6f 6e 20 72 65 61 64 2d 6f 6e 6c 79 20 6d 65 64  on read-only med
1fb70 69 61 29 0a 2a 2a 0a 2a 2a 20 34 3a 20 20 54 68  ia).**.** 4:  Th
1fb80 65 72 65 20 6d 75 73 74 20 62 65 20 61 6e 20 61  ere must be an a
1fb90 63 74 69 76 65 20 74 72 61 6e 73 61 63 74 69 6f  ctive transactio
1fba0 6e 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 20 63 68 65 63  n..**.** No chec
1fbb0 6b 69 6e 67 20 69 73 20 64 6f 6e 65 20 74 6f 20  king is done to 
1fbc0 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 70  make sure that p
1fbd0 61 67 65 20 69 54 61 62 6c 65 20 72 65 61 6c 6c  age iTable reall
1fbe0 79 20 69 73 20 74 68 65 0a 2a 2a 20 72 6f 6f 74  y is the.** root
1fbf0 20 70 61 67 65 20 6f 66 20 61 20 62 2d 74 72 65   page of a b-tre
1fc00 65 2e 20 20 49 66 20 69 74 20 69 73 20 6e 6f 74  e.  If it is not
1fc10 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f  , then the curso
1fc20 72 20 61 63 71 75 69 72 65 64 0a 2a 2a 20 77 69  r acquired.** wi
1fc30 6c 6c 20 6e 6f 74 20 77 6f 72 6b 20 63 6f 72 72  ll not work corr
1fc40 65 63 74 6c 79 2e 0a 2a 2a 0a 2a 2a 20 49 74 20  ectly..**.** It 
1fc50 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 20  is assumed that 
1fc60 74 68 65 20 73 71 6c 69 74 65 33 42 74 72 65 65  the sqlite3Btree
1fc70 43 75 72 73 6f 72 5a 65 72 6f 28 29 20 68 61 73  CursorZero() has
1fc80 20 62 65 65 6e 20 63 61 6c 6c 65 64 0a 2a 2a 20   been called.** 
1fc90 6f 6e 20 70 43 75 72 20 74 6f 20 69 6e 69 74 69  on pCur to initi
1fca0 61 6c 69 7a 65 20 74 68 65 20 6d 65 6d 6f 72 79  alize the memory
1fcb0 20 73 70 61 63 65 20 70 72 69 6f 72 20 74 6f 20   space prior to 
1fcc0 69 6e 76 6f 6b 69 6e 67 20 74 68 69 73 20 72 6f  invoking this ro
1fcd0 75 74 69 6e 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  utine..*/.static
1fce0 20 69 6e 74 20 62 74 72 65 65 43 75 72 73 6f 72   int btreeCursor
1fcf0 28 0a 20 20 42 74 72 65 65 20 2a 70 2c 20 20 20  (.  Btree *p,   
1fd00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fd10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1fd20 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74  e btree */.  int
1fd30 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20   iTable,        
1fd40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fd50 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65      /* Root page
1fd60 20 6f 66 20 74 61 62 6c 65 20 74 6f 20 6f 70 65   of table to ope
1fd70 6e 20 2a 2f 0a 20 20 69 6e 74 20 77 72 46 6c 61  n */.  int wrFla
1fd80 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g,              
1fd90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1fda0 20 31 20 74 6f 20 77 72 69 74 65 2e 20 30 20 72   1 to write. 0 r
1fdb0 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74  ead-only */.  st
1fdc0 72 75 63 74 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  ruct KeyInfo *pK
1fdd0 65 79 49 6e 66 6f 2c 20 20 20 20 20 20 20 20 20  eyInfo,         
1fde0 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72       /* First ar
1fdf0 67 20 74 6f 20 63 6f 6d 70 61 72 69 73 6f 6e 20  g to comparison 
1fe00 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 42 74  function */.  Bt
1fe10 43 75 72 73 6f 72 20 2a 70 43 75 72 20 20 20 20  Cursor *pCur    
1fe20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fe30 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20 66 6f       /* Space fo
1fe40 72 20 6e 65 77 20 63 75 72 73 6f 72 20 2a 2f 0a  r new cursor */.
1fe50 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
1fe60 42 74 20 3d 20 70 2d 3e 70 42 74 3b 20 20 20 20  Bt = p->pBt;    
1fe70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
1fe80 68 61 72 65 64 20 62 2d 74 72 65 65 20 68 61 6e  hared b-tree han
1fe90 64 6c 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  dle */..  assert
1fea0 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f  ( sqlite3BtreeHo
1feb0 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20  ldsMutex(p) );. 
1fec0 20 61 73 73 65 72 74 28 20 77 72 46 6c 61 67 3d   assert( wrFlag=
1fed0 3d 30 20 7c 7c 20 77 72 46 6c 61 67 3d 3d 31 20  =0 || wrFlag==1 
1fee0 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c  );..  /* The fol
1fef0 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 20 73 74  lowing assert st
1ff00 61 74 65 6d 65 6e 74 73 20 76 65 72 69 66 79 20  atements verify 
1ff10 74 68 61 74 20 69 66 20 74 68 69 73 20 69 73 20  that if this is 
1ff20 61 20 73 68 61 72 61 62 6c 65 20 0a 20 20 2a 2a  a sharable .  **
1ff30 20 62 2d 74 72 65 65 20 64 61 74 61 62 61 73 65   b-tree database
1ff40 2c 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  , the connection
1ff50 20 69 73 20 68 6f 6c 64 69 6e 67 20 74 68 65 20   is holding the 
1ff60 72 65 71 75 69 72 65 64 20 74 61 62 6c 65 20 6c  required table l
1ff70 6f 63 6b 73 2c 20 0a 20 20 2a 2a 20 61 6e 64 20  ocks, .  ** and 
1ff80 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 63 6f  that no other co
1ff90 6e 6e 65 63 74 69 6f 6e 20 68 61 73 20 61 6e 79  nnection has any
1ffa0 20 6f 70 65 6e 20 63 75 72 73 6f 72 20 74 68 61   open cursor tha
1ffb0 74 20 63 6f 6e 66 6c 69 63 74 73 20 77 69 74 68  t conflicts with
1ffc0 20 0a 20 20 2a 2a 20 74 68 69 73 20 6c 6f 63 6b   .  ** this lock
1ffd0 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
1ffe0 68 61 73 53 68 61 72 65 64 43 61 63 68 65 54 61  hasSharedCacheTa
1fff0 62 6c 65 4c 6f 63 6b 28 70 2c 20 69 54 61 62 6c  bleLock(p, iTabl
20000 65 2c 20 70 4b 65 79 49 6e 66 6f 21 3d 30 2c 20  e, pKeyInfo!=0, 
20010 77 72 46 6c 61 67 2b 31 29 20 29 3b 0a 20 20 61  wrFlag+1) );.  a
20020 73 73 65 72 74 28 20 77 72 46 6c 61 67 3d 3d 30  ssert( wrFlag==0
20030 20 7c 7c 20 21 68 61 73 52 65 61 64 43 6f 6e 66   || !hasReadConf
20040 6c 69 63 74 73 28 70 2c 20 69 54 61 62 6c 65 29  licts(p, iTable)
20050 20 29 3b 0a 0a 20 20 2f 2a 20 41 73 73 65 72 74   );..  /* Assert
20060 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72   that the caller
20070 20 68 61 73 20 6f 70 65 6e 65 64 20 74 68 65 20   has opened the 
20080 72 65 71 75 69 72 65 64 20 74 72 61 6e 73 61 63  required transac
20090 74 69 6f 6e 2e 20 2a 2f 0a 20 20 61 73 73 65 72  tion. */.  asser
200a0 74 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 54 52  t( p->inTrans>TR
200b0 41 4e 53 5f 4e 4f 4e 45 20 29 3b 0a 20 20 61 73  ANS_NONE );.  as
200c0 73 65 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20  sert( wrFlag==0 
200d0 7c 7c 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  || p->inTrans==T
200e0 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20  RANS_WRITE );.  
200f0 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70 50 61  assert( pBt->pPa
20100 67 65 31 20 26 26 20 70 42 74 2d 3e 70 50 61 67  ge1 && pBt->pPag
20110 65 31 2d 3e 61 44 61 74 61 20 29 3b 0a 0a 20 20  e1->aData );..  
20120 69 66 28 20 4e 45 56 45 52 28 77 72 46 6c 61 67  if( NEVER(wrFlag
20130 20 26 26 20 28 70 42 74 2d 3e 62 74 73 46 6c 61   && (pBt->btsFla
20140 67 73 20 26 20 42 54 53 5f 52 45 41 44 5f 4f 4e  gs & BTS_READ_ON
20150 4c 59 29 21 3d 30 29 20 29 7b 0a 20 20 20 20 72  LY)!=0) ){.    r
20160 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41  eturn SQLITE_REA
20170 44 4f 4e 4c 59 3b 0a 20 20 7d 0a 20 20 69 66 28  DONLY;.  }.  if(
20180 20 77 72 46 6c 61 67 20 29 7b 0a 20 20 20 20 61   wrFlag ){.    a
20190 6c 6c 6f 63 61 74 65 54 65 6d 70 53 70 61 63 65  llocateTempSpace
201a0 28 70 42 74 29 3b 0a 20 20 20 20 69 66 28 20 70  (pBt);.    if( p
201b0 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 3d 3d 30  Bt->pTmpSpace==0
201c0 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
201d0 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 69 66  _NOMEM;.  }.  if
201e0 28 20 69 54 61 62 6c 65 3d 3d 31 20 26 26 20 62  ( iTable==1 && b
201f0 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42  treePagecount(pB
20200 74 29 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73  t)==0 ){.    ass
20210 65 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 29  ert( wrFlag==0 )
20220 3b 0a 20 20 20 20 69 54 61 62 6c 65 20 3d 20 30  ;.    iTable = 0
20230 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20  ;.  }..  /* Now 
20240 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 65 72  that no other er
20250 72 6f 72 73 20 63 61 6e 20 6f 63 63 75 72 2c 20  rors can occur, 
20260 66 69 6e 69 73 68 20 66 69 6c 6c 69 6e 67 20 69  finish filling i
20270 6e 20 74 68 65 20 42 74 43 75 72 73 6f 72 0a 20  n the BtCursor. 
20280 20 2a 2a 20 76 61 72 69 61 62 6c 65 73 20 61 6e   ** variables an
20290 64 20 6c 69 6e 6b 20 74 68 65 20 63 75 72 73 6f  d link the curso
202a0 72 20 69 6e 74 6f 20 74 68 65 20 42 74 53 68 61  r into the BtSha
202b0 72 65 64 20 6c 69 73 74 2e 20 20 2a 2f 0a 20 20  red list.  */.  
202c0 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20 3d  pCur->pgnoRoot =
202d0 20 28 50 67 6e 6f 29 69 54 61 62 6c 65 3b 0a 20   (Pgno)iTable;. 
202e0 20 70 43 75 72 2d 3e 69 50 61 67 65 20 3d 20 2d   pCur->iPage = -
202f0 31 3b 0a 20 20 70 43 75 72 2d 3e 70 4b 65 79 49  1;.  pCur->pKeyI
20300 6e 66 6f 20 3d 20 70 4b 65 79 49 6e 66 6f 3b 0a  nfo = pKeyInfo;.
20310 20 20 70 43 75 72 2d 3e 70 42 74 72 65 65 20 3d    pCur->pBtree =
20320 20 70 3b 0a 20 20 70 43 75 72 2d 3e 70 42 74 20   p;.  pCur->pBt 
20330 3d 20 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28  = pBt;.  assert(
20340 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20 77 72   wrFlag==0 || wr
20350 46 6c 61 67 3d 3d 42 54 43 46 5f 57 72 69 74 65  Flag==BTCF_Write
20360 46 6c 61 67 20 29 3b 0a 20 20 70 43 75 72 2d 3e  Flag );.  pCur->
20370 63 75 72 46 6c 61 67 73 20 3d 20 77 72 46 6c 61  curFlags = wrFla
20380 67 3b 0a 20 20 70 43 75 72 2d 3e 70 4e 65 78 74  g;.  pCur->pNext
20390 20 3d 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b   = pBt->pCursor;
203a0 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 70 4e 65  .  if( pCur->pNe
203b0 78 74 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e  xt ){.    pCur->
203c0 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70  pNext->pPrev = p
203d0 43 75 72 3b 0a 20 20 7d 0a 20 20 70 42 74 2d 3e  Cur;.  }.  pBt->
203e0 70 43 75 72 73 6f 72 20 3d 20 70 43 75 72 3b 0a  pCursor = pCur;.
203f0 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
20400 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b   CURSOR_INVALID;
20410 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
20420 5f 4f 4b 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74  _OK;.}.int sqlit
20430 65 33 42 74 72 65 65 43 75 72 73 6f 72 28 0a 20  e3BtreeCursor(. 
20440 20 42 74 72 65 65 20 2a 70 2c 20 20 20 20 20 20   Btree *p,      
20450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20460 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20470 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 69  The btree */.  i
20480 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20  nt iTable,      
20490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
204a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f             /* Ro
204b0 6f 74 20 70 61 67 65 20 6f 66 20 74 61 62 6c 65  ot page of table
204c0 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e   to open */.  in
204d0 74 20 77 72 46 6c 61 67 2c 20 20 20 20 20 20 20  t wrFlag,       
204e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
204f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20 74            /* 1 t
20500 6f 20 77 72 69 74 65 2e 20 30 20 72 65 61 64 2d  o write. 0 read-
20510 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74 72 75 63 74  only */.  struct
20520 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
20530 66 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  fo,             
20540 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61        /* First a
20550 72 67 20 74 6f 20 78 43 6f 6d 70 61 72 65 28 29  rg to xCompare()
20560 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72 20 2a   */.  BtCursor *
20570 70 43 75 72 20 20 20 20 20 20 20 20 20 20 20 20  pCur            
20580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20590 20 20 2f 2a 20 57 72 69 74 65 20 6e 65 77 20 63    /* Write new c
205a0 75 72 73 6f 72 20 68 65 72 65 20 2a 2f 0a 29 7b  ursor here */.){
205b0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c  .  int rc;.  sql
205c0 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
205d0 29 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65 43  );.  rc = btreeC
205e0 75 72 73 6f 72 28 70 2c 20 69 54 61 62 6c 65 2c  ursor(p, iTable,
205f0 20 77 72 46 6c 61 67 2c 20 70 4b 65 79 49 6e 66   wrFlag, pKeyInf
20600 6f 2c 20 70 43 75 72 29 3b 0a 20 20 73 71 6c 69  o, pCur);.  sqli
20610 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
20620 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
20630 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
20640 68 65 20 73 69 7a 65 20 6f 66 20 61 20 42 74 43  he size of a BtC
20650 75 72 73 6f 72 20 6f 62 6a 65 63 74 20 69 6e 20  ursor object in 
20660 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  bytes..**.** Thi
20670 73 20 69 6e 74 65 72 66 61 63 65 73 20 69 73 20  s interfaces is 
20680 6e 65 65 64 65 64 20 73 6f 20 74 68 61 74 20 75  needed so that u
20690 73 65 72 73 20 6f 66 20 63 75 72 73 6f 72 73 20  sers of cursors 
206a0 63 61 6e 20 70 72 65 61 6c 6c 6f 63 61 74 65 0a  can preallocate.
206b0 2a 2a 20 73 75 66 66 69 63 69 65 6e 74 20 73 74  ** sufficient st
206c0 6f 72 61 67 65 20 74 6f 20 68 6f 6c 64 20 61 20  orage to hold a 
206d0 63 75 72 73 6f 72 2e 20 20 54 68 65 20 42 74 43  cursor.  The BtC
206e0 75 72 73 6f 72 20 6f 62 6a 65 63 74 20 69 73 20  ursor object is 
206f0 6f 70 61 71 75 65 0a 2a 2a 20 74 6f 20 75 73 65  opaque.** to use
20700 72 73 20 73 6f 20 74 68 65 79 20 63 61 6e 6e 6f  rs so they canno
20710 74 20 64 6f 20 74 68 65 20 73 69 7a 65 6f 66 28  t do the sizeof(
20720 29 20 74 68 65 6d 73 65 6c 76 65 73 20 2d 20 74  ) themselves - t
20730 68 65 79 20 6d 75 73 74 20 63 61 6c 6c 0a 2a 2a  hey must call.**
20740 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a   this routine..*
20750 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
20760 65 65 43 75 72 73 6f 72 53 69 7a 65 28 76 6f 69  eeCursorSize(voi
20770 64 29 7b 0a 20 20 72 65 74 75 72 6e 20 52 4f 55  d){.  return ROU
20780 4e 44 38 28 73 69 7a 65 6f 66 28 42 74 43 75 72  ND8(sizeof(BtCur
20790 73 6f 72 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  sor));.}../*.** 
207a0 49 6e 69 74 69 61 6c 69 7a 65 20 6d 65 6d 6f 72  Initialize memor
207b0 79 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 63  y that will be c
207c0 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 61 20  onverted into a 
207d0 42 74 43 75 72 73 6f 72 20 6f 62 6a 65 63 74 2e  BtCursor object.
207e0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 69 6d 70 6c  .**.** The simpl
207f0 65 20 61 70 70 72 6f 61 63 68 20 68 65 72 65 20  e approach here 
20800 77 6f 75 6c 64 20 62 65 20 74 6f 20 6d 65 6d 73  would be to mems
20810 65 74 28 29 20 74 68 65 20 65 6e 74 69 72 65 20  et() the entire 
20820 6f 62 6a 65 63 74 0a 2a 2a 20 74 6f 20 7a 65 72  object.** to zer
20830 6f 2e 20 20 42 75 74 20 69 74 20 74 75 72 6e 73  o.  But it turns
20840 20 6f 75 74 20 74 68 61 74 20 74 68 65 20 61 70   out that the ap
20850 50 61 67 65 5b 5d 20 61 6e 64 20 61 69 49 64 78  Page[] and aiIdx
20860 5b 5d 20 61 72 72 61 79 73 0a 2a 2a 20 64 6f 20  [] arrays.** do 
20870 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 7a  not need to be z
20880 65 72 6f 65 64 20 61 6e 64 20 74 68 65 79 20 61  eroed and they a
20890 72 65 20 6c 61 72 67 65 2c 20 73 6f 20 77 65 20  re large, so we 
208a0 63 61 6e 20 73 61 76 65 20 61 20 6c 6f 74 0a 2a  can save a lot.*
208b0 2a 20 6f 66 20 72 75 6e 2d 74 69 6d 65 20 62 79  * of run-time by
208c0 20 73 6b 69 70 70 69 6e 67 20 74 68 65 20 69 6e   skipping the in
208d0 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 6f 66 20  itialization of 
208e0 74 68 6f 73 65 20 65 6c 65 6d 65 6e 74 73 2e 0a  those elements..
208f0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42  */.void sqlite3B
20900 74 72 65 65 43 75 72 73 6f 72 5a 65 72 6f 28 42  treeCursorZero(B
20910 74 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 6d  tCursor *p){.  m
20920 65 6d 73 65 74 28 70 2c 20 30 2c 20 6f 66 66 73  emset(p, 0, offs
20930 65 74 6f 66 28 42 74 43 75 72 73 6f 72 2c 20 69  etof(BtCursor, i
20940 50 61 67 65 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Page));.}../*.**
20950 20 43 6c 6f 73 65 20 61 20 63 75 72 73 6f 72 2e   Close a cursor.
20960 20 20 54 68 65 20 72 65 61 64 20 6c 6f 63 6b 20    The read lock 
20970 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
20980 66 69 6c 65 20 69 73 20 72 65 6c 65 61 73 65 64  file is released
20990 0a 2a 2a 20 77 68 65 6e 20 74 68 65 20 6c 61 73  .** when the las
209a0 74 20 63 75 72 73 6f 72 20 69 73 20 63 6c 6f 73  t cursor is clos
209b0 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
209c0 65 33 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73  e3BtreeCloseCurs
209d0 6f 72 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  or(BtCursor *pCu
209e0 72 29 7b 0a 20 20 42 74 72 65 65 20 2a 70 42 74  r){.  Btree *pBt
209f0 72 65 65 20 3d 20 70 43 75 72 2d 3e 70 42 74 72  ree = pCur->pBtr
20a00 65 65 3b 0a 20 20 69 66 28 20 70 42 74 72 65 65  ee;.  if( pBtree
20a10 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
20a20 20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74     BtShared *pBt
20a30 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b 0a 20 20   = pCur->pBt;.  
20a40 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
20a50 74 65 72 28 70 42 74 72 65 65 29 3b 0a 20 20 20  ter(pBtree);.   
20a60 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65   sqlite3BtreeCle
20a70 61 72 43 75 72 73 6f 72 28 70 43 75 72 29 3b 0a  arCursor(pCur);.
20a80 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 70 50      if( pCur->pP
20a90 72 65 76 20 29 7b 0a 20 20 20 20 20 20 70 43 75  rev ){.      pCu
20aa0 72 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 20  r->pPrev->pNext 
20ab0 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20  = pCur->pNext;. 
20ac0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
20ad0 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20 70  pBt->pCursor = p
20ae0 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  Cur->pNext;.    
20af0 7d 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e  }.    if( pCur->
20b00 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20 70  pNext ){.      p
20b10 43 75 72 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65  Cur->pNext->pPre
20b20 76 20 3d 20 70 43 75 72 2d 3e 70 50 72 65 76 3b  v = pCur->pPrev;
20b30 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69  .    }.    for(i
20b40 3d 30 3b 20 69 3c 3d 70 43 75 72 2d 3e 69 50 61  =0; i<=pCur->iPa
20b50 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ge; i++){.      
20b60 72 65 6c 65 61 73 65 50 61 67 65 28 70 43 75 72  releasePage(pCur
20b70 2d 3e 61 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20  ->apPage[i]);.  
20b80 20 20 7d 0a 20 20 20 20 75 6e 6c 6f 63 6b 42 74    }.    unlockBt
20b90 72 65 65 49 66 55 6e 75 73 65 64 28 70 42 74 29  reeIfUnused(pBt)
20ba0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
20bb0 72 65 65 28 70 42 74 72 65 65 2d 3e 64 62 2c 20  ree(pBtree->db, 
20bc0 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 29  pCur->aOverflow)
20bd0 3b 0a 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33  ;.    /* sqlite3
20be0 5f 66 72 65 65 28 70 43 75 72 29 3b 20 2a 2f 0a  _free(pCur); */.
20bf0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
20c00 4c 65 61 76 65 28 70 42 74 72 65 65 29 3b 0a 20  Leave(pBtree);. 
20c10 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
20c20 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
20c30 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 42 74  Make sure the Bt
20c40 43 75 72 73 6f 72 2a 20 67 69 76 65 6e 20 69 6e  Cursor* given in
20c50 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 68 61   the argument ha
20c60 73 20 61 20 76 61 6c 69 64 0a 2a 2a 20 42 74 43  s a valid.** BtC
20c70 75 72 73 6f 72 2e 69 6e 66 6f 20 73 74 72 75 63  ursor.info struc
20c80 74 75 72 65 2e 20 20 49 66 20 69 74 20 69 73 20  ture.  If it is 
20c90 6e 6f 74 20 61 6c 72 65 61 64 79 20 76 61 6c 69  not already vali
20ca0 64 2c 20 63 61 6c 6c 0a 2a 2a 20 62 74 72 65 65  d, call.** btree
20cb0 50 61 72 73 65 43 65 6c 6c 28 29 20 74 6f 20 66  ParseCell() to f
20cc0 69 6c 6c 20 69 74 20 69 6e 2e 0a 2a 2a 0a 2a 2a  ill it in..**.**
20cd0 20 42 74 43 75 72 73 6f 72 2e 69 6e 66 6f 20 69   BtCursor.info i
20ce0 73 20 61 20 63 61 63 68 65 20 6f 66 20 74 68 65  s a cache of the
20cf0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20   information in 
20d00 74 68 65 20 63 75 72 72 65 6e 74 20 63 65 6c 6c  the current cell
20d10 2e 0a 2a 2a 20 55 73 69 6e 67 20 74 68 69 73 20  ..** Using this 
20d20 63 61 63 68 65 20 72 65 64 75 63 65 73 20 74 68  cache reduces th
20d30 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 61 6c 6c  e number of call
20d40 73 20 74 6f 20 62 74 72 65 65 50 61 72 73 65 43  s to btreeParseC
20d50 65 6c 6c 28 29 2e 0a 2a 2a 0a 2a 2a 20 32 30 30  ell()..**.** 200
20d60 37 2d 30 36 2d 32 35 3a 20 20 54 68 65 72 65 20  7-06-25:  There 
20d70 69 73 20 61 20 62 75 67 20 69 6e 20 73 6f 6d 65  is a bug in some
20d80 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 4d 53 56   versions of MSV
20d90 43 20 74 68 61 74 20 63 61 75 73 65 20 74 68 65  C that cause the
20da0 0a 2a 2a 20 63 6f 6d 70 69 6c 65 72 20 74 6f 20  .** compiler to 
20db0 63 72 61 73 68 20 77 68 65 6e 20 67 65 74 43 65  crash when getCe
20dc0 6c 6c 49 6e 66 6f 28 29 20 69 73 20 69 6d 70 6c  llInfo() is impl
20dd0 65 6d 65 6e 74 65 64 20 61 73 20 61 20 6d 61 63  emented as a mac
20de0 72 6f 2e 0a 2a 2a 20 42 75 74 20 74 68 65 72 65  ro..** But there
20df0 20 69 73 20 61 20 6d 65 61 73 75 72 65 61 62 6c   is a measureabl
20e00 65 20 73 70 65 65 64 20 61 64 76 61 6e 74 61 67  e speed advantag
20e10 65 20 74 6f 20 75 73 69 6e 67 20 74 68 65 20 6d  e to using the m
20e20 61 63 72 6f 20 6f 6e 20 67 63 63 0a 2a 2a 20 28  acro on gcc.** (
20e30 77 68 65 6e 20 6c 65 73 73 20 63 6f 6d 70 69 6c  when less compil
20e40 65 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73  er optimizations
20e50 20 6c 69 6b 65 20 2d 4f 73 20 6f 72 20 2d 4f 30   like -Os or -O0
20e60 20 61 72 65 20 75 73 65 64 20 61 6e 64 20 74 68   are used and th
20e70 65 0a 2a 2a 20 63 6f 6d 70 69 6c 65 72 20 69 73  e.** compiler is
20e80 20 6e 6f 74 20 64 6f 69 6e 67 20 61 67 67 72 65   not doing aggre
20e90 73 73 69 76 65 20 69 6e 6c 69 6e 69 6e 67 2e 29  ssive inlining.)
20ea0 20 20 53 6f 20 77 65 20 75 73 65 20 61 20 72 65    So we use a re
20eb0 61 6c 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 66  al function.** f
20ec0 6f 72 20 4d 53 56 43 20 61 6e 64 20 61 20 6d 61  or MSVC and a ma
20ed0 63 72 6f 20 66 6f 72 20 65 76 65 72 79 74 68 69  cro for everythi
20ee0 6e 67 20 65 6c 73 65 2e 20 20 54 69 63 6b 65 74  ng else.  Ticket
20ef0 20 23 32 34 35 37 2e 0a 2a 2f 0a 23 69 66 6e 64   #2457..*/.#ifnd
20f00 65 66 20 4e 44 45 42 55 47 0a 20 20 73 74 61 74  ef NDEBUG.  stat
20f10 69 63 20 76 6f 69 64 20 61 73 73 65 72 74 43 65  ic void assertCe
20f20 6c 6c 49 6e 66 6f 28 42 74 43 75 72 73 6f 72 20  llInfo(BtCursor 
20f30 2a 70 43 75 72 29 7b 0a 20 20 20 20 43 65 6c 6c  *pCur){.    Cell
20f40 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 69  Info info;.    i
20f50 6e 74 20 69 50 61 67 65 20 3d 20 70 43 75 72 2d  nt iPage = pCur-
20f60 3e 69 50 61 67 65 3b 0a 20 20 20 20 6d 65 6d 73  >iPage;.    mems
20f70 65 74 28 26 69 6e 66 6f 2c 20 30 2c 20 73 69 7a  et(&info, 0, siz
20f80 65 6f 66 28 69 6e 66 6f 29 29 3b 0a 20 20 20 20  eof(info));.    
20f90 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 70  btreeParseCell(p
20fa0 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 50 61 67  Cur->apPage[iPag
20fb0 65 5d 2c 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  e], pCur->aiIdx[
20fc0 69 50 61 67 65 5d 2c 20 26 69 6e 66 6f 29 3b 0a  iPage], &info);.
20fd0 20 20 20 20 61 73 73 65 72 74 28 20 43 4f 52 52      assert( CORR
20fe0 55 50 54 5f 44 42 20 7c 7c 20 6d 65 6d 63 6d 70  UPT_DB || memcmp
20ff0 28 26 69 6e 66 6f 2c 20 26 70 43 75 72 2d 3e 69  (&info, &pCur->i
21000 6e 66 6f 2c 20 73 69 7a 65 6f 66 28 69 6e 66 6f  nfo, sizeof(info
21010 29 29 3d 3d 30 20 29 3b 0a 20 20 7d 0a 23 65 6c  ))==0 );.  }.#el
21020 73 65 0a 20 20 23 64 65 66 69 6e 65 20 61 73 73  se.  #define ass
21030 65 72 74 43 65 6c 6c 49 6e 66 6f 28 78 29 0a 23  ertCellInfo(x).#
21040 65 6e 64 69 66 0a 23 69 66 64 65 66 20 5f 4d 53  endif.#ifdef _MS
21050 43 5f 56 45 52 0a 20 20 2f 2a 20 55 73 65 20 61  C_VER.  /* Use a
21060 20 72 65 61 6c 20 66 75 6e 63 74 69 6f 6e 20 69   real function i
21070 6e 20 4d 53 56 43 20 74 6f 20 77 6f 72 6b 20 61  n MSVC to work a
21080 72 6f 75 6e 64 20 62 75 67 73 20 69 6e 20 74 68  round bugs in th
21090 61 74 20 63 6f 6d 70 69 6c 65 72 2e 20 2a 2f 0a  at compiler. */.
210a0 20 20 73 74 61 74 69 63 20 76 6f 69 64 20 67 65    static void ge
210b0 74 43 65 6c 6c 49 6e 66 6f 28 42 74 43 75 72 73  tCellInfo(BtCurs
210c0 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 20 20 69  or *pCur){.    i
210d0 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53  f( pCur->info.nS
210e0 69 7a 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ize==0 ){.      
210f0 69 6e 74 20 69 50 61 67 65 20 3d 20 70 43 75 72  int iPage = pCur
21100 2d 3e 69 50 61 67 65 3b 0a 20 20 20 20 20 20 62  ->iPage;.      b
21110 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 70 43  treeParseCell(pC
21120 75 72 2d 3e 61 70 50 61 67 65 5b 69 50 61 67 65  ur->apPage[iPage
21130 5d 2c 70 43 75 72 2d 3e 61 69 49 64 78 5b 69 50  ],pCur->aiIdx[iP
21140 61 67 65 5d 2c 26 70 43 75 72 2d 3e 69 6e 66 6f  age],&pCur->info
21150 29 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 63  );.      pCur->c
21160 75 72 46 6c 61 67 73 20 7c 3d 20 42 54 43 46 5f  urFlags |= BTCF_
21170 56 61 6c 69 64 4e 4b 65 79 3b 0a 20 20 20 20 7d  ValidNKey;.    }
21180 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
21190 72 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29  rtCellInfo(pCur)
211a0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6c 73  ;.    }.  }.#els
211b0 65 20 2f 2a 20 69 66 20 6e 6f 74 20 5f 4d 53 43  e /* if not _MSC
211c0 5f 56 45 52 20 2a 2f 0a 20 20 2f 2a 20 55 73 65  _VER */.  /* Use
211d0 20 61 20 6d 61 63 72 6f 20 69 6e 20 61 6c 6c 20   a macro in all 
211e0 6f 74 68 65 72 20 63 6f 6d 70 69 6c 65 72 73 20  other compilers 
211f0 73 6f 20 74 68 61 74 20 74 68 65 20 66 75 6e 63  so that the func
21200 74 69 6f 6e 20 69 73 20 69 6e 6c 69 6e 65 64 20  tion is inlined 
21210 2a 2f 0a 23 64 65 66 69 6e 65 20 67 65 74 43 65  */.#define getCe
21220 6c 6c 49 6e 66 6f 28 70 43 75 72 29 20 20 20 20  llInfo(pCur)    
21230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21260 20 20 5c 0a 20 20 69 66 28 20 70 43 75 72 2d 3e    \.  if( pCur->
21270 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 7b  info.nSize==0 ){
21280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
212a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
212b0 20 20 20 5c 0a 20 20 20 20 69 6e 74 20 69 50 61     \.    int iPa
212c0 67 65 20 3d 20 70 43 75 72 2d 3e 69 50 61 67 65  ge = pCur->iPage
212d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
212e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
212f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21300 20 20 20 20 5c 0a 20 20 20 20 62 74 72 65 65 50      \.    btreeP
21310 61 72 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e 61  arseCell(pCur->a
21320 70 50 61 67 65 5b 69 50 61 67 65 5d 2c 70 43 75  pPage[iPage],pCu
21330 72 2d 3e 61 69 49 64 78 5b 69 50 61 67 65 5d 2c  r->aiIdx[iPage],
21340 26 70 43 75 72 2d 3e 69 6e 66 6f 29 3b 20 20 20  &pCur->info);   
21350 20 20 20 20 20 5c 0a 20 20 20 20 70 43 75 72 2d       \.    pCur-
21360 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20 42 54 43  >curFlags |= BTC
21370 46 5f 56 61 6c 69 64 4e 4b 65 79 3b 20 20 20 20  F_ValidNKey;    
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 5c 0a 20 20 7d 65 6c 73 65 7b        \.  }else{
213b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
213c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
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 5c 0a 20 20 20 20 61 73 73         \.    ass
21400 65 72 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72  ertCellInfo(pCur
21410 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  );              
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 5c 0a 20 20 7d 0a 23 65          \.  }.#e
21450 6e 64 69 66 20 2f 2a 20 5f 4d 53 43 5f 56 45 52  ndif /* _MSC_VER
21460 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45   */..#ifndef NDE
21470 42 55 47 20 20 2f 2a 20 54 68 65 20 6e 65 78 74  BUG  /* The next
21480 20 72 6f 75 74 69 6e 65 20 75 73 65 64 20 6f 6e   routine used on
21490 6c 79 20 77 69 74 68 69 6e 20 61 73 73 65 72 74  ly within assert
214a0 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f  () statements */
214b0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72  ./*.** Return tr
214c0 75 65 20 69 66 20 74 68 65 20 67 69 76 65 6e 20  ue if the given 
214d0 42 74 43 75 72 73 6f 72 20 69 73 20 76 61 6c 69  BtCursor is vali
214e0 64 2e 20 20 41 20 76 61 6c 69 64 20 63 75 72 73  d.  A valid curs
214f0 6f 72 20 69 73 20 6f 6e 65 0a 2a 2a 20 74 68 61  or is one.** tha
21500 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70  t is currently p
21510 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20 72 6f 77  ointing to a row
21520 20 69 6e 20 61 20 28 6e 6f 6e 2d 65 6d 70 74 79   in a (non-empty
21530 29 20 74 61 62 6c 65 2e 0a 2a 2a 20 54 68 69 73  ) table..** This
21540 20 69 73 20 61 20 76 65 72 69 66 69 63 61 74 69   is a verificati
21550 6f 6e 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  on routine is us
21560 65 64 20 6f 6e 6c 79 20 77 69 74 68 69 6e 20 61  ed only within a
21570 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e  ssert() statemen
21580 74 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ts..*/.int sqlit
21590 65 33 42 74 72 65 65 43 75 72 73 6f 72 49 73 56  e3BtreeCursorIsV
215a0 61 6c 69 64 28 42 74 43 75 72 73 6f 72 20 2a 70  alid(BtCursor *p
215b0 43 75 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  Cur){.  return p
215c0 43 75 72 20 26 26 20 70 43 75 72 2d 3e 65 53 74  Cur && pCur->eSt
215d0 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
215e0 44 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 4e  D;.}.#endif /* N
215f0 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  DEBUG */../*.** 
21600 53 65 74 20 2a 70 53 69 7a 65 20 74 6f 20 74 68  Set *pSize to th
21610 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 62 75  e size of the bu
21620 66 66 65 72 20 6e 65 65 64 65 64 20 74 6f 20 68  ffer needed to h
21630 6f 6c 64 20 74 68 65 20 76 61 6c 75 65 20 6f 66  old the value of
21640 0a 2a 2a 20 74 68 65 20 6b 65 79 20 66 6f 72 20  .** the key for 
21650 74 68 65 20 63 75 72 72 65 6e 74 20 65 6e 74 72  the current entr
21660 79 2e 20 20 49 66 20 74 68 65 20 63 75 72 73 6f  y.  If the curso
21670 72 20 69 73 20 6e 6f 74 20 70 6f 69 6e 74 69 6e  r is not pointin
21680 67 0a 2a 2a 20 74 6f 20 61 20 76 61 6c 69 64 20  g.** to a valid 
21690 65 6e 74 72 79 2c 20 2a 70 53 69 7a 65 20 69 73  entry, *pSize is
216a0 20 73 65 74 20 74 6f 20 30 2e 20 0a 2a 2a 0a 2a   set to 0. .**.*
216b0 2a 20 46 6f 72 20 61 20 74 61 62 6c 65 20 77 69  * For a table wi
216c0 74 68 20 74 68 65 20 49 4e 54 4b 45 59 20 66 6c  th the INTKEY fl
216d0 61 67 20 73 65 74 2c 20 74 68 69 73 20 72 6f 75  ag set, this rou
216e0 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65  tine returns the
216f0 20 6b 65 79 0a 2a 2a 20 69 74 73 65 6c 66 2c 20   key.** itself, 
21700 6e 6f 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  not the number o
21710 66 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 6b  f bytes in the k
21720 65 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61  ey..**.** The ca
21730 6c 6c 65 72 20 6d 75 73 74 20 70 6f 73 69 74 69  ller must positi
21740 6f 6e 20 74 68 65 20 63 75 72 73 6f 72 20 70 72  on the cursor pr
21750 69 6f 72 20 74 6f 20 69 6e 76 6f 6b 69 6e 67 20  ior to invoking 
21760 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a  this routine..**
21770 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e   .** This routin
21780 65 20 63 61 6e 6e 6f 74 20 66 61 69 6c 2e 20 20  e cannot fail.  
21790 49 74 20 61 6c 77 61 79 73 20 72 65 74 75 72 6e  It always return
217a0 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 20 0a 2a  s SQLITE_OK.  .*
217b0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
217c0 65 65 4b 65 79 53 69 7a 65 28 42 74 43 75 72 73  eeKeySize(BtCurs
217d0 6f 72 20 2a 70 43 75 72 2c 20 69 36 34 20 2a 70  or *pCur, i64 *p
217e0 53 69 7a 65 29 7b 0a 20 20 61 73 73 65 72 74 28  Size){.  assert(
217f0 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
21800 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  x(pCur) );.  ass
21810 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
21820 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
21830 29 3b 0a 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f  );.  getCellInfo
21840 28 70 43 75 72 29 3b 0a 20 20 2a 70 53 69 7a 65  (pCur);.  *pSize
21850 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b   = pCur->info.nK
21860 65 79 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ey;.  return SQL
21870 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
21880 20 53 65 74 20 2a 70 53 69 7a 65 20 74 6f 20 74   Set *pSize to t
21890 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
218a0 65 73 20 6f 66 20 64 61 74 61 20 69 6e 20 74 68  es of data in th
218b0 65 20 65 6e 74 72 79 20 74 68 65 0a 2a 2a 20 63  e entry the.** c
218c0 75 72 73 6f 72 20 63 75 72 72 65 6e 74 6c 79 20  ursor currently 
218d0 70 6f 69 6e 74 73 20 74 6f 2e 0a 2a 2a 0a 2a 2a  points to..**.**
218e0 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74   The caller must
218f0 20 67 75 61 72 61 6e 74 65 65 20 74 68 61 74 20   guarantee that 
21900 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 70 6f  the cursor is po
21910 69 6e 74 69 6e 67 20 74 6f 20 61 20 6e 6f 6e 2d  inting to a non-
21920 4e 55 4c 4c 0a 2a 2a 20 76 61 6c 69 64 20 65 6e  NULL.** valid en
21930 74 72 79 2e 20 20 49 6e 20 6f 74 68 65 72 20 77  try.  In other w
21940 6f 72 64 73 2c 20 74 68 65 20 63 61 6c 6c 69 6e  ords, the callin
21950 67 20 70 72 6f 63 65 64 75 72 65 20 6d 75 73 74  g procedure must
21960 20 67 75 61 72 61 6e 74 65 65 0a 2a 2a 20 74 68   guarantee.** th
21970 61 74 20 74 68 65 20 63 75 72 73 6f 72 20 68 61  at the cursor ha
21980 73 20 43 75 72 73 6f 72 2e 65 53 74 61 74 65 3d  s Cursor.eState=
21990 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 2e 0a 2a  =CURSOR_VALID..*
219a0 2a 0a 2a 2a 20 46 61 69 6c 75 72 65 20 69 73 20  *.** Failure is 
219b0 6e 6f 74 20 70 6f 73 73 69 62 6c 65 2e 20 20 54  not possible.  T
219c0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c 77  his function alw
219d0 61 79 73 20 72 65 74 75 72 6e 73 20 53 51 4c 49  ays returns SQLI
219e0 54 45 5f 4f 4b 2e 0a 2a 2a 20 49 74 20 6d 69 67  TE_OK..** It mig
219f0 68 74 20 6a 75 73 74 20 61 73 20 77 65 6c 6c 20  ht just as well 
21a00 62 65 20 61 20 70 72 6f 63 65 64 75 72 65 20 28  be a procedure (
21a10 72 65 74 75 72 6e 69 6e 67 20 76 6f 69 64 29 20  returning void) 
21a20 62 75 74 20 77 65 20 63 6f 6e 74 69 6e 75 65 0a  but we continue.
21a30 2a 2a 20 74 6f 20 72 65 74 75 72 6e 20 61 6e 20  ** to return an 
21a40 69 6e 74 65 67 65 72 20 72 65 73 75 6c 74 20 63  integer result c
21a50 6f 64 65 20 66 6f 72 20 68 69 73 74 6f 72 69 63  ode for historic
21a60 61 6c 20 72 65 61 73 6f 6e 73 2e 0a 2a 2f 0a 69  al reasons..*/.i
21a70 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 44  nt sqlite3BtreeD
21a80 61 74 61 53 69 7a 65 28 42 74 43 75 72 73 6f 72  ataSize(BtCursor
21a90 20 2a 70 43 75 72 2c 20 75 33 32 20 2a 70 53 69   *pCur, u32 *pSi
21aa0 7a 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63  ze){.  assert( c
21ab0 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
21ac0 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
21ad0 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
21ae0 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
21af0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
21b00 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
21b10 61 67 65 5d 2d 3e 69 6e 74 4b 65 79 4c 65 61 66  age]->intKeyLeaf
21b20 3d 3d 31 20 29 3b 0a 20 20 67 65 74 43 65 6c 6c  ==1 );.  getCell
21b30 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 2a 70  Info(pCur);.  *p
21b40 53 69 7a 65 20 3d 20 70 43 75 72 2d 3e 69 6e 66  Size = pCur->inf
21b50 6f 2e 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 72 65  o.nPayload;.  re
21b60 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
21b70 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74  }../*.** Given t
21b80 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  he page number o
21b90 66 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  f an overflow pa
21ba0 67 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ge in the databa
21bb0 73 65 20 28 70 61 72 61 6d 65 74 65 72 0a 2a 2a  se (parameter.**
21bc0 20 6f 76 66 6c 29 2c 20 74 68 69 73 20 66 75 6e   ovfl), this fun
21bd0 63 74 69 6f 6e 20 66 69 6e 64 73 20 74 68 65 20  ction finds the 
21be0 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  page number of t
21bf0 68 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20  he next page in 
21c00 74 68 65 20 0a 2a 2a 20 6c 69 6e 6b 65 64 20 6c  the .** linked l
21c10 69 73 74 20 6f 66 20 6f 76 65 72 66 6c 6f 77 20  ist of overflow 
21c20 70 61 67 65 73 2e 20 49 66 20 70 6f 73 73 69 62  pages. If possib
21c30 6c 65 2c 20 69 74 20 75 73 65 73 20 74 68 65 20  le, it uses the 
21c40 61 75 74 6f 2d 76 61 63 75 75 6d 0a 2a 2a 20 70  auto-vacuum.** p
21c50 6f 69 6e 74 65 72 2d 6d 61 70 20 64 61 74 61 20  ointer-map data 
21c60 69 6e 73 74 65 61 64 20 6f 66 20 72 65 61 64 69  instead of readi
21c70 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  ng the content o
21c80 66 20 70 61 67 65 20 6f 76 66 6c 20 74 6f 20 64  f page ovfl to d
21c90 6f 20 73 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  o so. .**.** If 
21ca0 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
21cb0 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
21cc0 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
21cd0 2e 20 4f 74 68 65 72 77 69 73 65 3a 0a 2a 2a 0a  . Otherwise:.**.
21ce0 2a 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62  ** The page numb
21cf0 65 72 20 6f 66 20 74 68 65 20 6e 65 78 74 20 6f  er of the next o
21d00 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 20  verflow page in 
21d10 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  the linked list 
21d20 69 73 20 0a 2a 2a 20 77 72 69 74 74 65 6e 20 74  is .** written t
21d30 6f 20 2a 70 50 67 6e 6f 4e 65 78 74 2e 20 49 66  o *pPgnoNext. If
21d40 20 70 61 67 65 20 6f 76 66 6c 20 69 73 20 74 68   page ovfl is th
21d50 65 20 6c 61 73 74 20 70 61 67 65 20 69 6e 20 69  e last page in i
21d60 74 73 20 6c 69 6e 6b 65 64 20 0a 2a 2a 20 6c 69  ts linked .** li
21d70 73 74 2c 20 2a 70 50 67 6e 6f 4e 65 78 74 20 69  st, *pPgnoNext i
21d80 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 0a  s set to zero. .
21d90 2a 2a 0a 2a 2a 20 49 66 20 70 70 50 61 67 65 20  **.** If ppPage 
21da0 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 61 6e 64  is not NULL, and
21db0 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
21dc0 74 68 65 20 4d 65 6d 50 61 67 65 20 6f 62 6a 65  the MemPage obje
21dd0 63 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  ct corresponding
21de0 0a 2a 2a 20 74 6f 20 70 61 67 65 20 6e 75 6d 62  .** to page numb
21df0 65 72 20 70 4f 76 66 6c 20 77 61 73 20 6f 62 74  er pOvfl was obt
21e00 61 69 6e 65 64 2c 20 74 68 65 6e 20 2a 70 70 50  ained, then *ppP
21e10 61 67 65 20 69 73 20 73 65 74 20 74 6f 20 70 6f  age is set to po
21e20 69 6e 74 20 74 6f 20 74 68 61 74 0a 2a 2a 20 72  int to that.** r
21e30 65 66 65 72 65 6e 63 65 2e 20 49 74 20 69 73 20  eference. It is 
21e40 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69  the responsibili
21e50 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72  ty of the caller
21e60 20 74 6f 20 63 61 6c 6c 20 72 65 6c 65 61 73 65   to call release
21e70 50 61 67 65 28 29 0a 2a 2a 20 6f 6e 20 2a 70 70  Page().** on *pp
21e80 50 61 67 65 20 74 6f 20 66 72 65 65 20 74 68 65  Page to free the
21e90 20 72 65 66 65 72 65 6e 63 65 2e 20 49 6e 20 6e   reference. In n
21ea0 6f 20 72 65 66 65 72 65 6e 63 65 20 77 61 73 20  o reference was 
21eb0 6f 62 74 61 69 6e 65 64 20 28 62 65 63 61 75 73  obtained (becaus
21ec0 65 0a 2a 2a 20 74 68 65 20 70 6f 69 6e 74 65 72  e.** the pointer
21ed0 2d 6d 61 70 20 77 61 73 20 75 73 65 64 20 74 6f  -map was used to
21ee0 20 6f 62 74 61 69 6e 20 74 68 65 20 76 61 6c 75   obtain the valu
21ef0 65 20 66 6f 72 20 2a 70 50 67 6e 6f 4e 65 78 74  e for *pPgnoNext
21f00 29 2c 20 74 68 65 6e 0a 2a 2a 20 2a 70 70 50 61  ), then.** *ppPa
21f10 67 65 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72  ge is set to zer
21f20 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  o..*/.static int
21f30 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65   getOverflowPage
21f40 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  (.  BtShared *pB
21f50 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
21f60 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
21f70 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20   file */.  Pgno 
21f80 6f 76 66 6c 2c 20 20 20 20 20 20 20 20 20 20 20  ovfl,           
21f90 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
21fa0 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  nt overflow page
21fb0 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 4d 65 6d   number */.  Mem
21fc0 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20  Page **ppPage,  
21fd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
21fe0 3a 20 4d 65 6d 50 61 67 65 20 68 61 6e 64 6c 65  : MemPage handle
21ff0 20 28 6d 61 79 20 62 65 20 4e 55 4c 4c 29 20 2a   (may be NULL) *
22000 2f 0a 20 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 4e  /.  Pgno *pPgnoN
22010 65 78 74 20 20 20 20 20 20 20 20 20 20 20 20 20  ext             
22020 20 2f 2a 20 4f 55 54 3a 20 4e 65 78 74 20 6f 76   /* OUT: Next ov
22030 65 72 66 6c 6f 77 20 70 61 67 65 20 6e 75 6d 62  erflow page numb
22040 65 72 20 2a 2f 0a 29 7b 0a 20 20 50 67 6e 6f 20  er */.){.  Pgno 
22050 6e 65 78 74 20 3d 20 30 3b 0a 20 20 4d 65 6d 50  next = 0;.  MemP
22060 61 67 65 20 2a 70 50 61 67 65 20 3d 20 30 3b 0a  age *pPage = 0;.
22070 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
22080 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28  E_OK;..  assert(
22090 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
220a0 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
220b0 29 3b 0a 20 20 61 73 73 65 72 74 28 70 50 67 6e  );.  assert(pPgn
220c0 6f 4e 65 78 74 29 3b 0a 0a 23 69 66 6e 64 65 66  oNext);..#ifndef
220d0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
220e0 4f 56 41 43 55 55 4d 0a 20 20 2f 2a 20 54 72 79  OVACUUM.  /* Try
220f0 20 74 6f 20 66 69 6e 64 20 74 68 65 20 6e 65 78   to find the nex
22100 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 6f 76  t page in the ov
22110 65 72 66 6c 6f 77 20 6c 69 73 74 20 75 73 69 6e  erflow list usin
22120 67 20 74 68 65 0a 20 20 2a 2a 20 61 75 74 6f 76  g the.  ** autov
22130 61 63 75 75 6d 20 70 6f 69 6e 74 65 72 2d 6d 61  acuum pointer-ma
22140 70 20 70 61 67 65 73 2e 20 47 75 65 73 73 20 74  p pages. Guess t
22150 68 61 74 20 74 68 65 20 6e 65 78 74 20 70 61 67  hat the next pag
22160 65 20 69 6e 20 0a 20 20 2a 2a 20 74 68 65 20 6f  e in .  ** the o
22170 76 65 72 66 6c 6f 77 20 6c 69 73 74 20 69 73 20  verflow list is 
22180 70 61 67 65 20 6e 75 6d 62 65 72 20 28 6f 76 66  page number (ovf
22190 6c 2b 31 29 2e 20 49 66 20 74 68 61 74 20 67 75  l+1). If that gu
221a0 65 73 73 20 74 75 72 6e 73 20 0a 20 20 2a 2a 20  ess turns .  ** 
221b0 6f 75 74 20 74 6f 20 62 65 20 77 72 6f 6e 67 2c  out to be wrong,
221c0 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20 6c 6f   fall back to lo
221d0 61 64 69 6e 67 20 74 68 65 20 64 61 74 61 20 6f  ading the data o
221e0 66 20 70 61 67 65 20 0a 20 20 2a 2a 20 6e 75 6d  f page .  ** num
221f0 62 65 72 20 6f 76 66 6c 20 74 6f 20 64 65 74 65  ber ovfl to dete
22200 72 6d 69 6e 65 20 74 68 65 20 6e 65 78 74 20 70  rmine the next p
22210 61 67 65 20 6e 75 6d 62 65 72 2e 0a 20 20 2a 2f  age number..  */
22220 0a 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f  .  if( pBt->auto
22230 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 50 67  Vacuum ){.    Pg
22240 6e 6f 20 70 67 6e 6f 3b 0a 20 20 20 20 50 67 6e  no pgno;.    Pgn
22250 6f 20 69 47 75 65 73 73 20 3d 20 6f 76 66 6c 2b  o iGuess = ovfl+
22260 31 3b 0a 20 20 20 20 75 38 20 65 54 79 70 65 3b  1;.    u8 eType;
22270 0a 0a 20 20 20 20 77 68 69 6c 65 28 20 50 54 52  ..    while( PTR
22280 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20  MAP_ISPAGE(pBt, 
22290 69 47 75 65 73 73 29 20 7c 7c 20 69 47 75 65 73  iGuess) || iGues
222a0 73 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  s==PENDING_BYTE_
222b0 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20  PAGE(pBt) ){.   
222c0 20 20 20 69 47 75 65 73 73 2b 2b 3b 0a 20 20 20     iGuess++;.   
222d0 20 7d 0a 0a 20 20 20 20 69 66 28 20 69 47 75 65   }..    if( iGue
222e0 73 73 3c 3d 62 74 72 65 65 50 61 67 65 63 6f 75  ss<=btreePagecou
222f0 6e 74 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20  nt(pBt) ){.     
22300 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28   rc = ptrmapGet(
22310 70 42 74 2c 20 69 47 75 65 73 73 2c 20 26 65 54  pBt, iGuess, &eT
22320 79 70 65 2c 20 26 70 67 6e 6f 29 3b 0a 20 20 20  ype, &pgno);.   
22330 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
22340 45 5f 4f 4b 20 26 26 20 65 54 79 70 65 3d 3d 50  E_OK && eType==P
22350 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20  TRMAP_OVERFLOW2 
22360 26 26 20 70 67 6e 6f 3d 3d 6f 76 66 6c 20 29 7b  && pgno==ovfl ){
22370 0a 20 20 20 20 20 20 20 20 6e 65 78 74 20 3d 20  .        next = 
22380 69 47 75 65 73 73 3b 0a 20 20 20 20 20 20 20 20  iGuess;.        
22390 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45  rc = SQLITE_DONE
223a0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
223b0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73    }.#endif..  as
223c0 73 65 72 74 28 20 6e 65 78 74 3d 3d 30 20 7c 7c  sert( next==0 ||
223d0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc==SQLITE_DONE
223e0 20 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   );.  if( rc==SQ
223f0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
22400 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65  c = btreeGetPage
22410 28 70 42 74 2c 20 6f 76 66 6c 2c 20 26 70 50 61  (pBt, ovfl, &pPa
22420 67 65 2c 20 28 70 70 50 61 67 65 3d 3d 30 29 20  ge, (ppPage==0) 
22430 3f 20 50 41 47 45 52 5f 47 45 54 5f 52 45 41 44  ? PAGER_GET_READ
22440 4f 4e 4c 59 20 3a 20 30 29 3b 0a 20 20 20 20 61  ONLY : 0);.    a
22450 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
22460 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 3d 3d 30  E_OK || pPage==0
22470 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   );.    if( rc==
22480 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
22490 20 20 20 6e 65 78 74 20 3d 20 67 65 74 34 62 79     next = get4by
224a0 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61 29  te(pPage->aData)
224b0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a  ;.    }.  }..  *
224c0 70 50 67 6e 6f 4e 65 78 74 20 3d 20 6e 65 78 74  pPgnoNext = next
224d0 3b 0a 20 20 69 66 28 20 70 70 50 61 67 65 20 29  ;.  if( ppPage )
224e0 7b 0a 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20  {.    *ppPage = 
224f0 70 50 61 67 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a  pPage;.  }else{.
22500 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
22510 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 72 65  pPage);.  }.  re
22520 74 75 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45  turn (rc==SQLITE
22530 5f 44 4f 4e 45 20 3f 20 53 51 4c 49 54 45 5f 4f  _DONE ? SQLITE_O
22540 4b 20 3a 20 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  K : rc);.}../*.*
22550 2a 20 43 6f 70 79 20 64 61 74 61 20 66 72 6f 6d  * Copy data from
22560 20 61 20 62 75 66 66 65 72 20 74 6f 20 61 20 70   a buffer to a p
22570 61 67 65 2c 20 6f 72 20 66 72 6f 6d 20 61 20 70  age, or from a p
22580 61 67 65 20 74 6f 20 61 20 62 75 66 66 65 72 2e  age to a buffer.
22590 0a 2a 2a 0a 2a 2a 20 70 50 61 79 6c 6f 61 64 20  .**.** pPayload 
225a0 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
225b0 64 61 74 61 20 73 74 6f 72 65 64 20 6f 6e 20 64  data stored on d
225c0 61 74 61 62 61 73 65 20 70 61 67 65 20 70 44 62  atabase page pDb
225d0 50 61 67 65 2e 0a 2a 2a 20 49 66 20 61 72 67 75  Page..** If argu
225e0 6d 65 6e 74 20 65 4f 70 20 69 73 20 66 61 6c 73  ment eOp is fals
225f0 65 2c 20 74 68 65 6e 20 6e 42 79 74 65 20 62 79  e, then nByte by
22600 74 65 73 20 6f 66 20 64 61 74 61 20 61 72 65 20  tes of data are 
22610 63 6f 70 69 65 64 0a 2a 2a 20 66 72 6f 6d 20 70  copied.** from p
22620 50 61 79 6c 6f 61 64 20 74 6f 20 74 68 65 20 62  Payload to the b
22630 75 66 66 65 72 20 70 6f 69 6e 74 65 64 20 61 74  uffer pointed at
22640 20 62 79 20 70 42 75 66 2e 20 49 66 20 65 4f 70   by pBuf. If eOp
22650 20 69 73 20 74 72 75 65 2c 0a 2a 2a 20 74 68 65   is true,.** the
22660 6e 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  n sqlite3PagerWr
22670 69 74 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20  ite() is called 
22680 6f 6e 20 70 44 62 50 61 67 65 20 61 6e 64 20 6e  on pDbPage and n
22690 42 79 74 65 20 62 79 74 65 73 0a 2a 2a 20 6f 66  Byte bytes.** of
226a0 20 64 61 74 61 20 61 72 65 20 63 6f 70 69 65 64   data are copied
226b0 20 66 72 6f 6d 20 74 68 65 20 62 75 66 66 65 72   from the buffer
226c0 20 70 42 75 66 20 74 6f 20 70 50 61 79 6c 6f 61   pBuf to pPayloa
226d0 64 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f  d..**.** SQLITE_
226e0 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 6f  OK is returned o
226f0 6e 20 73 75 63 63 65 73 73 2c 20 6f 74 68 65 72  n success, other
22700 77 69 73 65 20 61 6e 20 65 72 72 6f 72 20 63 6f  wise an error co
22710 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  de..*/.static in
22720 74 20 63 6f 70 79 50 61 79 6c 6f 61 64 28 0a 20  t copyPayload(. 
22730 20 76 6f 69 64 20 2a 70 50 61 79 6c 6f 61 64 2c   void *pPayload,
22740 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
22750 69 6e 74 65 72 20 74 6f 20 70 61 67 65 20 64 61  inter to page da
22760 74 61 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42  ta */.  void *pB
22770 75 66 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  uf,             
22780 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
22790 62 75 66 66 65 72 20 2a 2f 0a 20 20 69 6e 74 20  buffer */.  int 
227a0 6e 42 79 74 65 2c 20 20 20 20 20 20 20 20 20 20  nByte,          
227b0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
227c0 6f 66 20 62 79 74 65 73 20 74 6f 20 63 6f 70 79  of bytes to copy
227d0 20 2a 2f 0a 20 20 69 6e 74 20 65 4f 70 2c 20 20   */.  int eOp,  
227e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
227f0 2f 2a 20 30 20 2d 3e 20 63 6f 70 79 20 66 72 6f  /* 0 -> copy fro
22800 6d 20 70 61 67 65 2c 20 31 20 2d 3e 20 63 6f 70  m page, 1 -> cop
22810 79 20 74 6f 20 70 61 67 65 20 2a 2f 0a 20 20 44  y to page */.  D
22820 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 20 20  bPage *pDbPage  
22830 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
22840 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70 50 61 79   containing pPay
22850 6c 6f 61 64 20 2a 2f 0a 29 7b 0a 20 20 69 66 28  load */.){.  if(
22860 20 65 4f 70 20 29 7b 0a 20 20 20 20 2f 2a 20 43   eOp ){.    /* C
22870 6f 70 79 20 64 61 74 61 20 66 72 6f 6d 20 62 75  opy data from bu
22880 66 66 65 72 20 74 6f 20 70 61 67 65 20 28 61 20  ffer to page (a 
22890 77 72 69 74 65 20 6f 70 65 72 61 74 69 6f 6e 29  write operation)
228a0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 63 20 3d   */.    int rc =
228b0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
228c0 74 65 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20  te(pDbPage);.   
228d0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
228e0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  OK ){.      retu
228f0 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
22900 20 6d 65 6d 63 70 79 28 70 50 61 79 6c 6f 61 64   memcpy(pPayload
22910 2c 20 70 42 75 66 2c 20 6e 42 79 74 65 29 3b 0a  , pBuf, nByte);.
22920 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
22930 43 6f 70 79 20 64 61 74 61 20 66 72 6f 6d 20 70  Copy data from p
22940 61 67 65 20 74 6f 20 62 75 66 66 65 72 20 28 61  age to buffer (a
22950 20 72 65 61 64 20 6f 70 65 72 61 74 69 6f 6e 29   read operation)
22960 20 2a 2f 0a 20 20 20 20 6d 65 6d 63 70 79 28 70   */.    memcpy(p
22970 42 75 66 2c 20 70 50 61 79 6c 6f 61 64 2c 20 6e  Buf, pPayload, n
22980 42 79 74 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74  Byte);.  }.  ret
22990 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
229a0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
229b0 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f  ction is used to
229c0 20 72 65 61 64 20 6f 72 20 6f 76 65 72 77 72 69   read or overwri
229d0 74 65 20 70 61 79 6c 6f 61 64 20 69 6e 66 6f 72  te payload infor
229e0 6d 61 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20 74 68  mation.** for th
229f0 65 20 65 6e 74 72 79 20 74 68 61 74 20 74 68 65  e entry that the
22a00 20 70 43 75 72 20 63 75 72 73 6f 72 20 69 73 20   pCur cursor is 
22a10 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 54 68 65  pointing to. The
22a20 20 65 4f 70 0a 2a 2a 20 61 72 67 75 6d 65 6e 74   eOp.** argument
22a30 20 69 73 20 69 6e 74 65 72 70 72 65 74 65 64 20   is interpreted 
22a40 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  as follows:.**.*
22a50 2a 20 20 20 30 3a 20 54 68 65 20 6f 70 65 72 61  *   0: The opera
22a60 74 69 6f 6e 20 69 73 20 61 20 72 65 61 64 2e 20  tion is a read. 
22a70 50 6f 70 75 6c 61 74 65 20 74 68 65 20 6f 76 65  Populate the ove
22a80 72 66 6c 6f 77 20 63 61 63 68 65 2e 0a 2a 2a 20  rflow cache..** 
22a90 20 20 31 3a 20 54 68 65 20 6f 70 65 72 61 74 69    1: The operati
22aa0 6f 6e 20 69 73 20 61 20 77 72 69 74 65 2e 20 50  on is a write. P
22ab0 6f 70 75 6c 61 74 65 20 74 68 65 20 6f 76 65 72  opulate the over
22ac0 66 6c 6f 77 20 63 61 63 68 65 2e 0a 2a 2a 20 20  flow cache..**  
22ad0 20 32 3a 20 54 68 65 20 6f 70 65 72 61 74 69 6f   2: The operatio
22ae0 6e 20 69 73 20 61 20 72 65 61 64 2e 20 44 6f 20  n is a read. Do 
22af0 6e 6f 74 20 70 6f 70 75 6c 61 74 65 20 74 68 65  not populate the
22b00 20 6f 76 65 72 66 6c 6f 77 20 63 61 63 68 65 2e   overflow cache.
22b10 0a 2a 2a 0a 2a 2a 20 41 20 74 6f 74 61 6c 20 6f  .**.** A total o
22b20 66 20 22 61 6d 74 22 20 62 79 74 65 73 20 61 72  f "amt" bytes ar
22b30 65 20 72 65 61 64 20 6f 72 20 77 72 69 74 74 65  e read or writte
22b40 6e 20 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 22  n beginning at "
22b50 6f 66 66 73 65 74 22 2e 0a 2a 2a 20 44 61 74 61  offset"..** Data
22b60 20 69 73 20 72 65 61 64 20 74 6f 20 6f 72 20 66   is read to or f
22b70 72 6f 6d 20 74 68 65 20 62 75 66 66 65 72 20 70  rom the buffer p
22b80 42 75 66 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  Buf..**.** The c
22b90 6f 6e 74 65 6e 74 20 62 65 69 6e 67 20 72 65 61  ontent being rea
22ba0 64 20 6f 72 20 77 72 69 74 74 65 6e 20 6d 69 67  d or written mig
22bb0 68 74 20 61 70 70 65 61 72 20 6f 6e 20 74 68 65  ht appear on the
22bc0 20 6d 61 69 6e 20 70 61 67 65 0a 2a 2a 20 6f 72   main page.** or
22bd0 20 62 65 20 73 63 61 74 74 65 72 65 64 20 6f 75   be scattered ou
22be0 74 20 6f 6e 20 6d 75 6c 74 69 70 6c 65 20 6f 76  t on multiple ov
22bf0 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 0a 2a 2a  erflow pages..**
22c00 0a 2a 2a 20 49 66 20 74 68 65 20 63 75 72 72 65  .** If the curre
22c10 6e 74 20 63 75 72 73 6f 72 20 65 6e 74 72 79 20  nt cursor entry 
22c20 75 73 65 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  uses one or more
22c30 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20   overflow pages 
22c40 61 6e 64 20 74 68 65 0a 2a 2a 20 65 4f 70 20 61  and the.** eOp a
22c50 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 74 20 32  rgument is not 2
22c60 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
22c70 6d 61 79 20 61 6c 6c 6f 63 61 74 65 20 73 70 61  may allocate spa
22c80 63 65 20 66 6f 72 20 61 6e 64 20 6c 61 7a 69 6c  ce for and lazil
22c90 79 20 0a 2a 2a 20 70 6f 70 75 6c 61 74 65 73 20  y .** populates 
22ca0 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  the overflow pag
22cb0 65 2d 6c 69 73 74 20 63 61 63 68 65 20 61 72 72  e-list cache arr
22cc0 61 79 20 28 42 74 43 75 72 73 6f 72 2e 61 4f 76  ay (BtCursor.aOv
22cd0 65 72 66 6c 6f 77 29 2e 20 0a 2a 2a 20 53 75 62  erflow). .** Sub
22ce0 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 75 73  sequent calls us
22cf0 65 20 74 68 69 73 20 63 61 63 68 65 20 74 6f 20  e this cache to 
22d00 6d 61 6b 65 20 73 65 65 6b 69 6e 67 20 74 6f 20  make seeking to 
22d10 74 68 65 20 73 75 70 70 6c 69 65 64 20 6f 66 66  the supplied off
22d20 73 65 74 20 0a 2a 2a 20 6d 6f 72 65 20 65 66 66  set .** more eff
22d30 69 63 69 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e  icient..**.** On
22d40 63 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70  ce an overflow p
22d50 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 20 68  age-list cache h
22d60 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65  as been allocate
22d70 64 2c 20 69 74 20 6d 61 79 20 62 65 0a 2a 2a 20  d, it may be.** 
22d80 69 6e 76 61 6c 69 64 61 74 65 64 20 69 66 20 73  invalidated if s
22d90 6f 6d 65 20 6f 74 68 65 72 20 63 75 72 73 6f 72  ome other cursor
22da0 20 77 72 69 74 65 73 20 74 6f 20 74 68 65 20 73   writes to the s
22db0 61 6d 65 20 74 61 62 6c 65 2c 20 6f 72 20 69 66  ame table, or if
22dc0 0a 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 20 69  .** the cursor i
22dd0 73 20 6d 6f 76 65 64 20 74 6f 20 61 20 64 69 66  s moved to a dif
22de0 66 65 72 65 6e 74 20 72 6f 77 2e 20 41 64 64 69  ferent row. Addi
22df0 74 69 6f 6e 61 6c 6c 79 2c 20 69 6e 20 61 75 74  tionally, in aut
22e00 6f 2d 76 61 63 75 75 6d 0a 2a 2a 20 6d 6f 64 65  o-vacuum.** mode
22e10 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  , the following 
22e20 65 76 65 6e 74 73 20 6d 61 79 20 69 6e 76 61 6c  events may inval
22e30 69 64 61 74 65 20 61 6e 20 6f 76 65 72 66 6c 6f  idate an overflo
22e40 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68  w page-list cach
22e50 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 41 6e 20  e..**.**   * An 
22e60 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75  incremental vacu
22e70 75 6d 2c 0a 2a 2a 20 20 20 2a 20 41 20 63 6f 6d  um,.**   * A com
22e80 6d 69 74 20 69 6e 20 61 75 74 6f 5f 76 61 63 75  mit in auto_vacu
22e90 75 6d 3d 22 66 75 6c 6c 22 20 6d 6f 64 65 2c 0a  um="full" mode,.
22ea0 2a 2a 20 20 20 2a 20 43 72 65 61 74 69 6e 67 20  **   * Creating 
22eb0 61 20 74 61 62 6c 65 20 28 6d 61 79 20 72 65 71  a table (may req
22ec0 75 69 72 65 20 6d 6f 76 69 6e 67 20 61 6e 20 6f  uire moving an o
22ed0 76 65 72 66 6c 6f 77 20 70 61 67 65 29 2e 0a 2a  verflow page)..*
22ee0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 63 63  /.static int acc
22ef0 65 73 73 50 61 79 6c 6f 61 64 28 0a 20 20 42 74  essPayload(.  Bt
22f00 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20  Cursor *pCur,   
22f10 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 70 6f 69     /* Cursor poi
22f20 6e 74 69 6e 67 20 74 6f 20 65 6e 74 72 79 20 74  nting to entry t
22f30 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20  o read from */. 
22f40 20 75 33 32 20 6f 66 66 73 65 74 2c 20 20 20 20   u32 offset,    
22f50 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 72        /* Begin r
22f60 65 61 64 69 6e 67 20 74 68 69 73 20 66 61 72 20  eading this far 
22f70 69 6e 74 6f 20 70 61 79 6c 6f 61 64 20 2a 2f 0a  into payload */.
22f80 20 20 75 33 32 20 61 6d 74 2c 20 20 20 20 20 20    u32 amt,      
22f90 20 20 20 20 20 20 20 2f 2a 20 52 65 61 64 20 74         /* Read t
22fa0 68 69 73 20 6d 61 6e 79 20 62 79 74 65 73 20 2a  his many bytes *
22fb0 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
22fc0 72 20 2a 70 42 75 66 2c 20 2f 2a 20 57 72 69 74  r *pBuf, /* Writ
22fd0 65 20 74 68 65 20 62 79 74 65 73 20 69 6e 74 6f  e the bytes into
22fe0 20 74 68 69 73 20 62 75 66 66 65 72 20 2a 2f 20   this buffer */ 
22ff0 0a 20 20 69 6e 74 20 65 4f 70 20 20 20 20 20 20  .  int eOp      
23000 20 20 20 20 20 20 20 20 2f 2a 20 7a 65 72 6f 20          /* zero 
23010 74 6f 20 72 65 61 64 2e 20 6e 6f 6e 2d 7a 65 72  to read. non-zer
23020 6f 20 74 6f 20 77 72 69 74 65 2e 20 2a 2f 0a 29  o to write. */.)
23030 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  {.  unsigned cha
23040 72 20 2a 61 50 61 79 6c 6f 61 64 3b 0a 20 20 69  r *aPayload;.  i
23050 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
23060 4b 3b 0a 20 20 69 6e 74 20 69 49 64 78 20 3d 20  K;.  int iIdx = 
23070 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  0;.  MemPage *pP
23080 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61  age = pCur->apPa
23090 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b  ge[pCur->iPage];
230a0 20 2f 2a 20 42 74 72 65 65 20 70 61 67 65 20 6f   /* Btree page o
230b0 66 20 63 75 72 72 65 6e 74 20 65 6e 74 72 79 20  f current entry 
230c0 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  */.  BtShared *p
230d0 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b 20  Bt = pCur->pBt; 
230e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
230f0 20 2f 2a 20 42 74 72 65 65 20 74 68 69 73 20 63   /* Btree this c
23100 75 72 73 6f 72 20 62 65 6c 6f 6e 67 73 20 74 6f  ursor belongs to
23110 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
23120 45 5f 44 49 52 45 43 54 5f 4f 56 45 52 46 4c 4f  E_DIRECT_OVERFLO
23130 57 5f 52 45 41 44 0a 20 20 75 6e 73 69 67 6e 65  W_READ.  unsigne
23140 64 20 63 68 61 72 20 2a 20 63 6f 6e 73 74 20 70  d char * const p
23150 42 75 66 53 74 61 72 74 20 3d 20 70 42 75 66 3b  BufStart = pBuf;
23160 0a 20 20 69 6e 74 20 62 45 6e 64 3b 20 20 20 20  .  int bEnd;    
23170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23180 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23190 54 72 75 65 20 69 66 20 72 65 61 64 69 6e 67 20  True if reading 
231a0 74 6f 20 65 6e 64 20 6f 66 20 64 61 74 61 20 2a  to end of data *
231b0 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65  /.#endif..  asse
231c0 72 74 28 20 70 50 61 67 65 20 29 3b 0a 20 20 61  rt( pPage );.  a
231d0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
231e0 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
231f0 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  D );.  assert( p
23200 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
23210 3e 69 50 61 67 65 5d 3c 70 50 61 67 65 2d 3e 6e  >iPage]<pPage->n
23220 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74  Cell );.  assert
23230 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
23240 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ex(pCur) );.  as
23250 73 65 72 74 28 20 65 4f 70 21 3d 32 20 7c 7c 20  sert( eOp!=2 || 
23260 6f 66 66 73 65 74 3d 3d 30 20 29 3b 20 20 20 20  offset==0 );    
23270 2f 2a 20 41 6c 77 61 79 73 20 73 74 61 72 74 20  /* Always start 
23280 66 72 6f 6d 20 62 65 67 69 6e 6e 69 6e 67 20 66  from beginning f
23290 6f 72 20 65 4f 70 3d 3d 32 20 2a 2f 0a 0a 20 20  or eOp==2 */..  
232a0 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72  getCellInfo(pCur
232b0 29 3b 0a 20 20 61 50 61 79 6c 6f 61 64 20 3d 20  );.  aPayload = 
232c0 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c  pCur->info.pPayl
232d0 6f 61 64 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  oad;.#ifdef SQLI
232e0 54 45 5f 44 49 52 45 43 54 5f 4f 56 45 52 46 4c  TE_DIRECT_OVERFL
232f0 4f 57 5f 52 45 41 44 0a 20 20 62 45 6e 64 20 3d  OW_READ.  bEnd =
23300 20 6f 66 66 73 65 74 2b 61 6d 74 3d 3d 70 43 75   offset+amt==pCu
23310 72 2d 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64  r->info.nPayload
23320 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72  ;.#endif.  asser
23330 74 28 20 6f 66 66 73 65 74 2b 61 6d 74 20 3c 3d  t( offset+amt <=
23340 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50 61 79   pCur->info.nPay
23350 6c 6f 61 64 20 29 3b 0a 0a 20 20 69 66 28 20 26  load );..  if( &
23360 61 50 61 79 6c 6f 61 64 5b 70 43 75 72 2d 3e 69  aPayload[pCur->i
23370 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d 20 3e 20 26 70  nfo.nLocal] > &p
23380 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d  Page->aData[pBt-
23390 3e 75 73 61 62 6c 65 53 69 7a 65 5d 20 29 7b 0a  >usableSize] ){.
233a0 20 20 20 20 2f 2a 20 54 72 79 69 6e 67 20 74 6f      /* Trying to
233b0 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 70   read or write p
233c0 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74  ast the end of t
233d0 68 65 20 64 61 74 61 20 69 73 20 61 6e 20 65 72  he data is an er
233e0 72 6f 72 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  ror */.    retur
233f0 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
23400 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  _BKPT;.  }..  /*
23410 20 43 68 65 63 6b 20 69 66 20 64 61 74 61 20 6d   Check if data m
23420 75 73 74 20 62 65 20 72 65 61 64 2f 77 72 69 74  ust be read/writ
23430 74 65 6e 20 74 6f 2f 66 72 6f 6d 20 74 68 65 20  ten to/from the 
23440 62 74 72 65 65 20 70 61 67 65 20 69 74 73 65 6c  btree page itsel
23450 66 2e 20 2a 2f 0a 20 20 69 66 28 20 6f 66 66 73  f. */.  if( offs
23460 65 74 3c 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c  et<pCur->info.nL
23470 6f 63 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20  ocal ){.    int 
23480 61 20 3d 20 61 6d 74 3b 0a 20 20 20 20 69 66 28  a = amt;.    if(
23490 20 61 2b 6f 66 66 73 65 74 3e 70 43 75 72 2d 3e   a+offset>pCur->
234a0 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20  info.nLocal ){. 
234b0 20 20 20 20 20 61 20 3d 20 70 43 75 72 2d 3e 69       a = pCur->i
234c0 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2d 20 6f 66 66  nfo.nLocal - off
234d0 73 65 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  set;.    }.    r
234e0 63 20 3d 20 63 6f 70 79 50 61 79 6c 6f 61 64 28  c = copyPayload(
234f0 26 61 50 61 79 6c 6f 61 64 5b 6f 66 66 73 65 74  &aPayload[offset
23500 5d 2c 20 70 42 75 66 2c 20 61 2c 20 28 65 4f 70  ], pBuf, a, (eOp
23510 20 26 20 30 78 30 31 29 2c 20 70 50 61 67 65 2d   & 0x01), pPage-
23520 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 6f  >pDbPage);.    o
23530 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 70  ffset = 0;.    p
23540 42 75 66 20 2b 3d 20 61 3b 0a 20 20 20 20 61 6d  Buf += a;.    am
23550 74 20 2d 3d 20 61 3b 0a 20 20 7d 65 6c 73 65 7b  t -= a;.  }else{
23560 0a 20 20 20 20 6f 66 66 73 65 74 20 2d 3d 20 70  .    offset -= p
23570 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  Cur->info.nLocal
23580 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d  ;.  }..  if( rc=
23590 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d  =SQLITE_OK && am
235a0 74 3e 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74  t>0 ){.    const
235b0 20 75 33 32 20 6f 76 66 6c 53 69 7a 65 20 3d 20   u32 ovflSize = 
235c0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
235d0 2d 20 34 3b 20 20 2f 2a 20 42 79 74 65 73 20 63  - 4;  /* Bytes c
235e0 6f 6e 74 65 6e 74 20 70 65 72 20 6f 76 66 6c 20  ontent per ovfl 
235f0 70 61 67 65 20 2a 2f 0a 20 20 20 20 50 67 6e 6f  page */.    Pgno
23600 20 6e 65 78 74 50 61 67 65 3b 0a 0a 20 20 20 20   nextPage;..    
23610 6e 65 78 74 50 61 67 65 20 3d 20 67 65 74 34 62  nextPage = get4b
23620 79 74 65 28 26 61 50 61 79 6c 6f 61 64 5b 70 43  yte(&aPayload[pC
23630 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d  ur->info.nLocal]
23640 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  );..    /* If th
23650 65 20 42 74 43 75 72 73 6f 72 2e 61 4f 76 65 72  e BtCursor.aOver
23660 66 6c 6f 77 5b 5d 20 68 61 73 20 6e 6f 74 20 62  flow[] has not b
23670 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c 20 61  een allocated, a
23680 6c 6c 6f 63 61 74 65 20 69 74 20 6e 6f 77 2e 0a  llocate it now..
23690 20 20 20 20 2a 2a 20 45 78 63 65 70 74 2c 20 64      ** Except, d
236a0 6f 20 6e 6f 74 20 61 6c 6c 6f 63 61 74 65 20 61  o not allocate a
236b0 4f 76 65 72 66 6c 6f 77 5b 5d 20 66 6f 72 20 65  Overflow[] for e
236c0 4f 70 3d 3d 32 2e 0a 20 20 20 20 2a 2a 0a 20 20  Op==2..    **.  
236d0 20 20 2a 2a 20 54 68 65 20 61 4f 76 65 72 66 6c    ** The aOverfl
236e0 6f 77 5b 5d 20 61 72 72 61 79 20 69 73 20 73 69  ow[] array is si
236f0 7a 65 64 20 61 74 20 6f 6e 65 20 65 6e 74 72 79  zed at one entry
23700 20 66 6f 72 20 65 61 63 68 20 6f 76 65 72 66 6c   for each overfl
23710 6f 77 20 70 61 67 65 0a 20 20 20 20 2a 2a 20 69  ow page.    ** i
23720 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63  n the overflow c
23730 68 61 69 6e 2e 20 54 68 65 20 70 61 67 65 20 6e  hain. The page n
23740 75 6d 62 65 72 20 6f 66 20 74 68 65 20 66 69 72  umber of the fir
23750 73 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  st overflow page
23760 20 69 73 0a 20 20 20 20 2a 2a 20 73 74 6f 72 65   is.    ** store
23770 64 20 69 6e 20 61 4f 76 65 72 66 6c 6f 77 5b 30  d in aOverflow[0
23780 5d 2c 20 65 74 63 2e 20 41 20 76 61 6c 75 65 20  ], etc. A value 
23790 6f 66 20 30 20 69 6e 20 74 68 65 20 61 4f 76 65  of 0 in the aOve
237a0 72 66 6c 6f 77 5b 5d 20 61 72 72 61 79 0a 20 20  rflow[] array.  
237b0 20 20 2a 2a 20 6d 65 61 6e 73 20 22 6e 6f 74 20    ** means "not 
237c0 79 65 74 20 6b 6e 6f 77 6e 22 20 28 74 68 65 20  yet known" (the 
237d0 63 61 63 68 65 20 69 73 20 6c 61 7a 69 6c 79 20  cache is lazily 
237e0 70 6f 70 75 6c 61 74 65 64 29 2e 0a 20 20 20 20  populated)..    
237f0 2a 2f 0a 20 20 20 20 69 66 28 20 65 4f 70 21 3d  */.    if( eOp!=
23800 32 20 26 26 20 28 70 43 75 72 2d 3e 63 75 72 46  2 && (pCur->curF
23810 6c 61 67 73 20 26 20 42 54 43 46 5f 56 61 6c 69  lags & BTCF_Vali
23820 64 4f 76 66 6c 29 3d 3d 30 20 29 7b 0a 20 20 20  dOvfl)==0 ){.   
23830 20 20 20 69 6e 74 20 6e 4f 76 66 6c 20 3d 20 28     int nOvfl = (
23840 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50 61 79 6c  pCur->info.nPayl
23850 6f 61 64 2d 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  oad-pCur->info.n
23860 4c 6f 63 61 6c 2b 6f 76 66 6c 53 69 7a 65 2d 31  Local+ovflSize-1
23870 29 2f 6f 76 66 6c 53 69 7a 65 3b 0a 20 20 20 20  )/ovflSize;.    
23880 20 20 69 66 28 20 6e 4f 76 66 6c 3e 70 43 75 72    if( nOvfl>pCur
23890 2d 3e 6e 4f 76 66 6c 41 6c 6c 6f 63 20 29 7b 0a  ->nOvflAlloc ){.
238a0 20 20 20 20 20 20 20 20 50 67 6e 6f 20 2a 61 4e          Pgno *aN
238b0 65 77 20 3d 20 28 50 67 6e 6f 2a 29 73 71 6c 69  ew = (Pgno*)sqli
238c0 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 0a 20 20  te3DbRealloc(.  
238d0 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e            pCur->
238e0 70 42 74 72 65 65 2d 3e 64 62 2c 20 70 43 75 72  pBtree->db, pCur
238f0 2d 3e 61 4f 76 65 72 66 6c 6f 77 2c 20 6e 4f 76  ->aOverflow, nOv
23900 66 6c 2a 32 2a 73 69 7a 65 6f 66 28 50 67 6e 6f  fl*2*sizeof(Pgno
23910 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20  ).        );.   
23920 20 20 20 20 20 69 66 28 20 61 4e 65 77 3d 3d 30       if( aNew==0
23930 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
23940 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
23950 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
23960 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e            pCur->
23970 6e 4f 76 66 6c 41 6c 6c 6f 63 20 3d 20 6e 4f 76  nOvflAlloc = nOv
23980 66 6c 2a 32 3b 0a 20 20 20 20 20 20 20 20 20 20  fl*2;.          
23990 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20  pCur->aOverflow 
239a0 3d 20 61 4e 65 77 3b 0a 20 20 20 20 20 20 20 20  = aNew;.        
239b0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
239c0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
239d0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d  K ){.        mem
239e0 73 65 74 28 70 43 75 72 2d 3e 61 4f 76 65 72 66  set(pCur->aOverf
239f0 6c 6f 77 2c 20 30 2c 20 6e 4f 76 66 6c 2a 73 69  low, 0, nOvfl*si
23a00 7a 65 6f 66 28 50 67 6e 6f 29 29 3b 0a 20 20 20  zeof(Pgno));.   
23a10 20 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c       pCur->curFl
23a20 61 67 73 20 7c 3d 20 42 54 43 46 5f 56 61 6c 69  ags |= BTCF_Vali
23a30 64 4f 76 66 6c 3b 0a 20 20 20 20 20 20 7d 0a 20  dOvfl;.      }. 
23a40 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
23a50 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  the overflow pag
23a60 65 2d 6c 69 73 74 20 63 61 63 68 65 20 68 61 73  e-list cache has
23a70 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20   been allocated 
23a80 61 6e 64 20 74 68 65 0a 20 20 20 20 2a 2a 20 65  and the.    ** e
23a90 6e 74 72 79 20 66 6f 72 20 74 68 65 20 66 69 72  ntry for the fir
23aa0 73 74 20 72 65 71 75 69 72 65 64 20 6f 76 65 72  st required over
23ab0 66 6c 6f 77 20 70 61 67 65 20 69 73 20 76 61 6c  flow page is val
23ac0 69 64 2c 20 73 6b 69 70 0a 20 20 20 20 2a 2a 20  id, skip.    ** 
23ad0 64 69 72 65 63 74 6c 79 20 74 6f 20 69 74 2e 0a  directly to it..
23ae0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28      */.    if( (
23af0 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26  pCur->curFlags &
23b00 20 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29   BTCF_ValidOvfl)
23b10 21 3d 30 0a 20 20 20 20 20 26 26 20 70 43 75 72  !=0.     && pCur
23b20 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 6f 66 66 73  ->aOverflow[offs
23b30 65 74 2f 6f 76 66 6c 53 69 7a 65 5d 0a 20 20 20  et/ovflSize].   
23b40 20 29 7b 0a 20 20 20 20 20 20 69 49 64 78 20 3d   ){.      iIdx =
23b50 20 28 6f 66 66 73 65 74 2f 6f 76 66 6c 53 69 7a   (offset/ovflSiz
23b60 65 29 3b 0a 20 20 20 20 20 20 6e 65 78 74 50 61  e);.      nextPa
23b70 67 65 20 3d 20 70 43 75 72 2d 3e 61 4f 76 65 72  ge = pCur->aOver
23b80 66 6c 6f 77 5b 69 49 64 78 5d 3b 0a 20 20 20 20  flow[iIdx];.    
23b90 20 20 6f 66 66 73 65 74 20 3d 20 28 6f 66 66 73    offset = (offs
23ba0 65 74 25 6f 76 66 6c 53 69 7a 65 29 3b 0a 20 20  et%ovflSize);.  
23bb0 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28 20 3b 20    }..    for( ; 
23bc0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
23bd0 20 61 6d 74 3e 30 20 26 26 20 6e 65 78 74 50 61   amt>0 && nextPa
23be0 67 65 3b 20 69 49 64 78 2b 2b 29 7b 0a 0a 20 20  ge; iIdx++){..  
23bf0 20 20 20 20 2f 2a 20 49 66 20 72 65 71 75 69 72      /* If requir
23c00 65 64 2c 20 70 6f 70 75 6c 61 74 65 20 74 68 65  ed, populate the
23c10 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c   overflow page-l
23c20 69 73 74 20 63 61 63 68 65 2e 20 2a 2f 0a 20 20  ist cache. */.  
23c30 20 20 20 20 69 66 28 20 28 70 43 75 72 2d 3e 63      if( (pCur->c
23c40 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 56  urFlags & BTCF_V
23c50 61 6c 69 64 4f 76 66 6c 29 21 3d 30 20 29 7b 0a  alidOvfl)!=0 ){.
23c60 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 21          assert(!
23c70 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b  pCur->aOverflow[
23c80 69 49 64 78 5d 20 7c 7c 20 70 43 75 72 2d 3e 61  iIdx] || pCur->a
23c90 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 3d 3d  Overflow[iIdx]==
23ca0 6e 65 78 74 50 61 67 65 29 3b 0a 20 20 20 20 20  nextPage);.     
23cb0 20 20 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c     pCur->aOverfl
23cc0 6f 77 5b 69 49 64 78 5d 20 3d 20 6e 65 78 74 50  ow[iIdx] = nextP
23cd0 61 67 65 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  age;.      }..  
23ce0 20 20 20 20 69 66 28 20 6f 66 66 73 65 74 3e 3d      if( offset>=
23cf0 6f 76 66 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20  ovflSize ){.    
23d00 20 20 20 20 2f 2a 20 54 68 65 20 6f 6e 6c 79 20      /* The only 
23d10 72 65 61 73 6f 6e 20 74 6f 20 72 65 61 64 20 74  reason to read t
23d20 68 69 73 20 70 61 67 65 20 69 73 20 74 6f 20 6f  his page is to o
23d30 62 74 61 69 6e 20 74 68 65 20 70 61 67 65 0a 20  btain the page. 
23d40 20 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72         ** number
23d50 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20 70 61   for the next pa
23d60 67 65 20 69 6e 20 74 68 65 20 6f 76 65 72 66 6c  ge in the overfl
23d70 6f 77 20 63 68 61 69 6e 2e 20 54 68 65 20 70 61  ow chain. The pa
23d80 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 61  ge.        ** da
23d90 74 61 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72  ta is not requir
23da0 65 64 2e 20 53 6f 20 66 69 72 73 74 20 74 72 79  ed. So first try
23db0 20 74 6f 20 6c 6f 6f 6b 75 70 20 74 68 65 20 6f   to lookup the o
23dc0 76 65 72 66 6c 6f 77 0a 20 20 20 20 20 20 20 20  verflow.        
23dd0 2a 2a 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63  ** page-list cac
23de0 68 65 2c 20 69 66 20 61 6e 79 2c 20 74 68 65 6e  he, if any, then
23df0 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20 74 68   fall back to th
23e00 65 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67  e getOverflowPag
23e10 65 28 29 0a 20 20 20 20 20 20 20 20 2a 2a 20 66  e().        ** f
23e20 75 6e 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 20  unction..       
23e30 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 4e   **.        ** N
23e40 6f 74 65 20 74 68 61 74 20 74 68 65 20 61 4f 76  ote that the aOv
23e50 65 72 66 6c 6f 77 5b 5d 20 61 72 72 61 79 20 6d  erflow[] array m
23e60 75 73 74 20 62 65 20 61 6c 6c 6f 63 61 74 65 64  ust be allocated
23e70 20 62 65 63 61 75 73 65 20 65 4f 70 21 3d 32 0a   because eOp!=2.
23e80 20 20 20 20 20 20 20 20 2a 2a 20 68 65 72 65 2e          ** here.
23e90 20 20 49 66 20 65 4f 70 3d 3d 32 2c 20 74 68 65    If eOp==2, the
23ea0 6e 20 6f 66 66 73 65 74 3d 3d 30 20 61 6e 64 20  n offset==0 and 
23eb0 74 68 69 73 20 62 72 61 6e 63 68 20 69 73 20 6e  this branch is n
23ec0 65 76 65 72 20 74 61 6b 65 6e 2e 0a 20 20 20 20  ever taken..    
23ed0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61      */.        a
23ee0 73 73 65 72 74 28 20 65 4f 70 21 3d 32 20 29 3b  ssert( eOp!=2 );
23ef0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
23f00 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20   pCur->curFlags 
23f10 26 20 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c  & BTCF_ValidOvfl
23f20 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
23f30 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b  pCur->aOverflow[
23f40 69 49 64 78 2b 31 5d 20 29 7b 0a 20 20 20 20 20  iIdx+1] ){.     
23f50 20 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20       nextPage = 
23f60 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b  pCur->aOverflow[
23f70 69 49 64 78 2b 31 5d 3b 0a 20 20 20 20 20 20 20  iIdx+1];.       
23f80 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
23f90 20 20 72 63 20 3d 20 67 65 74 4f 76 65 72 66 6c    rc = getOverfl
23fa0 6f 77 50 61 67 65 28 70 42 74 2c 20 6e 65 78 74  owPage(pBt, next
23fb0 50 61 67 65 2c 20 30 2c 20 26 6e 65 78 74 50 61  Page, 0, &nextPa
23fc0 67 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ge);.        }. 
23fd0 20 20 20 20 20 20 20 6f 66 66 73 65 74 20 2d 3d         offset -=
23fe0 20 6f 76 66 6c 53 69 7a 65 3b 0a 20 20 20 20 20   ovflSize;.     
23ff0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
24000 2f 2a 20 4e 65 65 64 20 74 6f 20 72 65 61 64 20  /* Need to read 
24010 74 68 69 73 20 70 61 67 65 20 70 72 6f 70 65 72  this page proper
24020 6c 79 2e 20 49 74 20 63 6f 6e 74 61 69 6e 73 20  ly. It contains 
24030 73 6f 6d 65 20 6f 66 20 74 68 65 0a 20 20 20 20  some of the.    
24040 20 20 20 20 2a 2a 20 72 61 6e 67 65 20 6f 66 20      ** range of 
24050 64 61 74 61 20 74 68 61 74 20 69 73 20 62 65 69  data that is bei
24060 6e 67 20 72 65 61 64 20 28 65 4f 70 3d 3d 30 29  ng read (eOp==0)
24070 20 6f 72 20 77 72 69 74 74 65 6e 20 28 65 4f 70   or written (eOp
24080 21 3d 30 29 2e 0a 20 20 20 20 20 20 20 20 2a 2f  !=0)..        */
24090 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
240a0 49 52 45 43 54 5f 4f 56 45 52 46 4c 4f 57 5f 52  IRECT_OVERFLOW_R
240b0 45 41 44 0a 20 20 20 20 20 20 20 20 73 71 6c 69  EAD.        sqli
240c0 74 65 33 5f 66 69 6c 65 20 2a 66 64 3b 0a 23 65  te3_file *fd;.#e
240d0 6e 64 69 66 0a 20 20 20 20 20 20 20 20 69 6e 74  ndif.        int
240e0 20 61 20 3d 20 61 6d 74 3b 0a 20 20 20 20 20 20   a = amt;.      
240f0 20 20 69 66 28 20 61 20 2b 20 6f 66 66 73 65 74    if( a + offset
24100 20 3e 20 6f 76 66 6c 53 69 7a 65 20 29 7b 0a 20   > ovflSize ){. 
24110 20 20 20 20 20 20 20 20 20 61 20 3d 20 6f 76 66           a = ovf
24120 6c 53 69 7a 65 20 2d 20 6f 66 66 73 65 74 3b 0a  lSize - offset;.
24130 20 20 20 20 20 20 20 20 7d 0a 0a 23 69 66 64 65          }..#ifde
24140 66 20 53 51 4c 49 54 45 5f 44 49 52 45 43 54 5f  f SQLITE_DIRECT_
24150 4f 56 45 52 46 4c 4f 57 5f 52 45 41 44 0a 20 20  OVERFLOW_READ.  
24160 20 20 20 20 20 20 2f 2a 20 49 66 20 61 6c 6c 20        /* If all 
24170 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72  the following ar
24180 65 20 74 72 75 65 3a 0a 20 20 20 20 20 20 20 20  e true:.        
24190 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  **.        **   
241a0 31 29 20 74 68 69 73 20 69 73 20 61 20 72 65 61  1) this is a rea
241b0 64 20 6f 70 65 72 61 74 69 6f 6e 2c 20 61 6e 64  d operation, and
241c0 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 32   .        **   2
241d0 29 20 64 61 74 61 20 69 73 20 72 65 71 75 69 72  ) data is requir
241e0 65 64 20 66 72 6f 6d 20 74 68 65 20 73 74 61 72  ed from the star
241f0 74 20 6f 66 20 74 68 69 73 20 6f 76 65 72 66 6c  t of this overfl
24200 6f 77 20 70 61 67 65 2c 20 61 6e 64 0a 20 20 20  ow page, and.   
24210 20 20 20 20 20 2a 2a 20 20 20 33 29 20 74 68 65       **   3) the
24220 20 64 61 74 61 62 61 73 65 20 69 73 20 66 69 6c   database is fil
24230 65 2d 62 61 63 6b 65 64 2c 20 61 6e 64 0a 20 20  e-backed, and.  
24240 20 20 20 20 20 20 2a 2a 20 20 20 34 29 20 74 68        **   4) th
24250 65 72 65 20 69 73 20 6e 6f 20 6f 70 65 6e 20 77  ere is no open w
24260 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
24270 2c 20 61 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a  , and.        **
24280 20 20 20 35 29 20 74 68 65 20 64 61 74 61 62 61     5) the databa
24290 73 65 20 69 73 20 6e 6f 74 20 61 20 57 41 4c 20  se is not a WAL 
242a0 64 61 74 61 62 61 73 65 2c 0a 20 20 20 20 20 20  database,.      
242b0 20 20 2a 2a 20 20 20 36 29 20 61 6c 6c 20 64 61    **   6) all da
242c0 74 61 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65  ta from the page
242d0 20 69 73 20 62 65 69 6e 67 20 72 65 61 64 2e 0a   is being read..
242e0 20 20 20 20 20 20 20 20 2a 2a 20 20 20 37 29 20          **   7) 
242f0 61 74 20 6c 65 61 73 74 20 34 20 62 79 74 65 73  at least 4 bytes
24300 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65   have already be
24310 65 6e 20 72 65 61 64 20 69 6e 74 6f 20 74 68 65  en read into the
24320 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 20 0a   output buffer .
24330 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
24340 20 20 20 2a 2a 20 74 68 65 6e 20 64 61 74 61 20     ** then data 
24350 63 61 6e 20 62 65 20 72 65 61 64 20 64 69 72 65  can be read dire
24360 63 74 6c 79 20 66 72 6f 6d 20 74 68 65 20 64 61  ctly from the da
24370 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e 74 6f  tabase file into
24380 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
24390 6f 75 74 70 75 74 20 62 75 66 66 65 72 2c 20 62  output buffer, b
243a0 79 70 61 73 73 69 6e 67 20 74 68 65 20 70 61 67  ypassing the pag
243b0 65 2d 63 61 63 68 65 20 61 6c 74 6f 67 65 74 68  e-cache altogeth
243c0 65 72 2e 20 54 68 69 73 20 73 70 65 65 64 73 0a  er. This speeds.
243d0 20 20 20 20 20 20 20 20 2a 2a 20 75 70 20 6c 6f          ** up lo
243e0 61 64 69 6e 67 20 6c 61 72 67 65 20 72 65 63 6f  ading large reco
243f0 72 64 73 20 74 68 61 74 20 73 70 61 6e 20 6d 61  rds that span ma
24400 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  ny overflow page
24410 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  s..        */.  
24420 20 20 20 20 20 20 69 66 28 20 28 65 4f 70 26 30        if( (eOp&0
24430 78 30 31 29 3d 3d 30 20 20 20 20 20 20 20 20 20  x01)==0         
24440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24450 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24460 28 31 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  (1) */.         
24470 26 26 20 6f 66 66 73 65 74 3d 3d 30 20 20 20 20  && offset==0    
24480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
244a0 20 20 20 20 20 20 2f 2a 20 28 32 29 20 2a 2f 0a        /* (2) */.
244b0 20 20 20 20 20 20 20 20 20 26 26 20 28 62 45 6e           && (bEn
244c0 64 20 7c 7c 20 61 3d 3d 6f 76 66 6c 53 69 7a 65  d || a==ovflSize
244d0 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  )               
244e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
244f0 2a 20 28 36 29 20 2a 2f 0a 20 20 20 20 20 20 20  * (6) */.       
24500 20 20 26 26 20 70 42 74 2d 3e 69 6e 54 72 61 6e    && pBt->inTran
24510 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 52  saction==TRANS_R
24520 45 41 44 20 20 20 20 20 20 20 20 20 20 20 20 20  EAD             
24530 20 20 20 20 20 20 20 20 2f 2a 20 28 34 29 20 2a          /* (4) *
24540 2f 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 66  /.         && (f
24550 64 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  d = sqlite3Pager
24560 46 69 6c 65 28 70 42 74 2d 3e 70 50 61 67 65 72  File(pBt->pPager
24570 29 29 2d 3e 70 4d 65 74 68 6f 64 73 20 20 20 20  ))->pMethods    
24580 20 2f 2a 20 28 33 29 20 2a 2f 0a 20 20 20 20 20   /* (3) */.     
24590 20 20 20 20 26 26 20 70 42 74 2d 3e 70 50 61 67      && pBt->pPag
245a0 65 31 2d 3e 61 44 61 74 61 5b 31 39 5d 3d 3d 30  e1->aData[19]==0
245b0 78 30 31 20 20 20 20 20 20 20 20 20 20 20 20 20  x01             
245c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28 35 29            /* (5)
245d0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 26 26 20   */.         && 
245e0 26 70 42 75 66 5b 2d 34 5d 3e 3d 70 42 75 66 53  &pBuf[-4]>=pBufS
245f0 74 61 72 74 20 20 20 20 20 20 20 20 20 20 20 20  tart            
24600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24610 20 20 20 2f 2a 20 28 37 29 20 2a 2f 0a 20 20 20     /* (7) */.   
24620 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
24630 20 20 75 38 20 61 53 61 76 65 5b 34 5d 3b 0a 20    u8 aSave[4];. 
24640 20 20 20 20 20 20 20 20 20 75 38 20 2a 61 57 72           u8 *aWr
24650 69 74 65 20 3d 20 26 70 42 75 66 5b 2d 34 5d 3b  ite = &pBuf[-4];
24660 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
24670 74 28 20 61 57 72 69 74 65 3e 3d 70 42 75 66 53  t( aWrite>=pBufS
24680 74 61 72 74 20 29 3b 20 20 20 20 20 20 20 20 20  tart );         
24690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
246a0 2f 2a 20 68 65 6e 63 65 20 28 37 29 20 2a 2f 0a  /* hence (7) */.
246b0 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
246c0 28 61 53 61 76 65 2c 20 61 57 72 69 74 65 2c 20  (aSave, aWrite, 
246d0 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63  4);.          rc
246e0 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
246f0 28 66 64 2c 20 61 57 72 69 74 65 2c 20 61 2b 34  (fd, aWrite, a+4
24700 2c 20 28 69 36 34 29 70 42 74 2d 3e 70 61 67 65  , (i64)pBt->page
24710 53 69 7a 65 2a 28 6e 65 78 74 50 61 67 65 2d 31  Size*(nextPage-1
24720 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 65  ));.          ne
24730 78 74 50 61 67 65 20 3d 20 67 65 74 34 62 79 74  xtPage = get4byt
24740 65 28 61 57 72 69 74 65 29 3b 0a 20 20 20 20 20  e(aWrite);.     
24750 20 20 20 20 20 6d 65 6d 63 70 79 28 61 57 72 69       memcpy(aWri
24760 74 65 2c 20 61 53 61 76 65 2c 20 34 29 3b 0a 20  te, aSave, 4);. 
24770 20 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e         }else.#en
24780 64 69 66 0a 0a 20 20 20 20 20 20 20 20 7b 0a 20  dif..        {. 
24790 20 20 20 20 20 20 20 20 20 44 62 50 61 67 65 20           DbPage 
247a0 2a 70 44 62 50 61 67 65 3b 0a 20 20 20 20 20 20  *pDbPage;.      
247b0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
247c0 50 61 67 65 72 41 63 71 75 69 72 65 28 70 42 74  PagerAcquire(pBt
247d0 2d 3e 70 50 61 67 65 72 2c 20 6e 65 78 74 50 61  ->pPager, nextPa
247e0 67 65 2c 20 26 70 44 62 50 61 67 65 2c 0a 20 20  ge, &pDbPage,.  
247f0 20 20 20 20 20 20 20 20 20 20 20 20 28 28 65 4f              ((eO
24800 70 26 30 78 30 31 29 3d 3d 30 20 3f 20 50 41 47  p&0x01)==0 ? PAG
24810 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20  ER_GET_READONLY 
24820 3a 20 30 29 0a 20 20 20 20 20 20 20 20 20 20 29  : 0).          )
24830 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
24840 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
24850 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 50 61  .            aPa
24860 79 6c 6f 61 64 20 3d 20 73 71 6c 69 74 65 33 50  yload = sqlite3P
24870 61 67 65 72 47 65 74 44 61 74 61 28 70 44 62 50  agerGetData(pDbP
24880 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
24890 20 20 6e 65 78 74 50 61 67 65 20 3d 20 67 65 74    nextPage = get
248a0 34 62 79 74 65 28 61 50 61 79 6c 6f 61 64 29 3b  4byte(aPayload);
248b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
248c0 3d 20 63 6f 70 79 50 61 79 6c 6f 61 64 28 26 61  = copyPayload(&a
248d0 50 61 79 6c 6f 61 64 5b 6f 66 66 73 65 74 2b 34  Payload[offset+4
248e0 5d 2c 20 70 42 75 66 2c 20 61 2c 20 28 65 4f 70  ], pBuf, a, (eOp
248f0 26 30 78 30 31 29 2c 20 70 44 62 50 61 67 65 29  &0x01), pDbPage)
24900 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ;.            sq
24910 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
24920 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
24930 20 20 20 20 20 20 6f 66 66 73 65 74 20 3d 20 30        offset = 0
24940 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
24950 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
24960 61 6d 74 20 2d 3d 20 61 3b 0a 20 20 20 20 20 20  amt -= a;.      
24970 20 20 70 42 75 66 20 2b 3d 20 61 3b 0a 20 20 20    pBuf += a;.   
24980 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
24990 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
249a0 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20 29 7b 0a  _OK && amt>0 ){.
249b0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
249c0 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
249d0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
249e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 70  .}../*.** Read p
249f0 61 72 74 20 6f 66 20 74 68 65 20 6b 65 79 20 61  art of the key a
24a00 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 63  ssociated with c
24a10 75 72 73 6f 72 20 70 43 75 72 2e 20 20 45 78 61  ursor pCur.  Exa
24a20 63 74 6c 79 0a 2a 2a 20 22 61 6d 74 22 20 62 79  ctly.** "amt" by
24a30 74 65 73 20 77 69 6c 6c 20 62 65 20 74 72 61 6e  tes will be tran
24a40 73 66 65 72 72 65 64 20 69 6e 74 6f 20 70 42 75  sferred into pBu
24a50 66 5b 5d 2e 20 20 54 68 65 20 74 72 61 6e 73 66  f[].  The transf
24a60 65 72 0a 2a 2a 20 62 65 67 69 6e 73 20 61 74 20  er.** begins at 
24a70 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 0a 2a 2a 20  "offset"..**.** 
24a80 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20  The caller must 
24a90 65 6e 73 75 72 65 20 74 68 61 74 20 70 43 75 72  ensure that pCur
24aa0 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20   is pointing to 
24ab0 61 20 76 61 6c 69 64 20 72 6f 77 0a 2a 2a 20 69  a valid row.** i
24ac0 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a  n the table..**.
24ad0 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ** Return SQLITE
24ae0 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 6f  _OK on success o
24af0 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  r an error code 
24b00 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73  if anything goes
24b10 0a 2a 2a 20 77 72 6f 6e 67 2e 20 20 41 6e 20 65  .** wrong.  An e
24b20 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64  rror is returned
24b30 20 69 66 20 22 6f 66 66 73 65 74 2b 61 6d 74 22   if "offset+amt"
24b40 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 0a   is larger than.
24b50 2a 2a 20 74 68 65 20 61 76 61 69 6c 61 62 6c 65  ** the available
24b60 20 70 61 79 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e 74   payload..*/.int
24b70 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79   sqlite3BtreeKey
24b80 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
24b90 20 75 33 32 20 6f 66 66 73 65 74 2c 20 75 33 32   u32 offset, u32
24ba0 20 61 6d 74 2c 20 76 6f 69 64 20 2a 70 42 75 66   amt, void *pBuf
24bb0 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ){.  assert( cur
24bc0 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
24bd0 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
24be0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
24bf0 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
24c00 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
24c10 50 61 67 65 3e 3d 30 20 26 26 20 70 43 75 72 2d  Page>=0 && pCur-
24c20 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
24c30 61 67 65 5d 20 29 3b 0a 20 20 61 73 73 65 72 74  age] );.  assert
24c40 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  ( pCur->aiIdx[pC
24c50 75 72 2d 3e 69 50 61 67 65 5d 3c 70 43 75 72 2d  ur->iPage]<pCur-
24c60 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
24c70 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  age]->nCell );. 
24c80 20 72 65 74 75 72 6e 20 61 63 63 65 73 73 50 61   return accessPa
24c90 79 6c 6f 61 64 28 70 43 75 72 2c 20 6f 66 66 73  yload(pCur, offs
24ca0 65 74 2c 20 61 6d 74 2c 20 28 75 6e 73 69 67 6e  et, amt, (unsign
24cb0 65 64 20 63 68 61 72 2a 29 70 42 75 66 2c 20 30  ed char*)pBuf, 0
24cc0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64  );.}../*.** Read
24cd0 20 70 61 72 74 20 6f 66 20 74 68 65 20 64 61 74   part of the dat
24ce0 61 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  a associated wit
24cf0 68 20 63 75 72 73 6f 72 20 70 43 75 72 2e 20 20  h cursor pCur.  
24d00 45 78 61 63 74 6c 79 0a 2a 2a 20 22 61 6d 74 22  Exactly.** "amt"
24d10 20 62 79 74 65 73 20 77 69 6c 6c 20 62 65 20 74   bytes will be t
24d20 72 61 6e 73 66 65 72 65 64 20 69 6e 74 6f 20 70  ransfered into p
24d30 42 75 66 5b 5d 2e 20 20 54 68 65 20 74 72 61 6e  Buf[].  The tran
24d40 73 66 65 72 0a 2a 2a 20 62 65 67 69 6e 73 20 61  sfer.** begins a
24d50 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 0a 2a  t "offset"..**.*
24d60 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * Return SQLITE_
24d70 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72  OK on success or
24d80 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
24d90 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a  f anything goes.
24da0 2a 2a 20 77 72 6f 6e 67 2e 20 20 41 6e 20 65 72  ** wrong.  An er
24db0 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 20  ror is returned 
24dc0 69 66 20 22 6f 66 66 73 65 74 2b 61 6d 74 22 20  if "offset+amt" 
24dd0 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 0a 2a  is larger than.*
24de0 2a 20 74 68 65 20 61 76 61 69 6c 61 62 6c 65 20  * the available 
24df0 70 61 79 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e 74 20  payload..*/.int 
24e00 73 71 6c 69 74 65 33 42 74 72 65 65 44 61 74 61  sqlite3BtreeData
24e10 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
24e20 20 75 33 32 20 6f 66 66 73 65 74 2c 20 75 33 32   u32 offset, u32
24e30 20 61 6d 74 2c 20 76 6f 69 64 20 2a 70 42 75 66   amt, void *pBuf
24e40 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 23 69  ){.  int rc;..#i
24e50 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
24e60 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 69 66 20  T_INCRBLOB.  if 
24e70 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
24e80 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29  CURSOR_INVALID )
24e90 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
24ea0 49 54 45 5f 41 42 4f 52 54 3b 0a 20 20 7d 0a 23  ITE_ABORT;.  }.#
24eb0 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28  endif..  assert(
24ec0 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
24ed0 78 28 70 43 75 72 29 20 29 3b 0a 20 20 72 63 20  x(pCur) );.  rc 
24ee0 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50  = restoreCursorP
24ef0 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20  osition(pCur);. 
24f00 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
24f10 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  OK ){.    assert
24f20 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
24f30 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
24f40 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
24f50 2d 3e 69 50 61 67 65 3e 3d 30 20 26 26 20 70 43  ->iPage>=0 && pC
24f60 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
24f70 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20 20 20 61  >iPage] );.    a
24f80 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49  ssert( pCur->aiI
24f90 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c  dx[pCur->iPage]<
24fa0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
24fb0 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c  r->iPage]->nCell
24fc0 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 61 63 63   );.    rc = acc
24fd0 65 73 73 50 61 79 6c 6f 61 64 28 70 43 75 72 2c  essPayload(pCur,
24fe0 20 6f 66 66 73 65 74 2c 20 61 6d 74 2c 20 70 42   offset, amt, pB
24ff0 75 66 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65  uf, 0);.  }.  re
25000 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
25010 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * Return a point
25020 65 72 20 74 6f 20 70 61 79 6c 6f 61 64 20 69 6e  er to payload in
25030 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74  formation from t
25040 68 65 20 65 6e 74 72 79 20 74 68 61 74 20 74 68  he entry that th
25050 65 20 0a 2a 2a 20 70 43 75 72 20 63 75 72 73 6f  e .** pCur curso
25060 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f  r is pointing to
25070 2e 20 20 54 68 65 20 70 6f 69 6e 74 65 72 20 69  .  The pointer i
25080 73 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69  s to the beginni
25090 6e 67 20 6f 66 0a 2a 2a 20 74 68 65 20 6b 65 79  ng of.** the key
250a0 20 69 66 20 69 6e 64 65 78 20 62 74 72 65 65 73   if index btrees
250b0 20 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3d   (pPage->intKey=
250c0 3d 30 29 20 61 6e 64 20 69 73 20 74 68 65 20 64  =0) and is the d
250d0 61 74 61 20 66 6f 72 0a 2a 2a 20 74 61 62 6c 65  ata for.** table
250e0 20 62 74 72 65 65 73 20 28 70 50 61 67 65 2d 3e   btrees (pPage->
250f0 69 6e 74 4b 65 79 3d 3d 31 29 2e 20 54 68 65 20  intKey==1). The 
25100 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
25110 6f 66 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20  of available.** 
25120 6b 65 79 2f 64 61 74 61 20 69 73 20 77 72 69 74  key/data is writ
25130 74 65 6e 20 69 6e 74 6f 20 2a 70 41 6d 74 2e 20  ten into *pAmt. 
25140 20 49 66 20 2a 70 41 6d 74 3d 3d 30 2c 20 74 68   If *pAmt==0, th
25150 65 6e 20 74 68 65 20 76 61 6c 75 65 0a 2a 2a 20  en the value.** 
25160 72 65 74 75 72 6e 65 64 20 77 69 6c 6c 20 6e 6f  returned will no
25170 74 20 62 65 20 61 20 76 61 6c 69 64 20 70 6f 69  t be a valid poi
25180 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  nter..**.** This
25190 20 72 6f 75 74 69 6e 65 20 69 73 20 61 6e 20 6f   routine is an o
251a0 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 49 74  ptimization.  It
251b0 20 69 73 20 63 6f 6d 6d 6f 6e 20 66 6f 72 20 74   is common for t
251c0 68 65 20 65 6e 74 69 72 65 20 6b 65 79 0a 2a 2a  he entire key.**
251d0 20 61 6e 64 20 64 61 74 61 20 74 6f 20 66 69 74   and data to fit
251e0 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70 61   on the local pa
251f0 67 65 20 61 6e 64 20 66 6f 72 20 74 68 65 72 65  ge and for there
25200 20 74 6f 20 62 65 20 6e 6f 20 6f 76 65 72 66 6c   to be no overfl
25210 6f 77 0a 2a 2a 20 70 61 67 65 73 2e 20 20 57 68  ow.** pages.  Wh
25220 65 6e 20 74 68 61 74 20 69 73 20 73 6f 2c 20 74  en that is so, t
25230 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 20  his routine can 
25240 62 65 20 75 73 65 64 20 74 6f 20 61 63 63 65 73  be used to acces
25250 73 20 74 68 65 0a 2a 2a 20 6b 65 79 20 61 6e 64  s the.** key and
25260 20 64 61 74 61 20 77 69 74 68 6f 75 74 20 6d 61   data without ma
25270 6b 69 6e 67 20 61 20 63 6f 70 79 2e 20 20 49 66  king a copy.  If
25280 20 74 68 65 20 6b 65 79 20 61 6e 64 2f 6f 72 20   the key and/or 
25290 64 61 74 61 20 73 70 69 6c 6c 73 0a 2a 2a 20 6f  data spills.** o
252a0 6e 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  nto overflow pag
252b0 65 73 2c 20 74 68 65 6e 20 61 63 63 65 73 73 50  es, then accessP
252c0 61 79 6c 6f 61 64 28 29 20 6d 75 73 74 20 62 65  ayload() must be
252d0 20 75 73 65 64 20 74 6f 20 72 65 61 73 73 65 6d   used to reassem
252e0 62 6c 65 0a 2a 2a 20 74 68 65 20 6b 65 79 2f 64  ble.** the key/d
252f0 61 74 61 20 61 6e 64 20 63 6f 70 79 20 69 74 20  ata and copy it 
25300 69 6e 74 6f 20 61 20 70 72 65 61 6c 6c 6f 63 61  into a prealloca
25310 74 65 64 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a  ted buffer..**.*
25320 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 72 65  * The pointer re
25330 74 75 72 6e 65 64 20 62 79 20 74 68 69 73 20 72  turned by this r
25340 6f 75 74 69 6e 65 20 6c 6f 6f 6b 73 20 64 69 72  outine looks dir
25350 65 63 74 6c 79 20 69 6e 74 6f 20 74 68 65 20 63  ectly into the c
25360 61 63 68 65 64 0a 2a 2a 20 70 61 67 65 20 6f 66  ached.** page of
25370 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
25380 54 68 65 20 64 61 74 61 20 6d 69 67 68 74 20 63  The data might c
25390 68 61 6e 67 65 20 6f 72 20 6d 6f 76 65 20 74 68  hange or move th
253a0 65 20 6e 65 78 74 20 74 69 6d 65 0a 2a 2a 20 61  e next time.** a
253b0 6e 79 20 62 74 72 65 65 20 72 6f 75 74 69 6e 65  ny btree routine
253c0 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73   is called..*/.s
253d0 74 61 74 69 63 20 63 6f 6e 73 74 20 76 6f 69 64  tatic const void
253e0 20 2a 66 65 74 63 68 50 61 79 6c 6f 61 64 28 0a   *fetchPayload(.
253f0 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72    BtCursor *pCur
25400 2c 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72  ,      /* Cursor
25410 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 65 6e 74   pointing to ent
25420 72 79 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20  ry to read from 
25430 2a 2f 0a 20 20 75 33 32 20 2a 70 41 6d 74 20 20  */.  u32 *pAmt  
25440 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
25450 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  te the number of
25460 20 61 76 61 69 6c 61 62 6c 65 20 62 79 74 65 73   available bytes
25470 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 61 73   here */.){.  as
25480 73 65 72 74 28 20 70 43 75 72 21 3d 30 20 26 26  sert( pCur!=0 &&
25490 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20   pCur->iPage>=0 
254a0 26 26 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  && pCur->apPage[
254b0 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 3b 0a 20  pCur->iPage]);. 
254c0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
254d0 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
254e0 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28  LID );.  assert(
254f0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
25500 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65  eld(pCur->pBtree
25510 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  ->db->mutex) );.
25520 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
25530 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
25540 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
25550 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
25560 69 50 61 67 65 5d 3c 70 43 75 72 2d 3e 61 70 50  iPage]<pCur->apP
25570 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
25580 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73  ->nCell );.  ass
25590 65 72 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  ert( pCur->info.
255a0 6e 53 69 7a 65 3e 30 20 29 3b 0a 20 20 2a 70 41  nSize>0 );.  *pA
255b0 6d 74 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  mt = pCur->info.
255c0 6e 4c 6f 63 61 6c 3b 0a 20 20 72 65 74 75 72 6e  nLocal;.  return
255d0 20 28 76 6f 69 64 2a 29 70 43 75 72 2d 3e 69 6e   (void*)pCur->in
255e0 66 6f 2e 70 50 61 79 6c 6f 61 64 3b 0a 7d 0a 0a  fo.pPayload;.}..
255f0 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 65  ./*.** For the e
25600 6e 74 72 79 20 74 68 61 74 20 63 75 72 73 6f 72  ntry that cursor
25610 20 70 43 75 72 20 69 73 20 70 6f 69 6e 74 20 74   pCur is point t
25620 6f 2c 20 72 65 74 75 72 6e 20 61 73 0a 2a 2a 20  o, return as.** 
25630 6d 61 6e 79 20 62 79 74 65 73 20 6f 66 20 74 68  many bytes of th
25640 65 20 6b 65 79 20 6f 72 20 64 61 74 61 20 61 73  e key or data as
25650 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65 20 6f   are available o
25660 6e 20 74 68 65 20 6c 6f 63 61 6c 0a 2a 2a 20 62  n the local.** b
25670 2d 74 72 65 65 20 70 61 67 65 2e 20 20 57 72 69  -tree page.  Wri
25680 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  te the number of
25690 20 61 76 61 69 6c 61 62 6c 65 20 62 79 74 65 73   available bytes
256a0 20 69 6e 74 6f 20 2a 70 41 6d 74 2e 0a 2a 2a 0a   into *pAmt..**.
256b0 2a 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 72  ** The pointer r
256c0 65 74 75 72 6e 65 64 20 69 73 20 65 70 68 65 6d  eturned is ephem
256d0 65 72 61 6c 2e 20 20 54 68 65 20 6b 65 79 2f 64  eral.  The key/d
256e0 61 74 61 20 6d 61 79 20 6d 6f 76 65 0a 2a 2a 20  ata may move.** 
256f0 6f 72 20 62 65 20 64 65 73 74 72 6f 79 65 64 20  or be destroyed 
25700 6f 6e 20 74 68 65 20 6e 65 78 74 20 63 61 6c 6c  on the next call
25710 20 74 6f 20 61 6e 79 20 42 74 72 65 65 20 72 6f   to any Btree ro
25720 75 74 69 6e 65 2c 0a 2a 2a 20 69 6e 63 6c 75 64  utine,.** includ
25730 69 6e 67 20 63 61 6c 6c 73 20 66 72 6f 6d 20 6f  ing calls from o
25740 74 68 65 72 20 74 68 72 65 61 64 73 20 61 67 61  ther threads aga
25750 69 6e 73 74 20 74 68 65 20 73 61 6d 65 20 63 61  inst the same ca
25760 63 68 65 2e 0a 2a 2a 20 48 65 6e 63 65 2c 20 61  che..** Hence, a
25770 20 6d 75 74 65 78 20 6f 6e 20 74 68 65 20 42 74   mutex on the Bt
25780 53 68 61 72 65 64 20 73 68 6f 75 6c 64 20 62 65  Shared should be
25790 20 68 65 6c 64 20 70 72 69 6f 72 20 74 6f 20 63   held prior to c
257a0 61 6c 6c 69 6e 67 0a 2a 2a 20 74 68 69 73 20 72  alling.** this r
257b0 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  outine..**.** Th
257c0 65 73 65 20 72 6f 75 74 69 6e 65 73 20 69 73 20  ese routines is 
257d0 75 73 65 64 20 74 6f 20 67 65 74 20 71 75 69 63  used to get quic
257e0 6b 20 61 63 63 65 73 73 20 74 6f 20 6b 65 79 20  k access to key 
257f0 61 6e 64 20 64 61 74 61 0a 2a 2a 20 69 6e 20 74  and data.** in t
25800 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77  he common case w
25810 68 65 72 65 20 6e 6f 20 6f 76 65 72 66 6c 6f 77  here no overflow
25820 20 70 61 67 65 73 20 61 72 65 20 75 73 65 64 2e   pages are used.
25830 0a 2a 2f 0a 63 6f 6e 73 74 20 76 6f 69 64 20 2a  .*/.const void *
25840 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 46  sqlite3BtreeKeyF
25850 65 74 63 68 28 42 74 43 75 72 73 6f 72 20 2a 70  etch(BtCursor *p
25860 43 75 72 2c 20 75 33 32 20 2a 70 41 6d 74 29 7b  Cur, u32 *pAmt){
25870 0a 20 20 72 65 74 75 72 6e 20 66 65 74 63 68 50  .  return fetchP
25880 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 70 41 6d  ayload(pCur, pAm
25890 74 29 3b 0a 7d 0a 63 6f 6e 73 74 20 76 6f 69 64  t);.}.const void
258a0 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65 44 61   *sqlite3BtreeDa
258b0 74 61 46 65 74 63 68 28 42 74 43 75 72 73 6f 72  taFetch(BtCursor
258c0 20 2a 70 43 75 72 2c 20 75 33 32 20 2a 70 41 6d   *pCur, u32 *pAm
258d0 74 29 7b 0a 20 20 72 65 74 75 72 6e 20 66 65 74  t){.  return fet
258e0 63 68 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20  chPayload(pCur, 
258f0 70 41 6d 74 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  pAmt);.}.../*.**
25900 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72   Move the cursor
25910 20 64 6f 77 6e 20 74 6f 20 61 20 6e 65 77 20 63   down to a new c
25920 68 69 6c 64 20 70 61 67 65 2e 20 20 54 68 65 20  hild page.  The 
25930 6e 65 77 50 67 6e 6f 20 61 72 67 75 6d 65 6e 74  newPgno argument
25940 20 69 73 20 74 68 65 0a 2a 2a 20 70 61 67 65 20   is the.** page 
25950 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 63 68  number of the ch
25960 69 6c 64 20 70 61 67 65 20 74 6f 20 6d 6f 76 65  ild page to move
25970 20 74 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20   to..**.** This 
25980 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
25990 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20   SQLITE_CORRUPT 
259a0 69 66 20 74 68 65 20 70 61 67 65 2d 68 65 61 64  if the page-head
259b0 65 72 20 66 6c 61 67 73 20 66 69 65 6c 64 20 6f  er flags field o
259c0 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20 63 68 69  f.** the new chi
259d0 6c 64 20 70 61 67 65 20 64 6f 65 73 20 6e 6f 74  ld page does not
259e0 20 6d 61 74 63 68 20 74 68 65 20 66 6c 61 67 73   match the flags
259f0 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 70 61   field of the pa
25a00 72 65 6e 74 20 28 69 2e 65 2e 0a 2a 2a 20 69 66  rent (i.e..** if
25a10 20 61 6e 20 69 6e 74 6b 65 79 20 70 61 67 65 20   an intkey page 
25a20 61 70 70 65 61 72 73 20 74 6f 20 62 65 20 74 68  appears to be th
25a30 65 20 70 61 72 65 6e 74 20 6f 66 20 61 20 6e 6f  e parent of a no
25a40 6e 2d 69 6e 74 6b 65 79 20 70 61 67 65 2c 20 6f  n-intkey page, o
25a50 72 0a 2a 2a 20 76 69 63 65 2d 76 65 72 73 61 29  r.** vice-versa)
25a60 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
25a70 6d 6f 76 65 54 6f 43 68 69 6c 64 28 42 74 43 75  moveToChild(BtCu
25a80 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20  rsor *pCur, u32 
25a90 6e 65 77 50 67 6e 6f 29 7b 0a 20 20 69 6e 74 20  newPgno){.  int 
25aa0 72 63 3b 0a 20 20 69 6e 74 20 69 20 3d 20 70 43  rc;.  int i = pC
25ab0 75 72 2d 3e 69 50 61 67 65 3b 0a 20 20 4d 65 6d  ur->iPage;.  Mem
25ac0 50 61 67 65 20 2a 70 4e 65 77 50 61 67 65 3b 0a  Page *pNewPage;.
25ad0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
25ae0 3d 20 70 43 75 72 2d 3e 70 42 74 3b 0a 0a 20 20  = pCur->pBt;..  
25af0 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
25b00 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
25b10 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
25b20 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
25b30 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65  _VALID );.  asse
25b40 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3c  rt( pCur->iPage<
25b50 42 54 43 55 52 53 4f 52 5f 4d 41 58 5f 44 45 50  BTCURSOR_MAX_DEP
25b60 54 48 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  TH );.  assert( 
25b70 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 29  pCur->iPage>=0 )
25b80 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50  ;.  if( pCur->iP
25b90 61 67 65 3e 3d 28 42 54 43 55 52 53 4f 52 5f 4d  age>=(BTCURSOR_M
25ba0 41 58 5f 44 45 50 54 48 2d 31 29 20 29 7b 0a 20  AX_DEPTH-1) ){. 
25bb0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
25bc0 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
25bd0 20 7d 0a 20 20 72 63 20 3d 20 67 65 74 41 6e 64   }.  rc = getAnd
25be0 49 6e 69 74 50 61 67 65 28 70 42 74 2c 20 6e 65  InitPage(pBt, ne
25bf0 77 50 67 6e 6f 2c 20 26 70 4e 65 77 50 61 67 65  wPgno, &pNewPage
25c00 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
25c10 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73   (pCur->curFlags
25c20 20 26 20 42 54 43 46 5f 57 72 69 74 65 46 6c 61   & BTCF_WriteFla
25c30 67 29 3d 3d 30 20 3f 20 50 41 47 45 52 5f 47 45  g)==0 ? PAGER_GE
25c40 54 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 30 29 3b  T_READONLY : 0);
25c50 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75  .  if( rc ) retu
25c60 72 6e 20 72 63 3b 0a 20 20 70 43 75 72 2d 3e 61  rn rc;.  pCur->a
25c70 70 50 61 67 65 5b 69 2b 31 5d 20 3d 20 70 4e 65  pPage[i+1] = pNe
25c80 77 50 61 67 65 3b 0a 20 20 70 43 75 72 2d 3e 61  wPage;.  pCur->a
25c90 69 49 64 78 5b 69 2b 31 5d 20 3d 20 30 3b 0a 20  iIdx[i+1] = 0;. 
25ca0 20 70 43 75 72 2d 3e 69 50 61 67 65 2b 2b 3b 0a   pCur->iPage++;.
25cb0 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53  .  pCur->info.nS
25cc0 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d  ize = 0;.  pCur-
25cd0 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 28 42  >curFlags &= ~(B
25ce0 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54  TCF_ValidNKey|BT
25cf0 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3b 0a 20  CF_ValidOvfl);. 
25d00 20 69 66 28 20 70 4e 65 77 50 61 67 65 2d 3e 6e   if( pNewPage->n
25d10 43 65 6c 6c 3c 31 20 7c 7c 20 70 4e 65 77 50 61  Cell<1 || pNewPa
25d20 67 65 2d 3e 69 6e 74 4b 65 79 21 3d 70 43 75 72  ge->intKey!=pCur
25d30 2d 3e 61 70 50 61 67 65 5b 69 5d 2d 3e 69 6e 74  ->apPage[i]->int
25d40 4b 65 79 20 29 7b 0a 20 20 20 20 72 65 74 75 72  Key ){.    retur
25d50 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
25d60 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74  _BKPT;.  }.  ret
25d70 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
25d80 0a 0a 23 69 66 20 30 0a 2f 2a 0a 2a 2a 20 50 61  ..#if 0./*.** Pa
25d90 67 65 20 70 50 61 72 65 6e 74 20 69 73 20 61 6e  ge pParent is an
25da0 20 69 6e 74 65 72 6e 61 6c 20 28 6e 6f 6e 2d 6c   internal (non-l
25db0 65 61 66 29 20 74 72 65 65 20 70 61 67 65 2e 20  eaf) tree page. 
25dc0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 0a 2a  This function .*
25dd0 2a 20 61 73 73 65 72 74 73 20 74 68 61 74 20 70  * asserts that p
25de0 61 67 65 20 6e 75 6d 62 65 72 20 69 43 68 69 6c  age number iChil
25df0 64 20 69 73 20 74 68 65 20 6c 65 66 74 2d 63 68  d is the left-ch
25e00 69 6c 64 20 69 66 20 74 68 65 20 69 49 64 78 27  ild if the iIdx'
25e10 74 68 0a 2a 2a 20 63 65 6c 6c 20 69 6e 20 70 61  th.** cell in pa
25e20 67 65 20 70 50 61 72 65 6e 74 2e 20 4f 72 2c 20  ge pParent. Or, 
25e30 69 66 20 69 49 64 78 20 69 73 20 65 71 75 61 6c  if iIdx is equal
25e40 20 74 6f 20 74 68 65 20 74 6f 74 61 6c 20 6e 75   to the total nu
25e50 6d 62 65 72 20 6f 66 0a 2a 2a 20 63 65 6c 6c 73  mber of.** cells
25e60 20 69 6e 20 70 50 61 72 65 6e 74 2c 20 74 68 61   in pParent, tha
25e70 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 43  t page number iC
25e80 68 69 6c 64 20 69 73 20 74 68 65 20 72 69 67 68  hild is the righ
25e90 74 2d 63 68 69 6c 64 20 6f 66 0a 2a 2a 20 74 68  t-child of.** th
25ea0 65 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69  e page..*/.stati
25eb0 63 20 76 6f 69 64 20 61 73 73 65 72 74 50 61 72  c void assertPar
25ec0 65 6e 74 49 6e 64 65 78 28 4d 65 6d 50 61 67 65  entIndex(MemPage
25ed0 20 2a 70 50 61 72 65 6e 74 2c 20 69 6e 74 20 69   *pParent, int i
25ee0 49 64 78 2c 20 50 67 6e 6f 20 69 43 68 69 6c 64  Idx, Pgno iChild
25ef0 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 49 64  ){.  assert( iId
25f00 78 3c 3d 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c  x<=pParent->nCel
25f10 6c 20 29 3b 0a 20 20 69 66 28 20 69 49 64 78 3d  l );.  if( iIdx=
25f20 3d 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20  =pParent->nCell 
25f30 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 67  ){.    assert( g
25f40 65 74 34 62 79 74 65 28 26 70 50 61 72 65 6e 74  et4byte(&pParent
25f50 2d 3e 61 44 61 74 61 5b 70 50 61 72 65 6e 74 2d  ->aData[pParent-
25f60 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3d 3d  >hdrOffset+8])==
25f70 69 43 68 69 6c 64 20 29 3b 0a 20 20 7d 65 6c 73  iChild );.  }els
25f80 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 67  e{.    assert( g
25f90 65 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c  et4byte(findCell
25fa0 28 70 50 61 72 65 6e 74 2c 20 69 49 64 78 29 29  (pParent, iIdx))
25fb0 3d 3d 69 43 68 69 6c 64 20 29 3b 0a 20 20 7d 0a  ==iChild );.  }.
25fc0 7d 0a 23 65 6c 73 65 0a 23 20 20 64 65 66 69 6e  }.#else.#  defin
25fd0 65 20 61 73 73 65 72 74 50 61 72 65 6e 74 49 6e  e assertParentIn
25fe0 64 65 78 28 78 2c 79 2c 7a 29 20 0a 23 65 6e 64  dex(x,y,z) .#end
25ff0 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74  if../*.** Move t
26000 68 65 20 63 75 72 73 6f 72 20 75 70 20 74 6f 20  he cursor up to 
26010 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 2e  the parent page.
26020 0a 2a 2a 0a 2a 2a 20 70 43 75 72 2d 3e 69 64 78  .**.** pCur->idx
26030 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 63   is set to the c
26040 65 6c 6c 20 69 6e 64 65 78 20 74 68 61 74 20 63  ell index that c
26050 6f 6e 74 61 69 6e 73 20 74 68 65 20 70 6f 69 6e  ontains the poin
26060 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 70 61  ter.** to the pa
26070 67 65 20 77 65 20 61 72 65 20 63 6f 6d 69 6e 67  ge we are coming
26080 20 66 72 6f 6d 2e 20 20 49 66 20 77 65 20 61 72   from.  If we ar
26090 65 20 63 6f 6d 69 6e 67 20 66 72 6f 6d 20 74 68  e coming from th
260a0 65 0a 2a 2a 20 72 69 67 68 74 2d 6d 6f 73 74 20  e.** right-most 
260b0 63 68 69 6c 64 20 70 61 67 65 20 74 68 65 6e 20  child page then 
260c0 70 43 75 72 2d 3e 69 64 78 20 69 73 20 73 65 74  pCur->idx is set
260d0 20 74 6f 20 6f 6e 65 20 6d 6f 72 65 20 74 68 61   to one more tha
260e0 6e 0a 2a 2a 20 74 68 65 20 6c 61 72 67 65 73 74  n.** the largest
260f0 20 63 65 6c 6c 20 69 6e 64 65 78 2e 0a 2a 2f 0a   cell index..*/.
26100 73 74 61 74 69 63 20 76 6f 69 64 20 6d 6f 76 65  static void move
26110 54 6f 50 61 72 65 6e 74 28 42 74 43 75 72 73 6f  ToParent(BtCurso
26120 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73 73 65  r *pCur){.  asse
26130 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
26140 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
26150 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
26160 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
26170 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ID );.  assert( 
26180 70 43 75 72 2d 3e 69 50 61 67 65 3e 30 20 29 3b  pCur->iPage>0 );
26190 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
261a0 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
261b0 61 67 65 5d 20 29 3b 0a 0a 20 20 2f 2a 20 55 50  age] );..  /* UP
261c0 44 41 54 45 3a 20 49 74 20 69 73 20 61 63 74 75  DATE: It is actu
261d0 61 6c 6c 79 20 70 6f 73 73 69 62 6c 65 20 66 6f  ally possible fo
261e0 72 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 20  r the condition 
261f0 74 65 73 74 65 64 20 62 79 20 74 68 65 20 61 73  tested by the as
26200 73 65 72 74 0a 20 20 2a 2a 20 62 65 6c 6f 77 20  sert.  ** below 
26210 74 6f 20 62 65 20 75 6e 74 72 75 65 20 69 66 20  to be untrue if 
26220 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
26230 65 20 69 73 20 63 6f 72 72 75 70 74 2e 20 54 68  e is corrupt. Th
26240 69 73 20 63 61 6e 20 6f 63 63 75 72 20 69 66 0a  is can occur if.
26250 20 20 2a 2a 20 6f 6e 65 20 63 75 72 73 6f 72 20    ** one cursor 
26260 68 61 73 20 6d 6f 64 69 66 69 65 64 20 70 61 67  has modified pag
26270 65 20 70 50 61 72 65 6e 74 20 77 68 69 6c 65 20  e pParent while 
26280 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 69  a reference to i
26290 74 20 69 73 20 68 65 6c 64 20 0a 20 20 2a 2a 20  t is held .  ** 
262a0 62 79 20 61 20 73 65 63 6f 6e 64 20 63 75 72 73  by a second curs
262b0 6f 72 2e 20 57 68 69 63 68 20 63 61 6e 20 6f 6e  or. Which can on
262c0 6c 79 20 68 61 70 70 65 6e 20 69 66 20 61 20 73  ly happen if a s
262d0 69 6e 67 6c 65 20 70 61 67 65 20 69 73 20 6c 69  ingle page is li
262e0 6e 6b 65 64 0a 20 20 2a 2a 20 69 6e 74 6f 20 6d  nked.  ** into m
262f0 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 62 2d 74  ore than one b-t
26300 72 65 65 20 73 74 72 75 63 74 75 72 65 20 69 6e  ree structure in
26310 20 61 20 63 6f 72 72 75 70 74 20 64 61 74 61 62   a corrupt datab
26320 61 73 65 2e 20 20 2a 2f 0a 23 69 66 20 30 0a 20  ase.  */.#if 0. 
26330 20 61 73 73 65 72 74 50 61 72 65 6e 74 49 6e 64   assertParentInd
26340 65 78 28 0a 20 20 20 20 70 43 75 72 2d 3e 61 70  ex(.    pCur->ap
26350 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
26360 2d 31 5d 2c 20 0a 20 20 20 20 70 43 75 72 2d 3e  -1], .    pCur->
26370 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
26380 65 2d 31 5d 2c 20 0a 20 20 20 20 70 43 75 72 2d  e-1], .    pCur-
26390 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
263a0 61 67 65 5d 2d 3e 70 67 6e 6f 0a 20 20 29 3b 0a  age]->pgno.  );.
263b0 23 65 6e 64 69 66 0a 20 20 74 65 73 74 63 61 73  #endif.  testcas
263c0 65 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70  e( pCur->aiIdx[p
263d0 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d 20 3e 20  Cur->iPage-1] > 
263e0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
263f0 72 2d 3e 69 50 61 67 65 2d 31 5d 2d 3e 6e 43 65  r->iPage-1]->nCe
26400 6c 6c 20 29 3b 0a 0a 20 20 72 65 6c 65 61 73 65  ll );..  release
26410 50 61 67 65 28 70 43 75 72 2d 3e 61 70 50 61 67  Page(pCur->apPag
26420 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 3b  e[pCur->iPage]);
26430 0a 20 20 70 43 75 72 2d 3e 69 50 61 67 65 2d 2d  .  pCur->iPage--
26440 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  ;.  pCur->info.n
26450 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72  Size = 0;.  pCur
26460 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 28  ->curFlags &= ~(
26470 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42  BTCF_ValidNKey|B
26480 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3b 0a  TCF_ValidOvfl);.
26490 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68  }../*.** Move th
264a0 65 20 63 75 72 73 6f 72 20 74 6f 20 70 6f 69 6e  e cursor to poin
264b0 74 20 74 6f 20 74 68 65 20 72 6f 6f 74 20 70 61  t to the root pa
264c0 67 65 20 6f 66 20 69 74 73 20 62 2d 74 72 65 65  ge of its b-tree
264d0 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a   structure..**.*
264e0 2a 20 49 66 20 74 68 65 20 74 61 62 6c 65 20 68  * If the table h
264f0 61 73 20 61 20 76 69 72 74 75 61 6c 20 72 6f 6f  as a virtual roo
26500 74 20 70 61 67 65 2c 20 74 68 65 6e 20 74 68 65  t page, then the
26510 20 63 75 72 73 6f 72 20 69 73 20 6d 6f 76 65 64   cursor is moved
26520 20 74 6f 20 70 6f 69 6e 74 0a 2a 2a 20 74 6f 20   to point.** to 
26530 74 68 65 20 76 69 72 74 75 61 6c 20 72 6f 6f 74  the virtual root
26540 20 70 61 67 65 20 69 6e 73 74 65 61 64 20 6f 66   page instead of
26550 20 74 68 65 20 61 63 74 75 61 6c 20 72 6f 6f 74   the actual root
26560 20 70 61 67 65 2e 20 41 20 74 61 62 6c 65 20 68   page. A table h
26570 61 73 20 61 0a 2a 2a 20 76 69 72 74 75 61 6c 20  as a.** virtual 
26580 72 6f 6f 74 20 70 61 67 65 20 77 68 65 6e 20 74  root page when t
26590 68 65 20 61 63 74 75 61 6c 20 72 6f 6f 74 20 70  he actual root p
265a0 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20  age contains no 
265b0 63 65 6c 6c 73 20 61 6e 64 20 61 20 0a 2a 2a 20  cells and a .** 
265c0 73 69 6e 67 6c 65 20 63 68 69 6c 64 20 70 61 67  single child pag
265d0 65 2e 20 54 68 69 73 20 63 61 6e 20 6f 6e 6c 79  e. This can only
265e0 20 68 61 70 70 65 6e 20 77 69 74 68 20 74 68 65   happen with the
265f0 20 74 61 62 6c 65 20 72 6f 6f 74 65 64 20 61 74   table rooted at
26600 20 70 61 67 65 20 31 2e 0a 2a 2a 0a 2a 2a 20 49   page 1..**.** I
26610 66 20 74 68 65 20 62 2d 74 72 65 65 20 73 74 72  f the b-tree str
26620 75 63 74 75 72 65 20 69 73 20 65 6d 70 74 79 2c  ucture is empty,
26630 20 74 68 65 20 63 75 72 73 6f 72 20 73 74 61 74   the cursor stat
26640 65 20 69 73 20 73 65 74 20 74 6f 20 0a 2a 2a 20  e is set to .** 
26650 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 2e 20  CURSOR_INVALID. 
26660 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65 20 63  Otherwise, the c
26670 75 72 73 6f 72 20 69 73 20 73 65 74 20 74 6f 20  ursor is set to 
26680 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 66 69 72  point to the fir
26690 73 74 0a 2a 2a 20 63 65 6c 6c 20 6c 6f 63 61 74  st.** cell locat
266a0 65 64 20 6f 6e 20 74 68 65 20 72 6f 6f 74 20 28  ed on the root (
266b0 6f 72 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 29  or virtual root)
266c0 20 70 61 67 65 20 61 6e 64 20 74 68 65 20 63 75   page and the cu
266d0 72 73 6f 72 20 73 74 61 74 65 0a 2a 2a 20 69 73  rsor state.** is
266e0 20 73 65 74 20 74 6f 20 43 55 52 53 4f 52 5f 56   set to CURSOR_V
266f0 41 4c 49 44 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ALID..**.** If t
26700 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
26710 75 72 6e 73 20 73 75 63 63 65 73 73 66 75 6c 6c  urns successfull
26720 79 2c 20 69 74 20 6d 61 79 20 62 65 20 61 73 73  y, it may be ass
26730 75 6d 65 64 20 74 68 61 74 20 74 68 65 0a 2a 2a  umed that the.**
26740 20 70 61 67 65 2d 68 65 61 64 65 72 20 66 6c 61   page-header fla
26750 67 73 20 69 6e 64 69 63 61 74 65 20 74 68 61 74  gs indicate that
26760 20 74 68 65 20 5b 76 69 72 74 75 61 6c 5d 20 72   the [virtual] r
26770 6f 6f 74 2d 70 61 67 65 20 69 73 20 74 68 65 20  oot-page is the 
26780 65 78 70 65 63 74 65 64 20 0a 2a 2a 20 6b 69 6e  expected .** kin
26790 64 20 6f 66 20 62 2d 74 72 65 65 20 70 61 67 65  d of b-tree page
267a0 20 28 69 2e 65 2e 20 69 66 20 77 68 65 6e 20 6f   (i.e. if when o
267b0 70 65 6e 69 6e 67 20 74 68 65 20 63 75 72 73 6f  pening the curso
267c0 72 20 74 68 65 20 63 61 6c 6c 65 72 20 64 69 64  r the caller did
267d0 20 6e 6f 74 0a 2a 2a 20 73 70 65 63 69 66 79 20   not.** specify 
267e0 61 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74  a KeyInfo struct
267f0 75 72 65 20 74 68 65 20 66 6c 61 67 73 20 62 79  ure the flags by
26800 74 65 20 69 73 20 73 65 74 20 74 6f 20 30 78 30  te is set to 0x0
26810 35 20 6f 72 20 30 78 30 44 2c 0a 2a 2a 20 69 6e  5 or 0x0D,.** in
26820 64 69 63 61 74 69 6e 67 20 61 20 74 61 62 6c 65  dicating a table
26830 20 62 2d 74 72 65 65 2c 20 6f 72 20 69 66 20 74   b-tree, or if t
26840 68 65 20 63 61 6c 6c 65 72 20 64 69 64 20 73 70  he caller did sp
26850 65 63 69 66 79 20 61 20 4b 65 79 49 6e 66 6f 20  ecify a KeyInfo 
26860 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20 74 68  .** structure th
26870 65 20 66 6c 61 67 73 20 62 79 74 65 20 69 73 20  e flags byte is 
26880 73 65 74 20 74 6f 20 30 78 30 32 20 6f 72 20 30  set to 0x02 or 0
26890 78 30 41 2c 20 69 6e 64 69 63 61 74 69 6e 67 20  x0A, indicating 
268a0 61 6e 20 69 6e 64 65 78 0a 2a 2a 20 62 2d 74 72  an index.** b-tr
268b0 65 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ee)..*/.static i
268c0 6e 74 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 42 74  nt moveToRoot(Bt
268d0 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
268e0 20 4d 65 6d 50 61 67 65 20 2a 70 52 6f 6f 74 3b   MemPage *pRoot;
268f0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
26900 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74  TE_OK;..  assert
26910 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
26920 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ex(pCur) );.  as
26930 73 65 72 74 28 20 43 55 52 53 4f 52 5f 49 4e 56  sert( CURSOR_INV
26940 41 4c 49 44 20 3c 20 43 55 52 53 4f 52 5f 52 45  ALID < CURSOR_RE
26950 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 61  QUIRESEEK );.  a
26960 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f 56 41  ssert( CURSOR_VA
26970 4c 49 44 20 20 20 3c 20 43 55 52 53 4f 52 5f 52  LID   < CURSOR_R
26980 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20  EQUIRESEEK );.  
26990 61 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f 46  assert( CURSOR_F
269a0 41 55 4c 54 20 20 20 3e 20 43 55 52 53 4f 52 5f  AULT   > CURSOR_
269b0 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20  REQUIRESEEK );. 
269c0 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74   if( pCur->eStat
269d0 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55 49 52  e>=CURSOR_REQUIR
269e0 45 53 45 45 4b 20 29 7b 0a 20 20 20 20 69 66 28  ESEEK ){.    if(
269f0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
26a00 55 52 53 4f 52 5f 46 41 55 4c 54 20 29 7b 0a 20  URSOR_FAULT ){. 
26a10 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75       assert( pCu
26a20 72 2d 3e 73 6b 69 70 4e 65 78 74 21 3d 53 51 4c  r->skipNext!=SQL
26a30 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20  ITE_OK );.      
26a40 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 73 6b 69  return pCur->ski
26a50 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20  pNext;.    }.   
26a60 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65   sqlite3BtreeCle
26a70 61 72 43 75 72 73 6f 72 28 70 43 75 72 29 3b 0a  arCursor(pCur);.
26a80 20 20 7d 0a 0a 20 20 69 66 28 20 70 43 75 72 2d    }..  if( pCur-
26a90 3e 69 50 61 67 65 3e 3d 30 20 29 7b 0a 20 20 20  >iPage>=0 ){.   
26aa0 20 77 68 69 6c 65 28 20 70 43 75 72 2d 3e 69 50   while( pCur->iP
26ab0 61 67 65 20 29 20 72 65 6c 65 61 73 65 50 61 67  age ) releasePag
26ac0 65 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  e(pCur->apPage[p
26ad0 43 75 72 2d 3e 69 50 61 67 65 2d 2d 5d 29 3b 0a  Cur->iPage--]);.
26ae0 20 20 7d 65 6c 73 65 20 69 66 28 20 70 43 75 72    }else if( pCur
26af0 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 29 7b  ->pgnoRoot==0 ){
26b00 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74  .    pCur->eStat
26b10 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  e = CURSOR_INVAL
26b20 49 44 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  ID;.    return S
26b30 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73  QLITE_OK;.  }els
26b40 65 7b 0a 20 20 20 20 72 63 20 3d 20 67 65 74 41  e{.    rc = getA
26b50 6e 64 49 6e 69 74 50 61 67 65 28 70 43 75 72 2d  ndInitPage(pCur-
26b60 3e 70 42 74 72 65 65 2d 3e 70 42 74 2c 20 70 43  >pBtree->pBt, pC
26b70 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 26 70  ur->pgnoRoot, &p
26b80 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2c 0a  Cur->apPage[0],.
26b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26ba0 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73   (pCur->curFlags
26bb0 20 26 20 42 54 43 46 5f 57 72 69 74 65 46 6c 61   & BTCF_WriteFla
26bc0 67 29 3d 3d 30 20 3f 20 50 41 47 45 52 5f 47 45  g)==0 ? PAGER_GE
26bd0 54 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 30 29 3b  T_READONLY : 0);
26be0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
26bf0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
26c00 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
26c10 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20  URSOR_INVALID;. 
26c20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
26c30 20 20 20 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e      }.    pCur->
26c40 69 50 61 67 65 20 3d 20 30 3b 0a 20 20 7d 0a 20  iPage = 0;.  }. 
26c50 20 70 52 6f 6f 74 20 3d 20 70 43 75 72 2d 3e 61   pRoot = pCur->a
26c60 70 50 61 67 65 5b 30 5d 3b 0a 20 20 61 73 73 65  pPage[0];.  asse
26c70 72 74 28 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f 3d  rt( pRoot->pgno=
26c80 3d 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20  =pCur->pgnoRoot 
26c90 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 43 75 72  );..  /* If pCur
26ca0 2d 3e 70 4b 65 79 49 6e 66 6f 20 69 73 20 6e 6f  ->pKeyInfo is no
26cb0 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 65  t NULL, then the
26cc0 20 63 61 6c 6c 65 72 20 74 68 61 74 20 6f 70 65   caller that ope
26cd0 6e 65 64 20 74 68 69 73 20 63 75 72 73 6f 72 0a  ned this cursor.
26ce0 20 20 2a 2a 20 65 78 70 65 63 74 65 64 20 74 6f    ** expected to
26cf0 20 6f 70 65 6e 20 69 74 20 6f 6e 20 61 6e 20 69   open it on an i
26d00 6e 64 65 78 20 62 2d 74 72 65 65 2e 20 4f 74 68  ndex b-tree. Oth
26d10 65 72 77 69 73 65 2c 20 69 66 20 70 4b 65 79 49  erwise, if pKeyI
26d20 6e 66 6f 20 69 73 0a 20 20 2a 2a 20 4e 55 4c 4c  nfo is.  ** NULL
26d30 2c 20 74 68 65 20 63 61 6c 6c 65 72 20 65 78 70  , the caller exp
26d40 65 63 74 73 20 61 20 74 61 62 6c 65 20 62 2d 74  ects a table b-t
26d50 72 65 65 2e 20 49 66 20 74 68 69 73 20 69 73 20  ree. If this is 
26d60 6e 6f 74 20 74 68 65 20 63 61 73 65 2c 0a 20 20  not the case,.  
26d70 2a 2a 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c  ** return an SQL
26d80 49 54 45 5f 43 4f 52 52 55 50 54 20 65 72 72 6f  ITE_CORRUPT erro
26d90 72 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 61  r. .  **.  ** Ea
26da0 72 6c 69 65 72 20 76 65 72 73 69 6f 6e 73 20 6f  rlier versions o
26db0 66 20 53 51 4c 69 74 65 20 61 73 73 75 6d 65 64  f SQLite assumed
26dc0 20 74 68 61 74 20 74 68 69 73 20 74 65 73 74 20   that this test 
26dd0 63 6f 75 6c 64 20 6e 6f 74 20 66 61 69 6c 0a 20  could not fail. 
26de0 20 2a 2a 20 69 66 20 74 68 65 20 72 6f 6f 74 20   ** if the root 
26df0 70 61 67 65 20 77 61 73 20 61 6c 72 65 61 64 79  page was already
26e00 20 6c 6f 61 64 65 64 20 77 68 65 6e 20 74 68 69   loaded when thi
26e10 73 20 66 75 6e 63 74 69 6f 6e 20 77 61 73 20 63  s function was c
26e20 61 6c 6c 65 64 20 28 69 2e 65 2e 0a 20 20 2a 2a  alled (i.e..  **
26e30 20 69 66 20 70 43 75 72 2d 3e 69 50 61 67 65 3e   if pCur->iPage>
26e40 3d 30 29 2e 20 42 75 74 20 74 68 69 73 20 69 73  =0). But this is
26e50 20 6e 6f 74 20 73 6f 20 69 66 20 74 68 65 20 64   not so if the d
26e60 61 74 61 62 61 73 65 20 69 73 20 63 6f 72 72 75  atabase is corru
26e70 70 74 65 64 20 0a 20 20 2a 2a 20 69 6e 20 73 75  pted .  ** in su
26e80 63 68 20 61 20 77 61 79 20 74 68 61 74 20 70 61  ch a way that pa
26e90 67 65 20 70 52 6f 6f 74 20 69 73 20 6c 69 6e 6b  ge pRoot is link
26ea0 65 64 20 69 6e 74 6f 20 61 20 73 65 63 6f 6e 64  ed into a second
26eb0 20 62 2d 74 72 65 65 20 74 61 62 6c 65 20 0a 20   b-tree table . 
26ec0 20 2a 2a 20 28 6f 72 20 74 68 65 20 66 72 65 65   ** (or the free
26ed0 6c 69 73 74 29 2e 20 20 2a 2f 0a 20 20 61 73 73  list).  */.  ass
26ee0 65 72 74 28 20 70 52 6f 6f 74 2d 3e 69 6e 74 4b  ert( pRoot->intK
26ef0 65 79 3d 3d 31 20 7c 7c 20 70 52 6f 6f 74 2d 3e  ey==1 || pRoot->
26f00 69 6e 74 4b 65 79 3d 3d 30 20 29 3b 0a 20 20 69  intKey==0 );.  i
26f10 66 28 20 70 52 6f 6f 74 2d 3e 69 73 49 6e 69 74  f( pRoot->isInit
26f20 3d 3d 30 20 7c 7c 20 28 70 43 75 72 2d 3e 70 4b  ==0 || (pCur->pK
26f30 65 79 49 6e 66 6f 3d 3d 30 29 21 3d 70 52 6f 6f  eyInfo==0)!=pRoo
26f40 74 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20  t->intKey ){.   
26f50 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
26f60 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d  ORRUPT_BKPT;.  }
26f70 0a 0a 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  ..  pCur->aiIdx[
26f80 30 5d 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e  0] = 0;.  pCur->
26f90 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a  info.nSize = 0;.
26fa0 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73    pCur->curFlags
26fb0 20 26 3d 20 7e 28 42 54 43 46 5f 41 74 4c 61 73   &= ~(BTCF_AtLas
26fc0 74 7c 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79  t|BTCF_ValidNKey
26fd0 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29  |BTCF_ValidOvfl)
26fe0 3b 0a 0a 20 20 69 66 28 20 70 52 6f 6f 74 2d 3e  ;..  if( pRoot->
26ff0 6e 43 65 6c 6c 3e 30 20 29 7b 0a 20 20 20 20 70  nCell>0 ){.    p
27000 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
27010 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 7d 65  RSOR_VALID;.  }e
27020 6c 73 65 20 69 66 28 20 21 70 52 6f 6f 74 2d 3e  lse if( !pRoot->
27030 6c 65 61 66 20 29 7b 0a 20 20 20 20 50 67 6e 6f  leaf ){.    Pgno
27040 20 73 75 62 70 61 67 65 3b 0a 20 20 20 20 69 66   subpage;.    if
27050 28 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f 21 3d 31  ( pRoot->pgno!=1
27060 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
27070 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
27080 20 20 20 73 75 62 70 61 67 65 20 3d 20 67 65 74     subpage = get
27090 34 62 79 74 65 28 26 70 52 6f 6f 74 2d 3e 61 44  4byte(&pRoot->aD
270a0 61 74 61 5b 70 52 6f 6f 74 2d 3e 68 64 72 4f 66  ata[pRoot->hdrOf
270b0 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 70 43  fset+8]);.    pC
270c0 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
270d0 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 20 20 72  SOR_VALID;.    r
270e0 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28  c = moveToChild(
270f0 70 43 75 72 2c 20 73 75 62 70 61 67 65 29 3b 0a  pCur, subpage);.
27100 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 43 75    }else{.    pCu
27110 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
27120 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 7d 0a  OR_INVALID;.  }.
27130 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
27140 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63  /*.** Move the c
27150 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20 74 68  ursor down to th
27160 65 20 6c 65 66 74 2d 6d 6f 73 74 20 6c 65 61 66  e left-most leaf
27170 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74   entry beneath t
27180 68 65 0a 2a 2a 20 65 6e 74 72 79 20 74 6f 20 77  he.** entry to w
27190 68 69 63 68 20 69 74 20 69 73 20 63 75 72 72 65  hich it is curre
271a0 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 2e 0a 2a  ntly pointing..*
271b0 2a 0a 2a 2a 20 54 68 65 20 6c 65 66 74 2d 6d 6f  *.** The left-mo
271c0 73 74 20 6c 65 61 66 20 69 73 20 74 68 65 20 6f  st leaf is the o
271d0 6e 65 20 77 69 74 68 20 74 68 65 20 73 6d 61 6c  ne with the smal
271e0 6c 65 73 74 20 6b 65 79 20 2d 20 74 68 65 20 66  lest key - the f
271f0 69 72 73 74 0a 2a 2a 20 69 6e 20 61 73 63 65 6e  irst.** in ascen
27200 64 69 6e 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73  ding order..*/.s
27210 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f  tatic int moveTo
27220 4c 65 66 74 6d 6f 73 74 28 42 74 43 75 72 73 6f  Leftmost(BtCurso
27230 72 20 2a 70 43 75 72 29 7b 0a 20 20 50 67 6e 6f  r *pCur){.  Pgno
27240 20 70 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 20   pgno;.  int rc 
27250 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 4d  = SQLITE_OK;.  M
27260 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a  emPage *pPage;..
27270 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
27280 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
27290 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
272a0 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
272b0 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 77 68  OR_VALID );.  wh
272c0 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ile( rc==SQLITE_
272d0 4f 4b 20 26 26 20 21 28 70 50 61 67 65 20 3d 20  OK && !(pPage = 
272e0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
272f0 72 2d 3e 69 50 61 67 65 5d 29 2d 3e 6c 65 61 66  r->iPage])->leaf
27300 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
27310 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
27320 2d 3e 69 50 61 67 65 5d 3c 70 50 61 67 65 2d 3e  ->iPage]<pPage->
27330 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 70 67 6e  nCell );.    pgn
27340 6f 20 3d 20 67 65 74 34 62 79 74 65 28 66 69 6e  o = get4byte(fin
27350 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 75  dCell(pPage, pCu
27360 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
27370 50 61 67 65 5d 29 29 3b 0a 20 20 20 20 72 63 20  Page]));.    rc 
27380 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43  = moveToChild(pC
27390 75 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20  ur, pgno);.  }. 
273a0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
273b0 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75  *.** Move the cu
273c0 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20 74 68 65  rsor down to the
273d0 20 72 69 67 68 74 2d 6d 6f 73 74 20 6c 65 61 66   right-most leaf
273e0 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74   entry beneath t
273f0 68 65 0a 2a 2a 20 70 61 67 65 20 74 6f 20 77 68  he.** page to wh
27400 69 63 68 20 69 74 20 69 73 20 63 75 72 72 65 6e  ich it is curren
27410 74 6c 79 20 70 6f 69 6e 74 69 6e 67 2e 20 20 4e  tly pointing.  N
27420 6f 74 69 63 65 20 74 68 65 20 64 69 66 66 65 72  otice the differ
27430 65 6e 63 65 0a 2a 2a 20 62 65 74 77 65 65 6e 20  ence.** between 
27440 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 29  moveToLeftmost()
27450 20 61 6e 64 20 6d 6f 76 65 54 6f 52 69 67 68 74   and moveToRight
27460 6d 6f 73 74 28 29 2e 20 20 6d 6f 76 65 54 6f 4c  most().  moveToL
27470 65 66 74 6d 6f 73 74 28 29 0a 2a 2a 20 66 69 6e  eftmost().** fin
27480 64 73 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74  ds the left-most
27490 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74   entry beneath t
274a0 68 65 20 2a 65 6e 74 72 79 2a 20 77 68 65 72 65  he *entry* where
274b0 61 73 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f  as moveToRightmo
274c0 73 74 28 29 0a 2a 2a 20 66 69 6e 64 73 20 74 68  st().** finds th
274d0 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74  e right-most ent
274e0 72 79 20 62 65 6e 65 61 74 68 20 74 68 65 20 2a  ry beneath the *
274f0 70 61 67 65 2a 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  page*..**.** The
27500 20 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72   right-most entr
27510 79 20 69 73 20 74 68 65 20 6f 6e 65 20 77 69 74  y is the one wit
27520 68 20 74 68 65 20 6c 61 72 67 65 73 74 20 6b 65  h the largest ke
27530 79 20 2d 20 74 68 65 20 6c 61 73 74 0a 2a 2a 20  y - the last.** 
27540 6b 65 79 20 69 6e 20 61 73 63 65 6e 64 69 6e 67  key in ascending
27550 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69   order..*/.stati
27560 63 20 69 6e 74 20 6d 6f 76 65 54 6f 52 69 67 68  c int moveToRigh
27570 74 6d 6f 73 74 28 42 74 43 75 72 73 6f 72 20 2a  tmost(BtCursor *
27580 70 43 75 72 29 7b 0a 20 20 50 67 6e 6f 20 70 67  pCur){.  Pgno pg
27590 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  no;.  int rc = S
275a0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 4d 65 6d 50  QLITE_OK;.  MemP
275b0 61 67 65 20 2a 70 50 61 67 65 20 3d 20 30 3b 0a  age *pPage = 0;.
275c0 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
275d0 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
275e0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
275f0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
27600 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 77  SOR_VALID );.  w
27610 68 69 6c 65 28 20 21 28 70 50 61 67 65 20 3d 20  hile( !(pPage = 
27620 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
27630 72 2d 3e 69 50 61 67 65 5d 29 2d 3e 6c 65 61 66  r->iPage])->leaf
27640 20 29 7b 0a 20 20 20 20 70 67 6e 6f 20 3d 20 67   ){.    pgno = g
27650 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e  et4byte(&pPage->
27660 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72  aData[pPage->hdr
27670 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20  Offset+8]);.    
27680 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
27690 2d 3e 69 50 61 67 65 5d 20 3d 20 70 50 61 67 65  ->iPage] = pPage
276a0 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 20 20 72 63 20  ->nCell;.    rc 
276b0 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43  = moveToChild(pC
276c0 75 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 69  ur, pgno);.    i
276d0 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
276e0 63 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 61  c;.  }.  pCur->a
276f0 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
27700 5d 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ] = pPage->nCell
27710 2d 31 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43  -1;.  assert( pC
27720 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d  ur->info.nSize==
27730 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  0 );.  assert( (
27740 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26  pCur->curFlags &
27750 20 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 29   BTCF_ValidNKey)
27760 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  ==0 );.  return 
27770 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
27780 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72   Move the cursor
27790 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 65 6e   to the first en
277a0 74 72 79 20 69 6e 20 74 68 65 20 74 61 62 6c 65  try in the table
277b0 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
277c0 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73  _OK.** on succes
277d0 73 2e 20 20 53 65 74 20 2a 70 52 65 73 20 74 6f  s.  Set *pRes to
277e0 20 30 20 69 66 20 74 68 65 20 63 75 72 73 6f 72   0 if the cursor
277f0 20 61 63 74 75 61 6c 6c 79 20 70 6f 69 6e 74 73   actually points
27800 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a   to something.**
27810 20 6f 72 20 73 65 74 20 2a 70 52 65 73 20 74 6f   or set *pRes to
27820 20 31 20 69 66 20 74 68 65 20 74 61 62 6c 65 20   1 if the table 
27830 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74  is empty..*/.int
27840 20 73 71 6c 69 74 65 33 42 74 72 65 65 46 69 72   sqlite3BtreeFir
27850 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  st(BtCursor *pCu
27860 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20  r, int *pRes){. 
27870 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65   int rc;..  asse
27880 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
27890 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
278a0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
278b0 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d  mutex_held(pCur-
278c0 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74  >pBtree->db->mut
278d0 65 78 29 20 29 3b 0a 20 20 72 63 20 3d 20 6d 6f  ex) );.  rc = mo
278e0 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a  veToRoot(pCur);.
278f0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
27900 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70  _OK ){.    if( p
27910 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
27920 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20  SOR_INVALID ){. 
27930 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75       assert( pCu
27940 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c  r->pgnoRoot==0 |
27950 7c 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  | pCur->apPage[p
27960 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65  Cur->iPage]->nCe
27970 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 2a  ll==0 );.      *
27980 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 7d 65  pRes = 1;.    }e
27990 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72  lse{.      asser
279a0 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  t( pCur->apPage[
279b0 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43  pCur->iPage]->nC
279c0 65 6c 6c 3e 30 20 29 3b 0a 20 20 20 20 20 20 2a  ell>0 );.      *
279d0 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20  pRes = 0;.      
279e0 72 63 20 3d 20 6d 6f 76 65 54 6f 4c 65 66 74 6d  rc = moveToLeftm
279f0 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 20 20 7d  ost(pCur);.    }
27a00 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
27a10 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65  ;.}../* Move the
27a20 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 6c   cursor to the l
27a30 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  ast entry in the
27a40 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20   table.  Return 
27a50 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20  SQLITE_OK.** on 
27a60 73 75 63 63 65 73 73 2e 20 20 53 65 74 20 2a 70  success.  Set *p
27a70 52 65 73 20 74 6f 20 30 20 69 66 20 74 68 65 20  Res to 0 if the 
27a80 63 75 72 73 6f 72 20 61 63 74 75 61 6c 6c 79 20  cursor actually 
27a90 70 6f 69 6e 74 73 20 74 6f 20 73 6f 6d 65 74 68  points to someth
27aa0 69 6e 67 0a 2a 2a 20 6f 72 20 73 65 74 20 2a 70  ing.** or set *p
27ab0 52 65 73 20 74 6f 20 31 20 69 66 20 74 68 65 20  Res to 1 if the 
27ac0 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a  table is empty..
27ad0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
27ae0 72 65 65 4c 61 73 74 28 42 74 43 75 72 73 6f 72  reeLast(BtCursor
27af0 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65   *pCur, int *pRe
27b00 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 0a  s){.  int rc;. .
27b10 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
27b20 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
27b30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
27b40 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
27b50 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64  (pCur->pBtree->d
27b60 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20  b->mutex) );..  
27b70 2f 2a 20 49 66 20 74 68 65 20 63 75 72 73 6f 72  /* If the cursor
27b80 20 61 6c 72 65 61 64 79 20 70 6f 69 6e 74 73 20   already points 
27b90 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72  to the last entr
27ba0 79 2c 20 74 68 69 73 20 69 73 20 61 20 6e 6f 2d  y, this is a no-
27bb0 6f 70 2e 20 2a 2f 0a 20 20 69 66 28 20 43 55 52  op. */.  if( CUR
27bc0 53 4f 52 5f 56 41 4c 49 44 3d 3d 70 43 75 72 2d  SOR_VALID==pCur-
27bd0 3e 65 53 74 61 74 65 20 26 26 20 28 70 43 75 72  >eState && (pCur
27be0 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43  ->curFlags & BTC
27bf0 46 5f 41 74 4c 61 73 74 29 21 3d 30 20 29 7b 0a  F_AtLast)!=0 ){.
27c00 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
27c10 42 55 47 0a 20 20 20 20 2f 2a 20 54 68 69 73 20  BUG.    /* This 
27c20 62 6c 6f 63 6b 20 73 65 72 76 65 73 20 74 6f 20  block serves to 
27c30 61 73 73 65 72 74 28 29 20 74 68 61 74 20 74 68  assert() that th
27c40 65 20 63 75 72 73 6f 72 20 72 65 61 6c 6c 79 20  e cursor really 
27c50 64 6f 65 73 20 70 6f 69 6e 74 20 0a 20 20 20 20  does point .    
27c60 2a 2a 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65  ** to the last e
27c70 6e 74 72 79 20 69 6e 20 74 68 65 20 62 2d 74 72  ntry in the b-tr
27c80 65 65 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  ee. */.    int i
27c90 69 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b  i;.    for(ii=0;
27ca0 20 69 69 3c 70 43 75 72 2d 3e 69 50 61 67 65 3b   ii<pCur->iPage;
27cb0 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73   ii++){.      as
27cc0 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64  sert( pCur->aiId
27cd0 78 5b 69 69 5d 3d 3d 70 43 75 72 2d 3e 61 70 50  x[ii]==pCur->apP
27ce0 61 67 65 5b 69 69 5d 2d 3e 6e 43 65 6c 6c 20 29  age[ii]->nCell )
27cf0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
27d00 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  rt( pCur->aiIdx[
27d10 70 43 75 72 2d 3e 69 50 61 67 65 5d 3d 3d 70 43  pCur->iPage]==pC
27d20 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
27d30 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 2d 31  >iPage]->nCell-1
27d40 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
27d50 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
27d60 72 2d 3e 69 50 61 67 65 5d 2d 3e 6c 65 61 66 20  r->iPage]->leaf 
27d70 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 65  );.#endif.    re
27d80 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
27d90 20 20 7d 0a 0a 20 20 72 63 20 3d 20 6d 6f 76 65    }..  rc = move
27da0 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20  ToRoot(pCur);.  
27db0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
27dc0 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 43 55 52  K ){.    if( CUR
27dd0 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75  SOR_INVALID==pCu
27de0 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20  r->eState ){.   
27df0 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
27e00 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20  >pgnoRoot==0 || 
27e10 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
27e20 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c  r->iPage]->nCell
27e30 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 2a 70 52  ==0 );.      *pR
27e40 65 73 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73  es = 1;.    }els
27e50 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
27e60 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
27e70 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
27e80 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a       *pRes = 0;.
27e90 20 20 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54        rc = moveT
27ea0 6f 52 69 67 68 74 6d 6f 73 74 28 70 43 75 72 29  oRightmost(pCur)
27eb0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
27ec0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
27ed0 20 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c       pCur->curFl
27ee0 61 67 73 20 7c 3d 20 42 54 43 46 5f 41 74 4c 61  ags |= BTCF_AtLa
27ef0 73 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  st;.      }else{
27f00 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 63  .        pCur->c
27f10 75 72 46 6c 61 67 73 20 26 3d 20 7e 42 54 43 46  urFlags &= ~BTCF
27f20 5f 41 74 4c 61 73 74 3b 0a 20 20 20 20 20 20 7d  _AtLast;.      }
27f30 0a 20 20 20 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  .   .    }.  }. 
27f40 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
27f50 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f  * Move the curso
27f60 72 20 73 6f 20 74 68 61 74 20 69 74 20 70 6f 69  r so that it poi
27f70 6e 74 73 20 74 6f 20 61 6e 20 65 6e 74 72 79 20  nts to an entry 
27f80 6e 65 61 72 20 74 68 65 20 6b 65 79 20 0a 2a 2a  near the key .**
27f90 20 73 70 65 63 69 66 69 65 64 20 62 79 20 70 49   specified by pI
27fa0 64 78 4b 65 79 20 6f 72 20 69 6e 74 4b 65 79 2e  dxKey or intKey.
27fb0 20 20 20 52 65 74 75 72 6e 20 61 20 73 75 63 63     Return a succ
27fc0 65 73 73 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20  ess code..**.** 
27fd0 46 6f 72 20 49 4e 54 4b 45 59 20 74 61 62 6c 65  For INTKEY table
27fe0 73 2c 20 74 68 65 20 69 6e 74 4b 65 79 20 70 61  s, the intKey pa
27ff0 72 61 6d 65 74 65 72 20 69 73 20 75 73 65 64 2e  rameter is used.
28000 20 20 70 49 64 78 4b 65 79 20 0a 2a 2a 20 6d 75    pIdxKey .** mu
28010 73 74 20 62 65 20 4e 55 4c 4c 2e 20 20 46 6f 72  st be NULL.  For
28020 20 69 6e 64 65 78 20 74 61 62 6c 65 73 2c 20 70   index tables, p
28030 49 64 78 4b 65 79 20 69 73 20 75 73 65 64 20 61  IdxKey is used a
28040 6e 64 20 69 6e 74 4b 65 79 0a 2a 2a 20 69 73 20  nd intKey.** is 
28050 69 67 6e 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  ignored..**.** I
28060 66 20 61 6e 20 65 78 61 63 74 20 6d 61 74 63 68  f an exact match
28070 20 69 73 20 6e 6f 74 20 66 6f 75 6e 64 2c 20 74   is not found, t
28080 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20 69  hen the cursor i
28090 73 20 61 6c 77 61 79 73 0a 2a 2a 20 6c 65 66 74  s always.** left
280a0 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 20 6c   pointing at a l
280b0 65 61 66 20 70 61 67 65 20 77 68 69 63 68 20 77  eaf page which w
280c0 6f 75 6c 64 20 68 6f 6c 64 20 74 68 65 20 65 6e  ould hold the en
280d0 74 72 79 20 69 66 20 69 74 0a 2a 2a 20 77 65 72  try if it.** wer
280e0 65 20 70 72 65 73 65 6e 74 2e 20 20 54 68 65 20  e present.  The 
280f0 63 75 72 73 6f 72 20 6d 69 67 68 74 20 70 6f 69  cursor might poi
28100 6e 74 20 74 6f 20 61 6e 20 65 6e 74 72 79 20 74  nt to an entry t
28110 68 61 74 20 63 6f 6d 65 73 0a 2a 2a 20 62 65 66  hat comes.** bef
28120 6f 72 65 20 6f 72 20 61 66 74 65 72 20 74 68 65  ore or after the
28130 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 69   key..**.** An i
28140 6e 74 65 67 65 72 20 69 73 20 77 72 69 74 74 65  nteger is writte
28150 6e 20 69 6e 74 6f 20 2a 70 52 65 73 20 77 68 69  n into *pRes whi
28160 63 68 20 69 73 20 74 68 65 20 72 65 73 75 6c 74  ch is the result
28170 20 6f 66 0a 2a 2a 20 63 6f 6d 70 61 72 69 6e 67   of.** comparing
28180 20 74 68 65 20 6b 65 79 20 77 69 74 68 20 74 68   the key with th
28190 65 20 65 6e 74 72 79 20 74 6f 20 77 68 69 63 68  e entry to which
281a0 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 0a   the cursor is .
281b0 2a 2a 20 70 6f 69 6e 74 69 6e 67 2e 20 20 54 68  ** pointing.  Th
281c0 65 20 6d 65 61 6e 69 6e 67 20 6f 66 20 74 68 65  e meaning of the
281d0 20 69 6e 74 65 67 65 72 20 77 72 69 74 74 65 6e   integer written
281e0 20 69 6e 74 6f 0a 2a 2a 20 2a 70 52 65 73 20 69   into.** *pRes i
281f0 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a  s as follows:.**
28200 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73 3c 30 20  .**     *pRes<0 
28210 20 20 20 20 20 54 68 65 20 63 75 72 73 6f 72 20       The cursor 
28220 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67  is left pointing
28230 20 61 74 20 61 6e 20 65 6e 74 72 79 20 74 68 61   at an entry tha
28240 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  t.**            
28250 20 20 20 20 20 20 69 73 20 73 6d 61 6c 6c 65 72        is smaller
28260 20 74 68 61 6e 20 69 6e 74 4b 65 79 2f 70 49 64   than intKey/pId
28270 78 4b 65 79 20 6f 72 20 69 66 20 74 68 65 20 74  xKey or if the t
28280 61 62 6c 65 20 69 73 20 65 6d 70 74 79 0a 2a 2a  able is empty.**
28290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
282a0 20 20 61 6e 64 20 74 68 65 20 63 75 72 73 6f 72    and the cursor
282b0 20 69 73 20 74 68 65 72 65 66 6f 72 65 20 6c 65   is therefore le
282c0 66 74 20 70 6f 69 6e 74 20 74 6f 20 6e 6f 74 68  ft point to noth
282d0 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a  ing..**.**     *
282e0 70 52 65 73 3d 3d 30 20 20 20 20 20 54 68 65 20  pRes==0     The 
282f0 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20 70  cursor is left p
28300 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e  ointing at an en
28310 74 72 79 20 74 68 61 74 0a 2a 2a 20 20 20 20 20  try that.**     
28320 20 20 20 20 20 20 20 20 20 20 20 20 20 65 78 61               exa
28330 63 74 6c 79 20 6d 61 74 63 68 65 73 20 69 6e 74  ctly matches int
28340 4b 65 79 2f 70 49 64 78 4b 65 79 2e 0a 2a 2a 0a  Key/pIdxKey..**.
28350 2a 2a 20 20 20 20 20 2a 70 52 65 73 3e 30 20 20  **     *pRes>0  
28360 20 20 20 20 54 68 65 20 63 75 72 73 6f 72 20 69      The cursor i
28370 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20  s left pointing 
28380 61 74 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74  at an entry that
28390 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
283a0 20 20 20 20 20 69 73 20 6c 61 72 67 65 72 20 74       is larger t
283b0 68 61 6e 20 69 6e 74 4b 65 79 2f 70 49 64 78 4b  han intKey/pIdxK
283c0 65 79 2e 0a 2a 2a 0a 2a 2f 0a 69 6e 74 20 73 71  ey..**.*/.int sq
283d0 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f  lite3BtreeMoveto
283e0 55 6e 70 61 63 6b 65 64 28 0a 20 20 42 74 43 75  Unpacked(.  BtCu
283f0 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20  rsor *pCur,     
28400 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73       /* The curs
28410 6f 72 20 74 6f 20 62 65 20 6d 6f 76 65 64 20 2a  or to be moved *
28420 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f  /.  UnpackedReco
28430 72 64 20 2a 70 49 64 78 4b 65 79 2c 20 2f 2a 20  rd *pIdxKey, /* 
28440 55 6e 70 61 63 6b 65 64 20 69 6e 64 65 78 20 6b  Unpacked index k
28450 65 79 20 2a 2f 0a 20 20 69 36 34 20 69 6e 74 4b  ey */.  i64 intK
28460 65 79 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ey,             
28470 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 6b 65   /* The table ke
28480 79 20 2a 2f 0a 20 20 69 6e 74 20 62 69 61 73 52  y */.  int biasR
28490 69 67 68 74 2c 20 20 20 20 20 20 20 20 20 20 20  ight,           
284a0 2f 2a 20 49 66 20 74 72 75 65 2c 20 62 69 61 73  /* If true, bias
284b0 20 74 68 65 20 73 65 61 72 63 68 20 74 6f 20 74   the search to t
284c0 68 65 20 68 69 67 68 20 65 6e 64 20 2a 2f 0a 20  he high end */. 
284d0 20 69 6e 74 20 2a 70 52 65 73 20 20 20 20 20 20   int *pRes      
284e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
284f0 74 65 20 73 65 61 72 63 68 20 72 65 73 75 6c 74  te search result
28500 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69  s here */.){.  i
28510 6e 74 20 72 63 3b 0a 20 20 52 65 63 6f 72 64 43  nt rc;.  RecordC
28520 6f 6d 70 61 72 65 20 78 52 65 63 6f 72 64 43 6f  ompare xRecordCo
28530 6d 70 61 72 65 3b 0a 0a 20 20 61 73 73 65 72 74  mpare;..  assert
28540 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
28550 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ex(pCur) );.  as
28560 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
28570 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70  tex_held(pCur->p
28580 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78  Btree->db->mutex
28590 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
285a0 52 65 73 20 29 3b 0a 20 20 61 73 73 65 72 74 28  Res );.  assert(
285b0 20 28 70 49 64 78 4b 65 79 3d 3d 30 29 3d 3d 28   (pIdxKey==0)==(
285c0 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d  pCur->pKeyInfo==
285d0 30 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  0) );..  /* If t
285e0 68 65 20 63 75 72 73 6f 72 20 69 73 20 61 6c 72  he cursor is alr
285f0 65 61 64 79 20 70 6f 73 69 74 69 6f 6e 65 64 20  eady positioned 
28600 61 74 20 74 68 65 20 70 6f 69 6e 74 20 77 65 20  at the point we 
28610 61 72 65 20 74 72 79 69 6e 67 0a 20 20 2a 2a 20  are trying.  ** 
28620 74 6f 20 6d 6f 76 65 20 74 6f 2c 20 74 68 65 6e  to move to, then
28630 20 6a 75 73 74 20 72 65 74 75 72 6e 20 77 69 74   just return wit
28640 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79 20 77  hout doing any w
28650 6f 72 6b 20 2a 2f 0a 20 20 69 66 28 20 70 43 75  ork */.  if( pCu
28660 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
28670 52 5f 56 41 4c 49 44 20 26 26 20 28 70 43 75 72  R_VALID && (pCur
28680 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43  ->curFlags & BTC
28690 46 5f 56 61 6c 69 64 4e 4b 65 79 29 21 3d 30 0a  F_ValidNKey)!=0.
286a0 20 20 20 26 26 20 70 43 75 72 2d 3e 61 70 50 61     && pCur->apPa
286b0 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20 0a 20  ge[0]->intKey . 
286c0 20 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72   ){.    if( pCur
286d0 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 69 6e 74  ->info.nKey==int
286e0 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 2a 70 52  Key ){.      *pR
286f0 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65  es = 0;.      re
28700 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
28710 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 70      }.    if( (p
28720 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20  Cur->curFlags & 
28730 42 54 43 46 5f 41 74 4c 61 73 74 29 21 3d 30 20  BTCF_AtLast)!=0 
28740 26 26 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b  && pCur->info.nK
28750 65 79 3c 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20  ey<intKey ){.   
28760 20 20 20 2a 70 52 65 73 20 3d 20 2d 31 3b 0a 20     *pRes = -1;. 
28770 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
28780 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d  TE_OK;.    }.  }
28790 0a 0a 20 20 69 66 28 20 70 49 64 78 4b 65 79 20  ..  if( pIdxKey 
287a0 29 7b 0a 20 20 20 20 78 52 65 63 6f 72 64 43 6f  ){.    xRecordCo
287b0 6d 70 61 72 65 20 3d 20 73 71 6c 69 74 65 33 56  mpare = sqlite3V
287c0 64 62 65 46 69 6e 64 43 6f 6d 70 61 72 65 28 70  dbeFindCompare(p
287d0 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 70 49 64  IdxKey);.    pId
287e0 78 4b 65 79 2d 3e 65 72 72 43 6f 64 65 20 3d 20  xKey->errCode = 
287f0 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  0;.    assert( p
28800 49 64 78 4b 65 79 2d 3e 64 65 66 61 75 6c 74 5f  IdxKey->default_
28810 72 63 3d 3d 31 20 0a 20 20 20 20 20 20 20 20 20  rc==1 .         
28820 7c 7c 20 70 49 64 78 4b 65 79 2d 3e 64 65 66 61  || pIdxKey->defa
28830 75 6c 74 5f 72 63 3d 3d 30 20 0a 20 20 20 20 20  ult_rc==0 .     
28840 20 20 20 20 7c 7c 20 70 49 64 78 4b 65 79 2d 3e      || pIdxKey->
28850 64 65 66 61 75 6c 74 5f 72 63 3d 3d 2d 31 0a 20  default_rc==-1. 
28860 20 20 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20     );.  }else{. 
28870 20 20 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72     xRecordCompar
28880 65 20 3d 20 30 3b 20 2f 2a 20 41 6c 6c 20 6b 65  e = 0; /* All ke
28890 79 73 20 61 72 65 20 69 6e 74 65 67 65 72 73 20  ys are integers 
288a0 2a 2f 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 6d  */.  }..  rc = m
288b0 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b  oveToRoot(pCur);
288c0 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
288d0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
288e0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
288f0 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70  pgnoRoot==0 || p
28900 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
28910 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20 61 73  ->iPage] );.  as
28920 73 65 72 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f  sert( pCur->pgno
28930 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d  Root==0 || pCur-
28940 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
28950 61 67 65 5d 2d 3e 69 73 49 6e 69 74 20 29 3b 0a  age]->isInit );.
28960 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
28970 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49  eState==CURSOR_I
28980 4e 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e  NVALID || pCur->
28990 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
289a0 67 65 5d 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a  ge]->nCell>0 );.
289b0 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
289c0 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c  te==CURSOR_INVAL
289d0 49 44 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 20  ID ){.    *pRes 
289e0 3d 20 2d 31 3b 0a 20 20 20 20 61 73 73 65 72 74  = -1;.    assert
289f0 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74  ( pCur->pgnoRoot
28a00 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50  ==0 || pCur->apP
28a10 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
28a20 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20  ->nCell==0 );.  
28a30 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
28a40 4f 4b 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  OK;.  }.  assert
28a50 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30  ( pCur->apPage[0
28a60 5d 2d 3e 69 6e 74 4b 65 79 20 7c 7c 20 70 49 64  ]->intKey || pId
28a70 78 4b 65 79 20 29 3b 0a 20 20 66 6f 72 28 3b 3b  xKey );.  for(;;
28a80 29 7b 0a 20 20 20 20 69 6e 74 20 6c 77 72 2c 20  ){.    int lwr, 
28a90 75 70 72 2c 20 69 64 78 2c 20 63 3b 0a 20 20 20  upr, idx, c;.   
28aa0 20 50 67 6e 6f 20 63 68 6c 64 50 67 3b 0a 20 20   Pgno chldPg;.  
28ab0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
28ac0 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b   = pCur->apPage[
28ad0 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20  pCur->iPage];.  
28ae0 20 20 75 38 20 2a 70 43 65 6c 6c 3b 20 20 20 20    u8 *pCell;    
28af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28b00 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
28b10 20 74 6f 20 63 75 72 72 65 6e 74 20 63 65 6c 6c   to current cell
28b20 20 69 6e 20 70 50 61 67 65 20 2a 2f 0a 0a 20 20   in pPage */..  
28b30 20 20 2f 2a 20 70 50 61 67 65 2d 3e 6e 43 65 6c    /* pPage->nCel
28b40 6c 20 6d 75 73 74 20 62 65 20 67 72 65 61 74 65  l must be greate
28b50 72 20 74 68 61 6e 20 7a 65 72 6f 2e 20 49 66 20  r than zero. If 
28b60 74 68 69 73 20 69 73 20 74 68 65 20 72 6f 6f 74  this is the root
28b70 2d 70 61 67 65 0a 20 20 20 20 2a 2a 20 74 68 65  -page.    ** the
28b80 20 63 75 72 73 6f 72 20 77 6f 75 6c 64 20 68 61   cursor would ha
28b90 76 65 20 62 65 65 6e 20 49 4e 56 41 4c 49 44 20  ve been INVALID 
28ba0 61 62 6f 76 65 20 61 6e 64 20 74 68 69 73 20 66  above and this f
28bb0 6f 72 28 3b 3b 29 20 6c 6f 6f 70 0a 20 20 20 20  or(;;) loop.    
28bc0 2a 2a 20 6e 6f 74 20 72 75 6e 2e 20 49 66 20 74  ** not run. If t
28bd0 68 69 73 20 69 73 20 6e 6f 74 20 74 68 65 20 72  his is not the r
28be0 6f 6f 74 2d 70 61 67 65 2c 20 74 68 65 6e 20 74  oot-page, then t
28bf0 68 65 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 29  he moveToChild()
28c00 20 72 6f 75 74 69 6e 65 0a 20 20 20 20 2a 2a 20   routine.    ** 
28c10 77 6f 75 6c 64 20 68 61 76 65 20 61 6c 72 65 61  would have alrea
28c20 64 79 20 64 65 74 65 63 74 65 64 20 64 62 20 63  dy detected db c
28c30 6f 72 72 75 70 74 69 6f 6e 2e 20 53 69 6d 69 6c  orruption. Simil
28c40 61 72 6c 79 2c 20 70 50 61 67 65 20 6d 75 73 74  arly, pPage must
28c50 0a 20 20 20 20 2a 2a 20 62 65 20 74 68 65 20 72  .    ** be the r
28c60 69 67 68 74 20 6b 69 6e 64 20 28 69 6e 64 65 78  ight kind (index
28c70 20 6f 72 20 74 61 62 6c 65 29 20 6f 66 20 62 2d   or table) of b-
28c80 74 72 65 65 20 70 61 67 65 2e 20 4f 74 68 65 72  tree page. Other
28c90 77 69 73 65 0a 20 20 20 20 2a 2a 20 61 20 6d 6f  wise.    ** a mo
28ca0 76 65 54 6f 43 68 69 6c 64 28 29 20 6f 72 20 6d  veToChild() or m
28cb0 6f 76 65 54 6f 52 6f 6f 74 28 29 20 63 61 6c 6c  oveToRoot() call
28cc0 20 77 6f 75 6c 64 20 68 61 76 65 20 64 65 74 65   would have dete
28cd0 63 74 65 64 20 63 6f 72 72 75 70 74 69 6f 6e 2e  cted corruption.
28ce0 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
28cf0 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20   pPage->nCell>0 
28d00 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
28d10 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3d 3d 28 70  Page->intKey==(p
28d20 49 64 78 4b 65 79 3d 3d 30 29 20 29 3b 0a 20 20  IdxKey==0) );.  
28d30 20 20 6c 77 72 20 3d 20 30 3b 0a 20 20 20 20 75    lwr = 0;.    u
28d40 70 72 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c  pr = pPage->nCel
28d50 6c 2d 31 3b 0a 20 20 20 20 61 73 73 65 72 74 28  l-1;.    assert(
28d60 20 62 69 61 73 52 69 67 68 74 3d 3d 30 20 7c 7c   biasRight==0 ||
28d70 20 62 69 61 73 52 69 67 68 74 3d 3d 31 20 29 3b   biasRight==1 );
28d80 0a 20 20 20 20 69 64 78 20 3d 20 75 70 72 3e 3e  .    idx = upr>>
28d90 28 31 2d 62 69 61 73 52 69 67 68 74 29 3b 20 2f  (1-biasRight); /
28da0 2a 20 69 64 78 20 3d 20 62 69 61 73 52 69 67 68  * idx = biasRigh
28db0 74 20 3f 20 75 70 72 20 3a 20 28 6c 77 72 2b 75  t ? upr : (lwr+u
28dc0 70 72 29 2f 32 3b 20 2a 2f 0a 20 20 20 20 70 43  pr)/2; */.    pC
28dd0 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
28de0 69 50 61 67 65 5d 20 3d 20 28 75 31 36 29 69 64  iPage] = (u16)id
28df0 78 3b 0a 20 20 20 20 69 66 28 20 78 52 65 63 6f  x;.    if( xReco
28e00 72 64 43 6f 6d 70 61 72 65 3d 3d 30 20 29 7b 0a  rdCompare==0 ){.
28e10 20 20 20 20 20 20 66 6f 72 28 3b 3b 29 7b 0a 20        for(;;){. 
28e20 20 20 20 20 20 20 20 69 36 34 20 6e 43 65 6c 6c         i64 nCell
28e30 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 70 43 65  Key;.        pCe
28e40 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50  ll = findCell(pP
28e50 61 67 65 2c 20 69 64 78 29 20 2b 20 70 50 61 67  age, idx) + pPag
28e60 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b  e->childPtrSize;
28e70 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61  .        if( pPa
28e80 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20 29  ge->intKeyLeaf )
28e90 7b 0a 20 20 20 20 20 20 20 20 20 20 77 68 69 6c  {.          whil
28ea0 65 28 20 30 78 38 30 20 3c 3d 20 2a 28 70 43 65  e( 0x80 <= *(pCe
28eb0 6c 6c 2b 2b 29 20 29 7b 0a 20 20 20 20 20 20 20  ll++) ){.       
28ec0 20 20 20 20 20 69 66 28 20 70 43 65 6c 6c 3e 3d       if( pCell>=
28ed0 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20  pPage->aDataEnd 
28ee0 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
28ef0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
28f00 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
28f10 20 20 7d 0a 20 20 20 20 20 20 20 20 67 65 74 56    }.        getV
28f20 61 72 69 6e 74 28 70 43 65 6c 6c 2c 20 28 75 36  arint(pCell, (u6
28f30 34 2a 29 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20  4*)&nCellKey);. 
28f40 20 20 20 20 20 20 20 69 66 28 20 6e 43 65 6c 6c         if( nCell
28f50 4b 65 79 3c 69 6e 74 4b 65 79 20 29 7b 0a 20 20  Key<intKey ){.  
28f60 20 20 20 20 20 20 20 20 6c 77 72 20 3d 20 69 64          lwr = id
28f70 78 2b 31 3b 0a 20 20 20 20 20 20 20 20 20 20 69  x+1;.          i
28f80 66 28 20 6c 77 72 3e 75 70 72 20 29 7b 20 63 20  f( lwr>upr ){ c 
28f90 3d 20 2d 31 3b 20 62 72 65 61 6b 3b 20 7d 0a 20  = -1; break; }. 
28fa0 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
28fb0 20 6e 43 65 6c 6c 4b 65 79 3e 69 6e 74 4b 65 79   nCellKey>intKey
28fc0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 70   ){.          up
28fd0 72 20 3d 20 69 64 78 2d 31 3b 0a 20 20 20 20 20  r = idx-1;.     
28fe0 20 20 20 20 20 69 66 28 20 6c 77 72 3e 75 70 72       if( lwr>upr
28ff0 20 29 7b 20 63 20 3d 20 2b 31 3b 20 62 72 65 61   ){ c = +1; brea
29000 6b 3b 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c  k; }.        }el
29010 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73  se{.          as
29020 73 65 72 74 28 20 6e 43 65 6c 6c 4b 65 79 3d 3d  sert( nCellKey==
29030 69 6e 74 4b 65 79 20 29 3b 0a 20 20 20 20 20 20  intKey );.      
29040 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61      pCur->curFla
29050 67 73 20 7c 3d 20 42 54 43 46 5f 56 61 6c 69 64  gs |= BTCF_Valid
29060 4e 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 20 20  NKey;.          
29070 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 20  pCur->info.nKey 
29080 3d 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20  = nCellKey;.    
29090 20 20 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64        pCur->aiId
290a0 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d  x[pCur->iPage] =
290b0 20 28 75 31 36 29 69 64 78 3b 0a 20 20 20 20 20   (u16)idx;.     
290c0 20 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d       if( !pPage-
290d0 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20  >leaf ){.       
290e0 20 20 20 20 20 6c 77 72 20 3d 20 69 64 78 3b 0a       lwr = idx;.
290f0 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f              goto
29100 20 6d 6f 76 65 74 6f 5f 6e 65 78 74 5f 6c 61 79   moveto_next_lay
29110 65 72 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  er;.          }e
29120 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
29130 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20   *pRes = 0;.    
29140 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
29150 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20  ITE_OK;.        
29160 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f      goto moveto_
29170 66 69 6e 69 73 68 3b 0a 20 20 20 20 20 20 20 20  finish;.        
29180 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
29190 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6c 77        assert( lw
291a0 72 2b 75 70 72 3e 3d 30 20 29 3b 0a 20 20 20 20  r+upr>=0 );.    
291b0 20 20 20 20 69 64 78 20 3d 20 28 6c 77 72 2b 75      idx = (lwr+u
291c0 70 72 29 3e 3e 31 3b 20 20 2f 2a 20 69 64 78 20  pr)>>1;  /* idx 
291d0 3d 20 28 6c 77 72 2b 75 70 72 29 2f 32 3b 20 2a  = (lwr+upr)/2; *
291e0 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  /.      }.    }e
291f0 6c 73 65 7b 0a 20 20 20 20 20 20 66 6f 72 28 3b  lse{.      for(;
29200 3b 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  ;){.        int 
29210 6e 43 65 6c 6c 3b 0a 20 20 20 20 20 20 20 20 70  nCell;.        p
29220 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28  Cell = findCell(
29230 70 50 61 67 65 2c 20 69 64 78 29 20 2b 20 70 50  pPage, idx) + pP
29240 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a  age->childPtrSiz
29250 65 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 54  e;..        /* T
29260 68 65 20 6d 61 78 69 6d 75 6d 20 73 75 70 70 6f  he maximum suppo
29270 72 74 65 64 20 70 61 67 65 2d 73 69 7a 65 20 69  rted page-size i
29280 73 20 36 35 35 33 36 20 62 79 74 65 73 2e 20 54  s 65536 bytes. T
29290 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 0a 20  his means that. 
292a0 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6d 61         ** the ma
292b0 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20  ximum number of 
292c0 72 65 63 6f 72 64 20 62 79 74 65 73 20 73 74 6f  record bytes sto
292d0 72 65 64 20 6f 6e 20 61 6e 20 69 6e 64 65 78 20  red on an index 
292e0 42 2d 54 72 65 65 0a 20 20 20 20 20 20 20 20 2a  B-Tree.        *
292f0 2a 20 70 61 67 65 20 69 73 20 6c 65 73 73 20 74  * page is less t
29300 68 61 6e 20 31 36 33 38 34 20 62 79 74 65 73 20  han 16384 bytes 
29310 61 6e 64 20 6d 61 79 20 62 65 20 73 74 6f 72 65  and may be store
29320 64 20 61 73 20 61 20 32 2d 62 79 74 65 0a 20 20  d as a 2-byte.  
29330 20 20 20 20 20 20 2a 2a 20 76 61 72 69 6e 74 2e        ** varint.
29340 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f   This informatio
29350 6e 20 69 73 20 75 73 65 64 20 74 6f 20 61 74 74  n is used to att
29360 65 6d 70 74 20 74 6f 20 61 76 6f 69 64 20 70 61  empt to avoid pa
29370 72 73 69 6e 67 20 0a 20 20 20 20 20 20 20 20 2a  rsing .        *
29380 2a 20 74 68 65 20 65 6e 74 69 72 65 20 63 65 6c  * the entire cel
29390 6c 20 62 79 20 63 68 65 63 6b 69 6e 67 20 66 6f  l by checking fo
293a0 72 20 74 68 65 20 63 61 73 65 73 20 77 68 65 72  r the cases wher
293b0 65 20 74 68 65 20 72 65 63 6f 72 64 20 69 73 20  e the record is 
293c0 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 74 6f 72  .        ** stor
293d0 65 64 20 65 6e 74 69 72 65 6c 79 20 77 69 74 68  ed entirely with
293e0 69 6e 20 74 68 65 20 62 2d 74 72 65 65 20 70 61  in the b-tree pa
293f0 67 65 20 62 79 20 69 6e 73 70 65 63 74 69 6e 67  ge by inspecting
29400 20 74 68 65 20 66 69 72 73 74 20 0a 20 20 20 20   the first .    
29410 20 20 20 20 2a 2a 20 32 20 62 79 74 65 73 20 6f      ** 2 bytes o
29420 66 20 74 68 65 20 63 65 6c 6c 2e 0a 20 20 20 20  f the cell..    
29430 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 6e      */.        n
29440 43 65 6c 6c 20 3d 20 70 43 65 6c 6c 5b 30 5d 3b  Cell = pCell[0];
29450 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 43 65  .        if( nCe
29460 6c 6c 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 31 62  ll<=pPage->max1b
29470 79 74 65 50 61 79 6c 6f 61 64 20 29 7b 0a 20 20  ytePayload ){.  
29480 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20          /* This 
29490 62 72 61 6e 63 68 20 72 75 6e 73 20 69 66 20 74  branch runs if t
294a0 68 65 20 72 65 63 6f 72 64 2d 73 69 7a 65 20 66  he record-size f
294b0 69 65 6c 64 20 6f 66 20 74 68 65 20 63 65 6c 6c  ield of the cell
294c0 20 69 73 20 61 0a 20 20 20 20 20 20 20 20 20 20   is a.          
294d0 2a 2a 20 73 69 6e 67 6c 65 20 62 79 74 65 20 76  ** single byte v
294e0 61 72 69 6e 74 20 61 6e 64 20 74 68 65 20 72 65  arint and the re
294f0 63 6f 72 64 20 66 69 74 73 20 65 6e 74 69 72 65  cord fits entire
29500 6c 79 20 6f 6e 20 74 68 65 20 6d 61 69 6e 0a 20  ly on the main. 
29510 20 20 20 20 20 20 20 20 20 2a 2a 20 62 2d 74 72           ** b-tr
29520 65 65 20 70 61 67 65 2e 20 20 2a 2f 0a 20 20 20  ee page.  */.   
29530 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
29540 20 70 43 65 6c 6c 2b 6e 43 65 6c 6c 2b 31 3d 3d   pCell+nCell+1==
29550 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20  pPage->aDataEnd 
29560 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d  );.          c =
29570 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28   xRecordCompare(
29580 6e 43 65 6c 6c 2c 20 28 76 6f 69 64 2a 29 26 70  nCell, (void*)&p
29590 43 65 6c 6c 5b 31 5d 2c 20 70 49 64 78 4b 65 79  Cell[1], pIdxKey
295a0 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
295b0 20 69 66 28 20 21 28 70 43 65 6c 6c 5b 31 5d 20   if( !(pCell[1] 
295c0 26 20 30 78 38 30 29 20 0a 20 20 20 20 20 20 20  & 0x80) .       
295d0 20 20 20 26 26 20 28 6e 43 65 6c 6c 20 3d 20 28     && (nCell = (
295e0 28 6e 43 65 6c 6c 26 30 78 37 66 29 3c 3c 37 29  (nCell&0x7f)<<7)
295f0 20 2b 20 70 43 65 6c 6c 5b 31 5d 29 3c 3d 70 50   + pCell[1])<=pP
29600 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 0a 20 20  age->maxLocal.  
29610 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
29620 20 20 20 2f 2a 20 54 68 65 20 72 65 63 6f 72 64     /* The record
29630 2d 73 69 7a 65 20 66 69 65 6c 64 20 69 73 20 61  -size field is a
29640 20 32 20 62 79 74 65 20 76 61 72 69 6e 74 20 61   2 byte varint a
29650 6e 64 20 74 68 65 20 72 65 63 6f 72 64 20 0a 20  nd the record . 
29660 20 20 20 20 20 20 20 20 20 2a 2a 20 66 69 74 73           ** fits
29670 20 65 6e 74 69 72 65 6c 79 20 6f 6e 20 74 68 65   entirely on the
29680 20 6d 61 69 6e 20 62 2d 74 72 65 65 20 70 61 67   main b-tree pag
29690 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  e.  */.         
296a0 20 74 65 73 74 63 61 73 65 28 20 70 43 65 6c 6c   testcase( pCell
296b0 2b 6e 43 65 6c 6c 2b 32 3d 3d 70 50 61 67 65 2d  +nCell+2==pPage-
296c0 3e 61 44 61 74 61 45 6e 64 20 29 3b 0a 20 20 20  >aDataEnd );.   
296d0 20 20 20 20 20 20 20 63 20 3d 20 78 52 65 63 6f         c = xReco
296e0 72 64 43 6f 6d 70 61 72 65 28 6e 43 65 6c 6c 2c  rdCompare(nCell,
296f0 20 28 76 6f 69 64 2a 29 26 70 43 65 6c 6c 5b 32   (void*)&pCell[2
29700 5d 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20 20 20  ], pIdxKey);.   
29710 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
29720 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 63        /* The rec
29730 6f 72 64 20 66 6c 6f 77 73 20 6f 76 65 72 20 6f  ord flows over o
29740 6e 74 6f 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  nto one or more 
29750 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20  overflow pages. 
29760 49 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  In.          ** 
29770 74 68 69 73 20 63 61 73 65 20 74 68 65 20 77 68  this case the wh
29780 6f 6c 65 20 63 65 6c 6c 20 6e 65 65 64 73 20 74  ole cell needs t
29790 6f 20 62 65 20 70 61 72 73 65 64 2c 20 61 20 62  o be parsed, a b
297a0 75 66 66 65 72 20 61 6c 6c 6f 63 61 74 65 64 0a  uffer allocated.
297b0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 64            ** and
297c0 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 29   accessPayload()
297d0 20 75 73 65 64 20 74 6f 20 72 65 74 72 69 65 76   used to retriev
297e0 65 20 74 68 65 20 72 65 63 6f 72 64 20 69 6e 74  e the record int
297f0 6f 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20  o the.          
29800 2a 2a 20 62 75 66 66 65 72 20 62 65 66 6f 72 65  ** buffer before
29810 20 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61   VdbeRecordCompa
29820 72 65 28 29 20 63 61 6e 20 62 65 20 63 61 6c 6c  re() can be call
29830 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ed. */.         
29840 20 76 6f 69 64 20 2a 70 43 65 6c 6c 4b 65 79 3b   void *pCellKey;
29850 0a 20 20 20 20 20 20 20 20 20 20 75 38 20 2a 20  .          u8 * 
29860 63 6f 6e 73 74 20 70 43 65 6c 6c 42 6f 64 79 20  const pCellBody 
29870 3d 20 70 43 65 6c 6c 20 2d 20 70 50 61 67 65 2d  = pCell - pPage-
29880 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20  >childPtrSize;. 
29890 20 20 20 20 20 20 20 20 20 62 74 72 65 65 50 61           btreePa
298a0 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65  rseCellPtr(pPage
298b0 2c 20 70 43 65 6c 6c 42 6f 64 79 2c 20 26 70 43  , pCellBody, &pC
298c0 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20 20 20 20 20  ur->info);.     
298d0 20 20 20 20 20 6e 43 65 6c 6c 20 3d 20 28 69 6e       nCell = (in
298e0 74 29 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65  t)pCur->info.nKe
298f0 79 3b 0a 20 20 20 20 20 20 20 20 20 20 70 43 65  y;.          pCe
29900 6c 6c 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 4d  llKey = sqlite3M
29910 61 6c 6c 6f 63 28 20 6e 43 65 6c 6c 20 29 3b 0a  alloc( nCell );.
29920 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 43            if( pC
29930 65 6c 6c 4b 65 79 3d 3d 30 20 29 7b 0a 20 20 20  ellKey==0 ){.   
29940 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
29950 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
29960 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76          goto mov
29970 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20  eto_finish;.    
29980 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
29990 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43    pCur->aiIdx[pC
299a0 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75 31  ur->iPage] = (u1
299b0 36 29 69 64 78 3b 0a 20 20 20 20 20 20 20 20 20  6)idx;.         
299c0 20 72 63 20 3d 20 61 63 63 65 73 73 50 61 79 6c   rc = accessPayl
299d0 6f 61 64 28 70 43 75 72 2c 20 30 2c 20 6e 43 65  oad(pCur, 0, nCe
299e0 6c 6c 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68  ll, (unsigned ch
299f0 61 72 2a 29 70 43 65 6c 6c 4b 65 79 2c 20 32 29  ar*)pCellKey, 2)
29a00 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
29a10 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rc ){.          
29a20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
29a30 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20  CellKey);.      
29a40 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74        goto movet
29a50 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 20 20  o_finish;.      
29a60 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
29a70 63 20 3d 20 78 52 65 63 6f 72 64 43 6f 6d 70 61  c = xRecordCompa
29a80 72 65 28 6e 43 65 6c 6c 2c 20 70 43 65 6c 6c 4b  re(nCell, pCellK
29a90 65 79 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20 20  ey, pIdxKey);.  
29aa0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
29ab0 66 72 65 65 28 70 43 65 6c 6c 4b 65 79 29 3b 0a  free(pCellKey);.
29ac0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
29ad0 20 20 61 73 73 65 72 74 28 20 0a 20 20 20 20 20    assert( .     
29ae0 20 20 20 20 20 20 20 28 70 49 64 78 4b 65 79 2d         (pIdxKey-
29af0 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45  >errCode!=SQLITE
29b00 5f 43 4f 52 52 55 50 54 20 7c 7c 20 63 3d 3d 30  _CORRUPT || c==0
29b10 29 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 70  ).         && (p
29b20 49 64 78 4b 65 79 2d 3e 65 72 72 43 6f 64 65 21  IdxKey->errCode!
29b30 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c  =SQLITE_NOMEM ||
29b40 20 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64   pCur->pBtree->d
29b50 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 29  b->mallocFailed)
29b60 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .        );.    
29b70 20 20 20 20 69 66 28 20 63 3c 30 20 29 7b 0a 20      if( c<0 ){. 
29b80 20 20 20 20 20 20 20 20 20 6c 77 72 20 3d 20 69           lwr = i
29b90 64 78 2b 31 3b 0a 20 20 20 20 20 20 20 20 7d 65  dx+1;.        }e
29ba0 6c 73 65 20 69 66 28 20 63 3e 30 20 29 7b 0a 20  lse if( c>0 ){. 
29bb0 20 20 20 20 20 20 20 20 20 75 70 72 20 3d 20 69           upr = i
29bc0 64 78 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d 65  dx-1;.        }e
29bd0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 61  lse{.          a
29be0 73 73 65 72 74 28 20 63 3d 3d 30 20 29 3b 0a 20  ssert( c==0 );. 
29bf0 20 20 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d           *pRes =
29c00 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63   0;.          rc
29c10 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
29c20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 61 69          pCur->ai
29c30 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
29c40 20 3d 20 28 75 31 36 29 69 64 78 3b 0a 20 20 20   = (u16)idx;.   
29c50 20 20 20 20 20 20 20 69 66 28 20 70 49 64 78 4b         if( pIdxK
29c60 65 79 2d 3e 65 72 72 43 6f 64 65 20 29 20 72 63  ey->errCode ) rc
29c70 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
29c80 54 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  T;.          got
29c90 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b  o moveto_finish;
29ca0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
29cb0 20 20 20 69 66 28 20 6c 77 72 3e 75 70 72 20 29     if( lwr>upr )
29cc0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
29cd0 61 73 73 65 72 74 28 20 6c 77 72 2b 75 70 72 3e  assert( lwr+upr>
29ce0 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 64  =0 );.        id
29cf0 78 20 3d 20 28 6c 77 72 2b 75 70 72 29 3e 3e 31  x = (lwr+upr)>>1
29d00 3b 20 20 2f 2a 20 69 64 78 20 3d 20 28 6c 77 72  ;  /* idx = (lwr
29d10 2b 75 70 72 29 2f 32 20 2a 2f 0a 20 20 20 20 20  +upr)/2 */.     
29d20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73   }.    }.    ass
29d30 65 72 74 28 20 6c 77 72 3d 3d 75 70 72 2b 31 20  ert( lwr==upr+1 
29d40 7c 7c 20 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65  || (pPage->intKe
29d50 79 20 26 26 20 21 70 50 61 67 65 2d 3e 6c 65 61  y && !pPage->lea
29d60 66 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  f) );.    assert
29d70 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20  ( pPage->isInit 
29d80 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  );.    if( pPage
29d90 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  ->leaf ){.      
29da0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69  assert( pCur->ai
29db0 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
29dc0 3c 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43  <pCur->apPage[pC
29dd0 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c  ur->iPage]->nCel
29de0 6c 20 29 3b 0a 20 20 20 20 20 20 70 43 75 72 2d  l );.      pCur-
29df0 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
29e00 67 65 5d 20 3d 20 28 75 31 36 29 69 64 78 3b 0a  ge] = (u16)idx;.
29e10 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 63 3b        *pRes = c;
29e20 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
29e30 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 67 6f 74  TE_OK;.      got
29e40 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b  o moveto_finish;
29e50 0a 20 20 20 20 7d 0a 6d 6f 76 65 74 6f 5f 6e 65  .    }.moveto_ne
29e60 78 74 5f 6c 61 79 65 72 3a 0a 20 20 20 20 69 66  xt_layer:.    if
29e70 28 20 6c 77 72 3e 3d 70 50 61 67 65 2d 3e 6e 43  ( lwr>=pPage->nC
29e80 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 63 68 6c  ell ){.      chl
29e90 64 50 67 20 3d 20 67 65 74 34 62 79 74 65 28 26  dPg = get4byte(&
29ea0 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61  pPage->aData[pPa
29eb0 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  ge->hdrOffset+8]
29ec0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
29ed0 20 20 20 20 63 68 6c 64 50 67 20 3d 20 67 65 74      chldPg = get
29ee0 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70  4byte(findCell(p
29ef0 50 61 67 65 2c 20 6c 77 72 29 29 3b 0a 20 20 20  Page, lwr));.   
29f00 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49   }.    pCur->aiI
29f10 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20  dx[pCur->iPage] 
29f20 3d 20 28 75 31 36 29 6c 77 72 3b 0a 20 20 20 20  = (u16)lwr;.    
29f30 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64  rc = moveToChild
29f40 28 70 43 75 72 2c 20 63 68 6c 64 50 67 29 3b 0a  (pCur, chldPg);.
29f50 20 20 20 20 69 66 28 20 72 63 20 29 20 62 72 65      if( rc ) bre
29f60 61 6b 3b 0a 20 20 7d 0a 6d 6f 76 65 74 6f 5f 66  ak;.  }.moveto_f
29f70 69 6e 69 73 68 3a 0a 20 20 70 43 75 72 2d 3e 69  inish:.  pCur->i
29f80 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20  nfo.nSize = 0;. 
29f90 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20   pCur->curFlags 
29fa0 26 3d 20 7e 28 42 54 43 46 5f 56 61 6c 69 64 4e  &= ~(BTCF_ValidN
29fb0 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76  Key|BTCF_ValidOv
29fc0 66 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  fl);.  return rc
29fd0 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  ;.}.../*.** Retu
29fe0 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 63  rn TRUE if the c
29ff0 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 70 6f 69  ursor is not poi
2a000 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72  nting at an entr
2a010 79 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 0a  y of the table..
2a020 2a 2a 0a 2a 2a 20 54 52 55 45 20 77 69 6c 6c 20  **.** TRUE will 
2a030 62 65 20 72 65 74 75 72 6e 65 64 20 61 66 74 65  be returned afte
2a040 72 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  r a call to sqli
2a050 74 65 33 42 74 72 65 65 4e 65 78 74 28 29 20 6d  te3BtreeNext() m
2a060 6f 76 65 73 0a 2a 2a 20 70 61 73 74 20 74 68 65  oves.** past the
2a070 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74   last entry in t
2a080 68 65 20 74 61 62 6c 65 20 6f 72 20 73 71 6c 69  he table or sqli
2a090 74 65 33 42 74 72 65 65 50 72 65 76 28 29 20 6d  te3BtreePrev() m
2a0a0 6f 76 65 73 20 70 61 73 74 0a 2a 2a 20 74 68 65  oves past.** the
2a0b0 20 66 69 72 73 74 20 65 6e 74 72 79 2e 20 20 54   first entry.  T
2a0c0 52 55 45 20 69 73 20 61 6c 73 6f 20 72 65 74 75  RUE is also retu
2a0d0 72 6e 65 64 20 69 66 20 74 68 65 20 74 61 62 6c  rned if the tabl
2a0e0 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69  e is empty..*/.i
2a0f0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  nt sqlite3BtreeE
2a100 6f 66 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  of(BtCursor *pCu
2a110 72 29 7b 0a 20 20 2f 2a 20 54 4f 44 4f 3a 20 57  r){.  /* TODO: W
2a120 68 61 74 20 69 66 20 74 68 65 20 63 75 72 73 6f  hat if the curso
2a130 72 20 69 73 20 69 6e 20 43 55 52 53 4f 52 5f 52  r is in CURSOR_R
2a140 45 51 55 49 52 45 53 45 45 4b 20 62 75 74 20 61  EQUIRESEEK but a
2a150 6c 6c 20 74 61 62 6c 65 20 65 6e 74 72 69 65 73  ll table entries
2a160 0a 20 20 2a 2a 20 68 61 76 65 20 62 65 65 6e 20  .  ** have been 
2a170 64 65 6c 65 74 65 64 3f 20 54 68 69 73 20 41 50  deleted? This AP
2a180 49 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 63  I will need to c
2a190 68 61 6e 67 65 20 74 6f 20 72 65 74 75 72 6e 20  hange to return 
2a1a0 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 0a 20 20  an error code.  
2a1b0 2a 2a 20 61 73 20 77 65 6c 6c 20 61 73 20 74 68  ** as well as th
2a1c0 65 20 62 6f 6f 6c 65 61 6e 20 72 65 73 75 6c 74  e boolean result
2a1d0 20 76 61 6c 75 65 2e 0a 20 20 2a 2f 0a 20 20 72   value..  */.  r
2a1e0 65 74 75 72 6e 20 28 43 55 52 53 4f 52 5f 56 41  eturn (CURSOR_VA
2a1f0 4c 49 44 21 3d 70 43 75 72 2d 3e 65 53 74 61 74  LID!=pCur->eStat
2a200 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76  e);.}../*.** Adv
2a210 61 6e 63 65 20 74 68 65 20 63 75 72 73 6f 72 20  ance the cursor 
2a220 74 6f 20 74 68 65 20 6e 65 78 74 20 65 6e 74 72  to the next entr
2a230 79 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  y in the databas
2a240 65 2e 20 20 49 66 0a 2a 2a 20 73 75 63 63 65 73  e.  If.** succes
2a250 73 66 75 6c 20 74 68 65 6e 20 73 65 74 20 2a 70  sful then set *p
2a260 52 65 73 3d 30 2e 20 20 49 66 20 74 68 65 20 63  Res=0.  If the c
2a270 75 72 73 6f 72 0a 2a 2a 20 77 61 73 20 61 6c 72  ursor.** was alr
2a280 65 61 64 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f  eady pointing to
2a290 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20   the last entry 
2a2a0 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
2a2b0 62 65 66 6f 72 65 0a 2a 2a 20 74 68 69 73 20 72  before.** this r
2a2c0 6f 75 74 69 6e 65 20 77 61 73 20 63 61 6c 6c 65  outine was calle
2a2d0 64 2c 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65  d, then set *pRe
2a2e0 73 3d 31 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d  s=1..**.** The m
2a2f0 61 69 6e 20 65 6e 74 72 79 20 70 6f 69 6e 74 20  ain entry point 
2a300 69 73 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e  is sqlite3BtreeN
2a310 65 78 74 28 29 2e 20 20 54 68 61 74 20 72 6f 75  ext().  That rou
2a320 74 69 6e 65 20 69 73 20 6f 70 74 69 6d 69 7a 65  tine is optimize
2a330 64 0a 2a 2a 20 66 6f 72 20 74 68 65 20 63 6f 6d  d.** for the com
2a340 6d 6f 6e 20 63 61 73 65 20 6f 66 20 6d 65 72 65  mon case of mere
2a350 6c 79 20 69 6e 63 72 65 6d 65 6e 74 69 6e 67 20  ly incrementing 
2a360 74 68 65 20 63 65 6c 6c 20 63 6f 75 6e 74 65 72  the cell counter
2a370 20 42 74 43 75 72 73 6f 72 2e 61 69 49 64 78 0a   BtCursor.aiIdx.
2a380 2a 2a 20 74 6f 20 74 68 65 20 6e 65 78 74 20 63  ** to the next c
2a390 65 6c 6c 20 6f 6e 20 74 68 65 20 63 75 72 72 65  ell on the curre
2a3a0 6e 74 20 70 61 67 65 2e 20 20 54 68 65 20 28 73  nt page.  The (s
2a3b0 6c 6f 77 65 72 29 20 62 74 72 65 65 4e 65 78 74  lower) btreeNext
2a3c0 28 29 20 68 65 6c 70 65 72 0a 2a 2a 20 72 6f 75  () helper.** rou
2a3d0 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77  tine is called w
2a3e0 68 65 6e 20 69 74 20 69 73 20 6e 65 63 65 73 73  hen it is necess
2a3f0 61 72 79 20 74 6f 20 6d 6f 76 65 20 74 6f 20 61  ary to move to a
2a400 20 64 69 66 66 65 72 65 6e 74 20 70 61 67 65 20   different page 
2a410 6f 72 0a 2a 2a 20 74 6f 20 72 65 73 74 6f 72 65  or.** to restore
2a420 20 74 68 65 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a   the cursor..**.
2a430 2a 2a 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 66  ** The calling f
2a440 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 73 65 74  unction will set
2a450 20 2a 70 52 65 73 20 74 6f 20 30 20 6f 72 20 31   *pRes to 0 or 1
2a460 2e 20 20 54 68 65 20 69 6e 69 74 69 61 6c 20 2a  .  The initial *
2a470 70 52 65 73 20 76 61 6c 75 65 0a 2a 2a 20 77 69  pRes value.** wi
2a480 6c 6c 20 62 65 20 31 20 69 66 20 74 68 65 20 63  ll be 1 if the c
2a490 75 72 73 6f 72 20 62 65 69 6e 67 20 73 74 65 70  ursor being step
2a4a0 70 65 64 20 63 6f 72 72 65 73 70 6f 6e 64 73 20  ped corresponds 
2a4b0 74 6f 20 61 6e 20 53 51 4c 20 69 6e 64 65 78 20  to an SQL index 
2a4c0 61 6e 64 0a 2a 2a 20 69 66 20 74 68 69 73 20 72  and.** if this r
2a4d0 6f 75 74 69 6e 65 20 63 6f 75 6c 64 20 68 61 76  outine could hav
2a4e0 65 20 62 65 65 6e 20 73 6b 69 70 70 65 64 20 69  e been skipped i
2a4f0 66 20 74 68 61 74 20 53 51 4c 20 69 6e 64 65 78  f that SQL index
2a500 20 68 61 64 20 62 65 65 6e 0a 2a 2a 20 61 20 75   had been.** a u
2a510 6e 69 71 75 65 20 69 6e 64 65 78 2e 20 20 4f 74  nique index.  Ot
2a520 68 65 72 77 69 73 65 20 74 68 65 20 63 61 6c 6c  herwise the call
2a530 65 72 20 77 69 6c 6c 20 68 61 76 65 20 73 65 74  er will have set
2a540 20 2a 70 52 65 73 20 74 6f 20 7a 65 72 6f 2e 0a   *pRes to zero..
2a550 2a 2a 20 5a 65 72 6f 20 69 73 20 74 68 65 20 63  ** Zero is the c
2a560 6f 6d 6d 6f 6e 20 63 61 73 65 2e 20 54 68 65 20  ommon case. The 
2a570 62 74 72 65 65 20 69 6d 70 6c 65 6d 65 6e 74 61  btree implementa
2a580 74 69 6f 6e 20 69 73 20 66 72 65 65 20 74 6f 20  tion is free to 
2a590 75 73 65 20 74 68 65 0a 2a 2a 20 69 6e 69 74 69  use the.** initi
2a5a0 61 6c 20 2a 70 52 65 73 20 76 61 6c 75 65 20 61  al *pRes value a
2a5b0 73 20 61 20 68 69 6e 74 20 74 6f 20 69 6d 70 72  s a hint to impr
2a5c0 6f 76 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 2c  ove performance,
2a5d0 20 62 75 74 20 74 68 65 20 63 75 72 72 65 6e 74   but the current
2a5e0 0a 2a 2a 20 53 51 4c 69 74 65 20 62 74 72 65 65  .** SQLite btree
2a5f0 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
2a600 64 6f 65 73 20 6e 6f 74 2e 20 28 4e 6f 74 65 20  does not. (Note 
2a610 74 68 61 74 20 74 68 65 20 63 6f 6d 64 62 32 20  that the comdb2 
2a620 62 74 72 65 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65  btree.** impleme
2a630 6e 74 61 74 69 6f 6e 20 64 6f 65 73 20 75 73 65  ntation does use
2a640 20 74 68 69 73 20 68 69 6e 74 2c 20 68 6f 77 65   this hint, howe
2a650 76 65 72 2e 29 0a 2a 2f 0a 73 74 61 74 69 63 20  ver.).*/.static 
2a660 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20  SQLITE_NOINLINE 
2a670 69 6e 74 20 62 74 72 65 65 4e 65 78 74 28 42 74  int btreeNext(Bt
2a680 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e  Cursor *pCur, in
2a690 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20  t *pRes){.  int 
2a6a0 72 63 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20  rc;.  int idx;. 
2a6b0 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b   MemPage *pPage;
2a6c0 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
2a6d0 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
2a6e0 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
2a6f0 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d  pCur->skipNext==
2a700 30 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74  0 || pCur->eStat
2a710 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e!=CURSOR_VALID 
2a720 29 3b 0a 20 20 61 73 73 65 72 74 28 20 2a 70 52  );.  assert( *pR
2a730 65 73 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  es==0 );.  if( p
2a740 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52  Cur->eState!=CUR
2a750 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20  SOR_VALID ){.   
2a760 20 61 73 73 65 72 74 28 20 28 70 43 75 72 2d 3e   assert( (pCur->
2a770 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f  curFlags & BTCF_
2a780 56 61 6c 69 64 4f 76 66 6c 29 3d 3d 30 20 29 3b  ValidOvfl)==0 );
2a790 0a 20 20 20 20 72 63 20 3d 20 72 65 73 74 6f 72  .    rc = restor
2a7a0 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
2a7b0 70 43 75 72 29 3b 0a 20 20 20 20 69 66 28 20 72  pCur);.    if( r
2a7c0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2a7d0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
2a7e0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 43  .    }.    if( C
2a7f0 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70  URSOR_INVALID==p
2a800 43 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20  Cur->eState ){. 
2a810 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a       *pRes = 1;.
2a820 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
2a830 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
2a840 20 20 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70    if( pCur->skip
2a850 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20 61 73  Next ){.      as
2a860 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
2a870 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
2a880 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65   || pCur->eState
2a890 3d 3d 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58  ==CURSOR_SKIPNEX
2a8a0 54 20 29 3b 0a 20 20 20 20 20 20 70 43 75 72 2d  T );.      pCur-
2a8b0 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
2a8c0 5f 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 69 66  _VALID;.      if
2a8d0 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74  ( pCur->skipNext
2a8e0 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43  >0 ){.        pC
2a8f0 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30  ur->skipNext = 0
2a900 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
2a910 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
2a920 20 20 7d 0a 20 20 20 20 20 20 70 43 75 72 2d 3e    }.      pCur->
2a930 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20  skipNext = 0;.  
2a940 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65    }.  }..  pPage
2a950 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b   = pCur->apPage[
2a960 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20  pCur->iPage];.  
2a970 69 64 78 20 3d 20 2b 2b 70 43 75 72 2d 3e 61 69  idx = ++pCur->ai
2a980 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
2a990 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
2a9a0 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 0a 20 20  e->isInit );..  
2a9b0 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61  /* If the databa
2a9c0 73 65 20 66 69 6c 65 20 69 73 20 63 6f 72 72 75  se file is corru
2a9d0 70 74 2c 20 69 74 20 69 73 20 70 6f 73 73 69 62  pt, it is possib
2a9e0 6c 65 20 66 6f 72 20 74 68 65 20 76 61 6c 75 65  le for the value
2a9f0 20 6f 66 20 69 64 78 20 0a 20 20 2a 2a 20 74 6f   of idx .  ** to
2aa00 20 62 65 20 69 6e 76 61 6c 69 64 20 68 65 72 65   be invalid here
2aa10 2e 20 54 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20  . This can only 
2aa20 6f 63 63 75 72 20 69 66 20 61 20 73 65 63 6f 6e  occur if a secon
2aa30 64 20 63 75 72 73 6f 72 20 6d 6f 64 69 66 69 65  d cursor modifie
2aa40 73 0a 20 20 2a 2a 20 74 68 65 20 70 61 67 65 20  s.  ** the page 
2aa50 77 68 69 6c 65 20 63 75 72 73 6f 72 20 70 43 75  while cursor pCu
2aa60 72 20 69 73 20 68 6f 6c 64 69 6e 67 20 61 20 72  r is holding a r
2aa70 65 66 65 72 65 6e 63 65 20 74 6f 20 69 74 2e 20  eference to it. 
2aa80 57 68 69 63 68 20 63 61 6e 0a 20 20 2a 2a 20 6f  Which can.  ** o
2aa90 6e 6c 79 20 68 61 70 70 65 6e 20 69 66 20 74 68  nly happen if th
2aaa0 65 20 64 61 74 61 62 61 73 65 20 69 73 20 63 6f  e database is co
2aab0 72 72 75 70 74 20 69 6e 20 73 75 63 68 20 61 20  rrupt in such a 
2aac0 77 61 79 20 61 73 20 74 6f 20 6c 69 6e 6b 20 74  way as to link t
2aad0 68 65 0a 20 20 2a 2a 20 70 61 67 65 20 69 6e 74  he.  ** page int
2aae0 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  o more than one 
2aaf0 62 2d 74 72 65 65 20 73 74 72 75 63 74 75 72 65  b-tree structure
2ab00 2e 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28  . */.  testcase(
2ab10 20 69 64 78 3e 70 50 61 67 65 2d 3e 6e 43 65 6c   idx>pPage->nCel
2ab20 6c 20 29 3b 0a 0a 20 20 69 66 28 20 69 64 78 3e  l );..  if( idx>
2ab30 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b  =pPage->nCell ){
2ab40 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d  .    if( !pPage-
2ab50 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 72  >leaf ){.      r
2ab60 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28  c = moveToChild(
2ab70 70 43 75 72 2c 20 67 65 74 34 62 79 74 65 28 26  pCur, get4byte(&
2ab80 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61  pPage->aData[pPa
2ab90 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  ge->hdrOffset+8]
2aba0 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  ));.      if( rc
2abb0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
2abc0 20 20 20 20 72 65 74 75 72 6e 20 6d 6f 76 65 54      return moveT
2abd0 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b  oLeftmost(pCur);
2abe0 0a 20 20 20 20 7d 0a 20 20 20 20 64 6f 7b 0a 20  .    }.    do{. 
2abf0 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69       if( pCur->i
2ac00 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Page==0 ){.     
2ac10 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20     *pRes = 1;.  
2ac20 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61        pCur->eSta
2ac30 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41  te = CURSOR_INVA
2ac40 4c 49 44 3b 0a 20 20 20 20 20 20 20 20 72 65 74  LID;.        ret
2ac50 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
2ac60 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 6f 76       }.      mov
2ac70 65 54 6f 50 61 72 65 6e 74 28 70 43 75 72 29 3b  eToParent(pCur);
2ac80 0a 20 20 20 20 20 20 70 50 61 67 65 20 3d 20 70  .      pPage = p
2ac90 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
2aca0 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20 7d 77  ->iPage];.    }w
2acb0 68 69 6c 65 28 20 70 43 75 72 2d 3e 61 69 49 64  hile( pCur->aiId
2acc0 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3e 3d  x[pCur->iPage]>=
2acd0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  pPage->nCell );.
2ace0 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69      if( pPage->i
2acf0 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 72  ntKey ){.      r
2ad00 65 74 75 72 6e 20 73 71 6c 69 74 65 33 42 74 72  eturn sqlite3Btr
2ad10 65 65 4e 65 78 74 28 70 43 75 72 2c 20 70 52 65  eeNext(pCur, pRe
2ad20 73 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  s);.    }else{. 
2ad30 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
2ad40 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d  TE_OK;.    }.  }
2ad50 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65  .  if( pPage->le
2ad60 61 66 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  af ){.    return
2ad70 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65   SQLITE_OK;.  }e
2ad80 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  lse{.    return 
2ad90 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70  moveToLeftmost(p
2ada0 43 75 72 29 3b 0a 20 20 7d 0a 7d 0a 69 6e 74 20  Cur);.  }.}.int 
2adb0 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74  sqlite3BtreeNext
2adc0 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
2add0 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 4d   int *pRes){.  M
2ade0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20  emPage *pPage;. 
2adf0 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
2ae00 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
2ae10 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 52 65  );.  assert( pRe
2ae20 73 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  s!=0 );.  assert
2ae30 28 20 2a 70 52 65 73 3d 3d 30 20 7c 7c 20 2a 70  ( *pRes==0 || *p
2ae40 52 65 73 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65  Res==1 );.  asse
2ae50 72 74 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65  rt( pCur->skipNe
2ae60 78 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 65  xt==0 || pCur->e
2ae70 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41  State!=CURSOR_VA
2ae80 4c 49 44 20 29 3b 0a 20 20 70 43 75 72 2d 3e 69  LID );.  pCur->i
2ae90 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20  nfo.nSize = 0;. 
2aea0 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20   pCur->curFlags 
2aeb0 26 3d 20 7e 28 42 54 43 46 5f 56 61 6c 69 64 4e  &= ~(BTCF_ValidN
2aec0 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76  Key|BTCF_ValidOv
2aed0 66 6c 29 3b 0a 20 20 2a 70 52 65 73 20 3d 20 30  fl);.  *pRes = 0
2aee0 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53  ;.  if( pCur->eS
2aef0 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c  tate!=CURSOR_VAL
2af00 49 44 20 29 20 72 65 74 75 72 6e 20 62 74 72 65  ID ) return btre
2af10 65 4e 65 78 74 28 70 43 75 72 2c 20 70 52 65 73  eNext(pCur, pRes
2af20 29 3b 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75  );.  pPage = pCu
2af30 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
2af40 69 50 61 67 65 5d 3b 0a 20 20 69 66 28 20 28 2b  iPage];.  if( (+
2af50 2b 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75  +pCur->aiIdx[pCu
2af60 72 2d 3e 69 50 61 67 65 5d 29 3e 3d 70 50 61 67  r->iPage])>=pPag
2af70 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20  e->nCell ){.    
2af80 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
2af90 2d 3e 69 50 61 67 65 5d 2d 2d 3b 0a 20 20 20 20  ->iPage]--;.    
2afa0 72 65 74 75 72 6e 20 62 74 72 65 65 4e 65 78 74  return btreeNext
2afb0 28 70 43 75 72 2c 20 70 52 65 73 29 3b 0a 20 20  (pCur, pRes);.  
2afc0 7d 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c  }.  if( pPage->l
2afd0 65 61 66 20 29 7b 0a 20 20 20 20 72 65 74 75 72  eaf ){.    retur
2afe0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
2aff0 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
2b000 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28   moveToLeftmost(
2b010 70 43 75 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  pCur);.  }.}../*
2b020 0a 2a 2a 20 53 74 65 70 20 74 68 65 20 63 75 72  .** Step the cur
2b030 73 6f 72 20 74 6f 20 74 68 65 20 62 61 63 6b 20  sor to the back 
2b040 74 6f 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  to the previous 
2b050 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61 74  entry in the dat
2b060 61 62 61 73 65 2e 20 20 49 66 0a 2a 2a 20 73 75  abase.  If.** su
2b070 63 63 65 73 73 66 75 6c 20 74 68 65 6e 20 73 65  ccessful then se
2b080 74 20 2a 70 52 65 73 3d 30 2e 20 20 49 66 20 74  t *pRes=0.  If t
2b090 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 77 61 73  he cursor.** was
2b0a0 20 61 6c 72 65 61 64 79 20 70 6f 69 6e 74 69 6e   already pointin
2b0b0 67 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 65  g to the first e
2b0c0 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61 74 61  ntry in the data
2b0d0 62 61 73 65 20 62 65 66 6f 72 65 0a 2a 2a 20 74  base before.** t
2b0e0 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61 73 20  his routine was 
2b0f0 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20 73 65 74  called, then set
2b100 20 2a 70 52 65 73 3d 31 2e 0a 2a 2a 0a 2a 2a 20   *pRes=1..**.** 
2b110 54 68 65 20 6d 61 69 6e 20 65 6e 74 72 79 20 70  The main entry p
2b120 6f 69 6e 74 20 69 73 20 73 71 6c 69 74 65 33 42  oint is sqlite3B
2b130 74 72 65 65 50 72 65 76 69 6f 75 73 28 29 2e 20  treePrevious(). 
2b140 20 54 68 61 74 20 72 6f 75 74 69 6e 65 20 69 73   That routine is
2b150 20 6f 70 74 69 6d 69 7a 65 64 0a 2a 2a 20 66 6f   optimized.** fo
2b160 72 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73  r the common cas
2b170 65 20 6f 66 20 6d 65 72 65 6c 79 20 64 65 63 72  e of merely decr
2b180 65 6d 65 6e 74 69 6e 67 20 74 68 65 20 63 65 6c  ementing the cel
2b190 6c 20 63 6f 75 6e 74 65 72 20 42 74 43 75 72 73  l counter BtCurs
2b1a0 6f 72 2e 61 69 49 64 78 0a 2a 2a 20 74 6f 20 74  or.aiIdx.** to t
2b1b0 68 65 20 70 72 65 76 69 6f 75 73 20 63 65 6c 6c  he previous cell
2b1c0 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   on the current 
2b1d0 70 61 67 65 2e 20 20 54 68 65 20 28 73 6c 6f 77  page.  The (slow
2b1e0 65 72 29 20 62 74 72 65 65 50 72 65 76 69 6f 75  er) btreePreviou
2b1f0 73 28 29 0a 2a 2a 20 68 65 6c 70 65 72 20 72 6f  s().** helper ro
2b200 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
2b210 77 68 65 6e 20 69 74 20 69 73 20 6e 65 63 65 73  when it is neces
2b220 73 61 72 79 20 74 6f 20 6d 6f 76 65 20 74 6f 20  sary to move to 
2b230 61 20 64 69 66 66 65 72 65 6e 74 20 70 61 67 65  a different page
2b240 0a 2a 2a 20 6f 72 20 74 6f 20 72 65 73 74 6f 72  .** or to restor
2b250 65 20 74 68 65 20 63 75 72 73 6f 72 2e 0a 2a 2a  e the cursor..**
2b260 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 69 6e 67 20  .** The calling 
2b270 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 73 65  function will se
2b280 74 20 2a 70 52 65 73 20 74 6f 20 30 20 6f 72 20  t *pRes to 0 or 
2b290 31 2e 20 20 54 68 65 20 69 6e 69 74 69 61 6c 20  1.  The initial 
2b2a0 2a 70 52 65 73 20 76 61 6c 75 65 0a 2a 2a 20 77  *pRes value.** w
2b2b0 69 6c 6c 20 62 65 20 31 20 69 66 20 74 68 65 20  ill be 1 if the 
2b2c0 63 75 72 73 6f 72 20 62 65 69 6e 67 20 73 74 65  cursor being ste
2b2d0 70 70 65 64 20 63 6f 72 72 65 73 70 6f 6e 64 73  pped corresponds
2b2e0 20 74 6f 20 61 6e 20 53 51 4c 20 69 6e 64 65 78   to an SQL index
2b2f0 20 61 6e 64 0a 2a 2a 20 69 66 20 74 68 69 73 20   and.** if this 
2b300 72 6f 75 74 69 6e 65 20 63 6f 75 6c 64 20 68 61  routine could ha
2b310 76 65 20 62 65 65 6e 20 73 6b 69 70 70 65 64 20  ve been skipped 
2b320 69 66 20 74 68 61 74 20 53 51 4c 20 69 6e 64 65  if that SQL inde
2b330 78 20 68 61 64 20 62 65 65 6e 0a 2a 2a 20 61 20  x had been.** a 
2b340 75 6e 69 71 75 65 20 69 6e 64 65 78 2e 20 20 4f  unique index.  O
2b350 74 68 65 72 77 69 73 65 20 74 68 65 20 63 61 6c  therwise the cal
2b360 6c 65 72 20 77 69 6c 6c 20 68 61 76 65 20 73 65  ler will have se
2b370 74 20 2a 70 52 65 73 20 74 6f 20 7a 65 72 6f 2e  t *pRes to zero.
2b380 0a 2a 2a 20 5a 65 72 6f 20 69 73 20 74 68 65 20  .** Zero is the 
2b390 63 6f 6d 6d 6f 6e 20 63 61 73 65 2e 20 54 68 65  common case. The
2b3a0 20 62 74 72 65 65 20 69 6d 70 6c 65 6d 65 6e 74   btree implement
2b3b0 61 74 69 6f 6e 20 69 73 20 66 72 65 65 20 74 6f  ation is free to
2b3c0 20 75 73 65 20 74 68 65 0a 2a 2a 20 69 6e 69 74   use the.** init
2b3d0 69 61 6c 20 2a 70 52 65 73 20 76 61 6c 75 65 20  ial *pRes value 
2b3e0 61 73 20 61 20 68 69 6e 74 20 74 6f 20 69 6d 70  as a hint to imp
2b3f0 72 6f 76 65 20 70 65 72 66 6f 72 6d 61 6e 63 65  rove performance
2b400 2c 20 62 75 74 20 74 68 65 20 63 75 72 72 65 6e  , but the curren
2b410 74 0a 2a 2a 20 53 51 4c 69 74 65 20 62 74 72 65  t.** SQLite btre
2b420 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
2b430 20 64 6f 65 73 20 6e 6f 74 2e 20 28 4e 6f 74 65   does not. (Note
2b440 20 74 68 61 74 20 74 68 65 20 63 6f 6d 64 62 32   that the comdb2
2b450 20 62 74 72 65 65 0a 2a 2a 20 69 6d 70 6c 65 6d   btree.** implem
2b460 65 6e 74 61 74 69 6f 6e 20 64 6f 65 73 20 75 73  entation does us
2b470 65 20 74 68 69 73 20 68 69 6e 74 2c 20 68 6f 77  e this hint, how
2b480 65 76 65 72 2e 29 0a 2a 2f 0a 73 74 61 74 69 63  ever.).*/.static
2b490 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45   SQLITE_NOINLINE
2b4a0 20 69 6e 74 20 62 74 72 65 65 50 72 65 76 69 6f   int btreePrevio
2b4b0 75 73 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  us(BtCursor *pCu
2b4c0 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20  r, int *pRes){. 
2b4d0 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 50 61   int rc;.  MemPa
2b4e0 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73  ge *pPage;..  as
2b4f0 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
2b500 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
2b510 20 20 61 73 73 65 72 74 28 20 70 52 65 73 21 3d    assert( pRes!=
2b520 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 2a  0 );.  assert( *
2b530 70 52 65 73 3d 3d 30 20 29 3b 0a 20 20 61 73 73  pRes==0 );.  ass
2b540 65 72 74 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e  ert( pCur->skipN
2b550 65 78 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e  ext==0 || pCur->
2b560 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56  eState!=CURSOR_V
2b570 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74  ALID );.  assert
2b580 28 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67  ( (pCur->curFlag
2b590 73 20 26 20 28 42 54 43 46 5f 41 74 4c 61 73 74  s & (BTCF_AtLast
2b5a0 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 7c  |BTCF_ValidOvfl|
2b5b0 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 29 29  BTCF_ValidNKey))
2b5c0 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
2b5d0 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
2b5e0 65 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 43  e==0 );.  if( pC
2b5f0 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53  ur->eState!=CURS
2b600 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20  OR_VALID ){.    
2b610 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73  rc = restoreCurs
2b620 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29  orPosition(pCur)
2b630 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
2b640 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2b650 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
2b660 7d 0a 20 20 20 20 69 66 28 20 43 55 52 53 4f 52  }.    if( CURSOR
2b670 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e  _INVALID==pCur->
2b680 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20 20 20  eState ){.      
2b690 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 20  *pRes = 1;.     
2b6a0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2b6b0 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  K;.    }.    if(
2b6c0 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20   pCur->skipNext 
2b6d0 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
2b6e0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
2b6f0 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70  URSOR_VALID || p
2b700 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
2b710 53 4f 52 5f 53 4b 49 50 4e 45 58 54 20 29 3b 0a  SOR_SKIPNEXT );.
2b720 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61        pCur->eSta
2b730 74 65 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49  te = CURSOR_VALI
2b740 44 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43 75  D;.      if( pCu
2b750 72 2d 3e 73 6b 69 70 4e 65 78 74 3c 30 20 29 7b  r->skipNext<0 ){
2b760 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 73  .        pCur->s
2b770 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20  kipNext = 0;.   
2b780 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
2b790 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20  TE_OK;.      }. 
2b7a0 20 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e       pCur->skipN
2b7b0 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  ext = 0;.    }. 
2b7c0 20 7d 0a 0a 20 20 70 50 61 67 65 20 3d 20 70 43   }..  pPage = pC
2b7d0 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
2b7e0 3e 69 50 61 67 65 5d 3b 0a 20 20 61 73 73 65 72  >iPage];.  asser
2b7f0 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  t( pPage->isInit
2b800 20 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65   );.  if( !pPage
2b810 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 69 6e  ->leaf ){.    in
2b820 74 20 69 64 78 20 3d 20 70 43 75 72 2d 3e 61 69  t idx = pCur->ai
2b830 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
2b840 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54  ;.    rc = moveT
2b850 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 67 65 74  oChild(pCur, get
2b860 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70  4byte(findCell(p
2b870 50 61 67 65 2c 20 69 64 78 29 29 29 3b 0a 20 20  Page, idx)));.  
2b880 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
2b890 6e 20 72 63 3b 0a 20 20 20 20 72 63 20 3d 20 6d  n rc;.    rc = m
2b8a0 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 70  oveToRightmost(p
2b8b0 43 75 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Cur);.  }else{. 
2b8c0 20 20 20 77 68 69 6c 65 28 20 70 43 75 72 2d 3e     while( pCur->
2b8d0 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
2b8e0 65 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  e]==0 ){.      i
2b8f0 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3d 3d  f( pCur->iPage==
2b900 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75  0 ){.        pCu
2b910 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
2b920 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20  OR_INVALID;.    
2b930 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20      *pRes = 1;. 
2b940 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
2b950 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d  LITE_OK;.      }
2b960 0a 20 20 20 20 20 20 6d 6f 76 65 54 6f 50 61 72  .      moveToPar
2b970 65 6e 74 28 70 43 75 72 29 3b 0a 20 20 20 20 7d  ent(pCur);.    }
2b980 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75  .    assert( pCu
2b990 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30  r->info.nSize==0
2b9a0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
2b9b0 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20  (pCur->curFlags 
2b9c0 26 20 28 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65  & (BTCF_ValidNKe
2b9d0 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c  y|BTCF_ValidOvfl
2b9e0 29 29 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 70 43  ))==0 );..    pC
2b9f0 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
2ba00 69 50 61 67 65 5d 2d 2d 3b 0a 20 20 20 20 70 50  iPage]--;.    pP
2ba10 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61  age = pCur->apPa
2ba20 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b  ge[pCur->iPage];
2ba30 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e  .    if( pPage->
2ba40 69 6e 74 4b 65 79 20 26 26 20 21 70 50 61 67 65  intKey && !pPage
2ba50 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  ->leaf ){.      
2ba60 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
2ba70 65 50 72 65 76 69 6f 75 73 28 70 43 75 72 2c 20  ePrevious(pCur, 
2ba80 70 52 65 73 29 3b 0a 20 20 20 20 7d 65 6c 73 65  pRes);.    }else
2ba90 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
2baa0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
2bab0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
2bac0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
2bad0 65 50 72 65 76 69 6f 75 73 28 42 74 43 75 72 73  ePrevious(BtCurs
2bae0 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70  or *pCur, int *p
2baf0 52 65 73 29 7b 0a 20 20 61 73 73 65 72 74 28 20  Res){.  assert( 
2bb00 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
2bb10 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
2bb20 72 74 28 20 70 52 65 73 21 3d 30 20 29 3b 0a 20  rt( pRes!=0 );. 
2bb30 20 61 73 73 65 72 74 28 20 2a 70 52 65 73 3d 3d   assert( *pRes==
2bb40 30 20 7c 7c 20 2a 70 52 65 73 3d 3d 31 20 29 3b  0 || *pRes==1 );
2bb50 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
2bb60 3e 73 6b 69 70 4e 65 78 74 3d 3d 30 20 7c 7c 20  >skipNext==0 || 
2bb70 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55  pCur->eState!=CU
2bb80 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
2bb90 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 70 43 75  *pRes = 0;.  pCu
2bba0 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e  r->curFlags &= ~
2bbb0 28 42 54 43 46 5f 41 74 4c 61 73 74 7c 42 54 43  (BTCF_AtLast|BTC
2bbc0 46 5f 56 61 6c 69 64 4f 76 66 6c 7c 42 54 43 46  F_ValidOvfl|BTCF
2bbd0 5f 56 61 6c 69 64 4e 4b 65 79 29 3b 0a 20 20 70  _ValidNKey);.  p
2bbe0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20  Cur->info.nSize 
2bbf0 3d 20 30 3b 0a 20 20 69 66 28 20 70 43 75 72 2d  = 0;.  if( pCur-
2bc00 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f  >eState!=CURSOR_
2bc10 56 41 4c 49 44 0a 20 20 20 7c 7c 20 70 43 75 72  VALID.   || pCur
2bc20 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
2bc30 61 67 65 5d 3d 3d 30 0a 20 20 20 7c 7c 20 70 43  age]==0.   || pC
2bc40 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
2bc50 3e 69 50 61 67 65 5d 2d 3e 6c 65 61 66 3d 3d 30  >iPage]->leaf==0
2bc60 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  .  ){.    return
2bc70 20 62 74 72 65 65 50 72 65 76 69 6f 75 73 28 70   btreePrevious(p
2bc80 43 75 72 2c 20 70 52 65 73 29 3b 0a 20 20 7d 0a  Cur, pRes);.  }.
2bc90 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43    pCur->aiIdx[pC
2bca0 75 72 2d 3e 69 50 61 67 65 5d 2d 2d 3b 0a 20 20  ur->iPage]--;.  
2bcb0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2bcc0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63  ;.}../*.** Alloc
2bcd0 61 74 65 20 61 20 6e 65 77 20 70 61 67 65 20 66  ate a new page f
2bce0 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
2bcf0 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   file..**.** The
2bd00 20 6e 65 77 20 70 61 67 65 20 69 73 20 6d 61 72   new page is mar
2bd10 6b 65 64 20 61 73 20 64 69 72 74 79 2e 20 20 28  ked as dirty.  (
2bd20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
2bd30 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
2bd40 65 28 29 0a 2a 2a 20 68 61 73 20 61 6c 72 65 61  e().** has alrea
2bd50 64 79 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 6f  dy been called o
2bd60 6e 20 74 68 65 20 6e 65 77 20 70 61 67 65 2e 29  n the new page.)
2bd70 20 20 54 68 65 20 6e 65 77 20 70 61 67 65 20 68    The new page h
2bd80 61 73 20 61 6c 73 6f 0a 2a 2a 20 62 65 65 6e 20  as also.** been 
2bd90 72 65 66 65 72 65 6e 63 65 64 20 61 6e 64 20 74  referenced and t
2bda0 68 65 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69  he calling routi
2bdb0 6e 65 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  ne is responsibl
2bdc0 65 20 66 6f 72 20 63 61 6c 6c 69 6e 67 0a 2a 2a  e for calling.**
2bdd0 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
2bde0 65 66 28 29 20 6f 6e 20 74 68 65 20 6e 65 77 20  ef() on the new 
2bdf0 70 61 67 65 20 77 68 65 6e 20 69 74 20 69 73 20  page when it is 
2be00 64 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49  done..**.** SQLI
2be10 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
2be20 64 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 41  d on success.  A
2be30 6e 79 20 6f 74 68 65 72 20 72 65 74 75 72 6e 20  ny other return 
2be40 76 61 6c 75 65 20 69 6e 64 69 63 61 74 65 73 0a  value indicates.
2be50 2a 2a 20 61 6e 20 65 72 72 6f 72 2e 20 20 2a 70  ** an error.  *p
2be60 70 50 61 67 65 20 61 6e 64 20 2a 70 50 67 6e 6f  pPage and *pPgno
2be70 20 61 72 65 20 75 6e 64 65 66 69 6e 65 64 20 69   are undefined i
2be80 6e 20 74 68 65 20 65 76 65 6e 74 20 6f 66 20 61  n the event of a
2be90 6e 20 65 72 72 6f 72 2e 0a 2a 2a 20 44 6f 20 6e  n error..** Do n
2bea0 6f 74 20 69 6e 76 6f 6b 65 20 73 71 6c 69 74 65  ot invoke sqlite
2beb0 33 50 61 67 65 72 55 6e 72 65 66 28 29 20 6f 6e  3PagerUnref() on
2bec0 20 2a 70 70 50 61 67 65 20 69 66 20 61 6e 20 65   *ppPage if an e
2bed0 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64  rror is returned
2bee0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 22  ..**.** If the "
2bef0 6e 65 61 72 62 79 22 20 70 61 72 61 6d 65 74 65  nearby" paramete
2bf00 72 20 69 73 20 6e 6f 74 20 30 2c 20 74 68 65 6e  r is not 0, then
2bf10 20 61 6e 20 65 66 66 6f 72 74 20 69 73 20 6d 61   an effort is ma
2bf20 64 65 20 74 6f 20 0a 2a 2a 20 6c 6f 63 61 74 65  de to .** locate
2bf30 20 61 20 70 61 67 65 20 63 6c 6f 73 65 20 74 6f   a page close to
2bf40 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
2bf50 20 22 6e 65 61 72 62 79 22 2e 20 20 54 68 69 73   "nearby".  This
2bf60 20 63 61 6e 20 62 65 20 75 73 65 64 20 69 6e 20   can be used in 
2bf70 61 6e 0a 2a 2a 20 61 74 74 65 6d 70 74 20 74 6f  an.** attempt to
2bf80 20 6b 65 65 70 20 72 65 6c 61 74 65 64 20 70 61   keep related pa
2bf90 67 65 73 20 63 6c 6f 73 65 20 74 6f 20 65 61 63  ges close to eac
2bfa0 68 20 6f 74 68 65 72 20 69 6e 20 74 68 65 20 64  h other in the d
2bfb0 61 74 61 62 61 73 65 20 66 69 6c 65 2c 0a 2a 2a  atabase file,.**
2bfc0 20 77 68 69 63 68 20 69 6e 20 74 75 72 6e 20 63   which in turn c
2bfd0 61 6e 20 6d 61 6b 65 20 64 61 74 61 62 61 73 65  an make database
2bfe0 20 61 63 63 65 73 73 20 66 61 73 74 65 72 2e 0a   access faster..
2bff0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 4d 6f  **.** If the eMo
2c000 64 65 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  de parameter is 
2c010 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20 61 6e  BTALLOC_EXACT an
2c020 64 20 74 68 65 20 6e 65 61 72 62 79 20 70 61 67  d the nearby pag
2c030 65 20 65 78 69 73 74 73 0a 2a 2a 20 61 6e 79 77  e exists.** anyw
2c040 68 65 72 65 20 6f 6e 20 74 68 65 20 66 72 65 65  here on the free
2c050 2d 6c 69 73 74 2c 20 74 68 65 6e 20 69 74 20 69  -list, then it i
2c060 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20  s guaranteed to 
2c070 62 65 20 72 65 74 75 72 6e 65 64 2e 20 20 49 66  be returned.  If
2c080 0a 2a 2a 20 65 4d 6f 64 65 20 69 73 20 42 54 41  .** eMode is BTA
2c090 4c 4c 4f 43 5f 4c 54 20 74 68 65 6e 20 74 68 65  LLOC_LT then the
2c0a0 20 70 61 67 65 20 72 65 74 75 72 6e 65 64 20 77   page returned w
2c0b0 69 6c 6c 20 62 65 20 6c 65 73 73 20 74 68 61 6e  ill be less than
2c0c0 20 6f 72 20 65 71 75 61 6c 0a 2a 2a 20 74 6f 20   or equal.** to 
2c0d0 6e 65 61 72 62 79 20 69 66 20 61 6e 79 20 73 75  nearby if any su
2c0e0 63 68 20 70 61 67 65 20 65 78 69 73 74 73 2e 20  ch page exists. 
2c0f0 20 49 66 20 65 4d 6f 64 65 20 69 73 20 42 54 41   If eMode is BTA
2c100 4c 4c 4f 43 5f 41 4e 59 20 74 68 65 6e 20 74 68  LLOC_ANY then th
2c110 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 72 65  ere.** are no re
2c120 73 74 72 69 63 74 69 6f 6e 73 20 6f 6e 20 77 68  strictions on wh
2c130 69 63 68 20 70 61 67 65 20 69 73 20 72 65 74 75  ich page is retu
2c140 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
2c150 69 6e 74 20 61 6c 6c 6f 63 61 74 65 42 74 72 65  int allocateBtre
2c160 65 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65  ePage(.  BtShare
2c170 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20  d *pBt,         
2c180 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a  /* The btree */.
2c190 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61    MemPage **ppPa
2c1a0 67 65 2c 20 20 20 20 20 20 2f 2a 20 53 74 6f 72  ge,      /* Stor
2c1b0 65 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  e pointer to the
2c1c0 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 20   allocated page 
2c1d0 68 65 72 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 2a  here */.  Pgno *
2c1e0 70 50 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20  pPgno,          
2c1f0 20 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 70 61   /* Store the pa
2c200 67 65 20 6e 75 6d 62 65 72 20 68 65 72 65 20 2a  ge number here *
2c210 2f 0a 20 20 50 67 6e 6f 20 6e 65 61 72 62 79 2c  /.  Pgno nearby,
2c220 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65             /* Se
2c230 61 72 63 68 20 66 6f 72 20 61 20 70 61 67 65 20  arch for a page 
2c240 6e 65 61 72 20 74 68 69 73 20 6f 6e 65 20 2a 2f  near this one */
2c250 0a 20 20 75 38 20 65 4d 6f 64 65 20 20 20 20 20  .  u8 eMode     
2c260 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 54 41            /* BTA
2c270 4c 4c 4f 43 5f 45 58 41 43 54 2c 20 42 54 41 4c  LLOC_EXACT, BTAL
2c280 4c 4f 43 5f 4c 54 2c 20 6f 72 20 42 54 41 4c 4c  LOC_LT, or BTALL
2c290 4f 43 5f 41 4e 59 20 2a 2f 0a 29 7b 0a 20 20 4d  OC_ANY */.){.  M
2c2a0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 3b 0a  emPage *pPage1;.
2c2b0 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 33 32 20    int rc;.  u32 
2c2c0 6e 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72  n;     /* Number
2c2d0 20 6f 66 20 70 61 67 65 73 20 6f 6e 20 74 68 65   of pages on the
2c2e0 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20 75   freelist */.  u
2c2f0 33 32 20 6b 3b 20 20 20 20 20 2f 2a 20 4e 75 6d  32 k;     /* Num
2c300 62 65 72 20 6f 66 20 6c 65 61 76 65 73 20 6f 6e  ber of leaves on
2c310 20 74 68 65 20 74 72 75 6e 6b 20 6f 66 20 74 68   the trunk of th
2c320 65 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20  e freelist */.  
2c330 4d 65 6d 50 61 67 65 20 2a 70 54 72 75 6e 6b 20  MemPage *pTrunk 
2c340 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  = 0;.  MemPage *
2c350 70 50 72 65 76 54 72 75 6e 6b 20 3d 20 30 3b 0a  pPrevTrunk = 0;.
2c360 20 20 50 67 6e 6f 20 6d 78 50 61 67 65 3b 20 20    Pgno mxPage;  
2c370 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69 7a 65     /* Total size
2c380 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
2c390 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 61 73 73 65   file */..  asse
2c3a0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
2c3b0 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
2c3c0 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
2c3d0 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 41  eMode==BTALLOC_A
2c3e0 4e 59 20 7c 7c 20 28 6e 65 61 72 62 79 3e 30 20  NY || (nearby>0 
2c3f0 26 26 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70  && IfNotOmitAV(p
2c400 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 29  Bt->autoVacuum))
2c410 20 29 3b 0a 20 20 70 50 61 67 65 31 20 3d 20 70   );.  pPage1 = p
2c420 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20 6d 78  Bt->pPage1;.  mx
2c430 50 61 67 65 20 3d 20 62 74 72 65 65 50 61 67 65  Page = btreePage
2c440 63 6f 75 6e 74 28 70 42 74 29 3b 0a 20 20 2f 2a  count(pBt);.  /*
2c450 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
2c460 30 35 31 31 39 2d 30 32 36 33 37 20 54 68 65 20  05119-02637 The 
2c470 34 2d 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61  4-byte big-endia
2c480 6e 20 69 6e 74 65 67 65 72 20 61 74 20 6f 66 66  n integer at off
2c490 73 65 74 20 33 36 0a 20 20 2a 2a 20 73 74 6f 72  set 36.  ** stor
2c4a0 65 73 20 73 74 6f 72 65 73 20 74 68 65 20 74 6f  es stores the to
2c4b0 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  tal number of pa
2c4c0 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c  ges on the freel
2c4d0 69 73 74 2e 20 2a 2f 0a 20 20 6e 20 3d 20 67 65  ist. */.  n = ge
2c4e0 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e  t4byte(&pPage1->
2c4f0 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 74 65  aData[36]);.  te
2c500 73 74 63 61 73 65 28 20 6e 3d 3d 6d 78 50 61 67  stcase( n==mxPag
2c510 65 2d 31 20 29 3b 0a 20 20 69 66 28 20 6e 3e 3d  e-1 );.  if( n>=
2c520 6d 78 50 61 67 65 20 29 7b 0a 20 20 20 20 72 65  mxPage ){.    re
2c530 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
2c540 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  UPT_BKPT;.  }.  
2c550 69 66 28 20 6e 3e 30 20 29 7b 0a 20 20 20 20 2f  if( n>0 ){.    /
2c560 2a 20 54 68 65 72 65 20 61 72 65 20 70 61 67 65  * There are page
2c570 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73  s on the freelis
2c580 74 2e 20 20 52 65 75 73 65 20 6f 6e 65 20 6f 66  t.  Reuse one of
2c590 20 74 68 6f 73 65 20 70 61 67 65 73 2e 20 2a 2f   those pages. */
2c5a0 0a 20 20 20 20 50 67 6e 6f 20 69 54 72 75 6e 6b  .    Pgno iTrunk
2c5b0 3b 0a 20 20 20 20 75 38 20 73 65 61 72 63 68 4c  ;.    u8 searchL
2c5c0 69 73 74 20 3d 20 30 3b 20 2f 2a 20 49 66 20 74  ist = 0; /* If t
2c5d0 68 65 20 66 72 65 65 2d 6c 69 73 74 20 6d 75 73  he free-list mus
2c5e0 74 20 62 65 20 73 65 61 72 63 68 65 64 20 66 6f  t be searched fo
2c5f0 72 20 27 6e 65 61 72 62 79 27 20 2a 2f 0a 20 20  r 'nearby' */.  
2c600 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 65 4d 6f    .    /* If eMo
2c610 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 45 58 41 43  de==BTALLOC_EXAC
2c620 54 20 61 6e 64 20 61 20 71 75 65 72 79 20 6f 66  T and a query of
2c630 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70   the pointer-map
2c640 0a 20 20 20 20 2a 2a 20 73 68 6f 77 73 20 74 68  .    ** shows th
2c650 61 74 20 74 68 65 20 70 61 67 65 20 27 6e 65 61  at the page 'nea
2c660 72 62 79 27 20 69 73 20 73 6f 6d 65 77 68 65 72  rby' is somewher
2c670 65 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69  e on the free-li
2c680 73 74 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20  st, then.    ** 
2c690 74 68 65 20 65 6e 74 69 72 65 2d 6c 69 73 74 20  the entire-list 
2c6a0 77 69 6c 6c 20 62 65 20 73 65 61 72 63 68 65 64  will be searched
2c6b0 20 66 6f 72 20 74 68 61 74 20 70 61 67 65 2e 0a   for that page..
2c6c0 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53      */.#ifndef S
2c6d0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
2c6e0 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 65 4d  ACUUM.    if( eM
2c6f0 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 45 58 41  ode==BTALLOC_EXA
2c700 43 54 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  CT ){.      if( 
2c710 6e 65 61 72 62 79 3c 3d 6d 78 50 61 67 65 20 29  nearby<=mxPage )
2c720 7b 0a 20 20 20 20 20 20 20 20 75 38 20 65 54 79  {.        u8 eTy
2c730 70 65 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  pe;.        asse
2c740 72 74 28 20 6e 65 61 72 62 79 3e 30 20 29 3b 0a  rt( nearby>0 );.
2c750 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
2c760 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
2c770 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
2c780 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20 6e  ptrmapGet(pBt, n
2c790 65 61 72 62 79 2c 20 26 65 54 79 70 65 2c 20 30  earby, &eType, 0
2c7a0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
2c7b0 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
2c7c0 20 20 20 20 20 20 20 69 66 28 20 65 54 79 70 65         if( eType
2c7d0 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47  ==PTRMAP_FREEPAG
2c7e0 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  E ){.          s
2c7f0 65 61 72 63 68 4c 69 73 74 20 3d 20 31 3b 0a 20  earchList = 1;. 
2c800 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
2c810 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65  .    }else if( e
2c820 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45  Mode==BTALLOC_LE
2c830 20 29 7b 0a 20 20 20 20 20 20 73 65 61 72 63 68   ){.      search
2c840 4c 69 73 74 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  List = 1;.    }.
2c850 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 44  #endif..    /* D
2c860 65 63 72 65 6d 65 6e 74 20 74 68 65 20 66 72 65  ecrement the fre
2c870 65 2d 6c 69 73 74 20 63 6f 75 6e 74 20 62 79 20  e-list count by 
2c880 31 2e 20 53 65 74 20 69 54 72 75 6e 6b 20 74 6f  1. Set iTrunk to
2c890 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68   the index of th
2c8a0 65 0a 20 20 20 20 2a 2a 20 66 69 72 73 74 20 66  e.    ** first f
2c8b0 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70  ree-list trunk p
2c8c0 61 67 65 2e 20 69 50 72 65 76 54 72 75 6e 6b 20  age. iPrevTrunk 
2c8d0 69 73 20 69 6e 69 74 69 61 6c 6c 79 20 31 2e 0a  is initially 1..
2c8e0 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20      */.    rc = 
2c8f0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
2c900 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67  e(pPage1->pDbPag
2c910 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  e);.    if( rc )
2c920 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
2c930 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31  put4byte(&pPage1
2c940 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20 6e 2d 31  ->aData[36], n-1
2c950 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 63  );..    /* The c
2c960 6f 64 65 20 77 69 74 68 69 6e 20 74 68 69 73 20  ode within this 
2c970 6c 6f 6f 70 20 69 73 20 72 75 6e 20 6f 6e 6c 79  loop is run only
2c980 20 6f 6e 63 65 20 69 66 20 74 68 65 20 27 73 65   once if the 'se
2c990 61 72 63 68 4c 69 73 74 27 20 76 61 72 69 61 62  archList' variab
2c9a0 6c 65 0a 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74  le.    ** is not
2c9b0 20 74 72 75 65 2e 20 4f 74 68 65 72 77 69 73 65   true. Otherwise
2c9c0 2c 20 69 74 20 72 75 6e 73 20 6f 6e 63 65 20 66  , it runs once f
2c9d0 6f 72 20 65 61 63 68 20 74 72 75 6e 6b 2d 70 61  or each trunk-pa
2c9e0 67 65 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a  ge on the.    **
2c9f0 20 66 72 65 65 2d 6c 69 73 74 20 75 6e 74 69 6c   free-list until
2ca00 20 74 68 65 20 70 61 67 65 20 27 6e 65 61 72 62   the page 'nearb
2ca10 79 27 20 69 73 20 6c 6f 63 61 74 65 64 20 28 65  y' is located (e
2ca20 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 45 58  Mode==BTALLOC_EX
2ca30 41 43 54 29 0a 20 20 20 20 2a 2a 20 6f 72 20 75  ACT).    ** or u
2ca40 6e 74 69 6c 20 61 20 70 61 67 65 20 6c 65 73 73  ntil a page less
2ca50 20 74 68 61 6e 20 27 6e 65 61 72 62 79 27 20 69   than 'nearby' i
2ca60 73 20 6c 6f 63 61 74 65 64 20 28 65 4d 6f 64 65  s located (eMode
2ca70 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 54 29 0a 20 20  ==BTALLOC_LT).  
2ca80 20 20 2a 2f 0a 20 20 20 20 64 6f 20 7b 0a 20 20    */.    do {.  
2ca90 20 20 20 20 70 50 72 65 76 54 72 75 6e 6b 20 3d      pPrevTrunk =
2caa0 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 69   pTrunk;.      i
2cab0 66 28 20 70 50 72 65 76 54 72 75 6e 6b 20 29 7b  f( pPrevTrunk ){
2cac0 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 56 49 44  .        /* EVID
2cad0 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 31 35 30 36  ENCE-OF: R-01506
2cae0 2d 31 31 30 35 33 20 54 68 65 20 66 69 72 73 74  -11053 The first
2caf0 20 69 6e 74 65 67 65 72 20 6f 6e 20 61 20 66 72   integer on a fr
2cb00 65 65 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67  eelist trunk pag
2cb10 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20  e.        ** is 
2cb20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
2cb30 6f 66 20 74 68 65 20 6e 65 78 74 20 66 72 65 65  of the next free
2cb40 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20  list trunk page 
2cb50 69 6e 20 74 68 65 20 6c 69 73 74 20 6f 72 0a 20  in the list or. 
2cb60 20 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f 20 69         ** zero i
2cb70 66 20 74 68 69 73 20 69 73 20 74 68 65 20 6c 61  f this is the la
2cb80 73 74 20 66 72 65 65 6c 69 73 74 20 74 72 75 6e  st freelist trun
2cb90 6b 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 20  k page. */.     
2cba0 20 20 20 69 54 72 75 6e 6b 20 3d 20 67 65 74 34     iTrunk = get4
2cbb0 62 79 74 65 28 26 70 50 72 65 76 54 72 75 6e 6b  byte(&pPrevTrunk
2cbc0 2d 3e 61 44 61 74 61 5b 30 5d 29 3b 0a 20 20 20  ->aData[0]);.   
2cbd0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2cbe0 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
2cbf0 3a 20 52 2d 35 39 38 34 31 2d 31 33 37 39 38 20  : R-59841-13798 
2cc00 54 68 65 20 34 2d 62 79 74 65 20 62 69 67 2d 65  The 4-byte big-e
2cc10 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 61 74  ndian integer at
2cc20 20 6f 66 66 73 65 74 20 33 32 0a 20 20 20 20 20   offset 32.     
2cc30 20 20 20 2a 2a 20 73 74 6f 72 65 73 20 74 68 65     ** stores the
2cc40 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
2cc50 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f  the first page o
2cc60 66 20 74 68 65 20 66 72 65 65 6c 69 73 74 2c 20  f the freelist, 
2cc70 6f 72 20 7a 65 72 6f 20 69 66 0a 20 20 20 20 20  or zero if.     
2cc80 20 20 20 2a 2a 20 74 68 65 20 66 72 65 65 6c 69     ** the freeli
2cc90 73 74 20 69 73 20 65 6d 70 74 79 2e 20 2a 2f 0a  st is empty. */.
2cca0 20 20 20 20 20 20 20 20 69 54 72 75 6e 6b 20 3d          iTrunk =
2ccb0 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
2ccc0 31 2d 3e 61 44 61 74 61 5b 33 32 5d 29 3b 0a 20  1->aData[32]);. 
2ccd0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 74 65 73       }.      tes
2cce0 74 63 61 73 65 28 20 69 54 72 75 6e 6b 3d 3d 6d  tcase( iTrunk==m
2ccf0 78 50 61 67 65 20 29 3b 0a 20 20 20 20 20 20 69  xPage );.      i
2cd00 66 28 20 69 54 72 75 6e 6b 3e 6d 78 50 61 67 65  f( iTrunk>mxPage
2cd10 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
2cd20 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
2cd30 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d 65 6c 73  BKPT;.      }els
2cd40 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  e{.        rc = 
2cd50 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  btreeGetPage(pBt
2cd60 2c 20 69 54 72 75 6e 6b 2c 20 26 70 54 72 75 6e  , iTrunk, &pTrun
2cd70 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  k, 0);.      }. 
2cd80 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
2cd90 20 20 20 20 20 20 20 70 54 72 75 6e 6b 20 3d 20         pTrunk = 
2cda0 30 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  0;.        goto 
2cdb0 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67  end_allocate_pag
2cdc0 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  e;.      }.     
2cdd0 20 61 73 73 65 72 74 28 20 70 54 72 75 6e 6b 21   assert( pTrunk!
2cde0 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  =0 );.      asse
2cdf0 72 74 28 20 70 54 72 75 6e 6b 2d 3e 61 44 61 74  rt( pTrunk->aDat
2ce00 61 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 2f 2a  a!=0 );.      /*
2ce10 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
2ce20 31 33 35 32 33 2d 30 34 33 39 34 20 54 68 65 20  13523-04394 The 
2ce30 73 65 63 6f 6e 64 20 69 6e 74 65 67 65 72 20 6f  second integer o
2ce40 6e 20 61 20 66 72 65 65 6c 69 73 74 20 74 72 75  n a freelist tru
2ce50 6e 6b 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a  nk page.      **
2ce60 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
2ce70 66 20 6c 65 61 66 20 70 61 67 65 20 70 6f 69 6e  f leaf page poin
2ce80 74 65 72 73 20 74 6f 20 66 6f 6c 6c 6f 77 2e 20  ters to follow. 
2ce90 2a 2f 0a 20 20 20 20 20 20 6b 20 3d 20 67 65 74  */.      k = get
2cea0 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61  4byte(&pTrunk->a
2ceb0 44 61 74 61 5b 34 5d 29 3b 0a 20 20 20 20 20 20  Data[4]);.      
2cec0 69 66 28 20 6b 3d 3d 30 20 26 26 20 21 73 65 61  if( k==0 && !sea
2ced0 72 63 68 4c 69 73 74 20 29 7b 0a 20 20 20 20 20  rchList ){.     
2cee0 20 20 20 2f 2a 20 54 68 65 20 74 72 75 6e 6b 20     /* The trunk 
2cef0 68 61 73 20 6e 6f 20 6c 65 61 76 65 73 20 61 6e  has no leaves an
2cf00 64 20 74 68 65 20 6c 69 73 74 20 69 73 20 6e 6f  d the list is no
2cf10 74 20 62 65 69 6e 67 20 73 65 61 72 63 68 65 64  t being searched
2cf20 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 53 6f  . .        ** So
2cf30 20 65 78 74 72 61 63 74 20 74 68 65 20 74 72 75   extract the tru
2cf40 6e 6b 20 70 61 67 65 20 69 74 73 65 6c 66 20 61  nk page itself a
2cf50 6e 64 20 75 73 65 20 69 74 20 61 73 20 74 68 65  nd use it as the
2cf60 20 6e 65 77 6c 79 20 0a 20 20 20 20 20 20 20 20   newly .        
2cf70 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67  ** allocated pag
2cf80 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73  e */.        ass
2cf90 65 72 74 28 20 70 50 72 65 76 54 72 75 6e 6b 3d  ert( pPrevTrunk=
2cfa0 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63  =0 );.        rc
2cfb0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
2cfc0 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62  rite(pTrunk->pDb
2cfd0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69  Page);.        i
2cfe0 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
2cff0 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f     goto end_allo
2d000 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20  cate_page;.     
2d010 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2a 70 50     }.        *pP
2d020 67 6e 6f 20 3d 20 69 54 72 75 6e 6b 3b 0a 20 20  gno = iTrunk;.  
2d030 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50        memcpy(&pP
2d040 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c  age1->aData[32],
2d050 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b   &pTrunk->aData[
2d060 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20  0], 4);.        
2d070 2a 70 70 50 61 67 65 20 3d 20 70 54 72 75 6e 6b  *ppPage = pTrunk
2d080 3b 0a 20 20 20 20 20 20 20 20 70 54 72 75 6e 6b  ;.        pTrunk
2d090 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 54 52   = 0;.        TR
2d0a0 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20  ACE(("ALLOCATE: 
2d0b0 25 64 20 74 72 75 6e 6b 20 2d 20 25 64 20 66 72  %d trunk - %d fr
2d0c0 65 65 20 70 61 67 65 73 20 6c 65 66 74 5c 6e 22  ee pages left\n"
2d0d0 2c 20 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b  , *pPgno, n-1));
2d0e0 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
2d0f0 20 6b 3e 28 75 33 32 29 28 70 42 74 2d 3e 75 73   k>(u32)(pBt->us
2d100 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 32 29 20  ableSize/4 - 2) 
2d110 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 56 61  ){.        /* Va
2d120 6c 75 65 20 6f 66 20 6b 20 69 73 20 6f 75 74 20  lue of k is out 
2d130 6f 66 20 72 61 6e 67 65 2e 20 20 44 61 74 61 62  of range.  Datab
2d140 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 2a  ase corruption *
2d150 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  /.        rc = S
2d160 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
2d170 50 54 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f  PT;.        goto
2d180 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
2d190 67 65 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  ge;.#ifndef SQLI
2d1a0 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
2d1b0 55 4d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  UM.      }else i
2d1c0 66 28 20 73 65 61 72 63 68 4c 69 73 74 20 0a 20  f( searchList . 
2d1d0 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28 6e             && (n
2d1e0 65 61 72 62 79 3d 3d 69 54 72 75 6e 6b 20 7c 7c  earby==iTrunk ||
2d1f0 20 28 69 54 72 75 6e 6b 3c 6e 65 61 72 62 79 20   (iTrunk<nearby 
2d200 26 26 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f  && eMode==BTALLO
2d210 43 5f 4c 45 29 29 20 0a 20 20 20 20 20 20 29 7b  C_LE)) .      ){
2d220 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
2d230 6c 69 73 74 20 69 73 20 62 65 69 6e 67 20 73 65  list is being se
2d240 61 72 63 68 65 64 20 61 6e 64 20 74 68 69 73 20  arched and this 
2d250 74 72 75 6e 6b 20 70 61 67 65 20 69 73 20 74 68  trunk page is th
2d260 65 20 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a  e page.        *
2d270 2a 20 74 6f 20 61 6c 6c 6f 63 61 74 65 2c 20 72  * to allocate, r
2d280 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65  egardless of whe
2d290 74 68 65 72 20 69 74 20 68 61 73 20 6c 65 61 76  ther it has leav
2d2a0 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  es..        */. 
2d2b0 20 20 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20         *pPgno = 
2d2c0 69 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20  iTrunk;.        
2d2d0 2a 70 70 50 61 67 65 20 3d 20 70 54 72 75 6e 6b  *ppPage = pTrunk
2d2e0 3b 0a 20 20 20 20 20 20 20 20 73 65 61 72 63 68  ;.        search
2d2f0 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  List = 0;.      
2d300 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
2d310 67 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d  gerWrite(pTrunk-
2d320 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
2d330 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
2d340 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
2d350 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20  allocate_page;. 
2d360 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2d370 20 69 66 28 20 6b 3d 3d 30 20 29 7b 0a 20 20 20   if( k==0 ){.   
2d380 20 20 20 20 20 20 20 69 66 28 20 21 70 50 72 65         if( !pPre
2d390 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20  vTrunk ){.      
2d3a0 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50        memcpy(&pP
2d3b0 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c  age1->aData[32],
2d3c0 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b   &pTrunk->aData[
2d3d0 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20  0], 4);.        
2d3e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2d3f0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
2d400 33 50 61 67 65 72 57 72 69 74 65 28 70 50 72 65  3PagerWrite(pPre
2d410 76 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29  vTrunk->pDbPage)
2d420 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
2d430 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2d440 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
2d450 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
2d460 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20  te_page;.       
2d470 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2d480 20 20 20 6d 65 6d 63 70 79 28 26 70 50 72 65 76     memcpy(&pPrev
2d490 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c  Trunk->aData[0],
2d4a0 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b   &pTrunk->aData[
2d4b0 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20  0], 4);.        
2d4c0 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73    }.        }els
2d4d0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e{.          /* 
2d4e0 54 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20 69  The trunk page i
2d4f0 73 20 72 65 71 75 69 72 65 64 20 62 79 20 74 68  s required by th
2d500 65 20 63 61 6c 6c 65 72 20 62 75 74 20 69 74 20  e caller but it 
2d510 63 6f 6e 74 61 69 6e 73 20 0a 20 20 20 20 20 20  contains .      
2d520 20 20 20 20 2a 2a 20 70 6f 69 6e 74 65 72 73 20      ** pointers 
2d530 74 6f 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61  to free-list lea
2d540 76 65 73 2e 20 54 68 65 20 66 69 72 73 74 20 6c  ves. The first l
2d550 65 61 66 20 62 65 63 6f 6d 65 73 20 61 20 74 72  eaf becomes a tr
2d560 75 6e 6b 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  unk.          **
2d570 20 70 61 67 65 20 69 6e 20 74 68 69 73 20 63 61   page in this ca
2d580 73 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f  se..          */
2d590 0a 20 20 20 20 20 20 20 20 20 20 4d 65 6d 50 61  .          MemPa
2d5a0 67 65 20 2a 70 4e 65 77 54 72 75 6e 6b 3b 0a 20  ge *pNewTrunk;. 
2d5b0 20 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69 4e           Pgno iN
2d5c0 65 77 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79  ewTrunk = get4by
2d5d0 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74  te(&pTrunk->aDat
2d5e0 61 5b 38 5d 29 3b 0a 20 20 20 20 20 20 20 20 20  a[8]);.         
2d5f0 20 69 66 28 20 69 4e 65 77 54 72 75 6e 6b 3e 6d   if( iNewTrunk>m
2d600 78 50 61 67 65 20 29 7b 20 0a 20 20 20 20 20 20  xPage ){ .      
2d610 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
2d620 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
2d630 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f              goto
2d640 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
2d650 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ge;.          }.
2d660 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
2d670 73 65 28 20 69 4e 65 77 54 72 75 6e 6b 3d 3d 6d  se( iNewTrunk==m
2d680 78 50 61 67 65 20 29 3b 0a 20 20 20 20 20 20 20  xPage );.       
2d690 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74     rc = btreeGet
2d6a0 50 61 67 65 28 70 42 74 2c 20 69 4e 65 77 54 72  Page(pBt, iNewTr
2d6b0 75 6e 6b 2c 20 26 70 4e 65 77 54 72 75 6e 6b 2c  unk, &pNewTrunk,
2d6c0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69   0);.          i
2d6d0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2d6e0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2d6f0 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
2d700 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20  e_page;.        
2d710 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72 63    }.          rc
2d720 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
2d730 72 69 74 65 28 70 4e 65 77 54 72 75 6e 6b 2d 3e  rite(pNewTrunk->
2d740 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
2d750 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
2d760 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
2d770 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
2d780 28 70 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20  (pNewTrunk);.   
2d790 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
2d7a0 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b  d_allocate_page;
2d7b0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2d7c0 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70         memcpy(&p
2d7d0 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b  NewTrunk->aData[
2d7e0 30 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61  0], &pTrunk->aDa
2d7f0 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20  ta[0], 4);.     
2d800 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
2d810 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b  NewTrunk->aData[
2d820 34 5d 2c 20 6b 2d 31 29 3b 0a 20 20 20 20 20 20  4], k-1);.      
2d830 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4e 65 77      memcpy(&pNew
2d840 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d 2c  Trunk->aData[8],
2d850 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b   &pTrunk->aData[
2d860 31 32 5d 2c 20 28 6b 2d 31 29 2a 34 29 3b 0a 20  12], (k-1)*4);. 
2d870 20 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65           release
2d880 50 61 67 65 28 70 4e 65 77 54 72 75 6e 6b 29 3b  Page(pNewTrunk);
2d890 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21  .          if( !
2d8a0 70 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20  pPrevTrunk ){.  
2d8b0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
2d8c0 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
2d8d0 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 31  writeable(pPage1
2d8e0 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
2d8f0 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79            put4by
2d900 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
2d910 61 5b 33 32 5d 2c 20 69 4e 65 77 54 72 75 6e 6b  a[32], iNewTrunk
2d920 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  );.          }el
2d930 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
2d940 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
2d950 72 57 72 69 74 65 28 70 50 72 65 76 54 72 75 6e  rWrite(pPrevTrun
2d960 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  k->pDbPage);.   
2d970 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20           if( rc 
2d980 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
2d990 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
2d9a0 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20  te_page;.       
2d9b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2d9c0 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50 72     put4byte(&pPr
2d9d0 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30  evTrunk->aData[0
2d9e0 5d 2c 20 69 4e 65 77 54 72 75 6e 6b 29 3b 0a 20  ], iNewTrunk);. 
2d9f0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2da00 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 54 72     }.        pTr
2da10 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  unk = 0;.       
2da20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54   TRACE(("ALLOCAT
2da30 45 3a 20 25 64 20 74 72 75 6e 6b 20 2d 20 25 64  E: %d trunk - %d
2da40 20 66 72 65 65 20 70 61 67 65 73 20 6c 65 66 74   free pages left
2da50 5c 6e 22 2c 20 2a 70 50 67 6e 6f 2c 20 6e 2d 31  \n", *pPgno, n-1
2da60 29 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  ));.#endif.     
2da70 20 7d 65 6c 73 65 20 69 66 28 20 6b 3e 30 20 29   }else if( k>0 )
2da80 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74  {.        /* Ext
2da90 72 61 63 74 20 61 20 6c 65 61 66 20 66 72 6f 6d  ract a leaf from
2daa0 20 74 68 65 20 74 72 75 6e 6b 20 2a 2f 0a 20 20   the trunk */.  
2dab0 20 20 20 20 20 20 75 33 32 20 63 6c 6f 73 65 73        u32 closes
2dac0 74 3b 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20  t;.        Pgno 
2dad0 69 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20 75  iPage;.        u
2dae0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 44  nsigned char *aD
2daf0 61 74 61 20 3d 20 70 54 72 75 6e 6b 2d 3e 61 44  ata = pTrunk->aD
2db00 61 74 61 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ata;.        if(
2db10 20 6e 65 61 72 62 79 3e 30 20 29 7b 0a 20 20 20   nearby>0 ){.   
2db20 20 20 20 20 20 20 20 75 33 32 20 69 3b 0a 20 20         u32 i;.  
2db30 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20          closest 
2db40 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 69  = 0;.          i
2db50 66 28 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f  f( eMode==BTALLO
2db60 43 5f 4c 45 20 29 7b 0a 20 20 20 20 20 20 20 20  C_LE ){.        
2db70 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6b      for(i=0; i<k
2db80 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
2db90 20 20 20 20 20 20 69 50 61 67 65 20 3d 20 67 65        iPage = ge
2dba0 74 34 62 79 74 65 28 26 61 44 61 74 61 5b 38 2b  t4byte(&aData[8+
2dbb0 69 2a 34 5d 29 3b 0a 20 20 20 20 20 20 20 20 20  i*4]);.         
2dbc0 20 20 20 20 20 69 66 28 20 69 50 61 67 65 3c 3d       if( iPage<=
2dbd0 6e 65 61 72 62 79 20 29 7b 0a 20 20 20 20 20 20  nearby ){.      
2dbe0 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73            closes
2dbf0 74 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 20  t = i;.         
2dc00 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
2dc10 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
2dc20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2dc30 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2dc40 20 20 20 20 20 20 20 20 20 69 6e 74 20 64 69 73           int dis
2dc50 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 64  t;.            d
2dc60 69 73 74 20 3d 20 73 71 6c 69 74 65 33 41 62 73  ist = sqlite3Abs
2dc70 49 6e 74 33 32 28 67 65 74 34 62 79 74 65 28 26  Int32(get4byte(&
2dc80 61 44 61 74 61 5b 38 5d 29 20 2d 20 6e 65 61 72  aData[8]) - near
2dc90 62 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  by);.           
2dca0 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6b 3b 20 69   for(i=1; i<k; i
2dcb0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
2dcc0 20 20 20 69 6e 74 20 64 32 20 3d 20 73 71 6c 69     int d2 = sqli
2dcd0 74 65 33 41 62 73 49 6e 74 33 32 28 67 65 74 34  te3AbsInt32(get4
2dce0 62 79 74 65 28 26 61 44 61 74 61 5b 38 2b 69 2a  byte(&aData[8+i*
2dcf0 34 5d 29 20 2d 20 6e 65 61 72 62 79 29 3b 0a 20  4]) - nearby);. 
2dd00 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
2dd10 20 64 32 3c 64 69 73 74 20 29 7b 0a 20 20 20 20   d2<dist ){.    
2dd20 20 20 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73              clos
2dd30 65 73 74 20 3d 20 69 3b 0a 20 20 20 20 20 20 20  est = i;.       
2dd40 20 20 20 20 20 20 20 20 20 64 69 73 74 20 3d 20           dist = 
2dd50 64 32 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  d2;.            
2dd60 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
2dd70 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  }.          }.  
2dd80 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2dd90 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d         closest =
2dda0 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20   0;.        }.. 
2ddb0 20 20 20 20 20 20 20 69 50 61 67 65 20 3d 20 67         iPage = g
2ddc0 65 74 34 62 79 74 65 28 26 61 44 61 74 61 5b 38  et4byte(&aData[8
2ddd0 2b 63 6c 6f 73 65 73 74 2a 34 5d 29 3b 0a 20 20  +closest*4]);.  
2dde0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
2ddf0 69 50 61 67 65 3d 3d 6d 78 50 61 67 65 20 29 3b  iPage==mxPage );
2de00 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 50 61  .        if( iPa
2de10 67 65 3e 6d 78 50 61 67 65 20 29 7b 0a 20 20 20  ge>mxPage ){.   
2de20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
2de30 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
2de40 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
2de50 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67  end_allocate_pag
2de60 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  e;.        }.   
2de70 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
2de80 50 61 67 65 3d 3d 6d 78 50 61 67 65 20 29 3b 0a  Page==mxPage );.
2de90 20 20 20 20 20 20 20 20 69 66 28 20 21 73 65 61          if( !sea
2dea0 72 63 68 4c 69 73 74 20 0a 20 20 20 20 20 20 20  rchList .       
2deb0 20 20 7c 7c 20 28 69 50 61 67 65 3d 3d 6e 65 61    || (iPage==nea
2dec0 72 62 79 20 7c 7c 20 28 69 50 61 67 65 3c 6e 65  rby || (iPage<ne
2ded0 61 72 62 79 20 26 26 20 65 4d 6f 64 65 3d 3d 42  arby && eMode==B
2dee0 54 41 4c 4c 4f 43 5f 4c 45 29 29 20 0a 20 20 20  TALLOC_LE)) .   
2def0 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
2df00 20 20 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74 3b    int noContent;
2df10 0a 20 20 20 20 20 20 20 20 20 20 2a 70 50 67 6e  .          *pPgn
2df20 6f 20 3d 20 69 50 61 67 65 3b 0a 20 20 20 20 20  o = iPage;.     
2df30 20 20 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c       TRACE(("ALL
2df40 4f 43 41 54 45 3a 20 25 64 20 77 61 73 20 6c 65  OCATE: %d was le
2df50 61 66 20 25 64 20 6f 66 20 25 64 20 6f 6e 20 74  af %d of %d on t
2df60 72 75 6e 6b 20 25 64 22 0a 20 20 20 20 20 20 20  runk %d".       
2df70 20 20 20 20 20 20 20 20 20 20 22 3a 20 25 64 20            ": %d 
2df80 6d 6f 72 65 20 66 72 65 65 20 70 61 67 65 73 5c  more free pages\
2df90 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
2dfa0 20 20 20 20 20 2a 70 50 67 6e 6f 2c 20 63 6c 6f       *pPgno, clo
2dfb0 73 65 73 74 2b 31 2c 20 6b 2c 20 70 54 72 75 6e  sest+1, k, pTrun
2dfc0 6b 2d 3e 70 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a  k->pgno, n-1));.
2dfd0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
2dfe0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
2dff0 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65  (pTrunk->pDbPage
2e000 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
2e010 20 72 63 20 29 20 67 6f 74 6f 20 65 6e 64 5f 61   rc ) goto end_a
2e020 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
2e030 20 20 20 20 20 20 20 20 69 66 28 20 63 6c 6f 73          if( clos
2e040 65 73 74 3c 6b 2d 31 20 29 7b 0a 20 20 20 20 20  est<k-1 ){.     
2e050 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 61         memcpy(&a
2e060 44 61 74 61 5b 38 2b 63 6c 6f 73 65 73 74 2a 34  Data[8+closest*4
2e070 5d 2c 20 26 61 44 61 74 61 5b 34 2b 6b 2a 34 5d  ], &aData[4+k*4]
2e080 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 4);.          
2e090 7d 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 34  }.          put4
2e0a0 62 79 74 65 28 26 61 44 61 74 61 5b 34 5d 2c 20  byte(&aData[4], 
2e0b0 6b 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20  k-1);.          
2e0c0 6e 6f 43 6f 6e 74 65 6e 74 20 3d 20 21 62 74 72  noContent = !btr
2e0d0 65 65 47 65 74 48 61 73 43 6f 6e 74 65 6e 74 28  eeGetHasContent(
2e0e0 70 42 74 2c 20 2a 70 50 67 6e 6f 29 3f 20 50 41  pBt, *pPgno)? PA
2e0f0 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e  GER_GET_NOCONTEN
2e100 54 20 3a 20 30 3b 0a 20 20 20 20 20 20 20 20 20  T : 0;.         
2e110 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61   rc = btreeGetPa
2e120 67 65 28 70 42 74 2c 20 2a 70 50 67 6e 6f 2c 20  ge(pBt, *pPgno, 
2e130 70 70 50 61 67 65 2c 20 6e 6f 43 6f 6e 74 65 6e  ppPage, noConten
2e140 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  t);.          if
2e150 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2e160 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ){.            r
2e170 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
2e180 57 72 69 74 65 28 28 2a 70 70 50 61 67 65 29 2d  Write((*ppPage)-
2e190 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
2e1a0 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
2e1b0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2e1c0 20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61 73            releas
2e1d0 65 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a  ePage(*ppPage);.
2e1e0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
2e1f0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2e200 20 20 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d      searchList =
2e210 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   0;.        }.  
2e220 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 6c 65      }.      rele
2e230 61 73 65 50 61 67 65 28 70 50 72 65 76 54 72 75  asePage(pPrevTru
2e240 6e 6b 29 3b 0a 20 20 20 20 20 20 70 50 72 65 76  nk);.      pPrev
2e250 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 7d  Trunk = 0;.    }
2e260 77 68 69 6c 65 28 20 73 65 61 72 63 68 4c 69 73  while( searchLis
2e270 74 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  t );.  }else{.  
2e280 20 20 2f 2a 20 54 68 65 72 65 20 61 72 65 20 6e    /* There are n
2e290 6f 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66  o pages on the f
2e2a0 72 65 65 6c 69 73 74 2c 20 73 6f 20 61 70 70 65  reelist, so appe
2e2b0 6e 64 20 61 20 6e 65 77 20 70 61 67 65 20 74 6f  nd a new page to
2e2c0 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61   the.    ** data
2e2d0 62 61 73 65 20 69 6d 61 67 65 2e 0a 20 20 20 20  base image..    
2e2e0 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f 72 6d 61 6c  **.    ** Normal
2e2f0 6c 79 2c 20 6e 65 77 20 70 61 67 65 73 20 61 6c  ly, new pages al
2e300 6c 6f 63 61 74 65 64 20 62 79 20 74 68 69 73 20  located by this 
2e310 62 6c 6f 63 6b 20 63 61 6e 20 62 65 20 72 65 71  block can be req
2e320 75 65 73 74 65 64 20 66 72 6f 6d 20 74 68 65 0a  uested from the.
2e330 20 20 20 20 2a 2a 20 70 61 67 65 72 20 6c 61 79      ** pager lay
2e340 65 72 20 77 69 74 68 20 74 68 65 20 27 6e 6f 2d  er with the 'no-
2e350 63 6f 6e 74 65 6e 74 27 20 66 6c 61 67 20 73 65  content' flag se
2e360 74 2e 20 54 68 69 73 20 70 72 65 76 65 6e 74 73  t. This prevents
2e370 20 74 68 65 20 70 61 67 65 72 0a 20 20 20 20 2a   the pager.    *
2e380 2a 20 66 72 6f 6d 20 74 72 79 69 6e 67 20 74 6f  * from trying to
2e390 20 72 65 61 64 20 74 68 65 20 70 61 67 65 73 20   read the pages 
2e3a0 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 64 69 73  content from dis
2e3b0 6b 2e 20 48 6f 77 65 76 65 72 2c 20 69 66 20 74  k. However, if t
2e3c0 68 65 0a 20 20 20 20 2a 2a 20 63 75 72 72 65 6e  he.    ** curren
2e3d0 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61  t transaction ha
2e3e0 73 20 61 6c 72 65 61 64 79 20 72 75 6e 20 6f 6e  s already run on
2e3f0 65 20 6f 72 20 6d 6f 72 65 20 69 6e 63 72 65 6d  e or more increm
2e400 65 6e 74 61 6c 2d 76 61 63 75 75 6d 0a 20 20 20  ental-vacuum.   
2e410 20 2a 2a 20 73 74 65 70 73 2c 20 74 68 65 6e 20   ** steps, then 
2e420 74 68 65 20 70 61 67 65 20 77 65 20 61 72 65 20  the page we are 
2e430 61 62 6f 75 74 20 74 6f 20 61 6c 6c 6f 63 61 74  about to allocat
2e440 65 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 63 6f  e may contain co
2e450 6e 74 65 6e 74 0a 20 20 20 20 2a 2a 20 74 68 61  ntent.    ** tha
2e460 74 20 69 73 20 72 65 71 75 69 72 65 64 20 69 6e  t is required in
2e470 20 74 68 65 20 65 76 65 6e 74 20 6f 66 20 61 20   the event of a 
2e480 72 6f 6c 6c 62 61 63 6b 2e 20 49 6e 20 74 68 69  rollback. In thi
2e490 73 20 63 61 73 65 2c 20 64 6f 0a 20 20 20 20 2a  s case, do.    *
2e4a0 2a 20 6e 6f 74 20 73 65 74 20 74 68 65 20 6e 6f  * not set the no
2e4b0 2d 63 6f 6e 74 65 6e 74 20 66 6c 61 67 2e 20 54  -content flag. T
2e4c0 68 69 73 20 63 61 75 73 65 73 20 74 68 65 20 70  his causes the p
2e4d0 61 67 65 72 20 74 6f 20 6c 6f 61 64 20 61 6e 64  ager to load and
2e4e0 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20   journal.    ** 
2e4f0 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65  the current page
2e500 20 63 6f 6e 74 65 6e 74 20 62 65 66 6f 72 65 20   content before 
2e510 6f 76 65 72 77 72 69 74 69 6e 67 20 69 74 2e 0a  overwriting it..
2e520 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f      **.    ** No
2e530 74 65 20 74 68 61 74 20 74 68 65 20 70 61 67 65  te that the page
2e540 72 20 77 69 6c 6c 20 6e 6f 74 20 61 63 74 75 61  r will not actua
2e550 6c 6c 79 20 61 74 74 65 6d 70 74 20 74 6f 20 6c  lly attempt to l
2e560 6f 61 64 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 0a  oad or journal .
2e570 20 20 20 20 2a 2a 20 63 6f 6e 74 65 6e 74 20 66      ** content f
2e580 6f 72 20 61 6e 79 20 70 61 67 65 20 74 68 61 74  or any page that
2e590 20 72 65 61 6c 6c 79 20 64 6f 65 73 20 6c 69 65   really does lie
2e5a0 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66   past the end of
2e5b0 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20   the database.  
2e5c0 20 20 2a 2a 20 66 69 6c 65 20 6f 6e 20 64 69 73    ** file on dis
2e5d0 6b 2e 20 53 6f 20 74 68 65 20 65 66 66 65 63 74  k. So the effect
2e5e0 73 20 6f 66 20 64 69 73 61 62 6c 69 6e 67 20 74  s of disabling t
2e5f0 68 65 20 6e 6f 2d 63 6f 6e 74 65 6e 74 20 6f 70  he no-content op
2e600 74 69 6d 69 7a 61 74 69 6f 6e 0a 20 20 20 20 2a  timization.    *
2e610 2a 20 68 65 72 65 20 61 72 65 20 63 6f 6e 66 69  * here are confi
2e620 6e 65 64 20 74 6f 20 74 68 6f 73 65 20 70 61 67  ned to those pag
2e630 65 73 20 74 68 61 74 20 6c 69 65 20 62 65 74 77  es that lie betw
2e640 65 65 6e 20 74 68 65 20 65 6e 64 20 6f 66 20 74  een the end of t
2e650 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61  he.    ** databa
2e660 73 65 20 69 6d 61 67 65 20 61 6e 64 20 74 68 65  se image and the
2e670 20 65 6e 64 20 6f 66 20 74 68 65 20 64 61 74 61   end of the data
2e680 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a  base file..    *
2e690 2f 0a 20 20 20 20 69 6e 74 20 62 4e 6f 43 6f 6e  /.    int bNoCon
2e6a0 74 65 6e 74 20 3d 20 28 30 3d 3d 49 66 4e 6f 74  tent = (0==IfNot
2e6b0 4f 6d 69 74 41 56 28 70 42 74 2d 3e 62 44 6f 54  OmitAV(pBt->bDoT
2e6c0 72 75 6e 63 61 74 65 29 29 3f 20 50 41 47 45 52  runcate))? PAGER
2e6d0 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 3a 30  _GET_NOCONTENT:0
2e6e0 3b 0a 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ;..    rc = sqli
2e6f0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 42  te3PagerWrite(pB
2e700 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62 50 61  t->pPage1->pDbPa
2e710 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  ge);.    if( rc 
2e720 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
2e730 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 20   pBt->nPage++;. 
2e740 20 20 20 69 66 28 20 70 42 74 2d 3e 6e 50 61 67     if( pBt->nPag
2e750 65 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  e==PENDING_BYTE_
2e760 50 41 47 45 28 70 42 74 29 20 29 20 70 42 74 2d  PAGE(pBt) ) pBt-
2e770 3e 6e 50 61 67 65 2b 2b 3b 0a 0a 23 69 66 6e 64  >nPage++;..#ifnd
2e780 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
2e790 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66  UTOVACUUM.    if
2e7a0 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
2e7b0 6d 20 26 26 20 50 54 52 4d 41 50 5f 49 53 50 41  m && PTRMAP_ISPA
2e7c0 47 45 28 70 42 74 2c 20 70 42 74 2d 3e 6e 50 61  GE(pBt, pBt->nPa
2e7d0 67 65 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ge) ){.      /* 
2e7e0 49 66 20 2a 70 50 67 6e 6f 20 72 65 66 65 72 73  If *pPgno refers
2e7f0 20 74 6f 20 61 20 70 6f 69 6e 74 65 72 2d 6d 61   to a pointer-ma
2e800 70 20 70 61 67 65 2c 20 61 6c 6c 6f 63 61 74 65  p page, allocate
2e810 20 74 77 6f 20 6e 65 77 20 70 61 67 65 73 0a 20   two new pages. 
2e820 20 20 20 20 20 2a 2a 20 61 74 20 74 68 65 20 65       ** at the e
2e830 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69  nd of the file i
2e840 6e 73 74 65 61 64 20 6f 66 20 6f 6e 65 2e 20 54  nstead of one. T
2e850 68 65 20 66 69 72 73 74 20 61 6c 6c 6f 63 61 74  he first allocat
2e860 65 64 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a  ed page.      **
2e870 20 62 65 63 6f 6d 65 73 20 61 20 6e 65 77 20 70   becomes a new p
2e880 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 2c  ointer-map page,
2e890 20 74 68 65 20 73 65 63 6f 6e 64 20 69 73 20 75   the second is u
2e8a0 73 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65  sed by the calle
2e8b0 72 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  r..      */.    
2e8c0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 67 20 3d    MemPage *pPg =
2e8d0 20 30 3b 0a 20 20 20 20 20 20 54 52 41 43 45 28   0;.      TRACE(
2e8e0 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 66  ("ALLOCATE: %d f
2e8f0 72 6f 6d 20 65 6e 64 20 6f 66 20 66 69 6c 65 20  rom end of file 
2e900 28 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67  (pointer-map pag
2e910 65 29 5c 6e 22 2c 20 70 42 74 2d 3e 6e 50 61 67  e)\n", pBt->nPag
2e920 65 29 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  e));.      asser
2e930 74 28 20 70 42 74 2d 3e 6e 50 61 67 65 21 3d 50  t( pBt->nPage!=P
2e940 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
2e950 28 70 42 74 29 20 29 3b 0a 20 20 20 20 20 20 72  (pBt) );.      r
2e960 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65  c = btreeGetPage
2e970 28 70 42 74 2c 20 70 42 74 2d 3e 6e 50 61 67 65  (pBt, pBt->nPage
2e980 2c 20 26 70 50 67 2c 20 62 4e 6f 43 6f 6e 74 65  , &pPg, bNoConte
2e990 6e 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  nt);.      if( r
2e9a0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2e9b0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
2e9c0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
2e9d0 50 67 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  Pg->pDbPage);.  
2e9e0 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
2e9f0 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20 7d 0a  e(pPg);.      }.
2ea00 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72        if( rc ) r
2ea10 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
2ea20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 20 20  pBt->nPage++;.  
2ea30 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6e 50 61      if( pBt->nPa
2ea40 67 65 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  ge==PENDING_BYTE
2ea50 5f 50 41 47 45 28 70 42 74 29 20 29 7b 20 70 42  _PAGE(pBt) ){ pB
2ea60 74 2d 3e 6e 50 61 67 65 2b 2b 3b 20 7d 0a 20 20  t->nPage++; }.  
2ea70 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 70    }.#endif.    p
2ea80 75 74 34 62 79 74 65 28 32 38 20 2b 20 28 75 38  ut4byte(28 + (u8
2ea90 2a 29 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  *)pBt->pPage1->a
2eaa0 44 61 74 61 2c 20 70 42 74 2d 3e 6e 50 61 67 65  Data, pBt->nPage
2eab0 29 3b 0a 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20  );.    *pPgno = 
2eac0 70 42 74 2d 3e 6e 50 61 67 65 3b 0a 0a 20 20 20  pBt->nPage;..   
2ead0 20 61 73 73 65 72 74 28 20 2a 70 50 67 6e 6f 21   assert( *pPgno!
2eae0 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
2eaf0 47 45 28 70 42 74 29 20 29 3b 0a 20 20 20 20 72  GE(pBt) );.    r
2eb00 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65  c = btreeGetPage
2eb10 28 70 42 74 2c 20 2a 70 50 67 6e 6f 2c 20 70 70  (pBt, *pPgno, pp
2eb20 50 61 67 65 2c 20 62 4e 6f 43 6f 6e 74 65 6e 74  Page, bNoContent
2eb30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
2eb40 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 72  return rc;.    r
2eb50 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
2eb60 57 72 69 74 65 28 28 2a 70 70 50 61 67 65 29 2d  Write((*ppPage)-
2eb70 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69  >pDbPage);.    i
2eb80 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2eb90 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73   ){.      releas
2eba0 65 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a  ePage(*ppPage);.
2ebb0 20 20 20 20 7d 0a 20 20 20 20 54 52 41 43 45 28      }.    TRACE(
2ebc0 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 66  ("ALLOCATE: %d f
2ebd0 72 6f 6d 20 65 6e 64 20 6f 66 20 66 69 6c 65 5c  rom end of file\
2ebe0 6e 22 2c 20 2a 70 50 67 6e 6f 29 29 3b 0a 20 20  n", *pPgno));.  
2ebf0 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 2a 70 50  }..  assert( *pP
2ec00 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54  gno!=PENDING_BYT
2ec10 45 5f 50 41 47 45 28 70 42 74 29 20 29 3b 0a 0a  E_PAGE(pBt) );..
2ec20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67  end_allocate_pag
2ec30 65 3a 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65  e:.  releasePage
2ec40 28 70 54 72 75 6e 6b 29 3b 0a 20 20 72 65 6c 65  (pTrunk);.  rele
2ec50 61 73 65 50 61 67 65 28 70 50 72 65 76 54 72 75  asePage(pPrevTru
2ec60 6e 6b 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  nk);.  if( rc==S
2ec70 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2ec80 69 66 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  if( sqlite3Pager
2ec90 50 61 67 65 52 65 66 63 6f 75 6e 74 28 28 2a 70  PageRefcount((*p
2eca0 70 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29  pPage)->pDbPage)
2ecb0 3e 31 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65  >1 ){.      rele
2ecc0 61 73 65 50 61 67 65 28 2a 70 70 50 61 67 65 29  asePage(*ppPage)
2ecd0 3b 0a 20 20 20 20 20 20 2a 70 70 50 61 67 65 20  ;.      *ppPage 
2ece0 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72  = 0;.      retur
2ecf0 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
2ed00 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20  _BKPT;.    }.   
2ed10 20 28 2a 70 70 50 61 67 65 29 2d 3e 69 73 49 6e   (*ppPage)->isIn
2ed20 69 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  it = 0;.  }else{
2ed30 0a 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 30  .    *ppPage = 0
2ed40 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
2ed50 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
2ed60 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
2ed70 72 69 74 65 61 62 6c 65 28 28 2a 70 70 50 61 67  riteable((*ppPag
2ed80 65 29 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  e)->pDbPage) );.
2ed90 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
2eda0 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
2edb0 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 61  ion is used to a
2edc0 64 64 20 70 61 67 65 20 69 50 61 67 65 20 74 6f  dd page iPage to
2edd0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2ede0 6c 65 20 66 72 65 65 2d 6c 69 73 74 2e 20 0a 2a  le free-list. .*
2edf0 2a 20 49 74 20 69 73 20 61 73 73 75 6d 65 64 20  * It is assumed 
2ee00 74 68 61 74 20 74 68 65 20 70 61 67 65 20 69 73  that the page is
2ee10 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 61 20 70   not already a p
2ee20 61 72 74 20 6f 66 20 74 68 65 20 66 72 65 65 2d  art of the free-
2ee30 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  list..**.** The 
2ee40 76 61 6c 75 65 20 70 61 73 73 65 64 20 61 73 20  value passed as 
2ee50 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
2ee60 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63  ent to this func
2ee70 74 69 6f 6e 20 69 73 20 6f 70 74 69 6f 6e 61 6c  tion is optional
2ee80 2e 0a 2a 2a 20 49 66 20 74 68 65 20 63 61 6c 6c  ..** If the call
2ee90 65 72 20 68 61 70 70 65 6e 73 20 74 6f 20 68 61  er happens to ha
2eea0 76 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ve a pointer to 
2eeb0 74 68 65 20 4d 65 6d 50 61 67 65 20 6f 62 6a 65  the MemPage obje
2eec0 63 74 20 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e  ct .** correspon
2eed0 64 69 6e 67 20 74 6f 20 70 61 67 65 20 69 50 61  ding to page iPa
2eee0 67 65 20 68 61 6e 64 79 2c 20 69 74 20 6d 61 79  ge handy, it may
2eef0 20 70 61 73 73 20 69 74 20 61 73 20 74 68 65 20   pass it as the 
2ef00 73 65 63 6f 6e 64 20 76 61 6c 75 65 2e 20 0a 2a  second value. .*
2ef10 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20  * Otherwise, it 
2ef20 6d 61 79 20 70 61 73 73 20 4e 55 4c 4c 2e 0a 2a  may pass NULL..*
2ef30 2a 0a 2a 2a 20 49 66 20 61 20 70 6f 69 6e 74 65  *.** If a pointe
2ef40 72 20 74 6f 20 61 20 4d 65 6d 50 61 67 65 20 6f  r to a MemPage o
2ef50 62 6a 65 63 74 20 69 73 20 70 61 73 73 65 64 20  bject is passed 
2ef60 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
2ef70 67 75 6d 65 6e 74 2c 0a 2a 2a 20 69 74 73 20 72  gument,.** its r
2ef80 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 69  eference count i
2ef90 73 20 6e 6f 74 20 61 6c 74 65 72 65 64 20 62 79  s not altered by
2efa0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a   this function..
2efb0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 72  */.static int fr
2efc0 65 65 50 61 67 65 32 28 42 74 53 68 61 72 65 64  eePage2(BtShared
2efd0 20 2a 70 42 74 2c 20 4d 65 6d 50 61 67 65 20 2a   *pBt, MemPage *
2efe0 70 4d 65 6d 50 61 67 65 2c 20 50 67 6e 6f 20 69  pMemPage, Pgno i
2eff0 50 61 67 65 29 7b 0a 20 20 4d 65 6d 50 61 67 65  Page){.  MemPage
2f000 20 2a 70 54 72 75 6e 6b 20 3d 20 30 3b 20 20 20   *pTrunk = 0;   
2f010 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2f020 46 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20  Free-list trunk 
2f030 70 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69  page */.  Pgno i
2f040 54 72 75 6e 6b 20 3d 20 30 3b 20 20 20 20 20 20  Trunk = 0;      
2f050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2f060 20 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   Page number of 
2f070 66 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20  free-list trunk 
2f080 70 61 67 65 20 2a 2f 20 0a 20 20 4d 65 6d 50 61  page */ .  MemPa
2f090 67 65 20 2a 70 50 61 67 65 31 20 3d 20 70 42 74  ge *pPage1 = pBt
2f0a0 2d 3e 70 50 61 67 65 31 3b 20 20 20 20 20 20 2f  ->pPage1;      /
2f0b0 2a 20 4c 6f 63 61 6c 20 72 65 66 65 72 65 6e 63  * Local referenc
2f0c0 65 20 74 6f 20 70 61 67 65 20 31 20 2a 2f 0a 20  e to page 1 */. 
2f0d0 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b   MemPage *pPage;
2f0e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f0f0 20 20 20 20 20 2f 2a 20 50 61 67 65 20 62 65 69       /* Page bei
2f100 6e 67 20 66 72 65 65 64 2e 20 4d 61 79 20 62 65  ng freed. May be
2f110 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69 6e 74 20   NULL. */.  int 
2f120 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
2f130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f140 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a  /* Return Code *
2f150 2f 0a 20 20 69 6e 74 20 6e 46 72 65 65 3b 20 20  /.  int nFree;  
2f160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f170 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69          /* Initi
2f180 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  al number of pag
2f190 65 73 20 6f 6e 20 66 72 65 65 2d 6c 69 73 74 20  es on free-list 
2f1a0 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  */..  assert( sq
2f1b0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
2f1c0 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
2f1d0 20 20 61 73 73 65 72 74 28 20 69 50 61 67 65 3e    assert( iPage>
2f1e0 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21  1 );.  assert( !
2f1f0 70 4d 65 6d 50 61 67 65 20 7c 7c 20 70 4d 65 6d  pMemPage || pMem
2f200 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 69 50 61 67  Page->pgno==iPag
2f210 65 20 29 3b 0a 0a 20 20 69 66 28 20 70 4d 65 6d  e );..  if( pMem
2f220 50 61 67 65 20 29 7b 0a 20 20 20 20 70 50 61 67  Page ){.    pPag
2f230 65 20 3d 20 70 4d 65 6d 50 61 67 65 3b 0a 20 20  e = pMemPage;.  
2f240 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65    sqlite3PagerRe
2f250 66 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  f(pPage->pDbPage
2f260 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
2f270 70 50 61 67 65 20 3d 20 62 74 72 65 65 50 61 67  pPage = btreePag
2f280 65 4c 6f 6f 6b 75 70 28 70 42 74 2c 20 69 50 61  eLookup(pBt, iPa
2f290 67 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  ge);.  }..  /* I
2f2a0 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 66 72 65  ncrement the fre
2f2b0 65 20 70 61 67 65 20 63 6f 75 6e 74 20 6f 6e 20  e page count on 
2f2c0 70 50 61 67 65 31 20 2a 2f 0a 20 20 72 63 20 3d  pPage1 */.  rc =
2f2d0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
2f2e0 74 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61  te(pPage1->pDbPa
2f2f0 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  ge);.  if( rc ) 
2f300 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75  goto freepage_ou
2f310 74 3b 0a 20 20 6e 46 72 65 65 20 3d 20 67 65 74  t;.  nFree = get
2f320 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61  4byte(&pPage1->a
2f330 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 70 75 74  Data[36]);.  put
2f340 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61  4byte(&pPage1->a
2f350 44 61 74 61 5b 33 36 5d 2c 20 6e 46 72 65 65 2b  Data[36], nFree+
2f360 31 29 3b 0a 0a 20 20 69 66 28 20 70 42 74 2d 3e  1);..  if( pBt->
2f370 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 53  btsFlags & BTS_S
2f380 45 43 55 52 45 5f 44 45 4c 45 54 45 20 29 7b 0a  ECURE_DELETE ){.
2f390 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73 65      /* If the se
2f3a0 63 75 72 65 5f 64 65 6c 65 74 65 20 6f 70 74 69  cure_delete opti
2f3b0 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64 2c 20 74  on is enabled, t
2f3c0 68 65 6e 0a 20 20 20 20 2a 2a 20 61 6c 77 61 79  hen.    ** alway
2f3d0 73 20 66 75 6c 6c 79 20 6f 76 65 72 77 72 69 74  s fully overwrit
2f3e0 65 20 64 65 6c 65 74 65 64 20 69 6e 66 6f 72 6d  e deleted inform
2f3f0 61 74 69 6f 6e 20 77 69 74 68 20 7a 65 72 6f 73  ation with zeros
2f400 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
2f410 20 28 21 70 50 61 67 65 20 26 26 20 28 28 72 63   (!pPage && ((rc
2f420 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28   = btreeGetPage(
2f430 70 42 74 2c 20 69 50 61 67 65 2c 20 26 70 50 61  pBt, iPage, &pPa
2f440 67 65 2c 20 30 29 29 21 3d 30 29 20 29 0a 20 20  ge, 0))!=0) ).  
2f450 20 20 20 7c 7c 20 20 20 20 20 20 20 20 20 20 20     ||           
2f460 20 28 28 72 63 20 3d 20 73 71 6c 69 74 65 33 50   ((rc = sqlite3P
2f470 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65 2d  agerWrite(pPage-
2f480 3e 70 44 62 50 61 67 65 29 29 21 3d 30 29 0a 20  >pDbPage))!=0). 
2f490 20 20 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f     ){.      goto
2f4a0 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20   freepage_out;. 
2f4b0 20 20 20 7d 0a 20 20 20 20 6d 65 6d 73 65 74 28     }.    memset(
2f4c0 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 30 2c  pPage->aData, 0,
2f4d0 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70 61 67   pPage->pBt->pag
2f4e0 65 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f  eSize);.  }..  /
2f4f0 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73  * If the databas
2f500 65 20 73 75 70 70 6f 72 74 73 20 61 75 74 6f 2d  e supports auto-
2f510 76 61 63 75 75 6d 2c 20 77 72 69 74 65 20 61 6e  vacuum, write an
2f520 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 70 6f   entry in the po
2f530 69 6e 74 65 72 2d 6d 61 70 0a 20 20 2a 2a 20 74  inter-map.  ** t
2f540 6f 20 69 6e 64 69 63 61 74 65 20 74 68 61 74 20  o indicate that 
2f550 74 68 65 20 70 61 67 65 20 69 73 20 66 72 65 65  the page is free
2f560 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 49 53 41  ..  */.  if( ISA
2f570 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20 20  UTOVACUUM ){.   
2f580 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20   ptrmapPut(pBt, 
2f590 69 50 61 67 65 2c 20 50 54 52 4d 41 50 5f 46 52  iPage, PTRMAP_FR
2f5a0 45 45 50 41 47 45 2c 20 30 2c 20 26 72 63 29 3b  EEPAGE, 0, &rc);
2f5b0 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f  .    if( rc ) go
2f5c0 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b  to freepage_out;
2f5d0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20 6d  .  }..  /* Now m
2f5e0 61 6e 69 70 75 6c 61 74 65 20 74 68 65 20 61 63  anipulate the ac
2f5f0 74 75 61 6c 20 64 61 74 61 62 61 73 65 20 66 72  tual database fr
2f600 65 65 2d 6c 69 73 74 20 73 74 72 75 63 74 75 72  ee-list structur
2f610 65 2e 20 54 68 65 72 65 20 61 72 65 20 74 77 6f  e. There are two
2f620 0a 20 20 2a 2a 20 70 6f 73 73 69 62 69 6c 69 74  .  ** possibilit
2f630 69 65 73 2e 20 49 66 20 74 68 65 20 66 72 65 65  ies. If the free
2f640 2d 6c 69 73 74 20 69 73 20 63 75 72 72 65 6e 74  -list is current
2f650 6c 79 20 65 6d 70 74 79 2c 20 6f 72 20 69 66 20  ly empty, or if 
2f660 74 68 65 20 66 69 72 73 74 0a 20 20 2a 2a 20 74  the first.  ** t
2f670 72 75 6e 6b 20 70 61 67 65 20 69 6e 20 74 68 65  runk page in the
2f680 20 66 72 65 65 2d 6c 69 73 74 20 69 73 20 66 75   free-list is fu
2f690 6c 6c 2c 20 74 68 65 6e 20 74 68 69 73 20 70 61  ll, then this pa
2f6a0 67 65 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 61  ge will become a
2f6b0 0a 20 20 2a 2a 20 6e 65 77 20 66 72 65 65 2d 6c  .  ** new free-l
2f6c0 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 2e 20  ist trunk page. 
2f6d0 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 77 69  Otherwise, it wi
2f6e0 6c 6c 20 62 65 63 6f 6d 65 20 61 20 6c 65 61 66  ll become a leaf
2f6f0 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 66 69 72   of the.  ** fir
2f700 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20 69 6e  st trunk page in
2f710 20 74 68 65 20 63 75 72 72 65 6e 74 20 66 72 65   the current fre
2f720 65 2d 6c 69 73 74 2e 20 54 68 69 73 20 62 6c 6f  e-list. This blo
2f730 63 6b 20 74 65 73 74 73 20 69 66 20 69 74 0a 20  ck tests if it. 
2f740 20 2a 2a 20 69 73 20 70 6f 73 73 69 62 6c 65 20   ** is possible 
2f750 74 6f 20 61 64 64 20 74 68 65 20 70 61 67 65 20  to add the page 
2f760 61 73 20 61 20 6e 65 77 20 66 72 65 65 2d 6c 69  as a new free-li
2f770 73 74 20 6c 65 61 66 2e 0a 20 20 2a 2f 0a 20 20  st leaf..  */.  
2f780 69 66 28 20 6e 46 72 65 65 21 3d 30 20 29 7b 0a  if( nFree!=0 ){.
2f790 20 20 20 20 75 33 32 20 6e 4c 65 61 66 3b 20 20      u32 nLeaf;  
2f7a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2f7b0 20 49 6e 69 74 69 61 6c 20 6e 75 6d 62 65 72 20   Initial number 
2f7c0 6f 66 20 6c 65 61 66 20 63 65 6c 6c 73 20 6f 6e  of leaf cells on
2f7d0 20 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f 0a 0a   trunk page */..
2f7e0 20 20 20 20 69 54 72 75 6e 6b 20 3d 20 67 65 74      iTrunk = get
2f7f0 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61  4byte(&pPage1->a
2f800 44 61 74 61 5b 33 32 5d 29 3b 0a 20 20 20 20 72  Data[32]);.    r
2f810 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65  c = btreeGetPage
2f820 28 70 42 74 2c 20 69 54 72 75 6e 6b 2c 20 26 70  (pBt, iTrunk, &p
2f830 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 69  Trunk, 0);.    i
2f840 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2f850 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66   ){.      goto f
2f860 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20  reepage_out;.   
2f870 20 7d 0a 0a 20 20 20 20 6e 4c 65 61 66 20 3d 20   }..    nLeaf = 
2f880 67 65 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b  get4byte(&pTrunk
2f890 2d 3e 61 44 61 74 61 5b 34 5d 29 3b 0a 20 20 20  ->aData[4]);.   
2f8a0 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 75 73   assert( pBt->us
2f8b0 61 62 6c 65 53 69 7a 65 3e 33 32 20 29 3b 0a 20  ableSize>32 );. 
2f8c0 20 20 20 69 66 28 20 6e 4c 65 61 66 20 3e 20 28     if( nLeaf > (
2f8d0 75 33 32 29 70 42 74 2d 3e 75 73 61 62 6c 65 53  u32)pBt->usableS
2f8e0 69 7a 65 2f 34 20 2d 20 32 20 29 7b 0a 20 20 20  ize/4 - 2 ){.   
2f8f0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
2f900 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
2f910 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65     goto freepage
2f920 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _out;.    }.    
2f930 69 66 28 20 6e 4c 65 61 66 20 3c 20 28 75 33 32  if( nLeaf < (u32
2f940 29 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  )pBt->usableSize
2f950 2f 34 20 2d 20 38 20 29 7b 0a 20 20 20 20 20 20  /4 - 8 ){.      
2f960 2f 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  /* In this case 
2f970 74 68 65 72 65 20 69 73 20 72 6f 6f 6d 20 6f 6e  there is room on
2f980 20 74 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20   the trunk page 
2f990 74 6f 20 69 6e 73 65 72 74 20 74 68 65 20 70 61  to insert the pa
2f9a0 67 65 0a 20 20 20 20 20 20 2a 2a 20 62 65 69 6e  ge.      ** bein
2f9b0 67 20 66 72 65 65 64 20 61 73 20 61 20 6e 65 77  g freed as a new
2f9c0 20 6c 65 61 66 2e 0a 20 20 20 20 20 20 2a 2a 0a   leaf..      **.
2f9d0 20 20 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68        ** Note th
2f9e0 61 74 20 74 68 65 20 74 72 75 6e 6b 20 70 61 67  at the trunk pag
2f9f0 65 20 69 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20  e is not really 
2fa00 66 75 6c 6c 20 75 6e 74 69 6c 20 69 74 20 63 6f  full until it co
2fa10 6e 74 61 69 6e 73 0a 20 20 20 20 20 20 2a 2a 20  ntains.      ** 
2fa20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 32  usableSize/4 - 2
2fa30 20 65 6e 74 72 69 65 73 2c 20 6e 6f 74 20 75 73   entries, not us
2fa40 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20 65  ableSize/4 - 8 e
2fa50 6e 74 72 69 65 73 20 61 73 20 77 65 20 68 61 76  ntries as we hav
2fa60 65 0a 20 20 20 20 20 20 2a 2a 20 63 6f 64 65 64  e.      ** coded
2fa70 2e 20 20 42 75 74 20 64 75 65 20 74 6f 20 61 20  .  But due to a 
2fa80 63 6f 64 69 6e 67 20 65 72 72 6f 72 20 69 6e 20  coding error in 
2fa90 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69  versions of SQLi
2faa0 74 65 20 70 72 69 6f 72 20 74 6f 0a 20 20 20 20  te prior to.    
2fab0 20 20 2a 2a 20 33 2e 36 2e 30 2c 20 64 61 74 61    ** 3.6.0, data
2fac0 62 61 73 65 73 20 77 69 74 68 20 66 72 65 65 6c  bases with freel
2fad0 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 73 20  ist trunk pages 
2fae0 68 6f 6c 64 69 6e 67 20 6d 6f 72 65 20 74 68 61  holding more tha
2faf0 6e 0a 20 20 20 20 20 20 2a 2a 20 75 73 61 62 6c  n.      ** usabl
2fb00 65 53 69 7a 65 2f 34 20 2d 20 38 20 65 6e 74 72  eSize/4 - 8 entr
2fb10 69 65 73 20 77 69 6c 6c 20 62 65 20 72 65 70 6f  ies will be repo
2fb20 72 74 65 64 20 61 73 20 63 6f 72 72 75 70 74 2e  rted as corrupt.
2fb30 20 20 49 6e 20 6f 72 64 65 72 0a 20 20 20 20 20    In order.     
2fb40 20 2a 2a 20 74 6f 20 6d 61 69 6e 74 61 69 6e 20   ** to maintain 
2fb50 62 61 63 6b 77 61 72 64 73 20 63 6f 6d 70 61 74  backwards compat
2fb60 69 62 69 6c 69 74 79 20 77 69 74 68 20 6f 6c 64  ibility with old
2fb70 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53  er versions of S
2fb80 51 4c 69 74 65 2c 0a 20 20 20 20 20 20 2a 2a 20  QLite,.      ** 
2fb90 77 65 20 77 69 6c 6c 20 63 6f 6e 74 69 6e 75 65  we will continue
2fba0 20 74 6f 20 72 65 73 74 72 69 63 74 20 74 68 65   to restrict the
2fbb0 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69   number of entri
2fbc0 65 73 20 74 6f 20 75 73 61 62 6c 65 53 69 7a 65  es to usableSize
2fbd0 2f 34 20 2d 20 38 0a 20 20 20 20 20 20 2a 2a 20  /4 - 8.      ** 
2fbe0 66 6f 72 20 6e 6f 77 2e 20 20 41 74 20 73 6f 6d  for now.  At som
2fbf0 65 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 66  e point in the f
2fc00 75 74 75 72 65 20 28 6f 6e 63 65 20 65 76 65 72  uture (once ever
2fc10 79 6f 6e 65 20 68 61 73 20 75 70 67 72 61 64 65  yone has upgrade
2fc20 64 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 33 2e  d.      ** to 3.
2fc30 36 2e 30 20 6f 72 20 6c 61 74 65 72 29 20 77 65  6.0 or later) we
2fc40 20 73 68 6f 75 6c 64 20 63 6f 6e 73 69 64 65 72   should consider
2fc50 20 66 69 78 69 6e 67 20 74 68 65 20 63 6f 6e 64   fixing the cond
2fc60 69 74 69 6f 6e 61 6c 20 61 62 6f 76 65 0a 20 20  itional above.  
2fc70 20 20 20 20 2a 2a 20 74 6f 20 72 65 61 64 20 22      ** to read "
2fc80 75 73 61 62 6c 65 53 69 7a 65 2f 34 2d 32 22 20  usableSize/4-2" 
2fc90 69 6e 73 74 65 61 64 20 6f 66 20 22 75 73 61 62  instead of "usab
2fca0 6c 65 53 69 7a 65 2f 34 2d 38 22 2e 0a 20 20 20  leSize/4-8"..   
2fcb0 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 45     **.      ** E
2fcc0 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 39  VIDENCE-OF: R-19
2fcd0 39 32 30 2d 31 31 35 37 36 20 48 6f 77 65 76 65  920-11576 Howeve
2fce0 72 2c 20 6e 65 77 65 72 20 76 65 72 73 69 6f 6e  r, newer version
2fcf0 73 20 6f 66 20 53 51 4c 69 74 65 20 73 74 69 6c  s of SQLite stil
2fd00 6c 0a 20 20 20 20 20 20 2a 2a 20 61 76 6f 69 64  l.      ** avoid
2fd10 20 75 73 69 6e 67 20 74 68 65 20 6c 61 73 74 20   using the last 
2fd20 73 69 78 20 65 6e 74 72 69 65 73 20 69 6e 20 74  six entries in t
2fd30 68 65 20 66 72 65 65 6c 69 73 74 20 74 72 75 6e  he freelist trun
2fd40 6b 20 70 61 67 65 20 61 72 72 61 79 20 69 6e 0a  k page array in.
2fd50 20 20 20 20 20 20 2a 2a 20 6f 72 64 65 72 20 74        ** order t
2fd60 68 61 74 20 64 61 74 61 62 61 73 65 20 66 69 6c  hat database fil
2fd70 65 73 20 63 72 65 61 74 65 64 20 62 79 20 6e 65  es created by ne
2fd80 77 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  wer versions of 
2fd90 53 51 4c 69 74 65 20 63 61 6e 20 62 65 0a 20 20  SQLite can be.  
2fda0 20 20 20 20 2a 2a 20 72 65 61 64 20 62 79 20 6f      ** read by o
2fdb0 6c 64 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66  lder versions of
2fdc0 20 53 51 4c 69 74 65 2e 0a 20 20 20 20 20 20 2a   SQLite..      *
2fdd0 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  /.      rc = sql
2fde0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
2fdf0 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b  Trunk->pDbPage);
2fe00 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
2fe10 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2fe20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 54      put4byte(&pT
2fe30 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c 20  runk->aData[4], 
2fe40 6e 4c 65 61 66 2b 31 29 3b 0a 20 20 20 20 20 20  nLeaf+1);.      
2fe50 20 20 70 75 74 34 62 79 74 65 28 26 70 54 72 75    put4byte(&pTru
2fe60 6e 6b 2d 3e 61 44 61 74 61 5b 38 2b 6e 4c 65 61  nk->aData[8+nLea
2fe70 66 2a 34 5d 2c 20 69 50 61 67 65 29 3b 0a 20 20  f*4], iPage);.  
2fe80 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 20        if( pPage 
2fe90 26 26 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67  && (pBt->btsFlag
2fea0 73 20 26 20 42 54 53 5f 53 45 43 55 52 45 5f 44  s & BTS_SECURE_D
2feb0 45 4c 45 54 45 29 3d 3d 30 20 29 7b 0a 20 20 20  ELETE)==0 ){.   
2fec0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61         sqlite3Pa
2fed0 67 65 72 44 6f 6e 74 57 72 69 74 65 28 70 50 61  gerDontWrite(pPa
2fee0 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  ge->pDbPage);.  
2fef0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2ff00 72 63 20 3d 20 62 74 72 65 65 53 65 74 48 61 73  rc = btreeSetHas
2ff10 43 6f 6e 74 65 6e 74 28 70 42 74 2c 20 69 50 61  Content(pBt, iPa
2ff20 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ge);.      }.   
2ff30 20 20 20 54 52 41 43 45 28 28 22 46 52 45 45 2d     TRACE(("FREE-
2ff40 50 41 47 45 3a 20 25 64 20 6c 65 61 66 20 6f 6e  PAGE: %d leaf on
2ff50 20 74 72 75 6e 6b 20 70 61 67 65 20 25 64 5c 6e   trunk page %d\n
2ff60 22 2c 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 70 54  ",pPage->pgno,pT
2ff70 72 75 6e 6b 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20  runk->pgno));.  
2ff80 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67      goto freepag
2ff90 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 7d  e_out;.    }.  }
2ffa0 0a 0a 20 20 2f 2a 20 49 66 20 63 6f 6e 74 72 6f  ..  /* If contro
2ffb0 6c 20 66 6c 6f 77 73 20 74 6f 20 74 68 69 73 20  l flows to this 
2ffc0 70 6f 69 6e 74 2c 20 74 68 65 6e 20 69 74 20 77  point, then it w
2ffd0 61 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20  as not possible 
2ffe0 74 6f 20 61 64 64 20 74 68 65 0a 20 20 2a 2a 20  to add the.  ** 
2fff0 74 68 65 20 70 61 67 65 20 62 65 69 6e 67 20 66  the page being f
30000 72 65 65 64 20 61 73 20 61 20 6c 65 61 66 20 70  reed as a leaf p
30010 61 67 65 20 6f 66 20 74 68 65 20 66 69 72 73 74  age of the first
30020 20 74 72 75 6e 6b 20 69 6e 20 74 68 65 20 66 72   trunk in the fr
30030 65 65 2d 6c 69 73 74 2e 0a 20 20 2a 2a 20 50 6f  ee-list..  ** Po
30040 73 73 69 62 6c 79 20 62 65 63 61 75 73 65 20 74  ssibly because t
30050 68 65 20 66 72 65 65 2d 6c 69 73 74 20 69 73 20  he free-list is 
30060 65 6d 70 74 79 2c 20 6f 72 20 70 6f 73 73 69 62  empty, or possib
30070 6c 79 20 62 65 63 61 75 73 65 20 74 68 65 20 0a  ly because the .
30080 20 20 2a 2a 20 66 69 72 73 74 20 74 72 75 6e 6b    ** first trunk
30090 20 69 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73   in the free-lis
300a0 74 20 69 73 20 66 75 6c 6c 2e 20 45 69 74 68 65  t is full. Eithe
300b0 72 20 77 61 79 2c 20 74 68 65 20 70 61 67 65 20  r way, the page 
300c0 62 65 69 6e 67 20 66 72 65 65 64 0a 20 20 2a 2a  being freed.  **
300d0 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65   will become the
300e0 20 6e 65 77 20 66 69 72 73 74 20 74 72 75 6e 6b   new first trunk
300f0 20 70 61 67 65 20 69 6e 20 74 68 65 20 66 72 65   page in the fre
30100 65 2d 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 69  e-list..  */.  i
30110 66 28 20 70 50 61 67 65 3d 3d 30 20 26 26 20 53  f( pPage==0 && S
30120 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20  QLITE_OK!=(rc = 
30130 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  btreeGetPage(pBt
30140 2c 20 69 50 61 67 65 2c 20 26 70 50 61 67 65 2c  , iPage, &pPage,
30150 20 30 29 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f   0)) ){.    goto
30160 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20   freepage_out;. 
30170 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65   }.  rc = sqlite
30180 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67  3PagerWrite(pPag
30190 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 69  e->pDbPage);.  i
301a0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
301b0 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 66 72 65   ){.    goto fre
301c0 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20  epage_out;.  }. 
301d0 20 70 75 74 34 62 79 74 65 28 70 50 61 67 65 2d   put4byte(pPage-
301e0 3e 61 44 61 74 61 2c 20 69 54 72 75 6e 6b 29 3b  >aData, iTrunk);
301f0 0a 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61  .  put4byte(&pPa
30200 67 65 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 30 29  ge->aData[4], 0)
30210 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 70 50  ;.  put4byte(&pP
30220 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c  age1->aData[32],
30230 20 69 50 61 67 65 29 3b 0a 20 20 54 52 41 43 45   iPage);.  TRACE
30240 28 28 22 46 52 45 45 2d 50 41 47 45 3a 20 25 64  (("FREE-PAGE: %d
30250 20 6e 65 77 20 74 72 75 6e 6b 20 70 61 67 65 20   new trunk page 
30260 72 65 70 6c 61 63 69 6e 67 20 25 64 5c 6e 22 2c  replacing %d\n",
30270 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 69 54   pPage->pgno, iT
30280 72 75 6e 6b 29 29 3b 0a 0a 66 72 65 65 70 61 67  runk));..freepag
30290 65 5f 6f 75 74 3a 0a 20 20 69 66 28 20 70 50 61  e_out:.  if( pPa
302a0 67 65 20 29 7b 0a 20 20 20 20 70 50 61 67 65 2d  ge ){.    pPage-
302b0 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 7d  >isInit = 0;.  }
302c0 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70  .  releasePage(p
302d0 50 61 67 65 29 3b 0a 20 20 72 65 6c 65 61 73 65  Page);.  release
302e0 50 61 67 65 28 70 54 72 75 6e 6b 29 3b 0a 20 20  Page(pTrunk);.  
302f0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 73 74 61  return rc;.}.sta
30300 74 69 63 20 76 6f 69 64 20 66 72 65 65 50 61 67  tic void freePag
30310 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  e(MemPage *pPage
30320 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20 69  , int *pRC){.  i
30330 66 28 20 28 2a 70 52 43 29 3d 3d 53 51 4c 49 54  f( (*pRC)==SQLIT
30340 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52 43  E_OK ){.    *pRC
30350 20 3d 20 66 72 65 65 50 61 67 65 32 28 70 50 61   = freePage2(pPa
30360 67 65 2d 3e 70 42 74 2c 20 70 50 61 67 65 2c 20  ge->pBt, pPage, 
30370 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20  pPage->pgno);.  
30380 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20  }.}../*.** Free 
30390 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  any overflow pag
303a0 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  es associated wi
303b0 74 68 20 74 68 65 20 67 69 76 65 6e 20 43 65 6c  th the given Cel
303c0 6c 2e 20 20 57 72 69 74 65 20 74 68 65 0a 2a 2a  l.  Write the.**
303d0 20 6c 6f 63 61 6c 20 43 65 6c 6c 20 73 69 7a 65   local Cell size
303e0 20 28 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20   (the number of 
303f0 62 79 74 65 73 20 6f 6e 20 74 68 65 20 6f 72 69  bytes on the ori
30400 67 69 6e 61 6c 20 70 61 67 65 2c 20 6f 6d 69 74  ginal page, omit
30410 74 69 6e 67 0a 2a 2a 20 6f 76 65 72 66 6c 6f 77  ting.** overflow
30420 29 20 69 6e 74 6f 20 2a 70 6e 53 69 7a 65 2e 0a  ) into *pnSize..
30430 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6c  */.static int cl
30440 65 61 72 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61  earCell(.  MemPa
30450 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20  ge *pPage,      
30460 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20      /* The page 
30470 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68  that contains th
30480 65 20 43 65 6c 6c 20 2a 2f 0a 20 20 75 6e 73 69  e Cell */.  unsi
30490 67 6e 65 64 20 63 68 61 72 20 2a 70 43 65 6c 6c  gned char *pCell
304a0 2c 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79  ,    /* First by
304b0 74 65 20 6f 66 20 74 68 65 20 43 65 6c 6c 20 2a  te of the Cell *
304c0 2f 0a 20 20 75 31 36 20 2a 70 6e 53 69 7a 65 20  /.  u16 *pnSize 
304d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
304e0 57 72 69 74 65 20 74 68 65 20 73 69 7a 65 20 6f  Write the size o
304f0 66 20 74 68 65 20 43 65 6c 6c 20 68 65 72 65 20  f the Cell here 
30500 2a 2f 0a 29 7b 0a 20 20 42 74 53 68 61 72 65 64  */.){.  BtShared
30510 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70   *pBt = pPage->p
30520 42 74 3b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69  Bt;.  CellInfo i
30530 6e 66 6f 3b 0a 20 20 50 67 6e 6f 20 6f 76 66 6c  nfo;.  Pgno ovfl
30540 50 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  Pgno;.  int rc;.
30550 20 20 69 6e 74 20 6e 4f 76 66 6c 3b 0a 20 20 75    int nOvfl;.  u
30560 33 32 20 6f 76 66 6c 50 61 67 65 53 69 7a 65 3b  32 ovflPageSize;
30570 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
30580 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
30590 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
305a0 29 20 29 3b 0a 20 20 62 74 72 65 65 50 61 72 73  ) );.  btreePars
305b0 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20  eCellPtr(pPage, 
305c0 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20  pCell, &info);. 
305d0 20 2a 70 6e 53 69 7a 65 20 3d 20 69 6e 66 6f 2e   *pnSize = info.
305e0 6e 53 69 7a 65 3b 0a 20 20 69 66 28 20 69 6e 66  nSize;.  if( inf
305f0 6f 2e 69 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29  o.iOverflow==0 )
30600 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
30610 49 54 45 5f 4f 4b 3b 20 20 2f 2a 20 4e 6f 20 6f  ITE_OK;  /* No o
30620 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 52  verflow pages. R
30630 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20 64 6f  eturn without do
30640 69 6e 67 20 61 6e 79 74 68 69 6e 67 20 2a 2f 0a  ing anything */.
30650 20 20 7d 0a 20 20 69 66 28 20 70 43 65 6c 6c 2b    }.  if( pCell+
30660 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 2b 33  info.iOverflow+3
30670 20 3e 20 70 50 61 67 65 2d 3e 61 44 61 74 61 2b   > pPage->aData+
30680 70 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65 20  pPage->maskPage 
30690 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
306a0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
306b0 54 3b 20 20 2f 2a 20 43 65 6c 6c 20 65 78 74 65  T;  /* Cell exte
306c0 6e 64 73 20 70 61 73 74 20 65 6e 64 20 6f 66 20  nds past end of 
306d0 70 61 67 65 20 2a 2f 0a 20 20 7d 0a 20 20 6f 76  page */.  }.  ov
306e0 66 6c 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74  flPgno = get4byt
306f0 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f  e(&pCell[info.iO
30700 76 65 72 66 6c 6f 77 5d 29 3b 0a 20 20 61 73 73  verflow]);.  ass
30710 65 72 74 28 20 70 42 74 2d 3e 75 73 61 62 6c 65  ert( pBt->usable
30720 53 69 7a 65 20 3e 20 34 20 29 3b 0a 20 20 6f 76  Size > 4 );.  ov
30730 66 6c 50 61 67 65 53 69 7a 65 20 3d 20 70 42 74  flPageSize = pBt
30740 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34  ->usableSize - 4
30750 3b 0a 20 20 6e 4f 76 66 6c 20 3d 20 28 69 6e 66  ;.  nOvfl = (inf
30760 6f 2e 6e 50 61 79 6c 6f 61 64 20 2d 20 69 6e 66  o.nPayload - inf
30770 6f 2e 6e 4c 6f 63 61 6c 20 2b 20 6f 76 66 6c 50  o.nLocal + ovflP
30780 61 67 65 53 69 7a 65 20 2d 20 31 29 2f 6f 76 66  ageSize - 1)/ovf
30790 6c 50 61 67 65 53 69 7a 65 3b 0a 20 20 61 73 73  lPageSize;.  ass
307a0 65 72 74 28 20 6f 76 66 6c 50 67 6e 6f 3d 3d 30  ert( ovflPgno==0
307b0 20 7c 7c 20 6e 4f 76 66 6c 3e 30 20 29 3b 0a 20   || nOvfl>0 );. 
307c0 20 77 68 69 6c 65 28 20 6e 4f 76 66 6c 2d 2d 20   while( nOvfl-- 
307d0 29 7b 0a 20 20 20 20 50 67 6e 6f 20 69 4e 65 78  ){.    Pgno iNex
307e0 74 20 3d 20 30 3b 0a 20 20 20 20 4d 65 6d 50 61  t = 0;.    MemPa
307f0 67 65 20 2a 70 4f 76 66 6c 20 3d 20 30 3b 0a 20  ge *pOvfl = 0;. 
30800 20 20 20 69 66 28 20 6f 76 66 6c 50 67 6e 6f 3c     if( ovflPgno<
30810 32 20 7c 7c 20 6f 76 66 6c 50 67 6e 6f 3e 62 74  2 || ovflPgno>bt
30820 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74  reePagecount(pBt
30830 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 30 20  ) ){.      /* 0 
30840 69 73 20 6e 6f 74 20 61 20 6c 65 67 61 6c 20 70  is not a legal p
30850 61 67 65 20 6e 75 6d 62 65 72 20 61 6e 64 20 70  age number and p
30860 61 67 65 20 31 20 63 61 6e 6e 6f 74 20 62 65 20  age 1 cannot be 
30870 61 6e 20 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65  an .      ** ove
30880 72 66 6c 6f 77 20 70 61 67 65 2e 20 54 68 65 72  rflow page. Ther
30890 65 66 6f 72 65 20 69 66 20 6f 76 66 6c 50 67 6e  efore if ovflPgn
308a0 6f 3c 32 20 6f 72 20 70 61 73 74 20 74 68 65 20  o<2 or past the 
308b0 65 6e 64 20 6f 66 20 74 68 65 20 0a 20 20 20 20  end of the .    
308c0 20 20 2a 2a 20 66 69 6c 65 20 74 68 65 20 64 61    ** file the da
308d0 74 61 62 61 73 65 20 6d 75 73 74 20 62 65 20 63  tabase must be c
308e0 6f 72 72 75 70 74 2e 20 2a 2f 0a 20 20 20 20 20  orrupt. */.     
308f0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
30900 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
30910 20 7d 0a 20 20 20 20 69 66 28 20 6e 4f 76 66 6c   }.    if( nOvfl
30920 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 67   ){.      rc = g
30930 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 70  etOverflowPage(p
30940 42 74 2c 20 6f 76 66 6c 50 67 6e 6f 2c 20 26 70  Bt, ovflPgno, &p
30950 4f 76 66 6c 2c 20 26 69 4e 65 78 74 29 3b 0a 20  Ovfl, &iNext);. 
30960 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65       if( rc ) re
30970 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a  turn rc;.    }..
30980 20 20 20 20 69 66 28 20 28 20 70 4f 76 66 6c 20      if( ( pOvfl 
30990 7c 7c 20 28 28 70 4f 76 66 6c 20 3d 20 62 74 72  || ((pOvfl = btr
309a0 65 65 50 61 67 65 4c 6f 6f 6b 75 70 28 70 42 74  eePageLookup(pBt
309b0 2c 20 6f 76 66 6c 50 67 6e 6f 29 29 21 3d 30 29  , ovflPgno))!=0)
309c0 20 29 0a 20 20 20 20 20 26 26 20 73 71 6c 69 74   ).     && sqlit
309d0 65 33 50 61 67 65 72 50 61 67 65 52 65 66 63 6f  e3PagerPageRefco
309e0 75 6e 74 28 70 4f 76 66 6c 2d 3e 70 44 62 50 61  unt(pOvfl->pDbPa
309f0 67 65 29 21 3d 31 0a 20 20 20 20 29 7b 0a 20 20  ge)!=1.    ){.  
30a00 20 20 20 20 2f 2a 20 54 68 65 72 65 20 69 73 20      /* There is 
30a10 6e 6f 20 72 65 61 73 6f 6e 20 61 6e 79 20 63 75  no reason any cu
30a20 72 73 6f 72 20 73 68 6f 75 6c 64 20 68 61 76 65  rsor should have
30a30 20 61 6e 20 6f 75 74 73 74 61 6e 64 69 6e 67 20   an outstanding 
30a40 72 65 66 65 72 65 6e 63 65 20 0a 20 20 20 20 20  reference .     
30a50 20 2a 2a 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c   ** to an overfl
30a60 6f 77 20 70 61 67 65 20 62 65 6c 6f 6e 67 69 6e  ow page belongin
30a70 67 20 74 6f 20 61 20 63 65 6c 6c 20 74 68 61 74  g to a cell that
30a80 20 69 73 20 62 65 69 6e 67 20 64 65 6c 65 74 65   is being delete
30a90 64 2f 75 70 64 61 74 65 64 2e 0a 20 20 20 20 20  d/updated..     
30aa0 20 2a 2a 20 53 6f 20 69 66 20 74 68 65 72 65 20   ** So if there 
30ab0 65 78 69 73 74 73 20 6d 6f 72 65 20 74 68 61 6e  exists more than
30ac0 20 6f 6e 65 20 72 65 66 65 72 65 6e 63 65 20 74   one reference t
30ad0 6f 20 74 68 69 73 20 70 61 67 65 2c 20 74 68 65  o this page, the
30ae0 6e 20 69 74 20 0a 20 20 20 20 20 20 2a 2a 20 6d  n it .      ** m
30af0 75 73 74 20 6e 6f 74 20 72 65 61 6c 6c 79 20 62  ust not really b
30b00 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  e an overflow pa
30b10 67 65 20 61 6e 64 20 74 68 65 20 64 61 74 61 62  ge and the datab
30b20 61 73 65 20 6d 75 73 74 20 62 65 20 63 6f 72 72  ase must be corr
30b30 75 70 74 2e 20 0a 20 20 20 20 20 20 2a 2a 20 49  upt. .      ** I
30b40 74 20 69 73 20 68 65 6c 70 66 75 6c 20 74 6f 20  t is helpful to 
30b50 64 65 74 65 63 74 20 74 68 69 73 20 62 65 66 6f  detect this befo
30b60 72 65 20 63 61 6c 6c 69 6e 67 20 66 72 65 65 50  re calling freeP
30b70 61 67 65 32 28 29 2c 20 61 73 20 0a 20 20 20 20  age2(), as .    
30b80 20 20 2a 2a 20 66 72 65 65 50 61 67 65 32 28 29    ** freePage2()
30b90 20 6d 61 79 20 7a 65 72 6f 20 74 68 65 20 70 61   may zero the pa
30ba0 67 65 20 63 6f 6e 74 65 6e 74 73 20 69 66 20 73  ge contents if s
30bb0 65 63 75 72 65 2d 64 65 6c 65 74 65 20 6d 6f 64  ecure-delete mod
30bc0 65 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 65 6e  e is.      ** en
30bd0 61 62 6c 65 64 2e 20 49 66 20 74 68 69 73 20 27  abled. If this '
30be0 6f 76 65 72 66 6c 6f 77 27 20 70 61 67 65 20 68  overflow' page h
30bf0 61 70 70 65 6e 73 20 74 6f 20 62 65 20 61 20 70  appens to be a p
30c00 61 67 65 20 74 68 61 74 20 74 68 65 0a 20 20 20  age that the.   
30c10 20 20 20 2a 2a 20 63 61 6c 6c 65 72 20 69 73 20     ** caller is 
30c20 69 74 65 72 61 74 69 6e 67 20 74 68 72 6f 75 67  iterating throug
30c30 68 20 6f 72 20 75 73 69 6e 67 20 69 6e 20 73 6f  h or using in so
30c40 6d 65 20 6f 74 68 65 72 20 77 61 79 2c 20 74 68  me other way, th
30c50 69 73 0a 20 20 20 20 20 20 2a 2a 20 63 61 6e 20  is.      ** can 
30c60 62 65 20 70 72 6f 62 6c 65 6d 61 74 69 63 2e 0a  be problematic..
30c70 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72        */.      r
30c80 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
30c90 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 65 6c  PT_BKPT;.    }el
30ca0 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 66  se{.      rc = f
30cb0 72 65 65 50 61 67 65 32 28 70 42 74 2c 20 70 4f  reePage2(pBt, pO
30cc0 76 66 6c 2c 20 6f 76 66 6c 50 67 6e 6f 29 3b 0a  vfl, ovflPgno);.
30cd0 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70      }..    if( p
30ce0 4f 76 66 6c 20 29 7b 0a 20 20 20 20 20 20 73 71  Ovfl ){.      sq
30cf0 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
30d00 70 4f 76 66 6c 2d 3e 70 44 62 50 61 67 65 29 3b  pOvfl->pDbPage);
30d10 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
30d20 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
30d30 20 20 20 6f 76 66 6c 50 67 6e 6f 20 3d 20 69 4e     ovflPgno = iN
30d40 65 78 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ext;.  }.  retur
30d50 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
30d60 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 74 68 65  /*.** Create the
30d70 20 62 79 74 65 20 73 65 71 75 65 6e 63 65 20 75   byte sequence u
30d80 73 65 64 20 74 6f 20 72 65 70 72 65 73 65 6e 74  sed to represent
30d90 20 61 20 63 65 6c 6c 20 6f 6e 20 70 61 67 65 20   a cell on page 
30da0 70 50 61 67 65 0a 2a 2a 20 61 6e 64 20 77 72 69  pPage.** and wri
30db0 74 65 20 74 68 61 74 20 62 79 74 65 20 73 65 71  te that byte seq
30dc0 75 65 6e 63 65 20 69 6e 74 6f 20 70 43 65 6c 6c  uence into pCell
30dd0 5b 5d 2e 20 20 4f 76 65 72 66 6c 6f 77 20 70 61  [].  Overflow pa
30de0 67 65 73 20 61 72 65 0a 2a 2a 20 61 6c 6c 6f 63  ges are.** alloc
30df0 61 74 65 64 20 61 6e 64 20 66 69 6c 6c 65 64 20  ated and filled 
30e00 69 6e 20 61 73 20 6e 65 63 65 73 73 61 72 79 2e  in as necessary.
30e10 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 70 72    The calling pr
30e20 6f 63 65 64 75 72 65 0a 2a 2a 20 69 73 20 72 65  ocedure.** is re
30e30 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 6d 61  sponsible for ma
30e40 6b 69 6e 67 20 73 75 72 65 20 73 75 66 66 69 63  king sure suffic
30e50 69 65 6e 74 20 73 70 61 63 65 20 68 61 73 20 62  ient space has b
30e60 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a  een allocated.**
30e70 20 66 6f 72 20 70 43 65 6c 6c 5b 5d 2e 0a 2a 2a   for pCell[]..**
30e80 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 70 43  .** Note that pC
30e90 65 6c 6c 20 64 6f 65 73 20 6e 6f 74 20 6e 65 63  ell does not nec
30ea0 65 73 73 61 72 79 20 6e 65 65 64 20 74 6f 20 70  essary need to p
30eb0 6f 69 6e 74 20 74 6f 20 74 68 65 20 70 50 61 67  oint to the pPag
30ec0 65 2d 3e 61 44 61 74 61 0a 2a 2a 20 61 72 65 61  e->aData.** area
30ed0 2e 20 20 70 43 65 6c 6c 20 6d 69 67 68 74 20 70  .  pCell might p
30ee0 6f 69 6e 74 20 74 6f 20 73 6f 6d 65 20 74 65 6d  oint to some tem
30ef0 70 6f 72 61 72 79 20 73 74 6f 72 61 67 65 2e 20  porary storage. 
30f00 20 54 68 65 20 63 65 6c 6c 20 77 69 6c 6c 0a 2a   The cell will.*
30f10 2a 20 62 65 20 63 6f 6e 73 74 72 75 63 74 65 64  * be constructed
30f20 20 69 6e 20 74 68 69 73 20 74 65 6d 70 6f 72 61   in this tempora
30f30 72 79 20 61 72 65 61 20 74 68 65 6e 20 63 6f 70  ry area then cop
30f40 69 65 64 20 69 6e 74 6f 20 70 50 61 67 65 2d 3e  ied into pPage->
30f50 61 44 61 74 61 0a 2a 2a 20 6c 61 74 65 72 2e 0a  aData.** later..
30f60 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69  */.static int fi
30f70 6c 6c 49 6e 43 65 6c 6c 28 0a 20 20 4d 65 6d 50  llInCell(.  MemP
30f80 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20  age *pPage,     
30f90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
30fa0 65 20 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74  e page that cont
30fb0 61 69 6e 73 20 74 68 65 20 63 65 6c 6c 20 2a 2f  ains the cell */
30fc0 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
30fd0 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20   *pCell,        
30fe0 20 20 2f 2a 20 43 6f 6d 70 6c 65 74 65 20 74 65    /* Complete te
30ff0 78 74 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 2a  xt of the cell *
31000 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  /.  const void *
31010 70 4b 65 79 2c 20 69 36 34 20 6e 4b 65 79 2c 20  pKey, i64 nKey, 
31020 20 20 20 2f 2a 20 54 68 65 20 6b 65 79 20 2a 2f     /* The key */
31030 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  .  const void *p
31040 44 61 74 61 2c 69 6e 74 20 6e 44 61 74 61 2c 20  Data,int nData, 
31050 20 20 2f 2a 20 54 68 65 20 64 61 74 61 20 2a 2f    /* The data */
31060 0a 20 20 69 6e 74 20 6e 5a 65 72 6f 2c 20 20 20  .  int nZero,   
31070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31080 20 20 2f 2a 20 45 78 74 72 61 20 7a 65 72 6f 20    /* Extra zero 
31090 62 79 74 65 73 20 74 6f 20 61 70 70 65 6e 64 20  bytes to append 
310a0 74 6f 20 70 44 61 74 61 20 2a 2f 0a 20 20 69 6e  to pData */.  in
310b0 74 20 2a 70 6e 53 69 7a 65 20 20 20 20 20 20 20  t *pnSize       
310c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
310d0 57 72 69 74 65 20 63 65 6c 6c 20 73 69 7a 65 20  Write cell size 
310e0 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  here */.){.  int
310f0 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 63 6f 6e   nPayload;.  con
31100 73 74 20 75 38 20 2a 70 53 72 63 3b 0a 20 20 69  st u8 *pSrc;.  i
31110 6e 74 20 6e 53 72 63 2c 20 6e 2c 20 72 63 3b 0a  nt nSrc, n, rc;.
31120 20 20 69 6e 74 20 73 70 61 63 65 4c 65 66 74 3b    int spaceLeft;
31130 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f 76 66  .  MemPage *pOvf
31140 6c 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65  l = 0;.  MemPage
31150 20 2a 70 54 6f 52 65 6c 65 61 73 65 20 3d 20 30   *pToRelease = 0
31160 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ;.  unsigned cha
31170 72 20 2a 70 50 72 69 6f 72 3b 0a 20 20 75 6e 73  r *pPrior;.  uns
31180 69 67 6e 65 64 20 63 68 61 72 20 2a 70 50 61 79  igned char *pPay
31190 6c 6f 61 64 3b 0a 20 20 42 74 53 68 61 72 65 64  load;.  BtShared
311a0 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70   *pBt = pPage->p
311b0 42 74 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 4f  Bt;.  Pgno pgnoO
311c0 76 66 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e  vfl = 0;.  int n
311d0 48 65 61 64 65 72 3b 0a 0a 20 20 61 73 73 65 72  Header;..  asser
311e0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
311f0 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
31200 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f  ->mutex) );..  /
31210 2a 20 70 50 61 67 65 20 69 73 20 6e 6f 74 20 6e  * pPage is not n
31220 65 63 65 73 73 61 72 69 6c 79 20 77 72 69 74 65  ecessarily write
31230 61 62 6c 65 20 73 69 6e 63 65 20 70 43 65 6c 6c  able since pCell
31240 20 6d 69 67 68 74 20 62 65 20 61 75 78 69 6c 69   might be auxili
31250 61 72 79 0a 20 20 2a 2a 20 62 75 66 66 65 72 20  ary.  ** buffer 
31260 73 70 61 63 65 20 74 68 61 74 20 69 73 20 73 65  space that is se
31270 70 61 72 61 74 65 20 66 72 6f 6d 20 74 68 65 20  parate from the 
31280 70 50 61 67 65 20 62 75 66 66 65 72 20 61 72 65  pPage buffer are
31290 61 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  a */.  assert( p
312a0 43 65 6c 6c 3c 70 50 61 67 65 2d 3e 61 44 61 74  Cell<pPage->aDat
312b0 61 20 7c 7c 20 70 43 65 6c 6c 3e 3d 26 70 50 61  a || pCell>=&pPa
312c0 67 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e 70  ge->aData[pBt->p
312d0 61 67 65 53 69 7a 65 5d 0a 20 20 20 20 20 20 20  ageSize].       
312e0 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 50       || sqlite3P
312f0 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
31300 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
31310 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e  );..  /* Fill in
31320 20 74 68 65 20 68 65 61 64 65 72 2e 20 2a 2f 0a   the header. */.
31330 20 20 6e 48 65 61 64 65 72 20 3d 20 70 50 61 67    nHeader = pPag
31340 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b  e->childPtrSize;
31350 0a 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20 6e 44  .  nPayload = nD
31360 61 74 61 20 2b 20 6e 5a 65 72 6f 3b 0a 20 20 69  ata + nZero;.  i
31370 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  f( pPage->intKey
31380 4c 65 61 66 20 29 7b 0a 20 20 20 20 6e 48 65 61  Leaf ){.    nHea
31390 64 65 72 20 2b 3d 20 70 75 74 56 61 72 69 6e 74  der += putVarint
313a0 33 32 28 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65  32(&pCell[nHeade
313b0 72 5d 2c 20 6e 50 61 79 6c 6f 61 64 29 3b 0a 20  r], nPayload);. 
313c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
313d0 72 74 28 20 6e 44 61 74 61 3d 3d 30 20 29 3b 0a  rt( nData==0 );.
313e0 20 20 20 20 61 73 73 65 72 74 28 20 6e 5a 65 72      assert( nZer
313f0 6f 3d 3d 30 20 29 3b 0a 20 20 7d 0a 20 20 6e 48  o==0 );.  }.  nH
31400 65 61 64 65 72 20 2b 3d 20 70 75 74 56 61 72 69  eader += putVari
31410 6e 74 28 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65  nt(&pCell[nHeade
31420 72 5d 2c 20 2a 28 75 36 34 2a 29 26 6e 4b 65 79  r], *(u64*)&nKey
31430 29 3b 0a 20 20 0a 20 20 2f 2a 20 46 69 6c 6c 20  );.  .  /* Fill 
31440 69 6e 20 74 68 65 20 70 61 79 6c 6f 61 64 20 73  in the payload s
31450 69 7a 65 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  ize */.  if( pPa
31460 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20  ge->intKey ){.  
31470 20 20 70 53 72 63 20 3d 20 70 44 61 74 61 3b 0a    pSrc = pData;.
31480 20 20 20 20 6e 53 72 63 20 3d 20 6e 44 61 74 61      nSrc = nData
31490 3b 0a 20 20 20 20 6e 44 61 74 61 20 3d 20 30 3b  ;.    nData = 0;
314a0 0a 20 20 7d 65 6c 73 65 7b 20 0a 20 20 20 20 69  .  }else{ .    i
314b0 66 28 20 4e 45 56 45 52 28 6e 4b 65 79 3e 30 78  f( NEVER(nKey>0x
314c0 37 66 66 66 66 66 66 66 20 7c 7c 20 70 4b 65 79  7fffffff || pKey
314d0 3d 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 72 65  ==0) ){.      re
314e0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
314f0 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
31500 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20 28      nPayload = (
31510 69 6e 74 29 6e 4b 65 79 3b 0a 20 20 20 20 70 53  int)nKey;.    pS
31520 72 63 20 3d 20 70 4b 65 79 3b 0a 20 20 20 20 6e  rc = pKey;.    n
31530 53 72 63 20 3d 20 28 69 6e 74 29 6e 4b 65 79 3b  Src = (int)nKey;
31540 0a 20 20 7d 0a 20 20 69 66 28 20 6e 50 61 79 6c  .  }.  if( nPayl
31550 6f 61 64 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c  oad<=pPage->maxL
31560 6f 63 61 6c 20 29 7b 0a 20 20 20 20 6e 20 3d 20  ocal ){.    n = 
31570 6e 48 65 61 64 65 72 20 2b 20 6e 50 61 79 6c 6f  nHeader + nPaylo
31580 61 64 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  ad;.    testcase
31590 28 20 6e 3d 3d 33 20 29 3b 0a 20 20 20 20 74 65  ( n==3 );.    te
315a0 73 74 63 61 73 65 28 20 6e 3d 3d 34 20 29 3b 0a  stcase( n==4 );.
315b0 20 20 20 20 69 66 28 20 6e 3c 34 20 29 20 6e 20      if( n<4 ) n 
315c0 3d 20 34 3b 0a 20 20 20 20 2a 70 6e 53 69 7a 65  = 4;.    *pnSize
315d0 20 3d 20 6e 3b 0a 20 20 20 20 73 70 61 63 65 4c   = n;.    spaceL
315e0 65 66 74 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a  eft = nPayload;.
315f0 20 20 20 20 70 50 72 69 6f 72 20 3d 20 70 43 65      pPrior = pCe
31600 6c 6c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ll;.  }else{.   
31610 20 69 6e 74 20 6d 6e 20 3d 20 70 50 61 67 65 2d   int mn = pPage-
31620 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 6e  >minLocal;.    n
31630 20 3d 20 6d 6e 20 2b 20 28 6e 50 61 79 6c 6f 61   = mn + (nPayloa
31640 64 20 2d 20 6d 6e 29 20 25 20 28 70 50 61 67 65  d - mn) % (pPage
31650 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
31660 65 20 2d 20 34 29 3b 0a 20 20 20 20 74 65 73 74  e - 4);.    test
31670 63 61 73 65 28 20 6e 3d 3d 70 50 61 67 65 2d 3e  case( n==pPage->
31680 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 20 20  maxLocal );.    
31690 74 65 73 74 63 61 73 65 28 20 6e 3d 3d 70 50 61  testcase( n==pPa
316a0 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29  ge->maxLocal+1 )
316b0 3b 0a 20 20 20 20 69 66 28 20 6e 20 3e 20 70 50  ;.    if( n > pP
316c0 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 20  age->maxLocal ) 
316d0 6e 20 3d 20 6d 6e 3b 0a 20 20 20 20 73 70 61 63  n = mn;.    spac
316e0 65 4c 65 66 74 20 3d 20 6e 3b 0a 20 20 20 20 2a  eLeft = n;.    *
316f0 70 6e 53 69 7a 65 20 3d 20 6e 20 2b 20 6e 48 65  pnSize = n + nHe
31700 61 64 65 72 20 2b 20 34 3b 0a 20 20 20 20 70 50  ader + 4;.    pP
31710 72 69 6f 72 20 3d 20 26 70 43 65 6c 6c 5b 6e 48  rior = &pCell[nH
31720 65 61 64 65 72 2b 6e 5d 3b 0a 20 20 7d 0a 20 20  eader+n];.  }.  
31730 70 50 61 79 6c 6f 61 64 20 3d 20 26 70 43 65 6c  pPayload = &pCel
31740 6c 5b 6e 48 65 61 64 65 72 5d 3b 0a 0a 20 20 2f  l[nHeader];..  /
31750 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20  * At this point 
31760 76 61 72 69 61 62 6c 65 73 20 73 68 6f 75 6c 64  variables should
31770 20 62 65 20 73 65 74 20 61 73 20 66 6f 6c 6c 6f   be set as follo
31780 77 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  ws:.  **.  **   
31790 6e 50 61 79 6c 6f 61 64 20 20 20 20 20 20 20 20  nPayload        
317a0 20 20 20 54 6f 74 61 6c 20 70 61 79 6c 6f 61 64     Total payload
317b0 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73 0a 20   size in bytes. 
317c0 20 2a 2a 20 20 20 70 50 61 79 6c 6f 61 64 20 20   **   pPayload  
317d0 20 20 20 20 20 20 20 20 20 42 65 67 69 6e 20 77           Begin w
317e0 72 69 74 69 6e 67 20 70 61 79 6c 6f 61 64 20 68  riting payload h
317f0 65 72 65 0a 20 20 2a 2a 20 20 20 73 70 61 63 65  ere.  **   space
31800 4c 65 66 74 20 20 20 20 20 20 20 20 20 20 53 70  Left          Sp
31810 61 63 65 20 61 76 61 69 6c 61 62 6c 65 20 61 74  ace available at
31820 20 70 50 61 79 6c 6f 61 64 2e 20 20 49 66 20 6e   pPayload.  If n
31830 50 61 79 6c 6f 61 64 3e 73 70 61 63 65 4c 65 66  Payload>spaceLef
31840 74 2c 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20  t,.  **         
31850 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68 61               tha
31860 74 20 6d 65 61 6e 73 20 63 6f 6e 74 65 6e 74 20  t means content 
31870 6d 75 73 74 20 73 70 69 6c 6c 20 69 6e 74 6f 20  must spill into 
31880 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 0a  overflow pages..
31890 20 20 2a 2a 20 20 20 2a 70 6e 53 69 7a 65 20 20    **   *pnSize  
318a0 20 20 20 20 20 20 20 20 20 20 53 69 7a 65 20 6f            Size o
318b0 66 20 74 68 65 20 6c 6f 63 61 6c 20 63 65 6c 6c  f the local cell
318c0 20 28 6e 6f 74 20 63 6f 75 6e 74 69 6e 67 20 6f   (not counting o
318d0 76 65 72 66 6c 6f 77 20 70 61 67 65 73 29 0a 20  verflow pages). 
318e0 20 2a 2a 20 20 20 70 50 72 69 6f 72 20 20 20 20   **   pPrior    
318f0 20 20 20 20 20 20 20 20 20 57 68 65 72 65 20 74           Where t
31900 6f 20 77 72 69 74 65 20 74 68 65 20 70 67 6e 6f  o write the pgno
31910 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 6f 76   of the first ov
31920 65 72 66 6c 6f 77 20 70 61 67 65 0a 20 20 2a 2a  erflow page.  **
31930 0a 20 20 2a 2a 20 55 73 65 20 61 20 63 61 6c 6c  .  ** Use a call
31940 20 74 6f 20 62 74 72 65 65 50 61 72 73 65 43 65   to btreeParseCe
31950 6c 6c 50 74 72 28 29 20 74 6f 20 76 65 72 69 66  llPtr() to verif
31960 79 20 74 68 61 74 20 74 68 65 20 76 61 6c 75 65  y that the value
31970 73 20 61 62 6f 76 65 0a 20 20 2a 2a 20 77 65 72  s above.  ** wer
31980 65 20 63 6f 6d 70 75 74 65 64 20 63 6f 72 72 65  e computed corre
31990 63 74 6c 79 2e 0a 20 20 2a 2f 0a 23 69 66 20 53  ctly..  */.#if S
319a0 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 7b 0a  QLITE_DEBUG.  {.
319b0 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66      CellInfo inf
319c0 6f 3b 0a 20 20 20 20 62 74 72 65 65 50 61 72 73  o;.    btreePars
319d0 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20  eCellPtr(pPage, 
319e0 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20  pCell, &info);. 
319f0 20 20 20 61 73 73 65 72 74 28 20 6e 48 65 61 64     assert( nHead
31a00 65 72 3d 28 69 6e 74 29 28 69 6e 66 6f 2e 70 50  er=(int)(info.pP
31a10 61 79 6c 6f 61 64 20 2d 20 70 43 65 6c 6c 29 20  ayload - pCell) 
31a20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  );.    assert( i
31a30 6e 66 6f 2e 6e 4b 65 79 3d 3d 6e 4b 65 79 20 29  nfo.nKey==nKey )
31a40 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 2a 70  ;.    assert( *p
31a50 6e 53 69 7a 65 20 3d 3d 20 69 6e 66 6f 2e 6e 53  nSize == info.nS
31a60 69 7a 65 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ize );.    asser
31a70 74 28 20 73 70 61 63 65 4c 65 66 74 20 3d 3d 20  t( spaceLeft == 
31a80 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 3b 0a 20  info.nLocal );. 
31a90 20 20 20 61 73 73 65 72 74 28 20 70 50 72 69 6f     assert( pPrio
31aa0 72 20 3d 3d 20 26 70 43 65 6c 6c 5b 69 6e 66 6f  r == &pCell[info
31ab0 2e 69 4f 76 65 72 66 6c 6f 77 5d 20 29 3b 0a 20  .iOverflow] );. 
31ac0 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
31ad0 57 72 69 74 65 20 74 68 65 20 70 61 79 6c 6f 61  Write the payloa
31ae0 64 20 69 6e 74 6f 20 74 68 65 20 6c 6f 63 61 6c  d into the local
31af0 20 43 65 6c 6c 20 61 6e 64 20 61 6e 79 20 65 78   Cell and any ex
31b00 74 72 61 20 69 6e 74 6f 20 6f 76 65 72 66 6c 6f  tra into overflo
31b10 77 20 70 61 67 65 73 20 2a 2f 0a 20 20 77 68 69  w pages */.  whi
31b20 6c 65 28 20 6e 50 61 79 6c 6f 61 64 3e 30 20 29  le( nPayload>0 )
31b30 7b 0a 20 20 20 20 69 66 28 20 73 70 61 63 65 4c  {.    if( spaceL
31b40 65 66 74 3d 3d 30 20 29 7b 0a 23 69 66 6e 64 65  eft==0 ){.#ifnde
31b50 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
31b60 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 50  TOVACUUM.      P
31b70 67 6e 6f 20 70 67 6e 6f 50 74 72 6d 61 70 20 3d  gno pgnoPtrmap =
31b80 20 70 67 6e 6f 4f 76 66 6c 3b 20 2f 2a 20 4f 76   pgnoOvfl; /* Ov
31b90 65 72 66 6c 6f 77 20 70 61 67 65 20 70 6f 69 6e  erflow page poin
31ba0 74 65 72 2d 6d 61 70 20 65 6e 74 72 79 20 70 61  ter-map entry pa
31bb0 67 65 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  ge */.      if( 
31bc0 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
31bd0 29 7b 0a 20 20 20 20 20 20 20 20 64 6f 7b 0a 20  ){.        do{. 
31be0 20 20 20 20 20 20 20 20 20 70 67 6e 6f 4f 76 66           pgnoOvf
31bf0 6c 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 20 77  l++;.        } w
31c00 68 69 6c 65 28 20 0a 20 20 20 20 20 20 20 20 20  hile( .         
31c10 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70   PTRMAP_ISPAGE(p
31c20 42 74 2c 20 70 67 6e 6f 4f 76 66 6c 29 20 7c 7c  Bt, pgnoOvfl) ||
31c30 20 70 67 6e 6f 4f 76 66 6c 3d 3d 50 45 4e 44 49   pgnoOvfl==PENDI
31c40 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
31c50 29 20 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20  ) .        );.  
31c60 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
31c70 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65     rc = allocate
31c80 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26  BtreePage(pBt, &
31c90 70 4f 76 66 6c 2c 20 26 70 67 6e 6f 4f 76 66 6c  pOvfl, &pgnoOvfl
31ca0 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 30 29 3b 0a  , pgnoOvfl, 0);.
31cb0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
31cc0 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
31cd0 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64       /* If the d
31ce0 61 74 61 62 61 73 65 20 73 75 70 70 6f 72 74 73  atabase supports
31cf0 20 61 75 74 6f 2d 76 61 63 75 75 6d 2c 20 61 6e   auto-vacuum, an
31d00 64 20 74 68 65 20 73 65 63 6f 6e 64 20 6f 72 20  d the second or 
31d10 73 75 62 73 65 71 75 65 6e 74 0a 20 20 20 20 20  subsequent.     
31d20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   ** overflow pag
31d30 65 20 69 73 20 62 65 69 6e 67 20 61 6c 6c 6f 63  e is being alloc
31d40 61 74 65 64 2c 20 61 64 64 20 61 6e 20 65 6e 74  ated, add an ent
31d50 72 79 20 74 6f 20 74 68 65 20 70 6f 69 6e 74 65  ry to the pointe
31d60 72 2d 6d 61 70 0a 20 20 20 20 20 20 2a 2a 20 66  r-map.      ** f
31d70 6f 72 20 74 68 61 74 20 70 61 67 65 20 6e 6f 77  or that page now
31d80 2e 20 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  . .      **.    
31d90 20 20 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20    ** If this is 
31da0 74 68 65 20 66 69 72 73 74 20 6f 76 65 72 66 6c  the first overfl
31db0 6f 77 20 70 61 67 65 2c 20 74 68 65 6e 20 77 72  ow page, then wr
31dc0 69 74 65 20 61 20 70 61 72 74 69 61 6c 20 65 6e  ite a partial en
31dd0 74 72 79 20 0a 20 20 20 20 20 20 2a 2a 20 74 6f  try .      ** to
31de0 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70   the pointer-map
31df0 2e 20 49 66 20 77 65 20 77 72 69 74 65 20 6e 6f  . If we write no
31e00 74 68 69 6e 67 20 74 6f 20 74 68 69 73 20 70 6f  thing to this po
31e10 69 6e 74 65 72 2d 6d 61 70 20 73 6c 6f 74 2c 0a  inter-map slot,.
31e20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68        ** then th
31e30 65 20 6f 70 74 69 6d 69 73 74 69 63 20 6f 76 65  e optimistic ove
31e40 72 66 6c 6f 77 20 63 68 61 69 6e 20 70 72 6f 63  rflow chain proc
31e50 65 73 73 69 6e 67 20 69 6e 20 63 6c 65 61 72 43  essing in clearC
31e60 65 6c 6c 28 29 0a 20 20 20 20 20 20 2a 2a 20 6d  ell().      ** m
31e70 61 79 20 6d 69 73 69 6e 74 65 72 70 72 65 74 20  ay misinterpret 
31e80 74 68 65 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65  the uninitialize
31e90 64 20 76 61 6c 75 65 73 20 61 6e 64 20 64 65 6c  d values and del
31ea0 65 74 65 20 74 68 65 0a 20 20 20 20 20 20 2a 2a  ete the.      **
31eb0 20 77 72 6f 6e 67 20 70 61 67 65 73 20 66 72 6f   wrong pages fro
31ec0 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  m the database..
31ed0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
31ee0 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  f( pBt->autoVacu
31ef0 75 6d 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  um && rc==SQLITE
31f00 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 75  _OK ){.        u
31f10 38 20 65 54 79 70 65 20 3d 20 28 70 67 6e 6f 50  8 eType = (pgnoP
31f20 74 72 6d 61 70 3f 50 54 52 4d 41 50 5f 4f 56 45  trmap?PTRMAP_OVE
31f30 52 46 4c 4f 57 32 3a 50 54 52 4d 41 50 5f 4f 56  RFLOW2:PTRMAP_OV
31f40 45 52 46 4c 4f 57 31 29 3b 0a 20 20 20 20 20 20  ERFLOW1);.      
31f50 20 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c    ptrmapPut(pBt,
31f60 20 70 67 6e 6f 4f 76 66 6c 2c 20 65 54 79 70 65   pgnoOvfl, eType
31f70 2c 20 70 67 6e 6f 50 74 72 6d 61 70 2c 20 26 72  , pgnoPtrmap, &r
31f80 63 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  c);.        if( 
31f90 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rc ){.          
31fa0 72 65 6c 65 61 73 65 50 61 67 65 28 70 4f 76 66  releasePage(pOvf
31fb0 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  l);.        }.  
31fc0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
31fd0 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
31fe0 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
31ff0 28 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20  (pToRelease);.  
32000 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
32010 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
32020 2f 2a 20 49 66 20 70 54 6f 52 65 6c 65 61 73 65  /* If pToRelease
32030 20 69 73 20 6e 6f 74 20 7a 65 72 6f 20 74 68 61   is not zero tha
32040 6e 20 70 50 72 69 6f 72 20 70 6f 69 6e 74 73 20  n pPrior points 
32050 69 6e 74 6f 20 74 68 65 20 64 61 74 61 20 61 72  into the data ar
32060 65 61 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 70  ea.      ** of p
32070 54 6f 52 65 6c 65 61 73 65 2e 20 20 4d 61 6b 65  ToRelease.  Make
32080 20 73 75 72 65 20 70 54 6f 52 65 6c 65 61 73 65   sure pToRelease
32090 20 69 73 20 73 74 69 6c 6c 20 77 72 69 74 65 61   is still writea
320a0 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73  ble. */.      as
320b0 73 65 72 74 28 20 70 54 6f 52 65 6c 65 61 73 65  sert( pToRelease
320c0 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 50 61  ==0 || sqlite3Pa
320d0 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
320e0 54 6f 52 65 6c 65 61 73 65 2d 3e 70 44 62 50 61  ToRelease->pDbPa
320f0 67 65 29 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  ge) );..      /*
32100 20 49 66 20 70 50 72 69 6f 72 20 69 73 20 70 61   If pPrior is pa
32110 72 74 20 6f 66 20 74 68 65 20 64 61 74 61 20 61  rt of the data a
32120 72 65 61 20 6f 66 20 70 50 61 67 65 2c 20 74 68  rea of pPage, th
32130 65 6e 20 6d 61 6b 65 20 73 75 72 65 20 70 50 61  en make sure pPa
32140 67 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 73  ge.      ** is s
32150 74 69 6c 6c 20 77 72 69 74 65 61 62 6c 65 20 2a  till writeable *
32160 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
32170 70 50 72 69 6f 72 3c 70 50 61 67 65 2d 3e 61 44  pPrior<pPage->aD
32180 61 74 61 20 7c 7c 20 70 50 72 69 6f 72 3e 3d 26  ata || pPrior>=&
32190 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 42 74  pPage->aData[pBt
321a0 2d 3e 70 61 67 65 53 69 7a 65 5d 0a 20 20 20 20  ->pageSize].    
321b0 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74          || sqlit
321c0 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
321d0 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
321e0 65 29 20 29 3b 0a 0a 20 20 20 20 20 20 70 75 74  e) );..      put
321f0 34 62 79 74 65 28 70 50 72 69 6f 72 2c 20 70 67  4byte(pPrior, pg
32200 6e 6f 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20 72  noOvfl);.      r
32210 65 6c 65 61 73 65 50 61 67 65 28 70 54 6f 52 65  eleasePage(pToRe
32220 6c 65 61 73 65 29 3b 0a 20 20 20 20 20 20 70 54  lease);.      pT
32230 6f 52 65 6c 65 61 73 65 20 3d 20 70 4f 76 66 6c  oRelease = pOvfl
32240 3b 0a 20 20 20 20 20 20 70 50 72 69 6f 72 20 3d  ;.      pPrior =
32250 20 70 4f 76 66 6c 2d 3e 61 44 61 74 61 3b 0a 20   pOvfl->aData;. 
32260 20 20 20 20 20 70 75 74 34 62 79 74 65 28 70 50       put4byte(pP
32270 72 69 6f 72 2c 20 30 29 3b 0a 20 20 20 20 20 20  rior, 0);.      
32280 70 50 61 79 6c 6f 61 64 20 3d 20 26 70 4f 76 66  pPayload = &pOvf
32290 6c 2d 3e 61 44 61 74 61 5b 34 5d 3b 0a 20 20 20  l->aData[4];.   
322a0 20 20 20 73 70 61 63 65 4c 65 66 74 20 3d 20 70     spaceLeft = p
322b0 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d  Bt->usableSize -
322c0 20 34 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 20   4;.    }.    n 
322d0 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20  = nPayload;.    
322e0 69 66 28 20 6e 3e 73 70 61 63 65 4c 65 66 74 20  if( n>spaceLeft 
322f0 29 20 6e 20 3d 20 73 70 61 63 65 4c 65 66 74 3b  ) n = spaceLeft;
32300 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70 54 6f 52  ..    /* If pToR
32310 65 6c 65 61 73 65 20 69 73 20 6e 6f 74 20 7a 65  elease is not ze
32320 72 6f 20 74 68 61 6e 20 70 50 61 79 6c 6f 61 64  ro than pPayload
32330 20 70 6f 69 6e 74 73 20 69 6e 74 6f 20 74 68 65   points into the
32340 20 64 61 74 61 20 61 72 65 61 0a 20 20 20 20 2a   data area.    *
32350 2a 20 6f 66 20 70 54 6f 52 65 6c 65 61 73 65 2e  * of pToRelease.
32360 20 20 4d 61 6b 65 20 73 75 72 65 20 70 54 6f 52    Make sure pToR
32370 65 6c 65 61 73 65 20 69 73 20 73 74 69 6c 6c 20  elease is still 
32380 77 72 69 74 65 61 62 6c 65 2e 20 2a 2f 0a 20 20  writeable. */.  
32390 20 20 61 73 73 65 72 74 28 20 70 54 6f 52 65 6c    assert( pToRel
323a0 65 61 73 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74  ease==0 || sqlit
323b0 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
323c0 6c 65 28 70 54 6f 52 65 6c 65 61 73 65 2d 3e 70  le(pToRelease->p
323d0 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20  DbPage) );..    
323e0 2f 2a 20 49 66 20 70 50 61 79 6c 6f 61 64 20 69  /* If pPayload i
323f0 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 64 61  s part of the da
32400 74 61 20 61 72 65 61 20 6f 66 20 70 50 61 67 65  ta area of pPage
32410 2c 20 74 68 65 6e 20 6d 61 6b 65 20 73 75 72 65  , then make sure
32420 20 70 50 61 67 65 0a 20 20 20 20 2a 2a 20 69 73   pPage.    ** is
32430 20 73 74 69 6c 6c 20 77 72 69 74 65 61 62 6c 65   still writeable
32440 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
32450 70 50 61 79 6c 6f 61 64 3c 70 50 61 67 65 2d 3e  pPayload<pPage->
32460 61 44 61 74 61 20 7c 7c 20 70 50 61 79 6c 6f 61  aData || pPayloa
32470 64 3e 3d 26 70 50 61 67 65 2d 3e 61 44 61 74 61  d>=&pPage->aData
32480 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d 0a  [pBt->pageSize].
32490 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73              || s
324a0 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
324b0 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
324c0 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 69  bPage) );..    i
324d0 66 28 20 6e 53 72 63 3e 30 20 29 7b 0a 20 20 20  f( nSrc>0 ){.   
324e0 20 20 20 69 66 28 20 6e 3e 6e 53 72 63 20 29 20     if( n>nSrc ) 
324f0 6e 20 3d 20 6e 53 72 63 3b 0a 20 20 20 20 20 20  n = nSrc;.      
32500 61 73 73 65 72 74 28 20 70 53 72 63 20 29 3b 0a  assert( pSrc );.
32510 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61        memcpy(pPa
32520 79 6c 6f 61 64 2c 20 70 53 72 63 2c 20 6e 29 3b  yload, pSrc, n);
32530 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
32540 20 20 6d 65 6d 73 65 74 28 70 50 61 79 6c 6f 61    memset(pPayloa
32550 64 2c 20 30 2c 20 6e 29 3b 0a 20 20 20 20 7d 0a  d, 0, n);.    }.
32560 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 2d 3d 20      nPayload -= 
32570 6e 3b 0a 20 20 20 20 70 50 61 79 6c 6f 61 64 20  n;.    pPayload 
32580 2b 3d 20 6e 3b 0a 20 20 20 20 70 53 72 63 20 2b  += n;.    pSrc +
32590 3d 20 6e 3b 0a 20 20 20 20 6e 53 72 63 20 2d 3d  = n;.    nSrc -=
325a0 20 6e 3b 0a 20 20 20 20 73 70 61 63 65 4c 65 66   n;.    spaceLef
325b0 74 20 2d 3d 20 6e 3b 0a 20 20 20 20 69 66 28 20  t -= n;.    if( 
325c0 6e 53 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20  nSrc==0 ){.     
325d0 20 6e 53 72 63 20 3d 20 6e 44 61 74 61 3b 0a 20   nSrc = nData;. 
325e0 20 20 20 20 20 70 53 72 63 20 3d 20 70 44 61 74       pSrc = pDat
325f0 61 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  a;.    }.  }.  r
32600 65 6c 65 61 73 65 50 61 67 65 28 70 54 6f 52 65  eleasePage(pToRe
32610 6c 65 61 73 65 29 3b 0a 20 20 72 65 74 75 72 6e  lease);.  return
32620 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
32630 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65 20  *.** Remove the 
32640 69 2d 74 68 20 63 65 6c 6c 20 66 72 6f 6d 20 70  i-th cell from p
32650 50 61 67 65 2e 20 20 54 68 69 73 20 72 6f 75 74  Page.  This rout
32660 69 6e 65 20 65 66 66 65 63 74 73 20 70 50 61 67  ine effects pPag
32670 65 20 6f 6e 6c 79 2e 0a 2a 2a 20 54 68 65 20 63  e only..** The c
32680 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 73 20 6e  ell content is n
32690 6f 74 20 66 72 65 65 64 20 6f 72 20 64 65 61 6c  ot freed or deal
326a0 6c 6f 63 61 74 65 64 2e 20 20 49 74 20 69 73 20  located.  It is 
326b0 61 73 73 75 6d 65 64 20 74 68 61 74 0a 2a 2a 20  assumed that.** 
326c0 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
326d0 20 68 61 73 20 62 65 65 6e 20 63 6f 70 69 65 64   has been copied
326e0 20 73 6f 6d 65 70 6c 61 63 65 20 65 6c 73 65 2e   someplace else.
326f0 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6a    This routine j
32700 75 73 74 0a 2a 2a 20 72 65 6d 6f 76 65 73 20 74  ust.** removes t
32710 68 65 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20  he reference to 
32720 74 68 65 20 63 65 6c 6c 20 66 72 6f 6d 20 70 50  the cell from pP
32730 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 22 73 7a 22 20  age..**.** "sz" 
32740 6d 75 73 74 20 62 65 20 74 68 65 20 6e 75 6d 62  must be the numb
32750 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74  er of bytes in t
32760 68 65 20 63 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74  he cell..*/.stat
32770 69 63 20 76 6f 69 64 20 64 72 6f 70 43 65 6c 6c  ic void dropCell
32780 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
32790 20 69 6e 74 20 69 64 78 2c 20 69 6e 74 20 73 7a   int idx, int sz
327a0 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20 75  , int *pRC){.  u
327b0 33 32 20 70 63 3b 20 20 20 20 20 20 20 20 20 2f  32 pc;         /
327c0 2a 20 4f 66 66 73 65 74 20 74 6f 20 63 65 6c 6c  * Offset to cell
327d0 20 63 6f 6e 74 65 6e 74 20 6f 66 20 63 65 6c 6c   content of cell
327e0 20 62 65 69 6e 67 20 64 65 6c 65 74 65 64 20 2a   being deleted *
327f0 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b 20 20 20  /.  u8 *data;   
32800 20 20 20 20 2f 2a 20 70 50 61 67 65 2d 3e 61 44      /* pPage->aD
32810 61 74 61 20 2a 2f 0a 20 20 75 38 20 2a 70 74 72  ata */.  u8 *ptr
32820 3b 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64  ;        /* Used
32830 20 74 6f 20 6d 6f 76 65 20 62 79 74 65 73 20 61   to move bytes a
32840 72 6f 75 6e 64 20 77 69 74 68 69 6e 20 64 61 74  round within dat
32850 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  a[] */.  int rc;
32860 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
32870 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  return code */. 
32880 20 69 6e 74 20 68 64 72 3b 20 20 20 20 20 20 20   int hdr;       
32890 20 2f 2a 20 42 65 67 69 6e 6e 69 6e 67 20 6f 66   /* Beginning of
328a0 20 74 68 65 20 68 65 61 64 65 72 2e 20 20 30 20   the header.  0 
328b0 6d 6f 73 74 20 70 61 67 65 73 2e 20 20 31 30 30  most pages.  100
328c0 20 70 61 67 65 20 31 20 2a 2f 0a 0a 20 20 69 66   page 1 */..  if
328d0 28 20 2a 70 52 43 20 29 20 72 65 74 75 72 6e 3b  ( *pRC ) return;
328e0 0a 0a 20 20 61 73 73 65 72 74 28 20 69 64 78 3e  ..  assert( idx>
328f0 3d 30 20 26 26 20 69 64 78 3c 70 50 61 67 65 2d  =0 && idx<pPage-
32900 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65  >nCell );.  asse
32910 72 74 28 20 73 7a 3d 3d 63 65 6c 6c 53 69 7a 65  rt( sz==cellSize
32920 28 70 50 61 67 65 2c 20 69 64 78 29 20 29 3b 0a  (pPage, idx) );.
32930 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
32940 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
32950 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
32960 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
32970 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
32980 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
32990 74 65 78 29 20 29 3b 0a 20 20 64 61 74 61 20 3d  tex) );.  data =
329a0 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20   pPage->aData;. 
329b0 20 70 74 72 20 3d 20 26 70 50 61 67 65 2d 3e 61   ptr = &pPage->a
329c0 43 65 6c 6c 49 64 78 5b 32 2a 69 64 78 5d 3b 0a  CellIdx[2*idx];.
329d0 20 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 28    pc = get2byte(
329e0 70 74 72 29 3b 0a 20 20 68 64 72 20 3d 20 70 50  ptr);.  hdr = pP
329f0 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a  age->hdrOffset;.
32a00 20 20 74 65 73 74 63 61 73 65 28 20 70 63 3d 3d    testcase( pc==
32a10 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
32a20 64 72 2b 35 5d 29 20 29 3b 0a 20 20 74 65 73 74  dr+5]) );.  test
32a30 63 61 73 65 28 20 70 63 2b 73 7a 3d 3d 70 50 61  case( pc+sz==pPa
32a40 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
32a50 69 7a 65 20 29 3b 0a 20 20 69 66 28 20 70 63 20  ize );.  if( pc 
32a60 3c 20 28 75 33 32 29 67 65 74 32 62 79 74 65 28  < (u32)get2byte(
32a70 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 20 7c 7c  &data[hdr+5]) ||
32a80 20 70 63 2b 73 7a 20 3e 20 70 50 61 67 65 2d 3e   pc+sz > pPage->
32a90 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
32aa0 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 53 51  ){.    *pRC = SQ
32ab0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
32ac0 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  T;.    return;. 
32ad0 20 7d 0a 20 20 72 63 20 3d 20 66 72 65 65 53 70   }.  rc = freeSp
32ae0 61 63 65 28 70 50 61 67 65 2c 20 70 63 2c 20 73  ace(pPage, pc, s
32af0 7a 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a  z);.  if( rc ){.
32b00 20 20 20 20 2a 70 52 43 20 3d 20 72 63 3b 0a 20      *pRC = rc;. 
32b10 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
32b20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 2d 3b   pPage->nCell--;
32b30 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 43  .  if( pPage->nC
32b40 65 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 6d 65  ell==0 ){.    me
32b50 6d 73 65 74 28 26 64 61 74 61 5b 68 64 72 2b 31  mset(&data[hdr+1
32b60 5d 2c 20 30 2c 20 34 29 3b 0a 20 20 20 20 64 61  ], 0, 4);.    da
32b70 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a 20  ta[hdr+7] = 0;. 
32b80 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74     put2byte(&dat
32b90 61 5b 68 64 72 2b 35 5d 2c 20 70 50 61 67 65 2d  a[hdr+5], pPage-
32ba0 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
32bb0 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 46  );.    pPage->nF
32bc0 72 65 65 20 3d 20 70 50 61 67 65 2d 3e 70 42 74  ree = pPage->pBt
32bd0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 70  ->usableSize - p
32be0 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 0a  Page->hdrOffset.
32bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32c00 20 20 20 20 20 20 20 2d 20 70 50 61 67 65 2d 3e         - pPage->
32c10 63 68 69 6c 64 50 74 72 53 69 7a 65 20 2d 20 38  childPtrSize - 8
32c20 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6d  ;.  }else{.    m
32c30 65 6d 6d 6f 76 65 28 70 74 72 2c 20 70 74 72 2b  emmove(ptr, ptr+
32c40 32 2c 20 32 2a 28 70 50 61 67 65 2d 3e 6e 43 65  2, 2*(pPage->nCe
32c50 6c 6c 20 2d 20 69 64 78 29 29 3b 0a 20 20 20 20  ll - idx));.    
32c60 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  put2byte(&data[h
32c70 64 72 2b 33 5d 2c 20 70 50 61 67 65 2d 3e 6e 43  dr+3], pPage->nC
32c80 65 6c 6c 29 3b 0a 20 20 20 20 70 50 61 67 65 2d  ell);.    pPage-
32c90 3e 6e 46 72 65 65 20 2b 3d 20 32 3b 0a 20 20 7d  >nFree += 2;.  }
32ca0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74  .}../*.** Insert
32cb0 20 61 20 6e 65 77 20 63 65 6c 6c 20 6f 6e 20 70   a new cell on p
32cc0 50 61 67 65 20 61 74 20 63 65 6c 6c 20 69 6e 64  Page at cell ind
32cd0 65 78 20 22 69 22 2e 20 20 70 43 65 6c 6c 20 70  ex "i".  pCell p
32ce0 6f 69 6e 74 73 20 74 6f 20 74 68 65 0a 2a 2a 20  oints to the.** 
32cf0 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 63  content of the c
32d00 65 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ell..**.** If th
32d10 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 77  e cell content w
32d20 69 6c 6c 20 66 69 74 20 6f 6e 20 74 68 65 20 70  ill fit on the p
32d30 61 67 65 2c 20 74 68 65 6e 20 70 75 74 20 69 74  age, then put it
32d40 20 74 68 65 72 65 2e 20 20 49 66 20 69 74 0a 2a   there.  If it.*
32d50 2a 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74 2c 20  * will not fit, 
32d60 74 68 65 6e 20 6d 61 6b 65 20 61 20 63 6f 70 79  then make a copy
32d70 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e   of the cell con
32d80 74 65 6e 74 20 69 6e 74 6f 20 70 54 65 6d 70 20  tent into pTemp 
32d90 69 66 0a 2a 2a 20 70 54 65 6d 70 20 69 73 20 6e  if.** pTemp is n
32da0 6f 74 20 6e 75 6c 6c 2e 20 20 52 65 67 61 72 64  ot null.  Regard
32db0 6c 65 73 73 20 6f 66 20 70 54 65 6d 70 2c 20 61  less of pTemp, a
32dc0 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 65 6e  llocate a new en
32dd0 74 72 79 0a 2a 2a 20 69 6e 20 70 50 61 67 65 2d  try.** in pPage-
32de0 3e 61 70 4f 76 66 6c 5b 5d 20 61 6e 64 20 6d 61  >apOvfl[] and ma
32df0 6b 65 20 69 74 20 70 6f 69 6e 74 20 74 6f 20 74  ke it point to t
32e00 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
32e10 28 65 69 74 68 65 72 0a 2a 2a 20 69 6e 20 70 54  (either.** in pT
32e20 65 6d 70 20 6f 72 20 74 68 65 20 6f 72 69 67 69  emp or the origi
32e30 6e 61 6c 20 70 43 65 6c 6c 29 20 61 6e 64 20 61  nal pCell) and a
32e40 6c 73 6f 20 72 65 63 6f 72 64 20 69 74 73 20 69  lso record its i
32e50 6e 64 65 78 2e 20 0a 2a 2a 20 41 6c 6c 6f 63 61  ndex. .** Alloca
32e60 74 69 6e 67 20 61 20 6e 65 77 20 65 6e 74 72 79  ting a new entry
32e70 20 69 6e 20 70 50 61 67 65 2d 3e 61 43 65 6c 6c   in pPage->aCell
32e80 5b 5d 20 69 6d 70 6c 69 65 73 20 74 68 61 74 20  [] implies that 
32e90 0a 2a 2a 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72  .** pPage->nOver
32ea0 66 6c 6f 77 20 69 73 20 69 6e 63 72 65 6d 65 6e  flow is incremen
32eb0 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ted..*/.static v
32ec0 6f 69 64 20 69 6e 73 65 72 74 43 65 6c 6c 28 0a  oid insertCell(.
32ed0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
32ee0 2c 20 20 20 2f 2a 20 50 61 67 65 20 69 6e 74 6f  ,   /* Page into
32ef0 20 77 68 69 63 68 20 77 65 20 61 72 65 20 63 6f   which we are co
32f00 70 79 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 69  pying */.  int i
32f10 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
32f20 4e 65 77 20 63 65 6c 6c 20 62 65 63 6f 6d 65 73  New cell becomes
32f30 20 74 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 6f   the i-th cell o
32f40 66 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20  f the page */.  
32f50 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20  u8 *pCell,      
32f60 20 20 2f 2a 20 43 6f 6e 74 65 6e 74 20 6f 66 20    /* Content of 
32f70 74 68 65 20 6e 65 77 20 63 65 6c 6c 20 2a 2f 0a  the new cell */.
32f80 20 20 69 6e 74 20 73 7a 2c 20 20 20 20 20 20 20    int sz,       
32f90 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20      /* Bytes of 
32fa0 63 6f 6e 74 65 6e 74 20 69 6e 20 70 43 65 6c 6c  content in pCell
32fb0 20 2a 2f 0a 20 20 75 38 20 2a 70 54 65 6d 70 2c   */.  u8 *pTemp,
32fc0 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20          /* Temp 
32fd0 73 74 6f 72 61 67 65 20 73 70 61 63 65 20 66 6f  storage space fo
32fe0 72 20 70 43 65 6c 6c 2c 20 69 66 20 6e 65 65 64  r pCell, if need
32ff0 65 64 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 43 68  ed */.  Pgno iCh
33000 69 6c 64 2c 20 20 20 20 20 20 2f 2a 20 49 66 20  ild,      /* If 
33010 6e 6f 6e 2d 7a 65 72 6f 2c 20 72 65 70 6c 61 63  non-zero, replac
33020 65 20 66 69 72 73 74 20 34 20 62 79 74 65 73 20  e first 4 bytes 
33030 77 69 74 68 20 74 68 69 73 20 76 61 6c 75 65 20  with this value 
33040 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 43 20 20 20  */.  int *pRC   
33050 20 20 20 20 20 20 20 2f 2a 20 52 65 61 64 20 61         /* Read a
33060 6e 64 20 77 72 69 74 65 20 72 65 74 75 72 6e 20  nd write return 
33070 63 6f 64 65 20 66 72 6f 6d 20 68 65 72 65 20 2a  code from here *
33080 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 64 78 20 3d  /.){.  int idx =
33090 20 30 3b 20 20 20 20 20 20 2f 2a 20 57 68 65 72   0;      /* Wher
330a0 65 20 74 6f 20 77 72 69 74 65 20 6e 65 77 20 63  e to write new c
330b0 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 6e 20 64  ell content in d
330c0 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6a  ata[] */.  int j
330d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
330e0 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
330f0 20 20 69 6e 74 20 65 6e 64 3b 20 20 20 20 20 20    int end;      
33100 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74      /* First byt
33110 65 20 70 61 73 74 20 74 68 65 20 6c 61 73 74 20  e past the last 
33120 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 69 6e 20  cell pointer in 
33130 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  data[] */.  int 
33140 69 6e 73 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ins;          /*
33150 20 49 6e 64 65 78 20 69 6e 20 64 61 74 61 5b 5d   Index in data[]
33160 20 77 68 65 72 65 20 6e 65 77 20 63 65 6c 6c 20   where new cell 
33170 70 6f 69 6e 74 65 72 20 69 73 20 69 6e 73 65 72  pointer is inser
33180 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c  ted */.  int cel
33190 6c 4f 66 66 73 65 74 3b 20 20 20 2f 2a 20 41 64  lOffset;   /* Ad
331a0 64 72 65 73 73 20 6f 66 20 66 69 72 73 74 20 63  dress of first c
331b0 65 6c 6c 20 70 6f 69 6e 74 65 72 20 69 6e 20 64  ell pointer in d
331c0 61 74 61 5b 5d 20 2a 2f 0a 20 20 75 38 20 2a 64  ata[] */.  u8 *d
331d0 61 74 61 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ata;         /* 
331e0 54 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74  The content of t
331f0 68 65 20 77 68 6f 6c 65 20 70 61 67 65 20 2a 2f  he whole page */
33200 0a 0a 20 20 69 66 28 20 2a 70 52 43 20 29 20 72  ..  if( *pRC ) r
33210 65 74 75 72 6e 3b 0a 0a 20 20 61 73 73 65 72 74  eturn;..  assert
33220 28 20 69 3e 3d 30 20 26 26 20 69 3c 3d 70 50 61  ( i>=0 && i<=pPa
33230 67 65 2d 3e 6e 43 65 6c 6c 2b 70 50 61 67 65 2d  ge->nCell+pPage-
33240 3e 6e 4f 76 65 72 66 6c 6f 77 20 29 3b 0a 20 20  >nOverflow );.  
33250 61 73 73 65 72 74 28 20 4d 58 5f 43 45 4c 4c 28  assert( MX_CELL(
33260 70 50 61 67 65 2d 3e 70 42 74 29 3c 3d 31 30 39  pPage->pBt)<=109
33270 32 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  21 );.  assert( 
33280 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3c 3d 4d 58  pPage->nCell<=MX
33290 5f 43 45 4c 4c 28 70 50 61 67 65 2d 3e 70 42 74  _CELL(pPage->pBt
332a0 29 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20  ) || CORRUPT_DB 
332b0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
332c0 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3c 3d 41  ge->nOverflow<=A
332d0 72 72 61 79 53 69 7a 65 28 70 50 61 67 65 2d 3e  rraySize(pPage->
332e0 61 70 4f 76 66 6c 29 20 29 3b 0a 20 20 61 73 73  apOvfl) );.  ass
332f0 65 72 74 28 20 41 72 72 61 79 53 69 7a 65 28 70  ert( ArraySize(p
33300 50 61 67 65 2d 3e 61 70 4f 76 66 6c 29 3d 3d 41  Page->apOvfl)==A
33310 72 72 61 79 53 69 7a 65 28 70 50 61 67 65 2d 3e  rraySize(pPage->
33320 61 69 4f 76 66 6c 29 20 29 3b 0a 20 20 61 73 73  aiOvfl) );.  ass
33330 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
33340 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
33350 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
33360 2f 2a 20 54 68 65 20 63 65 6c 6c 20 73 68 6f 75  /* The cell shou
33370 6c 64 20 6e 6f 72 6d 61 6c 6c 79 20 62 65 20 73  ld normally be s
33380 69 7a 65 64 20 63 6f 72 72 65 63 74 6c 79 2e 20  ized correctly. 
33390 20 48 6f 77 65 76 65 72 2c 20 77 68 65 6e 20 6d   However, when m
333a0 6f 76 69 6e 67 20 61 0a 20 20 2a 2a 20 6d 61 6c  oving a.  ** mal
333b0 66 6f 72 6d 65 64 20 63 65 6c 6c 20 66 72 6f 6d  formed cell from
333c0 20 61 20 6c 65 61 66 20 70 61 67 65 20 74 6f 20   a leaf page to 
333d0 61 6e 20 69 6e 74 65 72 69 6f 72 20 70 61 67 65  an interior page
333e0 2c 20 69 66 20 74 68 65 20 63 65 6c 6c 20 73 69  , if the cell si
333f0 7a 65 0a 20 20 2a 2a 20 77 61 6e 74 65 64 20 74  ze.  ** wanted t
33400 6f 20 62 65 20 6c 65 73 73 20 74 68 61 6e 20 34  o be less than 4
33410 20 62 75 74 20 67 6f 74 20 72 6f 75 6e 64 65 64   but got rounded
33420 20 75 70 20 74 6f 20 34 20 6f 6e 20 74 68 65 20   up to 4 on the 
33430 6c 65 61 66 2c 20 74 68 65 6e 20 73 69 7a 65 0a  leaf, then size.
33440 20 20 2a 2a 20 6d 69 67 68 74 20 62 65 20 6c 65    ** might be le
33450 73 73 20 74 68 61 6e 20 38 20 28 6c 65 61 66 2d  ss than 8 (leaf-
33460 73 69 7a 65 20 2b 20 70 6f 69 6e 74 65 72 29 20  size + pointer) 
33470 6f 6e 20 74 68 65 20 69 6e 74 65 72 69 6f 72 20  on the interior 
33480 6e 6f 64 65 2e 20 20 48 65 6e 63 65 0a 20 20 2a  node.  Hence.  *
33490 2a 20 74 68 65 20 74 65 72 6d 20 61 66 74 65 72  * the term after
334a0 20 74 68 65 20 7c 7c 20 69 6e 20 74 68 65 20 66   the || in the f
334b0 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 28  ollowing assert(
334c0 29 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  ). */.  assert( 
334d0 73 7a 3d 3d 63 65 6c 6c 53 69 7a 65 50 74 72 28  sz==cellSizePtr(
334e0 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 20 7c 7c  pPage, pCell) ||
334f0 20 28 73 7a 3d 3d 38 20 26 26 20 69 43 68 69 6c   (sz==8 && iChil
33500 64 3e 30 29 20 29 3b 0a 20 20 69 66 28 20 70 50  d>0) );.  if( pP
33510 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 7c  age->nOverflow |
33520 7c 20 73 7a 2b 32 3e 70 50 61 67 65 2d 3e 6e 46  | sz+2>pPage->nF
33530 72 65 65 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ree ){.    if( p
33540 54 65 6d 70 20 29 7b 0a 20 20 20 20 20 20 6d 65  Temp ){.      me
33550 6d 63 70 79 28 70 54 65 6d 70 2c 20 70 43 65 6c  mcpy(pTemp, pCel
33560 6c 2c 20 73 7a 29 3b 0a 20 20 20 20 20 20 70 43  l, sz);.      pC
33570 65 6c 6c 20 3d 20 70 54 65 6d 70 3b 0a 20 20 20  ell = pTemp;.   
33580 20 7d 0a 20 20 20 20 69 66 28 20 69 43 68 69 6c   }.    if( iChil
33590 64 20 29 7b 0a 20 20 20 20 20 20 70 75 74 34 62  d ){.      put4b
335a0 79 74 65 28 70 43 65 6c 6c 2c 20 69 43 68 69 6c  yte(pCell, iChil
335b0 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6a 20  d);.    }.    j 
335c0 3d 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  = pPage->nOverfl
335d0 6f 77 2b 2b 3b 0a 20 20 20 20 61 73 73 65 72 74  ow++;.    assert
335e0 28 20 6a 3c 28 69 6e 74 29 28 73 69 7a 65 6f 66  ( j<(int)(sizeof
335f0 28 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c 29 2f  (pPage->apOvfl)/
33600 73 69 7a 65 6f 66 28 70 50 61 67 65 2d 3e 61 70  sizeof(pPage->ap
33610 4f 76 66 6c 5b 30 5d 29 29 20 29 3b 0a 20 20 20  Ovfl[0])) );.   
33620 20 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c 5b 6a   pPage->apOvfl[j
33630 5d 20 3d 20 70 43 65 6c 6c 3b 0a 20 20 20 20 70  ] = pCell;.    p
33640 50 61 67 65 2d 3e 61 69 4f 76 66 6c 5b 6a 5d 20  Page->aiOvfl[j] 
33650 3d 20 28 75 31 36 29 69 3b 0a 20 20 7d 65 6c 73  = (u16)i;.  }els
33660 65 7b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20  e{.    int rc = 
33670 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
33680 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
33690 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
336a0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
336b0 20 20 2a 70 52 43 20 3d 20 72 63 3b 0a 20 20 20    *pRC = rc;.   
336c0 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
336d0 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
336e0 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
336f0 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
33700 61 67 65 29 20 29 3b 0a 20 20 20 20 64 61 74 61  age) );.    data
33710 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b   = pPage->aData;
33720 0a 20 20 20 20 63 65 6c 6c 4f 66 66 73 65 74 20  .    cellOffset 
33730 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66  = pPage->cellOff
33740 73 65 74 3b 0a 20 20 20 20 65 6e 64 20 3d 20 63  set;.    end = c
33750 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70 50  ellOffset + 2*pP
33760 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 20 20  age->nCell;.    
33770 69 6e 73 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74  ins = cellOffset
33780 20 2b 20 32 2a 69 3b 0a 20 20 20 20 72 63 20 3d   + 2*i;.    rc =
33790 20 61 6c 6c 6f 63 61 74 65 53 70 61 63 65 28 70   allocateSpace(p
337a0 50 61 67 65 2c 20 73 7a 2c 20 26 69 64 78 29 3b  Page, sz, &idx);
337b0 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 20 2a  .    if( rc ){ *
337c0 70 52 43 20 3d 20 72 63 3b 20 72 65 74 75 72 6e  pRC = rc; return
337d0 3b 20 7d 0a 20 20 20 20 2f 2a 20 54 68 65 20 61  ; }.    /* The a
337e0 6c 6c 6f 63 61 74 65 53 70 61 63 65 28 29 20 72  llocateSpace() r
337f0 6f 75 74 69 6e 65 20 67 75 61 72 61 6e 74 65 65  outine guarantee
33800 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  s the following 
33810 74 77 6f 20 70 72 6f 70 65 72 74 69 65 73 0a 20  two properties. 
33820 20 20 20 2a 2a 20 69 66 20 69 74 20 72 65 74 75     ** if it retu
33830 72 6e 73 20 73 75 63 63 65 73 73 20 2a 2f 0a 20  rns success */. 
33840 20 20 20 61 73 73 65 72 74 28 20 69 64 78 20 3e     assert( idx >
33850 3d 20 65 6e 64 2b 32 20 29 3b 0a 20 20 20 20 61  = end+2 );.    a
33860 73 73 65 72 74 28 20 69 64 78 2b 73 7a 20 3c 3d  ssert( idx+sz <=
33870 20 28 69 6e 74 29 70 50 61 67 65 2d 3e 70 42 74   (int)pPage->pBt
33880 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a  ->usableSize );.
33890 20 20 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c      pPage->nCell
338a0 2b 2b 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e  ++;.    pPage->n
338b0 46 72 65 65 20 2d 3d 20 28 75 31 36 29 28 32 20  Free -= (u16)(2 
338c0 2b 20 73 7a 29 3b 0a 20 20 20 20 6d 65 6d 63 70  + sz);.    memcp
338d0 79 28 26 64 61 74 61 5b 69 64 78 5d 2c 20 70 43  y(&data[idx], pC
338e0 65 6c 6c 2c 20 73 7a 29 3b 0a 20 20 20 20 69 66  ell, sz);.    if
338f0 28 20 69 43 68 69 6c 64 20 29 7b 0a 20 20 20 20  ( iChild ){.    
33900 20 20 70 75 74 34 62 79 74 65 28 26 64 61 74 61    put4byte(&data
33910 5b 69 64 78 5d 2c 20 69 43 68 69 6c 64 29 3b 0a  [idx], iChild);.
33920 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 6d 6f 76      }.    memmov
33930 65 28 26 64 61 74 61 5b 69 6e 73 2b 32 5d 2c 20  e(&data[ins+2], 
33940 26 64 61 74 61 5b 69 6e 73 5d 2c 20 65 6e 64 2d  &data[ins], end-
33950 69 6e 73 29 3b 0a 20 20 20 20 70 75 74 32 62 79  ins);.    put2by
33960 74 65 28 26 64 61 74 61 5b 69 6e 73 5d 2c 20 69  te(&data[ins], i
33970 64 78 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74  dx);.    put2byt
33980 65 28 26 64 61 74 61 5b 70 50 61 67 65 2d 3e 68  e(&data[pPage->h
33990 64 72 4f 66 66 73 65 74 2b 33 5d 2c 20 70 50 61  drOffset+3], pPa
339a0 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a 23 69 66 6e  ge->nCell);.#ifn
339b0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
339c0 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69  AUTOVACUUM.    i
339d0 66 28 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 61  f( pPage->pBt->a
339e0 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20  utoVacuum ){.   
339f0 20 20 20 2f 2a 20 54 68 65 20 63 65 6c 6c 20 6d     /* The cell m
33a00 61 79 20 63 6f 6e 74 61 69 6e 20 61 20 70 6f 69  ay contain a poi
33a10 6e 74 65 72 20 74 6f 20 61 6e 20 6f 76 65 72 66  nter to an overf
33a20 6c 6f 77 20 70 61 67 65 2e 20 49 66 20 73 6f 2c  low page. If so,
33a30 20 77 72 69 74 65 0a 20 20 20 20 20 20 2a 2a 20   write.      ** 
33a40 74 68 65 20 65 6e 74 72 79 20 66 6f 72 20 74 68  the entry for th
33a50 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  e overflow page 
33a60 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72  into the pointer
33a70 20 6d 61 70 2e 0a 20 20 20 20 20 20 2a 2f 0a 20   map..      */. 
33a80 20 20 20 20 20 70 74 72 6d 61 70 50 75 74 4f 76       ptrmapPutOv
33a90 66 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65  flPtr(pPage, pCe
33aa0 6c 6c 2c 20 70 52 43 29 3b 0a 20 20 20 20 7d 0a  ll, pRC);.    }.
33ab0 23 65 6e 64 69 66 0a 20 20 7d 0a 7d 0a 0a 2f 2a  #endif.  }.}../*
33ac0 0a 2a 2a 20 41 72 72 61 79 20 61 70 43 65 6c 6c  .** Array apCell
33ad0 5b 5d 20 63 6f 6e 74 61 69 6e 73 20 70 6f 69 6e  [] contains poin
33ae0 74 65 72 73 20 74 6f 20 6e 43 65 6c 6c 20 62 2d  ters to nCell b-
33af0 74 72 65 65 20 70 61 67 65 20 63 65 6c 6c 73 2e  tree page cells.
33b00 20 54 68 65 20 0a 2a 2a 20 73 7a 43 65 6c 6c 5b   The .** szCell[
33b10 5d 20 61 72 72 61 79 20 63 6f 6e 74 61 69 6e 73  ] array contains
33b20 20 74 68 65 20 73 69 7a 65 20 69 6e 20 62 79 74   the size in byt
33b30 65 73 20 6f 66 20 65 61 63 68 20 63 65 6c 6c 2e  es of each cell.
33b40 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a   This function.*
33b50 2a 20 72 65 70 6c 61 63 65 73 20 74 68 65 20 63  * replaces the c
33b60 75 72 72 65 6e 74 20 63 6f 6e 74 65 6e 74 73 20  urrent contents 
33b70 6f 66 20 70 61 67 65 20 70 50 67 20 77 69 74 68  of page pPg with
33b80 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
33b90 20 74 68 65 20 63 65 6c 6c 0a 2a 2a 20 61 72 72   the cell.** arr
33ba0 61 79 2e 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 20 6f  ay..**.** Some o
33bb0 66 20 74 68 65 20 63 65 6c 6c 73 20 69 6e 20 61  f the cells in a
33bc0 70 43 65 6c 6c 5b 5d 20 6d 61 79 20 63 75 72 72  pCell[] may curr
33bd0 65 6e 74 6c 79 20 62 65 20 73 74 6f 72 65 64 20  ently be stored 
33be0 69 6e 20 70 50 67 2e 20 54 68 69 73 0a 2a 2a 20  in pPg. This.** 
33bf0 66 75 6e 63 74 69 6f 6e 20 77 6f 72 6b 73 20 61  function works a
33c00 72 6f 75 6e 64 20 70 72 6f 62 6c 65 6d 73 20 63  round problems c
33c10 61 75 73 65 64 20 62 79 20 74 68 69 73 20 62 79  aused by this by
33c20 20 6d 61 6b 69 6e 67 20 61 20 63 6f 70 79 20 6f   making a copy o
33c30 66 20 61 6e 79 20 0a 2a 2a 20 73 75 63 68 20 63  f any .** such c
33c40 65 6c 6c 73 20 62 65 66 6f 72 65 20 6f 76 65 72  ells before over
33c50 77 72 69 74 69 6e 67 20 74 68 65 20 70 61 67 65  writing the page
33c60 20 64 61 74 61 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   data..**.** The
33c70 20 4d 65 6d 50 61 67 65 2e 6e 46 72 65 65 20 66   MemPage.nFree f
33c80 69 65 6c 64 20 69 73 20 69 6e 76 61 6c 69 64 61  ield is invalida
33c90 74 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63  ted by this func
33ca0 74 69 6f 6e 2e 20 49 74 20 69 73 20 74 68 65 20  tion. It is the 
33cb0 0a 2a 2a 20 72 65 73 70 6f 6e 73 69 62 69 6c 69  .** responsibili
33cc0 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72  ty of the caller
33cd0 20 74 6f 20 73 65 74 20 69 74 20 63 6f 72 72 65   to set it corre
33ce0 63 74 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ctly..*/.static 
33cf0 76 6f 69 64 20 72 65 62 75 69 6c 64 50 61 67 65  void rebuildPage
33d00 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 67  (.  MemPage *pPg
33d10 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
33d20 20 20 20 20 2f 2a 20 45 64 69 74 20 74 68 69 73      /* Edit this
33d30 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 6e   page */.  int n
33d40 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20  Cell,           
33d50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
33d60 6e 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 63 65  nal number of ce
33d70 6c 6c 73 20 6f 6e 20 70 61 67 65 20 2a 2f 0a 20  lls on page */. 
33d80 20 75 38 20 2a 2a 61 70 43 65 6c 6c 2c 20 20 20   u8 **apCell,   
33d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33da0 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 63 65 6c   /* Array of cel
33db0 6c 73 20 2a 2f 0a 20 20 75 31 36 20 2a 73 7a 43  ls */.  u16 *szC
33dc0 65 6c 6c 20 20 20 20 20 20 20 20 20 20 20 20 20  ell             
33dd0 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79          /* Array
33de0 20 6f 66 20 63 65 6c 6c 20 73 69 7a 65 73 20 2a   of cell sizes *
33df0 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 69 6e 74  /.){.  const int
33e00 20 68 64 72 20 3d 20 70 50 67 2d 3e 68 64 72 4f   hdr = pPg->hdrO
33e10 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 20 20  ffset;          
33e20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 68 65 61  /* Offset of hea
33e30 64 65 72 20 6f 6e 20 70 50 67 20 2a 2f 0a 20 20  der on pPg */.  
33e40 75 38 20 2a 20 63 6f 6e 73 74 20 61 44 61 74 61  u8 * const aData
33e50 20 3d 20 70 50 67 2d 3e 61 44 61 74 61 3b 20 20   = pPg->aData;  
33e60 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
33e70 74 65 72 20 74 6f 20 64 61 74 61 20 66 6f 72 20  ter to data for 
33e80 70 50 67 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 69  pPg */.  const i
33e90 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20  nt usableSize = 
33ea0 70 50 67 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  pPg->pBt->usable
33eb0 53 69 7a 65 3b 0a 20 20 75 38 20 2a 20 63 6f 6e  Size;.  u8 * con
33ec0 73 74 20 70 45 6e 64 20 3d 20 26 61 44 61 74 61  st pEnd = &aData
33ed0 5b 75 73 61 62 6c 65 53 69 7a 65 5d 3b 0a 20 20  [usableSize];.  
33ee0 69 6e 74 20 69 3b 0a 20 20 75 38 20 2a 70 43 65  int i;.  u8 *pCe
33ef0 6c 6c 70 74 72 20 3d 20 70 50 67 2d 3e 61 43 65  llptr = pPg->aCe
33f00 6c 6c 49 64 78 3b 0a 20 20 75 38 20 2a 70 54 6d  llIdx;.  u8 *pTm
33f10 70 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  p = sqlite3Pager
33f20 54 65 6d 70 53 70 61 63 65 28 70 50 67 2d 3e 70  TempSpace(pPg->p
33f30 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 75  Bt->pPager);.  u
33f40 38 20 2a 70 44 61 74 61 3b 0a 0a 20 20 69 20 3d  8 *pData;..  i =
33f50 20 67 65 74 32 62 79 74 65 28 26 61 44 61 74 61   get2byte(&aData
33f60 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 6d 65 6d 63  [hdr+5]);.  memc
33f70 70 79 28 26 70 54 6d 70 5b 69 5d 2c 20 26 61 44  py(&pTmp[i], &aD
33f80 61 74 61 5b 69 5d 2c 20 75 73 61 62 6c 65 53 69  ata[i], usableSi
33f90 7a 65 20 2d 20 69 29 3b 0a 0a 20 20 70 44 61 74  ze - i);..  pDat
33fa0 61 20 3d 20 70 45 6e 64 3b 0a 20 20 66 6f 72 28  a = pEnd;.  for(
33fb0 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b  i=0; i<nCell; i+
33fc0 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70 43 65 6c  +){.    u8 *pCel
33fd0 6c 20 3d 20 61 70 43 65 6c 6c 5b 69 5d 3b 0a 20  l = apCell[i];. 
33fe0 20 20 20 69 66 28 20 70 43 65 6c 6c 3e 61 44 61     if( pCell>aDa
33ff0 74 61 20 26 26 20 70 43 65 6c 6c 3c 70 45 6e 64  ta && pCell<pEnd
34000 20 29 7b 0a 20 20 20 20 20 20 70 43 65 6c 6c 20   ){.      pCell 
34010 3d 20 26 70 54 6d 70 5b 70 43 65 6c 6c 20 2d 20  = &pTmp[pCell - 
34020 61 44 61 74 61 5d 3b 0a 20 20 20 20 7d 0a 20 20  aData];.    }.  
34030 20 20 70 44 61 74 61 20 2d 3d 20 73 7a 43 65 6c    pData -= szCel
34040 6c 5b 69 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79  l[i];.    memcpy
34050 28 70 44 61 74 61 2c 20 70 43 65 6c 6c 2c 20 73  (pData, pCell, s
34060 7a 43 65 6c 6c 5b 69 5d 29 3b 0a 20 20 20 20 70  zCell[i]);.    p
34070 75 74 32 62 79 74 65 28 70 43 65 6c 6c 70 74 72  ut2byte(pCellptr
34080 2c 20 28 70 44 61 74 61 20 2d 20 61 44 61 74 61  , (pData - aData
34090 29 29 3b 0a 20 20 20 20 70 43 65 6c 6c 70 74 72  ));.    pCellptr
340a0 20 2b 3d 20 32 3b 0a 20 20 20 20 61 73 73 65 72   += 2;.    asser
340b0 74 28 20 73 7a 43 65 6c 6c 5b 69 5d 3d 3d 63 65  t( szCell[i]==ce
340c0 6c 6c 53 69 7a 65 50 74 72 28 70 50 67 2c 20 70  llSizePtr(pPg, p
340d0 43 65 6c 6c 29 20 29 3b 0a 20 20 7d 0a 0a 20 20  Cell) );.  }..  
340e0 2f 2a 20 54 68 65 20 70 50 67 2d 3e 6e 46 72 65  /* The pPg->nFre
340f0 65 20 66 69 65 6c 64 20 69 73 20 6e 6f 77 20 73  e field is now s
34100 65 74 20 69 6e 63 6f 72 72 65 63 74 6c 79 2e 20  et incorrectly. 
34110 54 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20  The caller will 
34120 66 69 78 20 69 74 2e 20 2a 2f 0a 20 20 70 50 67  fix it. */.  pPg
34130 2d 3e 6e 43 65 6c 6c 20 3d 20 6e 43 65 6c 6c 3b  ->nCell = nCell;
34140 0a 20 20 70 50 67 2d 3e 6e 4f 76 65 72 66 6c 6f  .  pPg->nOverflo
34150 77 20 3d 20 30 3b 0a 0a 20 20 70 75 74 32 62 79  w = 0;..  put2by
34160 74 65 28 26 61 44 61 74 61 5b 68 64 72 2b 31 5d  te(&aData[hdr+1]
34170 2c 20 30 29 3b 0a 20 20 70 75 74 32 62 79 74 65  , 0);.  put2byte
34180 28 26 61 44 61 74 61 5b 68 64 72 2b 33 5d 2c 20  (&aData[hdr+3], 
34190 70 50 67 2d 3e 6e 43 65 6c 6c 29 3b 0a 20 20 70  pPg->nCell);.  p
341a0 75 74 32 62 79 74 65 28 26 61 44 61 74 61 5b 68  ut2byte(&aData[h
341b0 64 72 2b 35 5d 2c 20 70 44 61 74 61 20 2d 20 61  dr+5], pData - a
341c0 44 61 74 61 29 3b 0a 20 20 61 44 61 74 61 5b 68  Data);.  aData[h
341d0 64 72 2b 37 5d 20 3d 20 30 78 30 30 3b 0a 7d 0a  dr+7] = 0x00;.}.
341e0 0a 2f 2a 0a 2a 2a 20 41 72 72 61 79 20 61 70 43  ./*.** Array apC
341f0 65 6c 6c 5b 5d 20 63 6f 6e 74 61 69 6e 73 20 6e  ell[] contains n
34200 43 65 6c 6c 20 70 6f 69 6e 74 65 72 73 20 74 6f  Cell pointers to
34210 20 62 2d 74 72 65 65 20 63 65 6c 6c 73 2e 20 41   b-tree cells. A
34220 72 72 61 79 20 73 7a 43 65 6c 6c 0a 2a 2a 20 63  rray szCell.** c
34230 6f 6e 74 61 69 6e 73 20 74 68 65 20 73 69 7a 65  ontains the size
34240 20 69 6e 20 62 79 74 65 73 20 6f 66 20 65 61 63   in bytes of eac
34250 68 20 73 75 63 68 20 63 65 6c 6c 2e 20 54 68 69  h such cell. Thi
34260 73 20 66 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d  s function attem
34270 70 74 73 20 74 6f 20 0a 2a 2a 20 61 64 64 20 74  pts to .** add t
34280 68 65 20 63 65 6c 6c 73 20 73 74 6f 72 65 64 20  he cells stored 
34290 69 6e 20 74 68 65 20 61 72 72 61 79 20 74 6f 20  in the array to 
342a0 70 61 67 65 20 70 50 67 2e 20 49 66 20 69 74 20  page pPg. If it 
342b0 63 61 6e 6e 6f 74 20 28 62 65 63 61 75 73 65 20  cannot (because 
342c0 0a 2a 2a 20 74 68 65 20 70 61 67 65 20 6e 65 65  .** the page nee
342d0 64 73 20 74 6f 20 62 65 20 64 65 66 72 61 67 6d  ds to be defragm
342e0 65 6e 74 65 64 20 62 65 66 6f 72 65 20 74 68 65  ented before the
342f0 20 63 65 6c 6c 73 20 77 69 6c 6c 20 66 69 74 29   cells will fit)
34300 2c 20 6e 6f 6e 2d 7a 65 72 6f 0a 2a 2a 20 69 73  , non-zero.** is
34310 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72   returned. Other
34320 77 69 73 65 2c 20 69 66 20 74 68 65 20 63 65 6c  wise, if the cel
34330 6c 73 20 61 72 65 20 61 64 64 65 64 20 73 75 63  ls are added suc
34340 63 65 73 73 66 75 6c 6c 79 2c 20 7a 65 72 6f 20  cessfully, zero 
34350 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e 0a  is.** returned..
34360 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70  **.** Argument p
34370 43 65 6c 6c 70 74 72 20 70 6f 69 6e 74 73 20 74  Cellptr points t
34380 6f 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72  o the first entr
34390 79 20 69 6e 20 74 68 65 20 63 65 6c 6c 2d 70 6f  y in the cell-po
343a0 69 6e 74 65 72 20 61 72 72 61 79 0a 2a 2a 20 28  inter array.** (
343b0 70 61 72 74 20 6f 66 20 70 61 67 65 20 70 50 67  part of page pPg
343c0 29 20 74 6f 20 70 6f 70 75 6c 61 74 65 2e 20 41  ) to populate. A
343d0 66 74 65 72 20 63 65 6c 6c 20 61 70 43 65 6c 6c  fter cell apCell
343e0 5b 30 5d 20 69 73 20 77 72 69 74 74 65 6e 20 74  [0] is written t
343f0 6f 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 62 6f  o the.** page bo
34400 64 79 2c 20 61 20 31 36 2d 62 69 74 20 6f 66 66  dy, a 16-bit off
34410 73 65 74 20 69 73 20 77 72 69 74 74 65 6e 20 74  set is written t
34420 6f 20 70 43 65 6c 6c 70 74 72 2e 20 41 6e 64 20  o pCellptr. And 
34430 73 6f 20 6f 6e 2c 20 66 6f 72 20 65 61 63 68 0a  so on, for each.
34440 2a 2a 20 63 65 6c 6c 20 69 6e 20 74 68 65 20 61  ** cell in the a
34450 72 72 61 79 2e 20 49 74 20 69 73 20 74 68 65 20  rray. It is the 
34460 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f  responsibility o
34470 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20  f the caller to 
34480 65 6e 73 75 72 65 0a 2a 2a 20 74 68 61 74 20 69  ensure.** that i
34490 74 20 69 73 20 73 61 66 65 20 74 6f 20 6f 76 65  t is safe to ove
344a0 72 77 72 69 74 65 20 74 68 69 73 20 70 61 72 74  rwrite this part
344b0 20 6f 66 20 74 68 65 20 63 65 6c 6c 2d 70 6f 69   of the cell-poi
344c0 6e 74 65 72 20 61 72 72 61 79 2e 0a 2a 2a 0a 2a  nter array..**.*
344d0 2a 20 57 68 65 6e 20 74 68 69 73 20 66 75 6e 63  * When this func
344e0 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20  tion is called, 
344f0 2a 70 70 44 61 74 61 20 70 6f 69 6e 74 73 20 74  *ppData points t
34500 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  o the start of t
34510 68 65 20 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 61  he .** content a
34520 72 65 61 20 6f 6e 20 70 61 67 65 20 70 50 67 2e  rea on page pPg.
34530 20 49 66 20 74 68 65 20 73 69 7a 65 20 6f 66 20   If the size of 
34540 74 68 65 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  the content area
34550 20 69 73 20 65 78 74 65 6e 64 65 64 2c 0a 2a 2a   is extended,.**
34560 20 2a 70 70 44 61 74 61 20 69 73 20 75 70 64 61   *ppData is upda
34570 74 65 64 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  ted to point to 
34580 74 68 65 20 6e 65 77 20 73 74 61 72 74 20 6f 66  the new start of
34590 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 61 72 65   the content are
345a0 61 0a 2a 2a 20 62 65 66 6f 72 65 20 72 65 74 75  a.** before retu
345b0 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 46 69 6e  rning..**.** Fin
345c0 61 6c 6c 79 2c 20 61 72 67 75 6d 65 6e 74 20 70  ally, argument p
345d0 42 65 67 69 6e 20 70 6f 69 6e 74 73 20 74 6f 20  Begin points to 
345e0 74 68 65 20 62 79 74 65 20 69 6d 6d 65 64 69 61  the byte immedia
345f0 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  tely following t
34600 68 65 0a 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65  he.** end of the
34610 20 73 70 61 63 65 20 72 65 71 75 69 72 65 64 20   space required 
34620 62 79 20 74 68 69 73 20 70 61 67 65 20 66 6f 72  by this page for
34630 20 74 68 65 20 63 65 6c 6c 2d 70 6f 69 6e 74 65   the cell-pointe
34640 72 20 61 72 65 61 20 28 66 6f 72 0a 2a 2a 20 61  r area (for.** a
34650 6c 6c 20 63 65 6c 6c 73 20 2d 20 6e 6f 74 20 6a  ll cells - not j
34660 75 73 74 20 74 68 6f 73 65 20 69 6e 73 65 72 74  ust those insert
34670 65 64 20 62 79 20 74 68 65 20 63 75 72 72 65 6e  ed by the curren
34680 74 20 63 61 6c 6c 29 2e 20 49 66 20 74 68 65 20  t call). If the 
34690 63 6f 6e 74 65 6e 74 0a 2a 2a 20 61 72 65 61 20  content.** area 
346a0 6d 75 73 74 20 62 65 20 65 78 74 65 6e 64 65 64  must be extended
346b0 20 74 6f 20 62 65 66 6f 72 65 20 74 68 69 73 20   to before this 
346c0 70 6f 69 6e 74 20 69 6e 20 6f 72 64 65 72 20 74  point in order t
346d0 6f 20 61 63 63 6f 6d 6f 64 61 74 65 20 61 6c 6c  o accomodate all
346e0 0a 2a 2a 20 63 65 6c 6c 73 20 69 6e 20 61 70 43  .** cells in apC
346f0 65 6c 6c 5b 5d 2c 20 74 68 65 6e 20 74 68 65 20  ell[], then the 
34700 63 65 6c 6c 73 20 64 6f 20 6e 6f 74 20 66 69 74  cells do not fit
34710 20 61 6e 64 20 6e 6f 6e 2d 7a 65 72 6f 20 69 73   and non-zero is
34720 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
34730 61 74 69 63 20 69 6e 74 20 70 61 67 65 49 6e 73  atic int pageIns
34740 65 72 74 41 72 72 61 79 28 0a 20 20 4d 65 6d 50  ertArray(.  MemP
34750 61 67 65 20 2a 70 50 67 2c 20 20 20 20 20 20 20  age *pPg,       
34760 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
34770 61 67 65 20 74 6f 20 61 64 64 20 63 65 6c 6c 73  age to add cells
34780 20 74 6f 20 2a 2f 0a 20 20 75 38 20 2a 70 42 65   to */.  u8 *pBe
34790 67 69 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20  gin,            
347a0 20 20 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20           /* End 
347b0 6f 66 20 63 65 6c 6c 2d 70 6f 69 6e 74 65 72 20  of cell-pointer 
347c0 61 72 72 61 79 20 2a 2f 0a 20 20 75 38 20 2a 2a  array */.  u8 **
347d0 70 70 44 61 74 61 2c 20 20 20 20 20 20 20 20 20  ppData,         
347e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e             /* IN
347f0 2f 4f 55 54 3a 20 50 61 67 65 20 63 6f 6e 74 65  /OUT: Page conte
34800 6e 74 20 2d 61 72 65 61 20 70 6f 69 6e 74 65 72  nt -area pointer
34810 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 70   */.  u8 *pCellp
34820 74 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  tr,             
34830 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
34840 20 74 6f 20 63 65 6c 6c 2d 70 6f 69 6e 74 65 72   to cell-pointer
34850 20 61 72 65 61 20 2a 2f 0a 20 20 69 6e 74 20 6e   area */.  int n
34860 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20  Cell,           
34870 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
34880 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 74 6f  mber of cells to
34890 20 61 64 64 20 74 6f 20 70 50 67 20 2a 2f 0a 20   add to pPg */. 
348a0 20 75 38 20 2a 2a 61 70 43 65 6c 6c 2c 20 20 20   u8 **apCell,   
348b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
348c0 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 63 65 6c   /* Array of cel
348d0 6c 73 20 2a 2f 0a 20 20 75 31 36 20 2a 73 7a 43  ls */.  u16 *szC
348e0 65 6c 6c 20 20 20 20 20 20 20 20 20 20 20 20 20  ell             
348f0 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79          /* Array
34900 20 6f 66 20 63 65 6c 6c 20 73 69 7a 65 73 20 2a   of cell sizes *
34910 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  /.){.  int i;.  
34920 75 38 20 2a 61 44 61 74 61 20 3d 20 70 50 67 2d  u8 *aData = pPg-
34930 3e 61 44 61 74 61 3b 0a 20 20 75 38 20 2a 70 44  >aData;.  u8 *pD
34940 61 74 61 20 3d 20 2a 70 70 44 61 74 61 3b 0a 20  ata = *ppData;. 
34950 20 63 6f 6e 73 74 20 69 6e 74 20 62 46 72 65 65   const int bFree
34960 6c 69 73 74 20 3d 20 61 44 61 74 61 5b 31 5d 20  list = aData[1] 
34970 7c 7c 20 61 44 61 74 61 5b 32 5d 3b 0a 20 20 61  || aData[2];.  a
34980 73 73 65 72 74 28 20 43 4f 52 52 55 50 54 5f 44  ssert( CORRUPT_D
34990 42 20 7c 7c 20 70 50 67 2d 3e 68 64 72 4f 66 66  B || pPg->hdrOff
349a0 73 65 74 3d 3d 30 20 29 3b 20 20 20 20 2f 2a 20  set==0 );    /* 
349b0 4e 65 76 65 72 20 63 61 6c 6c 65 64 20 6f 6e 20  Never called on 
349c0 70 61 67 65 20 31 20 2a 2f 0a 20 20 66 6f 72 28  page 1 */.  for(
349d0 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b  i=0; i<nCell; i+
349e0 2b 29 7b 0a 20 20 20 20 69 6e 74 20 73 7a 20 3d  +){.    int sz =
349f0 20 73 7a 43 65 6c 6c 5b 69 5d 3b 0a 20 20 20 20   szCell[i];.    
34a00 69 6e 74 20 72 63 3b 0a 20 20 20 20 75 38 20 2a  int rc;.    u8 *
34a10 70 53 6c 6f 74 3b 0a 20 20 20 20 69 66 28 20 62  pSlot;.    if( b
34a20 46 72 65 65 6c 69 73 74 3d 3d 30 20 7c 7c 20 28  Freelist==0 || (
34a30 70 53 6c 6f 74 20 3d 20 70 61 67 65 46 69 6e 64  pSlot = pageFind
34a40 53 6c 6f 74 28 70 50 67 2c 20 73 7a 2c 20 26 72  Slot(pPg, sz, &r
34a50 63 2c 20 30 29 29 3d 3d 30 20 29 7b 0a 20 20 20  c, 0))==0 ){.   
34a60 20 20 20 70 44 61 74 61 20 2d 3d 20 73 7a 3b 0a     pData -= sz;.
34a70 20 20 20 20 20 20 69 66 28 20 70 44 61 74 61 3c        if( pData<
34a80 70 42 65 67 69 6e 20 29 20 72 65 74 75 72 6e 20  pBegin ) return 
34a90 31 3b 0a 20 20 20 20 20 20 70 53 6c 6f 74 20 3d  1;.      pSlot =
34aa0 20 70 44 61 74 61 3b 0a 20 20 20 20 7d 0a 20 20   pData;.    }.  
34ab0 20 20 6d 65 6d 63 70 79 28 70 53 6c 6f 74 2c 20    memcpy(pSlot, 
34ac0 61 70 43 65 6c 6c 5b 69 5d 2c 20 73 7a 29 3b 0a  apCell[i], sz);.
34ad0 20 20 20 20 70 75 74 32 62 79 74 65 28 70 43 65      put2byte(pCe
34ae0 6c 6c 70 74 72 2c 20 28 70 53 6c 6f 74 20 2d 20  llptr, (pSlot - 
34af0 61 44 61 74 61 29 29 3b 0a 20 20 20 20 70 43 65  aData));.    pCe
34b00 6c 6c 70 74 72 20 2b 3d 20 32 3b 0a 20 20 7d 0a  llptr += 2;.  }.
34b10 20 20 2a 70 70 44 61 74 61 20 3d 20 70 44 61 74    *ppData = pDat
34b20 61 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  a;.  return 0;.}
34b30 0a 0a 2f 2a 0a 2a 2a 20 41 72 72 61 79 20 61 70  ../*.** Array ap
34b40 43 65 6c 6c 5b 5d 20 63 6f 6e 74 61 69 6e 73 20  Cell[] contains 
34b50 6e 43 65 6c 6c 20 70 6f 69 6e 74 65 72 73 20 74  nCell pointers t
34b60 6f 20 62 2d 74 72 65 65 20 63 65 6c 6c 73 2e 20  o b-tree cells. 
34b70 41 72 72 61 79 20 73 7a 43 65 6c 6c 20 0a 2a 2a  Array szCell .**
34b80 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 73 69   contains the si
34b90 7a 65 20 69 6e 20 62 79 74 65 73 20 6f 66 20 65  ze in bytes of e
34ba0 61 63 68 20 73 75 63 68 20 63 65 6c 6c 2e 20 54  ach such cell. T
34bb0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 64 64  his function add
34bc0 73 20 74 68 65 0a 2a 2a 20 73 70 61 63 65 20 61  s the.** space a
34bd0 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 65  ssociated with e
34be0 61 63 68 20 63 65 6c 6c 20 69 6e 20 74 68 65 20  ach cell in the 
34bf0 61 72 72 61 79 20 74 68 61 74 20 69 73 20 63 75  array that is cu
34c00 72 72 65 6e 74 6c 79 20 73 74 6f 72 65 64 20 0a  rrently stored .
34c10 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20 62 6f  ** within the bo
34c20 64 79 20 6f 66 20 70 50 67 20 74 6f 20 74 68 65  dy of pPg to the
34c30 20 70 50 67 20 66 72 65 65 2d 6c 69 73 74 2e 20   pPg free-list. 
34c40 54 68 65 20 63 65 6c 6c 2d 70 6f 69 6e 74 65 72  The cell-pointer
34c50 73 20 61 6e 64 20 6f 74 68 65 72 0a 2a 2a 20 66  s and other.** f
34c60 69 65 6c 64 73 20 6f 66 20 74 68 65 20 70 61 67  ields of the pag
34c70 65 20 61 72 65 20 6e 6f 74 20 75 70 64 61 74 65  e are not update
34c80 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  d..**.** This fu
34c90 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74  nction returns t
34ca0 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20  he total number 
34cb0 6f 66 20 63 65 6c 6c 73 20 61 64 64 65 64 20 74  of cells added t
34cc0 6f 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e  o the free-list.
34cd0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
34ce0 61 67 65 46 72 65 65 41 72 72 61 79 28 0a 20 20  ageFreeArray(.  
34cf0 4d 65 6d 50 61 67 65 20 2a 70 50 67 2c 20 20 20  MemPage *pPg,   
34d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34d10 2f 2a 20 50 61 67 65 20 74 6f 20 65 64 69 74 20  /* Page to edit 
34d20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 2c 20  */.  int nCell, 
34d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34d40 20 20 20 20 20 2f 2a 20 43 65 6c 6c 73 20 74 6f       /* Cells to
34d50 20 64 65 6c 65 74 65 20 2a 2f 0a 20 20 75 38 20   delete */.  u8 
34d60 2a 2a 61 70 43 65 6c 6c 2c 20 20 20 20 20 20 20  **apCell,       
34d70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
34d80 41 72 72 61 79 20 6f 66 20 63 65 6c 6c 73 20 2a  Array of cells *
34d90 2f 0a 20 20 75 31 36 20 2a 73 7a 43 65 6c 6c 20  /.  u16 *szCell 
34da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34db0 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20      /* Array of 
34dc0 63 65 6c 6c 20 73 69 7a 65 73 20 2a 2f 0a 29 7b  cell sizes */.){
34dd0 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 61 44  .  u8 * const aD
34de0 61 74 61 20 3d 20 70 50 67 2d 3e 61 44 61 74 61  ata = pPg->aData
34df0 3b 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 70  ;.  u8 * const p
34e00 45 6e 64 20 3d 20 26 61 44 61 74 61 5b 70 50 67  End = &aData[pPg
34e10 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
34e20 65 5d 3b 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74  e];.  u8 * const
34e30 20 70 53 74 61 72 74 20 3d 20 26 61 44 61 74 61   pStart = &aData
34e40 5b 70 50 67 2d 3e 68 64 72 4f 66 66 73 65 74 20  [pPg->hdrOffset 
34e50 2b 20 38 20 2b 20 70 50 67 2d 3e 63 68 69 6c 64  + 8 + pPg->child
34e60 50 74 72 53 69 7a 65 5d 3b 0a 20 20 69 6e 74 20  PtrSize];.  int 
34e70 6e 52 65 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20  nRet = 0;.  int 
34e80 69 3b 0a 20 20 75 38 20 2a 70 46 72 65 65 20 3d  i;.  u8 *pFree =
34e90 20 30 3b 0a 20 20 69 6e 74 20 73 7a 46 72 65 65   0;.  int szFree
34ea0 20 3d 20 30 3b 0a 0a 20 20 66 6f 72 28 69 3d 30   = 0;..  for(i=0
34eb0 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b  ; i<nCell; i++){
34ec0 0a 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d  .    u8 *pCell =
34ed0 20 61 70 43 65 6c 6c 5b 69 5d 3b 0a 20 20 20 20   apCell[i];.    
34ee0 69 66 28 20 70 43 65 6c 6c 3e 3d 70 53 74 61 72  if( pCell>=pStar
34ef0 74 20 26 26 20 70 43 65 6c 6c 3c 70 45 6e 64 20  t && pCell<pEnd 
34f00 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 73 7a 20  ){.      int sz 
34f10 3d 20 73 7a 43 65 6c 6c 5b 69 5d 3b 0a 20 20 20  = szCell[i];.   
34f20 20 20 20 69 66 28 20 70 46 72 65 65 21 3d 28 70     if( pFree!=(p
34f30 43 65 6c 6c 20 2b 20 73 7a 29 20 29 7b 0a 20 20  Cell + sz) ){.  
34f40 20 20 20 20 20 20 69 66 28 20 70 46 72 65 65 20        if( pFree 
34f50 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  ){.          ass
34f60 65 72 74 28 20 70 46 72 65 65 3e 61 44 61 74 61  ert( pFree>aData
34f70 20 26 26 20 28 70 46 72 65 65 20 2d 20 61 44 61   && (pFree - aDa
34f80 74 61 29 3c 36 35 35 33 36 20 29 3b 0a 20 20 20  ta)<65536 );.   
34f90 20 20 20 20 20 20 20 66 72 65 65 53 70 61 63 65         freeSpace
34fa0 28 70 50 67 2c 20 28 75 31 36 29 28 70 46 72 65  (pPg, (u16)(pFre
34fb0 65 20 2d 20 61 44 61 74 61 29 2c 20 73 7a 46 72  e - aData), szFr
34fc0 65 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ee);.        }. 
34fd0 20 20 20 20 20 20 20 70 46 72 65 65 20 3d 20 70         pFree = p
34fe0 43 65 6c 6c 3b 0a 20 20 20 20 20 20 20 20 73 7a  Cell;.        sz
34ff0 46 72 65 65 20 3d 20 73 7a 3b 0a 20 20 20 20 20  Free = sz;.     
35000 20 20 20 69 66 28 20 70 46 72 65 65 2b 73 7a 3e     if( pFree+sz>
35010 70 45 6e 64 20 29 20 72 65 74 75 72 6e 20 30 3b  pEnd ) return 0;
35020 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
35030 20 20 20 20 20 20 70 46 72 65 65 20 3d 20 70 43        pFree = pC
35040 65 6c 6c 3b 0a 20 20 20 20 20 20 20 20 73 7a 46  ell;.        szF
35050 72 65 65 20 2b 3d 20 73 7a 3b 0a 20 20 20 20 20  ree += sz;.     
35060 20 7d 0a 20 20 20 20 20 20 6e 52 65 74 2b 2b 3b   }.      nRet++;
35070 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
35080 20 70 46 72 65 65 20 29 7b 0a 20 20 20 20 61 73   pFree ){.    as
35090 73 65 72 74 28 20 70 46 72 65 65 3e 61 44 61 74  sert( pFree>aDat
350a0 61 20 26 26 20 28 70 46 72 65 65 20 2d 20 61 44  a && (pFree - aD
350b0 61 74 61 29 3c 36 35 35 33 36 20 29 3b 0a 20 20  ata)<65536 );.  
350c0 20 20 66 72 65 65 53 70 61 63 65 28 70 50 67 2c    freeSpace(pPg,
350d0 20 28 75 31 36 29 28 70 46 72 65 65 20 2d 20 61   (u16)(pFree - a
350e0 44 61 74 61 29 2c 20 73 7a 46 72 65 65 29 3b 0a  Data), szFree);.
350f0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 52 65    }.  return nRe
35100 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  t;.}../*.** The 
35110 70 50 67 2d 3e 6e 46 72 65 65 20 66 69 65 6c 64  pPg->nFree field
35120 20 69 73 20 69 6e 76 61 6c 69 64 20 77 68 65 6e   is invalid when
35130 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   this function r
35140 65 74 75 72 6e 73 2e 20 49 74 20 69 73 20 74 68  eturns. It is th
35150 65 0a 2a 2a 20 72 65 73 70 6f 6e 73 69 62 69 6c  e.** responsibil
35160 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65  ity of the calle
35170 72 20 74 6f 20 73 65 74 20 69 74 20 63 6f 72 72  r to set it corr
35180 65 63 74 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  ectly..*/.static
35190 20 76 6f 69 64 20 65 64 69 74 50 61 67 65 28 0a   void editPage(.
351a0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 67 2c 20    MemPage *pPg, 
351b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
351c0 20 20 2f 2a 20 45 64 69 74 20 74 68 69 73 20 70    /* Edit this p
351d0 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4f 6c  age */.  int iOl
351e0 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d,              
351f0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
35200 78 20 6f 66 20 66 69 72 73 74 20 63 65 6c 6c 20  x of first cell 
35210 63 75 72 72 65 6e 74 6c 79 20 6f 6e 20 70 61 67  currently on pag
35220 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4e 65 77 2c  e */.  int iNew,
35230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35240 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
35250 6f 66 20 6e 65 77 20 66 69 72 73 74 20 63 65 6c  of new first cel
35260 6c 20 6f 6e 20 70 61 67 65 20 2a 2f 0a 20 20 69  l on page */.  i
35270 6e 74 20 6e 4e 65 77 2c 20 20 20 20 20 20 20 20  nt nNew,        
35280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
35290 2a 20 46 69 6e 61 6c 20 6e 75 6d 62 65 72 20 6f  * Final number o
352a0 66 20 63 65 6c 6c 73 20 6f 6e 20 70 61 67 65 20  f cells on page 
352b0 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43 65 6c 6c  */.  u8 **apCell
352c0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
352d0 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66       /* Array of
352e0 20 63 65 6c 6c 73 20 2a 2f 0a 20 20 75 31 36 20   cells */.  u16 
352f0 2a 73 7a 43 65 6c 6c 20 20 20 20 20 20 20 20 20  *szCell         
35300 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
35310 72 72 61 79 20 6f 66 20 63 65 6c 6c 20 73 69 7a  rray of cell siz
35320 65 73 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a 20  es */.){.  u8 * 
35330 63 6f 6e 73 74 20 61 44 61 74 61 20 3d 20 70 50  const aData = pP
35340 67 2d 3e 61 44 61 74 61 3b 0a 20 20 63 6f 6e 73  g->aData;.  cons
35350 74 20 69 6e 74 20 68 64 72 20 3d 20 70 50 67 2d  t int hdr = pPg-
35360 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 75 38  >hdrOffset;.  u8
35370 20 2a 70 42 65 67 69 6e 20 3d 20 26 70 50 67 2d   *pBegin = &pPg-
35380 3e 61 43 65 6c 6c 49 64 78 5b 6e 4e 65 77 20 2a  >aCellIdx[nNew *
35390 20 32 5d 3b 0a 20 20 69 6e 74 20 6e 43 65 6c 6c   2];.  int nCell
353a0 20 3d 20 70 50 67 2d 3e 6e 43 65 6c 6c 3b 20 20   = pPg->nCell;  
353b0 20 20 20 20 20 2f 2a 20 43 65 6c 6c 73 20 73 74       /* Cells st
353c0 6f 72 65 64 20 6f 6e 20 70 50 67 20 2a 2f 0a 20  ored on pPg */. 
353d0 20 75 38 20 2a 70 44 61 74 61 3b 0a 20 20 75 38   u8 *pData;.  u8
353e0 20 2a 70 43 65 6c 6c 70 74 72 3b 0a 20 20 69 6e   *pCellptr;.  in
353f0 74 20 69 3b 0a 20 20 69 6e 74 20 69 4f 6c 64 45  t i;.  int iOldE
35400 6e 64 20 3d 20 69 4f 6c 64 20 2b 20 70 50 67 2d  nd = iOld + pPg-
35410 3e 6e 43 65 6c 6c 20 2b 20 70 50 67 2d 3e 6e 4f  >nCell + pPg->nO
35420 76 65 72 66 6c 6f 77 3b 0a 20 20 69 6e 74 20 69  verflow;.  int i
35430 4e 65 77 45 6e 64 20 3d 20 69 4e 65 77 20 2b 20  NewEnd = iNew + 
35440 6e 4e 65 77 3b 0a 0a 23 69 66 64 65 66 20 53 51  nNew;..#ifdef SQ
35450 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 75 38 20  LITE_DEBUG.  u8 
35460 2a 70 54 6d 70 20 3d 20 73 71 6c 69 74 65 33 50  *pTmp = sqlite3P
35470 61 67 65 72 54 65 6d 70 53 70 61 63 65 28 70 50  agerTempSpace(pP
35480 67 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 29 3b  g->pBt->pPager);
35490 0a 20 20 6d 65 6d 63 70 79 28 70 54 6d 70 2c 20  .  memcpy(pTmp, 
354a0 61 44 61 74 61 2c 20 70 50 67 2d 3e 70 42 74 2d  aData, pPg->pBt-
354b0 3e 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a 23 65  >usableSize);.#e
354c0 6e 64 69 66 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76  ndif..  /* Remov
354d0 65 20 63 65 6c 6c 73 20 66 72 6f 6d 20 74 68 65  e cells from the
354e0 20 73 74 61 72 74 20 61 6e 64 20 65 6e 64 20 6f   start and end o
354f0 66 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20  f the page */.  
35500 69 66 28 20 69 4f 6c 64 3c 69 4e 65 77 20 29 7b  if( iOld<iNew ){
35510 0a 20 20 20 20 69 6e 74 20 6e 53 68 69 66 74 20  .    int nShift 
35520 3d 20 70 61 67 65 46 72 65 65 41 72 72 61 79 28  = pageFreeArray(
35530 0a 20 20 20 20 20 20 20 20 70 50 67 2c 20 69 4e  .        pPg, iN
35540 65 77 2d 69 4f 6c 64 2c 20 26 61 70 43 65 6c 6c  ew-iOld, &apCell
35550 5b 69 4f 6c 64 5d 2c 20 26 73 7a 43 65 6c 6c 5b  [iOld], &szCell[
35560 69 4f 6c 64 5d 0a 20 20 20 20 29 3b 0a 20 20 20  iOld].    );.   
35570 20 6d 65 6d 6d 6f 76 65 28 70 50 67 2d 3e 61 43   memmove(pPg->aC
35580 65 6c 6c 49 64 78 2c 20 26 70 50 67 2d 3e 61 43  ellIdx, &pPg->aC
35590 65 6c 6c 49 64 78 5b 6e 53 68 69 66 74 2a 32 5d  ellIdx[nShift*2]
355a0 2c 20 6e 43 65 6c 6c 2a 32 29 3b 0a 20 20 20 20  , nCell*2);.    
355b0 6e 43 65 6c 6c 20 2d 3d 20 6e 53 68 69 66 74 3b  nCell -= nShift;
355c0 0a 20 20 7d 0a 20 20 69 66 28 20 69 4e 65 77 45  .  }.  if( iNewE
355d0 6e 64 20 3c 20 69 4f 6c 64 45 6e 64 20 29 7b 0a  nd < iOldEnd ){.
355e0 20 20 20 20 6e 43 65 6c 6c 20 2d 3d 20 70 61 67      nCell -= pag
355f0 65 46 72 65 65 41 72 72 61 79 28 0a 20 20 20 20  eFreeArray(.    
35600 20 20 20 20 70 50 67 2c 20 69 4f 6c 64 45 6e 64      pPg, iOldEnd
35610 2d 69 4e 65 77 45 6e 64 2c 20 26 61 70 43 65 6c  -iNewEnd, &apCel
35620 6c 5b 69 4e 65 77 45 6e 64 5d 2c 20 26 73 7a 43  l[iNewEnd], &szC
35630 65 6c 6c 5b 69 4e 65 77 45 6e 64 5d 0a 20 20 20  ell[iNewEnd].   
35640 20 29 3b 0a 20 20 7d 0a 0a 20 20 70 44 61 74 61   );.  }..  pData
35650 20 3d 20 26 61 44 61 74 61 5b 67 65 74 32 62 79   = &aData[get2by
35660 74 65 28 26 61 44 61 74 61 5b 68 64 72 2b 35 5d  te(&aData[hdr+5]
35670 29 5d 3b 0a 20 20 69 66 28 20 70 44 61 74 61 3c  )];.  if( pData<
35680 70 42 65 67 69 6e 20 29 20 67 6f 74 6f 20 65 64  pBegin ) goto ed
35690 69 74 70 61 67 65 5f 66 61 69 6c 3b 0a 0a 20 20  itpage_fail;..  
356a0 2f 2a 20 41 64 64 20 63 65 6c 6c 73 20 74 6f 20  /* Add cells to 
356b0 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
356c0 20 70 61 67 65 20 2a 2f 0a 20 20 69 66 28 20 69   page */.  if( i
356d0 4e 65 77 3c 69 4f 6c 64 20 29 7b 0a 20 20 20 20  New<iOld ){.    
356e0 69 6e 74 20 6e 41 64 64 20 3d 20 69 4f 6c 64 2d  int nAdd = iOld-
356f0 69 4e 65 77 3b 0a 20 20 20 20 70 43 65 6c 6c 70  iNew;.    pCellp
35700 74 72 20 3d 20 70 50 67 2d 3e 61 43 65 6c 6c 49  tr = pPg->aCellI
35710 64 78 3b 0a 20 20 20 20 6d 65 6d 6d 6f 76 65 28  dx;.    memmove(
35720 26 70 43 65 6c 6c 70 74 72 5b 6e 41 64 64 2a 32  &pCellptr[nAdd*2
35730 5d 2c 20 70 43 65 6c 6c 70 74 72 2c 20 6e 43 65  ], pCellptr, nCe
35740 6c 6c 2a 32 29 3b 0a 20 20 20 20 69 66 28 20 70  ll*2);.    if( p
35750 61 67 65 49 6e 73 65 72 74 41 72 72 61 79 28 0a  ageInsertArray(.
35760 20 20 20 20 20 20 20 20 20 20 70 50 67 2c 20 70            pPg, p
35770 42 65 67 69 6e 2c 20 26 70 44 61 74 61 2c 20 70  Begin, &pData, p
35780 43 65 6c 6c 70 74 72 2c 0a 20 20 20 20 20 20 20  Cellptr,.       
35790 20 20 20 6e 41 64 64 2c 20 26 61 70 43 65 6c 6c     nAdd, &apCell
357a0 5b 69 4e 65 77 5d 2c 20 26 73 7a 43 65 6c 6c 5b  [iNew], &szCell[
357b0 69 4e 65 77 5d 0a 20 20 20 20 29 20 29 20 67 6f  iNew].    ) ) go
357c0 74 6f 20 65 64 69 74 70 61 67 65 5f 66 61 69 6c  to editpage_fail
357d0 3b 0a 20 20 20 20 6e 43 65 6c 6c 20 2b 3d 20 6e  ;.    nCell += n
357e0 41 64 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41  Add;.  }..  /* A
357f0 64 64 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20  dd any overflow 
35800 63 65 6c 6c 73 20 2a 2f 0a 20 20 66 6f 72 28 69  cells */.  for(i
35810 3d 30 3b 20 69 3c 70 50 67 2d 3e 6e 4f 76 65 72  =0; i<pPg->nOver
35820 66 6c 6f 77 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  flow; i++){.    
35830 69 6e 74 20 69 43 65 6c 6c 20 3d 20 28 69 4f 6c  int iCell = (iOl
35840 64 20 2b 20 70 50 67 2d 3e 61 69 4f 76 66 6c 5b  d + pPg->aiOvfl[
35850 69 5d 29 20 2d 20 69 4e 65 77 3b 0a 20 20 20 20  i]) - iNew;.    
35860 69 66 28 20 69 43 65 6c 6c 3e 3d 30 20 26 26 20  if( iCell>=0 && 
35870 69 43 65 6c 6c 3c 6e 4e 65 77 20 29 7b 0a 20 20  iCell<nNew ){.  
35880 20 20 20 20 70 43 65 6c 6c 70 74 72 20 3d 20 26      pCellptr = &
35890 70 50 67 2d 3e 61 43 65 6c 6c 49 64 78 5b 69 43  pPg->aCellIdx[iC
358a0 65 6c 6c 20 2a 20 32 5d 3b 0a 20 20 20 20 20 20  ell * 2];.      
358b0 6d 65 6d 6d 6f 76 65 28 26 70 43 65 6c 6c 70 74  memmove(&pCellpt
358c0 72 5b 32 5d 2c 20 70 43 65 6c 6c 70 74 72 2c 20  r[2], pCellptr, 
358d0 28 6e 43 65 6c 6c 20 2d 20 69 43 65 6c 6c 29 20  (nCell - iCell) 
358e0 2a 20 32 29 3b 0a 20 20 20 20 20 20 6e 43 65 6c  * 2);.      nCel
358f0 6c 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70  l++;.      if( p
35900 61 67 65 49 6e 73 65 72 74 41 72 72 61 79 28 0a  ageInsertArray(.
35910 20 20 20 20 20 20 20 20 20 20 20 20 70 50 67 2c              pPg,
35920 20 70 42 65 67 69 6e 2c 20 26 70 44 61 74 61 2c   pBegin, &pData,
35930 20 70 43 65 6c 6c 70 74 72 2c 0a 20 20 20 20 20   pCellptr,.     
35940 20 20 20 20 20 20 20 31 2c 20 26 61 70 43 65 6c         1, &apCel
35950 6c 5b 69 43 65 6c 6c 20 2b 20 69 4e 65 77 5d 2c  l[iCell + iNew],
35960 20 26 73 7a 43 65 6c 6c 5b 69 43 65 6c 6c 20 2b   &szCell[iCell +
35970 20 69 4e 65 77 5d 0a 20 20 20 20 20 20 29 20 29   iNew].      ) )
35980 20 67 6f 74 6f 20 65 64 69 74 70 61 67 65 5f 66   goto editpage_f
35990 61 69 6c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ail;.    }.  }..
359a0 20 20 2f 2a 20 41 70 70 65 6e 64 20 63 65 6c 6c    /* Append cell
359b0 73 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  s to the end of 
359c0 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 70 43  the page */.  pC
359d0 65 6c 6c 70 74 72 20 3d 20 26 70 50 67 2d 3e 61  ellptr = &pPg->a
359e0 43 65 6c 6c 49 64 78 5b 6e 43 65 6c 6c 2a 32 5d  CellIdx[nCell*2]
359f0 3b 0a 20 20 69 66 28 20 70 61 67 65 49 6e 73 65  ;.  if( pageInse
35a00 72 74 41 72 72 61 79 28 0a 20 20 20 20 20 20 20  rtArray(.       
35a10 20 70 50 67 2c 20 70 42 65 67 69 6e 2c 20 26 70   pPg, pBegin, &p
35a20 44 61 74 61 2c 20 70 43 65 6c 6c 70 74 72 2c 0a  Data, pCellptr,.
35a30 20 20 20 20 20 20 20 20 6e 4e 65 77 2d 6e 43 65          nNew-nCe
35a40 6c 6c 2c 20 26 61 70 43 65 6c 6c 5b 69 4e 65 77  ll, &apCell[iNew
35a50 2b 6e 43 65 6c 6c 5d 2c 20 26 73 7a 43 65 6c 6c  +nCell], &szCell
35a60 5b 69 4e 65 77 2b 6e 43 65 6c 6c 5d 0a 20 20 29  [iNew+nCell].  )
35a70 20 29 20 67 6f 74 6f 20 65 64 69 74 70 61 67 65   ) goto editpage
35a80 5f 66 61 69 6c 3b 0a 0a 20 20 70 50 67 2d 3e 6e  _fail;..  pPg->n
35a90 43 65 6c 6c 20 3d 20 6e 4e 65 77 3b 0a 20 20 70  Cell = nNew;.  p
35aa0 50 67 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20  Pg->nOverflow = 
35ab0 30 3b 0a 0a 20 20 70 75 74 32 62 79 74 65 28 26  0;..  put2byte(&
35ac0 61 44 61 74 61 5b 68 64 72 2b 33 5d 2c 20 70 50  aData[hdr+3], pP
35ad0 67 2d 3e 6e 43 65 6c 6c 29 3b 0a 20 20 70 75 74  g->nCell);.  put
35ae0 32 62 79 74 65 28 26 61 44 61 74 61 5b 68 64 72  2byte(&aData[hdr
35af0 2b 35 5d 2c 20 70 44 61 74 61 20 2d 20 61 44 61  +5], pData - aDa
35b00 74 61 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  ta);..#ifdef SQL
35b10 49 54 45 5f 44 45 42 55 47 0a 20 20 66 6f 72 28  ITE_DEBUG.  for(
35b20 69 3d 30 3b 20 69 3c 6e 4e 65 77 20 26 26 20 21  i=0; i<nNew && !
35b30 43 4f 52 52 55 50 54 5f 44 42 3b 20 69 2b 2b 29  CORRUPT_DB; i++)
35b40 7b 0a 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 20  {.    u8 *pCell 
35b50 3d 20 61 70 43 65 6c 6c 5b 69 2b 69 4e 65 77 5d  = apCell[i+iNew]
35b60 3b 0a 20 20 20 20 69 6e 74 20 69 4f 66 66 20 3d  ;.    int iOff =
35b70 20 67 65 74 32 62 79 74 65 28 26 70 50 67 2d 3e   get2byte(&pPg->
35b80 61 43 65 6c 6c 49 64 78 5b 69 2a 32 5d 29 3b 0a  aCellIdx[i*2]);.
35b90 20 20 20 20 69 66 28 20 70 43 65 6c 6c 3e 3d 61      if( pCell>=a
35ba0 44 61 74 61 20 26 26 20 70 43 65 6c 6c 3c 26 61  Data && pCell<&a
35bb0 44 61 74 61 5b 70 50 67 2d 3e 70 42 74 2d 3e 75  Data[pPg->pBt->u
35bc0 73 61 62 6c 65 53 69 7a 65 5d 20 29 7b 0a 20 20  sableSize] ){.  
35bd0 20 20 20 20 70 43 65 6c 6c 20 3d 20 26 70 54 6d      pCell = &pTm
35be0 70 5b 70 43 65 6c 6c 20 2d 20 61 44 61 74 61 5d  p[pCell - aData]
35bf0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
35c00 72 74 28 20 30 3d 3d 6d 65 6d 63 6d 70 28 70 43  rt( 0==memcmp(pC
35c10 65 6c 6c 2c 20 26 61 44 61 74 61 5b 69 4f 66 66  ell, &aData[iOff
35c20 5d 2c 20 73 7a 43 65 6c 6c 5b 69 2b 69 4e 65 77  ], szCell[i+iNew
35c30 5d 29 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  ]) );.  }.#endif
35c40 0a 0a 20 20 72 65 74 75 72 6e 3b 0a 20 65 64 69  ..  return;. edi
35c50 74 70 61 67 65 5f 66 61 69 6c 3a 0a 20 20 2f 2a  tpage_fail:.  /*
35c60 20 55 6e 61 62 6c 65 20 74 6f 20 65 64 69 74 20   Unable to edit 
35c70 74 68 69 73 20 70 61 67 65 2e 20 52 65 62 75 69  this page. Rebui
35c80 6c 64 20 69 74 20 66 72 6f 6d 20 73 63 72 61 74  ld it from scrat
35c90 63 68 20 69 6e 73 74 65 61 64 2e 20 2a 2f 0a 20  ch instead. */. 
35ca0 20 72 65 62 75 69 6c 64 50 61 67 65 28 70 50 67   rebuildPage(pPg
35cb0 2c 20 6e 4e 65 77 2c 20 26 61 70 43 65 6c 6c 5b  , nNew, &apCell[
35cc0 69 4e 65 77 5d 2c 20 26 73 7a 43 65 6c 6c 5b 69  iNew], &szCell[i
35cd0 4e 65 77 5d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  New]);.}../*.** 
35ce0 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 61  The following pa
35cf0 72 61 6d 65 74 65 72 73 20 64 65 74 65 72 6d 69  rameters determi
35d00 6e 65 20 68 6f 77 20 6d 61 6e 79 20 61 64 6a 61  ne how many adja
35d10 63 65 6e 74 20 70 61 67 65 73 20 67 65 74 20 69  cent pages get i
35d20 6e 76 6f 6c 76 65 64 0a 2a 2a 20 69 6e 20 61 20  nvolved.** in a 
35d30 62 61 6c 61 6e 63 69 6e 67 20 6f 70 65 72 61 74  balancing operat
35d40 69 6f 6e 2e 20 20 4e 4e 20 69 73 20 74 68 65 20  ion.  NN is the 
35d50 6e 75 6d 62 65 72 20 6f 66 20 6e 65 69 67 68 62  number of neighb
35d60 6f 72 73 20 6f 6e 20 65 69 74 68 65 72 20 73 69  ors on either si
35d70 64 65 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61 67  de.** of the pag
35d80 65 20 74 68 61 74 20 70 61 72 74 69 63 69 70 61  e that participa
35d90 74 65 20 69 6e 20 74 68 65 20 62 61 6c 61 6e 63  te in the balanc
35da0 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20  ing operation.  
35db0 4e 42 20 69 73 20 74 68 65 0a 2a 2a 20 74 6f 74  NB is the.** tot
35dc0 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  al number of pag
35dd0 65 73 20 74 68 61 74 20 70 61 72 74 69 63 69 70  es that particip
35de0 61 74 65 2c 20 69 6e 63 6c 75 64 69 6e 67 20 74  ate, including t
35df0 68 65 20 74 61 72 67 65 74 20 70 61 67 65 20 61  he target page a
35e00 6e 64 0a 2a 2a 20 4e 4e 20 6e 65 69 67 68 62 6f  nd.** NN neighbo
35e10 72 73 20 6f 6e 20 65 69 74 68 65 72 20 73 69 64  rs on either sid
35e20 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 69 6e  e..**.** The min
35e30 69 6d 75 6d 20 76 61 6c 75 65 20 6f 66 20 4e 4e  imum value of NN
35e40 20 69 73 20 31 20 28 6f 66 20 63 6f 75 72 73 65   is 1 (of course
35e50 29 2e 20 20 49 6e 63 72 65 61 73 69 6e 67 20 4e  ).  Increasing N
35e60 4e 20 61 62 6f 76 65 20 31 0a 2a 2a 20 28 74 6f  N above 1.** (to
35e70 20 32 20 6f 72 20 33 29 20 67 69 76 65 73 20 61   2 or 3) gives a
35e80 20 6d 6f 64 65 73 74 20 69 6d 70 72 6f 76 65 6d   modest improvem
35e90 65 6e 74 20 69 6e 20 53 45 4c 45 43 54 20 61 6e  ent in SELECT an
35ea0 64 20 44 45 4c 45 54 45 20 70 65 72 66 6f 72 6d  d DELETE perform
35eb0 61 6e 63 65 0a 2a 2a 20 69 6e 20 65 78 63 68 61  ance.** in excha
35ec0 6e 67 65 20 66 6f 72 20 61 20 6c 61 72 67 65 72  nge for a larger
35ed0 20 64 65 67 72 61 64 61 74 69 6f 6e 20 69 6e 20   degradation in 
35ee0 49 4e 53 45 52 54 20 61 6e 64 20 55 50 44 41 54  INSERT and UPDAT
35ef0 45 20 70 65 72 66 6f 72 6d 61 6e 63 65 2e 0a 2a  E performance..*
35f00 2a 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20 4e  * The value of N
35f10 4e 20 61 70 70 65 61 72 73 20 74 6f 20 67 69 76  N appears to giv
35f20 65 20 74 68 65 20 62 65 73 74 20 72 65 73 75 6c  e the best resul
35f30 74 73 20 6f 76 65 72 61 6c 6c 2e 0a 2a 2f 0a 23  ts overall..*/.#
35f40 64 65 66 69 6e 65 20 4e 4e 20 31 20 20 20 20 20  define NN 1     
35f50 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
35f60 72 20 6f 66 20 6e 65 69 67 68 62 6f 72 73 20 6f  r of neighbors o
35f70 6e 20 65 69 74 68 65 72 20 73 69 64 65 20 6f 66  n either side of
35f80 20 70 50 61 67 65 20 2a 2f 0a 23 64 65 66 69 6e   pPage */.#defin
35f90 65 20 4e 42 20 28 4e 4e 2a 32 2b 31 29 20 20 20  e NB (NN*2+1)   
35fa0 20 20 20 2f 2a 20 54 6f 74 61 6c 20 70 61 67 65     /* Total page
35fb0 73 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20 74 68  s involved in th
35fc0 65 20 62 61 6c 61 6e 63 65 20 2a 2f 0a 0a 0a 23  e balance */...#
35fd0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
35fe0 49 54 5f 51 55 49 43 4b 42 41 4c 41 4e 43 45 0a  IT_QUICKBALANCE.
35ff0 2f 2a 0a 2a 2a 20 54 68 69 73 20 76 65 72 73 69  /*.** This versi
36000 6f 6e 20 6f 66 20 62 61 6c 61 6e 63 65 28 29 20  on of balance() 
36010 68 61 6e 64 6c 65 73 20 74 68 65 20 63 6f 6d 6d  handles the comm
36020 6f 6e 20 73 70 65 63 69 61 6c 20 63 61 73 65 20  on special case 
36030 77 68 65 72 65 0a 2a 2a 20 61 20 6e 65 77 20 65  where.** a new e
36040 6e 74 72 79 20 69 73 20 62 65 69 6e 67 20 69 6e  ntry is being in
36050 73 65 72 74 65 64 20 6f 6e 20 74 68 65 20 65 78  serted on the ex
36060 74 72 65 6d 65 20 72 69 67 68 74 2d 65 6e 64 20  treme right-end 
36070 6f 66 20 74 68 65 0a 2a 2a 20 74 72 65 65 2c 20  of the.** tree, 
36080 69 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  in other words, 
36090 77 68 65 6e 20 74 68 65 20 6e 65 77 20 65 6e 74  when the new ent
360a0 72 79 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74  ry will become t
360b0 68 65 20 6c 61 72 67 65 73 74 0a 2a 2a 20 65 6e  he largest.** en
360c0 74 72 79 20 69 6e 20 74 68 65 20 74 72 65 65 2e  try in the tree.
360d0 0a 2a 2a 0a 2a 2a 20 49 6e 73 74 65 61 64 20 6f  .**.** Instead o
360e0 66 20 74 72 79 69 6e 67 20 74 6f 20 62 61 6c 61  f trying to bala
360f0 6e 63 65 20 74 68 65 20 33 20 72 69 67 68 74 2d  nce the 3 right-
36100 6d 6f 73 74 20 6c 65 61 66 20 70 61 67 65 73 2c  most leaf pages,
36110 20 6a 75 73 74 20 61 64 64 0a 2a 2a 20 61 20 6e   just add.** a n
36120 65 77 20 70 61 67 65 20 74 6f 20 74 68 65 20 72  ew page to the r
36130 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 61  ight-hand side a
36140 6e 64 20 70 75 74 20 74 68 65 20 6f 6e 65 20 6e  nd put the one n
36150 65 77 20 65 6e 74 72 79 20 69 6e 0a 2a 2a 20 74  ew entry in.** t
36160 68 61 74 20 70 61 67 65 2e 20 20 54 68 69 73 20  hat page.  This 
36170 6c 65 61 76 65 73 20 74 68 65 20 72 69 67 68 74  leaves the right
36180 20 73 69 64 65 20 6f 66 20 74 68 65 20 74 72 65   side of the tre
36190 65 20 73 6f 6d 65 77 68 61 74 0a 2a 2a 20 75 6e  e somewhat.** un
361a0 62 61 6c 61 6e 63 65 64 2e 20 20 42 75 74 20 6f  balanced.  But o
361b0 64 64 73 20 61 72 65 20 74 68 61 74 20 77 65 20  dds are that we 
361c0 77 69 6c 6c 20 62 65 20 69 6e 73 65 72 74 69 6e  will be insertin
361d0 67 20 6e 65 77 20 65 6e 74 72 69 65 73 0a 2a 2a  g new entries.**
361e0 20 61 74 20 74 68 65 20 65 6e 64 20 73 6f 6f 6e   at the end soon
361f0 20 61 66 74 65 72 77 61 72 64 73 20 73 6f 20 74   afterwards so t
36200 68 65 20 6e 65 61 72 6c 79 20 65 6d 70 74 79 20  he nearly empty 
36210 70 61 67 65 20 77 69 6c 6c 20 71 75 69 63 6b 6c  page will quickl
36220 79 0a 2a 2a 20 66 69 6c 6c 20 75 70 2e 20 20 4f  y.** fill up.  O
36230 6e 20 61 76 65 72 61 67 65 2e 0a 2a 2a 0a 2a 2a  n average..**.**
36240 20 70 50 61 67 65 20 69 73 20 74 68 65 20 6c 65   pPage is the le
36250 61 66 20 70 61 67 65 20 77 68 69 63 68 20 69 73  af page which is
36260 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   the right-most 
36270 70 61 67 65 20 69 6e 20 74 68 65 20 74 72 65 65  page in the tree
36280 2e 0a 2a 2a 20 70 50 61 72 65 6e 74 20 69 73 20  ..** pParent is 
36290 69 74 73 20 70 61 72 65 6e 74 2e 20 20 70 50 61  its parent.  pPa
362a0 67 65 20 6d 75 73 74 20 68 61 76 65 20 61 20 73  ge must have a s
362b0 69 6e 67 6c 65 20 6f 76 65 72 66 6c 6f 77 20 65  ingle overflow e
362c0 6e 74 72 79 0a 2a 2a 20 77 68 69 63 68 20 69 73  ntry.** which is
362d0 20 61 6c 73 6f 20 74 68 65 20 72 69 67 68 74 2d   also the right-
362e0 6d 6f 73 74 20 65 6e 74 72 79 20 6f 6e 20 74 68  most entry on th
362f0 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  e page..**.** Th
36300 65 20 70 53 70 61 63 65 20 62 75 66 66 65 72 20  e pSpace buffer 
36310 69 73 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65  is used to store
36320 20 61 20 74 65 6d 70 6f 72 61 72 79 20 63 6f 70   a temporary cop
36330 79 20 6f 66 20 74 68 65 20 64 69 76 69 64 65 72  y of the divider
36340 0a 2a 2a 20 63 65 6c 6c 20 74 68 61 74 20 77 69  .** cell that wi
36350 6c 6c 20 62 65 20 69 6e 73 65 72 74 65 64 20 69  ll be inserted i
36360 6e 74 6f 20 70 50 61 72 65 6e 74 2e 20 53 75 63  nto pParent. Suc
36370 68 20 61 20 63 65 6c 6c 20 63 6f 6e 73 69 73 74  h a cell consist
36380 73 20 6f 66 20 61 20 34 0a 2a 2a 20 62 79 74 65  s of a 4.** byte
36390 20 70 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 6c   page number fol
363a0 6c 6f 77 65 64 20 62 79 20 61 20 76 61 72 69 61  lowed by a varia
363b0 62 6c 65 20 6c 65 6e 67 74 68 20 69 6e 74 65 67  ble length integ
363c0 65 72 2e 20 49 6e 20 6f 74 68 65 72 0a 2a 2a 20  er. In other.** 
363d0 77 6f 72 64 73 2c 20 61 74 20 6d 6f 73 74 20 31  words, at most 1
363e0 33 20 62 79 74 65 73 2e 20 48 65 6e 63 65 20 74  3 bytes. Hence t
363f0 68 65 20 70 53 70 61 63 65 20 62 75 66 66 65 72  he pSpace buffer
36400 20 6d 75 73 74 20 62 65 20 61 74 0a 2a 2a 20 6c   must be at.** l
36410 65 61 73 74 20 31 33 20 62 79 74 65 73 20 69 6e  east 13 bytes in
36420 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   size..*/.static
36430 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f 71 75 69   int balance_qui
36440 63 6b 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 72  ck(MemPage *pPar
36450 65 6e 74 2c 20 4d 65 6d 50 61 67 65 20 2a 70 50  ent, MemPage *pP
36460 61 67 65 2c 20 75 38 20 2a 70 53 70 61 63 65 29  age, u8 *pSpace)
36470 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 63 6f  {.  BtShared *co
36480 6e 73 74 20 70 42 74 20 3d 20 70 50 61 67 65 2d  nst pBt = pPage-
36490 3e 70 42 74 3b 20 20 20 20 2f 2a 20 42 2d 54 72  >pBt;    /* B-Tr
364a0 65 65 20 44 61 74 61 62 61 73 65 20 2a 2f 0a 20  ee Database */. 
364b0 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 3b 20   MemPage *pNew; 
364c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
364d0 20 20 20 20 20 20 2f 2a 20 4e 65 77 6c 79 20 61        /* Newly a
364e0 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 20 2a 2f  llocated page */
364f0 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
36500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36510 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
36520 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 50 67 6e 6f  n Code */.  Pgno
36530 20 70 67 6e 6f 4e 65 77 3b 20 20 20 20 20 20 20   pgnoNew;       
36540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36550 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20   /* Page number 
36560 6f 66 20 70 4e 65 77 20 2a 2f 0a 0a 20 20 61 73  of pNew */..  as
36570 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
36580 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
36590 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
365a0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
365b0 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
365c0 28 70 50 61 72 65 6e 74 2d 3e 70 44 62 50 61 67  (pParent->pDbPag
365d0 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  e) );.  assert( 
365e0 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
365f0 3d 3d 31 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 69  ==1 );..  /* Thi
36600 73 20 65 72 72 6f 72 20 63 6f 6e 64 69 74 69 6f  s error conditio
36610 6e 20 69 73 20 6e 6f 77 20 63 61 75 67 68 74 20  n is now caught 
36620 70 72 69 6f 72 20 74 6f 20 72 65 61 63 68 69 6e  prior to reachin
36630 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  g this function 
36640 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e  */.  if( pPage->
36650 6e 43 65 6c 6c 3d 3d 30 20 29 20 72 65 74 75 72  nCell==0 ) retur
36660 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
36670 5f 42 4b 50 54 3b 0a 0a 20 20 2f 2a 20 41 6c 6c  _BKPT;..  /* All
36680 6f 63 61 74 65 20 61 20 6e 65 77 20 70 61 67 65  ocate a new page
36690 2e 20 54 68 69 73 20 70 61 67 65 20 77 69 6c 6c  . This page will
366a0 20 62 65 63 6f 6d 65 20 74 68 65 20 72 69 67 68   become the righ
366b0 74 2d 73 69 62 6c 69 6e 67 20 6f 66 20 0a 20 20  t-sibling of .  
366c0 2a 2a 20 70 50 61 67 65 2e 20 4d 61 6b 65 20 74  ** pPage. Make t
366d0 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 20 77  he parent page w
366e0 72 69 74 61 62 6c 65 2c 20 73 6f 20 74 68 61 74  ritable, so that
366f0 20 74 68 65 20 6e 65 77 20 64 69 76 69 64 65 72   the new divider
36700 20 63 65 6c 6c 0a 20 20 2a 2a 20 6d 61 79 20 62   cell.  ** may b
36710 65 20 69 6e 73 65 72 74 65 64 2e 20 49 66 20 62  e inserted. If b
36720 6f 74 68 20 74 68 65 73 65 20 6f 70 65 72 61 74  oth these operat
36730 69 6f 6e 73 20 61 72 65 20 73 75 63 63 65 73 73  ions are success
36740 66 75 6c 2c 20 70 72 6f 63 65 65 64 2e 0a 20 20  ful, proceed..  
36750 2a 2f 0a 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61  */.  rc = alloca
36760 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c  teBtreePage(pBt,
36770 20 26 70 4e 65 77 2c 20 26 70 67 6e 6f 4e 65 77   &pNew, &pgnoNew
36780 2c 20 30 2c 20 30 29 3b 0a 0a 20 20 69 66 28 20  , 0, 0);..  if( 
36790 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
367a0 0a 0a 20 20 20 20 75 38 20 2a 70 4f 75 74 20 3d  ..    u8 *pOut =
367b0 20 26 70 53 70 61 63 65 5b 34 5d 3b 0a 20 20 20   &pSpace[4];.   
367c0 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20 70 50 61   u8 *pCell = pPa
367d0 67 65 2d 3e 61 70 4f 76 66 6c 5b 30 5d 3b 0a 20  ge->apOvfl[0];. 
367e0 20 20 20 75 31 36 20 73 7a 43 65 6c 6c 20 3d 20     u16 szCell = 
367f0 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67  cellSizePtr(pPag
36800 65 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20 75  e, pCell);.    u
36810 38 20 2a 70 53 74 6f 70 3b 0a 0a 20 20 20 20 61  8 *pStop;..    a
36820 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
36830 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
36840 4e 65 77 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  New->pDbPage) );
36850 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
36860 67 65 2d 3e 61 44 61 74 61 5b 30 5d 3d 3d 28 50  ge->aData[0]==(P
36870 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45  TF_INTKEY|PTF_LE
36880 41 46 44 41 54 41 7c 50 54 46 5f 4c 45 41 46 29  AFDATA|PTF_LEAF)
36890 20 29 3b 0a 20 20 20 20 7a 65 72 6f 50 61 67 65   );.    zeroPage
368a0 28 70 4e 65 77 2c 20 50 54 46 5f 49 4e 54 4b 45  (pNew, PTF_INTKE
368b0 59 7c 50 54 46 5f 4c 45 41 46 44 41 54 41 7c 50  Y|PTF_LEAFDATA|P
368c0 54 46 5f 4c 45 41 46 29 3b 0a 20 20 20 20 72 65  TF_LEAF);.    re
368d0 62 75 69 6c 64 50 61 67 65 28 70 4e 65 77 2c 20  buildPage(pNew, 
368e0 31 2c 20 26 70 43 65 6c 6c 2c 20 26 73 7a 43 65  1, &pCell, &szCe
368f0 6c 6c 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e  ll);.    pNew->n
36900 46 72 65 65 20 3d 20 70 42 74 2d 3e 75 73 61 62  Free = pBt->usab
36910 6c 65 53 69 7a 65 20 2d 20 70 4e 65 77 2d 3e 63  leSize - pNew->c
36920 65 6c 6c 4f 66 66 73 65 74 20 2d 20 32 20 2d 20  ellOffset - 2 - 
36930 73 7a 43 65 6c 6c 3b 0a 0a 20 20 20 20 2f 2a 20  szCell;..    /* 
36940 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 61 75  If this is an au
36950 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61  to-vacuum databa
36960 73 65 2c 20 75 70 64 61 74 65 20 74 68 65 20 70  se, update the p
36970 6f 69 6e 74 65 72 20 6d 61 70 0a 20 20 20 20 2a  ointer map.    *
36980 2a 20 77 69 74 68 20 65 6e 74 72 69 65 73 20 66  * with entries f
36990 6f 72 20 74 68 65 20 6e 65 77 20 70 61 67 65 2c  or the new page,
369a0 20 61 6e 64 20 61 6e 79 20 70 6f 69 6e 74 65 72   and any pointer
369b0 20 66 72 6f 6d 20 74 68 65 20 0a 20 20 20 20 2a   from the .    *
369c0 2a 20 63 65 6c 6c 20 6f 6e 20 74 68 65 20 70 61  * cell on the pa
369d0 67 65 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f  ge to an overflo
369e0 77 20 70 61 67 65 2e 20 49 66 20 65 69 74 68 65  w page. If eithe
369f0 72 20 6f 66 20 74 68 65 73 65 0a 20 20 20 20 2a  r of these.    *
36a00 2a 20 6f 70 65 72 61 74 69 6f 6e 73 20 66 61 69  * operations fai
36a10 6c 73 2c 20 74 68 65 20 72 65 74 75 72 6e 20 63  ls, the return c
36a20 6f 64 65 20 69 73 20 73 65 74 2c 20 62 75 74 20  ode is set, but 
36a30 74 68 65 20 63 6f 6e 74 65 6e 74 73 0a 20 20 20  the contents.   
36a40 20 2a 2a 20 6f 66 20 74 68 65 20 70 61 72 65 6e   ** of the paren
36a50 74 20 70 61 67 65 20 61 72 65 20 73 74 69 6c 6c  t page are still
36a60 20 6d 61 6e 69 70 75 6c 61 74 65 64 20 62 79 20   manipulated by 
36a70 74 68 68 20 63 6f 64 65 20 62 65 6c 6f 77 2e 0a  thh code below..
36a80 20 20 20 20 2a 2a 20 54 68 61 74 20 69 73 20 4f      ** That is O
36a90 6b 2c 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74  k, at this point
36aa0 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65   the parent page
36ab0 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
36ac0 6f 0a 20 20 20 20 2a 2a 20 62 65 20 6d 61 72 6b  o.    ** be mark
36ad0 65 64 20 61 73 20 64 69 72 74 79 2e 20 52 65 74  ed as dirty. Ret
36ae0 75 72 6e 69 6e 67 20 61 6e 20 65 72 72 6f 72 20  urning an error 
36af0 63 6f 64 65 20 77 69 6c 6c 20 63 61 75 73 65 20  code will cause 
36b00 61 0a 20 20 20 20 2a 2a 20 72 6f 6c 6c 62 61 63  a.    ** rollbac
36b10 6b 2c 20 75 6e 64 6f 69 6e 67 20 61 6e 79 20 63  k, undoing any c
36b20 68 61 6e 67 65 73 20 6d 61 64 65 20 74 6f 20 74  hanges made to t
36b30 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 2e 0a  he parent page..
36b40 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 49      */.    if( I
36b50 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20  SAUTOVACUUM ){. 
36b60 20 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70       ptrmapPut(p
36b70 42 74 2c 20 70 67 6e 6f 4e 65 77 2c 20 50 54 52  Bt, pgnoNew, PTR
36b80 4d 41 50 5f 42 54 52 45 45 2c 20 70 50 61 72 65  MAP_BTREE, pPare
36b90 6e 74 2d 3e 70 67 6e 6f 2c 20 26 72 63 29 3b 0a  nt->pgno, &rc);.
36ba0 20 20 20 20 20 20 69 66 28 20 73 7a 43 65 6c 6c        if( szCell
36bb0 3e 70 4e 65 77 2d 3e 6d 69 6e 4c 6f 63 61 6c 20  >pNew->minLocal 
36bc0 29 7b 0a 20 20 20 20 20 20 20 20 70 74 72 6d 61  ){.        ptrma
36bd0 70 50 75 74 4f 76 66 6c 50 74 72 28 70 4e 65 77  pPutOvflPtr(pNew
36be0 2c 20 70 43 65 6c 6c 2c 20 26 72 63 29 3b 0a 20  , pCell, &rc);. 
36bf0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a       }.    }.  .
36c00 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 61 20      /* Create a 
36c10 64 69 76 69 64 65 72 20 63 65 6c 6c 20 74 6f 20  divider cell to 
36c20 69 6e 73 65 72 74 20 69 6e 74 6f 20 70 50 61 72  insert into pPar
36c30 65 6e 74 2e 20 54 68 65 20 64 69 76 69 64 65 72  ent. The divider
36c40 20 63 65 6c 6c 0a 20 20 20 20 2a 2a 20 63 6f 6e   cell.    ** con
36c50 73 69 73 74 73 20 6f 66 20 61 20 34 2d 62 79 74  sists of a 4-byt
36c60 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 28 74  e page number (t
36c70 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  he page number o
36c80 66 20 70 50 61 67 65 29 20 61 6e 64 0a 20 20 20  f pPage) and.   
36c90 20 2a 2a 20 61 20 76 61 72 69 61 62 6c 65 20 6c   ** a variable l
36ca0 65 6e 67 74 68 20 6b 65 79 20 76 61 6c 75 65 20  ength key value 
36cb0 28 77 68 69 63 68 20 6d 75 73 74 20 62 65 20 74  (which must be t
36cc0 68 65 20 73 61 6d 65 20 76 61 6c 75 65 20 61 73  he same value as
36cd0 20 74 68 65 0a 20 20 20 20 2a 2a 20 6c 61 72 67   the.    ** larg
36ce0 65 73 74 20 6b 65 79 20 6f 6e 20 70 50 61 67 65  est key on pPage
36cf0 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  )..    **.    **
36d00 20 54 6f 20 66 69 6e 64 20 74 68 65 20 6c 61 72   To find the lar
36d10 67 65 73 74 20 6b 65 79 20 76 61 6c 75 65 20 6f  gest key value o
36d20 6e 20 70 50 61 67 65 2c 20 66 69 72 73 74 20 66  n pPage, first f
36d30 69 6e 64 20 74 68 65 20 72 69 67 68 74 2d 6d 6f  ind the right-mo
36d40 73 74 20 0a 20 20 20 20 2a 2a 20 63 65 6c 6c 20  st .    ** cell 
36d50 6f 6e 20 70 50 61 67 65 2e 20 54 68 65 20 66 69  on pPage. The fi
36d60 72 73 74 20 74 77 6f 20 66 69 65 6c 64 73 20 6f  rst two fields o
36d70 66 20 74 68 69 73 20 63 65 6c 6c 20 61 72 65 20  f this cell are 
36d80 74 68 65 20 0a 20 20 20 20 2a 2a 20 72 65 63 6f  the .    ** reco
36d90 72 64 2d 6c 65 6e 67 74 68 20 28 61 20 76 61 72  rd-length (a var
36da0 69 61 62 6c 65 20 6c 65 6e 67 74 68 20 69 6e 74  iable length int
36db0 65 67 65 72 20 61 74 20 6d 6f 73 74 20 33 32 2d  eger at most 32-
36dc0 62 69 74 73 20 69 6e 20 73 69 7a 65 29 0a 20 20  bits in size).  
36dd0 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 6b 65 79    ** and the key
36de0 20 76 61 6c 75 65 20 28 61 20 76 61 72 69 61 62   value (a variab
36df0 6c 65 20 6c 65 6e 67 74 68 20 69 6e 74 65 67 65  le length intege
36e00 72 2c 20 6d 61 79 20 68 61 76 65 20 61 6e 79 20  r, may have any 
36e10 76 61 6c 75 65 29 2e 0a 20 20 20 20 2a 2a 20 54  value)..    ** T
36e20 68 65 20 66 69 72 73 74 20 6f 66 20 74 68 65 20  he first of the 
36e30 77 68 69 6c 65 28 2e 2e 2e 29 20 6c 6f 6f 70 73  while(...) loops
36e40 20 62 65 6c 6f 77 20 73 6b 69 70 73 20 6f 76 65   below skips ove
36e50 72 20 74 68 65 20 72 65 63 6f 72 64 2d 6c 65 6e  r the record-len
36e60 67 74 68 0a 20 20 20 20 2a 2a 20 66 69 65 6c 64  gth.    ** field
36e70 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 77 68 69  . The second whi
36e80 6c 65 28 2e 2e 2e 29 20 6c 6f 6f 70 20 63 6f 70  le(...) loop cop
36e90 69 65 73 20 74 68 65 20 6b 65 79 20 76 61 6c 75  ies the key valu
36ea0 65 20 66 72 6f 6d 20 74 68 65 0a 20 20 20 20 2a  e from the.    *
36eb0 2a 20 63 65 6c 6c 20 6f 6e 20 70 50 61 67 65 20  * cell on pPage 
36ec0 69 6e 74 6f 20 74 68 65 20 70 53 70 61 63 65 20  into the pSpace 
36ed0 62 75 66 66 65 72 2e 0a 20 20 20 20 2a 2f 0a 20  buffer..    */. 
36ee0 20 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43     pCell = findC
36ef0 65 6c 6c 28 70 50 61 67 65 2c 20 70 50 61 67 65  ell(pPage, pPage
36f00 2d 3e 6e 43 65 6c 6c 2d 31 29 3b 0a 20 20 20 20  ->nCell-1);.    
36f10 70 53 74 6f 70 20 3d 20 26 70 43 65 6c 6c 5b 39  pStop = &pCell[9
36f20 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 2a  ];.    while( (*
36f30 28 70 43 65 6c 6c 2b 2b 29 26 30 78 38 30 29 20  (pCell++)&0x80) 
36f40 26 26 20 70 43 65 6c 6c 3c 70 53 74 6f 70 20 29  && pCell<pStop )
36f50 3b 0a 20 20 20 20 70 53 74 6f 70 20 3d 20 26 70  ;.    pStop = &p
36f60 43 65 6c 6c 5b 39 5d 3b 0a 20 20 20 20 77 68 69  Cell[9];.    whi
36f70 6c 65 28 20 28 28 2a 28 70 4f 75 74 2b 2b 29 20  le( ((*(pOut++) 
36f80 3d 20 2a 28 70 43 65 6c 6c 2b 2b 29 29 26 30 78  = *(pCell++))&0x
36f90 38 30 29 20 26 26 20 70 43 65 6c 6c 3c 70 53 74  80) && pCell<pSt
36fa0 6f 70 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 6e  op );..    /* In
36fb0 73 65 72 74 20 74 68 65 20 6e 65 77 20 64 69 76  sert the new div
36fc0 69 64 65 72 20 63 65 6c 6c 20 69 6e 74 6f 20 70  ider cell into p
36fd0 50 61 72 65 6e 74 2e 20 2a 2f 0a 20 20 20 20 69  Parent. */.    i
36fe0 6e 73 65 72 74 43 65 6c 6c 28 70 50 61 72 65 6e  nsertCell(pParen
36ff0 74 2c 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c  t, pParent->nCel
37000 6c 2c 20 70 53 70 61 63 65 2c 20 28 69 6e 74 29  l, pSpace, (int)
37010 28 70 4f 75 74 2d 70 53 70 61 63 65 29 2c 0a 20  (pOut-pSpace),. 
37020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c                0,
37030 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 26 72   pPage->pgno, &r
37040 63 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20  c);..    /* Set 
37050 74 68 65 20 72 69 67 68 74 2d 63 68 69 6c 64 20  the right-child 
37060 70 6f 69 6e 74 65 72 20 6f 66 20 70 50 61 72 65  pointer of pPare
37070 6e 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74  nt to point to t
37080 68 65 20 6e 65 77 20 70 61 67 65 2e 20 2a 2f 0a  he new page. */.
37090 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50      put4byte(&pP
370a0 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61  arent->aData[pPa
370b0 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b  rent->hdrOffset+
370c0 38 5d 2c 20 70 67 6e 6f 4e 65 77 29 3b 0a 20 20  8], pgnoNew);.  
370d0 0a 20 20 20 20 2f 2a 20 52 65 6c 65 61 73 65 20  .    /* Release 
370e0 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 74 6f  the reference to
370f0 20 74 68 65 20 6e 65 77 20 70 61 67 65 2e 20 2a   the new page. *
37100 2f 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67  /.    releasePag
37110 65 28 70 4e 65 77 29 3b 0a 20 20 7d 0a 0a 20 20  e(pNew);.  }..  
37120 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e  return rc;.}.#en
37130 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
37140 49 54 5f 51 55 49 43 4b 42 41 4c 41 4e 43 45 20  IT_QUICKBALANCE 
37150 2a 2f 0a 0a 23 69 66 20 30 0a 2f 2a 0a 2a 2a 20  */..#if 0./*.** 
37160 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f  This function do
37170 65 73 20 6e 6f 74 20 63 6f 6e 74 72 69 62 75 74  es not contribut
37180 65 20 61 6e 79 74 68 69 6e 67 20 74 6f 20 74 68  e anything to th
37190 65 20 6f 70 65 72 61 74 69 6f 6e 20 6f 66 20 53  e operation of S
371a0 51 4c 69 74 65 2e 0a 2a 2a 20 69 74 20 69 73 20  QLite..** it is 
371b0 73 6f 6d 65 74 69 6d 65 73 20 61 63 74 69 76 61  sometimes activa
371c0 74 65 64 20 74 65 6d 70 6f 72 61 72 69 6c 79 20  ted temporarily 
371d0 77 68 69 6c 65 20 64 65 62 75 67 67 69 6e 67 20  while debugging 
371e0 63 6f 64 65 20 72 65 73 70 6f 6e 73 69 62 6c 65  code responsible
371f0 20 0a 2a 2a 20 66 6f 72 20 73 65 74 74 69 6e 67   .** for setting
37200 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74   pointer-map ent
37210 72 69 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ries..*/.static 
37220 69 6e 74 20 70 74 72 6d 61 70 43 68 65 63 6b 50  int ptrmapCheckP
37230 61 67 65 73 28 4d 65 6d 50 61 67 65 20 2a 2a 61  ages(MemPage **a
37240 70 50 61 67 65 2c 20 69 6e 74 20 6e 50 61 67 65  pPage, int nPage
37250 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  ){.  int i, j;. 
37260 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 50 61 67   for(i=0; i<nPag
37270 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 50 67 6e  e; i++){.    Pgn
37280 6f 20 6e 3b 0a 20 20 20 20 75 38 20 65 3b 0a 20  o n;.    u8 e;. 
37290 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67     MemPage *pPag
372a0 65 20 3d 20 61 70 50 61 67 65 5b 69 5d 3b 0a 20  e = apPage[i];. 
372b0 20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74     BtShared *pBt
372c0 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20   = pPage->pBt;. 
372d0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
372e0 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 0a 20 20 20  ->isInit );..   
372f0 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 50 61 67   for(j=0; j<pPag
37300 65 2d 3e 6e 43 65 6c 6c 3b 20 6a 2b 2b 29 7b 0a  e->nCell; j++){.
37310 20 20 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69        CellInfo i
37320 6e 66 6f 3b 0a 20 20 20 20 20 20 75 38 20 2a 7a  nfo;.      u8 *z
37330 3b 0a 20 20 20 20 20 0a 20 20 20 20 20 20 7a 20  ;.     .      z 
37340 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  = findCell(pPage
37350 2c 20 6a 29 3b 0a 20 20 20 20 20 20 62 74 72 65  , j);.      btre
37360 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50  eParseCellPtr(pP
37370 61 67 65 2c 20 7a 2c 20 26 69 6e 66 6f 29 3b 0a  age, z, &info);.
37380 20 20 20 20 20 20 69 66 28 20 69 6e 66 6f 2e 69        if( info.i
37390 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20  Overflow ){.    
373a0 20 20 20 20 50 67 6e 6f 20 6f 76 66 6c 20 3d 20      Pgno ovfl = 
373b0 67 65 74 34 62 79 74 65 28 26 7a 5b 69 6e 66 6f  get4byte(&z[info
373c0 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a 20 20  .iOverflow]);.  
373d0 20 20 20 20 20 20 70 74 72 6d 61 70 47 65 74 28        ptrmapGet(
373e0 70 42 74 2c 20 6f 76 66 6c 2c 20 26 65 2c 20 26  pBt, ovfl, &e, &
373f0 6e 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  n);.        asse
37400 72 74 28 20 6e 3d 3d 70 50 61 67 65 2d 3e 70 67  rt( n==pPage->pg
37410 6e 6f 20 26 26 20 65 3d 3d 50 54 52 4d 41 50 5f  no && e==PTRMAP_
37420 4f 56 45 52 46 4c 4f 57 31 20 29 3b 0a 20 20 20  OVERFLOW1 );.   
37430 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21     }.      if( !
37440 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
37450 20 20 20 20 20 20 20 50 67 6e 6f 20 63 68 69 6c         Pgno chil
37460 64 20 3d 20 67 65 74 34 62 79 74 65 28 7a 29 3b  d = get4byte(z);
37470 0a 20 20 20 20 20 20 20 20 70 74 72 6d 61 70 47  .        ptrmapG
37480 65 74 28 70 42 74 2c 20 63 68 69 6c 64 2c 20 26  et(pBt, child, &
37490 65 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20 20 20  e, &n);.        
374a0 61 73 73 65 72 74 28 20 6e 3d 3d 70 50 61 67 65  assert( n==pPage
374b0 2d 3e 70 67 6e 6f 20 26 26 20 65 3d 3d 50 54 52  ->pgno && e==PTR
374c0 4d 41 50 5f 42 54 52 45 45 20 29 3b 0a 20 20 20  MAP_BTREE );.   
374d0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
374e0 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  f( !pPage->leaf 
374f0 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 63 68  ){.      Pgno ch
37500 69 6c 64 20 3d 20 67 65 74 34 62 79 74 65 28 26  ild = get4byte(&
37510 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61  pPage->aData[pPa
37520 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  ge->hdrOffset+8]
37530 29 3b 0a 20 20 20 20 20 20 70 74 72 6d 61 70 47  );.      ptrmapG
37540 65 74 28 70 42 74 2c 20 63 68 69 6c 64 2c 20 26  et(pBt, child, &
37550 65 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20 61 73  e, &n);.      as
37560 73 65 72 74 28 20 6e 3d 3d 70 50 61 67 65 2d 3e  sert( n==pPage->
37570 70 67 6e 6f 20 26 26 20 65 3d 3d 50 54 52 4d 41  pgno && e==PTRMA
37580 50 5f 42 54 52 45 45 20 29 3b 0a 20 20 20 20 7d  P_BTREE );.    }
37590 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b  .  }.  return 1;
375a0 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
375b0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
375c0 73 20 75 73 65 64 20 74 6f 20 63 6f 70 79 20 74  s used to copy t
375d0 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
375e0 68 65 20 62 2d 74 72 65 65 20 6e 6f 64 65 20 73  he b-tree node s
375f0 74 6f 72 65 64 20 0a 2a 2a 20 6f 6e 20 70 61 67  tored .** on pag
37600 65 20 70 46 72 6f 6d 20 74 6f 20 70 61 67 65 20  e pFrom to page 
37610 70 54 6f 2e 20 49 66 20 70 61 67 65 20 70 46 72  pTo. If page pFr
37620 6f 6d 20 77 61 73 20 6e 6f 74 20 61 20 6c 65 61  om was not a lea
37630 66 20 70 61 67 65 2c 20 74 68 65 6e 0a 2a 2a 20  f page, then.** 
37640 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  the pointer-map 
37650 65 6e 74 72 69 65 73 20 66 6f 72 20 65 61 63 68  entries for each
37660 20 63 68 69 6c 64 20 70 61 67 65 20 61 72 65 20   child page are 
37670 75 70 64 61 74 65 64 20 73 6f 20 74 68 61 74 20  updated so that 
37680 74 68 65 0a 2a 2a 20 70 61 72 65 6e 74 20 70 61  the.** parent pa
37690 67 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  ge stored in the
376a0 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 69 73 20   pointer map is 
376b0 70 61 67 65 20 70 54 6f 2e 20 49 66 20 70 46 72  page pTo. If pFr
376c0 6f 6d 20 63 6f 6e 74 61 69 6e 65 64 0a 2a 2a 20  om contained.** 
376d0 61 6e 79 20 63 65 6c 6c 73 20 77 69 74 68 20 6f  any cells with o
376e0 76 65 72 66 6c 6f 77 20 70 61 67 65 20 70 6f 69  verflow page poi
376f0 6e 74 65 72 73 2c 20 74 68 65 6e 20 74 68 65 20  nters, then the 
37700 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 70 6f  corresponding po
37710 69 6e 74 65 72 0a 2a 2a 20 6d 61 70 20 65 6e 74  inter.** map ent
37720 72 69 65 73 20 61 72 65 20 61 6c 73 6f 20 75 70  ries are also up
37730 64 61 74 65 64 20 73 6f 20 74 68 61 74 20 74 68  dated so that th
37740 65 20 70 61 72 65 6e 74 20 70 61 67 65 20 69 73  e parent page is
37750 20 70 61 67 65 20 70 54 6f 2e 0a 2a 2a 0a 2a 2a   page pTo..**.**
37760 20 49 66 20 70 46 72 6f 6d 20 69 73 20 63 75 72   If pFrom is cur
37770 72 65 6e 74 6c 79 20 63 61 72 72 79 69 6e 67 20  rently carrying 
37780 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c  any overflow cel
37790 6c 73 20 28 65 6e 74 72 69 65 73 20 69 6e 20 74  ls (entries in t
377a0 68 65 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e 61 70  he.** MemPage.ap
377b0 4f 76 66 6c 5b 5d 20 61 72 72 61 79 29 2c 20 74  Ovfl[] array), t
377c0 68 65 79 20 61 72 65 20 6e 6f 74 20 63 6f 70 69  hey are not copi
377d0 65 64 20 74 6f 20 70 54 6f 2e 20 0a 2a 2a 0a 2a  ed to pTo. .**.*
377e0 2a 20 42 65 66 6f 72 65 20 72 65 74 75 72 6e 69  * Before returni
377f0 6e 67 2c 20 70 61 67 65 20 70 54 6f 20 69 73 20  ng, page pTo is 
37800 72 65 69 6e 69 74 69 61 6c 69 7a 65 64 20 75 73  reinitialized us
37810 69 6e 67 20 62 74 72 65 65 49 6e 69 74 50 61 67  ing btreeInitPag
37820 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  e()..**.** The p
37830 65 72 66 6f 72 6d 61 6e 63 65 20 6f 66 20 74 68  erformance of th
37840 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6e  is function is n
37850 6f 74 20 63 72 69 74 69 63 61 6c 2e 20 49 74 20  ot critical. It 
37860 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 62 79 20  is only used by 
37870 0a 2a 2a 20 74 68 65 20 62 61 6c 61 6e 63 65 5f  .** the balance_
37880 73 68 61 6c 6c 6f 77 65 72 28 29 20 61 6e 64 20  shallower() and 
37890 62 61 6c 61 6e 63 65 5f 64 65 65 70 65 72 28 29  balance_deeper()
378a0 20 70 72 6f 63 65 64 75 72 65 73 2c 20 6e 65 69   procedures, nei
378b0 74 68 65 72 20 6f 66 0a 2a 2a 20 77 68 69 63 68  ther of.** which
378c0 20 61 72 65 20 63 61 6c 6c 65 64 20 6f 66 74 65   are called ofte
378d0 6e 20 75 6e 64 65 72 20 6e 6f 72 6d 61 6c 20 63  n under normal c
378e0 69 72 63 75 6d 73 74 61 6e 63 65 73 2e 0a 2a 2f  ircumstances..*/
378f0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 70  .static void cop
37900 79 4e 6f 64 65 43 6f 6e 74 65 6e 74 28 4d 65 6d  yNodeContent(Mem
37910 50 61 67 65 20 2a 70 46 72 6f 6d 2c 20 4d 65 6d  Page *pFrom, Mem
37920 50 61 67 65 20 2a 70 54 6f 2c 20 69 6e 74 20 2a  Page *pTo, int *
37930 70 52 43 29 7b 0a 20 20 69 66 28 20 28 2a 70 52  pRC){.  if( (*pR
37940 43 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  C)==SQLITE_OK ){
37950 0a 20 20 20 20 42 74 53 68 61 72 65 64 20 2a 20  .    BtShared * 
37960 63 6f 6e 73 74 20 70 42 74 20 3d 20 70 46 72 6f  const pBt = pFro
37970 6d 2d 3e 70 42 74 3b 0a 20 20 20 20 75 38 20 2a  m->pBt;.    u8 *
37980 20 63 6f 6e 73 74 20 61 46 72 6f 6d 20 3d 20 70   const aFrom = p
37990 46 72 6f 6d 2d 3e 61 44 61 74 61 3b 0a 20 20 20  From->aData;.   
379a0 20 75 38 20 2a 20 63 6f 6e 73 74 20 61 54 6f 20   u8 * const aTo 
379b0 3d 20 70 54 6f 2d 3e 61 44 61 74 61 3b 0a 20 20  = pTo->aData;.  
379c0 20 20 69 6e 74 20 63 6f 6e 73 74 20 69 46 72 6f    int const iFro
379d0 6d 48 64 72 20 3d 20 70 46 72 6f 6d 2d 3e 68 64  mHdr = pFrom->hd
379e0 72 4f 66 66 73 65 74 3b 0a 20 20 20 20 69 6e 74  rOffset;.    int
379f0 20 63 6f 6e 73 74 20 69 54 6f 48 64 72 20 3d 20   const iToHdr = 
37a00 28 28 70 54 6f 2d 3e 70 67 6e 6f 3d 3d 31 29 20  ((pTo->pgno==1) 
37a10 3f 20 31 30 30 20 3a 20 30 29 3b 0a 20 20 20 20  ? 100 : 0);.    
37a20 69 6e 74 20 72 63 3b 0a 20 20 20 20 69 6e 74 20  int rc;.    int 
37a30 69 44 61 74 61 3b 0a 20 20 0a 20 20 0a 20 20 20  iData;.  .  .   
37a40 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e   assert( pFrom->
37a50 69 73 49 6e 69 74 20 29 3b 0a 20 20 20 20 61 73  isInit );.    as
37a60 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 6e 46 72  sert( pFrom->nFr
37a70 65 65 3e 3d 69 54 6f 48 64 72 20 29 3b 0a 20 20  ee>=iToHdr );.  
37a80 20 20 61 73 73 65 72 74 28 20 67 65 74 32 62 79    assert( get2by
37a90 74 65 28 26 61 46 72 6f 6d 5b 69 46 72 6f 6d 48  te(&aFrom[iFromH
37aa0 64 72 2b 35 5d 29 20 3c 3d 20 28 69 6e 74 29 70  dr+5]) <= (int)p
37ab0 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29  Bt->usableSize )
37ac0 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 43 6f 70 79  ;.  .    /* Copy
37ad0 20 74 68 65 20 62 2d 74 72 65 65 20 6e 6f 64 65   the b-tree node
37ae0 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 70 61   content from pa
37af0 67 65 20 70 46 72 6f 6d 20 74 6f 20 70 61 67 65  ge pFrom to page
37b00 20 70 54 6f 2e 20 2a 2f 0a 20 20 20 20 69 44 61   pTo. */.    iDa
37b10 74 61 20 3d 20 67 65 74 32 62 79 74 65 28 26 61  ta = get2byte(&a
37b20 46 72 6f 6d 5b 69 46 72 6f 6d 48 64 72 2b 35 5d  From[iFromHdr+5]
37b30 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 61  );.    memcpy(&a
37b40 54 6f 5b 69 44 61 74 61 5d 2c 20 26 61 46 72 6f  To[iData], &aFro
37b50 6d 5b 69 44 61 74 61 5d 2c 20 70 42 74 2d 3e 75  m[iData], pBt->u
37b60 73 61 62 6c 65 53 69 7a 65 2d 69 44 61 74 61 29  sableSize-iData)
37b70 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 61 54  ;.    memcpy(&aT
37b80 6f 5b 69 54 6f 48 64 72 5d 2c 20 26 61 46 72 6f  o[iToHdr], &aFro
37b90 6d 5b 69 46 72 6f 6d 48 64 72 5d 2c 20 70 46 72  m[iFromHdr], pFr
37ba0 6f 6d 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 2b  om->cellOffset +
37bb0 20 32 2a 70 46 72 6f 6d 2d 3e 6e 43 65 6c 6c 29   2*pFrom->nCell)
37bc0 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 52 65 69 6e  ;.  .    /* Rein
37bd0 69 74 69 61 6c 69 7a 65 20 70 61 67 65 20 70 54  itialize page pT
37be0 6f 20 73 6f 20 74 68 61 74 20 74 68 65 20 63 6f  o so that the co
37bf0 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 4d 65  ntents of the Me
37c00 6d 50 61 67 65 20 73 74 72 75 63 74 75 72 65 0a  mPage structure.
37c10 20 20 20 20 2a 2a 20 6d 61 74 63 68 20 74 68 65      ** match the
37c20 20 6e 65 77 20 64 61 74 61 2e 20 54 68 65 20 69   new data. The i
37c30 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 6f 66  nitialization of
37c40 20 70 54 6f 20 63 61 6e 20 61 63 74 75 61 6c 6c   pTo can actuall
37c50 79 20 66 61 69 6c 20 75 6e 64 65 72 0a 20 20 20  y fail under.   
37c60 20 2a 2a 20 66 61 69 72 6c 79 20 6f 62 73 63 75   ** fairly obscu
37c70 72 65 20 63 69 72 63 75 6d 73 74 61 6e 63 65 73  re circumstances
37c80 2c 20 65 76 65 6e 20 74 68 6f 75 67 68 20 69 74  , even though it
37c90 20 69 73 20 61 20 63 6f 70 79 20 6f 66 20 69 6e   is a copy of in
37ca0 69 74 69 61 6c 69 7a 65 64 20 0a 20 20 20 20 2a  itialized .    *
37cb0 2a 20 70 61 67 65 20 70 46 72 6f 6d 2e 0a 20 20  * page pFrom..  
37cc0 20 20 2a 2f 0a 20 20 20 20 70 54 6f 2d 3e 69 73    */.    pTo->is
37cd0 49 6e 69 74 20 3d 20 30 3b 0a 20 20 20 20 72 63  Init = 0;.    rc
37ce0 20 3d 20 62 74 72 65 65 49 6e 69 74 50 61 67 65   = btreeInitPage
37cf0 28 70 54 6f 29 3b 0a 20 20 20 20 69 66 28 20 72  (pTo);.    if( r
37d00 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
37d10 20 20 20 20 20 20 2a 70 52 43 20 3d 20 72 63 3b        *pRC = rc;
37d20 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  .      return;. 
37d30 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49     }.  .    /* I
37d40 66 20 74 68 69 73 20 69 73 20 61 6e 20 61 75 74  f this is an aut
37d50 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73  o-vacuum databas
37d60 65 2c 20 75 70 64 61 74 65 20 74 68 65 20 70 6f  e, update the po
37d70 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65  inter-map entrie
37d80 73 0a 20 20 20 20 2a 2a 20 66 6f 72 20 61 6e 79  s.    ** for any
37d90 20 62 2d 74 72 65 65 20 6f 72 20 6f 76 65 72 66   b-tree or overf
37da0 6c 6f 77 20 70 61 67 65 73 20 74 68 61 74 20 70  low pages that p
37db0 54 6f 20 6e 6f 77 20 63 6f 6e 74 61 69 6e 73 20  To now contains 
37dc0 74 68 65 20 70 6f 69 6e 74 65 72 73 20 74 6f 2e  the pointers to.
37dd0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
37de0 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a  ISAUTOVACUUM ){.
37df0 20 20 20 20 20 20 2a 70 52 43 20 3d 20 73 65 74        *pRC = set
37e00 43 68 69 6c 64 50 74 72 6d 61 70 73 28 70 54 6f  ChildPtrmaps(pTo
37e10 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
37e20 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
37e30 6e 65 20 72 65 64 69 73 74 72 69 62 75 74 65 73  ne redistributes
37e40 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20 69 50   cells on the iP
37e50 61 72 65 6e 74 49 64 78 27 74 68 20 63 68 69 6c  arentIdx'th chil
37e60 64 20 6f 66 20 70 50 61 72 65 6e 74 0a 2a 2a 20  d of pParent.** 
37e70 28 68 65 72 65 61 66 74 65 72 20 22 74 68 65 20  (hereafter "the 
37e80 70 61 67 65 22 29 20 61 6e 64 20 75 70 20 74 6f  page") and up to
37e90 20 32 20 73 69 62 6c 69 6e 67 73 20 73 6f 20 74   2 siblings so t
37ea0 68 61 74 20 61 6c 6c 20 70 61 67 65 73 20 68 61  hat all pages ha
37eb0 76 65 20 61 62 6f 75 74 20 74 68 65 0a 2a 2a 20  ve about the.** 
37ec0 73 61 6d 65 20 61 6d 6f 75 6e 74 20 6f 66 20 66  same amount of f
37ed0 72 65 65 20 73 70 61 63 65 2e 20 55 73 75 61 6c  ree space. Usual
37ee0 6c 79 20 61 20 73 69 6e 67 6c 65 20 73 69 62 6c  ly a single sibl
37ef0 69 6e 67 20 6f 6e 20 65 69 74 68 65 72 20 73 69  ing on either si
37f00 64 65 20 6f 66 20 74 68 65 0a 2a 2a 20 70 61 67  de of the.** pag
37f10 65 20 61 72 65 20 75 73 65 64 20 69 6e 20 74 68  e are used in th
37f20 65 20 62 61 6c 61 6e 63 69 6e 67 2c 20 74 68 6f  e balancing, tho
37f30 75 67 68 20 62 6f 74 68 20 73 69 62 6c 69 6e 67  ugh both sibling
37f40 73 20 6d 69 67 68 74 20 63 6f 6d 65 20 66 72 6f  s might come fro
37f50 6d 20 6f 6e 65 0a 2a 2a 20 73 69 64 65 20 69 66  m one.** side if
37f60 20 74 68 65 20 70 61 67 65 20 69 73 20 74 68 65   the page is the
37f70 20 66 69 72 73 74 20 6f 72 20 6c 61 73 74 20 63   first or last c
37f80 68 69 6c 64 20 6f 66 20 69 74 73 20 70 61 72 65  hild of its pare
37f90 6e 74 2e 20 49 66 20 74 68 65 20 70 61 67 65 20  nt. If the page 
37fa0 0a 2a 2a 20 68 61 73 20 66 65 77 65 72 20 74 68  .** has fewer th
37fb0 61 6e 20 32 20 73 69 62 6c 69 6e 67 73 20 28 73  an 2 siblings (s
37fc0 6f 6d 65 74 68 69 6e 67 20 77 68 69 63 68 20 63  omething which c
37fd0 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 69  an only happen i
37fe0 66 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 69 73  f the page.** is
37ff0 20 61 20 72 6f 6f 74 20 70 61 67 65 20 6f 72 20   a root page or 
38000 61 20 63 68 69 6c 64 20 6f 66 20 61 20 72 6f 6f  a child of a roo
38010 74 20 70 61 67 65 29 20 74 68 65 6e 20 61 6c 6c  t page) then all
38020 20 61 76 61 69 6c 61 62 6c 65 20 73 69 62 6c 69   available sibli
38030 6e 67 73 0a 2a 2a 20 70 61 72 74 69 63 69 70 61  ngs.** participa
38040 74 65 20 69 6e 20 74 68 65 20 62 61 6c 61 6e 63  te in the balanc
38050 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e  ing..**.** The n
38060 75 6d 62 65 72 20 6f 66 20 73 69 62 6c 69 6e 67  umber of sibling
38070 73 20 6f 66 20 74 68 65 20 70 61 67 65 20 6d 69  s of the page mi
38080 67 68 74 20 62 65 20 69 6e 63 72 65 61 73 65 64  ght be increased
38090 20 6f 72 20 64 65 63 72 65 61 73 65 64 20 62 79   or decreased by
380a0 20 0a 2a 2a 20 6f 6e 65 20 6f 72 20 74 77 6f 20   .** one or two 
380b0 69 6e 20 61 6e 20 65 66 66 6f 72 74 20 74 6f 20  in an effort to 
380c0 6b 65 65 70 20 70 61 67 65 73 20 6e 65 61 72 6c  keep pages nearl
380d0 79 20 66 75 6c 6c 20 62 75 74 20 6e 6f 74 20 6f  y full but not o
380e0 76 65 72 20 66 75 6c 6c 2e 20 0a 2a 2a 0a 2a 2a  ver full. .**.**
380f0 20 4e 6f 74 65 20 74 68 61 74 20 77 68 65 6e 20   Note that when 
38100 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
38110 63 61 6c 6c 65 64 2c 20 73 6f 6d 65 20 6f 66 20  called, some of 
38120 74 68 65 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65  the cells on the
38130 20 70 61 67 65 0a 2a 2a 20 6d 69 67 68 74 20 6e   page.** might n
38140 6f 74 20 61 63 74 75 61 6c 6c 79 20 62 65 20 73  ot actually be s
38150 74 6f 72 65 64 20 69 6e 20 4d 65 6d 50 61 67 65  tored in MemPage
38160 2e 61 44 61 74 61 5b 5d 2e 20 54 68 69 73 20 63  .aData[]. This c
38170 61 6e 20 68 61 70 70 65 6e 0a 2a 2a 20 69 66 20  an happen.** if 
38180 74 68 65 20 70 61 67 65 20 69 73 20 6f 76 65 72  the page is over
38190 66 75 6c 6c 2e 20 54 68 69 73 20 72 6f 75 74 69  full. This routi
381a0 6e 65 20 65 6e 73 75 72 65 73 20 74 68 61 74 20  ne ensures that 
381b0 61 6c 6c 20 63 65 6c 6c 73 20 61 6c 6c 6f 63 61  all cells alloca
381c0 74 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 70 61  ted.** to the pa
381d0 67 65 20 61 6e 64 20 69 74 73 20 73 69 62 6c 69  ge and its sibli
381e0 6e 67 73 20 66 69 74 20 69 6e 74 6f 20 4d 65 6d  ngs fit into Mem
381f0 50 61 67 65 2e 61 44 61 74 61 5b 5d 20 62 65 66  Page.aData[] bef
38200 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a  ore returning..*
38210 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 63 6f 75 72  *.** In the cour
38220 73 65 20 6f 66 20 62 61 6c 61 6e 63 69 6e 67 20  se of balancing 
38230 74 68 65 20 70 61 67 65 20 61 6e 64 20 69 74 73  the page and its
38240 20 73 69 62 6c 69 6e 67 73 2c 20 63 65 6c 6c 73   siblings, cells
38250 20 6d 61 79 20 62 65 0a 2a 2a 20 69 6e 73 65 72   may be.** inser
38260 74 65 64 20 69 6e 74 6f 20 6f 72 20 72 65 6d 6f  ted into or remo
38270 76 65 64 20 66 72 6f 6d 20 74 68 65 20 70 61 72  ved from the par
38280 65 6e 74 20 70 61 67 65 20 28 70 50 61 72 65 6e  ent page (pParen
38290 74 29 2e 20 44 6f 69 6e 67 20 73 6f 0a 2a 2a 20  t). Doing so.** 
382a0 6d 61 79 20 63 61 75 73 65 20 74 68 65 20 70 61  may cause the pa
382b0 72 65 6e 74 20 70 61 67 65 20 74 6f 20 62 65 63  rent page to bec
382c0 6f 6d 65 20 6f 76 65 72 66 75 6c 6c 20 6f 72 20  ome overfull or 
382d0 75 6e 64 65 72 66 75 6c 6c 2e 20 49 66 20 74 68  underfull. If th
382e0 69 73 0a 2a 2a 20 68 61 70 70 65 6e 73 2c 20 69  is.** happens, i
382f0 74 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73  t is the respons
38300 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63  ibility of the c
38310 61 6c 6c 65 72 20 74 6f 20 69 6e 76 6f 6b 65 20  aller to invoke 
38320 74 68 65 20 63 6f 72 72 65 63 74 0a 2a 2a 20 62  the correct.** b
38330 61 6c 61 6e 63 69 6e 67 20 72 6f 75 74 69 6e 65  alancing routine
38340 20 74 6f 20 66 69 78 20 74 68 69 73 20 70 72 6f   to fix this pro
38350 62 6c 65 6d 20 28 73 65 65 20 74 68 65 20 62 61  blem (see the ba
38360 6c 61 6e 63 65 28 29 20 72 6f 75 74 69 6e 65 29  lance() routine)
38370 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73  . .**.** If this
38380 20 72 6f 75 74 69 6e 65 20 66 61 69 6c 73 20 66   routine fails f
38390 6f 72 20 61 6e 79 20 72 65 61 73 6f 6e 2c 20 69  or any reason, i
383a0 74 20 6d 69 67 68 74 20 6c 65 61 76 65 20 74 68  t might leave th
383b0 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 69 6e  e database.** in
383c0 20 61 20 63 6f 72 72 75 70 74 65 64 20 73 74 61   a corrupted sta
383d0 74 65 2e 20 53 6f 20 69 66 20 74 68 69 73 20 72  te. So if this r
383e0 6f 75 74 69 6e 65 20 66 61 69 6c 73 2c 20 74 68  outine fails, th
383f0 65 20 64 61 74 61 62 61 73 65 20 73 68 6f 75 6c  e database shoul
38400 64 0a 2a 2a 20 62 65 20 72 6f 6c 6c 65 64 20 62  d.** be rolled b
38410 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74  ack..**.** The t
38420 68 69 72 64 20 61 72 67 75 6d 65 6e 74 20 74 6f  hird argument to
38430 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20   this function, 
38440 61 4f 76 66 6c 53 70 61 63 65 2c 20 69 73 20 61  aOvflSpace, is a
38450 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 0a 2a 2a   pointer to a.**
38460 20 62 75 66 66 65 72 20 62 69 67 20 65 6e 6f 75   buffer big enou
38470 67 68 20 74 6f 20 68 6f 6c 64 20 6f 6e 65 20 70  gh to hold one p
38480 61 67 65 2e 20