/ Hex Artifact Content
Login

Artifact 525f19f01d5976dbc12e83e7339e41488de79183:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 41 70 72 69 6c  /*.** 2004 April
0010: 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74   6.**.** The aut
0020: 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f  hor disclaims co
0030: 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20  pyright to this 
0040: 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e  source code.  In
0050: 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c   place of.** a l
0060: 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72  egal notice, her
0070: 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a  e is a blessing:
0080: 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f  .**.**    May yo
0090: 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f  u do good and no
00a0: 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61  t evil..**    Ma
00b0: 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69  y you find forgi
00c0: 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73  veness for yours
00d0: 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20  elf and forgive 
00e0: 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61  others..**    Ma
00f0: 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65  y you share free
0100: 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67  ly, never taking
0110: 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67   more than you g
0120: 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ive..**.********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 69  *.** This file i
0180: 6d 70 6c 65 6d 65 6e 74 73 20 61 6e 20 65 78 74  mplements an ext
0190: 65 72 6e 61 6c 20 28 64 69 73 6b 2d 62 61 73 65  ernal (disk-base
01a0: 64 29 20 64 61 74 61 62 61 73 65 20 75 73 69 6e  d) database usin
01b0: 67 20 42 54 72 65 65 73 2e 0a 2a 2a 20 53 65 65  g BTrees..** See
01c0: 20 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d   the header comm
01d0: 65 6e 74 20 6f 6e 20 22 62 74 72 65 65 49 6e 74  ent on "btreeInt
01e0: 2e 68 22 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  .h" for addition
01f0: 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  al information..
0200: 2a 2a 20 49 6e 63 6c 75 64 69 6e 67 20 61 20 64  ** Including a d
0210: 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 66 69  escription of fi
0220: 6c 65 20 66 6f 72 6d 61 74 20 61 6e 64 20 61 6e  le format and an
0230: 20 6f 76 65 72 76 69 65 77 20 6f 66 20 6f 70 65   overview of ope
0240: 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 6e 63 6c  ration..*/.#incl
0250: 75 64 65 20 22 62 74 72 65 65 49 6e 74 2e 68 22  ude "btreeInt.h"
0260: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 68 65 61 64  ../*.** The head
0270: 65 72 20 73 74 72 69 6e 67 20 74 68 61 74 20 61  er string that a
0280: 70 70 65 61 72 73 20 61 74 20 74 68 65 20 62 65  ppears at the be
0290: 67 69 6e 6e 69 6e 67 20 6f 66 20 65 76 65 72 79  ginning of every
02a0: 0a 2a 2a 20 53 51 4c 69 74 65 20 64 61 74 61 62  .** SQLite datab
02b0: 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ase..*/.static c
02c0: 6f 6e 73 74 20 63 68 61 72 20 7a 4d 61 67 69 63  onst char zMagic
02d0: 48 65 61 64 65 72 5b 5d 20 3d 20 53 51 4c 49 54  Header[] = SQLIT
02e0: 45 5f 46 49 4c 45 5f 48 45 41 44 45 52 3b 0a 0a  E_FILE_HEADER;..
02f0: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 69 73 20 67  /*.** Set this g
0300: 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 74  lobal variable t
0310: 6f 20 31 20 74 6f 20 65 6e 61 62 6c 65 20 74 72  o 1 to enable tr
0320: 61 63 69 6e 67 20 75 73 69 6e 67 20 74 68 65 20  acing using the 
0330: 54 52 41 43 45 0a 2a 2a 20 6d 61 63 72 6f 2e 0a  TRACE.** macro..
0340: 2a 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73 71 6c  */.#if 0.int sql
0350: 69 74 65 33 42 74 72 65 65 54 72 61 63 65 3d 31  ite3BtreeTrace=1
0360: 3b 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 6e  ;  /* True to en
0370: 61 62 6c 65 20 74 72 61 63 69 6e 67 20 2a 2f 0a  able tracing */.
0380: 23 20 64 65 66 69 6e 65 20 54 52 41 43 45 28 58  # define TRACE(X
0390: 29 20 20 69 66 28 73 71 6c 69 74 65 33 42 74 72  )  if(sqlite3Btr
03a0: 65 65 54 72 61 63 65 29 7b 70 72 69 6e 74 66 20  eeTrace){printf 
03b0: 58 3b 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29  X;fflush(stdout)
03c0: 3b 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  ;}.#else.# defin
03d0: 65 20 54 52 41 43 45 28 58 29 0a 23 65 6e 64 69  e TRACE(X).#endi
03e0: 66 0a 0a 2f 2a 0a 2a 2a 20 45 78 74 72 61 63 74  f../*.** Extract
03f0: 20 61 20 32 2d 62 79 74 65 20 62 69 67 2d 65 6e   a 2-byte big-en
0400: 64 69 61 6e 20 69 6e 74 65 67 65 72 20 66 72 6f  dian integer fro
0410: 6d 20 61 6e 20 61 72 72 61 79 20 6f 66 20 75 6e  m an array of un
0420: 73 69 67 6e 65 64 20 62 79 74 65 73 2e 0a 2a 2a  signed bytes..**
0430: 20 42 75 74 20 69 66 20 74 68 65 20 76 61 6c 75   But if the valu
0440: 65 20 69 73 20 7a 65 72 6f 2c 20 6d 61 6b 65 20  e is zero, make 
0450: 69 74 20 36 35 35 33 36 2e 0a 2a 2a 0a 2a 2a 20  it 65536..**.** 
0460: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
0470: 75 73 65 64 20 74 6f 20 65 78 74 72 61 63 74 20  used to extract 
0480: 74 68 65 20 22 6f 66 66 73 65 74 20 74 6f 20 63  the "offset to c
0490: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
04a0: 22 20 76 61 6c 75 65 0a 2a 2a 20 66 72 6f 6d 20  " value.** from 
04b0: 74 68 65 20 68 65 61 64 65 72 20 6f 66 20 61 20  the header of a 
04c0: 62 74 72 65 65 20 70 61 67 65 2e 20 20 49 66 20  btree page.  If 
04d0: 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73  the page size is
04e0: 20 36 35 35 33 36 20 61 6e 64 20 74 68 65 20 70   65536 and the p
04f0: 61 67 65 0a 2a 2a 20 69 73 20 65 6d 70 74 79 2c  age.** is empty,
0500: 20 74 68 65 20 6f 66 66 73 65 74 20 73 68 6f 75   the offset shou
0510: 6c 64 20 62 65 20 36 35 35 33 36 2c 20 62 75 74  ld be 65536, but
0520: 20 74 68 65 20 32 2d 62 79 74 65 20 76 61 6c 75   the 2-byte valu
0530: 65 20 73 74 6f 72 65 73 20 7a 65 72 6f 2e 0a 2a  e stores zero..*
0540: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d  * This routine m
0550: 61 6b 65 73 20 74 68 65 20 6e 65 63 65 73 73 61  akes the necessa
0560: 72 79 20 61 64 6a 75 73 74 6d 65 6e 74 20 74 6f  ry adjustment to
0570: 20 36 35 35 33 36 2e 0a 2a 2f 0a 23 64 65 66 69   65536..*/.#defi
0580: 6e 65 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65  ne get2byteNotZe
0590: 72 6f 28 58 29 20 20 28 28 28 28 28 69 6e 74 29  ro(X)  (((((int)
05a0: 67 65 74 32 62 79 74 65 28 58 29 29 2d 31 29 26  get2byte(X))-1)&
05b0: 30 78 66 66 66 66 29 2b 31 29 0a 0a 2f 2a 0a 2a  0xffff)+1)../*.*
05c0: 2a 20 56 61 6c 75 65 73 20 70 61 73 73 65 64 20  * Values passed 
05d0: 61 73 20 74 68 65 20 35 74 68 20 61 72 67 75 6d  as the 5th argum
05e0: 65 6e 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 42  ent to allocateB
05f0: 74 72 65 65 50 61 67 65 28 29 0a 2a 2f 0a 23 64  treePage().*/.#d
0600: 65 66 69 6e 65 20 42 54 41 4c 4c 4f 43 5f 41 4e  efine BTALLOC_AN
0610: 59 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20  Y   0           
0620: 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 79 20  /* Allocate any 
0630: 70 61 67 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20  page */.#define 
0640: 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20 31 20  BTALLOC_EXACT 1 
0650: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c            /* All
0660: 6f 63 61 74 65 20 65 78 61 63 74 20 70 61 67 65  ocate exact page
0670: 20 69 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a   if possible */.
0680: 23 64 65 66 69 6e 65 20 42 54 41 4c 4c 4f 43 5f  #define BTALLOC_
0690: 4c 45 20 20 20 20 32 20 20 20 20 20 20 20 20 20  LE    2         
06a0: 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e    /* Allocate an
06b0: 79 20 70 61 67 65 20 3c 3d 20 74 68 65 20 70 61  y page <= the pa
06c0: 72 61 6d 65 74 65 72 20 2a 2f 0a 0a 2f 2a 0a 2a  rameter */../*.*
06d0: 2a 20 4d 61 63 72 6f 20 49 66 4e 6f 74 4f 6d 69  * Macro IfNotOmi
06e0: 74 41 56 28 78 29 20 72 65 74 75 72 6e 73 20 28  tAV(x) returns (
06f0: 78 29 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49  x) if SQLITE_OMI
0700: 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 69 73 20  T_AUTOVACUUM is 
0710: 6e 6f 74 20 0a 2a 2a 20 64 65 66 69 6e 65 64 2c  not .** defined,
0720: 20 6f 72 20 30 20 69 66 20 69 74 20 69 73 2e 20   or 0 if it is. 
0730: 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a  For example:.**.
0740: 2a 2a 20 20 20 62 49 6e 63 72 56 61 63 75 75 6d  **   bIncrVacuum
0750: 20 3d 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70   = IfNotOmitAV(p
0760: 42 74 53 68 61 72 65 64 2d 3e 69 6e 63 72 56 61  BtShared->incrVa
0770: 63 75 75 6d 29 3b 0a 2a 2f 0a 23 69 66 6e 64 65  cuum);.*/.#ifnde
0780: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
0790: 54 4f 56 41 43 55 55 4d 0a 23 64 65 66 69 6e 65  TOVACUUM.#define
07a0: 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 65 78 70   IfNotOmitAV(exp
07b0: 72 29 20 28 65 78 70 72 29 0a 23 65 6c 73 65 0a  r) (expr).#else.
07c0: 23 64 65 66 69 6e 65 20 49 66 4e 6f 74 4f 6d 69  #define IfNotOmi
07d0: 74 41 56 28 65 78 70 72 29 20 30 0a 23 65 6e 64  tAV(expr) 0.#end
07e0: 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
07f0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
0800: 41 43 48 45 0a 2f 2a 0a 2a 2a 20 41 20 6c 69 73  ACHE./*.** A lis
0810: 74 20 6f 66 20 42 74 53 68 61 72 65 64 20 6f 62  t of BtShared ob
0820: 6a 65 63 74 73 20 74 68 61 74 20 61 72 65 20 65  jects that are e
0830: 6c 69 67 69 62 6c 65 20 66 6f 72 20 70 61 72 74  ligible for part
0840: 69 63 69 70 61 74 69 6f 6e 0a 2a 2a 20 69 6e 20  icipation.** in 
0850: 73 68 61 72 65 64 20 63 61 63 68 65 2e 20 20 54  shared cache.  T
0860: 68 69 73 20 76 61 72 69 61 62 6c 65 20 68 61 73  his variable has
0870: 20 66 69 6c 65 20 73 63 6f 70 65 20 64 75 72 69   file scope duri
0880: 6e 67 20 6e 6f 72 6d 61 6c 20 62 75 69 6c 64 73  ng normal builds
0890: 2c 0a 2a 2a 20 62 75 74 20 74 68 65 20 74 65 73  ,.** but the tes
08a0: 74 20 68 61 72 6e 65 73 73 20 6e 65 65 64 73 20  t harness needs 
08b0: 74 6f 20 61 63 63 65 73 73 20 69 74 20 73 6f 20  to access it so 
08c0: 77 65 20 6d 61 6b 65 20 69 74 20 67 6c 6f 62 61  we make it globa
08d0: 6c 20 66 6f 72 20 0a 2a 2a 20 74 65 73 74 20 62  l for .** test b
08e0: 75 69 6c 64 73 2e 0a 2a 2a 0a 2a 2a 20 41 63 63  uilds..**.** Acc
08f0: 65 73 73 20 74 6f 20 74 68 69 73 20 76 61 72 69  ess to this vari
0900: 61 62 6c 65 20 69 73 20 70 72 6f 74 65 63 74 65  able is protecte
0910: 64 20 62 79 20 53 51 4c 49 54 45 5f 4d 55 54 45  d by SQLITE_MUTE
0920: 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 2e  X_STATIC_MASTER.
0930: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
0940: 45 5f 54 45 53 54 0a 42 74 53 68 61 72 65 64 20  E_TEST.BtShared 
0950: 2a 53 51 4c 49 54 45 5f 57 53 44 20 73 71 6c 69  *SQLITE_WSD sqli
0960: 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69  te3SharedCacheLi
0970: 73 74 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 73 74  st = 0;.#else.st
0980: 61 74 69 63 20 42 74 53 68 61 72 65 64 20 2a 53  atic BtShared *S
0990: 51 4c 49 54 45 5f 57 53 44 20 73 71 6c 69 74 65  QLITE_WSD sqlite
09a0: 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74  3SharedCacheList
09b0: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 65 6e   = 0;.#endif.#en
09c0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
09d0: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20  IT_SHARED_CACHE 
09e0: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
09f0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
0a00: 41 43 48 45 0a 2f 2a 0a 2a 2a 20 45 6e 61 62 6c  ACHE./*.** Enabl
0a10: 65 20 6f 72 20 64 69 73 61 62 6c 65 20 74 68 65  e or disable the
0a20: 20 73 68 61 72 65 64 20 70 61 67 65 72 20 61 6e   shared pager an
0a30: 64 20 73 63 68 65 6d 61 20 66 65 61 74 75 72 65  d schema feature
0a40: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  s..**.** This ro
0a50: 75 74 69 6e 65 20 68 61 73 20 6e 6f 20 65 66 66  utine has no eff
0a60: 65 63 74 20 6f 6e 20 65 78 69 73 74 69 6e 67 20  ect on existing 
0a70: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
0a80: 69 6f 6e 73 2e 0a 2a 2a 20 54 68 65 20 73 68 61  ions..** The sha
0a90: 72 65 64 20 63 61 63 68 65 20 73 65 74 74 69 6e  red cache settin
0aa0: 67 20 65 66 66 65 63 74 73 20 6f 6e 6c 79 20 66  g effects only f
0ab0: 75 74 75 72 65 20 63 61 6c 6c 73 20 74 6f 0a 2a  uture calls to.*
0ac0: 2a 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29  * sqlite3_open()
0ad0: 2c 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36  , sqlite3_open16
0ae0: 28 29 2c 20 6f 72 20 73 71 6c 69 74 65 33 5f 6f  (), or sqlite3_o
0af0: 70 65 6e 5f 76 32 28 29 2e 0a 2a 2f 0a 69 6e 74  pen_v2()..*/.int
0b00: 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f   sqlite3_enable_
0b10: 73 68 61 72 65 64 5f 63 61 63 68 65 28 69 6e 74  shared_cache(int
0b20: 20 65 6e 61 62 6c 65 29 7b 0a 20 20 73 71 6c 69   enable){.  sqli
0b30: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
0b40: 73 68 61 72 65 64 43 61 63 68 65 45 6e 61 62 6c  sharedCacheEnabl
0b50: 65 64 20 3d 20 65 6e 61 62 6c 65 3b 0a 20 20 72  ed = enable;.  r
0b60: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
0b70: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 0a 23 69 66  .}.#endif....#if
0b80: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
0b90: 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 2f  SHARED_CACHE.  /
0ba0: 2a 0a 20 20 2a 2a 20 54 68 65 20 66 75 6e 63 74  *.  ** The funct
0bb0: 69 6f 6e 73 20 71 75 65 72 79 53 68 61 72 65 64  ions queryShared
0bc0: 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29  CacheTableLock()
0bd0: 2c 20 73 65 74 53 68 61 72 65 64 43 61 63 68 65  , setSharedCache
0be0: 54 61 62 6c 65 4c 6f 63 6b 28 29 2c 0a 20 20 2a  TableLock(),.  *
0bf0: 2a 20 61 6e 64 20 63 6c 65 61 72 41 6c 6c 53 68  * and clearAllSh
0c00: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
0c10: 63 6b 73 28 29 0a 20 20 2a 2a 20 6d 61 6e 69 70  cks().  ** manip
0c20: 75 6c 61 74 65 20 65 6e 74 72 69 65 73 20 69 6e  ulate entries in
0c30: 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 4c   the BtShared.pL
0c40: 6f 63 6b 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  ock linked list 
0c50: 75 73 65 64 20 74 6f 20 73 74 6f 72 65 0a 20 20  used to store.  
0c60: 2a 2a 20 73 68 61 72 65 64 2d 63 61 63 68 65 20  ** shared-cache 
0c70: 74 61 62 6c 65 20 6c 65 76 65 6c 20 6c 6f 63 6b  table level lock
0c80: 73 2e 20 49 66 20 74 68 65 20 6c 69 62 72 61 72  s. If the librar
0c90: 79 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 77 69  y is compiled wi
0ca0: 74 68 20 74 68 65 0a 20 20 2a 2a 20 73 68 61 72  th the.  ** shar
0cb0: 65 64 2d 63 61 63 68 65 20 66 65 61 74 75 72 65  ed-cache feature
0cc0: 20 64 69 73 61 62 6c 65 64 2c 20 74 68 65 6e 20   disabled, then 
0cd0: 74 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 65 76  there is only ev
0ce0: 65 72 20 6f 6e 65 20 75 73 65 72 0a 20 20 2a 2a  er one user.  **
0cf0: 20 6f 66 20 65 61 63 68 20 42 74 53 68 61 72 65   of each BtShare
0d00: 64 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20  d structure and 
0d10: 73 6f 20 74 68 69 73 20 6c 6f 63 6b 69 6e 67 20  so this locking 
0d20: 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79  is not necessary
0d30: 2e 20 0a 20 20 2a 2a 20 53 6f 20 64 65 66 69 6e  . .  ** So defin
0d40: 65 20 74 68 65 20 6c 6f 63 6b 20 72 65 6c 61 74  e the lock relat
0d50: 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 61 73 20  ed functions as 
0d60: 6e 6f 2d 6f 70 73 2e 0a 20 20 2a 2f 0a 20 20 23  no-ops..  */.  #
0d70: 64 65 66 69 6e 65 20 71 75 65 72 79 53 68 61 72  define queryShar
0d80: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
0d90: 28 61 2c 62 2c 63 29 20 53 51 4c 49 54 45 5f 4f  (a,b,c) SQLITE_O
0da0: 4b 0a 20 20 23 64 65 66 69 6e 65 20 73 65 74 53  K.  #define setS
0db0: 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
0dc0: 6f 63 6b 28 61 2c 62 2c 63 29 20 53 51 4c 49 54  ock(a,b,c) SQLIT
0dd0: 45 5f 4f 4b 0a 20 20 23 64 65 66 69 6e 65 20 63  E_OK.  #define c
0de0: 6c 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63  learAllSharedCac
0df0: 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a  heTableLocks(a).
0e00: 20 20 23 64 65 66 69 6e 65 20 64 6f 77 6e 67 72    #define downgr
0e10: 61 64 65 41 6c 6c 53 68 61 72 65 64 43 61 63 68  adeAllSharedCach
0e20: 65 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a 20  eTableLocks(a). 
0e30: 20 23 64 65 66 69 6e 65 20 68 61 73 53 68 61 72   #define hasShar
0e40: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
0e50: 28 61 2c 62 2c 63 2c 64 29 20 31 0a 20 20 23 64  (a,b,c,d) 1.  #d
0e60: 65 66 69 6e 65 20 68 61 73 52 65 61 64 43 6f 6e  efine hasReadCon
0e70: 66 6c 69 63 74 73 28 61 2c 20 62 29 20 30 0a 23  flicts(a, b) 0.#
0e80: 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53  endif..#ifndef S
0e90: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
0ea0: 44 5f 43 41 43 48 45 0a 0a 23 69 66 64 65 66 20  D_CACHE..#ifdef 
0eb0: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a  SQLITE_DEBUG./*.
0ec0: 2a 2a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  **** This functi
0ed0: 6f 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20  on is only used 
0ee0: 61 73 20 70 61 72 74 20 6f 66 20 61 6e 20 61 73  as part of an as
0ef0: 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
0f00: 2e 20 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 43 68 65 63  . ***.**.** Chec
0f10: 6b 20 74 6f 20 73 65 65 20 69 66 20 70 42 74 72  k to see if pBtr
0f20: 65 65 20 68 6f 6c 64 73 20 74 68 65 20 72 65 71  ee holds the req
0f30: 75 69 72 65 64 20 6c 6f 63 6b 73 20 74 6f 20 72  uired locks to r
0f40: 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 6f 20  ead or write to 
0f50: 74 68 65 20 0a 2a 2a 20 74 61 62 6c 65 20 77 69  the .** table wi
0f60: 74 68 20 72 6f 6f 74 20 70 61 67 65 20 69 52 6f  th root page iRo
0f70: 6f 74 2e 20 20 20 52 65 74 75 72 6e 20 31 20 69  ot.   Return 1 i
0f80: 66 20 69 74 20 64 6f 65 73 20 61 6e 64 20 30 20  f it does and 0 
0f90: 69 66 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f  if not..**.** Fo
0fa0: 72 20 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e 20  r example, when 
0fb0: 77 72 69 74 69 6e 67 20 74 6f 20 61 20 74 61 62  writing to a tab
0fc0: 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67  le with root-pag
0fd0: 65 20 69 52 6f 6f 74 20 76 69 61 20 0a 2a 2a 20  e iRoot via .** 
0fe0: 42 74 72 65 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  Btree connection
0ff0: 20 70 42 74 72 65 65 3a 0a 2a 2a 0a 2a 2a 20 20   pBtree:.**.**  
1000: 20 20 61 73 73 65 72 74 28 20 68 61 73 53 68 61    assert( hasSha
1010: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
1020: 6b 28 70 42 74 72 65 65 2c 20 69 52 6f 6f 74 2c  k(pBtree, iRoot,
1030: 20 30 2c 20 57 52 49 54 45 5f 4c 4f 43 4b 29 20   0, WRITE_LOCK) 
1040: 29 3b 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77 72  );.**.** When wr
1050: 69 74 69 6e 67 20 74 6f 20 61 6e 20 69 6e 64 65  iting to an inde
1060: 78 20 74 68 61 74 20 72 65 73 69 64 65 73 20 69  x that resides i
1070: 6e 20 61 20 73 68 61 72 61 62 6c 65 20 64 61 74  n a sharable dat
1080: 61 62 61 73 65 2c 20 74 68 65 20 0a 2a 2a 20 63  abase, the .** c
1090: 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20 68 61 76  aller should hav
10a0: 65 20 66 69 72 73 74 20 6f 62 74 61 69 6e 65 64  e first obtained
10b0: 20 61 20 6c 6f 63 6b 20 73 70 65 63 69 66 79 69   a lock specifyi
10c0: 6e 67 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  ng the root page
10d0: 20 6f 66 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65   of.** the corre
10e0: 73 70 6f 6e 64 69 6e 67 20 74 61 62 6c 65 2e 20  sponding table. 
10f0: 54 68 69 73 20 6d 61 6b 65 73 20 74 68 69 6e 67  This makes thing
1100: 73 20 61 20 62 69 74 20 6d 6f 72 65 20 63 6f 6d  s a bit more com
1110: 70 6c 69 63 61 74 65 64 2c 0a 2a 2a 20 61 73 20  plicated,.** as 
1120: 74 68 69 73 20 6d 6f 64 75 6c 65 20 74 72 65 61  this module trea
1130: 74 73 20 65 61 63 68 20 74 61 62 6c 65 20 61 73  ts each table as
1140: 20 61 20 73 65 70 61 72 61 74 65 20 73 74 72 75   a separate stru
1150: 63 74 75 72 65 2e 20 54 6f 20 64 65 74 65 72 6d  cture. To determ
1160: 69 6e 65 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65  ine.** the table
1170: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
1180: 6f 20 74 68 65 20 69 6e 64 65 78 20 62 65 69 6e  o the index bein
1190: 67 20 77 72 69 74 74 65 6e 2c 20 74 68 69 73 0a  g written, this.
11a0: 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20  ** function has 
11b0: 74 6f 20 73 65 61 72 63 68 20 74 68 72 6f 75 67  to search throug
11c0: 68 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  h the database s
11d0: 63 68 65 6d 61 2e 0a 2a 2a 0a 2a 2a 20 49 6e 73  chema..**.** Ins
11e0: 74 65 61 64 20 6f 66 20 61 20 6c 6f 63 6b 20 6f  tead of a lock o
11f0: 6e 20 74 68 65 20 74 61 62 6c 65 2f 69 6e 64 65  n the table/inde
1200: 78 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67 65  x rooted at page
1210: 20 69 52 6f 6f 74 2c 20 74 68 65 20 63 61 6c 6c   iRoot, the call
1220: 65 72 20 6d 61 79 0a 2a 2a 20 68 6f 6c 64 20 61  er may.** hold a
1230: 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74   write-lock on t
1240: 68 65 20 73 63 68 65 6d 61 20 74 61 62 6c 65 20  he schema table 
1250: 28 72 6f 6f 74 20 70 61 67 65 20 31 29 2e 20 54  (root page 1). T
1260: 68 69 73 20 69 73 20 61 6c 73 6f 0a 2a 2a 20 61  his is also.** a
1270: 63 63 65 70 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74  cceptable..*/.st
1280: 61 74 69 63 20 69 6e 74 20 68 61 73 53 68 61 72  atic int hasShar
1290: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
12a0: 28 0a 20 20 42 74 72 65 65 20 2a 70 42 74 72 65  (.  Btree *pBtre
12b0: 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61  e,         /* Ha
12c0: 6e 64 6c 65 20 74 68 61 74 20 6d 75 73 74 20 68  ndle that must h
12d0: 6f 6c 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 50 67  old lock */.  Pg
12e0: 6e 6f 20 69 52 6f 6f 74 2c 20 20 20 20 20 20 20  no iRoot,       
12f0: 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67       /* Root pag
1300: 65 20 6f 66 20 62 2d 74 72 65 65 20 2a 2f 0a 20  e of b-tree */. 
1310: 20 69 6e 74 20 69 73 49 6e 64 65 78 2c 20 20 20   int isIndex,   
1320: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
1330: 69 66 20 69 52 6f 6f 74 20 69 73 20 74 68 65 20  if iRoot is the 
1340: 72 6f 6f 74 20 6f 66 20 61 6e 20 69 6e 64 65 78  root of an index
1350: 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74   b-tree */.  int
1360: 20 65 4c 6f 63 6b 54 79 70 65 20 20 20 20 20 20   eLockType      
1370: 20 20 20 20 2f 2a 20 52 65 71 75 69 72 65 64 20      /* Required 
1380: 6c 6f 63 6b 20 74 79 70 65 20 28 52 45 41 44 5f  lock type (READ_
1390: 4c 4f 43 4b 20 6f 72 20 57 52 49 54 45 5f 4c 4f  LOCK or WRITE_LO
13a0: 43 4b 29 20 2a 2f 0a 29 7b 0a 20 20 53 63 68 65  CK) */.){.  Sche
13b0: 6d 61 20 2a 70 53 63 68 65 6d 61 20 3d 20 28 53  ma *pSchema = (S
13c0: 63 68 65 6d 61 20 2a 29 70 42 74 72 65 65 2d 3e  chema *)pBtree->
13d0: 70 42 74 2d 3e 70 53 63 68 65 6d 61 3b 0a 20 20  pBt->pSchema;.  
13e0: 50 67 6e 6f 20 69 54 61 62 20 3d 20 30 3b 0a 20  Pgno iTab = 0;. 
13f0: 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 3b 0a   BtLock *pLock;.
1400: 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 64 61  .  /* If this da
1410: 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20 73 68  tabase is not sh
1420: 61 72 65 61 62 6c 65 2c 20 6f 72 20 69 66 20 74  areable, or if t
1430: 68 65 20 63 6c 69 65 6e 74 20 69 73 20 72 65 61  he client is rea
1440: 64 69 6e 67 0a 20 20 2a 2a 20 61 6e 64 20 68 61  ding.  ** and ha
1450: 73 20 74 68 65 20 72 65 61 64 2d 75 6e 63 6f 6d  s the read-uncom
1460: 6d 69 74 74 65 64 20 66 6c 61 67 20 73 65 74 2c  mitted flag set,
1470: 20 74 68 65 6e 20 6e 6f 20 6c 6f 63 6b 20 69 73   then no lock is
1480: 20 72 65 71 75 69 72 65 64 2e 20 0a 20 20 2a 2a   required. .  **
1490: 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 6d 6d   Return true imm
14a0: 65 64 69 61 74 65 6c 79 2e 0a 20 20 2a 2f 0a 20  ediately..  */. 
14b0: 20 69 66 28 20 28 70 42 74 72 65 65 2d 3e 73 68   if( (pBtree->sh
14c0: 61 72 61 62 6c 65 3d 3d 30 29 0a 20 20 20 7c 7c  arable==0).   ||
14d0: 20 28 65 4c 6f 63 6b 54 79 70 65 3d 3d 52 45 41   (eLockType==REA
14e0: 44 5f 4c 4f 43 4b 20 26 26 20 28 70 42 74 72 65  D_LOCK && (pBtre
14f0: 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  e->db->flags & S
1500: 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d  QLITE_ReadUncomm
1510: 69 74 74 65 64 29 29 0a 20 20 29 7b 0a 20 20 20  itted)).  ){.   
1520: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a   return 1;.  }..
1530: 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6c 69 65    /* If the clie
1540: 6e 74 20 69 73 20 72 65 61 64 69 6e 67 20 20 6f  nt is reading  o
1550: 72 20 77 72 69 74 69 6e 67 20 61 6e 20 69 6e 64  r writing an ind
1560: 65 78 20 61 6e 64 20 74 68 65 20 73 63 68 65 6d  ex and the schem
1570: 61 20 69 73 0a 20 20 2a 2a 20 6e 6f 74 20 6c 6f  a is.  ** not lo
1580: 61 64 65 64 2c 20 74 68 65 6e 20 69 74 20 69 73  aded, then it is
1590: 20 74 6f 6f 20 64 69 66 66 69 63 75 6c 74 20 74   too difficult t
15a0: 6f 20 61 63 74 75 61 6c 6c 79 20 63 68 65 63 6b  o actually check
15b0: 20 74 6f 20 73 65 65 20 69 66 0a 20 20 2a 2a 20   to see if.  ** 
15c0: 74 68 65 20 63 6f 72 72 65 63 74 20 6c 6f 63 6b  the correct lock
15d0: 73 20 61 72 65 20 68 65 6c 64 2e 20 20 53 6f 20  s are held.  So 
15e0: 64 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20 2d 20  do not bother - 
15f0: 6a 75 73 74 20 72 65 74 75 72 6e 20 74 72 75 65  just return true
1600: 2e 0a 20 20 2a 2a 20 54 68 69 73 20 63 61 73 65  ..  ** This case
1610: 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6d 65 20 75   does not come u
1620: 70 20 76 65 72 79 20 6f 66 74 65 6e 20 61 6e 79  p very often any
1630: 68 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  how..  */.  if( 
1640: 69 73 49 6e 64 65 78 20 26 26 20 28 21 70 53 63  isIndex && (!pSc
1650: 68 65 6d 61 20 7c 7c 20 28 70 53 63 68 65 6d 61  hema || (pSchema
1660: 2d 3e 73 63 68 65 6d 61 46 6c 61 67 73 26 44 42  ->schemaFlags&DB
1670: 5f 53 63 68 65 6d 61 4c 6f 61 64 65 64 29 3d 3d  _SchemaLoaded)==
1680: 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  0) ){.    return
1690: 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69   1;.  }..  /* Fi
16a0: 67 75 72 65 20 6f 75 74 20 74 68 65 20 72 6f 6f  gure out the roo
16b0: 74 2d 70 61 67 65 20 74 68 61 74 20 74 68 65 20  t-page that the 
16c0: 6c 6f 63 6b 20 73 68 6f 75 6c 64 20 62 65 20 68  lock should be h
16d0: 65 6c 64 20 6f 6e 2e 20 46 6f 72 20 74 61 62 6c  eld on. For tabl
16e0: 65 0a 20 20 2a 2a 20 62 2d 74 72 65 65 73 2c 20  e.  ** b-trees, 
16f0: 74 68 69 73 20 69 73 20 6a 75 73 74 20 74 68 65  this is just the
1700: 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 68   root page of th
1710: 65 20 62 2d 74 72 65 65 20 62 65 69 6e 67 20 72  e b-tree being r
1720: 65 61 64 20 6f 72 0a 20 20 2a 2a 20 77 72 69 74  ead or.  ** writ
1730: 74 65 6e 2e 20 46 6f 72 20 69 6e 64 65 78 20 62  ten. For index b
1740: 2d 74 72 65 65 73 2c 20 69 74 20 69 73 20 74 68  -trees, it is th
1750: 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74  e root page of t
1760: 68 65 20 61 73 73 6f 63 69 61 74 65 64 0a 20 20  he associated.  
1770: 2a 2a 20 74 61 62 6c 65 2e 20 20 2a 2f 0a 20 20  ** table.  */.  
1780: 69 66 28 20 69 73 49 6e 64 65 78 20 29 7b 0a 20  if( isIndex ){. 
1790: 20 20 20 48 61 73 68 45 6c 65 6d 20 2a 70 3b 0a     HashElem *p;.
17a0: 20 20 20 20 66 6f 72 28 70 3d 73 71 6c 69 74 65      for(p=sqlite
17b0: 48 61 73 68 46 69 72 73 74 28 26 70 53 63 68 65  HashFirst(&pSche
17c0: 6d 61 2d 3e 69 64 78 48 61 73 68 29 3b 20 70 3b  ma->idxHash); p;
17d0: 20 70 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78   p=sqliteHashNex
17e0: 74 28 70 29 29 7b 0a 20 20 20 20 20 20 49 6e 64  t(p)){.      Ind
17f0: 65 78 20 2a 70 49 64 78 20 3d 20 28 49 6e 64 65  ex *pIdx = (Inde
1800: 78 20 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61  x *)sqliteHashDa
1810: 74 61 28 70 29 3b 0a 20 20 20 20 20 20 69 66 28  ta(p);.      if(
1820: 20 70 49 64 78 2d 3e 74 6e 75 6d 3d 3d 28 69 6e   pIdx->tnum==(in
1830: 74 29 69 52 6f 6f 74 20 29 7b 0a 20 20 20 20 20  t)iRoot ){.     
1840: 20 20 20 69 66 28 20 69 54 61 62 20 29 7b 0a 20     if( iTab ){. 
1850: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 77 6f 20           /* Two 
1860: 6f 72 20 6d 6f 72 65 20 69 6e 64 65 78 65 73 20  or more indexes 
1870: 73 68 61 72 65 20 74 68 65 20 73 61 6d 65 20 72  share the same r
1880: 6f 6f 74 20 70 61 67 65 2e 20 20 54 68 65 72 65  oot page.  There
1890: 20 6d 75 73 74 0a 20 20 20 20 20 20 20 20 20 20   must.          
18a0: 2a 2a 20 62 65 20 69 6d 70 6f 73 74 65 72 20 74  ** be imposter t
18b0: 61 62 6c 65 73 2e 20 20 53 6f 20 6a 75 73 74 20  ables.  So just 
18c0: 72 65 74 75 72 6e 20 74 72 75 65 2e 20 20 54 68  return true.  Th
18d0: 65 20 61 73 73 65 72 74 20 69 73 20 6e 6f 74 0a  e assert is not.
18e0: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 75 73 65            ** use
18f0: 66 75 6c 20 69 6e 20 74 68 61 74 20 63 61 73 65  ful in that case
1900: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72  . */.          r
1910: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20  eturn 1;.       
1920: 20 7d 0a 20 20 20 20 20 20 20 20 69 54 61 62 20   }.        iTab 
1930: 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e  = pIdx->pTable->
1940: 74 6e 75 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  tnum;.      }.  
1950: 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
1960: 20 69 54 61 62 20 3d 20 69 52 6f 6f 74 3b 0a 20   iTab = iRoot;. 
1970: 20 7d 0a 0a 20 20 2f 2a 20 53 65 61 72 63 68 20   }..  /* Search 
1980: 66 6f 72 20 74 68 65 20 72 65 71 75 69 72 65 64  for the required
1990: 20 6c 6f 63 6b 2e 20 45 69 74 68 65 72 20 61 20   lock. Either a 
19a0: 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 72 6f  write-lock on ro
19b0: 6f 74 2d 70 61 67 65 20 69 54 61 62 2c 20 61 20  ot-page iTab, a 
19c0: 0a 20 20 2a 2a 20 77 72 69 74 65 2d 6c 6f 63 6b  .  ** write-lock
19d0: 20 6f 6e 20 74 68 65 20 73 63 68 65 6d 61 20 74   on the schema t
19e0: 61 62 6c 65 2c 20 6f 72 20 28 69 66 20 74 68 65  able, or (if the
19f0: 20 63 6c 69 65 6e 74 20 69 73 20 72 65 61 64 69   client is readi
1a00: 6e 67 29 20 61 0a 20 20 2a 2a 20 72 65 61 64 2d  ng) a.  ** read-
1a10: 6c 6f 63 6b 20 6f 6e 20 69 54 61 62 20 77 69 6c  lock on iTab wil
1a20: 6c 20 73 75 66 66 69 63 65 2e 20 52 65 74 75 72  l suffice. Retur
1a30: 6e 20 31 20 69 66 20 61 6e 79 20 6f 66 20 74 68  n 1 if any of th
1a40: 65 73 65 20 61 72 65 20 66 6f 75 6e 64 2e 20 20  ese are found.  
1a50: 2a 2f 0a 20 20 66 6f 72 28 70 4c 6f 63 6b 3d 70  */.  for(pLock=p
1a60: 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 4c 6f 63  Btree->pBt->pLoc
1a70: 6b 3b 20 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b 3d  k; pLock; pLock=
1a80: 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 29 7b 0a 20  pLock->pNext){. 
1a90: 20 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e 70 42     if( pLock->pB
1aa0: 74 72 65 65 3d 3d 70 42 74 72 65 65 20 0a 20 20  tree==pBtree .  
1ab0: 20 20 20 26 26 20 28 70 4c 6f 63 6b 2d 3e 69 54     && (pLock->iT
1ac0: 61 62 6c 65 3d 3d 69 54 61 62 20 7c 7c 20 28 70  able==iTab || (p
1ad0: 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 3d 3d 57 52 49  Lock->eLock==WRI
1ae0: 54 45 5f 4c 4f 43 4b 20 26 26 20 70 4c 6f 63 6b  TE_LOCK && pLock
1af0: 2d 3e 69 54 61 62 6c 65 3d 3d 31 29 29 0a 20 20  ->iTable==1)).  
1b00: 20 20 20 26 26 20 70 4c 6f 63 6b 2d 3e 65 4c 6f     && pLock->eLo
1b10: 63 6b 3e 3d 65 4c 6f 63 6b 54 79 70 65 20 0a 20  ck>=eLockType . 
1b20: 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75     ){.      retu
1b30: 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rn 1;.    }.  }.
1b40: 0a 20 20 2f 2a 20 46 61 69 6c 65 64 20 74 6f 20  .  /* Failed to 
1b50: 66 69 6e 64 20 74 68 65 20 72 65 71 75 69 72 65  find the require
1b60: 64 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 72 65 74  d lock. */.  ret
1b70: 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 20  urn 0;.}.#endif 
1b80: 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20  /* SQLITE_DEBUG 
1b90: 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  */..#ifdef SQLIT
1ba0: 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 2a 2a 20  E_DEBUG./*.**** 
1bb0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61  This function ma
1bc0: 79 20 62 65 20 75 73 65 64 20 61 73 20 70 61 72  y be used as par
1bd0: 74 20 6f 66 20 61 73 73 65 72 74 28 29 20 73 74  t of assert() st
1be0: 61 74 65 6d 65 6e 74 73 20 6f 6e 6c 79 2e 20 2a  atements only. *
1bf0: 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ***.**.** Return
1c00: 20 74 72 75 65 20 69 66 20 69 74 20 77 6f 75 6c   true if it woul
1c10: 64 20 62 65 20 69 6c 6c 65 67 61 6c 20 66 6f 72  d be illegal for
1c20: 20 70 42 74 72 65 65 20 74 6f 20 77 72 69 74 65   pBtree to write
1c30: 20 69 6e 74 6f 20 74 68 65 0a 2a 2a 20 74 61 62   into the.** tab
1c40: 6c 65 20 6f 72 20 69 6e 64 65 78 20 72 6f 6f 74  le or index root
1c50: 65 64 20 61 74 20 69 52 6f 6f 74 20 62 65 63 61  ed at iRoot beca
1c60: 75 73 65 20 6f 74 68 65 72 20 73 68 61 72 65 64  use other shared
1c70: 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 72 65   connections are
1c80: 0a 2a 2a 20 73 69 6d 75 6c 74 61 6e 65 6f 75 73  .** simultaneous
1c90: 6c 79 20 72 65 61 64 69 6e 67 20 74 68 61 74 20  ly reading that 
1ca0: 73 61 6d 65 20 74 61 62 6c 65 20 6f 72 20 69 6e  same table or in
1cb0: 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73  dex..**.** It is
1cc0: 20 69 6c 6c 65 67 61 6c 20 66 6f 72 20 70 42 74   illegal for pBt
1cd0: 72 65 65 20 74 6f 20 77 72 69 74 65 20 69 66 20  ree to write if 
1ce0: 73 6f 6d 65 20 6f 74 68 65 72 20 42 74 72 65 65  some other Btree
1cf0: 20 6f 62 6a 65 63 74 20 74 68 61 74 0a 2a 2a 20   object that.** 
1d00: 73 68 61 72 65 73 20 74 68 65 20 73 61 6d 65 20  shares the same 
1d10: 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74 20  BtShared object 
1d20: 69 73 20 63 75 72 72 65 6e 74 6c 79 20 72 65 61  is currently rea
1d30: 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 0a  ding or writing.
1d40: 2a 2a 20 74 68 65 20 69 52 6f 6f 74 20 74 61 62  ** the iRoot tab
1d50: 6c 65 2e 20 20 45 78 63 65 70 74 2c 20 69 66 20  le.  Except, if 
1d60: 74 68 65 20 6f 74 68 65 72 20 42 74 72 65 65 20  the other Btree 
1d70: 6f 62 6a 65 63 74 20 68 61 73 20 74 68 65 0a 2a  object has the.*
1d80: 2a 20 72 65 61 64 2d 75 6e 63 6f 6d 6d 69 74 74  * read-uncommitt
1d90: 65 64 20 66 6c 61 67 20 73 65 74 2c 20 74 68 65  ed flag set, the
1da0: 6e 20 69 74 20 69 73 20 4f 4b 20 66 6f 72 20 74  n it is OK for t
1db0: 68 65 20 6f 74 68 65 72 20 6f 62 6a 65 63 74 20  he other object 
1dc0: 74 6f 0a 2a 2a 20 68 61 76 65 20 61 20 72 65 61  to.** have a rea
1dd0: 64 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20  d cursor..**.** 
1de0: 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 62 65 66  For example, bef
1df0: 6f 72 65 20 77 72 69 74 69 6e 67 20 74 6f 20 61  ore writing to a
1e00: 6e 79 20 70 61 72 74 20 6f 66 20 74 68 65 20 74  ny part of the t
1e10: 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 0a 2a 2a  able or index.**
1e20: 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67 65 20   rooted at page 
1e30: 69 52 6f 6f 74 2c 20 6f 6e 65 20 73 68 6f 75 6c  iRoot, one shoul
1e40: 64 20 63 61 6c 6c 3a 0a 2a 2a 0a 2a 2a 20 20 20  d call:.**.**   
1e50: 20 61 73 73 65 72 74 28 20 21 68 61 73 52 65 61   assert( !hasRea
1e60: 64 43 6f 6e 66 6c 69 63 74 73 28 70 42 74 72 65  dConflicts(pBtre
1e70: 65 2c 20 69 52 6f 6f 74 29 20 29 3b 0a 2a 2f 0a  e, iRoot) );.*/.
1e80: 73 74 61 74 69 63 20 69 6e 74 20 68 61 73 52 65  static int hasRe
1e90: 61 64 43 6f 6e 66 6c 69 63 74 73 28 42 74 72 65  adConflicts(Btre
1ea0: 65 20 2a 70 42 74 72 65 65 2c 20 50 67 6e 6f 20  e *pBtree, Pgno 
1eb0: 69 52 6f 6f 74 29 7b 0a 20 20 42 74 43 75 72 73  iRoot){.  BtCurs
1ec0: 6f 72 20 2a 70 3b 0a 20 20 66 6f 72 28 70 3d 70  or *p;.  for(p=p
1ed0: 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 43 75 72  Btree->pBt->pCur
1ee0: 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65  sor; p; p=p->pNe
1ef0: 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  xt){.    if( p->
1f00: 70 67 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f 74 20  pgnoRoot==iRoot 
1f10: 0a 20 20 20 20 20 26 26 20 70 2d 3e 70 42 74 72  .     && p->pBtr
1f20: 65 65 21 3d 70 42 74 72 65 65 0a 20 20 20 20 20  ee!=pBtree.     
1f30: 26 26 20 30 3d 3d 28 70 2d 3e 70 42 74 72 65 65  && 0==(p->pBtree
1f40: 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51  ->db->flags & SQ
1f50: 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69  LITE_ReadUncommi
1f60: 74 74 65 64 29 0a 20 20 20 20 29 7b 0a 20 20 20  tted).    ){.   
1f70: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
1f80: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
1f90: 30 3b 0a 7d 0a 23 65 6e 64 69 66 20 20 20 20 2f  0;.}.#endif    /
1fa0: 2a 20 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  * #ifdef SQLITE_
1fb0: 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  DEBUG */../*.** 
1fc0: 51 75 65 72 79 20 74 6f 20 73 65 65 20 69 66 20  Query to see if 
1fd0: 42 74 72 65 65 20 68 61 6e 64 6c 65 20 70 20 6d  Btree handle p m
1fe0: 61 79 20 6f 62 74 61 69 6e 20 61 20 6c 6f 63 6b  ay obtain a lock
1ff0: 20 6f 66 20 74 79 70 65 20 65 4c 6f 63 6b 20 0a   of type eLock .
2000: 2a 2a 20 28 52 45 41 44 5f 4c 4f 43 4b 20 6f 72  ** (READ_LOCK or
2010: 20 57 52 49 54 45 5f 4c 4f 43 4b 29 20 6f 6e 20   WRITE_LOCK) on 
2020: 74 68 65 20 74 61 62 6c 65 20 77 69 74 68 20 72  the table with r
2030: 6f 6f 74 2d 70 61 67 65 20 69 54 61 62 2e 20 52  oot-page iTab. R
2040: 65 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f  eturn.** SQLITE_
2050: 4f 4b 20 69 66 20 74 68 65 20 6c 6f 63 6b 20 6d  OK if the lock m
2060: 61 79 20 62 65 20 6f 62 74 61 69 6e 65 64 20 28  ay be obtained (
2070: 62 79 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73 65  by calling.** se
2080: 74 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  tSharedCacheTabl
2090: 65 4c 6f 63 6b 28 29 29 2c 20 6f 72 20 53 51 4c  eLock()), or SQL
20a0: 49 54 45 5f 4c 4f 43 4b 45 44 20 69 66 20 6e 6f  ITE_LOCKED if no
20b0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
20c0: 20 71 75 65 72 79 53 68 61 72 65 64 43 61 63 68   querySharedCach
20d0: 65 54 61 62 6c 65 4c 6f 63 6b 28 42 74 72 65 65  eTableLock(Btree
20e0: 20 2a 70 2c 20 50 67 6e 6f 20 69 54 61 62 2c 20   *p, Pgno iTab, 
20f0: 75 38 20 65 4c 6f 63 6b 29 7b 0a 20 20 42 74 53  u8 eLock){.  BtS
2100: 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
2110: 70 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70  pBt;.  BtLock *p
2120: 49 74 65 72 3b 0a 0a 20 20 61 73 73 65 72 74 28  Iter;..  assert(
2130: 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c   sqlite3BtreeHol
2140: 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20  dsMutex(p) );.  
2150: 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52  assert( eLock==R
2160: 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63  EAD_LOCK || eLoc
2170: 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29 3b  k==WRITE_LOCK );
2180: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62  .  assert( p->db
2190: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
21a0: 20 21 28 70 2d 3e 64 62 2d 3e 66 6c 61 67 73 26   !(p->db->flags&
21b0: 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d  SQLITE_ReadUncom
21c0: 6d 69 74 74 65 64 29 7c 7c 65 4c 6f 63 6b 3d 3d  mitted)||eLock==
21d0: 57 52 49 54 45 5f 4c 4f 43 4b 7c 7c 69 54 61 62  WRITE_LOCK||iTab
21e0: 3d 3d 31 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 49  ==1 );.  .  /* I
21f0: 66 20 72 65 71 75 65 73 74 69 6e 67 20 61 20 77  f requesting a w
2200: 72 69 74 65 2d 6c 6f 63 6b 2c 20 74 68 65 6e 20  rite-lock, then 
2210: 74 68 65 20 42 74 72 65 65 20 6d 75 73 74 20 68  the Btree must h
2220: 61 76 65 20 61 6e 20 6f 70 65 6e 20 77 72 69 74  ave an open writ
2230: 65 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69  e.  ** transacti
2240: 6f 6e 20 6f 6e 20 74 68 69 73 20 66 69 6c 65 2e  on on this file.
2250: 20 41 6e 64 2c 20 6f 62 76 69 6f 75 73 6c 79 2c   And, obviously,
2260: 20 66 6f 72 20 74 68 69 73 20 74 6f 20 62 65 20   for this to be 
2270: 73 6f 20 74 68 65 72 65 20 0a 20 20 2a 2a 20 6d  so there .  ** m
2280: 75 73 74 20 62 65 20 61 6e 20 6f 70 65 6e 20 77  ust be an open w
2290: 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
22a0: 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 69 74 73   on the file its
22b0: 65 6c 66 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  elf..  */.  asse
22c0: 72 74 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f  rt( eLock==READ_
22d0: 4c 4f 43 4b 20 7c 7c 20 28 70 3d 3d 70 42 74 2d  LOCK || (p==pBt-
22e0: 3e 70 57 72 69 74 65 72 20 26 26 20 70 2d 3e 69  >pWriter && p->i
22f0: 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52  nTrans==TRANS_WR
2300: 49 54 45 29 20 29 3b 0a 20 20 61 73 73 65 72 74  ITE) );.  assert
2310: 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f  ( eLock==READ_LO
2320: 43 4b 20 7c 7c 20 70 42 74 2d 3e 69 6e 54 72 61  CK || pBt->inTra
2330: 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f  nsaction==TRANS_
2340: 57 52 49 54 45 20 29 3b 0a 20 20 0a 20 20 2f 2a  WRITE );.  .  /*
2350: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
2360: 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20   a no-op if the 
2370: 73 68 61 72 65 64 2d 63 61 63 68 65 20 69 73 20  shared-cache is 
2380: 6e 6f 74 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 20  not enabled */. 
2390: 20 69 66 28 20 21 70 2d 3e 73 68 61 72 61 62 6c   if( !p->sharabl
23a0: 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
23b0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
23c0: 20 20 2f 2a 20 49 66 20 73 6f 6d 65 20 6f 74 68    /* If some oth
23d0: 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73  er connection is
23e0: 20 68 6f 6c 64 69 6e 67 20 61 6e 20 65 78 63 6c   holding an excl
23f0: 75 73 69 76 65 20 6c 6f 63 6b 2c 20 74 68 65 0a  usive lock, the.
2400: 20 20 2a 2a 20 72 65 71 75 65 73 74 65 64 20 6c    ** requested l
2410: 6f 63 6b 20 6d 61 79 20 6e 6f 74 20 62 65 20 6f  ock may not be o
2420: 62 74 61 69 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20  btained..  */.  
2430: 69 66 28 20 70 42 74 2d 3e 70 57 72 69 74 65 72  if( pBt->pWriter
2440: 21 3d 70 20 26 26 20 28 70 42 74 2d 3e 62 74 73  !=p && (pBt->bts
2450: 46 6c 61 67 73 20 26 20 42 54 53 5f 45 58 43 4c  Flags & BTS_EXCL
2460: 55 53 49 56 45 29 21 3d 30 20 29 7b 0a 20 20 20  USIVE)!=0 ){.   
2470: 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69   sqlite3Connecti
2480: 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64 62 2c  onBlocked(p->db,
2490: 20 70 42 74 2d 3e 70 57 72 69 74 65 72 2d 3e 64   pBt->pWriter->d
24a0: 62 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  b);.    return S
24b0: 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41  QLITE_LOCKED_SHA
24c0: 52 45 44 43 41 43 48 45 3b 0a 20 20 7d 0a 0a 20  REDCACHE;.  }.. 
24d0: 20 66 6f 72 28 70 49 74 65 72 3d 70 42 74 2d 3e   for(pIter=pBt->
24e0: 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70 49  pLock; pIter; pI
24f0: 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78 74  ter=pIter->pNext
2500: 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 63 6f  ){.    /* The co
2510: 6e 64 69 74 69 6f 6e 20 28 70 49 74 65 72 2d 3e  ndition (pIter->
2520: 65 4c 6f 63 6b 21 3d 65 4c 6f 63 6b 29 20 69 6e  eLock!=eLock) in
2530: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69   the following i
2540: 66 28 2e 2e 2e 29 20 0a 20 20 20 20 2a 2a 20 73  f(...) .    ** s
2550: 74 61 74 65 6d 65 6e 74 20 69 73 20 61 20 73 69  tatement is a si
2560: 6d 70 6c 69 66 69 63 61 74 69 6f 6e 20 6f 66 3a  mplification of:
2570: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
2580: 20 28 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c   (eLock==WRITE_L
2590: 4f 43 4b 20 7c 7c 20 70 49 74 65 72 2d 3e 65 4c  OCK || pIter->eL
25a0: 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 29  ock==WRITE_LOCK)
25b0: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 73  .    **.    ** s
25c0: 69 6e 63 65 20 77 65 20 6b 6e 6f 77 20 74 68 61  ince we know tha
25d0: 74 20 69 66 20 65 4c 6f 63 6b 3d 3d 57 52 49 54  t if eLock==WRIT
25e0: 45 5f 4c 4f 43 4b 2c 20 74 68 65 6e 20 6e 6f 20  E_LOCK, then no 
25f0: 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e  other connection
2600: 0a 20 20 20 20 2a 2a 20 6d 61 79 20 68 6f 6c 64  .    ** may hold
2610: 20 61 20 57 52 49 54 45 5f 4c 4f 43 4b 20 6f 6e   a WRITE_LOCK on
2620: 20 61 6e 79 20 74 61 62 6c 65 20 69 6e 20 74 68   any table in th
2630: 69 73 20 66 69 6c 65 20 28 73 69 6e 63 65 20 74  is file (since t
2640: 68 65 72 65 20 63 61 6e 0a 20 20 20 20 2a 2a 20  here can.    ** 
2650: 6f 6e 6c 79 20 62 65 20 61 20 73 69 6e 67 6c 65  only be a single
2660: 20 77 72 69 74 65 72 29 2e 0a 20 20 20 20 2a 2f   writer)..    */
2670: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74  .    assert( pIt
2680: 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f  er->eLock==READ_
2690: 4c 4f 43 4b 20 7c 7c 20 70 49 74 65 72 2d 3e 65  LOCK || pIter->e
26a0: 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b  Lock==WRITE_LOCK
26b0: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
26c0: 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b  eLock==READ_LOCK
26d0: 20 7c 7c 20 70 49 74 65 72 2d 3e 70 42 74 72 65   || pIter->pBtre
26e0: 65 3d 3d 70 20 7c 7c 20 70 49 74 65 72 2d 3e 65  e==p || pIter->e
26f0: 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 29  Lock==READ_LOCK)
2700: 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65 72 2d  ;.    if( pIter-
2710: 3e 70 42 74 72 65 65 21 3d 70 20 26 26 20 70 49  >pBtree!=p && pI
2720: 74 65 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61  ter->iTable==iTa
2730: 62 20 26 26 20 70 49 74 65 72 2d 3e 65 4c 6f 63  b && pIter->eLoc
2740: 6b 21 3d 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20  k!=eLock ){.    
2750: 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74    sqlite3Connect
2760: 69 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64 62  ionBlocked(p->db
2770: 2c 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65 2d  , pIter->pBtree-
2780: 3e 64 62 29 3b 0a 20 20 20 20 20 20 69 66 28 20  >db);.      if( 
2790: 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43  eLock==WRITE_LOC
27a0: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  K ){.        ass
27b0: 65 72 74 28 20 70 3d 3d 70 42 74 2d 3e 70 57 72  ert( p==pBt->pWr
27c0: 69 74 65 72 20 29 3b 0a 20 20 20 20 20 20 20 20  iter );.        
27d0: 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d  pBt->btsFlags |=
27e0: 20 42 54 53 5f 50 45 4e 44 49 4e 47 3b 0a 20 20   BTS_PENDING;.  
27f0: 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75      }.      retu
2800: 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44  rn SQLITE_LOCKED
2810: 5f 53 48 41 52 45 44 43 41 43 48 45 3b 0a 20 20  _SHAREDCACHE;.  
2820: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
2830: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65   SQLITE_OK;.}.#e
2840: 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f  ndif /* !SQLITE_
2850: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
2860: 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  E */..#ifndef SQ
2870: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
2880: 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 41 64 64  _CACHE./*.** Add
2890: 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 74   a lock on the t
28a0: 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70  able with root-p
28b0: 61 67 65 20 69 54 61 62 6c 65 20 74 6f 20 74 68  age iTable to th
28c0: 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 20 75  e shared-btree u
28d0: 73 65 64 0a 2a 2a 20 62 79 20 42 74 72 65 65 20  sed.** by Btree 
28e0: 68 61 6e 64 6c 65 20 70 2e 20 50 61 72 61 6d 65  handle p. Parame
28f0: 74 65 72 20 65 4c 6f 63 6b 20 6d 75 73 74 20 62  ter eLock must b
2900: 65 20 65 69 74 68 65 72 20 52 45 41 44 5f 4c 4f  e either READ_LO
2910: 43 4b 20 6f 72 20 0a 2a 2a 20 57 52 49 54 45 5f  CK or .** WRITE_
2920: 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  LOCK..**.** This
2930: 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65   function assume
2940: 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  s the following:
2950: 0a 2a 2a 0a 2a 2a 20 20 20 28 61 29 20 54 68 65  .**.**   (a) The
2960: 20 73 70 65 63 69 66 69 65 64 20 42 74 72 65 65   specified Btree
2970: 20 6f 62 6a 65 63 74 20 70 20 69 73 20 63 6f 6e   object p is con
2980: 6e 65 63 74 65 64 20 74 6f 20 61 20 73 68 61 72  nected to a shar
2990: 61 62 6c 65 0a 2a 2a 20 20 20 20 20 20 20 64 61  able.**       da
29a0: 74 61 62 61 73 65 20 28 6f 6e 65 20 77 69 74 68  tabase (one with
29b0: 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 73 68   the BtShared.sh
29c0: 61 72 61 62 6c 65 20 66 6c 61 67 20 73 65 74 29  arable flag set)
29d0: 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 28 62  , and.**.**   (b
29e0: 29 20 4e 6f 20 6f 74 68 65 72 20 42 74 72 65 65  ) No other Btree
29f0: 20 6f 62 6a 65 63 74 73 20 68 6f 6c 64 20 61 20   objects hold a 
2a00: 6c 6f 63 6b 20 74 68 61 74 20 63 6f 6e 66 6c 69  lock that confli
2a10: 63 74 73 0a 2a 2a 20 20 20 20 20 20 20 77 69 74  cts.**       wit
2a20: 68 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  h the requested 
2a30: 6c 6f 63 6b 20 28 69 2e 65 2e 20 71 75 65 72 79  lock (i.e. query
2a40: 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
2a50: 4c 6f 63 6b 28 29 20 68 61 73 0a 2a 2a 20 20 20  Lock() has.**   
2a60: 20 20 20 20 61 6c 72 65 61 64 79 20 62 65 65 6e      already been
2a70: 20 63 61 6c 6c 65 64 20 61 6e 64 20 72 65 74 75   called and retu
2a80: 72 6e 65 64 20 53 51 4c 49 54 45 5f 4f 4b 29 2e  rned SQLITE_OK).
2a90: 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  .**.** SQLITE_OK
2aa0: 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
2ab0: 74 68 65 20 6c 6f 63 6b 20 69 73 20 61 64 64 65  the lock is adde
2ac0: 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2e 20  d successfully. 
2ad0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 0a 2a 2a  SQLITE_NOMEM .**
2ae0: 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
2af0: 61 20 6d 61 6c 6c 6f 63 20 61 74 74 65 6d 70 74  a malloc attempt
2b00: 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69   fails..*/.stati
2b10: 63 20 69 6e 74 20 73 65 74 53 68 61 72 65 64 43  c int setSharedC
2b20: 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 42 74  acheTableLock(Bt
2b30: 72 65 65 20 2a 70 2c 20 50 67 6e 6f 20 69 54 61  ree *p, Pgno iTa
2b40: 62 6c 65 2c 20 75 38 20 65 4c 6f 63 6b 29 7b 0a  ble, u8 eLock){.
2b50: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
2b60: 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74 4c 6f  = p->pBt;.  BtLo
2b70: 63 6b 20 2a 70 4c 6f 63 6b 20 3d 20 30 3b 0a 20  ck *pLock = 0;. 
2b80: 20 42 74 4c 6f 63 6b 20 2a 70 49 74 65 72 3b 0a   BtLock *pIter;.
2b90: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
2ba0: 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65  e3BtreeHoldsMute
2bb0: 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74  x(p) );.  assert
2bc0: 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f  ( eLock==READ_LO
2bd0: 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 57 52 49  CK || eLock==WRI
2be0: 54 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73  TE_LOCK );.  ass
2bf0: 65 72 74 28 20 70 2d 3e 64 62 21 3d 30 20 29 3b  ert( p->db!=0 );
2c00: 0a 0a 20 20 2f 2a 20 41 20 63 6f 6e 6e 65 63 74  ..  /* A connect
2c10: 69 6f 6e 20 77 69 74 68 20 74 68 65 20 72 65 61  ion with the rea
2c20: 64 2d 75 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c  d-uncommitted fl
2c30: 61 67 20 73 65 74 20 77 69 6c 6c 20 6e 65 76 65  ag set will neve
2c40: 72 20 74 72 79 20 74 6f 0a 20 20 2a 2a 20 6f 62  r try to.  ** ob
2c50: 74 61 69 6e 20 61 20 72 65 61 64 2d 6c 6f 63 6b  tain a read-lock
2c60: 20 75 73 69 6e 67 20 74 68 69 73 20 66 75 6e 63   using this func
2c70: 74 69 6f 6e 2e 20 54 68 65 20 6f 6e 6c 79 20 72  tion. The only r
2c80: 65 61 64 2d 6c 6f 63 6b 20 6f 62 74 61 69 6e 65  ead-lock obtaine
2c90: 64 0a 20 20 2a 2a 20 62 79 20 61 20 63 6f 6e 6e  d.  ** by a conn
2ca0: 65 63 74 69 6f 6e 20 69 6e 20 72 65 61 64 2d 75  ection in read-u
2cb0: 6e 63 6f 6d 6d 69 74 74 65 64 20 6d 6f 64 65 20  ncommitted mode 
2cc0: 69 73 20 6f 6e 20 74 68 65 20 73 71 6c 69 74 65  is on the sqlite
2cd0: 5f 6d 61 73 74 65 72 20 0a 20 20 2a 2a 20 74 61  _master .  ** ta
2ce0: 62 6c 65 2c 20 61 6e 64 20 74 68 61 74 20 6c 6f  ble, and that lo
2cf0: 63 6b 20 69 73 20 6f 62 74 61 69 6e 65 64 20 69  ck is obtained i
2d00: 6e 20 42 74 72 65 65 42 65 67 69 6e 54 72 61 6e  n BtreeBeginTran
2d10: 73 28 29 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72  s().  */.  asser
2d20: 74 28 20 30 3d 3d 28 70 2d 3e 64 62 2d 3e 66 6c  t( 0==(p->db->fl
2d30: 61 67 73 26 53 51 4c 49 54 45 5f 52 65 61 64 55  ags&SQLITE_ReadU
2d40: 6e 63 6f 6d 6d 69 74 74 65 64 29 20 7c 7c 20 65  ncommitted) || e
2d50: 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b  Lock==WRITE_LOCK
2d60: 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66   );..  /* This f
2d70: 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 6f  unction should o
2d80: 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e  nly be called on
2d90: 20 61 20 73 68 61 72 61 62 6c 65 20 62 2d 74 72   a sharable b-tr
2da0: 65 65 20 61 66 74 65 72 20 69 74 20 0a 20 20 2a  ee after it .  *
2db0: 2a 20 68 61 73 20 62 65 65 6e 20 64 65 74 65 72  * has been deter
2dc0: 6d 69 6e 65 64 20 74 68 61 74 20 6e 6f 20 6f 74  mined that no ot
2dd0: 68 65 72 20 62 2d 74 72 65 65 20 68 6f 6c 64 73  her b-tree holds
2de0: 20 61 20 63 6f 6e 66 6c 69 63 74 69 6e 67 20 6c   a conflicting l
2df0: 6f 63 6b 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72  ock.  */.  asser
2e00: 74 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 29  t( p->sharable )
2e10: 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c 49  ;.  assert( SQLI
2e20: 54 45 5f 4f 4b 3d 3d 71 75 65 72 79 53 68 61 72  TE_OK==queryShar
2e30: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
2e40: 28 70 2c 20 69 54 61 62 6c 65 2c 20 65 4c 6f 63  (p, iTable, eLoc
2e50: 6b 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 72 73  k) );..  /* Firs
2e60: 74 20 73 65 61 72 63 68 20 74 68 65 20 6c 69 73  t search the lis
2e70: 74 20 66 6f 72 20 61 6e 20 65 78 69 73 74 69 6e  t for an existin
2e80: 67 20 6c 6f 63 6b 20 6f 6e 20 74 68 69 73 20 74  g lock on this t
2e90: 61 62 6c 65 2e 20 2a 2f 0a 20 20 66 6f 72 28 70  able. */.  for(p
2ea0: 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b  Iter=pBt->pLock;
2eb0: 20 70 49 74 65 72 3b 20 70 49 74 65 72 3d 70 49   pIter; pIter=pI
2ec0: 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  ter->pNext){.   
2ed0: 20 69 66 28 20 70 49 74 65 72 2d 3e 69 54 61 62   if( pIter->iTab
2ee0: 6c 65 3d 3d 69 54 61 62 6c 65 20 26 26 20 70 49  le==iTable && pI
2ef0: 74 65 72 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29  ter->pBtree==p )
2f00: 7b 0a 20 20 20 20 20 20 70 4c 6f 63 6b 20 3d 20  {.      pLock = 
2f10: 70 49 74 65 72 3b 0a 20 20 20 20 20 20 62 72 65  pIter;.      bre
2f20: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ak;.    }.  }.. 
2f30: 20 2f 2a 20 49 66 20 74 68 65 20 61 62 6f 76 65   /* If the above
2f40: 20 73 65 61 72 63 68 20 64 69 64 20 6e 6f 74 20   search did not 
2f50: 66 69 6e 64 20 61 20 42 74 4c 6f 63 6b 20 73 74  find a BtLock st
2f60: 72 75 63 74 20 61 73 73 6f 63 69 61 74 69 6e 67  ruct associating
2f70: 20 42 74 72 65 65 20 70 0a 20 20 2a 2a 20 77 69   Btree p.  ** wi
2f80: 74 68 20 74 61 62 6c 65 20 69 54 61 62 6c 65 2c  th table iTable,
2f90: 20 61 6c 6c 6f 63 61 74 65 20 6f 6e 65 20 61 6e   allocate one an
2fa0: 64 20 6c 69 6e 6b 20 69 74 20 69 6e 74 6f 20 74  d link it into t
2fb0: 68 65 20 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20  he list..  */.  
2fc0: 69 66 28 20 21 70 4c 6f 63 6b 20 29 7b 0a 20 20  if( !pLock ){.  
2fd0: 20 20 70 4c 6f 63 6b 20 3d 20 28 42 74 4c 6f 63    pLock = (BtLoc
2fe0: 6b 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  k *)sqlite3Mallo
2ff0: 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28 42 74 4c  cZero(sizeof(BtL
3000: 6f 63 6b 29 29 3b 0a 20 20 20 20 69 66 28 20 21  ock));.    if( !
3010: 70 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 72  pLock ){.      r
3020: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
3030: 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c  EM;.    }.    pL
3040: 6f 63 6b 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54  ock->iTable = iT
3050: 61 62 6c 65 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d  able;.    pLock-
3060: 3e 70 42 74 72 65 65 20 3d 20 70 3b 0a 20 20 20  >pBtree = p;.   
3070: 20 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 20 3d 20   pLock->pNext = 
3080: 70 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 20 20  pBt->pLock;.    
3090: 70 42 74 2d 3e 70 4c 6f 63 6b 20 3d 20 70 4c 6f  pBt->pLock = pLo
30a0: 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65  ck;.  }..  /* Se
30b0: 74 20 74 68 65 20 42 74 4c 6f 63 6b 2e 65 4c 6f  t the BtLock.eLo
30c0: 63 6b 20 76 61 72 69 61 62 6c 65 20 74 6f 20 74  ck variable to t
30d0: 68 65 20 6d 61 78 69 6d 75 6d 20 6f 66 20 74 68  he maximum of th
30e0: 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 6b 0a 20  e current lock. 
30f0: 20 2a 2a 20 61 6e 64 20 74 68 65 20 72 65 71 75   ** and the requ
3100: 65 73 74 65 64 20 6c 6f 63 6b 2e 20 54 68 69 73  ested lock. This
3110: 20 6d 65 61 6e 73 20 69 66 20 61 20 77 72 69 74   means if a writ
3120: 65 2d 6c 6f 63 6b 20 77 61 73 20 61 6c 72 65 61  e-lock was alrea
3130: 64 79 20 68 65 6c 64 0a 20 20 2a 2a 20 61 6e 64  dy held.  ** and
3140: 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 72 65 71   a read-lock req
3150: 75 65 73 74 65 64 2c 20 77 65 20 64 6f 6e 27 74  uested, we don't
3160: 20 69 6e 63 6f 72 72 65 63 74 6c 79 20 64 6f 77   incorrectly dow
3170: 6e 67 72 61 64 65 20 74 68 65 20 6c 6f 63 6b 2e  ngrade the lock.
3180: 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
3190: 57 52 49 54 45 5f 4c 4f 43 4b 3e 52 45 41 44 5f  WRITE_LOCK>READ_
31a0: 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 65 4c  LOCK );.  if( eL
31b0: 6f 63 6b 3e 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b  ock>pLock->eLock
31c0: 20 29 7b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 65   ){.    pLock->e
31d0: 4c 6f 63 6b 20 3d 20 65 4c 6f 63 6b 3b 0a 20 20  Lock = eLock;.  
31e0: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  }..  return SQLI
31f0: 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20  TE_OK;.}.#endif 
3200: 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  /* !SQLITE_OMIT_
3210: 53 48 41 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a  SHARED_CACHE */.
3220: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
3230: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
3240: 45 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20  E./*.** Release 
3250: 61 6c 6c 20 74 68 65 20 74 61 62 6c 65 20 6c 6f  all the table lo
3260: 63 6b 73 20 28 6c 6f 63 6b 73 20 6f 62 74 61 69  cks (locks obtai
3270: 6e 65 64 20 76 69 61 20 63 61 6c 6c 73 20 74 6f  ned via calls to
3280: 0a 2a 2a 20 74 68 65 20 73 65 74 53 68 61 72 65  .** the setShare
3290: 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28  dCacheTableLock(
32a0: 29 20 70 72 6f 63 65 64 75 72 65 29 20 68 65 6c  ) procedure) hel
32b0: 64 20 62 79 20 42 74 72 65 65 20 6f 62 6a 65 63  d by Btree objec
32c0: 74 20 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  t p..**.** This 
32d0: 66 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65 73  function assumes
32e0: 20 74 68 61 74 20 42 74 72 65 65 20 70 20 68 61   that Btree p ha
32f0: 73 20 61 6e 20 6f 70 65 6e 20 72 65 61 64 20 6f  s an open read o
3300: 72 20 77 72 69 74 65 20 0a 2a 2a 20 74 72 61 6e  r write .** tran
3310: 73 61 63 74 69 6f 6e 2e 20 49 66 20 69 74 20 64  saction. If it d
3320: 6f 65 73 20 6e 6f 74 2c 20 74 68 65 6e 20 74 68  oes not, then th
3330: 65 20 42 54 53 5f 50 45 4e 44 49 4e 47 20 66 6c  e BTS_PENDING fl
3340: 61 67 0a 2a 2a 20 6d 61 79 20 62 65 20 69 6e 63  ag.** may be inc
3350: 6f 72 72 65 63 74 6c 79 20 63 6c 65 61 72 65 64  orrectly cleared
3360: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
3370: 20 63 6c 65 61 72 41 6c 6c 53 68 61 72 65 64 43   clearAllSharedC
3380: 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 42  acheTableLocks(B
3390: 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68  tree *p){.  BtSh
33a0: 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
33b0: 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 2a 70  Bt;.  BtLock **p
33c0: 70 49 74 65 72 20 3d 20 26 70 42 74 2d 3e 70 4c  pIter = &pBt->pL
33d0: 6f 63 6b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ock;..  assert( 
33e0: 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64  sqlite3BtreeHold
33f0: 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61  sMutex(p) );.  a
3400: 73 73 65 72 74 28 20 70 2d 3e 73 68 61 72 61 62  ssert( p->sharab
3410: 6c 65 20 7c 7c 20 30 3d 3d 2a 70 70 49 74 65 72  le || 0==*ppIter
3420: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
3430: 3e 69 6e 54 72 61 6e 73 3e 30 20 29 3b 0a 0a 20  >inTrans>0 );.. 
3440: 20 77 68 69 6c 65 28 20 2a 70 70 49 74 65 72 20   while( *ppIter 
3450: 29 7b 0a 20 20 20 20 42 74 4c 6f 63 6b 20 2a 70  ){.    BtLock *p
3460: 4c 6f 63 6b 20 3d 20 2a 70 70 49 74 65 72 3b 0a  Lock = *ppIter;.
3470: 20 20 20 20 61 73 73 65 72 74 28 20 28 70 42 74      assert( (pBt
3480: 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53  ->btsFlags & BTS
3490: 5f 45 58 43 4c 55 53 49 56 45 29 3d 3d 30 20 7c  _EXCLUSIVE)==0 |
34a0: 7c 20 70 42 74 2d 3e 70 57 72 69 74 65 72 3d 3d  | pBt->pWriter==
34b0: 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 20 29 3b  pLock->pBtree );
34c0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f  .    assert( pLo
34d0: 63 6b 2d 3e 70 42 74 72 65 65 2d 3e 69 6e 54 72  ck->pBtree->inTr
34e0: 61 6e 73 3e 3d 70 4c 6f 63 6b 2d 3e 65 4c 6f 63  ans>=pLock->eLoc
34f0: 6b 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 6f  k );.    if( pLo
3500: 63 6b 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29 7b  ck->pBtree==p ){
3510: 0a 20 20 20 20 20 20 2a 70 70 49 74 65 72 20 3d  .      *ppIter =
3520: 20 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a 20   pLock->pNext;. 
3530: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f       assert( pLo
3540: 63 6b 2d 3e 69 54 61 62 6c 65 21 3d 31 20 7c 7c  ck->iTable!=1 ||
3550: 20 70 4c 6f 63 6b 3d 3d 26 70 2d 3e 6c 6f 63 6b   pLock==&p->lock
3560: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c   );.      if( pL
3570: 6f 63 6b 2d 3e 69 54 61 62 6c 65 21 3d 31 20 29  ock->iTable!=1 )
3580: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
3590: 33 5f 66 72 65 65 28 70 4c 6f 63 6b 29 3b 0a 20  3_free(pLock);. 
35a0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
35b0: 7b 0a 20 20 20 20 20 20 70 70 49 74 65 72 20 3d  {.      ppIter =
35c0: 20 26 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a   &pLock->pNext;.
35d0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73      }.  }..  ass
35e0: 65 72 74 28 20 28 70 42 74 2d 3e 62 74 73 46 6c  ert( (pBt->btsFl
35f0: 61 67 73 20 26 20 42 54 53 5f 50 45 4e 44 49 4e  ags & BTS_PENDIN
3600: 47 29 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 70 57  G)==0 || pBt->pW
3610: 72 69 74 65 72 20 29 3b 0a 20 20 69 66 28 20 70  riter );.  if( p
3620: 42 74 2d 3e 70 57 72 69 74 65 72 3d 3d 70 20 29  Bt->pWriter==p )
3630: 7b 0a 20 20 20 20 70 42 74 2d 3e 70 57 72 69 74  {.    pBt->pWrit
3640: 65 72 20 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d  er = 0;.    pBt-
3650: 3e 62 74 73 46 6c 61 67 73 20 26 3d 20 7e 28 42  >btsFlags &= ~(B
3660: 54 53 5f 45 58 43 4c 55 53 49 56 45 7c 42 54 53  TS_EXCLUSIVE|BTS
3670: 5f 50 45 4e 44 49 4e 47 29 3b 0a 20 20 7d 65 6c  _PENDING);.  }el
3680: 73 65 20 69 66 28 20 70 42 74 2d 3e 6e 54 72 61  se if( pBt->nTra
3690: 6e 73 61 63 74 69 6f 6e 3d 3d 32 20 29 7b 0a 20  nsaction==2 ){. 
36a0: 20 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74     /* This funct
36b0: 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68  ion is called wh
36c0: 65 6e 20 42 74 72 65 65 20 70 20 69 73 20 63 6f  en Btree p is co
36d0: 6e 63 6c 75 64 69 6e 67 20 69 74 73 20 0a 20 20  ncluding its .  
36e0: 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
36f0: 2e 20 49 66 20 74 68 65 72 65 20 63 75 72 72 65  . If there curre
3700: 6e 74 6c 79 20 65 78 69 73 74 73 20 61 20 77 72  ntly exists a wr
3710: 69 74 65 72 2c 20 61 6e 64 20 70 20 69 73 20 6e  iter, and p is n
3720: 6f 74 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 77  ot.    ** that w
3730: 72 69 74 65 72 2c 20 74 68 65 6e 20 74 68 65 20  riter, then the 
3740: 6e 75 6d 62 65 72 20 6f 66 20 6c 6f 63 6b 73 20  number of locks 
3750: 68 65 6c 64 20 62 79 20 63 6f 6e 6e 65 63 74 69  held by connecti
3760: 6f 6e 73 20 6f 74 68 65 72 0a 20 20 20 20 2a 2a  ons other.    **
3770: 20 74 68 61 6e 20 74 68 65 20 77 72 69 74 65 72   than the writer
3780: 20 6d 75 73 74 20 62 65 20 61 62 6f 75 74 20 74   must be about t
3790: 6f 20 64 72 6f 70 20 74 6f 20 7a 65 72 6f 2e 20  o drop to zero. 
37a0: 49 6e 20 74 68 69 73 20 63 61 73 65 0a 20 20 20  In this case.   
37b0: 20 2a 2a 20 73 65 74 20 74 68 65 20 42 54 53 5f   ** set the BTS_
37c0: 50 45 4e 44 49 4e 47 20 66 6c 61 67 20 74 6f 20  PENDING flag to 
37d0: 30 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  0..    **.    **
37e0: 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 74   If there is not
37f0: 20 63 75 72 72 65 6e 74 6c 79 20 61 20 77 72 69   currently a wri
3800: 74 65 72 2c 20 74 68 65 6e 20 42 54 53 5f 50 45  ter, then BTS_PE
3810: 4e 44 49 4e 47 20 6d 75 73 74 0a 20 20 20 20 2a  NDING must.    *
3820: 2a 20 62 65 20 7a 65 72 6f 20 61 6c 72 65 61 64  * be zero alread
3830: 79 2e 20 53 6f 20 74 68 69 73 20 6e 65 78 74 20  y. So this next 
3840: 6c 69 6e 65 20 69 73 20 68 61 72 6d 6c 65 73 73  line is harmless
3850: 20 69 6e 20 74 68 61 74 20 63 61 73 65 2e 0a 20   in that case.. 
3860: 20 20 20 2a 2f 0a 20 20 20 20 70 42 74 2d 3e 62     */.    pBt->b
3870: 74 73 46 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f  tsFlags &= ~BTS_
3880: 50 45 4e 44 49 4e 47 3b 0a 20 20 7d 0a 7d 0a 0a  PENDING;.  }.}..
3890: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
38a0: 69 6f 6e 20 63 68 61 6e 67 65 73 20 61 6c 6c 20  ion changes all 
38b0: 77 72 69 74 65 2d 6c 6f 63 6b 73 20 68 65 6c 64  write-locks held
38c0: 20 62 79 20 42 74 72 65 65 20 70 20 69 6e 74 6f   by Btree p into
38d0: 20 72 65 61 64 2d 6c 6f 63 6b 73 2e 0a 2a 2f 0a   read-locks..*/.
38e0: 73 74 61 74 69 63 20 76 6f 69 64 20 64 6f 77 6e  static void down
38f0: 67 72 61 64 65 41 6c 6c 53 68 61 72 65 64 43 61  gradeAllSharedCa
3900: 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 42 74  cheTableLocks(Bt
3910: 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61  ree *p){.  BtSha
3920: 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
3930: 74 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 57  t;.  if( pBt->pW
3940: 72 69 74 65 72 3d 3d 70 20 29 7b 0a 20 20 20 20  riter==p ){.    
3950: 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 3b 0a 20  BtLock *pLock;. 
3960: 20 20 20 70 42 74 2d 3e 70 57 72 69 74 65 72 20     pBt->pWriter 
3970: 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d 3e 62 74  = 0;.    pBt->bt
3980: 73 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 53 5f  sFlags &= ~(BTS_
3990: 45 58 43 4c 55 53 49 56 45 7c 42 54 53 5f 50 45  EXCLUSIVE|BTS_PE
39a0: 4e 44 49 4e 47 29 3b 0a 20 20 20 20 66 6f 72 28  NDING);.    for(
39b0: 70 4c 6f 63 6b 3d 70 42 74 2d 3e 70 4c 6f 63 6b  pLock=pBt->pLock
39c0: 3b 20 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b 3d 70  ; pLock; pLock=p
39d0: 4c 6f 63 6b 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  Lock->pNext){.  
39e0: 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63      assert( pLoc
39f0: 6b 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c  k->eLock==READ_L
3a00: 4f 43 4b 20 7c 7c 20 70 4c 6f 63 6b 2d 3e 70 42  OCK || pLock->pB
3a10: 74 72 65 65 3d 3d 70 20 29 3b 0a 20 20 20 20 20  tree==p );.     
3a20: 20 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 3d 20   pLock->eLock = 
3a30: 52 45 41 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d  READ_LOCK;.    }
3a40: 0a 20 20 7d 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f  .  }.}..#endif /
3a50: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  * SQLITE_OMIT_SH
3a60: 41 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 73  ARED_CACHE */..s
3a70: 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61  tatic void relea
3a80: 73 65 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a  sePage(MemPage *
3a90: 70 50 61 67 65 29 3b 20 20 2f 2a 20 46 6f 72 77  pPage);  /* Forw
3aa0: 61 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f  ard reference */
3ab0: 0a 0a 2f 2a 0a 2a 2a 2a 2a 2a 20 54 68 69 73 20  ../*.***** This 
3ac0: 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
3ad0: 69 6e 73 69 64 65 20 6f 66 20 61 73 73 65 72 74  inside of assert
3ae0: 28 29 20 6f 6e 6c 79 20 2a 2a 2a 2a 0a 2a 2a 0a  () only ****.**.
3af0: 2a 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 74  ** Verify that t
3b00: 68 65 20 63 75 72 73 6f 72 20 68 6f 6c 64 73 20  he cursor holds 
3b10: 74 68 65 20 6d 75 74 65 78 20 6f 6e 20 69 74 73  the mutex on its
3b20: 20 42 74 53 68 61 72 65 64 0a 2a 2f 0a 23 69 66   BtShared.*/.#if
3b30: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
3b40: 0a 73 74 61 74 69 63 20 69 6e 74 20 63 75 72 73  .static int curs
3b50: 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 42 74 43  orHoldsMutex(BtC
3b60: 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 72 65 74  ursor *p){.  ret
3b70: 75 72 6e 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  urn sqlite3_mute
3b80: 78 5f 68 65 6c 64 28 70 2d 3e 70 42 74 2d 3e 6d  x_held(p->pBt->m
3b90: 75 74 65 78 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a  utex);.}.#endif.
3ba0: 0a 2f 2a 0a 2a 2a 20 49 6e 76 61 6c 69 64 61 74  ./*.** Invalidat
3bb0: 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63  e the overflow c
3bc0: 61 63 68 65 20 6f 66 20 74 68 65 20 63 75 72 73  ache of the curs
3bd0: 6f 72 20 70 61 73 73 65 64 20 61 73 20 74 68 65  or passed as the
3be0: 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e   first argument.
3bf0: 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 68 61 72 65  .** on the share
3c00: 64 20 62 74 72 65 65 20 73 74 72 75 63 74 75 72  d btree structur
3c10: 65 20 70 42 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e  e pBt..*/.#defin
3c20: 65 20 69 6e 76 61 6c 69 64 61 74 65 4f 76 65 72  e invalidateOver
3c30: 66 6c 6f 77 43 61 63 68 65 28 70 43 75 72 29 20  flowCache(pCur) 
3c40: 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20  (pCur->curFlags 
3c50: 26 3d 20 7e 42 54 43 46 5f 56 61 6c 69 64 4f 76  &= ~BTCF_ValidOv
3c60: 66 6c 29 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 61 6c  fl)../*.** Inval
3c70: 69 64 61 74 65 20 74 68 65 20 6f 76 65 72 66 6c  idate the overfl
3c80: 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63  ow page-list cac
3c90: 68 65 20 66 6f 72 20 61 6c 6c 20 63 75 72 73 6f  he for all curso
3ca0: 72 73 20 6f 70 65 6e 65 64 0a 2a 2a 20 6f 6e 20  rs opened.** on 
3cb0: 74 68 65 20 73 68 61 72 65 64 20 62 74 72 65 65  the shared btree
3cc0: 20 73 74 72 75 63 74 75 72 65 20 70 42 74 2e 0a   structure pBt..
3cd0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69  */.static void i
3ce0: 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72  nvalidateAllOver
3cf0: 66 6c 6f 77 43 61 63 68 65 28 42 74 53 68 61 72  flowCache(BtShar
3d00: 65 64 20 2a 70 42 74 29 7b 0a 20 20 42 74 43 75  ed *pBt){.  BtCu
3d10: 72 73 6f 72 20 2a 70 3b 0a 20 20 61 73 73 65 72  rsor *p;.  asser
3d20: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
3d30: 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
3d40: 29 20 29 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74  ) );.  for(p=pBt
3d50: 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d  ->pCursor; p; p=
3d60: 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69  p->pNext){.    i
3d70: 6e 76 61 6c 69 64 61 74 65 4f 76 65 72 66 6c 6f  nvalidateOverflo
3d80: 77 43 61 63 68 65 28 70 29 3b 0a 20 20 7d 0a 7d  wCache(p);.  }.}
3d90: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
3da0: 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 2f  _OMIT_INCRBLOB./
3db0: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
3dc0: 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 62 65 66  on is called bef
3dd0: 6f 72 65 20 6d 6f 64 69 66 79 69 6e 67 20 74 68  ore modifying th
3de0: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 61 20  e contents of a 
3df0: 74 61 62 6c 65 0a 2a 2a 20 74 6f 20 69 6e 76 61  table.** to inva
3e00: 6c 69 64 61 74 65 20 61 6e 79 20 69 6e 63 72 62  lidate any incrb
3e10: 6c 6f 62 20 63 75 72 73 6f 72 73 20 74 68 61 74  lob cursors that
3e20: 20 61 72 65 20 6f 70 65 6e 20 6f 6e 20 74 68 65   are open on the
3e30: 0a 2a 2a 20 72 6f 77 20 6f 72 20 6f 6e 65 20 6f  .** row or one o
3e40: 66 20 74 68 65 20 72 6f 77 73 20 62 65 69 6e 67  f the rows being
3e50: 20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a   modified..**.**
3e60: 20 49 66 20 61 72 67 75 6d 65 6e 74 20 69 73 43   If argument isC
3e70: 6c 65 61 72 54 61 62 6c 65 20 69 73 20 74 72 75  learTable is tru
3e80: 65 2c 20 74 68 65 6e 20 74 68 65 20 65 6e 74 69  e, then the enti
3e90: 72 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  re contents of t
3ea0: 68 65 0a 2a 2a 20 74 61 62 6c 65 20 69 73 20 61  he.** table is a
3eb0: 62 6f 75 74 20 74 6f 20 62 65 20 64 65 6c 65 74  bout to be delet
3ec0: 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ed. In this case
3ed0: 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c 20   invalidate all 
3ee0: 69 6e 63 72 62 6c 6f 62 0a 2a 2a 20 63 75 72 73  incrblob.** curs
3ef0: 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 61 6e 79 20  ors open on any 
3f00: 72 6f 77 20 77 69 74 68 69 6e 20 74 68 65 20 74  row within the t
3f10: 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70  able with root-p
3f20: 61 67 65 20 70 67 6e 6f 52 6f 6f 74 2e 0a 2a 2a  age pgnoRoot..**
3f30: 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69  .** Otherwise, i
3f40: 66 20 61 72 67 75 6d 65 6e 74 20 69 73 43 6c 65  f argument isCle
3f50: 61 72 54 61 62 6c 65 20 69 73 20 66 61 6c 73 65  arTable is false
3f60: 2c 20 74 68 65 6e 20 74 68 65 20 72 6f 77 20 77  , then the row w
3f70: 69 74 68 0a 2a 2a 20 72 6f 77 69 64 20 69 52 6f  ith.** rowid iRo
3f80: 77 20 69 73 20 62 65 69 6e 67 20 72 65 70 6c 61  w is being repla
3f90: 63 65 64 20 6f 72 20 64 65 6c 65 74 65 64 2e 20  ced or deleted. 
3fa0: 49 6e 20 74 68 69 73 20 63 61 73 65 20 69 6e 76  In this case inv
3fb0: 61 6c 69 64 61 74 65 0a 2a 2a 20 6f 6e 6c 79 20  alidate.** only 
3fc0: 74 68 6f 73 65 20 69 6e 63 72 62 6c 6f 62 20 63  those incrblob c
3fd0: 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74  ursors open on t
3fe0: 68 61 74 20 73 70 65 63 69 66 69 63 20 72 6f 77  hat specific row
3ff0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
4000: 20 69 6e 76 61 6c 69 64 61 74 65 49 6e 63 72 62   invalidateIncrb
4010: 6c 6f 62 43 75 72 73 6f 72 73 28 0a 20 20 42 74  lobCursors(.  Bt
4020: 72 65 65 20 2a 70 42 74 72 65 65 2c 20 20 20 20  ree *pBtree,    
4030: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74        /* The dat
4040: 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 63 68  abase file to ch
4050: 65 63 6b 20 2a 2f 0a 20 20 69 36 34 20 69 52 6f  eck */.  i64 iRo
4060: 77 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  w,              
4070: 20 2f 2a 20 54 68 65 20 72 6f 77 69 64 20 74 68   /* The rowid th
4080: 61 74 20 6d 69 67 68 74 20 62 65 20 63 68 61 6e  at might be chan
4090: 67 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 69 73  ging */.  int is
40a0: 43 6c 65 61 72 54 61 62 6c 65 20 20 20 20 20 20  ClearTable      
40b0: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 6c 6c    /* True if all
40c0: 20 72 6f 77 73 20 61 72 65 20 62 65 69 6e 67 20   rows are being 
40d0: 64 65 6c 65 74 65 64 20 2a 2f 0a 29 7b 0a 20 20  deleted */.){.  
40e0: 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 42  BtCursor *p;.  B
40f0: 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
4100: 42 74 72 65 65 2d 3e 70 42 74 3b 0a 20 20 61 73  Btree->pBt;.  as
4110: 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72  sert( sqlite3Btr
4120: 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 42 74  eeHoldsMutex(pBt
4130: 72 65 65 29 20 29 3b 0a 20 20 66 6f 72 28 70 3d  ree) );.  for(p=
4140: 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b  pBt->pCursor; p;
4150: 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20   p=p->pNext){.  
4160: 20 20 69 66 28 20 28 70 2d 3e 63 75 72 46 6c 61    if( (p->curFla
4170: 67 73 20 26 20 42 54 43 46 5f 49 6e 63 72 62 6c  gs & BTCF_Incrbl
4180: 6f 62 29 21 3d 30 0a 20 20 20 20 20 26 26 20 28  ob)!=0.     && (
4190: 69 73 43 6c 65 61 72 54 61 62 6c 65 20 7c 7c 20  isClearTable || 
41a0: 70 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 69 52  p->info.nKey==iR
41b0: 6f 77 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  ow).    ){.     
41c0: 20 70 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52   p->eState = CUR
41d0: 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20  SOR_INVALID;.   
41e0: 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 65 6c 73 65 0a   }.  }.}..#else.
41f0: 20 20 2f 2a 20 53 74 75 62 20 66 75 6e 63 74 69    /* Stub functi
4200: 6f 6e 20 77 68 65 6e 20 49 4e 43 52 42 4c 4f 42  on when INCRBLOB
4210: 20 69 73 20 6f 6d 69 74 74 65 64 20 2a 2f 0a 20   is omitted */. 
4220: 20 23 64 65 66 69 6e 65 20 69 6e 76 61 6c 69 64   #define invalid
4230: 61 74 65 49 6e 63 72 62 6c 6f 62 43 75 72 73 6f  ateIncrblobCurso
4240: 72 73 28 78 2c 79 2c 7a 29 0a 23 65 6e 64 69 66  rs(x,y,z).#endif
4250: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
4260: 49 4e 43 52 42 4c 4f 42 20 2a 2f 0a 0a 2f 2a 0a  INCRBLOB */../*.
4270: 2a 2a 20 53 65 74 20 62 69 74 20 70 67 6e 6f 20  ** Set bit pgno 
4280: 6f 66 20 74 68 65 20 42 74 53 68 61 72 65 64 2e  of the BtShared.
4290: 70 48 61 73 43 6f 6e 74 65 6e 74 20 62 69 74 76  pHasContent bitv
42a0: 65 63 2e 20 54 68 69 73 20 69 73 20 63 61 6c 6c  ec. This is call
42b0: 65 64 20 0a 2a 2a 20 77 68 65 6e 20 61 20 70 61  ed .** when a pa
42c0: 67 65 20 74 68 61 74 20 70 72 65 76 69 6f 75 73  ge that previous
42d0: 6c 79 20 63 6f 6e 74 61 69 6e 65 64 20 64 61 74  ly contained dat
42e0: 61 20 62 65 63 6f 6d 65 73 20 61 20 66 72 65 65  a becomes a free
42f0: 2d 6c 69 73 74 20 6c 65 61 66 20 0a 2a 2a 20 70  -list leaf .** p
4300: 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 42  age..**.** The B
4310: 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74  tShared.pHasCont
4320: 65 6e 74 20 62 69 74 76 65 63 20 65 78 69 73 74  ent bitvec exist
4330: 73 20 74 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64  s to work around
4340: 20 61 6e 20 6f 62 73 63 75 72 65 0a 2a 2a 20 62   an obscure.** b
4350: 75 67 20 63 61 75 73 65 64 20 62 79 20 74 68 65  ug caused by the
4360: 20 69 6e 74 65 72 61 63 74 69 6f 6e 20 6f 66 20   interaction of 
4370: 74 77 6f 20 75 73 65 66 75 6c 20 49 4f 20 6f 70  two useful IO op
4380: 74 69 6d 69 7a 61 74 69 6f 6e 73 20 73 75 72 72  timizations surr
4390: 6f 75 6e 64 69 6e 67 0a 2a 2a 20 66 72 65 65 2d  ounding.** free-
43a0: 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65 73 3a  list leaf pages:
43b0: 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20 57 68 65 6e  .**.**   1) When
43c0: 20 61 6c 6c 20 64 61 74 61 20 69 73 20 64 65 6c   all data is del
43d0: 65 74 65 64 20 66 72 6f 6d 20 61 20 70 61 67 65  eted from a page
43e0: 20 61 6e 64 20 74 68 65 20 70 61 67 65 20 62 65   and the page be
43f0: 63 6f 6d 65 73 0a 2a 2a 20 20 20 20 20 20 61 20  comes.**      a 
4400: 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70  free-list leaf p
4410: 61 67 65 2c 20 74 68 65 20 70 61 67 65 20 69 73  age, the page is
4420: 20 6e 6f 74 20 77 72 69 74 74 65 6e 20 74 6f 20   not written to 
4430: 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  the database.** 
4440: 20 20 20 20 20 28 61 73 20 66 72 65 65 2d 6c 69       (as free-li
4450: 73 74 20 6c 65 61 66 20 70 61 67 65 73 20 63 6f  st leaf pages co
4460: 6e 74 61 69 6e 20 6e 6f 20 6d 65 61 6e 69 6e 67  ntain no meaning
4470: 66 75 6c 20 64 61 74 61 29 2e 20 53 6f 6d 65 74  ful data). Somet
4480: 69 6d 65 73 0a 2a 2a 20 20 20 20 20 20 73 75 63  imes.**      suc
4490: 68 20 61 20 70 61 67 65 20 69 73 20 6e 6f 74 20  h a page is not 
44a0: 65 76 65 6e 20 6a 6f 75 72 6e 61 6c 6c 65 64 20  even journalled 
44b0: 28 61 73 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20  (as it will not 
44c0: 62 65 20 6d 6f 64 69 66 69 65 64 2c 0a 2a 2a 20  be modified,.** 
44d0: 20 20 20 20 20 77 68 79 20 62 6f 74 68 65 72 20       why bother 
44e0: 6a 6f 75 72 6e 61 6c 6c 69 6e 67 20 69 74 3f 29  journalling it?)
44f0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 29 20 57 68 65  ..**.**   2) Whe
4500: 6e 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65  n a free-list le
4510: 61 66 20 70 61 67 65 20 69 73 20 72 65 75 73 65  af page is reuse
4520: 64 2c 20 69 74 73 20 63 6f 6e 74 65 6e 74 20 69  d, its content i
4530: 73 20 6e 6f 74 20 72 65 61 64 0a 2a 2a 20 20 20  s not read.**   
4540: 20 20 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61     from the data
4550: 62 61 73 65 20 6f 72 20 77 72 69 74 74 65 6e 20  base or written 
4560: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
4570: 69 6c 65 20 28 77 68 79 20 73 68 6f 75 6c 64 20  ile (why should 
4580: 69 74 0a 2a 2a 20 20 20 20 20 20 62 65 2c 20 69  it.**      be, i
4590: 66 20 69 74 20 69 73 20 6e 6f 74 20 61 74 20 61  f it is not at a
45a0: 6c 6c 20 6d 65 61 6e 69 6e 67 66 75 6c 3f 29 2e  ll meaningful?).
45b0: 0a 2a 2a 0a 2a 2a 20 42 79 20 74 68 65 6d 73 65  .**.** By themse
45c0: 6c 76 65 73 2c 20 74 68 65 73 65 20 6f 70 74 69  lves, these opti
45d0: 6d 69 7a 61 74 69 6f 6e 73 20 77 6f 72 6b 20 66  mizations work f
45e0: 69 6e 65 20 61 6e 64 20 70 72 6f 76 69 64 65 20  ine and provide 
45f0: 61 20 68 61 6e 64 79 0a 2a 2a 20 70 65 72 66 6f  a handy.** perfo
4600: 72 6d 61 6e 63 65 20 62 6f 6f 73 74 20 74 6f 20  rmance boost to 
4610: 62 75 6c 6b 20 64 65 6c 65 74 65 20 6f 72 20 69  bulk delete or i
4620: 6e 73 65 72 74 20 6f 70 65 72 61 74 69 6f 6e 73  nsert operations
4630: 2e 20 48 6f 77 65 76 65 72 2c 20 69 66 0a 2a 2a  . However, if.**
4640: 20 61 20 70 61 67 65 20 69 73 20 6d 6f 76 65 64   a page is moved
4650: 20 74 6f 20 74 68 65 20 66 72 65 65 2d 6c 69 73   to the free-lis
4660: 74 20 61 6e 64 20 74 68 65 6e 20 72 65 75 73 65  t and then reuse
4670: 64 20 77 69 74 68 69 6e 20 74 68 65 20 73 61 6d  d within the sam
4680: 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e  e.** transaction
4690: 2c 20 61 20 70 72 6f 62 6c 65 6d 20 63 6f 6d 65  , a problem come
46a0: 73 20 75 70 2e 20 49 66 20 74 68 65 20 70 61 67  s up. If the pag
46b0: 65 20 69 73 20 6e 6f 74 20 6a 6f 75 72 6e 61 6c  e is not journal
46c0: 6c 65 64 20 77 68 65 6e 0a 2a 2a 20 69 74 20 69  led when.** it i
46d0: 73 20 6d 6f 76 65 64 20 74 6f 20 74 68 65 20 66  s moved to the f
46e0: 72 65 65 2d 6c 69 73 74 20 61 6e 64 20 69 74 20  ree-list and it 
46f0: 69 73 20 61 6c 73 6f 20 6e 6f 74 20 6a 6f 75 72  is also not jour
4700: 6e 61 6c 6c 65 64 20 77 68 65 6e 20 69 74 0a 2a  nalled when it.*
4710: 2a 20 69 73 20 65 78 74 72 61 63 74 65 64 20 66  * is extracted f
4720: 72 6f 6d 20 74 68 65 20 66 72 65 65 2d 6c 69 73  rom the free-lis
4730: 74 20 61 6e 64 20 72 65 75 73 65 64 2c 20 74 68  t and reused, th
4740: 65 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  en the original 
4750: 64 61 74 61 0a 2a 2a 20 6d 61 79 20 62 65 20 6c  data.** may be l
4760: 6f 73 74 2e 20 49 6e 20 74 68 65 20 65 76 65 6e  ost. In the even
4770: 74 20 6f 66 20 61 20 72 6f 6c 6c 62 61 63 6b 2c  t of a rollback,
4780: 20 69 74 20 6d 61 79 20 6e 6f 74 20 62 65 20 70   it may not be p
4790: 6f 73 73 69 62 6c 65 0a 2a 2a 20 74 6f 20 72 65  ossible.** to re
47a0: 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 62 61  store the databa
47b0: 73 65 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e  se to its origin
47c0: 61 6c 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  al configuration
47d0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 6f 6c 75  ..**.** The solu
47e0: 74 69 6f 6e 20 69 73 20 74 68 65 20 42 74 53 68  tion is the BtSh
47f0: 61 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74  ared.pHasContent
4800: 20 62 69 74 76 65 63 2e 20 57 68 65 6e 65 76 65   bitvec. Wheneve
4810: 72 20 61 20 70 61 67 65 20 69 73 20 0a 2a 2a 20  r a page is .** 
4820: 6d 6f 76 65 64 20 74 6f 20 62 65 63 6f 6d 65 20  moved to become 
4830: 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66  a free-list leaf
4840: 20 70 61 67 65 2c 20 74 68 65 20 63 6f 72 72 65   page, the corre
4850: 73 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 0a  sponding bit is.
4860: 2a 2a 20 73 65 74 20 69 6e 20 74 68 65 20 62 69  ** set in the bi
4870: 74 76 65 63 2e 20 57 68 65 6e 65 76 65 72 20 61  tvec. Whenever a
4880: 20 6c 65 61 66 20 70 61 67 65 20 69 73 20 65 78   leaf page is ex
4890: 74 72 61 63 74 65 64 20 66 72 6f 6d 20 74 68 65  tracted from the
48a0: 20 66 72 65 65 2d 6c 69 73 74 2c 0a 2a 2a 20 6f   free-list,.** o
48b0: 70 74 69 6d 69 7a 61 74 69 6f 6e 20 32 20 61 62  ptimization 2 ab
48c0: 6f 76 65 20 69 73 20 6f 6d 69 74 74 65 64 20 69  ove is omitted i
48d0: 66 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  f the correspond
48e0: 69 6e 67 20 62 69 74 20 69 73 20 61 6c 72 65 61  ing bit is alrea
48f0: 64 79 0a 2a 2a 20 73 65 74 20 69 6e 20 42 74 53  dy.** set in BtS
4900: 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e  hared.pHasConten
4910: 74 2e 20 54 68 65 20 63 6f 6e 74 65 6e 74 73 20  t. The contents 
4920: 6f 66 20 74 68 65 20 62 69 74 76 65 63 20 61 72  of the bitvec ar
4930: 65 20 63 6c 65 61 72 65 64 0a 2a 2a 20 61 74 20  e cleared.** at 
4940: 74 68 65 20 65 6e 64 20 6f 66 20 65 76 65 72 79  the end of every
4950: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f   transaction..*/
4960: 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65  .static int btre
4970: 65 53 65 74 48 61 73 43 6f 6e 74 65 6e 74 28 42  eSetHasContent(B
4980: 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67  tShared *pBt, Pg
4990: 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 69 6e 74 20  no pgno){.  int 
49a0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
49b0: 20 20 69 66 28 20 21 70 42 74 2d 3e 70 48 61 73    if( !pBt->pHas
49c0: 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20 61  Content ){.    a
49d0: 73 73 65 72 74 28 20 70 67 6e 6f 3c 3d 70 42 74  ssert( pgno<=pBt
49e0: 2d 3e 6e 50 61 67 65 20 29 3b 0a 20 20 20 20 70  ->nPage );.    p
49f0: 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20  Bt->pHasContent 
4a00: 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 43  = sqlite3BitvecC
4a10: 72 65 61 74 65 28 70 42 74 2d 3e 6e 50 61 67 65  reate(pBt->nPage
4a20: 29 3b 0a 20 20 20 20 69 66 28 20 21 70 42 74 2d  );.    if( !pBt-
4a30: 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20 29 7b 0a  >pHasContent ){.
4a40: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
4a50: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20  E_NOMEM;.    }. 
4a60: 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c   }.  if( rc==SQL
4a70: 49 54 45 5f 4f 4b 20 26 26 20 70 67 6e 6f 3c 3d  ITE_OK && pgno<=
4a80: 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 69 7a  sqlite3BitvecSiz
4a90: 65 28 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65  e(pBt->pHasConte
4aa0: 6e 74 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  nt) ){.    rc = 
4ab0: 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 65 74  sqlite3BitvecSet
4ac0: 28 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e  (pBt->pHasConten
4ad0: 74 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20  t, pgno);.  }.  
4ae0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
4af0: 0a 2a 2a 20 51 75 65 72 79 20 74 68 65 20 42 74  .** Query the Bt
4b00: 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74 65  Shared.pHasConte
4b10: 6e 74 20 76 65 63 74 6f 72 2e 0a 2a 2a 0a 2a 2a  nt vector..**.**
4b20: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
4b30: 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20  s called when a 
4b40: 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70  free-list leaf p
4b50: 61 67 65 20 69 73 20 72 65 6d 6f 76 65 64 20 66  age is removed f
4b60: 72 6f 6d 20 74 68 65 0a 2a 2a 20 66 72 65 65 2d  rom the.** free-
4b70: 6c 69 73 74 20 66 6f 72 20 72 65 75 73 65 2e 20  list for reuse. 
4b80: 49 74 20 72 65 74 75 72 6e 73 20 66 61 6c 73 65  It returns false
4b90: 20 69 66 20 69 74 20 69 73 20 73 61 66 65 20 74   if it is safe t
4ba0: 6f 20 72 65 74 72 69 65 76 65 20 74 68 65 0a 2a  o retrieve the.*
4bb0: 2a 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20  * page from the 
4bc0: 70 61 67 65 72 20 6c 61 79 65 72 20 77 69 74 68  pager layer with
4bd0: 20 74 68 65 20 27 6e 6f 2d 63 6f 6e 74 65 6e 74   the 'no-content
4be0: 27 20 66 6c 61 67 20 73 65 74 2e 20 54 72 75 65  ' flag set. True
4bf0: 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73   otherwise..*/.s
4c00: 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 47  tatic int btreeG
4c10: 65 74 48 61 73 43 6f 6e 74 65 6e 74 28 42 74 53  etHasContent(BtS
4c20: 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f  hared *pBt, Pgno
4c30: 20 70 67 6e 6f 29 7b 0a 20 20 42 69 74 76 65 63   pgno){.  Bitvec
4c40: 20 2a 70 20 3d 20 70 42 74 2d 3e 70 48 61 73 43   *p = pBt->pHasC
4c50: 6f 6e 74 65 6e 74 3b 0a 20 20 72 65 74 75 72 6e  ontent;.  return
4c60: 20 28 70 20 26 26 20 28 70 67 6e 6f 3e 73 71 6c   (p && (pgno>sql
4c70: 69 74 65 33 42 69 74 76 65 63 53 69 7a 65 28 70  ite3BitvecSize(p
4c80: 29 20 7c 7c 20 73 71 6c 69 74 65 33 42 69 74 76  ) || sqlite3Bitv
4c90: 65 63 54 65 73 74 28 70 2c 20 70 67 6e 6f 29 29  ecTest(p, pgno))
4ca0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61  );.}../*.** Clea
4cb0: 72 20 28 64 65 73 74 72 6f 79 29 20 74 68 65 20  r (destroy) the 
4cc0: 42 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e  BtShared.pHasCon
4cd0: 74 65 6e 74 20 62 69 74 76 65 63 2e 20 54 68 69  tent bitvec. Thi
4ce0: 73 20 73 68 6f 75 6c 64 20 62 65 0a 2a 2a 20 69  s should be.** i
4cf0: 6e 76 6f 6b 65 64 20 61 74 20 74 68 65 20 63 6f  nvoked at the co
4d00: 6e 63 6c 75 73 69 6f 6e 20 6f 66 20 65 61 63 68  nclusion of each
4d10: 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
4d20: 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  on..*/.static vo
4d30: 69 64 20 62 74 72 65 65 43 6c 65 61 72 48 61 73  id btreeClearHas
4d40: 43 6f 6e 74 65 6e 74 28 42 74 53 68 61 72 65 64  Content(BtShared
4d50: 20 2a 70 42 74 29 7b 0a 20 20 73 71 6c 69 74 65   *pBt){.  sqlite
4d60: 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70  3BitvecDestroy(p
4d70: 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 29  Bt->pHasContent)
4d80: 3b 0a 20 20 70 42 74 2d 3e 70 48 61 73 43 6f 6e  ;.  pBt->pHasCon
4d90: 74 65 6e 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  tent = 0;.}../*.
4da0: 2a 2a 20 52 65 6c 65 61 73 65 20 61 6c 6c 20 6f  ** Release all o
4db0: 66 20 74 68 65 20 61 70 50 61 67 65 5b 5d 20 70  f the apPage[] p
4dc0: 61 67 65 73 20 66 6f 72 20 61 20 63 75 72 73 6f  ages for a curso
4dd0: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  r..*/.static voi
4de0: 64 20 62 74 72 65 65 52 65 6c 65 61 73 65 41 6c  d btreeReleaseAl
4df0: 6c 43 75 72 73 6f 72 50 61 67 65 73 28 42 74 43  lCursorPages(BtC
4e00: 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
4e10: 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30  int i;.  for(i=0
4e20: 3b 20 69 3c 3d 70 43 75 72 2d 3e 69 50 61 67 65  ; i<=pCur->iPage
4e30: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 72 65 6c 65  ; i++){.    rele
4e40: 61 73 65 50 61 67 65 28 70 43 75 72 2d 3e 61 70  asePage(pCur->ap
4e50: 50 61 67 65 5b 69 5d 29 3b 0a 20 20 20 20 70 43  Page[i]);.    pC
4e60: 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d 20 3d 20  ur->apPage[i] = 
4e70: 30 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 69  0;.  }.  pCur->i
4e80: 50 61 67 65 20 3d 20 2d 31 3b 0a 7d 0a 0a 0a 2f  Page = -1;.}.../
4e90: 2a 0a 2a 2a 20 53 61 76 65 20 74 68 65 20 63 75  *.** Save the cu
4ea0: 72 72 65 6e 74 20 63 75 72 73 6f 72 20 70 6f 73  rrent cursor pos
4eb0: 69 74 69 6f 6e 20 69 6e 20 74 68 65 20 76 61 72  ition in the var
4ec0: 69 61 62 6c 65 73 20 42 74 43 75 72 73 6f 72 2e  iables BtCursor.
4ed0: 6e 4b 65 79 20 0a 2a 2a 20 61 6e 64 20 42 74 43  nKey .** and BtC
4ee0: 75 72 73 6f 72 2e 70 4b 65 79 2e 20 54 68 65 20  ursor.pKey. The 
4ef0: 63 75 72 73 6f 72 27 73 20 73 74 61 74 65 20 69  cursor's state i
4f00: 73 20 73 65 74 20 74 6f 20 43 55 52 53 4f 52 5f  s set to CURSOR_
4f10: 52 45 51 55 49 52 45 53 45 45 4b 2e 0a 2a 2a 0a  REQUIRESEEK..**.
4f20: 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75  ** The caller mu
4f30: 73 74 20 65 6e 73 75 72 65 20 74 68 61 74 20 74  st ensure that t
4f40: 68 65 20 63 75 72 73 6f 72 20 69 73 20 76 61 6c  he cursor is val
4f50: 69 64 20 28 68 61 73 20 65 53 74 61 74 65 3d 3d  id (has eState==
4f60: 43 55 52 53 4f 52 5f 56 41 4c 49 44 29 0a 2a 2a  CURSOR_VALID).**
4f70: 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e   prior to callin
4f80: 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20  g this routine. 
4f90: 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20   .*/.static int 
4fa0: 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69  saveCursorPositi
4fb0: 6f 6e 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  on(BtCursor *pCu
4fc0: 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  r){.  int rc;.. 
4fd0: 20 61 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f   assert( CURSOR_
4fe0: 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74  VALID==pCur->eSt
4ff0: 61 74 65 20 7c 7c 20 43 55 52 53 4f 52 5f 53 4b  ate || CURSOR_SK
5000: 49 50 4e 45 58 54 3d 3d 70 43 75 72 2d 3e 65 53  IPNEXT==pCur->eS
5010: 74 61 74 65 20 29 3b 0a 20 20 61 73 73 65 72 74  tate );.  assert
5020: 28 20 30 3d 3d 70 43 75 72 2d 3e 70 4b 65 79 20  ( 0==pCur->pKey 
5030: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  );.  assert( cur
5040: 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
5050: 75 72 29 20 29 3b 0a 0a 20 20 69 66 28 20 70 43  ur) );..  if( pC
5060: 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
5070: 4f 52 5f 53 4b 49 50 4e 45 58 54 20 29 7b 0a 20  OR_SKIPNEXT ){. 
5080: 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20     pCur->eState 
5090: 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a  = CURSOR_VALID;.
50a0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 43 75    }else{.    pCu
50b0: 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b  r->skipNext = 0;
50c0: 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69  .  }.  rc = sqli
50d0: 74 65 33 42 74 72 65 65 4b 65 79 53 69 7a 65 28  te3BtreeKeySize(
50e0: 70 43 75 72 2c 20 26 70 43 75 72 2d 3e 6e 4b 65  pCur, &pCur->nKe
50f0: 79 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63  y);.  assert( rc
5100: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 20 20  ==SQLITE_OK );  
5110: 2f 2a 20 4b 65 79 53 69 7a 65 28 29 20 63 61 6e  /* KeySize() can
5120: 6e 6f 74 20 66 61 69 6c 20 2a 2f 0a 0a 20 20 2f  not fail */..  /
5130: 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20  * If this is an 
5140: 69 6e 74 4b 65 79 20 74 61 62 6c 65 2c 20 74 68  intKey table, th
5150: 65 6e 20 74 68 65 20 61 62 6f 76 65 20 63 61 6c  en the above cal
5160: 6c 20 74 6f 20 42 74 72 65 65 4b 65 79 53 69 7a  l to BtreeKeySiz
5170: 65 28 29 0a 20 20 2a 2a 20 73 74 6f 72 65 73 20  e().  ** stores 
5180: 74 68 65 20 69 6e 74 65 67 65 72 20 6b 65 79 20  the integer key 
5190: 69 6e 20 70 43 75 72 2d 3e 6e 4b 65 79 2e 20 49  in pCur->nKey. I
51a0: 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 69 73  n this case this
51b0: 20 76 61 6c 75 65 20 69 73 0a 20 20 2a 2a 20 61   value is.  ** a
51c0: 6c 6c 20 74 68 61 74 20 69 73 20 72 65 71 75 69  ll that is requi
51d0: 72 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  red. Otherwise, 
51e0: 69 66 20 70 43 75 72 20 69 73 20 6e 6f 74 20 6f  if pCur is not o
51f0: 70 65 6e 20 6f 6e 20 61 6e 20 69 6e 74 4b 65 79  pen on an intKey
5200: 0a 20 20 2a 2a 20 74 61 62 6c 65 2c 20 74 68 65  .  ** table, the
5210: 6e 20 6d 61 6c 6c 6f 63 20 73 70 61 63 65 20 66  n malloc space f
5220: 6f 72 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65  or and store the
5230: 20 70 43 75 72 2d 3e 6e 4b 65 79 20 62 79 74 65   pCur->nKey byte
5240: 73 20 6f 66 20 6b 65 79 20 0a 20 20 2a 2a 20 64  s of key .  ** d
5250: 61 74 61 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ata..  */.  if( 
5260: 30 3d 3d 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  0==pCur->apPage[
5270: 30 5d 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20  0]->intKey ){.  
5280: 20 20 76 6f 69 64 20 2a 70 4b 65 79 20 3d 20 73    void *pKey = s
5290: 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 20 70 43  qlite3Malloc( pC
52a0: 75 72 2d 3e 6e 4b 65 79 20 29 3b 0a 20 20 20 20  ur->nKey );.    
52b0: 69 66 28 20 70 4b 65 79 20 29 7b 0a 20 20 20 20  if( pKey ){.    
52c0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
52d0: 72 65 65 4b 65 79 28 70 43 75 72 2c 20 30 2c 20  reeKey(pCur, 0, 
52e0: 28 69 6e 74 29 70 43 75 72 2d 3e 6e 4b 65 79 2c  (int)pCur->nKey,
52f0: 20 70 4b 65 79 29 3b 0a 20 20 20 20 20 20 69 66   pKey);.      if
5300: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
5310: 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d  ){.        pCur-
5320: 3e 70 4b 65 79 20 3d 20 70 4b 65 79 3b 0a 20 20  >pKey = pKey;.  
5330: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
5340: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
5350: 70 4b 65 79 29 3b 0a 20 20 20 20 20 20 7d 0a 20  pKey);.      }. 
5360: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
5370: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
5380: 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61  M;.    }.  }.  a
5390: 73 73 65 72 74 28 20 21 70 43 75 72 2d 3e 61 70  ssert( !pCur->ap
53a0: 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20  Page[0]->intKey 
53b0: 7c 7c 20 21 70 43 75 72 2d 3e 70 4b 65 79 20 29  || !pCur->pKey )
53c0: 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  ;..  if( rc==SQL
53d0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 62 74  ITE_OK ){.    bt
53e0: 72 65 65 52 65 6c 65 61 73 65 41 6c 6c 43 75 72  reeReleaseAllCur
53f0: 73 6f 72 50 61 67 65 73 28 70 43 75 72 29 3b 0a  sorPages(pCur);.
5400: 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65      pCur->eState
5410: 20 3d 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52   = CURSOR_REQUIR
5420: 45 53 45 45 4b 3b 0a 20 20 7d 0a 0a 20 20 69 6e  ESEEK;.  }..  in
5430: 76 61 6c 69 64 61 74 65 4f 76 65 72 66 6c 6f 77  validateOverflow
5440: 43 61 63 68 65 28 70 43 75 72 29 3b 0a 20 20 72  Cache(pCur);.  r
5450: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20  eturn rc;.}../* 
5460: 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63  Forward referenc
5470: 65 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  e */.static int 
5480: 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20  SQLITE_NOINLINE 
5490: 73 61 76 65 43 75 72 73 6f 72 73 4f 6e 4c 69 73  saveCursorsOnLis
54a0: 74 28 42 74 43 75 72 73 6f 72 2a 2c 50 67 6e 6f  t(BtCursor*,Pgno
54b0: 2c 42 74 43 75 72 73 6f 72 2a 29 3b 0a 0a 2f 2a  ,BtCursor*);../*
54c0: 0a 2a 2a 20 53 61 76 65 20 74 68 65 20 70 6f 73  .** Save the pos
54d0: 69 74 69 6f 6e 73 20 6f 66 20 61 6c 6c 20 63 75  itions of all cu
54e0: 72 73 6f 72 73 20 28 65 78 63 65 70 74 20 70 45  rsors (except pE
54f0: 78 63 65 70 74 29 20 74 68 61 74 20 61 72 65 20  xcept) that are 
5500: 6f 70 65 6e 20 6f 6e 0a 2a 2a 20 74 68 65 20 74  open on.** the t
5510: 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70  able with root-p
5520: 61 67 65 20 69 52 6f 6f 74 2e 20 20 22 53 61 76  age iRoot.  "Sav
5530: 69 6e 67 20 74 68 65 20 63 75 72 73 6f 72 20 70  ing the cursor p
5540: 6f 73 69 74 69 6f 6e 22 20 6d 65 61 6e 73 20 74  osition" means t
5550: 68 61 74 0a 2a 2a 20 74 68 65 20 6c 6f 63 61 74  hat.** the locat
5560: 69 6f 6e 20 69 6e 20 74 68 65 20 62 74 72 65 65  ion in the btree
5570: 20 69 73 20 72 65 6d 65 6d 62 65 72 65 64 20 69   is remembered i
5580: 6e 20 73 75 63 68 20 61 20 77 61 79 20 74 68 61  n such a way tha
5590: 74 20 69 74 20 63 61 6e 20 62 65 0a 2a 2a 20 6d  t it can be.** m
55a0: 6f 76 65 64 20 62 61 63 6b 20 74 6f 20 74 68 65  oved back to the
55b0: 20 73 61 6d 65 20 73 70 6f 74 20 61 66 74 65 72   same spot after
55c0: 20 74 68 65 20 62 74 72 65 65 20 68 61 73 20 62   the btree has b
55d0: 65 65 6e 20 6d 6f 64 69 66 69 65 64 2e 20 20 54  een modified.  T
55e0: 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69  his.** routine i
55f0: 73 20 63 61 6c 6c 65 64 20 6a 75 73 74 20 62 65  s called just be
5600: 66 6f 72 65 20 63 75 72 73 6f 72 20 70 45 78 63  fore cursor pExc
5610: 65 70 74 20 69 73 20 75 73 65 64 20 74 6f 20 6d  ept is used to m
5620: 6f 64 69 66 79 20 74 68 65 0a 2a 2a 20 74 61 62  odify the.** tab
5630: 6c 65 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 20  le, for example 
5640: 69 6e 20 42 74 72 65 65 44 65 6c 65 74 65 28 29  in BtreeDelete()
5650: 20 6f 72 20 42 74 72 65 65 49 6e 73 65 72 74 28   or BtreeInsert(
5660: 29 2e 0a 2a 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65  )..**.** Impleme
5670: 6e 74 61 74 69 6f 6e 20 6e 6f 74 65 3a 20 20 54  ntation note:  T
5680: 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 65 72 65  his routine mere
5690: 6c 79 20 63 68 65 63 6b 73 20 74 6f 20 73 65 65  ly checks to see
56a0: 20 69 66 20 61 6e 79 20 63 75 72 73 6f 72 73 0a   if any cursors.
56b0: 2a 2a 20 6e 65 65 64 20 74 6f 20 62 65 20 73 61  ** need to be sa
56c0: 76 65 64 2e 20 20 49 74 20 63 61 6c 6c 73 20 6f  ved.  It calls o
56d0: 75 74 20 74 6f 20 73 61 76 65 43 75 72 73 6f 72  ut to saveCursor
56e0: 73 4f 6e 4c 69 73 74 28 29 20 69 6e 20 74 68 65  sOnList() in the
56f0: 20 28 75 6e 75 73 75 61 6c 29 0a 2a 2a 20 65 76   (unusual).** ev
5700: 65 6e 74 20 74 68 61 74 20 63 75 72 73 6f 72 73  ent that cursors
5710: 20 61 72 65 20 69 6e 20 6e 65 65 64 20 74 6f 20   are in need to 
5720: 62 65 69 6e 67 20 73 61 76 65 64 2e 0a 2a 2f 0a  being saved..*/.
5730: 73 74 61 74 69 63 20 69 6e 74 20 73 61 76 65 41  static int saveA
5740: 6c 6c 43 75 72 73 6f 72 73 28 42 74 53 68 61 72  llCursors(BtShar
5750: 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 69 52  ed *pBt, Pgno iR
5760: 6f 6f 74 2c 20 42 74 43 75 72 73 6f 72 20 2a 70  oot, BtCursor *p
5770: 45 78 63 65 70 74 29 7b 0a 20 20 42 74 43 75 72  Except){.  BtCur
5780: 73 6f 72 20 2a 70 3b 0a 20 20 61 73 73 65 72 74  sor *p;.  assert
5790: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
57a0: 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
57b0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45   );.  assert( pE
57c0: 78 63 65 70 74 3d 3d 30 20 7c 7c 20 70 45 78 63  xcept==0 || pExc
57d0: 65 70 74 2d 3e 70 42 74 3d 3d 70 42 74 20 29 3b  ept->pBt==pBt );
57e0: 0a 20 20 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43  .  for(p=pBt->pC
57f0: 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70  ursor; p; p=p->p
5800: 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70  Next){.    if( p
5810: 21 3d 70 45 78 63 65 70 74 20 26 26 20 28 30 3d  !=pExcept && (0=
5820: 3d 69 52 6f 6f 74 20 7c 7c 20 70 2d 3e 70 67 6e  =iRoot || p->pgn
5830: 6f 52 6f 6f 74 3d 3d 69 52 6f 6f 74 29 20 29 20  oRoot==iRoot) ) 
5840: 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74  break;.  }.  ret
5850: 75 72 6e 20 70 20 3f 20 73 61 76 65 43 75 72 73  urn p ? saveCurs
5860: 6f 72 73 4f 6e 4c 69 73 74 28 70 2c 20 69 52 6f  orsOnList(p, iRo
5870: 6f 74 2c 20 70 45 78 63 65 70 74 29 20 3a 20 53  ot, pExcept) : S
5880: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20  QLITE_OK;.}../* 
5890: 54 68 69 73 20 68 65 6c 70 65 72 20 72 6f 75 74  This helper rout
58a0: 69 6e 65 20 74 6f 20 73 61 76 65 41 6c 6c 43 75  ine to saveAllCu
58b0: 72 73 6f 72 73 20 64 6f 65 73 20 74 68 65 20 61  rsors does the a
58c0: 63 74 75 61 6c 20 77 6f 72 6b 20 6f 66 20 73 61  ctual work of sa
58d0: 76 69 6e 67 0a 2a 2a 20 74 68 65 20 63 75 72 73  ving.** the curs
58e0: 6f 72 73 20 69 66 20 61 6e 64 20 77 68 65 6e 20  ors if and when 
58f0: 61 20 63 75 72 73 6f 72 20 69 73 20 66 6f 75 6e  a cursor is foun
5900: 64 20 74 68 61 74 20 61 63 74 75 61 6c 6c 79 20  d that actually 
5910: 72 65 71 75 69 72 65 73 20 73 61 76 69 6e 67 2e  requires saving.
5920: 0a 2a 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e 20 63  .** The common c
5930: 61 73 65 20 69 73 20 74 68 61 74 20 6e 6f 20 63  ase is that no c
5940: 75 72 73 6f 72 73 20 6e 65 65 64 20 74 6f 20 62  ursors need to b
5950: 65 20 73 61 76 65 64 2c 20 73 6f 20 74 68 69 73  e saved, so this
5960: 20 72 6f 75 74 69 6e 65 20 69 73 0a 2a 2a 20 62   routine is.** b
5970: 72 6f 6b 65 6e 20 6f 75 74 20 66 72 6f 6d 20 69  roken out from i
5980: 74 73 20 63 61 6c 6c 65 72 20 74 6f 20 61 76 6f  ts caller to avo
5990: 69 64 20 75 6e 6e 65 63 65 73 73 61 72 79 20 73  id unnecessary s
59a0: 74 61 63 6b 20 70 6f 69 6e 74 65 72 20 6d 6f 76  tack pointer mov
59b0: 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  ement..*/.static
59c0: 20 69 6e 74 20 53 51 4c 49 54 45 5f 4e 4f 49 4e   int SQLITE_NOIN
59d0: 4c 49 4e 45 20 73 61 76 65 43 75 72 73 6f 72 73  LINE saveCursors
59e0: 4f 6e 4c 69 73 74 28 0a 20 20 42 74 43 75 72 73  OnList(.  BtCurs
59f0: 6f 72 20 2a 70 2c 20 20 20 20 20 20 20 20 20 2f  or *p,         /
5a00: 2a 20 54 68 65 20 66 69 72 73 74 20 63 75 72 73  * The first curs
5a10: 6f 72 20 74 68 61 74 20 6e 65 65 64 73 20 73 61  or that needs sa
5a20: 76 69 6e 67 20 2a 2f 0a 20 20 50 67 6e 6f 20 69  ving */.  Pgno i
5a30: 52 6f 6f 74 2c 20 20 20 20 20 20 20 20 20 20 2f  Root,          /
5a40: 2a 20 4f 6e 6c 79 20 73 61 76 65 20 63 75 72 73  * Only save curs
5a50: 6f 72 20 77 69 74 68 20 74 68 69 73 20 69 52 6f  or with this iRo
5a60: 6f 74 2e 20 53 61 76 65 20 61 6c 6c 20 69 66 20  ot. Save all if 
5a70: 7a 65 72 6f 20 2a 2f 0a 20 20 42 74 43 75 72 73  zero */.  BtCurs
5a80: 6f 72 20 2a 70 45 78 63 65 70 74 20 20 20 20 2f  or *pExcept    /
5a90: 2a 20 44 6f 20 6e 6f 74 20 73 61 76 65 20 74 68  * Do not save th
5aa0: 69 73 20 63 75 72 73 6f 72 20 2a 2f 0a 29 7b 0a  is cursor */.){.
5ab0: 20 20 64 6f 7b 0a 20 20 20 20 69 66 28 20 70 21    do{.    if( p!
5ac0: 3d 70 45 78 63 65 70 74 20 26 26 20 28 30 3d 3d  =pExcept && (0==
5ad0: 69 52 6f 6f 74 20 7c 7c 20 70 2d 3e 70 67 6e 6f  iRoot || p->pgno
5ae0: 52 6f 6f 74 3d 3d 69 52 6f 6f 74 29 20 29 7b 0a  Root==iRoot) ){.
5af0: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 65 53 74        if( p->eSt
5b00: 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
5b10: 44 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d  D || p->eState==
5b20: 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54 20  CURSOR_SKIPNEXT 
5b30: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72  ){.        int r
5b40: 63 20 3d 20 73 61 76 65 43 75 72 73 6f 72 50 6f  c = saveCursorPo
5b50: 73 69 74 69 6f 6e 28 70 29 3b 0a 20 20 20 20 20  sition(p);.     
5b60: 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b     if( SQLITE_OK
5b70: 21 3d 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  !=rc ){.        
5b80: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
5b90: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
5ba0: 73 65 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74  se{.        test
5bb0: 63 61 73 65 28 20 70 2d 3e 69 50 61 67 65 3e 30  case( p->iPage>0
5bc0: 20 29 3b 0a 20 20 20 20 20 20 20 20 62 74 72 65   );.        btre
5bd0: 65 52 65 6c 65 61 73 65 41 6c 6c 43 75 72 73 6f  eReleaseAllCurso
5be0: 72 50 61 67 65 73 28 70 29 3b 0a 20 20 20 20 20  rPages(p);.     
5bf0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 20 3d   }.    }.    p =
5c00: 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 77 68   p->pNext;.  }wh
5c10: 69 6c 65 28 20 70 20 29 3b 0a 20 20 72 65 74 75  ile( p );.  retu
5c20: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
5c30: 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65  ./*.** Clear the
5c40: 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20   current cursor 
5c50: 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  position..*/.voi
5c60: 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c  d sqlite3BtreeCl
5c70: 65 61 72 43 75 72 73 6f 72 28 42 74 43 75 72 73  earCursor(BtCurs
5c80: 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73 73  or *pCur){.  ass
5c90: 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
5ca0: 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
5cb0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43   sqlite3_free(pC
5cc0: 75 72 2d 3e 70 4b 65 79 29 3b 0a 20 20 70 43 75  ur->pKey);.  pCu
5cd0: 72 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a 20 20 70  r->pKey = 0;.  p
5ce0: 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
5cf0: 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 7d 0a  RSOR_INVALID;.}.
5d00: 0a 2f 2a 0a 2a 2a 20 49 6e 20 74 68 69 73 20 76  ./*.** In this v
5d10: 65 72 73 69 6f 6e 20 6f 66 20 42 74 72 65 65 4d  ersion of BtreeM
5d20: 6f 76 65 74 6f 2c 20 70 4b 65 79 20 69 73 20 61  oveto, pKey is a
5d30: 20 70 61 63 6b 65 64 20 69 6e 64 65 78 20 72 65   packed index re
5d40: 63 6f 72 64 0a 2a 2a 20 73 75 63 68 20 61 73 20  cord.** such as 
5d50: 69 73 20 67 65 6e 65 72 61 74 65 64 20 62 79 20  is generated by 
5d60: 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  the OP_MakeRecor
5d70: 64 20 6f 70 63 6f 64 65 2e 20 20 55 6e 70 61 63  d opcode.  Unpac
5d80: 6b 20 74 68 65 0a 2a 2a 20 72 65 63 6f 72 64 20  k the.** record 
5d90: 61 6e 64 20 74 68 65 6e 20 63 61 6c 6c 20 42 74  and then call Bt
5da0: 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65  reeMovetoUnpacke
5db0: 64 28 29 20 74 6f 20 64 6f 20 74 68 65 20 77 6f  d() to do the wo
5dc0: 72 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  rk..*/.static in
5dd0: 74 20 62 74 72 65 65 4d 6f 76 65 74 6f 28 0a 20  t btreeMoveto(. 
5de0: 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c   BtCursor *pCur,
5df0: 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6f       /* Cursor o
5e00: 70 65 6e 20 6f 6e 20 74 68 65 20 62 74 72 65 65  pen on the btree
5e10: 20 74 6f 20 62 65 20 73 65 61 72 63 68 65 64 20   to be searched 
5e20: 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  */.  const void 
5e30: 2a 70 4b 65 79 2c 20 20 20 2f 2a 20 50 61 63 6b  *pKey,   /* Pack
5e40: 65 64 20 6b 65 79 20 69 66 20 74 68 65 20 62 74  ed key if the bt
5e50: 72 65 65 20 69 73 20 61 6e 20 69 6e 64 65 78 20  ree is an index 
5e60: 2a 2f 0a 20 20 69 36 34 20 6e 4b 65 79 2c 20 20  */.  i64 nKey,  
5e70: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 74 65           /* Inte
5e80: 67 65 72 20 6b 65 79 20 66 6f 72 20 74 61 62 6c  ger key for tabl
5e90: 65 73 2e 20 20 53 69 7a 65 20 6f 66 20 70 4b 65  es.  Size of pKe
5ea0: 79 20 66 6f 72 20 69 6e 64 69 63 65 73 20 2a 2f  y for indices */
5eb0: 0a 20 20 69 6e 74 20 62 69 61 73 2c 20 20 20 20  .  int bias,    
5ec0: 20 20 20 20 20 20 20 2f 2a 20 42 69 61 73 20 73         /* Bias s
5ed0: 65 61 72 63 68 20 74 6f 20 74 68 65 20 68 69 67  earch to the hig
5ee0: 68 20 65 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 2a  h end */.  int *
5ef0: 70 52 65 73 20 20 20 20 20 20 20 20 20 20 20 2f  pRes           /
5f00: 2a 20 57 72 69 74 65 20 73 65 61 72 63 68 20 72  * Write search r
5f10: 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 29  esults here */.)
5f20: 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  {.  int rc;     
5f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5f40: 2a 20 53 74 61 74 75 73 20 63 6f 64 65 20 2a 2f  * Status code */
5f50: 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  .  UnpackedRecor
5f60: 64 20 2a 70 49 64 78 4b 65 79 3b 20 20 20 2f 2a  d *pIdxKey;   /*
5f70: 20 55 6e 70 61 63 6b 65 64 20 69 6e 64 65 78 20   Unpacked index 
5f80: 6b 65 79 20 2a 2f 0a 20 20 63 68 61 72 20 61 53  key */.  char aS
5f90: 70 61 63 65 5b 32 30 30 5d 3b 20 20 20 20 20 20  pace[200];      
5fa0: 20 20 20 20 2f 2a 20 54 65 6d 70 20 73 70 61 63      /* Temp spac
5fb0: 65 20 66 6f 72 20 70 49 64 78 4b 65 79 20 2d 20  e for pIdxKey - 
5fc0: 74 6f 20 61 76 6f 69 64 20 61 20 6d 61 6c 6c 6f  to avoid a mallo
5fd0: 63 20 2a 2f 0a 20 20 63 68 61 72 20 2a 70 46 72  c */.  char *pFr
5fe0: 65 65 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70  ee = 0;..  if( p
5ff0: 4b 65 79 20 29 7b 0a 20 20 20 20 61 73 73 65 72  Key ){.    asser
6000: 74 28 20 6e 4b 65 79 3d 3d 28 69 36 34 29 28 69  t( nKey==(i64)(i
6010: 6e 74 29 6e 4b 65 79 20 29 3b 0a 20 20 20 20 70  nt)nKey );.    p
6020: 49 64 78 4b 65 79 20 3d 20 73 71 6c 69 74 65 33  IdxKey = sqlite3
6030: 56 64 62 65 41 6c 6c 6f 63 55 6e 70 61 63 6b 65  VdbeAllocUnpacke
6040: 64 52 65 63 6f 72 64 28 0a 20 20 20 20 20 20 20  dRecord(.       
6050: 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 2c   pCur->pKeyInfo,
6060: 20 61 53 70 61 63 65 2c 20 73 69 7a 65 6f 66 28   aSpace, sizeof(
6070: 61 53 70 61 63 65 29 2c 20 26 70 46 72 65 65 0a  aSpace), &pFree.
6080: 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 70      );.    if( p
6090: 49 64 78 4b 65 79 3d 3d 30 20 29 20 72 65 74 75  IdxKey==0 ) retu
60a0: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
60b0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
60c0: 52 65 63 6f 72 64 55 6e 70 61 63 6b 28 70 43 75  RecordUnpack(pCu
60d0: 72 2d 3e 70 4b 65 79 49 6e 66 6f 2c 20 28 69 6e  r->pKeyInfo, (in
60e0: 74 29 6e 4b 65 79 2c 20 70 4b 65 79 2c 20 70 49  t)nKey, pKey, pI
60f0: 64 78 4b 65 79 29 3b 0a 20 20 20 20 69 66 28 20  dxKey);.    if( 
6100: 70 49 64 78 4b 65 79 2d 3e 6e 46 69 65 6c 64 3d  pIdxKey->nField=
6110: 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
6120: 74 65 33 44 62 46 72 65 65 28 70 43 75 72 2d 3e  te3DbFree(pCur->
6130: 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2c 20 70 46  pKeyInfo->db, pF
6140: 72 65 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ree);.      retu
6150: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
6160: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20  T_BKPT;.    }.  
6170: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 64 78 4b  }else{.    pIdxK
6180: 65 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 63  ey = 0;.  }.  rc
6190: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d   = sqlite3BtreeM
61a0: 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 70 43  ovetoUnpacked(pC
61b0: 75 72 2c 20 70 49 64 78 4b 65 79 2c 20 6e 4b 65  ur, pIdxKey, nKe
61c0: 79 2c 20 62 69 61 73 2c 20 70 52 65 73 29 3b 0a  y, bias, pRes);.
61d0: 20 20 69 66 28 20 70 46 72 65 65 20 29 7b 0a 20    if( pFree ){. 
61e0: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
61f0: 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 2d  (pCur->pKeyInfo-
6200: 3e 64 62 2c 20 70 46 72 65 65 29 3b 0a 20 20 7d  >db, pFree);.  }
6210: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
6220: 0a 2f 2a 0a 2a 2a 20 52 65 73 74 6f 72 65 20 74  ./*.** Restore t
6230: 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65  he cursor to the
6240: 20 70 6f 73 69 74 69 6f 6e 20 69 74 20 77 61 73   position it was
6250: 20 69 6e 20 28 6f 72 20 61 73 20 63 6c 6f 73 65   in (or as close
6260: 20 74 6f 20 61 73 20 70 6f 73 73 69 62 6c 65 29   to as possible)
6270: 0a 2a 2a 20 77 68 65 6e 20 73 61 76 65 43 75 72  .** when saveCur
6280: 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 20 77 61  sorPosition() wa
6290: 73 20 63 61 6c 6c 65 64 2e 20 4e 6f 74 65 20 74  s called. Note t
62a0: 68 61 74 20 74 68 69 73 20 63 61 6c 6c 20 64 65  hat this call de
62b0: 6c 65 74 65 73 20 74 68 65 20 0a 2a 2a 20 73 61  letes the .** sa
62c0: 76 65 64 20 70 6f 73 69 74 69 6f 6e 20 69 6e 66  ved position inf
62d0: 6f 20 73 74 6f 72 65 64 20 62 79 20 73 61 76 65  o stored by save
62e0: 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29  CursorPosition()
62f0: 2c 20 73 6f 20 74 68 65 72 65 20 63 61 6e 20 62  , so there can b
6300: 65 0a 2a 2a 20 61 74 20 6d 6f 73 74 20 6f 6e 65  e.** at most one
6310: 20 65 66 66 65 63 74 69 76 65 20 72 65 73 74 6f   effective resto
6320: 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  reCursorPosition
6330: 28 29 20 63 61 6c 6c 20 61 66 74 65 72 20 65 61  () call after ea
6340: 63 68 20 0a 2a 2a 20 73 61 76 65 43 75 72 73 6f  ch .** saveCurso
6350: 72 50 6f 73 69 74 69 6f 6e 28 29 2e 0a 2a 2f 0a  rPosition()..*/.
6360: 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65  static int btree
6370: 52 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73  RestoreCursorPos
6380: 69 74 69 6f 6e 28 42 74 43 75 72 73 6f 72 20 2a  ition(BtCursor *
6390: 70 43 75 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  pCur){.  int rc;
63a0: 0a 20 20 69 6e 74 20 73 6b 69 70 4e 65 78 74 3b  .  int skipNext;
63b0: 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
63c0: 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
63d0: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
63e0: 43 75 72 2d 3e 65 53 74 61 74 65 3e 3d 43 55 52  Cur->eState>=CUR
63f0: 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20  SOR_REQUIRESEEK 
6400: 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65  );.  if( pCur->e
6410: 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 46 41  State==CURSOR_FA
6420: 55 4c 54 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ULT ){.    retur
6430: 6e 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74  n pCur->skipNext
6440: 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 65 53  ;.  }.  pCur->eS
6450: 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e  tate = CURSOR_IN
6460: 56 41 4c 49 44 3b 0a 20 20 72 63 20 3d 20 62 74  VALID;.  rc = bt
6470: 72 65 65 4d 6f 76 65 74 6f 28 70 43 75 72 2c 20  reeMoveto(pCur, 
6480: 70 43 75 72 2d 3e 70 4b 65 79 2c 20 70 43 75 72  pCur->pKey, pCur
6490: 2d 3e 6e 4b 65 79 2c 20 30 2c 20 26 73 6b 69 70  ->nKey, 0, &skip
64a0: 4e 65 78 74 29 3b 0a 20 20 69 66 28 20 72 63 3d  Next);.  if( rc=
64b0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
64c0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
64d0: 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 20 20 20 20  Cur->pKey);.    
64e0: 70 43 75 72 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a  pCur->pKey = 0;.
64f0: 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
6500: 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
6510: 5f 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e  _VALID || pCur->
6520: 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49  eState==CURSOR_I
6530: 4e 56 41 4c 49 44 20 29 3b 0a 20 20 20 20 70 43  NVALID );.    pC
6540: 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 7c 3d 20  ur->skipNext |= 
6550: 73 6b 69 70 4e 65 78 74 3b 0a 20 20 20 20 69 66  skipNext;.    if
6560: 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74  ( pCur->skipNext
6570: 20 26 26 20 70 43 75 72 2d 3e 65 53 74 61 74 65   && pCur->eState
6580: 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
6590: 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53  {.      pCur->eS
65a0: 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 53 4b  tate = CURSOR_SK
65b0: 49 50 4e 45 58 54 3b 0a 20 20 20 20 7d 0a 20 20  IPNEXT;.    }.  
65c0: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
65d0: 0a 0a 23 64 65 66 69 6e 65 20 72 65 73 74 6f 72  ..#define restor
65e0: 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
65f0: 70 29 20 5c 0a 20 20 28 70 2d 3e 65 53 74 61 74  p) \.  (p->eStat
6600: 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55 49 52  e>=CURSOR_REQUIR
6610: 45 53 45 45 4b 20 3f 20 5c 0a 20 20 20 20 20 20  ESEEK ? \.      
6620: 20 20 20 62 74 72 65 65 52 65 73 74 6f 72 65 43     btreeRestoreC
6630: 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29  ursorPosition(p)
6640: 20 3a 20 5c 0a 20 20 20 20 20 20 20 20 20 53 51   : \.         SQ
6650: 4c 49 54 45 5f 4f 4b 29 0a 0a 2f 2a 0a 2a 2a 20  LITE_OK)../*.** 
6660: 44 65 74 65 72 6d 69 6e 65 20 77 68 65 74 68 65  Determine whethe
6670: 72 20 6f 72 20 6e 6f 74 20 61 20 63 75 72 73 6f  r or not a curso
6680: 72 20 68 61 73 20 6d 6f 76 65 64 20 66 72 6f 6d  r has moved from
6690: 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 77 68   the position wh
66a0: 65 72 65 0a 2a 2a 20 69 74 20 77 61 73 20 6c 61  ere.** it was la
66b0: 73 74 20 70 6c 61 63 65 64 2c 20 6f 72 20 68 61  st placed, or ha
66c0: 73 20 62 65 65 6e 20 69 6e 76 61 6c 69 64 61 74  s been invalidat
66d0: 65 64 20 66 6f 72 20 61 6e 79 20 6f 74 68 65 72  ed for any other
66e0: 20 72 65 61 73 6f 6e 2e 0a 2a 2a 20 43 75 72 73   reason..** Curs
66f0: 6f 72 73 20 63 61 6e 20 6d 6f 76 65 20 77 68 65  ors can move whe
6700: 6e 20 74 68 65 20 72 6f 77 20 74 68 65 79 20 61  n the row they a
6710: 72 65 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 69  re pointing at i
6720: 73 20 64 65 6c 65 74 65 64 20 6f 75 74 0a 2a 2a  s deleted out.**
6730: 20 66 72 6f 6d 20 75 6e 64 65 72 20 74 68 65 6d   from under them
6740: 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2e 20 20  , for example.  
6750: 43 75 72 73 6f 72 20 6d 69 67 68 74 20 61 6c 73  Cursor might als
6760: 6f 20 6d 6f 76 65 20 69 66 20 61 20 62 74 72 65  o move if a btre
6770: 65 0a 2a 2a 20 69 73 20 72 65 62 61 6c 61 6e 63  e.** is rebalanc
6780: 65 64 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 69 6e  ed..**.** Callin
6790: 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  g this routine w
67a0: 69 74 68 20 61 20 4e 55 4c 4c 20 63 75 72 73 6f  ith a NULL curso
67b0: 72 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72 6e  r pointer return
67c0: 73 20 66 61 6c 73 65 2e 0a 2a 2a 0a 2a 2a 20 55  s false..**.** U
67d0: 73 65 20 74 68 65 20 73 65 70 61 72 61 74 65 20  se the separate 
67e0: 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
67f0: 6f 72 52 65 73 74 6f 72 65 28 29 20 72 6f 75 74  orRestore() rout
6800: 69 6e 65 20 74 6f 20 72 65 73 74 6f 72 65 20 61  ine to restore a
6810: 20 63 75 72 73 6f 72 0a 2a 2a 20 62 61 63 6b 20   cursor.** back 
6820: 74 6f 20 77 68 65 72 65 20 69 74 20 6f 75 67 68  to where it ough
6830: 74 20 74 6f 20 62 65 20 69 66 20 74 68 69 73 20  t to be if this 
6840: 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
6850: 74 72 75 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  true..*/.int sql
6860: 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 48  ite3BtreeCursorH
6870: 61 73 4d 6f 76 65 64 28 42 74 43 75 72 73 6f 72  asMoved(BtCursor
6880: 20 2a 70 43 75 72 29 7b 0a 20 20 72 65 74 75 72   *pCur){.  retur
6890: 6e 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d  n pCur->eState!=
68a0: 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 7d 0a  CURSOR_VALID;.}.
68b0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
68c0: 69 6e 65 20 72 65 73 74 6f 72 65 73 20 61 20 63  ine restores a c
68d0: 75 72 73 6f 72 20 62 61 63 6b 20 74 6f 20 69 74  ursor back to it
68e0: 73 20 6f 72 69 67 69 6e 61 6c 20 70 6f 73 69 74  s original posit
68f0: 69 6f 6e 20 61 66 74 65 72 20 69 74 0a 2a 2a 20  ion after it.** 
6900: 68 61 73 20 62 65 65 6e 20 6d 6f 76 65 64 20 62  has been moved b
6910: 79 20 73 6f 6d 65 20 6f 75 74 73 69 64 65 20 61  y some outside a
6920: 63 74 69 76 69 74 79 20 28 73 75 63 68 20 61 73  ctivity (such as
6930: 20 61 20 62 74 72 65 65 20 72 65 62 61 6c 61 6e   a btree rebalan
6940: 63 65 20 6f 72 0a 2a 2a 20 61 20 72 6f 77 20 68  ce or.** a row h
6950: 61 76 69 6e 67 20 62 65 65 6e 20 64 65 6c 65 74  aving been delet
6960: 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65  ed out from unde
6970: 72 20 74 68 65 20 63 75 72 73 6f 72 29 2e 20 20  r the cursor).  
6980: 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 75 63 63 65 73  .**.** On succes
6990: 73 2c 20 74 68 65 20 2a 70 44 69 66 66 65 72 65  s, the *pDiffere
69a0: 6e 74 52 6f 77 20 70 61 72 61 6d 65 74 65 72 20  ntRow parameter 
69b0: 69 73 20 66 61 6c 73 65 20 69 66 20 74 68 65 20  is false if the 
69c0: 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74 0a 2a  cursor is left.*
69d0: 2a 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 65 78  * pointing at ex
69e0: 61 63 74 6c 79 20 74 68 65 20 73 61 6d 65 20 72  actly the same r
69f0: 6f 77 2e 20 20 2a 70 44 69 66 66 65 72 6e 74 52  ow.  *pDifferntR
6a00: 6f 77 20 69 73 20 74 68 65 20 72 6f 77 20 74 68  ow is the row th
6a10: 65 20 63 75 72 73 6f 72 0a 2a 2a 20 77 61 73 20  e cursor.** was 
6a20: 70 6f 69 6e 74 69 6e 67 20 74 6f 20 68 61 73 20  pointing to has 
6a30: 62 65 65 6e 20 64 65 6c 65 74 65 64 2c 20 66 6f  been deleted, fo
6a40: 72 63 69 6e 67 20 74 68 65 20 63 75 72 73 6f 72  rcing the cursor
6a50: 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 73 6f 6d   to point to som
6a60: 65 0a 2a 2a 20 6e 65 61 72 62 79 20 72 6f 77 2e  e.** nearby row.
6a70: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
6a80: 69 6e 65 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20  ine should only 
6a90: 62 65 20 63 61 6c 6c 65 64 20 66 6f 72 20 61 20  be called for a 
6aa0: 63 75 72 73 6f 72 20 74 68 61 74 20 6a 75 73 74  cursor that just
6ab0: 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 54 52 55   returned.** TRU
6ac0: 45 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 42 74  E from sqlite3Bt
6ad0: 72 65 65 43 75 72 73 6f 72 48 61 73 4d 6f 76 65  reeCursorHasMove
6ae0: 64 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  d()..*/.int sqli
6af0: 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 52 65  te3BtreeCursorRe
6b00: 73 74 6f 72 65 28 42 74 43 75 72 73 6f 72 20 2a  store(BtCursor *
6b10: 70 43 75 72 2c 20 69 6e 74 20 2a 70 44 69 66 66  pCur, int *pDiff
6b20: 65 72 65 6e 74 52 6f 77 29 7b 0a 20 20 69 6e 74  erentRow){.  int
6b30: 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   rc;..  assert( 
6b40: 70 43 75 72 21 3d 30 20 29 3b 0a 20 20 61 73 73  pCur!=0 );.  ass
6b50: 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
6b60: 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e!=CURSOR_VALID 
6b70: 29 3b 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72  );.  rc = restor
6b80: 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
6b90: 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 20  pCur);.  if( rc 
6ba0: 29 7b 0a 20 20 20 20 2a 70 44 69 66 66 65 72 65  ){.    *pDiffere
6bb0: 6e 74 52 6f 77 20 3d 20 31 3b 0a 20 20 20 20 72  ntRow = 1;.    r
6bc0: 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
6bd0: 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  if( pCur->eState
6be0: 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  !=CURSOR_VALID )
6bf0: 7b 0a 20 20 20 20 2a 70 44 69 66 66 65 72 65 6e  {.    *pDifferen
6c00: 74 52 6f 77 20 3d 20 31 3b 0a 20 20 7d 65 6c 73  tRow = 1;.  }els
6c10: 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  e{.    assert( p
6c20: 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d 30  Cur->skipNext==0
6c30: 20 29 3b 0a 20 20 20 20 2a 70 44 69 66 66 65 72   );.    *pDiffer
6c40: 65 6e 74 52 6f 77 20 3d 20 30 3b 0a 20 20 7d 0a  entRow = 0;.  }.
6c50: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
6c60: 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  OK;.}..#ifndef S
6c70: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
6c80: 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 47 69 76 65  ACUUM./*.** Give
6c90: 6e 20 61 20 70 61 67 65 20 6e 75 6d 62 65 72 20  n a page number 
6ca0: 6f 66 20 61 20 72 65 67 75 6c 61 72 20 64 61 74  of a regular dat
6cb0: 61 62 61 73 65 20 70 61 67 65 2c 20 72 65 74 75  abase page, retu
6cc0: 72 6e 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 6e  rn the page.** n
6cd0: 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 70 6f  umber for the po
6ce0: 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 20 74  inter-map page t
6cf0: 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  hat contains the
6d00: 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 0a 2a   entry for the.*
6d10: 2a 20 69 6e 70 75 74 20 70 61 67 65 20 6e 75 6d  * input page num
6d20: 62 65 72 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  ber..**.** Retur
6d30: 6e 20 30 20 28 6e 6f 74 20 61 20 76 61 6c 69 64  n 0 (not a valid
6d40: 20 70 61 67 65 29 20 66 6f 72 20 70 67 6e 6f 3d   page) for pgno=
6d50: 3d 31 20 73 69 6e 63 65 20 74 68 65 72 65 20 69  =1 since there i
6d60: 73 0a 2a 2a 20 6e 6f 20 70 6f 69 6e 74 65 72 20  s.** no pointer 
6d70: 6d 61 70 20 61 73 73 6f 63 69 61 74 65 64 20 77  map associated w
6d80: 69 74 68 20 70 61 67 65 20 31 2e 20 20 54 68 65  ith page 1.  The
6d90: 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b   integrity_check
6da0: 20 6c 6f 67 69 63 0a 2a 2a 20 72 65 71 75 69 72   logic.** requir
6db0: 65 73 20 74 68 61 74 20 70 74 72 6d 61 70 50 61  es that ptrmapPa
6dc0: 67 65 6e 6f 28 2a 2c 31 29 21 3d 31 2e 0a 2a 2f  geno(*,1)!=1..*/
6dd0: 0a 73 74 61 74 69 63 20 50 67 6e 6f 20 70 74 72  .static Pgno ptr
6de0: 6d 61 70 50 61 67 65 6e 6f 28 42 74 53 68 61 72  mapPageno(BtShar
6df0: 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67  ed *pBt, Pgno pg
6e00: 6e 6f 29 7b 0a 20 20 69 6e 74 20 6e 50 61 67 65  no){.  int nPage
6e10: 73 50 65 72 4d 61 70 50 61 67 65 3b 0a 20 20 50  sPerMapPage;.  P
6e20: 67 6e 6f 20 69 50 74 72 4d 61 70 2c 20 72 65 74  gno iPtrMap, ret
6e30: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
6e40: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
6e50: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
6e60: 69 66 28 20 70 67 6e 6f 3c 32 20 29 20 72 65 74  if( pgno<2 ) ret
6e70: 75 72 6e 20 30 3b 0a 20 20 6e 50 61 67 65 73 50  urn 0;.  nPagesP
6e80: 65 72 4d 61 70 50 61 67 65 20 3d 20 28 70 42 74  erMapPage = (pBt
6e90: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 35 29 2b  ->usableSize/5)+
6ea0: 31 3b 0a 20 20 69 50 74 72 4d 61 70 20 3d 20 28  1;.  iPtrMap = (
6eb0: 70 67 6e 6f 2d 32 29 2f 6e 50 61 67 65 73 50 65  pgno-2)/nPagesPe
6ec0: 72 4d 61 70 50 61 67 65 3b 0a 20 20 72 65 74 20  rMapPage;.  ret 
6ed0: 3d 20 28 69 50 74 72 4d 61 70 2a 6e 50 61 67 65  = (iPtrMap*nPage
6ee0: 73 50 65 72 4d 61 70 50 61 67 65 29 20 2b 20 32  sPerMapPage) + 2
6ef0: 3b 20 0a 20 20 69 66 28 20 72 65 74 3d 3d 50 45  ; .  if( ret==PE
6f00: 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
6f10: 70 42 74 29 20 29 7b 0a 20 20 20 20 72 65 74 2b  pBt) ){.    ret+
6f20: 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  +;.  }.  return 
6f30: 72 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72  ret;.}../*.** Wr
6f40: 69 74 65 20 61 6e 20 65 6e 74 72 79 20 69 6e 74  ite an entry int
6f50: 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  o the pointer ma
6f60: 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  p..**.** This ro
6f70: 75 74 69 6e 65 20 75 70 64 61 74 65 73 20 74 68  utine updates th
6f80: 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e  e pointer map en
6f90: 74 72 79 20 66 6f 72 20 70 61 67 65 20 6e 75 6d  try for page num
6fa0: 62 65 72 20 27 6b 65 79 27 0a 2a 2a 20 73 6f 20  ber 'key'.** so 
6fb0: 74 68 61 74 20 69 74 20 6d 61 70 73 20 74 6f 20  that it maps to 
6fc0: 74 79 70 65 20 27 65 54 79 70 65 27 20 61 6e 64  type 'eType' and
6fd0: 20 70 61 72 65 6e 74 20 70 61 67 65 20 6e 75 6d   parent page num
6fe0: 62 65 72 20 27 70 67 6e 6f 27 2e 0a 2a 2a 0a 2a  ber 'pgno'..**.*
6ff0: 2a 20 49 66 20 2a 70 52 43 20 69 73 20 69 6e 69  * If *pRC is ini
7000: 74 69 61 6c 6c 79 20 6e 6f 6e 2d 7a 65 72 6f 20  tially non-zero 
7010: 28 6e 6f 6e 2d 53 51 4c 49 54 45 5f 4f 4b 29 20  (non-SQLITE_OK) 
7020: 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  then this routin
7030: 65 20 69 73 0a 2a 2a 20 61 20 6e 6f 2d 6f 70 2e  e is.** a no-op.
7040: 20 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63    If an error oc
7050: 63 75 72 73 2c 20 74 68 65 20 61 70 70 72 6f 70  curs, the approp
7060: 72 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65  riate error code
7070: 20 69 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20 69   is written.** i
7080: 6e 74 6f 20 2a 70 52 43 2e 0a 2a 2f 0a 73 74 61  nto *pRC..*/.sta
7090: 74 69 63 20 76 6f 69 64 20 70 74 72 6d 61 70 50  tic void ptrmapP
70a0: 75 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  ut(BtShared *pBt
70b0: 2c 20 50 67 6e 6f 20 6b 65 79 2c 20 75 38 20 65  , Pgno key, u8 e
70c0: 54 79 70 65 2c 20 50 67 6e 6f 20 70 61 72 65 6e  Type, Pgno paren
70d0: 74 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20  t, int *pRC){.  
70e0: 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b  DbPage *pDbPage;
70f0: 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72    /* The pointer
7100: 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 75   map page */.  u
7110: 38 20 2a 70 50 74 72 6d 61 70 3b 20 20 20 20 20  8 *pPtrmap;     
7120: 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20   /* The pointer 
7130: 6d 61 70 20 64 61 74 61 20 2a 2f 0a 20 20 50 67  map data */.  Pg
7140: 6e 6f 20 69 50 74 72 6d 61 70 3b 20 20 20 20 20  no iPtrmap;     
7150: 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d  /* The pointer m
7160: 61 70 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a  ap page number *
7170: 2f 0a 20 20 69 6e 74 20 6f 66 66 73 65 74 3b 20  /.  int offset; 
7180: 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
7190: 69 6e 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70  in pointer map p
71a0: 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  age */.  int rc;
71b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
71c0: 74 75 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20 73  turn code from s
71d0: 75 62 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 0a  ubfunctions */..
71e0: 20 20 69 66 28 20 2a 70 52 43 20 29 20 72 65 74    if( *pRC ) ret
71f0: 75 72 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  urn;..  assert( 
7200: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
7210: 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
7220: 3b 0a 20 20 2f 2a 20 54 68 65 20 6d 61 73 74 65  ;.  /* The maste
7230: 72 2d 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 6e  r-journal page n
7240: 75 6d 62 65 72 20 6d 75 73 74 20 6e 65 76 65 72  umber must never
7250: 20 62 65 20 75 73 65 64 20 61 73 20 61 20 70 6f   be used as a po
7260: 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 2a  inter map page *
7270: 2f 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d 50  /.  assert( 0==P
7280: 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74  TRMAP_ISPAGE(pBt
7290: 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  , PENDING_BYTE_P
72a0: 41 47 45 28 70 42 74 29 29 20 29 3b 0a 0a 20 20  AGE(pBt)) );..  
72b0: 61 73 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74  assert( pBt->aut
72c0: 6f 56 61 63 75 75 6d 20 29 3b 0a 20 20 69 66 28  oVacuum );.  if(
72d0: 20 6b 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20 2a   key==0 ){.    *
72e0: 70 52 43 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52  pRC = SQLITE_COR
72f0: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 72  RUPT_BKPT;.    r
7300: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 50 74  eturn;.  }.  iPt
7310: 72 6d 61 70 20 3d 20 50 54 52 4d 41 50 5f 50 41  rmap = PTRMAP_PA
7320: 47 45 4e 4f 28 70 42 74 2c 20 6b 65 79 29 3b 0a  GENO(pBt, key);.
7330: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
7340: 67 65 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67  gerGet(pBt->pPag
7350: 65 72 2c 20 69 50 74 72 6d 61 70 2c 20 26 70 44  er, iPtrmap, &pD
7360: 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63  bPage);.  if( rc
7370: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
7380: 20 20 20 2a 70 52 43 20 3d 20 72 63 3b 0a 20 20     *pRC = rc;.  
7390: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
73a0: 6f 66 66 73 65 74 20 3d 20 50 54 52 4d 41 50 5f  offset = PTRMAP_
73b0: 50 54 52 4f 46 46 53 45 54 28 69 50 74 72 6d 61  PTROFFSET(iPtrma
73c0: 70 2c 20 6b 65 79 29 3b 0a 20 20 69 66 28 20 6f  p, key);.  if( o
73d0: 66 66 73 65 74 3c 30 20 29 7b 0a 20 20 20 20 2a  ffset<0 ){.    *
73e0: 70 52 43 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52  pRC = SQLITE_COR
73f0: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 67  RUPT_BKPT;.    g
7400: 6f 74 6f 20 70 74 72 6d 61 70 5f 65 78 69 74 3b  oto ptrmap_exit;
7410: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6f  .  }.  assert( o
7420: 66 66 73 65 74 20 3c 3d 20 28 69 6e 74 29 70 42  ffset <= (int)pB
7430: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 35 20  t->usableSize-5 
7440: 29 3b 0a 20 20 70 50 74 72 6d 61 70 20 3d 20 28  );.  pPtrmap = (
7450: 75 38 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65  u8 *)sqlite3Page
7460: 72 47 65 74 44 61 74 61 28 70 44 62 50 61 67 65  rGetData(pDbPage
7470: 29 3b 0a 0a 20 20 69 66 28 20 65 54 79 70 65 21  );..  if( eType!
7480: 3d 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d  =pPtrmap[offset]
7490: 20 7c 7c 20 67 65 74 34 62 79 74 65 28 26 70 50   || get4byte(&pP
74a0: 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d 29  trmap[offset+1])
74b0: 21 3d 70 61 72 65 6e 74 20 29 7b 0a 20 20 20 20  !=parent ){.    
74c0: 54 52 41 43 45 28 28 22 50 54 52 4d 41 50 5f 55  TRACE(("PTRMAP_U
74d0: 50 44 41 54 45 3a 20 25 64 2d 3e 28 25 64 2c 25  PDATE: %d->(%d,%
74e0: 64 29 5c 6e 22 2c 20 6b 65 79 2c 20 65 54 79 70  d)\n", key, eTyp
74f0: 65 2c 20 70 61 72 65 6e 74 29 29 3b 0a 20 20 20  e, parent));.   
7500: 20 2a 70 52 43 3d 20 72 63 20 3d 20 73 71 6c 69   *pRC= rc = sqli
7510: 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 44  te3PagerWrite(pD
7520: 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
7530: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
7540: 0a 20 20 20 20 20 20 70 50 74 72 6d 61 70 5b 6f  .      pPtrmap[o
7550: 66 66 73 65 74 5d 20 3d 20 65 54 79 70 65 3b 0a  ffset] = eType;.
7560: 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
7570: 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31  pPtrmap[offset+1
7580: 5d 2c 20 70 61 72 65 6e 74 29 3b 0a 20 20 20 20  ], parent);.    
7590: 7d 0a 20 20 7d 0a 0a 70 74 72 6d 61 70 5f 65 78  }.  }..ptrmap_ex
75a0: 69 74 3a 0a 20 20 73 71 6c 69 74 65 33 50 61 67  it:.  sqlite3Pag
75b0: 65 72 55 6e 72 65 66 28 70 44 62 50 61 67 65 29  erUnref(pDbPage)
75c0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  ;.}../*.** Read 
75d0: 61 6e 20 65 6e 74 72 79 20 66 72 6f 6d 20 74 68  an entry from th
75e0: 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 2a  e pointer map..*
75f0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
7600: 65 20 72 65 74 72 69 65 76 65 73 20 74 68 65 20  e retrieves the 
7610: 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72  pointer map entr
7620: 79 20 66 6f 72 20 70 61 67 65 20 27 6b 65 79 27  y for page 'key'
7630: 2c 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65  , writing.** the
7640: 20 74 79 70 65 20 61 6e 64 20 70 61 72 65 6e 74   type and parent
7650: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20   page number to 
7660: 2a 70 45 54 79 70 65 20 61 6e 64 20 2a 70 50 67  *pEType and *pPg
7670: 6e 6f 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e  no respectively.
7680: 0a 2a 2a 20 41 6e 20 65 72 72 6f 72 20 63 6f 64  .** An error cod
7690: 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  e is returned if
76a0: 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20   something goes 
76b0: 77 72 6f 6e 67 2c 20 6f 74 68 65 72 77 69 73 65  wrong, otherwise
76c0: 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73   SQLITE_OK..*/.s
76d0: 74 61 74 69 63 20 69 6e 74 20 70 74 72 6d 61 70  tatic int ptrmap
76e0: 47 65 74 28 42 74 53 68 61 72 65 64 20 2a 70 42  Get(BtShared *pB
76f0: 74 2c 20 50 67 6e 6f 20 6b 65 79 2c 20 75 38 20  t, Pgno key, u8 
7700: 2a 70 45 54 79 70 65 2c 20 50 67 6e 6f 20 2a 70  *pEType, Pgno *p
7710: 50 67 6e 6f 29 7b 0a 20 20 44 62 50 61 67 65 20  Pgno){.  DbPage 
7720: 2a 70 44 62 50 61 67 65 3b 20 20 20 2f 2a 20 54  *pDbPage;   /* T
7730: 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70  he pointer map p
7740: 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 69 50 74  age */.  int iPt
7750: 72 6d 61 70 3b 20 20 20 20 20 20 20 2f 2a 20 50  rmap;       /* P
7760: 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20  ointer map page 
7770: 69 6e 64 65 78 20 2a 2f 0a 20 20 75 38 20 2a 70  index */.  u8 *p
7780: 50 74 72 6d 61 70 3b 20 20 20 20 20 20 20 2f 2a  Ptrmap;       /*
7790: 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67   Pointer map pag
77a0: 65 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20  e data */.  int 
77b0: 6f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 2f  offset;        /
77c0: 2a 20 4f 66 66 73 65 74 20 6f 66 20 65 6e 74 72  * Offset of entr
77d0: 79 20 69 6e 20 70 6f 69 6e 74 65 72 20 6d 61 70  y in pointer map
77e0: 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20   */.  int rc;.. 
77f0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
7800: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
7810: 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 69 50  >mutex) );..  iP
7820: 74 72 6d 61 70 20 3d 20 50 54 52 4d 41 50 5f 50  trmap = PTRMAP_P
7830: 41 47 45 4e 4f 28 70 42 74 2c 20 6b 65 79 29 3b  AGENO(pBt, key);
7840: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
7850: 61 67 65 72 47 65 74 28 70 42 74 2d 3e 70 50 61  agerGet(pBt->pPa
7860: 67 65 72 2c 20 69 50 74 72 6d 61 70 2c 20 26 70  ger, iPtrmap, &p
7870: 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72  DbPage);.  if( r
7880: 63 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  c!=0 ){.    retu
7890: 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 50 74  rn rc;.  }.  pPt
78a0: 72 6d 61 70 20 3d 20 28 75 38 20 2a 29 73 71 6c  rmap = (u8 *)sql
78b0: 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
78c0: 28 70 44 62 50 61 67 65 29 3b 0a 0a 20 20 6f 66  (pDbPage);..  of
78d0: 66 73 65 74 20 3d 20 50 54 52 4d 41 50 5f 50 54  fset = PTRMAP_PT
78e0: 52 4f 46 46 53 45 54 28 69 50 74 72 6d 61 70 2c  ROFFSET(iPtrmap,
78f0: 20 6b 65 79 29 3b 0a 20 20 69 66 28 20 6f 66 66   key);.  if( off
7900: 73 65 74 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c  set<0 ){.    sql
7910: 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
7920: 44 62 50 61 67 65 29 3b 0a 20 20 20 20 72 65 74  DbPage);.    ret
7930: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
7940: 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 61  PT_BKPT;.  }.  a
7950: 73 73 65 72 74 28 20 6f 66 66 73 65 74 20 3c 3d  ssert( offset <=
7960: 20 28 69 6e 74 29 70 42 74 2d 3e 75 73 61 62 6c   (int)pBt->usabl
7970: 65 53 69 7a 65 2d 35 20 29 3b 0a 20 20 61 73 73  eSize-5 );.  ass
7980: 65 72 74 28 20 70 45 54 79 70 65 21 3d 30 20 29  ert( pEType!=0 )
7990: 3b 0a 20 20 2a 70 45 54 79 70 65 20 3d 20 70 50  ;.  *pEType = pP
79a0: 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d 3b 0a 20  trmap[offset];. 
79b0: 20 69 66 28 20 70 50 67 6e 6f 20 29 20 2a 70 50   if( pPgno ) *pP
79c0: 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26  gno = get4byte(&
79d0: 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31  pPtrmap[offset+1
79e0: 5d 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 50 61  ]);..  sqlite3Pa
79f0: 67 65 72 55 6e 72 65 66 28 70 44 62 50 61 67 65  gerUnref(pDbPage
7a00: 29 3b 0a 20 20 69 66 28 20 2a 70 45 54 79 70 65  );.  if( *pEType
7a10: 3c 31 20 7c 7c 20 2a 70 45 54 79 70 65 3e 35 20  <1 || *pEType>5 
7a20: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
7a30: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
7a40: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
7a50: 3b 0a 7d 0a 0a 23 65 6c 73 65 20 2f 2a 20 69 66  ;.}..#else /* if
7a60: 20 64 65 66 69 6e 65 64 20 53 51 4c 49 54 45 5f   defined SQLITE_
7a70: 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 20  OMIT_AUTOVACUUM 
7a80: 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20 70 74 72  */.  #define ptr
7a90: 6d 61 70 50 75 74 28 77 2c 78 2c 79 2c 7a 2c 72  mapPut(w,x,y,z,r
7aa0: 63 29 0a 20 20 23 64 65 66 69 6e 65 20 70 74 72  c).  #define ptr
7ab0: 6d 61 70 47 65 74 28 77 2c 78 2c 79 2c 7a 29 20  mapGet(w,x,y,z) 
7ac0: 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 23 64 65 66  SQLITE_OK.  #def
7ad0: 69 6e 65 20 70 74 72 6d 61 70 50 75 74 4f 76 66  ine ptrmapPutOvf
7ae0: 6c 50 74 72 28 78 2c 20 79 2c 20 72 63 29 0a 23  lPtr(x, y, rc).#
7af0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 69 76  endif../*.** Giv
7b00: 65 6e 20 61 20 62 74 72 65 65 20 70 61 67 65 20  en a btree page 
7b10: 61 6e 64 20 61 20 63 65 6c 6c 20 69 6e 64 65 78  and a cell index
7b20: 20 28 30 20 6d 65 61 6e 73 20 74 68 65 20 66 69   (0 means the fi
7b30: 72 73 74 20 63 65 6c 6c 20 6f 6e 0a 2a 2a 20 74  rst cell on.** t
7b40: 68 65 20 70 61 67 65 2c 20 31 20 6d 65 61 6e 73  he page, 1 means
7b50: 20 74 68 65 20 73 65 63 6f 6e 64 20 63 65 6c 6c   the second cell
7b60: 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74 68 29 20  , and so forth) 
7b70: 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  return a pointer
7b80: 0a 2a 2a 20 74 6f 20 74 68 65 20 63 65 6c 6c 20  .** to the cell 
7b90: 63 6f 6e 74 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54  content..**.** T
7ba0: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 6f 72 6b  his routine work
7bb0: 73 20 6f 6e 6c 79 20 66 6f 72 20 70 61 67 65 73  s only for pages
7bc0: 20 74 68 61 74 20 64 6f 20 6e 6f 74 20 63 6f 6e   that do not con
7bd0: 74 61 69 6e 20 6f 76 65 72 66 6c 6f 77 20 63 65  tain overflow ce
7be0: 6c 6c 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  lls..*/.#define 
7bf0: 66 69 6e 64 43 65 6c 6c 28 50 2c 49 29 20 5c 0a  findCell(P,I) \.
7c00: 20 20 28 28 50 29 2d 3e 61 44 61 74 61 20 2b 20    ((P)->aData + 
7c10: 28 28 50 29 2d 3e 6d 61 73 6b 50 61 67 65 20 26  ((P)->maskPage &
7c20: 20 67 65 74 32 62 79 74 65 28 26 28 50 29 2d 3e   get2byte(&(P)->
7c30: 61 43 65 6c 6c 49 64 78 5b 32 2a 28 49 29 5d 29  aCellIdx[2*(I)])
7c40: 29 29 0a 23 64 65 66 69 6e 65 20 66 69 6e 64 43  )).#define findC
7c50: 65 6c 6c 76 32 28 44 2c 4d 2c 4f 2c 49 29 20 28  ellv2(D,M,O,I) (
7c60: 44 2b 28 4d 26 67 65 74 32 62 79 74 65 28 44 2b  D+(M&get2byte(D+
7c70: 28 4f 2b 32 2a 28 49 29 29 29 29 29 0a 0a 0a 2f  (O+2*(I))))).../
7c80: 2a 0a 2a 2a 20 54 68 69 73 20 61 20 6d 6f 72 65  *.** This a more
7c90: 20 63 6f 6d 70 6c 65 78 20 76 65 72 73 69 6f 6e   complex version
7ca0: 20 6f 66 20 66 69 6e 64 43 65 6c 6c 28 29 20 74   of findCell() t
7cb0: 68 61 74 20 77 6f 72 6b 73 20 66 6f 72 0a 2a 2a  hat works for.**
7cc0: 20 70 61 67 65 73 20 74 68 61 74 20 64 6f 20 63   pages that do c
7cd0: 6f 6e 74 61 69 6e 20 6f 76 65 72 66 6c 6f 77 20  ontain overflow 
7ce0: 63 65 6c 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  cells..*/.static
7cf0: 20 75 38 20 2a 66 69 6e 64 4f 76 65 72 66 6c 6f   u8 *findOverflo
7d00: 77 43 65 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70  wCell(MemPage *p
7d10: 50 61 67 65 2c 20 69 6e 74 20 69 43 65 6c 6c 29  Page, int iCell)
7d20: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73  {.  int i;.  ass
7d30: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
7d40: 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
7d50: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
7d60: 66 6f 72 28 69 3d 70 50 61 67 65 2d 3e 6e 4f 76  for(i=pPage->nOv
7d70: 65 72 66 6c 6f 77 2d 31 3b 20 69 3e 3d 30 3b 20  erflow-1; i>=0; 
7d80: 69 2d 2d 29 7b 0a 20 20 20 20 69 6e 74 20 6b 3b  i--){.    int k;
7d90: 0a 20 20 20 20 6b 20 3d 20 70 50 61 67 65 2d 3e  .    k = pPage->
7da0: 61 69 4f 76 66 6c 5b 69 5d 3b 0a 20 20 20 20 69  aiOvfl[i];.    i
7db0: 66 28 20 6b 3c 3d 69 43 65 6c 6c 20 29 7b 0a 20  f( k<=iCell ){. 
7dc0: 20 20 20 20 20 69 66 28 20 6b 3d 3d 69 43 65 6c       if( k==iCel
7dd0: 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  l ){.        ret
7de0: 75 72 6e 20 70 50 61 67 65 2d 3e 61 70 4f 76 66  urn pPage->apOvf
7df0: 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  l[i];.      }.  
7e00: 20 20 20 20 69 43 65 6c 6c 2d 2d 3b 0a 20 20 20      iCell--;.   
7e10: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
7e20: 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20  findCell(pPage, 
7e30: 69 43 65 6c 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  iCell);.}../*.**
7e40: 20 50 61 72 73 65 20 61 20 63 65 6c 6c 20 63 6f   Parse a cell co
7e50: 6e 74 65 6e 74 20 62 6c 6f 63 6b 20 61 6e 64 20  ntent block and 
7e60: 66 69 6c 6c 20 69 6e 20 74 68 65 20 43 65 6c 6c  fill in the Cell
7e70: 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e 20  Info structure. 
7e80: 20 54 68 65 72 65 0a 2a 2a 20 61 72 65 20 74 77   There.** are tw
7e90: 6f 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 68  o versions of th
7ea0: 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 20 62 74  is function.  bt
7eb0: 72 65 65 50 61 72 73 65 43 65 6c 6c 28 29 20 74  reeParseCell() t
7ec0: 61 6b 65 73 20 61 20 0a 2a 2a 20 63 65 6c 6c 20  akes a .** cell 
7ed0: 69 6e 64 65 78 20 61 73 20 74 68 65 20 73 65 63  index as the sec
7ee0: 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 61 6e 64  ond argument and
7ef0: 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50   btreeParseCellP
7f00: 74 72 28 29 20 0a 2a 2a 20 74 61 6b 65 73 20 61  tr() .** takes a
7f10: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
7f20: 62 6f 64 79 20 6f 66 20 74 68 65 20 63 65 6c 6c  body of the cell
7f30: 20 61 73 20 69 74 73 20 73 65 63 6f 6e 64 20 61   as its second a
7f40: 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74  rgument..*/.stat
7f50: 69 63 20 76 6f 69 64 20 62 74 72 65 65 50 61 72  ic void btreePar
7f60: 73 65 43 65 6c 6c 50 74 72 28 0a 20 20 4d 65 6d  seCellPtr(.  Mem
7f70: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20  Page *pPage,    
7f80: 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e       /* Page con
7f90: 74 61 69 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c  taining the cell
7fa0: 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c   */.  u8 *pCell,
7fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7fc0: 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   Pointer to the 
7fd0: 63 65 6c 6c 20 74 65 78 74 2e 20 2a 2f 0a 20 20  cell text. */.  
7fe0: 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20  CellInfo *pInfo 
7ff0: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20          /* Fill 
8000: 69 6e 20 74 68 69 73 20 73 74 72 75 63 74 75 72  in this structur
8010: 65 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a 70 49  e */.){.  u8 *pI
8020: 74 65 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  ter;            
8030: 20 20 2f 2a 20 46 6f 72 20 73 63 61 6e 6e 69 6e    /* For scannin
8040: 67 20 74 68 72 6f 75 67 68 20 70 43 65 6c 6c 20  g through pCell 
8050: 2a 2f 0a 20 20 75 33 32 20 6e 50 61 79 6c 6f 61  */.  u32 nPayloa
8060: 64 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  d;           /* 
8070: 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
8080: 6f 66 20 63 65 6c 6c 20 70 61 79 6c 6f 61 64 20  of cell payload 
8090: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  */..  assert( sq
80a0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
80b0: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
80c0: 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
80d0: 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 30 20   pPage->leaf==0 
80e0: 7c 7c 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d  || pPage->leaf==
80f0: 31 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  1 );.  if( pPage
8100: 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20 29 7b 0a  ->intKeyLeaf ){.
8110: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
8120: 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3d  e->childPtrSize=
8130: 3d 30 20 29 3b 0a 20 20 20 20 70 49 74 65 72 20  =0 );.    pIter 
8140: 3d 20 70 43 65 6c 6c 20 2b 20 67 65 74 56 61 72  = pCell + getVar
8150: 69 6e 74 33 32 28 70 43 65 6c 6c 2c 20 6e 50 61  int32(pCell, nPa
8160: 79 6c 6f 61 64 29 3b 0a 20 20 20 20 70 49 74 65  yload);.    pIte
8170: 72 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 28 70  r += getVarint(p
8180: 49 74 65 72 2c 20 28 75 36 34 2a 29 26 70 49 6e  Iter, (u64*)&pIn
8190: 66 6f 2d 3e 6e 4b 65 79 29 3b 0a 20 20 7d 65 6c  fo->nKey);.  }el
81a0: 73 65 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 6f  se if( pPage->no
81b0: 50 61 79 6c 6f 61 64 20 29 7b 0a 20 20 20 20 61  Payload ){.    a
81c0: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 63 68  ssert( pPage->ch
81d0: 69 6c 64 50 74 72 53 69 7a 65 3d 3d 34 20 29 3b  ildPtrSize==4 );
81e0: 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a  .    pInfo->nSiz
81f0: 65 20 3d 20 34 20 2b 20 67 65 74 56 61 72 69 6e  e = 4 + getVarin
8200: 74 28 26 70 43 65 6c 6c 5b 34 5d 2c 20 28 75 36  t(&pCell[4], (u6
8210: 34 2a 29 26 70 49 6e 66 6f 2d 3e 6e 4b 65 79 29  4*)&pInfo->nKey)
8220: 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 50 61  ;.    pInfo->nPa
8230: 79 6c 6f 61 64 20 3d 20 30 3b 0a 20 20 20 20 70  yload = 0;.    p
8240: 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 30  Info->nLocal = 0
8250: 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 69 4f 76  ;.    pInfo->iOv
8260: 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 20 20  erflow = 0;.    
8270: 70 49 6e 66 6f 2d 3e 70 50 61 79 6c 6f 61 64 20  pInfo->pPayload 
8280: 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  = 0;.    return;
8290: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49  .  }else{.    pI
82a0: 74 65 72 20 3d 20 70 43 65 6c 6c 20 2b 20 70 50  ter = pCell + pP
82b0: 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a  age->childPtrSiz
82c0: 65 3b 0a 20 20 20 20 70 49 74 65 72 20 2b 3d 20  e;.    pIter += 
82d0: 67 65 74 56 61 72 69 6e 74 33 32 28 70 49 74 65  getVarint32(pIte
82e0: 72 2c 20 6e 50 61 79 6c 6f 61 64 29 3b 0a 20 20  r, nPayload);.  
82f0: 20 20 70 49 6e 66 6f 2d 3e 6e 4b 65 79 20 3d 20    pInfo->nKey = 
8300: 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 7d 0a 20 20  nPayload;.  }.  
8310: 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20  pInfo->nPayload 
8320: 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 70 49  = nPayload;.  pI
8330: 6e 66 6f 2d 3e 70 50 61 79 6c 6f 61 64 20 3d 20  nfo->pPayload = 
8340: 70 49 74 65 72 3b 0a 20 20 74 65 73 74 63 61 73  pIter;.  testcas
8350: 65 28 20 6e 50 61 79 6c 6f 61 64 3d 3d 70 50 61  e( nPayload==pPa
8360: 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a  ge->maxLocal );.
8370: 20 20 74 65 73 74 63 61 73 65 28 20 6e 50 61 79    testcase( nPay
8380: 6c 6f 61 64 3d 3d 70 50 61 67 65 2d 3e 6d 61 78  load==pPage->max
8390: 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 69 66 28  Local+1 );.  if(
83a0: 20 6e 50 61 79 6c 6f 61 64 3c 3d 70 50 61 67 65   nPayload<=pPage
83b0: 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20  ->maxLocal ){.  
83c0: 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74 68 65    /* This is the
83d0: 20 28 65 61 73 79 29 20 63 6f 6d 6d 6f 6e 20 63   (easy) common c
83e0: 61 73 65 20 77 68 65 72 65 20 74 68 65 20 65 6e  ase where the en
83f0: 74 69 72 65 20 70 61 79 6c 6f 61 64 20 66 69 74  tire payload fit
8400: 73 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20  s.    ** on the 
8410: 6c 6f 63 61 6c 20 70 61 67 65 2e 20 20 4e 6f 20  local page.  No 
8420: 6f 76 65 72 66 6c 6f 77 20 69 73 20 72 65 71 75  overflow is requ
8430: 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ired..    */.   
8440: 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20   pInfo->nSize = 
8450: 6e 50 61 79 6c 6f 61 64 20 2b 20 28 75 31 36 29  nPayload + (u16)
8460: 28 70 49 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b  (pIter - pCell);
8470: 0a 20 20 20 20 69 66 28 20 70 49 6e 66 6f 2d 3e  .    if( pInfo->
8480: 6e 53 69 7a 65 3c 34 20 29 20 70 49 6e 66 6f 2d  nSize<4 ) pInfo-
8490: 3e 6e 53 69 7a 65 20 3d 20 34 3b 0a 20 20 20 20  >nSize = 4;.    
84a0: 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20  pInfo->nLocal = 
84b0: 28 75 31 36 29 6e 50 61 79 6c 6f 61 64 3b 0a 20  (u16)nPayload;. 
84c0: 20 20 20 70 49 6e 66 6f 2d 3e 69 4f 76 65 72 66     pInfo->iOverf
84d0: 6c 6f 77 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  low = 0;.  }else
84e0: 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  {.    /* If the 
84f0: 70 61 79 6c 6f 61 64 20 77 69 6c 6c 20 6e 6f 74  payload will not
8500: 20 66 69 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20   fit completely 
8510: 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 67  on the local pag
8520: 65 2c 20 77 65 20 68 61 76 65 0a 20 20 20 20 2a  e, we have.    *
8530: 2a 20 74 6f 20 64 65 63 69 64 65 20 68 6f 77 20  * to decide how 
8540: 6d 75 63 68 20 74 6f 20 73 74 6f 72 65 20 6c 6f  much to store lo
8550: 63 61 6c 6c 79 20 61 6e 64 20 68 6f 77 20 6d 75  cally and how mu
8560: 63 68 20 74 6f 20 73 70 69 6c 6c 20 6f 6e 74 6f  ch to spill onto
8570: 0a 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77  .    ** overflow
8580: 20 70 61 67 65 73 2e 20 20 54 68 65 20 73 74 72   pages.  The str
8590: 61 74 65 67 79 20 69 73 20 74 6f 20 6d 69 6e 69  ategy is to mini
85a0: 6d 69 7a 65 20 74 68 65 20 61 6d 6f 75 6e 74 20  mize the amount 
85b0: 6f 66 20 75 6e 75 73 65 64 0a 20 20 20 20 2a 2a  of unused.    **
85c0: 20 73 70 61 63 65 20 6f 6e 20 6f 76 65 72 66 6c   space on overfl
85d0: 6f 77 20 70 61 67 65 73 20 77 68 69 6c 65 20 6b  ow pages while k
85e0: 65 65 70 69 6e 67 20 74 68 65 20 61 6d 6f 75 6e  eeping the amoun
85f0: 74 20 6f 66 20 6c 6f 63 61 6c 20 73 74 6f 72 61  t of local stora
8600: 67 65 0a 20 20 20 20 2a 2a 20 69 6e 20 62 65 74  ge.    ** in bet
8610: 77 65 65 6e 20 6d 69 6e 4c 6f 63 61 6c 20 61 6e  ween minLocal an
8620: 64 20 6d 61 78 4c 6f 63 61 6c 2e 0a 20 20 20 20  d maxLocal..    
8630: 2a 2a 0a 20 20 20 20 2a 2a 20 57 61 72 6e 69 6e  **.    ** Warnin
8640: 67 3a 20 20 63 68 61 6e 67 69 6e 67 20 74 68 65  g:  changing the
8650: 20 77 61 79 20 6f 76 65 72 66 6c 6f 77 20 70 61   way overflow pa
8660: 79 6c 6f 61 64 20 69 73 20 64 69 73 74 72 69 62  yload is distrib
8670: 75 74 65 64 20 69 6e 20 61 6e 79 0a 20 20 20 20  uted in any.    
8680: 2a 2a 20 77 61 79 20 77 69 6c 6c 20 72 65 73 75  ** way will resu
8690: 6c 74 20 69 6e 20 61 6e 20 69 6e 63 6f 6d 70 61  lt in an incompa
86a0: 74 69 62 6c 65 20 66 69 6c 65 20 66 6f 72 6d 61  tible file forma
86b0: 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e  t..    */.    in
86c0: 74 20 6d 69 6e 4c 6f 63 61 6c 3b 20 20 2f 2a 20  t minLocal;  /* 
86d0: 4d 69 6e 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f  Minimum amount o
86e0: 66 20 70 61 79 6c 6f 61 64 20 68 65 6c 64 20 6c  f payload held l
86f0: 6f 63 61 6c 6c 79 20 2a 2f 0a 20 20 20 20 69 6e  ocally */.    in
8700: 74 20 6d 61 78 4c 6f 63 61 6c 3b 20 20 2f 2a 20  t maxLocal;  /* 
8710: 4d 61 78 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f  Maximum amount o
8720: 66 20 70 61 79 6c 6f 61 64 20 68 65 6c 64 20 6c  f payload held l
8730: 6f 63 61 6c 6c 79 20 2a 2f 0a 20 20 20 20 69 6e  ocally */.    in
8740: 74 20 73 75 72 70 6c 75 73 3b 20 20 20 2f 2a 20  t surplus;   /* 
8750: 4f 76 65 72 66 6c 6f 77 20 70 61 79 6c 6f 61 64  Overflow payload
8760: 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 6c   available for l
8770: 6f 63 61 6c 20 73 74 6f 72 61 67 65 20 2a 2f 0a  ocal storage */.
8780: 0a 20 20 20 20 6d 69 6e 4c 6f 63 61 6c 20 3d 20  .    minLocal = 
8790: 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b  pPage->minLocal;
87a0: 0a 20 20 20 20 6d 61 78 4c 6f 63 61 6c 20 3d 20  .    maxLocal = 
87b0: 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 3b  pPage->maxLocal;
87c0: 0a 20 20 20 20 73 75 72 70 6c 75 73 20 3d 20 6d  .    surplus = m
87d0: 69 6e 4c 6f 63 61 6c 20 2b 20 28 6e 50 61 79 6c  inLocal + (nPayl
87e0: 6f 61 64 20 2d 20 6d 69 6e 4c 6f 63 61 6c 29 25  oad - minLocal)%
87f0: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61  (pPage->pBt->usa
8800: 62 6c 65 53 69 7a 65 20 2d 20 34 29 3b 0a 20 20  bleSize - 4);.  
8810: 20 20 74 65 73 74 63 61 73 65 28 20 73 75 72 70    testcase( surp
8820: 6c 75 73 3d 3d 6d 61 78 4c 6f 63 61 6c 20 29 3b  lus==maxLocal );
8830: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 73  .    testcase( s
8840: 75 72 70 6c 75 73 3d 3d 6d 61 78 4c 6f 63 61 6c  urplus==maxLocal
8850: 2b 31 20 29 3b 0a 20 20 20 20 69 66 28 20 73 75  +1 );.    if( su
8860: 72 70 6c 75 73 20 3c 3d 20 6d 61 78 4c 6f 63 61  rplus <= maxLoca
8870: 6c 20 29 7b 0a 20 20 20 20 20 20 70 49 6e 66 6f  l ){.      pInfo
8880: 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29  ->nLocal = (u16)
8890: 73 75 72 70 6c 75 73 3b 0a 20 20 20 20 7d 65 6c  surplus;.    }el
88a0: 73 65 7b 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d  se{.      pInfo-
88b0: 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 6d  >nLocal = (u16)m
88c0: 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 7d 0a 20  inLocal;.    }. 
88d0: 20 20 20 70 49 6e 66 6f 2d 3e 69 4f 76 65 72 66     pInfo->iOverf
88e0: 6c 6f 77 20 3d 20 28 75 31 36 29 28 26 70 49 6e  low = (u16)(&pIn
88f0: 66 6f 2d 3e 70 50 61 79 6c 6f 61 64 5b 70 49 6e  fo->pPayload[pIn
8900: 66 6f 2d 3e 6e 4c 6f 63 61 6c 5d 20 2d 20 70 43  fo->nLocal] - pC
8910: 65 6c 6c 29 3b 0a 20 20 20 20 70 49 6e 66 6f 2d  ell);.    pInfo-
8920: 3e 6e 53 69 7a 65 20 3d 20 70 49 6e 66 6f 2d 3e  >nSize = pInfo->
8930: 69 4f 76 65 72 66 6c 6f 77 20 2b 20 34 3b 0a 20  iOverflow + 4;. 
8940: 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64   }.}.static void
8950: 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28   btreeParseCell(
8960: 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
8970: 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  e,         /* Pa
8980: 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  ge containing th
8990: 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20  e cell */.  int 
89a0: 69 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20  iCell,          
89b0: 20 20 20 20 2f 2a 20 54 68 65 20 63 65 6c 6c 20      /* The cell 
89c0: 69 6e 64 65 78 2e 20 20 46 69 72 73 74 20 63 65  index.  First ce
89d0: 6c 6c 20 69 73 20 30 20 2a 2f 0a 20 20 43 65 6c  ll is 0 */.  Cel
89e0: 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20  lInfo *pInfo    
89f0: 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20       /* Fill in 
8a00: 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20 2a  this structure *
8a10: 2f 0a 29 7b 0a 20 20 62 74 72 65 65 50 61 72 73  /.){.  btreePars
8a20: 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20  eCellPtr(pPage, 
8a30: 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20  findCell(pPage, 
8a40: 69 43 65 6c 6c 29 2c 20 70 49 6e 66 6f 29 3b 0a  iCell), pInfo);.
8a50: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65  }../*.** Compute
8a60: 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65   the total numbe
8a70: 72 20 6f 66 20 62 79 74 65 73 20 74 68 61 74 20  r of bytes that 
8a80: 61 20 43 65 6c 6c 20 6e 65 65 64 73 20 69 6e 20  a Cell needs in 
8a90: 74 68 65 20 63 65 6c 6c 0a 2a 2a 20 64 61 74 61  the cell.** data
8aa0: 20 61 72 65 61 20 6f 66 20 74 68 65 20 62 74 72   area of the btr
8ab0: 65 65 2d 70 61 67 65 2e 20 20 54 68 65 20 72 65  ee-page.  The re
8ac0: 74 75 72 6e 20 6e 75 6d 62 65 72 20 69 6e 63 6c  turn number incl
8ad0: 75 64 65 73 20 74 68 65 20 63 65 6c 6c 0a 2a 2a  udes the cell.**
8ae0: 20 64 61 74 61 20 68 65 61 64 65 72 20 61 6e 64   data header and
8af0: 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 79 6c 6f   the local paylo
8b00: 61 64 2c 20 62 75 74 20 6e 6f 74 20 61 6e 79 20  ad, but not any 
8b10: 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 6f 72  overflow page or
8b20: 0a 2a 2a 20 74 68 65 20 73 70 61 63 65 20 75 73  .** the space us
8b30: 65 64 20 62 79 20 74 68 65 20 63 65 6c 6c 20 70  ed by the cell p
8b40: 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  ointer..*/.stati
8b50: 63 20 75 31 36 20 63 65 6c 6c 53 69 7a 65 50 74  c u16 cellSizePt
8b60: 72 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  r(MemPage *pPage
8b70: 2c 20 75 38 20 2a 70 43 65 6c 6c 29 7b 0a 20 20  , u8 *pCell){.  
8b80: 75 38 20 2a 70 49 74 65 72 20 3d 20 70 43 65 6c  u8 *pIter = pCel
8b90: 6c 20 2b 20 70 50 61 67 65 2d 3e 63 68 69 6c 64  l + pPage->child
8ba0: 50 74 72 53 69 7a 65 3b 20 2f 2a 20 46 6f 72 20  PtrSize; /* For 
8bb0: 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 62 79 74  looping over byt
8bc0: 65 73 20 6f 66 20 70 43 65 6c 6c 20 2a 2f 0a 20  es of pCell */. 
8bd0: 20 75 38 20 2a 70 45 6e 64 3b 20 20 20 20 20 20   u8 *pEnd;      
8be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8bf0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 6e 64            /* End
8c00: 20 6d 61 72 6b 20 66 6f 72 20 61 20 76 61 72 69   mark for a vari
8c10: 6e 74 20 2a 2f 0a 20 20 75 33 32 20 6e 53 69 7a  nt */.  u32 nSiz
8c20: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
8c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8c40: 20 2f 2a 20 53 69 7a 65 20 76 61 6c 75 65 20 74   /* Size value t
8c50: 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 0a 23 69 66  o return */..#if
8c60: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
8c70: 0a 20 20 2f 2a 20 54 68 65 20 76 61 6c 75 65 20  .  /* The value 
8c80: 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 69 73  returned by this
8c90: 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64   function should
8ca0: 20 61 6c 77 61 79 73 20 62 65 20 74 68 65 20 73   always be the s
8cb0: 61 6d 65 20 61 73 0a 20 20 2a 2a 20 74 68 65 20  ame as.  ** the 
8cc0: 28 43 65 6c 6c 49 6e 66 6f 2e 6e 53 69 7a 65 29  (CellInfo.nSize)
8cd0: 20 76 61 6c 75 65 20 66 6f 75 6e 64 20 62 79 20   value found by 
8ce0: 64 6f 69 6e 67 20 61 20 66 75 6c 6c 20 70 61 72  doing a full par
8cf0: 73 65 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 63  se of the.  ** c
8d00: 65 6c 6c 2e 20 49 66 20 53 51 4c 49 54 45 5f 44  ell. If SQLITE_D
8d10: 45 42 55 47 20 69 73 20 64 65 66 69 6e 65 64 2c  EBUG is defined,
8d20: 20 61 6e 20 61 73 73 65 72 74 28 29 20 61 74 20   an assert() at 
8d30: 74 68 65 20 62 6f 74 74 6f 6d 20 6f 66 0a 20 20  the bottom of.  
8d40: 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** this function
8d50: 20 76 65 72 69 66 69 65 73 20 74 68 61 74 20 74   verifies that t
8d60: 68 69 73 20 69 6e 76 61 72 69 61 6e 74 20 69 73  his invariant is
8d70: 20 6e 6f 74 20 76 69 6f 6c 61 74 65 64 2e 20 2a   not violated. *
8d80: 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 64 65 62  /.  CellInfo deb
8d90: 75 67 69 6e 66 6f 3b 0a 20 20 62 74 72 65 65 50  uginfo;.  btreeP
8da0: 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67  arseCellPtr(pPag
8db0: 65 2c 20 70 43 65 6c 6c 2c 20 26 64 65 62 75 67  e, pCell, &debug
8dc0: 69 6e 66 6f 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  info);.#endif.. 
8dd0: 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 6f 50 61   if( pPage->noPa
8de0: 79 6c 6f 61 64 20 29 7b 0a 20 20 20 20 70 45 6e  yload ){.    pEn
8df0: 64 20 3d 20 26 70 49 74 65 72 5b 39 5d 3b 0a 20  d = &pIter[9];. 
8e00: 20 20 20 77 68 69 6c 65 28 20 28 2a 70 49 74 65     while( (*pIte
8e10: 72 2b 2b 29 26 30 78 38 30 20 26 26 20 70 49 74  r++)&0x80 && pIt
8e20: 65 72 3c 70 45 6e 64 20 29 3b 0a 20 20 20 20 61  er<pEnd );.    a
8e30: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 63 68  ssert( pPage->ch
8e40: 69 6c 64 50 74 72 53 69 7a 65 3d 3d 34 20 29 3b  ildPtrSize==4 );
8e50: 0a 20 20 20 20 72 65 74 75 72 6e 20 28 75 31 36  .    return (u16
8e60: 29 28 70 49 74 65 72 20 2d 20 70 43 65 6c 6c 29  )(pIter - pCell)
8e70: 3b 0a 20 20 7d 0a 20 20 6e 53 69 7a 65 20 3d 20  ;.  }.  nSize = 
8e80: 2a 70 49 74 65 72 3b 0a 20 20 69 66 28 20 6e 53  *pIter;.  if( nS
8e90: 69 7a 65 3e 3d 30 78 38 30 20 29 7b 0a 20 20 20  ize>=0x80 ){.   
8ea0: 20 70 45 6e 64 20 3d 20 26 70 49 74 65 72 5b 39   pEnd = &pIter[9
8eb0: 5d 3b 0a 20 20 20 20 6e 53 69 7a 65 20 26 3d 20  ];.    nSize &= 
8ec0: 30 78 37 66 3b 0a 20 20 20 20 64 6f 7b 0a 20 20  0x7f;.    do{.  
8ed0: 20 20 20 20 6e 53 69 7a 65 20 3d 20 28 6e 53 69      nSize = (nSi
8ee0: 7a 65 3c 3c 37 29 20 7c 20 28 2a 2b 2b 70 49 74  ze<<7) | (*++pIt
8ef0: 65 72 20 26 20 30 78 37 66 29 3b 0a 20 20 20 20  er & 0x7f);.    
8f00: 7d 77 68 69 6c 65 28 20 2a 28 70 49 74 65 72 29  }while( *(pIter)
8f10: 3e 3d 30 78 38 30 20 26 26 20 70 49 74 65 72 3c  >=0x80 && pIter<
8f20: 70 45 6e 64 20 29 3b 0a 20 20 7d 0a 20 20 70 49  pEnd );.  }.  pI
8f30: 74 65 72 2b 2b 3b 0a 20 20 69 66 28 20 70 50 61  ter++;.  if( pPa
8f40: 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20  ge->intKey ){.  
8f50: 20 20 2f 2a 20 70 49 74 65 72 20 6e 6f 77 20 70    /* pIter now p
8f60: 6f 69 6e 74 73 20 61 74 20 74 68 65 20 36 34 2d  oints at the 64-
8f70: 62 69 74 20 69 6e 74 65 67 65 72 20 6b 65 79 20  bit integer key 
8f80: 76 61 6c 75 65 2c 20 61 20 76 61 72 69 61 62 6c  value, a variabl
8f90: 65 20 6c 65 6e 67 74 68 20 0a 20 20 20 20 2a 2a  e length .    **
8fa0: 20 69 6e 74 65 67 65 72 2e 20 54 68 65 20 66 6f   integer. The fo
8fb0: 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 6d 6f  llowing block mo
8fc0: 76 65 73 20 70 49 74 65 72 20 74 6f 20 70 6f 69  ves pIter to poi
8fd0: 6e 74 20 61 74 20 74 68 65 20 66 69 72 73 74 20  nt at the first 
8fe0: 62 79 74 65 0a 20 20 20 20 2a 2a 20 70 61 73 74  byte.    ** past
8ff0: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
9000: 6b 65 79 20 76 61 6c 75 65 2e 20 2a 2f 0a 20 20  key value. */.  
9010: 20 20 70 45 6e 64 20 3d 20 26 70 49 74 65 72 5b    pEnd = &pIter[
9020: 39 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28  9];.    while( (
9030: 2a 70 49 74 65 72 2b 2b 29 26 30 78 38 30 20 26  *pIter++)&0x80 &
9040: 26 20 70 49 74 65 72 3c 70 45 6e 64 20 29 3b 0a  & pIter<pEnd );.
9050: 20 20 7d 0a 20 20 74 65 73 74 63 61 73 65 28 20    }.  testcase( 
9060: 6e 53 69 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d 61  nSize==pPage->ma
9070: 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 74 65 73 74  xLocal );.  test
9080: 63 61 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61  case( nSize==pPa
9090: 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29  ge->maxLocal+1 )
90a0: 3b 0a 20 20 69 66 28 20 6e 53 69 7a 65 3c 3d 70  ;.  if( nSize<=p
90b0: 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29  Page->maxLocal )
90c0: 7b 0a 20 20 20 20 6e 53 69 7a 65 20 2b 3d 20 28  {.    nSize += (
90d0: 75 33 32 29 28 70 49 74 65 72 20 2d 20 70 43 65  u32)(pIter - pCe
90e0: 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20 6e 53 69  ll);.    if( nSi
90f0: 7a 65 3c 34 20 29 20 6e 53 69 7a 65 20 3d 20 34  ze<4 ) nSize = 4
9100: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
9110: 6e 74 20 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 50  nt minLocal = pP
9120: 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20  age->minLocal;. 
9130: 20 20 20 6e 53 69 7a 65 20 3d 20 6d 69 6e 4c 6f     nSize = minLo
9140: 63 61 6c 20 2b 20 28 6e 53 69 7a 65 20 2d 20 6d  cal + (nSize - m
9150: 69 6e 4c 6f 63 61 6c 29 20 25 20 28 70 50 61 67  inLocal) % (pPag
9160: 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
9170: 7a 65 20 2d 20 34 29 3b 0a 20 20 20 20 74 65 73  ze - 4);.    tes
9180: 74 63 61 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50  tcase( nSize==pP
9190: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b  age->maxLocal );
91a0: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e  .    testcase( n
91b0: 53 69 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78  Size==pPage->max
91c0: 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 20 20 69  Local+1 );.    i
91d0: 66 28 20 6e 53 69 7a 65 3e 70 50 61 67 65 2d 3e  f( nSize>pPage->
91e0: 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20  maxLocal ){.    
91f0: 20 20 6e 53 69 7a 65 20 3d 20 6d 69 6e 4c 6f 63    nSize = minLoc
9200: 61 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 53  al;.    }.    nS
9210: 69 7a 65 20 2b 3d 20 34 20 2b 20 28 75 31 36 29  ize += 4 + (u16)
9220: 28 70 49 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b  (pIter - pCell);
9230: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e  .  }.  assert( n
9240: 53 69 7a 65 3d 3d 64 65 62 75 67 69 6e 66 6f 2e  Size==debuginfo.
9250: 6e 53 69 7a 65 20 7c 7c 20 43 4f 52 52 55 50 54  nSize || CORRUPT
9260: 5f 44 42 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  _DB );.  return 
9270: 28 75 31 36 29 6e 53 69 7a 65 3b 0a 7d 0a 0a 23  (u16)nSize;.}..#
9280: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
9290: 55 47 0a 2f 2a 20 54 68 69 73 20 76 61 72 69 61  UG./* This varia
92a0: 74 69 6f 6e 20 6f 6e 20 63 65 6c 6c 53 69 7a 65  tion on cellSize
92b0: 50 74 72 28 29 20 69 73 20 75 73 65 64 20 69 6e  Ptr() is used in
92c0: 73 69 64 65 20 6f 66 20 61 73 73 65 72 74 28 29  side of assert()
92d0: 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2a 20 6f   statements.** o
92e0: 6e 6c 79 2e 20 2a 2f 0a 73 74 61 74 69 63 20 75  nly. */.static u
92f0: 31 36 20 63 65 6c 6c 53 69 7a 65 28 4d 65 6d 50  16 cellSize(MemP
9300: 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20  age *pPage, int 
9310: 69 43 65 6c 6c 29 7b 0a 20 20 72 65 74 75 72 6e  iCell){.  return
9320: 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61   cellSizePtr(pPa
9330: 67 65 2c 20 66 69 6e 64 43 65 6c 6c 28 70 50 61  ge, findCell(pPa
9340: 67 65 2c 20 69 43 65 6c 6c 29 29 3b 0a 7d 0a 23  ge, iCell));.}.#
9350: 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53  endif..#ifndef S
9360: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
9370: 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 49 66 20 74  ACUUM./*.** If t
9380: 68 65 20 63 65 6c 6c 20 70 43 65 6c 6c 2c 20 70  he cell pCell, p
9390: 61 72 74 20 6f 66 20 70 61 67 65 20 70 50 61 67  art of page pPag
93a0: 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69  e contains a poi
93b0: 6e 74 65 72 0a 2a 2a 20 74 6f 20 61 6e 20 6f 76  nter.** to an ov
93c0: 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 69 6e 73  erflow page, ins
93d0: 65 72 74 20 61 6e 20 65 6e 74 72 79 20 69 6e 74  ert an entry int
93e0: 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61  o the pointer-ma
93f0: 70 0a 2a 2a 20 66 6f 72 20 74 68 65 20 6f 76 65  p.** for the ove
9400: 72 66 6c 6f 77 20 70 61 67 65 2e 0a 2a 2f 0a 73  rflow page..*/.s
9410: 74 61 74 69 63 20 76 6f 69 64 20 70 74 72 6d 61  tatic void ptrma
9420: 70 50 75 74 4f 76 66 6c 50 74 72 28 4d 65 6d 50  pPutOvflPtr(MemP
9430: 61 67 65 20 2a 70 50 61 67 65 2c 20 75 38 20 2a  age *pPage, u8 *
9440: 70 43 65 6c 6c 2c 20 69 6e 74 20 2a 70 52 43 29  pCell, int *pRC)
9450: 7b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66  {.  CellInfo inf
9460: 6f 3b 0a 20 20 69 66 28 20 2a 70 52 43 20 29 20  o;.  if( *pRC ) 
9470: 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74  return;.  assert
9480: 28 20 70 43 65 6c 6c 21 3d 30 20 29 3b 0a 20 20  ( pCell!=0 );.  
9490: 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  btreeParseCellPt
94a0: 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20  r(pPage, pCell, 
94b0: 26 69 6e 66 6f 29 3b 0a 20 20 69 66 28 20 69 6e  &info);.  if( in
94c0: 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 20 29 7b 0a  fo.iOverflow ){.
94d0: 20 20 20 20 50 67 6e 6f 20 6f 76 66 6c 20 3d 20      Pgno ovfl = 
94e0: 67 65 74 34 62 79 74 65 28 26 70 43 65 6c 6c 5b  get4byte(&pCell[
94f0: 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29  info.iOverflow])
9500: 3b 0a 20 20 20 20 70 74 72 6d 61 70 50 75 74 28  ;.    ptrmapPut(
9510: 70 50 61 67 65 2d 3e 70 42 74 2c 20 6f 76 66 6c  pPage->pBt, ovfl
9520: 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  , PTRMAP_OVERFLO
9530: 57 31 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c  W1, pPage->pgno,
9540: 20 70 52 43 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e   pRC);.  }.}.#en
9550: 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 72  dif.../*.** Defr
9560: 61 67 6d 65 6e 74 20 74 68 65 20 70 61 67 65 20  agment the page 
9570: 67 69 76 65 6e 2e 20 20 41 6c 6c 20 43 65 6c 6c  given.  All Cell
9580: 73 20 61 72 65 20 6d 6f 76 65 64 20 74 6f 20 74  s are moved to t
9590: 68 65 0a 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65  he.** end of the
95a0: 20 70 61 67 65 20 61 6e 64 20 61 6c 6c 20 66 72   page and all fr
95b0: 65 65 20 73 70 61 63 65 20 69 73 20 63 6f 6c 6c  ee space is coll
95c0: 65 63 74 65 64 20 69 6e 74 6f 20 6f 6e 65 0a 2a  ected into one.*
95d0: 2a 20 62 69 67 20 46 72 65 65 42 6c 6b 20 74 68  * big FreeBlk th
95e0: 61 74 20 6f 63 63 75 72 73 20 69 6e 20 62 65 74  at occurs in bet
95f0: 77 65 65 6e 20 74 68 65 20 68 65 61 64 65 72 20  ween the header 
9600: 61 6e 64 20 63 65 6c 6c 0a 2a 2a 20 70 6f 69 6e  and cell.** poin
9610: 74 65 72 20 61 72 72 61 79 20 61 6e 64 20 74 68  ter array and th
9620: 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61  e cell content a
9630: 72 65 61 2e 0a 2a 2a 0a 2a 2a 20 45 56 49 44 45  rea..**.** EVIDE
9640: 4e 43 45 2d 4f 46 3a 20 52 2d 34 34 35 38 32 2d  NCE-OF: R-44582-
9650: 36 30 31 33 38 20 53 51 4c 69 74 65 20 6d 61 79  60138 SQLite may
9660: 20 66 72 6f 6d 20 74 69 6d 65 20 74 6f 20 74 69   from time to ti
9670: 6d 65 20 72 65 6f 72 67 61 6e 69 7a 65 20 61 0a  me reorganize a.
9680: 2a 2a 20 62 2d 74 72 65 65 20 70 61 67 65 20 73  ** b-tree page s
9690: 6f 20 74 68 61 74 20 74 68 65 72 65 20 61 72 65  o that there are
96a0: 20 6e 6f 20 66 72 65 65 62 6c 6f 63 6b 73 20 6f   no freeblocks o
96b0: 72 20 66 72 61 67 6d 65 6e 74 20 62 79 74 65 73  r fragment bytes
96c0: 2c 20 61 6c 6c 0a 2a 2a 20 75 6e 75 73 65 64 20  , all.** unused 
96d0: 62 79 74 65 73 20 61 72 65 20 63 6f 6e 74 61 69  bytes are contai
96e0: 6e 65 64 20 69 6e 20 74 68 65 20 75 6e 61 6c 6c  ned in the unall
96f0: 6f 63 61 74 65 64 20 73 70 61 63 65 20 72 65 67  ocated space reg
9700: 69 6f 6e 2c 20 61 6e 64 20 61 6c 6c 0a 2a 2a 20  ion, and all.** 
9710: 63 65 6c 6c 73 20 61 72 65 20 70 61 63 6b 65 64  cells are packed
9720: 20 74 69 67 68 74 6c 79 20 61 74 20 74 68 65 20   tightly at the 
9730: 65 6e 64 20 6f 66 20 74 68 65 20 70 61 67 65 2e  end of the page.
9740: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64  .*/.static int d
9750: 65 66 72 61 67 6d 65 6e 74 50 61 67 65 28 4d 65  efragmentPage(Me
9760: 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20  mPage *pPage){. 
9770: 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
9780: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
9790: 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
97a0: 20 69 6e 74 20 70 63 3b 20 20 20 20 20 20 20 20   int pc;        
97b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
97c0: 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 69 2d  ddress of the i-
97d0: 74 68 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74  th cell */.  int
97e0: 20 68 64 72 3b 20 20 20 20 20 20 20 20 20 20 20   hdr;           
97f0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
9800: 74 20 74 6f 20 74 68 65 20 70 61 67 65 20 68 65  t to the page he
9810: 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 73 69  ader */.  int si
9820: 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
9830: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
9840: 61 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20  a cell */.  int 
9850: 75 73 61 62 6c 65 53 69 7a 65 3b 20 20 20 20 20  usableSize;     
9860: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
9870: 20 6f 66 20 75 73 61 62 6c 65 20 62 79 74 65 73   of usable bytes
9880: 20 6f 6e 20 61 20 70 61 67 65 20 2a 2f 0a 20 20   on a page */.  
9890: 69 6e 74 20 63 65 6c 6c 4f 66 66 73 65 74 3b 20  int cellOffset; 
98a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66             /* Of
98b0: 66 73 65 74 20 74 6f 20 74 68 65 20 63 65 6c 6c  fset to the cell
98c0: 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79 20 2a   pointer array *
98d0: 2f 0a 20 20 69 6e 74 20 63 62 72 6b 3b 20 20 20  /.  int cbrk;   
98e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
98f0: 2a 20 4f 66 66 73 65 74 20 74 6f 20 74 68 65 20  * Offset to the 
9900: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65  cell content are
9910: 61 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c  a */.  int nCell
9920: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
9930: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
9940: 65 6c 6c 73 20 6f 6e 20 74 68 65 20 70 61 67 65  ells on the page
9950: 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
9960: 68 61 72 20 2a 64 61 74 61 3b 20 20 20 20 20 20  har *data;      
9970: 20 2f 2a 20 54 68 65 20 70 61 67 65 20 64 61 74   /* The page dat
9980: 61 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  a */.  unsigned 
9990: 63 68 61 72 20 2a 74 65 6d 70 3b 20 20 20 20 20  char *temp;     
99a0: 20 20 2f 2a 20 54 65 6d 70 20 61 72 65 61 20 66    /* Temp area f
99b0: 6f 72 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  or cell content 
99c0: 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
99d0: 61 72 20 2a 73 72 63 3b 20 20 20 20 20 20 20 20  ar *src;        
99e0: 2f 2a 20 53 6f 75 72 63 65 20 6f 66 20 63 6f 6e  /* Source of con
99f0: 74 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69 43  tent */.  int iC
9a00: 65 6c 6c 46 69 72 73 74 3b 20 20 20 20 20 20 20  ellFirst;       
9a10: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 6c       /* First al
9a20: 6c 6f 77 61 62 6c 65 20 63 65 6c 6c 20 69 6e 64  lowable cell ind
9a30: 65 78 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c  ex */.  int iCel
9a40: 6c 4c 61 73 74 3b 20 20 20 20 20 20 20 20 20 20  lLast;          
9a50: 20 20 20 2f 2a 20 4c 61 73 74 20 70 6f 73 73 69     /* Last possi
9a60: 62 6c 65 20 63 65 6c 6c 20 69 6e 64 65 78 20 2a  ble cell index *
9a70: 2f 0a 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  /...  assert( sq
9a80: 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
9a90: 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
9aa0: 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72  Page) );.  asser
9ab0: 74 28 20 70 50 61 67 65 2d 3e 70 42 74 21 3d 30  t( pPage->pBt!=0
9ac0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
9ad0: 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
9ae0: 53 69 7a 65 20 3c 3d 20 53 51 4c 49 54 45 5f 4d  Size <= SQLITE_M
9af0: 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 29 3b 0a  AX_PAGE_SIZE );.
9b00: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
9b10: 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b  >nOverflow==0 );
9b20: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
9b30: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
9b40: 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
9b50: 20 29 3b 0a 20 20 74 65 6d 70 20 3d 20 30 3b 0a   );.  temp = 0;.
9b60: 20 20 73 72 63 20 3d 20 64 61 74 61 20 3d 20 70    src = data = p
9b70: 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 68  Page->aData;.  h
9b80: 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f  dr = pPage->hdrO
9b90: 66 66 73 65 74 3b 0a 20 20 63 65 6c 6c 4f 66 66  ffset;.  cellOff
9ba0: 73 65 74 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c  set = pPage->cel
9bb0: 6c 4f 66 66 73 65 74 3b 0a 20 20 6e 43 65 6c 6c  lOffset;.  nCell
9bc0: 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b   = pPage->nCell;
9bd0: 0a 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c  .  assert( nCell
9be0: 3d 3d 67 65 74 32 62 79 74 65 28 26 64 61 74 61  ==get2byte(&data
9bf0: 5b 68 64 72 2b 33 5d 29 20 29 3b 0a 20 20 75 73  [hdr+3]) );.  us
9c00: 61 62 6c 65 53 69 7a 65 20 3d 20 70 50 61 67 65  ableSize = pPage
9c10: 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
9c20: 65 3b 0a 20 20 63 62 72 6b 20 3d 20 75 73 61 62  e;.  cbrk = usab
9c30: 6c 65 53 69 7a 65 3b 0a 20 20 69 43 65 6c 6c 46  leSize;.  iCellF
9c40: 69 72 73 74 20 3d 20 63 65 6c 6c 4f 66 66 73 65  irst = cellOffse
9c50: 74 20 2b 20 32 2a 6e 43 65 6c 6c 3b 0a 20 20 69  t + 2*nCell;.  i
9c60: 43 65 6c 6c 4c 61 73 74 20 3d 20 75 73 61 62 6c  CellLast = usabl
9c70: 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20 66 6f 72  eSize - 4;.  for
9c80: 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69  (i=0; i<nCell; i
9c90: 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70 41 64  ++){.    u8 *pAd
9ca0: 64 72 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 69  dr;     /* The i
9cb0: 2d 74 68 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  -th cell pointer
9cc0: 20 2a 2f 0a 20 20 20 20 70 41 64 64 72 20 3d 20   */.    pAddr = 
9cd0: 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74  &data[cellOffset
9ce0: 20 2b 20 69 2a 32 5d 3b 0a 20 20 20 20 70 63 20   + i*2];.    pc 
9cf0: 3d 20 67 65 74 32 62 79 74 65 28 70 41 64 64 72  = get2byte(pAddr
9d00: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
9d10: 20 70 63 3d 3d 69 43 65 6c 6c 46 69 72 73 74 20   pc==iCellFirst 
9d20: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
9d30: 20 70 63 3d 3d 69 43 65 6c 6c 4c 61 73 74 20 29   pc==iCellLast )
9d40: 3b 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ;.#if !defined(S
9d50: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4f 56 45  QLITE_ENABLE_OVE
9d60: 52 53 49 5a 45 5f 43 45 4c 4c 5f 43 48 45 43 4b  RSIZE_CELL_CHECK
9d70: 29 0a 20 20 20 20 2f 2a 20 54 68 65 73 65 20 63  ).    /* These c
9d80: 6f 6e 64 69 74 69 6f 6e 73 20 68 61 76 65 20 61  onditions have a
9d90: 6c 72 65 61 64 79 20 62 65 65 6e 20 76 65 72 69  lready been veri
9da0: 66 69 65 64 20 69 6e 20 62 74 72 65 65 49 6e 69  fied in btreeIni
9db0: 74 50 61 67 65 28 29 0a 20 20 20 20 2a 2a 20 69  tPage().    ** i
9dc0: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
9dd0: 4f 56 45 52 53 49 5a 45 5f 43 45 4c 4c 5f 43 48  OVERSIZE_CELL_CH
9de0: 45 43 4b 20 69 73 20 64 65 66 69 6e 65 64 20 0a  ECK is defined .
9df0: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
9e00: 63 3c 69 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20  c<iCellFirst || 
9e10: 70 63 3e 69 43 65 6c 6c 4c 61 73 74 20 29 7b 0a  pc>iCellLast ){.
9e20: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
9e30: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
9e40: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
9e50: 20 20 20 61 73 73 65 72 74 28 20 70 63 3e 3d 69     assert( pc>=i
9e60: 43 65 6c 6c 46 69 72 73 74 20 26 26 20 70 63 3c  CellFirst && pc<
9e70: 3d 69 43 65 6c 6c 4c 61 73 74 20 29 3b 0a 20 20  =iCellLast );.  
9e80: 20 20 73 69 7a 65 20 3d 20 63 65 6c 6c 53 69 7a    size = cellSiz
9e90: 65 50 74 72 28 70 50 61 67 65 2c 20 26 73 72 63  ePtr(pPage, &src
9ea0: 5b 70 63 5d 29 3b 0a 20 20 20 20 63 62 72 6b 20  [pc]);.    cbrk 
9eb0: 2d 3d 20 73 69 7a 65 3b 0a 23 69 66 20 64 65 66  -= size;.#if def
9ec0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
9ed0: 4c 45 5f 4f 56 45 52 53 49 5a 45 5f 43 45 4c 4c  LE_OVERSIZE_CELL
9ee0: 5f 43 48 45 43 4b 29 0a 20 20 20 20 69 66 28 20  _CHECK).    if( 
9ef0: 63 62 72 6b 3c 69 43 65 6c 6c 46 69 72 73 74 20  cbrk<iCellFirst 
9f00: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
9f10: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
9f20: 4b 50 54 3b 0a 20 20 20 20 7d 0a 23 65 6c 73 65  KPT;.    }.#else
9f30: 0a 20 20 20 20 69 66 28 20 63 62 72 6b 3c 69 43  .    if( cbrk<iC
9f40: 65 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63 2b 73  ellFirst || pc+s
9f50: 69 7a 65 3e 75 73 61 62 6c 65 53 69 7a 65 20 29  ize>usableSize )
9f60: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
9f70: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
9f80: 50 54 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  PT;.    }.#endif
9f90: 0a 20 20 20 20 61 73 73 65 72 74 28 20 63 62 72  .    assert( cbr
9fa0: 6b 2b 73 69 7a 65 3c 3d 75 73 61 62 6c 65 53 69  k+size<=usableSi
9fb0: 7a 65 20 26 26 20 63 62 72 6b 3e 3d 69 43 65 6c  ze && cbrk>=iCel
9fc0: 6c 46 69 72 73 74 20 29 3b 0a 20 20 20 20 74 65  lFirst );.    te
9fd0: 73 74 63 61 73 65 28 20 63 62 72 6b 2b 73 69 7a  stcase( cbrk+siz
9fe0: 65 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20 29 3b  e==usableSize );
9ff0: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
a000: 63 2b 73 69 7a 65 3d 3d 75 73 61 62 6c 65 53 69  c+size==usableSi
a010: 7a 65 20 29 3b 0a 20 20 20 20 70 75 74 32 62 79  ze );.    put2by
a020: 74 65 28 70 41 64 64 72 2c 20 63 62 72 6b 29 3b  te(pAddr, cbrk);
a030: 0a 20 20 20 20 69 66 28 20 74 65 6d 70 3d 3d 30  .    if( temp==0
a040: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 78 3b   ){.      int x;
a050: 0a 20 20 20 20 20 20 69 66 28 20 63 62 72 6b 3d  .      if( cbrk=
a060: 3d 70 63 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  =pc ) continue;.
a070: 20 20 20 20 20 20 74 65 6d 70 20 3d 20 73 71 6c        temp = sql
a080: 69 74 65 33 50 61 67 65 72 54 65 6d 70 53 70 61  ite3PagerTempSpa
a090: 63 65 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70  ce(pPage->pBt->p
a0a0: 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 78 20  Pager);.      x 
a0b0: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
a0c0: 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20 20 20  [hdr+5]);.      
a0d0: 6d 65 6d 63 70 79 28 26 74 65 6d 70 5b 78 5d 2c  memcpy(&temp[x],
a0e0: 20 26 64 61 74 61 5b 78 5d 2c 20 28 63 62 72 6b   &data[x], (cbrk
a0f0: 2b 73 69 7a 65 29 20 2d 20 78 29 3b 0a 20 20 20  +size) - x);.   
a100: 20 20 20 73 72 63 20 3d 20 74 65 6d 70 3b 0a 20     src = temp;. 
a110: 20 20 20 7d 0a 20 20 20 20 6d 65 6d 63 70 79 28     }.    memcpy(
a120: 26 64 61 74 61 5b 63 62 72 6b 5d 2c 20 26 73 72  &data[cbrk], &sr
a130: 63 5b 70 63 5d 2c 20 73 69 7a 65 29 3b 0a 20 20  c[pc], size);.  
a140: 7d 0a 20 20 61 73 73 65 72 74 28 20 63 62 72 6b  }.  assert( cbrk
a150: 3e 3d 69 43 65 6c 6c 46 69 72 73 74 20 29 3b 0a  >=iCellFirst );.
a160: 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
a170: 5b 68 64 72 2b 35 5d 2c 20 63 62 72 6b 29 3b 0a  [hdr+5], cbrk);.
a180: 20 20 64 61 74 61 5b 68 64 72 2b 31 5d 20 3d 20    data[hdr+1] = 
a190: 30 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b 32 5d  0;.  data[hdr+2]
a1a0: 20 3d 20 30 3b 0a 20 20 64 61 74 61 5b 68 64 72   = 0;.  data[hdr
a1b0: 2b 37 5d 20 3d 20 30 3b 0a 20 20 6d 65 6d 73 65  +7] = 0;.  memse
a1c0: 74 28 26 64 61 74 61 5b 69 43 65 6c 6c 46 69 72  t(&data[iCellFir
a1d0: 73 74 5d 2c 20 30 2c 20 63 62 72 6b 2d 69 43 65  st], 0, cbrk-iCe
a1e0: 6c 6c 46 69 72 73 74 29 3b 0a 20 20 61 73 73 65  llFirst);.  asse
a1f0: 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
a200: 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
a210: 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
a220: 20 69 66 28 20 63 62 72 6b 2d 69 43 65 6c 6c 46   if( cbrk-iCellF
a230: 69 72 73 74 21 3d 70 50 61 67 65 2d 3e 6e 46 72  irst!=pPage->nFr
a240: 65 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ee ){.    return
a250: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
a260: 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75  BKPT;.  }.  retu
a270: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
a280: 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63 68 20 74 68  ./*.** Search th
a290: 65 20 66 72 65 65 2d 6c 69 73 74 20 6f 6e 20 70  e free-list on p
a2a0: 61 67 65 20 70 50 67 20 66 6f 72 20 73 70 61 63  age pPg for spac
a2b0: 65 20 74 6f 20 73 74 6f 72 65 20 61 20 63 65 6c  e to store a cel
a2c0: 6c 20 6e 42 79 74 65 20 62 79 74 65 73 20 69 6e  l nByte bytes in
a2d0: 0a 2a 2a 20 73 69 7a 65 2e 20 49 66 20 6f 6e 65  .** size. If one
a2e0: 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 2c 20 72   can be found, r
a2f0: 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
a300: 74 6f 20 74 68 65 20 73 70 61 63 65 20 61 6e 64  to the space and
a310: 20 72 65 6d 6f 76 65 20 69 74 0a 2a 2a 20 66 72   remove it.** fr
a320: 6f 6d 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  om the free-list
a330: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20 73 75  ..**.** If no su
a340: 69 74 61 62 6c 65 20 73 70 61 63 65 20 63 61 6e  itable space can
a350: 20 62 65 20 66 6f 75 6e 64 20 6f 6e 20 74 68 65   be found on the
a360: 20 66 72 65 65 2d 6c 69 73 74 2c 20 72 65 74 75   free-list, retu
a370: 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54  rn NULL..**.** T
a380: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79  his function may
a390: 20 64 65 74 65 63 74 20 63 6f 72 72 75 70 74 69   detect corrupti
a3a0: 6f 6e 20 77 69 74 68 69 6e 20 70 50 67 2e 20 20  on within pPg.  
a3b0: 49 66 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 73  If corruption is
a3c0: 0a 2a 2a 20 64 65 74 65 63 74 65 64 20 74 68 65  .** detected the
a3d0: 6e 20 2a 70 52 63 20 69 73 20 73 65 74 20 74 6f  n *pRc is set to
a3e0: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20   SQLITE_CORRUPT 
a3f0: 61 6e 64 20 4e 55 4c 4c 20 69 73 20 72 65 74 75  and NULL is retu
a400: 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  rned..**.** If a
a410: 20 73 6c 6f 74 20 6f 66 20 61 74 20 6c 65 61 73   slot of at leas
a420: 74 20 6e 42 79 74 65 20 62 79 74 65 73 20 69 73  t nByte bytes is
a430: 20 66 6f 75 6e 64 20 62 75 74 20 63 61 6e 6e 6f   found but canno
a440: 74 20 62 65 20 75 73 65 64 20 62 65 63 61 75 73  t be used becaus
a450: 65 20 0a 2a 2a 20 74 68 65 72 65 20 61 72 65 20  e .** there are 
a460: 61 6c 72 65 61 64 79 20 61 74 20 6c 65 61 73 74  already at least
a470: 20 36 30 20 66 72 61 67 6d 65 6e 74 65 64 20 62   60 fragmented b
a480: 79 74 65 73 20 6f 6e 20 74 68 65 20 70 61 67 65  ytes on the page
a490: 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a  , return NULL..*
a4a0: 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20  * In this case, 
a4b0: 69 66 20 70 62 44 65 66 72 61 67 20 70 61 72 61  if pbDefrag para
a4c0: 6d 65 74 65 72 20 69 73 20 6e 6f 74 20 4e 55 4c  meter is not NUL
a4d0: 4c 2c 20 73 65 74 20 2a 70 62 44 65 66 72 61 67  L, set *pbDefrag
a4e0: 20 74 6f 20 74 72 75 65 2e 0a 2a 2f 0a 73 74 61   to true..*/.sta
a4f0: 74 69 63 20 75 38 20 2a 70 61 67 65 46 69 6e 64  tic u8 *pageFind
a500: 53 6c 6f 74 28 4d 65 6d 50 61 67 65 20 2a 70 50  Slot(MemPage *pP
a510: 67 2c 20 69 6e 74 20 6e 42 79 74 65 2c 20 69 6e  g, int nByte, in
a520: 74 20 2a 70 52 63 2c 20 69 6e 74 20 2a 70 62 44  t *pRc, int *pbD
a530: 65 66 72 61 67 29 7b 0a 20 20 63 6f 6e 73 74 20  efrag){.  const 
a540: 69 6e 74 20 68 64 72 20 3d 20 70 50 67 2d 3e 68  int hdr = pPg->h
a550: 64 72 4f 66 66 73 65 74 3b 0a 20 20 75 38 20 2a  drOffset;.  u8 *
a560: 20 63 6f 6e 73 74 20 61 44 61 74 61 20 3d 20 70   const aData = p
a570: 50 67 2d 3e 61 44 61 74 61 3b 0a 20 20 69 6e 74  Pg->aData;.  int
a580: 20 69 41 64 64 72 3b 0a 20 20 69 6e 74 20 70 63   iAddr;.  int pc
a590: 3b 0a 20 20 69 6e 74 20 75 73 61 62 6c 65 53 69  ;.  int usableSi
a5a0: 7a 65 20 3d 20 70 50 67 2d 3e 70 42 74 2d 3e 75  ze = pPg->pBt->u
a5b0: 73 61 62 6c 65 53 69 7a 65 3b 0a 0a 20 20 66 6f  sableSize;..  fo
a5c0: 72 28 69 41 64 64 72 3d 68 64 72 2b 31 3b 20 28  r(iAddr=hdr+1; (
a5d0: 70 63 20 3d 20 67 65 74 32 62 79 74 65 28 26 61  pc = get2byte(&a
a5e0: 44 61 74 61 5b 69 41 64 64 72 5d 29 29 3e 30 3b  Data[iAddr]))>0;
a5f0: 20 69 41 64 64 72 3d 70 63 29 7b 0a 20 20 20 20   iAddr=pc){.    
a600: 69 6e 74 20 73 69 7a 65 3b 20 20 20 20 20 20 20  int size;       
a610: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
a620: 74 68 65 20 66 72 65 65 20 73 6c 6f 74 20 2a 2f  the free slot */
a630: 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45  .    /* EVIDENCE
a640: 2d 4f 46 3a 20 52 2d 30 36 38 36 36 2d 33 39 31  -OF: R-06866-391
a650: 32 35 20 46 72 65 65 62 6c 6f 63 6b 73 20 61 72  25 Freeblocks ar
a660: 65 20 61 6c 77 61 79 73 20 63 6f 6e 6e 65 63 74  e always connect
a670: 65 64 20 69 6e 20 6f 72 64 65 72 20 6f 66 0a 20  ed in order of. 
a680: 20 20 20 2a 2a 20 69 6e 63 72 65 61 73 69 6e 67     ** increasing
a690: 20 6f 66 66 73 65 74 2e 20 2a 2f 0a 20 20 20 20   offset. */.    
a6a0: 69 66 28 20 70 63 3e 75 73 61 62 6c 65 53 69 7a  if( pc>usableSiz
a6b0: 65 2d 34 20 7c 7c 20 70 63 3c 69 41 64 64 72 2b  e-4 || pc<iAddr+
a6c0: 34 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 63 20  4 ){.      *pRc 
a6d0: 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
a6e0: 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 72 65 74  _BKPT;.      ret
a6f0: 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 0;.    }.   
a700: 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
a710: 20 52 2d 32 32 37 31 30 2d 35 33 33 32 38 20 54   R-22710-53328 T
a720: 68 65 20 74 68 69 72 64 20 61 6e 64 20 66 6f 75  he third and fou
a730: 72 74 68 20 62 79 74 65 73 20 6f 66 20 65 61 63  rth bytes of eac
a740: 68 0a 20 20 20 20 2a 2a 20 66 72 65 65 62 6c 6f  h.    ** freeblo
a750: 63 6b 20 66 6f 72 6d 20 61 20 62 69 67 2d 65 6e  ck form a big-en
a760: 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69  dian integer whi
a770: 63 68 20 69 73 20 74 68 65 20 73 69 7a 65 20 6f  ch is the size o
a780: 66 20 74 68 65 20 66 72 65 65 62 6c 6f 63 6b 0a  f the freeblock.
a790: 20 20 20 20 2a 2a 20 69 6e 20 62 79 74 65 73 2c      ** in bytes,
a7a0: 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 34   including the 4
a7b0: 2d 62 79 74 65 20 68 65 61 64 65 72 2e 20 2a 2f  -byte header. */
a7c0: 0a 20 20 20 20 73 69 7a 65 20 3d 20 67 65 74 32  .    size = get2
a7d0: 62 79 74 65 28 26 61 44 61 74 61 5b 70 63 2b 32  byte(&aData[pc+2
a7e0: 5d 29 3b 0a 20 20 20 20 69 66 28 20 73 69 7a 65  ]);.    if( size
a7f0: 3e 3d 6e 42 79 74 65 20 29 7b 0a 20 20 20 20 20  >=nByte ){.     
a800: 20 69 6e 74 20 78 20 3d 20 73 69 7a 65 20 2d 20   int x = size - 
a810: 6e 42 79 74 65 3b 0a 20 20 20 20 20 20 74 65 73  nByte;.      tes
a820: 74 63 61 73 65 28 20 78 3d 3d 34 20 29 3b 0a 20  tcase( x==4 );. 
a830: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 78       testcase( x
a840: 3d 3d 33 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ==3 );.      if(
a850: 20 78 3c 34 20 29 7b 0a 20 20 20 20 20 20 20 20   x<4 ){.        
a860: 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
a870: 52 2d 31 31 34 39 38 2d 35 38 30 32 32 20 49 6e  R-11498-58022 In
a880: 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 62   a well-formed b
a890: 2d 74 72 65 65 20 70 61 67 65 2c 20 74 68 65 20  -tree page, the 
a8a0: 74 6f 74 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a  total.        **
a8b0: 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
a8c0: 20 69 6e 20 66 72 61 67 6d 65 6e 74 73 20 6d 61   in fragments ma
a8d0: 79 20 6e 6f 74 20 65 78 63 65 65 64 20 36 30 2e  y not exceed 60.
a8e0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
a8f0: 61 44 61 74 61 5b 68 64 72 2b 37 5d 3e 3d 36 30  aData[hdr+7]>=60
a900: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
a910: 28 20 70 62 44 65 66 72 61 67 20 29 20 2a 70 62  ( pbDefrag ) *pb
a920: 44 65 66 72 61 67 20 3d 20 31 3b 0a 20 20 20 20  Defrag = 1;.    
a930: 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
a940: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
a950: 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20    /* Remove the 
a960: 73 6c 6f 74 20 66 72 6f 6d 20 74 68 65 20 66 72  slot from the fr
a970: 65 65 2d 6c 69 73 74 2e 20 55 70 64 61 74 65 20  ee-list. Update 
a980: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20  the number of.  
a990: 20 20 20 20 20 20 2a 2a 20 66 72 61 67 6d 65 6e        ** fragmen
a9a0: 74 65 64 20 62 79 74 65 73 20 77 69 74 68 69 6e  ted bytes within
a9b0: 20 74 68 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20   the page. */.  
a9c0: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 61 44        memcpy(&aD
a9d0: 61 74 61 5b 69 41 64 64 72 5d 2c 20 26 61 44 61  ata[iAddr], &aDa
a9e0: 74 61 5b 70 63 5d 2c 20 32 29 3b 0a 20 20 20 20  ta[pc], 2);.    
a9f0: 20 20 20 20 61 44 61 74 61 5b 68 64 72 2b 37 5d      aData[hdr+7]
aa00: 20 2b 3d 20 28 75 38 29 78 3b 0a 20 20 20 20 20   += (u8)x;.     
aa10: 20 7d 65 6c 73 65 20 69 66 28 20 73 69 7a 65 2b   }else if( size+
aa20: 70 63 20 3e 20 75 73 61 62 6c 65 53 69 7a 65 20  pc > usableSize 
aa30: 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 52 63 20  ){.        *pRc 
aa40: 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
aa50: 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 72  _BKPT;.        r
aa60: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d  eturn 0;.      }
aa70: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
aa80: 20 54 68 65 20 73 6c 6f 74 20 72 65 6d 61 69 6e   The slot remain
aa90: 73 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69  s on the free-li
aaa0: 73 74 2e 20 52 65 64 75 63 65 20 69 74 73 20 73  st. Reduce its s
aab0: 69 7a 65 20 74 6f 20 61 63 63 6f 75 6e 74 0a 20  ize to account. 
aac0: 20 20 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 74          ** for t
aad0: 68 65 20 70 6f 72 74 69 6f 6e 20 75 73 65 64 20  he portion used 
aae0: 62 79 20 74 68 65 20 6e 65 77 20 61 6c 6c 6f 63  by the new alloc
aaf0: 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20 20  ation. */.      
ab00: 20 20 70 75 74 32 62 79 74 65 28 26 61 44 61 74    put2byte(&aDat
ab10: 61 5b 70 63 2b 32 5d 2c 20 78 29 3b 0a 20 20 20  a[pc+2], x);.   
ab20: 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72     }.      retur
ab30: 6e 20 26 61 44 61 74 61 5b 70 63 20 2b 20 78 5d  n &aData[pc + x]
ab40: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  ;.    }.  }..  r
ab50: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
ab60: 2a 20 41 6c 6c 6f 63 61 74 65 20 6e 42 79 74 65  * Allocate nByte
ab70: 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20   bytes of space 
ab80: 66 72 6f 6d 20 77 69 74 68 69 6e 20 74 68 65 20  from within the 
ab90: 42 2d 54 72 65 65 20 70 61 67 65 20 70 61 73 73  B-Tree page pass
aba0: 65 64 0a 2a 2a 20 61 73 20 74 68 65 20 66 69 72  ed.** as the fir
abb0: 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 57 72 69  st argument. Wri
abc0: 74 65 20 69 6e 74 6f 20 2a 70 49 64 78 20 74 68  te into *pIdx th
abd0: 65 20 69 6e 64 65 78 20 69 6e 74 6f 20 70 50 61  e index into pPa
abe0: 67 65 2d 3e 61 44 61 74 61 5b 5d 0a 2a 2a 20 6f  ge->aData[].** o
abf0: 66 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65  f the first byte
ac00: 20 6f 66 20 61 6c 6c 6f 63 61 74 65 64 20 73 70   of allocated sp
ac10: 61 63 65 2e 20 52 65 74 75 72 6e 20 65 69 74 68  ace. Return eith
ac20: 65 72 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 72 0a  er SQLITE_OK or.
ac30: 2a 2a 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  ** an error code
ac40: 20 28 75 73 75 61 6c 6c 79 20 53 51 4c 49 54 45   (usually SQLITE
ac50: 5f 43 4f 52 52 55 50 54 29 2e 0a 2a 2a 0a 2a 2a  _CORRUPT)..**.**
ac60: 20 54 68 65 20 63 61 6c 6c 65 72 20 67 75 61 72   The caller guar
ac70: 61 6e 74 65 65 73 20 74 68 61 74 20 74 68 65 72  antees that ther
ac80: 65 20 69 73 20 73 75 66 66 69 63 69 65 6e 74 20  e is sufficient 
ac90: 73 70 61 63 65 20 74 6f 20 6d 61 6b 65 20 74 68  space to make th
aca0: 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e  e.** allocation.
acb0: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d    This routine m
acc0: 69 67 68 74 20 6e 65 65 64 20 74 6f 20 64 65 66  ight need to def
acd0: 72 61 67 6d 65 6e 74 20 69 6e 20 6f 72 64 65 72  ragment in order
ace0: 20 74 6f 20 62 72 69 6e 67 0a 2a 2a 20 61 6c 6c   to bring.** all
acf0: 20 74 68 65 20 73 70 61 63 65 20 74 6f 67 65 74   the space toget
ad00: 68 65 72 2c 20 68 6f 77 65 76 65 72 2e 20 20 54  her, however.  T
ad10: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
ad20: 20 61 76 6f 69 64 20 75 73 69 6e 67 0a 2a 2a 20   avoid using.** 
ad30: 74 68 65 20 66 69 72 73 74 20 74 77 6f 20 62 79  the first two by
ad40: 74 65 73 20 70 61 73 74 20 74 68 65 20 63 65 6c  tes past the cel
ad50: 6c 20 70 6f 69 6e 74 65 72 20 61 72 65 61 20 73  l pointer area s
ad60: 69 6e 63 65 20 70 72 65 73 75 6d 61 62 6c 79 20  ince presumably 
ad70: 74 68 69 73 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69  this.** allocati
ad80: 6f 6e 20 69 73 20 62 65 69 6e 67 20 6d 61 64 65  on is being made
ad90: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 69 6e 73   in order to ins
ada0: 65 72 74 20 61 20 6e 65 77 20 63 65 6c 6c 2c 20  ert a new cell, 
adb0: 73 6f 20 77 65 20 77 69 6c 6c 0a 2a 2a 20 61 6c  so we will.** al
adc0: 73 6f 20 65 6e 64 20 75 70 20 6e 65 65 64 69 6e  so end up needin
add0: 67 20 61 20 6e 65 77 20 63 65 6c 6c 20 70 6f 69  g a new cell poi
ade0: 6e 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  nter..*/.static 
adf0: 69 6e 74 20 61 6c 6c 6f 63 61 74 65 53 70 61 63  int allocateSpac
ae00: 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  e(MemPage *pPage
ae10: 2c 20 69 6e 74 20 6e 42 79 74 65 2c 20 69 6e 74  , int nByte, int
ae20: 20 2a 70 49 64 78 29 7b 0a 20 20 63 6f 6e 73 74   *pIdx){.  const
ae30: 20 69 6e 74 20 68 64 72 20 3d 20 70 50 61 67 65   int hdr = pPage
ae40: 2d 3e 68 64 72 4f 66 66 73 65 74 3b 20 20 20 20  ->hdrOffset;    
ae50: 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f  /* Local cache o
ae60: 66 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  f pPage->hdrOffs
ae70: 65 74 20 2a 2f 0a 20 20 75 38 20 2a 20 63 6f 6e  et */.  u8 * con
ae80: 73 74 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d  st data = pPage-
ae90: 3e 61 44 61 74 61 3b 20 20 20 20 20 20 2f 2a 20  >aData;      /* 
aea0: 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f 66 20 70  Local cache of p
aeb0: 50 61 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20  Page->aData */. 
aec0: 20 69 6e 74 20 74 6f 70 3b 20 20 20 20 20 20 20   int top;       
aed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aee0: 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62        /* First b
aef0: 79 74 65 20 6f 66 20 63 65 6c 6c 20 63 6f 6e 74  yte of cell cont
af00: 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20 69 6e  ent area */.  in
af10: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
af20: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
af30: 20 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 72 65     /* Integer re
af40: 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69  turn code */.  i
af50: 6e 74 20 67 61 70 3b 20 20 20 20 20 20 20 20 2f  nt gap;        /
af60: 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f 66 20  * First byte of 
af70: 67 61 70 20 62 65 74 77 65 65 6e 20 63 65 6c 6c  gap between cell
af80: 20 70 6f 69 6e 74 65 72 73 20 61 6e 64 20 63 65   pointers and ce
af90: 6c 6c 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20  ll content */.  
afa0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
afb0: 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
afc0: 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
afd0: 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  e) );.  assert( 
afe0: 70 50 61 67 65 2d 3e 70 42 74 20 29 3b 0a 20 20  pPage->pBt );.  
aff0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
b000: 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
b010: 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
b020: 0a 20 20 61 73 73 65 72 74 28 20 6e 42 79 74 65  .  assert( nByte
b030: 3e 3d 30 20 29 3b 20 20 2f 2a 20 4d 69 6e 69 6d  >=0 );  /* Minim
b040: 75 6d 20 63 65 6c 6c 20 73 69 7a 65 20 69 73 20  um cell size is 
b050: 34 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  4 */.  assert( p
b060: 50 61 67 65 2d 3e 6e 46 72 65 65 3e 3d 6e 42 79  Page->nFree>=nBy
b070: 74 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  te );.  assert( 
b080: 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
b090: 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
b0a0: 20 6e 42 79 74 65 20 3c 20 28 69 6e 74 29 28 70   nByte < (int)(p
b0b0: 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
b0c0: 65 53 69 7a 65 2d 38 29 20 29 3b 0a 0a 20 20 61  eSize-8) );..  a
b0d0: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 63 65  ssert( pPage->ce
b0e0: 6c 6c 4f 66 66 73 65 74 20 3d 3d 20 68 64 72 20  llOffset == hdr 
b0f0: 2b 20 31 32 20 2d 20 34 2a 70 50 61 67 65 2d 3e  + 12 - 4*pPage->
b100: 6c 65 61 66 20 29 3b 0a 20 20 67 61 70 20 3d 20  leaf );.  gap = 
b110: 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65  pPage->cellOffse
b120: 74 20 2b 20 32 2a 70 50 61 67 65 2d 3e 6e 43 65  t + 2*pPage->nCe
b130: 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28 20 67 61  ll;.  assert( ga
b140: 70 3c 3d 36 35 35 33 36 20 29 3b 0a 20 20 2f 2a  p<=65536 );.  /*
b150: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
b160: 32 39 33 35 36 2d 30 32 33 39 31 20 49 66 20 74  29356-02391 If t
b170: 68 65 20 64 61 74 61 62 61 73 65 20 75 73 65 73  he database uses
b180: 20 61 20 36 35 35 33 36 2d 62 79 74 65 20 70 61   a 65536-byte pa
b190: 67 65 20 73 69 7a 65 0a 20 20 2a 2a 20 61 6e 64  ge size.  ** and
b1a0: 20 74 68 65 20 72 65 73 65 72 76 65 64 20 73 70   the reserved sp
b1b0: 61 63 65 20 69 73 20 7a 65 72 6f 20 28 74 68 65  ace is zero (the
b1c0: 20 75 73 75 61 6c 20 76 61 6c 75 65 20 66 6f 72   usual value for
b1d0: 20 72 65 73 65 72 76 65 64 20 73 70 61 63 65 29   reserved space)
b1e0: 0a 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 20 63  .  ** then the c
b1f0: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 6f 66 66 73  ell content offs
b200: 65 74 20 6f 66 20 61 6e 20 65 6d 70 74 79 20 70  et of an empty p
b210: 61 67 65 20 77 61 6e 74 73 20 74 6f 20 62 65 20  age wants to be 
b220: 36 35 35 33 36 2e 0a 20 20 2a 2a 20 48 6f 77 65  65536..  ** Howe
b230: 76 65 72 2c 20 74 68 61 74 20 69 6e 74 65 67 65  ver, that intege
b240: 72 20 69 73 20 74 6f 6f 20 6c 61 72 67 65 20 74  r is too large t
b250: 6f 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20 61  o be stored in a
b260: 20 32 2d 62 79 74 65 20 75 6e 73 69 67 6e 65 64   2-byte unsigned
b270: 0a 20 20 2a 2a 20 69 6e 74 65 67 65 72 2c 20 73  .  ** integer, s
b280: 6f 20 61 20 76 61 6c 75 65 20 6f 66 20 30 20 69  o a value of 0 i
b290: 73 20 75 73 65 64 20 69 6e 20 69 74 73 20 70 6c  s used in its pl
b2a0: 61 63 65 2e 20 2a 2f 0a 20 20 74 6f 70 20 3d 20  ace. */.  top = 
b2b0: 67 65 74 32 62 79 74 65 4e 6f 74 5a 65 72 6f 28  get2byteNotZero(
b2c0: 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20  &data[hdr+5]);. 
b2d0: 20 69 66 28 20 67 61 70 3e 74 6f 70 20 29 20 72   if( gap>top ) r
b2e0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
b2f0: 52 55 50 54 5f 42 4b 50 54 3b 0a 0a 20 20 2f 2a  RUPT_BKPT;..  /*
b300: 20 49 66 20 74 68 65 72 65 20 69 73 20 65 6e 6f   If there is eno
b310: 75 67 68 20 73 70 61 63 65 20 62 65 74 77 65 65  ugh space betwee
b320: 6e 20 67 61 70 20 61 6e 64 20 74 6f 70 20 66 6f  n gap and top fo
b330: 72 20 6f 6e 65 20 6d 6f 72 65 20 63 65 6c 6c 20  r one more cell 
b340: 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 61 72 72  pointer.  ** arr
b350: 61 79 20 65 6e 74 72 79 20 6f 66 66 73 65 74 2c  ay entry offset,
b360: 20 61 6e 64 20 69 66 20 74 68 65 20 66 72 65 65   and if the free
b370: 6c 69 73 74 20 69 73 20 6e 6f 74 20 65 6d 70 74  list is not empt
b380: 79 2c 20 74 68 65 6e 20 73 65 61 72 63 68 20 74  y, then search t
b390: 68 65 0a 20 20 2a 2a 20 66 72 65 65 6c 69 73 74  he.  ** freelist
b3a0: 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 20 66   looking for a f
b3b0: 72 65 65 20 73 6c 6f 74 20 62 69 67 20 65 6e 6f  ree slot big eno
b3c0: 75 67 68 20 74 6f 20 73 61 74 69 73 66 79 20 74  ugh to satisfy t
b3d0: 68 65 20 72 65 71 75 65 73 74 2e 0a 20 20 2a 2f  he request..  */
b3e0: 0a 20 20 74 65 73 74 63 61 73 65 28 20 67 61 70  .  testcase( gap
b3f0: 2b 32 3d 3d 74 6f 70 20 29 3b 0a 20 20 74 65 73  +2==top );.  tes
b400: 74 63 61 73 65 28 20 67 61 70 2b 31 3d 3d 74 6f  tcase( gap+1==to
b410: 70 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  p );.  testcase(
b420: 20 67 61 70 3d 3d 74 6f 70 20 29 3b 0a 20 20 69   gap==top );.  i
b430: 66 28 20 67 61 70 2b 32 3c 3d 74 6f 70 20 26 26  f( gap+2<=top &&
b440: 20 28 64 61 74 61 5b 68 64 72 2b 31 5d 20 7c 7c   (data[hdr+1] ||
b450: 20 64 61 74 61 5b 68 64 72 2b 32 5d 29 20 29 7b   data[hdr+2]) ){
b460: 0a 20 20 20 20 69 6e 74 20 62 44 65 66 72 61 67  .    int bDefrag
b470: 20 3d 20 30 3b 0a 20 20 20 20 75 38 20 2a 70 53   = 0;.    u8 *pS
b480: 70 61 63 65 20 3d 20 70 61 67 65 46 69 6e 64 53  pace = pageFindS
b490: 6c 6f 74 28 70 50 61 67 65 2c 20 6e 42 79 74 65  lot(pPage, nByte
b4a0: 2c 20 26 72 63 2c 20 26 62 44 65 66 72 61 67 29  , &rc, &bDefrag)
b4b0: 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  ;.    if( rc ) r
b4c0: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 69 66  eturn rc;.    if
b4d0: 28 20 62 44 65 66 72 61 67 20 29 20 67 6f 74 6f  ( bDefrag ) goto
b4e0: 20 64 65 66 72 61 67 6d 65 6e 74 5f 70 61 67 65   defragment_page
b4f0: 3b 0a 20 20 20 20 69 66 28 20 70 53 70 61 63 65  ;.    if( pSpace
b500: 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
b510: 28 20 70 53 70 61 63 65 3e 3d 64 61 74 61 20 26  ( pSpace>=data &
b520: 26 20 28 70 53 70 61 63 65 20 2d 20 64 61 74 61  & (pSpace - data
b530: 29 3c 36 35 35 33 36 20 29 3b 0a 20 20 20 20 20  )<65536 );.     
b540: 20 2a 70 49 64 78 20 3d 20 28 69 6e 74 29 28 70   *pIdx = (int)(p
b550: 53 70 61 63 65 20 2d 20 64 61 74 61 29 3b 0a 20  Space - data);. 
b560: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
b570: 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d  TE_OK;.    }.  }
b580: 0a 0a 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65  ..  /* The reque
b590: 73 74 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20  st could not be 
b5a0: 66 75 6c 66 69 6c 6c 65 64 20 75 73 69 6e 67 20  fulfilled using 
b5b0: 61 20 66 72 65 65 6c 69 73 74 20 73 6c 6f 74 2e  a freelist slot.
b5c0: 20 20 43 68 65 63 6b 0a 20 20 2a 2a 20 74 6f 20    Check.  ** to 
b5d0: 73 65 65 20 69 66 20 64 65 66 72 61 67 6d 65 6e  see if defragmen
b5e0: 74 61 74 69 6f 6e 20 69 73 20 6e 65 63 65 73 73  tation is necess
b5f0: 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 74 65 73 74  ary..  */.  test
b600: 63 61 73 65 28 20 67 61 70 2b 32 2b 6e 42 79 74  case( gap+2+nByt
b610: 65 3d 3d 74 6f 70 20 29 3b 0a 20 20 69 66 28 20  e==top );.  if( 
b620: 67 61 70 2b 32 2b 6e 42 79 74 65 3e 74 6f 70 20  gap+2+nByte>top 
b630: 29 7b 0a 20 64 65 66 72 61 67 6d 65 6e 74 5f 70  ){. defragment_p
b640: 61 67 65 3a 0a 20 20 20 20 61 73 73 65 72 74 28  age:.    assert(
b650: 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20   pPage->nCell>0 
b660: 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b  || CORRUPT_DB );
b670: 0a 20 20 20 20 72 63 20 3d 20 64 65 66 72 61 67  .    rc = defrag
b680: 6d 65 6e 74 50 61 67 65 28 70 50 61 67 65 29 3b  mentPage(pPage);
b690: 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
b6a0: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 74 6f 70  turn rc;.    top
b6b0: 20 3d 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65   = get2byteNotZe
b6c0: 72 6f 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29  ro(&data[hdr+5])
b6d0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 67 61  ;.    assert( ga
b6e0: 70 2b 6e 42 79 74 65 3c 3d 74 6f 70 20 29 3b 0a  p+nByte<=top );.
b6f0: 20 20 7d 0a 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63    }...  /* Alloc
b700: 61 74 65 20 6d 65 6d 6f 72 79 20 66 72 6f 6d 20  ate memory from 
b710: 74 68 65 20 67 61 70 20 69 6e 20 62 65 74 77 65  the gap in betwe
b720: 65 6e 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e  en the cell poin
b730: 74 65 72 20 61 72 72 61 79 0a 20 20 2a 2a 20 61  ter array.  ** a
b740: 6e 64 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  nd the cell cont
b750: 65 6e 74 20 61 72 65 61 2e 20 20 54 68 65 20 62  ent area.  The b
b760: 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 20 63  treeInitPage() c
b770: 61 6c 6c 20 68 61 73 20 61 6c 72 65 61 64 79 0a  all has already.
b780: 20 20 2a 2a 20 76 61 6c 69 64 61 74 65 64 20 74    ** validated t
b790: 68 65 20 66 72 65 65 6c 69 73 74 2e 20 20 47 69  he freelist.  Gi
b7a0: 76 65 6e 20 74 68 61 74 20 74 68 65 20 66 72 65  ven that the fre
b7b0: 65 6c 69 73 74 20 69 73 20 76 61 6c 69 64 2c 20  elist is valid, 
b7c0: 74 68 65 72 65 0a 20 20 2a 2a 20 69 73 20 6e 6f  there.  ** is no
b7d0: 20 77 61 79 20 74 68 61 74 20 74 68 65 20 61 6c   way that the al
b7e0: 6c 6f 63 61 74 69 6f 6e 20 63 61 6e 20 65 78 74  location can ext
b7f0: 65 6e 64 20 6f 66 66 20 74 68 65 20 65 6e 64 20  end off the end 
b800: 6f 66 20 74 68 65 20 70 61 67 65 2e 0a 20 20 2a  of the page..  *
b810: 2a 20 54 68 65 20 61 73 73 65 72 74 28 29 20 62  * The assert() b
b820: 65 6c 6f 77 20 76 65 72 69 66 69 65 73 20 74 68  elow verifies th
b830: 65 20 70 72 65 76 69 6f 75 73 20 73 65 6e 74 65  e previous sente
b840: 6e 63 65 2e 0a 20 20 2a 2f 0a 20 20 74 6f 70 20  nce..  */.  top 
b850: 2d 3d 20 6e 42 79 74 65 3b 0a 20 20 70 75 74 32  -= nByte;.  put2
b860: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
b870: 5d 2c 20 74 6f 70 29 3b 0a 20 20 61 73 73 65 72  ], top);.  asser
b880: 74 28 20 74 6f 70 2b 6e 42 79 74 65 20 3c 3d 20  t( top+nByte <= 
b890: 28 69 6e 74 29 70 50 61 67 65 2d 3e 70 42 74 2d  (int)pPage->pBt-
b8a0: 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20  >usableSize );. 
b8b0: 20 2a 70 49 64 78 20 3d 20 74 6f 70 3b 0a 20 20   *pIdx = top;.  
b8c0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
b8d0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
b8e0: 6e 20 61 20 73 65 63 74 69 6f 6e 20 6f 66 20 74  n a section of t
b8f0: 68 65 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20  he pPage->aData 
b900: 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e  to the freelist.
b910: 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 62 79  .** The first by
b920: 74 65 20 6f 66 20 74 68 65 20 6e 65 77 20 66 72  te of the new fr
b930: 65 65 20 62 6c 6f 63 6b 20 69 73 20 70 50 61 67  ee block is pPag
b940: 65 2d 3e 61 44 61 74 61 5b 69 53 74 61 72 74 5d  e->aData[iStart]
b950: 0a 2a 2a 20 61 6e 64 20 74 68 65 20 73 69 7a 65  .** and the size
b960: 20 6f 66 20 74 68 65 20 62 6c 6f 63 6b 20 69 73   of the block is
b970: 20 69 53 69 7a 65 20 62 79 74 65 73 2e 0a 2a 2a   iSize bytes..**
b980: 0a 2a 2a 20 41 64 6a 61 63 65 6e 74 20 66 72 65  .** Adjacent fre
b990: 65 62 6c 6f 63 6b 73 20 61 72 65 20 63 6f 61 6c  eblocks are coal
b9a0: 65 73 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74  esced..**.** Not
b9b0: 65 20 74 68 61 74 20 65 76 65 6e 20 74 68 6f 75  e that even thou
b9c0: 67 68 20 74 68 65 20 66 72 65 65 62 6c 6f 63 6b  gh the freeblock
b9d0: 20 6c 69 73 74 20 77 61 73 20 63 68 65 63 6b 65   list was checke
b9e0: 64 20 62 79 20 62 74 72 65 65 49 6e 69 74 50 61  d by btreeInitPa
b9f0: 67 65 28 29 2c 0a 2a 2a 20 74 68 61 74 20 72 6f  ge(),.** that ro
ba00: 75 74 69 6e 65 20 77 69 6c 6c 20 6e 6f 74 20 64  utine will not d
ba10: 65 74 65 63 74 20 6f 76 65 72 6c 61 70 20 62 65  etect overlap be
ba20: 74 77 65 65 6e 20 63 65 6c 6c 73 20 6f 72 20 66  tween cells or f
ba30: 72 65 65 62 6c 6f 63 6b 73 2e 20 20 4e 6f 72 0a  reeblocks.  Nor.
ba40: 2a 2a 20 64 6f 65 73 20 69 74 20 64 65 74 65 63  ** does it detec
ba50: 74 20 63 65 6c 6c 73 20 6f 72 20 66 72 65 65 62  t cells or freeb
ba60: 6c 6f 63 6b 73 20 74 68 61 74 20 65 6e 63 72 6f  locks that encro
ba70: 75 63 68 20 69 6e 74 6f 20 74 68 65 20 72 65 73  uch into the res
ba80: 65 72 76 65 64 20 62 79 74 65 73 0a 2a 2a 20 61  erved bytes.** a
ba90: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
baa0: 20 70 61 67 65 2e 20 20 53 6f 20 64 6f 20 61 64   page.  So do ad
bab0: 64 69 74 69 6f 6e 61 6c 20 63 6f 72 72 75 70 74  ditional corrupt
bac0: 69 6f 6e 20 63 68 65 63 6b 73 20 69 6e 73 69 64  ion checks insid
bad0: 65 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e  e this.** routin
bae0: 65 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c  e and return SQL
baf0: 49 54 45 5f 43 4f 52 52 55 50 54 20 69 66 20 61  ITE_CORRUPT if a
bb00: 6e 79 20 70 72 6f 62 6c 65 6d 73 20 61 72 65 20  ny problems are 
bb10: 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  found..*/.static
bb20: 20 69 6e 74 20 66 72 65 65 53 70 61 63 65 28 4d   int freeSpace(M
bb30: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75  emPage *pPage, u
bb40: 31 36 20 69 53 74 61 72 74 2c 20 75 31 36 20 69  16 iStart, u16 i
bb50: 53 69 7a 65 29 7b 0a 20 20 75 31 36 20 69 50 74  Size){.  u16 iPt
bb60: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
bb70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
bb80: 2a 20 41 64 64 72 65 73 73 20 6f 66 20 70 74 72  * Address of ptr
bb90: 20 74 6f 20 6e 65 78 74 20 66 72 65 65 62 6c 6f   to next freeblo
bba0: 63 6b 20 2a 2f 0a 20 20 75 31 36 20 69 46 72 65  ck */.  u16 iFre
bbb0: 65 42 6c 6b 3b 20 20 20 20 20 20 20 20 20 20 20  eBlk;           
bbc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
bbd0: 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   Address of the 
bbe0: 6e 65 78 74 20 66 72 65 65 62 6c 6f 63 6b 20 2a  next freeblock *
bbf0: 2f 0a 20 20 75 38 20 68 64 72 3b 20 20 20 20 20  /.  u8 hdr;     
bc00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bc10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
bc20: 65 20 68 65 61 64 65 72 20 73 69 7a 65 2e 20 20  e header size.  
bc30: 30 20 6f 72 20 31 30 30 20 2a 2f 0a 20 20 75 38  0 or 100 */.  u8
bc40: 20 6e 46 72 61 67 20 3d 20 30 3b 20 20 20 20 20   nFrag = 0;     
bc50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bc60: 20 20 20 20 2f 2a 20 52 65 64 75 63 74 69 6f 6e      /* Reduction
bc70: 20 69 6e 20 66 72 61 67 6d 65 6e 74 61 74 69 6f   in fragmentatio
bc80: 6e 20 2a 2f 0a 20 20 75 31 36 20 69 4f 72 69 67  n */.  u16 iOrig
bc90: 53 69 7a 65 20 3d 20 69 53 69 7a 65 3b 20 20 20  Size = iSize;   
bca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
bcb0: 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f  Original value o
bcc0: 66 20 69 53 69 7a 65 20 2a 2f 0a 20 20 75 33 32  f iSize */.  u32
bcd0: 20 69 4c 61 73 74 20 3d 20 70 50 61 67 65 2d 3e   iLast = pPage->
bce0: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d  pBt->usableSize-
bcf0: 34 3b 20 2f 2a 20 4c 61 72 67 65 73 74 20 70 6f  4; /* Largest po
bd00: 73 73 69 62 6c 65 20 66 72 65 65 62 6c 6f 63 6b  ssible freeblock
bd10: 20 6f 66 66 73 65 74 20 2a 2f 0a 20 20 75 33 32   offset */.  u32
bd20: 20 69 45 6e 64 20 3d 20 69 53 74 61 72 74 20 2b   iEnd = iStart +
bd30: 20 69 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20   iSize;         
bd40: 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65     /* First byte
bd50: 20 70 61 73 74 20 74 68 65 20 69 53 74 61 72 74   past the iStart
bd60: 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 75 6e 73   buffer */.  uns
bd70: 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61  igned char *data
bd80: 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b   = pPage->aData;
bd90: 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 65     /* Page conte
bda0: 6e 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  nt */..  assert(
bdb0: 20 70 50 61 67 65 2d 3e 70 42 74 21 3d 30 20 29   pPage->pBt!=0 )
bdc0: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
bdd0: 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
bde0: 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
bdf0: 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ge) );.  assert(
be00: 20 69 53 74 61 72 74 3e 3d 70 50 61 67 65 2d 3e   iStart>=pPage->
be10: 68 64 72 4f 66 66 73 65 74 2b 36 2b 70 50 61 67  hdrOffset+6+pPag
be20: 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 20  e->childPtrSize 
be30: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43 4f 52  );.  assert( COR
be40: 52 55 50 54 5f 44 42 20 7c 7c 20 69 45 6e 64 20  RUPT_DB || iEnd 
be50: 3c 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75  <= pPage->pBt->u
be60: 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 61  sableSize );.  a
be70: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
be80: 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
be90: 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
bea0: 20 20 61 73 73 65 72 74 28 20 69 53 69 7a 65 3e    assert( iSize>
beb0: 3d 34 20 29 3b 20 20 20 2f 2a 20 4d 69 6e 69 6d  =4 );   /* Minim
bec0: 75 6d 20 63 65 6c 6c 20 73 69 7a 65 20 69 73 20  um cell size is 
bed0: 34 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69  4 */.  assert( i
bee0: 53 74 61 72 74 3c 3d 69 4c 61 73 74 20 29 3b 0a  Start<=iLast );.
bef0: 0a 20 20 2f 2a 20 4f 76 65 72 77 72 69 74 65 20  .  /* Overwrite 
bf00: 64 65 6c 65 74 65 64 20 69 6e 66 6f 72 6d 61 74  deleted informat
bf10: 69 6f 6e 20 77 69 74 68 20 7a 65 72 6f 73 20 77  ion with zeros w
bf20: 68 65 6e 20 74 68 65 20 73 65 63 75 72 65 5f 64  hen the secure_d
bf30: 65 6c 65 74 65 0a 20 20 2a 2a 20 6f 70 74 69 6f  elete.  ** optio
bf40: 6e 20 69 73 20 65 6e 61 62 6c 65 64 20 2a 2f 0a  n is enabled */.
bf50: 20 20 69 66 28 20 70 50 61 67 65 2d 3e 70 42 74    if( pPage->pBt
bf60: 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53  ->btsFlags & BTS
bf70: 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 20 29  _SECURE_DELETE )
bf80: 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 64 61  {.    memset(&da
bf90: 74 61 5b 69 53 74 61 72 74 5d 2c 20 30 2c 20 69  ta[iStart], 0, i
bfa0: 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Size);.  }..  /*
bfb0: 20 54 68 65 20 6c 69 73 74 20 6f 66 20 66 72 65   The list of fre
bfc0: 65 62 6c 6f 63 6b 73 20 6d 75 73 74 20 62 65 20  eblocks must be 
bfd0: 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64  in ascending ord
bfe0: 65 72 2e 20 20 46 69 6e 64 20 74 68 65 20 0a 20  er.  Find the . 
bff0: 20 2a 2a 20 73 70 6f 74 20 6f 6e 20 74 68 65 20   ** spot on the 
c000: 6c 69 73 74 20 77 68 65 72 65 20 69 53 74 61 72  list where iStar
c010: 74 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 73 65  t should be inse
c020: 72 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 68 64 72  rted..  */.  hdr
c030: 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66   = pPage->hdrOff
c040: 73 65 74 3b 0a 20 20 69 50 74 72 20 3d 20 68 64  set;.  iPtr = hd
c050: 72 20 2b 20 31 3b 0a 20 20 69 66 28 20 64 61 74  r + 1;.  if( dat
c060: 61 5b 69 50 74 72 2b 31 5d 3d 3d 30 20 26 26 20  a[iPtr+1]==0 && 
c070: 64 61 74 61 5b 69 50 74 72 5d 3d 3d 30 20 29 7b  data[iPtr]==0 ){
c080: 0a 20 20 20 20 69 46 72 65 65 42 6c 6b 20 3d 20  .    iFreeBlk = 
c090: 30 3b 20 20 2f 2a 20 53 68 6f 72 74 63 75 74 20  0;  /* Shortcut 
c0a0: 66 6f 72 20 74 68 65 20 63 61 73 65 20 77 68 65  for the case whe
c0b0: 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 69  n the freelist i
c0c0: 73 20 65 6d 70 74 79 20 2a 2f 0a 20 20 7d 65 6c  s empty */.  }el
c0d0: 73 65 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 28  se{.    while( (
c0e0: 69 46 72 65 65 42 6c 6b 20 3d 20 67 65 74 32 62  iFreeBlk = get2b
c0f0: 79 74 65 28 26 64 61 74 61 5b 69 50 74 72 5d 29  yte(&data[iPtr])
c100: 29 3e 30 20 26 26 20 69 46 72 65 65 42 6c 6b 3c  )>0 && iFreeBlk<
c110: 69 53 74 61 72 74 20 29 7b 0a 20 20 20 20 20 20  iStart ){.      
c120: 69 66 28 20 69 46 72 65 65 42 6c 6b 3c 69 50 74  if( iFreeBlk<iPt
c130: 72 2b 34 20 29 20 72 65 74 75 72 6e 20 53 51 4c  r+4 ) return SQL
c140: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
c150: 3b 0a 20 20 20 20 20 20 69 50 74 72 20 3d 20 69  ;.      iPtr = i
c160: 46 72 65 65 42 6c 6b 3b 0a 20 20 20 20 7d 0a 20  FreeBlk;.    }. 
c170: 20 20 20 69 66 28 20 69 46 72 65 65 42 6c 6b 3e     if( iFreeBlk>
c180: 69 4c 61 73 74 20 29 20 72 65 74 75 72 6e 20 53  iLast ) return S
c190: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
c1a0: 50 54 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  PT;.    assert( 
c1b0: 69 46 72 65 65 42 6c 6b 3e 69 50 74 72 20 7c 7c  iFreeBlk>iPtr ||
c1c0: 20 69 46 72 65 65 42 6c 6b 3d 3d 30 20 29 3b 0a   iFreeBlk==0 );.
c1d0: 20 20 0a 20 20 20 20 2f 2a 20 41 74 20 74 68 69    .    /* At thi
c1e0: 73 20 70 6f 69 6e 74 3a 0a 20 20 20 20 2a 2a 20  s point:.    ** 
c1f0: 20 20 20 69 46 72 65 65 42 6c 6b 3a 20 20 20 46     iFreeBlk:   F
c200: 69 72 73 74 20 66 72 65 65 62 6c 6f 63 6b 20 61  irst freeblock a
c210: 66 74 65 72 20 69 53 74 61 72 74 2c 20 6f 72 20  fter iStart, or 
c220: 7a 65 72 6f 20 69 66 20 6e 6f 6e 65 0a 20 20 20  zero if none.   
c230: 20 2a 2a 20 20 20 20 69 50 74 72 3a 20 20 20 20   **    iPtr:    
c240: 20 20 20 54 68 65 20 61 64 64 72 65 73 73 20 6f     The address o
c250: 66 20 61 20 70 6f 69 6e 74 65 72 20 69 46 72 65  f a pointer iFre
c260: 65 42 6c 6b 0a 20 20 20 20 2a 2a 0a 20 20 20 20  eBlk.    **.    
c270: 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  ** Check to see 
c280: 69 66 20 69 46 72 65 65 42 6c 6b 20 73 68 6f 75  if iFreeBlk shou
c290: 6c 64 20 62 65 20 63 6f 61 6c 65 73 63 65 64 20  ld be coalesced 
c2a0: 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  onto the end of 
c2b0: 69 53 74 61 72 74 2e 0a 20 20 20 20 2a 2f 0a 20  iStart..    */. 
c2c0: 20 20 20 69 66 28 20 69 46 72 65 65 42 6c 6b 20     if( iFreeBlk 
c2d0: 26 26 20 69 45 6e 64 2b 33 3e 3d 69 46 72 65 65  && iEnd+3>=iFree
c2e0: 42 6c 6b 20 29 7b 0a 20 20 20 20 20 20 6e 46 72  Blk ){.      nFr
c2f0: 61 67 20 3d 20 69 46 72 65 65 42 6c 6b 20 2d 20  ag = iFreeBlk - 
c300: 69 45 6e 64 3b 0a 20 20 20 20 20 20 69 66 28 20  iEnd;.      if( 
c310: 69 45 6e 64 3e 69 46 72 65 65 42 6c 6b 20 29 20  iEnd>iFreeBlk ) 
c320: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
c330: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
c340: 20 20 69 45 6e 64 20 3d 20 69 46 72 65 65 42 6c    iEnd = iFreeBl
c350: 6b 20 2b 20 67 65 74 32 62 79 74 65 28 26 64 61  k + get2byte(&da
c360: 74 61 5b 69 46 72 65 65 42 6c 6b 2b 32 5d 29 3b  ta[iFreeBlk+2]);
c370: 0a 20 20 20 20 20 20 69 53 69 7a 65 20 3d 20 69  .      iSize = i
c380: 45 6e 64 20 2d 20 69 53 74 61 72 74 3b 0a 20 20  End - iStart;.  
c390: 20 20 20 20 69 46 72 65 65 42 6c 6b 20 3d 20 67      iFreeBlk = g
c3a0: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 46  et2byte(&data[iF
c3b0: 72 65 65 42 6c 6b 5d 29 3b 0a 20 20 20 20 7d 0a  reeBlk]);.    }.
c3c0: 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 69 50 74    .    /* If iPt
c3d0: 72 20 69 73 20 61 6e 6f 74 68 65 72 20 66 72 65  r is another fre
c3e0: 65 62 6c 6f 63 6b 20 28 74 68 61 74 20 69 73 2c  eblock (that is,
c3f0: 20 69 66 20 69 50 74 72 20 69 73 20 6e 6f 74 20   if iPtr is not 
c400: 74 68 65 20 66 72 65 65 6c 69 73 74 0a 20 20 20  the freelist.   
c410: 20 2a 2a 20 70 6f 69 6e 74 65 72 20 69 6e 20 74   ** pointer in t
c420: 68 65 20 70 61 67 65 20 68 65 61 64 65 72 29 20  he page header) 
c430: 74 68 65 6e 20 63 68 65 63 6b 20 74 6f 20 73 65  then check to se
c440: 65 20 69 66 20 69 53 74 61 72 74 20 73 68 6f 75  e if iStart shou
c450: 6c 64 20 62 65 0a 20 20 20 20 2a 2a 20 63 6f 61  ld be.    ** coa
c460: 6c 65 73 63 65 64 20 6f 6e 74 6f 20 74 68 65 20  lesced onto the 
c470: 65 6e 64 20 6f 66 20 69 50 74 72 2e 0a 20 20 20  end of iPtr..   
c480: 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 50 74 72   */.    if( iPtr
c490: 3e 68 64 72 2b 31 20 29 7b 0a 20 20 20 20 20 20  >hdr+1 ){.      
c4a0: 69 6e 74 20 69 50 74 72 45 6e 64 20 3d 20 69 50  int iPtrEnd = iP
c4b0: 74 72 20 2b 20 67 65 74 32 62 79 74 65 28 26 64  tr + get2byte(&d
c4c0: 61 74 61 5b 69 50 74 72 2b 32 5d 29 3b 0a 20 20  ata[iPtr+2]);.  
c4d0: 20 20 20 20 69 66 28 20 69 50 74 72 45 6e 64 2b      if( iPtrEnd+
c4e0: 33 3e 3d 69 53 74 61 72 74 20 29 7b 0a 20 20 20  3>=iStart ){.   
c4f0: 20 20 20 20 20 69 66 28 20 69 50 74 72 45 6e 64       if( iPtrEnd
c500: 3e 69 53 74 61 72 74 20 29 20 72 65 74 75 72 6e  >iStart ) return
c510: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
c520: 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 6e 46  BKPT;.        nF
c530: 72 61 67 20 2b 3d 20 69 53 74 61 72 74 20 2d 20  rag += iStart - 
c540: 69 50 74 72 45 6e 64 3b 0a 20 20 20 20 20 20 20  iPtrEnd;.       
c550: 20 69 53 69 7a 65 20 3d 20 69 45 6e 64 20 2d 20   iSize = iEnd - 
c560: 69 50 74 72 3b 0a 20 20 20 20 20 20 20 20 69 53  iPtr;.        iS
c570: 74 61 72 74 20 3d 20 69 50 74 72 3b 0a 20 20 20  tart = iPtr;.   
c580: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
c590: 66 28 20 6e 46 72 61 67 3e 64 61 74 61 5b 68 64  f( nFrag>data[hd
c5a0: 72 2b 37 5d 20 29 20 72 65 74 75 72 6e 20 53 51  r+7] ) return SQ
c5b0: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
c5c0: 54 3b 0a 20 20 20 20 64 61 74 61 5b 68 64 72 2b  T;.    data[hdr+
c5d0: 37 5d 20 2d 3d 20 6e 46 72 61 67 3b 0a 20 20 7d  7] -= nFrag;.  }
c5e0: 0a 20 20 69 66 28 20 69 53 74 61 72 74 3d 3d 67  .  if( iStart==g
c5f0: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  et2byte(&data[hd
c600: 72 2b 35 5d 29 20 29 7b 0a 20 20 20 20 2f 2a 20  r+5]) ){.    /* 
c610: 54 68 65 20 6e 65 77 20 66 72 65 65 62 6c 6f 63  The new freebloc
c620: 6b 20 69 73 20 61 74 20 74 68 65 20 62 65 67 69  k is at the begi
c630: 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 63 65 6c  nning of the cel
c640: 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 2c 0a  l content area,.
c650: 20 20 20 20 2a 2a 20 73 6f 20 6a 75 73 74 20 65      ** so just e
c660: 78 74 65 6e 64 20 74 68 65 20 63 65 6c 6c 20 63  xtend the cell c
c670: 6f 6e 74 65 6e 74 20 61 72 65 61 20 72 61 74 68  ontent area rath
c680: 65 72 20 74 68 61 6e 20 63 72 65 61 74 65 20 61  er than create a
c690: 6e 6f 74 68 65 72 0a 20 20 20 20 2a 2a 20 66 72  nother.    ** fr
c6a0: 65 65 6c 69 73 74 20 65 6e 74 72 79 20 2a 2f 0a  eelist entry */.
c6b0: 20 20 20 20 69 66 28 20 69 50 74 72 21 3d 68 64      if( iPtr!=hd
c6c0: 72 2b 31 20 29 20 72 65 74 75 72 6e 20 53 51 4c  r+1 ) return SQL
c6d0: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
c6e0: 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 26  ;.    put2byte(&
c6f0: 64 61 74 61 5b 68 64 72 2b 31 5d 2c 20 69 46 72  data[hdr+1], iFr
c700: 65 65 42 6c 6b 29 3b 0a 20 20 20 20 70 75 74 32  eeBlk);.    put2
c710: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
c720: 5d 2c 20 69 45 6e 64 29 3b 0a 20 20 7d 65 6c 73  ], iEnd);.  }els
c730: 65 7b 0a 20 20 20 20 2f 2a 20 49 6e 73 65 72 74  e{.    /* Insert
c740: 20 74 68 65 20 6e 65 77 20 66 72 65 65 62 6c 6f   the new freeblo
c750: 63 6b 20 69 6e 74 6f 20 74 68 65 20 66 72 65 65  ck into the free
c760: 6c 69 73 74 20 2a 2f 0a 20 20 20 20 70 75 74 32  list */.    put2
c770: 62 79 74 65 28 26 64 61 74 61 5b 69 50 74 72 5d  byte(&data[iPtr]
c780: 2c 20 69 53 74 61 72 74 29 3b 0a 20 20 20 20 70  , iStart);.    p
c790: 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 53  ut2byte(&data[iS
c7a0: 74 61 72 74 5d 2c 20 69 46 72 65 65 42 6c 6b 29  tart], iFreeBlk)
c7b0: 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 26  ;.    put2byte(&
c7c0: 64 61 74 61 5b 69 53 74 61 72 74 2b 32 5d 2c 20  data[iStart+2], 
c7d0: 69 53 69 7a 65 29 3b 0a 20 20 7d 0a 20 20 70 50  iSize);.  }.  pP
c7e0: 61 67 65 2d 3e 6e 46 72 65 65 20 2b 3d 20 69 4f  age->nFree += iO
c7f0: 72 69 67 53 69 7a 65 3b 0a 20 20 72 65 74 75 72  rigSize;.  retur
c800: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
c810: 2f 2a 0a 2a 2a 20 44 65 63 6f 64 65 20 74 68 65  /*.** Decode the
c820: 20 66 6c 61 67 73 20 62 79 74 65 20 28 74 68 65   flags byte (the
c830: 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 74   first byte of t
c840: 68 65 20 68 65 61 64 65 72 29 20 66 6f 72 20 61  he header) for a
c850: 20 70 61 67 65 0a 2a 2a 20 61 6e 64 20 69 6e 69   page.** and ini
c860: 74 69 61 6c 69 7a 65 20 66 69 65 6c 64 73 20 6f  tialize fields o
c870: 66 20 74 68 65 20 4d 65 6d 50 61 67 65 20 73 74  f the MemPage st
c880: 72 75 63 74 75 72 65 20 61 63 63 6f 72 64 69 6e  ructure accordin
c890: 67 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20  gly..**.** Only 
c8a0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f  the following co
c8b0: 6d 62 69 6e 61 74 69 6f 6e 73 20 61 72 65 20 73  mbinations are s
c8c0: 75 70 70 6f 72 74 65 64 2e 20 20 41 6e 79 74 68  upported.  Anyth
c8d0: 69 6e 67 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a  ing different.**
c8e0: 20 69 6e 64 69 63 61 74 65 73 20 61 20 63 6f 72   indicates a cor
c8f0: 72 75 70 74 20 64 61 74 61 62 61 73 65 20 66 69  rupt database fi
c900: 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  les:.**.**      
c910: 20 20 20 50 54 46 5f 5a 45 52 4f 44 41 54 41 0a     PTF_ZERODATA.
c920: 2a 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f 5a  **         PTF_Z
c930: 45 52 4f 44 41 54 41 20 7c 20 50 54 46 5f 4c 45  ERODATA | PTF_LE
c940: 41 46 0a 2a 2a 20 20 20 20 20 20 20 20 20 50 54  AF.**         PT
c950: 46 5f 4c 45 41 46 44 41 54 41 20 7c 20 50 54 46  F_LEAFDATA | PTF
c960: 5f 49 4e 54 4b 45 59 0a 2a 2a 20 20 20 20 20 20  _INTKEY.**      
c970: 20 20 20 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 20 7c 20 50  | PTF_INTKEY | P
c990: 54 46 5f 4c 45 41 46 0a 2a 2f 0a 73 74 61 74 69  TF_LEAF.*/.stati
c9a0: 63 20 69 6e 74 20 64 65 63 6f 64 65 46 6c 61 67  c int decodeFlag
c9b0: 73 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  s(MemPage *pPage
c9c0: 2c 20 69 6e 74 20 66 6c 61 67 42 79 74 65 29 7b  , int flagByte){
c9d0: 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
c9e0: 3b 20 20 20 20 20 2f 2a 20 41 20 63 6f 70 79 20  ;     /* A copy 
c9f0: 6f 66 20 70 50 61 67 65 2d 3e 70 42 74 20 2a 2f  of pPage->pBt */
ca00: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
ca10: 65 2d 3e 68 64 72 4f 66 66 73 65 74 3d 3d 28 70  e->hdrOffset==(p
ca20: 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 31 20 3f 20  Page->pgno==1 ? 
ca30: 31 30 30 20 3a 20 30 29 20 29 3b 0a 20 20 61 73  100 : 0) );.  as
ca40: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
ca50: 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
ca60: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
ca70: 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 3d 20 28   pPage->leaf = (
ca80: 75 38 29 28 66 6c 61 67 42 79 74 65 3e 3e 33 29  u8)(flagByte>>3)
ca90: 3b 20 20 61 73 73 65 72 74 28 20 50 54 46 5f 4c  ;  assert( PTF_L
caa0: 45 41 46 20 3d 3d 20 31 3c 3c 33 20 29 3b 0a 20  EAF == 1<<3 );. 
cab0: 20 66 6c 61 67 42 79 74 65 20 26 3d 20 7e 50 54   flagByte &= ~PT
cac0: 46 5f 4c 45 41 46 3b 0a 20 20 70 50 61 67 65 2d  F_LEAF;.  pPage-
cad0: 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 20 3d 20  >childPtrSize = 
cae0: 34 2d 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66 3b  4-4*pPage->leaf;
caf0: 0a 20 20 70 42 74 20 3d 20 70 50 61 67 65 2d 3e  .  pBt = pPage->
cb00: 70 42 74 3b 0a 20 20 69 66 28 20 66 6c 61 67 42  pBt;.  if( flagB
cb10: 79 74 65 3d 3d 28 50 54 46 5f 4c 45 41 46 44 41  yte==(PTF_LEAFDA
cb20: 54 41 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59 29  TA | PTF_INTKEY)
cb30: 20 29 7b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45   ){.    /* EVIDE
cb40: 4e 43 45 2d 4f 46 3a 20 52 2d 30 33 36 34 30 2d  NCE-OF: R-03640-
cb50: 31 33 34 31 35 20 41 20 76 61 6c 75 65 20 6f 66  13415 A value of
cb60: 20 35 20 6d 65 61 6e 73 20 74 68 65 20 70 61 67   5 means the pag
cb70: 65 20 69 73 20 61 6e 20 69 6e 74 65 72 69 6f 72  e is an interior
cb80: 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 62 2d  .    ** table b-
cb90: 74 72 65 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20  tree page. */.  
cba0: 20 20 61 73 73 65 72 74 28 20 28 50 54 46 5f 4c    assert( (PTF_L
cbb0: 45 41 46 44 41 54 41 7c 50 54 46 5f 49 4e 54 4b  EAFDATA|PTF_INTK
cbc0: 45 59 29 3d 3d 35 20 29 3b 0a 20 20 20 20 2f 2a  EY)==5 );.    /*
cbd0: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
cbe0: 32 30 35 30 31 2d 36 31 37 39 36 20 41 20 76 61  20501-61796 A va
cbf0: 6c 75 65 20 6f 66 20 31 33 20 6d 65 61 6e 73 20  lue of 13 means 
cc00: 74 68 65 20 70 61 67 65 20 69 73 20 61 20 6c 65  the page is a le
cc10: 61 66 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65 20  af.    ** table 
cc20: 62 2d 74 72 65 65 20 70 61 67 65 2e 20 2a 2f 0a  b-tree page. */.
cc30: 20 20 20 20 61 73 73 65 72 74 28 20 28 50 54 46      assert( (PTF
cc40: 5f 4c 45 41 46 44 41 54 41 7c 50 54 46 5f 49 4e  _LEAFDATA|PTF_IN
cc50: 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46 29 3d 3d  TKEY|PTF_LEAF)==
cc60: 31 33 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d  13 );.    pPage-
cc70: 3e 69 6e 74 4b 65 79 20 3d 20 31 3b 0a 20 20 20  >intKey = 1;.   
cc80: 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65   pPage->intKeyLe
cc90: 61 66 20 3d 20 70 50 61 67 65 2d 3e 6c 65 61 66  af = pPage->leaf
cca0: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 6f 50  ;.    pPage->noP
ccb0: 61 79 6c 6f 61 64 20 3d 20 21 70 50 61 67 65 2d  ayload = !pPage-
ccc0: 3e 6c 65 61 66 3b 0a 20 20 20 20 70 50 61 67 65  >leaf;.    pPage
ccd0: 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 42 74  ->maxLocal = pBt
cce0: 2d 3e 6d 61 78 4c 65 61 66 3b 0a 20 20 20 20 70  ->maxLeaf;.    p
ccf0: 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d  Page->minLocal =
cd00: 20 70 42 74 2d 3e 6d 69 6e 4c 65 61 66 3b 0a 20   pBt->minLeaf;. 
cd10: 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67 42   }else if( flagB
cd20: 79 74 65 3d 3d 50 54 46 5f 5a 45 52 4f 44 41 54  yte==PTF_ZERODAT
cd30: 41 20 29 7b 0a 20 20 20 20 2f 2a 20 45 56 49 44  A ){.    /* EVID
cd40: 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 37 32 32 35  ENCE-OF: R-27225
cd50: 2d 35 33 39 33 36 20 41 20 76 61 6c 75 65 20 6f  -53936 A value o
cd60: 66 20 32 20 6d 65 61 6e 73 20 74 68 65 20 70 61  f 2 means the pa
cd70: 67 65 20 69 73 20 61 6e 20 69 6e 74 65 72 69 6f  ge is an interio
cd80: 72 0a 20 20 20 20 2a 2a 20 69 6e 64 65 78 20 62  r.    ** index b
cd90: 2d 74 72 65 65 20 70 61 67 65 2e 20 2a 2f 0a 20  -tree page. */. 
cda0: 20 20 20 61 73 73 65 72 74 28 20 28 50 54 46 5f     assert( (PTF_
cdb0: 5a 45 52 4f 44 41 54 41 29 3d 3d 32 20 29 3b 0a  ZERODATA)==2 );.
cdc0: 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
cdd0: 4f 46 3a 20 52 2d 31 36 35 37 31 2d 31 31 36 31  OF: R-16571-1161
cde0: 35 20 41 20 76 61 6c 75 65 20 6f 66 20 31 30 20  5 A value of 10 
cdf0: 6d 65 61 6e 73 20 74 68 65 20 70 61 67 65 20 69  means the page i
ce00: 73 20 61 20 6c 65 61 66 0a 20 20 20 20 2a 2a 20  s a leaf.    ** 
ce10: 69 6e 64 65 78 20 62 2d 74 72 65 65 20 70 61 67  index b-tree pag
ce20: 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  e. */.    assert
ce30: 28 20 28 50 54 46 5f 5a 45 52 4f 44 41 54 41 7c  ( (PTF_ZERODATA|
ce40: 50 54 46 5f 4c 45 41 46 29 3d 3d 31 30 20 29 3b  PTF_LEAF)==10 );
ce50: 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b  .    pPage->intK
ce60: 65 79 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67  ey = 0;.    pPag
ce70: 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20 3d 20  e->intKeyLeaf = 
ce80: 30 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 6f  0;.    pPage->no
ce90: 50 61 79 6c 6f 61 64 20 3d 20 30 3b 0a 20 20 20  Payload = 0;.   
cea0: 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c   pPage->maxLocal
ceb0: 20 3d 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c   = pBt->maxLocal
cec0: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 69 6e  ;.    pPage->min
ced0: 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e  Local = pBt->min
cee0: 4c 6f 63 61 6c 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Local;.  }else{.
cef0: 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
cf00: 4f 46 3a 20 52 2d 34 37 36 30 38 2d 35 36 34 36  OF: R-47608-5646
cf10: 39 20 41 6e 79 20 6f 74 68 65 72 20 76 61 6c 75  9 Any other valu
cf20: 65 20 66 6f 72 20 74 68 65 20 62 2d 74 72 65 65  e for the b-tree
cf30: 20 70 61 67 65 20 74 79 70 65 20 69 73 0a 20 20   page type is.  
cf40: 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72 2e 20 2a    ** an error. *
cf50: 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  /.    return SQL
cf60: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
cf70: 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e 6d  ;.  }.  pPage->m
cf80: 61 78 31 62 79 74 65 50 61 79 6c 6f 61 64 20 3d  ax1bytePayload =
cf90: 20 70 42 74 2d 3e 6d 61 78 31 62 79 74 65 50 61   pBt->max1bytePa
cfa0: 79 6c 6f 61 64 3b 0a 20 20 72 65 74 75 72 6e 20  yload;.  return 
cfb0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
cfc0: 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74  .** Initialize t
cfd0: 68 65 20 61 75 78 69 6c 69 61 72 79 20 69 6e 66  he auxiliary inf
cfe0: 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 61 20 64  ormation for a d
cff0: 69 73 6b 20 62 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a  isk block..**.**
d000: 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
d010: 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 49  K on success.  I
d020: 66 20 77 65 20 73 65 65 20 74 68 61 74 20 74 68  f we see that th
d030: 65 20 70 61 67 65 20 64 6f 65 73 0a 2a 2a 20 6e  e page does.** n
d040: 6f 74 20 63 6f 6e 74 61 69 6e 20 61 20 77 65 6c  ot contain a wel
d050: 6c 2d 66 6f 72 6d 65 64 20 64 61 74 61 62 61 73  l-formed databas
d060: 65 20 70 61 67 65 2c 20 74 68 65 6e 20 72 65 74  e page, then ret
d070: 75 72 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 43  urn .** SQLITE_C
d080: 4f 52 52 55 50 54 2e 20 20 4e 6f 74 65 20 74 68  ORRUPT.  Note th
d090: 61 74 20 61 20 72 65 74 75 72 6e 20 6f 66 20 53  at a return of S
d0a0: 51 4c 49 54 45 5f 4f 4b 20 64 6f 65 73 20 6e 6f  QLITE_OK does no
d0b0: 74 0a 2a 2a 20 67 75 61 72 61 6e 74 65 65 20 74  t.** guarantee t
d0c0: 68 61 74 20 74 68 65 20 70 61 67 65 20 69 73 20  hat the page is 
d0d0: 77 65 6c 6c 2d 66 6f 72 6d 65 64 2e 20 20 49 74  well-formed.  It
d0e0: 20 6f 6e 6c 79 20 73 68 6f 77 73 20 74 68 61 74   only shows that
d0f0: 0a 2a 2a 20 77 65 20 66 61 69 6c 65 64 20 74 6f  .** we failed to
d100: 20 64 65 74 65 63 74 20 61 6e 79 20 63 6f 72 72   detect any corr
d110: 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  uption..*/.stati
d120: 63 20 69 6e 74 20 62 74 72 65 65 49 6e 69 74 50  c int btreeInitP
d130: 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  age(MemPage *pPa
d140: 67 65 29 7b 0a 0a 20 20 61 73 73 65 72 74 28 20  ge){..  assert( 
d150: 70 50 61 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b  pPage->pBt!=0 );
d160: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
d170: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
d180: 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
d190: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
d1a0: 61 67 65 2d 3e 70 67 6e 6f 3d 3d 73 71 6c 69 74  age->pgno==sqlit
d1b0: 65 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62 65  e3PagerPagenumbe
d1c0: 72 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  r(pPage->pDbPage
d1d0: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
d1e0: 50 61 67 65 20 3d 3d 20 73 71 6c 69 74 65 33 50  Page == sqlite3P
d1f0: 61 67 65 72 47 65 74 45 78 74 72 61 28 70 50 61  agerGetExtra(pPa
d200: 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
d210: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
d220: 3e 61 44 61 74 61 20 3d 3d 20 73 71 6c 69 74 65  >aData == sqlite
d230: 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70 50  3PagerGetData(pP
d240: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
d250: 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e  ..  if( !pPage->
d260: 69 73 49 6e 69 74 20 29 7b 0a 20 20 20 20 75 31  isInit ){.    u1
d270: 36 20 70 63 3b 20 20 20 20 20 20 20 20 20 20 20  6 pc;           
d280: 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 61   /* Address of a
d290: 20 66 72 65 65 62 6c 6f 63 6b 20 77 69 74 68 69   freeblock withi
d2a0: 6e 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 5d  n pPage->aData[]
d2b0: 20 2a 2f 0a 20 20 20 20 75 38 20 68 64 72 3b 20   */.    u8 hdr; 
d2c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66             /* Of
d2d0: 66 73 65 74 20 74 6f 20 62 65 67 69 6e 6e 69 6e  fset to beginnin
d2e0: 67 20 6f 66 20 70 61 67 65 20 68 65 61 64 65 72  g of page header
d2f0: 20 2a 2f 0a 20 20 20 20 75 38 20 2a 64 61 74 61   */.    u8 *data
d300: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 71  ;          /* Eq
d310: 75 61 6c 20 74 6f 20 70 50 61 67 65 2d 3e 61 44  ual to pPage->aD
d320: 61 74 61 20 2a 2f 0a 20 20 20 20 42 74 53 68 61  ata */.    BtSha
d330: 72 65 64 20 2a 70 42 74 3b 20 20 20 20 20 20 20  red *pBt;       
d340: 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 62 74 72   /* The main btr
d350: 65 65 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  ee structure */.
d360: 20 20 20 20 69 6e 74 20 75 73 61 62 6c 65 53 69      int usableSi
d370: 7a 65 3b 20 20 20 20 2f 2a 20 41 6d 6f 75 6e 74  ze;    /* Amount
d380: 20 6f 66 20 75 73 61 62 6c 65 20 73 70 61 63 65   of usable space
d390: 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20 2a 2f   on each page */
d3a0: 0a 20 20 20 20 75 31 36 20 63 65 6c 6c 4f 66 66  .    u16 cellOff
d3b0: 73 65 74 3b 20 20 20 20 2f 2a 20 4f 66 66 73 65  set;    /* Offse
d3c0: 74 20 66 72 6f 6d 20 73 74 61 72 74 20 6f 66 20  t from start of 
d3d0: 70 61 67 65 20 74 6f 20 66 69 72 73 74 20 63 65  page to first ce
d3e0: 6c 6c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20  ll pointer */.  
d3f0: 20 20 69 6e 74 20 6e 46 72 65 65 3b 20 20 20 20    int nFree;    
d400: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
d410: 66 20 75 6e 75 73 65 64 20 62 79 74 65 73 20 6f  f unused bytes o
d420: 6e 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20  n the page */.  
d430: 20 20 69 6e 74 20 74 6f 70 3b 20 20 20 20 20 20    int top;      
d440: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79       /* First by
d450: 74 65 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 63  te of the cell c
d460: 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20  ontent area */. 
d470: 20 20 20 69 6e 74 20 69 43 65 6c 6c 46 69 72 73     int iCellFirs
d480: 74 3b 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61  t;    /* First a
d490: 6c 6c 6f 77 61 62 6c 65 20 63 65 6c 6c 20 6f 72  llowable cell or
d4a0: 20 66 72 65 65 62 6c 6f 63 6b 20 6f 66 66 73 65   freeblock offse
d4b0: 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43 65  t */.    int iCe
d4c0: 6c 6c 4c 61 73 74 3b 20 20 20 20 20 2f 2a 20 4c  llLast;     /* L
d4d0: 61 73 74 20 70 6f 73 73 69 62 6c 65 20 63 65 6c  ast possible cel
d4e0: 6c 20 6f 72 20 66 72 65 65 62 6c 6f 63 6b 20 6f  l or freeblock o
d4f0: 66 66 73 65 74 20 2a 2f 0a 0a 20 20 20 20 70 42  ffset */..    pB
d500: 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a  t = pPage->pBt;.
d510: 0a 20 20 20 20 68 64 72 20 3d 20 70 50 61 67 65  .    hdr = pPage
d520: 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 20  ->hdrOffset;.   
d530: 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61   data = pPage->a
d540: 44 61 74 61 3b 0a 20 20 20 20 2f 2a 20 45 56 49  Data;.    /* EVI
d550: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 38 35 39  DENCE-OF: R-2859
d560: 34 2d 30 32 38 39 30 20 54 68 65 20 6f 6e 65 2d  4-02890 The one-
d570: 62 79 74 65 20 66 6c 61 67 20 61 74 20 6f 66 66  byte flag at off
d580: 73 65 74 20 30 20 69 6e 64 69 63 61 74 69 6e 67  set 0 indicating
d590: 0a 20 20 20 20 2a 2a 20 74 68 65 20 62 2d 74 72  .    ** the b-tr
d5a0: 65 65 20 70 61 67 65 20 74 79 70 65 2e 20 2a 2f  ee page type. */
d5b0: 0a 20 20 20 20 69 66 28 20 64 65 63 6f 64 65 46  .    if( decodeF
d5c0: 6c 61 67 73 28 70 50 61 67 65 2c 20 64 61 74 61  lags(pPage, data
d5d0: 5b 68 64 72 5d 29 20 29 20 72 65 74 75 72 6e 20  [hdr]) ) return 
d5e0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
d5f0: 4b 50 54 3b 0a 20 20 20 20 61 73 73 65 72 74 28  KPT;.    assert(
d600: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3d   pBt->pageSize>=
d610: 35 31 32 20 26 26 20 70 42 74 2d 3e 70 61 67 65  512 && pBt->page
d620: 53 69 7a 65 3c 3d 36 35 35 33 36 20 29 3b 0a 20  Size<=65536 );. 
d630: 20 20 20 70 50 61 67 65 2d 3e 6d 61 73 6b 50 61     pPage->maskPa
d640: 67 65 20 3d 20 28 75 31 36 29 28 70 42 74 2d 3e  ge = (u16)(pBt->
d650: 70 61 67 65 53 69 7a 65 20 2d 20 31 29 3b 0a 20  pageSize - 1);. 
d660: 20 20 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66     pPage->nOverf
d670: 6c 6f 77 20 3d 20 30 3b 0a 20 20 20 20 75 73 61  low = 0;.    usa
d680: 62 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75  bleSize = pBt->u
d690: 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 20 20 70  sableSize;.    p
d6a0: 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74  Page->cellOffset
d6b0: 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20   = cellOffset = 
d6c0: 68 64 72 20 2b 20 38 20 2b 20 70 50 61 67 65 2d  hdr + 8 + pPage-
d6d0: 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20  >childPtrSize;. 
d6e0: 20 20 20 70 50 61 67 65 2d 3e 61 44 61 74 61 45     pPage->aDataE
d6f0: 6e 64 20 3d 20 26 64 61 74 61 5b 75 73 61 62 6c  nd = &data[usabl
d700: 65 53 69 7a 65 5d 3b 0a 20 20 20 20 70 50 61 67  eSize];.    pPag
d710: 65 2d 3e 61 43 65 6c 6c 49 64 78 20 3d 20 26 64  e->aCellIdx = &d
d720: 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74 5d 3b  ata[cellOffset];
d730: 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45  .    /* EVIDENCE
d740: 2d 4f 46 3a 20 52 2d 35 38 30 31 35 2d 34 38 31  -OF: R-58015-481
d750: 37 35 20 54 68 65 20 74 77 6f 2d 62 79 74 65 20  75 The two-byte 
d760: 69 6e 74 65 67 65 72 20 61 74 20 6f 66 66 73 65  integer at offse
d770: 74 20 35 20 64 65 73 69 67 6e 61 74 65 73 0a 20  t 5 designates. 
d780: 20 20 20 2a 2a 20 74 68 65 20 73 74 61 72 74 20     ** the start 
d790: 6f 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  of the cell cont
d7a0: 65 6e 74 20 61 72 65 61 2e 20 41 20 7a 65 72 6f  ent area. A zero
d7b0: 20 76 61 6c 75 65 20 66 6f 72 20 74 68 69 73 20   value for this 
d7c0: 69 6e 74 65 67 65 72 20 69 73 0a 20 20 20 20 2a  integer is.    *
d7d0: 2a 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73  * interpreted as
d7e0: 20 36 35 35 33 36 2e 20 2a 2f 0a 20 20 20 20 74   65536. */.    t
d7f0: 6f 70 20 3d 20 67 65 74 32 62 79 74 65 4e 6f 74  op = get2byteNot
d800: 5a 65 72 6f 28 26 64 61 74 61 5b 68 64 72 2b 35  Zero(&data[hdr+5
d810: 5d 29 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45  ]);.    /* EVIDE
d820: 4e 43 45 2d 4f 46 3a 20 52 2d 33 37 30 30 32 2d  NCE-OF: R-37002-
d830: 33 32 37 37 34 20 54 68 65 20 74 77 6f 2d 62 79  32774 The two-by
d840: 74 65 20 69 6e 74 65 67 65 72 20 61 74 20 6f 66  te integer at of
d850: 66 73 65 74 20 33 20 67 69 76 65 73 20 74 68 65  fset 3 gives the
d860: 0a 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f  .    ** number o
d870: 66 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20 70  f cells on the p
d880: 61 67 65 2e 20 2a 2f 0a 20 20 20 20 70 50 61 67  age. */.    pPag
d890: 65 2d 3e 6e 43 65 6c 6c 20 3d 20 67 65 74 32 62  e->nCell = get2b
d8a0: 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d  yte(&data[hdr+3]
d8b0: 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  );.    if( pPage
d8c0: 2d 3e 6e 43 65 6c 6c 3e 4d 58 5f 43 45 4c 4c 28  ->nCell>MX_CELL(
d8d0: 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a  pBt) ){.      /*
d8e0: 20 54 6f 20 6d 61 6e 79 20 63 65 6c 6c 73 20 66   To many cells f
d8f0: 6f 72 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65  or a single page
d900: 2e 20 20 54 68 65 20 70 61 67 65 20 6d 75 73 74  .  The page must
d910: 20 62 65 20 63 6f 72 72 75 70 74 20 2a 2f 0a 20   be corrupt */. 
d920: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
d930: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
d940: 0a 20 20 20 20 7d 0a 20 20 20 20 74 65 73 74 63  .    }.    testc
d950: 61 73 65 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c  ase( pPage->nCel
d960: 6c 3d 3d 4d 58 5f 43 45 4c 4c 28 70 42 74 29 20  l==MX_CELL(pBt) 
d970: 29 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  );.    /* EVIDEN
d980: 43 45 2d 4f 46 3a 20 52 2d 32 34 30 38 39 2d 35  CE-OF: R-24089-5
d990: 37 39 37 39 20 49 66 20 61 20 70 61 67 65 20 63  7979 If a page c
d9a0: 6f 6e 74 61 69 6e 73 20 6e 6f 20 63 65 6c 6c 73  ontains no cells
d9b0: 20 28 77 68 69 63 68 20 69 73 20 6f 6e 6c 79 0a   (which is only.
d9c0: 20 20 20 20 2a 2a 20 70 6f 73 73 69 62 6c 65 20      ** possible 
d9d0: 66 6f 72 20 61 20 72 6f 6f 74 20 70 61 67 65 20  for a root page 
d9e0: 6f 66 20 61 20 74 61 62 6c 65 20 74 68 61 74 20  of a table that 
d9f0: 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 72 6f 77 73  contains no rows
da00: 29 20 74 68 65 6e 20 74 68 65 0a 20 20 20 20 2a  ) then the.    *
da10: 2a 20 6f 66 66 73 65 74 20 74 6f 20 74 68 65 20  * offset to the 
da20: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65  cell content are
da30: 61 20 77 69 6c 6c 20 65 71 75 61 6c 20 74 68 65  a will equal the
da40: 20 70 61 67 65 20 73 69 7a 65 20 6d 69 6e 75 73   page size minus
da50: 20 74 68 65 0a 20 20 20 20 2a 2a 20 62 79 74 65   the.    ** byte
da60: 73 20 6f 66 20 72 65 73 65 72 76 65 64 20 73 70  s of reserved sp
da70: 61 63 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65  ace. */.    asse
da80: 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  rt( pPage->nCell
da90: 3e 30 20 7c 7c 20 74 6f 70 3d 3d 75 73 61 62 6c  >0 || top==usabl
daa0: 65 53 69 7a 65 20 7c 7c 20 43 4f 52 52 55 50 54  eSize || CORRUPT
dab0: 5f 44 42 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 41  _DB );..    /* A
dac0: 20 6d 61 6c 66 6f 72 6d 65 64 20 64 61 74 61 62   malformed datab
dad0: 61 73 65 20 70 61 67 65 20 6d 69 67 68 74 20 63  ase page might c
dae0: 61 75 73 65 20 75 73 20 74 6f 20 72 65 61 64 20  ause us to read 
daf0: 70 61 73 74 20 74 68 65 20 65 6e 64 0a 20 20 20  past the end.   
db00: 20 2a 2a 20 6f 66 20 70 61 67 65 20 77 68 65 6e   ** of page when
db10: 20 70 61 72 73 69 6e 67 20 61 20 63 65 6c 6c 2e   parsing a cell.
db20: 20 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a    .    **.    **
db30: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62   The following b
db40: 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20 63 68 65  lock of code che
db50: 63 6b 73 20 65 61 72 6c 79 20 74 6f 20 73 65 65  cks early to see
db60: 20 69 66 20 61 20 63 65 6c 6c 20 65 78 74 65 6e   if a cell exten
db70: 64 73 0a 20 20 20 20 2a 2a 20 70 61 73 74 20 74  ds.    ** past t
db80: 68 65 20 65 6e 64 20 6f 66 20 61 20 70 61 67 65  he end of a page
db90: 20 62 6f 75 6e 64 61 72 79 20 61 6e 64 20 63 61   boundary and ca
dba0: 75 73 65 73 20 53 51 4c 49 54 45 5f 43 4f 52 52  uses SQLITE_CORR
dbb0: 55 50 54 20 74 6f 20 62 65 20 0a 20 20 20 20 2a  UPT to be .    *
dbc0: 2a 20 72 65 74 75 72 6e 65 64 20 69 66 20 69 74  * returned if it
dbd0: 20 64 6f 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20   does..    */.  
dbe0: 20 20 69 43 65 6c 6c 46 69 72 73 74 20 3d 20 63    iCellFirst = c
dbf0: 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70 50  ellOffset + 2*pP
dc00: 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 20 20  age->nCell;.    
dc10: 69 43 65 6c 6c 4c 61 73 74 20 3d 20 75 73 61 62  iCellLast = usab
dc20: 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 23 69 66 20  leSize - 4;.#if 
dc30: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
dc40: 4e 41 42 4c 45 5f 4f 56 45 52 53 49 5a 45 5f 43  NABLE_OVERSIZE_C
dc50: 45 4c 4c 5f 43 48 45 43 4b 29 0a 20 20 20 20 7b  ELL_CHECK).    {
dc60: 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 20 20 20  .      int i;   
dc70: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
dc80: 78 20 69 6e 74 6f 20 74 68 65 20 63 65 6c 6c 20  x into the cell 
dc90: 70 6f 69 6e 74 65 72 20 61 72 72 61 79 20 2a 2f  pointer array */
dca0: 0a 20 20 20 20 20 20 69 6e 74 20 73 7a 3b 20 20  .      int sz;  
dcb0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
dcc0: 20 6f 66 20 61 20 63 65 6c 6c 20 2a 2f 0a 0a 20   of a cell */.. 
dcd0: 20 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d       if( !pPage-
dce0: 3e 6c 65 61 66 20 29 20 69 43 65 6c 6c 4c 61 73  >leaf ) iCellLas
dcf0: 74 2d 2d 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  t--;.      for(i
dd00: 3d 30 3b 20 69 3c 70 50 61 67 65 2d 3e 6e 43 65  =0; i<pPage->nCe
dd10: 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ll; i++){.      
dd20: 20 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 28    pc = get2byte(
dd30: 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74  &data[cellOffset
dd40: 2b 69 2a 32 5d 29 3b 0a 20 20 20 20 20 20 20 20  +i*2]);.        
dd50: 74 65 73 74 63 61 73 65 28 20 70 63 3d 3d 69 43  testcase( pc==iC
dd60: 65 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20 20 20  ellFirst );.    
dd70: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 63      testcase( pc
dd80: 3d 3d 69 43 65 6c 6c 4c 61 73 74 20 29 3b 0a 20  ==iCellLast );. 
dd90: 20 20 20 20 20 20 20 69 66 28 20 70 63 3c 69 43         if( pc<iC
dda0: 65 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63 3e 69  ellFirst || pc>i
ddb0: 43 65 6c 6c 4c 61 73 74 20 29 7b 0a 20 20 20 20  CellLast ){.    
ddc0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
ddd0: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
dde0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
ddf0: 20 20 20 20 73 7a 20 3d 20 63 65 6c 6c 53 69 7a      sz = cellSiz
de00: 65 50 74 72 28 70 50 61 67 65 2c 20 26 64 61 74  ePtr(pPage, &dat
de10: 61 5b 70 63 5d 29 3b 0a 20 20 20 20 20 20 20 20  a[pc]);.        
de20: 74 65 73 74 63 61 73 65 28 20 70 63 2b 73 7a 3d  testcase( pc+sz=
de30: 3d 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20  =usableSize );. 
de40: 20 20 20 20 20 20 20 69 66 28 20 70 63 2b 73 7a         if( pc+sz
de50: 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20  >usableSize ){. 
de60: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
de70: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
de80: 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  KPT;.        }. 
de90: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
dea0: 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 20   !pPage->leaf ) 
deb0: 69 43 65 6c 6c 4c 61 73 74 2b 2b 3b 0a 20 20 20  iCellLast++;.   
dec0: 20 7d 20 20 0a 23 65 6e 64 69 66 0a 0a 20 20 20   }  .#endif..   
ded0: 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20   /* Compute the 
dee0: 74 6f 74 61 6c 20 66 72 65 65 20 73 70 61 63 65  total free space
def0: 20 6f 6e 20 74 68 65 20 70 61 67 65 0a 20 20 20   on the page.   
df00: 20 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   ** EVIDENCE-OF:
df10: 20 52 2d 32 33 35 38 38 2d 33 34 34 35 30 20 54   R-23588-34450 T
df20: 68 65 20 74 77 6f 2d 62 79 74 65 20 69 6e 74 65  he two-byte inte
df30: 67 65 72 20 61 74 20 6f 66 66 73 65 74 20 31 20  ger at offset 1 
df40: 67 69 76 65 73 20 74 68 65 0a 20 20 20 20 2a 2a  gives the.    **
df50: 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 66 69   start of the fi
df60: 72 73 74 20 66 72 65 65 62 6c 6f 63 6b 20 6f 6e  rst freeblock on
df70: 20 74 68 65 20 70 61 67 65 2c 20 6f 72 20 69 73   the page, or is
df80: 20 7a 65 72 6f 20 69 66 20 74 68 65 72 65 20 61   zero if there a
df90: 72 65 20 6e 6f 0a 20 20 20 20 2a 2a 20 66 72 65  re no.    ** fre
dfa0: 65 62 6c 6f 63 6b 73 2e 20 2a 2f 0a 20 20 20 20  eblocks. */.    
dfb0: 70 63 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  pc = get2byte(&d
dfc0: 61 74 61 5b 68 64 72 2b 31 5d 29 3b 0a 20 20 20  ata[hdr+1]);.   
dfd0: 20 6e 46 72 65 65 20 3d 20 64 61 74 61 5b 68 64   nFree = data[hd
dfe0: 72 2b 37 5d 20 2b 20 74 6f 70 3b 20 20 2f 2a 20  r+7] + top;  /* 
dff0: 49 6e 69 74 20 6e 46 72 65 65 20 74 6f 20 6e 6f  Init nFree to no
e000: 6e 2d 66 72 65 65 62 6c 6f 63 6b 20 66 72 65 65  n-freeblock free
e010: 20 73 70 61 63 65 20 2a 2f 0a 20 20 20 20 77 68   space */.    wh
e020: 69 6c 65 28 20 70 63 3e 30 20 29 7b 0a 20 20 20  ile( pc>0 ){.   
e030: 20 20 20 75 31 36 20 6e 65 78 74 2c 20 73 69 7a     u16 next, siz
e040: 65 3b 0a 20 20 20 20 20 20 69 66 28 20 70 63 3c  e;.      if( pc<
e050: 69 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63  iCellFirst || pc
e060: 3e 69 43 65 6c 6c 4c 61 73 74 20 29 7b 0a 20 20  >iCellLast ){.  
e070: 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43        /* EVIDENC
e080: 45 2d 4f 46 3a 20 52 2d 35 35 35 33 30 2d 35 32  E-OF: R-55530-52
e090: 39 33 30 20 49 6e 20 61 20 77 65 6c 6c 2d 66 6f  930 In a well-fo
e0a0: 72 6d 65 64 20 62 2d 74 72 65 65 20 70 61 67 65  rmed b-tree page
e0b0: 2c 20 74 68 65 72 65 20 77 69 6c 6c 0a 20 20 20  , there will.   
e0c0: 20 20 20 20 20 2a 2a 20 61 6c 77 61 79 73 20 62       ** always b
e0d0: 65 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 63  e at least one c
e0e0: 65 6c 6c 20 62 65 66 6f 72 65 20 74 68 65 20 66  ell before the f
e0f0: 69 72 73 74 20 66 72 65 65 62 6c 6f 63 6b 2e 0a  irst freeblock..
e100: 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
e110: 20 20 20 2a 2a 20 4f 72 2c 20 74 68 65 20 66 72     ** Or, the fr
e120: 65 65 62 6c 6f 63 6b 20 69 73 20 6f 66 66 20 74  eeblock is off t
e130: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70 61  he end of the pa
e140: 67 65 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  ge.        */.  
e150: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
e160: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
e170: 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  ; .      }.     
e180: 20 6e 65 78 74 20 3d 20 67 65 74 32 62 79 74 65   next = get2byte
e190: 28 26 64 61 74 61 5b 70 63 5d 29 3b 0a 20 20 20  (&data[pc]);.   
e1a0: 20 20 20 73 69 7a 65 20 3d 20 67 65 74 32 62 79     size = get2by
e1b0: 74 65 28 26 64 61 74 61 5b 70 63 2b 32 5d 29 3b  te(&data[pc+2]);
e1c0: 0a 20 20 20 20 20 20 69 66 28 20 28 6e 65 78 74  .      if( (next
e1d0: 3e 30 20 26 26 20 6e 65 78 74 3c 3d 70 63 2b 73  >0 && next<=pc+s
e1e0: 69 7a 65 2b 33 29 20 7c 7c 20 70 63 2b 73 69 7a  ize+3) || pc+siz
e1f0: 65 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a  e>usableSize ){.
e200: 20 20 20 20 20 20 20 20 2f 2a 20 46 72 65 65 20          /* Free 
e210: 62 6c 6f 63 6b 73 20 6d 75 73 74 20 62 65 20 69  blocks must be i
e220: 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65  n ascending orde
e230: 72 2e 20 41 6e 64 20 74 68 65 20 6c 61 73 74 20  r. And the last 
e240: 62 79 74 65 20 6f 66 0a 20 20 20 20 20 20 20 20  byte of.        
e250: 2a 2a 20 74 68 65 20 66 72 65 65 2d 62 6c 6f 63  ** the free-bloc
e260: 6b 20 6d 75 73 74 20 6c 69 65 20 6f 6e 20 74 68  k must lie on th
e270: 65 20 64 61 74 61 62 61 73 65 20 70 61 67 65 2e  e database page.
e280: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 74    */.        ret
e290: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
e2a0: 50 54 5f 42 4b 50 54 3b 20 0a 20 20 20 20 20 20  PT_BKPT; .      
e2b0: 7d 0a 20 20 20 20 20 20 6e 46 72 65 65 20 3d 20  }.      nFree = 
e2c0: 6e 46 72 65 65 20 2b 20 73 69 7a 65 3b 0a 20 20  nFree + size;.  
e2d0: 20 20 20 20 70 63 20 3d 20 6e 65 78 74 3b 0a 20      pc = next;. 
e2e0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 74 20     }..    /* At 
e2f0: 74 68 69 73 20 70 6f 69 6e 74 2c 20 6e 46 72 65  this point, nFre
e300: 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 73  e contains the s
e310: 75 6d 20 6f 66 20 74 68 65 20 6f 66 66 73 65 74  um of the offset
e320: 20 74 6f 20 74 68 65 20 73 74 61 72 74 0a 20 20   to the start.  
e330: 20 20 2a 2a 20 6f 66 20 74 68 65 20 63 65 6c 6c    ** of the cell
e340: 2d 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 70 6c  -content area pl
e350: 75 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  us the number of
e360: 20 66 72 65 65 20 62 79 74 65 73 20 77 69 74 68   free bytes with
e370: 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 65  in.    ** the ce
e380: 6c 6c 2d 63 6f 6e 74 65 6e 74 20 61 72 65 61 2e  ll-content area.
e390: 20 49 66 20 74 68 69 73 20 69 73 20 67 72 65 61   If this is grea
e3a0: 74 65 72 20 74 68 61 6e 20 74 68 65 20 75 73 61  ter than the usa
e3b0: 62 6c 65 2d 73 69 7a 65 0a 20 20 20 20 2a 2a 20  ble-size.    ** 
e3c0: 6f 66 20 74 68 65 20 70 61 67 65 2c 20 74 68 65  of the page, the
e3d0: 6e 20 74 68 65 20 70 61 67 65 20 6d 75 73 74 20  n the page must 
e3e0: 62 65 20 63 6f 72 72 75 70 74 65 64 2e 20 54 68  be corrupted. Th
e3f0: 69 73 20 63 68 65 63 6b 20 61 6c 73 6f 0a 20 20  is check also.  
e400: 20 20 2a 2a 20 73 65 72 76 65 73 20 74 6f 20 76    ** serves to v
e410: 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20 6f  erify that the o
e420: 66 66 73 65 74 20 74 6f 20 74 68 65 20 73 74 61  ffset to the sta
e430: 72 74 20 6f 66 20 74 68 65 20 63 65 6c 6c 2d 63  rt of the cell-c
e440: 6f 6e 74 65 6e 74 0a 20 20 20 20 2a 2a 20 61 72  ontent.    ** ar
e450: 65 61 2c 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  ea, according to
e460: 20 74 68 65 20 70 61 67 65 20 68 65 61 64 65 72   the page header
e470: 2c 20 6c 69 65 73 20 77 69 74 68 69 6e 20 74 68  , lies within th
e480: 65 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20  e page..    */. 
e490: 20 20 20 69 66 28 20 6e 46 72 65 65 3e 75 73 61     if( nFree>usa
e4a0: 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  bleSize ){.     
e4b0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
e4c0: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20  ORRUPT_BKPT; .  
e4d0: 20 20 7d 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e    }.    pPage->n
e4e0: 46 72 65 65 20 3d 20 28 75 31 36 29 28 6e 46 72  Free = (u16)(nFr
e4f0: 65 65 20 2d 20 69 43 65 6c 6c 46 69 72 73 74 29  ee - iCellFirst)
e500: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49  ;.    pPage->isI
e510: 6e 69 74 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72  nit = 1;.  }.  r
e520: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
e530: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 75 70  .}../*.** Set up
e540: 20 61 20 72 61 77 20 70 61 67 65 20 73 6f 20 74   a raw page so t
e550: 68 61 74 20 69 74 20 6c 6f 6f 6b 73 20 6c 69 6b  hat it looks lik
e560: 65 20 61 20 64 61 74 61 62 61 73 65 20 70 61 67  e a database pag
e570: 65 20 68 6f 6c 64 69 6e 67 0a 2a 2a 20 6e 6f 20  e holding.** no 
e580: 65 6e 74 72 69 65 73 2e 0a 2a 2f 0a 73 74 61 74  entries..*/.stat
e590: 69 63 20 76 6f 69 64 20 7a 65 72 6f 50 61 67 65  ic void zeroPage
e5a0: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
e5b0: 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 75   int flags){.  u
e5c0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61  nsigned char *da
e5d0: 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74  ta = pPage->aDat
e5e0: 61 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  a;.  BtShared *p
e5f0: 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b  Bt = pPage->pBt;
e600: 0a 20 20 75 38 20 68 64 72 20 3d 20 70 50 61 67  .  u8 hdr = pPag
e610: 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20  e->hdrOffset;.  
e620: 75 31 36 20 66 69 72 73 74 3b 0a 0a 20 20 61 73  u16 first;..  as
e630: 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
e640: 65 72 50 61 67 65 6e 75 6d 62 65 72 28 70 50 61  erPagenumber(pPa
e650: 67 65 2d 3e 70 44 62 50 61 67 65 29 3d 3d 70 50  ge->pDbPage)==pP
e660: 61 67 65 2d 3e 70 67 6e 6f 20 29 3b 0a 20 20 61  age->pgno );.  a
e670: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
e680: 67 65 72 47 65 74 45 78 74 72 61 28 70 50 61 67  gerGetExtra(pPag
e690: 65 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d 20 28  e->pDbPage) == (
e6a0: 76 6f 69 64 2a 29 70 50 61 67 65 20 29 3b 0a 20  void*)pPage );. 
e6b0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
e6c0: 50 61 67 65 72 47 65 74 44 61 74 61 28 70 50 61  PagerGetData(pPa
e6d0: 67 65 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d 20  ge->pDbPage) == 
e6e0: 64 61 74 61 20 29 3b 0a 20 20 61 73 73 65 72 74  data );.  assert
e6f0: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
e700: 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
e710: 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61  >pDbPage) );.  a
e720: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
e730: 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
e740: 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20 70  utex) );.  if( p
e750: 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42  Bt->btsFlags & B
e760: 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45  TS_SECURE_DELETE
e770: 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26   ){.    memset(&
e780: 64 61 74 61 5b 68 64 72 5d 2c 20 30 2c 20 70 42  data[hdr], 0, pB
e790: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20  t->usableSize - 
e7a0: 68 64 72 29 3b 0a 20 20 7d 0a 20 20 64 61 74 61  hdr);.  }.  data
e7b0: 5b 68 64 72 5d 20 3d 20 28 63 68 61 72 29 66 6c  [hdr] = (char)fl
e7c0: 61 67 73 3b 0a 20 20 66 69 72 73 74 20 3d 20 68  ags;.  first = h
e7d0: 64 72 20 2b 20 28 28 66 6c 61 67 73 26 50 54 46  dr + ((flags&PTF
e7e0: 5f 4c 45 41 46 29 3d 3d 30 20 3f 20 31 32 20 3a  _LEAF)==0 ? 12 :
e7f0: 20 38 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64   8);.  memset(&d
e800: 61 74 61 5b 68 64 72 2b 31 5d 2c 20 30 2c 20 34  ata[hdr+1], 0, 4
e810: 29 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b 37 5d  );.  data[hdr+7]
e820: 20 3d 20 30 3b 0a 20 20 70 75 74 32 62 79 74 65   = 0;.  put2byte
e830: 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 70  (&data[hdr+5], p
e840: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29 3b  Bt->usableSize);
e850: 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20  .  pPage->nFree 
e860: 3d 20 28 75 31 36 29 28 70 42 74 2d 3e 75 73 61  = (u16)(pBt->usa
e870: 62 6c 65 53 69 7a 65 20 2d 20 66 69 72 73 74 29  bleSize - first)
e880: 3b 0a 20 20 64 65 63 6f 64 65 46 6c 61 67 73 28  ;.  decodeFlags(
e890: 70 50 61 67 65 2c 20 66 6c 61 67 73 29 3b 0a 20  pPage, flags);. 
e8a0: 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73   pPage->cellOffs
e8b0: 65 74 20 3d 20 66 69 72 73 74 3b 0a 20 20 70 50  et = first;.  pP
e8c0: 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 3d 20  age->aDataEnd = 
e8d0: 26 64 61 74 61 5b 70 42 74 2d 3e 75 73 61 62 6c  &data[pBt->usabl
e8e0: 65 53 69 7a 65 5d 3b 0a 20 20 70 50 61 67 65 2d  eSize];.  pPage-
e8f0: 3e 61 43 65 6c 6c 49 64 78 20 3d 20 26 64 61 74  >aCellIdx = &dat
e900: 61 5b 66 69 72 73 74 5d 3b 0a 20 20 70 50 61 67  a[first];.  pPag
e910: 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30  e->nOverflow = 0
e920: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ;.  assert( pBt-
e930: 3e 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26  >pageSize>=512 &
e940: 26 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c  & pBt->pageSize<
e950: 3d 36 35 35 33 36 20 29 3b 0a 20 20 70 50 61 67  =65536 );.  pPag
e960: 65 2d 3e 6d 61 73 6b 50 61 67 65 20 3d 20 28 75  e->maskPage = (u
e970: 31 36 29 28 70 42 74 2d 3e 70 61 67 65 53 69 7a  16)(pBt->pageSiz
e980: 65 20 2d 20 31 29 3b 0a 20 20 70 50 61 67 65 2d  e - 1);.  pPage-
e990: 3e 6e 43 65 6c 6c 20 3d 20 30 3b 0a 20 20 70 50  >nCell = 0;.  pP
e9a0: 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 31 3b  age->isInit = 1;
e9b0: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65  .}.../*.** Conve
e9c0: 72 74 20 61 20 44 62 50 61 67 65 20 6f 62 74 61  rt a DbPage obta
e9d0: 69 6e 65 64 20 66 72 6f 6d 20 74 68 65 20 70 61  ined from the pa
e9e0: 67 65 72 20 69 6e 74 6f 20 61 20 4d 65 6d 50 61  ger into a MemPa
e9f0: 67 65 20 75 73 65 64 20 62 79 0a 2a 2a 20 74 68  ge used by.** th
ea00: 65 20 62 74 72 65 65 20 6c 61 79 65 72 2e 0a 2a  e btree layer..*
ea10: 2f 0a 73 74 61 74 69 63 20 4d 65 6d 50 61 67 65  /.static MemPage
ea20: 20 2a 62 74 72 65 65 50 61 67 65 46 72 6f 6d 44   *btreePageFromD
ea30: 62 50 61 67 65 28 44 62 50 61 67 65 20 2a 70 44  bPage(DbPage *pD
ea40: 62 50 61 67 65 2c 20 50 67 6e 6f 20 70 67 6e 6f  bPage, Pgno pgno
ea50: 2c 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 29  , BtShared *pBt)
ea60: 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  {.  MemPage *pPa
ea70: 67 65 20 3d 20 28 4d 65 6d 50 61 67 65 2a 29 73  ge = (MemPage*)s
ea80: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78  qlite3PagerGetEx
ea90: 74 72 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20  tra(pDbPage);.  
eaa0: 70 50 61 67 65 2d 3e 61 44 61 74 61 20 3d 20 73  pPage->aData = s
eab0: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61  qlite3PagerGetDa
eac0: 74 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20 70  ta(pDbPage);.  p
ead0: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 20 3d 20  Page->pDbPage = 
eae0: 70 44 62 50 61 67 65 3b 0a 20 20 70 50 61 67 65  pDbPage;.  pPage
eaf0: 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 70  ->pBt = pBt;.  p
eb00: 50 61 67 65 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e  Page->pgno = pgn
eb10: 6f 3b 0a 20 20 70 50 61 67 65 2d 3e 68 64 72 4f  o;.  pPage->hdrO
eb20: 66 66 73 65 74 20 3d 20 70 50 61 67 65 2d 3e 70  ffset = pPage->p
eb30: 67 6e 6f 3d 3d 31 20 3f 20 31 30 30 20 3a 20 30  gno==1 ? 100 : 0
eb40: 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  ;.  return pPage
eb50: 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20  ; .}../*.** Get 
eb60: 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20  a page from the 
eb70: 70 61 67 65 72 2e 20 20 49 6e 69 74 69 61 6c 69  pager.  Initiali
eb80: 7a 65 20 74 68 65 20 4d 65 6d 50 61 67 65 2e 70  ze the MemPage.p
eb90: 42 74 20 61 6e 64 0a 2a 2a 20 4d 65 6d 50 61 67  Bt and.** MemPag
eba0: 65 2e 61 44 61 74 61 20 65 6c 65 6d 65 6e 74 73  e.aData elements
ebb0: 20 69 66 20 6e 65 65 64 65 64 2e 0a 2a 2a 0a 2a   if needed..**.*
ebc0: 2a 20 49 66 20 74 68 65 20 6e 6f 43 6f 6e 74 65  * If the noConte
ebd0: 6e 74 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20  nt flag is set, 
ebe0: 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65  it means that we
ebf0: 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 61 62 6f   do not care abo
ec00: 75 74 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e  ut.** the conten
ec10: 74 20 6f 66 20 74 68 65 20 70 61 67 65 20 61 74  t of the page at
ec20: 20 74 68 69 73 20 74 69 6d 65 2e 20 20 53 6f 20   this time.  So 
ec30: 64 6f 20 6e 6f 74 20 67 6f 20 74 6f 20 74 68 65  do not go to the
ec40: 20 64 69 73 6b 0a 2a 2a 20 74 6f 20 66 65 74 63   disk.** to fetc
ec50: 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 2e 20 20  h the content.  
ec60: 4a 75 73 74 20 66 69 6c 6c 20 69 6e 20 74 68 65  Just fill in the
ec70: 20 63 6f 6e 74 65 6e 74 20 77 69 74 68 20 7a 65   content with ze
ec80: 72 6f 73 20 66 6f 72 20 6e 6f 77 2e 0a 2a 2a 20  ros for now..** 
ec90: 49 66 20 69 6e 20 74 68 65 20 66 75 74 75 72 65  If in the future
eca0: 20 77 65 20 63 61 6c 6c 20 73 71 6c 69 74 65 33   we call sqlite3
ecb0: 50 61 67 65 72 57 72 69 74 65 28 29 20 6f 6e 20  PagerWrite() on 
ecc0: 74 68 69 73 20 70 61 67 65 2c 20 74 68 61 74 0a  this page, that.
ecd0: 2a 2a 20 6d 65 61 6e 73 20 77 65 20 68 61 76 65  ** means we have
ece0: 20 73 74 61 72 74 65 64 20 74 6f 20 62 65 20 63   started to be c
ecf0: 6f 6e 63 65 72 6e 65 64 20 61 62 6f 75 74 20 63  oncerned about c
ed00: 6f 6e 74 65 6e 74 20 61 6e 64 20 74 68 65 20 64  ontent and the d
ed10: 69 73 6b 0a 2a 2a 20 72 65 61 64 20 73 68 6f 75  isk.** read shou
ed20: 6c 64 20 6f 63 63 75 72 20 61 74 20 74 68 61 74  ld occur at that
ed30: 20 70 6f 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69   point..*/.stati
ed40: 63 20 69 6e 74 20 62 74 72 65 65 47 65 74 50 61  c int btreeGetPa
ed50: 67 65 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a  ge(.  BtShared *
ed60: 70 42 74 2c 20 20 20 20 20 20 20 2f 2a 20 54 68  pBt,       /* Th
ed70: 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 50 67 6e  e btree */.  Pgn
ed80: 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20  o pgno,         
ed90: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74    /* Number of t
eda0: 68 65 20 70 61 67 65 20 74 6f 20 66 65 74 63 68  he page to fetch
edb0: 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a   */.  MemPage **
edc0: 70 70 50 61 67 65 2c 20 20 20 20 2f 2a 20 52 65  ppPage,    /* Re
edd0: 74 75 72 6e 20 74 68 65 20 70 61 67 65 20 69 6e  turn the page in
ede0: 20 74 68 69 73 20 70 61 72 61 6d 65 74 65 72 20   this parameter 
edf0: 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20  */.  int flags  
ee00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 41 47            /* PAG
ee10: 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54  ER_GET_NOCONTENT
ee20: 20 6f 72 20 50 41 47 45 52 5f 47 45 54 5f 52 45   or PAGER_GET_RE
ee30: 41 44 4f 4e 4c 59 20 2a 2f 0a 29 7b 0a 20 20 69  ADONLY */.){.  i
ee40: 6e 74 20 72 63 3b 0a 20 20 44 62 50 61 67 65 20  nt rc;.  DbPage 
ee50: 2a 70 44 62 50 61 67 65 3b 0a 0a 20 20 61 73 73  *pDbPage;..  ass
ee60: 65 72 74 28 20 66 6c 61 67 73 3d 3d 30 20 7c 7c  ert( flags==0 ||
ee70: 20 66 6c 61 67 73 3d 3d 50 41 47 45 52 5f 47 45   flags==PAGER_GE
ee80: 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 7c 7c 20 66  T_NOCONTENT || f
ee90: 6c 61 67 73 3d 3d 50 41 47 45 52 5f 47 45 54 5f  lags==PAGER_GET_
eea0: 52 45 41 44 4f 4e 4c 59 20 29 3b 0a 20 20 61 73  READONLY );.  as
eeb0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
eec0: 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
eed0: 74 65 78 29 20 29 3b 0a 20 20 72 63 20 3d 20 73  tex) );.  rc = s
eee0: 71 6c 69 74 65 33 50 61 67 65 72 41 63 71 75 69  qlite3PagerAcqui
eef0: 72 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  re(pBt->pPager, 
ef00: 70 67 6e 6f 2c 20 28 44 62 50 61 67 65 2a 2a 29  pgno, (DbPage**)
ef10: 26 70 44 62 50 61 67 65 2c 20 66 6c 61 67 73 29  &pDbPage, flags)
ef20: 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
ef30: 75 72 6e 20 72 63 3b 0a 20 20 2a 70 70 50 61 67  urn rc;.  *ppPag
ef40: 65 20 3d 20 62 74 72 65 65 50 61 67 65 46 72 6f  e = btreePageFro
ef50: 6d 44 62 50 61 67 65 28 70 44 62 50 61 67 65 2c  mDbPage(pDbPage,
ef60: 20 70 67 6e 6f 2c 20 70 42 74 29 3b 0a 20 20 72   pgno, pBt);.  r
ef70: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
ef80: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72 69 65  .}../*.** Retrie
ef90: 76 65 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74  ve a page from t
efa0: 68 65 20 70 61 67 65 72 20 63 61 63 68 65 2e 20  he pager cache. 
efb0: 49 66 20 74 68 65 20 72 65 71 75 65 73 74 65 64  If the requested
efc0: 20 70 61 67 65 20 69 73 20 6e 6f 74 0a 2a 2a 20   page is not.** 
efd0: 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 70  already in the p
efe0: 61 67 65 72 20 63 61 63 68 65 20 72 65 74 75 72  ager cache retur
eff0: 6e 20 4e 55 4c 4c 2e 20 49 6e 69 74 69 61 6c 69  n NULL. Initiali
f000: 7a 65 20 74 68 65 20 4d 65 6d 50 61 67 65 2e 70  ze the MemPage.p
f010: 42 74 20 61 6e 64 0a 2a 2a 20 4d 65 6d 50 61 67  Bt and.** MemPag
f020: 65 2e 61 44 61 74 61 20 65 6c 65 6d 65 6e 74 73  e.aData elements
f030: 20 69 66 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73   if needed..*/.s
f040: 74 61 74 69 63 20 4d 65 6d 50 61 67 65 20 2a 62  tatic MemPage *b
f050: 74 72 65 65 50 61 67 65 4c 6f 6f 6b 75 70 28 42  treePageLookup(B
f060: 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67  tShared *pBt, Pg
f070: 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 44 62 50 61  no pgno){.  DbPa
f080: 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 20 20 61  ge *pDbPage;.  a
f090: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
f0a0: 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
f0b0: 75 74 65 78 29 20 29 3b 0a 20 20 70 44 62 50 61  utex) );.  pDbPa
f0c0: 67 65 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  ge = sqlite3Page
f0d0: 72 4c 6f 6f 6b 75 70 28 70 42 74 2d 3e 70 50 61  rLookup(pBt->pPa
f0e0: 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66  ger, pgno);.  if
f0f0: 28 20 70 44 62 50 61 67 65 20 29 7b 0a 20 20 20  ( pDbPage ){.   
f100: 20 72 65 74 75 72 6e 20 62 74 72 65 65 50 61 67   return btreePag
f110: 65 46 72 6f 6d 44 62 50 61 67 65 28 70 44 62 50  eFromDbPage(pDbP
f120: 61 67 65 2c 20 70 67 6e 6f 2c 20 70 42 74 29 3b  age, pgno, pBt);
f130: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
f140: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
f150: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
f160: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
f170: 6e 20 70 61 67 65 73 2e 20 49 66 20 74 68 65 72  n pages. If ther
f180: 65 20 69 73 20 61 6e 79 20 6b 69 6e 64 20 6f 66  e is any kind of
f190: 0a 2a 2a 20 65 72 72 6f 72 2c 20 72 65 74 75 72  .** error, retur
f1a0: 6e 20 28 28 75 6e 73 69 67 6e 65 64 20 69 6e 74  n ((unsigned int
f1b0: 29 2d 31 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  )-1)..*/.static 
f1c0: 50 67 6e 6f 20 62 74 72 65 65 50 61 67 65 63 6f  Pgno btreePageco
f1d0: 75 6e 74 28 42 74 53 68 61 72 65 64 20 2a 70 42  unt(BtShared *pB
f1e0: 74 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 42 74  t){.  return pBt
f1f0: 2d 3e 6e 50 61 67 65 3b 0a 7d 0a 75 33 32 20 73  ->nPage;.}.u32 s
f200: 71 6c 69 74 65 33 42 74 72 65 65 4c 61 73 74 50  qlite3BtreeLastP
f210: 61 67 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  age(Btree *p){. 
f220: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
f230: 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28  BtreeHoldsMutex(
f240: 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  p) );.  assert( 
f250: 28 28 70 2d 3e 70 42 74 2d 3e 6e 50 61 67 65 29  ((p->pBt->nPage)
f260: 26 30 78 38 30 30 30 30 30 30 29 3d 3d 30 20 29  &0x8000000)==0 )
f270: 3b 0a 20 20 72 65 74 75 72 6e 20 62 74 72 65 65  ;.  return btree
f280: 50 61 67 65 63 6f 75 6e 74 28 70 2d 3e 70 42 74  Pagecount(p->pBt
f290: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20  );.}../*.** Get 
f2a0: 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20  a page from the 
f2b0: 70 61 67 65 72 20 61 6e 64 20 69 6e 69 74 69 61  pager and initia
f2c0: 6c 69 7a 65 20 69 74 2e 20 20 54 68 69 73 20 72  lize it.  This r
f2d0: 6f 75 74 69 6e 65 20 69 73 20 6a 75 73 74 20 61  outine is just a
f2e0: 0a 2a 2a 20 63 6f 6e 76 65 6e 69 65 6e 63 65 20  .** convenience 
f2f0: 77 72 61 70 70 65 72 20 61 72 6f 75 6e 64 20 73  wrapper around s
f300: 65 70 61 72 61 74 65 20 63 61 6c 6c 73 20 74 6f  eparate calls to
f310: 20 62 74 72 65 65 47 65 74 50 61 67 65 28 29 20   btreeGetPage() 
f320: 61 6e 64 20 0a 2a 2a 20 62 74 72 65 65 49 6e 69  and .** btreeIni
f330: 74 50 61 67 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 49  tPage()..**.** I
f340: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
f350: 73 2c 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75  s, then the valu
f360: 65 20 2a 70 70 50 61 67 65 20 69 73 20 73 65 74  e *ppPage is set
f370: 20 74 6f 20 69 73 20 75 6e 64 65 66 69 6e 65 64   to is undefined
f380: 2e 20 49 74 0a 2a 2a 20 6d 61 79 20 72 65 6d 61  . It.** may rema
f390: 69 6e 20 75 6e 63 68 61 6e 67 65 64 2c 20 6f 72  in unchanged, or
f3a0: 20 69 74 20 6d 61 79 20 62 65 20 73 65 74 20 74   it may be set t
f3b0: 6f 20 61 6e 20 69 6e 76 61 6c 69 64 20 76 61 6c  o an invalid val
f3c0: 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ue..*/.static in
f3d0: 74 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65  t getAndInitPage
f3e0: 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  (.  BtShared *pB
f3f0: 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
f400: 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62      /* The datab
f410: 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67  ase file */.  Pg
f420: 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20  no pgno,        
f430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
f440: 20 4e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70   Number of the p
f450: 61 67 65 20 74 6f 20 67 65 74 20 2a 2f 0a 20 20  age to get */.  
f460: 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65  MemPage **ppPage
f470: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
f480: 2f 2a 20 57 72 69 74 65 20 74 68 65 20 70 61 67  /* Write the pag
f490: 65 20 70 6f 69 6e 74 65 72 20 68 65 72 65 20 2a  e pointer here *
f4a0: 2f 0a 20 20 69 6e 74 20 62 52 65 61 64 6f 6e 6c  /.  int bReadonl
f4b0: 79 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y               
f4c0: 20 20 20 20 2f 2a 20 50 41 47 45 52 5f 47 45 54      /* PAGER_GET
f4d0: 5f 52 45 41 44 4f 4e 4c 59 20 6f 72 20 30 20 2a  _READONLY or 0 *
f4e0: 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  /.){.  int rc;. 
f4f0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
f500: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
f510: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
f520: 65 72 74 28 20 62 52 65 61 64 6f 6e 6c 79 3d 3d  ert( bReadonly==
f530: 50 41 47 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e  PAGER_GET_READON
f540: 4c 59 20 7c 7c 20 62 52 65 61 64 6f 6e 6c 79 3d  LY || bReadonly=
f550: 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 70 67 6e  =0 );..  if( pgn
f560: 6f 3e 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74  o>btreePagecount
f570: 28 70 42 74 29 20 29 7b 0a 20 20 20 20 72 63 20  (pBt) ){.    rc 
f580: 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
f590: 5f 42 4b 50 54 3b 0a 20 20 7d 65 6c 73 65 7b 0a  _BKPT;.  }else{.
f5a0: 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65      rc = btreeGe
f5b0: 74 50 61 67 65 28 70 42 74 2c 20 70 67 6e 6f 2c  tPage(pBt, pgno,
f5c0: 20 70 70 50 61 67 65 2c 20 62 52 65 61 64 6f 6e   ppPage, bReadon
f5d0: 6c 79 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  ly);.    if( rc=
f5e0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28 2a  =SQLITE_OK && (*
f5f0: 70 70 50 61 67 65 29 2d 3e 69 73 49 6e 69 74 3d  ppPage)->isInit=
f600: 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  =0 ){.      rc =
f610: 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 2a   btreeInitPage(*
f620: 70 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69  ppPage);.      i
f630: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
f640: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65   ){.        rele
f650: 61 73 65 50 61 67 65 28 2a 70 70 50 61 67 65 29  asePage(*ppPage)
f660: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
f670: 20 20 7d 0a 0a 20 20 74 65 73 74 63 61 73 65 28    }..  testcase(
f680: 20 70 67 6e 6f 3d 3d 30 20 29 3b 0a 20 20 61 73   pgno==0 );.  as
f690: 73 65 72 74 28 20 70 67 6e 6f 21 3d 30 20 7c 7c  sert( pgno!=0 ||
f6a0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 43 4f 52 52   rc==SQLITE_CORR
f6b0: 55 50 54 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  UPT );.  return 
f6c0: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c  rc;.}../*.** Rel
f6d0: 65 61 73 65 20 61 20 4d 65 6d 50 61 67 65 2e 20  ease a MemPage. 
f6e0: 20 54 68 69 73 20 73 68 6f 75 6c 64 20 62 65 20   This should be 
f6f0: 63 61 6c 6c 65 64 20 6f 6e 63 65 20 66 6f 72 20  called once for 
f700: 65 61 63 68 20 70 72 69 6f 72 0a 2a 2a 20 63 61  each prior.** ca
f710: 6c 6c 20 74 6f 20 62 74 72 65 65 47 65 74 50 61  ll to btreeGetPa
f720: 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ge..*/.static vo
f730: 69 64 20 72 65 6c 65 61 73 65 50 61 67 65 28 4d  id releasePage(M
f740: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a  emPage *pPage){.
f750: 20 20 69 66 28 20 70 50 61 67 65 20 29 7b 0a 20    if( pPage ){. 
f760: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
f770: 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 20 20 61  ->aData );.    a
f780: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42  ssert( pPage->pB
f790: 74 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  t );.    assert(
f7a0: 20 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 21   pPage->pDbPage!
f7b0: 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
f7c0: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  ( sqlite3PagerGe
f7d0: 74 45 78 74 72 61 28 70 50 61 67 65 2d 3e 70 44  tExtra(pPage->pD
f7e0: 62 50 61 67 65 29 20 3d 3d 20 28 76 6f 69 64 2a  bPage) == (void*
f7f0: 29 70 50 61 67 65 20 29 3b 0a 20 20 20 20 61 73  )pPage );.    as
f800: 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
f810: 65 72 47 65 74 44 61 74 61 28 70 50 61 67 65 2d  erGetData(pPage-
f820: 3e 70 44 62 50 61 67 65 29 3d 3d 70 50 61 67 65  >pDbPage)==pPage
f830: 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 20 20 61  ->aData );.    a
f840: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
f850: 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
f860: 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
f870: 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
f880: 55 6e 72 65 66 4e 6f 74 4e 75 6c 6c 28 70 50 61  UnrefNotNull(pPa
f890: 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  ge->pDbPage);.  
f8a0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 75 72 69 6e  }.}../*.** Durin
f8b0: 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 77 68  g a rollback, wh
f8c0: 65 6e 20 74 68 65 20 70 61 67 65 72 20 72 65 6c  en the pager rel
f8d0: 6f 61 64 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  oads information
f8e0: 20 69 6e 74 6f 20 74 68 65 20 63 61 63 68 65 0a   into the cache.
f8f0: 2a 2a 20 73 6f 20 74 68 61 74 20 74 68 65 20 63  ** so that the c
f900: 61 63 68 65 20 69 73 20 72 65 73 74 6f 72 65 64  ache is restored
f910: 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c   to its original
f920: 20 73 74 61 74 65 20 61 74 20 74 68 65 20 73 74   state at the st
f930: 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65 20 74 72  art of.** the tr
f940: 61 6e 73 61 63 74 69 6f 6e 2c 20 66 6f 72 20 65  ansaction, for e
f950: 61 63 68 20 70 61 67 65 20 72 65 73 74 6f 72 65  ach page restore
f960: 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  d this routine i
f970: 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20  s called..**.** 
f980: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6e 65 65  This routine nee
f990: 64 73 20 74 6f 20 72 65 73 65 74 20 74 68 65 20  ds to reset the 
f9a0: 65 78 74 72 61 20 64 61 74 61 20 73 65 63 74 69  extra data secti
f9b0: 6f 6e 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  on at the end of
f9c0: 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 74 6f 20   the.** page to 
f9d0: 61 67 72 65 65 20 77 69 74 68 20 74 68 65 20 72  agree with the r
f9e0: 65 73 74 6f 72 65 64 20 64 61 74 61 2e 0a 2a 2f  estored data..*/
f9f0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
fa00: 65 52 65 69 6e 69 74 28 44 62 50 61 67 65 20 2a  eReinit(DbPage *
fa10: 70 44 61 74 61 29 7b 0a 20 20 4d 65 6d 50 61 67  pData){.  MemPag
fa20: 65 20 2a 70 50 61 67 65 3b 0a 20 20 70 50 61 67  e *pPage;.  pPag
fa30: 65 20 3d 20 28 4d 65 6d 50 61 67 65 20 2a 29 73  e = (MemPage *)s
fa40: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78  qlite3PagerGetEx
fa50: 74 72 61 28 70 44 61 74 61 29 3b 0a 20 20 61 73  tra(pData);.  as
fa60: 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
fa70: 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28 70  erPageRefcount(p
fa80: 44 61 74 61 29 3e 30 20 29 3b 0a 20 20 69 66 28  Data)>0 );.  if(
fa90: 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29   pPage->isInit )
faa0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  {.    assert( sq
fab0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
fac0: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
fad0: 65 78 29 20 29 3b 0a 20 20 20 20 70 50 61 67 65  ex) );.    pPage
fae0: 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20  ->isInit = 0;.  
faf0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 50 61 67    if( sqlite3Pag
fb00: 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28 70  erPageRefcount(p
fb10: 44 61 74 61 29 3e 31 20 29 7b 0a 20 20 20 20 20  Data)>1 ){.     
fb20: 20 2f 2a 20 70 50 61 67 65 20 6d 69 67 68 74 20   /* pPage might 
fb30: 6e 6f 74 20 62 65 20 61 20 62 74 72 65 65 20 70  not be a btree p
fb40: 61 67 65 3b 20 20 69 74 20 6d 69 67 68 74 20 62  age;  it might b
fb50: 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  e an overflow pa
fb60: 67 65 0a 20 20 20 20 20 20 2a 2a 20 6f 72 20 70  ge.      ** or p
fb70: 74 72 6d 61 70 20 70 61 67 65 20 6f 72 20 61 20  trmap page or a 
fb80: 66 72 65 65 20 70 61 67 65 2e 20 20 49 6e 20 74  free page.  In t
fb90: 68 6f 73 65 20 63 61 73 65 73 2c 20 74 68 65 20  hose cases, the 
fba0: 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 20 20 20 20  following.      
fbb0: 2a 2a 20 63 61 6c 6c 20 74 6f 20 62 74 72 65 65  ** call to btree
fbc0: 49 6e 69 74 50 61 67 65 28 29 20 77 69 6c 6c 20  InitPage() will 
fbd0: 6c 69 6b 65 6c 79 20 72 65 74 75 72 6e 20 53 51  likely return SQ
fbe0: 4c 49 54 45 5f 43 4f 52 52 55 50 54 2e 0a 20 20  LITE_CORRUPT..  
fbf0: 20 20 20 20 2a 2a 20 42 75 74 20 6e 6f 20 68 61      ** But no ha
fc00: 72 6d 20 69 73 20 64 6f 6e 65 20 62 79 20 74 68  rm is done by th
fc10: 69 73 2e 20 20 41 6e 64 20 69 74 20 69 73 20 76  is.  And it is v
fc20: 65 72 79 20 69 6d 70 6f 72 74 61 6e 74 20 74 68  ery important th
fc30: 61 74 0a 20 20 20 20 20 20 2a 2a 20 62 74 72 65  at.      ** btre
fc40: 65 49 6e 69 74 50 61 67 65 28 29 20 62 65 20 63  eInitPage() be c
fc50: 61 6c 6c 65 64 20 6f 6e 20 65 76 65 72 79 20 62  alled on every b
fc60: 74 72 65 65 20 70 61 67 65 20 73 6f 20 77 65 20  tree page so we 
fc70: 6d 61 6b 65 0a 20 20 20 20 20 20 2a 2a 20 74 68  make.      ** th
fc80: 65 20 63 61 6c 6c 20 66 6f 72 20 65 76 65 72 79  e call for every
fc90: 20 70 61 67 65 20 74 68 61 74 20 63 6f 6d 65 73   page that comes
fca0: 20 69 6e 20 66 6f 72 20 72 65 2d 69 6e 69 74 69   in for re-initi
fcb0: 6e 67 2e 20 2a 2f 0a 20 20 20 20 20 20 62 74 72  ng. */.      btr
fcc0: 65 65 49 6e 69 74 50 61 67 65 28 70 50 61 67 65  eeInitPage(pPage
fcd0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
fce0: 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65  /*.** Invoke the
fcf0: 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20 66 6f   busy handler fo
fd00: 72 20 61 20 62 74 72 65 65 2e 0a 2a 2f 0a 73 74  r a btree..*/.st
fd10: 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 49 6e  atic int btreeIn
fd20: 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 28  vokeBusyHandler(
fd30: 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 42  void *pArg){.  B
fd40: 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 28  tShared *pBt = (
fd50: 42 74 53 68 61 72 65 64 2a 29 70 41 72 67 3b 0a  BtShared*)pArg;.
fd60: 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 64    assert( pBt->d
fd70: 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  b );.  assert( s
fd80: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
fd90: 64 28 70 42 74 2d 3e 64 62 2d 3e 6d 75 74 65 78  d(pBt->db->mutex
fda0: 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71  ) );.  return sq
fdb0: 6c 69 74 65 33 49 6e 76 6f 6b 65 42 75 73 79 48  lite3InvokeBusyH
fdc0: 61 6e 64 6c 65 72 28 26 70 42 74 2d 3e 64 62 2d  andler(&pBt->db-
fdd0: 3e 62 75 73 79 48 61 6e 64 6c 65 72 29 3b 0a 7d  >busyHandler);.}
fde0: 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 64  ../*.** Open a d
fdf0: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
fe00: 20 0a 2a 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 69   .** zFilename i
fe10: 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  s the name of th
fe20: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
fe30: 20 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69    If zFilename i
fe40: 73 20 4e 55 4c 4c 0a 2a 2a 20 74 68 65 6e 20 61  s NULL.** then a
fe50: 6e 20 65 70 68 65 6d 65 72 61 6c 20 64 61 74 61  n ephemeral data
fe60: 62 61 73 65 20 69 73 20 63 72 65 61 74 65 64 2e  base is created.
fe70: 20 20 54 68 65 20 65 70 68 65 6d 65 72 61 6c 20    The ephemeral 
fe80: 64 61 74 61 62 61 73 65 20 6d 69 67 68 74 0a 2a  database might.*
fe90: 2a 20 62 65 20 65 78 63 6c 75 73 69 76 65 6c 79  * be exclusively
fea0: 20 69 6e 20 6d 65 6d 6f 72 79 2c 20 6f 72 20 69   in memory, or i
feb0: 74 20 6d 69 67 68 74 20 75 73 65 20 61 20 64 69  t might use a di
fec0: 73 6b 2d 62 61 73 65 64 20 6d 65 6d 6f 72 79 20  sk-based memory 
fed0: 63 61 63 68 65 2e 0a 2a 2a 20 45 69 74 68 65 72  cache..** Either
fee0: 20 77 61 79 2c 20 74 68 65 20 65 70 68 65 6d 65   way, the epheme
fef0: 72 61 6c 20 64 61 74 61 62 61 73 65 20 77 69 6c  ral database wil
ff00: 6c 20 62 65 20 61 75 74 6f 6d 61 74 69 63 61 6c  l be automatical
ff10: 6c 79 20 64 65 6c 65 74 65 64 20 0a 2a 2a 20 77  ly deleted .** w
ff20: 68 65 6e 20 73 71 6c 69 74 65 33 42 74 72 65 65  hen sqlite3Btree
ff30: 43 6c 6f 73 65 28 29 20 69 73 20 63 61 6c 6c 65  Close() is calle
ff40: 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 46 69 6c  d..**.** If zFil
ff50: 65 6e 61 6d 65 20 69 73 20 22 3a 6d 65 6d 6f 72  ename is ":memor
ff60: 79 3a 22 20 74 68 65 6e 20 61 6e 20 69 6e 2d 6d  y:" then an in-m
ff70: 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20 69  emory database i
ff80: 73 20 63 72 65 61 74 65 64 0a 2a 2a 20 74 68 61  s created.** tha
ff90: 74 20 69 73 20 61 75 74 6f 6d 61 74 69 63 61 6c  t is automatical
ffa0: 6c 79 20 64 65 73 74 72 6f 79 65 64 20 77 68 65  ly destroyed whe
ffb0: 6e 20 69 74 20 69 73 20 63 6c 6f 73 65 64 2e 0a  n it is closed..
ffc0: 2a 2a 0a 2a 2a 20 54 68 65 20 22 66 6c 61 67 73  **.** The "flags
ffd0: 22 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 61  " parameter is a
ffe0: 20 62 69 74 6d 61 73 6b 20 74 68 61 74 20 6d 69   bitmask that mi
fff0: 67 68 74 20 63 6f 6e 74 61 69 6e 20 62 69 74 73  ght contain bits
10000 20 6c 69 6b 65 0a 2a 2a 20 42 54 52 45 45 5f 4f   like.** BTREE_O
10010 4d 49 54 5f 4a 4f 55 52 4e 41 4c 20 61 6e 64 2f  MIT_JOURNAL and/
10020 6f 72 20 42 54 52 45 45 5f 4d 45 4d 4f 52 59 2e  or BTREE_MEMORY.
10030 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64 61  .**.** If the da
10040 74 61 62 61 73 65 20 69 73 20 61 6c 72 65 61 64  tabase is alread
10050 79 20 6f 70 65 6e 65 64 20 69 6e 20 74 68 65 20  y opened in the 
10060 73 61 6d 65 20 64 61 74 61 62 61 73 65 20 63 6f  same database co
10070 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20  nnection.** and 
10080 77 65 20 61 72 65 20 69 6e 20 73 68 61 72 65 64  we are in shared
10090 20 63 61 63 68 65 20 6d 6f 64 65 2c 20 74 68 65   cache mode, the
100a0 6e 20 74 68 65 20 6f 70 65 6e 20 77 69 6c 6c 20  n the open will 
100b0 66 61 69 6c 20 77 69 74 68 20 61 6e 0a 2a 2a 20  fail with an.** 
100c0 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
100d0 54 20 65 72 72 6f 72 2e 20 20 57 65 20 63 61 6e  T error.  We can
100e0 6e 6f 74 20 61 6c 6c 6f 77 20 74 77 6f 20 6f 72  not allow two or
100f0 20 6d 6f 72 65 20 42 74 53 68 61 72 65 64 0a 2a   more BtShared.*
10100 2a 20 6f 62 6a 65 63 74 73 20 69 6e 20 74 68 65  * objects in the
10110 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 20 63   same database c
10120 6f 6e 6e 65 63 74 69 6f 6e 20 73 69 6e 63 65 20  onnection since 
10130 64 6f 69 6e 67 20 73 6f 20 77 69 6c 6c 20 6c 65  doing so will le
10140 61 64 0a 2a 2a 20 74 6f 20 70 72 6f 62 6c 65 6d  ad.** to problem
10150 73 20 77 69 74 68 20 6c 6f 63 6b 69 6e 67 2e 0a  s with locking..
10160 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
10170 72 65 65 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74  reeOpen(.  sqlit
10180 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20  e3_vfs *pVfs,   
10190 20 20 20 2f 2a 20 56 46 53 20 74 6f 20 75 73 65     /* VFS to use
101a0 20 66 6f 72 20 74 68 69 73 20 62 2d 74 72 65 65   for this b-tree
101b0 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
101c0 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 2f 2a   *zFilename,  /*
101d0 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c   Name of the fil
101e0 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  e containing the
101f0 20 42 54 72 65 65 20 64 61 74 61 62 61 73 65 20   BTree database 
10200 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
10210 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
10220 41 73 73 6f 63 69 61 74 65 64 20 64 61 74 61 62  Associated datab
10230 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20  ase handle */.  
10240 42 74 72 65 65 20 2a 2a 70 70 42 74 72 65 65 2c  Btree **ppBtree,
10250 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
10260 65 72 20 74 6f 20 6e 65 77 20 42 74 72 65 65 20  er to new Btree 
10270 6f 62 6a 65 63 74 20 77 72 69 74 74 65 6e 20 68  object written h
10280 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61  ere */.  int fla
10290 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  gs,             
102a0 20 2f 2a 20 4f 70 74 69 6f 6e 73 20 2a 2f 0a 20   /* Options */. 
102b0 20 69 6e 74 20 76 66 73 46 6c 61 67 73 20 20 20   int vfsFlags   
102c0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67           /* Flag
102d0 73 20 70 61 73 73 65 64 20 74 68 72 6f 75 67 68  s passed through
102e0 20 74 6f 20 73 71 6c 69 74 65 33 5f 76 66 73 2e   to sqlite3_vfs.
102f0 78 4f 70 65 6e 28 29 20 2a 2f 0a 29 7b 0a 20 20  xOpen() */.){.  
10300 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
10310 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  0;             /
10320 2a 20 53 68 61 72 65 64 20 70 61 72 74 20 6f 66  * Shared part of
10330 20 62 74 72 65 65 20 73 74 72 75 63 74 75 72 65   btree structure
10340 20 2a 2f 0a 20 20 42 74 72 65 65 20 2a 70 3b 20   */.  Btree *p; 
10350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10360 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 74       /* Handle t
10370 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 73 71  o return */.  sq
10380 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74  lite3_mutex *mut
10390 65 78 4f 70 65 6e 20 3d 20 30 3b 20 20 2f 2a 20  exOpen = 0;  /* 
103a0 50 72 65 76 65 6e 74 73 20 61 20 72 61 63 65 20  Prevents a race 
103b0 63 6f 6e 64 69 74 69 6f 6e 2e 20 54 69 63 6b 65  condition. Ticke
103c0 74 20 23 33 35 33 37 20 2a 2f 0a 20 20 69 6e 74  t #3537 */.  int
103d0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
103e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
103f0 65 73 75 6c 74 20 63 6f 64 65 20 66 72 6f 6d 20  esult code from 
10400 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  this function */
10410 0a 20 20 75 38 20 6e 52 65 73 65 72 76 65 3b 20  .  u8 nReserve; 
10420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10430 20 20 2f 2a 20 42 79 74 65 20 6f 66 20 75 6e 75    /* Byte of unu
10440 73 65 64 20 73 70 61 63 65 20 6f 6e 20 65 61 63  sed space on eac
10450 68 20 70 61 67 65 20 2a 2f 0a 20 20 75 6e 73 69  h page */.  unsi
10460 67 6e 65 64 20 63 68 61 72 20 7a 44 62 48 65 61  gned char zDbHea
10470 64 65 72 5b 31 30 30 5d 3b 20 20 2f 2a 20 44 61  der[100];  /* Da
10480 74 61 62 61 73 65 20 68 65 61 64 65 72 20 63 6f  tabase header co
10490 6e 74 65 6e 74 20 2a 2f 0a 0a 20 20 2f 2a 20 54  ntent */..  /* T
104a0 72 75 65 20 69 66 20 6f 70 65 6e 69 6e 67 20 61  rue if opening a
104b0 6e 20 65 70 68 65 6d 65 72 61 6c 2c 20 74 65 6d  n ephemeral, tem
104c0 70 6f 72 61 72 79 20 64 61 74 61 62 61 73 65 20  porary database 
104d0 2a 2f 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 69  */.  const int i
104e0 73 54 65 6d 70 44 62 20 3d 20 7a 46 69 6c 65 6e  sTempDb = zFilen
104f0 61 6d 65 3d 3d 30 20 7c 7c 20 7a 46 69 6c 65 6e  ame==0 || zFilen
10500 61 6d 65 5b 30 5d 3d 3d 30 3b 0a 0a 20 20 2f 2a  ame[0]==0;..  /*
10510 20 53 65 74 20 74 68 65 20 76 61 72 69 61 62 6c   Set the variabl
10520 65 20 69 73 4d 65 6d 64 62 20 74 6f 20 74 72 75  e isMemdb to tru
10530 65 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f  e for an in-memo
10540 72 79 20 64 61 74 61 62 61 73 65 2c 20 6f 72 20  ry database, or 
10550 0a 20 20 2a 2a 20 66 61 6c 73 65 20 66 6f 72 20  .  ** false for 
10560 61 20 66 69 6c 65 2d 62 61 73 65 64 20 64 61 74  a file-based dat
10570 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 23 69 66 64  abase..  */.#ifd
10580 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d  ef SQLITE_OMIT_M
10590 45 4d 4f 52 59 44 42 0a 20 20 63 6f 6e 73 74 20  EMORYDB.  const 
105a0 69 6e 74 20 69 73 4d 65 6d 64 62 20 3d 20 30 3b  int isMemdb = 0;
105b0 0a 23 65 6c 73 65 0a 20 20 63 6f 6e 73 74 20 69  .#else.  const i
105c0 6e 74 20 69 73 4d 65 6d 64 62 20 3d 20 28 7a 46  nt isMemdb = (zF
105d0 69 6c 65 6e 61 6d 65 20 26 26 20 73 74 72 63 6d  ilename && strcm
105e0 70 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 22 3a 6d  p(zFilename, ":m
105f0 65 6d 6f 72 79 3a 22 29 3d 3d 30 29 0a 20 20 20  emory:")==0).   
10600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10610 20 20 20 20 7c 7c 20 28 69 73 54 65 6d 70 44 62      || (isTempDb
10620 20 26 26 20 73 71 6c 69 74 65 33 54 65 6d 70 49   && sqlite3TempI
10630 6e 4d 65 6d 6f 72 79 28 64 62 29 29 0a 20 20 20  nMemory(db)).   
10640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10650 20 20 20 20 7c 7c 20 28 76 66 73 46 6c 61 67 73      || (vfsFlags
10660 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d   & SQLITE_OPEN_M
10670 45 4d 4f 52 59 29 21 3d 30 3b 0a 23 65 6e 64 69  EMORY)!=0;.#endi
10680 66 0a 0a 20 20 61 73 73 65 72 74 28 20 64 62 21  f..  assert( db!
10690 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
106a0 70 56 66 73 21 3d 30 20 29 3b 0a 20 20 61 73 73  pVfs!=0 );.  ass
106b0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
106c0 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65  ex_held(db->mute
106d0 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
106e0 28 66 6c 61 67 73 26 30 78 66 66 29 3d 3d 66 6c  (flags&0xff)==fl
106f0 61 67 73 20 29 3b 20 20 20 2f 2a 20 66 6c 61 67  ags );   /* flag
10700 73 20 66 69 74 20 69 6e 20 38 20 62 69 74 73 20  s fit in 8 bits 
10710 2a 2f 0a 0a 20 20 2f 2a 20 4f 6e 6c 79 20 61 20  */..  /* Only a 
10720 42 54 52 45 45 5f 53 49 4e 47 4c 45 20 64 61 74  BTREE_SINGLE dat
10730 61 62 61 73 65 20 63 61 6e 20 62 65 20 42 54 52  abase can be BTR
10740 45 45 5f 55 4e 4f 52 44 45 52 45 44 20 2a 2f 0a  EE_UNORDERED */.
10750 20 20 61 73 73 65 72 74 28 20 28 66 6c 61 67 73    assert( (flags
10760 20 26 20 42 54 52 45 45 5f 55 4e 4f 52 44 45 52   & BTREE_UNORDER
10770 45 44 29 3d 3d 30 20 7c 7c 20 28 66 6c 61 67 73  ED)==0 || (flags
10780 20 26 20 42 54 52 45 45 5f 53 49 4e 47 4c 45 29   & BTREE_SINGLE)
10790 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 41 20 42  !=0 );..  /* A B
107a0 54 52 45 45 5f 53 49 4e 47 4c 45 20 64 61 74 61  TREE_SINGLE data
107b0 62 61 73 65 20 69 73 20 61 6c 77 61 79 73 20 61  base is always a
107c0 20 74 65 6d 70 6f 72 61 72 79 20 61 6e 64 2f 6f   temporary and/o
107d0 72 20 65 70 68 65 6d 65 72 61 6c 20 2a 2f 0a 20  r ephemeral */. 
107e0 20 61 73 73 65 72 74 28 20 28 66 6c 61 67 73 20   assert( (flags 
107f0 26 20 42 54 52 45 45 5f 53 49 4e 47 4c 45 29 3d  & BTREE_SINGLE)=
10800 3d 30 20 7c 7c 20 69 73 54 65 6d 70 44 62 20 29  =0 || isTempDb )
10810 3b 0a 0a 20 20 69 66 28 20 69 73 4d 65 6d 64 62  ;..  if( isMemdb
10820 20 29 7b 0a 20 20 20 20 66 6c 61 67 73 20 7c 3d   ){.    flags |=
10830 20 42 54 52 45 45 5f 4d 45 4d 4f 52 59 3b 0a 20   BTREE_MEMORY;. 
10840 20 7d 0a 20 20 69 66 28 20 28 76 66 73 46 6c 61   }.  if( (vfsFla
10850 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
10860 5f 4d 41 49 4e 5f 44 42 29 21 3d 30 20 26 26 20  _MAIN_DB)!=0 && 
10870 28 69 73 4d 65 6d 64 62 20 7c 7c 20 69 73 54 65  (isMemdb || isTe
10880 6d 70 44 62 29 20 29 7b 0a 20 20 20 20 76 66 73  mpDb) ){.    vfs
10890 46 6c 61 67 73 20 3d 20 28 76 66 73 46 6c 61 67  Flags = (vfsFlag
108a0 73 20 26 20 7e 53 51 4c 49 54 45 5f 4f 50 45 4e  s & ~SQLITE_OPEN
108b0 5f 4d 41 49 4e 5f 44 42 29 20 7c 20 53 51 4c 49  _MAIN_DB) | SQLI
108c0 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 3b  TE_OPEN_TEMP_DB;
108d0 0a 20 20 7d 0a 20 20 70 20 3d 20 73 71 6c 69 74  .  }.  p = sqlit
108e0 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a  e3MallocZero(siz
108f0 65 6f 66 28 42 74 72 65 65 29 29 3b 0a 20 20 69  eof(Btree));.  i
10900 66 28 20 21 70 20 29 7b 0a 20 20 20 20 72 65 74  f( !p ){.    ret
10910 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
10920 3b 0a 20 20 7d 0a 20 20 70 2d 3e 69 6e 54 72 61  ;.  }.  p->inTra
10930 6e 73 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b  ns = TRANS_NONE;
10940 0a 20 20 70 2d 3e 64 62 20 3d 20 64 62 3b 0a 23  .  p->db = db;.#
10950 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
10960 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a  IT_SHARED_CACHE.
10970 20 20 70 2d 3e 6c 6f 63 6b 2e 70 42 74 72 65 65    p->lock.pBtree
10980 20 3d 20 70 3b 0a 20 20 70 2d 3e 6c 6f 63 6b 2e   = p;.  p->lock.
10990 69 54 61 62 6c 65 20 3d 20 31 3b 0a 23 65 6e 64  iTable = 1;.#end
109a0 69 66 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  if..#if !defined
109b0 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41  (SQLITE_OMIT_SHA
109c0 52 45 44 5f 43 41 43 48 45 29 20 26 26 20 21 64  RED_CACHE) && !d
109d0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
109e0 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20 2f 2a 0a  IT_DISKIO).  /*.
109f0 20 20 2a 2a 20 49 66 20 74 68 69 73 20 42 74 72    ** If this Btr
10a00 65 65 20 69 73 20 61 20 63 61 6e 64 69 64 61 74  ee is a candidat
10a10 65 20 66 6f 72 20 73 68 61 72 65 64 20 63 61 63  e for shared cac
10a20 68 65 2c 20 74 72 79 20 74 6f 20 66 69 6e 64 20  he, try to find 
10a30 61 6e 0a 20 20 2a 2a 20 65 78 69 73 74 69 6e 67  an.  ** existing
10a40 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74   BtShared object
10a50 20 74 68 61 74 20 77 65 20 63 61 6e 20 73 68 61   that we can sha
10a60 72 65 20 77 69 74 68 0a 20 20 2a 2f 0a 20 20 69  re with.  */.  i
10a70 66 28 20 69 73 54 65 6d 70 44 62 3d 3d 30 20 26  f( isTempDb==0 &
10a80 26 20 28 69 73 4d 65 6d 64 62 3d 3d 30 20 7c 7c  & (isMemdb==0 ||
10a90 20 28 76 66 73 46 6c 61 67 73 26 53 51 4c 49 54   (vfsFlags&SQLIT
10aa0 45 5f 4f 50 45 4e 5f 55 52 49 29 21 3d 30 29 20  E_OPEN_URI)!=0) 
10ab0 29 7b 0a 20 20 20 20 69 66 28 20 76 66 73 46 6c  ){.    if( vfsFl
10ac0 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
10ad0 4e 5f 53 48 41 52 45 44 43 41 43 48 45 20 29 7b  N_SHAREDCACHE ){
10ae0 0a 20 20 20 20 20 20 69 6e 74 20 6e 46 69 6c 65  .      int nFile
10af0 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74  name = sqlite3St
10b00 72 6c 65 6e 33 30 28 7a 46 69 6c 65 6e 61 6d 65  rlen30(zFilename
10b10 29 2b 31 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e  )+1;.      int n
10b20 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 70  FullPathname = p
10b30 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b  Vfs->mxPathname+
10b40 31 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  1;.      char *z
10b50 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73  FullPathname = s
10b60 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 4d 41 58  qlite3Malloc(MAX
10b70 28 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 6e  (nFullPathname,n
10b80 46 69 6c 65 6e 61 6d 65 29 29 3b 0a 20 20 20 20  Filename));.    
10b90 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20 73    MUTEX_LOGIC( s
10ba0 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75  qlite3_mutex *mu
10bb0 74 65 78 53 68 61 72 65 64 3b 20 29 0a 0a 20 20  texShared; )..  
10bc0 20 20 20 20 70 2d 3e 73 68 61 72 61 62 6c 65 20      p->sharable 
10bd0 3d 20 31 3b 0a 20 20 20 20 20 20 69 66 28 20 21  = 1;.      if( !
10be0 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 29 7b  zFullPathname ){
10bf0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
10c00 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20 20 20  _free(p);.      
10c10 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
10c20 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20  NOMEM;.      }. 
10c30 20 20 20 20 20 69 66 28 20 69 73 4d 65 6d 64 62       if( isMemdb
10c40 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63   ){.        memc
10c50 70 79 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  py(zFullPathname
10c60 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 46 69  , zFilename, nFi
10c70 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d  lename);.      }
10c80 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63  else{.        rc
10c90 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 75 6c 6c   = sqlite3OsFull
10ca0 50 61 74 68 6e 61 6d 65 28 70 56 66 73 2c 20 7a  Pathname(pVfs, z
10cb0 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 20 20 20  Filename,.      
10cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 46 75               nFu
10ce0 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 7a 46 75 6c  llPathname, zFul
10cf0 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  lPathname);.    
10d00 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
10d10 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
10d20 66 72 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61  free(zFullPathna
10d30 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  me);.          s
10d40 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
10d50 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
10d60 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   rc;.        }. 
10d70 20 20 20 20 20 7d 0a 23 69 66 20 53 51 4c 49 54       }.#if SQLIT
10d80 45 5f 54 48 52 45 41 44 53 41 46 45 0a 20 20 20  E_THREADSAFE.   
10d90 20 20 20 6d 75 74 65 78 4f 70 65 6e 20 3d 20 73     mutexOpen = s
10da0 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63  qlite3MutexAlloc
10db0 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54  (SQLITE_MUTEX_ST
10dc0 41 54 49 43 5f 4f 50 45 4e 29 3b 0a 20 20 20 20  ATIC_OPEN);.    
10dd0 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
10de0 65 6e 74 65 72 28 6d 75 74 65 78 4f 70 65 6e 29  enter(mutexOpen)
10df0 3b 0a 20 20 20 20 20 20 6d 75 74 65 78 53 68 61  ;.      mutexSha
10e00 72 65 64 20 3d 20 73 71 6c 69 74 65 33 4d 75 74  red = sqlite3Mut
10e10 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d  exAlloc(SQLITE_M
10e20 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54  UTEX_STATIC_MAST
10e30 45 52 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ER);.      sqlit
10e40 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d  e3_mutex_enter(m
10e50 75 74 65 78 53 68 61 72 65 64 29 3b 0a 23 65 6e  utexShared);.#en
10e60 64 69 66 0a 20 20 20 20 20 20 66 6f 72 28 70 42  dif.      for(pB
10e70 74 3d 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65  t=GLOBAL(BtShare
10e80 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64  d*,sqlite3Shared
10e90 43 61 63 68 65 4c 69 73 74 29 3b 20 70 42 74 3b  CacheList); pBt;
10ea0 20 70 42 74 3d 70 42 74 2d 3e 70 4e 65 78 74 29   pBt=pBt->pNext)
10eb0 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
10ec0 28 20 70 42 74 2d 3e 6e 52 65 66 3e 30 20 29 3b  ( pBt->nRef>0 );
10ed0 0a 20 20 20 20 20 20 20 20 69 66 28 20 30 3d 3d  .        if( 0==
10ee0 73 74 72 63 6d 70 28 7a 46 75 6c 6c 50 61 74 68  strcmp(zFullPath
10ef0 6e 61 6d 65 2c 20 73 71 6c 69 74 65 33 50 61 67  name, sqlite3Pag
10f00 65 72 46 69 6c 65 6e 61 6d 65 28 70 42 74 2d 3e  erFilename(pBt->
10f10 70 50 61 67 65 72 2c 20 30 29 29 0a 20 20 20 20  pPager, 0)).    
10f20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
10f30 73 71 6c 69 74 65 33 50 61 67 65 72 56 66 73 28  sqlite3PagerVfs(
10f40 70 42 74 2d 3e 70 50 61 67 65 72 29 3d 3d 70 56  pBt->pPager)==pV
10f50 66 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  fs ){.          
10f60 69 6e 74 20 69 44 62 3b 0a 20 20 20 20 20 20 20  int iDb;.       
10f70 20 20 20 66 6f 72 28 69 44 62 3d 64 62 2d 3e 6e     for(iDb=db->n
10f80 44 62 2d 31 3b 20 69 44 62 3e 3d 30 3b 20 69 44  Db-1; iDb>=0; iD
10f90 62 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20 20 20  b--){.          
10fa0 20 20 42 74 72 65 65 20 2a 70 45 78 69 73 74 69    Btree *pExisti
10fb0 6e 67 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62  ng = db->aDb[iDb
10fc0 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 20 20 20  ].pBt;.         
10fd0 20 20 20 69 66 28 20 70 45 78 69 73 74 69 6e 67     if( pExisting
10fe0 20 26 26 20 70 45 78 69 73 74 69 6e 67 2d 3e 70   && pExisting->p
10ff0 42 74 3d 3d 70 42 74 20 29 7b 0a 20 20 20 20 20  Bt==pBt ){.     
11000 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
11010 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74  _mutex_leave(mut
11020 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20  exShared);.     
11030 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
11040 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74  _mutex_leave(mut
11050 65 78 4f 70 65 6e 29 3b 0a 20 20 20 20 20 20 20  exOpen);.       
11060 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
11070 72 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  ree(zFullPathnam
11080 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
11090 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
110a0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
110b0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
110c0 4f 4e 53 54 52 41 49 4e 54 3b 0a 20 20 20 20 20  ONSTRAINT;.     
110d0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
110e0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70     }.          p
110f0 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 20  ->pBt = pBt;.   
11100 20 20 20 20 20 20 20 70 42 74 2d 3e 6e 52 65 66         pBt->nRef
11110 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  ++;.          br
11120 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
11130 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
11140 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
11150 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20  (mutexShared);. 
11160 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
11170 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29  e(zFullPathname)
11180 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53  ;.    }.#ifdef S
11190 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20  QLITE_DEBUG.    
111a0 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 49  else{.      /* I
111b0 6e 20 64 65 62 75 67 20 6d 6f 64 65 2c 20 77 65  n debug mode, we
111c0 20 6d 61 72 6b 20 61 6c 6c 20 70 65 72 73 69 73   mark all persis
111d0 74 65 6e 74 20 64 61 74 61 62 61 73 65 73 20 61  tent databases a
111e0 73 20 73 68 61 72 61 62 6c 65 0a 20 20 20 20 20  s sharable.     
111f0 20 2a 2a 20 65 76 65 6e 20 77 68 65 6e 20 74 68   ** even when th
11200 65 79 20 61 72 65 20 6e 6f 74 2e 20 20 54 68 69  ey are not.  Thi
11210 73 20 65 78 65 72 63 69 73 65 73 20 74 68 65 20  s exercises the 
11220 6c 6f 63 6b 69 6e 67 20 63 6f 64 65 20 61 6e 64  locking code and
11230 0a 20 20 20 20 20 20 2a 2a 20 67 69 76 65 73 20  .      ** gives 
11240 6d 6f 72 65 20 6f 70 70 6f 72 74 75 6e 69 74 79  more opportunity
11250 20 66 6f 72 20 61 73 73 65 72 74 73 28 73 71 6c   for asserts(sql
11260 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
11270 29 29 0a 20 20 20 20 20 20 2a 2a 20 73 74 61 74  )).      ** stat
11280 65 6d 65 6e 74 73 20 74 6f 20 66 69 6e 64 20 6c  ements to find l
11290 6f 63 6b 69 6e 67 20 70 72 6f 62 6c 65 6d 73 2e  ocking problems.
112a0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
112b0 70 2d 3e 73 68 61 72 61 62 6c 65 20 3d 20 31 3b  p->sharable = 1;
112c0 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
112d0 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70  }.#endif.  if( p
112e0 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 0a  Bt==0 ){.    /*.
112f0 20 20 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f      ** The follo
11300 77 69 6e 67 20 61 73 73 65 72 74 73 20 6d 61 6b  wing asserts mak
11310 65 20 73 75 72 65 20 74 68 61 74 20 73 74 72 75  e sure that stru
11320 63 74 75 72 65 73 20 75 73 65 64 20 62 79 20 74  ctures used by t
11330 68 65 20 62 74 72 65 65 20 61 72 65 0a 20 20 20  he btree are.   
11340 20 2a 2a 20 74 68 65 20 72 69 67 68 74 20 73 69   ** the right si
11350 7a 65 2e 20 20 54 68 69 73 20 69 73 20 74 6f 20  ze.  This is to 
11360 67 75 61 72 64 20 61 67 61 69 6e 73 74 20 73 69  guard against si
11370 7a 65 20 63 68 61 6e 67 65 73 20 74 68 61 74 20  ze changes that 
11380 72 65 73 75 6c 74 0a 20 20 20 20 2a 2a 20 77 68  result.    ** wh
11390 65 6e 20 63 6f 6d 70 69 6c 69 6e 67 20 6f 6e 20  en compiling on 
113a0 61 20 64 69 66 66 65 72 65 6e 74 20 61 72 63 68  a different arch
113b0 69 74 65 63 74 75 72 65 2e 0a 20 20 20 20 2a 2f  itecture..    */
113c0 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a  .    assert( siz
113d0 65 6f 66 28 69 36 34 29 3d 3d 38 20 29 3b 0a 20  eof(i64)==8 );. 
113e0 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f     assert( sizeo
113f0 66 28 75 36 34 29 3d 3d 38 20 29 3b 0a 20 20 20  f(u64)==8 );.   
11400 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28   assert( sizeof(
11410 75 33 32 29 3d 3d 34 20 29 3b 0a 20 20 20 20 61  u32)==4 );.    a
11420 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 75 31  ssert( sizeof(u1
11430 36 29 3d 3d 32 20 29 3b 0a 20 20 20 20 61 73 73  6)==2 );.    ass
11440 65 72 74 28 20 73 69 7a 65 6f 66 28 50 67 6e 6f  ert( sizeof(Pgno
11450 29 3d 3d 34 20 29 3b 0a 20 20 0a 20 20 20 20 70  )==4 );.  .    p
11460 42 74 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  Bt = sqlite3Mall
11470 6f 63 5a 65 72 6f 28 20 73 69 7a 65 6f 66 28 2a  ocZero( sizeof(*
11480 70 42 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20  pBt) );.    if( 
11490 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  pBt==0 ){.      
114a0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
114b0 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 74  M;.      goto bt
114c0 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20  ree_open_out;.  
114d0 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c    }.    rc = sql
114e0 69 74 65 33 50 61 67 65 72 4f 70 65 6e 28 70 56  ite3PagerOpen(pV
114f0 66 73 2c 20 26 70 42 74 2d 3e 70 50 61 67 65 72  fs, &pBt->pPager
11500 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20  , zFilename,.   
11510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11520 20 20 20 20 20 20 20 45 58 54 52 41 5f 53 49 5a         EXTRA_SIZ
11530 45 2c 20 66 6c 61 67 73 2c 20 76 66 73 46 6c 61  E, flags, vfsFla
11540 67 73 2c 20 70 61 67 65 52 65 69 6e 69 74 29 3b  gs, pageReinit);
11550 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
11560 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
11570 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 4d  sqlite3PagerSetM
11580 6d 61 70 4c 69 6d 69 74 28 70 42 74 2d 3e 70 50  mapLimit(pBt->pP
11590 61 67 65 72 2c 20 64 62 2d 3e 73 7a 4d 6d 61 70  ager, db->szMmap
115a0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
115b0 6c 69 74 65 33 50 61 67 65 72 52 65 61 64 46 69  lite3PagerReadFi
115c0 6c 65 68 65 61 64 65 72 28 70 42 74 2d 3e 70 50  leheader(pBt->pP
115d0 61 67 65 72 2c 73 69 7a 65 6f 66 28 7a 44 62 48  ager,sizeof(zDbH
115e0 65 61 64 65 72 29 2c 7a 44 62 48 65 61 64 65 72  eader),zDbHeader
115f0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
11600 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
11610 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 74 72  {.      goto btr
11620 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20  ee_open_out;.   
11630 20 7d 0a 20 20 20 20 70 42 74 2d 3e 6f 70 65 6e   }.    pBt->open
11640 46 6c 61 67 73 20 3d 20 28 75 38 29 66 6c 61 67  Flags = (u8)flag
11650 73 3b 0a 20 20 20 20 70 42 74 2d 3e 64 62 20 3d  s;.    pBt->db =
11660 20 64 62 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   db;.    sqlite3
11670 50 61 67 65 72 53 65 74 42 75 73 79 68 61 6e 64  PagerSetBusyhand
11680 6c 65 72 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  ler(pBt->pPager,
11690 20 62 74 72 65 65 49 6e 76 6f 6b 65 42 75 73 79   btreeInvokeBusy
116a0 48 61 6e 64 6c 65 72 2c 20 70 42 74 29 3b 0a 20  Handler, pBt);. 
116b0 20 20 20 70 2d 3e 70 42 74 20 3d 20 70 42 74 3b     p->pBt = pBt;
116c0 0a 20 20 0a 20 20 20 20 70 42 74 2d 3e 70 43 75  .  .    pBt->pCu
116d0 72 73 6f 72 20 3d 20 30 3b 0a 20 20 20 20 70 42  rsor = 0;.    pB
116e0 74 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a 20  t->pPage1 = 0;. 
116f0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 50 61     if( sqlite3Pa
11700 67 65 72 49 73 72 65 61 64 6f 6e 6c 79 28 70 42  gerIsreadonly(pB
11710 74 2d 3e 70 50 61 67 65 72 29 20 29 20 70 42 74  t->pPager) ) pBt
11720 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54  ->btsFlags |= BT
11730 53 5f 52 45 41 44 5f 4f 4e 4c 59 3b 0a 23 69 66  S_READ_ONLY;.#if
11740 64 65 66 20 53 51 4c 49 54 45 5f 53 45 43 55 52  def SQLITE_SECUR
11750 45 5f 44 45 4c 45 54 45 0a 20 20 20 20 70 42 74  E_DELETE.    pBt
11760 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54  ->btsFlags |= BT
11770 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 3b  S_SECURE_DELETE;
11780 0a 23 65 6e 64 69 66 0a 20 20 20 20 2f 2a 20 45  .#endif.    /* E
11790 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 31  VIDENCE-OF: R-51
117a0 38 37 33 2d 33 39 36 31 38 20 54 68 65 20 70 61  873-39618 The pa
117b0 67 65 20 73 69 7a 65 20 66 6f 72 20 61 20 64 61  ge size for a da
117c0 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 0a 20  tabase file is. 
117d0 20 20 20 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64     ** determined
117e0 20 62 79 20 74 68 65 20 32 2d 62 79 74 65 20 69   by the 2-byte i
117f0 6e 74 65 67 65 72 20 6c 6f 63 61 74 65 64 20 61  nteger located a
11800 74 20 61 6e 20 6f 66 66 73 65 74 20 6f 66 20 31  t an offset of 1
11810 36 20 62 79 74 65 73 20 66 72 6f 6d 0a 20 20 20  6 bytes from.   
11820 20 2a 2a 20 74 68 65 20 62 65 67 69 6e 6e 69 6e   ** the beginnin
11830 67 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  g of the databas
11840 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 70  e file. */.    p
11850 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 28  Bt->pageSize = (
11860 7a 44 62 48 65 61 64 65 72 5b 31 36 5d 3c 3c 38  zDbHeader[16]<<8
11870 29 20 7c 20 28 7a 44 62 48 65 61 64 65 72 5b 31  ) | (zDbHeader[1
11880 37 5d 3c 3c 31 36 29 3b 0a 20 20 20 20 69 66 28  7]<<16);.    if(
11890 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c 35   pBt->pageSize<5
118a0 31 32 20 7c 7c 20 70 42 74 2d 3e 70 61 67 65 53  12 || pBt->pageS
118b0 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 50  ize>SQLITE_MAX_P
118c0 41 47 45 5f 53 49 5a 45 0a 20 20 20 20 20 20 20  AGE_SIZE.       
118d0 20 20 7c 7c 20 28 28 70 42 74 2d 3e 70 61 67 65    || ((pBt->page
118e0 53 69 7a 65 2d 31 29 26 70 42 74 2d 3e 70 61 67  Size-1)&pBt->pag
118f0 65 53 69 7a 65 29 21 3d 30 20 29 7b 0a 20 20 20  eSize)!=0 ){.   
11900 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65     pBt->pageSize
11910 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51   = 0;.#ifndef SQ
11920 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
11930 43 55 55 4d 0a 20 20 20 20 20 20 2f 2a 20 49 66  CUUM.      /* If
11940 20 74 68 65 20 6d 61 67 69 63 20 6e 61 6d 65 20   the magic name 
11950 22 3a 6d 65 6d 6f 72 79 3a 22 20 77 69 6c 6c 20  ":memory:" will 
11960 63 72 65 61 74 65 20 61 6e 20 69 6e 2d 6d 65 6d  create an in-mem
11970 6f 72 79 20 64 61 74 61 62 61 73 65 2c 20 74 68  ory database, th
11980 65 6e 0a 20 20 20 20 20 20 2a 2a 20 6c 65 61 76  en.      ** leav
11990 65 20 74 68 65 20 61 75 74 6f 56 61 63 75 75 6d  e the autoVacuum
119a0 20 6d 6f 64 65 20 61 74 20 30 20 28 64 6f 20 6e   mode at 0 (do n
119b0 6f 74 20 61 75 74 6f 2d 76 61 63 75 75 6d 29 2c  ot auto-vacuum),
119c0 20 65 76 65 6e 20 69 66 0a 20 20 20 20 20 20 2a   even if.      *
119d0 2a 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  * SQLITE_DEFAULT
119e0 5f 41 55 54 4f 56 41 43 55 55 4d 20 69 73 20 74  _AUTOVACUUM is t
119f0 72 75 65 2e 20 4f 6e 20 74 68 65 20 6f 74 68 65  rue. On the othe
11a00 72 20 68 61 6e 64 2c 20 69 66 0a 20 20 20 20 20  r hand, if.     
11a10 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   ** SQLITE_OMIT_
11a20 4d 45 4d 4f 52 59 44 42 20 68 61 73 20 62 65 65  MEMORYDB has bee
11a30 6e 20 64 65 66 69 6e 65 64 2c 20 74 68 65 6e 20  n defined, then 
11a40 22 3a 6d 65 6d 6f 72 79 3a 22 20 69 73 20 6a 75  ":memory:" is ju
11a50 73 74 20 61 0a 20 20 20 20 20 20 2a 2a 20 72 65  st a.      ** re
11a60 67 75 6c 61 72 20 66 69 6c 65 2d 6e 61 6d 65 2e  gular file-name.
11a70 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
11a80 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 61 70  e auto-vacuum ap
11a90 70 6c 69 65 73 20 61 73 20 70 65 72 20 6e 6f 72  plies as per nor
11aa0 6d 61 6c 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  mal..      */.  
11ab0 20 20 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d      if( zFilenam
11ac0 65 20 26 26 20 21 69 73 4d 65 6d 64 62 20 29 7b  e && !isMemdb ){
11ad0 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e 61 75  .        pBt->au
11ae0 74 6f 56 61 63 75 75 6d 20 3d 20 28 53 51 4c 49  toVacuum = (SQLI
11af0 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56  TE_DEFAULT_AUTOV
11b00 41 43 55 55 4d 20 3f 20 31 20 3a 20 30 29 3b 0a  ACUUM ? 1 : 0);.
11b10 20 20 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 63          pBt->inc
11b20 72 56 61 63 75 75 6d 20 3d 20 28 53 51 4c 49 54  rVacuum = (SQLIT
11b30 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41  E_DEFAULT_AUTOVA
11b40 43 55 55 4d 3d 3d 32 20 3f 20 31 20 3a 20 30 29  CUUM==2 ? 1 : 0)
11b50 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
11b60 0a 20 20 20 20 20 20 6e 52 65 73 65 72 76 65 20  .      nReserve 
11b70 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 0;.    }else{.
11b80 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43        /* EVIDENC
11b90 45 2d 4f 46 3a 20 52 2d 33 37 34 39 37 2d 34 32  E-OF: R-37497-42
11ba0 34 31 32 20 54 68 65 20 73 69 7a 65 20 6f 66 20  412 The size of 
11bb0 74 68 65 20 72 65 73 65 72 76 65 64 20 72 65 67  the reserved reg
11bc0 69 6f 6e 20 69 73 0a 20 20 20 20 20 20 2a 2a 20  ion is.      ** 
11bd0 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68  determined by th
11be0 65 20 6f 6e 65 2d 62 79 74 65 20 75 6e 73 69 67  e one-byte unsig
11bf0 6e 65 64 20 69 6e 74 65 67 65 72 20 66 6f 75 6e  ned integer foun
11c00 64 20 61 74 20 61 6e 20 6f 66 66 73 65 74 20 6f  d at an offset o
11c10 66 20 32 30 0a 20 20 20 20 20 20 2a 2a 20 69 6e  f 20.      ** in
11c20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
11c30 66 69 6c 65 20 68 65 61 64 65 72 2e 20 2a 2f 0a  file header. */.
11c40 20 20 20 20 20 20 6e 52 65 73 65 72 76 65 20 3d        nReserve =
11c50 20 7a 44 62 48 65 61 64 65 72 5b 32 30 5d 3b 0a   zDbHeader[20];.
11c60 20 20 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c        pBt->btsFl
11c70 61 67 73 20 7c 3d 20 42 54 53 5f 50 41 47 45 53  ags |= BTS_PAGES
11c80 49 5a 45 5f 46 49 58 45 44 3b 0a 23 69 66 6e 64  IZE_FIXED;.#ifnd
11c90 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
11ca0 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20  UTOVACUUM.      
11cb0 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
11cc0 3d 20 28 67 65 74 34 62 79 74 65 28 26 7a 44 62  = (get4byte(&zDb
11cd0 48 65 61 64 65 72 5b 33 36 20 2b 20 34 2a 34 5d  Header[36 + 4*4]
11ce0 29 3f 31 3a 30 29 3b 0a 20 20 20 20 20 20 70 42  )?1:0);.      pB
11cf0 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20  t->incrVacuum = 
11d00 28 67 65 74 34 62 79 74 65 28 26 7a 44 62 48 65  (get4byte(&zDbHe
11d10 61 64 65 72 5b 33 36 20 2b 20 37 2a 34 5d 29 3f  ader[36 + 7*4])?
11d20 31 3a 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  1:0);.#endif.   
11d30 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69   }.    rc = sqli
11d40 74 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73  te3PagerSetPages
11d50 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  ize(pBt->pPager,
11d60 20 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2c   &pBt->pageSize,
11d70 20 6e 52 65 73 65 72 76 65 29 3b 0a 20 20 20 20   nReserve);.    
11d80 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62 74  if( rc ) goto bt
11d90 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20  ree_open_out;.  
11da0 20 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a    pBt->usableSiz
11db0 65 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  e = pBt->pageSiz
11dc0 65 20 2d 20 6e 52 65 73 65 72 76 65 3b 0a 20 20  e - nReserve;.  
11dd0 20 20 61 73 73 65 72 74 28 20 28 70 42 74 2d 3e    assert( (pBt->
11de0 70 61 67 65 53 69 7a 65 20 26 20 37 29 3d 3d 30  pageSize & 7)==0
11df0 20 29 3b 20 20 2f 2a 20 38 2d 62 79 74 65 20 61   );  /* 8-byte a
11e00 6c 69 67 6e 6d 65 6e 74 20 6f 66 20 70 61 67 65  lignment of page
11e10 53 69 7a 65 20 2a 2f 0a 20 20 20 0a 23 69 66 20  Size */.   .#if 
11e20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
11e30 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
11e40 45 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53  E) && !defined(S
11e50 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49  QLITE_OMIT_DISKI
11e60 4f 29 0a 20 20 20 20 2f 2a 20 41 64 64 20 74 68  O).    /* Add th
11e70 65 20 6e 65 77 20 42 74 53 68 61 72 65 64 20 6f  e new BtShared o
11e80 62 6a 65 63 74 20 74 6f 20 74 68 65 20 6c 69 6e  bject to the lin
11e90 6b 65 64 20 6c 69 73 74 20 73 68 61 72 61 62 6c  ked list sharabl
11ea0 65 20 42 74 53 68 61 72 65 64 73 2e 0a 20 20 20  e BtShareds..   
11eb0 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 73   */.    if( p->s
11ec0 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 20  harable ){.     
11ed0 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20 73 71   MUTEX_LOGIC( sq
11ee0 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74  lite3_mutex *mut
11ef0 65 78 53 68 61 72 65 64 3b 20 29 0a 20 20 20 20  exShared; ).    
11f00 20 20 70 42 74 2d 3e 6e 52 65 66 20 3d 20 31 3b    pBt->nRef = 1;
11f10 0a 20 20 20 20 20 20 4d 55 54 45 58 5f 4c 4f 47  .      MUTEX_LOG
11f20 49 43 28 20 6d 75 74 65 78 53 68 61 72 65 64 20  IC( mutexShared 
11f30 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c  = sqlite3MutexAl
11f40 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
11f50 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b  _STATIC_MASTER);
11f60 29 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c 49  ).      if( SQLI
11f70 54 45 5f 54 48 52 45 41 44 53 41 46 45 20 26 26  TE_THREADSAFE &&
11f80 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
11f90 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74 65 78 20  nfig.bCoreMutex 
11fa0 29 7b 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e  ){.        pBt->
11fb0 6d 75 74 65 78 20 3d 20 73 71 6c 69 74 65 33 4d  mutex = sqlite3M
11fc0 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45  utexAlloc(SQLITE
11fd0 5f 4d 55 54 45 58 5f 46 41 53 54 29 3b 0a 20 20  _MUTEX_FAST);.  
11fe0 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6d        if( pBt->m
11ff0 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20  utex==0 ){.     
12000 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
12010 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20  _NOMEM;.        
12020 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c    db->mallocFail
12030 65 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ed = 0;.        
12040 20 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65    goto btree_ope
12050 6e 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d  n_out;.        }
12060 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
12070 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
12080 65 72 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b  er(mutexShared);
12090 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 4e 65 78  .      pBt->pNex
120a0 74 20 3d 20 47 4c 4f 42 41 4c 28 42 74 53 68 61  t = GLOBAL(BtSha
120b0 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72  red*,sqlite3Shar
120c0 65 64 43 61 63 68 65 4c 69 73 74 29 3b 0a 20 20  edCacheList);.  
120d0 20 20 20 20 47 4c 4f 42 41 4c 28 42 74 53 68 61      GLOBAL(BtSha
120e0 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72  red*,sqlite3Shar
120f0 65 64 43 61 63 68 65 4c 69 73 74 29 20 3d 20 70  edCacheList) = p
12100 42 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  Bt;.      sqlite
12110 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75  3_mutex_leave(mu
12120 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20  texShared);.    
12130 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 23 69  }.#endif.  }..#i
12140 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
12150 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
12160 43 48 45 29 20 26 26 20 21 64 65 66 69 6e 65 64  CHE) && !defined
12170 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53  (SQLITE_OMIT_DIS
12180 4b 49 4f 29 0a 20 20 2f 2a 20 49 66 20 74 68 65  KIO).  /* If the
12190 20 6e 65 77 20 42 74 72 65 65 20 75 73 65 73 20   new Btree uses 
121a0 61 20 73 68 61 72 61 62 6c 65 20 70 42 74 53 68  a sharable pBtSh
121b0 61 72 65 64 2c 20 74 68 65 6e 20 6c 69 6e 6b 20  ared, then link 
121c0 74 68 65 20 6e 65 77 0a 20 20 2a 2a 20 42 74 72  the new.  ** Btr
121d0 65 65 20 69 6e 74 6f 20 74 68 65 20 6c 69 73 74  ee into the list
121e0 20 6f 66 20 61 6c 6c 20 73 68 61 72 61 62 6c 65   of all sharable
121f0 20 42 74 72 65 65 73 20 66 6f 72 20 74 68 65 20   Btrees for the 
12200 73 61 6d 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  same connection.
12210 0a 20 20 2a 2a 20 54 68 65 20 6c 69 73 74 20 69  .  ** The list i
12220 73 20 6b 65 70 74 20 69 6e 20 61 73 63 65 6e 64  s kept in ascend
12230 69 6e 67 20 6f 72 64 65 72 20 62 79 20 70 42 74  ing order by pBt
12240 20 61 64 64 72 65 73 73 2e 0a 20 20 2a 2f 0a 20   address..  */. 
12250 20 69 66 28 20 70 2d 3e 73 68 61 72 61 62 6c 65   if( p->sharable
12260 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
12270 20 20 20 42 74 72 65 65 20 2a 70 53 69 62 3b 0a     Btree *pSib;.
12280 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64      for(i=0; i<d
12290 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
122a0 20 20 20 20 69 66 28 20 28 70 53 69 62 20 3d 20      if( (pSib = 
122b0 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 29 21  db->aDb[i].pBt)!
122c0 3d 30 20 26 26 20 70 53 69 62 2d 3e 73 68 61 72  =0 && pSib->shar
122d0 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20  able ){.        
122e0 77 68 69 6c 65 28 20 70 53 69 62 2d 3e 70 50 72  while( pSib->pPr
122f0 65 76 20 29 7b 20 70 53 69 62 20 3d 20 70 53 69  ev ){ pSib = pSi
12300 62 2d 3e 70 50 72 65 76 3b 20 7d 0a 20 20 20 20  b->pPrev; }.    
12310 20 20 20 20 69 66 28 20 70 2d 3e 70 42 74 3c 70      if( p->pBt<p
12320 53 69 62 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20  Sib->pBt ){.    
12330 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d        p->pNext =
12340 20 70 53 69 62 3b 0a 20 20 20 20 20 20 20 20 20   pSib;.         
12350 20 70 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20   p->pPrev = 0;. 
12360 20 20 20 20 20 20 20 20 20 70 53 69 62 2d 3e 70           pSib->p
12370 50 72 65 76 20 3d 20 70 3b 0a 20 20 20 20 20 20  Prev = p;.      
12380 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
12390 20 20 20 77 68 69 6c 65 28 20 70 53 69 62 2d 3e     while( pSib->
123a0 70 4e 65 78 74 20 26 26 20 70 53 69 62 2d 3e 70  pNext && pSib->p
123b0 4e 65 78 74 2d 3e 70 42 74 3c 70 2d 3e 70 42 74  Next->pBt<p->pBt
123c0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
123d0 70 53 69 62 20 3d 20 70 53 69 62 2d 3e 70 4e 65  pSib = pSib->pNe
123e0 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  xt;.          }.
123f0 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65            p->pNe
12400 78 74 20 3d 20 70 53 69 62 2d 3e 70 4e 65 78 74  xt = pSib->pNext
12410 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70  ;.          p->p
12420 50 72 65 76 20 3d 20 70 53 69 62 3b 0a 20 20 20  Prev = pSib;.   
12430 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 4e         if( p->pN
12440 65 78 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ext ){.         
12450 20 20 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72     p->pNext->pPr
12460 65 76 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20  ev = p;.        
12470 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 53    }.          pS
12480 69 62 2d 3e 70 4e 65 78 74 20 3d 20 70 3b 0a 20  ib->pNext = p;. 
12490 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
124a0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
124b0 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
124c0 0a 20 20 2a 70 70 42 74 72 65 65 20 3d 20 70 3b  .  *ppBtree = p;
124d0 0a 0a 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74  ..btree_open_out
124e0 3a 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  :.  if( rc!=SQLI
124f0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
12500 20 70 42 74 20 26 26 20 70 42 74 2d 3e 70 50 61   pBt && pBt->pPa
12510 67 65 72 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ger ){.      sql
12520 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28 70  ite3PagerClose(p
12530 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20  Bt->pPager);.   
12540 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66   }.    sqlite3_f
12550 72 65 65 28 70 42 74 29 3b 0a 20 20 20 20 73 71  ree(pBt);.    sq
12560 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20  lite3_free(p);. 
12570 20 20 20 2a 70 70 42 74 72 65 65 20 3d 20 30 3b     *ppBtree = 0;
12580 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
12590 20 49 66 20 74 68 65 20 42 2d 54 72 65 65 20 77   If the B-Tree w
125a0 61 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  as successfully 
125b0 6f 70 65 6e 65 64 2c 20 73 65 74 20 74 68 65 20  opened, set the 
125c0 70 61 67 65 72 2d 63 61 63 68 65 20 73 69 7a 65  pager-cache size
125d0 20 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 64   to the.    ** d
125e0 65 66 61 75 6c 74 20 76 61 6c 75 65 2e 20 45 78  efault value. Ex
125f0 63 65 70 74 2c 20 77 68 65 6e 20 6f 70 65 6e 69  cept, when openi
12600 6e 67 20 6f 6e 20 61 6e 20 65 78 69 73 74 69 6e  ng on an existin
12610 67 20 73 68 61 72 65 64 20 70 61 67 65 72 2d 63  g shared pager-c
12620 61 63 68 65 2c 0a 20 20 20 20 2a 2a 20 64 6f 20  ache,.    ** do 
12630 6e 6f 74 20 63 68 61 6e 67 65 20 74 68 65 20 70  not change the p
12640 61 67 65 72 2d 63 61 63 68 65 20 73 69 7a 65 2e  ager-cache size.
12650 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
12660 73 71 6c 69 74 65 33 42 74 72 65 65 53 63 68 65  sqlite3BtreeSche
12670 6d 61 28 70 2c 20 30 2c 20 30 29 3d 3d 30 20 29  ma(p, 0, 0)==0 )
12680 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  {.      sqlite3P
12690 61 67 65 72 53 65 74 43 61 63 68 65 73 69 7a 65  agerSetCachesize
126a0 28 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 2c  (p->pBt->pPager,
126b0 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
126c0 43 41 43 48 45 5f 53 49 5a 45 29 3b 0a 20 20 20  CACHE_SIZE);.   
126d0 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6d 75 74   }.  }.  if( mut
126e0 65 78 4f 70 65 6e 20 29 7b 0a 20 20 20 20 61 73  exOpen ){.    as
126f0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
12700 74 65 78 5f 68 65 6c 64 28 6d 75 74 65 78 4f 70  tex_held(mutexOp
12710 65 6e 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  en) );.    sqlit
12720 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d  e3_mutex_leave(m
12730 75 74 65 78 4f 70 65 6e 29 3b 0a 20 20 7d 0a 20  utexOpen);.  }. 
12740 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
12750 2a 0a 2a 2a 20 44 65 63 72 65 6d 65 6e 74 20 74  *.** Decrement t
12760 68 65 20 42 74 53 68 61 72 65 64 2e 6e 52 65 66  he BtShared.nRef
12770 20 63 6f 75 6e 74 65 72 2e 20 20 57 68 65 6e 20   counter.  When 
12780 69 74 20 72 65 61 63 68 65 73 20 7a 65 72 6f 2c  it reaches zero,
12790 0a 2a 2a 20 72 65 6d 6f 76 65 20 74 68 65 20 42  .** remove the B
127a0 74 53 68 61 72 65 64 20 73 74 72 75 63 74 75 72  tShared structur
127b0 65 20 66 72 6f 6d 20 74 68 65 20 73 68 61 72 69  e from the shari
127c0 6e 67 20 6c 69 73 74 2e 20 20 52 65 74 75 72 6e  ng list.  Return
127d0 0a 2a 2a 20 74 72 75 65 20 69 66 20 74 68 65 20  .** true if the 
127e0 42 74 53 68 61 72 65 64 2e 6e 52 65 66 20 63 6f  BtShared.nRef co
127f0 75 6e 74 65 72 20 72 65 61 63 68 65 73 20 7a 65  unter reaches ze
12800 72 6f 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a  ro and return.**
12810 20 66 61 6c 73 65 20 69 66 20 69 74 20 69 73 20   false if it is 
12820 73 74 69 6c 6c 20 70 6f 73 69 74 69 76 65 2e 0a  still positive..
12830 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65  */.static int re
12840 6d 6f 76 65 46 72 6f 6d 53 68 61 72 69 6e 67 4c  moveFromSharingL
12850 69 73 74 28 42 74 53 68 61 72 65 64 20 2a 70 42  ist(BtShared *pB
12860 74 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  t){.#ifndef SQLI
12870 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
12880 41 43 48 45 0a 20 20 4d 55 54 45 58 5f 4c 4f 47  ACHE.  MUTEX_LOG
12890 49 43 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  IC( sqlite3_mute
128a0 78 20 2a 70 4d 61 73 74 65 72 3b 20 29 0a 20 20  x *pMaster; ).  
128b0 42 74 53 68 61 72 65 64 20 2a 70 4c 69 73 74 3b  BtShared *pList;
128c0 0a 20 20 69 6e 74 20 72 65 6d 6f 76 65 64 20 3d  .  int removed =
128d0 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73   0;..  assert( s
128e0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6e 6f 74  qlite3_mutex_not
128f0 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
12900 20 29 3b 0a 20 20 4d 55 54 45 58 5f 4c 4f 47 49   );.  MUTEX_LOGI
12910 43 28 20 70 4d 61 73 74 65 72 20 3d 20 73 71 6c  C( pMaster = sql
12920 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53  ite3MutexAlloc(S
12930 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54  QLITE_MUTEX_STAT
12940 49 43 5f 4d 41 53 54 45 52 29 3b 20 29 0a 20 20  IC_MASTER); ).  
12950 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
12960 74 65 72 28 70 4d 61 73 74 65 72 29 3b 0a 20 20  ter(pMaster);.  
12970 70 42 74 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69  pBt->nRef--;.  i
12980 66 28 20 70 42 74 2d 3e 6e 52 65 66 3c 3d 30 20  f( pBt->nRef<=0 
12990 29 7b 0a 20 20 20 20 69 66 28 20 47 4c 4f 42 41  ){.    if( GLOBA
129a0 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69  L(BtShared*,sqli
129b0 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69  te3SharedCacheLi
129c0 73 74 29 3d 3d 70 42 74 20 29 7b 0a 20 20 20 20  st)==pBt ){.    
129d0 20 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65    GLOBAL(BtShare
129e0 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64  d*,sqlite3Shared
129f0 43 61 63 68 65 4c 69 73 74 29 20 3d 20 70 42 74  CacheList) = pBt
12a00 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 65 6c  ->pNext;.    }el
12a10 73 65 7b 0a 20 20 20 20 20 20 70 4c 69 73 74 20  se{.      pList 
12a20 3d 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65  = GLOBAL(BtShare
12a30 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64  d*,sqlite3Shared
12a40 43 61 63 68 65 4c 69 73 74 29 3b 0a 20 20 20 20  CacheList);.    
12a50 20 20 77 68 69 6c 65 28 20 41 4c 57 41 59 53 28    while( ALWAYS(
12a60 70 4c 69 73 74 29 20 26 26 20 70 4c 69 73 74 2d  pList) && pList-
12a70 3e 70 4e 65 78 74 21 3d 70 42 74 20 29 7b 0a 20  >pNext!=pBt ){. 
12a80 20 20 20 20 20 20 20 70 4c 69 73 74 3d 70 4c 69         pList=pLi
12a90 73 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  st->pNext;.     
12aa0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 41 4c 57   }.      if( ALW
12ab0 41 59 53 28 70 4c 69 73 74 29 20 29 7b 0a 20 20  AYS(pList) ){.  
12ac0 20 20 20 20 20 20 70 4c 69 73 74 2d 3e 70 4e 65        pList->pNe
12ad0 78 74 20 3d 20 70 42 74 2d 3e 70 4e 65 78 74 3b  xt = pBt->pNext;
12ae0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
12af0 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 54 48     if( SQLITE_TH
12b00 52 45 41 44 53 41 46 45 20 29 7b 0a 20 20 20 20  READSAFE ){.    
12b10 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
12b20 66 72 65 65 28 70 42 74 2d 3e 6d 75 74 65 78 29  free(pBt->mutex)
12b30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 6d 6f  ;.    }.    remo
12b40 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 73  ved = 1;.  }.  s
12b50 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
12b60 76 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 72  ve(pMaster);.  r
12b70 65 74 75 72 6e 20 72 65 6d 6f 76 65 64 3b 0a 23  eturn removed;.#
12b80 65 6c 73 65 0a 20 20 72 65 74 75 72 6e 20 31 3b  else.  return 1;
12b90 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
12ba0 20 4d 61 6b 65 20 73 75 72 65 20 70 42 74 2d 3e   Make sure pBt->
12bb0 70 54 6d 70 53 70 61 63 65 20 70 6f 69 6e 74 73  pTmpSpace points
12bc0 20 74 6f 20 61 6e 20 61 6c 6c 6f 63 61 74 69 6f   to an allocatio
12bd0 6e 20 6f 66 20 0a 2a 2a 20 4d 58 5f 43 45 4c 4c  n of .** MX_CELL
12be0 5f 53 49 5a 45 28 70 42 74 29 20 62 79 74 65 73  _SIZE(pBt) bytes
12bf0 20 77 69 74 68 20 61 20 34 2d 62 79 74 65 20 70   with a 4-byte p
12c00 72 65 66 69 78 20 66 6f 72 20 61 20 6c 65 66 74  refix for a left
12c10 2d 63 68 69 6c 64 0a 2a 2a 20 70 6f 69 6e 74 65  -child.** pointe
12c20 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  r..*/.static voi
12c30 64 20 61 6c 6c 6f 63 61 74 65 54 65 6d 70 53 70  d allocateTempSp
12c40 61 63 65 28 42 74 53 68 61 72 65 64 20 2a 70 42  ace(BtShared *pB
12c50 74 29 7b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e  t){.  if( !pBt->
12c60 70 54 6d 70 53 70 61 63 65 20 29 7b 0a 20 20 20  pTmpSpace ){.   
12c70 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20   pBt->pTmpSpace 
12c80 3d 20 73 71 6c 69 74 65 33 50 61 67 65 4d 61 6c  = sqlite3PageMal
12c90 6c 6f 63 28 20 70 42 74 2d 3e 70 61 67 65 53 69  loc( pBt->pageSi
12ca0 7a 65 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 4f 6e  ze );..    /* On
12cb0 65 20 6f 66 20 74 68 65 20 75 73 65 73 20 6f 66  e of the uses of
12cc0 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20   pBt->pTmpSpace 
12cd0 69 73 20 74 6f 20 66 6f 72 6d 61 74 20 63 65 6c  is to format cel
12ce0 6c 73 20 62 65 66 6f 72 65 0a 20 20 20 20 2a 2a  ls before.    **
12cf0 20 69 6e 73 65 72 74 69 6e 67 20 74 68 65 6d 20   inserting them 
12d00 69 6e 74 6f 20 61 20 6c 65 61 66 20 70 61 67 65  into a leaf page
12d10 20 28 66 75 6e 63 74 69 6f 6e 20 66 69 6c 6c 49   (function fillI
12d20 6e 43 65 6c 6c 28 29 29 2e 20 49 66 0a 20 20 20  nCell()). If.   
12d30 20 2a 2a 20 61 20 63 65 6c 6c 20 69 73 20 6c 65   ** a cell is le
12d40 73 73 20 74 68 61 6e 20 34 20 62 79 74 65 73 20  ss than 4 bytes 
12d50 69 6e 20 73 69 7a 65 2c 20 69 74 20 69 73 20 72  in size, it is r
12d60 6f 75 6e 64 65 64 20 75 70 20 74 6f 20 34 20 62  ounded up to 4 b
12d70 79 74 65 73 0a 20 20 20 20 2a 2a 20 62 79 20 74  ytes.    ** by t
12d80 68 65 20 76 61 72 69 6f 75 73 20 72 6f 75 74 69  he various routi
12d90 6e 65 73 20 74 68 61 74 20 6d 61 6e 69 70 75 6c  nes that manipul
12da0 61 74 65 20 62 69 6e 61 72 79 20 63 65 6c 6c 73  ate binary cells
12db0 2e 20 57 68 69 63 68 0a 20 20 20 20 2a 2a 20 63  . Which.    ** c
12dc0 61 6e 20 6d 65 61 6e 20 74 68 61 74 20 66 69 6c  an mean that fil
12dd0 6c 49 6e 43 65 6c 6c 28 29 20 6f 6e 6c 79 20 69  lInCell() only i
12de0 6e 69 74 69 61 6c 69 7a 65 73 20 74 68 65 20 66  nitializes the f
12df0 69 72 73 74 20 32 20 6f 72 20 33 0a 20 20 20 20  irst 2 or 3.    
12e00 2a 2a 20 62 79 74 65 73 20 6f 66 20 70 54 6d 70  ** bytes of pTmp
12e10 53 70 61 63 65 2c 20 62 75 74 20 74 68 61 74 20  Space, but that 
12e20 74 68 65 20 66 69 72 73 74 20 34 20 62 79 74 65  the first 4 byte
12e30 73 20 61 72 65 20 63 6f 70 69 65 64 20 66 72 6f  s are copied fro
12e40 6d 0a 20 20 20 20 2a 2a 20 69 74 20 69 6e 74 6f  m.    ** it into
12e50 20 61 20 64 61 74 61 62 61 73 65 20 70 61 67 65   a database page
12e60 2e 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61 63  . This is not ac
12e70 74 75 61 6c 6c 79 20 61 20 70 72 6f 62 6c 65 6d  tually a problem
12e80 2c 20 62 75 74 20 69 74 0a 20 20 20 20 2a 2a 20  , but it.    ** 
12e90 64 6f 65 73 20 63 61 75 73 65 20 61 20 76 61 6c  does cause a val
12ea0 67 72 69 6e 64 20 65 72 72 6f 72 20 77 68 65 6e  grind error when
12eb0 20 74 68 65 20 31 20 6f 72 20 32 20 62 79 74 65   the 1 or 2 byte
12ec0 73 20 6f 66 20 75 6e 69 74 69 61 6c 69 7a 65 64  s of unitialized
12ed0 20 0a 20 20 20 20 2a 2a 20 64 61 74 61 20 69 73   .    ** data is
12ee0 20 70 61 73 73 65 64 20 74 6f 20 73 79 73 74 65   passed to syste
12ef0 6d 20 63 61 6c 6c 20 77 72 69 74 65 28 29 2e 20  m call write(). 
12f00 53 6f 20 74 6f 20 61 76 6f 69 64 20 74 68 69 73  So to avoid this
12f10 20 65 72 72 6f 72 2c 0a 20 20 20 20 2a 2a 20 7a   error,.    ** z
12f20 65 72 6f 20 74 68 65 20 66 69 72 73 74 20 34 20  ero the first 4 
12f30 62 79 74 65 73 20 6f 66 20 74 65 6d 70 20 73 70  bytes of temp sp
12f40 61 63 65 20 68 65 72 65 2e 0a 20 20 20 20 2a 2a  ace here..    **
12f50 0a 20 20 20 20 2a 2a 20 41 6c 73 6f 3a 20 20 50  .    ** Also:  P
12f60 72 6f 76 69 64 65 20 66 6f 75 72 20 62 79 74 65  rovide four byte
12f70 73 20 6f 66 20 69 6e 69 74 69 61 6c 69 7a 65 64  s of initialized
12f80 20 73 70 61 63 65 20 62 65 66 6f 72 65 20 74 68   space before th
12f90 65 0a 20 20 20 20 2a 2a 20 62 65 67 69 6e 6e 69  e.    ** beginni
12fa0 6e 67 20 6f 66 20 70 54 6d 70 53 70 61 63 65 20  ng of pTmpSpace 
12fb0 61 73 20 61 6e 20 61 72 65 61 20 61 76 61 69 6c  as an area avail
12fc0 61 62 6c 65 20 74 6f 20 70 72 65 70 65 6e 64 20  able to prepend 
12fd0 74 68 65 0a 20 20 20 20 2a 2a 20 6c 65 66 74 2d  the.    ** left-
12fe0 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 20 74 6f  child pointer to
12ff0 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
13000 66 20 61 20 63 65 6c 6c 2e 0a 20 20 20 20 2a 2f  f a cell..    */
13010 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 70 54  .    if( pBt->pT
13020 6d 70 53 70 61 63 65 20 29 7b 0a 20 20 20 20 20  mpSpace ){.     
13030 20 6d 65 6d 73 65 74 28 70 42 74 2d 3e 70 54 6d   memset(pBt->pTm
13040 70 53 70 61 63 65 2c 20 30 2c 20 38 29 3b 0a 20  pSpace, 0, 8);. 
13050 20 20 20 20 20 70 42 74 2d 3e 70 54 6d 70 53 70       pBt->pTmpSp
13060 61 63 65 20 2b 3d 20 34 3b 0a 20 20 20 20 7d 0a  ace += 4;.    }.
13070 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65    }.}../*.** Fre
13080 65 20 74 68 65 20 70 42 74 2d 3e 70 54 6d 70 53  e the pBt->pTmpS
13090 70 61 63 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a  pace allocation.
130a0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
130b0 72 65 65 54 65 6d 70 53 70 61 63 65 28 42 74 53  reeTempSpace(BtS
130c0 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69  hared *pBt){.  i
130d0 66 28 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63  f( pBt->pTmpSpac
130e0 65 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e 70 54  e ){.    pBt->pT
130f0 6d 70 53 70 61 63 65 20 2d 3d 20 34 3b 0a 20 20  mpSpace -= 4;.  
13100 20 20 73 71 6c 69 74 65 33 50 61 67 65 46 72 65    sqlite3PageFre
13110 65 28 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65  e(pBt->pTmpSpace
13120 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70 54 6d 70  );.    pBt->pTmp
13130 53 70 61 63 65 20 3d 20 30 3b 0a 20 20 7d 0a 7d  Space = 0;.  }.}
13140 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e  ../*.** Close an
13150 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 61   open database a
13160 6e 64 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6c  nd invalidate al
13170 6c 20 63 75 72 73 6f 72 73 2e 0a 2a 2f 0a 69 6e  l cursors..*/.in
13180 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c  t sqlite3BtreeCl
13190 6f 73 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  ose(Btree *p){. 
131a0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
131b0 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74 43 75 72   p->pBt;.  BtCur
131c0 73 6f 72 20 2a 70 43 75 72 3b 0a 0a 20 20 2f 2a  sor *pCur;..  /*
131d0 20 43 6c 6f 73 65 20 61 6c 6c 20 63 75 72 73 6f   Close all curso
131e0 72 73 20 6f 70 65 6e 65 64 20 76 69 61 20 74 68  rs opened via th
131f0 69 73 20 68 61 6e 64 6c 65 2e 20 20 2a 2f 0a 20  is handle.  */. 
13200 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
13210 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64  _mutex_held(p->d
13220 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73  b->mutex) );.  s
13230 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
13240 28 70 29 3b 0a 20 20 70 43 75 72 20 3d 20 70 42  (p);.  pCur = pB
13250 74 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 77 68  t->pCursor;.  wh
13260 69 6c 65 28 20 70 43 75 72 20 29 7b 0a 20 20 20  ile( pCur ){.   
13270 20 42 74 43 75 72 73 6f 72 20 2a 70 54 6d 70 20   BtCursor *pTmp 
13280 3d 20 70 43 75 72 3b 0a 20 20 20 20 70 43 75 72  = pCur;.    pCur
13290 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a   = pCur->pNext;.
132a0 20 20 20 20 69 66 28 20 70 54 6d 70 2d 3e 70 42      if( pTmp->pB
132b0 74 72 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20  tree==p ){.     
132c0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f   sqlite3BtreeClo
132d0 73 65 43 75 72 73 6f 72 28 70 54 6d 70 29 3b 0a  seCursor(pTmp);.
132e0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
132f0 52 6f 6c 6c 62 61 63 6b 20 61 6e 79 20 61 63 74  Rollback any act
13300 69 76 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ive transaction 
13310 61 6e 64 20 66 72 65 65 20 74 68 65 20 68 61 6e  and free the han
13320 64 6c 65 20 73 74 72 75 63 74 75 72 65 2e 0a 20  dle structure.. 
13330 20 2a 2a 20 54 68 65 20 63 61 6c 6c 20 74 6f 20   ** The call to 
13340 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c  sqlite3BtreeRoll
13350 62 61 63 6b 28 29 20 64 72 6f 70 73 20 61 6e 79  back() drops any
13360 20 74 61 62 6c 65 2d 6c 6f 63 6b 73 20 68 65 6c   table-locks hel
13370 64 20 62 79 0a 20 20 2a 2a 20 74 68 69 73 20 68  d by.  ** this h
13380 61 6e 64 6c 65 2e 0a 20 20 2a 2f 0a 20 20 73 71  andle..  */.  sq
13390 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61  lite3BtreeRollba
133a0 63 6b 28 70 2c 20 53 51 4c 49 54 45 5f 4f 4b 2c  ck(p, SQLITE_OK,
133b0 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74   0);.  sqlite3Bt
133c0 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 0a 20 20  reeLeave(p);..  
133d0 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  /* If there are 
133e0 73 74 69 6c 6c 20 6f 74 68 65 72 20 6f 75 74 73  still other outs
133f0 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63  tanding referenc
13400 65 73 20 74 6f 20 74 68 65 20 73 68 61 72 65 64  es to the shared
13410 2d 62 74 72 65 65 0a 20 20 2a 2a 20 73 74 72 75  -btree.  ** stru
13420 63 74 75 72 65 2c 20 72 65 74 75 72 6e 20 6e 6f  cture, return no
13430 77 2e 20 54 68 65 20 72 65 6d 61 69 6e 64 65 72  w. The remainder
13440 20 6f 66 20 74 68 69 73 20 70 72 6f 63 65 64 75   of this procedu
13450 72 65 20 63 6c 65 61 6e 73 20 0a 20 20 2a 2a 20  re cleans .  ** 
13460 75 70 20 74 68 65 20 73 68 61 72 65 64 2d 62 74  up the shared-bt
13470 72 65 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ree..  */.  asse
13480 72 74 28 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f 63  rt( p->wantToLoc
13490 6b 3d 3d 30 20 26 26 20 70 2d 3e 6c 6f 63 6b 65  k==0 && p->locke
134a0 64 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 21 70  d==0 );.  if( !p
134b0 2d 3e 73 68 61 72 61 62 6c 65 20 7c 7c 20 72 65  ->sharable || re
134c0 6d 6f 76 65 46 72 6f 6d 53 68 61 72 69 6e 67 4c  moveFromSharingL
134d0 69 73 74 28 70 42 74 29 20 29 7b 0a 20 20 20 20  ist(pBt) ){.    
134e0 2f 2a 20 54 68 65 20 70 42 74 20 69 73 20 6e 6f  /* The pBt is no
134f0 20 6c 6f 6e 67 65 72 20 6f 6e 20 74 68 65 20 73   longer on the s
13500 68 61 72 69 6e 67 20 6c 69 73 74 2c 20 73 6f 20  haring list, so 
13510 77 65 20 63 61 6e 20 61 63 63 65 73 73 0a 20 20  we can access.  
13520 20 20 2a 2a 20 69 74 20 77 69 74 68 6f 75 74 20    ** it without 
13530 68 61 76 69 6e 67 20 74 6f 20 68 6f 6c 64 20 74  having to hold t
13540 68 65 20 6d 75 74 65 78 2e 0a 20 20 20 20 2a 2a  he mutex..    **
13550 0a 20 20 20 20 2a 2a 20 43 6c 65 61 6e 20 6f 75  .    ** Clean ou
13560 74 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65  t and delete the
13570 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74   BtShared object
13580 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
13590 65 72 74 28 20 21 70 42 74 2d 3e 70 43 75 72 73  ert( !pBt->pCurs
135a0 6f 72 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  or );.    sqlite
135b0 33 50 61 67 65 72 43 6c 6f 73 65 28 70 42 74 2d  3PagerClose(pBt-
135c0 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66  >pPager);.    if
135d0 28 20 70 42 74 2d 3e 78 46 72 65 65 53 63 68 65  ( pBt->xFreeSche
135e0 6d 61 20 26 26 20 70 42 74 2d 3e 70 53 63 68 65  ma && pBt->pSche
135f0 6d 61 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d  ma ){.      pBt-
13600 3e 78 46 72 65 65 53 63 68 65 6d 61 28 70 42 74  >xFreeSchema(pBt
13610 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20  ->pSchema);.    
13620 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  }.    sqlite3DbF
13630 72 65 65 28 30 2c 20 70 42 74 2d 3e 70 53 63 68  ree(0, pBt->pSch
13640 65 6d 61 29 3b 0a 20 20 20 20 66 72 65 65 54 65  ema);.    freeTe
13650 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20  mpSpace(pBt);.  
13660 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
13670 42 74 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65  Bt);.  }..#ifnde
13680 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  f SQLITE_OMIT_SH
13690 41 52 45 44 5f 43 41 43 48 45 0a 20 20 61 73 73  ARED_CACHE.  ass
136a0 65 72 74 28 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f  ert( p->wantToLo
136b0 63 6b 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ck==0 );.  asser
136c0 74 28 20 70 2d 3e 6c 6f 63 6b 65 64 3d 3d 30 20  t( p->locked==0 
136d0 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 65  );.  if( p->pPre
136e0 76 20 29 20 70 2d 3e 70 50 72 65 76 2d 3e 70 4e  v ) p->pPrev->pN
136f0 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a  ext = p->pNext;.
13700 20 20 69 66 28 20 70 2d 3e 70 4e 65 78 74 20 29    if( p->pNext )
13710 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76   p->pNext->pPrev
13720 20 3d 20 70 2d 3e 70 50 72 65 76 3b 0a 23 65 6e   = p->pPrev;.#en
13730 64 69 66 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66  dif..  sqlite3_f
13740 72 65 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ree(p);.  return
13750 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
13760 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
13770 6c 69 6d 69 74 20 6f 6e 20 74 68 65 20 6e 75 6d  limit on the num
13780 62 65 72 20 6f 66 20 70 61 67 65 73 20 61 6c 6c  ber of pages all
13790 6f 77 65 64 20 69 6e 20 74 68 65 20 63 61 63 68  owed in the cach
137a0 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 78  e..**.** The max
137b0 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 63  imum number of c
137c0 61 63 68 65 20 70 61 67 65 73 20 69 73 20 73 65  ache pages is se
137d0 74 20 74 6f 20 74 68 65 20 61 62 73 6f 6c 75 74  t to the absolut
137e0 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 6d 78  e.** value of mx
137f0 50 61 67 65 2e 20 20 49 66 20 6d 78 50 61 67 65  Page.  If mxPage
13800 20 69 73 20 6e 65 67 61 74 69 76 65 2c 20 74 68   is negative, th
13810 65 20 70 61 67 65 72 20 77 69 6c 6c 0a 2a 2a 20  e pager will.** 
13820 6f 70 65 72 61 74 65 20 61 73 79 6e 63 68 72 6f  operate asynchro
13830 6e 6f 75 73 6c 79 20 2d 20 69 74 20 77 69 6c 6c  nously - it will
13840 20 6e 6f 74 20 73 74 6f 70 20 74 6f 20 64 6f 20   not stop to do 
13850 66 73 79 6e 63 28 29 73 0a 2a 2a 20 74 6f 20 69  fsync()s.** to i
13860 6e 73 75 72 65 20 64 61 74 61 20 69 73 20 77 72  nsure data is wr
13870 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64 69 73  itten to the dis
13880 6b 20 73 75 72 66 61 63 65 20 62 65 66 6f 72 65  k surface before
13890 0a 2a 2a 20 63 6f 6e 74 69 6e 75 69 6e 67 2e 20  .** continuing. 
138a0 20 54 72 61 6e 73 61 63 74 69 6f 6e 73 20 73 74   Transactions st
138b0 69 6c 6c 20 77 6f 72 6b 20 69 66 20 73 79 6e 63  ill work if sync
138c0 68 72 6f 6e 6f 75 73 20 69 73 20 6f 66 66 2c 0a  hronous is off,.
138d0 2a 2a 20 61 6e 64 20 74 68 65 20 64 61 74 61 62  ** and the datab
138e0 61 73 65 20 63 61 6e 6e 6f 74 20 62 65 20 63 6f  ase cannot be co
138f0 72 72 75 70 74 65 64 20 69 66 20 74 68 69 73 20  rrupted if this 
13900 70 72 6f 67 72 61 6d 0a 2a 2a 20 63 72 61 73 68  program.** crash
13910 65 73 2e 20 20 42 75 74 20 69 66 20 74 68 65 20  es.  But if the 
13920 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d  operating system
13930 20 63 72 61 73 68 65 73 20 6f 72 20 74 68 65 72   crashes or ther
13940 65 20 69 73 0a 2a 2a 20 61 6e 20 61 62 72 75 70  e is.** an abrup
13950 74 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20  t power failure 
13960 77 68 65 6e 20 73 79 6e 63 68 72 6f 6e 6f 75 73  when synchronous
13970 20 69 73 20 6f 66 66 2c 20 74 68 65 20 64 61 74   is off, the dat
13980 61 62 61 73 65 0a 2a 2a 20 63 6f 75 6c 64 20 62  abase.** could b
13990 65 20 6c 65 66 74 20 69 6e 20 61 6e 20 69 6e 63  e left in an inc
139a0 6f 6e 73 69 73 74 65 6e 74 20 61 6e 64 20 75 6e  onsistent and un
139b0 72 65 63 6f 76 65 72 61 62 6c 65 20 73 74 61 74  recoverable stat
139c0 65 2e 0a 2a 2a 20 53 79 6e 63 68 72 6f 6e 6f 75  e..** Synchronou
139d0 73 20 69 73 20 6f 6e 20 62 79 20 64 65 66 61 75  s is on by defau
139e0 6c 74 20 73 6f 20 64 61 74 61 62 61 73 65 20 63  lt so database c
139f0 6f 72 72 75 70 74 69 6f 6e 20 69 73 20 6e 6f 74  orruption is not
13a00 0a 2a 2a 20 6e 6f 72 6d 61 6c 6c 79 20 61 20 77  .** normally a w
13a10 6f 72 72 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  orry..*/.int sql
13a20 69 74 65 33 42 74 72 65 65 53 65 74 43 61 63 68  ite3BtreeSetCach
13a30 65 53 69 7a 65 28 42 74 72 65 65 20 2a 70 2c 20  eSize(Btree *p, 
13a40 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 42  int mxPage){.  B
13a50 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
13a60 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28  ->pBt;.  assert(
13a70 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
13a80 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78  eld(p->db->mutex
13a90 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ) );.  sqlite3Bt
13aa0 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 73  reeEnter(p);.  s
13ab0 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 43 61  qlite3PagerSetCa
13ac0 63 68 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61  chesize(pBt->pPa
13ad0 67 65 72 2c 20 6d 78 50 61 67 65 29 3b 0a 20 20  ger, mxPage);.  
13ae0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
13af0 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  e(p);.  return S
13b00 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66  QLITE_OK;.}..#if
13b10 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
13b20 5f 53 49 5a 45 3e 30 0a 2f 2a 0a 2a 2a 20 43 68  _SIZE>0./*.** Ch
13b30 61 6e 67 65 20 74 68 65 20 6c 69 6d 69 74 20 6f  ange the limit o
13b40 6e 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20  n the amount of 
13b50 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
13b60 65 20 74 68 61 74 20 6d 61 79 20 62 65 0a 2a 2a  e that may be.**
13b70 20 6d 65 6d 6f 72 79 20 6d 61 70 70 65 64 2e 0a   memory mapped..
13b80 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
13b90 72 65 65 53 65 74 4d 6d 61 70 4c 69 6d 69 74 28  reeSetMmapLimit(
13ba0 42 74 72 65 65 20 2a 70 2c 20 73 71 6c 69 74 65  Btree *p, sqlite
13bb0 33 5f 69 6e 74 36 34 20 73 7a 4d 6d 61 70 29 7b  3_int64 szMmap){
13bc0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
13bd0 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73   = p->pBt;.  ass
13be0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
13bf0 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d  ex_held(p->db->m
13c00 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74  utex) );.  sqlit
13c10 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
13c20 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  .  sqlite3PagerS
13c30 65 74 4d 6d 61 70 4c 69 6d 69 74 28 70 42 74 2d  etMmapLimit(pBt-
13c40 3e 70 50 61 67 65 72 2c 20 73 7a 4d 6d 61 70 29  >pPager, szMmap)
13c50 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
13c60 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
13c70 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
13c80 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
13c90 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30  _MAX_MMAP_SIZE>0
13ca0 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67   */../*.** Chang
13cb0 65 20 74 68 65 20 77 61 79 20 64 61 74 61 20 69  e the way data i
13cc0 73 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b  s synced to disk
13cd0 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 69 6e 63   in order to inc
13ce0 72 65 61 73 65 20 6f 72 20 64 65 63 72 65 61 73  rease or decreas
13cf0 65 0a 2a 2a 20 68 6f 77 20 77 65 6c 6c 20 74 68  e.** how well th
13d00 65 20 64 61 74 61 62 61 73 65 20 72 65 73 69 73  e database resis
13d10 74 73 20 64 61 6d 61 67 65 20 64 75 65 20 74 6f  ts damage due to
13d20 20 4f 53 20 63 72 61 73 68 65 73 20 61 6e 64 20   OS crashes and 
13d30 70 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65  power.** failure
13d40 73 2e 20 20 4c 65 76 65 6c 20 31 20 69 73 20 74  s.  Level 1 is t
13d50 68 65 20 73 61 6d 65 20 61 73 20 61 73 79 6e 63  he same as async
13d60 68 72 6f 6e 6f 75 73 20 28 6e 6f 20 73 79 6e 63  hronous (no sync
13d70 73 28 29 20 6f 63 63 75 72 20 61 6e 64 0a 2a 2a  s() occur and.**
13d80 20 74 68 65 72 65 20 69 73 20 61 20 68 69 67 68   there is a high
13d90 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20   probability of 
13da0 64 61 6d 61 67 65 29 20 20 4c 65 76 65 6c 20 32  damage)  Level 2
13db0 20 69 73 20 74 68 65 20 64 65 66 61 75 6c 74 2e   is the default.
13dc0 20 20 54 68 65 72 65 0a 2a 2a 20 69 73 20 61 20    There.** is a 
13dd0 76 65 72 79 20 6c 6f 77 20 62 75 74 20 6e 6f 6e  very low but non
13de0 2d 7a 65 72 6f 20 70 72 6f 62 61 62 69 6c 69 74  -zero probabilit
13df0 79 20 6f 66 20 64 61 6d 61 67 65 2e 20 20 4c 65  y of damage.  Le
13e00 76 65 6c 20 33 20 72 65 64 75 63 65 73 20 74 68  vel 3 reduces th
13e10 65 0a 2a 2a 20 70 72 6f 62 61 62 69 6c 69 74 79  e.** probability
13e20 20 6f 66 20 64 61 6d 61 67 65 20 74 6f 20 6e 65   of damage to ne
13e30 61 72 20 7a 65 72 6f 20 62 75 74 20 77 69 74 68  ar zero but with
13e40 20 61 20 77 72 69 74 65 20 70 65 72 66 6f 72 6d   a write perform
13e50 61 6e 63 65 20 72 65 64 75 63 74 69 6f 6e 2e 0a  ance reduction..
13e60 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
13e70 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41  E_OMIT_PAGER_PRA
13e80 47 4d 41 53 0a 69 6e 74 20 73 71 6c 69 74 65 33  GMAS.int sqlite3
13e90 42 74 72 65 65 53 65 74 50 61 67 65 72 46 6c 61  BtreeSetPagerFla
13ea0 67 73 28 0a 20 20 42 74 72 65 65 20 2a 70 2c 20  gs(.  Btree *p, 
13eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13ec0 54 68 65 20 62 74 72 65 65 20 74 6f 20 73 65 74  The btree to set
13ed0 20 74 68 65 20 73 61 66 65 74 79 20 6c 65 76 65   the safety leve
13ee0 6c 20 6f 6e 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  l on */.  unsign
13ef0 65 64 20 70 67 46 6c 61 67 73 20 20 20 20 20 20  ed pgFlags      
13f00 20 2f 2a 20 56 61 72 69 6f 75 73 20 50 41 47 45   /* Various PAGE
13f10 52 5f 2a 20 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a  R_* flags */.){.
13f20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
13f30 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65  = p->pBt;.  asse
13f40 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
13f50 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75  x_held(p->db->mu
13f60 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65  tex) );.  sqlite
13f70 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
13f80 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65    sqlite3PagerSe
13f90 74 46 6c 61 67 73 28 70 42 74 2d 3e 70 50 61 67  tFlags(pBt->pPag
13fa0 65 72 2c 20 70 67 46 6c 61 67 73 29 3b 0a 20 20  er, pgFlags);.  
13fb0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
13fc0 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  e(p);.  return S
13fd0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64  QLITE_OK;.}.#end
13fe0 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  if../*.** Return
13ff0 20 54 52 55 45 20 69 66 20 74 68 65 20 67 69 76   TRUE if the giv
14000 65 6e 20 62 74 72 65 65 20 69 73 20 73 65 74 20  en btree is set 
14010 74 6f 20 73 61 66 65 74 79 20 6c 65 76 65 6c 20  to safety level 
14020 31 2e 20 20 49 6e 20 6f 74 68 65 72 0a 2a 2a 20  1.  In other.** 
14030 77 6f 72 64 73 2c 20 72 65 74 75 72 6e 20 54 52  words, return TR
14040 55 45 20 69 66 20 6e 6f 20 73 79 6e 63 28 29 20  UE if no sync() 
14050 6f 63 63 75 72 73 20 6f 6e 20 74 68 65 20 64 69  occurs on the di
14060 73 6b 20 66 69 6c 65 73 2e 0a 2a 2f 0a 69 6e 74  sk files..*/.int
14070 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 79 6e   sqlite3BtreeSyn
14080 63 44 69 73 61 62 6c 65 64 28 42 74 72 65 65 20  cDisabled(Btree 
14090 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  *p){.  BtShared 
140a0 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
140b0 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72   int rc;.  asser
140c0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
140d0 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74  _held(p->db->mut
140e0 65 78 29 20 29 3b 20 20 0a 20 20 73 71 6c 69 74  ex) );  .  sqlit
140f0 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
14100 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 20 26  .  assert( pBt &
14110 26 20 70 42 74 2d 3e 70 50 61 67 65 72 20 29 3b  & pBt->pPager );
14120 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
14130 61 67 65 72 4e 6f 73 79 6e 63 28 70 42 74 2d 3e  agerNosync(pBt->
14140 70 50 61 67 65 72 29 3b 0a 20 20 73 71 6c 69 74  pPager);.  sqlit
14150 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
14160 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
14170 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
14180 65 20 64 65 66 61 75 6c 74 20 70 61 67 65 73 20  e default pages 
14190 73 69 7a 65 20 61 6e 64 20 74 68 65 20 6e 75 6d  size and the num
141a0 62 65 72 20 6f 66 20 72 65 73 65 72 76 65 64 20  ber of reserved 
141b0 62 79 74 65 73 20 70 65 72 20 70 61 67 65 2e 0a  bytes per page..
141c0 2a 2a 20 4f 72 2c 20 69 66 20 74 68 65 20 70 61  ** Or, if the pa
141d0 67 65 20 73 69 7a 65 20 68 61 73 20 61 6c 72 65  ge size has alre
141e0 61 64 79 20 62 65 65 6e 20 66 69 78 65 64 2c 20  ady been fixed, 
141f0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45  return SQLITE_RE
14200 41 44 4f 4e 4c 59 20 0a 2a 2a 20 77 69 74 68 6f  ADONLY .** witho
14210 75 74 20 63 68 61 6e 67 69 6e 67 20 61 6e 79 74  ut changing anyt
14220 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  hing..**.** The 
14230 70 61 67 65 20 73 69 7a 65 20 6d 75 73 74 20 62  page size must b
14240 65 20 61 20 70 6f 77 65 72 20 6f 66 20 32 20 62  e a power of 2 b
14250 65 74 77 65 65 6e 20 35 31 32 20 61 6e 64 20 36  etween 512 and 6
14260 35 35 33 36 2e 20 20 49 66 20 74 68 65 20 70 61  5536.  If the pa
14270 67 65 0a 2a 2a 20 73 69 7a 65 20 73 75 70 70 6c  ge.** size suppl
14280 69 65 64 20 64 6f 65 73 20 6e 6f 74 20 6d 65 65  ied does not mee
14290 74 20 74 68 69 73 20 63 6f 6e 73 74 72 61 69 6e  t this constrain
142a0 74 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20  t then the page 
142b0 73 69 7a 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 63  size is not.** c
142c0 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 50 61  hanged..**.** Pa
142d0 67 65 20 73 69 7a 65 73 20 61 72 65 20 63 6f 6e  ge sizes are con
142e0 73 74 72 61 69 6e 65 64 20 74 6f 20 62 65 20 61  strained to be a
142f0 20 70 6f 77 65 72 20 6f 66 20 74 77 6f 20 73 6f   power of two so
14300 20 74 68 61 74 20 74 68 65 20 72 65 67 69 6f 6e   that the region
14310 0a 2a 2a 20 6f 66 20 74 68 65 20 64 61 74 61 62  .** of the datab
14320 61 73 65 20 66 69 6c 65 20 75 73 65 64 20 66 6f  ase file used fo
14330 72 20 6c 6f 63 6b 69 6e 67 20 28 62 65 67 69 6e  r locking (begin
14340 6e 69 6e 67 20 61 74 20 50 45 4e 44 49 4e 47 5f  ning at PENDING_
14350 42 59 54 45 2c 0a 2a 2a 20 74 68 65 20 66 69 72  BYTE,.** the fir
14360 73 74 20 62 79 74 65 20 70 61 73 74 20 74 68 65  st byte past the
14370 20 31 47 42 20 62 6f 75 6e 64 61 72 79 2c 20 30   1GB boundary, 0
14380 78 34 30 30 30 30 30 30 30 29 20 6e 65 65 64 73  x40000000) needs
14390 20 74 6f 20 6f 63 63 75 72 0a 2a 2a 20 61 74 20   to occur.** at 
143a0 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
143b0 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49   a page..**.** I
143c0 66 20 70 61 72 61 6d 65 74 65 72 20 6e 52 65 73  f parameter nRes
143d0 65 72 76 65 20 69 73 20 6c 65 73 73 20 74 68 61  erve is less tha
143e0 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65  n zero, then the
143f0 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 65 72   number of reser
14400 76 65 64 0a 2a 2a 20 62 79 74 65 73 20 70 65 72  ved.** bytes per
14410 20 70 61 67 65 20 69 73 20 6c 65 66 74 20 75 6e   page is left un
14420 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  changed..**.** I
14430 66 20 74 68 65 20 69 46 69 78 21 3d 30 20 74 68  f the iFix!=0 th
14440 65 6e 20 74 68 65 20 42 54 53 5f 50 41 47 45 53  en the BTS_PAGES
14450 49 5a 45 5f 46 49 58 45 44 20 66 6c 61 67 20 69  IZE_FIXED flag i
14460 73 20 73 65 74 20 73 6f 20 74 68 61 74 20 74 68  s set so that th
14470 65 20 70 61 67 65 20 73 69 7a 65 0a 2a 2a 20 61  e page size.** a
14480 6e 64 20 61 75 74 6f 76 61 63 75 75 6d 20 6d 6f  nd autovacuum mo
14490 64 65 20 63 61 6e 20 6e 6f 20 6c 6f 6e 67 65 72  de can no longer
144a0 20 62 65 20 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a   be changed..*/.
144b0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
144c0 53 65 74 50 61 67 65 53 69 7a 65 28 42 74 72 65  SetPageSize(Btre
144d0 65 20 2a 70 2c 20 69 6e 74 20 70 61 67 65 53 69  e *p, int pageSi
144e0 7a 65 2c 20 69 6e 74 20 6e 52 65 73 65 72 76 65  ze, int nReserve
144f0 2c 20 69 6e 74 20 69 46 69 78 29 7b 0a 20 20 69  , int iFix){.  i
14500 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
14510 4b 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  K;.  BtShared *p
14520 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61  Bt = p->pBt;.  a
14530 73 73 65 72 74 28 20 6e 52 65 73 65 72 76 65 3e  ssert( nReserve>
14540 3d 2d 31 20 26 26 20 6e 52 65 73 65 72 76 65 3c  =-1 && nReserve<
14550 3d 32 35 35 20 29 3b 0a 20 20 73 71 6c 69 74 65  =255 );.  sqlite
14560 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
14570 23 69 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43  #if SQLITE_HAS_C
14580 4f 44 45 43 0a 20 20 69 66 28 20 6e 52 65 73 65  ODEC.  if( nRese
14590 72 76 65 3e 70 42 74 2d 3e 6f 70 74 69 6d 61 6c  rve>pBt->optimal
145a0 52 65 73 65 72 76 65 20 29 20 70 42 74 2d 3e 6f  Reserve ) pBt->o
145b0 70 74 69 6d 61 6c 52 65 73 65 72 76 65 20 3d 20  ptimalReserve = 
145c0 28 75 38 29 6e 52 65 73 65 72 76 65 3b 0a 23 65  (u8)nReserve;.#e
145d0 6e 64 69 66 0a 20 20 69 66 28 20 70 42 74 2d 3e  ndif.  if( pBt->
145e0 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 50  btsFlags & BTS_P
145f0 41 47 45 53 49 5a 45 5f 46 49 58 45 44 20 29 7b  AGESIZE_FIXED ){
14600 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
14610 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 72  eLeave(p);.    r
14620 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41  eturn SQLITE_REA
14630 44 4f 4e 4c 59 3b 0a 20 20 7d 0a 20 20 69 66 28  DONLY;.  }.  if(
14640 20 6e 52 65 73 65 72 76 65 3c 30 20 29 7b 0a 20   nReserve<0 ){. 
14650 20 20 20 6e 52 65 73 65 72 76 65 20 3d 20 70 42     nReserve = pB
14660 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 42  t->pageSize - pB
14670 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20  t->usableSize;. 
14680 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65   }.  assert( nRe
14690 73 65 72 76 65 3e 3d 30 20 26 26 20 6e 52 65 73  serve>=0 && nRes
146a0 65 72 76 65 3c 3d 32 35 35 20 29 3b 0a 20 20 69  erve<=255 );.  i
146b0 66 28 20 70 61 67 65 53 69 7a 65 3e 3d 35 31 32  f( pageSize>=512
146c0 20 26 26 20 70 61 67 65 53 69 7a 65 3c 3d 53 51   && pageSize<=SQ
146d0 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49  LITE_MAX_PAGE_SI
146e0 5a 45 20 26 26 0a 20 20 20 20 20 20 20 20 28 28  ZE &&.        ((
146f0 70 61 67 65 53 69 7a 65 2d 31 29 26 70 61 67 65  pageSize-1)&page
14700 53 69 7a 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Size)==0 ){.    
14710 61 73 73 65 72 74 28 20 28 70 61 67 65 53 69 7a  assert( (pageSiz
14720 65 20 26 20 37 29 3d 3d 30 20 29 3b 0a 20 20 20  e & 7)==0 );.   
14730 20 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e 70   assert( !pBt->p
14740 50 61 67 65 31 20 26 26 20 21 70 42 74 2d 3e 70  Page1 && !pBt->p
14750 43 75 72 73 6f 72 20 29 3b 0a 20 20 20 20 70 42  Cursor );.    pB
14760 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 28 75  t->pageSize = (u
14770 33 32 29 70 61 67 65 53 69 7a 65 3b 0a 20 20 20  32)pageSize;.   
14780 20 66 72 65 65 54 65 6d 70 53 70 61 63 65 28 70   freeTempSpace(p
14790 42 74 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  Bt);.  }.  rc = 
147a0 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50  sqlite3PagerSetP
147b0 61 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61  agesize(pBt->pPa
147c0 67 65 72 2c 20 26 70 42 74 2d 3e 70 61 67 65 53  ger, &pBt->pageS
147d0 69 7a 65 2c 20 6e 52 65 73 65 72 76 65 29 3b 0a  ize, nReserve);.
147e0 20 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a    pBt->usableSiz
147f0 65 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  e = pBt->pageSiz
14800 65 20 2d 20 28 75 31 36 29 6e 52 65 73 65 72 76  e - (u16)nReserv
14810 65 3b 0a 20 20 69 66 28 20 69 46 69 78 20 29 20  e;.  if( iFix ) 
14820 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d  pBt->btsFlags |=
14830 20 42 54 53 5f 50 41 47 45 53 49 5a 45 5f 46 49   BTS_PAGESIZE_FI
14840 58 45 44 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  XED;.  sqlite3Bt
14850 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
14860 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
14870 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63 75  ** Return the cu
14880 72 72 65 6e 74 6c 79 20 64 65 66 69 6e 65 64 20  rrently defined 
14890 70 61 67 65 20 73 69 7a 65 0a 2a 2f 0a 69 6e 74  page size.*/.int
148a0 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
148b0 50 61 67 65 53 69 7a 65 28 42 74 72 65 65 20 2a  PageSize(Btree *
148c0 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e  p){.  return p->
148d0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 7d  pBt->pageSize;.}
148e0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
148f0 63 74 69 6f 6e 20 69 73 20 73 69 6d 69 6c 61 72  ction is similar
14900 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65   to sqlite3Btree
14910 47 65 74 52 65 73 65 72 76 65 28 29 2c 20 65 78  GetReserve(), ex
14920 63 65 70 74 20 74 68 61 74 20 69 74 0a 2a 2a 20  cept that it.** 
14930 6d 61 79 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c  may only be call
14940 65 64 20 69 66 20 69 74 20 69 73 20 67 75 61 72  ed if it is guar
14950 61 6e 74 65 65 64 20 74 68 61 74 20 74 68 65 20  anteed that the 
14960 62 2d 74 72 65 65 20 6d 75 74 65 78 20 69 73 20  b-tree mutex is 
14970 61 6c 72 65 61 64 79 0a 2a 2a 20 68 65 6c 64 2e  already.** held.
14980 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 75  .**.** This is u
14990 73 65 66 75 6c 20 69 6e 20 6f 6e 65 20 73 70 65  seful in one spe
149a0 63 69 61 6c 20 63 61 73 65 20 69 6e 20 74 68 65  cial case in the
149b0 20 62 61 63 6b 75 70 20 41 50 49 20 63 6f 64 65   backup API code
149c0 20 77 68 65 72 65 20 69 74 20 69 73 0a 2a 2a 20   where it is.** 
149d0 6b 6e 6f 77 6e 20 74 68 61 74 20 74 68 65 20 73  known that the s
149e0 68 61 72 65 64 20 62 2d 74 72 65 65 20 6d 75 74  hared b-tree mut
149f0 65 78 20 69 73 20 68 65 6c 64 2c 20 62 75 74 20  ex is held, but 
14a00 74 68 65 20 6d 75 74 65 78 20 6f 6e 20 74 68 65  the mutex on the
14a10 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 68 61   .** database ha
14a20 6e 64 6c 65 20 74 68 61 74 20 6f 77 6e 73 20 2a  ndle that owns *
14a30 70 20 69 73 20 6e 6f 74 2e 20 49 6e 20 74 68 69  p is not. In thi
14a40 73 20 63 61 73 65 20 69 66 20 73 71 6c 69 74 65  s case if sqlite
14a50 33 42 74 72 65 65 45 6e 74 65 72 28 29 0a 2a 2a  3BtreeEnter().**
14a60 20 77 65 72 65 20 74 6f 20 62 65 20 63 61 6c 6c   were to be call
14a70 65 64 2c 20 69 74 20 6d 69 67 68 74 20 63 6f 6c  ed, it might col
14a80 6c 69 64 65 20 77 69 74 68 20 73 6f 6d 65 20 6f  lide with some o
14a90 74 68 65 72 20 6f 70 65 72 61 74 69 6f 6e 20 6f  ther operation o
14aa0 6e 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73  n the.** databas
14ab0 65 20 68 61 6e 64 6c 65 20 74 68 61 74 20 6f 77  e handle that ow
14ac0 6e 73 20 2a 70 2c 20 63 61 75 73 69 6e 67 20 75  ns *p, causing u
14ad0 6e 64 65 66 69 6e 65 64 20 62 65 68 61 76 69 6f  ndefined behavio
14ae0 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  r..*/.int sqlite
14af0 33 42 74 72 65 65 47 65 74 52 65 73 65 72 76 65  3BtreeGetReserve
14b00 4e 6f 4d 75 74 65 78 28 42 74 72 65 65 20 2a 70  NoMutex(Btree *p
14b10 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 61 73  ){.  int n;.  as
14b20 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
14b30 74 65 78 5f 68 65 6c 64 28 70 2d 3e 70 42 74 2d  tex_held(p->pBt-
14b40 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 6e 20 3d  >mutex) );.  n =
14b50 20 70 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a   p->pBt->pageSiz
14b60 65 20 2d 20 70 2d 3e 70 42 74 2d 3e 75 73 61 62  e - p->pBt->usab
14b70 6c 65 53 69 7a 65 3b 0a 20 20 72 65 74 75 72 6e  leSize;.  return
14b80 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74   n;.}../*.** Ret
14b90 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
14ba0 66 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65  f bytes of space
14bb0 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 65   at the end of e
14bc0 76 65 72 79 20 70 61 67 65 20 74 68 61 74 0a 2a  very page that.*
14bd0 2a 20 61 72 65 20 69 6e 74 65 6e 74 75 61 6c 6c  * are intentuall
14be0 79 20 6c 65 66 74 20 75 6e 75 73 65 64 2e 20 20  y left unused.  
14bf0 54 68 69 73 20 69 73 20 74 68 65 20 22 72 65 73  This is the "res
14c00 65 72 76 65 64 22 20 73 70 61 63 65 20 74 68 61  erved" space tha
14c10 74 20 69 73 0a 2a 2a 20 73 6f 6d 65 74 69 6d 65  t is.** sometime
14c20 73 20 75 73 65 64 20 62 79 20 65 78 74 65 6e 73  s used by extens
14c30 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53  ions..**.** If S
14c40 51 4c 49 54 45 5f 48 41 53 5f 4d 55 54 45 58 20  QLITE_HAS_MUTEX 
14c50 69 73 20 64 65 66 69 6e 65 64 20 74 68 65 6e 20  is defined then 
14c60 74 68 65 20 6e 75 6d 62 65 72 20 72 65 74 75 72  the number retur
14c70 6e 65 64 20 69 73 20 74 68 65 0a 2a 2a 20 67 72  ned is the.** gr
14c80 65 61 74 65 72 20 6f 66 20 74 68 65 20 63 75 72  eater of the cur
14c90 72 65 6e 74 20 72 65 73 65 72 76 65 64 20 73 70  rent reserved sp
14ca0 61 63 65 20 61 6e 64 20 74 68 65 20 6d 61 78 69  ace and the maxi
14cb0 6d 75 6d 20 72 65 71 75 65 73 74 65 64 0a 2a 2a  mum requested.**
14cc0 20 72 65 73 65 72 76 65 20 73 70 61 63 65 2e 0a   reserve space..
14cd0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
14ce0 72 65 65 47 65 74 4f 70 74 69 6d 61 6c 52 65 73  reeGetOptimalRes
14cf0 65 72 76 65 28 42 74 72 65 65 20 2a 70 29 7b 0a  erve(Btree *p){.
14d00 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74    int n;.  sqlit
14d10 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
14d20 0a 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 42 74  .  n = sqlite3Bt
14d30 72 65 65 47 65 74 52 65 73 65 72 76 65 4e 6f 4d  reeGetReserveNoM
14d40 75 74 65 78 28 70 29 3b 0a 23 69 66 64 65 66 20  utex(p);.#ifdef 
14d50 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43  SQLITE_HAS_CODEC
14d60 0a 20 20 69 66 28 20 6e 3c 70 2d 3e 70 42 74 2d  .  if( n<p->pBt-
14d70 3e 6f 70 74 69 6d 61 6c 52 65 73 65 72 76 65 20  >optimalReserve 
14d80 29 20 6e 20 3d 20 70 2d 3e 70 42 74 2d 3e 6f 70  ) n = p->pBt->op
14d90 74 69 6d 61 6c 52 65 73 65 72 76 65 3b 0a 23 65  timalReserve;.#e
14da0 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 42 74  ndif.  sqlite3Bt
14db0 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
14dc0 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 0a 2f 2a 0a  eturn n;.}.../*.
14dd0 2a 2a 20 53 65 74 20 74 68 65 20 6d 61 78 69 6d  ** Set the maxim
14de0 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 20 66 6f  um page count fo
14df0 72 20 61 20 64 61 74 61 62 61 73 65 20 69 66 20  r a database if 
14e00 6d 78 50 61 67 65 20 69 73 20 70 6f 73 69 74 69  mxPage is positi
14e10 76 65 2e 0a 2a 2a 20 4e 6f 20 63 68 61 6e 67 65  ve..** No change
14e20 73 20 61 72 65 20 6d 61 64 65 20 69 66 20 6d 78  s are made if mx
14e30 50 61 67 65 20 69 73 20 30 20 6f 72 20 6e 65 67  Page is 0 or neg
14e40 61 74 69 76 65 2e 0a 2a 2a 20 52 65 67 61 72 64  ative..** Regard
14e50 6c 65 73 73 20 6f 66 20 74 68 65 20 76 61 6c 75  less of the valu
14e60 65 20 6f 66 20 6d 78 50 61 67 65 2c 20 72 65 74  e of mxPage, ret
14e70 75 72 6e 20 74 68 65 20 6d 61 78 69 6d 75 6d 20  urn the maximum 
14e80 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 69  page count..*/.i
14e90 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d  nt sqlite3BtreeM
14ea0 61 78 50 61 67 65 43 6f 75 6e 74 28 42 74 72 65  axPageCount(Btre
14eb0 65 20 2a 70 2c 20 69 6e 74 20 6d 78 50 61 67 65  e *p, int mxPage
14ec0 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71  ){.  int n;.  sq
14ed0 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
14ee0 70 29 3b 0a 20 20 6e 20 3d 20 73 71 6c 69 74 65  p);.  n = sqlite
14ef0 33 50 61 67 65 72 4d 61 78 50 61 67 65 43 6f 75  3PagerMaxPageCou
14f00 6e 74 28 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65  nt(p->pBt->pPage
14f10 72 2c 20 6d 78 50 61 67 65 29 3b 0a 20 20 73 71  r, mxPage);.  sq
14f20 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
14f30 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a  p);.  return n;.
14f40 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
14f50 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45   BTS_SECURE_DELE
14f60 54 45 20 66 6c 61 67 20 69 66 20 6e 65 77 46 6c  TE flag if newFl
14f70 61 67 20 69 73 20 30 20 6f 72 20 31 2e 20 20 49  ag is 0 or 1.  I
14f80 66 20 6e 65 77 46 6c 61 67 20 69 73 20 2d 31 2c  f newFlag is -1,
14f90 0a 2a 2a 20 74 68 65 6e 20 6d 61 6b 65 20 6e 6f  .** then make no
14fa0 20 63 68 61 6e 67 65 73 2e 20 20 41 6c 77 61 79   changes.  Alway
14fb0 73 20 72 65 74 75 72 6e 20 74 68 65 20 76 61 6c  s return the val
14fc0 75 65 20 6f 66 20 74 68 65 20 42 54 53 5f 53 45  ue of the BTS_SE
14fd0 43 55 52 45 5f 44 45 4c 45 54 45 0a 2a 2a 20 73  CURE_DELETE.** s
14fe0 65 74 74 69 6e 67 20 61 66 74 65 72 20 74 68 65  etting after the
14ff0 20 63 68 61 6e 67 65 2e 0a 2a 2f 0a 69 6e 74 20   change..*/.int 
15000 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 63 75  sqlite3BtreeSecu
15010 72 65 44 65 6c 65 74 65 28 42 74 72 65 65 20 2a  reDelete(Btree *
15020 70 2c 20 69 6e 74 20 6e 65 77 46 6c 61 67 29 7b  p, int newFlag){
15030 0a 20 20 69 6e 74 20 62 3b 0a 20 20 69 66 28 20  .  int b;.  if( 
15040 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  p==0 ) return 0;
15050 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
15060 6e 74 65 72 28 70 29 3b 0a 20 20 69 66 28 20 6e  nter(p);.  if( n
15070 65 77 46 6c 61 67 3e 3d 30 20 29 7b 0a 20 20 20  ewFlag>=0 ){.   
15080 20 70 2d 3e 70 42 74 2d 3e 62 74 73 46 6c 61 67   p->pBt->btsFlag
15090 73 20 26 3d 20 7e 42 54 53 5f 53 45 43 55 52 45  s &= ~BTS_SECURE
150a0 5f 44 45 4c 45 54 45 3b 0a 20 20 20 20 69 66 28  _DELETE;.    if(
150b0 20 6e 65 77 46 6c 61 67 20 29 20 70 2d 3e 70 42   newFlag ) p->pB
150c0 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42  t->btsFlags |= B
150d0 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45  TS_SECURE_DELETE
150e0 3b 0a 20 20 7d 20 0a 20 20 62 20 3d 20 28 70 2d  ;.  } .  b = (p-
150f0 3e 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26  >pBt->btsFlags &
15100 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45   BTS_SECURE_DELE
15110 54 45 29 21 3d 30 3b 0a 20 20 73 71 6c 69 74 65  TE)!=0;.  sqlite
15120 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
15130 20 20 72 65 74 75 72 6e 20 62 3b 0a 7d 0a 0a 2f    return b;.}../
15140 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
15150 27 61 75 74 6f 2d 76 61 63 75 75 6d 27 20 70 72  'auto-vacuum' pr
15160 6f 70 65 72 74 79 20 6f 66 20 74 68 65 20 64 61  operty of the da
15170 74 61 62 61 73 65 2e 20 49 66 20 74 68 65 20 27  tabase. If the '
15180 61 75 74 6f 56 61 63 75 75 6d 27 0a 2a 2a 20 70  autoVacuum'.** p
15190 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 6e 2d  arameter is non-
151a0 7a 65 72 6f 2c 20 74 68 65 6e 20 61 75 74 6f 2d  zero, then auto-
151b0 76 61 63 75 75 6d 20 6d 6f 64 65 20 69 73 20 65  vacuum mode is e
151c0 6e 61 62 6c 65 64 2e 20 49 66 20 7a 65 72 6f 2c  nabled. If zero,
151d0 20 69 74 0a 2a 2a 20 69 73 20 64 69 73 61 62 6c   it.** is disabl
151e0 65 64 2e 20 54 68 65 20 64 65 66 61 75 6c 74 20  ed. The default 
151f0 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 61 75  value for the au
15200 74 6f 2d 76 61 63 75 75 6d 20 70 72 6f 70 65 72  to-vacuum proper
15210 74 79 20 69 73 20 0a 2a 2a 20 64 65 74 65 72 6d  ty is .** determ
15220 69 6e 65 64 20 62 79 20 74 68 65 20 53 51 4c 49  ined by the SQLI
15230 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56  TE_DEFAULT_AUTOV
15240 41 43 55 55 4d 20 6d 61 63 72 6f 2e 0a 2a 2f 0a  ACUUM macro..*/.
15250 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
15260 53 65 74 41 75 74 6f 56 61 63 75 75 6d 28 42 74  SetAutoVacuum(Bt
15270 72 65 65 20 2a 70 2c 20 69 6e 74 20 61 75 74 6f  ree *p, int auto
15280 56 61 63 75 75 6d 29 7b 0a 23 69 66 64 65 66 20  Vacuum){.#ifdef 
15290 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
152a0 56 41 43 55 55 4d 0a 20 20 72 65 74 75 72 6e 20  VACUUM.  return 
152b0 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b  SQLITE_READONLY;
152c0 0a 23 65 6c 73 65 0a 20 20 42 74 53 68 61 72 65  .#else.  BtShare
152d0 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
152e0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
152f0 54 45 5f 4f 4b 3b 0a 20 20 75 38 20 61 76 20 3d  TE_OK;.  u8 av =
15300 20 28 75 38 29 61 75 74 6f 56 61 63 75 75 6d 3b   (u8)autoVacuum;
15310 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ..  sqlite3Btree
15320 45 6e 74 65 72 28 70 29 3b 0a 20 20 69 66 28 20  Enter(p);.  if( 
15330 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26  (pBt->btsFlags &
15340 20 42 54 53 5f 50 41 47 45 53 49 5a 45 5f 46 49   BTS_PAGESIZE_FI
15350 58 45 44 29 21 3d 30 20 26 26 20 28 61 76 20 3f  XED)!=0 && (av ?
15360 31 3a 30 29 21 3d 70 42 74 2d 3e 61 75 74 6f 56  1:0)!=pBt->autoV
15370 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 72 63 20  acuum ){.    rc 
15380 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  = SQLITE_READONL
15390 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  Y;.  }else{.    
153a0 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
153b0 3d 20 61 76 20 3f 31 3a 30 3b 0a 20 20 20 20 70  = av ?1:0;.    p
153c0 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d  Bt->incrVacuum =
153d0 20 61 76 3d 3d 32 20 3f 31 3a 30 3b 0a 20 20 7d   av==2 ?1:0;.  }
153e0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
153f0 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
15400 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a  n rc;.#endif.}..
15410 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
15420 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 27 61   value of the 'a
15430 75 74 6f 2d 76 61 63 75 75 6d 27 20 70 72 6f 70  uto-vacuum' prop
15440 65 72 74 79 2e 20 49 66 20 61 75 74 6f 2d 76 61  erty. If auto-va
15450 63 75 75 6d 20 69 73 20 0a 2a 2a 20 65 6e 61 62  cuum is .** enab
15460 6c 65 64 20 31 20 69 73 20 72 65 74 75 72 6e 65  led 1 is returne
15470 64 2e 20 4f 74 68 65 72 77 69 73 65 20 30 2e 0a  d. Otherwise 0..
15480 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
15490 72 65 65 47 65 74 41 75 74 6f 56 61 63 75 75 6d  reeGetAutoVacuum
154a0 28 42 74 72 65 65 20 2a 70 29 7b 0a 23 69 66 64  (Btree *p){.#ifd
154b0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
154c0 55 54 4f 56 41 43 55 55 4d 0a 20 20 72 65 74 75  UTOVACUUM.  retu
154d0 72 6e 20 42 54 52 45 45 5f 41 55 54 4f 56 41 43  rn BTREE_AUTOVAC
154e0 55 55 4d 5f 4e 4f 4e 45 3b 0a 23 65 6c 73 65 0a  UUM_NONE;.#else.
154f0 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69    int rc;.  sqli
15500 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
15510 3b 0a 20 20 72 63 20 3d 20 28 0a 20 20 20 20 28  ;.  rc = (.    (
15520 21 70 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63  !p->pBt->autoVac
15530 75 75 6d 29 3f 42 54 52 45 45 5f 41 55 54 4f 56  uum)?BTREE_AUTOV
15540 41 43 55 55 4d 5f 4e 4f 4e 45 3a 0a 20 20 20 20  ACUUM_NONE:.    
15550 28 21 70 2d 3e 70 42 74 2d 3e 69 6e 63 72 56 61  (!p->pBt->incrVa
15560 63 75 75 6d 29 3f 42 54 52 45 45 5f 41 55 54 4f  cuum)?BTREE_AUTO
15570 56 41 43 55 55 4d 5f 46 55 4c 4c 3a 0a 20 20 20  VACUUM_FULL:.   
15580 20 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55   BTREE_AUTOVACUU
15590 4d 5f 49 4e 43 52 0a 20 20 29 3b 0a 20 20 73 71  M_INCR.  );.  sq
155a0 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
155b0 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
155c0 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a  .#endif.}.../*.*
155d0 2a 20 47 65 74 20 61 20 72 65 66 65 72 65 6e 63  * Get a referenc
155e0 65 20 74 6f 20 70 50 61 67 65 31 20 6f 66 20 74  e to pPage1 of t
155f0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
15600 2e 20 20 54 68 69 73 20 77 69 6c 6c 0a 2a 2a 20  .  This will.** 
15610 61 6c 73 6f 20 61 63 71 75 69 72 65 20 61 20 72  also acquire a r
15620 65 61 64 6c 6f 63 6b 20 6f 6e 20 74 68 61 74 20  eadlock on that 
15630 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49  file..**.** SQLI
15640 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
15650 64 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 49  d on success.  I
15660 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 6e 6f  f the file is no
15670 74 20 61 0a 2a 2a 20 77 65 6c 6c 2d 66 6f 72 6d  t a.** well-form
15680 65 64 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ed database file
15690 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f 43 4f  , then SQLITE_CO
156a0 52 52 55 50 54 20 69 73 20 72 65 74 75 72 6e 65  RRUPT is returne
156b0 64 2e 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53  d..** SQLITE_BUS
156c0 59 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  Y is returned if
156d0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
156e0 20 6c 6f 63 6b 65 64 2e 20 20 53 51 4c 49 54 45   locked.  SQLITE
156f0 5f 4e 4f 4d 45 4d 0a 2a 2a 20 69 73 20 72 65 74  _NOMEM.** is ret
15700 75 72 6e 65 64 20 69 66 20 77 65 20 72 75 6e 20  urned if we run 
15710 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 2e 20 0a  out of memory. .
15720 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 6f  */.static int lo
15730 63 6b 42 74 72 65 65 28 42 74 53 68 61 72 65 64  ckBtree(BtShared
15740 20 2a 70 42 74 29 7b 0a 20 20 69 6e 74 20 72 63   *pBt){.  int rc
15750 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
15760 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 66 72  * Result code fr
15770 6f 6d 20 73 75 62 66 75 6e 63 74 69 6f 6e 73 20  om subfunctions 
15780 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  */.  MemPage *pP
15790 61 67 65 31 3b 20 20 20 20 20 2f 2a 20 50 61 67  age1;     /* Pag
157a0 65 20 31 20 6f 66 20 74 68 65 20 64 61 74 61 62  e 1 of the datab
157b0 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e  ase file */.  in
157c0 74 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20  t nPage;        
157d0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
157e0 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74  pages in the dat
157f0 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  abase */.  int n
15800 50 61 67 65 46 69 6c 65 20 3d 20 30 3b 20 20 20  PageFile = 0;   
15810 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
15820 65 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  es in the databa
15830 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  se file */.  int
15840 20 6e 50 61 67 65 48 65 61 64 65 72 3b 20 20 20   nPageHeader;   
15850 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
15860 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61  ages in the data
15870 62 61 73 65 20 61 63 63 6f 72 64 69 6e 67 20 74  base according t
15880 6f 20 68 64 72 20 2a 2f 0a 0a 20 20 61 73 73 65  o hdr */..  asse
15890 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
158a0 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
158b0 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
158c0 70 42 74 2d 3e 70 50 61 67 65 31 3d 3d 30 20 29  pBt->pPage1==0 )
158d0 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
158e0 50 61 67 65 72 53 68 61 72 65 64 4c 6f 63 6b 28  PagerSharedLock(
158f0 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20  pBt->pPager);.  
15900 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
15910 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
15920 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61   rc = btreeGetPa
15930 67 65 28 70 42 74 2c 20 31 2c 20 26 70 50 61 67  ge(pBt, 1, &pPag
15940 65 31 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63  e1, 0);.  if( rc
15950 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
15960 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 44  turn rc;..  /* D
15970 6f 20 73 6f 6d 65 20 63 68 65 63 6b 69 6e 67 20  o some checking 
15980 74 6f 20 68 65 6c 70 20 69 6e 73 75 72 65 20 74  to help insure t
15990 68 65 20 66 69 6c 65 20 77 65 20 6f 70 65 6e 65  he file we opene
159a0 64 20 72 65 61 6c 6c 79 20 69 73 0a 20 20 2a 2a  d really is.  **
159b0 20 61 20 76 61 6c 69 64 20 64 61 74 61 62 61 73   a valid databas
159c0 65 20 66 69 6c 65 2e 20 0a 20 20 2a 2f 0a 20 20  e file. .  */.  
159d0 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 48 65 61  nPage = nPageHea
159e0 64 65 72 20 3d 20 67 65 74 34 62 79 74 65 28 32  der = get4byte(2
159f0 38 2b 28 75 38 2a 29 70 50 61 67 65 31 2d 3e 61  8+(u8*)pPage1->a
15a00 44 61 74 61 29 3b 0a 20 20 73 71 6c 69 74 65 33  Data);.  sqlite3
15a10 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  PagerPagecount(p
15a20 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 6e 50 61  Bt->pPager, &nPa
15a30 67 65 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 6e  geFile);.  if( n
15a40 50 61 67 65 3d 3d 30 20 7c 7c 20 6d 65 6d 63 6d  Page==0 || memcm
15a50 70 28 32 34 2b 28 75 38 2a 29 70 50 61 67 65 31  p(24+(u8*)pPage1
15a60 2d 3e 61 44 61 74 61 2c 20 39 32 2b 28 75 38 2a  ->aData, 92+(u8*
15a70 29 70 50 61 67 65 31 2d 3e 61 44 61 74 61 2c 34  )pPage1->aData,4
15a80 29 21 3d 30 20 29 7b 0a 20 20 20 20 6e 50 61 67  )!=0 ){.    nPag
15a90 65 20 3d 20 6e 50 61 67 65 46 69 6c 65 3b 0a 20  e = nPageFile;. 
15aa0 20 7d 0a 20 20 69 66 28 20 6e 50 61 67 65 3e 30   }.  if( nPage>0
15ab0 20 29 7b 0a 20 20 20 20 75 33 32 20 70 61 67 65   ){.    u32 page
15ac0 53 69 7a 65 3b 0a 20 20 20 20 75 33 32 20 75 73  Size;.    u32 us
15ad0 61 62 6c 65 53 69 7a 65 3b 0a 20 20 20 20 75 38  ableSize;.    u8
15ae0 20 2a 70 61 67 65 31 20 3d 20 70 50 61 67 65 31   *page1 = pPage1
15af0 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 72 63 20  ->aData;.    rc 
15b00 3d 20 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42 3b  = SQLITE_NOTADB;
15b10 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45  .    /* EVIDENCE
15b20 2d 4f 46 3a 20 52 2d 34 33 37 33 37 2d 33 39 39  -OF: R-43737-399
15b30 39 39 20 45 76 65 72 79 20 76 61 6c 69 64 20 53  99 Every valid S
15b40 51 4c 69 74 65 20 64 61 74 61 62 61 73 65 20 66  QLite database f
15b50 69 6c 65 20 62 65 67 69 6e 73 0a 20 20 20 20 2a  ile begins.    *
15b60 2a 20 77 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f  * with the follo
15b70 77 69 6e 67 20 31 36 20 62 79 74 65 73 20 28 69  wing 16 bytes (i
15b80 6e 20 68 65 78 29 3a 20 35 33 20 35 31 20 34 63  n hex): 53 51 4c
15b90 20 36 39 20 37 34 20 36 35 20 32 30 20 36 36 20   69 74 65 20 66 
15ba0 36 66 20 37 32 20 36 64 0a 20 20 20 20 2a 2a 20  6f 72 6d.    ** 
15bb0 36 31 20 37 34 20 32 30 20 33 33 20 30 30 2e 20  61 74 20 33 00. 
15bc0 2a 2f 0a 20 20 20 20 69 66 28 20 6d 65 6d 63 6d  */.    if( memcm
15bd0 70 28 70 61 67 65 31 2c 20 7a 4d 61 67 69 63 48  p(page1, zMagicH
15be0 65 61 64 65 72 2c 20 31 36 29 21 3d 30 20 29 7b  eader, 16)!=0 ){
15bf0 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65  .      goto page
15c00 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20  1_init_failed;. 
15c10 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c     }..#ifdef SQL
15c20 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 20  ITE_OMIT_WAL.   
15c30 20 69 66 28 20 70 61 67 65 31 5b 31 38 5d 3e 31   if( page1[18]>1
15c40 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 62   ){.      pBt->b
15c50 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 52  tsFlags |= BTS_R
15c60 45 41 44 5f 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a  EAD_ONLY;.    }.
15c70 20 20 20 20 69 66 28 20 70 61 67 65 31 5b 31 39      if( page1[19
15c80 5d 3e 31 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  ]>1 ){.      got
15c90 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69  o page1_init_fai
15ca0 6c 65 64 3b 0a 20 20 20 20 7d 0a 23 65 6c 73 65  led;.    }.#else
15cb0 0a 20 20 20 20 69 66 28 20 70 61 67 65 31 5b 31  .    if( page1[1
15cc0 38 5d 3e 32 20 29 7b 0a 20 20 20 20 20 20 70 42  8]>2 ){.      pB
15cd0 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42  t->btsFlags |= B
15ce0 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 3b 0a 20 20  TS_READ_ONLY;.  
15cf0 20 20 7d 0a 20 20 20 20 69 66 28 20 70 61 67 65    }.    if( page
15d00 31 5b 31 39 5d 3e 32 20 29 7b 0a 20 20 20 20 20  1[19]>2 ){.     
15d10 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74   goto page1_init
15d20 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a  _failed;.    }..
15d30 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 77 72      /* If the wr
15d40 69 74 65 20 76 65 72 73 69 6f 6e 20 69 73 20 73  ite version is s
15d50 65 74 20 74 6f 20 32 2c 20 74 68 69 73 20 64 61  et to 2, this da
15d60 74 61 62 61 73 65 20 73 68 6f 75 6c 64 20 62 65  tabase should be
15d70 20 61 63 63 65 73 73 65 64 0a 20 20 20 20 2a 2a   accessed.    **
15d80 20 69 6e 20 57 41 4c 20 6d 6f 64 65 2e 20 49 66   in WAL mode. If
15d90 20 74 68 65 20 6c 6f 67 20 69 73 20 6e 6f 74 20   the log is not 
15da0 61 6c 72 65 61 64 79 20 6f 70 65 6e 2c 20 6f 70  already open, op
15db0 65 6e 20 69 74 20 6e 6f 77 2e 20 54 68 65 6e 20  en it now. Then 
15dc0 0a 20 20 20 20 2a 2a 20 72 65 74 75 72 6e 20 53  .    ** return S
15dd0 51 4c 49 54 45 5f 4f 4b 20 61 6e 64 20 72 65 74  QLITE_OK and ret
15de0 75 72 6e 20 77 69 74 68 6f 75 74 20 70 6f 70 75  urn without popu
15df0 6c 61 74 69 6e 67 20 42 74 53 68 61 72 65 64 2e  lating BtShared.
15e00 70 50 61 67 65 31 2e 0a 20 20 20 20 2a 2a 20 54  pPage1..    ** T
15e10 68 65 20 63 61 6c 6c 65 72 20 64 65 74 65 63 74  he caller detect
15e20 73 20 74 68 69 73 20 61 6e 64 20 63 61 6c 6c 73  s this and calls
15e30 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   this function a
15e40 67 61 69 6e 2e 20 54 68 69 73 20 69 73 0a 20 20  gain. This is.  
15e50 20 20 2a 2a 20 72 65 71 75 69 72 65 64 20 61 73    ** required as
15e60 20 74 68 65 20 76 65 72 73 69 6f 6e 20 6f 66 20   the version of 
15e70 70 61 67 65 20 31 20 63 75 72 72 65 6e 74 6c 79  page 1 currently
15e80 20 69 6e 20 74 68 65 20 70 61 67 65 31 20 62 75   in the page1 bu
15e90 66 66 65 72 0a 20 20 20 20 2a 2a 20 6d 61 79 20  ffer.    ** may 
15ea0 6e 6f 74 20 62 65 20 74 68 65 20 6c 61 74 65 73  not be the lates
15eb0 74 20 76 65 72 73 69 6f 6e 20 2d 20 74 68 65 72  t version - ther
15ec0 65 20 6d 61 79 20 62 65 20 61 20 6e 65 77 65 72  e may be a newer
15ed0 20 6f 6e 65 20 69 6e 20 74 68 65 20 6c 6f 67 0a   one in the log.
15ee0 20 20 20 20 2a 2a 20 66 69 6c 65 2e 0a 20 20 20      ** file..   
15ef0 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 61 67 65   */.    if( page
15f00 31 5b 31 39 5d 3d 3d 32 20 26 26 20 28 70 42 74  1[19]==2 && (pBt
15f10 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53  ->btsFlags & BTS
15f20 5f 4e 4f 5f 57 41 4c 29 3d 3d 30 20 29 7b 0a 20  _NO_WAL)==0 ){. 
15f30 20 20 20 20 20 69 6e 74 20 69 73 4f 70 65 6e 20       int isOpen 
15f40 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  = 0;.      rc = 
15f50 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e  sqlite3PagerOpen
15f60 57 61 6c 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  Wal(pBt->pPager,
15f70 20 26 69 73 4f 70 65 6e 29 3b 0a 20 20 20 20 20   &isOpen);.     
15f80 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
15f90 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  OK ){.        go
15fa0 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61  to page1_init_fa
15fb0 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d 65 6c 73  iled;.      }els
15fc0 65 20 69 66 28 20 69 73 4f 70 65 6e 3d 3d 30 20  e if( isOpen==0 
15fd0 29 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61  ){.        relea
15fe0 73 65 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a  sePage(pPage1);.
15ff0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
16000 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
16010 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  }.      rc = SQL
16020 49 54 45 5f 4e 4f 54 41 44 42 3b 0a 20 20 20 20  ITE_NOTADB;.    
16030 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a  }.#endif..    /*
16040 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
16050 31 35 34 36 35 2d 32 30 38 31 33 20 54 68 65 20  15465-20813 The 
16060 6d 61 78 69 6d 75 6d 20 61 6e 64 20 6d 69 6e 69  maximum and mini
16070 6d 75 6d 20 65 6d 62 65 64 64 65 64 20 70 61 79  mum embedded pay
16080 6c 6f 61 64 0a 20 20 20 20 2a 2a 20 66 72 61 63  load.    ** frac
16090 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 6c 65  tions and the le
160a0 61 66 20 70 61 79 6c 6f 61 64 20 66 72 61 63 74  af payload fract
160b0 69 6f 6e 20 76 61 6c 75 65 73 20 6d 75 73 74 20  ion values must 
160c0 62 65 20 36 34 2c 20 33 32 2c 20 61 6e 64 20 33  be 64, 32, and 3
160d0 32 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  2..    **.    **
160e0 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 65   The original de
160f0 73 69 67 6e 20 61 6c 6c 6f 77 65 64 20 74 68 65  sign allowed the
16100 73 65 20 61 6d 6f 75 6e 74 73 20 74 6f 20 76 61  se amounts to va
16110 72 79 2c 20 62 75 74 20 61 73 20 6f 66 0a 20 20  ry, but as of.  
16120 20 20 2a 2a 20 76 65 72 73 69 6f 6e 20 33 2e 36    ** version 3.6
16130 2e 30 2c 20 77 65 20 72 65 71 75 69 72 65 20 74  .0, we require t
16140 68 65 6d 20 74 6f 20 62 65 20 66 69 78 65 64 2e  hem to be fixed.
16150 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
16160 6d 65 6d 63 6d 70 28 26 70 61 67 65 31 5b 32 31  memcmp(&page1[21
16170 5d 2c 20 22 5c 31 30 30 5c 30 34 30 5c 30 34 30  ], "\100\040\040
16180 22 2c 33 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ",3)!=0 ){.     
16190 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74   goto page1_init
161a0 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20  _failed;.    }. 
161b0 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
161c0 46 3a 20 52 2d 35 31 38 37 33 2d 33 39 36 31 38  F: R-51873-39618
161d0 20 54 68 65 20 70 61 67 65 20 73 69 7a 65 20 66   The page size f
161e0 6f 72 20 61 20 64 61 74 61 62 61 73 65 20 66 69  or a database fi
161f0 6c 65 20 69 73 0a 20 20 20 20 2a 2a 20 64 65 74  le is.    ** det
16200 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20 32  ermined by the 2
16210 2d 62 79 74 65 20 69 6e 74 65 67 65 72 20 6c 6f  -byte integer lo
16220 63 61 74 65 64 20 61 74 20 61 6e 20 6f 66 66 73  cated at an offs
16230 65 74 20 6f 66 20 31 36 20 62 79 74 65 73 20 66  et of 16 bytes f
16240 72 6f 6d 0a 20 20 20 20 2a 2a 20 74 68 65 20 62  rom.    ** the b
16250 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
16260 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a  database file. *
16270 2f 0a 20 20 20 20 70 61 67 65 53 69 7a 65 20 3d  /.    pageSize =
16280 20 28 70 61 67 65 31 5b 31 36 5d 3c 3c 38 29 20   (page1[16]<<8) 
16290 7c 20 28 70 61 67 65 31 5b 31 37 5d 3c 3c 31 36  | (page1[17]<<16
162a0 29 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  );.    /* EVIDEN
162b0 43 45 2d 4f 46 3a 20 52 2d 32 35 30 30 38 2d 32  CE-OF: R-25008-2
162c0 31 36 38 38 20 54 68 65 20 73 69 7a 65 20 6f 66  1688 The size of
162d0 20 61 20 70 61 67 65 20 69 73 20 61 20 70 6f 77   a page is a pow
162e0 65 72 20 6f 66 20 74 77 6f 0a 20 20 20 20 2a 2a  er of two.    **
162f0 20 62 65 74 77 65 65 6e 20 35 31 32 20 61 6e 64   between 512 and
16300 20 36 35 35 33 36 20 69 6e 63 6c 75 73 69 76 65   65536 inclusive
16310 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 28 70  . */.    if( ((p
16320 61 67 65 53 69 7a 65 2d 31 29 26 70 61 67 65 53  ageSize-1)&pageS
16330 69 7a 65 29 21 3d 30 0a 20 20 20 20 20 7c 7c 20  ize)!=0.     || 
16340 70 61 67 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f  pageSize>SQLITE_
16350 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 0a 20  MAX_PAGE_SIZE . 
16360 20 20 20 20 7c 7c 20 70 61 67 65 53 69 7a 65 3c      || pageSize<
16370 3d 32 35 36 20 0a 20 20 20 20 29 7b 0a 20 20 20  =256 .    ){.   
16380 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e     goto page1_in
16390 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d  it_failed;.    }
163a0 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70 61  .    assert( (pa
163b0 67 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29  geSize & 7)==0 )
163c0 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43  ;.    /* EVIDENC
163d0 45 2d 4f 46 3a 20 52 2d 35 39 33 31 30 2d 35 31  E-OF: R-59310-51
163e0 32 30 35 20 54 68 65 20 22 72 65 73 65 72 76 65  205 The "reserve
163f0 64 20 73 70 61 63 65 22 20 73 69 7a 65 20 69 6e  d space" size in
16400 20 74 68 65 20 31 2d 62 79 74 65 0a 20 20 20 20   the 1-byte.    
16410 2a 2a 20 69 6e 74 65 67 65 72 20 61 74 20 6f 66  ** integer at of
16420 66 73 65 74 20 32 30 20 69 73 20 74 68 65 20 6e  fset 20 is the n
16430 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f  umber of bytes o
16440 66 20 73 70 61 63 65 20 61 74 20 74 68 65 20 65  f space at the e
16450 6e 64 20 6f 66 0a 20 20 20 20 2a 2a 20 65 61 63  nd of.    ** eac
16460 68 20 70 61 67 65 20 74 6f 20 72 65 73 65 72 76  h page to reserv
16470 65 20 66 6f 72 20 65 78 74 65 6e 73 69 6f 6e 73  e for extensions
16480 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  . .    **.    **
16490 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
164a0 33 37 34 39 37 2d 34 32 34 31 32 20 54 68 65 20  37497-42412 The 
164b0 73 69 7a 65 20 6f 66 20 74 68 65 20 72 65 73 65  size of the rese
164c0 72 76 65 64 20 72 65 67 69 6f 6e 20 69 73 0a 20  rved region is. 
164d0 20 20 20 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64     ** determined
164e0 20 62 79 20 74 68 65 20 6f 6e 65 2d 62 79 74 65   by the one-byte
164f0 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 65 67 65   unsigned intege
16500 72 20 66 6f 75 6e 64 20 61 74 20 61 6e 20 6f 66  r found at an of
16510 66 73 65 74 20 6f 66 20 32 30 0a 20 20 20 20 2a  fset of 20.    *
16520 2a 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62  * into the datab
16530 61 73 65 20 66 69 6c 65 20 68 65 61 64 65 72 2e  ase file header.
16540 20 2a 2f 0a 20 20 20 20 75 73 61 62 6c 65 53 69   */.    usableSi
16550 7a 65 20 3d 20 70 61 67 65 53 69 7a 65 20 2d 20  ze = pageSize - 
16560 70 61 67 65 31 5b 32 30 5d 3b 0a 20 20 20 20 69  page1[20];.    i
16570 66 28 20 28 75 33 32 29 70 61 67 65 53 69 7a 65  f( (u32)pageSize
16580 21 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  !=pBt->pageSize 
16590 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 66 74 65  ){.      /* Afte
165a0 72 20 72 65 61 64 69 6e 67 20 74 68 65 20 66 69  r reading the fi
165b0 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20  rst page of the 
165c0 64 61 74 61 62 61 73 65 20 61 73 73 75 6d 69 6e  database assumin
165d0 67 20 61 20 70 61 67 65 20 73 69 7a 65 0a 20 20  g a page size.  
165e0 20 20 20 20 2a 2a 20 6f 66 20 42 74 53 68 61 72      ** of BtShar
165f0 65 64 2e 70 61 67 65 53 69 7a 65 2c 20 77 65 20  ed.pageSize, we 
16600 68 61 76 65 20 64 69 73 63 6f 76 65 72 65 64 20  have discovered 
16610 74 68 61 74 20 74 68 65 20 70 61 67 65 2d 73 69  that the page-si
16620 7a 65 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 61  ze is.      ** a
16630 63 74 75 61 6c 6c 79 20 70 61 67 65 53 69 7a 65  ctually pageSize
16640 2e 20 55 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74  . Unlock the dat
16650 61 62 61 73 65 2c 20 6c 65 61 76 65 20 70 42 74  abase, leave pBt
16660 2d 3e 70 50 61 67 65 31 20 61 74 0a 20 20 20 20  ->pPage1 at.    
16670 20 20 2a 2a 20 7a 65 72 6f 20 61 6e 64 20 72 65    ** zero and re
16680 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20  turn SQLITE_OK. 
16690 54 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20  The caller will 
166a0 63 61 6c 6c 20 74 68 69 73 20 66 75 6e 63 74 69  call this functi
166b0 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 61 67 61 69  on.      ** agai
166c0 6e 20 77 69 74 68 20 74 68 65 20 63 6f 72 72 65  n with the corre
166d0 63 74 20 70 61 67 65 2d 73 69 7a 65 2e 0a 20 20  ct page-size..  
166e0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 65 6c      */.      rel
166f0 65 61 73 65 50 61 67 65 28 70 50 61 67 65 31 29  easePage(pPage1)
16700 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 75 73 61  ;.      pBt->usa
16710 62 6c 65 53 69 7a 65 20 3d 20 75 73 61 62 6c 65  bleSize = usable
16720 53 69 7a 65 3b 0a 20 20 20 20 20 20 70 42 74 2d  Size;.      pBt-
16730 3e 70 61 67 65 53 69 7a 65 20 3d 20 70 61 67 65  >pageSize = page
16740 53 69 7a 65 3b 0a 20 20 20 20 20 20 66 72 65 65  Size;.      free
16750 54 65 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a  TempSpace(pBt);.
16760 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
16770 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73 69  e3PagerSetPagesi
16780 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  ze(pBt->pPager, 
16790 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2c 0a  &pBt->pageSize,.
167a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
167b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
167c0 20 20 20 70 61 67 65 53 69 7a 65 2d 75 73 61 62     pageSize-usab
167d0 6c 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 72  leSize);.      r
167e0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
167f0 20 20 20 20 69 66 28 20 28 70 42 74 2d 3e 64 62      if( (pBt->db
16800 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
16810 5f 52 65 63 6f 76 65 72 79 4d 6f 64 65 29 3d 3d  _RecoveryMode)==
16820 30 20 26 26 20 6e 50 61 67 65 3e 6e 50 61 67 65  0 && nPage>nPage
16830 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 72 63  File ){.      rc
16840 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
16850 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f  T_BKPT;.      go
16860 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61  to page1_init_fa
16870 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20  iled;.    }.    
16880 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
16890 52 2d 32 38 33 31 32 2d 36 34 37 30 34 20 48 6f  R-28312-64704 Ho
168a0 77 65 76 65 72 2c 20 74 68 65 20 75 73 61 62 6c  wever, the usabl
168b0 65 20 73 69 7a 65 20 69 73 20 6e 6f 74 20 61 6c  e size is not al
168c0 6c 6f 77 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20  lowed to.    ** 
168d0 62 65 20 6c 65 73 73 20 74 68 61 6e 20 34 38 30  be less than 480
168e0 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73  . In other words
168f0 2c 20 69 66 20 74 68 65 20 70 61 67 65 20 73 69  , if the page si
16900 7a 65 20 69 73 20 35 31 32 2c 20 74 68 65 6e 20  ze is 512, then 
16910 74 68 65 0a 20 20 20 20 2a 2a 20 72 65 73 65 72  the.    ** reser
16920 76 65 64 20 73 70 61 63 65 20 73 69 7a 65 20 63  ved space size c
16930 61 6e 6e 6f 74 20 65 78 63 65 65 64 20 33 32 2e  annot exceed 32.
16940 20 2a 2f 0a 20 20 20 20 69 66 28 20 75 73 61 62   */.    if( usab
16950 6c 65 53 69 7a 65 3c 34 38 30 20 29 7b 0a 20 20  leSize<480 ){.  
16960 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69      goto page1_i
16970 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20  nit_failed;.    
16980 7d 0a 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53  }.    pBt->pageS
16990 69 7a 65 20 3d 20 70 61 67 65 53 69 7a 65 3b 0a  ize = pageSize;.
169a0 20 20 20 20 70 42 74 2d 3e 75 73 61 62 6c 65 53      pBt->usableS
169b0 69 7a 65 20 3d 20 75 73 61 62 6c 65 53 69 7a 65  ize = usableSize
169c0 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
169d0 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
169e0 0a 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61  .    pBt->autoVa
169f0 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65  cuum = (get4byte
16a00 28 26 70 61 67 65 31 5b 33 36 20 2b 20 34 2a 34  (&page1[36 + 4*4
16a10 5d 29 3f 31 3a 30 29 3b 0a 20 20 20 20 70 42 74  ])?1:0);.    pBt
16a20 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 28  ->incrVacuum = (
16a30 67 65 74 34 62 79 74 65 28 26 70 61 67 65 31 5b  get4byte(&page1[
16a40 33 36 20 2b 20 37 2a 34 5d 29 3f 31 3a 30 29 3b  36 + 7*4])?1:0);
16a50 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 2f  .#endif.  }..  /
16a60 2a 20 6d 61 78 4c 6f 63 61 6c 20 69 73 20 74 68  * maxLocal is th
16a70 65 20 6d 61 78 69 6d 75 6d 20 61 6d 6f 75 6e 74  e maximum amount
16a80 20 6f 66 20 70 61 79 6c 6f 61 64 20 74 6f 20 73   of payload to s
16a90 74 6f 72 65 20 6c 6f 63 61 6c 6c 79 20 66 6f 72  tore locally for
16aa0 0a 20 20 2a 2a 20 61 20 63 65 6c 6c 2e 20 20 4d  .  ** a cell.  M
16ab0 61 6b 65 20 73 75 72 65 20 69 74 20 69 73 20 73  ake sure it is s
16ac0 6d 61 6c 6c 20 65 6e 6f 75 67 68 20 73 6f 20 74  mall enough so t
16ad0 68 61 74 20 61 74 20 6c 65 61 73 74 20 6d 69 6e  hat at least min
16ae0 46 61 6e 6f 75 74 0a 20 20 2a 2a 20 63 65 6c 6c  Fanout.  ** cell
16af0 73 20 63 61 6e 20 77 69 6c 6c 20 66 69 74 20 6f  s can will fit o
16b00 6e 20 6f 6e 65 20 70 61 67 65 2e 20 20 57 65 20  n one page.  We 
16b10 61 73 73 75 6d 65 20 61 20 31 30 2d 62 79 74 65  assume a 10-byte
16b20 20 70 61 67 65 20 68 65 61 64 65 72 2e 0a 20 20   page header..  
16b30 2a 2a 20 42 65 73 69 64 65 73 20 74 68 65 20 70  ** Besides the p
16b40 61 79 6c 6f 61 64 2c 20 74 68 65 20 63 65 6c 6c  ayload, the cell
16b50 20 6d 75 73 74 20 73 74 6f 72 65 3a 0a 20 20 2a   must store:.  *
16b60 2a 20 20 20 20 20 32 2d 62 79 74 65 20 70 6f 69  *     2-byte poi
16b70 6e 74 65 72 20 74 6f 20 74 68 65 20 63 65 6c 6c  nter to the cell
16b80 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62 79 74 65  .  **     4-byte
16b90 20 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 0a 20   child pointer. 
16ba0 20 2a 2a 20 20 20 20 20 39 2d 62 79 74 65 20 6e   **     9-byte n
16bb0 4b 65 79 20 76 61 6c 75 65 0a 20 20 2a 2a 20 20  Key value.  **  
16bc0 20 20 20 34 2d 62 79 74 65 20 6e 44 61 74 61 20     4-byte nData 
16bd0 76 61 6c 75 65 0a 20 20 2a 2a 20 20 20 20 20 34  value.  **     4
16be0 2d 62 79 74 65 20 6f 76 65 72 66 6c 6f 77 20 70  -byte overflow p
16bf0 61 67 65 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a  age pointer.  **
16c00 20 53 6f 20 61 20 63 65 6c 6c 20 63 6f 6e 73 69   So a cell consi
16c10 73 74 73 20 6f 66 20 61 20 32 2d 62 79 74 65 20  sts of a 2-byte 
16c20 70 6f 69 6e 74 65 72 2c 20 61 20 68 65 61 64 65  pointer, a heade
16c30 72 20 77 68 69 63 68 20 69 73 20 61 73 20 6d 75  r which is as mu
16c40 63 68 20 61 73 0a 20 20 2a 2a 20 31 37 20 62 79  ch as.  ** 17 by
16c50 74 65 73 20 6c 6f 6e 67 2c 20 30 20 74 6f 20 4e  tes long, 0 to N
16c60 20 62 79 74 65 73 20 6f 66 20 70 61 79 6c 6f 61   bytes of payloa
16c70 64 2c 20 61 6e 64 20 61 6e 20 6f 70 74 69 6f 6e  d, and an option
16c80 61 6c 20 34 20 62 79 74 65 20 6f 76 65 72 66 6c  al 4 byte overfl
16c90 6f 77 0a 20 20 2a 2a 20 70 61 67 65 20 70 6f 69  ow.  ** page poi
16ca0 6e 74 65 72 2e 0a 20 20 2a 2f 0a 20 20 70 42 74  nter..  */.  pBt
16cb0 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 28 75 31  ->maxLocal = (u1
16cc0 36 29 28 28 70 42 74 2d 3e 75 73 61 62 6c 65 53  6)((pBt->usableS
16cd0 69 7a 65 2d 31 32 29 2a 36 34 2f 32 35 35 20 2d  ize-12)*64/255 -
16ce0 20 32 33 29 3b 0a 20 20 70 42 74 2d 3e 6d 69 6e   23);.  pBt->min
16cf0 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 28 28 70  Local = (u16)((p
16d00 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31  Bt->usableSize-1
16d10 32 29 2a 33 32 2f 32 35 35 20 2d 20 32 33 29 3b  2)*32/255 - 23);
16d20 0a 20 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66 20  .  pBt->maxLeaf 
16d30 3d 20 28 75 31 36 29 28 70 42 74 2d 3e 75 73 61  = (u16)(pBt->usa
16d40 62 6c 65 53 69 7a 65 20 2d 20 33 35 29 3b 0a 20  bleSize - 35);. 
16d50 20 70 42 74 2d 3e 6d 69 6e 4c 65 61 66 20 3d 20   pBt->minLeaf = 
16d60 28 75 31 36 29 28 28 70 42 74 2d 3e 75 73 61 62  (u16)((pBt->usab
16d70 6c 65 53 69 7a 65 2d 31 32 29 2a 33 32 2f 32 35  leSize-12)*32/25
16d80 35 20 2d 20 32 33 29 3b 0a 20 20 69 66 28 20 70  5 - 23);.  if( p
16d90 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3e 31 32 37  Bt->maxLocal>127
16da0 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e 6d 61 78   ){.    pBt->max
16db0 31 62 79 74 65 50 61 79 6c 6f 61 64 20 3d 20 31  1bytePayload = 1
16dc0 32 37 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  27;.  }else{.   
16dd0 20 70 42 74 2d 3e 6d 61 78 31 62 79 74 65 50 61   pBt->max1bytePa
16de0 79 6c 6f 61 64 20 3d 20 28 75 38 29 70 42 74 2d  yload = (u8)pBt-
16df0 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20 7d 0a 20  >maxLocal;.  }. 
16e00 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6d 61   assert( pBt->ma
16e10 78 4c 65 61 66 20 2b 20 32 33 20 3c 3d 20 4d 58  xLeaf + 23 <= MX
16e20 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20  _CELL_SIZE(pBt) 
16e30 29 3b 0a 20 20 70 42 74 2d 3e 70 50 61 67 65 31  );.  pBt->pPage1
16e40 20 3d 20 70 50 61 67 65 31 3b 0a 20 20 70 42 74   = pPage1;.  pBt
16e50 2d 3e 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 3b  ->nPage = nPage;
16e60 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
16e70 5f 4f 4b 3b 0a 0a 70 61 67 65 31 5f 69 6e 69 74  _OK;..page1_init
16e80 5f 66 61 69 6c 65 64 3a 0a 20 20 72 65 6c 65 61  _failed:.  relea
16e90 73 65 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a  sePage(pPage1);.
16ea0 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20    pBt->pPage1 = 
16eb0 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  0;.  return rc;.
16ec0 7d 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  }..#ifndef NDEBU
16ed0 47 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  G./*.** Return t
16ee0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 75 72  he number of cur
16ef0 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 70 42 74  sors open on pBt
16f00 2e 20 54 68 69 73 20 69 73 20 66 6f 72 20 75 73  . This is for us
16f10 65 0a 2a 2a 20 69 6e 20 61 73 73 65 72 74 28 29  e.** in assert()
16f20 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 20 73 6f   expressions, so
16f30 20 69 74 20 69 73 20 6f 6e 6c 79 20 63 6f 6d 70   it is only comp
16f40 69 6c 65 64 20 69 66 20 4e 44 45 42 55 47 20 69  iled if NDEBUG i
16f50 73 20 6e 6f 74 0a 2a 2a 20 64 65 66 69 6e 65 64  s not.** defined
16f60 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 77 72 69  ..**.** Only wri
16f70 74 65 20 63 75 72 73 6f 72 73 20 61 72 65 20 63  te cursors are c
16f80 6f 75 6e 74 65 64 20 69 66 20 77 72 4f 6e 6c 79  ounted if wrOnly
16f90 20 69 73 20 74 72 75 65 2e 20 20 49 66 20 77 72   is true.  If wr
16fa0 4f 6e 6c 79 20 69 73 0a 2a 2a 20 66 61 6c 73 65  Only is.** false
16fb0 20 74 68 65 6e 20 61 6c 6c 20 63 75 72 73 6f 72   then all cursor
16fc0 73 20 61 72 65 20 63 6f 75 6e 74 65 64 2e 0a 2a  s are counted..*
16fd0 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 70 75 72  *.** For the pur
16fe0 70 6f 73 65 73 20 6f 66 20 74 68 69 73 20 72 6f  poses of this ro
16ff0 75 74 69 6e 65 2c 20 61 20 63 75 72 73 6f 72 20  utine, a cursor 
17000 69 73 20 61 6e 79 20 63 75 72 73 6f 72 20 74 68  is any cursor th
17010 61 74 0a 2a 2a 20 69 73 20 63 61 70 61 62 6c 65  at.** is capable
17020 20 6f 66 20 72 65 61 64 69 6e 67 20 6f 72 20 77   of reading or w
17030 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 64 61  riting to the da
17040 74 61 62 61 73 65 2e 20 20 43 75 72 73 6f 72 73  tabase.  Cursors
17050 20 74 68 61 74 0a 2a 2a 20 68 61 76 65 20 62 65   that.** have be
17060 65 6e 20 74 72 69 70 70 65 64 20 69 6e 74 6f 20  en tripped into 
17070 74 68 65 20 43 55 52 53 4f 52 5f 46 41 55 4c 54  the CURSOR_FAULT
17080 20 73 74 61 74 65 20 61 72 65 20 6e 6f 74 20 63   state are not c
17090 6f 75 6e 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  ounted..*/.stati
170a0 63 20 69 6e 74 20 63 6f 75 6e 74 56 61 6c 69 64  c int countValid
170b0 43 75 72 73 6f 72 73 28 42 74 53 68 61 72 65 64  Cursors(BtShared
170c0 20 2a 70 42 74 2c 20 69 6e 74 20 77 72 4f 6e 6c   *pBt, int wrOnl
170d0 79 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  y){.  BtCursor *
170e0 70 43 75 72 3b 0a 20 20 69 6e 74 20 72 20 3d 20  pCur;.  int r = 
170f0 30 3b 0a 20 20 66 6f 72 28 70 43 75 72 3d 70 42  0;.  for(pCur=pB
17100 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 43 75 72  t->pCursor; pCur
17110 3b 20 70 43 75 72 3d 70 43 75 72 2d 3e 70 4e 65  ; pCur=pCur->pNe
17120 78 74 29 7b 0a 20 20 20 20 69 66 28 20 28 77 72  xt){.    if( (wr
17130 4f 6e 6c 79 3d 3d 30 20 7c 7c 20 28 70 43 75 72  Only==0 || (pCur
17140 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43  ->curFlags & BTC
17150 46 5f 57 72 69 74 65 46 6c 61 67 29 21 3d 30 29  F_WriteFlag)!=0)
17160 0a 20 20 20 20 20 26 26 20 70 43 75 72 2d 3e 65  .     && pCur->e
17170 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 46 41  State!=CURSOR_FA
17180 55 4c 54 20 29 20 72 2b 2b 3b 20 0a 20 20 7d 0a  ULT ) r++; .  }.
17190 20 20 72 65 74 75 72 6e 20 72 3b 0a 7d 0a 23 65    return r;.}.#e
171a0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74  ndif../*.** If t
171b0 68 65 72 65 20 61 72 65 20 6e 6f 20 6f 75 74 73  here are no outs
171c0 74 61 6e 64 69 6e 67 20 63 75 72 73 6f 72 73 20  tanding cursors 
171d0 61 6e 64 20 77 65 20 61 72 65 20 6e 6f 74 20 69  and we are not i
171e0 6e 20 74 68 65 20 6d 69 64 64 6c 65 0a 2a 2a 20  n the middle.** 
171f0 6f 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  of a transaction
17200 20 62 75 74 20 74 68 65 72 65 20 69 73 20 61 20   but there is a 
17210 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  read lock on the
17220 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e 0a   database, then.
17230 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ** this routine 
17240 75 6e 72 65 66 73 20 74 68 65 20 66 69 72 73 74  unrefs the first
17250 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61 74   page of the dat
17260 61 62 61 73 65 20 66 69 6c 65 20 77 68 69 63 68  abase file which
17270 20 0a 2a 2a 20 68 61 73 20 74 68 65 20 65 66 66   .** has the eff
17280 65 63 74 20 6f 66 20 72 65 6c 65 61 73 69 6e 67  ect of releasing
17290 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a   the read lock..
172a0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 69  **.** If there i
172b0 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  s a transaction 
172c0 69 6e 20 70 72 6f 67 72 65 73 73 2c 20 74 68 69  in progress, thi
172d0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
172e0 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  o-op..*/.static 
172f0 76 6f 69 64 20 75 6e 6c 6f 63 6b 42 74 72 65 65  void unlockBtree
17300 49 66 55 6e 75 73 65 64 28 42 74 53 68 61 72 65  IfUnused(BtShare
17310 64 20 2a 70 42 74 29 7b 0a 20 20 61 73 73 65 72  d *pBt){.  asser
17320 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
17330 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
17340 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63  ) );.  assert( c
17350 6f 75 6e 74 56 61 6c 69 64 43 75 72 73 6f 72 73  ountValidCursors
17360 28 70 42 74 2c 30 29 3d 3d 30 20 7c 7c 20 70 42  (pBt,0)==0 || pB
17370 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
17380 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 3b 0a 20  >TRANS_NONE );. 
17390 20 69 66 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e   if( pBt->inTran
173a0 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 4e  saction==TRANS_N
173b0 4f 4e 45 20 26 26 20 70 42 74 2d 3e 70 50 61 67  ONE && pBt->pPag
173c0 65 31 21 3d 30 20 29 7b 0a 20 20 20 20 4d 65 6d  e1!=0 ){.    Mem
173d0 50 61 67 65 20 2a 70 50 61 67 65 31 20 3d 20 70  Page *pPage1 = p
173e0 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20 20 20  Bt->pPage1;.    
173f0 61 73 73 65 72 74 28 20 70 50 61 67 65 31 2d 3e  assert( pPage1->
17400 61 44 61 74 61 20 29 3b 0a 20 20 20 20 61 73 73  aData );.    ass
17410 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
17420 72 52 65 66 63 6f 75 6e 74 28 70 42 74 2d 3e 70  rRefcount(pBt->p
17430 50 61 67 65 72 29 3d 3d 31 20 29 3b 0a 20 20 20  Pager)==1 );.   
17440 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 30   pBt->pPage1 = 0
17450 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67  ;.    releasePag
17460 65 28 70 50 61 67 65 31 29 3b 0a 20 20 7d 0a 7d  e(pPage1);.  }.}
17470 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70 42 74 20 70  ../*.** If pBt p
17480 6f 69 6e 74 73 20 74 6f 20 61 6e 20 65 6d 70 74  oints to an empt
17490 79 20 66 69 6c 65 20 74 68 65 6e 20 63 6f 6e 76  y file then conv
174a0 65 72 74 20 74 68 61 74 20 65 6d 70 74 79 20 66  ert that empty f
174b0 69 6c 65 0a 2a 2a 20 69 6e 74 6f 20 61 20 6e 65  ile.** into a ne
174c0 77 20 65 6d 70 74 79 20 64 61 74 61 62 61 73 65  w empty database
174d0 20 62 79 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67   by initializing
174e0 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20   the first page 
174f0 6f 66 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61  of.** the databa
17500 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  se..*/.static in
17510 74 20 6e 65 77 44 61 74 61 62 61 73 65 28 42 74  t newDatabase(Bt
17520 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20  Shared *pBt){.  
17530 4d 65 6d 50 61 67 65 20 2a 70 50 31 3b 0a 20 20  MemPage *pP1;.  
17540 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64  unsigned char *d
17550 61 74 61 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  ata;.  int rc;..
17560 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
17570 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
17580 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66  ->mutex) );.  if
17590 28 20 70 42 74 2d 3e 6e 50 61 67 65 3e 30 20 29  ( pBt->nPage>0 )
175a0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
175b0 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 50  ITE_OK;.  }.  pP
175c0 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b  1 = pBt->pPage1;
175d0 0a 20 20 61 73 73 65 72 74 28 20 70 50 31 21 3d  .  assert( pP1!=
175e0 30 20 29 3b 0a 20 20 64 61 74 61 20 3d 20 70 50  0 );.  data = pP
175f0 31 2d 3e 61 44 61 74 61 3b 0a 20 20 72 63 20 3d  1->aData;.  rc =
17600 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
17610 74 65 28 70 50 31 2d 3e 70 44 62 50 61 67 65 29  te(pP1->pDbPage)
17620 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
17630 75 72 6e 20 72 63 3b 0a 20 20 6d 65 6d 63 70 79  urn rc;.  memcpy
17640 28 64 61 74 61 2c 20 7a 4d 61 67 69 63 48 65 61  (data, zMagicHea
17650 64 65 72 2c 20 73 69 7a 65 6f 66 28 7a 4d 61 67  der, sizeof(zMag
17660 69 63 48 65 61 64 65 72 29 29 3b 0a 20 20 61 73  icHeader));.  as
17670 73 65 72 74 28 20 73 69 7a 65 6f 66 28 7a 4d 61  sert( sizeof(zMa
17680 67 69 63 48 65 61 64 65 72 29 3d 3d 31 36 20 29  gicHeader)==16 )
17690 3b 0a 20 20 64 61 74 61 5b 31 36 5d 20 3d 20 28  ;.  data[16] = (
176a0 75 38 29 28 28 70 42 74 2d 3e 70 61 67 65 53 69  u8)((pBt->pageSi
176b0 7a 65 3e 3e 38 29 26 30 78 66 66 29 3b 0a 20 20  ze>>8)&0xff);.  
176c0 64 61 74 61 5b 31 37 5d 20 3d 20 28 75 38 29 28  data[17] = (u8)(
176d0 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3e  (pBt->pageSize>>
176e0 31 36 29 26 30 78 66 66 29 3b 0a 20 20 64 61 74  16)&0xff);.  dat
176f0 61 5b 31 38 5d 20 3d 20 31 3b 0a 20 20 64 61 74  a[18] = 1;.  dat
17700 61 5b 31 39 5d 20 3d 20 31 3b 0a 20 20 61 73 73  a[19] = 1;.  ass
17710 65 72 74 28 20 70 42 74 2d 3e 75 73 61 62 6c 65  ert( pBt->usable
17720 53 69 7a 65 3c 3d 70 42 74 2d 3e 70 61 67 65 53  Size<=pBt->pageS
17730 69 7a 65 20 26 26 20 70 42 74 2d 3e 75 73 61 62  ize && pBt->usab
17740 6c 65 53 69 7a 65 2b 32 35 35 3e 3d 70 42 74 2d  leSize+255>=pBt-
17750 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 64 61  >pageSize);.  da
17760 74 61 5b 32 30 5d 20 3d 20 28 75 38 29 28 70 42  ta[20] = (u8)(pB
17770 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 42  t->pageSize - pB
17780 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a  t->usableSize);.
17790 20 20 64 61 74 61 5b 32 31 5d 20 3d 20 36 34 3b    data[21] = 64;
177a0 0a 20 20 64 61 74 61 5b 32 32 5d 20 3d 20 33 32  .  data[22] = 32
177b0 3b 0a 20 20 64 61 74 61 5b 32 33 5d 20 3d 20 33  ;.  data[23] = 3
177c0 32 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74  2;.  memset(&dat
177d0 61 5b 32 34 5d 2c 20 30 2c 20 31 30 30 2d 32 34  a[24], 0, 100-24
177e0 29 3b 0a 20 20 7a 65 72 6f 50 61 67 65 28 70 50  );.  zeroPage(pP
177f0 31 2c 20 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54  1, PTF_INTKEY|PT
17800 46 5f 4c 45 41 46 7c 50 54 46 5f 4c 45 41 46 44  F_LEAF|PTF_LEAFD
17810 41 54 41 20 29 3b 0a 20 20 70 42 74 2d 3e 62 74  ATA );.  pBt->bt
17820 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 50 41  sFlags |= BTS_PA
17830 47 45 53 49 5a 45 5f 46 49 58 45 44 3b 0a 23 69  GESIZE_FIXED;.#i
17840 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
17850 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 61  T_AUTOVACUUM.  a
17860 73 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f  ssert( pBt->auto
17870 56 61 63 75 75 6d 3d 3d 31 20 7c 7c 20 70 42 74  Vacuum==1 || pBt
17880 2d 3e 61 75 74 6f 56 61 63 75 75 6d 3d 3d 30 20  ->autoVacuum==0 
17890 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  );.  assert( pBt
178a0 2d 3e 69 6e 63 72 56 61 63 75 75 6d 3d 3d 31 20  ->incrVacuum==1 
178b0 7c 7c 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75  || pBt->incrVacu
178c0 75 6d 3d 3d 30 20 29 3b 0a 20 20 70 75 74 34 62  um==0 );.  put4b
178d0 79 74 65 28 26 64 61 74 61 5b 33 36 20 2b 20 34  yte(&data[36 + 4
178e0 2a 34 5d 2c 20 70 42 74 2d 3e 61 75 74 6f 56 61  *4], pBt->autoVa
178f0 63 75 75 6d 29 3b 0a 20 20 70 75 74 34 62 79 74  cuum);.  put4byt
17900 65 28 26 64 61 74 61 5b 33 36 20 2b 20 37 2a 34  e(&data[36 + 7*4
17910 5d 2c 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75  ], pBt->incrVacu
17920 75 6d 29 3b 0a 23 65 6e 64 69 66 0a 20 20 70 42  um);.#endif.  pB
17930 74 2d 3e 6e 50 61 67 65 20 3d 20 31 3b 0a 20 20  t->nPage = 1;.  
17940 64 61 74 61 5b 33 31 5d 20 3d 20 31 3b 0a 20 20  data[31] = 1;.  
17950 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
17960 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69  ;.}../*.** Initi
17970 61 6c 69 7a 65 20 74 68 65 20 66 69 72 73 74 20  alize the first 
17980 70 61 67 65 20 6f 66 20 74 68 65 20 64 61 74 61  page of the data
17990 62 61 73 65 20 66 69 6c 65 20 28 63 72 65 61 74  base file (creat
179a0 69 6e 67 20 61 20 64 61 74 61 62 61 73 65 0a 2a  ing a database.*
179b0 2a 20 63 6f 6e 73 69 73 74 69 6e 67 20 6f 66 20  * consisting of 
179c0 61 20 73 69 6e 67 6c 65 20 70 61 67 65 20 61 6e  a single page an
179d0 64 20 6e 6f 20 73 63 68 65 6d 61 20 6f 62 6a 65  d no schema obje
179e0 63 74 73 29 2e 20 52 65 74 75 72 6e 20 53 51 4c  cts). Return SQL
179f0 49 54 45 5f 4f 4b 0a 2a 2a 20 69 66 20 73 75 63  ITE_OK.** if suc
17a00 63 65 73 73 66 75 6c 2c 20 6f 72 20 61 6e 20 53  cessful, or an S
17a10 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
17a20 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 69   otherwise..*/.i
17a30 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e  nt sqlite3BtreeN
17a40 65 77 44 62 28 42 74 72 65 65 20 2a 70 29 7b 0a  ewDb(Btree *p){.
17a50 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69    int rc;.  sqli
17a60 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
17a70 3b 0a 20 20 70 2d 3e 70 42 74 2d 3e 6e 50 61 67  ;.  p->pBt->nPag
17a80 65 20 3d 20 30 3b 0a 20 20 72 63 20 3d 20 6e 65  e = 0;.  rc = ne
17a90 77 44 61 74 61 62 61 73 65 28 70 2d 3e 70 42 74  wDatabase(p->pBt
17aa0 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
17ab0 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
17ac0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
17ad0 20 41 74 74 65 6d 70 74 20 74 6f 20 73 74 61 72   Attempt to star
17ae0 74 20 61 20 6e 65 77 20 74 72 61 6e 73 61 63 74  t a new transact
17af0 69 6f 6e 2e 20 41 20 77 72 69 74 65 2d 74 72 61  ion. A write-tra
17b00 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 73  nsaction.** is s
17b10 74 61 72 74 65 64 20 69 66 20 74 68 65 20 73 65  tarted if the se
17b20 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73  cond argument is
17b30 20 6e 6f 6e 7a 65 72 6f 2c 20 6f 74 68 65 72 77   nonzero, otherw
17b40 69 73 65 20 61 20 72 65 61 64 2d 0a 2a 2a 20 74  ise a read-.** t
17b50 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 49 66 20  ransaction.  If 
17b60 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
17b70 65 6e 74 20 69 73 20 32 20 6f 72 20 6d 6f 72 65  ent is 2 or more
17b80 20 61 6e 64 20 65 78 63 6c 75 73 69 76 65 0a 2a   and exclusive.*
17b90 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  * transaction is
17ba0 20 73 74 61 72 74 65 64 2c 20 6d 65 61 6e 69 6e   started, meanin
17bb0 67 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20  g that no other 
17bc0 70 72 6f 63 65 73 73 20 69 73 20 61 6c 6c 6f 77  process is allow
17bd0 65 64 0a 2a 2a 20 74 6f 20 61 63 63 65 73 73 20  ed.** to access 
17be0 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 41  the database.  A
17bf0 20 70 72 65 65 78 69 73 74 69 6e 67 20 74 72 61   preexisting tra
17c00 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20 6e 6f 74  nsaction may not
17c10 20 62 65 0a 2a 2a 20 75 70 67 72 61 64 65 64 20   be.** upgraded 
17c20 74 6f 20 65 78 63 6c 75 73 69 76 65 20 62 79 20  to exclusive by 
17c30 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75  calling this rou
17c40 74 69 6e 65 20 61 20 73 65 63 6f 6e 64 20 74 69  tine a second ti
17c50 6d 65 20 2d 20 74 68 65 0a 2a 2a 20 65 78 63 6c  me - the.** excl
17c60 75 73 69 76 69 74 79 20 66 6c 61 67 20 6f 6e 6c  usivity flag onl
17c70 79 20 77 6f 72 6b 73 20 66 6f 72 20 61 20 6e 65  y works for a ne
17c80 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  w transaction..*
17c90 2a 0a 2a 2a 20 41 20 77 72 69 74 65 2d 74 72 61  *.** A write-tra
17ca0 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65  nsaction must be
17cb0 20 73 74 61 72 74 65 64 20 62 65 66 6f 72 65 20   started before 
17cc0 61 74 74 65 6d 70 74 69 6e 67 20 61 6e 79 20 0a  attempting any .
17cd0 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68  ** changes to th
17ce0 65 20 64 61 74 61 62 61 73 65 2e 20 20 4e 6f 6e  e database.  Non
17cf0 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
17d00 6e 67 20 72 6f 75 74 69 6e 65 73 20 0a 2a 2a 20  ng routines .** 
17d10 77 69 6c 6c 20 77 6f 72 6b 20 75 6e 6c 65 73 73  will work unless
17d20 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
17d30 73 20 73 74 61 72 74 65 64 20 66 69 72 73 74 3a  s started first:
17d40 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69  .**.**      sqli
17d50 74 65 33 42 74 72 65 65 43 72 65 61 74 65 54 61  te3BtreeCreateTa
17d60 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71  ble().**      sq
17d70 6c 69 74 65 33 42 74 72 65 65 43 72 65 61 74 65  lite3BtreeCreate
17d80 49 6e 64 65 78 28 29 0a 2a 2a 20 20 20 20 20 20  Index().**      
17d90 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61  sqlite3BtreeClea
17da0 72 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20  rTable().**     
17db0 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 72 6f   sqlite3BtreeDro
17dc0 70 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20  pTable().**     
17dd0 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 73   sqlite3BtreeIns
17de0 65 72 74 28 29 0a 2a 2a 20 20 20 20 20 20 73 71  ert().**      sq
17df0 6c 69 74 65 33 42 74 72 65 65 44 65 6c 65 74 65  lite3BtreeDelete
17e00 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74  ().**      sqlit
17e10 65 33 42 74 72 65 65 55 70 64 61 74 65 4d 65 74  e3BtreeUpdateMet
17e20 61 28 29 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  a().**.** If an 
17e30 69 6e 69 74 69 61 6c 20 61 74 74 65 6d 70 74 20  initial attempt 
17e40 74 6f 20 61 63 71 75 69 72 65 20 74 68 65 20 6c  to acquire the l
17e50 6f 63 6b 20 66 61 69 6c 73 20 62 65 63 61 75 73  ock fails becaus
17e60 65 20 6f 66 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e  e of lock conten
17e70 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 74 68 65 20  tion.** and the 
17e80 64 61 74 61 62 61 73 65 20 77 61 73 20 70 72 65  database was pre
17e90 76 69 6f 75 73 6c 79 20 75 6e 6c 6f 63 6b 65 64  viously unlocked
17ea0 2c 20 74 68 65 6e 20 69 6e 76 6f 6b 65 20 74 68  , then invoke th
17eb0 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 0a 2a  e busy handler.*
17ec0 2a 20 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e  * if there is on
17ed0 65 2e 20 20 42 75 74 20 69 66 20 74 68 65 72 65  e.  But if there
17ee0 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20   was previously 
17ef0 61 20 72 65 61 64 2d 6c 6f 63 6b 2c 20 64 6f 20  a read-lock, do 
17f00 6e 6f 74 0a 2a 2a 20 69 6e 76 6f 6b 65 20 74 68  not.** invoke th
17f10 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20 2d  e busy handler -
17f20 20 6a 75 73 74 20 72 65 74 75 72 6e 20 53 51 4c   just return SQL
17f30 49 54 45 5f 42 55 53 59 2e 20 20 53 51 4c 49 54  ITE_BUSY.  SQLIT
17f40 45 5f 42 55 53 59 20 69 73 20 0a 2a 2a 20 72 65  E_BUSY is .** re
17f50 74 75 72 6e 65 64 20 77 68 65 6e 20 74 68 65 72  turned when ther
17f60 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 20 72  e is already a r
17f70 65 61 64 2d 6c 6f 63 6b 20 69 6e 20 6f 72 64 65  ead-lock in orde
17f80 72 20 74 6f 20 61 76 6f 69 64 20 61 20 64 65 61  r to avoid a dea
17f90 64 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 75 70  dlock..**.** Sup
17fa0 70 6f 73 65 20 74 68 65 72 65 20 61 72 65 20 74  pose there are t
17fb0 77 6f 20 70 72 6f 63 65 73 73 65 73 20 41 20 61  wo processes A a
17fc0 6e 64 20 42 2e 20 20 41 20 68 61 73 20 61 20 72  nd B.  A has a r
17fd0 65 61 64 20 6c 6f 63 6b 20 61 6e 64 20 42 20 68  ead lock and B h
17fe0 61 73 0a 2a 2a 20 61 20 72 65 73 65 72 76 65 64  as.** a reserved
17ff0 20 6c 6f 63 6b 2e 20 20 42 20 74 72 69 65 73 20   lock.  B tries 
18000 74 6f 20 70 72 6f 6d 6f 74 65 20 74 6f 20 65 78  to promote to ex
18010 63 6c 75 73 69 76 65 20 62 75 74 20 69 73 20 62  clusive but is b
18020 6c 6f 63 6b 65 64 20 62 65 63 61 75 73 65 0a 2a  locked because.*
18030 2a 20 6f 66 20 41 27 73 20 72 65 61 64 20 6c 6f  * of A's read lo
18040 63 6b 2e 20 20 41 20 74 72 69 65 73 20 74 6f 20  ck.  A tries to 
18050 70 72 6f 6d 6f 74 65 20 74 6f 20 72 65 73 65 72  promote to reser
18060 76 65 64 20 62 75 74 20 69 73 20 62 6c 6f 63 6b  ved but is block
18070 65 64 20 62 79 20 42 2e 0a 2a 2a 20 4f 6e 65 20  ed by B..** One 
18080 6f 72 20 74 68 65 20 6f 74 68 65 72 20 6f 66 20  or the other of 
18090 74 68 65 20 74 77 6f 20 70 72 6f 63 65 73 73 65  the two processe
180a0 73 20 6d 75 73 74 20 67 69 76 65 20 77 61 79 20  s must give way 
180b0 6f 72 20 74 68 65 72 65 20 63 61 6e 20 62 65 0a  or there can be.
180c0 2a 2a 20 6e 6f 20 70 72 6f 67 72 65 73 73 2e 20  ** no progress. 
180d0 20 42 79 20 72 65 74 75 72 6e 69 6e 67 20 53 51   By returning SQ
180e0 4c 49 54 45 5f 42 55 53 59 20 61 6e 64 20 6e 6f  LITE_BUSY and no
180f0 74 20 69 6e 76 6f 6b 69 6e 67 20 74 68 65 20 62  t invoking the b
18100 75 73 79 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a 20  usy callback.** 
18110 77 68 65 6e 20 41 20 61 6c 72 65 61 64 79 20 68  when A already h
18120 61 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 2c 20  as a read lock, 
18130 77 65 20 65 6e 63 6f 75 72 61 67 65 20 41 20 74  we encourage A t
18140 6f 20 67 69 76 65 20 75 70 20 61 6e 64 20 6c 65  o give up and le
18150 74 20 42 0a 2a 2a 20 70 72 6f 63 65 65 64 2e 0a  t B.** proceed..
18160 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
18170 72 65 65 42 65 67 69 6e 54 72 61 6e 73 28 42 74  reeBeginTrans(Bt
18180 72 65 65 20 2a 70 2c 20 69 6e 74 20 77 72 66 6c  ree *p, int wrfl
18190 61 67 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  ag){.  sqlite3 *
181a0 70 42 6c 6f 63 6b 20 3d 20 30 3b 0a 20 20 42 74  pBlock = 0;.  Bt
181b0 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
181c0 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d  >pBt;.  int rc =
181d0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 73   SQLITE_OK;..  s
181e0 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
181f0 28 70 29 3b 0a 20 20 62 74 72 65 65 49 6e 74 65  (p);.  btreeInte
18200 67 72 69 74 79 28 70 29 3b 0a 0a 20 20 2f 2a 20  grity(p);..  /* 
18210 49 66 20 74 68 65 20 62 74 72 65 65 20 69 73 20  If the btree is 
18220 61 6c 72 65 61 64 79 20 69 6e 20 61 20 77 72 69  already in a wri
18230 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  te-transaction, 
18240 6f 72 20 69 74 0a 20 20 2a 2a 20 69 73 20 61 6c  or it.  ** is al
18250 72 65 61 64 79 20 69 6e 20 61 20 72 65 61 64 2d  ready in a read-
18260 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20  transaction and 
18270 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69  a read-transacti
18280 6f 6e 0a 20 20 2a 2a 20 69 73 20 72 65 71 75 65  on.  ** is reque
18290 73 74 65 64 2c 20 74 68 69 73 20 69 73 20 61 20  sted, this is a 
182a0 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69 66  no-op..  */.  if
182b0 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52  ( p->inTrans==TR
182c0 41 4e 53 5f 57 52 49 54 45 20 7c 7c 20 28 70 2d  ANS_WRITE || (p-
182d0 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
182e0 52 45 41 44 20 26 26 20 21 77 72 66 6c 61 67 29  READ && !wrflag)
182f0 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 74 72 61   ){.    goto tra
18300 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 20 20  ns_begun;.  }.  
18310 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54  assert( pBt->inT
18320 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e  ransaction==TRAN
18330 53 5f 57 52 49 54 45 20 7c 7c 20 49 66 4e 6f 74  S_WRITE || IfNot
18340 4f 6d 69 74 41 56 28 70 42 74 2d 3e 62 44 6f 54  OmitAV(pBt->bDoT
18350 72 75 6e 63 61 74 65 29 3d 3d 30 20 29 3b 0a 0a  runcate)==0 );..
18360 20 20 2f 2a 20 57 72 69 74 65 20 74 72 61 6e 73    /* Write trans
18370 61 63 74 69 6f 6e 73 20 61 72 65 20 6e 6f 74 20  actions are not 
18380 70 6f 73 73 69 62 6c 65 20 6f 6e 20 61 20 72 65  possible on a re
18390 61 64 2d 6f 6e 6c 79 20 64 61 74 61 62 61 73 65  ad-only database
183a0 20 2a 2f 0a 20 20 69 66 28 20 28 70 42 74 2d 3e   */.  if( (pBt->
183b0 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 52  btsFlags & BTS_R
183c0 45 41 44 5f 4f 4e 4c 59 29 21 3d 30 20 26 26 20  EAD_ONLY)!=0 && 
183d0 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 72 63  wrflag ){.    rc
183e0 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e   = SQLITE_READON
183f0 4c 59 3b 0a 20 20 20 20 67 6f 74 6f 20 74 72 61  LY;.    goto tra
18400 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 0a 23  ns_begun;.  }..#
18410 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
18420 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a  IT_SHARED_CACHE.
18430 20 20 2f 2a 20 49 66 20 61 6e 6f 74 68 65 72 20    /* If another 
18440 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
18450 68 61 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e  has already open
18460 65 64 20 61 20 77 72 69 74 65 20 74 72 61 6e 73  ed a write trans
18470 61 63 74 69 6f 6e 20 0a 20 20 2a 2a 20 6f 6e 20  action .  ** on 
18480 74 68 69 73 20 73 68 61 72 65 64 2d 62 74 72 65  this shared-btre
18490 65 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20  e structure and 
184a0 61 20 73 65 63 6f 6e 64 20 77 72 69 74 65 20 74  a second write t
184b0 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 0a 20 20  ransaction is.  
184c0 2a 2a 20 72 65 71 75 65 73 74 65 64 2c 20 72 65  ** requested, re
184d0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  turn SQLITE_LOCK
184e0 45 44 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28  ED..  */.  if( (
184f0 77 72 66 6c 61 67 20 26 26 20 70 42 74 2d 3e 69  wrflag && pBt->i
18500 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52  nTransaction==TR
18510 41 4e 53 5f 57 52 49 54 45 29 0a 20 20 20 7c 7c  ANS_WRITE).   ||
18520 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20   (pBt->btsFlags 
18530 26 20 42 54 53 5f 50 45 4e 44 49 4e 47 29 21 3d  & BTS_PENDING)!=
18540 30 0a 20 20 29 7b 0a 20 20 20 20 70 42 6c 6f 63  0.  ){.    pBloc
18550 6b 20 3d 20 70 42 74 2d 3e 70 57 72 69 74 65 72  k = pBt->pWriter
18560 2d 3e 64 62 3b 0a 20 20 7d 65 6c 73 65 20 69 66  ->db;.  }else if
18570 28 20 77 72 66 6c 61 67 3e 31 20 29 7b 0a 20 20  ( wrflag>1 ){.  
18580 20 20 42 74 4c 6f 63 6b 20 2a 70 49 74 65 72 3b    BtLock *pIter;
18590 0a 20 20 20 20 66 6f 72 28 70 49 74 65 72 3d 70  .    for(pIter=p
185a0 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 49 74 65 72  Bt->pLock; pIter
185b0 3b 20 70 49 74 65 72 3d 70 49 74 65 72 2d 3e 70  ; pIter=pIter->p
185c0 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28  Next){.      if(
185d0 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65 21 3d   pIter->pBtree!=
185e0 70 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42 6c  p ){.        pBl
185f0 6f 63 6b 20 3d 20 70 49 74 65 72 2d 3e 70 42 74  ock = pIter->pBt
18600 72 65 65 2d 3e 64 62 3b 0a 20 20 20 20 20 20 20  ree->db;.       
18610 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
18620 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
18630 70 42 6c 6f 63 6b 20 29 7b 0a 20 20 20 20 73 71  pBlock ){.    sq
18640 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 42  lite3ConnectionB
18650 6c 6f 63 6b 65 64 28 70 2d 3e 64 62 2c 20 70 42  locked(p->db, pB
18660 6c 6f 63 6b 29 3b 0a 20 20 20 20 72 63 20 3d 20  lock);.    rc = 
18670 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48  SQLITE_LOCKED_SH
18680 41 52 45 44 43 41 43 48 45 3b 0a 20 20 20 20 67  AREDCACHE;.    g
18690 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b  oto trans_begun;
186a0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
186b0 2a 20 41 6e 79 20 72 65 61 64 2d 6f 6e 6c 79 20  * Any read-only 
186c0 6f 72 20 72 65 61 64 2d 77 72 69 74 65 20 74 72  or read-write tr
186d0 61 6e 73 61 63 74 69 6f 6e 20 69 6d 70 6c 69 65  ansaction implie
186e0 73 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e  s a read-lock on
186f0 20 0a 20 20 2a 2a 20 70 61 67 65 20 31 2e 20 53   .  ** page 1. S
18700 6f 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 20  o if some other 
18710 73 68 61 72 65 64 2d 63 61 63 68 65 20 63 6c 69  shared-cache cli
18720 65 6e 74 20 61 6c 72 65 61 64 79 20 68 61 73 20  ent already has 
18730 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 0a 20 20  a write-lock .  
18740 2a 2a 20 6f 6e 20 70 61 67 65 20 31 2c 20 74 68  ** on page 1, th
18750 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 61  e transaction ca
18760 6e 6e 6f 74 20 62 65 20 6f 70 65 6e 65 64 2e 20  nnot be opened. 
18770 2a 2f 0a 20 20 72 63 20 3d 20 71 75 65 72 79 53  */.  rc = queryS
18780 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
18790 6f 63 6b 28 70 2c 20 4d 41 53 54 45 52 5f 52 4f  ock(p, MASTER_RO
187a0 4f 54 2c 20 52 45 41 44 5f 4c 4f 43 4b 29 3b 0a  OT, READ_LOCK);.
187b0 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
187c0 3d 72 63 20 29 20 67 6f 74 6f 20 74 72 61 6e 73  =rc ) goto trans
187d0 5f 62 65 67 75 6e 3b 0a 0a 20 20 70 42 74 2d 3e  _begun;..  pBt->
187e0 62 74 73 46 6c 61 67 73 20 26 3d 20 7e 42 54 53  btsFlags &= ~BTS
187f0 5f 49 4e 49 54 49 41 4c 4c 59 5f 45 4d 50 54 59  _INITIALLY_EMPTY
18800 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 6e 50 61  ;.  if( pBt->nPa
18810 67 65 3d 3d 30 20 29 20 70 42 74 2d 3e 62 74 73  ge==0 ) pBt->bts
18820 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 49 4e 49  Flags |= BTS_INI
18830 54 49 41 4c 4c 59 5f 45 4d 50 54 59 3b 0a 20 20  TIALLY_EMPTY;.  
18840 64 6f 20 7b 0a 20 20 20 20 2f 2a 20 43 61 6c 6c  do {.    /* Call
18850 20 6c 6f 63 6b 42 74 72 65 65 28 29 20 75 6e 74   lockBtree() unt
18860 69 6c 20 65 69 74 68 65 72 20 70 42 74 2d 3e 70  il either pBt->p
18870 50 61 67 65 31 20 69 73 20 70 6f 70 75 6c 61 74  Page1 is populat
18880 65 64 20 6f 72 0a 20 20 20 20 2a 2a 20 6c 6f 63  ed or.    ** loc
18890 6b 42 74 72 65 65 28 29 20 72 65 74 75 72 6e 73  kBtree() returns
188a0 20 73 6f 6d 65 74 68 69 6e 67 20 6f 74 68 65 72   something other
188b0 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e   than SQLITE_OK.
188c0 20 6c 6f 63 6b 42 74 72 65 65 28 29 0a 20 20 20   lockBtree().   
188d0 20 2a 2a 20 6d 61 79 20 72 65 74 75 72 6e 20 53   ** may return S
188e0 51 4c 49 54 45 5f 4f 4b 20 62 75 74 20 6c 65 61  QLITE_OK but lea
188f0 76 65 20 70 42 74 2d 3e 70 50 61 67 65 31 20 73  ve pBt->pPage1 s
18900 65 74 20 74 6f 20 30 20 69 66 20 61 66 74 65 72  et to 0 if after
18910 0a 20 20 20 20 2a 2a 20 72 65 61 64 69 6e 67 20  .    ** reading 
18920 70 61 67 65 20 31 20 69 74 20 64 69 73 63 6f 76  page 1 it discov
18930 65 72 73 20 74 68 61 74 20 74 68 65 20 70 61 67  ers that the pag
18940 65 2d 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61  e-size of the da
18950 74 61 62 61 73 65 20 0a 20 20 20 20 2a 2a 20 66  tabase .    ** f
18960 69 6c 65 20 69 73 20 6e 6f 74 20 70 42 74 2d 3e  ile is not pBt->
18970 70 61 67 65 53 69 7a 65 2e 20 49 6e 20 74 68 69  pageSize. In thi
18980 73 20 63 61 73 65 20 6c 6f 63 6b 42 74 72 65 65  s case lockBtree
18990 28 29 20 77 69 6c 6c 20 75 70 64 61 74 65 0a 20  () will update. 
189a0 20 20 20 2a 2a 20 70 42 74 2d 3e 70 61 67 65 53     ** pBt->pageS
189b0 69 7a 65 20 74 6f 20 74 68 65 20 70 61 67 65 2d  ize to the page-
189c0 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65  size of the file
189d0 20 6f 6e 20 64 69 73 6b 2e 0a 20 20 20 20 2a 2f   on disk..    */
189e0 0a 20 20 20 20 77 68 69 6c 65 28 20 70 42 74 2d  .    while( pBt-
189f0 3e 70 50 61 67 65 31 3d 3d 30 20 26 26 20 53 51  >pPage1==0 && SQ
18a00 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20 6c  LITE_OK==(rc = l
18a10 6f 63 6b 42 74 72 65 65 28 70 42 74 29 29 20 29  ockBtree(pBt)) )
18a20 3b 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  ;..    if( rc==S
18a30 51 4c 49 54 45 5f 4f 4b 20 26 26 20 77 72 66 6c  QLITE_OK && wrfl
18a40 61 67 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ag ){.      if( 
18a50 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26  (pBt->btsFlags &
18a60 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 29 21   BTS_READ_ONLY)!
18a70 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  =0 ){.        rc
18a80 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e   = SQLITE_READON
18a90 4c 59 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  LY;.      }else{
18aa0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
18ab0 6c 69 74 65 33 50 61 67 65 72 42 65 67 69 6e 28  lite3PagerBegin(
18ac0 70 42 74 2d 3e 70 50 61 67 65 72 2c 77 72 66 6c  pBt->pPager,wrfl
18ad0 61 67 3e 31 2c 73 71 6c 69 74 65 33 54 65 6d 70  ag>1,sqlite3Temp
18ae0 49 6e 4d 65 6d 6f 72 79 28 70 2d 3e 64 62 29 29  InMemory(p->db))
18af0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
18b00 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
18b10 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 6e 65           rc = ne
18b20 77 44 61 74 61 62 61 73 65 28 70 42 74 29 3b 0a  wDatabase(pBt);.
18b30 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
18b40 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 69  }.    }.  .    i
18b50 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
18b60 20 29 7b 0a 20 20 20 20 20 20 75 6e 6c 6f 63 6b   ){.      unlock
18b70 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 70 42  BtreeIfUnused(pB
18b80 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69  t);.    }.  }whi
18b90 6c 65 28 20 28 72 63 26 30 78 46 46 29 3d 3d 53  le( (rc&0xFF)==S
18ba0 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20 70 42  QLITE_BUSY && pB
18bb0 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
18bc0 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 0a  ==TRANS_NONE &&.
18bd0 20 20 20 20 20 20 20 20 20 20 62 74 72 65 65 49            btreeI
18be0 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72  nvokeBusyHandler
18bf0 28 70 42 74 29 20 29 3b 0a 0a 20 20 69 66 28 20  (pBt) );..  if( 
18c00 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
18c10 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 6e 54 72  .    if( p->inTr
18c20 61 6e 73 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20  ans==TRANS_NONE 
18c30 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 54  ){.      pBt->nT
18c40 72 61 6e 73 61 63 74 69 6f 6e 2b 2b 3b 0a 23 69  ransaction++;.#i
18c50 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
18c60 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20  T_SHARED_CACHE. 
18c70 20 20 20 20 20 69 66 28 20 70 2d 3e 73 68 61 72       if( p->shar
18c80 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20  able ){.        
18c90 61 73 73 65 72 74 28 20 70 2d 3e 6c 6f 63 6b 2e  assert( p->lock.
18ca0 70 42 74 72 65 65 3d 3d 70 20 26 26 20 70 2d 3e  pBtree==p && p->
18cb0 6c 6f 63 6b 2e 69 54 61 62 6c 65 3d 3d 31 20 29  lock.iTable==1 )
18cc0 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6c 6f 63  ;.        p->loc
18cd0 6b 2e 65 4c 6f 63 6b 20 3d 20 52 45 41 44 5f 4c  k.eLock = READ_L
18ce0 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  OCK;.        p->
18cf0 6c 6f 63 6b 2e 70 4e 65 78 74 20 3d 20 70 42 74  lock.pNext = pBt
18d00 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 20 20 20 20 20  ->pLock;.       
18d10 20 70 42 74 2d 3e 70 4c 6f 63 6b 20 3d 20 26 70   pBt->pLock = &p
18d20 2d 3e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 7d 0a  ->lock;.      }.
18d30 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20  #endif.    }.   
18d40 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 28 77   p->inTrans = (w
18d50 72 66 6c 61 67 3f 54 52 41 4e 53 5f 57 52 49 54  rflag?TRANS_WRIT
18d60 45 3a 54 52 41 4e 53 5f 52 45 41 44 29 3b 0a 20  E:TRANS_READ);. 
18d70 20 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e     if( p->inTran
18d80 73 3e 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  s>pBt->inTransac
18d90 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 70 42  tion ){.      pB
18da0 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
18db0 20 3d 20 70 2d 3e 69 6e 54 72 61 6e 73 3b 0a 20   = p->inTrans;. 
18dc0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 77 72 66     }.    if( wrf
18dd0 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 4d 65 6d  lag ){.      Mem
18de0 50 61 67 65 20 2a 70 50 61 67 65 31 20 3d 20 70  Page *pPage1 = p
18df0 42 74 2d 3e 70 50 61 67 65 31 3b 0a 23 69 66 6e  Bt->pPage1;.#ifn
18e00 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
18e10 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 20  SHARED_CACHE.   
18e20 20 20 20 61 73 73 65 72 74 28 20 21 70 42 74 2d     assert( !pBt-
18e30 3e 70 57 72 69 74 65 72 20 29 3b 0a 20 20 20 20  >pWriter );.    
18e40 20 20 70 42 74 2d 3e 70 57 72 69 74 65 72 20 3d    pBt->pWriter =
18e50 20 70 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 62   p;.      pBt->b
18e60 74 73 46 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f  tsFlags &= ~BTS_
18e70 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 20 20 20  EXCLUSIVE;.     
18e80 20 69 66 28 20 77 72 66 6c 61 67 3e 31 20 29 20   if( wrflag>1 ) 
18e90 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d  pBt->btsFlags |=
18ea0 20 42 54 53 5f 45 58 43 4c 55 53 49 56 45 3b 0a   BTS_EXCLUSIVE;.
18eb0 23 65 6e 64 69 66 0a 0a 20 20 20 20 20 20 2f 2a  #endif..      /*
18ec0 20 49 66 20 74 68 65 20 64 62 2d 73 69 7a 65 20   If the db-size 
18ed0 68 65 61 64 65 72 20 66 69 65 6c 64 20 69 73 20  header field is 
18ee0 69 6e 63 6f 72 72 65 63 74 20 28 61 73 20 69 74  incorrect (as it
18ef0 20 6d 61 79 20 62 65 20 69 66 20 61 6e 20 6f 6c   may be if an ol
18f00 64 0a 20 20 20 20 20 20 2a 2a 20 63 6c 69 65 6e  d.      ** clien
18f10 74 20 68 61 73 20 62 65 65 6e 20 77 72 69 74 69  t has been writi
18f20 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ng the database 
18f30 66 69 6c 65 29 2c 20 75 70 64 61 74 65 20 69 74  file), update it
18f40 20 6e 6f 77 2e 20 44 6f 69 6e 67 0a 20 20 20 20   now. Doing.    
18f50 20 20 2a 2a 20 74 68 69 73 20 73 6f 6f 6e 65 72    ** this sooner
18f60 20 72 61 74 68 65 72 20 74 68 61 6e 20 6c 61 74   rather than lat
18f70 65 72 20 6d 65 61 6e 73 20 74 68 65 20 64 61 74  er means the dat
18f80 61 62 61 73 65 20 73 69 7a 65 20 63 61 6e 20 73  abase size can s
18f90 61 66 65 6c 79 20 0a 20 20 20 20 20 20 2a 2a 20  afely .      ** 
18fa0 72 65 2d 72 65 61 64 20 74 68 65 20 64 61 74 61  re-read the data
18fb0 62 61 73 65 20 73 69 7a 65 20 66 72 6f 6d 20 70  base size from p
18fc0 61 67 65 20 31 20 69 66 20 61 20 73 61 76 65 70  age 1 if a savep
18fd0 6f 69 6e 74 20 6f 72 20 74 72 61 6e 73 61 63 74  oint or transact
18fe0 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 72 6f 6c  ion.      ** rol
18ff0 6c 62 61 63 6b 20 6f 63 63 75 72 73 20 77 69 74  lback occurs wit
19000 68 69 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74  hin the transact
19010 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ion..      */.  
19020 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6e 50 61      if( pBt->nPa
19030 67 65 21 3d 67 65 74 34 62 79 74 65 28 26 70 50  ge!=get4byte(&pP
19040 61 67 65 31 2d 3e 61 44 61 74 61 5b 32 38 5d 29  age1->aData[28])
19050 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
19060 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
19070 74 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61  te(pPage1->pDbPa
19080 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ge);.        if(
19090 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
190a0 7b 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 34  {.          put4
190b0 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44  byte(&pPage1->aD
190c0 61 74 61 5b 32 38 5d 2c 20 70 42 74 2d 3e 6e 50  ata[28], pBt->nP
190d0 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  age);.        }.
190e0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
190f0 7d 0a 0a 0a 74 72 61 6e 73 5f 62 65 67 75 6e 3a  }...trans_begun:
19100 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
19110 45 5f 4f 4b 20 26 26 20 77 72 66 6c 61 67 20 29  E_OK && wrflag )
19120 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61  {.    /* This ca
19130 6c 6c 20 6d 61 6b 65 73 20 73 75 72 65 20 74 68  ll makes sure th
19140 61 74 20 74 68 65 20 70 61 67 65 72 20 68 61 73  at the pager has
19150 20 74 68 65 20 63 6f 72 72 65 63 74 20 6e 75 6d   the correct num
19160 62 65 72 20 6f 66 0a 20 20 20 20 2a 2a 20 6f 70  ber of.    ** op
19170 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 2e 20 49  en savepoints. I
19180 66 20 74 68 65 20 73 65 63 6f 6e 64 20 70 61 72  f the second par
19190 61 6d 65 74 65 72 20 69 73 20 67 72 65 61 74 65  ameter is greate
191a0 72 20 74 68 61 6e 20 30 20 61 6e 64 0a 20 20 20  r than 0 and.   
191b0 20 2a 2a 20 74 68 65 20 73 75 62 2d 6a 6f 75 72   ** the sub-jour
191c0 6e 61 6c 20 69 73 20 6e 6f 74 20 61 6c 72 65 61  nal is not alrea
191d0 64 79 20 6f 70 65 6e 2c 20 74 68 65 6e 20 69 74  dy open, then it
191e0 20 77 69 6c 6c 20 62 65 20 6f 70 65 6e 65 64 20   will be opened 
191f0 68 65 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  here..    */.   
19200 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
19210 65 72 4f 70 65 6e 53 61 76 65 70 6f 69 6e 74 28  erOpenSavepoint(
19220 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 2d 3e  pBt->pPager, p->
19230 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 29 3b  db->nSavepoint);
19240 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65 49 6e 74  .  }..  btreeInt
19250 65 67 72 69 74 79 28 70 29 3b 0a 20 20 73 71 6c  egrity(p);.  sql
19260 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
19270 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
19280 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
19290 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
192a0 4d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  M../*.** Set the
192b0 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74   pointer-map ent
192c0 72 69 65 73 20 66 6f 72 20 61 6c 6c 20 63 68 69  ries for all chi
192d0 6c 64 72 65 6e 20 6f 66 20 70 61 67 65 20 70 50  ldren of page pP
192e0 61 67 65 2e 20 41 6c 73 6f 2c 20 69 66 0a 2a 2a  age. Also, if.**
192f0 20 70 50 61 67 65 20 63 6f 6e 74 61 69 6e 73 20   pPage contains 
19300 63 65 6c 6c 73 20 74 68 61 74 20 70 6f 69 6e 74  cells that point
19310 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   to overflow pag
19320 65 73 2c 20 73 65 74 20 74 68 65 20 70 6f 69 6e  es, set the poin
19330 74 65 72 0a 2a 2a 20 6d 61 70 20 65 6e 74 72 69  ter.** map entri
19340 65 73 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66  es for the overf
19350 6c 6f 77 20 70 61 67 65 73 20 61 73 20 77 65 6c  low pages as wel
19360 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  l..*/.static int
19370 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70 73   setChildPtrmaps
19380 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29  (MemPage *pPage)
19390 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  {.  int i;      
193a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
193b0 20 20 20 20 20 20 20 2f 2a 20 43 6f 75 6e 74 65         /* Counte
193c0 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20  r variable */.  
193d0 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 20 20 20 20  int nCell;      
193e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
193f0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
19400 63 65 6c 6c 73 20 69 6e 20 70 61 67 65 20 70 50  cells in page pP
19410 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  age */.  int rc;
19420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19430 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
19440 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
19450 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
19460 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 75 38  pPage->pBt;.  u8
19470 20 69 73 49 6e 69 74 4f 72 69 67 20 3d 20 70 50   isInitOrig = pP
19480 61 67 65 2d 3e 69 73 49 6e 69 74 3b 0a 20 20 50  age->isInit;.  P
19490 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 50 61 67 65  gno pgno = pPage
194a0 2d 3e 70 67 6e 6f 3b 0a 0a 20 20 61 73 73 65 72  ->pgno;..  asser
194b0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
194c0 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
194d0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 63  ->mutex) );.  rc
194e0 20 3d 20 62 74 72 65 65 49 6e 69 74 50 61 67 65   = btreeInitPage
194f0 28 70 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72  (pPage);.  if( r
19500 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
19510 20 20 20 20 67 6f 74 6f 20 73 65 74 5f 63 68 69      goto set_chi
19520 6c 64 5f 70 74 72 6d 61 70 73 5f 6f 75 74 3b 0a  ld_ptrmaps_out;.
19530 20 20 7d 0a 20 20 6e 43 65 6c 6c 20 3d 20 70 50    }.  nCell = pP
19540 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20 66  age->nCell;..  f
19550 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b  or(i=0; i<nCell;
19560 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70   i++){.    u8 *p
19570 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28  Cell = findCell(
19580 70 50 61 67 65 2c 20 69 29 3b 0a 0a 20 20 20 20  pPage, i);..    
19590 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72  ptrmapPutOvflPtr
195a0 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26  (pPage, pCell, &
195b0 72 63 29 3b 0a 0a 20 20 20 20 69 66 28 20 21 70  rc);..    if( !p
195c0 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
195d0 20 20 20 20 50 67 6e 6f 20 63 68 69 6c 64 50 67      Pgno childPg
195e0 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 70 43  no = get4byte(pC
195f0 65 6c 6c 29 3b 0a 20 20 20 20 20 20 70 74 72 6d  ell);.      ptrm
19600 61 70 50 75 74 28 70 42 74 2c 20 63 68 69 6c 64  apPut(pBt, child
19610 50 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52  Pgno, PTRMAP_BTR
19620 45 45 2c 20 70 67 6e 6f 2c 20 26 72 63 29 3b 0a  EE, pgno, &rc);.
19630 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
19640 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b   !pPage->leaf ){
19650 0a 20 20 20 20 50 67 6e 6f 20 63 68 69 6c 64 50  .    Pgno childP
19660 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26  gno = get4byte(&
19670 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61  pPage->aData[pPa
19680 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  ge->hdrOffset+8]
19690 29 3b 0a 20 20 20 20 70 74 72 6d 61 70 50 75 74  );.    ptrmapPut
196a0 28 70 42 74 2c 20 63 68 69 6c 64 50 67 6e 6f 2c  (pBt, childPgno,
196b0 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70   PTRMAP_BTREE, p
196c0 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 7d 0a 0a  gno, &rc);.  }..
196d0 73 65 74 5f 63 68 69 6c 64 5f 70 74 72 6d 61 70  set_child_ptrmap
196e0 73 5f 6f 75 74 3a 0a 20 20 70 50 61 67 65 2d 3e  s_out:.  pPage->
196f0 69 73 49 6e 69 74 20 3d 20 69 73 49 6e 69 74 4f  isInit = isInitO
19700 72 69 67 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  rig;.  return rc
19710 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 77  ;.}../*.** Somew
19720 68 65 72 65 20 6f 6e 20 70 50 61 67 65 20 69 73  here on pPage is
19730 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 61   a pointer to pa
19740 67 65 20 69 46 72 6f 6d 2e 20 20 4d 6f 64 69 66  ge iFrom.  Modif
19750 79 20 74 68 69 73 20 70 6f 69 6e 74 65 72 20 73  y this pointer s
19760 6f 0a 2a 2a 20 74 68 61 74 20 69 74 20 70 6f 69  o.** that it poi
19770 6e 74 73 20 74 6f 20 69 54 6f 2e 20 50 61 72 61  nts to iTo. Para
19780 6d 65 74 65 72 20 65 54 79 70 65 20 64 65 73 63  meter eType desc
19790 72 69 62 65 73 20 74 68 65 20 74 79 70 65 20 6f  ribes the type o
197a0 66 20 70 6f 69 6e 74 65 72 20 74 6f 0a 2a 2a 20  f pointer to.** 
197b0 62 65 20 6d 6f 64 69 66 69 65 64 2c 20 61 73 20  be modified, as 
197c0 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
197d0 50 54 52 4d 41 50 5f 42 54 52 45 45 3a 20 20 20  PTRMAP_BTREE:   
197e0 20 20 70 50 61 67 65 20 69 73 20 61 20 62 74 72    pPage is a btr
197f0 65 65 2d 70 61 67 65 2e 20 54 68 65 20 70 6f 69  ee-page. The poi
19800 6e 74 65 72 20 70 6f 69 6e 74 73 20 61 74 20 61  nter points at a
19810 20 63 68 69 6c 64 20 0a 2a 2a 20 20 20 20 20 20   child .**      
19820 20 20 20 20 20 20 20 20 20 20 20 20 20 70 61 67               pag
19830 65 20 6f 66 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a  e of pPage..**.*
19840 2a 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  * PTRMAP_OVERFLO
19850 57 31 3a 20 70 50 61 67 65 20 69 73 20 61 20 62  W1: pPage is a b
19860 74 72 65 65 2d 70 61 67 65 2e 20 54 68 65 20 70  tree-page. The p
19870 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20 61 74  ointer points at
19880 20 61 6e 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20   an overflow.** 
19890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
198a0 20 20 70 61 67 65 20 70 6f 69 6e 74 65 64 20 74    page pointed t
198b0 6f 20 62 79 20 6f 6e 65 20 6f 66 20 74 68 65 20  o by one of the 
198c0 63 65 6c 6c 73 20 6f 6e 20 70 50 61 67 65 2e 0a  cells on pPage..
198d0 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f 56 45  **.** PTRMAP_OVE
198e0 52 46 4c 4f 57 32 3a 20 70 50 61 67 65 20 69 73  RFLOW2: pPage is
198f0 20 61 6e 20 6f 76 65 72 66 6c 6f 77 2d 70 61 67   an overflow-pag
19900 65 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20 70  e. The pointer p
19910 6f 69 6e 74 73 20 61 74 20 74 68 65 20 6e 65 78  oints at the nex
19920 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  t.**            
19930 20 20 20 20 20 20 20 6f 76 65 72 66 6c 6f 77 20         overflow 
19940 70 61 67 65 20 69 6e 20 74 68 65 20 6c 69 73 74  page in the list
19950 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
19960 6d 6f 64 69 66 79 50 61 67 65 50 6f 69 6e 74 65  modifyPagePointe
19970 72 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  r(MemPage *pPage
19980 2c 20 50 67 6e 6f 20 69 46 72 6f 6d 2c 20 50 67  , Pgno iFrom, Pg
19990 6e 6f 20 69 54 6f 2c 20 75 38 20 65 54 79 70 65  no iTo, u8 eType
199a0 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ){.  assert( sql
199b0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
199c0 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
199d0 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
199e0 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
199f0 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70  iteable(pPage->p
19a00 44 62 50 61 67 65 29 20 29 3b 0a 20 20 69 66 28  DbPage) );.  if(
19a10 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f   eType==PTRMAP_O
19a20 56 45 52 46 4c 4f 57 32 20 29 7b 0a 20 20 20 20  VERFLOW2 ){.    
19a30 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 69  /* The pointer i
19a40 73 20 61 6c 77 61 79 73 20 74 68 65 20 66 69 72  s always the fir
19a50 73 74 20 34 20 62 79 74 65 73 20 6f 66 20 74 68  st 4 bytes of th
19a60 65 20 70 61 67 65 20 69 6e 20 74 68 69 73 20 63  e page in this c
19a70 61 73 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28  ase.  */.    if(
19a80 20 67 65 74 34 62 79 74 65 28 70 50 61 67 65 2d   get4byte(pPage-
19a90 3e 61 44 61 74 61 29 21 3d 69 46 72 6f 6d 20 29  >aData)!=iFrom )
19aa0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
19ab0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
19ac0 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 75  PT;.    }.    pu
19ad0 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44  t4byte(pPage->aD
19ae0 61 74 61 2c 20 69 54 6f 29 3b 0a 20 20 7d 65 6c  ata, iTo);.  }el
19af0 73 65 7b 0a 20 20 20 20 75 38 20 69 73 49 6e 69  se{.    u8 isIni
19b00 74 4f 72 69 67 20 3d 20 70 50 61 67 65 2d 3e 69  tOrig = pPage->i
19b10 73 49 6e 69 74 3b 0a 20 20 20 20 69 6e 74 20 69  sInit;.    int i
19b20 3b 0a 20 20 20 20 69 6e 74 20 6e 43 65 6c 6c 3b  ;.    int nCell;
19b30 0a 0a 20 20 20 20 62 74 72 65 65 49 6e 69 74 50  ..    btreeInitP
19b40 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20  age(pPage);.    
19b50 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e  nCell = pPage->n
19b60 43 65 6c 6c 3b 0a 0a 20 20 20 20 66 6f 72 28 69  Cell;..    for(i
19b70 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b  =0; i<nCell; i++
19b80 29 7b 0a 20 20 20 20 20 20 75 38 20 2a 70 43 65  ){.      u8 *pCe
19b90 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50  ll = findCell(pP
19ba0 61 67 65 2c 20 69 29 3b 0a 20 20 20 20 20 20 69  age, i);.      i
19bb0 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  f( eType==PTRMAP
19bc0 5f 4f 56 45 52 46 4c 4f 57 31 20 29 7b 0a 20 20  _OVERFLOW1 ){.  
19bd0 20 20 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69        CellInfo i
19be0 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 62 74 72  nfo;.        btr
19bf0 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70  eeParseCellPtr(p
19c00 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e  Page, pCell, &in
19c10 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  fo);.        if(
19c20 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 0a   info.iOverflow.
19c30 20 20 20 20 20 20 20 20 20 26 26 20 70 43 65 6c           && pCel
19c40 6c 2b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77  l+info.iOverflow
19c50 2b 33 3c 3d 70 50 61 67 65 2d 3e 61 44 61 74 61  +3<=pPage->aData
19c60 2b 70 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65  +pPage->maskPage
19c70 0a 20 20 20 20 20 20 20 20 20 26 26 20 69 46 72  .         && iFr
19c80 6f 6d 3d 3d 67 65 74 34 62 79 74 65 28 26 70 43  om==get4byte(&pC
19c90 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c  ell[info.iOverfl
19ca0 6f 77 5d 29 0a 20 20 20 20 20 20 20 20 29 7b 0a  ow]).        ){.
19cb0 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79            put4by
19cc0 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69  te(&pCell[info.i
19cd0 4f 76 65 72 66 6c 6f 77 5d 2c 20 69 54 6f 29 3b  Overflow], iTo);
19ce0 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
19cf0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
19d00 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
19d10 20 69 66 28 20 67 65 74 34 62 79 74 65 28 70 43   if( get4byte(pC
19d20 65 6c 6c 29 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20  ell)==iFrom ){. 
19d30 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74           put4byt
19d40 65 28 70 43 65 6c 6c 2c 20 69 54 6f 29 3b 0a 20  e(pCell, iTo);. 
19d50 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
19d60 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
19d70 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 69  }.    }.  .    i
19d80 66 28 20 69 3d 3d 6e 43 65 6c 6c 20 29 7b 0a 20  f( i==nCell ){. 
19d90 20 20 20 20 20 69 66 28 20 65 54 79 70 65 21 3d       if( eType!=
19da0 50 54 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20  PTRMAP_BTREE || 
19db0 0a 20 20 20 20 20 20 20 20 20 20 67 65 74 34 62  .          get4b
19dc0 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74  yte(&pPage->aDat
19dd0 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
19de0 65 74 2b 38 5d 29 21 3d 69 46 72 6f 6d 20 29 7b  et+8])!=iFrom ){
19df0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
19e00 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
19e10 4b 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  KPT;.      }.   
19e20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61     put4byte(&pPa
19e30 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d  ge->aData[pPage-
19e40 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20 69  >hdrOffset+8], i
19e50 54 6f 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  To);.    }..    
19e60 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20  pPage->isInit = 
19e70 69 73 49 6e 69 74 4f 72 69 67 3b 0a 20 20 7d 0a  isInitOrig;.  }.
19e80 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
19e90 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f  OK;.}.../*.** Mo
19ea0 76 65 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61  ve the open data
19eb0 62 61 73 65 20 70 61 67 65 20 70 44 62 50 61 67  base page pDbPag
19ec0 65 20 74 6f 20 6c 6f 63 61 74 69 6f 6e 20 69 46  e to location iF
19ed0 72 65 65 50 61 67 65 20 69 6e 20 74 68 65 20 0a  reePage in the .
19ee0 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 54 68 65  ** database. The
19ef0 20 70 44 62 50 61 67 65 20 72 65 66 65 72 65 6e   pDbPage referen
19f00 63 65 20 72 65 6d 61 69 6e 73 20 76 61 6c 69 64  ce remains valid
19f10 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 73 43 6f  ..**.** The isCo
19f20 6d 6d 69 74 20 66 6c 61 67 20 69 6e 64 69 63 61  mmit flag indica
19f30 74 65 73 20 74 68 61 74 20 74 68 65 72 65 20 69  tes that there i
19f40 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20 72 65 6d  s no need to rem
19f50 65 6d 62 65 72 20 74 68 61 74 0a 2a 2a 20 74 68  ember that.** th
19f60 65 20 6a 6f 75 72 6e 61 6c 20 6e 65 65 64 73 20  e journal needs 
19f70 74 6f 20 62 65 20 73 79 6e 63 28 29 65 64 20 62  to be sync()ed b
19f80 65 66 6f 72 65 20 64 61 74 61 62 61 73 65 20 70  efore database p
19f90 61 67 65 20 70 44 62 50 61 67 65 2d 3e 70 67 6e  age pDbPage->pgn
19fa0 6f 20 0a 2a 2a 20 63 61 6e 20 62 65 20 77 72 69  o .** can be wri
19fb0 74 74 65 6e 20 74 6f 2e 20 54 68 65 20 63 61 6c  tten to. The cal
19fc0 6c 65 72 20 68 61 73 20 61 6c 72 65 61 64 79 20  ler has already 
19fd0 70 72 6f 6d 69 73 65 64 20 6e 6f 74 20 74 6f 20  promised not to 
19fe0 77 72 69 74 65 20 74 6f 20 74 68 61 74 0a 2a 2a  write to that.**
19ff0 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   page..*/.static
1a000 20 69 6e 74 20 72 65 6c 6f 63 61 74 65 50 61 67   int relocatePag
1a010 65 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  e(.  BtShared *p
1a020 42 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  Bt,           /*
1a030 20 42 74 72 65 65 20 2a 2f 0a 20 20 4d 65 6d 50   Btree */.  MemP
1a040 61 67 65 20 2a 70 44 62 50 61 67 65 2c 20 20 20  age *pDbPage,   
1a050 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 70 61 67       /* Open pag
1a060 65 20 74 6f 20 6d 6f 76 65 20 2a 2f 0a 20 20 75  e to move */.  u
1a070 38 20 65 54 79 70 65 2c 20 20 20 20 20 20 20 20  8 eType,        
1a080 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
1a090 65 72 20 6d 61 70 20 27 74 79 70 65 27 20 65 6e  er map 'type' en
1a0a0 74 72 79 20 66 6f 72 20 70 44 62 50 61 67 65 20  try for pDbPage 
1a0b0 2a 2f 0a 20 20 50 67 6e 6f 20 69 50 74 72 50 61  */.  Pgno iPtrPa
1a0c0 67 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ge,           /*
1a0d0 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 27 70 61   Pointer map 'pa
1a0e0 67 65 2d 6e 6f 27 20 65 6e 74 72 79 20 66 6f 72  ge-no' entry for
1a0f0 20 70 44 62 50 61 67 65 20 2a 2f 0a 20 20 50 67   pDbPage */.  Pg
1a100 6e 6f 20 69 46 72 65 65 50 61 67 65 2c 20 20 20  no iFreePage,   
1a110 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f         /* The lo
1a120 63 61 74 69 6f 6e 20 74 6f 20 6d 6f 76 65 20 70  cation to move p
1a130 44 62 50 61 67 65 20 74 6f 20 2a 2f 0a 20 20 69  DbPage to */.  i
1a140 6e 74 20 69 73 43 6f 6d 6d 69 74 20 20 20 20 20  nt isCommit     
1a150 20 20 20 20 20 20 20 20 2f 2a 20 69 73 43 6f 6d          /* isCom
1a160 6d 69 74 20 66 6c 61 67 20 70 61 73 73 65 64 20  mit flag passed 
1a170 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d  to sqlite3PagerM
1a180 6f 76 65 70 61 67 65 20 2a 2f 0a 29 7b 0a 20 20  ovepage */.){.  
1a190 4d 65 6d 50 61 67 65 20 2a 70 50 74 72 50 61 67  MemPage *pPtrPag
1a1a0 65 3b 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65  e;   /* The page
1a1b0 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 61   that contains a
1a1c0 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 44 62 50   pointer to pDbP
1a1d0 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 44  age */.  Pgno iD
1a1e0 62 50 61 67 65 20 3d 20 70 44 62 50 61 67 65 2d  bPage = pDbPage-
1a1f0 3e 70 67 6e 6f 3b 0a 20 20 50 61 67 65 72 20 2a  >pgno;.  Pager *
1a200 70 50 61 67 65 72 20 3d 20 70 42 74 2d 3e 70 50  pPager = pBt->pP
1a210 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  ager;.  int rc;.
1a220 0a 20 20 61 73 73 65 72 74 28 20 65 54 79 70 65  .  assert( eType
1a230 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  ==PTRMAP_OVERFLO
1a240 57 32 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52  W2 || eType==PTR
1a250 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 20 7c 7c  MAP_OVERFLOW1 ||
1a260 20 0a 20 20 20 20 20 20 65 54 79 70 65 3d 3d 50   .      eType==P
1a270 54 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20 65  TRMAP_BTREE || e
1a280 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f  Type==PTRMAP_ROO
1a290 54 50 41 47 45 20 29 3b 0a 20 20 61 73 73 65 72  TPAGE );.  asser
1a2a0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
1a2b0 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
1a2c0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
1a2d0 44 62 50 61 67 65 2d 3e 70 42 74 3d 3d 70 42 74  DbPage->pBt==pBt
1a2e0 20 29 3b 0a 0a 20 20 2f 2a 20 4d 6f 76 65 20 70   );..  /* Move p
1a2f0 61 67 65 20 69 44 62 50 61 67 65 20 66 72 6f 6d  age iDbPage from
1a300 20 69 74 73 20 63 75 72 72 65 6e 74 20 6c 6f 63   its current loc
1a310 61 74 69 6f 6e 20 74 6f 20 70 61 67 65 20 6e 75  ation to page nu
1a320 6d 62 65 72 20 69 46 72 65 65 50 61 67 65 20 2a  mber iFreePage *
1a330 2f 0a 20 20 54 52 41 43 45 28 28 22 41 55 54 4f  /.  TRACE(("AUTO
1a340 56 41 43 55 55 4d 3a 20 4d 6f 76 69 6e 67 20 25  VACUUM: Moving %
1a350 64 20 74 6f 20 66 72 65 65 20 70 61 67 65 20 25  d to free page %
1a360 64 20 28 70 74 72 20 70 61 67 65 20 25 64 20 74  d (ptr page %d t
1a370 79 70 65 20 25 64 29 5c 6e 22 2c 20 0a 20 20 20  ype %d)\n", .   
1a380 20 20 20 69 44 62 50 61 67 65 2c 20 69 46 72 65     iDbPage, iFre
1a390 65 50 61 67 65 2c 20 69 50 74 72 50 61 67 65 2c  ePage, iPtrPage,
1a3a0 20 65 54 79 70 65 29 29 3b 0a 20 20 72 63 20 3d   eType));.  rc =
1a3b0 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 6f 76   sqlite3PagerMov
1a3c0 65 70 61 67 65 28 70 50 61 67 65 72 2c 20 70 44  epage(pPager, pD
1a3d0 62 50 61 67 65 2d 3e 70 44 62 50 61 67 65 2c 20  bPage->pDbPage, 
1a3e0 69 46 72 65 65 50 61 67 65 2c 20 69 73 43 6f 6d  iFreePage, isCom
1a3f0 6d 69 74 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  mit);.  if( rc!=
1a400 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1a410 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
1a420 20 20 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f 20    pDbPage->pgno 
1a430 3d 20 69 46 72 65 65 50 61 67 65 3b 0a 0a 20 20  = iFreePage;..  
1a440 2f 2a 20 49 66 20 70 44 62 50 61 67 65 20 77 61  /* If pDbPage wa
1a450 73 20 61 20 62 74 72 65 65 2d 70 61 67 65 2c 20  s a btree-page, 
1a460 74 68 65 6e 20 69 74 20 6d 61 79 20 68 61 76 65  then it may have
1a470 20 63 68 69 6c 64 20 70 61 67 65 73 20 61 6e 64   child pages and
1a480 2f 6f 72 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 74  /or cells.  ** t
1a490 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f 76 65  hat point to ove
1a4a0 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 54 68 65  rflow pages. The
1a4b0 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74   pointer map ent
1a4c0 72 69 65 73 20 66 6f 72 20 61 6c 6c 20 74 68 65  ries for all the
1a4d0 73 65 0a 20 20 2a 2a 20 70 61 67 65 73 20 6e 65  se.  ** pages ne
1a4e0 65 64 20 74 6f 20 62 65 20 63 68 61 6e 67 65 64  ed to be changed
1a4f0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70  ..  **.  ** If p
1a500 44 62 50 61 67 65 20 69 73 20 61 6e 20 6f 76 65  DbPage is an ove
1a510 72 66 6c 6f 77 20 70 61 67 65 2c 20 74 68 65 6e  rflow page, then
1a520 20 74 68 65 20 66 69 72 73 74 20 34 20 62 79 74   the first 4 byt
1a530 65 73 20 6d 61 79 20 73 74 6f 72 65 20 61 0a 20  es may store a. 
1a540 20 2a 2a 20 70 6f 69 6e 74 65 72 20 74 6f 20 61   ** pointer to a
1a550 20 73 75 62 73 65 71 75 65 6e 74 20 6f 76 65 72   subsequent over
1a560 66 6c 6f 77 20 70 61 67 65 2e 20 49 66 20 74 68  flow page. If th
1a570 69 73 20 69 73 20 74 68 65 20 63 61 73 65 2c 20  is is the case, 
1a580 74 68 65 6e 0a 20 20 2a 2a 20 74 68 65 20 70 6f  then.  ** the po
1a590 69 6e 74 65 72 20 6d 61 70 20 6e 65 65 64 73 20  inter map needs 
1a5a0 74 6f 20 62 65 20 75 70 64 61 74 65 64 20 66 6f  to be updated fo
1a5b0 72 20 74 68 65 20 73 75 62 73 65 71 75 65 6e 74  r the subsequent
1a5c0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 0a   overflow page..
1a5d0 20 20 2a 2f 0a 20 20 69 66 28 20 65 54 79 70 65    */.  if( eType
1a5e0 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20 7c  ==PTRMAP_BTREE |
1a5f0 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  | eType==PTRMAP_
1a600 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20 20 20  ROOTPAGE ){.    
1a610 72 63 20 3d 20 73 65 74 43 68 69 6c 64 50 74 72  rc = setChildPtr
1a620 6d 61 70 73 28 70 44 62 50 61 67 65 29 3b 0a 20  maps(pDbPage);. 
1a630 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1a640 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
1a650 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
1a660 20 7d 65 6c 73 65 7b 0a 20 20 20 20 50 67 6e 6f   }else{.    Pgno
1a670 20 6e 65 78 74 4f 76 66 6c 20 3d 20 67 65 74 34   nextOvfl = get4
1a680 62 79 74 65 28 70 44 62 50 61 67 65 2d 3e 61 44  byte(pDbPage->aD
1a690 61 74 61 29 3b 0a 20 20 20 20 69 66 28 20 6e 65  ata);.    if( ne
1a6a0 78 74 4f 76 66 6c 21 3d 30 20 29 7b 0a 20 20 20  xtOvfl!=0 ){.   
1a6b0 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42 74     ptrmapPut(pBt
1a6c0 2c 20 6e 65 78 74 4f 76 66 6c 2c 20 50 54 52 4d  , nextOvfl, PTRM
1a6d0 41 50 5f 4f 56 45 52 46 4c 4f 57 32 2c 20 69 46  AP_OVERFLOW2, iF
1a6e0 72 65 65 50 61 67 65 2c 20 26 72 63 29 3b 0a 20  reePage, &rc);. 
1a6f0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
1a700 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1a710 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
1a720 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
1a730 20 20 2f 2a 20 46 69 78 20 74 68 65 20 64 61 74    /* Fix the dat
1a740 61 62 61 73 65 20 70 6f 69 6e 74 65 72 20 6f 6e  abase pointer on
1a750 20 70 61 67 65 20 69 50 74 72 50 61 67 65 20 74   page iPtrPage t
1a760 68 61 74 20 70 6f 69 6e 74 65 64 20 61 74 20 69  hat pointed at i
1a770 44 62 50 61 67 65 20 73 6f 0a 20 20 2a 2a 20 74  DbPage so.  ** t
1a780 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20 61 74  hat it points at
1a790 20 69 46 72 65 65 50 61 67 65 2e 20 41 6c 73 6f   iFreePage. Also
1a7a0 20 66 69 78 20 74 68 65 20 70 6f 69 6e 74 65 72   fix the pointer
1a7b0 20 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 0a 20   map entry for. 
1a7c0 20 2a 2a 20 69 50 74 72 50 61 67 65 2e 0a 20 20   ** iPtrPage..  
1a7d0 2a 2f 0a 20 20 69 66 28 20 65 54 79 70 65 21 3d  */.  if( eType!=
1a7e0 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20  PTRMAP_ROOTPAGE 
1a7f0 29 7b 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65  ){.    rc = btre
1a800 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 50  eGetPage(pBt, iP
1a810 74 72 50 61 67 65 2c 20 26 70 50 74 72 50 61 67  trPage, &pPtrPag
1a820 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  e, 0);.    if( r
1a830 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1a840 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1a850 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
1a860 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
1a870 65 28 70 50 74 72 50 61 67 65 2d 3e 70 44 62 50  e(pPtrPage->pDbP
1a880 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
1a890 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1a8a0 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
1a8b0 28 70 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20  (pPtrPage);.    
1a8c0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
1a8d0 20 7d 0a 20 20 20 20 72 63 20 3d 20 6d 6f 64 69   }.    rc = modi
1a8e0 66 79 50 61 67 65 50 6f 69 6e 74 65 72 28 70 50  fyPagePointer(pP
1a8f0 74 72 50 61 67 65 2c 20 69 44 62 50 61 67 65 2c  trPage, iDbPage,
1a900 20 69 46 72 65 65 50 61 67 65 2c 20 65 54 79 70   iFreePage, eTyp
1a910 65 29 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50  e);.    releaseP
1a920 61 67 65 28 70 50 74 72 50 61 67 65 29 3b 0a 20  age(pPtrPage);. 
1a930 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1a940 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 74  E_OK ){.      pt
1a950 72 6d 61 70 50 75 74 28 70 42 74 2c 20 69 46 72  rmapPut(pBt, iFr
1a960 65 65 50 61 67 65 2c 20 65 54 79 70 65 2c 20 69  eePage, eType, i
1a970 50 74 72 50 61 67 65 2c 20 26 72 63 29 3b 0a 20  PtrPage, &rc);. 
1a980 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
1a990 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77  n rc;.}../* Forw
1a9a0 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 20  ard declaration 
1a9b0 72 65 71 75 69 72 65 64 20 62 79 20 69 6e 63 72  required by incr
1a9c0 56 61 63 75 75 6d 53 74 65 70 28 29 2e 20 2a 2f  VacuumStep(). */
1a9d0 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f  .static int allo
1a9e0 63 61 74 65 42 74 72 65 65 50 61 67 65 28 42 74  cateBtreePage(Bt
1a9f0 53 68 61 72 65 64 20 2a 2c 20 4d 65 6d 50 61 67  Shared *, MemPag
1aa00 65 20 2a 2a 2c 20 50 67 6e 6f 20 2a 2c 20 50 67  e **, Pgno *, Pg
1aa10 6e 6f 2c 20 75 38 29 3b 0a 0a 2f 2a 0a 2a 2a 20  no, u8);../*.** 
1aa20 50 65 72 66 6f 72 6d 20 61 20 73 69 6e 67 6c 65  Perform a single
1aa30 20 73 74 65 70 20 6f 66 20 61 6e 20 69 6e 63 72   step of an incr
1aa40 65 6d 65 6e 74 61 6c 2d 76 61 63 75 75 6d 2e 20  emental-vacuum. 
1aa50 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 72  If successful, r
1aa60 65 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f  eturn.** SQLITE_
1aa70 4f 4b 2e 20 49 66 20 74 68 65 72 65 20 69 73 20  OK. If there is 
1aa80 6e 6f 20 77 6f 72 6b 20 74 6f 20 64 6f 20 28 61  no work to do (a
1aa90 6e 64 20 74 68 65 72 65 66 6f 72 65 20 6e 6f 20  nd therefore no 
1aaa0 70 6f 69 6e 74 20 69 6e 20 0a 2a 2a 20 63 61 6c  point in .** cal
1aab0 6c 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69  ling this functi
1aac0 6f 6e 20 61 67 61 69 6e 29 2c 20 72 65 74 75 72  on again), retur
1aad0 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 20 4f  n SQLITE_DONE. O
1aae0 72 2c 20 69 66 20 61 6e 20 65 72 72 6f 72 20 0a  r, if an error .
1aaf0 2a 2a 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72  ** occurs, retur
1ab00 6e 20 73 6f 6d 65 20 6f 74 68 65 72 20 65 72 72  n some other err
1ab10 6f 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 4d  or code..**.** M
1ab20 6f 72 65 20 73 70 65 63 69 66 69 63 61 6c 6c 79  ore specifically
1ab30 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
1ab40 61 74 74 65 6d 70 74 73 20 74 6f 20 72 65 2d 6f  attempts to re-o
1ab50 72 67 61 6e 69 7a 65 20 74 68 65 20 64 61 74 61  rganize the data
1ab60 62 61 73 65 20 73 6f 20 0a 2a 2a 20 74 68 61 74  base so .** that
1ab70 20 74 68 65 20 6c 61 73 74 20 70 61 67 65 20 6f   the last page o
1ab80 66 20 74 68 65 20 66 69 6c 65 20 63 75 72 72 65  f the file curre
1ab90 6e 74 6c 79 20 69 6e 20 75 73 65 20 69 73 20 6e  ntly in use is n
1aba0 6f 20 6c 6f 6e 67 65 72 20 69 6e 20 75 73 65 2e  o longer in use.
1abb0 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72  .**.** Parameter
1abc0 20 6e 46 69 6e 20 69 73 20 74 68 65 20 6e 75 6d   nFin is the num
1abd0 62 65 72 20 6f 66 20 70 61 67 65 73 20 74 68 61  ber of pages tha
1abe0 74 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20  t this database 
1abf0 77 6f 75 6c 64 20 63 6f 6e 74 61 69 6e 0a 2a 2a  would contain.**
1ac00 20 77 65 72 65 20 74 68 69 73 20 66 75 6e 63 74   were this funct
1ac10 69 6f 6e 20 63 61 6c 6c 65 64 20 75 6e 74 69 6c  ion called until
1ac20 20 69 74 20 72 65 74 75 72 6e 73 20 53 51 4c 49   it returns SQLI
1ac30 54 45 5f 44 4f 4e 45 2e 0a 2a 2a 0a 2a 2a 20 49  TE_DONE..**.** I
1ac40 66 20 74 68 65 20 62 43 6f 6d 6d 69 74 20 70 61  f the bCommit pa
1ac50 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 6e 2d 7a  rameter is non-z
1ac60 65 72 6f 2c 20 74 68 69 73 20 66 75 6e 63 74 69  ero, this functi
1ac70 6f 6e 20 61 73 73 75 6d 65 73 20 74 68 61 74 20  on assumes that 
1ac80 74 68 65 20 0a 2a 2a 20 63 61 6c 6c 65 72 20 77  the .** caller w
1ac90 69 6c 6c 20 6b 65 65 70 20 63 61 6c 6c 69 6e 67  ill keep calling
1aca0 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28   incrVacuumStep(
1acb0 29 20 75 6e 74 69 6c 20 69 74 20 72 65 74 75 72  ) until it retur
1acc0 6e 73 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 0a  ns SQLITE_DONE .
1acd0 2a 2a 20 6f 72 20 61 6e 20 65 72 72 6f 72 2e 20  ** or an error. 
1ace0 62 43 6f 6d 6d 69 74 20 69 73 20 70 61 73 73 65  bCommit is passe
1acf0 64 20 74 72 75 65 20 66 6f 72 20 61 6e 20 61 75  d true for an au
1ad00 74 6f 2d 76 61 63 75 75 6d 2d 6f 6e 2d 63 6f 6d  to-vacuum-on-com
1ad10 6d 69 74 20 0a 2a 2a 20 6f 70 65 72 61 74 69 6f  mit .** operatio
1ad20 6e 2c 20 6f 72 20 66 61 6c 73 65 20 66 6f 72 20  n, or false for 
1ad30 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76  an incremental v
1ad40 61 63 75 75 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63  acuum..*/.static
1ad50 20 69 6e 74 20 69 6e 63 72 56 61 63 75 75 6d 53   int incrVacuumS
1ad60 74 65 70 28 42 74 53 68 61 72 65 64 20 2a 70 42  tep(BtShared *pB
1ad70 74 2c 20 50 67 6e 6f 20 6e 46 69 6e 2c 20 50 67  t, Pgno nFin, Pg
1ad80 6e 6f 20 69 4c 61 73 74 50 67 2c 20 69 6e 74 20  no iLastPg, int 
1ad90 62 43 6f 6d 6d 69 74 29 7b 0a 20 20 50 67 6e 6f  bCommit){.  Pgno
1ada0 20 6e 46 72 65 65 4c 69 73 74 3b 20 20 20 20 20   nFreeList;     
1adb0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1adc0 6f 66 20 70 61 67 65 73 20 73 74 69 6c 6c 20 6f  of pages still o
1add0 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  n the free-list 
1ade0 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  */.  int rc;..  
1adf0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
1ae00 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
1ae10 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
1ae20 72 74 28 20 69 4c 61 73 74 50 67 3e 6e 46 69 6e  rt( iLastPg>nFin
1ae30 20 29 3b 0a 0a 20 20 69 66 28 20 21 50 54 52 4d   );..  if( !PTRM
1ae40 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 69  AP_ISPAGE(pBt, i
1ae50 4c 61 73 74 50 67 29 20 26 26 20 69 4c 61 73 74  LastPg) && iLast
1ae60 50 67 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  Pg!=PENDING_BYTE
1ae70 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20  _PAGE(pBt) ){.  
1ae80 20 20 75 38 20 65 54 79 70 65 3b 0a 20 20 20 20    u8 eType;.    
1ae90 50 67 6e 6f 20 69 50 74 72 50 61 67 65 3b 0a 0a  Pgno iPtrPage;..
1aea0 20 20 20 20 6e 46 72 65 65 4c 69 73 74 20 3d 20      nFreeList = 
1aeb0 67 65 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70  get4byte(&pBt->p
1aec0 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d  Page1->aData[36]
1aed0 29 3b 0a 20 20 20 20 69 66 28 20 6e 46 72 65 65  );.    if( nFree
1aee0 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  List==0 ){.     
1aef0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44   return SQLITE_D
1af00 4f 4e 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ONE;.    }..    
1af10 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70  rc = ptrmapGet(p
1af20 42 74 2c 20 69 4c 61 73 74 50 67 2c 20 26 65 54  Bt, iLastPg, &eT
1af30 79 70 65 2c 20 26 69 50 74 72 50 61 67 65 29 3b  ype, &iPtrPage);
1af40 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
1af50 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1af60 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
1af70 0a 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d  .    if( eType==
1af80 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20  PTRMAP_ROOTPAGE 
1af90 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
1afa0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
1afb0 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  KPT;.    }..    
1afc0 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41  if( eType==PTRMA
1afd0 50 5f 46 52 45 45 50 41 47 45 20 29 7b 0a 20 20  P_FREEPAGE ){.  
1afe0 20 20 20 20 69 66 28 20 62 43 6f 6d 6d 69 74 3d      if( bCommit=
1aff0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  =0 ){.        /*
1b000 20 52 65 6d 6f 76 65 20 74 68 65 20 70 61 67 65   Remove the page
1b010 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 73 20   from the files 
1b020 66 72 65 65 2d 6c 69 73 74 2e 20 54 68 69 73 20  free-list. This 
1b030 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64 0a  is not required.
1b040 20 20 20 20 20 20 20 20 2a 2a 20 69 66 20 62 43          ** if bC
1b050 6f 6d 6d 69 74 20 69 73 20 6e 6f 6e 2d 7a 65 72  ommit is non-zer
1b060 6f 2e 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c  o. In that case,
1b070 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 77   the free-list w
1b080 69 6c 6c 20 62 65 0a 20 20 20 20 20 20 20 20 2a  ill be.        *
1b090 2a 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20 7a  * truncated to z
1b0a0 65 72 6f 20 61 66 74 65 72 20 74 68 69 73 20 66  ero after this f
1b0b0 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2c  unction returns,
1b0c0 20 73 6f 20 69 74 20 64 6f 65 73 6e 27 74 20 0a   so it doesn't .
1b0d0 20 20 20 20 20 20 20 20 2a 2a 20 6d 61 74 74 65          ** matte
1b0e0 72 20 69 66 20 69 74 20 73 74 69 6c 6c 20 63 6f  r if it still co
1b0f0 6e 74 61 69 6e 73 20 73 6f 6d 65 20 67 61 72 62  ntains some garb
1b100 61 67 65 20 65 6e 74 72 69 65 73 2e 0a 20 20 20  age entries..   
1b110 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
1b120 50 67 6e 6f 20 69 46 72 65 65 50 67 3b 0a 20 20  Pgno iFreePg;.  
1b130 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70        MemPage *p
1b140 46 72 65 65 50 67 3b 0a 20 20 20 20 20 20 20 20  FreePg;.        
1b150 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72  rc = allocateBtr
1b160 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 46 72  eePage(pBt, &pFr
1b170 65 65 50 67 2c 20 26 69 46 72 65 65 50 67 2c 20  eePg, &iFreePg, 
1b180 69 4c 61 73 74 50 67 2c 20 42 54 41 4c 4c 4f 43  iLastPg, BTALLOC
1b190 5f 45 58 41 43 54 29 3b 0a 20 20 20 20 20 20 20  _EXACT);.       
1b1a0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1b1b0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
1b1c0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
1b1d0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73     }.        ass
1b1e0 65 72 74 28 20 69 46 72 65 65 50 67 3d 3d 69 4c  ert( iFreePg==iL
1b1f0 61 73 74 50 67 20 29 3b 0a 20 20 20 20 20 20 20  astPg );.       
1b200 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 46 72   releasePage(pFr
1b210 65 65 50 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20  eePg);.      }. 
1b220 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20     } else {.    
1b230 20 20 50 67 6e 6f 20 69 46 72 65 65 50 67 3b 20    Pgno iFreePg; 
1b240 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
1b250 6e 64 65 78 20 6f 66 20 66 72 65 65 20 70 61 67  ndex of free pag
1b260 65 20 74 6f 20 6d 6f 76 65 20 70 4c 61 73 74 50  e to move pLastP
1b270 67 20 74 6f 20 2a 2f 0a 20 20 20 20 20 20 4d 65  g to */.      Me
1b280 6d 50 61 67 65 20 2a 70 4c 61 73 74 50 67 3b 0a  mPage *pLastPg;.
1b290 20 20 20 20 20 20 75 38 20 65 4d 6f 64 65 20 3d        u8 eMode =
1b2a0 20 42 54 41 4c 4c 4f 43 5f 41 4e 59 3b 20 20 20   BTALLOC_ANY;   
1b2b0 2f 2a 20 4d 6f 64 65 20 70 61 72 61 6d 65 74 65  /* Mode paramete
1b2c0 72 20 66 6f 72 20 61 6c 6c 6f 63 61 74 65 42 74  r for allocateBt
1b2d0 72 65 65 50 61 67 65 28 29 20 2a 2f 0a 20 20 20  reePage() */.   
1b2e0 20 20 20 50 67 6e 6f 20 69 4e 65 61 72 20 3d 20     Pgno iNear = 
1b2f0 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  0;           /* 
1b300 6e 65 61 72 62 79 20 70 61 72 61 6d 65 74 65 72  nearby parameter
1b310 20 66 6f 72 20 61 6c 6c 6f 63 61 74 65 42 74 72   for allocateBtr
1b320 65 65 50 61 67 65 28 29 20 2a 2f 0a 0a 20 20 20  eePage() */..   
1b330 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74     rc = btreeGet
1b340 50 61 67 65 28 70 42 74 2c 20 69 4c 61 73 74 50  Page(pBt, iLastP
1b350 67 2c 20 26 70 4c 61 73 74 50 67 2c 20 30 29 3b  g, &pLastPg, 0);
1b360 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
1b370 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1b380 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1b390 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
1b3a0 20 49 66 20 62 43 6f 6d 6d 69 74 20 69 73 20 7a   If bCommit is z
1b3b0 65 72 6f 2c 20 74 68 69 73 20 6c 6f 6f 70 20 72  ero, this loop r
1b3c0 75 6e 73 20 65 78 61 63 74 6c 79 20 6f 6e 63 65  uns exactly once
1b3d0 20 61 6e 64 20 70 61 67 65 20 70 4c 61 73 74 50   and page pLastP
1b3e0 67 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 73 77  g.      ** is sw
1b3f0 61 70 70 65 64 20 77 69 74 68 20 74 68 65 20 66  apped with the f
1b400 69 72 73 74 20 66 72 65 65 20 70 61 67 65 20 70  irst free page p
1b410 75 6c 6c 65 64 20 6f 66 66 20 74 68 65 20 66 72  ulled off the fr
1b420 65 65 20 6c 69 73 74 2e 0a 20 20 20 20 20 20 2a  ee list..      *
1b430 2a 0a 20 20 20 20 20 20 2a 2a 20 4f 6e 20 74 68  *.      ** On th
1b440 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 69 66  e other hand, if
1b450 20 62 43 6f 6d 6d 69 74 20 69 73 20 67 72 65 61   bCommit is grea
1b460 74 65 72 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74  ter than zero, t
1b470 68 65 6e 20 6b 65 65 70 0a 20 20 20 20 20 20 2a  hen keep.      *
1b480 2a 20 6c 6f 6f 70 69 6e 67 20 75 6e 74 69 6c 20  * looping until 
1b490 61 20 66 72 65 65 2d 70 61 67 65 20 6c 6f 63 61  a free-page loca
1b4a0 74 65 64 20 77 69 74 68 69 6e 20 74 68 65 20 66  ted within the f
1b4b0 69 72 73 74 20 6e 46 69 6e 20 70 61 67 65 73 0a  irst nFin pages.
1b4c0 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20        ** of the 
1b4d0 66 69 6c 65 20 69 73 20 66 6f 75 6e 64 2e 0a 20  file is found.. 
1b4e0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
1b4f0 28 20 62 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b 0a  ( bCommit==0 ){.
1b500 20 20 20 20 20 20 20 20 65 4d 6f 64 65 20 3d 20          eMode = 
1b510 42 54 41 4c 4c 4f 43 5f 4c 45 3b 0a 20 20 20 20  BTALLOC_LE;.    
1b520 20 20 20 20 69 4e 65 61 72 20 3d 20 6e 46 69 6e      iNear = nFin
1b530 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1b540 64 6f 20 7b 0a 20 20 20 20 20 20 20 20 4d 65 6d  do {.        Mem
1b550 50 61 67 65 20 2a 70 46 72 65 65 50 67 3b 0a 20  Page *pFreePg;. 
1b560 20 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f         rc = allo
1b570 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42  cateBtreePage(pB
1b580 74 2c 20 26 70 46 72 65 65 50 67 2c 20 26 69 46  t, &pFreePg, &iF
1b590 72 65 65 50 67 2c 20 69 4e 65 61 72 2c 20 65 4d  reePg, iNear, eM
1b5a0 6f 64 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ode);.        if
1b5b0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1b5c0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 6c  ){.          rel
1b5d0 65 61 73 65 50 61 67 65 28 70 4c 61 73 74 50 67  easePage(pLastPg
1b5e0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  );.          ret
1b5f0 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
1b600 7d 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73  }.        releas
1b610 65 50 61 67 65 28 70 46 72 65 65 50 67 29 3b 0a  ePage(pFreePg);.
1b620 20 20 20 20 20 20 7d 77 68 69 6c 65 28 20 62 43        }while( bC
1b630 6f 6d 6d 69 74 20 26 26 20 69 46 72 65 65 50 67  ommit && iFreePg
1b640 3e 6e 46 69 6e 20 29 3b 0a 20 20 20 20 20 20 61  >nFin );.      a
1b650 73 73 65 72 74 28 20 69 46 72 65 65 50 67 3c 69  ssert( iFreePg<i
1b660 4c 61 73 74 50 67 20 29 3b 0a 20 20 20 20 20 20  LastPg );.      
1b670 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65 6c 6f  .      rc = relo
1b680 63 61 74 65 50 61 67 65 28 70 42 74 2c 20 70 4c  catePage(pBt, pL
1b690 61 73 74 50 67 2c 20 65 54 79 70 65 2c 20 69 50  astPg, eType, iP
1b6a0 74 72 50 61 67 65 2c 20 69 46 72 65 65 50 67 2c  trPage, iFreePg,
1b6b0 20 62 43 6f 6d 6d 69 74 29 3b 0a 20 20 20 20 20   bCommit);.     
1b6c0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4c 61   releasePage(pLa
1b6d0 73 74 50 67 29 3b 0a 20 20 20 20 20 20 69 66 28  stPg);.      if(
1b6e0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1b6f0 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
1b700 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
1b710 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 62 43   }.  }..  if( bC
1b720 6f 6d 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20  ommit==0 ){.    
1b730 64 6f 20 7b 0a 20 20 20 20 20 20 69 4c 61 73 74  do {.      iLast
1b740 50 67 2d 2d 3b 0a 20 20 20 20 7d 77 68 69 6c 65  Pg--;.    }while
1b750 28 20 69 4c 61 73 74 50 67 3d 3d 50 45 4e 44 49  ( iLastPg==PENDI
1b760 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
1b770 29 20 7c 7c 20 50 54 52 4d 41 50 5f 49 53 50 41  ) || PTRMAP_ISPA
1b780 47 45 28 70 42 74 2c 20 69 4c 61 73 74 50 67 29  GE(pBt, iLastPg)
1b790 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 62 44 6f   );.    pBt->bDo
1b7a0 54 72 75 6e 63 61 74 65 20 3d 20 31 3b 0a 20 20  Truncate = 1;.  
1b7b0 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 69    pBt->nPage = i
1b7c0 4c 61 73 74 50 67 3b 0a 20 20 7d 0a 20 20 72 65  LastPg;.  }.  re
1b7d0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1b7e0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 64 61 74  }../*.** The dat
1b7f0 61 62 61 73 65 20 6f 70 65 6e 65 64 20 62 79 20  abase opened by 
1b800 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
1b810 6e 74 20 69 73 20 61 6e 20 61 75 74 6f 2d 76 61  nt is an auto-va
1b820 63 75 75 6d 20 64 61 74 61 62 61 73 65 0a 2a 2a  cuum database.**
1b830 20 6e 4f 72 69 67 20 70 61 67 65 73 20 69 6e 20   nOrig pages in 
1b840 73 69 7a 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  size containing 
1b850 6e 46 72 65 65 20 66 72 65 65 20 70 61 67 65 73  nFree free pages
1b860 2e 20 52 65 74 75 72 6e 20 74 68 65 20 65 78 70  . Return the exp
1b870 65 63 74 65 64 20 0a 2a 2a 20 73 69 7a 65 20 6f  ected .** size o
1b880 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  f the database i
1b890 6e 20 70 61 67 65 73 20 66 6f 6c 6c 6f 77 69 6e  n pages followin
1b8a0 67 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d  g an auto-vacuum
1b8b0 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 73   operation..*/.s
1b8c0 74 61 74 69 63 20 50 67 6e 6f 20 66 69 6e 61 6c  tatic Pgno final
1b8d0 44 62 53 69 7a 65 28 42 74 53 68 61 72 65 64 20  DbSize(BtShared 
1b8e0 2a 70 42 74 2c 20 50 67 6e 6f 20 6e 4f 72 69 67  *pBt, Pgno nOrig
1b8f0 2c 20 50 67 6e 6f 20 6e 46 72 65 65 29 7b 0a 20  , Pgno nFree){. 
1b900 20 69 6e 74 20 6e 45 6e 74 72 79 3b 20 20 20 20   int nEntry;    
1b910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b920 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e   /* Number of en
1b930 74 72 69 65 73 20 6f 6e 20 6f 6e 65 20 70 74 72  tries on one ptr
1b940 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 50 67  map page */.  Pg
1b950 6e 6f 20 6e 50 74 72 6d 61 70 3b 20 20 20 20 20  no nPtrmap;     
1b960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1b970 20 4e 75 6d 62 65 72 20 6f 66 20 50 74 72 4d 61   Number of PtrMa
1b980 70 20 70 61 67 65 73 20 74 6f 20 62 65 20 66 72  p pages to be fr
1b990 65 65 64 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 46  eed */.  Pgno nF
1b9a0 69 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  in;             
1b9b0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
1b9c0 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 0a 20 20 6e  rn value */..  n
1b9d0 45 6e 74 72 79 20 3d 20 70 42 74 2d 3e 75 73 61  Entry = pBt->usa
1b9e0 62 6c 65 53 69 7a 65 2f 35 3b 0a 20 20 6e 50 74  bleSize/5;.  nPt
1b9f0 72 6d 61 70 20 3d 20 28 6e 46 72 65 65 2d 6e 4f  rmap = (nFree-nO
1ba00 72 69 67 2b 50 54 52 4d 41 50 5f 50 41 47 45 4e  rig+PTRMAP_PAGEN
1ba10 4f 28 70 42 74 2c 20 6e 4f 72 69 67 29 2b 6e 45  O(pBt, nOrig)+nE
1ba20 6e 74 72 79 29 2f 6e 45 6e 74 72 79 3b 0a 20 20  ntry)/nEntry;.  
1ba30 6e 46 69 6e 20 3d 20 6e 4f 72 69 67 20 2d 20 6e  nFin = nOrig - n
1ba40 46 72 65 65 20 2d 20 6e 50 74 72 6d 61 70 3b 0a  Free - nPtrmap;.
1ba50 20 20 69 66 28 20 6e 4f 72 69 67 3e 50 45 4e 44    if( nOrig>PEND
1ba60 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
1ba70 74 29 20 26 26 20 6e 46 69 6e 3c 50 45 4e 44 49  t) && nFin<PENDI
1ba80 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
1ba90 29 20 29 7b 0a 20 20 20 20 6e 46 69 6e 2d 2d 3b  ) ){.    nFin--;
1baa0 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 50 54  .  }.  while( PT
1bab0 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c  RMAP_ISPAGE(pBt,
1bac0 20 6e 46 69 6e 29 20 7c 7c 20 6e 46 69 6e 3d 3d   nFin) || nFin==
1bad0 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
1bae0 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 6e 46  E(pBt) ){.    nF
1baf0 69 6e 2d 2d 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  in--;.  }..  ret
1bb00 75 72 6e 20 6e 46 69 6e 3b 0a 7d 0a 0a 2f 2a 0a  urn nFin;.}../*.
1bb10 2a 2a 20 41 20 77 72 69 74 65 2d 74 72 61 6e 73  ** A write-trans
1bb20 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 6f  action must be o
1bb30 70 65 6e 65 64 20 62 65 66 6f 72 65 20 63 61 6c  pened before cal
1bb40 6c 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69  ling this functi
1bb50 6f 6e 2e 0a 2a 2a 20 49 74 20 70 65 72 66 6f 72  on..** It perfor
1bb60 6d 73 20 61 20 73 69 6e 67 6c 65 20 75 6e 69 74  ms a single unit
1bb70 20 6f 66 20 77 6f 72 6b 20 74 6f 77 61 72 64 73   of work towards
1bb80 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20   an incremental 
1bb90 76 61 63 75 75 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66  vacuum..**.** If
1bba0 20 74 68 65 20 69 6e 63 72 65 6d 65 6e 74 61 6c   the incremental
1bbb0 20 76 61 63 75 75 6d 20 69 73 20 66 69 6e 69 73   vacuum is finis
1bbc0 68 65 64 20 61 66 74 65 72 20 74 68 69 73 20 66  hed after this f
1bbd0 75 6e 63 74 69 6f 6e 20 68 61 73 20 72 75 6e 2c  unction has run,
1bbe0 0a 2a 2a 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20  .** SQLITE_DONE 
1bbf0 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20  is returned. If 
1bc00 69 74 20 69 73 20 6e 6f 74 20 66 69 6e 69 73 68  it is not finish
1bc10 65 64 2c 20 62 75 74 20 6e 6f 20 65 72 72 6f 72  ed, but no error
1bc20 20 6f 63 63 75 72 72 65 64 2c 0a 2a 2a 20 53 51   occurred,.** SQ
1bc30 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
1bc40 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 20 61  ned. Otherwise a
1bc50 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  n SQLite error c
1bc60 6f 64 65 2e 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ode. .*/.int sql
1bc70 69 74 65 33 42 74 72 65 65 49 6e 63 72 56 61 63  ite3BtreeIncrVac
1bc80 75 75 6d 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  uum(Btree *p){. 
1bc90 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61   int rc;.  BtSha
1bca0 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
1bcb0 74 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72  t;..  sqlite3Btr
1bcc0 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 61 73  eeEnter(p);.  as
1bcd0 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61  sert( pBt->inTra
1bce0 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f  nsaction==TRANS_
1bcf0 57 52 49 54 45 20 26 26 20 70 2d 3e 69 6e 54 72  WRITE && p->inTr
1bd00 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans==TRANS_WRITE
1bd10 20 29 3b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e   );.  if( !pBt->
1bd20 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20  autoVacuum ){.  
1bd30 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f    rc = SQLITE_DO
1bd40 4e 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  NE;.  }else{.   
1bd50 20 50 67 6e 6f 20 6e 4f 72 69 67 20 3d 20 62 74   Pgno nOrig = bt
1bd60 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74  reePagecount(pBt
1bd70 29 3b 0a 20 20 20 20 50 67 6e 6f 20 6e 46 72 65  );.    Pgno nFre
1bd80 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 42  e = get4byte(&pB
1bd90 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61  t->pPage1->aData
1bda0 5b 33 36 5d 29 3b 0a 20 20 20 20 50 67 6e 6f 20  [36]);.    Pgno 
1bdb0 6e 46 69 6e 20 3d 20 66 69 6e 61 6c 44 62 53 69  nFin = finalDbSi
1bdc0 7a 65 28 70 42 74 2c 20 6e 4f 72 69 67 2c 20 6e  ze(pBt, nOrig, n
1bdd0 46 72 65 65 29 3b 0a 0a 20 20 20 20 69 66 28 20  Free);..    if( 
1bde0 6e 4f 72 69 67 3c 6e 46 69 6e 20 29 7b 0a 20 20  nOrig<nFin ){.  
1bdf0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1be00 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
1be10 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 46 72 65    }else if( nFre
1be20 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  e>0 ){.      rc 
1be30 3d 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73  = saveAllCursors
1be40 28 70 42 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20  (pBt, 0, 0);.   
1be50 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1be60 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1be70 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65  invalidateAllOve
1be80 72 66 6c 6f 77 43 61 63 68 65 28 70 42 74 29 3b  rflowCache(pBt);
1be90 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 69 6e  .        rc = in
1bea0 63 72 56 61 63 75 75 6d 53 74 65 70 28 70 42 74  crVacuumStep(pBt
1beb0 2c 20 6e 46 69 6e 2c 20 6e 4f 72 69 67 2c 20 30  , nFin, nOrig, 0
1bec0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1bed0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1bee0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  OK ){.        rc
1bef0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
1bf00 72 69 74 65 28 70 42 74 2d 3e 70 50 61 67 65 31  rite(pBt->pPage1
1bf10 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
1bf20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 42      put4byte(&pB
1bf30 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61  t->pPage1->aData
1bf40 5b 32 38 5d 2c 20 70 42 74 2d 3e 6e 50 61 67 65  [28], pBt->nPage
1bf50 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
1bf60 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
1bf70 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
1bf80 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
1bf90 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
1bfa0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1bfb0 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
1bfc0 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 70 72 69  ne is called pri
1bfd0 6f 72 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67  or to sqlite3Pag
1bfe0 65 72 43 6f 6d 6d 69 74 20 77 68 65 6e 20 61 20  erCommit when a 
1bff0 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69  transaction.** i
1c000 73 20 63 6f 6d 6d 69 74 74 65 64 20 66 6f 72 20  s committed for 
1c010 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64  an auto-vacuum d
1c020 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49  atabase..**.** I
1c030 66 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  f SQLITE_OK is r
1c040 65 74 75 72 6e 65 64 2c 20 74 68 65 6e 20 2a 70  eturned, then *p
1c050 6e 54 72 75 6e 63 20 69 73 20 73 65 74 20 74 6f  nTrunc is set to
1c060 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
1c070 61 67 65 73 0a 2a 2a 20 74 68 65 20 64 61 74 61  ages.** the data
1c080 62 61 73 65 20 66 69 6c 65 20 73 68 6f 75 6c 64  base file should
1c090 20 62 65 20 74 72 75 6e 63 61 74 65 64 20 74 6f   be truncated to
1c0a0 20 64 75 72 69 6e 67 20 74 68 65 20 63 6f 6d 6d   during the comm
1c0b0 69 74 20 70 72 6f 63 65 73 73 2e 20 0a 2a 2a 20  it process. .** 
1c0c0 69 2e 65 2e 20 74 68 65 20 64 61 74 61 62 61 73  i.e. the databas
1c0d0 65 20 68 61 73 20 62 65 65 6e 20 72 65 6f 72 67  e has been reorg
1c0e0 61 6e 69 7a 65 64 20 73 6f 20 74 68 61 74 20 6f  anized so that o
1c0f0 6e 6c 79 20 74 68 65 20 66 69 72 73 74 20 2a 70  nly the first *p
1c100 6e 54 72 75 6e 63 0a 2a 2a 20 70 61 67 65 73 20  nTrunc.** pages 
1c110 61 72 65 20 69 6e 20 75 73 65 2e 0a 2a 2f 0a 73  are in use..*/.s
1c120 74 61 74 69 63 20 69 6e 74 20 61 75 74 6f 56 61  tatic int autoVa
1c130 63 75 75 6d 43 6f 6d 6d 69 74 28 42 74 53 68 61  cuumCommit(BtSha
1c140 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 6e 74  red *pBt){.  int
1c150 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1c160 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
1c170 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 72 3b 0a   = pBt->pPager;.
1c180 20 20 56 56 41 5f 4f 4e 4c 59 28 20 69 6e 74 20    VVA_ONLY( int 
1c190 6e 52 65 66 20 3d 20 73 71 6c 69 74 65 33 50 61  nRef = sqlite3Pa
1c1a0 67 65 72 52 65 66 63 6f 75 6e 74 28 70 50 61 67  gerRefcount(pPag
1c1b0 65 72 29 20 29 3b 0a 0a 20 20 61 73 73 65 72 74  er) );..  assert
1c1c0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
1c1d0 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
1c1e0 20 29 3b 0a 20 20 69 6e 76 61 6c 69 64 61 74 65   );.  invalidate
1c1f0 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68 65  AllOverflowCache
1c200 28 70 42 74 29 3b 0a 20 20 61 73 73 65 72 74 28  (pBt);.  assert(
1c210 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29  pBt->autoVacuum)
1c220 3b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 69 6e  ;.  if( !pBt->in
1c230 63 72 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  crVacuum ){.    
1c240 50 67 6e 6f 20 6e 46 69 6e 3b 20 20 20 20 20 20  Pgno nFin;      
1c250 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1c260 70 61 67 65 73 20 69 6e 20 64 61 74 61 62 61 73  pages in databas
1c270 65 20 61 66 74 65 72 20 61 75 74 6f 76 61 63 75  e after autovacu
1c280 75 6d 69 6e 67 20 2a 2f 0a 20 20 20 20 50 67 6e  uming */.    Pgn
1c290 6f 20 6e 46 72 65 65 3b 20 20 20 20 20 20 20 20  o nFree;        
1c2a0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
1c2b0 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69  es on the freeli
1c2c0 73 74 20 69 6e 69 74 69 61 6c 6c 79 20 2a 2f 0a  st initially */.
1c2d0 20 20 20 20 50 67 6e 6f 20 69 46 72 65 65 3b 20      Pgno iFree; 
1c2e0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65         /* The ne
1c2f0 78 74 20 70 61 67 65 20 74 6f 20 62 65 20 66 72  xt page to be fr
1c300 65 65 64 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20  eed */.    Pgno 
1c310 6e 4f 72 69 67 3b 20 20 20 20 20 20 20 20 2f 2a  nOrig;        /*
1c320 20 44 61 74 61 62 61 73 65 20 73 69 7a 65 20 62   Database size b
1c330 65 66 6f 72 65 20 66 72 65 65 69 6e 67 20 2a 2f  efore freeing */
1c340 0a 0a 20 20 20 20 6e 4f 72 69 67 20 3d 20 62 74  ..    nOrig = bt
1c350 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74  reePagecount(pBt
1c360 29 3b 0a 20 20 20 20 69 66 28 20 50 54 52 4d 41  );.    if( PTRMA
1c370 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 6e 4f  P_ISPAGE(pBt, nO
1c380 72 69 67 29 20 7c 7c 20 6e 4f 72 69 67 3d 3d 50  rig) || nOrig==P
1c390 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
1c3a0 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 2f  (pBt) ){.      /
1c3b0 2a 20 49 74 20 69 73 20 6e 6f 74 20 70 6f 73 73  * It is not poss
1c3c0 69 62 6c 65 20 74 6f 20 63 72 65 61 74 65 20 61  ible to create a
1c3d0 20 64 61 74 61 62 61 73 65 20 66 6f 72 20 77 68   database for wh
1c3e0 69 63 68 20 74 68 65 20 66 69 6e 61 6c 20 70 61  ich the final pa
1c3f0 67 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 65  ge.      ** is e
1c400 69 74 68 65 72 20 61 20 70 6f 69 6e 74 65 72 2d  ither a pointer-
1c410 6d 61 70 20 70 61 67 65 20 6f 72 20 74 68 65 20  map page or the 
1c420 70 65 6e 64 69 6e 67 2d 62 79 74 65 20 70 61 67  pending-byte pag
1c430 65 2e 20 49 66 20 6f 6e 65 0a 20 20 20 20 20 20  e. If one.      
1c440 2a 2a 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65  ** is encountere
1c450 64 2c 20 74 68 69 73 20 69 6e 64 69 63 61 74 65  d, this indicate
1c460 73 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20  s corruption..  
1c470 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 65 74      */.      ret
1c480 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
1c490 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a  PT_BKPT;.    }..
1c4a0 20 20 20 20 6e 46 72 65 65 20 3d 20 67 65 74 34      nFree = get4
1c4b0 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65  byte(&pBt->pPage
1c4c0 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20  1->aData[36]);. 
1c4d0 20 20 20 6e 46 69 6e 20 3d 20 66 69 6e 61 6c 44     nFin = finalD
1c4e0 62 53 69 7a 65 28 70 42 74 2c 20 6e 4f 72 69 67  bSize(pBt, nOrig
1c4f0 2c 20 6e 46 72 65 65 29 3b 0a 20 20 20 20 69 66  , nFree);.    if
1c500 28 20 6e 46 69 6e 3e 6e 4f 72 69 67 20 29 20 72  ( nFin>nOrig ) r
1c510 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
1c520 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 69  RUPT_BKPT;.    i
1c530 66 28 20 6e 46 69 6e 3c 6e 4f 72 69 67 20 29 7b  f( nFin<nOrig ){
1c540 0a 20 20 20 20 20 20 72 63 20 3d 20 73 61 76 65  .      rc = save
1c550 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20  AllCursors(pBt, 
1c560 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20  0, 0);.    }.   
1c570 20 66 6f 72 28 69 46 72 65 65 3d 6e 4f 72 69 67   for(iFree=nOrig
1c580 3b 20 69 46 72 65 65 3e 6e 46 69 6e 20 26 26 20  ; iFree>nFin && 
1c590 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69  rc==SQLITE_OK; i
1c5a0 46 72 65 65 2d 2d 29 7b 0a 20 20 20 20 20 20 72  Free--){.      r
1c5b0 63 20 3d 20 69 6e 63 72 56 61 63 75 75 6d 53 74  c = incrVacuumSt
1c5c0 65 70 28 70 42 74 2c 20 6e 46 69 6e 2c 20 69 46  ep(pBt, nFin, iF
1c5d0 72 65 65 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20  ree, 1);.    }. 
1c5e0 20 20 20 69 66 28 20 28 72 63 3d 3d 53 51 4c 49     if( (rc==SQLI
1c5f0 54 45 5f 44 4f 4e 45 20 7c 7c 20 72 63 3d 3d 53  TE_DONE || rc==S
1c600 51 4c 49 54 45 5f 4f 4b 29 20 26 26 20 6e 46 72  QLITE_OK) && nFr
1c610 65 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 72 63  ee>0 ){.      rc
1c620 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
1c630 72 69 74 65 28 70 42 74 2d 3e 70 50 61 67 65 31  rite(pBt->pPage1
1c640 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
1c650 20 20 70 75 74 34 62 79 74 65 28 26 70 42 74 2d    put4byte(&pBt-
1c660 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  >pPage1->aData[3
1c670 32 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 75  2], 0);.      pu
1c680 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61  t4byte(&pBt->pPa
1c690 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20  ge1->aData[36], 
1c6a0 30 29 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79  0);.      put4by
1c6b0 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d  te(&pBt->pPage1-
1c6c0 3e 61 44 61 74 61 5b 32 38 5d 2c 20 6e 46 69 6e  >aData[28], nFin
1c6d0 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 62 44  );.      pBt->bD
1c6e0 6f 54 72 75 6e 63 61 74 65 20 3d 20 31 3b 0a 20  oTruncate = 1;. 
1c6f0 20 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 20       pBt->nPage 
1c700 3d 20 6e 46 69 6e 3b 0a 20 20 20 20 7d 0a 20 20  = nFin;.    }.  
1c710 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1c720 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  _OK ){.      sql
1c730 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63  ite3PagerRollbac
1c740 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d  k(pPager);.    }
1c750 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20  .  }..  assert( 
1c760 6e 52 65 66 3e 3d 73 71 6c 69 74 65 33 50 61 67  nRef>=sqlite3Pag
1c770 65 72 52 65 66 63 6f 75 6e 74 28 70 50 61 67 65  erRefcount(pPage
1c780 72 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  r) );.  return r
1c790 63 3b 0a 7d 0a 0a 23 65 6c 73 65 20 2f 2a 20 69  c;.}..#else /* i
1c7a0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1c7b0 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 2a 2f 0a  T_AUTOVACUUM */.
1c7c0 23 20 64 65 66 69 6e 65 20 73 65 74 43 68 69 6c  # define setChil
1c7d0 64 50 74 72 6d 61 70 73 28 78 29 20 53 51 4c 49  dPtrmaps(x) SQLI
1c7e0 54 45 5f 4f 4b 0a 23 65 6e 64 69 66 0a 0a 2f 2a  TE_OK.#endif../*
1c7f0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1c800 20 64 6f 65 73 20 74 68 65 20 66 69 72 73 74 20   does the first 
1c810 70 68 61 73 65 20 6f 66 20 61 20 74 77 6f 2d 70  phase of a two-p
1c820 68 61 73 65 20 63 6f 6d 6d 69 74 2e 20 20 54 68  hase commit.  Th
1c830 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 63 61  is routine.** ca
1c840 75 73 65 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20  uses a rollback 
1c850 6a 6f 75 72 6e 61 6c 20 74 6f 20 62 65 20 63 72  journal to be cr
1c860 65 61 74 65 64 20 28 69 66 20 69 74 20 64 6f 65  eated (if it doe
1c870 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 65 78  s not already ex
1c880 69 73 74 29 0a 2a 2a 20 61 6e 64 20 70 6f 70 75  ist).** and popu
1c890 6c 61 74 65 64 20 77 69 74 68 20 65 6e 6f 75 67  lated with enoug
1c8a0 68 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 73 6f  h information so
1c8b0 20 74 68 61 74 20 69 66 20 61 20 70 6f 77 65 72   that if a power
1c8c0 20 6c 6f 73 73 20 6f 63 63 75 72 73 0a 2a 2a 20   loss occurs.** 
1c8d0 74 68 65 20 64 61 74 61 62 61 73 65 20 63 61 6e  the database can
1c8e0 20 62 65 20 72 65 73 74 6f 72 65 64 20 74 6f 20   be restored to 
1c8f0 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 74 61  its original sta
1c900 74 65 20 62 79 20 70 6c 61 79 69 6e 67 20 62 61  te by playing ba
1c910 63 6b 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61  ck.** the journa
1c920 6c 2e 20 20 54 68 65 6e 20 74 68 65 20 63 6f 6e  l.  Then the con
1c930 74 65 6e 74 73 20 6f 66 20 74 68 65 20 6a 6f 75  tents of the jou
1c940 72 6e 61 6c 20 61 72 65 20 66 6c 75 73 68 65 64  rnal are flushed
1c950 20 6f 75 74 20 74 6f 0a 2a 2a 20 74 68 65 20 64   out to.** the d
1c960 69 73 6b 2e 20 20 41 66 74 65 72 20 74 68 65 20  isk.  After the 
1c970 6a 6f 75 72 6e 61 6c 20 69 73 20 73 61 66 65 6c  journal is safel
1c980 79 20 6f 6e 20 6f 78 69 64 65 2c 20 74 68 65 20  y on oxide, the 
1c990 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 0a 2a  changes to the.*
1c9a0 2a 20 64 61 74 61 62 61 73 65 20 61 72 65 20 77  * database are w
1c9b0 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
1c9c0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e  database file an
1c9d0 64 20 66 6c 75 73 68 65 64 20 74 6f 20 6f 78 69  d flushed to oxi
1c9e0 64 65 2e 0a 2a 2a 20 41 74 20 74 68 65 20 65 6e  de..** At the en
1c9f0 64 20 6f 66 20 74 68 69 73 20 63 61 6c 6c 2c 20  d of this call, 
1ca00 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  the rollback jou
1ca10 72 6e 61 6c 20 73 74 69 6c 6c 20 65 78 69 73 74  rnal still exist
1ca20 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 64 69 73 6b  s on the.** disk
1ca30 20 61 6e 64 20 77 65 20 61 72 65 20 73 74 69 6c   and we are stil
1ca40 6c 20 68 6f 6c 64 69 6e 67 20 61 6c 6c 20 6c 6f  l holding all lo
1ca50 63 6b 73 2c 20 73 6f 20 74 68 65 20 74 72 61 6e  cks, so the tran
1ca60 73 61 63 74 69 6f 6e 20 68 61 73 20 6e 6f 74 0a  saction has not.
1ca70 2a 2a 20 63 6f 6d 6d 69 74 74 65 64 2e 20 20 53  ** committed.  S
1ca80 65 65 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  ee sqlite3BtreeC
1ca90 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29 20  ommitPhaseTwo() 
1caa0 66 6f 72 20 74 68 65 20 73 65 63 6f 6e 64 20 70  for the second p
1cab0 68 61 73 65 20 6f 66 20 74 68 65 0a 2a 2a 20 63  hase of the.** c
1cac0 6f 6d 6d 69 74 20 70 72 6f 63 65 73 73 2e 0a 2a  ommit process..*
1cad0 2a 0a 2a 2a 20 54 68 69 73 20 63 61 6c 6c 20 69  *.** This call i
1cae0 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 6e 6f 20  s a no-op if no 
1caf0 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
1cb00 6e 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 61  n is currently a
1cb10 63 74 69 76 65 20 6f 6e 20 70 42 74 2e 0a 2a 2a  ctive on pBt..**
1cb20 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 73  .** Otherwise, s
1cb30 79 6e 63 20 74 68 65 20 64 61 74 61 62 61 73 65  ync the database
1cb40 20 66 69 6c 65 20 66 6f 72 20 74 68 65 20 62 74   file for the bt
1cb50 72 65 65 20 70 42 74 2e 20 7a 4d 61 73 74 65 72  ree pBt. zMaster
1cb60 20 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 74 68   points to.** th
1cb70 65 20 6e 61 6d 65 20 6f 66 20 61 20 6d 61 73 74  e name of a mast
1cb80 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
1cb90 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 77  that should be w
1cba0 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 0a  ritten into the.
1cbb0 2a 2a 20 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f  ** individual jo
1cbc0 75 72 6e 61 6c 20 66 69 6c 65 2c 20 6f 72 20 69  urnal file, or i
1cbd0 73 20 4e 55 4c 4c 2c 20 69 6e 64 69 63 61 74 69  s NULL, indicati
1cbe0 6e 67 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75  ng no master jou
1cbf0 72 6e 61 6c 20 66 69 6c 65 20 0a 2a 2a 20 28 73  rnal file .** (s
1cc00 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20 74  ingle database t
1cc10 72 61 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a 0a  ransaction)..**.
1cc20 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 69 73 20  ** When this is 
1cc30 63 61 6c 6c 65 64 2c 20 74 68 65 20 6d 61 73 74  called, the mast
1cc40 65 72 20 6a 6f 75 72 6e 61 6c 20 73 68 6f 75 6c  er journal shoul
1cc50 64 20 61 6c 72 65 61 64 79 20 68 61 76 65 20 62  d already have b
1cc60 65 65 6e 0a 2a 2a 20 63 72 65 61 74 65 64 2c 20  een.** created, 
1cc70 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 74  populated with t
1cc80 68 69 73 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e  his journal poin
1cc90 74 65 72 20 61 6e 64 20 73 79 6e 63 65 64 20 74  ter and synced t
1cca0 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 4f 6e  o disk..**.** On
1ccb0 63 65 20 74 68 69 73 20 69 73 20 72 6f 75 74 69  ce this is routi
1ccc0 6e 65 20 68 61 73 20 72 65 74 75 72 6e 65 64 2c  ne has returned,
1ccd0 20 74 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67 20   the only thing 
1cce0 72 65 71 75 69 72 65 64 20 74 6f 20 63 6f 6d 6d  required to comm
1ccf0 69 74 0a 2a 2a 20 74 68 65 20 77 72 69 74 65 2d  it.** the write-
1cd00 74 72 61 6e 73 61 63 74 69 6f 6e 20 66 6f 72 20  transaction for 
1cd10 74 68 69 73 20 64 61 74 61 62 61 73 65 20 66 69  this database fi
1cd20 6c 65 20 69 73 20 74 6f 20 64 65 6c 65 74 65 20  le is to delete 
1cd30 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a  the journal..*/.
1cd40 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
1cd50 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 42  CommitPhaseOne(B
1cd60 74 72 65 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63  tree *p, const c
1cd70 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20  har *zMaster){. 
1cd80 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
1cd90 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 2d 3e 69 6e  _OK;.  if( p->in
1cda0 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49  Trans==TRANS_WRI
1cdb0 54 45 20 29 7b 0a 20 20 20 20 42 74 53 68 61 72  TE ){.    BtShar
1cdc0 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
1cdd0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  ;.    sqlite3Btr
1cde0 65 65 45 6e 74 65 72 28 70 29 3b 0a 23 69 66 6e  eeEnter(p);.#ifn
1cdf0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1ce00 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69  AUTOVACUUM.    i
1ce10 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  f( pBt->autoVacu
1ce20 75 6d 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  um ){.      rc =
1ce30 20 61 75 74 6f 56 61 63 75 75 6d 43 6f 6d 6d 69   autoVacuumCommi
1ce40 74 28 70 42 74 29 3b 0a 20 20 20 20 20 20 69 66  t(pBt);.      if
1ce50 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1ce60 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
1ce70 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
1ce80 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
1ce90 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
1cea0 7d 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 62  }.    if( pBt->b
1ceb0 44 6f 54 72 75 6e 63 61 74 65 20 29 7b 0a 20 20  DoTruncate ){.  
1cec0 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
1ced0 54 72 75 6e 63 61 74 65 49 6d 61 67 65 28 70 42  TruncateImage(pB
1cee0 74 2d 3e 70 50 61 67 65 72 2c 20 70 42 74 2d 3e  t->pPager, pBt->
1cef0 6e 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 23 65  nPage);.    }.#e
1cf00 6e 64 69 66 0a 20 20 20 20 72 63 20 3d 20 73 71  ndif.    rc = sq
1cf10 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74  lite3PagerCommit
1cf20 50 68 61 73 65 4f 6e 65 28 70 42 74 2d 3e 70 50  PhaseOne(pBt->pP
1cf30 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 2c 20 30  ager, zMaster, 0
1cf40 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  );.    sqlite3Bt
1cf50 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d  reeLeave(p);.  }
1cf60 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1cf70 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
1cf80 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 66  tion is called f
1cf90 72 6f 6d 20 62 6f 74 68 20 42 74 72 65 65 43 6f  rom both BtreeCo
1cfa0 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29 20 61  mmitPhaseTwo() a
1cfb0 6e 64 20 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b  nd BtreeRollback
1cfc0 28 29 0a 2a 2a 20 61 74 20 74 68 65 20 63 6f 6e  ().** at the con
1cfd0 63 6c 75 73 69 6f 6e 20 6f 66 20 61 20 74 72 61  clusion of a tra
1cfe0 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  nsaction..*/.sta
1cff0 74 69 63 20 76 6f 69 64 20 62 74 72 65 65 45 6e  tic void btreeEn
1d000 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 42 74 72  dTransaction(Btr
1d010 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72  ee *p){.  BtShar
1d020 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
1d030 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
1d040 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72  = p->db;.  asser
1d050 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48  t( sqlite3BtreeH
1d060 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a  oldsMutex(p) );.
1d070 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1d080 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
1d090 20 20 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61    pBt->bDoTrunca
1d0a0 74 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20  te = 0;.#endif. 
1d0b0 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e   if( p->inTrans>
1d0c0 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 20 64 62  TRANS_NONE && db
1d0d0 2d 3e 6e 56 64 62 65 52 65 61 64 3e 31 20 29 7b  ->nVdbeRead>1 ){
1d0e0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65  .    /* If there
1d0f0 20 61 72 65 20 6f 74 68 65 72 20 61 63 74 69 76   are other activ
1d100 65 20 73 74 61 74 65 6d 65 6e 74 73 20 74 68 61  e statements tha
1d110 74 20 62 65 6c 6f 6e 67 20 74 6f 20 74 68 69 73  t belong to this
1d120 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a   database.    **
1d130 20 68 61 6e 64 6c 65 2c 20 64 6f 77 6e 67 72 61   handle, downgra
1d140 64 65 20 74 6f 20 61 20 72 65 61 64 2d 6f 6e 6c  de to a read-onl
1d150 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54  y transaction. T
1d160 68 65 20 6f 74 68 65 72 20 73 74 61 74 65 6d 65  he other stateme
1d170 6e 74 73 0a 20 20 20 20 2a 2a 20 6d 61 79 20 73  nts.    ** may s
1d180 74 69 6c 6c 20 62 65 20 72 65 61 64 69 6e 67 20  till be reading 
1d190 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
1d1a0 65 2e 20 20 2a 2f 0a 20 20 20 20 64 6f 77 6e 67  e.  */.    downg
1d1b0 72 61 64 65 41 6c 6c 53 68 61 72 65 64 43 61 63  radeAllSharedCac
1d1c0 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 70 29 3b  heTableLocks(p);
1d1d0 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20  .    p->inTrans 
1d1e0 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20  = TRANS_READ;.  
1d1f0 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66  }else{.    /* If
1d200 20 74 68 65 20 68 61 6e 64 6c 65 20 68 61 64 20   the handle had 
1d210 61 6e 79 20 6b 69 6e 64 20 6f 66 20 74 72 61 6e  any kind of tran
1d220 73 61 63 74 69 6f 6e 20 6f 70 65 6e 2c 20 64 65  saction open, de
1d230 63 72 65 6d 65 6e 74 20 74 68 65 20 0a 20 20 20  crement the .   
1d240 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   ** transaction 
1d250 63 6f 75 6e 74 20 6f 66 20 74 68 65 20 73 68 61  count of the sha
1d260 72 65 64 20 62 74 72 65 65 2e 20 49 66 20 74 68  red btree. If th
1d270 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f  e transaction co
1d280 75 6e 74 20 0a 20 20 20 20 2a 2a 20 72 65 61 63  unt .    ** reac
1d290 68 65 73 20 30 2c 20 73 65 74 20 74 68 65 20 73  hes 0, set the s
1d2a0 68 61 72 65 64 20 73 74 61 74 65 20 74 6f 20 54  hared state to T
1d2b0 52 41 4e 53 5f 4e 4f 4e 45 2e 20 54 68 65 20 75  RANS_NONE. The u
1d2c0 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73  nlockBtreeIfUnus
1d2d0 65 64 28 29 0a 20 20 20 20 2a 2a 20 63 61 6c 6c  ed().    ** call
1d2e0 20 62 65 6c 6f 77 20 77 69 6c 6c 20 75 6e 6c 6f   below will unlo
1d2f0 63 6b 20 74 68 65 20 70 61 67 65 72 2e 20 20 2a  ck the pager.  *
1d300 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 6e 54  /.    if( p->inT
1d310 72 61 6e 73 21 3d 54 52 41 4e 53 5f 4e 4f 4e 45  rans!=TRANS_NONE
1d320 20 29 7b 0a 20 20 20 20 20 20 63 6c 65 61 72 41   ){.      clearA
1d330 6c 6c 53 68 61 72 65 64 43 61 63 68 65 54 61 62  llSharedCacheTab
1d340 6c 65 4c 6f 63 6b 73 28 70 29 3b 0a 20 20 20 20  leLocks(p);.    
1d350 20 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74    pBt->nTransact
1d360 69 6f 6e 2d 2d 3b 0a 20 20 20 20 20 20 69 66 28  ion--;.      if(
1d370 20 30 3d 3d 70 42 74 2d 3e 6e 54 72 61 6e 73 61   0==pBt->nTransa
1d380 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 20  ction ){.       
1d390 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
1d3a0 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45  ion = TRANS_NONE
1d3b0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1d3c0 0a 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20  .    /* Set the 
1d3d0 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74  current transact
1d3e0 69 6f 6e 20 73 74 61 74 65 20 74 6f 20 54 52 41  ion state to TRA
1d3f0 4e 53 5f 4e 4f 4e 45 20 61 6e 64 20 75 6e 6c 6f  NS_NONE and unlo
1d400 63 6b 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 70  ck the .    ** p
1d410 61 67 65 72 20 69 66 20 74 68 69 73 20 63 61 6c  ager if this cal
1d420 6c 20 63 6c 6f 73 65 64 20 74 68 65 20 6f 6e 6c  l closed the onl
1d430 79 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20  y read or write 
1d440 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 2a 2f  transaction.  */
1d450 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20  .    p->inTrans 
1d460 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20  = TRANS_NONE;.  
1d470 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55    unlockBtreeIfU
1d480 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20 7d 0a  nused(pBt);.  }.
1d490 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74  .  btreeIntegrit
1d4a0 79 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  y(p);.}../*.** C
1d4b0 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e 73 61  ommit the transa
1d4c0 63 74 69 6f 6e 20 63 75 72 72 65 6e 74 6c 79 20  ction currently 
1d4d0 69 6e 20 70 72 6f 67 72 65 73 73 2e 0a 2a 2a 0a  in progress..**.
1d4e0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1d4f0 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 73  implements the s
1d500 65 63 6f 6e 64 20 70 68 61 73 65 20 6f 66 20 61  econd phase of a
1d510 20 32 2d 70 68 61 73 65 20 63 6f 6d 6d 69 74 2e   2-phase commit.
1d520 20 20 54 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33    The.** sqlite3
1d530 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
1d540 4f 6e 65 28 29 20 72 6f 75 74 69 6e 65 20 64 6f  One() routine do
1d550 65 73 20 74 68 65 20 66 69 72 73 74 20 70 68 61  es the first pha
1d560 73 65 20 61 6e 64 20 73 68 6f 75 6c 64 0a 2a 2a  se and should.**
1d570 20 62 65 20 69 6e 76 6f 6b 65 64 20 70 72 69 6f   be invoked prio
1d580 72 20 74 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69  r to calling thi
1d590 73 20 72 6f 75 74 69 6e 65 2e 20 20 54 68 65 20  s routine.  The 
1d5a0 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
1d5b0 69 74 50 68 61 73 65 4f 6e 65 28 29 0a 2a 2a 20  itPhaseOne().** 
1d5c0 72 6f 75 74 69 6e 65 20 64 69 64 20 61 6c 6c 20  routine did all 
1d5d0 74 68 65 20 77 6f 72 6b 20 6f 66 20 77 72 69 74  the work of writ
1d5e0 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ing information 
1d5f0 6f 75 74 20 74 6f 20 64 69 73 6b 20 61 6e 64 20  out to disk and 
1d600 66 6c 75 73 68 69 6e 67 20 74 68 65 0a 2a 2a 20  flushing the.** 
1d610 63 6f 6e 74 65 6e 74 73 20 73 6f 20 74 68 61 74  contents so that
1d620 20 74 68 65 79 20 61 72 65 20 77 72 69 74 74 65   they are writte
1d630 6e 20 6f 6e 74 6f 20 74 68 65 20 64 69 73 6b 20  n onto the disk 
1d640 70 6c 61 74 74 65 72 2e 20 20 41 6c 6c 20 74 68  platter.  All th
1d650 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 68 61  is.** routine ha
1d660 73 20 74 6f 20 64 6f 20 69 73 20 64 65 6c 65 74  s to do is delet
1d670 65 20 6f 72 20 74 72 75 6e 63 61 74 65 20 6f 72  e or truncate or
1d680 20 7a 65 72 6f 20 74 68 65 20 68 65 61 64 65 72   zero the header
1d690 20 69 6e 20 74 68 65 0a 2a 2a 20 74 68 65 20 72   in the.** the r
1d6a0 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20  ollback journal 
1d6b0 28 77 68 69 63 68 20 63 61 75 73 65 73 20 74 68  (which causes th
1d6c0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 6f  e transaction to
1d6d0 20 63 6f 6d 6d 69 74 29 20 61 6e 64 0a 2a 2a 20   commit) and.** 
1d6e0 64 72 6f 70 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a  drop locks..**.*
1d6f0 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69 66 20 61  * Normally, if a
1d700 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  n error occurs w
1d710 68 69 6c 65 20 74 68 65 20 70 61 67 65 72 20 6c  hile the pager l
1d720 61 79 65 72 20 69 73 20 61 74 74 65 6d 70 74 69  ayer is attempti
1d730 6e 67 20 74 6f 20 0a 2a 2a 20 66 69 6e 61 6c 69  ng to .** finali
1d740 7a 65 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e  ze the underlyin
1d750 67 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20  g journal file, 
1d760 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
1d770 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 20 61  turns an error a
1d780 6e 64 0a 2a 2a 20 74 68 65 20 75 70 70 65 72 20  nd.** the upper 
1d790 6c 61 79 65 72 20 77 69 6c 6c 20 61 74 74 65 6d  layer will attem
1d7a0 70 74 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 20 48  pt a rollback. H
1d7b0 6f 77 65 76 65 72 2c 20 69 66 20 74 68 65 20 73  owever, if the s
1d7c0 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 0a 2a  econd argument.*
1d7d0 2a 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 74 68  * is non-zero th
1d7e0 65 6e 20 74 68 69 73 20 62 2d 74 72 65 65 20 74  en this b-tree t
1d7f0 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 70 61  ransaction is pa
1d800 72 74 20 6f 66 20 61 20 6d 75 6c 74 69 2d 66 69  rt of a multi-fi
1d810 6c 65 20 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69  le .** transacti
1d820 6f 6e 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  on. In this case
1d830 2c 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  , the transactio
1d840 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  n has already be
1d850 65 6e 20 63 6f 6d 6d 69 74 74 65 64 20 0a 2a 2a  en committed .**
1d860 20 28 62 79 20 64 65 6c 65 74 69 6e 67 20 61 20   (by deleting a 
1d870 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
1d880 69 6c 65 29 20 61 6e 64 20 74 68 65 20 63 61 6c  ile) and the cal
1d890 6c 65 72 20 77 69 6c 6c 20 69 67 6e 6f 72 65 20  ler will ignore 
1d8a0 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f  this .** functio
1d8b0 6e 73 20 72 65 74 75 72 6e 20 63 6f 64 65 2e 20  ns return code. 
1d8c0 53 6f 2c 20 65 76 65 6e 20 69 66 20 61 6e 20 65  So, even if an e
1d8d0 72 72 6f 72 20 6f 63 63 75 72 73 20 69 6e 20 74  rror occurs in t
1d8e0 68 65 20 70 61 67 65 72 20 6c 61 79 65 72 2c 0a  he pager layer,.
1d8f0 2a 2a 20 72 65 73 65 74 20 74 68 65 20 62 2d 74  ** reset the b-t
1d900 72 65 65 20 6f 62 6a 65 63 74 73 20 69 6e 74 65  ree objects inte
1d910 72 6e 61 6c 20 73 74 61 74 65 20 74 6f 20 69 6e  rnal state to in
1d920 64 69 63 61 74 65 20 74 68 61 74 20 74 68 65 20  dicate that the 
1d930 77 72 69 74 65 0a 2a 2a 20 74 72 61 6e 73 61 63  write.** transac
1d940 74 69 6f 6e 20 68 61 73 20 62 65 65 6e 20 63 6c  tion has been cl
1d950 6f 73 65 64 2e 20 54 68 69 73 20 69 73 20 71 75  osed. This is qu
1d960 69 74 65 20 73 61 66 65 2c 20 61 73 20 74 68 65  ite safe, as the
1d970 20 70 61 67 65 72 20 77 69 6c 6c 20 68 61 76 65   pager will have
1d980 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 65 64  .** transitioned
1d990 20 74 6f 20 74 68 65 20 65 72 72 6f 72 20 73 74   to the error st
1d9a0 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ate..**.** This 
1d9b0 77 69 6c 6c 20 72 65 6c 65 61 73 65 20 74 68 65  will release the
1d9c0 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74   write lock on t
1d9d0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1d9e0 2e 20 20 49 66 20 74 68 65 72 65 0a 2a 2a 20 61  .  If there.** a
1d9f0 72 65 20 6e 6f 20 61 63 74 69 76 65 20 63 75 72  re no active cur
1da00 73 6f 72 73 2c 20 69 74 20 61 6c 73 6f 20 72 65  sors, it also re
1da10 6c 65 61 73 65 73 20 74 68 65 20 72 65 61 64 20  leases the read 
1da20 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  lock..*/.int sql
1da30 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
1da40 68 61 73 65 54 77 6f 28 42 74 72 65 65 20 2a 70  haseTwo(Btree *p
1da50 2c 20 69 6e 74 20 62 43 6c 65 61 6e 75 70 29 7b  , int bCleanup){
1da60 0a 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61  ..  if( p->inTra
1da70 6e 73 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29  ns==TRANS_NONE )
1da80 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1da90 4b 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  K;.  sqlite3Btre
1daa0 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 62 74 72  eEnter(p);.  btr
1dab0 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a  eeIntegrity(p);.
1dac0 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 68 61 6e  .  /* If the han
1dad0 64 6c 65 20 68 61 73 20 61 20 77 72 69 74 65 2d  dle has a write-
1dae0 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e  transaction open
1daf0 2c 20 63 6f 6d 6d 69 74 20 74 68 65 20 73 68 61  , commit the sha
1db00 72 65 64 2d 62 74 72 65 65 73 20 0a 20 20 2a 2a  red-btrees .  **
1db10 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64   transaction and
1db20 20 73 65 74 20 74 68 65 20 73 68 61 72 65 64 20   set the shared 
1db30 73 74 61 74 65 20 74 6f 20 54 52 41 4e 53 5f 52  state to TRANS_R
1db40 45 41 44 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  EAD..  */.  if( 
1db50 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  p->inTrans==TRAN
1db60 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 69  S_WRITE ){.    i
1db70 6e 74 20 72 63 3b 0a 20 20 20 20 42 74 53 68 61  nt rc;.    BtSha
1db80 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
1db90 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  t;.    assert( p
1dba0 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
1dbb0 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29  n==TRANS_WRITE )
1dbc0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42  ;.    assert( pB
1dbd0 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3e  t->nTransaction>
1dbe0 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  0 );.    rc = sq
1dbf0 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74  lite3PagerCommit
1dc00 50 68 61 73 65 54 77 6f 28 70 42 74 2d 3e 70 50  PhaseTwo(pBt->pP
1dc10 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72  ager);.    if( r
1dc20 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c!=SQLITE_OK && 
1dc30 62 43 6c 65 61 6e 75 70 3d 3d 30 20 29 7b 0a 20  bCleanup==0 ){. 
1dc40 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
1dc50 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 20  eLeave(p);.     
1dc60 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1dc70 7d 0a 20 20 20 20 70 2d 3e 69 44 61 74 61 56 65  }.    p->iDataVe
1dc80 72 73 69 6f 6e 2d 2d 3b 20 20 2f 2a 20 43 6f 6d  rsion--;  /* Com
1dc90 70 65 6e 73 61 74 65 20 66 6f 72 20 70 50 61 67  pensate for pPag
1dca0 65 72 2d 3e 69 44 61 74 61 56 65 72 73 69 6f 6e  er->iDataVersion
1dcb0 2b 2b 3b 20 2a 2f 0a 20 20 20 20 70 42 74 2d 3e  ++; */.    pBt->
1dcc0 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20  inTransaction = 
1dcd0 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20 20 20  TRANS_READ;.    
1dce0 62 74 72 65 65 43 6c 65 61 72 48 61 73 43 6f 6e  btreeClearHasCon
1dcf0 74 65 6e 74 28 70 42 74 29 3b 0a 20 20 7d 0a 0a  tent(pBt);.  }..
1dd00 20 20 62 74 72 65 65 45 6e 64 54 72 61 6e 73 61    btreeEndTransa
1dd10 63 74 69 6f 6e 28 70 29 3b 0a 20 20 73 71 6c 69  ction(p);.  sqli
1dd20 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
1dd30 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
1dd40 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  E_OK;.}../*.** D
1dd50 6f 20 62 6f 74 68 20 70 68 61 73 65 73 20 6f 66  o both phases of
1dd60 20 61 20 63 6f 6d 6d 69 74 2e 0a 2a 2f 0a 69 6e   a commit..*/.in
1dd70 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  t sqlite3BtreeCo
1dd80 6d 6d 69 74 28 42 74 72 65 65 20 2a 70 29 7b 0a  mmit(Btree *p){.
1dd90 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69    int rc;.  sqli
1dda0 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
1ddb0 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
1ddc0 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
1ddd0 4f 6e 65 28 70 2c 20 30 29 3b 0a 20 20 69 66 28  One(p, 0);.  if(
1dde0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1ddf0 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
1de00 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
1de10 73 65 54 77 6f 28 70 2c 20 30 29 3b 0a 20 20 7d  seTwo(p, 0);.  }
1de20 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
1de30 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
1de40 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
1de50 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73  his routine sets
1de60 20 74 68 65 20 73 74 61 74 65 20 74 6f 20 43 55   the state to CU
1de70 52 53 4f 52 5f 46 41 55 4c 54 20 61 6e 64 20 74  RSOR_FAULT and t
1de80 68 65 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65  he error.** code
1de90 20 74 6f 20 65 72 72 43 6f 64 65 20 66 6f 72 20   to errCode for 
1dea0 65 76 65 72 79 20 63 75 72 73 6f 72 20 6f 6e 20  every cursor on 
1deb0 61 6e 79 20 42 74 53 68 61 72 65 64 20 74 68 61  any BtShared tha
1dec0 74 20 70 42 74 72 65 65 0a 2a 2a 20 72 65 66 65  t pBtree.** refe
1ded0 72 65 6e 63 65 73 2e 20 20 4f 72 20 69 66 20 74  rences.  Or if t
1dee0 68 65 20 77 72 69 74 65 4f 6e 6c 79 20 66 6c 61  he writeOnly fla
1def0 67 20 69 73 20 73 65 74 20 74 6f 20 31 2c 20 74  g is set to 1, t
1df00 68 65 6e 20 6f 6e 6c 79 0a 2a 2a 20 74 72 69 70  hen only.** trip
1df10 20 77 72 69 74 65 20 63 75 72 73 6f 72 73 20 61   write cursors a
1df20 6e 64 20 6c 65 61 76 65 20 72 65 61 64 20 63 75  nd leave read cu
1df30 72 73 6f 72 73 20 75 6e 63 68 61 6e 67 65 64 2e  rsors unchanged.
1df40 0a 2a 2a 0a 2a 2a 20 45 76 65 72 79 20 63 75 72  .**.** Every cur
1df50 73 6f 72 20 69 73 20 61 20 63 61 6e 64 69 64 61  sor is a candida
1df60 74 65 20 74 6f 20 62 65 20 74 72 69 70 70 65 64  te to be tripped
1df70 2c 20 69 6e 63 6c 75 64 69 6e 67 20 63 75 72 73  , including curs
1df80 6f 72 73 0a 2a 2a 20 74 68 61 74 20 62 65 6c 6f  ors.** that belo
1df90 6e 67 20 74 6f 20 6f 74 68 65 72 20 64 61 74 61  ng to other data
1dfa0 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  base connections
1dfb0 20 74 68 61 74 20 68 61 70 70 65 6e 20 74 6f 20   that happen to 
1dfc0 62 65 0a 2a 2a 20 73 68 61 72 69 6e 67 20 74 68  be.** sharing th
1dfd0 65 20 63 61 63 68 65 20 77 69 74 68 20 70 42 74  e cache with pBt
1dfe0 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ree..**.** This 
1dff0 72 6f 75 74 69 6e 65 20 67 65 74 73 20 63 61 6c  routine gets cal
1e000 6c 65 64 20 77 68 65 6e 20 61 20 72 6f 6c 6c 62  led when a rollb
1e010 61 63 6b 20 6f 63 63 75 72 73 2e 20 49 66 20 74  ack occurs. If t
1e020 68 65 20 77 72 69 74 65 4f 6e 6c 79 0a 2a 2a 20  he writeOnly.** 
1e030 66 6c 61 67 20 69 73 20 74 72 75 65 2c 20 74 68  flag is true, th
1e040 65 6e 20 6f 6e 6c 79 20 77 72 69 74 65 2d 63 75  en only write-cu
1e050 72 73 6f 72 73 20 6e 65 65 64 20 62 65 20 74 72  rsors need be tr
1e060 69 70 70 65 64 20 2d 20 72 65 61 64 2d 6f 6e 6c  ipped - read-onl
1e070 79 0a 2a 2a 20 63 75 72 73 6f 72 73 20 73 61 76  y.** cursors sav
1e080 65 20 74 68 65 69 72 20 63 75 72 72 65 6e 74 20  e their current 
1e090 70 6f 73 69 74 69 6f 6e 73 20 73 6f 20 74 68 61  positions so tha
1e0a0 74 20 74 68 65 79 20 6d 61 79 20 63 6f 6e 74 69  t they may conti
1e0b0 6e 75 65 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e  nue .** followin
1e0c0 67 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 20  g the rollback. 
1e0d0 4f 72 2c 20 69 66 20 77 72 69 74 65 4f 6e 6c 79  Or, if writeOnly
1e0e0 20 69 73 20 66 61 6c 73 65 2c 20 61 6c 6c 20 63   is false, all c
1e0f0 75 72 73 6f 72 73 20 61 72 65 20 0a 2a 2a 20 74  ursors are .** t
1e100 72 69 70 70 65 64 2e 20 49 6e 20 67 65 6e 65 72  ripped. In gener
1e110 61 6c 2c 20 77 72 69 74 65 4f 6e 6c 79 20 69 73  al, writeOnly is
1e120 20 66 61 6c 73 65 20 69 66 20 74 68 65 20 74 72   false if the tr
1e130 61 6e 73 61 63 74 69 6f 6e 20 62 65 69 6e 67 0a  ansaction being.
1e140 2a 2a 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 6d  ** rolled back m
1e150 6f 64 69 66 69 65 64 20 74 68 65 20 64 61 74 61  odified the data
1e160 62 61 73 65 20 73 63 68 65 6d 61 2e 20 49 6e 20  base schema. In 
1e170 74 68 69 73 20 63 61 73 65 20 62 2d 74 72 65 65  this case b-tree
1e180 20 72 6f 6f 74 0a 2a 2a 20 70 61 67 65 73 20 6d   root.** pages m
1e190 61 79 20 62 65 20 6d 6f 76 65 64 20 6f 72 20 64  ay be moved or d
1e1a0 65 6c 65 74 65 64 20 66 72 6f 6d 20 74 68 65 20  eleted from the 
1e1b0 64 61 74 61 62 61 73 65 20 61 6c 74 6f 67 65 74  database altoget
1e1c0 68 65 72 2c 20 6d 61 6b 69 6e 67 0a 2a 2a 20 69  her, making.** i
1e1d0 74 20 75 6e 73 61 66 65 20 66 6f 72 20 72 65 61  t unsafe for rea
1e1e0 64 20 63 75 72 73 6f 72 73 20 74 6f 20 63 6f 6e  d cursors to con
1e1f0 74 69 6e 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  tinue..**.** If 
1e200 74 68 65 20 77 72 69 74 65 4f 6e 6c 79 20 66 6c  the writeOnly fl
1e210 61 67 20 69 73 20 74 72 75 65 20 61 6e 64 20 61  ag is true and a
1e220 6e 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75  n error is encou
1e230 6e 74 65 72 65 64 20 77 68 69 6c 65 20 0a 2a 2a  ntered while .**
1e240 20 73 61 76 69 6e 67 20 74 68 65 20 63 75 72 72   saving the curr
1e250 65 6e 74 20 70 6f 73 69 74 69 6f 6e 20 6f 66 20  ent position of 
1e260 61 20 72 65 61 64 2d 6f 6e 6c 79 20 63 75 72 73  a read-only curs
1e270 6f 72 2c 20 61 6c 6c 20 63 75 72 73 6f 72 73 2c  or, all cursors,
1e280 20 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20 61   .** including a
1e290 6c 6c 20 72 65 61 64 2d 63 75 72 73 6f 72 73 20  ll read-cursors 
1e2a0 61 72 65 20 74 72 69 70 70 65 64 2e 0a 2a 2a 0a  are tripped..**.
1e2b0 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  ** SQLITE_OK is 
1e2c0 72 65 74 75 72 6e 65 64 20 69 66 20 73 75 63 63  returned if succ
1e2d0 65 73 73 66 75 6c 2c 20 6f 72 20 69 66 20 61 6e  essful, or if an
1e2e0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
1e2f0 69 6c 65 0a 2a 2a 20 73 61 76 69 6e 67 20 61 20  ile.** saving a 
1e300 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 2c  cursor position,
1e310 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
1e320 20 63 6f 64 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71   code..*/.int sq
1e330 6c 69 74 65 33 42 74 72 65 65 54 72 69 70 41 6c  lite3BtreeTripAl
1e340 6c 43 75 72 73 6f 72 73 28 42 74 72 65 65 20 2a  lCursors(Btree *
1e350 70 42 74 72 65 65 2c 20 69 6e 74 20 65 72 72 43  pBtree, int errC
1e360 6f 64 65 2c 20 69 6e 74 20 77 72 69 74 65 4f 6e  ode, int writeOn
1e370 6c 79 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20  ly){.  BtCursor 
1e380 2a 70 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  *p;.  int rc = S
1e390 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73  QLITE_OK;..  ass
1e3a0 65 72 74 28 20 28 77 72 69 74 65 4f 6e 6c 79 3d  ert( (writeOnly=
1e3b0 3d 30 20 7c 7c 20 77 72 69 74 65 4f 6e 6c 79 3d  =0 || writeOnly=
1e3c0 3d 31 29 20 26 26 20 42 54 43 46 5f 57 72 69 74  =1) && BTCF_Writ
1e3d0 65 46 6c 61 67 3d 3d 31 20 29 3b 0a 20 20 69 66  eFlag==1 );.  if
1e3e0 28 20 70 42 74 72 65 65 20 29 7b 0a 20 20 20 20  ( pBtree ){.    
1e3f0 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
1e400 72 28 70 42 74 72 65 65 29 3b 0a 20 20 20 20 66  r(pBtree);.    f
1e410 6f 72 28 70 3d 70 42 74 72 65 65 2d 3e 70 42 74  or(p=pBtree->pBt
1e420 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d  ->pCursor; p; p=
1e430 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  p->pNext){.     
1e440 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 69 66   int i;.      if
1e450 28 20 77 72 69 74 65 4f 6e 6c 79 20 26 26 20 28  ( writeOnly && (
1e460 70 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54  p->curFlags & BT
1e470 43 46 5f 57 72 69 74 65 46 6c 61 67 29 3d 3d 30  CF_WriteFlag)==0
1e480 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
1e490 70 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  p->eState==CURSO
1e4a0 52 5f 56 41 4c 49 44 20 7c 7c 20 70 2d 3e 65 53  R_VALID || p->eS
1e4b0 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 53 4b 49  tate==CURSOR_SKI
1e4c0 50 4e 45 58 54 20 29 7b 0a 20 20 20 20 20 20 20  PNEXT ){.       
1e4d0 20 20 20 72 63 20 3d 20 73 61 76 65 43 75 72 73     rc = saveCurs
1e4e0 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29 3b 0a 20  orPosition(p);. 
1e4f0 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
1e500 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1e510 20 20 20 20 20 20 20 20 20 20 28 76 6f 69 64 29            (void)
1e520 73 71 6c 69 74 65 33 42 74 72 65 65 54 72 69 70  sqlite3BtreeTrip
1e530 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 72 65  AllCursors(pBtre
1e540 65 2c 20 72 63 2c 20 30 29 3b 0a 20 20 20 20 20  e, rc, 0);.     
1e550 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
1e560 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1e570 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
1e580 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1e590 42 74 72 65 65 43 6c 65 61 72 43 75 72 73 6f 72  BtreeClearCursor
1e5a0 28 70 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  (p);.        p->
1e5b0 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
1e5c0 46 41 55 4c 54 3b 0a 20 20 20 20 20 20 20 20 70  FAULT;.        p
1e5d0 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20 65 72 72  ->skipNext = err
1e5e0 43 6f 64 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Code;.      }.  
1e5f0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d      for(i=0; i<=
1e600 70 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a  p->iPage; i++){.
1e610 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
1e620 61 67 65 28 70 2d 3e 61 70 50 61 67 65 5b 69 5d  age(p->apPage[i]
1e630 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 70  );.        p->ap
1e640 50 61 67 65 5b 69 5d 20 3d 20 30 3b 0a 20 20 20  Page[i] = 0;.   
1e650 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
1e660 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
1e670 28 70 42 74 72 65 65 29 3b 0a 20 20 7d 0a 20 20  (pBtree);.  }.  
1e680 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1e690 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 74 68 65  .** Rollback the
1e6a0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20   transaction in 
1e6b0 70 72 6f 67 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20  progress..**.** 
1e6c0 49 66 20 74 72 69 70 43 6f 64 65 20 69 73 20 6e  If tripCode is n
1e6d0 6f 74 20 53 51 4c 49 54 45 5f 4f 4b 20 74 68 65  ot SQLITE_OK the
1e6e0 6e 20 63 75 72 73 6f 72 73 20 77 69 6c 6c 20 62  n cursors will b
1e6f0 65 20 69 6e 76 61 6c 69 64 61 74 65 64 20 28 74  e invalidated (t
1e700 72 69 70 70 65 64 29 2e 0a 2a 2a 20 4f 6e 6c 79  ripped)..** Only
1e710 20 77 72 69 74 65 20 63 75 72 73 6f 72 73 20 61   write cursors a
1e720 72 65 20 74 72 69 70 70 65 64 20 69 66 20 77 72  re tripped if wr
1e730 69 74 65 4f 6e 6c 79 20 69 73 20 74 72 75 65 20  iteOnly is true 
1e740 62 75 74 20 61 6c 6c 20 63 75 72 73 6f 72 73 20  but all cursors 
1e750 61 72 65 0a 2a 2a 20 74 72 69 70 70 65 64 20 69  are.** tripped i
1e760 66 20 77 72 69 74 65 4f 6e 6c 79 20 69 73 20 66  f writeOnly is f
1e770 61 6c 73 65 2e 20 20 41 6e 79 20 61 74 74 65 6d  alse.  Any attem
1e780 70 74 20 74 6f 20 75 73 65 0a 2a 2a 20 61 20 74  pt to use.** a t
1e790 72 69 70 70 65 64 20 63 75 72 73 6f 72 20 77 69  ripped cursor wi
1e7a0 6c 6c 20 72 65 73 75 6c 74 20 69 6e 20 61 6e 20  ll result in an 
1e7b0 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  error..**.** Thi
1e7c0 73 20 77 69 6c 6c 20 72 65 6c 65 61 73 65 20 74  s will release t
1e7d0 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e  he write lock on
1e7e0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1e7f0 6c 65 2e 20 20 49 66 20 74 68 65 72 65 0a 2a 2a  le.  If there.**
1e800 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20 63   are no active c
1e810 75 72 73 6f 72 73 2c 20 69 74 20 61 6c 73 6f 20  ursors, it also 
1e820 72 65 6c 65 61 73 65 73 20 74 68 65 20 72 65 61  releases the rea
1e830 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73  d lock..*/.int s
1e840 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62  qlite3BtreeRollb
1e850 61 63 6b 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  ack(Btree *p, in
1e860 74 20 74 72 69 70 43 6f 64 65 2c 20 69 6e 74 20  t tripCode, int 
1e870 77 72 69 74 65 4f 6e 6c 79 29 7b 0a 20 20 69 6e  writeOnly){.  in
1e880 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72 65 64  t rc;.  BtShared
1e890 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
1e8a0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
1e8b0 31 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 77 72  1;..  assert( wr
1e8c0 69 74 65 4f 6e 6c 79 3d 3d 31 20 7c 7c 20 77 72  iteOnly==1 || wr
1e8d0 69 74 65 4f 6e 6c 79 3d 3d 30 20 29 3b 0a 20 20  iteOnly==0 );.  
1e8e0 61 73 73 65 72 74 28 20 74 72 69 70 43 6f 64 65  assert( tripCode
1e8f0 3d 3d 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52  ==SQLITE_ABORT_R
1e900 4f 4c 4c 42 41 43 4b 20 7c 7c 20 74 72 69 70 43  OLLBACK || tripC
1e910 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  ode==SQLITE_OK )
1e920 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
1e930 45 6e 74 65 72 28 70 29 3b 0a 20 20 69 66 28 20  Enter(p);.  if( 
1e940 74 72 69 70 43 6f 64 65 3d 3d 53 51 4c 49 54 45  tripCode==SQLITE
1e950 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
1e960 74 72 69 70 43 6f 64 65 20 3d 20 73 61 76 65 41  tripCode = saveA
1e970 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20 30  llCursors(pBt, 0
1e980 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 0);.    if( rc
1e990 20 29 20 77 72 69 74 65 4f 6e 6c 79 20 3d 20 30   ) writeOnly = 0
1e9a0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
1e9b0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1e9c0 20 7d 0a 20 20 69 66 28 20 74 72 69 70 43 6f 64   }.  if( tripCod
1e9d0 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 32  e ){.    int rc2
1e9e0 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 54   = sqlite3BtreeT
1e9f0 72 69 70 41 6c 6c 43 75 72 73 6f 72 73 28 70 2c  ripAllCursors(p,
1ea00 20 74 72 69 70 43 6f 64 65 2c 20 77 72 69 74 65   tripCode, write
1ea10 4f 6e 6c 79 29 3b 0a 20 20 20 20 61 73 73 65 72  Only);.    asser
1ea20 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc==SQLITE_OK
1ea30 20 7c 7c 20 28 77 72 69 74 65 4f 6e 6c 79 3d 3d   || (writeOnly==
1ea40 30 20 26 26 20 72 63 32 3d 3d 53 51 4c 49 54 45  0 && rc2==SQLITE
1ea50 5f 4f 4b 29 20 29 3b 0a 20 20 20 20 69 66 28 20  _OK) );.    if( 
1ea60 72 63 32 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  rc2!=SQLITE_OK )
1ea70 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 7d 0a 20   rc = rc2;.  }. 
1ea80 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28   btreeIntegrity(
1ea90 70 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 69 6e  p);..  if( p->in
1eaa0 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49  Trans==TRANS_WRI
1eab0 54 45 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63  TE ){.    int rc
1eac0 32 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  2;..    assert( 
1ead0 54 52 41 4e 53 5f 57 52 49 54 45 3d 3d 70 42 74  TRANS_WRITE==pBt
1eae0 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20  ->inTransaction 
1eaf0 29 3b 0a 20 20 20 20 72 63 32 20 3d 20 73 71 6c  );.    rc2 = sql
1eb00 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63  ite3PagerRollbac
1eb10 6b 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a  k(pBt->pPager);.
1eb20 20 20 20 20 69 66 28 20 72 63 32 21 3d 53 51 4c      if( rc2!=SQL
1eb30 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1eb40 72 63 20 3d 20 72 63 32 3b 0a 20 20 20 20 7d 0a  rc = rc2;.    }.
1eb50 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 6f 6c 6c  .    /* The roll
1eb60 62 61 63 6b 20 6d 61 79 20 68 61 76 65 20 64 65  back may have de
1eb70 73 74 72 6f 79 65 64 20 74 68 65 20 70 50 61 67  stroyed the pPag
1eb80 65 31 2d 3e 61 44 61 74 61 20 76 61 6c 75 65 2e  e1->aData value.
1eb90 20 20 53 6f 0a 20 20 20 20 2a 2a 20 63 61 6c 6c    So.    ** call
1eba0 20 62 74 72 65 65 47 65 74 50 61 67 65 28 29 20   btreeGetPage() 
1ebb0 6f 6e 20 70 61 67 65 20 31 20 61 67 61 69 6e 20  on page 1 again 
1ebc0 74 6f 20 6d 61 6b 65 0a 20 20 20 20 2a 2a 20 73  to make.    ** s
1ebd0 75 72 65 20 70 50 61 67 65 31 2d 3e 61 44 61 74  ure pPage1->aDat
1ebe0 61 20 69 73 20 73 65 74 20 63 6f 72 72 65 63 74  a is set correct
1ebf0 6c 79 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 62  ly. */.    if( b
1ec00 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
1ec10 20 31 2c 20 26 70 50 61 67 65 31 2c 20 30 29 3d   1, &pPage1, 0)=
1ec20 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1ec30 20 20 20 20 69 6e 74 20 6e 50 61 67 65 20 3d 20      int nPage = 
1ec40 67 65 74 34 62 79 74 65 28 32 38 2b 28 75 38 2a  get4byte(28+(u8*
1ec50 29 70 50 61 67 65 31 2d 3e 61 44 61 74 61 29 3b  )pPage1->aData);
1ec60 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1ec70 20 6e 50 61 67 65 3d 3d 30 20 29 3b 0a 20 20 20   nPage==0 );.   
1ec80 20 20 20 69 66 28 20 6e 50 61 67 65 3d 3d 30 20     if( nPage==0 
1ec90 29 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  ) sqlite3PagerPa
1eca0 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61  gecount(pBt->pPa
1ecb0 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20  ger, &nPage);.  
1ecc0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 42      testcase( pB
1ecd0 74 2d 3e 6e 50 61 67 65 21 3d 6e 50 61 67 65 20  t->nPage!=nPage 
1ece0 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 50  );.      pBt->nP
1ecf0 61 67 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 20  age = nPage;.   
1ed00 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
1ed10 50 61 67 65 31 29 3b 0a 20 20 20 20 7d 0a 20 20  Page1);.    }.  
1ed20 20 20 61 73 73 65 72 74 28 20 63 6f 75 6e 74 56    assert( countV
1ed30 61 6c 69 64 43 75 72 73 6f 72 73 28 70 42 74 2c  alidCursors(pBt,
1ed40 20 31 29 3d 3d 30 20 29 3b 0a 20 20 20 20 70 42   1)==0 );.    pB
1ed50 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
1ed60 20 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20   = TRANS_READ;. 
1ed70 20 20 20 62 74 72 65 65 43 6c 65 61 72 48 61 73     btreeClearHas
1ed80 43 6f 6e 74 65 6e 74 28 70 42 74 29 3b 0a 20 20  Content(pBt);.  
1ed90 7d 0a 0a 20 20 62 74 72 65 65 45 6e 64 54 72 61  }..  btreeEndTra
1eda0 6e 73 61 63 74 69 6f 6e 28 70 29 3b 0a 20 20 73  nsaction(p);.  s
1edb0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
1edc0 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
1edd0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 61 72 74  ;.}../*.** Start
1ede0 20 61 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62   a statement sub
1edf0 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65  transaction. The
1ee00 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 20   subtransaction 
1ee10 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64 0a 2a 2a  can be rolled.**
1ee20 20 62 61 63 6b 20 69 6e 64 65 70 65 6e 64 65 6e   back independen
1ee30 74 6c 79 20 6f 66 20 74 68 65 20 6d 61 69 6e 20  tly of the main 
1ee40 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 59 6f 75  transaction. You
1ee50 20 6d 75 73 74 20 73 74 61 72 74 20 61 20 74 72   must start a tr
1ee60 61 6e 73 61 63 74 69 6f 6e 20 0a 2a 2a 20 62 65  ansaction .** be
1ee70 66 6f 72 65 20 73 74 61 72 74 69 6e 67 20 61 20  fore starting a 
1ee80 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  subtransaction. 
1ee90 54 68 65 20 73 75 62 74 72 61 6e 73 61 63 74 69  The subtransacti
1eea0 6f 6e 20 69 73 20 65 6e 64 65 64 20 61 75 74 6f  on is ended auto
1eeb0 6d 61 74 69 63 61 6c 6c 79 20 0a 2a 2a 20 69 66  matically .** if
1eec0 20 74 68 65 20 6d 61 69 6e 20 74 72 61 6e 73 61   the main transa
1eed0 63 74 69 6f 6e 20 63 6f 6d 6d 69 74 73 20 6f 72  ction commits or
1eee0 20 72 6f 6c 6c 73 20 62 61 63 6b 2e 0a 2a 2a 0a   rolls back..**.
1eef0 2a 2a 20 53 74 61 74 65 6d 65 6e 74 20 73 75 62  ** Statement sub
1ef00 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 72 65  transactions are
1ef10 20 75 73 65 64 20 61 72 6f 75 6e 64 20 69 6e 64   used around ind
1ef20 69 76 69 64 75 61 6c 20 53 51 4c 20 73 74 61 74  ividual SQL stat
1ef30 65 6d 65 6e 74 73 0a 2a 2a 20 74 68 61 74 20 61  ements.** that a
1ef40 72 65 20 63 6f 6e 74 61 69 6e 65 64 20 77 69 74  re contained wit
1ef50 68 69 6e 20 61 20 42 45 47 49 4e 2e 2e 2e 43 4f  hin a BEGIN...CO
1ef60 4d 4d 49 54 20 62 6c 6f 63 6b 2e 20 20 49 66 20  MMIT block.  If 
1ef70 61 20 63 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a 20  a constraint.** 
1ef80 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 69 74  error occurs wit
1ef90 68 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e  hin the statemen
1efa0 74 2c 20 74 68 65 20 65 66 66 65 63 74 20 6f 66  t, the effect of
1efb0 20 74 68 61 74 20 6f 6e 65 20 73 74 61 74 65 6d   that one statem
1efc0 65 6e 74 0a 2a 2a 20 63 61 6e 20 62 65 20 72 6f  ent.** can be ro
1efd0 6c 6c 65 64 20 62 61 63 6b 20 77 69 74 68 6f 75  lled back withou
1efe0 74 20 68 61 76 69 6e 67 20 74 6f 20 72 6f 6c 6c  t having to roll
1eff0 62 61 63 6b 20 74 68 65 20 65 6e 74 69 72 65 20  back the entire 
1f000 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a  transaction..**.
1f010 2a 2a 20 41 20 73 74 61 74 65 6d 65 6e 74 20 73  ** A statement s
1f020 75 62 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ub-transaction i
1f030 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73  s implemented as
1f040 20 61 6e 20 61 6e 6f 6e 79 6d 6f 75 73 20 73 61   an anonymous sa
1f050 76 65 70 6f 69 6e 74 2e 20 54 68 65 0a 2a 2a 20  vepoint. The.** 
1f060 76 61 6c 75 65 20 70 61 73 73 65 64 20 61 73 20  value passed as 
1f070 74 68 65 20 73 65 63 6f 6e 64 20 70 61 72 61 6d  the second param
1f080 65 74 65 72 20 69 73 20 74 68 65 20 74 6f 74 61  eter is the tota
1f090 6c 20 6e 75 6d 62 65 72 20 6f 66 20 73 61 76 65  l number of save
1f0a0 70 6f 69 6e 74 73 2c 0a 2a 2a 20 69 6e 63 6c 75  points,.** inclu
1f0b0 64 69 6e 67 20 74 68 65 20 6e 65 77 20 61 6e 6f  ding the new ano
1f0c0 6e 79 6d 6f 75 73 20 73 61 76 65 70 6f 69 6e 74  nymous savepoint
1f0d0 2c 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 42 2d  , open on the B-
1f0e0 54 72 65 65 2e 20 69 2e 65 2e 20 69 66 20 74 68  Tree. i.e. if th
1f0f0 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63  ere.** are no ac
1f100 74 69 76 65 20 73 61 76 65 70 6f 69 6e 74 73 20  tive savepoints 
1f110 61 6e 64 20 6e 6f 20 6f 74 68 65 72 20 73 74 61  and no other sta
1f120 74 65 6d 65 6e 74 2d 74 72 61 6e 73 61 63 74 69  tement-transacti
1f130 6f 6e 73 20 6f 70 65 6e 2c 0a 2a 2a 20 69 53 74  ons open,.** iSt
1f140 61 74 65 6d 65 6e 74 20 69 73 20 31 2e 20 54 68  atement is 1. Th
1f150 69 73 20 61 6e 6f 6e 79 6d 6f 75 73 20 73 61 76  is anonymous sav
1f160 65 70 6f 69 6e 74 20 63 61 6e 20 62 65 20 72 65  epoint can be re
1f170 6c 65 61 73 65 64 20 6f 72 20 72 6f 6c 6c 65 64  leased or rolled
1f180 20 62 61 63 6b 0a 2a 2a 20 75 73 69 6e 67 20 74   back.** using t
1f190 68 65 20 73 71 6c 69 74 65 33 42 74 72 65 65 53  he sqlite3BtreeS
1f1a0 61 76 65 70 6f 69 6e 74 28 29 20 66 75 6e 63 74  avepoint() funct
1f1b0 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ion..*/.int sqli
1f1c0 74 65 33 42 74 72 65 65 42 65 67 69 6e 53 74 6d  te3BtreeBeginStm
1f1d0 74 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  t(Btree *p, int 
1f1e0 69 53 74 61 74 65 6d 65 6e 74 29 7b 0a 20 20 69  iStatement){.  i
1f1f0 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72 65  nt rc;.  BtShare
1f200 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
1f210 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
1f220 6e 74 65 72 28 70 29 3b 0a 20 20 61 73 73 65 72  nter(p);.  asser
1f230 74 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  t( p->inTrans==T
1f240 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20  RANS_WRITE );.  
1f250 61 73 73 65 72 74 28 20 28 70 42 74 2d 3e 62 74  assert( (pBt->bt
1f260 73 46 6c 61 67 73 20 26 20 42 54 53 5f 52 45 41  sFlags & BTS_REA
1f270 44 5f 4f 4e 4c 59 29 3d 3d 30 20 29 3b 0a 20 20  D_ONLY)==0 );.  
1f280 61 73 73 65 72 74 28 20 69 53 74 61 74 65 6d 65  assert( iStateme
1f290 6e 74 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74  nt>0 );.  assert
1f2a0 28 20 69 53 74 61 74 65 6d 65 6e 74 3e 70 2d 3e  ( iStatement>p->
1f2b0 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20 29  db->nSavepoint )
1f2c0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ;.  assert( pBt-
1f2d0 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d  >inTransaction==
1f2e0 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20  TRANS_WRITE );. 
1f2f0 20 2f 2a 20 41 74 20 74 68 65 20 70 61 67 65 72   /* At the pager
1f300 20 6c 65 76 65 6c 2c 20 61 20 73 74 61 74 65 6d   level, a statem
1f310 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
1f320 69 73 20 61 20 73 61 76 65 70 6f 69 6e 74 20 77  is a savepoint w
1f330 69 74 68 0a 20 20 2a 2a 20 61 6e 20 69 6e 64 65  ith.  ** an inde
1f340 78 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 61  x greater than a
1f350 6c 6c 20 73 61 76 65 70 6f 69 6e 74 73 20 63 72  ll savepoints cr
1f360 65 61 74 65 64 20 65 78 70 6c 69 63 69 74 6c 79  eated explicitly
1f370 20 75 73 69 6e 67 0a 20 20 2a 2a 20 53 51 4c 20   using.  ** SQL 
1f380 73 74 61 74 65 6d 65 6e 74 73 2e 20 49 74 20 69  statements. It i
1f390 73 20 69 6c 6c 65 67 61 6c 20 74 6f 20 6f 70 65  s illegal to ope
1f3a0 6e 2c 20 72 65 6c 65 61 73 65 20 6f 72 20 72 6f  n, release or ro
1f3b0 6c 6c 62 61 63 6b 20 61 6e 79 0a 20 20 2a 2a 20  llback any.  ** 
1f3c0 73 75 63 68 20 73 61 76 65 70 6f 69 6e 74 73 20  such savepoints 
1f3d0 77 68 69 6c 65 20 74 68 65 20 73 74 61 74 65 6d  while the statem
1f3e0 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
1f3f0 73 61 76 65 70 6f 69 6e 74 20 69 73 20 61 63 74  savepoint is act
1f400 69 76 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d  ive..  */.  rc =
1f410 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65   sqlite3PagerOpe
1f420 6e 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2d 3e  nSavepoint(pBt->
1f430 70 50 61 67 65 72 2c 20 69 53 74 61 74 65 6d 65  pPager, iStateme
1f440 6e 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  nt);.  sqlite3Bt
1f450 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
1f460 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1f470 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72  ** The second ar
1f480 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66  gument to this f
1f490 75 6e 63 74 69 6f 6e 2c 20 6f 70 2c 20 69 73 20  unction, op, is 
1f4a0 61 6c 77 61 79 73 20 53 41 56 45 50 4f 49 4e 54  always SAVEPOINT
1f4b0 5f 52 4f 4c 4c 42 41 43 4b 0a 2a 2a 20 6f 72 20  _ROLLBACK.** or 
1f4c0 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53  SAVEPOINT_RELEAS
1f4d0 45 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  E. This function
1f4e0 20 65 69 74 68 65 72 20 72 65 6c 65 61 73 65 73   either releases
1f4f0 20 6f 72 20 72 6f 6c 6c 73 20 62 61 63 6b 20 74   or rolls back t
1f500 68 65 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 20  he.** savepoint 
1f510 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 70 61  identified by pa
1f520 72 61 6d 65 74 65 72 20 69 53 61 76 65 70 6f 69  rameter iSavepoi
1f530 6e 74 2c 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e  nt, depending on
1f540 20 74 68 65 20 76 61 6c 75 65 20 0a 2a 2a 20 6f   the value .** o
1f550 66 20 6f 70 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d  f op..**.** Norm
1f560 61 6c 6c 79 2c 20 69 53 61 76 65 70 6f 69 6e 74  ally, iSavepoint
1f570 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
1f580 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a 65 72   or equal to zer
1f590 6f 2e 20 48 6f 77 65 76 65 72 2c 20 69 66 20 6f  o. However, if o
1f5a0 70 20 69 73 0a 2a 2a 20 53 41 56 45 50 4f 49 4e  p is.** SAVEPOIN
1f5b0 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 74 68 65 6e  T_ROLLBACK, then
1f5c0 20 69 53 61 76 65 70 6f 69 6e 74 20 6d 61 79 20   iSavepoint may 
1f5d0 61 6c 73 6f 20 62 65 20 2d 31 2e 20 49 6e 20 74  also be -1. In t
1f5e0 68 69 73 20 63 61 73 65 20 74 68 65 20 0a 2a 2a  his case the .**
1f5f0 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
1f600 20 65 6e 74 69 72 65 20 74 72 61 6e 73 61 63 74   entire transact
1f610 69 6f 6e 20 61 72 65 20 72 6f 6c 6c 65 64 20 62  ion are rolled b
1f620 61 63 6b 2e 20 54 68 69 73 20 69 73 20 64 69 66  ack. This is dif
1f630 66 65 72 65 6e 74 0a 2a 2a 20 66 72 6f 6d 20 61  ferent.** from a
1f640 20 6e 6f 72 6d 61 6c 20 74 72 61 6e 73 61 63 74   normal transact
1f650 69 6f 6e 20 72 6f 6c 6c 62 61 63 6b 2c 20 61 73  ion rollback, as
1f660 20 6e 6f 20 6c 6f 63 6b 73 20 61 72 65 20 72 65   no locks are re
1f670 6c 65 61 73 65 64 20 61 6e 64 20 74 68 65 0a 2a  leased and the.*
1f680 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 72 65  * transaction re
1f690 6d 61 69 6e 73 20 6f 70 65 6e 2e 0a 2a 2f 0a 69  mains open..*/.i
1f6a0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53  nt sqlite3BtreeS
1f6b0 61 76 65 70 6f 69 6e 74 28 42 74 72 65 65 20 2a  avepoint(Btree *
1f6c0 70 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20 69  p, int op, int i
1f6d0 53 61 76 65 70 6f 69 6e 74 29 7b 0a 20 20 69 6e  Savepoint){.  in
1f6e0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
1f6f0 3b 0a 20 20 69 66 28 20 70 20 26 26 20 70 2d 3e  ;.  if( p && p->
1f700 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57  inTrans==TRANS_W
1f710 52 49 54 45 20 29 7b 0a 20 20 20 20 42 74 53 68  RITE ){.    BtSh
1f720 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
1f730 42 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  Bt;.    assert( 
1f740 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45  op==SAVEPOINT_RE
1f750 4c 45 41 53 45 20 7c 7c 20 6f 70 3d 3d 53 41 56  LEASE || op==SAV
1f760 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20  EPOINT_ROLLBACK 
1f770 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  );.    assert( i
1f780 53 61 76 65 70 6f 69 6e 74 3e 3d 30 20 7c 7c 20  Savepoint>=0 || 
1f790 28 69 53 61 76 65 70 6f 69 6e 74 3d 3d 2d 31 20  (iSavepoint==-1 
1f7a0 26 26 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54  && op==SAVEPOINT
1f7b0 5f 52 4f 4c 4c 42 41 43 4b 29 20 29 3b 0a 20 20  _ROLLBACK) );.  
1f7c0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
1f7d0 74 65 72 28 70 29 3b 0a 20 20 20 20 72 63 20 3d  ter(p);.    rc =
1f7e0 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 61 76   sqlite3PagerSav
1f7f0 65 70 6f 69 6e 74 28 70 42 74 2d 3e 70 50 61 67  epoint(pBt->pPag
1f800 65 72 2c 20 6f 70 2c 20 69 53 61 76 65 70 6f 69  er, op, iSavepoi
1f810 6e 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  nt);.    if( rc=
1f820 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1f830 20 20 20 20 69 66 28 20 69 53 61 76 65 70 6f 69      if( iSavepoi
1f840 6e 74 3c 30 20 26 26 20 28 70 42 74 2d 3e 62 74  nt<0 && (pBt->bt
1f850 73 46 6c 61 67 73 20 26 20 42 54 53 5f 49 4e 49  sFlags & BTS_INI
1f860 54 49 41 4c 4c 59 5f 45 4d 50 54 59 29 21 3d 30  TIALLY_EMPTY)!=0
1f870 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42 74 2d   ){.        pBt-
1f880 3e 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20  >nPage = 0;.    
1f890 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 6e    }.      rc = n
1f8a0 65 77 44 61 74 61 62 61 73 65 28 70 42 74 29 3b  ewDatabase(pBt);
1f8b0 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 50 61 67  .      pBt->nPag
1f8c0 65 20 3d 20 67 65 74 34 62 79 74 65 28 32 38 20  e = get4byte(28 
1f8d0 2b 20 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  + pBt->pPage1->a
1f8e0 44 61 74 61 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  Data);..      /*
1f8f0 20 54 68 65 20 64 61 74 61 62 61 73 65 20 73 69   The database si
1f900 7a 65 20 77 61 73 20 77 72 69 74 74 65 6e 20 69  ze was written i
1f910 6e 74 6f 20 74 68 65 20 6f 66 66 73 65 74 20 32  nto the offset 2
1f920 38 20 6f 66 20 74 68 65 20 68 65 61 64 65 72 0a  8 of the header.
1f930 20 20 20 20 20 20 2a 2a 20 77 68 65 6e 20 74 68        ** when th
1f940 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 74  e transaction st
1f950 61 72 74 65 64 2c 20 73 6f 20 77 65 20 6b 6e 6f  arted, so we kno
1f960 77 20 74 68 61 74 20 74 68 65 20 76 61 6c 75 65  w that the value
1f970 20 61 74 20 6f 66 66 73 65 74 0a 20 20 20 20 20   at offset.     
1f980 20 2a 2a 20 32 38 20 69 73 20 6e 6f 6e 7a 65 72   ** 28 is nonzer
1f990 6f 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65  o. */.      asse
1f9a0 72 74 28 20 70 42 74 2d 3e 6e 50 61 67 65 3e 30  rt( pBt->nPage>0
1f9b0 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71   );.    }.    sq
1f9c0 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
1f9d0 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  p);.  }.  return
1f9e0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72   rc;.}../*.** Cr
1f9f0 65 61 74 65 20 61 20 6e 65 77 20 63 75 72 73 6f  eate a new curso
1fa00 72 20 66 6f 72 20 74 68 65 20 42 54 72 65 65 20  r for the BTree 
1fa10 77 68 6f 73 65 20 72 6f 6f 74 20 69 73 20 6f 6e  whose root is on
1fa20 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 69 54 61   the page.** iTa
1fa30 62 6c 65 2e 20 49 66 20 61 20 72 65 61 64 2d 6f  ble. If a read-o
1fa40 6e 6c 79 20 63 75 72 73 6f 72 20 69 73 20 72 65  nly cursor is re
1fa50 71 75 65 73 74 65 64 2c 20 69 74 20 69 73 20 61  quested, it is a
1fa60 73 73 75 6d 65 64 20 74 68 61 74 0a 2a 2a 20 74  ssumed that.** t
1fa70 68 65 20 63 61 6c 6c 65 72 20 61 6c 72 65 61 64  he caller alread
1fa80 79 20 68 61 73 20 61 74 20 6c 65 61 73 74 20 61  y has at least a
1fa90 20 72 65 61 64 2d 6f 6e 6c 79 20 74 72 61 6e 73   read-only trans
1faa0 61 63 74 69 6f 6e 20 6f 70 65 6e 0a 2a 2a 20 6f  action open.** o
1fab0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61  n the database a
1fac0 6c 72 65 61 64 79 2e 20 49 66 20 61 20 77 72 69  lready. If a wri
1fad0 74 65 2d 63 75 72 73 6f 72 20 69 73 20 72 65 71  te-cursor is req
1fae0 75 65 73 74 65 64 2c 20 74 68 65 6e 0a 2a 2a 20  uested, then.** 
1faf0 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20 61 73  the caller is as
1fb00 73 75 6d 65 64 20 74 6f 20 68 61 76 65 20 61 6e  sumed to have an
1fb10 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61 6e   open write tran
1fb20 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49  saction..**.** I
1fb30 66 20 77 72 46 6c 61 67 3d 3d 30 2c 20 74 68 65  f wrFlag==0, the
1fb40 6e 20 74 68 65 20 63 75 72 73 6f 72 20 63 61 6e  n the cursor can
1fb50 20 6f 6e 6c 79 20 62 65 20 75 73 65 64 20 66 6f   only be used fo
1fb60 72 20 72 65 61 64 69 6e 67 2e 0a 2a 2a 20 49 66  r reading..** If
1fb70 20 77 72 46 6c 61 67 3d 3d 31 2c 20 74 68 65 6e   wrFlag==1, then
1fb80 20 74 68 65 20 63 75 72 73 6f 72 20 63 61 6e 20   the cursor can 
1fb90 62 65 20 75 73 65 64 20 66 6f 72 20 72 65 61 64  be used for read
1fba0 69 6e 67 20 6f 72 20 66 6f 72 0a 2a 2a 20 77 72  ing or for.** wr
1fbb0 69 74 69 6e 67 20 69 66 20 6f 74 68 65 72 20 63  iting if other c
1fbc0 6f 6e 64 69 74 69 6f 6e 73 20 66 6f 72 20 77 72  onditions for wr
1fbd0 69 74 69 6e 67 20 61 72 65 20 61 6c 73 6f 20 6d  iting are also m
1fbe0 65 74 2e 20 20 54 68 65 73 65 0a 2a 2a 20 61 72  et.  These.** ar
1fbf0 65 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 73  e the conditions
1fc00 20 74 68 61 74 20 6d 75 73 74 20 62 65 20 6d 65   that must be me
1fc10 74 20 69 6e 20 6f 72 64 65 72 20 66 6f 72 20 77  t in order for w
1fc20 72 69 74 69 6e 67 20 74 6f 0a 2a 2a 20 62 65 20  riting to.** be 
1fc30 61 6c 6c 6f 77 65 64 3a 0a 2a 2a 0a 2a 2a 20 31  allowed:.**.** 1
1fc40 3a 20 20 54 68 65 20 63 75 72 73 6f 72 20 6d 75  :  The cursor mu
1fc50 73 74 20 68 61 76 65 20 62 65 65 6e 20 6f 70 65  st have been ope
1fc60 6e 65 64 20 77 69 74 68 20 77 72 46 6c 61 67 3d  ned with wrFlag=
1fc70 3d 31 0a 2a 2a 0a 2a 2a 20 32 3a 20 20 4f 74 68  =1.**.** 2:  Oth
1fc80 65 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  er database conn
1fc90 65 63 74 69 6f 6e 73 20 74 68 61 74 20 73 68 61  ections that sha
1fca0 72 65 20 74 68 65 20 73 61 6d 65 20 70 61 67 65  re the same page
1fcb0 72 20 63 61 63 68 65 0a 2a 2a 20 20 20 20 20 62  r cache.**     b
1fcc0 75 74 20 77 68 69 63 68 20 61 72 65 20 6e 6f 74  ut which are not
1fcd0 20 69 6e 20 74 68 65 20 52 45 41 44 5f 55 4e 43   in the READ_UNC
1fce0 4f 4d 4d 49 54 54 45 44 20 73 74 61 74 65 20 6d  OMMITTED state m
1fcf0 61 79 20 6e 6f 74 20 68 61 76 65 0a 2a 2a 20 20  ay not have.**  
1fd00 20 20 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20     cursors open 
1fd10 77 69 74 68 20 77 72 46 6c 61 67 3d 3d 30 20 6f  with wrFlag==0 o
1fd20 6e 20 74 68 65 20 73 61 6d 65 20 74 61 62 6c 65  n the same table
1fd30 2e 20 20 4f 74 68 65 72 77 69 73 65 0a 2a 2a 20  .  Otherwise.** 
1fd40 20 20 20 20 74 68 65 20 63 68 61 6e 67 65 73 20      the changes 
1fd50 6d 61 64 65 20 62 79 20 74 68 69 73 20 77 72 69  made by this wri
1fd60 74 65 20 63 75 72 73 6f 72 20 77 6f 75 6c 64 20  te cursor would 
1fd70 62 65 20 76 69 73 69 62 6c 65 20 74 6f 0a 2a 2a  be visible to.**
1fd80 20 20 20 20 20 74 68 65 20 72 65 61 64 20 63 75       the read cu
1fd90 72 73 6f 72 73 20 69 6e 20 74 68 65 20 6f 74 68  rsors in the oth
1fda0 65 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  er database conn
1fdb0 65 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 33 3a  ection..**.** 3:
1fdc0 20 20 54 68 65 20 64 61 74 61 62 61 73 65 20 6d    The database m
1fdd0 75 73 74 20 62 65 20 77 72 69 74 61 62 6c 65 20  ust be writable 
1fde0 28 6e 6f 74 20 6f 6e 20 72 65 61 64 2d 6f 6e 6c  (not on read-onl
1fdf0 79 20 6d 65 64 69 61 29 0a 2a 2a 0a 2a 2a 20 34  y media).**.** 4
1fe00 3a 20 20 54 68 65 72 65 20 6d 75 73 74 20 62 65  :  There must be
1fe10 20 61 6e 20 61 63 74 69 76 65 20 74 72 61 6e 73   an active trans
1fe20 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 4e 6f  action..**.** No
1fe30 20 63 68 65 63 6b 69 6e 67 20 69 73 20 64 6f 6e   checking is don
1fe40 65 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74  e to make sure t
1fe50 68 61 74 20 70 61 67 65 20 69 54 61 62 6c 65 20  hat page iTable 
1fe60 72 65 61 6c 6c 79 20 69 73 20 74 68 65 0a 2a 2a  really is the.**
1fe70 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 61 20   root page of a 
1fe80 62 2d 74 72 65 65 2e 20 20 49 66 20 69 74 20 69  b-tree.  If it i
1fe90 73 20 6e 6f 74 2c 20 74 68 65 6e 20 74 68 65 20  s not, then the 
1fea0 63 75 72 73 6f 72 20 61 63 71 75 69 72 65 64 0a  cursor acquired.
1feb0 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 77 6f 72 6b  ** will not work
1fec0 20 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2a 0a 2a   correctly..**.*
1fed0 2a 20 49 74 20 69 73 20 61 73 73 75 6d 65 64 20  * It is assumed 
1fee0 74 68 61 74 20 74 68 65 20 73 71 6c 69 74 65 33  that the sqlite3
1fef0 42 74 72 65 65 43 75 72 73 6f 72 5a 65 72 6f 28  BtreeCursorZero(
1ff00 29 20 68 61 73 20 62 65 65 6e 20 63 61 6c 6c 65  ) has been calle
1ff10 64 0a 2a 2a 20 6f 6e 20 70 43 75 72 20 74 6f 20  d.** on pCur to 
1ff20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6d  initialize the m
1ff30 65 6d 6f 72 79 20 73 70 61 63 65 20 70 72 69 6f  emory space prio
1ff40 72 20 74 6f 20 69 6e 76 6f 6b 69 6e 67 20 74 68  r to invoking th
1ff50 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 73  is routine..*/.s
1ff60 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 43  tatic int btreeC
1ff70 75 72 73 6f 72 28 0a 20 20 42 74 72 65 65 20 2a  ursor(.  Btree *
1ff80 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
1ff90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ffa0 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a  /* The btree */.
1ffb0 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20    int iTable,   
1ffc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ffd0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74           /* Root
1ffe0 20 70 61 67 65 20 6f 66 20 74 61 62 6c 65 20 74   page of table t
1fff0 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20  o open */.  int 
20000 77 72 46 6c 61 67 2c 20 20 20 20 20 20 20 20 20  wrFlag,         
20010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20020 20 20 20 2f 2a 20 31 20 74 6f 20 77 72 69 74 65     /* 1 to write
20030 2e 20 30 20 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f  . 0 read-only */
20040 0a 20 20 73 74 72 75 63 74 20 4b 65 79 49 6e 66  .  struct KeyInf
20050 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20  o *pKeyInfo,    
20060 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
20070 73 74 20 61 72 67 20 74 6f 20 63 6f 6d 70 61 72  st arg to compar
20080 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  ison function */
20090 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
200a0 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r               
200b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61            /* Spa
200c0 63 65 20 66 6f 72 20 6e 65 77 20 63 75 72 73 6f  ce for new curso
200d0 72 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68 61 72  r */.){.  BtShar
200e0 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
200f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
20100 20 2f 2a 20 53 68 61 72 65 64 20 62 2d 74 72 65   /* Shared b-tre
20110 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 0a 20 20 61  e handle */..  a
20120 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74  ssert( sqlite3Bt
20130 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29  reeHoldsMutex(p)
20140 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 77 72   );.  assert( wr
20150 46 6c 61 67 3d 3d 30 20 7c 7c 20 77 72 46 6c 61  Flag==0 || wrFla
20160 67 3d 3d 31 20 29 3b 0a 0a 20 20 2f 2a 20 54 68  g==1 );..  /* Th
20170 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65  e following asse
20180 72 74 20 73 74 61 74 65 6d 65 6e 74 73 20 76 65  rt statements ve
20190 72 69 66 79 20 74 68 61 74 20 69 66 20 74 68 69  rify that if thi
201a0 73 20 69 73 20 61 20 73 68 61 72 61 62 6c 65 20  s is a sharable 
201b0 0a 20 20 2a 2a 20 62 2d 74 72 65 65 20 64 61 74  .  ** b-tree dat
201c0 61 62 61 73 65 2c 20 74 68 65 20 63 6f 6e 6e 65  abase, the conne
201d0 63 74 69 6f 6e 20 69 73 20 68 6f 6c 64 69 6e 67  ction is holding
201e0 20 74 68 65 20 72 65 71 75 69 72 65 64 20 74 61   the required ta
201f0 62 6c 65 20 6c 6f 63 6b 73 2c 20 0a 20 20 2a 2a  ble locks, .  **
20200 20 61 6e 64 20 74 68 61 74 20 6e 6f 20 6f 74 68   and that no oth
20210 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61  er connection ha
20220 73 20 61 6e 79 20 6f 70 65 6e 20 63 75 72 73 6f  s any open curso
20230 72 20 74 68 61 74 20 63 6f 6e 66 6c 69 63 74 73  r that conflicts
20240 20 77 69 74 68 20 0a 20 20 2a 2a 20 74 68 69 73   with .  ** this
20250 20 6c 6f 63 6b 2e 20 20 2a 2f 0a 20 20 61 73 73   lock.  */.  ass
20260 65 72 74 28 20 68 61 73 53 68 61 72 65 64 43 61  ert( hasSharedCa
20270 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20  cheTableLock(p, 
20280 69 54 61 62 6c 65 2c 20 70 4b 65 79 49 6e 66 6f  iTable, pKeyInfo
20290 21 3d 30 2c 20 77 72 46 6c 61 67 2b 31 29 20 29  !=0, wrFlag+1) )
202a0 3b 0a 20 20 61 73 73 65 72 74 28 20 77 72 46 6c  ;.  assert( wrFl
202b0 61 67 3d 3d 30 20 7c 7c 20 21 68 61 73 52 65 61  ag==0 || !hasRea
202c0 64 43 6f 6e 66 6c 69 63 74 73 28 70 2c 20 69 54  dConflicts(p, iT
202d0 61 62 6c 65 29 20 29 3b 0a 0a 20 20 2f 2a 20 41  able) );..  /* A
202e0 73 73 65 72 74 20 74 68 61 74 20 74 68 65 20 63  ssert that the c
202f0 61 6c 6c 65 72 20 68 61 73 20 6f 70 65 6e 65 64  aller has opened
20300 20 74 68 65 20 72 65 71 75 69 72 65 64 20 74 72   the required tr
20310 61 6e 73 61 63 74 69 6f 6e 2e 20 2a 2f 0a 20 20  ansaction. */.  
20320 61 73 73 65 72 74 28 20 70 2d 3e 69 6e 54 72 61  assert( p->inTra
20330 6e 73 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 3b  ns>TRANS_NONE );
20340 0a 20 20 61 73 73 65 72 74 28 20 77 72 46 6c 61  .  assert( wrFla
20350 67 3d 3d 30 20 7c 7c 20 70 2d 3e 69 6e 54 72 61  g==0 || p->inTra
20360 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  ns==TRANS_WRITE 
20370 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  );.  assert( pBt
20380 2d 3e 70 50 61 67 65 31 20 26 26 20 70 42 74 2d  ->pPage1 && pBt-
20390 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20 29  >pPage1->aData )
203a0 3b 0a 0a 20 20 69 66 28 20 4e 45 56 45 52 28 77  ;..  if( NEVER(w
203b0 72 46 6c 61 67 20 26 26 20 28 70 42 74 2d 3e 62  rFlag && (pBt->b
203c0 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 52 45  tsFlags & BTS_RE
203d0 41 44 5f 4f 4e 4c 59 29 21 3d 30 29 20 29 7b 0a  AD_ONLY)!=0) ){.
203e0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
203f0 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d 0a  E_READONLY;.  }.
20400 20 20 69 66 28 20 77 72 46 6c 61 67 20 29 7b 0a    if( wrFlag ){.
20410 20 20 20 20 61 6c 6c 6f 63 61 74 65 54 65 6d 70      allocateTemp
20420 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20 20 20  Space(pBt);.    
20430 69 66 28 20 70 42 74 2d 3e 70 54 6d 70 53 70 61  if( pBt->pTmpSpa
20440 63 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  ce==0 ) return S
20450 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
20460 0a 20 20 69 66 28 20 69 54 61 62 6c 65 3d 3d 31  .  if( iTable==1
20470 20 26 26 20 62 74 72 65 65 50 61 67 65 63 6f 75   && btreePagecou
20480 6e 74 28 70 42 74 29 3d 3d 30 20 29 7b 0a 20 20  nt(pBt)==0 ){.  
20490 20 20 61 73 73 65 72 74 28 20 77 72 46 6c 61 67    assert( wrFlag
204a0 3d 3d 30 20 29 3b 0a 20 20 20 20 69 54 61 62 6c  ==0 );.    iTabl
204b0 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  e = 0;.  }..  /*
204c0 20 4e 6f 77 20 74 68 61 74 20 6e 6f 20 6f 74 68   Now that no oth
204d0 65 72 20 65 72 72 6f 72 73 20 63 61 6e 20 6f 63  er errors can oc
204e0 63 75 72 2c 20 66 69 6e 69 73 68 20 66 69 6c 6c  cur, finish fill
204f0 69 6e 67 20 69 6e 20 74 68 65 20 42 74 43 75 72  ing in the BtCur
20500 73 6f 72 0a 20 20 2a 2a 20 76 61 72 69 61 62 6c  sor.  ** variabl
20510 65 73 20 61 6e 64 20 6c 69 6e 6b 20 74 68 65 20  es and link the 
20520 63 75 72 73 6f 72 20 69 6e 74 6f 20 74 68 65 20  cursor into the 
20530 42 74 53 68 61 72 65 64 20 6c 69 73 74 2e 20 20  BtShared list.  
20540 2a 2f 0a 20 20 70 43 75 72 2d 3e 70 67 6e 6f 52  */.  pCur->pgnoR
20550 6f 6f 74 20 3d 20 28 50 67 6e 6f 29 69 54 61 62  oot = (Pgno)iTab
20560 6c 65 3b 0a 20 20 70 43 75 72 2d 3e 69 50 61 67  le;.  pCur->iPag
20570 65 20 3d 20 2d 31 3b 0a 20 20 70 43 75 72 2d 3e  e = -1;.  pCur->
20580 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4b 65 79 49  pKeyInfo = pKeyI
20590 6e 66 6f 3b 0a 20 20 70 43 75 72 2d 3e 70 42 74  nfo;.  pCur->pBt
205a0 72 65 65 20 3d 20 70 3b 0a 20 20 70 43 75 72 2d  ree = p;.  pCur-
205b0 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 61 73  >pBt = pBt;.  as
205c0 73 65 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20  sert( wrFlag==0 
205d0 7c 7c 20 77 72 46 6c 61 67 3d 3d 42 54 43 46 5f  || wrFlag==BTCF_
205e0 57 72 69 74 65 46 6c 61 67 20 29 3b 0a 20 20 70  WriteFlag );.  p
205f0 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 3d 20  Cur->curFlags = 
20600 77 72 46 6c 61 67 3b 0a 20 20 70 43 75 72 2d 3e  wrFlag;.  pCur->
20610 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70 43 75  pNext = pBt->pCu
20620 72 73 6f 72 3b 0a 20 20 69 66 28 20 70 43 75 72  rsor;.  if( pCur
20630 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 70  ->pNext ){.    p
20640 43 75 72 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65  Cur->pNext->pPre
20650 76 20 3d 20 70 43 75 72 3b 0a 20 20 7d 0a 20 20  v = pCur;.  }.  
20660 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20 70  pBt->pCursor = p
20670 43 75 72 3b 0a 20 20 70 43 75 72 2d 3e 65 53 74  Cur;.  pCur->eSt
20680 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56  ate = CURSOR_INV
20690 41 4c 49 44 3b 0a 20 20 72 65 74 75 72 6e 20 53  ALID;.  return S
206a0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 69 6e 74 20  QLITE_OK;.}.int 
206b0 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
206c0 6f 72 28 0a 20 20 42 74 72 65 65 20 2a 70 2c 20  or(.  Btree *p, 
206d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
206e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
206f0 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a    /* The btree *
20700 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20  /.  int iTable, 
20710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20730 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20  /* Root page of 
20740 74 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f  table to open */
20750 0a 20 20 69 6e 74 20 77 72 46 6c 61 67 2c 20 20  .  int wrFlag,  
20760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
20780 2a 20 31 20 74 6f 20 77 72 69 74 65 2e 20 30 20  * 1 to write. 0 
20790 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73  read-only */.  s
207a0 74 72 75 63 74 20 4b 65 79 49 6e 66 6f 20 2a 70  truct KeyInfo *p
207b0 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20 20 20 20  KeyInfo,        
207c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
207d0 72 73 74 20 61 72 67 20 74 6f 20 78 43 6f 6d 70  rst arg to xComp
207e0 61 72 65 28 29 20 2a 2f 0a 20 20 42 74 43 75 72  are() */.  BtCur
207f0 73 6f 72 20 2a 70 43 75 72 20 20 20 20 20 20 20  sor *pCur       
20800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20810 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
20820 6e 65 77 20 63 75 72 73 6f 72 20 68 65 72 65 20  new cursor here 
20830 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  */.){.  int rc;.
20840 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
20850 74 65 72 28 70 29 3b 0a 20 20 72 63 20 3d 20 62  ter(p);.  rc = b
20860 74 72 65 65 43 75 72 73 6f 72 28 70 2c 20 69 54  treeCursor(p, iT
20870 61 62 6c 65 2c 20 77 72 46 6c 61 67 2c 20 70 4b  able, wrFlag, pK
20880 65 79 49 6e 66 6f 2c 20 70 43 75 72 29 3b 0a 20  eyInfo, pCur);. 
20890 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
208a0 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
208b0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
208c0 75 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20  urn the size of 
208d0 61 20 42 74 43 75 72 73 6f 72 20 6f 62 6a 65 63  a BtCursor objec
208e0 74 20 69 6e 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a  t in bytes..**.*
208f0 2a 20 54 68 69 73 20 69 6e 74 65 72 66 61 63 65  * This interface
20900 73 20 69 73 20 6e 65 65 64 65 64 20 73 6f 20 74  s is needed so t
20910 68 61 74 20 75 73 65 72 73 20 6f 66 20 63 75 72  hat users of cur
20920 73 6f 72 73 20 63 61 6e 20 70 72 65 61 6c 6c 6f  sors can preallo
20930 63 61 74 65 0a 2a 2a 20 73 75 66 66 69 63 69 65  cate.** sufficie
20940 6e 74 20 73 74 6f 72 61 67 65 20 74 6f 20 68 6f  nt storage to ho
20950 6c 64 20 61 20 63 75 72 73 6f 72 2e 20 20 54 68  ld a cursor.  Th
20960 65 20 42 74 43 75 72 73 6f 72 20 6f 62 6a 65 63  e BtCursor objec
20970 74 20 69 73 20 6f 70 61 71 75 65 0a 2a 2a 20 74  t is opaque.** t
20980 6f 20 75 73 65 72 73 20 73 6f 20 74 68 65 79 20  o users so they 
20990 63 61 6e 6e 6f 74 20 64 6f 20 74 68 65 20 73 69  cannot do the si
209a0 7a 65 6f 66 28 29 20 74 68 65 6d 73 65 6c 76 65  zeof() themselve
209b0 73 20 2d 20 74 68 65 79 20 6d 75 73 74 20 63 61  s - they must ca
209c0 6c 6c 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69  ll.** this routi
209d0 6e 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ne..*/.int sqlit
209e0 65 33 42 74 72 65 65 43 75 72 73 6f 72 53 69 7a  e3BtreeCursorSiz
209f0 65 28 76 6f 69 64 29 7b 0a 20 20 72 65 74 75 72  e(void){.  retur
20a00 6e 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28  n ROUND8(sizeof(
20a10 42 74 43 75 72 73 6f 72 29 29 3b 0a 7d 0a 0a 2f  BtCursor));.}../
20a20 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20  *.** Initialize 
20a30 6d 65 6d 6f 72 79 20 74 68 61 74 20 77 69 6c 6c  memory that will
20a40 20 62 65 20 63 6f 6e 76 65 72 74 65 64 20 69 6e   be converted in
20a50 74 6f 20 61 20 42 74 43 75 72 73 6f 72 20 6f 62  to a BtCursor ob
20a60 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ject..**.** The 
20a70 73 69 6d 70 6c 65 20 61 70 70 72 6f 61 63 68 20  simple approach 
20a80 68 65 72 65 20 77 6f 75 6c 64 20 62 65 20 74 6f  here would be to
20a90 20 6d 65 6d 73 65 74 28 29 20 74 68 65 20 65 6e   memset() the en
20aa0 74 69 72 65 20 6f 62 6a 65 63 74 0a 2a 2a 20 74  tire object.** t
20ab0 6f 20 7a 65 72 6f 2e 20 20 42 75 74 20 69 74 20  o zero.  But it 
20ac0 74 75 72 6e 73 20 6f 75 74 20 74 68 61 74 20 74  turns out that t
20ad0 68 65 20 61 70 50 61 67 65 5b 5d 20 61 6e 64 20  he apPage[] and 
20ae0 61 69 49 64 78 5b 5d 20 61 72 72 61 79 73 0a 2a  aiIdx[] arrays.*
20af0 2a 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f  * do not need to
20b00 20 62 65 20 7a 65 72 6f 65 64 20 61 6e 64 20 74   be zeroed and t
20b10 68 65 79 20 61 72 65 20 6c 61 72 67 65 2c 20 73  hey are large, s
20b20 6f 20 77 65 20 63 61 6e 20 73 61 76 65 20 61 20  o we can save a 
20b30 6c 6f 74 0a 2a 2a 20 6f 66 20 72 75 6e 2d 74 69  lot.** of run-ti
20b40 6d 65 20 62 79 20 73 6b 69 70 70 69 6e 67 20 74  me by skipping t
20b50 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f  he initializatio
20b60 6e 20 6f 66 20 74 68 6f 73 65 20 65 6c 65 6d 65  n of those eleme
20b70 6e 74 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  nts..*/.void sql
20b80 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 5a  ite3BtreeCursorZ
20b90 65 72 6f 28 42 74 43 75 72 73 6f 72 20 2a 70 29  ero(BtCursor *p)
20ba0 7b 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c  {.  memset(p, 0,
20bb0 20 6f 66 66 73 65 74 6f 66 28 42 74 43 75 72 73   offsetof(BtCurs
20bc0 6f 72 2c 20 69 50 61 67 65 29 29 3b 0a 7d 0a 0a  or, iPage));.}..
20bd0 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 63 75  /*.** Close a cu
20be0 72 73 6f 72 2e 20 20 54 68 65 20 72 65 61 64 20  rsor.  The read 
20bf0 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
20c00 62 61 73 65 20 66 69 6c 65 20 69 73 20 72 65 6c  base file is rel
20c10 65 61 73 65 64 0a 2a 2a 20 77 68 65 6e 20 74 68  eased.** when th
20c20 65 20 6c 61 73 74 20 63 75 72 73 6f 72 20 69 73  e last cursor is
20c30 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 69 6e 74 20   closed..*/.int 
20c40 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73  sqlite3BtreeClos
20c50 65 43 75 72 73 6f 72 28 42 74 43 75 72 73 6f 72  eCursor(BtCursor
20c60 20 2a 70 43 75 72 29 7b 0a 20 20 42 74 72 65 65   *pCur){.  Btree
20c70 20 2a 70 42 74 72 65 65 20 3d 20 70 43 75 72 2d   *pBtree = pCur-
20c80 3e 70 42 74 72 65 65 3b 0a 20 20 69 66 28 20 70  >pBtree;.  if( p
20c90 42 74 72 65 65 20 29 7b 0a 20 20 20 20 69 6e 74  Btree ){.    int
20ca0 20 69 3b 0a 20 20 20 20 42 74 53 68 61 72 65 64   i;.    BtShared
20cb0 20 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e 70 42   *pBt = pCur->pB
20cc0 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  t;.    sqlite3Bt
20cd0 72 65 65 45 6e 74 65 72 28 70 42 74 72 65 65 29  reeEnter(pBtree)
20ce0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  ;.    sqlite3Btr
20cf0 65 65 43 6c 65 61 72 43 75 72 73 6f 72 28 70 43  eeClearCursor(pC
20d00 75 72 29 3b 0a 20 20 20 20 69 66 28 20 70 43 75  ur);.    if( pCu
20d10 72 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20 20 20  r->pPrev ){.    
20d20 20 20 70 43 75 72 2d 3e 70 50 72 65 76 2d 3e 70    pCur->pPrev->p
20d30 4e 65 78 74 20 3d 20 70 43 75 72 2d 3e 70 4e 65  Next = pCur->pNe
20d40 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  xt;.    }else{. 
20d50 20 20 20 20 20 70 42 74 2d 3e 70 43 75 72 73 6f       pBt->pCurso
20d60 72 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b  r = pCur->pNext;
20d70 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
20d80 43 75 72 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20  Cur->pNext ){.  
20d90 20 20 20 20 70 43 75 72 2d 3e 70 4e 65 78 74 2d      pCur->pNext-
20da0 3e 70 50 72 65 76 20 3d 20 70 43 75 72 2d 3e 70  >pPrev = pCur->p
20db0 50 72 65 76 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Prev;.    }.    
20dc0 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 43 75 72  for(i=0; i<=pCur
20dd0 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20  ->iPage; i++){. 
20de0 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
20df0 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d  (pCur->apPage[i]
20e00 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 75 6e 6c  );.    }.    unl
20e10 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64  ockBtreeIfUnused
20e20 28 70 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  (pBt);.    sqlit
20e30 65 33 5f 66 72 65 65 28 70 43 75 72 2d 3e 61 4f  e3_free(pCur->aO
20e40 76 65 72 66 6c 6f 77 29 3b 0a 20 20 20 20 2f 2a  verflow);.    /*
20e50 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43   sqlite3_free(pC
20e60 75 72 29 3b 20 2a 2f 0a 20 20 20 20 73 71 6c 69  ur); */.    sqli
20e70 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 42  te3BtreeLeave(pB
20e80 74 72 65 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74  tree);.  }.  ret
20e90 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
20ea0 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72  ../*.** Make sur
20eb0 65 20 74 68 65 20 42 74 43 75 72 73 6f 72 2a 20  e the BtCursor* 
20ec0 67 69 76 65 6e 20 69 6e 20 74 68 65 20 61 72 67  given in the arg
20ed0 75 6d 65 6e 74 20 68 61 73 20 61 20 76 61 6c 69  ument has a vali
20ee0 64 0a 2a 2a 20 42 74 43 75 72 73 6f 72 2e 69 6e  d.** BtCursor.in
20ef0 66 6f 20 73 74 72 75 63 74 75 72 65 2e 20 20 49  fo structure.  I
20f00 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65  f it is not alre
20f10 61 64 79 20 76 61 6c 69 64 2c 20 63 61 6c 6c 0a  ady valid, call.
20f20 2a 2a 20 62 74 72 65 65 50 61 72 73 65 43 65 6c  ** btreeParseCel
20f30 6c 28 29 20 74 6f 20 66 69 6c 6c 20 69 74 20 69  l() to fill it i
20f40 6e 2e 0a 2a 2a 0a 2a 2a 20 42 74 43 75 72 73 6f  n..**.** BtCurso
20f50 72 2e 69 6e 66 6f 20 69 73 20 61 20 63 61 63 68  r.info is a cach
20f60 65 20 6f 66 20 74 68 65 20 69 6e 66 6f 72 6d 61  e of the informa
20f70 74 69 6f 6e 20 69 6e 20 74 68 65 20 63 75 72 72  tion in the curr
20f80 65 6e 74 20 63 65 6c 6c 2e 0a 2a 2a 20 55 73 69  ent cell..** Usi
20f90 6e 67 20 74 68 69 73 20 63 61 63 68 65 20 72 65  ng this cache re
20fa0 64 75 63 65 73 20 74 68 65 20 6e 75 6d 62 65 72  duces the number
20fb0 20 6f 66 20 63 61 6c 6c 73 20 74 6f 20 62 74 72   of calls to btr
20fc0 65 65 50 61 72 73 65 43 65 6c 6c 28 29 2e 0a 2a  eeParseCell()..*
20fd0 2a 0a 2a 2a 20 32 30 30 37 2d 30 36 2d 32 35 3a  *.** 2007-06-25:
20fe0 20 20 54 68 65 72 65 20 69 73 20 61 20 62 75 67    There is a bug
20ff0 20 69 6e 20 73 6f 6d 65 20 76 65 72 73 69 6f 6e   in some version
21000 73 20 6f 66 20 4d 53 56 43 20 74 68 61 74 20 63  s of MSVC that c
21010 61 75 73 65 20 74 68 65 0a 2a 2a 20 63 6f 6d 70  ause the.** comp
21020 69 6c 65 72 20 74 6f 20 63 72 61 73 68 20 77 68  iler to crash wh
21030 65 6e 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 29  en getCellInfo()
21040 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20   is implemented 
21050 61 73 20 61 20 6d 61 63 72 6f 2e 0a 2a 2a 20 42  as a macro..** B
21060 75 74 20 74 68 65 72 65 20 69 73 20 61 20 6d 65  ut there is a me
21070 61 73 75 72 65 61 62 6c 65 20 73 70 65 65 64 20  asureable speed 
21080 61 64 76 61 6e 74 61 67 65 20 74 6f 20 75 73 69  advantage to usi
21090 6e 67 20 74 68 65 20 6d 61 63 72 6f 20 6f 6e 20  ng the macro on 
210a0 67 63 63 0a 2a 2a 20 28 77 68 65 6e 20 6c 65 73  gcc.** (when les
210b0 73 20 63 6f 6d 70 69 6c 65 72 20 6f 70 74 69 6d  s compiler optim
210c0 69 7a 61 74 69 6f 6e 73 20 6c 69 6b 65 20 2d 4f  izations like -O
210d0 73 20 6f 72 20 2d 4f 30 20 61 72 65 20 75 73 65  s or -O0 are use
210e0 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20 63 6f 6d  d and the.** com
210f0 70 69 6c 65 72 20 69 73 20 6e 6f 74 20 64 6f 69  piler is not doi
21100 6e 67 20 61 67 67 72 65 73 73 69 76 65 20 69 6e  ng aggressive in
21110 6c 69 6e 69 6e 67 2e 29 20 20 53 6f 20 77 65 20  lining.)  So we 
21120 75 73 65 20 61 20 72 65 61 6c 20 66 75 6e 63 74  use a real funct
21130 69 6f 6e 0a 2a 2a 20 66 6f 72 20 4d 53 56 43 20  ion.** for MSVC 
21140 61 6e 64 20 61 20 6d 61 63 72 6f 20 66 6f 72 20  and a macro for 
21150 65 76 65 72 79 74 68 69 6e 67 20 65 6c 73 65 2e  everything else.
21160 20 20 54 69 63 6b 65 74 20 23 32 34 35 37 2e 0a    Ticket #2457..
21170 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  */.#ifndef NDEBU
21180 47 0a 20 20 73 74 61 74 69 63 20 76 6f 69 64 20  G.  static void 
21190 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28 42  assertCellInfo(B
211a0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
211b0 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66      CellInfo inf
211c0 6f 3b 0a 20 20 20 20 69 6e 74 20 69 50 61 67 65  o;.    int iPage
211d0 20 3d 20 70 43 75 72 2d 3e 69 50 61 67 65 3b 0a   = pCur->iPage;.
211e0 20 20 20 20 6d 65 6d 73 65 74 28 26 69 6e 66 6f      memset(&info
211f0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 69 6e 66 6f  , 0, sizeof(info
21200 29 29 3b 0a 20 20 20 20 62 74 72 65 65 50 61 72  ));.    btreePar
21210 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e 61 70 50  seCell(pCur->apP
21220 61 67 65 5b 69 50 61 67 65 5d 2c 20 70 43 75 72  age[iPage], pCur
21230 2d 3e 61 69 49 64 78 5b 69 50 61 67 65 5d 2c 20  ->aiIdx[iPage], 
21240 26 69 6e 66 6f 29 3b 0a 20 20 20 20 61 73 73 65  &info);.    asse
21250 72 74 28 20 43 4f 52 52 55 50 54 5f 44 42 20 7c  rt( CORRUPT_DB |
21260 7c 20 6d 65 6d 63 6d 70 28 26 69 6e 66 6f 2c 20  | memcmp(&info, 
21270 26 70 43 75 72 2d 3e 69 6e 66 6f 2c 20 73 69 7a  &pCur->info, siz
21280 65 6f 66 28 69 6e 66 6f 29 29 3d 3d 30 20 29 3b  eof(info))==0 );
21290 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 23 64 65  .  }.#else.  #de
212a0 66 69 6e 65 20 61 73 73 65 72 74 43 65 6c 6c 49  fine assertCellI
212b0 6e 66 6f 28 78 29 0a 23 65 6e 64 69 66 0a 23 69  nfo(x).#endif.#i
212c0 66 64 65 66 20 5f 4d 53 43 5f 56 45 52 0a 20 20  fdef _MSC_VER.  
212d0 2f 2a 20 55 73 65 20 61 20 72 65 61 6c 20 66 75  /* Use a real fu
212e0 6e 63 74 69 6f 6e 20 69 6e 20 4d 53 56 43 20 74  nction in MSVC t
212f0 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 62 75  o work around bu
21300 67 73 20 69 6e 20 74 68 61 74 20 63 6f 6d 70 69  gs in that compi
21310 6c 65 72 2e 20 2a 2f 0a 20 20 73 74 61 74 69 63  ler. */.  static
21320 20 76 6f 69 64 20 67 65 74 43 65 6c 6c 49 6e 66   void getCellInf
21330 6f 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  o(BtCursor *pCur
21340 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d  ){.    if( pCur-
21350 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29  >info.nSize==0 )
21360 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 50 61 67  {.      int iPag
21370 65 20 3d 20 70 43 75 72 2d 3e 69 50 61 67 65 3b  e = pCur->iPage;
21380 0a 20 20 20 20 20 20 62 74 72 65 65 50 61 72 73  .      btreePars
21390 65 43 65 6c 6c 28 70 43 75 72 2d 3e 61 70 50 61  eCell(pCur->apPa
213a0 67 65 5b 69 50 61 67 65 5d 2c 70 43 75 72 2d 3e  ge[iPage],pCur->
213b0 61 69 49 64 78 5b 69 50 61 67 65 5d 2c 26 70 43  aiIdx[iPage],&pC
213c0 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20 20 20 20 20  ur->info);.     
213d0 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20   pCur->curFlags 
213e0 7c 3d 20 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65  |= BTCF_ValidNKe
213f0 79 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  y;.    }else{.  
21400 20 20 20 20 61 73 73 65 72 74 43 65 6c 6c 49 6e      assertCellIn
21410 66 6f 28 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a  fo(pCur);.    }.
21420 20 20 7d 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20    }.#else /* if 
21430 6e 6f 74 20 5f 4d 53 43 5f 56 45 52 20 2a 2f 0a  not _MSC_VER */.
21440 20 20 2f 2a 20 55 73 65 20 61 20 6d 61 63 72 6f    /* Use a macro
21450 20 69 6e 20 61 6c 6c 20 6f 74 68 65 72 20 63 6f   in all other co
21460 6d 70 69 6c 65 72 73 20 73 6f 20 74 68 61 74 20  mpilers so that 
21470 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  the function is 
21480 69 6e 6c 69 6e 65 64 20 2a 2f 0a 23 64 65 66 69  inlined */.#defi
21490 6e 65 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70  ne getCellInfo(p
214a0 43 75 72 29 20 20 20 20 20 20 20 20 20 20 20 20  Cur)            
214b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
214c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
214d0 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 69 66            \.  if
214e0 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69  ( pCur->info.nSi
214f0 7a 65 3d 3d 30 20 29 7b 20 20 20 20 20 20 20 20  ze==0 ){        
21500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21520 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
21530 20 69 6e 74 20 69 50 61 67 65 20 3d 20 70 43 75   int iPage = pCu
21540 72 2d 3e 69 50 61 67 65 3b 20 20 20 20 20 20 20  r->iPage;       
21550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21570 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
21580 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c    btreeParseCell
21590 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 50  (pCur->apPage[iP
215a0 61 67 65 5d 2c 70 43 75 72 2d 3e 61 69 49 64 78  age],pCur->aiIdx
215b0 5b 69 50 61 67 65 5d 2c 26 70 43 75 72 2d 3e 69  [iPage],&pCur->i
215c0 6e 66 6f 29 3b 20 20 20 20 20 20 20 20 5c 0a 20  nfo);        \. 
215d0 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67     pCur->curFlag
215e0 73 20 7c 3d 20 42 54 43 46 5f 56 61 6c 69 64 4e  s |= BTCF_ValidN
215f0 4b 65 79 3b 20 20 20 20 20 20 20 20 20 20 20 20  Key;            
21600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
21620 20 20 7d 65 6c 73 65 7b 20 20 20 20 20 20 20 20    }else{        
21630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
21670 0a 20 20 20 20 61 73 73 65 72 74 43 65 6c 6c 49  .    assertCellI
21680 6e 66 6f 28 70 43 75 72 29 3b 20 20 20 20 20 20  nfo(pCur);      
21690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
216a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
216b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
216c0 5c 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  \.  }.#endif /* 
216d0 5f 4d 53 43 5f 56 45 52 20 2a 2f 0a 0a 23 69 66  _MSC_VER */..#if
216e0 6e 64 65 66 20 4e 44 45 42 55 47 20 20 2f 2a 20  ndef NDEBUG  /* 
216f0 54 68 65 20 6e 65 78 74 20 72 6f 75 74 69 6e 65  The next routine
21700 20 75 73 65 64 20 6f 6e 6c 79 20 77 69 74 68 69   used only withi
21710 6e 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65  n assert() state
21720 6d 65 6e 74 73 20 2a 2f 0a 2f 2a 0a 2a 2a 20 52  ments */./*.** R
21730 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68  eturn true if th
21740 65 20 67 69 76 65 6e 20 42 74 43 75 72 73 6f 72  e given BtCursor
21750 20 69 73 20 76 61 6c 69 64 2e 20 20 41 20 76 61   is valid.  A va
21760 6c 69 64 20 63 75 72 73 6f 72 20 69 73 20 6f 6e  lid cursor is on
21770 65 0a 2a 2a 20 74 68 61 74 20 69 73 20 63 75 72  e.** that is cur
21780 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 20  rently pointing 
21790 74 6f 20 61 20 72 6f 77 20 69 6e 20 61 20 28 6e  to a row in a (n
217a0 6f 6e 2d 65 6d 70 74 79 29 20 74 61 62 6c 65 2e  on-empty) table.
217b0 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20 76 65  .** This is a ve
217c0 72 69 66 69 63 61 74 69 6f 6e 20 72 6f 75 74 69  rification routi
217d0 6e 65 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20  ne is used only 
217e0 77 69 74 68 69 6e 20 61 73 73 65 72 74 28 29 20  within assert() 
217f0 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 69  statements..*/.i
21800 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  nt sqlite3BtreeC
21810 75 72 73 6f 72 49 73 56 61 6c 69 64 28 42 74 43  ursorIsValid(BtC
21820 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
21830 72 65 74 75 72 6e 20 70 43 75 72 20 26 26 20 70  return pCur && p
21840 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
21850 53 4f 52 5f 56 41 4c 49 44 3b 0a 7d 0a 23 65 6e  SOR_VALID;.}.#en
21860 64 69 66 20 2f 2a 20 4e 44 45 42 55 47 20 2a 2f  dif /* NDEBUG */
21870 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 2a 70 53 69  ../*.** Set *pSi
21880 7a 65 20 74 6f 20 74 68 65 20 73 69 7a 65 20 6f  ze to the size o
21890 66 20 74 68 65 20 62 75 66 66 65 72 20 6e 65 65  f the buffer nee
218a0 64 65 64 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ded to hold the 
218b0 76 61 6c 75 65 20 6f 66 0a 2a 2a 20 74 68 65 20  value of.** the 
218c0 6b 65 79 20 66 6f 72 20 74 68 65 20 63 75 72 72  key for the curr
218d0 65 6e 74 20 65 6e 74 72 79 2e 20 20 49 66 20 74  ent entry.  If t
218e0 68 65 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74  he cursor is not
218f0 20 70 6f 69 6e 74 69 6e 67 0a 2a 2a 20 74 6f 20   pointing.** to 
21900 61 20 76 61 6c 69 64 20 65 6e 74 72 79 2c 20 2a  a valid entry, *
21910 70 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20  pSize is set to 
21920 30 2e 20 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 20  0. .**.** For a 
21930 74 61 62 6c 65 20 77 69 74 68 20 74 68 65 20 49  table with the I
21940 4e 54 4b 45 59 20 66 6c 61 67 20 73 65 74 2c 20  NTKEY flag set, 
21950 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  this routine ret
21960 75 72 6e 73 20 74 68 65 20 6b 65 79 0a 2a 2a 20  urns the key.** 
21970 69 74 73 65 6c 66 2c 20 6e 6f 74 20 74 68 65 20  itself, not the 
21980 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
21990 69 6e 20 74 68 65 20 6b 65 79 2e 0a 2a 2a 0a 2a  in the key..**.*
219a0 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73  * The caller mus
219b0 74 20 70 6f 73 69 74 69 6f 6e 20 74 68 65 20 63  t position the c
219c0 75 72 73 6f 72 20 70 72 69 6f 72 20 74 6f 20 69  ursor prior to i
219d0 6e 76 6f 6b 69 6e 67 20 74 68 69 73 20 72 6f 75  nvoking this rou
219e0 74 69 6e 65 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 69  tine..** .** Thi
219f0 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 6e 6f 74  s routine cannot
21a00 20 66 61 69 6c 2e 20 20 49 74 20 61 6c 77 61 79   fail.  It alway
21a10 73 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45  s returns SQLITE
21a20 5f 4f 4b 2e 20 20 0a 2a 2f 0a 69 6e 74 20 73 71  _OK.  .*/.int sq
21a30 6c 69 74 65 33 42 74 72 65 65 4b 65 79 53 69 7a  lite3BtreeKeySiz
21a40 65 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  e(BtCursor *pCur
21a50 2c 20 69 36 34 20 2a 70 53 69 7a 65 29 7b 0a 20  , i64 *pSize){. 
21a60 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
21a70 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
21a80 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
21a90 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
21aa0 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 67 65 74  R_VALID );.  get
21ab0 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a  CellInfo(pCur);.
21ac0 20 20 2a 70 53 69 7a 65 20 3d 20 70 43 75 72 2d    *pSize = pCur-
21ad0 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 72 65  >info.nKey;.  re
21ae0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
21af0 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 2a 70 53  }../*.** Set *pS
21b00 69 7a 65 20 74 6f 20 74 68 65 20 6e 75 6d 62 65  ize to the numbe
21b10 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 64 61  r of bytes of da
21b20 74 61 20 69 6e 20 74 68 65 20 65 6e 74 72 79 20  ta in the entry 
21b30 74 68 65 0a 2a 2a 20 63 75 72 73 6f 72 20 63 75  the.** cursor cu
21b40 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74  rrently points t
21b50 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c  o..**.** The cal
21b60 6c 65 72 20 6d 75 73 74 20 67 75 61 72 61 6e 74  ler must guarant
21b70 65 65 20 74 68 61 74 20 74 68 65 20 63 75 72 73  ee that the curs
21b80 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74  or is pointing t
21b90 6f 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 0a 2a 2a 20  o a non-NULL.** 
21ba0 76 61 6c 69 64 20 65 6e 74 72 79 2e 20 20 49 6e  valid entry.  In
21bb0 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 74 68   other words, th
21bc0 65 20 63 61 6c 6c 69 6e 67 20 70 72 6f 63 65 64  e calling proced
21bd0 75 72 65 20 6d 75 73 74 20 67 75 61 72 61 6e 74  ure must guarant
21be0 65 65 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 63  ee.** that the c
21bf0 75 72 73 6f 72 20 68 61 73 20 43 75 72 73 6f 72  ursor has Cursor
21c00 2e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  .eState==CURSOR_
21c10 56 41 4c 49 44 2e 0a 2a 2a 0a 2a 2a 20 46 61 69  VALID..**.** Fai
21c20 6c 75 72 65 20 69 73 20 6e 6f 74 20 70 6f 73 73  lure is not poss
21c30 69 62 6c 65 2e 20 20 54 68 69 73 20 66 75 6e 63  ible.  This func
21c40 74 69 6f 6e 20 61 6c 77 61 79 73 20 72 65 74 75  tion always retu
21c50 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a  rns SQLITE_OK..*
21c60 2a 20 49 74 20 6d 69 67 68 74 20 6a 75 73 74 20  * It might just 
21c70 61 73 20 77 65 6c 6c 20 62 65 20 61 20 70 72 6f  as well be a pro
21c80 63 65 64 75 72 65 20 28 72 65 74 75 72 6e 69 6e  cedure (returnin
21c90 67 20 76 6f 69 64 29 20 62 75 74 20 77 65 20 63  g void) but we c
21ca0 6f 6e 74 69 6e 75 65 0a 2a 2a 20 74 6f 20 72 65  ontinue.** to re
21cb0 74 75 72 6e 20 61 6e 20 69 6e 74 65 67 65 72 20  turn an integer 
21cc0 72 65 73 75 6c 74 20 63 6f 64 65 20 66 6f 72 20  result code for 
21cd0 68 69 73 74 6f 72 69 63 61 6c 20 72 65 61 73 6f  historical reaso
21ce0 6e 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ns..*/.int sqlit
21cf0 65 33 42 74 72 65 65 44 61 74 61 53 69 7a 65 28  e3BtreeDataSize(
21d00 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
21d10 75 33 32 20 2a 70 53 69 7a 65 29 7b 0a 20 20 61  u32 *pSize){.  a
21d20 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
21d30 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
21d40 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
21d50 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
21d60 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72  VALID );.  asser
21d70 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d  t( pCur->iPage>=
21d80 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
21d90 43 75 72 2d 3e 69 50 61 67 65 3c 42 54 43 55 52  Cur->iPage<BTCUR
21da0 53 4f 52 5f 4d 41 58 5f 44 45 50 54 48 20 29 3b  SOR_MAX_DEPTH );
21db0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
21dc0 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
21dd0 61 67 65 5d 2d 3e 69 6e 74 4b 65 79 4c 65 61 66  age]->intKeyLeaf
21de0 3d 3d 31 20 29 3b 0a 20 20 67 65 74 43 65 6c 6c  ==1 );.  getCell
21df0 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 2a 70  Info(pCur);.  *p
21e00 53 69 7a 65 20 3d 20 70 43 75 72 2d 3e 69 6e 66  Size = pCur->inf
21e10 6f 2e 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 72 65  o.nPayload;.  re
21e20 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
21e30 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74  }../*.** Given t
21e40 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  he page number o
21e50 66 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  f an overflow pa
21e60 67 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ge in the databa
21e70 73 65 20 28 70 61 72 61 6d 65 74 65 72 0a 2a 2a  se (parameter.**
21e80 20 6f 76 66 6c 29 2c 20 74 68 69 73 20 66 75 6e   ovfl), this fun
21e90 63 74 69 6f 6e 20 66 69 6e 64 73 20 74 68 65 20  ction finds the 
21ea0 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  page number of t
21eb0 68 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20  he next page in 
21ec0 74 68 65 20 0a 2a 2a 20 6c 69 6e 6b 65 64 20 6c  the .** linked l
21ed0 69 73 74 20 6f 66 20 6f 76 65 72 66 6c 6f 77 20  ist of overflow 
21ee0 70 61 67 65 73 2e 20 49 66 20 70 6f 73 73 69 62  pages. If possib
21ef0 6c 65 2c 20 69 74 20 75 73 65 73 20 74 68 65 20  le, it uses the 
21f00 61 75 74 6f 2d 76 61 63 75 75 6d 0a 2a 2a 20 70  auto-vacuum.** p
21f10 6f 69 6e 74 65 72 2d 6d 61 70 20 64 61 74 61 20  ointer-map data 
21f20 69 6e 73 74 65 61 64 20 6f 66 20 72 65 61 64 69  instead of readi
21f30 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  ng the content o
21f40 66 20 70 61 67 65 20 6f 76 66 6c 20 74 6f 20 64  f page ovfl to d
21f50 6f 20 73 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  o so. .**.** If 
21f60 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
21f70 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
21f80 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
21f90 2e 20 4f 74 68 65 72 77 69 73 65 3a 0a 2a 2a 0a  . Otherwise:.**.
21fa0 2a 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62  ** The page numb
21fb0 65 72 20 6f 66 20 74 68 65 20 6e 65 78 74 20 6f  er of the next o
21fc0 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 20  verflow page in 
21fd0 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  the linked list 
21fe0 69 73 20 0a 2a 2a 20 77 72 69 74 74 65 6e 20 74  is .** written t
21ff0 6f 20 2a 70 50 67 6e 6f 4e 65 78 74 2e 20 49 66  o *pPgnoNext. If
22000 20 70 61 67 65 20 6f 76 66 6c 20 69 73 20 74 68   page ovfl is th
22010 65 20 6c 61 73 74 20 70 61 67 65 20 69 6e 20 69  e last page in i
22020 74 73 20 6c 69 6e 6b 65 64 20 0a 2a 2a 20 6c 69  ts linked .** li
22030 73 74 2c 20 2a 70 50 67 6e 6f 4e 65 78 74 20 69  st, *pPgnoNext i
22040 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 0a  s set to zero. .
22050 2a 2a 0a 2a 2a 20 49 66 20 70 70 50 61 67 65 20  **.** If ppPage 
22060 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 61 6e 64  is not NULL, and
22070 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
22080 74 68 65 20 4d 65 6d 50 61 67 65 20 6f 62 6a 65  the MemPage obje
22090 63 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  ct corresponding
220a0 0a 2a 2a 20 74 6f 20 70 61 67 65 20 6e 75 6d 62  .** to page numb
220b0 65 72 20 70 4f 76 66 6c 20 77 61 73 20 6f 62 74  er pOvfl was obt
220c0 61 69 6e 65 64 2c 20 74 68 65 6e 20 2a 70 70 50  ained, then *ppP
220d0 61 67 65 20 69 73 20 73 65 74 20 74 6f 20 70 6f  age is set to po
220e0 69 6e 74 20 74 6f 20 74 68 61 74 0a 2a 2a 20 72  int to that.** r
220f0 65 66 65 72 65 6e 63 65 2e 20 49 74 20 69 73 20  eference. It is 
22100 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69  the responsibili
22110 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72  ty of the caller
22120 20 74 6f 20 63 61 6c 6c 20 72 65 6c 65 61 73 65   to call release
22130 50 61 67 65 28 29 0a 2a 2a 20 6f 6e 20 2a 70 70  Page().** on *pp
22140 50 61 67 65 20 74 6f 20 66 72 65 65 20 74 68 65  Page to free the
22150 20 72 65 66 65 72 65 6e 63 65 2e 20 49 6e 20 6e   reference. In n
22160 6f 20 72 65 66 65 72 65 6e 63 65 20 77 61 73 20  o reference was 
22170 6f 62 74 61 69 6e 65 64 20 28 62 65 63 61 75 73  obtained (becaus
22180 65 0a 2a 2a 20 74 68 65 20 70 6f 69 6e 74 65 72  e.** the pointer
22190 2d 6d 61 70 20 77 61 73 20 75 73 65 64 20 74 6f  -map was used to
221a0 20 6f 62 74 61 69 6e 20 74 68 65 20 76 61 6c 75   obtain the valu
221b0 65 20 66 6f 72 20 2a 70 50 67 6e 6f 4e 65 78 74  e for *pPgnoNext
221c0 29 2c 20 74 68 65 6e 0a 2a 2a 20 2a 70 70 50 61  ), then.** *ppPa
221d0 67 65 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72  ge is set to zer
221e0 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  o..*/.static int
221f0 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65   getOverflowPage
22200 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  (.  BtShared *pB
22210 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
22220 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
22230 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20   file */.  Pgno 
22240 6f 76 66 6c 2c 20 20 20 20 20 20 20 20 20 20 20  ovfl,           
22250 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
22260 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  nt overflow page
22270 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 4d 65 6d   number */.  Mem
22280 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20  Page **ppPage,  
22290 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
222a0 3a 20 4d 65 6d 50 61 67 65 20 68 61 6e 64 6c 65  : MemPage handle
222b0 20 28 6d 61 79 20 62 65 20 4e 55 4c 4c 29 20 2a   (may be NULL) *
222c0 2f 0a 20 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 4e  /.  Pgno *pPgnoN
222d0 65 78 74 20 20 20 20 20 20 20 20 20 20 20 20 20  ext             
222e0 20 2f 2a 20 4f 55 54 3a 20 4e 65 78 74 20 6f 76   /* OUT: Next ov
222f0 65 72 66 6c 6f 77 20 70 61 67 65 20 6e 75 6d 62  erflow page numb
22300 65 72 20 2a 2f 0a 29 7b 0a 20 20 50 67 6e 6f 20  er */.){.  Pgno 
22310 6e 65 78 74 20 3d 20 30 3b 0a 20 20 4d 65 6d 50  next = 0;.  MemP
22320 61 67 65 20 2a 70 50 61 67 65 20 3d 20 30 3b 0a  age *pPage = 0;.
22330 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
22340 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28  E_OK;..  assert(
22350 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
22360 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
22370 29 3b 0a 20 20 61 73 73 65 72 74 28 70 50 67 6e  );.  assert(pPgn
22380 6f 4e 65 78 74 29 3b 0a 0a 23 69 66 6e 64 65 66  oNext);..#ifndef
22390 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
223a0 4f 56 41 43 55 55 4d 0a 20 20 2f 2a 20 54 72 79  OVACUUM.  /* Try
223b0 20 74 6f 20 66 69 6e 64 20 74 68 65 20 6e 65 78   to find the nex
223c0 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 6f 76  t page in the ov
223d0 65 72 66 6c 6f 77 20 6c 69 73 74 20 75 73 69 6e  erflow list usin
223e0 67 20 74 68 65 0a 20 20 2a 2a 20 61 75 74 6f 76  g the.  ** autov
223f0 61 63 75 75 6d 20 70 6f 69 6e 74 65 72 2d 6d 61  acuum pointer-ma
22400 70 20 70 61 67 65 73 2e 20 47 75 65 73 73 20 74  p pages. Guess t
22410 68 61 74 20 74 68 65 20 6e 65 78 74 20 70 61 67  hat the next pag
22420 65 20 69 6e 20 0a 20 20 2a 2a 20 74 68 65 20 6f  e in .  ** the o
22430 76 65 72 66 6c 6f 77 20 6c 69 73 74 20 69 73 20  verflow list is 
22440 70 61 67 65 20 6e 75 6d 62 65 72 20 28 6f 76 66  page number (ovf
22450 6c 2b 31 29 2e 20 49 66 20 74 68 61 74 20 67 75  l+1). If that gu
22460 65 73 73 20 74 75 72 6e 73 20 0a 20 20 2a 2a 20  ess turns .  ** 
22470 6f 75 74 20 74 6f 20 62 65 20 77 72 6f 6e 67 2c  out to be wrong,
22480 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20 6c 6f   fall back to lo
22490 61 64 69 6e 67 20 74 68 65 20 64 61 74 61 20 6f  ading the data o
224a0 66 20 70 61 67 65 20 0a 20 20 2a 2a 20 6e 75 6d  f page .  ** num
224b0 62 65 72 20 6f 76 66 6c 20 74 6f 20 64 65 74 65  ber ovfl to dete
224c0 72 6d 69 6e 65 20 74 68 65 20 6e 65 78 74 20 70  rmine the next p
224d0 61 67 65 20 6e 75 6d 62 65 72 2e 0a 20 20 2a 2f  age number..  */
224e0 0a 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f  .  if( pBt->auto
224f0 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 50 67  Vacuum ){.    Pg
22500 6e 6f 20 70 67 6e 6f 3b 0a 20 20 20 20 50 67 6e  no pgno;.    Pgn
22510 6f 20 69 47 75 65 73 73 20 3d 20 6f 76 66 6c 2b  o iGuess = ovfl+
22520 31 3b 0a 20 20 20 20 75 38 20 65 54 79 70 65 3b  1;.    u8 eType;
22530 0a 0a 20 20 20 20 77 68 69 6c 65 28 20 50 54 52  ..    while( PTR
22540 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20  MAP_ISPAGE(pBt, 
22550 69 47 75 65 73 73 29 20 7c 7c 20 69 47 75 65 73  iGuess) || iGues
22560 73 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  s==PENDING_BYTE_
22570 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20  PAGE(pBt) ){.   
22580 20 20 20 69 47 75 65 73 73 2b 2b 3b 0a 20 20 20     iGuess++;.   
22590 20 7d 0a 0a 20 20 20 20 69 66 28 20 69 47 75 65   }..    if( iGue
225a0 73 73 3c 3d 62 74 72 65 65 50 61 67 65 63 6f 75  ss<=btreePagecou
225b0 6e 74 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20  nt(pBt) ){.     
225c0 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28   rc = ptrmapGet(
225d0 70 42 74 2c 20 69 47 75 65 73 73 2c 20 26 65 54  pBt, iGuess, &eT
225e0 79 70 65 2c 20 26 70 67 6e 6f 29 3b 0a 20 20 20  ype, &pgno);.   
225f0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
22600 45 5f 4f 4b 20 26 26 20 65 54 79 70 65 3d 3d 50  E_OK && eType==P
22610 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20  TRMAP_OVERFLOW2 
22620 26 26 20 70 67 6e 6f 3d 3d 6f 76 66 6c 20 29 7b  && pgno==ovfl ){
22630 0a 20 20 20 20 20 20 20 20 6e 65 78 74 20 3d 20  .        next = 
22640 69 47 75 65 73 73 3b 0a 20 20 20 20 20 20 20 20  iGuess;.        
22650 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45  rc = SQLITE_DONE
22660 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
22670 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73    }.#endif..  as
22680 73 65 72 74 28 20 6e 65 78 74 3d 3d 30 20 7c 7c  sert( next==0 ||
22690 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc==SQLITE_DONE
226a0 20 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   );.  if( rc==SQ
226b0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
226c0 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65  c = btreeGetPage
226d0 28 70 42 74 2c 20 6f 76 66 6c 2c 20 26 70 50 61  (pBt, ovfl, &pPa
226e0 67 65 2c 20 28 70 70 50 61 67 65 3d 3d 30 29 20  ge, (ppPage==0) 
226f0 3f 20 50 41 47 45 52 5f 47 45 54 5f 52 45 41 44  ? PAGER_GET_READ
22700 4f 4e 4c 59 20 3a 20 30 29 3b 0a 20 20 20 20 61  ONLY : 0);.    a
22710 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
22720 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 3d 3d 30  E_OK || pPage==0
22730 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   );.    if( rc==
22740 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
22750 20 20 20 6e 65 78 74 20 3d 20 67 65 74 34 62 79     next = get4by
22760 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61 29  te(pPage->aData)
22770 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a  ;.    }.  }..  *
22780 70 50 67 6e 6f 4e 65 78 74 20 3d 20 6e 65 78 74  pPgnoNext = next
22790 3b 0a 20 20 69 66 28 20 70 70 50 61 67 65 20 29  ;.  if( ppPage )
227a0 7b 0a 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20  {.    *ppPage = 
227b0 70 50 61 67 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a  pPage;.  }else{.
227c0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
227d0 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 72 65  pPage);.  }.  re
227e0 74 75 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45  turn (rc==SQLITE
227f0 5f 44 4f 4e 45 20 3f 20 53 51 4c 49 54 45 5f 4f  _DONE ? SQLITE_O
22800 4b 20 3a 20 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  K : rc);.}../*.*
22810 2a 20 43 6f 70 79 20 64 61 74 61 20 66 72 6f 6d  * Copy data from
22820 20 61 20 62 75 66 66 65 72 20 74 6f 20 61 20 70   a buffer to a p
22830 61 67 65 2c 20 6f 72 20 66 72 6f 6d 20 61 20 70  age, or from a p
22840 61 67 65 20 74 6f 20 61 20 62 75 66 66 65 72 2e  age to a buffer.
22850 0a 2a 2a 0a 2a 2a 20 70 50 61 79 6c 6f 61 64 20  .**.** pPayload 
22860 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
22870 64 61 74 61 20 73 74 6f 72 65 64 20 6f 6e 20 64  data stored on d
22880 61 74 61 62 61 73 65 20 70 61 67 65 20 70 44 62  atabase page pDb
22890 50 61 67 65 2e 0a 2a 2a 20 49 66 20 61 72 67 75  Page..** If argu
228a0 6d 65 6e 74 20 65 4f 70 20 69 73 20 66 61 6c 73  ment eOp is fals
228b0 65 2c 20 74 68 65 6e 20 6e 42 79 74 65 20 62 79  e, then nByte by
228c0 74 65 73 20 6f 66 20 64 61 74 61 20 61 72 65 20  tes of data are 
228d0 63 6f 70 69 65 64 0a 2a 2a 20 66 72 6f 6d 20 70  copied.** from p
228e0 50 61 79 6c 6f 61 64 20 74 6f 20 74 68 65 20 62  Payload to the b
228f0 75 66 66 65 72 20 70 6f 69 6e 74 65 64 20 61 74  uffer pointed at
22900 20 62 79 20 70 42 75 66 2e 20 49 66 20 65 4f 70   by pBuf. If eOp
22910 20 69 73 20 74 72 75 65 2c 0a 2a 2a 20 74 68 65   is true,.** the
22920 6e 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  n sqlite3PagerWr
22930 69 74 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20  ite() is called 
22940 6f 6e 20 70 44 62 50 61 67 65 20 61 6e 64 20 6e  on pDbPage and n
22950 42 79 74 65 20 62 79 74 65 73 0a 2a 2a 20 6f 66  Byte bytes.** of
22960 20 64 61 74 61 20 61 72 65 20 63 6f 70 69 65 64   data are copied
22970 20 66 72 6f 6d 20 74 68 65 20 62 75 66 66 65 72   from the buffer
22980 20 70 42 75 66 20 74 6f 20 70 50 61 79 6c 6f 61   pBuf to pPayloa
22990 64 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f  d..**.** SQLITE_
229a0 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 6f  OK is returned o
229b0 6e 20 73 75 63 63 65 73 73 2c 20 6f 74 68 65 72  n success, other
229c0 77 69 73 65 20 61 6e 20 65 72 72 6f 72 20 63 6f  wise an error co
229d0 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  de..*/.static in
229e0 74 20 63 6f 70 79 50 61 79 6c 6f 61 64 28 0a 20  t copyPayload(. 
229f0 20 76 6f 69 64 20 2a 70 50 61 79 6c 6f 61 64 2c   void *pPayload,
22a00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
22a10 69 6e 74 65 72 20 74 6f 20 70 61 67 65 20 64 61  inter to page da
22a20 74 61 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42  ta */.  void *pB
22a30 75 66 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  uf,             
22a40 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
22a50 62 75 66 66 65 72 20 2a 2f 0a 20 20 69 6e 74 20  buffer */.  int 
22a60 6e 42 79 74 65 2c 20 20 20 20 20 20 20 20 20 20  nByte,          
22a70 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
22a80 6f 66 20 62 79 74 65 73 20 74 6f 20 63 6f 70 79  of bytes to copy
22a90 20 2a 2f 0a 20 20 69 6e 74 20 65 4f 70 2c 20 20   */.  int eOp,  
22aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22ab0 2f 2a 20 30 20 2d 3e 20 63 6f 70 79 20 66 72 6f  /* 0 -> copy fro
22ac0 6d 20 70 61 67 65 2c 20 31 20 2d 3e 20 63 6f 70  m page, 1 -> cop
22ad0 79 20 74 6f 20 70 61 67 65 20 2a 2f 0a 20 20 44  y to page */.  D
22ae0 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 20 20  bPage *pDbPage  
22af0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
22b00 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70 50 61 79   containing pPay
22b10 6c 6f 61 64 20 2a 2f 0a 29 7b 0a 20 20 69 66 28  load */.){.  if(
22b20 20 65 4f 70 20 29 7b 0a 20 20 20 20 2f 2a 20 43   eOp ){.    /* C
22b30 6f 70 79 20 64 61 74 61 20 66 72 6f 6d 20 62 75  opy data from bu
22b40 66 66 65 72 20 74 6f 20 70 61 67 65 20 28 61 20  ffer to page (a 
22b50 77 72 69 74 65 20 6f 70 65 72 61 74 69 6f 6e 29  write operation)
22b60 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 63 20 3d   */.    int rc =
22b70 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
22b80 74 65 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20  te(pDbPage);.   
22b90 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
22ba0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  OK ){.      retu
22bb0 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
22bc0 20 6d 65 6d 63 70 79 28 70 50 61 79 6c 6f 61 64   memcpy(pPayload
22bd0 2c 20 70 42 75 66 2c 20 6e 42 79 74 65 29 3b 0a  , pBuf, nByte);.
22be0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
22bf0 43 6f 70 79 20 64 61 74 61 20 66 72 6f 6d 20 70  Copy data from p
22c00 61 67 65 20 74 6f 20 62 75 66 66 65 72 20 28 61  age to buffer (a
22c10 20 72 65 61 64 20 6f 70 65 72 61 74 69 6f 6e 29   read operation)
22c20 20 2a 2f 0a 20 20 20 20 6d 65 6d 63 70 79 28 70   */.    memcpy(p
22c30 42 75 66 2c 20 70 50 61 79 6c 6f 61 64 2c 20 6e  Buf, pPayload, n
22c40 42 79 74 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74  Byte);.  }.  ret
22c50 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
22c60 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
22c70 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f  ction is used to
22c80 20 72 65 61 64 20 6f 72 20 6f 76 65 72 77 72 69   read or overwri
22c90 74 65 20 70 61 79 6c 6f 61 64 20 69 6e 66 6f 72  te payload infor
22ca0 6d 61 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20 74 68  mation.** for th
22cb0 65 20 65 6e 74 72 79 20 74 68 61 74 20 74 68 65  e entry that the
22cc0 20 70 43 75 72 20 63 75 72 73 6f 72 20 69 73 20   pCur cursor is 
22cd0 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 54 68 65  pointing to. The
22ce0 20 65 4f 70 0a 2a 2a 20 61 72 67 75 6d 65 6e 74   eOp.** argument
22cf0 20 69 73 20 69 6e 74 65 72 70 72 65 74 65 64 20   is interpreted 
22d00 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  as follows:.**.*
22d10 2a 20 20 20 30 3a 20 54 68 65 20 6f 70 65 72 61  *   0: The opera
22d20 74 69 6f 6e 20 69 73 20 61 20 72 65 61 64 2e 20  tion is a read. 
22d30 50 6f 70 75 6c 61 74 65 20 74 68 65 20 6f 76 65  Populate the ove
22d40 72 66 6c 6f 77 20 63 61 63 68 65 2e 0a 2a 2a 20  rflow cache..** 
22d50 20 20 31 3a 20 54 68 65 20 6f 70 65 72 61 74 69    1: The operati
22d60 6f 6e 20 69 73 20 61 20 77 72 69 74 65 2e 20 50  on is a write. P
22d70 6f 70 75 6c 61 74 65 20 74 68 65 20 6f 76 65 72  opulate the over
22d80 66 6c 6f 77 20 63 61 63 68 65 2e 0a 2a 2a 20 20  flow cache..**  
22d90 20 32 3a 20 54 68 65 20 6f 70 65 72 61 74 69 6f   2: The operatio
22da0 6e 20 69 73 20 61 20 72 65 61 64 2e 20 44 6f 20  n is a read. Do 
22db0 6e 6f 74 20 70 6f 70 75 6c 61 74 65 20 74 68 65  not populate the
22dc0 20 6f 76 65 72 66 6c 6f 77 20 63 61 63 68 65 2e   overflow cache.
22dd0 0a 2a 2a 0a 2a 2a 20 41 20 74 6f 74 61 6c 20 6f  .**.** A total o
22de0 66 20 22 61 6d 74 22 20 62 79 74 65 73 20 61 72  f "amt" bytes ar
22df0 65 20 72 65 61 64 20 6f 72 20 77 72 69 74 74 65  e read or writte
22e00 6e 20 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 22  n beginning at "
22e10 6f 66 66 73 65 74 22 2e 0a 2a 2a 20 44 61 74 61  offset"..** Data
22e20 20 69 73 20 72 65 61 64 20 74 6f 20 6f 72 20 66   is read to or f
22e30 72 6f 6d 20 74 68 65 20 62 75 66 66 65 72 20 70  rom the buffer p
22e40 42 75 66 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  Buf..**.** The c
22e50 6f 6e 74 65 6e 74 20 62 65 69 6e 67 20 72 65 61  ontent being rea
22e60 64 20 6f 72 20 77 72 69 74 74 65 6e 20 6d 69 67  d or written mig
22e70 68 74 20 61 70 70 65 61 72 20 6f 6e 20 74 68 65  ht appear on the
22e80 20 6d 61 69 6e 20 70 61 67 65 0a 2a 2a 20 6f 72   main page.** or
22e90 20 62 65 20 73 63 61 74 74 65 72 65 64 20 6f 75   be scattered ou
22ea0 74 20 6f 6e 20 6d 75 6c 74 69 70 6c 65 20 6f 76  t on multiple ov
22eb0 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 0a 2a 2a  erflow pages..**
22ec0 0a 2a 2a 20 49 66 20 74 68 65 20 63 75 72 72 65  .** If the curre
22ed0 6e 74 20 63 75 72 73 6f 72 20 65 6e 74 72 79 20  nt cursor entry 
22ee0 75 73 65 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  uses one or more
22ef0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20   overflow pages 
22f00 61 6e 64 20 74 68 65 0a 2a 2a 20 65 4f 70 20 61  and the.** eOp a
22f10 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 74 20 32  rgument is not 2
22f20 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
22f30 6d 61 79 20 61 6c 6c 6f 63 61 74 65 20 73 70 61  may allocate spa
22f40 63 65 20 66 6f 72 20 61 6e 64 20 6c 61 7a 69 6c  ce for and lazil
22f50 79 20 0a 2a 2a 20 70 6f 70 75 6c 61 74 65 73 20  y .** populates 
22f60 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  the overflow pag
22f70 65 2d 6c 69 73 74 20 63 61 63 68 65 20 61 72 72  e-list cache arr
22f80 61 79 20 28 42 74 43 75 72 73 6f 72 2e 61 4f 76  ay (BtCursor.aOv
22f90 65 72 66 6c 6f 77 29 2e 20 0a 2a 2a 20 53 75 62  erflow). .** Sub
22fa0 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 75 73  sequent calls us
22fb0 65 20 74 68 69 73 20 63 61 63 68 65 20 74 6f 20  e this cache to 
22fc0 6d 61 6b 65 20 73 65 65 6b 69 6e 67 20 74 6f 20  make seeking to 
22fd0 74 68 65 20 73 75 70 70 6c 69 65 64 20 6f 66 66  the supplied off
22fe0 73 65 74 20 0a 2a 2a 20 6d 6f 72 65 20 65 66 66  set .** more eff
22ff0 69 63 69 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e  icient..**.** On
23000 63 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70  ce an overflow p
23010 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 20 68  age-list cache h
23020 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65  as been allocate
23030 64 2c 20 69 74 20 6d 61 79 20 62 65 0a 2a 2a 20  d, it may be.** 
23040 69 6e 76 61 6c 69 64 61 74 65 64 20 69 66 20 73  invalidated if s
23050 6f 6d 65 20 6f 74 68 65 72 20 63 75 72 73 6f 72  ome other cursor
23060 20 77 72 69 74 65 73 20 74 6f 20 74 68 65 20 73   writes to the s
23070 61 6d 65 20 74 61 62 6c 65 2c 20 6f 72 20 69 66  ame table, or if
23080 0a 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 20 69  .** the cursor i
23090 73 20 6d 6f 76 65 64 20 74 6f 20 61 20 64 69 66  s moved to a dif
230a0 66 65 72 65 6e 74 20 72 6f 77 2e 20 41 64 64 69  ferent row. Addi
230b0 74 69 6f 6e 61 6c 6c 79 2c 20 69 6e 20 61 75 74  tionally, in aut
230c0 6f 2d 76 61 63 75 75 6d 0a 2a 2a 20 6d 6f 64 65  o-vacuum.** mode
230d0 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  , the following 
230e0 65 76 65 6e 74 73 20 6d 61 79 20 69 6e 76 61 6c  events may inval
230f0 69 64 61 74 65 20 61 6e 20 6f 76 65 72 66 6c 6f  idate an overflo
23100 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68  w page-list cach
23110 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 41 6e 20  e..**.**   * An 
23120 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75  incremental vacu
23130 75 6d 2c 0a 2a 2a 20 20 20 2a 20 41 20 63 6f 6d  um,.**   * A com
23140 6d 69 74 20 69 6e 20 61 75 74 6f 5f 76 61 63 75  mit in auto_vacu
23150 75 6d 3d 22 66 75 6c 6c 22 20 6d 6f 64 65 2c 0a  um="full" mode,.
23160 2a 2a 20 20 20 2a 20 43 72 65 61 74 69 6e 67 20  **   * Creating 
23170 61 20 74 61 62 6c 65 20 28 6d 61 79 20 72 65 71  a table (may req
23180 75 69 72 65 20 6d 6f 76 69 6e 67 20 61 6e 20 6f  uire moving an o
23190 76 65 72 66 6c 6f 77 20 70 61 67 65 29 2e 0a 2a  verflow page)..*
231a0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 63 63  /.static int acc
231b0 65 73 73 50 61 79 6c 6f 61 64 28 0a 20 20 42 74  essPayload(.  Bt
231c0 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20  Cursor *pCur,   
231d0 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 70 6f 69     /* Cursor poi
231e0 6e 74 69 6e 67 20 74 6f 20 65 6e 74 72 79 20 74  nting to entry t
231f0 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20  o read from */. 
23200 20 75 33 32 20 6f 66 66 73 65 74 2c 20 20 20 20   u32 offset,    
23210 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 72        /* Begin r
23220 65 61 64 69 6e 67 20 74 68 69 73 20 66 61 72 20  eading this far 
23230 69 6e 74 6f 20 70 61 79 6c 6f 61 64 20 2a 2f 0a  into payload */.
23240 20 20 75 33 32 20 61 6d 74 2c 20 20 20 20 20 20    u32 amt,      
23250 20 20 20 20 20 20 20 2f 2a 20 52 65 61 64 20 74         /* Read t
23260 68 69 73 20 6d 61 6e 79 20 62 79 74 65 73 20 2a  his many bytes *
23270 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
23280 72 20 2a 70 42 75 66 2c 20 2f 2a 20 57 72 69 74  r *pBuf, /* Writ
23290 65 20 74 68 65 20 62 79 74 65 73 20 69 6e 74 6f  e the bytes into
232a0 20 74 68 69 73 20 62 75 66 66 65 72 20 2a 2f 20   this buffer */ 
232b0 0a 20 20 69 6e 74 20 65 4f 70 20 20 20 20 20 20  .  int eOp      
232c0 20 20 20 20 20 20 20 20 2f 2a 20 7a 65 72 6f 20          /* zero 
232d0 74 6f 20 72 65 61 64 2e 20 6e 6f 6e 2d 7a 65 72  to read. non-zer
232e0 6f 20 74 6f 20 77 72 69 74 65 2e 20 2a 2f 0a 29  o to write. */.)
232f0 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  {.  unsigned cha
23300 72 20 2a 61 50 61 79 6c 6f 61 64 3b 0a 20 20 69  r *aPayload;.  i
23310 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
23320 4b 3b 0a 20 20 69 6e 74 20 69 49 64 78 20 3d 20  K;.  int iIdx = 
23330 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  0;.  MemPage *pP
23340 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61  age = pCur->apPa
23350 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b  ge[pCur->iPage];
23360 20 2f 2a 20 42 74 72 65 65 20 70 61 67 65 20 6f   /* Btree page o
23370 66 20 63 75 72 72 65 6e 74 20 65 6e 74 72 79 20  f current entry 
23380 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  */.  BtShared *p
23390 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b 20  Bt = pCur->pBt; 
233a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
233b0 20 2f 2a 20 42 74 72 65 65 20 74 68 69 73 20 63   /* Btree this c
233c0 75 72 73 6f 72 20 62 65 6c 6f 6e 67 73 20 74 6f  ursor belongs to
233d0 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
233e0 45 5f 44 49 52 45 43 54 5f 4f 56 45 52 46 4c 4f  E_DIRECT_OVERFLO
233f0 57 5f 52 45 41 44 0a 20 20 75 6e 73 69 67 6e 65  W_READ.  unsigne
23400 64 20 63 68 61 72 20 2a 20 63 6f 6e 73 74 20 70  d char * const p
23410 42 75 66 53 74 61 72 74 20 3d 20 70 42 75 66 3b  BufStart = pBuf;
23420 0a 20 20 69 6e 74 20 62 45 6e 64 3b 20 20 20 20  .  int bEnd;    
23430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23440 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23450 54 72 75 65 20 69 66 20 72 65 61 64 69 6e 67 20  True if reading 
23460 74 6f 20 65 6e 64 20 6f 66 20 64 61 74 61 20 2a  to end of data *
23470 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65  /.#endif..  asse
23480 72 74 28 20 70 50 61 67 65 20 29 3b 0a 20 20 61  rt( pPage );.  a
23490 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
234a0 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
234b0 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  D );.  assert( p
234c0 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
234d0 3e 69 50 61 67 65 5d 3c 70 50 61 67 65 2d 3e 6e  >iPage]<pPage->n
234e0 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74  Cell );.  assert
234f0 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
23500 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ex(pCur) );.  as
23510 73 65 72 74 28 20 65 4f 70 21 3d 32 20 7c 7c 20  sert( eOp!=2 || 
23520 6f 66 66 73 65 74 3d 3d 30 20 29 3b 20 20 20 20  offset==0 );    
23530 2f 2a 20 41 6c 77 61 79 73 20 73 74 61 72 74 20  /* Always start 
23540 66 72 6f 6d 20 62 65 67 69 6e 6e 69 6e 67 20 66  from beginning f
23550 6f 72 20 65 4f 70 3d 3d 32 20 2a 2f 0a 0a 20 20  or eOp==2 */..  
23560 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72  getCellInfo(pCur
23570 29 3b 0a 20 20 61 50 61 79 6c 6f 61 64 20 3d 20  );.  aPayload = 
23580 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c  pCur->info.pPayl
23590 6f 61 64 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  oad;.#ifdef SQLI
235a0 54 45 5f 44 49 52 45 43 54 5f 4f 56 45 52 46 4c  TE_DIRECT_OVERFL
235b0 4f 57 5f 52 45 41 44 0a 20 20 62 45 6e 64 20 3d  OW_READ.  bEnd =
235c0 20 6f 66 66 73 65 74 2b 61 6d 74 3d 3d 70 43 75   offset+amt==pCu
235d0 72 2d 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64  r->info.nPayload
235e0 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72  ;.#endif.  asser
235f0 74 28 20 6f 66 66 73 65 74 2b 61 6d 74 20 3c 3d  t( offset+amt <=
23600 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50 61 79   pCur->info.nPay
23610 6c 6f 61 64 20 29 3b 0a 0a 20 20 69 66 28 20 26  load );..  if( &
23620 61 50 61 79 6c 6f 61 64 5b 70 43 75 72 2d 3e 69  aPayload[pCur->i
23630 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d 20 3e 20 26 70  nfo.nLocal] > &p
23640 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d  Page->aData[pBt-
23650 3e 75 73 61 62 6c 65 53 69 7a 65 5d 20 29 7b 0a  >usableSize] ){.
23660 20 20 20 20 2f 2a 20 54 72 79 69 6e 67 20 74 6f      /* Trying to
23670 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 70   read or write p
23680 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74  ast the end of t
23690 68 65 20 64 61 74 61 20 69 73 20 61 6e 20 65 72  he data is an er
236a0 72 6f 72 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  ror */.    retur
236b0 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
236c0 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  _BKPT;.  }..  /*
236d0 20 43 68 65 63 6b 20 69 66 20 64 61 74 61 20 6d   Check if data m
236e0 75 73 74 20 62 65 20 72 65 61 64 2f 77 72 69 74  ust be read/writ
236f0 74 65 6e 20 74 6f 2f 66 72 6f 6d 20 74 68 65 20  ten to/from the 
23700 62 74 72 65 65 20 70 61 67 65 20 69 74 73 65 6c  btree page itsel
23710 66 2e 20 2a 2f 0a 20 20 69 66 28 20 6f 66 66 73  f. */.  if( offs
23720 65 74 3c 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c  et<pCur->info.nL
23730 6f 63 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20  ocal ){.    int 
23740 61 20 3d 20 61 6d 74 3b 0a 20 20 20 20 69 66 28  a = amt;.    if(
23750 20 61 2b 6f 66 66 73 65 74 3e 70 43 75 72 2d 3e   a+offset>pCur->
23760 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20  info.nLocal ){. 
23770 20 20 20 20 20 61 20 3d 20 70 43 75 72 2d 3e 69       a = pCur->i
23780 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2d 20 6f 66 66  nfo.nLocal - off
23790 73 65 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  set;.    }.    r
237a0 63 20 3d 20 63 6f 70 79 50 61 79 6c 6f 61 64 28  c = copyPayload(
237b0 26 61 50 61 79 6c 6f 61 64 5b 6f 66 66 73 65 74  &aPayload[offset
237c0 5d 2c 20 70 42 75 66 2c 20 61 2c 20 28 65 4f 70  ], pBuf, a, (eOp
237d0 20 26 20 30 78 30 31 29 2c 20 70 50 61 67 65 2d   & 0x01), pPage-
237e0 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 6f  >pDbPage);.    o
237f0 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 70  ffset = 0;.    p
23800 42 75 66 20 2b 3d 20 61 3b 0a 20 20 20 20 61 6d  Buf += a;.    am
23810 74 20 2d 3d 20 61 3b 0a 20 20 7d 65 6c 73 65 7b  t -= a;.  }else{
23820 0a 20 20 20 20 6f 66 66 73 65 74 20 2d 3d 20 70  .    offset -= p
23830 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  Cur->info.nLocal
23840 3b 0a 20 20 7d 0a 0a 0a 20 20 69 66 28 20 72 63  ;.  }...  if( rc
23850 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61  ==SQLITE_OK && a
23860 6d 74 3e 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73  mt>0 ){.    cons
23870 74 20 75 33 32 20 6f 76 66 6c 53 69 7a 65 20 3d  t u32 ovflSize =
23880 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
23890 20 2d 20 34 3b 20 20 2f 2a 20 42 79 74 65 73 20   - 4;  /* Bytes 
238a0 63 6f 6e 74 65 6e 74 20 70 65 72 20 6f 76 66 6c  content per ovfl
238b0 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 50 67 6e   page */.    Pgn
238c0 6f 20 6e 65 78 74 50 61 67 65 3b 0a 0a 20 20 20  o nextPage;..   
238d0 20 6e 65 78 74 50 61 67 65 20 3d 20 67 65 74 34   nextPage = get4
238e0 62 79 74 65 28 26 61 50 61 79 6c 6f 61 64 5b 70  byte(&aPayload[p
238f0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  Cur->info.nLocal
23900 5d 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74  ]);..    /* If t
23910 68 65 20 42 74 43 75 72 73 6f 72 2e 61 4f 76 65  he BtCursor.aOve
23920 72 66 6c 6f 77 5b 5d 20 68 61 73 20 6e 6f 74 20  rflow[] has not 
23930 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c 20  been allocated, 
23940 61 6c 6c 6f 63 61 74 65 20 69 74 20 6e 6f 77 2e  allocate it now.
23950 0a 20 20 20 20 2a 2a 20 45 78 63 65 70 74 2c 20  .    ** Except, 
23960 64 6f 20 6e 6f 74 20 61 6c 6c 6f 63 61 74 65 20  do not allocate 
23970 61 4f 76 65 72 66 6c 6f 77 5b 5d 20 66 6f 72 20  aOverflow[] for 
23980 65 4f 70 3d 3d 32 2e 0a 20 20 20 20 2a 2a 0a 20  eOp==2..    **. 
23990 20 20 20 2a 2a 20 54 68 65 20 61 4f 76 65 72 66     ** The aOverf
239a0 6c 6f 77 5b 5d 20 61 72 72 61 79 20 69 73 20 73  low[] array is s
239b0 69 7a 65 64 20 61 74 20 6f 6e 65 20 65 6e 74 72  ized at one entr
239c0 79 20 66 6f 72 20 65 61 63 68 20 6f 76 65 72 66  y for each overf
239d0 6c 6f 77 20 70 61 67 65 0a 20 20 20 20 2a 2a 20  low page.    ** 
239e0 69 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  in the overflow 
239f0 63 68 61 69 6e 2e 20 54 68 65 20 70 61 67 65 20  chain. The page 
23a00 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 66 69  number of the fi
23a10 72 73 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  rst overflow pag
23a20 65 20 69 73 0a 20 20 20 20 2a 2a 20 73 74 6f 72  e is.    ** stor
23a30 65 64 20 69 6e 20 61 4f 76 65 72 66 6c 6f 77 5b  ed in aOverflow[
23a40 30 5d 2c 20 65 74 63 2e 20 41 20 76 61 6c 75 65  0], etc. A value
23a50 20 6f 66 20 30 20 69 6e 20 74 68 65 20 61 4f 76   of 0 in the aOv
23a60 65 72 66 6c 6f 77 5b 5d 20 61 72 72 61 79 0a 20  erflow[] array. 
23a70 20 20 20 2a 2a 20 6d 65 61 6e 73 20 22 6e 6f 74     ** means "not
23a80 20 79 65 74 20 6b 6e 6f 77 6e 22 20 28 74 68 65   yet known" (the
23a90 20 63 61 63 68 65 20 69 73 20 6c 61 7a 69 6c 79   cache is lazily
23aa0 20 70 6f 70 75 6c 61 74 65 64 29 2e 0a 20 20 20   populated)..   
23ab0 20 2a 2f 0a 20 20 20 20 69 66 28 20 65 4f 70 21   */.    if( eOp!
23ac0 3d 32 20 26 26 20 28 70 43 75 72 2d 3e 63 75 72  =2 && (pCur->cur
23ad0 46 6c 61 67 73 20 26 20 42 54 43 46 5f 56 61 6c  Flags & BTCF_Val
23ae0 69 64 4f 76 66 6c 29 3d 3d 30 20 29 7b 0a 20 20  idOvfl)==0 ){.  
23af0 20 20 20 20 69 6e 74 20 6e 4f 76 66 6c 20 3d 20      int nOvfl = 
23b00 28 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50 61 79  (pCur->info.nPay
23b10 6c 6f 61 64 2d 70 43 75 72 2d 3e 69 6e 66 6f 2e  load-pCur->info.
23b20 6e 4c 6f 63 61 6c 2b 6f 76 66 6c 53 69 7a 65 2d  nLocal+ovflSize-
23b30 31 29 2f 6f 76 66 6c 53 69 7a 65 3b 0a 20 20 20  1)/ovflSize;.   
23b40 20 20 20 69 66 28 20 6e 4f 76 66 6c 3e 70 43 75     if( nOvfl>pCu
23b50 72 2d 3e 6e 4f 76 66 6c 41 6c 6c 6f 63 20 29 7b  r->nOvflAlloc ){
23b60 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20 2a 61  .        Pgno *a
23b70 4e 65 77 20 3d 20 28 50 67 6e 6f 2a 29 73 71 6c  New = (Pgno*)sql
23b80 69 74 65 33 52 65 61 6c 6c 6f 63 28 0a 20 20 20  ite3Realloc(.   
23b90 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 61           pCur->a
23ba0 4f 76 65 72 66 6c 6f 77 2c 20 6e 4f 76 66 6c 2a  Overflow, nOvfl*
23bb0 32 2a 73 69 7a 65 6f 66 28 50 67 6e 6f 29 0a 20  2*sizeof(Pgno). 
23bc0 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
23bd0 20 20 69 66 28 20 61 4e 65 77 3d 3d 30 20 29 7b    if( aNew==0 ){
23be0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
23bf0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
23c00 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
23c10 20 20 20 20 20 20 20 70 43 75 72 2d 3e 6e 4f 76         pCur->nOv
23c20 66 6c 41 6c 6c 6f 63 20 3d 20 6e 4f 76 66 6c 2a  flAlloc = nOvfl*
23c30 32 3b 0a 20 20 20 20 20 20 20 20 20 20 70 43 75  2;.          pCu
23c40 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 3d 20 61  r->aOverflow = a
23c50 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  New;.        }. 
23c60 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
23c70 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
23c80 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74  {.        memset
23c90 28 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77  (pCur->aOverflow
23ca0 2c 20 30 2c 20 6e 4f 76 66 6c 2a 73 69 7a 65 6f  , 0, nOvfl*sizeo
23cb0 66 28 50 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20  f(Pgno));.      
23cc0 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73    pCur->curFlags
23cd0 20 7c 3d 20 42 54 43 46 5f 56 61 6c 69 64 4f 76   |= BTCF_ValidOv
23ce0 66 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  fl;.      }.    
23cf0 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  }..    /* If the
23d00 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c   overflow page-l
23d10 69 73 74 20 63 61 63 68 65 20 68 61 73 20 62 65  ist cache has be
23d20 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64  en allocated and
23d30 20 74 68 65 0a 20 20 20 20 2a 2a 20 65 6e 74 72   the.    ** entr
23d40 79 20 66 6f 72 20 74 68 65 20 66 69 72 73 74 20  y for the first 
23d50 72 65 71 75 69 72 65 64 20 6f 76 65 72 66 6c 6f  required overflo
23d60 77 20 70 61 67 65 20 69 73 20 76 61 6c 69 64 2c  w page is valid,
23d70 20 73 6b 69 70 0a 20 20 20 20 2a 2a 20 64 69 72   skip.    ** dir
23d80 65 63 74 6c 79 20 74 6f 20 69 74 2e 0a 20 20 20  ectly to it..   
23d90 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 70 43 75   */.    if( (pCu
23da0 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54  r->curFlags & BT
23db0 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 21 3d 30  CF_ValidOvfl)!=0
23dc0 0a 20 20 20 20 20 26 26 20 70 43 75 72 2d 3e 61  .     && pCur->a
23dd0 4f 76 65 72 66 6c 6f 77 5b 6f 66 66 73 65 74 2f  Overflow[offset/
23de0 6f 76 66 6c 53 69 7a 65 5d 0a 20 20 20 20 29 7b  ovflSize].    ){
23df0 0a 20 20 20 20 20 20 69 49 64 78 20 3d 20 28 6f  .      iIdx = (o
23e00 66 66 73 65 74 2f 6f 76 66 6c 53 69 7a 65 29 3b  ffset/ovflSize);
23e10 0a 20 20 20 20 20 20 6e 65 78 74 50 61 67 65 20  .      nextPage 
23e20 3d 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f  = pCur->aOverflo
23e30 77 5b 69 49 64 78 5d 3b 0a 20 20 20 20 20 20 6f  w[iIdx];.      o
23e40 66 66 73 65 74 20 3d 20 28 6f 66 66 73 65 74 25  ffset = (offset%
23e50 6f 76 66 6c 53 69 7a 65 29 3b 0a 20 20 20 20 7d  ovflSize);.    }
23e60 0a 0a 20 20 20 20 66 6f 72 28 20 3b 20 72 63 3d  ..    for( ; rc=
23e70 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d  =SQLITE_OK && am
23e80 74 3e 30 20 26 26 20 6e 65 78 74 50 61 67 65 3b  t>0 && nextPage;
23e90 20 69 49 64 78 2b 2b 29 7b 0a 0a 20 20 20 20 20   iIdx++){..     
23ea0 20 2f 2a 20 49 66 20 72 65 71 75 69 72 65 64 2c   /* If required,
23eb0 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20 6f 76   populate the ov
23ec0 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74  erflow page-list
23ed0 20 63 61 63 68 65 2e 20 2a 2f 0a 20 20 20 20 20   cache. */.     
23ee0 20 69 66 28 20 28 70 43 75 72 2d 3e 63 75 72 46   if( (pCur->curF
23ef0 6c 61 67 73 20 26 20 42 54 43 46 5f 56 61 6c 69  lags & BTCF_Vali
23f00 64 4f 76 66 6c 29 21 3d 30 20 29 7b 0a 20 20 20  dOvfl)!=0 ){.   
23f10 20 20 20 20 20 61 73 73 65 72 74 28 21 70 43 75       assert(!pCu
23f20 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64  r->aOverflow[iId
23f30 78 5d 20 7c 7c 20 70 43 75 72 2d 3e 61 4f 76 65  x] || pCur->aOve
23f40 72 66 6c 6f 77 5b 69 49 64 78 5d 3d 3d 6e 65 78  rflow[iIdx]==nex
23f50 74 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  tPage);.        
23f60 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b  pCur->aOverflow[
23f70 69 49 64 78 5d 20 3d 20 6e 65 78 74 50 61 67 65  iIdx] = nextPage
23f80 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
23f90 20 69 66 28 20 6f 66 66 73 65 74 3e 3d 6f 76 66   if( offset>=ovf
23fa0 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20  lSize ){.       
23fb0 20 2f 2a 20 54 68 65 20 6f 6e 6c 79 20 72 65 61   /* The only rea
23fc0 73 6f 6e 20 74 6f 20 72 65 61 64 20 74 68 69 73  son to read this
23fd0 20 70 61 67 65 20 69 73 20 74 6f 20 6f 62 74 61   page is to obta
23fe0 69 6e 20 74 68 65 20 70 61 67 65 0a 20 20 20 20  in the page.    
23ff0 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 66 6f      ** number fo
24000 72 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20  r the next page 
24010 69 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  in the overflow 
24020 63 68 61 69 6e 2e 20 54 68 65 20 70 61 67 65 0a  chain. The page.
24030 20 20 20 20 20 20 20 20 2a 2a 20 64 61 74 61 20          ** data 
24040 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64 2e  is not required.
24050 20 53 6f 20 66 69 72 73 74 20 74 72 79 20 74 6f   So first try to
24060 20 6c 6f 6f 6b 75 70 20 74 68 65 20 6f 76 65 72   lookup the over
24070 66 6c 6f 77 0a 20 20 20 20 20 20 20 20 2a 2a 20  flow.        ** 
24080 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 2c  page-list cache,
24090 20 69 66 20 61 6e 79 2c 20 74 68 65 6e 20 66 61   if any, then fa
240a0 6c 6c 20 62 61 63 6b 20 74 6f 20 74 68 65 20 67  ll back to the g
240b0 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 29  etOverflowPage()
240c0 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6e 63  .        ** func
240d0 74 69 6f 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2a  tion..        **
240e0 0a 20 20 20 20 20 20 20 20 2a 2a 20 4e 6f 74 65  .        ** Note
240f0 20 74 68 61 74 20 74 68 65 20 61 4f 76 65 72 66   that the aOverf
24100 6c 6f 77 5b 5d 20 61 72 72 61 79 20 6d 75 73 74  low[] array must
24110 20 62 65 20 61 6c 6c 6f 63 61 74 65 64 20 62 65   be allocated be
24120 63 61 75 73 65 20 65 4f 70 21 3d 32 0a 20 20 20  cause eOp!=2.   
24130 20 20 20 20 20 2a 2a 20 68 65 72 65 2e 20 20 49       ** here.  I
24140 66 20 65 4f 70 3d 3d 32 2c 20 74 68 65 6e 20 6f  f eOp==2, then o
24150 66 66 73 65 74 3d 3d 30 20 61 6e 64 20 74 68 69  ffset==0 and thi
24160 73 20 62 72 61 6e 63 68 20 69 73 20 6e 65 76 65  s branch is neve
24170 72 20 74 61 6b 65 6e 2e 0a 20 20 20 20 20 20 20  r taken..       
24180 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65   */.        asse
24190 72 74 28 20 65 4f 70 21 3d 32 20 29 3b 0a 20 20  rt( eOp!=2 );.  
241a0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
241b0 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42  ur->curFlags & B
241c0 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 20 29 3b  TCF_ValidOvfl );
241d0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
241e0 20 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64   pCur->pBtree->d
241f0 62 3d 3d 70 42 74 2d 3e 64 62 20 29 3b 0a 20 20  b==pBt->db );.  
24200 20 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e        if( pCur->
24210 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 2b 31  aOverflow[iIdx+1
24220 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e  ] ){.          n
24230 65 78 74 50 61 67 65 20 3d 20 70 43 75 72 2d 3e  extPage = pCur->
24240 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 2b 31  aOverflow[iIdx+1
24250 5d 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  ];.        }else
24260 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
24270 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65   getOverflowPage
24280 28 70 42 74 2c 20 6e 65 78 74 50 61 67 65 2c 20  (pBt, nextPage, 
24290 30 2c 20 26 6e 65 78 74 50 61 67 65 29 3b 0a 20  0, &nextPage);. 
242a0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
242b0 20 6f 66 66 73 65 74 20 2d 3d 20 6f 76 66 6c 53   offset -= ovflS
242c0 69 7a 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ize;.      }else
242d0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 65  {.        /* Nee
242e0 64 20 74 6f 20 72 65 61 64 20 74 68 69 73 20 70  d to read this p
242f0 61 67 65 20 70 72 6f 70 65 72 6c 79 2e 20 49 74  age properly. It
24300 20 63 6f 6e 74 61 69 6e 73 20 73 6f 6d 65 20 6f   contains some o
24310 66 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  f the.        **
24320 20 72 61 6e 67 65 20 6f 66 20 64 61 74 61 20 74   range of data t
24330 68 61 74 20 69 73 20 62 65 69 6e 67 20 72 65 61  hat is being rea
24340 64 20 28 65 4f 70 3d 3d 30 29 20 6f 72 20 77 72  d (eOp==0) or wr
24350 69 74 74 65 6e 20 28 65 4f 70 21 3d 30 29 2e 0a  itten (eOp!=0)..
24360 20 20 20 20 20 20 20 20 2a 2f 0a 23 69 66 64 65          */.#ifde
24370 66 20 53 51 4c 49 54 45 5f 44 49 52 45 43 54 5f  f SQLITE_DIRECT_
24380 4f 56 45 52 46 4c 4f 57 5f 52 45 41 44 0a 20 20  OVERFLOW_READ.  
24390 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69        sqlite3_fi
243a0 6c 65 20 2a 66 64 3b 0a 23 65 6e 64 69 66 0a 20  le *fd;.#endif. 
243b0 20 20 20 20 20 20 20 69 6e 74 20 61 20 3d 20 61         int a = a
243c0 6d 74 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  mt;.        if( 
243d0 61 20 2b 20 6f 66 66 73 65 74 20 3e 20 6f 76 66  a + offset > ovf
243e0 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20  lSize ){.       
243f0 20 20 20 61 20 3d 20 6f 76 66 6c 53 69 7a 65 20     a = ovflSize 
24400 2d 20 6f 66 66 73 65 74 3b 0a 20 20 20 20 20 20  - offset;.      
24410 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49    }..#ifdef SQLI
24420 54 45 5f 44 49 52 45 43 54 5f 4f 56 45 52 46 4c  TE_DIRECT_OVERFL
24430 4f 57 5f 52 45 41 44 0a 20 20 20 20 20 20 20 20  OW_READ.        
24440 2f 2a 20 49 66 20 61 6c 6c 20 74 68 65 20 66 6f  /* If all the fo
24450 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65  llowing are true
24460 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  :.        **.   
24470 20 20 20 20 20 2a 2a 20 20 20 31 29 20 74 68 69       **   1) thi
24480 73 20 69 73 20 61 20 72 65 61 64 20 6f 70 65 72  s is a read oper
24490 61 74 69 6f 6e 2c 20 61 6e 64 20 0a 20 20 20 20  ation, and .    
244a0 20 20 20 20 2a 2a 20 20 20 32 29 20 64 61 74 61      **   2) data
244b0 20 69 73 20 72 65 71 75 69 72 65 64 20 66 72 6f   is required fro
244c0 6d 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  m the start of t
244d0 68 69 73 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  his overflow pag
244e0 65 2c 20 61 6e 64 0a 20 20 20 20 20 20 20 20 2a  e, and.        *
244f0 2a 20 20 20 33 29 20 74 68 65 20 64 61 74 61 62  *   3) the datab
24500 61 73 65 20 69 73 20 66 69 6c 65 2d 62 61 63 6b  ase is file-back
24510 65 64 2c 20 61 6e 64 0a 20 20 20 20 20 20 20 20  ed, and.        
24520 2a 2a 20 20 20 34 29 20 74 68 65 72 65 20 69 73  **   4) there is
24530 20 6e 6f 20 6f 70 65 6e 20 77 72 69 74 65 2d 74   no open write-t
24540 72 61 6e 73 61 63 74 69 6f 6e 2c 20 61 6e 64 0a  ransaction, and.
24550 20 20 20 20 20 20 20 20 2a 2a 20 20 20 35 29 20          **   5) 
24560 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
24570 6e 6f 74 20 61 20 57 41 4c 20 64 61 74 61 62 61  not a WAL databa
24580 73 65 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 20  se,.        **  
24590 20 36 29 20 61 6c 6c 20 64 61 74 61 20 66 72 6f   6) all data fro
245a0 6d 20 74 68 65 20 70 61 67 65 20 69 73 20 62 65  m the page is be
245b0 69 6e 67 20 72 65 61 64 2e 0a 20 20 20 20 20 20  ing read..      
245c0 20 20 2a 2a 20 20 20 37 29 20 61 74 20 6c 65 61    **   7) at lea
245d0 73 74 20 34 20 62 79 74 65 73 20 68 61 76 65 20  st 4 bytes have 
245e0 61 6c 72 65 61 64 79 20 62 65 65 6e 20 72 65 61  already been rea
245f0 64 20 69 6e 74 6f 20 74 68 65 20 6f 75 74 70 75  d into the outpu
24600 74 20 62 75 66 66 65 72 20 0a 20 20 20 20 20 20  t buffer .      
24610 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
24620 74 68 65 6e 20 64 61 74 61 20 63 61 6e 20 62 65  then data can be
24630 20 72 65 61 64 20 64 69 72 65 63 74 6c 79 20 66   read directly f
24640 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
24650 20 66 69 6c 65 20 69 6e 74 6f 20 74 68 65 0a 20   file into the. 
24660 20 20 20 20 20 20 20 2a 2a 20 6f 75 74 70 75 74         ** output
24670 20 62 75 66 66 65 72 2c 20 62 79 70 61 73 73 69   buffer, bypassi
24680 6e 67 20 74 68 65 20 70 61 67 65 2d 63 61 63 68  ng the page-cach
24690 65 20 61 6c 74 6f 67 65 74 68 65 72 2e 20 54 68  e altogether. Th
246a0 69 73 20 73 70 65 65 64 73 0a 20 20 20 20 20 20  is speeds.      
246b0 20 20 2a 2a 20 75 70 20 6c 6f 61 64 69 6e 67 20    ** up loading 
246c0 6c 61 72 67 65 20 72 65 63 6f 72 64 73 20 74 68  large records th
246d0 61 74 20 73 70 61 6e 20 6d 61 6e 79 20 6f 76 65  at span many ove
246e0 72 66 6c 6f 77 20 70 61 67 65 73 2e 0a 20 20 20  rflow pages..   
246f0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
24700 69 66 28 20 28 65 4f 70 26 30 78 30 31 29 3d 3d  if( (eOp&0x01)==
24710 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
24720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24730 20 20 20 20 20 20 20 2f 2a 20 28 31 29 20 2a 2f         /* (1) */
24740 0a 20 20 20 20 20 20 20 20 20 26 26 20 6f 66 66  .         && off
24750 73 65 74 3d 3d 30 20 20 20 20 20 20 20 20 20 20  set==0          
24760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24780 2f 2a 20 28 32 29 20 2a 2f 0a 20 20 20 20 20 20  /* (2) */.      
24790 20 20 20 26 26 20 28 62 45 6e 64 20 7c 7c 20 61     && (bEnd || a
247a0 3d 3d 6f 76 66 6c 53 69 7a 65 29 20 20 20 20 20  ==ovflSize)     
247b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
247c0 20 20 20 20 20 20 20 20 20 2f 2a 20 28 36 29 20           /* (6) 
247d0 2a 2f 0a 20 20 20 20 20 20 20 20 20 26 26 20 70  */.         && p
247e0 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
247f0 6e 3d 3d 54 52 41 4e 53 5f 52 45 41 44 20 20 20  n==TRANS_READ   
24800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24810 20 20 2f 2a 20 28 34 29 20 2a 2f 0a 20 20 20 20    /* (4) */.    
24820 20 20 20 20 20 26 26 20 28 66 64 20 3d 20 73 71       && (fd = sq
24830 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65 28 70  lite3PagerFile(p
24840 42 74 2d 3e 70 50 61 67 65 72 29 29 2d 3e 70 4d  Bt->pPager))->pM
24850 65 74 68 6f 64 73 20 20 20 20 20 2f 2a 20 28 33  ethods     /* (3
24860 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 26 26  ) */.         &&
24870 20 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44   pBt->pPage1->aD
24880 61 74 61 5b 31 39 5d 3d 3d 30 78 30 31 20 20 20  ata[19]==0x01   
24890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
248a0 20 20 20 20 2f 2a 20 28 35 29 20 2a 2f 0a 20 20      /* (5) */.  
248b0 20 20 20 20 20 20 20 26 26 20 26 70 42 75 66 5b         && &pBuf[
248c0 2d 34 5d 3e 3d 70 42 75 66 53 74 61 72 74 20 20  -4]>=pBufStart  
248d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
248e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
248f0 28 37 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 29  (7) */.        )
24900 7b 0a 20 20 20 20 20 20 20 20 20 20 75 38 20 61  {.          u8 a
24910 53 61 76 65 5b 34 5d 3b 0a 20 20 20 20 20 20 20  Save[4];.       
24920 20 20 20 75 38 20 2a 61 57 72 69 74 65 20 3d 20     u8 *aWrite = 
24930 26 70 42 75 66 5b 2d 34 5d 3b 0a 20 20 20 20 20  &pBuf[-4];.     
24940 20 20 20 20 20 61 73 73 65 72 74 28 20 61 57 72       assert( aWr
24950 69 74 65 3e 3d 70 42 75 66 53 74 61 72 74 20 29  ite>=pBufStart )
24960 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
24970 20 20 20 20 20 20 20 20 20 20 2f 2a 20 68 65 6e            /* hen
24980 63 65 20 28 37 29 20 2a 2f 0a 20 20 20 20 20 20  ce (7) */.      
24990 20 20 20 20 6d 65 6d 63 70 79 28 61 53 61 76 65      memcpy(aSave
249a0 2c 20 61 57 72 69 74 65 2c 20 34 29 3b 0a 20 20  , aWrite, 4);.  
249b0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
249c0 69 74 65 33 4f 73 52 65 61 64 28 66 64 2c 20 61  ite3OsRead(fd, a
249d0 57 72 69 74 65 2c 20 61 2b 34 2c 20 28 69 36 34  Write, a+4, (i64
249e0 29 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2a 28  )pBt->pageSize*(
249f0 6e 65 78 74 50 61 67 65 2d 31 29 29 3b 0a 20 20  nextPage-1));.  
24a00 20 20 20 20 20 20 20 20 6e 65 78 74 50 61 67 65          nextPage
24a10 20 3d 20 67 65 74 34 62 79 74 65 28 61 57 72 69   = get4byte(aWri
24a20 74 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6d  te);.          m
24a30 65 6d 63 70 79 28 61 57 72 69 74 65 2c 20 61 53  emcpy(aWrite, aS
24a40 61 76 65 2c 20 34 29 3b 0a 20 20 20 20 20 20 20  ave, 4);.       
24a50 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 0a 20   }else.#endif.. 
24a60 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20         {.       
24a70 20 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61     DbPage *pDbPa
24a80 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63  ge;.          rc
24a90 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 41   = sqlite3PagerA
24aa0 63 71 75 69 72 65 28 70 42 74 2d 3e 70 50 61 67  cquire(pBt->pPag
24ab0 65 72 2c 20 6e 65 78 74 50 61 67 65 2c 20 26 70  er, nextPage, &p
24ac0 44 62 50 61 67 65 2c 0a 20 20 20 20 20 20 20 20  DbPage,.        
24ad0 20 20 20 20 20 20 28 28 65 4f 70 26 30 78 30 31        ((eOp&0x01
24ae0 29 3d 3d 30 20 3f 20 50 41 47 45 52 5f 47 45 54  )==0 ? PAGER_GET
24af0 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 30 29 0a 20  _READONLY : 0). 
24b00 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20           );.    
24b10 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
24b20 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
24b30 20 20 20 20 20 20 20 61 50 61 79 6c 6f 61 64 20         aPayload 
24b40 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  = sqlite3PagerGe
24b50 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a  tData(pDbPage);.
24b60 20 20 20 20 20 20 20 20 20 20 20 20 6e 65 78 74              next
24b70 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28  Page = get4byte(
24b80 61 50 61 79 6c 6f 61 64 29 3b 0a 20 20 20 20 20  aPayload);.     
24b90 20 20 20 20 20 20 20 72 63 20 3d 20 63 6f 70 79         rc = copy
24ba0 50 61 79 6c 6f 61 64 28 26 61 50 61 79 6c 6f 61  Payload(&aPayloa
24bb0 64 5b 6f 66 66 73 65 74 2b 34 5d 2c 20 70 42 75  d[offset+4], pBu
24bc0 66 2c 20 61 2c 20 28 65 4f 70 26 30 78 30 31 29  f, a, (eOp&0x01)
24bd0 2c 20 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  , pDbPage);.    
24be0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50          sqlite3P
24bf0 61 67 65 72 55 6e 72 65 66 28 70 44 62 50 61 67  agerUnref(pDbPag
24c00 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
24c10 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20  offset = 0;.    
24c20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
24c30 7d 0a 20 20 20 20 20 20 20 20 61 6d 74 20 2d 3d  }.        amt -=
24c40 20 61 3b 0a 20 20 20 20 20 20 20 20 70 42 75 66   a;.        pBuf
24c50 20 2b 3d 20 61 3b 0a 20 20 20 20 20 20 7d 0a 20   += a;.      }. 
24c60 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
24c70 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
24c80 20 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20 72 65   amt>0 ){.    re
24c90 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
24ca0 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  UPT_BKPT;.  }.  
24cb0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
24cc0 0a 2a 2a 20 52 65 61 64 20 70 61 72 74 20 6f 66  .** Read part of
24cd0 20 74 68 65 20 6b 65 79 20 61 73 73 6f 63 69 61   the key associa
24ce0 74 65 64 20 77 69 74 68 20 63 75 72 73 6f 72 20  ted with cursor 
24cf0 70 43 75 72 2e 20 20 45 78 61 63 74 6c 79 0a 2a  pCur.  Exactly.*
24d00 2a 20 22 61 6d 74 22 20 62 79 74 65 73 20 77 69  * "amt" bytes wi
24d10 6c 6c 20 62 65 20 74 72 61 6e 73 66 65 72 72 65  ll be transferre
24d20 64 20 69 6e 74 6f 20 70 42 75 66 5b 5d 2e 20 20  d into pBuf[].  
24d30 54 68 65 20 74 72 61 6e 73 66 65 72 0a 2a 2a 20  The transfer.** 
24d40 62 65 67 69 6e 73 20 61 74 20 22 6f 66 66 73 65  begins at "offse
24d50 74 22 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61  t"..**.** The ca
24d60 6c 6c 65 72 20 6d 75 73 74 20 65 6e 73 75 72 65  ller must ensure
24d70 20 74 68 61 74 20 70 43 75 72 20 69 73 20 70 6f   that pCur is po
24d80 69 6e 74 69 6e 67 20 74 6f 20 61 20 76 61 6c 69  inting to a vali
24d90 64 20 72 6f 77 0a 2a 2a 20 69 6e 20 74 68 65 20  d row.** in the 
24da0 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  table..**.** Ret
24db0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e  urn SQLITE_OK on
24dc0 20 73 75 63 63 65 73 73 20 6f 72 20 61 6e 20 65   success or an e
24dd0 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 79  rror code if any
24de0 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72  thing goes.** wr
24df0 6f 6e 67 2e 20 20 41 6e 20 65 72 72 6f 72 20 69  ong.  An error i
24e00 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 22 6f  s returned if "o
24e10 66 66 73 65 74 2b 61 6d 74 22 20 69 73 20 6c 61  ffset+amt" is la
24e20 72 67 65 72 20 74 68 61 6e 0a 2a 2a 20 74 68 65  rger than.** the
24e30 20 61 76 61 69 6c 61 62 6c 65 20 70 61 79 6c 6f   available paylo
24e40 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ad..*/.int sqlit
24e50 65 33 42 74 72 65 65 4b 65 79 28 42 74 43 75 72  e3BtreeKey(BtCur
24e60 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20 6f  sor *pCur, u32 o
24e70 66 66 73 65 74 2c 20 75 33 32 20 61 6d 74 2c 20  ffset, u32 amt, 
24e80 76 6f 69 64 20 2a 70 42 75 66 29 7b 0a 20 20 61  void *pBuf){.  a
24e90 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
24ea0 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
24eb0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
24ec0 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
24ed0 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72  VALID );.  asser
24ee0 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d  t( pCur->iPage>=
24ef0 30 20 26 26 20 70 43 75 72 2d 3e 61 70 50 61 67  0 && pCur->apPag
24f00 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 29  e[pCur->iPage] )
24f10 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
24f20 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
24f30 61 67 65 5d 3c 70 43 75 72 2d 3e 61 70 50 61 67  age]<pCur->apPag
24f40 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e  e[pCur->iPage]->
24f50 6e 43 65 6c 6c 20 29 3b 0a 20 20 72 65 74 75 72  nCell );.  retur
24f60 6e 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28  n accessPayload(
24f70 70 43 75 72 2c 20 6f 66 66 73 65 74 2c 20 61 6d  pCur, offset, am
24f80 74 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61  t, (unsigned cha
24f90 72 2a 29 70 42 75 66 2c 20 30 29 3b 0a 7d 0a 0a  r*)pBuf, 0);.}..
24fa0 2f 2a 0a 2a 2a 20 52 65 61 64 20 70 61 72 74 20  /*.** Read part 
24fb0 6f 66 20 74 68 65 20 64 61 74 61 20 61 73 73 6f  of the data asso
24fc0 63 69 61 74 65 64 20 77 69 74 68 20 63 75 72 73  ciated with curs
24fd0 6f 72 20 70 43 75 72 2e 20 20 45 78 61 63 74 6c  or pCur.  Exactl
24fe0 79 0a 2a 2a 20 22 61 6d 74 22 20 62 79 74 65 73  y.** "amt" bytes
24ff0 20 77 69 6c 6c 20 62 65 20 74 72 61 6e 73 66 65   will be transfe
25000 72 65 64 20 69 6e 74 6f 20 70 42 75 66 5b 5d 2e  red into pBuf[].
25010 20 20 54 68 65 20 74 72 61 6e 73 66 65 72 0a 2a    The transfer.*
25020 2a 20 62 65 67 69 6e 73 20 61 74 20 22 6f 66 66  * begins at "off
25030 73 65 74 22 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  set"..**.** Retu
25040 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20  rn SQLITE_OK on 
25050 73 75 63 63 65 73 73 20 6f 72 20 61 6e 20 65 72  success or an er
25060 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 79 74  ror code if anyt
25070 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f  hing goes.** wro
25080 6e 67 2e 20 20 41 6e 20 65 72 72 6f 72 20 69 73  ng.  An error is
25090 20 72 65 74 75 72 6e 65 64 20 69 66 20 22 6f 66   returned if "of
250a0 66 73 65 74 2b 61 6d 74 22 20 69 73 20 6c 61 72  fset+amt" is lar
250b0 67 65 72 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20  ger than.** the 
250c0 61 76 61 69 6c 61 62 6c 65 20 70 61 79 6c 6f 61  available payloa
250d0 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
250e0 33 42 74 72 65 65 44 61 74 61 28 42 74 43 75 72  3BtreeData(BtCur
250f0 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20 6f  sor *pCur, u32 o
25100 66 66 73 65 74 2c 20 75 33 32 20 61 6d 74 2c 20  ffset, u32 amt, 
25110 76 6f 69 64 20 2a 70 42 75 66 29 7b 0a 20 20 69  void *pBuf){.  i
25120 6e 74 20 72 63 3b 0a 0a 23 69 66 6e 64 65 66 20  nt rc;..#ifndef 
25130 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52  SQLITE_OMIT_INCR
25140 42 4c 4f 42 0a 20 20 69 66 20 28 20 70 43 75 72  BLOB.  if ( pCur
25150 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
25160 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20 20  _INVALID ){.    
25170 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 42  return SQLITE_AB
25180 4f 52 54 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  ORT;.  }.#endif.
25190 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
251a0 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
251b0 29 20 29 3b 0a 20 20 72 63 20 3d 20 72 65 73 74  ) );.  rc = rest
251c0 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  oreCursorPositio
251d0 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72  n(pCur);.  if( r
251e0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
251f0 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
25200 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
25210 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20 20 61 73  _VALID );.    as
25220 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67  sert( pCur->iPag
25230 65 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 61 70  e>=0 && pCur->ap
25240 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
25250 5d 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ] );.    assert(
25260 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
25270 72 2d 3e 69 50 61 67 65 5d 3c 70 43 75 72 2d 3e  r->iPage]<pCur->
25280 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
25290 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20  ge]->nCell );.  
252a0 20 20 72 63 20 3d 20 61 63 63 65 73 73 50 61 79    rc = accessPay
252b0 6c 6f 61 64 28 70 43 75 72 2c 20 6f 66 66 73 65  load(pCur, offse
252c0 74 2c 20 61 6d 74 2c 20 70 42 75 66 2c 20 30 29  t, amt, pBuf, 0)
252d0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
252e0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  c;.}../*.** Retu
252f0 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
25300 70 61 79 6c 6f 61 64 20 69 6e 66 6f 72 6d 61 74  payload informat
25310 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 65 6e 74  ion from the ent
25320 72 79 20 74 68 61 74 20 74 68 65 20 0a 2a 2a 20  ry that the .** 
25330 70 43 75 72 20 63 75 72 73 6f 72 20 69 73 20 70  pCur cursor is p
25340 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 20 54 68 65  ointing to.  The
25350 20 70 6f 69 6e 74 65 72 20 69 73 20 74 6f 20 74   pointer is to t
25360 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 0a  he beginning of.
25370 2a 2a 20 74 68 65 20 6b 65 79 20 69 66 20 69 6e  ** the key if in
25380 64 65 78 20 62 74 72 65 65 73 20 28 70 50 61 67  dex btrees (pPag
25390 65 2d 3e 69 6e 74 4b 65 79 3d 3d 30 29 20 61 6e  e->intKey==0) an
253a0 64 20 69 73 20 74 68 65 20 64 61 74 61 20 66 6f  d is the data fo
253b0 72 0a 2a 2a 20 74 61 62 6c 65 20 62 74 72 65 65  r.** table btree
253c0 73 20 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  s (pPage->intKey
253d0 3d 3d 31 29 2e 20 54 68 65 20 6e 75 6d 62 65 72  ==1). The number
253e0 20 6f 66 20 62 79 74 65 73 20 6f 66 20 61 76 61   of bytes of ava
253f0 69 6c 61 62 6c 65 0a 2a 2a 20 6b 65 79 2f 64 61  ilable.** key/da
25400 74 61 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e  ta is written in
25410 74 6f 20 2a 70 41 6d 74 2e 20 20 49 66 20 2a 70  to *pAmt.  If *p
25420 41 6d 74 3d 3d 30 2c 20 74 68 65 6e 20 74 68 65  Amt==0, then the
25430 20 76 61 6c 75 65 0a 2a 2a 20 72 65 74 75 72 6e   value.** return
25440 65 64 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 61  ed will not be a
25450 20 76 61 6c 69 64 20 70 6f 69 6e 74 65 72 2e 0a   valid pointer..
25460 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
25470 6e 65 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a  ne is an optimiz
25480 61 74 69 6f 6e 2e 20 20 49 74 20 69 73 20 63 6f  ation.  It is co
25490 6d 6d 6f 6e 20 66 6f 72 20 74 68 65 20 65 6e 74  mmon for the ent
254a0 69 72 65 20 6b 65 79 0a 2a 2a 20 61 6e 64 20 64  ire key.** and d
254b0 61 74 61 20 74 6f 20 66 69 74 20 6f 6e 20 74 68  ata to fit on th
254c0 65 20 6c 6f 63 61 6c 20 70 61 67 65 20 61 6e 64  e local page and
254d0 20 66 6f 72 20 74 68 65 72 65 20 74 6f 20 62 65   for there to be
254e0 20 6e 6f 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20   no overflow.** 
254f0 70 61 67 65 73 2e 20 20 57 68 65 6e 20 74 68 61  pages.  When tha
25500 74 20 69 73 20 73 6f 2c 20 74 68 69 73 20 72 6f  t is so, this ro
25510 75 74 69 6e 65 20 63 61 6e 20 62 65 20 75 73 65  utine can be use
25520 64 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 0a  d to access the.
25530 2a 2a 20 6b 65 79 20 61 6e 64 20 64 61 74 61 20  ** key and data 
25540 77 69 74 68 6f 75 74 20 6d 61 6b 69 6e 67 20 61  without making a
25550 20 63 6f 70 79 2e 20 20 49 66 20 74 68 65 20 6b   copy.  If the k
25560 65 79 20 61 6e 64 2f 6f 72 20 64 61 74 61 20 73  ey and/or data s
25570 70 69 6c 6c 73 0a 2a 2a 20 6f 6e 74 6f 20 6f 76  pills.** onto ov
25580 65 72 66 6c 6f 77 20 70 61 67 65 73 2c 20 74 68  erflow pages, th
25590 65 6e 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64  en accessPayload
255a0 28 29 20 6d 75 73 74 20 62 65 20 75 73 65 64 20  () must be used 
255b0 74 6f 20 72 65 61 73 73 65 6d 62 6c 65 0a 2a 2a  to reassemble.**
255c0 20 74 68 65 20 6b 65 79 2f 64 61 74 61 20 61 6e   the key/data an
255d0 64 20 63 6f 70 79 20 69 74 20 69 6e 74 6f 20 61  d copy it into a
255e0 20 70 72 65 61 6c 6c 6f 63 61 74 65 64 20 62 75   preallocated bu
255f0 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ffer..**.** The 
25600 70 6f 69 6e 74 65 72 20 72 65 74 75 72 6e 65 64  pointer returned
25610 20 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65   by this routine
25620 20 6c 6f 6f 6b 73 20 64 69 72 65 63 74 6c 79 20   looks directly 
25630 69 6e 74 6f 20 74 68 65 20 63 61 63 68 65 64 0a  into the cached.
25640 2a 2a 20 70 61 67 65 20 6f 66 20 74 68 65 20 64  ** page of the d
25650 61 74 61 62 61 73 65 2e 20 20 54 68 65 20 64 61  atabase.  The da
25660 74 61 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20  ta might change 
25670 6f 72 20 6d 6f 76 65 20 74 68 65 20 6e 65 78 74  or move the next
25680 20 74 69 6d 65 0a 2a 2a 20 61 6e 79 20 62 74 72   time.** any btr
25690 65 65 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  ee routine is ca
256a0 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lled..*/.static 
256b0 63 6f 6e 73 74 20 76 6f 69 64 20 2a 66 65 74 63  const void *fetc
256c0 68 50 61 79 6c 6f 61 64 28 0a 20 20 42 74 43 75  hPayload(.  BtCu
256d0 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20  rsor *pCur,     
256e0 20 2f 2a 20 43 75 72 73 6f 72 20 70 6f 69 6e 74   /* Cursor point
256f0 69 6e 67 20 74 6f 20 65 6e 74 72 79 20 74 6f 20  ing to entry to 
25700 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 75  read from */.  u
25710 33 32 20 2a 70 41 6d 74 20 20 20 20 20 20 20 20  32 *pAmt        
25720 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
25730 20 6e 75 6d 62 65 72 20 6f 66 20 61 76 61 69 6c   number of avail
25740 61 62 6c 65 20 62 79 74 65 73 20 68 65 72 65 20  able bytes here 
25750 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20  */.){.  assert( 
25760 70 43 75 72 21 3d 30 20 26 26 20 70 43 75 72 2d  pCur!=0 && pCur-
25770 3e 69 50 61 67 65 3e 3d 30 20 26 26 20 70 43 75  >iPage>=0 && pCu
25780 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
25790 69 50 61 67 65 5d 29 3b 0a 20 20 61 73 73 65 72  iPage]);.  asser
257a0 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
257b0 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
257c0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
257d0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43  e3_mutex_held(pC
257e0 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e  ur->pBtree->db->
257f0 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
25800 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
25810 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
25820 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69  assert( pCur->ai
25830 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
25840 3c 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43  <pCur->apPage[pC
25850 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c  ur->iPage]->nCel
25860 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  l );.  assert( p
25870 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3e  Cur->info.nSize>
25880 30 20 29 3b 0a 20 20 2a 70 41 6d 74 20 3d 20 70  0 );.  *pAmt = p
25890 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  Cur->info.nLocal
258a0 3b 0a 20 20 72 65 74 75 72 6e 20 28 76 6f 69 64  ;.  return (void
258b0 2a 29 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 50 61  *)pCur->info.pPa
258c0 79 6c 6f 61 64 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  yload;.}.../*.**
258d0 20 46 6f 72 20 74 68 65 20 65 6e 74 72 79 20 74   For the entry t
258e0 68 61 74 20 63 75 72 73 6f 72 20 70 43 75 72 20  hat cursor pCur 
258f0 69 73 20 70 6f 69 6e 74 20 74 6f 2c 20 72 65 74  is point to, ret
25900 75 72 6e 20 61 73 0a 2a 2a 20 6d 61 6e 79 20 62  urn as.** many b
25910 79 74 65 73 20 6f 66 20 74 68 65 20 6b 65 79 20  ytes of the key 
25920 6f 72 20 64 61 74 61 20 61 73 20 61 72 65 20 61  or data as are a
25930 76 61 69 6c 61 62 6c 65 20 6f 6e 20 74 68 65 20  vailable on the 
25940 6c 6f 63 61 6c 0a 2a 2a 20 62 2d 74 72 65 65 20  local.** b-tree 
25950 70 61 67 65 2e 20 20 57 72 69 74 65 20 74 68 65  page.  Write the
25960 20 6e 75 6d 62 65 72 20 6f 66 20 61 76 61 69 6c   number of avail
25970 61 62 6c 65 20 62 79 74 65 73 20 69 6e 74 6f 20  able bytes into 
25980 2a 70 41 6d 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  *pAmt..**.** The
25990 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72 6e 65   pointer returne
259a0 64 20 69 73 20 65 70 68 65 6d 65 72 61 6c 2e 20  d is ephemeral. 
259b0 20 54 68 65 20 6b 65 79 2f 64 61 74 61 20 6d 61   The key/data ma
259c0 79 20 6d 6f 76 65 0a 2a 2a 20 6f 72 20 62 65 20  y move.** or be 
259d0 64 65 73 74 72 6f 79 65 64 20 6f 6e 20 74 68 65  destroyed on the
259e0 20 6e 65 78 74 20 63 61 6c 6c 20 74 6f 20 61 6e   next call to an
259f0 79 20 42 74 72 65 65 20 72 6f 75 74 69 6e 65 2c  y Btree routine,
25a00 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20 63 61  .** including ca
25a10 6c 6c 73 20 66 72 6f 6d 20 6f 74 68 65 72 20 74  lls from other t
25a20 68 72 65 61 64 73 20 61 67 61 69 6e 73 74 20 74  hreads against t
25a30 68 65 20 73 61 6d 65 20 63 61 63 68 65 2e 0a 2a  he same cache..*
25a40 2a 20 48 65 6e 63 65 2c 20 61 20 6d 75 74 65 78  * Hence, a mutex
25a50 20 6f 6e 20 74 68 65 20 42 74 53 68 61 72 65 64   on the BtShared
25a60 20 73 68 6f 75 6c 64 20 62 65 20 68 65 6c 64 20   should be held 
25a70 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67  prior to calling
25a80 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
25a90 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 72 6f  ..**.** These ro
25aa0 75 74 69 6e 65 73 20 69 73 20 75 73 65 64 20 74  utines is used t
25ab0 6f 20 67 65 74 20 71 75 69 63 6b 20 61 63 63 65  o get quick acce
25ac0 73 73 20 74 6f 20 6b 65 79 20 61 6e 64 20 64 61  ss to key and da
25ad0 74 61 0a 2a 2a 20 69 6e 20 74 68 65 20 63 6f 6d  ta.** in the com
25ae0 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20 6e  mon case where n
25af0 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  o overflow pages
25b00 20 61 72 65 20 75 73 65 64 2e 0a 2a 2f 0a 63 6f   are used..*/.co
25b10 6e 73 74 20 76 6f 69 64 20 2a 73 71 6c 69 74 65  nst void *sqlite
25b20 33 42 74 72 65 65 4b 65 79 46 65 74 63 68 28 42  3BtreeKeyFetch(B
25b30 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75  tCursor *pCur, u
25b40 33 32 20 2a 70 41 6d 74 29 7b 0a 20 20 72 65 74  32 *pAmt){.  ret
25b50 75 72 6e 20 66 65 74 63 68 50 61 79 6c 6f 61 64  urn fetchPayload
25b60 28 70 43 75 72 2c 20 70 41 6d 74 29 3b 0a 7d 0a  (pCur, pAmt);.}.
25b70 63 6f 6e 73 74 20 76 6f 69 64 20 2a 73 71 6c 69  const void *sqli
25b80 74 65 33 42 74 72 65 65 44 61 74 61 46 65 74 63  te3BtreeDataFetc
25b90 68 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  h(BtCursor *pCur
25ba0 2c 20 75 33 32 20 2a 70 41 6d 74 29 7b 0a 20 20  , u32 *pAmt){.  
25bb0 72 65 74 75 72 6e 20 66 65 74 63 68 50 61 79 6c  return fetchPayl
25bc0 6f 61 64 28 70 43 75 72 2c 20 70 41 6d 74 29 3b  oad(pCur, pAmt);
25bd0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20  .}.../*.** Move 
25be0 74 68 65 20 63 75 72 73 6f 72 20 64 6f 77 6e 20  the cursor down 
25bf0 74 6f 20 61 20 6e 65 77 20 63 68 69 6c 64 20 70  to a new child p
25c00 61 67 65 2e 20 20 54 68 65 20 6e 65 77 50 67 6e  age.  The newPgn
25c10 6f 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68  o argument is th
25c20 65 0a 2a 2a 20 70 61 67 65 20 6e 75 6d 62 65 72  e.** page number
25c30 20 6f 66 20 74 68 65 20 63 68 69 6c 64 20 70 61   of the child pa
25c40 67 65 20 74 6f 20 6d 6f 76 65 20 74 6f 2e 0a 2a  ge to move to..*
25c50 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
25c60 6f 6e 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  on returns SQLIT
25c70 45 5f 43 4f 52 52 55 50 54 20 69 66 20 74 68 65  E_CORRUPT if the
25c80 20 70 61 67 65 2d 68 65 61 64 65 72 20 66 6c 61   page-header fla
25c90 67 73 20 66 69 65 6c 64 20 6f 66 0a 2a 2a 20 74  gs field of.** t
25ca0 68 65 20 6e 65 77 20 63 68 69 6c 64 20 70 61 67  he new child pag
25cb0 65 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68  e does not match
25cc0 20 74 68 65 20 66 6c 61 67 73 20 66 69 65 6c 64   the flags field
25cd0 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74 20 28   of the parent (
25ce0 69 2e 65 2e 0a 2a 2a 20 69 66 20 61 6e 20 69 6e  i.e..** if an in
25cf0 74 6b 65 79 20 70 61 67 65 20 61 70 70 65 61 72  tkey page appear
25d00 73 20 74 6f 20 62 65 20 74 68 65 20 70 61 72 65  s to be the pare
25d10 6e 74 20 6f 66 20 61 20 6e 6f 6e 2d 69 6e 74 6b  nt of a non-intk
25d20 65 79 20 70 61 67 65 2c 20 6f 72 0a 2a 2a 20 76  ey page, or.** v
25d30 69 63 65 2d 76 65 72 73 61 29 2e 0a 2a 2f 0a 73  ice-versa)..*/.s
25d40 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f  tatic int moveTo
25d50 43 68 69 6c 64 28 42 74 43 75 72 73 6f 72 20 2a  Child(BtCursor *
25d60 70 43 75 72 2c 20 75 33 32 20 6e 65 77 50 67 6e  pCur, u32 newPgn
25d70 6f 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  o){.  int rc;.  
25d80 69 6e 74 20 69 20 3d 20 70 43 75 72 2d 3e 69 50  int i = pCur->iP
25d90 61 67 65 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  age;.  MemPage *
25da0 70 4e 65 77 50 61 67 65 3b 0a 20 20 42 74 53 68  pNewPage;.  BtSh
25db0 61 72 65 64 20 2a 70 42 74 20 3d 20 70 43 75 72  ared *pBt = pCur
25dc0 2d 3e 70 42 74 3b 0a 0a 20 20 61 73 73 65 72 74  ->pBt;..  assert
25dd0 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
25de0 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ex(pCur) );.  as
25df0 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
25e00 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
25e10 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
25e20 75 72 2d 3e 69 50 61 67 65 3c 42 54 43 55 52 53  ur->iPage<BTCURS
25e30 4f 52 5f 4d 41 58 5f 44 45 50 54 48 20 29 3b 0a  OR_MAX_DEPTH );.
25e40 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
25e50 69 50 61 67 65 3e 3d 30 20 29 3b 0a 20 20 69 66  iPage>=0 );.  if
25e60 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 28  ( pCur->iPage>=(
25e70 42 54 43 55 52 53 4f 52 5f 4d 41 58 5f 44 45 50  BTCURSOR_MAX_DEP
25e80 54 48 2d 31 29 20 29 7b 0a 20 20 20 20 72 65 74  TH-1) ){.    ret
25e90 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
25ea0 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72  PT_BKPT;.  }.  r
25eb0 63 20 3d 20 67 65 74 41 6e 64 49 6e 69 74 50 61  c = getAndInitPa
25ec0 67 65 28 70 42 74 2c 20 6e 65 77 50 67 6e 6f 2c  ge(pBt, newPgno,
25ed0 20 26 70 4e 65 77 50 61 67 65 2c 0a 20 20 20 20   &pNewPage,.    
25ee0 20 20 20 20 20 20 20 20 20 20 20 28 70 43 75 72             (pCur
25ef0 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43  ->curFlags & BTC
25f00 46 5f 57 72 69 74 65 46 6c 61 67 29 3d 3d 30 20  F_WriteFlag)==0 
25f10 3f 20 50 41 47 45 52 5f 47 45 54 5f 52 45 41 44  ? PAGER_GET_READ
25f20 4f 4e 4c 59 20 3a 20 30 29 3b 0a 20 20 69 66 28  ONLY : 0);.  if(
25f30 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
25f40 0a 20 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  .  pCur->apPage[
25f50 69 2b 31 5d 20 3d 20 70 4e 65 77 50 61 67 65 3b  i+1] = pNewPage;
25f60 0a 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 69  .  pCur->aiIdx[i
25f70 2b 31 5d 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d  +1] = 0;.  pCur-
25f80 3e 69 50 61 67 65 2b 2b 3b 0a 0a 20 20 70 43 75  >iPage++;..  pCu
25f90 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20  r->info.nSize = 
25fa0 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72 46 6c  0;.  pCur->curFl
25fb0 61 67 73 20 26 3d 20 7e 28 42 54 43 46 5f 56 61  ags &= ~(BTCF_Va
25fc0 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56 61 6c  lidNKey|BTCF_Val
25fd0 69 64 4f 76 66 6c 29 3b 0a 20 20 69 66 28 20 70  idOvfl);.  if( p
25fe0 4e 65 77 50 61 67 65 2d 3e 6e 43 65 6c 6c 3c 31  NewPage->nCell<1
25ff0 20 7c 7c 20 70 4e 65 77 50 61 67 65 2d 3e 69 6e   || pNewPage->in
26000 74 4b 65 79 21 3d 70 43 75 72 2d 3e 61 70 50 61  tKey!=pCur->apPa
26010 67 65 5b 69 5d 2d 3e 69 6e 74 4b 65 79 20 29 7b  ge[i]->intKey ){
26020 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
26030 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
26040 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
26050 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20  LITE_OK;.}..#if 
26060 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a  SQLITE_DEBUG./*.
26070 2a 2a 20 50 61 67 65 20 70 50 61 72 65 6e 74 20  ** Page pParent 
26080 69 73 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 28  is an internal (
26090 6e 6f 6e 2d 6c 65 61 66 29 20 74 72 65 65 20 70  non-leaf) tree p
260a0 61 67 65 2e 20 54 68 69 73 20 66 75 6e 63 74 69  age. This functi
260b0 6f 6e 20 0a 2a 2a 20 61 73 73 65 72 74 73 20 74  on .** asserts t
260c0 68 61 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20  hat page number 
260d0 69 43 68 69 6c 64 20 69 73 20 74 68 65 20 6c 65  iChild is the le
260e0 66 74 2d 63 68 69 6c 64 20 69 66 20 74 68 65 20  ft-child if the 
260f0 69 49 64 78 27 74 68 0a 2a 2a 20 63 65 6c 6c 20  iIdx'th.** cell 
26100 69 6e 20 70 61 67 65 20 70 50 61 72 65 6e 74 2e  in page pParent.
26110 20 4f 72 2c 20 69 66 20 69 49 64 78 20 69 73 20   Or, if iIdx is 
26120 65 71 75 61 6c 20 74 6f 20 74 68 65 20 74 6f 74  equal to the tot
26130 61 6c 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20  al number of.** 
26140 63 65 6c 6c 73 20 69 6e 20 70 50 61 72 65 6e 74  cells in pParent
26150 2c 20 74 68 61 74 20 70 61 67 65 20 6e 75 6d 62  , that page numb
26160 65 72 20 69 43 68 69 6c 64 20 69 73 20 74 68 65  er iChild is the
26170 20 72 69 67 68 74 2d 63 68 69 6c 64 20 6f 66 0a   right-child of.
26180 2a 2a 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a  ** the page..*/.
26190 73 74 61 74 69 63 20 76 6f 69 64 20 61 73 73 65  static void asse
261a0 72 74 50 61 72 65 6e 74 49 6e 64 65 78 28 4d 65  rtParentIndex(Me
261b0 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74 2c 20  mPage *pParent, 
261c0 69 6e 74 20 69 49 64 78 2c 20 50 67 6e 6f 20 69  int iIdx, Pgno i
261d0 43 68 69 6c 64 29 7b 0a 20 20 69 66 28 20 43 4f  Child){.  if( CO
261e0 52 52 55 50 54 5f 44 42 20 29 20 72 65 74 75 72  RRUPT_DB ) retur
261f0 6e 3b 20 20 2f 2a 20 54 68 65 20 63 6f 6e 64 69  n;  /* The condi
26200 74 69 6f 6e 73 20 74 65 73 74 65 64 20 62 65 6c  tions tested bel
26210 6f 77 20 6d 69 67 68 74 20 6e 6f 74 20 62 65 20  ow might not be 
26220 74 72 75 65 0a 20 20 20 20 20 20 20 20 20 20 20  true.           
26230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26240 20 2a 2a 20 69 6e 20 61 20 63 6f 72 72 75 70 74   ** in a corrupt
26250 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 61   database */.  a
26260 73 73 65 72 74 28 20 69 49 64 78 3c 3d 70 50 61  ssert( iIdx<=pPa
26270 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  rent->nCell );. 
26280 20 69 66 28 20 69 49 64 78 3d 3d 70 50 61 72 65   if( iIdx==pPare
26290 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20  nt->nCell ){.   
262a0 20 61 73 73 65 72 74 28 20 67 65 74 34 62 79 74   assert( get4byt
262b0 65 28 26 70 50 61 72 65 6e 74 2d 3e 61 44 61 74  e(&pParent->aDat
262c0 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66  a[pParent->hdrOf
262d0 66 73 65 74 2b 38 5d 29 3d 3d 69 43 68 69 6c 64  fset+8])==iChild
262e0 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   );.  }else{.   
262f0 20 61 73 73 65 72 74 28 20 67 65 74 34 62 79 74   assert( get4byt
26300 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 72 65  e(findCell(pPare
26310 6e 74 2c 20 69 49 64 78 29 29 3d 3d 69 43 68 69  nt, iIdx))==iChi
26320 6c 64 20 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73  ld );.  }.}.#els
26330 65 0a 23 20 20 64 65 66 69 6e 65 20 61 73 73 65  e.#  define asse
26340 72 74 50 61 72 65 6e 74 49 6e 64 65 78 28 78 2c  rtParentIndex(x,
26350 79 2c 7a 29 20 0a 23 65 6e 64 69 66 0a 0a 2f 2a  y,z) .#endif../*
26360 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72  .** Move the cur
26370 73 6f 72 20 75 70 20 74 6f 20 74 68 65 20 70 61  sor up to the pa
26380 72 65 6e 74 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a  rent page..**.**
26390 20 70 43 75 72 2d 3e 69 64 78 20 69 73 20 73 65   pCur->idx is se
263a0 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 69 6e  t to the cell in
263b0 64 65 78 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  dex that contain
263c0 73 20 74 68 65 20 70 6f 69 6e 74 65 72 0a 2a 2a  s the pointer.**
263d0 20 74 6f 20 74 68 65 20 70 61 67 65 20 77 65 20   to the page we 
263e0 61 72 65 20 63 6f 6d 69 6e 67 20 66 72 6f 6d 2e  are coming from.
263f0 20 20 49 66 20 77 65 20 61 72 65 20 63 6f 6d 69    If we are comi
26400 6e 67 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 72  ng from the.** r
26410 69 67 68 74 2d 6d 6f 73 74 20 63 68 69 6c 64 20  ight-most child 
26420 70 61 67 65 20 74 68 65 6e 20 70 43 75 72 2d 3e  page then pCur->
26430 69 64 78 20 69 73 20 73 65 74 20 74 6f 20 6f 6e  idx is set to on
26440 65 20 6d 6f 72 65 20 74 68 61 6e 0a 2a 2a 20 74  e more than.** t
26450 68 65 20 6c 61 72 67 65 73 74 20 63 65 6c 6c 20  he largest cell 
26460 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63  index..*/.static
26470 20 76 6f 69 64 20 6d 6f 76 65 54 6f 50 61 72 65   void moveToPare
26480 6e 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  nt(BtCursor *pCu
26490 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75  r){.  assert( cu
264a0 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
264b0 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
264c0 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
264d0 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
264e0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
264f0 69 50 61 67 65 3e 30 20 29 3b 0a 20 20 61 73 73  iPage>0 );.  ass
26500 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67  ert( pCur->apPag
26510 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 29  e[pCur->iPage] )
26520 3b 0a 20 20 61 73 73 65 72 74 50 61 72 65 6e 74  ;.  assertParent
26530 49 6e 64 65 78 28 0a 20 20 20 20 70 43 75 72 2d  Index(.    pCur-
26540 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
26550 61 67 65 2d 31 5d 2c 20 0a 20 20 20 20 70 43 75  age-1], .    pCu
26560 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
26570 50 61 67 65 2d 31 5d 2c 20 0a 20 20 20 20 70 43  Page-1], .    pC
26580 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
26590 3e 69 50 61 67 65 5d 2d 3e 70 67 6e 6f 0a 20 20  >iPage]->pgno.  
265a0 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70  );.  testcase( p
265b0 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
265c0 3e 69 50 61 67 65 2d 31 5d 20 3e 20 70 43 75 72  >iPage-1] > pCur
265d0 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
265e0 50 61 67 65 2d 31 5d 2d 3e 6e 43 65 6c 6c 20 29  Page-1]->nCell )
265f0 3b 0a 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65  ;..  releasePage
26600 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43  (pCur->apPage[pC
26610 75 72 2d 3e 69 50 61 67 65 5d 29 3b 0a 20 20 70  ur->iPage]);.  p
26620 43 75 72 2d 3e 69 50 61 67 65 2d 2d 3b 0a 20 20  Cur->iPage--;.  
26630 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
26640 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75   = 0;.  pCur->cu
26650 72 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 43 46  rFlags &= ~(BTCF
26660 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f  _ValidNKey|BTCF_
26670 56 61 6c 69 64 4f 76 66 6c 29 3b 0a 7d 0a 0a 2f  ValidOvfl);.}../
26680 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75  *.** Move the cu
26690 72 73 6f 72 20 74 6f 20 70 6f 69 6e 74 20 74 6f  rsor to point to
266a0 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f   the root page o
266b0 66 20 69 74 73 20 62 2d 74 72 65 65 20 73 74 72  f its b-tree str
266c0 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  ucture..**.** If
266d0 20 74 68 65 20 74 61 62 6c 65 20 68 61 73 20 61   the table has a
266e0 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61   virtual root pa
266f0 67 65 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72  ge, then the cur
26700 73 6f 72 20 69 73 20 6d 6f 76 65 64 20 74 6f 20  sor is moved to 
26710 70 6f 69 6e 74 0a 2a 2a 20 74 6f 20 74 68 65 20  point.** to the 
26720 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61 67  virtual root pag
26730 65 20 69 6e 73 74 65 61 64 20 6f 66 20 74 68 65  e instead of the
26740 20 61 63 74 75 61 6c 20 72 6f 6f 74 20 70 61 67   actual root pag
26750 65 2e 20 41 20 74 61 62 6c 65 20 68 61 73 20 61  e. A table has a
26760 0a 2a 2a 20 76 69 72 74 75 61 6c 20 72 6f 6f 74  .** virtual root
26770 20 70 61 67 65 20 77 68 65 6e 20 74 68 65 20 61   page when the a
26780 63 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 20  ctual root page 
26790 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 63 65 6c 6c  contains no cell
267a0 73 20 61 6e 64 20 61 20 0a 2a 2a 20 73 69 6e 67  s and a .** sing
267b0 6c 65 20 63 68 69 6c 64 20 70 61 67 65 2e 20 54  le child page. T
267c0 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70  his can only hap
267d0 70 65 6e 20 77 69 74 68 20 74 68 65 20 74 61 62  pen with the tab
267e0 6c 65 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67  le rooted at pag
267f0 65 20 31 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  e 1..**.** If th
26800 65 20 62 2d 74 72 65 65 20 73 74 72 75 63 74 75  e b-tree structu
26810 72 65 20 69 73 20 65 6d 70 74 79 2c 20 74 68 65  re is empty, the
26820 20 63 75 72 73 6f 72 20 73 74 61 74 65 20 69 73   cursor state is
26830 20 73 65 74 20 74 6f 20 0a 2a 2a 20 43 55 52 53   set to .** CURS
26840 4f 52 5f 49 4e 56 41 4c 49 44 2e 20 4f 74 68 65  OR_INVALID. Othe
26850 72 77 69 73 65 2c 20 74 68 65 20 63 75 72 73 6f  rwise, the curso
26860 72 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e  r is set to poin
26870 74 20 74 6f 20 74 68 65 20 66 69 72 73 74 0a 2a  t to the first.*
26880 2a 20 63 65 6c 6c 20 6c 6f 63 61 74 65 64 20 6f  * cell located o
26890 6e 20 74 68 65 20 72 6f 6f 74 20 28 6f 72 20 76  n the root (or v
268a0 69 72 74 75 61 6c 20 72 6f 6f 74 29 20 70 61 67  irtual root) pag
268b0 65 20 61 6e 64 20 74 68 65 20 63 75 72 73 6f 72  e and the cursor
268c0 20 73 74 61 74 65 0a 2a 2a 20 69 73 20 73 65 74   state.** is set
268d0 20 74 6f 20 43 55 52 53 4f 52 5f 56 41 4c 49 44   to CURSOR_VALID
268e0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20  ..**.** If this 
268f0 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
26900 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 69   successfully, i
26910 74 20 6d 61 79 20 62 65 20 61 73 73 75 6d 65 64  t may be assumed
26920 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 70 61 67   that the.** pag
26930 65 2d 68 65 61 64 65 72 20 66 6c 61 67 73 20 69  e-header flags i
26940 6e 64 69 63 61 74 65 20 74 68 61 74 20 74 68 65  ndicate that the
26950 20 5b 76 69 72 74 75 61 6c 5d 20 72 6f 6f 74 2d   [virtual] root-
26960 70 61 67 65 20 69 73 20 74 68 65 20 65 78 70 65  page is the expe
26970 63 74 65 64 20 0a 2a 2a 20 6b 69 6e 64 20 6f 66  cted .** kind of
26980 20 62 2d 74 72 65 65 20 70 61 67 65 20 28 69 2e   b-tree page (i.
26990 65 2e 20 69 66 20 77 68 65 6e 20 6f 70 65 6e 69  e. if when openi
269a0 6e 67 20 74 68 65 20 63 75 72 73 6f 72 20 74 68  ng the cursor th
269b0 65 20 63 61 6c 6c 65 72 20 64 69 64 20 6e 6f 74  e caller did not
269c0 0a 2a 2a 20 73 70 65 63 69 66 79 20 61 20 4b 65  .** specify a Ke
269d0 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  yInfo structure 
269e0 74 68 65 20 66 6c 61 67 73 20 62 79 74 65 20 69  the flags byte i
269f0 73 20 73 65 74 20 74 6f 20 30 78 30 35 20 6f 72  s set to 0x05 or
26a00 20 30 78 30 44 2c 0a 2a 2a 20 69 6e 64 69 63 61   0x0D,.** indica
26a10 74 69 6e 67 20 61 20 74 61 62 6c 65 20 62 2d 74  ting a table b-t
26a20 72 65 65 2c 20 6f 72 20 69 66 20 74 68 65 20 63  ree, or if the c
26a30 61 6c 6c 65 72 20 64 69 64 20 73 70 65 63 69 66  aller did specif
26a40 79 20 61 20 4b 65 79 49 6e 66 6f 20 0a 2a 2a 20  y a KeyInfo .** 
26a50 73 74 72 75 63 74 75 72 65 20 74 68 65 20 66 6c  structure the fl
26a60 61 67 73 20 62 79 74 65 20 69 73 20 73 65 74 20  ags byte is set 
26a70 74 6f 20 30 78 30 32 20 6f 72 20 30 78 30 41 2c  to 0x02 or 0x0A,
26a80 20 69 6e 64 69 63 61 74 69 6e 67 20 61 6e 20 69   indicating an i
26a90 6e 64 65 78 0a 2a 2a 20 62 2d 74 72 65 65 29 2e  ndex.** b-tree).
26aa0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d  .*/.static int m
26ab0 6f 76 65 54 6f 52 6f 6f 74 28 42 74 43 75 72 73  oveToRoot(BtCurs
26ac0 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 4d 65 6d  or *pCur){.  Mem
26ad0 50 61 67 65 20 2a 70 52 6f 6f 74 3b 0a 20 20 69  Page *pRoot;.  i
26ae0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
26af0 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  K;..  assert( cu
26b00 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
26b10 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
26b20 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  ( CURSOR_INVALID
26b30 20 3c 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52   < CURSOR_REQUIR
26b40 45 53 45 45 4b 20 29 3b 0a 20 20 61 73 73 65 72  ESEEK );.  asser
26b50 74 28 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  t( CURSOR_VALID 
26b60 20 20 3c 20 43 55 52 53 4f 52 5f 52 45 51 55 49    < CURSOR_REQUI
26b70 52 45 53 45 45 4b 20 29 3b 0a 20 20 61 73 73 65  RESEEK );.  asse
26b80 72 74 28 20 43 55 52 53 4f 52 5f 46 41 55 4c 54  rt( CURSOR_FAULT
26b90 20 20 20 3e 20 43 55 52 53 4f 52 5f 52 45 51 55     > CURSOR_REQU
26ba0 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 69 66 28  IRESEEK );.  if(
26bb0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3e 3d 43   pCur->eState>=C
26bc0 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45  URSOR_REQUIRESEE
26bd0 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75  K ){.    if( pCu
26be0 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
26bf0 52 5f 46 41 55 4c 54 20 29 7b 0a 20 20 20 20 20  R_FAULT ){.     
26c00 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 73   assert( pCur->s
26c10 6b 69 70 4e 65 78 74 21 3d 53 51 4c 49 54 45 5f  kipNext!=SQLITE_
26c20 4f 4b 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75  OK );.      retu
26c30 72 6e 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78  rn pCur->skipNex
26c40 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  t;.    }.    sql
26c50 69 74 65 33 42 74 72 65 65 43 6c 65 61 72 43 75  ite3BtreeClearCu
26c60 72 73 6f 72 28 70 43 75 72 29 3b 0a 20 20 7d 0a  rsor(pCur);.  }.
26c70 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61  .  if( pCur->iPa
26c80 67 65 3e 3d 30 20 29 7b 0a 20 20 20 20 77 68 69  ge>=0 ){.    whi
26c90 6c 65 28 20 70 43 75 72 2d 3e 69 50 61 67 65 20  le( pCur->iPage 
26ca0 29 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 43  ) releasePage(pC
26cb0 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
26cc0 3e 69 50 61 67 65 2d 2d 5d 29 3b 0a 20 20 7d 65  >iPage--]);.  }e
26cd0 6c 73 65 20 69 66 28 20 70 43 75 72 2d 3e 70 67  lse if( pCur->pg
26ce0 6e 6f 52 6f 6f 74 3d 3d 30 20 29 7b 0a 20 20 20  noRoot==0 ){.   
26cf0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
26d00 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a  CURSOR_INVALID;.
26d10 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
26d20 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  E_OK;.  }else{. 
26d30 20 20 20 72 63 20 3d 20 67 65 74 41 6e 64 49 6e     rc = getAndIn
26d40 69 74 50 61 67 65 28 70 43 75 72 2d 3e 70 42 74  itPage(pCur->pBt
26d50 72 65 65 2d 3e 70 42 74 2c 20 70 43 75 72 2d 3e  ree->pBt, pCur->
26d60 70 67 6e 6f 52 6f 6f 74 2c 20 26 70 43 75 72 2d  pgnoRoot, &pCur-
26d70 3e 61 70 50 61 67 65 5b 30 5d 2c 0a 20 20 20 20  >apPage[0],.    
26d80 20 20 20 20 20 20 20 20 20 20 20 20 20 28 70 43               (pC
26d90 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42  ur->curFlags & B
26da0 54 43 46 5f 57 72 69 74 65 46 6c 61 67 29 3d 3d  TCF_WriteFlag)==
26db0 30 20 3f 20 50 41 47 45 52 5f 47 45 54 5f 52 45  0 ? PAGER_GET_RE
26dc0 41 44 4f 4e 4c 59 20 3a 20 30 29 3b 0a 20 20 20  ADONLY : 0);.   
26dd0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
26de0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72  OK ){.      pCur
26df0 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
26e00 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20  R_INVALID;.     
26e10 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
26e20 7d 0a 20 20 20 20 70 43 75 72 2d 3e 69 50 61 67  }.    pCur->iPag
26e30 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 52 6f  e = 0;.  }.  pRo
26e40 6f 74 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67  ot = pCur->apPag
26e50 65 5b 30 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  e[0];.  assert( 
26e60 70 52 6f 6f 74 2d 3e 70 67 6e 6f 3d 3d 70 43 75  pRoot->pgno==pCu
26e70 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20 29 3b 0a 0a  r->pgnoRoot );..
26e80 20 20 2f 2a 20 49 66 20 70 43 75 72 2d 3e 70 4b    /* If pCur->pK
26e90 65 79 49 6e 66 6f 20 69 73 20 6e 6f 74 20 4e 55  eyInfo is not NU
26ea0 4c 4c 2c 20 74 68 65 6e 20 74 68 65 20 63 61 6c  LL, then the cal
26eb0 6c 65 72 20 74 68 61 74 20 6f 70 65 6e 65 64 20  ler that opened 
26ec0 74 68 69 73 20 63 75 72 73 6f 72 0a 20 20 2a 2a  this cursor.  **
26ed0 20 65 78 70 65 63 74 65 64 20 74 6f 20 6f 70 65   expected to ope
26ee0 6e 20 69 74 20 6f 6e 20 61 6e 20 69 6e 64 65 78  n it on an index
26ef0 20 62 2d 74 72 65 65 2e 20 4f 74 68 65 72 77 69   b-tree. Otherwi
26f00 73 65 2c 20 69 66 20 70 4b 65 79 49 6e 66 6f 20  se, if pKeyInfo 
26f10 69 73 0a 20 20 2a 2a 20 4e 55 4c 4c 2c 20 74 68  is.  ** NULL, th
26f20 65 20 63 61 6c 6c 65 72 20 65 78 70 65 63 74 73  e caller expects
26f30 20 61 20 74 61 62 6c 65 20 62 2d 74 72 65 65 2e   a table b-tree.
26f40 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20   If this is not 
26f50 74 68 65 20 63 61 73 65 2c 0a 20 20 2a 2a 20 72  the case,.  ** r
26f60 65 74 75 72 6e 20 61 6e 20 53 51 4c 49 54 45 5f  eturn an SQLITE_
26f70 43 4f 52 52 55 50 54 20 65 72 72 6f 72 2e 20 0a  CORRUPT error. .
26f80 20 20 2a 2a 0a 20 20 2a 2a 20 45 61 72 6c 69 65    **.  ** Earlie
26f90 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51  r versions of SQ
26fa0 4c 69 74 65 20 61 73 73 75 6d 65 64 20 74 68 61  Lite assumed tha
26fb0 74 20 74 68 69 73 20 74 65 73 74 20 63 6f 75 6c  t this test coul
26fc0 64 20 6e 6f 74 20 66 61 69 6c 0a 20 20 2a 2a 20  d not fail.  ** 
26fd0 69 66 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  if the root page
26fe0 20 77 61 73 20 61 6c 72 65 61 64 79 20 6c 6f 61   was already loa
26ff0 64 65 64 20 77 68 65 6e 20 74 68 69 73 20 66 75  ded when this fu
27000 6e 63 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65  nction was calle
27010 64 20 28 69 2e 65 2e 0a 20 20 2a 2a 20 69 66 20  d (i.e..  ** if 
27020 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 29 2e  pCur->iPage>=0).
27030 20 42 75 74 20 74 68 69 73 20 69 73 20 6e 6f 74   But this is not
27040 20 73 6f 20 69 66 20 74 68 65 20 64 61 74 61 62   so if the datab
27050 61 73 65 20 69 73 20 63 6f 72 72 75 70 74 65 64  ase is corrupted
27060 20 0a 20 20 2a 2a 20 69 6e 20 73 75 63 68 20 61   .  ** in such a
27070 20 77 61 79 20 74 68 61 74 20 70 61 67 65 20 70   way that page p
27080 52 6f 6f 74 20 69 73 20 6c 69 6e 6b 65 64 20 69  Root is linked i
27090 6e 74 6f 20 61 20 73 65 63 6f 6e 64 20 62 2d 74  nto a second b-t
270a0 72 65 65 20 74 61 62 6c 65 20 0a 20 20 2a 2a 20  ree table .  ** 
270b0 28 6f 72 20 74 68 65 20 66 72 65 65 6c 69 73 74  (or the freelist
270c0 29 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ).  */.  assert(
270d0 20 70 52 6f 6f 74 2d 3e 69 6e 74 4b 65 79 3d 3d   pRoot->intKey==
270e0 31 20 7c 7c 20 70 52 6f 6f 74 2d 3e 69 6e 74 4b  1 || pRoot->intK
270f0 65 79 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  ey==0 );.  if( p
27100 52 6f 6f 74 2d 3e 69 73 49 6e 69 74 3d 3d 30 20  Root->isInit==0 
27110 7c 7c 20 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e  || (pCur->pKeyIn
27120 66 6f 3d 3d 30 29 21 3d 70 52 6f 6f 74 2d 3e 69  fo==0)!=pRoot->i
27130 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 72 65 74  ntKey ){.    ret
27140 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
27150 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20  PT_BKPT;.  }..  
27160 70 43 75 72 2d 3e 61 69 49 64 78 5b 30 5d 20 3d  pCur->aiIdx[0] =
27170 20 30 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f   0;.  pCur->info
27180 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43  .nSize = 0;.  pC
27190 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20  ur->curFlags &= 
271a0 7e 28 42 54 43 46 5f 41 74 4c 61 73 74 7c 42 54  ~(BTCF_AtLast|BT
271b0 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43  CF_ValidNKey|BTC
271c0 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3b 0a 0a 20  F_ValidOvfl);.. 
271d0 20 69 66 28 20 70 52 6f 6f 74 2d 3e 6e 43 65 6c   if( pRoot->nCel
271e0 6c 3e 30 20 29 7b 0a 20 20 20 20 70 43 75 72 2d  l>0 ){.    pCur-
271f0 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
27200 5f 56 41 4c 49 44 3b 0a 20 20 7d 65 6c 73 65 20  _VALID;.  }else 
27210 69 66 28 20 21 70 52 6f 6f 74 2d 3e 6c 65 61 66  if( !pRoot->leaf
27220 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 73 75 62   ){.    Pgno sub
27230 70 61 67 65 3b 0a 20 20 20 20 69 66 28 20 70 52  page;.    if( pR
27240 6f 6f 74 2d 3e 70 67 6e 6f 21 3d 31 20 29 20 72  oot->pgno!=1 ) r
27250 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
27260 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 73  RUPT_BKPT;.    s
27270 75 62 70 61 67 65 20 3d 20 67 65 74 34 62 79 74  ubpage = get4byt
27280 65 28 26 70 52 6f 6f 74 2d 3e 61 44 61 74 61 5b  e(&pRoot->aData[
27290 70 52 6f 6f 74 2d 3e 68 64 72 4f 66 66 73 65 74  pRoot->hdrOffset
272a0 2b 38 5d 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e  +8]);.    pCur->
272b0 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
272c0 56 41 4c 49 44 3b 0a 20 20 20 20 72 63 20 3d 20  VALID;.    rc = 
272d0 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72  moveToChild(pCur
272e0 2c 20 73 75 62 70 61 67 65 29 3b 0a 20 20 7d 65  , subpage);.  }e
272f0 6c 73 65 7b 0a 20 20 20 20 70 43 75 72 2d 3e 65  lse{.    pCur->e
27300 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49  State = CURSOR_I
27310 4e 56 41 4c 49 44 3b 0a 20 20 7d 0a 20 20 72 65  NVALID;.  }.  re
27320 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
27330 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f  * Move the curso
27340 72 20 64 6f 77 6e 20 74 6f 20 74 68 65 20 6c 65  r down to the le
27350 66 74 2d 6d 6f 73 74 20 6c 65 61 66 20 65 6e 74  ft-most leaf ent
27360 72 79 20 62 65 6e 65 61 74 68 20 74 68 65 0a 2a  ry beneath the.*
27370 2a 20 65 6e 74 72 79 20 74 6f 20 77 68 69 63 68  * entry to which
27380 20 69 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79   it is currently
27390 20 70 6f 69 6e 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a   pointing..**.**
273a0 20 54 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 6c   The left-most l
273b0 65 61 66 20 69 73 20 74 68 65 20 6f 6e 65 20 77  eaf is the one w
273c0 69 74 68 20 74 68 65 20 73 6d 61 6c 6c 65 73 74  ith the smallest
273d0 20 6b 65 79 20 2d 20 74 68 65 20 66 69 72 73 74   key - the first
273e0 0a 2a 2a 20 69 6e 20 61 73 63 65 6e 64 69 6e 67  .** in ascending
273f0 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69   order..*/.stati
27400 63 20 69 6e 74 20 6d 6f 76 65 54 6f 4c 65 66 74  c int moveToLeft
27410 6d 6f 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70  most(BtCursor *p
27420 43 75 72 29 7b 0a 20 20 50 67 6e 6f 20 70 67 6e  Cur){.  Pgno pgn
27430 6f 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  o;.  int rc = SQ
27440 4c 49 54 45 5f 4f 4b 3b 0a 20 20 4d 65 6d 50 61  LITE_OK;.  MemPa
27450 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73  ge *pPage;..  as
27460 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
27470 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
27480 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
27490 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
274a0 41 4c 49 44 20 29 3b 0a 20 20 77 68 69 6c 65 28  ALID );.  while(
274b0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
274c0 26 20 21 28 70 50 61 67 65 20 3d 20 70 43 75 72  & !(pPage = pCur
274d0 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
274e0 50 61 67 65 5d 29 2d 3e 6c 65 61 66 20 29 7b 0a  Page])->leaf ){.
274f0 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
27500 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
27510 61 67 65 5d 3c 70 50 61 67 65 2d 3e 6e 43 65 6c  age]<pPage->nCel
27520 6c 20 29 3b 0a 20 20 20 20 70 67 6e 6f 20 3d 20  l );.    pgno = 
27530 67 65 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c  get4byte(findCel
27540 6c 28 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 61  l(pPage, pCur->a
27550 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
27560 5d 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f  ]));.    rc = mo
27570 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20  veToChild(pCur, 
27580 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74  pgno);.  }.  ret
27590 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
275a0 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72   Move the cursor
275b0 20 64 6f 77 6e 20 74 6f 20 74 68 65 20 72 69 67   down to the rig
275c0 68 74 2d 6d 6f 73 74 20 6c 65 61 66 20 65 6e 74  ht-most leaf ent
275d0 72 79 20 62 65 6e 65 61 74 68 20 74 68 65 0a 2a  ry beneath the.*
275e0 2a 20 70 61 67 65 20 74 6f 20 77 68 69 63 68 20  * page to which 
275f0 69 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  it is currently 
27600 70 6f 69 6e 74 69 6e 67 2e 20 20 4e 6f 74 69 63  pointing.  Notic
27610 65 20 74 68 65 20 64 69 66 66 65 72 65 6e 63 65  e the difference
27620 0a 2a 2a 20 62 65 74 77 65 65 6e 20 6d 6f 76 65  .** between move
27630 54 6f 4c 65 66 74 6d 6f 73 74 28 29 20 61 6e 64  ToLeftmost() and
27640 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74   moveToRightmost
27650 28 29 2e 20 20 6d 6f 76 65 54 6f 4c 65 66 74 6d  ().  moveToLeftm
27660 6f 73 74 28 29 0a 2a 2a 20 66 69 6e 64 73 20 74  ost().** finds t
27670 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 65 6e 74  he left-most ent
27680 72 79 20 62 65 6e 65 61 74 68 20 74 68 65 20 2a  ry beneath the *
27690 65 6e 74 72 79 2a 20 77 68 65 72 65 61 73 20 6d  entry* whereas m
276a0 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 29  oveToRightmost()
276b0 0a 2a 2a 20 66 69 6e 64 73 20 74 68 65 20 72 69  .** finds the ri
276c0 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 62  ght-most entry b
276d0 65 6e 65 61 74 68 20 74 68 65 20 2a 70 61 67 65  eneath the *page
276e0 2a 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 69 67  *..**.** The rig
276f0 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 69 73  ht-most entry is
27700 20 74 68 65 20 6f 6e 65 20 77 69 74 68 20 74 68   the one with th
27710 65 20 6c 61 72 67 65 73 74 20 6b 65 79 20 2d 20  e largest key - 
27720 74 68 65 20 6c 61 73 74 0a 2a 2a 20 6b 65 79 20  the last.** key 
27730 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64  in ascending ord
27740 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  er..*/.static in
27750 74 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73  t moveToRightmos
27760 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  t(BtCursor *pCur
27770 29 7b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a  ){.  Pgno pgno;.
27780 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
27790 45 5f 4f 4b 3b 0a 20 20 4d 65 6d 50 61 67 65 20  E_OK;.  MemPage 
277a0 2a 70 50 61 67 65 20 3d 20 30 3b 0a 0a 20 20 61  *pPage = 0;..  a
277b0 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
277c0 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
277d0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
277e0 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
277f0 56 41 4c 49 44 20 29 3b 0a 20 20 77 68 69 6c 65  VALID );.  while
27800 28 20 21 28 70 50 61 67 65 20 3d 20 70 43 75 72  ( !(pPage = pCur
27810 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
27820 50 61 67 65 5d 29 2d 3e 6c 65 61 66 20 29 7b 0a  Page])->leaf ){.
27830 20 20 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62      pgno = get4b
27840 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74  yte(&pPage->aDat
27850 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
27860 65 74 2b 38 5d 29 3b 0a 20 20 20 20 70 43 75 72  et+8]);.    pCur
27870 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
27880 61 67 65 5d 20 3d 20 70 50 61 67 65 2d 3e 6e 43  age] = pPage->nC
27890 65 6c 6c 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f  ell;.    rc = mo
278a0 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20  veToChild(pCur, 
278b0 70 67 6e 6f 29 3b 0a 20 20 20 20 69 66 28 20 72  pgno);.    if( r
278c0 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
278d0 20 7d 0a 20 20 70 43 75 72 2d 3e 61 69 49 64 78   }.  pCur->aiIdx
278e0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20  [pCur->iPage] = 
278f0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a  pPage->nCell-1;.
27900 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
27910 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 3b  info.nSize==0 );
27920 0a 20 20 61 73 73 65 72 74 28 20 28 70 43 75 72  .  assert( (pCur
27930 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43  ->curFlags & BTC
27940 46 5f 56 61 6c 69 64 4e 4b 65 79 29 3d 3d 30 20  F_ValidNKey)==0 
27950 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
27960 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76  TE_OK;.}../* Mov
27970 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20  e the cursor to 
27980 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 20  the first entry 
27990 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52  in the table.  R
279a0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a  eturn SQLITE_OK.
279b0 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20  ** on success.  
279c0 53 65 74 20 2a 70 52 65 73 20 74 6f 20 30 20 69  Set *pRes to 0 i
279d0 66 20 74 68 65 20 63 75 72 73 6f 72 20 61 63 74  f the cursor act
279e0 75 61 6c 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20  ually points to 
279f0 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f 72 20  something.** or 
27a00 73 65 74 20 2a 70 52 65 73 20 74 6f 20 31 20 69  set *pRes to 1 i
27a10 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 65  f the table is e
27a20 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  mpty..*/.int sql
27a30 69 74 65 33 42 74 72 65 65 46 69 72 73 74 28 42  ite3BtreeFirst(B
27a40 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69  tCursor *pCur, i
27a50 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74  nt *pRes){.  int
27a60 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   rc;..  assert( 
27a70 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
27a80 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
27a90 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
27aa0 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74  x_held(pCur->pBt
27ab0 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  ree->db->mutex) 
27ac0 29 3b 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f  );.  rc = moveTo
27ad0 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 69 66  Root(pCur);.  if
27ae0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
27af0 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d  ){.    if( pCur-
27b00 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
27b10 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 20  INVALID ){.     
27b20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70   assert( pCur->p
27b30 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43  gnoRoot==0 || pC
27b40 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
27b50 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d  >iPage]->nCell==
27b60 30 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73  0 );.      *pRes
27b70 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 1;.    }else{
27b80 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
27b90 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
27ba0 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3e  ->iPage]->nCell>
27bb0 30 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73  0 );.      *pRes
27bc0 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d   = 0;.      rc =
27bd0 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28   moveToLeftmost(
27be0 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  pCur);.    }.  }
27bf0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
27c00 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72  ./* Move the cur
27c10 73 6f 72 20 74 6f 20 74 68 65 20 6c 61 73 74 20  sor to the last 
27c20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61 62  entry in the tab
27c30 6c 65 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49  le.  Return SQLI
27c40 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63  TE_OK.** on succ
27c50 65 73 73 2e 20 20 53 65 74 20 2a 70 52 65 73 20  ess.  Set *pRes 
27c60 74 6f 20 30 20 69 66 20 74 68 65 20 63 75 72 73  to 0 if the curs
27c70 6f 72 20 61 63 74 75 61 6c 6c 79 20 70 6f 69 6e  or actually poin
27c80 74 73 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a  ts to something.
27c90 2a 2a 20 6f 72 20 73 65 74 20 2a 70 52 65 73 20  ** or set *pRes 
27ca0 74 6f 20 31 20 69 66 20 74 68 65 20 74 61 62 6c  to 1 if the tabl
27cb0 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69  e is empty..*/.i
27cc0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  nt sqlite3BtreeL
27cd0 61 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ast(BtCursor *pC
27ce0 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a  ur, int *pRes){.
27cf0 20 20 69 6e 74 20 72 63 3b 0a 20 0a 20 20 61 73    int rc;. .  as
27d00 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
27d10 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
27d20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
27d30 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75  3_mutex_held(pCu
27d40 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d  r->pBtree->db->m
27d50 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 49  utex) );..  /* I
27d60 66 20 74 68 65 20 63 75 72 73 6f 72 20 61 6c 72  f the cursor alr
27d70 65 61 64 79 20 70 6f 69 6e 74 73 20 74 6f 20 74  eady points to t
27d80 68 65 20 6c 61 73 74 20 65 6e 74 72 79 2c 20 74  he last entry, t
27d90 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20  his is a no-op. 
27da0 2a 2f 0a 20 20 69 66 28 20 43 55 52 53 4f 52 5f  */.  if( CURSOR_
27db0 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74  VALID==pCur->eSt
27dc0 61 74 65 20 26 26 20 28 70 43 75 72 2d 3e 63 75  ate && (pCur->cu
27dd0 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 41 74  rFlags & BTCF_At
27de0 4c 61 73 74 29 21 3d 30 20 29 7b 0a 23 69 66 64  Last)!=0 ){.#ifd
27df0 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
27e00 20 20 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63      /* This bloc
27e10 6b 20 73 65 72 76 65 73 20 74 6f 20 61 73 73 65  k serves to asse
27e20 72 74 28 29 20 74 68 61 74 20 74 68 65 20 63 75  rt() that the cu
27e30 72 73 6f 72 20 72 65 61 6c 6c 79 20 64 6f 65 73  rsor really does
27e40 20 70 6f 69 6e 74 20 0a 20 20 20 20 2a 2a 20 74   point .    ** t
27e50 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79  o the last entry
27e60 20 69 6e 20 74 68 65 20 62 2d 74 72 65 65 2e 20   in the b-tree. 
27e70 2a 2f 0a 20 20 20 20 69 6e 74 20 69 69 3b 0a 20  */.    int ii;. 
27e80 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c     for(ii=0; ii<
27e90 70 43 75 72 2d 3e 69 50 61 67 65 3b 20 69 69 2b  pCur->iPage; ii+
27ea0 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  +){.      assert
27eb0 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 69 69  ( pCur->aiIdx[ii
27ec0 5d 3d 3d 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  ]==pCur->apPage[
27ed0 69 69 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20  ii]->nCell );.  
27ee0 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
27ef0 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
27f00 2d 3e 69 50 61 67 65 5d 3d 3d 70 43 75 72 2d 3e  ->iPage]==pCur->
27f10 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
27f20 67 65 5d 2d 3e 6e 43 65 6c 6c 2d 31 20 29 3b 0a  ge]->nCell-1 );.
27f30 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
27f40 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
27f50 50 61 67 65 5d 2d 3e 6c 65 61 66 20 29 3b 0a 23  Page]->leaf );.#
27f60 65 6e 64 69 66 0a 20 20 20 20 72 65 74 75 72 6e  endif.    return
27f70 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
27f80 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f  .  rc = moveToRo
27f90 6f 74 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20  ot(pCur);.  if( 
27fa0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
27fb0 0a 20 20 20 20 69 66 28 20 43 55 52 53 4f 52 5f  .    if( CURSOR_
27fc0 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65  INVALID==pCur->e
27fd0 53 74 61 74 65 20 29 7b 0a 20 20 20 20 20 20 61  State ){.      a
27fe0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 67 6e  ssert( pCur->pgn
27ff0 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75 72  oRoot==0 || pCur
28000 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
28010 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20  Page]->nCell==0 
28020 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d  );.      *pRes =
28030 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   1;.    }else{. 
28040 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75       assert( pCu
28050 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
28060 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20 20 20  R_VALID );.     
28070 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20   *pRes = 0;.    
28080 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 69 67    rc = moveToRig
28090 68 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20  htmost(pCur);.  
280a0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
280b0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
280c0 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20   pCur->curFlags 
280d0 7c 3d 20 42 54 43 46 5f 41 74 4c 61 73 74 3b 0a  |= BTCF_AtLast;.
280e0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
280f0 20 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c       pCur->curFl
28100 61 67 73 20 26 3d 20 7e 42 54 43 46 5f 41 74 4c  ags &= ~BTCF_AtL
28110 61 73 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ast;.      }.   
28120 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
28130 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f  urn rc;.}../* Mo
28140 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 73 6f  ve the cursor so
28150 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20   that it points 
28160 74 6f 20 61 6e 20 65 6e 74 72 79 20 6e 65 61 72  to an entry near
28170 20 74 68 65 20 6b 65 79 20 0a 2a 2a 20 73 70 65   the key .** spe
28180 63 69 66 69 65 64 20 62 79 20 70 49 64 78 4b 65  cified by pIdxKe
28190 79 20 6f 72 20 69 6e 74 4b 65 79 2e 20 20 20 52  y or intKey.   R
281a0 65 74 75 72 6e 20 61 20 73 75 63 63 65 73 73 20  eturn a success 
281b0 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  code..**.** For 
281c0 49 4e 54 4b 45 59 20 74 61 62 6c 65 73 2c 20 74  INTKEY tables, t
281d0 68 65 20 69 6e 74 4b 65 79 20 70 61 72 61 6d 65  he intKey parame
281e0 74 65 72 20 69 73 20 75 73 65 64 2e 20 20 70 49  ter is used.  pI
281f0 64 78 4b 65 79 20 0a 2a 2a 20 6d 75 73 74 20 62  dxKey .** must b
28200 65 20 4e 55 4c 4c 2e 20 20 46 6f 72 20 69 6e 64  e NULL.  For ind
28210 65 78 20 74 61 62 6c 65 73 2c 20 70 49 64 78 4b  ex tables, pIdxK
28220 65 79 20 69 73 20 75 73 65 64 20 61 6e 64 20 69  ey is used and i
28230 6e 74 4b 65 79 0a 2a 2a 20 69 73 20 69 67 6e 6f  ntKey.** is igno
28240 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  red..**.** If an
28250 20 65 78 61 63 74 20 6d 61 74 63 68 20 69 73 20   exact match is 
28260 6e 6f 74 20 66 6f 75 6e 64 2c 20 74 68 65 6e 20  not found, then 
28270 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 61 6c  the cursor is al
28280 77 61 79 73 0a 2a 2a 20 6c 65 66 74 20 70 6f 69  ways.** left poi
28290 6e 74 69 6e 67 20 61 74 20 61 20 6c 65 61 66 20  nting at a leaf 
282a0 70 61 67 65 20 77 68 69 63 68 20 77 6f 75 6c 64  page which would
282b0 20 68 6f 6c 64 20 74 68 65 20 65 6e 74 72 79 20   hold the entry 
282c0 69 66 20 69 74 0a 2a 2a 20 77 65 72 65 20 70 72  if it.** were pr
282d0 65 73 65 6e 74 2e 20 20 54 68 65 20 63 75 72 73  esent.  The curs
282e0 6f 72 20 6d 69 67 68 74 20 70 6f 69 6e 74 20 74  or might point t
282f0 6f 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74 20  o an entry that 
28300 63 6f 6d 65 73 0a 2a 2a 20 62 65 66 6f 72 65 20  comes.** before 
28310 6f 72 20 61 66 74 65 72 20 74 68 65 20 6b 65 79  or after the key
28320 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 69 6e 74 65 67  ..**.** An integ
28330 65 72 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e  er is written in
28340 74 6f 20 2a 70 52 65 73 20 77 68 69 63 68 20 69  to *pRes which i
28350 73 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 0a  s the result of.
28360 2a 2a 20 63 6f 6d 70 61 72 69 6e 67 20 74 68 65  ** comparing the
28370 20 6b 65 79 20 77 69 74 68 20 74 68 65 20 65 6e   key with the en
28380 74 72 79 20 74 6f 20 77 68 69 63 68 20 74 68 65  try to which the
28390 20 63 75 72 73 6f 72 20 69 73 20 0a 2a 2a 20 70   cursor is .** p
283a0 6f 69 6e 74 69 6e 67 2e 20 20 54 68 65 20 6d 65  ointing.  The me
283b0 61 6e 69 6e 67 20 6f 66 20 74 68 65 20 69 6e 74  aning of the int
283c0 65 67 65 72 20 77 72 69 74 74 65 6e 20 69 6e 74  eger written int
283d0 6f 0a 2a 2a 20 2a 70 52 65 73 20 69 73 20 61 73  o.** *pRes is as
283e0 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
283f0 20 20 20 20 2a 70 52 65 73 3c 30 20 20 20 20 20      *pRes<0     
28400 20 54 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c   The cursor is l
28410 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20  eft pointing at 
28420 61 6e 20 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a  an entry that.**
28430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28440 20 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61    is smaller tha
28450 6e 20 69 6e 74 4b 65 79 2f 70 49 64 78 4b 65 79  n intKey/pIdxKey
28460 20 6f 72 20 69 66 20 74 68 65 20 74 61 62 6c 65   or if the table
28470 20 69 73 20 65 6d 70 74 79 0a 2a 2a 20 20 20 20   is empty.**    
28480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 6e                an
28490 64 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  d the cursor is 
284a0 74 68 65 72 65 66 6f 72 65 20 6c 65 66 74 20 70  therefore left p
284b0 6f 69 6e 74 20 74 6f 20 6e 6f 74 68 69 6e 67 2e  oint to nothing.
284c0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73  .**.**     *pRes
284d0 3d 3d 30 20 20 20 20 20 54 68 65 20 63 75 72 73  ==0     The curs
284e0 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74  or is left point
284f0 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20  ing at an entry 
28500 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  that.**         
28510 20 20 20 20 20 20 20 20 20 65 78 61 63 74 6c 79           exactly
28520 20 6d 61 74 63 68 65 73 20 69 6e 74 4b 65 79 2f   matches intKey/
28530 70 49 64 78 4b 65 79 2e 0a 2a 2a 0a 2a 2a 20 20  pIdxKey..**.**  
28540 20 20 20 2a 70 52 65 73 3e 30 20 20 20 20 20 20     *pRes>0      
28550 54 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65  The cursor is le
28560 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61  ft pointing at a
28570 6e 20 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20  n entry that.** 
28580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28590 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20   is larger than 
285a0 69 6e 74 4b 65 79 2f 70 49 64 78 4b 65 79 2e 0a  intKey/pIdxKey..
285b0 2a 2a 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  **.*/.int sqlite
285c0 33 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61  3BtreeMovetoUnpa
285d0 63 6b 65 64 28 0a 20 20 42 74 43 75 72 73 6f 72  cked(.  BtCursor
285e0 20 2a 70 43 75 72 2c 20 20 20 20 20 20 20 20 20   *pCur,         
285f0 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20 74   /* The cursor t
28600 6f 20 62 65 20 6d 6f 76 65 64 20 2a 2f 0a 20 20  o be moved */.  
28610 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a  UnpackedRecord *
28620 70 49 64 78 4b 65 79 2c 20 2f 2a 20 55 6e 70 61  pIdxKey, /* Unpa
28630 63 6b 65 64 20 69 6e 64 65 78 20 6b 65 79 20 2a  cked index key *
28640 2f 0a 20 20 69 36 34 20 69 6e 74 4b 65 79 2c 20  /.  i64 intKey, 
28650 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
28660 54 68 65 20 74 61 62 6c 65 20 6b 65 79 20 2a 2f  The table key */
28670 0a 20 20 69 6e 74 20 62 69 61 73 52 69 67 68 74  .  int biasRight
28680 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  ,           /* I
28690 66 20 74 72 75 65 2c 20 62 69 61 73 20 74 68 65  f true, bias the
286a0 20 73 65 61 72 63 68 20 74 6f 20 74 68 65 20 68   search to the h
286b0 69 67 68 20 65 6e 64 20 2a 2f 0a 20 20 69 6e 74  igh end */.  int
286c0 20 2a 70 52 65 73 20 20 20 20 20 20 20 20 20 20   *pRes          
286d0 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 73        /* Write s
286e0 65 61 72 63 68 20 72 65 73 75 6c 74 73 20 68 65  earch results he
286f0 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  re */.){.  int r
28700 63 3b 0a 20 20 52 65 63 6f 72 64 43 6f 6d 70 61  c;.  RecordCompa
28710 72 65 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72  re xRecordCompar
28720 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  e;..  assert( cu
28730 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
28740 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
28750 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
28760 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65  held(pCur->pBtre
28770 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  e->db->mutex) );
28780 0a 20 20 61 73 73 65 72 74 28 20 70 52 65 73 20  .  assert( pRes 
28790 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 49  );.  assert( (pI
287a0 64 78 4b 65 79 3d 3d 30 29 3d 3d 28 70 43 75 72  dxKey==0)==(pCur
287b0 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d 30 29 20 29  ->pKeyInfo==0) )
287c0 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63  ;..  /* If the c
287d0 75 72 73 6f 72 20 69 73 20 61 6c 72 65 61 64 79  ursor is already
287e0 20 70 6f 73 69 74 69 6f 6e 65 64 20 61 74 20 74   positioned at t
287f0 68 65 20 70 6f 69 6e 74 20 77 65 20 61 72 65 20  he point we are 
28800 74 72 79 69 6e 67 0a 20 20 2a 2a 20 74 6f 20 6d  trying.  ** to m
28810 6f 76 65 20 74 6f 2c 20 74 68 65 6e 20 6a 75 73  ove to, then jus
28820 74 20 72 65 74 75 72 6e 20 77 69 74 68 6f 75 74  t return without
28830 20 64 6f 69 6e 67 20 61 6e 79 20 77 6f 72 6b 20   doing any work 
28840 2a 2f 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65  */.  if( pCur->e
28850 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
28860 4c 49 44 20 26 26 20 28 70 43 75 72 2d 3e 63 75  LID && (pCur->cu
28870 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 56 61  rFlags & BTCF_Va
28880 6c 69 64 4e 4b 65 79 29 21 3d 30 0a 20 20 20 26  lidNKey)!=0.   &
28890 26 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30  & pCur->apPage[0
288a0 5d 2d 3e 69 6e 74 4b 65 79 20 0a 20 20 29 7b 0a  ]->intKey .  ){.
288b0 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69 6e      if( pCur->in
288c0 66 6f 2e 6e 4b 65 79 3d 3d 69 6e 74 4b 65 79 20  fo.nKey==intKey 
288d0 29 7b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d  ){.      *pRes =
288e0 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   0;.      return
288f0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
28900 7d 0a 20 20 20 20 69 66 28 20 28 70 43 75 72 2d  }.    if( (pCur-
28910 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46  >curFlags & BTCF
28920 5f 41 74 4c 61 73 74 29 21 3d 30 20 26 26 20 70  _AtLast)!=0 && p
28930 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3c 69  Cur->info.nKey<i
28940 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 2a  ntKey ){.      *
28950 70 52 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20 20  pRes = -1;.     
28960 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
28970 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  K;.    }.  }..  
28980 69 66 28 20 70 49 64 78 4b 65 79 20 29 7b 0a 20  if( pIdxKey ){. 
28990 20 20 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72     xRecordCompar
289a0 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 46  e = sqlite3VdbeF
289b0 69 6e 64 43 6f 6d 70 61 72 65 28 70 49 64 78 4b  indCompare(pIdxK
289c0 65 79 29 3b 0a 20 20 20 20 70 49 64 78 4b 65 79  ey);.    pIdxKey
289d0 2d 3e 65 72 72 43 6f 64 65 20 3d 20 30 3b 0a 20  ->errCode = 0;. 
289e0 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78 4b     assert( pIdxK
289f0 65 79 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3d 3d  ey->default_rc==
28a00 31 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70  1 .         || p
28a10 49 64 78 4b 65 79 2d 3e 64 65 66 61 75 6c 74 5f  IdxKey->default_
28a20 72 63 3d 3d 30 20 0a 20 20 20 20 20 20 20 20 20  rc==0 .         
28a30 7c 7c 20 70 49 64 78 4b 65 79 2d 3e 64 65 66 61  || pIdxKey->defa
28a40 75 6c 74 5f 72 63 3d 3d 2d 31 0a 20 20 20 20 29  ult_rc==-1.    )
28a50 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 78  ;.  }else{.    x
28a60 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 20 3d 20  RecordCompare = 
28a70 30 3b 20 2f 2a 20 41 6c 6c 20 6b 65 79 73 20 61  0; /* All keys a
28a80 72 65 20 69 6e 74 65 67 65 72 73 20 2a 2f 0a 20  re integers */. 
28a90 20 7d 0a 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54   }..  rc = moveT
28aa0 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 69  oRoot(pCur);.  i
28ab0 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74  f( rc ){.    ret
28ac0 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73  urn rc;.  }.  as
28ad0 73 65 72 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f  sert( pCur->pgno
28ae0 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d  Root==0 || pCur-
28af0 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
28b00 61 67 65 5d 20 29 3b 0a 20 20 61 73 73 65 72 74  age] );.  assert
28b10 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74  ( pCur->pgnoRoot
28b20 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50  ==0 || pCur->apP
28b30 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
28b40 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 61 73  ->isInit );.  as
28b50 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
28b60 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c  te==CURSOR_INVAL
28b70 49 44 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61  ID || pCur->apPa
28b80 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
28b90 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20 20 69 66  >nCell>0 );.  if
28ba0 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
28bb0 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29  CURSOR_INVALID )
28bc0 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 2d 31  {.    *pRes = -1
28bd0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  ;.    assert( pC
28be0 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20  ur->pgnoRoot==0 
28bf0 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  || pCur->apPage[
28c00 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43  pCur->iPage]->nC
28c10 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 72 65  ell==0 );.    re
28c20 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
28c30 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 43    }.  assert( pC
28c40 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69  ur->apPage[0]->i
28c50 6e 74 4b 65 79 20 7c 7c 20 70 49 64 78 4b 65 79  ntKey || pIdxKey
28c60 20 29 3b 0a 20 20 66 6f 72 28 3b 3b 29 7b 0a 20   );.  for(;;){. 
28c70 20 20 20 69 6e 74 20 6c 77 72 2c 20 75 70 72 2c     int lwr, upr,
28c80 20 69 64 78 2c 20 63 3b 0a 20 20 20 20 50 67 6e   idx, c;.    Pgn
28c90 6f 20 63 68 6c 64 50 67 3b 0a 20 20 20 20 4d 65  o chldPg;.    Me
28ca0 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 70  mPage *pPage = p
28cb0 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
28cc0 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20 75 38  ->iPage];.    u8
28cd0 20 2a 70 43 65 6c 6c 3b 20 20 20 20 20 20 20 20   *pCell;        
28ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28cf0 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
28d00 63 75 72 72 65 6e 74 20 63 65 6c 6c 20 69 6e 20  current cell in 
28d10 70 50 61 67 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a  pPage */..    /*
28d20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 6d 75   pPage->nCell mu
28d30 73 74 20 62 65 20 67 72 65 61 74 65 72 20 74 68  st be greater th
28d40 61 6e 20 7a 65 72 6f 2e 20 49 66 20 74 68 69 73  an zero. If this
28d50 20 69 73 20 74 68 65 20 72 6f 6f 74 2d 70 61 67   is the root-pag
28d60 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 75 72  e.    ** the cur
28d70 73 6f 72 20 77 6f 75 6c 64 20 68 61 76 65 20 62  sor would have b
28d80 65 65 6e 20 49 4e 56 41 4c 49 44 20 61 62 6f 76  een INVALID abov
28d90 65 20 61 6e 64 20 74 68 69 73 20 66 6f 72 28 3b  e and this for(;
28da0 3b 29 20 6c 6f 6f 70 0a 20 20 20 20 2a 2a 20 6e  ;) loop.    ** n
28db0 6f 74 20 72 75 6e 2e 20 49 66 20 74 68 69 73 20  ot run. If this 
28dc0 69 73 20 6e 6f 74 20 74 68 65 20 72 6f 6f 74 2d  is not the root-
28dd0 70 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20 6d  page, then the m
28de0 6f 76 65 54 6f 43 68 69 6c 64 28 29 20 72 6f 75  oveToChild() rou
28df0 74 69 6e 65 0a 20 20 20 20 2a 2a 20 77 6f 75 6c  tine.    ** woul
28e00 64 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 64  d have already d
28e10 65 74 65 63 74 65 64 20 64 62 20 63 6f 72 72 75  etected db corru
28e20 70 74 69 6f 6e 2e 20 53 69 6d 69 6c 61 72 6c 79  ption. Similarly
28e30 2c 20 70 50 61 67 65 20 6d 75 73 74 0a 20 20 20  , pPage must.   
28e40 20 2a 2a 20 62 65 20 74 68 65 20 72 69 67 68 74   ** be the right
28e50 20 6b 69 6e 64 20 28 69 6e 64 65 78 20 6f 72 20   kind (index or 
28e60 74 61 62 6c 65 29 20 6f 66 20 62 2d 74 72 65 65  table) of b-tree
28e70 20 70 61 67 65 2e 20 4f 74 68 65 72 77 69 73 65   page. Otherwise
28e80 0a 20 20 20 20 2a 2a 20 61 20 6d 6f 76 65 54 6f  .    ** a moveTo
28e90 43 68 69 6c 64 28 29 20 6f 72 20 6d 6f 76 65 54  Child() or moveT
28ea0 6f 52 6f 6f 74 28 29 20 63 61 6c 6c 20 77 6f 75  oRoot() call wou
28eb0 6c 64 20 68 61 76 65 20 64 65 74 65 63 74 65 64  ld have detected
28ec0 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20 20 2a 2f   corruption.  */
28ed0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
28ee0 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20  ge->nCell>0 );. 
28ef0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
28f00 2d 3e 69 6e 74 4b 65 79 3d 3d 28 70 49 64 78 4b  ->intKey==(pIdxK
28f10 65 79 3d 3d 30 29 20 29 3b 0a 20 20 20 20 6c 77  ey==0) );.    lw
28f20 72 20 3d 20 30 3b 0a 20 20 20 20 75 70 72 20 3d  r = 0;.    upr =
28f30 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 3b   pPage->nCell-1;
28f40 0a 20 20 20 20 61 73 73 65 72 74 28 20 62 69 61  .    assert( bia
28f50 73 52 69 67 68 74 3d 3d 30 20 7c 7c 20 62 69 61  sRight==0 || bia
28f60 73 52 69 67 68 74 3d 3d 31 20 29 3b 0a 20 20 20  sRight==1 );.   
28f70 20 69 64 78 20 3d 20 75 70 72 3e 3e 28 31 2d 62   idx = upr>>(1-b
28f80 69 61 73 52 69 67 68 74 29 3b 20 2f 2a 20 69 64  iasRight); /* id
28f90 78 20 3d 20 62 69 61 73 52 69 67 68 74 20 3f 20  x = biasRight ? 
28fa0 75 70 72 20 3a 20 28 6c 77 72 2b 75 70 72 29 2f  upr : (lwr+upr)/
28fb0 32 3b 20 2a 2f 0a 20 20 20 20 70 43 75 72 2d 3e  2; */.    pCur->
28fc0 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
28fd0 65 5d 20 3d 20 28 75 31 36 29 69 64 78 3b 0a 20  e] = (u16)idx;. 
28fe0 20 20 20 69 66 28 20 78 52 65 63 6f 72 64 43 6f     if( xRecordCo
28ff0 6d 70 61 72 65 3d 3d 30 20 29 7b 0a 20 20 20 20  mpare==0 ){.    
29000 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 20    for(;;){.     
29010 20 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79 3b     i64 nCellKey;
29020 0a 20 20 20 20 20 20 20 20 70 43 65 6c 6c 20 3d  .        pCell =
29030 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c   findCell(pPage,
29040 20 69 64 78 29 20 2b 20 70 50 61 67 65 2d 3e 63   idx) + pPage->c
29050 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20 20  hildPtrSize;.   
29060 20 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e       if( pPage->
29070 69 6e 74 4b 65 79 4c 65 61 66 20 29 7b 0a 20 20  intKeyLeaf ){.  
29080 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 30          while( 0
29090 78 38 30 20 3c 3d 20 2a 28 70 43 65 6c 6c 2b 2b  x80 <= *(pCell++
290a0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
290b0 20 69 66 28 20 70 43 65 6c 6c 3e 3d 70 50 61 67   if( pCell>=pPag
290c0 65 2d 3e 61 44 61 74 61 45 6e 64 20 29 20 72 65  e->aDataEnd ) re
290d0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
290e0 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
290f0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
29100 20 20 20 20 20 20 20 20 67 65 74 56 61 72 69 6e          getVarin
29110 74 28 70 43 65 6c 6c 2c 20 28 75 36 34 2a 29 26  t(pCell, (u64*)&
29120 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20  nCellKey);.     
29130 20 20 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3c     if( nCellKey<
29140 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20  intKey ){.      
29150 20 20 20 20 6c 77 72 20 3d 20 69 64 78 2b 31 3b      lwr = idx+1;
29160 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6c  .          if( l
29170 77 72 3e 75 70 72 20 29 7b 20 63 20 3d 20 2d 31  wr>upr ){ c = -1
29180 3b 20 62 72 65 61 6b 3b 20 7d 0a 20 20 20 20 20  ; break; }.     
29190 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 43 65     }else if( nCe
291a0 6c 6c 4b 65 79 3e 69 6e 74 4b 65 79 20 29 7b 0a  llKey>intKey ){.
291b0 20 20 20 20 20 20 20 20 20 20 75 70 72 20 3d 20            upr = 
291c0 69 64 78 2d 31 3b 0a 20 20 20 20 20 20 20 20 20  idx-1;.         
291d0 20 69 66 28 20 6c 77 72 3e 75 70 72 20 29 7b 20   if( lwr>upr ){ 
291e0 63 20 3d 20 2b 31 3b 20 62 72 65 61 6b 3b 20 7d  c = +1; break; }
291f0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
29200 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
29210 28 20 6e 43 65 6c 6c 4b 65 79 3d 3d 69 6e 74 4b  ( nCellKey==intK
29220 65 79 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ey );.          
29230 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 7c  pCur->curFlags |
29240 3d 20 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79  = BTCF_ValidNKey
29250 3b 0a 20 20 20 20 20 20 20 20 20 20 70 43 75 72  ;.          pCur
29260 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 20 3d 20 6e 43  ->info.nKey = nC
29270 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20 20 20  ellKey;.        
29280 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43    pCur->aiIdx[pC
29290 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75 31  ur->iPage] = (u1
292a0 36 29 69 64 78 3b 0a 20 20 20 20 20 20 20 20 20  6)idx;.         
292b0 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
292c0 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  f ){.           
292d0 20 6c 77 72 20 3d 20 69 64 78 3b 0a 20 20 20 20   lwr = idx;.    
292e0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76          goto mov
292f0 65 74 6f 5f 6e 65 78 74 5f 6c 61 79 65 72 3b 0a  eto_next_layer;.
29300 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
29310 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 70 52  .            *pR
29320 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  es = 0;.        
29330 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
29340 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  OK;.            
29350 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69  goto moveto_fini
29360 73 68 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  sh;.          }.
29370 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
29380 20 20 61 73 73 65 72 74 28 20 6c 77 72 2b 75 70    assert( lwr+up
29390 72 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  r>=0 );.        
293a0 69 64 78 20 3d 20 28 6c 77 72 2b 75 70 72 29 3e  idx = (lwr+upr)>
293b0 3e 31 3b 20 20 2f 2a 20 69 64 78 20 3d 20 28 6c  >1;  /* idx = (l
293c0 77 72 2b 75 70 72 29 2f 32 3b 20 2a 2f 0a 20 20  wr+upr)/2; */.  
293d0 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
293e0 0a 20 20 20 20 20 20 66 6f 72 28 3b 3b 29 7b 0a  .      for(;;){.
293f0 20 20 20 20 20 20 20 20 69 6e 74 20 6e 43 65 6c          int nCel
29400 6c 3b 0a 20 20 20 20 20 20 20 20 70 43 65 6c 6c  l;.        pCell
29410 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67   = findCell(pPag
29420 65 2c 20 69 64 78 29 20 2b 20 70 50 61 67 65 2d  e, idx) + pPage-
29430 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a 0a  >childPtrSize;..
29440 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d          /* The m
29450 61 78 69 6d 75 6d 20 73 75 70 70 6f 72 74 65 64  aximum supported
29460 20 70 61 67 65 2d 73 69 7a 65 20 69 73 20 36 35   page-size is 65
29470 35 33 36 20 62 79 74 65 73 2e 20 54 68 69 73 20  536 bytes. This 
29480 6d 65 61 6e 73 20 74 68 61 74 0a 20 20 20 20 20  means that.     
29490 20 20 20 2a 2a 20 74 68 65 20 6d 61 78 69 6d 75     ** the maximu
294a0 6d 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 63 6f  m number of reco
294b0 72 64 20 62 79 74 65 73 20 73 74 6f 72 65 64 20  rd bytes stored 
294c0 6f 6e 20 61 6e 20 69 6e 64 65 78 20 42 2d 54 72  on an index B-Tr
294d0 65 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61  ee.        ** pa
294e0 67 65 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  ge is less than 
294f0 31 36 33 38 34 20 62 79 74 65 73 20 61 6e 64 20  16384 bytes and 
29500 6d 61 79 20 62 65 20 73 74 6f 72 65 64 20 61 73  may be stored as
29510 20 61 20 32 2d 62 79 74 65 0a 20 20 20 20 20 20   a 2-byte.      
29520 20 20 2a 2a 20 76 61 72 69 6e 74 2e 20 54 68 69    ** varint. Thi
29530 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73  s information is
29540 20 75 73 65 64 20 74 6f 20 61 74 74 65 6d 70 74   used to attempt
29550 20 74 6f 20 61 76 6f 69 64 20 70 61 72 73 69 6e   to avoid parsin
29560 67 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  g .        ** th
29570 65 20 65 6e 74 69 72 65 20 63 65 6c 6c 20 62 79  e entire cell by
29580 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 74 68   checking for th
29590 65 20 63 61 73 65 73 20 77 68 65 72 65 20 74 68  e cases where th
295a0 65 20 72 65 63 6f 72 64 20 69 73 20 0a 20 20 20  e record is .   
295b0 20 20 20 20 20 2a 2a 20 73 74 6f 72 65 64 20 65       ** stored e
295c0 6e 74 69 72 65 6c 79 20 77 69 74 68 69 6e 20 74  ntirely within t
295d0 68 65 20 62 2d 74 72 65 65 20 70 61 67 65 20 62  he b-tree page b
295e0 79 20 69 6e 73 70 65 63 74 69 6e 67 20 74 68 65  y inspecting the
295f0 20 66 69 72 73 74 20 0a 20 20 20 20 20 20 20 20   first .        
29600 2a 2a 20 32 20 62 79 74 65 73 20 6f 66 20 74 68  ** 2 bytes of th
29610 65 20 63 65 6c 6c 2e 0a 20 20 20 20 20 20 20 20  e cell..        
29620 2a 2f 0a 20 20 20 20 20 20 20 20 6e 43 65 6c 6c  */.        nCell
29630 20 3d 20 70 43 65 6c 6c 5b 30 5d 3b 0a 20 20 20   = pCell[0];.   
29640 20 20 20 20 20 69 66 28 20 6e 43 65 6c 6c 3c 3d       if( nCell<=
29650 70 50 61 67 65 2d 3e 6d 61 78 31 62 79 74 65 50  pPage->max1byteP
29660 61 79 6c 6f 61 64 20 29 7b 0a 20 20 20 20 20 20  ayload ){.      
29670 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e      /* This bran
29680 63 68 20 72 75 6e 73 20 69 66 20 74 68 65 20 72  ch runs if the r
29690 65 63 6f 72 64 2d 73 69 7a 65 20 66 69 65 6c 64  ecord-size field
296a0 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 69 73 20   of the cell is 
296b0 61 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73  a.          ** s
296c0 69 6e 67 6c 65 20 62 79 74 65 20 76 61 72 69 6e  ingle byte varin
296d0 74 20 61 6e 64 20 74 68 65 20 72 65 63 6f 72 64  t and the record
296e0 20 66 69 74 73 20 65 6e 74 69 72 65 6c 79 20 6f   fits entirely o
296f0 6e 20 74 68 65 20 6d 61 69 6e 0a 20 20 20 20 20  n the main.     
29700 20 20 20 20 20 2a 2a 20 62 2d 74 72 65 65 20 70       ** b-tree p
29710 61 67 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20  age.  */.       
29720 20 20 20 74 65 73 74 63 61 73 65 28 20 70 43 65     testcase( pCe
29730 6c 6c 2b 6e 43 65 6c 6c 2b 31 3d 3d 70 50 61 67  ll+nCell+1==pPag
29740 65 2d 3e 61 44 61 74 61 45 6e 64 20 29 3b 0a 20  e->aDataEnd );. 
29750 20 20 20 20 20 20 20 20 20 63 20 3d 20 78 52 65           c = xRe
29760 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43 65 6c  cordCompare(nCel
29770 6c 2c 20 28 76 6f 69 64 2a 29 26 70 43 65 6c 6c  l, (void*)&pCell
29780 5b 31 5d 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20  [1], pIdxKey);. 
29790 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
297a0 20 21 28 70 43 65 6c 6c 5b 31 5d 20 26 20 30 78   !(pCell[1] & 0x
297b0 38 30 29 20 0a 20 20 20 20 20 20 20 20 20 20 26  80) .          &
297c0 26 20 28 6e 43 65 6c 6c 20 3d 20 28 28 6e 43 65  & (nCell = ((nCe
297d0 6c 6c 26 30 78 37 66 29 3c 3c 37 29 20 2b 20 70  ll&0x7f)<<7) + p
297e0 43 65 6c 6c 5b 31 5d 29 3c 3d 70 50 61 67 65 2d  Cell[1])<=pPage-
297f0 3e 6d 61 78 4c 6f 63 61 6c 0a 20 20 20 20 20 20  >maxLocal.      
29800 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f    ){.          /
29810 2a 20 54 68 65 20 72 65 63 6f 72 64 2d 73 69 7a  * The record-siz
29820 65 20 66 69 65 6c 64 20 69 73 20 61 20 32 20 62  e field is a 2 b
29830 79 74 65 20 76 61 72 69 6e 74 20 61 6e 64 20 74  yte varint and t
29840 68 65 20 72 65 63 6f 72 64 20 0a 20 20 20 20 20  he record .     
29850 20 20 20 20 20 2a 2a 20 66 69 74 73 20 65 6e 74       ** fits ent
29860 69 72 65 6c 79 20 6f 6e 20 74 68 65 20 6d 61 69  irely on the mai
29870 6e 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20 20  n b-tree page.  
29880 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 74 65 73  */.          tes
29890 74 63 61 73 65 28 20 70 43 65 6c 6c 2b 6e 43 65  tcase( pCell+nCe
298a0 6c 6c 2b 32 3d 3d 70 50 61 67 65 2d 3e 61 44 61  ll+2==pPage->aDa
298b0 74 61 45 6e 64 20 29 3b 0a 20 20 20 20 20 20 20  taEnd );.       
298c0 20 20 20 63 20 3d 20 78 52 65 63 6f 72 64 43 6f     c = xRecordCo
298d0 6d 70 61 72 65 28 6e 43 65 6c 6c 2c 20 28 76 6f  mpare(nCell, (vo
298e0 69 64 2a 29 26 70 43 65 6c 6c 5b 32 5d 2c 20 70  id*)&pCell[2], p
298f0 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 20 20 20  IdxKey);.       
29900 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
29910 20 20 2f 2a 20 54 68 65 20 72 65 63 6f 72 64 20    /* The record 
29920 66 6c 6f 77 73 20 6f 76 65 72 20 6f 6e 74 6f 20  flows over onto 
29930 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 76 65 72  one or more over
29940 66 6c 6f 77 20 70 61 67 65 73 2e 20 49 6e 0a 20  flow pages. In. 
29950 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 69 73           ** this
29960 20 63 61 73 65 20 74 68 65 20 77 68 6f 6c 65 20   case the whole 
29970 63 65 6c 6c 20 6e 65 65 64 73 20 74 6f 20 62 65  cell needs to be
29980 20 70 61 72 73 65 64 2c 20 61 20 62 75 66 66 65   parsed, a buffe
29990 72 20 61 6c 6c 6f 63 61 74 65 64 0a 20 20 20 20  r allocated.    
299a0 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 61 63 63        ** and acc
299b0 65 73 73 50 61 79 6c 6f 61 64 28 29 20 75 73 65  essPayload() use
299c0 64 20 74 6f 20 72 65 74 72 69 65 76 65 20 74 68  d to retrieve th
299d0 65 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 74 68  e record into th
299e0 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62  e.          ** b
299f0 75 66 66 65 72 20 62 65 66 6f 72 65 20 56 64 62  uffer before Vdb
29a00 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 29  eRecordCompare()
29a10 20 63 61 6e 20 62 65 20 63 61 6c 6c 65 64 2e 20   can be called. 
29a20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 76 6f 69  */.          voi
29a30 64 20 2a 70 43 65 6c 6c 4b 65 79 3b 0a 20 20 20  d *pCellKey;.   
29a40 20 20 20 20 20 20 20 75 38 20 2a 20 63 6f 6e 73         u8 * cons
29a50 74 20 70 43 65 6c 6c 42 6f 64 79 20 3d 20 70 43  t pCellBody = pC
29a60 65 6c 6c 20 2d 20 70 50 61 67 65 2d 3e 63 68 69  ell - pPage->chi
29a70 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20 20 20 20  ldPtrSize;.     
29a80 20 20 20 20 20 62 74 72 65 65 50 61 72 73 65 43       btreeParseC
29a90 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43  ellPtr(pPage, pC
29aa0 65 6c 6c 42 6f 64 79 2c 20 26 70 43 75 72 2d 3e  ellBody, &pCur->
29ab0 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 20  info);.         
29ac0 20 6e 43 65 6c 6c 20 3d 20 28 69 6e 74 29 70 43   nCell = (int)pC
29ad0 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20  ur->info.nKey;. 
29ae0 20 20 20 20 20 20 20 20 20 70 43 65 6c 6c 4b 65           pCellKe
29af0 79 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  y = sqlite3Mallo
29b00 63 28 20 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20  c( nCell );.    
29b10 20 20 20 20 20 20 69 66 28 20 70 43 65 6c 6c 4b        if( pCellK
29b20 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ey==0 ){.       
29b30 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
29b40 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20  _NOMEM;.        
29b50 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f      goto moveto_
29b60 66 69 6e 69 73 68 3b 0a 20 20 20 20 20 20 20 20  finish;.        
29b70 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 43    }.          pC
29b80 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
29b90 69 50 61 67 65 5d 20 3d 20 28 75 31 36 29 69 64  iPage] = (u16)id
29ba0 78 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  x;.          rc 
29bb0 3d 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28  = accessPayload(
29bc0 70 43 75 72 2c 20 30 2c 20 6e 43 65 6c 6c 2c 20  pCur, 0, nCell, 
29bd0 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29  (unsigned char*)
29be0 70 43 65 6c 6c 4b 65 79 2c 20 32 29 3b 0a 20 20  pCellKey, 2);.  
29bf0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
29c00 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
29c10 6c 69 74 65 33 5f 66 72 65 65 28 70 43 65 6c 6c  lite3_free(pCell
29c20 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Key);.          
29c30 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69    goto moveto_fi
29c40 6e 69 73 68 3b 0a 20 20 20 20 20 20 20 20 20 20  nish;.          
29c50 7d 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d 20  }.          c = 
29c60 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e  xRecordCompare(n
29c70 43 65 6c 6c 2c 20 70 43 65 6c 6c 4b 65 79 2c 20  Cell, pCellKey, 
29c80 70 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 20 20  pIdxKey);.      
29c90 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
29ca0 28 70 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20  (pCellKey);.    
29cb0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73      }.        as
29cc0 73 65 72 74 28 20 0a 20 20 20 20 20 20 20 20 20  sert( .         
29cd0 20 20 20 28 70 49 64 78 4b 65 79 2d 3e 65 72 72     (pIdxKey->err
29ce0 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 43 4f 52  Code!=SQLITE_COR
29cf0 52 55 50 54 20 7c 7c 20 63 3d 3d 30 29 0a 20 20  RUPT || c==0).  
29d00 20 20 20 20 20 20 20 26 26 20 28 70 49 64 78 4b         && (pIdxK
29d10 65 79 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c  ey->errCode!=SQL
29d20 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 70 43 75  ITE_NOMEM || pCu
29d30 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d  r->pBtree->db->m
29d40 61 6c 6c 6f 63 46 61 69 6c 65 64 29 0a 20 20 20  allocFailed).   
29d50 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
29d60 69 66 28 20 63 3c 30 20 29 7b 0a 20 20 20 20 20  if( c<0 ){.     
29d70 20 20 20 20 20 6c 77 72 20 3d 20 69 64 78 2b 31       lwr = idx+1
29d80 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
29d90 69 66 28 20 63 3e 30 20 29 7b 0a 20 20 20 20 20  if( c>0 ){.     
29da0 20 20 20 20 20 75 70 72 20 3d 20 69 64 78 2d 31       upr = idx-1
29db0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
29dc0 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
29dd0 74 28 20 63 3d 3d 30 20 29 3b 0a 20 20 20 20 20  t( c==0 );.     
29de0 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a       *pRes = 0;.
29df0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
29e00 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
29e10 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b      pCur->aiIdx[
29e20 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28  pCur->iPage] = (
29e30 75 31 36 29 69 64 78 3b 0a 20 20 20 20 20 20 20  u16)idx;.       
29e40 20 20 20 69 66 28 20 70 49 64 78 4b 65 79 2d 3e     if( pIdxKey->
29e50 65 72 72 43 6f 64 65 20 29 20 72 63 20 3d 20 53  errCode ) rc = S
29e60 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b 0a 20  QLITE_CORRUPT;. 
29e70 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f           goto mo
29e80 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20  veto_finish;.   
29e90 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
29ea0 66 28 20 6c 77 72 3e 75 70 72 20 29 20 62 72 65  f( lwr>upr ) bre
29eb0 61 6b 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  ak;.        asse
29ec0 72 74 28 20 6c 77 72 2b 75 70 72 3e 3d 30 20 29  rt( lwr+upr>=0 )
29ed0 3b 0a 20 20 20 20 20 20 20 20 69 64 78 20 3d 20  ;.        idx = 
29ee0 28 6c 77 72 2b 75 70 72 29 3e 3e 31 3b 20 20 2f  (lwr+upr)>>1;  /
29ef0 2a 20 69 64 78 20 3d 20 28 6c 77 72 2b 75 70 72  * idx = (lwr+upr
29f00 29 2f 32 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20  )/2 */.      }. 
29f10 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
29f20 20 6c 77 72 3d 3d 75 70 72 2b 31 20 7c 7c 20 28   lwr==upr+1 || (
29f30 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 26 26  pPage->intKey &&
29f40 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 29 20 29   !pPage->leaf) )
29f50 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
29f60 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20  age->isInit );. 
29f70 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65     if( pPage->le
29f80 61 66 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  af ){.      asse
29f90 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  rt( pCur->aiIdx[
29fa0 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 43 75  pCur->iPage]<pCu
29fb0 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
29fc0 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b  iPage]->nCell );
29fd0 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 61 69 49  .      pCur->aiI
29fe0 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20  dx[pCur->iPage] 
29ff0 3d 20 28 75 31 36 29 69 64 78 3b 0a 20 20 20 20  = (u16)idx;.    
2a000 20 20 2a 70 52 65 73 20 3d 20 63 3b 0a 20 20 20    *pRes = c;.   
2a010 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
2a020 4b 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f  K;.      goto mo
2a030 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20  veto_finish;.   
2a040 20 7d 0a 6d 6f 76 65 74 6f 5f 6e 65 78 74 5f 6c   }.moveto_next_l
2a050 61 79 65 72 3a 0a 20 20 20 20 69 66 28 20 6c 77  ayer:.    if( lw
2a060 72 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  r>=pPage->nCell 
2a070 29 7b 0a 20 20 20 20 20 20 63 68 6c 64 50 67 20  ){.      chldPg 
2a080 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67  = get4byte(&pPag
2a090 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e  e->aData[pPage->
2a0a0 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20  hdrOffset+8]);. 
2a0b0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2a0c0 63 68 6c 64 50 67 20 3d 20 67 65 74 34 62 79 74  chldPg = get4byt
2a0d0 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  e(findCell(pPage
2a0e0 2c 20 6c 77 72 29 29 3b 0a 20 20 20 20 7d 0a 20  , lwr));.    }. 
2a0f0 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70     pCur->aiIdx[p
2a100 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75  Cur->iPage] = (u
2a110 31 36 29 6c 77 72 3b 0a 20 20 20 20 72 63 20 3d  16)lwr;.    rc =
2a120 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75   moveToChild(pCu
2a130 72 2c 20 63 68 6c 64 50 67 29 3b 0a 20 20 20 20  r, chldPg);.    
2a140 69 66 28 20 72 63 20 29 20 62 72 65 61 6b 3b 0a  if( rc ) break;.
2a150 20 20 7d 0a 6d 6f 76 65 74 6f 5f 66 69 6e 69 73    }.moveto_finis
2a160 68 3a 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  h:.  pCur->info.
2a170 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75  nSize = 0;.  pCu
2a180 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e  r->curFlags &= ~
2a190 28 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c  (BTCF_ValidNKey|
2a1a0 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3b  BTCF_ValidOvfl);
2a1b0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2a1c0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54  ../*.** Return T
2a1d0 52 55 45 20 69 66 20 74 68 65 20 63 75 72 73 6f  RUE if the curso
2a1e0 72 20 69 73 20 6e 6f 74 20 70 6f 69 6e 74 69 6e  r is not pointin
2a1f0 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20 6f 66  g at an entry of
2a200 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a   the table..**.*
2a210 2a 20 54 52 55 45 20 77 69 6c 6c 20 62 65 20 72  * TRUE will be r
2a220 65 74 75 72 6e 65 64 20 61 66 74 65 72 20 61 20  eturned after a 
2a230 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 42  call to sqlite3B
2a240 74 72 65 65 4e 65 78 74 28 29 20 6d 6f 76 65 73  treeNext() moves
2a250 0a 2a 2a 20 70 61 73 74 20 74 68 65 20 6c 61 73  .** past the las
2a260 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74  t entry in the t
2a270 61 62 6c 65 20 6f 72 20 73 71 6c 69 74 65 33 42  able or sqlite3B
2a280 74 72 65 65 50 72 65 76 28 29 20 6d 6f 76 65 73  treePrev() moves
2a290 20 70 61 73 74 0a 2a 2a 20 74 68 65 20 66 69 72   past.** the fir
2a2a0 73 74 20 65 6e 74 72 79 2e 20 20 54 52 55 45 20  st entry.  TRUE 
2a2b0 69 73 20 61 6c 73 6f 20 72 65 74 75 72 6e 65 64  is also returned
2a2c0 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 69 73   if the table is
2a2d0 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73   empty..*/.int s
2a2e0 71 6c 69 74 65 33 42 74 72 65 65 45 6f 66 28 42  qlite3BtreeEof(B
2a2f0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
2a300 20 20 2f 2a 20 54 4f 44 4f 3a 20 57 68 61 74 20    /* TODO: What 
2a310 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  if the cursor is
2a320 20 69 6e 20 43 55 52 53 4f 52 5f 52 45 51 55 49   in CURSOR_REQUI
2a330 52 45 53 45 45 4b 20 62 75 74 20 61 6c 6c 20 74  RESEEK but all t
2a340 61 62 6c 65 20 65 6e 74 72 69 65 73 0a 20 20 2a  able entries.  *
2a350 2a 20 68 61 76 65 20 62 65 65 6e 20 64 65 6c 65  * have been dele
2a360 74 65 64 3f 20 54 68 69 73 20 41 50 49 20 77 69  ted? This API wi
2a370 6c 6c 20 6e 65 65 64 20 74 6f 20 63 68 61 6e 67  ll need to chang
2a380 65 20 74 6f 20 72 65 74 75 72 6e 20 61 6e 20 65  e to return an e
2a390 72 72 6f 72 20 63 6f 64 65 0a 20 20 2a 2a 20 61  rror code.  ** a
2a3a0 73 20 77 65 6c 6c 20 61 73 20 74 68 65 20 62 6f  s well as the bo
2a3b0 6f 6c 65 61 6e 20 72 65 73 75 6c 74 20 76 61 6c  olean result val
2a3c0 75 65 2e 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72  ue..  */.  retur
2a3d0 6e 20 28 43 55 52 53 4f 52 5f 56 41 4c 49 44 21  n (CURSOR_VALID!
2a3e0 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 29 3b 0a  =pCur->eState);.
2a3f0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65  }../*.** Advance
2a400 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74   the cursor to t
2a410 68 65 20 6e 65 78 74 20 65 6e 74 72 79 20 69 6e  he next entry in
2a420 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
2a430 49 66 0a 2a 2a 20 73 75 63 63 65 73 73 66 75 6c  If.** successful
2a440 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d   then set *pRes=
2a450 30 2e 20 20 49 66 20 74 68 65 20 63 75 72 73 6f  0.  If the curso
2a460 72 0a 2a 2a 20 77 61 73 20 61 6c 72 65 61 64 79  r.** was already
2a470 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65   pointing to the
2a480 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74   last entry in t
2a490 68 65 20 64 61 74 61 62 61 73 65 20 62 65 66 6f  he database befo
2a4a0 72 65 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69  re.** this routi
2a4b0 6e 65 20 77 61 73 20 63 61 6c 6c 65 64 2c 20 74  ne was called, t
2a4c0 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 31 2e  hen set *pRes=1.
2a4d0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 69 6e 20  .**.** The main 
2a4e0 65 6e 74 72 79 20 70 6f 69 6e 74 20 69 73 20 73  entry point is s
2a4f0 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28  qlite3BtreeNext(
2a500 29 2e 20 20 54 68 61 74 20 72 6f 75 74 69 6e 65  ).  That routine
2a510 20 69 73 20 6f 70 74 69 6d 69 7a 65 64 0a 2a 2a   is optimized.**
2a520 20 66 6f 72 20 74 68 65 20 63 6f 6d 6d 6f 6e 20   for the common 
2a530 63 61 73 65 20 6f 66 20 6d 65 72 65 6c 79 20 69  case of merely i
2a540 6e 63 72 65 6d 65 6e 74 69 6e 67 20 74 68 65 20  ncrementing the 
2a550 63 65 6c 6c 20 63 6f 75 6e 74 65 72 20 42 74 43  cell counter BtC
2a560 75 72 73 6f 72 2e 61 69 49 64 78 0a 2a 2a 20 74  ursor.aiIdx.** t
2a570 6f 20 74 68 65 20 6e 65 78 74 20 63 65 6c 6c 20  o the next cell 
2a580 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  on the current p
2a590 61 67 65 2e 20 20 54 68 65 20 28 73 6c 6f 77 65  age.  The (slowe
2a5a0 72 29 20 62 74 72 65 65 4e 65 78 74 28 29 20 68  r) btreeNext() h
2a5b0 65 6c 70 65 72 0a 2a 2a 20 72 6f 75 74 69 6e 65  elper.** routine
2a5c0 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20   is called when 
2a5d0 69 74 20 69 73 20 6e 65 63 65 73 73 61 72 79 20  it is necessary 
2a5e0 74 6f 20 6d 6f 76 65 20 74 6f 20 61 20 64 69 66  to move to a dif
2a5f0 66 65 72 65 6e 74 20 70 61 67 65 20 6f 72 0a 2a  ferent page or.*
2a600 2a 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65  * to restore the
2a610 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54   cursor..**.** T
2a620 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74  he calling funct
2a630 69 6f 6e 20 77 69 6c 6c 20 73 65 74 20 2a 70 52  ion will set *pR
2a640 65 73 20 74 6f 20 30 20 6f 72 20 31 2e 20 20 54  es to 0 or 1.  T
2a650 68 65 20 69 6e 69 74 69 61 6c 20 2a 70 52 65 73  he initial *pRes
2a660 20 76 61 6c 75 65 0a 2a 2a 20 77 69 6c 6c 20 62   value.** will b
2a670 65 20 31 20 69 66 20 74 68 65 20 63 75 72 73 6f  e 1 if the curso
2a680 72 20 62 65 69 6e 67 20 73 74 65 70 70 65 64 20  r being stepped 
2a690 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 61  corresponds to a
2a6a0 6e 20 53 51 4c 20 69 6e 64 65 78 20 61 6e 64 0a  n SQL index and.
2a6b0 2a 2a 20 69 66 20 74 68 69 73 20 72 6f 75 74 69  ** if this routi
2a6c0 6e 65 20 63 6f 75 6c 64 20 68 61 76 65 20 62 65  ne could have be
2a6d0 65 6e 20 73 6b 69 70 70 65 64 20 69 66 20 74 68  en skipped if th
2a6e0 61 74 20 53 51 4c 20 69 6e 64 65 78 20 68 61 64  at SQL index had
2a6f0 20 62 65 65 6e 0a 2a 2a 20 61 20 75 6e 69 71 75   been.** a uniqu
2a700 65 20 69 6e 64 65 78 2e 20 20 4f 74 68 65 72 77  e index.  Otherw
2a710 69 73 65 20 74 68 65 20 63 61 6c 6c 65 72 20 77  ise the caller w
2a720 69 6c 6c 20 68 61 76 65 20 73 65 74 20 2a 70 52  ill have set *pR
2a730 65 73 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2a 20 5a  es to zero..** Z
2a740 65 72 6f 20 69 73 20 74 68 65 20 63 6f 6d 6d 6f  ero is the commo
2a750 6e 20 63 61 73 65 2e 20 54 68 65 20 62 74 72 65  n case. The btre
2a760 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
2a770 20 69 73 20 66 72 65 65 20 74 6f 20 75 73 65 20   is free to use 
2a780 74 68 65 0a 2a 2a 20 69 6e 69 74 69 61 6c 20 2a  the.** initial *
2a790 70 52 65 73 20 76 61 6c 75 65 20 61 73 20 61 20  pRes value as a 
2a7a0 68 69 6e 74 20 74 6f 20 69 6d 70 72 6f 76 65 20  hint to improve 
2a7b0 70 65 72 66 6f 72 6d 61 6e 63 65 2c 20 62 75 74  performance, but
2a7c0 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20   the current.** 
2a7d0 53 51 4c 69 74 65 20 62 74 72 65 65 20 69 6d 70  SQLite btree imp
2a7e0 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 64 6f 65 73  lementation does
2a7f0 20 6e 6f 74 2e 20 28 4e 6f 74 65 20 74 68 61 74   not. (Note that
2a800 20 74 68 65 20 63 6f 6d 64 62 32 20 62 74 72 65   the comdb2 btre
2a810 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74  e.** implementat
2a820 69 6f 6e 20 64 6f 65 73 20 75 73 65 20 74 68 69  ion does use thi
2a830 73 20 68 69 6e 74 2c 20 68 6f 77 65 76 65 72 2e  s hint, however.
2a840 29 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c 49  ).*/.static SQLI
2a850 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74 20  TE_NOINLINE int 
2a860 62 74 72 65 65 4e 65 78 74 28 42 74 43 75 72 73  btreeNext(BtCurs
2a870 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70  or *pCur, int *p
2a880 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  Res){.  int rc;.
2a890 20 20 69 6e 74 20 69 64 78 3b 0a 20 20 4d 65 6d    int idx;.  Mem
2a8a0 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20  Page *pPage;..  
2a8b0 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
2a8c0 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
2a8d0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
2a8e0 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d 30 20 7c 7c  ->skipNext==0 ||
2a8f0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43   pCur->eState!=C
2a900 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
2a910 20 61 73 73 65 72 74 28 20 2a 70 52 65 73 3d 3d   assert( *pRes==
2a920 30 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d  0 );.  if( pCur-
2a930 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f  >eState!=CURSOR_
2a940 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 61 73 73  VALID ){.    ass
2a950 65 72 74 28 20 28 70 43 75 72 2d 3e 63 75 72 46  ert( (pCur->curF
2a960 6c 61 67 73 20 26 20 42 54 43 46 5f 56 61 6c 69  lags & BTCF_Vali
2a970 64 4f 76 66 6c 29 3d 3d 30 20 29 3b 0a 20 20 20  dOvfl)==0 );.   
2a980 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72   rc = restoreCur
2a990 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72  sorPosition(pCur
2a9a0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
2a9b0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2a9c0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
2a9d0 20 7d 0a 20 20 20 20 69 66 28 20 43 55 52 53 4f   }.    if( CURSO
2a9e0 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d  R_INVALID==pCur-
2a9f0 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20 20  >eState ){.     
2aa00 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20   *pRes = 1;.    
2aa10 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2aa20 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  OK;.    }.    if
2aa30 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74  ( pCur->skipNext
2aa40 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
2aa50 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
2aa60 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20  CURSOR_VALID || 
2aa70 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
2aa80 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54 20 29 3b  RSOR_SKIPNEXT );
2aa90 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74  .      pCur->eSt
2aaa0 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c  ate = CURSOR_VAL
2aab0 49 44 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43  ID;.      if( pC
2aac0 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3e 30 20 29  ur->skipNext>0 )
2aad0 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e  {.        pCur->
2aae0 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20  skipNext = 0;.  
2aaf0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
2ab00 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a  ITE_OK;.      }.
2ab10 20 20 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70        pCur->skip
2ab20 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  Next = 0;.    }.
2ab30 20 20 7d 0a 0a 20 20 70 50 61 67 65 20 3d 20 70    }..  pPage = p
2ab40 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
2ab50 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 69 64 78 20  ->iPage];.  idx 
2ab60 3d 20 2b 2b 70 43 75 72 2d 3e 61 69 49 64 78 5b  = ++pCur->aiIdx[
2ab70 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20  pCur->iPage];.  
2ab80 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69  assert( pPage->i
2ab90 73 49 6e 69 74 20 29 3b 0a 0a 20 20 2f 2a 20 49  sInit );..  /* I
2aba0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
2abb0 69 6c 65 20 69 73 20 63 6f 72 72 75 70 74 2c 20  ile is corrupt, 
2abc0 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 66  it is possible f
2abd0 6f 72 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  or the value of 
2abe0 69 64 78 20 0a 20 20 2a 2a 20 74 6f 20 62 65 20  idx .  ** to be 
2abf0 69 6e 76 61 6c 69 64 20 68 65 72 65 2e 20 54 68  invalid here. Th
2ac00 69 73 20 63 61 6e 20 6f 6e 6c 79 20 6f 63 63 75  is can only occu
2ac10 72 20 69 66 20 61 20 73 65 63 6f 6e 64 20 63 75  r if a second cu
2ac20 72 73 6f 72 20 6d 6f 64 69 66 69 65 73 0a 20 20  rsor modifies.  
2ac30 2a 2a 20 74 68 65 20 70 61 67 65 20 77 68 69 6c  ** the page whil
2ac40 65 20 63 75 72 73 6f 72 20 70 43 75 72 20 69 73  e cursor pCur is
2ac50 20 68 6f 6c 64 69 6e 67 20 61 20 72 65 66 65 72   holding a refer
2ac60 65 6e 63 65 20 74 6f 20 69 74 2e 20 57 68 69 63  ence to it. Whic
2ac70 68 20 63 61 6e 0a 20 20 2a 2a 20 6f 6e 6c 79 20  h can.  ** only 
2ac80 68 61 70 70 65 6e 20 69 66 20 74 68 65 20 64 61  happen if the da
2ac90 74 61 62 61 73 65 20 69 73 20 63 6f 72 72 75 70  tabase is corrup
2aca0 74 20 69 6e 20 73 75 63 68 20 61 20 77 61 79 20  t in such a way 
2acb0 61 73 20 74 6f 20 6c 69 6e 6b 20 74 68 65 0a 20  as to link the. 
2acc0 20 2a 2a 20 70 61 67 65 20 69 6e 74 6f 20 6d 6f   ** page into mo
2acd0 72 65 20 74 68 61 6e 20 6f 6e 65 20 62 2d 74 72  re than one b-tr
2ace0 65 65 20 73 74 72 75 63 74 75 72 65 2e 20 2a 2f  ee structure. */
2acf0 0a 20 20 74 65 73 74 63 61 73 65 28 20 69 64 78  .  testcase( idx
2ad00 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b  >pPage->nCell );
2ad10 0a 0a 20 20 69 66 28 20 69 64 78 3e 3d 70 50 61  ..  if( idx>=pPa
2ad20 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20  ge->nCell ){.   
2ad30 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
2ad40 66 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  f ){.      rc = 
2ad50 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72  moveToChild(pCur
2ad60 2c 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67  , get4byte(&pPag
2ad70 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e  e->aData[pPage->
2ad80 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 29 3b 0a  hdrOffset+8]));.
2ad90 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72        if( rc ) r
2ada0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
2adb0 72 65 74 75 72 6e 20 6d 6f 76 65 54 6f 4c 65 66  return moveToLef
2adc0 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 20  tmost(pCur);.   
2add0 20 7d 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20   }.    do{.     
2ade0 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65   if( pCur->iPage
2adf0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2a  ==0 ){.        *
2ae00 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 20 20  pRes = 1;.      
2ae10 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
2ae20 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b   CURSOR_INVALID;
2ae30 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
2ae40 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
2ae50 20 7d 0a 20 20 20 20 20 20 6d 6f 76 65 54 6f 50   }.      moveToP
2ae60 61 72 65 6e 74 28 70 43 75 72 29 3b 0a 20 20 20  arent(pCur);.   
2ae70 20 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d     pPage = pCur-
2ae80 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
2ae90 61 67 65 5d 3b 0a 20 20 20 20 7d 77 68 69 6c 65  age];.    }while
2aea0 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  ( pCur->aiIdx[pC
2aeb0 75 72 2d 3e 69 50 61 67 65 5d 3e 3d 70 50 61 67  ur->iPage]>=pPag
2aec0 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20  e->nCell );.    
2aed0 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65  if( pPage->intKe
2aee0 79 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  y ){.      retur
2aef0 6e 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65  n sqlite3BtreeNe
2af00 78 74 28 70 43 75 72 2c 20 70 52 65 73 29 3b 0a  xt(pCur, pRes);.
2af10 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2af20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2af30 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  K;.    }.  }.  i
2af40 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  f( pPage->leaf )
2af50 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
2af60 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b  ITE_OK;.  }else{
2af70 0a 20 20 20 20 72 65 74 75 72 6e 20 6d 6f 76 65  .    return move
2af80 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29  ToLeftmost(pCur)
2af90 3b 0a 20 20 7d 0a 7d 0a 69 6e 74 20 73 71 6c 69  ;.  }.}.int sqli
2afa0 74 65 33 42 74 72 65 65 4e 65 78 74 28 42 74 43  te3BtreeNext(BtC
2afb0 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74  ursor *pCur, int
2afc0 20 2a 70 52 65 73 29 7b 0a 20 20 4d 65 6d 50 61   *pRes){.  MemPa
2afd0 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 61 73 73  ge *pPage;.  ass
2afe0 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
2aff0 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
2b000 20 61 73 73 65 72 74 28 20 70 52 65 73 21 3d 30   assert( pRes!=0
2b010 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 2a 70   );.  assert( *p
2b020 52 65 73 3d 3d 30 20 7c 7c 20 2a 70 52 65 73 3d  Res==0 || *pRes=
2b030 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =1 );.  assert( 
2b040 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d  pCur->skipNext==
2b050 30 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74  0 || pCur->eStat
2b060 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e!=CURSOR_VALID 
2b070 29 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  );.  pCur->info.
2b080 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75  nSize = 0;.  pCu
2b090 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e  r->curFlags &= ~
2b0a0 28 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c  (BTCF_ValidNKey|
2b0b0 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3b  BTCF_ValidOvfl);
2b0c0 0a 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20  .  *pRes = 0;.  
2b0d0 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  if( pCur->eState
2b0e0 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  !=CURSOR_VALID )
2b0f0 20 72 65 74 75 72 6e 20 62 74 72 65 65 4e 65 78   return btreeNex
2b100 74 28 70 43 75 72 2c 20 70 52 65 73 29 3b 0a 20  t(pCur, pRes);. 
2b110 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61   pPage = pCur->a
2b120 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
2b130 65 5d 3b 0a 20 20 69 66 28 20 28 2b 2b 70 43 75  e];.  if( (++pCu
2b140 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
2b150 50 61 67 65 5d 29 3e 3d 70 50 61 67 65 2d 3e 6e  Page])>=pPage->n
2b160 43 65 6c 6c 20 29 7b 0a 20 20 20 20 70 43 75 72  Cell ){.    pCur
2b170 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
2b180 61 67 65 5d 2d 2d 3b 0a 20 20 20 20 72 65 74 75  age]--;.    retu
2b190 72 6e 20 62 74 72 65 65 4e 65 78 74 28 70 43 75  rn btreeNext(pCu
2b1a0 72 2c 20 70 52 65 73 29 3b 0a 20 20 7d 0a 20 20  r, pRes);.  }.  
2b1b0 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20  if( pPage->leaf 
2b1c0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
2b1d0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65  LITE_OK;.  }else
2b1e0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 6d 6f 76  {.    return mov
2b1f0 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72  eToLeftmost(pCur
2b200 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
2b210 53 74 65 70 20 74 68 65 20 63 75 72 73 6f 72 20  Step the cursor 
2b220 74 6f 20 74 68 65 20 62 61 63 6b 20 74 6f 20 74  to the back to t
2b230 68 65 20 70 72 65 76 69 6f 75 73 20 65 6e 74 72  he previous entr
2b240 79 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  y in the databas
2b250 65 2e 20 20 49 66 0a 2a 2a 20 73 75 63 63 65 73  e.  If.** succes
2b260 73 66 75 6c 20 74 68 65 6e 20 73 65 74 20 2a 70  sful then set *p
2b270 52 65 73 3d 30 2e 20 20 49 66 20 74 68 65 20 63  Res=0.  If the c
2b280 75 72 73 6f 72 0a 2a 2a 20 77 61 73 20 61 6c 72  ursor.** was alr
2b290 65 61 64 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f  eady pointing to
2b2a0 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79   the first entry
2b2b0 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
2b2c0 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 69 73 20   before.** this 
2b2d0 72 6f 75 74 69 6e 65 20 77 61 73 20 63 61 6c 6c  routine was call
2b2e0 65 64 2c 20 74 68 65 6e 20 73 65 74 20 2a 70 52  ed, then set *pR
2b2f0 65 73 3d 31 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  es=1..**.** The 
2b300 6d 61 69 6e 20 65 6e 74 72 79 20 70 6f 69 6e 74  main entry point
2b310 20 69 73 20 73 71 6c 69 74 65 33 42 74 72 65 65   is sqlite3Btree
2b320 50 72 65 76 69 6f 75 73 28 29 2e 20 20 54 68 61  Previous().  Tha
2b330 74 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 70 74  t routine is opt
2b340 69 6d 69 7a 65 64 0a 2a 2a 20 66 6f 72 20 74 68  imized.** for th
2b350 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 6f 66  e common case of
2b360 20 6d 65 72 65 6c 79 20 64 65 63 72 65 6d 65 6e   merely decremen
2b370 74 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 63 6f  ting the cell co
2b380 75 6e 74 65 72 20 42 74 43 75 72 73 6f 72 2e 61  unter BtCursor.a
2b390 69 49 64 78 0a 2a 2a 20 74 6f 20 74 68 65 20 70  iIdx.** to the p
2b3a0 72 65 76 69 6f 75 73 20 63 65 6c 6c 20 6f 6e 20  revious cell on 
2b3b0 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65  the current page
2b3c0 2e 20 20 54 68 65 20 28 73 6c 6f 77 65 72 29 20  .  The (slower) 
2b3d0 62 74 72 65 65 50 72 65 76 69 6f 75 73 28 29 0a  btreePrevious().
2b3e0 2a 2a 20 68 65 6c 70 65 72 20 72 6f 75 74 69 6e  ** helper routin
2b3f0 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e  e is called when
2b400 20 69 74 20 69 73 20 6e 65 63 65 73 73 61 72 79   it is necessary
2b410 20 74 6f 20 6d 6f 76 65 20 74 6f 20 61 20 64 69   to move to a di
2b420 66 66 65 72 65 6e 74 20 70 61 67 65 0a 2a 2a 20  fferent page.** 
2b430 6f 72 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68  or to restore th
2b440 65 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20  e cursor..**.** 
2b450 54 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63  The calling func
2b460 74 69 6f 6e 20 77 69 6c 6c 20 73 65 74 20 2a 70  tion will set *p
2b470 52 65 73 20 74 6f 20 30 20 6f 72 20 31 2e 20 20  Res to 0 or 1.  
2b480 54 68 65 20 69 6e 69 74 69 61 6c 20 2a 70 52 65  The initial *pRe
2b490 73 20 76 61 6c 75 65 0a 2a 2a 20 77 69 6c 6c 20  s value.** will 
2b4a0 62 65 20 31 20 69 66 20 74 68 65 20 63 75 72 73  be 1 if the curs
2b4b0 6f 72 20 62 65 69 6e 67 20 73 74 65 70 70 65 64  or being stepped
2b4c0 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20   corresponds to 
2b4d0 61 6e 20 53 51 4c 20 69 6e 64 65 78 20 61 6e 64  an SQL index and
2b4e0 0a 2a 2a 20 69 66 20 74 68 69 73 20 72 6f 75 74  .** if this rout
2b4f0 69 6e 65 20 63 6f 75 6c 64 20 68 61 76 65 20 62  ine could have b
2b500 65 65 6e 20 73 6b 69 70 70 65 64 20 69 66 20 74  een skipped if t
2b510 68 61 74 20 53 51 4c 20 69 6e 64 65 78 20 68 61  hat SQL index ha
2b520 64 20 62 65 65 6e 0a 2a 2a 20 61 20 75 6e 69 71  d been.** a uniq
2b530 75 65 20 69 6e 64 65 78 2e 20 20 4f 74 68 65 72  ue index.  Other
2b540 77 69 73 65 20 74 68 65 20 63 61 6c 6c 65 72 20  wise the caller 
2b550 77 69 6c 6c 20 68 61 76 65 20 73 65 74 20 2a 70  will have set *p
2b560 52 65 73 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2a 20  Res to zero..** 
2b570 5a 65 72 6f 20 69 73 20 74 68 65 20 63 6f 6d 6d  Zero is the comm
2b580 6f 6e 20 63 61 73 65 2e 20 54 68 65 20 62 74 72  on case. The btr
2b590 65 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ee implementatio
2b5a0 6e 20 69 73 20 66 72 65 65 20 74 6f 20 75 73 65  n is free to use
2b5b0 20 74 68 65 0a 2a 2a 20 69 6e 69 74 69 61 6c 20   the.** initial 
2b5c0 2a 70 52 65 73 20 76 61 6c 75 65 20 61 73 20 61  *pRes value as a
2b5d0 20 68 69 6e 74 20 74 6f 20 69 6d 70 72 6f 76 65   hint to improve
2b5e0 20 70 65 72 66 6f 72 6d 61 6e 63 65 2c 20 62 75   performance, bu
2b5f0 74 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a  t the current.**
2b600 20 53 51 4c 69 74 65 20 62 74 72 65 65 20 69 6d   SQLite btree im
2b610 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 64 6f 65  plementation doe
2b620 73 20 6e 6f 74 2e 20 28 4e 6f 74 65 20 74 68 61  s not. (Note tha
2b630 74 20 74 68 65 20 63 6f 6d 64 62 32 20 62 74 72  t the comdb2 btr
2b640 65 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61  ee.** implementa
2b650 74 69 6f 6e 20 64 6f 65 73 20 75 73 65 20 74 68  tion does use th
2b660 69 73 20 68 69 6e 74 2c 20 68 6f 77 65 76 65 72  is hint, however
2b670 2e 29 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c  .).*/.static SQL
2b680 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74  ITE_NOINLINE int
2b690 20 62 74 72 65 65 50 72 65 76 69 6f 75 73 28 42   btreePrevious(B
2b6a0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69  tCursor *pCur, i
2b6b0 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74  nt *pRes){.  int
2b6c0 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a   rc;.  MemPage *
2b6d0 70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74  pPage;..  assert
2b6e0 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
2b6f0 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ex(pCur) );.  as
2b700 73 65 72 74 28 20 70 52 65 73 21 3d 30 20 29 3b  sert( pRes!=0 );
2b710 0a 20 20 61 73 73 65 72 74 28 20 2a 70 52 65 73  .  assert( *pRes
2b720 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
2b730 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3d   pCur->skipNext=
2b740 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61  =0 || pCur->eSta
2b750 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te!=CURSOR_VALID
2b760 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70   );.  assert( (p
2b770 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20  Cur->curFlags & 
2b780 28 42 54 43 46 5f 41 74 4c 61 73 74 7c 42 54 43  (BTCF_AtLast|BTC
2b790 46 5f 56 61 6c 69 64 4f 76 66 6c 7c 42 54 43 46  F_ValidOvfl|BTCF
2b7a0 5f 56 61 6c 69 64 4e 4b 65 79 29 29 3d 3d 30 20  _ValidNKey))==0 
2b7b0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
2b7c0 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30  r->info.nSize==0
2b7d0 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e   );.  if( pCur->
2b7e0 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56  eState!=CURSOR_V
2b7f0 41 4c 49 44 20 29 7b 0a 20 20 20 20 72 63 20 3d  ALID ){.    rc =
2b800 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f   restoreCursorPo
2b810 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20  sition(pCur);.  
2b820 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2b830 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74  _OK ){.      ret
2b840 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
2b850 20 20 69 66 28 20 43 55 52 53 4f 52 5f 49 4e 56    if( CURSOR_INV
2b860 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61  ALID==pCur->eSta
2b870 74 65 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 65  te ){.      *pRe
2b880 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 72 65 74  s = 1;.      ret
2b890 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
2b8a0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 43 75     }.    if( pCu
2b8b0 72 2d 3e 73 6b 69 70 4e 65 78 74 20 29 7b 0a 20  r->skipNext ){. 
2b8c0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75       assert( pCu
2b8d0 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
2b8e0 52 5f 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d  R_VALID || pCur-
2b8f0 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
2b900 53 4b 49 50 4e 45 58 54 20 29 3b 0a 20 20 20 20  SKIPNEXT );.    
2b910 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
2b920 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20   CURSOR_VALID;. 
2b930 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 73       if( pCur->s
2b940 6b 69 70 4e 65 78 74 3c 30 20 29 7b 0a 20 20 20  kipNext<0 ){.   
2b950 20 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e       pCur->skipN
2b960 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ext = 0;.       
2b970 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2b980 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  K;.      }.     
2b990 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20   pCur->skipNext 
2b9a0 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  = 0;.    }.  }..
2b9b0 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e    pPage = pCur->
2b9c0 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
2b9d0 67 65 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ge];.  assert( p
2b9e0 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a  Page->isInit );.
2b9f0 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
2ba00 61 66 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 64  af ){.    int id
2ba10 78 20 3d 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  x = pCur->aiIdx[
2ba20 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20  pCur->iPage];.  
2ba30 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69    rc = moveToChi
2ba40 6c 64 28 70 43 75 72 2c 20 67 65 74 34 62 79 74  ld(pCur, get4byt
2ba50 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  e(findCell(pPage
2ba60 2c 20 69 64 78 29 29 29 3b 0a 20 20 20 20 69 66  , idx)));.    if
2ba70 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
2ba80 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54  ;.    rc = moveT
2ba90 6f 52 69 67 68 74 6d 6f 73 74 28 70 43 75 72 29  oRightmost(pCur)
2baa0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77  ;.  }else{.    w
2bab0 68 69 6c 65 28 20 70 43 75 72 2d 3e 61 69 49 64  hile( pCur->aiId
2bac0 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3d 3d  x[pCur->iPage]==
2bad0 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  0 ){.      if( p
2bae0 43 75 72 2d 3e 69 50 61 67 65 3d 3d 30 20 29 7b  Cur->iPage==0 ){
2baf0 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 65  .        pCur->e
2bb00 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49  State = CURSOR_I
2bb10 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 20 20  NVALID;.        
2bb20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 20  *pRes = 1;.     
2bb30 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2bb40 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  _OK;.      }.   
2bb50 20 20 20 6d 6f 76 65 54 6f 50 61 72 65 6e 74 28     moveToParent(
2bb60 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20  pCur);.    }.   
2bb70 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
2bb80 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 3b 0a  nfo.nSize==0 );.
2bb90 20 20 20 20 61 73 73 65 72 74 28 20 28 70 43 75      assert( (pCu
2bba0 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 28 42  r->curFlags & (B
2bbb0 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54  TCF_ValidNKey|BT
2bbc0 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 29 3d 3d  CF_ValidOvfl))==
2bbd0 30 20 29 3b 0a 0a 20 20 20 20 70 43 75 72 2d 3e  0 );..    pCur->
2bbe0 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
2bbf0 65 5d 2d 2d 3b 0a 20 20 20 20 70 50 61 67 65 20  e]--;.    pPage 
2bc00 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  = pCur->apPage[p
2bc10 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20  Cur->iPage];.   
2bc20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b   if( pPage->intK
2bc30 65 79 20 26 26 20 21 70 50 61 67 65 2d 3e 6c 65  ey && !pPage->le
2bc40 61 66 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  af ){.      rc =
2bc50 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 72 65   sqlite3BtreePre
2bc60 76 69 6f 75 73 28 70 43 75 72 2c 20 70 52 65 73  vious(pCur, pRes
2bc70 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
2bc80 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2bc90 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  OK;.    }.  }.  
2bca0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 69 6e 74  return rc;.}.int
2bcb0 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 72 65   sqlite3BtreePre
2bcc0 76 69 6f 75 73 28 42 74 43 75 72 73 6f 72 20 2a  vious(BtCursor *
2bcd0 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29  pCur, int *pRes)
2bce0 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  {.  assert( curs
2bcf0 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
2bd00 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
2bd10 70 52 65 73 21 3d 30 20 29 3b 0a 20 20 61 73 73  pRes!=0 );.  ass
2bd20 65 72 74 28 20 2a 70 52 65 73 3d 3d 30 20 7c 7c  ert( *pRes==0 ||
2bd30 20 2a 70 52 65 73 3d 3d 31 20 29 3b 0a 20 20 61   *pRes==1 );.  a
2bd40 73 73 65 72 74 28 20 70 43 75 72 2d 3e 73 6b 69  ssert( pCur->ski
2bd50 70 4e 65 78 74 3d 3d 30 20 7c 7c 20 70 43 75 72  pNext==0 || pCur
2bd60 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52  ->eState!=CURSOR
2bd70 5f 56 41 4c 49 44 20 29 3b 0a 20 20 2a 70 52 65  _VALID );.  *pRe
2bd80 73 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63  s = 0;.  pCur->c
2bd90 75 72 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 43  urFlags &= ~(BTC
2bda0 46 5f 41 74 4c 61 73 74 7c 42 54 43 46 5f 56 61  F_AtLast|BTCF_Va
2bdb0 6c 69 64 4f 76 66 6c 7c 42 54 43 46 5f 56 61 6c  lidOvfl|BTCF_Val
2bdc0 69 64 4e 4b 65 79 29 3b 0a 20 20 70 43 75 72 2d  idNKey);.  pCur-
2bdd0 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b  >info.nSize = 0;
2bde0 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74  .  if( pCur->eSt
2bdf0 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate!=CURSOR_VALI
2be00 44 0a 20 20 20 7c 7c 20 70 43 75 72 2d 3e 61 69  D.   || pCur->ai
2be10 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
2be20 3d 3d 30 0a 20 20 20 7c 7c 20 70 43 75 72 2d 3e  ==0.   || pCur->
2be30 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
2be40 67 65 5d 2d 3e 6c 65 61 66 3d 3d 30 0a 20 20 29  ge]->leaf==0.  )
2be50 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 62 74 72  {.    return btr
2be60 65 65 50 72 65 76 69 6f 75 73 28 70 43 75 72 2c  eePrevious(pCur,
2be70 20 70 52 65 73 29 3b 0a 20 20 7d 0a 20 20 70 43   pRes);.  }.  pC
2be80 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
2be90 69 50 61 67 65 5d 2d 2d 3b 0a 20 20 72 65 74 75  iPage]--;.  retu
2bea0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
2beb0 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
2bec0 61 20 6e 65 77 20 70 61 67 65 20 66 72 6f 6d 20  a new page from 
2bed0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2bee0 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 77  e..**.** The new
2bef0 20 70 61 67 65 20 69 73 20 6d 61 72 6b 65 64 20   page is marked 
2bf00 61 73 20 64 69 72 74 79 2e 20 20 28 49 6e 20 6f  as dirty.  (In o
2bf10 74 68 65 72 20 77 6f 72 64 73 2c 20 73 71 6c 69  ther words, sqli
2bf20 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29 0a  te3PagerWrite().
2bf30 2a 2a 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  ** has already b
2bf40 65 65 6e 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68  een called on th
2bf50 65 20 6e 65 77 20 70 61 67 65 2e 29 20 20 54 68  e new page.)  Th
2bf60 65 20 6e 65 77 20 70 61 67 65 20 68 61 73 20 61  e new page has a
2bf70 6c 73 6f 0a 2a 2a 20 62 65 65 6e 20 72 65 66 65  lso.** been refe
2bf80 72 65 6e 63 65 64 20 61 6e 64 20 74 68 65 20 63  renced and the c
2bf90 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 20 69  alling routine i
2bfa0 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f  s responsible fo
2bfb0 72 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73 71 6c  r calling.** sql
2bfc0 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 29  ite3PagerUnref()
2bfd0 20 6f 6e 20 74 68 65 20 6e 65 77 20 70 61 67 65   on the new page
2bfe0 20 77 68 65 6e 20 69 74 20 69 73 20 64 6f 6e 65   when it is done
2bff0 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  ..**.** SQLITE_O
2c000 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 6f 6e  K is returned on
2c010 20 73 75 63 63 65 73 73 2e 20 20 41 6e 79 20 6f   success.  Any o
2c020 74 68 65 72 20 72 65 74 75 72 6e 20 76 61 6c 75  ther return valu
2c030 65 20 69 6e 64 69 63 61 74 65 73 0a 2a 2a 20 61  e indicates.** a
2c040 6e 20 65 72 72 6f 72 2e 20 20 2a 70 70 50 61 67  n error.  *ppPag
2c050 65 20 61 6e 64 20 2a 70 50 67 6e 6f 20 61 72 65  e and *pPgno are
2c060 20 75 6e 64 65 66 69 6e 65 64 20 69 6e 20 74 68   undefined in th
2c070 65 20 65 76 65 6e 74 20 6f 66 20 61 6e 20 65 72  e event of an er
2c080 72 6f 72 2e 0a 2a 2a 20 44 6f 20 6e 6f 74 20 69  ror..** Do not i
2c090 6e 76 6f 6b 65 20 73 71 6c 69 74 65 33 50 61 67  nvoke sqlite3Pag
2c0a0 65 72 55 6e 72 65 66 28 29 20 6f 6e 20 2a 70 70  erUnref() on *pp
2c0b0 50 61 67 65 20 69 66 20 61 6e 20 65 72 72 6f 72  Page if an error
2c0c0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a   is returned..**
2c0d0 0a 2a 2a 20 49 66 20 74 68 65 20 22 6e 65 61 72  .** If the "near
2c0e0 62 79 22 20 70 61 72 61 6d 65 74 65 72 20 69 73  by" parameter is
2c0f0 20 6e 6f 74 20 30 2c 20 74 68 65 6e 20 61 6e 20   not 0, then an 
2c100 65 66 66 6f 72 74 20 69 73 20 6d 61 64 65 20 74  effort is made t
2c110 6f 20 0a 2a 2a 20 6c 6f 63 61 74 65 20 61 20 70  o .** locate a p
2c120 61 67 65 20 63 6c 6f 73 65 20 74 6f 20 74 68 65  age close to the
2c130 20 70 61 67 65 20 6e 75 6d 62 65 72 20 22 6e 65   page number "ne
2c140 61 72 62 79 22 2e 20 20 54 68 69 73 20 63 61 6e  arby".  This can
2c150 20 62 65 20 75 73 65 64 20 69 6e 20 61 6e 0a 2a   be used in an.*
2c160 2a 20 61 74 74 65 6d 70 74 20 74 6f 20 6b 65 65  * attempt to kee
2c170 70 20 72 65 6c 61 74 65 64 20 70 61 67 65 73 20  p related pages 
2c180 63 6c 6f 73 65 20 74 6f 20 65 61 63 68 20 6f 74  close to each ot
2c190 68 65 72 20 69 6e 20 74 68 65 20 64 61 74 61 62  her in the datab
2c1a0 61 73 65 20 66 69 6c 65 2c 0a 2a 2a 20 77 68 69  ase file,.** whi
2c1b0 63 68 20 69 6e 20 74 75 72 6e 20 63 61 6e 20 6d  ch in turn can m
2c1c0 61 6b 65 20 64 61 74 61 62 61 73 65 20 61 63 63  ake database acc
2c1d0 65 73 73 20 66 61 73 74 65 72 2e 0a 2a 2a 0a 2a  ess faster..**.*
2c1e0 2a 20 49 66 20 74 68 65 20 65 4d 6f 64 65 20 70  * If the eMode p
2c1f0 61 72 61 6d 65 74 65 72 20 69 73 20 42 54 41 4c  arameter is BTAL
2c200 4c 4f 43 5f 45 58 41 43 54 20 61 6e 64 20 74 68  LOC_EXACT and th
2c210 65 20 6e 65 61 72 62 79 20 70 61 67 65 20 65 78  e nearby page ex
2c220 69 73 74 73 0a 2a 2a 20 61 6e 79 77 68 65 72 65  ists.** anywhere
2c230 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73   on the free-lis
2c240 74 2c 20 74 68 65 6e 20 69 74 20 69 73 20 67 75  t, then it is gu
2c250 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 72  aranteed to be r
2c260 65 74 75 72 6e 65 64 2e 20 20 49 66 0a 2a 2a 20  eturned.  If.** 
2c270 65 4d 6f 64 65 20 69 73 20 42 54 41 4c 4c 4f 43  eMode is BTALLOC
2c280 5f 4c 54 20 74 68 65 6e 20 74 68 65 20 70 61 67  _LT then the pag
2c290 65 20 72 65 74 75 72 6e 65 64 20 77 69 6c 6c 20  e returned will 
2c2a0 62 65 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20  be less than or 
2c2b0 65 71 75 61 6c 0a 2a 2a 20 74 6f 20 6e 65 61 72  equal.** to near
2c2c0 62 79 20 69 66 20 61 6e 79 20 73 75 63 68 20 70  by if any such p
2c2d0 61 67 65 20 65 78 69 73 74 73 2e 20 20 49 66 20  age exists.  If 
2c2e0 65 4d 6f 64 65 20 69 73 20 42 54 41 4c 4c 4f 43  eMode is BTALLOC
2c2f0 5f 41 4e 59 20 74 68 65 6e 20 74 68 65 72 65 0a  _ANY then there.
2c300 2a 2a 20 61 72 65 20 6e 6f 20 72 65 73 74 72 69  ** are no restri
2c310 63 74 69 6f 6e 73 20 6f 6e 20 77 68 69 63 68 20  ctions on which 
2c320 70 61 67 65 20 69 73 20 72 65 74 75 72 6e 65 64  page is returned
2c330 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2c340 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67  allocateBtreePag
2c350 65 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  e(.  BtShared *p
2c360 42 74 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54  Bt,         /* T
2c370 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 4d 65  he btree */.  Me
2c380 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20  mPage **ppPage, 
2c390 20 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 70 6f       /* Store po
2c3a0 69 6e 74 65 72 20 74 6f 20 74 68 65 20 61 6c 6c  inter to the all
2c3b0 6f 63 61 74 65 64 20 70 61 67 65 20 68 65 72 65  ocated page here
2c3c0 20 2a 2f 0a 20 20 50 67 6e 6f 20 2a 70 50 67 6e   */.  Pgno *pPgn
2c3d0 6f 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  o,           /* 
2c3e0 53 74 6f 72 65 20 74 68 65 20 70 61 67 65 20 6e  Store the page n
2c3f0 75 6d 62 65 72 20 68 65 72 65 20 2a 2f 0a 20 20  umber here */.  
2c400 50 67 6e 6f 20 6e 65 61 72 62 79 2c 20 20 20 20  Pgno nearby,    
2c410 20 20 20 20 20 20 20 2f 2a 20 53 65 61 72 63 68         /* Search
2c420 20 66 6f 72 20 61 20 70 61 67 65 20 6e 65 61 72   for a page near
2c430 20 74 68 69 73 20 6f 6e 65 20 2a 2f 0a 20 20 75   this one */.  u
2c440 38 20 65 4d 6f 64 65 20 20 20 20 20 20 20 20 20  8 eMode         
2c450 20 20 20 20 20 20 2f 2a 20 42 54 41 4c 4c 4f 43        /* BTALLOC
2c460 5f 45 58 41 43 54 2c 20 42 54 41 4c 4c 4f 43 5f  _EXACT, BTALLOC_
2c470 4c 54 2c 20 6f 72 20 42 54 41 4c 4c 4f 43 5f 41  LT, or BTALLOC_A
2c480 4e 59 20 2a 2f 0a 29 7b 0a 20 20 4d 65 6d 50 61  NY */.){.  MemPa
2c490 67 65 20 2a 70 50 61 67 65 31 3b 0a 20 20 69 6e  ge *pPage1;.  in
2c4a0 74 20 72 63 3b 0a 20 20 75 33 32 20 6e 3b 20 20  t rc;.  u32 n;  
2c4b0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2c4c0 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65  pages on the fre
2c4d0 65 6c 69 73 74 20 2a 2f 0a 20 20 75 33 32 20 6b  elist */.  u32 k
2c4e0 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20  ;     /* Number 
2c4f0 6f 66 20 6c 65 61 76 65 73 20 6f 6e 20 74 68 65  of leaves on the
2c500 20 74 72 75 6e 6b 20 6f 66 20 74 68 65 20 66 72   trunk of the fr
2c510 65 65 6c 69 73 74 20 2a 2f 0a 20 20 4d 65 6d 50  eelist */.  MemP
2c520 61 67 65 20 2a 70 54 72 75 6e 6b 20 3d 20 30 3b  age *pTrunk = 0;
2c530 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 72 65  .  MemPage *pPre
2c540 76 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 50 67  vTrunk = 0;.  Pg
2c550 6e 6f 20 6d 78 50 61 67 65 3b 20 20 20 20 20 2f  no mxPage;     /
2c560 2a 20 54 6f 74 61 6c 20 73 69 7a 65 20 6f 66 20  * Total size of 
2c570 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2c580 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  e */..  assert( 
2c590 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
2c5a0 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
2c5b0 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4d 6f 64  ;.  assert( eMod
2c5c0 65 3d 3d 42 54 41 4c 4c 4f 43 5f 41 4e 59 20 7c  e==BTALLOC_ANY |
2c5d0 7c 20 28 6e 65 61 72 62 79 3e 30 20 26 26 20 49  | (nearby>0 && I
2c5e0 66 4e 6f 74 4f 6d 69 74 41 56 28 70 42 74 2d 3e  fNotOmitAV(pBt->
2c5f0 61 75 74 6f 56 61 63 75 75 6d 29 29 20 29 3b 0a  autoVacuum)) );.
2c600 20 20 70 50 61 67 65 31 20 3d 20 70 42 74 2d 3e    pPage1 = pBt->
2c610 70 50 61 67 65 31 3b 0a 20 20 6d 78 50 61 67 65  pPage1;.  mxPage
2c620 20 3d 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e   = btreePagecoun
2c630 74 28 70 42 74 29 3b 0a 20 20 2f 2a 20 45 56 49  t(pBt);.  /* EVI
2c640 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 35 31 31  DENCE-OF: R-0511
2c650 39 2d 30 32 36 33 37 20 54 68 65 20 34 2d 62 79  9-02637 The 4-by
2c660 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e  te big-endian in
2c670 74 65 67 65 72 20 61 74 20 6f 66 66 73 65 74 20  teger at offset 
2c680 33 36 0a 20 20 2a 2a 20 73 74 6f 72 65 73 20 73  36.  ** stores s
2c690 74 6f 72 65 73 20 74 68 65 20 74 6f 74 61 6c 20  tores the total 
2c6a0 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
2c6b0 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e  on the freelist.
2c6c0 20 2a 2f 0a 20 20 6e 20 3d 20 67 65 74 34 62 79   */.  n = get4by
2c6d0 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
2c6e0 61 5b 33 36 5d 29 3b 0a 20 20 74 65 73 74 63 61  a[36]);.  testca
2c6f0 73 65 28 20 6e 3d 3d 6d 78 50 61 67 65 2d 31 20  se( n==mxPage-1 
2c700 29 3b 0a 20 20 69 66 28 20 6e 3e 3d 6d 78 50 61  );.  if( n>=mxPa
2c710 67 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ge ){.    return
2c720 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
2c730 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20  BKPT;.  }.  if( 
2c740 6e 3e 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  n>0 ){.    /* Th
2c750 65 72 65 20 61 72 65 20 70 61 67 65 73 20 6f 6e  ere are pages on
2c760 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20 20   the freelist.  
2c770 52 65 75 73 65 20 6f 6e 65 20 6f 66 20 74 68 6f  Reuse one of tho
2c780 73 65 20 70 61 67 65 73 2e 20 2a 2f 0a 20 20 20  se pages. */.   
2c790 20 50 67 6e 6f 20 69 54 72 75 6e 6b 3b 0a 20 20   Pgno iTrunk;.  
2c7a0 20 20 75 38 20 73 65 61 72 63 68 4c 69 73 74 20    u8 searchList 
2c7b0 3d 20 30 3b 20 2f 2a 20 49 66 20 74 68 65 20 66  = 0; /* If the f
2c7c0 72 65 65 2d 6c 69 73 74 20 6d 75 73 74 20 62 65  ree-list must be
2c7d0 20 73 65 61 72 63 68 65 64 20 66 6f 72 20 27 6e   searched for 'n
2c7e0 65 61 72 62 79 27 20 2a 2f 0a 20 20 20 20 0a 20  earby' */.    . 
2c7f0 20 20 20 2f 2a 20 49 66 20 65 4d 6f 64 65 3d 3d     /* If eMode==
2c800 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20 61 6e  BTALLOC_EXACT an
2c810 64 20 61 20 71 75 65 72 79 20 6f 66 20 74 68 65  d a query of the
2c820 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 20   pointer-map.   
2c830 20 2a 2a 20 73 68 6f 77 73 20 74 68 61 74 20 74   ** shows that t
2c840 68 65 20 70 61 67 65 20 27 6e 65 61 72 62 79 27  he page 'nearby'
2c850 20 69 73 20 73 6f 6d 65 77 68 65 72 65 20 6f 6e   is somewhere on
2c860 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 20   the free-list, 
2c870 74 68 65 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20  then.    ** the 
2c880 65 6e 74 69 72 65 2d 6c 69 73 74 20 77 69 6c 6c  entire-list will
2c890 20 62 65 20 73 65 61 72 63 68 65 64 20 66 6f 72   be searched for
2c8a0 20 74 68 61 74 20 70 61 67 65 2e 0a 20 20 20 20   that page..    
2c8b0 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
2c8c0 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
2c8d0 4d 0a 20 20 20 20 69 66 28 20 65 4d 6f 64 65 3d  M.    if( eMode=
2c8e0 3d 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20 29  =BTALLOC_EXACT )
2c8f0 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 65 61 72  {.      if( near
2c900 62 79 3c 3d 6d 78 50 61 67 65 20 29 7b 0a 20 20  by<=mxPage ){.  
2c910 20 20 20 20 20 20 75 38 20 65 54 79 70 65 3b 0a        u8 eType;.
2c920 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
2c930 6e 65 61 72 62 79 3e 30 20 29 3b 0a 20 20 20 20  nearby>0 );.    
2c940 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
2c950 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 3b 0a 20  >autoVacuum );. 
2c960 20 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d         rc = ptrm
2c970 61 70 47 65 74 28 70 42 74 2c 20 6e 65 61 72 62  apGet(pBt, nearb
2c980 79 2c 20 26 65 54 79 70 65 2c 20 30 29 3b 0a 20  y, &eType, 0);. 
2c990 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20         if( rc ) 
2c9a0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
2c9b0 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54     if( eType==PT
2c9c0 52 4d 41 50 5f 46 52 45 45 50 41 47 45 20 29 7b  RMAP_FREEPAGE ){
2c9d0 0a 20 20 20 20 20 20 20 20 20 20 73 65 61 72 63  .          searc
2c9e0 68 4c 69 73 74 20 3d 20 31 3b 0a 20 20 20 20 20  hList = 1;.     
2c9f0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
2ca00 20 7d 65 6c 73 65 20 69 66 28 20 65 4d 6f 64 65   }else if( eMode
2ca10 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45 20 29 7b 0a  ==BTALLOC_LE ){.
2ca20 20 20 20 20 20 20 73 65 61 72 63 68 4c 69 73 74        searchList
2ca30 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 23 65 6e 64   = 1;.    }.#end
2ca40 69 66 0a 0a 20 20 20 20 2f 2a 20 44 65 63 72 65  if..    /* Decre
2ca50 6d 65 6e 74 20 74 68 65 20 66 72 65 65 2d 6c 69  ment the free-li
2ca60 73 74 20 63 6f 75 6e 74 20 62 79 20 31 2e 20 53  st count by 1. S
2ca70 65 74 20 69 54 72 75 6e 6b 20 74 6f 20 74 68 65  et iTrunk to the
2ca80 20 69 6e 64 65 78 20 6f 66 20 74 68 65 0a 20 20   index of the.  
2ca90 20 20 2a 2a 20 66 69 72 73 74 20 66 72 65 65 2d    ** first free-
2caa0 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 2e  list trunk page.
2cab0 20 69 50 72 65 76 54 72 75 6e 6b 20 69 73 20 69   iPrevTrunk is i
2cac0 6e 69 74 69 61 6c 6c 79 20 31 2e 0a 20 20 20 20  nitially 1..    
2cad0 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  */.    rc = sqli
2cae0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
2caf0 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a  age1->pDbPage);.
2cb00 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
2cb10 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 75 74 34  urn rc;.    put4
2cb20 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44  byte(&pPage1->aD
2cb30 61 74 61 5b 33 36 5d 2c 20 6e 2d 31 29 3b 0a 0a  ata[36], n-1);..
2cb40 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 64 65 20      /* The code 
2cb50 77 69 74 68 69 6e 20 74 68 69 73 20 6c 6f 6f 70  within this loop
2cb60 20 69 73 20 72 75 6e 20 6f 6e 6c 79 20 6f 6e 63   is run only onc
2cb70 65 20 69 66 20 74 68 65 20 27 73 65 61 72 63 68  e if the 'search
2cb80 4c 69 73 74 27 20 76 61 72 69 61 62 6c 65 0a 20  List' variable. 
2cb90 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 74 72 75     ** is not tru
2cba0 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74  e. Otherwise, it
2cbb0 20 72 75 6e 73 20 6f 6e 63 65 20 66 6f 72 20 65   runs once for e
2cbc0 61 63 68 20 74 72 75 6e 6b 2d 70 61 67 65 20 6f  ach trunk-page o
2cbd0 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 66 72 65  n the.    ** fre
2cbe0 65 2d 6c 69 73 74 20 75 6e 74 69 6c 20 74 68 65  e-list until the
2cbf0 20 70 61 67 65 20 27 6e 65 61 72 62 79 27 20 69   page 'nearby' i
2cc00 73 20 6c 6f 63 61 74 65 64 20 28 65 4d 6f 64 65  s located (eMode
2cc10 3d 3d 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 29  ==BTALLOC_EXACT)
2cc20 0a 20 20 20 20 2a 2a 20 6f 72 20 75 6e 74 69 6c  .    ** or until
2cc30 20 61 20 70 61 67 65 20 6c 65 73 73 20 74 68 61   a page less tha
2cc40 6e 20 27 6e 65 61 72 62 79 27 20 69 73 20 6c 6f  n 'nearby' is lo
2cc50 63 61 74 65 64 20 28 65 4d 6f 64 65 3d 3d 42 54  cated (eMode==BT
2cc60 41 4c 4c 4f 43 5f 4c 54 29 0a 20 20 20 20 2a 2f  ALLOC_LT).    */
2cc70 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20  .    do {.      
2cc80 70 50 72 65 76 54 72 75 6e 6b 20 3d 20 70 54 72  pPrevTrunk = pTr
2cc90 75 6e 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 70  unk;.      if( p
2cca0 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20  PrevTrunk ){.   
2ccb0 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45       /* EVIDENCE
2ccc0 2d 4f 46 3a 20 52 2d 30 31 35 30 36 2d 31 31 30  -OF: R-01506-110
2ccd0 35 33 20 54 68 65 20 66 69 72 73 74 20 69 6e 74  53 The first int
2cce0 65 67 65 72 20 6f 6e 20 61 20 66 72 65 65 6c 69  eger on a freeli
2ccf0 73 74 20 74 72 75 6e 6b 20 70 61 67 65 0a 20 20  st trunk page.  
2cd00 20 20 20 20 20 20 2a 2a 20 69 73 20 74 68 65 20        ** is the 
2cd10 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  page number of t
2cd20 68 65 20 6e 65 78 74 20 66 72 65 65 6c 69 73 74  he next freelist
2cd30 20 74 72 75 6e 6b 20 70 61 67 65 20 69 6e 20 74   trunk page in t
2cd40 68 65 20 6c 69 73 74 20 6f 72 0a 20 20 20 20 20  he list or.     
2cd50 20 20 20 2a 2a 20 7a 65 72 6f 20 69 66 20 74 68     ** zero if th
2cd60 69 73 20 69 73 20 74 68 65 20 6c 61 73 74 20 66  is is the last f
2cd70 72 65 65 6c 69 73 74 20 74 72 75 6e 6b 20 70 61  reelist trunk pa
2cd80 67 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  ge. */.        i
2cd90 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65  Trunk = get4byte
2cda0 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44  (&pPrevTrunk->aD
2cdb0 61 74 61 5b 30 5d 29 3b 0a 20 20 20 20 20 20 7d  ata[0]);.      }
2cdc0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
2cdd0 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
2cde0 35 39 38 34 31 2d 31 33 37 39 38 20 54 68 65 20  59841-13798 The 
2cdf0 34 2d 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61  4-byte big-endia
2ce00 6e 20 69 6e 74 65 67 65 72 20 61 74 20 6f 66 66  n integer at off
2ce10 73 65 74 20 33 32 0a 20 20 20 20 20 20 20 20 2a  set 32.        *
2ce20 2a 20 73 74 6f 72 65 73 20 74 68 65 20 70 61 67  * stores the pag
2ce30 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  e number of the 
2ce40 66 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68  first page of th
2ce50 65 20 66 72 65 65 6c 69 73 74 2c 20 6f 72 20 7a  e freelist, or z
2ce60 65 72 6f 20 69 66 0a 20 20 20 20 20 20 20 20 2a  ero if.        *
2ce70 2a 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 69  * the freelist i
2ce80 73 20 65 6d 70 74 79 2e 20 2a 2f 0a 20 20 20 20  s empty. */.    
2ce90 20 20 20 20 69 54 72 75 6e 6b 20 3d 20 67 65 74      iTrunk = get
2cea0 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61  4byte(&pPage1->a
2ceb0 44 61 74 61 5b 33 32 5d 29 3b 0a 20 20 20 20 20  Data[32]);.     
2cec0 20 7d 0a 20 20 20 20 20 20 74 65 73 74 63 61 73   }.      testcas
2ced0 65 28 20 69 54 72 75 6e 6b 3d 3d 6d 78 50 61 67  e( iTrunk==mxPag
2cee0 65 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69  e );.      if( i
2cef0 54 72 75 6e 6b 3e 6d 78 50 61 67 65 20 29 7b 0a  Trunk>mxPage ){.
2cf00 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
2cf10 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
2cf20 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
2cf30 20 20 20 20 20 20 20 72 63 20 3d 20 62 74 72 65         rc = btre
2cf40 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 54  eGetPage(pBt, iT
2cf50 72 75 6e 6b 2c 20 26 70 54 72 75 6e 6b 2c 20 30  runk, &pTrunk, 0
2cf60 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
2cf70 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
2cf80 20 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20     pTrunk = 0;. 
2cf90 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
2cfa0 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20  allocate_page;. 
2cfb0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73       }.      ass
2cfc0 65 72 74 28 20 70 54 72 75 6e 6b 21 3d 30 20 29  ert( pTrunk!=0 )
2cfd0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
2cfe0 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 21 3d 30  pTrunk->aData!=0
2cff0 20 29 3b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49   );.      /* EVI
2d000 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 33 35 32  DENCE-OF: R-1352
2d010 33 2d 30 34 33 39 34 20 54 68 65 20 73 65 63 6f  3-04394 The seco
2d020 6e 64 20 69 6e 74 65 67 65 72 20 6f 6e 20 61 20  nd integer on a 
2d030 66 72 65 65 6c 69 73 74 20 74 72 75 6e 6b 20 70  freelist trunk p
2d040 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  age.      ** is 
2d050 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6c 65  the number of le
2d060 61 66 20 70 61 67 65 20 70 6f 69 6e 74 65 72 73  af page pointers
2d070 20 74 6f 20 66 6f 6c 6c 6f 77 2e 20 2a 2f 0a 20   to follow. */. 
2d080 20 20 20 20 20 6b 20 3d 20 67 65 74 34 62 79 74       k = get4byt
2d090 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  e(&pTrunk->aData
2d0a0 5b 34 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20  [4]);.      if( 
2d0b0 6b 3d 3d 30 20 26 26 20 21 73 65 61 72 63 68 4c  k==0 && !searchL
2d0c0 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ist ){.        /
2d0d0 2a 20 54 68 65 20 74 72 75 6e 6b 20 68 61 73 20  * The trunk has 
2d0e0 6e 6f 20 6c 65 61 76 65 73 20 61 6e 64 20 74 68  no leaves and th
2d0f0 65 20 6c 69 73 74 20 69 73 20 6e 6f 74 20 62 65  e list is not be
2d100 69 6e 67 20 73 65 61 72 63 68 65 64 2e 20 0a 20  ing searched. . 
2d110 20 20 20 20 20 20 20 2a 2a 20 53 6f 20 65 78 74         ** So ext
2d120 72 61 63 74 20 74 68 65 20 74 72 75 6e 6b 20 70  ract the trunk p
2d130 61 67 65 20 69 74 73 65 6c 66 20 61 6e 64 20 75  age itself and u
2d140 73 65 20 69 74 20 61 73 20 74 68 65 20 6e 65 77  se it as the new
2d150 6c 79 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  ly .        ** a
2d160 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 20 2a 2f  llocated page */
2d170 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
2d180 20 70 50 72 65 76 54 72 75 6e 6b 3d 3d 30 20 29   pPrevTrunk==0 )
2d190 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
2d1a0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
2d1b0 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65  (pTrunk->pDbPage
2d1c0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
2d1d0 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67  c ){.          g
2d1e0 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65  oto end_allocate
2d1f0 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 7d  _page;.        }
2d200 0a 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f 20  .        *pPgno 
2d210 3d 20 69 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20  = iTrunk;.      
2d220 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 31    memcpy(&pPage1
2d230 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 26 70 54  ->aData[32], &pT
2d240 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20  runk->aData[0], 
2d250 34 29 3b 0a 20 20 20 20 20 20 20 20 2a 70 70 50  4);.        *ppP
2d260 61 67 65 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20  age = pTrunk;.  
2d270 20 20 20 20 20 20 70 54 72 75 6e 6b 20 3d 20 30        pTrunk = 0
2d280 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43 45 28  ;.        TRACE(
2d290 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 74  ("ALLOCATE: %d t
2d2a0 72 75 6e 6b 20 2d 20 25 64 20 66 72 65 65 20 70  runk - %d free p
2d2b0 61 67 65 73 20 6c 65 66 74 5c 6e 22 2c 20 2a 70  ages left\n", *p
2d2c0 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20 20  Pgno, n-1));.   
2d2d0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6b 3e 28     }else if( k>(
2d2e0 75 33 32 29 28 70 42 74 2d 3e 75 73 61 62 6c 65  u32)(pBt->usable
2d2f0 53 69 7a 65 2f 34 20 2d 20 32 29 20 29 7b 0a 20  Size/4 - 2) ){. 
2d300 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20         /* Value 
2d310 6f 66 20 6b 20 69 73 20 6f 75 74 20 6f 66 20 72  of k is out of r
2d320 61 6e 67 65 2e 20 20 44 61 74 61 62 61 73 65 20  ange.  Database 
2d330 63 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20 20  corruption */.  
2d340 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
2d350 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
2d360 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
2d370 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
2d380 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2d390 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
2d3a0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73       }else if( s
2d3b0 65 61 72 63 68 4c 69 73 74 20 0a 20 20 20 20 20  earchList .     
2d3c0 20 20 20 20 20 20 20 26 26 20 28 6e 65 61 72 62         && (nearb
2d3d0 79 3d 3d 69 54 72 75 6e 6b 20 7c 7c 20 28 69 54  y==iTrunk || (iT
2d3e0 72 75 6e 6b 3c 6e 65 61 72 62 79 20 26 26 20 65  runk<nearby && e
2d3f0 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45  Mode==BTALLOC_LE
2d400 29 29 20 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  )) .      ){.   
2d410 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 69 73 74       /* The list
2d420 20 69 73 20 62 65 69 6e 67 20 73 65 61 72 63 68   is being search
2d430 65 64 20 61 6e 64 20 74 68 69 73 20 74 72 75 6e  ed and this trun
2d440 6b 20 70 61 67 65 20 69 73 20 74 68 65 20 70 61  k page is the pa
2d450 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f  ge.        ** to
2d460 20 61 6c 6c 6f 63 61 74 65 2c 20 72 65 67 61 72   allocate, regar
2d470 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65 72  dless of whether
2d480 20 69 74 20 68 61 73 20 6c 65 61 76 65 73 2e 0a   it has leaves..
2d490 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
2d4a0 20 20 20 2a 70 50 67 6e 6f 20 3d 20 69 54 72 75     *pPgno = iTru
2d4b0 6e 6b 3b 0a 20 20 20 20 20 20 20 20 2a 70 70 50  nk;.        *ppP
2d4c0 61 67 65 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20  age = pTrunk;.  
2d4d0 20 20 20 20 20 20 73 65 61 72 63 68 4c 69 73 74        searchList
2d4e0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 63   = 0;.        rc
2d4f0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
2d500 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62  rite(pTrunk->pDb
2d510 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69  Page);.        i
2d520 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
2d530 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f     goto end_allo
2d540 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20  cate_page;.     
2d550 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
2d560 20 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20   k==0 ){.       
2d570 20 20 20 69 66 28 20 21 70 50 72 65 76 54 72 75     if( !pPrevTru
2d580 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  nk ){.          
2d590 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 31    memcpy(&pPage1
2d5a0 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 26 70 54  ->aData[32], &pT
2d5b0 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20  runk->aData[0], 
2d5c0 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  4);.          }e
2d5d0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
2d5e0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
2d5f0 65 72 57 72 69 74 65 28 70 50 72 65 76 54 72 75  erWrite(pPrevTru
2d600 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  nk->pDbPage);.  
2d610 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
2d620 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2d630 20 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74               got
2d640 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
2d650 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  age;.           
2d660 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d   }.            m
2d670 65 6d 63 70 79 28 26 70 50 72 65 76 54 72 75 6e  emcpy(&pPrevTrun
2d680 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 26 70 54  k->aData[0], &pT
2d690 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20  runk->aData[0], 
2d6a0 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  4);.          }.
2d6b0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
2d6c0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
2d6d0 74 72 75 6e 6b 20 70 61 67 65 20 69 73 20 72 65  trunk page is re
2d6e0 71 75 69 72 65 64 20 62 79 20 74 68 65 20 63 61  quired by the ca
2d6f0 6c 6c 65 72 20 62 75 74 20 69 74 20 63 6f 6e 74  ller but it cont
2d700 61 69 6e 73 20 0a 20 20 20 20 20 20 20 20 20 20  ains .          
2d710 2a 2a 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 66  ** pointers to f
2d720 72 65 65 2d 6c 69 73 74 20 6c 65 61 76 65 73 2e  ree-list leaves.
2d730 20 54 68 65 20 66 69 72 73 74 20 6c 65 61 66 20   The first leaf 
2d740 62 65 63 6f 6d 65 73 20 61 20 74 72 75 6e 6b 0a  becomes a trunk.
2d750 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67            ** pag
2d760 65 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a  e in this case..
2d770 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
2d780 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a         MemPage *
2d790 70 4e 65 77 54 72 75 6e 6b 3b 0a 20 20 20 20 20  pNewTrunk;.     
2d7a0 20 20 20 20 20 50 67 6e 6f 20 69 4e 65 77 54 72       Pgno iNewTr
2d7b0 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26  unk = get4byte(&
2d7c0 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d  pTrunk->aData[8]
2d7d0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
2d7e0 20 69 4e 65 77 54 72 75 6e 6b 3e 6d 78 50 61 67   iNewTrunk>mxPag
2d7f0 65 20 29 7b 20 0a 20 20 20 20 20 20 20 20 20 20  e ){ .          
2d800 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
2d810 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
2d820 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
2d830 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
2d840 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2d850 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
2d860 69 4e 65 77 54 72 75 6e 6b 3d 3d 6d 78 50 61 67  iNewTrunk==mxPag
2d870 65 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  e );.          r
2d880 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65  c = btreeGetPage
2d890 28 70 42 74 2c 20 69 4e 65 77 54 72 75 6e 6b 2c  (pBt, iNewTrunk,
2d8a0 20 26 70 4e 65 77 54 72 75 6e 6b 2c 20 30 29 3b   &pNewTrunk, 0);
2d8b0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
2d8c0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2d8d0 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f              goto
2d8e0 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
2d8f0 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ge;.          }.
2d900 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
2d910 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
2d920 28 70 4e 65 77 54 72 75 6e 6b 2d 3e 70 44 62 50  (pNewTrunk->pDbP
2d930 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
2d940 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2d950 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
2d960 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4e 65   releasePage(pNe
2d970 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20  wTrunk);.       
2d980 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c       goto end_al
2d990 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20  locate_page;.   
2d9a0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2d9b0 20 20 20 6d 65 6d 63 70 79 28 26 70 4e 65 77 54     memcpy(&pNewT
2d9c0 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20  runk->aData[0], 
2d9d0 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30  &pTrunk->aData[0
2d9e0 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20  ], 4);.         
2d9f0 20 70 75 74 34 62 79 74 65 28 26 70 4e 65 77 54   put4byte(&pNewT
2da00 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c 20  runk->aData[4], 
2da10 6b 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20  k-1);.          
2da20 6d 65 6d 63 70 79 28 26 70 4e 65 77 54 72 75 6e  memcpy(&pNewTrun
2da30 6b 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 26 70 54  k->aData[8], &pT
2da40 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 31 32 5d 2c  runk->aData[12],
2da50 20 28 6b 2d 31 29 2a 34 29 3b 0a 20 20 20 20 20   (k-1)*4);.     
2da60 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
2da70 28 70 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20  (pNewTrunk);.   
2da80 20 20 20 20 20 20 20 69 66 28 20 21 70 50 72 65         if( !pPre
2da90 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20  vTrunk ){.      
2daa0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71        assert( sq
2dab0 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
2dac0 65 61 62 6c 65 28 70 50 61 67 65 31 2d 3e 70 44  eable(pPage1->pD
2dad0 62 50 61 67 65 29 20 29 3b 0a 20 20 20 20 20 20  bPage) );.      
2dae0 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
2daf0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32  pPage1->aData[32
2db00 5d 2c 20 69 4e 65 77 54 72 75 6e 6b 29 3b 0a 20  ], iNewTrunk);. 
2db10 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
2db20 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
2db30 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
2db40 74 65 28 70 50 72 65 76 54 72 75 6e 6b 2d 3e 70  te(pPrevTrunk->p
2db50 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
2db60 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
2db70 20 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74               got
2db80 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
2db90 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  age;.           
2dba0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70   }.            p
2dbb0 75 74 34 62 79 74 65 28 26 70 50 72 65 76 54 72  ut4byte(&pPrevTr
2dbc0 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 69  unk->aData[0], i
2dbd0 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20  NewTrunk);.     
2dbe0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
2dbf0 0a 20 20 20 20 20 20 20 20 70 54 72 75 6e 6b 20  .        pTrunk 
2dc00 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 54 52 41  = 0;.        TRA
2dc10 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25  CE(("ALLOCATE: %
2dc20 64 20 74 72 75 6e 6b 20 2d 20 25 64 20 66 72 65  d trunk - %d fre
2dc30 65 20 70 61 67 65 73 20 6c 65 66 74 5c 6e 22 2c  e pages left\n",
2dc40 20 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a   *pPgno, n-1));.
2dc50 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 65 6c  #endif.      }el
2dc60 73 65 20 69 66 28 20 6b 3e 30 20 29 7b 0a 20 20  se if( k>0 ){.  
2dc70 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 63 74        /* Extract
2dc80 20 61 20 6c 65 61 66 20 66 72 6f 6d 20 74 68 65   a leaf from the
2dc90 20 74 72 75 6e 6b 20 2a 2f 0a 20 20 20 20 20 20   trunk */.      
2dca0 20 20 75 33 32 20 63 6c 6f 73 65 73 74 3b 0a 20    u32 closest;. 
2dcb0 20 20 20 20 20 20 20 50 67 6e 6f 20 69 50 61 67         Pgno iPag
2dcc0 65 3b 0a 20 20 20 20 20 20 20 20 75 6e 73 69 67  e;.        unsig
2dcd0 6e 65 64 20 63 68 61 72 20 2a 61 44 61 74 61 20  ned char *aData 
2dce0 3d 20 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 3b  = pTrunk->aData;
2dcf0 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 65 61  .        if( nea
2dd00 72 62 79 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  rby>0 ){.       
2dd10 20 20 20 75 33 32 20 69 3b 0a 20 20 20 20 20 20     u32 i;.      
2dd20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 30 3b      closest = 0;
2dd30 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 65  .          if( e
2dd40 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45  Mode==BTALLOC_LE
2dd50 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2dd60 66 6f 72 28 69 3d 30 3b 20 69 3c 6b 3b 20 69 2b  for(i=0; i<k; i+
2dd70 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
2dd80 20 20 69 50 61 67 65 20 3d 20 67 65 74 34 62 79    iPage = get4by
2dd90 74 65 28 26 61 44 61 74 61 5b 38 2b 69 2a 34 5d  te(&aData[8+i*4]
2dda0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
2ddb0 20 69 66 28 20 69 50 61 67 65 3c 3d 6e 65 61 72   if( iPage<=near
2ddc0 62 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  by ){.          
2ddd0 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d 20        closest = 
2dde0 69 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  i;.             
2ddf0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
2de00 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2de10 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2de20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2de30 20 20 20 20 20 69 6e 74 20 64 69 73 74 3b 0a 20       int dist;. 
2de40 20 20 20 20 20 20 20 20 20 20 20 64 69 73 74 20             dist 
2de50 3d 20 73 71 6c 69 74 65 33 41 62 73 49 6e 74 33  = sqlite3AbsInt3
2de60 32 28 67 65 74 34 62 79 74 65 28 26 61 44 61 74  2(get4byte(&aDat
2de70 61 5b 38 5d 29 20 2d 20 6e 65 61 72 62 79 29 3b  a[8]) - nearby);
2de80 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72  .            for
2de90 28 69 3d 31 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b  (i=1; i<k; i++){
2dea0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
2deb0 6e 74 20 64 32 20 3d 20 73 71 6c 69 74 65 33 41  nt d2 = sqlite3A
2dec0 62 73 49 6e 74 33 32 28 67 65 74 34 62 79 74 65  bsInt32(get4byte
2ded0 28 26 61 44 61 74 61 5b 38 2b 69 2a 34 5d 29 20  (&aData[8+i*4]) 
2dee0 2d 20 6e 65 61 72 62 79 29 3b 0a 20 20 20 20 20  - nearby);.     
2def0 20 20 20 20 20 20 20 20 20 69 66 28 20 64 32 3c           if( d2<
2df00 64 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20  dist ){.        
2df10 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20          closest 
2df20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = i;.           
2df30 20 20 20 20 20 64 69 73 74 20 3d 20 64 32 3b 0a       dist = d2;.
2df40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
2df50 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
2df60 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2df70 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2df80 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 30 3b 0a     closest = 0;.
2df90 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
2dfa0 20 20 20 69 50 61 67 65 20 3d 20 67 65 74 34 62     iPage = get4b
2dfb0 79 74 65 28 26 61 44 61 74 61 5b 38 2b 63 6c 6f  yte(&aData[8+clo
2dfc0 73 65 73 74 2a 34 5d 29 3b 0a 20 20 20 20 20 20  sest*4]);.      
2dfd0 20 20 74 65 73 74 63 61 73 65 28 20 69 50 61 67    testcase( iPag
2dfe0 65 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20 20  e==mxPage );.   
2dff0 20 20 20 20 20 69 66 28 20 69 50 61 67 65 3e 6d       if( iPage>m
2e000 78 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20  xPage ){.       
2e010 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
2e020 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
2e030 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
2e040 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20  allocate_page;. 
2e050 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2e060 20 74 65 73 74 63 61 73 65 28 20 69 50 61 67 65   testcase( iPage
2e070 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20 20 20  ==mxPage );.    
2e080 20 20 20 20 69 66 28 20 21 73 65 61 72 63 68 4c      if( !searchL
2e090 69 73 74 20 0a 20 20 20 20 20 20 20 20 20 7c 7c  ist .         ||
2e0a0 20 28 69 50 61 67 65 3d 3d 6e 65 61 72 62 79 20   (iPage==nearby 
2e0b0 7c 7c 20 28 69 50 61 67 65 3c 6e 65 61 72 62 79  || (iPage<nearby
2e0c0 20 26 26 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c   && eMode==BTALL
2e0d0 4f 43 5f 4c 45 29 29 20 0a 20 20 20 20 20 20 20  OC_LE)) .       
2e0e0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   ){.          in
2e0f0 74 20 6e 6f 43 6f 6e 74 65 6e 74 3b 0a 20 20 20  t noContent;.   
2e100 20 20 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20         *pPgno = 
2e110 69 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20  iPage;.         
2e120 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54   TRACE(("ALLOCAT
2e130 45 3a 20 25 64 20 77 61 73 20 6c 65 61 66 20 25  E: %d was leaf %
2e140 64 20 6f 66 20 25 64 20 6f 6e 20 74 72 75 6e 6b  d of %d on trunk
2e150 20 25 64 22 0a 20 20 20 20 20 20 20 20 20 20 20   %d".           
2e160 20 20 20 20 20 20 22 3a 20 25 64 20 6d 6f 72 65        ": %d more
2e170 20 66 72 65 65 20 70 61 67 65 73 5c 6e 22 2c 0a   free pages\n",.
2e180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e190 20 2a 70 50 67 6e 6f 2c 20 63 6c 6f 73 65 73 74   *pPgno, closest
2e1a0 2b 31 2c 20 6b 2c 20 70 54 72 75 6e 6b 2d 3e 70  +1, k, pTrunk->p
2e1b0 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20 20 20  gno, n-1));.    
2e1c0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
2e1d0 65 33 50 61 67 65 72 57 72 69 74 65 28 70 54 72  e3PagerWrite(pTr
2e1e0 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  unk->pDbPage);. 
2e1f0 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20           if( rc 
2e200 29 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63  ) goto end_alloc
2e210 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20  ate_page;.      
2e220 20 20 20 20 69 66 28 20 63 6c 6f 73 65 73 74 3c      if( closest<
2e230 6b 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20  k-1 ){.         
2e240 20 20 20 6d 65 6d 63 70 79 28 26 61 44 61 74 61     memcpy(&aData
2e250 5b 38 2b 63 6c 6f 73 65 73 74 2a 34 5d 2c 20 26  [8+closest*4], &
2e260 61 44 61 74 61 5b 34 2b 6b 2a 34 5d 2c 20 34 29  aData[4+k*4], 4)
2e270 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
2e280 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
2e290 28 26 61 44 61 74 61 5b 34 5d 2c 20 6b 2d 31 29  (&aData[4], k-1)
2e2a0 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 6f 43 6f  ;.          noCo
2e2b0 6e 74 65 6e 74 20 3d 20 21 62 74 72 65 65 47 65  ntent = !btreeGe
2e2c0 74 48 61 73 43 6f 6e 74 65 6e 74 28 70 42 74 2c  tHasContent(pBt,
2e2d0 20 2a 70 50 67 6e 6f 29 3f 20 50 41 47 45 52 5f   *pPgno)? PAGER_
2e2e0 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 3a 20  GET_NOCONTENT : 
2e2f0 30 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  0;.          rc 
2e300 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70  = btreeGetPage(p
2e310 42 74 2c 20 2a 70 50 67 6e 6f 2c 20 70 70 50 61  Bt, *pPgno, ppPa
2e320 67 65 2c 20 6e 6f 43 6f 6e 74 65 6e 74 29 3b 0a  ge, noContent);.
2e330 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
2e340 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2e350 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
2e360 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
2e370 65 28 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62  e((*ppPage)->pDb
2e380 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
2e390 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
2e3a0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
2e3b0 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
2e3c0 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20  e(*ppPage);.    
2e3d0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2e3e0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2e3f0 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b 0a  searchList = 0;.
2e400 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2e410 7d 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  }.      releaseP
2e420 61 67 65 28 70 50 72 65 76 54 72 75 6e 6b 29 3b  age(pPrevTrunk);
2e430 0a 20 20 20 20 20 20 70 50 72 65 76 54 72 75 6e  .      pPrevTrun
2e440 6b 20 3d 20 30 3b 0a 20 20 20 20 7d 77 68 69 6c  k = 0;.    }whil
2e450 65 28 20 73 65 61 72 63 68 4c 69 73 74 20 29 3b  e( searchList );
2e460 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
2e470 20 54 68 65 72 65 20 61 72 65 20 6e 6f 20 70 61   There are no pa
2e480 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c  ges on the freel
2e490 69 73 74 2c 20 73 6f 20 61 70 70 65 6e 64 20 61  ist, so append a
2e4a0 20 6e 65 77 20 70 61 67 65 20 74 6f 20 74 68 65   new page to the
2e4b0 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65  .    ** database
2e4c0 20 69 6d 61 67 65 2e 0a 20 20 20 20 2a 2a 0a 20   image..    **. 
2e4d0 20 20 20 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20     ** Normally, 
2e4e0 6e 65 77 20 70 61 67 65 73 20 61 6c 6c 6f 63 61  new pages alloca
2e4f0 74 65 64 20 62 79 20 74 68 69 73 20 62 6c 6f 63  ted by this bloc
2e500 6b 20 63 61 6e 20 62 65 20 72 65 71 75 65 73 74  k can be request
2e510 65 64 20 66 72 6f 6d 20 74 68 65 0a 20 20 20 20  ed from the.    
2e520 2a 2a 20 70 61 67 65 72 20 6c 61 79 65 72 20 77  ** pager layer w
2e530 69 74 68 20 74 68 65 20 27 6e 6f 2d 63 6f 6e 74  ith the 'no-cont
2e540 65 6e 74 27 20 66 6c 61 67 20 73 65 74 2e 20 54  ent' flag set. T
2e550 68 69 73 20 70 72 65 76 65 6e 74 73 20 74 68 65  his prevents the
2e560 20 70 61 67 65 72 0a 20 20 20 20 2a 2a 20 66 72   pager.    ** fr
2e570 6f 6d 20 74 72 79 69 6e 67 20 74 6f 20 72 65 61  om trying to rea
2e580 64 20 74 68 65 20 70 61 67 65 73 20 63 6f 6e 74  d the pages cont
2e590 65 6e 74 20 66 72 6f 6d 20 64 69 73 6b 2e 20 48  ent from disk. H
2e5a0 6f 77 65 76 65 72 2c 20 69 66 20 74 68 65 0a 20  owever, if the. 
2e5b0 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 74 72     ** current tr
2e5c0 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 61 6c  ansaction has al
2e5d0 72 65 61 64 79 20 72 75 6e 20 6f 6e 65 20 6f 72  ready run one or
2e5e0 20 6d 6f 72 65 20 69 6e 63 72 65 6d 65 6e 74 61   more incrementa
2e5f0 6c 2d 76 61 63 75 75 6d 0a 20 20 20 20 2a 2a 20  l-vacuum.    ** 
2e600 73 74 65 70 73 2c 20 74 68 65 6e 20 74 68 65 20  steps, then the 
2e610 70 61 67 65 20 77 65 20 61 72 65 20 61 62 6f 75  page we are abou
2e620 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 61  t to allocate ma
2e630 79 20 63 6f 6e 74 61 69 6e 20 63 6f 6e 74 65 6e  y contain conten
2e640 74 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 69 73  t.    ** that is
2e650 20 72 65 71 75 69 72 65 64 20 69 6e 20 74 68 65   required in the
2e660 20 65 76 65 6e 74 20 6f 66 20 61 20 72 6f 6c 6c   event of a roll
2e670 62 61 63 6b 2e 20 49 6e 20 74 68 69 73 20 63 61  back. In this ca
2e680 73 65 2c 20 64 6f 0a 20 20 20 20 2a 2a 20 6e 6f  se, do.    ** no
2e690 74 20 73 65 74 20 74 68 65 20 6e 6f 2d 63 6f 6e  t set the no-con
2e6a0 74 65 6e 74 20 66 6c 61 67 2e 20 54 68 69 73 20  tent flag. This 
2e6b0 63 61 75 73 65 73 20 74 68 65 20 70 61 67 65 72  causes the pager
2e6c0 20 74 6f 20 6c 6f 61 64 20 61 6e 64 20 6a 6f 75   to load and jou
2e6d0 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 74 68 65 20  rnal.    ** the 
2e6e0 63 75 72 72 65 6e 74 20 70 61 67 65 20 63 6f 6e  current page con
2e6f0 74 65 6e 74 20 62 65 66 6f 72 65 20 6f 76 65 72  tent before over
2e700 77 72 69 74 69 6e 67 20 69 74 2e 0a 20 20 20 20  writing it..    
2e710 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74  **.    ** Note t
2e720 68 61 74 20 74 68 65 20 70 61 67 65 72 20 77 69  hat the pager wi
2e730 6c 6c 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20  ll not actually 
2e740 61 74 74 65 6d 70 74 20 74 6f 20 6c 6f 61 64 20  attempt to load 
2e750 6f 72 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 20 20  or journal .    
2e760 2a 2a 20 63 6f 6e 74 65 6e 74 20 66 6f 72 20 61  ** content for a
2e770 6e 79 20 70 61 67 65 20 74 68 61 74 20 72 65 61  ny page that rea
2e780 6c 6c 79 20 64 6f 65 73 20 6c 69 65 20 70 61 73  lly does lie pas
2e790 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
2e7a0 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a   database.    **
2e7b0 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 20 53   file on disk. S
2e7c0 6f 20 74 68 65 20 65 66 66 65 63 74 73 20 6f 66  o the effects of
2e7d0 20 64 69 73 61 62 6c 69 6e 67 20 74 68 65 20 6e   disabling the n
2e7e0 6f 2d 63 6f 6e 74 65 6e 74 20 6f 70 74 69 6d 69  o-content optimi
2e7f0 7a 61 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 68 65  zation.    ** he
2e800 72 65 20 61 72 65 20 63 6f 6e 66 69 6e 65 64 20  re are confined 
2e810 74 6f 20 74 68 6f 73 65 20 70 61 67 65 73 20 74  to those pages t
2e820 68 61 74 20 6c 69 65 20 62 65 74 77 65 65 6e 20  hat lie between 
2e830 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 20  the end of the. 
2e840 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69     ** database i
2e850 6d 61 67 65 20 61 6e 64 20 74 68 65 20 65 6e 64  mage and the end
2e860 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
2e870 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   file..    */.  
2e880 20 20 69 6e 74 20 62 4e 6f 43 6f 6e 74 65 6e 74    int bNoContent
2e890 20 3d 20 28 30 3d 3d 49 66 4e 6f 74 4f 6d 69 74   = (0==IfNotOmit
2e8a0 41 56 28 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63  AV(pBt->bDoTrunc
2e8b0 61 74 65 29 29 3f 20 50 41 47 45 52 5f 47 45 54  ate))? PAGER_GET
2e8c0 5f 4e 4f 43 4f 4e 54 45 4e 54 3a 30 3b 0a 0a 20  _NOCONTENT:0;.. 
2e8d0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
2e8e0 61 67 65 72 57 72 69 74 65 28 70 42 74 2d 3e 70  agerWrite(pBt->p
2e8f0 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b  Page1->pDbPage);
2e900 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
2e910 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 42 74  turn rc;.    pBt
2e920 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 20 20 20 20 69  ->nPage++;.    i
2e930 66 28 20 70 42 74 2d 3e 6e 50 61 67 65 3d 3d 50  f( 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 20 70 42 74 2d 3e 6e 50 61  (pBt) ) pBt->nPa
2e960 67 65 2b 2b 3b 0a 0a 23 69 66 6e 64 65 66 20 53  ge++;..#ifndef S
2e970 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
2e980 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70 42  ACUUM.    if( pB
2e990 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 26 26  t->autoVacuum &&
2e9a0 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70   PTRMAP_ISPAGE(p
2e9b0 42 74 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 20  Bt, pBt->nPage) 
2e9c0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 2a  ){.      /* If *
2e9d0 70 50 67 6e 6f 20 72 65 66 65 72 73 20 74 6f 20  pPgno refers to 
2e9e0 61 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61  a pointer-map pa
2e9f0 67 65 2c 20 61 6c 6c 6f 63 61 74 65 20 74 77 6f  ge, allocate two
2ea00 20 6e 65 77 20 70 61 67 65 73 0a 20 20 20 20 20   new pages.     
2ea10 20 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20 6f   ** at the end o
2ea20 66 20 74 68 65 20 66 69 6c 65 20 69 6e 73 74 65  f the file inste
2ea30 61 64 20 6f 66 20 6f 6e 65 2e 20 54 68 65 20 66  ad of one. The f
2ea40 69 72 73 74 20 61 6c 6c 6f 63 61 74 65 64 20 70  irst allocated p
2ea50 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 62 65 63  age.      ** bec
2ea60 6f 6d 65 73 20 61 20 6e 65 77 20 70 6f 69 6e 74  omes a new point
2ea70 65 72 2d 6d 61 70 20 70 61 67 65 2c 20 74 68 65  er-map page, the
2ea80 20 73 65 63 6f 6e 64 20 69 73 20 75 73 65 64 20   second is used 
2ea90 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 20  by the caller.. 
2eaa0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 4d 65       */.      Me
2eab0 6d 50 61 67 65 20 2a 70 50 67 20 3d 20 30 3b 0a  mPage *pPg = 0;.
2eac0 20 20 20 20 20 20 54 52 41 43 45 28 28 22 41 4c        TRACE(("AL
2ead0 4c 4f 43 41 54 45 3a 20 25 64 20 66 72 6f 6d 20  LOCATE: %d from 
2eae0 65 6e 64 20 6f 66 20 66 69 6c 65 20 28 70 6f 69  end of file (poi
2eaf0 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 29 5c 6e  nter-map page)\n
2eb00 22 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 29 3b  ", pBt->nPage));
2eb10 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
2eb20 42 74 2d 3e 6e 50 61 67 65 21 3d 50 45 4e 44 49  Bt->nPage!=PENDI
2eb30 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
2eb40 29 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  ) );.      rc = 
2eb50 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  btreeGetPage(pBt
2eb60 2c 20 70 42 74 2d 3e 6e 50 61 67 65 2c 20 26 70  , pBt->nPage, &p
2eb70 50 67 2c 20 62 4e 6f 43 6f 6e 74 65 6e 74 29 3b  Pg, bNoContent);
2eb80 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
2eb90 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2eba0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2ebb0 50 61 67 65 72 57 72 69 74 65 28 70 50 67 2d 3e  PagerWrite(pPg->
2ebc0 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
2ebd0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
2ebe0 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  g);.      }.    
2ebf0 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
2ec00 6e 20 72 63 3b 0a 20 20 20 20 20 20 70 42 74 2d  n rc;.      pBt-
2ec10 3e 6e 50 61 67 65 2b 2b 3b 0a 20 20 20 20 20 20  >nPage++;.      
2ec20 69 66 28 20 70 42 74 2d 3e 6e 50 61 67 65 3d 3d  if( pBt->nPage==
2ec30 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
2ec40 45 28 70 42 74 29 20 29 7b 20 70 42 74 2d 3e 6e  E(pBt) ){ pBt->n
2ec50 50 61 67 65 2b 2b 3b 20 7d 0a 20 20 20 20 7d 0a  Page++; }.    }.
2ec60 23 65 6e 64 69 66 0a 20 20 20 20 70 75 74 34 62  #endif.    put4b
2ec70 79 74 65 28 32 38 20 2b 20 28 75 38 2a 29 70 42  yte(28 + (u8*)pB
2ec80 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61  t->pPage1->aData
2ec90 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20  , pBt->nPage);. 
2eca0 20 20 20 2a 70 50 67 6e 6f 20 3d 20 70 42 74 2d     *pPgno = pBt-
2ecb0 3e 6e 50 61 67 65 3b 0a 0a 20 20 20 20 61 73 73  >nPage;..    ass
2ecc0 65 72 74 28 20 2a 70 50 67 6e 6f 21 3d 50 45 4e  ert( *pPgno!=PEN
2ecd0 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
2ece0 42 74 29 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  Bt) );.    rc = 
2ecf0 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  btreeGetPage(pBt
2ed00 2c 20 2a 70 50 67 6e 6f 2c 20 70 70 50 61 67 65  , *pPgno, ppPage
2ed10 2c 20 62 4e 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20  , bNoContent);. 
2ed20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
2ed30 72 6e 20 72 63 3b 0a 20 20 20 20 72 63 20 3d 20  rn rc;.    rc = 
2ed40 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
2ed50 65 28 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62  e((*ppPage)->pDb
2ed60 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
2ed70 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2ed80 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
2ed90 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20  e(*ppPage);.    
2eda0 7d 0a 20 20 20 20 54 52 41 43 45 28 28 22 41 4c  }.    TRACE(("AL
2edb0 4c 4f 43 41 54 45 3a 20 25 64 20 66 72 6f 6d 20  LOCATE: %d from 
2edc0 65 6e 64 20 6f 66 20 66 69 6c 65 5c 6e 22 2c 20  end of file\n", 
2edd0 2a 70 50 67 6e 6f 29 29 3b 0a 20 20 7d 0a 0a 20  *pPgno));.  }.. 
2ede0 20 61 73 73 65 72 74 28 20 2a 70 50 67 6e 6f 21   assert( *pPgno!
2edf0 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
2ee00 47 45 28 70 42 74 29 20 29 3b 0a 0a 65 6e 64 5f  GE(pBt) );..end_
2ee10 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3a 0a 20  allocate_page:. 
2ee20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 72   releasePage(pTr
2ee30 75 6e 6b 29 3b 0a 20 20 72 65 6c 65 61 73 65 50  unk);.  releaseP
2ee40 61 67 65 28 70 50 72 65 76 54 72 75 6e 6b 29 3b  age(pPrevTrunk);
2ee50 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
2ee60 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  E_OK ){.    if( 
2ee70 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
2ee80 52 65 66 63 6f 75 6e 74 28 28 2a 70 70 50 61 67  Refcount((*ppPag
2ee90 65 29 2d 3e 70 44 62 50 61 67 65 29 3e 31 20 29  e)->pDbPage)>1 )
2eea0 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  {.      releaseP
2eeb0 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20  age(*ppPage);.  
2eec0 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b      *ppPage = 0;
2eed0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
2eee0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
2eef0 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 28 2a 70  T;.    }.    (*p
2ef00 70 50 61 67 65 29 2d 3e 69 73 49 6e 69 74 20 3d  pPage)->isInit =
2ef10 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
2ef20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20   *ppPage = 0;.  
2ef30 7d 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d  }.  assert( rc!=
2ef40 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 71 6c  SQLITE_OK || sql
2ef50 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
2ef60 61 62 6c 65 28 28 2a 70 70 50 61 67 65 29 2d 3e  able((*ppPage)->
2ef70 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 72 65  pDbPage) );.  re
2ef80 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
2ef90 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
2efa0 69 73 20 75 73 65 64 20 74 6f 20 61 64 64 20 70  is used to add p
2efb0 61 67 65 20 69 50 61 67 65 20 74 6f 20 74 68 65  age iPage to the
2efc0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 66   database file f
2efd0 72 65 65 2d 6c 69 73 74 2e 20 0a 2a 2a 20 49 74  ree-list. .** It
2efe0 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74   is assumed that
2eff0 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
2f000 20 61 6c 72 65 61 64 79 20 61 20 70 61 72 74 20   already a part 
2f010 6f 66 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  of the free-list
2f020 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 61 6c 75  ..**.** The valu
2f030 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  e passed as the 
2f040 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
2f050 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
2f060 20 69 73 20 6f 70 74 69 6f 6e 61 6c 2e 0a 2a 2a   is optional..**
2f070 20 49 66 20 74 68 65 20 63 61 6c 6c 65 72 20 68   If the caller h
2f080 61 70 70 65 6e 73 20 74 6f 20 68 61 76 65 20 61  appens to have a
2f090 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
2f0a0 4d 65 6d 50 61 67 65 20 6f 62 6a 65 63 74 20 0a  MemPage object .
2f0b0 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  ** corresponding
2f0c0 20 74 6f 20 70 61 67 65 20 69 50 61 67 65 20 68   to page iPage h
2f0d0 61 6e 64 79 2c 20 69 74 20 6d 61 79 20 70 61 73  andy, it may pas
2f0e0 73 20 69 74 20 61 73 20 74 68 65 20 73 65 63 6f  s it as the seco
2f0f0 6e 64 20 76 61 6c 75 65 2e 20 0a 2a 2a 20 4f 74  nd value. .** Ot
2f100 68 65 72 77 69 73 65 2c 20 69 74 20 6d 61 79 20  herwise, it may 
2f110 70 61 73 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a  pass NULL..**.**
2f120 20 49 66 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   If a pointer to
2f130 20 61 20 4d 65 6d 50 61 67 65 20 6f 62 6a 65 63   a MemPage objec
2f140 74 20 69 73 20 70 61 73 73 65 64 20 61 73 20 74  t is passed as t
2f150 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
2f160 6e 74 2c 0a 2a 2a 20 69 74 73 20 72 65 66 65 72  nt,.** its refer
2f170 65 6e 63 65 20 63 6f 75 6e 74 20 69 73 20 6e 6f  ence count is no
2f180 74 20 61 6c 74 65 72 65 64 20 62 79 20 74 68 69  t altered by thi
2f190 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  s function..*/.s
2f1a0 74 61 74 69 63 20 69 6e 74 20 66 72 65 65 50 61  tatic int freePa
2f1b0 67 65 32 28 42 74 53 68 61 72 65 64 20 2a 70 42  ge2(BtShared *pB
2f1c0 74 2c 20 4d 65 6d 50 61 67 65 20 2a 70 4d 65 6d  t, MemPage *pMem
2f1d0 50 61 67 65 2c 20 50 67 6e 6f 20 69 50 61 67 65  Page, Pgno iPage
2f1e0 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 54  ){.  MemPage *pT
2f1f0 72 75 6e 6b 20 3d 20 30 3b 20 20 20 20 20 20 20  runk = 0;       
2f200 20 20 20 20 20 20 20 20 20 2f 2a 20 46 72 65 65           /* Free
2f210 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65  -list trunk page
2f220 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 54 72 75 6e   */.  Pgno iTrun
2f230 6b 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  k = 0;          
2f240 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
2f250 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 72 65 65  e number of free
2f260 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65  -list trunk page
2f270 20 2a 2f 20 0a 20 20 4d 65 6d 50 61 67 65 20 2a   */ .  MemPage *
2f280 70 50 61 67 65 31 20 3d 20 70 42 74 2d 3e 70 50  pPage1 = pBt->pP
2f290 61 67 65 31 3b 20 20 20 20 20 20 2f 2a 20 4c 6f  age1;      /* Lo
2f2a0 63 61 6c 20 72 65 66 65 72 65 6e 63 65 20 74 6f  cal reference to
2f2b0 20 70 61 67 65 20 31 20 2a 2f 0a 20 20 4d 65 6d   page 1 */.  Mem
2f2c0 50 61 67 65 20 2a 70 50 61 67 65 3b 20 20 20 20  Page *pPage;    
2f2d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f2e0 20 2f 2a 20 50 61 67 65 20 62 65 69 6e 67 20 66   /* Page being f
2f2f0 72 65 65 64 2e 20 4d 61 79 20 62 65 20 4e 55 4c  reed. May be NUL
2f300 4c 2e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  L. */.  int rc; 
2f310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f320 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
2f330 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20  eturn Code */.  
2f340 69 6e 74 20 6e 46 72 65 65 3b 20 20 20 20 20 20  int nFree;      
2f350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f360 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20 6e      /* Initial n
2f370 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 6f  umber of pages o
2f380 6e 20 66 72 65 65 2d 6c 69 73 74 20 2a 2f 0a 0a  n free-list */..
2f390 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
2f3a0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
2f3b0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
2f3c0 73 65 72 74 28 20 69 50 61 67 65 3e 31 20 29 3b  sert( iPage>1 );
2f3d0 0a 20 20 61 73 73 65 72 74 28 20 21 70 4d 65 6d  .  assert( !pMem
2f3e0 50 61 67 65 20 7c 7c 20 70 4d 65 6d 50 61 67 65  Page || pMemPage
2f3f0 2d 3e 70 67 6e 6f 3d 3d 69 50 61 67 65 20 29 3b  ->pgno==iPage );
2f400 0a 0a 20 20 69 66 28 20 70 4d 65 6d 50 61 67 65  ..  if( pMemPage
2f410 20 29 7b 0a 20 20 20 20 70 50 61 67 65 20 3d 20   ){.    pPage = 
2f420 70 4d 65 6d 50 61 67 65 3b 0a 20 20 20 20 73 71  pMemPage;.    sq
2f430 6c 69 74 65 33 50 61 67 65 72 52 65 66 28 70 50  lite3PagerRef(pP
2f440 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  age->pDbPage);. 
2f450 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67   }else{.    pPag
2f460 65 20 3d 20 62 74 72 65 65 50 61 67 65 4c 6f 6f  e = btreePageLoo
2f470 6b 75 70 28 70 42 74 2c 20 69 50 61 67 65 29 3b  kup(pBt, iPage);
2f480 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 63 72 65  .  }..  /* Incre
2f490 6d 65 6e 74 20 74 68 65 20 66 72 65 65 20 70 61  ment the free pa
2f4a0 67 65 20 63 6f 75 6e 74 20 6f 6e 20 70 50 61 67  ge count on pPag
2f4b0 65 31 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c  e1 */.  rc = sql
2f4c0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
2f4d0 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b  Page1->pDbPage);
2f4e0 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f  .  if( rc ) goto
2f4f0 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20   freepage_out;. 
2f500 20 6e 46 72 65 65 20 3d 20 67 65 74 34 62 79 74   nFree = get4byt
2f510 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  e(&pPage1->aData
2f520 5b 33 36 5d 29 3b 0a 20 20 70 75 74 34 62 79 74  [36]);.  put4byt
2f530 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  e(&pPage1->aData
2f540 5b 33 36 5d 2c 20 6e 46 72 65 65 2b 31 29 3b 0a  [36], nFree+1);.
2f550 0a 20 20 69 66 28 20 70 42 74 2d 3e 62 74 73 46  .  if( pBt->btsF
2f560 6c 61 67 73 20 26 20 42 54 53 5f 53 45 43 55 52  lags & BTS_SECUR
2f570 45 5f 44 45 4c 45 54 45 20 29 7b 0a 20 20 20 20  E_DELETE ){.    
2f580 2f 2a 20 49 66 20 74 68 65 20 73 65 63 75 72 65  /* If the secure
2f590 5f 64 65 6c 65 74 65 20 6f 70 74 69 6f 6e 20 69  _delete option i
2f5a0 73 20 65 6e 61 62 6c 65 64 2c 20 74 68 65 6e 0a  s enabled, then.
2f5b0 20 20 20 20 2a 2a 20 61 6c 77 61 79 73 20 66 75      ** always fu
2f5c0 6c 6c 79 20 6f 76 65 72 77 72 69 74 65 20 64 65  lly overwrite de
2f5d0 6c 65 74 65 64 20 69 6e 66 6f 72 6d 61 74 69 6f  leted informatio
2f5e0 6e 20 77 69 74 68 20 7a 65 72 6f 73 2e 0a 20 20  n with zeros..  
2f5f0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 21 70    */.    if( (!p
2f600 50 61 67 65 20 26 26 20 28 28 72 63 20 3d 20 62  Page && ((rc = b
2f610 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
2f620 20 69 50 61 67 65 2c 20 26 70 50 61 67 65 2c 20   iPage, &pPage, 
2f630 30 29 29 21 3d 30 29 20 29 0a 20 20 20 20 20 7c  0))!=0) ).     |
2f640 7c 20 20 20 20 20 20 20 20 20 20 20 20 28 28 72  |            ((r
2f650 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
2f660 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62  Write(pPage->pDb
2f670 50 61 67 65 29 29 21 3d 30 29 0a 20 20 20 20 29  Page))!=0).    )
2f680 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 72 65  {.      goto fre
2f690 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d  epage_out;.    }
2f6a0 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 50 61 67  .    memset(pPag
2f6b0 65 2d 3e 61 44 61 74 61 2c 20 30 2c 20 70 50 61  e->aData, 0, pPa
2f6c0 67 65 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a  ge->pBt->pageSiz
2f6d0 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  e);.  }..  /* If
2f6e0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 75   the database su
2f6f0 70 70 6f 72 74 73 20 61 75 74 6f 2d 76 61 63 75  pports auto-vacu
2f700 75 6d 2c 20 77 72 69 74 65 20 61 6e 20 65 6e 74  um, write an ent
2f710 72 79 20 69 6e 20 74 68 65 20 70 6f 69 6e 74 65  ry in the pointe
2f720 72 2d 6d 61 70 0a 20 20 2a 2a 20 74 6f 20 69 6e  r-map.  ** to in
2f730 64 69 63 61 74 65 20 74 68 61 74 20 74 68 65 20  dicate that the 
2f740 70 61 67 65 20 69 73 20 66 72 65 65 2e 0a 20 20  page is free..  
2f750 2a 2f 0a 20 20 69 66 28 20 49 53 41 55 54 4f 56  */.  if( ISAUTOV
2f760 41 43 55 55 4d 20 29 7b 0a 20 20 20 20 70 74 72  ACUUM ){.    ptr
2f770 6d 61 70 50 75 74 28 70 42 74 2c 20 69 50 61 67  mapPut(pBt, iPag
2f780 65 2c 20 50 54 52 4d 41 50 5f 46 52 45 45 50 41  e, PTRMAP_FREEPA
2f790 47 45 2c 20 30 2c 20 26 72 63 29 3b 0a 20 20 20  GE, 0, &rc);.   
2f7a0 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 66   if( rc ) goto f
2f7b0 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d  reepage_out;.  }
2f7c0 0a 0a 20 20 2f 2a 20 4e 6f 77 20 6d 61 6e 69 70  ..  /* Now manip
2f7d0 75 6c 61 74 65 20 74 68 65 20 61 63 74 75 61 6c  ulate the actual
2f7e0 20 64 61 74 61 62 61 73 65 20 66 72 65 65 2d 6c   database free-l
2f7f0 69 73 74 20 73 74 72 75 63 74 75 72 65 2e 20 54  ist structure. T
2f800 68 65 72 65 20 61 72 65 20 74 77 6f 0a 20 20 2a  here are two.  *
2f810 2a 20 70 6f 73 73 69 62 69 6c 69 74 69 65 73 2e  * possibilities.
2f820 20 49 66 20 74 68 65 20 66 72 65 65 2d 6c 69 73   If the free-lis
2f830 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 65  t is currently e
2f840 6d 70 74 79 2c 20 6f 72 20 69 66 20 74 68 65 20  mpty, or if the 
2f850 66 69 72 73 74 0a 20 20 2a 2a 20 74 72 75 6e 6b  first.  ** trunk
2f860 20 70 61 67 65 20 69 6e 20 74 68 65 20 66 72 65   page in the fre
2f870 65 2d 6c 69 73 74 20 69 73 20 66 75 6c 6c 2c 20  e-list is full, 
2f880 74 68 65 6e 20 74 68 69 73 20 70 61 67 65 20 77  then this page w
2f890 69 6c 6c 20 62 65 63 6f 6d 65 20 61 0a 20 20 2a  ill become a.  *
2f8a0 2a 20 6e 65 77 20 66 72 65 65 2d 6c 69 73 74 20  * new free-list 
2f8b0 74 72 75 6e 6b 20 70 61 67 65 2e 20 4f 74 68 65  trunk page. Othe
2f8c0 72 77 69 73 65 2c 20 69 74 20 77 69 6c 6c 20 62  rwise, it will b
2f8d0 65 63 6f 6d 65 20 61 20 6c 65 61 66 20 6f 66 20  ecome a leaf of 
2f8e0 74 68 65 0a 20 20 2a 2a 20 66 69 72 73 74 20 74  the.  ** first t
2f8f0 72 75 6e 6b 20 70 61 67 65 20 69 6e 20 74 68 65  runk page in the
2f900 20 63 75 72 72 65 6e 74 20 66 72 65 65 2d 6c 69   current free-li
2f910 73 74 2e 20 54 68 69 73 20 62 6c 6f 63 6b 20 74  st. This block t
2f920 65 73 74 73 20 69 66 20 69 74 0a 20 20 2a 2a 20  ests if it.  ** 
2f930 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 61  is possible to a
2f940 64 64 20 74 68 65 20 70 61 67 65 20 61 73 20 61  dd the page as a
2f950 20 6e 65 77 20 66 72 65 65 2d 6c 69 73 74 20 6c   new free-list l
2f960 65 61 66 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  eaf..  */.  if( 
2f970 6e 46 72 65 65 21 3d 30 20 29 7b 0a 20 20 20 20  nFree!=0 ){.    
2f980 75 33 32 20 6e 4c 65 61 66 3b 20 20 20 20 20 20  u32 nLeaf;      
2f990 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 69            /* Ini
2f9a0 74 69 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 6c  tial number of l
2f9b0 65 61 66 20 63 65 6c 6c 73 20 6f 6e 20 74 72 75  eaf cells on tru
2f9c0 6e 6b 20 70 61 67 65 20 2a 2f 0a 0a 20 20 20 20  nk page */..    
2f9d0 69 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74  iTrunk = get4byt
2f9e0 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  e(&pPage1->aData
2f9f0 5b 33 32 5d 29 3b 0a 20 20 20 20 72 63 20 3d 20  [32]);.    rc = 
2fa00 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  btreeGetPage(pBt
2fa10 2c 20 69 54 72 75 6e 6b 2c 20 26 70 54 72 75 6e  , iTrunk, &pTrun
2fa20 6b 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  k, 0);.    if( r
2fa30 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2fa40 20 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70        goto freep
2fa50 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 0a  age_out;.    }..
2fa60 20 20 20 20 6e 4c 65 61 66 20 3d 20 67 65 74 34      nLeaf = get4
2fa70 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44  byte(&pTrunk->aD
2fa80 61 74 61 5b 34 5d 29 3b 0a 20 20 20 20 61 73 73  ata[4]);.    ass
2fa90 65 72 74 28 20 70 42 74 2d 3e 75 73 61 62 6c 65  ert( pBt->usable
2faa0 53 69 7a 65 3e 33 32 20 29 3b 0a 20 20 20 20 69  Size>32 );.    i
2fab0 66 28 20 6e 4c 65 61 66 20 3e 20 28 75 33 32 29  f( nLeaf > (u32)
2fac0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f  pBt->usableSize/
2fad0 34 20 2d 20 32 20 29 7b 0a 20 20 20 20 20 20 72  4 - 2 ){.      r
2fae0 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
2faf0 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67  PT_BKPT;.      g
2fb00 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74  oto freepage_out
2fb10 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
2fb20 6e 4c 65 61 66 20 3c 20 28 75 33 32 29 70 42 74  nLeaf < (u32)pBt
2fb30 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d  ->usableSize/4 -
2fb40 20 38 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49   8 ){.      /* I
2fb50 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65 72  n this case ther
2fb60 65 20 69 73 20 72 6f 6f 6d 20 6f 6e 20 74 68 65  e is room on the
2fb70 20 74 72 75 6e 6b 20 70 61 67 65 20 74 6f 20 69   trunk page to i
2fb80 6e 73 65 72 74 20 74 68 65 20 70 61 67 65 0a 20  nsert the page. 
2fb90 20 20 20 20 20 2a 2a 20 62 65 69 6e 67 20 66 72       ** being fr
2fba0 65 65 64 20 61 73 20 61 20 6e 65 77 20 6c 65 61  eed as a new lea
2fbb0 66 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  f..      **.    
2fbc0 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74    ** Note that t
2fbd0 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20 69 73  he trunk page is
2fbe0 20 6e 6f 74 20 72 65 61 6c 6c 79 20 66 75 6c 6c   not really full
2fbf0 20 75 6e 74 69 6c 20 69 74 20 63 6f 6e 74 61 69   until it contai
2fc00 6e 73 0a 20 20 20 20 20 20 2a 2a 20 75 73 61 62  ns.      ** usab
2fc10 6c 65 53 69 7a 65 2f 34 20 2d 20 32 20 65 6e 74  leSize/4 - 2 ent
2fc20 72 69 65 73 2c 20 6e 6f 74 20 75 73 61 62 6c 65  ries, not usable
2fc30 53 69 7a 65 2f 34 20 2d 20 38 20 65 6e 74 72 69  Size/4 - 8 entri
2fc40 65 73 20 61 73 20 77 65 20 68 61 76 65 0a 20 20  es as we have.  
2fc50 20 20 20 20 2a 2a 20 63 6f 64 65 64 2e 20 20 42      ** coded.  B
2fc60 75 74 20 64 75 65 20 74 6f 20 61 20 63 6f 64 69  ut due to a codi
2fc70 6e 67 20 65 72 72 6f 72 20 69 6e 20 76 65 72 73  ng error in vers
2fc80 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 70  ions of SQLite p
2fc90 72 69 6f 72 20 74 6f 0a 20 20 20 20 20 20 2a 2a  rior to.      **
2fca0 20 33 2e 36 2e 30 2c 20 64 61 74 61 62 61 73 65   3.6.0, database
2fcb0 73 20 77 69 74 68 20 66 72 65 65 6c 69 73 74 20  s with freelist 
2fcc0 74 72 75 6e 6b 20 70 61 67 65 73 20 68 6f 6c 64  trunk pages hold
2fcd0 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 0a 20 20  ing more than.  
2fce0 20 20 20 20 2a 2a 20 75 73 61 62 6c 65 53 69 7a      ** usableSiz
2fcf0 65 2f 34 20 2d 20 38 20 65 6e 74 72 69 65 73 20  e/4 - 8 entries 
2fd00 77 69 6c 6c 20 62 65 20 72 65 70 6f 72 74 65 64  will be reported
2fd10 20 61 73 20 63 6f 72 72 75 70 74 2e 20 20 49 6e   as corrupt.  In
2fd20 20 6f 72 64 65 72 0a 20 20 20 20 20 20 2a 2a 20   order.      ** 
2fd30 74 6f 20 6d 61 69 6e 74 61 69 6e 20 62 61 63 6b  to maintain back
2fd40 77 61 72 64 73 20 63 6f 6d 70 61 74 69 62 69 6c  wards compatibil
2fd50 69 74 79 20 77 69 74 68 20 6f 6c 64 65 72 20 76  ity with older v
2fd60 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74  ersions of SQLit
2fd70 65 2c 0a 20 20 20 20 20 20 2a 2a 20 77 65 20 77  e,.      ** we w
2fd80 69 6c 6c 20 63 6f 6e 74 69 6e 75 65 20 74 6f 20  ill continue to 
2fd90 72 65 73 74 72 69 63 74 20 74 68 65 20 6e 75 6d  restrict the num
2fda0 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 74  ber of entries t
2fdb0 6f 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d  o usableSize/4 -
2fdc0 20 38 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20   8.      ** for 
2fdd0 6e 6f 77 2e 20 20 41 74 20 73 6f 6d 65 20 70 6f  now.  At some po
2fde0 69 6e 74 20 69 6e 20 74 68 65 20 66 75 74 75 72  int in the futur
2fdf0 65 20 28 6f 6e 63 65 20 65 76 65 72 79 6f 6e 65  e (once everyone
2fe00 20 68 61 73 20 75 70 67 72 61 64 65 64 0a 20 20   has upgraded.  
2fe10 20 20 20 20 2a 2a 20 74 6f 20 33 2e 36 2e 30 20      ** to 3.6.0 
2fe20 6f 72 20 6c 61 74 65 72 29 20 77 65 20 73 68 6f  or later) we sho
2fe30 75 6c 64 20 63 6f 6e 73 69 64 65 72 20 66 69 78  uld consider fix
2fe40 69 6e 67 20 74 68 65 20 63 6f 6e 64 69 74 69 6f  ing the conditio
2fe50 6e 61 6c 20 61 62 6f 76 65 0a 20 20 20 20 20 20  nal above.      
2fe60 2a 2a 20 74 6f 20 72 65 61 64 20 22 75 73 61 62  ** to read "usab
2fe70 6c 65 53 69 7a 65 2f 34 2d 32 22 20 69 6e 73 74  leSize/4-2" inst
2fe80 65 61 64 20 6f 66 20 22 75 73 61 62 6c 65 53 69  ead of "usableSi
2fe90 7a 65 2f 34 2d 38 22 2e 0a 20 20 20 20 20 20 2a  ze/4-8"..      *
2fea0 2a 0a 20 20 20 20 20 20 2a 2a 20 45 56 49 44 45  *.      ** EVIDE
2feb0 4e 43 45 2d 4f 46 3a 20 52 2d 31 39 39 32 30 2d  NCE-OF: R-19920-
2fec0 31 31 35 37 36 20 48 6f 77 65 76 65 72 2c 20 6e  11576 However, n
2fed0 65 77 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66  ewer versions of
2fee0 20 53 51 4c 69 74 65 20 73 74 69 6c 6c 0a 20 20   SQLite still.  
2fef0 20 20 20 20 2a 2a 20 61 76 6f 69 64 20 75 73 69      ** avoid usi
2ff00 6e 67 20 74 68 65 20 6c 61 73 74 20 73 69 78 20  ng the last six 
2ff10 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 66  entries in the f
2ff20 72 65 65 6c 69 73 74 20 74 72 75 6e 6b 20 70 61  reelist trunk pa
2ff30 67 65 20 61 72 72 61 79 20 69 6e 0a 20 20 20 20  ge array in.    
2ff40 20 20 2a 2a 20 6f 72 64 65 72 20 74 68 61 74 20    ** order that 
2ff50 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 20 63  database files c
2ff60 72 65 61 74 65 64 20 62 79 20 6e 65 77 65 72 20  reated by newer 
2ff70 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69  versions of SQLi
2ff80 74 65 20 63 61 6e 20 62 65 0a 20 20 20 20 20 20  te can be.      
2ff90 2a 2a 20 72 65 61 64 20 62 79 20 6f 6c 64 65 72  ** read by older
2ffa0 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c   versions of SQL
2ffb0 69 74 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ite..      */.  
2ffc0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2ffd0 50 61 67 65 72 57 72 69 74 65 28 70 54 72 75 6e  PagerWrite(pTrun
2ffe0 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  k->pDbPage);.   
2fff0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
30000 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
30010 70 75 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b  put4byte(&pTrunk
30020 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 6e 4c 65 61  ->aData[4], nLea
30030 66 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 70 75  f+1);.        pu
30040 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e  t4byte(&pTrunk->
30050 61 44 61 74 61 5b 38 2b 6e 4c 65 61 66 2a 34 5d  aData[8+nLeaf*4]
30060 2c 20 69 50 61 67 65 29 3b 0a 20 20 20 20 20 20  , iPage);.      
30070 20 20 69 66 28 20 70 50 61 67 65 20 26 26 20 28    if( pPage && (
30080 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20  pBt->btsFlags & 
30090 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54  BTS_SECURE_DELET
300a0 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  E)==0 ){.       
300b0 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 44     sqlite3PagerD
300c0 6f 6e 74 57 72 69 74 65 28 70 50 61 67 65 2d 3e  ontWrite(pPage->
300d0 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
300e0 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20 3d    }.        rc =
300f0 20 62 74 72 65 65 53 65 74 48 61 73 43 6f 6e 74   btreeSetHasCont
30100 65 6e 74 28 70 42 74 2c 20 69 50 61 67 65 29 3b  ent(pBt, iPage);
30110 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 54  .      }.      T
30120 52 41 43 45 28 28 22 46 52 45 45 2d 50 41 47 45  RACE(("FREE-PAGE
30130 3a 20 25 64 20 6c 65 61 66 20 6f 6e 20 74 72 75  : %d leaf on tru
30140 6e 6b 20 70 61 67 65 20 25 64 5c 6e 22 2c 70 50  nk page %d\n",pP
30150 61 67 65 2d 3e 70 67 6e 6f 2c 70 54 72 75 6e 6b  age->pgno,pTrunk
30160 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20  ->pgno));.      
30170 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75  goto freepage_ou
30180 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  t;.    }.  }..  
30190 2f 2a 20 49 66 20 63 6f 6e 74 72 6f 6c 20 66 6c  /* If control fl
301a0 6f 77 73 20 74 6f 20 74 68 69 73 20 70 6f 69 6e  ows to this poin
301b0 74 2c 20 74 68 65 6e 20 69 74 20 77 61 73 20 6e  t, then it was n
301c0 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 61  ot possible to a
301d0 64 64 20 74 68 65 0a 20 20 2a 2a 20 74 68 65 20  dd the.  ** the 
301e0 70 61 67 65 20 62 65 69 6e 67 20 66 72 65 65 64  page being freed
301f0 20 61 73 20 61 20 6c 65 61 66 20 70 61 67 65 20   as a leaf page 
30200 6f 66 20 74 68 65 20 66 69 72 73 74 20 74 72 75  of the first tru
30210 6e 6b 20 69 6e 20 74 68 65 20 66 72 65 65 2d 6c  nk in the free-l
30220 69 73 74 2e 0a 20 20 2a 2a 20 50 6f 73 73 69 62  ist..  ** Possib
30230 6c 79 20 62 65 63 61 75 73 65 20 74 68 65 20 66  ly because the f
30240 72 65 65 2d 6c 69 73 74 20 69 73 20 65 6d 70 74  ree-list is empt
30250 79 2c 20 6f 72 20 70 6f 73 73 69 62 6c 79 20 62  y, or possibly b
30260 65 63 61 75 73 65 20 74 68 65 20 0a 20 20 2a 2a  ecause the .  **
30270 20 66 69 72 73 74 20 74 72 75 6e 6b 20 69 6e 20   first trunk in 
30280 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 69 73  the free-list is
30290 20 66 75 6c 6c 2e 20 45 69 74 68 65 72 20 77 61   full. Either wa
302a0 79 2c 20 74 68 65 20 70 61 67 65 20 62 65 69 6e  y, the page bein
302b0 67 20 66 72 65 65 64 0a 20 20 2a 2a 20 77 69 6c  g freed.  ** wil
302c0 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 6e 65 77  l become the new
302d0 20 66 69 72 73 74 20 74 72 75 6e 6b 20 70 61 67   first trunk pag
302e0 65 20 69 6e 20 74 68 65 20 66 72 65 65 2d 6c 69  e in the free-li
302f0 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  st..  */.  if( p
30300 50 61 67 65 3d 3d 30 20 26 26 20 53 51 4c 49 54  Page==0 && SQLIT
30310 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 62 74 72 65  E_OK!=(rc = btre
30320 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 50  eGetPage(pBt, iP
30330 61 67 65 2c 20 26 70 50 61 67 65 2c 20 30 29 29  age, &pPage, 0))
30340 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 66 72 65   ){.    goto fre
30350 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20  epage_out;.  }. 
30360 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
30370 65 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70  erWrite(pPage->p
30380 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72  DbPage);.  if( r
30390 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
303a0 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67      goto freepag
303b0 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 70 75 74  e_out;.  }.  put
303c0 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61  4byte(pPage->aDa
303d0 74 61 2c 20 69 54 72 75 6e 6b 29 3b 0a 20 20 70  ta, iTrunk);.  p
303e0 75 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e  ut4byte(&pPage->
303f0 61 44 61 74 61 5b 34 5d 2c 20 30 29 3b 0a 20 20  aData[4], 0);.  
30400 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31  put4byte(&pPage1
30410 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 69 50 61  ->aData[32], iPa
30420 67 65 29 3b 0a 20 20 54 52 41 43 45 28 28 22 46  ge);.  TRACE(("F
30430 52 45 45 2d 50 41 47 45 3a 20 25 64 20 6e 65 77  REE-PAGE: %d new
30440 20 74 72 75 6e 6b 20 70 61 67 65 20 72 65 70 6c   trunk page repl
30450 61 63 69 6e 67 20 25 64 5c 6e 22 2c 20 70 50 61  acing %d\n", pPa
30460 67 65 2d 3e 70 67 6e 6f 2c 20 69 54 72 75 6e 6b  ge->pgno, iTrunk
30470 29 29 3b 0a 0a 66 72 65 65 70 61 67 65 5f 6f 75  ));..freepage_ou
30480 74 3a 0a 20 20 69 66 28 20 70 50 61 67 65 20 29  t:.  if( pPage )
30490 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49  {.    pPage->isI
304a0 6e 69 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  nit = 0;.  }.  r
304b0 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65  eleasePage(pPage
304c0 29 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65  );.  releasePage
304d0 28 70 54 72 75 6e 6b 29 3b 0a 20 20 72 65 74 75  (pTrunk);.  retu
304e0 72 6e 20 72 63 3b 0a 7d 0a 73 74 61 74 69 63 20  rn rc;.}.static 
304f0 76 6f 69 64 20 66 72 65 65 50 61 67 65 28 4d 65  void freePage(Me
30500 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e  mPage *pPage, in
30510 74 20 2a 70 52 43 29 7b 0a 20 20 69 66 28 20 28  t *pRC){.  if( (
30520 2a 70 52 43 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b  *pRC)==SQLITE_OK
30530 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 66   ){.    *pRC = f
30540 72 65 65 50 61 67 65 32 28 70 50 61 67 65 2d 3e  reePage2(pPage->
30550 70 42 74 2c 20 70 50 61 67 65 2c 20 70 50 61 67  pBt, pPage, pPag
30560 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a 7d 0a  e->pgno);.  }.}.
30570 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6e 79 20  ./*.** Free any 
30580 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61  overflow pages a
30590 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
305a0 68 65 20 67 69 76 65 6e 20 43 65 6c 6c 2e 20 20  he given Cell.  
305b0 57 72 69 74 65 20 74 68 65 0a 2a 2a 20 6c 6f 63  Write the.** loc
305c0 61 6c 20 43 65 6c 6c 20 73 69 7a 65 20 28 74 68  al Cell size (th
305d0 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
305e0 73 20 6f 6e 20 74 68 65 20 6f 72 69 67 69 6e 61  s on the origina
305f0 6c 20 70 61 67 65 2c 20 6f 6d 69 74 74 69 6e 67  l page, omitting
30600 0a 2a 2a 20 6f 76 65 72 66 6c 6f 77 29 20 69 6e  .** overflow) in
30610 74 6f 20 2a 70 6e 53 69 7a 65 2e 0a 2a 2f 0a 73  to *pnSize..*/.s
30620 74 61 74 69 63 20 69 6e 74 20 63 6c 65 61 72 43  tatic int clearC
30630 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a  ell(.  MemPage *
30640 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20  pPage,          
30650 2f 2a 20 54 68 65 20 70 61 67 65 20 74 68 61 74  /* The page that
30660 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 43 65   contains the Ce
30670 6c 6c 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  ll */.  unsigned
30680 20 63 68 61 72 20 2a 70 43 65 6c 6c 2c 20 20 20   char *pCell,   
30690 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f   /* First byte o
306a0 66 20 74 68 65 20 43 65 6c 6c 20 2a 2f 0a 20 20  f the Cell */.  
306b0 75 31 36 20 2a 70 6e 53 69 7a 65 20 20 20 20 20  u16 *pnSize     
306c0 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
306d0 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  e the size of th
306e0 65 20 43 65 6c 6c 20 68 65 72 65 20 2a 2f 0a 29  e Cell here */.)
306f0 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
30700 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a  t = pPage->pBt;.
30710 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b    CellInfo info;
30720 0a 20 20 50 67 6e 6f 20 6f 76 66 6c 50 67 6e 6f  .  Pgno ovflPgno
30730 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e  ;.  int rc;.  in
30740 74 20 6e 4f 76 66 6c 3b 0a 20 20 75 33 32 20 6f  t nOvfl;.  u32 o
30750 76 66 6c 50 61 67 65 53 69 7a 65 3b 0a 0a 20 20  vflPageSize;..  
30760 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
30770 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
30780 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
30790 0a 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c  .  btreeParseCel
307a0 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c  lPtr(pPage, pCel
307b0 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 2a 70 6e  l, &info);.  *pn
307c0 53 69 7a 65 20 3d 20 69 6e 66 6f 2e 6e 53 69 7a  Size = info.nSiz
307d0 65 3b 0a 20 20 69 66 28 20 69 6e 66 6f 2e 69 4f  e;.  if( info.iO
307e0 76 65 72 66 6c 6f 77 3d 3d 30 20 29 7b 0a 20 20  verflow==0 ){.  
307f0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
30800 4f 4b 3b 20 20 2f 2a 20 4e 6f 20 6f 76 65 72 66  OK;  /* No overf
30810 6c 6f 77 20 70 61 67 65 73 2e 20 52 65 74 75 72  low pages. Retur
30820 6e 20 77 69 74 68 6f 75 74 20 64 6f 69 6e 67 20  n without doing 
30830 61 6e 79 74 68 69 6e 67 20 2a 2f 0a 20 20 7d 0a  anything */.  }.
30840 20 20 69 66 28 20 70 43 65 6c 6c 2b 69 6e 66 6f    if( pCell+info
30850 2e 69 4f 76 65 72 66 6c 6f 77 2b 33 20 3e 20 70  .iOverflow+3 > p
30860 50 61 67 65 2d 3e 61 44 61 74 61 2b 70 50 61 67  Page->aData+pPag
30870 65 2d 3e 6d 61 73 6b 50 61 67 65 20 29 7b 0a 20  e->maskPage ){. 
30880 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
30890 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 20  _CORRUPT_BKPT;  
308a0 2f 2a 20 43 65 6c 6c 20 65 78 74 65 6e 64 73 20  /* Cell extends 
308b0 70 61 73 74 20 65 6e 64 20 6f 66 20 70 61 67 65  past end of page
308c0 20 2a 2f 0a 20 20 7d 0a 20 20 6f 76 66 6c 50 67   */.  }.  ovflPg
308d0 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  no = get4byte(&p
308e0 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66  Cell[info.iOverf
308f0 6c 6f 77 5d 29 3b 0a 20 20 61 73 73 65 72 74 28  low]);.  assert(
30900 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
30910 20 3e 20 34 20 29 3b 0a 20 20 6f 76 66 6c 50 61   > 4 );.  ovflPa
30920 67 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73  geSize = pBt->us
30930 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20  ableSize - 4;.  
30940 6e 4f 76 66 6c 20 3d 20 28 69 6e 66 6f 2e 6e 50  nOvfl = (info.nP
30950 61 79 6c 6f 61 64 20 2d 20 69 6e 66 6f 2e 6e 4c  ayload - info.nL
30960 6f 63 61 6c 20 2b 20 6f 76 66 6c 50 61 67 65 53  ocal + ovflPageS
30970 69 7a 65 20 2d 20 31 29 2f 6f 76 66 6c 50 61 67  ize - 1)/ovflPag
30980 65 53 69 7a 65 3b 0a 20 20 61 73 73 65 72 74 28  eSize;.  assert(
30990 20 6f 76 66 6c 50 67 6e 6f 3d 3d 30 20 7c 7c 20   ovflPgno==0 || 
309a0 6e 4f 76 66 6c 3e 30 20 29 3b 0a 20 20 77 68 69  nOvfl>0 );.  whi
309b0 6c 65 28 20 6e 4f 76 66 6c 2d 2d 20 29 7b 0a 20  le( nOvfl-- ){. 
309c0 20 20 20 50 67 6e 6f 20 69 4e 65 78 74 20 3d 20     Pgno iNext = 
309d0 30 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  0;.    MemPage *
309e0 70 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 20 20 69  pOvfl = 0;.    i
309f0 66 28 20 6f 76 66 6c 50 67 6e 6f 3c 32 20 7c 7c  f( ovflPgno<2 ||
30a00 20 6f 76 66 6c 50 67 6e 6f 3e 62 74 72 65 65 50   ovflPgno>btreeP
30a10 61 67 65 63 6f 75 6e 74 28 70 42 74 29 20 29 7b  agecount(pBt) ){
30a20 0a 20 20 20 20 20 20 2f 2a 20 30 20 69 73 20 6e  .      /* 0 is n
30a30 6f 74 20 61 20 6c 65 67 61 6c 20 70 61 67 65 20  ot a legal page 
30a40 6e 75 6d 62 65 72 20 61 6e 64 20 70 61 67 65 20  number and page 
30a50 31 20 63 61 6e 6e 6f 74 20 62 65 20 61 6e 20 0a  1 cannot be an .
30a60 20 20 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c 6f        ** overflo
30a70 77 20 70 61 67 65 2e 20 54 68 65 72 65 66 6f 72  w page. Therefor
30a80 65 20 69 66 20 6f 76 66 6c 50 67 6e 6f 3c 32 20  e if ovflPgno<2 
30a90 6f 72 20 70 61 73 74 20 74 68 65 20 65 6e 64 20  or past the end 
30aa0 6f 66 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a  of the .      **
30ab0 20 66 69 6c 65 20 74 68 65 20 64 61 74 61 62 61   file the databa
30ac0 73 65 20 6d 75 73 74 20 62 65 20 63 6f 72 72 75  se must be corru
30ad0 70 74 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65 74  pt. */.      ret
30ae0 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
30af0 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20  PT_BKPT;.    }. 
30b00 20 20 20 69 66 28 20 6e 4f 76 66 6c 20 29 7b 0a     if( nOvfl ){.
30b10 20 20 20 20 20 20 72 63 20 3d 20 67 65 74 4f 76        rc = getOv
30b20 65 72 66 6c 6f 77 50 61 67 65 28 70 42 74 2c 20  erflowPage(pBt, 
30b30 6f 76 66 6c 50 67 6e 6f 2c 20 26 70 4f 76 66 6c  ovflPgno, &pOvfl
30b40 2c 20 26 69 4e 65 78 74 29 3b 0a 20 20 20 20 20  , &iNext);.     
30b50 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
30b60 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20   rc;.    }..    
30b70 69 66 28 20 28 20 70 4f 76 66 6c 20 7c 7c 20 28  if( ( pOvfl || (
30b80 28 70 4f 76 66 6c 20 3d 20 62 74 72 65 65 50 61  (pOvfl = btreePa
30b90 67 65 4c 6f 6f 6b 75 70 28 70 42 74 2c 20 6f 76  geLookup(pBt, ov
30ba0 66 6c 50 67 6e 6f 29 29 21 3d 30 29 20 29 0a 20  flPgno))!=0) ). 
30bb0 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 50 61      && sqlite3Pa
30bc0 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28  gerPageRefcount(
30bd0 70 4f 76 66 6c 2d 3e 70 44 62 50 61 67 65 29 21  pOvfl->pDbPage)!
30be0 3d 31 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  =1.    ){.      
30bf0 2f 2a 20 54 68 65 72 65 20 69 73 20 6e 6f 20 72  /* There is no r
30c00 65 61 73 6f 6e 20 61 6e 79 20 63 75 72 73 6f 72  eason any cursor
30c10 20 73 68 6f 75 6c 64 20 68 61 76 65 20 61 6e 20   should have an 
30c20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65  outstanding refe
30c30 72 65 6e 63 65 20 0a 20 20 20 20 20 20 2a 2a 20  rence .      ** 
30c40 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70  to an overflow p
30c50 61 67 65 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f  age belonging to
30c60 20 61 20 63 65 6c 6c 20 74 68 61 74 20 69 73 20   a cell that is 
30c70 62 65 69 6e 67 20 64 65 6c 65 74 65 64 2f 75 70  being deleted/up
30c80 64 61 74 65 64 2e 0a 20 20 20 20 20 20 2a 2a 20  dated..      ** 
30c90 53 6f 20 69 66 20 74 68 65 72 65 20 65 78 69 73  So if there exis
30ca0 74 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65  ts more than one
30cb0 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68   reference to th
30cc0 69 73 20 70 61 67 65 2c 20 74 68 65 6e 20 69 74  is page, then it
30cd0 20 0a 20 20 20 20 20 20 2a 2a 20 6d 75 73 74 20   .      ** must 
30ce0 6e 6f 74 20 72 65 61 6c 6c 79 20 62 65 20 61 6e  not really be an
30cf0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 61   overflow page a
30d00 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20  nd the database 
30d10 6d 75 73 74 20 62 65 20 63 6f 72 72 75 70 74 2e  must be corrupt.
30d20 20 0a 20 20 20 20 20 20 2a 2a 20 49 74 20 69 73   .      ** It is
30d30 20 68 65 6c 70 66 75 6c 20 74 6f 20 64 65 74 65   helpful to dete
30d40 63 74 20 74 68 69 73 20 62 65 66 6f 72 65 20 63  ct this before c
30d50 61 6c 6c 69 6e 67 20 66 72 65 65 50 61 67 65 32  alling freePage2
30d60 28 29 2c 20 61 73 20 0a 20 20 20 20 20 20 2a 2a  (), as .      **
30d70 20 66 72 65 65 50 61 67 65 32 28 29 20 6d 61 79   freePage2() may
30d80 20 7a 65 72 6f 20 74 68 65 20 70 61 67 65 20 63   zero the page c
30d90 6f 6e 74 65 6e 74 73 20 69 66 20 73 65 63 75 72  ontents if secur
30da0 65 2d 64 65 6c 65 74 65 20 6d 6f 64 65 20 69 73  e-delete mode is
30db0 0a 20 20 20 20 20 20 2a 2a 20 65 6e 61 62 6c 65  .      ** enable
30dc0 64 2e 20 49 66 20 74 68 69 73 20 27 6f 76 65 72  d. If this 'over
30dd0 66 6c 6f 77 27 20 70 61 67 65 20 68 61 70 70 65  flow' page happe
30de0 6e 73 20 74 6f 20 62 65 20 61 20 70 61 67 65 20  ns to be a page 
30df0 74 68 61 74 20 74 68 65 0a 20 20 20 20 20 20 2a  that the.      *
30e00 2a 20 63 61 6c 6c 65 72 20 69 73 20 69 74 65 72  * caller is iter
30e10 61 74 69 6e 67 20 74 68 72 6f 75 67 68 20 6f 72  ating through or
30e20 20 75 73 69 6e 67 20 69 6e 20 73 6f 6d 65 20 6f   using in some o
30e30 74 68 65 72 20 77 61 79 2c 20 74 68 69 73 0a 20  ther way, this. 
30e40 20 20 20 20 20 2a 2a 20 63 61 6e 20 62 65 20 70       ** can be p
30e50 72 6f 62 6c 65 6d 61 74 69 63 2e 0a 20 20 20 20  roblematic..    
30e60 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20    */.      rc = 
30e70 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
30e80 4b 50 54 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  KPT;.    }else{.
30e90 20 20 20 20 20 20 72 63 20 3d 20 66 72 65 65 50        rc = freeP
30ea0 61 67 65 32 28 70 42 74 2c 20 70 4f 76 66 6c 2c  age2(pBt, pOvfl,
30eb0 20 6f 76 66 6c 50 67 6e 6f 29 3b 0a 20 20 20 20   ovflPgno);.    
30ec0 7d 0a 0a 20 20 20 20 69 66 28 20 70 4f 76 66 6c  }..    if( pOvfl
30ed0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
30ee0 33 50 61 67 65 72 55 6e 72 65 66 28 70 4f 76 66  3PagerUnref(pOvf
30ef0 6c 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  l->pDbPage);.   
30f00 20 7d 0a 20 20 20 20 69 66 28 20 72 63 20 29 20   }.    if( rc ) 
30f10 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 6f  return rc;.    o
30f20 76 66 6c 50 67 6e 6f 20 3d 20 69 4e 65 78 74 3b  vflPgno = iNext;
30f30 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
30f40 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
30f50 2a 20 43 72 65 61 74 65 20 74 68 65 20 62 79 74  * Create the byt
30f60 65 20 73 65 71 75 65 6e 63 65 20 75 73 65 64 20  e sequence used 
30f70 74 6f 20 72 65 70 72 65 73 65 6e 74 20 61 20 63  to represent a c
30f80 65 6c 6c 20 6f 6e 20 70 61 67 65 20 70 50 61 67  ell on page pPag
30f90 65 0a 2a 2a 20 61 6e 64 20 77 72 69 74 65 20 74  e.** and write t
30fa0 68 61 74 20 62 79 74 65 20 73 65 71 75 65 6e 63  hat byte sequenc
30fb0 65 20 69 6e 74 6f 20 70 43 65 6c 6c 5b 5d 2e 20  e into pCell[]. 
30fc0 20 4f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20   Overflow pages 
30fd0 61 72 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64  are.** allocated
30fe0 20 61 6e 64 20 66 69 6c 6c 65 64 20 69 6e 20 61   and filled in a
30ff0 73 20 6e 65 63 65 73 73 61 72 79 2e 20 20 54 68  s necessary.  Th
31000 65 20 63 61 6c 6c 69 6e 67 20 70 72 6f 63 65 64  e calling proced
31010 75 72 65 0a 2a 2a 20 69 73 20 72 65 73 70 6f 6e  ure.** is respon
31020 73 69 62 6c 65 20 66 6f 72 20 6d 61 6b 69 6e 67  sible for making
31030 20 73 75 72 65 20 73 75 66 66 69 63 69 65 6e 74   sure sufficient
31040 20 73 70 61 63 65 20 68 61 73 20 62 65 65 6e 20   space has been 
31050 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 66 6f 72  allocated.** for
31060 20 70 43 65 6c 6c 5b 5d 2e 0a 2a 2a 0a 2a 2a 20   pCell[]..**.** 
31070 4e 6f 74 65 20 74 68 61 74 20 70 43 65 6c 6c 20  Note that pCell 
31080 64 6f 65 73 20 6e 6f 74 20 6e 65 63 65 73 73 61  does not necessa
31090 72 79 20 6e 65 65 64 20 74 6f 20 70 6f 69 6e 74  ry need to point
310a0 20 74 6f 20 74 68 65 20 70 50 61 67 65 2d 3e 61   to the pPage->a
310b0 44 61 74 61 0a 2a 2a 20 61 72 65 61 2e 20 20 70  Data.** area.  p
310c0 43 65 6c 6c 20 6d 69 67 68 74 20 70 6f 69 6e 74  Cell might point
310d0 20 74 6f 20 73 6f 6d 65 20 74 65 6d 70 6f 72 61   to some tempora
310e0 72 79 20 73 74 6f 72 61 67 65 2e 20 20 54 68 65  ry storage.  The
310f0 20 63 65 6c 6c 20 77 69 6c 6c 0a 2a 2a 20 62 65   cell will.** be
31100 20 63 6f 6e 73 74 72 75 63 74 65 64 20 69 6e 20   constructed in 
31110 74 68 69 73 20 74 65 6d 70 6f 72 61 72 79 20 61  this temporary a
31120 72 65 61 20 74 68 65 6e 20 63 6f 70 69 65 64 20  rea then copied 
31130 69 6e 74 6f 20 70 50 61 67 65 2d 3e 61 44 61 74  into pPage->aDat
31140 61 0a 2a 2a 20 6c 61 74 65 72 2e 0a 2a 2f 0a 73  a.** later..*/.s
31150 74 61 74 69 63 20 69 6e 74 20 66 69 6c 6c 49 6e  tatic int fillIn
31160 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20  Cell(.  MemPage 
31170 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20  *pPage,         
31180 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
31190 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  ge that contains
311a0 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75   the cell */.  u
311b0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 43  nsigned char *pC
311c0 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  ell,          /*
311d0 20 43 6f 6d 70 6c 65 74 65 20 74 65 78 74 20 6f   Complete text o
311e0 66 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20  f the cell */.  
311f0 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79  const void *pKey
31200 2c 20 69 36 34 20 6e 4b 65 79 2c 20 20 20 20 2f  , i64 nKey,    /
31210 2a 20 54 68 65 20 6b 65 79 20 2a 2f 0a 20 20 63  * The key */.  c
31220 6f 6e 73 74 20 76 6f 69 64 20 2a 70 44 61 74 61  onst void *pData
31230 2c 69 6e 74 20 6e 44 61 74 61 2c 20 20 20 2f 2a  ,int nData,   /*
31240 20 54 68 65 20 64 61 74 61 20 2a 2f 0a 20 20 69   The data */.  i
31250 6e 74 20 6e 5a 65 72 6f 2c 20 20 20 20 20 20 20  nt nZero,       
31260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
31270 20 45 78 74 72 61 20 7a 65 72 6f 20 62 79 74 65   Extra zero byte
31280 73 20 74 6f 20 61 70 70 65 6e 64 20 74 6f 20 70  s to append to p
31290 44 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  Data */.  int *p
312a0 6e 53 69 7a 65 20 20 20 20 20 20 20 20 20 20 20  nSize           
312b0 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
312c0 65 20 63 65 6c 6c 20 73 69 7a 65 20 68 65 72 65  e cell size here
312d0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 50 61   */.){.  int nPa
312e0 79 6c 6f 61 64 3b 0a 20 20 63 6f 6e 73 74 20 75  yload;.  const u
312f0 38 20 2a 70 53 72 63 3b 0a 20 20 69 6e 74 20 6e  8 *pSrc;.  int n
31300 53 72 63 2c 20 6e 2c 20 72 63 3b 0a 20 20 69 6e  Src, n, rc;.  in
31310 74 20 73 70 61 63 65 4c 65 66 74 3b 0a 20 20 4d  t spaceLeft;.  M
31320 65 6d 50 61 67 65 20 2a 70 4f 76 66 6c 20 3d 20  emPage *pOvfl = 
31330 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 54  0;.  MemPage *pT
31340 6f 52 65 6c 65 61 73 65 20 3d 20 30 3b 0a 20 20  oRelease = 0;.  
31350 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
31360 50 72 69 6f 72 3b 0a 20 20 75 6e 73 69 67 6e 65  Prior;.  unsigne
31370 64 20 63 68 61 72 20 2a 70 50 61 79 6c 6f 61 64  d char *pPayload
31380 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
31390 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a  t = pPage->pBt;.
313a0 20 20 50 67 6e 6f 20 70 67 6e 6f 4f 76 66 6c 20    Pgno pgnoOvfl 
313b0 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 48 65 61 64  = 0;.  int nHead
313c0 65 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  er;..  assert( s
313d0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
313e0 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
313f0 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 70 50  tex) );..  /* pP
31400 61 67 65 20 69 73 20 6e 6f 74 20 6e 65 63 65 73  age is not neces
31410 73 61 72 69 6c 79 20 77 72 69 74 65 61 62 6c 65  sarily writeable
31420 20 73 69 6e 63 65 20 70 43 65 6c 6c 20 6d 69 67   since pCell mig
31430 68 74 20 62 65 20 61 75 78 69 6c 69 61 72 79 0a  ht be auxiliary.
31440 20 20 2a 2a 20 62 75 66 66 65 72 20 73 70 61 63    ** buffer spac
31450 65 20 74 68 61 74 20 69 73 20 73 65 70 61 72 61  e that is separa
31460 74 65 20 66 72 6f 6d 20 74 68 65 20 70 50 61 67  te from the pPag
31470 65 20 62 75 66 66 65 72 20 61 72 65 61 20 2a 2f  e buffer area */
31480 0a 20 20 61 73 73 65 72 74 28 20 70 43 65 6c 6c  .  assert( pCell
31490 3c 70 50 61 67 65 2d 3e 61 44 61 74 61 20 7c 7c  <pPage->aData ||
314a0 20 70 43 65 6c 6c 3e 3d 26 70 50 61 67 65 2d 3e   pCell>=&pPage->
314b0 61 44 61 74 61 5b 70 42 74 2d 3e 70 61 67 65 53  aData[pBt->pageS
314c0 69 7a 65 5d 0a 20 20 20 20 20 20 20 20 20 20 20  ize].           
314d0 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72   || sqlite3Pager
314e0 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
314f0 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a  e->pDbPage) );..
31500 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65    /* Fill in the
31510 20 68 65 61 64 65 72 2e 20 2a 2f 0a 20 20 6e 48   header. */.  nH
31520 65 61 64 65 72 20 3d 20 70 50 61 67 65 2d 3e 63  eader = pPage->c
31530 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20 6e  hildPtrSize;.  n
31540 50 61 79 6c 6f 61 64 20 3d 20 6e 44 61 74 61 20  Payload = nData 
31550 2b 20 6e 5a 65 72 6f 3b 0a 20 20 69 66 28 20 70  + nZero;.  if( p
31560 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66  Page->intKeyLeaf
31570 20 29 7b 0a 20 20 20 20 6e 48 65 61 64 65 72 20   ){.    nHeader 
31580 2b 3d 20 70 75 74 56 61 72 69 6e 74 33 32 28 26  += putVarint32(&
31590 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c 20  pCell[nHeader], 
315a0 6e 50 61 79 6c 6f 61 64 29 3b 0a 20 20 7d 65 6c  nPayload);.  }el
315b0 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
315c0 6e 44 61 74 61 3d 3d 30 20 29 3b 0a 20 20 20 20  nData==0 );.    
315d0 61 73 73 65 72 74 28 20 6e 5a 65 72 6f 3d 3d 30  assert( nZero==0
315e0 20 29 3b 0a 20 20 7d 0a 20 20 6e 48 65 61 64 65   );.  }.  nHeade
315f0 72 20 2b 3d 20 70 75 74 56 61 72 69 6e 74 28 26  r += putVarint(&
31600 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c 20  pCell[nHeader], 
31610 2a 28 75 36 34 2a 29 26 6e 4b 65 79 29 3b 0a 20  *(u64*)&nKey);. 
31620 20 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74   .  /* Fill in t
31630 68 65 20 70 61 79 6c 6f 61 64 20 73 69 7a 65 20  he payload size 
31640 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e  */.  if( pPage->
31650 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 70 53  intKey ){.    pS
31660 72 63 20 3d 20 70 44 61 74 61 3b 0a 20 20 20 20  rc = pData;.    
31670 6e 53 72 63 20 3d 20 6e 44 61 74 61 3b 0a 20 20  nSrc = nData;.  
31680 20 20 6e 44 61 74 61 20 3d 20 30 3b 0a 20 20 7d    nData = 0;.  }
31690 65 6c 73 65 7b 20 0a 20 20 20 20 69 66 28 20 4e  else{ .    if( N
316a0 45 56 45 52 28 6e 4b 65 79 3e 30 78 37 66 66 66  EVER(nKey>0x7fff
316b0 66 66 66 66 20 7c 7c 20 70 4b 65 79 3d 3d 30 29  ffff || pKey==0)
316c0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
316d0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
316e0 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20  BKPT;.    }.    
316f0 6e 50 61 79 6c 6f 61 64 20 3d 20 28 69 6e 74 29  nPayload = (int)
31700 6e 4b 65 79 3b 0a 20 20 20 20 70 53 72 63 20 3d  nKey;.    pSrc =
31710 20 70 4b 65 79 3b 0a 20 20 20 20 6e 53 72 63 20   pKey;.    nSrc 
31720 3d 20 28 69 6e 74 29 6e 4b 65 79 3b 0a 20 20 7d  = (int)nKey;.  }
31730 0a 20 20 69 66 28 20 6e 50 61 79 6c 6f 61 64 3c  .  if( nPayload<
31740 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c  =pPage->maxLocal
31750 20 29 7b 0a 20 20 20 20 6e 20 3d 20 6e 48 65 61   ){.    n = nHea
31760 64 65 72 20 2b 20 6e 50 61 79 6c 6f 61 64 3b 0a  der + nPayload;.
31770 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 3d      testcase( n=
31780 3d 33 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  =3 );.    testca
31790 73 65 28 20 6e 3d 3d 34 20 29 3b 0a 20 20 20 20  se( n==4 );.    
317a0 69 66 28 20 6e 3c 34 20 29 20 6e 20 3d 20 34 3b  if( n<4 ) n = 4;
317b0 0a 20 20 20 20 2a 70 6e 53 69 7a 65 20 3d 20 6e  .    *pnSize = n
317c0 3b 0a 20 20 20 20 73 70 61 63 65 4c 65 66 74 20  ;.    spaceLeft 
317d0 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20  = nPayload;.    
317e0 70 50 72 69 6f 72 20 3d 20 70 43 65 6c 6c 3b 0a  pPrior = pCell;.
317f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74    }else{.    int
31800 20 6d 6e 20 3d 20 70 50 61 67 65 2d 3e 6d 69 6e   mn = pPage->min
31810 4c 6f 63 61 6c 3b 0a 20 20 20 20 6e 20 3d 20 6d  Local;.    n = m
31820 6e 20 2b 20 28 6e 50 61 79 6c 6f 61 64 20 2d 20  n + (nPayload - 
31830 6d 6e 29 20 25 20 28 70 50 61 67 65 2d 3e 70 42  mn) % (pPage->pB
31840 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20  t->usableSize - 
31850 34 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  4);.    testcase
31860 28 20 6e 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c  ( n==pPage->maxL
31870 6f 63 61 6c 20 29 3b 0a 20 20 20 20 74 65 73 74  ocal );.    test
31880 63 61 73 65 28 20 6e 3d 3d 70 50 61 67 65 2d 3e  case( n==pPage->
31890 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20  maxLocal+1 );.  
318a0 20 20 69 66 28 20 6e 20 3e 20 70 50 61 67 65 2d    if( n > pPage-
318b0 3e 6d 61 78 4c 6f 63 61 6c 20 29 20 6e 20 3d 20  >maxLocal ) n = 
318c0 6d 6e 3b 0a 20 20 20 20 73 70 61 63 65 4c 65 66  mn;.    spaceLef
318d0 74 20 3d 20 6e 3b 0a 20 20 20 20 2a 70 6e 53 69  t = n;.    *pnSi
318e0 7a 65 20 3d 20 6e 20 2b 20 6e 48 65 61 64 65 72  ze = n + nHeader
318f0 20 2b 20 34 3b 0a 20 20 20 20 70 50 72 69 6f 72   + 4;.    pPrior
31900 20 3d 20 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65   = &pCell[nHeade
31910 72 2b 6e 5d 3b 0a 20 20 7d 0a 20 20 70 50 61 79  r+n];.  }.  pPay
31920 6c 6f 61 64 20 3d 20 26 70 43 65 6c 6c 5b 6e 48  load = &pCell[nH
31930 65 61 64 65 72 5d 3b 0a 0a 20 20 2f 2a 20 41 74  eader];..  /* At
31940 20 74 68 69 73 20 70 6f 69 6e 74 20 76 61 72 69   this point vari
31950 61 62 6c 65 73 20 73 68 6f 75 6c 64 20 62 65 20  ables should be 
31960 73 65 74 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a  set as follows:.
31970 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 6e 50 61 79    **.  **   nPay
31980 6c 6f 61 64 20 20 20 20 20 20 20 20 20 20 20 54  load           T
31990 6f 74 61 6c 20 70 61 79 6c 6f 61 64 20 73 69 7a  otal payload siz
319a0 65 20 69 6e 20 62 79 74 65 73 0a 20 20 2a 2a 20  e in bytes.  ** 
319b0 20 20 70 50 61 79 6c 6f 61 64 20 20 20 20 20 20    pPayload      
319c0 20 20 20 20 20 42 65 67 69 6e 20 77 72 69 74 69       Begin writi
319d0 6e 67 20 70 61 79 6c 6f 61 64 20 68 65 72 65 0a  ng payload here.
319e0 20 20 2a 2a 20 20 20 73 70 61 63 65 4c 65 66 74    **   spaceLeft
319f0 20 20 20 20 20 20 20 20 20 20 53 70 61 63 65 20            Space 
31a00 61 76 61 69 6c 61 62 6c 65 20 61 74 20 70 50 61  available at pPa
31a10 79 6c 6f 61 64 2e 20 20 49 66 20 6e 50 61 79 6c  yload.  If nPayl
31a20 6f 61 64 3e 73 70 61 63 65 4c 65 66 74 2c 0a 20  oad>spaceLeft,. 
31a30 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20   **             
31a40 20 20 20 20 20 20 20 20 20 74 68 61 74 20 6d 65           that me
31a50 61 6e 73 20 63 6f 6e 74 65 6e 74 20 6d 75 73 74  ans content must
31a60 20 73 70 69 6c 6c 20 69 6e 74 6f 20 6f 76 65 72   spill into over
31a70 66 6c 6f 77 20 70 61 67 65 73 2e 0a 20 20 2a 2a  flow pages..  **
31a80 20 20 20 2a 70 6e 53 69 7a 65 20 20 20 20 20 20     *pnSize      
31a90 20 20 20 20 20 20 53 69 7a 65 20 6f 66 20 74 68        Size of th
31aa0 65 20 6c 6f 63 61 6c 20 63 65 6c 6c 20 28 6e 6f  e local cell (no
31ab0 74 20 63 6f 75 6e 74 69 6e 67 20 6f 76 65 72 66  t counting overf
31ac0 6c 6f 77 20 70 61 67 65 73 29 0a 20 20 2a 2a 20  low pages).  ** 
31ad0 20 20 70 50 72 69 6f 72 20 20 20 20 20 20 20 20    pPrior        
31ae0 20 20 20 20 20 57 68 65 72 65 20 74 6f 20 77 72       Where to wr
31af0 69 74 65 20 74 68 65 20 70 67 6e 6f 20 6f 66 20  ite the pgno of 
31b00 74 68 65 20 66 69 72 73 74 20 6f 76 65 72 66 6c  the first overfl
31b10 6f 77 20 70 61 67 65 0a 20 20 2a 2a 0a 20 20 2a  ow page.  **.  *
31b20 2a 20 55 73 65 20 61 20 63 61 6c 6c 20 74 6f 20  * Use a call to 
31b30 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  btreeParseCellPt
31b40 72 28 29 20 74 6f 20 76 65 72 69 66 79 20 74 68  r() to verify th
31b50 61 74 20 74 68 65 20 76 61 6c 75 65 73 20 61 62  at the values ab
31b60 6f 76 65 0a 20 20 2a 2a 20 77 65 72 65 20 63 6f  ove.  ** were co
31b70 6d 70 75 74 65 64 20 63 6f 72 72 65 63 74 6c 79  mputed correctly
31b80 2e 0a 20 20 2a 2f 0a 23 69 66 20 53 51 4c 49 54  ..  */.#if SQLIT
31b90 45 5f 44 45 42 55 47 0a 20 20 7b 0a 20 20 20 20  E_DEBUG.  {.    
31ba0 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20  CellInfo info;. 
31bb0 20 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c     btreeParseCel
31bc0 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c  lPtr(pPage, pCel
31bd0 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 61  l, &info);.    a
31be0 73 73 65 72 74 28 20 6e 48 65 61 64 65 72 3d 28  ssert( nHeader=(
31bf0 69 6e 74 29 28 69 6e 66 6f 2e 70 50 61 79 6c 6f  int)(info.pPaylo
31c00 61 64 20 2d 20 70 43 65 6c 6c 29 20 29 3b 0a 20  ad - pCell) );. 
31c10 20 20 20 61 73 73 65 72 74 28 20 69 6e 66 6f 2e     assert( info.
31c20 6e 4b 65 79 3d 3d 6e 4b 65 79 20 29 3b 0a 20 20  nKey==nKey );.  
31c30 20 20 61 73 73 65 72 74 28 20 2a 70 6e 53 69 7a    assert( *pnSiz
31c40 65 20 3d 3d 20 69 6e 66 6f 2e 6e 53 69 7a 65 20  e == info.nSize 
31c50 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  );.    assert( s
31c60 70 61 63 65 4c 65 66 74 20 3d 3d 20 69 6e 66 6f  paceLeft == info
31c70 2e 6e 4c 6f 63 61 6c 20 29 3b 0a 20 20 20 20 61  .nLocal );.    a
31c80 73 73 65 72 74 28 20 70 50 72 69 6f 72 20 3d 3d  ssert( pPrior ==
31c90 20 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76   &pCell[info.iOv
31ca0 65 72 66 6c 6f 77 5d 20 29 3b 0a 20 20 7d 0a 23  erflow] );.  }.#
31cb0 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 57 72 69 74  endif..  /* Writ
31cc0 65 20 74 68 65 20 70 61 79 6c 6f 61 64 20 69 6e  e the payload in
31cd0 74 6f 20 74 68 65 20 6c 6f 63 61 6c 20 43 65 6c  to the local Cel
31ce0 6c 20 61 6e 64 20 61 6e 79 20 65 78 74 72 61 20  l and any extra 
31cf0 69 6e 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61  into overflow pa
31d00 67 65 73 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20  ges */.  while( 
31d10 6e 50 61 79 6c 6f 61 64 3e 30 20 29 7b 0a 20 20  nPayload>0 ){.  
31d20 20 20 69 66 28 20 73 70 61 63 65 4c 65 66 74 3d    if( spaceLeft=
31d30 3d 30 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  =0 ){.#ifndef SQ
31d40 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
31d50 43 55 55 4d 0a 20 20 20 20 20 20 50 67 6e 6f 20  CUUM.      Pgno 
31d60 70 67 6e 6f 50 74 72 6d 61 70 20 3d 20 70 67 6e  pgnoPtrmap = pgn
31d70 6f 4f 76 66 6c 3b 20 2f 2a 20 4f 76 65 72 66 6c  oOvfl; /* Overfl
31d80 6f 77 20 70 61 67 65 20 70 6f 69 6e 74 65 72 2d  ow page pointer-
31d90 6d 61 70 20 65 6e 74 72 79 20 70 61 67 65 20 2a  map entry page *
31da0 2f 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 2d  /.      if( pBt-
31db0 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20  >autoVacuum ){. 
31dc0 20 20 20 20 20 20 20 64 6f 7b 0a 20 20 20 20 20         do{.     
31dd0 20 20 20 20 20 70 67 6e 6f 4f 76 66 6c 2b 2b 3b       pgnoOvfl++;
31de0 0a 20 20 20 20 20 20 20 20 7d 20 77 68 69 6c 65  .        } while
31df0 28 20 0a 20 20 20 20 20 20 20 20 20 20 50 54 52  ( .          PTR
31e00 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20  MAP_ISPAGE(pBt, 
31e10 70 67 6e 6f 4f 76 66 6c 29 20 7c 7c 20 70 67 6e  pgnoOvfl) || pgn
31e20 6f 4f 76 66 6c 3d 3d 50 45 4e 44 49 4e 47 5f 42  oOvfl==PENDING_B
31e30 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 0a 20  YTE_PAGE(pBt) . 
31e40 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
31e50 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 72  }.#endif.      r
31e60 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65  c = allocateBtre
31e70 65 50 61 67 65 28 70 42 74 2c 20 26 70 4f 76 66  ePage(pBt, &pOvf
31e80 6c 2c 20 26 70 67 6e 6f 4f 76 66 6c 2c 20 70 67  l, &pgnoOvfl, pg
31e90 6e 6f 4f 76 66 6c 2c 20 30 29 3b 0a 23 69 66 6e  noOvfl, 0);.#ifn
31ea0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
31eb0 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20  AUTOVACUUM.     
31ec0 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61 62   /* If the datab
31ed0 61 73 65 20 73 75 70 70 6f 72 74 73 20 61 75 74  ase supports aut
31ee0 6f 2d 76 61 63 75 75 6d 2c 20 61 6e 64 20 74 68  o-vacuum, and th
31ef0 65 20 73 65 63 6f 6e 64 20 6f 72 20 73 75 62 73  e second or subs
31f00 65 71 75 65 6e 74 0a 20 20 20 20 20 20 2a 2a 20  equent.      ** 
31f10 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 73  overflow page is
31f20 20 62 65 69 6e 67 20 61 6c 6c 6f 63 61 74 65 64   being allocated
31f30 2c 20 61 64 64 20 61 6e 20 65 6e 74 72 79 20 74  , add an entry t
31f40 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61  o the pointer-ma
31f50 70 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 74  p.      ** for t
31f60 68 61 74 20 70 61 67 65 20 6e 6f 77 2e 20 0a 20  hat page now. . 
31f70 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
31f80 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20   If this is the 
31f90 66 69 72 73 74 20 6f 76 65 72 66 6c 6f 77 20 70  first overflow p
31fa0 61 67 65 2c 20 74 68 65 6e 20 77 72 69 74 65 20  age, then write 
31fb0 61 20 70 61 72 74 69 61 6c 20 65 6e 74 72 79 20  a partial entry 
31fc0 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 74 68 65  .      ** to the
31fd0 20 70 6f 69 6e 74 65 72 2d 6d 61 70 2e 20 49 66   pointer-map. If
31fe0 20 77 65 20 77 72 69 74 65 20 6e 6f 74 68 69 6e   we write nothin
31ff0 67 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 65  g to this pointe
32000 72 2d 6d 61 70 20 73 6c 6f 74 2c 0a 20 20 20 20  r-map slot,.    
32010 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 20 6f 70    ** then the op
32020 74 69 6d 69 73 74 69 63 20 6f 76 65 72 66 6c 6f  timistic overflo
32030 77 20 63 68 61 69 6e 20 70 72 6f 63 65 73 73 69  w chain processi
32040 6e 67 20 69 6e 20 63 6c 65 61 72 43 65 6c 6c 28  ng in clearCell(
32050 29 0a 20 20 20 20 20 20 2a 2a 20 6d 61 79 20 6d  ).      ** may m
32060 69 73 69 6e 74 65 72 70 72 65 74 20 74 68 65 20  isinterpret the 
32070 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20 76 61  uninitialized va
32080 6c 75 65 73 20 61 6e 64 20 64 65 6c 65 74 65 20  lues and delete 
32090 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 77 72 6f  the.      ** wro
320a0 6e 67 20 70 61 67 65 73 20 66 72 6f 6d 20 74 68  ng pages from th
320b0 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20 20 20  e database..    
320c0 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70    */.      if( p
320d0 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 26  Bt->autoVacuum &
320e0 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  & rc==SQLITE_OK 
320f0 29 7b 0a 20 20 20 20 20 20 20 20 75 38 20 65 54  ){.        u8 eT
32100 79 70 65 20 3d 20 28 70 67 6e 6f 50 74 72 6d 61  ype = (pgnoPtrma
32110 70 3f 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  p?PTRMAP_OVERFLO
32120 57 32 3a 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  W2:PTRMAP_OVERFL
32130 4f 57 31 29 3b 0a 20 20 20 20 20 20 20 20 70 74  OW1);.        pt
32140 72 6d 61 70 50 75 74 28 70 42 74 2c 20 70 67 6e  rmapPut(pBt, pgn
32150 6f 4f 76 66 6c 2c 20 65 54 79 70 65 2c 20 70 67  oOvfl, eType, pg
32160 6e 6f 50 74 72 6d 61 70 2c 20 26 72 63 29 3b 0a  noPtrmap, &rc);.
32170 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
32180 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 6c 65  {.          rele
32190 61 73 65 50 61 67 65 28 70 4f 76 66 6c 29 3b 0a  asePage(pOvfl);.
321a0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
321b0 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69  }.#endif.      i
321c0 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
321d0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 6f   releasePage(pTo
321e0 52 65 6c 65 61 73 65 29 3b 0a 20 20 20 20 20 20  Release);.      
321f0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
32200 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49     }..      /* I
32210 66 20 70 54 6f 52 65 6c 65 61 73 65 20 69 73 20  f pToRelease is 
32220 6e 6f 74 20 7a 65 72 6f 20 74 68 61 6e 20 70 50  not zero than pP
32230 72 69 6f 72 20 70 6f 69 6e 74 73 20 69 6e 74 6f  rior points into
32240 20 74 68 65 20 64 61 74 61 20 61 72 65 61 0a 20   the data area. 
32250 20 20 20 20 20 2a 2a 20 6f 66 20 70 54 6f 52 65       ** of pToRe
32260 6c 65 61 73 65 2e 20 20 4d 61 6b 65 20 73 75 72  lease.  Make sur
32270 65 20 70 54 6f 52 65 6c 65 61 73 65 20 69 73 20  e pToRelease is 
32280 73 74 69 6c 6c 20 77 72 69 74 65 61 62 6c 65 2e  still writeable.
32290 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
322a0 28 20 70 54 6f 52 65 6c 65 61 73 65 3d 3d 30 20  ( pToRelease==0 
322b0 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  || sqlite3PagerI
322c0 73 77 72 69 74 65 61 62 6c 65 28 70 54 6f 52 65  swriteable(pToRe
322d0 6c 65 61 73 65 2d 3e 70 44 62 50 61 67 65 29 20  lease->pDbPage) 
322e0 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  );..      /* If 
322f0 70 50 72 69 6f 72 20 69 73 20 70 61 72 74 20 6f  pPrior is part o
32300 66 20 74 68 65 20 64 61 74 61 20 61 72 65 61 20  f the data area 
32310 6f 66 20 70 50 61 67 65 2c 20 74 68 65 6e 20 6d  of pPage, then m
32320 61 6b 65 20 73 75 72 65 20 70 50 61 67 65 0a 20  ake sure pPage. 
32330 20 20 20 20 20 2a 2a 20 69 73 20 73 74 69 6c 6c       ** is still
32340 20 77 72 69 74 65 61 62 6c 65 20 2a 2f 0a 20 20   writeable */.  
32350 20 20 20 20 61 73 73 65 72 74 28 20 70 50 72 69      assert( pPri
32360 6f 72 3c 70 50 61 67 65 2d 3e 61 44 61 74 61 20  or<pPage->aData 
32370 7c 7c 20 70 50 72 69 6f 72 3e 3d 26 70 50 61 67  || pPrior>=&pPag
32380 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e 70 61  e->aData[pBt->pa
32390 67 65 53 69 7a 65 5d 0a 20 20 20 20 20 20 20 20  geSize].        
323a0 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 50 61      || sqlite3Pa
323b0 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
323c0 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
323d0 3b 0a 0a 20 20 20 20 20 20 70 75 74 34 62 79 74  ;..      put4byt
323e0 65 28 70 50 72 69 6f 72 2c 20 70 67 6e 6f 4f 76  e(pPrior, pgnoOv
323f0 66 6c 29 3b 0a 20 20 20 20 20 20 72 65 6c 65 61  fl);.      relea
32400 73 65 50 61 67 65 28 70 54 6f 52 65 6c 65 61 73  sePage(pToReleas
32410 65 29 3b 0a 20 20 20 20 20 20 70 54 6f 52 65 6c  e);.      pToRel
32420 65 61 73 65 20 3d 20 70 4f 76 66 6c 3b 0a 20 20  ease = pOvfl;.  
32430 20 20 20 20 70 50 72 69 6f 72 20 3d 20 70 4f 76      pPrior = pOv
32440 66 6c 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 20  fl->aData;.     
32450 20 70 75 74 34 62 79 74 65 28 70 50 72 69 6f 72   put4byte(pPrior
32460 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 50 61 79  , 0);.      pPay
32470 6c 6f 61 64 20 3d 20 26 70 4f 76 66 6c 2d 3e 61  load = &pOvfl->a
32480 44 61 74 61 5b 34 5d 3b 0a 20 20 20 20 20 20 73  Data[4];.      s
32490 70 61 63 65 4c 65 66 74 20 3d 20 70 42 74 2d 3e  paceLeft = pBt->
324a0 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a  usableSize - 4;.
324b0 20 20 20 20 7d 0a 20 20 20 20 6e 20 3d 20 6e 50      }.    n = nP
324c0 61 79 6c 6f 61 64 3b 0a 20 20 20 20 69 66 28 20  ayload;.    if( 
324d0 6e 3e 73 70 61 63 65 4c 65 66 74 20 29 20 6e 20  n>spaceLeft ) n 
324e0 3d 20 73 70 61 63 65 4c 65 66 74 3b 0a 0a 20 20  = spaceLeft;..  
324f0 20 20 2f 2a 20 49 66 20 70 54 6f 52 65 6c 65 61    /* If pToRelea
32500 73 65 20 69 73 20 6e 6f 74 20 7a 65 72 6f 20 74  se is not zero t
32510 68 61 6e 20 70 50 61 79 6c 6f 61 64 20 70 6f 69  han pPayload poi
32520 6e 74 73 20 69 6e 74 6f 20 74 68 65 20 64 61 74  nts into the dat
32530 61 20 61 72 65 61 0a 20 20 20 20 2a 2a 20 6f 66  a area.    ** of
32540 20 70 54 6f 52 65 6c 65 61 73 65 2e 20 20 4d 61   pToRelease.  Ma
32550 6b 65 20 73 75 72 65 20 70 54 6f 52 65 6c 65 61  ke sure pToRelea
32560 73 65 20 69 73 20 73 74 69 6c 6c 20 77 72 69 74  se is still writ
32570 65 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 61 73  eable. */.    as
32580 73 65 72 74 28 20 70 54 6f 52 65 6c 65 61 73 65  sert( pToRelease
32590 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 50 61  ==0 || sqlite3Pa
325a0 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
325b0 54 6f 52 65 6c 65 61 73 65 2d 3e 70 44 62 50 61  ToRelease->pDbPa
325c0 67 65 29 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49  ge) );..    /* I
325d0 66 20 70 50 61 79 6c 6f 61 64 20 69 73 20 70 61  f pPayload is pa
325e0 72 74 20 6f 66 20 74 68 65 20 64 61 74 61 20 61  rt of the data a
325f0 72 65 61 20 6f 66 20 70 50 61 67 65 2c 20 74 68  rea of pPage, th
32600 65 6e 20 6d 61 6b 65 20 73 75 72 65 20 70 50 61  en make sure pPa
32610 67 65 0a 20 20 20 20 2a 2a 20 69 73 20 73 74 69  ge.    ** is sti
32620 6c 6c 20 77 72 69 74 65 61 62 6c 65 20 2a 2f 0a  ll writeable */.
32630 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 79      assert( pPay
32640 6c 6f 61 64 3c 70 50 61 67 65 2d 3e 61 44 61 74  load<pPage->aDat
32650 61 20 7c 7c 20 70 50 61 79 6c 6f 61 64 3e 3d 26  a || pPayload>=&
32660 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 42 74  pPage->aData[pBt
32670 2d 3e 70 61 67 65 53 69 7a 65 5d 0a 20 20 20 20  ->pageSize].    
32680 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74          || sqlit
32690 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
326a0 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
326b0 65 29 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 6e  e) );..    if( n
326c0 53 72 63 3e 30 20 29 7b 0a 20 20 20 20 20 20 69  Src>0 ){.      i
326d0 66 28 20 6e 3e 6e 53 72 63 20 29 20 6e 20 3d 20  f( n>nSrc ) n = 
326e0 6e 53 72 63 3b 0a 20 20 20 20 20 20 61 73 73 65  nSrc;.      asse
326f0 72 74 28 20 70 53 72 63 20 29 3b 0a 20 20 20 20  rt( pSrc );.    
32700 20 20 6d 65 6d 63 70 79 28 70 50 61 79 6c 6f 61    memcpy(pPayloa
32710 64 2c 20 70 53 72 63 2c 20 6e 29 3b 0a 20 20 20  d, pSrc, n);.   
32720 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6d 65   }else{.      me
32730 6d 73 65 74 28 70 50 61 79 6c 6f 61 64 2c 20 30  mset(pPayload, 0
32740 2c 20 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , n);.    }.    
32750 6e 50 61 79 6c 6f 61 64 20 2d 3d 20 6e 3b 0a 20  nPayload -= n;. 
32760 20 20 20 70 50 61 79 6c 6f 61 64 20 2b 3d 20 6e     pPayload += n
32770 3b 0a 20 20 20 20 70 53 72 63 20 2b 3d 20 6e 3b  ;.    pSrc += n;
32780 0a 20 20 20 20 6e 53 72 63 20 2d 3d 20 6e 3b 0a  .    nSrc -= n;.
32790 20 20 20 20 73 70 61 63 65 4c 65 66 74 20 2d 3d      spaceLeft -=
327a0 20 6e 3b 0a 20 20 20 20 69 66 28 20 6e 53 72 63   n;.    if( nSrc
327b0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e 53 72  ==0 ){.      nSr
327c0 63 20 3d 20 6e 44 61 74 61 3b 0a 20 20 20 20 20  c = nData;.     
327d0 20 70 53 72 63 20 3d 20 70 44 61 74 61 3b 0a 20   pSrc = pData;. 
327e0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 6c 65 61     }.  }.  relea
327f0 73 65 50 61 67 65 28 70 54 6f 52 65 6c 65 61 73  sePage(pToReleas
32800 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  e);.  return SQL
32810 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
32820 20 52 65 6d 6f 76 65 20 74 68 65 20 69 2d 74 68   Remove the i-th
32830 20 63 65 6c 6c 20 66 72 6f 6d 20 70 50 61 67 65   cell from pPage
32840 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
32850 65 66 66 65 63 74 73 20 70 50 61 67 65 20 6f 6e  effects pPage on
32860 6c 79 2e 0a 2a 2a 20 54 68 65 20 63 65 6c 6c 20  ly..** The cell 
32870 63 6f 6e 74 65 6e 74 20 69 73 20 6e 6f 74 20 66  content is not f
32880 72 65 65 64 20 6f 72 20 64 65 61 6c 6c 6f 63 61  reed or dealloca
32890 74 65 64 2e 20 20 49 74 20 69 73 20 61 73 73 75  ted.  It is assu
328a0 6d 65 64 20 74 68 61 74 0a 2a 2a 20 74 68 65 20  med that.** the 
328b0 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 68 61 73  cell content has
328c0 20 62 65 65 6e 20 63 6f 70 69 65 64 20 73 6f 6d   been copied som
328d0 65 70 6c 61 63 65 20 65 6c 73 65 2e 20 20 54 68  eplace else.  Th
328e0 69 73 20 72 6f 75 74 69 6e 65 20 6a 75 73 74 0a  is routine just.
328f0 2a 2a 20 72 65 6d 6f 76 65 73 20 74 68 65 20 72  ** removes the r
32900 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20  eference to the 
32910 63 65 6c 6c 20 66 72 6f 6d 20 70 50 61 67 65 2e  cell from pPage.
32920 0a 2a 2a 0a 2a 2a 20 22 73 7a 22 20 6d 75 73 74  .**.** "sz" must
32930 20 62 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   be the number o
32940 66 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 63  f bytes in the c
32950 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ell..*/.static v
32960 6f 69 64 20 64 72 6f 70 43 65 6c 6c 28 4d 65 6d  oid dropCell(Mem
32970 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74  Page *pPage, int
32980 20 69 64 78 2c 20 69 6e 74 20 73 7a 2c 20 69 6e   idx, int sz, in
32990 74 20 2a 70 52 43 29 7b 0a 20 20 75 33 32 20 70  t *pRC){.  u32 p
329a0 63 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66  c;         /* Of
329b0 66 73 65 74 20 74 6f 20 63 65 6c 6c 20 63 6f 6e  fset to cell con
329c0 74 65 6e 74 20 6f 66 20 63 65 6c 6c 20 62 65 69  tent of cell bei
329d0 6e 67 20 64 65 6c 65 74 65 64 20 2a 2f 0a 20 20  ng deleted */.  
329e0 75 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20  u8 *data;       
329f0 2f 2a 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20  /* pPage->aData 
32a00 2a 2f 0a 20 20 75 38 20 2a 70 74 72 3b 20 20 20  */.  u8 *ptr;   
32a10 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20       /* Used to 
32a20 6d 6f 76 65 20 62 79 74 65 73 20 61 72 6f 75 6e  move bytes aroun
32a30 64 20 77 69 74 68 69 6e 20 64 61 74 61 5b 5d 20  d within data[] 
32a40 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  */.  int rc;    
32a50 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 74 75       /* The retu
32a60 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  rn code */.  int
32a70 20 68 64 72 3b 20 20 20 20 20 20 20 20 2f 2a 20   hdr;        /* 
32a80 42 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65  Beginning of the
32a90 20 68 65 61 64 65 72 2e 20 20 30 20 6d 6f 73 74   header.  0 most
32aa0 20 70 61 67 65 73 2e 20 20 31 30 30 20 70 61 67   pages.  100 pag
32ab0 65 20 31 20 2a 2f 0a 0a 20 20 69 66 28 20 2a 70  e 1 */..  if( *p
32ac0 52 43 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20  RC ) return;..  
32ad0 61 73 73 65 72 74 28 20 69 64 78 3e 3d 30 20 26  assert( idx>=0 &
32ae0 26 20 69 64 78 3c 70 50 61 67 65 2d 3e 6e 43 65  & idx<pPage->nCe
32af0 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ll );.  assert( 
32b00 73 7a 3d 3d 63 65 6c 6c 53 69 7a 65 28 70 50 61  sz==cellSize(pPa
32b10 67 65 2c 20 69 64 78 29 20 29 3b 0a 20 20 61 73  ge, idx) );.  as
32b20 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
32b30 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
32b40 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
32b50 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
32b60 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
32b70 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
32b80 20 29 3b 0a 20 20 64 61 74 61 20 3d 20 70 50 61   );.  data = pPa
32b90 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 70 74 72  ge->aData;.  ptr
32ba0 20 3d 20 26 70 50 61 67 65 2d 3e 61 43 65 6c 6c   = &pPage->aCell
32bb0 49 64 78 5b 32 2a 69 64 78 5d 3b 0a 20 20 70 63  Idx[2*idx];.  pc
32bc0 20 3d 20 67 65 74 32 62 79 74 65 28 70 74 72 29   = get2byte(ptr)
32bd0 3b 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d  ;.  hdr = pPage-
32be0 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 74 65  >hdrOffset;.  te
32bf0 73 74 63 61 73 65 28 20 70 63 3d 3d 67 65 74 32  stcase( pc==get2
32c00 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
32c10 5d 29 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  ]) );.  testcase
32c20 28 20 70 63 2b 73 7a 3d 3d 70 50 61 67 65 2d 3e  ( pc+sz==pPage->
32c30 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
32c40 29 3b 0a 20 20 69 66 28 20 70 63 20 3c 20 28 75  );.  if( pc < (u
32c50 33 32 29 67 65 74 32 62 79 74 65 28 26 64 61 74  32)get2byte(&dat
32c60 61 5b 68 64 72 2b 35 5d 29 20 7c 7c 20 70 63 2b  a[hdr+5]) || pc+
32c70 73 7a 20 3e 20 70 50 61 67 65 2d 3e 70 42 74 2d  sz > pPage->pBt-
32c80 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20  >usableSize ){. 
32c90 20 20 20 2a 70 52 43 20 3d 20 53 51 4c 49 54 45     *pRC = SQLITE
32ca0 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
32cb0 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
32cc0 20 72 63 20 3d 20 66 72 65 65 53 70 61 63 65 28   rc = freeSpace(
32cd0 70 50 61 67 65 2c 20 70 63 2c 20 73 7a 29 3b 0a  pPage, pc, sz);.
32ce0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
32cf0 2a 70 52 43 20 3d 20 72 63 3b 0a 20 20 20 20 72  *pRC = rc;.    r
32d00 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 50 61  eturn;.  }.  pPa
32d10 67 65 2d 3e 6e 43 65 6c 6c 2d 2d 3b 0a 20 20 69  ge->nCell--;.  i
32d20 66 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d  f( pPage->nCell=
32d30 3d 30 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74  =0 ){.    memset
32d40 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 2c 20 30  (&data[hdr+1], 0
32d50 2c 20 34 29 3b 0a 20 20 20 20 64 61 74 61 5b 68  , 4);.    data[h
32d60 64 72 2b 37 5d 20 3d 20 30 3b 0a 20 20 20 20 70  dr+7] = 0;.    p
32d70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  ut2byte(&data[hd
32d80 72 2b 35 5d 2c 20 70 50 61 67 65 2d 3e 70 42 74  r+5], pPage->pBt
32d90 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20  ->usableSize);. 
32da0 20 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20     pPage->nFree 
32db0 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  = pPage->pBt->us
32dc0 61 62 6c 65 53 69 7a 65 20 2d 20 70 50 61 67 65  ableSize - pPage
32dd0 2d 3e 68 64 72 4f 66 66 73 65 74 0a 20 20 20 20  ->hdrOffset.    
32de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32df0 20 20 20 2d 20 70 50 61 67 65 2d 3e 63 68 69 6c     - pPage->chil
32e00 64 50 74 72 53 69 7a 65 20 2d 20 38 3b 0a 20 20  dPtrSize - 8;.  
32e10 7d 65 6c 73 65 7b 0a 20 20 20 20 6d 65 6d 6d 6f  }else{.    memmo
32e20 76 65 28 70 74 72 2c 20 70 74 72 2b 32 2c 20 32  ve(ptr, ptr+2, 2
32e30 2a 28 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 2d  *(pPage->nCell -
32e40 20 69 64 78 29 29 3b 0a 20 20 20 20 70 75 74 32   idx));.    put2
32e50 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33  byte(&data[hdr+3
32e60 5d 2c 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 29  ], pPage->nCell)
32e70 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 46 72  ;.    pPage->nFr
32e80 65 65 20 2b 3d 20 32 3b 0a 20 20 7d 0a 7d 0a 0a  ee += 2;.  }.}..
32e90 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 61 20 6e  /*.** Insert a n
32ea0 65 77 20 63 65 6c 6c 20 6f 6e 20 70 50 61 67 65  ew cell on pPage
32eb0 20 61 74 20 63 65 6c 6c 20 69 6e 64 65 78 20 22   at cell index "
32ec0 69 22 2e 20 20 70 43 65 6c 6c 20 70 6f 69 6e 74  i".  pCell point
32ed0 73 20 74 6f 20 74 68 65 0a 2a 2a 20 63 6f 6e 74  s to the.** cont
32ee0 65 6e 74 20 6f 66 20 74 68 65 20 63 65 6c 6c 2e  ent of the cell.
32ef0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 65  .**.** If the ce
32f00 6c 6c 20 63 6f 6e 74 65 6e 74 20 77 69 6c 6c 20  ll content will 
32f10 66 69 74 20 6f 6e 20 74 68 65 20 70 61 67 65 2c  fit on the page,
32f20 20 74 68 65 6e 20 70 75 74 20 69 74 20 74 68 65   then put it the
32f30 72 65 2e 20 20 49 66 20 69 74 0a 2a 2a 20 77 69  re.  If it.** wi
32f40 6c 6c 20 6e 6f 74 20 66 69 74 2c 20 74 68 65 6e  ll not fit, then
32f50 20 6d 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20   make a copy of 
32f60 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
32f70 20 69 6e 74 6f 20 70 54 65 6d 70 20 69 66 0a 2a   into pTemp if.*
32f80 2a 20 70 54 65 6d 70 20 69 73 20 6e 6f 74 20 6e  * pTemp is not n
32f90 75 6c 6c 2e 20 20 52 65 67 61 72 64 6c 65 73 73  ull.  Regardless
32fa0 20 6f 66 20 70 54 65 6d 70 2c 20 61 6c 6c 6f 63   of pTemp, alloc
32fb0 61 74 65 20 61 20 6e 65 77 20 65 6e 74 72 79 0a  ate a new entry.
32fc0 2a 2a 20 69 6e 20 70 50 61 67 65 2d 3e 61 70 4f  ** in pPage->apO
32fd0 76 66 6c 5b 5d 20 61 6e 64 20 6d 61 6b 65 20 69  vfl[] and make i
32fe0 74 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 63  t point to the c
32ff0 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 28 65 69 74  ell content (eit
33000 68 65 72 0a 2a 2a 20 69 6e 20 70 54 65 6d 70 20  her.** in pTemp 
33010 6f 72 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  or the original 
33020 70 43 65 6c 6c 29 20 61 6e 64 20 61 6c 73 6f 20  pCell) and also 
33030 72 65 63 6f 72 64 20 69 74 73 20 69 6e 64 65 78  record its index
33040 2e 20 0a 2a 2a 20 41 6c 6c 6f 63 61 74 69 6e 67  . .** Allocating
33050 20 61 20 6e 65 77 20 65 6e 74 72 79 20 69 6e 20   a new entry in 
33060 70 50 61 67 65 2d 3e 61 43 65 6c 6c 5b 5d 20 69  pPage->aCell[] i
33070 6d 70 6c 69 65 73 20 74 68 61 74 20 0a 2a 2a 20  mplies that .** 
33080 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
33090 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 2e   is incremented.
330a0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
330b0 69 6e 73 65 72 74 43 65 6c 6c 28 0a 20 20 4d 65  insertCell(.  Me
330c0 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20  mPage *pPage,   
330d0 2f 2a 20 50 61 67 65 20 69 6e 74 6f 20 77 68 69  /* Page into whi
330e0 63 68 20 77 65 20 61 72 65 20 63 6f 70 79 69 6e  ch we are copyin
330f0 67 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 20 20  g */.  int i,   
33100 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20           /* New 
33110 63 65 6c 6c 20 62 65 63 6f 6d 65 73 20 74 68 65  cell becomes the
33120 20 69 2d 74 68 20 63 65 6c 6c 20 6f 66 20 74 68   i-th cell of th
33130 65 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a  e page */.  u8 *
33140 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 2f 2a  pCell,        /*
33150 20 43 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20   Content of the 
33160 6e 65 77 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e  new cell */.  in
33170 74 20 73 7a 2c 20 20 20 20 20 20 20 20 20 20 20  t sz,           
33180 2f 2a 20 42 79 74 65 73 20 6f 66 20 63 6f 6e 74  /* Bytes of cont
33190 65 6e 74 20 69 6e 20 70 43 65 6c 6c 20 2a 2f 0a  ent in pCell */.
331a0 20 20 75 38 20 2a 70 54 65 6d 70 2c 20 20 20 20    u8 *pTemp,    
331b0 20 20 20 20 2f 2a 20 54 65 6d 70 20 73 74 6f 72      /* Temp stor
331c0 61 67 65 20 73 70 61 63 65 20 66 6f 72 20 70 43  age space for pC
331d0 65 6c 6c 2c 20 69 66 20 6e 65 65 64 65 64 20 2a  ell, if needed *
331e0 2f 0a 20 20 50 67 6e 6f 20 69 43 68 69 6c 64 2c  /.  Pgno iChild,
331f0 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 6e 2d        /* If non-
33200 7a 65 72 6f 2c 20 72 65 70 6c 61 63 65 20 66 69  zero, replace fi
33210 72 73 74 20 34 20 62 79 74 65 73 20 77 69 74 68  rst 4 bytes with
33220 20 74 68 69 73 20 76 61 6c 75 65 20 2a 2f 0a 20   this value */. 
33230 20 69 6e 74 20 2a 70 52 43 20 20 20 20 20 20 20   int *pRC       
33240 20 20 20 2f 2a 20 52 65 61 64 20 61 6e 64 20 77     /* Read and w
33250 72 69 74 65 20 72 65 74 75 72 6e 20 63 6f 64 65  rite return code
33260 20 66 72 6f 6d 20 68 65 72 65 20 2a 2f 0a 29 7b   from here */.){
33270 0a 20 20 69 6e 74 20 69 64 78 20 3d 20 30 3b 20  .  int idx = 0; 
33280 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f       /* Where to
33290 20 77 72 69 74 65 20 6e 65 77 20 63 65 6c 6c 20   write new cell 
332a0 63 6f 6e 74 65 6e 74 20 69 6e 20 64 61 74 61 5b  content in data[
332b0 5d 20 2a 2f 0a 20 20 69 6e 74 20 6a 3b 20 20 20  ] */.  int j;   
332c0 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
332d0 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e   counter */.  in
332e0 74 20 65 6e 64 3b 20 20 20 20 20 20 20 20 20 20  t end;          
332f0 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 70 61  /* First byte pa
33300 73 74 20 74 68 65 20 6c 61 73 74 20 63 65 6c 6c  st the last cell
33310 20 70 6f 69 6e 74 65 72 20 69 6e 20 64 61 74 61   pointer in data
33320 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 6e 73 3b  [] */.  int ins;
33330 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
33340 65 78 20 69 6e 20 64 61 74 61 5b 5d 20 77 68 65  ex in data[] whe
33350 72 65 20 6e 65 77 20 63 65 6c 6c 20 70 6f 69 6e  re new cell poin
33360 74 65 72 20 69 73 20 69 6e 73 65 72 74 65 64 20  ter is inserted 
33370 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 4f 66 66  */.  int cellOff
33380 73 65 74 3b 20 20 20 2f 2a 20 41 64 64 72 65 73  set;   /* Addres
33390 73 20 6f 66 20 66 69 72 73 74 20 63 65 6c 6c 20  s of first cell 
333a0 70 6f 69 6e 74 65 72 20 69 6e 20 64 61 74 61 5b  pointer in data[
333b0 5d 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b  ] */.  u8 *data;
333c0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
333d0 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 77  content of the w
333e0 68 6f 6c 65 20 70 61 67 65 20 2a 2f 0a 0a 20 20  hole page */..  
333f0 69 66 28 20 2a 70 52 43 20 29 20 72 65 74 75 72  if( *pRC ) retur
33400 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69 3e  n;..  assert( i>
33410 3d 30 20 26 26 20 69 3c 3d 70 50 61 67 65 2d 3e  =0 && i<=pPage->
33420 6e 43 65 6c 6c 2b 70 50 61 67 65 2d 3e 6e 4f 76  nCell+pPage->nOv
33430 65 72 66 6c 6f 77 20 29 3b 0a 20 20 61 73 73 65  erflow );.  asse
33440 72 74 28 20 4d 58 5f 43 45 4c 4c 28 70 50 61 67  rt( MX_CELL(pPag
33450 65 2d 3e 70 42 74 29 3c 3d 31 30 39 32 31 20 29  e->pBt)<=10921 )
33460 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
33470 65 2d 3e 6e 43 65 6c 6c 3c 3d 4d 58 5f 43 45 4c  e->nCell<=MX_CEL
33480 4c 28 70 50 61 67 65 2d 3e 70 42 74 29 20 7c 7c  L(pPage->pBt) ||
33490 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20   CORRUPT_DB );. 
334a0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
334b0 6e 4f 76 65 72 66 6c 6f 77 3c 3d 41 72 72 61 79  nOverflow<=Array
334c0 53 69 7a 65 28 70 50 61 67 65 2d 3e 61 70 4f 76  Size(pPage->apOv
334d0 66 6c 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  fl) );.  assert(
334e0 20 41 72 72 61 79 53 69 7a 65 28 70 50 61 67 65   ArraySize(pPage
334f0 2d 3e 61 70 4f 76 66 6c 29 3d 3d 41 72 72 61 79  ->apOvfl)==Array
33500 53 69 7a 65 28 70 50 61 67 65 2d 3e 61 69 4f 76  Size(pPage->aiOv
33510 66 6c 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  fl) );.  assert(
33520 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
33530 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
33540 6d 75 74 65 78 29 20 29 3b 0a 20 20 2f 2a 20 54  mutex) );.  /* T
33550 68 65 20 63 65 6c 6c 20 73 68 6f 75 6c 64 20 6e  he cell should n
33560 6f 72 6d 61 6c 6c 79 20 62 65 20 73 69 7a 65 64  ormally be sized
33570 20 63 6f 72 72 65 63 74 6c 79 2e 20 20 48 6f 77   correctly.  How
33580 65 76 65 72 2c 20 77 68 65 6e 20 6d 6f 76 69 6e  ever, when movin
33590 67 20 61 0a 20 20 2a 2a 20 6d 61 6c 66 6f 72 6d  g a.  ** malform
335a0 65 64 20 63 65 6c 6c 20 66 72 6f 6d 20 61 20 6c  ed cell from a l
335b0 65 61 66 20 70 61 67 65 20 74 6f 20 61 6e 20 69  eaf page to an i
335c0 6e 74 65 72 69 6f 72 20 70 61 67 65 2c 20 69 66  nterior page, if
335d0 20 74 68 65 20 63 65 6c 6c 20 73 69 7a 65 0a 20   the cell size. 
335e0 20 2a 2a 20 77 61 6e 74 65 64 20 74 6f 20 62 65   ** wanted to be
335f0 20 6c 65 73 73 20 74 68 61 6e 20 34 20 62 75 74   less than 4 but
33600 20 67 6f 74 20 72 6f 75 6e 64 65 64 20 75 70 20   got rounded up 
33610 74 6f 20 34 20 6f 6e 20 74 68 65 20 6c 65 61 66  to 4 on the leaf
33620 2c 20 74 68 65 6e 20 73 69 7a 65 0a 20 20 2a 2a  , then size.  **
33630 20 6d 69 67 68 74 20 62 65 20 6c 65 73 73 20 74   might be less t
33640 68 61 6e 20 38 20 28 6c 65 61 66 2d 73 69 7a 65  han 8 (leaf-size
33650 20 2b 20 70 6f 69 6e 74 65 72 29 20 6f 6e 20 74   + pointer) on t
33660 68 65 20 69 6e 74 65 72 69 6f 72 20 6e 6f 64 65  he interior node
33670 2e 20 20 48 65 6e 63 65 0a 20 20 2a 2a 20 74 68  .  Hence.  ** th
33680 65 20 74 65 72 6d 20 61 66 74 65 72 20 74 68 65  e term after the
33690 20 7c 7c 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f   || in the follo
336a0 77 69 6e 67 20 61 73 73 65 72 74 28 29 2e 20 2a  wing assert(). *
336b0 2f 0a 20 20 61 73 73 65 72 74 28 20 73 7a 3d 3d  /.  assert( sz==
336c0 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67  cellSizePtr(pPag
336d0 65 2c 20 70 43 65 6c 6c 29 20 7c 7c 20 28 73 7a  e, pCell) || (sz
336e0 3d 3d 38 20 26 26 20 69 43 68 69 6c 64 3e 30 29  ==8 && iChild>0)
336f0 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d   );.  if( pPage-
33700 3e 6e 4f 76 65 72 66 6c 6f 77 20 7c 7c 20 73 7a  >nOverflow || sz
33710 2b 32 3e 70 50 61 67 65 2d 3e 6e 46 72 65 65 20  +2>pPage->nFree 
33720 29 7b 0a 20 20 20 20 69 66 28 20 70 54 65 6d 70  ){.    if( pTemp
33730 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79   ){.      memcpy
33740 28 70 54 65 6d 70 2c 20 70 43 65 6c 6c 2c 20 73  (pTemp, pCell, s
33750 7a 29 3b 0a 20 20 20 20 20 20 70 43 65 6c 6c 20  z);.      pCell 
33760 3d 20 70 54 65 6d 70 3b 0a 20 20 20 20 7d 0a 20  = pTemp;.    }. 
33770 20 20 20 69 66 28 20 69 43 68 69 6c 64 20 29 7b     if( iChild ){
33780 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28  .      put4byte(
33790 70 43 65 6c 6c 2c 20 69 43 68 69 6c 64 29 3b 0a  pCell, iChild);.
337a0 20 20 20 20 7d 0a 20 20 20 20 6a 20 3d 20 70 50      }.    j = pP
337b0 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2b 2b  age->nOverflow++
337c0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c  ;.    assert( j<
337d0 28 69 6e 74 29 28 73 69 7a 65 6f 66 28 70 50 61  (int)(sizeof(pPa
337e0 67 65 2d 3e 61 70 4f 76 66 6c 29 2f 73 69 7a 65  ge->apOvfl)/size
337f0 6f 66 28 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c  of(pPage->apOvfl
33800 5b 30 5d 29 29 20 29 3b 0a 20 20 20 20 70 50 61  [0])) );.    pPa
33810 67 65 2d 3e 61 70 4f 76 66 6c 5b 6a 5d 20 3d 20  ge->apOvfl[j] = 
33820 70 43 65 6c 6c 3b 0a 20 20 20 20 70 50 61 67 65  pCell;.    pPage
33830 2d 3e 61 69 4f 76 66 6c 5b 6a 5d 20 3d 20 28 75  ->aiOvfl[j] = (u
33840 31 36 29 69 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  16)i;.  }else{. 
33850 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69     int rc = sqli
33860 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
33870 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  age->pDbPage);. 
33880 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
33890 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2a 70  E_OK ){.      *p
338a0 52 43 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 72  RC = rc;.      r
338b0 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20  eturn;.    }.   
338c0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
338d0 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
338e0 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
338f0 20 29 3b 0a 20 20 20 20 64 61 74 61 20 3d 20 70   );.    data = p
33900 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 20  Page->aData;.   
33910 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 70 50   cellOffset = pP
33920 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 3b  age->cellOffset;
33930 0a 20 20 20 20 65 6e 64 20 3d 20 63 65 6c 6c 4f  .    end = cellO
33940 66 66 73 65 74 20 2b 20 32 2a 70 50 61 67 65 2d  ffset + 2*pPage-
33950 3e 6e 43 65 6c 6c 3b 0a 20 20 20 20 69 6e 73 20  >nCell;.    ins 
33960 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32  = cellOffset + 2
33970 2a 69 3b 0a 20 20 20 20 72 63 20 3d 20 61 6c 6c  *i;.    rc = all
33980 6f 63 61 74 65 53 70 61 63 65 28 70 50 61 67 65  ocateSpace(pPage
33990 2c 20 73 7a 2c 20 26 69 64 78 29 3b 0a 20 20 20  , sz, &idx);.   
339a0 20 69 66 28 20 72 63 20 29 7b 20 2a 70 52 43 20   if( rc ){ *pRC 
339b0 3d 20 72 63 3b 20 72 65 74 75 72 6e 3b 20 7d 0a  = rc; return; }.
339c0 20 20 20 20 2f 2a 20 54 68 65 20 61 6c 6c 6f 63      /* The alloc
339d0 61 74 65 53 70 61 63 65 28 29 20 72 6f 75 74 69  ateSpace() routi
339e0 6e 65 20 67 75 61 72 61 6e 74 65 65 73 20 74 68  ne guarantees th
339f0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 77 6f 20  e following two 
33a00 70 72 6f 70 65 72 74 69 65 73 0a 20 20 20 20 2a  properties.    *
33a10 2a 20 69 66 20 69 74 20 72 65 74 75 72 6e 73 20  * if it returns 
33a20 73 75 63 63 65 73 73 20 2a 2f 0a 20 20 20 20 61  success */.    a
33a30 73 73 65 72 74 28 20 69 64 78 20 3e 3d 20 65 6e  ssert( idx >= en
33a40 64 2b 32 20 29 3b 0a 20 20 20 20 61 73 73 65 72  d+2 );.    asser
33a50 74 28 20 69 64 78 2b 73 7a 20 3c 3d 20 28 69 6e  t( idx+sz <= (in
33a60 74 29 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  t)pPage->pBt->us
33a70 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20  ableSize );.    
33a80 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b 2b 3b 0a  pPage->nCell++;.
33a90 20 20 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65      pPage->nFree
33aa0 20 2d 3d 20 28 75 31 36 29 28 32 20 2b 20 73 7a   -= (u16)(2 + sz
33ab0 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 64  );.    memcpy(&d
33ac0 61 74 61 5b 69 64 78 5d 2c 20 70 43 65 6c 6c 2c  ata[idx], pCell,
33ad0 20 73 7a 29 3b 0a 20 20 20 20 69 66 28 20 69 43   sz);.    if( iC
33ae0 68 69 6c 64 20 29 7b 0a 20 20 20 20 20 20 70 75  hild ){.      pu
33af0 74 34 62 79 74 65 28 26 64 61 74 61 5b 69 64 78  t4byte(&data[idx
33b00 5d 2c 20 69 43 68 69 6c 64 29 3b 0a 20 20 20 20  ], iChild);.    
33b10 7d 0a 20 20 20 20 6d 65 6d 6d 6f 76 65 28 26 64  }.    memmove(&d
33b20 61 74 61 5b 69 6e 73 2b 32 5d 2c 20 26 64 61 74  ata[ins+2], &dat
33b30 61 5b 69 6e 73 5d 2c 20 65 6e 64 2d 69 6e 73 29  a[ins], end-ins)
33b40 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 26  ;.    put2byte(&
33b50 64 61 74 61 5b 69 6e 73 5d 2c 20 69 64 78 29 3b  data[ins], idx);
33b60 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64  .    put2byte(&d
33b70 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66  ata[pPage->hdrOf
33b80 66 73 65 74 2b 33 5d 2c 20 70 50 61 67 65 2d 3e  fset+3], pPage->
33b90 6e 43 65 6c 6c 29 3b 0a 23 69 66 6e 64 65 66 20  nCell);.#ifndef 
33ba0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
33bb0 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70  VACUUM.    if( p
33bc0 50 61 67 65 2d 3e 70 42 74 2d 3e 61 75 74 6f 56  Page->pBt->autoV
33bd0 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 2f  acuum ){.      /
33be0 2a 20 54 68 65 20 63 65 6c 6c 20 6d 61 79 20 63  * The cell may c
33bf0 6f 6e 74 61 69 6e 20 61 20 70 6f 69 6e 74 65 72  ontain a pointer
33c00 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20   to an overflow 
33c10 70 61 67 65 2e 20 49 66 20 73 6f 2c 20 77 72 69  page. If so, wri
33c20 74 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  te.      ** the 
33c30 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 6f 76  entry for the ov
33c40 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 74 6f  erflow page into
33c50 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   the pointer map
33c60 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
33c70 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74   ptrmapPutOvflPt
33c80 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20  r(pPage, pCell, 
33c90 70 52 43 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  pRC);.    }.#end
33ca0 69 66 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  if.  }.}../*.** 
33cb0 41 72 72 61 79 20 61 70 43 65 6c 6c 5b 5d 20 63  Array apCell[] c
33cc0 6f 6e 74 61 69 6e 73 20 70 6f 69 6e 74 65 72 73  ontains pointers
33cd0 20 74 6f 20 6e 43 65 6c 6c 20 62 2d 74 72 65 65   to nCell b-tree
33ce0 20 70 61 67 65 20 63 65 6c 6c 73 2e 20 54 68 65   page cells. The
33cf0 20 0a 2a 2a 20 73 7a 43 65 6c 6c 5b 5d 20 61 72   .** szCell[] ar
33d00 72 61 79 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  ray contains the
33d10 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73 20 6f   size in bytes o
33d20 66 20 65 61 63 68 20 63 65 6c 6c 2e 20 54 68 69  f each cell. Thi
33d30 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 72 65  s function.** re
33d40 70 6c 61 63 65 73 20 74 68 65 20 63 75 72 72 65  places the curre
33d50 6e 74 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 70  nt contents of p
33d60 61 67 65 20 70 50 67 20 77 69 74 68 20 74 68 65  age pPg with the
33d70 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
33d80 20 63 65 6c 6c 0a 2a 2a 20 61 72 72 61 79 2e 0a   cell.** array..
33d90 2a 2a 0a 2a 2a 20 53 6f 6d 65 20 6f 66 20 74 68  **.** Some of th
33da0 65 20 63 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c  e cells in apCel
33db0 6c 5b 5d 20 6d 61 79 20 63 75 72 72 65 6e 74 6c  l[] may currentl
33dc0 79 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20 70  y be stored in p
33dd0 50 67 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63  Pg. This.** func
33de0 74 69 6f 6e 20 77 6f 72 6b 73 20 61 72 6f 75 6e  tion works aroun
33df0 64 20 70 72 6f 62 6c 65 6d 73 20 63 61 75 73 65  d problems cause
33e00 64 20 62 79 20 74 68 69 73 20 62 79 20 6d 61 6b  d by this by mak
33e10 69 6e 67 20 61 20 63 6f 70 79 20 6f 66 20 61 6e  ing a copy of an
33e20 79 20 0a 2a 2a 20 73 75 63 68 20 63 65 6c 6c 73  y .** such cells
33e30 20 62 65 66 6f 72 65 20 6f 76 65 72 77 72 69 74   before overwrit
33e40 69 6e 67 20 74 68 65 20 70 61 67 65 20 64 61 74  ing the page dat
33e50 61 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 4d 65 6d  a..**.** The Mem
33e60 50 61 67 65 2e 6e 46 72 65 65 20 66 69 65 6c 64  Page.nFree field
33e70 20 69 73 20 69 6e 76 61 6c 69 64 61 74 65 64 20   is invalidated 
33e80 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
33e90 2e 20 49 74 20 69 73 20 74 68 65 20 0a 2a 2a 20  . It is the .** 
33ea0 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f  responsibility o
33eb0 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20  f the caller to 
33ec0 73 65 74 20 69 74 20 63 6f 72 72 65 63 74 6c 79  set it correctly
33ed0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
33ee0 20 72 65 62 75 69 6c 64 50 61 67 65 28 0a 20 20   rebuildPage(.  
33ef0 4d 65 6d 50 61 67 65 20 2a 70 50 67 2c 20 20 20  MemPage *pPg,   
33f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33f10 2f 2a 20 45 64 69 74 20 74 68 69 73 20 70 61 67  /* Edit this pag
33f20 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c  e */.  int nCell
33f30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
33f40 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 61 6c 20         /* Final 
33f50 6e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20  number of cells 
33f60 6f 6e 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20  on page */.  u8 
33f70 2a 2a 61 70 43 65 6c 6c 2c 20 20 20 20 20 20 20  **apCell,       
33f80 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
33f90 41 72 72 61 79 20 6f 66 20 63 65 6c 6c 73 20 2a  Array of cells *
33fa0 2f 0a 20 20 75 31 36 20 2a 73 7a 43 65 6c 6c 20  /.  u16 *szCell 
33fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33fc0 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20      /* Array of 
33fd0 63 65 6c 6c 20 73 69 7a 65 73 20 2a 2f 0a 29 7b  cell sizes */.){
33fe0 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 68 64 72  .  const int hdr
33ff0 20 3d 20 70 50 67 2d 3e 68 64 72 4f 66 66 73 65   = pPg->hdrOffse
34000 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f  t;          /* O
34010 66 66 73 65 74 20 6f 66 20 68 65 61 64 65 72 20  ffset of header 
34020 6f 6e 20 70 50 67 20 2a 2f 0a 20 20 75 38 20 2a  on pPg */.  u8 *
34030 20 63 6f 6e 73 74 20 61 44 61 74 61 20 3d 20 70   const aData = p
34040 50 67 2d 3e 61 44 61 74 61 3b 20 20 20 20 20 20  Pg->aData;      
34050 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
34060 74 6f 20 64 61 74 61 20 66 6f 72 20 70 50 67 20  to data for pPg 
34070 2a 2f 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 75  */.  const int u
34080 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 50 67 2d  sableSize = pPg-
34090 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
340a0 3b 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 70  ;.  u8 * const p
340b0 45 6e 64 20 3d 20 26 61 44 61 74 61 5b 75 73 61  End = &aData[usa
340c0 62 6c 65 53 69 7a 65 5d 3b 0a 20 20 69 6e 74 20  bleSize];.  int 
340d0 69 3b 0a 20 20 75 38 20 2a 70 43 65 6c 6c 70 74  i;.  u8 *pCellpt
340e0 72 20 3d 20 70 50 67 2d 3e 61 43 65 6c 6c 49 64  r = pPg->aCellId
340f0 78 3b 0a 20 20 75 38 20 2a 70 54 6d 70 20 3d 20  x;.  u8 *pTmp = 
34100 73 71 6c 69 74 65 33 50 61 67 65 72 54 65 6d 70  sqlite3PagerTemp
34110 53 70 61 63 65 28 70 50 67 2d 3e 70 42 74 2d 3e  Space(pPg->pBt->
34120 70 50 61 67 65 72 29 3b 0a 20 20 75 38 20 2a 70  pPager);.  u8 *p
34130 44 61 74 61 3b 0a 0a 20 20 69 20 3d 20 67 65 74  Data;..  i = get
34140 32 62 79 74 65 28 26 61 44 61 74 61 5b 68 64 72  2byte(&aData[hdr
34150 2b 35 5d 29 3b 0a 20 20 6d 65 6d 63 70 79 28 26  +5]);.  memcpy(&
34160 70 54 6d 70 5b 69 5d 2c 20 26 61 44 61 74 61 5b  pTmp[i], &aData[
34170 69 5d 2c 20 75 73 61 62 6c 65 53 69 7a 65 20 2d  i], usableSize -
34180 20 69 29 3b 0a 0a 20 20 70 44 61 74 61 20 3d 20   i);..  pData = 
34190 70 45 6e 64 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  pEnd;.  for(i=0;
341a0 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a   i<nCell; i++){.
341b0 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20      u8 *pCell = 
341c0 61 70 43 65 6c 6c 5b 69 5d 3b 0a 20 20 20 20 69  apCell[i];.    i
341d0 66 28 20 70 43 65 6c 6c 3e 61 44 61 74 61 20 26  f( pCell>aData &
341e0 26 20 70 43 65 6c 6c 3c 70 45 6e 64 20 29 7b 0a  & pCell<pEnd ){.
341f0 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 26 70        pCell = &p
34200 54 6d 70 5b 70 43 65 6c 6c 20 2d 20 61 44 61 74  Tmp[pCell - aDat
34210 61 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 44  a];.    }.    pD
34220 61 74 61 20 2d 3d 20 73 7a 43 65 6c 6c 5b 69 5d  ata -= szCell[i]
34230 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 44 61  ;.    memcpy(pDa
34240 74 61 2c 20 70 43 65 6c 6c 2c 20 73 7a 43 65 6c  ta, pCell, szCel
34250 6c 5b 69 5d 29 3b 0a 20 20 20 20 70 75 74 32 62  l[i]);.    put2b
34260 79 74 65 28 70 43 65 6c 6c 70 74 72 2c 20 28 70  yte(pCellptr, (p
34270 44 61 74 61 20 2d 20 61 44 61 74 61 29 29 3b 0a  Data - aData));.
34280 20 20 20 20 70 43 65 6c 6c 70 74 72 20 2b 3d 20      pCellptr += 
34290 32 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  2;.    assert( s
342a0 7a 43 65 6c 6c 5b 69 5d 3d 3d 63 65 6c 6c 53 69  zCell[i]==cellSi
342b0 7a 65 50 74 72 28 70 50 67 2c 20 70 43 65 6c 6c  zePtr(pPg, pCell
342c0 29 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54  ) );.  }..  /* T
342d0 68 65 20 70 50 67 2d 3e 6e 46 72 65 65 20 66 69  he pPg->nFree fi
342e0 65 6c 64 20 69 73 20 6e 6f 77 20 73 65 74 20 69  eld is now set i
342f0 6e 63 6f 72 72 65 63 74 6c 79 2e 20 54 68 65 20  ncorrectly. The 
34300 63 61 6c 6c 65 72 20 77 69 6c 6c 20 66 69 78 20  caller will fix 
34310 69 74 2e 20 2a 2f 0a 20 20 70 50 67 2d 3e 6e 43  it. */.  pPg->nC
34320 65 6c 6c 20 3d 20 6e 43 65 6c 6c 3b 0a 20 20 70  ell = nCell;.  p
34330 50 67 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20  Pg->nOverflow = 
34340 30 3b 0a 0a 20 20 70 75 74 32 62 79 74 65 28 26  0;..  put2byte(&
34350 61 44 61 74 61 5b 68 64 72 2b 31 5d 2c 20 30 29  aData[hdr+1], 0)
34360 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 61 44  ;.  put2byte(&aD
34370 61 74 61 5b 68 64 72 2b 33 5d 2c 20 70 50 67 2d  ata[hdr+3], pPg-
34380 3e 6e 43 65 6c 6c 29 3b 0a 20 20 70 75 74 32 62  >nCell);.  put2b
34390 79 74 65 28 26 61 44 61 74 61 5b 68 64 72 2b 35  yte(&aData[hdr+5
343a0 5d 2c 20 70 44 61 74 61 20 2d 20 61 44 61 74 61  ], pData - aData
343b0 29 3b 0a 20 20 61 44 61 74 61 5b 68 64 72 2b 37  );.  aData[hdr+7
343c0 5d 20 3d 20 30 78 30 30 3b 0a 7d 0a 0a 2f 2a 0a  ] = 0x00;.}../*.
343d0 2a 2a 20 41 72 72 61 79 20 61 70 43 65 6c 6c 5b  ** Array apCell[
343e0 5d 20 63 6f 6e 74 61 69 6e 73 20 6e 43 65 6c 6c  ] contains nCell
343f0 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 62 2d 74   pointers to b-t
34400 72 65 65 20 63 65 6c 6c 73 2e 20 41 72 72 61 79  ree cells. Array
34410 20 73 7a 43 65 6c 6c 0a 2a 2a 20 63 6f 6e 74 61   szCell.** conta
34420 69 6e 73 20 74 68 65 20 73 69 7a 65 20 69 6e 20  ins the size in 
34430 62 79 74 65 73 20 6f 66 20 65 61 63 68 20 73 75  bytes of each su
34440 63 68 20 63 65 6c 6c 2e 20 54 68 69 73 20 66 75  ch cell. This fu
34450 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20  nction attempts 
34460 74 6f 20 0a 2a 2a 20 61 64 64 20 74 68 65 20 63  to .** add the c
34470 65 6c 6c 73 20 73 74 6f 72 65 64 20 69 6e 20 74  ells stored in t
34480 68 65 20 61 72 72 61 79 20 74 6f 20 70 61 67 65  he array to page
34490 20 70 50 67 2e 20 49 66 20 69 74 20 63 61 6e 6e   pPg. If it cann
344a0 6f 74 20 28 62 65 63 61 75 73 65 20 0a 2a 2a 20  ot (because .** 
344b0 74 68 65 20 70 61 67 65 20 6e 65 65 64 73 20 74  the page needs t
344c0 6f 20 62 65 20 64 65 66 72 61 67 6d 65 6e 74 65  o be defragmente
344d0 64 20 62 65 66 6f 72 65 20 74 68 65 20 63 65 6c  d before the cel
344e0 6c 73 20 77 69 6c 6c 20 66 69 74 29 2c 20 6e 6f  ls will fit), no
344f0 6e 2d 7a 65 72 6f 0a 2a 2a 20 69 73 20 72 65 74  n-zero.** is ret
34500 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65  urned. Otherwise
34510 2c 20 69 66 20 74 68 65 20 63 65 6c 6c 73 20 61  , if the cells a
34520 72 65 20 61 64 64 65 64 20 73 75 63 63 65 73 73  re added success
34530 66 75 6c 6c 79 2c 20 7a 65 72 6f 20 69 73 0a 2a  fully, zero is.*
34540 2a 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a  * returned..**.*
34550 2a 20 41 72 67 75 6d 65 6e 74 20 70 43 65 6c 6c  * Argument pCell
34560 70 74 72 20 70 6f 69 6e 74 73 20 74 6f 20 74 68  ptr points to th
34570 65 20 66 69 72 73 74 20 65 6e 74 72 79 20 69 6e  e first entry in
34580 20 74 68 65 20 63 65 6c 6c 2d 70 6f 69 6e 74 65   the cell-pointe
34590 72 20 61 72 72 61 79 0a 2a 2a 20 28 70 61 72 74  r array.** (part
345a0 20 6f 66 20 70 61 67 65 20 70 50 67 29 20 74 6f   of page pPg) to
345b0 20 70 6f 70 75 6c 61 74 65 2e 20 41 66 74 65 72   populate. After
345c0 20 63 65 6c 6c 20 61 70 43 65 6c 6c 5b 30 5d 20   cell apCell[0] 
345d0 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  is written to th
345e0 65 0a 2a 2a 20 70 61 67 65 20 62 6f 64 79 2c 20  e.** page body, 
345f0 61 20 31 36 2d 62 69 74 20 6f 66 66 73 65 74 20  a 16-bit offset 
34600 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 70 43  is written to pC
34610 65 6c 6c 70 74 72 2e 20 41 6e 64 20 73 6f 20 6f  ellptr. And so o
34620 6e 2c 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20 63  n, for each.** c
34630 65 6c 6c 20 69 6e 20 74 68 65 20 61 72 72 61 79  ell in the array
34640 2e 20 49 74 20 69 73 20 74 68 65 20 72 65 73 70  . It is the resp
34650 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68  onsibility of th
34660 65 20 63 61 6c 6c 65 72 20 74 6f 20 65 6e 73 75  e caller to ensu
34670 72 65 0a 2a 2a 20 74 68 61 74 20 69 74 20 69 73  re.** that it is
34680 20 73 61 66 65 20 74 6f 20 6f 76 65 72 77 72 69   safe to overwri
34690 74 65 20 74 68 69 73 20 70 61 72 74 20 6f 66 20  te this part of 
346a0 74 68 65 20 63 65 6c 6c 2d 70 6f 69 6e 74 65 72  the cell-pointer
346b0 20 61 72 72 61 79 2e 0a 2a 2a 0a 2a 2a 20 57 68   array..**.** Wh
346c0 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
346d0 20 69 73 20 63 61 6c 6c 65 64 2c 20 2a 70 70 44   is called, *ppD
346e0 61 74 61 20 70 6f 69 6e 74 73 20 74 6f 20 74 68  ata points to th
346f0 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 0a  e start of the .
34700 2a 2a 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20  ** content area 
34710 6f 6e 20 70 61 67 65 20 70 50 67 2e 20 49 66 20  on page pPg. If 
34720 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
34730 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 69 73 20  content area is 
34740 65 78 74 65 6e 64 65 64 2c 0a 2a 2a 20 2a 70 70  extended,.** *pp
34750 44 61 74 61 20 69 73 20 75 70 64 61 74 65 64 20  Data is updated 
34760 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  to point to the 
34770 6e 65 77 20 73 74 61 72 74 20 6f 66 20 74 68 65  new start of the
34780 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 0a 2a 2a   content area.**
34790 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
347a0 67 2e 0a 2a 2a 0a 2a 2a 20 46 69 6e 61 6c 6c 79  g..**.** Finally
347b0 2c 20 61 72 67 75 6d 65 6e 74 20 70 42 65 67 69  , argument pBegi
347c0 6e 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  n points to the 
347d0 62 79 74 65 20 69 6d 6d 65 64 69 61 74 65 6c 79  byte immediately
347e0 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 0a 2a   following the.*
347f0 2a 20 65 6e 64 20 6f 66 20 74 68 65 20 73 70 61  * end of the spa
34800 63 65 20 72 65 71 75 69 72 65 64 20 62 79 20 74  ce required by t
34810 68 69 73 20 70 61 67 65 20 66 6f 72 20 74 68 65  his page for the
34820 20 63 65 6c 6c 2d 70 6f 69 6e 74 65 72 20 61 72   cell-pointer ar
34830 65 61 20 28 66 6f 72 0a 2a 2a 20 61 6c 6c 20 63  ea (for.** all c
34840 65 6c 6c 73 20 2d 20 6e 6f 74 20 6a 75 73 74 20  ells - not just 
34850 74 68 6f 73 65 20 69 6e 73 65 72 74 65 64 20 62  those inserted b
34860 79 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 61  y the current ca
34870 6c 6c 29 2e 20 49 66 20 74 68 65 20 63 6f 6e 74  ll). If the cont
34880 65 6e 74 0a 2a 2a 20 61 72 65 61 20 6d 75 73 74  ent.** area must
34890 20 62 65 20 65 78 74 65 6e 64 65 64 20 74 6f 20   be extended to 
348a0 62 65 66 6f 72 65 20 74 68 69 73 20 70 6f 69 6e  before this poin
348b0 74 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 61 63  t in order to ac
348c0 63 6f 6d 6f 64 61 74 65 20 61 6c 6c 0a 2a 2a 20  comodate all.** 
348d0 63 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b  cells in apCell[
348e0 5d 2c 20 74 68 65 6e 20 74 68 65 20 63 65 6c 6c  ], then the cell
348f0 73 20 64 6f 20 6e 6f 74 20 66 69 74 20 61 6e 64  s do not fit and
34900 20 6e 6f 6e 2d 7a 65 72 6f 20 69 73 20 72 65 74   non-zero is ret
34910 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
34920 20 69 6e 74 20 70 61 67 65 49 6e 73 65 72 74 41   int pageInsertA
34930 72 72 61 79 28 0a 20 20 4d 65 6d 50 61 67 65 20  rray(.  MemPage 
34940 2a 70 50 67 2c 20 20 20 20 20 20 20 20 20 20 20  *pPg,           
34950 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
34960 74 6f 20 61 64 64 20 63 65 6c 6c 73 20 74 6f 20  to add cells to 
34970 2a 2f 0a 20 20 75 38 20 2a 70 42 65 67 69 6e 2c  */.  u8 *pBegin,
34980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34990 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 63       /* End of c
349a0 65 6c 6c 2d 70 6f 69 6e 74 65 72 20 61 72 72 61  ell-pointer arra
349b0 79 20 2a 2f 0a 20 20 75 38 20 2a 2a 70 70 44 61  y */.  u8 **ppDa
349c0 74 61 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ta,             
349d0 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54         /* IN/OUT
349e0 3a 20 50 61 67 65 20 63 6f 6e 74 65 6e 74 20 2d  : Page content -
349f0 61 72 65 61 20 70 6f 69 6e 74 65 72 20 2a 2f 0a  area pointer */.
34a00 20 20 75 38 20 2a 70 43 65 6c 6c 70 74 72 2c 20    u8 *pCellptr, 
34a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34a20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
34a30 63 65 6c 6c 2d 70 6f 69 6e 74 65 72 20 61 72 65  cell-pointer are
34a40 61 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c  a */.  int nCell
34a50 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
34a60 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
34a70 20 6f 66 20 63 65 6c 6c 73 20 74 6f 20 61 64 64   of cells to add
34a80 20 74 6f 20 70 50 67 20 2a 2f 0a 20 20 75 38 20   to pPg */.  u8 
34a90 2a 2a 61 70 43 65 6c 6c 2c 20 20 20 20 20 20 20  **apCell,       
34aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
34ab0 41 72 72 61 79 20 6f 66 20 63 65 6c 6c 73 20 2a  Array of cells *
34ac0 2f 0a 20 20 75 31 36 20 2a 73 7a 43 65 6c 6c 20  /.  u16 *szCell 
34ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34ae0 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20      /* Array of 
34af0 63 65 6c 6c 20 73 69 7a 65 73 20 2a 2f 0a 29 7b  cell sizes */.){
34b00 0a 20 20 69 6e 74 20 69 3b 0a 20 20 75 38 20 2a  .  int i;.  u8 *
34b10 61 44 61 74 61 20 3d 20 70 50 67 2d 3e 61 44 61  aData = pPg->aDa
34b20 74 61 3b 0a 20 20 75 38 20 2a 70 44 61 74 61 20  ta;.  u8 *pData 
34b30 3d 20 2a 70 70 44 61 74 61 3b 0a 20 20 63 6f 6e  = *ppData;.  con
34b40 73 74 20 69 6e 74 20 62 46 72 65 65 6c 69 73 74  st int bFreelist
34b50 20 3d 20 61 44 61 74 61 5b 31 5d 20 7c 7c 20 61   = aData[1] || a
34b60 44 61 74 61 5b 32 5d 3b 0a 20 20 61 73 73 65 72  Data[2];.  asser
34b70 74 28 20 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c  t( CORRUPT_DB ||
34b80 20 70 50 67 2d 3e 68 64 72 4f 66 66 73 65 74 3d   pPg->hdrOffset=
34b90 3d 30 20 29 3b 20 20 20 20 2f 2a 20 4e 65 76 65  =0 );    /* Neve
34ba0 72 20 63 61 6c 6c 65 64 20 6f 6e 20 70 61 67 65  r called on page
34bb0 20 31 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b   1 */.  for(i=0;
34bc0 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a   i<nCell; i++){.
34bd0 20 20 20 20 69 6e 74 20 73 7a 20 3d 20 73 7a 43      int sz = szC
34be0 65 6c 6c 5b 69 5d 3b 0a 20 20 20 20 69 6e 74 20  ell[i];.    int 
34bf0 72 63 3b 0a 20 20 20 20 75 38 20 2a 70 53 6c 6f  rc;.    u8 *pSlo
34c00 74 3b 0a 20 20 20 20 69 66 28 20 62 46 72 65 65  t;.    if( bFree
34c10 6c 69 73 74 3d 3d 30 20 7c 7c 20 28 70 53 6c 6f  list==0 || (pSlo
34c20 74 20 3d 20 70 61 67 65 46 69 6e 64 53 6c 6f 74  t = pageFindSlot
34c30 28 70 50 67 2c 20 73 7a 2c 20 26 72 63 2c 20 30  (pPg, sz, &rc, 0
34c40 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  ))==0 ){.      p
34c50 44 61 74 61 20 2d 3d 20 73 7a 3b 0a 20 20 20 20  Data -= sz;.    
34c60 20 20 69 66 28 20 70 44 61 74 61 3c 70 42 65 67    if( pData<pBeg
34c70 69 6e 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  in ) return 1;. 
34c80 20 20 20 20 20 70 53 6c 6f 74 20 3d 20 70 44 61       pSlot = pDa
34c90 74 61 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65  ta;.    }.    me
34ca0 6d 63 70 79 28 70 53 6c 6f 74 2c 20 61 70 43 65  mcpy(pSlot, apCe
34cb0 6c 6c 5b 69 5d 2c 20 73 7a 29 3b 0a 20 20 20 20  ll[i], sz);.    
34cc0 70 75 74 32 62 79 74 65 28 70 43 65 6c 6c 70 74  put2byte(pCellpt
34cd0 72 2c 20 28 70 53 6c 6f 74 20 2d 20 61 44 61 74  r, (pSlot - aDat
34ce0 61 29 29 3b 0a 20 20 20 20 70 43 65 6c 6c 70 74  a));.    pCellpt
34cf0 72 20 2b 3d 20 32 3b 0a 20 20 7d 0a 20 20 2a 70  r += 2;.  }.  *p
34d00 70 44 61 74 61 20 3d 20 70 44 61 74 61 3b 0a 20  pData = pData;. 
34d10 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
34d20 0a 2a 2a 20 41 72 72 61 79 20 61 70 43 65 6c 6c  .** Array apCell
34d30 5b 5d 20 63 6f 6e 74 61 69 6e 73 20 6e 43 65 6c  [] contains nCel
34d40 6c 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 62 2d  l pointers to b-
34d50 74 72 65 65 20 63 65 6c 6c 73 2e 20 41 72 72 61  tree cells. Arra
34d60 79 20 73 7a 43 65 6c 6c 20 0a 2a 2a 20 63 6f 6e  y szCell .** con
34d70 74 61 69 6e 73 20 74 68 65 20 73 69 7a 65 20 69  tains the size i
34d80 6e 20 62 79 74 65 73 20 6f 66 20 65 61 63 68 20  n bytes of each 
34d90 73 75 63 68 20 63 65 6c 6c 2e 20 54 68 69 73 20  such cell. This 
34da0 66 75 6e 63 74 69 6f 6e 20 61 64 64 73 20 74 68  function adds th
34db0 65 0a 2a 2a 20 73 70 61 63 65 20 61 73 73 6f 63  e.** space assoc
34dc0 69 61 74 65 64 20 77 69 74 68 20 65 61 63 68 20  iated with each 
34dd0 63 65 6c 6c 20 69 6e 20 74 68 65 20 61 72 72 61  cell in the arra
34de0 79 20 74 68 61 74 20 69 73 20 63 75 72 72 65 6e  y that is curren
34df0 74 6c 79 20 73 74 6f 72 65 64 20 0a 2a 2a 20 77  tly stored .** w
34e00 69 74 68 69 6e 20 74 68 65 20 62 6f 64 79 20 6f  ithin the body o
34e10 66 20 70 50 67 20 74 6f 20 74 68 65 20 70 50 67  f pPg to the pPg
34e20 20 66 72 65 65 2d 6c 69 73 74 2e 20 54 68 65 20   free-list. The 
34e30 63 65 6c 6c 2d 70 6f 69 6e 74 65 72 73 20 61 6e  cell-pointers an
34e40 64 20 6f 74 68 65 72 0a 2a 2a 20 66 69 65 6c 64  d other.** field
34e50 73 20 6f 66 20 74 68 65 20 70 61 67 65 20 61 72  s of the page ar
34e60 65 20 6e 6f 74 20 75 70 64 61 74 65 64 2e 0a 2a  e not updated..*
34e70 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
34e80 6f 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20 74  on returns the t
34e90 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 63  otal number of c
34ea0 65 6c 6c 73 20 61 64 64 65 64 20 74 6f 20 74 68  ells added to th
34eb0 65 20 66 72 65 65 2d 6c 69 73 74 2e 0a 2a 2f 0a  e free-list..*/.
34ec0 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 46  static int pageF
34ed0 72 65 65 41 72 72 61 79 28 0a 20 20 4d 65 6d 50  reeArray(.  MemP
34ee0 61 67 65 20 2a 70 50 67 2c 20 20 20 20 20 20 20  age *pPg,       
34ef0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
34f00 61 67 65 20 74 6f 20 65 64 69 74 20 2a 2f 0a 20  age to edit */. 
34f10 20 69 6e 74 20 6e 43 65 6c 6c 2c 20 20 20 20 20   int nCell,     
34f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34f30 20 2f 2a 20 43 65 6c 6c 73 20 74 6f 20 64 65 6c   /* Cells to del
34f40 65 74 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70  ete */.  u8 **ap
34f50 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20  Cell,           
34f60 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61           /* Arra
34f70 79 20 6f 66 20 63 65 6c 6c 73 20 2a 2f 0a 20 20  y of cells */.  
34f80 75 31 36 20 2a 73 7a 43 65 6c 6c 20 20 20 20 20  u16 *szCell     
34f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34fa0 2f 2a 20 41 72 72 61 79 20 6f 66 20 63 65 6c 6c  /* Array of cell
34fb0 20 73 69 7a 65 73 20 2a 2f 0a 29 7b 0a 20 20 75   sizes */.){.  u
34fc0 38 20 2a 20 63 6f 6e 73 74 20 61 44 61 74 61 20  8 * const aData 
34fd0 3d 20 70 50 67 2d 3e 61 44 61 74 61 3b 0a 20 20  = pPg->aData;.  
34fe0 75 38 20 2a 20 63 6f 6e 73 74 20 70 45 6e 64 20  u8 * const pEnd 
34ff0 3d 20 26 61 44 61 74 61 5b 70 50 67 2d 3e 70 42  = &aData[pPg->pB
35000 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 5d 3b 0a  t->usableSize];.
35010 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 70 53 74    u8 * const pSt
35020 61 72 74 20 3d 20 26 61 44 61 74 61 5b 70 50 67  art = &aData[pPg
35030 2d 3e 68 64 72 4f 66 66 73 65 74 20 2b 20 38 20  ->hdrOffset + 8 
35040 2b 20 70 50 67 2d 3e 63 68 69 6c 64 50 74 72 53  + pPg->childPtrS
35050 69 7a 65 5d 3b 0a 20 20 69 6e 74 20 6e 52 65 74  ize];.  int nRet
35060 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20   = 0;.  int i;. 
35070 20 75 38 20 2a 70 46 72 65 65 20 3d 20 30 3b 0a   u8 *pFree = 0;.
35080 20 20 69 6e 74 20 73 7a 46 72 65 65 20 3d 20 30    int szFree = 0
35090 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  ;..  for(i=0; i<
350a0 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  nCell; i++){.   
350b0 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20 61 70 43   u8 *pCell = apC
350c0 65 6c 6c 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20  ell[i];.    if( 
350d0 70 43 65 6c 6c 3e 3d 70 53 74 61 72 74 20 26 26  pCell>=pStart &&
350e0 20 70 43 65 6c 6c 3c 70 45 6e 64 20 29 7b 0a 20   pCell<pEnd ){. 
350f0 20 20 20 20 20 69 6e 74 20 73 7a 20 3d 20 73 7a       int sz = sz
35100 43 65 6c 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 69  Cell[i];.      i
35110 66 28 20 70 46 72 65 65 21 3d 28 70 43 65 6c 6c  f( pFree!=(pCell
35120 20 2b 20 73 7a 29 20 29 7b 0a 20 20 20 20 20 20   + sz) ){.      
35130 20 20 69 66 28 20 70 46 72 65 65 20 29 7b 0a 20    if( pFree ){. 
35140 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
35150 20 70 46 72 65 65 3e 61 44 61 74 61 20 26 26 20   pFree>aData && 
35160 28 70 46 72 65 65 20 2d 20 61 44 61 74 61 29 3c  (pFree - aData)<
35170 36 35 35 33 36 20 29 3b 0a 20 20 20 20 20 20 20  65536 );.       
35180 20 20 20 66 72 65 65 53 70 61 63 65 28 70 50 67     freeSpace(pPg
35190 2c 20 28 75 31 36 29 28 70 46 72 65 65 20 2d 20  , (u16)(pFree - 
351a0 61 44 61 74 61 29 2c 20 73 7a 46 72 65 65 29 3b  aData), szFree);
351b0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
351c0 20 20 20 70 46 72 65 65 20 3d 20 70 43 65 6c 6c     pFree = pCell
351d0 3b 0a 20 20 20 20 20 20 20 20 73 7a 46 72 65 65  ;.        szFree
351e0 20 3d 20 73 7a 3b 0a 20 20 20 20 20 20 20 20 69   = sz;.        i
351f0 66 28 20 70 46 72 65 65 2b 73 7a 3e 70 45 6e 64  f( pFree+sz>pEnd
35200 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
35210 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
35220 20 20 70 46 72 65 65 20 3d 20 70 43 65 6c 6c 3b    pFree = pCell;
35230 0a 20 20 20 20 20 20 20 20 73 7a 46 72 65 65 20  .        szFree 
35240 2b 3d 20 73 7a 3b 0a 20 20 20 20 20 20 7d 0a 20  += sz;.      }. 
35250 20 20 20 20 20 6e 52 65 74 2b 2b 3b 0a 20 20 20       nRet++;.   
35260 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 46 72   }.  }.  if( pFr
35270 65 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ee ){.    assert
35280 28 20 70 46 72 65 65 3e 61 44 61 74 61 20 26 26  ( pFree>aData &&
35290 20 28 70 46 72 65 65 20 2d 20 61 44 61 74 61 29   (pFree - aData)
352a0 3c 36 35 35 33 36 20 29 3b 0a 20 20 20 20 66 72  <65536 );.    fr
352b0 65 65 53 70 61 63 65 28 70 50 67 2c 20 28 75 31  eeSpace(pPg, (u1
352c0 36 29 28 70 46 72 65 65 20 2d 20 61 44 61 74 61  6)(pFree - aData
352d0 29 2c 20 73 7a 46 72 65 65 29 3b 0a 20 20 7d 0a  ), szFree);.  }.
352e0 20 20 72 65 74 75 72 6e 20 6e 52 65 74 3b 0a 7d    return nRet;.}
352f0 0a 0a 2f 2a 0a 2a 2a 20 61 70 43 65 6c 6c 5b 5d  ../*.** apCell[]
35300 20 61 6e 64 20 73 7a 43 65 6c 6c 5b 5d 20 63 6f   and szCell[] co
35310 6e 74 61 69 6e 73 20 70 6f 69 6e 74 65 72 73 20  ntains pointers 
35320 74 6f 20 61 6e 64 20 73 69 7a 65 73 20 6f 66 20  to and sizes of 
35330 61 6c 6c 20 63 65 6c 6c 73 20 69 6e 20 74 68 65  all cells in the
35340 0a 2a 2a 20 70 61 67 65 73 20 62 65 69 6e 67 20  .** pages being 
35350 62 61 6c 61 6e 63 65 64 2e 20 20 54 68 65 20 63  balanced.  The c
35360 75 72 72 65 6e 74 20 70 61 67 65 2c 20 70 50 67  urrent page, pPg
35370 2c 20 68 61 73 20 70 50 67 2d 3e 6e 43 65 6c 6c  , has pPg->nCell
35380 20 63 65 6c 6c 73 20 73 74 61 72 74 69 6e 67 0a   cells starting.
35390 2a 2a 20 77 69 74 68 20 61 70 43 65 6c 6c 5b 69  ** with apCell[i
353a0 4f 6c 64 5d 2e 20 20 41 66 74 65 72 20 62 61 6c  Old].  After bal
353b0 61 6e 63 69 6e 67 2c 20 74 68 69 73 20 70 61 67  ancing, this pag
353c0 65 20 73 68 6f 75 6c 64 20 68 6f 6c 64 20 6e 4e  e should hold nN
353d0 65 77 20 63 65 6c 6c 73 0a 2a 2a 20 73 74 61 72  ew cells.** star
353e0 74 69 6e 67 20 61 74 20 61 70 43 65 6c 6c 5b 69  ting at apCell[i
353f0 4e 65 77 5d 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  New]..**.** This
35400 20 72 6f 75 74 69 6e 65 20 6d 61 6b 65 73 20 74   routine makes t
35410 68 65 20 6e 65 63 65 73 73 61 72 79 20 61 64 6a  he necessary adj
35420 75 73 74 6d 65 6e 74 73 20 74 6f 20 70 50 67 20  ustments to pPg 
35430 73 6f 20 74 68 61 74 20 69 74 20 63 6f 6e 74 61  so that it conta
35440 69 6e 73 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65  ins.** the corre
35450 63 74 20 63 65 6c 6c 73 20 61 66 74 65 72 20 62  ct cells after b
35460 65 69 6e 67 20 62 61 6c 61 6e 63 65 64 2e 0a 2a  eing balanced..*
35470 2a 0a 2a 2a 20 54 68 65 20 70 50 67 2d 3e 6e 46  *.** The pPg->nF
35480 72 65 65 20 66 69 65 6c 64 20 69 73 20 69 6e 76  ree field is inv
35490 61 6c 69 64 20 77 68 65 6e 20 74 68 69 73 20 66  alid when this f
354a0 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2e  unction returns.
354b0 20 49 74 20 69 73 20 74 68 65 0a 2a 2a 20 72 65   It is the.** re
354c0 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20  sponsibility of 
354d0 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 73 65  the caller to se
354e0 74 20 69 74 20 63 6f 72 72 65 63 74 6c 79 2e 0a  t it correctly..
354f0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65  */.static void e
35500 64 69 74 50 61 67 65 28 0a 20 20 4d 65 6d 50 61  ditPage(.  MemPa
35510 67 65 20 2a 70 50 67 2c 20 20 20 20 20 20 20 20  ge *pPg,        
35520 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 64             /* Ed
35530 69 74 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a  it this page */.
35540 20 20 69 6e 74 20 69 4f 6c 64 2c 20 20 20 20 20    int iOld,     
35550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35560 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66 69    /* Index of fi
35570 72 73 74 20 63 65 6c 6c 20 63 75 72 72 65 6e 74  rst cell current
35580 6c 79 20 6f 6e 20 70 61 67 65 20 2a 2f 0a 20 20  ly on page */.  
35590 69 6e 74 20 69 4e 65 77 2c 20 20 20 20 20 20 20  int iNew,       
355a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
355b0 2f 2a 20 49 6e 64 65 78 20 6f 66 20 6e 65 77 20  /* Index of new 
355c0 66 69 72 73 74 20 63 65 6c 6c 20 6f 6e 20 70 61  first cell on pa
355d0 67 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 65 77  ge */.  int nNew
355e0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
355f0 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 61 6c          /* Final
35600 20 6e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73   number of cells
35610 20 6f 6e 20 70 61 67 65 20 2a 2f 0a 20 20 75 38   on page */.  u8
35620 20 2a 2a 61 70 43 65 6c 6c 2c 20 20 20 20 20 20   **apCell,      
35630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
35640 20 41 72 72 61 79 20 6f 66 20 63 65 6c 6c 73 20   Array of cells 
35650 2a 2f 0a 20 20 75 31 36 20 2a 73 7a 43 65 6c 6c  */.  u16 *szCell
35660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35670 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66       /* Array of
35680 20 63 65 6c 6c 20 73 69 7a 65 73 20 2a 2f 0a 29   cell sizes */.)
35690 7b 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 61  {.  u8 * const a
356a0 44 61 74 61 20 3d 20 70 50 67 2d 3e 61 44 61 74  Data = pPg->aDat
356b0 61 3b 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 68  a;.  const int h
356c0 64 72 20 3d 20 70 50 67 2d 3e 68 64 72 4f 66 66  dr = pPg->hdrOff
356d0 73 65 74 3b 0a 20 20 75 38 20 2a 70 42 65 67 69  set;.  u8 *pBegi
356e0 6e 20 3d 20 26 70 50 67 2d 3e 61 43 65 6c 6c 49  n = &pPg->aCellI
356f0 64 78 5b 6e 4e 65 77 20 2a 20 32 5d 3b 0a 20 20  dx[nNew * 2];.  
35700 69 6e 74 20 6e 43 65 6c 6c 20 3d 20 70 50 67 2d  int nCell = pPg-
35710 3e 6e 43 65 6c 6c 3b 20 20 20 20 20 20 20 2f 2a  >nCell;       /*
35720 20 43 65 6c 6c 73 20 73 74 6f 72 65 64 20 6f 6e   Cells stored on
35730 20 70 50 67 20 2a 2f 0a 20 20 75 38 20 2a 70 44   pPg */.  u8 *pD
35740 61 74 61 3b 0a 20 20 75 38 20 2a 70 43 65 6c 6c  ata;.  u8 *pCell
35750 70 74 72 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  ptr;.  int i;.  
35760 69 6e 74 20 69 4f 6c 64 45 6e 64 20 3d 20 69 4f  int iOldEnd = iO
35770 6c 64 20 2b 20 70 50 67 2d 3e 6e 43 65 6c 6c 20  ld + pPg->nCell 
35780 2b 20 70 50 67 2d 3e 6e 4f 76 65 72 66 6c 6f 77  + pPg->nOverflow
35790 3b 0a 20 20 69 6e 74 20 69 4e 65 77 45 6e 64 20  ;.  int iNewEnd 
357a0 3d 20 69 4e 65 77 20 2b 20 6e 4e 65 77 3b 0a 0a  = iNew + nNew;..
357b0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
357c0 42 55 47 0a 20 20 75 38 20 2a 70 54 6d 70 20 3d  BUG.  u8 *pTmp =
357d0 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 65 6d   sqlite3PagerTem
357e0 70 53 70 61 63 65 28 70 50 67 2d 3e 70 42 74 2d  pSpace(pPg->pBt-
357f0 3e 70 50 61 67 65 72 29 3b 0a 20 20 6d 65 6d 63  >pPager);.  memc
35800 70 79 28 70 54 6d 70 2c 20 61 44 61 74 61 2c 20  py(pTmp, aData, 
35810 70 50 67 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  pPg->pBt->usable
35820 53 69 7a 65 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  Size);.#endif.. 
35830 20 2f 2a 20 52 65 6d 6f 76 65 20 63 65 6c 6c 73   /* Remove cells
35840 20 66 72 6f 6d 20 74 68 65 20 73 74 61 72 74 20   from the start 
35850 61 6e 64 20 65 6e 64 20 6f 66 20 74 68 65 20 70  and end of the p
35860 61 67 65 20 2a 2f 0a 20 20 69 66 28 20 69 4f 6c  age */.  if( iOl
35870 64 3c 69 4e 65 77 20 29 7b 0a 20 20 20 20 69 6e  d<iNew ){.    in
35880 74 20 6e 53 68 69 66 74 20 3d 20 70 61 67 65 46  t nShift = pageF
35890 72 65 65 41 72 72 61 79 28 0a 20 20 20 20 20 20  reeArray(.      
358a0 20 20 70 50 67 2c 20 69 4e 65 77 2d 69 4f 6c 64    pPg, iNew-iOld
358b0 2c 20 26 61 70 43 65 6c 6c 5b 69 4f 6c 64 5d 2c  , &apCell[iOld],
358c0 20 26 73 7a 43 65 6c 6c 5b 69 4f 6c 64 5d 0a 20   &szCell[iOld]. 
358d0 20 20 20 29 3b 0a 20 20 20 20 6d 65 6d 6d 6f 76     );.    memmov
358e0 65 28 70 50 67 2d 3e 61 43 65 6c 6c 49 64 78 2c  e(pPg->aCellIdx,
358f0 20 26 70 50 67 2d 3e 61 43 65 6c 6c 49 64 78 5b   &pPg->aCellIdx[
35900 6e 53 68 69 66 74 2a 32 5d 2c 20 6e 43 65 6c 6c  nShift*2], nCell
35910 2a 32 29 3b 0a 20 20 20 20 6e 43 65 6c 6c 20 2d  *2);.    nCell -
35920 3d 20 6e 53 68 69 66 74 3b 0a 20 20 7d 0a 20 20  = nShift;.  }.  
35930 69 66 28 20 69 4e 65 77 45 6e 64 20 3c 20 69 4f  if( iNewEnd < iO
35940 6c 64 45 6e 64 20 29 7b 0a 20 20 20 20 6e 43 65  ldEnd ){.    nCe
35950 6c 6c 20 2d 3d 20 70 61 67 65 46 72 65 65 41 72  ll -= pageFreeAr
35960 72 61 79 28 0a 20 20 20 20 20 20 20 20 70 50 67  ray(.        pPg
35970 2c 20 69 4f 6c 64 45 6e 64 2d 69 4e 65 77 45 6e  , iOldEnd-iNewEn
35980 64 2c 20 26 61 70 43 65 6c 6c 5b 69 4e 65 77 45  d, &apCell[iNewE
35990 6e 64 5d 2c 20 26 73 7a 43 65 6c 6c 5b 69 4e 65  nd], &szCell[iNe
359a0 77 45 6e 64 5d 0a 20 20 20 20 29 3b 0a 20 20 7d  wEnd].    );.  }
359b0 0a 0a 20 20 70 44 61 74 61 20 3d 20 26 61 44 61  ..  pData = &aDa
359c0 74 61 5b 67 65 74 32 62 79 74 65 4e 6f 74 5a 65  ta[get2byteNotZe
359d0 72 6f 28 26 61 44 61 74 61 5b 68 64 72 2b 35 5d  ro(&aData[hdr+5]
359e0 29 5d 3b 0a 20 20 69 66 28 20 70 44 61 74 61 3c  )];.  if( pData<
359f0 70 42 65 67 69 6e 20 29 20 67 6f 74 6f 20 65 64  pBegin ) goto ed
35a00 69 74 70 61 67 65 5f 66 61 69 6c 3b 0a 0a 20 20  itpage_fail;..  
35a10 2f 2a 20 41 64 64 20 63 65 6c 6c 73 20 74 6f 20  /* Add cells to 
35a20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
35a30 20 70 61 67 65 20 2a 2f 0a 20 20 69 66 28 20 69   page */.  if( i
35a40 4e 65 77 3c 69 4f 6c 64 20 29 7b 0a 20 20 20 20  New<iOld ){.    
35a50 69 6e 74 20 6e 41 64 64 20 3d 20 4d 49 4e 28 6e  int nAdd = MIN(n
35a60 4e 65 77 2c 69 4f 6c 64 2d 69 4e 65 77 29 3b 0a  New,iOld-iNew);.
35a70 20 20 20 20 61 73 73 65 72 74 28 20 28 69 4f 6c      assert( (iOl
35a80 64 2d 69 4e 65 77 29 3c 6e 4e 65 77 20 7c 7c 20  d-iNew)<nNew || 
35a90 6e 43 65 6c 6c 3d 3d 30 20 7c 7c 20 43 4f 52 52  nCell==0 || CORR
35aa0 55 50 54 5f 44 42 20 29 3b 0a 20 20 20 20 70 43  UPT_DB );.    pC
35ab0 65 6c 6c 70 74 72 20 3d 20 70 50 67 2d 3e 61 43  ellptr = pPg->aC
35ac0 65 6c 6c 49 64 78 3b 0a 20 20 20 20 6d 65 6d 6d  ellIdx;.    memm
35ad0 6f 76 65 28 26 70 43 65 6c 6c 70 74 72 5b 6e 41  ove(&pCellptr[nA
35ae0 64 64 2a 32 5d 2c 20 70 43 65 6c 6c 70 74 72 2c  dd*2], pCellptr,
35af0 20 6e 43 65 6c 6c 2a 32 29 3b 0a 20 20 20 20 69   nCell*2);.    i
35b00 66 28 20 70 61 67 65 49 6e 73 65 72 74 41 72 72  f( pageInsertArr
35b10 61 79 28 0a 20 20 20 20 20 20 20 20 20 20 70 50  ay(.          pP
35b20 67 2c 20 70 42 65 67 69 6e 2c 20 26 70 44 61 74  g, pBegin, &pDat
35b30 61 2c 20 70 43 65 6c 6c 70 74 72 2c 0a 20 20 20  a, pCellptr,.   
35b40 20 20 20 20 20 20 20 6e 41 64 64 2c 20 26 61 70         nAdd, &ap
35b50 43 65 6c 6c 5b 69 4e 65 77 5d 2c 20 26 73 7a 43  Cell[iNew], &szC
35b60 65 6c 6c 5b 69 4e 65 77 5d 0a 20 20 20 20 29 20  ell[iNew].    ) 
35b70 29 20 67 6f 74 6f 20 65 64 69 74 70 61 67 65 5f  ) goto editpage_
35b80 66 61 69 6c 3b 0a 20 20 20 20 6e 43 65 6c 6c 20  fail;.    nCell 
35b90 2b 3d 20 6e 41 64 64 3b 0a 20 20 7d 0a 0a 20 20  += nAdd;.  }..  
35ba0 2f 2a 20 41 64 64 20 61 6e 79 20 6f 76 65 72 66  /* Add any overf
35bb0 6c 6f 77 20 63 65 6c 6c 73 20 2a 2f 0a 20 20 66  low cells */.  f
35bc0 6f 72 28 69 3d 30 3b 20 69 3c 70 50 67 2d 3e 6e  or(i=0; i<pPg->n
35bd0 4f 76 65 72 66 6c 6f 77 3b 20 69 2b 2b 29 7b 0a  Overflow; i++){.
35be0 20 20 20 20 69 6e 74 20 69 43 65 6c 6c 20 3d 20      int iCell = 
35bf0 28 69 4f 6c 64 20 2b 20 70 50 67 2d 3e 61 69 4f  (iOld + pPg->aiO
35c00 76 66 6c 5b 69 5d 29 20 2d 20 69 4e 65 77 3b 0a  vfl[i]) - iNew;.
35c10 20 20 20 20 69 66 28 20 69 43 65 6c 6c 3e 3d 30      if( iCell>=0
35c20 20 26 26 20 69 43 65 6c 6c 3c 6e 4e 65 77 20 29   && iCell<nNew )
35c30 7b 0a 20 20 20 20 20 20 70 43 65 6c 6c 70 74 72  {.      pCellptr
35c40 20 3d 20 26 70 50 67 2d 3e 61 43 65 6c 6c 49 64   = &pPg->aCellId
35c50 78 5b 69 43 65 6c 6c 20 2a 20 32 5d 3b 0a 20 20  x[iCell * 2];.  
35c60 20 20 20 20 6d 65 6d 6d 6f 76 65 28 26 70 43 65      memmove(&pCe
35c70 6c 6c 70 74 72 5b 32 5d 2c 20 70 43 65 6c 6c 70  llptr[2], pCellp
35c80 74 72 2c 20 28 6e 43 65 6c 6c 20 2d 20 69 43 65  tr, (nCell - iCe
35c90 6c 6c 29 20 2a 20 32 29 3b 0a 20 20 20 20 20 20  ll) * 2);.      
35ca0 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 20 20 69  nCell++;.      i
35cb0 66 28 20 70 61 67 65 49 6e 73 65 72 74 41 72 72  f( pageInsertArr
35cc0 61 79 28 0a 20 20 20 20 20 20 20 20 20 20 20 20  ay(.            
35cd0 70 50 67 2c 20 70 42 65 67 69 6e 2c 20 26 70 44  pPg, pBegin, &pD
35ce0 61 74 61 2c 20 70 43 65 6c 6c 70 74 72 2c 0a 20  ata, pCellptr,. 
35cf0 20 20 20 20 20 20 20 20 20 20 20 31 2c 20 26 61             1, &a
35d00 70 43 65 6c 6c 5b 69 43 65 6c 6c 20 2b 20 69 4e  pCell[iCell + iN
35d10 65 77 5d 2c 20 26 73 7a 43 65 6c 6c 5b 69 43 65  ew], &szCell[iCe
35d20 6c 6c 20 2b 20 69 4e 65 77 5d 0a 20 20 20 20 20  ll + iNew].     
35d30 20 29 20 29 20 67 6f 74 6f 20 65 64 69 74 70 61   ) ) goto editpa
35d40 67 65 5f 66 61 69 6c 3b 0a 20 20 20 20 7d 0a 20  ge_fail;.    }. 
35d50 20 7d 0a 0a 20 20 2f 2a 20 41 70 70 65 6e 64 20   }..  /* Append 
35d60 63 65 6c 6c 73 20 74 6f 20 74 68 65 20 65 6e 64  cells to the end
35d70 20 6f 66 20 74 68 65 20 70 61 67 65 20 2a 2f 0a   of the page */.
35d80 20 20 70 43 65 6c 6c 70 74 72 20 3d 20 26 70 50    pCellptr = &pP
35d90 67 2d 3e 61 43 65 6c 6c 49 64 78 5b 6e 43 65 6c  g->aCellIdx[nCel
35da0 6c 2a 32 5d 3b 0a 20 20 69 66 28 20 70 61 67 65  l*2];.  if( page
35db0 49 6e 73 65 72 74 41 72 72 61 79 28 0a 20 20 20  InsertArray(.   
35dc0 20 20 20 20 20 70 50 67 2c 20 70 42 65 67 69 6e       pPg, pBegin
35dd0 2c 20 26 70 44 61 74 61 2c 20 70 43 65 6c 6c 70  , &pData, pCellp
35de0 74 72 2c 0a 20 20 20 20 20 20 20 20 6e 4e 65 77  tr,.        nNew
35df0 2d 6e 43 65 6c 6c 2c 20 26 61 70 43 65 6c 6c 5b  -nCell, &apCell[
35e00 69 4e 65 77 2b 6e 43 65 6c 6c 5d 2c 20 26 73 7a  iNew+nCell], &sz
35e10 43 65 6c 6c 5b 69 4e 65 77 2b 6e 43 65 6c 6c 5d  Cell[iNew+nCell]
35e20 0a 20 20 29 20 29 20 67 6f 74 6f 20 65 64 69 74  .  ) ) goto edit
35e30 70 61 67 65 5f 66 61 69 6c 3b 0a 0a 20 20 70 50  page_fail;..  pP
35e40 67 2d 3e 6e 43 65 6c 6c 20 3d 20 6e 4e 65 77 3b  g->nCell = nNew;
35e50 0a 20 20 70 50 67 2d 3e 6e 4f 76 65 72 66 6c 6f  .  pPg->nOverflo
35e60 77 20 3d 20 30 3b 0a 0a 20 20 70 75 74 32 62 79  w = 0;..  put2by
35e70 74 65 28 26 61 44 61 74 61 5b 68 64 72 2b 33 5d  te(&aData[hdr+3]
35e80 2c 20 70 50 67 2d 3e 6e 43 65 6c 6c 29 3b 0a 20  , pPg->nCell);. 
35e90 20 70 75 74 32 62 79 74 65 28 26 61 44 61 74 61   put2byte(&aData
35ea0 5b 68 64 72 2b 35 5d 2c 20 70 44 61 74 61 20 2d  [hdr+5], pData -
35eb0 20 61 44 61 74 61 29 3b 0a 0a 23 69 66 64 65 66   aData);..#ifdef
35ec0 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
35ed0 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4e 65 77 20  for(i=0; i<nNew 
35ee0 26 26 20 21 43 4f 52 52 55 50 54 5f 44 42 3b 20  && !CORRUPT_DB; 
35ef0 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70 43  i++){.    u8 *pC
35f00 65 6c 6c 20 3d 20 61 70 43 65 6c 6c 5b 69 2b 69  ell = apCell[i+i
35f10 4e 65 77 5d 3b 0a 20 20 20 20 69 6e 74 20 69 4f  New];.    int iO
35f20 66 66 20 3d 20 67 65 74 32 62 79 74 65 28 26 70  ff = get2byte(&p
35f30 50 67 2d 3e 61 43 65 6c 6c 49 64 78 5b 69 2a 32  Pg->aCellIdx[i*2
35f40 5d 29 3b 0a 20 20 20 20 69 66 28 20 70 43 65 6c  ]);.    if( pCel
35f50 6c 3e 3d 61 44 61 74 61 20 26 26 20 70 43 65 6c  l>=aData && pCel
35f60 6c 3c 26 61 44 61 74 61 5b 70 50 67 2d 3e 70 42  l<&aData[pPg->pB
35f70 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 5d 20 29  t->usableSize] )
35f80 7b 0a 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20  {.      pCell = 
35f90 26 70 54 6d 70 5b 70 43 65 6c 6c 20 2d 20 61 44  &pTmp[pCell - aD
35fa0 61 74 61 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ata];.    }.    
35fb0 61 73 73 65 72 74 28 20 30 3d 3d 6d 65 6d 63 6d  assert( 0==memcm
35fc0 70 28 70 43 65 6c 6c 2c 20 26 61 44 61 74 61 5b  p(pCell, &aData[
35fd0 69 4f 66 66 5d 2c 20 73 7a 43 65 6c 6c 5b 69 2b  iOff], szCell[i+
35fe0 69 4e 65 77 5d 29 20 29 3b 0a 20 20 7d 0a 23 65  iNew]) );.  }.#e
35ff0 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 3b 0a  ndif..  return;.
36000 20 65 64 69 74 70 61 67 65 5f 66 61 69 6c 3a 0a   editpage_fail:.
36010 20 20 2f 2a 20 55 6e 61 62 6c 65 20 74 6f 20 65    /* Unable to e
36020 64 69 74 20 74 68 69 73 20 70 61 67 65 2e 20 52  dit this page. R
36030 65 62 75 69 6c 64 20 69 74 20 66 72 6f 6d 20 73  ebuild it from s
36040 63 72 61 74 63 68 20 69 6e 73 74 65 61 64 2e 20  cratch instead. 
36050 2a 2f 0a 20 20 72 65 62 75 69 6c 64 50 61 67 65  */.  rebuildPage
36060 28 70 50 67 2c 20 6e 4e 65 77 2c 20 26 61 70 43  (pPg, nNew, &apC
36070 65 6c 6c 5b 69 4e 65 77 5d 2c 20 26 73 7a 43 65  ell[iNew], &szCe
36080 6c 6c 5b 69 4e 65 77 5d 29 3b 0a 7d 0a 0a 2f 2a  ll[iNew]);.}../*
36090 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
360a0 67 20 70 61 72 61 6d 65 74 65 72 73 20 64 65 74  g parameters det
360b0 65 72 6d 69 6e 65 20 68 6f 77 20 6d 61 6e 79 20  ermine how many 
360c0 61 64 6a 61 63 65 6e 74 20 70 61 67 65 73 20 67  adjacent pages g
360d0 65 74 20 69 6e 76 6f 6c 76 65 64 0a 2a 2a 20 69  et involved.** i
360e0 6e 20 61 20 62 61 6c 61 6e 63 69 6e 67 20 6f 70  n a balancing op
360f0 65 72 61 74 69 6f 6e 2e 20 20 4e 4e 20 69 73 20  eration.  NN is 
36100 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6e 65  the number of ne
36110 69 67 68 62 6f 72 73 20 6f 6e 20 65 69 74 68 65  ighbors on eithe
36120 72 20 73 69 64 65 0a 2a 2a 20 6f 66 20 74 68 65  r side.** of the
36130 20 70 61 67 65 20 74 68 61 74 20 70 61 72 74 69   page that parti
36140 63 69 70 61 74 65 20 69 6e 20 74 68 65 20 62 61  cipate in the ba
36150 6c 61 6e 63 69 6e 67 20 6f 70 65 72 61 74 69 6f  lancing operatio
36160 6e 2e 20 20 4e 42 20 69 73 20 74 68 65 0a 2a 2a  n.  NB is the.**
36170 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   total number of
36180 20 70 61 67 65 73 20 74 68 61 74 20 70 61 72 74   pages that part
36190 69 63 69 70 61 74 65 2c 20 69 6e 63 6c 75 64 69  icipate, includi
361a0 6e 67 20 74 68 65 20 74 61 72 67 65 74 20 70 61  ng the target pa
361b0 67 65 20 61 6e 64 0a 2a 2a 20 4e 4e 20 6e 65 69  ge and.** NN nei
361c0 67 68 62 6f 72 73 20 6f 6e 20 65 69 74 68 65 72  ghbors on either
361d0 20 73 69 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   side..**.** The
361e0 20 6d 69 6e 69 6d 75 6d 20 76 61 6c 75 65 20 6f   minimum value o
361f0 66 20 4e 4e 20 69 73 20 31 20 28 6f 66 20 63 6f  f NN is 1 (of co
36200 75 72 73 65 29 2e 20 20 49 6e 63 72 65 61 73 69  urse).  Increasi
36210 6e 67 20 4e 4e 20 61 62 6f 76 65 20 31 0a 2a 2a  ng NN above 1.**
36220 20 28 74 6f 20 32 20 6f 72 20 33 29 20 67 69 76   (to 2 or 3) giv
36230 65 73 20 61 20 6d 6f 64 65 73 74 20 69 6d 70 72  es a modest impr
36240 6f 76 65 6d 65 6e 74 20 69 6e 20 53 45 4c 45 43  ovement in SELEC
36250 54 20 61 6e 64 20 44 45 4c 45 54 45 20 70 65 72  T and DELETE per
36260 66 6f 72 6d 61 6e 63 65 0a 2a 2a 20 69 6e 20 65  formance.** in e
36270 78 63 68 61 6e 67 65 20 66 6f 72 20 61 20 6c 61  xchange for a la
36280 72 67 65 72 20 64 65 67 72 61 64 61 74 69 6f 6e  rger degradation
36290 20 69 6e 20 49 4e 53 45 52 54 20 61 6e 64 20 55   in INSERT and U
362a0 50 44 41 54 45 20 70 65 72 66 6f 72 6d 61 6e 63  PDATE performanc
362b0 65 2e 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20  e..** The value 
362c0 6f 66 20 4e 4e 20 61 70 70 65 61 72 73 20 74 6f  of NN appears to
362d0 20 67 69 76 65 20 74 68 65 20 62 65 73 74 20 72   give the best r
362e0 65 73 75 6c 74 73 20 6f 76 65 72 61 6c 6c 2e 0a  esults overall..
362f0 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 4e 20 31 20  */.#define NN 1 
36300 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
36310 75 6d 62 65 72 20 6f 66 20 6e 65 69 67 68 62 6f  umber of neighbo
36320 72 73 20 6f 6e 20 65 69 74 68 65 72 20 73 69 64  rs on either sid
36330 65 20 6f 66 20 70 50 61 67 65 20 2a 2f 0a 23 64  e of pPage */.#d
36340 65 66 69 6e 65 20 4e 42 20 28 4e 4e 2a 32 2b 31  efine NB (NN*2+1
36350 29 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20  )      /* Total 
36360 70 61 67 65 73 20 69 6e 76 6f 6c 76 65 64 20 69  pages involved i
36370 6e 20 74 68 65 20 62 61 6c 61 6e 63 65 20 2a 2f  n the balance */
36380 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ...#ifndef SQLIT
36390 45 5f 4f 4d 49 54 5f 51 55 49 43 4b 42 41 4c 41  E_OMIT_QUICKBALA
363a0 4e 43 45 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 76  NCE./*.** This v
363b0 65 72 73 69 6f 6e 20 6f 66 20 62 61 6c 61 6e 63  ersion of balanc
363c0 65 28 29 20 68 61 6e 64 6c 65 73 20 74 68 65 20  e() handles the 
363d0 63 6f 6d 6d 6f 6e 20 73 70 65 63 69 61 6c 20 63  common special c
363e0 61 73 65 20 77 68 65 72 65 0a 2a 2a 20 61 20 6e  ase where.** a n
363f0 65 77 20 65 6e 74 72 79 20 69 73 20 62 65 69 6e  ew entry is bein
36400 67 20 69 6e 73 65 72 74 65 64 20 6f 6e 20 74 68  g inserted on th
36410 65 20 65 78 74 72 65 6d 65 20 72 69 67 68 74 2d  e extreme right-
36420 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20 74 72  end of the.** tr
36430 65 65 2c 20 69 6e 20 6f 74 68 65 72 20 77 6f 72  ee, in other wor
36440 64 73 2c 20 77 68 65 6e 20 74 68 65 20 6e 65 77  ds, when the new
36450 20 65 6e 74 72 79 20 77 69 6c 6c 20 62 65 63 6f   entry will beco
36460 6d 65 20 74 68 65 20 6c 61 72 67 65 73 74 0a 2a  me the largest.*
36470 2a 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74  * entry in the t
36480 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 73 74 65  ree..**.** Inste
36490 61 64 20 6f 66 20 74 72 79 69 6e 67 20 74 6f 20  ad of trying to 
364a0 62 61 6c 61 6e 63 65 20 74 68 65 20 33 20 72 69  balance the 3 ri
364b0 67 68 74 2d 6d 6f 73 74 20 6c 65 61 66 20 70 61  ght-most leaf pa
364c0 67 65 73 2c 20 6a 75 73 74 20 61 64 64 0a 2a 2a  ges, just add.**
364d0 20 61 20 6e 65 77 20 70 61 67 65 20 74 6f 20 74   a new page to t
364e0 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69  he right-hand si
364f0 64 65 20 61 6e 64 20 70 75 74 20 74 68 65 20 6f  de and put the o
36500 6e 65 20 6e 65 77 20 65 6e 74 72 79 20 69 6e 0a  ne new entry in.
36510 2a 2a 20 74 68 61 74 20 70 61 67 65 2e 20 20 54  ** that page.  T
36520 68 69 73 20 6c 65 61 76 65 73 20 74 68 65 20 72  his leaves the r
36530 69 67 68 74 20 73 69 64 65 20 6f 66 20 74 68 65  ight side of the
36540 20 74 72 65 65 20 73 6f 6d 65 77 68 61 74 0a 2a   tree somewhat.*
36550 2a 20 75 6e 62 61 6c 61 6e 63 65 64 2e 20 20 42  * unbalanced.  B
36560 75 74 20 6f 64 64 73 20 61 72 65 20 74 68 61 74  ut odds are that
36570 20 77 65 20 77 69 6c 6c 20 62 65 20 69 6e 73 65   we will be inse
36580 72 74 69 6e 67 20 6e 65 77 20 65 6e 74 72 69 65  rting new entrie
36590 73 0a 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20  s.** at the end 
365a0 73 6f 6f 6e 20 61 66 74 65 72 77 61 72 64 73 20  soon afterwards 
365b0 73 6f 20 74 68 65 20 6e 65 61 72 6c 79 20 65 6d  so the nearly em
365c0 70 74 79 20 70 61 67 65 20 77 69 6c 6c 20 71 75  pty page will qu
365d0 69 63 6b 6c 79 0a 2a 2a 20 66 69 6c 6c 20 75 70  ickly.** fill up
365e0 2e 20 20 4f 6e 20 61 76 65 72 61 67 65 2e 0a 2a  .  On average..*
365f0 2a 0a 2a 2a 20 70 50 61 67 65 20 69 73 20 74 68  *.** pPage is th
36600 65 20 6c 65 61 66 20 70 61 67 65 20 77 68 69 63  e leaf page whic
36610 68 20 69 73 20 74 68 65 20 72 69 67 68 74 2d 6d  h is the right-m
36620 6f 73 74 20 70 61 67 65 20 69 6e 20 74 68 65 20  ost page in the 
36630 74 72 65 65 2e 0a 2a 2a 20 70 50 61 72 65 6e 74  tree..** pParent
36640 20 69 73 20 69 74 73 20 70 61 72 65 6e 74 2e 20   is its parent. 
36650 20 70 50 61 67 65 20 6d 75 73 74 20 68 61 76 65   pPage must have
36660 20 61 20 73 69 6e 67 6c 65 20 6f 76 65 72 66 6c   a single overfl
36670 6f 77 20 65 6e 74 72 79 0a 2a 2a 20 77 68 69 63  ow entry.** whic
36680 68 20 69 73 20 61 6c 73 6f 20 74 68 65 20 72 69  h is also the ri
36690 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 6f  ght-most entry o
366a0 6e 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a  n the page..**.*
366b0 2a 20 54 68 65 20 70 53 70 61 63 65 20 62 75 66  * The pSpace buf
366c0 66 65 72 20 69 73 20 75 73 65 64 20 74 6f 20 73  fer is used to s
366d0 74 6f 72 65 20 61 20 74 65 6d 70 6f 72 61 72 79  tore a temporary
366e0 20 63 6f 70 79 20 6f 66 20 74 68 65 20 64 69 76   copy of the div
366f0 69 64 65 72 0a 2a 2a 20 63 65 6c 6c 20 74 68 61  ider.** cell tha
36700 74 20 77 69 6c 6c 20 62 65 20 69 6e 73 65 72 74  t will be insert
36710 65 64 20 69 6e 74 6f 20 70 50 61 72 65 6e 74 2e  ed into pParent.
36720 20 53 75 63 68 20 61 20 63 65 6c 6c 20 63 6f 6e   Such a cell con
36730 73 69 73 74 73 20 6f 66 20 61 20 34 0a 2a 2a 20  sists of a 4.** 
36740 62 79 74 65 20 70 61 67 65 20 6e 75 6d 62 65 72  byte page number
36750 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 61 20 76   followed by a v
36760 61 72 69 61 62 6c 65 20 6c 65 6e 67 74 68 20 69  ariable length i
36770 6e 74 65 67 65 72 2e 20 49 6e 20 6f 74 68 65 72  nteger. In other
36780 0a 2a 2a 20 77 6f 72 64 73 2c 20 61 74 20 6d 6f  .** words, at mo
36790 73 74 20 31 33 20 62 79 74 65 73 2e 20 48 65 6e  st 13 bytes. Hen
367a0 63 65 20 74 68 65 20 70 53 70 61 63 65 20 62 75  ce the pSpace bu
367b0 66 66 65 72 20 6d 75 73 74 20 62 65 20 61 74 0a  ffer must be at.
367c0 2a 2a 20 6c 65 61 73 74 20 31 33 20 62 79 74 65  ** least 13 byte
367d0 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74  s in size..*/.st
367e0 61 74 69 63 20 69 6e 74 20 62 61 6c 61 6e 63 65  atic int balance
367f0 5f 71 75 69 63 6b 28 4d 65 6d 50 61 67 65 20 2a  _quick(MemPage *
36800 70 50 61 72 65 6e 74 2c 20 4d 65 6d 50 61 67 65  pParent, MemPage
36810 20 2a 70 50 61 67 65 2c 20 75 38 20 2a 70 53 70   *pPage, u8 *pSp
36820 61 63 65 29 7b 0a 20 20 42 74 53 68 61 72 65 64  ace){.  BtShared
36830 20 2a 63 6f 6e 73 74 20 70 42 74 20 3d 20 70 50   *const pBt = pP
36840 61 67 65 2d 3e 70 42 74 3b 20 20 20 20 2f 2a 20  age->pBt;    /* 
36850 42 2d 54 72 65 65 20 44 61 74 61 62 61 73 65 20  B-Tree Database 
36860 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e  */.  MemPage *pN
36870 65 77 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ew;             
36880 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77            /* New
36890 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67  ly allocated pag
368a0 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  e */.  int rc;  
368b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
368c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
368d0 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20  eturn Code */.  
368e0 50 67 6e 6f 20 70 67 6e 6f 4e 65 77 3b 20 20 20  Pgno pgnoNew;   
368f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36900 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d       /* Page num
36910 62 65 72 20 6f 66 20 70 4e 65 77 20 2a 2f 0a 0a  ber of pNew */..
36920 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
36930 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
36940 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
36950 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
36960 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
36970 61 62 6c 65 28 70 50 61 72 65 6e 74 2d 3e 70 44  able(pParent->pD
36980 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65  bPage) );.  asse
36990 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72  rt( pPage->nOver
369a0 66 6c 6f 77 3d 3d 31 20 29 3b 0a 0a 20 20 2f 2a  flow==1 );..  /*
369b0 20 54 68 69 73 20 65 72 72 6f 72 20 63 6f 6e 64   This error cond
369c0 69 74 69 6f 6e 20 69 73 20 6e 6f 77 20 63 61 75  ition is now cau
369d0 67 68 74 20 70 72 69 6f 72 20 74 6f 20 72 65 61  ght prior to rea
369e0 63 68 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74  ching this funct
369f0 69 6f 6e 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56  ion */.  if( NEV
36a00 45 52 28 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d  ER(pPage->nCell=
36a10 3d 30 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c  =0) ) return SQL
36a20 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
36a30 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  ;..  /* Allocate
36a40 20 61 20 6e 65 77 20 70 61 67 65 2e 20 54 68 69   a new page. Thi
36a50 73 20 70 61 67 65 20 77 69 6c 6c 20 62 65 63 6f  s page will beco
36a60 6d 65 20 74 68 65 20 72 69 67 68 74 2d 73 69 62  me the right-sib
36a70 6c 69 6e 67 20 6f 66 20 0a 20 20 2a 2a 20 70 50  ling of .  ** pP
36a80 61 67 65 2e 20 4d 61 6b 65 20 74 68 65 20 70 61  age. Make the pa
36a90 72 65 6e 74 20 70 61 67 65 20 77 72 69 74 61 62  rent page writab
36aa0 6c 65 2c 20 73 6f 20 74 68 61 74 20 74 68 65 20  le, so that the 
36ab0 6e 65 77 20 64 69 76 69 64 65 72 20 63 65 6c 6c  new divider cell
36ac0 0a 20 20 2a 2a 20 6d 61 79 20 62 65 20 69 6e 73  .  ** may be ins
36ad0 65 72 74 65 64 2e 20 49 66 20 62 6f 74 68 20 74  erted. If both t
36ae0 68 65 73 65 20 6f 70 65 72 61 74 69 6f 6e 73 20  hese operations 
36af0 61 72 65 20 73 75 63 63 65 73 73 66 75 6c 2c 20  are successful, 
36b00 70 72 6f 63 65 65 64 2e 0a 20 20 2a 2f 0a 20 20  proceed..  */.  
36b10 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72  rc = allocateBtr
36b20 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 4e 65  eePage(pBt, &pNe
36b30 77 2c 20 26 70 67 6e 6f 4e 65 77 2c 20 30 2c 20  w, &pgnoNew, 0, 
36b40 30 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53  0);..  if( rc==S
36b50 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 0a 20 20 20  QLITE_OK ){..   
36b60 20 75 38 20 2a 70 4f 75 74 20 3d 20 26 70 53 70   u8 *pOut = &pSp
36b70 61 63 65 5b 34 5d 3b 0a 20 20 20 20 75 38 20 2a  ace[4];.    u8 *
36b80 70 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 61  pCell = pPage->a
36b90 70 4f 76 66 6c 5b 30 5d 3b 0a 20 20 20 20 75 31  pOvfl[0];.    u1
36ba0 36 20 73 7a 43 65 6c 6c 20 3d 20 63 65 6c 6c 53  6 szCell = cellS
36bb0 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20 70 43  izePtr(pPage, pC
36bc0 65 6c 6c 29 3b 0a 20 20 20 20 75 38 20 2a 70 53  ell);.    u8 *pS
36bd0 74 6f 70 3b 0a 0a 20 20 20 20 61 73 73 65 72 74  top;..    assert
36be0 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
36bf0 77 72 69 74 65 61 62 6c 65 28 70 4e 65 77 2d 3e  writeable(pNew->
36c00 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 20 20  pDbPage) );.    
36c10 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 61  assert( pPage->a
36c20 44 61 74 61 5b 30 5d 3d 3d 28 50 54 46 5f 49 4e  Data[0]==(PTF_IN
36c30 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46 44 41 54  TKEY|PTF_LEAFDAT
36c40 41 7c 50 54 46 5f 4c 45 41 46 29 20 29 3b 0a 20  A|PTF_LEAF) );. 
36c50 20 20 20 7a 65 72 6f 50 61 67 65 28 70 4e 65 77     zeroPage(pNew
36c60 2c 20 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46  , PTF_INTKEY|PTF
36c70 5f 4c 45 41 46 44 41 54 41 7c 50 54 46 5f 4c 45  _LEAFDATA|PTF_LE
36c80 41 46 29 3b 0a 20 20 20 20 72 65 62 75 69 6c 64  AF);.    rebuild
36c90 50 61 67 65 28 70 4e 65 77 2c 20 31 2c 20 26 70  Page(pNew, 1, &p
36ca0 43 65 6c 6c 2c 20 26 73 7a 43 65 6c 6c 29 3b 0a  Cell, &szCell);.
36cb0 20 20 20 20 70 4e 65 77 2d 3e 6e 46 72 65 65 20      pNew->nFree 
36cc0 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  = pBt->usableSiz
36cd0 65 20 2d 20 70 4e 65 77 2d 3e 63 65 6c 6c 4f 66  e - pNew->cellOf
36ce0 66 73 65 74 20 2d 20 32 20 2d 20 73 7a 43 65 6c  fset - 2 - szCel
36cf0 6c 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  l;..    /* If th
36d00 69 73 20 69 73 20 61 6e 20 61 75 74 6f 2d 76 61  is is an auto-va
36d10 63 75 75 6d 20 64 61 74 61 62 61 73 65 2c 20 75  cuum database, u
36d20 70 64 61 74 65 20 74 68 65 20 70 6f 69 6e 74 65  pdate the pointe
36d30 72 20 6d 61 70 0a 20 20 20 20 2a 2a 20 77 69 74  r map.    ** wit
36d40 68 20 65 6e 74 72 69 65 73 20 66 6f 72 20 74 68  h entries for th
36d50 65 20 6e 65 77 20 70 61 67 65 2c 20 61 6e 64 20  e new page, and 
36d60 61 6e 79 20 70 6f 69 6e 74 65 72 20 66 72 6f 6d  any pointer from
36d70 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 63 65 6c   the .    ** cel
36d80 6c 20 6f 6e 20 74 68 65 20 70 61 67 65 20 74 6f  l on the page to
36d90 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
36da0 65 2e 20 49 66 20 65 69 74 68 65 72 20 6f 66 20  e. If either of 
36db0 74 68 65 73 65 0a 20 20 20 20 2a 2a 20 6f 70 65  these.    ** ope
36dc0 72 61 74 69 6f 6e 73 20 66 61 69 6c 73 2c 20 74  rations fails, t
36dd0 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 69  he return code i
36de0 73 20 73 65 74 2c 20 62 75 74 20 74 68 65 20 63  s set, but the c
36df0 6f 6e 74 65 6e 74 73 0a 20 20 20 20 2a 2a 20 6f  ontents.    ** o
36e00 66 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67  f the parent pag
36e10 65 20 61 72 65 20 73 74 69 6c 6c 20 6d 61 6e 69  e are still mani
36e20 70 75 6c 61 74 65 64 20 62 79 20 74 68 68 20 63  pulated by thh c
36e30 6f 64 65 20 62 65 6c 6f 77 2e 0a 20 20 20 20 2a  ode below..    *
36e40 2a 20 54 68 61 74 20 69 73 20 4f 6b 2c 20 61 74  * That is Ok, at
36e50 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65 20   this point the 
36e60 70 61 72 65 6e 74 20 70 61 67 65 20 69 73 20 67  parent page is g
36e70 75 61 72 61 6e 74 65 65 64 20 74 6f 0a 20 20 20  uaranteed to.   
36e80 20 2a 2a 20 62 65 20 6d 61 72 6b 65 64 20 61 73   ** be marked as
36e90 20 64 69 72 74 79 2e 20 52 65 74 75 72 6e 69 6e   dirty. Returnin
36ea0 67 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  g an error code 
36eb0 77 69 6c 6c 20 63 61 75 73 65 20 61 0a 20 20 20  will cause a.   
36ec0 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 2c 20 75 6e   ** rollback, un
36ed0 64 6f 69 6e 67 20 61 6e 79 20 63 68 61 6e 67 65  doing any change
36ee0 73 20 6d 61 64 65 20 74 6f 20 74 68 65 20 70 61  s made to the pa
36ef0 72 65 6e 74 20 70 61 67 65 2e 0a 20 20 20 20 2a  rent page..    *
36f00 2f 0a 20 20 20 20 69 66 28 20 49 53 41 55 54 4f  /.    if( ISAUTO
36f10 56 41 43 55 55 4d 20 29 7b 0a 20 20 20 20 20 20  VACUUM ){.      
36f20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 70  ptrmapPut(pBt, p
36f30 67 6e 6f 4e 65 77 2c 20 50 54 52 4d 41 50 5f 42  gnoNew, PTRMAP_B
36f40 54 52 45 45 2c 20 70 50 61 72 65 6e 74 2d 3e 70  TREE, pParent->p
36f50 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 20 20 20  gno, &rc);.     
36f60 20 69 66 28 20 73 7a 43 65 6c 6c 3e 70 4e 65 77   if( szCell>pNew
36f70 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20  ->minLocal ){.  
36f80 20 20 20 20 20 20 70 74 72 6d 61 70 50 75 74 4f        ptrmapPutO
36f90 76 66 6c 50 74 72 28 70 4e 65 77 2c 20 70 43 65  vflPtr(pNew, pCe
36fa0 6c 6c 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20  ll, &rc);.      
36fb0 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f  }.    }.  .    /
36fc0 2a 20 43 72 65 61 74 65 20 61 20 64 69 76 69 64  * Create a divid
36fd0 65 72 20 63 65 6c 6c 20 74 6f 20 69 6e 73 65 72  er cell to inser
36fe0 74 20 69 6e 74 6f 20 70 50 61 72 65 6e 74 2e 20  t into pParent. 
36ff0 54 68 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c  The divider cell
37000 0a 20 20 20 20 2a 2a 20 63 6f 6e 73 69 73 74 73  .    ** consists
37010 20 6f 66 20 61 20 34 2d 62 79 74 65 20 70 61 67   of a 4-byte pag
37020 65 20 6e 75 6d 62 65 72 20 28 74 68 65 20 70 61  e number (the pa
37030 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 50 61  ge number of pPa
37040 67 65 29 20 61 6e 64 0a 20 20 20 20 2a 2a 20 61  ge) and.    ** a
37050 20 76 61 72 69 61 62 6c 65 20 6c 65 6e 67 74 68   variable length
37060 20 6b 65 79 20 76 61 6c 75 65 20 28 77 68 69 63   key value (whic
37070 68 20 6d 75 73 74 20 62 65 20 74 68 65 20 73 61  h must be the sa
37080 6d 65 20 76 61 6c 75 65 20 61 73 20 74 68 65 0a  me value as the.
37090 20 20 20 20 2a 2a 20 6c 61 72 67 65 73 74 20 6b      ** largest k
370a0 65 79 20 6f 6e 20 70 50 61 67 65 29 2e 0a 20 20  ey on pPage)..  
370b0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 6f 20 66    **.    ** To f
370c0 69 6e 64 20 74 68 65 20 6c 61 72 67 65 73 74 20  ind the largest 
370d0 6b 65 79 20 76 61 6c 75 65 20 6f 6e 20 70 50 61  key value on pPa
370e0 67 65 2c 20 66 69 72 73 74 20 66 69 6e 64 20 74  ge, first find t
370f0 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 0a 20  he right-most . 
37100 20 20 20 2a 2a 20 63 65 6c 6c 20 6f 6e 20 70 50     ** cell on pP
37110 61 67 65 2e 20 54 68 65 20 66 69 72 73 74 20 74  age. The first t
37120 77 6f 20 66 69 65 6c 64 73 20 6f 66 20 74 68 69  wo fields of thi
37130 73 20 63 65 6c 6c 20 61 72 65 20 74 68 65 20 0a  s cell are the .
37140 20 20 20 20 2a 2a 20 72 65 63 6f 72 64 2d 6c 65      ** record-le
37150 6e 67 74 68 20 28 61 20 76 61 72 69 61 62 6c 65  ngth (a variable
37160 20 6c 65 6e 67 74 68 20 69 6e 74 65 67 65 72 20   length integer 
37170 61 74 20 6d 6f 73 74 20 33 32 2d 62 69 74 73 20  at most 32-bits 
37180 69 6e 20 73 69 7a 65 29 0a 20 20 20 20 2a 2a 20  in size).    ** 
37190 61 6e 64 20 74 68 65 20 6b 65 79 20 76 61 6c 75  and the key valu
371a0 65 20 28 61 20 76 61 72 69 61 62 6c 65 20 6c 65  e (a variable le
371b0 6e 67 74 68 20 69 6e 74 65 67 65 72 2c 20 6d 61  ngth integer, ma
371c0 79 20 68 61 76 65 20 61 6e 79 20 76 61 6c 75 65  y have any value
371d0 29 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 66 69  )..    ** The fi
371e0 72 73 74 20 6f 66 20 74 68 65 20 77 68 69 6c 65  rst of the while
371f0 28 2e 2e 2e 29 20 6c 6f 6f 70 73 20 62 65 6c 6f  (...) loops belo
37200 77 20 73 6b 69 70 73 20 6f 76 65 72 20 74 68 65  w skips over the
37210 20 72 65 63 6f 72 64 2d 6c 65 6e 67 74 68 0a 20   record-length. 
37220 20 20 20 2a 2a 20 66 69 65 6c 64 2e 20 54 68 65     ** field. The
37230 20 73 65 63 6f 6e 64 20 77 68 69 6c 65 28 2e 2e   second while(..
37240 2e 29 20 6c 6f 6f 70 20 63 6f 70 69 65 73 20 74  .) loop copies t
37250 68 65 20 6b 65 79 20 76 61 6c 75 65 20 66 72 6f  he key value fro
37260 6d 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 65 6c  m the.    ** cel
37270 6c 20 6f 6e 20 70 50 61 67 65 20 69 6e 74 6f 20  l on pPage into 
37280 74 68 65 20 70 53 70 61 63 65 20 62 75 66 66 65  the pSpace buffe
37290 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 43  r..    */.    pC
372a0 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70  ell = findCell(p
372b0 50 61 67 65 2c 20 70 50 61 67 65 2d 3e 6e 43 65  Page, pPage->nCe
372c0 6c 6c 2d 31 29 3b 0a 20 20 20 20 70 53 74 6f 70  ll-1);.    pStop
372d0 20 3d 20 26 70 43 65 6c 6c 5b 39 5d 3b 0a 20 20   = &pCell[9];.  
372e0 20 20 77 68 69 6c 65 28 20 28 2a 28 70 43 65 6c    while( (*(pCel
372f0 6c 2b 2b 29 26 30 78 38 30 29 20 26 26 20 70 43  l++)&0x80) && pC
37300 65 6c 6c 3c 70 53 74 6f 70 20 29 3b 0a 20 20 20  ell<pStop );.   
37310 20 70 53 74 6f 70 20 3d 20 26 70 43 65 6c 6c 5b   pStop = &pCell[
37320 39 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28  9];.    while( (
37330 28 2a 28 70 4f 75 74 2b 2b 29 20 3d 20 2a 28 70  (*(pOut++) = *(p
37340 43 65 6c 6c 2b 2b 29 29 26 30 78 38 30 29 20 26  Cell++))&0x80) &
37350 26 20 70 43 65 6c 6c 3c 70 53 74 6f 70 20 29 3b  & pCell<pStop );
37360 0a 0a 20 20 20 20 2f 2a 20 49 6e 73 65 72 74 20  ..    /* Insert 
37370 74 68 65 20 6e 65 77 20 64 69 76 69 64 65 72 20  the new divider 
37380 63 65 6c 6c 20 69 6e 74 6f 20 70 50 61 72 65 6e  cell into pParen
37390 74 2e 20 2a 2f 0a 20 20 20 20 69 6e 73 65 72 74  t. */.    insert
373a0 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 70 50  Cell(pParent, pP
373b0 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 2c 20 70 53  arent->nCell, pS
373c0 70 61 63 65 2c 20 28 69 6e 74 29 28 70 4f 75 74  pace, (int)(pOut
373d0 2d 70 53 70 61 63 65 29 2c 0a 20 20 20 20 20 20  -pSpace),.      
373e0 20 20 20 20 20 20 20 20 20 30 2c 20 70 50 61 67           0, pPag
373f0 65 2d 3e 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 0a  e->pgno, &rc);..
37400 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20 72      /* Set the r
37410 69 67 68 74 2d 63 68 69 6c 64 20 70 6f 69 6e 74  ight-child point
37420 65 72 20 6f 66 20 70 50 61 72 65 6e 74 20 74 6f  er of pParent to
37430 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6e 65   point to the ne
37440 77 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 70  w page. */.    p
37450 75 74 34 62 79 74 65 28 26 70 50 61 72 65 6e 74  ut4byte(&pParent
37460 2d 3e 61 44 61 74 61 5b 70 50 61 72 65 6e 74 2d  ->aData[pParent-
37470 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20 70  >hdrOffset+8], p
37480 67 6e 6f 4e 65 77 29 3b 0a 20 20 0a 20 20 20 20  gnoNew);.  .    
37490 2f 2a 20 52 65 6c 65 61 73 65 20 74 68 65 20 72  /* Release the r
374a0 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20  eference to the 
374b0 6e 65 77 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20  new page. */.   
374c0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4e 65   releasePage(pNe
374d0 77 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  w);.  }..  retur
374e0 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  n rc;.}.#endif /
374f0 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 51 55  * SQLITE_OMIT_QU
37500 49 43 4b 42 41 4c 41 4e 43 45 20 2a 2f 0a 0a 23  ICKBALANCE */..#
37510 69 66 20 30 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  if 0./*.** This 
37520 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f  function does no
37530 74 20 63 6f 6e 74 72 69 62 75 74 65 20 61 6e 79  t contribute any
37540 74 68 69 6e 67 20 74 6f 20 74 68 65 20 6f 70 65  thing to the ope
37550 72 61 74 69 6f 6e 20 6f 66 20 53 51 4c 69 74 65  ration of SQLite
37560 2e 0a 2a 2a 20 69 74 20 69 73 20 73 6f 6d 65 74  ..** it is somet
37570 69 6d 65 73 20 61 63 74 69 76 61 74 65 64 20 74  imes activated t
37580 65 6d 70 6f 72 61 72 69 6c 79 20 77 68 69 6c 65  emporarily while
37590 20 64 65 62 75 67 67 69 6e 67 20 63 6f 64 65 20   debugging code 
375a0 72 65 73 70 6f 6e 73 69 62 6c 65 20 0a 2a 2a 20  responsible .** 
375b0 66 6f 72 20 73 65 74 74 69 6e 67 20 70 6f 69 6e  for setting poin
375c0 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 2e  ter-map entries.
375d0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
375e0 74 72 6d 61 70 43 68 65 63 6b 50 61 67 65 73 28  trmapCheckPages(
375f0 4d 65 6d 50 61 67 65 20 2a 2a 61 70 50 61 67 65  MemPage **apPage
37600 2c 20 69 6e 74 20 6e 50 61 67 65 29 7b 0a 20 20  , int nPage){.  
37610 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 66 6f 72 28  int i, j;.  for(
37620 69 3d 30 3b 20 69 3c 6e 50 61 67 65 3b 20 69 2b  i=0; i<nPage; i+
37630 2b 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 3b 0a  +){.    Pgno n;.
37640 20 20 20 20 75 38 20 65 3b 0a 20 20 20 20 4d 65      u8 e;.    Me
37650 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 61  mPage *pPage = a
37660 70 50 61 67 65 5b 69 5d 3b 0a 20 20 20 20 42 74  pPage[i];.    Bt
37670 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50  Shared *pBt = pP
37680 61 67 65 2d 3e 70 42 74 3b 0a 20 20 20 20 61 73  age->pBt;.    as
37690 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49  sert( pPage->isI
376a0 6e 69 74 20 29 3b 0a 0a 20 20 20 20 66 6f 72 28  nit );..    for(
376b0 6a 3d 30 3b 20 6a 3c 70 50 61 67 65 2d 3e 6e 43  j=0; j<pPage->nC
376c0 65 6c 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  ell; j++){.     
376d0 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a   CellInfo info;.
376e0 20 20 20 20 20 20 75 38 20 2a 7a 3b 0a 20 20 20        u8 *z;.   
376f0 20 20 0a 20 20 20 20 20 20 7a 20 3d 20 66 69 6e    .      z = fin
37700 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 6a 29 3b  dCell(pPage, j);
37710 0a 20 20 20 20 20 20 62 74 72 65 65 50 61 72 73  .      btreePars
37720 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20  eCellPtr(pPage, 
37730 7a 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 20  z, &info);.     
37740 20 69 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66   if( info.iOverf
37750 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20 20 20 50  low ){.        P
37760 67 6e 6f 20 6f 76 66 6c 20 3d 20 67 65 74 34 62  gno ovfl = get4b
37770 79 74 65 28 26 7a 5b 69 6e 66 6f 2e 69 4f 76 65  yte(&z[info.iOve
37780 72 66 6c 6f 77 5d 29 3b 0a 20 20 20 20 20 20 20  rflow]);.       
37790 20 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20   ptrmapGet(pBt, 
377a0 6f 76 66 6c 2c 20 26 65 2c 20 26 6e 29 3b 0a 20  ovfl, &e, &n);. 
377b0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e         assert( n
377c0 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20 26 26  ==pPage->pgno &&
377d0 20 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46   e==PTRMAP_OVERF
377e0 4c 4f 57 31 20 29 3b 0a 20 20 20 20 20 20 7d 0a  LOW1 );.      }.
377f0 20 20 20 20 20 20 69 66 28 20 21 70 50 61 67 65        if( !pPage
37800 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  ->leaf ){.      
37810 20 20 50 67 6e 6f 20 63 68 69 6c 64 20 3d 20 67    Pgno child = g
37820 65 74 34 62 79 74 65 28 7a 29 3b 0a 20 20 20 20  et4byte(z);.    
37830 20 20 20 20 70 74 72 6d 61 70 47 65 74 28 70 42      ptrmapGet(pB
37840 74 2c 20 63 68 69 6c 64 2c 20 26 65 2c 20 26 6e  t, child, &e, &n
37850 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
37860 74 28 20 6e 3d 3d 70 50 61 67 65 2d 3e 70 67 6e  t( n==pPage->pgn
37870 6f 20 26 26 20 65 3d 3d 50 54 52 4d 41 50 5f 42  o && e==PTRMAP_B
37880 54 52 45 45 20 29 3b 0a 20 20 20 20 20 20 7d 0a  TREE );.      }.
37890 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 70      }.    if( !p
378a0 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
378b0 20 20 20 20 50 67 6e 6f 20 63 68 69 6c 64 20 3d      Pgno child =
378c0 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
378d0 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68  ->aData[pPage->h
378e0 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20  drOffset+8]);.  
378f0 20 20 20 20 70 74 72 6d 61 70 47 65 74 28 70 42      ptrmapGet(pB
37900 74 2c 20 63 68 69 6c 64 2c 20 26 65 2c 20 26 6e  t, child, &e, &n
37910 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
37920 20 6e 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20   n==pPage->pgno 
37930 26 26 20 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52  && e==PTRMAP_BTR
37940 45 45 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  EE );.    }.  }.
37950 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65    return 1;.}.#e
37960 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ndif../*.** This
37970 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65   function is use
37980 64 20 74 6f 20 63 6f 70 79 20 74 68 65 20 63 6f  d to copy the co
37990 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 62 2d  ntents of the b-
379a0 74 72 65 65 20 6e 6f 64 65 20 73 74 6f 72 65 64  tree node stored
379b0 20 0a 2a 2a 20 6f 6e 20 70 61 67 65 20 70 46 72   .** on page pFr
379c0 6f 6d 20 74 6f 20 70 61 67 65 20 70 54 6f 2e 20  om to page pTo. 
379d0 49 66 20 70 61 67 65 20 70 46 72 6f 6d 20 77 61  If page pFrom wa
379e0 73 20 6e 6f 74 20 61 20 6c 65 61 66 20 70 61 67  s not a leaf pag
379f0 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 70  e, then.** the p
37a00 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69  ointer-map entri
37a10 65 73 20 66 6f 72 20 65 61 63 68 20 63 68 69 6c  es for each chil
37a20 64 20 70 61 67 65 20 61 72 65 20 75 70 64 61 74  d page are updat
37a30 65 64 20 73 6f 20 74 68 61 74 20 74 68 65 0a 2a  ed so that the.*
37a40 2a 20 70 61 72 65 6e 74 20 70 61 67 65 20 73 74  * parent page st
37a50 6f 72 65 64 20 69 6e 20 74 68 65 20 70 6f 69 6e  ored in the poin
37a60 74 65 72 20 6d 61 70 20 69 73 20 70 61 67 65 20  ter map is page 
37a70 70 54 6f 2e 20 49 66 20 70 46 72 6f 6d 20 63 6f  pTo. If pFrom co
37a80 6e 74 61 69 6e 65 64 0a 2a 2a 20 61 6e 79 20 63  ntained.** any c
37a90 65 6c 6c 73 20 77 69 74 68 20 6f 76 65 72 66 6c  ells with overfl
37aa0 6f 77 20 70 61 67 65 20 70 6f 69 6e 74 65 72 73  ow page pointers
37ab0 2c 20 74 68 65 6e 20 74 68 65 20 63 6f 72 72 65  , then the corre
37ac0 73 70 6f 6e 64 69 6e 67 20 70 6f 69 6e 74 65 72  sponding pointer
37ad0 0a 2a 2a 20 6d 61 70 20 65 6e 74 72 69 65 73 20  .** map entries 
37ae0 61 72 65 20 61 6c 73 6f 20 75 70 64 61 74 65 64  are also updated
37af0 20 73 6f 20 74 68 61 74 20 74 68 65 20 70 61 72   so that the par
37b00 65 6e 74 20 70 61 67 65 20 69 73 20 70 61 67 65  ent page is page
37b10 20 70 54 6f 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70   pTo..**.** If p
37b20 46 72 6f 6d 20 69 73 20 63 75 72 72 65 6e 74 6c  From is currentl
37b30 79 20 63 61 72 72 79 69 6e 67 20 61 6e 79 20 6f  y carrying any o
37b40 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73 20 28 65  verflow cells (e
37b50 6e 74 72 69 65 73 20 69 6e 20 74 68 65 0a 2a 2a  ntries in the.**
37b60 20 4d 65 6d 50 61 67 65 2e 61 70 4f 76 66 6c 5b   MemPage.apOvfl[
37b70 5d 20 61 72 72 61 79 29 2c 20 74 68 65 79 20 61  ] array), they a
37b80 72 65 20 6e 6f 74 20 63 6f 70 69 65 64 20 74 6f  re not copied to
37b90 20 70 54 6f 2e 20 0a 2a 2a 0a 2a 2a 20 42 65 66   pTo. .**.** Bef
37ba0 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2c 20 70  ore returning, p
37bb0 61 67 65 20 70 54 6f 20 69 73 20 72 65 69 6e 69  age pTo is reini
37bc0 74 69 61 6c 69 7a 65 64 20 75 73 69 6e 67 20 62  tialized using b
37bd0 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 2e 0a  treeInitPage()..
37be0 2a 2a 0a 2a 2a 20 54 68 65 20 70 65 72 66 6f 72  **.** The perfor
37bf0 6d 61 6e 63 65 20 6f 66 20 74 68 69 73 20 66 75  mance of this fu
37c00 6e 63 74 69 6f 6e 20 69 73 20 6e 6f 74 20 63 72  nction is not cr
37c10 69 74 69 63 61 6c 2e 20 49 74 20 69 73 20 6f 6e  itical. It is on
37c20 6c 79 20 75 73 65 64 20 62 79 20 0a 2a 2a 20 74  ly used by .** t
37c30 68 65 20 62 61 6c 61 6e 63 65 5f 73 68 61 6c 6c  he balance_shall
37c40 6f 77 65 72 28 29 20 61 6e 64 20 62 61 6c 61 6e  ower() and balan
37c50 63 65 5f 64 65 65 70 65 72 28 29 20 70 72 6f 63  ce_deeper() proc
37c60 65 64 75 72 65 73 2c 20 6e 65 69 74 68 65 72 20  edures, neither 
37c70 6f 66 0a 2a 2a 20 77 68 69 63 68 20 61 72 65 20  of.** which are 
37c80 63 61 6c 6c 65 64 20 6f 66 74 65 6e 20 75 6e 64  called often und
37c90 65 72 20 6e 6f 72 6d 61 6c 20 63 69 72 63 75 6d  er normal circum
37ca0 73 74 61 6e 63 65 73 2e 0a 2a 2f 0a 73 74 61 74  stances..*/.stat
37cb0 69 63 20 76 6f 69 64 20 63 6f 70 79 4e 6f 64 65  ic void copyNode
37cc0 43 6f 6e 74 65 6e 74 28 4d 65 6d 50 61 67 65 20  Content(MemPage 
37cd0 2a 70 46 72 6f 6d 2c 20 4d 65 6d 50 61 67 65 20  *pFrom, MemPage 
37ce0 2a 70 54 6f 2c 20 69 6e 74 20 2a 70 52 43 29 7b  *pTo, int *pRC){
37cf0 0a 20 20 69 66 28 20 28 2a 70 52 43 29 3d 3d 53  .  if( (*pRC)==S
37d00 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
37d10 42 74 53 68 61 72 65 64 20 2a 20 63 6f 6e 73 74  BtShared * const
37d20 20 70 42 74 20 3d 20 70 46 72 6f 6d 2d 3e 70 42   pBt = pFrom->pB
37d30 74 3b 0a 20 20 20 20 75 38 20 2a 20 63 6f 6e 73  t;.    u8 * cons
37d40 74 20 61 46 72 6f 6d 20 3d 20 70 46 72 6f 6d 2d  t aFrom = pFrom-
37d50 3e 61 44 61 74 61 3b 0a 20 20 20 20 75 38 20 2a  >aData;.    u8 *
37d60 20 63 6f 6e 73 74 20 61 54 6f 20 3d 20 70 54 6f   const aTo = pTo
37d70 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 69 6e 74  ->aData;.    int
37d80 20 63 6f 6e 73 74 20 69 46 72 6f 6d 48 64 72 20   const iFromHdr 
37d90 3d 20 70 46 72 6f 6d 2d 3e 68 64 72 4f 66 66 73  = pFrom->hdrOffs
37da0 65 74 3b 0a 20 20 20 20 69 6e 74 20 63 6f 6e 73  et;.    int cons
37db0 74 20 69 54 6f 48 64 72 20 3d 20 28 28 70 54 6f  t iToHdr = ((pTo
37dc0 2d 3e 70 67 6e 6f 3d 3d 31 29 20 3f 20 31 30 30  ->pgno==1) ? 100
37dd0 20 3a 20 30 29 3b 0a 20 20 20 20 69 6e 74 20 72   : 0);.    int r
37de0 63 3b 0a 20 20 20 20 69 6e 74 20 69 44 61 74 61  c;.    int iData
37df0 3b 0a 20 20 0a 20 20 0a 20 20 20 20 61 73 73 65  ;.  .  .    asse
37e00 72 74 28 20 70 46 72 6f 6d 2d 3e 69 73 49 6e 69  rt( pFrom->isIni
37e10 74 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  t );.    assert(
37e20 20 70 46 72 6f 6d 2d 3e 6e 46 72 65 65 3e 3d 69   pFrom->nFree>=i
37e30 54 6f 48 64 72 20 29 3b 0a 20 20 20 20 61 73 73  ToHdr );.    ass
37e40 65 72 74 28 20 67 65 74 32 62 79 74 65 28 26 61  ert( get2byte(&a
37e50 46 72 6f 6d 5b 69 46 72 6f 6d 48 64 72 2b 35 5d  From[iFromHdr+5]
37e60 29 20 3c 3d 20 28 69 6e 74 29 70 42 74 2d 3e 75  ) <= (int)pBt->u
37e70 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 0a  sableSize );.  .
37e80 20 20 20 20 2f 2a 20 43 6f 70 79 20 74 68 65 20      /* Copy the 
37e90 62 2d 74 72 65 65 20 6e 6f 64 65 20 63 6f 6e 74  b-tree node cont
37ea0 65 6e 74 20 66 72 6f 6d 20 70 61 67 65 20 70 46  ent from page pF
37eb0 72 6f 6d 20 74 6f 20 70 61 67 65 20 70 54 6f 2e  rom to page pTo.
37ec0 20 2a 2f 0a 20 20 20 20 69 44 61 74 61 20 3d 20   */.    iData = 
37ed0 67 65 74 32 62 79 74 65 28 26 61 46 72 6f 6d 5b  get2byte(&aFrom[
37ee0 69 46 72 6f 6d 48 64 72 2b 35 5d 29 3b 0a 20 20  iFromHdr+5]);.  
37ef0 20 20 6d 65 6d 63 70 79 28 26 61 54 6f 5b 69 44    memcpy(&aTo[iD
37f00 61 74 61 5d 2c 20 26 61 46 72 6f 6d 5b 69 44 61  ata], &aFrom[iDa
37f10 74 61 5d 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65  ta], pBt->usable
37f20 53 69 7a 65 2d 69 44 61 74 61 29 3b 0a 20 20 20  Size-iData);.   
37f30 20 6d 65 6d 63 70 79 28 26 61 54 6f 5b 69 54 6f   memcpy(&aTo[iTo
37f40 48 64 72 5d 2c 20 26 61 46 72 6f 6d 5b 69 46 72  Hdr], &aFrom[iFr
37f50 6f 6d 48 64 72 5d 2c 20 70 46 72 6f 6d 2d 3e 63  omHdr], pFrom->c
37f60 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70 46  ellOffset + 2*pF
37f70 72 6f 6d 2d 3e 6e 43 65 6c 6c 29 3b 0a 20 20 0a  rom->nCell);.  .
37f80 20 20 20 20 2f 2a 20 52 65 69 6e 69 74 69 61 6c      /* Reinitial
37f90 69 7a 65 20 70 61 67 65 20 70 54 6f 20 73 6f 20  ize page pTo so 
37fa0 74 68 61 74 20 74 68 65 20 63 6f 6e 74 65 6e 74  that the content
37fb0 73 20 6f 66 20 74 68 65 20 4d 65 6d 50 61 67 65  s of the MemPage
37fc0 20 73 74 72 75 63 74 75 72 65 0a 20 20 20 20 2a   structure.    *
37fd0 2a 20 6d 61 74 63 68 20 74 68 65 20 6e 65 77 20  * match the new 
37fe0 64 61 74 61 2e 20 54 68 65 20 69 6e 69 74 69 61  data. The initia
37ff0 6c 69 7a 61 74 69 6f 6e 20 6f 66 20 70 54 6f 20  lization of pTo 
38000 63 61 6e 20 61 63 74 75 61 6c 6c 79 20 66 61 69  can actually fai
38010 6c 20 75 6e 64 65 72 0a 20 20 20 20 2a 2a 20 66  l under.    ** f
38020 61 69 72 6c 79 20 6f 62 73 63 75 72 65 20 63 69  airly obscure ci
38030 72 63 75 6d 73 74 61 6e 63 65 73 2c 20 65 76 65  rcumstances, eve
38040 6e 20 74 68 6f 75 67 68 20 69 74 20 69 73 20 61  n though it is a
38050 20 63 6f 70 79 20 6f 66 20 69 6e 69 74 69 61 6c   copy of initial
38060 69 7a 65 64 20 0a 20 20 20 20 2a 2a 20 70 61 67  ized .    ** pag
38070 65 20 70 46 72 6f 6d 2e 0a 20 20 20 20 2a 2f 0a  e pFrom..    */.
38080 20 20 20 20 70 54 6f 2d 3e 69 73 49 6e 69 74 20      pTo->isInit 
38090 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 62 74  = 0;.    rc = bt
380a0 72 65 65 49 6e 69 74 50 61 67 65 28 70 54 6f 29  reeInitPage(pTo)
380b0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
380c0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
380d0 20 2a 70 52 43 20 3d 20 72 63 3b 0a 20 20 20 20   *pRC = rc;.    
380e0 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a    return;.    }.
380f0 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69    .    /* If thi
38100 73 20 69 73 20 61 6e 20 61 75 74 6f 2d 76 61 63  s is an auto-vac
38110 75 75 6d 20 64 61 74 61 62 61 73 65 2c 20 75 70  uum database, up
38120 64 61 74 65 20 74 68 65 20 70 6f 69 6e 74 65 72  date the pointer
38130 2d 6d 61 70 20 65 6e 74 72 69 65 73 0a 20 20 20  -map entries.   
38140 20 2a 2a 20 66 6f 72 20 61 6e 79 20 62 2d 74 72   ** for any b-tr
38150 65 65 20 6f 72 20 6f 76 65 72 66 6c 6f 77 20 70  ee or overflow p
38160 61 67 65 73 20 74 68 61 74 20 70 54 6f 20 6e 6f  ages that pTo no
38170 77 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 70  w contains the p
38180 6f 69 6e 74 65 72 73 20 74 6f 2e 0a 20 20 20 20  ointers to..    
38190 2a 2f 0a 20 20 20 20 69 66 28 20 49 53 41 55 54  */.    if( ISAUT
381a0 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20 20 20 20  OVACUUM ){.     
381b0 20 2a 70 52 43 20 3d 20 73 65 74 43 68 69 6c 64   *pRC = setChild
381c0 50 74 72 6d 61 70 73 28 70 54 6f 29 3b 0a 20 20  Ptrmaps(pTo);.  
381d0 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
381e0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   This routine re
381f0 64 69 73 74 72 69 62 75 74 65 73 20 63 65 6c 6c  distributes cell
38200 73 20 6f 6e 20 74 68 65 20 69 50 61 72 65 6e 74  s on the iParent
38210 49 64 78 27 74 68 20 63 68 69 6c 64 20 6f 66 20  Idx'th child of 
38220 70 50 61 72 65 6e 74 0a 2a 2a 20 28 68 65 72 65  pParent.** (here
38230 61 66 74 65 72 20 22 74 68 65 20 70 61 67 65 22  after "the page"
38240 29 20 61 6e 64 20 75 70 20 74 6f 20 32 20 73 69  ) and up to 2 si
38250 62 6c 69 6e 67 73 20 73 6f 20 74 68 61 74 20 61  blings so that a
38260 6c 6c 20 70 61 67 65 73 20 68 61 76 65 20 61 62  ll pages have ab
38270 6f 75 74 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20  out the.** same 
38280 61 6d 6f 75 6e 74 20 6f 66 20 66 72 65 65 20 73  amount of free s
38290 70 61 63 65 2e 20 55 73 75 61 6c 6c 79 20 61 20  pace. Usually a 
382a0 73 69 6e 67 6c 65 20 73 69 62 6c 69 6e 67 20 6f  single sibling o
382b0 6e 20 65 69 74 68 65 72 20 73 69 64 65 20 6f 66  n either side of
382c0 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 61 72 65   the.** page are
382d0 20 75 73 65 64 20 69 6e 20 74 68 65 20 62 61 6c   used in the bal
382e0 61 6e 63 69 6e 67 2c 20 74 68 6f 75 67 68 20 62  ancing, though b
382f0 6f 74 68 20 73 69 62 6c 69 6e 67 73 20 6d 69 67  oth siblings mig
38300 68 74 20 63 6f 6d 65 20 66 72 6f 6d 20 6f 6e 65  ht come from one
38310 0a 2a 2a 20 73 69 64 65 20 69 66 20 74 68 65 20  .** side if the 
38320 70 61 67 65 20 69 73 20 74 68 65 20 66 69 72 73  page is the firs
38330 74 20 6f 72 20 6c 61 73 74 20 63 68 69 6c 64 20  t or last child 
38340 6f 66 20 69 74 73 20 70 61 72 65 6e 74 2e 20 49  of its parent. I
38350 66 20 74 68 65 20 70 61 67 65 20 0a 2a 2a 20 68  f the page .** h
38360 61 73 20 66 65 77 65 72 20 74 68 61 6e 20 32 20  as fewer than 2 
38370 73 69 62 6c 69 6e 67 73 20 28 73 6f 6d 65 74 68  siblings (someth
38380 69 6e 67 20 77 68 69 63 68 20 63 61 6e 20 6f 6e  ing which can on
38390 6c 79 20 68 61 70 70 65 6e 20 69 66 20 74 68 65  ly happen if the
383a0 20 70 61 67 65 0a 2a 2a 20 69 73 20 61 20 72 6f   page.** is a ro
383b0 6f 74 20 70 61 67 65 20 6f 72 20 61 20 63 68 69  ot page or a chi
383c0 6c 64 20 6f 66 20 61 20 72 6f 6f 74 20 70 61 67  ld of a root pag
383d0 65 29 20 74 68 65 6e 20 61 6c 6c 20 61 76 61 69  e) then all avai
383e0 6c 61 62 6c 65 20 73 69 62 6c 69 6e 67 73 0a 2a  lable siblings.*
383f0 2a 20 70 61 72 74 69 63 69 70 61 74 65 20 69 6e  * participate in
38400 20 74 68 65 20 62 61 6c 61 6e 63 69 6e 67 2e 0a   the balancing..
38410 2a 2a 0a 2a 2a 20 54 68 65 20 6e 75 6d 62 65 72  **.** The number
38420 20 6f 66 20 73 69 62 6c 69 6e 67 73 20 6f 66 20   of siblings of 
38430 74 68 65 20 70 61 67 65 20 6d 69 67 68 74 20 62  the page might b
38440 65 20 69 6e 63 72 65 61 73 65 64 20 6f 72 20 64  e increased or d
38450 65 63 72 65 61 73 65 64 20 62 79 20 0a 2a 2a 20  ecreased by .** 
38460 6f 6e 65 20 6f 72 20 74 77 6f 20 69 6e 20 61 6e  one or two in an
38470 20 65 66 66 6f 72 74 20 74 6f 20 6b 65 65 70 20   effort to keep 
38480 70 61 67 65 73 20 6e 65 61 72 6c