/ Hex Artifact Content
Login

Artifact c222cc2b5a87ffab3b7943f5d9e23d77af1e5170:


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 43 75 72 73 6f 72 20 29 3b 0a 20 20 20 20 70 42  Cursor );.    pB
14750 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 28 75  t->pageSize = (u
14760 33 32 29 70 61 67 65 53 69 7a 65 3b 0a 20 20 20  32)pageSize;.   
14770 20 66 72 65 65 54 65 6d 70 53 70 61 63 65 28 70   freeTempSpace(p
14780 42 74 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  Bt);.  }.  rc = 
14790 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50  sqlite3PagerSetP
147a0 61 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61  agesize(pBt->pPa
147b0 67 65 72 2c 20 26 70 42 74 2d 3e 70 61 67 65 53  ger, &pBt->pageS
147c0 69 7a 65 2c 20 6e 52 65 73 65 72 76 65 29 3b 0a  ize, nReserve);.
147d0 20 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a    pBt->usableSiz
147e0 65 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  e = pBt->pageSiz
147f0 65 20 2d 20 28 75 31 36 29 6e 52 65 73 65 72 76  e - (u16)nReserv
14800 65 3b 0a 20 20 69 66 28 20 69 46 69 78 20 29 20  e;.  if( iFix ) 
14810 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d  pBt->btsFlags |=
14820 20 42 54 53 5f 50 41 47 45 53 49 5a 45 5f 46 49   BTS_PAGESIZE_FI
14830 58 45 44 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  XED;.  sqlite3Bt
14840 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
14850 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
14860 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63 75  ** Return the cu
14870 72 72 65 6e 74 6c 79 20 64 65 66 69 6e 65 64 20  rrently defined 
14880 70 61 67 65 20 73 69 7a 65 0a 2a 2f 0a 69 6e 74  page size.*/.int
14890 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
148a0 50 61 67 65 53 69 7a 65 28 42 74 72 65 65 20 2a  PageSize(Btree *
148b0 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e  p){.  return p->
148c0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 7d  pBt->pageSize;.}
148d0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
148e0 63 74 69 6f 6e 20 69 73 20 73 69 6d 69 6c 61 72  ction is similar
148f0 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65   to sqlite3Btree
14900 47 65 74 52 65 73 65 72 76 65 28 29 2c 20 65 78  GetReserve(), ex
14910 63 65 70 74 20 74 68 61 74 20 69 74 0a 2a 2a 20  cept that it.** 
14920 6d 61 79 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c  may only be call
14930 65 64 20 69 66 20 69 74 20 69 73 20 67 75 61 72  ed if it is guar
14940 61 6e 74 65 65 64 20 74 68 61 74 20 74 68 65 20  anteed that the 
14950 62 2d 74 72 65 65 20 6d 75 74 65 78 20 69 73 20  b-tree mutex is 
14960 61 6c 72 65 61 64 79 0a 2a 2a 20 68 65 6c 64 2e  already.** held.
14970 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 75  .**.** This is u
14980 73 65 66 75 6c 20 69 6e 20 6f 6e 65 20 73 70 65  seful in one spe
14990 63 69 61 6c 20 63 61 73 65 20 69 6e 20 74 68 65  cial case in the
149a0 20 62 61 63 6b 75 70 20 41 50 49 20 63 6f 64 65   backup API code
149b0 20 77 68 65 72 65 20 69 74 20 69 73 0a 2a 2a 20   where it is.** 
149c0 6b 6e 6f 77 6e 20 74 68 61 74 20 74 68 65 20 73  known that the s
149d0 68 61 72 65 64 20 62 2d 74 72 65 65 20 6d 75 74  hared b-tree mut
149e0 65 78 20 69 73 20 68 65 6c 64 2c 20 62 75 74 20  ex is held, but 
149f0 74 68 65 20 6d 75 74 65 78 20 6f 6e 20 74 68 65  the mutex on the
14a00 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 68 61   .** database ha
14a10 6e 64 6c 65 20 74 68 61 74 20 6f 77 6e 73 20 2a  ndle that owns *
14a20 70 20 69 73 20 6e 6f 74 2e 20 49 6e 20 74 68 69  p is not. In thi
14a30 73 20 63 61 73 65 20 69 66 20 73 71 6c 69 74 65  s case if sqlite
14a40 33 42 74 72 65 65 45 6e 74 65 72 28 29 0a 2a 2a  3BtreeEnter().**
14a50 20 77 65 72 65 20 74 6f 20 62 65 20 63 61 6c 6c   were to be call
14a60 65 64 2c 20 69 74 20 6d 69 67 68 74 20 63 6f 6c  ed, it might col
14a70 6c 69 64 65 20 77 69 74 68 20 73 6f 6d 65 20 6f  lide with some o
14a80 74 68 65 72 20 6f 70 65 72 61 74 69 6f 6e 20 6f  ther operation o
14a90 6e 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73  n the.** databas
14aa0 65 20 68 61 6e 64 6c 65 20 74 68 61 74 20 6f 77  e handle that ow
14ab0 6e 73 20 2a 70 2c 20 63 61 75 73 69 6e 67 20 75  ns *p, causing u
14ac0 6e 64 65 66 69 6e 65 64 20 62 65 68 61 76 69 6f  ndefined behavio
14ad0 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  r..*/.int sqlite
14ae0 33 42 74 72 65 65 47 65 74 52 65 73 65 72 76 65  3BtreeGetReserve
14af0 4e 6f 4d 75 74 65 78 28 42 74 72 65 65 20 2a 70  NoMutex(Btree *p
14b00 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 61 73  ){.  int n;.  as
14b10 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
14b20 74 65 78 5f 68 65 6c 64 28 70 2d 3e 70 42 74 2d  tex_held(p->pBt-
14b30 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 6e 20 3d  >mutex) );.  n =
14b40 20 70 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a   p->pBt->pageSiz
14b50 65 20 2d 20 70 2d 3e 70 42 74 2d 3e 75 73 61 62  e - p->pBt->usab
14b60 6c 65 53 69 7a 65 3b 0a 20 20 72 65 74 75 72 6e  leSize;.  return
14b70 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74   n;.}../*.** Ret
14b80 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
14b90 66 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65  f bytes of space
14ba0 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 65   at the end of e
14bb0 76 65 72 79 20 70 61 67 65 20 74 68 61 74 0a 2a  very page that.*
14bc0 2a 20 61 72 65 20 69 6e 74 65 6e 74 75 61 6c 6c  * are intentuall
14bd0 79 20 6c 65 66 74 20 75 6e 75 73 65 64 2e 20 20  y left unused.  
14be0 54 68 69 73 20 69 73 20 74 68 65 20 22 72 65 73  This is the "res
14bf0 65 72 76 65 64 22 20 73 70 61 63 65 20 74 68 61  erved" space tha
14c00 74 20 69 73 0a 2a 2a 20 73 6f 6d 65 74 69 6d 65  t is.** sometime
14c10 73 20 75 73 65 64 20 62 79 20 65 78 74 65 6e 73  s used by extens
14c20 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53  ions..**.** If S
14c30 51 4c 49 54 45 5f 48 41 53 5f 4d 55 54 45 58 20  QLITE_HAS_MUTEX 
14c40 69 73 20 64 65 66 69 6e 65 64 20 74 68 65 6e 20  is defined then 
14c50 74 68 65 20 6e 75 6d 62 65 72 20 72 65 74 75 72  the number retur
14c60 6e 65 64 20 69 73 20 74 68 65 0a 2a 2a 20 67 72  ned is the.** gr
14c70 65 61 74 65 72 20 6f 66 20 74 68 65 20 63 75 72  eater of the cur
14c80 72 65 6e 74 20 72 65 73 65 72 76 65 64 20 73 70  rent reserved sp
14c90 61 63 65 20 61 6e 64 20 74 68 65 20 6d 61 78 69  ace and the maxi
14ca0 6d 75 6d 20 72 65 71 75 65 73 74 65 64 0a 2a 2a  mum requested.**
14cb0 20 72 65 73 65 72 76 65 20 73 70 61 63 65 2e 0a   reserve space..
14cc0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
14cd0 72 65 65 47 65 74 4f 70 74 69 6d 61 6c 52 65 73  reeGetOptimalRes
14ce0 65 72 76 65 28 42 74 72 65 65 20 2a 70 29 7b 0a  erve(Btree *p){.
14cf0 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74    int n;.  sqlit
14d00 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
14d10 0a 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 42 74  .  n = sqlite3Bt
14d20 72 65 65 47 65 74 52 65 73 65 72 76 65 4e 6f 4d  reeGetReserveNoM
14d30 75 74 65 78 28 70 29 3b 0a 23 69 66 64 65 66 20  utex(p);.#ifdef 
14d40 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43  SQLITE_HAS_CODEC
14d50 0a 20 20 69 66 28 20 6e 3c 70 2d 3e 70 42 74 2d  .  if( n<p->pBt-
14d60 3e 6f 70 74 69 6d 61 6c 52 65 73 65 72 76 65 20  >optimalReserve 
14d70 29 20 6e 20 3d 20 70 2d 3e 70 42 74 2d 3e 6f 70  ) n = p->pBt->op
14d80 74 69 6d 61 6c 52 65 73 65 72 76 65 3b 0a 23 65  timalReserve;.#e
14d90 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 42 74  ndif.  sqlite3Bt
14da0 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
14db0 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 0a 2f 2a 0a  eturn n;.}.../*.
14dc0 2a 2a 20 53 65 74 20 74 68 65 20 6d 61 78 69 6d  ** Set the maxim
14dd0 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 20 66 6f  um page count fo
14de0 72 20 61 20 64 61 74 61 62 61 73 65 20 69 66 20  r a database if 
14df0 6d 78 50 61 67 65 20 69 73 20 70 6f 73 69 74 69  mxPage is positi
14e00 76 65 2e 0a 2a 2a 20 4e 6f 20 63 68 61 6e 67 65  ve..** No change
14e10 73 20 61 72 65 20 6d 61 64 65 20 69 66 20 6d 78  s are made if mx
14e20 50 61 67 65 20 69 73 20 30 20 6f 72 20 6e 65 67  Page is 0 or neg
14e30 61 74 69 76 65 2e 0a 2a 2a 20 52 65 67 61 72 64  ative..** Regard
14e40 6c 65 73 73 20 6f 66 20 74 68 65 20 76 61 6c 75  less of the valu
14e50 65 20 6f 66 20 6d 78 50 61 67 65 2c 20 72 65 74  e of mxPage, ret
14e60 75 72 6e 20 74 68 65 20 6d 61 78 69 6d 75 6d 20  urn the maximum 
14e70 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 69  page count..*/.i
14e80 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d  nt sqlite3BtreeM
14e90 61 78 50 61 67 65 43 6f 75 6e 74 28 42 74 72 65  axPageCount(Btre
14ea0 65 20 2a 70 2c 20 69 6e 74 20 6d 78 50 61 67 65  e *p, int mxPage
14eb0 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71  ){.  int n;.  sq
14ec0 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
14ed0 70 29 3b 0a 20 20 6e 20 3d 20 73 71 6c 69 74 65  p);.  n = sqlite
14ee0 33 50 61 67 65 72 4d 61 78 50 61 67 65 43 6f 75  3PagerMaxPageCou
14ef0 6e 74 28 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65  nt(p->pBt->pPage
14f00 72 2c 20 6d 78 50 61 67 65 29 3b 0a 20 20 73 71  r, mxPage);.  sq
14f10 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
14f20 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a  p);.  return n;.
14f30 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
14f40 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45   BTS_SECURE_DELE
14f50 54 45 20 66 6c 61 67 20 69 66 20 6e 65 77 46 6c  TE flag if newFl
14f60 61 67 20 69 73 20 30 20 6f 72 20 31 2e 20 20 49  ag is 0 or 1.  I
14f70 66 20 6e 65 77 46 6c 61 67 20 69 73 20 2d 31 2c  f newFlag is -1,
14f80 0a 2a 2a 20 74 68 65 6e 20 6d 61 6b 65 20 6e 6f  .** then make no
14f90 20 63 68 61 6e 67 65 73 2e 20 20 41 6c 77 61 79   changes.  Alway
14fa0 73 20 72 65 74 75 72 6e 20 74 68 65 20 76 61 6c  s return the val
14fb0 75 65 20 6f 66 20 74 68 65 20 42 54 53 5f 53 45  ue of the BTS_SE
14fc0 43 55 52 45 5f 44 45 4c 45 54 45 0a 2a 2a 20 73  CURE_DELETE.** s
14fd0 65 74 74 69 6e 67 20 61 66 74 65 72 20 74 68 65  etting after the
14fe0 20 63 68 61 6e 67 65 2e 0a 2a 2f 0a 69 6e 74 20   change..*/.int 
14ff0 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 63 75  sqlite3BtreeSecu
15000 72 65 44 65 6c 65 74 65 28 42 74 72 65 65 20 2a  reDelete(Btree *
15010 70 2c 20 69 6e 74 20 6e 65 77 46 6c 61 67 29 7b  p, int newFlag){
15020 0a 20 20 69 6e 74 20 62 3b 0a 20 20 69 66 28 20  .  int b;.  if( 
15030 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  p==0 ) return 0;
15040 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
15050 6e 74 65 72 28 70 29 3b 0a 20 20 69 66 28 20 6e  nter(p);.  if( n
15060 65 77 46 6c 61 67 3e 3d 30 20 29 7b 0a 20 20 20  ewFlag>=0 ){.   
15070 20 70 2d 3e 70 42 74 2d 3e 62 74 73 46 6c 61 67   p->pBt->btsFlag
15080 73 20 26 3d 20 7e 42 54 53 5f 53 45 43 55 52 45  s &= ~BTS_SECURE
15090 5f 44 45 4c 45 54 45 3b 0a 20 20 20 20 69 66 28  _DELETE;.    if(
150a0 20 6e 65 77 46 6c 61 67 20 29 20 70 2d 3e 70 42   newFlag ) p->pB
150b0 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42  t->btsFlags |= B
150c0 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45  TS_SECURE_DELETE
150d0 3b 0a 20 20 7d 20 0a 20 20 62 20 3d 20 28 70 2d  ;.  } .  b = (p-
150e0 3e 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26  >pBt->btsFlags &
150f0 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45   BTS_SECURE_DELE
15100 54 45 29 21 3d 30 3b 0a 20 20 73 71 6c 69 74 65  TE)!=0;.  sqlite
15110 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
15120 20 20 72 65 74 75 72 6e 20 62 3b 0a 7d 0a 0a 2f    return b;.}../
15130 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
15140 27 61 75 74 6f 2d 76 61 63 75 75 6d 27 20 70 72  'auto-vacuum' pr
15150 6f 70 65 72 74 79 20 6f 66 20 74 68 65 20 64 61  operty of the da
15160 74 61 62 61 73 65 2e 20 49 66 20 74 68 65 20 27  tabase. If the '
15170 61 75 74 6f 56 61 63 75 75 6d 27 0a 2a 2a 20 70  autoVacuum'.** p
15180 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 6e 2d  arameter is non-
15190 7a 65 72 6f 2c 20 74 68 65 6e 20 61 75 74 6f 2d  zero, then auto-
151a0 76 61 63 75 75 6d 20 6d 6f 64 65 20 69 73 20 65  vacuum mode is e
151b0 6e 61 62 6c 65 64 2e 20 49 66 20 7a 65 72 6f 2c  nabled. If zero,
151c0 20 69 74 0a 2a 2a 20 69 73 20 64 69 73 61 62 6c   it.** is disabl
151d0 65 64 2e 20 54 68 65 20 64 65 66 61 75 6c 74 20  ed. The default 
151e0 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 61 75  value for the au
151f0 74 6f 2d 76 61 63 75 75 6d 20 70 72 6f 70 65 72  to-vacuum proper
15200 74 79 20 69 73 20 0a 2a 2a 20 64 65 74 65 72 6d  ty is .** determ
15210 69 6e 65 64 20 62 79 20 74 68 65 20 53 51 4c 49  ined by the SQLI
15220 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56  TE_DEFAULT_AUTOV
15230 41 43 55 55 4d 20 6d 61 63 72 6f 2e 0a 2a 2f 0a  ACUUM macro..*/.
15240 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
15250 53 65 74 41 75 74 6f 56 61 63 75 75 6d 28 42 74  SetAutoVacuum(Bt
15260 72 65 65 20 2a 70 2c 20 69 6e 74 20 61 75 74 6f  ree *p, int auto
15270 56 61 63 75 75 6d 29 7b 0a 23 69 66 64 65 66 20  Vacuum){.#ifdef 
15280 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
15290 56 41 43 55 55 4d 0a 20 20 72 65 74 75 72 6e 20  VACUUM.  return 
152a0 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b  SQLITE_READONLY;
152b0 0a 23 65 6c 73 65 0a 20 20 42 74 53 68 61 72 65  .#else.  BtShare
152c0 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
152d0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
152e0 54 45 5f 4f 4b 3b 0a 20 20 75 38 20 61 76 20 3d  TE_OK;.  u8 av =
152f0 20 28 75 38 29 61 75 74 6f 56 61 63 75 75 6d 3b   (u8)autoVacuum;
15300 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ..  sqlite3Btree
15310 45 6e 74 65 72 28 70 29 3b 0a 20 20 69 66 28 20  Enter(p);.  if( 
15320 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26  (pBt->btsFlags &
15330 20 42 54 53 5f 50 41 47 45 53 49 5a 45 5f 46 49   BTS_PAGESIZE_FI
15340 58 45 44 29 21 3d 30 20 26 26 20 28 61 76 20 3f  XED)!=0 && (av ?
15350 31 3a 30 29 21 3d 70 42 74 2d 3e 61 75 74 6f 56  1:0)!=pBt->autoV
15360 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 72 63 20  acuum ){.    rc 
15370 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  = SQLITE_READONL
15380 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  Y;.  }else{.    
15390 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
153a0 3d 20 61 76 20 3f 31 3a 30 3b 0a 20 20 20 20 70  = av ?1:0;.    p
153b0 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d  Bt->incrVacuum =
153c0 20 61 76 3d 3d 32 20 3f 31 3a 30 3b 0a 20 20 7d   av==2 ?1:0;.  }
153d0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
153e0 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
153f0 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a  n rc;.#endif.}..
15400 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
15410 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 27 61   value of the 'a
15420 75 74 6f 2d 76 61 63 75 75 6d 27 20 70 72 6f 70  uto-vacuum' prop
15430 65 72 74 79 2e 20 49 66 20 61 75 74 6f 2d 76 61  erty. If auto-va
15440 63 75 75 6d 20 69 73 20 0a 2a 2a 20 65 6e 61 62  cuum is .** enab
15450 6c 65 64 20 31 20 69 73 20 72 65 74 75 72 6e 65  led 1 is returne
15460 64 2e 20 4f 74 68 65 72 77 69 73 65 20 30 2e 0a  d. Otherwise 0..
15470 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
15480 72 65 65 47 65 74 41 75 74 6f 56 61 63 75 75 6d  reeGetAutoVacuum
15490 28 42 74 72 65 65 20 2a 70 29 7b 0a 23 69 66 64  (Btree *p){.#ifd
154a0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
154b0 55 54 4f 56 41 43 55 55 4d 0a 20 20 72 65 74 75  UTOVACUUM.  retu
154c0 72 6e 20 42 54 52 45 45 5f 41 55 54 4f 56 41 43  rn BTREE_AUTOVAC
154d0 55 55 4d 5f 4e 4f 4e 45 3b 0a 23 65 6c 73 65 0a  UUM_NONE;.#else.
154e0 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69    int rc;.  sqli
154f0 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
15500 3b 0a 20 20 72 63 20 3d 20 28 0a 20 20 20 20 28  ;.  rc = (.    (
15510 21 70 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63  !p->pBt->autoVac
15520 75 75 6d 29 3f 42 54 52 45 45 5f 41 55 54 4f 56  uum)?BTREE_AUTOV
15530 41 43 55 55 4d 5f 4e 4f 4e 45 3a 0a 20 20 20 20  ACUUM_NONE:.    
15540 28 21 70 2d 3e 70 42 74 2d 3e 69 6e 63 72 56 61  (!p->pBt->incrVa
15550 63 75 75 6d 29 3f 42 54 52 45 45 5f 41 55 54 4f  cuum)?BTREE_AUTO
15560 56 41 43 55 55 4d 5f 46 55 4c 4c 3a 0a 20 20 20  VACUUM_FULL:.   
15570 20 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55   BTREE_AUTOVACUU
15580 4d 5f 49 4e 43 52 0a 20 20 29 3b 0a 20 20 73 71  M_INCR.  );.  sq
15590 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
155a0 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
155b0 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a  .#endif.}.../*.*
155c0 2a 20 47 65 74 20 61 20 72 65 66 65 72 65 6e 63  * Get a referenc
155d0 65 20 74 6f 20 70 50 61 67 65 31 20 6f 66 20 74  e to pPage1 of t
155e0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
155f0 2e 20 20 54 68 69 73 20 77 69 6c 6c 0a 2a 2a 20  .  This will.** 
15600 61 6c 73 6f 20 61 63 71 75 69 72 65 20 61 20 72  also acquire a r
15610 65 61 64 6c 6f 63 6b 20 6f 6e 20 74 68 61 74 20  eadlock on that 
15620 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49  file..**.** SQLI
15630 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
15640 64 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 49  d on success.  I
15650 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 6e 6f  f the file is no
15660 74 20 61 0a 2a 2a 20 77 65 6c 6c 2d 66 6f 72 6d  t a.** well-form
15670 65 64 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ed database file
15680 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f 43 4f  , then SQLITE_CO
15690 52 52 55 50 54 20 69 73 20 72 65 74 75 72 6e 65  RRUPT is returne
156a0 64 2e 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53  d..** SQLITE_BUS
156b0 59 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  Y is returned if
156c0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
156d0 20 6c 6f 63 6b 65 64 2e 20 20 53 51 4c 49 54 45   locked.  SQLITE
156e0 5f 4e 4f 4d 45 4d 0a 2a 2a 20 69 73 20 72 65 74  _NOMEM.** is ret
156f0 75 72 6e 65 64 20 69 66 20 77 65 20 72 75 6e 20  urned if we run 
15700 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 2e 20 0a  out of memory. .
15710 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 6f  */.static int lo
15720 63 6b 42 74 72 65 65 28 42 74 53 68 61 72 65 64  ckBtree(BtShared
15730 20 2a 70 42 74 29 7b 0a 20 20 69 6e 74 20 72 63   *pBt){.  int rc
15740 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
15750 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 66 72  * Result code fr
15760 6f 6d 20 73 75 62 66 75 6e 63 74 69 6f 6e 73 20  om subfunctions 
15770 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  */.  MemPage *pP
15780 61 67 65 31 3b 20 20 20 20 20 2f 2a 20 50 61 67  age1;     /* Pag
15790 65 20 31 20 6f 66 20 74 68 65 20 64 61 74 61 62  e 1 of the datab
157a0 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e  ase file */.  in
157b0 74 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20  t nPage;        
157c0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
157d0 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74  pages in the dat
157e0 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  abase */.  int n
157f0 50 61 67 65 46 69 6c 65 20 3d 20 30 3b 20 20 20  PageFile = 0;   
15800 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
15810 65 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  es in the databa
15820 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  se file */.  int
15830 20 6e 50 61 67 65 48 65 61 64 65 72 3b 20 20 20   nPageHeader;   
15840 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
15850 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61  ages in the data
15860 62 61 73 65 20 61 63 63 6f 72 64 69 6e 67 20 74  base according t
15870 6f 20 68 64 72 20 2a 2f 0a 0a 20 20 61 73 73 65  o hdr */..  asse
15880 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
15890 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
158a0 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
158b0 70 42 74 2d 3e 70 50 61 67 65 31 3d 3d 30 20 29  pBt->pPage1==0 )
158c0 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
158d0 50 61 67 65 72 53 68 61 72 65 64 4c 6f 63 6b 28  PagerSharedLock(
158e0 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20  pBt->pPager);.  
158f0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
15900 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
15910 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61   rc = btreeGetPa
15920 67 65 28 70 42 74 2c 20 31 2c 20 26 70 50 61 67  ge(pBt, 1, &pPag
15930 65 31 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63  e1, 0);.  if( rc
15940 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
15950 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 44  turn rc;..  /* D
15960 6f 20 73 6f 6d 65 20 63 68 65 63 6b 69 6e 67 20  o some checking 
15970 74 6f 20 68 65 6c 70 20 69 6e 73 75 72 65 20 74  to help insure t
15980 68 65 20 66 69 6c 65 20 77 65 20 6f 70 65 6e 65  he file we opene
15990 64 20 72 65 61 6c 6c 79 20 69 73 0a 20 20 2a 2a  d really is.  **
159a0 20 61 20 76 61 6c 69 64 20 64 61 74 61 62 61 73   a valid databas
159b0 65 20 66 69 6c 65 2e 20 0a 20 20 2a 2f 0a 20 20  e file. .  */.  
159c0 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 48 65 61  nPage = nPageHea
159d0 64 65 72 20 3d 20 67 65 74 34 62 79 74 65 28 32  der = get4byte(2
159e0 38 2b 28 75 38 2a 29 70 50 61 67 65 31 2d 3e 61  8+(u8*)pPage1->a
159f0 44 61 74 61 29 3b 0a 20 20 73 71 6c 69 74 65 33  Data);.  sqlite3
15a00 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  PagerPagecount(p
15a10 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 6e 50 61  Bt->pPager, &nPa
15a20 67 65 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 6e  geFile);.  if( n
15a30 50 61 67 65 3d 3d 30 20 7c 7c 20 6d 65 6d 63 6d  Page==0 || memcm
15a40 70 28 32 34 2b 28 75 38 2a 29 70 50 61 67 65 31  p(24+(u8*)pPage1
15a50 2d 3e 61 44 61 74 61 2c 20 39 32 2b 28 75 38 2a  ->aData, 92+(u8*
15a60 29 70 50 61 67 65 31 2d 3e 61 44 61 74 61 2c 34  )pPage1->aData,4
15a70 29 21 3d 30 20 29 7b 0a 20 20 20 20 6e 50 61 67  )!=0 ){.    nPag
15a80 65 20 3d 20 6e 50 61 67 65 46 69 6c 65 3b 0a 20  e = nPageFile;. 
15a90 20 7d 0a 20 20 69 66 28 20 6e 50 61 67 65 3e 30   }.  if( nPage>0
15aa0 20 29 7b 0a 20 20 20 20 75 33 32 20 70 61 67 65   ){.    u32 page
15ab0 53 69 7a 65 3b 0a 20 20 20 20 75 33 32 20 75 73  Size;.    u32 us
15ac0 61 62 6c 65 53 69 7a 65 3b 0a 20 20 20 20 75 38  ableSize;.    u8
15ad0 20 2a 70 61 67 65 31 20 3d 20 70 50 61 67 65 31   *page1 = pPage1
15ae0 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 72 63 20  ->aData;.    rc 
15af0 3d 20 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42 3b  = SQLITE_NOTADB;
15b00 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45  .    /* EVIDENCE
15b10 2d 4f 46 3a 20 52 2d 34 33 37 33 37 2d 33 39 39  -OF: R-43737-399
15b20 39 39 20 45 76 65 72 79 20 76 61 6c 69 64 20 53  99 Every valid S
15b30 51 4c 69 74 65 20 64 61 74 61 62 61 73 65 20 66  QLite database f
15b40 69 6c 65 20 62 65 67 69 6e 73 0a 20 20 20 20 2a  ile begins.    *
15b50 2a 20 77 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f  * with the follo
15b60 77 69 6e 67 20 31 36 20 62 79 74 65 73 20 28 69  wing 16 bytes (i
15b70 6e 20 68 65 78 29 3a 20 35 33 20 35 31 20 34 63  n hex): 53 51 4c
15b80 20 36 39 20 37 34 20 36 35 20 32 30 20 36 36 20   69 74 65 20 66 
15b90 36 66 20 37 32 20 36 64 0a 20 20 20 20 2a 2a 20  6f 72 6d.    ** 
15ba0 36 31 20 37 34 20 32 30 20 33 33 20 30 30 2e 20  61 74 20 33 00. 
15bb0 2a 2f 0a 20 20 20 20 69 66 28 20 6d 65 6d 63 6d  */.    if( memcm
15bc0 70 28 70 61 67 65 31 2c 20 7a 4d 61 67 69 63 48  p(page1, zMagicH
15bd0 65 61 64 65 72 2c 20 31 36 29 21 3d 30 20 29 7b  eader, 16)!=0 ){
15be0 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65  .      goto page
15bf0 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20  1_init_failed;. 
15c00 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c     }..#ifdef SQL
15c10 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 20  ITE_OMIT_WAL.   
15c20 20 69 66 28 20 70 61 67 65 31 5b 31 38 5d 3e 31   if( page1[18]>1
15c30 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 62   ){.      pBt->b
15c40 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 52  tsFlags |= BTS_R
15c50 45 41 44 5f 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a  EAD_ONLY;.    }.
15c60 20 20 20 20 69 66 28 20 70 61 67 65 31 5b 31 39      if( page1[19
15c70 5d 3e 31 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  ]>1 ){.      got
15c80 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69  o page1_init_fai
15c90 6c 65 64 3b 0a 20 20 20 20 7d 0a 23 65 6c 73 65  led;.    }.#else
15ca0 0a 20 20 20 20 69 66 28 20 70 61 67 65 31 5b 31  .    if( page1[1
15cb0 38 5d 3e 32 20 29 7b 0a 20 20 20 20 20 20 70 42  8]>2 ){.      pB
15cc0 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42  t->btsFlags |= B
15cd0 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 3b 0a 20 20  TS_READ_ONLY;.  
15ce0 20 20 7d 0a 20 20 20 20 69 66 28 20 70 61 67 65    }.    if( page
15cf0 31 5b 31 39 5d 3e 32 20 29 7b 0a 20 20 20 20 20  1[19]>2 ){.     
15d00 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74   goto page1_init
15d10 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a  _failed;.    }..
15d20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 77 72      /* If the wr
15d30 69 74 65 20 76 65 72 73 69 6f 6e 20 69 73 20 73  ite version is s
15d40 65 74 20 74 6f 20 32 2c 20 74 68 69 73 20 64 61  et to 2, this da
15d50 74 61 62 61 73 65 20 73 68 6f 75 6c 64 20 62 65  tabase should be
15d60 20 61 63 63 65 73 73 65 64 0a 20 20 20 20 2a 2a   accessed.    **
15d70 20 69 6e 20 57 41 4c 20 6d 6f 64 65 2e 20 49 66   in WAL mode. If
15d80 20 74 68 65 20 6c 6f 67 20 69 73 20 6e 6f 74 20   the log is not 
15d90 61 6c 72 65 61 64 79 20 6f 70 65 6e 2c 20 6f 70  already open, op
15da0 65 6e 20 69 74 20 6e 6f 77 2e 20 54 68 65 6e 20  en it now. Then 
15db0 0a 20 20 20 20 2a 2a 20 72 65 74 75 72 6e 20 53  .    ** return S
15dc0 51 4c 49 54 45 5f 4f 4b 20 61 6e 64 20 72 65 74  QLITE_OK and ret
15dd0 75 72 6e 20 77 69 74 68 6f 75 74 20 70 6f 70 75  urn without popu
15de0 6c 61 74 69 6e 67 20 42 74 53 68 61 72 65 64 2e  lating BtShared.
15df0 70 50 61 67 65 31 2e 0a 20 20 20 20 2a 2a 20 54  pPage1..    ** T
15e00 68 65 20 63 61 6c 6c 65 72 20 64 65 74 65 63 74  he caller detect
15e10 73 20 74 68 69 73 20 61 6e 64 20 63 61 6c 6c 73  s this and calls
15e20 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   this function a
15e30 67 61 69 6e 2e 20 54 68 69 73 20 69 73 0a 20 20  gain. This is.  
15e40 20 20 2a 2a 20 72 65 71 75 69 72 65 64 20 61 73    ** required as
15e50 20 74 68 65 20 76 65 72 73 69 6f 6e 20 6f 66 20   the version of 
15e60 70 61 67 65 20 31 20 63 75 72 72 65 6e 74 6c 79  page 1 currently
15e70 20 69 6e 20 74 68 65 20 70 61 67 65 31 20 62 75   in the page1 bu
15e80 66 66 65 72 0a 20 20 20 20 2a 2a 20 6d 61 79 20  ffer.    ** may 
15e90 6e 6f 74 20 62 65 20 74 68 65 20 6c 61 74 65 73  not be the lates
15ea0 74 20 76 65 72 73 69 6f 6e 20 2d 20 74 68 65 72  t version - ther
15eb0 65 20 6d 61 79 20 62 65 20 61 20 6e 65 77 65 72  e may be a newer
15ec0 20 6f 6e 65 20 69 6e 20 74 68 65 20 6c 6f 67 0a   one in the log.
15ed0 20 20 20 20 2a 2a 20 66 69 6c 65 2e 0a 20 20 20      ** file..   
15ee0 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 61 67 65   */.    if( page
15ef0 31 5b 31 39 5d 3d 3d 32 20 26 26 20 28 70 42 74  1[19]==2 && (pBt
15f00 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53  ->btsFlags & BTS
15f10 5f 4e 4f 5f 57 41 4c 29 3d 3d 30 20 29 7b 0a 20  _NO_WAL)==0 ){. 
15f20 20 20 20 20 20 69 6e 74 20 69 73 4f 70 65 6e 20       int isOpen 
15f30 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  = 0;.      rc = 
15f40 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e  sqlite3PagerOpen
15f50 57 61 6c 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  Wal(pBt->pPager,
15f60 20 26 69 73 4f 70 65 6e 29 3b 0a 20 20 20 20 20   &isOpen);.     
15f70 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
15f80 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  OK ){.        go
15f90 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61  to page1_init_fa
15fa0 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d 65 6c 73  iled;.      }els
15fb0 65 20 69 66 28 20 69 73 4f 70 65 6e 3d 3d 30 20  e if( isOpen==0 
15fc0 29 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61  ){.        relea
15fd0 73 65 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a  sePage(pPage1);.
15fe0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
15ff0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
16000 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  }.      rc = SQL
16010 49 54 45 5f 4e 4f 54 41 44 42 3b 0a 20 20 20 20  ITE_NOTADB;.    
16020 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a  }.#endif..    /*
16030 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
16040 31 35 34 36 35 2d 32 30 38 31 33 20 54 68 65 20  15465-20813 The 
16050 6d 61 78 69 6d 75 6d 20 61 6e 64 20 6d 69 6e 69  maximum and mini
16060 6d 75 6d 20 65 6d 62 65 64 64 65 64 20 70 61 79  mum embedded pay
16070 6c 6f 61 64 0a 20 20 20 20 2a 2a 20 66 72 61 63  load.    ** frac
16080 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 6c 65  tions and the le
16090 61 66 20 70 61 79 6c 6f 61 64 20 66 72 61 63 74  af payload fract
160a0 69 6f 6e 20 76 61 6c 75 65 73 20 6d 75 73 74 20  ion values must 
160b0 62 65 20 36 34 2c 20 33 32 2c 20 61 6e 64 20 33  be 64, 32, and 3
160c0 32 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  2..    **.    **
160d0 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 65   The original de
160e0 73 69 67 6e 20 61 6c 6c 6f 77 65 64 20 74 68 65  sign allowed the
160f0 73 65 20 61 6d 6f 75 6e 74 73 20 74 6f 20 76 61  se amounts to va
16100 72 79 2c 20 62 75 74 20 61 73 20 6f 66 0a 20 20  ry, but as of.  
16110 20 20 2a 2a 20 76 65 72 73 69 6f 6e 20 33 2e 36    ** version 3.6
16120 2e 30 2c 20 77 65 20 72 65 71 75 69 72 65 20 74  .0, we require t
16130 68 65 6d 20 74 6f 20 62 65 20 66 69 78 65 64 2e  hem to be fixed.
16140 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
16150 6d 65 6d 63 6d 70 28 26 70 61 67 65 31 5b 32 31  memcmp(&page1[21
16160 5d 2c 20 22 5c 31 30 30 5c 30 34 30 5c 30 34 30  ], "\100\040\040
16170 22 2c 33 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ",3)!=0 ){.     
16180 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74   goto page1_init
16190 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20  _failed;.    }. 
161a0 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
161b0 46 3a 20 52 2d 35 31 38 37 33 2d 33 39 36 31 38  F: R-51873-39618
161c0 20 54 68 65 20 70 61 67 65 20 73 69 7a 65 20 66   The page size f
161d0 6f 72 20 61 20 64 61 74 61 62 61 73 65 20 66 69  or a database fi
161e0 6c 65 20 69 73 0a 20 20 20 20 2a 2a 20 64 65 74  le is.    ** det
161f0 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20 32  ermined by the 2
16200 2d 62 79 74 65 20 69 6e 74 65 67 65 72 20 6c 6f  -byte integer lo
16210 63 61 74 65 64 20 61 74 20 61 6e 20 6f 66 66 73  cated at an offs
16220 65 74 20 6f 66 20 31 36 20 62 79 74 65 73 20 66  et of 16 bytes f
16230 72 6f 6d 0a 20 20 20 20 2a 2a 20 74 68 65 20 62  rom.    ** the b
16240 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
16250 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a  database file. *
16260 2f 0a 20 20 20 20 70 61 67 65 53 69 7a 65 20 3d  /.    pageSize =
16270 20 28 70 61 67 65 31 5b 31 36 5d 3c 3c 38 29 20   (page1[16]<<8) 
16280 7c 20 28 70 61 67 65 31 5b 31 37 5d 3c 3c 31 36  | (page1[17]<<16
16290 29 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  );.    /* EVIDEN
162a0 43 45 2d 4f 46 3a 20 52 2d 32 35 30 30 38 2d 32  CE-OF: R-25008-2
162b0 31 36 38 38 20 54 68 65 20 73 69 7a 65 20 6f 66  1688 The size of
162c0 20 61 20 70 61 67 65 20 69 73 20 61 20 70 6f 77   a page is a pow
162d0 65 72 20 6f 66 20 74 77 6f 0a 20 20 20 20 2a 2a  er of two.    **
162e0 20 62 65 74 77 65 65 6e 20 35 31 32 20 61 6e 64   between 512 and
162f0 20 36 35 35 33 36 20 69 6e 63 6c 75 73 69 76 65   65536 inclusive
16300 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 28 70  . */.    if( ((p
16310 61 67 65 53 69 7a 65 2d 31 29 26 70 61 67 65 53  ageSize-1)&pageS
16320 69 7a 65 29 21 3d 30 0a 20 20 20 20 20 7c 7c 20  ize)!=0.     || 
16330 70 61 67 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f  pageSize>SQLITE_
16340 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 0a 20  MAX_PAGE_SIZE . 
16350 20 20 20 20 7c 7c 20 70 61 67 65 53 69 7a 65 3c      || pageSize<
16360 3d 32 35 36 20 0a 20 20 20 20 29 7b 0a 20 20 20  =256 .    ){.   
16370 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e     goto page1_in
16380 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d  it_failed;.    }
16390 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70 61  .    assert( (pa
163a0 67 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29  geSize & 7)==0 )
163b0 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43  ;.    /* EVIDENC
163c0 45 2d 4f 46 3a 20 52 2d 35 39 33 31 30 2d 35 31  E-OF: R-59310-51
163d0 32 30 35 20 54 68 65 20 22 72 65 73 65 72 76 65  205 The "reserve
163e0 64 20 73 70 61 63 65 22 20 73 69 7a 65 20 69 6e  d space" size in
163f0 20 74 68 65 20 31 2d 62 79 74 65 0a 20 20 20 20   the 1-byte.    
16400 2a 2a 20 69 6e 74 65 67 65 72 20 61 74 20 6f 66  ** integer at of
16410 66 73 65 74 20 32 30 20 69 73 20 74 68 65 20 6e  fset 20 is the n
16420 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f  umber of bytes o
16430 66 20 73 70 61 63 65 20 61 74 20 74 68 65 20 65  f space at the e
16440 6e 64 20 6f 66 0a 20 20 20 20 2a 2a 20 65 61 63  nd of.    ** eac
16450 68 20 70 61 67 65 20 74 6f 20 72 65 73 65 72 76  h page to reserv
16460 65 20 66 6f 72 20 65 78 74 65 6e 73 69 6f 6e 73  e for extensions
16470 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  . .    **.    **
16480 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
16490 33 37 34 39 37 2d 34 32 34 31 32 20 54 68 65 20  37497-42412 The 
164a0 73 69 7a 65 20 6f 66 20 74 68 65 20 72 65 73 65  size of the rese
164b0 72 76 65 64 20 72 65 67 69 6f 6e 20 69 73 0a 20  rved region is. 
164c0 20 20 20 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64     ** determined
164d0 20 62 79 20 74 68 65 20 6f 6e 65 2d 62 79 74 65   by the one-byte
164e0 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 65 67 65   unsigned intege
164f0 72 20 66 6f 75 6e 64 20 61 74 20 61 6e 20 6f 66  r found at an of
16500 66 73 65 74 20 6f 66 20 32 30 0a 20 20 20 20 2a  fset of 20.    *
16510 2a 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62  * into the datab
16520 61 73 65 20 66 69 6c 65 20 68 65 61 64 65 72 2e  ase file header.
16530 20 2a 2f 0a 20 20 20 20 75 73 61 62 6c 65 53 69   */.    usableSi
16540 7a 65 20 3d 20 70 61 67 65 53 69 7a 65 20 2d 20  ze = pageSize - 
16550 70 61 67 65 31 5b 32 30 5d 3b 0a 20 20 20 20 69  page1[20];.    i
16560 66 28 20 28 75 33 32 29 70 61 67 65 53 69 7a 65  f( (u32)pageSize
16570 21 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  !=pBt->pageSize 
16580 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 66 74 65  ){.      /* Afte
16590 72 20 72 65 61 64 69 6e 67 20 74 68 65 20 66 69  r reading the fi
165a0 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20  rst page of the 
165b0 64 61 74 61 62 61 73 65 20 61 73 73 75 6d 69 6e  database assumin
165c0 67 20 61 20 70 61 67 65 20 73 69 7a 65 0a 20 20  g a page size.  
165d0 20 20 20 20 2a 2a 20 6f 66 20 42 74 53 68 61 72      ** of BtShar
165e0 65 64 2e 70 61 67 65 53 69 7a 65 2c 20 77 65 20  ed.pageSize, we 
165f0 68 61 76 65 20 64 69 73 63 6f 76 65 72 65 64 20  have discovered 
16600 74 68 61 74 20 74 68 65 20 70 61 67 65 2d 73 69  that the page-si
16610 7a 65 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 61  ze is.      ** a
16620 63 74 75 61 6c 6c 79 20 70 61 67 65 53 69 7a 65  ctually pageSize
16630 2e 20 55 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74  . Unlock the dat
16640 61 62 61 73 65 2c 20 6c 65 61 76 65 20 70 42 74  abase, leave pBt
16650 2d 3e 70 50 61 67 65 31 20 61 74 0a 20 20 20 20  ->pPage1 at.    
16660 20 20 2a 2a 20 7a 65 72 6f 20 61 6e 64 20 72 65    ** zero and re
16670 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20  turn SQLITE_OK. 
16680 54 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20  The caller will 
16690 63 61 6c 6c 20 74 68 69 73 20 66 75 6e 63 74 69  call this functi
166a0 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 61 67 61 69  on.      ** agai
166b0 6e 20 77 69 74 68 20 74 68 65 20 63 6f 72 72 65  n with the corre
166c0 63 74 20 70 61 67 65 2d 73 69 7a 65 2e 0a 20 20  ct page-size..  
166d0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 65 6c      */.      rel
166e0 65 61 73 65 50 61 67 65 28 70 50 61 67 65 31 29  easePage(pPage1)
166f0 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 75 73 61  ;.      pBt->usa
16700 62 6c 65 53 69 7a 65 20 3d 20 75 73 61 62 6c 65  bleSize = usable
16710 53 69 7a 65 3b 0a 20 20 20 20 20 20 70 42 74 2d  Size;.      pBt-
16720 3e 70 61 67 65 53 69 7a 65 20 3d 20 70 61 67 65  >pageSize = page
16730 53 69 7a 65 3b 0a 20 20 20 20 20 20 66 72 65 65  Size;.      free
16740 54 65 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a  TempSpace(pBt);.
16750 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
16760 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73 69  e3PagerSetPagesi
16770 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  ze(pBt->pPager, 
16780 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2c 0a  &pBt->pageSize,.
16790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
167a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
167b0 20 20 20 70 61 67 65 53 69 7a 65 2d 75 73 61 62     pageSize-usab
167c0 6c 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 72  leSize);.      r
167d0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
167e0 20 20 20 20 69 66 28 20 28 70 42 74 2d 3e 64 62      if( (pBt->db
167f0 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
16800 5f 52 65 63 6f 76 65 72 79 4d 6f 64 65 29 3d 3d  _RecoveryMode)==
16810 30 20 26 26 20 6e 50 61 67 65 3e 6e 50 61 67 65  0 && nPage>nPage
16820 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 72 63  File ){.      rc
16830 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
16840 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f  T_BKPT;.      go
16850 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61  to page1_init_fa
16860 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20  iled;.    }.    
16870 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
16880 52 2d 32 38 33 31 32 2d 36 34 37 30 34 20 48 6f  R-28312-64704 Ho
16890 77 65 76 65 72 2c 20 74 68 65 20 75 73 61 62 6c  wever, the usabl
168a0 65 20 73 69 7a 65 20 69 73 20 6e 6f 74 20 61 6c  e size is not al
168b0 6c 6f 77 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20  lowed to.    ** 
168c0 62 65 20 6c 65 73 73 20 74 68 61 6e 20 34 38 30  be less than 480
168d0 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73  . In other words
168e0 2c 20 69 66 20 74 68 65 20 70 61 67 65 20 73 69  , if the page si
168f0 7a 65 20 69 73 20 35 31 32 2c 20 74 68 65 6e 20  ze is 512, then 
16900 74 68 65 0a 20 20 20 20 2a 2a 20 72 65 73 65 72  the.    ** reser
16910 76 65 64 20 73 70 61 63 65 20 73 69 7a 65 20 63  ved space size c
16920 61 6e 6e 6f 74 20 65 78 63 65 65 64 20 33 32 2e  annot exceed 32.
16930 20 2a 2f 0a 20 20 20 20 69 66 28 20 75 73 61 62   */.    if( usab
16940 6c 65 53 69 7a 65 3c 34 38 30 20 29 7b 0a 20 20  leSize<480 ){.  
16950 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69      goto page1_i
16960 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20  nit_failed;.    
16970 7d 0a 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53  }.    pBt->pageS
16980 69 7a 65 20 3d 20 70 61 67 65 53 69 7a 65 3b 0a  ize = pageSize;.
16990 20 20 20 20 70 42 74 2d 3e 75 73 61 62 6c 65 53      pBt->usableS
169a0 69 7a 65 20 3d 20 75 73 61 62 6c 65 53 69 7a 65  ize = usableSize
169b0 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
169c0 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
169d0 0a 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61  .    pBt->autoVa
169e0 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65  cuum = (get4byte
169f0 28 26 70 61 67 65 31 5b 33 36 20 2b 20 34 2a 34  (&page1[36 + 4*4
16a00 5d 29 3f 31 3a 30 29 3b 0a 20 20 20 20 70 42 74  ])?1:0);.    pBt
16a10 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 28  ->incrVacuum = (
16a20 67 65 74 34 62 79 74 65 28 26 70 61 67 65 31 5b  get4byte(&page1[
16a30 33 36 20 2b 20 37 2a 34 5d 29 3f 31 3a 30 29 3b  36 + 7*4])?1:0);
16a40 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 2f  .#endif.  }..  /
16a50 2a 20 6d 61 78 4c 6f 63 61 6c 20 69 73 20 74 68  * maxLocal is th
16a60 65 20 6d 61 78 69 6d 75 6d 20 61 6d 6f 75 6e 74  e maximum amount
16a70 20 6f 66 20 70 61 79 6c 6f 61 64 20 74 6f 20 73   of payload to s
16a80 74 6f 72 65 20 6c 6f 63 61 6c 6c 79 20 66 6f 72  tore locally for
16a90 0a 20 20 2a 2a 20 61 20 63 65 6c 6c 2e 20 20 4d  .  ** a cell.  M
16aa0 61 6b 65 20 73 75 72 65 20 69 74 20 69 73 20 73  ake sure it is s
16ab0 6d 61 6c 6c 20 65 6e 6f 75 67 68 20 73 6f 20 74  mall enough so t
16ac0 68 61 74 20 61 74 20 6c 65 61 73 74 20 6d 69 6e  hat at least min
16ad0 46 61 6e 6f 75 74 0a 20 20 2a 2a 20 63 65 6c 6c  Fanout.  ** cell
16ae0 73 20 63 61 6e 20 77 69 6c 6c 20 66 69 74 20 6f  s can will fit o
16af0 6e 20 6f 6e 65 20 70 61 67 65 2e 20 20 57 65 20  n one page.  We 
16b00 61 73 73 75 6d 65 20 61 20 31 30 2d 62 79 74 65  assume a 10-byte
16b10 20 70 61 67 65 20 68 65 61 64 65 72 2e 0a 20 20   page header..  
16b20 2a 2a 20 42 65 73 69 64 65 73 20 74 68 65 20 70  ** Besides the p
16b30 61 79 6c 6f 61 64 2c 20 74 68 65 20 63 65 6c 6c  ayload, the cell
16b40 20 6d 75 73 74 20 73 74 6f 72 65 3a 0a 20 20 2a   must store:.  *
16b50 2a 20 20 20 20 20 32 2d 62 79 74 65 20 70 6f 69  *     2-byte poi
16b60 6e 74 65 72 20 74 6f 20 74 68 65 20 63 65 6c 6c  nter to the cell
16b70 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62 79 74 65  .  **     4-byte
16b80 20 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 0a 20   child pointer. 
16b90 20 2a 2a 20 20 20 20 20 39 2d 62 79 74 65 20 6e   **     9-byte n
16ba0 4b 65 79 20 76 61 6c 75 65 0a 20 20 2a 2a 20 20  Key value.  **  
16bb0 20 20 20 34 2d 62 79 74 65 20 6e 44 61 74 61 20     4-byte nData 
16bc0 76 61 6c 75 65 0a 20 20 2a 2a 20 20 20 20 20 34  value.  **     4
16bd0 2d 62 79 74 65 20 6f 76 65 72 66 6c 6f 77 20 70  -byte overflow p
16be0 61 67 65 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a  age pointer.  **
16bf0 20 53 6f 20 61 20 63 65 6c 6c 20 63 6f 6e 73 69   So a cell consi
16c00 73 74 73 20 6f 66 20 61 20 32 2d 62 79 74 65 20  sts of a 2-byte 
16c10 70 6f 69 6e 74 65 72 2c 20 61 20 68 65 61 64 65  pointer, a heade
16c20 72 20 77 68 69 63 68 20 69 73 20 61 73 20 6d 75  r which is as mu
16c30 63 68 20 61 73 0a 20 20 2a 2a 20 31 37 20 62 79  ch as.  ** 17 by
16c40 74 65 73 20 6c 6f 6e 67 2c 20 30 20 74 6f 20 4e  tes long, 0 to N
16c50 20 62 79 74 65 73 20 6f 66 20 70 61 79 6c 6f 61   bytes of payloa
16c60 64 2c 20 61 6e 64 20 61 6e 20 6f 70 74 69 6f 6e  d, and an option
16c70 61 6c 20 34 20 62 79 74 65 20 6f 76 65 72 66 6c  al 4 byte overfl
16c80 6f 77 0a 20 20 2a 2a 20 70 61 67 65 20 70 6f 69  ow.  ** page poi
16c90 6e 74 65 72 2e 0a 20 20 2a 2f 0a 20 20 70 42 74  nter..  */.  pBt
16ca0 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 28 75 31  ->maxLocal = (u1
16cb0 36 29 28 28 70 42 74 2d 3e 75 73 61 62 6c 65 53  6)((pBt->usableS
16cc0 69 7a 65 2d 31 32 29 2a 36 34 2f 32 35 35 20 2d  ize-12)*64/255 -
16cd0 20 32 33 29 3b 0a 20 20 70 42 74 2d 3e 6d 69 6e   23);.  pBt->min
16ce0 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 28 28 70  Local = (u16)((p
16cf0 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31  Bt->usableSize-1
16d00 32 29 2a 33 32 2f 32 35 35 20 2d 20 32 33 29 3b  2)*32/255 - 23);
16d10 0a 20 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66 20  .  pBt->maxLeaf 
16d20 3d 20 28 75 31 36 29 28 70 42 74 2d 3e 75 73 61  = (u16)(pBt->usa
16d30 62 6c 65 53 69 7a 65 20 2d 20 33 35 29 3b 0a 20  bleSize - 35);. 
16d40 20 70 42 74 2d 3e 6d 69 6e 4c 65 61 66 20 3d 20   pBt->minLeaf = 
16d50 28 75 31 36 29 28 28 70 42 74 2d 3e 75 73 61 62  (u16)((pBt->usab
16d60 6c 65 53 69 7a 65 2d 31 32 29 2a 33 32 2f 32 35  leSize-12)*32/25
16d70 35 20 2d 20 32 33 29 3b 0a 20 20 69 66 28 20 70  5 - 23);.  if( p
16d80 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3e 31 32 37  Bt->maxLocal>127
16d90 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e 6d 61 78   ){.    pBt->max
16da0 31 62 79 74 65 50 61 79 6c 6f 61 64 20 3d 20 31  1bytePayload = 1
16db0 32 37 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  27;.  }else{.   
16dc0 20 70 42 74 2d 3e 6d 61 78 31 62 79 74 65 50 61   pBt->max1bytePa
16dd0 79 6c 6f 61 64 20 3d 20 28 75 38 29 70 42 74 2d  yload = (u8)pBt-
16de0 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20 7d 0a 20  >maxLocal;.  }. 
16df0 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6d 61   assert( pBt->ma
16e00 78 4c 65 61 66 20 2b 20 32 33 20 3c 3d 20 4d 58  xLeaf + 23 <= MX
16e10 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20  _CELL_SIZE(pBt) 
16e20 29 3b 0a 20 20 70 42 74 2d 3e 70 50 61 67 65 31  );.  pBt->pPage1
16e30 20 3d 20 70 50 61 67 65 31 3b 0a 20 20 70 42 74   = pPage1;.  pBt
16e40 2d 3e 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 3b  ->nPage = nPage;
16e50 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
16e60 5f 4f 4b 3b 0a 0a 70 61 67 65 31 5f 69 6e 69 74  _OK;..page1_init
16e70 5f 66 61 69 6c 65 64 3a 0a 20 20 72 65 6c 65 61  _failed:.  relea
16e80 73 65 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a  sePage(pPage1);.
16e90 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20    pBt->pPage1 = 
16ea0 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  0;.  return rc;.
16eb0 7d 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  }..#ifndef NDEBU
16ec0 47 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  G./*.** Return t
16ed0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 75 72  he number of cur
16ee0 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 70 42 74  sors open on pBt
16ef0 2e 20 54 68 69 73 20 69 73 20 66 6f 72 20 75 73  . This is for us
16f00 65 0a 2a 2a 20 69 6e 20 61 73 73 65 72 74 28 29  e.** in assert()
16f10 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 20 73 6f   expressions, so
16f20 20 69 74 20 69 73 20 6f 6e 6c 79 20 63 6f 6d 70   it is only comp
16f30 69 6c 65 64 20 69 66 20 4e 44 45 42 55 47 20 69  iled if NDEBUG i
16f40 73 20 6e 6f 74 0a 2a 2a 20 64 65 66 69 6e 65 64  s not.** defined
16f50 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 77 72 69  ..**.** Only wri
16f60 74 65 20 63 75 72 73 6f 72 73 20 61 72 65 20 63  te cursors are c
16f70 6f 75 6e 74 65 64 20 69 66 20 77 72 4f 6e 6c 79  ounted if wrOnly
16f80 20 69 73 20 74 72 75 65 2e 20 20 49 66 20 77 72   is true.  If wr
16f90 4f 6e 6c 79 20 69 73 0a 2a 2a 20 66 61 6c 73 65  Only is.** false
16fa0 20 74 68 65 6e 20 61 6c 6c 20 63 75 72 73 6f 72   then all cursor
16fb0 73 20 61 72 65 20 63 6f 75 6e 74 65 64 2e 0a 2a  s are counted..*
16fc0 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 70 75 72  *.** For the pur
16fd0 70 6f 73 65 73 20 6f 66 20 74 68 69 73 20 72 6f  poses of this ro
16fe0 75 74 69 6e 65 2c 20 61 20 63 75 72 73 6f 72 20  utine, a cursor 
16ff0 69 73 20 61 6e 79 20 63 75 72 73 6f 72 20 74 68  is any cursor th
17000 61 74 0a 2a 2a 20 69 73 20 63 61 70 61 62 6c 65  at.** is capable
17010 20 6f 66 20 72 65 61 64 69 6e 67 20 6f 72 20 77   of reading or w
17020 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 64 61  riting to the da
17030 74 61 62 61 73 65 2e 20 20 43 75 72 73 6f 72 73  tabase.  Cursors
17040 20 74 68 61 74 0a 2a 2a 20 68 61 76 65 20 62 65   that.** have be
17050 65 6e 20 74 72 69 70 70 65 64 20 69 6e 74 6f 20  en tripped into 
17060 74 68 65 20 43 55 52 53 4f 52 5f 46 41 55 4c 54  the CURSOR_FAULT
17070 20 73 74 61 74 65 20 61 72 65 20 6e 6f 74 20 63   state are not c
17080 6f 75 6e 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  ounted..*/.stati
17090 63 20 69 6e 74 20 63 6f 75 6e 74 56 61 6c 69 64  c int countValid
170a0 43 75 72 73 6f 72 73 28 42 74 53 68 61 72 65 64  Cursors(BtShared
170b0 20 2a 70 42 74 2c 20 69 6e 74 20 77 72 4f 6e 6c   *pBt, int wrOnl
170c0 79 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  y){.  BtCursor *
170d0 70 43 75 72 3b 0a 20 20 69 6e 74 20 72 20 3d 20  pCur;.  int r = 
170e0 30 3b 0a 20 20 66 6f 72 28 70 43 75 72 3d 70 42  0;.  for(pCur=pB
170f0 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 43 75 72  t->pCursor; pCur
17100 3b 20 70 43 75 72 3d 70 43 75 72 2d 3e 70 4e 65  ; pCur=pCur->pNe
17110 78 74 29 7b 0a 20 20 20 20 69 66 28 20 28 77 72  xt){.    if( (wr
17120 4f 6e 6c 79 3d 3d 30 20 7c 7c 20 28 70 43 75 72  Only==0 || (pCur
17130 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43  ->curFlags & BTC
17140 46 5f 57 72 69 74 65 46 6c 61 67 29 21 3d 30 29  F_WriteFlag)!=0)
17150 0a 20 20 20 20 20 26 26 20 70 43 75 72 2d 3e 65  .     && pCur->e
17160 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 46 41  State!=CURSOR_FA
17170 55 4c 54 20 29 20 72 2b 2b 3b 20 0a 20 20 7d 0a  ULT ) r++; .  }.
17180 20 20 72 65 74 75 72 6e 20 72 3b 0a 7d 0a 23 65    return r;.}.#e
17190 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74  ndif../*.** If t
171a0 68 65 72 65 20 61 72 65 20 6e 6f 20 6f 75 74 73  here are no outs
171b0 74 61 6e 64 69 6e 67 20 63 75 72 73 6f 72 73 20  tanding cursors 
171c0 61 6e 64 20 77 65 20 61 72 65 20 6e 6f 74 20 69  and we are not i
171d0 6e 20 74 68 65 20 6d 69 64 64 6c 65 0a 2a 2a 20  n the middle.** 
171e0 6f 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  of a transaction
171f0 20 62 75 74 20 74 68 65 72 65 20 69 73 20 61 20   but there is a 
17200 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  read lock on the
17210 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e 0a   database, then.
17220 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ** this routine 
17230 75 6e 72 65 66 73 20 74 68 65 20 66 69 72 73 74  unrefs the first
17240 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61 74   page of the dat
17250 61 62 61 73 65 20 66 69 6c 65 20 77 68 69 63 68  abase file which
17260 20 0a 2a 2a 20 68 61 73 20 74 68 65 20 65 66 66   .** has the eff
17270 65 63 74 20 6f 66 20 72 65 6c 65 61 73 69 6e 67  ect of releasing
17280 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a   the read lock..
17290 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 69  **.** If there i
172a0 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  s a transaction 
172b0 69 6e 20 70 72 6f 67 72 65 73 73 2c 20 74 68 69  in progress, thi
172c0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
172d0 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  o-op..*/.static 
172e0 76 6f 69 64 20 75 6e 6c 6f 63 6b 42 74 72 65 65  void unlockBtree
172f0 49 66 55 6e 75 73 65 64 28 42 74 53 68 61 72 65  IfUnused(BtShare
17300 64 20 2a 70 42 74 29 7b 0a 20 20 61 73 73 65 72  d *pBt){.  asser
17310 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
17320 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
17330 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63  ) );.  assert( c
17340 6f 75 6e 74 56 61 6c 69 64 43 75 72 73 6f 72 73  ountValidCursors
17350 28 70 42 74 2c 30 29 3d 3d 30 20 7c 7c 20 70 42  (pBt,0)==0 || pB
17360 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
17370 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 3b 0a 20  >TRANS_NONE );. 
17380 20 69 66 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e   if( pBt->inTran
17390 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 4e  saction==TRANS_N
173a0 4f 4e 45 20 26 26 20 70 42 74 2d 3e 70 50 61 67  ONE && pBt->pPag
173b0 65 31 21 3d 30 20 29 7b 0a 20 20 20 20 4d 65 6d  e1!=0 ){.    Mem
173c0 50 61 67 65 20 2a 70 50 61 67 65 31 20 3d 20 70  Page *pPage1 = p
173d0 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20 20 20  Bt->pPage1;.    
173e0 61 73 73 65 72 74 28 20 70 50 61 67 65 31 2d 3e  assert( pPage1->
173f0 61 44 61 74 61 20 29 3b 0a 20 20 20 20 61 73 73  aData );.    ass
17400 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
17410 72 52 65 66 63 6f 75 6e 74 28 70 42 74 2d 3e 70  rRefcount(pBt->p
17420 50 61 67 65 72 29 3d 3d 31 20 29 3b 0a 20 20 20  Pager)==1 );.   
17430 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 30   pBt->pPage1 = 0
17440 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67  ;.    releasePag
17450 65 28 70 50 61 67 65 31 29 3b 0a 20 20 7d 0a 7d  e(pPage1);.  }.}
17460 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70 42 74 20 70  ../*.** If pBt p
17470 6f 69 6e 74 73 20 74 6f 20 61 6e 20 65 6d 70 74  oints to an empt
17480 79 20 66 69 6c 65 20 74 68 65 6e 20 63 6f 6e 76  y file then conv
17490 65 72 74 20 74 68 61 74 20 65 6d 70 74 79 20 66  ert that empty f
174a0 69 6c 65 0a 2a 2a 20 69 6e 74 6f 20 61 20 6e 65  ile.** into a ne
174b0 77 20 65 6d 70 74 79 20 64 61 74 61 62 61 73 65  w empty database
174c0 20 62 79 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67   by initializing
174d0 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20   the first page 
174e0 6f 66 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61  of.** the databa
174f0 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  se..*/.static in
17500 74 20 6e 65 77 44 61 74 61 62 61 73 65 28 42 74  t newDatabase(Bt
17510 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20  Shared *pBt){.  
17520 4d 65 6d 50 61 67 65 20 2a 70 50 31 3b 0a 20 20  MemPage *pP1;.  
17530 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64  unsigned char *d
17540 61 74 61 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  ata;.  int rc;..
17550 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
17560 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
17570 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66  ->mutex) );.  if
17580 28 20 70 42 74 2d 3e 6e 50 61 67 65 3e 30 20 29  ( pBt->nPage>0 )
17590 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
175a0 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 50  ITE_OK;.  }.  pP
175b0 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b  1 = pBt->pPage1;
175c0 0a 20 20 61 73 73 65 72 74 28 20 70 50 31 21 3d  .  assert( pP1!=
175d0 30 20 29 3b 0a 20 20 64 61 74 61 20 3d 20 70 50  0 );.  data = pP
175e0 31 2d 3e 61 44 61 74 61 3b 0a 20 20 72 63 20 3d  1->aData;.  rc =
175f0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
17600 74 65 28 70 50 31 2d 3e 70 44 62 50 61 67 65 29  te(pP1->pDbPage)
17610 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
17620 75 72 6e 20 72 63 3b 0a 20 20 6d 65 6d 63 70 79  urn rc;.  memcpy
17630 28 64 61 74 61 2c 20 7a 4d 61 67 69 63 48 65 61  (data, zMagicHea
17640 64 65 72 2c 20 73 69 7a 65 6f 66 28 7a 4d 61 67  der, sizeof(zMag
17650 69 63 48 65 61 64 65 72 29 29 3b 0a 20 20 61 73  icHeader));.  as
17660 73 65 72 74 28 20 73 69 7a 65 6f 66 28 7a 4d 61  sert( sizeof(zMa
17670 67 69 63 48 65 61 64 65 72 29 3d 3d 31 36 20 29  gicHeader)==16 )
17680 3b 0a 20 20 64 61 74 61 5b 31 36 5d 20 3d 20 28  ;.  data[16] = (
17690 75 38 29 28 28 70 42 74 2d 3e 70 61 67 65 53 69  u8)((pBt->pageSi
176a0 7a 65 3e 3e 38 29 26 30 78 66 66 29 3b 0a 20 20  ze>>8)&0xff);.  
176b0 64 61 74 61 5b 31 37 5d 20 3d 20 28 75 38 29 28  data[17] = (u8)(
176c0 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3e  (pBt->pageSize>>
176d0 31 36 29 26 30 78 66 66 29 3b 0a 20 20 64 61 74  16)&0xff);.  dat
176e0 61 5b 31 38 5d 20 3d 20 31 3b 0a 20 20 64 61 74  a[18] = 1;.  dat
176f0 61 5b 31 39 5d 20 3d 20 31 3b 0a 20 20 61 73 73  a[19] = 1;.  ass
17700 65 72 74 28 20 70 42 74 2d 3e 75 73 61 62 6c 65  ert( pBt->usable
17710 53 69 7a 65 3c 3d 70 42 74 2d 3e 70 61 67 65 53  Size<=pBt->pageS
17720 69 7a 65 20 26 26 20 70 42 74 2d 3e 75 73 61 62  ize && pBt->usab
17730 6c 65 53 69 7a 65 2b 32 35 35 3e 3d 70 42 74 2d  leSize+255>=pBt-
17740 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 64 61  >pageSize);.  da
17750 74 61 5b 32 30 5d 20 3d 20 28 75 38 29 28 70 42  ta[20] = (u8)(pB
17760 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 42  t->pageSize - pB
17770 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a  t->usableSize);.
17780 20 20 64 61 74 61 5b 32 31 5d 20 3d 20 36 34 3b    data[21] = 64;
17790 0a 20 20 64 61 74 61 5b 32 32 5d 20 3d 20 33 32  .  data[22] = 32
177a0 3b 0a 20 20 64 61 74 61 5b 32 33 5d 20 3d 20 33  ;.  data[23] = 3
177b0 32 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74  2;.  memset(&dat
177c0 61 5b 32 34 5d 2c 20 30 2c 20 31 30 30 2d 32 34  a[24], 0, 100-24
177d0 29 3b 0a 20 20 7a 65 72 6f 50 61 67 65 28 70 50  );.  zeroPage(pP
177e0 31 2c 20 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54  1, PTF_INTKEY|PT
177f0 46 5f 4c 45 41 46 7c 50 54 46 5f 4c 45 41 46 44  F_LEAF|PTF_LEAFD
17800 41 54 41 20 29 3b 0a 20 20 70 42 74 2d 3e 62 74  ATA );.  pBt->bt
17810 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 50 41  sFlags |= BTS_PA
17820 47 45 53 49 5a 45 5f 46 49 58 45 44 3b 0a 23 69  GESIZE_FIXED;.#i
17830 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
17840 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 61  T_AUTOVACUUM.  a
17850 73 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f  ssert( pBt->auto
17860 56 61 63 75 75 6d 3d 3d 31 20 7c 7c 20 70 42 74  Vacuum==1 || pBt
17870 2d 3e 61 75 74 6f 56 61 63 75 75 6d 3d 3d 30 20  ->autoVacuum==0 
17880 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  );.  assert( pBt
17890 2d 3e 69 6e 63 72 56 61 63 75 75 6d 3d 3d 31 20  ->incrVacuum==1 
178a0 7c 7c 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75  || pBt->incrVacu
178b0 75 6d 3d 3d 30 20 29 3b 0a 20 20 70 75 74 34 62  um==0 );.  put4b
178c0 79 74 65 28 26 64 61 74 61 5b 33 36 20 2b 20 34  yte(&data[36 + 4
178d0 2a 34 5d 2c 20 70 42 74 2d 3e 61 75 74 6f 56 61  *4], pBt->autoVa
178e0 63 75 75 6d 29 3b 0a 20 20 70 75 74 34 62 79 74  cuum);.  put4byt
178f0 65 28 26 64 61 74 61 5b 33 36 20 2b 20 37 2a 34  e(&data[36 + 7*4
17900 5d 2c 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75  ], pBt->incrVacu
17910 75 6d 29 3b 0a 23 65 6e 64 69 66 0a 20 20 70 42  um);.#endif.  pB
17920 74 2d 3e 6e 50 61 67 65 20 3d 20 31 3b 0a 20 20  t->nPage = 1;.  
17930 64 61 74 61 5b 33 31 5d 20 3d 20 31 3b 0a 20 20  data[31] = 1;.  
17940 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
17950 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69  ;.}../*.** Initi
17960 61 6c 69 7a 65 20 74 68 65 20 66 69 72 73 74 20  alize the first 
17970 70 61 67 65 20 6f 66 20 74 68 65 20 64 61 74 61  page of the data
17980 62 61 73 65 20 66 69 6c 65 20 28 63 72 65 61 74  base file (creat
17990 69 6e 67 20 61 20 64 61 74 61 62 61 73 65 0a 2a  ing a database.*
179a0 2a 20 63 6f 6e 73 69 73 74 69 6e 67 20 6f 66 20  * consisting of 
179b0 61 20 73 69 6e 67 6c 65 20 70 61 67 65 20 61 6e  a single page an
179c0 64 20 6e 6f 20 73 63 68 65 6d 61 20 6f 62 6a 65  d no schema obje
179d0 63 74 73 29 2e 20 52 65 74 75 72 6e 20 53 51 4c  cts). Return SQL
179e0 49 54 45 5f 4f 4b 0a 2a 2a 20 69 66 20 73 75 63  ITE_OK.** if suc
179f0 63 65 73 73 66 75 6c 2c 20 6f 72 20 61 6e 20 53  cessful, or an S
17a00 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
17a10 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 69   otherwise..*/.i
17a20 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e  nt sqlite3BtreeN
17a30 65 77 44 62 28 42 74 72 65 65 20 2a 70 29 7b 0a  ewDb(Btree *p){.
17a40 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69    int rc;.  sqli
17a50 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
17a60 3b 0a 20 20 70 2d 3e 70 42 74 2d 3e 6e 50 61 67  ;.  p->pBt->nPag
17a70 65 20 3d 20 30 3b 0a 20 20 72 63 20 3d 20 6e 65  e = 0;.  rc = ne
17a80 77 44 61 74 61 62 61 73 65 28 70 2d 3e 70 42 74  wDatabase(p->pBt
17a90 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
17aa0 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
17ab0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
17ac0 20 41 74 74 65 6d 70 74 20 74 6f 20 73 74 61 72   Attempt to star
17ad0 74 20 61 20 6e 65 77 20 74 72 61 6e 73 61 63 74  t a new transact
17ae0 69 6f 6e 2e 20 41 20 77 72 69 74 65 2d 74 72 61  ion. A write-tra
17af0 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 73  nsaction.** is s
17b00 74 61 72 74 65 64 20 69 66 20 74 68 65 20 73 65  tarted if the se
17b10 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73  cond argument is
17b20 20 6e 6f 6e 7a 65 72 6f 2c 20 6f 74 68 65 72 77   nonzero, otherw
17b30 69 73 65 20 61 20 72 65 61 64 2d 0a 2a 2a 20 74  ise a read-.** t
17b40 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 49 66 20  ransaction.  If 
17b50 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
17b60 65 6e 74 20 69 73 20 32 20 6f 72 20 6d 6f 72 65  ent is 2 or more
17b70 20 61 6e 64 20 65 78 63 6c 75 73 69 76 65 0a 2a   and exclusive.*
17b80 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  * transaction is
17b90 20 73 74 61 72 74 65 64 2c 20 6d 65 61 6e 69 6e   started, meanin
17ba0 67 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20  g that no other 
17bb0 70 72 6f 63 65 73 73 20 69 73 20 61 6c 6c 6f 77  process is allow
17bc0 65 64 0a 2a 2a 20 74 6f 20 61 63 63 65 73 73 20  ed.** to access 
17bd0 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 41  the database.  A
17be0 20 70 72 65 65 78 69 73 74 69 6e 67 20 74 72 61   preexisting tra
17bf0 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20 6e 6f 74  nsaction may not
17c00 20 62 65 0a 2a 2a 20 75 70 67 72 61 64 65 64 20   be.** upgraded 
17c10 74 6f 20 65 78 63 6c 75 73 69 76 65 20 62 79 20  to exclusive by 
17c20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75  calling this rou
17c30 74 69 6e 65 20 61 20 73 65 63 6f 6e 64 20 74 69  tine a second ti
17c40 6d 65 20 2d 20 74 68 65 0a 2a 2a 20 65 78 63 6c  me - the.** excl
17c50 75 73 69 76 69 74 79 20 66 6c 61 67 20 6f 6e 6c  usivity flag onl
17c60 79 20 77 6f 72 6b 73 20 66 6f 72 20 61 20 6e 65  y works for a ne
17c70 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  w transaction..*
17c80 2a 0a 2a 2a 20 41 20 77 72 69 74 65 2d 74 72 61  *.** A write-tra
17c90 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65  nsaction must be
17ca0 20 73 74 61 72 74 65 64 20 62 65 66 6f 72 65 20   started before 
17cb0 61 74 74 65 6d 70 74 69 6e 67 20 61 6e 79 20 0a  attempting any .
17cc0 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68  ** changes to th
17cd0 65 20 64 61 74 61 62 61 73 65 2e 20 20 4e 6f 6e  e database.  Non
17ce0 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
17cf0 6e 67 20 72 6f 75 74 69 6e 65 73 20 0a 2a 2a 20  ng routines .** 
17d00 77 69 6c 6c 20 77 6f 72 6b 20 75 6e 6c 65 73 73  will work unless
17d10 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
17d20 73 20 73 74 61 72 74 65 64 20 66 69 72 73 74 3a  s started first:
17d30 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69  .**.**      sqli
17d40 74 65 33 42 74 72 65 65 43 72 65 61 74 65 54 61  te3BtreeCreateTa
17d50 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71  ble().**      sq
17d60 6c 69 74 65 33 42 74 72 65 65 43 72 65 61 74 65  lite3BtreeCreate
17d70 49 6e 64 65 78 28 29 0a 2a 2a 20 20 20 20 20 20  Index().**      
17d80 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61  sqlite3BtreeClea
17d90 72 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20  rTable().**     
17da0 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 72 6f   sqlite3BtreeDro
17db0 70 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20  pTable().**     
17dc0 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 73   sqlite3BtreeIns
17dd0 65 72 74 28 29 0a 2a 2a 20 20 20 20 20 20 73 71  ert().**      sq
17de0 6c 69 74 65 33 42 74 72 65 65 44 65 6c 65 74 65  lite3BtreeDelete
17df0 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74  ().**      sqlit
17e00 65 33 42 74 72 65 65 55 70 64 61 74 65 4d 65 74  e3BtreeUpdateMet
17e10 61 28 29 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  a().**.** If an 
17e20 69 6e 69 74 69 61 6c 20 61 74 74 65 6d 70 74 20  initial attempt 
17e30 74 6f 20 61 63 71 75 69 72 65 20 74 68 65 20 6c  to acquire the l
17e40 6f 63 6b 20 66 61 69 6c 73 20 62 65 63 61 75 73  ock fails becaus
17e50 65 20 6f 66 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e  e of lock conten
17e60 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 74 68 65 20  tion.** and the 
17e70 64 61 74 61 62 61 73 65 20 77 61 73 20 70 72 65  database was pre
17e80 76 69 6f 75 73 6c 79 20 75 6e 6c 6f 63 6b 65 64  viously unlocked
17e90 2c 20 74 68 65 6e 20 69 6e 76 6f 6b 65 20 74 68  , then invoke th
17ea0 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 0a 2a  e busy handler.*
17eb0 2a 20 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e  * if there is on
17ec0 65 2e 20 20 42 75 74 20 69 66 20 74 68 65 72 65  e.  But if there
17ed0 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20   was previously 
17ee0 61 20 72 65 61 64 2d 6c 6f 63 6b 2c 20 64 6f 20  a read-lock, do 
17ef0 6e 6f 74 0a 2a 2a 20 69 6e 76 6f 6b 65 20 74 68  not.** invoke th
17f00 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20 2d  e busy handler -
17f10 20 6a 75 73 74 20 72 65 74 75 72 6e 20 53 51 4c   just return SQL
17f20 49 54 45 5f 42 55 53 59 2e 20 20 53 51 4c 49 54  ITE_BUSY.  SQLIT
17f30 45 5f 42 55 53 59 20 69 73 20 0a 2a 2a 20 72 65  E_BUSY is .** re
17f40 74 75 72 6e 65 64 20 77 68 65 6e 20 74 68 65 72  turned when ther
17f50 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 20 72  e is already a r
17f60 65 61 64 2d 6c 6f 63 6b 20 69 6e 20 6f 72 64 65  ead-lock in orde
17f70 72 20 74 6f 20 61 76 6f 69 64 20 61 20 64 65 61  r to avoid a dea
17f80 64 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 75 70  dlock..**.** Sup
17f90 70 6f 73 65 20 74 68 65 72 65 20 61 72 65 20 74  pose there are t
17fa0 77 6f 20 70 72 6f 63 65 73 73 65 73 20 41 20 61  wo processes A a
17fb0 6e 64 20 42 2e 20 20 41 20 68 61 73 20 61 20 72  nd B.  A has a r
17fc0 65 61 64 20 6c 6f 63 6b 20 61 6e 64 20 42 20 68  ead lock and B h
17fd0 61 73 0a 2a 2a 20 61 20 72 65 73 65 72 76 65 64  as.** a reserved
17fe0 20 6c 6f 63 6b 2e 20 20 42 20 74 72 69 65 73 20   lock.  B tries 
17ff0 74 6f 20 70 72 6f 6d 6f 74 65 20 74 6f 20 65 78  to promote to ex
18000 63 6c 75 73 69 76 65 20 62 75 74 20 69 73 20 62  clusive but is b
18010 6c 6f 63 6b 65 64 20 62 65 63 61 75 73 65 0a 2a  locked because.*
18020 2a 20 6f 66 20 41 27 73 20 72 65 61 64 20 6c 6f  * of A's read lo
18030 63 6b 2e 20 20 41 20 74 72 69 65 73 20 74 6f 20  ck.  A tries to 
18040 70 72 6f 6d 6f 74 65 20 74 6f 20 72 65 73 65 72  promote to reser
18050 76 65 64 20 62 75 74 20 69 73 20 62 6c 6f 63 6b  ved but is block
18060 65 64 20 62 79 20 42 2e 0a 2a 2a 20 4f 6e 65 20  ed by B..** One 
18070 6f 72 20 74 68 65 20 6f 74 68 65 72 20 6f 66 20  or the other of 
18080 74 68 65 20 74 77 6f 20 70 72 6f 63 65 73 73 65  the two processe
18090 73 20 6d 75 73 74 20 67 69 76 65 20 77 61 79 20  s must give way 
180a0 6f 72 20 74 68 65 72 65 20 63 61 6e 20 62 65 0a  or there can be.
180b0 2a 2a 20 6e 6f 20 70 72 6f 67 72 65 73 73 2e 20  ** no progress. 
180c0 20 42 79 20 72 65 74 75 72 6e 69 6e 67 20 53 51   By returning SQ
180d0 4c 49 54 45 5f 42 55 53 59 20 61 6e 64 20 6e 6f  LITE_BUSY and no
180e0 74 20 69 6e 76 6f 6b 69 6e 67 20 74 68 65 20 62  t invoking the b
180f0 75 73 79 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a 20  usy callback.** 
18100 77 68 65 6e 20 41 20 61 6c 72 65 61 64 79 20 68  when A already h
18110 61 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 2c 20  as a read lock, 
18120 77 65 20 65 6e 63 6f 75 72 61 67 65 20 41 20 74  we encourage A t
18130 6f 20 67 69 76 65 20 75 70 20 61 6e 64 20 6c 65  o give up and le
18140 74 20 42 0a 2a 2a 20 70 72 6f 63 65 65 64 2e 0a  t B.** proceed..
18150 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
18160 72 65 65 42 65 67 69 6e 54 72 61 6e 73 28 42 74  reeBeginTrans(Bt
18170 72 65 65 20 2a 70 2c 20 69 6e 74 20 77 72 66 6c  ree *p, int wrfl
18180 61 67 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  ag){.  sqlite3 *
18190 70 42 6c 6f 63 6b 20 3d 20 30 3b 0a 20 20 42 74  pBlock = 0;.  Bt
181a0 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
181b0 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d  >pBt;.  int rc =
181c0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 73   SQLITE_OK;..  s
181d0 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
181e0 28 70 29 3b 0a 20 20 62 74 72 65 65 49 6e 74 65  (p);.  btreeInte
181f0 67 72 69 74 79 28 70 29 3b 0a 0a 20 20 2f 2a 20  grity(p);..  /* 
18200 49 66 20 74 68 65 20 62 74 72 65 65 20 69 73 20  If the btree is 
18210 61 6c 72 65 61 64 79 20 69 6e 20 61 20 77 72 69  already in a wri
18220 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  te-transaction, 
18230 6f 72 20 69 74 0a 20 20 2a 2a 20 69 73 20 61 6c  or it.  ** is al
18240 72 65 61 64 79 20 69 6e 20 61 20 72 65 61 64 2d  ready in a read-
18250 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20  transaction and 
18260 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69  a read-transacti
18270 6f 6e 0a 20 20 2a 2a 20 69 73 20 72 65 71 75 65  on.  ** is reque
18280 73 74 65 64 2c 20 74 68 69 73 20 69 73 20 61 20  sted, this is a 
18290 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69 66  no-op..  */.  if
182a0 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52  ( p->inTrans==TR
182b0 41 4e 53 5f 57 52 49 54 45 20 7c 7c 20 28 70 2d  ANS_WRITE || (p-
182c0 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
182d0 52 45 41 44 20 26 26 20 21 77 72 66 6c 61 67 29  READ && !wrflag)
182e0 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 74 72 61   ){.    goto tra
182f0 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 20 20  ns_begun;.  }.  
18300 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54  assert( pBt->inT
18310 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e  ransaction==TRAN
18320 53 5f 57 52 49 54 45 20 7c 7c 20 49 66 4e 6f 74  S_WRITE || IfNot
18330 4f 6d 69 74 41 56 28 70 42 74 2d 3e 62 44 6f 54  OmitAV(pBt->bDoT
18340 72 75 6e 63 61 74 65 29 3d 3d 30 20 29 3b 0a 0a  runcate)==0 );..
18350 20 20 2f 2a 20 57 72 69 74 65 20 74 72 61 6e 73    /* Write trans
18360 61 63 74 69 6f 6e 73 20 61 72 65 20 6e 6f 74 20  actions are not 
18370 70 6f 73 73 69 62 6c 65 20 6f 6e 20 61 20 72 65  possible on a re
18380 61 64 2d 6f 6e 6c 79 20 64 61 74 61 62 61 73 65  ad-only database
18390 20 2a 2f 0a 20 20 69 66 28 20 28 70 42 74 2d 3e   */.  if( (pBt->
183a0 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 52  btsFlags & BTS_R
183b0 45 41 44 5f 4f 4e 4c 59 29 21 3d 30 20 26 26 20  EAD_ONLY)!=0 && 
183c0 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 72 63  wrflag ){.    rc
183d0 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e   = SQLITE_READON
183e0 4c 59 3b 0a 20 20 20 20 67 6f 74 6f 20 74 72 61  LY;.    goto tra
183f0 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 0a 23  ns_begun;.  }..#
18400 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
18410 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a  IT_SHARED_CACHE.
18420 20 20 2f 2a 20 49 66 20 61 6e 6f 74 68 65 72 20    /* If another 
18430 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
18440 68 61 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e  has already open
18450 65 64 20 61 20 77 72 69 74 65 20 74 72 61 6e 73  ed a write trans
18460 61 63 74 69 6f 6e 20 0a 20 20 2a 2a 20 6f 6e 20  action .  ** on 
18470 74 68 69 73 20 73 68 61 72 65 64 2d 62 74 72 65  this shared-btre
18480 65 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20  e structure and 
18490 61 20 73 65 63 6f 6e 64 20 77 72 69 74 65 20 74  a second write t
184a0 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 0a 20 20  ransaction is.  
184b0 2a 2a 20 72 65 71 75 65 73 74 65 64 2c 20 72 65  ** requested, re
184c0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  turn SQLITE_LOCK
184d0 45 44 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28  ED..  */.  if( (
184e0 77 72 66 6c 61 67 20 26 26 20 70 42 74 2d 3e 69  wrflag && pBt->i
184f0 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52  nTransaction==TR
18500 41 4e 53 5f 57 52 49 54 45 29 0a 20 20 20 7c 7c  ANS_WRITE).   ||
18510 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20   (pBt->btsFlags 
18520 26 20 42 54 53 5f 50 45 4e 44 49 4e 47 29 21 3d  & BTS_PENDING)!=
18530 30 0a 20 20 29 7b 0a 20 20 20 20 70 42 6c 6f 63  0.  ){.    pBloc
18540 6b 20 3d 20 70 42 74 2d 3e 70 57 72 69 74 65 72  k = pBt->pWriter
18550 2d 3e 64 62 3b 0a 20 20 7d 65 6c 73 65 20 69 66  ->db;.  }else if
18560 28 20 77 72 66 6c 61 67 3e 31 20 29 7b 0a 20 20  ( wrflag>1 ){.  
18570 20 20 42 74 4c 6f 63 6b 20 2a 70 49 74 65 72 3b    BtLock *pIter;
18580 0a 20 20 20 20 66 6f 72 28 70 49 74 65 72 3d 70  .    for(pIter=p
18590 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 49 74 65 72  Bt->pLock; pIter
185a0 3b 20 70 49 74 65 72 3d 70 49 74 65 72 2d 3e 70  ; pIter=pIter->p
185b0 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28  Next){.      if(
185c0 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65 21 3d   pIter->pBtree!=
185d0 70 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42 6c  p ){.        pBl
185e0 6f 63 6b 20 3d 20 70 49 74 65 72 2d 3e 70 42 74  ock = pIter->pBt
185f0 72 65 65 2d 3e 64 62 3b 0a 20 20 20 20 20 20 20  ree->db;.       
18600 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
18610 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
18620 70 42 6c 6f 63 6b 20 29 7b 0a 20 20 20 20 73 71  pBlock ){.    sq
18630 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 42  lite3ConnectionB
18640 6c 6f 63 6b 65 64 28 70 2d 3e 64 62 2c 20 70 42  locked(p->db, pB
18650 6c 6f 63 6b 29 3b 0a 20 20 20 20 72 63 20 3d 20  lock);.    rc = 
18660 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48  SQLITE_LOCKED_SH
18670 41 52 45 44 43 41 43 48 45 3b 0a 20 20 20 20 67  AREDCACHE;.    g
18680 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b  oto trans_begun;
18690 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
186a0 2a 20 41 6e 79 20 72 65 61 64 2d 6f 6e 6c 79 20  * Any read-only 
186b0 6f 72 20 72 65 61 64 2d 77 72 69 74 65 20 74 72  or read-write tr
186c0 61 6e 73 61 63 74 69 6f 6e 20 69 6d 70 6c 69 65  ansaction implie
186d0 73 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e  s a read-lock on
186e0 20 0a 20 20 2a 2a 20 70 61 67 65 20 31 2e 20 53   .  ** page 1. S
186f0 6f 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 20  o if some other 
18700 73 68 61 72 65 64 2d 63 61 63 68 65 20 63 6c 69  shared-cache cli
18710 65 6e 74 20 61 6c 72 65 61 64 79 20 68 61 73 20  ent already has 
18720 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 0a 20 20  a write-lock .  
18730 2a 2a 20 6f 6e 20 70 61 67 65 20 31 2c 20 74 68  ** on page 1, th
18740 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 61  e transaction ca
18750 6e 6e 6f 74 20 62 65 20 6f 70 65 6e 65 64 2e 20  nnot be opened. 
18760 2a 2f 0a 20 20 72 63 20 3d 20 71 75 65 72 79 53  */.  rc = queryS
18770 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
18780 6f 63 6b 28 70 2c 20 4d 41 53 54 45 52 5f 52 4f  ock(p, MASTER_RO
18790 4f 54 2c 20 52 45 41 44 5f 4c 4f 43 4b 29 3b 0a  OT, READ_LOCK);.
187a0 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
187b0 3d 72 63 20 29 20 67 6f 74 6f 20 74 72 61 6e 73  =rc ) goto trans
187c0 5f 62 65 67 75 6e 3b 0a 0a 20 20 70 42 74 2d 3e  _begun;..  pBt->
187d0 62 74 73 46 6c 61 67 73 20 26 3d 20 7e 42 54 53  btsFlags &= ~BTS
187e0 5f 49 4e 49 54 49 41 4c 4c 59 5f 45 4d 50 54 59  _INITIALLY_EMPTY
187f0 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 6e 50 61  ;.  if( pBt->nPa
18800 67 65 3d 3d 30 20 29 20 70 42 74 2d 3e 62 74 73  ge==0 ) pBt->bts
18810 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 49 4e 49  Flags |= BTS_INI
18820 54 49 41 4c 4c 59 5f 45 4d 50 54 59 3b 0a 20 20  TIALLY_EMPTY;.  
18830 64 6f 20 7b 0a 20 20 20 20 2f 2a 20 43 61 6c 6c  do {.    /* Call
18840 20 6c 6f 63 6b 42 74 72 65 65 28 29 20 75 6e 74   lockBtree() unt
18850 69 6c 20 65 69 74 68 65 72 20 70 42 74 2d 3e 70  il either pBt->p
18860 50 61 67 65 31 20 69 73 20 70 6f 70 75 6c 61 74  Page1 is populat
18870 65 64 20 6f 72 0a 20 20 20 20 2a 2a 20 6c 6f 63  ed or.    ** loc
18880 6b 42 74 72 65 65 28 29 20 72 65 74 75 72 6e 73  kBtree() returns
18890 20 73 6f 6d 65 74 68 69 6e 67 20 6f 74 68 65 72   something other
188a0 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e   than SQLITE_OK.
188b0 20 6c 6f 63 6b 42 74 72 65 65 28 29 0a 20 20 20   lockBtree().   
188c0 20 2a 2a 20 6d 61 79 20 72 65 74 75 72 6e 20 53   ** may return S
188d0 51 4c 49 54 45 5f 4f 4b 20 62 75 74 20 6c 65 61  QLITE_OK but lea
188e0 76 65 20 70 42 74 2d 3e 70 50 61 67 65 31 20 73  ve pBt->pPage1 s
188f0 65 74 20 74 6f 20 30 20 69 66 20 61 66 74 65 72  et to 0 if after
18900 0a 20 20 20 20 2a 2a 20 72 65 61 64 69 6e 67 20  .    ** reading 
18910 70 61 67 65 20 31 20 69 74 20 64 69 73 63 6f 76  page 1 it discov
18920 65 72 73 20 74 68 61 74 20 74 68 65 20 70 61 67  ers that the pag
18930 65 2d 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61  e-size of the da
18940 74 61 62 61 73 65 20 0a 20 20 20 20 2a 2a 20 66  tabase .    ** f
18950 69 6c 65 20 69 73 20 6e 6f 74 20 70 42 74 2d 3e  ile is not pBt->
18960 70 61 67 65 53 69 7a 65 2e 20 49 6e 20 74 68 69  pageSize. In thi
18970 73 20 63 61 73 65 20 6c 6f 63 6b 42 74 72 65 65  s case lockBtree
18980 28 29 20 77 69 6c 6c 20 75 70 64 61 74 65 0a 20  () will update. 
18990 20 20 20 2a 2a 20 70 42 74 2d 3e 70 61 67 65 53     ** pBt->pageS
189a0 69 7a 65 20 74 6f 20 74 68 65 20 70 61 67 65 2d  ize to the page-
189b0 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65  size of the file
189c0 20 6f 6e 20 64 69 73 6b 2e 0a 20 20 20 20 2a 2f   on disk..    */
189d0 0a 20 20 20 20 77 68 69 6c 65 28 20 70 42 74 2d  .    while( pBt-
189e0 3e 70 50 61 67 65 31 3d 3d 30 20 26 26 20 53 51  >pPage1==0 && SQ
189f0 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20 6c  LITE_OK==(rc = l
18a00 6f 63 6b 42 74 72 65 65 28 70 42 74 29 29 20 29  ockBtree(pBt)) )
18a10 3b 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  ;..    if( rc==S
18a20 51 4c 49 54 45 5f 4f 4b 20 26 26 20 77 72 66 6c  QLITE_OK && wrfl
18a30 61 67 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ag ){.      if( 
18a40 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26  (pBt->btsFlags &
18a50 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 29 21   BTS_READ_ONLY)!
18a60 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  =0 ){.        rc
18a70 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e   = SQLITE_READON
18a80 4c 59 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  LY;.      }else{
18a90 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
18aa0 6c 69 74 65 33 50 61 67 65 72 42 65 67 69 6e 28  lite3PagerBegin(
18ab0 70 42 74 2d 3e 70 50 61 67 65 72 2c 77 72 66 6c  pBt->pPager,wrfl
18ac0 61 67 3e 31 2c 73 71 6c 69 74 65 33 54 65 6d 70  ag>1,sqlite3Temp
18ad0 49 6e 4d 65 6d 6f 72 79 28 70 2d 3e 64 62 29 29  InMemory(p->db))
18ae0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
18af0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
18b00 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 6e 65           rc = ne
18b10 77 44 61 74 61 62 61 73 65 28 70 42 74 29 3b 0a  wDatabase(pBt);.
18b20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
18b30 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 69  }.    }.  .    i
18b40 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
18b50 20 29 7b 0a 20 20 20 20 20 20 75 6e 6c 6f 63 6b   ){.      unlock
18b60 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 70 42  BtreeIfUnused(pB
18b70 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69  t);.    }.  }whi
18b80 6c 65 28 20 28 72 63 26 30 78 46 46 29 3d 3d 53  le( (rc&0xFF)==S
18b90 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20 70 42  QLITE_BUSY && pB
18ba0 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
18bb0 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 0a  ==TRANS_NONE &&.
18bc0 20 20 20 20 20 20 20 20 20 20 62 74 72 65 65 49            btreeI
18bd0 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72  nvokeBusyHandler
18be0 28 70 42 74 29 20 29 3b 0a 0a 20 20 69 66 28 20  (pBt) );..  if( 
18bf0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
18c00 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 6e 54 72  .    if( p->inTr
18c10 61 6e 73 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20  ans==TRANS_NONE 
18c20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 54  ){.      pBt->nT
18c30 72 61 6e 73 61 63 74 69 6f 6e 2b 2b 3b 0a 23 69  ransaction++;.#i
18c40 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
18c50 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20  T_SHARED_CACHE. 
18c60 20 20 20 20 20 69 66 28 20 70 2d 3e 73 68 61 72       if( p->shar
18c70 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20  able ){.        
18c80 61 73 73 65 72 74 28 20 70 2d 3e 6c 6f 63 6b 2e  assert( p->lock.
18c90 70 42 74 72 65 65 3d 3d 70 20 26 26 20 70 2d 3e  pBtree==p && p->
18ca0 6c 6f 63 6b 2e 69 54 61 62 6c 65 3d 3d 31 20 29  lock.iTable==1 )
18cb0 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6c 6f 63  ;.        p->loc
18cc0 6b 2e 65 4c 6f 63 6b 20 3d 20 52 45 41 44 5f 4c  k.eLock = READ_L
18cd0 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  OCK;.        p->
18ce0 6c 6f 63 6b 2e 70 4e 65 78 74 20 3d 20 70 42 74  lock.pNext = pBt
18cf0 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 20 20 20 20 20  ->pLock;.       
18d00 20 70 42 74 2d 3e 70 4c 6f 63 6b 20 3d 20 26 70   pBt->pLock = &p
18d10 2d 3e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 7d 0a  ->lock;.      }.
18d20 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20  #endif.    }.   
18d30 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 28 77   p->inTrans = (w
18d40 72 66 6c 61 67 3f 54 52 41 4e 53 5f 57 52 49 54  rflag?TRANS_WRIT
18d50 45 3a 54 52 41 4e 53 5f 52 45 41 44 29 3b 0a 20  E:TRANS_READ);. 
18d60 20 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e     if( p->inTran
18d70 73 3e 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  s>pBt->inTransac
18d80 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 70 42  tion ){.      pB
18d90 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
18da0 20 3d 20 70 2d 3e 69 6e 54 72 61 6e 73 3b 0a 20   = p->inTrans;. 
18db0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 77 72 66     }.    if( wrf
18dc0 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 4d 65 6d  lag ){.      Mem
18dd0 50 61 67 65 20 2a 70 50 61 67 65 31 20 3d 20 70  Page *pPage1 = p
18de0 42 74 2d 3e 70 50 61 67 65 31 3b 0a 23 69 66 6e  Bt->pPage1;.#ifn
18df0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
18e00 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 20  SHARED_CACHE.   
18e10 20 20 20 61 73 73 65 72 74 28 20 21 70 42 74 2d     assert( !pBt-
18e20 3e 70 57 72 69 74 65 72 20 29 3b 0a 20 20 20 20  >pWriter );.    
18e30 20 20 70 42 74 2d 3e 70 57 72 69 74 65 72 20 3d    pBt->pWriter =
18e40 20 70 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 62   p;.      pBt->b
18e50 74 73 46 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f  tsFlags &= ~BTS_
18e60 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 20 20 20  EXCLUSIVE;.     
18e70 20 69 66 28 20 77 72 66 6c 61 67 3e 31 20 29 20   if( wrflag>1 ) 
18e80 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d  pBt->btsFlags |=
18e90 20 42 54 53 5f 45 58 43 4c 55 53 49 56 45 3b 0a   BTS_EXCLUSIVE;.
18ea0 23 65 6e 64 69 66 0a 0a 20 20 20 20 20 20 2f 2a  #endif..      /*
18eb0 20 49 66 20 74 68 65 20 64 62 2d 73 69 7a 65 20   If the db-size 
18ec0 68 65 61 64 65 72 20 66 69 65 6c 64 20 69 73 20  header field is 
18ed0 69 6e 63 6f 72 72 65 63 74 20 28 61 73 20 69 74  incorrect (as it
18ee0 20 6d 61 79 20 62 65 20 69 66 20 61 6e 20 6f 6c   may be if an ol
18ef0 64 0a 20 20 20 20 20 20 2a 2a 20 63 6c 69 65 6e  d.      ** clien
18f00 74 20 68 61 73 20 62 65 65 6e 20 77 72 69 74 69  t has been writi
18f10 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ng the database 
18f20 66 69 6c 65 29 2c 20 75 70 64 61 74 65 20 69 74  file), update it
18f30 20 6e 6f 77 2e 20 44 6f 69 6e 67 0a 20 20 20 20   now. Doing.    
18f40 20 20 2a 2a 20 74 68 69 73 20 73 6f 6f 6e 65 72    ** this sooner
18f50 20 72 61 74 68 65 72 20 74 68 61 6e 20 6c 61 74   rather than lat
18f60 65 72 20 6d 65 61 6e 73 20 74 68 65 20 64 61 74  er means the dat
18f70 61 62 61 73 65 20 73 69 7a 65 20 63 61 6e 20 73  abase size can s
18f80 61 66 65 6c 79 20 0a 20 20 20 20 20 20 2a 2a 20  afely .      ** 
18f90 72 65 2d 72 65 61 64 20 74 68 65 20 64 61 74 61  re-read the data
18fa0 62 61 73 65 20 73 69 7a 65 20 66 72 6f 6d 20 70  base size from p
18fb0 61 67 65 20 31 20 69 66 20 61 20 73 61 76 65 70  age 1 if a savep
18fc0 6f 69 6e 74 20 6f 72 20 74 72 61 6e 73 61 63 74  oint or transact
18fd0 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 72 6f 6c  ion.      ** rol
18fe0 6c 62 61 63 6b 20 6f 63 63 75 72 73 20 77 69 74  lback occurs wit
18ff0 68 69 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74  hin the transact
19000 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ion..      */.  
19010 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6e 50 61      if( pBt->nPa
19020 67 65 21 3d 67 65 74 34 62 79 74 65 28 26 70 50  ge!=get4byte(&pP
19030 61 67 65 31 2d 3e 61 44 61 74 61 5b 32 38 5d 29  age1->aData[28])
19040 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
19050 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
19060 74 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61  te(pPage1->pDbPa
19070 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ge);.        if(
19080 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
19090 7b 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 34  {.          put4
190a0 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44  byte(&pPage1->aD
190b0 61 74 61 5b 32 38 5d 2c 20 70 42 74 2d 3e 6e 50  ata[28], pBt->nP
190c0 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  age);.        }.
190d0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
190e0 7d 0a 0a 0a 74 72 61 6e 73 5f 62 65 67 75 6e 3a  }...trans_begun:
190f0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
19100 45 5f 4f 4b 20 26 26 20 77 72 66 6c 61 67 20 29  E_OK && wrflag )
19110 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61  {.    /* This ca
19120 6c 6c 20 6d 61 6b 65 73 20 73 75 72 65 20 74 68  ll makes sure th
19130 61 74 20 74 68 65 20 70 61 67 65 72 20 68 61 73  at the pager has
19140 20 74 68 65 20 63 6f 72 72 65 63 74 20 6e 75 6d   the correct num
19150 62 65 72 20 6f 66 0a 20 20 20 20 2a 2a 20 6f 70  ber of.    ** op
19160 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 2e 20 49  en savepoints. I
19170 66 20 74 68 65 20 73 65 63 6f 6e 64 20 70 61 72  f the second par
19180 61 6d 65 74 65 72 20 69 73 20 67 72 65 61 74 65  ameter is greate
19190 72 20 74 68 61 6e 20 30 20 61 6e 64 0a 20 20 20  r than 0 and.   
191a0 20 2a 2a 20 74 68 65 20 73 75 62 2d 6a 6f 75 72   ** the sub-jour
191b0 6e 61 6c 20 69 73 20 6e 6f 74 20 61 6c 72 65 61  nal is not alrea
191c0 64 79 20 6f 70 65 6e 2c 20 74 68 65 6e 20 69 74  dy open, then it
191d0 20 77 69 6c 6c 20 62 65 20 6f 70 65 6e 65 64 20   will be opened 
191e0 68 65 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  here..    */.   
191f0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
19200 65 72 4f 70 65 6e 53 61 76 65 70 6f 69 6e 74 28  erOpenSavepoint(
19210 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 2d 3e  pBt->pPager, p->
19220 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 29 3b  db->nSavepoint);
19230 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65 49 6e 74  .  }..  btreeInt
19240 65 67 72 69 74 79 28 70 29 3b 0a 20 20 73 71 6c  egrity(p);.  sql
19250 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
19260 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
19270 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
19280 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
19290 4d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  M../*.** Set the
192a0 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74   pointer-map ent
192b0 72 69 65 73 20 66 6f 72 20 61 6c 6c 20 63 68 69  ries for all chi
192c0 6c 64 72 65 6e 20 6f 66 20 70 61 67 65 20 70 50  ldren of page pP
192d0 61 67 65 2e 20 41 6c 73 6f 2c 20 69 66 0a 2a 2a  age. Also, if.**
192e0 20 70 50 61 67 65 20 63 6f 6e 74 61 69 6e 73 20   pPage contains 
192f0 63 65 6c 6c 73 20 74 68 61 74 20 70 6f 69 6e 74  cells that point
19300 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   to overflow pag
19310 65 73 2c 20 73 65 74 20 74 68 65 20 70 6f 69 6e  es, set the poin
19320 74 65 72 0a 2a 2a 20 6d 61 70 20 65 6e 74 72 69  ter.** map entri
19330 65 73 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66  es for the overf
19340 6c 6f 77 20 70 61 67 65 73 20 61 73 20 77 65 6c  low pages as wel
19350 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  l..*/.static int
19360 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70 73   setChildPtrmaps
19370 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29  (MemPage *pPage)
19380 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  {.  int i;      
19390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
193a0 20 20 20 20 20 20 20 2f 2a 20 43 6f 75 6e 74 65         /* Counte
193b0 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20  r variable */.  
193c0 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 20 20 20 20  int nCell;      
193d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
193e0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
193f0 63 65 6c 6c 73 20 69 6e 20 70 61 67 65 20 70 50  cells in page pP
19400 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  age */.  int rc;
19410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19420 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
19430 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
19440 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
19450 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 75 38  pPage->pBt;.  u8
19460 20 69 73 49 6e 69 74 4f 72 69 67 20 3d 20 70 50   isInitOrig = pP
19470 61 67 65 2d 3e 69 73 49 6e 69 74 3b 0a 20 20 50  age->isInit;.  P
19480 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 50 61 67 65  gno pgno = pPage
19490 2d 3e 70 67 6e 6f 3b 0a 0a 20 20 61 73 73 65 72  ->pgno;..  asser
194a0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
194b0 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
194c0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 63  ->mutex) );.  rc
194d0 20 3d 20 62 74 72 65 65 49 6e 69 74 50 61 67 65   = btreeInitPage
194e0 28 70 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72  (pPage);.  if( r
194f0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
19500 20 20 20 20 67 6f 74 6f 20 73 65 74 5f 63 68 69      goto set_chi
19510 6c 64 5f 70 74 72 6d 61 70 73 5f 6f 75 74 3b 0a  ld_ptrmaps_out;.
19520 20 20 7d 0a 20 20 6e 43 65 6c 6c 20 3d 20 70 50    }.  nCell = pP
19530 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20 66  age->nCell;..  f
19540 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b  or(i=0; i<nCell;
19550 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70   i++){.    u8 *p
19560 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28  Cell = findCell(
19570 70 50 61 67 65 2c 20 69 29 3b 0a 0a 20 20 20 20  pPage, i);..    
19580 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72  ptrmapPutOvflPtr
19590 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26  (pPage, pCell, &
195a0 72 63 29 3b 0a 0a 20 20 20 20 69 66 28 20 21 70  rc);..    if( !p
195b0 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
195c0 20 20 20 20 50 67 6e 6f 20 63 68 69 6c 64 50 67      Pgno childPg
195d0 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 70 43  no = get4byte(pC
195e0 65 6c 6c 29 3b 0a 20 20 20 20 20 20 70 74 72 6d  ell);.      ptrm
195f0 61 70 50 75 74 28 70 42 74 2c 20 63 68 69 6c 64  apPut(pBt, child
19600 50 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52  Pgno, PTRMAP_BTR
19610 45 45 2c 20 70 67 6e 6f 2c 20 26 72 63 29 3b 0a  EE, pgno, &rc);.
19620 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
19630 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b   !pPage->leaf ){
19640 0a 20 20 20 20 50 67 6e 6f 20 63 68 69 6c 64 50  .    Pgno childP
19650 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26  gno = get4byte(&
19660 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61  pPage->aData[pPa
19670 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  ge->hdrOffset+8]
19680 29 3b 0a 20 20 20 20 70 74 72 6d 61 70 50 75 74  );.    ptrmapPut
19690 28 70 42 74 2c 20 63 68 69 6c 64 50 67 6e 6f 2c  (pBt, childPgno,
196a0 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70   PTRMAP_BTREE, p
196b0 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 7d 0a 0a  gno, &rc);.  }..
196c0 73 65 74 5f 63 68 69 6c 64 5f 70 74 72 6d 61 70  set_child_ptrmap
196d0 73 5f 6f 75 74 3a 0a 20 20 70 50 61 67 65 2d 3e  s_out:.  pPage->
196e0 69 73 49 6e 69 74 20 3d 20 69 73 49 6e 69 74 4f  isInit = isInitO
196f0 72 69 67 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  rig;.  return rc
19700 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 77  ;.}../*.** Somew
19710 68 65 72 65 20 6f 6e 20 70 50 61 67 65 20 69 73  here on pPage is
19720 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 61   a pointer to pa
19730 67 65 20 69 46 72 6f 6d 2e 20 20 4d 6f 64 69 66  ge iFrom.  Modif
19740 79 20 74 68 69 73 20 70 6f 69 6e 74 65 72 20 73  y this pointer s
19750 6f 0a 2a 2a 20 74 68 61 74 20 69 74 20 70 6f 69  o.** that it poi
19760 6e 74 73 20 74 6f 20 69 54 6f 2e 20 50 61 72 61  nts to iTo. Para
19770 6d 65 74 65 72 20 65 54 79 70 65 20 64 65 73 63  meter eType desc
19780 72 69 62 65 73 20 74 68 65 20 74 79 70 65 20 6f  ribes the type o
19790 66 20 70 6f 69 6e 74 65 72 20 74 6f 0a 2a 2a 20  f pointer to.** 
197a0 62 65 20 6d 6f 64 69 66 69 65 64 2c 20 61 73 20  be modified, as 
197b0 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
197c0 50 54 52 4d 41 50 5f 42 54 52 45 45 3a 20 20 20  PTRMAP_BTREE:   
197d0 20 20 70 50 61 67 65 20 69 73 20 61 20 62 74 72    pPage is a btr
197e0 65 65 2d 70 61 67 65 2e 20 54 68 65 20 70 6f 69  ee-page. The poi
197f0 6e 74 65 72 20 70 6f 69 6e 74 73 20 61 74 20 61  nter points at a
19800 20 63 68 69 6c 64 20 0a 2a 2a 20 20 20 20 20 20   child .**      
19810 20 20 20 20 20 20 20 20 20 20 20 20 20 70 61 67               pag
19820 65 20 6f 66 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a  e of pPage..**.*
19830 2a 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  * PTRMAP_OVERFLO
19840 57 31 3a 20 70 50 61 67 65 20 69 73 20 61 20 62  W1: pPage is a b
19850 74 72 65 65 2d 70 61 67 65 2e 20 54 68 65 20 70  tree-page. The p
19860 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20 61 74  ointer points at
19870 20 61 6e 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20   an overflow.** 
19880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19890 20 20 70 61 67 65 20 70 6f 69 6e 74 65 64 20 74    page pointed t
198a0 6f 20 62 79 20 6f 6e 65 20 6f 66 20 74 68 65 20  o by one of the 
198b0 63 65 6c 6c 73 20 6f 6e 20 70 50 61 67 65 2e 0a  cells on pPage..
198c0 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f 56 45  **.** PTRMAP_OVE
198d0 52 46 4c 4f 57 32 3a 20 70 50 61 67 65 20 69 73  RFLOW2: pPage is
198e0 20 61 6e 20 6f 76 65 72 66 6c 6f 77 2d 70 61 67   an overflow-pag
198f0 65 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20 70  e. The pointer p
19900 6f 69 6e 74 73 20 61 74 20 74 68 65 20 6e 65 78  oints at the nex
19910 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  t.**            
19920 20 20 20 20 20 20 20 6f 76 65 72 66 6c 6f 77 20         overflow 
19930 70 61 67 65 20 69 6e 20 74 68 65 20 6c 69 73 74  page in the list
19940 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
19950 6d 6f 64 69 66 79 50 61 67 65 50 6f 69 6e 74 65  modifyPagePointe
19960 72 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  r(MemPage *pPage
19970 2c 20 50 67 6e 6f 20 69 46 72 6f 6d 2c 20 50 67  , Pgno iFrom, Pg
19980 6e 6f 20 69 54 6f 2c 20 75 38 20 65 54 79 70 65  no iTo, u8 eType
19990 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ){.  assert( sql
199a0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
199b0 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
199c0 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
199d0 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
199e0 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70  iteable(pPage->p
199f0 44 62 50 61 67 65 29 20 29 3b 0a 20 20 69 66 28  DbPage) );.  if(
19a00 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f   eType==PTRMAP_O
19a10 56 45 52 46 4c 4f 57 32 20 29 7b 0a 20 20 20 20  VERFLOW2 ){.    
19a20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 69  /* The pointer i
19a30 73 20 61 6c 77 61 79 73 20 74 68 65 20 66 69 72  s always the fir
19a40 73 74 20 34 20 62 79 74 65 73 20 6f 66 20 74 68  st 4 bytes of th
19a50 65 20 70 61 67 65 20 69 6e 20 74 68 69 73 20 63  e page in this c
19a60 61 73 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28  ase.  */.    if(
19a70 20 67 65 74 34 62 79 74 65 28 70 50 61 67 65 2d   get4byte(pPage-
19a80 3e 61 44 61 74 61 29 21 3d 69 46 72 6f 6d 20 29  >aData)!=iFrom )
19a90 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
19aa0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
19ab0 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 75  PT;.    }.    pu
19ac0 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44  t4byte(pPage->aD
19ad0 61 74 61 2c 20 69 54 6f 29 3b 0a 20 20 7d 65 6c  ata, iTo);.  }el
19ae0 73 65 7b 0a 20 20 20 20 75 38 20 69 73 49 6e 69  se{.    u8 isIni
19af0 74 4f 72 69 67 20 3d 20 70 50 61 67 65 2d 3e 69  tOrig = pPage->i
19b00 73 49 6e 69 74 3b 0a 20 20 20 20 69 6e 74 20 69  sInit;.    int i
19b10 3b 0a 20 20 20 20 69 6e 74 20 6e 43 65 6c 6c 3b  ;.    int nCell;
19b20 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  .    int rc;..  
19b30 20 20 72 63 20 3d 20 62 74 72 65 65 49 6e 69 74    rc = btreeInit
19b40 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20  Page(pPage);.   
19b50 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
19b60 20 72 63 3b 0a 20 20 20 20 6e 43 65 6c 6c 20 3d   rc;.    nCell =
19b70 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a   pPage->nCell;..
19b80 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
19b90 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Cell; i++){.    
19ba0 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20 66 69    u8 *pCell = fi
19bb0 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 29  ndCell(pPage, i)
19bc0 3b 0a 20 20 20 20 20 20 69 66 28 20 65 54 79 70  ;.      if( eTyp
19bd0 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  e==PTRMAP_OVERFL
19be0 4f 57 31 20 29 7b 0a 20 20 20 20 20 20 20 20 43  OW1 ){.        C
19bf0 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20  ellInfo info;.  
19c00 20 20 20 20 20 20 62 74 72 65 65 50 61 72 73 65        btreeParse
19c10 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70  CellPtr(pPage, p
19c20 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20  Cell, &info);.  
19c30 20 20 20 20 20 20 69 66 28 20 69 6e 66 6f 2e 69        if( info.i
19c40 4f 76 65 72 66 6c 6f 77 0a 20 20 20 20 20 20 20  Overflow.       
19c50 20 20 26 26 20 70 43 65 6c 6c 2b 69 6e 66 6f 2e    && pCell+info.
19c60 69 4f 76 65 72 66 6c 6f 77 2b 33 3c 3d 70 50 61  iOverflow+3<=pPa
19c70 67 65 2d 3e 61 44 61 74 61 2b 70 50 61 67 65 2d  ge->aData+pPage-
19c80 3e 6d 61 73 6b 50 61 67 65 0a 20 20 20 20 20 20  >maskPage.      
19c90 20 20 20 26 26 20 69 46 72 6f 6d 3d 3d 67 65 74     && iFrom==get
19ca0 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66  4byte(&pCell[inf
19cb0 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 0a 20 20  o.iOverflow]).  
19cc0 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
19cd0 20 20 20 70 75 74 34 62 79 74 65 28 26 70 43 65     put4byte(&pCe
19ce0 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f  ll[info.iOverflo
19cf0 77 5d 2c 20 69 54 6f 29 3b 0a 20 20 20 20 20 20  w], iTo);.      
19d00 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
19d10 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
19d20 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 67 65  {.        if( ge
19d30 74 34 62 79 74 65 28 70 43 65 6c 6c 29 3d 3d 69  t4byte(pCell)==i
19d40 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 20 20  From ){.        
19d50 20 20 70 75 74 34 62 79 74 65 28 70 43 65 6c 6c    put4byte(pCell
19d60 2c 20 69 54 6f 29 3b 0a 20 20 20 20 20 20 20 20  , iTo);.        
19d70 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
19d80 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
19d90 0a 20 20 0a 20 20 20 20 69 66 28 20 69 3d 3d 6e  .  .    if( i==n
19da0 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 69 66  Cell ){.      if
19db0 28 20 65 54 79 70 65 21 3d 50 54 52 4d 41 50 5f  ( eType!=PTRMAP_
19dc0 42 54 52 45 45 20 7c 7c 20 0a 20 20 20 20 20 20  BTREE || .      
19dd0 20 20 20 20 67 65 74 34 62 79 74 65 28 26 70 50      get4byte(&pP
19de0 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65  age->aData[pPage
19df0 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 21  ->hdrOffset+8])!
19e00 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20  =iFrom ){.      
19e10 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
19e20 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
19e30 20 20 20 20 7d 0a 20 20 20 20 20 20 70 75 74 34      }.      put4
19e40 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61  byte(&pPage->aDa
19e50 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  ta[pPage->hdrOff
19e60 73 65 74 2b 38 5d 2c 20 69 54 6f 29 3b 0a 20 20  set+8], iTo);.  
19e70 20 20 7d 0a 0a 20 20 20 20 70 50 61 67 65 2d 3e    }..    pPage->
19e80 69 73 49 6e 69 74 20 3d 20 69 73 49 6e 69 74 4f  isInit = isInitO
19e90 72 69 67 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  rig;.  }.  retur
19ea0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
19eb0 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20  ./*.** Move the 
19ec0 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 70 61  open database pa
19ed0 67 65 20 70 44 62 50 61 67 65 20 74 6f 20 6c 6f  ge pDbPage to lo
19ee0 63 61 74 69 6f 6e 20 69 46 72 65 65 50 61 67 65  cation iFreePage
19ef0 20 69 6e 20 74 68 65 20 0a 2a 2a 20 64 61 74 61   in the .** data
19f00 62 61 73 65 2e 20 54 68 65 20 70 44 62 50 61 67  base. The pDbPag
19f10 65 20 72 65 66 65 72 65 6e 63 65 20 72 65 6d 61  e reference rema
19f20 69 6e 73 20 76 61 6c 69 64 2e 0a 2a 2a 0a 2a 2a  ins valid..**.**
19f30 20 54 68 65 20 69 73 43 6f 6d 6d 69 74 20 66 6c   The isCommit fl
19f40 61 67 20 69 6e 64 69 63 61 74 65 73 20 74 68 61  ag indicates tha
19f50 74 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65  t there is no ne
19f60 65 64 20 74 6f 20 72 65 6d 65 6d 62 65 72 20 74  ed to remember t
19f70 68 61 74 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e  hat.** the journ
19f80 61 6c 20 6e 65 65 64 73 20 74 6f 20 62 65 20 73  al needs to be s
19f90 79 6e 63 28 29 65 64 20 62 65 66 6f 72 65 20 64  ync()ed before d
19fa0 61 74 61 62 61 73 65 20 70 61 67 65 20 70 44 62  atabase page pDb
19fb0 50 61 67 65 2d 3e 70 67 6e 6f 20 0a 2a 2a 20 63  Page->pgno .** c
19fc0 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f  an be written to
19fd0 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 68 61 73  . The caller has
19fe0 20 61 6c 72 65 61 64 79 20 70 72 6f 6d 69 73 65   already promise
19ff0 64 20 6e 6f 74 20 74 6f 20 77 72 69 74 65 20 74  d not to write t
1a000 6f 20 74 68 61 74 0a 2a 2a 20 70 61 67 65 2e 0a  o that.** page..
1a010 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65  */.static int re
1a020 6c 6f 63 61 74 65 50 61 67 65 28 0a 20 20 42 74  locatePage(.  Bt
1a030 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20  Shared *pBt,    
1a040 20 20 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20         /* Btree 
1a050 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 44  */.  MemPage *pD
1a060 62 50 61 67 65 2c 20 20 20 20 20 20 20 20 2f 2a  bPage,        /*
1a070 20 4f 70 65 6e 20 70 61 67 65 20 74 6f 20 6d 6f   Open page to mo
1a080 76 65 20 2a 2f 0a 20 20 75 38 20 65 54 79 70 65  ve */.  u8 eType
1a090 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1a0a0 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20   /* Pointer map 
1a0b0 27 74 79 70 65 27 20 65 6e 74 72 79 20 66 6f 72  'type' entry for
1a0c0 20 70 44 62 50 61 67 65 20 2a 2f 0a 20 20 50 67   pDbPage */.  Pg
1a0d0 6e 6f 20 69 50 74 72 50 61 67 65 2c 20 20 20 20  no iPtrPage,    
1a0e0 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
1a0f0 72 20 6d 61 70 20 27 70 61 67 65 2d 6e 6f 27 20  r map 'page-no' 
1a100 65 6e 74 72 79 20 66 6f 72 20 70 44 62 50 61 67  entry for pDbPag
1a110 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 46 72 65  e */.  Pgno iFre
1a120 65 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20  ePage,          
1a130 2f 2a 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20  /* The location 
1a140 74 6f 20 6d 6f 76 65 20 70 44 62 50 61 67 65 20  to move pDbPage 
1a150 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 69 73 43 6f  to */.  int isCo
1a160 6d 6d 69 74 20 20 20 20 20 20 20 20 20 20 20 20  mmit            
1a170 20 2f 2a 20 69 73 43 6f 6d 6d 69 74 20 66 6c 61   /* isCommit fla
1a180 67 20 70 61 73 73 65 64 20 74 6f 20 73 71 6c 69  g passed to sqli
1a190 74 65 33 50 61 67 65 72 4d 6f 76 65 70 61 67 65  te3PagerMovepage
1a1a0 20 2a 2f 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65   */.){.  MemPage
1a1b0 20 2a 70 50 74 72 50 61 67 65 3b 20 20 20 2f 2a   *pPtrPage;   /*
1a1c0 20 54 68 65 20 70 61 67 65 20 74 68 61 74 20 63   The page that c
1a1d0 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65  ontains a pointe
1a1e0 72 20 74 6f 20 70 44 62 50 61 67 65 20 2a 2f 0a  r to pDbPage */.
1a1f0 20 20 50 67 6e 6f 20 69 44 62 50 61 67 65 20 3d    Pgno iDbPage =
1a200 20 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a   pDbPage->pgno;.
1a210 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
1a220 3d 20 70 42 74 2d 3e 70 50 61 67 65 72 3b 0a 20  = pBt->pPager;. 
1a230 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65   int rc;..  asse
1a240 72 74 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41  rt( eType==PTRMA
1a250 50 5f 4f 56 45 52 46 4c 4f 57 32 20 7c 7c 20 65  P_OVERFLOW2 || e
1a260 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45  Type==PTRMAP_OVE
1a270 52 46 4c 4f 57 31 20 7c 7c 20 0a 20 20 20 20 20  RFLOW1 || .     
1a280 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 42   eType==PTRMAP_B
1a290 54 52 45 45 20 7c 7c 20 65 54 79 70 65 3d 3d 50  TREE || eType==P
1a2a0 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29  TRMAP_ROOTPAGE )
1a2b0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
1a2c0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
1a2d0 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
1a2e0 61 73 73 65 72 74 28 20 70 44 62 50 61 67 65 2d  assert( pDbPage-
1a2f0 3e 70 42 74 3d 3d 70 42 74 20 29 3b 0a 0a 20 20  >pBt==pBt );..  
1a300 2f 2a 20 4d 6f 76 65 20 70 61 67 65 20 69 44 62  /* Move page iDb
1a310 50 61 67 65 20 66 72 6f 6d 20 69 74 73 20 63 75  Page from its cu
1a320 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 74  rrent location t
1a330 6f 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 46  o page number iF
1a340 72 65 65 50 61 67 65 20 2a 2f 0a 20 20 54 52 41  reePage */.  TRA
1a350 43 45 28 28 22 41 55 54 4f 56 41 43 55 55 4d 3a  CE(("AUTOVACUUM:
1a360 20 4d 6f 76 69 6e 67 20 25 64 20 74 6f 20 66 72   Moving %d to fr
1a370 65 65 20 70 61 67 65 20 25 64 20 28 70 74 72 20  ee page %d (ptr 
1a380 70 61 67 65 20 25 64 20 74 79 70 65 20 25 64 29  page %d type %d)
1a390 5c 6e 22 2c 20 0a 20 20 20 20 20 20 69 44 62 50  \n", .      iDbP
1a3a0 61 67 65 2c 20 69 46 72 65 65 50 61 67 65 2c 20  age, iFreePage, 
1a3b0 69 50 74 72 50 61 67 65 2c 20 65 54 79 70 65 29  iPtrPage, eType)
1a3c0 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
1a3d0 33 50 61 67 65 72 4d 6f 76 65 70 61 67 65 28 70  3PagerMovepage(p
1a3e0 50 61 67 65 72 2c 20 70 44 62 50 61 67 65 2d 3e  Pager, pDbPage->
1a3f0 70 44 62 50 61 67 65 2c 20 69 46 72 65 65 50 61  pDbPage, iFreePa
1a400 67 65 2c 20 69 73 43 6f 6d 6d 69 74 29 3b 0a 20  ge, isCommit);. 
1a410 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1a420 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  OK ){.    return
1a430 20 72 63 3b 0a 20 20 7d 0a 20 20 70 44 62 50 61   rc;.  }.  pDbPa
1a440 67 65 2d 3e 70 67 6e 6f 20 3d 20 69 46 72 65 65  ge->pgno = iFree
1a450 50 61 67 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 70  Page;..  /* If p
1a460 44 62 50 61 67 65 20 77 61 73 20 61 20 62 74 72  DbPage was a btr
1a470 65 65 2d 70 61 67 65 2c 20 74 68 65 6e 20 69 74  ee-page, then it
1a480 20 6d 61 79 20 68 61 76 65 20 63 68 69 6c 64 20   may have child 
1a490 70 61 67 65 73 20 61 6e 64 2f 6f 72 20 63 65 6c  pages and/or cel
1a4a0 6c 73 0a 20 20 2a 2a 20 74 68 61 74 20 70 6f 69  ls.  ** that poi
1a4b0 6e 74 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70  nt to overflow p
1a4c0 61 67 65 73 2e 20 54 68 65 20 70 6f 69 6e 74 65  ages. The pointe
1a4d0 72 20 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f  r map entries fo
1a4e0 72 20 61 6c 6c 20 74 68 65 73 65 0a 20 20 2a 2a  r all these.  **
1a4f0 20 70 61 67 65 73 20 6e 65 65 64 20 74 6f 20 62   pages need to b
1a500 65 20 63 68 61 6e 67 65 64 2e 0a 20 20 2a 2a 0a  e changed..  **.
1a510 20 20 2a 2a 20 49 66 20 70 44 62 50 61 67 65 20    ** If pDbPage 
1a520 69 73 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70  is an overflow p
1a530 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20 66 69  age, then the fi
1a540 72 73 74 20 34 20 62 79 74 65 73 20 6d 61 79 20  rst 4 bytes may 
1a550 73 74 6f 72 65 20 61 0a 20 20 2a 2a 20 70 6f 69  store a.  ** poi
1a560 6e 74 65 72 20 74 6f 20 61 20 73 75 62 73 65 71  nter to a subseq
1a570 75 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70 61  uent overflow pa
1a580 67 65 2e 20 49 66 20 74 68 69 73 20 69 73 20 74  ge. If this is t
1a590 68 65 20 63 61 73 65 2c 20 74 68 65 6e 0a 20 20  he case, then.  
1a5a0 2a 2a 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d  ** the pointer m
1a5b0 61 70 20 6e 65 65 64 73 20 74 6f 20 62 65 20 75  ap needs to be u
1a5c0 70 64 61 74 65 64 20 66 6f 72 20 74 68 65 20 73  pdated for the s
1a5d0 75 62 73 65 71 75 65 6e 74 20 6f 76 65 72 66 6c  ubsequent overfl
1a5e0 6f 77 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20  ow page..  */.  
1a5f0 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41  if( eType==PTRMA
1a600 50 5f 42 54 52 45 45 20 7c 7c 20 65 54 79 70 65  P_BTREE || eType
1a610 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47  ==PTRMAP_ROOTPAG
1a620 45 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 65  E ){.    rc = se
1a630 74 43 68 69 6c 64 50 74 72 6d 61 70 73 28 70 44  tChildPtrmaps(pD
1a640 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
1a650 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1a660 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
1a670 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
1a680 0a 20 20 20 20 50 67 6e 6f 20 6e 65 78 74 4f 76  .    Pgno nextOv
1a690 66 6c 20 3d 20 67 65 74 34 62 79 74 65 28 70 44  fl = get4byte(pD
1a6a0 62 50 61 67 65 2d 3e 61 44 61 74 61 29 3b 0a 20  bPage->aData);. 
1a6b0 20 20 20 69 66 28 20 6e 65 78 74 4f 76 66 6c 21     if( nextOvfl!
1a6c0 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 74 72 6d  =0 ){.      ptrm
1a6d0 61 70 50 75 74 28 70 42 74 2c 20 6e 65 78 74 4f  apPut(pBt, nextO
1a6e0 76 66 6c 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52  vfl, PTRMAP_OVER
1a6f0 46 4c 4f 57 32 2c 20 69 46 72 65 65 50 61 67 65  FLOW2, iFreePage
1a700 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20 69 66  , &rc);.      if
1a710 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1a720 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
1a730 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
1a740 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69    }.  }..  /* Fi
1a750 78 20 74 68 65 20 64 61 74 61 62 61 73 65 20 70  x the database p
1a760 6f 69 6e 74 65 72 20 6f 6e 20 70 61 67 65 20 69  ointer on page i
1a770 50 74 72 50 61 67 65 20 74 68 61 74 20 70 6f 69  PtrPage that poi
1a780 6e 74 65 64 20 61 74 20 69 44 62 50 61 67 65 20  nted at iDbPage 
1a790 73 6f 0a 20 20 2a 2a 20 74 68 61 74 20 69 74 20  so.  ** that it 
1a7a0 70 6f 69 6e 74 73 20 61 74 20 69 46 72 65 65 50  points at iFreeP
1a7b0 61 67 65 2e 20 41 6c 73 6f 20 66 69 78 20 74 68  age. Also fix th
1a7c0 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e  e pointer map en
1a7d0 74 72 79 20 66 6f 72 0a 20 20 2a 2a 20 69 50 74  try for.  ** iPt
1a7e0 72 50 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  rPage..  */.  if
1a7f0 28 20 65 54 79 70 65 21 3d 50 54 52 4d 41 50 5f  ( eType!=PTRMAP_
1a800 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20 20 20  ROOTPAGE ){.    
1a810 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67  rc = btreeGetPag
1a820 65 28 70 42 74 2c 20 69 50 74 72 50 61 67 65 2c  e(pBt, iPtrPage,
1a830 20 26 70 50 74 72 50 61 67 65 2c 20 30 29 3b 0a   &pPtrPage, 0);.
1a840 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1a850 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
1a860 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
1a870 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1a880 50 61 67 65 72 57 72 69 74 65 28 70 50 74 72 50  PagerWrite(pPtrP
1a890 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  age->pDbPage);. 
1a8a0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1a8b0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
1a8c0 6c 65 61 73 65 50 61 67 65 28 70 50 74 72 50 61  leasePage(pPtrPa
1a8d0 67 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ge);.      retur
1a8e0 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
1a8f0 72 63 20 3d 20 6d 6f 64 69 66 79 50 61 67 65 50  rc = modifyPageP
1a900 6f 69 6e 74 65 72 28 70 50 74 72 50 61 67 65 2c  ointer(pPtrPage,
1a910 20 69 44 62 50 61 67 65 2c 20 69 46 72 65 65 50   iDbPage, iFreeP
1a920 61 67 65 2c 20 65 54 79 70 65 29 3b 0a 20 20 20  age, eType);.   
1a930 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 74   releasePage(pPt
1a940 72 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  rPage);.    if( 
1a950 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1a960 0a 20 20 20 20 20 20 70 74 72 6d 61 70 50 75 74  .      ptrmapPut
1a970 28 70 42 74 2c 20 69 46 72 65 65 50 61 67 65 2c  (pBt, iFreePage,
1a980 20 65 54 79 70 65 2c 20 69 50 74 72 50 61 67 65   eType, iPtrPage
1a990 2c 20 26 72 63 29 3b 0a 20 20 20 20 7d 0a 20 20  , &rc);.    }.  
1a9a0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
1a9b0 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 64 65 63  ../* Forward dec
1a9c0 6c 61 72 61 74 69 6f 6e 20 72 65 71 75 69 72 65  laration require
1a9d0 64 20 62 79 20 69 6e 63 72 56 61 63 75 75 6d 53  d by incrVacuumS
1a9e0 74 65 70 28 29 2e 20 2a 2f 0a 73 74 61 74 69 63  tep(). */.static
1a9f0 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 42 74 72   int allocateBtr
1aa00 65 65 50 61 67 65 28 42 74 53 68 61 72 65 64 20  eePage(BtShared 
1aa10 2a 2c 20 4d 65 6d 50 61 67 65 20 2a 2a 2c 20 50  *, MemPage **, P
1aa20 67 6e 6f 20 2a 2c 20 50 67 6e 6f 2c 20 75 38 29  gno *, Pgno, u8)
1aa30 3b 0a 0a 2f 2a 0a 2a 2a 20 50 65 72 66 6f 72 6d  ;../*.** Perform
1aa40 20 61 20 73 69 6e 67 6c 65 20 73 74 65 70 20 6f   a single step o
1aa50 66 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c  f an incremental
1aa60 2d 76 61 63 75 75 6d 2e 20 49 66 20 73 75 63 63  -vacuum. If succ
1aa70 65 73 73 66 75 6c 2c 20 72 65 74 75 72 6e 0a 2a  essful, return.*
1aa80 2a 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66 20  * SQLITE_OK. If 
1aa90 74 68 65 72 65 20 69 73 20 6e 6f 20 77 6f 72 6b  there is no work
1aaa0 20 74 6f 20 64 6f 20 28 61 6e 64 20 74 68 65 72   to do (and ther
1aab0 65 66 6f 72 65 20 6e 6f 20 70 6f 69 6e 74 20 69  efore no point i
1aac0 6e 20 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 74 68  n .** calling th
1aad0 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 67 61 69  is function agai
1aae0 6e 29 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54  n), return SQLIT
1aaf0 45 5f 44 4f 4e 45 2e 20 4f 72 2c 20 69 66 20 61  E_DONE. Or, if a
1ab00 6e 20 65 72 72 6f 72 20 0a 2a 2a 20 6f 63 63 75  n error .** occu
1ab10 72 73 2c 20 72 65 74 75 72 6e 20 73 6f 6d 65 20  rs, return some 
1ab20 6f 74 68 65 72 20 65 72 72 6f 72 20 63 6f 64 65  other error code
1ab30 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 72 65 20 73 70 65  ..**.** More spe
1ab40 63 69 66 69 63 61 6c 6c 79 2c 20 74 68 69 73 20  cifically, this 
1ab50 66 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70 74  function attempt
1ab60 73 20 74 6f 20 72 65 2d 6f 72 67 61 6e 69 7a 65  s to re-organize
1ab70 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 6f   the database so
1ab80 20 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 6c 61   .** that the la
1ab90 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 66  st page of the f
1aba0 69 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 69 6e  ile currently in
1abb0 20 75 73 65 20 69 73 20 6e 6f 20 6c 6f 6e 67 65   use is no longe
1abc0 72 20 69 6e 20 75 73 65 2e 0a 2a 2a 0a 2a 2a 20  r in use..**.** 
1abd0 50 61 72 61 6d 65 74 65 72 20 6e 46 69 6e 20 69  Parameter nFin i
1abe0 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
1abf0 70 61 67 65 73 20 74 68 61 74 20 74 68 69 73 20  pages that this 
1ac00 64 61 74 61 62 61 73 65 20 77 6f 75 6c 64 20 63  database would c
1ac10 6f 6e 74 61 69 6e 0a 2a 2a 20 77 65 72 65 20 74  ontain.** were t
1ac20 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c  his function cal
1ac30 6c 65 64 20 75 6e 74 69 6c 20 69 74 20 72 65 74  led until it ret
1ac40 75 72 6e 73 20 53 51 4c 49 54 45 5f 44 4f 4e 45  urns SQLITE_DONE
1ac50 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 62  ..**.** If the b
1ac60 43 6f 6d 6d 69 74 20 70 61 72 61 6d 65 74 65 72  Commit parameter
1ac70 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68   is non-zero, th
1ac80 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 75  is function assu
1ac90 6d 65 73 20 74 68 61 74 20 74 68 65 20 0a 2a 2a  mes that the .**
1aca0 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 6b 65 65   caller will kee
1acb0 70 20 63 61 6c 6c 69 6e 67 20 69 6e 63 72 56 61  p calling incrVa
1acc0 63 75 75 6d 53 74 65 70 28 29 20 75 6e 74 69 6c  cuumStep() until
1acd0 20 69 74 20 72 65 74 75 72 6e 73 20 53 51 4c 49   it returns SQLI
1ace0 54 45 5f 44 4f 4e 45 20 0a 2a 2a 20 6f 72 20 61  TE_DONE .** or a
1acf0 6e 20 65 72 72 6f 72 2e 20 62 43 6f 6d 6d 69 74  n error. bCommit
1ad00 20 69 73 20 70 61 73 73 65 64 20 74 72 75 65 20   is passed true 
1ad10 66 6f 72 20 61 6e 20 61 75 74 6f 2d 76 61 63 75  for an auto-vacu
1ad20 75 6d 2d 6f 6e 2d 63 6f 6d 6d 69 74 20 0a 2a 2a  um-on-commit .**
1ad30 20 6f 70 65 72 61 74 69 6f 6e 2c 20 6f 72 20 66   operation, or f
1ad40 61 6c 73 65 20 66 6f 72 20 61 6e 20 69 6e 63 72  alse for an incr
1ad50 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 2e 0a  emental vacuum..
1ad60 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e  */.static int in
1ad70 63 72 56 61 63 75 75 6d 53 74 65 70 28 42 74 53  crVacuumStep(BtS
1ad80 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f  hared *pBt, Pgno
1ad90 20 6e 46 69 6e 2c 20 50 67 6e 6f 20 69 4c 61 73   nFin, Pgno iLas
1ada0 74 50 67 2c 20 69 6e 74 20 62 43 6f 6d 6d 69 74  tPg, int bCommit
1adb0 29 7b 0a 20 20 50 67 6e 6f 20 6e 46 72 65 65 4c  ){.  Pgno nFreeL
1adc0 69 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f  ist;           /
1add0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
1ade0 73 20 73 74 69 6c 6c 20 6f 6e 20 74 68 65 20 66  s still on the f
1adf0 72 65 65 2d 6c 69 73 74 20 2a 2f 0a 20 20 69 6e  ree-list */.  in
1ae00 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  t rc;..  assert(
1ae10 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
1ae20 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
1ae30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 4c 61  );.  assert( iLa
1ae40 73 74 50 67 3e 6e 46 69 6e 20 29 3b 0a 0a 20 20  stPg>nFin );..  
1ae50 69 66 28 20 21 50 54 52 4d 41 50 5f 49 53 50 41  if( !PTRMAP_ISPA
1ae60 47 45 28 70 42 74 2c 20 69 4c 61 73 74 50 67 29  GE(pBt, iLastPg)
1ae70 20 26 26 20 69 4c 61 73 74 50 67 21 3d 50 45 4e   && iLastPg!=PEN
1ae80 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
1ae90 42 74 29 20 29 7b 0a 20 20 20 20 75 38 20 65 54  Bt) ){.    u8 eT
1aea0 79 70 65 3b 0a 20 20 20 20 50 67 6e 6f 20 69 50  ype;.    Pgno iP
1aeb0 74 72 50 61 67 65 3b 0a 0a 20 20 20 20 6e 46 72  trPage;..    nFr
1aec0 65 65 4c 69 73 74 20 3d 20 67 65 74 34 62 79 74  eeList = get4byt
1aed0 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  e(&pBt->pPage1->
1aee0 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 20 20  aData[36]);.    
1aef0 69 66 28 20 6e 46 72 65 65 4c 69 73 74 3d 3d 30  if( nFreeList==0
1af00 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
1af10 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
1af20 20 20 7d 0a 0a 20 20 20 20 72 63 20 3d 20 70 74    }..    rc = pt
1af30 72 6d 61 70 47 65 74 28 70 42 74 2c 20 69 4c 61  rmapGet(pBt, iLa
1af40 73 74 50 67 2c 20 26 65 54 79 70 65 2c 20 26 69  stPg, &eType, &i
1af50 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20 69 66  PtrPage);.    if
1af60 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1af70 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
1af80 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  rc;.    }.    if
1af90 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  ( eType==PTRMAP_
1afa0 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20 20 20  ROOTPAGE ){.    
1afb0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1afc0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
1afd0 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 65 54 79    }..    if( eTy
1afe0 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45 50  pe==PTRMAP_FREEP
1aff0 41 47 45 20 29 7b 0a 20 20 20 20 20 20 69 66 28  AGE ){.      if(
1b000 20 62 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b 0a 20   bCommit==0 ){. 
1b010 20 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65         /* Remove
1b020 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20 74   the page from t
1b030 68 65 20 66 69 6c 65 73 20 66 72 65 65 2d 6c 69  he files free-li
1b040 73 74 2e 20 54 68 69 73 20 69 73 20 6e 6f 74 20  st. This is not 
1b050 72 65 71 75 69 72 65 64 0a 20 20 20 20 20 20 20  required.       
1b060 20 2a 2a 20 69 66 20 62 43 6f 6d 6d 69 74 20 69   ** if bCommit i
1b070 73 20 6e 6f 6e 2d 7a 65 72 6f 2e 20 49 6e 20 74  s non-zero. In t
1b080 68 61 74 20 63 61 73 65 2c 20 74 68 65 20 66 72  hat case, the fr
1b090 65 65 2d 6c 69 73 74 20 77 69 6c 6c 20 62 65 0a  ee-list will be.
1b0a0 20 20 20 20 20 20 20 20 2a 2a 20 74 72 75 6e 63          ** trunc
1b0b0 61 74 65 64 20 74 6f 20 7a 65 72 6f 20 61 66 74  ated to zero aft
1b0c0 65 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  er this function
1b0d0 20 72 65 74 75 72 6e 73 2c 20 73 6f 20 69 74 20   returns, so it 
1b0e0 64 6f 65 73 6e 27 74 20 0a 20 20 20 20 20 20 20  doesn't .       
1b0f0 20 2a 2a 20 6d 61 74 74 65 72 20 69 66 20 69 74   ** matter if it
1b100 20 73 74 69 6c 6c 20 63 6f 6e 74 61 69 6e 73 20   still contains 
1b110 73 6f 6d 65 20 67 61 72 62 61 67 65 20 65 6e 74  some garbage ent
1b120 72 69 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ries..        */
1b130 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69 46  .        Pgno iF
1b140 72 65 65 50 67 3b 0a 20 20 20 20 20 20 20 20 4d  reePg;.        M
1b150 65 6d 50 61 67 65 20 2a 70 46 72 65 65 50 67 3b  emPage *pFreePg;
1b160 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 61 6c  .        rc = al
1b170 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28  locateBtreePage(
1b180 70 42 74 2c 20 26 70 46 72 65 65 50 67 2c 20 26  pBt, &pFreePg, &
1b190 69 46 72 65 65 50 67 2c 20 69 4c 61 73 74 50 67  iFreePg, iLastPg
1b1a0 2c 20 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 29  , BTALLOC_EXACT)
1b1b0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
1b1c0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1b1d0 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
1b1e0 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rc;.        }.  
1b1f0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 46        assert( iF
1b200 72 65 65 50 67 3d 3d 69 4c 61 73 74 50 67 20 29  reePg==iLastPg )
1b210 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73  ;.        releas
1b220 65 50 61 67 65 28 70 46 72 65 65 50 67 29 3b 0a  ePage(pFreePg);.
1b230 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 65 6c        }.    } el
1b240 73 65 20 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20  se {.      Pgno 
1b250 69 46 72 65 65 50 67 3b 20 20 20 20 20 20 20 20  iFreePg;        
1b260 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
1b270 20 66 72 65 65 20 70 61 67 65 20 74 6f 20 6d 6f   free page to mo
1b280 76 65 20 70 4c 61 73 74 50 67 20 74 6f 20 2a 2f  ve pLastPg to */
1b290 0a 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  .      MemPage *
1b2a0 70 4c 61 73 74 50 67 3b 0a 20 20 20 20 20 20 75  pLastPg;.      u
1b2b0 38 20 65 4d 6f 64 65 20 3d 20 42 54 41 4c 4c 4f  8 eMode = BTALLO
1b2c0 43 5f 41 4e 59 3b 20 20 20 2f 2a 20 4d 6f 64 65  C_ANY;   /* Mode
1b2d0 20 70 61 72 61 6d 65 74 65 72 20 66 6f 72 20 61   parameter for a
1b2e0 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65  llocateBtreePage
1b2f0 28 29 20 2a 2f 0a 20 20 20 20 20 20 50 67 6e 6f  () */.      Pgno
1b300 20 69 4e 65 61 72 20 3d 20 30 3b 20 20 20 20 20   iNear = 0;     
1b310 20 20 20 20 20 20 2f 2a 20 6e 65 61 72 62 79 20        /* nearby 
1b320 70 61 72 61 6d 65 74 65 72 20 66 6f 72 20 61 6c  parameter for al
1b330 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28  locateBtreePage(
1b340 29 20 2a 2f 0a 0a 20 20 20 20 20 20 72 63 20 3d  ) */..      rc =
1b350 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42   btreeGetPage(pB
1b360 74 2c 20 69 4c 61 73 74 50 67 2c 20 26 70 4c 61  t, iLastPg, &pLa
1b370 73 74 50 67 2c 20 30 29 3b 0a 20 20 20 20 20 20  stPg, 0);.      
1b380 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1b390 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  K ){.        ret
1b3a0 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
1b3b0 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 62 43 6f  .      /* If bCo
1b3c0 6d 6d 69 74 20 69 73 20 7a 65 72 6f 2c 20 74 68  mmit is zero, th
1b3d0 69 73 20 6c 6f 6f 70 20 72 75 6e 73 20 65 78 61  is loop runs exa
1b3e0 63 74 6c 79 20 6f 6e 63 65 20 61 6e 64 20 70 61  ctly once and pa
1b3f0 67 65 20 70 4c 61 73 74 50 67 0a 20 20 20 20 20  ge pLastPg.     
1b400 20 2a 2a 20 69 73 20 73 77 61 70 70 65 64 20 77   ** is swapped w
1b410 69 74 68 20 74 68 65 20 66 69 72 73 74 20 66 72  ith the first fr
1b420 65 65 20 70 61 67 65 20 70 75 6c 6c 65 64 20 6f  ee page pulled o
1b430 66 66 20 74 68 65 20 66 72 65 65 20 6c 69 73 74  ff the free list
1b440 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
1b450 20 2a 2a 20 4f 6e 20 74 68 65 20 6f 74 68 65 72   ** On the other
1b460 20 68 61 6e 64 2c 20 69 66 20 62 43 6f 6d 6d 69   hand, if bCommi
1b470 74 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  t is greater tha
1b480 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 6b 65 65  n zero, then kee
1b490 70 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 6f 70 69  p.      ** loopi
1b4a0 6e 67 20 75 6e 74 69 6c 20 61 20 66 72 65 65 2d  ng until a free-
1b4b0 70 61 67 65 20 6c 6f 63 61 74 65 64 20 77 69 74  page located wit
1b4c0 68 69 6e 20 74 68 65 20 66 69 72 73 74 20 6e 46  hin the first nF
1b4d0 69 6e 20 70 61 67 65 73 0a 20 20 20 20 20 20 2a  in pages.      *
1b4e0 2a 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 73  * of the file is
1b4f0 20 66 6f 75 6e 64 2e 0a 20 20 20 20 20 20 2a 2f   found..      */
1b500 0a 20 20 20 20 20 20 69 66 28 20 62 43 6f 6d 6d  .      if( bComm
1b510 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  it==0 ){.       
1b520 20 65 4d 6f 64 65 20 3d 20 42 54 41 4c 4c 4f 43   eMode = BTALLOC
1b530 5f 4c 45 3b 0a 20 20 20 20 20 20 20 20 69 4e 65  _LE;.        iNe
1b540 61 72 20 3d 20 6e 46 69 6e 3b 0a 20 20 20 20 20  ar = nFin;.     
1b550 20 7d 0a 20 20 20 20 20 20 64 6f 20 7b 0a 20 20   }.      do {.  
1b560 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70        MemPage *p
1b570 46 72 65 65 50 67 3b 0a 20 20 20 20 20 20 20 20  FreePg;.        
1b580 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72  rc = allocateBtr
1b590 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 46 72  eePage(pBt, &pFr
1b5a0 65 65 50 67 2c 20 26 69 46 72 65 65 50 67 2c 20  eePg, &iFreePg, 
1b5b0 69 4e 65 61 72 2c 20 65 4d 6f 64 65 29 3b 0a 20  iNear, eMode);. 
1b5c0 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
1b5d0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1b5e0 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
1b5f0 65 28 70 4c 61 73 74 50 67 29 3b 0a 20 20 20 20  e(pLastPg);.    
1b600 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1b610 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1b620 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
1b630 46 72 65 65 50 67 29 3b 0a 20 20 20 20 20 20 7d  FreePg);.      }
1b640 77 68 69 6c 65 28 20 62 43 6f 6d 6d 69 74 20 26  while( bCommit &
1b650 26 20 69 46 72 65 65 50 67 3e 6e 46 69 6e 20 29  & iFreePg>nFin )
1b660 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1b670 69 46 72 65 65 50 67 3c 69 4c 61 73 74 50 67 20  iFreePg<iLastPg 
1b680 29 3b 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20  );.      .      
1b690 72 63 20 3d 20 72 65 6c 6f 63 61 74 65 50 61 67  rc = relocatePag
1b6a0 65 28 70 42 74 2c 20 70 4c 61 73 74 50 67 2c 20  e(pBt, pLastPg, 
1b6b0 65 54 79 70 65 2c 20 69 50 74 72 50 61 67 65 2c  eType, iPtrPage,
1b6c0 20 69 46 72 65 65 50 67 2c 20 62 43 6f 6d 6d 69   iFreePg, bCommi
1b6d0 74 29 3b 0a 20 20 20 20 20 20 72 65 6c 65 61 73  t);.      releas
1b6e0 65 50 61 67 65 28 70 4c 61 73 74 50 67 29 3b 0a  ePage(pLastPg);.
1b6f0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
1b700 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1b710 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1b720 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
1b730 0a 20 20 69 66 28 20 62 43 6f 6d 6d 69 74 3d 3d  .  if( bCommit==
1b740 30 20 29 7b 0a 20 20 20 20 64 6f 20 7b 0a 20 20  0 ){.    do {.  
1b750 20 20 20 20 69 4c 61 73 74 50 67 2d 2d 3b 0a 20      iLastPg--;. 
1b760 20 20 20 7d 77 68 69 6c 65 28 20 69 4c 61 73 74     }while( iLast
1b770 50 67 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  Pg==PENDING_BYTE
1b780 5f 50 41 47 45 28 70 42 74 29 20 7c 7c 20 50 54  _PAGE(pBt) || PT
1b790 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c  RMAP_ISPAGE(pBt,
1b7a0 20 69 4c 61 73 74 50 67 29 20 29 3b 0a 20 20 20   iLastPg) );.   
1b7b0 20 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74   pBt->bDoTruncat
1b7c0 65 20 3d 20 31 3b 0a 20 20 20 20 70 42 74 2d 3e  e = 1;.    pBt->
1b7d0 6e 50 61 67 65 20 3d 20 69 4c 61 73 74 50 67 3b  nPage = iLastPg;
1b7e0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
1b7f0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
1b800 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 6f  * The database o
1b810 70 65 6e 65 64 20 62 79 20 74 68 65 20 66 69 72  pened by the fir
1b820 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61  st argument is a
1b830 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61  n auto-vacuum da
1b840 74 61 62 61 73 65 0a 2a 2a 20 6e 4f 72 69 67 20  tabase.** nOrig 
1b850 70 61 67 65 73 20 69 6e 20 73 69 7a 65 20 63 6f  pages in size co
1b860 6e 74 61 69 6e 69 6e 67 20 6e 46 72 65 65 20 66  ntaining nFree f
1b870 72 65 65 20 70 61 67 65 73 2e 20 52 65 74 75 72  ree pages. Retur
1b880 6e 20 74 68 65 20 65 78 70 65 63 74 65 64 20 0a  n the expected .
1b890 2a 2a 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64  ** size of the d
1b8a0 61 74 61 62 61 73 65 20 69 6e 20 70 61 67 65 73  atabase in pages
1b8b0 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 6e 20 61 75   following an au
1b8c0 74 6f 2d 76 61 63 75 75 6d 20 6f 70 65 72 61 74  to-vacuum operat
1b8d0 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50  ion..*/.static P
1b8e0 67 6e 6f 20 66 69 6e 61 6c 44 62 53 69 7a 65 28  gno finalDbSize(
1b8f0 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50  BtShared *pBt, P
1b900 67 6e 6f 20 6e 4f 72 69 67 2c 20 50 67 6e 6f 20  gno nOrig, Pgno 
1b910 6e 46 72 65 65 29 7b 0a 20 20 69 6e 74 20 6e 45  nFree){.  int nE
1b920 6e 74 72 79 3b 20 20 20 20 20 20 20 20 20 20 20  ntry;           
1b930 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
1b940 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 6f  ber of entries o
1b950 6e 20 6f 6e 65 20 70 74 72 6d 61 70 20 70 61 67  n one ptrmap pag
1b960 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 50 74 72  e */.  Pgno nPtr
1b970 6d 61 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  map;            
1b980 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1b990 20 6f 66 20 50 74 72 4d 61 70 20 70 61 67 65 73   of PtrMap pages
1b9a0 20 74 6f 20 62 65 20 66 72 65 65 64 20 2a 2f 0a   to be freed */.
1b9b0 20 20 50 67 6e 6f 20 6e 46 69 6e 3b 20 20 20 20    Pgno nFin;    
1b9c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b9d0 20 20 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c 75    /* Return valu
1b9e0 65 20 2a 2f 0a 0a 20 20 6e 45 6e 74 72 79 20 3d  e */..  nEntry =
1b9f0 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
1ba00 2f 35 3b 0a 20 20 6e 50 74 72 6d 61 70 20 3d 20  /5;.  nPtrmap = 
1ba10 28 6e 46 72 65 65 2d 6e 4f 72 69 67 2b 50 54 52  (nFree-nOrig+PTR
1ba20 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20  MAP_PAGENO(pBt, 
1ba30 6e 4f 72 69 67 29 2b 6e 45 6e 74 72 79 29 2f 6e  nOrig)+nEntry)/n
1ba40 45 6e 74 72 79 3b 0a 20 20 6e 46 69 6e 20 3d 20  Entry;.  nFin = 
1ba50 6e 4f 72 69 67 20 2d 20 6e 46 72 65 65 20 2d 20  nOrig - nFree - 
1ba60 6e 50 74 72 6d 61 70 3b 0a 20 20 69 66 28 20 6e  nPtrmap;.  if( n
1ba70 4f 72 69 67 3e 50 45 4e 44 49 4e 47 5f 42 59 54  Orig>PENDING_BYT
1ba80 45 5f 50 41 47 45 28 70 42 74 29 20 26 26 20 6e  E_PAGE(pBt) && n
1ba90 46 69 6e 3c 50 45 4e 44 49 4e 47 5f 42 59 54 45  Fin<PENDING_BYTE
1baa0 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20  _PAGE(pBt) ){.  
1bab0 20 20 6e 46 69 6e 2d 2d 3b 0a 20 20 7d 0a 20 20    nFin--;.  }.  
1bac0 77 68 69 6c 65 28 20 50 54 52 4d 41 50 5f 49 53  while( PTRMAP_IS
1bad0 50 41 47 45 28 70 42 74 2c 20 6e 46 69 6e 29 20  PAGE(pBt, nFin) 
1bae0 7c 7c 20 6e 46 69 6e 3d 3d 50 45 4e 44 49 4e 47  || nFin==PENDING
1baf0 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
1bb00 29 7b 0a 20 20 20 20 6e 46 69 6e 2d 2d 3b 0a 20  ){.    nFin--;. 
1bb10 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 6e 46 69   }..  return nFi
1bb20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 77 72  n;.}../*.** A wr
1bb30 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
1bb40 6d 75 73 74 20 62 65 20 6f 70 65 6e 65 64 20 62  must be opened b
1bb50 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 74 68  efore calling th
1bb60 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 20  is function..** 
1bb70 49 74 20 70 65 72 66 6f 72 6d 73 20 61 20 73 69  It performs a si
1bb80 6e 67 6c 65 20 75 6e 69 74 20 6f 66 20 77 6f 72  ngle unit of wor
1bb90 6b 20 74 6f 77 61 72 64 73 20 61 6e 20 69 6e 63  k towards an inc
1bba0 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 2e  remental vacuum.
1bbb0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e  .**.** If the in
1bbc0 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d  cremental vacuum
1bbd0 20 69 73 20 66 69 6e 69 73 68 65 64 20 61 66 74   is finished aft
1bbe0 65 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  er this function
1bbf0 20 68 61 73 20 72 75 6e 2c 0a 2a 2a 20 53 51 4c   has run,.** SQL
1bc00 49 54 45 5f 44 4f 4e 45 20 69 73 20 72 65 74 75  ITE_DONE is retu
1bc10 72 6e 65 64 2e 20 49 66 20 69 74 20 69 73 20 6e  rned. If it is n
1bc20 6f 74 20 66 69 6e 69 73 68 65 64 2c 20 62 75 74  ot finished, but
1bc30 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 72   no error occurr
1bc40 65 64 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  ed,.** SQLITE_OK
1bc50 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74   is returned. Ot
1bc60 68 65 72 77 69 73 65 20 61 6e 20 53 51 4c 69 74  herwise an SQLit
1bc70 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 0a 2a  e error code. .*
1bc80 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
1bc90 65 65 49 6e 63 72 56 61 63 75 75 6d 28 42 74 72  eeIncrVacuum(Btr
1bca0 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63  ee *p){.  int rc
1bcb0 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
1bcc0 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 73  t = p->pBt;..  s
1bcd0 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
1bce0 28 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  (p);.  assert( p
1bcf0 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
1bd00 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 26  n==TRANS_WRITE &
1bd10 26 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52  & p->inTrans==TR
1bd20 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 69  ANS_WRITE );.  i
1bd30 66 28 20 21 70 42 74 2d 3e 61 75 74 6f 56 61 63  f( !pBt->autoVac
1bd40 75 75 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  uum ){.    rc = 
1bd50 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d  SQLITE_DONE;.  }
1bd60 65 6c 73 65 7b 0a 20 20 20 20 50 67 6e 6f 20 6e  else{.    Pgno n
1bd70 4f 72 69 67 20 3d 20 62 74 72 65 65 50 61 67 65  Orig = btreePage
1bd80 63 6f 75 6e 74 28 70 42 74 29 3b 0a 20 20 20 20  count(pBt);.    
1bd90 50 67 6e 6f 20 6e 46 72 65 65 20 3d 20 67 65 74  Pgno nFree = get
1bda0 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67  4byte(&pBt->pPag
1bdb0 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a  e1->aData[36]);.
1bdc0 20 20 20 20 50 67 6e 6f 20 6e 46 69 6e 20 3d 20      Pgno nFin = 
1bdd0 66 69 6e 61 6c 44 62 53 69 7a 65 28 70 42 74 2c  finalDbSize(pBt,
1bde0 20 6e 4f 72 69 67 2c 20 6e 46 72 65 65 29 3b 0a   nOrig, nFree);.
1bdf0 0a 20 20 20 20 69 66 28 20 6e 4f 72 69 67 3c 6e  .    if( nOrig<n
1be00 46 69 6e 20 29 7b 0a 20 20 20 20 20 20 72 63 20  Fin ){.      rc 
1be10 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
1be20 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 65 6c 73 65  _BKPT;.    }else
1be30 20 69 66 28 20 6e 46 72 65 65 3e 30 20 29 7b 0a   if( nFree>0 ){.
1be40 20 20 20 20 20 20 72 63 20 3d 20 73 61 76 65 41        rc = saveA
1be50 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20 30  llCursors(pBt, 0
1be60 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
1be70 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1be80 0a 20 20 20 20 20 20 20 20 69 6e 76 61 6c 69 64  .        invalid
1be90 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61  ateAllOverflowCa
1bea0 63 68 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20  che(pBt);.      
1beb0 20 20 72 63 20 3d 20 69 6e 63 72 56 61 63 75 75    rc = incrVacuu
1bec0 6d 53 74 65 70 28 70 42 74 2c 20 6e 46 69 6e 2c  mStep(pBt, nFin,
1bed0 20 6e 4f 72 69 67 2c 20 30 29 3b 0a 20 20 20 20   nOrig, 0);.    
1bee0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63    }.      if( rc
1bef0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1bf00 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
1bf10 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 42  te3PagerWrite(pB
1bf20 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62 50 61  t->pPage1->pDbPa
1bf30 67 65 29 3b 0a 20 20 20 20 20 20 20 20 70 75 74  ge);.        put
1bf40 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67  4byte(&pBt->pPag
1bf50 65 31 2d 3e 61 44 61 74 61 5b 32 38 5d 2c 20 70  e1->aData[28], p
1bf60 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20  Bt->nPage);.    
1bf70 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
1bf80 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1bf90 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d  _DONE;.    }.  }
1bfa0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
1bfb0 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
1bfc0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
1bfd0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
1bfe0 61 6c 6c 65 64 20 70 72 69 6f 72 20 74 6f 20 73  alled prior to s
1bff0 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69  qlite3PagerCommi
1c000 74 20 77 68 65 6e 20 61 20 74 72 61 6e 73 61 63  t when a transac
1c010 74 69 6f 6e 0a 2a 2a 20 69 73 20 63 6f 6d 6d 69  tion.** is commi
1c020 74 74 65 64 20 66 6f 72 20 61 6e 20 61 75 74 6f  tted for an auto
1c030 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65  -vacuum database
1c040 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54  ..**.** If SQLIT
1c050 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
1c060 2c 20 74 68 65 6e 20 2a 70 6e 54 72 75 6e 63 20  , then *pnTrunc 
1c070 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75  is set to the nu
1c080 6d 62 65 72 20 6f 66 20 70 61 67 65 73 0a 2a 2a  mber of pages.**
1c090 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1c0a0 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 74 72 75  le should be tru
1c0b0 6e 63 61 74 65 64 20 74 6f 20 64 75 72 69 6e 67  ncated to during
1c0c0 20 74 68 65 20 63 6f 6d 6d 69 74 20 70 72 6f 63   the commit proc
1c0d0 65 73 73 2e 20 0a 2a 2a 20 69 2e 65 2e 20 74 68  ess. .** i.e. th
1c0e0 65 20 64 61 74 61 62 61 73 65 20 68 61 73 20 62  e database has b
1c0f0 65 65 6e 20 72 65 6f 72 67 61 6e 69 7a 65 64 20  een reorganized 
1c100 73 6f 20 74 68 61 74 20 6f 6e 6c 79 20 74 68 65  so that only the
1c110 20 66 69 72 73 74 20 2a 70 6e 54 72 75 6e 63 0a   first *pnTrunc.
1c120 2a 2a 20 70 61 67 65 73 20 61 72 65 20 69 6e 20  ** pages are in 
1c130 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  use..*/.static i
1c140 6e 74 20 61 75 74 6f 56 61 63 75 75 6d 43 6f 6d  nt autoVacuumCom
1c150 6d 69 74 28 42 74 53 68 61 72 65 64 20 2a 70 42  mit(BtShared *pB
1c160 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  t){.  int rc = S
1c170 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 61 67 65  QLITE_OK;.  Page
1c180 72 20 2a 70 50 61 67 65 72 20 3d 20 70 42 74 2d  r *pPager = pBt-
1c190 3e 70 50 61 67 65 72 3b 0a 20 20 56 56 41 5f 4f  >pPager;.  VVA_O
1c1a0 4e 4c 59 28 20 69 6e 74 20 6e 52 65 66 20 3d 20  NLY( int nRef = 
1c1b0 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 63  sqlite3PagerRefc
1c1c0 6f 75 6e 74 28 70 50 61 67 65 72 29 20 29 3b 0a  ount(pPager) );.
1c1d0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
1c1e0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
1c1f0 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69  t->mutex) );.  i
1c200 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72  nvalidateAllOver
1c210 66 6c 6f 77 43 61 63 68 65 28 70 42 74 29 3b 0a  flowCache(pBt);.
1c220 20 20 61 73 73 65 72 74 28 70 42 74 2d 3e 61 75    assert(pBt->au
1c230 74 6f 56 61 63 75 75 6d 29 3b 0a 20 20 69 66 28  toVacuum);.  if(
1c240 20 21 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75   !pBt->incrVacuu
1c250 6d 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 46  m ){.    Pgno nF
1c260 69 6e 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  in;         /* N
1c270 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
1c280 6e 20 64 61 74 61 62 61 73 65 20 61 66 74 65 72  n database after
1c290 20 61 75 74 6f 76 61 63 75 75 6d 69 6e 67 20 2a   autovacuuming *
1c2a0 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 46 72 65 65  /.    Pgno nFree
1c2b0 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62  ;        /* Numb
1c2c0 65 72 20 6f 66 20 70 61 67 65 73 20 6f 6e 20 74  er of pages on t
1c2d0 68 65 20 66 72 65 65 6c 69 73 74 20 69 6e 69 74  he freelist init
1c2e0 69 61 6c 6c 79 20 2a 2f 0a 20 20 20 20 50 67 6e  ially */.    Pgn
1c2f0 6f 20 69 46 72 65 65 3b 20 20 20 20 20 20 20 20  o iFree;        
1c300 2f 2a 20 54 68 65 20 6e 65 78 74 20 70 61 67 65  /* The next page
1c310 20 74 6f 20 62 65 20 66 72 65 65 64 20 2a 2f 0a   to be freed */.
1c320 20 20 20 20 50 67 6e 6f 20 6e 4f 72 69 67 3b 20      Pgno nOrig; 
1c330 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
1c340 73 65 20 73 69 7a 65 20 62 65 66 6f 72 65 20 66  se size before f
1c350 72 65 65 69 6e 67 20 2a 2f 0a 0a 20 20 20 20 6e  reeing */..    n
1c360 4f 72 69 67 20 3d 20 62 74 72 65 65 50 61 67 65  Orig = btreePage
1c370 63 6f 75 6e 74 28 70 42 74 29 3b 0a 20 20 20 20  count(pBt);.    
1c380 69 66 28 20 50 54 52 4d 41 50 5f 49 53 50 41 47  if( PTRMAP_ISPAG
1c390 45 28 70 42 74 2c 20 6e 4f 72 69 67 29 20 7c 7c  E(pBt, nOrig) ||
1c3a0 20 6e 4f 72 69 67 3d 3d 50 45 4e 44 49 4e 47 5f   nOrig==PENDING_
1c3b0 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
1c3c0 7b 0a 20 20 20 20 20 20 2f 2a 20 49 74 20 69 73  {.      /* It is
1c3d0 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f   not possible to
1c3e0 20 63 72 65 61 74 65 20 61 20 64 61 74 61 62 61   create a databa
1c3f0 73 65 20 66 6f 72 20 77 68 69 63 68 20 74 68 65  se for which the
1c400 20 66 69 6e 61 6c 20 70 61 67 65 0a 20 20 20 20   final page.    
1c410 20 20 2a 2a 20 69 73 20 65 69 74 68 65 72 20 61    ** is either a
1c420 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67   pointer-map pag
1c430 65 20 6f 72 20 74 68 65 20 70 65 6e 64 69 6e 67  e or the pending
1c440 2d 62 79 74 65 20 70 61 67 65 2e 20 49 66 20 6f  -byte page. If o
1c450 6e 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 65  ne.      ** is e
1c460 6e 63 6f 75 6e 74 65 72 65 64 2c 20 74 68 69 73  ncountered, this
1c470 20 69 6e 64 69 63 61 74 65 73 20 63 6f 72 72 75   indicates corru
1c480 70 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a  ption..      */.
1c490 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1c4a0 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
1c4b0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6e 46 72  ;.    }..    nFr
1c4c0 65 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  ee = get4byte(&p
1c4d0 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74  Bt->pPage1->aDat
1c4e0 61 5b 33 36 5d 29 3b 0a 20 20 20 20 6e 46 69 6e  a[36]);.    nFin
1c4f0 20 3d 20 66 69 6e 61 6c 44 62 53 69 7a 65 28 70   = finalDbSize(p
1c500 42 74 2c 20 6e 4f 72 69 67 2c 20 6e 46 72 65 65  Bt, nOrig, nFree
1c510 29 3b 0a 20 20 20 20 69 66 28 20 6e 46 69 6e 3e  );.    if( nFin>
1c520 6e 4f 72 69 67 20 29 20 72 65 74 75 72 6e 20 53  nOrig ) return S
1c530 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
1c540 50 54 3b 0a 20 20 20 20 69 66 28 20 6e 46 69 6e  PT;.    if( nFin
1c550 3c 6e 4f 72 69 67 20 29 7b 0a 20 20 20 20 20 20  <nOrig ){.      
1c560 72 63 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73  rc = saveAllCurs
1c570 6f 72 73 28 70 42 74 2c 20 30 2c 20 30 29 3b 0a  ors(pBt, 0, 0);.
1c580 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 46      }.    for(iF
1c590 72 65 65 3d 6e 4f 72 69 67 3b 20 69 46 72 65 65  ree=nOrig; iFree
1c5a0 3e 6e 46 69 6e 20 26 26 20 72 63 3d 3d 53 51 4c  >nFin && rc==SQL
1c5b0 49 54 45 5f 4f 4b 3b 20 69 46 72 65 65 2d 2d 29  ITE_OK; iFree--)
1c5c0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 69 6e 63  {.      rc = inc
1c5d0 72 56 61 63 75 75 6d 53 74 65 70 28 70 42 74 2c  rVacuumStep(pBt,
1c5e0 20 6e 46 69 6e 2c 20 69 46 72 65 65 2c 20 31 29   nFin, iFree, 1)
1c5f0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1c600 28 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45  (rc==SQLITE_DONE
1c610 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   || rc==SQLITE_O
1c620 4b 29 20 26 26 20 6e 46 72 65 65 3e 30 20 29 7b  K) && nFree>0 ){
1c630 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
1c640 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 42  te3PagerWrite(pB
1c650 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62 50 61  t->pPage1->pDbPa
1c660 67 65 29 3b 0a 20 20 20 20 20 20 70 75 74 34 62  ge);.      put4b
1c670 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31  yte(&pBt->pPage1
1c680 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 30 29 3b  ->aData[32], 0);
1c690 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28  .      put4byte(
1c6a0 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44  &pBt->pPage1->aD
1c6b0 61 74 61 5b 33 36 5d 2c 20 30 29 3b 0a 20 20 20  ata[36], 0);.   
1c6c0 20 20 20 70 75 74 34 62 79 74 65 28 26 70 42 74     put4byte(&pBt
1c6d0 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  ->pPage1->aData[
1c6e0 32 38 5d 2c 20 6e 46 69 6e 29 3b 0a 20 20 20 20  28], nFin);.    
1c6f0 20 20 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61    pBt->bDoTrunca
1c700 74 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 42  te = 1;.      pB
1c710 74 2d 3e 6e 50 61 67 65 20 3d 20 6e 46 69 6e 3b  t->nPage = nFin;
1c720 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
1c730 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1c740 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
1c750 65 72 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65  erRollback(pPage
1c760 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  r);.    }.  }.. 
1c770 20 61 73 73 65 72 74 28 20 6e 52 65 66 3e 3d 73   assert( nRef>=s
1c780 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 63 6f  qlite3PagerRefco
1c790 75 6e 74 28 70 50 61 67 65 72 29 20 29 3b 0a 20  unt(pPager) );. 
1c7a0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
1c7b0 65 6c 73 65 20 2f 2a 20 69 66 6e 64 65 66 20 53  else /* ifndef S
1c7c0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
1c7d0 41 43 55 55 4d 20 2a 2f 0a 23 20 64 65 66 69 6e  ACUUM */.# defin
1c7e0 65 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70  e setChildPtrmap
1c7f0 73 28 78 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 23  s(x) SQLITE_OK.#
1c800 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  endif../*.** Thi
1c810 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 74  s routine does t
1c820 68 65 20 66 69 72 73 74 20 70 68 61 73 65 20 6f  he first phase o
1c830 66 20 61 20 74 77 6f 2d 70 68 61 73 65 20 63 6f  f a two-phase co
1c840 6d 6d 69 74 2e 20 20 54 68 69 73 20 72 6f 75 74  mmit.  This rout
1c850 69 6e 65 0a 2a 2a 20 63 61 75 73 65 73 20 61 20  ine.** causes a 
1c860 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
1c870 20 74 6f 20 62 65 20 63 72 65 61 74 65 64 20 28   to be created (
1c880 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 61  if it does not a
1c890 6c 72 65 61 64 79 20 65 78 69 73 74 29 0a 2a 2a  lready exist).**
1c8a0 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 64 20 77   and populated w
1c8b0 69 74 68 20 65 6e 6f 75 67 68 20 69 6e 66 6f 72  ith enough infor
1c8c0 6d 61 74 69 6f 6e 20 73 6f 20 74 68 61 74 20 69  mation so that i
1c8d0 66 20 61 20 70 6f 77 65 72 20 6c 6f 73 73 20 6f  f a power loss o
1c8e0 63 63 75 72 73 0a 2a 2a 20 74 68 65 20 64 61 74  ccurs.** the dat
1c8f0 61 62 61 73 65 20 63 61 6e 20 62 65 20 72 65 73  abase can be res
1c900 74 6f 72 65 64 20 74 6f 20 69 74 73 20 6f 72 69  tored to its ori
1c910 67 69 6e 61 6c 20 73 74 61 74 65 20 62 79 20 70  ginal state by p
1c920 6c 61 79 69 6e 67 20 62 61 63 6b 0a 2a 2a 20 74  laying back.** t
1c930 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65  he journal.  The
1c940 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  n the contents o
1c950 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 72  f the journal ar
1c960 65 20 66 6c 75 73 68 65 64 20 6f 75 74 20 74 6f  e flushed out to
1c970 0a 2a 2a 20 74 68 65 20 64 69 73 6b 2e 20 20 41  .** the disk.  A
1c980 66 74 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c  fter the journal
1c990 20 69 73 20 73 61 66 65 6c 79 20 6f 6e 20 6f 78   is safely on ox
1c9a0 69 64 65 2c 20 74 68 65 20 63 68 61 6e 67 65 73  ide, the changes
1c9b0 20 74 6f 20 74 68 65 0a 2a 2a 20 64 61 74 61 62   to the.** datab
1c9c0 61 73 65 20 61 72 65 20 77 72 69 74 74 65 6e 20  ase are written 
1c9d0 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  into the databas
1c9e0 65 20 66 69 6c 65 20 61 6e 64 20 66 6c 75 73 68  e file and flush
1c9f0 65 64 20 74 6f 20 6f 78 69 64 65 2e 0a 2a 2a 20  ed to oxide..** 
1ca00 41 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  At the end of th
1ca10 69 73 20 63 61 6c 6c 2c 20 74 68 65 20 72 6f 6c  is call, the rol
1ca20 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 73 74  lback journal st
1ca30 69 6c 6c 20 65 78 69 73 74 73 20 6f 6e 20 74 68  ill exists on th
1ca40 65 0a 2a 2a 20 64 69 73 6b 20 61 6e 64 20 77 65  e.** disk and we
1ca50 20 61 72 65 20 73 74 69 6c 6c 20 68 6f 6c 64 69   are still holdi
1ca60 6e 67 20 61 6c 6c 20 6c 6f 63 6b 73 2c 20 73 6f  ng all locks, so
1ca70 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
1ca80 20 68 61 73 20 6e 6f 74 0a 2a 2a 20 63 6f 6d 6d   has not.** comm
1ca90 69 74 74 65 64 2e 20 20 53 65 65 20 73 71 6c 69  itted.  See sqli
1caa0 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
1cab0 61 73 65 54 77 6f 28 29 20 66 6f 72 20 74 68 65  aseTwo() for the
1cac0 20 73 65 63 6f 6e 64 20 70 68 61 73 65 20 6f 66   second phase of
1cad0 20 74 68 65 0a 2a 2a 20 63 6f 6d 6d 69 74 20 70   the.** commit p
1cae0 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  rocess..**.** Th
1caf0 69 73 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d  is call is a no-
1cb00 6f 70 20 69 66 20 6e 6f 20 77 72 69 74 65 2d 74  op if no write-t
1cb10 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 75  ransaction is cu
1cb20 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65 20 6f  rrently active o
1cb30 6e 20 70 42 74 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68  n pBt..**.** Oth
1cb40 65 72 77 69 73 65 2c 20 73 79 6e 63 20 74 68 65  erwise, sync the
1cb50 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 66   database file f
1cb60 6f 72 20 74 68 65 20 62 74 72 65 65 20 70 42 74  or the btree pBt
1cb70 2e 20 7a 4d 61 73 74 65 72 20 70 6f 69 6e 74 73  . zMaster points
1cb80 20 74 6f 0a 2a 2a 20 74 68 65 20 6e 61 6d 65 20   to.** the name 
1cb90 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  of a master jour
1cba0 6e 61 6c 20 66 69 6c 65 20 74 68 61 74 20 73 68  nal file that sh
1cbb0 6f 75 6c 64 20 62 65 20 77 72 69 74 74 65 6e 20  ould be written 
1cbc0 69 6e 74 6f 20 74 68 65 0a 2a 2a 20 69 6e 64 69  into the.** indi
1cbd0 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 20 66  vidual journal f
1cbe0 69 6c 65 2c 20 6f 72 20 69 73 20 4e 55 4c 4c 2c  ile, or is NULL,
1cbf0 20 69 6e 64 69 63 61 74 69 6e 67 20 6e 6f 20 6d   indicating no m
1cc00 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
1cc10 6c 65 20 0a 2a 2a 20 28 73 69 6e 67 6c 65 20 64  le .** (single d
1cc20 61 74 61 62 61 73 65 20 74 72 61 6e 73 61 63 74  atabase transact
1cc30 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  ion)..**.** When
1cc40 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64 2c   this is called,
1cc50 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
1cc60 6e 61 6c 20 73 68 6f 75 6c 64 20 61 6c 72 65 61  nal should alrea
1cc70 64 79 20 68 61 76 65 20 62 65 65 6e 0a 2a 2a 20  dy have been.** 
1cc80 63 72 65 61 74 65 64 2c 20 70 6f 70 75 6c 61 74  created, populat
1cc90 65 64 20 77 69 74 68 20 74 68 69 73 20 6a 6f 75  ed with this jou
1cca0 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20 61 6e 64  rnal pointer and
1ccb0 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e   synced to disk.
1ccc0 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 74 68 69 73  .**.** Once this
1ccd0 20 69 73 20 72 6f 75 74 69 6e 65 20 68 61 73 20   is routine has 
1cce0 72 65 74 75 72 6e 65 64 2c 20 74 68 65 20 6f 6e  returned, the on
1ccf0 6c 79 20 74 68 69 6e 67 20 72 65 71 75 69 72 65  ly thing require
1cd00 64 20 74 6f 20 63 6f 6d 6d 69 74 0a 2a 2a 20 74  d to commit.** t
1cd10 68 65 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63  he write-transac
1cd20 74 69 6f 6e 20 66 6f 72 20 74 68 69 73 20 64 61  tion for this da
1cd30 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 74  tabase file is t
1cd40 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75  o delete the jou
1cd50 72 6e 61 6c 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rnal..*/.int sql
1cd60 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
1cd70 68 61 73 65 4f 6e 65 28 42 74 72 65 65 20 2a 70  haseOne(Btree *p
1cd80 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d  , const char *zM
1cd90 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  aster){.  int rc
1cda0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1cdb0 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d  if( p->inTrans==
1cdc0 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20  TRANS_WRITE ){. 
1cdd0 20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74     BtShared *pBt
1cde0 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 20 20 73   = p->pBt;.    s
1cdf0 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
1ce00 28 70 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  (p);.#ifndef SQL
1ce10 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
1ce20 55 55 4d 0a 20 20 20 20 69 66 28 20 70 42 74 2d  UUM.    if( pBt-
1ce30 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20  >autoVacuum ){. 
1ce40 20 20 20 20 20 72 63 20 3d 20 61 75 74 6f 56 61       rc = autoVa
1ce50 63 75 75 6d 43 6f 6d 6d 69 74 28 70 42 74 29 3b  cuumCommit(pBt);
1ce60 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
1ce70 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1ce80 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
1ce90 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 20 20  Leave(p);.      
1cea0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
1ceb0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
1cec0 66 28 20 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63  f( pBt->bDoTrunc
1ced0 61 74 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ate ){.      sql
1cee0 69 74 65 33 50 61 67 65 72 54 72 75 6e 63 61 74  ite3PagerTruncat
1cef0 65 49 6d 61 67 65 28 70 42 74 2d 3e 70 50 61 67  eImage(pBt->pPag
1cf00 65 72 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 3b  er, pBt->nPage);
1cf10 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
1cf20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1cf30 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  gerCommitPhaseOn
1cf40 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 7a  e(pBt->pPager, z
1cf50 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20 20 20 20  Master, 0);.    
1cf60 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
1cf70 65 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  e(p);.  }.  retu
1cf80 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1cf90 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
1cfa0 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 62 6f 74   called from bot
1cfb0 68 20 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  h BtreeCommitPha
1cfc0 73 65 54 77 6f 28 29 20 61 6e 64 20 42 74 72 65  seTwo() and Btre
1cfd0 65 52 6f 6c 6c 62 61 63 6b 28 29 0a 2a 2a 20 61  eRollback().** a
1cfe0 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e  t the conclusion
1cff0 20 6f 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   of a transactio
1d000 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  n..*/.static voi
1d010 64 20 62 74 72 65 65 45 6e 64 54 72 61 6e 73 61  d btreeEndTransa
1d020 63 74 69 6f 6e 28 42 74 72 65 65 20 2a 70 29 7b  ction(Btree *p){
1d030 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
1d040 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 73 71 6c   = p->pBt;.  sql
1d050 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62  ite3 *db = p->db
1d060 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
1d070 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74  te3BtreeHoldsMut
1d080 65 78 28 70 29 20 29 3b 0a 0a 23 69 66 6e 64 65  ex(p) );..#ifnde
1d090 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
1d0a0 54 4f 56 41 43 55 55 4d 0a 20 20 70 42 74 2d 3e  TOVACUUM.  pBt->
1d0b0 62 44 6f 54 72 75 6e 63 61 74 65 20 3d 20 30 3b  bDoTruncate = 0;
1d0c0 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 2d  .#endif.  if( p-
1d0d0 3e 69 6e 54 72 61 6e 73 3e 54 52 41 4e 53 5f 4e  >inTrans>TRANS_N
1d0e0 4f 4e 45 20 26 26 20 64 62 2d 3e 6e 56 64 62 65  ONE && db->nVdbe
1d0f0 52 65 61 64 3e 31 20 29 7b 0a 20 20 20 20 2f 2a  Read>1 ){.    /*
1d100 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6f 74   If there are ot
1d110 68 65 72 20 61 63 74 69 76 65 20 73 74 61 74 65  her active state
1d120 6d 65 6e 74 73 20 74 68 61 74 20 62 65 6c 6f 6e  ments that belon
1d130 67 20 74 6f 20 74 68 69 73 20 64 61 74 61 62 61  g to this databa
1d140 73 65 0a 20 20 20 20 2a 2a 20 68 61 6e 64 6c 65  se.    ** handle
1d150 2c 20 64 6f 77 6e 67 72 61 64 65 20 74 6f 20 61  , downgrade to a
1d160 20 72 65 61 64 2d 6f 6e 6c 79 20 74 72 61 6e 73   read-only trans
1d170 61 63 74 69 6f 6e 2e 20 54 68 65 20 6f 74 68 65  action. The othe
1d180 72 20 73 74 61 74 65 6d 65 6e 74 73 0a 20 20 20  r statements.   
1d190 20 2a 2a 20 6d 61 79 20 73 74 69 6c 6c 20 62 65   ** may still be
1d1a0 20 72 65 61 64 69 6e 67 20 66 72 6f 6d 20 74 68   reading from th
1d1b0 65 20 64 61 74 61 62 61 73 65 2e 20 20 2a 2f 0a  e database.  */.
1d1c0 20 20 20 20 64 6f 77 6e 67 72 61 64 65 41 6c 6c      downgradeAll
1d1d0 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
1d1e0 4c 6f 63 6b 73 28 70 29 3b 0a 20 20 20 20 70 2d  Locks(p);.    p-
1d1f0 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53  >inTrans = TRANS
1d200 5f 52 45 41 44 3b 0a 20 20 7d 65 6c 73 65 7b 0a  _READ;.  }else{.
1d210 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 68 61      /* If the ha
1d220 6e 64 6c 65 20 68 61 64 20 61 6e 79 20 6b 69 6e  ndle had any kin
1d230 64 20 6f 66 20 74 72 61 6e 73 61 63 74 69 6f 6e  d of transaction
1d240 20 6f 70 65 6e 2c 20 64 65 63 72 65 6d 65 6e 74   open, decrement
1d250 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 74 72 61   the .    ** tra
1d260 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 20 6f  nsaction count o
1d270 66 20 74 68 65 20 73 68 61 72 65 64 20 62 74 72  f the shared btr
1d280 65 65 2e 20 49 66 20 74 68 65 20 74 72 61 6e 73  ee. If the trans
1d290 61 63 74 69 6f 6e 20 63 6f 75 6e 74 20 0a 20 20  action count .  
1d2a0 20 20 2a 2a 20 72 65 61 63 68 65 73 20 30 2c 20    ** reaches 0, 
1d2b0 73 65 74 20 74 68 65 20 73 68 61 72 65 64 20 73  set the shared s
1d2c0 74 61 74 65 20 74 6f 20 54 52 41 4e 53 5f 4e 4f  tate to TRANS_NO
1d2d0 4e 45 2e 20 54 68 65 20 75 6e 6c 6f 63 6b 42 74  NE. The unlockBt
1d2e0 72 65 65 49 66 55 6e 75 73 65 64 28 29 0a 20 20  reeIfUnused().  
1d2f0 20 20 2a 2a 20 63 61 6c 6c 20 62 65 6c 6f 77 20    ** call below 
1d300 77 69 6c 6c 20 75 6e 6c 6f 63 6b 20 74 68 65 20  will unlock the 
1d310 70 61 67 65 72 2e 20 20 2a 2f 0a 20 20 20 20 69  pager.  */.    i
1d320 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 21 3d 54  f( p->inTrans!=T
1d330 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20  RANS_NONE ){.   
1d340 20 20 20 63 6c 65 61 72 41 6c 6c 53 68 61 72 65     clearAllShare
1d350 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73  dCacheTableLocks
1d360 28 70 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e  (p);.      pBt->
1d370 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2d 2d 3b 0a  nTransaction--;.
1d380 20 20 20 20 20 20 69 66 28 20 30 3d 3d 70 42 74        if( 0==pBt
1d390 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 29  ->nTransaction )
1d3a0 7b 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e 69  {.        pBt->i
1d3b0 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54  nTransaction = T
1d3c0 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20  RANS_NONE;.     
1d3d0 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
1d3e0 20 53 65 74 20 74 68 65 20 63 75 72 72 65 6e 74   Set the current
1d3f0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 74 61   transaction sta
1d400 74 65 20 74 6f 20 54 52 41 4e 53 5f 4e 4f 4e 45  te to TRANS_NONE
1d410 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74 68 65 20   and unlock the 
1d420 0a 20 20 20 20 2a 2a 20 70 61 67 65 72 20 69 66  .    ** pager if
1d430 20 74 68 69 73 20 63 61 6c 6c 20 63 6c 6f 73 65   this call close
1d440 64 20 74 68 65 20 6f 6e 6c 79 20 72 65 61 64 20  d the only read 
1d450 6f 72 20 77 72 69 74 65 20 74 72 61 6e 73 61 63  or write transac
1d460 74 69 6f 6e 2e 20 20 2a 2f 0a 20 20 20 20 70 2d  tion.  */.    p-
1d470 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53  >inTrans = TRANS
1d480 5f 4e 4f 4e 45 3b 0a 20 20 20 20 75 6e 6c 6f 63  _NONE;.    unloc
1d490 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 70  kBtreeIfUnused(p
1d4a0 42 74 29 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65  Bt);.  }..  btre
1d4b0 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 7d  eIntegrity(p);.}
1d4c0 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 74  ../*.** Commit t
1d4d0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  he transaction c
1d4e0 75 72 72 65 6e 74 6c 79 20 69 6e 20 70 72 6f 67  urrently in prog
1d4f0 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ress..**.** This
1d500 20 72 6f 75 74 69 6e 65 20 69 6d 70 6c 65 6d 65   routine impleme
1d510 6e 74 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70  nts the second p
1d520 68 61 73 65 20 6f 66 20 61 20 32 2d 70 68 61 73  hase of a 2-phas
1d530 65 20 63 6f 6d 6d 69 74 2e 20 20 54 68 65 0a 2a  e commit.  The.*
1d540 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  * sqlite3BtreeCo
1d550 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 20 72  mmitPhaseOne() r
1d560 6f 75 74 69 6e 65 20 64 6f 65 73 20 74 68 65 20  outine does the 
1d570 66 69 72 73 74 20 70 68 61 73 65 20 61 6e 64 20  first phase and 
1d580 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 69 6e 76  should.** be inv
1d590 6f 6b 65 64 20 70 72 69 6f 72 20 74 6f 20 63 61  oked prior to ca
1d5a0 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69  lling this routi
1d5b0 6e 65 2e 20 20 54 68 65 20 73 71 6c 69 74 65 33  ne.  The sqlite3
1d5c0 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
1d5d0 4f 6e 65 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65  One().** routine
1d5e0 20 64 69 64 20 61 6c 6c 20 74 68 65 20 77 6f 72   did all the wor
1d5f0 6b 20 6f 66 20 77 72 69 74 69 6e 67 20 69 6e 66  k of writing inf
1d600 6f 72 6d 61 74 69 6f 6e 20 6f 75 74 20 74 6f 20  ormation out to 
1d610 64 69 73 6b 20 61 6e 64 20 66 6c 75 73 68 69 6e  disk and flushin
1d620 67 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74  g the.** content
1d630 73 20 73 6f 20 74 68 61 74 20 74 68 65 79 20 61  s so that they a
1d640 72 65 20 77 72 69 74 74 65 6e 20 6f 6e 74 6f 20  re written onto 
1d650 74 68 65 20 64 69 73 6b 20 70 6c 61 74 74 65 72  the disk platter
1d660 2e 20 20 41 6c 6c 20 74 68 69 73 0a 2a 2a 20 72  .  All this.** r
1d670 6f 75 74 69 6e 65 20 68 61 73 20 74 6f 20 64 6f  outine has to do
1d680 20 69 73 20 64 65 6c 65 74 65 20 6f 72 20 74 72   is delete or tr
1d690 75 6e 63 61 74 65 20 6f 72 20 7a 65 72 6f 20 74  uncate or zero t
1d6a0 68 65 20 68 65 61 64 65 72 20 69 6e 20 74 68 65  he header in the
1d6b0 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  .** the rollback
1d6c0 20 6a 6f 75 72 6e 61 6c 20 28 77 68 69 63 68 20   journal (which 
1d6d0 63 61 75 73 65 73 20 74 68 65 20 74 72 61 6e 73  causes the trans
1d6e0 61 63 74 69 6f 6e 20 74 6f 20 63 6f 6d 6d 69 74  action to commit
1d6f0 29 20 61 6e 64 0a 2a 2a 20 64 72 6f 70 20 6c 6f  ) and.** drop lo
1d700 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61  cks..**.** Norma
1d710 6c 6c 79 2c 20 69 66 20 61 6e 20 65 72 72 6f 72  lly, if an error
1d720 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74 68   occurs while th
1d730 65 20 70 61 67 65 72 20 6c 61 79 65 72 20 69 73  e pager layer is
1d740 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 0a   attempting to .
1d750 2a 2a 20 66 69 6e 61 6c 69 7a 65 20 74 68 65 20  ** finalize the 
1d760 75 6e 64 65 72 6c 79 69 6e 67 20 6a 6f 75 72 6e  underlying journ
1d770 61 6c 20 66 69 6c 65 2c 20 74 68 69 73 20 66 75  al file, this fu
1d780 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 61  nction returns a
1d790 6e 20 65 72 72 6f 72 20 61 6e 64 0a 2a 2a 20 74  n error and.** t
1d7a0 68 65 20 75 70 70 65 72 20 6c 61 79 65 72 20 77  he upper layer w
1d7b0 69 6c 6c 20 61 74 74 65 6d 70 74 20 61 20 72 6f  ill attempt a ro
1d7c0 6c 6c 62 61 63 6b 2e 20 48 6f 77 65 76 65 72 2c  llback. However,
1d7d0 20 69 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61   if the second a
1d7e0 72 67 75 6d 65 6e 74 0a 2a 2a 20 69 73 20 6e 6f  rgument.** is no
1d7f0 6e 2d 7a 65 72 6f 20 74 68 65 6e 20 74 68 69 73  n-zero then this
1d800 20 62 2d 74 72 65 65 20 74 72 61 6e 73 61 63 74   b-tree transact
1d810 69 6f 6e 20 69 73 20 70 61 72 74 20 6f 66 20 61  ion is part of a
1d820 20 6d 75 6c 74 69 2d 66 69 6c 65 20 0a 2a 2a 20   multi-file .** 
1d830 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 6e 20  transaction. In 
1d840 74 68 69 73 20 63 61 73 65 2c 20 74 68 65 20 74  this case, the t
1d850 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 61  ransaction has a
1d860 6c 72 65 61 64 79 20 62 65 65 6e 20 63 6f 6d 6d  lready been comm
1d870 69 74 74 65 64 20 0a 2a 2a 20 28 62 79 20 64 65  itted .** (by de
1d880 6c 65 74 69 6e 67 20 61 20 6d 61 73 74 65 72 20  leting a master 
1d890 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20 61 6e  journal file) an
1d8a0 64 20 74 68 65 20 63 61 6c 6c 65 72 20 77 69 6c  d the caller wil
1d8b0 6c 20 69 67 6e 6f 72 65 20 74 68 69 73 20 0a 2a  l ignore this .*
1d8c0 2a 20 66 75 6e 63 74 69 6f 6e 73 20 72 65 74 75  * functions retu
1d8d0 72 6e 20 63 6f 64 65 2e 20 53 6f 2c 20 65 76 65  rn code. So, eve
1d8e0 6e 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  n if an error oc
1d8f0 63 75 72 73 20 69 6e 20 74 68 65 20 70 61 67 65  curs in the page
1d900 72 20 6c 61 79 65 72 2c 0a 2a 2a 20 72 65 73 65  r layer,.** rese
1d910 74 20 74 68 65 20 62 2d 74 72 65 65 20 6f 62 6a  t the b-tree obj
1d920 65 63 74 73 20 69 6e 74 65 72 6e 61 6c 20 73 74  ects internal st
1d930 61 74 65 20 74 6f 20 69 6e 64 69 63 61 74 65 20  ate to indicate 
1d940 74 68 61 74 20 74 68 65 20 77 72 69 74 65 0a 2a  that the write.*
1d950 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61  * transaction ha
1d960 73 20 62 65 65 6e 20 63 6c 6f 73 65 64 2e 20 54  s been closed. T
1d970 68 69 73 20 69 73 20 71 75 69 74 65 20 73 61 66  his is quite saf
1d980 65 2c 20 61 73 20 74 68 65 20 70 61 67 65 72 20  e, as the pager 
1d990 77 69 6c 6c 20 68 61 76 65 0a 2a 2a 20 74 72 61  will have.** tra
1d9a0 6e 73 69 74 69 6f 6e 65 64 20 74 6f 20 74 68 65  nsitioned to the
1d9b0 20 65 72 72 6f 72 20 73 74 61 74 65 2e 0a 2a 2a   error state..**
1d9c0 0a 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20 72 65  .** This will re
1d9d0 6c 65 61 73 65 20 74 68 65 20 77 72 69 74 65 20  lease the write 
1d9e0 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
1d9f0 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20 74  base file.  If t
1da00 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61  here.** are no a
1da10 63 74 69 76 65 20 63 75 72 73 6f 72 73 2c 20 69  ctive cursors, i
1da20 74 20 61 6c 73 6f 20 72 65 6c 65 61 73 65 73 20  t also releases 
1da30 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a  the read lock..*
1da40 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
1da50 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f  eeCommitPhaseTwo
1da60 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 62  (Btree *p, int b
1da70 43 6c 65 61 6e 75 70 29 7b 0a 0a 20 20 69 66 28  Cleanup){..  if(
1da80 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41   p->inTrans==TRA
1da90 4e 53 5f 4e 4f 4e 45 20 29 20 72 65 74 75 72 6e  NS_NONE ) return
1daa0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 73 71   SQLITE_OK;.  sq
1dab0 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
1dac0 70 29 3b 0a 20 20 62 74 72 65 65 49 6e 74 65 67  p);.  btreeInteg
1dad0 72 69 74 79 28 70 29 3b 0a 0a 20 20 2f 2a 20 49  rity(p);..  /* I
1dae0 66 20 74 68 65 20 68 61 6e 64 6c 65 20 68 61 73  f the handle has
1daf0 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63   a write-transac
1db00 74 69 6f 6e 20 6f 70 65 6e 2c 20 63 6f 6d 6d 69  tion open, commi
1db10 74 20 74 68 65 20 73 68 61 72 65 64 2d 62 74 72  t the shared-btr
1db20 65 65 73 20 0a 20 20 2a 2a 20 74 72 61 6e 73 61  ees .  ** transa
1db30 63 74 69 6f 6e 20 61 6e 64 20 73 65 74 20 74 68  ction and set th
1db40 65 20 73 68 61 72 65 64 20 73 74 61 74 65 20 74  e shared state t
1db50 6f 20 54 52 41 4e 53 5f 52 45 41 44 2e 0a 20 20  o TRANS_READ..  
1db60 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72  */.  if( p->inTr
1db70 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans==TRANS_WRITE
1db80 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a   ){.    int rc;.
1db90 20 20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42      BtShared *pB
1dba0 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 20 20  t = p->pBt;.    
1dbb0 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54  assert( pBt->inT
1dbc0 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e  ransaction==TRAN
1dbd0 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 20 20 61  S_WRITE );.    a
1dbe0 73 73 65 72 74 28 20 70 42 74 2d 3e 6e 54 72 61  ssert( pBt->nTra
1dbf0 6e 73 61 63 74 69 6f 6e 3e 30 20 29 3b 0a 20 20  nsaction>0 );.  
1dc00 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1dc10 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 54 77  gerCommitPhaseTw
1dc20 6f 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a  o(pBt->pPager);.
1dc30 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1dc40 54 45 5f 4f 4b 20 26 26 20 62 43 6c 65 61 6e 75  TE_OK && bCleanu
1dc50 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  p==0 ){.      sq
1dc60 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
1dc70 70 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  p);.      return
1dc80 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70   rc;.    }.    p
1dc90 2d 3e 69 44 61 74 61 56 65 72 73 69 6f 6e 2d 2d  ->iDataVersion--
1dca0 3b 20 20 2f 2a 20 43 6f 6d 70 65 6e 73 61 74 65  ;  /* Compensate
1dcb0 20 66 6f 72 20 70 50 61 67 65 72 2d 3e 69 44 61   for pPager->iDa
1dcc0 74 61 56 65 72 73 69 6f 6e 2b 2b 3b 20 2a 2f 0a  taVersion++; */.
1dcd0 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73      pBt->inTrans
1dce0 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 52  action = TRANS_R
1dcf0 45 41 44 3b 0a 20 20 20 20 62 74 72 65 65 43 6c  EAD;.    btreeCl
1dd00 65 61 72 48 61 73 43 6f 6e 74 65 6e 74 28 70 42  earHasContent(pB
1dd10 74 29 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65  t);.  }..  btree
1dd20 45 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70  EndTransaction(p
1dd30 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
1dd40 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
1dd50 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
1dd60 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 62 6f 74 68 20  ../*.** Do both 
1dd70 70 68 61 73 65 73 20 6f 66 20 61 20 63 6f 6d 6d  phases of a comm
1dd80 69 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  it..*/.int sqlit
1dd90 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 28 42 74  e3BtreeCommit(Bt
1dda0 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72  ree *p){.  int r
1ddb0 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  c;.  sqlite3Btre
1ddc0 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 72 63 20  eEnter(p);.  rc 
1ddd0 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  = sqlite3BtreeCo
1dde0 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 2c 20  mmitPhaseOne(p, 
1ddf0 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  0);.  if( rc==SQ
1de00 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
1de10 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
1de20 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70  CommitPhaseTwo(p
1de30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  , 0);.  }.  sqli
1de40 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
1de50 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
1de60 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
1de70 74 69 6e 65 20 73 65 74 73 20 74 68 65 20 73 74  tine sets the st
1de80 61 74 65 20 74 6f 20 43 55 52 53 4f 52 5f 46 41  ate to CURSOR_FA
1de90 55 4c 54 20 61 6e 64 20 74 68 65 20 65 72 72 6f  ULT and the erro
1dea0 72 0a 2a 2a 20 63 6f 64 65 20 74 6f 20 65 72 72  r.** code to err
1deb0 43 6f 64 65 20 66 6f 72 20 65 76 65 72 79 20 63  Code for every c
1dec0 75 72 73 6f 72 20 6f 6e 20 61 6e 79 20 42 74 53  ursor on any BtS
1ded0 68 61 72 65 64 20 74 68 61 74 20 70 42 74 72 65  hared that pBtre
1dee0 65 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 2e  e.** references.
1def0 20 20 4f 72 20 69 66 20 74 68 65 20 77 72 69 74    Or if the writ
1df00 65 4f 6e 6c 79 20 66 6c 61 67 20 69 73 20 73 65  eOnly flag is se
1df10 74 20 74 6f 20 31 2c 20 74 68 65 6e 20 6f 6e 6c  t to 1, then onl
1df20 79 0a 2a 2a 20 74 72 69 70 20 77 72 69 74 65 20  y.** trip write 
1df30 63 75 72 73 6f 72 73 20 61 6e 64 20 6c 65 61 76  cursors and leav
1df40 65 20 72 65 61 64 20 63 75 72 73 6f 72 73 20 75  e read cursors u
1df50 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20  nchanged..**.** 
1df60 45 76 65 72 79 20 63 75 72 73 6f 72 20 69 73 20  Every cursor is 
1df70 61 20 63 61 6e 64 69 64 61 74 65 20 74 6f 20 62  a candidate to b
1df80 65 20 74 72 69 70 70 65 64 2c 20 69 6e 63 6c 75  e tripped, inclu
1df90 64 69 6e 67 20 63 75 72 73 6f 72 73 0a 2a 2a 20  ding cursors.** 
1dfa0 74 68 61 74 20 62 65 6c 6f 6e 67 20 74 6f 20 6f  that belong to o
1dfb0 74 68 65 72 20 64 61 74 61 62 61 73 65 20 63 6f  ther database co
1dfc0 6e 6e 65 63 74 69 6f 6e 73 20 74 68 61 74 20 68  nnections that h
1dfd0 61 70 70 65 6e 20 74 6f 20 62 65 0a 2a 2a 20 73  appen to be.** s
1dfe0 68 61 72 69 6e 67 20 74 68 65 20 63 61 63 68 65  haring the cache
1dff0 20 77 69 74 68 20 70 42 74 72 65 65 2e 0a 2a 2a   with pBtree..**
1e000 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1e010 20 67 65 74 73 20 63 61 6c 6c 65 64 20 77 68 65   gets called whe
1e020 6e 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63  n a rollback occ
1e030 75 72 73 2e 20 49 66 20 74 68 65 20 77 72 69 74  urs. If the writ
1e040 65 4f 6e 6c 79 0a 2a 2a 20 66 6c 61 67 20 69 73  eOnly.** flag is
1e050 20 74 72 75 65 2c 20 74 68 65 6e 20 6f 6e 6c 79   true, then only
1e060 20 77 72 69 74 65 2d 63 75 72 73 6f 72 73 20 6e   write-cursors n
1e070 65 65 64 20 62 65 20 74 72 69 70 70 65 64 20 2d  eed be tripped -
1e080 20 72 65 61 64 2d 6f 6e 6c 79 0a 2a 2a 20 63 75   read-only.** cu
1e090 72 73 6f 72 73 20 73 61 76 65 20 74 68 65 69 72  rsors save their
1e0a0 20 63 75 72 72 65 6e 74 20 70 6f 73 69 74 69 6f   current positio
1e0b0 6e 73 20 73 6f 20 74 68 61 74 20 74 68 65 79 20  ns so that they 
1e0c0 6d 61 79 20 63 6f 6e 74 69 6e 75 65 20 0a 2a 2a  may continue .**
1e0d0 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 72   following the r
1e0e0 6f 6c 6c 62 61 63 6b 2e 20 4f 72 2c 20 69 66 20  ollback. Or, if 
1e0f0 77 72 69 74 65 4f 6e 6c 79 20 69 73 20 66 61 6c  writeOnly is fal
1e100 73 65 2c 20 61 6c 6c 20 63 75 72 73 6f 72 73 20  se, all cursors 
1e110 61 72 65 20 0a 2a 2a 20 74 72 69 70 70 65 64 2e  are .** tripped.
1e120 20 49 6e 20 67 65 6e 65 72 61 6c 2c 20 77 72 69   In general, wri
1e130 74 65 4f 6e 6c 79 20 69 73 20 66 61 6c 73 65 20  teOnly is false 
1e140 69 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  if the transacti
1e150 6f 6e 20 62 65 69 6e 67 0a 2a 2a 20 72 6f 6c 6c  on being.** roll
1e160 65 64 20 62 61 63 6b 20 6d 6f 64 69 66 69 65 64  ed back modified
1e170 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63   the database sc
1e180 68 65 6d 61 2e 20 49 6e 20 74 68 69 73 20 63 61  hema. In this ca
1e190 73 65 20 62 2d 74 72 65 65 20 72 6f 6f 74 0a 2a  se b-tree root.*
1e1a0 2a 20 70 61 67 65 73 20 6d 61 79 20 62 65 20 6d  * pages may be m
1e1b0 6f 76 65 64 20 6f 72 20 64 65 6c 65 74 65 64 20  oved or deleted 
1e1c0 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
1e1d0 65 20 61 6c 74 6f 67 65 74 68 65 72 2c 20 6d 61  e altogether, ma
1e1e0 6b 69 6e 67 0a 2a 2a 20 69 74 20 75 6e 73 61 66  king.** it unsaf
1e1f0 65 20 66 6f 72 20 72 65 61 64 20 63 75 72 73 6f  e for read curso
1e200 72 73 20 74 6f 20 63 6f 6e 74 69 6e 75 65 2e 0a  rs to continue..
1e210 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 77 72 69  **.** If the wri
1e220 74 65 4f 6e 6c 79 20 66 6c 61 67 20 69 73 20 74  teOnly flag is t
1e230 72 75 65 20 61 6e 64 20 61 6e 20 65 72 72 6f 72  rue and an error
1e240 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20   is encountered 
1e250 77 68 69 6c 65 20 0a 2a 2a 20 73 61 76 69 6e 67  while .** saving
1e260 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 6f 73   the current pos
1e270 69 74 69 6f 6e 20 6f 66 20 61 20 72 65 61 64 2d  ition of a read-
1e280 6f 6e 6c 79 20 63 75 72 73 6f 72 2c 20 61 6c 6c  only cursor, all
1e290 20 63 75 72 73 6f 72 73 2c 20 0a 2a 2a 20 69 6e   cursors, .** in
1e2a0 63 6c 75 64 69 6e 67 20 61 6c 6c 20 72 65 61 64  cluding all read
1e2b0 2d 63 75 72 73 6f 72 73 20 61 72 65 20 74 72 69  -cursors are tri
1e2c0 70 70 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49  pped..**.** SQLI
1e2d0 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
1e2e0 64 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 2c  d if successful,
1e2f0 20 6f 72 20 69 66 20 61 6e 20 65 72 72 6f 72 20   or if an error 
1e300 6f 63 63 75 72 73 20 77 68 69 6c 65 0a 2a 2a 20  occurs while.** 
1e310 73 61 76 69 6e 67 20 61 20 63 75 72 73 6f 72 20  saving a cursor 
1e320 70 6f 73 69 74 69 6f 6e 2c 20 61 6e 20 53 51 4c  position, an SQL
1e330 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a  ite error code..
1e340 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
1e350 72 65 65 54 72 69 70 41 6c 6c 43 75 72 73 6f 72  reeTripAllCursor
1e360 73 28 42 74 72 65 65 20 2a 70 42 74 72 65 65 2c  s(Btree *pBtree,
1e370 20 69 6e 74 20 65 72 72 43 6f 64 65 2c 20 69 6e   int errCode, in
1e380 74 20 77 72 69 74 65 4f 6e 6c 79 29 7b 0a 20 20  t writeOnly){.  
1e390 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 69  BtCursor *p;.  i
1e3a0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
1e3b0 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 28 77  K;..  assert( (w
1e3c0 72 69 74 65 4f 6e 6c 79 3d 3d 30 20 7c 7c 20 77  riteOnly==0 || w
1e3d0 72 69 74 65 4f 6e 6c 79 3d 3d 31 29 20 26 26 20  riteOnly==1) && 
1e3e0 42 54 43 46 5f 57 72 69 74 65 46 6c 61 67 3d 3d  BTCF_WriteFlag==
1e3f0 31 20 29 3b 0a 20 20 69 66 28 20 70 42 74 72 65  1 );.  if( pBtre
1e400 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  e ){.    sqlite3
1e410 42 74 72 65 65 45 6e 74 65 72 28 70 42 74 72 65  BtreeEnter(pBtre
1e420 65 29 3b 0a 20 20 20 20 66 6f 72 28 70 3d 70 42  e);.    for(p=pB
1e430 74 72 65 65 2d 3e 70 42 74 2d 3e 70 43 75 72 73  tree->pBt->pCurs
1e440 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78  or; p; p=p->pNex
1e450 74 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b  t){.      int i;
1e460 0a 20 20 20 20 20 20 69 66 28 20 77 72 69 74 65  .      if( write
1e470 4f 6e 6c 79 20 26 26 20 28 70 2d 3e 63 75 72 46  Only && (p->curF
1e480 6c 61 67 73 20 26 20 42 54 43 46 5f 57 72 69 74  lags & BTCF_Writ
1e490 65 46 6c 61 67 29 3d 3d 30 20 29 7b 0a 20 20 20  eFlag)==0 ){.   
1e4a0 20 20 20 20 20 69 66 28 20 70 2d 3e 65 53 74 61       if( p->eSta
1e4b0 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
1e4c0 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 43   || p->eState==C
1e4d0 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54 20 29  URSOR_SKIPNEXT )
1e4e0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
1e4f0 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74   saveCursorPosit
1e500 69 6f 6e 28 70 29 3b 0a 20 20 20 20 20 20 20 20  ion(p);.        
1e510 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1e520 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
1e530 20 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33     (void)sqlite3
1e540 42 74 72 65 65 54 72 69 70 41 6c 6c 43 75 72 73  BtreeTripAllCurs
1e550 6f 72 73 28 70 42 74 72 65 65 2c 20 72 63 2c 20  ors(pBtree, rc, 
1e560 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  0);.            
1e570 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
1e580 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
1e590 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1e5a0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c    sqlite3BtreeCl
1e5b0 65 61 72 43 75 72 73 6f 72 28 70 29 3b 0a 20 20  earCursor(p);.  
1e5c0 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65 20        p->eState 
1e5d0 3d 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 3b 0a  = CURSOR_FAULT;.
1e5e0 20 20 20 20 20 20 20 20 70 2d 3e 73 6b 69 70 4e          p->skipN
1e5f0 65 78 74 20 3d 20 65 72 72 43 6f 64 65 3b 0a 20  ext = errCode;. 
1e600 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72       }.      for
1e610 28 69 3d 30 3b 20 69 3c 3d 70 2d 3e 69 50 61 67  (i=0; i<=p->iPag
1e620 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  e; i++){.       
1e630 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 2d 3e   releasePage(p->
1e640 61 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20 20 20  apPage[i]);.    
1e650 20 20 20 20 70 2d 3e 61 70 50 61 67 65 5b 69 5d      p->apPage[i]
1e660 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
1e670 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 42    }.    sqlite3B
1e680 74 72 65 65 4c 65 61 76 65 28 70 42 74 72 65 65  treeLeave(pBtree
1e690 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
1e6a0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c  rc;.}../*.** Rol
1e6b0 6c 62 61 63 6b 20 74 68 65 20 74 72 61 6e 73 61  lback the transa
1e6c0 63 74 69 6f 6e 20 69 6e 20 70 72 6f 67 72 65 73  ction in progres
1e6d0 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 72 69 70  s..**.** If trip
1e6e0 43 6f 64 65 20 69 73 20 6e 6f 74 20 53 51 4c 49  Code is not SQLI
1e6f0 54 45 5f 4f 4b 20 74 68 65 6e 20 63 75 72 73 6f  TE_OK then curso
1e700 72 73 20 77 69 6c 6c 20 62 65 20 69 6e 76 61 6c  rs will be inval
1e710 69 64 61 74 65 64 20 28 74 72 69 70 70 65 64 29  idated (tripped)
1e720 2e 0a 2a 2a 20 4f 6e 6c 79 20 77 72 69 74 65 20  ..** Only write 
1e730 63 75 72 73 6f 72 73 20 61 72 65 20 74 72 69 70  cursors are trip
1e740 70 65 64 20 69 66 20 77 72 69 74 65 4f 6e 6c 79  ped if writeOnly
1e750 20 69 73 20 74 72 75 65 20 62 75 74 20 61 6c 6c   is true but all
1e760 20 63 75 72 73 6f 72 73 20 61 72 65 0a 2a 2a 20   cursors are.** 
1e770 74 72 69 70 70 65 64 20 69 66 20 77 72 69 74 65  tripped if write
1e780 4f 6e 6c 79 20 69 73 20 66 61 6c 73 65 2e 20 20  Only is false.  
1e790 41 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20 75  Any attempt to u
1e7a0 73 65 0a 2a 2a 20 61 20 74 72 69 70 70 65 64 20  se.** a tripped 
1e7b0 63 75 72 73 6f 72 20 77 69 6c 6c 20 72 65 73 75  cursor will resu
1e7c0 6c 74 20 69 6e 20 61 6e 20 65 72 72 6f 72 2e 0a  lt in an error..
1e7d0 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20  **.** This will 
1e7e0 72 65 6c 65 61 73 65 20 74 68 65 20 77 72 69 74  release the writ
1e7f0 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  e lock on the da
1e800 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66  tabase file.  If
1e810 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f   there.** are no
1e820 20 61 63 74 69 76 65 20 63 75 72 73 6f 72 73 2c   active cursors,
1e830 20 69 74 20 61 6c 73 6f 20 72 65 6c 65 61 73 65   it also release
1e840 73 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e  s the read lock.
1e850 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
1e860 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 42 74 72  treeRollback(Btr
1e870 65 65 20 2a 70 2c 20 69 6e 74 20 74 72 69 70 43  ee *p, int tripC
1e880 6f 64 65 2c 20 69 6e 74 20 77 72 69 74 65 4f 6e  ode, int writeOn
1e890 6c 79 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  ly){.  int rc;. 
1e8a0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
1e8b0 20 70 2d 3e 70 42 74 3b 0a 20 20 4d 65 6d 50 61   p->pBt;.  MemPa
1e8c0 67 65 20 2a 70 50 61 67 65 31 3b 0a 0a 20 20 61  ge *pPage1;..  a
1e8d0 73 73 65 72 74 28 20 77 72 69 74 65 4f 6e 6c 79  ssert( writeOnly
1e8e0 3d 3d 31 20 7c 7c 20 77 72 69 74 65 4f 6e 6c 79  ==1 || writeOnly
1e8f0 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
1e900 20 74 72 69 70 43 6f 64 65 3d 3d 53 51 4c 49 54   tripCode==SQLIT
1e910 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b  E_ABORT_ROLLBACK
1e920 20 7c 7c 20 74 72 69 70 43 6f 64 65 3d 3d 53 51   || tripCode==SQ
1e930 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 73 71 6c  LITE_OK );.  sql
1e940 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
1e950 29 3b 0a 20 20 69 66 28 20 74 72 69 70 43 6f 64  );.  if( tripCod
1e960 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  e==SQLITE_OK ){.
1e970 20 20 20 20 72 63 20 3d 20 74 72 69 70 43 6f 64      rc = tripCod
1e980 65 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73 6f  e = saveAllCurso
1e990 72 73 28 70 42 74 2c 20 30 2c 20 30 29 3b 0a 20  rs(pBt, 0, 0);. 
1e9a0 20 20 20 69 66 28 20 72 63 20 29 20 77 72 69 74     if( rc ) writ
1e9b0 65 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20 7d 65 6c  eOnly = 0;.  }el
1e9c0 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  se{.    rc = SQL
1e9d0 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66  ITE_OK;.  }.  if
1e9e0 28 20 74 72 69 70 43 6f 64 65 20 29 7b 0a 20 20  ( tripCode ){.  
1e9f0 20 20 69 6e 74 20 72 63 32 20 3d 20 73 71 6c 69    int rc2 = sqli
1ea00 74 65 33 42 74 72 65 65 54 72 69 70 41 6c 6c 43  te3BtreeTripAllC
1ea10 75 72 73 6f 72 73 28 70 2c 20 74 72 69 70 43 6f  ursors(p, tripCo
1ea20 64 65 2c 20 77 72 69 74 65 4f 6e 6c 79 29 3b 0a  de, writeOnly);.
1ea30 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d      assert( rc==
1ea40 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 77 72  SQLITE_OK || (wr
1ea50 69 74 65 4f 6e 6c 79 3d 3d 30 20 26 26 20 72 63  iteOnly==0 && rc
1ea60 32 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 29 3b  2==SQLITE_OK) );
1ea70 0a 20 20 20 20 69 66 28 20 72 63 32 21 3d 53 51  .    if( rc2!=SQ
1ea80 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20 72  LITE_OK ) rc = r
1ea90 63 32 3b 0a 20 20 7d 0a 20 20 62 74 72 65 65 49  c2;.  }.  btreeI
1eaa0 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 0a 20 20  ntegrity(p);..  
1eab0 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d  if( p->inTrans==
1eac0 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20  TRANS_WRITE ){. 
1ead0 20 20 20 69 6e 74 20 72 63 32 3b 0a 0a 20 20 20     int rc2;..   
1eae0 20 61 73 73 65 72 74 28 20 54 52 41 4e 53 5f 57   assert( TRANS_W
1eaf0 52 49 54 45 3d 3d 70 42 74 2d 3e 69 6e 54 72 61  RITE==pBt->inTra
1eb00 6e 73 61 63 74 69 6f 6e 20 29 3b 0a 20 20 20 20  nsaction );.    
1eb10 72 63 32 20 3d 20 73 71 6c 69 74 65 33 50 61 67  rc2 = sqlite3Pag
1eb20 65 72 52 6f 6c 6c 62 61 63 6b 28 70 42 74 2d 3e  erRollback(pBt->
1eb30 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28  pPager);.    if(
1eb40 20 72 63 32 21 3d 53 51 4c 49 54 45 5f 4f 4b 20   rc2!=SQLITE_OK 
1eb50 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 72 63  ){.      rc = rc
1eb60 32 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  2;.    }..    /*
1eb70 20 54 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6d 61   The rollback ma
1eb80 79 20 68 61 76 65 20 64 65 73 74 72 6f 79 65 64  y have destroyed
1eb90 20 74 68 65 20 70 50 61 67 65 31 2d 3e 61 44 61   the pPage1->aDa
1eba0 74 61 20 76 61 6c 75 65 2e 20 20 53 6f 0a 20 20  ta value.  So.  
1ebb0 20 20 2a 2a 20 63 61 6c 6c 20 62 74 72 65 65 47    ** call btreeG
1ebc0 65 74 50 61 67 65 28 29 20 6f 6e 20 70 61 67 65  etPage() on page
1ebd0 20 31 20 61 67 61 69 6e 20 74 6f 20 6d 61 6b 65   1 again to make
1ebe0 0a 20 20 20 20 2a 2a 20 73 75 72 65 20 70 50 61  .    ** sure pPa
1ebf0 67 65 31 2d 3e 61 44 61 74 61 20 69 73 20 73 65  ge1->aData is se
1ec00 74 20 63 6f 72 72 65 63 74 6c 79 2e 20 2a 2f 0a  t correctly. */.
1ec10 20 20 20 20 69 66 28 20 62 74 72 65 65 47 65 74      if( btreeGet
1ec20 50 61 67 65 28 70 42 74 2c 20 31 2c 20 26 70 50  Page(pBt, 1, &pP
1ec30 61 67 65 31 2c 20 30 29 3d 3d 53 51 4c 49 54 45  age1, 0)==SQLITE
1ec40 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  _OK ){.      int
1ec50 20 6e 50 61 67 65 20 3d 20 67 65 74 34 62 79 74   nPage = get4byt
1ec60 65 28 32 38 2b 28 75 38 2a 29 70 50 61 67 65 31  e(28+(u8*)pPage1
1ec70 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 20 20  ->aData);.      
1ec80 74 65 73 74 63 61 73 65 28 20 6e 50 61 67 65 3d  testcase( nPage=
1ec90 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  =0 );.      if( 
1eca0 6e 50 61 67 65 3d 3d 30 20 29 20 73 71 6c 69 74  nPage==0 ) sqlit
1ecb0 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74  e3PagerPagecount
1ecc0 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 6e  (pBt->pPager, &n
1ecd0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 74 65 73  Page);.      tes
1ece0 74 63 61 73 65 28 20 70 42 74 2d 3e 6e 50 61 67  tcase( pBt->nPag
1ecf0 65 21 3d 6e 50 61 67 65 20 29 3b 0a 20 20 20 20  e!=nPage );.    
1ed00 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 6e    pBt->nPage = n
1ed10 50 61 67 65 3b 0a 20 20 20 20 20 20 72 65 6c 65  Page;.      rele
1ed20 61 73 65 50 61 67 65 28 70 50 61 67 65 31 29 3b  asePage(pPage1);
1ed30 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
1ed40 74 28 20 63 6f 75 6e 74 56 61 6c 69 64 43 75 72  t( countValidCur
1ed50 73 6f 72 73 28 70 42 74 2c 20 31 29 3d 3d 30 20  sors(pBt, 1)==0 
1ed60 29 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e 54 72  );.    pBt->inTr
1ed70 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e  ansaction = TRAN
1ed80 53 5f 52 45 41 44 3b 0a 20 20 20 20 62 74 72 65  S_READ;.    btre
1ed90 65 43 6c 65 61 72 48 61 73 43 6f 6e 74 65 6e 74  eClearHasContent
1eda0 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 20 20 62 74  (pBt);.  }..  bt
1edb0 72 65 65 45 6e 64 54 72 61 6e 73 61 63 74 69 6f  reeEndTransactio
1edc0 6e 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  n(p);.  sqlite3B
1edd0 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
1ede0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1edf0 0a 2a 2a 20 53 74 61 72 74 20 61 20 73 74 61 74  .** Start a stat
1ee00 65 6d 65 6e 74 20 73 75 62 74 72 61 6e 73 61 63  ement subtransac
1ee10 74 69 6f 6e 2e 20 54 68 65 20 73 75 62 74 72 61  tion. The subtra
1ee20 6e 73 61 63 74 69 6f 6e 20 63 61 6e 20 62 65 20  nsaction can be 
1ee30 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20 69  rolled.** back i
1ee40 6e 64 65 70 65 6e 64 65 6e 74 6c 79 20 6f 66 20  ndependently of 
1ee50 74 68 65 20 6d 61 69 6e 20 74 72 61 6e 73 61 63  the main transac
1ee60 74 69 6f 6e 2e 20 59 6f 75 20 6d 75 73 74 20 73  tion. You must s
1ee70 74 61 72 74 20 61 20 74 72 61 6e 73 61 63 74 69  tart a transacti
1ee80 6f 6e 20 0a 2a 2a 20 62 65 66 6f 72 65 20 73 74  on .** before st
1ee90 61 72 74 69 6e 67 20 61 20 73 75 62 74 72 61 6e  arting a subtran
1eea0 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 73 75 62  saction. The sub
1eeb0 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 65  transaction is e
1eec0 6e 64 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c  nded automatical
1eed0 6c 79 20 0a 2a 2a 20 69 66 20 74 68 65 20 6d 61  ly .** if the ma
1eee0 69 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  in transaction c
1eef0 6f 6d 6d 69 74 73 20 6f 72 20 72 6f 6c 6c 73 20  ommits or rolls 
1ef00 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 74 61 74  back..**.** Stat
1ef10 65 6d 65 6e 74 20 73 75 62 74 72 61 6e 73 61 63  ement subtransac
1ef20 74 69 6f 6e 73 20 61 72 65 20 75 73 65 64 20 61  tions are used a
1ef30 72 6f 75 6e 64 20 69 6e 64 69 76 69 64 75 61 6c  round individual
1ef40 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 0a   SQL statements.
1ef50 2a 2a 20 74 68 61 74 20 61 72 65 20 63 6f 6e 74  ** that are cont
1ef60 61 69 6e 65 64 20 77 69 74 68 69 6e 20 61 20 42  ained within a B
1ef70 45 47 49 4e 2e 2e 2e 43 4f 4d 4d 49 54 20 62 6c  EGIN...COMMIT bl
1ef80 6f 63 6b 2e 20 20 49 66 20 61 20 63 6f 6e 73 74  ock.  If a const
1ef90 72 61 69 6e 74 0a 2a 2a 20 65 72 72 6f 72 20 6f  raint.** error o
1efa0 63 63 75 72 73 20 77 69 74 68 69 6e 20 74 68 65  ccurs within the
1efb0 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 20   statement, the 
1efc0 65 66 66 65 63 74 20 6f 66 20 74 68 61 74 20 6f  effect of that o
1efd0 6e 65 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20  ne statement.** 
1efe0 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64 20 62 61  can be rolled ba
1eff0 63 6b 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e  ck without havin
1f000 67 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68  g to rollback th
1f010 65 20 65 6e 74 69 72 65 20 74 72 61 6e 73 61 63  e entire transac
1f020 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20 73 74  tion..**.** A st
1f030 61 74 65 6d 65 6e 74 20 73 75 62 2d 74 72 61 6e  atement sub-tran
1f040 73 61 63 74 69 6f 6e 20 69 73 20 69 6d 70 6c 65  saction is imple
1f050 6d 65 6e 74 65 64 20 61 73 20 61 6e 20 61 6e 6f  mented as an ano
1f060 6e 79 6d 6f 75 73 20 73 61 76 65 70 6f 69 6e 74  nymous savepoint
1f070 2e 20 54 68 65 0a 2a 2a 20 76 61 6c 75 65 20 70  . The.** value p
1f080 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
1f090 6f 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69 73  ond parameter is
1f0a0 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65   the total numbe
1f0b0 72 20 6f 66 20 73 61 76 65 70 6f 69 6e 74 73 2c  r of savepoints,
1f0c0 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20 74 68  .** including th
1f0d0 65 20 6e 65 77 20 61 6e 6f 6e 79 6d 6f 75 73 20  e new anonymous 
1f0e0 73 61 76 65 70 6f 69 6e 74 2c 20 6f 70 65 6e 20  savepoint, open 
1f0f0 6f 6e 20 74 68 65 20 42 2d 54 72 65 65 2e 20 69  on the B-Tree. i
1f100 2e 65 2e 20 69 66 20 74 68 65 72 65 0a 2a 2a 20  .e. if there.** 
1f110 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20 73 61  are no active sa
1f120 76 65 70 6f 69 6e 74 73 20 61 6e 64 20 6e 6f 20  vepoints and no 
1f130 6f 74 68 65 72 20 73 74 61 74 65 6d 65 6e 74 2d  other statement-
1f140 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 6f 70 65  transactions ope
1f150 6e 2c 0a 2a 2a 20 69 53 74 61 74 65 6d 65 6e 74  n,.** iStatement
1f160 20 69 73 20 31 2e 20 54 68 69 73 20 61 6e 6f 6e   is 1. This anon
1f170 79 6d 6f 75 73 20 73 61 76 65 70 6f 69 6e 74 20  ymous savepoint 
1f180 63 61 6e 20 62 65 20 72 65 6c 65 61 73 65 64 20  can be released 
1f190 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63 6b 0a 2a  or rolled back.*
1f1a0 2a 20 75 73 69 6e 67 20 74 68 65 20 73 71 6c 69  * using the sqli
1f1b0 74 65 33 42 74 72 65 65 53 61 76 65 70 6f 69 6e  te3BtreeSavepoin
1f1c0 74 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f  t() function..*/
1f1d0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
1f1e0 65 42 65 67 69 6e 53 74 6d 74 28 42 74 72 65 65  eBeginStmt(Btree
1f1f0 20 2a 70 2c 20 69 6e 74 20 69 53 74 61 74 65 6d   *p, int iStatem
1f200 65 6e 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ent){.  int rc;.
1f210 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
1f220 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69  = p->pBt;.  sqli
1f230 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
1f240 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69  ;.  assert( p->i
1f250 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52  nTrans==TRANS_WR
1f260 49 54 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ITE );.  assert(
1f270 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20   (pBt->btsFlags 
1f280 26 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 29  & BTS_READ_ONLY)
1f290 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
1f2a0 20 69 53 74 61 74 65 6d 65 6e 74 3e 30 20 29 3b   iStatement>0 );
1f2b0 0a 20 20 61 73 73 65 72 74 28 20 69 53 74 61 74  .  assert( iStat
1f2c0 65 6d 65 6e 74 3e 70 2d 3e 64 62 2d 3e 6e 53 61  ement>p->db->nSa
1f2d0 76 65 70 6f 69 6e 74 20 29 3b 0a 20 20 61 73 73  vepoint );.  ass
1f2e0 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e  ert( pBt->inTran
1f2f0 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57  saction==TRANS_W
1f300 52 49 54 45 20 29 3b 0a 20 20 2f 2a 20 41 74 20  RITE );.  /* At 
1f310 74 68 65 20 70 61 67 65 72 20 6c 65 76 65 6c 2c  the pager level,
1f320 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61   a statement tra
1f330 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 20 73 61  nsaction is a sa
1f340 76 65 70 6f 69 6e 74 20 77 69 74 68 0a 20 20 2a  vepoint with.  *
1f350 2a 20 61 6e 20 69 6e 64 65 78 20 67 72 65 61 74  * an index great
1f360 65 72 20 74 68 61 6e 20 61 6c 6c 20 73 61 76 65  er than all save
1f370 70 6f 69 6e 74 73 20 63 72 65 61 74 65 64 20 65  points created e
1f380 78 70 6c 69 63 69 74 6c 79 20 75 73 69 6e 67 0a  xplicitly using.
1f390 20 20 2a 2a 20 53 51 4c 20 73 74 61 74 65 6d 65    ** SQL stateme
1f3a0 6e 74 73 2e 20 49 74 20 69 73 20 69 6c 6c 65 67  nts. It is illeg
1f3b0 61 6c 20 74 6f 20 6f 70 65 6e 2c 20 72 65 6c 65  al to open, rele
1f3c0 61 73 65 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20  ase or rollback 
1f3d0 61 6e 79 0a 20 20 2a 2a 20 73 75 63 68 20 73 61  any.  ** such sa
1f3e0 76 65 70 6f 69 6e 74 73 20 77 68 69 6c 65 20 74  vepoints while t
1f3f0 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61  he statement tra
1f400 6e 73 61 63 74 69 6f 6e 20 73 61 76 65 70 6f 69  nsaction savepoi
1f410 6e 74 20 69 73 20 61 63 74 69 76 65 2e 0a 20 20  nt is active..  
1f420 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  */.  rc = sqlite
1f430 33 50 61 67 65 72 4f 70 65 6e 53 61 76 65 70 6f  3PagerOpenSavepo
1f440 69 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  int(pBt->pPager,
1f450 20 69 53 74 61 74 65 6d 65 6e 74 29 3b 0a 20 20   iStatement);.  
1f460 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
1f470 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
1f480 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  c;.}../*.** The 
1f490 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
1f4a0 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
1f4b0 2c 20 6f 70 2c 20 69 73 20 61 6c 77 61 79 73 20  , op, is always 
1f4c0 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
1f4d0 43 4b 0a 2a 2a 20 6f 72 20 53 41 56 45 50 4f 49  CK.** or SAVEPOI
1f4e0 4e 54 5f 52 45 4c 45 41 53 45 2e 20 54 68 69 73  NT_RELEASE. This
1f4f0 20 66 75 6e 63 74 69 6f 6e 20 65 69 74 68 65 72   function either
1f500 20 72 65 6c 65 61 73 65 73 20 6f 72 20 72 6f 6c   releases or rol
1f510 6c 73 20 62 61 63 6b 20 74 68 65 0a 2a 2a 20 73  ls back the.** s
1f520 61 76 65 70 6f 69 6e 74 20 69 64 65 6e 74 69 66  avepoint identif
1f530 69 65 64 20 62 79 20 70 61 72 61 6d 65 74 65 72  ied by parameter
1f540 20 69 53 61 76 65 70 6f 69 6e 74 2c 20 64 65 70   iSavepoint, dep
1f550 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20 76 61  ending on the va
1f560 6c 75 65 20 0a 2a 2a 20 6f 66 20 6f 70 2e 0a 2a  lue .** of op..*
1f570 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69  *.** Normally, i
1f580 53 61 76 65 70 6f 69 6e 74 20 69 73 20 67 72 65  Savepoint is gre
1f590 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75  ater than or equ
1f5a0 61 6c 20 74 6f 20 7a 65 72 6f 2e 20 48 6f 77 65  al to zero. Howe
1f5b0 76 65 72 2c 20 69 66 20 6f 70 20 69 73 0a 2a 2a  ver, if op is.**
1f5c0 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42   SAVEPOINT_ROLLB
1f5d0 41 43 4b 2c 20 74 68 65 6e 20 69 53 61 76 65 70  ACK, then iSavep
1f5e0 6f 69 6e 74 20 6d 61 79 20 61 6c 73 6f 20 62 65  oint may also be
1f5f0 20 2d 31 2e 20 49 6e 20 74 68 69 73 20 63 61 73   -1. In this cas
1f600 65 20 74 68 65 20 0a 2a 2a 20 63 6f 6e 74 65 6e  e the .** conten
1f610 74 73 20 6f 66 20 74 68 65 20 65 6e 74 69 72 65  ts of the entire
1f620 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 72 65   transaction are
1f630 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 54 68   rolled back. Th
1f640 69 73 20 69 73 20 64 69 66 66 65 72 65 6e 74 0a  is is different.
1f650 2a 2a 20 66 72 6f 6d 20 61 20 6e 6f 72 6d 61 6c  ** from a normal
1f660 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 72 6f 6c   transaction rol
1f670 6c 62 61 63 6b 2c 20 61 73 20 6e 6f 20 6c 6f 63  lback, as no loc
1f680 6b 73 20 61 72 65 20 72 65 6c 65 61 73 65 64 20  ks are released 
1f690 61 6e 64 20 74 68 65 0a 2a 2a 20 74 72 61 6e 73  and the.** trans
1f6a0 61 63 74 69 6f 6e 20 72 65 6d 61 69 6e 73 20 6f  action remains o
1f6b0 70 65 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  pen..*/.int sqli
1f6c0 74 65 33 42 74 72 65 65 53 61 76 65 70 6f 69 6e  te3BtreeSavepoin
1f6d0 74 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  t(Btree *p, int 
1f6e0 6f 70 2c 20 69 6e 74 20 69 53 61 76 65 70 6f 69  op, int iSavepoi
1f6f0 6e 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  nt){.  int rc = 
1f700 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28  SQLITE_OK;.  if(
1f710 20 70 20 26 26 20 70 2d 3e 69 6e 54 72 61 6e 73   p && p->inTrans
1f720 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b  ==TRANS_WRITE ){
1f730 0a 20 20 20 20 42 74 53 68 61 72 65 64 20 2a 70  .    BtShared *p
1f740 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 20  Bt = p->pBt;.   
1f750 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 53 41 56   assert( op==SAV
1f760 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 20 7c  EPOINT_RELEASE |
1f770 7c 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f  | op==SAVEPOINT_
1f780 52 4f 4c 4c 42 41 43 4b 20 29 3b 0a 20 20 20 20  ROLLBACK );.    
1f790 61 73 73 65 72 74 28 20 69 53 61 76 65 70 6f 69  assert( iSavepoi
1f7a0 6e 74 3e 3d 30 20 7c 7c 20 28 69 53 61 76 65 70  nt>=0 || (iSavep
1f7b0 6f 69 6e 74 3d 3d 2d 31 20 26 26 20 6f 70 3d 3d  oint==-1 && op==
1f7c0 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
1f7d0 43 4b 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  CK) );.    sqlit
1f7e0 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
1f7f0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
1f800 33 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 28  3PagerSavepoint(
1f810 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6f 70 2c  pBt->pPager, op,
1f820 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20   iSavepoint);.  
1f830 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1f840 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28  _OK ){.      if(
1f850 20 69 53 61 76 65 70 6f 69 6e 74 3c 30 20 26 26   iSavepoint<0 &&
1f860 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20   (pBt->btsFlags 
1f870 26 20 42 54 53 5f 49 4e 49 54 49 41 4c 4c 59 5f  & BTS_INITIALLY_
1f880 45 4d 50 54 59 29 21 3d 30 20 29 7b 0a 20 20 20  EMPTY)!=0 ){.   
1f890 20 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 20       pBt->nPage 
1f8a0 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
1f8b0 20 20 20 72 63 20 3d 20 6e 65 77 44 61 74 61 62     rc = newDatab
1f8c0 61 73 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20  ase(pBt);.      
1f8d0 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 67 65 74  pBt->nPage = get
1f8e0 34 62 79 74 65 28 32 38 20 2b 20 70 42 74 2d 3e  4byte(28 + pBt->
1f8f0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 29 3b 0a  pPage1->aData);.
1f900 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61  .      /* The da
1f910 74 61 62 61 73 65 20 73 69 7a 65 20 77 61 73 20  tabase size was 
1f920 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
1f930 20 6f 66 66 73 65 74 20 32 38 20 6f 66 20 74 68   offset 28 of th
1f940 65 20 68 65 61 64 65 72 0a 20 20 20 20 20 20 2a  e header.      *
1f950 2a 20 77 68 65 6e 20 74 68 65 20 74 72 61 6e 73  * when the trans
1f960 61 63 74 69 6f 6e 20 73 74 61 72 74 65 64 2c 20  action started, 
1f970 73 6f 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20  so we know that 
1f980 74 68 65 20 76 61 6c 75 65 20 61 74 20 6f 66 66  the value at off
1f990 73 65 74 0a 20 20 20 20 20 20 2a 2a 20 32 38 20  set.      ** 28 
1f9a0 69 73 20 6e 6f 6e 7a 65 72 6f 2e 20 2a 2f 0a 20  is nonzero. */. 
1f9b0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74       assert( pBt
1f9c0 2d 3e 6e 50 61 67 65 3e 30 20 29 3b 0a 20 20 20  ->nPage>0 );.   
1f9d0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74   }.    sqlite3Bt
1f9e0 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d  reeLeave(p);.  }
1f9f0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1fa00 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20  ./*.** Create a 
1fa10 6e 65 77 20 63 75 72 73 6f 72 20 66 6f 72 20 74  new cursor for t
1fa20 68 65 20 42 54 72 65 65 20 77 68 6f 73 65 20 72  he BTree whose r
1fa30 6f 6f 74 20 69 73 20 6f 6e 20 74 68 65 20 70 61  oot is on the pa
1fa40 67 65 0a 2a 2a 20 69 54 61 62 6c 65 2e 20 49 66  ge.** iTable. If
1fa50 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 63 75 72   a read-only cur
1fa60 73 6f 72 20 69 73 20 72 65 71 75 65 73 74 65 64  sor is requested
1fa70 2c 20 69 74 20 69 73 20 61 73 73 75 6d 65 64 20  , it is assumed 
1fa80 74 68 61 74 0a 2a 2a 20 74 68 65 20 63 61 6c 6c  that.** the call
1fa90 65 72 20 61 6c 72 65 61 64 79 20 68 61 73 20 61  er already has a
1faa0 74 20 6c 65 61 73 74 20 61 20 72 65 61 64 2d 6f  t least a read-o
1fab0 6e 6c 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  nly transaction 
1fac0 6f 70 65 6e 0a 2a 2a 20 6f 6e 20 74 68 65 20 64  open.** on the d
1fad0 61 74 61 62 61 73 65 20 61 6c 72 65 61 64 79 2e  atabase already.
1fae0 20 49 66 20 61 20 77 72 69 74 65 2d 63 75 72 73   If a write-curs
1faf0 6f 72 20 69 73 20 72 65 71 75 65 73 74 65 64 2c  or is requested,
1fb00 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 63 61 6c   then.** the cal
1fb10 6c 65 72 20 69 73 20 61 73 73 75 6d 65 64 20 74  ler is assumed t
1fb20 6f 20 68 61 76 65 20 61 6e 20 6f 70 65 6e 20 77  o have an open w
1fb30 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
1fb40 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77 72 46 6c 61  ..**.** If wrFla
1fb50 67 3d 3d 30 2c 20 74 68 65 6e 20 74 68 65 20 63  g==0, then the c
1fb60 75 72 73 6f 72 20 63 61 6e 20 6f 6e 6c 79 20 62  ursor can only b
1fb70 65 20 75 73 65 64 20 66 6f 72 20 72 65 61 64 69  e used for readi
1fb80 6e 67 2e 0a 2a 2a 20 49 66 20 77 72 46 6c 61 67  ng..** If wrFlag
1fb90 3d 3d 31 2c 20 74 68 65 6e 20 74 68 65 20 63 75  ==1, then the cu
1fba0 72 73 6f 72 20 63 61 6e 20 62 65 20 75 73 65 64  rsor can be used
1fbb0 20 66 6f 72 20 72 65 61 64 69 6e 67 20 6f 72 20   for reading or 
1fbc0 66 6f 72 0a 2a 2a 20 77 72 69 74 69 6e 67 20 69  for.** writing i
1fbd0 66 20 6f 74 68 65 72 20 63 6f 6e 64 69 74 69 6f  f other conditio
1fbe0 6e 73 20 66 6f 72 20 77 72 69 74 69 6e 67 20 61  ns for writing a
1fbf0 72 65 20 61 6c 73 6f 20 6d 65 74 2e 20 20 54 68  re also met.  Th
1fc00 65 73 65 0a 2a 2a 20 61 72 65 20 74 68 65 20 63  ese.** are the c
1fc10 6f 6e 64 69 74 69 6f 6e 73 20 74 68 61 74 20 6d  onditions that m
1fc20 75 73 74 20 62 65 20 6d 65 74 20 69 6e 20 6f 72  ust be met in or
1fc30 64 65 72 20 66 6f 72 20 77 72 69 74 69 6e 67 20  der for writing 
1fc40 74 6f 0a 2a 2a 20 62 65 20 61 6c 6c 6f 77 65 64  to.** be allowed
1fc50 3a 0a 2a 2a 0a 2a 2a 20 31 3a 20 20 54 68 65 20  :.**.** 1:  The 
1fc60 63 75 72 73 6f 72 20 6d 75 73 74 20 68 61 76 65  cursor must have
1fc70 20 62 65 65 6e 20 6f 70 65 6e 65 64 20 77 69 74   been opened wit
1fc80 68 20 77 72 46 6c 61 67 3d 3d 31 0a 2a 2a 0a 2a  h wrFlag==1.**.*
1fc90 2a 20 32 3a 20 20 4f 74 68 65 72 20 64 61 74 61  * 2:  Other data
1fca0 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  base connections
1fcb0 20 74 68 61 74 20 73 68 61 72 65 20 74 68 65 20   that share the 
1fcc0 73 61 6d 65 20 70 61 67 65 72 20 63 61 63 68 65  same pager cache
1fcd0 0a 2a 2a 20 20 20 20 20 62 75 74 20 77 68 69 63  .**     but whic
1fce0 68 20 61 72 65 20 6e 6f 74 20 69 6e 20 74 68 65  h are not in the
1fcf0 20 52 45 41 44 5f 55 4e 43 4f 4d 4d 49 54 54 45   READ_UNCOMMITTE
1fd00 44 20 73 74 61 74 65 20 6d 61 79 20 6e 6f 74 20  D state may not 
1fd10 68 61 76 65 0a 2a 2a 20 20 20 20 20 63 75 72 73  have.**     curs
1fd20 6f 72 73 20 6f 70 65 6e 20 77 69 74 68 20 77 72  ors open with wr
1fd30 46 6c 61 67 3d 3d 30 20 6f 6e 20 74 68 65 20 73  Flag==0 on the s
1fd40 61 6d 65 20 74 61 62 6c 65 2e 20 20 4f 74 68 65  ame table.  Othe
1fd50 72 77 69 73 65 0a 2a 2a 20 20 20 20 20 74 68 65  rwise.**     the
1fd60 20 63 68 61 6e 67 65 73 20 6d 61 64 65 20 62 79   changes made by
1fd70 20 74 68 69 73 20 77 72 69 74 65 20 63 75 72 73   this write curs
1fd80 6f 72 20 77 6f 75 6c 64 20 62 65 20 76 69 73 69  or would be visi
1fd90 62 6c 65 20 74 6f 0a 2a 2a 20 20 20 20 20 74 68  ble to.**     th
1fda0 65 20 72 65 61 64 20 63 75 72 73 6f 72 73 20 69  e read cursors i
1fdb0 6e 20 74 68 65 20 6f 74 68 65 72 20 64 61 74 61  n the other data
1fdc0 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  base connection.
1fdd0 0a 2a 2a 0a 2a 2a 20 33 3a 20 20 54 68 65 20 64  .**.** 3:  The d
1fde0 61 74 61 62 61 73 65 20 6d 75 73 74 20 62 65 20  atabase must be 
1fdf0 77 72 69 74 61 62 6c 65 20 28 6e 6f 74 20 6f 6e  writable (not on
1fe00 20 72 65 61 64 2d 6f 6e 6c 79 20 6d 65 64 69 61   read-only media
1fe10 29 0a 2a 2a 0a 2a 2a 20 34 3a 20 20 54 68 65 72  ).**.** 4:  Ther
1fe20 65 20 6d 75 73 74 20 62 65 20 61 6e 20 61 63 74  e must be an act
1fe30 69 76 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ive transaction.
1fe40 0a 2a 2a 0a 2a 2a 20 4e 6f 20 63 68 65 63 6b 69  .**.** No checki
1fe50 6e 67 20 69 73 20 64 6f 6e 65 20 74 6f 20 6d 61  ng is done to ma
1fe60 6b 65 20 73 75 72 65 20 74 68 61 74 20 70 61 67  ke sure that pag
1fe70 65 20 69 54 61 62 6c 65 20 72 65 61 6c 6c 79 20  e iTable really 
1fe80 69 73 20 74 68 65 0a 2a 2a 20 72 6f 6f 74 20 70  is the.** root p
1fe90 61 67 65 20 6f 66 20 61 20 62 2d 74 72 65 65 2e  age of a b-tree.
1fea0 20 20 49 66 20 69 74 20 69 73 20 6e 6f 74 2c 20    If it is not, 
1feb0 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20  then the cursor 
1fec0 61 63 71 75 69 72 65 64 0a 2a 2a 20 77 69 6c 6c  acquired.** will
1fed0 20 6e 6f 74 20 77 6f 72 6b 20 63 6f 72 72 65 63   not work correc
1fee0 74 6c 79 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73  tly..**.** It is
1fef0 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68   assumed that th
1ff00 65 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  e sqlite3BtreeCu
1ff10 72 73 6f 72 5a 65 72 6f 28 29 20 68 61 73 20 62  rsorZero() has b
1ff20 65 65 6e 20 63 61 6c 6c 65 64 0a 2a 2a 20 6f 6e  een called.** on
1ff30 20 70 43 75 72 20 74 6f 20 69 6e 69 74 69 61 6c   pCur to initial
1ff40 69 7a 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 73  ize the memory s
1ff50 70 61 63 65 20 70 72 69 6f 72 20 74 6f 20 69 6e  pace prior to in
1ff60 76 6f 6b 69 6e 67 20 74 68 69 73 20 72 6f 75 74  voking this rout
1ff70 69 6e 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ine..*/.static i
1ff80 6e 74 20 62 74 72 65 65 43 75 72 73 6f 72 28 0a  nt btreeCursor(.
1ff90 20 20 42 74 72 65 65 20 2a 70 2c 20 20 20 20 20    Btree *p,     
1ffa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ffb0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1ffc0 62 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69  btree */.  int i
1ffd0 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20  Table,          
1ffe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fff0 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f    /* Root page o
20000 66 20 74 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20  f table to open 
20010 2a 2f 0a 20 20 69 6e 74 20 77 72 46 6c 61 67 2c  */.  int wrFlag,
20020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20030 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31              /* 1
20040 20 74 6f 20 77 72 69 74 65 2e 20 30 20 72 65 61   to write. 0 rea
20050 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74 72 75  d-only */.  stru
20060 63 74 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79  ct KeyInfo *pKey
20070 49 6e 66 6f 2c 20 20 20 20 20 20 20 20 20 20 20  Info,           
20080 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67 20     /* First arg 
20090 74 6f 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75  to comparison fu
200a0 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 42 74 43 75  nction */.  BtCu
200b0 72 73 6f 72 20 2a 70 43 75 72 20 20 20 20 20 20  rsor *pCur      
200c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
200d0 20 20 20 2f 2a 20 53 70 61 63 65 20 66 6f 72 20     /* Space for 
200e0 6e 65 77 20 63 75 72 73 6f 72 20 2a 2f 0a 29 7b  new cursor */.){
200f0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
20100 20 3d 20 70 2d 3e 70 42 74 3b 20 20 20 20 20 20   = p->pBt;      
20110 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 68 61            /* Sha
20120 72 65 64 20 62 2d 74 72 65 65 20 68 61 6e 64 6c  red b-tree handl
20130 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  e */..  assert( 
20140 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64  sqlite3BtreeHold
20150 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61  sMutex(p) );.  a
20160 73 73 65 72 74 28 20 77 72 46 6c 61 67 3d 3d 30  ssert( wrFlag==0
20170 20 7c 7c 20 77 72 46 6c 61 67 3d 3d 31 20 29 3b   || wrFlag==1 );
20180 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f  ..  /* The follo
20190 77 69 6e 67 20 61 73 73 65 72 74 20 73 74 61 74  wing assert stat
201a0 65 6d 65 6e 74 73 20 76 65 72 69 66 79 20 74 68  ements verify th
201b0 61 74 20 69 66 20 74 68 69 73 20 69 73 20 61 20  at if this is a 
201c0 73 68 61 72 61 62 6c 65 20 0a 20 20 2a 2a 20 62  sharable .  ** b
201d0 2d 74 72 65 65 20 64 61 74 61 62 61 73 65 2c 20  -tree database, 
201e0 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69  the connection i
201f0 73 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 72 65  s holding the re
20200 71 75 69 72 65 64 20 74 61 62 6c 65 20 6c 6f 63  quired table loc
20210 6b 73 2c 20 0a 20 20 2a 2a 20 61 6e 64 20 74 68  ks, .  ** and th
20220 61 74 20 6e 6f 20 6f 74 68 65 72 20 63 6f 6e 6e  at no other conn
20230 65 63 74 69 6f 6e 20 68 61 73 20 61 6e 79 20 6f  ection has any o
20240 70 65 6e 20 63 75 72 73 6f 72 20 74 68 61 74 20  pen cursor that 
20250 63 6f 6e 66 6c 69 63 74 73 20 77 69 74 68 20 0a  conflicts with .
20260 20 20 2a 2a 20 74 68 69 73 20 6c 6f 63 6b 2e 20    ** this lock. 
20270 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 68 61   */.  assert( ha
20280 73 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  sSharedCacheTabl
20290 65 4c 6f 63 6b 28 70 2c 20 69 54 61 62 6c 65 2c  eLock(p, iTable,
202a0 20 70 4b 65 79 49 6e 66 6f 21 3d 30 2c 20 77 72   pKeyInfo!=0, wr
202b0 46 6c 61 67 2b 31 29 20 29 3b 0a 20 20 61 73 73  Flag+1) );.  ass
202c0 65 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c  ert( wrFlag==0 |
202d0 7c 20 21 68 61 73 52 65 61 64 43 6f 6e 66 6c 69  | !hasReadConfli
202e0 63 74 73 28 70 2c 20 69 54 61 62 6c 65 29 20 29  cts(p, iTable) )
202f0 3b 0a 0a 20 20 2f 2a 20 41 73 73 65 72 74 20 74  ;..  /* Assert t
20300 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20 68  hat the caller h
20310 61 73 20 6f 70 65 6e 65 64 20 74 68 65 20 72 65  as opened the re
20320 71 75 69 72 65 64 20 74 72 61 6e 73 61 63 74 69  quired transacti
20330 6f 6e 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  on. */.  assert(
20340 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 54 52 41 4e   p->inTrans>TRAN
20350 53 5f 4e 4f 4e 45 20 29 3b 0a 20 20 61 73 73 65  S_NONE );.  asse
20360 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c  rt( wrFlag==0 ||
20370 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41   p->inTrans==TRA
20380 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 61 73  NS_WRITE );.  as
20390 73 65 72 74 28 20 70 42 74 2d 3e 70 50 61 67 65  sert( pBt->pPage
203a0 31 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65 31  1 && pBt->pPage1
203b0 2d 3e 61 44 61 74 61 20 29 3b 0a 0a 20 20 69 66  ->aData );..  if
203c0 28 20 4e 45 56 45 52 28 77 72 46 6c 61 67 20 26  ( NEVER(wrFlag &
203d0 26 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  & (pBt->btsFlags
203e0 20 26 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59   & BTS_READ_ONLY
203f0 29 21 3d 30 29 20 29 7b 0a 20 20 20 20 72 65 74  )!=0) ){.    ret
20400 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  urn SQLITE_READO
20410 4e 4c 59 3b 0a 20 20 7d 0a 20 20 69 66 28 20 77  NLY;.  }.  if( w
20420 72 46 6c 61 67 20 29 7b 0a 20 20 20 20 61 6c 6c  rFlag ){.    all
20430 6f 63 61 74 65 54 65 6d 70 53 70 61 63 65 28 70  ocateTempSpace(p
20440 42 74 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74  Bt);.    if( pBt
20450 2d 3e 70 54 6d 70 53 70 61 63 65 3d 3d 30 20 29  ->pTmpSpace==0 )
20460 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
20470 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 69 66 28 20  OMEM;.  }.  if( 
20480 69 54 61 62 6c 65 3d 3d 31 20 26 26 20 62 74 72  iTable==1 && btr
20490 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29  eePagecount(pBt)
204a0 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ==0 ){.    asser
204b0 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 29 3b 0a  t( wrFlag==0 );.
204c0 20 20 20 20 69 54 61 62 6c 65 20 3d 20 30 3b 0a      iTable = 0;.
204d0 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20 74 68    }..  /* Now th
204e0 61 74 20 6e 6f 20 6f 74 68 65 72 20 65 72 72 6f  at no other erro
204f0 72 73 20 63 61 6e 20 6f 63 63 75 72 2c 20 66 69  rs can occur, fi
20500 6e 69 73 68 20 66 69 6c 6c 69 6e 67 20 69 6e 20  nish filling in 
20510 74 68 65 20 42 74 43 75 72 73 6f 72 0a 20 20 2a  the BtCursor.  *
20520 2a 20 76 61 72 69 61 62 6c 65 73 20 61 6e 64 20  * variables and 
20530 6c 69 6e 6b 20 74 68 65 20 63 75 72 73 6f 72 20  link the cursor 
20540 69 6e 74 6f 20 74 68 65 20 42 74 53 68 61 72 65  into the BtShare
20550 64 20 6c 69 73 74 2e 20 20 2a 2f 0a 20 20 70 43  d list.  */.  pC
20560 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20 3d 20 28  ur->pgnoRoot = (
20570 50 67 6e 6f 29 69 54 61 62 6c 65 3b 0a 20 20 70  Pgno)iTable;.  p
20580 43 75 72 2d 3e 69 50 61 67 65 20 3d 20 2d 31 3b  Cur->iPage = -1;
20590 0a 20 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66  .  pCur->pKeyInf
205a0 6f 20 3d 20 70 4b 65 79 49 6e 66 6f 3b 0a 20 20  o = pKeyInfo;.  
205b0 70 43 75 72 2d 3e 70 42 74 72 65 65 20 3d 20 70  pCur->pBtree = p
205c0 3b 0a 20 20 70 43 75 72 2d 3e 70 42 74 20 3d 20  ;.  pCur->pBt = 
205d0 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20 77  pBt;.  assert( w
205e0 72 46 6c 61 67 3d 3d 30 20 7c 7c 20 77 72 46 6c  rFlag==0 || wrFl
205f0 61 67 3d 3d 42 54 43 46 5f 57 72 69 74 65 46 6c  ag==BTCF_WriteFl
20600 61 67 20 29 3b 0a 20 20 70 43 75 72 2d 3e 63 75  ag );.  pCur->cu
20610 72 46 6c 61 67 73 20 3d 20 77 72 46 6c 61 67 3b  rFlags = wrFlag;
20620 0a 20 20 70 43 75 72 2d 3e 70 4e 65 78 74 20 3d  .  pCur->pNext =
20630 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 0a 20   pBt->pCursor;. 
20640 20 69 66 28 20 70 43 75 72 2d 3e 70 4e 65 78 74   if( pCur->pNext
20650 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 70 4e   ){.    pCur->pN
20660 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 43 75  ext->pPrev = pCu
20670 72 3b 0a 20 20 7d 0a 20 20 70 42 74 2d 3e 70 43  r;.  }.  pBt->pC
20680 75 72 73 6f 72 20 3d 20 70 43 75 72 3b 0a 20 20  ursor = pCur;.  
20690 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
206a0 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20  URSOR_INVALID;. 
206b0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
206c0 4b 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33  K;.}.int sqlite3
206d0 42 74 72 65 65 43 75 72 73 6f 72 28 0a 20 20 42  BtreeCursor(.  B
206e0 74 72 65 65 20 2a 70 2c 20 20 20 20 20 20 20 20  tree *p,        
206f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20700 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
20710 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74  e btree */.  int
20720 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20   iTable,        
20730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20740 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74           /* Root
20750 20 70 61 67 65 20 6f 66 20 74 61 62 6c 65 20 74   page of table t
20760 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20  o open */.  int 
20770 77 72 46 6c 61 67 2c 20 20 20 20 20 20 20 20 20  wrFlag,         
20780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20790 20 20 20 20 20 20 20 20 2f 2a 20 31 20 74 6f 20          /* 1 to 
207a0 77 72 69 74 65 2e 20 30 20 72 65 61 64 2d 6f 6e  write. 0 read-on
207b0 6c 79 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 4b  ly */.  struct K
207c0 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f  eyInfo *pKeyInfo
207d0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
207e0 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67      /* First arg
207f0 20 74 6f 20 78 43 6f 6d 70 61 72 65 28 29 20 2a   to xCompare() *
20800 2f 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  /.  BtCursor *pC
20810 75 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ur              
20820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20830 2f 2a 20 57 72 69 74 65 20 6e 65 77 20 63 75 72  /* Write new cur
20840 73 6f 72 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  sor here */.){. 
20850 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74   int rc;.  sqlit
20860 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
20870 0a 20 20 72 63 20 3d 20 62 74 72 65 65 43 75 72  .  rc = btreeCur
20880 73 6f 72 28 70 2c 20 69 54 61 62 6c 65 2c 20 77  sor(p, iTable, w
20890 72 46 6c 61 67 2c 20 70 4b 65 79 49 6e 66 6f 2c  rFlag, pKeyInfo,
208a0 20 70 43 75 72 29 3b 0a 20 20 73 71 6c 69 74 65   pCur);.  sqlite
208b0 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
208c0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
208d0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
208e0 20 73 69 7a 65 20 6f 66 20 61 20 42 74 43 75 72   size of a BtCur
208f0 73 6f 72 20 6f 62 6a 65 63 74 20 69 6e 20 62 79  sor object in by
20900 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  tes..**.** This 
20910 69 6e 74 65 72 66 61 63 65 73 20 69 73 20 6e 65  interfaces is ne
20920 65 64 65 64 20 73 6f 20 74 68 61 74 20 75 73 65  eded so that use
20930 72 73 20 6f 66 20 63 75 72 73 6f 72 73 20 63 61  rs of cursors ca
20940 6e 20 70 72 65 61 6c 6c 6f 63 61 74 65 0a 2a 2a  n preallocate.**
20950 20 73 75 66 66 69 63 69 65 6e 74 20 73 74 6f 72   sufficient stor
20960 61 67 65 20 74 6f 20 68 6f 6c 64 20 61 20 63 75  age to hold a cu
20970 72 73 6f 72 2e 20 20 54 68 65 20 42 74 43 75 72  rsor.  The BtCur
20980 73 6f 72 20 6f 62 6a 65 63 74 20 69 73 20 6f 70  sor object is op
20990 61 71 75 65 0a 2a 2a 20 74 6f 20 75 73 65 72 73  aque.** to users
209a0 20 73 6f 20 74 68 65 79 20 63 61 6e 6e 6f 74 20   so they cannot 
209b0 64 6f 20 74 68 65 20 73 69 7a 65 6f 66 28 29 20  do the sizeof() 
209c0 74 68 65 6d 73 65 6c 76 65 73 20 2d 20 74 68 65  themselves - the
209d0 79 20 6d 75 73 74 20 63 61 6c 6c 0a 2a 2a 20 74  y must call.** t
209e0 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a  his routine..*/.
209f0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
20a00 43 75 72 73 6f 72 53 69 7a 65 28 76 6f 69 64 29  CursorSize(void)
20a10 7b 0a 20 20 72 65 74 75 72 6e 20 52 4f 55 4e 44  {.  return ROUND
20a20 38 28 73 69 7a 65 6f 66 28 42 74 43 75 72 73 6f  8(sizeof(BtCurso
20a30 72 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  r));.}../*.** In
20a40 69 74 69 61 6c 69 7a 65 20 6d 65 6d 6f 72 79 20  itialize memory 
20a50 74 68 61 74 20 77 69 6c 6c 20 62 65 20 63 6f 6e  that will be con
20a60 76 65 72 74 65 64 20 69 6e 74 6f 20 61 20 42 74  verted into a Bt
20a70 43 75 72 73 6f 72 20 6f 62 6a 65 63 74 2e 0a 2a  Cursor object..*
20a80 2a 0a 2a 2a 20 54 68 65 20 73 69 6d 70 6c 65 20  *.** The simple 
20a90 61 70 70 72 6f 61 63 68 20 68 65 72 65 20 77 6f  approach here wo
20aa0 75 6c 64 20 62 65 20 74 6f 20 6d 65 6d 73 65 74  uld be to memset
20ab0 28 29 20 74 68 65 20 65 6e 74 69 72 65 20 6f 62  () the entire ob
20ac0 6a 65 63 74 0a 2a 2a 20 74 6f 20 7a 65 72 6f 2e  ject.** to zero.
20ad0 20 20 42 75 74 20 69 74 20 74 75 72 6e 73 20 6f    But it turns o
20ae0 75 74 20 74 68 61 74 20 74 68 65 20 61 70 50 61  ut that the apPa
20af0 67 65 5b 5d 20 61 6e 64 20 61 69 49 64 78 5b 5d  ge[] and aiIdx[]
20b00 20 61 72 72 61 79 73 0a 2a 2a 20 64 6f 20 6e 6f   arrays.** do no
20b10 74 20 6e 65 65 64 20 74 6f 20 62 65 20 7a 65 72  t need to be zer
20b20 6f 65 64 20 61 6e 64 20 74 68 65 79 20 61 72 65  oed and they are
20b30 20 6c 61 72 67 65 2c 20 73 6f 20 77 65 20 63 61   large, so we ca
20b40 6e 20 73 61 76 65 20 61 20 6c 6f 74 0a 2a 2a 20  n save a lot.** 
20b50 6f 66 20 72 75 6e 2d 74 69 6d 65 20 62 79 20 73  of run-time by s
20b60 6b 69 70 70 69 6e 67 20 74 68 65 20 69 6e 69 74  kipping the init
20b70 69 61 6c 69 7a 61 74 69 6f 6e 20 6f 66 20 74 68  ialization of th
20b80 6f 73 65 20 65 6c 65 6d 65 6e 74 73 2e 0a 2a 2f  ose elements..*/
20b90 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72  .void sqlite3Btr
20ba0 65 65 43 75 72 73 6f 72 5a 65 72 6f 28 42 74 43  eeCursorZero(BtC
20bb0 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 6d 65 6d  ursor *p){.  mem
20bc0 73 65 74 28 70 2c 20 30 2c 20 6f 66 66 73 65 74  set(p, 0, offset
20bd0 6f 66 28 42 74 43 75 72 73 6f 72 2c 20 69 50 61  of(BtCursor, iPa
20be0 67 65 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  ge));.}../*.** C
20bf0 6c 6f 73 65 20 61 20 63 75 72 73 6f 72 2e 20 20  lose a cursor.  
20c00 54 68 65 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e  The read lock on
20c10 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
20c20 6c 65 20 69 73 20 72 65 6c 65 61 73 65 64 0a 2a  le is released.*
20c30 2a 20 77 68 65 6e 20 74 68 65 20 6c 61 73 74 20  * when the last 
20c40 63 75 72 73 6f 72 20 69 73 20 63 6c 6f 73 65 64  cursor is closed
20c50 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
20c60 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73 6f 72  BtreeCloseCursor
20c70 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
20c80 7b 0a 20 20 42 74 72 65 65 20 2a 70 42 74 72 65  {.  Btree *pBtre
20c90 65 20 3d 20 70 43 75 72 2d 3e 70 42 74 72 65 65  e = pCur->pBtree
20ca0 3b 0a 20 20 69 66 28 20 70 42 74 72 65 65 20 29  ;.  if( pBtree )
20cb0 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
20cc0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
20cd0 20 70 43 75 72 2d 3e 70 42 74 3b 0a 20 20 20 20   pCur->pBt;.    
20ce0 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
20cf0 72 28 70 42 74 72 65 65 29 3b 0a 20 20 20 20 73  r(pBtree);.    s
20d00 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61 72  qlite3BtreeClear
20d10 43 75 72 73 6f 72 28 70 43 75 72 29 3b 0a 20 20  Cursor(pCur);.  
20d20 20 20 69 66 28 20 70 43 75 72 2d 3e 70 50 72 65    if( pCur->pPre
20d30 76 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d  v ){.      pCur-
20d40 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20  >pPrev->pNext = 
20d50 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  pCur->pNext;.   
20d60 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 42   }else{.      pB
20d70 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20 70 43 75  t->pCursor = pCu
20d80 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a  r->pNext;.    }.
20d90 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 70 4e      if( pCur->pN
20da0 65 78 74 20 29 7b 0a 20 20 20 20 20 20 70 43 75  ext ){.      pCu
20db0 72 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20  r->pNext->pPrev 
20dc0 3d 20 70 43 75 72 2d 3e 70 50 72 65 76 3b 0a 20  = pCur->pPrev;. 
20dd0 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30     }.    for(i=0
20de0 3b 20 69 3c 3d 70 43 75 72 2d 3e 69 50 61 67 65  ; i<=pCur->iPage
20df0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 65  ; i++){.      re
20e00 6c 65 61 73 65 50 61 67 65 28 70 43 75 72 2d 3e  leasePage(pCur->
20e10 61 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20 20 20  apPage[i]);.    
20e20 7d 0a 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65  }.    unlockBtre
20e30 65 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a  eIfUnused(pBt);.
20e40 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
20e50 28 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77  (pCur->aOverflow
20e60 29 3b 0a 20 20 20 20 2f 2a 20 73 71 6c 69 74 65  );.    /* sqlite
20e70 33 5f 66 72 65 65 28 70 43 75 72 29 3b 20 2a 2f  3_free(pCur); */
20e80 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
20e90 65 4c 65 61 76 65 28 70 42 74 72 65 65 29 3b 0a  eLeave(pBtree);.
20ea0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
20eb0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
20ec0 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 42   Make sure the B
20ed0 74 43 75 72 73 6f 72 2a 20 67 69 76 65 6e 20 69  tCursor* given i
20ee0 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 68  n the argument h
20ef0 61 73 20 61 20 76 61 6c 69 64 0a 2a 2a 20 42 74  as a valid.** Bt
20f00 43 75 72 73 6f 72 2e 69 6e 66 6f 20 73 74 72 75  Cursor.info stru
20f10 63 74 75 72 65 2e 20 20 49 66 20 69 74 20 69 73  cture.  If it is
20f20 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 76 61 6c   not already val
20f30 69 64 2c 20 63 61 6c 6c 0a 2a 2a 20 62 74 72 65  id, call.** btre
20f40 65 50 61 72 73 65 43 65 6c 6c 28 29 20 74 6f 20  eParseCell() to 
20f50 66 69 6c 6c 20 69 74 20 69 6e 2e 0a 2a 2a 0a 2a  fill it in..**.*
20f60 2a 20 42 74 43 75 72 73 6f 72 2e 69 6e 66 6f 20  * BtCursor.info 
20f70 69 73 20 61 20 63 61 63 68 65 20 6f 66 20 74 68  is a cache of th
20f80 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e  e information in
20f90 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 65 6c   the current cel
20fa0 6c 2e 0a 2a 2a 20 55 73 69 6e 67 20 74 68 69 73  l..** Using this
20fb0 20 63 61 63 68 65 20 72 65 64 75 63 65 73 20 74   cache reduces t
20fc0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 61 6c  he number of cal
20fd0 6c 73 20 74 6f 20 62 74 72 65 65 50 61 72 73 65  ls to btreeParse
20fe0 43 65 6c 6c 28 29 2e 0a 2a 2a 0a 2a 2a 20 32 30  Cell()..**.** 20
20ff0 30 37 2d 30 36 2d 32 35 3a 20 20 54 68 65 72 65  07-06-25:  There
21000 20 69 73 20 61 20 62 75 67 20 69 6e 20 73 6f 6d   is a bug in som
21010 65 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 4d 53  e versions of MS
21020 56 43 20 74 68 61 74 20 63 61 75 73 65 20 74 68  VC that cause th
21030 65 0a 2a 2a 20 63 6f 6d 70 69 6c 65 72 20 74 6f  e.** compiler to
21040 20 63 72 61 73 68 20 77 68 65 6e 20 67 65 74 43   crash when getC
21050 65 6c 6c 49 6e 66 6f 28 29 20 69 73 20 69 6d 70  ellInfo() is imp
21060 6c 65 6d 65 6e 74 65 64 20 61 73 20 61 20 6d 61  lemented as a ma
21070 63 72 6f 2e 0a 2a 2a 20 42 75 74 20 74 68 65 72  cro..** But ther
21080 65 20 69 73 20 61 20 6d 65 61 73 75 72 65 61 62  e is a measureab
21090 6c 65 20 73 70 65 65 64 20 61 64 76 61 6e 74 61  le speed advanta
210a0 67 65 20 74 6f 20 75 73 69 6e 67 20 74 68 65 20  ge to using the 
210b0 6d 61 63 72 6f 20 6f 6e 20 67 63 63 0a 2a 2a 20  macro on gcc.** 
210c0 28 77 68 65 6e 20 6c 65 73 73 20 63 6f 6d 70 69  (when less compi
210d0 6c 65 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  ler optimization
210e0 73 20 6c 69 6b 65 20 2d 4f 73 20 6f 72 20 2d 4f  s like -Os or -O
210f0 30 20 61 72 65 20 75 73 65 64 20 61 6e 64 20 74  0 are used and t
21100 68 65 0a 2a 2a 20 63 6f 6d 70 69 6c 65 72 20 69  he.** compiler i
21110 73 20 6e 6f 74 20 64 6f 69 6e 67 20 61 67 67 72  s not doing aggr
21120 65 73 73 69 76 65 20 69 6e 6c 69 6e 69 6e 67 2e  essive inlining.
21130 29 20 20 53 6f 20 77 65 20 75 73 65 20 61 20 72  )  So we use a r
21140 65 61 6c 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  eal function.** 
21150 66 6f 72 20 4d 53 56 43 20 61 6e 64 20 61 20 6d  for MSVC and a m
21160 61 63 72 6f 20 66 6f 72 20 65 76 65 72 79 74 68  acro for everyth
21170 69 6e 67 20 65 6c 73 65 2e 20 20 54 69 63 6b 65  ing else.  Ticke
21180 74 20 23 32 34 35 37 2e 0a 2a 2f 0a 23 69 66 6e  t #2457..*/.#ifn
21190 64 65 66 20 4e 44 45 42 55 47 0a 20 20 73 74 61  def NDEBUG.  sta
211a0 74 69 63 20 76 6f 69 64 20 61 73 73 65 72 74 43  tic void assertC
211b0 65 6c 6c 49 6e 66 6f 28 42 74 43 75 72 73 6f 72  ellInfo(BtCursor
211c0 20 2a 70 43 75 72 29 7b 0a 20 20 20 20 43 65 6c   *pCur){.    Cel
211d0 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20  lInfo info;.    
211e0 69 6e 74 20 69 50 61 67 65 20 3d 20 70 43 75 72  int iPage = pCur
211f0 2d 3e 69 50 61 67 65 3b 0a 20 20 20 20 6d 65 6d  ->iPage;.    mem
21200 73 65 74 28 26 69 6e 66 6f 2c 20 30 2c 20 73 69  set(&info, 0, si
21210 7a 65 6f 66 28 69 6e 66 6f 29 29 3b 0a 20 20 20  zeof(info));.   
21220 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28   btreeParseCell(
21230 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 50 61  pCur->apPage[iPa
21240 67 65 5d 2c 20 70 43 75 72 2d 3e 61 69 49 64 78  ge], pCur->aiIdx
21250 5b 69 50 61 67 65 5d 2c 20 26 69 6e 66 6f 29 3b  [iPage], &info);
21260 0a 20 20 20 20 61 73 73 65 72 74 28 20 43 4f 52  .    assert( COR
21270 52 55 50 54 5f 44 42 20 7c 7c 20 6d 65 6d 63 6d  RUPT_DB || memcm
21280 70 28 26 69 6e 66 6f 2c 20 26 70 43 75 72 2d 3e  p(&info, &pCur->
21290 69 6e 66 6f 2c 20 73 69 7a 65 6f 66 28 69 6e 66  info, sizeof(inf
212a0 6f 29 29 3d 3d 30 20 29 3b 0a 20 20 7d 0a 23 65  o))==0 );.  }.#e
212b0 6c 73 65 0a 20 20 23 64 65 66 69 6e 65 20 61 73  lse.  #define as
212c0 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28 78 29 0a  sertCellInfo(x).
212d0 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 5f 4d  #endif.#ifdef _M
212e0 53 43 5f 56 45 52 0a 20 20 2f 2a 20 55 73 65 20  SC_VER.  /* Use 
212f0 61 20 72 65 61 6c 20 66 75 6e 63 74 69 6f 6e 20  a real function 
21300 69 6e 20 4d 53 56 43 20 74 6f 20 77 6f 72 6b 20  in MSVC to work 
21310 61 72 6f 75 6e 64 20 62 75 67 73 20 69 6e 20 74  around bugs in t
21320 68 61 74 20 63 6f 6d 70 69 6c 65 72 2e 20 2a 2f  hat compiler. */
21330 0a 20 20 73 74 61 74 69 63 20 76 6f 69 64 20 67  .  static void g
21340 65 74 43 65 6c 6c 49 6e 66 6f 28 42 74 43 75 72  etCellInfo(BtCur
21350 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 20 20  sor *pCur){.    
21360 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  if( pCur->info.n
21370 53 69 7a 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Size==0 ){.     
21380 20 69 6e 74 20 69 50 61 67 65 20 3d 20 70 43 75   int iPage = pCu
21390 72 2d 3e 69 50 61 67 65 3b 0a 20 20 20 20 20 20  r->iPage;.      
213a0 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 70  btreeParseCell(p
213b0 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 50 61 67  Cur->apPage[iPag
213c0 65 5d 2c 70 43 75 72 2d 3e 61 69 49 64 78 5b 69  e],pCur->aiIdx[i
213d0 50 61 67 65 5d 2c 26 70 43 75 72 2d 3e 69 6e 66  Page],&pCur->inf
213e0 6f 29 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e  o);.      pCur->
213f0 63 75 72 46 6c 61 67 73 20 7c 3d 20 42 54 43 46  curFlags |= BTCF
21400 5f 56 61 6c 69 64 4e 4b 65 79 3b 0a 20 20 20 20  _ValidNKey;.    
21410 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73  }else{.      ass
21420 65 72 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72  ertCellInfo(pCur
21430 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6c  );.    }.  }.#el
21440 73 65 20 2f 2a 20 69 66 20 6e 6f 74 20 5f 4d 53  se /* if not _MS
21450 43 5f 56 45 52 20 2a 2f 0a 20 20 2f 2a 20 55 73  C_VER */.  /* Us
21460 65 20 61 20 6d 61 63 72 6f 20 69 6e 20 61 6c 6c  e a macro in all
21470 20 6f 74 68 65 72 20 63 6f 6d 70 69 6c 65 72 73   other compilers
21480 20 73 6f 20 74 68 61 74 20 74 68 65 20 66 75 6e   so that the fun
21490 63 74 69 6f 6e 20 69 73 20 69 6e 6c 69 6e 65 64  ction is inlined
214a0 20 2a 2f 0a 23 64 65 66 69 6e 65 20 67 65 74 43   */.#define getC
214b0 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 20 20 20  ellInfo(pCur)   
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 20 20 20 20 20 20                  
214e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
214f0 20 20 20 5c 0a 20 20 69 66 28 20 70 43 75 72 2d     \.  if( pCur-
21500 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29  >info.nSize==0 )
21510 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {               
21520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21540 20 20 20 20 5c 0a 20 20 20 20 69 6e 74 20 69 50      \.    int iP
21550 61 67 65 20 3d 20 70 43 75 72 2d 3e 69 50 61 67  age = pCur->iPag
21560 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
21570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21590 20 20 20 20 20 5c 0a 20 20 20 20 62 74 72 65 65       \.    btree
215a0 50 61 72 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e  ParseCell(pCur->
215b0 61 70 50 61 67 65 5b 69 50 61 67 65 5d 2c 70 43  apPage[iPage],pC
215c0 75 72 2d 3e 61 69 49 64 78 5b 69 50 61 67 65 5d  ur->aiIdx[iPage]
215d0 2c 26 70 43 75 72 2d 3e 69 6e 66 6f 29 3b 20 20  ,&pCur->info);  
215e0 20 20 20 20 20 20 5c 0a 20 20 20 20 70 43 75 72        \.    pCur
215f0 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20 42 54  ->curFlags |= BT
21600 43 46 5f 56 61 6c 69 64 4e 4b 65 79 3b 20 20 20  CF_ValidNKey;   
21610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21630 20 20 20 20 20 20 20 5c 0a 20 20 7d 65 6c 73 65         \.  }else
21640 7b 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 20                  
21670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21680 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 61 73          \.    as
21690 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75  sertCellInfo(pCu
216a0 72 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  r);             
216b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
216c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
216d0 20 20 20 20 20 20 20 20 20 5c 0a 20 20 7d 0a 23           \.  }.#
216e0 65 6e 64 69 66 20 2f 2a 20 5f 4d 53 43 5f 56 45  endif /* _MSC_VE
216f0 52 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 4e 44  R */..#ifndef ND
21700 45 42 55 47 20 20 2f 2a 20 54 68 65 20 6e 65 78  EBUG  /* The nex
21710 74 20 72 6f 75 74 69 6e 65 20 75 73 65 64 20 6f  t routine used o
21720 6e 6c 79 20 77 69 74 68 69 6e 20 61 73 73 65 72  nly within asser
21730 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20 2a  t() statements *
21740 2f 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  /./*.** Return t
21750 72 75 65 20 69 66 20 74 68 65 20 67 69 76 65 6e  rue if the given
21760 20 42 74 43 75 72 73 6f 72 20 69 73 20 76 61 6c   BtCursor is val
21770 69 64 2e 20 20 41 20 76 61 6c 69 64 20 63 75 72  id.  A valid cur
21780 73 6f 72 20 69 73 20 6f 6e 65 0a 2a 2a 20 74 68  sor is one.** th
21790 61 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  at is currently 
217a0 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20 72 6f  pointing to a ro
217b0 77 20 69 6e 20 61 20 28 6e 6f 6e 2d 65 6d 70 74  w in a (non-empt
217c0 79 29 20 74 61 62 6c 65 2e 0a 2a 2a 20 54 68 69  y) table..** Thi
217d0 73 20 69 73 20 61 20 76 65 72 69 66 69 63 61 74  s is a verificat
217e0 69 6f 6e 20 72 6f 75 74 69 6e 65 20 69 73 20 75  ion routine is u
217f0 73 65 64 20 6f 6e 6c 79 20 77 69 74 68 69 6e 20  sed only within 
21800 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65  assert() stateme
21810 6e 74 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  nts..*/.int sqli
21820 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 49 73  te3BtreeCursorIs
21830 56 61 6c 69 64 28 42 74 43 75 72 73 6f 72 20 2a  Valid(BtCursor *
21840 70 43 75 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  pCur){.  return 
21850 70 43 75 72 20 26 26 20 70 43 75 72 2d 3e 65 53  pCur && pCur->eS
21860 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
21870 49 44 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ID;.}.#endif /* 
21880 4e 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  NDEBUG */../*.**
21890 20 53 65 74 20 2a 70 53 69 7a 65 20 74 6f 20 74   Set *pSize to t
218a0 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 62  he size of the b
218b0 75 66 66 65 72 20 6e 65 65 64 65 64 20 74 6f 20  uffer needed to 
218c0 68 6f 6c 64 20 74 68 65 20 76 61 6c 75 65 20 6f  hold the value o
218d0 66 0a 2a 2a 20 74 68 65 20 6b 65 79 20 66 6f 72  f.** the key for
218e0 20 74 68 65 20 63 75 72 72 65 6e 74 20 65 6e 74   the current ent
218f0 72 79 2e 20 20 49 66 20 74 68 65 20 63 75 72 73  ry.  If the curs
21900 6f 72 20 69 73 20 6e 6f 74 20 70 6f 69 6e 74 69  or is not pointi
21910 6e 67 0a 2a 2a 20 74 6f 20 61 20 76 61 6c 69 64  ng.** to a valid
21920 20 65 6e 74 72 79 2c 20 2a 70 53 69 7a 65 20 69   entry, *pSize i
21930 73 20 73 65 74 20 74 6f 20 30 2e 20 0a 2a 2a 0a  s set to 0. .**.
21940 2a 2a 20 46 6f 72 20 61 20 74 61 62 6c 65 20 77  ** For a table w
21950 69 74 68 20 74 68 65 20 49 4e 54 4b 45 59 20 66  ith the INTKEY f
21960 6c 61 67 20 73 65 74 2c 20 74 68 69 73 20 72 6f  lag set, this ro
21970 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68  utine returns th
21980 65 20 6b 65 79 0a 2a 2a 20 69 74 73 65 6c 66 2c  e key.** itself,
21990 20 6e 6f 74 20 74 68 65 20 6e 75 6d 62 65 72 20   not the number 
219a0 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68 65 20  of bytes in the 
219b0 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  key..**.** The c
219c0 61 6c 6c 65 72 20 6d 75 73 74 20 70 6f 73 69 74  aller must posit
219d0 69 6f 6e 20 74 68 65 20 63 75 72 73 6f 72 20 70  ion the cursor p
219e0 72 69 6f 72 20 74 6f 20 69 6e 76 6f 6b 69 6e 67  rior to invoking
219f0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a   this routine..*
21a00 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  * .** This routi
21a10 6e 65 20 63 61 6e 6e 6f 74 20 66 61 69 6c 2e 20  ne cannot fail. 
21a20 20 49 74 20 61 6c 77 61 79 73 20 72 65 74 75 72   It always retur
21a30 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 20 0a  ns SQLITE_OK.  .
21a40 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
21a50 72 65 65 4b 65 79 53 69 7a 65 28 42 74 43 75 72  reeKeySize(BtCur
21a60 73 6f 72 20 2a 70 43 75 72 2c 20 69 36 34 20 2a  sor *pCur, i64 *
21a70 70 53 69 7a 65 29 7b 0a 20 20 61 73 73 65 72 74  pSize){.  assert
21a80 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
21a90 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ex(pCur) );.  as
21aa0 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
21ab0 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
21ac0 20 29 3b 0a 20 20 67 65 74 43 65 6c 6c 49 6e 66   );.  getCellInf
21ad0 6f 28 70 43 75 72 29 3b 0a 20 20 2a 70 53 69 7a  o(pCur);.  *pSiz
21ae0 65 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  e = pCur->info.n
21af0 4b 65 79 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  Key;.  return SQ
21b00 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
21b10 2a 20 53 65 74 20 2a 70 53 69 7a 65 20 74 6f 20  * Set *pSize to 
21b20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
21b30 74 65 73 20 6f 66 20 64 61 74 61 20 69 6e 20 74  tes of data in t
21b40 68 65 20 65 6e 74 72 79 20 74 68 65 0a 2a 2a 20  he entry the.** 
21b50 63 75 72 73 6f 72 20 63 75 72 72 65 6e 74 6c 79  cursor currently
21b60 20 70 6f 69 6e 74 73 20 74 6f 2e 0a 2a 2a 0a 2a   points to..**.*
21b70 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73  * The caller mus
21b80 74 20 67 75 61 72 61 6e 74 65 65 20 74 68 61 74  t guarantee that
21b90 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 70   the cursor is p
21ba0 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20 6e 6f 6e  ointing to a non
21bb0 2d 4e 55 4c 4c 0a 2a 2a 20 76 61 6c 69 64 20 65  -NULL.** valid e
21bc0 6e 74 72 79 2e 20 20 49 6e 20 6f 74 68 65 72 20  ntry.  In other 
21bd0 77 6f 72 64 73 2c 20 74 68 65 20 63 61 6c 6c 69  words, the calli
21be0 6e 67 20 70 72 6f 63 65 64 75 72 65 20 6d 75 73  ng procedure mus
21bf0 74 20 67 75 61 72 61 6e 74 65 65 0a 2a 2a 20 74  t guarantee.** t
21c00 68 61 74 20 74 68 65 20 63 75 72 73 6f 72 20 68  hat the cursor h
21c10 61 73 20 43 75 72 73 6f 72 2e 65 53 74 61 74 65  as Cursor.eState
21c20 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 2e 0a  ==CURSOR_VALID..
21c30 2a 2a 0a 2a 2a 20 46 61 69 6c 75 72 65 20 69 73  **.** Failure is
21c40 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 2e 20 20   not possible.  
21c50 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c  This function al
21c60 77 61 79 73 20 72 65 74 75 72 6e 73 20 53 51 4c  ways returns SQL
21c70 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 49 74 20 6d 69  ITE_OK..** It mi
21c80 67 68 74 20 6a 75 73 74 20 61 73 20 77 65 6c 6c  ght just as well
21c90 20 62 65 20 61 20 70 72 6f 63 65 64 75 72 65 20   be a procedure 
21ca0 28 72 65 74 75 72 6e 69 6e 67 20 76 6f 69 64 29  (returning void)
21cb0 20 62 75 74 20 77 65 20 63 6f 6e 74 69 6e 75 65   but we continue
21cc0 0a 2a 2a 20 74 6f 20 72 65 74 75 72 6e 20 61 6e  .** to return an
21cd0 20 69 6e 74 65 67 65 72 20 72 65 73 75 6c 74 20   integer result 
21ce0 63 6f 64 65 20 66 6f 72 20 68 69 73 74 6f 72 69  code for histori
21cf0 63 61 6c 20 72 65 61 73 6f 6e 73 2e 0a 2a 2f 0a  cal reasons..*/.
21d00 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
21d10 44 61 74 61 53 69 7a 65 28 42 74 43 75 72 73 6f  DataSize(BtCurso
21d20 72 20 2a 70 43 75 72 2c 20 75 33 32 20 2a 70 53  r *pCur, u32 *pS
21d30 69 7a 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20  ize){.  assert( 
21d40 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
21d50 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
21d60 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
21d70 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
21d80 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
21d90 2d 3e 69 50 61 67 65 3e 3d 30 20 29 3b 0a 20 20  ->iPage>=0 );.  
21da0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50  assert( pCur->iP
21db0 61 67 65 3c 42 54 43 55 52 53 4f 52 5f 4d 41 58  age<BTCURSOR_MAX
21dc0 5f 44 45 50 54 48 20 29 3b 0a 20 20 61 73 73 65  _DEPTH );.  asse
21dd0 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65  rt( pCur->apPage
21de0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 69  [pCur->iPage]->i
21df0 6e 74 4b 65 79 4c 65 61 66 3d 3d 31 20 29 3b 0a  ntKeyLeaf==1 );.
21e00 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43    getCellInfo(pC
21e10 75 72 29 3b 0a 20 20 2a 70 53 69 7a 65 20 3d 20  ur);.  *pSize = 
21e20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50 61 79 6c  pCur->info.nPayl
21e30 6f 61 64 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  oad;.  return SQ
21e40 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
21e50 2a 20 47 69 76 65 6e 20 74 68 65 20 70 61 67 65  * Given the page
21e60 20 6e 75 6d 62 65 72 20 6f 66 20 61 6e 20 6f 76   number of an ov
21e70 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 20 74  erflow page in t
21e80 68 65 20 64 61 74 61 62 61 73 65 20 28 70 61 72  he database (par
21e90 61 6d 65 74 65 72 0a 2a 2a 20 6f 76 66 6c 29 2c  ameter.** ovfl),
21ea0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 66   this function f
21eb0 69 6e 64 73 20 74 68 65 20 70 61 67 65 20 6e 75  inds the page nu
21ec0 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65 78 74  mber of the next
21ed0 20 70 61 67 65 20 69 6e 20 74 68 65 20 0a 2a 2a   page in the .**
21ee0 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20   linked list of 
21ef0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20  overflow pages. 
21f00 49 66 20 70 6f 73 73 69 62 6c 65 2c 20 69 74 20  If possible, it 
21f10 75 73 65 73 20 74 68 65 20 61 75 74 6f 2d 76 61  uses the auto-va
21f20 63 75 75 6d 0a 2a 2a 20 70 6f 69 6e 74 65 72 2d  cuum.** pointer-
21f30 6d 61 70 20 64 61 74 61 20 69 6e 73 74 65 61 64  map data instead
21f40 20 6f 66 20 72 65 61 64 69 6e 67 20 74 68 65 20   of reading the 
21f50 63 6f 6e 74 65 6e 74 20 6f 66 20 70 61 67 65 20  content of page 
21f60 6f 76 66 6c 20 74 6f 20 64 6f 20 73 6f 2e 20 0a  ovfl to do so. .
21f70 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
21f80 72 20 6f 63 63 75 72 73 20 61 6e 20 53 51 4c 69  r occurs an SQLi
21f90 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  te error code is
21fa0 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72   returned. Other
21fb0 77 69 73 65 3a 0a 2a 2a 0a 2a 2a 20 54 68 65 20  wise:.**.** The 
21fc0 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  page number of t
21fd0 68 65 20 6e 65 78 74 20 6f 76 65 72 66 6c 6f 77  he next overflow
21fe0 20 70 61 67 65 20 69 6e 20 74 68 65 20 6c 69 6e   page in the lin
21ff0 6b 65 64 20 6c 69 73 74 20 69 73 20 0a 2a 2a 20  ked list is .** 
22000 77 72 69 74 74 65 6e 20 74 6f 20 2a 70 50 67 6e  written to *pPgn
22010 6f 4e 65 78 74 2e 20 49 66 20 70 61 67 65 20 6f  oNext. If page o
22020 76 66 6c 20 69 73 20 74 68 65 20 6c 61 73 74 20  vfl is the last 
22030 70 61 67 65 20 69 6e 20 69 74 73 20 6c 69 6e 6b  page in its link
22040 65 64 20 0a 2a 2a 20 6c 69 73 74 2c 20 2a 70 50  ed .** list, *pP
22050 67 6e 6f 4e 65 78 74 20 69 73 20 73 65 74 20 74  gnoNext is set t
22060 6f 20 7a 65 72 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49  o zero. .**.** I
22070 66 20 70 70 50 61 67 65 20 69 73 20 6e 6f 74 20  f ppPage is not 
22080 4e 55 4c 4c 2c 20 61 6e 64 20 61 20 72 65 66 65  NULL, and a refe
22090 72 65 6e 63 65 20 74 6f 20 74 68 65 20 4d 65 6d  rence to the Mem
220a0 50 61 67 65 20 6f 62 6a 65 63 74 20 63 6f 72 72  Page object corr
220b0 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 74 6f 20  esponding.** to 
220c0 70 61 67 65 20 6e 75 6d 62 65 72 20 70 4f 76 66  page number pOvf
220d0 6c 20 77 61 73 20 6f 62 74 61 69 6e 65 64 2c 20  l was obtained, 
220e0 74 68 65 6e 20 2a 70 70 50 61 67 65 20 69 73 20  then *ppPage is 
220f0 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  set to point to 
22100 74 68 61 74 0a 2a 2a 20 72 65 66 65 72 65 6e 63  that.** referenc
22110 65 2e 20 49 74 20 69 73 20 74 68 65 20 72 65 73  e. It is the res
22120 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74  ponsibility of t
22130 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 63 61 6c  he caller to cal
22140 6c 20 72 65 6c 65 61 73 65 50 61 67 65 28 29 0a  l releasePage().
22150 2a 2a 20 6f 6e 20 2a 70 70 50 61 67 65 20 74 6f  ** on *ppPage to
22160 20 66 72 65 65 20 74 68 65 20 72 65 66 65 72 65   free the refere
22170 6e 63 65 2e 20 49 6e 20 6e 6f 20 72 65 66 65 72  nce. In no refer
22180 65 6e 63 65 20 77 61 73 20 6f 62 74 61 69 6e 65  ence was obtaine
22190 64 20 28 62 65 63 61 75 73 65 0a 2a 2a 20 74 68  d (because.** th
221a0 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 77 61  e pointer-map wa
221b0 73 20 75 73 65 64 20 74 6f 20 6f 62 74 61 69 6e  s used to obtain
221c0 20 74 68 65 20 76 61 6c 75 65 20 66 6f 72 20 2a   the value for *
221d0 70 50 67 6e 6f 4e 65 78 74 29 2c 20 74 68 65 6e  pPgnoNext), then
221e0 0a 2a 2a 20 2a 70 70 50 61 67 65 20 69 73 20 73  .** *ppPage is s
221f0 65 74 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2f 0a 73  et to zero..*/.s
22200 74 61 74 69 63 20 69 6e 74 20 67 65 74 4f 76 65  tatic int getOve
22210 72 66 6c 6f 77 50 61 67 65 28 0a 20 20 42 74 53  rflowPage(.  BtS
22220 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20  hared *pBt,     
22230 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
22240 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
22250 2f 0a 20 20 50 67 6e 6f 20 6f 76 66 6c 2c 20 20  /.  Pgno ovfl,  
22260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22270 20 2f 2a 20 43 75 72 72 65 6e 74 20 6f 76 65 72   /* Current over
22280 66 6c 6f 77 20 70 61 67 65 20 6e 75 6d 62 65 72  flow page number
22290 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a   */.  MemPage **
222a0 70 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20  ppPage,         
222b0 20 20 20 2f 2a 20 4f 55 54 3a 20 4d 65 6d 50 61     /* OUT: MemPa
222c0 67 65 20 68 61 6e 64 6c 65 20 28 6d 61 79 20 62  ge handle (may b
222d0 65 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20 50 67 6e  e NULL) */.  Pgn
222e0 6f 20 2a 70 50 67 6e 6f 4e 65 78 74 20 20 20 20  o *pPgnoNext    
222f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
22300 3a 20 4e 65 78 74 20 6f 76 65 72 66 6c 6f 77 20  : Next overflow 
22310 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 29  page number */.)
22320 7b 0a 20 20 50 67 6e 6f 20 6e 65 78 74 20 3d 20  {.  Pgno next = 
22330 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  0;.  MemPage *pP
22340 61 67 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72  age = 0;.  int r
22350 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
22360 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
22370 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
22380 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
22390 73 65 72 74 28 70 50 67 6e 6f 4e 65 78 74 29 3b  sert(pPgnoNext);
223a0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
223b0 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
223c0 0a 20 20 2f 2a 20 54 72 79 20 74 6f 20 66 69 6e  .  /* Try to fin
223d0 64 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20  d the next page 
223e0 69 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  in the overflow 
223f0 6c 69 73 74 20 75 73 69 6e 67 20 74 68 65 0a 20  list using the. 
22400 20 2a 2a 20 61 75 74 6f 76 61 63 75 75 6d 20 70   ** autovacuum p
22410 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 73  ointer-map pages
22420 2e 20 47 75 65 73 73 20 74 68 61 74 20 74 68 65  . Guess that the
22430 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20 0a 20   next page in . 
22440 20 2a 2a 20 74 68 65 20 6f 76 65 72 66 6c 6f 77   ** the overflow
22450 20 6c 69 73 74 20 69 73 20 70 61 67 65 20 6e 75   list is page nu
22460 6d 62 65 72 20 28 6f 76 66 6c 2b 31 29 2e 20 49  mber (ovfl+1). I
22470 66 20 74 68 61 74 20 67 75 65 73 73 20 74 75 72  f that guess tur
22480 6e 73 20 0a 20 20 2a 2a 20 6f 75 74 20 74 6f 20  ns .  ** out to 
22490 62 65 20 77 72 6f 6e 67 2c 20 66 61 6c 6c 20 62  be wrong, fall b
224a0 61 63 6b 20 74 6f 20 6c 6f 61 64 69 6e 67 20 74  ack to loading t
224b0 68 65 20 64 61 74 61 20 6f 66 20 70 61 67 65 20  he data of page 
224c0 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 76 66  .  ** number ovf
224d0 6c 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74  l to determine t
224e0 68 65 20 6e 65 78 74 20 70 61 67 65 20 6e 75 6d  he next page num
224f0 62 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ber..  */.  if( 
22500 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
22510 29 7b 0a 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f  ){.    Pgno pgno
22520 3b 0a 20 20 20 20 50 67 6e 6f 20 69 47 75 65 73  ;.    Pgno iGues
22530 73 20 3d 20 6f 76 66 6c 2b 31 3b 0a 20 20 20 20  s = ovfl+1;.    
22540 75 38 20 65 54 79 70 65 3b 0a 0a 20 20 20 20 77  u8 eType;..    w
22550 68 69 6c 65 28 20 50 54 52 4d 41 50 5f 49 53 50  hile( PTRMAP_ISP
22560 41 47 45 28 70 42 74 2c 20 69 47 75 65 73 73 29  AGE(pBt, iGuess)
22570 20 7c 7c 20 69 47 75 65 73 73 3d 3d 50 45 4e 44   || iGuess==PEND
22580 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
22590 74 29 20 29 7b 0a 20 20 20 20 20 20 69 47 75 65  t) ){.      iGue
225a0 73 73 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  ss++;.    }..   
225b0 20 69 66 28 20 69 47 75 65 73 73 3c 3d 62 74 72   if( iGuess<=btr
225c0 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29  eePagecount(pBt)
225d0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70   ){.      rc = p
225e0 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20 69 47  trmapGet(pBt, iG
225f0 75 65 73 73 2c 20 26 65 54 79 70 65 2c 20 26 70  uess, &eType, &p
22600 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20  gno);.      if( 
22610 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
22620 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f   eType==PTRMAP_O
22630 56 45 52 46 4c 4f 57 32 20 26 26 20 70 67 6e 6f  VERFLOW2 && pgno
22640 3d 3d 6f 76 66 6c 20 29 7b 0a 20 20 20 20 20 20  ==ovfl ){.      
22650 20 20 6e 65 78 74 20 3d 20 69 47 75 65 73 73 3b    next = iGuess;
22660 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
22670 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 20  LITE_DONE;.     
22680 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e   }.    }.  }.#en
22690 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 6e  dif..  assert( n
226a0 65 78 74 3d 3d 30 20 7c 7c 20 72 63 3d 3d 53 51  ext==0 || rc==SQ
226b0 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 69  LITE_DONE );.  i
226c0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
226d0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 62 74 72   ){.    rc = btr
226e0 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 6f  eeGetPage(pBt, o
226f0 76 66 6c 2c 20 26 70 50 61 67 65 2c 20 28 70 70  vfl, &pPage, (pp
22700 50 61 67 65 3d 3d 30 29 20 3f 20 50 41 47 45 52  Page==0) ? PAGER
22710 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20 3a 20  _GET_READONLY : 
22720 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  0);.    assert( 
22730 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc==SQLITE_OK ||
22740 20 70 50 61 67 65 3d 3d 30 20 29 3b 0a 20 20 20   pPage==0 );.   
22750 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
22760 4f 4b 20 29 7b 0a 20 20 20 20 20 20 6e 65 78 74  OK ){.      next
22770 20 3d 20 67 65 74 34 62 79 74 65 28 70 50 61 67   = get4byte(pPag
22780 65 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 7d  e->aData);.    }
22790 0a 20 20 7d 0a 0a 20 20 2a 70 50 67 6e 6f 4e 65  .  }..  *pPgnoNe
227a0 78 74 20 3d 20 6e 65 78 74 3b 0a 20 20 69 66 28  xt = next;.  if(
227b0 20 70 70 50 61 67 65 20 29 7b 0a 20 20 20 20 2a   ppPage ){.    *
227c0 70 70 50 61 67 65 20 3d 20 70 50 61 67 65 3b 0a  ppPage = pPage;.
227d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 6c    }else{.    rel
227e0 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b  easePage(pPage);
227f0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28 72  .  }.  return (r
22800 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 3f  c==SQLITE_DONE ?
22810 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 72 63 29   SQLITE_OK : rc)
22820 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20  ;.}../*.** Copy 
22830 64 61 74 61 20 66 72 6f 6d 20 61 20 62 75 66 66  data from a buff
22840 65 72 20 74 6f 20 61 20 70 61 67 65 2c 20 6f 72  er to a page, or
22850 20 66 72 6f 6d 20 61 20 70 61 67 65 20 74 6f 20   from a page to 
22860 61 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20  a buffer..**.** 
22870 70 50 61 79 6c 6f 61 64 20 69 73 20 61 20 70 6f  pPayload is a po
22880 69 6e 74 65 72 20 74 6f 20 64 61 74 61 20 73 74  inter to data st
22890 6f 72 65 64 20 6f 6e 20 64 61 74 61 62 61 73 65  ored on database
228a0 20 70 61 67 65 20 70 44 62 50 61 67 65 2e 0a 2a   page pDbPage..*
228b0 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20 65 4f  * If argument eO
228c0 70 20 69 73 20 66 61 6c 73 65 2c 20 74 68 65 6e  p is false, then
228d0 20 6e 42 79 74 65 20 62 79 74 65 73 20 6f 66 20   nByte bytes of 
228e0 64 61 74 61 20 61 72 65 20 63 6f 70 69 65 64 0a  data are copied.
228f0 2a 2a 20 66 72 6f 6d 20 70 50 61 79 6c 6f 61 64  ** from pPayload
22900 20 74 6f 20 74 68 65 20 62 75 66 66 65 72 20 70   to the buffer p
22910 6f 69 6e 74 65 64 20 61 74 20 62 79 20 70 42 75  ointed at by pBu
22920 66 2e 20 49 66 20 65 4f 70 20 69 73 20 74 72 75  f. If eOp is tru
22930 65 2c 0a 2a 2a 20 74 68 65 6e 20 73 71 6c 69 74  e,.** then sqlit
22940 65 33 50 61 67 65 72 57 72 69 74 65 28 29 20 69  e3PagerWrite() i
22950 73 20 63 61 6c 6c 65 64 20 6f 6e 20 70 44 62 50  s called on pDbP
22960 61 67 65 20 61 6e 64 20 6e 42 79 74 65 20 62 79  age and nByte by
22970 74 65 73 0a 2a 2a 20 6f 66 20 64 61 74 61 20 61  tes.** of data a
22980 72 65 20 63 6f 70 69 65 64 20 66 72 6f 6d 20 74  re copied from t
22990 68 65 20 62 75 66 66 65 72 20 70 42 75 66 20 74  he buffer pBuf t
229a0 6f 20 70 50 61 79 6c 6f 61 64 2e 0a 2a 2a 0a 2a  o pPayload..**.*
229b0 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  * SQLITE_OK is r
229c0 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63 63 65  eturned on succe
229d0 73 73 2c 20 6f 74 68 65 72 77 69 73 65 20 61 6e  ss, otherwise an
229e0 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a   error code..*/.
229f0 73 74 61 74 69 63 20 69 6e 74 20 63 6f 70 79 50  static int copyP
22a00 61 79 6c 6f 61 64 28 0a 20 20 76 6f 69 64 20 2a  ayload(.  void *
22a10 70 50 61 79 6c 6f 61 64 2c 20 20 20 20 20 20 20  pPayload,       
22a20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
22a30 6f 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a 20  o page data */. 
22a40 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 20 20 20   void *pBuf,    
22a50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
22a60 69 6e 74 65 72 20 74 6f 20 62 75 66 66 65 72 20  inter to buffer 
22a70 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 2c 20  */.  int nByte, 
22a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
22a90 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
22aa0 73 20 74 6f 20 63 6f 70 79 20 2a 2f 0a 20 20 69  s to copy */.  i
22ab0 6e 74 20 65 4f 70 2c 20 20 20 20 20 20 20 20 20  nt eOp,         
22ac0 20 20 20 20 20 20 20 20 20 2f 2a 20 30 20 2d 3e           /* 0 ->
22ad0 20 63 6f 70 79 20 66 72 6f 6d 20 70 61 67 65 2c   copy from page,
22ae0 20 31 20 2d 3e 20 63 6f 70 79 20 74 6f 20 70 61   1 -> copy to pa
22af0 67 65 20 2a 2f 0a 20 20 44 62 50 61 67 65 20 2a  ge */.  DbPage *
22b00 70 44 62 50 61 67 65 20 20 20 20 20 20 20 20 20  pDbPage         
22b10 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69    /* Page contai
22b20 6e 69 6e 67 20 70 50 61 79 6c 6f 61 64 20 2a 2f  ning pPayload */
22b30 0a 29 7b 0a 20 20 69 66 28 20 65 4f 70 20 29 7b  .){.  if( eOp ){
22b40 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 64 61 74  .    /* Copy dat
22b50 61 20 66 72 6f 6d 20 62 75 66 66 65 72 20 74 6f  a from buffer to
22b60 20 70 61 67 65 20 28 61 20 77 72 69 74 65 20 6f   page (a write o
22b70 70 65 72 61 74 69 6f 6e 29 20 2a 2f 0a 20 20 20  peration) */.   
22b80 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65   int rc = sqlite
22b90 33 50 61 67 65 72 57 72 69 74 65 28 70 44 62 50  3PagerWrite(pDbP
22ba0 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
22bb0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
22bc0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
22bd0 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 63 70 79      }.    memcpy
22be0 28 70 50 61 79 6c 6f 61 64 2c 20 70 42 75 66 2c  (pPayload, pBuf,
22bf0 20 6e 42 79 74 65 29 3b 0a 20 20 7d 65 6c 73 65   nByte);.  }else
22c00 7b 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 64 61  {.    /* Copy da
22c10 74 61 20 66 72 6f 6d 20 70 61 67 65 20 74 6f 20  ta from page to 
22c20 62 75 66 66 65 72 20 28 61 20 72 65 61 64 20 6f  buffer (a read o
22c30 70 65 72 61 74 69 6f 6e 29 20 2a 2f 0a 20 20 20  peration) */.   
22c40 20 6d 65 6d 63 70 79 28 70 42 75 66 2c 20 70 50   memcpy(pBuf, pP
22c50 61 79 6c 6f 61 64 2c 20 6e 42 79 74 65 29 3b 0a  ayload, nByte);.
22c60 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
22c70 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
22c80 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
22c90 73 20 75 73 65 64 20 74 6f 20 72 65 61 64 20 6f  s used to read o
22ca0 72 20 6f 76 65 72 77 72 69 74 65 20 70 61 79 6c  r overwrite payl
22cb0 6f 61 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a  oad information.
22cc0 2a 2a 20 66 6f 72 20 74 68 65 20 65 6e 74 72 79  ** for the entry
22cd0 20 74 68 61 74 20 74 68 65 20 70 43 75 72 20 63   that the pCur c
22ce0 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e  ursor is pointin
22cf0 67 20 74 6f 2e 20 54 68 65 20 65 4f 70 0a 2a 2a  g to. The eOp.**
22d00 20 61 72 67 75 6d 65 6e 74 20 69 73 20 69 6e 74   argument is int
22d10 65 72 70 72 65 74 65 64 20 61 73 20 66 6f 6c 6c  erpreted as foll
22d20 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 30 3a 20  ows:.**.**   0: 
22d30 54 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 69 73  The operation is
22d40 20 61 20 72 65 61 64 2e 20 50 6f 70 75 6c 61 74   a read. Populat
22d50 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63  e the overflow c
22d60 61 63 68 65 2e 0a 2a 2a 20 20 20 31 3a 20 54 68  ache..**   1: Th
22d70 65 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 61  e operation is a
22d80 20 77 72 69 74 65 2e 20 50 6f 70 75 6c 61 74 65   write. Populate
22d90 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 61   the overflow ca
22da0 63 68 65 2e 0a 2a 2a 20 20 20 32 3a 20 54 68 65  che..**   2: The
22db0 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 61 20   operation is a 
22dc0 72 65 61 64 2e 20 44 6f 20 6e 6f 74 20 70 6f 70  read. Do not pop
22dd0 75 6c 61 74 65 20 74 68 65 20 6f 76 65 72 66 6c  ulate the overfl
22de0 6f 77 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20  ow cache..**.** 
22df0 41 20 74 6f 74 61 6c 20 6f 66 20 22 61 6d 74 22  A total of "amt"
22e00 20 62 79 74 65 73 20 61 72 65 20 72 65 61 64 20   bytes are read 
22e10 6f 72 20 77 72 69 74 74 65 6e 20 62 65 67 69 6e  or written begin
22e20 6e 69 6e 67 20 61 74 20 22 6f 66 66 73 65 74 22  ning at "offset"
22e30 2e 0a 2a 2a 20 44 61 74 61 20 69 73 20 72 65 61  ..** Data is rea
22e40 64 20 74 6f 20 6f 72 20 66 72 6f 6d 20 74 68 65  d to or from the
22e50 20 62 75 66 66 65 72 20 70 42 75 66 2e 0a 2a 2a   buffer pBuf..**
22e60 0a 2a 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74 20  .** The content 
22e70 62 65 69 6e 67 20 72 65 61 64 20 6f 72 20 77 72  being read or wr
22e80 69 74 74 65 6e 20 6d 69 67 68 74 20 61 70 70 65  itten might appe
22e90 61 72 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20 70  ar on the main p
22ea0 61 67 65 0a 2a 2a 20 6f 72 20 62 65 20 73 63 61  age.** or be sca
22eb0 74 74 65 72 65 64 20 6f 75 74 20 6f 6e 20 6d 75  ttered out on mu
22ec0 6c 74 69 70 6c 65 20 6f 76 65 72 66 6c 6f 77 20  ltiple overflow 
22ed0 70 61 67 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  pages..**.** If 
22ee0 74 68 65 20 63 75 72 72 65 6e 74 20 63 75 72 73  the current curs
22ef0 6f 72 20 65 6e 74 72 79 20 75 73 65 73 20 6f 6e  or entry uses on
22f00 65 20 6f 72 20 6d 6f 72 65 20 6f 76 65 72 66 6c  e or more overfl
22f10 6f 77 20 70 61 67 65 73 20 61 6e 64 20 74 68 65  ow pages and the
22f20 0a 2a 2a 20 65 4f 70 20 61 72 67 75 6d 65 6e 74  .** eOp argument
22f30 20 69 73 20 6e 6f 74 20 32 2c 20 74 68 69 73 20   is not 2, this 
22f40 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 61 6c 6c  function may all
22f50 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20  ocate space for 
22f60 61 6e 64 20 6c 61 7a 69 6c 79 20 0a 2a 2a 20 70  and lazily .** p
22f70 6f 70 75 6c 61 74 65 73 20 74 68 65 20 6f 76 65  opulates the ove
22f80 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20  rflow page-list 
22f90 63 61 63 68 65 20 61 72 72 61 79 20 28 42 74 43  cache array (BtC
22fa0 75 72 73 6f 72 2e 61 4f 76 65 72 66 6c 6f 77 29  ursor.aOverflow)
22fb0 2e 20 0a 2a 2a 20 53 75 62 73 65 71 75 65 6e 74  . .** Subsequent
22fc0 20 63 61 6c 6c 73 20 75 73 65 20 74 68 69 73 20   calls use this 
22fd0 63 61 63 68 65 20 74 6f 20 6d 61 6b 65 20 73 65  cache to make se
22fe0 65 6b 69 6e 67 20 74 6f 20 74 68 65 20 73 75 70  eking to the sup
22ff0 70 6c 69 65 64 20 6f 66 66 73 65 74 20 0a 2a 2a  plied offset .**
23000 20 6d 6f 72 65 20 65 66 66 69 63 69 65 6e 74 2e   more efficient.
23010 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 61 6e 20 6f  .**.** Once an o
23020 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73  verflow page-lis
23030 74 20 63 61 63 68 65 20 68 61 73 20 62 65 65 6e  t cache has been
23040 20 61 6c 6c 6f 63 61 74 65 64 2c 20 69 74 20 6d   allocated, it m
23050 61 79 20 62 65 0a 2a 2a 20 69 6e 76 61 6c 69 64  ay be.** invalid
23060 61 74 65 64 20 69 66 20 73 6f 6d 65 20 6f 74 68  ated if some oth
23070 65 72 20 63 75 72 73 6f 72 20 77 72 69 74 65 73  er cursor writes
23080 20 74 6f 20 74 68 65 20 73 61 6d 65 20 74 61 62   to the same tab
23090 6c 65 2c 20 6f 72 20 69 66 0a 2a 2a 20 74 68 65  le, or if.** the
230a0 20 63 75 72 73 6f 72 20 69 73 20 6d 6f 76 65 64   cursor is moved
230b0 20 74 6f 20 61 20 64 69 66 66 65 72 65 6e 74 20   to a different 
230c0 72 6f 77 2e 20 41 64 64 69 74 69 6f 6e 61 6c 6c  row. Additionall
230d0 79 2c 20 69 6e 20 61 75 74 6f 2d 76 61 63 75 75  y, in auto-vacuu
230e0 6d 0a 2a 2a 20 6d 6f 64 65 2c 20 74 68 65 20 66  m.** mode, the f
230f0 6f 6c 6c 6f 77 69 6e 67 20 65 76 65 6e 74 73 20  ollowing events 
23100 6d 61 79 20 69 6e 76 61 6c 69 64 61 74 65 20 61  may invalidate a
23110 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d  n overflow page-
23120 6c 69 73 74 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a  list cache..**.*
23130 2a 20 20 20 2a 20 41 6e 20 69 6e 63 72 65 6d 65  *   * An increme
23140 6e 74 61 6c 20 76 61 63 75 75 6d 2c 0a 2a 2a 20  ntal vacuum,.** 
23150 20 20 2a 20 41 20 63 6f 6d 6d 69 74 20 69 6e 20    * A commit in 
23160 61 75 74 6f 5f 76 61 63 75 75 6d 3d 22 66 75 6c  auto_vacuum="ful
23170 6c 22 20 6d 6f 64 65 2c 0a 2a 2a 20 20 20 2a 20  l" mode,.**   * 
23180 43 72 65 61 74 69 6e 67 20 61 20 74 61 62 6c 65  Creating a table
23190 20 28 6d 61 79 20 72 65 71 75 69 72 65 20 6d 6f   (may require mo
231a0 76 69 6e 67 20 61 6e 20 6f 76 65 72 66 6c 6f 77  ving an overflow
231b0 20 70 61 67 65 29 2e 0a 2a 2f 0a 73 74 61 74 69   page)..*/.stati
231c0 63 20 69 6e 74 20 61 63 63 65 73 73 50 61 79 6c  c int accessPayl
231d0 6f 61 64 28 0a 20 20 42 74 43 75 72 73 6f 72 20  oad(.  BtCursor 
231e0 2a 70 43 75 72 2c 20 20 20 20 20 20 2f 2a 20 43  *pCur,      /* C
231f0 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74  ursor pointing t
23200 6f 20 65 6e 74 72 79 20 74 6f 20 72 65 61 64 20  o entry to read 
23210 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32 20 6f 66  from */.  u32 of
23220 66 73 65 74 2c 20 20 20 20 20 20 20 20 20 20 2f  fset,          /
23230 2a 20 42 65 67 69 6e 20 72 65 61 64 69 6e 67 20  * Begin reading 
23240 74 68 69 73 20 66 61 72 20 69 6e 74 6f 20 70 61  this far into pa
23250 79 6c 6f 61 64 20 2a 2f 0a 20 20 75 33 32 20 61  yload */.  u32 a
23260 6d 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  mt,             
23270 2f 2a 20 52 65 61 64 20 74 68 69 73 20 6d 61 6e  /* Read this man
23280 79 20 62 79 74 65 73 20 2a 2f 0a 20 20 75 6e 73  y bytes */.  uns
23290 69 67 6e 65 64 20 63 68 61 72 20 2a 70 42 75 66  igned char *pBuf
232a0 2c 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 62  , /* Write the b
232b0 79 74 65 73 20 69 6e 74 6f 20 74 68 69 73 20 62  ytes into this b
232c0 75 66 66 65 72 20 2a 2f 20 0a 20 20 69 6e 74 20  uffer */ .  int 
232d0 65 4f 70 20 20 20 20 20 20 20 20 20 20 20 20 20  eOp             
232e0 20 2f 2a 20 7a 65 72 6f 20 74 6f 20 72 65 61 64   /* zero to read
232f0 2e 20 6e 6f 6e 2d 7a 65 72 6f 20 74 6f 20 77 72  . non-zero to wr
23300 69 74 65 2e 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73  ite. */.){.  uns
23310 69 67 6e 65 64 20 63 68 61 72 20 2a 61 50 61 79  igned char *aPay
23320 6c 6f 61 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d  load;.  int rc =
23330 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e   SQLITE_OK;.  in
23340 74 20 69 49 64 78 20 3d 20 30 3b 0a 20 20 4d 65  t iIdx = 0;.  Me
23350 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 70  mPage *pPage = p
23360 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
23370 2d 3e 69 50 61 67 65 5d 3b 20 2f 2a 20 42 74 72  ->iPage]; /* Btr
23380 65 65 20 70 61 67 65 20 6f 66 20 63 75 72 72 65  ee page of curre
23390 6e 74 20 65 6e 74 72 79 20 2a 2f 0a 20 20 42 74  nt entry */.  Bt
233a0 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 43  Shared *pBt = pC
233b0 75 72 2d 3e 70 42 74 3b 20 20 20 20 20 20 20 20  ur->pBt;        
233c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 74 72            /* Btr
233d0 65 65 20 74 68 69 73 20 63 75 72 73 6f 72 20 62  ee this cursor b
233e0 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a 23 69 66  elongs to */.#if
233f0 64 65 66 20 53 51 4c 49 54 45 5f 44 49 52 45 43  def SQLITE_DIREC
23400 54 5f 4f 56 45 52 46 4c 4f 57 5f 52 45 41 44 0a  T_OVERFLOW_READ.
23410 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
23420 2a 20 63 6f 6e 73 74 20 70 42 75 66 53 74 61 72  * const pBufStar
23430 74 20 3d 20 70 42 75 66 3b 0a 20 20 69 6e 74 20  t = pBuf;.  int 
23440 62 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20 20  bEnd;           
23450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23460 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
23470 20 72 65 61 64 69 6e 67 20 74 6f 20 65 6e 64 20   reading to end 
23480 6f 66 20 64 61 74 61 20 2a 2f 0a 23 65 6e 64 69  of data */.#endi
23490 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  f..  assert( pPa
234a0 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ge );.  assert( 
234b0 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
234c0 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
234d0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69  assert( pCur->ai
234e0 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
234f0 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b  <pPage->nCell );
23500 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
23510 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
23520 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65  ) );.  assert( e
23530 4f 70 21 3d 32 20 7c 7c 20 6f 66 66 73 65 74 3d  Op!=2 || offset=
23540 3d 30 20 29 3b 20 20 20 20 2f 2a 20 41 6c 77 61  =0 );    /* Alwa
23550 79 73 20 73 74 61 72 74 20 66 72 6f 6d 20 62 65  ys start from be
23560 67 69 6e 6e 69 6e 67 20 66 6f 72 20 65 4f 70 3d  ginning for eOp=
23570 3d 32 20 2a 2f 0a 0a 20 20 67 65 74 43 65 6c 6c  =2 */..  getCell
23580 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 61 50  Info(pCur);.  aP
23590 61 79 6c 6f 61 64 20 3d 20 70 43 75 72 2d 3e 69  ayload = pCur->i
235a0 6e 66 6f 2e 70 50 61 79 6c 6f 61 64 3b 0a 23 69  nfo.pPayload;.#i
235b0 66 64 65 66 20 53 51 4c 49 54 45 5f 44 49 52 45  fdef SQLITE_DIRE
235c0 43 54 5f 4f 56 45 52 46 4c 4f 57 5f 52 45 41 44  CT_OVERFLOW_READ
235d0 0a 20 20 62 45 6e 64 20 3d 20 6f 66 66 73 65 74  .  bEnd = offset
235e0 2b 61 6d 74 3d 3d 70 43 75 72 2d 3e 69 6e 66 6f  +amt==pCur->info
235f0 2e 6e 50 61 79 6c 6f 61 64 3b 0a 23 65 6e 64 69  .nPayload;.#endi
23600 66 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73  f.  assert( offs
23610 65 74 2b 61 6d 74 20 3c 3d 20 70 43 75 72 2d 3e  et+amt <= pCur->
23620 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 29 3b  info.nPayload );
23630 0a 0a 20 20 69 66 28 20 26 61 50 61 79 6c 6f 61  ..  if( &aPayloa
23640 64 5b 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f  d[pCur->info.nLo
23650 63 61 6c 5d 20 3e 20 26 70 50 61 67 65 2d 3e 61  cal] > &pPage->a
23660 44 61 74 61 5b 70 42 74 2d 3e 75 73 61 62 6c 65  Data[pBt->usable
23670 53 69 7a 65 5d 20 29 7b 0a 20 20 20 20 2f 2a 20  Size] ){.    /* 
23680 54 72 79 69 6e 67 20 74 6f 20 72 65 61 64 20 6f  Trying to read o
23690 72 20 77 72 69 74 65 20 70 61 73 74 20 74 68 65  r write past the
236a0 20 65 6e 64 20 6f 66 20 74 68 65 20 64 61 74 61   end of the data
236b0 20 69 73 20 61 6e 20 65 72 72 6f 72 20 2a 2f 0a   is an error */.
236c0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
236d0 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
236e0 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20    }..  /* Check 
236f0 69 66 20 64 61 74 61 20 6d 75 73 74 20 62 65 20  if data must be 
23700 72 65 61 64 2f 77 72 69 74 74 65 6e 20 74 6f 2f  read/written to/
23710 66 72 6f 6d 20 74 68 65 20 62 74 72 65 65 20 70  from the btree p
23720 61 67 65 20 69 74 73 65 6c 66 2e 20 2a 2f 0a 20  age itself. */. 
23730 20 69 66 28 20 6f 66 66 73 65 74 3c 70 43 75 72   if( offset<pCur
23740 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b  ->info.nLocal ){
23750 0a 20 20 20 20 69 6e 74 20 61 20 3d 20 61 6d 74  .    int a = amt
23760 3b 0a 20 20 20 20 69 66 28 20 61 2b 6f 66 66 73  ;.    if( a+offs
23770 65 74 3e 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c  et>pCur->info.nL
23780 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 61 20  ocal ){.      a 
23790 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f  = pCur->info.nLo
237a0 63 61 6c 20 2d 20 6f 66 66 73 65 74 3b 0a 20 20  cal - offset;.  
237b0 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 63 6f 70    }.    rc = cop
237c0 79 50 61 79 6c 6f 61 64 28 26 61 50 61 79 6c 6f  yPayload(&aPaylo
237d0 61 64 5b 6f 66 66 73 65 74 5d 2c 20 70 42 75 66  ad[offset], pBuf
237e0 2c 20 61 2c 20 28 65 4f 70 20 26 20 30 78 30 31  , a, (eOp & 0x01
237f0 29 2c 20 70 50 61 67 65 2d 3e 70 44 62 50 61 67  ), pPage->pDbPag
23800 65 29 3b 0a 20 20 20 20 6f 66 66 73 65 74 20 3d  e);.    offset =
23810 20 30 3b 0a 20 20 20 20 70 42 75 66 20 2b 3d 20   0;.    pBuf += 
23820 61 3b 0a 20 20 20 20 61 6d 74 20 2d 3d 20 61 3b  a;.    amt -= a;
23830 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 66  .  }else{.    of
23840 66 73 65 74 20 2d 3d 20 70 43 75 72 2d 3e 69 6e  fset -= pCur->in
23850 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 0a 0a  fo.nLocal;.  }..
23860 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
23870 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20 29 7b  E_OK && amt>0 ){
23880 0a 20 20 20 20 63 6f 6e 73 74 20 75 33 32 20 6f  .    const u32 o
23890 76 66 6c 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75  vflSize = pBt->u
238a0 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 20 20  sableSize - 4;  
238b0 2f 2a 20 42 79 74 65 73 20 63 6f 6e 74 65 6e 74  /* Bytes content
238c0 20 70 65 72 20 6f 76 66 6c 20 70 61 67 65 20 2a   per ovfl page *
238d0 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 65 78 74 50  /.    Pgno nextP
238e0 61 67 65 3b 0a 0a 20 20 20 20 6e 65 78 74 50 61  age;..    nextPa
238f0 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 61  ge = get4byte(&a
23900 50 61 79 6c 6f 61 64 5b 70 43 75 72 2d 3e 69 6e  Payload[pCur->in
23910 66 6f 2e 6e 4c 6f 63 61 6c 5d 29 3b 0a 0a 20 20  fo.nLocal]);..  
23920 20 20 2f 2a 20 49 66 20 74 68 65 20 42 74 43 75    /* If the BtCu
23930 72 73 6f 72 2e 61 4f 76 65 72 66 6c 6f 77 5b 5d  rsor.aOverflow[]
23940 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 61 6c   has not been al
23950 6c 6f 63 61 74 65 64 2c 20 61 6c 6c 6f 63 61 74  located, allocat
23960 65 20 69 74 20 6e 6f 77 2e 0a 20 20 20 20 2a 2a  e it now..    **
23970 20 45 78 63 65 70 74 2c 20 64 6f 20 6e 6f 74 20   Except, do not 
23980 61 6c 6c 6f 63 61 74 65 20 61 4f 76 65 72 66 6c  allocate aOverfl
23990 6f 77 5b 5d 20 66 6f 72 20 65 4f 70 3d 3d 32 2e  ow[] for eOp==2.
239a0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
239b0 68 65 20 61 4f 76 65 72 66 6c 6f 77 5b 5d 20 61  he aOverflow[] a
239c0 72 72 61 79 20 69 73 20 73 69 7a 65 64 20 61 74  rray is sized at
239d0 20 6f 6e 65 20 65 6e 74 72 79 20 66 6f 72 20 65   one entry for e
239e0 61 63 68 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  ach overflow pag
239f0 65 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20  e.    ** in the 
23a00 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 2e 20  overflow chain. 
23a10 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  The page number 
23a20 6f 66 20 74 68 65 20 66 69 72 73 74 20 6f 76 65  of the first ove
23a30 72 66 6c 6f 77 20 70 61 67 65 20 69 73 0a 20 20  rflow page is.  
23a40 20 20 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20 61    ** stored in a
23a50 4f 76 65 72 66 6c 6f 77 5b 30 5d 2c 20 65 74 63  Overflow[0], etc
23a60 2e 20 41 20 76 61 6c 75 65 20 6f 66 20 30 20 69  . A value of 0 i
23a70 6e 20 74 68 65 20 61 4f 76 65 72 66 6c 6f 77 5b  n the aOverflow[
23a80 5d 20 61 72 72 61 79 0a 20 20 20 20 2a 2a 20 6d  ] array.    ** m
23a90 65 61 6e 73 20 22 6e 6f 74 20 79 65 74 20 6b 6e  eans "not yet kn
23aa0 6f 77 6e 22 20 28 74 68 65 20 63 61 63 68 65 20  own" (the cache 
23ab0 69 73 20 6c 61 7a 69 6c 79 20 70 6f 70 75 6c 61  is lazily popula
23ac0 74 65 64 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ted)..    */.   
23ad0 20 69 66 28 20 65 4f 70 21 3d 32 20 26 26 20 28   if( eOp!=2 && (
23ae0 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26  pCur->curFlags &
23af0 20 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29   BTCF_ValidOvfl)
23b00 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ==0 ){.      int
23b10 20 6e 4f 76 66 6c 20 3d 20 28 70 43 75 72 2d 3e   nOvfl = (pCur->
23b20 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 2d 70 43  info.nPayload-pC
23b30 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 2b  ur->info.nLocal+
23b40 6f 76 66 6c 53 69 7a 65 2d 31 29 2f 6f 76 66 6c  ovflSize-1)/ovfl
23b50 53 69 7a 65 3b 0a 20 20 20 20 20 20 69 66 28 20  Size;.      if( 
23b60 6e 4f 76 66 6c 3e 70 43 75 72 2d 3e 6e 4f 76 66  nOvfl>pCur->nOvf
23b70 6c 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 20 20  lAlloc ){.      
23b80 20 20 50 67 6e 6f 20 2a 61 4e 65 77 20 3d 20 28    Pgno *aNew = (
23b90 50 67 6e 6f 2a 29 73 71 6c 69 74 65 33 52 65 61  Pgno*)sqlite3Rea
23ba0 6c 6c 6f 63 28 0a 20 20 20 20 20 20 20 20 20 20  lloc(.          
23bb0 20 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f    pCur->aOverflo
23bc0 77 2c 20 6e 4f 76 66 6c 2a 32 2a 73 69 7a 65 6f  w, nOvfl*2*sizeo
23bd0 66 28 50 67 6e 6f 29 0a 20 20 20 20 20 20 20 20  f(Pgno).        
23be0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61  );.        if( a
23bf0 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  New==0 ){.      
23c00 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
23c10 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 7d  NOMEM;.        }
23c20 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
23c30 70 43 75 72 2d 3e 6e 4f 76 66 6c 41 6c 6c 6f 63  pCur->nOvflAlloc
23c40 20 3d 20 6e 4f 76 66 6c 2a 32 3b 0a 20 20 20 20   = nOvfl*2;.    
23c50 20 20 20 20 20 20 70 43 75 72 2d 3e 61 4f 76 65        pCur->aOve
23c60 72 66 6c 6f 77 20 3d 20 61 4e 65 77 3b 0a 20 20  rflow = aNew;.  
23c70 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
23c80 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
23c90 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
23ca0 20 20 20 6d 65 6d 73 65 74 28 70 43 75 72 2d 3e     memset(pCur->
23cb0 61 4f 76 65 72 66 6c 6f 77 2c 20 30 2c 20 6e 4f  aOverflow, 0, nO
23cc0 76 66 6c 2a 73 69 7a 65 6f 66 28 50 67 6e 6f 29  vfl*sizeof(Pgno)
23cd0 29 3b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d  );.        pCur-
23ce0 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20 42 54 43  >curFlags |= BTC
23cf0 46 5f 56 61 6c 69 64 4f 76 66 6c 3b 0a 20 20 20  F_ValidOvfl;.   
23d00 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
23d10 2f 2a 20 49 66 20 74 68 65 20 6f 76 65 72 66 6c  /* If the overfl
23d20 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63  ow page-list cac
23d30 68 65 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f  he has been allo
23d40 63 61 74 65 64 20 61 6e 64 20 74 68 65 0a 20 20  cated and the.  
23d50 20 20 2a 2a 20 65 6e 74 72 79 20 66 6f 72 20 74    ** entry for t
23d60 68 65 20 66 69 72 73 74 20 72 65 71 75 69 72 65  he first require
23d70 64 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  d overflow page 
23d80 69 73 20 76 61 6c 69 64 2c 20 73 6b 69 70 0a 20  is valid, skip. 
23d90 20 20 20 2a 2a 20 64 69 72 65 63 74 6c 79 20 74     ** directly t
23da0 6f 20 69 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  o it..    */.   
23db0 20 69 66 28 20 28 70 43 75 72 2d 3e 63 75 72 46   if( (pCur->curF
23dc0 6c 61 67 73 20 26 20 42 54 43 46 5f 56 61 6c 69  lags & BTCF_Vali
23dd0 64 4f 76 66 6c 29 21 3d 30 0a 20 20 20 20 20 26  dOvfl)!=0.     &
23de0 26 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f  & pCur->aOverflo
23df0 77 5b 6f 66 66 73 65 74 2f 6f 76 66 6c 53 69 7a  w[offset/ovflSiz
23e00 65 5d 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  e].    ){.      
23e10 69 49 64 78 20 3d 20 28 6f 66 66 73 65 74 2f 6f  iIdx = (offset/o
23e20 76 66 6c 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  vflSize);.      
23e30 6e 65 78 74 50 61 67 65 20 3d 20 70 43 75 72 2d  nextPage = pCur-
23e40 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d  >aOverflow[iIdx]
23e50 3b 0a 20 20 20 20 20 20 6f 66 66 73 65 74 20 3d  ;.      offset =
23e60 20 28 6f 66 66 73 65 74 25 6f 76 66 6c 53 69 7a   (offset%ovflSiz
23e70 65 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66  e);.    }..    f
23e80 6f 72 28 20 3b 20 72 63 3d 3d 53 51 4c 49 54 45  or( ; rc==SQLITE
23e90 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20 26 26 20  _OK && amt>0 && 
23ea0 6e 65 78 74 50 61 67 65 3b 20 69 49 64 78 2b 2b  nextPage; iIdx++
23eb0 29 7b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  ){..      /* If 
23ec0 72 65 71 75 69 72 65 64 2c 20 70 6f 70 75 6c 61  required, popula
23ed0 74 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  te the overflow 
23ee0 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 2e  page-list cache.
23ef0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 28 70   */.      if( (p
23f00 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20  Cur->curFlags & 
23f10 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 21  BTCF_ValidOvfl)!
23f20 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  =0 ){.        as
23f30 73 65 72 74 28 21 70 43 75 72 2d 3e 61 4f 76 65  sert(!pCur->aOve
23f40 72 66 6c 6f 77 5b 69 49 64 78 5d 20 7c 7c 20 70  rflow[iIdx] || p
23f50 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69  Cur->aOverflow[i
23f60 49 64 78 5d 3d 3d 6e 65 78 74 50 61 67 65 29 3b  Idx]==nextPage);
23f70 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 61  .        pCur->a
23f80 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 20 3d  Overflow[iIdx] =
23f90 20 6e 65 78 74 50 61 67 65 3b 0a 20 20 20 20 20   nextPage;.     
23fa0 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 6f 66   }..      if( of
23fb0 66 73 65 74 3e 3d 6f 76 66 6c 53 69 7a 65 20 29  fset>=ovflSize )
23fc0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  {.        /* The
23fd0 20 6f 6e 6c 79 20 72 65 61 73 6f 6e 20 74 6f 20   only reason to 
23fe0 72 65 61 64 20 74 68 69 73 20 70 61 67 65 20 69  read this page i
23ff0 73 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20  s to obtain the 
24000 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  page.        ** 
24010 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 6e  number for the n
24020 65 78 74 20 70 61 67 65 20 69 6e 20 74 68 65 20  ext page in the 
24030 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 2e 20  overflow chain. 
24040 54 68 65 20 70 61 67 65 0a 20 20 20 20 20 20 20  The page.       
24050 20 2a 2a 20 64 61 74 61 20 69 73 20 6e 6f 74 20   ** data is not 
24060 72 65 71 75 69 72 65 64 2e 20 53 6f 20 66 69 72  required. So fir
24070 73 74 20 74 72 79 20 74 6f 20 6c 6f 6f 6b 75 70  st try to lookup
24080 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 0a 20 20   the overflow.  
24090 20 20 20 20 20 20 2a 2a 20 70 61 67 65 2d 6c 69        ** page-li
240a0 73 74 20 63 61 63 68 65 2c 20 69 66 20 61 6e 79  st cache, if any
240b0 2c 20 74 68 65 6e 20 66 61 6c 6c 20 62 61 63 6b  , then fall back
240c0 20 74 6f 20 74 68 65 20 67 65 74 4f 76 65 72 66   to the getOverf
240d0 6c 6f 77 50 61 67 65 28 29 0a 20 20 20 20 20 20  lowPage().      
240e0 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a 20    ** function.. 
240f0 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
24100 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74    ** Note that t
24110 68 65 20 61 4f 76 65 72 66 6c 6f 77 5b 5d 20 61  he aOverflow[] a
24120 72 72 61 79 20 6d 75 73 74 20 62 65 20 61 6c 6c  rray must be all
24130 6f 63 61 74 65 64 20 62 65 63 61 75 73 65 20 65  ocated because e
24140 4f 70 21 3d 32 0a 20 20 20 20 20 20 20 20 2a 2a  Op!=2.        **
24150 20 68 65 72 65 2e 20 20 49 66 20 65 4f 70 3d 3d   here.  If eOp==
24160 32 2c 20 74 68 65 6e 20 6f 66 66 73 65 74 3d 3d  2, then offset==
24170 30 20 61 6e 64 20 74 68 69 73 20 62 72 61 6e 63  0 and this branc
24180 68 20 69 73 20 6e 65 76 65 72 20 74 61 6b 65 6e  h is never taken
24190 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
241a0 20 20 20 20 20 61 73 73 65 72 74 28 20 65 4f 70       assert( eOp
241b0 21 3d 32 20 29 3b 0a 20 20 20 20 20 20 20 20 61  !=2 );.        a
241c0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 63 75 72  ssert( pCur->cur
241d0 46 6c 61 67 73 20 26 20 42 54 43 46 5f 56 61 6c  Flags & BTCF_Val
241e0 69 64 4f 76 66 6c 20 29 3b 0a 20 20 20 20 20 20  idOvfl );.      
241f0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
24200 70 42 74 72 65 65 2d 3e 64 62 3d 3d 70 42 74 2d  pBtree->db==pBt-
24210 3e 64 62 20 29 3b 0a 20 20 20 20 20 20 20 20 69  >db );.        i
24220 66 28 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c  f( pCur->aOverfl
24230 6f 77 5b 69 49 64 78 2b 31 5d 20 29 7b 0a 20 20  ow[iIdx+1] ){.  
24240 20 20 20 20 20 20 20 20 6e 65 78 74 50 61 67 65          nextPage
24250 20 3d 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c   = pCur->aOverfl
24260 6f 77 5b 69 49 64 78 2b 31 5d 3b 0a 20 20 20 20  ow[iIdx+1];.    
24270 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
24280 20 20 20 20 20 72 63 20 3d 20 67 65 74 4f 76 65       rc = getOve
24290 72 66 6c 6f 77 50 61 67 65 28 70 42 74 2c 20 6e  rflowPage(pBt, n
242a0 65 78 74 50 61 67 65 2c 20 30 2c 20 26 6e 65 78  extPage, 0, &nex
242b0 74 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  tPage);.        
242c0 7d 0a 20 20 20 20 20 20 20 20 6f 66 66 73 65 74  }.        offset
242d0 20 2d 3d 20 6f 76 66 6c 53 69 7a 65 3b 0a 20 20   -= ovflSize;.  
242e0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
242f0 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20 72 65     /* Need to re
24300 61 64 20 74 68 69 73 20 70 61 67 65 20 70 72 6f  ad this page pro
24310 70 65 72 6c 79 2e 20 49 74 20 63 6f 6e 74 61 69  perly. It contai
24320 6e 73 20 73 6f 6d 65 20 6f 66 20 74 68 65 0a 20  ns some of the. 
24330 20 20 20 20 20 20 20 2a 2a 20 72 61 6e 67 65 20         ** range 
24340 6f 66 20 64 61 74 61 20 74 68 61 74 20 69 73 20  of data that is 
24350 62 65 69 6e 67 20 72 65 61 64 20 28 65 4f 70 3d  being read (eOp=
24360 3d 30 29 20 6f 72 20 77 72 69 74 74 65 6e 20 28  =0) or written (
24370 65 4f 70 21 3d 30 29 2e 0a 20 20 20 20 20 20 20  eOp!=0)..       
24380 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
24390 45 5f 44 49 52 45 43 54 5f 4f 56 45 52 46 4c 4f  E_DIRECT_OVERFLO
243a0 57 5f 52 45 41 44 0a 20 20 20 20 20 20 20 20 73  W_READ.        s
243b0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 3b  qlite3_file *fd;
243c0 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20  .#endif.        
243d0 69 6e 74 20 61 20 3d 20 61 6d 74 3b 0a 20 20 20  int a = amt;.   
243e0 20 20 20 20 20 69 66 28 20 61 20 2b 20 6f 66 66       if( a + off
243f0 73 65 74 20 3e 20 6f 76 66 6c 53 69 7a 65 20 29  set > ovflSize )
24400 7b 0a 20 20 20 20 20 20 20 20 20 20 61 20 3d 20  {.          a = 
24410 6f 76 66 6c 53 69 7a 65 20 2d 20 6f 66 66 73 65  ovflSize - offse
24420 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 23 69  t;.        }..#i
24430 66 64 65 66 20 53 51 4c 49 54 45 5f 44 49 52 45  fdef SQLITE_DIRE
24440 43 54 5f 4f 56 45 52 46 4c 4f 57 5f 52 45 41 44  CT_OVERFLOW_READ
24450 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61  .        /* If a
24460 6c 6c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ll the following
24470 20 61 72 65 20 74 72 75 65 3a 0a 20 20 20 20 20   are true:.     
24480 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
24490 20 20 20 31 29 20 74 68 69 73 20 69 73 20 61 20     1) this is a 
244a0 72 65 61 64 20 6f 70 65 72 61 74 69 6f 6e 2c 20  read operation, 
244b0 61 6e 64 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  and .        ** 
244c0 20 20 32 29 20 64 61 74 61 20 69 73 20 72 65 71    2) data is req
244d0 75 69 72 65 64 20 66 72 6f 6d 20 74 68 65 20 73  uired from the s
244e0 74 61 72 74 20 6f 66 20 74 68 69 73 20 6f 76 65  tart of this ove
244f0 72 66 6c 6f 77 20 70 61 67 65 2c 20 61 6e 64 0a  rflow page, and.
24500 20 20 20 20 20 20 20 20 2a 2a 20 20 20 33 29 20          **   3) 
24510 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
24520 66 69 6c 65 2d 62 61 63 6b 65 64 2c 20 61 6e 64  file-backed, and
24530 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 34 29  .        **   4)
24540 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6f 70 65   there is no ope
24550 6e 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  n write-transact
24560 69 6f 6e 2c 20 61 6e 64 0a 20 20 20 20 20 20 20  ion, and.       
24570 20 2a 2a 20 20 20 35 29 20 74 68 65 20 64 61 74   **   5) the dat
24580 61 62 61 73 65 20 69 73 20 6e 6f 74 20 61 20 57  abase is not a W
24590 41 4c 20 64 61 74 61 62 61 73 65 2c 0a 20 20 20  AL database,.   
245a0 20 20 20 20 20 2a 2a 20 20 20 36 29 20 61 6c 6c       **   6) all
245b0 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 70   data from the p
245c0 61 67 65 20 69 73 20 62 65 69 6e 67 20 72 65 61  age is being rea
245d0 64 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  d..        **   
245e0 37 29 20 61 74 20 6c 65 61 73 74 20 34 20 62 79  7) at least 4 by
245f0 74 65 73 20 68 61 76 65 20 61 6c 72 65 61 64 79  tes have already
24600 20 62 65 65 6e 20 72 65 61 64 20 69 6e 74 6f 20   been read into 
24610 74 68 65 20 6f 75 74 70 75 74 20 62 75 66 66 65  the output buffe
24620 72 20 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  r .        **.  
24630 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 64 61        ** then da
24640 74 61 20 63 61 6e 20 62 65 20 72 65 61 64 20 64  ta can be read d
24650 69 72 65 63 74 6c 79 20 66 72 6f 6d 20 74 68 65  irectly from the
24660 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
24670 6e 74 6f 20 74 68 65 0a 20 20 20 20 20 20 20 20  nto the.        
24680 2a 2a 20 6f 75 74 70 75 74 20 62 75 66 66 65 72  ** output buffer
24690 2c 20 62 79 70 61 73 73 69 6e 67 20 74 68 65 20  , bypassing the 
246a0 70 61 67 65 2d 63 61 63 68 65 20 61 6c 74 6f 67  page-cache altog
246b0 65 74 68 65 72 2e 20 54 68 69 73 20 73 70 65 65  ether. This spee
246c0 64 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 75 70  ds.        ** up
246d0 20 6c 6f 61 64 69 6e 67 20 6c 61 72 67 65 20 72   loading large r
246e0 65 63 6f 72 64 73 20 74 68 61 74 20 73 70 61 6e  ecords that span
246f0 20 6d 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70   many overflow p
24700 61 67 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ages..        */
24710 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 65 4f  .        if( (eO
24720 70 26 30 78 30 31 29 3d 3d 30 20 20 20 20 20 20  p&0x01)==0      
24730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24750 2f 2a 20 28 31 29 20 2a 2f 0a 20 20 20 20 20 20  /* (1) */.      
24760 20 20 20 26 26 20 6f 66 66 73 65 74 3d 3d 30 20     && offset==0 
24770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24790 20 20 20 20 20 20 20 20 20 2f 2a 20 28 32 29 20           /* (2) 
247a0 2a 2f 0a 20 20 20 20 20 20 20 20 20 26 26 20 28  */.         && (
247b0 62 45 6e 64 20 7c 7c 20 61 3d 3d 6f 76 66 6c 53  bEnd || a==ovflS
247c0 69 7a 65 29 20 20 20 20 20 20 20 20 20 20 20 20  ize)            
247d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
247e0 20 20 2f 2a 20 28 36 29 20 2a 2f 0a 20 20 20 20    /* (6) */.    
247f0 20 20 20 20 20 26 26 20 70 42 74 2d 3e 69 6e 54       && pBt->inT
24800 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e  ransaction==TRAN
24810 53 5f 52 45 41 44 20 20 20 20 20 20 20 20 20 20  S_READ          
24820 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28 34             /* (4
24830 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 26 26  ) */.         &&
24840 20 28 66 64 20 3d 20 73 71 6c 69 74 65 33 50 61   (fd = sqlite3Pa
24850 67 65 72 46 69 6c 65 28 70 42 74 2d 3e 70 50 61  gerFile(pBt->pPa
24860 67 65 72 29 29 2d 3e 70 4d 65 74 68 6f 64 73 20  ger))->pMethods 
24870 20 20 20 20 2f 2a 20 28 33 29 20 2a 2f 0a 20 20      /* (3) */.  
24880 20 20 20 20 20 20 20 26 26 20 70 42 74 2d 3e 70         && pBt->p
24890 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 31 39 5d  Page1->aData[19]
248a0 3d 3d 30 78 30 31 20 20 20 20 20 20 20 20 20 20  ==0x01          
248b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
248c0 28 35 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  (5) */.         
248d0 26 26 20 26 70 42 75 66 5b 2d 34 5d 3e 3d 70 42  && &pBuf[-4]>=pB
248e0 75 66 53 74 61 72 74 20 20 20 20 20 20 20 20 20  ufStart         
248f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24900 20 20 20 20 20 20 2f 2a 20 28 37 29 20 2a 2f 0a        /* (7) */.
24910 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
24920 20 20 20 20 20 75 38 20 61 53 61 76 65 5b 34 5d       u8 aSave[4]
24930 3b 0a 20 20 20 20 20 20 20 20 20 20 75 38 20 2a  ;.          u8 *
24940 61 57 72 69 74 65 20 3d 20 26 70 42 75 66 5b 2d  aWrite = &pBuf[-
24950 34 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73  4];.          as
24960 73 65 72 74 28 20 61 57 72 69 74 65 3e 3d 70 42  sert( aWrite>=pB
24970 75 66 53 74 61 72 74 20 29 3b 20 20 20 20 20 20  ufStart );      
24980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24990 20 20 20 2f 2a 20 68 65 6e 63 65 20 28 37 29 20     /* hence (7) 
249a0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d  */.          mem
249b0 63 70 79 28 61 53 61 76 65 2c 20 61 57 72 69 74  cpy(aSave, aWrit
249c0 65 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20  e, 4);.         
249d0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52   rc = sqlite3OsR
249e0 65 61 64 28 66 64 2c 20 61 57 72 69 74 65 2c 20  ead(fd, aWrite, 
249f0 61 2b 34 2c 20 28 69 36 34 29 70 42 74 2d 3e 70  a+4, (i64)pBt->p
24a00 61 67 65 53 69 7a 65 2a 28 6e 65 78 74 50 61 67  ageSize*(nextPag
24a10 65 2d 31 29 29 3b 0a 20 20 20 20 20 20 20 20 20  e-1));.         
24a20 20 6e 65 78 74 50 61 67 65 20 3d 20 67 65 74 34   nextPage = get4
24a30 62 79 74 65 28 61 57 72 69 74 65 29 3b 0a 20 20  byte(aWrite);.  
24a40 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 61          memcpy(a
24a50 57 72 69 74 65 2c 20 61 53 61 76 65 2c 20 34 29  Write, aSave, 4)
24a60 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 0a  ;.        }else.
24a70 23 65 6e 64 69 66 0a 0a 20 20 20 20 20 20 20 20  #endif..        
24a80 7b 0a 20 20 20 20 20 20 20 20 20 20 44 62 50 61  {.          DbPa
24a90 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 20 20 20  ge *pDbPage;.   
24aa0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
24ab0 74 65 33 50 61 67 65 72 41 63 71 75 69 72 65 28  te3PagerAcquire(
24ac0 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6e 65 78  pBt->pPager, nex
24ad0 74 50 61 67 65 2c 20 26 70 44 62 50 61 67 65 2c  tPage, &pDbPage,
24ae0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28  .              (
24af0 28 65 4f 70 26 30 78 30 31 29 3d 3d 30 20 3f 20  (eOp&0x01)==0 ? 
24b00 50 41 47 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e  PAGER_GET_READON
24b10 4c 59 20 3a 20 30 29 0a 20 20 20 20 20 20 20 20  LY : 0).        
24b20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69    );.          i
24b30 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
24b40 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
24b50 61 50 61 79 6c 6f 61 64 20 3d 20 73 71 6c 69 74  aPayload = sqlit
24b60 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70  e3PagerGetData(p
24b70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
24b80 20 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20       nextPage = 
24b90 67 65 74 34 62 79 74 65 28 61 50 61 79 6c 6f 61  get4byte(aPayloa
24ba0 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  d);.            
24bb0 72 63 20 3d 20 63 6f 70 79 50 61 79 6c 6f 61 64  rc = copyPayload
24bc0 28 26 61 50 61 79 6c 6f 61 64 5b 6f 66 66 73 65  (&aPayload[offse
24bd0 74 2b 34 5d 2c 20 70 42 75 66 2c 20 61 2c 20 28  t+4], pBuf, a, (
24be0 65 4f 70 26 30 78 30 31 29 2c 20 70 44 62 50 61  eOp&0x01), pDbPa
24bf0 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ge);.           
24c00 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
24c10 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20  ef(pDbPage);.   
24c20 20 20 20 20 20 20 20 20 20 6f 66 66 73 65 74 20           offset 
24c30 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  = 0;.          }
24c40 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
24c50 20 20 20 61 6d 74 20 2d 3d 20 61 3b 0a 20 20 20     amt -= a;.   
24c60 20 20 20 20 20 70 42 75 66 20 2b 3d 20 61 3b 0a       pBuf += a;.
24c70 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
24c80 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  }..  if( rc==SQL
24c90 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20  ITE_OK && amt>0 
24ca0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
24cb0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
24cc0 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  T;.  }.  return 
24cd0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  rc;.}../*.** Rea
24ce0 64 20 70 61 72 74 20 6f 66 20 74 68 65 20 6b 65  d part of the ke
24cf0 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  y associated wit
24d00 68 20 63 75 72 73 6f 72 20 70 43 75 72 2e 20 20  h cursor pCur.  
24d10 45 78 61 63 74 6c 79 0a 2a 2a 20 22 61 6d 74 22  Exactly.** "amt"
24d20 20 62 79 74 65 73 20 77 69 6c 6c 20 62 65 20 74   bytes will be t
24d30 72 61 6e 73 66 65 72 72 65 64 20 69 6e 74 6f 20  ransferred into 
24d40 70 42 75 66 5b 5d 2e 20 20 54 68 65 20 74 72 61  pBuf[].  The tra
24d50 6e 73 66 65 72 0a 2a 2a 20 62 65 67 69 6e 73 20  nsfer.** begins 
24d60 61 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 0a  at "offset"..**.
24d70 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75  ** The caller mu
24d80 73 74 20 65 6e 73 75 72 65 20 74 68 61 74 20 70  st ensure that p
24d90 43 75 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20  Cur is pointing 
24da0 74 6f 20 61 20 76 61 6c 69 64 20 72 6f 77 0a 2a  to a valid row.*
24db0 2a 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a  * in the table..
24dc0 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c  **.** Return SQL
24dd0 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73  ITE_OK on succes
24de0 73 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f  s or an error co
24df0 64 65 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67  de if anything g
24e00 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 20 20 41  oes.** wrong.  A
24e10 6e 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72  n error is retur
24e20 6e 65 64 20 69 66 20 22 6f 66 66 73 65 74 2b 61  ned if "offset+a
24e30 6d 74 22 20 69 73 20 6c 61 72 67 65 72 20 74 68  mt" is larger th
24e40 61 6e 0a 2a 2a 20 74 68 65 20 61 76 61 69 6c 61  an.** the availa
24e50 62 6c 65 20 70 61 79 6c 6f 61 64 2e 0a 2a 2f 0a  ble payload..*/.
24e60 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
24e70 4b 65 79 28 42 74 43 75 72 73 6f 72 20 2a 70 43  Key(BtCursor *pC
24e80 75 72 2c 20 75 33 32 20 6f 66 66 73 65 74 2c 20  ur, u32 offset, 
24e90 75 33 32 20 61 6d 74 2c 20 76 6f 69 64 20 2a 70  u32 amt, void *p
24ea0 42 75 66 29 7b 0a 20 20 61 73 73 65 72 74 28 20  Buf){.  assert( 
24eb0 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
24ec0 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
24ed0 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
24ee0 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
24ef0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
24f00 2d 3e 69 50 61 67 65 3e 3d 30 20 26 26 20 70 43  ->iPage>=0 && pC
24f10 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
24f20 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20 61 73 73  >iPage] );.  ass
24f30 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78  ert( pCur->aiIdx
24f40 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 43  [pCur->iPage]<pC
24f50 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
24f60 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29  >iPage]->nCell )
24f70 3b 0a 20 20 72 65 74 75 72 6e 20 61 63 63 65 73  ;.  return acces
24f80 73 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 6f  sPayload(pCur, o
24f90 66 66 73 65 74 2c 20 61 6d 74 2c 20 28 75 6e 73  ffset, amt, (uns
24fa0 69 67 6e 65 64 20 63 68 61 72 2a 29 70 42 75 66  igned char*)pBuf
24fb0 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  , 0);.}../*.** R
24fc0 65 61 64 20 70 61 72 74 20 6f 66 20 74 68 65 20  ead part of the 
24fd0 64 61 74 61 20 61 73 73 6f 63 69 61 74 65 64 20  data associated 
24fe0 77 69 74 68 20 63 75 72 73 6f 72 20 70 43 75 72  with cursor pCur
24ff0 2e 20 20 45 78 61 63 74 6c 79 0a 2a 2a 20 22 61  .  Exactly.** "a
25000 6d 74 22 20 62 79 74 65 73 20 77 69 6c 6c 20 62  mt" bytes will b
25010 65 20 74 72 61 6e 73 66 65 72 65 64 20 69 6e 74  e transfered int
25020 6f 20 70 42 75 66 5b 5d 2e 20 20 54 68 65 20 74  o pBuf[].  The t
25030 72 61 6e 73 66 65 72 0a 2a 2a 20 62 65 67 69 6e  ransfer.** begin
25040 73 20 61 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a  s at "offset"..*
25050 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49  *.** Return SQLI
25060 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73  TE_OK on success
25070 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64   or an error cod
25080 65 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f  e if anything go
25090 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 20 20 41 6e  es.** wrong.  An
250a0 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e   error is return
250b0 65 64 20 69 66 20 22 6f 66 66 73 65 74 2b 61 6d  ed if "offset+am
250c0 74 22 20 69 73 20 6c 61 72 67 65 72 20 74 68 61  t" is larger tha
250d0 6e 0a 2a 2a 20 74 68 65 20 61 76 61 69 6c 61 62  n.** the availab
250e0 6c 65 20 70 61 79 6c 6f 61 64 2e 0a 2a 2f 0a 69  le payload..*/.i
250f0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 44  nt sqlite3BtreeD
25100 61 74 61 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ata(BtCursor *pC
25110 75 72 2c 20 75 33 32 20 6f 66 66 73 65 74 2c 20  ur, u32 offset, 
25120 75 33 32 20 61 6d 74 2c 20 76 6f 69 64 20 2a 70  u32 amt, void *p
25130 42 75 66 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  Buf){.  int rc;.
25140 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
25150 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20  OMIT_INCRBLOB.  
25160 69 66 20 28 20 70 43 75 72 2d 3e 65 53 74 61 74  if ( pCur->eStat
25170 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  e==CURSOR_INVALI
25180 44 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  D ){.    return 
25190 53 51 4c 49 54 45 5f 41 42 4f 52 54 3b 0a 20 20  SQLITE_ABORT;.  
251a0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65  }.#endif..  asse
251b0 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
251c0 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
251d0 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73  rc = restoreCurs
251e0 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29  orPosition(pCur)
251f0 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
25200 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73  TE_OK ){.    ass
25210 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
25220 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
25230 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
25240 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 26 26  Cur->iPage>=0 &&
25250 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
25260 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20  ur->iPage] );.  
25270 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
25280 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
25290 65 5d 3c 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  e]<pCur->apPage[
252a0 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43  pCur->iPage]->nC
252b0 65 6c 6c 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  ell );.    rc = 
252c0 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 70 43  accessPayload(pC
252d0 75 72 2c 20 6f 66 66 73 65 74 2c 20 61 6d 74 2c  ur, offset, amt,
252e0 20 70 42 75 66 2c 20 30 29 3b 0a 20 20 7d 0a 20   pBuf, 0);.  }. 
252f0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
25300 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f  *.** Return a po
25310 69 6e 74 65 72 20 74 6f 20 70 61 79 6c 6f 61 64  inter to payload
25320 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f   information fro
25330 6d 20 74 68 65 20 65 6e 74 72 79 20 74 68 61 74  m the entry that
25340 20 74 68 65 20 0a 2a 2a 20 70 43 75 72 20 63 75   the .** pCur cu
25350 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e 67  rsor is pointing
25360 20 74 6f 2e 20 20 54 68 65 20 70 6f 69 6e 74 65   to.  The pointe
25370 72 20 69 73 20 74 6f 20 74 68 65 20 62 65 67 69  r is to the begi
25380 6e 6e 69 6e 67 20 6f 66 0a 2a 2a 20 74 68 65 20  nning of.** the 
25390 6b 65 79 20 69 66 20 69 6e 64 65 78 20 62 74 72  key if index btr
253a0 65 65 73 20 28 70 50 61 67 65 2d 3e 69 6e 74 4b  ees (pPage->intK
253b0 65 79 3d 3d 30 29 20 61 6e 64 20 69 73 20 74 68  ey==0) and is th
253c0 65 20 64 61 74 61 20 66 6f 72 0a 2a 2a 20 74 61  e data for.** ta
253d0 62 6c 65 20 62 74 72 65 65 73 20 28 70 50 61 67  ble btrees (pPag
253e0 65 2d 3e 69 6e 74 4b 65 79 3d 3d 31 29 2e 20 54  e->intKey==1). T
253f0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
25400 65 73 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 0a  es of available.
25410 2a 2a 20 6b 65 79 2f 64 61 74 61 20 69 73 20 77  ** key/data is w
25420 72 69 74 74 65 6e 20 69 6e 74 6f 20 2a 70 41 6d  ritten into *pAm
25430 74 2e 20 20 49 66 20 2a 70 41 6d 74 3d 3d 30 2c  t.  If *pAmt==0,
25440 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65 0a   then the value.
25450 2a 2a 20 72 65 74 75 72 6e 65 64 20 77 69 6c 6c  ** returned will
25460 20 6e 6f 74 20 62 65 20 61 20 76 61 6c 69 64 20   not be a valid 
25470 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54  pointer..**.** T
25480 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
25490 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20  n optimization. 
254a0 20 49 74 20 69 73 20 63 6f 6d 6d 6f 6e 20 66 6f   It is common fo
254b0 72 20 74 68 65 20 65 6e 74 69 72 65 20 6b 65 79  r the entire key
254c0 0a 2a 2a 20 61 6e 64 20 64 61 74 61 20 74 6f 20  .** and data to 
254d0 66 69 74 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c  fit on the local
254e0 20 70 61 67 65 20 61 6e 64 20 66 6f 72 20 74 68   page and for th
254f0 65 72 65 20 74 6f 20 62 65 20 6e 6f 20 6f 76 65  ere to be no ove
25500 72 66 6c 6f 77 0a 2a 2a 20 70 61 67 65 73 2e 20  rflow.** pages. 
25510 20 57 68 65 6e 20 74 68 61 74 20 69 73 20 73 6f   When that is so
25520 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63  , this routine c
25530 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 61 63  an be used to ac
25540 63 65 73 73 20 74 68 65 0a 2a 2a 20 6b 65 79 20  cess the.** key 
25550 61 6e 64 20 64 61 74 61 20 77 69 74 68 6f 75 74  and data without
25560 20 6d 61 6b 69 6e 67 20 61 20 63 6f 70 79 2e 20   making a copy. 
25570 20 49 66 20 74 68 65 20 6b 65 79 20 61 6e 64 2f   If the key and/
25580 6f 72 20 64 61 74 61 20 73 70 69 6c 6c 73 0a 2a  or data spills.*
25590 2a 20 6f 6e 74 6f 20 6f 76 65 72 66 6c 6f 77 20  * onto overflow 
255a0 70 61 67 65 73 2c 20 74 68 65 6e 20 61 63 63 65  pages, then acce
255b0 73 73 50 61 79 6c 6f 61 64 28 29 20 6d 75 73 74  ssPayload() must
255c0 20 62 65 20 75 73 65 64 20 74 6f 20 72 65 61 73   be used to reas
255d0 73 65 6d 62 6c 65 0a 2a 2a 20 74 68 65 20 6b 65  semble.** the ke
255e0 79 2f 64 61 74 61 20 61 6e 64 20 63 6f 70 79 20  y/data and copy 
255f0 69 74 20 69 6e 74 6f 20 61 20 70 72 65 61 6c 6c  it into a preall
25600 6f 63 61 74 65 64 20 62 75 66 66 65 72 2e 0a 2a  ocated buffer..*
25610 2a 0a 2a 2a 20 54 68 65 20 70 6f 69 6e 74 65 72  *.** The pointer
25620 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 69   returned by thi
25630 73 20 72 6f 75 74 69 6e 65 20 6c 6f 6f 6b 73 20  s routine looks 
25640 64 69 72 65 63 74 6c 79 20 69 6e 74 6f 20 74 68  directly into th
25650 65 20 63 61 63 68 65 64 0a 2a 2a 20 70 61 67 65  e cached.** page
25660 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
25670 2e 20 20 54 68 65 20 64 61 74 61 20 6d 69 67 68  .  The data migh
25680 74 20 63 68 61 6e 67 65 20 6f 72 20 6d 6f 76 65  t change or move
25690 20 74 68 65 20 6e 65 78 74 20 74 69 6d 65 0a 2a   the next time.*
256a0 2a 20 61 6e 79 20 62 74 72 65 65 20 72 6f 75 74  * any btree rout
256b0 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  ine is called..*
256c0 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 76  /.static const v
256d0 6f 69 64 20 2a 66 65 74 63 68 50 61 79 6c 6f 61  oid *fetchPayloa
256e0 64 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  d(.  BtCursor *p
256f0 43 75 72 2c 20 20 20 20 20 20 2f 2a 20 43 75 72  Cur,      /* Cur
25700 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  sor pointing to 
25710 65 6e 74 72 79 20 74 6f 20 72 65 61 64 20 66 72  entry to read fr
25720 6f 6d 20 2a 2f 0a 20 20 75 33 32 20 2a 70 41 6d  om */.  u32 *pAm
25730 74 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t            /* 
25740 57 72 69 74 65 20 74 68 65 20 6e 75 6d 62 65 72  Write the number
25750 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 62 79   of available by
25760 74 65 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  tes here */.){. 
25770 20 75 33 32 20 61 6d 74 3b 0a 20 20 61 73 73 65   u32 amt;.  asse
25780 72 74 28 20 70 43 75 72 21 3d 30 20 26 26 20 70  rt( pCur!=0 && p
25790 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 26 26  Cur->iPage>=0 &&
257a0 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
257b0 75 72 2d 3e 69 50 61 67 65 5d 29 3b 0a 20 20 61  ur->iPage]);.  a
257c0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
257d0 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
257e0 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  D );.  assert( s
257f0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
25800 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e  d(pCur->pBtree->
25810 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
25820 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
25830 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
25840 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
25850 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
25860 61 67 65 5d 3c 70 43 75 72 2d 3e 61 70 50 61 67  age]<pCur->apPag
25870 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e  e[pCur->iPage]->
25880 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72  nCell );.  asser
25890 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53  t( pCur->info.nS
258a0 69 7a 65 3e 30 20 29 3b 0a 20 20 61 73 73 65 72  ize>0 );.  asser
258b0 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 50  t( pCur->info.pP
258c0 61 79 6c 6f 61 64 3e 70 43 75 72 2d 3e 61 70 50  ayload>pCur->apP
258d0 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
258e0 2d 3e 61 44 61 74 61 20 7c 7c 20 43 4f 52 52 55  ->aData || CORRU
258f0 50 54 5f 44 42 20 29 3b 0a 20 20 61 73 73 65 72  PT_DB );.  asser
25900 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 50  t( pCur->info.pP
25910 61 79 6c 6f 61 64 3c 70 43 75 72 2d 3e 61 70 50  ayload<pCur->apP
25920 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
25930 2d 3e 61 44 61 74 61 45 6e 64 20 7c 7c 43 4f 52  ->aDataEnd ||COR
25940 52 55 50 54 5f 44 42 29 3b 0a 20 20 61 6d 74 20  RUPT_DB);.  amt 
25950 3d 20 28 69 6e 74 29 28 70 43 75 72 2d 3e 61 70  = (int)(pCur->ap
25960 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
25970 5d 2d 3e 61 44 61 74 61 45 6e 64 20 2d 20 70 43  ]->aDataEnd - pC
25980 75 72 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f 61  ur->info.pPayloa
25990 64 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e  d);.  if( pCur->
259a0 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3c 61 6d 74 20  info.nLocal<amt 
259b0 29 20 61 6d 74 20 3d 20 70 43 75 72 2d 3e 69 6e  ) amt = pCur->in
259c0 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 2a 70 41  fo.nLocal;.  *pA
259d0 6d 74 20 3d 20 61 6d 74 3b 0a 20 20 72 65 74 75  mt = amt;.  retu
259e0 72 6e 20 28 76 6f 69 64 2a 29 70 43 75 72 2d 3e  rn (void*)pCur->
259f0 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64 3b 0a 7d  info.pPayload;.}
25a00 0a 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 74 68 65  .../*.** For the
25a10 20 65 6e 74 72 79 20 74 68 61 74 20 63 75 72 73   entry that curs
25a20 6f 72 20 70 43 75 72 20 69 73 20 70 6f 69 6e 74  or pCur is point
25a30 20 74 6f 2c 20 72 65 74 75 72 6e 20 61 73 0a 2a   to, return as.*
25a40 2a 20 6d 61 6e 79 20 62 79 74 65 73 20 6f 66 20  * many bytes of 
25a50 74 68 65 20 6b 65 79 20 6f 72 20 64 61 74 61 20  the key or data 
25a60 61 73 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65  as are available
25a70 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 0a 2a 2a   on the local.**
25a80 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20 20 57   b-tree page.  W
25a90 72 69 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20  rite the number 
25aa0 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 62 79 74  of available byt
25ab0 65 73 20 69 6e 74 6f 20 2a 70 41 6d 74 2e 0a 2a  es into *pAmt..*
25ac0 2a 0a 2a 2a 20 54 68 65 20 70 6f 69 6e 74 65 72  *.** The pointer
25ad0 20 72 65 74 75 72 6e 65 64 20 69 73 20 65 70 68   returned is eph
25ae0 65 6d 65 72 61 6c 2e 20 20 54 68 65 20 6b 65 79  emeral.  The key
25af0 2f 64 61 74 61 20 6d 61 79 20 6d 6f 76 65 0a 2a  /data may move.*
25b00 2a 20 6f 72 20 62 65 20 64 65 73 74 72 6f 79 65  * or be destroye
25b10 64 20 6f 6e 20 74 68 65 20 6e 65 78 74 20 63 61  d on the next ca
25b20 6c 6c 20 74 6f 20 61 6e 79 20 42 74 72 65 65 20  ll to any Btree 
25b30 72 6f 75 74 69 6e 65 2c 0a 2a 2a 20 69 6e 63 6c  routine,.** incl
25b40 75 64 69 6e 67 20 63 61 6c 6c 73 20 66 72 6f 6d  uding calls from
25b50 20 6f 74 68 65 72 20 74 68 72 65 61 64 73 20 61   other threads a
25b60 67 61 69 6e 73 74 20 74 68 65 20 73 61 6d 65 20  gainst the same 
25b70 63 61 63 68 65 2e 0a 2a 2a 20 48 65 6e 63 65 2c  cache..** Hence,
25b80 20 61 20 6d 75 74 65 78 20 6f 6e 20 74 68 65 20   a mutex on the 
25b90 42 74 53 68 61 72 65 64 20 73 68 6f 75 6c 64 20  BtShared should 
25ba0 62 65 20 68 65 6c 64 20 70 72 69 6f 72 20 74 6f  be held prior to
25bb0 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 74 68 69 73   calling.** this
25bc0 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20   routine..**.** 
25bd0 54 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20 69  These routines i
25be0 73 20 75 73 65 64 20 74 6f 20 67 65 74 20 71 75  s used to get qu
25bf0 69 63 6b 20 61 63 63 65 73 73 20 74 6f 20 6b 65  ick access to ke
25c00 79 20 61 6e 64 20 64 61 74 61 0a 2a 2a 20 69 6e  y and data.** in
25c10 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65   the common case
25c20 20 77 68 65 72 65 20 6e 6f 20 6f 76 65 72 66 6c   where no overfl
25c30 6f 77 20 70 61 67 65 73 20 61 72 65 20 75 73 65  ow pages are use
25c40 64 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 76 6f 69 64  d..*/.const void
25c50 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65   *sqlite3BtreeKe
25c60 79 46 65 74 63 68 28 42 74 43 75 72 73 6f 72 20  yFetch(BtCursor 
25c70 2a 70 43 75 72 2c 20 75 33 32 20 2a 70 41 6d 74  *pCur, u32 *pAmt
25c80 29 7b 0a 20 20 72 65 74 75 72 6e 20 66 65 74 63  ){.  return fetc
25c90 68 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 70  hPayload(pCur, p
25ca0 41 6d 74 29 3b 0a 7d 0a 63 6f 6e 73 74 20 76 6f  Amt);.}.const vo
25cb0 69 64 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65  id *sqlite3Btree
25cc0 44 61 74 61 46 65 74 63 68 28 42 74 43 75 72 73  DataFetch(BtCurs
25cd0 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20 2a 70  or *pCur, u32 *p
25ce0 41 6d 74 29 7b 0a 20 20 72 65 74 75 72 6e 20 66  Amt){.  return f
25cf0 65 74 63 68 50 61 79 6c 6f 61 64 28 70 43 75 72  etchPayload(pCur
25d00 2c 20 70 41 6d 74 29 3b 0a 7d 0a 0a 0a 2f 2a 0a  , pAmt);.}.../*.
25d10 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73  ** Move the curs
25d20 6f 72 20 64 6f 77 6e 20 74 6f 20 61 20 6e 65 77  or down to a new
25d30 20 63 68 69 6c 64 20 70 61 67 65 2e 20 20 54 68   child page.  Th
25d40 65 20 6e 65 77 50 67 6e 6f 20 61 72 67 75 6d 65  e newPgno argume
25d50 6e 74 20 69 73 20 74 68 65 0a 2a 2a 20 70 61 67  nt is the.** pag
25d60 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  e number of the 
25d70 63 68 69 6c 64 20 70 61 67 65 20 74 6f 20 6d 6f  child page to mo
25d80 76 65 20 74 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ve to..**.** Thi
25d90 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
25da0 6e 73 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  ns SQLITE_CORRUP
25db0 54 20 69 66 20 74 68 65 20 70 61 67 65 2d 68 65  T if the page-he
25dc0 61 64 65 72 20 66 6c 61 67 73 20 66 69 65 6c 64  ader flags field
25dd0 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20 63   of.** the new c
25de0 68 69 6c 64 20 70 61 67 65 20 64 6f 65 73 20 6e  hild page does n
25df0 6f 74 20 6d 61 74 63 68 20 74 68 65 20 66 6c 61  ot match the fla
25e00 67 73 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20  gs field of the 
25e10 70 61 72 65 6e 74 20 28 69 2e 65 2e 0a 2a 2a 20  parent (i.e..** 
25e20 69 66 20 61 6e 20 69 6e 74 6b 65 79 20 70 61 67  if an intkey pag
25e30 65 20 61 70 70 65 61 72 73 20 74 6f 20 62 65 20  e appears to be 
25e40 74 68 65 20 70 61 72 65 6e 74 20 6f 66 20 61 20  the parent of a 
25e50 6e 6f 6e 2d 69 6e 74 6b 65 79 20 70 61 67 65 2c  non-intkey page,
25e60 20 6f 72 0a 2a 2a 20 76 69 63 65 2d 76 65 72 73   or.** vice-vers
25e70 61 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  a)..*/.static in
25e80 74 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 42 74  t moveToChild(Bt
25e90 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33  Cursor *pCur, u3
25ea0 32 20 6e 65 77 50 67 6e 6f 29 7b 0a 20 20 69 6e  2 newPgno){.  in
25eb0 74 20 72 63 3b 0a 20 20 69 6e 74 20 69 20 3d 20  t rc;.  int i = 
25ec0 70 43 75 72 2d 3e 69 50 61 67 65 3b 0a 20 20 4d  pCur->iPage;.  M
25ed0 65 6d 50 61 67 65 20 2a 70 4e 65 77 50 61 67 65  emPage *pNewPage
25ee0 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
25ef0 74 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b 0a 0a  t = pCur->pBt;..
25f00 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
25f10 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
25f20 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
25f30 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
25f40 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73  OR_VALID );.  as
25f50 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67  sert( pCur->iPag
25f60 65 3c 42 54 43 55 52 53 4f 52 5f 4d 41 58 5f 44  e<BTCURSOR_MAX_D
25f70 45 50 54 48 20 29 3b 0a 20 20 61 73 73 65 72 74  EPTH );.  assert
25f80 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30  ( pCur->iPage>=0
25f90 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e   );.  if( pCur->
25fa0 69 50 61 67 65 3e 3d 28 42 54 43 55 52 53 4f 52  iPage>=(BTCURSOR
25fb0 5f 4d 41 58 5f 44 45 50 54 48 2d 31 29 20 29 7b  _MAX_DEPTH-1) ){
25fc0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
25fd0 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
25fe0 0a 20 20 7d 0a 20 20 72 63 20 3d 20 67 65 74 41  .  }.  rc = getA
25ff0 6e 64 49 6e 69 74 50 61 67 65 28 70 42 74 2c 20  ndInitPage(pBt, 
26000 6e 65 77 50 67 6e 6f 2c 20 26 70 4e 65 77 50 61  newPgno, &pNewPa
26010 67 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ge,.            
26020 20 20 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61     (pCur->curFla
26030 67 73 20 26 20 42 54 43 46 5f 57 72 69 74 65 46  gs & BTCF_WriteF
26040 6c 61 67 29 3d 3d 30 20 3f 20 50 41 47 45 52 5f  lag)==0 ? PAGER_
26050 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 30  GET_READONLY : 0
26060 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65  );.  if( rc ) re
26070 74 75 72 6e 20 72 63 3b 0a 20 20 70 43 75 72 2d  turn rc;.  pCur-
26080 3e 61 70 50 61 67 65 5b 69 2b 31 5d 20 3d 20 70  >apPage[i+1] = p
26090 4e 65 77 50 61 67 65 3b 0a 20 20 70 43 75 72 2d  NewPage;.  pCur-
260a0 3e 61 69 49 64 78 5b 69 2b 31 5d 20 3d 20 30 3b  >aiIdx[i+1] = 0;
260b0 0a 20 20 70 43 75 72 2d 3e 69 50 61 67 65 2b 2b  .  pCur->iPage++
260c0 3b 0a 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  ;..  pCur->info.
260d0 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75  nSize = 0;.  pCu
260e0 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e  r->curFlags &= ~
260f0 28 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c  (BTCF_ValidNKey|
26100 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3b  BTCF_ValidOvfl);
26110 0a 20 20 69 66 28 20 70 4e 65 77 50 61 67 65 2d  .  if( pNewPage-
26120 3e 6e 43 65 6c 6c 3c 31 20 7c 7c 20 70 4e 65 77  >nCell<1 || pNew
26130 50 61 67 65 2d 3e 69 6e 74 4b 65 79 21 3d 70 43  Page->intKey!=pC
26140 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d 2d 3e 69  ur->apPage[i]->i
26150 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 72 65 74  ntKey ){.    ret
26160 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
26170 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72  PT_BKPT;.  }.  r
26180 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
26190 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 44  .}..#if SQLITE_D
261a0 45 42 55 47 0a 2f 2a 0a 2a 2a 20 50 61 67 65 20  EBUG./*.** Page 
261b0 70 50 61 72 65 6e 74 20 69 73 20 61 6e 20 69 6e  pParent is an in
261c0 74 65 72 6e 61 6c 20 28 6e 6f 6e 2d 6c 65 61 66  ternal (non-leaf
261d0 29 20 74 72 65 65 20 70 61 67 65 2e 20 54 68 69  ) tree page. Thi
261e0 73 20 66 75 6e 63 74 69 6f 6e 20 0a 2a 2a 20 61  s function .** a
261f0 73 73 65 72 74 73 20 74 68 61 74 20 70 61 67 65  sserts that page
26200 20 6e 75 6d 62 65 72 20 69 43 68 69 6c 64 20 69   number iChild i
26210 73 20 74 68 65 20 6c 65 66 74 2d 63 68 69 6c 64  s the left-child
26220 20 69 66 20 74 68 65 20 69 49 64 78 27 74 68 0a   if the iIdx'th.
26230 2a 2a 20 63 65 6c 6c 20 69 6e 20 70 61 67 65 20  ** cell in page 
26240 70 50 61 72 65 6e 74 2e 20 4f 72 2c 20 69 66 20  pParent. Or, if 
26250 69 49 64 78 20 69 73 20 65 71 75 61 6c 20 74 6f  iIdx is equal to
26260 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65   the total numbe
26270 72 20 6f 66 0a 2a 2a 20 63 65 6c 6c 73 20 69 6e  r of.** cells in
26280 20 70 50 61 72 65 6e 74 2c 20 74 68 61 74 20 70   pParent, that p
26290 61 67 65 20 6e 75 6d 62 65 72 20 69 43 68 69 6c  age number iChil
262a0 64 20 69 73 20 74 68 65 20 72 69 67 68 74 2d 63  d is the right-c
262b0 68 69 6c 64 20 6f 66 0a 2a 2a 20 74 68 65 20 70  hild of.** the p
262c0 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  age..*/.static v
262d0 6f 69 64 20 61 73 73 65 72 74 50 61 72 65 6e 74  oid assertParent
262e0 49 6e 64 65 78 28 4d 65 6d 50 61 67 65 20 2a 70  Index(MemPage *p
262f0 50 61 72 65 6e 74 2c 20 69 6e 74 20 69 49 64 78  Parent, int iIdx
26300 2c 20 50 67 6e 6f 20 69 43 68 69 6c 64 29 7b 0a  , Pgno iChild){.
26310 20 20 69 66 28 20 43 4f 52 52 55 50 54 5f 44 42    if( CORRUPT_DB
26320 20 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20 54   ) return;  /* T
26330 68 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20 74 65  he conditions te
26340 73 74 65 64 20 62 65 6c 6f 77 20 6d 69 67 68 74  sted below might
26350 20 6e 6f 74 20 62 65 20 74 72 75 65 0a 20 20 20   not be true.   
26360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26370 20 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 20 61           ** in a
26380 20 63 6f 72 72 75 70 74 20 64 61 74 61 62 61 73   corrupt databas
26390 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69  e */.  assert( i
263a0 49 64 78 3c 3d 70 50 61 72 65 6e 74 2d 3e 6e 43  Idx<=pParent->nC
263b0 65 6c 6c 20 29 3b 0a 20 20 69 66 28 20 69 49 64  ell );.  if( iId
263c0 78 3d 3d 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c  x==pParent->nCel
263d0 6c 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  l ){.    assert(
263e0 20 67 65 74 34 62 79 74 65 28 26 70 50 61 72 65   get4byte(&pPare
263f0 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61 72 65 6e  nt->aData[pParen
26400 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29  t->hdrOffset+8])
26410 3d 3d 69 43 68 69 6c 64 20 29 3b 0a 20 20 7d 65  ==iChild );.  }e
26420 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
26430 20 67 65 74 34 62 79 74 65 28 66 69 6e 64 43 65   get4byte(findCe
26440 6c 6c 28 70 50 61 72 65 6e 74 2c 20 69 49 64 78  ll(pParent, iIdx
26450 29 29 3d 3d 69 43 68 69 6c 64 20 29 3b 0a 20 20  ))==iChild );.  
26460 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 20 64 65 66  }.}.#else.#  def
26470 69 6e 65 20 61 73 73 65 72 74 50 61 72 65 6e 74  ine assertParent
26480 49 6e 64 65 78 28 78 2c 79 2c 7a 29 20 0a 23 65  Index(x,y,z) .#e
26490 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65  ndif../*.** Move
264a0 20 74 68 65 20 63 75 72 73 6f 72 20 75 70 20 74   the cursor up t
264b0 6f 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67  o the parent pag
264c0 65 2e 0a 2a 2a 0a 2a 2a 20 70 43 75 72 2d 3e 69  e..**.** pCur->i
264d0 64 78 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  dx is set to the
264e0 20 63 65 6c 6c 20 69 6e 64 65 78 20 74 68 61 74   cell index that
264f0 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 70 6f   contains the po
26500 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20  inter.** to the 
26510 70 61 67 65 20 77 65 20 61 72 65 20 63 6f 6d 69  page we are comi
26520 6e 67 20 66 72 6f 6d 2e 20 20 49 66 20 77 65 20  ng from.  If we 
26530 61 72 65 20 63 6f 6d 69 6e 67 20 66 72 6f 6d 20  are coming from 
26540 74 68 65 0a 2a 2a 20 72 69 67 68 74 2d 6d 6f 73  the.** right-mos
26550 74 20 63 68 69 6c 64 20 70 61 67 65 20 74 68 65  t child page the
26560 6e 20 70 43 75 72 2d 3e 69 64 78 20 69 73 20 73  n pCur->idx is s
26570 65 74 20 74 6f 20 6f 6e 65 20 6d 6f 72 65 20 74  et to one more t
26580 68 61 6e 0a 2a 2a 20 74 68 65 20 6c 61 72 67 65  han.** the large
26590 73 74 20 63 65 6c 6c 20 69 6e 64 65 78 2e 0a 2a  st cell index..*
265a0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d 6f  /.static void mo
265b0 76 65 54 6f 50 61 72 65 6e 74 28 42 74 43 75 72  veToParent(BtCur
265c0 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73  sor *pCur){.  as
265d0 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
265e0 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
265f0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
26600 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
26610 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74  ALID );.  assert
26620 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 30 20  ( pCur->iPage>0 
26630 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
26640 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
26650 69 50 61 67 65 5d 20 29 3b 0a 20 20 61 73 73 65  iPage] );.  asse
26660 72 74 50 61 72 65 6e 74 49 6e 64 65 78 28 0a 20  rtParentIndex(. 
26670 20 20 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b     pCur->apPage[
26680 70 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d 2c 20  pCur->iPage-1], 
26690 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78  .    pCur->aiIdx
266a0 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d 2c  [pCur->iPage-1],
266b0 20 0a 20 20 20 20 70 43 75 72 2d 3e 61 70 50 61   .    pCur->apPa
266c0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
266d0 3e 70 67 6e 6f 0a 20 20 29 3b 0a 20 20 74 65 73  >pgno.  );.  tes
266e0 74 63 61 73 65 28 20 70 43 75 72 2d 3e 61 69 49  tcase( pCur->aiI
266f0 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 31  dx[pCur->iPage-1
26700 5d 20 3e 20 70 43 75 72 2d 3e 61 70 50 61 67 65  ] > pCur->apPage
26710 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d 2d  [pCur->iPage-1]-
26720 3e 6e 43 65 6c 6c 20 29 3b 0a 0a 20 20 72 65 6c  >nCell );..  rel
26730 65 61 73 65 50 61 67 65 28 70 43 75 72 2d 3e 61  easePage(pCur->a
26740 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
26750 65 5d 29 3b 0a 20 20 70 43 75 72 2d 3e 69 50 61  e]);.  pCur->iPa
26760 67 65 2d 2d 3b 0a 20 20 70 43 75 72 2d 3e 69 6e  ge--;.  pCur->in
26770 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20  fo.nSize = 0;.  
26780 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26  pCur->curFlags &
26790 3d 20 7e 28 42 54 43 46 5f 56 61 6c 69 64 4e 4b  = ~(BTCF_ValidNK
267a0 65 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66  ey|BTCF_ValidOvf
267b0 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76  l);.}../*.** Mov
267c0 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20  e the cursor to 
267d0 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 72 6f 6f  point to the roo
267e0 74 20 70 61 67 65 20 6f 66 20 69 74 73 20 62 2d  t page of its b-
267f0 74 72 65 65 20 73 74 72 75 63 74 75 72 65 2e 0a  tree structure..
26800 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 74 61 62  **.** If the tab
26810 6c 65 20 68 61 73 20 61 20 76 69 72 74 75 61 6c  le has a virtual
26820 20 72 6f 6f 74 20 70 61 67 65 2c 20 74 68 65 6e   root page, then
26830 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6d   the cursor is m
26840 6f 76 65 64 20 74 6f 20 70 6f 69 6e 74 0a 2a 2a  oved to point.**
26850 20 74 6f 20 74 68 65 20 76 69 72 74 75 61 6c 20   to the virtual 
26860 72 6f 6f 74 20 70 61 67 65 20 69 6e 73 74 65 61  root page instea
26870 64 20 6f 66 20 74 68 65 20 61 63 74 75 61 6c 20  d of the actual 
26880 72 6f 6f 74 20 70 61 67 65 2e 20 41 20 74 61 62  root page. A tab
26890 6c 65 20 68 61 73 20 61 0a 2a 2a 20 76 69 72 74  le has a.** virt
268a0 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 20 77 68  ual root page wh
268b0 65 6e 20 74 68 65 20 61 63 74 75 61 6c 20 72 6f  en the actual ro
268c0 6f 74 20 70 61 67 65 20 63 6f 6e 74 61 69 6e 73  ot page contains
268d0 20 6e 6f 20 63 65 6c 6c 73 20 61 6e 64 20 61 20   no cells and a 
268e0 0a 2a 2a 20 73 69 6e 67 6c 65 20 63 68 69 6c 64  .** single child
268f0 20 70 61 67 65 2e 20 54 68 69 73 20 63 61 6e 20   page. This can 
26900 6f 6e 6c 79 20 68 61 70 70 65 6e 20 77 69 74 68  only happen with
26910 20 74 68 65 20 74 61 62 6c 65 20 72 6f 6f 74 65   the table roote
26920 64 20 61 74 20 70 61 67 65 20 31 2e 0a 2a 2a 0a  d at page 1..**.
26930 2a 2a 20 49 66 20 74 68 65 20 62 2d 74 72 65 65  ** If the b-tree
26940 20 73 74 72 75 63 74 75 72 65 20 69 73 20 65 6d   structure is em
26950 70 74 79 2c 20 74 68 65 20 63 75 72 73 6f 72 20  pty, the cursor 
26960 73 74 61 74 65 20 69 73 20 73 65 74 20 74 6f 20  state is set to 
26970 0a 2a 2a 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  .** CURSOR_INVAL
26980 49 44 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 74  ID. Otherwise, t
26990 68 65 20 63 75 72 73 6f 72 20 69 73 20 73 65 74  he cursor is set
269a0 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65   to point to the
269b0 20 66 69 72 73 74 0a 2a 2a 20 63 65 6c 6c 20 6c   first.** cell l
269c0 6f 63 61 74 65 64 20 6f 6e 20 74 68 65 20 72 6f  ocated on the ro
269d0 6f 74 20 28 6f 72 20 76 69 72 74 75 61 6c 20 72  ot (or virtual r
269e0 6f 6f 74 29 20 70 61 67 65 20 61 6e 64 20 74 68  oot) page and th
269f0 65 20 63 75 72 73 6f 72 20 73 74 61 74 65 0a 2a  e cursor state.*
26a00 2a 20 69 73 20 73 65 74 20 74 6f 20 43 55 52 53  * is set to CURS
26a10 4f 52 5f 56 41 4c 49 44 2e 0a 2a 2a 0a 2a 2a 20  OR_VALID..**.** 
26a20 49 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  If this function
26a30 20 72 65 74 75 72 6e 73 20 73 75 63 63 65 73 73   returns success
26a40 66 75 6c 6c 79 2c 20 69 74 20 6d 61 79 20 62 65  fully, it may be
26a50 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68   assumed that th
26a60 65 0a 2a 2a 20 70 61 67 65 2d 68 65 61 64 65 72  e.** page-header
26a70 20 66 6c 61 67 73 20 69 6e 64 69 63 61 74 65 20   flags indicate 
26a80 74 68 61 74 20 74 68 65 20 5b 76 69 72 74 75 61  that the [virtua
26a90 6c 5d 20 72 6f 6f 74 2d 70 61 67 65 20 69 73 20  l] root-page is 
26aa0 74 68 65 20 65 78 70 65 63 74 65 64 20 0a 2a 2a  the expected .**
26ab0 20 6b 69 6e 64 20 6f 66 20 62 2d 74 72 65 65 20   kind of b-tree 
26ac0 70 61 67 65 20 28 69 2e 65 2e 20 69 66 20 77 68  page (i.e. if wh
26ad0 65 6e 20 6f 70 65 6e 69 6e 67 20 74 68 65 20 63  en opening the c
26ae0 75 72 73 6f 72 20 74 68 65 20 63 61 6c 6c 65 72  ursor the caller
26af0 20 64 69 64 20 6e 6f 74 0a 2a 2a 20 73 70 65 63   did not.** spec
26b00 69 66 79 20 61 20 4b 65 79 49 6e 66 6f 20 73 74  ify a KeyInfo st
26b10 72 75 63 74 75 72 65 20 74 68 65 20 66 6c 61 67  ructure the flag
26b20 73 20 62 79 74 65 20 69 73 20 73 65 74 20 74 6f  s byte is set to
26b30 20 30 78 30 35 20 6f 72 20 30 78 30 44 2c 0a 2a   0x05 or 0x0D,.*
26b40 2a 20 69 6e 64 69 63 61 74 69 6e 67 20 61 20 74  * indicating a t
26b50 61 62 6c 65 20 62 2d 74 72 65 65 2c 20 6f 72 20  able b-tree, or 
26b60 69 66 20 74 68 65 20 63 61 6c 6c 65 72 20 64 69  if the caller di
26b70 64 20 73 70 65 63 69 66 79 20 61 20 4b 65 79 49  d specify a KeyI
26b80 6e 66 6f 20 0a 2a 2a 20 73 74 72 75 63 74 75 72  nfo .** structur
26b90 65 20 74 68 65 20 66 6c 61 67 73 20 62 79 74 65  e the flags byte
26ba0 20 69 73 20 73 65 74 20 74 6f 20 30 78 30 32 20   is set to 0x02 
26bb0 6f 72 20 30 78 30 41 2c 20 69 6e 64 69 63 61 74  or 0x0A, indicat
26bc0 69 6e 67 20 61 6e 20 69 6e 64 65 78 0a 2a 2a 20  ing an index.** 
26bd0 62 2d 74 72 65 65 29 2e 0a 2a 2f 0a 73 74 61 74  b-tree)..*/.stat
26be0 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 52 6f 6f  ic int moveToRoo
26bf0 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  t(BtCursor *pCur
26c00 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 52  ){.  MemPage *pR
26c10 6f 6f 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  oot;.  int rc = 
26c20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73  SQLITE_OK;..  as
26c30 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
26c40 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
26c50 20 20 61 73 73 65 72 74 28 20 43 55 52 53 4f 52    assert( CURSOR
26c60 5f 49 4e 56 41 4c 49 44 20 3c 20 43 55 52 53 4f  _INVALID < CURSO
26c70 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b  R_REQUIRESEEK );
26c80 0a 20 20 61 73 73 65 72 74 28 20 43 55 52 53 4f  .  assert( CURSO
26c90 52 5f 56 41 4c 49 44 20 20 20 3c 20 43 55 52 53  R_VALID   < CURS
26ca0 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29  OR_REQUIRESEEK )
26cb0 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55 52 53  ;.  assert( CURS
26cc0 4f 52 5f 46 41 55 4c 54 20 20 20 3e 20 43 55 52  OR_FAULT   > CUR
26cd0 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20  SOR_REQUIRESEEK 
26ce0 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65  );.  if( pCur->e
26cf0 53 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45  State>=CURSOR_RE
26d00 51 55 49 52 45 53 45 45 4b 20 29 7b 0a 20 20 20  QUIRESEEK ){.   
26d10 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74   if( pCur->eStat
26d20 65 3d 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54 20  e==CURSOR_FAULT 
26d30 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
26d40 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 21   pCur->skipNext!
26d50 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
26d60 20 20 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d      return pCur-
26d70 3e 73 6b 69 70 4e 65 78 74 3b 0a 20 20 20 20 7d  >skipNext;.    }
26d80 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
26d90 65 43 6c 65 61 72 43 75 72 73 6f 72 28 70 43 75  eClearCursor(pCu
26da0 72 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  r);.  }..  if( p
26db0 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 29 7b  Cur->iPage>=0 ){
26dc0 0a 20 20 20 20 77 68 69 6c 65 28 20 70 43 75 72  .    while( pCur
26dd0 2d 3e 69 50 61 67 65 20 29 20 72 65 6c 65 61 73  ->iPage ) releas
26de0 65 50 61 67 65 28 70 43 75 72 2d 3e 61 70 50 61  ePage(pCur->apPa
26df0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 2d  ge[pCur->iPage--
26e00 5d 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  ]);.  }else if( 
26e10 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d  pCur->pgnoRoot==
26e20 30 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 65  0 ){.    pCur->e
26e30 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49  State = CURSOR_I
26e40 4e 56 41 4c 49 44 3b 0a 20 20 20 20 72 65 74 75  NVALID;.    retu
26e50 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
26e60 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20  }else{.    rc = 
26e70 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28 70  getAndInitPage(p
26e80 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 70 42 74  Cur->pBtree->pBt
26e90 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74  , pCur->pgnoRoot
26ea0 2c 20 26 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  , &pCur->apPage[
26eb0 30 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  0],.            
26ec0 20 20 20 20 20 28 70 43 75 72 2d 3e 63 75 72 46       (pCur->curF
26ed0 6c 61 67 73 20 26 20 42 54 43 46 5f 57 72 69 74  lags & BTCF_Writ
26ee0 65 46 6c 61 67 29 3d 3d 30 20 3f 20 50 41 47 45  eFlag)==0 ? PAGE
26ef0 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20 3a  R_GET_READONLY :
26f00 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21   0);.    if( rc!
26f10 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
26f20 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65      pCur->eState
26f30 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49   = CURSOR_INVALI
26f40 44 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  D;.      return 
26f50 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43  rc;.    }.    pC
26f60 75 72 2d 3e 69 50 61 67 65 20 3d 20 30 3b 0a 20  ur->iPage = 0;. 
26f70 20 7d 0a 20 20 70 52 6f 6f 74 20 3d 20 70 43 75   }.  pRoot = pCu
26f80 72 2d 3e 61 70 50 61 67 65 5b 30 5d 3b 0a 20 20  r->apPage[0];.  
26f90 61 73 73 65 72 74 28 20 70 52 6f 6f 74 2d 3e 70  assert( pRoot->p
26fa0 67 6e 6f 3d 3d 70 43 75 72 2d 3e 70 67 6e 6f 52  gno==pCur->pgnoR
26fb0 6f 6f 74 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  oot );..  /* If 
26fc0 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 20 69  pCur->pKeyInfo i
26fd0 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e  s not NULL, then
26fe0 20 74 68 65 20 63 61 6c 6c 65 72 20 74 68 61 74   the caller that
26ff0 20 6f 70 65 6e 65 64 20 74 68 69 73 20 63 75 72   opened this cur
27000 73 6f 72 0a 20 20 2a 2a 20 65 78 70 65 63 74 65  sor.  ** expecte
27010 64 20 74 6f 20 6f 70 65 6e 20 69 74 20 6f 6e 20  d to open it on 
27020 61 6e 20 69 6e 64 65 78 20 62 2d 74 72 65 65 2e  an index b-tree.
27030 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 70   Otherwise, if p
27040 4b 65 79 49 6e 66 6f 20 69 73 0a 20 20 2a 2a 20  KeyInfo is.  ** 
27050 4e 55 4c 4c 2c 20 74 68 65 20 63 61 6c 6c 65 72  NULL, the caller
27060 20 65 78 70 65 63 74 73 20 61 20 74 61 62 6c 65   expects a table
27070 20 62 2d 74 72 65 65 2e 20 49 66 20 74 68 69 73   b-tree. If this
27080 20 69 73 20 6e 6f 74 20 74 68 65 20 63 61 73 65   is not the case
27090 2c 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 61 6e  ,.  ** return an
270a0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20   SQLITE_CORRUPT 
270b0 65 72 72 6f 72 2e 20 0a 20 20 2a 2a 0a 20 20 2a  error. .  **.  *
270c0 2a 20 45 61 72 6c 69 65 72 20 76 65 72 73 69 6f  * Earlier versio
270d0 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 61 73 73  ns of SQLite ass
270e0 75 6d 65 64 20 74 68 61 74 20 74 68 69 73 20 74  umed that this t
270f0 65 73 74 20 63 6f 75 6c 64 20 6e 6f 74 20 66 61  est could not fa
27100 69 6c 0a 20 20 2a 2a 20 69 66 20 74 68 65 20 72  il.  ** if the r
27110 6f 6f 74 20 70 61 67 65 20 77 61 73 20 61 6c 72  oot page was alr
27120 65 61 64 79 20 6c 6f 61 64 65 64 20 77 68 65 6e  eady loaded when
27130 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77   this function w
27140 61 73 20 63 61 6c 6c 65 64 20 28 69 2e 65 2e 0a  as called (i.e..
27150 20 20 2a 2a 20 69 66 20 70 43 75 72 2d 3e 69 50    ** if pCur->iP
27160 61 67 65 3e 3d 30 29 2e 20 42 75 74 20 74 68 69  age>=0). But thi
27170 73 20 69 73 20 6e 6f 74 20 73 6f 20 69 66 20 74  s is not so if t
27180 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 63  he database is c
27190 6f 72 72 75 70 74 65 64 20 0a 20 20 2a 2a 20 69  orrupted .  ** i
271a0 6e 20 73 75 63 68 20 61 20 77 61 79 20 74 68 61  n such a way tha
271b0 74 20 70 61 67 65 20 70 52 6f 6f 74 20 69 73 20  t page pRoot is 
271c0 6c 69 6e 6b 65 64 20 69 6e 74 6f 20 61 20 73 65  linked into a se
271d0 63 6f 6e 64 20 62 2d 74 72 65 65 20 74 61 62 6c  cond b-tree tabl
271e0 65 20 0a 20 20 2a 2a 20 28 6f 72 20 74 68 65 20  e .  ** (or the 
271f0 66 72 65 65 6c 69 73 74 29 2e 20 20 2a 2f 0a 20  freelist).  */. 
27200 20 61 73 73 65 72 74 28 20 70 52 6f 6f 74 2d 3e   assert( pRoot->
27210 69 6e 74 4b 65 79 3d 3d 31 20 7c 7c 20 70 52 6f  intKey==1 || pRo
27220 6f 74 2d 3e 69 6e 74 4b 65 79 3d 3d 30 20 29 3b  ot->intKey==0 );
27230 0a 20 20 69 66 28 20 70 52 6f 6f 74 2d 3e 69 73  .  if( pRoot->is
27240 49 6e 69 74 3d 3d 30 20 7c 7c 20 28 70 43 75 72  Init==0 || (pCur
27250 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d 30 29 21 3d  ->pKeyInfo==0)!=
27260 70 52 6f 6f 74 2d 3e 69 6e 74 4b 65 79 20 29 7b  pRoot->intKey ){
27270 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
27280 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
27290 0a 20 20 7d 0a 0a 20 20 70 43 75 72 2d 3e 61 69  .  }..  pCur->ai
272a0 49 64 78 5b 30 5d 20 3d 20 30 3b 0a 20 20 70 43  Idx[0] = 0;.  pC
272b0 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d  ur->info.nSize =
272c0 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72 46   0;.  pCur->curF
272d0 6c 61 67 73 20 26 3d 20 7e 28 42 54 43 46 5f 41  lags &= ~(BTCF_A
272e0 74 4c 61 73 74 7c 42 54 43 46 5f 56 61 6c 69 64  tLast|BTCF_Valid
272f0 4e 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f  NKey|BTCF_ValidO
27300 76 66 6c 29 3b 0a 0a 20 20 69 66 28 20 70 52 6f  vfl);..  if( pRo
27310 6f 74 2d 3e 6e 43 65 6c 6c 3e 30 20 29 7b 0a 20  ot->nCell>0 ){. 
27320 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20     pCur->eState 
27330 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a  = CURSOR_VALID;.
27340 20 20 7d 65 6c 73 65 20 69 66 28 20 21 70 52 6f    }else if( !pRo
27350 6f 74 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ot->leaf ){.    
27360 50 67 6e 6f 20 73 75 62 70 61 67 65 3b 0a 20 20  Pgno subpage;.  
27370 20 20 69 66 28 20 70 52 6f 6f 74 2d 3e 70 67 6e    if( pRoot->pgn
27380 6f 21 3d 31 20 29 20 72 65 74 75 72 6e 20 53 51  o!=1 ) return SQ
27390 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
273a0 54 3b 0a 20 20 20 20 73 75 62 70 61 67 65 20 3d  T;.    subpage =
273b0 20 67 65 74 34 62 79 74 65 28 26 70 52 6f 6f 74   get4byte(&pRoot
273c0 2d 3e 61 44 61 74 61 5b 70 52 6f 6f 74 2d 3e 68  ->aData[pRoot->h
273d0 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20  drOffset+8]);.  
273e0 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
273f0 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20   CURSOR_VALID;. 
27400 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68     rc = moveToCh
27410 69 6c 64 28 70 43 75 72 2c 20 73 75 62 70 61 67  ild(pCur, subpag
27420 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  e);.  }else{.   
27430 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
27440 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a  CURSOR_INVALID;.
27450 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
27460 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74  .}../*.** Move t
27470 68 65 20 63 75 72 73 6f 72 20 64 6f 77 6e 20 74  he cursor down t
27480 6f 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20  o the left-most 
27490 6c 65 61 66 20 65 6e 74 72 79 20 62 65 6e 65 61  leaf entry benea
274a0 74 68 20 74 68 65 0a 2a 2a 20 65 6e 74 72 79 20  th the.** entry 
274b0 74 6f 20 77 68 69 63 68 20 69 74 20 69 73 20 63  to which it is c
274c0 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e  urrently pointin
274d0 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c 65 66  g..**.** The lef
274e0 74 2d 6d 6f 73 74 20 6c 65 61 66 20 69 73 20 74  t-most leaf is t
274f0 68 65 20 6f 6e 65 20 77 69 74 68 20 74 68 65 20  he one with the 
27500 73 6d 61 6c 6c 65 73 74 20 6b 65 79 20 2d 20 74  smallest key - t
27510 68 65 20 66 69 72 73 74 0a 2a 2a 20 69 6e 20 61  he first.** in a
27520 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 0a  scending order..
27530 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f  */.static int mo
27540 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 42 74 43  veToLeftmost(BtC
27550 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
27560 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e 74  Pgno pgno;.  int
27570 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
27580 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
27590 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  e;..  assert( cu
275a0 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
275b0 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
275c0 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
275d0 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
275e0 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c    while( rc==SQL
275f0 49 54 45 5f 4f 4b 20 26 26 20 21 28 70 50 61 67  ITE_OK && !(pPag
27600 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65  e = pCur->apPage
27610 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 2d 3e  [pCur->iPage])->
27620 6c 65 61 66 20 29 7b 0a 20 20 20 20 61 73 73 65  leaf ){.    asse
27630 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  rt( pCur->aiIdx[
27640 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 50 61  pCur->iPage]<pPa
27650 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20  ge->nCell );.   
27660 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65   pgno = get4byte
27670 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c  (findCell(pPage,
27680 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
27690 72 2d 3e 69 50 61 67 65 5d 29 29 3b 0a 20 20 20  r->iPage]));.   
276a0 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c   rc = moveToChil
276b0 64 28 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a 20  d(pCur, pgno);. 
276c0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
276d0 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68  }../*.** Move th
276e0 65 20 63 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f  e cursor down to
276f0 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   the right-most 
27700 6c 65 61 66 20 65 6e 74 72 79 20 62 65 6e 65 61  leaf entry benea
27710 74 68 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 74  th the.** page t
27720 6f 20 77 68 69 63 68 20 69 74 20 69 73 20 63 75  o which it is cu
27730 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67  rrently pointing
27740 2e 20 20 4e 6f 74 69 63 65 20 74 68 65 20 64 69  .  Notice the di
27750 66 66 65 72 65 6e 63 65 0a 2a 2a 20 62 65 74 77  fference.** betw
27760 65 65 6e 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f  een moveToLeftmo
27770 73 74 28 29 20 61 6e 64 20 6d 6f 76 65 54 6f 52  st() and moveToR
27780 69 67 68 74 6d 6f 73 74 28 29 2e 20 20 6d 6f 76  ightmost().  mov
27790 65 54 6f 4c 65 66 74 6d 6f 73 74 28 29 0a 2a 2a  eToLeftmost().**
277a0 20 66 69 6e 64 73 20 74 68 65 20 6c 65 66 74 2d   finds the left-
277b0 6d 6f 73 74 20 65 6e 74 72 79 20 62 65 6e 65 61  most entry benea
277c0 74 68 20 74 68 65 20 2a 65 6e 74 72 79 2a 20 77  th the *entry* w
277d0 68 65 72 65 61 73 20 6d 6f 76 65 54 6f 52 69 67  hereas moveToRig
277e0 68 74 6d 6f 73 74 28 29 0a 2a 2a 20 66 69 6e 64  htmost().** find
277f0 73 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  s the right-most
27800 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74   entry beneath t
27810 68 65 20 2a 70 61 67 65 2a 2e 0a 2a 2a 0a 2a 2a  he *page*..**.**
27820 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   The right-most 
27830 65 6e 74 72 79 20 69 73 20 74 68 65 20 6f 6e 65  entry is the one
27840 20 77 69 74 68 20 74 68 65 20 6c 61 72 67 65 73   with the larges
27850 74 20 6b 65 79 20 2d 20 74 68 65 20 6c 61 73 74  t key - the last
27860 0a 2a 2a 20 6b 65 79 20 69 6e 20 61 73 63 65 6e  .** key in ascen
27870 64 69 6e 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73  ding order..*/.s
27880 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f  tatic int moveTo
27890 52 69 67 68 74 6d 6f 73 74 28 42 74 43 75 72 73  Rightmost(BtCurs
278a0 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 50 67 6e  or *pCur){.  Pgn
278b0 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63  o pgno;.  int rc
278c0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
278d0 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d  MemPage *pPage =
278e0 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63   0;..  assert( c
278f0 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
27900 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
27910 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
27920 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
27930 0a 20 20 77 68 69 6c 65 28 20 21 28 70 50 61 67  .  while( !(pPag
27940 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65  e = pCur->apPage
27950 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 2d 3e  [pCur->iPage])->
27960 6c 65 61 66 20 29 7b 0a 20 20 20 20 70 67 6e 6f  leaf ){.    pgno
27970 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61   = get4byte(&pPa
27980 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d  ge->aData[pPage-
27990 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a  >hdrOffset+8]);.
279a0 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b      pCur->aiIdx[
279b0 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 70  pCur->iPage] = p
279c0 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 20  Page->nCell;.   
279d0 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c   rc = moveToChil
279e0 64 28 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a 20  d(pCur, pgno);. 
279f0 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
27a00 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 43 75  rn rc;.  }.  pCu
27a10 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
27a20 50 61 67 65 5d 20 3d 20 70 50 61 67 65 2d 3e 6e  Page] = pPage->n
27a30 43 65 6c 6c 2d 31 3b 0a 20 20 61 73 73 65 72 74  Cell-1;.  assert
27a40 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69  ( pCur->info.nSi
27a50 7a 65 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ze==0 );.  asser
27a60 74 28 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61  t( (pCur->curFla
27a70 67 73 20 26 20 42 54 43 46 5f 56 61 6c 69 64 4e  gs & BTCF_ValidN
27a80 4b 65 79 29 3d 3d 30 20 29 3b 0a 20 20 72 65 74  Key)==0 );.  ret
27a90 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
27aa0 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63 75  ../* Move the cu
27ab0 72 73 6f 72 20 74 6f 20 74 68 65 20 66 69 72 73  rsor to the firs
27ac0 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74  t entry in the t
27ad0 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 53 51  able.  Return SQ
27ae0 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75  LITE_OK.** on su
27af0 63 63 65 73 73 2e 20 20 53 65 74 20 2a 70 52 65  ccess.  Set *pRe
27b00 73 20 74 6f 20 30 20 69 66 20 74 68 65 20 63 75  s to 0 if the cu
27b10 72 73 6f 72 20 61 63 74 75 61 6c 6c 79 20 70 6f  rsor actually po
27b20 69 6e 74 73 20 74 6f 20 73 6f 6d 65 74 68 69 6e  ints to somethin
27b30 67 0a 2a 2a 20 6f 72 20 73 65 74 20 2a 70 52 65  g.** or set *pRe
27b40 73 20 74 6f 20 31 20 69 66 20 74 68 65 20 74 61  s to 1 if the ta
27b50 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f  ble is empty..*/
27b60 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
27b70 65 46 69 72 73 74 28 42 74 43 75 72 73 6f 72 20  eFirst(BtCursor 
27b80 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73  *pCur, int *pRes
27b90 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  ){.  int rc;..  
27ba0 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
27bb0 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
27bc0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
27bd0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
27be0 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d  Cur->pBtree->db-
27bf0 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 63 20  >mutex) );.  rc 
27c00 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75  = moveToRoot(pCu
27c10 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  r);.  if( rc==SQ
27c20 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
27c30 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  f( pCur->eState=
27c40 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20  =CURSOR_INVALID 
27c50 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
27c60 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d   pCur->pgnoRoot=
27c70 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61  =0 || pCur->apPa
27c80 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
27c90 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  >nCell==0 );.   
27ca0 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20     *pRes = 1;.  
27cb0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
27cc0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50  ssert( pCur->apP
27cd0 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
27ce0 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20 20 20  ->nCell>0 );.   
27cf0 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20     *pRes = 0;.  
27d00 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 4c      rc = moveToL
27d10 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20  eftmost(pCur);. 
27d20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
27d30 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65  n rc;.}../* Move
27d40 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74   the cursor to t
27d50 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e  he last entry in
27d60 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74   the table.  Ret
27d70 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a  urn SQLITE_OK.**
27d80 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 53 65   on success.  Se
27d90 74 20 2a 70 52 65 73 20 74 6f 20 30 20 69 66 20  t *pRes to 0 if 
27da0 74 68 65 20 63 75 72 73 6f 72 20 61 63 74 75 61  the cursor actua
27db0 6c 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 73 6f  lly points to so
27dc0 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f 72 20 73 65  mething.** or se
27dd0 74 20 2a 70 52 65 73 20 74 6f 20 31 20 69 66 20  t *pRes to 1 if 
27de0 74 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70  the table is emp
27df0 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ty..*/.int sqlit
27e00 65 33 42 74 72 65 65 4c 61 73 74 28 42 74 43 75  e3BtreeLast(BtCu
27e10 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20  rsor *pCur, int 
27e20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63  *pRes){.  int rc
27e30 3b 0a 20 0a 20 20 61 73 73 65 72 74 28 20 63 75  ;. .  assert( cu
27e40 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
27e50 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
27e60 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
27e70 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65  held(pCur->pBtre
27e80 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  e->db->mutex) );
27e90 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 75  ..  /* If the cu
27ea0 72 73 6f 72 20 61 6c 72 65 61 64 79 20 70 6f 69  rsor already poi
27eb0 6e 74 73 20 74 6f 20 74 68 65 20 6c 61 73 74 20  nts to the last 
27ec0 65 6e 74 72 79 2c 20 74 68 69 73 20 69 73 20 61  entry, this is a
27ed0 20 6e 6f 2d 6f 70 2e 20 2a 2f 0a 20 20 69 66 28   no-op. */.  if(
27ee0 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3d 3d 70   CURSOR_VALID==p
27ef0 43 75 72 2d 3e 65 53 74 61 74 65 20 26 26 20 28  Cur->eState && (
27f00 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26  pCur->curFlags &
27f10 20 42 54 43 46 5f 41 74 4c 61 73 74 29 21 3d 30   BTCF_AtLast)!=0
27f20 20 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   ){.#ifdef SQLIT
27f30 45 5f 44 45 42 55 47 0a 20 20 20 20 2f 2a 20 54  E_DEBUG.    /* T
27f40 68 69 73 20 62 6c 6f 63 6b 20 73 65 72 76 65 73  his block serves
27f50 20 74 6f 20 61 73 73 65 72 74 28 29 20 74 68 61   to assert() tha
27f60 74 20 74 68 65 20 63 75 72 73 6f 72 20 72 65 61  t the cursor rea
27f70 6c 6c 79 20 64 6f 65 73 20 70 6f 69 6e 74 20 0a  lly does point .
27f80 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 6c 61      ** to the la
27f90 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  st entry in the 
27fa0 62 2d 74 72 65 65 2e 20 2a 2f 0a 20 20 20 20 69  b-tree. */.    i
27fb0 6e 74 20 69 69 3b 0a 20 20 20 20 66 6f 72 28 69  nt ii;.    for(i
27fc0 69 3d 30 3b 20 69 69 3c 70 43 75 72 2d 3e 69 50  i=0; ii<pCur->iP
27fd0 61 67 65 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  age; ii++){.    
27fe0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
27ff0 61 69 49 64 78 5b 69 69 5d 3d 3d 70 43 75 72 2d  aiIdx[ii]==pCur-
28000 3e 61 70 50 61 67 65 5b 69 69 5d 2d 3e 6e 43 65  >apPage[ii]->nCe
28010 6c 6c 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ll );.    }.    
28020 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69  assert( pCur->ai
28030 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
28040 3d 3d 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  ==pCur->apPage[p
28050 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65  Cur->iPage]->nCe
28060 6c 6c 2d 31 20 29 3b 0a 20 20 20 20 61 73 73 65  ll-1 );.    asse
28070 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65  rt( pCur->apPage
28080 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6c  [pCur->iPage]->l
28090 65 61 66 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20  eaf );.#endif.  
280a0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
280b0 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20  OK;.  }..  rc = 
280c0 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29  moveToRoot(pCur)
280d0 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
280e0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
280f0 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d   CURSOR_INVALID=
28100 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29 7b  =pCur->eState ){
28110 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
28120 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30  Cur->pgnoRoot==0
28130 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61 67 65   || pCur->apPage
28140 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e  [pCur->iPage]->n
28150 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Cell==0 );.     
28160 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20   *pRes = 1;.    
28170 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73  }else{.      ass
28180 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
28190 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
281a0 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d  );.      *pRes =
281b0 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 6d   0;.      rc = m
281c0 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 70  oveToRightmost(p
281d0 43 75 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20  Cur);.      if( 
281e0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
281f0 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 63  .        pCur->c
28200 75 72 46 6c 61 67 73 20 7c 3d 20 42 54 43 46 5f  urFlags |= BTCF_
28210 41 74 4c 61 73 74 3b 0a 20 20 20 20 20 20 7d 65  AtLast;.      }e
28220 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 43 75  lse{.        pCu
28230 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e  r->curFlags &= ~
28240 42 54 43 46 5f 41 74 4c 61 73 74 3b 0a 20 20 20  BTCF_AtLast;.   
28250 20 20 20 7d 0a 20 20 20 0a 20 20 20 20 7d 0a 20     }.   .    }. 
28260 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
28270 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63  }../* Move the c
28280 75 72 73 6f 72 20 73 6f 20 74 68 61 74 20 69 74  ursor so that it
28290 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20 65 6e   points to an en
282a0 74 72 79 20 6e 65 61 72 20 74 68 65 20 6b 65 79  try near the key
282b0 20 0a 2a 2a 20 73 70 65 63 69 66 69 65 64 20 62   .** specified b
282c0 79 20 70 49 64 78 4b 65 79 20 6f 72 20 69 6e 74  y pIdxKey or int
282d0 4b 65 79 2e 20 20 20 52 65 74 75 72 6e 20 61 20  Key.   Return a 
282e0 73 75 63 63 65 73 73 20 63 6f 64 65 2e 0a 2a 2a  success code..**
282f0 0a 2a 2a 20 46 6f 72 20 49 4e 54 4b 45 59 20 74  .** For INTKEY t
28300 61 62 6c 65 73 2c 20 74 68 65 20 69 6e 74 4b 65  ables, the intKe
28310 79 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 75  y parameter is u
28320 73 65 64 2e 20 20 70 49 64 78 4b 65 79 20 0a 2a  sed.  pIdxKey .*
28330 2a 20 6d 75 73 74 20 62 65 20 4e 55 4c 4c 2e 20  * must be NULL. 
28340 20 46 6f 72 20 69 6e 64 65 78 20 74 61 62 6c 65   For index table
28350 73 2c 20 70 49 64 78 4b 65 79 20 69 73 20 75 73  s, pIdxKey is us
28360 65 64 20 61 6e 64 20 69 6e 74 4b 65 79 0a 2a 2a  ed and intKey.**
28370 20 69 73 20 69 67 6e 6f 72 65 64 2e 0a 2a 2a 0a   is ignored..**.
28380 2a 2a 20 49 66 20 61 6e 20 65 78 61 63 74 20 6d  ** If an exact m
28390 61 74 63 68 20 69 73 20 6e 6f 74 20 66 6f 75 6e  atch is not foun
283a0 64 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73  d, then the curs
283b0 6f 72 20 69 73 20 61 6c 77 61 79 73 0a 2a 2a 20  or is always.** 
283c0 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74  left pointing at
283d0 20 61 20 6c 65 61 66 20 70 61 67 65 20 77 68 69   a leaf page whi
283e0 63 68 20 77 6f 75 6c 64 20 68 6f 6c 64 20 74 68  ch would hold th
283f0 65 20 65 6e 74 72 79 20 69 66 20 69 74 0a 2a 2a  e entry if it.**
28400 20 77 65 72 65 20 70 72 65 73 65 6e 74 2e 20 20   were present.  
28410 54 68 65 20 63 75 72 73 6f 72 20 6d 69 67 68 74  The cursor might
28420 20 70 6f 69 6e 74 20 74 6f 20 61 6e 20 65 6e 74   point to an ent
28430 72 79 20 74 68 61 74 20 63 6f 6d 65 73 0a 2a 2a  ry that comes.**
28440 20 62 65 66 6f 72 65 20 6f 72 20 61 66 74 65 72   before or after
28450 20 74 68 65 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20   the key..**.** 
28460 41 6e 20 69 6e 74 65 67 65 72 20 69 73 20 77 72  An integer is wr
28470 69 74 74 65 6e 20 69 6e 74 6f 20 2a 70 52 65 73  itten into *pRes
28480 20 77 68 69 63 68 20 69 73 20 74 68 65 20 72 65   which is the re
28490 73 75 6c 74 20 6f 66 0a 2a 2a 20 63 6f 6d 70 61  sult of.** compa
284a0 72 69 6e 67 20 74 68 65 20 6b 65 79 20 77 69 74  ring the key wit
284b0 68 20 74 68 65 20 65 6e 74 72 79 20 74 6f 20 77  h the entry to w
284c0 68 69 63 68 20 74 68 65 20 63 75 72 73 6f 72 20  hich the cursor 
284d0 69 73 20 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 2e  is .** pointing.
284e0 20 20 54 68 65 20 6d 65 61 6e 69 6e 67 20 6f 66    The meaning of
284f0 20 74 68 65 20 69 6e 74 65 67 65 72 20 77 72 69   the integer wri
28500 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20 2a 70 52  tten into.** *pR
28510 65 73 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73  es is as follows
28520 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65  :.**.**     *pRe
28530 73 3c 30 20 20 20 20 20 20 54 68 65 20 63 75 72  s<0      The cur
28540 73 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e  sor is left poin
28550 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79  ting at an entry
28560 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20   that.**        
28570 20 20 20 20 20 20 20 20 20 20 69 73 20 73 6d 61            is sma
28580 6c 6c 65 72 20 74 68 61 6e 20 69 6e 74 4b 65 79  ller than intKey
28590 2f 70 49 64 78 4b 65 79 20 6f 72 20 69 66 20 74  /pIdxKey or if t
285a0 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74  he table is empt
285b0 79 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  y.**            
285c0 20 20 20 20 20 20 61 6e 64 20 74 68 65 20 63 75        and the cu
285d0 72 73 6f 72 20 69 73 20 74 68 65 72 65 66 6f 72  rsor is therefor
285e0 65 20 6c 65 66 74 20 70 6f 69 6e 74 20 74 6f 20  e left point to 
285f0 6e 6f 74 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20  nothing..**.**  
28600 20 20 20 2a 70 52 65 73 3d 3d 30 20 20 20 20 20     *pRes==0     
28610 54 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65  The cursor is le
28620 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61  ft pointing at a
28630 6e 20 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20  n entry that.** 
28640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28650 20 65 78 61 63 74 6c 79 20 6d 61 74 63 68 65 73   exactly matches
28660 20 69 6e 74 4b 65 79 2f 70 49 64 78 4b 65 79 2e   intKey/pIdxKey.
28670 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73  .**.**     *pRes
28680 3e 30 20 20 20 20 20 20 54 68 65 20 63 75 72 73  >0      The curs
28690 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74  or is left point
286a0 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20  ing at an entry 
286b0 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  that.**         
286c0 20 20 20 20 20 20 20 20 20 69 73 20 6c 61 72 67           is larg
286d0 65 72 20 74 68 61 6e 20 69 6e 74 4b 65 79 2f 70  er than intKey/p
286e0 49 64 78 4b 65 79 2e 0a 2a 2a 0a 2a 2f 0a 69 6e  IdxKey..**.*/.in
286f0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f  t sqlite3BtreeMo
28700 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 0a 20 20  vetoUnpacked(.  
28710 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
28720 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
28730 63 75 72 73 6f 72 20 74 6f 20 62 65 20 6d 6f 76  cursor to be mov
28740 65 64 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64  ed */.  Unpacked
28750 52 65 63 6f 72 64 20 2a 70 49 64 78 4b 65 79 2c  Record *pIdxKey,
28760 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20 69 6e 64   /* Unpacked ind
28770 65 78 20 6b 65 79 20 2a 2f 0a 20 20 69 36 34 20  ex key */.  i64 
28780 69 6e 74 4b 65 79 2c 20 20 20 20 20 20 20 20 20  intKey,         
28790 20 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c       /* The tabl
287a0 65 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 62  e key */.  int b
287b0 69 61 73 52 69 67 68 74 2c 20 20 20 20 20 20 20  iasRight,       
287c0 20 20 20 20 2f 2a 20 49 66 20 74 72 75 65 2c 20      /* If true, 
287d0 62 69 61 73 20 74 68 65 20 73 65 61 72 63 68 20  bias the search 
287e0 74 6f 20 74 68 65 20 68 69 67 68 20 65 6e 64 20  to the high end 
287f0 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73 20 20  */.  int *pRes  
28800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
28810 20 57 72 69 74 65 20 73 65 61 72 63 68 20 72 65   Write search re
28820 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 29 7b  sults here */.){
28830 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 52 65 63  .  int rc;.  Rec
28840 6f 72 64 43 6f 6d 70 61 72 65 20 78 52 65 63 6f  ordCompare xReco
28850 72 64 43 6f 6d 70 61 72 65 3b 0a 0a 20 20 61 73  rdCompare;..  as
28860 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
28870 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
28880 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
28890 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75  3_mutex_held(pCu
288a0 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d  r->pBtree->db->m
288b0 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
288c0 74 28 20 70 52 65 73 20 29 3b 0a 20 20 61 73 73  t( pRes );.  ass
288d0 65 72 74 28 20 28 70 49 64 78 4b 65 79 3d 3d 30  ert( (pIdxKey==0
288e0 29 3d 3d 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e  )==(pCur->pKeyIn
288f0 66 6f 3d 3d 30 29 20 29 3b 0a 0a 20 20 2f 2a 20  fo==0) );..  /* 
28900 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  If the cursor is
28910 20 61 6c 72 65 61 64 79 20 70 6f 73 69 74 69 6f   already positio
28920 6e 65 64 20 61 74 20 74 68 65 20 70 6f 69 6e 74  ned at the point
28930 20 77 65 20 61 72 65 20 74 72 79 69 6e 67 0a 20   we are trying. 
28940 20 2a 2a 20 74 6f 20 6d 6f 76 65 20 74 6f 2c 20   ** to move to, 
28950 74 68 65 6e 20 6a 75 73 74 20 72 65 74 75 72 6e  then just return
28960 20 77 69 74 68 6f 75 74 20 64 6f 69 6e 67 20 61   without doing a
28970 6e 79 20 77 6f 72 6b 20 2a 2f 0a 20 20 69 66 28  ny work */.  if(
28980 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
28990 55 52 53 4f 52 5f 56 41 4c 49 44 20 26 26 20 28  URSOR_VALID && (
289a0 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26  pCur->curFlags &
289b0 20 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 29   BTCF_ValidNKey)
289c0 21 3d 30 0a 20 20 20 26 26 20 70 43 75 72 2d 3e  !=0.   && pCur->
289d0 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65  apPage[0]->intKe
289e0 79 20 0a 20 20 29 7b 0a 20 20 20 20 69 66 28 20  y .  ){.    if( 
289f0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3d  pCur->info.nKey=
28a00 3d 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20  =intKey ){.     
28a10 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20   *pRes = 0;.    
28a20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
28a30 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  OK;.    }.    if
28a40 28 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67  ( (pCur->curFlag
28a50 73 20 26 20 42 54 43 46 5f 41 74 4c 61 73 74 29  s & BTCF_AtLast)
28a60 21 3d 30 20 26 26 20 70 43 75 72 2d 3e 69 6e 66  !=0 && pCur->inf
28a70 6f 2e 6e 4b 65 79 3c 69 6e 74 4b 65 79 20 29 7b  o.nKey<intKey ){
28a80 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 2d  .      *pRes = -
28a90 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  1;.      return 
28aa0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
28ab0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 49 64 78  .  }..  if( pIdx
28ac0 4b 65 79 20 29 7b 0a 20 20 20 20 78 52 65 63 6f  Key ){.    xReco
28ad0 72 64 43 6f 6d 70 61 72 65 20 3d 20 73 71 6c 69  rdCompare = sqli
28ae0 74 65 33 56 64 62 65 46 69 6e 64 43 6f 6d 70 61  te3VdbeFindCompa
28af0 72 65 28 70 49 64 78 4b 65 79 29 3b 0a 20 20 20  re(pIdxKey);.   
28b00 20 70 49 64 78 4b 65 79 2d 3e 65 72 72 43 6f 64   pIdxKey->errCod
28b10 65 20 3d 20 30 3b 0a 20 20 20 20 61 73 73 65 72  e = 0;.    asser
28b20 74 28 20 70 49 64 78 4b 65 79 2d 3e 64 65 66 61  t( pIdxKey->defa
28b30 75 6c 74 5f 72 63 3d 3d 31 20 0a 20 20 20 20 20  ult_rc==1 .     
28b40 20 20 20 20 7c 7c 20 70 49 64 78 4b 65 79 2d 3e      || pIdxKey->
28b50 64 65 66 61 75 6c 74 5f 72 63 3d 3d 30 20 0a 20  default_rc==0 . 
28b60 20 20 20 20 20 20 20 20 7c 7c 20 70 49 64 78 4b          || pIdxK
28b70 65 79 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3d 3d  ey->default_rc==
28b80 2d 31 0a 20 20 20 20 29 3b 0a 20 20 7d 65 6c 73  -1.    );.  }els
28b90 65 7b 0a 20 20 20 20 78 52 65 63 6f 72 64 43 6f  e{.    xRecordCo
28ba0 6d 70 61 72 65 20 3d 20 30 3b 20 2f 2a 20 41 6c  mpare = 0; /* Al
28bb0 6c 20 6b 65 79 73 20 61 72 65 20 69 6e 74 65 67  l keys are integ
28bc0 65 72 73 20 2a 2f 0a 20 20 7d 0a 0a 20 20 72 63  ers */.  }..  rc
28bd0 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43   = moveToRoot(pC
28be0 75 72 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  ur);.  if( rc ){
28bf0 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
28c00 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 43    }.  assert( pC
28c10 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20  ur->pgnoRoot==0 
28c20 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  || pCur->apPage[
28c30 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a  pCur->iPage] );.
28c40 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
28c50 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70  pgnoRoot==0 || p
28c60 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
28c70 2d 3e 69 50 61 67 65 5d 2d 3e 69 73 49 6e 69 74  ->iPage]->isInit
28c80 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
28c90 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
28ca0 4f 52 5f 49 4e 56 41 4c 49 44 20 7c 7c 20 70 43  OR_INVALID || pC
28cb0 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
28cc0 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3e 30  >iPage]->nCell>0
28cd0 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e   );.  if( pCur->
28ce0 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49  eState==CURSOR_I
28cf0 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 2a 70  NVALID ){.    *p
28d00 52 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20 61 73  Res = -1;.    as
28d10 73 65 72 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f  sert( pCur->pgno
28d20 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d  Root==0 || pCur-
28d30 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
28d40 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29  age]->nCell==0 )
28d50 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
28d60 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 61 73  ITE_OK;.  }.  as
28d70 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61  sert( pCur->apPa
28d80 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20 7c 7c  ge[0]->intKey ||
28d90 20 70 49 64 78 4b 65 79 20 29 3b 0a 20 20 66 6f   pIdxKey );.  fo
28da0 72 28 3b 3b 29 7b 0a 20 20 20 20 69 6e 74 20 6c  r(;;){.    int l
28db0 77 72 2c 20 75 70 72 2c 20 69 64 78 2c 20 63 3b  wr, upr, idx, c;
28dc0 0a 20 20 20 20 50 67 6e 6f 20 63 68 6c 64 50 67  .    Pgno chldPg
28dd0 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70  ;.    MemPage *p
28de0 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50  Page = pCur->apP
28df0 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
28e00 3b 0a 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 3b  ;.    u8 *pCell;
28e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28e20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
28e30 6e 74 65 72 20 74 6f 20 63 75 72 72 65 6e 74 20  nter to current 
28e40 63 65 6c 6c 20 69 6e 20 70 50 61 67 65 20 2a 2f  cell in pPage */
28e50 0a 0a 20 20 20 20 2f 2a 20 70 50 61 67 65 2d 3e  ..    /* pPage->
28e60 6e 43 65 6c 6c 20 6d 75 73 74 20 62 65 20 67 72  nCell must be gr
28e70 65 61 74 65 72 20 74 68 61 6e 20 7a 65 72 6f 2e  eater than zero.
28e80 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20   If this is the 
28e90 72 6f 6f 74 2d 70 61 67 65 0a 20 20 20 20 2a 2a  root-page.    **
28ea0 20 74 68 65 20 63 75 72 73 6f 72 20 77 6f 75 6c   the cursor woul
28eb0 64 20 68 61 76 65 20 62 65 65 6e 20 49 4e 56 41  d have been INVA
28ec0 4c 49 44 20 61 62 6f 76 65 20 61 6e 64 20 74 68  LID above and th
28ed0 69 73 20 66 6f 72 28 3b 3b 29 20 6c 6f 6f 70 0a  is for(;;) loop.
28ee0 20 20 20 20 2a 2a 20 6e 6f 74 20 72 75 6e 2e 20      ** not run. 
28ef0 49 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20 74  If this is not t
28f00 68 65 20 72 6f 6f 74 2d 70 61 67 65 2c 20 74 68  he root-page, th
28f10 65 6e 20 74 68 65 20 6d 6f 76 65 54 6f 43 68 69  en the moveToChi
28f20 6c 64 28 29 20 72 6f 75 74 69 6e 65 0a 20 20 20  ld() routine.   
28f30 20 2a 2a 20 77 6f 75 6c 64 20 68 61 76 65 20 61   ** would have a
28f40 6c 72 65 61 64 79 20 64 65 74 65 63 74 65 64 20  lready detected 
28f50 64 62 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20 53  db corruption. S
28f60 69 6d 69 6c 61 72 6c 79 2c 20 70 50 61 67 65 20  imilarly, pPage 
28f70 6d 75 73 74 0a 20 20 20 20 2a 2a 20 62 65 20 74  must.    ** be t
28f80 68 65 20 72 69 67 68 74 20 6b 69 6e 64 20 28 69  he right kind (i
28f90 6e 64 65 78 20 6f 72 20 74 61 62 6c 65 29 20 6f  ndex or table) o
28fa0 66 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20 4f  f b-tree page. O
28fb0 74 68 65 72 77 69 73 65 0a 20 20 20 20 2a 2a 20  therwise.    ** 
28fc0 61 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 29 20  a moveToChild() 
28fd0 6f 72 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 29 20  or moveToRoot() 
28fe0 63 61 6c 6c 20 77 6f 75 6c 64 20 68 61 76 65 20  call would have 
28ff0 64 65 74 65 63 74 65 64 20 63 6f 72 72 75 70 74  detected corrupt
29000 69 6f 6e 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73  ion.  */.    ass
29010 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c  ert( pPage->nCel
29020 6c 3e 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  l>0 );.    asser
29030 74 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  t( pPage->intKey
29040 3d 3d 28 70 49 64 78 4b 65 79 3d 3d 30 29 20 29  ==(pIdxKey==0) )
29050 3b 0a 20 20 20 20 6c 77 72 20 3d 20 30 3b 0a 20  ;.    lwr = 0;. 
29060 20 20 20 75 70 72 20 3d 20 70 50 61 67 65 2d 3e     upr = pPage->
29070 6e 43 65 6c 6c 2d 31 3b 0a 20 20 20 20 61 73 73  nCell-1;.    ass
29080 65 72 74 28 20 62 69 61 73 52 69 67 68 74 3d 3d  ert( biasRight==
29090 30 20 7c 7c 20 62 69 61 73 52 69 67 68 74 3d 3d  0 || biasRight==
290a0 31 20 29 3b 0a 20 20 20 20 69 64 78 20 3d 20 75  1 );.    idx = u
290b0 70 72 3e 3e 28 31 2d 62 69 61 73 52 69 67 68 74  pr>>(1-biasRight
290c0 29 3b 20 2f 2a 20 69 64 78 20 3d 20 62 69 61 73  ); /* idx = bias
290d0 52 69 67 68 74 20 3f 20 75 70 72 20 3a 20 28 6c  Right ? upr : (l
290e0 77 72 2b 75 70 72 29 2f 32 3b 20 2a 2f 0a 20 20  wr+upr)/2; */.  
290f0 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43    pCur->aiIdx[pC
29100 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75 31  ur->iPage] = (u1
29110 36 29 69 64 78 3b 0a 20 20 20 20 69 66 28 20 78  6)idx;.    if( x
29120 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 3d 3d 30  RecordCompare==0
29130 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 3b 3b   ){.      for(;;
29140 29 7b 0a 20 20 20 20 20 20 20 20 69 36 34 20 6e  ){.        i64 n
29150 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20 20  CellKey;.       
29160 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c   pCell = findCel
29170 6c 28 70 50 61 67 65 2c 20 69 64 78 29 20 2b 20  l(pPage, idx) + 
29180 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53  pPage->childPtrS
29190 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ize;.        if(
291a0 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65   pPage->intKeyLe
291b0 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  af ){.          
291c0 77 68 69 6c 65 28 20 30 78 38 30 20 3c 3d 20 2a  while( 0x80 <= *
291d0 28 70 43 65 6c 6c 2b 2b 29 20 29 7b 0a 20 20 20  (pCell++) ){.   
291e0 20 20 20 20 20 20 20 20 20 69 66 28 20 70 43 65           if( pCe
291f0 6c 6c 3e 3d 70 50 61 67 65 2d 3e 61 44 61 74 61  ll>=pPage->aData
29200 45 6e 64 20 29 20 72 65 74 75 72 6e 20 53 51 4c  End ) return SQL
29210 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
29220 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
29230 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
29240 67 65 74 56 61 72 69 6e 74 28 70 43 65 6c 6c 2c  getVarint(pCell,
29250 20 28 75 36 34 2a 29 26 6e 43 65 6c 6c 4b 65 79   (u64*)&nCellKey
29260 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e  );.        if( n
29270 43 65 6c 6c 4b 65 79 3c 69 6e 74 4b 65 79 20 29  CellKey<intKey )
29280 7b 0a 20 20 20 20 20 20 20 20 20 20 6c 77 72 20  {.          lwr 
29290 3d 20 69 64 78 2b 31 3b 0a 20 20 20 20 20 20 20  = idx+1;.       
292a0 20 20 20 69 66 28 20 6c 77 72 3e 75 70 72 20 29     if( lwr>upr )
292b0 7b 20 63 20 3d 20 2d 31 3b 20 62 72 65 61 6b 3b  { c = -1; break;
292c0 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65   }.        }else
292d0 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3e 69 6e   if( nCellKey>in
292e0 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20  tKey ){.        
292f0 20 20 75 70 72 20 3d 20 69 64 78 2d 31 3b 0a 20    upr = idx-1;. 
29300 20 20 20 20 20 20 20 20 20 69 66 28 20 6c 77 72           if( lwr
29310 3e 75 70 72 20 29 7b 20 63 20 3d 20 2b 31 3b 20  >upr ){ c = +1; 
29320 62 72 65 61 6b 3b 20 7d 0a 20 20 20 20 20 20 20  break; }.       
29330 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
29340 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 4b    assert( nCellK
29350 65 79 3d 3d 69 6e 74 4b 65 79 20 29 3b 0a 20 20  ey==intKey );.  
29360 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 63 75          pCur->cu
29370 72 46 6c 61 67 73 20 7c 3d 20 42 54 43 46 5f 56  rFlags |= BTCF_V
29380 61 6c 69 64 4e 4b 65 79 3b 0a 20 20 20 20 20 20  alidNKey;.      
29390 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e      pCur->info.n
293a0 4b 65 79 20 3d 20 6e 43 65 6c 6c 4b 65 79 3b 0a  Key = nCellKey;.
293b0 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e            pCur->
293c0 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
293d0 65 5d 20 3d 20 28 75 31 36 29 69 64 78 3b 0a 20  e] = (u16)idx;. 
293e0 20 20 20 20 20 20 20 20 20 69 66 28 20 21 70 50           if( !pP
293f0 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
29400 20 20 20 20 20 20 20 20 20 6c 77 72 20 3d 20 69           lwr = i
29410 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  dx;.            
29420 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 6e 65 78 74  goto moveto_next
29430 5f 6c 61 79 65 72 3b 0a 20 20 20 20 20 20 20 20  _layer;.        
29440 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
29450 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a       *pRes = 0;.
29460 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
29470 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
29480 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76          goto mov
29490 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20  eto_finish;.    
294a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
294b0 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  }.        assert
294c0 28 20 6c 77 72 2b 75 70 72 3e 3d 30 20 29 3b 0a  ( lwr+upr>=0 );.
294d0 20 20 20 20 20 20 20 20 69 64 78 20 3d 20 28 6c          idx = (l
294e0 77 72 2b 75 70 72 29 3e 3e 31 3b 20 20 2f 2a 20  wr+upr)>>1;  /* 
294f0 69 64 78 20 3d 20 28 6c 77 72 2b 75 70 72 29 2f  idx = (lwr+upr)/
29500 32 3b 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20  2; */.      }.  
29510 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 66    }else{.      f
29520 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 20 20 20 20  or(;;){.        
29530 69 6e 74 20 6e 43 65 6c 6c 3b 0a 20 20 20 20 20  int nCell;.     
29540 20 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43     pCell = findC
29550 65 6c 6c 28 70 50 61 67 65 2c 20 69 64 78 29 20  ell(pPage, idx) 
29560 2b 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74  + pPage->childPt
29570 72 53 69 7a 65 3b 0a 0a 20 20 20 20 20 20 20 20  rSize;..        
29580 2f 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 73  /* The maximum s
29590 75 70 70 6f 72 74 65 64 20 70 61 67 65 2d 73 69  upported page-si
295a0 7a 65 20 69 73 20 36 35 35 33 36 20 62 79 74 65  ze is 65536 byte
295b0 73 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68  s. This means th
295c0 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  at.        ** th
295d0 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72  e maximum number
295e0 20 6f 66 20 72 65 63 6f 72 64 20 62 79 74 65 73   of record bytes
295f0 20 73 74 6f 72 65 64 20 6f 6e 20 61 6e 20 69 6e   stored on an in
29600 64 65 78 20 42 2d 54 72 65 65 0a 20 20 20 20 20  dex B-Tree.     
29610 20 20 20 2a 2a 20 70 61 67 65 20 69 73 20 6c 65     ** page is le
29620 73 73 20 74 68 61 6e 20 31 36 33 38 34 20 62 79  ss than 16384 by
29630 74 65 73 20 61 6e 64 20 6d 61 79 20 62 65 20 73  tes and may be s
29640 74 6f 72 65 64 20 61 73 20 61 20 32 2d 62 79 74  tored as a 2-byt
29650 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 76 61 72  e.        ** var
29660 69 6e 74 2e 20 54 68 69 73 20 69 6e 66 6f 72 6d  int. This inform
29670 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f  ation is used to
29680 20 61 74 74 65 6d 70 74 20 74 6f 20 61 76 6f 69   attempt to avoi
29690 64 20 70 61 72 73 69 6e 67 20 0a 20 20 20 20 20  d parsing .     
296a0 20 20 20 2a 2a 20 74 68 65 20 65 6e 74 69 72 65     ** the entire
296b0 20 63 65 6c 6c 20 62 79 20 63 68 65 63 6b 69 6e   cell by checkin
296c0 67 20 66 6f 72 20 74 68 65 20 63 61 73 65 73 20  g for the cases 
296d0 77 68 65 72 65 20 74 68 65 20 72 65 63 6f 72 64  where the record
296e0 20 69 73 20 0a 20 20 20 20 20 20 20 20 2a 2a 20   is .        ** 
296f0 73 74 6f 72 65 64 20 65 6e 74 69 72 65 6c 79 20  stored entirely 
29700 77 69 74 68 69 6e 20 74 68 65 20 62 2d 74 72 65  within the b-tre
29710 65 20 70 61 67 65 20 62 79 20 69 6e 73 70 65 63  e page by inspec
29720 74 69 6e 67 20 74 68 65 20 66 69 72 73 74 20 0a  ting the first .
29730 20 20 20 20 20 20 20 20 2a 2a 20 32 20 62 79 74          ** 2 byt
29740 65 73 20 6f 66 20 74 68 65 20 63 65 6c 6c 2e 0a  es of the cell..
29750 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
29760 20 20 20 6e 43 65 6c 6c 20 3d 20 70 43 65 6c 6c     nCell = pCell
29770 5b 30 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28  [0];.        if(
29780 20 6e 43 65 6c 6c 3c 3d 70 50 61 67 65 2d 3e 6d   nCell<=pPage->m
29790 61 78 31 62 79 74 65 50 61 79 6c 6f 61 64 20 29  ax1bytePayload )
297a0 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  {.          /* T
297b0 68 69 73 20 62 72 61 6e 63 68 20 72 75 6e 73 20  his branch runs 
297c0 69 66 20 74 68 65 20 72 65 63 6f 72 64 2d 73 69  if the record-si
297d0 7a 65 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20  ze field of the 
297e0 63 65 6c 6c 20 69 73 20 61 0a 20 20 20 20 20 20  cell is a.      
297f0 20 20 20 20 2a 2a 20 73 69 6e 67 6c 65 20 62 79      ** single by
29800 74 65 20 76 61 72 69 6e 74 20 61 6e 64 20 74 68  te varint and th
29810 65 20 72 65 63 6f 72 64 20 66 69 74 73 20 65 6e  e record fits en
29820 74 69 72 65 6c 79 20 6f 6e 20 74 68 65 20 6d 61  tirely on the ma
29830 69 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  in.          ** 
29840 62 2d 74 72 65 65 20 70 61 67 65 2e 20 20 2a 2f  b-tree page.  */
29850 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63  .          testc
29860 61 73 65 28 20 70 43 65 6c 6c 2b 6e 43 65 6c 6c  ase( pCell+nCell
29870 2b 31 3d 3d 70 50 61 67 65 2d 3e 61 44 61 74 61  +1==pPage->aData
29880 45 6e 64 20 29 3b 0a 20 20 20 20 20 20 20 20 20  End );.         
29890 20 63 20 3d 20 78 52 65 63 6f 72 64 43 6f 6d 70   c = xRecordComp
298a0 61 72 65 28 6e 43 65 6c 6c 2c 20 28 76 6f 69 64  are(nCell, (void
298b0 2a 29 26 70 43 65 6c 6c 5b 31 5d 2c 20 70 49 64  *)&pCell[1], pId
298c0 78 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 7d  xKey);.        }
298d0 65 6c 73 65 20 69 66 28 20 21 28 70 43 65 6c 6c  else if( !(pCell
298e0 5b 31 5d 20 26 20 30 78 38 30 29 20 0a 20 20 20  [1] & 0x80) .   
298f0 20 20 20 20 20 20 20 26 26 20 28 6e 43 65 6c 6c         && (nCell
29900 20 3d 20 28 28 6e 43 65 6c 6c 26 30 78 37 66 29   = ((nCell&0x7f)
29910 3c 3c 37 29 20 2b 20 70 43 65 6c 6c 5b 31 5d 29  <<7) + pCell[1])
29920 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  <=pPage->maxLoca
29930 6c 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20  l.        ){.   
29940 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65         /* The re
29950 63 6f 72 64 2d 73 69 7a 65 20 66 69 65 6c 64 20  cord-size field 
29960 69 73 20 61 20 32 20 62 79 74 65 20 76 61 72 69  is a 2 byte vari
29970 6e 74 20 61 6e 64 20 74 68 65 20 72 65 63 6f 72  nt and the recor
29980 64 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  d .          ** 
29990 66 69 74 73 20 65 6e 74 69 72 65 6c 79 20 6f 6e  fits entirely on
299a0 20 74 68 65 20 6d 61 69 6e 20 62 2d 74 72 65 65   the main b-tree
299b0 20 70 61 67 65 2e 20 20 2a 2f 0a 20 20 20 20 20   page.  */.     
299c0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
299d0 43 65 6c 6c 2b 6e 43 65 6c 6c 2b 32 3d 3d 70 50  Cell+nCell+2==pP
299e0 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 29 3b  age->aDataEnd );
299f0 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 78  .          c = x
29a00 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43  RecordCompare(nC
29a10 65 6c 6c 2c 20 28 76 6f 69 64 2a 29 26 70 43 65  ell, (void*)&pCe
29a20 6c 6c 5b 32 5d 2c 20 70 49 64 78 4b 65 79 29 3b  ll[2], pIdxKey);
29a30 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
29a40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
29a50 20 72 65 63 6f 72 64 20 66 6c 6f 77 73 20 6f 76   record flows ov
29a60 65 72 20 6f 6e 74 6f 20 6f 6e 65 20 6f 72 20 6d  er onto one or m
29a70 6f 72 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  ore overflow pag
29a80 65 73 2e 20 49 6e 0a 20 20 20 20 20 20 20 20 20  es. In.         
29a90 20 2a 2a 20 74 68 69 73 20 63 61 73 65 20 74 68   ** this case th
29aa0 65 20 77 68 6f 6c 65 20 63 65 6c 6c 20 6e 65 65  e whole cell nee
29ab0 64 73 20 74 6f 20 62 65 20 70 61 72 73 65 64 2c  ds to be parsed,
29ac0 20 61 20 62 75 66 66 65 72 20 61 6c 6c 6f 63 61   a buffer alloca
29ad0 74 65 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ted.          **
29ae0 20 61 6e 64 20 61 63 63 65 73 73 50 61 79 6c 6f   and accessPaylo
29af0 61 64 28 29 20 75 73 65 64 20 74 6f 20 72 65 74  ad() used to ret
29b00 72 69 65 76 65 20 74 68 65 20 72 65 63 6f 72 64  rieve the record
29b10 20 69 6e 74 6f 20 74 68 65 0a 20 20 20 20 20 20   into the.      
29b20 20 20 20 20 2a 2a 20 62 75 66 66 65 72 20 62 65      ** buffer be
29b30 66 6f 72 65 20 56 64 62 65 52 65 63 6f 72 64 43  fore VdbeRecordC
29b40 6f 6d 70 61 72 65 28 29 20 63 61 6e 20 62 65 20  ompare() can be 
29b50 63 61 6c 6c 65 64 2e 20 2a 2f 0a 20 20 20 20 20  called. */.     
29b60 20 20 20 20 20 76 6f 69 64 20 2a 70 43 65 6c 6c       void *pCell
29b70 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 20 20 75  Key;.          u
29b80 38 20 2a 20 63 6f 6e 73 74 20 70 43 65 6c 6c 42  8 * const pCellB
29b90 6f 64 79 20 3d 20 70 43 65 6c 6c 20 2d 20 70 50  ody = pCell - pP
29ba0 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a  age->childPtrSiz
29bb0 65 3b 0a 20 20 20 20 20 20 20 20 20 20 62 74 72  e;.          btr
29bc0 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70  eeParseCellPtr(p
29bd0 50 61 67 65 2c 20 70 43 65 6c 6c 42 6f 64 79 2c  Page, pCellBody,
29be0 20 26 70 43 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20   &pCur->info);. 
29bf0 20 20 20 20 20 20 20 20 20 6e 43 65 6c 6c 20 3d           nCell =
29c00 20 28 69 6e 74 29 70 43 75 72 2d 3e 69 6e 66 6f   (int)pCur->info
29c10 2e 6e 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 20  .nKey;.         
29c20 20 70 43 65 6c 6c 4b 65 79 20 3d 20 73 71 6c 69   pCellKey = sqli
29c30 74 65 33 4d 61 6c 6c 6f 63 28 20 6e 43 65 6c 6c  te3Malloc( nCell
29c40 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66   );.          if
29c50 28 20 70 43 65 6c 6c 4b 65 79 3d 3d 30 20 29 7b  ( pCellKey==0 ){
29c60 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
29c70 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
29c80 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f              goto
29c90 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a   moveto_finish;.
29ca0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
29cb0 20 20 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64        pCur->aiId
29cc0 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d  x[pCur->iPage] =
29cd0 20 28 75 31 36 29 69 64 78 3b 0a 20 20 20 20 20   (u16)idx;.     
29ce0 20 20 20 20 20 72 63 20 3d 20 61 63 63 65 73 73       rc = access
29cf0 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 30 2c  Payload(pCur, 0,
29d00 20 6e 43 65 6c 6c 2c 20 28 75 6e 73 69 67 6e 65   nCell, (unsigne
29d10 64 20 63 68 61 72 2a 29 70 43 65 6c 6c 4b 65 79  d char*)pCellKey
29d20 2c 20 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 2);.          
29d30 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
29d40 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
29d50 65 65 28 70 43 65 6c 6c 4b 65 79 29 3b 0a 20 20  ee(pCellKey);.  
29d60 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d            goto m
29d70 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20  oveto_finish;.  
29d80 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
29d90 20 20 20 20 63 20 3d 20 78 52 65 63 6f 72 64 43      c = xRecordC
29da0 6f 6d 70 61 72 65 28 6e 43 65 6c 6c 2c 20 70 43  ompare(nCell, pC
29db0 65 6c 6c 4b 65 79 2c 20 70 49 64 78 4b 65 79 29  ellKey, pIdxKey)
29dc0 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
29dd0 74 65 33 5f 66 72 65 65 28 70 43 65 6c 6c 4b 65  te3_free(pCellKe
29de0 79 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  y);.        }.  
29df0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 0a 20        assert( . 
29e00 20 20 20 20 20 20 20 20 20 20 20 28 70 49 64 78             (pIdx
29e10 4b 65 79 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51  Key->errCode!=SQ
29e20 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 7c 7c 20  LITE_CORRUPT || 
29e30 63 3d 3d 30 29 0a 20 20 20 20 20 20 20 20 20 26  c==0).         &
29e40 26 20 28 70 49 64 78 4b 65 79 2d 3e 65 72 72 43  & (pIdxKey->errC
29e50 6f 64 65 21 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45  ode!=SQLITE_NOME
29e60 4d 20 7c 7c 20 70 43 75 72 2d 3e 70 42 74 72 65  M || pCur->pBtre
29e70 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
29e80 6c 65 64 29 0a 20 20 20 20 20 20 20 20 29 3b 0a  led).        );.
29e90 20 20 20 20 20 20 20 20 69 66 28 20 63 3c 30 20          if( c<0 
29ea0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6c 77 72  ){.          lwr
29eb0 20 3d 20 69 64 78 2b 31 3b 0a 20 20 20 20 20 20   = idx+1;.      
29ec0 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3e 30 20    }else if( c>0 
29ed0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 70 72  ){.          upr
29ee0 20 3d 20 69 64 78 2d 31 3b 0a 20 20 20 20 20 20   = idx-1;.      
29ef0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
29f00 20 20 20 61 73 73 65 72 74 28 20 63 3d 3d 30 20     assert( c==0 
29f10 29 3b 0a 20 20 20 20 20 20 20 20 20 20 2a 70 52  );.          *pR
29f20 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  es = 0;.        
29f30 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
29f40 3b 0a 20 20 20 20 20 20 20 20 20 20 70 43 75 72  ;.          pCur
29f50 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
29f60 61 67 65 5d 20 3d 20 28 75 31 36 29 69 64 78 3b  age] = (u16)idx;
29f70 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
29f80 49 64 78 4b 65 79 2d 3e 65 72 72 43 6f 64 65 20  IdxKey->errCode 
29f90 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f  ) rc = SQLITE_CO
29fa0 52 52 55 50 54 3b 0a 20 20 20 20 20 20 20 20 20  RRUPT;.         
29fb0 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e   goto moveto_fin
29fc0 69 73 68 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ish;.        }. 
29fd0 20 20 20 20 20 20 20 69 66 28 20 6c 77 72 3e 75         if( lwr>u
29fe0 70 72 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  pr ) break;.    
29ff0 20 20 20 20 61 73 73 65 72 74 28 20 6c 77 72 2b      assert( lwr+
2a000 75 70 72 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20  upr>=0 );.      
2a010 20 20 69 64 78 20 3d 20 28 6c 77 72 2b 75 70 72    idx = (lwr+upr
2a020 29 3e 3e 31 3b 20 20 2f 2a 20 69 64 78 20 3d 20  )>>1;  /* idx = 
2a030 28 6c 77 72 2b 75 70 72 29 2f 32 20 2a 2f 0a 20  (lwr+upr)/2 */. 
2a040 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
2a050 20 61 73 73 65 72 74 28 20 6c 77 72 3d 3d 75 70   assert( lwr==up
2a060 72 2b 31 20 7c 7c 20 28 70 50 61 67 65 2d 3e 69  r+1 || (pPage->i
2a070 6e 74 4b 65 79 20 26 26 20 21 70 50 61 67 65 2d  ntKey && !pPage-
2a080 3e 6c 65 61 66 29 20 29 3b 0a 20 20 20 20 61 73  >leaf) );.    as
2a090 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49  sert( pPage->isI
2a0a0 6e 69 74 20 29 3b 0a 20 20 20 20 69 66 28 20 70  nit );.    if( p
2a0b0 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
2a0c0 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
2a0d0 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
2a0e0 61 67 65 5d 3c 70 43 75 72 2d 3e 61 70 50 61 67  age]<pCur->apPag
2a0f0 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e  e[pCur->iPage]->
2a100 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 20 20 70  nCell );.      p
2a110 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
2a120 3e 69 50 61 67 65 5d 20 3d 20 28 75 31 36 29 69  >iPage] = (u16)i
2a130 64 78 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20  dx;.      *pRes 
2a140 3d 20 63 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  = c;.      rc = 
2a150 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
2a160 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e   goto moveto_fin
2a170 69 73 68 3b 0a 20 20 20 20 7d 0a 6d 6f 76 65 74  ish;.    }.movet
2a180 6f 5f 6e 65 78 74 5f 6c 61 79 65 72 3a 0a 20 20  o_next_layer:.  
2a190 20 20 69 66 28 20 6c 77 72 3e 3d 70 50 61 67 65    if( lwr>=pPage
2a1a0 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20  ->nCell ){.     
2a1b0 20 63 68 6c 64 50 67 20 3d 20 67 65 74 34 62 79   chldPg = get4by
2a1c0 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61  te(&pPage->aData
2a1d0 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
2a1e0 74 2b 38 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65  t+8]);.    }else
2a1f0 7b 0a 20 20 20 20 20 20 63 68 6c 64 50 67 20 3d  {.      chldPg =
2a200 20 67 65 74 34 62 79 74 65 28 66 69 6e 64 43 65   get4byte(findCe
2a210 6c 6c 28 70 50 61 67 65 2c 20 6c 77 72 29 29 3b  ll(pPage, lwr));
2a220 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 75 72 2d  .    }.    pCur-
2a230 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
2a240 67 65 5d 20 3d 20 28 75 31 36 29 6c 77 72 3b 0a  ge] = (u16)lwr;.
2a250 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43      rc = moveToC
2a260 68 69 6c 64 28 70 43 75 72 2c 20 63 68 6c 64 50  hild(pCur, chldP
2a270 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  g);.    if( rc )
2a280 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 6d 6f 76 65   break;.  }.move
2a290 74 6f 5f 66 69 6e 69 73 68 3a 0a 20 20 70 43 75  to_finish:.  pCu
2a2a0 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20  r->info.nSize = 
2a2b0 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72 46 6c  0;.  pCur->curFl
2a2c0 61 67 73 20 26 3d 20 7e 28 42 54 43 46 5f 56 61  ags &= ~(BTCF_Va
2a2d0 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56 61 6c  lidNKey|BTCF_Val
2a2e0 69 64 4f 76 66 6c 29 3b 0a 20 20 72 65 74 75 72  idOvfl);.  retur
2a2f0 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
2a300 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74  Return TRUE if t
2a310 68 65 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74  he cursor is not
2a320 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20   pointing at an 
2a330 65 6e 74 72 79 20 6f 66 20 74 68 65 20 74 61 62  entry of the tab
2a340 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 52 55 45 20 77  le..**.** TRUE w
2a350 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20  ill be returned 
2a360 61 66 74 65 72 20 61 20 63 61 6c 6c 20 74 6f 20  after a call to 
2a370 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74  sqlite3BtreeNext
2a380 28 29 20 6d 6f 76 65 73 0a 2a 2a 20 70 61 73 74  () moves.** past
2a390 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20   the last entry 
2a3a0 69 6e 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20  in the table or 
2a3b0 73 71 6c 69 74 65 33 42 74 72 65 65 50 72 65 76  sqlite3BtreePrev
2a3c0 28 29 20 6d 6f 76 65 73 20 70 61 73 74 0a 2a 2a  () moves past.**
2a3d0 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79   the first entry
2a3e0 2e 20 20 54 52 55 45 20 69 73 20 61 6c 73 6f 20  .  TRUE is also 
2a3f0 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65 20  returned if the 
2a400 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a  table is empty..
2a410 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
2a420 72 65 65 45 6f 66 28 42 74 43 75 72 73 6f 72 20  reeEof(BtCursor 
2a430 2a 70 43 75 72 29 7b 0a 20 20 2f 2a 20 54 4f 44  *pCur){.  /* TOD
2a440 4f 3a 20 57 68 61 74 20 69 66 20 74 68 65 20 63  O: What if the c
2a450 75 72 73 6f 72 20 69 73 20 69 6e 20 43 55 52 53  ursor is in CURS
2a460 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 62  OR_REQUIRESEEK b
2a470 75 74 20 61 6c 6c 20 74 61 62 6c 65 20 65 6e 74  ut all table ent
2a480 72 69 65 73 0a 20 20 2a 2a 20 68 61 76 65 20 62  ries.  ** have b
2a490 65 65 6e 20 64 65 6c 65 74 65 64 3f 20 54 68 69  een deleted? Thi
2a4a0 73 20 41 50 49 20 77 69 6c 6c 20 6e 65 65 64 20  s API will need 
2a4b0 74 6f 20 63 68 61 6e 67 65 20 74 6f 20 72 65 74  to change to ret
2a4c0 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  urn an error cod
2a4d0 65 0a 20 20 2a 2a 20 61 73 20 77 65 6c 6c 20 61  e.  ** as well a
2a4e0 73 20 74 68 65 20 62 6f 6f 6c 65 61 6e 20 72 65  s the boolean re
2a4f0 73 75 6c 74 20 76 61 6c 75 65 2e 0a 20 20 2a 2f  sult value..  */
2a500 0a 20 20 72 65 74 75 72 6e 20 28 43 55 52 53 4f  .  return (CURSO
2a510 52 5f 56 41 4c 49 44 21 3d 70 43 75 72 2d 3e 65  R_VALID!=pCur->e
2a520 53 74 61 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  State);.}../*.**
2a530 20 41 64 76 61 6e 63 65 20 74 68 65 20 63 75 72   Advance the cur
2a540 73 6f 72 20 74 6f 20 74 68 65 20 6e 65 78 74 20  sor to the next 
2a550 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61 74  entry in the dat
2a560 61 62 61 73 65 2e 20 20 49 66 0a 2a 2a 20 73 75  abase.  If.** su
2a570 63 63 65 73 73 66 75 6c 20 74 68 65 6e 20 73 65  ccessful then se
2a580 74 20 2a 70 52 65 73 3d 30 2e 20 20 49 66 20 74  t *pRes=0.  If t
2a590 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 77 61 73  he cursor.** was
2a5a0 20 61 6c 72 65 61 64 79 20 70 6f 69 6e 74 69 6e   already pointin
2a5b0 67 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e  g to the last en
2a5c0 74 72 79 20 69 6e 20 74 68 65 20 64 61 74 61 62  try in the datab
2a5d0 61 73 65 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68  ase before.** th
2a5e0 69 73 20 72 6f 75 74 69 6e 65 20 77 61 73 20 63  is routine was c
2a5f0 61 6c 6c 65 64 2c 20 74 68 65 6e 20 73 65 74 20  alled, then set 
2a600 2a 70 52 65 73 3d 31 2e 0a 2a 2a 0a 2a 2a 20 54  *pRes=1..**.** T
2a610 68 65 20 6d 61 69 6e 20 65 6e 74 72 79 20 70 6f  he main entry po
2a620 69 6e 74 20 69 73 20 73 71 6c 69 74 65 33 42 74  int is sqlite3Bt
2a630 72 65 65 4e 65 78 74 28 29 2e 20 20 54 68 61 74  reeNext().  That
2a640 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 70 74 69   routine is opti
2a650 6d 69 7a 65 64 0a 2a 2a 20 66 6f 72 20 74 68 65  mized.** for the
2a660 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 6f 66 20   common case of 
2a670 6d 65 72 65 6c 79 20 69 6e 63 72 65 6d 65 6e 74  merely increment
2a680 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 63 6f 75  ing the cell cou
2a690 6e 74 65 72 20 42 74 43 75 72 73 6f 72 2e 61 69  nter BtCursor.ai
2a6a0 49 64 78 0a 2a 2a 20 74 6f 20 74 68 65 20 6e 65  Idx.** to the ne
2a6b0 78 74 20 63 65 6c 6c 20 6f 6e 20 74 68 65 20 63  xt cell on the c
2a6c0 75 72 72 65 6e 74 20 70 61 67 65 2e 20 20 54 68  urrent page.  Th
2a6d0 65 20 28 73 6c 6f 77 65 72 29 20 62 74 72 65 65  e (slower) btree
2a6e0 4e 65 78 74 28 29 20 68 65 6c 70 65 72 0a 2a 2a  Next() helper.**
2a6f0 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
2a700 65 64 20 77 68 65 6e 20 69 74 20 69 73 20 6e 65  ed when it is ne
2a710 63 65 73 73 61 72 79 20 74 6f 20 6d 6f 76 65 20  cessary to move 
2a720 74 6f 20 61 20 64 69 66 66 65 72 65 6e 74 20 70  to a different p
2a730 61 67 65 20 6f 72 0a 2a 2a 20 74 6f 20 72 65 73  age or.** to res
2a740 74 6f 72 65 20 74 68 65 20 63 75 72 73 6f 72 2e  tore the cursor.
2a750 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 69  .**.** The calli
2a760 6e 67 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c  ng function will
2a770 20 73 65 74 20 2a 70 52 65 73 20 74 6f 20 30 20   set *pRes to 0 
2a780 6f 72 20 31 2e 20 20 54 68 65 20 69 6e 69 74 69  or 1.  The initi
2a790 61 6c 20 2a 70 52 65 73 20 76 61 6c 75 65 0a 2a  al *pRes value.*
2a7a0 2a 20 77 69 6c 6c 20 62 65 20 31 20 69 66 20 74  * will be 1 if t
2a7b0 68 65 20 63 75 72 73 6f 72 20 62 65 69 6e 67 20  he cursor being 
2a7c0 73 74 65 70 70 65 64 20 63 6f 72 72 65 73 70 6f  stepped correspo
2a7d0 6e 64 73 20 74 6f 20 61 6e 20 53 51 4c 20 69 6e  nds to an SQL in
2a7e0 64 65 78 20 61 6e 64 0a 2a 2a 20 69 66 20 74 68  dex and.** if th
2a7f0 69 73 20 72 6f 75 74 69 6e 65 20 63 6f 75 6c 64  is routine could
2a800 20 68 61 76 65 20 62 65 65 6e 20 73 6b 69 70 70   have been skipp
2a810 65 64 20 69 66 20 74 68 61 74 20 53 51 4c 20 69  ed if that SQL i
2a820 6e 64 65 78 20 68 61 64 20 62 65 65 6e 0a 2a 2a  ndex had been.**
2a830 20 61 20 75 6e 69 71 75 65 20 69 6e 64 65 78 2e   a unique index.
2a840 20 20 4f 74 68 65 72 77 69 73 65 20 74 68 65 20    Otherwise the 
2a850 63 61 6c 6c 65 72 20 77 69 6c 6c 20 68 61 76 65  caller will have
2a860 20 73 65 74 20 2a 70 52 65 73 20 74 6f 20 7a 65   set *pRes to ze
2a870 72 6f 2e 0a 2a 2a 20 5a 65 72 6f 20 69 73 20 74  ro..** Zero is t
2a880 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 2e 20  he common case. 
2a890 54 68 65 20 62 74 72 65 65 20 69 6d 70 6c 65 6d  The btree implem
2a8a0 65 6e 74 61 74 69 6f 6e 20 69 73 20 66 72 65 65  entation is free
2a8b0 20 74 6f 20 75 73 65 20 74 68 65 0a 2a 2a 20 69   to use the.** i
2a8c0 6e 69 74 69 61 6c 20 2a 70 52 65 73 20 76 61 6c  nitial *pRes val
2a8d0 75 65 20 61 73 20 61 20 68 69 6e 74 20 74 6f 20  ue as a hint to 
2a8e0 69 6d 70 72 6f 76 65 20 70 65 72 66 6f 72 6d 61  improve performa
2a8f0 6e 63 65 2c 20 62 75 74 20 74 68 65 20 63 75 72  nce, but the cur
2a900 72 65 6e 74 0a 2a 2a 20 53 51 4c 69 74 65 20 62  rent.** SQLite b
2a910 74 72 65 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74  tree implementat
2a920 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 2e 20 28 4e  ion does not. (N
2a930 6f 74 65 20 74 68 61 74 20 74 68 65 20 63 6f 6d  ote that the com
2a940 64 62 32 20 62 74 72 65 65 0a 2a 2a 20 69 6d 70  db2 btree.** imp
2a950 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 64 6f 65 73  lementation does
2a960 20 75 73 65 20 74 68 69 73 20 68 69 6e 74 2c 20   use this hint, 
2a970 68 6f 77 65 76 65 72 2e 29 0a 2a 2f 0a 73 74 61  however.).*/.sta
2a980 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c  tic SQLITE_NOINL
2a990 49 4e 45 20 69 6e 74 20 62 74 72 65 65 4e 65 78  INE int btreeNex
2a9a0 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  t(BtCursor *pCur
2a9b0 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20  , int *pRes){.  
2a9c0 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 69 64  int rc;.  int id
2a9d0 78 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  x;.  MemPage *pP
2a9e0 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  age;..  assert( 
2a9f0 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
2aa00 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
2aa10 72 74 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65  rt( pCur->skipNe
2aa20 78 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 65  xt==0 || pCur->e
2aa30 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41  State!=CURSOR_VA
2aa40 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28  LID );.  assert(
2aa50 20 2a 70 52 65 73 3d 3d 30 20 29 3b 0a 20 20 69   *pRes==0 );.  i
2aa60 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21  f( pCur->eState!
2aa70 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b  =CURSOR_VALID ){
2aa80 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70 43  .    assert( (pC
2aa90 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42  ur->curFlags & B
2aaa0 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3d 3d  TCF_ValidOvfl)==
2aab0 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 72 65  0 );.    rc = re
2aac0 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74  storeCursorPosit
2aad0 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 20 20 69  ion(pCur);.    i
2aae0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2aaf0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
2ab00 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69   rc;.    }.    i
2ab10 66 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  f( CURSOR_INVALI
2ab20 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20  D==pCur->eState 
2ab30 29 7b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d  ){.      *pRes =
2ab40 20 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   1;.      return
2ab50 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
2ab60 7d 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e  }.    if( pCur->
2ab70 73 6b 69 70 4e 65 78 74 20 29 7b 0a 20 20 20 20  skipNext ){.    
2ab80 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2ab90 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
2aba0 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e 65 53  ALID || pCur->eS
2abb0 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 53 4b 49  tate==CURSOR_SKI
2abc0 50 4e 45 58 54 20 29 3b 0a 20 20 20 20 20 20 70  PNEXT );.      p
2abd0 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
2abe0 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 20 20  RSOR_VALID;.    
2abf0 20 20 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70    if( pCur->skip
2ac00 4e 65 78 74 3e 30 20 29 7b 0a 20 20 20 20 20 20  Next>0 ){.      
2ac10 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74    pCur->skipNext
2ac20 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 65   = 0;.        re
2ac30 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2ac40 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 43        }.      pC
2ac50 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30  ur->skipNext = 0
2ac60 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70  ;.    }.  }..  p
2ac70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50  Page = pCur->apP
2ac80 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
2ac90 3b 0a 20 20 69 64 78 20 3d 20 2b 2b 70 43 75 72  ;.  idx = ++pCur
2aca0 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
2acb0 61 67 65 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  age];.  assert( 
2acc0 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b  pPage->isInit );
2acd0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61  ..  /* If the da
2ace0 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 63  tabase file is c
2acf0 6f 72 72 75 70 74 2c 20 69 74 20 69 73 20 70 6f  orrupt, it is po
2ad00 73 73 69 62 6c 65 20 66 6f 72 20 74 68 65 20 76  ssible for the v
2ad10 61 6c 75 65 20 6f 66 20 69 64 78 20 0a 20 20 2a  alue of idx .  *
2ad20 2a 20 74 6f 20 62 65 20 69 6e 76 61 6c 69 64 20  * to be invalid 
2ad30 68 65 72 65 2e 20 54 68 69 73 20 63 61 6e 20 6f  here. This can o
2ad40 6e 6c 79 20 6f 63 63 75 72 20 69 66 20 61 20 73  nly occur if a s
2ad50 65 63 6f 6e 64 20 63 75 72 73 6f 72 20 6d 6f 64  econd cursor mod
2ad60 69 66 69 65 73 0a 20 20 2a 2a 20 74 68 65 20 70  ifies.  ** the p
2ad70 61 67 65 20 77 68 69 6c 65 20 63 75 72 73 6f 72  age while cursor
2ad80 20 70 43 75 72 20 69 73 20 68 6f 6c 64 69 6e 67   pCur is holding
2ad90 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
2ada0 69 74 2e 20 57 68 69 63 68 20 63 61 6e 0a 20 20  it. Which can.  
2adb0 2a 2a 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 69  ** only happen i
2adc0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  f the database i
2add0 73 20 63 6f 72 72 75 70 74 20 69 6e 20 73 75 63  s corrupt in suc
2ade0 68 20 61 20 77 61 79 20 61 73 20 74 6f 20 6c 69  h a way as to li
2adf0 6e 6b 20 74 68 65 0a 20 20 2a 2a 20 70 61 67 65  nk the.  ** page
2ae00 20 69 6e 74 6f 20 6d 6f 72 65 20 74 68 61 6e 20   into more than 
2ae10 6f 6e 65 20 62 2d 74 72 65 65 20 73 74 72 75 63  one b-tree struc
2ae20 74 75 72 65 2e 20 2a 2f 0a 20 20 74 65 73 74 63  ture. */.  testc
2ae30 61 73 65 28 20 69 64 78 3e 70 50 61 67 65 2d 3e  ase( idx>pPage->
2ae40 6e 43 65 6c 6c 20 29 3b 0a 0a 20 20 69 66 28 20  nCell );..  if( 
2ae50 69 64 78 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c  idx>=pPage->nCel
2ae60 6c 20 29 7b 0a 20 20 20 20 69 66 28 20 21 70 50  l ){.    if( !pP
2ae70 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
2ae80 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68     rc = moveToCh
2ae90 69 6c 64 28 70 43 75 72 2c 20 67 65 74 34 62 79  ild(pCur, get4by
2aea0 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61  te(&pPage->aData
2aeb0 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
2aec0 74 2b 38 5d 29 29 3b 0a 20 20 20 20 20 20 69 66  t+8]));.      if
2aed0 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
2aee0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 6d  ;.      return m
2aef0 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43  oveToLeftmost(pC
2af00 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64  ur);.    }.    d
2af10 6f 7b 0a 20 20 20 20 20 20 69 66 28 20 70 43 75  o{.      if( pCu
2af20 72 2d 3e 69 50 61 67 65 3d 3d 30 20 29 7b 0a 20  r->iPage==0 ){. 
2af30 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31         *pRes = 1
2af40 3b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e  ;.        pCur->
2af50 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
2af60 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 20  INVALID;.       
2af70 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2af80 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  K;.      }.     
2af90 20 6d 6f 76 65 54 6f 50 61 72 65 6e 74 28 70 43   moveToParent(pC
2afa0 75 72 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65  ur);.      pPage
2afb0 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b   = pCur->apPage[
2afc0 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20  pCur->iPage];.  
2afd0 20 20 7d 77 68 69 6c 65 28 20 70 43 75 72 2d 3e    }while( pCur->
2afe0 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
2aff0 65 5d 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  e]>=pPage->nCell
2b000 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67   );.    if( pPag
2b010 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20  e->intKey ){.   
2b020 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65     return sqlite
2b030 33 42 74 72 65 65 4e 65 78 74 28 70 43 75 72 2c  3BtreeNext(pCur,
2b040 20 70 52 65 73 29 3b 0a 20 20 20 20 7d 65 6c 73   pRes);.    }els
2b050 65 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  e{.      return 
2b060 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
2b070 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65  .  }.  if( pPage
2b080 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 72 65  ->leaf ){.    re
2b090 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2b0a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74    }else{.    ret
2b0b0 75 72 6e 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f  urn moveToLeftmo
2b0c0 73 74 28 70 43 75 72 29 3b 0a 20 20 7d 0a 7d 0a  st(pCur);.  }.}.
2b0d0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
2b0e0 4e 65 78 74 28 42 74 43 75 72 73 6f 72 20 2a 70  Next(BtCursor *p
2b0f0 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b  Cur, int *pRes){
2b100 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
2b110 65 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  e;.  assert( cur
2b120 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
2b130 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
2b140 20 70 52 65 73 21 3d 30 20 29 3b 0a 20 20 61 73   pRes!=0 );.  as
2b150 73 65 72 74 28 20 2a 70 52 65 73 3d 3d 30 20 7c  sert( *pRes==0 |
2b160 7c 20 2a 70 52 65 73 3d 3d 31 20 29 3b 0a 20 20  | *pRes==1 );.  
2b170 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 73 6b  assert( pCur->sk
2b180 69 70 4e 65 78 74 3d 3d 30 20 7c 7c 20 70 43 75  ipNext==0 || pCu
2b190 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f  r->eState!=CURSO
2b1a0 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 70 43 75  R_VALID );.  pCu
2b1b0 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20  r->info.nSize = 
2b1c0 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72 46 6c  0;.  pCur->curFl
2b1d0 61 67 73 20 26 3d 20 7e 28 42 54 43 46 5f 56 61  ags &= ~(BTCF_Va
2b1e0 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56 61 6c  lidNKey|BTCF_Val
2b1f0 69 64 4f 76 66 6c 29 3b 0a 20 20 2a 70 52 65 73  idOvfl);.  *pRes
2b200 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 43 75 72   = 0;.  if( pCur
2b210 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52  ->eState!=CURSOR
2b220 5f 56 41 4c 49 44 20 29 20 72 65 74 75 72 6e 20  _VALID ) return 
2b230 62 74 72 65 65 4e 65 78 74 28 70 43 75 72 2c 20  btreeNext(pCur, 
2b240 70 52 65 73 29 3b 0a 20 20 70 50 61 67 65 20 3d  pRes);.  pPage =
2b250 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
2b260 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 69 66  ur->iPage];.  if
2b270 28 20 28 2b 2b 70 43 75 72 2d 3e 61 69 49 64 78  ( (++pCur->aiIdx
2b280 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 3e 3d  [pCur->iPage])>=
2b290 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a  pPage->nCell ){.
2b2a0 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b      pCur->aiIdx[
2b2b0 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 2d 3b 0a  pCur->iPage]--;.
2b2c0 20 20 20 20 72 65 74 75 72 6e 20 62 74 72 65 65      return btree
2b2d0 4e 65 78 74 28 70 43 75 72 2c 20 70 52 65 73 29  Next(pCur, pRes)
2b2e0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67  ;.  }.  if( pPag
2b2f0 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 72  e->leaf ){.    r
2b300 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2b310 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
2b320 74 75 72 6e 20 6d 6f 76 65 54 6f 4c 65 66 74 6d  turn moveToLeftm
2b330 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 7d 0a 7d  ost(pCur);.  }.}
2b340 0a 0a 2f 2a 0a 2a 2a 20 53 74 65 70 20 74 68 65  ../*.** Step the
2b350 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 62   cursor to the b
2b360 61 63 6b 20 74 6f 20 74 68 65 20 70 72 65 76 69  ack to the previ
2b370 6f 75 73 20 65 6e 74 72 79 20 69 6e 20 74 68 65  ous entry in the
2b380 20 64 61 74 61 62 61 73 65 2e 20 20 49 66 0a 2a   database.  If.*
2b390 2a 20 73 75 63 63 65 73 73 66 75 6c 20 74 68 65  * successful the
2b3a0 6e 20 73 65 74 20 2a 70 52 65 73 3d 30 2e 20 20  n set *pRes=0.  
2b3b0 49 66 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a  If the cursor.**
2b3c0 20 77 61 73 20 61 6c 72 65 61 64 79 20 70 6f 69   was already poi
2b3d0 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 66 69 72  nting to the fir
2b3e0 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  st entry in the 
2b3f0 64 61 74 61 62 61 73 65 20 62 65 66 6f 72 65 0a  database before.
2b400 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ** this routine 
2b410 77 61 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e  was called, then
2b420 20 73 65 74 20 2a 70 52 65 73 3d 31 2e 0a 2a 2a   set *pRes=1..**
2b430 0a 2a 2a 20 54 68 65 20 6d 61 69 6e 20 65 6e 74  .** The main ent
2b440 72 79 20 70 6f 69 6e 74 20 69 73 20 73 71 6c 69  ry point is sqli
2b450 74 65 33 42 74 72 65 65 50 72 65 76 69 6f 75 73  te3BtreePrevious
2b460 28 29 2e 20 20 54 68 61 74 20 72 6f 75 74 69 6e  ().  That routin
2b470 65 20 69 73 20 6f 70 74 69 6d 69 7a 65 64 0a 2a  e is optimized.*
2b480 2a 20 66 6f 72 20 74 68 65 20 63 6f 6d 6d 6f 6e  * for the common
2b490 20 63 61 73 65 20 6f 66 20 6d 65 72 65 6c 79 20   case of merely 
2b4a0 64 65 63 72 65 6d 65 6e 74 69 6e 67 20 74 68 65  decrementing the
2b4b0 20 63 65 6c 6c 20 63 6f 75 6e 74 65 72 20 42 74   cell counter Bt
2b4c0 43 75 72 73 6f 72 2e 61 69 49 64 78 0a 2a 2a 20  Cursor.aiIdx.** 
2b4d0 74 6f 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  to the previous 
2b4e0 63 65 6c 6c 20 6f 6e 20 74 68 65 20 63 75 72 72  cell on the curr
2b4f0 65 6e 74 20 70 61 67 65 2e 20 20 54 68 65 20 28  ent page.  The (
2b500 73 6c 6f 77 65 72 29 20 62 74 72 65 65 50 72 65  slower) btreePre
2b510 76 69 6f 75 73 28 29 0a 2a 2a 20 68 65 6c 70 65  vious().** helpe
2b520 72 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  r routine is cal
2b530 6c 65 64 20 77 68 65 6e 20 69 74 20 69 73 20 6e  led when it is n
2b540 65 63 65 73 73 61 72 79 20 74 6f 20 6d 6f 76 65  ecessary to move
2b550 20 74 6f 20 61 20 64 69 66 66 65 72 65 6e 74 20   to a different 
2b560 70 61 67 65 0a 2a 2a 20 6f 72 20 74 6f 20 72 65  page.** or to re
2b570 73 74 6f 72 65 20 74 68 65 20 63 75 72 73 6f 72  store the cursor
2b580 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c  ..**.** The call
2b590 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c  ing function wil
2b5a0 6c 20 73 65 74 20 2a 70 52 65 73 20 74 6f 20 30  l set *pRes to 0
2b5b0 20 6f 72 20 31 2e 20 20 54 68 65 20 69 6e 69 74   or 1.  The init
2b5c0 69 61 6c 20 2a 70 52 65 73 20 76 61 6c 75 65 0a  ial *pRes value.
2b5d0 2a 2a 20 77 69 6c 6c 20 62 65 20 31 20 69 66 20  ** will be 1 if 
2b5e0 74 68 65 20 63 75 72 73 6f 72 20 62 65 69 6e 67  the cursor being
2b5f0 20 73 74 65 70 70 65 64 20 63 6f 72 72 65 73 70   stepped corresp
2b600 6f 6e 64 73 20 74 6f 20 61 6e 20 53 51 4c 20 69  onds to an SQL i
2b610 6e 64 65 78 20 61 6e 64 0a 2a 2a 20 69 66 20 74  ndex and.** if t
2b620 68 69 73 20 72 6f 75 74 69 6e 65 20 63 6f 75 6c  his routine coul
2b630 64 20 68 61 76 65 20 62 65 65 6e 20 73 6b 69 70  d have been skip
2b640 70 65 64 20 69 66 20 74 68 61 74 20 53 51 4c 20  ped if that SQL 
2b650 69 6e 64 65 78 20 68 61 64 20 62 65 65 6e 0a 2a  index had been.*
2b660 2a 20 61 20 75 6e 69 71 75 65 20 69 6e 64 65 78  * a unique index
2b670 2e 20 20 4f 74 68 65 72 77 69 73 65 20 74 68 65  .  Otherwise the
2b680 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 68 61 76   caller will hav
2b690 65 20 73 65 74 20 2a 70 52 65 73 20 74 6f 20 7a  e set *pRes to z
2b6a0 65 72 6f 2e 0a 2a 2a 20 5a 65 72 6f 20 69 73 20  ero..** Zero is 
2b6b0 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 2e  the common case.
2b6c0 20 54 68 65 20 62 74 72 65 65 20 69 6d 70 6c 65   The btree imple
2b6d0 6d 65 6e 74 61 74 69 6f 6e 20 69 73 20 66 72 65  mentation is fre
2b6e0 65 20 74 6f 20 75 73 65 20 74 68 65 0a 2a 2a 20  e to use the.** 
2b6f0 69 6e 69 74 69 61 6c 20 2a 70 52 65 73 20 76 61  initial *pRes va
2b700 6c 75 65 20 61 73 20 61 20 68 69 6e 74 20 74 6f  lue as a hint to
2b710 20 69 6d 70 72 6f 76 65 20 70 65 72 66 6f 72 6d   improve perform
2b720 61 6e 63 65 2c 20 62 75 74 20 74 68 65 20 63 75  ance, but the cu
2b730 72 72 65 6e 74 0a 2a 2a 20 53 51 4c 69 74 65 20  rrent.** SQLite 
2b740 62 74 72 65 65 20 69 6d 70 6c 65 6d 65 6e 74 61  btree implementa
2b750 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 2e 20 28  tion does not. (
2b760 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 63 6f  Note that the co
2b770 6d 64 62 32 20 62 74 72 65 65 0a 2a 2a 20 69 6d  mdb2 btree.** im
2b780 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 64 6f 65  plementation doe
2b790 73 20 75 73 65 20 74 68 69 73 20 68 69 6e 74 2c  s use this hint,
2b7a0 20 68 6f 77 65 76 65 72 2e 29 0a 2a 2f 0a 73 74   however.).*/.st
2b7b0 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e  atic SQLITE_NOIN
2b7c0 4c 49 4e 45 20 69 6e 74 20 62 74 72 65 65 50 72  LINE int btreePr
2b7d0 65 76 69 6f 75 73 28 42 74 43 75 72 73 6f 72 20  evious(BtCursor 
2b7e0 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73  *pCur, int *pRes
2b7f0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d  ){.  int rc;.  M
2b800 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a  emPage *pPage;..
2b810 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
2b820 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
2b830 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 52   );.  assert( pR
2b840 65 73 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  es!=0 );.  asser
2b850 74 28 20 2a 70 52 65 73 3d 3d 30 20 29 3b 0a 20  t( *pRes==0 );. 
2b860 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 73   assert( pCur->s
2b870 6b 69 70 4e 65 78 74 3d 3d 30 20 7c 7c 20 70 43  kipNext==0 || pC
2b880 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53  ur->eState!=CURS
2b890 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73  OR_VALID );.  as
2b8a0 73 65 72 74 28 20 28 70 43 75 72 2d 3e 63 75 72  sert( (pCur->cur
2b8b0 46 6c 61 67 73 20 26 20 28 42 54 43 46 5f 41 74  Flags & (BTCF_At
2b8c0 4c 61 73 74 7c 42 54 43 46 5f 56 61 6c 69 64 4f  Last|BTCF_ValidO
2b8d0 76 66 6c 7c 42 54 43 46 5f 56 61 6c 69 64 4e 4b  vfl|BTCF_ValidNK
2b8e0 65 79 29 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73  ey))==0 );.  ass
2b8f0 65 72 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  ert( pCur->info.
2b900 6e 53 69 7a 65 3d 3d 30 20 29 3b 0a 20 20 69 66  nSize==0 );.  if
2b910 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d  ( pCur->eState!=
2b920 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a  CURSOR_VALID ){.
2b930 20 20 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65      rc = restore
2b940 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70  CursorPosition(p
2b950 43 75 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63  Cur);.    if( rc
2b960 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2b970 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
2b980 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 43 55      }.    if( CU
2b990 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43  RSOR_INVALID==pC
2b9a0 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20  ur->eState ){.  
2b9b0 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20      *pRes = 1;. 
2b9c0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
2b9d0 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20  TE_OK;.    }.   
2b9e0 20 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e   if( pCur->skipN
2b9f0 65 78 74 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ext ){.      ass
2ba00 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
2ba10 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
2ba20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  || pCur->eState=
2ba30 3d 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54  =CURSOR_SKIPNEXT
2ba40 20 29 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e   );.      pCur->
2ba50 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
2ba60 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 69 66 28  VALID;.      if(
2ba70 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3c   pCur->skipNext<
2ba80 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75  0 ){.        pCu
2ba90 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b  r->skipNext = 0;
2baa0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
2bab0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
2bac0 20 7d 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 73   }.      pCur->s
2bad0 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20  kipNext = 0;.   
2bae0 20 7d 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 20   }.  }..  pPage 
2baf0 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  = pCur->apPage[p
2bb00 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 61  Cur->iPage];.  a
2bb10 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73  ssert( pPage->is
2bb20 49 6e 69 74 20 29 3b 0a 20 20 69 66 28 20 21 70  Init );.  if( !p
2bb30 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
2bb40 20 20 69 6e 74 20 69 64 78 20 3d 20 70 43 75 72    int idx = pCur
2bb50 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
2bb60 61 67 65 5d 3b 0a 20 20 20 20 72 63 20 3d 20 6d  age];.    rc = m
2bb70 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c  oveToChild(pCur,
2bb80 20 67 65 74 34 62 79 74 65 28 66 69 6e 64 43 65   get4byte(findCe
2bb90 6c 6c 28 70 50 61 67 65 2c 20 69 64 78 29 29 29  ll(pPage, idx)))
2bba0 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  ;.    if( rc ) r
2bbb0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 72 63  eturn rc;.    rc
2bbc0 20 3d 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f   = moveToRightmo
2bbd0 73 74 28 70 43 75 72 29 3b 0a 20 20 7d 65 6c 73  st(pCur);.  }els
2bbe0 65 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 43  e{.    while( pC
2bbf0 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
2bc00 69 50 61 67 65 5d 3d 3d 30 20 29 7b 0a 20 20 20  iPage]==0 ){.   
2bc10 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61     if( pCur->iPa
2bc20 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ge==0 ){.       
2bc30 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
2bc40 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a  CURSOR_INVALID;.
2bc50 20 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20          *pRes = 
2bc60 31 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  1;.        retur
2bc70 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
2bc80 20 20 20 7d 0a 20 20 20 20 20 20 6d 6f 76 65 54     }.      moveT
2bc90 6f 50 61 72 65 6e 74 28 70 43 75 72 29 3b 0a 20  oParent(pCur);. 
2bca0 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
2bcb0 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
2bcc0 65 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  e==0 );.    asse
2bcd0 72 74 28 20 28 70 43 75 72 2d 3e 63 75 72 46 6c  rt( (pCur->curFl
2bce0 61 67 73 20 26 20 28 42 54 43 46 5f 56 61 6c 69  ags & (BTCF_Vali
2bcf0 64 4e 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69 64  dNKey|BTCF_Valid
2bd00 4f 76 66 6c 29 29 3d 3d 30 20 29 3b 0a 0a 20 20  Ovfl))==0 );..  
2bd10 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43    pCur->aiIdx[pC
2bd20 75 72 2d 3e 69 50 61 67 65 5d 2d 2d 3b 0a 20 20  ur->iPage]--;.  
2bd30 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e    pPage = pCur->
2bd40 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
2bd50 67 65 5d 3b 0a 20 20 20 20 69 66 28 20 70 50 61  ge];.    if( pPa
2bd60 67 65 2d 3e 69 6e 74 4b 65 79 20 26 26 20 21 70  ge->intKey && !p
2bd70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
2bd80 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2bd90 42 74 72 65 65 50 72 65 76 69 6f 75 73 28 70 43  BtreePrevious(pC
2bda0 75 72 2c 20 70 52 65 73 29 3b 0a 20 20 20 20 7d  ur, pRes);.    }
2bdb0 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
2bdc0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
2bdd0 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
2bde0 63 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33  c;.}.int sqlite3
2bdf0 42 74 72 65 65 50 72 65 76 69 6f 75 73 28 42 74  BtreePrevious(Bt
2be00 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e  Cursor *pCur, in
2be10 74 20 2a 70 52 65 73 29 7b 0a 20 20 61 73 73 65  t *pRes){.  asse
2be20 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
2be30 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
2be40 61 73 73 65 72 74 28 20 70 52 65 73 21 3d 30 20  assert( pRes!=0 
2be50 29 3b 0a 20 20 61 73 73 65 72 74 28 20 2a 70 52  );.  assert( *pR
2be60 65 73 3d 3d 30 20 7c 7c 20 2a 70 52 65 73 3d 3d  es==0 || *pRes==
2be70 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  1 );.  assert( p
2be80 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d 30  Cur->skipNext==0
2be90 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65   || pCur->eState
2bea0 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  !=CURSOR_VALID )
2beb0 3b 0a 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20  ;.  *pRes = 0;. 
2bec0 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20   pCur->curFlags 
2bed0 26 3d 20 7e 28 42 54 43 46 5f 41 74 4c 61 73 74  &= ~(BTCF_AtLast
2bee0 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 7c  |BTCF_ValidOvfl|
2bef0 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 29 3b  BTCF_ValidNKey);
2bf00 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53  .  pCur->info.nS
2bf10 69 7a 65 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  ize = 0;.  if( p
2bf20 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52  Cur->eState!=CUR
2bf30 53 4f 52 5f 56 41 4c 49 44 0a 20 20 20 7c 7c 20  SOR_VALID.   || 
2bf40 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
2bf50 2d 3e 69 50 61 67 65 5d 3d 3d 30 0a 20 20 20 7c  ->iPage]==0.   |
2bf60 7c 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  | pCur->apPage[p
2bf70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6c 65 61  Cur->iPage]->lea
2bf80 66 3d 3d 30 0a 20 20 29 7b 0a 20 20 20 20 72 65  f==0.  ){.    re
2bf90 74 75 72 6e 20 62 74 72 65 65 50 72 65 76 69 6f  turn btreePrevio
2bfa0 75 73 28 70 43 75 72 2c 20 70 52 65 73 29 3b 0a  us(pCur, pRes);.
2bfb0 20 20 7d 0a 20 20 70 43 75 72 2d 3e 61 69 49 64    }.  pCur->aiId
2bfc0 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 2d  x[pCur->iPage]--
2bfd0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
2bfe0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  E_OK;.}../*.** A
2bff0 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 70 61  llocate a new pa
2c000 67 65 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ge from the data
2c010 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  base file..**.**
2c020 20 54 68 65 20 6e 65 77 20 70 61 67 65 20 69 73   The new page is
2c030 20 6d 61 72 6b 65 64 20 61 73 20 64 69 72 74 79   marked as dirty
2c040 2e 20 20 28 49 6e 20 6f 74 68 65 72 20 77 6f 72  .  (In other wor
2c050 64 73 2c 20 73 71 6c 69 74 65 33 50 61 67 65 72  ds, sqlite3Pager
2c060 57 72 69 74 65 28 29 0a 2a 2a 20 68 61 73 20 61  Write().** has a
2c070 6c 72 65 61 64 79 20 62 65 65 6e 20 63 61 6c 6c  lready been call
2c080 65 64 20 6f 6e 20 74 68 65 20 6e 65 77 20 70 61  ed on the new pa
2c090 67 65 2e 29 20 20 54 68 65 20 6e 65 77 20 70 61  ge.)  The new pa
2c0a0 67 65 20 68 61 73 20 61 6c 73 6f 0a 2a 2a 20 62  ge has also.** b
2c0b0 65 65 6e 20 72 65 66 65 72 65 6e 63 65 64 20 61  een referenced a
2c0c0 6e 64 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 72  nd the calling r
2c0d0 6f 75 74 69 6e 65 20 69 73 20 72 65 73 70 6f 6e  outine is respon
2c0e0 73 69 62 6c 65 20 66 6f 72 20 63 61 6c 6c 69 6e  sible for callin
2c0f0 67 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65  g.** sqlite3Page
2c100 72 55 6e 72 65 66 28 29 20 6f 6e 20 74 68 65 20  rUnref() on the 
2c110 6e 65 77 20 70 61 67 65 20 77 68 65 6e 20 69 74  new page when it
2c120 20 69 73 20 64 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20   is done..**.** 
2c130 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
2c140 75 72 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73  urned on success
2c150 2e 20 20 41 6e 79 20 6f 74 68 65 72 20 72 65 74  .  Any other ret
2c160 75 72 6e 20 76 61 6c 75 65 20 69 6e 64 69 63 61  urn value indica
2c170 74 65 73 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 2e  tes.** an error.
2c180 20 20 2a 70 70 50 61 67 65 20 61 6e 64 20 2a 70    *ppPage and *p
2c190 50 67 6e 6f 20 61 72 65 20 75 6e 64 65 66 69 6e  Pgno are undefin
2c1a0 65 64 20 69 6e 20 74 68 65 20 65 76 65 6e 74 20  ed in the event 
2c1b0 6f 66 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a 20  of an error..** 
2c1c0 44 6f 20 6e 6f 74 20 69 6e 76 6f 6b 65 20 73 71  Do not invoke sq
2c1d0 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
2c1e0 29 20 6f 6e 20 2a 70 70 50 61 67 65 20 69 66 20  ) on *ppPage if 
2c1f0 61 6e 20 65 72 72 6f 72 20 69 73 20 72 65 74 75  an error is retu
2c200 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  rned..**.** If t
2c210 68 65 20 22 6e 65 61 72 62 79 22 20 70 61 72 61  he "nearby" para
2c220 6d 65 74 65 72 20 69 73 20 6e 6f 74 20 30 2c 20  meter is not 0, 
2c230 74 68 65 6e 20 61 6e 20 65 66 66 6f 72 74 20 69  then an effort i
2c240 73 20 6d 61 64 65 20 74 6f 20 0a 2a 2a 20 6c 6f  s made to .** lo
2c250 63 61 74 65 20 61 20 70 61 67 65 20 63 6c 6f 73  cate a page clos
2c260 65 20 74 6f 20 74 68 65 20 70 61 67 65 20 6e 75  e to the page nu
2c270 6d 62 65 72 20 22 6e 65 61 72 62 79 22 2e 20 20  mber "nearby".  
2c280 54 68 69 73 20 63 61 6e 20 62 65 20 75 73 65 64  This can be used
2c290 20 69 6e 20 61 6e 0a 2a 2a 20 61 74 74 65 6d 70   in an.** attemp
2c2a0 74 20 74 6f 20 6b 65 65 70 20 72 65 6c 61 74 65  t to keep relate
2c2b0 64 20 70 61 67 65 73 20 63 6c 6f 73 65 20 74 6f  d pages close to
2c2c0 20 65 61 63 68 20 6f 74 68 65 72 20 69 6e 20 74   each other in t
2c2d0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2c2e0 2c 0a 2a 2a 20 77 68 69 63 68 20 69 6e 20 74 75  ,.** which in tu
2c2f0 72 6e 20 63 61 6e 20 6d 61 6b 65 20 64 61 74 61  rn can make data
2c300 62 61 73 65 20 61 63 63 65 73 73 20 66 61 73 74  base access fast
2c310 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  er..**.** If the
2c320 20 65 4d 6f 64 65 20 70 61 72 61 6d 65 74 65 72   eMode parameter
2c330 20 69 73 20 42 54 41 4c 4c 4f 43 5f 45 58 41 43   is BTALLOC_EXAC
2c340 54 20 61 6e 64 20 74 68 65 20 6e 65 61 72 62 79  T and the nearby
2c350 20 70 61 67 65 20 65 78 69 73 74 73 0a 2a 2a 20   page exists.** 
2c360 61 6e 79 77 68 65 72 65 20 6f 6e 20 74 68 65 20  anywhere on the 
2c370 66 72 65 65 2d 6c 69 73 74 2c 20 74 68 65 6e 20  free-list, then 
2c380 69 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  it is guaranteed
2c390 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64 2e   to be returned.
2c3a0 20 20 49 66 0a 2a 2a 20 65 4d 6f 64 65 20 69 73    If.** eMode is
2c3b0 20 42 54 41 4c 4c 4f 43 5f 4c 54 20 74 68 65 6e   BTALLOC_LT then
2c3c0 20 74 68 65 20 70 61 67 65 20 72 65 74 75 72 6e   the page return
2c3d0 65 64 20 77 69 6c 6c 20 62 65 20 6c 65 73 73 20  ed will be less 
2c3e0 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 0a 2a 2a  than or equal.**
2c3f0 20 74 6f 20 6e 65 61 72 62 79 20 69 66 20 61 6e   to nearby if an
2c400 79 20 73 75 63 68 20 70 61 67 65 20 65 78 69 73  y such page exis
2c410 74 73 2e 20 20 49 66 20 65 4d 6f 64 65 20 69 73  ts.  If eMode is
2c420 20 42 54 41 4c 4c 4f 43 5f 41 4e 59 20 74 68 65   BTALLOC_ANY the
2c430 6e 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e  n there.** are n
2c440 6f 20 72 65 73 74 72 69 63 74 69 6f 6e 73 20 6f  o restrictions o
2c450 6e 20 77 68 69 63 68 20 70 61 67 65 20 69 73 20  n which page is 
2c460 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
2c470 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65  tic int allocate
2c480 42 74 72 65 65 50 61 67 65 28 0a 20 20 42 74 53  BtreePage(.  BtS
2c490 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20  hared *pBt,     
2c4a0 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65      /* The btree
2c4b0 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a   */.  MemPage **
2c4c0 70 70 50 61 67 65 2c 20 20 20 20 20 20 2f 2a 20  ppPage,      /* 
2c4d0 53 74 6f 72 65 20 70 6f 69 6e 74 65 72 20 74 6f  Store pointer to
2c4e0 20 74 68 65 20 61 6c 6c 6f 63 61 74 65 64 20 70   the allocated p
2c4f0 61 67 65 20 68 65 72 65 20 2a 2f 0a 20 20 50 67  age here */.  Pg
2c500 6e 6f 20 2a 70 50 67 6e 6f 2c 20 20 20 20 20 20  no *pPgno,      
2c510 20 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 74 68       /* Store th
2c520 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 68 65  e page number he
2c530 72 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 65 61  re */.  Pgno nea
2c540 72 62 79 2c 20 20 20 20 20 20 20 20 20 20 20 2f  rby,           /
2c550 2a 20 53 65 61 72 63 68 20 66 6f 72 20 61 20 70  * Search for a p
2c560 61 67 65 20 6e 65 61 72 20 74 68 69 73 20 6f 6e  age near this on
2c570 65 20 2a 2f 0a 20 20 75 38 20 65 4d 6f 64 65 20  e */.  u8 eMode 
2c580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2c590 20 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 2c 20   BTALLOC_EXACT, 
2c5a0 42 54 41 4c 4c 4f 43 5f 4c 54 2c 20 6f 72 20 42  BTALLOC_LT, or B
2c5b0 54 41 4c 4c 4f 43 5f 41 4e 59 20 2a 2f 0a 29 7b  TALLOC_ANY */.){
2c5c0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
2c5d0 65 31 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  e1;.  int rc;.  
2c5e0 75 33 32 20 6e 3b 20 20 20 20 20 2f 2a 20 4e 75  u32 n;     /* Nu
2c5f0 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 6f 6e  mber of pages on
2c600 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 2a 2f   the freelist */
2c610 0a 20 20 75 33 32 20 6b 3b 20 20 20 20 20 2f 2a  .  u32 k;     /*
2c620 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65 61 76 65   Number of leave
2c630 73 20 6f 6e 20 74 68 65 20 74 72 75 6e 6b 20 6f  s on the trunk o
2c640 66 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 2a  f the freelist *
2c650 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 72  /.  MemPage *pTr
2c660 75 6e 6b 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61  unk = 0;.  MemPa
2c670 67 65 20 2a 70 50 72 65 76 54 72 75 6e 6b 20 3d  ge *pPrevTrunk =
2c680 20 30 3b 0a 20 20 50 67 6e 6f 20 6d 78 50 61 67   0;.  Pgno mxPag
2c690 65 3b 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20  e;     /* Total 
2c6a0 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
2c6b0 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20  base file */..  
2c6c0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
2c6d0 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
2c6e0 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
2c6f0 72 74 28 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c  rt( eMode==BTALL
2c700 4f 43 5f 41 4e 59 20 7c 7c 20 28 6e 65 61 72 62  OC_ANY || (nearb
2c710 79 3e 30 20 26 26 20 49 66 4e 6f 74 4f 6d 69 74  y>0 && IfNotOmit
2c720 41 56 28 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  AV(pBt->autoVacu
2c730 75 6d 29 29 20 29 3b 0a 20 20 70 50 61 67 65 31  um)) );.  pPage1
2c740 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a   = pBt->pPage1;.
2c750 20 20 6d 78 50 61 67 65 20 3d 20 62 74 72 65 65    mxPage = btree
2c760 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 3b 0a  Pagecount(pBt);.
2c770 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
2c780 3a 20 52 2d 30 35 31 31 39 2d 30 32 36 33 37 20  : R-05119-02637 
2c790 54 68 65 20 34 2d 62 79 74 65 20 62 69 67 2d 65  The 4-byte big-e
2c7a0 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 61 74  ndian integer at
2c7b0 20 6f 66 66 73 65 74 20 33 36 0a 20 20 2a 2a 20   offset 36.  ** 
2c7c0 73 74 6f 72 65 73 20 73 74 6f 72 65 73 20 74 68  stores stores th
2c7d0 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  e total number o
2c7e0 66 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66  f pages on the f
2c7f0 72 65 65 6c 69 73 74 2e 20 2a 2f 0a 20 20 6e 20  reelist. */.  n 
2c800 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67  = get4byte(&pPag
2c810 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a  e1->aData[36]);.
2c820 20 20 74 65 73 74 63 61 73 65 28 20 6e 3d 3d 6d    testcase( n==m
2c830 78 50 61 67 65 2d 31 20 29 3b 0a 20 20 69 66 28  xPage-1 );.  if(
2c840 20 6e 3e 3d 6d 78 50 61 67 65 20 29 7b 0a 20 20   n>=mxPage ){.  
2c850 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2c860 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
2c870 7d 0a 20 20 69 66 28 20 6e 3e 30 20 29 7b 0a 20  }.  if( n>0 ){. 
2c880 20 20 20 2f 2a 20 54 68 65 72 65 20 61 72 65 20     /* There are 
2c890 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65  pages on the fre
2c8a0 65 6c 69 73 74 2e 20 20 52 65 75 73 65 20 6f 6e  elist.  Reuse on
2c8b0 65 20 6f 66 20 74 68 6f 73 65 20 70 61 67 65 73  e of those pages
2c8c0 2e 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 69 54  . */.    Pgno iT
2c8d0 72 75 6e 6b 3b 0a 20 20 20 20 75 38 20 73 65 61  runk;.    u8 sea
2c8e0 72 63 68 4c 69 73 74 20 3d 20 30 3b 20 2f 2a 20  rchList = 0; /* 
2c8f0 49 66 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  If the free-list
2c900 20 6d 75 73 74 20 62 65 20 73 65 61 72 63 68 65   must be searche
2c910 64 20 66 6f 72 20 27 6e 65 61 72 62 79 27 20 2a  d for 'nearby' *
2c920 2f 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20 49 66  /.    .    /* If
2c930 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f   eMode==BTALLOC_
2c940 45 58 41 43 54 20 61 6e 64 20 61 20 71 75 65 72  EXACT and a quer
2c950 79 20 6f 66 20 74 68 65 20 70 6f 69 6e 74 65 72  y of the pointer
2c960 2d 6d 61 70 0a 20 20 20 20 2a 2a 20 73 68 6f 77  -map.    ** show
2c970 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  s that the page 
2c980 27 6e 65 61 72 62 79 27 20 69 73 20 73 6f 6d 65  'nearby' is some
2c990 77 68 65 72 65 20 6f 6e 20 74 68 65 20 66 72 65  where on the fre
2c9a0 65 2d 6c 69 73 74 2c 20 74 68 65 6e 0a 20 20 20  e-list, then.   
2c9b0 20 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 2d 6c   ** the entire-l
2c9c0 69 73 74 20 77 69 6c 6c 20 62 65 20 73 65 61 72  ist will be sear
2c9d0 63 68 65 64 20 66 6f 72 20 74 68 61 74 20 70 61  ched for that pa
2c9e0 67 65 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 6e 64  ge..    */.#ifnd
2c9f0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
2ca00 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66  UTOVACUUM.    if
2ca10 28 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43  ( eMode==BTALLOC
2ca20 5f 45 58 41 43 54 20 29 7b 0a 20 20 20 20 20 20  _EXACT ){.      
2ca30 69 66 28 20 6e 65 61 72 62 79 3c 3d 6d 78 50 61  if( nearby<=mxPa
2ca40 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20 75 38  ge ){.        u8
2ca50 20 65 54 79 70 65 3b 0a 20 20 20 20 20 20 20 20   eType;.        
2ca60 61 73 73 65 72 74 28 20 6e 65 61 72 62 79 3e 30  assert( nearby>0
2ca70 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
2ca80 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  rt( pBt->autoVac
2ca90 75 75 6d 20 29 3b 0a 20 20 20 20 20 20 20 20 72  uum );.        r
2caa0 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70 42  c = ptrmapGet(pB
2cab0 74 2c 20 6e 65 61 72 62 79 2c 20 26 65 54 79 70  t, nearby, &eTyp
2cac0 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69  e, 0);.        i
2cad0 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
2cae0 63 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 65  c;.        if( e
2caf0 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45  Type==PTRMAP_FRE
2cb00 45 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20 20  EPAGE ){.       
2cb10 20 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20     searchList = 
2cb20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  1;.        }.   
2cb30 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69     }.    }else i
2cb40 66 28 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f  f( eMode==BTALLO
2cb50 43 5f 4c 45 20 29 7b 0a 20 20 20 20 20 20 73 65  C_LE ){.      se
2cb60 61 72 63 68 4c 69 73 74 20 3d 20 31 3b 0a 20 20  archList = 1;.  
2cb70 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20    }.#endif..    
2cb80 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65  /* Decrement the
2cb90 20 66 72 65 65 2d 6c 69 73 74 20 63 6f 75 6e 74   free-list count
2cba0 20 62 79 20 31 2e 20 53 65 74 20 69 54 72 75 6e   by 1. Set iTrun
2cbb0 6b 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f  k to the index o
2cbc0 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 66 69 72  f the.    ** fir
2cbd0 73 74 20 66 72 65 65 2d 6c 69 73 74 20 74 72 75  st free-list tru
2cbe0 6e 6b 20 70 61 67 65 2e 20 69 50 72 65 76 54 72  nk page. iPrevTr
2cbf0 75 6e 6b 20 69 73 20 69 6e 69 74 69 61 6c 6c 79  unk is initially
2cc00 20 31 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72   1..    */.    r
2cc10 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
2cc20 57 72 69 74 65 28 70 50 61 67 65 31 2d 3e 70 44  Write(pPage1->pD
2cc30 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
2cc40 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
2cc50 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50      put4byte(&pP
2cc60 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c  age1->aData[36],
2cc70 20 6e 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 54   n-1);..    /* T
2cc80 68 65 20 63 6f 64 65 20 77 69 74 68 69 6e 20 74  he code within t
2cc90 68 69 73 20 6c 6f 6f 70 20 69 73 20 72 75 6e 20  his loop is run 
2cca0 6f 6e 6c 79 20 6f 6e 63 65 20 69 66 20 74 68 65  only once if the
2ccb0 20 27 73 65 61 72 63 68 4c 69 73 74 27 20 76 61   'searchList' va
2ccc0 72 69 61 62 6c 65 0a 20 20 20 20 2a 2a 20 69 73  riable.    ** is
2ccd0 20 6e 6f 74 20 74 72 75 65 2e 20 4f 74 68 65 72   not true. Other
2cce0 77 69 73 65 2c 20 69 74 20 72 75 6e 73 20 6f 6e  wise, it runs on
2ccf0 63 65 20 66 6f 72 20 65 61 63 68 20 74 72 75 6e  ce for each trun
2cd00 6b 2d 70 61 67 65 20 6f 6e 20 74 68 65 0a 20 20  k-page on the.  
2cd10 20 20 2a 2a 20 66 72 65 65 2d 6c 69 73 74 20 75    ** free-list u
2cd20 6e 74 69 6c 20 74 68 65 20 70 61 67 65 20 27 6e  ntil the page 'n
2cd30 65 61 72 62 79 27 20 69 73 20 6c 6f 63 61 74 65  earby' is locate
2cd40 64 20 28 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f  d (eMode==BTALLO
2cd50 43 5f 45 58 41 43 54 29 0a 20 20 20 20 2a 2a 20  C_EXACT).    ** 
2cd60 6f 72 20 75 6e 74 69 6c 20 61 20 70 61 67 65 20  or until a page 
2cd70 6c 65 73 73 20 74 68 61 6e 20 27 6e 65 61 72 62  less than 'nearb
2cd80 79 27 20 69 73 20 6c 6f 63 61 74 65 64 20 28 65  y' is located (e
2cd90 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 54  Mode==BTALLOC_LT
2cda0 29 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 6f 20  ).    */.    do 
2cdb0 7b 0a 20 20 20 20 20 20 70 50 72 65 76 54 72 75  {.      pPrevTru
2cdc0 6e 6b 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20  nk = pTrunk;.   
2cdd0 20 20 20 69 66 28 20 70 50 72 65 76 54 72 75 6e     if( pPrevTrun
2cde0 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  k ){.        /* 
2cdf0 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30  EVIDENCE-OF: R-0
2ce00 31 35 30 36 2d 31 31 30 35 33 20 54 68 65 20 66  1506-11053 The f
2ce10 69 72 73 74 20 69 6e 74 65 67 65 72 20 6f 6e 20  irst integer on 
2ce20 61 20 66 72 65 65 6c 69 73 74 20 74 72 75 6e 6b  a freelist trunk
2ce30 20 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a   page.        **
2ce40 20 69 73 20 74 68 65 20 70 61 67 65 20 6e 75 6d   is the page num
2ce50 62 65 72 20 6f 66 20 74 68 65 20 6e 65 78 74 20  ber of the next 
2ce60 66 72 65 65 6c 69 73 74 20 74 72 75 6e 6b 20 70  freelist trunk p
2ce70 61 67 65 20 69 6e 20 74 68 65 20 6c 69 73 74 20  age in the list 
2ce80 6f 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 7a 65  or.        ** ze
2ce90 72 6f 20 69 66 20 74 68 69 73 20 69 73 20 74 68  ro if this is th
2cea0 65 20 6c 61 73 74 20 66 72 65 65 6c 69 73 74 20  e last freelist 
2ceb0 74 72 75 6e 6b 20 70 61 67 65 2e 20 2a 2f 0a 20  trunk page. */. 
2cec0 20 20 20 20 20 20 20 69 54 72 75 6e 6b 20 3d 20         iTrunk = 
2ced0 67 65 74 34 62 79 74 65 28 26 70 50 72 65 76 54  get4byte(&pPrevT
2cee0 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 29 3b  runk->aData[0]);
2cef0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
2cf00 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43        /* EVIDENC
2cf10 45 2d 4f 46 3a 20 52 2d 35 39 38 34 31 2d 31 33  E-OF: R-59841-13
2cf20 37 39 38 20 54 68 65 20 34 2d 62 79 74 65 20 62  798 The 4-byte b
2cf30 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65  ig-endian intege
2cf40 72 20 61 74 20 6f 66 66 73 65 74 20 33 32 0a 20  r at offset 32. 
2cf50 20 20 20 20 20 20 20 2a 2a 20 73 74 6f 72 65 73         ** stores
2cf60 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
2cf70 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 70 61   of the first pa
2cf80 67 65 20 6f 66 20 74 68 65 20 66 72 65 65 6c 69  ge of the freeli
2cf90 73 74 2c 20 6f 72 20 7a 65 72 6f 20 69 66 0a 20  st, or zero if. 
2cfa0 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 66 72         ** the fr
2cfb0 65 65 6c 69 73 74 20 69 73 20 65 6d 70 74 79 2e  eelist is empty.
2cfc0 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 54 72 75   */.        iTru
2cfd0 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  nk = get4byte(&p
2cfe0 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d  Page1->aData[32]
2cff0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
2d000 20 74 65 73 74 63 61 73 65 28 20 69 54 72 75 6e   testcase( iTrun
2d010 6b 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20 20  k==mxPage );.   
2d020 20 20 20 69 66 28 20 69 54 72 75 6e 6b 3e 6d 78     if( iTrunk>mx
2d030 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Page ){.        
2d040 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
2d050 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
2d060 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
2d070 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65  c = btreeGetPage
2d080 28 70 42 74 2c 20 69 54 72 75 6e 6b 2c 20 26 70  (pBt, iTrunk, &p
2d090 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 20  Trunk, 0);.     
2d0a0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 20   }.      if( rc 
2d0b0 29 7b 0a 20 20 20 20 20 20 20 20 70 54 72 75 6e  ){.        pTrun
2d0c0 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 67  k = 0;.        g
2d0d0 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65  oto end_allocate
2d0e0 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 7d 0a 20  _page;.      }. 
2d0f0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 72       assert( pTr
2d100 75 6e 6b 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  unk!=0 );.      
2d110 61 73 73 65 72 74 28 20 70 54 72 75 6e 6b 2d 3e  assert( pTrunk->
2d120 61 44 61 74 61 21 3d 30 20 29 3b 0a 20 20 20 20  aData!=0 );.    
2d130 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
2d140 3a 20 52 2d 31 33 35 32 33 2d 30 34 33 39 34 20  : R-13523-04394 
2d150 54 68 65 20 73 65 63 6f 6e 64 20 69 6e 74 65 67  The second integ
2d160 65 72 20 6f 6e 20 61 20 66 72 65 65 6c 69 73 74  er on a freelist
2d170 20 74 72 75 6e 6b 20 70 61 67 65 0a 20 20 20 20   trunk page.    
2d180 20 20 2a 2a 20 69 73 20 74 68 65 20 6e 75 6d 62    ** is the numb
2d190 65 72 20 6f 66 20 6c 65 61 66 20 70 61 67 65 20  er of leaf page 
2d1a0 70 6f 69 6e 74 65 72 73 20 74 6f 20 66 6f 6c 6c  pointers to foll
2d1b0 6f 77 2e 20 2a 2f 0a 20 20 20 20 20 20 6b 20 3d  ow. */.      k =
2d1c0 20 67 65 74 34 62 79 74 65 28 26 70 54 72 75 6e   get4byte(&pTrun
2d1d0 6b 2d 3e 61 44 61 74 61 5b 34 5d 29 3b 0a 20 20  k->aData[4]);.  
2d1e0 20 20 20 20 69 66 28 20 6b 3d 3d 30 20 26 26 20      if( k==0 && 
2d1f0 21 73 65 61 72 63 68 4c 69 73 74 20 29 7b 0a 20  !searchList ){. 
2d200 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 72         /* The tr
2d210 75 6e 6b 20 68 61 73 20 6e 6f 20 6c 65 61 76 65  unk has no leave
2d220 73 20 61 6e 64 20 74 68 65 20 6c 69 73 74 20 69  s and the list i
2d230 73 20 6e 6f 74 20 62 65 69 6e 67 20 73 65 61 72  s not being sear
2d240 63 68 65 64 2e 20 0a 20 20 20 20 20 20 20 20 2a  ched. .        *
2d250 2a 20 53 6f 20 65 78 74 72 61 63 74 20 74 68 65  * So extract the
2d260 20 74 72 75 6e 6b 20 70 61 67 65 20 69 74 73 65   trunk page itse
2d270 6c 66 20 61 6e 64 20 75 73 65 20 69 74 20 61 73  lf and use it as
2d280 20 74 68 65 20 6e 65 77 6c 79 20 0a 20 20 20 20   the newly .    
2d290 20 20 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64      ** allocated
2d2a0 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 20   page */.       
2d2b0 20 61 73 73 65 72 74 28 20 70 50 72 65 76 54 72   assert( pPrevTr
2d2c0 75 6e 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  unk==0 );.      
2d2d0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
2d2e0 67 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d  gerWrite(pTrunk-
2d2f0 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
2d300 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
2d310 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
2d320 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20  allocate_page;. 
2d330 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2d340 20 2a 70 50 67 6e 6f 20 3d 20 69 54 72 75 6e 6b   *pPgno = iTrunk
2d350 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  ;.        memcpy
2d360 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
2d370 33 32 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44  32], &pTrunk->aD
2d380 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20  ata[0], 4);.    
2d390 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70 54      *ppPage = pT
2d3a0 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 70 54  runk;.        pT
2d3b0 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20  runk = 0;.      
2d3c0 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41    TRACE(("ALLOCA
2d3d0 54 45 3a 20 25 64 20 74 72 75 6e 6b 20 2d 20 25  TE: %d trunk - %
2d3e0 64 20 66 72 65 65 20 70 61 67 65 73 20 6c 65 66  d free pages lef
2d3f0 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f 2c 20 6e 2d  t\n", *pPgno, n-
2d400 31 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  1));.      }else
2d410 20 69 66 28 20 6b 3e 28 75 33 32 29 28 70 42 74   if( k>(u32)(pBt
2d420 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d  ->usableSize/4 -
2d430 20 32 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f   2) ){.        /
2d440 2a 20 56 61 6c 75 65 20 6f 66 20 6b 20 69 73 20  * Value of k is 
2d450 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 20 20 44  out of range.  D
2d460 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69  atabase corrupti
2d470 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63  on */.        rc
2d480 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
2d490 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20  T_BKPT;.        
2d4a0 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
2d4b0 65 5f 70 61 67 65 3b 0a 23 69 66 6e 64 65 66 20  e_page;.#ifndef 
2d4c0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
2d4d0 56 41 43 55 55 4d 0a 20 20 20 20 20 20 7d 65 6c  VACUUM.      }el
2d4e0 73 65 20 69 66 28 20 73 65 61 72 63 68 4c 69 73  se if( searchLis
2d4f0 74 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 26  t .            &
2d500 26 20 28 6e 65 61 72 62 79 3d 3d 69 54 72 75 6e  & (nearby==iTrun
2d510 6b 20 7c 7c 20 28 69 54 72 75 6e 6b 3c 6e 65 61  k || (iTrunk<nea
2d520 72 62 79 20 26 26 20 65 4d 6f 64 65 3d 3d 42 54  rby && eMode==BT
2d530 41 4c 4c 4f 43 5f 4c 45 29 29 20 0a 20 20 20 20  ALLOC_LE)) .    
2d540 20 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20    ){.        /* 
2d550 54 68 65 20 6c 69 73 74 20 69 73 20 62 65 69 6e  The list is bein
2d560 67 20 73 65 61 72 63 68 65 64 20 61 6e 64 20 74  g searched and t
2d570 68 69 73 20 74 72 75 6e 6b 20 70 61 67 65 20 69  his trunk page i
2d580 73 20 74 68 65 20 70 61 67 65 0a 20 20 20 20 20  s the page.     
2d590 20 20 20 2a 2a 20 74 6f 20 61 6c 6c 6f 63 61 74     ** to allocat
2d5a0 65 2c 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66  e, regardless of
2d5b0 20 77 68 65 74 68 65 72 20 69 74 20 68 61 73 20   whether it has 
2d5c0 6c 65 61 76 65 73 2e 0a 20 20 20 20 20 20 20 20  leaves..        
2d5d0 2a 2f 0a 20 20 20 20 20 20 20 20 2a 70 50 67 6e  */.        *pPgn
2d5e0 6f 20 3d 20 69 54 72 75 6e 6b 3b 0a 20 20 20 20  o = iTrunk;.    
2d5f0 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70 54      *ppPage = pT
2d600 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 73 65  runk;.        se
2d610 61 72 63 68 4c 69 73 74 20 3d 20 30 3b 0a 20 20  archList = 0;.  
2d620 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
2d630 65 33 50 61 67 65 72 57 72 69 74 65 28 70 54 72  e3PagerWrite(pTr
2d640 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  unk->pDbPage);. 
2d650 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b         if( rc ){
2d660 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
2d670 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67  end_allocate_pag
2d680 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  e;.        }.   
2d690 20 20 20 20 20 69 66 28 20 6b 3d 3d 30 20 29 7b       if( k==0 ){
2d6a0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21  .          if( !
2d6b0 70 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20  pPrevTrunk ){.  
2d6c0 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
2d6d0 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
2d6e0 33 32 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44  32], &pTrunk->aD
2d6f0 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20  ata[0], 4);.    
2d700 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2d710 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
2d720 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
2d730 70 50 72 65 76 54 72 75 6e 6b 2d 3e 70 44 62 50  pPrevTrunk->pDbP
2d740 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
2d750 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2d760 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
2d770 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c       goto end_al
2d780 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20  locate_page;.   
2d790 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2d7a0 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70         memcpy(&p
2d7b0 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61  PrevTrunk->aData
2d7c0 5b 30 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44  [0], &pTrunk->aD
2d7d0 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20  ata[0], 4);.    
2d7e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2d7f0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
2d800 20 2f 2a 20 54 68 65 20 74 72 75 6e 6b 20 70 61   /* The trunk pa
2d810 67 65 20 69 73 20 72 65 71 75 69 72 65 64 20 62  ge is required b
2d820 79 20 74 68 65 20 63 61 6c 6c 65 72 20 62 75 74  y the caller but
2d830 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 0a 20 20   it contains .  
2d840 20 20 20 20 20 20 20 20 2a 2a 20 70 6f 69 6e 74          ** point
2d850 65 72 73 20 74 6f 20 66 72 65 65 2d 6c 69 73 74  ers to free-list
2d860 20 6c 65 61 76 65 73 2e 20 54 68 65 20 66 69 72   leaves. The fir
2d870 73 74 20 6c 65 61 66 20 62 65 63 6f 6d 65 73 20  st leaf becomes 
2d880 61 20 74 72 75 6e 6b 0a 20 20 20 20 20 20 20 20  a trunk.        
2d890 20 20 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 69    ** page in thi
2d8a0 73 20 63 61 73 65 2e 0a 20 20 20 20 20 20 20 20  s case..        
2d8b0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 4d    */.          M
2d8c0 65 6d 50 61 67 65 20 2a 70 4e 65 77 54 72 75 6e  emPage *pNewTrun
2d8d0 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 50 67 6e  k;.          Pgn
2d8e0 6f 20 69 4e 65 77 54 72 75 6e 6b 20 3d 20 67 65  o iNewTrunk = ge
2d8f0 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e  t4byte(&pTrunk->
2d900 61 44 61 74 61 5b 38 5d 29 3b 0a 20 20 20 20 20  aData[8]);.     
2d910 20 20 20 20 20 69 66 28 20 69 4e 65 77 54 72 75       if( iNewTru
2d920 6e 6b 3e 6d 78 50 61 67 65 20 29 7b 20 0a 20 20  nk>mxPage ){ .  
2d930 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
2d940 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
2d950 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  PT;.            
2d960 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
2d970 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20  e_page;.        
2d980 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 74 65    }.          te
2d990 73 74 63 61 73 65 28 20 69 4e 65 77 54 72 75 6e  stcase( iNewTrun
2d9a0 6b 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20 20  k==mxPage );.   
2d9b0 20 20 20 20 20 20 20 72 63 20 3d 20 62 74 72 65         rc = btre
2d9c0 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 4e  eGetPage(pBt, iN
2d9d0 65 77 54 72 75 6e 6b 2c 20 26 70 4e 65 77 54 72  ewTrunk, &pNewTr
2d9e0 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  unk, 0);.       
2d9f0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
2da00 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
2da10 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c      goto end_all
2da20 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20  ocate_page;.    
2da30 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2da40 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
2da50 67 65 72 57 72 69 74 65 28 70 4e 65 77 54 72 75  gerWrite(pNewTru
2da60 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  nk->pDbPage);.  
2da70 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
2da80 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2da90 20 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65           release
2daa0 50 61 67 65 28 70 4e 65 77 54 72 75 6e 6b 29 3b  Page(pNewTrunk);
2dab0 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74  .            got
2dac0 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
2dad0 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  age;.          }
2dae0 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70  .          memcp
2daf0 79 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44  y(&pNewTrunk->aD
2db00 61 74 61 5b 30 5d 2c 20 26 70 54 72 75 6e 6b 2d  ata[0], &pTrunk-
2db10 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20  >aData[0], 4);. 
2db20 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74           put4byt
2db30 65 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44  e(&pNewTrunk->aD
2db40 61 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b 0a 20 20  ata[4], k-1);.  
2db50 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
2db60 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61  pNewTrunk->aData
2db70 5b 38 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44  [8], &pTrunk->aD
2db80 61 74 61 5b 31 32 5d 2c 20 28 6b 2d 31 29 2a 34  ata[12], (k-1)*4
2db90 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 6c  );.          rel
2dba0 65 61 73 65 50 61 67 65 28 70 4e 65 77 54 72 75  easePage(pNewTru
2dbb0 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  nk);.          i
2dbc0 66 28 20 21 70 50 72 65 76 54 72 75 6e 6b 20 29  f( !pPrevTrunk )
2dbd0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73  {.            as
2dbe0 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
2dbf0 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
2dc00 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 20 29  age1->pDbPage) )
2dc10 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 75  ;.            pu
2dc20 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e  t4byte(&pPage1->
2dc30 61 44 61 74 61 5b 33 32 5d 2c 20 69 4e 65 77 54  aData[32], iNewT
2dc40 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20  runk);.         
2dc50 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2dc60 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2dc70 50 61 67 65 72 57 72 69 74 65 28 70 50 72 65 76  PagerWrite(pPrev
2dc80 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b  Trunk->pDbPage);
2dc90 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
2dca0 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20   rc ){.         
2dcb0 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c       goto end_al
2dcc0 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20  locate_page;.   
2dcd0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2dce0 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
2dcf0 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61  &pPrevTrunk->aDa
2dd00 74 61 5b 30 5d 2c 20 69 4e 65 77 54 72 75 6e 6b  ta[0], iNewTrunk
2dd10 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
2dd20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2dd30 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20   pTrunk = 0;.   
2dd40 20 20 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c       TRACE(("ALL
2dd50 4f 43 41 54 45 3a 20 25 64 20 74 72 75 6e 6b 20  OCATE: %d trunk 
2dd60 2d 20 25 64 20 66 72 65 65 20 70 61 67 65 73 20  - %d free pages 
2dd70 6c 65 66 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f 2c  left\n", *pPgno,
2dd80 20 6e 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a 20   n-1));.#endif. 
2dd90 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6b       }else if( k
2dda0 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  >0 ){.        /*
2ddb0 20 45 78 74 72 61 63 74 20 61 20 6c 65 61 66 20   Extract a leaf 
2ddc0 66 72 6f 6d 20 74 68 65 20 74 72 75 6e 6b 20 2a  from the trunk *
2ddd0 2f 0a 20 20 20 20 20 20 20 20 75 33 32 20 63 6c  /.        u32 cl
2dde0 6f 73 65 73 74 3b 0a 20 20 20 20 20 20 20 20 50  osest;.        P
2ddf0 67 6e 6f 20 69 50 61 67 65 3b 0a 20 20 20 20 20  gno iPage;.     
2de00 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72     unsigned char
2de10 20 2a 61 44 61 74 61 20 3d 20 70 54 72 75 6e 6b   *aData = pTrunk
2de20 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 20 20 20  ->aData;.       
2de30 20 69 66 28 20 6e 65 61 72 62 79 3e 30 20 29 7b   if( nearby>0 ){
2de40 0a 20 20 20 20 20 20 20 20 20 20 75 33 32 20 69  .          u32 i
2de50 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73  ;.          clos
2de60 65 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  est = 0;.       
2de70 20 20 20 69 66 28 20 65 4d 6f 64 65 3d 3d 42 54     if( eMode==BT
2de80 41 4c 4c 4f 43 5f 4c 45 20 29 7b 0a 20 20 20 20  ALLOC_LE ){.    
2de90 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
2dea0 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20   i<k; i++){.    
2deb0 20 20 20 20 20 20 20 20 20 20 69 50 61 67 65 20            iPage 
2dec0 3d 20 67 65 74 34 62 79 74 65 28 26 61 44 61 74  = get4byte(&aDat
2ded0 61 5b 38 2b 69 2a 34 5d 29 3b 0a 20 20 20 20 20  a[8+i*4]);.     
2dee0 20 20 20 20 20 20 20 20 20 69 66 28 20 69 50 61           if( iPa
2def0 67 65 3c 3d 6e 65 61 72 62 79 20 29 7b 0a 20 20  ge<=nearby ){.  
2df00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6c                cl
2df10 6f 73 65 73 74 20 3d 20 69 3b 0a 20 20 20 20 20  osest = i;.     
2df20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
2df30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
2df40 7d 0a 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 7d 65 6c 73 65 7b            }else{
2df60 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74  .            int
2df70 20 64 69 73 74 3b 0a 20 20 20 20 20 20 20 20 20   dist;.         
2df80 20 20 20 64 69 73 74 20 3d 20 73 71 6c 69 74 65     dist = sqlite
2df90 33 41 62 73 49 6e 74 33 32 28 67 65 74 34 62 79  3AbsInt32(get4by
2dfa0 74 65 28 26 61 44 61 74 61 5b 38 5d 29 20 2d 20  te(&aData[8]) - 
2dfb0 6e 65 61 72 62 79 29 3b 0a 20 20 20 20 20 20 20  nearby);.       
2dfc0 20 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c       for(i=1; i<
2dfd0 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  k; i++){.       
2dfe0 20 20 20 20 20 20 20 69 6e 74 20 64 32 20 3d 20         int d2 = 
2dff0 73 71 6c 69 74 65 33 41 62 73 49 6e 74 33 32 28  sqlite3AbsInt32(
2e000 67 65 74 34 62 79 74 65 28 26 61 44 61 74 61 5b  get4byte(&aData[
2e010 38 2b 69 2a 34 5d 29 20 2d 20 6e 65 61 72 62 79  8+i*4]) - nearby
2e020 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
2e030 20 69 66 28 20 64 32 3c 64 69 73 74 20 29 7b 0a   if( d2<dist ){.
2e040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e050 63 6c 6f 73 65 73 74 20 3d 20 69 3b 0a 20 20 20  closest = i;.   
2e060 20 20 20 20 20 20 20 20 20 20 20 20 20 64 69 73               dis
2e070 74 20 3d 20 64 32 3b 0a 20 20 20 20 20 20 20 20  t = d2;.        
2e080 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2e090 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2e0a0 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  }.        }else{
2e0b0 0a 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65  .          close
2e0c0 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  st = 0;.        
2e0d0 7d 0a 0a 20 20 20 20 20 20 20 20 69 50 61 67 65  }..        iPage
2e0e0 20 3d 20 67 65 74 34 62 79 74 65 28 26 61 44 61   = get4byte(&aDa
2e0f0 74 61 5b 38 2b 63 6c 6f 73 65 73 74 2a 34 5d 29  ta[8+closest*4])
2e100 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
2e110 73 65 28 20 69 50 61 67 65 3d 3d 6d 78 50 61 67  se( iPage==mxPag
2e120 65 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  e );.        if(
2e130 20 69 50 61 67 65 3e 6d 78 50 61 67 65 20 29 7b   iPage>mxPage ){
2e140 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
2e150 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
2e160 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 67  KPT;.          g
2e170 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65  oto end_allocate
2e180 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 7d  _page;.        }
2e190 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
2e1a0 65 28 20 69 50 61 67 65 3d 3d 6d 78 50 61 67 65  e( iPage==mxPage
2e1b0 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
2e1c0 21 73 65 61 72 63 68 4c 69 73 74 20 0a 20 20 20  !searchList .   
2e1d0 20 20 20 20 20 20 7c 7c 20 28 69 50 61 67 65 3d        || (iPage=
2e1e0 3d 6e 65 61 72 62 79 20 7c 7c 20 28 69 50 61 67  =nearby || (iPag
2e1f0 65 3c 6e 65 61 72 62 79 20 26 26 20 65 4d 6f 64  e<nearby && eMod
2e200 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45 29 29 20  e==BTALLOC_LE)) 
2e210 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20  .        ){.    
2e220 20 20 20 20 20 20 69 6e 74 20 6e 6f 43 6f 6e 74        int noCont
2e230 65 6e 74 3b 0a 20 20 20 20 20 20 20 20 20 20 2a  ent;.          *
2e240 70 50 67 6e 6f 20 3d 20 69 50 61 67 65 3b 0a 20  pPgno = iPage;. 
2e250 20 20 20 20 20 20 20 20 20 54 52 41 43 45 28 28           TRACE((
2e260 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 77 61  "ALLOCATE: %d wa
2e270 73 20 6c 65 61 66 20 25 64 20 6f 66 20 25 64 20  s leaf %d of %d 
2e280 6f 6e 20 74 72 75 6e 6b 20 25 64 22 0a 20 20 20  on trunk %d".   
2e290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 3a                ":
2e2a0 20 25 64 20 6d 6f 72 65 20 66 72 65 65 20 70 61   %d more free pa
2e2b0 67 65 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  ges\n",.        
2e2c0 20 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f 2c           *pPgno,
2e2d0 20 63 6c 6f 73 65 73 74 2b 31 2c 20 6b 2c 20 70   closest+1, k, p
2e2e0 54 72 75 6e 6b 2d 3e 70 67 6e 6f 2c 20 6e 2d 31  Trunk->pgno, n-1
2e2f0 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63  ));.          rc
2e300 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
2e310 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62  rite(pTrunk->pDb
2e320 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
2e330 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 65   if( rc ) goto e
2e340 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65  nd_allocate_page
2e350 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
2e360 63 6c 6f 73 65 73 74 3c 6b 2d 31 20 29 7b 0a 20  closest<k-1 ){. 
2e370 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70             memcp
2e380 79 28 26 61 44 61 74 61 5b 38 2b 63 6c 6f 73 65  y(&aData[8+close
2e390 73 74 2a 34 5d 2c 20 26 61 44 61 74 61 5b 34 2b  st*4], &aData[4+
2e3a0 6b 2a 34 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20  k*4], 4);.      
2e3b0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2e3c0 70 75 74 34 62 79 74 65 28 26 61 44 61 74 61 5b  put4byte(&aData[
2e3d0 34 5d 2c 20 6b 2d 31 29 3b 0a 20 20 20 20 20 20  4], k-1);.      
2e3e0 20 20 20 20 6e 6f 43 6f 6e 74 65 6e 74 20 3d 20      noContent = 
2e3f0 21 62 74 72 65 65 47 65 74 48 61 73 43 6f 6e 74  !btreeGetHasCont
2e400 65 6e 74 28 70 42 74 2c 20 2a 70 50 67 6e 6f 29  ent(pBt, *pPgno)
2e410 3f 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f  ? PAGER_GET_NOCO
2e420 4e 54 45 4e 54 20 3a 20 30 3b 0a 20 20 20 20 20  NTENT : 0;.     
2e430 20 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47       rc = btreeG
2e440 65 74 50 61 67 65 28 70 42 74 2c 20 2a 70 50 67  etPage(pBt, *pPg
2e450 6e 6f 2c 20 70 70 50 61 67 65 2c 20 6e 6f 43 6f  no, ppPage, noCo
2e460 6e 74 65 6e 74 29 3b 0a 20 20 20 20 20 20 20 20  ntent);.        
2e470 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2e480 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
2e490 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
2e4a0 61 67 65 72 57 72 69 74 65 28 28 2a 70 70 50 61  agerWrite((*ppPa
2e4b0 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  ge)->pDbPage);. 
2e4c0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72             if( r
2e4d0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2e4e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
2e4f0 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50 61 67  leasePage(*ppPag
2e500 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
2e510 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  }.          }.  
2e520 20 20 20 20 20 20 20 20 73 65 61 72 63 68 4c 69          searchLi
2e530 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  st = 0;.        
2e540 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
2e550 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 72 65  releasePage(pPre
2e560 76 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 70  vTrunk);.      p
2e570 50 72 65 76 54 72 75 6e 6b 20 3d 20 30 3b 0a 20  PrevTrunk = 0;. 
2e580 20 20 20 7d 77 68 69 6c 65 28 20 73 65 61 72 63     }while( searc
2e590 68 4c 69 73 74 20 29 3b 0a 20 20 7d 65 6c 73 65  hList );.  }else
2e5a0 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72 65 20 61  {.    /* There a
2e5b0 72 65 20 6e 6f 20 70 61 67 65 73 20 6f 6e 20 74  re no pages on t
2e5c0 68 65 20 66 72 65 65 6c 69 73 74 2c 20 73 6f 20  he freelist, so 
2e5d0 61 70 70 65 6e 64 20 61 20 6e 65 77 20 70 61 67  append a new pag
2e5e0 65 20 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20  e to the.    ** 
2e5f0 64 61 74 61 62 61 73 65 20 69 6d 61 67 65 2e 0a  database image..
2e600 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f      **.    ** No
2e610 72 6d 61 6c 6c 79 2c 20 6e 65 77 20 70 61 67 65  rmally, new page
2e620 73 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 74  s allocated by t
2e630 68 69 73 20 62 6c 6f 63 6b 20 63 61 6e 20 62 65  his block can be
2e640 20 72 65 71 75 65 73 74 65 64 20 66 72 6f 6d 20   requested from 
2e650 74 68 65 0a 20 20 20 20 2a 2a 20 70 61 67 65 72  the.    ** pager
2e660 20 6c 61 79 65 72 20 77 69 74 68 20 74 68 65 20   layer with the 
2e670 27 6e 6f 2d 63 6f 6e 74 65 6e 74 27 20 66 6c 61  'no-content' fla
2e680 67 20 73 65 74 2e 20 54 68 69 73 20 70 72 65 76  g set. This prev
2e690 65 6e 74 73 20 74 68 65 20 70 61 67 65 72 0a 20  ents the pager. 
2e6a0 20 20 20 2a 2a 20 66 72 6f 6d 20 74 72 79 69 6e     ** from tryin
2e6b0 67 20 74 6f 20 72 65 61 64 20 74 68 65 20 70 61  g to read the pa
2e6c0 67 65 73 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d  ges content from
2e6d0 20 64 69 73 6b 2e 20 48 6f 77 65 76 65 72 2c 20   disk. However, 
2e6e0 69 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 75  if the.    ** cu
2e6f0 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  rrent transactio
2e700 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20 72 75  n has already ru
2e710 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 69 6e  n one or more in
2e720 63 72 65 6d 65 6e 74 61 6c 2d 76 61 63 75 75 6d  cremental-vacuum
2e730 0a 20 20 20 20 2a 2a 20 73 74 65 70 73 2c 20 74  .    ** steps, t
2e740 68 65 6e 20 74 68 65 20 70 61 67 65 20 77 65 20  hen the page we 
2e750 61 72 65 20 61 62 6f 75 74 20 74 6f 20 61 6c 6c  are about to all
2e760 6f 63 61 74 65 20 6d 61 79 20 63 6f 6e 74 61 69  ocate may contai
2e770 6e 20 63 6f 6e 74 65 6e 74 0a 20 20 20 20 2a 2a  n content.    **
2e780 20 74 68 61 74 20 69 73 20 72 65 71 75 69 72 65   that is require
2e790 64 20 69 6e 20 74 68 65 20 65 76 65 6e 74 20 6f  d in the event o
2e7a0 66 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 20 49 6e  f a rollback. In
2e7b0 20 74 68 69 73 20 63 61 73 65 2c 20 64 6f 0a 20   this case, do. 
2e7c0 20 20 20 2a 2a 20 6e 6f 74 20 73 65 74 20 74 68     ** not set th
2e7d0 65 20 6e 6f 2d 63 6f 6e 74 65 6e 74 20 66 6c 61  e no-content fla
2e7e0 67 2e 20 54 68 69 73 20 63 61 75 73 65 73 20 74  g. This causes t
2e7f0 68 65 20 70 61 67 65 72 20 74 6f 20 6c 6f 61 64  he pager to load
2e800 20 61 6e 64 20 6a 6f 75 72 6e 61 6c 0a 20 20 20   and journal.   
2e810 20 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20   ** the current 
2e820 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 62 65 66  page content bef
2e830 6f 72 65 20 6f 76 65 72 77 72 69 74 69 6e 67 20  ore overwriting 
2e840 69 74 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  it..    **.    *
2e850 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20  * Note that the 
2e860 70 61 67 65 72 20 77 69 6c 6c 20 6e 6f 74 20 61  pager will not a
2e870 63 74 75 61 6c 6c 79 20 61 74 74 65 6d 70 74 20  ctually attempt 
2e880 74 6f 20 6c 6f 61 64 20 6f 72 20 6a 6f 75 72 6e  to load or journ
2e890 61 6c 20 0a 20 20 20 20 2a 2a 20 63 6f 6e 74 65  al .    ** conte
2e8a0 6e 74 20 66 6f 72 20 61 6e 79 20 70 61 67 65 20  nt for any page 
2e8b0 74 68 61 74 20 72 65 61 6c 6c 79 20 64 6f 65 73  that really does
2e8c0 20 6c 69 65 20 70 61 73 74 20 74 68 65 20 65 6e   lie past the en
2e8d0 64 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  d of the databas
2e8e0 65 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 6f 6e  e.    ** file on
2e8f0 20 64 69 73 6b 2e 20 53 6f 20 74 68 65 20 65 66   disk. So the ef
2e900 66 65 63 74 73 20 6f 66 20 64 69 73 61 62 6c 69  fects of disabli
2e910 6e 67 20 74 68 65 20 6e 6f 2d 63 6f 6e 74 65 6e  ng the no-conten
2e920 74 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a 20  t optimization. 
2e930 20 20 20 2a 2a 20 68 65 72 65 20 61 72 65 20 63     ** here are c
2e940 6f 6e 66 69 6e 65 64 20 74 6f 20 74 68 6f 73 65  onfined to those
2e950 20 70 61 67 65 73 20 74 68 61 74 20 6c 69 65 20   pages that lie 
2e960 62 65 74 77 65 65 6e 20 74 68 65 20 65 6e 64 20  between the end 
2e970 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61  of the.    ** da
2e980 74 61 62 61 73 65 20 69 6d 61 67 65 20 61 6e 64  tabase image and
2e990 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
2e9a0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20  database file.. 
2e9b0 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 62 4e     */.    int bN
2e9c0 6f 43 6f 6e 74 65 6e 74 20 3d 20 28 30 3d 3d 49  oContent = (0==I
2e9d0 66 4e 6f 74 4f 6d 69 74 41 56 28 70 42 74 2d 3e  fNotOmitAV(pBt->
2e9e0 62 44 6f 54 72 75 6e 63 61 74 65 29 29 3f 20 50  bDoTruncate))? P
2e9f0 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45  AGER_GET_NOCONTE
2ea00 4e 54 3a 30 3b 0a 0a 20 20 20 20 72 63 20 3d 20  NT:0;..    rc = 
2ea10 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
2ea20 65 28 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 70  e(pBt->pPage1->p
2ea30 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  DbPage);.    if(
2ea40 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
2ea50 0a 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 2b  .    pBt->nPage+
2ea60 2b 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e  +;.    if( pBt->
2ea70 6e 50 61 67 65 3d 3d 50 45 4e 44 49 4e 47 5f 42  nPage==PENDING_B
2ea80 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 20  YTE_PAGE(pBt) ) 
2ea90 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 0a 23  pBt->nPage++;..#
2eaa0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2eab0 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
2eac0 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56    if( pBt->autoV
2ead0 61 63 75 75 6d 20 26 26 20 50 54 52 4d 41 50 5f  acuum && PTRMAP_
2eae0 49 53 50 41 47 45 28 70 42 74 2c 20 70 42 74 2d  ISPAGE(pBt, pBt-
2eaf0 3e 6e 50 61 67 65 29 20 29 7b 0a 20 20 20 20 20  >nPage) ){.     
2eb00 20 2f 2a 20 49 66 20 2a 70 50 67 6e 6f 20 72 65   /* If *pPgno re
2eb10 66 65 72 73 20 74 6f 20 61 20 70 6f 69 6e 74 65  fers to a pointe
2eb20 72 2d 6d 61 70 20 70 61 67 65 2c 20 61 6c 6c 6f  r-map page, allo
2eb30 63 61 74 65 20 74 77 6f 20 6e 65 77 20 70 61 67  cate two new pag
2eb40 65 73 0a 20 20 20 20 20 20 2a 2a 20 61 74 20 74  es.      ** at t
2eb50 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69  he end of the fi
2eb60 6c 65 20 69 6e 73 74 65 61 64 20 6f 66 20 6f 6e  le instead of on
2eb70 65 2e 20 54 68 65 20 66 69 72 73 74 20 61 6c 6c  e. The first all
2eb80 6f 63 61 74 65 64 20 70 61 67 65 0a 20 20 20 20  ocated page.    
2eb90 20 20 2a 2a 20 62 65 63 6f 6d 65 73 20 61 20 6e    ** becomes a n
2eba0 65 77 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70  ew pointer-map p
2ebb0 61 67 65 2c 20 74 68 65 20 73 65 63 6f 6e 64 20  age, the second 
2ebc0 69 73 20 75 73 65 64 20 62 79 20 74 68 65 20 63  is used by the c
2ebd0 61 6c 6c 65 72 2e 0a 20 20 20 20 20 20 2a 2f 0a  aller..      */.
2ebe0 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70        MemPage *p
2ebf0 50 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 54 52  Pg = 0;.      TR
2ec00 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20  ACE(("ALLOCATE: 
2ec10 25 64 20 66 72 6f 6d 20 65 6e 64 20 6f 66 20 66  %d from end of f
2ec20 69 6c 65 20 28 70 6f 69 6e 74 65 72 2d 6d 61 70  ile (pointer-map
2ec30 20 70 61 67 65 29 5c 6e 22 2c 20 70 42 74 2d 3e   page)\n", pBt->
2ec40 6e 50 61 67 65 29 29 3b 0a 20 20 20 20 20 20 61  nPage));.      a
2ec50 73 73 65 72 74 28 20 70 42 74 2d 3e 6e 50 61 67  ssert( pBt->nPag
2ec60 65 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  e!=PENDING_BYTE_
2ec70 50 41 47 45 28 70 42 74 29 20 29 3b 0a 20 20 20  PAGE(pBt) );.   
2ec80 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74     rc = btreeGet
2ec90 50 61 67 65 28 70 42 74 2c 20 70 42 74 2d 3e 6e  Page(pBt, pBt->n
2eca0 50 61 67 65 2c 20 26 70 50 67 2c 20 62 4e 6f 43  Page, &pPg, bNoC
2ecb0 6f 6e 74 65 6e 74 29 3b 0a 20 20 20 20 20 20 69  ontent);.      i
2ecc0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2ecd0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
2ece0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
2ecf0 74 65 28 70 50 67 2d 3e 70 44 62 50 61 67 65 29  te(pPg->pDbPage)
2ed00 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73  ;.        releas
2ed10 65 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20  ePage(pPg);.    
2ed20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63    }.      if( rc
2ed30 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
2ed40 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b      pBt->nPage++
2ed50 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 2d  ;.      if( pBt-
2ed60 3e 6e 50 61 67 65 3d 3d 50 45 4e 44 49 4e 47 5f  >nPage==PENDING_
2ed70 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
2ed80 7b 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 20  { pBt->nPage++; 
2ed90 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  }.    }.#endif. 
2eda0 20 20 20 70 75 74 34 62 79 74 65 28 32 38 20 2b     put4byte(28 +
2edb0 20 28 75 38 2a 29 70 42 74 2d 3e 70 50 61 67 65   (u8*)pBt->pPage
2edc0 31 2d 3e 61 44 61 74 61 2c 20 70 42 74 2d 3e 6e  1->aData, pBt->n
2edd0 50 61 67 65 29 3b 0a 20 20 20 20 2a 70 50 67 6e  Page);.    *pPgn
2ede0 6f 20 3d 20 70 42 74 2d 3e 6e 50 61 67 65 3b 0a  o = pBt->nPage;.
2edf0 0a 20 20 20 20 61 73 73 65 72 74 28 20 2a 70 50  .    assert( *pP
2ee00 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54  gno!=PENDING_BYT
2ee10 45 5f 50 41 47 45 28 70 42 74 29 20 29 3b 0a 20  E_PAGE(pBt) );. 
2ee20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74     rc = btreeGet
2ee30 50 61 67 65 28 70 42 74 2c 20 2a 70 50 67 6e 6f  Page(pBt, *pPgno
2ee40 2c 20 70 70 50 61 67 65 2c 20 62 4e 6f 43 6f 6e  , ppPage, bNoCon
2ee50 74 65 6e 74 29 3b 0a 20 20 20 20 69 66 28 20 72  tent);.    if( r
2ee60 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
2ee70 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
2ee80 61 67 65 72 57 72 69 74 65 28 28 2a 70 70 50 61  agerWrite((*ppPa
2ee90 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  ge)->pDbPage);. 
2eea0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
2eeb0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
2eec0 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50 61 67  leasePage(*ppPag
2eed0 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 52  e);.    }.    TR
2eee0 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20  ACE(("ALLOCATE: 
2eef0 25 64 20 66 72 6f 6d 20 65 6e 64 20 6f 66 20 66  %d from end of f
2ef00 69 6c 65 5c 6e 22 2c 20 2a 70 50 67 6e 6f 29 29  ile\n", *pPgno))
2ef10 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  ;.  }..  assert(
2ef20 20 2a 70 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47   *pPgno!=PENDING
2ef30 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
2ef40 29 3b 0a 0a 65 6e 64 5f 61 6c 6c 6f 63 61 74 65  );..end_allocate
2ef50 5f 70 61 67 65 3a 0a 20 20 72 65 6c 65 61 73 65  _page:.  release
2ef60 50 61 67 65 28 70 54 72 75 6e 6b 29 3b 0a 20 20  Page(pTrunk);.  
2ef70 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 72 65  releasePage(pPre
2ef80 76 54 72 75 6e 6b 29 3b 0a 20 20 69 66 28 20 72  vTrunk);.  if( r
2ef90 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2efa0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 50      if( sqlite3P
2efb0 61 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74  agerPageRefcount
2efc0 28 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62 50  ((*ppPage)->pDbP
2efd0 61 67 65 29 3e 31 20 29 7b 0a 20 20 20 20 20 20  age)>1 ){.      
2efe0 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50  releasePage(*ppP
2eff0 61 67 65 29 3b 0a 20 20 20 20 20 20 2a 70 70 50  age);.      *ppP
2f000 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  age = 0;.      r
2f010 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
2f020 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  RUPT_BKPT;.    }
2f030 0a 20 20 20 20 28 2a 70 70 50 61 67 65 29 2d 3e  .    (*ppPage)->
2f040 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 7d 65  isInit = 0;.  }e
2f050 6c 73 65 7b 0a 20 20 20 20 2a 70 70 50 61 67 65  lse{.    *ppPage
2f060 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65   = 0;.  }.  asse
2f070 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  rt( rc!=SQLITE_O
2f080 4b 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65  K || sqlite3Page
2f090 72 49 73 77 72 69 74 65 61 62 6c 65 28 28 2a 70  rIswriteable((*p
2f0a0 70 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29  pPage)->pDbPage)
2f0b0 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   );.  return rc;
2f0c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
2f0d0 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20  unction is used 
2f0e0 74 6f 20 61 64 64 20 70 61 67 65 20 69 50 61 67  to add page iPag
2f0f0 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  e to the databas
2f100 65 20 66 69 6c 65 20 66 72 65 65 2d 6c 69 73 74  e file free-list
2f110 2e 20 0a 2a 2a 20 49 74 20 69 73 20 61 73 73 75  . .** It is assu
2f120 6d 65 64 20 74 68 61 74 20 74 68 65 20 70 61 67  med that the pag
2f130 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  e is not already
2f140 20 61 20 70 61 72 74 20 6f 66 20 74 68 65 20 66   a part of the f
2f150 72 65 65 2d 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20  ree-list..**.** 
2f160 54 68 65 20 76 61 6c 75 65 20 70 61 73 73 65 64  The value passed
2f170 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
2f180 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20  rgument to this 
2f190 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 70 74 69  function is opti
2f1a0 6f 6e 61 6c 2e 0a 2a 2a 20 49 66 20 74 68 65 20  onal..** If the 
2f1b0 63 61 6c 6c 65 72 20 68 61 70 70 65 6e 73 20 74  caller happens t
2f1c0 6f 20 68 61 76 65 20 61 20 70 6f 69 6e 74 65 72  o have a pointer
2f1d0 20 74 6f 20 74 68 65 20 4d 65 6d 50 61 67 65 20   to the MemPage 
2f1e0 6f 62 6a 65 63 74 20 0a 2a 2a 20 63 6f 72 72 65  object .** corre
2f1f0 73 70 6f 6e 64 69 6e 67 20 74 6f 20 70 61 67 65  sponding to page
2f200 20 69 50 61 67 65 20 68 61 6e 64 79 2c 20 69 74   iPage handy, it
2f210 20 6d 61 79 20 70 61 73 73 20 69 74 20 61 73 20   may pass it as 
2f220 74 68 65 20 73 65 63 6f 6e 64 20 76 61 6c 75 65  the second value
2f230 2e 20 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  . .** Otherwise,
2f240 20 69 74 20 6d 61 79 20 70 61 73 73 20 4e 55 4c   it may pass NUL
2f250 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 70 6f  L..**.** If a po
2f260 69 6e 74 65 72 20 74 6f 20 61 20 4d 65 6d 50 61  inter to a MemPa
2f270 67 65 20 6f 62 6a 65 63 74 20 69 73 20 70 61 73  ge object is pas
2f280 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  sed as the secon
2f290 64 20 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20 69  d argument,.** i
2f2a0 74 73 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75  ts reference cou
2f2b0 6e 74 20 69 73 20 6e 6f 74 20 61 6c 74 65 72 65  nt is not altere
2f2c0 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69  d by this functi
2f2d0 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  on..*/.static in
2f2e0 74 20 66 72 65 65 50 61 67 65 32 28 42 74 53 68  t freePage2(BtSh
2f2f0 61 72 65 64 20 2a 70 42 74 2c 20 4d 65 6d 50 61  ared *pBt, MemPa
2f300 67 65 20 2a 70 4d 65 6d 50 61 67 65 2c 20 50 67  ge *pMemPage, Pg
2f310 6e 6f 20 69 50 61 67 65 29 7b 0a 20 20 4d 65 6d  no iPage){.  Mem
2f320 50 61 67 65 20 2a 70 54 72 75 6e 6b 20 3d 20 30  Page *pTrunk = 0
2f330 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2f340 20 2f 2a 20 46 72 65 65 2d 6c 69 73 74 20 74 72   /* Free-list tr
2f350 75 6e 6b 20 70 61 67 65 20 2a 2f 0a 20 20 50 67  unk page */.  Pg
2f360 6e 6f 20 69 54 72 75 6e 6b 20 3d 20 30 3b 20 20  no iTrunk = 0;  
2f370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f380 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72    /* Page number
2f390 20 6f 66 20 66 72 65 65 2d 6c 69 73 74 20 74 72   of free-list tr
2f3a0 75 6e 6b 20 70 61 67 65 20 2a 2f 20 0a 20 20 4d  unk page */ .  M
2f3b0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 20 3d  emPage *pPage1 =
2f3c0 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 20 20 20   pBt->pPage1;   
2f3d0 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 72 65 66 65     /* Local refe
2f3e0 72 65 6e 63 65 20 74 6f 20 70 61 67 65 20 31 20  rence to page 1 
2f3f0 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  */.  MemPage *pP
2f400 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  age;            
2f410 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
2f420 20 62 65 69 6e 67 20 66 72 65 65 64 2e 20 4d 61   being freed. Ma
2f430 79 20 62 65 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20  y be NULL. */.  
2f440 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
2f450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f460 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f      /* Return Co
2f470 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 72 65  de */.  int nFre
2f480 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
2f490 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
2f4a0 6e 69 74 69 61 6c 20 6e 75 6d 62 65 72 20 6f 66  nitial number of
2f4b0 20 70 61 67 65 73 20 6f 6e 20 66 72 65 65 2d 6c   pages on free-l
2f4c0 69 73 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ist */..  assert
2f4d0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
2f4e0 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
2f4f0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 50   );.  assert( iP
2f500 61 67 65 3e 31 20 29 3b 0a 20 20 61 73 73 65 72  age>1 );.  asser
2f510 74 28 20 21 70 4d 65 6d 50 61 67 65 20 7c 7c 20  t( !pMemPage || 
2f520 70 4d 65 6d 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d  pMemPage->pgno==
2f530 69 50 61 67 65 20 29 3b 0a 0a 20 20 69 66 28 20  iPage );..  if( 
2f540 70 4d 65 6d 50 61 67 65 20 29 7b 0a 20 20 20 20  pMemPage ){.    
2f550 70 50 61 67 65 20 3d 20 70 4d 65 6d 50 61 67 65  pPage = pMemPage
2f560 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  ;.    sqlite3Pag
2f570 65 72 52 65 66 28 70 50 61 67 65 2d 3e 70 44 62  erRef(pPage->pDb
2f580 50 61 67 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Page);.  }else{.
2f590 20 20 20 20 70 50 61 67 65 20 3d 20 62 74 72 65      pPage = btre
2f5a0 65 50 61 67 65 4c 6f 6f 6b 75 70 28 70 42 74 2c  ePageLookup(pBt,
2f5b0 20 69 50 61 67 65 29 3b 0a 20 20 7d 0a 0a 20 20   iPage);.  }..  
2f5c0 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65  /* Increment the
2f5d0 20 66 72 65 65 20 70 61 67 65 20 63 6f 75 6e 74   free page count
2f5e0 20 6f 6e 20 70 50 61 67 65 31 20 2a 2f 0a 20 20   on pPage1 */.  
2f5f0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
2f600 72 57 72 69 74 65 28 70 50 61 67 65 31 2d 3e 70  rWrite(pPage1->p
2f610 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72  DbPage);.  if( r
2f620 63 20 29 20 67 6f 74 6f 20 66 72 65 65 70 61 67  c ) goto freepag
2f630 65 5f 6f 75 74 3b 0a 20 20 6e 46 72 65 65 20 3d  e_out;.  nFree =
2f640 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
2f650 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20  1->aData[36]);. 
2f660 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65   put4byte(&pPage
2f670 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20 6e 46  1->aData[36], nF
2f680 72 65 65 2b 31 29 3b 0a 0a 20 20 69 66 28 20 70  ree+1);..  if( p
2f690 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42  Bt->btsFlags & B
2f6a0 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45  TS_SECURE_DELETE
2f6b0 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   ){.    /* If th
2f6c0 65 20 73 65 63 75 72 65 5f 64 65 6c 65 74 65 20  e secure_delete 
2f6d0 6f 70 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65  option is enable
2f6e0 64 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 61  d, then.    ** a
2f6f0 6c 77 61 79 73 20 66 75 6c 6c 79 20 6f 76 65 72  lways fully over
2f700 77 72 69 74 65 20 64 65 6c 65 74 65 64 20 69 6e  write deleted in
2f710 66 6f 72 6d 61 74 69 6f 6e 20 77 69 74 68 20 7a  formation with z
2f720 65 72 6f 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  eros..    */.   
2f730 20 69 66 28 20 28 21 70 50 61 67 65 20 26 26 20   if( (!pPage && 
2f740 28 28 72 63 20 3d 20 62 74 72 65 65 47 65 74 50  ((rc = btreeGetP
2f750 61 67 65 28 70 42 74 2c 20 69 50 61 67 65 2c 20  age(pBt, iPage, 
2f760 26 70 50 61 67 65 2c 20 30 29 29 21 3d 30 29 20  &pPage, 0))!=0) 
2f770 29 0a 20 20 20 20 20 7c 7c 20 20 20 20 20 20 20  ).     ||       
2f780 20 20 20 20 20 28 28 72 63 20 3d 20 73 71 6c 69       ((rc = sqli
2f790 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
2f7a0 61 67 65 2d 3e 70 44 62 50 61 67 65 29 29 21 3d  age->pDbPage))!=
2f7b0 30 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  0).    ){.      
2f7c0 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75  goto freepage_ou
2f7d0 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d  t;.    }.    mem
2f7e0 73 65 74 28 70 50 61 67 65 2d 3e 61 44 61 74 61  set(pPage->aData
2f7f0 2c 20 30 2c 20 70 50 61 67 65 2d 3e 70 42 74 2d  , 0, pPage->pBt-
2f800 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 7d 0a  >pageSize);.  }.
2f810 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74  .  /* If the dat
2f820 61 62 61 73 65 20 73 75 70 70 6f 72 74 73 20 61  abase supports a
2f830 75 74 6f 2d 76 61 63 75 75 6d 2c 20 77 72 69 74  uto-vacuum, writ
2f840 65 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 74 68  e an entry in th
2f850 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20  e pointer-map.  
2f860 2a 2a 20 74 6f 20 69 6e 64 69 63 61 74 65 20 74  ** to indicate t
2f870 68 61 74 20 74 68 65 20 70 61 67 65 20 69 73 20  hat the page is 
2f880 66 72 65 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  free..  */.  if(
2f890 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b   ISAUTOVACUUM ){
2f8a0 0a 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70  .    ptrmapPut(p
2f8b0 42 74 2c 20 69 50 61 67 65 2c 20 50 54 52 4d 41  Bt, iPage, PTRMA
2f8c0 50 5f 46 52 45 45 50 41 47 45 2c 20 30 2c 20 26  P_FREEPAGE, 0, &
2f8d0 72 63 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  rc);.    if( rc 
2f8e0 29 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f  ) goto freepage_
2f8f0 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e  out;.  }..  /* N
2f900 6f 77 20 6d 61 6e 69 70 75 6c 61 74 65 20 74 68  ow manipulate th
2f910 65 20 61 63 74 75 61 6c 20 64 61 74 61 62 61 73  e actual databas
2f920 65 20 66 72 65 65 2d 6c 69 73 74 20 73 74 72 75  e free-list stru
2f930 63 74 75 72 65 2e 20 54 68 65 72 65 20 61 72 65  cture. There are
2f940 20 74 77 6f 0a 20 20 2a 2a 20 70 6f 73 73 69 62   two.  ** possib
2f950 69 6c 69 74 69 65 73 2e 20 49 66 20 74 68 65 20  ilities. If the 
2f960 66 72 65 65 2d 6c 69 73 74 20 69 73 20 63 75 72  free-list is cur
2f970 72 65 6e 74 6c 79 20 65 6d 70 74 79 2c 20 6f 72  rently empty, or
2f980 20 69 66 20 74 68 65 20 66 69 72 73 74 0a 20 20   if the first.  
2f990 2a 2a 20 74 72 75 6e 6b 20 70 61 67 65 20 69 6e  ** trunk page in
2f9a0 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 69   the free-list i
2f9b0 73 20 66 75 6c 6c 2c 20 74 68 65 6e 20 74 68 69  s full, then thi
2f9c0 73 20 70 61 67 65 20 77 69 6c 6c 20 62 65 63 6f  s page will beco
2f9d0 6d 65 20 61 0a 20 20 2a 2a 20 6e 65 77 20 66 72  me a.  ** new fr
2f9e0 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70 61  ee-list trunk pa
2f9f0 67 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69  ge. Otherwise, i
2fa00 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 61 20  t will become a 
2fa10 6c 65 61 66 20 6f 66 20 74 68 65 0a 20 20 2a 2a  leaf of the.  **
2fa20 20 66 69 72 73 74 20 74 72 75 6e 6b 20 70 61 67   first trunk pag
2fa30 65 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74  e in the current
2fa40 20 66 72 65 65 2d 6c 69 73 74 2e 20 54 68 69 73   free-list. This
2fa50 20 62 6c 6f 63 6b 20 74 65 73 74 73 20 69 66 20   block tests if 
2fa60 69 74 0a 20 20 2a 2a 20 69 73 20 70 6f 73 73 69  it.  ** is possi
2fa70 62 6c 65 20 74 6f 20 61 64 64 20 74 68 65 20 70  ble to add the p
2fa80 61 67 65 20 61 73 20 61 20 6e 65 77 20 66 72 65  age as a new fre
2fa90 65 2d 6c 69 73 74 20 6c 65 61 66 2e 0a 20 20 2a  e-list leaf..  *
2faa0 2f 0a 20 20 69 66 28 20 6e 46 72 65 65 21 3d 30  /.  if( nFree!=0
2fab0 20 29 7b 0a 20 20 20 20 75 33 32 20 6e 4c 65 61   ){.    u32 nLea
2fac0 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f;              
2fad0 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20 6e 75 6d    /* Initial num
2fae0 62 65 72 20 6f 66 20 6c 65 61 66 20 63 65 6c 6c  ber of leaf cell
2faf0 73 20 6f 6e 20 74 72 75 6e 6b 20 70 61 67 65 20  s on trunk page 
2fb00 2a 2f 0a 0a 20 20 20 20 69 54 72 75 6e 6b 20 3d  */..    iTrunk =
2fb10 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
2fb20 31 2d 3e 61 44 61 74 61 5b 33 32 5d 29 3b 0a 20  1->aData[32]);. 
2fb30 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74     rc = btreeGet
2fb40 50 61 67 65 28 70 42 74 2c 20 69 54 72 75 6e 6b  Page(pBt, iTrunk
2fb50 2c 20 26 70 54 72 75 6e 6b 2c 20 30 29 3b 0a 20  , &pTrunk, 0);. 
2fb60 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
2fb70 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f  E_OK ){.      go
2fb80 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b  to freepage_out;
2fb90 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6e 4c 65 61  .    }..    nLea
2fba0 66 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 54  f = get4byte(&pT
2fbb0 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 29 3b  runk->aData[4]);
2fbc0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74  .    assert( pBt
2fbd0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3e 33 32 20  ->usableSize>32 
2fbe0 29 3b 0a 20 20 20 20 69 66 28 20 6e 4c 65 61 66  );.    if( nLeaf
2fbf0 20 3e 20 28 75 33 32 29 70 42 74 2d 3e 75 73 61   > (u32)pBt->usa
2fc00 62 6c 65 53 69 7a 65 2f 34 20 2d 20 32 20 29 7b  bleSize/4 - 2 ){
2fc10 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
2fc20 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
2fc30 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65  .      goto free
2fc40 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  page_out;.    }.
2fc50 20 20 20 20 69 66 28 20 6e 4c 65 61 66 20 3c 20      if( nLeaf < 
2fc60 28 75 33 32 29 70 42 74 2d 3e 75 73 61 62 6c 65  (u32)pBt->usable
2fc70 53 69 7a 65 2f 34 20 2d 20 38 20 29 7b 0a 20 20  Size/4 - 8 ){.  
2fc80 20 20 20 20 2f 2a 20 49 6e 20 74 68 69 73 20 63      /* In this c
2fc90 61 73 65 20 74 68 65 72 65 20 69 73 20 72 6f 6f  ase there is roo
2fca0 6d 20 6f 6e 20 74 68 65 20 74 72 75 6e 6b 20 70  m on the trunk p
2fcb0 61 67 65 20 74 6f 20 69 6e 73 65 72 74 20 74 68  age to insert th
2fcc0 65 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20  e page.      ** 
2fcd0 62 65 69 6e 67 20 66 72 65 65 64 20 61 73 20 61  being freed as a
2fce0 20 6e 65 77 20 6c 65 61 66 2e 0a 20 20 20 20 20   new leaf..     
2fcf0 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4e 6f 74   **.      ** Not
2fd00 65 20 74 68 61 74 20 74 68 65 20 74 72 75 6e 6b  e that the trunk
2fd10 20 70 61 67 65 20 69 73 20 6e 6f 74 20 72 65 61   page is not rea
2fd20 6c 6c 79 20 66 75 6c 6c 20 75 6e 74 69 6c 20 69  lly full until i
2fd30 74 20 63 6f 6e 74 61 69 6e 73 0a 20 20 20 20 20  t contains.     
2fd40 20 2a 2a 20 75 73 61 62 6c 65 53 69 7a 65 2f 34   ** usableSize/4
2fd50 20 2d 20 32 20 65 6e 74 72 69 65 73 2c 20 6e 6f   - 2 entries, no
2fd60 74 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d  t usableSize/4 -
2fd70 20 38 20 65 6e 74 72 69 65 73 20 61 73 20 77 65   8 entries as we
2fd80 20 68 61 76 65 0a 20 20 20 20 20 20 2a 2a 20 63   have.      ** c
2fd90 6f 64 65 64 2e 20 20 42 75 74 20 64 75 65 20 74  oded.  But due t
2fda0 6f 20 61 20 63 6f 64 69 6e 67 20 65 72 72 6f 72  o a coding error
2fdb0 20 69 6e 20 76 65 72 73 69 6f 6e 73 20 6f 66 20   in versions of 
2fdc0 53 51 4c 69 74 65 20 70 72 69 6f 72 20 74 6f 0a  SQLite prior to.
2fdd0 20 20 20 20 20 20 2a 2a 20 33 2e 36 2e 30 2c 20        ** 3.6.0, 
2fde0 64 61 74 61 62 61 73 65 73 20 77 69 74 68 20 66  databases with f
2fdf0 72 65 65 6c 69 73 74 20 74 72 75 6e 6b 20 70 61  reelist trunk pa
2fe00 67 65 73 20 68 6f 6c 64 69 6e 67 20 6d 6f 72 65  ges holding more
2fe10 20 74 68 61 6e 0a 20 20 20 20 20 20 2a 2a 20 75   than.      ** u
2fe20 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20  sableSize/4 - 8 
2fe30 65 6e 74 72 69 65 73 20 77 69 6c 6c 20 62 65 20  entries will be 
2fe40 72 65 70 6f 72 74 65 64 20 61 73 20 63 6f 72 72  reported as corr
2fe50 75 70 74 2e 20 20 49 6e 20 6f 72 64 65 72 0a 20  upt.  In order. 
2fe60 20 20 20 20 20 2a 2a 20 74 6f 20 6d 61 69 6e 74       ** to maint
2fe70 61 69 6e 20 62 61 63 6b 77 61 72 64 73 20 63 6f  ain backwards co
2fe80 6d 70 61 74 69 62 69 6c 69 74 79 20 77 69 74 68  mpatibility with
2fe90 20 6f 6c 64 65 72 20 76 65 72 73 69 6f 6e 73 20   older versions 
2fea0 6f 66 20 53 51 4c 69 74 65 2c 0a 20 20 20 20 20  of SQLite,.     
2feb0 20 2a 2a 20 77 65 20 77 69 6c 6c 20 63 6f 6e 74   ** we will cont
2fec0 69 6e 75 65 20 74 6f 20 72 65 73 74 72 69 63 74  inue to restrict
2fed0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65   the number of e
2fee0 6e 74 72 69 65 73 20 74 6f 20 75 73 61 62 6c 65  ntries to usable
2fef0 53 69 7a 65 2f 34 20 2d 20 38 0a 20 20 20 20 20  Size/4 - 8.     
2ff00 20 2a 2a 20 66 6f 72 20 6e 6f 77 2e 20 20 41 74   ** for now.  At
2ff10 20 73 6f 6d 65 20 70 6f 69 6e 74 20 69 6e 20 74   some point in t
2ff20 68 65 20 66 75 74 75 72 65 20 28 6f 6e 63 65 20  he future (once 
2ff30 65 76 65 72 79 6f 6e 65 20 68 61 73 20 75 70 67  everyone has upg
2ff40 72 61 64 65 64 0a 20 20 20 20 20 20 2a 2a 20 74  raded.      ** t
2ff50 6f 20 33 2e 36 2e 30 20 6f 72 20 6c 61 74 65 72  o 3.6.0 or later
2ff60 29 20 77 65 20 73 68 6f 75 6c 64 20 63 6f 6e 73  ) we should cons
2ff70 69 64 65 72 20 66 69 78 69 6e 67 20 74 68 65 20  ider fixing the 
2ff80 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 61 62 6f 76  conditional abov
2ff90 65 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 72 65  e.      ** to re
2ffa0 61 64 20 22 75 73 61 62 6c 65 53 69 7a 65 2f 34  ad "usableSize/4
2ffb0 2d 32 22 20 69 6e 73 74 65 61 64 20 6f 66 20 22  -2" instead of "
2ffc0 75 73 61 62 6c 65 53 69 7a 65 2f 34 2d 38 22 2e  usableSize/4-8".
2ffd0 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
2ffe0 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  ** EVIDENCE-OF: 
2fff0 52 2d 31 39 39 32 30 2d 31 31 35 37 36 20 48 6f  R-19920-11576 Ho
30000 77 65 76 65 72 2c 20 6e 65 77 65 72 20 76 65 72  wever, newer ver
30010 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20  sions of SQLite 
30020 73 74 69 6c 6c 0a 20 20 20 20 20 20 2a 2a 20 61  still.      ** a
30030 76 6f 69 64 20 75 73 69 6e 67 20 74 68 65 20 6c  void using the l
30040 61 73 74 20 73 69 78 20 65 6e 74 72 69 65 73 20  ast six entries 
30050 69 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  in the freelist 
30060 74 72 75 6e 6b 20 70 61 67 65 20 61 72 72 61 79  trunk page array
30070 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20 6f 72 64   in.      ** ord
30080 65 72 20 74 68 61 74 20 64 61 74 61 62 61 73 65  er that database
30090 20 66 69 6c 65 73 20 63 72 65 61 74 65 64 20 62   files created b
300a0 79 20 6e 65 77 65 72 20 76 65 72 73 69 6f 6e 73  y newer versions
300b0 20 6f 66 20 53 51 4c 69 74 65 20 63 61 6e 20 62   of SQLite can b
300c0 65 0a 20 20 20 20 20 20 2a 2a 20 72 65 61 64 20  e.      ** read 
300d0 62 79 20 6f 6c 64 65 72 20 76 65 72 73 69 6f 6e  by older version
300e0 73 20 6f 66 20 53 51 4c 69 74 65 2e 0a 20 20 20  s of SQLite..   
300f0 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d     */.      rc =
30100 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
30110 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61  te(pTrunk->pDbPa
30120 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ge);.      if( r
30130 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
30140 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
30150 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b  (&pTrunk->aData[
30160 34 5d 2c 20 6e 4c 65 61 66 2b 31 29 3b 0a 20 20  4], nLeaf+1);.  
30170 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
30180 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 2b  pTrunk->aData[8+
30190 6e 4c 65 61 66 2a 34 5d 2c 20 69 50 61 67 65 29  nLeaf*4], iPage)
301a0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  ;.        if( pP
301b0 61 67 65 20 26 26 20 28 70 42 74 2d 3e 62 74 73  age && (pBt->bts
301c0 46 6c 61 67 73 20 26 20 42 54 53 5f 53 45 43 55  Flags & BTS_SECU
301d0 52 45 5f 44 45 4c 45 54 45 29 3d 3d 30 20 29 7b  RE_DELETE)==0 ){
301e0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
301f0 65 33 50 61 67 65 72 44 6f 6e 74 57 72 69 74 65  e3PagerDontWrite
30200 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
30210 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
30220 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 53 65      rc = btreeSe
30230 74 48 61 73 43 6f 6e 74 65 6e 74 28 70 42 74 2c  tHasContent(pBt,
30240 20 69 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d   iPage);.      }
30250 0a 20 20 20 20 20 20 54 52 41 43 45 28 28 22 46  .      TRACE(("F
30260 52 45 45 2d 50 41 47 45 3a 20 25 64 20 6c 65 61  REE-PAGE: %d lea
30270 66 20 6f 6e 20 74 72 75 6e 6b 20 70 61 67 65 20  f on trunk page 
30280 25 64 5c 6e 22 2c 70 50 61 67 65 2d 3e 70 67 6e  %d\n",pPage->pgn
30290 6f 2c 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 29 29  o,pTrunk->pgno))
302a0 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 72 65  ;.      goto fre
302b0 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d  epage_out;.    }
302c0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 63 6f  .  }..  /* If co
302d0 6e 74 72 6f 6c 20 66 6c 6f 77 73 20 74 6f 20 74  ntrol flows to t
302e0 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20  his point, then 
302f0 69 74 20 77 61 73 20 6e 6f 74 20 70 6f 73 73 69  it was not possi
30300 62 6c 65 20 74 6f 20 61 64 64 20 74 68 65 0a 20  ble to add the. 
30310 20 2a 2a 20 74 68 65 20 70 61 67 65 20 62 65 69   ** the page bei
30320 6e 67 20 66 72 65 65 64 20 61 73 20 61 20 6c 65  ng freed as a le
30330 61 66 20 70 61 67 65 20 6f 66 20 74 68 65 20 66  af page of the f
30340 69 72 73 74 20 74 72 75 6e 6b 20 69 6e 20 74 68  irst trunk in th
30350 65 20 66 72 65 65 2d 6c 69 73 74 2e 0a 20 20 2a  e free-list..  *
30360 2a 20 50 6f 73 73 69 62 6c 79 20 62 65 63 61 75  * Possibly becau
30370 73 65 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  se the free-list
30380 20 69 73 20 65 6d 70 74 79 2c 20 6f 72 20 70 6f   is empty, or po
30390 73 73 69 62 6c 79 20 62 65 63 61 75 73 65 20 74  ssibly because t
303a0 68 65 20 0a 20 20 2a 2a 20 66 69 72 73 74 20 74  he .  ** first t
303b0 72 75 6e 6b 20 69 6e 20 74 68 65 20 66 72 65 65  runk in the free
303c0 2d 6c 69 73 74 20 69 73 20 66 75 6c 6c 2e 20 45  -list is full. E
303d0 69 74 68 65 72 20 77 61 79 2c 20 74 68 65 20 70  ither way, the p
303e0 61 67 65 20 62 65 69 6e 67 20 66 72 65 65 64 0a  age being freed.
303f0 20 20 2a 2a 20 77 69 6c 6c 20 62 65 63 6f 6d 65    ** will become
30400 20 74 68 65 20 6e 65 77 20 66 69 72 73 74 20 74   the new first t
30410 72 75 6e 6b 20 70 61 67 65 20 69 6e 20 74 68 65  runk page in the
30420 20 66 72 65 65 2d 6c 69 73 74 2e 0a 20 20 2a 2f   free-list..  */
30430 0a 20 20 69 66 28 20 70 50 61 67 65 3d 3d 30 20  .  if( pPage==0 
30440 26 26 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  && SQLITE_OK!=(r
30450 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65  c = btreeGetPage
30460 28 70 42 74 2c 20 69 50 61 67 65 2c 20 26 70 50  (pBt, iPage, &pP
30470 61 67 65 2c 20 30 29 29 20 29 7b 0a 20 20 20 20  age, 0)) ){.    
30480 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75  goto freepage_ou
30490 74 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71  t;.  }.  rc = sq
304a0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
304b0 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b  pPage->pDbPage);
304c0 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
304d0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f  E_OK ){.    goto
304e0 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20   freepage_out;. 
304f0 20 7d 0a 20 20 70 75 74 34 62 79 74 65 28 70 50   }.  put4byte(pP
30500 61 67 65 2d 3e 61 44 61 74 61 2c 20 69 54 72 75  age->aData, iTru
30510 6e 6b 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28  nk);.  put4byte(
30520 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 34 5d  &pPage->aData[4]
30530 2c 20 30 29 3b 0a 20 20 70 75 74 34 62 79 74 65  , 0);.  put4byte
30540 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
30550 33 32 5d 2c 20 69 50 61 67 65 29 3b 0a 20 20 54  32], iPage);.  T
30560 52 41 43 45 28 28 22 46 52 45 45 2d 50 41 47 45  RACE(("FREE-PAGE
30570 3a 20 25 64 20 6e 65 77 20 74 72 75 6e 6b 20 70  : %d new trunk p
30580 61 67 65 20 72 65 70 6c 61 63 69 6e 67 20 25 64  age replacing %d
30590 5c 6e 22 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f  \n", pPage->pgno
305a0 2c 20 69 54 72 75 6e 6b 29 29 3b 0a 0a 66 72 65  , iTrunk));..fre
305b0 65 70 61 67 65 5f 6f 75 74 3a 0a 20 20 69 66 28  epage_out:.  if(
305c0 20 70 50 61 67 65 20 29 7b 0a 20 20 20 20 70 50   pPage ){.    pP
305d0 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b  age->isInit = 0;
305e0 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 50 61  .  }.  releasePa
305f0 67 65 28 70 50 61 67 65 29 3b 0a 20 20 72 65 6c  ge(pPage);.  rel
30600 65 61 73 65 50 61 67 65 28 70 54 72 75 6e 6b 29  easePage(pTrunk)
30610 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
30620 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 72 65  .static void fre
30630 65 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70  ePage(MemPage *p
30640 50 61 67 65 2c 20 69 6e 74 20 2a 70 52 43 29 7b  Page, int *pRC){
30650 0a 20 20 69 66 28 20 28 2a 70 52 43 29 3d 3d 53  .  if( (*pRC)==S
30660 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
30670 2a 70 52 43 20 3d 20 66 72 65 65 50 61 67 65 32  *pRC = freePage2
30680 28 70 50 61 67 65 2d 3e 70 42 74 2c 20 70 50 61  (pPage->pBt, pPa
30690 67 65 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29  ge, pPage->pgno)
306a0 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  ;.  }.}../*.** F
306b0 72 65 65 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77  ree any overflow
306c0 20 70 61 67 65 73 20 61 73 73 6f 63 69 61 74 65   pages associate
306d0 64 20 77 69 74 68 20 74 68 65 20 67 69 76 65 6e  d with the given
306e0 20 43 65 6c 6c 2e 20 20 57 72 69 74 65 20 74 68   Cell.  Write th
306f0 65 0a 2a 2a 20 6c 6f 63 61 6c 20 43 65 6c 6c 20  e.** local Cell 
30700 73 69 7a 65 20 28 74 68 65 20 6e 75 6d 62 65 72  size (the number
30710 20 6f 66 20 62 79 74 65 73 20 6f 6e 20 74 68 65   of bytes on the
30720 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 2c 20   original page, 
30730 6f 6d 69 74 74 69 6e 67 0a 2a 2a 20 6f 76 65 72  omitting.** over
30740 66 6c 6f 77 29 20 69 6e 74 6f 20 2a 70 6e 53 69  flow) into *pnSi
30750 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ze..*/.static in
30760 74 20 63 6c 65 61 72 43 65 6c 6c 28 0a 20 20 4d  t clearCell(.  M
30770 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20  emPage *pPage,  
30780 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
30790 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  age that contain
307a0 73 20 74 68 65 20 43 65 6c 6c 20 2a 2f 0a 20 20  s the Cell */.  
307b0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
307c0 43 65 6c 6c 2c 20 20 20 20 2f 2a 20 46 69 72 73  Cell,    /* Firs
307d0 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 43 65  t byte of the Ce
307e0 6c 6c 20 2a 2f 0a 20 20 75 31 36 20 2a 70 6e 53  ll */.  u16 *pnS
307f0 69 7a 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ize             
30800 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 73 69   /* Write the si
30810 7a 65 20 6f 66 20 74 68 65 20 43 65 6c 6c 20 68  ze of the Cell h
30820 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68  ere */.){.  BtSh
30830 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67  ared *pBt = pPag
30840 65 2d 3e 70 42 74 3b 0a 20 20 43 65 6c 6c 49 6e  e->pBt;.  CellIn
30850 66 6f 20 69 6e 66 6f 3b 0a 20 20 50 67 6e 6f 20  fo info;.  Pgno 
30860 6f 76 66 6c 50 67 6e 6f 3b 0a 20 20 69 6e 74 20  ovflPgno;.  int 
30870 72 63 3b 0a 20 20 69 6e 74 20 6e 4f 76 66 6c 3b  rc;.  int nOvfl;
30880 0a 20 20 75 33 32 20 6f 76 66 6c 50 61 67 65 53  .  u32 ovflPageS
30890 69 7a 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ize;..  assert( 
308a0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
308b0 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
308c0 75 74 65 78 29 20 29 3b 0a 20 20 62 74 72 65 65  utex) );.  btree
308d0 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61  ParseCellPtr(pPa
308e0 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f  ge, pCell, &info
308f0 29 3b 0a 20 20 2a 70 6e 53 69 7a 65 20 3d 20 69  );.  *pnSize = i
30900 6e 66 6f 2e 6e 53 69 7a 65 3b 0a 20 20 69 66 28  nfo.nSize;.  if(
30910 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 3d   info.iOverflow=
30920 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
30930 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 2f 2a 20   SQLITE_OK;  /* 
30940 4e 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  No overflow page
30950 73 2e 20 52 65 74 75 72 6e 20 77 69 74 68 6f 75  s. Return withou
30960 74 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67  t doing anything
30970 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70 43   */.  }.  if( pC
30980 65 6c 6c 2b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c  ell+info.iOverfl
30990 6f 77 2b 33 20 3e 20 70 50 61 67 65 2d 3e 61 44  ow+3 > pPage->aD
309a0 61 74 61 2b 70 50 61 67 65 2d 3e 6d 61 73 6b 50  ata+pPage->maskP
309b0 61 67 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72  age ){.    retur
309c0 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
309d0 5f 42 4b 50 54 3b 20 20 2f 2a 20 43 65 6c 6c 20  _BKPT;  /* Cell 
309e0 65 78 74 65 6e 64 73 20 70 61 73 74 20 65 6e 64  extends past end
309f0 20 6f 66 20 70 61 67 65 20 2a 2f 0a 20 20 7d 0a   of page */.  }.
30a00 20 20 6f 76 66 6c 50 67 6e 6f 20 3d 20 67 65 74    ovflPgno = get
30a10 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66  4byte(&pCell[inf
30a20 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a 20  o.iOverflow]);. 
30a30 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 75 73   assert( pBt->us
30a40 61 62 6c 65 53 69 7a 65 20 3e 20 34 20 29 3b 0a  ableSize > 4 );.
30a50 20 20 6f 76 66 6c 50 61 67 65 53 69 7a 65 20 3d    ovflPageSize =
30a60 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
30a70 20 2d 20 34 3b 0a 20 20 6e 4f 76 66 6c 20 3d 20   - 4;.  nOvfl = 
30a80 28 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 2d  (info.nPayload -
30a90 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2b 20 6f   info.nLocal + o
30aa0 76 66 6c 50 61 67 65 53 69 7a 65 20 2d 20 31 29  vflPageSize - 1)
30ab0 2f 6f 76 66 6c 50 61 67 65 53 69 7a 65 3b 0a 20  /ovflPageSize;. 
30ac0 20 61 73 73 65 72 74 28 20 6f 76 66 6c 50 67 6e   assert( ovflPgn
30ad0 6f 3d 3d 30 20 7c 7c 20 6e 4f 76 66 6c 3e 30 20  o==0 || nOvfl>0 
30ae0 29 3b 0a 20 20 77 68 69 6c 65 28 20 6e 4f 76 66  );.  while( nOvf
30af0 6c 2d 2d 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20  l-- ){.    Pgno 
30b00 69 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 4d  iNext = 0;.    M
30b10 65 6d 50 61 67 65 20 2a 70 4f 76 66 6c 20 3d 20  emPage *pOvfl = 
30b20 30 3b 0a 20 20 20 20 69 66 28 20 6f 76 66 6c 50  0;.    if( ovflP
30b30 67 6e 6f 3c 32 20 7c 7c 20 6f 76 66 6c 50 67 6e  gno<2 || ovflPgn
30b40 6f 3e 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74  o>btreePagecount
30b50 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 2f  (pBt) ){.      /
30b60 2a 20 30 20 69 73 20 6e 6f 74 20 61 20 6c 65 67  * 0 is not a leg
30b70 61 6c 20 70 61 67 65 20 6e 75 6d 62 65 72 20 61  al page number a
30b80 6e 64 20 70 61 67 65 20 31 20 63 61 6e 6e 6f 74  nd page 1 cannot
30b90 20 62 65 20 61 6e 20 0a 20 20 20 20 20 20 2a 2a   be an .      **
30ba0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20   overflow page. 
30bb0 54 68 65 72 65 66 6f 72 65 20 69 66 20 6f 76 66  Therefore if ovf
30bc0 6c 50 67 6e 6f 3c 32 20 6f 72 20 70 61 73 74 20  lPgno<2 or past 
30bd0 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 0a  the end of the .
30be0 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 74 68        ** file th
30bf0 65 20 64 61 74 61 62 61 73 65 20 6d 75 73 74 20  e database must 
30c00 62 65 20 63 6f 72 72 75 70 74 2e 20 2a 2f 0a 20  be corrupt. */. 
30c10 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
30c20 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
30c30 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e  .    }.    if( n
30c40 4f 76 66 6c 20 29 7b 0a 20 20 20 20 20 20 72 63  Ovfl ){.      rc
30c50 20 3d 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61   = getOverflowPa
30c60 67 65 28 70 42 74 2c 20 6f 76 66 6c 50 67 6e 6f  ge(pBt, ovflPgno
30c70 2c 20 26 70 4f 76 66 6c 2c 20 26 69 4e 65 78 74  , &pOvfl, &iNext
30c80 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
30c90 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
30ca0 20 7d 0a 0a 20 20 20 20 69 66 28 20 28 20 70 4f   }..    if( ( pO
30cb0 76 66 6c 20 7c 7c 20 28 28 70 4f 76 66 6c 20 3d  vfl || ((pOvfl =
30cc0 20 62 74 72 65 65 50 61 67 65 4c 6f 6f 6b 75 70   btreePageLookup
30cd0 28 70 42 74 2c 20 6f 76 66 6c 50 67 6e 6f 29 29  (pBt, ovflPgno))
30ce0 21 3d 30 29 20 29 0a 20 20 20 20 20 26 26 20 73  !=0) ).     && s
30cf0 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 52  qlite3PagerPageR
30d00 65 66 63 6f 75 6e 74 28 70 4f 76 66 6c 2d 3e 70  efcount(pOvfl->p
30d10 44 62 50 61 67 65 29 21 3d 31 0a 20 20 20 20 29  DbPage)!=1.    )
30d20 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 72 65  {.      /* There
30d30 20 69 73 20 6e 6f 20 72 65 61 73 6f 6e 20 61 6e   is no reason an
30d40 79 20 63 75 72 73 6f 72 20 73 68 6f 75 6c 64 20  y cursor should 
30d50 68 61 76 65 20 61 6e 20 6f 75 74 73 74 61 6e 64  have an outstand
30d60 69 6e 67 20 72 65 66 65 72 65 6e 63 65 20 0a 20  ing reference . 
30d70 20 20 20 20 20 2a 2a 20 74 6f 20 61 6e 20 6f 76       ** to an ov
30d80 65 72 66 6c 6f 77 20 70 61 67 65 20 62 65 6c 6f  erflow page belo
30d90 6e 67 69 6e 67 20 74 6f 20 61 20 63 65 6c 6c 20  nging to a cell 
30da0 74 68 61 74 20 69 73 20 62 65 69 6e 67 20 64 65  that is being de
30db0 6c 65 74 65 64 2f 75 70 64 61 74 65 64 2e 0a 20  leted/updated.. 
30dc0 20 20 20 20 20 2a 2a 20 53 6f 20 69 66 20 74 68       ** So if th
30dd0 65 72 65 20 65 78 69 73 74 73 20 6d 6f 72 65 20  ere exists more 
30de0 74 68 61 6e 20 6f 6e 65 20 72 65 66 65 72 65 6e  than one referen
30df0 63 65 20 74 6f 20 74 68 69 73 20 70 61 67 65 2c  ce to this page,
30e00 20 74 68 65 6e 20 69 74 20 0a 20 20 20 20 20 20   then it .      
30e10 2a 2a 20 6d 75 73 74 20 6e 6f 74 20 72 65 61 6c  ** must not real
30e20 6c 79 20 62 65 20 61 6e 20 6f 76 65 72 66 6c 6f  ly be an overflo
30e30 77 20 70 61 67 65 20 61 6e 64 20 74 68 65 20 64  w page and the d
30e40 61 74 61 62 61 73 65 20 6d 75 73 74 20 62 65 20  atabase must be 
30e50 63 6f 72 72 75 70 74 2e 20 0a 20 20 20 20 20 20  corrupt. .      
30e60 2a 2a 20 49 74 20 69 73 20 68 65 6c 70 66 75 6c  ** It is helpful
30e70 20 74 6f 20 64 65 74 65 63 74 20 74 68 69 73 20   to detect this 
30e80 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 66  before calling f
30e90 72 65 65 50 61 67 65 32 28 29 2c 20 61 73 20 0a  reePage2(), as .
30ea0 20 20 20 20 20 20 2a 2a 20 66 72 65 65 50 61 67        ** freePag
30eb0 65 32 28 29 20 6d 61 79 20 7a 65 72 6f 20 74 68  e2() may zero th
30ec0 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 73 20  e page contents 
30ed0 69 66 20 73 65 63 75 72 65 2d 64 65 6c 65 74 65  if secure-delete
30ee0 20 6d 6f 64 65 20 69 73 0a 20 20 20 20 20 20 2a   mode is.      *
30ef0 2a 20 65 6e 61 62 6c 65 64 2e 20 49 66 20 74 68  * enabled. If th
30f00 69 73 20 27 6f 76 65 72 66 6c 6f 77 27 20 70 61  is 'overflow' pa
30f10 67 65 20 68 61 70 70 65 6e 73 20 74 6f 20 62 65  ge happens to be
30f20 20 61 20 70 61 67 65 20 74 68 61 74 20 74 68 65   a page that the
30f30 0a 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c 65 72  .      ** caller
30f40 20 69 73 20 69 74 65 72 61 74 69 6e 67 20 74 68   is iterating th
30f50 72 6f 75 67 68 20 6f 72 20 75 73 69 6e 67 20 69  rough or using i
30f60 6e 20 73 6f 6d 65 20 6f 74 68 65 72 20 77 61 79  n some other way
30f70 2c 20 74 68 69 73 0a 20 20 20 20 20 20 2a 2a 20  , this.      ** 
30f80 63 61 6e 20 62 65 20 70 72 6f 62 6c 65 6d 61 74  can be problemat
30f90 69 63 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ic..      */.   
30fa0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
30fb0 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
30fc0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
30fd0 20 3d 20 66 72 65 65 50 61 67 65 32 28 70 42 74   = freePage2(pBt
30fe0 2c 20 70 4f 76 66 6c 2c 20 6f 76 66 6c 50 67 6e  , pOvfl, ovflPgn
30ff0 6f 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  o);.    }..    i
31000 66 28 20 70 4f 76 66 6c 20 29 7b 0a 20 20 20 20  f( pOvfl ){.    
31010 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
31020 72 65 66 28 70 4f 76 66 6c 2d 3e 70 44 62 50 61  ref(pOvfl->pDbPa
31030 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ge);.    }.    i
31040 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
31050 63 3b 0a 20 20 20 20 6f 76 66 6c 50 67 6e 6f 20  c;.    ovflPgno 
31060 3d 20 69 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 72  = iNext;.  }.  r
31070 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
31080 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  .}../*.** Create
31090 20 74 68 65 20 62 79 74 65 20 73 65 71 75 65 6e   the byte sequen
310a0 63 65 20 75 73 65 64 20 74 6f 20 72 65 70 72 65  ce used to repre
310b0 73 65 6e 74 20 61 20 63 65 6c 6c 20 6f 6e 20 70  sent a cell on p
310c0 61 67 65 20 70 50 61 67 65 0a 2a 2a 20 61 6e 64  age pPage.** and
310d0 20 77 72 69 74 65 20 74 68 61 74 20 62 79 74 65   write that byte
310e0 20 73 65 71 75 65 6e 63 65 20 69 6e 74 6f 20 70   sequence into p
310f0 43 65 6c 6c 5b 5d 2e 20 20 4f 76 65 72 66 6c 6f  Cell[].  Overflo
31100 77 20 70 61 67 65 73 20 61 72 65 0a 2a 2a 20 61  w pages are.** a
31110 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 66 69 6c  llocated and fil
31120 6c 65 64 20 69 6e 20 61 73 20 6e 65 63 65 73 73  led in as necess
31130 61 72 79 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e  ary.  The callin
31140 67 20 70 72 6f 63 65 64 75 72 65 0a 2a 2a 20 69  g procedure.** i
31150 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f  s responsible fo
31160 72 20 6d 61 6b 69 6e 67 20 73 75 72 65 20 73 75  r making sure su
31170 66 66 69 63 69 65 6e 74 20 73 70 61 63 65 20 68  fficient space h
31180 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65  as been allocate
31190 64 0a 2a 2a 20 66 6f 72 20 70 43 65 6c 6c 5b 5d  d.** for pCell[]
311a0 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61  ..**.** Note tha
311b0 74 20 70 43 65 6c 6c 20 64 6f 65 73 20 6e 6f 74  t pCell does not
311c0 20 6e 65 63 65 73 73 61 72 79 20 6e 65 65 64 20   necessary need 
311d0 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  to point to the 
311e0 70 50 61 67 65 2d 3e 61 44 61 74 61 0a 2a 2a 20  pPage->aData.** 
311f0 61 72 65 61 2e 20 20 70 43 65 6c 6c 20 6d 69 67  area.  pCell mig
31200 68 74 20 70 6f 69 6e 74 20 74 6f 20 73 6f 6d 65  ht point to some
31210 20 74 65 6d 70 6f 72 61 72 79 20 73 74 6f 72 61   temporary stora
31220 67 65 2e 20 20 54 68 65 20 63 65 6c 6c 20 77 69  ge.  The cell wi
31230 6c 6c 0a 2a 2a 20 62 65 20 63 6f 6e 73 74 72 75  ll.** be constru
31240 63 74 65 64 20 69 6e 20 74 68 69 73 20 74 65 6d  cted in this tem
31250 70 6f 72 61 72 79 20 61 72 65 61 20 74 68 65 6e  porary area then
31260 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 70 50 61   copied into pPa
31270 67 65 2d 3e 61 44 61 74 61 0a 2a 2a 20 6c 61 74  ge->aData.** lat
31280 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  er..*/.static in
31290 74 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 0a 20 20  t fillInCell(.  
312a0 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
312b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
312c0 2a 20 54 68 65 20 70 61 67 65 20 74 68 61 74 20  * The page that 
312d0 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 63 65 6c  contains the cel
312e0 6c 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  l */.  unsigned 
312f0 63 68 61 72 20 2a 70 43 65 6c 6c 2c 20 20 20 20  char *pCell,    
31300 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 6c 65 74        /* Complet
31310 65 20 74 65 78 74 20 6f 66 20 74 68 65 20 63 65  e text of the ce
31320 6c 6c 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f  ll */.  const vo
31330 69 64 20 2a 70 4b 65 79 2c 20 69 36 34 20 6e 4b  id *pKey, i64 nK
31340 65 79 2c 20 20 20 20 2f 2a 20 54 68 65 20 6b 65  ey,    /* The ke
31350 79 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69  y */.  const voi
31360 64 20 2a 70 44 61 74 61 2c 69 6e 74 20 6e 44 61  d *pData,int nDa
31370 74 61 2c 20 20 20 2f 2a 20 54 68 65 20 64 61 74  ta,   /* The dat
31380 61 20 2a 2f 0a 20 20 69 6e 74 20 6e 5a 65 72 6f  a */.  int nZero
31390 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
313a0 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20 7a        /* Extra z
313b0 65 72 6f 20 62 79 74 65 73 20 74 6f 20 61 70 70  ero bytes to app
313c0 65 6e 64 20 74 6f 20 70 44 61 74 61 20 2a 2f 0a  end to pData */.
313d0 20 20 69 6e 74 20 2a 70 6e 53 69 7a 65 20 20 20    int *pnSize   
313e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
313f0 20 2f 2a 20 57 72 69 74 65 20 63 65 6c 6c 20 73   /* Write cell s
31400 69 7a 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  ize here */.){. 
31410 20 69 6e 74 20 6e 50 61 79 6c 6f 61 64 3b 0a 20   int nPayload;. 
31420 20 63 6f 6e 73 74 20 75 38 20 2a 70 53 72 63 3b   const u8 *pSrc;
31430 0a 20 20 69 6e 74 20 6e 53 72 63 2c 20 6e 2c 20  .  int nSrc, n, 
31440 72 63 3b 0a 20 20 69 6e 74 20 73 70 61 63 65 4c  rc;.  int spaceL
31450 65 66 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  eft;.  MemPage *
31460 70 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 4d 65 6d  pOvfl = 0;.  Mem
31470 50 61 67 65 20 2a 70 54 6f 52 65 6c 65 61 73 65  Page *pToRelease
31480 20 3d 20 30 3b 0a 20 20 75 6e 73 69 67 6e 65 64   = 0;.  unsigned
31490 20 63 68 61 72 20 2a 70 50 72 69 6f 72 3b 0a 20   char *pPrior;. 
314a0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
314b0 70 50 61 79 6c 6f 61 64 3b 0a 20 20 42 74 53 68  pPayload;.  BtSh
314c0 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67  ared *pBt = pPag
314d0 65 2d 3e 70 42 74 3b 0a 20 20 50 67 6e 6f 20 70  e->pBt;.  Pgno p
314e0 67 6e 6f 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 69  gnoOvfl = 0;.  i
314f0 6e 74 20 6e 48 65 61 64 65 72 3b 0a 0a 20 20 61  nt nHeader;..  a
31500 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
31510 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
31520 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
31530 0a 20 20 2f 2a 20 70 50 61 67 65 20 69 73 20 6e  .  /* pPage is n
31540 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20 77  ot necessarily w
31550 72 69 74 65 61 62 6c 65 20 73 69 6e 63 65 20 70  riteable since p
31560 43 65 6c 6c 20 6d 69 67 68 74 20 62 65 20 61 75  Cell might be au
31570 78 69 6c 69 61 72 79 0a 20 20 2a 2a 20 62 75 66  xiliary.  ** buf
31580 66 65 72 20 73 70 61 63 65 20 74 68 61 74 20 69  fer space that i
31590 73 20 73 65 70 61 72 61 74 65 20 66 72 6f 6d 20  s separate from 
315a0 74 68 65 20 70 50 61 67 65 20 62 75 66 66 65 72  the pPage buffer
315b0 20 61 72 65 61 20 2a 2f 0a 20 20 61 73 73 65 72   area */.  asser
315c0 74 28 20 70 43 65 6c 6c 3c 70 50 61 67 65 2d 3e  t( pCell<pPage->
315d0 61 44 61 74 61 20 7c 7c 20 70 43 65 6c 6c 3e 3d  aData || pCell>=
315e0 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 42  &pPage->aData[pB
315f0 74 2d 3e 70 61 67 65 53 69 7a 65 5d 0a 20 20 20  t->pageSize].   
31600 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69           || sqli
31610 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
31620 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
31630 67 65 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c  ge) );..  /* Fil
31640 6c 20 69 6e 20 74 68 65 20 68 65 61 64 65 72 2e  l in the header.
31650 20 2a 2f 0a 20 20 6e 48 65 61 64 65 72 20 3d 20   */.  nHeader = 
31660 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53  pPage->childPtrS
31670 69 7a 65 3b 0a 20 20 6e 50 61 79 6c 6f 61 64 20  ize;.  nPayload 
31680 3d 20 6e 44 61 74 61 20 2b 20 6e 5a 65 72 6f 3b  = nData + nZero;
31690 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e  .  if( pPage->in
316a0 74 4b 65 79 4c 65 61 66 20 29 7b 0a 20 20 20 20  tKeyLeaf ){.    
316b0 6e 48 65 61 64 65 72 20 2b 3d 20 70 75 74 56 61  nHeader += putVa
316c0 72 69 6e 74 33 32 28 26 70 43 65 6c 6c 5b 6e 48  rint32(&pCell[nH
316d0 65 61 64 65 72 5d 2c 20 6e 50 61 79 6c 6f 61 64  eader], nPayload
316e0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
316f0 61 73 73 65 72 74 28 20 6e 44 61 74 61 3d 3d 30  assert( nData==0
31700 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
31710 6e 5a 65 72 6f 3d 3d 30 20 29 3b 0a 20 20 7d 0a  nZero==0 );.  }.
31720 20 20 6e 48 65 61 64 65 72 20 2b 3d 20 70 75 74    nHeader += put
31730 56 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b 6e 48  Varint(&pCell[nH
31740 65 61 64 65 72 5d 2c 20 2a 28 75 36 34 2a 29 26  eader], *(u64*)&
31750 6e 4b 65 79 29 3b 0a 20 20 0a 20 20 2f 2a 20 46  nKey);.  .  /* F
31760 69 6c 6c 20 69 6e 20 74 68 65 20 70 61 79 6c 6f  ill in the paylo
31770 61 64 20 73 69 7a 65 20 2a 2f 0a 20 20 69 66 28  ad size */.  if(
31780 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29   pPage->intKey )
31790 7b 0a 20 20 20 20 70 53 72 63 20 3d 20 70 44 61  {.    pSrc = pDa
317a0 74 61 3b 0a 20 20 20 20 6e 53 72 63 20 3d 20 6e  ta;.    nSrc = n
317b0 44 61 74 61 3b 0a 20 20 20 20 6e 44 61 74 61 20  Data;.    nData 
317c0 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 20 0a 20  = 0;.  }else{ . 
317d0 20 20 20 69 66 28 20 4e 45 56 45 52 28 6e 4b 65     if( NEVER(nKe
317e0 79 3e 30 78 37 66 66 66 66 66 66 66 20 7c 7c 20  y>0x7fffffff || 
317f0 70 4b 65 79 3d 3d 30 29 20 29 7b 0a 20 20 20 20  pKey==0) ){.    
31800 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
31810 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
31820 20 20 7d 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64    }.    nPayload
31830 20 3d 20 28 69 6e 74 29 6e 4b 65 79 3b 0a 20 20   = (int)nKey;.  
31840 20 20 70 53 72 63 20 3d 20 70 4b 65 79 3b 0a 20    pSrc = pKey;. 
31850 20 20 20 6e 53 72 63 20 3d 20 28 69 6e 74 29 6e     nSrc = (int)n
31860 4b 65 79 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e  Key;.  }.  if( n
31870 50 61 79 6c 6f 61 64 3c 3d 70 50 61 67 65 2d 3e  Payload<=pPage->
31880 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20  maxLocal ){.    
31890 6e 20 3d 20 6e 48 65 61 64 65 72 20 2b 20 6e 50  n = nHeader + nP
318a0 61 79 6c 6f 61 64 3b 0a 20 20 20 20 74 65 73 74  ayload;.    test
318b0 63 61 73 65 28 20 6e 3d 3d 33 20 29 3b 0a 20 20  case( n==3 );.  
318c0 20 20 74 65 73 74 63 61 73 65 28 20 6e 3d 3d 34    testcase( n==4
318d0 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 3c 34 20   );.    if( n<4 
318e0 29 20 6e 20 3d 20 34 3b 0a 20 20 20 20 2a 70 6e  ) n = 4;.    *pn
318f0 53 69 7a 65 20 3d 20 6e 3b 0a 20 20 20 20 73 70  Size = n;.    sp
31900 61 63 65 4c 65 66 74 20 3d 20 6e 50 61 79 6c 6f  aceLeft = nPaylo
31910 61 64 3b 0a 20 20 20 20 70 50 72 69 6f 72 20 3d  ad;.    pPrior =
31920 20 70 43 65 6c 6c 3b 0a 20 20 7d 65 6c 73 65 7b   pCell;.  }else{
31930 0a 20 20 20 20 69 6e 74 20 6d 6e 20 3d 20 70 50  .    int mn = pP
31940 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20  age->minLocal;. 
31950 20 20 20 6e 20 3d 20 6d 6e 20 2b 20 28 6e 50 61     n = mn + (nPa
31960 79 6c 6f 61 64 20 2d 20 6d 6e 29 20 25 20 28 70  yload - mn) % (p
31970 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
31980 65 53 69 7a 65 20 2d 20 34 29 3b 0a 20 20 20 20  eSize - 4);.    
31990 74 65 73 74 63 61 73 65 28 20 6e 3d 3d 70 50 61  testcase( n==pPa
319a0 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a  ge->maxLocal );.
319b0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 3d      testcase( n=
319c0 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c  =pPage->maxLocal
319d0 2b 31 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 20  +1 );.    if( n 
319e0 3e 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  > pPage->maxLoca
319f0 6c 20 29 20 6e 20 3d 20 6d 6e 3b 0a 20 20 20 20  l ) n = mn;.    
31a00 73 70 61 63 65 4c 65 66 74 20 3d 20 6e 3b 0a 20  spaceLeft = n;. 
31a10 20 20 20 2a 70 6e 53 69 7a 65 20 3d 20 6e 20 2b     *pnSize = n +
31a20 20 6e 48 65 61 64 65 72 20 2b 20 34 3b 0a 20 20   nHeader + 4;.  
31a30 20 20 70 50 72 69 6f 72 20 3d 20 26 70 43 65 6c    pPrior = &pCel
31a40 6c 5b 6e 48 65 61 64 65 72 2b 6e 5d 3b 0a 20 20  l[nHeader+n];.  
31a50 7d 0a 20 20 70 50 61 79 6c 6f 61 64 20 3d 20 26  }.  pPayload = &
31a60 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 3b 0a  pCell[nHeader];.
31a70 0a 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f  .  /* At this po
31a80 69 6e 74 20 76 61 72 69 61 62 6c 65 73 20 73 68  int variables sh
31a90 6f 75 6c 64 20 62 65 20 73 65 74 20 61 73 20 66  ould be set as f
31aa0 6f 6c 6c 6f 77 73 3a 0a 20 20 2a 2a 0a 20 20 2a  ollows:.  **.  *
31ab0 2a 20 20 20 6e 50 61 79 6c 6f 61 64 20 20 20 20  *   nPayload    
31ac0 20 20 20 20 20 20 20 54 6f 74 61 6c 20 70 61 79         Total pay
31ad0 6c 6f 61 64 20 73 69 7a 65 20 69 6e 20 62 79 74  load size in byt
31ae0 65 73 0a 20 20 2a 2a 20 20 20 70 50 61 79 6c 6f  es.  **   pPaylo
31af0 61 64 20 20 20 20 20 20 20 20 20 20 20 42 65 67  ad           Beg
31b00 69 6e 20 77 72 69 74 69 6e 67 20 70 61 79 6c 6f  in writing paylo
31b10 61 64 20 68 65 72 65 0a 20 20 2a 2a 20 20 20 73  ad here.  **   s
31b20 70 61 63 65 4c 65 66 74 20 20 20 20 20 20 20 20  paceLeft        
31b30 20 20 53 70 61 63 65 20 61 76 61 69 6c 61 62 6c    Space availabl
31b40 65 20 61 74 20 70 50 61 79 6c 6f 61 64 2e 20 20  e at pPayload.  
31b50 49 66 20 6e 50 61 79 6c 6f 61 64 3e 73 70 61 63  If nPayload>spac
31b60 65 4c 65 66 74 2c 0a 20 20 2a 2a 20 20 20 20 20  eLeft,.  **     
31b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31b80 20 74 68 61 74 20 6d 65 61 6e 73 20 63 6f 6e 74   that means cont
31b90 65 6e 74 20 6d 75 73 74 20 73 70 69 6c 6c 20 69  ent must spill i
31ba0 6e 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  nto overflow pag
31bb0 65 73 2e 0a 20 20 2a 2a 20 20 20 2a 70 6e 53 69  es..  **   *pnSi
31bc0 7a 65 20 20 20 20 20 20 20 20 20 20 20 20 53 69  ze            Si
31bd0 7a 65 20 6f 66 20 74 68 65 20 6c 6f 63 61 6c 20  ze of the local 
31be0 63 65 6c 6c 20 28 6e 6f 74 20 63 6f 75 6e 74 69  cell (not counti
31bf0 6e 67 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  ng overflow page
31c00 73 29 0a 20 20 2a 2a 20 20 20 70 50 72 69 6f 72  s).  **   pPrior
31c10 20 20 20 20 20 20 20 20 20 20 20 20 20 57 68 65               Whe
31c20 72 65 20 74 6f 20 77 72 69 74 65 20 74 68 65 20  re to write the 
31c30 70 67 6e 6f 20 6f 66 20 74 68 65 20 66 69 72 73  pgno of the firs
31c40 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 0a  t overflow page.
31c50 20 20 2a 2a 0a 20 20 2a 2a 20 55 73 65 20 61 20    **.  ** Use a 
31c60 63 61 6c 6c 20 74 6f 20 62 74 72 65 65 50 61 72  call to btreePar
31c70 73 65 43 65 6c 6c 50 74 72 28 29 20 74 6f 20 76  seCellPtr() to v
31c80 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20 76  erify that the v
31c90 61 6c 75 65 73 20 61 62 6f 76 65 0a 20 20 2a 2a  alues above.  **
31ca0 20 77 65 72 65 20 63 6f 6d 70 75 74 65 64 20 63   were computed c
31cb0 6f 72 72 65 63 74 6c 79 2e 0a 20 20 2a 2f 0a 23  orrectly..  */.#
31cc0 69 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  if SQLITE_DEBUG.
31cd0 20 20 7b 0a 20 20 20 20 43 65 6c 6c 49 6e 66 6f    {.    CellInfo
31ce0 20 69 6e 66 6f 3b 0a 20 20 20 20 62 74 72 65 65   info;.    btree
31cf0 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61  ParseCellPtr(pPa
31d00 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f  ge, pCell, &info
31d10 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e  );.    assert( n
31d20 48 65 61 64 65 72 3d 28 69 6e 74 29 28 69 6e 66  Header=(int)(inf
31d30 6f 2e 70 50 61 79 6c 6f 61 64 20 2d 20 70 43 65  o.pPayload - pCe
31d40 6c 6c 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ll) );.    asser
31d50 74 28 20 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 6e 4b  t( info.nKey==nK
31d60 65 79 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ey );.    assert
31d70 28 20 2a 70 6e 53 69 7a 65 20 3d 3d 20 69 6e 66  ( *pnSize == inf
31d80 6f 2e 6e 53 69 7a 65 20 29 3b 0a 20 20 20 20 61  o.nSize );.    a
31d90 73 73 65 72 74 28 20 73 70 61 63 65 4c 65 66 74  ssert( spaceLeft
31da0 20 3d 3d 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20   == info.nLocal 
31db0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
31dc0 50 72 69 6f 72 20 3d 3d 20 26 70 43 65 6c 6c 5b  Prior == &pCell[
31dd0 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 20  info.iOverflow] 
31de0 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
31df0 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 70 61   /* Write the pa
31e00 79 6c 6f 61 64 20 69 6e 74 6f 20 74 68 65 20 6c  yload into the l
31e10 6f 63 61 6c 20 43 65 6c 6c 20 61 6e 64 20 61 6e  ocal Cell and an
31e20 79 20 65 78 74 72 61 20 69 6e 74 6f 20 6f 76 65  y extra into ove
31e30 72 66 6c 6f 77 20 70 61 67 65 73 20 2a 2f 0a 20  rflow pages */. 
31e40 20 77 68 69 6c 65 28 20 6e 50 61 79 6c 6f 61 64   while( nPayload
31e50 3e 30 20 29 7b 0a 20 20 20 20 69 66 28 20 73 70  >0 ){.    if( sp
31e60 61 63 65 4c 65 66 74 3d 3d 30 20 29 7b 0a 23 69  aceLeft==0 ){.#i
31e70 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
31e80 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
31e90 20 20 20 50 67 6e 6f 20 70 67 6e 6f 50 74 72 6d     Pgno pgnoPtrm
31ea0 61 70 20 3d 20 70 67 6e 6f 4f 76 66 6c 3b 20 2f  ap = pgnoOvfl; /
31eb0 2a 20 4f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  * Overflow page 
31ec0 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72  pointer-map entr
31ed0 79 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20  y page */.      
31ee0 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  if( pBt->autoVac
31ef0 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 64  uum ){.        d
31f00 6f 7b 0a 20 20 20 20 20 20 20 20 20 20 70 67 6e  o{.          pgn
31f10 6f 4f 76 66 6c 2b 2b 3b 0a 20 20 20 20 20 20 20  oOvfl++;.       
31f20 20 7d 20 77 68 69 6c 65 28 20 0a 20 20 20 20 20   } while( .     
31f30 20 20 20 20 20 50 54 52 4d 41 50 5f 49 53 50 41       PTRMAP_ISPA
31f40 47 45 28 70 42 74 2c 20 70 67 6e 6f 4f 76 66 6c  GE(pBt, pgnoOvfl
31f50 29 20 7c 7c 20 70 67 6e 6f 4f 76 66 6c 3d 3d 50  ) || pgnoOvfl==P
31f60 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
31f70 28 70 42 74 29 20 0a 20 20 20 20 20 20 20 20 29  (pBt) .        )
31f80 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
31f90 0a 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f  .      rc = allo
31fa0 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42  cateBtreePage(pB
31fb0 74 2c 20 26 70 4f 76 66 6c 2c 20 26 70 67 6e 6f  t, &pOvfl, &pgno
31fc0 4f 76 66 6c 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20  Ovfl, pgnoOvfl, 
31fd0 30 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  0);.#ifndef SQLI
31fe0 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
31ff0 55 4d 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  UM.      /* If t
32000 68 65 20 64 61 74 61 62 61 73 65 20 73 75 70 70  he database supp
32010 6f 72 74 73 20 61 75 74 6f 2d 76 61 63 75 75 6d  orts auto-vacuum
32020 2c 20 61 6e 64 20 74 68 65 20 73 65 63 6f 6e 64  , and the second
32030 20 6f 72 20 73 75 62 73 65 71 75 65 6e 74 0a 20   or subsequent. 
32040 20 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77       ** overflow
32050 20 70 61 67 65 20 69 73 20 62 65 69 6e 67 20 61   page is being a
32060 6c 6c 6f 63 61 74 65 64 2c 20 61 64 64 20 61 6e  llocated, add an
32070 20 65 6e 74 72 79 20 74 6f 20 74 68 65 20 70 6f   entry to the po
32080 69 6e 74 65 72 2d 6d 61 70 0a 20 20 20 20 20 20  inter-map.      
32090 2a 2a 20 66 6f 72 20 74 68 61 74 20 70 61 67 65  ** for that page
320a0 20 6e 6f 77 2e 20 0a 20 20 20 20 20 20 2a 2a 0a   now. .      **.
320b0 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68 69 73        ** If this
320c0 20 69 73 20 74 68 65 20 66 69 72 73 74 20 6f 76   is the first ov
320d0 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 74 68 65  erflow page, the
320e0 6e 20 77 72 69 74 65 20 61 20 70 61 72 74 69 61  n write a partia
320f0 6c 20 65 6e 74 72 79 20 0a 20 20 20 20 20 20 2a  l entry .      *
32100 2a 20 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72  * to the pointer
32110 2d 6d 61 70 2e 20 49 66 20 77 65 20 77 72 69 74  -map. If we writ
32120 65 20 6e 6f 74 68 69 6e 67 20 74 6f 20 74 68 69  e nothing to thi
32130 73 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 73 6c  s pointer-map sl
32140 6f 74 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  ot,.      ** the
32150 6e 20 74 68 65 20 6f 70 74 69 6d 69 73 74 69 63  n the optimistic
32160 20 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 20   overflow chain 
32170 70 72 6f 63 65 73 73 69 6e 67 20 69 6e 20 63 6c  processing in cl
32180 65 61 72 43 65 6c 6c 28 29 0a 20 20 20 20 20 20  earCell().      
32190 2a 2a 20 6d 61 79 20 6d 69 73 69 6e 74 65 72 70  ** may misinterp
321a0 72 65 74 20 74 68 65 20 75 6e 69 6e 69 74 69 61  ret the uninitia
321b0 6c 69 7a 65 64 20 76 61 6c 75 65 73 20 61 6e 64  lized values and
321c0 20 64 65 6c 65 74 65 20 74 68 65 0a 20 20 20 20   delete the.    
321d0 20 20 2a 2a 20 77 72 6f 6e 67 20 70 61 67 65 73    ** wrong pages
321e0 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
321f0 73 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  se..      */.   
32200 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f     if( pBt->auto
32210 56 61 63 75 75 6d 20 26 26 20 72 63 3d 3d 53 51  Vacuum && rc==SQ
32220 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
32230 20 20 20 75 38 20 65 54 79 70 65 20 3d 20 28 70     u8 eType = (p
32240 67 6e 6f 50 74 72 6d 61 70 3f 50 54 52 4d 41 50  gnoPtrmap?PTRMAP
32250 5f 4f 56 45 52 46 4c 4f 57 32 3a 50 54 52 4d 41  _OVERFLOW2:PTRMA
32260 50 5f 4f 56 45 52 46 4c 4f 57 31 29 3b 0a 20 20  P_OVERFLOW1);.  
32270 20 20 20 20 20 20 70 74 72 6d 61 70 50 75 74 28        ptrmapPut(
32280 70 42 74 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 65  pBt, pgnoOvfl, e
32290 54 79 70 65 2c 20 70 67 6e 6f 50 74 72 6d 61 70  Type, pgnoPtrmap
322a0 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20 20 20  , &rc);.        
322b0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
322c0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
322d0 70 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20 20 20  pOvfl);.        
322e0 7d 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  }.      }.#endif
322f0 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b  .      if( rc ){
32300 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65  .        release
32310 50 61 67 65 28 70 54 6f 52 65 6c 65 61 73 65 29  Page(pToRelease)
32320 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
32330 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20   rc;.      }..  
32340 20 20 20 20 2f 2a 20 49 66 20 70 54 6f 52 65 6c      /* If pToRel
32350 65 61 73 65 20 69 73 20 6e 6f 74 20 7a 65 72 6f  ease is not zero
32360 20 74 68 61 6e 20 70 50 72 69 6f 72 20 70 6f 69   than pPrior poi
32370 6e 74 73 20 69 6e 74 6f 20 74 68 65 20 64 61 74  nts into the dat
32380 61 20 61 72 65 61 0a 20 20 20 20 20 20 2a 2a 20  a area.      ** 
32390 6f 66 20 70 54 6f 52 65 6c 65 61 73 65 2e 20 20  of pToRelease.  
323a0 4d 61 6b 65 20 73 75 72 65 20 70 54 6f 52 65 6c  Make sure pToRel
323b0 65 61 73 65 20 69 73 20 73 74 69 6c 6c 20 77 72  ease is still wr
323c0 69 74 65 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20  iteable. */.    
323d0 20 20 61 73 73 65 72 74 28 20 70 54 6f 52 65 6c    assert( pToRel
323e0 65 61 73 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74  ease==0 || sqlit
323f0 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
32400 6c 65 28 70 54 6f 52 65 6c 65 61 73 65 2d 3e 70  le(pToRelease->p
32410 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20  DbPage) );..    
32420 20 20 2f 2a 20 49 66 20 70 50 72 69 6f 72 20 69    /* If pPrior i
32430 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 64 61  s part of the da
32440 74 61 20 61 72 65 61 20 6f 66 20 70 50 61 67 65  ta area of pPage
32450 2c 20 74 68 65 6e 20 6d 61 6b 65 20 73 75 72 65  , then make sure
32460 20 70 50 61 67 65 0a 20 20 20 20 20 20 2a 2a 20   pPage.      ** 
32470 69 73 20 73 74 69 6c 6c 20 77 72 69 74 65 61 62  is still writeab
32480 6c 65 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65  le */.      asse
32490 72 74 28 20 70 50 72 69 6f 72 3c 70 50 61 67 65  rt( pPrior<pPage
324a0 2d 3e 61 44 61 74 61 20 7c 7c 20 70 50 72 69 6f  ->aData || pPrio
324b0 72 3e 3d 26 70 50 61 67 65 2d 3e 61 44 61 74 61  r>=&pPage->aData
324c0 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d 0a  [pBt->pageSize].
324d0 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73              || s
324e0 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
324f0 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
32500 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 20  bPage) );..     
32510 20 70 75 74 34 62 79 74 65 28 70 50 72 69 6f 72   put4byte(pPrior
32520 2c 20 70 67 6e 6f 4f 76 66 6c 29 3b 0a 20 20 20  , pgnoOvfl);.   
32530 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
32540 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 20 20  ToRelease);.    
32550 20 20 70 54 6f 52 65 6c 65 61 73 65 20 3d 20 70    pToRelease = p
32560 4f 76 66 6c 3b 0a 20 20 20 20 20 20 70 50 72 69  Ovfl;.      pPri
32570 6f 72 20 3d 20 70 4f 76 66 6c 2d 3e 61 44 61 74  or = pOvfl->aDat
32580 61 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74  a;.      put4byt
32590 65 28 70 50 72 69 6f 72 2c 20 30 29 3b 0a 20 20  e(pPrior, 0);.  
325a0 20 20 20 20 70 50 61 79 6c 6f 61 64 20 3d 20 26      pPayload = &
325b0 70 4f 76 66 6c 2d 3e 61 44 61 74 61 5b 34 5d 3b  pOvfl->aData[4];
325c0 0a 20 20 20 20 20 20 73 70 61 63 65 4c 65 66 74  .      spaceLeft
325d0 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69   = pBt->usableSi
325e0 7a 65 20 2d 20 34 3b 0a 20 20 20 20 7d 0a 20 20  ze - 4;.    }.  
325f0 20 20 6e 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a    n = nPayload;.
32600 20 20 20 20 69 66 28 20 6e 3e 73 70 61 63 65 4c      if( n>spaceL
32610 65 66 74 20 29 20 6e 20 3d 20 73 70 61 63 65 4c  eft ) n = spaceL
32620 65 66 74 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  eft;..    /* If 
32630 70 54 6f 52 65 6c 65 61 73 65 20 69 73 20 6e 6f  pToRelease is no
32640 74 20 7a 65 72 6f 20 74 68 61 6e 20 70 50 61 79  t zero than pPay
32650 6c 6f 61 64 20 70 6f 69 6e 74 73 20 69 6e 74 6f  load points into
32660 20 74 68 65 20 64 61 74 61 20 61 72 65 61 0a 20   the data area. 
32670 20 20 20 2a 2a 20 6f 66 20 70 54 6f 52 65 6c 65     ** of pToRele
32680 61 73 65 2e 20 20 4d 61 6b 65 20 73 75 72 65 20  ase.  Make sure 
32690 70 54 6f 52 65 6c 65 61 73 65 20 69 73 20 73 74  pToRelease is st
326a0 69 6c 6c 20 77 72 69 74 65 61 62 6c 65 2e 20 2a  ill writeable. *
326b0 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54  /.    assert( pT
326c0 6f 52 65 6c 65 61 73 65 3d 3d 30 20 7c 7c 20 73  oRelease==0 || s
326d0 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
326e0 74 65 61 62 6c 65 28 70 54 6f 52 65 6c 65 61 73  teable(pToReleas
326f0 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a  e->pDbPage) );..
32700 20 20 20 20 2f 2a 20 49 66 20 70 50 61 79 6c 6f      /* If pPaylo
32710 61 64 20 69 73 20 70 61 72 74 20 6f 66 20 74 68  ad is part of th
32720 65 20 64 61 74 61 20 61 72 65 61 20 6f 66 20 70  e data area of p
32730 50 61 67 65 2c 20 74 68 65 6e 20 6d 61 6b 65 20  Page, then make 
32740 73 75 72 65 20 70 50 61 67 65 0a 20 20 20 20 2a  sure pPage.    *
32750 2a 20 69 73 20 73 74 69 6c 6c 20 77 72 69 74 65  * is still write
32760 61 62 6c 65 20 2a 2f 0a 20 20 20 20 61 73 73 65  able */.    asse
32770 72 74 28 20 70 50 61 79 6c 6f 61 64 3c 70 50 61  rt( pPayload<pPa
32780 67 65 2d 3e 61 44 61 74 61 20 7c 7c 20 70 50 61  ge->aData || pPa
32790 79 6c 6f 61 64 3e 3d 26 70 50 61 67 65 2d 3e 61  yload>=&pPage->a
327a0 44 61 74 61 5b 70 42 74 2d 3e 70 61 67 65 53 69  Data[pBt->pageSi
327b0 7a 65 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ze].            
327c0 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  || sqlite3PagerI
327d0 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
327e0 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20  ->pDbPage) );.. 
327f0 20 20 20 69 66 28 20 6e 53 72 63 3e 30 20 29 7b     if( nSrc>0 ){
32800 0a 20 20 20 20 20 20 69 66 28 20 6e 3e 6e 53 72  .      if( n>nSr
32810 63 20 29 20 6e 20 3d 20 6e 53 72 63 3b 0a 20 20  c ) n = nSrc;.  
32820 20 20 20 20 61 73 73 65 72 74 28 20 70 53 72 63      assert( pSrc
32830 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79   );.      memcpy
32840 28 70 50 61 79 6c 6f 61 64 2c 20 70 53 72 63 2c  (pPayload, pSrc,
32850 20 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   n);.    }else{.
32860 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 50 61        memset(pPa
32870 79 6c 6f 61 64 2c 20 30 2c 20 6e 29 3b 0a 20 20  yload, 0, n);.  
32880 20 20 7d 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64    }.    nPayload
32890 20 2d 3d 20 6e 3b 0a 20 20 20 20 70 50 61 79 6c   -= n;.    pPayl
328a0 6f 61 64 20 2b 3d 20 6e 3b 0a 20 20 20 20 70 53  oad += n;.    pS
328b0 72 63 20 2b 3d 20 6e 3b 0a 20 20 20 20 6e 53 72  rc += n;.    nSr
328c0 63 20 2d 3d 20 6e 3b 0a 20 20 20 20 73 70 61 63  c -= n;.    spac
328d0 65 4c 65 66 74 20 2d 3d 20 6e 3b 0a 20 20 20 20  eLeft -= n;.    
328e0 69 66 28 20 6e 53 72 63 3d 3d 30 20 29 7b 0a 20  if( nSrc==0 ){. 
328f0 20 20 20 20 20 6e 53 72 63 20 3d 20 6e 44 61 74       nSrc = nDat
32900 61 3b 0a 20 20 20 20 20 20 70 53 72 63 20 3d 20  a;.      pSrc = 
32910 70 44 61 74 61 3b 0a 20 20 20 20 7d 0a 20 20 7d  pData;.    }.  }
32920 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70  .  releasePage(p
32930 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 72 65  ToRelease);.  re
32940 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
32950 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20  }../*.** Remove 
32960 74 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 66 72  the i-th cell fr
32970 6f 6d 20 70 50 61 67 65 2e 20 20 54 68 69 73 20  om pPage.  This 
32980 72 6f 75 74 69 6e 65 20 65 66 66 65 63 74 73 20  routine effects 
32990 70 50 61 67 65 20 6f 6e 6c 79 2e 0a 2a 2a 20 54  pPage only..** T
329a0 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
329b0 69 73 20 6e 6f 74 20 66 72 65 65 64 20 6f 72 20  is not freed or 
329c0 64 65 61 6c 6c 6f 63 61 74 65 64 2e 20 20 49 74  deallocated.  It
329d0 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74   is assumed that
329e0 0a 2a 2a 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e  .** the cell con
329f0 74 65 6e 74 20 68 61 73 20 62 65 65 6e 20 63 6f  tent has been co
32a00 70 69 65 64 20 73 6f 6d 65 70 6c 61 63 65 20 65  pied someplace e
32a10 6c 73 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69  lse.  This routi
32a20 6e 65 20 6a 75 73 74 0a 2a 2a 20 72 65 6d 6f 76  ne just.** remov
32a30 65 73 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  es the reference
32a40 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 66 72 6f   to the cell fro
32a50 6d 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 22  m pPage..**.** "
32a60 73 7a 22 20 6d 75 73 74 20 62 65 20 74 68 65 20  sz" must be the 
32a70 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
32a80 69 6e 20 74 68 65 20 63 65 6c 6c 2e 0a 2a 2f 0a  in the cell..*/.
32a90 73 74 61 74 69 63 20 76 6f 69 64 20 64 72 6f 70  static void drop
32aa0 43 65 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50  Cell(MemPage *pP
32ab0 61 67 65 2c 20 69 6e 74 20 69 64 78 2c 20 69 6e  age, int idx, in
32ac0 74 20 73 7a 2c 20 69 6e 74 20 2a 70 52 43 29 7b  t sz, int *pRC){
32ad0 0a 20 20 75 33 32 20 70 63 3b 20 20 20 20 20 20  .  u32 pc;      
32ae0 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20     /* Offset to 
32af0 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 6f 66 20  cell content of 
32b00 63 65 6c 6c 20 62 65 69 6e 67 20 64 65 6c 65 74  cell being delet
32b10 65 64 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61  ed */.  u8 *data
32b20 3b 20 20 20 20 20 20 20 2f 2a 20 70 50 61 67 65  ;       /* pPage
32b30 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20 75 38 20  ->aData */.  u8 
32b40 2a 70 74 72 3b 20 20 20 20 20 20 20 20 2f 2a 20  *ptr;        /* 
32b50 55 73 65 64 20 74 6f 20 6d 6f 76 65 20 62 79 74  Used to move byt
32b60 65 73 20 61 72 6f 75 6e 64 20 77 69 74 68 69 6e  es around within
32b70 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74   data[] */.  int
32b80 20 72 63 3b 20 20 20 20 20 20 20 20 20 2f 2a 20   rc;         /* 
32b90 54 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20  The return code 
32ba0 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20 20 20  */.  int hdr;   
32bb0 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 6e 69 6e       /* Beginnin
32bc0 67 20 6f 66 20 74 68 65 20 68 65 61 64 65 72 2e  g of the header.
32bd0 20 20 30 20 6d 6f 73 74 20 70 61 67 65 73 2e 20    0 most pages. 
32be0 20 31 30 30 20 70 61 67 65 20 31 20 2a 2f 0a 0a   100 page 1 */..
32bf0 20 20 69 66 28 20 2a 70 52 43 20 29 20 72 65 74    if( *pRC ) ret
32c00 75 72 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  urn;..  assert( 
32c10 69 64 78 3e 3d 30 20 26 26 20 69 64 78 3c 70 50  idx>=0 && idx<pP
32c20 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20  age->nCell );.  
32c30 61 73 73 65 72 74 28 20 73 7a 3d 3d 63 65 6c 6c  assert( sz==cell
32c40 53 69 7a 65 28 70 50 61 67 65 2c 20 69 64 78 29  Size(pPage, idx)
32c50 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
32c60 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
32c70 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
32c80 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72  Page) );.  asser
32c90 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
32ca0 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
32cb0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 64 61  ->mutex) );.  da
32cc0 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74  ta = pPage->aDat
32cd0 61 3b 0a 20 20 70 74 72 20 3d 20 26 70 50 61 67  a;.  ptr = &pPag
32ce0 65 2d 3e 61 43 65 6c 6c 49 64 78 5b 32 2a 69 64  e->aCellIdx[2*id
32cf0 78 5d 3b 0a 20 20 70 63 20 3d 20 67 65 74 32 62  x];.  pc = get2b
32d00 79 74 65 28 70 74 72 29 3b 0a 20 20 68 64 72 20  yte(ptr);.  hdr 
32d10 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  = pPage->hdrOffs
32d20 65 74 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20  et;.  testcase( 
32d30 70 63 3d 3d 67 65 74 32 62 79 74 65 28 26 64 61  pc==get2byte(&da
32d40 74 61 5b 68 64 72 2b 35 5d 29 20 29 3b 0a 20 20  ta[hdr+5]) );.  
32d50 74 65 73 74 63 61 73 65 28 20 70 63 2b 73 7a 3d  testcase( pc+sz=
32d60 3d 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61  =pPage->pBt->usa
32d70 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 69 66 28  bleSize );.  if(
32d80 20 70 63 20 3c 20 28 75 33 32 29 67 65 74 32 62   pc < (u32)get2b
32d90 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
32da0 29 20 7c 7c 20 70 63 2b 73 7a 20 3e 20 70 50 61  ) || pc+sz > pPa
32db0 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
32dc0 69 7a 65 20 29 7b 0a 20 20 20 20 2a 70 52 43 20  ize ){.    *pRC 
32dd0 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
32de0 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72  _BKPT;.    retur
32df0 6e 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 66 72  n;.  }.  rc = fr
32e00 65 65 53 70 61 63 65 28 70 50 61 67 65 2c 20 70  eeSpace(pPage, p
32e10 63 2c 20 73 7a 29 3b 0a 20 20 69 66 28 20 72 63  c, sz);.  if( rc
32e20 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 72   ){.    *pRC = r
32e30 63 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  c;.    return;. 
32e40 20 7d 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c   }.  pPage->nCel
32e50 6c 2d 2d 3b 0a 20 20 69 66 28 20 70 50 61 67 65  l--;.  if( pPage
32e60 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 7b 0a 20 20  ->nCell==0 ){.  
32e70 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 68    memset(&data[h
32e80 64 72 2b 31 5d 2c 20 30 2c 20 34 29 3b 0a 20 20  dr+1], 0, 4);.  
32e90 20 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20    data[hdr+7] = 
32ea0 30 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65 28  0;.    put2byte(
32eb0 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 70 50  &data[hdr+5], pP
32ec0 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
32ed0 53 69 7a 65 29 3b 0a 20 20 20 20 70 50 61 67 65  Size);.    pPage
32ee0 2d 3e 6e 46 72 65 65 20 3d 20 70 50 61 67 65 2d  ->nFree = pPage-
32ef0 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
32f00 20 2d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66   - pPage->hdrOff
32f10 73 65 74 0a 20 20 20 20 20 20 20 20 20 20 20 20  set.            
32f20 20 20 20 20 20 20 20 20 20 20 20 2d 20 70 50 61             - pPa
32f30 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65  ge->childPtrSize
32f40 20 2d 20 38 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   - 8;.  }else{. 
32f50 20 20 20 6d 65 6d 6d 6f 76 65 28 70 74 72 2c 20     memmove(ptr, 
32f60 70 74 72 2b 32 2c 20 32 2a 28 70 50 61 67 65 2d  ptr+2, 2*(pPage-
32f70 3e 6e 43 65 6c 6c 20 2d 20 69 64 78 29 29 3b 0a  >nCell - idx));.
32f80 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61      put2byte(&da
32f90 74 61 5b 68 64 72 2b 33 5d 2c 20 70 50 61 67 65  ta[hdr+3], pPage
32fa0 2d 3e 6e 43 65 6c 6c 29 3b 0a 20 20 20 20 70 50  ->nCell);.    pP
32fb0 61 67 65 2d 3e 6e 46 72 65 65 20 2b 3d 20 32 3b  age->nFree += 2;
32fc0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  .  }.}../*.** In
32fd0 73 65 72 74 20 61 20 6e 65 77 20 63 65 6c 6c 20  sert a new cell 
32fe0 6f 6e 20 70 50 61 67 65 20 61 74 20 63 65 6c 6c  on pPage at cell
32ff0 20 69 6e 64 65 78 20 22 69 22 2e 20 20 70 43 65   index "i".  pCe
33000 6c 6c 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  ll points to the
33010 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74  .** content of t
33020 68 65 20 63 65 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49  he cell..**.** I
33030 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  f the cell conte
33040 6e 74 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20 74  nt will fit on t
33050 68 65 20 70 61 67 65 2c 20 74 68 65 6e 20 70 75  he page, then pu
33060 74 20 69 74 20 74 68 65 72 65 2e 20 20 49 66 20  t it there.  If 
33070 69 74 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 66  it.** will not f
33080 69 74 2c 20 74 68 65 6e 20 6d 61 6b 65 20 61 20  it, then make a 
33090 63 6f 70 79 20 6f 66 20 74 68 65 20 63 65 6c 6c  copy of the cell
330a0 20 63 6f 6e 74 65 6e 74 20 69 6e 74 6f 20 70 54   content into pT
330b0 65 6d 70 20 69 66 0a 2a 2a 20 70 54 65 6d 70 20  emp if.** pTemp 
330c0 69 73 20 6e 6f 74 20 6e 75 6c 6c 2e 20 20 52 65  is not null.  Re
330d0 67 61 72 64 6c 65 73 73 20 6f 66 20 70 54 65 6d  gardless of pTem
330e0 70 2c 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65  p, allocate a ne
330f0 77 20 65 6e 74 72 79 0a 2a 2a 20 69 6e 20 70 50  w entry.** in pP
33100 61 67 65 2d 3e 61 70 4f 76 66 6c 5b 5d 20 61 6e  age->apOvfl[] an
33110 64 20 6d 61 6b 65 20 69 74 20 70 6f 69 6e 74 20  d make it point 
33120 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  to the cell cont
33130 65 6e 74 20 28 65 69 74 68 65 72 0a 2a 2a 20 69  ent (either.** i
33140 6e 20 70 54 65 6d 70 20 6f 72 20 74 68 65 20 6f  n pTemp or the o
33150 72 69 67 69 6e 61 6c 20 70 43 65 6c 6c 29 20 61  riginal pCell) a
33160 6e 64 20 61 6c 73 6f 20 72 65 63 6f 72 64 20 69  nd also record i
33170 74 73 20 69 6e 64 65 78 2e 20 0a 2a 2a 20 41 6c  ts index. .** Al
33180 6c 6f 63 61 74 69 6e 67 20 61 20 6e 65 77 20 65  locating a new e
33190 6e 74 72 79 20 69 6e 20 70 50 61 67 65 2d 3e 61  ntry in pPage->a
331a0 43 65 6c 6c 5b 5d 20 69 6d 70 6c 69 65 73 20 74  Cell[] implies t
331b0 68 61 74 20 0a 2a 2a 20 70 50 61 67 65 2d 3e 6e  hat .** pPage->n
331c0 4f 76 65 72 66 6c 6f 77 20 69 73 20 69 6e 63 72  Overflow is incr
331d0 65 6d 65 6e 74 65 64 2e 0a 2a 2f 0a 73 74 61 74  emented..*/.stat
331e0 69 63 20 76 6f 69 64 20 69 6e 73 65 72 74 43 65  ic void insertCe
331f0 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  ll(.  MemPage *p
33200 50 61 67 65 2c 20 20 20 2f 2a 20 50 61 67 65 20  Page,   /* Page 
33210 69 6e 74 6f 20 77 68 69 63 68 20 77 65 20 61 72  into which we ar
33220 65 20 63 6f 70 79 69 6e 67 20 2a 2f 0a 20 20 69  e copying */.  i
33230 6e 74 20 69 2c 20 20 20 20 20 20 20 20 20 20 20  nt i,           
33240 20 2f 2a 20 4e 65 77 20 63 65 6c 6c 20 62 65 63   /* New cell bec
33250 6f 6d 65 73 20 74 68 65 20 69 2d 74 68 20 63 65  omes the i-th ce
33260 6c 6c 20 6f 66 20 74 68 65 20 70 61 67 65 20 2a  ll of the page *
33270 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20  /.  u8 *pCell,  
33280 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 6e 74        /* Content
33290 20 6f 66 20 74 68 65 20 6e 65 77 20 63 65 6c 6c   of the new cell
332a0 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 2c 20 20 20   */.  int sz,   
332b0 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73          /* Bytes
332c0 20 6f 66 20 63 6f 6e 74 65 6e 74 20 69 6e 20 70   of content in p
332d0 43 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 54  Cell */.  u8 *pT
332e0 65 6d 70 2c 20 20 20 20 20 20 20 20 2f 2a 20 54  emp,        /* T
332f0 65 6d 70 20 73 74 6f 72 61 67 65 20 73 70 61 63  emp storage spac
33300 65 20 66 6f 72 20 70 43 65 6c 6c 2c 20 69 66 20  e for pCell, if 
33310 6e 65 65 64 65 64 20 2a 2f 0a 20 20 50 67 6e 6f  needed */.  Pgno
33320 20 69 43 68 69 6c 64 2c 20 20 20 20 20 20 2f 2a   iChild,      /*
33330 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 72 65   If non-zero, re
33340 70 6c 61 63 65 20 66 69 72 73 74 20 34 20 62 79  place first 4 by
33350 74 65 73 20 77 69 74 68 20 74 68 69 73 20 76 61  tes with this va
33360 6c 75 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52  lue */.  int *pR
33370 43 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65  C          /* Re
33380 61 64 20 61 6e 64 20 77 72 69 74 65 20 72 65 74  ad and write ret
33390 75 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20 68 65  urn code from he
333a0 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  re */.){.  int i
333b0 64 78 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20  dx = 0;      /* 
333c0 57 68 65 72 65 20 74 6f 20 77 72 69 74 65 20 6e  Where to write n
333d0 65 77 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  ew cell content 
333e0 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69  in data[] */.  i
333f0 6e 74 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20  nt j;           
33400 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
33410 20 2a 2f 0a 20 20 69 6e 74 20 65 6e 64 3b 20 20   */.  int end;  
33420 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
33430 20 62 79 74 65 20 70 61 73 74 20 74 68 65 20 6c   byte past the l
33440 61 73 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  ast cell pointer
33450 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20   in data[] */.  
33460 69 6e 74 20 69 6e 73 3b 20 20 20 20 20 20 20 20  int ins;        
33470 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 64 61    /* Index in da
33480 74 61 5b 5d 20 77 68 65 72 65 20 6e 65 77 20 63  ta[] where new c
33490 65 6c 6c 20 70 6f 69 6e 74 65 72 20 69 73 20 69  ell pointer is i
334a0 6e 73 65 72 74 65 64 20 2a 2f 0a 20 20 69 6e 74  nserted */.  int
334b0 20 63 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20 2f   cellOffset;   /
334c0 2a 20 41 64 64 72 65 73 73 20 6f 66 20 66 69 72  * Address of fir
334d0 73 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20  st cell pointer 
334e0 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 75  in data[] */.  u
334f0 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20  8 *data;        
33500 20 2f 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74 20   /* The content 
33510 6f 66 20 74 68 65 20 77 68 6f 6c 65 20 70 61 67  of the whole pag
33520 65 20 2a 2f 0a 0a 20 20 69 66 28 20 2a 70 52 43  e */..  if( *pRC
33530 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 61 73   ) return;..  as
33540 73 65 72 74 28 20 69 3e 3d 30 20 26 26 20 69 3c  sert( i>=0 && i<
33550 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b 70 50  =pPage->nCell+pP
33560 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 29  age->nOverflow )
33570 3b 0a 20 20 61 73 73 65 72 74 28 20 4d 58 5f 43  ;.  assert( MX_C
33580 45 4c 4c 28 70 50 61 67 65 2d 3e 70 42 74 29 3c  ELL(pPage->pBt)<
33590 3d 31 30 39 32 31 20 29 3b 0a 20 20 61 73 73 65  =10921 );.  asse
335a0 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  rt( pPage->nCell
335b0 3c 3d 4d 58 5f 43 45 4c 4c 28 70 50 61 67 65 2d  <=MX_CELL(pPage-
335c0 3e 70 42 74 29 20 7c 7c 20 43 4f 52 52 55 50 54  >pBt) || CORRUPT
335d0 5f 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _DB );.  assert(
335e0 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
335f0 77 3c 3d 41 72 72 61 79 53 69 7a 65 28 70 50 61  w<=ArraySize(pPa
33600 67 65 2d 3e 61 70 4f 76 66 6c 29 20 29 3b 0a 20  ge->apOvfl) );. 
33610 20 61 73 73 65 72 74 28 20 41 72 72 61 79 53 69   assert( ArraySi
33620 7a 65 28 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c  ze(pPage->apOvfl
33630 29 3d 3d 41 72 72 61 79 53 69 7a 65 28 70 50 61  )==ArraySize(pPa
33640 67 65 2d 3e 61 69 4f 76 66 6c 29 20 29 3b 0a 20  ge->aiOvfl) );. 
33650 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
33660 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
33670 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
33680 3b 0a 20 20 2f 2a 20 54 68 65 20 63 65 6c 6c 20  ;.  /* The cell 
33690 73 68 6f 75 6c 64 20 6e 6f 72 6d 61 6c 6c 79 20  should normally 
336a0 62 65 20 73 69 7a 65 64 20 63 6f 72 72 65 63 74  be sized correct
336b0 6c 79 2e 20 20 48 6f 77 65 76 65 72 2c 20 77 68  ly.  However, wh
336c0 65 6e 20 6d 6f 76 69 6e 67 20 61 0a 20 20 2a 2a  en moving a.  **
336d0 20 6d 61 6c 66 6f 72 6d 65 64 20 63 65 6c 6c 20   malformed cell 
336e0 66 72 6f 6d 20 61 20 6c 65 61 66 20 70 61 67 65  from a leaf page
336f0 20 74 6f 20 61 6e 20 69 6e 74 65 72 69 6f 72 20   to an interior 
33700 70 61 67 65 2c 20 69 66 20 74 68 65 20 63 65 6c  page, if the cel
33710 6c 20 73 69 7a 65 0a 20 20 2a 2a 20 77 61 6e 74  l size.  ** want
33720 65 64 20 74 6f 20 62 65 20 6c 65 73 73 20 74 68  ed to be less th
33730 61 6e 20 34 20 62 75 74 20 67 6f 74 20 72 6f 75  an 4 but got rou
33740 6e 64 65 64 20 75 70 20 74 6f 20 34 20 6f 6e 20  nded up to 4 on 
33750 74 68 65 20 6c 65 61 66 2c 20 74 68 65 6e 20 73  the leaf, then s
33760 69 7a 65 0a 20 20 2a 2a 20 6d 69 67 68 74 20 62  ize.  ** might b
33770 65 20 6c 65 73 73 20 74 68 61 6e 20 38 20 28 6c  e less than 8 (l
33780 65 61 66 2d 73 69 7a 65 20 2b 20 70 6f 69 6e 74  eaf-size + point
33790 65 72 29 20 6f 6e 20 74 68 65 20 69 6e 74 65 72  er) on the inter
337a0 69 6f 72 20 6e 6f 64 65 2e 20 20 48 65 6e 63 65  ior node.  Hence
337b0 0a 20 20 2a 2a 20 74 68 65 20 74 65 72 6d 20 61  .  ** the term a
337c0 66 74 65 72 20 74 68 65 20 7c 7c 20 69 6e 20 74  fter the || in t
337d0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73  he following ass
337e0 65 72 74 28 29 2e 20 2a 2f 0a 20 20 61 73 73 65  ert(). */.  asse
337f0 72 74 28 20 73 7a 3d 3d 63 65 6c 6c 53 69 7a 65  rt( sz==cellSize
33800 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  Ptr(pPage, pCell
33810 29 20 7c 7c 20 28 73 7a 3d 3d 38 20 26 26 20 69  ) || (sz==8 && i
33820 43 68 69 6c 64 3e 30 29 20 29 3b 0a 20 20 69 66  Child>0) );.  if
33830 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  ( pPage->nOverfl
33840 6f 77 20 7c 7c 20 73 7a 2b 32 3e 70 50 61 67 65  ow || sz+2>pPage
33850 2d 3e 6e 46 72 65 65 20 29 7b 0a 20 20 20 20 69  ->nFree ){.    i
33860 66 28 20 70 54 65 6d 70 20 29 7b 0a 20 20 20 20  f( pTemp ){.    
33870 20 20 6d 65 6d 63 70 79 28 70 54 65 6d 70 2c 20    memcpy(pTemp, 
33880 70 43 65 6c 6c 2c 20 73 7a 29 3b 0a 20 20 20 20  pCell, sz);.    
33890 20 20 70 43 65 6c 6c 20 3d 20 70 54 65 6d 70 3b    pCell = pTemp;
338a0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
338b0 43 68 69 6c 64 20 29 7b 0a 20 20 20 20 20 20 70  Child ){.      p
338c0 75 74 34 62 79 74 65 28 70 43 65 6c 6c 2c 20 69  ut4byte(pCell, i
338d0 43 68 69 6c 64 29 3b 0a 20 20 20 20 7d 0a 20 20  Child);.    }.  
338e0 20 20 6a 20 3d 20 70 50 61 67 65 2d 3e 6e 4f 76    j = pPage->nOv
338f0 65 72 66 6c 6f 77 2b 2b 3b 0a 20 20 20 20 61 73  erflow++;.    as
33900 73 65 72 74 28 20 6a 3c 28 69 6e 74 29 28 73 69  sert( j<(int)(si
33910 7a 65 6f 66 28 70 50 61 67 65 2d 3e 61 70 4f 76  zeof(pPage->apOv
33920 66 6c 29 2f 73 69 7a 65 6f 66 28 70 50 61 67 65  fl)/sizeof(pPage
33930 2d 3e 61 70 4f 76 66 6c 5b 30 5d 29 29 20 29 3b  ->apOvfl[0])) );
33940 0a 20 20 20 20 70 50 61 67 65 2d 3e 61 70 4f 76  .    pPage->apOv
33950 66 6c 5b 6a 5d 20 3d 20 70 43 65 6c 6c 3b 0a 20  fl[j] = pCell;. 
33960 20 20 20 70 50 61 67 65 2d 3e 61 69 4f 76 66 6c     pPage->aiOvfl
33970 5b 6a 5d 20 3d 20 28 75 31 36 29 69 3b 0a 20 20  [j] = (u16)i;.  
33980 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 72  }else{.    int r
33990 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
339a0 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62  Write(pPage->pDb
339b0 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
339c0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
339d0 20 20 20 20 20 20 2a 70 52 43 20 3d 20 72 63 3b        *pRC = rc;
339e0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  .      return;. 
339f0 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
33a00 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
33a10 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
33a20 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 20 20  pDbPage) );.    
33a30 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44  data = pPage->aD
33a40 61 74 61 3b 0a 20 20 20 20 63 65 6c 6c 4f 66 66  ata;.    cellOff
33a50 73 65 74 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c  set = pPage->cel
33a60 6c 4f 66 66 73 65 74 3b 0a 20 20 20 20 65 6e 64  lOffset;.    end
33a70 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20   = cellOffset + 
33a80 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a  2*pPage->nCell;.
33a90 20 20 20 20 69 6e 73 20 3d 20 63 65 6c 6c 4f 66      ins = cellOf
33aa0 66 73 65 74 20 2b 20 32 2a 69 3b 0a 20 20 20 20  fset + 2*i;.    
33ab0 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 53 70 61  rc = allocateSpa
33ac0 63 65 28 70 50 61 67 65 2c 20 73 7a 2c 20 26 69  ce(pPage, sz, &i
33ad0 64 78 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  dx);.    if( rc 
33ae0 29 7b 20 2a 70 52 43 20 3d 20 72 63 3b 20 72 65  ){ *pRC = rc; re
33af0 74 75 72 6e 3b 20 7d 0a 20 20 20 20 2f 2a 20 54  turn; }.    /* T
33b00 68 65 20 61 6c 6c 6f 63 61 74 65 53 70 61 63 65  he allocateSpace
33b10 28 29 20 72 6f 75 74 69 6e 65 20 67 75 61 72 61  () routine guara
33b20 6e 74 65 65 73 20 74 68 65 20 66 6f 6c 6c 6f 77  ntees the follow
33b30 69 6e 67 20 74 77 6f 20 70 72 6f 70 65 72 74 69  ing two properti
33b40 65 73 0a 20 20 20 20 2a 2a 20 69 66 20 69 74 20  es.    ** if it 
33b50 72 65 74 75 72 6e 73 20 73 75 63 63 65 73 73 20  returns success 
33b60 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  */.    assert( i
33b70 64 78 20 3e 3d 20 65 6e 64 2b 32 20 29 3b 0a 20  dx >= end+2 );. 
33b80 20 20 20 61 73 73 65 72 74 28 20 69 64 78 2b 73     assert( idx+s
33b90 7a 20 3c 3d 20 28 69 6e 74 29 70 50 61 67 65 2d  z <= (int)pPage-
33ba0 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
33bb0 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e   );.    pPage->n
33bc0 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 70 50 61 67  Cell++;.    pPag
33bd0 65 2d 3e 6e 46 72 65 65 20 2d 3d 20 28 75 31 36  e->nFree -= (u16
33be0 29 28 32 20 2b 20 73 7a 29 3b 0a 20 20 20 20 6d  )(2 + sz);.    m
33bf0 65 6d 63 70 79 28 26 64 61 74 61 5b 69 64 78 5d  emcpy(&data[idx]
33c00 2c 20 70 43 65 6c 6c 2c 20 73 7a 29 3b 0a 20 20  , pCell, sz);.  
33c10 20 20 69 66 28 20 69 43 68 69 6c 64 20 29 7b 0a    if( iChild ){.
33c20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
33c30 64 61 74 61 5b 69 64 78 5d 2c 20 69 43 68 69 6c  data[idx], iChil
33c40 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65  d);.    }.    me
33c50 6d 6d 6f 76 65 28 26 64 61 74 61 5b 69 6e 73 2b  mmove(&data[ins+
33c60 32 5d 2c 20 26 64 61 74 61 5b 69 6e 73 5d 2c 20  2], &data[ins], 
33c70 65 6e 64 2d 69 6e 73 29 3b 0a 20 20 20 20 70 75  end-ins);.    pu
33c80 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 6e 73  t2byte(&data[ins
33c90 5d 2c 20 69 64 78 29 3b 0a 20 20 20 20 70 75 74  ], idx);.    put
33ca0 32 62 79 74 65 28 26 64 61 74 61 5b 70 50 61 67  2byte(&data[pPag
33cb0 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 33 5d 2c  e->hdrOffset+3],
33cc0 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a   pPage->nCell);.
33cd0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
33ce0 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
33cf0 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 70 42     if( pPage->pB
33d00 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b  t->autoVacuum ){
33d10 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 65  .      /* The ce
33d20 6c 6c 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 61  ll may contain a
33d30 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 6f   pointer to an o
33d40 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20 49 66  verflow page. If
33d50 20 73 6f 2c 20 77 72 69 74 65 0a 20 20 20 20 20   so, write.     
33d60 20 2a 2a 20 74 68 65 20 65 6e 74 72 79 20 66 6f   ** the entry fo
33d70 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70  r the overflow p
33d80 61 67 65 20 69 6e 74 6f 20 74 68 65 20 70 6f 69  age into the poi
33d90 6e 74 65 72 20 6d 61 70 2e 0a 20 20 20 20 20 20  nter map..      
33da0 2a 2f 0a 20 20 20 20 20 20 70 74 72 6d 61 70 50  */.      ptrmapP
33db0 75 74 4f 76 66 6c 50 74 72 28 70 50 61 67 65 2c  utOvflPtr(pPage,
33dc0 20 70 43 65 6c 6c 2c 20 70 52 43 29 3b 0a 20 20   pCell, pRC);.  
33dd0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 7d    }.#endif.  }.}
33de0 0a 0a 2f 2a 0a 2a 2a 20 41 72 72 61 79 20 61 70  ../*.** Array ap
33df0 43 65 6c 6c 5b 5d 20 63 6f 6e 74 61 69 6e 73 20  Cell[] contains 
33e00 70 6f 69 6e 74 65 72 73 20 74 6f 20 6e 43 65 6c  pointers to nCel
33e10 6c 20 62 2d 74 72 65 65 20 70 61 67 65 20 63 65  l b-tree page ce
33e20 6c 6c 73 2e 20 54 68 65 20 0a 2a 2a 20 73 7a 43  lls. The .** szC
33e30 65 6c 6c 5b 5d 20 61 72 72 61 79 20 63 6f 6e 74  ell[] array cont
33e40 61 69 6e 73 20 74 68 65 20 73 69 7a 65 20 69 6e  ains the size in
33e50 20 62 79 74 65 73 20 6f 66 20 65 61 63 68 20 63   bytes of each c
33e60 65 6c 6c 2e 20 54 68 69 73 20 66 75 6e 63 74 69  ell. This functi
33e70 6f 6e 0a 2a 2a 20 72 65 70 6c 61 63 65 73 20 74  on.** replaces t
33e80 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6e 74 65  he current conte
33e90 6e 74 73 20 6f 66 20 70 61 67 65 20 70 50 67 20  nts of page pPg 
33ea0 77 69 74 68 20 74 68 65 20 63 6f 6e 74 65 6e 74  with the content
33eb0 73 20 6f 66 20 74 68 65 20 63 65 6c 6c 0a 2a 2a  s of the cell.**
33ec0 20 61 72 72 61 79 2e 0a 2a 2a 0a 2a 2a 20 53 6f   array..**.** So
33ed0 6d 65 20 6f 66 20 74 68 65 20 63 65 6c 6c 73 20  me of the cells 
33ee0 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 6d 61 79 20  in apCell[] may 
33ef0 63 75 72 72 65 6e 74 6c 79 20 62 65 20 73 74 6f  currently be sto
33f00 72 65 64 20 69 6e 20 70 50 67 2e 20 54 68 69 73  red in pPg. This
33f10 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 77 6f 72  .** function wor
33f20 6b 73 20 61 72 6f 75 6e 64 20 70 72 6f 62 6c 65  ks around proble
33f30 6d 73 20 63 61 75 73 65 64 20 62 79 20 74 68 69  ms caused by thi
33f40 73 20 62 79 20 6d 61 6b 69 6e 67 20 61 20 63 6f  s by making a co
33f50 70 79 20 6f 66 20 61 6e 79 20 0a 2a 2a 20 73 75  py of any .** su
33f60 63 68 20 63 65 6c 6c 73 20 62 65 66 6f 72 65 20  ch cells before 
33f70 6f 76 65 72 77 72 69 74 69 6e 67 20 74 68 65 20  overwriting the 
33f80 70 61 67 65 20 64 61 74 61 2e 0a 2a 2a 0a 2a 2a  page data..**.**
33f90 20 54 68 65 20 4d 65 6d 50 61 67 65 2e 6e 46 72   The MemPage.nFr
33fa0 65 65 20 66 69 65 6c 64 20 69 73 20 69 6e 76 61  ee field is inva
33fb0 6c 69 64 61 74 65 64 20 62 79 20 74 68 69 73 20  lidated by this 
33fc0 66 75 6e 63 74 69 6f 6e 2e 20 49 74 20 69 73 20  function. It is 
33fd0 74 68 65 20 0a 2a 2a 20 72 65 73 70 6f 6e 73 69  the .** responsi
33fe0 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61  bility of the ca
33ff0 6c 6c 65 72 20 74 6f 20 73 65 74 20 69 74 20 63  ller to set it c
34000 6f 72 72 65 63 74 6c 79 2e 0a 2a 2f 0a 73 74 61  orrectly..*/.sta
34010 74 69 63 20 76 6f 69 64 20 72 65 62 75 69 6c 64  tic void rebuild
34020 50 61 67 65 28 0a 20 20 4d 65 6d 50 61 67 65 20  Page(.  MemPage 
34030 2a 70 50 67 2c 20 20 20 20 20 20 20 20 20 20 20  *pPg,           
34040 20 20 20 20 20 20 20 20 2f 2a 20 45 64 69 74 20          /* Edit 
34050 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20 20 69  this page */.  i
34060 6e 74 20 6e 43 65 6c 6c 2c 20 20 20 20 20 20 20  nt nCell,       
34070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
34080 2a 20 46 69 6e 61 6c 20 6e 75 6d 62 65 72 20 6f  * Final number o
34090 66 20 63 65 6c 6c 73 20 6f 6e 20 70 61 67 65 20  f cells on page 
340a0 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43 65 6c 6c  */.  u8 **apCell
340b0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
340c0 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66       /* Array of
340d0 20 63 65 6c 6c 73 20 2a 2f 0a 20 20 75 31 36 20   cells */.  u16 
340e0 2a 73 7a 43 65 6c 6c 20 20 20 20 20 20 20 20 20  *szCell         
340f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
34100 72 72 61 79 20 6f 66 20 63 65 6c 6c 20 73 69 7a  rray of cell siz
34110 65 73 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74  es */.){.  const
34120 20 69 6e 74 20 68 64 72 20 3d 20 70 50 67 2d 3e   int hdr = pPg->
34130 68 64 72 4f 66 66 73 65 74 3b 20 20 20 20 20 20  hdrOffset;      
34140 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66      /* Offset of
34150 20 68 65 61 64 65 72 20 6f 6e 20 70 50 67 20 2a   header on pPg *
34160 2f 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 61  /.  u8 * const a
34170 44 61 74 61 20 3d 20 70 50 67 2d 3e 61 44 61 74  Data = pPg->aDat
34180 61 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  a;           /* 
34190 50 6f 69 6e 74 65 72 20 74 6f 20 64 61 74 61 20  Pointer to data 
341a0 66 6f 72 20 70 50 67 20 2a 2f 0a 20 20 63 6f 6e  for pPg */.  con
341b0 73 74 20 69 6e 74 20 75 73 61 62 6c 65 53 69 7a  st int usableSiz
341c0 65 20 3d 20 70 50 67 2d 3e 70 42 74 2d 3e 75 73  e = pPg->pBt->us
341d0 61 62 6c 65 53 69 7a 65 3b 0a 20 20 75 38 20 2a  ableSize;.  u8 *
341e0 20 63 6f 6e 73 74 20 70 45 6e 64 20 3d 20 26 61   const pEnd = &a
341f0 44 61 74 61 5b 75 73 61 62 6c 65 53 69 7a 65 5d  Data[usableSize]
34200 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 75 38 20  ;.  int i;.  u8 
34210 2a 70 43 65 6c 6c 70 74 72 20 3d 20 70 50 67 2d  *pCellptr = pPg-
34220 3e 61 43 65 6c 6c 49 64 78 3b 0a 20 20 75 38 20  >aCellIdx;.  u8 
34230 2a 70 54 6d 70 20 3d 20 73 71 6c 69 74 65 33 50  *pTmp = sqlite3P
34240 61 67 65 72 54 65 6d 70 53 70 61 63 65 28 70 50  agerTempSpace(pP
34250 67 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 29 3b  g->pBt->pPager);
34260 0a 20 20 75 38 20 2a 70 44 61 74 61 3b 0a 0a 20  .  u8 *pData;.. 
34270 20 69 20 3d 20 67 65 74 32 62 79 74 65 28 26 61   i = get2byte(&a
34280 44 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20  Data[hdr+5]);.  
34290 6d 65 6d 63 70 79 28 26 70 54 6d 70 5b 69 5d 2c  memcpy(&pTmp[i],
342a0 20 26 61 44 61 74 61 5b 69 5d 2c 20 75 73 61 62   &aData[i], usab
342b0 6c 65 53 69 7a 65 20 2d 20 69 29 3b 0a 0a 20 20  leSize - i);..  
342c0 70 44 61 74 61 20 3d 20 70 45 6e 64 3b 0a 20 20  pData = pEnd;.  
342d0 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c  for(i=0; i<nCell
342e0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a  ; i++){.    u8 *
342f0 70 43 65 6c 6c 20 3d 20 61 70 43 65 6c 6c 5b 69  pCell = apCell[i
34300 5d 3b 0a 20 20 20 20 69 66 28 20 70 43 65 6c 6c  ];.    if( pCell
34310 3e 61 44 61 74 61 20 26 26 20 70 43 65 6c 6c 3c  >aData && pCell<
34320 70 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 70 43  pEnd ){.      pC
34330 65 6c 6c 20 3d 20 26 70 54 6d 70 5b 70 43 65 6c  ell = &pTmp[pCel
34340 6c 20 2d 20 61 44 61 74 61 5d 3b 0a 20 20 20 20  l - aData];.    
34350 7d 0a 20 20 20 20 70 44 61 74 61 20 2d 3d 20 73  }.    pData -= s
34360 7a 43 65 6c 6c 5b 69 5d 3b 0a 20 20 20 20 6d 65  zCell[i];.    me
34370 6d 63 70 79 28 70 44 61 74 61 2c 20 70 43 65 6c  mcpy(pData, pCel
34380 6c 2c 20 73 7a 43 65 6c 6c 5b 69 5d 29 3b 0a 20  l, szCell[i]);. 
34390 20 20 20 70 75 74 32 62 79 74 65 28 70 43 65 6c     put2byte(pCel
343a0 6c 70 74 72 2c 20 28 70 44 61 74 61 20 2d 20 61  lptr, (pData - a
343b0 44 61 74 61 29 29 3b 0a 20 20 20 20 70 43 65 6c  Data));.    pCel
343c0 6c 70 74 72 20 2b 3d 20 32 3b 0a 20 20 20 20 61  lptr += 2;.    a
343d0 73 73 65 72 74 28 20 73 7a 43 65 6c 6c 5b 69 5d  ssert( szCell[i]
343e0 3d 3d 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50  ==cellSizePtr(pP
343f0 67 2c 20 70 43 65 6c 6c 29 20 7c 7c 20 43 4f 52  g, pCell) || COR
34400 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 20 20 74  RUPT_DB );.    t
34410 65 73 74 63 61 73 65 28 20 73 7a 43 65 6c 6c 5b  estcase( szCell[
34420 69 5d 21 3d 63 65 6c 6c 53 69 7a 65 50 74 72 28  i]!=cellSizePtr(
34430 70 50 67 2c 70 43 65 6c 6c 29 20 29 3b 0a 20 20  pPg,pCell) );.  
34440 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 70 50 67 2d  }..  /* The pPg-
34450 3e 6e 46 72 65 65 20 66 69 65 6c 64 20 69 73 20  >nFree field is 
34460 6e 6f 77 20 73 65 74 20 69 6e 63 6f 72 72 65 63  now set incorrec
34470 74 6c 79 2e 20 54 68 65 20 63 61 6c 6c 65 72 20  tly. The caller 
34480 77 69 6c 6c 20 66 69 78 20 69 74 2e 20 2a 2f 0a  will fix it. */.
34490 20 20 70 50 67 2d 3e 6e 43 65 6c 6c 20 3d 20 6e    pPg->nCell = n
344a0 43 65 6c 6c 3b 0a 20 20 70 50 67 2d 3e 6e 4f 76  Cell;.  pPg->nOv
344b0 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 0a 20 20 70  erflow = 0;..  p
344c0 75 74 32 62 79 74 65 28 26 61 44 61 74 61 5b 68  ut2byte(&aData[h
344d0 64 72 2b 31 5d 2c 20 30 29 3b 0a 20 20 70 75 74  dr+1], 0);.  put
344e0 32 62 79 74 65 28 26 61 44 61 74 61 5b 68 64 72  2byte(&aData[hdr
344f0 2b 33 5d 2c 20 70 50 67 2d 3e 6e 43 65 6c 6c 29  +3], pPg->nCell)
34500 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 61 44  ;.  put2byte(&aD
34510 61 74 61 5b 68 64 72 2b 35 5d 2c 20 70 44 61 74  ata[hdr+5], pDat
34520 61 20 2d 20 61 44 61 74 61 29 3b 0a 20 20 61 44  a - aData);.  aD
34530 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30 78 30  ata[hdr+7] = 0x0
34540 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 72 61  0;.}../*.** Arra
34550 79 20 61 70 43 65 6c 6c 5b 5d 20 63 6f 6e 74 61  y apCell[] conta
34560 69 6e 73 20 6e 43 65 6c 6c 20 70 6f 69 6e 74 65  ins nCell pointe
34570 72 73 20 74 6f 20 62 2d 74 72 65 65 20 63 65 6c  rs to b-tree cel
34580 6c 73 2e 20 41 72 72 61 79 20 73 7a 43 65 6c 6c  ls. Array szCell
34590 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  .** contains the
345a0 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73 20 6f   size in bytes o
345b0 66 20 65 61 63 68 20 73 75 63 68 20 63 65 6c 6c  f each such cell
345c0 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
345d0 61 74 74 65 6d 70 74 73 20 74 6f 20 0a 2a 2a 20  attempts to .** 
345e0 61 64 64 20 74 68 65 20 63 65 6c 6c 73 20 73 74  add the cells st
345f0 6f 72 65 64 20 69 6e 20 74 68 65 20 61 72 72 61  ored in the arra
34600 79 20 74 6f 20 70 61 67 65 20 70 50 67 2e 20 49  y to page pPg. I
34610 66 20 69 74 20 63 61 6e 6e 6f 74 20 28 62 65 63  f it cannot (bec
34620 61 75 73 65 20 0a 2a 2a 20 74 68 65 20 70 61 67  ause .** the pag
34630 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 64 65  e needs to be de
34640 66 72 61 67 6d 65 6e 74 65 64 20 62 65 66 6f 72  fragmented befor
34650 65 20 74 68 65 20 63 65 6c 6c 73 20 77 69 6c 6c  e the cells will
34660 20 66 69 74 29 2c 20 6e 6f 6e 2d 7a 65 72 6f 0a   fit), non-zero.
34670 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  ** is returned. 
34680 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 74 68  Otherwise, if th
34690 65 20 63 65 6c 6c 73 20 61 72 65 20 61 64 64 65  e cells are adde
346a0 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20  d successfully, 
346b0 7a 65 72 6f 20 69 73 0a 2a 2a 20 72 65 74 75 72  zero is.** retur
346c0 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d  ned..**.** Argum
346d0 65 6e 74 20 70 43 65 6c 6c 70 74 72 20 70 6f 69  ent pCellptr poi
346e0 6e 74 73 20 74 6f 20 74 68 65 20 66 69 72 73 74  nts to the first
346f0 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 63 65   entry in the ce
34700 6c 6c 2d 70 6f 69 6e 74 65 72 20 61 72 72 61 79  ll-pointer array
34710 0a 2a 2a 20 28 70 61 72 74 20 6f 66 20 70 61 67  .** (part of pag
34720 65 20 70 50 67 29 20 74 6f 20 70 6f 70 75 6c 61  e pPg) to popula
34730 74 65 2e 20 41 66 74 65 72 20 63 65 6c 6c 20 61  te. After cell a
34740 70 43 65 6c 6c 5b 30 5d 20 69 73 20 77 72 69 74  pCell[0] is writ
34750 74 65 6e 20 74 6f 20 74 68 65 0a 2a 2a 20 70 61  ten to the.** pa
34760 67 65 20 62 6f 64 79 2c 20 61 20 31 36 2d 62 69  ge body, a 16-bi
34770 74 20 6f 66 66 73 65 74 20 69 73 20 77 72 69 74  t offset is writ
34780 74 65 6e 20 74 6f 20 70 43 65 6c 6c 70 74 72 2e  ten to pCellptr.
34790 20 41 6e 64 20 73 6f 20 6f 6e 2c 20 66 6f 72 20   And so on, for 
347a0 65 61 63 68 0a 2a 2a 20 63 65 6c 6c 20 69 6e 20  each.** cell in 
347b0 74 68 65 20 61 72 72 61 79 2e 20 49 74 20 69 73  the array. It is
347c0 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c   the responsibil
347d0 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65  ity of the calle
347e0 72 20 74 6f 20 65 6e 73 75 72 65 0a 2a 2a 20 74  r to ensure.** t
347f0 68 61 74 20 69 74 20 69 73 20 73 61 66 65 20 74  hat it is safe t
34800 6f 20 6f 76 65 72 77 72 69 74 65 20 74 68 69 73  o overwrite this
34810 20 70 61 72 74 20 6f 66 20 74 68 65 20 63 65 6c   part of the cel
34820 6c 2d 70 6f 69 6e 74 65 72 20 61 72 72 61 79 2e  l-pointer array.
34830 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73  .**.** When this
34840 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
34850 6c 65 64 2c 20 2a 70 70 44 61 74 61 20 70 6f 69  led, *ppData poi
34860 6e 74 73 20 74 6f 20 74 68 65 20 73 74 61 72 74  nts to the start
34870 20 6f 66 20 74 68 65 20 0a 2a 2a 20 63 6f 6e 74   of the .** cont
34880 65 6e 74 20 61 72 65 61 20 6f 6e 20 70 61 67 65  ent area on page
34890 20 70 50 67 2e 20 49 66 20 74 68 65 20 73 69 7a   pPg. If the siz
348a0 65 20 6f 66 20 74 68 65 20 63 6f 6e 74 65 6e 74  e of the content
348b0 20 61 72 65 61 20 69 73 20 65 78 74 65 6e 64 65   area is extende
348c0 64 2c 0a 2a 2a 20 2a 70 70 44 61 74 61 20 69 73  d,.** *ppData is
348d0 20 75 70 64 61 74 65 64 20 74 6f 20 70 6f 69 6e   updated to poin
348e0 74 20 74 6f 20 74 68 65 20 6e 65 77 20 73 74 61  t to the new sta
348f0 72 74 20 6f 66 20 74 68 65 20 63 6f 6e 74 65 6e  rt of the conten
34900 74 20 61 72 65 61 0a 2a 2a 20 62 65 66 6f 72 65  t area.** before
34910 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a   returning..**.*
34920 2a 20 46 69 6e 61 6c 6c 79 2c 20 61 72 67 75 6d  * Finally, argum
34930 65 6e 74 20 70 42 65 67 69 6e 20 70 6f 69 6e 74  ent pBegin point
34940 73 20 74 6f 20 74 68 65 20 62 79 74 65 20 69 6d  s to the byte im
34950 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77  mediately follow
34960 69 6e 67 20 74 68 65 0a 2a 2a 20 65 6e 64 20 6f  ing the.** end o
34970 66 20 74 68 65 20 73 70 61 63 65 20 72 65 71 75  f the space requ
34980 69 72 65 64 20 62 79 20 74 68 69 73 20 70 61 67  ired by this pag
34990 65 20 66 6f 72 20 74 68 65 20 63 65 6c 6c 2d 70  e for the cell-p
349a0 6f 69 6e 74 65 72 20 61 72 65 61 20 28 66 6f 72  ointer area (for
349b0 0a 2a 2a 20 61 6c 6c 20 63 65 6c 6c 73 20 2d 20  .** all cells - 
349c0 6e 6f 74 20 6a 75 73 74 20 74 68 6f 73 65 20 69  not just those i
349d0 6e 73 65 72 74 65 64 20 62 79 20 74 68 65 20 63  nserted by the c
349e0 75 72 72 65 6e 74 20 63 61 6c 6c 29 2e 20 49 66  urrent call). If
349f0 20 74 68 65 20 63 6f 6e 74 65 6e 74 0a 2a 2a 20   the content.** 
34a00 61 72 65 61 20 6d 75 73 74 20 62 65 20 65 78 74  area must be ext
34a10 65 6e 64 65 64 20 74 6f 20 62 65 66 6f 72 65 20  ended to before 
34a20 74 68 69 73 20 70 6f 69 6e 74 20 69 6e 20 6f 72  this point in or
34a30 64 65 72 20 74 6f 20 61 63 63 6f 6d 6f 64 61 74  der to accomodat
34a40 65 20 61 6c 6c 0a 2a 2a 20 63 65 6c 6c 73 20 69  e all.** cells i
34a50 6e 20 61 70 43 65 6c 6c 5b 5d 2c 20 74 68 65 6e  n apCell[], then
34a60 20 74 68 65 20 63 65 6c 6c 73 20 64 6f 20 6e 6f   the cells do no
34a70 74 20 66 69 74 20 61 6e 64 20 6e 6f 6e 2d 7a 65  t fit and non-ze
34a80 72 6f 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  ro is returned..
34a90 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
34aa0 67 65 49 6e 73 65 72 74 41 72 72 61 79 28 0a 20  geInsertArray(. 
34ab0 20 4d 65 6d 50 61 67 65 20 2a 70 50 67 2c 20 20   MemPage *pPg,  
34ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34ad0 20 2f 2a 20 50 61 67 65 20 74 6f 20 61 64 64 20   /* Page to add 
34ae0 63 65 6c 6c 73 20 74 6f 20 2a 2f 0a 20 20 75 38  cells to */.  u8
34af0 20 2a 70 42 65 67 69 6e 2c 20 20 20 20 20 20 20   *pBegin,       
34b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
34b10 20 45 6e 64 20 6f 66 20 63 65 6c 6c 2d 70 6f 69   End of cell-poi
34b20 6e 74 65 72 20 61 72 72 61 79 20 2a 2f 0a 20 20  nter array */.  
34b30 75 38 20 2a 2a 70 70 44 61 74 61 2c 20 20 20 20  u8 **ppData,    
34b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34b50 2f 2a 20 49 4e 2f 4f 55 54 3a 20 50 61 67 65 20  /* IN/OUT: Page 
34b60 63 6f 6e 74 65 6e 74 20 2d 61 72 65 61 20 70 6f  content -area po
34b70 69 6e 74 65 72 20 2a 2f 0a 20 20 75 38 20 2a 70  inter */.  u8 *p
34b80 43 65 6c 6c 70 74 72 2c 20 20 20 20 20 20 20 20  Cellptr,        
34b90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
34ba0 69 6e 74 65 72 20 74 6f 20 63 65 6c 6c 2d 70 6f  inter to cell-po
34bb0 69 6e 74 65 72 20 61 72 65 61 20 2a 2f 0a 20 20  inter area */.  
34bc0 69 6e 74 20 6e 43 65 6c 6c 2c 20 20 20 20 20 20  int nCell,      
34bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34be0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c  /* Number of cel
34bf0 6c 73 20 74 6f 20 61 64 64 20 74 6f 20 70 50 67  ls to add to pPg
34c00 20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43 65 6c   */.  u8 **apCel
34c10 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
34c20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f        /* Array o
34c30 66 20 63 65 6c 6c 73 20 2a 2f 0a 20 20 75 31 36  f cells */.  u16
34c40 20 2a 73 7a 43 65 6c 6c 20 20 20 20 20 20 20 20   *szCell        
34c50 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
34c60 41 72 72 61 79 20 6f 66 20 63 65 6c 6c 20 73 69  Array of cell si
34c70 7a 65 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  zes */.){.  int 
34c80 69 3b 0a 20 20 75 38 20 2a 61 44 61 74 61 20 3d  i;.  u8 *aData =
34c90 20 70 50 67 2d 3e 61 44 61 74 61 3b 0a 20 20 75   pPg->aData;.  u
34ca0 38 20 2a 70 44 61 74 61 20 3d 20 2a 70 70 44 61  8 *pData = *ppDa
34cb0 74 61 3b 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20  ta;.  const int 
34cc0 62 46 72 65 65 6c 69 73 74 20 3d 20 61 44 61 74  bFreelist = aDat
34cd0 61 5b 31 5d 20 7c 7c 20 61 44 61 74 61 5b 32 5d  a[1] || aData[2]
34ce0 3b 0a 20 20 61 73 73 65 72 74 28 20 43 4f 52 52  ;.  assert( CORR
34cf0 55 50 54 5f 44 42 20 7c 7c 20 70 50 67 2d 3e 68  UPT_DB || pPg->h
34d00 64 72 4f 66 66 73 65 74 3d 3d 30 20 29 3b 20 20  drOffset==0 );  
34d10 20 20 2f 2a 20 4e 65 76 65 72 20 63 61 6c 6c 65    /* Never calle
34d20 64 20 6f 6e 20 70 61 67 65 20 31 20 2a 2f 0a 20  d on page 1 */. 
34d30 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c   for(i=0; i<nCel
34d40 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74  l; i++){.    int
34d50 20 73 7a 20 3d 20 73 7a 43 65 6c 6c 5b 69 5d 3b   sz = szCell[i];
34d60 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20  .    int rc;.   
34d70 20 75 38 20 2a 70 53 6c 6f 74 3b 0a 20 20 20 20   u8 *pSlot;.    
34d80 69 66 28 20 62 46 72 65 65 6c 69 73 74 3d 3d 30  if( bFreelist==0
34d90 20 7c 7c 20 28 70 53 6c 6f 74 20 3d 20 70 61 67   || (pSlot = pag
34da0 65 46 69 6e 64 53 6c 6f 74 28 70 50 67 2c 20 73  eFindSlot(pPg, s
34db0 7a 2c 20 26 72 63 2c 20 30 29 29 3d 3d 30 20 29  z, &rc, 0))==0 )
34dc0 7b 0a 20 20 20 20 20 20 70 44 61 74 61 20 2d 3d  {.      pData -=
34dd0 20 73 7a 3b 0a 20 20 20 20 20 20 69 66 28 20 70   sz;.      if( p
34de0 44 61 74 61 3c 70 42 65 67 69 6e 20 29 20 72 65  Data<pBegin ) re
34df0 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 70 53  turn 1;.      pS
34e00 6c 6f 74 20 3d 20 70 44 61 74 61 3b 0a 20 20 20  lot = pData;.   
34e10 20 7d 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 53   }.    memcpy(pS
34e20 6c 6f 74 2c 20 61 70 43 65 6c 6c 5b 69 5d 2c 20  lot, apCell[i], 
34e30 73 7a 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74  sz);.    put2byt
34e40 65 28 70 43 65 6c 6c 70 74 72 2c 20 28 70 53 6c  e(pCellptr, (pSl
34e50 6f 74 20 2d 20 61 44 61 74 61 29 29 3b 0a 20 20  ot - aData));.  
34e60 20 20 70 43 65 6c 6c 70 74 72 20 2b 3d 20 32 3b    pCellptr += 2;
34e70 0a 20 20 7d 0a 20 20 2a 70 70 44 61 74 61 20 3d  .  }.  *ppData =
34e80 20 70 44 61 74 61 3b 0a 20 20 72 65 74 75 72 6e   pData;.  return
34e90 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 72   0;.}../*.** Arr
34ea0 61 79 20 61 70 43 65 6c 6c 5b 5d 20 63 6f 6e 74  ay apCell[] cont
34eb0 61 69 6e 73 20 6e 43 65 6c 6c 20 70 6f 69 6e 74  ains nCell point
34ec0 65 72 73 20 74 6f 20 62 2d 74 72 65 65 20 63 65  ers to b-tree ce
34ed0 6c 6c 73 2e 20 41 72 72 61 79 20 73 7a 43 65 6c  lls. Array szCel
34ee0 6c 20 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 74  l .** contains t
34ef0 68 65 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73  he size in bytes
34f00 20 6f 66 20 65 61 63 68 20 73 75 63 68 20 63 65   of each such ce
34f10 6c 6c 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  ll. This functio
34f20 6e 20 61 64 64 73 20 74 68 65 0a 2a 2a 20 73 70  n adds the.** sp
34f30 61 63 65 20 61 73 73 6f 63 69 61 74 65 64 20 77  ace associated w
34f40 69 74 68 20 65 61 63 68 20 63 65 6c 6c 20 69 6e  ith each cell in
34f50 20 74 68 65 20 61 72 72 61 79 20 74 68 61 74 20   the array that 
34f60 69 73 20 63 75 72 72 65 6e 74 6c 79 20 73 74 6f  is currently sto
34f70 72 65 64 20 0a 2a 2a 20 77 69 74 68 69 6e 20 74  red .** within t
34f80 68 65 20 62 6f 64 79 20 6f 66 20 70 50 67 20 74  he body of pPg t
34f90 6f 20 74 68 65 20 70 50 67 20 66 72 65 65 2d 6c  o the pPg free-l
34fa0 69 73 74 2e 20 54 68 65 20 63 65 6c 6c 2d 70 6f  ist. The cell-po
34fb0 69 6e 74 65 72 73 20 61 6e 64 20 6f 74 68 65 72  inters and other
34fc0 0a 2a 2a 20 66 69 65 6c 64 73 20 6f 66 20 74 68  .** fields of th
34fd0 65 20 70 61 67 65 20 61 72 65 20 6e 6f 74 20 75  e page are not u
34fe0 70 64 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  pdated..**.** Th
34ff0 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
35000 72 6e 73 20 74 68 65 20 74 6f 74 61 6c 20 6e 75  rns the total nu
35010 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 61 64  mber of cells ad
35020 64 65 64 20 74 6f 20 74 68 65 20 66 72 65 65 2d  ded to the free-
35030 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  list..*/.static 
35040 69 6e 74 20 70 61 67 65 46 72 65 65 41 72 72 61  int pageFreeArra
35050 79 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  y(.  MemPage *pP
35060 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g,              
35070 20 20 20 20 20 2f 2a 20 50 61 67 65 20 74 6f 20       /* Page to 
35080 65 64 69 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 43  edit */.  int nC
35090 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  ell,            
350a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 65 6c            /* Cel
350b0 6c 73 20 74 6f 20 64 65 6c 65 74 65 20 2a 2f 0a  ls to delete */.
350c0 20 20 75 38 20 2a 2a 61 70 43 65 6c 6c 2c 20 20    u8 **apCell,  
350d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
350e0 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 63 65    /* Array of ce
350f0 6c 6c 73 20 2a 2f 0a 20 20 75 31 36 20 2a 73 7a  lls */.  u16 *sz
35100 43 65 6c 6c 20 20 20 20 20 20 20 20 20 20 20 20  Cell            
35110 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61           /* Arra
35120 79 20 6f 66 20 63 65 6c 6c 20 73 69 7a 65 73 20  y of cell sizes 
35130 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a 20 63 6f 6e  */.){.  u8 * con
35140 73 74 20 61 44 61 74 61 20 3d 20 70 50 67 2d 3e  st aData = pPg->
35150 61 44 61 74 61 3b 0a 20 20 75 38 20 2a 20 63 6f  aData;.  u8 * co
35160 6e 73 74 20 70 45 6e 64 20 3d 20 26 61 44 61 74  nst pEnd = &aDat
35170 61 5b 70 50 67 2d 3e 70 42 74 2d 3e 75 73 61 62  a[pPg->pBt->usab
35180 6c 65 53 69 7a 65 5d 3b 0a 20 20 75 38 20 2a 20  leSize];.  u8 * 
35190 63 6f 6e 73 74 20 70 53 74 61 72 74 20 3d 20 26  const pStart = &
351a0 61 44 61 74 61 5b 70 50 67 2d 3e 68 64 72 4f 66  aData[pPg->hdrOf
351b0 66 73 65 74 20 2b 20 38 20 2b 20 70 50 67 2d 3e  fset + 8 + pPg->
351c0 63 68 69 6c 64 50 74 72 53 69 7a 65 5d 3b 0a 20  childPtrSize];. 
351d0 20 69 6e 74 20 6e 52 65 74 20 3d 20 30 3b 0a 20   int nRet = 0;. 
351e0 20 69 6e 74 20 69 3b 0a 20 20 75 38 20 2a 70 46   int i;.  u8 *pF
351f0 72 65 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 73  ree = 0;.  int s
35200 7a 46 72 65 65 20 3d 20 30 3b 0a 0a 20 20 66 6f  zFree = 0;..  fo
35210 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20  r(i=0; i<nCell; 
35220 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70 43  i++){.    u8 *pC
35230 65 6c 6c 20 3d 20 61 70 43 65 6c 6c 5b 69 5d 3b  ell = apCell[i];
35240 0a 20 20 20 20 69 66 28 20 70 43 65 6c 6c 3e 3d  .    if( pCell>=
35250 70 53 74 61 72 74 20 26 26 20 70 43 65 6c 6c 3c  pStart && pCell<
35260 70 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 69 6e  pEnd ){.      in
35270 74 20 73 7a 20 3d 20 73 7a 43 65 6c 6c 5b 69 5d  t sz = szCell[i]
35280 3b 0a 20 20 20 20 20 20 69 66 28 20 70 46 72 65  ;.      if( pFre
35290 65 21 3d 28 70 43 65 6c 6c 20 2b 20 73 7a 29 20  e!=(pCell + sz) 
352a0 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
352b0 46 72 65 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Free ){.        
352c0 20 20 61 73 73 65 72 74 28 20 70 46 72 65 65 3e    assert( pFree>
352d0 61 44 61 74 61 20 26 26 20 28 70 46 72 65 65 20  aData && (pFree 
352e0 2d 20 61 44 61 74 61 29 3c 36 35 35 33 36 20 29  - aData)<65536 )
352f0 3b 0a 20 20 20 20 20 20 20 20 20 20 66 72 65 65  ;.          free
35300 53 70 61 63 65 28 70 50 67 2c 20 28 75 31 36 29  Space(pPg, (u16)
35310 28 70 46 72 65 65 20 2d 20 61 44 61 74 61 29 2c  (pFree - aData),
35320 20 73 7a 46 72 65 65 29 3b 0a 20 20 20 20 20 20   szFree);.      
35330 20 20 7d 0a 20 20 20 20 20 20 20 20 70 46 72 65    }.        pFre
35340 65 20 3d 20 70 43 65 6c 6c 3b 0a 20 20 20 20 20  e = pCell;.     
35350 20 20 20 73 7a 46 72 65 65 20 3d 20 73 7a 3b 0a     szFree = sz;.
35360 20 20 20 20 20 20 20 20 69 66 28 20 70 46 72 65          if( pFre
35370 65 2b 73 7a 3e 70 45 6e 64 20 29 20 72 65 74 75  e+sz>pEnd ) retu
35380 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73  rn 0;.      }els
35390 65 7b 0a 20 20 20 20 20 20 20 20 70 46 72 65 65  e{.        pFree
353a0 20 3d 20 70 43 65 6c 6c 3b 0a 20 20 20 20 20 20   = pCell;.      
353b0 20 20 73 7a 46 72 65 65 20 2b 3d 20 73 7a 3b 0a    szFree += sz;.
353c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 52        }.      nR
353d0 65 74 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  et++;.    }.  }.
353e0 20 20 69 66 28 20 70 46 72 65 65 20 29 7b 0a 20    if( pFree ){. 
353f0 20 20 20 61 73 73 65 72 74 28 20 70 46 72 65 65     assert( pFree
35400 3e 61 44 61 74 61 20 26 26 20 28 70 46 72 65 65  >aData && (pFree
35410 20 2d 20 61 44 61 74 61 29 3c 36 35 35 33 36 20   - aData)<65536 
35420 29 3b 0a 20 20 20 20 66 72 65 65 53 70 61 63 65  );.    freeSpace
35430 28 70 50 67 2c 20 28 75 31 36 29 28 70 46 72 65  (pPg, (u16)(pFre
35440 65 20 2d 20 61 44 61 74 61 29 2c 20 73 7a 46 72  e - aData), szFr
35450 65 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ee);.  }.  retur
35460 6e 20 6e 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n nRet;.}../*.**
35470 20 61 70 43 65 6c 6c 5b 5d 20 61 6e 64 20 73 7a   apCell[] and sz
35480 43 65 6c 6c 5b 5d 20 63 6f 6e 74 61 69 6e 73 20  Cell[] contains 
35490 70 6f 69 6e 74 65 72 73 20 74 6f 20 61 6e 64 20  pointers to and 
354a0 73 69 7a 65 73 20 6f 66 20 61 6c 6c 20 63 65 6c  sizes of all cel
354b0 6c 73 20 69 6e 20 74 68 65 0a 2a 2a 20 70 61 67  ls in the.** pag
354c0 65 73 20 62 65 69 6e 67 20 62 61 6c 61 6e 63 65  es being balance
354d0 64 2e 20 20 54 68 65 20 63 75 72 72 65 6e 74 20  d.  The current 
354e0 70 61 67 65 2c 20 70 50 67 2c 20 68 61 73 20 70  page, pPg, has p
354f0 50 67 2d 3e 6e 43 65 6c 6c 20 63 65 6c 6c 73 20  Pg->nCell cells 
35500 73 74 61 72 74 69 6e 67 0a 2a 2a 20 77 69 74 68  starting.** with
35510 20 61 70 43 65 6c 6c 5b 69 4f 6c 64 5d 2e 20 20   apCell[iOld].  
35520 41 66 74 65 72 20 62 61 6c 61 6e 63 69 6e 67 2c  After balancing,
35530 20 74 68 69 73 20 70 61 67 65 20 73 68 6f 75 6c   this page shoul
35540 64 20 68 6f 6c 64 20 6e 4e 65 77 20 63 65 6c 6c  d hold nNew cell
35550 73 0a 2a 2a 20 73 74 61 72 74 69 6e 67 20 61 74  s.** starting at
35560 20 61 70 43 65 6c 6c 5b 69 4e 65 77 5d 2e 0a 2a   apCell[iNew]..*
35570 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
35580 65 20 6d 61 6b 65 73 20 74 68 65 20 6e 65 63 65  e makes the nece
35590 73 73 61 72 79 20 61 64 6a 75 73 74 6d 65 6e 74  ssary adjustment
355a0 73 20 74 6f 20 70 50 67 20 73 6f 20 74 68 61 74  s to pPg so that
355b0 20 69 74 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20   it contains.** 
355c0 74 68 65 20 63 6f 72 72 65 63 74 20 63 65 6c 6c  the correct cell
355d0 73 20 61 66 74 65 72 20 62 65 69 6e 67 20 62 61  s after being ba
355e0 6c 61 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  lanced..**.** Th
355f0 65 20 70 50 67 2d 3e 6e 46 72 65 65 20 66 69 65  e pPg->nFree fie
35600 6c 64 20 69 73 20 69 6e 76 61 6c 69 64 20 77 68  ld is invalid wh
35610 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
35620 20 72 65 74 75 72 6e 73 2e 20 49 74 20 69 73 20   returns. It is 
35630 74 68 65 0a 2a 2a 20 72 65 73 70 6f 6e 73 69 62  the.** responsib
35640 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c  ility of the cal
35650 6c 65 72 20 74 6f 20 73 65 74 20 69 74 20 63 6f  ler to set it co
35660 72 72 65 63 74 6c 79 2e 0a 2a 2f 0a 73 74 61 74  rrectly..*/.stat
35670 69 63 20 76 6f 69 64 20 65 64 69 74 50 61 67 65  ic void editPage
35680 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 67  (.  MemPage *pPg
35690 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
356a0 20 20 20 20 2f 2a 20 45 64 69 74 20 74 68 69 73      /* Edit this
356b0 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 69   page */.  int i
356c0 4f 6c 64 2c 20 20 20 20 20 20 20 20 20 20 20 20  Old,            
356d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
356e0 64 65 78 20 6f 66 20 66 69 72 73 74 20 63 65 6c  dex of first cel
356f0 6c 20 63 75 72 72 65 6e 74 6c 79 20 6f 6e 20 70  l currently on p
35700 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4e 65  age */.  int iNe
35710 77 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  w,              
35720 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
35730 78 20 6f 66 20 6e 65 77 20 66 69 72 73 74 20 63  x of new first c
35740 65 6c 6c 20 6f 6e 20 70 61 67 65 20 2a 2f 0a 20  ell on page */. 
35750 20 69 6e 74 20 6e 4e 65 77 2c 20 20 20 20 20 20   int nNew,      
35760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35770 20 2f 2a 20 46 69 6e 61 6c 20 6e 75 6d 62 65 72   /* Final number
35780 20 6f 66 20 63 65 6c 6c 73 20 6f 6e 20 70 61 67   of cells on pag
35790 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43 65  e */.  u8 **apCe
357a0 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ll,             
357b0 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20         /* Array 
357c0 6f 66 20 63 65 6c 6c 73 20 2a 2f 0a 20 20 75 31  of cells */.  u1
357d0 36 20 2a 73 7a 43 65 6c 6c 20 20 20 20 20 20 20  6 *szCell       
357e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
357f0 20 41 72 72 61 79 20 6f 66 20 63 65 6c 6c 20 73   Array of cell s
35800 69 7a 65 73 20 2a 2f 0a 29 7b 0a 20 20 75 38 20  izes */.){.  u8 
35810 2a 20 63 6f 6e 73 74 20 61 44 61 74 61 20 3d 20  * const aData = 
35820 70 50 67 2d 3e 61 44 61 74 61 3b 0a 20 20 63 6f  pPg->aData;.  co
35830 6e 73 74 20 69 6e 74 20 68 64 72 20 3d 20 70 50  nst int hdr = pP
35840 67 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20  g->hdrOffset;.  
35850 75 38 20 2a 70 42 65 67 69 6e 20 3d 20 26 70 50  u8 *pBegin = &pP
35860 67 2d 3e 61 43 65 6c 6c 49 64 78 5b 6e 4e 65 77  g->aCellIdx[nNew
35870 20 2a 20 32 5d 3b 0a 20 20 69 6e 74 20 6e 43 65   * 2];.  int nCe
35880 6c 6c 20 3d 20 70 50 67 2d 3e 6e 43 65 6c 6c 3b  ll = pPg->nCell;
35890 20 20 20 20 20 20 20 2f 2a 20 43 65 6c 6c 73 20         /* Cells 
358a0 73 74 6f 72 65 64 20 6f 6e 20 70 50 67 20 2a 2f  stored on pPg */
358b0 0a 20 20 75 38 20 2a 70 44 61 74 61 3b 0a 20 20  .  u8 *pData;.  
358c0 75 38 20 2a 70 43 65 6c 6c 70 74 72 3b 0a 20 20  u8 *pCellptr;.  
358d0 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 69 4f 6c  int i;.  int iOl
358e0 64 45 6e 64 20 3d 20 69 4f 6c 64 20 2b 20 70 50  dEnd = iOld + pP
358f0 67 2d 3e 6e 43 65 6c 6c 20 2b 20 70 50 67 2d 3e  g->nCell + pPg->
35900 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20 69 6e 74  nOverflow;.  int
35910 20 69 4e 65 77 45 6e 64 20 3d 20 69 4e 65 77 20   iNewEnd = iNew 
35920 2b 20 6e 4e 65 77 3b 0a 0a 23 69 66 64 65 66 20  + nNew;..#ifdef 
35930 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 75  SQLITE_DEBUG.  u
35940 38 20 2a 70 54 6d 70 20 3d 20 73 71 6c 69 74 65  8 *pTmp = sqlite
35950 33 50 61 67 65 72 54 65 6d 70 53 70 61 63 65 28  3PagerTempSpace(
35960 70 50 67 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72  pPg->pBt->pPager
35970 29 3b 0a 20 20 6d 65 6d 63 70 79 28 70 54 6d 70  );.  memcpy(pTmp
35980 2c 20 61 44 61 74 61 2c 20 70 50 67 2d 3e 70 42  , aData, pPg->pB
35990 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a  t->usableSize);.
359a0 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 52 65 6d  #endif..  /* Rem
359b0 6f 76 65 20 63 65 6c 6c 73 20 66 72 6f 6d 20 74  ove cells from t
359c0 68 65 20 73 74 61 72 74 20 61 6e 64 20 65 6e 64  he start and end
359d0 20 6f 66 20 74 68 65 20 70 61 67 65 20 2a 2f 0a   of the page */.
359e0 20 20 69 66 28 20 69 4f 6c 64 3c 69 4e 65 77 20    if( iOld<iNew 
359f0 29 7b 0a 20 20 20 20 69 6e 74 20 6e 53 68 69 66  ){.    int nShif
35a00 74 20 3d 20 70 61 67 65 46 72 65 65 41 72 72 61  t = pageFreeArra
35a10 79 28 0a 20 20 20 20 20 20 20 20 70 50 67 2c 20  y(.        pPg, 
35a20 69 4e 65 77 2d 69 4f 6c 64 2c 20 26 61 70 43 65  iNew-iOld, &apCe
35a30 6c 6c 5b 69 4f 6c 64 5d 2c 20 26 73 7a 43 65 6c  ll[iOld], &szCel
35a40 6c 5b 69 4f 6c 64 5d 0a 20 20 20 20 29 3b 0a 20  l[iOld].    );. 
35a50 20 20 20 6d 65 6d 6d 6f 76 65 28 70 50 67 2d 3e     memmove(pPg->
35a60 61 43 65 6c 6c 49 64 78 2c 20 26 70 50 67 2d 3e  aCellIdx, &pPg->
35a70 61 43 65 6c 6c 49 64 78 5b 6e 53 68 69 66 74 2a  aCellIdx[nShift*
35a80 32 5d 2c 20 6e 43 65 6c 6c 2a 32 29 3b 0a 20 20  2], nCell*2);.  
35a90 20 20 6e 43 65 6c 6c 20 2d 3d 20 6e 53 68 69 66    nCell -= nShif
35aa0 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 4e 65  t;.  }.  if( iNe
35ab0 77 45 6e 64 20 3c 20 69 4f 6c 64 45 6e 64 20 29  wEnd < iOldEnd )
35ac0 7b 0a 20 20 20 20 6e 43 65 6c 6c 20 2d 3d 20 70  {.    nCell -= p
35ad0 61 67 65 46 72 65 65 41 72 72 61 79 28 0a 20 20  ageFreeArray(.  
35ae0 20 20 20 20 20 20 70 50 67 2c 20 69 4f 6c 64 45        pPg, iOldE
35af0 6e 64 2d 69 4e 65 77 45 6e 64 2c 20 26 61 70 43  nd-iNewEnd, &apC
35b00 65 6c 6c 5b 69 4e 65 77 45 6e 64 5d 2c 20 26 73  ell[iNewEnd], &s
35b10 7a 43 65 6c 6c 5b 69 4e 65 77 45 6e 64 5d 0a 20  zCell[iNewEnd]. 
35b20 20 20 20 29 3b 0a 20 20 7d 0a 0a 20 20 70 44 61     );.  }..  pDa
35b30 74 61 20 3d 20 26 61 44 61 74 61 5b 67 65 74 32  ta = &aData[get2
35b40 62 79 74 65 4e 6f 74 5a 65 72 6f 28 26 61 44 61  byteNotZero(&aDa
35b50 74 61 5b 68 64 72 2b 35 5d 29 5d 3b 0a 20 20 69  ta[hdr+5])];.  i
35b60 66 28 20 70 44 61 74 61 3c 70 42 65 67 69 6e 20  f( pData<pBegin 
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 0a 20 20 2f 2a 20 41 64 64 20  fail;..  /* Add 
35b90 63 65 6c 6c 73 20 74 6f 20 74 68 65 20 73 74 61  cells to the sta
35ba0 72 74 20 6f 66 20 74 68 65 20 70 61 67 65 20 2a  rt of the page *
35bb0 2f 0a 20 20 69 66 28 20 69 4e 65 77 3c 69 4f 6c  /.  if( iNew<iOl
35bc0 64 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 41 64  d ){.    int nAd
35bd0 64 20 3d 20 4d 49 4e 28 6e 4e 65 77 2c 69 4f 6c  d = MIN(nNew,iOl
35be0 64 2d 69 4e 65 77 29 3b 0a 20 20 20 20 61 73 73  d-iNew);.    ass
35bf0 65 72 74 28 20 28 69 4f 6c 64 2d 69 4e 65 77 29  ert( (iOld-iNew)
35c00 3c 6e 4e 65 77 20 7c 7c 20 6e 43 65 6c 6c 3d 3d  <nNew || nCell==
35c10 30 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20  0 || CORRUPT_DB 
35c20 29 3b 0a 20 20 20 20 70 43 65 6c 6c 70 74 72 20  );.    pCellptr 
35c30 3d 20 70 50 67 2d 3e 61 43 65 6c 6c 49 64 78 3b  = pPg->aCellIdx;
35c40 0a 20 20 20 20 6d 65 6d 6d 6f 76 65 28 26 70 43  .    memmove(&pC
35c50 65 6c 6c 70 74 72 5b 6e 41 64 64 2a 32 5d 2c 20  ellptr[nAdd*2], 
35c60 70 43 65 6c 6c 70 74 72 2c 20 6e 43 65 6c 6c 2a  pCellptr, nCell*
35c70 32 29 3b 0a 20 20 20 20 69 66 28 20 70 61 67 65  2);.    if( page
35c80 49 6e 73 65 72 74 41 72 72 61 79 28 0a 20 20 20  InsertArray(.   
35c90 20 20 20 20 20 20 20 70 50 67 2c 20 70 42 65 67         pPg, pBeg
35ca0 69 6e 2c 20 26 70 44 61 74 61 2c 20 70 43 65 6c  in, &pData, pCel
35cb0 6c 70 74 72 2c 0a 20 20 20 20 20 20 20 20 20 20  lptr,.          
35cc0 6e 41 64 64 2c 20 26 61 70 43 65 6c 6c 5b 69 4e  nAdd, &apCell[iN
35cd0 65 77 5d 2c 20 26 73 7a 43 65 6c 6c 5b 69 4e 65  ew], &szCell[iNe
35ce0 77 5d 0a 20 20 20 20 29 20 29 20 67 6f 74 6f 20  w].    ) ) goto 
35cf0 65 64 69 74 70 61 67 65 5f 66 61 69 6c 3b 0a 20  editpage_fail;. 
35d00 20 20 20 6e 43 65 6c 6c 20 2b 3d 20 6e 41 64 64     nCell += nAdd
35d10 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 64 64 20  ;.  }..  /* Add 
35d20 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c  any overflow cel
35d30 6c 73 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  ls */.  for(i=0;
35d40 20 69 3c 70 50 67 2d 3e 6e 4f 76 65 72 66 6c 6f   i<pPg->nOverflo
35d50 77 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74  w; i++){.    int
35d60 20 69 43 65 6c 6c 20 3d 20 28 69 4f 6c 64 20 2b   iCell = (iOld +
35d70 20 70 50 67 2d 3e 61 69 4f 76 66 6c 5b 69 5d 29   pPg->aiOvfl[i])
35d80 20 2d 20 69 4e 65 77 3b 0a 20 20 20 20 69 66 28   - iNew;.    if(
35d90 20 69 43 65 6c 6c 3e 3d 30 20 26 26 20 69 43 65   iCell>=0 && iCe
35da0 6c 6c 3c 6e 4e 65 77 20 29 7b 0a 20 20 20 20 20  ll<nNew ){.     
35db0 20 70 43 65 6c 6c 70 74 72 20 3d 20 26 70 50 67   pCellptr = &pPg
35dc0 2d 3e 61 43 65 6c 6c 49 64 78 5b 69 43 65 6c 6c  ->aCellIdx[iCell
35dd0 20 2a 20 32 5d 3b 0a 20 20 20 20 20 20 6d 65 6d   * 2];.      mem
35de0 6d 6f 76 65 28 26 70 43 65 6c 6c 70 74 72 5b 32  move(&pCellptr[2
35df0 5d 2c 20 70 43 65 6c 6c 70 74 72 2c 20 28 6e 43  ], pCellptr, (nC
35e00 65 6c 6c 20 2d 20 69 43 65 6c 6c 29 20 2a 20 32  ell - iCell) * 2
35e10 29 3b 0a 20 20 20 20 20 20 6e 43 65 6c 6c 2b 2b  );.      nCell++
35e20 3b 0a 20 20 20 20 20 20 69 66 28 20 70 61 67 65  ;.      if( page
35e30 49 6e 73 65 72 74 41 72 72 61 79 28 0a 20 20 20  InsertArray(.   
35e40 20 20 20 20 20 20 20 20 20 70 50 67 2c 20 70 42           pPg, pB
35e50 65 67 69 6e 2c 20 26 70 44 61 74 61 2c 20 70 43  egin, &pData, pC
35e60 65 6c 6c 70 74 72 2c 0a 20 20 20 20 20 20 20 20  ellptr,.        
35e70 20 20 20 20 31 2c 20 26 61 70 43 65 6c 6c 5b 69      1, &apCell[i
35e80 43 65 6c 6c 20 2b 20 69 4e 65 77 5d 2c 20 26 73  Cell + iNew], &s
35e90 7a 43 65 6c 6c 5b 69 43 65 6c 6c 20 2b 20 69 4e  zCell[iCell + iN
35ea0 65 77 5d 0a 20 20 20 20 20 20 29 20 29 20 67 6f  ew].      ) ) go
35eb0 74 6f 20 65 64 69 74 70 61 67 65 5f 66 61 69 6c  to editpage_fail
35ec0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
35ed0 2a 20 41 70 70 65 6e 64 20 63 65 6c 6c 73 20 74  * Append cells t
35ee0 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  o the end of the
35ef0 20 70 61 67 65 20 2a 2f 0a 20 20 70 43 65 6c 6c   page */.  pCell
35f00 70 74 72 20 3d 20 26 70 50 67 2d 3e 61 43 65 6c  ptr = &pPg->aCel
35f10 6c 49 64 78 5b 6e 43 65 6c 6c 2a 32 5d 3b 0a 20  lIdx[nCell*2];. 
35f20 20 69 66 28 20 70 61 67 65 49 6e 73 65 72 74 41   if( pageInsertA
35f30 72 72 61 79 28 0a 20 20 20 20 20 20 20 20 70 50  rray(.        pP
35f40 67 2c 20 70 42 65 67 69 6e 2c 20 26 70 44 61 74  g, pBegin, &pDat
35f50 61 2c 20 70 43 65 6c 6c 70 74 72 2c 0a 20 20 20  a, pCellptr,.   
35f60 20 20 20 20 20 6e 4e 65 77 2d 6e 43 65 6c 6c 2c       nNew-nCell,
35f70 20 26 61 70 43 65 6c 6c 5b 69 4e 65 77 2b 6e 43   &apCell[iNew+nC
35f80 65 6c 6c 5d 2c 20 26 73 7a 43 65 6c 6c 5b 69 4e  ell], &szCell[iN
35f90 65 77 2b 6e 43 65 6c 6c 5d 0a 20 20 29 20 29 20  ew+nCell].  ) ) 
35fa0 67 6f 74 6f 20 65 64 69 74 70 61 67 65 5f 66 61  goto editpage_fa
35fb0 69 6c 3b 0a 0a 20 20 70 50 67 2d 3e 6e 43 65 6c  il;..  pPg->nCel
35fc0 6c 20 3d 20 6e 4e 65 77 3b 0a 20 20 70 50 67 2d  l = nNew;.  pPg-
35fd0 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a  >nOverflow = 0;.
35fe0 0a 20 20 70 75 74 32 62 79 74 65 28 26 61 44 61  .  put2byte(&aDa
35ff0 74 61 5b 68 64 72 2b 33 5d 2c 20 70 50 67 2d 3e  ta[hdr+3], pPg->
36000 6e 43 65 6c 6c 29 3b 0a 20 20 70 75 74 32 62 79  nCell);.  put2by
36010 74 65 28 26 61 44 61 74 61 5b 68 64 72 2b 35 5d  te(&aData[hdr+5]
36020 2c 20 70 44 61 74 61 20 2d 20 61 44 61 74 61 29  , pData - aData)
36030 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
36040 5f 44 45 42 55 47 0a 20 20 66 6f 72 28 69 3d 30  _DEBUG.  for(i=0
36050 3b 20 69 3c 6e 4e 65 77 20 26 26 20 21 43 4f 52  ; i<nNew && !COR
36060 52 55 50 54 5f 44 42 3b 20 69 2b 2b 29 7b 0a 20  RUPT_DB; i++){. 
36070 20 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20 61     u8 *pCell = a
36080 70 43 65 6c 6c 5b 69 2b 69 4e 65 77 5d 3b 0a 20  pCell[i+iNew];. 
36090 20 20 20 69 6e 74 20 69 4f 66 66 20 3d 20 67 65     int iOff = ge
360a0 74 32 62 79 74 65 28 26 70 50 67 2d 3e 61 43 65  t2byte(&pPg->aCe
360b0 6c 6c 49 64 78 5b 69 2a 32 5d 29 3b 0a 20 20 20  llIdx[i*2]);.   
360c0 20 69 66 28 20 70 43 65 6c 6c 3e 3d 61 44 61 74   if( pCell>=aDat
360d0 61 20 26 26 20 70 43 65 6c 6c 3c 26 61 44 61 74  a && pCell<&aDat
360e0 61 5b 70 50 67 2d 3e 70 42 74 2d 3e 75 73 61 62  a[pPg->pBt->usab
360f0 6c 65 53 69 7a 65 5d 20 29 7b 0a 20 20 20 20 20  leSize] ){.     
36100 20 70 43 65 6c 6c 20 3d 20 26 70 54 6d 70 5b 70   pCell = &pTmp[p
36110 43 65 6c 6c 20 2d 20 61 44 61 74 61 5d 3b 0a 20  Cell - aData];. 
36120 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
36130 20 30 3d 3d 6d 65 6d 63 6d 70 28 70 43 65 6c 6c   0==memcmp(pCell
36140 2c 20 26 61 44 61 74 61 5b 69 4f 66 66 5d 2c 20  , &aData[iOff], 
36150 73 7a 43 65 6c 6c 5b 69 2b 69 4e 65 77 5d 29 20  szCell[i+iNew]) 
36160 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
36170 20 72 65 74 75 72 6e 3b 0a 20 65 64 69 74 70 61   return;. editpa
36180 67 65 5f 66 61 69 6c 3a 0a 20 20 2f 2a 20 55 6e  ge_fail:.  /* Un
36190 61 62 6c 65 20 74 6f 20 65 64 69 74 20 74 68 69  able to edit thi
361a0 73 20 70 61 67 65 2e 20 52 65 62 75 69 6c 64 20  s page. Rebuild 
361b0 69 74 20 66 72 6f 6d 20 73 63 72 61 74 63 68 20  it from scratch 
361c0 69 6e 73 74 65 61 64 2e 20 2a 2f 0a 20 20 72 65  instead. */.  re
361d0 62 75 69 6c 64 50 61 67 65 28 70 50 67 2c 20 6e  buildPage(pPg, n
361e0 4e 65 77 2c 20 26 61 70 43 65 6c 6c 5b 69 4e 65  New, &apCell[iNe
361f0 77 5d 2c 20 26 73 7a 43 65 6c 6c 5b 69 4e 65 77  w], &szCell[iNew
36200 5d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  ]);.}../*.** The
36210 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 61 72 61 6d   following param
36220 65 74 65 72 73 20 64 65 74 65 72 6d 69 6e 65 20  eters determine 
36230 68 6f 77 20 6d 61 6e 79 20 61 64 6a 61 63 65 6e  how many adjacen
36240 74 20 70 61 67 65 73 20 67 65 74 20 69 6e 76 6f  t pages get invo
36250 6c 76 65 64 0a 2a 2a 20 69 6e 20 61 20 62 61 6c  lved.** in a bal
36260 61 6e 63 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e  ancing operation
36270 2e 20 20 4e 4e 20 69 73 20 74 68 65 20 6e 75 6d  .  NN is the num
36280 62 65 72 20 6f 66 20 6e 65 69 67 68 62 6f 72 73  ber of neighbors
36290 20 6f 6e 20 65 69 74 68 65 72 20 73 69 64 65 0a   on either side.
362a0 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65 20 74  ** of the page t
362b0 68 61 74 20 70 61 72 74 69 63 69 70 61 74 65 20  hat participate 
362c0 69 6e 20 74 68 65 20 62 61 6c 61 6e 63 69 6e 67  in the balancing
362d0 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 4e 42 20   operation.  NB 
362e0 69 73 20 74 68 65 0a 2a 2a 20 74 6f 74 61 6c 20  is the.** total 
362f0 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
36300 74 68 61 74 20 70 61 72 74 69 63 69 70 61 74 65  that participate
36310 2c 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20  , including the 
36320 74 61 72 67 65 74 20 70 61 67 65 20 61 6e 64 0a  target page and.
36330 2a 2a 20 4e 4e 20 6e 65 69 67 68 62 6f 72 73 20  ** NN neighbors 
36340 6f 6e 20 65 69 74 68 65 72 20 73 69 64 65 2e 0a  on either side..
36350 2a 2a 0a 2a 2a 20 54 68 65 20 6d 69 6e 69 6d 75  **.** The minimu
36360 6d 20 76 61 6c 75 65 20 6f 66 20 4e 4e 20 69 73  m value of NN is
36370 20 31 20 28 6f 66 20 63 6f 75 72 73 65 29 2e 20   1 (of course). 
36380 20 49 6e 63 72 65 61 73 69 6e 67 20 4e 4e 20 61   Increasing NN a
36390 62 6f 76 65 20 31 0a 2a 2a 20 28 74 6f 20 32 20  bove 1.** (to 2 
363a0 6f 72 20 33 29 20 67 69 76 65 73 20 61 20 6d 6f  or 3) gives a mo
363b0 64 65 73 74 20 69 6d 70 72 6f 76 65 6d 65 6e 74  dest improvement
363c0 20 69 6e 20 53 45 4c 45 43 54 20 61 6e 64 20 44   in SELECT and D
363d0 45 4c 45 54 45 20 70 65 72 66 6f 72 6d 61 6e 63  ELETE performanc
363e0 65 0a 2a 2a 20 69 6e 20 65 78 63 68 61 6e 67 65  e.** in exchange
363f0 20 66 6f 72 20 61 20 6c 61 72 67 65 72 20 64 65   for a larger de
36400 67 72 61 64 61 74 69 6f 6e 20 69 6e 20 49 4e 53  gradation in INS
36410 45 52 54 20 61 6e 64 20 55 50 44 41 54 45 20 70  ERT and UPDATE p
36420 65 72 66 6f 72 6d 61 6e 63 65 2e 0a 2a 2a 20 54  erformance..** T
36430 68 65 20 76 61 6c 75 65 20 6f 66 20 4e 4e 20 61  he value of NN a
36440 70 70 65 61 72 73 20 74 6f 20 67 69 76 65 20 74  ppears to give t
36450 68 65 20 62 65 73 74 20 72 65 73 75 6c 74 73 20  he best results 
36460 6f 76 65 72 61 6c 6c 2e 0a 2a 2f 0a 23 64 65 66  overall..*/.#def
36470 69 6e 65 20 4e 4e 20 31 20 20 20 20 20 20 20 20  ine NN 1        
36480 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
36490 66 20 6e 65 69 67 68 62 6f 72 73 20 6f 6e 20 65  f neighbors on e
364a0 69 74 68 65 72 20 73 69 64 65 20 6f 66 20 70 50  ither side of pP
364b0 61 67 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4e  age */.#define N
364c0 42 20 28 4e 4e 2a 32 2b 31 29 20 20 20 20 20 20  B (NN*2+1)      
364d0 2f 2a 20 54 6f 74 61 6c 20 70 61 67 65 73 20 69  /* Total pages i
364e0 6e 76 6f 6c 76 65 64 20 69 6e 20 74 68 65 20 62  nvolved in the b
364f0 61 6c 61 6e 63 65 20 2a 2f 0a 0a 0a 23 69 66 6e  alance */...#ifn
36500 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
36510 51 55 49 43 4b 42 41 4c 41 4e 43 45 0a 2f 2a 0a  QUICKBALANCE./*.
36520 2a 2a 20 54 68 69 73 20 76 65 72 73 69 6f 6e 20  ** This version 
36530 6f 66 20 62 61 6c 61 6e 63 65 28 29 20 68 61 6e  of balance() han
36540 64 6c 65 73 20 74 68 65 20 63 6f 6d 6d 6f 6e 20  dles the common 
36550 73 70 65 63 69 61 6c 20 63 61 73 65 20 77 68 65  special case whe
36560 72 65 0a 2a 2a 20 61 20 6e 65 77 20 65 6e 74 72  re.** a new entr
36570 79 20 69 73 20 62 65 69 6e 67 20 69 6e 73 65 72  y is being inser
36580 74 65 64 20 6f 6e 20 74 68 65 20 65 78 74 72 65  ted on the extre
36590 6d 65 20 72 69 67 68 74 2d 65 6e 64 20 6f 66 20  me right-end of 
365a0 74 68 65 0a 2a 2a 20 74 72 65 65 2c 20 69 6e 20  the.** tree, in 
365b0 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 77 68 65  other words, whe
365c0 6e 20 74 68 65 20 6e 65 77 20 65 6e 74 72 79 20  n the new entry 
365d0 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20  will become the 
365e0 6c 61 72 67 65 73 74 0a 2a 2a 20 65 6e 74 72 79  largest.** entry
365f0 20 69 6e 20 74 68 65 20 74 72 65 65 2e 0a 2a 2a   in the tree..**
36600 0a 2a 2a 20 49 6e 73 74 65 61 64 20 6f 66 20 74  .** Instead of t
36610 72 79 69 6e 67 20 74 6f 20 62 61 6c 61 6e 63 65  rying to balance
36620 20 74 68 65 20 33 20 72 69 67 68 74 2d 6d 6f 73   the 3 right-mos
36630 74 20 6c 65 61 66 20 70 61 67 65 73 2c 20 6a 75  t leaf pages, ju
36640 73 74 20 61 64 64 0a 2a 2a 20 61 20 6e 65 77 20  st add.** a new 
36650 70 61 67 65 20 74 6f 20 74 68 65 20 72 69 67 68  page to the righ
36660 74 2d 68 61 6e 64 20 73 69 64 65 20 61 6e 64 20  t-hand side and 
36670 70 75 74 20 74 68 65 20 6f 6e 65 20 6e 65 77 20  put the one new 
36680 65 6e 74 72 79 20 69 6e 0a 2a 2a 20 74 68 61 74  entry in.** that
36690 20 70 61 67 65 2e 20 20 54 68 69 73 20 6c 65 61   page.  This lea
366a0 76 65 73 20 74 68 65 20 72 69 67 68 74 20 73 69  ves the right si
366b0 64 65 20 6f 66 20 74 68 65 20 74 72 65 65 20 73  de of the tree s
366c0 6f 6d 65 77 68 61 74 0a 2a 2a 20 75 6e 62 61 6c  omewhat.** unbal
366d0 61 6e 63 65 64 2e 20 20 42 75 74 20 6f 64 64 73  anced.  But odds
366e0 20 61 72 65 20 74 68 61 74 20 77 65 20 77 69 6c   are that we wil
366f0 6c 20 62 65 20 69 6e 73 65 72 74 69 6e 67 20 6e  l be inserting n
36700 65 77 20 65 6e 74 72 69 65 73 0a 2a 2a 20 61 74  ew entries.** at
36710 20 74 68 65 20 65 6e 64 20 73 6f 6f 6e 20 61 66   the end soon af
36720 74 65 72 77 61 72 64 73 20 73 6f 20 74 68 65 20  terwards so the 
36730 6e 65 61 72 6c 79 20 65 6d 70 74 79 20 70 61 67  nearly empty pag
36740 65 20 77 69 6c 6c 20 71 75 69 63 6b 6c 79 0a 2a  e will quickly.*
36750 2a 20 66 69 6c 6c 20 75 70 2e 20 20 4f 6e 20 61  * fill up.  On a
36760 76 65 72 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 70 50  verage..**.** pP
36770 61 67 65 20 69 73 20 74 68 65 20 6c 65 61 66 20  age is the leaf 
36780 70 61 67 65 20 77 68 69 63 68 20 69 73 20 74 68  page which is th
36790 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 70 61 67  e right-most pag
367a0 65 20 69 6e 20 74 68 65 20 74 72 65 65 2e 0a 2a  e in the tree..*
367b0 2a 20 70 50 61 72 65 6e 74 20 69 73 20 69 74 73  * pParent is its
367c0 20 70 61 72 65 6e 74 2e 20 20 70 50 61 67 65 20   parent.  pPage 
367d0 6d 75 73 74 20 68 61 76 65 20 61 20 73 69 6e 67  must have a sing
367e0 6c 65 20 6f 76 65 72 66 6c 6f 77 20 65 6e 74 72  le overflow entr
367f0 79 0a 2a 2a 20 77 68 69 63 68 20 69 73 20 61 6c  y.** which is al
36800 73 6f 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73  so the right-mos
36810 74 20 65 6e 74 72 79 20 6f 6e 20 74 68 65 20 70  t entry on the p
36820 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  age..**.** The p
36830 53 70 61 63 65 20 62 75 66 66 65 72 20 69 73 20  Space buffer is 
36840 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20 61 20  used to store a 
36850 74 65 6d 70 6f 72 61 72 79 20 63 6f 70 79 20 6f  temporary copy o
36860 66 20 74 68 65 20 64 69 76 69 64 65 72 0a 2a 2a  f the divider.**
36870 20 63 65 6c 6c 20 74 68 61 74 20 77 69 6c 6c 20   cell that will 
36880 62 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f  be inserted into
36890 20 70 50 61 72 65 6e 74 2e 20 53 75 63 68 20 61   pParent. Such a
368a0 20 63 65 6c 6c 20 63 6f 6e 73 69 73 74 73 20 6f   cell consists o
368b0 66 20 61 20 34 0a 2a 2a 20 62 79 74 65 20 70 61  f a 4.** byte pa
368c0 67 65 20 6e 75 6d 62 65 72 20 66 6f 6c 6c 6f 77  ge number follow
368d0 65 64 20 62 79 20 61 20 76 61 72 69 61 62 6c 65  ed by a variable
368e0 20 6c 65 6e 67 74 68 20 69 6e 74 65 67 65 72 2e   length integer.
368f0 20 49 6e 20 6f 74 68 65 72 0a 2a 2a 20 77 6f 72   In other.** wor
36900 64 73 2c 20 61 74 20 6d 6f 73 74 20 31 33 20 62  ds, at most 13 b
36910 79 74 65 73 2e 20 48 65 6e 63 65 20 74 68 65 20  ytes. Hence the 
36920 70 53 70 61 63 65 20 62 75 66 66 65 72 20 6d 75  pSpace buffer mu
36930 73 74 20 62 65 20 61 74 0a 2a 2a 20 6c 65 61 73  st be at.** leas
36940 74 20 31 33 20 62 79 74 65 73 20 69 6e 20 73 69  t 13 bytes in si
36950 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ze..*/.static in
36960 74 20 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28  t balance_quick(
36970 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74  MemPage *pParent
36980 2c 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  , MemPage *pPage
36990 2c 20 75 38 20 2a 70 53 70 61 63 65 29 7b 0a 20  , u8 *pSpace){. 
369a0 20 42 74 53 68 61 72 65 64 20 2a 63 6f 6e 73 74   BtShared *const
369b0 20 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42   pBt = pPage->pB
369c0 74 3b 20 20 20 20 2f 2a 20 42 2d 54 72 65 65 20  t;    /* B-Tree 
369d0 44 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 4d 65  Database */.  Me
369e0 6d 50 61 67 65 20 2a 70 4e 65 77 3b 20 20 20 20  mPage *pNew;    
369f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36a00 20 20 20 2f 2a 20 4e 65 77 6c 79 20 61 6c 6c 6f     /* Newly allo
36a10 63 61 74 65 64 20 70 61 67 65 20 2a 2f 0a 20 20  cated page */.  
36a20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
36a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36a40 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 43       /* Return C
36a50 6f 64 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67  ode */.  Pgno pg
36a60 6e 6f 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20  noNew;          
36a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
36a80 20 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   Page number of 
36a90 70 4e 65 77 20 2a 2f 0a 0a 20 20 61 73 73 65 72  pNew */..  asser
36aa0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
36ab0 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
36ac0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
36ad0 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
36ae0 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
36af0 61 72 65 6e 74 2d 3e 70 44 62 50 61 67 65 29 20  arent->pDbPage) 
36b00 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
36b10 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 31  ge->nOverflow==1
36b20 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 65   );..  /* This e
36b30 72 72 6f 72 20 63 6f 6e 64 69 74 69 6f 6e 20 69  rror condition i
36b40 73 20 6e 6f 77 20 63 61 75 67 68 74 20 70 72 69  s now caught pri
36b50 6f 72 20 74 6f 20 72 65 61 63 68 69 6e 67 20 74  or to reaching t
36b60 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  his function */.
36b70 20 20 69 66 28 20 4e 45 56 45 52 28 70 50 61 67    if( NEVER(pPag
36b80 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 29 20 29 20 72  e->nCell==0) ) r
36b90 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
36ba0 52 55 50 54 5f 42 4b 50 54 3b 0a 0a 20 20 2f 2a  RUPT_BKPT;..  /*
36bb0 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   Allocate a new 
36bc0 70 61 67 65 2e 20 54 68 69 73 20 70 61 67 65 20  page. This page 
36bd0 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20  will become the 
36be0 72 69 67 68 74 2d 73 69 62 6c 69 6e 67 20 6f 66  right-sibling of
36bf0 20 0a 20 20 2a 2a 20 70 50 61 67 65 2e 20 4d 61   .  ** pPage. Ma
36c00 6b 65 20 74 68 65 20 70 61 72 65 6e 74 20 70 61  ke the parent pa
36c10 67 65 20 77 72 69 74 61 62 6c 65 2c 20 73 6f 20  ge writable, so 
36c20 74 68 61 74 20 74 68 65 20 6e 65 77 20 64 69 76  that the new div
36c30 69 64 65 72 20 63 65 6c 6c 0a 20 20 2a 2a 20 6d  ider cell.  ** m
36c40 61 79 20 62 65 20 69 6e 73 65 72 74 65 64 2e 20  ay be inserted. 
36c50 49 66 20 62 6f 74 68 20 74 68 65 73 65 20 6f 70  If both these op
36c60 65 72 61 74 69 6f 6e 73 20 61 72 65 20 73 75 63  erations are suc
36c70 63 65 73 73 66 75 6c 2c 20 70 72 6f 63 65 65 64  cessful, proceed
36c80 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 61 6c  ..  */.  rc = al
36c90 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28  locateBtreePage(
36ca0 70 42 74 2c 20 26 70 4e 65 77 2c 20 26 70 67 6e  pBt, &pNew, &pgn
36cb0 6f 4e 65 77 2c 20 30 2c 20 30 29 3b 0a 0a 20 20  oNew, 0, 0);..  
36cc0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
36cd0 4b 20 29 7b 0a 0a 20 20 20 20 75 38 20 2a 70 4f  K ){..    u8 *pO
36ce0 75 74 20 3d 20 26 70 53 70 61 63 65 5b 34 5d 3b  ut = &pSpace[4];
36cf0 0a 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d  .    u8 *pCell =
36d00 20 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c 5b 30   pPage->apOvfl[0
36d10 5d 3b 0a 20 20 20 20 75 31 36 20 73 7a 43 65 6c  ];.    u16 szCel
36d20 6c 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28  l = cellSizePtr(
36d30 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 3b 0a 20  pPage, pCell);. 
36d40 20 20 20 75 38 20 2a 70 53 74 6f 70 3b 0a 0a 20     u8 *pStop;.. 
36d50 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
36d60 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
36d70 6c 65 28 70 4e 65 77 2d 3e 70 44 62 50 61 67 65  le(pNew->pDbPage
36d80 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ) );.    assert(
36d90 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 30 5d   pPage->aData[0]
36da0 3d 3d 28 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54  ==(PTF_INTKEY|PT
36db0 46 5f 4c 45 41 46 44 41 54 41 7c 50 54 46 5f 4c  F_LEAFDATA|PTF_L
36dc0 45 41 46 29 20 29 3b 0a 20 20 20 20 7a 65 72 6f  EAF) );.    zero
36dd0 50 61 67 65 28 70 4e 65 77 2c 20 50 54 46 5f 49  Page(pNew, PTF_I
36de0 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46 44 41  NTKEY|PTF_LEAFDA
36df0 54 41 7c 50 54 46 5f 4c 45 41 46 29 3b 0a 20 20  TA|PTF_LEAF);.  
36e00 20 20 72 65 62 75 69 6c 64 50 61 67 65 28 70 4e    rebuildPage(pN
36e10 65 77 2c 20 31 2c 20 26 70 43 65 6c 6c 2c 20 26  ew, 1, &pCell, &
36e20 73 7a 43 65 6c 6c 29 3b 0a 20 20 20 20 70 4e 65  szCell);.    pNe
36e30 77 2d 3e 6e 46 72 65 65 20 3d 20 70 42 74 2d 3e  w->nFree = pBt->
36e40 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 70 4e 65  usableSize - pNe
36e50 77 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 2d 20  w->cellOffset - 
36e60 32 20 2d 20 73 7a 43 65 6c 6c 3b 0a 0a 20 20 20  2 - szCell;..   
36e70 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   /* If this is a
36e80 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61  n auto-vacuum da
36e90 74 61 62 61 73 65 2c 20 75 70 64 61 74 65 20 74  tabase, update t
36ea0 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 0a 20  he pointer map. 
36eb0 20 20 20 2a 2a 20 77 69 74 68 20 65 6e 74 72 69     ** with entri
36ec0 65 73 20 66 6f 72 20 74 68 65 20 6e 65 77 20 70  es for the new p
36ed0 61 67 65 2c 20 61 6e 64 20 61 6e 79 20 70 6f 69  age, and any poi
36ee0 6e 74 65 72 20 66 72 6f 6d 20 74 68 65 20 0a 20  nter from the . 
36ef0 20 20 20 2a 2a 20 63 65 6c 6c 20 6f 6e 20 74 68     ** cell on th
36f00 65 20 70 61 67 65 20 74 6f 20 61 6e 20 6f 76 65  e page to an ove
36f10 72 66 6c 6f 77 20 70 61 67 65 2e 20 49 66 20 65  rflow page. If e
36f20 69 74 68 65 72 20 6f 66 20 74 68 65 73 65 0a 20  ither of these. 
36f30 20 20 20 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 73     ** operations
36f40 20 66 61 69 6c 73 2c 20 74 68 65 20 72 65 74 75   fails, the retu
36f50 72 6e 20 63 6f 64 65 20 69 73 20 73 65 74 2c 20  rn code is set, 
36f60 62 75 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  but the contents
36f70 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 70  .    ** of the p
36f80 61 72 65 6e 74 20 70 61 67 65 20 61 72 65 20 73  arent page are s
36f90 74 69 6c 6c 20 6d 61 6e 69 70 75 6c 61 74 65 64  till manipulated
36fa0 20 62 79 20 74 68 68 20 63 6f 64 65 20 62 65 6c   by thh code bel
36fb0 6f 77 2e 0a 20 20 20 20 2a 2a 20 54 68 61 74 20  ow..    ** That 
36fc0 69 73 20 4f 6b 2c 20 61 74 20 74 68 69 73 20 70  is Ok, at this p
36fd0 6f 69 6e 74 20 74 68 65 20 70 61 72 65 6e 74 20  oint the parent 
36fe0 70 61 67 65 20 69 73 20 67 75 61 72 61 6e 74 65  page is guarante
36ff0 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 62 65 20  ed to.    ** be 
37000 6d 61 72 6b 65 64 20 61 73 20 64 69 72 74 79 2e  marked as dirty.
37010 20 52 65 74 75 72 6e 69 6e 67 20 61 6e 20 65 72   Returning an er
37020 72 6f 72 20 63 6f 64 65 20 77 69 6c 6c 20 63 61  ror code will ca
37030 75 73 65 20 61 0a 20 20 20 20 2a 2a 20 72 6f 6c  use a.    ** rol
37040 6c 62 61 63 6b 2c 20 75 6e 64 6f 69 6e 67 20 61  lback, undoing a
37050 6e 79 20 63 68 61 6e 67 65 73 20 6d 61 64 65 20  ny changes made 
37060 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20 70 61  to the parent pa
37070 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ge..    */.    i
37080 66 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20  f( ISAUTOVACUUM 
37090 29 7b 0a 20 20 20 20 20 20 70 74 72 6d 61 70 50  ){.      ptrmapP
370a0 75 74 28 70 42 74 2c 20 70 67 6e 6f 4e 65 77 2c  ut(pBt, pgnoNew,
370b0 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70   PTRMAP_BTREE, p
370c0 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 2c 20 26 72  Parent->pgno, &r
370d0 63 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 7a  c);.      if( sz
370e0 43 65 6c 6c 3e 70 4e 65 77 2d 3e 6d 69 6e 4c 6f  Cell>pNew->minLo
370f0 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 70  cal ){.        p
37100 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28  trmapPutOvflPtr(
37110 70 4e 65 77 2c 20 70 43 65 6c 6c 2c 20 26 72 63  pNew, pCell, &rc
37120 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
37130 0a 20 20 0a 20 20 20 20 2f 2a 20 43 72 65 61 74  .  .    /* Creat
37140 65 20 61 20 64 69 76 69 64 65 72 20 63 65 6c 6c  e a divider cell
37150 20 74 6f 20 69 6e 73 65 72 74 20 69 6e 74 6f 20   to insert into 
37160 70 50 61 72 65 6e 74 2e 20 54 68 65 20 64 69 76  pParent. The div
37170 69 64 65 72 20 63 65 6c 6c 0a 20 20 20 20 2a 2a  ider cell.    **
37180 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 34   consists of a 4
37190 2d 62 79 74 65 20 70 61 67 65 20 6e 75 6d 62 65  -byte page numbe
371a0 72 20 28 74 68 65 20 70 61 67 65 20 6e 75 6d 62  r (the page numb
371b0 65 72 20 6f 66 20 70 50 61 67 65 29 20 61 6e 64  er of pPage) and
371c0 0a 20 20 20 20 2a 2a 20 61 20 76 61 72 69 61 62  .    ** a variab
371d0 6c 65 20 6c 65 6e 67 74 68 20 6b 65 79 20 76 61  le length key va
371e0 6c 75 65 20 28 77 68 69 63 68 20 6d 75 73 74 20  lue (which must 
371f0 62 65 20 74 68 65 20 73 61 6d 65 20 76 61 6c 75  be the same valu
37200 65 20 61 73 20 74 68 65 0a 20 20 20 20 2a 2a 20  e as the.    ** 
37210 6c 61 72 67 65 73 74 20 6b 65 79 20 6f 6e 20 70  largest key on p
37220 50 61 67 65 29 2e 0a 20 20 20 20 2a 2a 0a 20 20  Page)..    **.  
37230 20 20 2a 2a 20 54 6f 20 66 69 6e 64 20 74 68 65    ** To find the
37240 20 6c 61 72 67 65 73 74 20 6b 65 79 20 76 61 6c   largest key val
37250 75 65 20 6f 6e 20 70 50 61 67 65 2c 20 66 69 72  ue on pPage, fir
37260 73 74 20 66 69 6e 64 20 74 68 65 20 72 69 67 68  st find the righ
37270 74 2d 6d 6f 73 74 20 0a 20 20 20 20 2a 2a 20 63  t-most .    ** c
37280 65 6c 6c 20 6f 6e 20 70 50 61 67 65 2e 20 54 68  ell on pPage. Th
37290 65 20 66 69 72 73 74 20 74 77 6f 20 66 69 65 6c  e first two fiel
372a0 64 73 20 6f 66 20 74 68 69 73 20 63 65 6c 6c 20  ds of this cell 
372b0 61 72 65 20 74 68 65 20 0a 20 20 20 20 2a 2a 20  are the .    ** 
372c0 72 65 63 6f 72 64 2d 6c 65 6e 67 74 68 20 28 61  record-length (a
372d0 20 76 61 72 69 61 62 6c 65 20 6c 65 6e 67 74 68   variable length
372e0 20 69 6e 74 65 67 65 72 20 61 74 20 6d 6f 73 74   integer at most
372f0 20 33 32 2d 62 69 74 73 20 69 6e 20 73 69 7a 65   32-bits in size
37300 29 0a 20 20 20 20 2a 2a 20 61 6e 64 20 74 68 65  ).    ** and the
37310 20 6b 65 79 20 76 61 6c 75 65 20 28 61 20 76 61   key value (a va
37320 72 69 61 62 6c 65 20 6c 65 6e 67 74 68 20 69 6e  riable length in
37330 74 65 67 65 72 2c 20 6d 61 79 20 68 61 76 65 20  teger, may have 
37340 61 6e 79 20 76 61 6c 75 65 29 2e 0a 20 20 20 20  any value)..    
37350 2a 2a 20 54 68 65 20 66 69 72 73 74 20 6f 66 20  ** The first of 
37360 74 68 65 20 77 68 69 6c 65 28 2e 2e 2e 29 20 6c  the while(...) l
37370 6f 6f 70 73 20 62 65 6c 6f 77 20 73 6b 69 70 73  oops below skips
37380 20 6f 76 65 72 20 74 68 65 20 72 65 63 6f 72 64   over the record
37390 2d 6c 65 6e 67 74 68 0a 20 20 20 20 2a 2a 20 66  -length.    ** f
373a0 69 65 6c 64 2e 20 54 68 65 20 73 65 63 6f 6e 64  ield. The second
373b0 20 77 68 69 6c 65 28 2e 2e 2e 29 20 6c 6f 6f 70   while(...) loop
373c0 20 63 6f 70 69 65 73 20 74 68 65 20 6b 65 79 20   copies the key 
373d0 76 61 6c 75 65 20 66 72 6f 6d 20 74 68 65 0a 20  value from the. 
373e0 20 20 20 2a 2a 20 63 65 6c 6c 20 6f 6e 20 70 50     ** cell on pP
373f0 61 67 65 20 69 6e 74 6f 20 74 68 65 20 70 53 70  age into the pSp
37400 61 63 65 20 62 75 66 66 65 72 2e 0a 20 20 20 20  ace buffer..    
37410 2a 2f 0a 20 20 20 20 70 43 65 6c 6c 20 3d 20 66  */.    pCell = f
37420 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 70  indCell(pPage, p
37430 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 29 3b 0a  Page->nCell-1);.
37440 20 20 20 20 70 53 74 6f 70 20 3d 20 26 70 43 65      pStop = &pCe
37450 6c 6c 5b 39 5d 3b 0a 20 20 20 20 77 68 69 6c 65  ll[9];.    while
37460 28 20 28 2a 28 70 43 65 6c 6c 2b 2b 29 26 30 78  ( (*(pCell++)&0x
37470 38 30 29 20 26 26 20 70 43 65 6c 6c 3c 70 53 74  80) && pCell<pSt
37480 6f 70 20 29 3b 0a 20 20 20 20 70 53 74 6f 70 20  op );.    pStop 
37490 3d 20 26 70 43 65 6c 6c 5b 39 5d 3b 0a 20 20 20  = &pCell[9];.   
374a0 20 77 68 69 6c 65 28 20 28 28 2a 28 70 4f 75 74   while( ((*(pOut
374b0 2b 2b 29 20 3d 20 2a 28 70 43 65 6c 6c 2b 2b 29  ++) = *(pCell++)
374c0 29 26 30 78 38 30 29 20 26 26 20 70 43 65 6c 6c  )&0x80) && pCell
374d0 3c 70 53 74 6f 70 20 29 3b 0a 0a 20 20 20 20 2f  <pStop );..    /
374e0 2a 20 49 6e 73 65 72 74 20 74 68 65 20 6e 65 77  * Insert the new
374f0 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20 69 6e   divider cell in
37500 74 6f 20 70 50 61 72 65 6e 74 2e 20 2a 2f 0a 20  to pParent. */. 
37510 20 20 20 69 6e 73 65 72 74 43 65 6c 6c 28 70 50     insertCell(pP
37520 61 72 65 6e 74 2c 20 70 50 61 72 65 6e 74 2d 3e  arent, pParent->
37530 6e 43 65 6c 6c 2c 20 70 53 70 61 63 65 2c 20 28  nCell, pSpace, (
37540 69 6e 74 29 28 70 4f 75 74 2d 70 53 70 61 63 65  int)(pOut-pSpace
37550 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
37560 20 20 30 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f    0, pPage->pgno
37570 2c 20 26 72 63 29 3b 0a 0a 20 20 20 20 2f 2a 20  , &rc);..    /* 
37580 53 65 74 20 74 68 65 20 72 69 67 68 74 2d 63 68  Set the right-ch
37590 69 6c 64 20 70 6f 69 6e 74 65 72 20 6f 66 20 70  ild pointer of p
375a0 50 61 72 65 6e 74 20 74 6f 20 70 6f 69 6e 74 20  Parent to point 
375b0 74 6f 20 74 68 65 20 6e 65 77 20 70 61 67 65 2e  to the new page.
375c0 20 2a 2f 0a 20 20 20 20 70 75 74 34 62 79 74 65   */.    put4byte
375d0 28 26 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61  (&pParent->aData
375e0 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66  [pParent->hdrOff
375f0 73 65 74 2b 38 5d 2c 20 70 67 6e 6f 4e 65 77 29  set+8], pgnoNew)
37600 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 52 65 6c 65  ;.  .    /* Rele
37610 61 73 65 20 74 68 65 20 72 65 66 65 72 65 6e 63  ase the referenc
37620 65 20 74 6f 20 74 68 65 20 6e 65 77 20 70 61 67  e to the new pag
37630 65 2e 20 2a 2f 0a 20 20 20 20 72 65 6c 65 61 73  e. */.    releas
37640 65 50 61 67 65 28 70 4e 65 77 29 3b 0a 20 20 7d  ePage(pNew);.  }
37650 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
37660 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
37670 45 5f 4f 4d 49 54 5f 51 55 49 43 4b 42 41 4c 41  E_OMIT_QUICKBALA
37680 4e 43 45 20 2a 2f 0a 0a 23 69 66 20 30 0a 2f 2a  NCE */..#if 0./*
37690 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
376a0 6e 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 72  n does not contr
376b0 69 62 75 74 65 20 61 6e 79 74 68 69 6e 67 20 74  ibute anything t
376c0 6f 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20  o the operation 
376d0 6f 66 20 53 51 4c 69 74 65 2e 0a 2a 2a 20 69 74  of SQLite..** it
376e0 20 69 73 20 73 6f 6d 65 74 69 6d 65 73 20 61 63   is sometimes ac
376f0 74 69 76 61 74 65 64 20 74 65 6d 70 6f 72 61 72  tivated temporar
37700 69 6c 79 20 77 68 69 6c 65 20 64 65 62 75 67 67  ily while debugg
37710 69 6e 67 20 63 6f 64 65 20 72 65 73 70 6f 6e 73  ing code respons
37720 69 62 6c 65 20 0a 2a 2a 20 66 6f 72 20 73 65 74  ible .** for set
37730 74 69 6e 67 20 70 6f 69 6e 74 65 72 2d 6d 61 70  ting pointer-map
37740 20 65 6e 74 72 69 65 73 2e 0a 2a 2f 0a 73 74 61   entries..*/.sta
37750 74 69 63 20 69 6e 74 20 70 74 72 6d 61 70 43 68  tic int ptrmapCh
37760 65 63 6b 50 61 67 65 73 28 4d 65 6d 50 61 67 65  eckPages(MemPage
37770 20 2a 2a 61 70 50 61 67 65 2c 20 69 6e 74 20 6e   **apPage, int n
37780 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 69 2c 20  Page){.  int i, 
37790 6a 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  j;.  for(i=0; i<
377a0 6e 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20  nPage; i++){.   
377b0 20 50 67 6e 6f 20 6e 3b 0a 20 20 20 20 75 38 20   Pgno n;.    u8 
377c0 65 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  e;.    MemPage *
377d0 70 50 61 67 65 20 3d 20 61 70 50 61 67 65 5b 69  pPage = apPage[i
377e0 5d 3b 0a 20 20 20 20 42 74 53 68 61 72 65 64 20  ];.    BtShared 
377f0 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42  *pBt = pPage->pB
37800 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  t;.    assert( p
37810 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a  Page->isInit );.
37820 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c  .    for(j=0; j<
37830 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20 6a 2b  pPage->nCell; j+
37840 2b 29 7b 0a 20 20 20 20 20 20 43 65 6c 6c 49 6e  +){.      CellIn
37850 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 20 20 75  fo info;.      u
37860 38 20 2a 7a 3b 0a 20 20 20 20 20 0a 20 20 20 20  8 *z;.     .    
37870 20 20 7a 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70    z = findCell(p
37880 50 61 67 65 2c 20 6a 29 3b 0a 20 20 20 20 20 20  Page, j);.      
37890 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  btreeParseCellPt
378a0 72 28 70 50 61 67 65 2c 20 7a 2c 20 26 69 6e 66  r(pPage, z, &inf
378b0 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 6e  o);.      if( in
378c0 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 20 29 7b 0a  fo.iOverflow ){.
378d0 20 20 20 20 20 20 20 20 50 67 6e 6f 20 6f 76 66          Pgno ovf
378e0 6c 20 3d 20 67 65 74 34 62 79 74 65 28 26 7a 5b  l = get4byte(&z[
378f0 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29  info.iOverflow])
37900 3b 0a 20 20 20 20 20 20 20 20 70 74 72 6d 61 70  ;.        ptrmap
37910 47 65 74 28 70 42 74 2c 20 6f 76 66 6c 2c 20 26  Get(pBt, ovfl, &
37920 65 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20 20 20  e, &n);.        
37930 61 73 73 65 72 74 28 20 6e 3d 3d 70 50 61 67 65  assert( n==pPage
37940 2d 3e 70 67 6e 6f 20 26 26 20 65 3d 3d 50 54 52  ->pgno && e==PTR
37950 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 20 29 3b  MAP_OVERFLOW1 );
37960 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
37970 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  f( !pPage->leaf 
37980 29 7b 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20  ){.        Pgno 
37990 63 68 69 6c 64 20 3d 20 67 65 74 34 62 79 74 65  child = get4byte
379a0 28 7a 29 3b 0a 20 20 20 20 20 20 20 20 70 74 72  (z);.        ptr
379b0 6d 61 70 47 65 74 28 70 42 74 2c 20 63 68 69 6c  mapGet(pBt, chil
379c0 64 2c 20 26 65 2c 20 26 6e 29 3b 0a 20 20 20 20  d, &e, &n);.    
379d0 20 20 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 70      assert( n==p
379e0 50 61 67 65 2d 3e 70 67 6e 6f 20 26 26 20 65 3d  Page->pgno && e=
379f0 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20 29 3b  =PTRMAP_BTREE );
37a00 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
37a10 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c     if( !pPage->l
37a20 65 61 66 20 29 7b 0a 20 20 20 20 20 20 50 67 6e  eaf ){.      Pgn
37a30 6f 20 63 68 69 6c 64 20 3d 20 67 65 74 34 62 79  o child = get4by
37a40 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61  te(&pPage->aData
37a50 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
37a60 74 2b 38 5d 29 3b 0a 20 20 20 20 20 20 70 74 72  t+8]);.      ptr
37a70 6d 61 70 47 65 74 28 70 42 74 2c 20 63 68 69 6c  mapGet(pBt, chil
37a80 64 2c 20 26 65 2c 20 26 6e 29 3b 0a 20 20 20 20  d, &e, &n);.    
37a90 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 70 50 61    assert( n==pPa
37aa0 67 65 2d 3e 70 67 6e 6f 20 26 26 20 65 3d 3d 50  ge->pgno && e==P
37ab0 54 52 4d 41 50 5f 42 54 52 45 45 20 29 3b 0a 20  TRMAP_BTREE );. 
37ac0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
37ad0 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  n 1;.}.#endif../
37ae0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
37af0 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 63 6f  on is used to co
37b00 70 79 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  py the contents 
37b10 6f 66 20 74 68 65 20 62 2d 74 72 65 65 20 6e 6f  of the b-tree no
37b20 64 65 20 73 74 6f 72 65 64 20 0a 2a 2a 20 6f 6e  de stored .** on
37b30 20 70 61 67 65 20 70 46 72 6f 6d 20 74 6f 20 70   page pFrom to p
37b40 61 67 65 20 70 54 6f 2e 20 49 66 20 70 61 67 65  age pTo. If page
37b50 20 70 46 72 6f 6d 20 77 61 73 20 6e 6f 74 20 61   pFrom was not a
37b60 20 6c 65 61 66 20 70 61 67 65 2c 20 74 68 65 6e   leaf page, then
37b70 0a 2a 2a 20 74 68 65 20 70 6f 69 6e 74 65 72 2d  .** the pointer-
37b80 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20  map entries for 
37b90 65 61 63 68 20 63 68 69 6c 64 20 70 61 67 65 20  each child page 
37ba0 61 72 65 20 75 70 64 61 74 65 64 20 73 6f 20 74  are updated so t
37bb0 68 61 74 20 74 68 65 0a 2a 2a 20 70 61 72 65 6e  hat the.** paren
37bc0 74 20 70 61 67 65 20 73 74 6f 72 65 64 20 69 6e  t page stored in
37bd0 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   the pointer map
37be0 20 69 73 20 70 61 67 65 20 70 54 6f 2e 20 49 66   is page pTo. If
37bf0 20 70 46 72 6f 6d 20 63 6f 6e 74 61 69 6e 65 64   pFrom contained
37c00 0a 2a 2a 20 61 6e 79 20 63 65 6c 6c 73 20 77 69  .** any cells wi
37c10 74 68 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  th overflow page
37c20 20 70 6f 69 6e 74 65 72 73 2c 20 74 68 65 6e 20   pointers, then 
37c30 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
37c40 67 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 6d 61 70  g pointer.** map
37c50 20 65 6e 74 72 69 65 73 20 61 72 65 20 61 6c 73   entries are als
37c60 6f 20 75 70 64 61 74 65 64 20 73 6f 20 74 68 61  o updated so tha
37c70 74 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67  t the parent pag
37c80 65 20 69 73 20 70 61 67 65 20 70 54 6f 2e 0a 2a  e is page pTo..*
37c90 2a 0a 2a 2a 20 49 66 20 70 46 72 6f 6d 20 69 73  *.** If pFrom is
37ca0 20 63 75 72 72 65 6e 74 6c 79 20 63 61 72 72 79   currently carry
37cb0 69 6e 67 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77  ing any overflow
37cc0 20 63 65 6c 6c 73 20 28 65 6e 74 72 69 65 73 20   cells (entries 
37cd0 69 6e 20 74 68 65 0a 2a 2a 20 4d 65 6d 50 61 67  in the.** MemPag
37ce0 65 2e 61 70 4f 76 66 6c 5b 5d 20 61 72 72 61 79  e.apOvfl[] array
37cf0 29 2c 20 74 68 65 79 20 61 72 65 20 6e 6f 74 20  ), they are not 
37d00 63 6f 70 69 65 64 20 74 6f 20 70 54 6f 2e 20 0a  copied to pTo. .
37d10 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65 20 72 65 74  **.** Before ret
37d20 75 72 6e 69 6e 67 2c 20 70 61 67 65 20 70 54 6f  urning, page pTo
37d30 20 69 73 20 72 65 69 6e 69 74 69 61 6c 69 7a 65   is reinitialize
37d40 64 20 75 73 69 6e 67 20 62 74 72 65 65 49 6e 69  d using btreeIni
37d50 74 50 61 67 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 54  tPage()..**.** T
37d60 68 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 6f  he performance o
37d70 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  f this function 
37d80 69 73 20 6e 6f 74 20 63 72 69 74 69 63 61 6c 2e  is not critical.
37d90 20 49 74 20 69 73 20 6f 6e 6c 79 20 75 73 65 64   It is only used
37da0 20 62 79 20 0a 2a 2a 20 74 68 65 20 62 61 6c 61   by .** the bala
37db0 6e 63 65 5f 73 68 61 6c 6c 6f 77 65 72 28 29 20  nce_shallower() 
37dc0 61 6e 64 20 62 61 6c 61 6e 63 65 5f 64 65 65 70  and balance_deep
37dd0 65 72 28 29 20 70 72 6f 63 65 64 75 72 65 73 2c  er() procedures,
37de0 20 6e 65 69 74 68 65 72 20 6f 66 0a 2a 2a 20 77   neither of.** w
37df0 68 69 63 68 20 61 72 65 20 63 61 6c 6c 65 64 20  hich are called 
37e00 6f 66 74 65 6e 20 75 6e 64 65 72 20 6e 6f 72 6d  often under norm
37e10 61 6c 20 63 69 72 63 75 6d 73 74 61 6e 63 65 73  al circumstances
37e20 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
37e30 20 63 6f 70 79 4e 6f 64 65 43 6f 6e 74 65 6e 74   copyNodeContent
37e40 28 4d 65 6d 50 61 67 65 20 2a 70 46 72 6f 6d 2c  (MemPage *pFrom,
37e50 20 4d 65 6d 50 61 67 65 20 2a 70 54 6f 2c 20 69   MemPage *pTo, i
37e60 6e 74 20 2a 70 52 43 29 7b 0a 20 20 69 66 28 20  nt *pRC){.  if( 
37e70 28 2a 70 52 43 29 3d 3d 53 51 4c 49 54 45 5f 4f  (*pRC)==SQLITE_O
37e80 4b 20 29 7b 0a 20 20 20 20 42 74 53 68 61 72 65  K ){.    BtShare
37e90 64 20 2a 20 63 6f 6e 73 74 20 70 42 74 20 3d 20  d * const pBt = 
37ea0 70 46 72 6f 6d 2d 3e 70 42 74 3b 0a 20 20 20 20  pFrom->pBt;.    
37eb0 75 38 20 2a 20 63 6f 6e 73 74 20 61 46 72 6f 6d  u8 * const aFrom
37ec0 20 3d 20 70 46 72 6f 6d 2d 3e 61 44 61 74 61 3b   = pFrom->aData;
37ed0 0a 20 20 20 20 75 38 20 2a 20 63 6f 6e 73 74 20  .    u8 * const 
37ee0 61 54 6f 20 3d 20 70 54 6f 2d 3e 61 44 61 74 61  aTo = pTo->aData
37ef0 3b 0a 20 20 20 20 69 6e 74 20 63 6f 6e 73 74 20  ;.    int const 
37f00 69 46 72 6f 6d 48 64 72 20 3d 20 70 46 72 6f 6d  iFromHdr = pFrom
37f10 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 20  ->hdrOffset;.   
37f20 20 69 6e 74 20 63 6f 6e 73 74 20 69 54 6f 48 64   int const iToHd
37f30 72 20 3d 20 28 28 70 54 6f 2d 3e 70 67 6e 6f 3d  r = ((pTo->pgno=
37f40 3d 31 29 20 3f 20 31 30 30 20 3a 20 30 29 3b 0a  =1) ? 100 : 0);.
37f50 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20      int rc;.    
37f60 69 6e 74 20 69 44 61 74 61 3b 0a 20 20 0a 20 20  int iData;.  .  
37f70 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72  .    assert( pFr
37f80 6f 6d 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20  om->isInit );.  
37f90 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d    assert( pFrom-
37fa0 3e 6e 46 72 65 65 3e 3d 69 54 6f 48 64 72 20 29  >nFree>=iToHdr )
37fb0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 67 65  ;.    assert( ge
37fc0 74 32 62 79 74 65 28 26 61 46 72 6f 6d 5b 69 46  t2byte(&aFrom[iF
37fd0 72 6f 6d 48 64 72 2b 35 5d 29 20 3c 3d 20 28 69  romHdr+5]) <= (i
37fe0 6e 74 29 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  nt)pBt->usableSi
37ff0 7a 65 20 29 3b 0a 20 20 0a 20 20 20 20 2f 2a 20  ze );.  .    /* 
38000 43 6f 70 79 20 74 68 65 20 62 2d 74 72 65 65 20  Copy the b-tree 
38010 6e 6f 64 65 20 63 6f 6e 74 65 6e 74 20 66 72 6f  node content fro
38020 6d 20 70 61 67 65 20 70 46 72 6f 6d 20 74 6f 20  m page pFrom to 
38030 70 61 67 65 20 70 54 6f 2e 20 2a 2f 0a 20 20 20  page pTo. */.   
38040 20 69 44 61 74 61 20 3d 20 67 65 74 32 62 79 74   iData = get2byt
38050 65 28 26 61 46 72 6f 6d 5b 69 46 72 6f 6d 48 64  e(&aFrom[iFromHd
38060 72 2b 35 5d 29 3b 0a 20 20 20 20 6d 65 6d 63 70  r+5]);.    memcp
38070 79 28 26 61 54 6f 5b 69 44 61 74 61 5d 2c 20 26  y(&aTo[iData], &
38080 61 46 72 6f 6d 5b 69 44 61 74 61 5d 2c 20 70 42  aFrom[iData], pB
38090 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 69 44  t->usableSize-iD
380a0 61 74 61 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  ata);.    memcpy
380b0 28 26 61 54 6f 5b 69 54 6f 48 64 72 5d 2c 20 26  (&aTo[iToHdr], &
380c0 61 46 72 6f 6d 5b 69 46 72 6f 6d 48 64 72 5d 2c  aFrom[iFromHdr],
380d0 20 70 46 72 6f 6d 2d 3e 63 65 6c 6c 4f 66 66 73   pFrom->cellOffs
380e0 65 74 20 2b 20 32 2a 70 46 72 6f 6d 2d 3e 6e 43  et + 2*pFrom->nC
380f0 65 6c 6c 29 3b 0a 20 20 0a 20 20 20 20 2f 2a 20  ell);.  .    /* 
38100 52 65 69 6e 69 74 69 61 6c 69 7a 65 20 70 61 67  Reinitialize pag
38110 65 20 70 54 6f 20 73 6f 20 74 68 61 74 20 74 68  e pTo so that th
38120 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
38130 65 20 4d 65 6d 50 61 67 65 20 73 74 72 75 63 74  e MemPage struct
38140 75 72 65 0a 20 20 20 20 2a 2a 20 6d 61 74 63 68  ure.    ** match
38150 20 74 68 65 20 6e 65 77 20 64 61 74 61 2e 20 54   the new data. T
38160 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f  he initializatio
38170 6e 20 6f 66 20 70 54 6f 20 63 61 6e 20 61 63 74  n of pTo can act
38180 75 61 6c 6c 79 20 66 61 69 6c 20 75 6e 64 65 72  ually fail under
38190 0a 20 20 20 20 2a 2a 20 66 61 69 72 6c 79 20 6f  .    ** fairly o
381a0 62 73 63 75 72 65 20 63 69 72 63 75 6d 73 74 61  bscure circumsta
381b0 6e 63 65 73 2c 20 65 76 65 6e 20 74 68 6f 75 67  nces, even thoug
381c0 68 20 69 74 20 69 73 20 61 20 63 6f 70 79 20 6f  h it is a copy o
381d0 66 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 0a 20  f initialized . 
381e0 20 20 20 2a 2a 20 70 61 67 65 20 70 46 72 6f 6d     ** page pFrom
381f0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 54 6f  ..    */.    pTo
38200 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20  ->isInit = 0;.  
38210 20 20 72 63 20 3d 20 62 74 72 65 65 49 6e 69 74    rc = btreeInit
38220 50 61 67 65 28 70 54 6f 29 3b 0a 20 20 20 20 69  Page(pTo);.    i
38230 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
38240 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 43 20 3d   ){.      *pRC =
38250 20 72 63 3b 0a 20 20 20 20 20 20 72 65 74 75 72   rc;.      retur
38260 6e 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20  n;.    }.  .    
38270 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e  /* If this is an
38280 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74   auto-vacuum dat
38290 61 62 61 73 65 2c 20 75 70 64 61 74 65 20 74 68  abase, update th
382a0 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e  e pointer-map en
382b0 74 72 69 65 73 0a 20 20 20 20 2a 2a 20 66 6f 72  tries.    ** for
382c0 20 61 6e 79 20 62 2d 74 72 65 65 20 6f 72 20 6f   any b-tree or o
382d0 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 74 68  verflow pages th
382e0 61 74 20 70 54 6f 20 6e 6f 77 20 63 6f 6e 74 61  at pTo now conta
382f0 69 6e 73 20 74 68 65 20 70 6f 69 6e 74 65 72 73  ins the pointers
38300 20 74 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20   to..    */.    
38310 69 66 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d  if( ISAUTOVACUUM
38320 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 43 20 3d   ){.      *pRC =
38330 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70 73   setChildPtrmaps
38340 28 70 54 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  (pTo);.    }.  }
38350 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
38360 6f 75 74 69 6e 65 20 72 65 64 69 73 74 72 69 62  outine redistrib
38370 75 74 65 73 20 63 65 6c 6c 73 20 6f 6e 20 74 68  utes cells on th
38380 65 20 69 50 61 72 65 6e 74 49 64 78 27 74 68 20  e iParentIdx'th 
38390 63 68 69 6c 64 20 6f 66 20 70 50 61 72 65 6e 74  child of pParent
383a0 0a 2a 2a 20 28 68 65 72 65 61 66 74 65 72 20 22  .** (hereafter "
383b0 74 68 65 20 70 61 67 65 22 29 20 61 6e 64 20 75  the page") and u
383c0 70 20 74 6f 20 32 20 73 69 62 6c 69 6e 67 73 20  p to 2 siblings 
383d0 73 6f 20 74 68 61 74 20 61 6c 6c 20 70 61 67 65  so that all page
383e0 73 20 68 61 76 65 20 61 62 6f 75 74 20 74 68 65  s have about the
383f0 0a 2a 2a 20 73 61 6d 65 20 61 6d 6f 75 6e 74 20  .** same amount 
38400 6f 66 20 66 72 65 65 20 73 70 61 63 65 2e 20 55  of free space. U
38410 73 75 61 6c 6c 79 20 61 20 73 69 6e 67 6c 65 20  sually a single 
38420 73 69 62 6c 69 6e 67 20 6f 6e 20 65 69 74 68 65  sibling on eithe
38430 72 20 73 69 64 65 20 6f 66 20 74 68 65 0a 2a 2a  r side of the.**
38440 20 70 61 67 65 20 61 72 65 20 75 73 65 64 20 69   page are used i
38450 6e 20 74 68 65 20 62 61 6c 61 6e 63 69 6e 67 2c  n the balancing,
38460 20 74 68 6f 75 67 68 20 62 6f 74 68 20 73 69 62   though both sib
38470 6c 69 6e 67 73 20 6d 69 67 68 74 20 63 6f 6d 65  lings might com