/ Hex Artifact Content
Login

Artifact 148cbc4387f30f8082a32d0f7a07ea602db80945:


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 70 63 20 3c 20   }else if( pc < 
aa20: 70 50 67 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 2b  pPg->cellOffset+
aa30: 32 2a 70 50 67 2d 3e 6e 43 65 6c 6c 20 7c 7c 20  2*pPg->nCell || 
aa40: 73 69 7a 65 2b 70 63 20 3e 20 75 73 61 62 6c 65  size+pc > usable
aa50: 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Size ){.        
aa60: 2a 70 52 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f  *pRc = SQLITE_CO
aa70: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
aa80: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
aa90: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
aaa0: 20 20 20 2f 2a 20 54 68 65 20 73 6c 6f 74 20 72     /* The slot r
aab0: 65 6d 61 69 6e 73 20 6f 6e 20 74 68 65 20 66 72  emains on the fr
aac0: 65 65 2d 6c 69 73 74 2e 20 52 65 64 75 63 65 20  ee-list. Reduce 
aad0: 69 74 73 20 73 69 7a 65 20 74 6f 20 61 63 63 6f  its size to acco
aae0: 75 6e 74 0a 20 20 20 20 20 20 20 20 20 2a 2a 20  unt.         ** 
aaf0: 66 6f 72 20 74 68 65 20 70 6f 72 74 69 6f 6e 20  for the portion 
ab00: 75 73 65 64 20 62 79 20 74 68 65 20 6e 65 77 20  used by the new 
ab10: 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 2a 2f 0a 20  allocation. */. 
ab20: 20 20 20 20 20 20 20 70 75 74 32 62 79 74 65 28         put2byte(
ab30: 26 61 44 61 74 61 5b 70 63 2b 32 5d 2c 20 78 29  &aData[pc+2], x)
ab40: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
ab50: 72 65 74 75 72 6e 20 26 61 44 61 74 61 5b 70 63  return &aData[pc
ab60: 20 2b 20 78 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d   + x];.    }.  }
ab70: 0a 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ..  return 0;.}.
ab80: 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
ab90: 6e 42 79 74 65 20 62 79 74 65 73 20 6f 66 20 73  nByte bytes of s
aba0: 70 61 63 65 20 66 72 6f 6d 20 77 69 74 68 69 6e  pace from within
abb0: 20 74 68 65 20 42 2d 54 72 65 65 20 70 61 67 65   the B-Tree page
abc0: 20 70 61 73 73 65 64 0a 2a 2a 20 61 73 20 74 68   passed.** as th
abd0: 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
abe0: 2e 20 57 72 69 74 65 20 69 6e 74 6f 20 2a 70 49  . Write into *pI
abf0: 64 78 20 74 68 65 20 69 6e 64 65 78 20 69 6e 74  dx the index int
ac00: 6f 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 5d  o pPage->aData[]
ac10: 0a 2a 2a 20 6f 66 20 74 68 65 20 66 69 72 73 74  .** of the first
ac20: 20 62 79 74 65 20 6f 66 20 61 6c 6c 6f 63 61 74   byte of allocat
ac30: 65 64 20 73 70 61 63 65 2e 20 52 65 74 75 72 6e  ed space. Return
ac40: 20 65 69 74 68 65 72 20 53 51 4c 49 54 45 5f 4f   either SQLITE_O
ac50: 4b 20 6f 72 0a 2a 2a 20 61 6e 20 65 72 72 6f 72  K or.** an error
ac60: 20 63 6f 64 65 20 28 75 73 75 61 6c 6c 79 20 53   code (usually S
ac70: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 29 2e 0a  QLITE_CORRUPT)..
ac80: 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72  **.** The caller
ac90: 20 67 75 61 72 61 6e 74 65 65 73 20 74 68 61 74   guarantees that
aca0: 20 74 68 65 72 65 20 69 73 20 73 75 66 66 69 63   there is suffic
acb0: 69 65 6e 74 20 73 70 61 63 65 20 74 6f 20 6d 61  ient space to ma
acc0: 6b 65 20 74 68 65 0a 2a 2a 20 61 6c 6c 6f 63 61  ke the.** alloca
acd0: 74 69 6f 6e 2e 20 20 54 68 69 73 20 72 6f 75 74  tion.  This rout
ace0: 69 6e 65 20 6d 69 67 68 74 20 6e 65 65 64 20 74  ine might need t
acf0: 6f 20 64 65 66 72 61 67 6d 65 6e 74 20 69 6e 20  o defragment in 
ad00: 6f 72 64 65 72 20 74 6f 20 62 72 69 6e 67 0a 2a  order to bring.*
ad10: 2a 20 61 6c 6c 20 74 68 65 20 73 70 61 63 65 20  * all the space 
ad20: 74 6f 67 65 74 68 65 72 2c 20 68 6f 77 65 76 65  together, howeve
ad30: 72 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  r.  This routine
ad40: 20 77 69 6c 6c 20 61 76 6f 69 64 20 75 73 69 6e   will avoid usin
ad50: 67 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 74  g.** the first t
ad60: 77 6f 20 62 79 74 65 73 20 70 61 73 74 20 74 68  wo bytes past th
ad70: 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61  e cell pointer a
ad80: 72 65 61 20 73 69 6e 63 65 20 70 72 65 73 75 6d  rea since presum
ad90: 61 62 6c 79 20 74 68 69 73 0a 2a 2a 20 61 6c 6c  ably this.** all
ada0: 6f 63 61 74 69 6f 6e 20 69 73 20 62 65 69 6e 67  ocation is being
adb0: 20 6d 61 64 65 20 69 6e 20 6f 72 64 65 72 20 74   made in order t
adc0: 6f 20 69 6e 73 65 72 74 20 61 20 6e 65 77 20 63  o insert a new c
add0: 65 6c 6c 2c 20 73 6f 20 77 65 20 77 69 6c 6c 0a  ell, so we will.
ade0: 2a 2a 20 61 6c 73 6f 20 65 6e 64 20 75 70 20 6e  ** also end up n
adf0: 65 65 64 69 6e 67 20 61 20 6e 65 77 20 63 65 6c  eeding a new cel
ae00: 6c 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74  l pointer..*/.st
ae10: 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74  atic int allocat
ae20: 65 53 70 61 63 65 28 4d 65 6d 50 61 67 65 20 2a  eSpace(MemPage *
ae30: 70 50 61 67 65 2c 20 69 6e 74 20 6e 42 79 74 65  pPage, int nByte
ae40: 2c 20 69 6e 74 20 2a 70 49 64 78 29 7b 0a 20 20  , int *pIdx){.  
ae50: 63 6f 6e 73 74 20 69 6e 74 20 68 64 72 20 3d 20  const int hdr = 
ae60: 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
ae70: 3b 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63 61  ;    /* Local ca
ae80: 63 68 65 20 6f 66 20 70 50 61 67 65 2d 3e 68 64  che of pPage->hd
ae90: 72 4f 66 66 73 65 74 20 2a 2f 0a 20 20 75 38 20  rOffset */.  u8 
aea0: 2a 20 63 6f 6e 73 74 20 64 61 74 61 20 3d 20 70  * const data = p
aeb0: 50 61 67 65 2d 3e 61 44 61 74 61 3b 20 20 20 20  Page->aData;    
aec0: 20 20 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65    /* Local cache
aed0: 20 6f 66 20 70 50 61 67 65 2d 3e 61 44 61 74 61   of pPage->aData
aee0: 20 2a 2f 0a 20 20 69 6e 74 20 74 6f 70 3b 20 20   */.  int top;  
aef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
af00: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
af10: 72 73 74 20 62 79 74 65 20 6f 66 20 63 65 6c 6c  rst byte of cell
af20: 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f   content area */
af30: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
af40: 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
af50: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 74 65 67          /* Integ
af60: 65 72 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a  er return code *
af70: 2f 0a 20 20 69 6e 74 20 67 61 70 3b 20 20 20 20  /.  int gap;    
af80: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74      /* First byt
af90: 65 20 6f 66 20 67 61 70 20 62 65 74 77 65 65 6e  e of gap between
afa0: 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 73 20 61   cell pointers a
afb0: 6e 64 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  nd cell content 
afc0: 2a 2f 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20  */.  .  assert( 
afd0: 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
afe0: 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70  iteable(pPage->p
aff0: 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73  DbPage) );.  ass
b000: 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 20  ert( pPage->pBt 
b010: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
b020: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
b030: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
b040: 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
b050: 6e 42 79 74 65 3e 3d 30 20 29 3b 20 20 2f 2a 20  nByte>=0 );  /* 
b060: 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c 20 73 69 7a  Minimum cell siz
b070: 65 20 69 73 20 34 20 2a 2f 0a 20 20 61 73 73 65  e is 4 */.  asse
b080: 72 74 28 20 70 50 61 67 65 2d 3e 6e 46 72 65 65  rt( pPage->nFree
b090: 3e 3d 6e 42 79 74 65 20 29 3b 0a 20 20 61 73 73  >=nByte );.  ass
b0a0: 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65  ert( pPage->nOve
b0b0: 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20 61 73  rflow==0 );.  as
b0c0: 73 65 72 74 28 20 6e 42 79 74 65 20 3c 20 28 69  sert( nByte < (i
b0d0: 6e 74 29 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  nt)(pPage->pBt->
b0e0: 75 73 61 62 6c 65 53 69 7a 65 2d 38 29 20 29 3b  usableSize-8) );
b0f0: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
b100: 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 3d 3d  e->cellOffset ==
b110: 20 68 64 72 20 2b 20 31 32 20 2d 20 34 2a 70 50   hdr + 12 - 4*pP
b120: 61 67 65 2d 3e 6c 65 61 66 20 29 3b 0a 20 20 67  age->leaf );.  g
b130: 61 70 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c  ap = pPage->cell
b140: 4f 66 66 73 65 74 20 2b 20 32 2a 70 50 61 67 65  Offset + 2*pPage
b150: 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72  ->nCell;.  asser
b160: 74 28 20 67 61 70 3c 3d 36 35 35 33 36 20 29 3b  t( gap<=65536 );
b170: 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f  .  /* EVIDENCE-O
b180: 46 3a 20 52 2d 32 39 33 35 36 2d 30 32 33 39 31  F: R-29356-02391
b190: 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
b1a0: 20 75 73 65 73 20 61 20 36 35 35 33 36 2d 62 79   uses a 65536-by
b1b0: 74 65 20 70 61 67 65 20 73 69 7a 65 0a 20 20 2a  te page size.  *
b1c0: 2a 20 61 6e 64 20 74 68 65 20 72 65 73 65 72 76  * and the reserv
b1d0: 65 64 20 73 70 61 63 65 20 69 73 20 7a 65 72 6f  ed space is zero
b1e0: 20 28 74 68 65 20 75 73 75 61 6c 20 76 61 6c 75   (the usual valu
b1f0: 65 20 66 6f 72 20 72 65 73 65 72 76 65 64 20 73  e for reserved s
b200: 70 61 63 65 29 0a 20 20 2a 2a 20 74 68 65 6e 20  pace).  ** then 
b210: 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
b220: 20 6f 66 66 73 65 74 20 6f 66 20 61 6e 20 65 6d   offset of an em
b230: 70 74 79 20 70 61 67 65 20 77 61 6e 74 73 20 74  pty page wants t
b240: 6f 20 62 65 20 36 35 35 33 36 2e 0a 20 20 2a 2a  o be 65536..  **
b250: 20 48 6f 77 65 76 65 72 2c 20 74 68 61 74 20 69   However, that i
b260: 6e 74 65 67 65 72 20 69 73 20 74 6f 6f 20 6c 61  nteger is too la
b270: 72 67 65 20 74 6f 20 62 65 20 73 74 6f 72 65 64  rge to be stored
b280: 20 69 6e 20 61 20 32 2d 62 79 74 65 20 75 6e 73   in a 2-byte uns
b290: 69 67 6e 65 64 0a 20 20 2a 2a 20 69 6e 74 65 67  igned.  ** integ
b2a0: 65 72 2c 20 73 6f 20 61 20 76 61 6c 75 65 20 6f  er, so a value o
b2b0: 66 20 30 20 69 73 20 75 73 65 64 20 69 6e 20 69  f 0 is used in i
b2c0: 74 73 20 70 6c 61 63 65 2e 20 2a 2f 0a 20 20 74  ts place. */.  t
b2d0: 6f 70 20 3d 20 67 65 74 32 62 79 74 65 4e 6f 74  op = get2byteNot
b2e0: 5a 65 72 6f 28 26 64 61 74 61 5b 68 64 72 2b 35  Zero(&data[hdr+5
b2f0: 5d 29 3b 0a 20 20 69 66 28 20 67 61 70 3e 74 6f  ]);.  if( gap>to
b300: 70 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  p ) return SQLIT
b310: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
b320: 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69  .  /* If there i
b330: 73 20 65 6e 6f 75 67 68 20 73 70 61 63 65 20 62  s enough space b
b340: 65 74 77 65 65 6e 20 67 61 70 20 61 6e 64 20 74  etween gap and t
b350: 6f 70 20 66 6f 72 20 6f 6e 65 20 6d 6f 72 65 20  op for one more 
b360: 63 65 6c 6c 20 70 6f 69 6e 74 65 72 0a 20 20 2a  cell pointer.  *
b370: 2a 20 61 72 72 61 79 20 65 6e 74 72 79 20 6f 66  * array entry of
b380: 66 73 65 74 2c 20 61 6e 64 20 69 66 20 74 68 65  fset, and if the
b390: 20 66 72 65 65 6c 69 73 74 20 69 73 20 6e 6f 74   freelist is not
b3a0: 20 65 6d 70 74 79 2c 20 74 68 65 6e 20 73 65 61   empty, then sea
b3b0: 72 63 68 20 74 68 65 0a 20 20 2a 2a 20 66 72 65  rch the.  ** fre
b3c0: 65 6c 69 73 74 20 6c 6f 6f 6b 69 6e 67 20 66 6f  elist looking fo
b3d0: 72 20 61 20 66 72 65 65 20 73 6c 6f 74 20 62 69  r a free slot bi
b3e0: 67 20 65 6e 6f 75 67 68 20 74 6f 20 73 61 74 69  g enough to sati
b3f0: 73 66 79 20 74 68 65 20 72 65 71 75 65 73 74 2e  sfy the request.
b400: 0a 20 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65  .  */.  testcase
b410: 28 20 67 61 70 2b 32 3d 3d 74 6f 70 20 29 3b 0a  ( gap+2==top );.
b420: 20 20 74 65 73 74 63 61 73 65 28 20 67 61 70 2b    testcase( gap+
b430: 31 3d 3d 74 6f 70 20 29 3b 0a 20 20 74 65 73 74  1==top );.  test
b440: 63 61 73 65 28 20 67 61 70 3d 3d 74 6f 70 20 29  case( gap==top )
b450: 3b 0a 20 20 69 66 28 20 67 61 70 2b 32 3c 3d 74  ;.  if( gap+2<=t
b460: 6f 70 20 26 26 20 28 64 61 74 61 5b 68 64 72 2b  op && (data[hdr+
b470: 31 5d 20 7c 7c 20 64 61 74 61 5b 68 64 72 2b 32  1] || data[hdr+2
b480: 5d 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 62 44  ]) ){.    int bD
b490: 65 66 72 61 67 20 3d 20 30 3b 0a 20 20 20 20 75  efrag = 0;.    u
b4a0: 38 20 2a 70 53 70 61 63 65 20 3d 20 70 61 67 65  8 *pSpace = page
b4b0: 46 69 6e 64 53 6c 6f 74 28 70 50 61 67 65 2c 20  FindSlot(pPage, 
b4c0: 6e 42 79 74 65 2c 20 26 72 63 2c 20 26 62 44 65  nByte, &rc, &bDe
b4d0: 66 72 61 67 29 3b 0a 20 20 20 20 69 66 28 20 72  frag);.    if( r
b4e0: 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
b4f0: 20 20 20 69 66 28 20 62 44 65 66 72 61 67 20 29     if( bDefrag )
b500: 20 67 6f 74 6f 20 64 65 66 72 61 67 6d 65 6e 74   goto defragment
b510: 5f 70 61 67 65 3b 0a 20 20 20 20 69 66 28 20 70  _page;.    if( p
b520: 53 70 61 63 65 20 29 7b 0a 20 20 20 20 20 20 61  Space ){.      a
b530: 73 73 65 72 74 28 20 70 53 70 61 63 65 3e 3d 64  ssert( pSpace>=d
b540: 61 74 61 20 26 26 20 28 70 53 70 61 63 65 20 2d  ata && (pSpace -
b550: 20 64 61 74 61 29 3c 36 35 35 33 36 20 29 3b 0a   data)<65536 );.
b560: 20 20 20 20 20 20 2a 70 49 64 78 20 3d 20 28 69        *pIdx = (i
b570: 6e 74 29 28 70 53 70 61 63 65 20 2d 20 64 61 74  nt)(pSpace - dat
b580: 61 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  a);.      return
b590: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
b5a0: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  }.  }..  /* The 
b5b0: 72 65 71 75 65 73 74 20 63 6f 75 6c 64 20 6e 6f  request could no
b5c0: 74 20 62 65 20 66 75 6c 66 69 6c 6c 65 64 20 75  t be fulfilled u
b5d0: 73 69 6e 67 20 61 20 66 72 65 65 6c 69 73 74 20  sing a freelist 
b5e0: 73 6c 6f 74 2e 20 20 43 68 65 63 6b 0a 20 20 2a  slot.  Check.  *
b5f0: 2a 20 74 6f 20 73 65 65 20 69 66 20 64 65 66 72  * to see if defr
b600: 61 67 6d 65 6e 74 61 74 69 6f 6e 20 69 73 20 6e  agmentation is n
b610: 65 63 65 73 73 61 72 79 2e 0a 20 20 2a 2f 0a 20  ecessary..  */. 
b620: 20 74 65 73 74 63 61 73 65 28 20 67 61 70 2b 32   testcase( gap+2
b630: 2b 6e 42 79 74 65 3d 3d 74 6f 70 20 29 3b 0a 20  +nByte==top );. 
b640: 20 69 66 28 20 67 61 70 2b 32 2b 6e 42 79 74 65   if( gap+2+nByte
b650: 3e 74 6f 70 20 29 7b 0a 20 64 65 66 72 61 67 6d  >top ){. defragm
b660: 65 6e 74 5f 70 61 67 65 3a 0a 20 20 20 20 61 73  ent_page:.    as
b670: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65  sert( pPage->nCe
b680: 6c 6c 3e 30 20 7c 7c 20 43 4f 52 52 55 50 54 5f  ll>0 || CORRUPT_
b690: 44 42 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 64  DB );.    rc = d
b6a0: 65 66 72 61 67 6d 65 6e 74 50 61 67 65 28 70 50  efragmentPage(pP
b6b0: 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
b6c0: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
b6d0: 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65    top = get2byte
b6e0: 4e 6f 74 5a 65 72 6f 28 26 64 61 74 61 5b 68 64  NotZero(&data[hd
b6f0: 72 2b 35 5d 29 3b 0a 20 20 20 20 61 73 73 65 72  r+5]);.    asser
b700: 74 28 20 67 61 70 2b 6e 42 79 74 65 3c 3d 74 6f  t( gap+nByte<=to
b710: 70 20 29 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20  p );.  }...  /* 
b720: 41 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20  Allocate memory 
b730: 66 72 6f 6d 20 74 68 65 20 67 61 70 20 69 6e 20  from the gap in 
b740: 62 65 74 77 65 65 6e 20 74 68 65 20 63 65 6c 6c  between the cell
b750: 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79 0a 20   pointer array. 
b760: 20 2a 2a 20 61 6e 64 20 74 68 65 20 63 65 6c 6c   ** and the cell
b770: 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 2e 20 20   content area.  
b780: 54 68 65 20 62 74 72 65 65 49 6e 69 74 50 61 67  The btreeInitPag
b790: 65 28 29 20 63 61 6c 6c 20 68 61 73 20 61 6c 72  e() call has alr
b7a0: 65 61 64 79 0a 20 20 2a 2a 20 76 61 6c 69 64 61  eady.  ** valida
b7b0: 74 65 64 20 74 68 65 20 66 72 65 65 6c 69 73 74  ted the freelist
b7c0: 2e 20 20 47 69 76 65 6e 20 74 68 61 74 20 74 68  .  Given that th
b7d0: 65 20 66 72 65 65 6c 69 73 74 20 69 73 20 76 61  e freelist is va
b7e0: 6c 69 64 2c 20 74 68 65 72 65 0a 20 20 2a 2a 20  lid, there.  ** 
b7f0: 69 73 20 6e 6f 20 77 61 79 20 74 68 61 74 20 74  is no way that t
b800: 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 63 61  he allocation ca
b810: 6e 20 65 78 74 65 6e 64 20 6f 66 66 20 74 68 65  n extend off the
b820: 20 65 6e 64 20 6f 66 20 74 68 65 20 70 61 67 65   end of the page
b830: 2e 0a 20 20 2a 2a 20 54 68 65 20 61 73 73 65 72  ..  ** The asser
b840: 74 28 29 20 62 65 6c 6f 77 20 76 65 72 69 66 69  t() below verifi
b850: 65 73 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  es the previous 
b860: 73 65 6e 74 65 6e 63 65 2e 0a 20 20 2a 2f 0a 20  sentence..  */. 
b870: 20 74 6f 70 20 2d 3d 20 6e 42 79 74 65 3b 0a 20   top -= nByte;. 
b880: 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
b890: 68 64 72 2b 35 5d 2c 20 74 6f 70 29 3b 0a 20 20  hdr+5], top);.  
b8a0: 61 73 73 65 72 74 28 20 74 6f 70 2b 6e 42 79 74  assert( top+nByt
b8b0: 65 20 3c 3d 20 28 69 6e 74 29 70 50 61 67 65 2d  e <= (int)pPage-
b8c0: 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
b8d0: 20 29 3b 0a 20 20 2a 70 49 64 78 20 3d 20 74 6f   );.  *pIdx = to
b8e0: 70 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  p;.  return SQLI
b8f0: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
b900: 52 65 74 75 72 6e 20 61 20 73 65 63 74 69 6f 6e  Return a section
b910: 20 6f 66 20 74 68 65 20 70 50 61 67 65 2d 3e 61   of the pPage->a
b920: 44 61 74 61 20 74 6f 20 74 68 65 20 66 72 65 65  Data to the free
b930: 6c 69 73 74 2e 0a 2a 2a 20 54 68 65 20 66 69 72  list..** The fir
b940: 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 6e  st byte of the n
b950: 65 77 20 66 72 65 65 20 62 6c 6f 63 6b 20 69 73  ew free block is
b960: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 69 53   pPage->aData[iS
b970: 74 61 72 74 5d 0a 2a 2a 20 61 6e 64 20 74 68 65  tart].** and the
b980: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 62 6c 6f   size of the blo
b990: 63 6b 20 69 73 20 69 53 69 7a 65 20 62 79 74 65  ck is iSize byte
b9a0: 73 2e 0a 2a 2a 0a 2a 2a 20 41 64 6a 61 63 65 6e  s..**.** Adjacen
b9b0: 74 20 66 72 65 65 62 6c 6f 63 6b 73 20 61 72 65  t freeblocks are
b9c0: 20 63 6f 61 6c 65 73 63 65 64 2e 0a 2a 2a 0a 2a   coalesced..**.*
b9d0: 2a 20 4e 6f 74 65 20 74 68 61 74 20 65 76 65 6e  * Note that even
b9e0: 20 74 68 6f 75 67 68 20 74 68 65 20 66 72 65 65   though the free
b9f0: 62 6c 6f 63 6b 20 6c 69 73 74 20 77 61 73 20 63  block list was c
ba00: 68 65 63 6b 65 64 20 62 79 20 62 74 72 65 65 49  hecked by btreeI
ba10: 6e 69 74 50 61 67 65 28 29 2c 0a 2a 2a 20 74 68  nitPage(),.** th
ba20: 61 74 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  at routine will 
ba30: 6e 6f 74 20 64 65 74 65 63 74 20 6f 76 65 72 6c  not detect overl
ba40: 61 70 20 62 65 74 77 65 65 6e 20 63 65 6c 6c 73  ap between cells
ba50: 20 6f 72 20 66 72 65 65 62 6c 6f 63 6b 73 2e 20   or freeblocks. 
ba60: 20 4e 6f 72 0a 2a 2a 20 64 6f 65 73 20 69 74 20   Nor.** does it 
ba70: 64 65 74 65 63 74 20 63 65 6c 6c 73 20 6f 72 20  detect cells or 
ba80: 66 72 65 65 62 6c 6f 63 6b 73 20 74 68 61 74 20  freeblocks that 
ba90: 65 6e 63 72 6f 75 63 68 20 69 6e 74 6f 20 74 68  encrouch into th
baa0: 65 20 72 65 73 65 72 76 65 64 20 62 79 74 65 73  e reserved bytes
bab0: 0a 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20 6f  .** at the end o
bac0: 66 20 74 68 65 20 70 61 67 65 2e 20 20 53 6f 20  f the page.  So 
bad0: 64 6f 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f  do additional co
bae0: 72 72 75 70 74 69 6f 6e 20 63 68 65 63 6b 73 20  rruption checks 
baf0: 69 6e 73 69 64 65 20 74 68 69 73 0a 2a 2a 20 72  inside this.** r
bb00: 6f 75 74 69 6e 65 20 61 6e 64 20 72 65 74 75 72  outine and retur
bb10: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
bb20: 20 69 66 20 61 6e 79 20 70 72 6f 62 6c 65 6d 73   if any problems
bb30: 20 61 72 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73   are found..*/.s
bb40: 74 61 74 69 63 20 69 6e 74 20 66 72 65 65 53 70  tatic int freeSp
bb50: 61 63 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  ace(MemPage *pPa
bb60: 67 65 2c 20 75 31 36 20 69 53 74 61 72 74 2c 20  ge, u16 iStart, 
bb70: 75 31 36 20 69 53 69 7a 65 29 7b 0a 20 20 75 31  u16 iSize){.  u1
bb80: 36 20 69 50 74 72 3b 20 20 20 20 20 20 20 20 20  6 iPtr;         
bb90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bba0: 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
bbb0: 66 20 70 74 72 20 74 6f 20 6e 65 78 74 20 66 72  f ptr to next fr
bbc0: 65 65 62 6c 6f 63 6b 20 2a 2f 0a 20 20 75 31 36  eeblock */.  u16
bbd0: 20 69 46 72 65 65 42 6c 6b 3b 20 20 20 20 20 20   iFreeBlk;      
bbe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bbf0: 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
bc00: 20 74 68 65 20 6e 65 78 74 20 66 72 65 65 62 6c   the next freebl
bc10: 6f 63 6b 20 2a 2f 0a 20 20 75 38 20 68 64 72 3b  ock */.  u8 hdr;
bc20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bc30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
bc40: 2a 20 50 61 67 65 20 68 65 61 64 65 72 20 73 69  * Page header si
bc50: 7a 65 2e 20 20 30 20 6f 72 20 31 30 30 20 2a 2f  ze.  0 or 100 */
bc60: 0a 20 20 75 38 20 6e 46 72 61 67 20 3d 20 30 3b  .  u8 nFrag = 0;
bc70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bc80: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 64 75           /* Redu
bc90: 63 74 69 6f 6e 20 69 6e 20 66 72 61 67 6d 65 6e  ction in fragmen
bca0: 74 61 74 69 6f 6e 20 2a 2f 0a 20 20 75 31 36 20  tation */.  u16 
bcb0: 69 4f 72 69 67 53 69 7a 65 20 3d 20 69 53 69 7a  iOrigSize = iSiz
bcc0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
bcd0: 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61    /* Original va
bce0: 6c 75 65 20 6f 66 20 69 53 69 7a 65 20 2a 2f 0a  lue of iSize */.
bcf0: 20 20 75 33 32 20 69 4c 61 73 74 20 3d 20 70 50    u32 iLast = pP
bd00: 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
bd10: 53 69 7a 65 2d 34 3b 20 2f 2a 20 4c 61 72 67 65  Size-4; /* Large
bd20: 73 74 20 70 6f 73 73 69 62 6c 65 20 66 72 65 65  st possible free
bd30: 62 6c 6f 63 6b 20 6f 66 66 73 65 74 20 2a 2f 0a  block offset */.
bd40: 20 20 75 33 32 20 69 45 6e 64 20 3d 20 69 53 74    u32 iEnd = iSt
bd50: 61 72 74 20 2b 20 69 53 69 7a 65 3b 20 20 20 20  art + iSize;    
bd60: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
bd70: 20 62 79 74 65 20 70 61 73 74 20 74 68 65 20 69   byte past the i
bd80: 53 74 61 72 74 20 62 75 66 66 65 72 20 2a 2f 0a  Start buffer */.
bd90: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
bda0: 2a 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61  *data = pPage->a
bdb0: 44 61 74 61 3b 20 20 20 2f 2a 20 50 61 67 65 20  Data;   /* Page 
bdc0: 63 6f 6e 74 65 6e 74 20 2a 2f 0a 0a 20 20 61 73  content */..  as
bdd0: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74  sert( pPage->pBt
bde0: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
bdf0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
be00: 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
be10: 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73  pDbPage) );.  as
be20: 73 65 72 74 28 20 69 53 74 61 72 74 3e 3d 70 50  sert( iStart>=pP
be30: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 36  age->hdrOffset+6
be40: 2b 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72  +pPage->childPtr
be50: 53 69 7a 65 20 29 3b 0a 20 20 61 73 73 65 72 74  Size );.  assert
be60: 28 20 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20  ( CORRUPT_DB || 
be70: 69 45 6e 64 20 3c 3d 20 70 50 61 67 65 2d 3e 70  iEnd <= pPage->p
be80: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29  Bt->usableSize )
be90: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
bea0: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
beb0: 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
bec0: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  ) );.  assert( i
bed0: 53 69 7a 65 3e 3d 34 20 29 3b 20 20 20 2f 2a 20  Size>=4 );   /* 
bee0: 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c 20 73 69 7a  Minimum cell siz
bef0: 65 20 69 73 20 34 20 2a 2f 0a 20 20 61 73 73 65  e is 4 */.  asse
bf00: 72 74 28 20 69 53 74 61 72 74 3c 3d 69 4c 61 73  rt( iStart<=iLas
bf10: 74 20 29 3b 0a 0a 20 20 2f 2a 20 4f 76 65 72 77  t );..  /* Overw
bf20: 72 69 74 65 20 64 65 6c 65 74 65 64 20 69 6e 66  rite deleted inf
bf30: 6f 72 6d 61 74 69 6f 6e 20 77 69 74 68 20 7a 65  ormation with ze
bf40: 72 6f 73 20 77 68 65 6e 20 74 68 65 20 73 65 63  ros when the sec
bf50: 75 72 65 5f 64 65 6c 65 74 65 0a 20 20 2a 2a 20  ure_delete.  ** 
bf60: 6f 70 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65  option is enable
bf70: 64 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65  d */.  if( pPage
bf80: 2d 3e 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20  ->pBt->btsFlags 
bf90: 26 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c  & BTS_SECURE_DEL
bfa0: 45 54 45 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65  ETE ){.    memse
bfb0: 74 28 26 64 61 74 61 5b 69 53 74 61 72 74 5d 2c  t(&data[iStart],
bfc0: 20 30 2c 20 69 53 69 7a 65 29 3b 0a 20 20 7d 0a   0, iSize);.  }.
bfd0: 0a 20 20 2f 2a 20 54 68 65 20 6c 69 73 74 20 6f  .  /* The list o
bfe0: 66 20 66 72 65 65 62 6c 6f 63 6b 73 20 6d 75 73  f freeblocks mus
bff0: 74 20 62 65 20 69 6e 20 61 73 63 65 6e 64 69 6e  t be in ascendin
c000: 67 20 6f 72 64 65 72 2e 20 20 46 69 6e 64 20 74  g order.  Find t
c010: 68 65 20 0a 20 20 2a 2a 20 73 70 6f 74 20 6f 6e  he .  ** spot on
c020: 20 74 68 65 20 6c 69 73 74 20 77 68 65 72 65 20   the list where 
c030: 69 53 74 61 72 74 20 73 68 6f 75 6c 64 20 62 65  iStart should be
c040: 20 69 6e 73 65 72 74 65 64 2e 0a 20 20 2a 2f 0a   inserted..  */.
c050: 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68    hdr = pPage->h
c060: 64 72 4f 66 66 73 65 74 3b 0a 20 20 69 50 74 72  drOffset;.  iPtr
c070: 20 3d 20 68 64 72 20 2b 20 31 3b 0a 20 20 69 66   = hdr + 1;.  if
c080: 28 20 64 61 74 61 5b 69 50 74 72 2b 31 5d 3d 3d  ( data[iPtr+1]==
c090: 30 20 26 26 20 64 61 74 61 5b 69 50 74 72 5d 3d  0 && data[iPtr]=
c0a0: 3d 30 20 29 7b 0a 20 20 20 20 69 46 72 65 65 42  =0 ){.    iFreeB
c0b0: 6c 6b 20 3d 20 30 3b 20 20 2f 2a 20 53 68 6f 72  lk = 0;  /* Shor
c0c0: 74 63 75 74 20 66 6f 72 20 74 68 65 20 63 61 73  tcut for the cas
c0d0: 65 20 77 68 65 6e 20 74 68 65 20 66 72 65 65 6c  e when the freel
c0e0: 69 73 74 20 69 73 20 65 6d 70 74 79 20 2a 2f 0a  ist is empty */.
c0f0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68 69    }else{.    whi
c100: 6c 65 28 20 28 69 46 72 65 65 42 6c 6b 20 3d 20  le( (iFreeBlk = 
c110: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 69  get2byte(&data[i
c120: 50 74 72 5d 29 29 3e 30 20 26 26 20 69 46 72 65  Ptr]))>0 && iFre
c130: 65 42 6c 6b 3c 69 53 74 61 72 74 20 29 7b 0a 20  eBlk<iStart ){. 
c140: 20 20 20 20 20 69 66 28 20 69 46 72 65 65 42 6c       if( iFreeBl
c150: 6b 3c 69 50 74 72 2b 34 20 29 20 72 65 74 75 72  k<iPtr+4 ) retur
c160: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
c170: 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 69 50 74  _BKPT;.      iPt
c180: 72 20 3d 20 69 46 72 65 65 42 6c 6b 3b 0a 20 20  r = iFreeBlk;.  
c190: 20 20 7d 0a 20 20 20 20 69 66 28 20 69 46 72 65    }.    if( iFre
c1a0: 65 42 6c 6b 3e 69 4c 61 73 74 20 29 20 72 65 74  eBlk>iLast ) ret
c1b0: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
c1c0: 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 61 73 73  PT_BKPT;.    ass
c1d0: 65 72 74 28 20 69 46 72 65 65 42 6c 6b 3e 69 50  ert( iFreeBlk>iP
c1e0: 74 72 20 7c 7c 20 69 46 72 65 65 42 6c 6b 3d 3d  tr || iFreeBlk==
c1f0: 30 20 29 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 41  0 );.  .    /* A
c200: 74 20 74 68 69 73 20 70 6f 69 6e 74 3a 0a 20 20  t this point:.  
c210: 20 20 2a 2a 20 20 20 20 69 46 72 65 65 42 6c 6b    **    iFreeBlk
c220: 3a 20 20 20 46 69 72 73 74 20 66 72 65 65 62 6c  :   First freebl
c230: 6f 63 6b 20 61 66 74 65 72 20 69 53 74 61 72 74  ock after iStart
c240: 2c 20 6f 72 20 7a 65 72 6f 20 69 66 20 6e 6f 6e  , or zero if non
c250: 65 0a 20 20 20 20 2a 2a 20 20 20 20 69 50 74 72  e.    **    iPtr
c260: 3a 20 20 20 20 20 20 20 54 68 65 20 61 64 64 72  :       The addr
c270: 65 73 73 20 6f 66 20 61 20 70 6f 69 6e 74 65 72  ess of a pointer
c280: 20 69 46 72 65 65 42 6c 6b 0a 20 20 20 20 2a 2a   iFreeBlk.    **
c290: 0a 20 20 20 20 2a 2a 20 43 68 65 63 6b 20 74 6f  .    ** Check to
c2a0: 20 73 65 65 20 69 66 20 69 46 72 65 65 42 6c 6b   see if iFreeBlk
c2b0: 20 73 68 6f 75 6c 64 20 62 65 20 63 6f 61 6c 65   should be coale
c2c0: 73 63 65 64 20 6f 6e 74 6f 20 74 68 65 20 65 6e  sced onto the en
c2d0: 64 20 6f 66 20 69 53 74 61 72 74 2e 0a 20 20 20  d of iStart..   
c2e0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 46 72 65   */.    if( iFre
c2f0: 65 42 6c 6b 20 26 26 20 69 45 6e 64 2b 33 3e 3d  eBlk && iEnd+3>=
c300: 69 46 72 65 65 42 6c 6b 20 29 7b 0a 20 20 20 20  iFreeBlk ){.    
c310: 20 20 6e 46 72 61 67 20 3d 20 69 46 72 65 65 42    nFrag = iFreeB
c320: 6c 6b 20 2d 20 69 45 6e 64 3b 0a 20 20 20 20 20  lk - iEnd;.     
c330: 20 69 66 28 20 69 45 6e 64 3e 69 46 72 65 65 42   if( iEnd>iFreeB
c340: 6c 6b 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  lk ) return SQLI
c350: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
c360: 0a 20 20 20 20 20 20 69 45 6e 64 20 3d 20 69 46  .      iEnd = iF
c370: 72 65 65 42 6c 6b 20 2b 20 67 65 74 32 62 79 74  reeBlk + get2byt
c380: 65 28 26 64 61 74 61 5b 69 46 72 65 65 42 6c 6b  e(&data[iFreeBlk
c390: 2b 32 5d 29 3b 0a 20 20 20 20 20 20 69 53 69 7a  +2]);.      iSiz
c3a0: 65 20 3d 20 69 45 6e 64 20 2d 20 69 53 74 61 72  e = iEnd - iStar
c3b0: 74 3b 0a 20 20 20 20 20 20 69 46 72 65 65 42 6c  t;.      iFreeBl
c3c0: 6b 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  k = get2byte(&da
c3d0: 74 61 5b 69 46 72 65 65 42 6c 6b 5d 29 3b 0a 20  ta[iFreeBlk]);. 
c3e0: 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49     }.  .    /* I
c3f0: 66 20 69 50 74 72 20 69 73 20 61 6e 6f 74 68 65  f iPtr is anothe
c400: 72 20 66 72 65 65 62 6c 6f 63 6b 20 28 74 68 61  r freeblock (tha
c410: 74 20 69 73 2c 20 69 66 20 69 50 74 72 20 69 73  t is, if iPtr is
c420: 20 6e 6f 74 20 74 68 65 20 66 72 65 65 6c 69 73   not the freelis
c430: 74 0a 20 20 20 20 2a 2a 20 70 6f 69 6e 74 65 72  t.    ** pointer
c440: 20 69 6e 20 74 68 65 20 70 61 67 65 20 68 65 61   in the page hea
c450: 64 65 72 29 20 74 68 65 6e 20 63 68 65 63 6b 20  der) then check 
c460: 74 6f 20 73 65 65 20 69 66 20 69 53 74 61 72 74  to see if iStart
c470: 20 73 68 6f 75 6c 64 20 62 65 0a 20 20 20 20 2a   should be.    *
c480: 2a 20 63 6f 61 6c 65 73 63 65 64 20 6f 6e 74 6f  * coalesced onto
c490: 20 74 68 65 20 65 6e 64 20 6f 66 20 69 50 74 72   the end of iPtr
c4a0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
c4b0: 20 69 50 74 72 3e 68 64 72 2b 31 20 29 7b 0a 20   iPtr>hdr+1 ){. 
c4c0: 20 20 20 20 20 69 6e 74 20 69 50 74 72 45 6e 64       int iPtrEnd
c4d0: 20 3d 20 69 50 74 72 20 2b 20 67 65 74 32 62 79   = iPtr + get2by
c4e0: 74 65 28 26 64 61 74 61 5b 69 50 74 72 2b 32 5d  te(&data[iPtr+2]
c4f0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 50 74  );.      if( iPt
c500: 72 45 6e 64 2b 33 3e 3d 69 53 74 61 72 74 20 29  rEnd+3>=iStart )
c510: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 50  {.        if( iP
c520: 74 72 45 6e 64 3e 69 53 74 61 72 74 20 29 20 72  trEnd>iStart ) r
c530: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
c540: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
c550: 20 20 20 6e 46 72 61 67 20 2b 3d 20 69 53 74 61     nFrag += iSta
c560: 72 74 20 2d 20 69 50 74 72 45 6e 64 3b 0a 20 20  rt - iPtrEnd;.  
c570: 20 20 20 20 20 20 69 53 69 7a 65 20 3d 20 69 45        iSize = iE
c580: 6e 64 20 2d 20 69 50 74 72 3b 0a 20 20 20 20 20  nd - iPtr;.     
c590: 20 20 20 69 53 74 61 72 74 20 3d 20 69 50 74 72     iStart = iPtr
c5a0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
c5b0: 20 20 20 20 69 66 28 20 6e 46 72 61 67 3e 64 61      if( nFrag>da
c5c0: 74 61 5b 68 64 72 2b 37 5d 20 29 20 72 65 74 75  ta[hdr+7] ) retu
c5d0: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
c5e0: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 64 61 74 61  T_BKPT;.    data
c5f0: 5b 68 64 72 2b 37 5d 20 2d 3d 20 6e 46 72 61 67  [hdr+7] -= nFrag
c600: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 53 74 61  ;.  }.  if( iSta
c610: 72 74 3d 3d 67 65 74 32 62 79 74 65 28 26 64 61  rt==get2byte(&da
c620: 74 61 5b 68 64 72 2b 35 5d 29 20 29 7b 0a 20 20  ta[hdr+5]) ){.  
c630: 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 66 72 65    /* The new fre
c640: 65 62 6c 6f 63 6b 20 69 73 20 61 74 20 74 68 65  eblock is at the
c650: 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68   beginning of th
c660: 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61  e cell content a
c670: 72 65 61 2c 0a 20 20 20 20 2a 2a 20 73 6f 20 6a  rea,.    ** so j
c680: 75 73 74 20 65 78 74 65 6e 64 20 74 68 65 20 63  ust extend the c
c690: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
c6a0: 20 72 61 74 68 65 72 20 74 68 61 6e 20 63 72 65   rather than cre
c6b0: 61 74 65 20 61 6e 6f 74 68 65 72 0a 20 20 20 20  ate another.    
c6c0: 2a 2a 20 66 72 65 65 6c 69 73 74 20 65 6e 74 72  ** freelist entr
c6d0: 79 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 50 74  y */.    if( iPt
c6e0: 72 21 3d 68 64 72 2b 31 20 29 20 72 65 74 75 72  r!=hdr+1 ) retur
c6f0: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
c700: 5f 42 4b 50 54 3b 0a 20 20 20 20 70 75 74 32 62  _BKPT;.    put2b
c710: 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 31 5d  yte(&data[hdr+1]
c720: 2c 20 69 46 72 65 65 42 6c 6b 29 3b 0a 20 20 20  , iFreeBlk);.   
c730: 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
c740: 68 64 72 2b 35 5d 2c 20 69 45 6e 64 29 3b 0a 20  hdr+5], iEnd);. 
c750: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49   }else{.    /* I
c760: 6e 73 65 72 74 20 74 68 65 20 6e 65 77 20 66 72  nsert the new fr
c770: 65 65 62 6c 6f 63 6b 20 69 6e 74 6f 20 74 68 65  eeblock into the
c780: 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20 20   freelist */.   
c790: 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
c7a0: 69 50 74 72 5d 2c 20 69 53 74 61 72 74 29 3b 0a  iPtr], iStart);.
c7b0: 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61      put2byte(&da
c7c0: 74 61 5b 69 53 74 61 72 74 5d 2c 20 69 46 72 65  ta[iStart], iFre
c7d0: 65 42 6c 6b 29 3b 0a 20 20 20 20 70 75 74 32 62  eBlk);.    put2b
c7e0: 79 74 65 28 26 64 61 74 61 5b 69 53 74 61 72 74  yte(&data[iStart
c7f0: 2b 32 5d 2c 20 69 53 69 7a 65 29 3b 0a 20 20 7d  +2], iSize);.  }
c800: 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20  .  pPage->nFree 
c810: 2b 3d 20 69 4f 72 69 67 53 69 7a 65 3b 0a 20 20  += iOrigSize;.  
c820: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
c830: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6f 64  ;.}../*.** Decod
c840: 65 20 74 68 65 20 66 6c 61 67 73 20 62 79 74 65  e the flags byte
c850: 20 28 74 68 65 20 66 69 72 73 74 20 62 79 74 65   (the first byte
c860: 20 6f 66 20 74 68 65 20 68 65 61 64 65 72 29 20   of the header) 
c870: 66 6f 72 20 61 20 70 61 67 65 0a 2a 2a 20 61 6e  for a page.** an
c880: 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 66 69 65  d initialize fie
c890: 6c 64 73 20 6f 66 20 74 68 65 20 4d 65 6d 50 61  lds of the MemPa
c8a0: 67 65 20 73 74 72 75 63 74 75 72 65 20 61 63 63  ge structure acc
c8b0: 6f 72 64 69 6e 67 6c 79 2e 0a 2a 2a 0a 2a 2a 20  ordingly..**.** 
c8c0: 4f 6e 6c 79 20 74 68 65 20 66 6f 6c 6c 6f 77 69  Only the followi
c8d0: 6e 67 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20  ng combinations 
c8e0: 61 72 65 20 73 75 70 70 6f 72 74 65 64 2e 20 20  are supported.  
c8f0: 41 6e 79 74 68 69 6e 67 20 64 69 66 66 65 72 65  Anything differe
c900: 6e 74 0a 2a 2a 20 69 6e 64 69 63 61 74 65 73 20  nt.** indicates 
c910: 61 20 63 6f 72 72 75 70 74 20 64 61 74 61 62 61  a corrupt databa
c920: 73 65 20 66 69 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20  se files:.**.** 
c930: 20 20 20 20 20 20 20 20 50 54 46 5f 5a 45 52 4f          PTF_ZERO
c940: 44 41 54 41 0a 2a 2a 20 20 20 20 20 20 20 20 20  DATA.**         
c950: 50 54 46 5f 5a 45 52 4f 44 41 54 41 20 7c 20 50  PTF_ZERODATA | P
c960: 54 46 5f 4c 45 41 46 0a 2a 2a 20 20 20 20 20 20  TF_LEAF.**      
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 0a 2a 2a 20  | PTF_INTKEY.** 
c990: 20 20 20 20 20 20 20 20 50 54 46 5f 4c 45 41 46          PTF_LEAF
c9a0: 44 41 54 41 20 7c 20 50 54 46 5f 49 4e 54 4b 45  DATA | PTF_INTKE
c9b0: 59 20 7c 20 50 54 46 5f 4c 45 41 46 0a 2a 2f 0a  Y | PTF_LEAF.*/.
c9c0: 73 74 61 74 69 63 20 69 6e 74 20 64 65 63 6f 64  static int decod
c9d0: 65 46 6c 61 67 73 28 4d 65 6d 50 61 67 65 20 2a  eFlags(MemPage *
c9e0: 70 50 61 67 65 2c 20 69 6e 74 20 66 6c 61 67 42  pPage, int flagB
c9f0: 79 74 65 29 7b 0a 20 20 42 74 53 68 61 72 65 64  yte){.  BtShared
ca00: 20 2a 70 42 74 3b 20 20 20 20 20 2f 2a 20 41 20   *pBt;     /* A 
ca10: 63 6f 70 79 20 6f 66 20 70 50 61 67 65 2d 3e 70  copy of pPage->p
ca20: 42 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  Bt */..  assert(
ca30: 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65   pPage->hdrOffse
ca40: 74 3d 3d 28 70 50 61 67 65 2d 3e 70 67 6e 6f 3d  t==(pPage->pgno=
ca50: 3d 31 20 3f 20 31 30 30 20 3a 20 30 29 20 29 3b  =1 ? 100 : 0) );
ca60: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
ca70: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
ca80: 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
ca90: 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6c 65 61   );.  pPage->lea
caa0: 66 20 3d 20 28 75 38 29 28 66 6c 61 67 42 79 74  f = (u8)(flagByt
cab0: 65 3e 3e 33 29 3b 20 20 61 73 73 65 72 74 28 20  e>>3);  assert( 
cac0: 50 54 46 5f 4c 45 41 46 20 3d 3d 20 31 3c 3c 33  PTF_LEAF == 1<<3
cad0: 20 29 3b 0a 20 20 66 6c 61 67 42 79 74 65 20 26   );.  flagByte &
cae0: 3d 20 7e 50 54 46 5f 4c 45 41 46 3b 0a 20 20 70  = ~PTF_LEAF;.  p
caf0: 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69  Page->childPtrSi
cb00: 7a 65 20 3d 20 34 2d 34 2a 70 50 61 67 65 2d 3e  ze = 4-4*pPage->
cb10: 6c 65 61 66 3b 0a 20 20 70 42 74 20 3d 20 70 50  leaf;.  pBt = pP
cb20: 61 67 65 2d 3e 70 42 74 3b 0a 20 20 69 66 28 20  age->pBt;.  if( 
cb30: 66 6c 61 67 42 79 74 65 3d 3d 28 50 54 46 5f 4c  flagByte==(PTF_L
cb40: 45 41 46 44 41 54 41 20 7c 20 50 54 46 5f 49 4e  EAFDATA | PTF_IN
cb50: 54 4b 45 59 29 20 29 7b 0a 20 20 20 20 2f 2a 20  TKEY) ){.    /* 
cb60: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30  EVIDENCE-OF: R-0
cb70: 33 36 34 30 2d 31 33 34 31 35 20 41 20 76 61 6c  3640-13415 A val
cb80: 75 65 20 6f 66 20 35 20 6d 65 61 6e 73 20 74 68  ue of 5 means th
cb90: 65 20 70 61 67 65 20 69 73 20 61 6e 20 69 6e 74  e page is an int
cba0: 65 72 69 6f 72 0a 20 20 20 20 2a 2a 20 74 61 62  erior.    ** tab
cbb0: 6c 65 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20  le b-tree page. 
cbc0: 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  */.    assert( (
cbd0: 50 54 46 5f 4c 45 41 46 44 41 54 41 7c 50 54 46  PTF_LEAFDATA|PTF
cbe0: 5f 49 4e 54 4b 45 59 29 3d 3d 35 20 29 3b 0a 20  _INTKEY)==5 );. 
cbf0: 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
cc00: 46 3a 20 52 2d 32 30 35 30 31 2d 36 31 37 39 36  F: R-20501-61796
cc10: 20 41 20 76 61 6c 75 65 20 6f 66 20 31 33 20 6d   A value of 13 m
cc20: 65 61 6e 73 20 74 68 65 20 70 61 67 65 20 69 73  eans the page is
cc30: 20 61 20 6c 65 61 66 0a 20 20 20 20 2a 2a 20 74   a leaf.    ** t
cc40: 61 62 6c 65 20 62 2d 74 72 65 65 20 70 61 67 65  able b-tree page
cc50: 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  . */.    assert(
cc60: 20 28 50 54 46 5f 4c 45 41 46 44 41 54 41 7c 50   (PTF_LEAFDATA|P
cc70: 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45  TF_INTKEY|PTF_LE
cc80: 41 46 29 3d 3d 31 33 20 29 3b 0a 20 20 20 20 70  AF)==13 );.    p
cc90: 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 3d 20 31  Page->intKey = 1
cca0: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74  ;.    pPage->int
ccb0: 4b 65 79 4c 65 61 66 20 3d 20 70 50 61 67 65 2d  KeyLeaf = pPage-
ccc0: 3e 6c 65 61 66 3b 0a 20 20 20 20 70 50 61 67 65  >leaf;.    pPage
ccd0: 2d 3e 6e 6f 50 61 79 6c 6f 61 64 20 3d 20 21 70  ->noPayload = !p
cce0: 50 61 67 65 2d 3e 6c 65 61 66 3b 0a 20 20 20 20  Page->leaf;.    
ccf0: 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20  pPage->maxLocal 
cd00: 3d 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66 3b 0a  = pBt->maxLeaf;.
cd10: 20 20 20 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f      pPage->minLo
cd20: 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e 4c 65  cal = pBt->minLe
cd30: 61 66 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  af;.  }else if( 
cd40: 66 6c 61 67 42 79 74 65 3d 3d 50 54 46 5f 5a 45  flagByte==PTF_ZE
cd50: 52 4f 44 41 54 41 20 29 7b 0a 20 20 20 20 2f 2a  RODATA ){.    /*
cd60: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
cd70: 32 37 32 32 35 2d 35 33 39 33 36 20 41 20 76 61  27225-53936 A va
cd80: 6c 75 65 20 6f 66 20 32 20 6d 65 61 6e 73 20 74  lue of 2 means t
cd90: 68 65 20 70 61 67 65 20 69 73 20 61 6e 20 69 6e  he page is an in
cda0: 74 65 72 69 6f 72 0a 20 20 20 20 2a 2a 20 69 6e  terior.    ** in
cdb0: 64 65 78 20 62 2d 74 72 65 65 20 70 61 67 65 2e  dex b-tree page.
cdc0: 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
cdd0: 28 50 54 46 5f 5a 45 52 4f 44 41 54 41 29 3d 3d  (PTF_ZERODATA)==
cde0: 32 20 29 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44  2 );.    /* EVID
cdf0: 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 36 35 37 31  ENCE-OF: R-16571
ce00: 2d 31 31 36 31 35 20 41 20 76 61 6c 75 65 20 6f  -11615 A value o
ce10: 66 20 31 30 20 6d 65 61 6e 73 20 74 68 65 20 70  f 10 means the p
ce20: 61 67 65 20 69 73 20 61 20 6c 65 61 66 0a 20 20  age is a leaf.  
ce30: 20 20 2a 2a 20 69 6e 64 65 78 20 62 2d 74 72 65    ** index b-tre
ce40: 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 61  e page. */.    a
ce50: 73 73 65 72 74 28 20 28 50 54 46 5f 5a 45 52 4f  ssert( (PTF_ZERO
ce60: 44 41 54 41 7c 50 54 46 5f 4c 45 41 46 29 3d 3d  DATA|PTF_LEAF)==
ce70: 31 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d  10 );.    pPage-
ce80: 3e 69 6e 74 4b 65 79 20 3d 20 30 3b 0a 20 20 20  >intKey = 0;.   
ce90: 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65   pPage->intKeyLe
cea0: 61 66 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67  af = 0;.    pPag
ceb0: 65 2d 3e 6e 6f 50 61 79 6c 6f 61 64 20 3d 20 30  e->noPayload = 0
cec0: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 61 78  ;.    pPage->max
ced0: 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 61 78  Local = pBt->max
cee0: 4c 6f 63 61 6c 3b 0a 20 20 20 20 70 50 61 67 65  Local;.    pPage
cef0: 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 42 74  ->minLocal = pBt
cf00: 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 65  ->minLocal;.  }e
cf10: 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 45 56 49 44  lse{.    /* EVID
cf20: 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 37 36 30 38  ENCE-OF: R-47608
cf30: 2d 35 36 34 36 39 20 41 6e 79 20 6f 74 68 65 72  -56469 Any other
cf40: 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 62   value for the b
cf50: 2d 74 72 65 65 20 70 61 67 65 20 74 79 70 65 20  -tree page type 
cf60: 69 73 0a 20 20 20 20 2a 2a 20 61 6e 20 65 72 72  is.    ** an err
cf70: 6f 72 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  or. */.    retur
cf80: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
cf90: 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 70 50 61  _BKPT;.  }.  pPa
cfa0: 67 65 2d 3e 6d 61 78 31 62 79 74 65 50 61 79 6c  ge->max1bytePayl
cfb0: 6f 61 64 20 3d 20 70 42 74 2d 3e 6d 61 78 31 62  oad = pBt->max1b
cfc0: 79 74 65 50 61 79 6c 6f 61 64 3b 0a 20 20 72 65  ytePayload;.  re
cfd0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
cfe0: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c  }../*.** Initial
cff0: 69 7a 65 20 74 68 65 20 61 75 78 69 6c 69 61 72  ize the auxiliar
d000: 79 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f  y information fo
d010: 72 20 61 20 64 69 73 6b 20 62 6c 6f 63 6b 2e 0a  r a disk block..
d020: 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c  **.** Return SQL
d030: 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73  ITE_OK on succes
d040: 73 2e 20 20 49 66 20 77 65 20 73 65 65 20 74 68  s.  If we see th
d050: 61 74 20 74 68 65 20 70 61 67 65 20 64 6f 65 73  at the page does
d060: 0a 2a 2a 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20  .** not contain 
d070: 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 64 61  a well-formed da
d080: 74 61 62 61 73 65 20 70 61 67 65 2c 20 74 68 65  tabase page, the
d090: 6e 20 72 65 74 75 72 6e 20 0a 2a 2a 20 53 51 4c  n return .** SQL
d0a0: 49 54 45 5f 43 4f 52 52 55 50 54 2e 20 20 4e 6f  ITE_CORRUPT.  No
d0b0: 74 65 20 74 68 61 74 20 61 20 72 65 74 75 72 6e  te that a return
d0c0: 20 6f 66 20 53 51 4c 49 54 45 5f 4f 4b 20 64 6f   of SQLITE_OK do
d0d0: 65 73 20 6e 6f 74 0a 2a 2a 20 67 75 61 72 61 6e  es not.** guaran
d0e0: 74 65 65 20 74 68 61 74 20 74 68 65 20 70 61 67  tee that the pag
d0f0: 65 20 69 73 20 77 65 6c 6c 2d 66 6f 72 6d 65 64  e is well-formed
d100: 2e 20 20 49 74 20 6f 6e 6c 79 20 73 68 6f 77 73  .  It only shows
d110: 20 74 68 61 74 0a 2a 2a 20 77 65 20 66 61 69 6c   that.** we fail
d120: 65 64 20 74 6f 20 64 65 74 65 63 74 20 61 6e 79  ed to detect any
d130: 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a   corruption..*/.
d140: 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65  static int btree
d150: 49 6e 69 74 50 61 67 65 28 4d 65 6d 50 61 67 65  InitPage(MemPage
d160: 20 2a 70 50 61 67 65 29 7b 0a 0a 20 20 61 73 73   *pPage){..  ass
d170: 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 21  ert( pPage->pBt!
d180: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
d190: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
d1a0: 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
d1b0: 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
d1c0: 74 28 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d  t( pPage->pgno==
d1d0: 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
d1e0: 6e 75 6d 62 65 72 28 70 50 61 67 65 2d 3e 70 44  number(pPage->pD
d1f0: 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65  bPage) );.  asse
d200: 72 74 28 20 70 50 61 67 65 20 3d 3d 20 73 71 6c  rt( pPage == sql
d210: 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72  ite3PagerGetExtr
d220: 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  a(pPage->pDbPage
d230: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
d240: 50 61 67 65 2d 3e 61 44 61 74 61 20 3d 3d 20 73  Page->aData == s
d250: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61  qlite3PagerGetDa
d260: 74 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  ta(pPage->pDbPag
d270: 65 29 20 29 3b 0a 0a 20 20 69 66 28 20 21 70 50  e) );..  if( !pP
d280: 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 7b 0a 20  age->isInit ){. 
d290: 20 20 20 75 31 36 20 70 63 3b 20 20 20 20 20 20     u16 pc;      
d2a0: 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
d2b0: 20 6f 66 20 61 20 66 72 65 65 62 6c 6f 63 6b 20   of a freeblock 
d2c0: 77 69 74 68 69 6e 20 70 50 61 67 65 2d 3e 61 44  within pPage->aD
d2d0: 61 74 61 5b 5d 20 2a 2f 0a 20 20 20 20 75 38 20  ata[] */.    u8 
d2e0: 68 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  hdr;            
d2f0: 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 62 65 67  /* Offset to beg
d300: 69 6e 6e 69 6e 67 20 6f 66 20 70 61 67 65 20 68  inning of page h
d310: 65 61 64 65 72 20 2a 2f 0a 20 20 20 20 75 38 20  eader */.    u8 
d320: 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20 20 20  *data;          
d330: 2f 2a 20 45 71 75 61 6c 20 74 6f 20 70 50 61 67  /* Equal to pPag
d340: 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20 20 20  e->aData */.    
d350: 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20 20  BtShared *pBt;  
d360: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 69        /* The mai
d370: 6e 20 62 74 72 65 65 20 73 74 72 75 63 74 75 72  n btree structur
d380: 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 75 73 61  e */.    int usa
d390: 62 6c 65 53 69 7a 65 3b 20 20 20 20 2f 2a 20 41  bleSize;    /* A
d3a0: 6d 6f 75 6e 74 20 6f 66 20 75 73 61 62 6c 65 20  mount of usable 
d3b0: 73 70 61 63 65 20 6f 6e 20 65 61 63 68 20 70 61  space on each pa
d3c0: 67 65 20 2a 2f 0a 20 20 20 20 75 31 36 20 63 65  ge */.    u16 ce
d3d0: 6c 6c 4f 66 66 73 65 74 3b 20 20 20 20 2f 2a 20  llOffset;    /* 
d3e0: 4f 66 66 73 65 74 20 66 72 6f 6d 20 73 74 61 72  Offset from star
d3f0: 74 20 6f 66 20 70 61 67 65 20 74 6f 20 66 69 72  t of page to fir
d400: 73 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20  st cell pointer 
d410: 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 46 72 65 65  */.    int nFree
d420: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d  ;         /* Num
d430: 62 65 72 20 6f 66 20 75 6e 75 73 65 64 20 62 79  ber of unused by
d440: 74 65 73 20 6f 6e 20 74 68 65 20 70 61 67 65 20  tes on the page 
d450: 2a 2f 0a 20 20 20 20 69 6e 74 20 74 6f 70 3b 20  */.    int top; 
d460: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
d470: 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 63  st byte of the c
d480: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
d490: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43 65 6c   */.    int iCel
d4a0: 6c 46 69 72 73 74 3b 20 20 20 20 2f 2a 20 46 69  lFirst;    /* Fi
d4b0: 72 73 74 20 61 6c 6c 6f 77 61 62 6c 65 20 63 65  rst allowable ce
d4c0: 6c 6c 20 6f 72 20 66 72 65 65 62 6c 6f 63 6b 20  ll or freeblock 
d4d0: 6f 66 66 73 65 74 20 2a 2f 0a 20 20 20 20 69 6e  offset */.    in
d4e0: 74 20 69 43 65 6c 6c 4c 61 73 74 3b 20 20 20 20  t iCellLast;    
d4f0: 20 2f 2a 20 4c 61 73 74 20 70 6f 73 73 69 62 6c   /* Last possibl
d500: 65 20 63 65 6c 6c 20 6f 72 20 66 72 65 65 62 6c  e cell or freebl
d510: 6f 63 6b 20 6f 66 66 73 65 74 20 2a 2f 0a 0a 20  ock offset */.. 
d520: 20 20 20 70 42 74 20 3d 20 70 50 61 67 65 2d 3e     pBt = pPage->
d530: 70 42 74 3b 0a 0a 20 20 20 20 68 64 72 20 3d 20  pBt;..    hdr = 
d540: 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
d550: 3b 0a 20 20 20 20 64 61 74 61 20 3d 20 70 50 61  ;.    data = pPa
d560: 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 2f  ge->aData;.    /
d570: 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
d580: 2d 32 38 35 39 34 2d 30 32 38 39 30 20 54 68 65  -28594-02890 The
d590: 20 6f 6e 65 2d 62 79 74 65 20 66 6c 61 67 20 61   one-byte flag a
d5a0: 74 20 6f 66 66 73 65 74 20 30 20 69 6e 64 69 63  t offset 0 indic
d5b0: 61 74 69 6e 67 0a 20 20 20 20 2a 2a 20 74 68 65  ating.    ** the
d5c0: 20 62 2d 74 72 65 65 20 70 61 67 65 20 74 79 70   b-tree page typ
d5d0: 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 64 65  e. */.    if( de
d5e0: 63 6f 64 65 46 6c 61 67 73 28 70 50 61 67 65 2c  codeFlags(pPage,
d5f0: 20 64 61 74 61 5b 68 64 72 5d 29 20 29 20 72 65   data[hdr]) ) re
d600: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
d610: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 61 73  UPT_BKPT;.    as
d620: 73 65 72 74 28 20 70 42 74 2d 3e 70 61 67 65 53  sert( pBt->pageS
d630: 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 42 74 2d  ize>=512 && pBt-
d640: 3e 70 61 67 65 53 69 7a 65 3c 3d 36 35 35 33 36  >pageSize<=65536
d650: 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d   );.    pPage->m
d660: 61 73 6b 50 61 67 65 20 3d 20 28 75 31 36 29 28  askPage = (u16)(
d670: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20  pBt->pageSize - 
d680: 31 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e  1);.    pPage->n
d690: 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20  Overflow = 0;.  
d6a0: 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70    usableSize = p
d6b0: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a  Bt->usableSize;.
d6c0: 20 20 20 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f      pPage->cellO
d6d0: 66 66 73 65 74 20 3d 20 63 65 6c 6c 4f 66 66 73  ffset = cellOffs
d6e0: 65 74 20 3d 20 68 64 72 20 2b 20 38 20 2b 20 70  et = hdr + 8 + p
d6f0: 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69  Page->childPtrSi
d700: 7a 65 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 61  ze;.    pPage->a
d710: 44 61 74 61 45 6e 64 20 3d 20 26 64 61 74 61 5b  DataEnd = &data[
d720: 75 73 61 62 6c 65 53 69 7a 65 5d 3b 0a 20 20 20  usableSize];.   
d730: 20 70 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64 78   pPage->aCellIdx
d740: 20 3d 20 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66   = &data[cellOff
d750: 73 65 74 5d 3b 0a 20 20 20 20 2f 2a 20 45 56 49  set];.    /* EVI
d760: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 38 30 31  DENCE-OF: R-5801
d770: 35 2d 34 38 31 37 35 20 54 68 65 20 74 77 6f 2d  5-48175 The two-
d780: 62 79 74 65 20 69 6e 74 65 67 65 72 20 61 74 20  byte integer at 
d790: 6f 66 66 73 65 74 20 35 20 64 65 73 69 67 6e 61  offset 5 designa
d7a0: 74 65 73 0a 20 20 20 20 2a 2a 20 74 68 65 20 73  tes.    ** the s
d7b0: 74 61 72 74 20 6f 66 20 74 68 65 20 63 65 6c 6c  tart of the cell
d7c0: 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 2e 20 41   content area. A
d7d0: 20 7a 65 72 6f 20 76 61 6c 75 65 20 66 6f 72 20   zero value for 
d7e0: 74 68 69 73 20 69 6e 74 65 67 65 72 20 69 73 0a  this integer is.
d7f0: 20 20 20 20 2a 2a 20 69 6e 74 65 72 70 72 65 74      ** interpret
d800: 65 64 20 61 73 20 36 35 35 33 36 2e 20 2a 2f 0a  ed as 65536. */.
d810: 20 20 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79      top = get2by
d820: 74 65 4e 6f 74 5a 65 72 6f 28 26 64 61 74 61 5b  teNotZero(&data[
d830: 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20 2f 2a 20  hdr+5]);.    /* 
d840: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33  EVIDENCE-OF: R-3
d850: 37 30 30 32 2d 33 32 37 37 34 20 54 68 65 20 74  7002-32774 The t
d860: 77 6f 2d 62 79 74 65 20 69 6e 74 65 67 65 72 20  wo-byte integer 
d870: 61 74 20 6f 66 66 73 65 74 20 33 20 67 69 76 65  at offset 3 give
d880: 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 6e 75 6d  s the.    ** num
d890: 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 6f 6e 20  ber of cells on 
d8a0: 74 68 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20  the page. */.   
d8b0: 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20   pPage->nCell = 
d8c0: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
d8d0: 64 72 2b 33 5d 29 3b 0a 20 20 20 20 69 66 28 20  dr+3]);.    if( 
d8e0: 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 4d 58 5f  pPage->nCell>MX_
d8f0: 43 45 4c 4c 28 70 42 74 29 20 29 7b 0a 20 20 20  CELL(pBt) ){.   
d900: 20 20 20 2f 2a 20 54 6f 20 6d 61 6e 79 20 63 65     /* To many ce
d910: 6c 6c 73 20 66 6f 72 20 61 20 73 69 6e 67 6c 65  lls for a single
d920: 20 70 61 67 65 2e 20 20 54 68 65 20 70 61 67 65   page.  The page
d930: 20 6d 75 73 74 20 62 65 20 63 6f 72 72 75 70 74   must be corrupt
d940: 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e   */.      return
d950: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
d960: 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20  BKPT;.    }.    
d970: 74 65 73 74 63 61 73 65 28 20 70 50 61 67 65 2d  testcase( pPage-
d980: 3e 6e 43 65 6c 6c 3d 3d 4d 58 5f 43 45 4c 4c 28  >nCell==MX_CELL(
d990: 70 42 74 29 20 29 3b 0a 20 20 20 20 2f 2a 20 45  pBt) );.    /* E
d9a0: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 34  VIDENCE-OF: R-24
d9b0: 30 38 39 2d 35 37 39 37 39 20 49 66 20 61 20 70  089-57979 If a p
d9c0: 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20  age contains no 
d9d0: 63 65 6c 6c 73 20 28 77 68 69 63 68 20 69 73 20  cells (which is 
d9e0: 6f 6e 6c 79 0a 20 20 20 20 2a 2a 20 70 6f 73 73  only.    ** poss
d9f0: 69 62 6c 65 20 66 6f 72 20 61 20 72 6f 6f 74 20  ible for a root 
da00: 70 61 67 65 20 6f 66 20 61 20 74 61 62 6c 65 20  page of a table 
da10: 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 6e 6f  that contains no
da20: 20 72 6f 77 73 29 20 74 68 65 6e 20 74 68 65 0a   rows) then the.
da30: 20 20 20 20 2a 2a 20 6f 66 66 73 65 74 20 74 6f      ** offset to
da40: 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
da50: 74 20 61 72 65 61 20 77 69 6c 6c 20 65 71 75 61  t area will equa
da60: 6c 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20  l the page size 
da70: 6d 69 6e 75 73 20 74 68 65 0a 20 20 20 20 2a 2a  minus the.    **
da80: 20 62 79 74 65 73 20 6f 66 20 72 65 73 65 72 76   bytes of reserv
da90: 65 64 20 73 70 61 63 65 2e 20 2a 2f 0a 20 20 20  ed space. */.   
daa0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
dab0: 6e 43 65 6c 6c 3e 30 20 7c 7c 20 74 6f 70 3d 3d  nCell>0 || top==
dac0: 75 73 61 62 6c 65 53 69 7a 65 20 7c 7c 20 43 4f  usableSize || CO
dad0: 52 52 55 50 54 5f 44 42 20 29 3b 0a 0a 20 20 20  RRUPT_DB );..   
dae0: 20 2f 2a 20 41 20 6d 61 6c 66 6f 72 6d 65 64 20   /* A malformed 
daf0: 64 61 74 61 62 61 73 65 20 70 61 67 65 20 6d 69  database page mi
db00: 67 68 74 20 63 61 75 73 65 20 75 73 20 74 6f 20  ght cause us to 
db10: 72 65 61 64 20 70 61 73 74 20 74 68 65 20 65 6e  read past the en
db20: 64 0a 20 20 20 20 2a 2a 20 6f 66 20 70 61 67 65  d.    ** of page
db30: 20 77 68 65 6e 20 70 61 72 73 69 6e 67 20 61 20   when parsing a 
db40: 63 65 6c 6c 2e 20 20 0a 20 20 20 20 2a 2a 0a 20  cell.  .    **. 
db50: 20 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77     ** The follow
db60: 69 6e 67 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64  ing block of cod
db70: 65 20 63 68 65 63 6b 73 20 65 61 72 6c 79 20 74  e checks early t
db80: 6f 20 73 65 65 20 69 66 20 61 20 63 65 6c 6c 20  o see if a cell 
db90: 65 78 74 65 6e 64 73 0a 20 20 20 20 2a 2a 20 70  extends.    ** p
dba0: 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61  ast the end of a
dbb0: 20 70 61 67 65 20 62 6f 75 6e 64 61 72 79 20 61   page boundary a
dbc0: 6e 64 20 63 61 75 73 65 73 20 53 51 4c 49 54 45  nd causes SQLITE
dbd0: 5f 43 4f 52 52 55 50 54 20 74 6f 20 62 65 20 0a  _CORRUPT to be .
dbe0: 20 20 20 20 2a 2a 20 72 65 74 75 72 6e 65 64 20      ** returned 
dbf0: 69 66 20 69 74 20 64 6f 65 73 2e 0a 20 20 20 20  if it does..    
dc00: 2a 2f 0a 20 20 20 20 69 43 65 6c 6c 46 69 72 73  */.    iCellFirs
dc10: 74 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b  t = cellOffset +
dc20: 20 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b   2*pPage->nCell;
dc30: 0a 20 20 20 20 69 43 65 6c 6c 4c 61 73 74 20 3d  .    iCellLast =
dc40: 20 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b   usableSize - 4;
dc50: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
dc60: 49 54 45 5f 45 4e 41 42 4c 45 5f 4f 56 45 52 53  ITE_ENABLE_OVERS
dc70: 49 5a 45 5f 43 45 4c 4c 5f 43 48 45 43 4b 29 0a  IZE_CELL_CHECK).
dc80: 20 20 20 20 7b 0a 20 20 20 20 20 20 69 6e 74 20      {.      int 
dc90: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  i;            /*
dca0: 20 49 6e 64 65 78 20 69 6e 74 6f 20 74 68 65 20   Index into the 
dcb0: 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 72  cell pointer arr
dcc0: 61 79 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  ay */.      int 
dcd0: 73 7a 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  sz;           /*
dce0: 20 53 69 7a 65 20 6f 66 20 61 20 63 65 6c 6c 20   Size of a cell 
dcf0: 2a 2f 0a 0a 20 20 20 20 20 20 69 66 28 20 21 70  */..      if( !p
dd00: 50 61 67 65 2d 3e 6c 65 61 66 20 29 20 69 43 65  Page->leaf ) iCe
dd10: 6c 6c 4c 61 73 74 2d 2d 3b 0a 20 20 20 20 20 20  llLast--;.      
dd20: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 67 65  for(i=0; i<pPage
dd30: 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20  ->nCell; i++){. 
dd40: 20 20 20 20 20 20 20 70 63 20 3d 20 67 65 74 32         pc = get2
dd50: 62 79 74 65 28 26 64 61 74 61 5b 63 65 6c 6c 4f  byte(&data[cellO
dd60: 66 66 73 65 74 2b 69 2a 32 5d 29 3b 0a 20 20 20  ffset+i*2]);.   
dd70: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
dd80: 63 3d 3d 69 43 65 6c 6c 46 69 72 73 74 20 29 3b  c==iCellFirst );
dd90: 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
dda0: 65 28 20 70 63 3d 3d 69 43 65 6c 6c 4c 61 73 74  e( pc==iCellLast
ddb0: 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
ddc0: 70 63 3c 69 43 65 6c 6c 46 69 72 73 74 20 7c 7c  pc<iCellFirst ||
ddd0: 20 70 63 3e 69 43 65 6c 6c 4c 61 73 74 20 29 7b   pc>iCellLast ){
dde0: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
ddf0: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
de00: 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 7d  _BKPT;.        }
de10: 0a 20 20 20 20 20 20 20 20 73 7a 20 3d 20 63 65  .        sz = ce
de20: 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c  llSizePtr(pPage,
de30: 20 26 64 61 74 61 5b 70 63 5d 29 3b 0a 20 20 20   &data[pc]);.   
de40: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
de50: 63 2b 73 7a 3d 3d 75 73 61 62 6c 65 53 69 7a 65  c+sz==usableSize
de60: 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
de70: 70 63 2b 73 7a 3e 75 73 61 62 6c 65 53 69 7a 65  pc+sz>usableSize
de80: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
de90: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
dea0: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
deb0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
dec0: 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
ded0: 61 66 20 29 20 69 43 65 6c 6c 4c 61 73 74 2b 2b  af ) iCellLast++
dee0: 3b 0a 20 20 20 20 7d 20 20 0a 23 65 6e 64 69 66  ;.    }  .#endif
def0: 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65  ..    /* Compute
df00: 20 74 68 65 20 74 6f 74 61 6c 20 66 72 65 65 20   the total free 
df10: 73 70 61 63 65 20 6f 6e 20 74 68 65 20 70 61 67  space on the pag
df20: 65 0a 20 20 20 20 2a 2a 20 45 56 49 44 45 4e 43  e.    ** EVIDENC
df30: 45 2d 4f 46 3a 20 52 2d 32 33 35 38 38 2d 33 34  E-OF: R-23588-34
df40: 34 35 30 20 54 68 65 20 74 77 6f 2d 62 79 74 65  450 The two-byte
df50: 20 69 6e 74 65 67 65 72 20 61 74 20 6f 66 66 73   integer at offs
df60: 65 74 20 31 20 67 69 76 65 73 20 74 68 65 0a 20  et 1 gives the. 
df70: 20 20 20 2a 2a 20 73 74 61 72 74 20 6f 66 20 74     ** start of t
df80: 68 65 20 66 69 72 73 74 20 66 72 65 65 62 6c 6f  he first freeblo
df90: 63 6b 20 6f 6e 20 74 68 65 20 70 61 67 65 2c 20  ck on the page, 
dfa0: 6f 72 20 69 73 20 7a 65 72 6f 20 69 66 20 74 68  or is zero if th
dfb0: 65 72 65 20 61 72 65 20 6e 6f 0a 20 20 20 20 2a  ere are no.    *
dfc0: 2a 20 66 72 65 65 62 6c 6f 63 6b 73 2e 20 2a 2f  * freeblocks. */
dfd0: 0a 20 20 20 20 70 63 20 3d 20 67 65 74 32 62 79  .    pc = get2by
dfe0: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 29  te(&data[hdr+1])
dff0: 3b 0a 20 20 20 20 6e 46 72 65 65 20 3d 20 64 61  ;.    nFree = da
e000: 74 61 5b 68 64 72 2b 37 5d 20 2b 20 74 6f 70 3b  ta[hdr+7] + top;
e010: 20 20 2f 2a 20 49 6e 69 74 20 6e 46 72 65 65 20    /* Init nFree 
e020: 74 6f 20 6e 6f 6e 2d 66 72 65 65 62 6c 6f 63 6b  to non-freeblock
e030: 20 66 72 65 65 20 73 70 61 63 65 20 2a 2f 0a 20   free space */. 
e040: 20 20 20 77 68 69 6c 65 28 20 70 63 3e 30 20 29     while( pc>0 )
e050: 7b 0a 20 20 20 20 20 20 75 31 36 20 6e 65 78 74  {.      u16 next
e060: 2c 20 73 69 7a 65 3b 0a 20 20 20 20 20 20 69 66  , size;.      if
e070: 28 20 70 63 3c 69 43 65 6c 6c 46 69 72 73 74 20  ( pc<iCellFirst 
e080: 7c 7c 20 70 63 3e 69 43 65 6c 6c 4c 61 73 74 20  || pc>iCellLast 
e090: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 56  ){.        /* EV
e0a0: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 35 35  IDENCE-OF: R-555
e0b0: 33 30 2d 35 32 39 33 30 20 49 6e 20 61 20 77 65  30-52930 In a we
e0c0: 6c 6c 2d 66 6f 72 6d 65 64 20 62 2d 74 72 65 65  ll-formed b-tree
e0d0: 20 70 61 67 65 2c 20 74 68 65 72 65 20 77 69 6c   page, there wil
e0e0: 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 77  l.        ** alw
e0f0: 61 79 73 20 62 65 20 61 74 20 6c 65 61 73 74 20  ays be at least 
e100: 6f 6e 65 20 63 65 6c 6c 20 62 65 66 6f 72 65 20  one cell before 
e110: 74 68 65 20 66 69 72 73 74 20 66 72 65 65 62 6c  the first freebl
e120: 6f 63 6b 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a  ock..        **.
e130: 20 20 20 20 20 20 20 20 2a 2a 20 4f 72 2c 20 74          ** Or, t
e140: 68 65 20 66 72 65 65 62 6c 6f 63 6b 20 69 73 20  he freeblock is 
e150: 6f 66 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74  off the end of t
e160: 68 65 20 70 61 67 65 0a 20 20 20 20 20 20 20 20  he page.        
e170: 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  */.        retur
e180: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
e190: 5f 42 4b 50 54 3b 20 0a 20 20 20 20 20 20 7d 0a  _BKPT; .      }.
e1a0: 20 20 20 20 20 20 6e 65 78 74 20 3d 20 67 65 74        next = get
e1b0: 32 62 79 74 65 28 26 64 61 74 61 5b 70 63 5d 29  2byte(&data[pc])
e1c0: 3b 0a 20 20 20 20 20 20 73 69 7a 65 20 3d 20 67  ;.      size = g
e1d0: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 63  et2byte(&data[pc
e1e0: 2b 32 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20  +2]);.      if( 
e1f0: 28 6e 65 78 74 3e 30 20 26 26 20 6e 65 78 74 3c  (next>0 && next<
e200: 3d 70 63 2b 73 69 7a 65 2b 33 29 20 7c 7c 20 70  =pc+size+3) || p
e210: 63 2b 73 69 7a 65 3e 75 73 61 62 6c 65 53 69 7a  c+size>usableSiz
e220: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  e ){.        /* 
e230: 46 72 65 65 20 62 6c 6f 63 6b 73 20 6d 75 73 74  Free blocks must
e240: 20 62 65 20 69 6e 20 61 73 63 65 6e 64 69 6e 67   be in ascending
e250: 20 6f 72 64 65 72 2e 20 41 6e 64 20 74 68 65 20   order. And the 
e260: 6c 61 73 74 20 62 79 74 65 20 6f 66 0a 20 20 20  last byte of.   
e270: 20 20 20 20 20 2a 2a 20 74 68 65 20 66 72 65 65       ** the free
e280: 2d 62 6c 6f 63 6b 20 6d 75 73 74 20 6c 69 65 20  -block must lie 
e290: 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
e2a0: 70 61 67 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20  page.  */.      
e2b0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
e2c0: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20  CORRUPT_BKPT; . 
e2d0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 46 72       }.      nFr
e2e0: 65 65 20 3d 20 6e 46 72 65 65 20 2b 20 73 69 7a  ee = nFree + siz
e2f0: 65 3b 0a 20 20 20 20 20 20 70 63 20 3d 20 6e 65  e;.      pc = ne
e300: 78 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  xt;.    }..    /
e310: 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c  * At this point,
e320: 20 6e 46 72 65 65 20 63 6f 6e 74 61 69 6e 73 20   nFree contains 
e330: 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20 6f  the sum of the o
e340: 66 66 73 65 74 20 74 6f 20 74 68 65 20 73 74 61  ffset to the sta
e350: 72 74 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  rt.    ** of the
e360: 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 20 61 72   cell-content ar
e370: 65 61 20 70 6c 75 73 20 74 68 65 20 6e 75 6d 62  ea plus the numb
e380: 65 72 20 6f 66 20 66 72 65 65 20 62 79 74 65 73  er of free bytes
e390: 20 77 69 74 68 69 6e 0a 20 20 20 20 2a 2a 20 74   within.    ** t
e3a0: 68 65 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 20  he cell-content 
e3b0: 61 72 65 61 2e 20 49 66 20 74 68 69 73 20 69 73  area. If this is
e3c0: 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
e3d0: 65 20 75 73 61 62 6c 65 2d 73 69 7a 65 0a 20 20  e usable-size.  
e3e0: 20 20 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65    ** of the page
e3f0: 2c 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20  , then the page 
e400: 6d 75 73 74 20 62 65 20 63 6f 72 72 75 70 74 65  must be corrupte
e410: 64 2e 20 54 68 69 73 20 63 68 65 63 6b 20 61 6c  d. This check al
e420: 73 6f 0a 20 20 20 20 2a 2a 20 73 65 72 76 65 73  so.    ** serves
e430: 20 74 6f 20 76 65 72 69 66 79 20 74 68 61 74 20   to verify that 
e440: 74 68 65 20 6f 66 66 73 65 74 20 74 6f 20 74 68  the offset to th
e450: 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 63  e start of the c
e460: 65 6c 6c 2d 63 6f 6e 74 65 6e 74 0a 20 20 20 20  ell-content.    
e470: 2a 2a 20 61 72 65 61 2c 20 61 63 63 6f 72 64 69  ** area, accordi
e480: 6e 67 20 74 6f 20 74 68 65 20 70 61 67 65 20 68  ng to the page h
e490: 65 61 64 65 72 2c 20 6c 69 65 73 20 77 69 74 68  eader, lies with
e4a0: 69 6e 20 74 68 65 20 70 61 67 65 2e 0a 20 20 20  in the page..   
e4b0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 46 72 65   */.    if( nFre
e4c0: 65 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a  e>usableSize ){.
e4d0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
e4e0: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
e4f0: 3b 20 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61  ; .    }.    pPa
e500: 67 65 2d 3e 6e 46 72 65 65 20 3d 20 28 75 31 36  ge->nFree = (u16
e510: 29 28 6e 46 72 65 65 20 2d 20 69 43 65 6c 6c 46  )(nFree - iCellF
e520: 69 72 73 74 29 3b 0a 20 20 20 20 70 50 61 67 65  irst);.    pPage
e530: 2d 3e 69 73 49 6e 69 74 20 3d 20 31 3b 0a 20 20  ->isInit = 1;.  
e540: 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
e550: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  E_OK;.}../*.** S
e560: 65 74 20 75 70 20 61 20 72 61 77 20 70 61 67 65  et up a raw page
e570: 20 73 6f 20 74 68 61 74 20 69 74 20 6c 6f 6f 6b   so that it look
e580: 73 20 6c 69 6b 65 20 61 20 64 61 74 61 62 61 73  s like a databas
e590: 65 20 70 61 67 65 20 68 6f 6c 64 69 6e 67 0a 2a  e page holding.*
e5a0: 2a 20 6e 6f 20 65 6e 74 72 69 65 73 2e 0a 2a 2f  * no entries..*/
e5b0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 7a 65 72  .static void zer
e5c0: 6f 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70  oPage(MemPage *p
e5d0: 50 61 67 65 2c 20 69 6e 74 20 66 6c 61 67 73 29  Page, int flags)
e5e0: 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  {.  unsigned cha
e5f0: 72 20 2a 64 61 74 61 20 3d 20 70 50 61 67 65 2d  r *data = pPage-
e600: 3e 61 44 61 74 61 3b 0a 20 20 42 74 53 68 61 72  >aData;.  BtShar
e610: 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d  ed *pBt = pPage-
e620: 3e 70 42 74 3b 0a 20 20 75 38 20 68 64 72 20 3d  >pBt;.  u8 hdr =
e630: 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65   pPage->hdrOffse
e640: 74 3b 0a 20 20 75 31 36 20 66 69 72 73 74 3b 0a  t;.  u16 first;.
e650: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
e660: 65 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62 65  e3PagerPagenumbe
e670: 72 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  r(pPage->pDbPage
e680: 29 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20 29  )==pPage->pgno )
e690: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
e6a0: 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61  te3PagerGetExtra
e6b0: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
e6c0: 20 3d 3d 20 28 76 6f 69 64 2a 29 70 50 61 67 65   == (void*)pPage
e6d0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
e6e0: 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74  lite3PagerGetDat
e6f0: 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  a(pPage->pDbPage
e700: 29 20 3d 3d 20 64 61 74 61 20 29 3b 0a 20 20 61  ) == data );.  a
e710: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
e720: 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
e730: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
e740: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
e750: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
e760: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
e770: 69 66 28 20 70 42 74 2d 3e 62 74 73 46 6c 61 67  if( pBt->btsFlag
e780: 73 20 26 20 42 54 53 5f 53 45 43 55 52 45 5f 44  s & BTS_SECURE_D
e790: 45 4c 45 54 45 20 29 7b 0a 20 20 20 20 6d 65 6d  ELETE ){.    mem
e7a0: 73 65 74 28 26 64 61 74 61 5b 68 64 72 5d 2c 20  set(&data[hdr], 
e7b0: 30 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  0, pBt->usableSi
e7c0: 7a 65 20 2d 20 68 64 72 29 3b 0a 20 20 7d 0a 20  ze - hdr);.  }. 
e7d0: 20 64 61 74 61 5b 68 64 72 5d 20 3d 20 28 63 68   data[hdr] = (ch
e7e0: 61 72 29 66 6c 61 67 73 3b 0a 20 20 66 69 72 73  ar)flags;.  firs
e7f0: 74 20 3d 20 68 64 72 20 2b 20 28 28 66 6c 61 67  t = hdr + ((flag
e800: 73 26 50 54 46 5f 4c 45 41 46 29 3d 3d 30 20 3f  s&PTF_LEAF)==0 ?
e810: 20 31 32 20 3a 20 38 29 3b 0a 20 20 6d 65 6d 73   12 : 8);.  mems
e820: 65 74 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 2c  et(&data[hdr+1],
e830: 20 30 2c 20 34 29 3b 0a 20 20 64 61 74 61 5b 68   0, 4);.  data[h
e840: 64 72 2b 37 5d 20 3d 20 30 3b 0a 20 20 70 75 74  dr+7] = 0;.  put
e850: 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
e860: 35 5d 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  5], pBt->usableS
e870: 69 7a 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e  ize);.  pPage->n
e880: 46 72 65 65 20 3d 20 28 75 31 36 29 28 70 42 74  Free = (u16)(pBt
e890: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 66  ->usableSize - f
e8a0: 69 72 73 74 29 3b 0a 20 20 64 65 63 6f 64 65 46  irst);.  decodeF
e8b0: 6c 61 67 73 28 70 50 61 67 65 2c 20 66 6c 61 67  lags(pPage, flag
e8c0: 73 29 3b 0a 20 20 70 50 61 67 65 2d 3e 63 65 6c  s);.  pPage->cel
e8d0: 6c 4f 66 66 73 65 74 20 3d 20 66 69 72 73 74 3b  lOffset = first;
e8e0: 0a 20 20 70 50 61 67 65 2d 3e 61 44 61 74 61 45  .  pPage->aDataE
e8f0: 6e 64 20 3d 20 26 64 61 74 61 5b 70 42 74 2d 3e  nd = &data[pBt->
e900: 75 73 61 62 6c 65 53 69 7a 65 5d 3b 0a 20 20 70  usableSize];.  p
e910: 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64 78 20 3d  Page->aCellIdx =
e920: 20 26 64 61 74 61 5b 66 69 72 73 74 5d 3b 0a 20   &data[first];. 
e930: 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
e940: 77 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28  w = 0;.  assert(
e950: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3d   pBt->pageSize>=
e960: 35 31 32 20 26 26 20 70 42 74 2d 3e 70 61 67 65  512 && pBt->page
e970: 53 69 7a 65 3c 3d 36 35 35 33 36 20 29 3b 0a 20  Size<=65536 );. 
e980: 20 70 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65   pPage->maskPage
e990: 20 3d 20 28 75 31 36 29 28 70 42 74 2d 3e 70 61   = (u16)(pBt->pa
e9a0: 67 65 53 69 7a 65 20 2d 20 31 29 3b 0a 20 20 70  geSize - 1);.  p
e9b0: 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 30 3b  Page->nCell = 0;
e9c0: 0a 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  .  pPage->isInit
e9d0: 20 3d 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20   = 1;.}.../*.** 
e9e0: 43 6f 6e 76 65 72 74 20 61 20 44 62 50 61 67 65  Convert a DbPage
e9f0: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 74   obtained from t
ea00: 68 65 20 70 61 67 65 72 20 69 6e 74 6f 20 61 20  he pager into a 
ea10: 4d 65 6d 50 61 67 65 20 75 73 65 64 20 62 79 0a  MemPage used by.
ea20: 2a 2a 20 74 68 65 20 62 74 72 65 65 20 6c 61 79  ** the btree lay
ea30: 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4d 65  er..*/.static Me
ea40: 6d 50 61 67 65 20 2a 62 74 72 65 65 50 61 67 65  mPage *btreePage
ea50: 46 72 6f 6d 44 62 50 61 67 65 28 44 62 50 61 67  FromDbPage(DbPag
ea60: 65 20 2a 70 44 62 50 61 67 65 2c 20 50 67 6e 6f  e *pDbPage, Pgno
ea70: 20 70 67 6e 6f 2c 20 42 74 53 68 61 72 65 64 20   pgno, BtShared 
ea80: 2a 70 42 74 29 7b 0a 20 20 4d 65 6d 50 61 67 65  *pBt){.  MemPage
ea90: 20 2a 70 50 61 67 65 20 3d 20 28 4d 65 6d 50 61   *pPage = (MemPa
eaa0: 67 65 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72  ge*)sqlite3Pager
eab0: 47 65 74 45 78 74 72 61 28 70 44 62 50 61 67 65  GetExtra(pDbPage
eac0: 29 3b 0a 20 20 70 50 61 67 65 2d 3e 61 44 61 74  );.  pPage->aDat
ead0: 61 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  a = sqlite3Pager
eae0: 47 65 74 44 61 74 61 28 70 44 62 50 61 67 65 29  GetData(pDbPage)
eaf0: 3b 0a 20 20 70 50 61 67 65 2d 3e 70 44 62 50 61  ;.  pPage->pDbPa
eb00: 67 65 20 3d 20 70 44 62 50 61 67 65 3b 0a 20 20  ge = pDbPage;.  
eb10: 70 50 61 67 65 2d 3e 70 42 74 20 3d 20 70 42 74  pPage->pBt = pBt
eb20: 3b 0a 20 20 70 50 61 67 65 2d 3e 70 67 6e 6f 20  ;.  pPage->pgno 
eb30: 3d 20 70 67 6e 6f 3b 0a 20 20 70 50 61 67 65 2d  = pgno;.  pPage-
eb40: 3e 68 64 72 4f 66 66 73 65 74 20 3d 20 70 50 61  >hdrOffset = pPa
eb50: 67 65 2d 3e 70 67 6e 6f 3d 3d 31 20 3f 20 31 30  ge->pgno==1 ? 10
eb60: 30 20 3a 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  0 : 0;.  return 
eb70: 70 50 61 67 65 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a  pPage; .}../*.**
eb80: 20 47 65 74 20 61 20 70 61 67 65 20 66 72 6f 6d   Get a page from
eb90: 20 74 68 65 20 70 61 67 65 72 2e 20 20 49 6e 69   the pager.  Ini
eba0: 74 69 61 6c 69 7a 65 20 74 68 65 20 4d 65 6d 50  tialize the MemP
ebb0: 61 67 65 2e 70 42 74 20 61 6e 64 0a 2a 2a 20 4d  age.pBt and.** M
ebc0: 65 6d 50 61 67 65 2e 61 44 61 74 61 20 65 6c 65  emPage.aData ele
ebd0: 6d 65 6e 74 73 20 69 66 20 6e 65 65 64 65 64 2e  ments if needed.
ebe0: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 6f  .**.** If the no
ebf0: 43 6f 6e 74 65 6e 74 20 66 6c 61 67 20 69 73 20  Content flag is 
ec00: 73 65 74 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  set, it means th
ec10: 61 74 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72  at we do not car
ec20: 65 20 61 62 6f 75 74 0a 2a 2a 20 74 68 65 20 63  e about.** the c
ec30: 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61  ontent of the pa
ec40: 67 65 20 61 74 20 74 68 69 73 20 74 69 6d 65 2e  ge at this time.
ec50: 20 20 53 6f 20 64 6f 20 6e 6f 74 20 67 6f 20 74    So do not go t
ec60: 6f 20 74 68 65 20 64 69 73 6b 0a 2a 2a 20 74 6f  o the disk.** to
ec70: 20 66 65 74 63 68 20 74 68 65 20 63 6f 6e 74 65   fetch the conte
ec80: 6e 74 2e 20 20 4a 75 73 74 20 66 69 6c 6c 20 69  nt.  Just fill i
ec90: 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 77 69  n the content wi
eca0: 74 68 20 7a 65 72 6f 73 20 66 6f 72 20 6e 6f 77  th zeros for now
ecb0: 2e 0a 2a 2a 20 49 66 20 69 6e 20 74 68 65 20 66  ..** If in the f
ecc0: 75 74 75 72 65 20 77 65 20 63 61 6c 6c 20 73 71  uture we call sq
ecd0: 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
ece0: 29 20 6f 6e 20 74 68 69 73 20 70 61 67 65 2c 20  ) on this page, 
ecf0: 74 68 61 74 0a 2a 2a 20 6d 65 61 6e 73 20 77 65  that.** means we
ed00: 20 68 61 76 65 20 73 74 61 72 74 65 64 20 74 6f   have started to
ed10: 20 62 65 20 63 6f 6e 63 65 72 6e 65 64 20 61 62   be concerned ab
ed20: 6f 75 74 20 63 6f 6e 74 65 6e 74 20 61 6e 64 20  out content and 
ed30: 74 68 65 20 64 69 73 6b 0a 2a 2a 20 72 65 61 64  the disk.** read
ed40: 20 73 68 6f 75 6c 64 20 6f 63 63 75 72 20 61 74   should occur at
ed50: 20 74 68 61 74 20 70 6f 69 6e 74 2e 0a 2a 2f 0a   that point..*/.
ed60: 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65  static int btree
ed70: 47 65 74 50 61 67 65 28 0a 20 20 42 74 53 68 61  GetPage(.  BtSha
ed80: 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20  red *pBt,       
ed90: 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a  /* The btree */.
eda0: 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20    Pgno pgno,    
edb0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
edc0: 20 6f 66 20 74 68 65 20 70 61 67 65 20 74 6f 20   of the page to 
edd0: 66 65 74 63 68 20 2a 2f 0a 20 20 4d 65 6d 50 61  fetch */.  MemPa
ede0: 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20  ge **ppPage,    
edf0: 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70 61  /* Return the pa
ee00: 67 65 20 69 6e 20 74 68 69 73 20 70 61 72 61 6d  ge in this param
ee10: 65 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 66 6c  eter */.  int fl
ee20: 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20 2f  ags            /
ee30: 2a 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f  * PAGER_GET_NOCO
ee40: 4e 54 45 4e 54 20 6f 72 20 50 41 47 45 52 5f 47  NTENT or PAGER_G
ee50: 45 54 5f 52 45 41 44 4f 4e 4c 59 20 2a 2f 0a 29  ET_READONLY */.)
ee60: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 44 62  {.  int rc;.  Db
ee70: 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 0a  Page *pDbPage;..
ee80: 20 20 61 73 73 65 72 74 28 20 66 6c 61 67 73 3d    assert( flags=
ee90: 3d 30 20 7c 7c 20 66 6c 61 67 73 3d 3d 50 41 47  =0 || flags==PAG
eea0: 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54  ER_GET_NOCONTENT
eeb0: 20 7c 7c 20 66 6c 61 67 73 3d 3d 50 41 47 45 52   || flags==PAGER
eec0: 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20 29 3b  _GET_READONLY );
eed0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
eee0: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
eef0: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72  t->mutex) );.  r
ef00: 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
ef10: 41 63 71 75 69 72 65 28 70 42 74 2d 3e 70 50 61  Acquire(pBt->pPa
ef20: 67 65 72 2c 20 70 67 6e 6f 2c 20 28 44 62 50 61  ger, pgno, (DbPa
ef30: 67 65 2a 2a 29 26 70 44 62 50 61 67 65 2c 20 66  ge**)&pDbPage, f
ef40: 6c 61 67 73 29 3b 0a 20 20 69 66 28 20 72 63 20  lags);.  if( rc 
ef50: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 2a  ) return rc;.  *
ef60: 70 70 50 61 67 65 20 3d 20 62 74 72 65 65 50 61  ppPage = btreePa
ef70: 67 65 46 72 6f 6d 44 62 50 61 67 65 28 70 44 62  geFromDbPage(pDb
ef80: 50 61 67 65 2c 20 70 67 6e 6f 2c 20 70 42 74 29  Page, pgno, pBt)
ef90: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
efa0: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  E_OK;.}../*.** R
efb0: 65 74 72 69 65 76 65 20 61 20 70 61 67 65 20 66  etrieve a page f
efc0: 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20 63 61  rom the pager ca
efd0: 63 68 65 2e 20 49 66 20 74 68 65 20 72 65 71 75  che. If the requ
efe0: 65 73 74 65 64 20 70 61 67 65 20 69 73 20 6e 6f  ested page is no
eff0: 74 0a 2a 2a 20 61 6c 72 65 61 64 79 20 69 6e 20  t.** already in 
f000: 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65 20  the pager cache 
f010: 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 20 49 6e 69  return NULL. Ini
f020: 74 69 61 6c 69 7a 65 20 74 68 65 20 4d 65 6d 50  tialize the MemP
f030: 61 67 65 2e 70 42 74 20 61 6e 64 0a 2a 2a 20 4d  age.pBt and.** M
f040: 65 6d 50 61 67 65 2e 61 44 61 74 61 20 65 6c 65  emPage.aData ele
f050: 6d 65 6e 74 73 20 69 66 20 6e 65 65 64 65 64 2e  ments if needed.
f060: 0a 2a 2f 0a 73 74 61 74 69 63 20 4d 65 6d 50 61  .*/.static MemPa
f070: 67 65 20 2a 62 74 72 65 65 50 61 67 65 4c 6f 6f  ge *btreePageLoo
f080: 6b 75 70 28 42 74 53 68 61 72 65 64 20 2a 70 42  kup(BtShared *pB
f090: 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20  t, Pgno pgno){. 
f0a0: 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65   DbPage *pDbPage
f0b0: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
f0c0: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
f0d0: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
f0e0: 70 44 62 50 61 67 65 20 3d 20 73 71 6c 69 74 65  pDbPage = sqlite
f0f0: 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 70 42 74  3PagerLookup(pBt
f100: 2d 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b  ->pPager, pgno);
f110: 0a 20 20 69 66 28 20 70 44 62 50 61 67 65 20 29  .  if( pDbPage )
f120: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 62 74 72  {.    return btr
f130: 65 65 50 61 67 65 46 72 6f 6d 44 62 50 61 67 65  eePageFromDbPage
f140: 28 70 44 62 50 61 67 65 2c 20 70 67 6e 6f 2c 20  (pDbPage, pgno, 
f150: 70 42 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  pBt);.  }.  retu
f160: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  rn 0;.}../*.** R
f170: 65 74 75 72 6e 20 74 68 65 20 73 69 7a 65 20 6f  eturn the size o
f180: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
f190: 69 6c 65 20 69 6e 20 70 61 67 65 73 2e 20 49 66  ile in pages. If
f1a0: 20 74 68 65 72 65 20 69 73 20 61 6e 79 20 6b 69   there is any ki
f1b0: 6e 64 20 6f 66 0a 2a 2a 20 65 72 72 6f 72 2c 20  nd of.** error, 
f1c0: 72 65 74 75 72 6e 20 28 28 75 6e 73 69 67 6e 65  return ((unsigne
f1d0: 64 20 69 6e 74 29 2d 31 29 2e 0a 2a 2f 0a 73 74  d int)-1)..*/.st
f1e0: 61 74 69 63 20 50 67 6e 6f 20 62 74 72 65 65 50  atic Pgno btreeP
f1f0: 61 67 65 63 6f 75 6e 74 28 42 74 53 68 61 72 65  agecount(BtShare
f200: 64 20 2a 70 42 74 29 7b 0a 20 20 72 65 74 75 72  d *pBt){.  retur
f210: 6e 20 70 42 74 2d 3e 6e 50 61 67 65 3b 0a 7d 0a  n pBt->nPage;.}.
f220: 75 33 32 20 73 71 6c 69 74 65 33 42 74 72 65 65  u32 sqlite3Btree
f230: 4c 61 73 74 50 61 67 65 28 42 74 72 65 65 20 2a  LastPage(Btree *
f240: 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71  p){.  assert( sq
f250: 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d  lite3BtreeHoldsM
f260: 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61 73 73  utex(p) );.  ass
f270: 65 72 74 28 20 28 28 70 2d 3e 70 42 74 2d 3e 6e  ert( ((p->pBt->n
f280: 50 61 67 65 29 26 30 78 38 30 30 30 30 30 30 29  Page)&0x8000000)
f290: 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  ==0 );.  return 
f2a0: 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70  btreePagecount(p
f2b0: 2d 3e 70 42 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ->pBt);.}../*.**
f2c0: 20 47 65 74 20 61 20 70 61 67 65 20 66 72 6f 6d   Get a page from
f2d0: 20 74 68 65 20 70 61 67 65 72 20 61 6e 64 20 69   the pager and i
f2e0: 6e 69 74 69 61 6c 69 7a 65 20 69 74 2e 20 20 54  nitialize it.  T
f2f0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6a  his routine is j
f300: 75 73 74 20 61 0a 2a 2a 20 63 6f 6e 76 65 6e 69  ust a.** conveni
f310: 65 6e 63 65 20 77 72 61 70 70 65 72 20 61 72 6f  ence wrapper aro
f320: 75 6e 64 20 73 65 70 61 72 61 74 65 20 63 61 6c  und separate cal
f330: 6c 73 20 74 6f 20 62 74 72 65 65 47 65 74 50 61  ls to btreeGetPa
f340: 67 65 28 29 20 61 6e 64 20 0a 2a 2a 20 62 74 72  ge() and .** btr
f350: 65 65 49 6e 69 74 50 61 67 65 28 29 2e 0a 2a 2a  eeInitPage()..**
f360: 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
f370: 6f 63 63 75 72 73 2c 20 74 68 65 6e 20 74 68 65  occurs, then the
f380: 20 76 61 6c 75 65 20 2a 70 70 50 61 67 65 20 69   value *ppPage i
f390: 73 20 73 65 74 20 74 6f 20 69 73 20 75 6e 64 65  s set to is unde
f3a0: 66 69 6e 65 64 2e 20 49 74 0a 2a 2a 20 6d 61 79  fined. It.** may
f3b0: 20 72 65 6d 61 69 6e 20 75 6e 63 68 61 6e 67 65   remain unchange
f3c0: 64 2c 20 6f 72 20 69 74 20 6d 61 79 20 62 65 20  d, or it may be 
f3d0: 73 65 74 20 74 6f 20 61 6e 20 69 6e 76 61 6c 69  set to an invali
f3e0: 64 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74  d value..*/.stat
f3f0: 69 63 20 69 6e 74 20 67 65 74 41 6e 64 49 6e 69  ic int getAndIni
f400: 74 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65  tPage(.  BtShare
f410: 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20  d *pBt,         
f420: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
f430: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
f440: 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20  .  Pgno pgno,   
f450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f460: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
f470: 74 68 65 20 70 61 67 65 20 74 6f 20 67 65 74 20  the page to get 
f480: 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70  */.  MemPage **p
f490: 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20  pPage,          
f4a0: 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68       /* Write th
f4b0: 65 20 70 61 67 65 20 70 6f 69 6e 74 65 72 20 68  e page pointer h
f4c0: 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 62 52 65  ere */.  int bRe
f4d0: 61 64 6f 6e 6c 79 20 20 20 20 20 20 20 20 20 20  adonly          
f4e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 41 47 45           /* PAGE
f4f0: 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20 6f  R_GET_READONLY o
f500: 72 20 30 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  r 0 */.){.  int 
f510: 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  rc;.  assert( sq
f520: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
f530: 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
f540: 20 20 61 73 73 65 72 74 28 20 62 52 65 61 64 6f    assert( bReado
f550: 6e 6c 79 3d 3d 50 41 47 45 52 5f 47 45 54 5f 52  nly==PAGER_GET_R
f560: 45 41 44 4f 4e 4c 59 20 7c 7c 20 62 52 65 61 64  EADONLY || bRead
f570: 6f 6e 6c 79 3d 3d 30 20 29 3b 0a 0a 20 20 69 66  only==0 );..  if
f580: 28 20 70 67 6e 6f 3e 62 74 72 65 65 50 61 67 65  ( pgno>btreePage
f590: 63 6f 75 6e 74 28 70 42 74 29 20 29 7b 0a 20 20  count(pBt) ){.  
f5a0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
f5b0: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 65  RRUPT_BKPT;.  }e
f5c0: 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 62 74  lse{.    rc = bt
f5d0: 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
f5e0: 70 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 62 52  pgno, ppPage, bR
f5f0: 65 61 64 6f 6e 6c 79 29 3b 0a 20 20 20 20 69 66  eadonly);.    if
f600: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
f610: 26 26 20 28 2a 70 70 50 61 67 65 29 2d 3e 69 73  && (*ppPage)->is
f620: 49 6e 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Init==0 ){.     
f630: 20 72 63 20 3d 20 62 74 72 65 65 49 6e 69 74 50   rc = btreeInitP
f640: 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20  age(*ppPage);.  
f650: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
f660: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
f670: 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70   releasePage(*pp
f680: 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Page);.      }. 
f690: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 74 65 73 74     }.  }..  test
f6a0: 63 61 73 65 28 20 70 67 6e 6f 3d 3d 30 20 29 3b  case( pgno==0 );
f6b0: 0a 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 21  .  assert( pgno!
f6c0: 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45  =0 || rc==SQLITE
f6d0: 5f 43 4f 52 52 55 50 54 20 29 3b 0a 20 20 72 65  _CORRUPT );.  re
f6e0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
f6f0: 2a 20 52 65 6c 65 61 73 65 20 61 20 4d 65 6d 50  * Release a MemP
f700: 61 67 65 2e 20 20 54 68 69 73 20 73 68 6f 75 6c  age.  This shoul
f710: 64 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 63 65  d be called once
f720: 20 66 6f 72 20 65 61 63 68 20 70 72 69 6f 72 0a   for each prior.
f730: 2a 2a 20 63 61 6c 6c 20 74 6f 20 62 74 72 65 65  ** call to btree
f740: 47 65 74 50 61 67 65 2e 0a 2a 2f 0a 73 74 61 74  GetPage..*/.stat
f750: 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65 50  ic void releaseP
f760: 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  age(MemPage *pPa
f770: 67 65 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65  ge){.  if( pPage
f780: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
f790: 70 50 61 67 65 2d 3e 61 44 61 74 61 20 29 3b 0a  pPage->aData );.
f7a0: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
f7b0: 65 2d 3e 70 42 74 20 29 3b 0a 20 20 20 20 61 73  e->pBt );.    as
f7c0: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 44 62  sert( pPage->pDb
f7d0: 50 61 67 65 21 3d 30 20 29 3b 0a 20 20 20 20 61  Page!=0 );.    a
f7e0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
f7f0: 67 65 72 47 65 74 45 78 74 72 61 28 70 50 61 67  gerGetExtra(pPag
f800: 65 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d 20 28  e->pDbPage) == (
f810: 76 6f 69 64 2a 29 70 50 61 67 65 20 29 3b 0a 20  void*)pPage );. 
f820: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
f830: 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70  e3PagerGetData(p
f840: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3d 3d  Page->pDbPage)==
f850: 70 50 61 67 65 2d 3e 61 44 61 74 61 20 29 3b 0a  pPage->aData );.
f860: 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
f870: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
f880: 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
f890: 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) );.    sqlite3
f8a0: 50 61 67 65 72 55 6e 72 65 66 4e 6f 74 4e 75 6c  PagerUnrefNotNul
f8b0: 6c 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  l(pPage->pDbPage
f8c0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
f8d0: 44 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63  During a rollbac
f8e0: 6b 2c 20 77 68 65 6e 20 74 68 65 20 70 61 67 65  k, when the page
f8f0: 72 20 72 65 6c 6f 61 64 73 20 69 6e 66 6f 72 6d  r reloads inform
f900: 61 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65 20 63  ation into the c
f910: 61 63 68 65 0a 2a 2a 20 73 6f 20 74 68 61 74 20  ache.** so that 
f920: 74 68 65 20 63 61 63 68 65 20 69 73 20 72 65 73  the cache is res
f930: 74 6f 72 65 64 20 74 6f 20 69 74 73 20 6f 72 69  tored to its ori
f940: 67 69 6e 61 6c 20 73 74 61 74 65 20 61 74 20 74  ginal state at t
f950: 68 65 20 73 74 61 72 74 20 6f 66 0a 2a 2a 20 74  he start of.** t
f960: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  he transaction, 
f970: 66 6f 72 20 65 61 63 68 20 70 61 67 65 20 72 65  for each page re
f980: 73 74 6f 72 65 64 20 74 68 69 73 20 72 6f 75 74  stored this rout
f990: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  ine is called..*
f9a0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
f9b0: 65 20 6e 65 65 64 73 20 74 6f 20 72 65 73 65 74  e needs to reset
f9c0: 20 74 68 65 20 65 78 74 72 61 20 64 61 74 61 20   the extra data 
f9d0: 73 65 63 74 69 6f 6e 20 61 74 20 74 68 65 20 65  section at the e
f9e0: 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20 70 61 67  nd of the.** pag
f9f0: 65 20 74 6f 20 61 67 72 65 65 20 77 69 74 68 20  e to agree with 
fa00: 74 68 65 20 72 65 73 74 6f 72 65 64 20 64 61 74  the restored dat
fa10: 61 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  a..*/.static voi
fa20: 64 20 70 61 67 65 52 65 69 6e 69 74 28 44 62 50  d pageReinit(DbP
fa30: 61 67 65 20 2a 70 44 61 74 61 29 7b 0a 20 20 4d  age *pData){.  M
fa40: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20  emPage *pPage;. 
fa50: 20 70 50 61 67 65 20 3d 20 28 4d 65 6d 50 61 67   pPage = (MemPag
fa60: 65 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72  e *)sqlite3Pager
fa70: 47 65 74 45 78 74 72 61 28 70 44 61 74 61 29 3b  GetExtra(pData);
fa80: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
fa90: 65 33 50 61 67 65 72 50 61 67 65 52 65 66 63 6f  e3PagerPageRefco
faa0: 75 6e 74 28 70 44 61 74 61 29 3e 30 20 29 3b 0a  unt(pData)>0 );.
fab0: 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 73 49    if( pPage->isI
fac0: 6e 69 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72  nit ){.    asser
fad0: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
fae0: 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
faf0: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 20 20  ->mutex) );.    
fb00: 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20  pPage->isInit = 
fb10: 30 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  0;.    if( sqlit
fb20: 65 33 50 61 67 65 72 50 61 67 65 52 65 66 63 6f  e3PagerPageRefco
fb30: 75 6e 74 28 70 44 61 74 61 29 3e 31 20 29 7b 0a  unt(pData)>1 ){.
fb40: 20 20 20 20 20 20 2f 2a 20 70 50 61 67 65 20 6d        /* pPage m
fb50: 69 67 68 74 20 6e 6f 74 20 62 65 20 61 20 62 74  ight not be a bt
fb60: 72 65 65 20 70 61 67 65 3b 20 20 69 74 20 6d 69  ree page;  it mi
fb70: 67 68 74 20 62 65 20 61 6e 20 6f 76 65 72 66 6c  ght be an overfl
fb80: 6f 77 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a  ow page.      **
fb90: 20 6f 72 20 70 74 72 6d 61 70 20 70 61 67 65 20   or ptrmap page 
fba0: 6f 72 20 61 20 66 72 65 65 20 70 61 67 65 2e 20  or a free page. 
fbb0: 20 49 6e 20 74 68 6f 73 65 20 63 61 73 65 73 2c   In those cases,
fbc0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20   the following. 
fbd0: 20 20 20 20 20 2a 2a 20 63 61 6c 6c 20 74 6f 20       ** call to 
fbe0: 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 20  btreeInitPage() 
fbf0: 77 69 6c 6c 20 6c 69 6b 65 6c 79 20 72 65 74 75  will likely retu
fc00: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
fc10: 54 2e 0a 20 20 20 20 20 20 2a 2a 20 42 75 74 20  T..      ** But 
fc20: 6e 6f 20 68 61 72 6d 20 69 73 20 64 6f 6e 65 20  no harm is done 
fc30: 62 79 20 74 68 69 73 2e 20 20 41 6e 64 20 69 74  by this.  And it
fc40: 20 69 73 20 76 65 72 79 20 69 6d 70 6f 72 74 61   is very importa
fc50: 6e 74 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a  nt that.      **
fc60: 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29   btreeInitPage()
fc70: 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 20 65 76   be called on ev
fc80: 65 72 79 20 62 74 72 65 65 20 70 61 67 65 20 73  ery btree page s
fc90: 6f 20 77 65 20 6d 61 6b 65 0a 20 20 20 20 20 20  o we make.      
fca0: 2a 2a 20 74 68 65 20 63 61 6c 6c 20 66 6f 72 20  ** the call for 
fcb0: 65 76 65 72 79 20 70 61 67 65 20 74 68 61 74 20  every page that 
fcc0: 63 6f 6d 65 73 20 69 6e 20 66 6f 72 20 72 65 2d  comes in for re-
fcd0: 69 6e 69 74 69 6e 67 2e 20 2a 2f 0a 20 20 20 20  initing. */.    
fce0: 20 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28    btreeInitPage(
fcf0: 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20  pPage);.    }.  
fd00: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b  }.}../*.** Invok
fd10: 65 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c  e the busy handl
fd20: 65 72 20 66 6f 72 20 61 20 62 74 72 65 65 2e 0a  er for a btree..
fd30: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74  */.static int bt
fd40: 72 65 65 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e  reeInvokeBusyHan
fd50: 64 6c 65 72 28 76 6f 69 64 20 2a 70 41 72 67 29  dler(void *pArg)
fd60: 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
fd70: 74 20 3d 20 28 42 74 53 68 61 72 65 64 2a 29 70  t = (BtShared*)p
fd80: 41 72 67 3b 0a 20 20 61 73 73 65 72 74 28 20 70  Arg;.  assert( p
fd90: 42 74 2d 3e 64 62 20 29 3b 0a 20 20 61 73 73 65  Bt->db );.  asse
fda0: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
fdb0: 78 5f 68 65 6c 64 28 70 42 74 2d 3e 64 62 2d 3e  x_held(pBt->db->
fdc0: 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 65 74 75  mutex) );.  retu
fdd0: 72 6e 20 73 71 6c 69 74 65 33 49 6e 76 6f 6b 65  rn sqlite3Invoke
fde0: 42 75 73 79 48 61 6e 64 6c 65 72 28 26 70 42 74  BusyHandler(&pBt
fdf0: 2d 3e 64 62 2d 3e 62 75 73 79 48 61 6e 64 6c 65  ->db->busyHandle
fe00: 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65  r);.}../*.** Ope
fe10: 6e 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c  n a database fil
fe20: 65 2e 0a 2a 2a 20 0a 2a 2a 20 7a 46 69 6c 65 6e  e..** .** zFilen
fe30: 61 6d 65 20 69 73 20 74 68 65 20 6e 61 6d 65 20  ame is the name 
fe40: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
fe50: 66 69 6c 65 2e 20 20 49 66 20 7a 46 69 6c 65 6e  file.  If zFilen
fe60: 61 6d 65 20 69 73 20 4e 55 4c 4c 0a 2a 2a 20 74  ame is NULL.** t
fe70: 68 65 6e 20 61 6e 20 65 70 68 65 6d 65 72 61 6c  hen an ephemeral
fe80: 20 64 61 74 61 62 61 73 65 20 69 73 20 63 72 65   database is cre
fe90: 61 74 65 64 2e 20 20 54 68 65 20 65 70 68 65 6d  ated.  The ephem
fea0: 65 72 61 6c 20 64 61 74 61 62 61 73 65 20 6d 69  eral database mi
feb0: 67 68 74 0a 2a 2a 20 62 65 20 65 78 63 6c 75 73  ght.** be exclus
fec0: 69 76 65 6c 79 20 69 6e 20 6d 65 6d 6f 72 79 2c  ively in memory,
fed0: 20 6f 72 20 69 74 20 6d 69 67 68 74 20 75 73 65   or it might use
fee0: 20 61 20 64 69 73 6b 2d 62 61 73 65 64 20 6d 65   a disk-based me
fef0: 6d 6f 72 79 20 63 61 63 68 65 2e 0a 2a 2a 20 45  mory cache..** E
ff00: 69 74 68 65 72 20 77 61 79 2c 20 74 68 65 20 65  ither way, the e
ff10: 70 68 65 6d 65 72 61 6c 20 64 61 74 61 62 61 73  phemeral databas
ff20: 65 20 77 69 6c 6c 20 62 65 20 61 75 74 6f 6d 61  e will be automa
ff30: 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 64 20  tically deleted 
ff40: 0a 2a 2a 20 77 68 65 6e 20 73 71 6c 69 74 65 33  .** when sqlite3
ff50: 42 74 72 65 65 43 6c 6f 73 65 28 29 20 69 73 20  BtreeClose() is 
ff60: 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  called..**.** If
ff70: 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 22 3a   zFilename is ":
ff80: 6d 65 6d 6f 72 79 3a 22 20 74 68 65 6e 20 61 6e  memory:" then an
ff90: 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
ffa0: 61 73 65 20 69 73 20 63 72 65 61 74 65 64 0a 2a  ase is created.*
ffb0: 2a 20 74 68 61 74 20 69 73 20 61 75 74 6f 6d 61  * that is automa
ffc0: 74 69 63 61 6c 6c 79 20 64 65 73 74 72 6f 79 65  tically destroye
ffd0: 64 20 77 68 65 6e 20 69 74 20 69 73 20 63 6c 6f  d when it is clo
ffe0: 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 22  sed..**.** The "
fff0: 66 6c 61 67 73 22 20 70 61 72 61 6d 65 74 65 72  flags" parameter
10000 20 69 73 20 61 20 62 69 74 6d 61 73 6b 20 74 68   is a bitmask th
10010 61 74 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e  at might contain
10020 20 62 69 74 73 20 6c 69 6b 65 0a 2a 2a 20 42 54   bits like.** BT
10030 52 45 45 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c  REE_OMIT_JOURNAL
10040 20 61 6e 64 2f 6f 72 20 42 54 52 45 45 5f 4d 45   and/or BTREE_ME
10050 4d 4f 52 59 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  MORY..**.** If t
10060 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 61  he database is a
10070 6c 72 65 61 64 79 20 6f 70 65 6e 65 64 20 69 6e  lready opened in
10080 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62 61   the same databa
10090 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a  se connection.**
100a0 20 61 6e 64 20 77 65 20 61 72 65 20 69 6e 20 73   and we are in s
100b0 68 61 72 65 64 20 63 61 63 68 65 20 6d 6f 64 65  hared cache mode
100c0 2c 20 74 68 65 6e 20 74 68 65 20 6f 70 65 6e 20  , then the open 
100d0 77 69 6c 6c 20 66 61 69 6c 20 77 69 74 68 20 61  will fail with a
100e0 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 4e 53  n.** SQLITE_CONS
100f0 54 52 41 49 4e 54 20 65 72 72 6f 72 2e 20 20 57  TRAINT error.  W
10100 65 20 63 61 6e 6e 6f 74 20 61 6c 6c 6f 77 20 74  e cannot allow t
10110 77 6f 20 6f 72 20 6d 6f 72 65 20 42 74 53 68 61  wo or more BtSha
10120 72 65 64 0a 2a 2a 20 6f 62 6a 65 63 74 73 20 69  red.** objects i
10130 6e 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  n the same datab
10140 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73  ase connection s
10150 69 6e 63 65 20 64 6f 69 6e 67 20 73 6f 20 77 69  ince doing so wi
10160 6c 6c 20 6c 65 61 64 0a 2a 2a 20 74 6f 20 70 72  ll lead.** to pr
10170 6f 62 6c 65 6d 73 20 77 69 74 68 20 6c 6f 63 6b  oblems with lock
10180 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ing..*/.int sqli
10190 74 65 33 42 74 72 65 65 4f 70 65 6e 28 0a 20 20  te3BtreeOpen(.  
101a0 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
101b0 73 2c 20 20 20 20 20 20 2f 2a 20 56 46 53 20 74  s,      /* VFS t
101c0 6f 20 75 73 65 20 66 6f 72 20 74 68 69 73 20 62  o use for this b
101d0 2d 74 72 65 65 20 2a 2f 0a 20 20 63 6f 6e 73 74  -tree */.  const
101e0 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
101f0 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68  ,  /* Name of th
10200 65 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 69 6e  e file containin
10210 67 20 74 68 65 20 42 54 72 65 65 20 64 61 74 61  g the BTree data
10220 62 61 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  base */.  sqlite
10230 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20  3 *db,          
10240 20 20 2f 2a 20 41 73 73 6f 63 69 61 74 65 64 20    /* Associated 
10250 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
10260 2a 2f 0a 20 20 42 74 72 65 65 20 2a 2a 70 70 42  */.  Btree **ppB
10270 74 72 65 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  tree,        /* 
10280 50 6f 69 6e 74 65 72 20 74 6f 20 6e 65 77 20 42  Pointer to new B
10290 74 72 65 65 20 6f 62 6a 65 63 74 20 77 72 69 74  tree object writ
102a0 74 65 6e 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e  ten here */.  in
102b0 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20  t flags,        
102c0 20 20 20 20 20 20 2f 2a 20 4f 70 74 69 6f 6e 73        /* Options
102d0 20 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c 61   */.  int vfsFla
102e0 67 73 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  gs            /*
102f0 20 46 6c 61 67 73 20 70 61 73 73 65 64 20 74 68   Flags passed th
10300 72 6f 75 67 68 20 74 6f 20 73 71 6c 69 74 65 33  rough to sqlite3
10310 5f 76 66 73 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a  _vfs.xOpen() */.
10320 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
10330 42 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  Bt = 0;         
10340 20 20 20 20 2f 2a 20 53 68 61 72 65 64 20 70 61      /* Shared pa
10350 72 74 20 6f 66 20 62 74 72 65 65 20 73 74 72 75  rt of btree stru
10360 63 74 75 72 65 20 2a 2f 0a 20 20 42 74 72 65 65  cture */.  Btree
10370 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20   *p;            
10380 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e            /* Han
10390 64 6c 65 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f  dle to return */
103a0 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
103b0 20 2a 6d 75 74 65 78 4f 70 65 6e 20 3d 20 30 3b   *mutexOpen = 0;
103c0 20 20 2f 2a 20 50 72 65 76 65 6e 74 73 20 61 20    /* Prevents a 
103d0 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 2e 20  race condition. 
103e0 54 69 63 6b 65 74 20 23 33 35 33 37 20 2a 2f 0a  Ticket #3537 */.
103f0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
10400 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
10410 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20   /* Result code 
10420 66 72 6f 6d 20 74 68 69 73 20 66 75 6e 63 74 69  from this functi
10430 6f 6e 20 2a 2f 0a 20 20 75 38 20 6e 52 65 73 65  on */.  u8 nRese
10440 72 76 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  rve;            
10450 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 20 6f         /* Byte o
10460 66 20 75 6e 75 73 65 64 20 73 70 61 63 65 20 6f  f unused space o
10470 6e 20 65 61 63 68 20 70 61 67 65 20 2a 2f 0a 20  n each page */. 
10480 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 7a   unsigned char z
10490 44 62 48 65 61 64 65 72 5b 31 30 30 5d 3b 20 20  DbHeader[100];  
104a0 2f 2a 20 44 61 74 61 62 61 73 65 20 68 65 61 64  /* Database head
104b0 65 72 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 0a 20  er content */.. 
104c0 20 2f 2a 20 54 72 75 65 20 69 66 20 6f 70 65 6e   /* True if open
104d0 69 6e 67 20 61 6e 20 65 70 68 65 6d 65 72 61 6c  ing an ephemeral
104e0 2c 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61  , temporary data
104f0 62 61 73 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  base */.  const 
10500 69 6e 74 20 69 73 54 65 6d 70 44 62 20 3d 20 7a  int isTempDb = z
10510 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 7c 7c 20 7a  Filename==0 || z
10520 46 69 6c 65 6e 61 6d 65 5b 30 5d 3d 3d 30 3b 0a  Filename[0]==0;.
10530 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 76 61  .  /* Set the va
10540 72 69 61 62 6c 65 20 69 73 4d 65 6d 64 62 20 74  riable isMemdb t
10550 6f 20 74 72 75 65 20 66 6f 72 20 61 6e 20 69 6e  o true for an in
10560 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
10570 2c 20 6f 72 20 0a 20 20 2a 2a 20 66 61 6c 73 65  , or .  ** false
10580 20 66 6f 72 20 61 20 66 69 6c 65 2d 62 61 73 65   for a file-base
10590 64 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f  d database..  */
105a0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
105b0 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 20 20 63  MIT_MEMORYDB.  c
105c0 6f 6e 73 74 20 69 6e 74 20 69 73 4d 65 6d 64 62  onst int isMemdb
105d0 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 20 20 63 6f   = 0;.#else.  co
105e0 6e 73 74 20 69 6e 74 20 69 73 4d 65 6d 64 62 20  nst int isMemdb 
105f0 3d 20 28 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20  = (zFilename && 
10600 73 74 72 63 6d 70 28 7a 46 69 6c 65 6e 61 6d 65  strcmp(zFilename
10610 2c 20 22 3a 6d 65 6d 6f 72 79 3a 22 29 3d 3d 30  , ":memory:")==0
10620 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
10630 20 20 20 20 20 20 20 20 20 7c 7c 20 28 69 73 54           || (isT
10640 65 6d 70 44 62 20 26 26 20 73 71 6c 69 74 65 33  empDb && sqlite3
10650 54 65 6d 70 49 6e 4d 65 6d 6f 72 79 28 64 62 29  TempInMemory(db)
10660 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
10670 20 20 20 20 20 20 20 20 20 7c 7c 20 28 76 66 73           || (vfs
10680 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  Flags & SQLITE_O
10690 50 45 4e 5f 4d 45 4d 4f 52 59 29 21 3d 30 3b 0a  PEN_MEMORY)!=0;.
106a0 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74  #endif..  assert
106b0 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 61 73 73  ( db!=0 );.  ass
106c0 65 72 74 28 20 70 56 66 73 21 3d 30 20 29 3b 0a  ert( pVfs!=0 );.
106d0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
106e0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d  3_mutex_held(db-
106f0 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
10700 65 72 74 28 20 28 66 6c 61 67 73 26 30 78 66 66  ert( (flags&0xff
10710 29 3d 3d 66 6c 61 67 73 20 29 3b 20 20 20 2f 2a  )==flags );   /*
10720 20 66 6c 61 67 73 20 66 69 74 20 69 6e 20 38 20   flags fit in 8 
10730 62 69 74 73 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 6e  bits */..  /* On
10740 6c 79 20 61 20 42 54 52 45 45 5f 53 49 4e 47 4c  ly a BTREE_SINGL
10750 45 20 64 61 74 61 62 61 73 65 20 63 61 6e 20 62  E database can b
10760 65 20 42 54 52 45 45 5f 55 4e 4f 52 44 45 52 45  e BTREE_UNORDERE
10770 44 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28  D */.  assert( (
10780 66 6c 61 67 73 20 26 20 42 54 52 45 45 5f 55 4e  flags & BTREE_UN
10790 4f 52 44 45 52 45 44 29 3d 3d 30 20 7c 7c 20 28  ORDERED)==0 || (
107a0 66 6c 61 67 73 20 26 20 42 54 52 45 45 5f 53 49  flags & BTREE_SI
107b0 4e 47 4c 45 29 21 3d 30 20 29 3b 0a 0a 20 20 2f  NGLE)!=0 );..  /
107c0 2a 20 41 20 42 54 52 45 45 5f 53 49 4e 47 4c 45  * A BTREE_SINGLE
107d0 20 64 61 74 61 62 61 73 65 20 69 73 20 61 6c 77   database is alw
107e0 61 79 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20  ays a temporary 
107f0 61 6e 64 2f 6f 72 20 65 70 68 65 6d 65 72 61 6c  and/or ephemeral
10800 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 66   */.  assert( (f
10810 6c 61 67 73 20 26 20 42 54 52 45 45 5f 53 49 4e  lags & BTREE_SIN
10820 47 4c 45 29 3d 3d 30 20 7c 7c 20 69 73 54 65 6d  GLE)==0 || isTem
10830 70 44 62 20 29 3b 0a 0a 20 20 69 66 28 20 69 73  pDb );..  if( is
10840 4d 65 6d 64 62 20 29 7b 0a 20 20 20 20 66 6c 61  Memdb ){.    fla
10850 67 73 20 7c 3d 20 42 54 52 45 45 5f 4d 45 4d 4f  gs |= BTREE_MEMO
10860 52 59 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 76  RY;.  }.  if( (v
10870 66 73 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45  fsFlags & SQLITE
10880 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 29 21 3d  _OPEN_MAIN_DB)!=
10890 30 20 26 26 20 28 69 73 4d 65 6d 64 62 20 7c 7c  0 && (isMemdb ||
108a0 20 69 73 54 65 6d 70 44 62 29 20 29 7b 0a 20 20   isTempDb) ){.  
108b0 20 20 76 66 73 46 6c 61 67 73 20 3d 20 28 76 66    vfsFlags = (vf
108c0 73 46 6c 61 67 73 20 26 20 7e 53 51 4c 49 54 45  sFlags & ~SQLITE
108d0 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 29 20 7c  _OPEN_MAIN_DB) |
108e0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d   SQLITE_OPEN_TEM
108f0 50 5f 44 42 3b 0a 20 20 7d 0a 20 20 70 20 3d 20  P_DB;.  }.  p = 
10900 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72  sqlite3MallocZer
10910 6f 28 73 69 7a 65 6f 66 28 42 74 72 65 65 29 29  o(sizeof(Btree))
10920 3b 0a 20 20 69 66 28 20 21 70 20 29 7b 0a 20 20  ;.  if( !p ){.  
10930 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
10940 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 70 2d 3e  NOMEM;.  }.  p->
10950 69 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f  inTrans = TRANS_
10960 4e 4f 4e 45 3b 0a 20 20 70 2d 3e 64 62 20 3d 20  NONE;.  p->db = 
10970 64 62 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  db;.#ifndef SQLI
10980 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
10990 41 43 48 45 0a 20 20 70 2d 3e 6c 6f 63 6b 2e 70  ACHE.  p->lock.p
109a0 42 74 72 65 65 20 3d 20 70 3b 0a 20 20 70 2d 3e  Btree = p;.  p->
109b0 6c 6f 63 6b 2e 69 54 61 62 6c 65 20 3d 20 31 3b  lock.iTable = 1;
109c0 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64 65  .#endif..#if !de
109d0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
109e0 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 20  T_SHARED_CACHE) 
109f0 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  && !defined(SQLI
10a00 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a  TE_OMIT_DISKIO).
10a10 20 20 2f 2a 0a 20 20 2a 2a 20 49 66 20 74 68 69    /*.  ** If thi
10a20 73 20 42 74 72 65 65 20 69 73 20 61 20 63 61 6e  s Btree is a can
10a30 64 69 64 61 74 65 20 66 6f 72 20 73 68 61 72 65  didate for share
10a40 64 20 63 61 63 68 65 2c 20 74 72 79 20 74 6f 20  d cache, try to 
10a50 66 69 6e 64 20 61 6e 0a 20 20 2a 2a 20 65 78 69  find an.  ** exi
10a60 73 74 69 6e 67 20 42 74 53 68 61 72 65 64 20 6f  sting BtShared o
10a70 62 6a 65 63 74 20 74 68 61 74 20 77 65 20 63 61  bject that we ca
10a80 6e 20 73 68 61 72 65 20 77 69 74 68 0a 20 20 2a  n share with.  *
10a90 2f 0a 20 20 69 66 28 20 69 73 54 65 6d 70 44 62  /.  if( isTempDb
10aa0 3d 3d 30 20 26 26 20 28 69 73 4d 65 6d 64 62 3d  ==0 && (isMemdb=
10ab0 3d 30 20 7c 7c 20 28 76 66 73 46 6c 61 67 73 26  =0 || (vfsFlags&
10ac0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 29  SQLITE_OPEN_URI)
10ad0 21 3d 30 29 20 29 7b 0a 20 20 20 20 69 66 28 20  !=0) ){.    if( 
10ae0 76 66 73 46 6c 61 67 73 20 26 20 53 51 4c 49 54  vfsFlags & SQLIT
10af0 45 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43 41 43  E_OPEN_SHAREDCAC
10b00 48 45 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  HE ){.      int 
10b10 6e 46 69 6c 65 6e 61 6d 65 20 3d 20 73 71 6c 69  nFilename = sqli
10b20 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c  te3Strlen30(zFil
10b30 65 6e 61 6d 65 29 2b 31 3b 0a 20 20 20 20 20 20  ename)+1;.      
10b40 69 6e 74 20 6e 46 75 6c 6c 50 61 74 68 6e 61 6d  int nFullPathnam
10b50 65 20 3d 20 70 56 66 73 2d 3e 6d 78 50 61 74 68  e = pVfs->mxPath
10b60 6e 61 6d 65 2b 31 3b 0a 20 20 20 20 20 20 63 68  name+1;.      ch
10b70 61 72 20 2a 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  ar *zFullPathnam
10b80 65 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  e = sqlite3Mallo
10b90 63 28 4d 41 58 28 6e 46 75 6c 6c 50 61 74 68 6e  c(MAX(nFullPathn
10ba0 61 6d 65 2c 6e 46 69 6c 65 6e 61 6d 65 29 29 3b  ame,nFilename));
10bb0 0a 20 20 20 20 20 20 4d 55 54 45 58 5f 4c 4f 47  .      MUTEX_LOG
10bc0 49 43 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  IC( sqlite3_mute
10bd0 78 20 2a 6d 75 74 65 78 53 68 61 72 65 64 3b 20  x *mutexShared; 
10be0 29 0a 0a 20 20 20 20 20 20 70 2d 3e 73 68 61 72  )..      p->shar
10bf0 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20 20 20  able = 1;.      
10c00 69 66 28 20 21 7a 46 75 6c 6c 50 61 74 68 6e 61  if( !zFullPathna
10c10 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  me ){.        sq
10c20 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20  lite3_free(p);. 
10c30 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
10c40 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
10c50 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 73    }.      if( is
10c60 4d 65 6d 64 62 20 29 7b 0a 20 20 20 20 20 20 20  Memdb ){.       
10c70 20 6d 65 6d 63 70 79 28 7a 46 75 6c 6c 50 61 74   memcpy(zFullPat
10c80 68 6e 61 6d 65 2c 20 7a 46 69 6c 65 6e 61 6d 65  hname, zFilename
10c90 2c 20 6e 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  , nFilename);.  
10ca0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
10cb0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
10cc0 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 70 56  sFullPathname(pV
10cd0 66 73 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20  fs, zFilename,. 
10ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10d00 20 20 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c    nFullPathname,
10d10 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b   zFullPathname);
10d20 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20  .        if( rc 
10d30 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
10d40 69 74 65 33 5f 66 72 65 65 28 7a 46 75 6c 6c 50  ite3_free(zFullP
10d50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  athname);.      
10d60 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
10d70 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  (p);.          r
10d80 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
10d90 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 69 66 20    }.      }.#if 
10da0 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46  SQLITE_THREADSAF
10db0 45 0a 20 20 20 20 20 20 6d 75 74 65 78 4f 70 65  E.      mutexOpe
10dc0 6e 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78  n = sqlite3Mutex
10dd0 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54  Alloc(SQLITE_MUT
10de0 45 58 5f 53 54 41 54 49 43 5f 4f 50 45 4e 29 3b  EX_STATIC_OPEN);
10df0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  .      sqlite3_m
10e00 75 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78  utex_enter(mutex
10e10 4f 70 65 6e 29 3b 0a 20 20 20 20 20 20 6d 75 74  Open);.      mut
10e20 65 78 53 68 61 72 65 64 20 3d 20 73 71 6c 69 74  exShared = sqlit
10e30 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c  e3MutexAlloc(SQL
10e40 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43  ITE_MUTEX_STATIC
10e50 5f 4d 41 53 54 45 52 29 3b 0a 20 20 20 20 20 20  _MASTER);.      
10e60 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
10e70 74 65 72 28 6d 75 74 65 78 53 68 61 72 65 64 29  ter(mutexShared)
10e80 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 66  ;.#endif.      f
10e90 6f 72 28 70 42 74 3d 47 4c 4f 42 41 4c 28 42 74  or(pBt=GLOBAL(Bt
10ea0 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53  Shared*,sqlite3S
10eb0 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 3b  haredCacheList);
10ec0 20 70 42 74 3b 20 70 42 74 3d 70 42 74 2d 3e 70   pBt; pBt=pBt->p
10ed0 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20 61  Next){.        a
10ee0 73 73 65 72 74 28 20 70 42 74 2d 3e 6e 52 65 66  ssert( pBt->nRef
10ef0 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  >0 );.        if
10f00 28 20 30 3d 3d 73 74 72 63 6d 70 28 7a 46 75 6c  ( 0==strcmp(zFul
10f10 6c 50 61 74 68 6e 61 6d 65 2c 20 73 71 6c 69 74  lPathname, sqlit
10f20 65 33 50 61 67 65 72 46 69 6c 65 6e 61 6d 65 28  e3PagerFilename(
10f30 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 30 29 29  pBt->pPager, 0))
10f40 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
10f50 20 20 26 26 20 73 71 6c 69 74 65 33 50 61 67 65    && sqlite3Page
10f60 72 56 66 73 28 70 42 74 2d 3e 70 50 61 67 65 72  rVfs(pBt->pPager
10f70 29 3d 3d 70 56 66 73 20 29 7b 0a 20 20 20 20 20  )==pVfs ){.     
10f80 20 20 20 20 20 69 6e 74 20 69 44 62 3b 0a 20 20       int iDb;.  
10f90 20 20 20 20 20 20 20 20 66 6f 72 28 69 44 62 3d          for(iDb=
10fa0 64 62 2d 3e 6e 44 62 2d 31 3b 20 69 44 62 3e 3d  db->nDb-1; iDb>=
10fb0 30 3b 20 69 44 62 2d 2d 29 7b 0a 20 20 20 20 20  0; iDb--){.     
10fc0 20 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 45         Btree *pE
10fd0 78 69 73 74 69 6e 67 20 3d 20 64 62 2d 3e 61 44  xisting = db->aD
10fe0 62 5b 69 44 62 5d 2e 70 42 74 3b 0a 20 20 20 20  b[iDb].pBt;.    
10ff0 20 20 20 20 20 20 20 20 69 66 28 20 70 45 78 69          if( pExi
11000 73 74 69 6e 67 20 26 26 20 70 45 78 69 73 74 69  sting && pExisti
11010 6e 67 2d 3e 70 42 74 3d 3d 70 42 74 20 29 7b 0a  ng->pBt==pBt ){.
11020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
11030 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
11040 65 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a  e(mutexShared);.
11050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
11060 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
11070 65 28 6d 75 74 65 78 4f 70 65 6e 29 3b 0a 20 20  e(mutexOpen);.  
11080 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
11090 74 65 33 5f 66 72 65 65 28 7a 46 75 6c 6c 50 61  te3_free(zFullPa
110a0 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  thname);.       
110b0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
110c0 72 65 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20  ree(p);.        
110d0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
110e0 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 3b 0a  ITE_CONSTRAINT;.
110f0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
11100 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
11110 20 20 20 20 70 2d 3e 70 42 74 20 3d 20 70 42 74      p->pBt = pBt
11120 3b 0a 20 20 20 20 20 20 20 20 20 20 70 42 74 2d  ;.          pBt-
11130 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20 20  >nRef++;.       
11140 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
11150 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
11160 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
11170 6c 65 61 76 65 28 6d 75 74 65 78 53 68 61 72 65  leave(mutexShare
11180 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  d);.      sqlite
11190 33 5f 66 72 65 65 28 7a 46 75 6c 6c 50 61 74 68  3_free(zFullPath
111a0 6e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 23 69 66  name);.    }.#if
111b0 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
111c0 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20 20 20 20  .    else{.     
111d0 20 2f 2a 20 49 6e 20 64 65 62 75 67 20 6d 6f 64   /* In debug mod
111e0 65 2c 20 77 65 20 6d 61 72 6b 20 61 6c 6c 20 70  e, we mark all p
111f0 65 72 73 69 73 74 65 6e 74 20 64 61 74 61 62 61  ersistent databa
11200 73 65 73 20 61 73 20 73 68 61 72 61 62 6c 65 0a  ses as sharable.
11210 20 20 20 20 20 20 2a 2a 20 65 76 65 6e 20 77 68        ** even wh
11220 65 6e 20 74 68 65 79 20 61 72 65 20 6e 6f 74 2e  en they are not.
11230 20 20 54 68 69 73 20 65 78 65 72 63 69 73 65 73    This exercises
11240 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f 64   the locking cod
11250 65 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 67  e and.      ** g
11260 69 76 65 73 20 6d 6f 72 65 20 6f 70 70 6f 72 74  ives more opport
11270 75 6e 69 74 79 20 66 6f 72 20 61 73 73 65 72 74  unity for assert
11280 73 28 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  s(sqlite3_mutex_
11290 68 65 6c 64 28 29 29 0a 20 20 20 20 20 20 2a 2a  held()).      **
112a0 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 66   statements to f
112b0 69 6e 64 20 6c 6f 63 6b 69 6e 67 20 70 72 6f 62  ind locking prob
112c0 6c 65 6d 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  lems..      */. 
112d0 20 20 20 20 20 70 2d 3e 73 68 61 72 61 62 6c 65       p->sharable
112e0 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 23 65 6e 64   = 1;.    }.#end
112f0 69 66 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  if.  }.#endif.  
11300 69 66 28 20 70 42 74 3d 3d 30 20 29 7b 0a 20 20  if( pBt==0 ){.  
11310 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    /*.    ** The 
11320 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74  following assert
11330 73 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74  s make sure that
11340 20 73 74 72 75 63 74 75 72 65 73 20 75 73 65 64   structures used
11350 20 62 79 20 74 68 65 20 62 74 72 65 65 20 61 72   by the btree ar
11360 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 72 69 67  e.    ** the rig
11370 68 74 20 73 69 7a 65 2e 20 20 54 68 69 73 20 69  ht size.  This i
11380 73 20 74 6f 20 67 75 61 72 64 20 61 67 61 69 6e  s to guard again
11390 73 74 20 73 69 7a 65 20 63 68 61 6e 67 65 73 20  st size changes 
113a0 74 68 61 74 20 72 65 73 75 6c 74 0a 20 20 20 20  that result.    
113b0 2a 2a 20 77 68 65 6e 20 63 6f 6d 70 69 6c 69 6e  ** when compilin
113c0 67 20 6f 6e 20 61 20 64 69 66 66 65 72 65 6e 74  g on a different
113d0 20 61 72 63 68 69 74 65 63 74 75 72 65 2e 0a 20   architecture.. 
113e0 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74     */.    assert
113f0 28 20 73 69 7a 65 6f 66 28 69 36 34 29 3d 3d 38  ( sizeof(i64)==8
11400 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
11410 73 69 7a 65 6f 66 28 75 36 34 29 3d 3d 38 20 29  sizeof(u64)==8 )
11420 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69  ;.    assert( si
11430 7a 65 6f 66 28 75 33 32 29 3d 3d 34 20 29 3b 0a  zeof(u32)==4 );.
11440 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65      assert( size
11450 6f 66 28 75 31 36 29 3d 3d 32 20 29 3b 0a 20 20  of(u16)==2 );.  
11460 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66    assert( sizeof
11470 28 50 67 6e 6f 29 3d 3d 34 20 29 3b 0a 20 20 0a  (Pgno)==4 );.  .
11480 20 20 20 20 70 42 74 20 3d 20 73 71 6c 69 74 65      pBt = sqlite
11490 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 73 69 7a  3MallocZero( siz
114a0 65 6f 66 28 2a 70 42 74 29 20 29 3b 0a 20 20 20  eof(*pBt) );.   
114b0 20 69 66 28 20 70 42 74 3d 3d 30 20 29 7b 0a 20   if( pBt==0 ){. 
114c0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
114d0 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f  _NOMEM;.      go
114e0 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75  to btree_open_ou
114f0 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  t;.    }.    rc 
11500 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70  = sqlite3PagerOp
11510 65 6e 28 70 56 66 73 2c 20 26 70 42 74 2d 3e 70  en(pVfs, &pBt->p
11520 50 61 67 65 72 2c 20 7a 46 69 6c 65 6e 61 6d 65  Pager, zFilename
11530 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
11540 20 20 20 20 20 20 20 20 20 20 20 20 45 58 54 52              EXTR
11550 41 5f 53 49 5a 45 2c 20 66 6c 61 67 73 2c 20 76  A_SIZE, flags, v
11560 66 73 46 6c 61 67 73 2c 20 70 61 67 65 52 65 69  fsFlags, pageRei
11570 6e 69 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63  nit);.    if( rc
11580 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
11590 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
115a0 72 53 65 74 4d 6d 61 70 4c 69 6d 69 74 28 70 42  rSetMmapLimit(pB
115b0 74 2d 3e 70 50 61 67 65 72 2c 20 64 62 2d 3e 73  t->pPager, db->s
115c0 7a 4d 6d 61 70 29 3b 0a 20 20 20 20 20 20 72 63  zMmap);.      rc
115d0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 52   = sqlite3PagerR
115e0 65 61 64 46 69 6c 65 68 65 61 64 65 72 28 70 42  eadFileheader(pB
115f0 74 2d 3e 70 50 61 67 65 72 2c 73 69 7a 65 6f 66  t->pPager,sizeof
11600 28 7a 44 62 48 65 61 64 65 72 29 2c 7a 44 62 48  (zDbHeader),zDbH
11610 65 61 64 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20  eader);.    }.  
11620 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
11630 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  _OK ){.      got
11640 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74  o btree_open_out
11650 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 74 2d  ;.    }.    pBt-
11660 3e 6f 70 65 6e 46 6c 61 67 73 20 3d 20 28 75 38  >openFlags = (u8
11670 29 66 6c 61 67 73 3b 0a 20 20 20 20 70 42 74 2d  )flags;.    pBt-
11680 3e 64 62 20 3d 20 64 62 3b 0a 20 20 20 20 73 71  >db = db;.    sq
11690 6c 69 74 65 33 50 61 67 65 72 53 65 74 42 75 73  lite3PagerSetBus
116a0 79 68 61 6e 64 6c 65 72 28 70 42 74 2d 3e 70 50  yhandler(pBt->pP
116b0 61 67 65 72 2c 20 62 74 72 65 65 49 6e 76 6f 6b  ager, btreeInvok
116c0 65 42 75 73 79 48 61 6e 64 6c 65 72 2c 20 70 42  eBusyHandler, pB
116d0 74 29 3b 0a 20 20 20 20 70 2d 3e 70 42 74 20 3d  t);.    p->pBt =
116e0 20 70 42 74 3b 0a 20 20 0a 20 20 20 20 70 42 74   pBt;.  .    pBt
116f0 2d 3e 70 43 75 72 73 6f 72 20 3d 20 30 3b 0a 20  ->pCursor = 0;. 
11700 20 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d     pBt->pPage1 =
11710 20 30 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69   0;.    if( sqli
11720 74 65 33 50 61 67 65 72 49 73 72 65 61 64 6f 6e  te3PagerIsreadon
11730 6c 79 28 70 42 74 2d 3e 70 50 61 67 65 72 29 20  ly(pBt->pPager) 
11740 29 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20  ) pBt->btsFlags 
11750 7c 3d 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59  |= BTS_READ_ONLY
11760 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
11770 53 45 43 55 52 45 5f 44 45 4c 45 54 45 0a 20 20  SECURE_DELETE.  
11780 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20    pBt->btsFlags 
11790 7c 3d 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45  |= BTS_SECURE_DE
117a0 4c 45 54 45 3b 0a 23 65 6e 64 69 66 0a 20 20 20  LETE;.#endif.   
117b0 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
117c0 20 52 2d 35 31 38 37 33 2d 33 39 36 31 38 20 54   R-51873-39618 T
117d0 68 65 20 70 61 67 65 20 73 69 7a 65 20 66 6f 72  he page size for
117e0 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65   a database file
117f0 20 69 73 0a 20 20 20 20 2a 2a 20 64 65 74 65 72   is.    ** deter
11800 6d 69 6e 65 64 20 62 79 20 74 68 65 20 32 2d 62  mined by the 2-b
11810 79 74 65 20 69 6e 74 65 67 65 72 20 6c 6f 63 61  yte integer loca
11820 74 65 64 20 61 74 20 61 6e 20 6f 66 66 73 65 74  ted at an offset
11830 20 6f 66 20 31 36 20 62 79 74 65 73 20 66 72 6f   of 16 bytes fro
11840 6d 0a 20 20 20 20 2a 2a 20 74 68 65 20 62 65 67  m.    ** the beg
11850 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 64 61  inning of the da
11860 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a  tabase file. */.
11870 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a      pBt->pageSiz
11880 65 20 3d 20 28 7a 44 62 48 65 61 64 65 72 5b 31  e = (zDbHeader[1
11890 36 5d 3c 3c 38 29 20 7c 20 28 7a 44 62 48 65 61  6]<<8) | (zDbHea
118a0 64 65 72 5b 31 37 5d 3c 3c 31 36 29 3b 0a 20 20  der[17]<<16);.  
118b0 20 20 69 66 28 20 70 42 74 2d 3e 70 61 67 65 53    if( pBt->pageS
118c0 69 7a 65 3c 35 31 32 20 7c 7c 20 70 42 74 2d 3e  ize<512 || pBt->
118d0 70 61 67 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f  pageSize>SQLITE_
118e0 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 0a 20 20  MAX_PAGE_SIZE.  
118f0 20 20 20 20 20 20 20 7c 7c 20 28 28 70 42 74 2d         || ((pBt-
11900 3e 70 61 67 65 53 69 7a 65 2d 31 29 26 70 42 74  >pageSize-1)&pBt
11910 2d 3e 70 61 67 65 53 69 7a 65 29 21 3d 30 20 29  ->pageSize)!=0 )
11920 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 61 67  {.      pBt->pag
11930 65 53 69 7a 65 20 3d 20 30 3b 0a 23 69 66 6e 64  eSize = 0;.#ifnd
11940 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
11950 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20  UTOVACUUM.      
11960 2f 2a 20 49 66 20 74 68 65 20 6d 61 67 69 63 20  /* If the magic 
11970 6e 61 6d 65 20 22 3a 6d 65 6d 6f 72 79 3a 22 20  name ":memory:" 
11980 77 69 6c 6c 20 63 72 65 61 74 65 20 61 6e 20 69  will create an i
11990 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
119a0 65 2c 20 74 68 65 6e 0a 20 20 20 20 20 20 2a 2a  e, then.      **
119b0 20 6c 65 61 76 65 20 74 68 65 20 61 75 74 6f 56   leave the autoV
119c0 61 63 75 75 6d 20 6d 6f 64 65 20 61 74 20 30 20  acuum mode at 0 
119d0 28 64 6f 20 6e 6f 74 20 61 75 74 6f 2d 76 61 63  (do not auto-vac
119e0 75 75 6d 29 2c 20 65 76 65 6e 20 69 66 0a 20 20  uum), even if.  
119f0 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 44 45      ** SQLITE_DE
11a00 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d  FAULT_AUTOVACUUM
11a10 20 69 73 20 74 72 75 65 2e 20 4f 6e 20 74 68 65   is true. On the
11a20 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 69 66 0a   other hand, if.
11a30 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f        ** SQLITE_
11a40 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 20 68 61  OMIT_MEMORYDB ha
11a50 73 20 62 65 65 6e 20 64 65 66 69 6e 65 64 2c 20  s been defined, 
11a60 74 68 65 6e 20 22 3a 6d 65 6d 6f 72 79 3a 22 20  then ":memory:" 
11a70 69 73 20 6a 75 73 74 20 61 0a 20 20 20 20 20 20  is just a.      
11a80 2a 2a 20 72 65 67 75 6c 61 72 20 66 69 6c 65 2d  ** regular file-
11a90 6e 61 6d 65 2e 20 49 6e 20 74 68 69 73 20 63 61  name. In this ca
11aa0 73 65 20 74 68 65 20 61 75 74 6f 2d 76 61 63 75  se the auto-vacu
11ab0 75 6d 20 61 70 70 6c 69 65 73 20 61 73 20 70 65  um applies as pe
11ac0 72 20 6e 6f 72 6d 61 6c 2e 0a 20 20 20 20 20 20  r normal..      
11ad0 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 7a 46 69  */.      if( zFi
11ae0 6c 65 6e 61 6d 65 20 26 26 20 21 69 73 4d 65 6d  lename && !isMem
11af0 64 62 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42  db ){.        pB
11b00 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20  t->autoVacuum = 
11b10 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f  (SQLITE_DEFAULT_
11b20 41 55 54 4f 56 41 43 55 55 4d 20 3f 20 31 20 3a  AUTOVACUUM ? 1 :
11b30 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 42 74   0);.        pBt
11b40 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 28  ->incrVacuum = (
11b50 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41  SQLITE_DEFAULT_A
11b60 55 54 4f 56 41 43 55 55 4d 3d 3d 32 20 3f 20 31  UTOVACUUM==2 ? 1
11b70 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23   : 0);.      }.#
11b80 65 6e 64 69 66 0a 20 20 20 20 20 20 6e 52 65 73  endif.      nRes
11b90 65 72 76 65 20 3d 20 30 3b 0a 20 20 20 20 7d 65  erve = 0;.    }e
11ba0 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56  lse{.      /* EV
11bb0 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 37 34  IDENCE-OF: R-374
11bc0 39 37 2d 34 32 34 31 32 20 54 68 65 20 73 69 7a  97-42412 The siz
11bd0 65 20 6f 66 20 74 68 65 20 72 65 73 65 72 76 65  e of the reserve
11be0 64 20 72 65 67 69 6f 6e 20 69 73 0a 20 20 20 20  d region is.    
11bf0 20 20 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20    ** determined 
11c00 62 79 20 74 68 65 20 6f 6e 65 2d 62 79 74 65 20  by the one-byte 
11c10 75 6e 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  unsigned integer
11c20 20 66 6f 75 6e 64 20 61 74 20 61 6e 20 6f 66 66   found at an off
11c30 73 65 74 20 6f 66 20 32 30 0a 20 20 20 20 20 20  set of 20.      
11c40 2a 2a 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61  ** into the data
11c50 62 61 73 65 20 66 69 6c 65 20 68 65 61 64 65 72  base file header
11c60 2e 20 2a 2f 0a 20 20 20 20 20 20 6e 52 65 73 65  . */.      nRese
11c70 72 76 65 20 3d 20 7a 44 62 48 65 61 64 65 72 5b  rve = zDbHeader[
11c80 32 30 5d 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e  20];.      pBt->
11c90 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f  btsFlags |= BTS_
11ca0 50 41 47 45 53 49 5a 45 5f 46 49 58 45 44 3b 0a  PAGESIZE_FIXED;.
11cb0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
11cc0 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
11cd0 20 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61       pBt->autoVa
11ce0 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65  cuum = (get4byte
11cf0 28 26 7a 44 62 48 65 61 64 65 72 5b 33 36 20 2b  (&zDbHeader[36 +
11d00 20 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a 20 20 20   4*4])?1:0);.   
11d10 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75     pBt->incrVacu
11d20 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28 26  um = (get4byte(&
11d30 7a 44 62 48 65 61 64 65 72 5b 33 36 20 2b 20 37  zDbHeader[36 + 7
11d40 2a 34 5d 29 3f 31 3a 30 29 3b 0a 23 65 6e 64 69  *4])?1:0);.#endi
11d50 66 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  f.    }.    rc =
11d60 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
11d70 50 61 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 50  Pagesize(pBt->pP
11d80 61 67 65 72 2c 20 26 70 42 74 2d 3e 70 61 67 65  ager, &pBt->page
11d90 53 69 7a 65 2c 20 6e 52 65 73 65 72 76 65 29 3b  Size, nReserve);
11da0 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f  .    if( rc ) go
11db0 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75  to btree_open_ou
11dc0 74 3b 0a 20 20 20 20 70 42 74 2d 3e 75 73 61 62  t;.    pBt->usab
11dd0 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 70 61  leSize = pBt->pa
11de0 67 65 53 69 7a 65 20 2d 20 6e 52 65 73 65 72 76  geSize - nReserv
11df0 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  e;.    assert( (
11e00 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 26 20  pBt->pageSize & 
11e10 37 29 3d 3d 30 20 29 3b 20 20 2f 2a 20 38 2d 62  7)==0 );  /* 8-b
11e20 79 74 65 20 61 6c 69 67 6e 6d 65 6e 74 20 6f 66  yte alignment of
11e30 20 70 61 67 65 53 69 7a 65 20 2a 2f 0a 20 20 20   pageSize */.   
11e40 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
11e50 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
11e60 5f 43 41 43 48 45 29 20 26 26 20 21 64 65 66 69  _CACHE) && !defi
11e70 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
11e80 44 49 53 4b 49 4f 29 0a 20 20 20 20 2f 2a 20 41  DISKIO).    /* A
11e90 64 64 20 74 68 65 20 6e 65 77 20 42 74 53 68 61  dd the new BtSha
11ea0 72 65 64 20 6f 62 6a 65 63 74 20 74 6f 20 74 68  red object to th
11eb0 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 73 68  e linked list sh
11ec0 61 72 61 62 6c 65 20 42 74 53 68 61 72 65 64 73  arable BtShareds
11ed0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
11ee0 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a   p->sharable ){.
11ef0 20 20 20 20 20 20 4d 55 54 45 58 5f 4c 4f 47 49        MUTEX_LOGI
11f00 43 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  C( sqlite3_mutex
11f10 20 2a 6d 75 74 65 78 53 68 61 72 65 64 3b 20 29   *mutexShared; )
11f20 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 52 65 66  .      pBt->nRef
11f30 20 3d 20 31 3b 0a 20 20 20 20 20 20 4d 55 54 45   = 1;.      MUTE
11f40 58 5f 4c 4f 47 49 43 28 20 6d 75 74 65 78 53 68  X_LOGIC( mutexSh
11f50 61 72 65 64 20 3d 20 73 71 6c 69 74 65 33 4d 75  ared = sqlite3Mu
11f60 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f  texAlloc(SQLITE_
11f70 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53  MUTEX_STATIC_MAS
11f80 54 45 52 29 3b 29 0a 20 20 20 20 20 20 69 66 28  TER);).      if(
11f90 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41   SQLITE_THREADSA
11fa0 46 45 20 26 26 20 73 71 6c 69 74 65 33 47 6c 6f  FE && sqlite3Glo
11fb0 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d  balConfig.bCoreM
11fc0 75 74 65 78 20 29 7b 0a 20 20 20 20 20 20 20 20  utex ){.        
11fd0 70 42 74 2d 3e 6d 75 74 65 78 20 3d 20 73 71 6c  pBt->mutex = sql
11fe0 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53  ite3MutexAlloc(S
11ff0 51 4c 49 54 45 5f 4d 55 54 45 58 5f 46 41 53 54  QLITE_MUTEX_FAST
12000 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
12010 42 74 2d 3e 6d 75 74 65 78 3d 3d 30 20 29 7b 0a  Bt->mutex==0 ){.
12020 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
12030 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
12040 20 20 20 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f         db->mallo
12050 63 46 61 69 6c 65 64 20 3d 20 30 3b 0a 20 20 20  cFailed = 0;.   
12060 20 20 20 20 20 20 20 67 6f 74 6f 20 62 74 72 65         goto btre
12070 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20  e_open_out;.    
12080 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
12090 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
120a0 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 53 68 61  x_enter(mutexSha
120b0 72 65 64 29 3b 0a 20 20 20 20 20 20 70 42 74 2d  red);.      pBt-
120c0 3e 70 4e 65 78 74 20 3d 20 47 4c 4f 42 41 4c 28  >pNext = GLOBAL(
120d0 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65  BtShared*,sqlite
120e0 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74  3SharedCacheList
120f0 29 3b 0a 20 20 20 20 20 20 47 4c 4f 42 41 4c 28  );.      GLOBAL(
12100 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65  BtShared*,sqlite
12110 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74  3SharedCacheList
12120 29 20 3d 20 70 42 74 3b 0a 20 20 20 20 20 20 73  ) = pBt;.      s
12130 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
12140 76 65 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b  ve(mutexShared);
12150 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
12160 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  }..#if !defined(
12170 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
12180 45 44 5f 43 41 43 48 45 29 20 26 26 20 21 64 65  ED_CACHE) && !de
12190 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
121a0 54 5f 44 49 53 4b 49 4f 29 0a 20 20 2f 2a 20 49  T_DISKIO).  /* I
121b0 66 20 74 68 65 20 6e 65 77 20 42 74 72 65 65 20  f the new Btree 
121c0 75 73 65 73 20 61 20 73 68 61 72 61 62 6c 65 20  uses a sharable 
121d0 70 42 74 53 68 61 72 65 64 2c 20 74 68 65 6e 20  pBtShared, then 
121e0 6c 69 6e 6b 20 74 68 65 20 6e 65 77 0a 20 20 2a  link the new.  *
121f0 2a 20 42 74 72 65 65 20 69 6e 74 6f 20 74 68 65  * Btree into the
12200 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 73 68 61   list of all sha
12210 72 61 62 6c 65 20 42 74 72 65 65 73 20 66 6f 72  rable Btrees for
12220 20 74 68 65 20 73 61 6d 65 20 63 6f 6e 6e 65 63   the same connec
12230 74 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68 65 20 6c  tion..  ** The l
12240 69 73 74 20 69 73 20 6b 65 70 74 20 69 6e 20 61  ist is kept in a
12250 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 20 62  scending order b
12260 79 20 70 42 74 20 61 64 64 72 65 73 73 2e 0a 20  y pBt address.. 
12270 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 68 61   */.  if( p->sha
12280 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 69 6e 74  rable ){.    int
12290 20 69 3b 0a 20 20 20 20 42 74 72 65 65 20 2a 70   i;.    Btree *p
122a0 53 69 62 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  Sib;.    for(i=0
122b0 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  ; i<db->nDb; i++
122c0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70 53  ){.      if( (pS
122d0 69 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e  ib = db->aDb[i].
122e0 70 42 74 29 21 3d 30 20 26 26 20 70 53 69 62 2d  pBt)!=0 && pSib-
122f0 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20  >sharable ){.   
12300 20 20 20 20 20 77 68 69 6c 65 28 20 70 53 69 62       while( pSib
12310 2d 3e 70 50 72 65 76 20 29 7b 20 70 53 69 62 20  ->pPrev ){ pSib 
12320 3d 20 70 53 69 62 2d 3e 70 50 72 65 76 3b 20 7d  = pSib->pPrev; }
12330 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e  .        if( p->
12340 70 42 74 3c 70 53 69 62 2d 3e 70 42 74 20 29 7b  pBt<pSib->pBt ){
12350 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 4e  .          p->pN
12360 65 78 74 20 3d 20 70 53 69 62 3b 0a 20 20 20 20  ext = pSib;.    
12370 20 20 20 20 20 20 70 2d 3e 70 50 72 65 76 20 3d        p->pPrev =
12380 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 70 53   0;.          pS
12390 69 62 2d 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20  ib->pPrev = p;. 
123a0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
123b0 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 70          while( p
123c0 53 69 62 2d 3e 70 4e 65 78 74 20 26 26 20 70 53  Sib->pNext && pS
123d0 69 62 2d 3e 70 4e 65 78 74 2d 3e 70 42 74 3c 70  ib->pNext->pBt<p
123e0 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20  ->pBt ){.       
123f0 20 20 20 20 20 70 53 69 62 20 3d 20 70 53 69 62       pSib = pSib
12400 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20  ->pNext;.       
12410 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70     }.          p
12420 2d 3e 70 4e 65 78 74 20 3d 20 70 53 69 62 2d 3e  ->pNext = pSib->
12430 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20  pNext;.         
12440 20 70 2d 3e 70 50 72 65 76 20 3d 20 70 53 69 62   p->pPrev = pSib
12450 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
12460 70 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20  p->pNext ){.    
12470 20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74          p->pNext
12480 2d 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20 20 20  ->pPrev = p;.   
12490 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
124a0 20 20 20 70 53 69 62 2d 3e 70 4e 65 78 74 20 3d     pSib->pNext =
124b0 20 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   p;.        }.  
124c0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
124d0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23     }.    }.  }.#
124e0 65 6e 64 69 66 0a 20 20 2a 70 70 42 74 72 65 65  endif.  *ppBtree
124f0 20 3d 20 70 3b 0a 0a 62 74 72 65 65 5f 6f 70 65   = p;..btree_ope
12500 6e 5f 6f 75 74 3a 0a 20 20 69 66 28 20 72 63 21  n_out:.  if( rc!
12510 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
12520 20 20 69 66 28 20 70 42 74 20 26 26 20 70 42 74    if( pBt && pBt
12530 2d 3e 70 50 61 67 65 72 20 29 7b 0a 20 20 20 20  ->pPager ){.    
12540 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c    sqlite3PagerCl
12550 6f 73 65 28 70 42 74 2d 3e 70 50 61 67 65 72 29  ose(pBt->pPager)
12560 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
12570 74 65 33 5f 66 72 65 65 28 70 42 74 29 3b 0a 20  te3_free(pBt);. 
12580 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
12590 70 29 3b 0a 20 20 20 20 2a 70 70 42 74 72 65 65  p);.    *ppBtree
125a0 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
125b0 20 20 20 2f 2a 20 49 66 20 74 68 65 20 42 2d 54     /* If the B-T
125c0 72 65 65 20 77 61 73 20 73 75 63 63 65 73 73 66  ree was successf
125d0 75 6c 6c 79 20 6f 70 65 6e 65 64 2c 20 73 65 74  ully opened, set
125e0 20 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65   the pager-cache
125f0 20 73 69 7a 65 20 74 6f 20 74 68 65 0a 20 20 20   size to the.   
12600 20 2a 2a 20 64 65 66 61 75 6c 74 20 76 61 6c 75   ** default valu
12610 65 2e 20 45 78 63 65 70 74 2c 20 77 68 65 6e 20  e. Except, when 
12620 6f 70 65 6e 69 6e 67 20 6f 6e 20 61 6e 20 65 78  opening on an ex
12630 69 73 74 69 6e 67 20 73 68 61 72 65 64 20 70 61  isting shared pa
12640 67 65 72 2d 63 61 63 68 65 2c 0a 20 20 20 20 2a  ger-cache,.    *
12650 2a 20 64 6f 20 6e 6f 74 20 63 68 61 6e 67 65 20  * do not change 
12660 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65 20  the pager-cache 
12670 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  size..    */.   
12680 20 69 66 28 20 73 71 6c 69 74 65 33 42 74 72 65   if( sqlite3Btre
12690 65 53 63 68 65 6d 61 28 70 2c 20 30 2c 20 30 29  eSchema(p, 0, 0)
126a0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
126b0 69 74 65 33 50 61 67 65 72 53 65 74 43 61 63 68  ite3PagerSetCach
126c0 65 73 69 7a 65 28 70 2d 3e 70 42 74 2d 3e 70 50  esize(p->pBt->pP
126d0 61 67 65 72 2c 20 53 51 4c 49 54 45 5f 44 45 46  ager, SQLITE_DEF
126e0 41 55 4c 54 5f 43 41 43 48 45 5f 53 49 5a 45 29  AULT_CACHE_SIZE)
126f0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
12700 28 20 6d 75 74 65 78 4f 70 65 6e 20 29 7b 0a 20  ( mutexOpen ){. 
12710 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
12720 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 6d 75  e3_mutex_held(mu
12730 74 65 78 4f 70 65 6e 29 20 29 3b 0a 20 20 20 20  texOpen) );.    
12740 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
12750 61 76 65 28 6d 75 74 65 78 4f 70 65 6e 29 3b 0a  ave(mutexOpen);.
12760 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
12770 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 72 65 6d  .}../*.** Decrem
12780 65 6e 74 20 74 68 65 20 42 74 53 68 61 72 65 64  ent the BtShared
12790 2e 6e 52 65 66 20 63 6f 75 6e 74 65 72 2e 20 20  .nRef counter.  
127a0 57 68 65 6e 20 69 74 20 72 65 61 63 68 65 73 20  When it reaches 
127b0 7a 65 72 6f 2c 0a 2a 2a 20 72 65 6d 6f 76 65 20  zero,.** remove 
127c0 74 68 65 20 42 74 53 68 61 72 65 64 20 73 74 72  the BtShared str
127d0 75 63 74 75 72 65 20 66 72 6f 6d 20 74 68 65 20  ucture from the 
127e0 73 68 61 72 69 6e 67 20 6c 69 73 74 2e 20 20 52  sharing list.  R
127f0 65 74 75 72 6e 0a 2a 2a 20 74 72 75 65 20 69 66  eturn.** true if
12800 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 6e 52   the BtShared.nR
12810 65 66 20 63 6f 75 6e 74 65 72 20 72 65 61 63 68  ef counter reach
12820 65 73 20 7a 65 72 6f 20 61 6e 64 20 72 65 74 75  es zero and retu
12830 72 6e 0a 2a 2a 20 66 61 6c 73 65 20 69 66 20 69  rn.** false if i
12840 74 20 69 73 20 73 74 69 6c 6c 20 70 6f 73 69 74  t is still posit
12850 69 76 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ive..*/.static i
12860 6e 74 20 72 65 6d 6f 76 65 46 72 6f 6d 53 68 61  nt removeFromSha
12870 72 69 6e 67 4c 69 73 74 28 42 74 53 68 61 72 65  ringList(BtShare
12880 64 20 2a 70 42 74 29 7b 0a 23 69 66 6e 64 65 66  d *pBt){.#ifndef
12890 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41   SQLITE_OMIT_SHA
128a0 52 45 44 5f 43 41 43 48 45 0a 20 20 4d 55 54 45  RED_CACHE.  MUTE
128b0 58 5f 4c 4f 47 49 43 28 20 73 71 6c 69 74 65 33  X_LOGIC( sqlite3
128c0 5f 6d 75 74 65 78 20 2a 70 4d 61 73 74 65 72 3b  _mutex *pMaster;
128d0 20 29 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70   ).  BtShared *p
128e0 4c 69 73 74 3b 0a 20 20 69 6e 74 20 72 65 6d 6f  List;.  int remo
128f0 76 65 64 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65  ved = 0;..  asse
12900 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
12910 78 5f 6e 6f 74 68 65 6c 64 28 70 42 74 2d 3e 6d  x_notheld(pBt->m
12920 75 74 65 78 29 20 29 3b 0a 20 20 4d 55 54 45 58  utex) );.  MUTEX
12930 5f 4c 4f 47 49 43 28 20 70 4d 61 73 74 65 72 20  _LOGIC( pMaster 
12940 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c  = sqlite3MutexAl
12950 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
12960 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b  _STATIC_MASTER);
12970 20 29 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74   ).  sqlite3_mut
12980 65 78 5f 65 6e 74 65 72 28 70 4d 61 73 74 65 72  ex_enter(pMaster
12990 29 3b 0a 20 20 70 42 74 2d 3e 6e 52 65 66 2d 2d  );.  pBt->nRef--
129a0 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 6e 52 65  ;.  if( pBt->nRe
129b0 66 3c 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  f<=0 ){.    if( 
129c0 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a  GLOBAL(BtShared*
129d0 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61  ,sqlite3SharedCa
129e0 63 68 65 4c 69 73 74 29 3d 3d 70 42 74 20 29 7b  cheList)==pBt ){
129f0 0a 20 20 20 20 20 20 47 4c 4f 42 41 4c 28 42 74  .      GLOBAL(Bt
12a00 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53  Shared*,sqlite3S
12a10 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 20  haredCacheList) 
12a20 3d 20 70 42 74 2d 3e 70 4e 65 78 74 3b 0a 20 20  = pBt->pNext;.  
12a30 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
12a40 4c 69 73 74 20 3d 20 47 4c 4f 42 41 4c 28 42 74  List = GLOBAL(Bt
12a50 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53  Shared*,sqlite3S
12a60 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 3b  haredCacheList);
12a70 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 41 4c  .      while( AL
12a80 57 41 59 53 28 70 4c 69 73 74 29 20 26 26 20 70  WAYS(pList) && p
12a90 4c 69 73 74 2d 3e 70 4e 65 78 74 21 3d 70 42 74  List->pNext!=pBt
12aa0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4c 69 73   ){.        pLis
12ab0 74 3d 70 4c 69 73 74 2d 3e 70 4e 65 78 74 3b 0a  t=pList->pNext;.
12ac0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
12ad0 28 20 41 4c 57 41 59 53 28 70 4c 69 73 74 29 20  ( ALWAYS(pList) 
12ae0 29 7b 0a 20 20 20 20 20 20 20 20 70 4c 69 73 74  ){.        pList
12af0 2d 3e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70  ->pNext = pBt->p
12b00 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Next;.      }.  
12b10 20 20 7d 0a 20 20 20 20 69 66 28 20 53 51 4c 49    }.    if( SQLI
12b20 54 45 5f 54 48 52 45 41 44 53 41 46 45 20 29 7b  TE_THREADSAFE ){
12b30 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  .      sqlite3_m
12b40 75 74 65 78 5f 66 72 65 65 28 70 42 74 2d 3e 6d  utex_free(pBt->m
12b50 75 74 65 78 29 3b 0a 20 20 20 20 7d 0a 20 20 20  utex);.    }.   
12b60 20 72 65 6d 6f 76 65 64 20 3d 20 31 3b 0a 20 20   removed = 1;.  
12b70 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  }.  sqlite3_mute
12b80 78 5f 6c 65 61 76 65 28 70 4d 61 73 74 65 72 29  x_leave(pMaster)
12b90 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 6d 6f 76  ;.  return remov
12ba0 65 64 3b 0a 23 65 6c 73 65 0a 20 20 72 65 74 75  ed;.#else.  retu
12bb0 72 6e 20 31 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a  rn 1;.#endif.}..
12bc0 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20  /*.** Make sure 
12bd0 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 70  pBt->pTmpSpace p
12be0 6f 69 6e 74 73 20 74 6f 20 61 6e 20 61 6c 6c 6f  oints to an allo
12bf0 63 61 74 69 6f 6e 20 6f 66 20 0a 2a 2a 20 4d 58  cation of .** MX
12c00 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20  _CELL_SIZE(pBt) 
12c10 62 79 74 65 73 20 77 69 74 68 20 61 20 34 2d 62  bytes with a 4-b
12c20 79 74 65 20 70 72 65 66 69 78 20 66 6f 72 20 61  yte prefix for a
12c30 20 6c 65 66 74 2d 63 68 69 6c 64 0a 2a 2a 20 70   left-child.** p
12c40 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  ointer..*/.stati
12c50 63 20 76 6f 69 64 20 61 6c 6c 6f 63 61 74 65 54  c void allocateT
12c60 65 6d 70 53 70 61 63 65 28 42 74 53 68 61 72 65  empSpace(BtShare
12c70 64 20 2a 70 42 74 29 7b 0a 20 20 69 66 28 20 21  d *pBt){.  if( !
12c80 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 29  pBt->pTmpSpace )
12c90 7b 0a 20 20 20 20 70 42 74 2d 3e 70 54 6d 70 53  {.    pBt->pTmpS
12ca0 70 61 63 65 20 3d 20 73 71 6c 69 74 65 33 50 61  pace = sqlite3Pa
12cb0 67 65 4d 61 6c 6c 6f 63 28 20 70 42 74 2d 3e 70  geMalloc( pBt->p
12cc0 61 67 65 53 69 7a 65 20 29 3b 0a 0a 20 20 20 20  ageSize );..    
12cd0 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 75 73  /* One of the us
12ce0 65 73 20 6f 66 20 70 42 74 2d 3e 70 54 6d 70 53  es of pBt->pTmpS
12cf0 70 61 63 65 20 69 73 20 74 6f 20 66 6f 72 6d 61  pace is to forma
12d00 74 20 63 65 6c 6c 73 20 62 65 66 6f 72 65 0a 20  t cells before. 
12d10 20 20 20 2a 2a 20 69 6e 73 65 72 74 69 6e 67 20     ** inserting 
12d20 74 68 65 6d 20 69 6e 74 6f 20 61 20 6c 65 61 66  them into a leaf
12d30 20 70 61 67 65 20 28 66 75 6e 63 74 69 6f 6e 20   page (function 
12d40 66 69 6c 6c 49 6e 43 65 6c 6c 28 29 29 2e 20 49  fillInCell()). I
12d50 66 0a 20 20 20 20 2a 2a 20 61 20 63 65 6c 6c 20  f.    ** a cell 
12d60 69 73 20 6c 65 73 73 20 74 68 61 6e 20 34 20 62  is less than 4 b
12d70 79 74 65 73 20 69 6e 20 73 69 7a 65 2c 20 69 74  ytes in size, it
12d80 20 69 73 20 72 6f 75 6e 64 65 64 20 75 70 20 74   is rounded up t
12d90 6f 20 34 20 62 79 74 65 73 0a 20 20 20 20 2a 2a  o 4 bytes.    **
12da0 20 62 79 20 74 68 65 20 76 61 72 69 6f 75 73 20   by the various 
12db0 72 6f 75 74 69 6e 65 73 20 74 68 61 74 20 6d 61  routines that ma
12dc0 6e 69 70 75 6c 61 74 65 20 62 69 6e 61 72 79 20  nipulate binary 
12dd0 63 65 6c 6c 73 2e 20 57 68 69 63 68 0a 20 20 20  cells. Which.   
12de0 20 2a 2a 20 63 61 6e 20 6d 65 61 6e 20 74 68 61   ** can mean tha
12df0 74 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 29 20 6f  t fillInCell() o
12e00 6e 6c 79 20 69 6e 69 74 69 61 6c 69 7a 65 73 20  nly initializes 
12e10 74 68 65 20 66 69 72 73 74 20 32 20 6f 72 20 33  the first 2 or 3
12e20 0a 20 20 20 20 2a 2a 20 62 79 74 65 73 20 6f 66  .    ** bytes of
12e30 20 70 54 6d 70 53 70 61 63 65 2c 20 62 75 74 20   pTmpSpace, but 
12e40 74 68 61 74 20 74 68 65 20 66 69 72 73 74 20 34  that the first 4
12e50 20 62 79 74 65 73 20 61 72 65 20 63 6f 70 69 65   bytes are copie
12e60 64 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 69 74  d from.    ** it
12e70 20 69 6e 74 6f 20 61 20 64 61 74 61 62 61 73 65   into a database
12e80 20 70 61 67 65 2e 20 54 68 69 73 20 69 73 20 6e   page. This is n
12e90 6f 74 20 61 63 74 75 61 6c 6c 79 20 61 20 70 72  ot actually a pr
12ea0 6f 62 6c 65 6d 2c 20 62 75 74 20 69 74 0a 20 20  oblem, but it.  
12eb0 20 20 2a 2a 20 64 6f 65 73 20 63 61 75 73 65 20    ** does cause 
12ec0 61 20 76 61 6c 67 72 69 6e 64 20 65 72 72 6f 72  a valgrind error
12ed0 20 77 68 65 6e 20 74 68 65 20 31 20 6f 72 20 32   when the 1 or 2
12ee0 20 62 79 74 65 73 20 6f 66 20 75 6e 69 74 69 61   bytes of unitia
12ef0 6c 69 7a 65 64 20 0a 20 20 20 20 2a 2a 20 64 61  lized .    ** da
12f00 74 61 20 69 73 20 70 61 73 73 65 64 20 74 6f 20  ta is passed to 
12f10 73 79 73 74 65 6d 20 63 61 6c 6c 20 77 72 69 74  system call writ
12f20 65 28 29 2e 20 53 6f 20 74 6f 20 61 76 6f 69 64  e(). So to avoid
12f30 20 74 68 69 73 20 65 72 72 6f 72 2c 0a 20 20 20   this error,.   
12f40 20 2a 2a 20 7a 65 72 6f 20 74 68 65 20 66 69 72   ** zero the fir
12f50 73 74 20 34 20 62 79 74 65 73 20 6f 66 20 74 65  st 4 bytes of te
12f60 6d 70 20 73 70 61 63 65 20 68 65 72 65 2e 0a 20  mp space here.. 
12f70 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 6c 73     **.    ** Als
12f80 6f 3a 20 20 50 72 6f 76 69 64 65 20 66 6f 75 72  o:  Provide four
12f90 20 62 79 74 65 73 20 6f 66 20 69 6e 69 74 69 61   bytes of initia
12fa0 6c 69 7a 65 64 20 73 70 61 63 65 20 62 65 66 6f  lized space befo
12fb0 72 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 62 65  re the.    ** be
12fc0 67 69 6e 6e 69 6e 67 20 6f 66 20 70 54 6d 70 53  ginning of pTmpS
12fd0 70 61 63 65 20 61 73 20 61 6e 20 61 72 65 61 20  pace as an area 
12fe0 61 76 61 69 6c 61 62 6c 65 20 74 6f 20 70 72 65  available to pre
12ff0 70 65 6e 64 20 74 68 65 0a 20 20 20 20 2a 2a 20  pend the.    ** 
13000 6c 65 66 74 2d 63 68 69 6c 64 20 70 6f 69 6e 74  left-child point
13010 65 72 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e  er to the beginn
13020 69 6e 67 20 6f 66 20 61 20 63 65 6c 6c 2e 0a 20  ing of a cell.. 
13030 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 42     */.    if( pB
13040 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 29 7b 0a  t->pTmpSpace ){.
13050 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 42 74        memset(pBt
13060 2d 3e 70 54 6d 70 53 70 61 63 65 2c 20 30 2c 20  ->pTmpSpace, 0, 
13070 38 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70  8);.      pBt->p
13080 54 6d 70 53 70 61 63 65 20 2b 3d 20 34 3b 0a 20  TmpSpace += 4;. 
13090 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
130a0 2a 20 46 72 65 65 20 74 68 65 20 70 42 74 2d 3e  * Free the pBt->
130b0 70 54 6d 70 53 70 61 63 65 20 61 6c 6c 6f 63 61  pTmpSpace alloca
130c0 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  tion.*/.static v
130d0 6f 69 64 20 66 72 65 65 54 65 6d 70 53 70 61 63  oid freeTempSpac
130e0 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29  e(BtShared *pBt)
130f0 7b 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 54 6d  {.  if( pBt->pTm
13100 70 53 70 61 63 65 20 29 7b 0a 20 20 20 20 70 42  pSpace ){.    pB
13110 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 2d 3d 20  t->pTmpSpace -= 
13120 34 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61  4;.    sqlite3Pa
13130 67 65 46 72 65 65 28 70 42 74 2d 3e 70 54 6d 70  geFree(pBt->pTmp
13140 53 70 61 63 65 29 3b 0a 20 20 20 20 70 42 74 2d  Space);.    pBt-
13150 3e 70 54 6d 70 53 70 61 63 65 20 3d 20 30 3b 0a  >pTmpSpace = 0;.
13160 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f    }.}../*.** Clo
13170 73 65 20 61 6e 20 6f 70 65 6e 20 64 61 74 61 62  se an open datab
13180 61 73 65 20 61 6e 64 20 69 6e 76 61 6c 69 64 61  ase and invalida
13190 74 65 20 61 6c 6c 20 63 75 72 73 6f 72 73 2e 0a  te all cursors..
131a0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
131b0 72 65 65 43 6c 6f 73 65 28 42 74 72 65 65 20 2a  reeClose(Btree *
131c0 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  p){.  BtShared *
131d0 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
131e0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a  BtCursor *pCur;.
131f0 0a 20 20 2f 2a 20 43 6c 6f 73 65 20 61 6c 6c 20  .  /* Close all 
13200 63 75 72 73 6f 72 73 20 6f 70 65 6e 65 64 20 76  cursors opened v
13210 69 61 20 74 68 69 73 20 68 61 6e 64 6c 65 2e 20  ia this handle. 
13220 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73 71   */.  assert( sq
13230 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
13240 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  (p->db->mutex) )
13250 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
13260 45 6e 74 65 72 28 70 29 3b 0a 20 20 70 43 75 72  Enter(p);.  pCur
13270 20 3d 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b   = pBt->pCursor;
13280 0a 20 20 77 68 69 6c 65 28 20 70 43 75 72 20 29  .  while( pCur )
13290 7b 0a 20 20 20 20 42 74 43 75 72 73 6f 72 20 2a  {.    BtCursor *
132a0 70 54 6d 70 20 3d 20 70 43 75 72 3b 0a 20 20 20  pTmp = pCur;.   
132b0 20 70 43 75 72 20 3d 20 70 43 75 72 2d 3e 70 4e   pCur = pCur->pN
132c0 65 78 74 3b 0a 20 20 20 20 69 66 28 20 70 54 6d  ext;.    if( pTm
132d0 70 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29 7b 0a  p->pBtree==p ){.
132e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
132f0 65 65 43 6c 6f 73 65 43 75 72 73 6f 72 28 70 54  eeCloseCursor(pT
13300 6d 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  mp);.    }.  }..
13310 20 20 2f 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 6e    /* Rollback an
13320 79 20 61 63 74 69 76 65 20 74 72 61 6e 73 61 63  y active transac
13330 74 69 6f 6e 20 61 6e 64 20 66 72 65 65 20 74 68  tion and free th
13340 65 20 68 61 6e 64 6c 65 20 73 74 72 75 63 74 75  e handle structu
13350 72 65 2e 0a 20 20 2a 2a 20 54 68 65 20 63 61 6c  re..  ** The cal
13360 6c 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65  l to sqlite3Btre
13370 65 52 6f 6c 6c 62 61 63 6b 28 29 20 64 72 6f 70  eRollback() drop
13380 73 20 61 6e 79 20 74 61 62 6c 65 2d 6c 6f 63 6b  s any table-lock
13390 73 20 68 65 6c 64 20 62 79 0a 20 20 2a 2a 20 74  s held by.  ** t
133a0 68 69 73 20 68 61 6e 64 6c 65 2e 0a 20 20 2a 2f  his handle..  */
133b0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 52  .  sqlite3BtreeR
133c0 6f 6c 6c 62 61 63 6b 28 70 2c 20 53 51 4c 49 54  ollback(p, SQLIT
133d0 45 5f 4f 4b 2c 20 30 29 3b 0a 20 20 73 71 6c 69  E_OK, 0);.  sqli
133e0 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
133f0 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  ;..  /* If there
13400 20 61 72 65 20 73 74 69 6c 6c 20 6f 74 68 65 72   are still other
13410 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66   outstanding ref
13420 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 73  erences to the s
13430 68 61 72 65 64 2d 62 74 72 65 65 0a 20 20 2a 2a  hared-btree.  **
13440 20 73 74 72 75 63 74 75 72 65 2c 20 72 65 74 75   structure, retu
13450 72 6e 20 6e 6f 77 2e 20 54 68 65 20 72 65 6d 61  rn now. The rema
13460 69 6e 64 65 72 20 6f 66 20 74 68 69 73 20 70 72  inder of this pr
13470 6f 63 65 64 75 72 65 20 63 6c 65 61 6e 73 20 0a  ocedure cleans .
13480 20 20 2a 2a 20 75 70 20 74 68 65 20 73 68 61 72    ** up the shar
13490 65 64 2d 62 74 72 65 65 2e 0a 20 20 2a 2f 0a 20  ed-btree..  */. 
134a0 20 61 73 73 65 72 74 28 20 70 2d 3e 77 61 6e 74   assert( p->want
134b0 54 6f 4c 6f 63 6b 3d 3d 30 20 26 26 20 70 2d 3e  ToLock==0 && p->
134c0 6c 6f 63 6b 65 64 3d 3d 30 20 29 3b 0a 20 20 69  locked==0 );.  i
134d0 66 28 20 21 70 2d 3e 73 68 61 72 61 62 6c 65 20  f( !p->sharable 
134e0 7c 7c 20 72 65 6d 6f 76 65 46 72 6f 6d 53 68 61  || removeFromSha
134f0 72 69 6e 67 4c 69 73 74 28 70 42 74 29 20 29 7b  ringList(pBt) ){
13500 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 42 74 20  .    /* The pBt 
13510 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 6f 6e 20  is no longer on 
13520 74 68 65 20 73 68 61 72 69 6e 67 20 6c 69 73 74  the sharing list
13530 2c 20 73 6f 20 77 65 20 63 61 6e 20 61 63 63 65  , so we can acce
13540 73 73 0a 20 20 20 20 2a 2a 20 69 74 20 77 69 74  ss.    ** it wit
13550 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20 68  hout having to h
13560 6f 6c 64 20 74 68 65 20 6d 75 74 65 78 2e 0a 20  old the mutex.. 
13570 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43 6c 65     **.    ** Cle
13580 61 6e 20 6f 75 74 20 61 6e 64 20 64 65 6c 65 74  an out and delet
13590 65 20 74 68 65 20 42 74 53 68 61 72 65 64 20 6f  e the BtShared o
135a0 62 6a 65 63 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  bject..    */.  
135b0 20 20 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e    assert( !pBt->
135c0 70 43 75 72 73 6f 72 20 29 3b 0a 20 20 20 20 73  pCursor );.    s
135d0 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65  qlite3PagerClose
135e0 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20  (pBt->pPager);. 
135f0 20 20 20 69 66 28 20 70 42 74 2d 3e 78 46 72 65     if( pBt->xFre
13600 65 53 63 68 65 6d 61 20 26 26 20 70 42 74 2d 3e  eSchema && pBt->
13610 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20  pSchema ){.     
13620 20 70 42 74 2d 3e 78 46 72 65 65 53 63 68 65 6d   pBt->xFreeSchem
13630 61 28 70 42 74 2d 3e 70 53 63 68 65 6d 61 29 3b  a(pBt->pSchema);
13640 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
13650 65 33 44 62 46 72 65 65 28 30 2c 20 70 42 74 2d  e3DbFree(0, pBt-
13660 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 66  >pSchema);.    f
13670 72 65 65 54 65 6d 70 53 70 61 63 65 28 70 42 74  reeTempSpace(pBt
13680 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
13690 72 65 65 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 23  ree(pBt);.  }..#
136a0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
136b0 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a  IT_SHARED_CACHE.
136c0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 77 61 6e    assert( p->wan
136d0 74 54 6f 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20  tToLock==0 );.  
136e0 61 73 73 65 72 74 28 20 70 2d 3e 6c 6f 63 6b 65  assert( p->locke
136f0 64 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d  d==0 );.  if( p-
13700 3e 70 50 72 65 76 20 29 20 70 2d 3e 70 50 72 65  >pPrev ) p->pPre
13710 76 2d 3e 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e  v->pNext = p->pN
13720 65 78 74 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4e  ext;.  if( p->pN
13730 65 78 74 20 29 20 70 2d 3e 70 4e 65 78 74 2d 3e  ext ) p->pNext->
13740 70 50 72 65 76 20 3d 20 70 2d 3e 70 50 72 65 76  pPrev = p->pPrev
13750 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69  ;.#endif..  sqli
13760 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 72  te3_free(p);.  r
13770 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
13780 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
13790 20 74 68 65 20 6c 69 6d 69 74 20 6f 6e 20 74 68   the limit on th
137a0 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
137b0 73 20 61 6c 6c 6f 77 65 64 20 69 6e 20 74 68 65  s allowed in the
137c0 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 54 68   cache..**.** Th
137d0 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72  e maximum number
137e0 20 6f 66 20 63 61 63 68 65 20 70 61 67 65 73 20   of cache pages 
137f0 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 61 62  is set to the ab
13800 73 6f 6c 75 74 65 0a 2a 2a 20 76 61 6c 75 65 20  solute.** value 
13810 6f 66 20 6d 78 50 61 67 65 2e 20 20 49 66 20 6d  of mxPage.  If m
13820 78 50 61 67 65 20 69 73 20 6e 65 67 61 74 69 76  xPage is negativ
13830 65 2c 20 74 68 65 20 70 61 67 65 72 20 77 69 6c  e, the pager wil
13840 6c 0a 2a 2a 20 6f 70 65 72 61 74 65 20 61 73 79  l.** operate asy
13850 6e 63 68 72 6f 6e 6f 75 73 6c 79 20 2d 20 69 74  nchronously - it
13860 20 77 69 6c 6c 20 6e 6f 74 20 73 74 6f 70 20 74   will not stop t
13870 6f 20 64 6f 20 66 73 79 6e 63 28 29 73 0a 2a 2a  o do fsync()s.**
13880 20 74 6f 20 69 6e 73 75 72 65 20 64 61 74 61 20   to insure data 
13890 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  is written to th
138a0 65 20 64 69 73 6b 20 73 75 72 66 61 63 65 20 62  e disk surface b
138b0 65 66 6f 72 65 0a 2a 2a 20 63 6f 6e 74 69 6e 75  efore.** continu
138c0 69 6e 67 2e 20 20 54 72 61 6e 73 61 63 74 69 6f  ing.  Transactio
138d0 6e 73 20 73 74 69 6c 6c 20 77 6f 72 6b 20 69 66  ns still work if
138e0 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 69 73 20   synchronous is 
138f0 6f 66 66 2c 0a 2a 2a 20 61 6e 64 20 74 68 65 20  off,.** and the 
13900 64 61 74 61 62 61 73 65 20 63 61 6e 6e 6f 74 20  database cannot 
13910 62 65 20 63 6f 72 72 75 70 74 65 64 20 69 66 20  be corrupted if 
13920 74 68 69 73 20 70 72 6f 67 72 61 6d 0a 2a 2a 20  this program.** 
13930 63 72 61 73 68 65 73 2e 20 20 42 75 74 20 69 66  crashes.  But if
13940 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73   the operating s
13950 79 73 74 65 6d 20 63 72 61 73 68 65 73 20 6f 72  ystem crashes or
13960 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 61 6e 20   there is.** an 
13970 61 62 72 75 70 74 20 70 6f 77 65 72 20 66 61 69  abrupt power fai
13980 6c 75 72 65 20 77 68 65 6e 20 73 79 6e 63 68 72  lure when synchr
13990 6f 6e 6f 75 73 20 69 73 20 6f 66 66 2c 20 74 68  onous is off, th
139a0 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f  e database.** co
139b0 75 6c 64 20 62 65 20 6c 65 66 74 20 69 6e 20 61  uld be left in a
139c0 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20 61  n inconsistent a
139d0 6e 64 20 75 6e 72 65 63 6f 76 65 72 61 62 6c 65  nd unrecoverable
139e0 20 73 74 61 74 65 2e 0a 2a 2a 20 53 79 6e 63 68   state..** Synch
139f0 72 6f 6e 6f 75 73 20 69 73 20 6f 6e 20 62 79 20  ronous is on by 
13a00 64 65 66 61 75 6c 74 20 73 6f 20 64 61 74 61 62  default so datab
13a10 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 69  ase corruption i
13a20 73 20 6e 6f 74 0a 2a 2a 20 6e 6f 72 6d 61 6c 6c  s not.** normall
13a30 79 20 61 20 77 6f 72 72 79 2e 0a 2a 2f 0a 69 6e  y a worry..*/.in
13a40 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65  t sqlite3BtreeSe
13a50 74 43 61 63 68 65 53 69 7a 65 28 42 74 72 65 65  tCacheSize(Btree
13a60 20 2a 70 2c 20 69 6e 74 20 6d 78 50 61 67 65 29   *p, int mxPage)
13a70 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
13a80 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73  t = p->pBt;.  as
13a90 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
13aa0 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e  tex_held(p->db->
13ab0 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69  mutex) );.  sqli
13ac0 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
13ad0 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  ;.  sqlite3Pager
13ae0 53 65 74 43 61 63 68 65 73 69 7a 65 28 70 42 74  SetCachesize(pBt
13af0 2d 3e 70 50 61 67 65 72 2c 20 6d 78 50 61 67 65  ->pPager, mxPage
13b00 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
13b10 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
13b20 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
13b30 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  ..#if SQLITE_MAX
13b40 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 2f 2a 0a  _MMAP_SIZE>0./*.
13b50 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6c 69  ** Change the li
13b60 6d 69 74 20 6f 6e 20 74 68 65 20 61 6d 6f 75 6e  mit on the amoun
13b70 74 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  t of the databas
13b80 65 20 66 69 6c 65 20 74 68 61 74 20 6d 61 79 20  e file that may 
13b90 62 65 0a 2a 2a 20 6d 65 6d 6f 72 79 20 6d 61 70  be.** memory map
13ba0 70 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ped..*/.int sqli
13bb0 74 65 33 42 74 72 65 65 53 65 74 4d 6d 61 70 4c  te3BtreeSetMmapL
13bc0 69 6d 69 74 28 42 74 72 65 65 20 2a 70 2c 20 73  imit(Btree *p, s
13bd0 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a 4d  qlite3_int64 szM
13be0 6d 61 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64  map){.  BtShared
13bf0 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
13c00 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
13c10 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e  3_mutex_held(p->
13c20 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
13c30 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
13c40 72 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50  r(p);.  sqlite3P
13c50 61 67 65 72 53 65 74 4d 6d 61 70 4c 69 6d 69 74  agerSetMmapLimit
13c60 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 73 7a  (pBt->pPager, sz
13c70 4d 6d 61 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  Mmap);.  sqlite3
13c80 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
13c90 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
13ca0 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  K;.}.#endif /* S
13cb0 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
13cc0 49 5a 45 3e 30 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  IZE>0 */../*.** 
13cd0 43 68 61 6e 67 65 20 74 68 65 20 77 61 79 20 64  Change the way d
13ce0 61 74 61 20 69 73 20 73 79 6e 63 65 64 20 74 6f  ata is synced to
13cf0 20 64 69 73 6b 20 69 6e 20 6f 72 64 65 72 20 74   disk in order t
13d00 6f 20 69 6e 63 72 65 61 73 65 20 6f 72 20 64 65  o increase or de
13d10 63 72 65 61 73 65 0a 2a 2a 20 68 6f 77 20 77 65  crease.** how we
13d20 6c 6c 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ll the database 
13d30 72 65 73 69 73 74 73 20 64 61 6d 61 67 65 20 64  resists damage d
13d40 75 65 20 74 6f 20 4f 53 20 63 72 61 73 68 65 73  ue to OS crashes
13d50 20 61 6e 64 20 70 6f 77 65 72 0a 2a 2a 20 66 61   and power.** fa
13d60 69 6c 75 72 65 73 2e 20 20 4c 65 76 65 6c 20 31  ilures.  Level 1
13d70 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20   is the same as 
13d80 61 73 79 6e 63 68 72 6f 6e 6f 75 73 20 28 6e 6f  asynchronous (no
13d90 20 73 79 6e 63 73 28 29 20 6f 63 63 75 72 20 61   syncs() occur a
13da0 6e 64 0a 2a 2a 20 74 68 65 72 65 20 69 73 20 61  nd.** there is a
13db0 20 68 69 67 68 20 70 72 6f 62 61 62 69 6c 69 74   high probabilit
13dc0 79 20 6f 66 20 64 61 6d 61 67 65 29 20 20 4c 65  y of damage)  Le
13dd0 76 65 6c 20 32 20 69 73 20 74 68 65 20 64 65 66  vel 2 is the def
13de0 61 75 6c 74 2e 20 20 54 68 65 72 65 0a 2a 2a 20  ault.  There.** 
13df0 69 73 20 61 20 76 65 72 79 20 6c 6f 77 20 62 75  is a very low bu
13e00 74 20 6e 6f 6e 2d 7a 65 72 6f 20 70 72 6f 62 61  t non-zero proba
13e10 62 69 6c 69 74 79 20 6f 66 20 64 61 6d 61 67 65  bility of damage
13e20 2e 20 20 4c 65 76 65 6c 20 33 20 72 65 64 75 63  .  Level 3 reduc
13e30 65 73 20 74 68 65 0a 2a 2a 20 70 72 6f 62 61 62  es the.** probab
13e40 69 6c 69 74 79 20 6f 66 20 64 61 6d 61 67 65 20  ility of damage 
13e50 74 6f 20 6e 65 61 72 20 7a 65 72 6f 20 62 75 74  to near zero but
13e60 20 77 69 74 68 20 61 20 77 72 69 74 65 20 70 65   with a write pe
13e70 72 66 6f 72 6d 61 6e 63 65 20 72 65 64 75 63 74  rformance reduct
13e80 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  ion..*/.#ifndef 
13e90 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45  SQLITE_OMIT_PAGE
13ea0 52 5f 50 52 41 47 4d 41 53 0a 69 6e 74 20 73 71  R_PRAGMAS.int sq
13eb0 6c 69 74 65 33 42 74 72 65 65 53 65 74 50 61 67  lite3BtreeSetPag
13ec0 65 72 46 6c 61 67 73 28 0a 20 20 42 74 72 65 65  erFlags(.  Btree
13ed0 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
13ee0 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20 74    /* The btree t
13ef0 6f 20 73 65 74 20 74 68 65 20 73 61 66 65 74 79  o set the safety
13f00 20 6c 65 76 65 6c 20 6f 6e 20 2a 2f 0a 20 20 75   level on */.  u
13f10 6e 73 69 67 6e 65 64 20 70 67 46 6c 61 67 73 20  nsigned pgFlags 
13f20 20 20 20 20 20 20 2f 2a 20 56 61 72 69 6f 75 73        /* Various
13f30 20 50 41 47 45 52 5f 2a 20 66 6c 61 67 73 20 2a   PAGER_* flags *
13f40 2f 0a 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  /.){.  BtShared 
13f50 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
13f60 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
13f70 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64  _mutex_held(p->d
13f80 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73  b->mutex) );.  s
13f90 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
13fa0 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61  (p);.  sqlite3Pa
13fb0 67 65 72 53 65 74 46 6c 61 67 73 28 70 42 74 2d  gerSetFlags(pBt-
13fc0 3e 70 50 61 67 65 72 2c 20 70 67 46 6c 61 67 73  >pPager, pgFlags
13fd0 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
13fe0 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
13ff0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
14000 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52  .#endif../*.** R
14010 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68  eturn TRUE if th
14020 65 20 67 69 76 65 6e 20 62 74 72 65 65 20 69 73  e given btree is
14030 20 73 65 74 20 74 6f 20 73 61 66 65 74 79 20 6c   set to safety l
14040 65 76 65 6c 20 31 2e 20 20 49 6e 20 6f 74 68 65  evel 1.  In othe
14050 72 0a 2a 2a 20 77 6f 72 64 73 2c 20 72 65 74 75  r.** words, retu
14060 72 6e 20 54 52 55 45 20 69 66 20 6e 6f 20 73 79  rn TRUE if no sy
14070 6e 63 28 29 20 6f 63 63 75 72 73 20 6f 6e 20 74  nc() occurs on t
14080 68 65 20 64 69 73 6b 20 66 69 6c 65 73 2e 0a 2a  he disk files..*
14090 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
140a0 65 65 53 79 6e 63 44 69 73 61 62 6c 65 64 28 42  eeSyncDisabled(B
140b0 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68  tree *p){.  BtSh
140c0 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
140d0 42 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  Bt;.  int rc;.  
140e0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
140f0 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62  mutex_held(p->db
14100 2d 3e 6d 75 74 65 78 29 20 29 3b 20 20 0a 20 20  ->mutex) );  .  
14110 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
14120 72 28 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r(p);.  assert( 
14130 70 42 74 20 26 26 20 70 42 74 2d 3e 70 50 61 67  pBt && pBt->pPag
14140 65 72 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  er );.  rc = sql
14150 69 74 65 33 50 61 67 65 72 4e 6f 73 79 6e 63 28  ite3PagerNosync(
14160 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20  pBt->pPager);.  
14170 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
14180 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
14190 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  c;.}../*.** Chan
141a0 67 65 20 74 68 65 20 64 65 66 61 75 6c 74 20 70  ge the default p
141b0 61 67 65 73 20 73 69 7a 65 20 61 6e 64 20 74 68  ages size and th
141c0 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 65  e number of rese
141d0 72 76 65 64 20 62 79 74 65 73 20 70 65 72 20 70  rved bytes per p
141e0 61 67 65 2e 0a 2a 2a 20 4f 72 2c 20 69 66 20 74  age..** Or, if t
141f0 68 65 20 70 61 67 65 20 73 69 7a 65 20 68 61 73  he page size has
14200 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 66 69   already been fi
14210 78 65 64 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  xed, return SQLI
14220 54 45 5f 52 45 41 44 4f 4e 4c 59 20 0a 2a 2a 20  TE_READONLY .** 
14230 77 69 74 68 6f 75 74 20 63 68 61 6e 67 69 6e 67  without changing
14240 20 61 6e 79 74 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a   anything..**.**
14250 20 54 68 65 20 70 61 67 65 20 73 69 7a 65 20 6d   The page size m
14260 75 73 74 20 62 65 20 61 20 70 6f 77 65 72 20 6f  ust be a power o
14270 66 20 32 20 62 65 74 77 65 65 6e 20 35 31 32 20  f 2 between 512 
14280 61 6e 64 20 36 35 35 33 36 2e 20 20 49 66 20 74  and 65536.  If t
14290 68 65 20 70 61 67 65 0a 2a 2a 20 73 69 7a 65 20  he page.** size 
142a0 73 75 70 70 6c 69 65 64 20 64 6f 65 73 20 6e 6f  supplied does no
142b0 74 20 6d 65 65 74 20 74 68 69 73 20 63 6f 6e 73  t meet this cons
142c0 74 72 61 69 6e 74 20 74 68 65 6e 20 74 68 65 20  traint then the 
142d0 70 61 67 65 20 73 69 7a 65 20 69 73 20 6e 6f 74  page size is not
142e0 0a 2a 2a 20 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a  .** changed..**.
142f0 2a 2a 20 50 61 67 65 20 73 69 7a 65 73 20 61 72  ** Page sizes ar
14300 65 20 63 6f 6e 73 74 72 61 69 6e 65 64 20 74 6f  e constrained to
14310 20 62 65 20 61 20 70 6f 77 65 72 20 6f 66 20 74   be a power of t
14320 77 6f 20 73 6f 20 74 68 61 74 20 74 68 65 20 72  wo so that the r
14330 65 67 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65 20  egion.** of the 
14340 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 75 73  database file us
14350 65 64 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 20 28  ed for locking (
14360 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 50 45 4e  beginning at PEN
14370 44 49 4e 47 5f 42 59 54 45 2c 0a 2a 2a 20 74 68  DING_BYTE,.** th
14380 65 20 66 69 72 73 74 20 62 79 74 65 20 70 61 73  e first byte pas
14390 74 20 74 68 65 20 31 47 42 20 62 6f 75 6e 64 61  t the 1GB bounda
143a0 72 79 2c 20 30 78 34 30 30 30 30 30 30 30 29 20  ry, 0x40000000) 
143b0 6e 65 65 64 73 20 74 6f 20 6f 63 63 75 72 0a 2a  needs to occur.*
143c0 2a 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69  * at the beginni
143d0 6e 67 20 6f 66 20 61 20 70 61 67 65 2e 0a 2a 2a  ng of a page..**
143e0 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72  .** If parameter
143f0 20 6e 52 65 73 65 72 76 65 20 69 73 20 6c 65 73   nReserve is les
14400 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65  s than zero, the
14410 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
14420 72 65 73 65 72 76 65 64 0a 2a 2a 20 62 79 74 65  reserved.** byte
14430 73 20 70 65 72 20 70 61 67 65 20 69 73 20 6c 65  s per page is le
14440 66 74 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a  ft unchanged..**
14450 0a 2a 2a 20 49 66 20 74 68 65 20 69 46 69 78 21  .** If the iFix!
14460 3d 30 20 74 68 65 6e 20 74 68 65 20 42 54 53 5f  =0 then the BTS_
14470 50 41 47 45 53 49 5a 45 5f 46 49 58 45 44 20 66  PAGESIZE_FIXED f
14480 6c 61 67 20 69 73 20 73 65 74 20 73 6f 20 74 68  lag is set so th
14490 61 74 20 74 68 65 20 70 61 67 65 20 73 69 7a 65  at the page size
144a0 0a 2a 2a 20 61 6e 64 20 61 75 74 6f 76 61 63 75  .** and autovacu
144b0 75 6d 20 6d 6f 64 65 20 63 61 6e 20 6e 6f 20 6c  um mode can no l
144c0 6f 6e 67 65 72 20 62 65 20 63 68 61 6e 67 65 64  onger be changed
144d0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
144e0 42 74 72 65 65 53 65 74 50 61 67 65 53 69 7a 65  BtreeSetPageSize
144f0 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 70  (Btree *p, int p
14500 61 67 65 53 69 7a 65 2c 20 69 6e 74 20 6e 52 65  ageSize, int nRe
14510 73 65 72 76 65 2c 20 69 6e 74 20 69 46 69 78 29  serve, int iFix)
14520 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
14530 49 54 45 5f 4f 4b 3b 0a 20 20 42 74 53 68 61 72  ITE_OK;.  BtShar
14540 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
14550 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65 73  ;.  assert( nRes
14560 65 72 76 65 3e 3d 2d 31 20 26 26 20 6e 52 65 73  erve>=-1 && nRes
14570 65 72 76 65 3c 3d 32 35 35 20 29 3b 0a 20 20 73  erve<=255 );.  s
14580 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
14590 28 70 29 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f  (p);.#if SQLITE_
145a0 48 41 53 5f 43 4f 44 45 43 0a 20 20 69 66 28 20  HAS_CODEC.  if( 
145b0 6e 52 65 73 65 72 76 65 3e 70 42 74 2d 3e 6f 70  nReserve>pBt->op
145c0 74 69 6d 61 6c 52 65 73 65 72 76 65 20 29 20 70  timalReserve ) p
145d0 42 74 2d 3e 6f 70 74 69 6d 61 6c 52 65 73 65 72  Bt->optimalReser
145e0 76 65 20 3d 20 28 75 38 29 6e 52 65 73 65 72 76  ve = (u8)nReserv
145f0 65 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20  e;.#endif.  if( 
14600 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20  pBt->btsFlags & 
14610 42 54 53 5f 50 41 47 45 53 49 5a 45 5f 46 49 58  BTS_PAGESIZE_FIX
14620 45 44 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ED ){.    sqlite
14630 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
14640 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
14650 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d 0a  E_READONLY;.  }.
14660 20 20 69 66 28 20 6e 52 65 73 65 72 76 65 3c 30    if( nReserve<0
14670 20 29 7b 0a 20 20 20 20 6e 52 65 73 65 72 76 65   ){.    nReserve
14680 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65   = pBt->pageSize
14690 20 2d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69   - pBt->usableSi
146a0 7a 65 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  ze;.  }.  assert
146b0 28 20 6e 52 65 73 65 72 76 65 3e 3d 30 20 26 26  ( nReserve>=0 &&
146c0 20 6e 52 65 73 65 72 76 65 3c 3d 32 35 35 20 29   nReserve<=255 )
146d0 3b 0a 20 20 69 66 28 20 70 61 67 65 53 69 7a 65  ;.  if( pageSize
146e0 3e 3d 35 31 32 20 26 26 20 70 61 67 65 53 69 7a  >=512 && pageSiz
146f0 65 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41  e<=SQLITE_MAX_PA
14700 47 45 5f 53 49 5a 45 20 26 26 0a 20 20 20 20 20  GE_SIZE &&.     
14710 20 20 20 28 28 70 61 67 65 53 69 7a 65 2d 31 29     ((pageSize-1)
14720 26 70 61 67 65 53 69 7a 65 29 3d 3d 30 20 29 7b  &pageSize)==0 ){
14730 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70 61  .    assert( (pa
14740 67 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29  geSize & 7)==0 )
14750 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70  ;.    assert( !p
14760 42 74 2d 3e 70 43 75 72 73 6f 72 20 29 3b 0a 20  Bt->pCursor );. 
14770 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65     pBt->pageSize
14780 20 3d 20 28 75 33 32 29 70 61 67 65 53 69 7a 65   = (u32)pageSize
14790 3b 0a 20 20 20 20 66 72 65 65 54 65 6d 70 53 70  ;.    freeTempSp
147a0 61 63 65 28 70 42 74 29 3b 0a 20 20 7d 0a 20 20  ace(pBt);.  }.  
147b0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
147c0 72 53 65 74 50 61 67 65 73 69 7a 65 28 70 42 74  rSetPagesize(pBt
147d0 2d 3e 70 50 61 67 65 72 2c 20 26 70 42 74 2d 3e  ->pPager, &pBt->
147e0 70 61 67 65 53 69 7a 65 2c 20 6e 52 65 73 65 72  pageSize, nReser
147f0 76 65 29 3b 0a 20 20 70 42 74 2d 3e 75 73 61 62  ve);.  pBt->usab
14800 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 70 61  leSize = pBt->pa
14810 67 65 53 69 7a 65 20 2d 20 28 75 31 36 29 6e 52  geSize - (u16)nR
14820 65 73 65 72 76 65 3b 0a 20 20 69 66 28 20 69 46  eserve;.  if( iF
14830 69 78 20 29 20 70 42 74 2d 3e 62 74 73 46 6c 61  ix ) pBt->btsFla
14840 67 73 20 7c 3d 20 42 54 53 5f 50 41 47 45 53 49  gs |= BTS_PAGESI
14850 5a 45 5f 46 49 58 45 44 3b 0a 20 20 73 71 6c 69  ZE_FIXED;.  sqli
14860 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
14870 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
14880 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
14890 68 65 20 63 75 72 72 65 6e 74 6c 79 20 64 65 66  he currently def
148a0 69 6e 65 64 20 70 61 67 65 20 73 69 7a 65 0a 2a  ined page size.*
148b0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
148c0 65 65 47 65 74 50 61 67 65 53 69 7a 65 28 42 74  eeGetPageSize(Bt
148d0 72 65 65 20 2a 70 29 7b 0a 20 20 72 65 74 75 72  ree *p){.  retur
148e0 6e 20 70 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69  n p->pBt->pageSi
148f0 7a 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  ze;.}../*.** Thi
14900 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 73 69  s function is si
14910 6d 69 6c 61 72 20 74 6f 20 73 71 6c 69 74 65 33  milar to sqlite3
14920 42 74 72 65 65 47 65 74 52 65 73 65 72 76 65 28  BtreeGetReserve(
14930 29 2c 20 65 78 63 65 70 74 20 74 68 61 74 20 69  ), except that i
14940 74 0a 2a 2a 20 6d 61 79 20 6f 6e 6c 79 20 62 65  t.** may only be
14950 20 63 61 6c 6c 65 64 20 69 66 20 69 74 20 69 73   called if it is
14960 20 67 75 61 72 61 6e 74 65 65 64 20 74 68 61 74   guaranteed that
14970 20 74 68 65 20 62 2d 74 72 65 65 20 6d 75 74 65   the b-tree mute
14980 78 20 69 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20  x is already.** 
14990 68 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  held..**.** This
149a0 20 69 73 20 75 73 65 66 75 6c 20 69 6e 20 6f 6e   is useful in on
149b0 65 20 73 70 65 63 69 61 6c 20 63 61 73 65 20 69  e special case i
149c0 6e 20 74 68 65 20 62 61 63 6b 75 70 20 41 50 49  n the backup API
149d0 20 63 6f 64 65 20 77 68 65 72 65 20 69 74 20 69   code where it i
149e0 73 0a 2a 2a 20 6b 6e 6f 77 6e 20 74 68 61 74 20  s.** known that 
149f0 74 68 65 20 73 68 61 72 65 64 20 62 2d 74 72 65  the shared b-tre
14a00 65 20 6d 75 74 65 78 20 69 73 20 68 65 6c 64 2c  e mutex is held,
14a10 20 62 75 74 20 74 68 65 20 6d 75 74 65 78 20 6f   but the mutex o
14a20 6e 20 74 68 65 20 0a 2a 2a 20 64 61 74 61 62 61  n the .** databa
14a30 73 65 20 68 61 6e 64 6c 65 20 74 68 61 74 20 6f  se handle that o
14a40 77 6e 73 20 2a 70 20 69 73 20 6e 6f 74 2e 20 49  wns *p is not. I
14a50 6e 20 74 68 69 73 20 63 61 73 65 20 69 66 20 73  n this case if s
14a60 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
14a70 28 29 0a 2a 2a 20 77 65 72 65 20 74 6f 20 62 65  ().** were to be
14a80 20 63 61 6c 6c 65 64 2c 20 69 74 20 6d 69 67 68   called, it migh
14a90 74 20 63 6f 6c 6c 69 64 65 20 77 69 74 68 20 73  t collide with s
14aa0 6f 6d 65 20 6f 74 68 65 72 20 6f 70 65 72 61 74  ome other operat
14ab0 69 6f 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 64 61  ion on the.** da
14ac0 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 74 68  tabase handle th
14ad0 61 74 20 6f 77 6e 73 20 2a 70 2c 20 63 61 75 73  at owns *p, caus
14ae0 69 6e 67 20 75 6e 64 65 66 69 6e 65 64 20 62 65  ing undefined be
14af0 68 61 76 69 6f 72 2e 0a 2a 2f 0a 69 6e 74 20 73  havior..*/.int s
14b00 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 52 65  qlite3BtreeGetRe
14b10 73 65 72 76 65 4e 6f 4d 75 74 65 78 28 42 74 72  serveNoMutex(Btr
14b20 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 3b  ee *p){.  int n;
14b30 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
14b40 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d  e3_mutex_held(p-
14b50 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
14b60 20 20 6e 20 3d 20 70 2d 3e 70 42 74 2d 3e 70 61    n = p->pBt->pa
14b70 67 65 53 69 7a 65 20 2d 20 70 2d 3e 70 42 74 2d  geSize - p->pBt-
14b80 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 72  >usableSize;.  r
14b90 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn n;.}../*.*
14ba0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
14bb0 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20  ber of bytes of 
14bc0 73 70 61 63 65 20 61 74 20 74 68 65 20 65 6e 64  space at the end
14bd0 20 6f 66 20 65 76 65 72 79 20 70 61 67 65 20 74   of every page t
14be0 68 61 74 0a 2a 2a 20 61 72 65 20 69 6e 74 65 6e  hat.** are inten
14bf0 74 75 61 6c 6c 79 20 6c 65 66 74 20 75 6e 75 73  tually left unus
14c00 65 64 2e 20 20 54 68 69 73 20 69 73 20 74 68 65  ed.  This is the
14c10 20 22 72 65 73 65 72 76 65 64 22 20 73 70 61 63   "reserved" spac
14c20 65 20 74 68 61 74 20 69 73 0a 2a 2a 20 73 6f 6d  e that is.** som
14c30 65 74 69 6d 65 73 20 75 73 65 64 20 62 79 20 65  etimes used by e
14c40 78 74 65 6e 73 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a  xtensions..**.**
14c50 20 49 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 4d   If SQLITE_HAS_M
14c60 55 54 45 58 20 69 73 20 64 65 66 69 6e 65 64 20  UTEX is defined 
14c70 74 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  then the number 
14c80 72 65 74 75 72 6e 65 64 20 69 73 20 74 68 65 0a  returned is the.
14c90 2a 2a 20 67 72 65 61 74 65 72 20 6f 66 20 74 68  ** greater of th
14ca0 65 20 63 75 72 72 65 6e 74 20 72 65 73 65 72 76  e current reserv
14cb0 65 64 20 73 70 61 63 65 20 61 6e 64 20 74 68 65  ed space and the
14cc0 20 6d 61 78 69 6d 75 6d 20 72 65 71 75 65 73 74   maximum request
14cd0 65 64 0a 2a 2a 20 72 65 73 65 72 76 65 20 73 70  ed.** reserve sp
14ce0 61 63 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ace..*/.int sqli
14cf0 74 65 33 42 74 72 65 65 47 65 74 4f 70 74 69 6d  te3BtreeGetOptim
14d00 61 6c 52 65 73 65 72 76 65 28 42 74 72 65 65 20  alReserve(Btree 
14d10 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20  *p){.  int n;.  
14d20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
14d30 72 28 70 29 3b 0a 20 20 6e 20 3d 20 73 71 6c 69  r(p);.  n = sqli
14d40 74 65 33 42 74 72 65 65 47 65 74 52 65 73 65 72  te3BtreeGetReser
14d50 76 65 4e 6f 4d 75 74 65 78 28 70 29 3b 0a 23 69  veNoMutex(p);.#i
14d60 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f  fdef SQLITE_HAS_
14d70 43 4f 44 45 43 0a 20 20 69 66 28 20 6e 3c 70 2d  CODEC.  if( n<p-
14d80 3e 70 42 74 2d 3e 6f 70 74 69 6d 61 6c 52 65 73  >pBt->optimalRes
14d90 65 72 76 65 20 29 20 6e 20 3d 20 70 2d 3e 70 42  erve ) n = p->pB
14da0 74 2d 3e 6f 70 74 69 6d 61 6c 52 65 73 65 72 76  t->optimalReserv
14db0 65 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69  e;.#endif.  sqli
14dc0 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
14dd0 3b 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a  ;.  return n;.}.
14de0 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
14df0 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75  maximum page cou
14e00 6e 74 20 66 6f 72 20 61 20 64 61 74 61 62 61 73  nt for a databas
14e10 65 20 69 66 20 6d 78 50 61 67 65 20 69 73 20 70  e if mxPage is p
14e20 6f 73 69 74 69 76 65 2e 0a 2a 2a 20 4e 6f 20 63  ositive..** No c
14e30 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20  hanges are made 
14e40 69 66 20 6d 78 50 61 67 65 20 69 73 20 30 20 6f  if mxPage is 0 o
14e50 72 20 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 20 52  r negative..** R
14e60 65 67 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65  egardless of the
14e70 20 76 61 6c 75 65 20 6f 66 20 6d 78 50 61 67 65   value of mxPage
14e80 2c 20 72 65 74 75 72 6e 20 74 68 65 20 6d 61 78  , return the max
14e90 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 2e  imum page count.
14ea0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
14eb0 74 72 65 65 4d 61 78 50 61 67 65 43 6f 75 6e 74  treeMaxPageCount
14ec0 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6d  (Btree *p, int m
14ed0 78 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 6e 3b  xPage){.  int n;
14ee0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
14ef0 6e 74 65 72 28 70 29 3b 0a 20 20 6e 20 3d 20 73  nter(p);.  n = s
14f00 71 6c 69 74 65 33 50 61 67 65 72 4d 61 78 50 61  qlite3PagerMaxPa
14f10 67 65 43 6f 75 6e 74 28 70 2d 3e 70 42 74 2d 3e  geCount(p->pBt->
14f20 70 50 61 67 65 72 2c 20 6d 78 50 61 67 65 29 3b  pPager, mxPage);
14f30 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
14f40 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
14f50 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  n n;.}../*.** Se
14f60 74 20 74 68 65 20 42 54 53 5f 53 45 43 55 52 45  t the BTS_SECURE
14f70 5f 44 45 4c 45 54 45 20 66 6c 61 67 20 69 66 20  _DELETE flag if 
14f80 6e 65 77 46 6c 61 67 20 69 73 20 30 20 6f 72 20  newFlag is 0 or 
14f90 31 2e 20 20 49 66 20 6e 65 77 46 6c 61 67 20 69  1.  If newFlag i
14fa0 73 20 2d 31 2c 0a 2a 2a 20 74 68 65 6e 20 6d 61  s -1,.** then ma
14fb0 6b 65 20 6e 6f 20 63 68 61 6e 67 65 73 2e 20 20  ke no changes.  
14fc0 41 6c 77 61 79 73 20 72 65 74 75 72 6e 20 74 68  Always return th
14fd0 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 42  e value of the B
14fe0 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45  TS_SECURE_DELETE
14ff0 0a 2a 2a 20 73 65 74 74 69 6e 67 20 61 66 74 65  .** setting afte
15000 72 20 74 68 65 20 63 68 61 6e 67 65 2e 0a 2a 2f  r the change..*/
15010 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
15020 65 53 65 63 75 72 65 44 65 6c 65 74 65 28 42 74  eSecureDelete(Bt
15030 72 65 65 20 2a 70 2c 20 69 6e 74 20 6e 65 77 46  ree *p, int newF
15040 6c 61 67 29 7b 0a 20 20 69 6e 74 20 62 3b 0a 20  lag){.  int b;. 
15050 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
15060 72 6e 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 42  rn 0;.  sqlite3B
15070 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
15080 69 66 28 20 6e 65 77 46 6c 61 67 3e 3d 30 20 29  if( newFlag>=0 )
15090 7b 0a 20 20 20 20 70 2d 3e 70 42 74 2d 3e 62 74  {.    p->pBt->bt
150a0 73 46 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f 53  sFlags &= ~BTS_S
150b0 45 43 55 52 45 5f 44 45 4c 45 54 45 3b 0a 20 20  ECURE_DELETE;.  
150c0 20 20 69 66 28 20 6e 65 77 46 6c 61 67 20 29 20    if( newFlag ) 
150d0 70 2d 3e 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  p->pBt->btsFlags
150e0 20 7c 3d 20 42 54 53 5f 53 45 43 55 52 45 5f 44   |= BTS_SECURE_D
150f0 45 4c 45 54 45 3b 0a 20 20 7d 20 0a 20 20 62 20  ELETE;.  } .  b 
15100 3d 20 28 70 2d 3e 70 42 74 2d 3e 62 74 73 46 6c  = (p->pBt->btsFl
15110 61 67 73 20 26 20 42 54 53 5f 53 45 43 55 52 45  ags & BTS_SECURE
15120 5f 44 45 4c 45 54 45 29 21 3d 30 3b 0a 20 20 73  _DELETE)!=0;.  s
15130 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
15140 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 62 3b  (p);.  return b;
15150 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
15160 20 74 68 65 20 27 61 75 74 6f 2d 76 61 63 75 75   the 'auto-vacuu
15170 6d 27 20 70 72 6f 70 65 72 74 79 20 6f 66 20 74  m' property of t
15180 68 65 20 64 61 74 61 62 61 73 65 2e 20 49 66 20  he database. If 
15190 74 68 65 20 27 61 75 74 6f 56 61 63 75 75 6d 27  the 'autoVacuum'
151a0 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73  .** parameter is
151b0 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20   non-zero, then 
151c0 61 75 74 6f 2d 76 61 63 75 75 6d 20 6d 6f 64 65  auto-vacuum mode
151d0 20 69 73 20 65 6e 61 62 6c 65 64 2e 20 49 66 20   is enabled. If 
151e0 7a 65 72 6f 2c 20 69 74 0a 2a 2a 20 69 73 20 64  zero, it.** is d
151f0 69 73 61 62 6c 65 64 2e 20 54 68 65 20 64 65 66  isabled. The def
15200 61 75 6c 74 20 76 61 6c 75 65 20 66 6f 72 20 74  ault value for t
15210 68 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 70  he auto-vacuum p
15220 72 6f 70 65 72 74 79 20 69 73 20 0a 2a 2a 20 64  roperty is .** d
15230 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65  etermined by the
15240 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
15250 41 55 54 4f 56 41 43 55 55 4d 20 6d 61 63 72 6f  AUTOVACUUM macro
15260 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
15270 42 74 72 65 65 53 65 74 41 75 74 6f 56 61 63 75  BtreeSetAutoVacu
15280 75 6d 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  um(Btree *p, int
15290 20 61 75 74 6f 56 61 63 75 75 6d 29 7b 0a 23 69   autoVacuum){.#i
152a0 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  fdef SQLITE_OMIT
152b0 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 72 65  _AUTOVACUUM.  re
152c0 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44  turn SQLITE_READ
152d0 4f 4e 4c 59 3b 0a 23 65 6c 73 65 0a 20 20 42 74  ONLY;.#else.  Bt
152e0 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
152f0 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d  >pBt;.  int rc =
15300 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 38   SQLITE_OK;.  u8
15310 20 61 76 20 3d 20 28 75 38 29 61 75 74 6f 56 61   av = (u8)autoVa
15320 63 75 75 6d 3b 0a 0a 20 20 73 71 6c 69 74 65 33  cuum;..  sqlite3
15330 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
15340 20 69 66 28 20 28 70 42 74 2d 3e 62 74 73 46 6c   if( (pBt->btsFl
15350 61 67 73 20 26 20 42 54 53 5f 50 41 47 45 53 49  ags & BTS_PAGESI
15360 5a 45 5f 46 49 58 45 44 29 21 3d 30 20 26 26 20  ZE_FIXED)!=0 && 
15370 28 61 76 20 3f 31 3a 30 29 21 3d 70 42 74 2d 3e  (av ?1:0)!=pBt->
15380 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20  autoVacuum ){.  
15390 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45    rc = SQLITE_RE
153a0 41 44 4f 4e 4c 59 3b 0a 20 20 7d 65 6c 73 65 7b  ADONLY;.  }else{
153b0 0a 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61  .    pBt->autoVa
153c0 63 75 75 6d 20 3d 20 61 76 20 3f 31 3a 30 3b 0a  cuum = av ?1:0;.
153d0 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63      pBt->incrVac
153e0 75 75 6d 20 3d 20 61 76 3d 3d 32 20 3f 31 3a 30  uum = av==2 ?1:0
153f0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42  ;.  }.  sqlite3B
15400 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
15410 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69  return rc;.#endi
15420 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  f.}../*.** Retur
15430 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  n the value of t
15440 68 65 20 27 61 75 74 6f 2d 76 61 63 75 75 6d 27  he 'auto-vacuum'
15450 20 70 72 6f 70 65 72 74 79 2e 20 49 66 20 61 75   property. If au
15460 74 6f 2d 76 61 63 75 75 6d 20 69 73 20 0a 2a 2a  to-vacuum is .**
15470 20 65 6e 61 62 6c 65 64 20 31 20 69 73 20 72 65   enabled 1 is re
15480 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73  turned. Otherwis
15490 65 20 30 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  e 0..*/.int sqli
154a0 74 65 33 42 74 72 65 65 47 65 74 41 75 74 6f 56  te3BtreeGetAutoV
154b0 61 63 75 75 6d 28 42 74 72 65 65 20 2a 70 29 7b  acuum(Btree *p){
154c0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
154d0 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
154e0 20 72 65 74 75 72 6e 20 42 54 52 45 45 5f 41 55   return BTREE_AU
154f0 54 4f 56 41 43 55 55 4d 5f 4e 4f 4e 45 3b 0a 23  TOVACUUM_NONE;.#
15500 65 6c 73 65 0a 20 20 69 6e 74 20 72 63 3b 0a 20  else.  int rc;. 
15510 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
15520 65 72 28 70 29 3b 0a 20 20 72 63 20 3d 20 28 0a  er(p);.  rc = (.
15530 20 20 20 20 28 21 70 2d 3e 70 42 74 2d 3e 61 75      (!p->pBt->au
15540 74 6f 56 61 63 75 75 6d 29 3f 42 54 52 45 45 5f  toVacuum)?BTREE_
15550 41 55 54 4f 56 41 43 55 55 4d 5f 4e 4f 4e 45 3a  AUTOVACUUM_NONE:
15560 0a 20 20 20 20 28 21 70 2d 3e 70 42 74 2d 3e 69  .    (!p->pBt->i
15570 6e 63 72 56 61 63 75 75 6d 29 3f 42 54 52 45 45  ncrVacuum)?BTREE
15580 5f 41 55 54 4f 56 41 43 55 55 4d 5f 46 55 4c 4c  _AUTOVACUUM_FULL
15590 3a 0a 20 20 20 20 42 54 52 45 45 5f 41 55 54 4f  :.    BTREE_AUTO
155a0 56 41 43 55 55 4d 5f 49 4e 43 52 0a 20 20 29 3b  VACUUM_INCR.  );
155b0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
155c0 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
155d0 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a  n rc;.#endif.}..
155e0 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 72 65 66  ./*.** Get a ref
155f0 65 72 65 6e 63 65 20 74 6f 20 70 50 61 67 65 31  erence to pPage1
15600 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
15610 20 66 69 6c 65 2e 20 20 54 68 69 73 20 77 69 6c   file.  This wil
15620 6c 0a 2a 2a 20 61 6c 73 6f 20 61 63 71 75 69 72  l.** also acquir
15630 65 20 61 20 72 65 61 64 6c 6f 63 6b 20 6f 6e 20  e a readlock on 
15640 74 68 61 74 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  that file..**.**
15650 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
15660 74 75 72 6e 65 64 20 6f 6e 20 73 75 63 63 65 73  turned on succes
15670 73 2e 20 20 49 66 20 74 68 65 20 66 69 6c 65 20  s.  If the file 
15680 69 73 20 6e 6f 74 20 61 0a 2a 2a 20 77 65 6c 6c  is not a.** well
15690 2d 66 6f 72 6d 65 64 20 64 61 74 61 62 61 73 65  -formed database
156a0 20 66 69 6c 65 2c 20 74 68 65 6e 20 53 51 4c 49   file, then SQLI
156b0 54 45 5f 43 4f 52 52 55 50 54 20 69 73 20 72 65  TE_CORRUPT is re
156c0 74 75 72 6e 65 64 2e 0a 2a 2a 20 53 51 4c 49 54  turned..** SQLIT
156d0 45 5f 42 55 53 59 20 69 73 20 72 65 74 75 72 6e  E_BUSY is return
156e0 65 64 20 69 66 20 74 68 65 20 64 61 74 61 62 61  ed if the databa
156f0 73 65 20 69 73 20 6c 6f 63 6b 65 64 2e 20 20 53  se is locked.  S
15700 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 69  QLITE_NOMEM.** i
15710 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 77 65  s returned if we
15720 20 72 75 6e 20 6f 75 74 20 6f 66 20 6d 65 6d 6f   run out of memo
15730 72 79 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ry. .*/.static i
15740 6e 74 20 6c 6f 63 6b 42 74 72 65 65 28 42 74 53  nt lockBtree(BtS
15750 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69  hared *pBt){.  i
15760 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
15770 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f      /* Result co
15780 64 65 20 66 72 6f 6d 20 73 75 62 66 75 6e 63 74  de from subfunct
15790 69 6f 6e 73 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  ions */.  MemPag
157a0 65 20 2a 70 50 61 67 65 31 3b 20 20 20 20 20 2f  e *pPage1;     /
157b0 2a 20 50 61 67 65 20 31 20 6f 66 20 74 68 65 20  * Page 1 of the 
157c0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
157d0 0a 20 20 69 6e 74 20 6e 50 61 67 65 3b 20 20 20  .  int nPage;   
157e0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
157f0 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  r of pages in th
15800 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  e database */.  
15810 69 6e 74 20 6e 50 61 67 65 46 69 6c 65 20 3d 20  int nPageFile = 
15820 30 3b 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f  0;   /* Number o
15830 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64  f pages in the d
15840 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
15850 20 20 69 6e 74 20 6e 50 61 67 65 48 65 61 64 65    int nPageHeade
15860 72 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72  r;     /* Number
15870 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
15880 20 64 61 74 61 62 61 73 65 20 61 63 63 6f 72 64   database accord
15890 69 6e 67 20 74 6f 20 68 64 72 20 2a 2f 0a 0a 20  ing to hdr */.. 
158a0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
158b0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
158c0 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
158d0 65 72 74 28 20 70 42 74 2d 3e 70 50 61 67 65 31  ert( pBt->pPage1
158e0 3d 3d 30 20 29 3b 0a 20 20 72 63 20 3d 20 73 71  ==0 );.  rc = sq
158f0 6c 69 74 65 33 50 61 67 65 72 53 68 61 72 65 64  lite3PagerShared
15900 4c 6f 63 6b 28 70 42 74 2d 3e 70 50 61 67 65 72  Lock(pBt->pPager
15910 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
15920 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
15930 72 63 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65  rc;.  rc = btree
15940 47 65 74 50 61 67 65 28 70 42 74 2c 20 31 2c 20  GetPage(pBt, 1, 
15950 26 70 50 61 67 65 31 2c 20 30 29 3b 0a 20 20 69  &pPage1, 0);.  i
15960 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
15970 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
15980 20 2f 2a 20 44 6f 20 73 6f 6d 65 20 63 68 65 63   /* Do some chec
15990 6b 69 6e 67 20 74 6f 20 68 65 6c 70 20 69 6e 73  king to help ins
159a0 75 72 65 20 74 68 65 20 66 69 6c 65 20 77 65 20  ure the file we 
159b0 6f 70 65 6e 65 64 20 72 65 61 6c 6c 79 20 69 73  opened really is
159c0 0a 20 20 2a 2a 20 61 20 76 61 6c 69 64 20 64 61  .  ** a valid da
159d0 74 61 62 61 73 65 20 66 69 6c 65 2e 20 0a 20 20  tabase file. .  
159e0 2a 2f 0a 20 20 6e 50 61 67 65 20 3d 20 6e 50 61  */.  nPage = nPa
159f0 67 65 48 65 61 64 65 72 20 3d 20 67 65 74 34 62  geHeader = get4b
15a00 79 74 65 28 32 38 2b 28 75 38 2a 29 70 50 61 67  yte(28+(u8*)pPag
15a10 65 31 2d 3e 61 44 61 74 61 29 3b 0a 20 20 73 71  e1->aData);.  sq
15a20 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f  lite3PagerPageco
15a30 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  unt(pBt->pPager,
15a40 20 26 6e 50 61 67 65 46 69 6c 65 29 3b 0a 20 20   &nPageFile);.  
15a50 69 66 28 20 6e 50 61 67 65 3d 3d 30 20 7c 7c 20  if( nPage==0 || 
15a60 6d 65 6d 63 6d 70 28 32 34 2b 28 75 38 2a 29 70  memcmp(24+(u8*)p
15a70 50 61 67 65 31 2d 3e 61 44 61 74 61 2c 20 39 32  Page1->aData, 92
15a80 2b 28 75 38 2a 29 70 50 61 67 65 31 2d 3e 61 44  +(u8*)pPage1->aD
15a90 61 74 61 2c 34 29 21 3d 30 20 29 7b 0a 20 20 20  ata,4)!=0 ){.   
15aa0 20 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 46 69   nPage = nPageFi
15ab0 6c 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 50  le;.  }.  if( nP
15ac0 61 67 65 3e 30 20 29 7b 0a 20 20 20 20 75 33 32  age>0 ){.    u32
15ad0 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 75   pageSize;.    u
15ae0 33 32 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20  32 usableSize;. 
15af0 20 20 20 75 38 20 2a 70 61 67 65 31 20 3d 20 70     u8 *page1 = p
15b00 50 61 67 65 31 2d 3e 61 44 61 74 61 3b 0a 20 20  Page1->aData;.  
15b10 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
15b20 54 41 44 42 3b 0a 20 20 20 20 2f 2a 20 45 56 49  TADB;.    /* EVI
15b30 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 33 37 33  DENCE-OF: R-4373
15b40 37 2d 33 39 39 39 39 20 45 76 65 72 79 20 76 61  7-39999 Every va
15b50 6c 69 64 20 53 51 4c 69 74 65 20 64 61 74 61 62  lid SQLite datab
15b60 61 73 65 20 66 69 6c 65 20 62 65 67 69 6e 73 0a  ase file begins.
15b70 20 20 20 20 2a 2a 20 77 69 74 68 20 74 68 65 20      ** with the 
15b80 66 6f 6c 6c 6f 77 69 6e 67 20 31 36 20 62 79 74  following 16 byt
15b90 65 73 20 28 69 6e 20 68 65 78 29 3a 20 35 33 20  es (in hex): 53 
15ba0 35 31 20 34 63 20 36 39 20 37 34 20 36 35 20 32  51 4c 69 74 65 2
15bb0 30 20 36 36 20 36 66 20 37 32 20 36 64 0a 20 20  0 66 6f 72 6d.  
15bc0 20 20 2a 2a 20 36 31 20 37 34 20 32 30 20 33 33    ** 61 74 20 33
15bd0 20 30 30 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20   00. */.    if( 
15be0 6d 65 6d 63 6d 70 28 70 61 67 65 31 2c 20 7a 4d  memcmp(page1, zM
15bf0 61 67 69 63 48 65 61 64 65 72 2c 20 31 36 29 21  agicHeader, 16)!
15c00 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  =0 ){.      goto
15c10 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c   page1_init_fail
15c20 65 64 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65  ed;.    }..#ifde
15c30 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  f SQLITE_OMIT_WA
15c40 4c 0a 20 20 20 20 69 66 28 20 70 61 67 65 31 5b  L.    if( page1[
15c50 31 38 5d 3e 31 20 29 7b 0a 20 20 20 20 20 20 70  18]>1 ){.      p
15c60 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20  Bt->btsFlags |= 
15c70 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 3b 0a 20  BTS_READ_ONLY;. 
15c80 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 61 67     }.    if( pag
15c90 65 31 5b 31 39 5d 3e 31 20 29 7b 0a 20 20 20 20  e1[19]>1 ){.    
15ca0 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69    goto page1_ini
15cb0 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a  t_failed;.    }.
15cc0 23 65 6c 73 65 0a 20 20 20 20 69 66 28 20 70 61  #else.    if( pa
15cd0 67 65 31 5b 31 38 5d 3e 32 20 29 7b 0a 20 20 20  ge1[18]>2 ){.   
15ce0 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73     pBt->btsFlags
15cf0 20 7c 3d 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c   |= BTS_READ_ONL
15d00 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  Y;.    }.    if(
15d10 20 70 61 67 65 31 5b 31 39 5d 3e 32 20 29 7b 0a   page1[19]>2 ){.
15d20 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31        goto page1
15d30 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20  _init_failed;.  
15d40 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74    }..    /* If t
15d50 68 65 20 77 72 69 74 65 20 76 65 72 73 69 6f 6e  he write version
15d60 20 69 73 20 73 65 74 20 74 6f 20 32 2c 20 74 68   is set to 2, th
15d70 69 73 20 64 61 74 61 62 61 73 65 20 73 68 6f 75  is database shou
15d80 6c 64 20 62 65 20 61 63 63 65 73 73 65 64 0a 20  ld be accessed. 
15d90 20 20 20 2a 2a 20 69 6e 20 57 41 4c 20 6d 6f 64     ** in WAL mod
15da0 65 2e 20 49 66 20 74 68 65 20 6c 6f 67 20 69 73  e. If the log is
15db0 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f 70 65   not already ope
15dc0 6e 2c 20 6f 70 65 6e 20 69 74 20 6e 6f 77 2e 20  n, open it now. 
15dd0 54 68 65 6e 20 0a 20 20 20 20 2a 2a 20 72 65 74  Then .    ** ret
15de0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 61 6e  urn SQLITE_OK an
15df0 64 20 72 65 74 75 72 6e 20 77 69 74 68 6f 75 74  d return without
15e00 20 70 6f 70 75 6c 61 74 69 6e 67 20 42 74 53 68   populating BtSh
15e10 61 72 65 64 2e 70 50 61 67 65 31 2e 0a 20 20 20  ared.pPage1..   
15e20 20 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 64   ** The caller d
15e30 65 74 65 63 74 73 20 74 68 69 73 20 61 6e 64 20  etects this and 
15e40 63 61 6c 6c 73 20 74 68 69 73 20 66 75 6e 63 74  calls this funct
15e50 69 6f 6e 20 61 67 61 69 6e 2e 20 54 68 69 73 20  ion again. This 
15e60 69 73 0a 20 20 20 20 2a 2a 20 72 65 71 75 69 72  is.    ** requir
15e70 65 64 20 61 73 20 74 68 65 20 76 65 72 73 69 6f  ed as the versio
15e80 6e 20 6f 66 20 70 61 67 65 20 31 20 63 75 72 72  n of page 1 curr
15e90 65 6e 74 6c 79 20 69 6e 20 74 68 65 20 70 61 67  ently in the pag
15ea0 65 31 20 62 75 66 66 65 72 0a 20 20 20 20 2a 2a  e1 buffer.    **
15eb0 20 6d 61 79 20 6e 6f 74 20 62 65 20 74 68 65 20   may not be the 
15ec0 6c 61 74 65 73 74 20 76 65 72 73 69 6f 6e 20 2d  latest version -
15ed0 20 74 68 65 72 65 20 6d 61 79 20 62 65 20 61 20   there may be a 
15ee0 6e 65 77 65 72 20 6f 6e 65 20 69 6e 20 74 68 65  newer one in the
15ef0 20 6c 6f 67 0a 20 20 20 20 2a 2a 20 66 69 6c 65   log.    ** file
15f00 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
15f10 20 70 61 67 65 31 5b 31 39 5d 3d 3d 32 20 26 26   page1[19]==2 &&
15f20 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20   (pBt->btsFlags 
15f30 26 20 42 54 53 5f 4e 4f 5f 57 41 4c 29 3d 3d 30  & BTS_NO_WAL)==0
15f40 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 73   ){.      int is
15f50 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20  Open = 0;.      
15f60 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
15f70 72 4f 70 65 6e 57 61 6c 28 70 42 74 2d 3e 70 50  rOpenWal(pBt->pP
15f80 61 67 65 72 2c 20 26 69 73 4f 70 65 6e 29 3b 0a  ager, &isOpen);.
15f90 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
15fa0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
15fb0 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e     goto page1_in
15fc0 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 20  it_failed;.     
15fd0 20 7d 65 6c 73 65 20 69 66 28 20 69 73 4f 70 65   }else if( isOpe
15fe0 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  n==0 ){.        
15ff0 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67  releasePage(pPag
16000 65 31 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  e1);.        ret
16010 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
16020 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20       }.      rc 
16030 3d 20 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42 3b  = SQLITE_NOTADB;
16040 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  .    }.#endif.. 
16050 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
16060 46 3a 20 52 2d 31 35 34 36 35 2d 32 30 38 31 33  F: R-15465-20813
16070 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 61 6e 64   The maximum and
16080 20 6d 69 6e 69 6d 75 6d 20 65 6d 62 65 64 64 65   minimum embedde
16090 64 20 70 61 79 6c 6f 61 64 0a 20 20 20 20 2a 2a  d payload.    **
160a0 20 66 72 61 63 74 69 6f 6e 73 20 61 6e 64 20 74   fractions and t
160b0 68 65 20 6c 65 61 66 20 70 61 79 6c 6f 61 64 20  he leaf payload 
160c0 66 72 61 63 74 69 6f 6e 20 76 61 6c 75 65 73 20  fraction values 
160d0 6d 75 73 74 20 62 65 20 36 34 2c 20 33 32 2c 20  must be 64, 32, 
160e0 61 6e 64 20 33 32 2e 0a 20 20 20 20 2a 2a 0a 20  and 32..    **. 
160f0 20 20 20 2a 2a 20 54 68 65 20 6f 72 69 67 69 6e     ** The origin
16100 61 6c 20 64 65 73 69 67 6e 20 61 6c 6c 6f 77 65  al design allowe
16110 64 20 74 68 65 73 65 20 61 6d 6f 75 6e 74 73 20  d these amounts 
16120 74 6f 20 76 61 72 79 2c 20 62 75 74 20 61 73 20  to vary, but as 
16130 6f 66 0a 20 20 20 20 2a 2a 20 76 65 72 73 69 6f  of.    ** versio
16140 6e 20 33 2e 36 2e 30 2c 20 77 65 20 72 65 71 75  n 3.6.0, we requ
16150 69 72 65 20 74 68 65 6d 20 74 6f 20 62 65 20 66  ire them to be f
16160 69 78 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ixed..    */.   
16170 20 69 66 28 20 6d 65 6d 63 6d 70 28 26 70 61 67   if( memcmp(&pag
16180 65 31 5b 32 31 5d 2c 20 22 5c 31 30 30 5c 30 34  e1[21], "\100\04
16190 30 5c 30 34 30 22 2c 33 29 21 3d 30 20 29 7b 0a  0\040",3)!=0 ){.
161a0 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31        goto page1
161b0 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20  _init_failed;.  
161c0 20 20 7d 0a 20 20 20 20 2f 2a 20 45 56 49 44 45    }.    /* EVIDE
161d0 4e 43 45 2d 4f 46 3a 20 52 2d 35 31 38 37 33 2d  NCE-OF: R-51873-
161e0 33 39 36 31 38 20 54 68 65 20 70 61 67 65 20 73  39618 The page s
161f0 69 7a 65 20 66 6f 72 20 61 20 64 61 74 61 62 61  ize for a databa
16200 73 65 20 66 69 6c 65 20 69 73 0a 20 20 20 20 2a  se file is.    *
16210 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20  * determined by 
16220 74 68 65 20 32 2d 62 79 74 65 20 69 6e 74 65 67  the 2-byte integ
16230 65 72 20 6c 6f 63 61 74 65 64 20 61 74 20 61 6e  er located at an
16240 20 6f 66 66 73 65 74 20 6f 66 20 31 36 20 62 79   offset of 16 by
16250 74 65 73 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20  tes from.    ** 
16260 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
16270 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
16280 6c 65 2e 20 2a 2f 0a 20 20 20 20 70 61 67 65 53  le. */.    pageS
16290 69 7a 65 20 3d 20 28 70 61 67 65 31 5b 31 36 5d  ize = (page1[16]
162a0 3c 3c 38 29 20 7c 20 28 70 61 67 65 31 5b 31 37  <<8) | (page1[17
162b0 5d 3c 3c 31 36 29 3b 0a 20 20 20 20 2f 2a 20 45  ]<<16);.    /* E
162c0 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 35  VIDENCE-OF: R-25
162d0 30 30 38 2d 32 31 36 38 38 20 54 68 65 20 73 69  008-21688 The si
162e0 7a 65 20 6f 66 20 61 20 70 61 67 65 20 69 73 20  ze of a page is 
162f0 61 20 70 6f 77 65 72 20 6f 66 20 74 77 6f 0a 20  a power of two. 
16300 20 20 20 2a 2a 20 62 65 74 77 65 65 6e 20 35 31     ** between 51
16310 32 20 61 6e 64 20 36 35 35 33 36 20 69 6e 63 6c  2 and 65536 incl
16320 75 73 69 76 65 2e 20 2a 2f 0a 20 20 20 20 69 66  usive. */.    if
16330 28 20 28 28 70 61 67 65 53 69 7a 65 2d 31 29 26  ( ((pageSize-1)&
16340 70 61 67 65 53 69 7a 65 29 21 3d 30 0a 20 20 20  pageSize)!=0.   
16350 20 20 7c 7c 20 70 61 67 65 53 69 7a 65 3e 53 51    || pageSize>SQ
16360 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49  LITE_MAX_PAGE_SI
16370 5a 45 20 0a 20 20 20 20 20 7c 7c 20 70 61 67 65  ZE .     || page
16380 53 69 7a 65 3c 3d 32 35 36 20 0a 20 20 20 20 29  Size<=256 .    )
16390 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67  {.      goto pag
163a0 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a  e1_init_failed;.
163b0 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
163c0 28 20 28 70 61 67 65 53 69 7a 65 20 26 20 37 29  ( (pageSize & 7)
163d0 3d 3d 30 20 29 3b 0a 20 20 20 20 2f 2a 20 45 56  ==0 );.    /* EV
163e0 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 39 33  IDENCE-OF: R-593
163f0 31 30 2d 35 31 32 30 35 20 54 68 65 20 22 72 65  10-51205 The "re
16400 73 65 72 76 65 64 20 73 70 61 63 65 22 20 73 69  served space" si
16410 7a 65 20 69 6e 20 74 68 65 20 31 2d 62 79 74 65  ze in the 1-byte
16420 0a 20 20 20 20 2a 2a 20 69 6e 74 65 67 65 72 20  .    ** integer 
16430 61 74 20 6f 66 66 73 65 74 20 32 30 20 69 73 20  at offset 20 is 
16440 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
16450 74 65 73 20 6f 66 20 73 70 61 63 65 20 61 74 20  tes of space at 
16460 74 68 65 20 65 6e 64 20 6f 66 0a 20 20 20 20 2a  the end of.    *
16470 2a 20 65 61 63 68 20 70 61 67 65 20 74 6f 20 72  * each page to r
16480 65 73 65 72 76 65 20 66 6f 72 20 65 78 74 65 6e  eserve for exten
16490 73 69 6f 6e 73 2e 20 0a 20 20 20 20 2a 2a 0a 20  sions. .    **. 
164a0 20 20 20 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f     ** EVIDENCE-O
164b0 46 3a 20 52 2d 33 37 34 39 37 2d 34 32 34 31 32  F: R-37497-42412
164c0 20 54 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   The size of the
164d0 20 72 65 73 65 72 76 65 64 20 72 65 67 69 6f 6e   reserved region
164e0 20 69 73 0a 20 20 20 20 2a 2a 20 64 65 74 65 72   is.    ** deter
164f0 6d 69 6e 65 64 20 62 79 20 74 68 65 20 6f 6e 65  mined by the one
16500 2d 62 79 74 65 20 75 6e 73 69 67 6e 65 64 20 69  -byte unsigned i
16510 6e 74 65 67 65 72 20 66 6f 75 6e 64 20 61 74 20  nteger found at 
16520 61 6e 20 6f 66 66 73 65 74 20 6f 66 20 32 30 0a  an offset of 20.
16530 20 20 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20      ** into the 
16540 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 65  database file he
16550 61 64 65 72 2e 20 2a 2f 0a 20 20 20 20 75 73 61  ader. */.    usa
16560 62 6c 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69  bleSize = pageSi
16570 7a 65 20 2d 20 70 61 67 65 31 5b 32 30 5d 3b 0a  ze - page1[20];.
16580 20 20 20 20 69 66 28 20 28 75 33 32 29 70 61 67      if( (u32)pag
16590 65 53 69 7a 65 21 3d 70 42 74 2d 3e 70 61 67 65  eSize!=pBt->page
165a0 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a  Size ){.      /*
165b0 20 41 66 74 65 72 20 72 65 61 64 69 6e 67 20 74   After reading t
165c0 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66  he first page of
165d0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61 73   the database as
165e0 73 75 6d 69 6e 67 20 61 20 70 61 67 65 20 73 69  suming a page si
165f0 7a 65 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 42  ze.      ** of B
16600 74 53 68 61 72 65 64 2e 70 61 67 65 53 69 7a 65  tShared.pageSize
16610 2c 20 77 65 20 68 61 76 65 20 64 69 73 63 6f 76  , we have discov
16620 65 72 65 64 20 74 68 61 74 20 74 68 65 20 70 61  ered that the pa
16630 67 65 2d 73 69 7a 65 20 69 73 0a 20 20 20 20 20  ge-size is.     
16640 20 2a 2a 20 61 63 74 75 61 6c 6c 79 20 70 61 67   ** actually pag
16650 65 53 69 7a 65 2e 20 55 6e 6c 6f 63 6b 20 74 68  eSize. Unlock th
16660 65 20 64 61 74 61 62 61 73 65 2c 20 6c 65 61 76  e database, leav
16670 65 20 70 42 74 2d 3e 70 50 61 67 65 31 20 61 74  e pBt->pPage1 at
16680 0a 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f 20 61  .      ** zero a
16690 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  nd return SQLITE
166a0 5f 4f 4b 2e 20 54 68 65 20 63 61 6c 6c 65 72 20  _OK. The caller 
166b0 77 69 6c 6c 20 63 61 6c 6c 20 74 68 69 73 20 66  will call this f
166c0 75 6e 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a  unction.      **
166d0 20 61 67 61 69 6e 20 77 69 74 68 20 74 68 65 20   again with the 
166e0 63 6f 72 72 65 63 74 20 70 61 67 65 2d 73 69 7a  correct page-siz
166f0 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
16700 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
16710 61 67 65 31 29 3b 0a 20 20 20 20 20 20 70 42 74  age1);.      pBt
16720 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 75  ->usableSize = u
16730 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 20 20 20  sableSize;.     
16740 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d   pBt->pageSize =
16750 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 20   pageSize;.     
16760 20 66 72 65 65 54 65 6d 70 53 70 61 63 65 28 70   freeTempSpace(p
16770 42 74 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  Bt);.      rc = 
16780 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50  sqlite3PagerSetP
16790 61 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61  agesize(pBt->pPa
167a0 67 65 72 2c 20 26 70 42 74 2d 3e 70 61 67 65 53  ger, &pBt->pageS
167b0 69 7a 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ize,.           
167c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
167d0 20 20 20 20 20 20 20 20 70 61 67 65 53 69 7a 65          pageSize
167e0 2d 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20  -usableSize);.  
167f0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
16800 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 70 42     }.    if( (pB
16810 74 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  t->db->flags & S
16820 51 4c 49 54 45 5f 52 65 63 6f 76 65 72 79 4d 6f  QLITE_RecoveryMo
16830 64 65 29 3d 3d 30 20 26 26 20 6e 50 61 67 65 3e  de)==0 && nPage>
16840 6e 50 61 67 65 46 69 6c 65 20 29 7b 0a 20 20 20  nPageFile ){.   
16850 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
16860 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
16870 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e     goto page1_in
16880 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d  it_failed;.    }
16890 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45  .    /* EVIDENCE
168a0 2d 4f 46 3a 20 52 2d 32 38 33 31 32 2d 36 34 37  -OF: R-28312-647
168b0 30 34 20 48 6f 77 65 76 65 72 2c 20 74 68 65 20  04 However, the 
168c0 75 73 61 62 6c 65 20 73 69 7a 65 20 69 73 20 6e  usable size is n
168d0 6f 74 20 61 6c 6c 6f 77 65 64 20 74 6f 0a 20 20  ot allowed to.  
168e0 20 20 2a 2a 20 62 65 20 6c 65 73 73 20 74 68 61    ** be less tha
168f0 6e 20 34 38 30 2e 20 49 6e 20 6f 74 68 65 72 20  n 480. In other 
16900 77 6f 72 64 73 2c 20 69 66 20 74 68 65 20 70 61  words, if the pa
16910 67 65 20 73 69 7a 65 20 69 73 20 35 31 32 2c 20  ge size is 512, 
16920 74 68 65 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20  then the.    ** 
16930 72 65 73 65 72 76 65 64 20 73 70 61 63 65 20 73  reserved space s
16940 69 7a 65 20 63 61 6e 6e 6f 74 20 65 78 63 65 65  ize cannot excee
16950 64 20 33 32 2e 20 2a 2f 0a 20 20 20 20 69 66 28  d 32. */.    if(
16960 20 75 73 61 62 6c 65 53 69 7a 65 3c 34 38 30 20   usableSize<480 
16970 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61  ){.      goto pa
16980 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b  ge1_init_failed;
16990 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e  .    }.    pBt->
169a0 70 61 67 65 53 69 7a 65 20 3d 20 70 61 67 65 53  pageSize = pageS
169b0 69 7a 65 3b 0a 20 20 20 20 70 42 74 2d 3e 75 73  ize;.    pBt->us
169c0 61 62 6c 65 53 69 7a 65 20 3d 20 75 73 61 62 6c  ableSize = usabl
169d0 65 53 69 7a 65 3b 0a 23 69 66 6e 64 65 66 20 53  eSize;.#ifndef S
169e0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
169f0 41 43 55 55 4d 0a 20 20 20 20 70 42 74 2d 3e 61  ACUUM.    pBt->a
16a00 75 74 6f 56 61 63 75 75 6d 20 3d 20 28 67 65 74  utoVacuum = (get
16a10 34 62 79 74 65 28 26 70 61 67 65 31 5b 33 36 20  4byte(&page1[36 
16a20 2b 20 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a 20 20  + 4*4])?1:0);.  
16a30 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75    pBt->incrVacuu
16a40 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28 26 70  m = (get4byte(&p
16a50 61 67 65 31 5b 33 36 20 2b 20 37 2a 34 5d 29 3f  age1[36 + 7*4])?
16a60 31 3a 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d  1:0);.#endif.  }
16a70 0a 0a 20 20 2f 2a 20 6d 61 78 4c 6f 63 61 6c 20  ..  /* maxLocal 
16a80 69 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 61  is the maximum a
16a90 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64  mount of payload
16aa0 20 74 6f 20 73 74 6f 72 65 20 6c 6f 63 61 6c 6c   to store locall
16ab0 79 20 66 6f 72 0a 20 20 2a 2a 20 61 20 63 65 6c  y for.  ** a cel
16ac0 6c 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 69 74  l.  Make sure it
16ad0 20 69 73 20 73 6d 61 6c 6c 20 65 6e 6f 75 67 68   is small enough
16ae0 20 73 6f 20 74 68 61 74 20 61 74 20 6c 65 61 73   so that at leas
16af0 74 20 6d 69 6e 46 61 6e 6f 75 74 0a 20 20 2a 2a  t minFanout.  **
16b00 20 63 65 6c 6c 73 20 63 61 6e 20 77 69 6c 6c 20   cells can will 
16b10 66 69 74 20 6f 6e 20 6f 6e 65 20 70 61 67 65 2e  fit on one page.
16b20 20 20 57 65 20 61 73 73 75 6d 65 20 61 20 31 30    We assume a 10
16b30 2d 62 79 74 65 20 70 61 67 65 20 68 65 61 64 65  -byte page heade
16b40 72 2e 0a 20 20 2a 2a 20 42 65 73 69 64 65 73 20  r..  ** Besides 
16b50 74 68 65 20 70 61 79 6c 6f 61 64 2c 20 74 68 65  the payload, the
16b60 20 63 65 6c 6c 20 6d 75 73 74 20 73 74 6f 72 65   cell must store
16b70 3a 0a 20 20 2a 2a 20 20 20 20 20 32 2d 62 79 74  :.  **     2-byt
16b80 65 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  e pointer to the
16b90 20 63 65 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 34   cell.  **     4
16ba0 2d 62 79 74 65 20 63 68 69 6c 64 20 70 6f 69 6e  -byte child poin
16bb0 74 65 72 0a 20 20 2a 2a 20 20 20 20 20 39 2d 62  ter.  **     9-b
16bc0 79 74 65 20 6e 4b 65 79 20 76 61 6c 75 65 0a 20  yte nKey value. 
16bd0 20 2a 2a 20 20 20 20 20 34 2d 62 79 74 65 20 6e   **     4-byte n
16be0 44 61 74 61 20 76 61 6c 75 65 0a 20 20 2a 2a 20  Data value.  ** 
16bf0 20 20 20 20 34 2d 62 79 74 65 20 6f 76 65 72 66      4-byte overf
16c00 6c 6f 77 20 70 61 67 65 20 70 6f 69 6e 74 65 72  low page pointer
16c10 0a 20 20 2a 2a 20 53 6f 20 61 20 63 65 6c 6c 20  .  ** So a cell 
16c20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 32 2d  consists of a 2-
16c30 62 79 74 65 20 70 6f 69 6e 74 65 72 2c 20 61 20  byte pointer, a 
16c40 68 65 61 64 65 72 20 77 68 69 63 68 20 69 73 20  header which is 
16c50 61 73 20 6d 75 63 68 20 61 73 0a 20 20 2a 2a 20  as much as.  ** 
16c60 31 37 20 62 79 74 65 73 20 6c 6f 6e 67 2c 20 30  17 bytes long, 0
16c70 20 74 6f 20 4e 20 62 79 74 65 73 20 6f 66 20 70   to N bytes of p
16c80 61 79 6c 6f 61 64 2c 20 61 6e 64 20 61 6e 20 6f  ayload, and an o
16c90 70 74 69 6f 6e 61 6c 20 34 20 62 79 74 65 20 6f  ptional 4 byte o
16ca0 76 65 72 66 6c 6f 77 0a 20 20 2a 2a 20 70 61 67  verflow.  ** pag
16cb0 65 20 70 6f 69 6e 74 65 72 2e 0a 20 20 2a 2f 0a  e pointer..  */.
16cc0 20 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 20    pBt->maxLocal 
16cd0 3d 20 28 75 31 36 29 28 28 70 42 74 2d 3e 75 73  = (u16)((pBt->us
16ce0 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a 36 34 2f  ableSize-12)*64/
16cf0 32 35 35 20 2d 20 32 33 29 3b 0a 20 20 70 42 74  255 - 23);.  pBt
16d00 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 28 75 31  ->minLocal = (u1
16d10 36 29 28 28 70 42 74 2d 3e 75 73 61 62 6c 65 53  6)((pBt->usableS
16d20 69 7a 65 2d 31 32 29 2a 33 32 2f 32 35 35 20 2d  ize-12)*32/255 -
16d30 20 32 33 29 3b 0a 20 20 70 42 74 2d 3e 6d 61 78   23);.  pBt->max
16d40 4c 65 61 66 20 3d 20 28 75 31 36 29 28 70 42 74  Leaf = (u16)(pBt
16d50 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 33  ->usableSize - 3
16d60 35 29 3b 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c 65  5);.  pBt->minLe
16d70 61 66 20 3d 20 28 75 31 36 29 28 28 70 42 74 2d  af = (u16)((pBt-
16d80 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a  >usableSize-12)*
16d90 33 32 2f 32 35 35 20 2d 20 32 33 29 3b 0a 20 20  32/255 - 23);.  
16da0 69 66 28 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61  if( pBt->maxLoca
16db0 6c 3e 31 32 37 20 29 7b 0a 20 20 20 20 70 42 74  l>127 ){.    pBt
16dc0 2d 3e 6d 61 78 31 62 79 74 65 50 61 79 6c 6f 61  ->max1bytePayloa
16dd0 64 20 3d 20 31 32 37 3b 0a 20 20 7d 65 6c 73 65  d = 127;.  }else
16de0 7b 0a 20 20 20 20 70 42 74 2d 3e 6d 61 78 31 62  {.    pBt->max1b
16df0 79 74 65 50 61 79 6c 6f 61 64 20 3d 20 28 75 38  ytePayload = (u8
16e00 29 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a  )pBt->maxLocal;.
16e10 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 42    }.  assert( pB
16e20 74 2d 3e 6d 61 78 4c 65 61 66 20 2b 20 32 33 20  t->maxLeaf + 23 
16e30 3c 3d 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28  <= MX_CELL_SIZE(
16e40 70 42 74 29 20 29 3b 0a 20 20 70 42 74 2d 3e 70  pBt) );.  pBt->p
16e50 50 61 67 65 31 20 3d 20 70 50 61 67 65 31 3b 0a  Page1 = pPage1;.
16e60 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 6e    pBt->nPage = n
16e70 50 61 67 65 3b 0a 20 20 72 65 74 75 72 6e 20 53  Page;.  return S
16e80 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 70 61 67 65 31  QLITE_OK;..page1
16e90 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3a 0a 20 20  _init_failed:.  
16ea0 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67  releasePage(pPag
16eb0 65 31 29 3b 0a 20 20 70 42 74 2d 3e 70 50 61 67  e1);.  pBt->pPag
16ec0 65 31 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  e1 = 0;.  return
16ed0 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20   rc;.}..#ifndef 
16ee0 4e 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 52 65 74  NDEBUG./*.** Ret
16ef0 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
16f00 66 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f  f cursors open o
16f10 6e 20 70 42 74 2e 20 54 68 69 73 20 69 73 20 66  n pBt. This is f
16f20 6f 72 20 75 73 65 0a 2a 2a 20 69 6e 20 61 73 73  or use.** in ass
16f30 65 72 74 28 29 20 65 78 70 72 65 73 73 69 6f 6e  ert() expression
16f40 73 2c 20 73 6f 20 69 74 20 69 73 20 6f 6e 6c 79  s, so it is only
16f50 20 63 6f 6d 70 69 6c 65 64 20 69 66 20 4e 44 45   compiled if NDE
16f60 42 55 47 20 69 73 20 6e 6f 74 0a 2a 2a 20 64 65  BUG is not.** de
16f70 66 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c  fined..**.** Onl
16f80 79 20 77 72 69 74 65 20 63 75 72 73 6f 72 73 20  y write cursors 
16f90 61 72 65 20 63 6f 75 6e 74 65 64 20 69 66 20 77  are counted if w
16fa0 72 4f 6e 6c 79 20 69 73 20 74 72 75 65 2e 20 20  rOnly is true.  
16fb0 49 66 20 77 72 4f 6e 6c 79 20 69 73 0a 2a 2a 20  If wrOnly is.** 
16fc0 66 61 6c 73 65 20 74 68 65 6e 20 61 6c 6c 20 63  false then all c
16fd0 75 72 73 6f 72 73 20 61 72 65 20 63 6f 75 6e 74  ursors are count
16fe0 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68  ed..**.** For th
16ff0 65 20 70 75 72 70 6f 73 65 73 20 6f 66 20 74 68  e purposes of th
17000 69 73 20 72 6f 75 74 69 6e 65 2c 20 61 20 63 75  is routine, a cu
17010 72 73 6f 72 20 69 73 20 61 6e 79 20 63 75 72 73  rsor is any curs
17020 6f 72 20 74 68 61 74 0a 2a 2a 20 69 73 20 63 61  or that.** is ca
17030 70 61 62 6c 65 20 6f 66 20 72 65 61 64 69 6e 67  pable of reading
17040 20 6f 72 20 77 72 69 74 69 6e 67 20 74 6f 20 74   or writing to t
17050 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 43 75  he database.  Cu
17060 72 73 6f 72 73 20 74 68 61 74 0a 2a 2a 20 68 61  rsors that.** ha
17070 76 65 20 62 65 65 6e 20 74 72 69 70 70 65 64 20  ve been tripped 
17080 69 6e 74 6f 20 74 68 65 20 43 55 52 53 4f 52 5f  into the CURSOR_
17090 46 41 55 4c 54 20 73 74 61 74 65 20 61 72 65 20  FAULT state are 
170a0 6e 6f 74 20 63 6f 75 6e 74 65 64 2e 0a 2a 2f 0a  not counted..*/.
170b0 73 74 61 74 69 63 20 69 6e 74 20 63 6f 75 6e 74  static int count
170c0 56 61 6c 69 64 43 75 72 73 6f 72 73 28 42 74 53  ValidCursors(BtS
170d0 68 61 72 65 64 20 2a 70 42 74 2c 20 69 6e 74 20  hared *pBt, int 
170e0 77 72 4f 6e 6c 79 29 7b 0a 20 20 42 74 43 75 72  wrOnly){.  BtCur
170f0 73 6f 72 20 2a 70 43 75 72 3b 0a 20 20 69 6e 74  sor *pCur;.  int
17100 20 72 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 43   r = 0;.  for(pC
17110 75 72 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b  ur=pBt->pCursor;
17120 20 70 43 75 72 3b 20 70 43 75 72 3d 70 43 75 72   pCur; pCur=pCur
17130 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66  ->pNext){.    if
17140 28 20 28 77 72 4f 6e 6c 79 3d 3d 30 20 7c 7c 20  ( (wrOnly==0 || 
17150 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20  (pCur->curFlags 
17160 26 20 42 54 43 46 5f 57 72 69 74 65 46 6c 61 67  & BTCF_WriteFlag
17170 29 21 3d 30 29 0a 20 20 20 20 20 26 26 20 70 43  )!=0).     && pC
17180 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53  ur->eState!=CURS
17190 4f 52 5f 46 41 55 4c 54 20 29 20 72 2b 2b 3b 20  OR_FAULT ) r++; 
171a0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 3b  .  }.  return r;
171b0 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
171c0 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f   If there are no
171d0 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 63 75 72   outstanding cur
171e0 73 6f 72 73 20 61 6e 64 20 77 65 20 61 72 65 20  sors and we are 
171f0 6e 6f 74 20 69 6e 20 74 68 65 20 6d 69 64 64 6c  not in the middl
17200 65 0a 2a 2a 20 6f 66 20 61 20 74 72 61 6e 73 61  e.** of a transa
17210 63 74 69 6f 6e 20 62 75 74 20 74 68 65 72 65 20  ction but there 
17220 69 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 6f  is a read lock o
17230 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20  n the database, 
17240 74 68 65 6e 0a 2a 2a 20 74 68 69 73 20 72 6f 75  then.** this rou
17250 74 69 6e 65 20 75 6e 72 65 66 73 20 74 68 65 20  tine unrefs the 
17260 66 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68  first page of th
17270 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
17280 77 68 69 63 68 20 0a 2a 2a 20 68 61 73 20 74 68  which .** has th
17290 65 20 65 66 66 65 63 74 20 6f 66 20 72 65 6c 65  e effect of rele
172a0 61 73 69 6e 67 20 74 68 65 20 72 65 61 64 20 6c  asing the read l
172b0 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ock..**.** If th
172c0 65 72 65 20 69 73 20 61 20 74 72 61 6e 73 61 63  ere is a transac
172d0 74 69 6f 6e 20 69 6e 20 70 72 6f 67 72 65 73 73  tion in progress
172e0 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
172f0 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74  s a no-op..*/.st
17300 61 74 69 63 20 76 6f 69 64 20 75 6e 6c 6f 63 6b  atic void unlock
17310 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 42 74  BtreeIfUnused(Bt
17320 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20  Shared *pBt){.  
17330 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
17340 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
17350 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
17360 72 74 28 20 63 6f 75 6e 74 56 61 6c 69 64 43 75  rt( countValidCu
17370 72 73 6f 72 73 28 70 42 74 2c 30 29 3d 3d 30 20  rsors(pBt,0)==0 
17380 7c 7c 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  || pBt->inTransa
17390 63 74 69 6f 6e 3e 54 52 41 4e 53 5f 4e 4f 4e 45  ction>TRANS_NONE
173a0 20 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 69   );.  if( pBt->i
173b0 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52  nTransaction==TR
173c0 41 4e 53 5f 4e 4f 4e 45 20 26 26 20 70 42 74 2d  ANS_NONE && pBt-
173d0 3e 70 50 61 67 65 31 21 3d 30 20 29 7b 0a 20 20  >pPage1!=0 ){.  
173e0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
173f0 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b  1 = pBt->pPage1;
17400 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
17410 67 65 31 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20  ge1->aData );.  
17420 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
17430 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70  3PagerRefcount(p
17440 42 74 2d 3e 70 50 61 67 65 72 29 3d 3d 31 20 29  Bt->pPager)==1 )
17450 3b 0a 20 20 20 20 70 42 74 2d 3e 70 50 61 67 65  ;.    pBt->pPage
17460 31 20 3d 20 30 3b 0a 20 20 20 20 72 65 6c 65 61  1 = 0;.    relea
17470 73 65 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a  sePage(pPage1);.
17480 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20    }.}../*.** If 
17490 70 42 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e  pBt points to an
174a0 20 65 6d 70 74 79 20 66 69 6c 65 20 74 68 65 6e   empty file then
174b0 20 63 6f 6e 76 65 72 74 20 74 68 61 74 20 65 6d   convert that em
174c0 70 74 79 20 66 69 6c 65 0a 2a 2a 20 69 6e 74 6f  pty file.** into
174d0 20 61 20 6e 65 77 20 65 6d 70 74 79 20 64 61 74   a new empty dat
174e0 61 62 61 73 65 20 62 79 20 69 6e 69 74 69 61 6c  abase by initial
174f0 69 7a 69 6e 67 20 74 68 65 20 66 69 72 73 74 20  izing the first 
17500 70 61 67 65 20 6f 66 0a 2a 2a 20 74 68 65 20 64  page of.** the d
17510 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 73 74 61 74  atabase..*/.stat
17520 69 63 20 69 6e 74 20 6e 65 77 44 61 74 61 62 61  ic int newDataba
17530 73 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  se(BtShared *pBt
17540 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  ){.  MemPage *pP
17550 31 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  1;.  unsigned ch
17560 61 72 20 2a 64 61 74 61 3b 0a 20 20 69 6e 74 20  ar *data;.  int 
17570 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  rc;..  assert( s
17580 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
17590 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
175a0 0a 20 20 69 66 28 20 70 42 74 2d 3e 6e 50 61 67  .  if( pBt->nPag
175b0 65 3e 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  e>0 ){.    retur
175c0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
175d0 0a 20 20 70 50 31 20 3d 20 70 42 74 2d 3e 70 50  .  pP1 = pBt->pP
175e0 61 67 65 31 3b 0a 20 20 61 73 73 65 72 74 28 20  age1;.  assert( 
175f0 70 50 31 21 3d 30 20 29 3b 0a 20 20 64 61 74 61  pP1!=0 );.  data
17600 20 3d 20 70 50 31 2d 3e 61 44 61 74 61 3b 0a 20   = pP1->aData;. 
17610 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
17620 65 72 57 72 69 74 65 28 70 50 31 2d 3e 70 44 62  erWrite(pP1->pDb
17630 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20  Page);.  if( rc 
17640 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 6d  ) return rc;.  m
17650 65 6d 63 70 79 28 64 61 74 61 2c 20 7a 4d 61 67  emcpy(data, zMag
17660 69 63 48 65 61 64 65 72 2c 20 73 69 7a 65 6f 66  icHeader, sizeof
17670 28 7a 4d 61 67 69 63 48 65 61 64 65 72 29 29 3b  (zMagicHeader));
17680 0a 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f  .  assert( sizeo
17690 66 28 7a 4d 61 67 69 63 48 65 61 64 65 72 29 3d  f(zMagicHeader)=
176a0 3d 31 36 20 29 3b 0a 20 20 64 61 74 61 5b 31 36  =16 );.  data[16
176b0 5d 20 3d 20 28 75 38 29 28 28 70 42 74 2d 3e 70  ] = (u8)((pBt->p
176c0 61 67 65 53 69 7a 65 3e 3e 38 29 26 30 78 66 66  ageSize>>8)&0xff
176d0 29 3b 0a 20 20 64 61 74 61 5b 31 37 5d 20 3d 20  );.  data[17] = 
176e0 28 75 38 29 28 28 70 42 74 2d 3e 70 61 67 65 53  (u8)((pBt->pageS
176f0 69 7a 65 3e 3e 31 36 29 26 30 78 66 66 29 3b 0a  ize>>16)&0xff);.
17700 20 20 64 61 74 61 5b 31 38 5d 20 3d 20 31 3b 0a    data[18] = 1;.
17710 20 20 64 61 74 61 5b 31 39 5d 20 3d 20 31 3b 0a    data[19] = 1;.
17720 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 75    assert( pBt->u
17730 73 61 62 6c 65 53 69 7a 65 3c 3d 70 42 74 2d 3e  sableSize<=pBt->
17740 70 61 67 65 53 69 7a 65 20 26 26 20 70 42 74 2d  pageSize && pBt-
17750 3e 75 73 61 62 6c 65 53 69 7a 65 2b 32 35 35 3e  >usableSize+255>
17760 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b  =pBt->pageSize);
17770 0a 20 20 64 61 74 61 5b 32 30 5d 20 3d 20 28 75  .  data[20] = (u
17780 38 29 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  8)(pBt->pageSize
17790 20 2d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69   - pBt->usableSi
177a0 7a 65 29 3b 0a 20 20 64 61 74 61 5b 32 31 5d 20  ze);.  data[21] 
177b0 3d 20 36 34 3b 0a 20 20 64 61 74 61 5b 32 32 5d  = 64;.  data[22]
177c0 20 3d 20 33 32 3b 0a 20 20 64 61 74 61 5b 32 33   = 32;.  data[23
177d0 5d 20 3d 20 33 32 3b 0a 20 20 6d 65 6d 73 65 74  ] = 32;.  memset
177e0 28 26 64 61 74 61 5b 32 34 5d 2c 20 30 2c 20 31  (&data[24], 0, 1
177f0 30 30 2d 32 34 29 3b 0a 20 20 7a 65 72 6f 50 61  00-24);.  zeroPa
17800 67 65 28 70 50 31 2c 20 50 54 46 5f 49 4e 54 4b  ge(pP1, PTF_INTK
17810 45 59 7c 50 54 46 5f 4c 45 41 46 7c 50 54 46 5f  EY|PTF_LEAF|PTF_
17820 4c 45 41 46 44 41 54 41 20 29 3b 0a 20 20 70 42  LEAFDATA );.  pB
17830 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42  t->btsFlags |= B
17840 54 53 5f 50 41 47 45 53 49 5a 45 5f 46 49 58 45  TS_PAGESIZE_FIXE
17850 44 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  D;.#ifndef SQLIT
17860 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
17870 4d 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  M.  assert( pBt-
17880 3e 61 75 74 6f 56 61 63 75 75 6d 3d 3d 31 20 7c  >autoVacuum==1 |
17890 7c 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  | pBt->autoVacuu
178a0 6d 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  m==0 );.  assert
178b0 28 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75  ( pBt->incrVacuu
178c0 6d 3d 3d 31 20 7c 7c 20 70 42 74 2d 3e 69 6e 63  m==1 || pBt->inc
178d0 72 56 61 63 75 75 6d 3d 3d 30 20 29 3b 0a 20 20  rVacuum==0 );.  
178e0 70 75 74 34 62 79 74 65 28 26 64 61 74 61 5b 33  put4byte(&data[3
178f0 36 20 2b 20 34 2a 34 5d 2c 20 70 42 74 2d 3e 61  6 + 4*4], pBt->a
17900 75 74 6f 56 61 63 75 75 6d 29 3b 0a 20 20 70 75  utoVacuum);.  pu
17910 74 34 62 79 74 65 28 26 64 61 74 61 5b 33 36 20  t4byte(&data[36 
17920 2b 20 37 2a 34 5d 2c 20 70 42 74 2d 3e 69 6e 63  + 7*4], pBt->inc
17930 72 56 61 63 75 75 6d 29 3b 0a 23 65 6e 64 69 66  rVacuum);.#endif
17940 0a 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20  .  pBt->nPage = 
17950 31 3b 0a 20 20 64 61 74 61 5b 33 31 5d 20 3d 20  1;.  data[31] = 
17960 31 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  1;.  return SQLI
17970 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
17980 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 66  Initialize the f
17990 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65  irst page of the
179a0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 28   database file (
179b0 63 72 65 61 74 69 6e 67 20 61 20 64 61 74 61 62  creating a datab
179c0 61 73 65 0a 2a 2a 20 63 6f 6e 73 69 73 74 69 6e  ase.** consistin
179d0 67 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 70 61  g of a single pa
179e0 67 65 20 61 6e 64 20 6e 6f 20 73 63 68 65 6d 61  ge and no schema
179f0 20 6f 62 6a 65 63 74 73 29 2e 20 52 65 74 75 72   objects). Retur
17a00 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69  n SQLITE_OK.** i
17a10 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 72  f successful, or
17a20 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
17a30 20 63 6f 64 65 20 6f 74 68 65 72 77 69 73 65 2e   code otherwise.
17a40 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
17a50 74 72 65 65 4e 65 77 44 62 28 42 74 72 65 65 20  treeNewDb(Btree 
17a60 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  *p){.  int rc;. 
17a70 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
17a80 65 72 28 70 29 3b 0a 20 20 70 2d 3e 70 42 74 2d  er(p);.  p->pBt-
17a90 3e 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20 72 63  >nPage = 0;.  rc
17aa0 20 3d 20 6e 65 77 44 61 74 61 62 61 73 65 28 70   = newDatabase(p
17ab0 2d 3e 70 42 74 29 3b 0a 20 20 73 71 6c 69 74 65  ->pBt);.  sqlite
17ac0 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
17ad0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
17ae0 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f  /*.** Attempt to
17af0 20 73 74 61 72 74 20 61 20 6e 65 77 20 74 72 61   start a new tra
17b00 6e 73 61 63 74 69 6f 6e 2e 20 41 20 77 72 69 74  nsaction. A writ
17b10 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a  e-transaction.**
17b20 20 69 73 20 73 74 61 72 74 65 64 20 69 66 20 74   is started if t
17b30 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
17b40 6e 74 20 69 73 20 6e 6f 6e 7a 65 72 6f 2c 20 6f  nt is nonzero, o
17b50 74 68 65 72 77 69 73 65 20 61 20 72 65 61 64 2d  therwise a read-
17b60 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  .** transaction.
17b70 20 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20    If the second 
17b80 61 72 67 75 6d 65 6e 74 20 69 73 20 32 20 6f 72  argument is 2 or
17b90 20 6d 6f 72 65 20 61 6e 64 20 65 78 63 6c 75 73   more and exclus
17ba0 69 76 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69  ive.** transacti
17bb0 6f 6e 20 69 73 20 73 74 61 72 74 65 64 2c 20 6d  on is started, m
17bc0 65 61 6e 69 6e 67 20 74 68 61 74 20 6e 6f 20 6f  eaning that no o
17bd0 74 68 65 72 20 70 72 6f 63 65 73 73 20 69 73 20  ther process is 
17be0 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20 61 63  allowed.** to ac
17bf0 63 65 73 73 20 74 68 65 20 64 61 74 61 62 61 73  cess the databas
17c00 65 2e 20 20 41 20 70 72 65 65 78 69 73 74 69 6e  e.  A preexistin
17c10 67 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61  g transaction ma
17c20 79 20 6e 6f 74 20 62 65 0a 2a 2a 20 75 70 67 72  y not be.** upgr
17c30 61 64 65 64 20 74 6f 20 65 78 63 6c 75 73 69 76  aded to exclusiv
17c40 65 20 62 79 20 63 61 6c 6c 69 6e 67 20 74 68 69  e by calling thi
17c50 73 20 72 6f 75 74 69 6e 65 20 61 20 73 65 63 6f  s routine a seco
17c60 6e 64 20 74 69 6d 65 20 2d 20 74 68 65 0a 2a 2a  nd time - the.**
17c70 20 65 78 63 6c 75 73 69 76 69 74 79 20 66 6c 61   exclusivity fla
17c80 67 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 66 6f 72  g only works for
17c90 20 61 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69   a new transacti
17ca0 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20 77 72 69 74  on..**.** A writ
17cb0 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75  e-transaction mu
17cc0 73 74 20 62 65 20 73 74 61 72 74 65 64 20 62 65  st be started be
17cd0 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e 67 20  fore attempting 
17ce0 61 6e 79 20 0a 2a 2a 20 63 68 61 6e 67 65 73 20  any .** changes 
17cf0 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  to the database.
17d00 20 20 4e 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f    None of the fo
17d10 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 73  llowing routines
17d20 20 0a 2a 2a 20 77 69 6c 6c 20 77 6f 72 6b 20 75   .** will work u
17d30 6e 6c 65 73 73 20 61 20 74 72 61 6e 73 61 63 74  nless a transact
17d40 69 6f 6e 20 69 73 20 73 74 61 72 74 65 64 20 66  ion is started f
17d50 69 72 73 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  irst:.**.**     
17d60 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 72 65   sqlite3BtreeCre
17d70 61 74 65 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20  ateTable().**   
17d80 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43     sqlite3BtreeC
17d90 72 65 61 74 65 49 6e 64 65 78 28 29 0a 2a 2a 20  reateIndex().** 
17da0 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
17db0 65 43 6c 65 61 72 54 61 62 6c 65 28 29 0a 2a 2a  eClearTable().**
17dc0 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
17dd0 65 65 44 72 6f 70 54 61 62 6c 65 28 29 0a 2a 2a  eeDropTable().**
17de0 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
17df0 65 65 49 6e 73 65 72 74 28 29 0a 2a 2a 20 20 20  eeInsert().**   
17e00 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 44     sqlite3BtreeD
17e10 65 6c 65 74 65 28 29 0a 2a 2a 20 20 20 20 20 20  elete().**      
17e20 73 71 6c 69 74 65 33 42 74 72 65 65 55 70 64 61  sqlite3BtreeUpda
17e30 74 65 4d 65 74 61 28 29 0a 2a 2a 0a 2a 2a 20 49  teMeta().**.** I
17e40 66 20 61 6e 20 69 6e 69 74 69 61 6c 20 61 74 74  f an initial att
17e50 65 6d 70 74 20 74 6f 20 61 63 71 75 69 72 65 20  empt to acquire 
17e60 74 68 65 20 6c 6f 63 6b 20 66 61 69 6c 73 20 62  the lock fails b
17e70 65 63 61 75 73 65 20 6f 66 20 6c 6f 63 6b 20 63  ecause of lock c
17e80 6f 6e 74 65 6e 74 69 6f 6e 0a 2a 2a 20 61 6e 64  ontention.** and
17e90 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77 61   the database wa
17ea0 73 20 70 72 65 76 69 6f 75 73 6c 79 20 75 6e 6c  s previously unl
17eb0 6f 63 6b 65 64 2c 20 74 68 65 6e 20 69 6e 76 6f  ocked, then invo
17ec0 6b 65 20 74 68 65 20 62 75 73 79 20 68 61 6e 64  ke the busy hand
17ed0 6c 65 72 0a 2a 2a 20 69 66 20 74 68 65 72 65 20  ler.** if there 
17ee0 69 73 20 6f 6e 65 2e 20 20 42 75 74 20 69 66 20  is one.  But if 
17ef0 74 68 65 72 65 20 77 61 73 20 70 72 65 76 69 6f  there was previo
17f00 75 73 6c 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b  usly a read-lock
17f10 2c 20 64 6f 20 6e 6f 74 0a 2a 2a 20 69 6e 76 6f  , do not.** invo
17f20 6b 65 20 74 68 65 20 62 75 73 79 20 68 61 6e 64  ke the busy hand
17f30 6c 65 72 20 2d 20 6a 75 73 74 20 72 65 74 75 72  ler - just retur
17f40 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 20  n SQLITE_BUSY.  
17f50 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20 0a  SQLITE_BUSY is .
17f60 2a 2a 20 72 65 74 75 72 6e 65 64 20 77 68 65 6e  ** returned when
17f70 20 74 68 65 72 65 20 69 73 20 61 6c 72 65 61 64   there is alread
17f80 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 69 6e  y a read-lock in
17f90 20 6f 72 64 65 72 20 74 6f 20 61 76 6f 69 64 20   order to avoid 
17fa0 61 20 64 65 61 64 6c 6f 63 6b 2e 0a 2a 2a 0a 2a  a deadlock..**.*
17fb0 2a 20 53 75 70 70 6f 73 65 20 74 68 65 72 65 20  * Suppose there 
17fc0 61 72 65 20 74 77 6f 20 70 72 6f 63 65 73 73 65  are two processe
17fd0 73 20 41 20 61 6e 64 20 42 2e 20 20 41 20 68 61  s A and B.  A ha
17fe0 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 61 6e  s a read lock an
17ff0 64 20 42 20 68 61 73 0a 2a 2a 20 61 20 72 65 73  d B has.** a res
18000 65 72 76 65 64 20 6c 6f 63 6b 2e 20 20 42 20 74  erved lock.  B t
18010 72 69 65 73 20 74 6f 20 70 72 6f 6d 6f 74 65 20  ries to promote 
18020 74 6f 20 65 78 63 6c 75 73 69 76 65 20 62 75 74  to exclusive but
18030 20 69 73 20 62 6c 6f 63 6b 65 64 20 62 65 63 61   is blocked beca
18040 75 73 65 0a 2a 2a 20 6f 66 20 41 27 73 20 72 65  use.** of A's re
18050 61 64 20 6c 6f 63 6b 2e 20 20 41 20 74 72 69 65  ad lock.  A trie
18060 73 20 74 6f 20 70 72 6f 6d 6f 74 65 20 74 6f 20  s to promote to 
18070 72 65 73 65 72 76 65 64 20 62 75 74 20 69 73 20  reserved but is 
18080 62 6c 6f 63 6b 65 64 20 62 79 20 42 2e 0a 2a 2a  blocked by B..**
18090 20 4f 6e 65 20 6f 72 20 74 68 65 20 6f 74 68 65   One or the othe
180a0 72 20 6f 66 20 74 68 65 20 74 77 6f 20 70 72 6f  r of the two pro
180b0 63 65 73 73 65 73 20 6d 75 73 74 20 67 69 76 65  cesses must give
180c0 20 77 61 79 20 6f 72 20 74 68 65 72 65 20 63 61   way or there ca
180d0 6e 20 62 65 0a 2a 2a 20 6e 6f 20 70 72 6f 67 72  n be.** no progr
180e0 65 73 73 2e 20 20 42 79 20 72 65 74 75 72 6e 69  ess.  By returni
180f0 6e 67 20 53 51 4c 49 54 45 5f 42 55 53 59 20 61  ng SQLITE_BUSY a
18100 6e 64 20 6e 6f 74 20 69 6e 76 6f 6b 69 6e 67 20  nd not invoking 
18110 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63  the busy callbac
18120 6b 0a 2a 2a 20 77 68 65 6e 20 41 20 61 6c 72 65  k.** when A alre
18130 61 64 79 20 68 61 73 20 61 20 72 65 61 64 20 6c  ady has a read l
18140 6f 63 6b 2c 20 77 65 20 65 6e 63 6f 75 72 61 67  ock, we encourag
18150 65 20 41 20 74 6f 20 67 69 76 65 20 75 70 20 61  e A to give up a
18160 6e 64 20 6c 65 74 20 42 0a 2a 2a 20 70 72 6f 63  nd let B.** proc
18170 65 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  eed..*/.int sqli
18180 74 65 33 42 74 72 65 65 42 65 67 69 6e 54 72 61  te3BtreeBeginTra
18190 6e 73 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  ns(Btree *p, int
181a0 20 77 72 66 6c 61 67 29 7b 0a 20 20 73 71 6c 69   wrflag){.  sqli
181b0 74 65 33 20 2a 70 42 6c 6f 63 6b 20 3d 20 30 3b  te3 *pBlock = 0;
181c0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
181d0 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74   = p->pBt;.  int
181e0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
181f0 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ..  sqlite3Btree
18200 45 6e 74 65 72 28 70 29 3b 0a 20 20 62 74 72 65  Enter(p);.  btre
18210 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 0a  eIntegrity(p);..
18220 20 20 2f 2a 20 49 66 20 74 68 65 20 62 74 72 65    /* If the btre
18230 65 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20  e is already in 
18240 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  a write-transact
18250 69 6f 6e 2c 20 6f 72 20 69 74 0a 20 20 2a 2a 20  ion, or it.  ** 
18260 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 61 20  is already in a 
18270 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e  read-transaction
18280 20 61 6e 64 20 61 20 72 65 61 64 2d 74 72 61 6e   and a read-tran
18290 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20  saction.  ** is 
182a0 72 65 71 75 65 73 74 65 64 2c 20 74 68 69 73 20  requested, this 
182b0 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f  is a no-op..  */
182c0 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e  .  if( p->inTran
182d0 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 7c  s==TRANS_WRITE |
182e0 7c 20 28 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  | (p->inTrans==T
182f0 52 41 4e 53 5f 52 45 41 44 20 26 26 20 21 77 72  RANS_READ && !wr
18300 66 6c 61 67 29 20 29 7b 0a 20 20 20 20 67 6f 74  flag) ){.    got
18310 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20  o trans_begun;. 
18320 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 42 74   }.  assert( pBt
18330 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d  ->inTransaction=
18340 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 7c 7c 20  =TRANS_WRITE || 
18350 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70 42 74 2d  IfNotOmitAV(pBt-
18360 3e 62 44 6f 54 72 75 6e 63 61 74 65 29 3d 3d 30  >bDoTruncate)==0
18370 20 29 3b 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20   );..  /* Write 
18380 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 72 65  transactions are
18390 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 6f 6e   not possible on
183a0 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61 74   a read-only dat
183b0 61 62 61 73 65 20 2a 2f 0a 20 20 69 66 28 20 28  abase */.  if( (
183c0 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20  pBt->btsFlags & 
183d0 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 29 21 3d  BTS_READ_ONLY)!=
183e0 30 20 26 26 20 77 72 66 6c 61 67 20 29 7b 0a 20  0 && wrflag ){. 
183f0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52     rc = SQLITE_R
18400 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 67 6f 74  EADONLY;.    got
18410 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20  o trans_begun;. 
18420 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   }..#ifndef SQLI
18430 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
18440 41 43 48 45 0a 20 20 2f 2a 20 49 66 20 61 6e 6f  ACHE.  /* If ano
18450 74 68 65 72 20 64 61 74 61 62 61 73 65 20 68 61  ther database ha
18460 6e 64 6c 65 20 68 61 73 20 61 6c 72 65 61 64 79  ndle has already
18470 20 6f 70 65 6e 65 64 20 61 20 77 72 69 74 65 20   opened a write 
18480 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 20 20 2a  transaction .  *
18490 2a 20 6f 6e 20 74 68 69 73 20 73 68 61 72 65 64  * on this shared
184a0 2d 62 74 72 65 65 20 73 74 72 75 63 74 75 72 65  -btree structure
184b0 20 61 6e 64 20 61 20 73 65 63 6f 6e 64 20 77 72   and a second wr
184c0 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite transaction 
184d0 69 73 0a 20 20 2a 2a 20 72 65 71 75 65 73 74 65  is.  ** requeste
184e0 64 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  d, return SQLITE
184f0 5f 4c 4f 43 4b 45 44 2e 0a 20 20 2a 2f 0a 20 20  _LOCKED..  */.  
18500 69 66 28 20 28 77 72 66 6c 61 67 20 26 26 20 70  if( (wrflag && p
18510 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
18520 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 29 0a  n==TRANS_WRITE).
18530 20 20 20 7c 7c 20 28 70 42 74 2d 3e 62 74 73 46     || (pBt->btsF
18540 6c 61 67 73 20 26 20 42 54 53 5f 50 45 4e 44 49  lags & BTS_PENDI
18550 4e 47 29 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20  NG)!=0.  ){.    
18560 70 42 6c 6f 63 6b 20 3d 20 70 42 74 2d 3e 70 57  pBlock = pBt->pW
18570 72 69 74 65 72 2d 3e 64 62 3b 0a 20 20 7d 65 6c  riter->db;.  }el
18580 73 65 20 69 66 28 20 77 72 66 6c 61 67 3e 31 20  se if( wrflag>1 
18590 29 7b 0a 20 20 20 20 42 74 4c 6f 63 6b 20 2a 70  ){.    BtLock *p
185a0 49 74 65 72 3b 0a 20 20 20 20 66 6f 72 28 70 49  Iter;.    for(pI
185b0 74 65 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20  ter=pBt->pLock; 
185c0 70 49 74 65 72 3b 20 70 49 74 65 72 3d 70 49 74  pIter; pIter=pIt
185d0 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  er->pNext){.    
185e0 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70 42 74    if( pIter->pBt
185f0 72 65 65 21 3d 70 20 29 7b 0a 20 20 20 20 20 20  ree!=p ){.      
18600 20 20 70 42 6c 6f 63 6b 20 3d 20 70 49 74 65 72    pBlock = pIter
18610 2d 3e 70 42 74 72 65 65 2d 3e 64 62 3b 0a 20 20  ->pBtree->db;.  
18620 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
18630 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
18640 20 69 66 28 20 70 42 6c 6f 63 6b 20 29 7b 0a 20   if( pBlock ){. 
18650 20 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63     sqlite3Connec
18660 74 69 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64  tionBlocked(p->d
18670 62 2c 20 70 42 6c 6f 63 6b 29 3b 0a 20 20 20 20  b, pBlock);.    
18680 72 63 20 3d 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  rc = SQLITE_LOCK
18690 45 44 5f 53 48 41 52 45 44 43 41 43 48 45 3b 0a  ED_SHAREDCACHE;.
186a0 20 20 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62      goto trans_b
186b0 65 67 75 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  egun;.  }.#endif
186c0 0a 0a 20 20 2f 2a 20 41 6e 79 20 72 65 61 64 2d  ..  /* Any read-
186d0 6f 6e 6c 79 20 6f 72 20 72 65 61 64 2d 77 72 69  only or read-wri
186e0 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  te transaction i
186f0 6d 70 6c 69 65 73 20 61 20 72 65 61 64 2d 6c 6f  mplies a read-lo
18700 63 6b 20 6f 6e 20 0a 20 20 2a 2a 20 70 61 67 65  ck on .  ** page
18710 20 31 2e 20 53 6f 20 69 66 20 73 6f 6d 65 20 6f   1. So if some o
18720 74 68 65 72 20 73 68 61 72 65 64 2d 63 61 63 68  ther shared-cach
18730 65 20 63 6c 69 65 6e 74 20 61 6c 72 65 61 64 79  e client already
18740 20 68 61 73 20 61 20 77 72 69 74 65 2d 6c 6f 63   has a write-loc
18750 6b 20 0a 20 20 2a 2a 20 6f 6e 20 70 61 67 65 20  k .  ** on page 
18760 31 2c 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  1, the transacti
18770 6f 6e 20 63 61 6e 6e 6f 74 20 62 65 20 6f 70 65  on cannot be ope
18780 6e 65 64 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 71  ned. */.  rc = q
18790 75 65 72 79 53 68 61 72 65 64 43 61 63 68 65 54  uerySharedCacheT
187a0 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 4d 41 53 54  ableLock(p, MAST
187b0 45 52 5f 52 4f 4f 54 2c 20 52 45 41 44 5f 4c 4f  ER_ROOT, READ_LO
187c0 43 4b 29 3b 0a 20 20 69 66 28 20 53 51 4c 49 54  CK);.  if( SQLIT
187d0 45 5f 4f 4b 21 3d 72 63 20 29 20 67 6f 74 6f 20  E_OK!=rc ) goto 
187e0 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 0a 20 20  trans_begun;..  
187f0 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d  pBt->btsFlags &=
18800 20 7e 42 54 53 5f 49 4e 49 54 49 41 4c 4c 59 5f   ~BTS_INITIALLY_
18810 45 4d 50 54 59 3b 0a 20 20 69 66 28 20 70 42 74  EMPTY;.  if( pBt
18820 2d 3e 6e 50 61 67 65 3d 3d 30 20 29 20 70 42 74  ->nPage==0 ) pBt
18830 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54  ->btsFlags |= BT
18840 53 5f 49 4e 49 54 49 41 4c 4c 59 5f 45 4d 50 54  S_INITIALLY_EMPT
18850 59 3b 0a 20 20 64 6f 20 7b 0a 20 20 20 20 2f 2a  Y;.  do {.    /*
18860 20 43 61 6c 6c 20 6c 6f 63 6b 42 74 72 65 65 28   Call lockBtree(
18870 29 20 75 6e 74 69 6c 20 65 69 74 68 65 72 20 70  ) until either p
18880 42 74 2d 3e 70 50 61 67 65 31 20 69 73 20 70 6f  Bt->pPage1 is po
18890 70 75 6c 61 74 65 64 20 6f 72 0a 20 20 20 20 2a  pulated or.    *
188a0 2a 20 6c 6f 63 6b 42 74 72 65 65 28 29 20 72 65  * lockBtree() re
188b0 74 75 72 6e 73 20 73 6f 6d 65 74 68 69 6e 67 20  turns something 
188c0 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54  other than SQLIT
188d0 45 5f 4f 4b 2e 20 6c 6f 63 6b 42 74 72 65 65 28  E_OK. lockBtree(
188e0 29 0a 20 20 20 20 2a 2a 20 6d 61 79 20 72 65 74  ).    ** may ret
188f0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 62 75  urn SQLITE_OK bu
18900 74 20 6c 65 61 76 65 20 70 42 74 2d 3e 70 50 61  t leave pBt->pPa
18910 67 65 31 20 73 65 74 20 74 6f 20 30 20 69 66 20  ge1 set to 0 if 
18920 61 66 74 65 72 0a 20 20 20 20 2a 2a 20 72 65 61  after.    ** rea
18930 64 69 6e 67 20 70 61 67 65 20 31 20 69 74 20 64  ding page 1 it d
18940 69 73 63 6f 76 65 72 73 20 74 68 61 74 20 74 68  iscovers that th
18950 65 20 70 61 67 65 2d 73 69 7a 65 20 6f 66 20 74  e page-size of t
18960 68 65 20 64 61 74 61 62 61 73 65 20 0a 20 20 20  he database .   
18970 20 2a 2a 20 66 69 6c 65 20 69 73 20 6e 6f 74 20   ** file is not 
18980 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2e 20 49  pBt->pageSize. I
18990 6e 20 74 68 69 73 20 63 61 73 65 20 6c 6f 63 6b  n this case lock
189a0 42 74 72 65 65 28 29 20 77 69 6c 6c 20 75 70 64  Btree() will upd
189b0 61 74 65 0a 20 20 20 20 2a 2a 20 70 42 74 2d 3e  ate.    ** pBt->
189c0 70 61 67 65 53 69 7a 65 20 74 6f 20 74 68 65 20  pageSize to the 
189d0 70 61 67 65 2d 73 69 7a 65 20 6f 66 20 74 68 65  page-size of the
189e0 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 0a 20   file on disk.. 
189f0 20 20 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65 28     */.    while(
18a00 20 70 42 74 2d 3e 70 50 61 67 65 31 3d 3d 30 20   pBt->pPage1==0 
18a10 26 26 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72  && SQLITE_OK==(r
18a20 63 20 3d 20 6c 6f 63 6b 42 74 72 65 65 28 70 42  c = lockBtree(pB
18a30 74 29 29 20 29 3b 0a 0a 20 20 20 20 69 66 28 20  t)) );..    if( 
18a40 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
18a50 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 20   wrflag ){.     
18a60 20 69 66 28 20 28 70 42 74 2d 3e 62 74 73 46 6c   if( (pBt->btsFl
18a70 61 67 73 20 26 20 42 54 53 5f 52 45 41 44 5f 4f  ags & BTS_READ_O
18a80 4e 4c 59 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  NLY)!=0 ){.     
18a90 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52     rc = SQLITE_R
18aa0 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 7d  EADONLY;.      }
18ab0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63  else{.        rc
18ac0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 42   = sqlite3PagerB
18ad0 65 67 69 6e 28 70 42 74 2d 3e 70 50 61 67 65 72  egin(pBt->pPager
18ae0 2c 77 72 66 6c 61 67 3e 31 2c 73 71 6c 69 74 65  ,wrflag>1,sqlite
18af0 33 54 65 6d 70 49 6e 4d 65 6d 6f 72 79 28 70 2d  3TempInMemory(p-
18b00 3e 64 62 29 29 3b 0a 20 20 20 20 20 20 20 20 69  >db));.        i
18b10 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
18b20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
18b30 20 3d 20 6e 65 77 44 61 74 61 62 61 73 65 28 70   = newDatabase(p
18b40 42 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  Bt);.        }. 
18b50 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a       }.    }.  .
18b60 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
18b70 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 75  TE_OK ){.      u
18b80 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73  nlockBtreeIfUnus
18b90 65 64 28 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20  ed(pBt);.    }. 
18ba0 20 7d 77 68 69 6c 65 28 20 28 72 63 26 30 78 46   }while( (rc&0xF
18bb0 46 29 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20  F)==SQLITE_BUSY 
18bc0 26 26 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  && pBt->inTransa
18bd0 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 4e 4f 4e  ction==TRANS_NON
18be0 45 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 62  E &&.          b
18bf0 74 72 65 65 49 6e 76 6f 6b 65 42 75 73 79 48 61  treeInvokeBusyHa
18c00 6e 64 6c 65 72 28 70 42 74 29 20 29 3b 0a 0a 20  ndler(pBt) );.. 
18c10 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
18c20 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d  OK ){.    if( p-
18c30 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
18c40 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 70 42  NONE ){.      pB
18c50 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2b  t->nTransaction+
18c60 2b 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  +;.#ifndef SQLIT
18c70 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
18c80 43 48 45 0a 20 20 20 20 20 20 69 66 28 20 70 2d  CHE.      if( p-
18c90 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20  >sharable ){.   
18ca0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
18cb0 6c 6f 63 6b 2e 70 42 74 72 65 65 3d 3d 70 20 26  lock.pBtree==p &
18cc0 26 20 70 2d 3e 6c 6f 63 6b 2e 69 54 61 62 6c 65  & p->lock.iTable
18cd0 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 70  ==1 );.        p
18ce0 2d 3e 6c 6f 63 6b 2e 65 4c 6f 63 6b 20 3d 20 52  ->lock.eLock = R
18cf0 45 41 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20  EAD_LOCK;.      
18d00 20 20 70 2d 3e 6c 6f 63 6b 2e 70 4e 65 78 74 20    p->lock.pNext 
18d10 3d 20 70 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 20 20  = pBt->pLock;.  
18d20 20 20 20 20 20 20 70 42 74 2d 3e 70 4c 6f 63 6b        pBt->pLock
18d30 20 3d 20 26 70 2d 3e 6c 6f 63 6b 3b 0a 20 20 20   = &p->lock;.   
18d40 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
18d50 7d 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e 73  }.    p->inTrans
18d60 20 3d 20 28 77 72 66 6c 61 67 3f 54 52 41 4e 53   = (wrflag?TRANS
18d70 5f 57 52 49 54 45 3a 54 52 41 4e 53 5f 52 45 41  _WRITE:TRANS_REA
18d80 44 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69  D);.    if( p->i
18d90 6e 54 72 61 6e 73 3e 70 42 74 2d 3e 69 6e 54 72  nTrans>pBt->inTr
18da0 61 6e 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20  ansaction ){.   
18db0 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61     pBt->inTransa
18dc0 63 74 69 6f 6e 20 3d 20 70 2d 3e 69 6e 54 72 61  ction = p->inTra
18dd0 6e 73 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ns;.    }.    if
18de0 28 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20  ( wrflag ){.    
18df0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
18e00 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b  1 = pBt->pPage1;
18e10 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
18e20 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
18e30 45 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  E.      assert( 
18e40 21 70 42 74 2d 3e 70 57 72 69 74 65 72 20 29 3b  !pBt->pWriter );
18e50 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 57 72 69  .      pBt->pWri
18e60 74 65 72 20 3d 20 70 3b 0a 20 20 20 20 20 20 70  ter = p;.      p
18e70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d 20  Bt->btsFlags &= 
18e80 7e 42 54 53 5f 45 58 43 4c 55 53 49 56 45 3b 0a  ~BTS_EXCLUSIVE;.
18e90 20 20 20 20 20 20 69 66 28 20 77 72 66 6c 61 67        if( wrflag
18ea0 3e 31 20 29 20 70 42 74 2d 3e 62 74 73 46 6c 61  >1 ) pBt->btsFla
18eb0 67 73 20 7c 3d 20 42 54 53 5f 45 58 43 4c 55 53  gs |= BTS_EXCLUS
18ec0 49 56 45 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20  IVE;.#endif..   
18ed0 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64 62 2d     /* If the db-
18ee0 73 69 7a 65 20 68 65 61 64 65 72 20 66 69 65 6c  size header fiel
18ef0 64 20 69 73 20 69 6e 63 6f 72 72 65 63 74 20 28  d is incorrect (
18f00 61 73 20 69 74 20 6d 61 79 20 62 65 20 69 66 20  as it may be if 
18f10 61 6e 20 6f 6c 64 0a 20 20 20 20 20 20 2a 2a 20  an old.      ** 
18f20 63 6c 69 65 6e 74 20 68 61 73 20 62 65 65 6e 20  client has been 
18f30 77 72 69 74 69 6e 67 20 74 68 65 20 64 61 74 61  writing the data
18f40 62 61 73 65 20 66 69 6c 65 29 2c 20 75 70 64 61  base file), upda
18f50 74 65 20 69 74 20 6e 6f 77 2e 20 44 6f 69 6e 67  te it now. Doing
18f60 0a 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 73  .      ** this s
18f70 6f 6f 6e 65 72 20 72 61 74 68 65 72 20 74 68 61  ooner rather tha
18f80 6e 20 6c 61 74 65 72 20 6d 65 61 6e 73 20 74 68  n later means th
18f90 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20  e database size 
18fa0 63 61 6e 20 73 61 66 65 6c 79 20 0a 20 20 20 20  can safely .    
18fb0 20 20 2a 2a 20 72 65 2d 72 65 61 64 20 74 68 65    ** re-read the
18fc0 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 66   database size f
18fd0 72 6f 6d 20 70 61 67 65 20 31 20 69 66 20 61 20  rom page 1 if a 
18fe0 73 61 76 65 70 6f 69 6e 74 20 6f 72 20 74 72 61  savepoint or tra
18ff0 6e 73 61 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a  nsaction.      *
19000 2a 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72  * rollback occur
19010 73 20 77 69 74 68 69 6e 20 74 68 65 20 74 72 61  s within the tra
19020 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20  nsaction..      
19030 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 42 74  */.      if( pBt
19040 2d 3e 6e 50 61 67 65 21 3d 67 65 74 34 62 79 74  ->nPage!=get4byt
19050 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  e(&pPage1->aData
19060 5b 32 38 5d 29 20 29 7b 0a 20 20 20 20 20 20 20  [28]) ){.       
19070 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
19080 65 72 57 72 69 74 65 28 70 50 61 67 65 31 2d 3e  erWrite(pPage1->
19090 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
190a0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
190b0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
190c0 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65   put4byte(&pPage
190d0 31 2d 3e 61 44 61 74 61 5b 32 38 5d 2c 20 70 42  1->aData[28], pB
190e0 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20 20  t->nPage);.     
190f0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
19100 20 7d 0a 20 20 7d 0a 0a 0a 74 72 61 6e 73 5f 62   }.  }...trans_b
19110 65 67 75 6e 3a 0a 20 20 69 66 28 20 72 63 3d 3d  egun:.  if( rc==
19120 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 77 72 66  SQLITE_OK && wrf
19130 6c 61 67 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  lag ){.    /* Th
19140 69 73 20 63 61 6c 6c 20 6d 61 6b 65 73 20 73 75  is call makes su
19150 72 65 20 74 68 61 74 20 74 68 65 20 70 61 67 65  re that the page
19160 72 20 68 61 73 20 74 68 65 20 63 6f 72 72 65 63  r has the correc
19170 74 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 20 20  t number of.    
19180 2a 2a 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e  ** open savepoin
19190 74 73 2e 20 49 66 20 74 68 65 20 73 65 63 6f 6e  ts. If the secon
191a0 64 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 67  d parameter is g
191b0 72 65 61 74 65 72 20 74 68 61 6e 20 30 20 61 6e  reater than 0 an
191c0 64 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 75 62  d.    ** the sub
191d0 2d 6a 6f 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20  -journal is not 
191e0 61 6c 72 65 61 64 79 20 6f 70 65 6e 2c 20 74 68  already open, th
191f0 65 6e 20 69 74 20 77 69 6c 6c 20 62 65 20 6f 70  en it will be op
19200 65 6e 65 64 20 68 65 72 65 2e 0a 20 20 20 20 2a  ened here..    *
19210 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  /.    rc = sqlit
19220 65 33 50 61 67 65 72 4f 70 65 6e 53 61 76 65 70  e3PagerOpenSavep
19230 6f 69 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72  oint(pBt->pPager
19240 2c 20 70 2d 3e 64 62 2d 3e 6e 53 61 76 65 70 6f  , p->db->nSavepo
19250 69 6e 74 29 3b 0a 20 20 7d 0a 0a 20 20 62 74 72  int);.  }..  btr
19260 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a  eeIntegrity(p);.
19270 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
19280 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
19290 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20   rc;.}..#ifndef 
192a0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
192b0 56 41 43 55 55 4d 0a 0a 2f 2a 0a 2a 2a 20 53 65  VACUUM../*.** Se
192c0 74 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61  t the pointer-ma
192d0 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20 61 6c  p entries for al
192e0 6c 20 63 68 69 6c 64 72 65 6e 20 6f 66 20 70 61  l children of pa
192f0 67 65 20 70 50 61 67 65 2e 20 41 6c 73 6f 2c 20  ge pPage. Also, 
19300 69 66 0a 2a 2a 20 70 50 61 67 65 20 63 6f 6e 74  if.** pPage cont
19310 61 69 6e 73 20 63 65 6c 6c 73 20 74 68 61 74 20  ains cells that 
19320 70 6f 69 6e 74 20 74 6f 20 6f 76 65 72 66 6c 6f  point to overflo
19330 77 20 70 61 67 65 73 2c 20 73 65 74 20 74 68 65  w pages, set the
19340 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 6d 61 70 20   pointer.** map 
19350 65 6e 74 72 69 65 73 20 66 6f 72 20 74 68 65 20  entries for the 
19360 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61  overflow pages a
19370 73 20 77 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69  s well..*/.stati
19380 63 20 69 6e 74 20 73 65 74 43 68 69 6c 64 50 74  c int setChildPt
19390 72 6d 61 70 73 28 4d 65 6d 50 61 67 65 20 2a 70  rmaps(MemPage *p
193a0 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 69 3b 20  Page){.  int i; 
193b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
193c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
193d0 6f 75 6e 74 65 72 20 76 61 72 69 61 62 6c 65 20  ounter variable 
193e0 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20  */.  int nCell; 
193f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19400 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
19410 72 20 6f 66 20 63 65 6c 6c 73 20 69 6e 20 70 61  r of cells in pa
19420 67 65 20 70 50 61 67 65 20 2a 2f 0a 20 20 69 6e  ge pPage */.  in
19430 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
19440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19450 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
19460 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  */.  BtShared *p
19470 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b  Bt = pPage->pBt;
19480 0a 20 20 75 38 20 69 73 49 6e 69 74 4f 72 69 67  .  u8 isInitOrig
19490 20 3d 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74   = pPage->isInit
194a0 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20  ;.  Pgno pgno = 
194b0 70 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a 0a 20 20  pPage->pgno;..  
194c0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
194d0 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
194e0 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
194f0 0a 20 20 72 63 20 3d 20 62 74 72 65 65 49 6e 69  .  rc = btreeIni
19500 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  tPage(pPage);.  
19510 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
19520 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73 65  K ){.    goto se
19530 74 5f 63 68 69 6c 64 5f 70 74 72 6d 61 70 73 5f  t_child_ptrmaps_
19540 6f 75 74 3b 0a 20 20 7d 0a 20 20 6e 43 65 6c 6c  out;.  }.  nCell
19550 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b   = pPage->nCell;
19560 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  ..  for(i=0; i<n
19570 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Cell; i++){.    
19580 75 38 20 2a 70 43 65 6c 6c 20 3d 20 66 69 6e 64  u8 *pCell = find
19590 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a  Cell(pPage, i);.
195a0 0a 20 20 20 20 70 74 72 6d 61 70 50 75 74 4f 76  .    ptrmapPutOv
195b0 66 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65  flPtr(pPage, pCe
195c0 6c 6c 2c 20 26 72 63 29 3b 0a 0a 20 20 20 20 69  ll, &rc);..    i
195d0 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  f( !pPage->leaf 
195e0 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 63 68  ){.      Pgno ch
195f0 69 6c 64 50 67 6e 6f 20 3d 20 67 65 74 34 62 79  ildPgno = get4by
19600 74 65 28 70 43 65 6c 6c 29 3b 0a 20 20 20 20 20  te(pCell);.     
19610 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20   ptrmapPut(pBt, 
19620 63 68 69 6c 64 50 67 6e 6f 2c 20 50 54 52 4d 41  childPgno, PTRMA
19630 50 5f 42 54 52 45 45 2c 20 70 67 6e 6f 2c 20 26  P_BTREE, pgno, &
19640 72 63 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  rc);.    }.  }..
19650 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
19660 61 66 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 63  af ){.    Pgno c
19670 68 69 6c 64 50 67 6e 6f 20 3d 20 67 65 74 34 62  hildPgno = get4b
19680 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74  yte(&pPage->aDat
19690 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
196a0 65 74 2b 38 5d 29 3b 0a 20 20 20 20 70 74 72 6d  et+8]);.    ptrm
196b0 61 70 50 75 74 28 70 42 74 2c 20 63 68 69 6c 64  apPut(pBt, child
196c0 50 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52  Pgno, PTRMAP_BTR
196d0 45 45 2c 20 70 67 6e 6f 2c 20 26 72 63 29 3b 0a  EE, pgno, &rc);.
196e0 20 20 7d 0a 0a 73 65 74 5f 63 68 69 6c 64 5f 70    }..set_child_p
196f0 74 72 6d 61 70 73 5f 6f 75 74 3a 0a 20 20 70 50  trmaps_out:.  pP
19700 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 69 73  age->isInit = is
19710 49 6e 69 74 4f 72 69 67 3b 0a 20 20 72 65 74 75  InitOrig;.  retu
19720 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
19730 53 6f 6d 65 77 68 65 72 65 20 6f 6e 20 70 50 61  Somewhere on pPa
19740 67 65 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  ge is a pointer 
19750 74 6f 20 70 61 67 65 20 69 46 72 6f 6d 2e 20 20  to page iFrom.  
19760 4d 6f 64 69 66 79 20 74 68 69 73 20 70 6f 69 6e  Modify this poin
19770 74 65 72 20 73 6f 0a 2a 2a 20 74 68 61 74 20 69  ter so.** that i
19780 74 20 70 6f 69 6e 74 73 20 74 6f 20 69 54 6f 2e  t points to iTo.
19790 20 50 61 72 61 6d 65 74 65 72 20 65 54 79 70 65   Parameter eType
197a0 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20 74   describes the t
197b0 79 70 65 20 6f 66 20 70 6f 69 6e 74 65 72 20 74  ype of pointer t
197c0 6f 0a 2a 2a 20 62 65 20 6d 6f 64 69 66 69 65 64  o.** be modified
197d0 2c 20 61 73 20 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  , as  follows:.*
197e0 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 42 54 52 45  *.** PTRMAP_BTRE
197f0 45 3a 20 20 20 20 20 70 50 61 67 65 20 69 73 20  E:     pPage is 
19800 61 20 62 74 72 65 65 2d 70 61 67 65 2e 20 54 68  a btree-page. Th
19810 65 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73  e pointer points
19820 20 61 74 20 61 20 63 68 69 6c 64 20 0a 2a 2a 20   at a child .** 
19830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19840 20 20 70 61 67 65 20 6f 66 20 70 50 61 67 65 2e    page of pPage.
19850 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f 56  .**.** PTRMAP_OV
19860 45 52 46 4c 4f 57 31 3a 20 70 50 61 67 65 20 69  ERFLOW1: pPage i
19870 73 20 61 20 62 74 72 65 65 2d 70 61 67 65 2e 20  s a btree-page. 
19880 54 68 65 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e  The pointer poin
19890 74 73 20 61 74 20 61 6e 20 6f 76 65 72 66 6c 6f  ts at an overflo
198a0 77 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  w.**            
198b0 20 20 20 20 20 20 20 70 61 67 65 20 70 6f 69 6e         page poin
198c0 74 65 64 20 74 6f 20 62 79 20 6f 6e 65 20 6f 66  ted to by one of
198d0 20 74 68 65 20 63 65 6c 6c 73 20 6f 6e 20 70 50   the cells on pP
198e0 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41  age..**.** PTRMA
198f0 50 5f 4f 56 45 52 46 4c 4f 57 32 3a 20 70 50 61  P_OVERFLOW2: pPa
19900 67 65 20 69 73 20 61 6e 20 6f 76 65 72 66 6c 6f  ge is an overflo
19910 77 2d 70 61 67 65 2e 20 54 68 65 20 70 6f 69 6e  w-page. The poin
19920 74 65 72 20 70 6f 69 6e 74 73 20 61 74 20 74 68  ter points at th
19930 65 20 6e 65 78 74 0a 2a 2a 20 20 20 20 20 20 20  e next.**       
19940 20 20 20 20 20 20 20 20 20 20 20 20 6f 76 65 72              over
19950 66 6c 6f 77 20 70 61 67 65 20 69 6e 20 74 68 65  flow page in the
19960 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63   list..*/.static
19970 20 69 6e 74 20 6d 6f 64 69 66 79 50 61 67 65 50   int modifyPageP
19980 6f 69 6e 74 65 72 28 4d 65 6d 50 61 67 65 20 2a  ointer(MemPage *
19990 70 50 61 67 65 2c 20 50 67 6e 6f 20 69 46 72 6f  pPage, Pgno iFro
199a0 6d 2c 20 50 67 6e 6f 20 69 54 6f 2c 20 75 38 20  m, Pgno iTo, u8 
199b0 65 54 79 70 65 29 7b 0a 20 20 61 73 73 65 72 74  eType){.  assert
199c0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
199d0 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
199e0 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
199f0 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
19a00 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
19a10 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
19a20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52    if( eType==PTR
19a30 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20 29 7b  MAP_OVERFLOW2 ){
19a40 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e  .    /* The poin
19a50 74 65 72 20 69 73 20 61 6c 77 61 79 73 20 74 68  ter is always th
19a60 65 20 66 69 72 73 74 20 34 20 62 79 74 65 73 20  e first 4 bytes 
19a70 6f 66 20 74 68 65 20 70 61 67 65 20 69 6e 20 74  of the page in t
19a80 68 69 73 20 63 61 73 65 2e 20 20 2a 2f 0a 20 20  his case.  */.  
19a90 20 20 69 66 28 20 67 65 74 34 62 79 74 65 28 70    if( get4byte(p
19aa0 50 61 67 65 2d 3e 61 44 61 74 61 29 21 3d 69 46  Page->aData)!=iF
19ab0 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 72 65 74  rom ){.      ret
19ac0 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
19ad0 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20  PT_BKPT;.    }. 
19ae0 20 20 20 70 75 74 34 62 79 74 65 28 70 50 61 67     put4byte(pPag
19af0 65 2d 3e 61 44 61 74 61 2c 20 69 54 6f 29 3b 0a  e->aData, iTo);.
19b00 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 75 38 20    }else{.    u8 
19b10 69 73 49 6e 69 74 4f 72 69 67 20 3d 20 70 50 61  isInitOrig = pPa
19b20 67 65 2d 3e 69 73 49 6e 69 74 3b 0a 20 20 20 20  ge->isInit;.    
19b30 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74 20 6e  int i;.    int n
19b40 43 65 6c 6c 3b 0a 20 20 20 20 69 6e 74 20 72 63  Cell;.    int rc
19b50 3b 0a 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65  ;..    rc = btre
19b60 65 49 6e 69 74 50 61 67 65 28 70 50 61 67 65 29  eInitPage(pPage)
19b70 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  ;.    if( rc ) r
19b80 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 6e 43  eturn rc;.    nC
19b90 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65  ell = pPage->nCe
19ba0 6c 6c 3b 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30  ll;..    for(i=0
19bb0 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b  ; i<nCell; i++){
19bc0 0a 20 20 20 20 20 20 75 38 20 2a 70 43 65 6c 6c  .      u8 *pCell
19bd0 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67   = findCell(pPag
19be0 65 2c 20 69 29 3b 0a 20 20 20 20 20 20 69 66 28  e, i);.      if(
19bf0 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f   eType==PTRMAP_O
19c00 56 45 52 46 4c 4f 57 31 20 29 7b 0a 20 20 20 20  VERFLOW1 ){.    
19c10 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66      CellInfo inf
19c20 6f 3b 0a 20 20 20 20 20 20 20 20 62 74 72 65 65  o;.        btree
19c30 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61  ParseCellPtr(pPa
19c40 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f  ge, pCell, &info
19c50 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  );.        if( i
19c60 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 0a 20 20  nfo.iOverflow.  
19c70 20 20 20 20 20 20 20 26 26 20 70 43 65 6c 6c 2b         && pCell+
19c80 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 2b 33  info.iOverflow+3
19c90 3c 3d 70 50 61 67 65 2d 3e 61 44 61 74 61 2b 70  <=pPage->aData+p
19ca0 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65 0a 20  Page->maskPage. 
19cb0 20 20 20 20 20 20 20 20 26 26 20 69 46 72 6f 6d          && iFrom
19cc0 3d 3d 67 65 74 34 62 79 74 65 28 26 70 43 65 6c  ==get4byte(&pCel
19cd0 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77  l[info.iOverflow
19ce0 5d 29 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20  ]).        ){.  
19cf0 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
19d00 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76  (&pCell[info.iOv
19d10 65 72 66 6c 6f 77 5d 2c 20 69 54 6f 29 3b 0a 20  erflow], iTo);. 
19d20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
19d30 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
19d40 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69  }else{.        i
19d50 66 28 20 67 65 74 34 62 79 74 65 28 70 43 65 6c  f( get4byte(pCel
19d60 6c 29 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20  l)==iFrom ){.   
19d70 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
19d80 70 43 65 6c 6c 2c 20 69 54 6f 29 3b 0a 20 20 20  pCell, iTo);.   
19d90 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
19da0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
19db0 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28      }.  .    if(
19dc0 20 69 3d 3d 6e 43 65 6c 6c 20 29 7b 0a 20 20 20   i==nCell ){.   
19dd0 20 20 20 69 66 28 20 65 54 79 70 65 21 3d 50 54     if( eType!=PT
19de0 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20 0a 20  RMAP_BTREE || . 
19df0 20 20 20 20 20 20 20 20 20 67 65 74 34 62 79 74           get4byt
19e00 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e(&pPage->aData[
19e10 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
19e20 2b 38 5d 29 21 3d 69 46 72 6f 6d 20 29 7b 0a 20  +8])!=iFrom ){. 
19e30 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
19e40 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
19e50 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  T;.      }.     
19e60 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65   put4byte(&pPage
19e70 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68  ->aData[pPage->h
19e80 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20 69 54 6f  drOffset+8], iTo
19e90 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 50  );.    }..    pP
19ea0 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 69 73  age->isInit = is
19eb0 49 6e 69 74 4f 72 69 67 3b 0a 20 20 7d 0a 20 20  InitOrig;.  }.  
19ec0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
19ed0 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65  ;.}.../*.** Move
19ee0 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62 61   the open databa
19ef0 73 65 20 70 61 67 65 20 70 44 62 50 61 67 65 20  se page pDbPage 
19f00 74 6f 20 6c 6f 63 61 74 69 6f 6e 20 69 46 72 65  to location iFre
19f10 65 50 61 67 65 20 69 6e 20 74 68 65 20 0a 2a 2a  ePage in the .**
19f20 20 64 61 74 61 62 61 73 65 2e 20 54 68 65 20 70   database. The p
19f30 44 62 50 61 67 65 20 72 65 66 65 72 65 6e 63 65  DbPage reference
19f40 20 72 65 6d 61 69 6e 73 20 76 61 6c 69 64 2e 0a   remains valid..
19f50 2a 2a 0a 2a 2a 20 54 68 65 20 69 73 43 6f 6d 6d  **.** The isComm
19f60 69 74 20 66 6c 61 67 20 69 6e 64 69 63 61 74 65  it flag indicate
19f70 73 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20  s that there is 
19f80 6e 6f 20 6e 65 65 64 20 74 6f 20 72 65 6d 65 6d  no need to remem
19f90 62 65 72 20 74 68 61 74 0a 2a 2a 20 74 68 65 20  ber that.** the 
19fa0 6a 6f 75 72 6e 61 6c 20 6e 65 65 64 73 20 74 6f  journal needs to
19fb0 20 62 65 20 73 79 6e 63 28 29 65 64 20 62 65 66   be sync()ed bef
19fc0 6f 72 65 20 64 61 74 61 62 61 73 65 20 70 61 67  ore database pag
19fd0 65 20 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f 20  e pDbPage->pgno 
19fe0 0a 2a 2a 20 63 61 6e 20 62 65 20 77 72 69 74 74  .** can be writt
19ff0 65 6e 20 74 6f 2e 20 54 68 65 20 63 61 6c 6c 65  en to. The calle
1a000 72 20 68 61 73 20 61 6c 72 65 61 64 79 20 70 72  r has already pr
1a010 6f 6d 69 73 65 64 20 6e 6f 74 20 74 6f 20 77 72  omised not to wr
1a020 69 74 65 20 74 6f 20 74 68 61 74 0a 2a 2a 20 70  ite to that.** p
1a030 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  age..*/.static i
1a040 6e 74 20 72 65 6c 6f 63 61 74 65 50 61 67 65 28  nt relocatePage(
1a050 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
1a060 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42  ,           /* B
1a070 74 72 65 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  tree */.  MemPag
1a080 65 20 2a 70 44 62 50 61 67 65 2c 20 20 20 20 20  e *pDbPage,     
1a090 20 20 20 2f 2a 20 4f 70 65 6e 20 70 61 67 65 20     /* Open page 
1a0a0 74 6f 20 6d 6f 76 65 20 2a 2f 0a 20 20 75 38 20  to move */.  u8 
1a0b0 65 54 79 70 65 2c 20 20 20 20 20 20 20 20 20 20  eType,          
1a0c0 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
1a0d0 20 6d 61 70 20 27 74 79 70 65 27 20 65 6e 74 72   map 'type' entr
1a0e0 79 20 66 6f 72 20 70 44 62 50 61 67 65 20 2a 2f  y for pDbPage */
1a0f0 0a 20 20 50 67 6e 6f 20 69 50 74 72 50 61 67 65  .  Pgno iPtrPage
1a100 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  ,           /* P
1a110 6f 69 6e 74 65 72 20 6d 61 70 20 27 70 61 67 65  ointer map 'page
1a120 2d 6e 6f 27 20 65 6e 74 72 79 20 66 6f 72 20 70  -no' entry for p
1a130 44 62 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f  DbPage */.  Pgno
1a140 20 69 46 72 65 65 50 61 67 65 2c 20 20 20 20 20   iFreePage,     
1a150 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f 63 61       /* The loca
1a160 74 69 6f 6e 20 74 6f 20 6d 6f 76 65 20 70 44 62  tion to move pDb
1a170 50 61 67 65 20 74 6f 20 2a 2f 0a 20 20 69 6e 74  Page to */.  int
1a180 20 69 73 43 6f 6d 6d 69 74 20 20 20 20 20 20 20   isCommit       
1a190 20 20 20 20 20 20 2f 2a 20 69 73 43 6f 6d 6d 69        /* isCommi
1a1a0 74 20 66 6c 61 67 20 70 61 73 73 65 64 20 74 6f  t flag passed to
1a1b0 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 6f 76   sqlite3PagerMov
1a1c0 65 70 61 67 65 20 2a 2f 0a 29 7b 0a 20 20 4d 65  epage */.){.  Me
1a1d0 6d 50 61 67 65 20 2a 70 50 74 72 50 61 67 65 3b  mPage *pPtrPage;
1a1e0 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74     /* The page t
1a1f0 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 20 70  hat contains a p
1a200 6f 69 6e 74 65 72 20 74 6f 20 70 44 62 50 61 67  ointer to pDbPag
1a210 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 44 62 50  e */.  Pgno iDbP
1a220 61 67 65 20 3d 20 70 44 62 50 61 67 65 2d 3e 70  age = pDbPage->p
1a230 67 6e 6f 3b 0a 20 20 50 61 67 65 72 20 2a 70 50  gno;.  Pager *pP
1a240 61 67 65 72 20 3d 20 70 42 74 2d 3e 70 50 61 67  ager = pBt->pPag
1a250 65 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  er;.  int rc;.. 
1a260 20 61 73 73 65 72 74 28 20 65 54 79 70 65 3d 3d   assert( eType==
1a270 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32  PTRMAP_OVERFLOW2
1a280 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41   || eType==PTRMA
1a290 50 5f 4f 56 45 52 46 4c 4f 57 31 20 7c 7c 20 0a  P_OVERFLOW1 || .
1a2a0 20 20 20 20 20 20 65 54 79 70 65 3d 3d 50 54 52        eType==PTR
1a2b0 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20 65 54 79  MAP_BTREE || eTy
1a2c0 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50  pe==PTRMAP_ROOTP
1a2d0 41 47 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  AGE );.  assert(
1a2e0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
1a2f0 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
1a300 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 44 62  );.  assert( pDb
1a310 50 61 67 65 2d 3e 70 42 74 3d 3d 70 42 74 20 29  Page->pBt==pBt )
1a320 3b 0a 0a 20 20 2f 2a 20 4d 6f 76 65 20 70 61 67  ;..  /* Move pag
1a330 65 20 69 44 62 50 61 67 65 20 66 72 6f 6d 20 69  e iDbPage from i
1a340 74 73 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74  ts current locat
1a350 69 6f 6e 20 74 6f 20 70 61 67 65 20 6e 75 6d 62  ion to page numb
1a360 65 72 20 69 46 72 65 65 50 61 67 65 20 2a 2f 0a  er iFreePage */.
1a370 20 20 54 52 41 43 45 28 28 22 41 55 54 4f 56 41    TRACE(("AUTOVA
1a380 43 55 55 4d 3a 20 4d 6f 76 69 6e 67 20 25 64 20  CUUM: Moving %d 
1a390 74 6f 20 66 72 65 65 20 70 61 67 65 20 25 64 20  to free page %d 
1a3a0 28 70 74 72 20 70 61 67 65 20 25 64 20 74 79 70  (ptr page %d typ
1a3b0 65 20 25 64 29 5c 6e 22 2c 20 0a 20 20 20 20 20  e %d)\n", .     
1a3c0 20 69 44 62 50 61 67 65 2c 20 69 46 72 65 65 50   iDbPage, iFreeP
1a3d0 61 67 65 2c 20 69 50 74 72 50 61 67 65 2c 20 65  age, iPtrPage, e
1a3e0 54 79 70 65 29 29 3b 0a 20 20 72 63 20 3d 20 73  Type));.  rc = s
1a3f0 71 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65 70  qlite3PagerMovep
1a400 61 67 65 28 70 50 61 67 65 72 2c 20 70 44 62 50  age(pPager, pDbP
1a410 61 67 65 2d 3e 70 44 62 50 61 67 65 2c 20 69 46  age->pDbPage, iF
1a420 72 65 65 50 61 67 65 2c 20 69 73 43 6f 6d 6d 69  reePage, isCommi
1a430 74 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  t);.  if( rc!=SQ
1a440 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
1a450 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
1a460 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f 20 3d 20  pDbPage->pgno = 
1a470 69 46 72 65 65 50 61 67 65 3b 0a 0a 20 20 2f 2a  iFreePage;..  /*
1a480 20 49 66 20 70 44 62 50 61 67 65 20 77 61 73 20   If pDbPage was 
1a490 61 20 62 74 72 65 65 2d 70 61 67 65 2c 20 74 68  a btree-page, th
1a4a0 65 6e 20 69 74 20 6d 61 79 20 68 61 76 65 20 63  en it may have c
1a4b0 68 69 6c 64 20 70 61 67 65 73 20 61 6e 64 2f 6f  hild pages and/o
1a4c0 72 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 74 68 61  r cells.  ** tha
1a4d0 74 20 70 6f 69 6e 74 20 74 6f 20 6f 76 65 72 66  t point to overf
1a4e0 6c 6f 77 20 70 61 67 65 73 2e 20 54 68 65 20 70  low pages. The p
1a4f0 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 69  ointer map entri
1a500 65 73 20 66 6f 72 20 61 6c 6c 20 74 68 65 73 65  es for all these
1a510 0a 20 20 2a 2a 20 70 61 67 65 73 20 6e 65 65 64  .  ** pages need
1a520 20 74 6f 20 62 65 20 63 68 61 6e 67 65 64 2e 0a   to be changed..
1a530 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 44 62    **.  ** If pDb
1a540 50 61 67 65 20 69 73 20 61 6e 20 6f 76 65 72 66  Page is an overf
1a550 6c 6f 77 20 70 61 67 65 2c 20 74 68 65 6e 20 74  low page, then t
1a560 68 65 20 66 69 72 73 74 20 34 20 62 79 74 65 73  he first 4 bytes
1a570 20 6d 61 79 20 73 74 6f 72 65 20 61 0a 20 20 2a   may store a.  *
1a580 2a 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73  * pointer to a s
1a590 75 62 73 65 71 75 65 6e 74 20 6f 76 65 72 66 6c  ubsequent overfl
1a5a0 6f 77 20 70 61 67 65 2e 20 49 66 20 74 68 69 73  ow page. If this
1a5b0 20 69 73 20 74 68 65 20 63 61 73 65 2c 20 74 68   is the case, th
1a5c0 65 6e 0a 20 20 2a 2a 20 74 68 65 20 70 6f 69 6e  en.  ** the poin
1a5d0 74 65 72 20 6d 61 70 20 6e 65 65 64 73 20 74 6f  ter map needs to
1a5e0 20 62 65 20 75 70 64 61 74 65 64 20 66 6f 72 20   be updated for 
1a5f0 74 68 65 20 73 75 62 73 65 71 75 65 6e 74 20 6f  the subsequent o
1a600 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 0a 20 20  verflow page..  
1a610 2a 2f 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d  */.  if( eType==
1a620 50 54 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20  PTRMAP_BTREE || 
1a630 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f  eType==PTRMAP_RO
1a640 4f 54 50 41 47 45 20 29 7b 0a 20 20 20 20 72 63  OTPAGE ){.    rc
1a650 20 3d 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61   = setChildPtrma
1a660 70 73 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20  ps(pDbPage);.   
1a670 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1a680 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  OK ){.      retu
1a690 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d  rn rc;.    }.  }
1a6a0 65 6c 73 65 7b 0a 20 20 20 20 50 67 6e 6f 20 6e  else{.    Pgno n
1a6b0 65 78 74 4f 76 66 6c 20 3d 20 67 65 74 34 62 79  extOvfl = get4by
1a6c0 74 65 28 70 44 62 50 61 67 65 2d 3e 61 44 61 74  te(pDbPage->aDat
1a6d0 61 29 3b 0a 20 20 20 20 69 66 28 20 6e 65 78 74  a);.    if( next
1a6e0 4f 76 66 6c 21 3d 30 20 29 7b 0a 20 20 20 20 20  Ovfl!=0 ){.     
1a6f0 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20   ptrmapPut(pBt, 
1a700 6e 65 78 74 4f 76 66 6c 2c 20 50 54 52 4d 41 50  nextOvfl, PTRMAP
1a710 5f 4f 56 45 52 46 4c 4f 57 32 2c 20 69 46 72 65  _OVERFLOW2, iFre
1a720 65 50 61 67 65 2c 20 26 72 63 29 3b 0a 20 20 20  ePage, &rc);.   
1a730 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1a740 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1a750 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
1a760 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
1a770 2f 2a 20 46 69 78 20 74 68 65 20 64 61 74 61 62  /* Fix the datab
1a780 61 73 65 20 70 6f 69 6e 74 65 72 20 6f 6e 20 70  ase pointer on p
1a790 61 67 65 20 69 50 74 72 50 61 67 65 20 74 68 61  age iPtrPage tha
1a7a0 74 20 70 6f 69 6e 74 65 64 20 61 74 20 69 44 62  t pointed at iDb
1a7b0 50 61 67 65 20 73 6f 0a 20 20 2a 2a 20 74 68 61  Page so.  ** tha
1a7c0 74 20 69 74 20 70 6f 69 6e 74 73 20 61 74 20 69  t it points at i
1a7d0 46 72 65 65 50 61 67 65 2e 20 41 6c 73 6f 20 66  FreePage. Also f
1a7e0 69 78 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d  ix the pointer m
1a7f0 61 70 20 65 6e 74 72 79 20 66 6f 72 0a 20 20 2a  ap entry for.  *
1a800 2a 20 69 50 74 72 50 61 67 65 2e 0a 20 20 2a 2f  * iPtrPage..  */
1a810 0a 20 20 69 66 28 20 65 54 79 70 65 21 3d 50 54  .  if( eType!=PT
1a820 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b  RMAP_ROOTPAGE ){
1a830 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47  .    rc = btreeG
1a840 65 74 50 61 67 65 28 70 42 74 2c 20 69 50 74 72  etPage(pBt, iPtr
1a850 50 61 67 65 2c 20 26 70 50 74 72 50 61 67 65 2c  Page, &pPtrPage,
1a860 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21   0);.    if( rc!
1a870 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1a880 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1a890 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71     }.    rc = sq
1a8a0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
1a8b0 70 50 74 72 50 61 67 65 2d 3e 70 44 62 50 61 67  pPtrPage->pDbPag
1a8c0 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  e);.    if( rc!=
1a8d0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1a8e0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
1a8f0 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20 20 20  PtrPage);.      
1a900 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
1a910 0a 20 20 20 20 72 63 20 3d 20 6d 6f 64 69 66 79  .    rc = modify
1a920 50 61 67 65 50 6f 69 6e 74 65 72 28 70 50 74 72  PagePointer(pPtr
1a930 50 61 67 65 2c 20 69 44 62 50 61 67 65 2c 20 69  Page, iDbPage, i
1a940 46 72 65 65 50 61 67 65 2c 20 65 54 79 70 65 29  FreePage, eType)
1a950 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67  ;.    releasePag
1a960 65 28 70 50 74 72 50 61 67 65 29 3b 0a 20 20 20  e(pPtrPage);.   
1a970 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1a980 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 74 72 6d  OK ){.      ptrm
1a990 61 70 50 75 74 28 70 42 74 2c 20 69 46 72 65 65  apPut(pBt, iFree
1a9a0 50 61 67 65 2c 20 65 54 79 70 65 2c 20 69 50 74  Page, eType, iPt
1a9b0 72 50 61 67 65 2c 20 26 72 63 29 3b 0a 20 20 20  rPage, &rc);.   
1a9c0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
1a9d0 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72  rc;.}../* Forwar
1a9e0 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 72 65  d declaration re
1a9f0 71 75 69 72 65 64 20 62 79 20 69 6e 63 72 56 61  quired by incrVa
1aa00 63 75 75 6d 53 74 65 70 28 29 2e 20 2a 2f 0a 73  cuumStep(). */.s
1aa10 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61  tatic int alloca
1aa20 74 65 42 74 72 65 65 50 61 67 65 28 42 74 53 68  teBtreePage(BtSh
1aa30 61 72 65 64 20 2a 2c 20 4d 65 6d 50 61 67 65 20  ared *, MemPage 
1aa40 2a 2a 2c 20 50 67 6e 6f 20 2a 2c 20 50 67 6e 6f  **, Pgno *, Pgno
1aa50 2c 20 75 38 29 3b 0a 0a 2f 2a 0a 2a 2a 20 50 65  , u8);../*.** Pe
1aa60 72 66 6f 72 6d 20 61 20 73 69 6e 67 6c 65 20 73  rform a single s
1aa70 74 65 70 20 6f 66 20 61 6e 20 69 6e 63 72 65 6d  tep of an increm
1aa80 65 6e 74 61 6c 2d 76 61 63 75 75 6d 2e 20 49 66  ental-vacuum. If
1aa90 20 73 75 63 63 65 73 73 66 75 6c 2c 20 72 65 74   successful, ret
1aaa0 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  urn.** SQLITE_OK
1aab0 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f  . If there is no
1aac0 20 77 6f 72 6b 20 74 6f 20 64 6f 20 28 61 6e 64   work to do (and
1aad0 20 74 68 65 72 65 66 6f 72 65 20 6e 6f 20 70 6f   therefore no po
1aae0 69 6e 74 20 69 6e 20 0a 2a 2a 20 63 61 6c 6c 69  int in .** calli
1aaf0 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ng this function
1ab00 20 61 67 61 69 6e 29 2c 20 72 65 74 75 72 6e 20   again), return 
1ab10 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 20 4f 72 2c  SQLITE_DONE. Or,
1ab20 20 69 66 20 61 6e 20 65 72 72 6f 72 20 0a 2a 2a   if an error .**
1ab30 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20   occurs, return 
1ab40 73 6f 6d 65 20 6f 74 68 65 72 20 65 72 72 6f 72  some other error
1ab50 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 72   code..**.** Mor
1ab60 65 20 73 70 65 63 69 66 69 63 61 6c 6c 79 2c 20  e specifically, 
1ab70 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 74  this function at
1ab80 74 65 6d 70 74 73 20 74 6f 20 72 65 2d 6f 72 67  tempts to re-org
1ab90 61 6e 69 7a 65 20 74 68 65 20 64 61 74 61 62 61  anize the databa
1aba0 73 65 20 73 6f 20 0a 2a 2a 20 74 68 61 74 20 74  se so .** that t
1abb0 68 65 20 6c 61 73 74 20 70 61 67 65 20 6f 66 20  he last page of 
1abc0 74 68 65 20 66 69 6c 65 20 63 75 72 72 65 6e 74  the file current
1abd0 6c 79 20 69 6e 20 75 73 65 20 69 73 20 6e 6f 20  ly in use is no 
1abe0 6c 6f 6e 67 65 72 20 69 6e 20 75 73 65 2e 0a 2a  longer in use..*
1abf0 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 6e  *.** Parameter n
1ac00 46 69 6e 20 69 73 20 74 68 65 20 6e 75 6d 62 65  Fin is the numbe
1ac10 72 20 6f 66 20 70 61 67 65 73 20 74 68 61 74 20  r of pages that 
1ac20 74 68 69 73 20 64 61 74 61 62 61 73 65 20 77 6f  this database wo
1ac30 75 6c 64 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 77  uld contain.** w
1ac40 65 72 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ere this functio
1ac50 6e 20 63 61 6c 6c 65 64 20 75 6e 74 69 6c 20 69  n called until i
1ac60 74 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45  t returns SQLITE
1ac70 5f 44 4f 4e 45 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  _DONE..**.** If 
1ac80 74 68 65 20 62 43 6f 6d 6d 69 74 20 70 61 72 61  the bCommit para
1ac90 6d 65 74 65 72 20 69 73 20 6e 6f 6e 2d 7a 65 72  meter is non-zer
1aca0 6f 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  o, this function
1acb0 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 74 68   assumes that th
1acc0 65 20 0a 2a 2a 20 63 61 6c 6c 65 72 20 77 69 6c  e .** caller wil
1acd0 6c 20 6b 65 65 70 20 63 61 6c 6c 69 6e 67 20 69  l keep calling i
1ace0 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28 29 20  ncrVacuumStep() 
1acf0 75 6e 74 69 6c 20 69 74 20 72 65 74 75 72 6e 73  until it returns
1ad00 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 0a 2a 2a   SQLITE_DONE .**
1ad10 20 6f 72 20 61 6e 20 65 72 72 6f 72 2e 20 62 43   or an error. bC
1ad20 6f 6d 6d 69 74 20 69 73 20 70 61 73 73 65 64 20  ommit is passed 
1ad30 74 72 75 65 20 66 6f 72 20 61 6e 20 61 75 74 6f  true for an auto
1ad40 2d 76 61 63 75 75 6d 2d 6f 6e 2d 63 6f 6d 6d 69  -vacuum-on-commi
1ad50 74 20 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 2c  t .** operation,
1ad60 20 6f 72 20 66 61 6c 73 65 20 66 6f 72 20 61 6e   or false for an
1ad70 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63   incremental vac
1ad80 75 75 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  uum..*/.static i
1ad90 6e 74 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65  nt incrVacuumSte
1ada0 70 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c  p(BtShared *pBt,
1adb0 20 50 67 6e 6f 20 6e 46 69 6e 2c 20 50 67 6e 6f   Pgno nFin, Pgno
1adc0 20 69 4c 61 73 74 50 67 2c 20 69 6e 74 20 62 43   iLastPg, int bC
1add0 6f 6d 6d 69 74 29 7b 0a 20 20 50 67 6e 6f 20 6e  ommit){.  Pgno n
1ade0 46 72 65 65 4c 69 73 74 3b 20 20 20 20 20 20 20  FreeList;       
1adf0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1ae00 20 70 61 67 65 73 20 73 74 69 6c 6c 20 6f 6e 20   pages still on 
1ae10 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 2a 2f  the free-list */
1ae20 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73  .  int rc;..  as
1ae30 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
1ae40 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
1ae50 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
1ae60 28 20 69 4c 61 73 74 50 67 3e 6e 46 69 6e 20 29  ( iLastPg>nFin )
1ae70 3b 0a 0a 20 20 69 66 28 20 21 50 54 52 4d 41 50  ;..  if( !PTRMAP
1ae80 5f 49 53 50 41 47 45 28 70 42 74 2c 20 69 4c 61  _ISPAGE(pBt, iLa
1ae90 73 74 50 67 29 20 26 26 20 69 4c 61 73 74 50 67  stPg) && iLastPg
1aea0 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  !=PENDING_BYTE_P
1aeb0 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20  AGE(pBt) ){.    
1aec0 75 38 20 65 54 79 70 65 3b 0a 20 20 20 20 50 67  u8 eType;.    Pg
1aed0 6e 6f 20 69 50 74 72 50 61 67 65 3b 0a 0a 20 20  no iPtrPage;..  
1aee0 20 20 6e 46 72 65 65 4c 69 73 74 20 3d 20 67 65    nFreeList = ge
1aef0 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61  t4byte(&pBt->pPa
1af00 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b  ge1->aData[36]);
1af10 0a 20 20 20 20 69 66 28 20 6e 46 72 65 65 4c 69  .    if( nFreeLi
1af20 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  st==0 ){.      r
1af30 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e  eturn SQLITE_DON
1af40 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 63  E;.    }..    rc
1af50 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70 42 74   = ptrmapGet(pBt
1af60 2c 20 69 4c 61 73 74 50 67 2c 20 26 65 54 79 70  , iLastPg, &eTyp
1af70 65 2c 20 26 69 50 74 72 50 61 67 65 29 3b 0a 20  e, &iPtrPage);. 
1af80 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1af90 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
1afa0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
1afb0 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54     if( eType==PT
1afc0 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b  RMAP_ROOTPAGE ){
1afd0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
1afe0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
1aff0 54 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  T;.    }..    if
1b000 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  ( eType==PTRMAP_
1b010 46 52 45 45 50 41 47 45 20 29 7b 0a 20 20 20 20  FREEPAGE ){.    
1b020 20 20 69 66 28 20 62 43 6f 6d 6d 69 74 3d 3d 30    if( bCommit==0
1b030 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 52   ){.        /* R
1b040 65 6d 6f 76 65 20 74 68 65 20 70 61 67 65 20 66  emove the page f
1b050 72 6f 6d 20 74 68 65 20 66 69 6c 65 73 20 66 72  rom the files fr
1b060 65 65 2d 6c 69 73 74 2e 20 54 68 69 73 20 69 73  ee-list. This is
1b070 20 6e 6f 74 20 72 65 71 75 69 72 65 64 0a 20 20   not required.  
1b080 20 20 20 20 20 20 2a 2a 20 69 66 20 62 43 6f 6d        ** if bCom
1b090 6d 69 74 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2e  mit is non-zero.
1b0a0 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20 74   In that case, t
1b0b0 68 65 20 66 72 65 65 2d 6c 69 73 74 20 77 69 6c  he free-list wil
1b0c0 6c 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  l be.        ** 
1b0d0 74 72 75 6e 63 61 74 65 64 20 74 6f 20 7a 65 72  truncated to zer
1b0e0 6f 20 61 66 74 65 72 20 74 68 69 73 20 66 75 6e  o after this fun
1b0f0 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2c 20 73  ction returns, s
1b100 6f 20 69 74 20 64 6f 65 73 6e 27 74 20 0a 20 20  o it doesn't .  
1b110 20 20 20 20 20 20 2a 2a 20 6d 61 74 74 65 72 20        ** matter 
1b120 69 66 20 69 74 20 73 74 69 6c 6c 20 63 6f 6e 74  if it still cont
1b130 61 69 6e 73 20 73 6f 6d 65 20 67 61 72 62 61 67  ains some garbag
1b140 65 20 65 6e 74 72 69 65 73 2e 0a 20 20 20 20 20  e entries..     
1b150 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 50 67     */.        Pg
1b160 6e 6f 20 69 46 72 65 65 50 67 3b 0a 20 20 20 20  no iFreePg;.    
1b170 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 46 72      MemPage *pFr
1b180 65 65 50 67 3b 0a 20 20 20 20 20 20 20 20 72 63  eePg;.        rc
1b190 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65   = allocateBtree
1b1a0 50 61 67 65 28 70 42 74 2c 20 26 70 46 72 65 65  Page(pBt, &pFree
1b1b0 50 67 2c 20 26 69 46 72 65 65 50 67 2c 20 69 4c  Pg, &iFreePg, iL
1b1c0 61 73 74 50 67 2c 20 42 54 41 4c 4c 4f 43 5f 45  astPg, BTALLOC_E
1b1d0 58 41 43 54 29 3b 0a 20 20 20 20 20 20 20 20 69  XACT);.        i
1b1e0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1b1f0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
1b200 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
1b210 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72   }.        asser
1b220 74 28 20 69 46 72 65 65 50 67 3d 3d 69 4c 61 73  t( iFreePg==iLas
1b230 74 50 67 20 29 3b 0a 20 20 20 20 20 20 20 20 72  tPg );.        r
1b240 65 6c 65 61 73 65 50 61 67 65 28 70 46 72 65 65  eleasePage(pFree
1b250 50 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  Pg);.      }.   
1b260 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20   } else {.      
1b270 50 67 6e 6f 20 69 46 72 65 65 50 67 3b 20 20 20  Pgno iFreePg;   
1b280 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
1b290 65 78 20 6f 66 20 66 72 65 65 20 70 61 67 65 20  ex of free page 
1b2a0 74 6f 20 6d 6f 76 65 20 70 4c 61 73 74 50 67 20  to move pLastPg 
1b2b0 74 6f 20 2a 2f 0a 20 20 20 20 20 20 4d 65 6d 50  to */.      MemP
1b2c0 61 67 65 20 2a 70 4c 61 73 74 50 67 3b 0a 20 20  age *pLastPg;.  
1b2d0 20 20 20 20 75 38 20 65 4d 6f 64 65 20 3d 20 42      u8 eMode = B
1b2e0 54 41 4c 4c 4f 43 5f 41 4e 59 3b 20 20 20 2f 2a  TALLOC_ANY;   /*
1b2f0 20 4d 6f 64 65 20 70 61 72 61 6d 65 74 65 72 20   Mode parameter 
1b300 66 6f 72 20 61 6c 6c 6f 63 61 74 65 42 74 72 65  for allocateBtre
1b310 65 50 61 67 65 28 29 20 2a 2f 0a 20 20 20 20 20  ePage() */.     
1b320 20 50 67 6e 6f 20 69 4e 65 61 72 20 3d 20 30 3b   Pgno iNear = 0;
1b330 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6e 65             /* ne
1b340 61 72 62 79 20 70 61 72 61 6d 65 74 65 72 20 66  arby parameter f
1b350 6f 72 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65  or allocateBtree
1b360 50 61 67 65 28 29 20 2a 2f 0a 0a 20 20 20 20 20  Page() */..     
1b370 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61   rc = btreeGetPa
1b380 67 65 28 70 42 74 2c 20 69 4c 61 73 74 50 67 2c  ge(pBt, iLastPg,
1b390 20 26 70 4c 61 73 74 50 67 2c 20 30 29 3b 0a 20   &pLastPg, 0);. 
1b3a0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
1b3b0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1b3c0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
1b3d0 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49     }..      /* I
1b3e0 66 20 62 43 6f 6d 6d 69 74 20 69 73 20 7a 65 72  f bCommit is zer
1b3f0 6f 2c 20 74 68 69 73 20 6c 6f 6f 70 20 72 75 6e  o, this loop run
1b400 73 20 65 78 61 63 74 6c 79 20 6f 6e 63 65 20 61  s exactly once a
1b410 6e 64 20 70 61 67 65 20 70 4c 61 73 74 50 67 0a  nd page pLastPg.
1b420 20 20 20 20 20 20 2a 2a 20 69 73 20 73 77 61 70        ** is swap
1b430 70 65 64 20 77 69 74 68 20 74 68 65 20 66 69 72  ped with the fir
1b440 73 74 20 66 72 65 65 20 70 61 67 65 20 70 75 6c  st free page pul
1b450 6c 65 64 20 6f 66 66 20 74 68 65 20 66 72 65 65  led off the free
1b460 20 6c 69 73 74 2e 0a 20 20 20 20 20 20 2a 2a 0a   list..      **.
1b470 20 20 20 20 20 20 2a 2a 20 4f 6e 20 74 68 65 20        ** On the 
1b480 6f 74 68 65 72 20 68 61 6e 64 2c 20 69 66 20 62  other hand, if b
1b490 43 6f 6d 6d 69 74 20 69 73 20 67 72 65 61 74 65  Commit is greate
1b4a0 72 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65  r than zero, the
1b4b0 6e 20 6b 65 65 70 0a 20 20 20 20 20 20 2a 2a 20  n keep.      ** 
1b4c0 6c 6f 6f 70 69 6e 67 20 75 6e 74 69 6c 20 61 20  looping until a 
1b4d0 66 72 65 65 2d 70 61 67 65 20 6c 6f 63 61 74 65  free-page locate
1b4e0 64 20 77 69 74 68 69 6e 20 74 68 65 20 66 69 72  d within the fir
1b4f0 73 74 20 6e 46 69 6e 20 70 61 67 65 73 0a 20 20  st nFin pages.  
1b500 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 66 69      ** of the fi
1b510 6c 65 20 69 73 20 66 6f 75 6e 64 2e 0a 20 20 20  le is found..   
1b520 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
1b530 62 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b 0a 20 20  bCommit==0 ){.  
1b540 20 20 20 20 20 20 65 4d 6f 64 65 20 3d 20 42 54        eMode = BT
1b550 41 4c 4c 4f 43 5f 4c 45 3b 0a 20 20 20 20 20 20  ALLOC_LE;.      
1b560 20 20 69 4e 65 61 72 20 3d 20 6e 46 69 6e 3b 0a    iNear = nFin;.
1b570 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64 6f        }.      do
1b580 20 7b 0a 20 20 20 20 20 20 20 20 4d 65 6d 50 61   {.        MemPa
1b590 67 65 20 2a 70 46 72 65 65 50 67 3b 0a 20 20 20  ge *pFreePg;.   
1b5a0 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61       rc = alloca
1b5b0 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c  teBtreePage(pBt,
1b5c0 20 26 70 46 72 65 65 50 67 2c 20 26 69 46 72 65   &pFreePg, &iFre
1b5d0 65 50 67 2c 20 69 4e 65 61 72 2c 20 65 4d 6f 64  ePg, iNear, eMod
1b5e0 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  e);.        if( 
1b5f0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1b600 0a 20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61  .          relea
1b610 73 65 50 61 67 65 28 70 4c 61 73 74 50 67 29 3b  sePage(pLastPg);
1b620 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
1b630 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a  n rc;.        }.
1b640 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
1b650 61 67 65 28 70 46 72 65 65 50 67 29 3b 0a 20 20  age(pFreePg);.  
1b660 20 20 20 20 7d 77 68 69 6c 65 28 20 62 43 6f 6d      }while( bCom
1b670 6d 69 74 20 26 26 20 69 46 72 65 65 50 67 3e 6e  mit && iFreePg>n
1b680 46 69 6e 20 29 3b 0a 20 20 20 20 20 20 61 73 73  Fin );.      ass
1b690 65 72 74 28 20 69 46 72 65 65 50 67 3c 69 4c 61  ert( iFreePg<iLa
1b6a0 73 74 50 67 20 29 3b 0a 20 20 20 20 20 20 0a 20  stPg );.      . 
1b6b0 20 20 20 20 20 72 63 20 3d 20 72 65 6c 6f 63 61       rc = reloca
1b6c0 74 65 50 61 67 65 28 70 42 74 2c 20 70 4c 61 73  tePage(pBt, pLas
1b6d0 74 50 67 2c 20 65 54 79 70 65 2c 20 69 50 74 72  tPg, eType, iPtr
1b6e0 50 61 67 65 2c 20 69 46 72 65 65 50 67 2c 20 62  Page, iFreePg, b
1b6f0 43 6f 6d 6d 69 74 29 3b 0a 20 20 20 20 20 20 72  Commit);.      r
1b700 65 6c 65 61 73 65 50 61 67 65 28 70 4c 61 73 74  eleasePage(pLast
1b710 50 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  Pg);.      if( r
1b720 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1b730 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
1b740 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  c;.      }.    }
1b750 0a 20 20 7d 0a 0a 20 20 69 66 28 20 62 43 6f 6d  .  }..  if( bCom
1b760 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 64 6f  mit==0 ){.    do
1b770 20 7b 0a 20 20 20 20 20 20 69 4c 61 73 74 50 67   {.      iLastPg
1b780 2d 2d 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20  --;.    }while( 
1b790 69 4c 61 73 74 50 67 3d 3d 50 45 4e 44 49 4e 47  iLastPg==PENDING
1b7a0 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
1b7b0 7c 7c 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45  || PTRMAP_ISPAGE
1b7c0 28 70 42 74 2c 20 69 4c 61 73 74 50 67 29 20 29  (pBt, iLastPg) )
1b7d0 3b 0a 20 20 20 20 70 42 74 2d 3e 62 44 6f 54 72  ;.    pBt->bDoTr
1b7e0 75 6e 63 61 74 65 20 3d 20 31 3b 0a 20 20 20 20  uncate = 1;.    
1b7f0 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 69 4c 61  pBt->nPage = iLa
1b800 73 74 50 67 3b 0a 20 20 7d 0a 20 20 72 65 74 75  stPg;.  }.  retu
1b810 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
1b820 0a 2f 2a 0a 2a 2a 20 54 68 65 20 64 61 74 61 62  ./*.** The datab
1b830 61 73 65 20 6f 70 65 6e 65 64 20 62 79 20 74 68  ase opened by th
1b840 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
1b850 20 69 73 20 61 6e 20 61 75 74 6f 2d 76 61 63 75   is an auto-vacu
1b860 75 6d 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 6e  um database.** n
1b870 4f 72 69 67 20 70 61 67 65 73 20 69 6e 20 73 69  Orig pages in si
1b880 7a 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 6e 46  ze containing nF
1b890 72 65 65 20 66 72 65 65 20 70 61 67 65 73 2e 20  ree free pages. 
1b8a0 52 65 74 75 72 6e 20 74 68 65 20 65 78 70 65 63  Return the expec
1b8b0 74 65 64 20 0a 2a 2a 20 73 69 7a 65 20 6f 66 20  ted .** size of 
1b8c0 74 68 65 20 64 61 74 61 62 61 73 65 20 69 6e 20  the database in 
1b8d0 70 61 67 65 73 20 66 6f 6c 6c 6f 77 69 6e 67 20  pages following 
1b8e0 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 6f  an auto-vacuum o
1b8f0 70 65 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  peration..*/.sta
1b900 74 69 63 20 50 67 6e 6f 20 66 69 6e 61 6c 44 62  tic Pgno finalDb
1b910 53 69 7a 65 28 42 74 53 68 61 72 65 64 20 2a 70  Size(BtShared *p
1b920 42 74 2c 20 50 67 6e 6f 20 6e 4f 72 69 67 2c 20  Bt, Pgno nOrig, 
1b930 50 67 6e 6f 20 6e 46 72 65 65 29 7b 0a 20 20 69  Pgno nFree){.  i
1b940 6e 74 20 6e 45 6e 74 72 79 3b 20 20 20 20 20 20  nt nEntry;      
1b950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1b960 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72  * Number of entr
1b970 69 65 73 20 6f 6e 20 6f 6e 65 20 70 74 72 6d 61  ies on one ptrma
1b980 70 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f  p page */.  Pgno
1b990 20 6e 50 74 72 6d 61 70 3b 20 20 20 20 20 20 20   nPtrmap;       
1b9a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1b9b0 75 6d 62 65 72 20 6f 66 20 50 74 72 4d 61 70 20  umber of PtrMap 
1b9c0 70 61 67 65 73 20 74 6f 20 62 65 20 66 72 65 65  pages to be free
1b9d0 64 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 46 69 6e  d */.  Pgno nFin
1b9e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1b9f0 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
1ba00 20 76 61 6c 75 65 20 2a 2f 0a 0a 20 20 6e 45 6e   value */..  nEn
1ba10 74 72 79 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c  try = pBt->usabl
1ba20 65 53 69 7a 65 2f 35 3b 0a 20 20 6e 50 74 72 6d  eSize/5;.  nPtrm
1ba30 61 70 20 3d 20 28 6e 46 72 65 65 2d 6e 4f 72 69  ap = (nFree-nOri
1ba40 67 2b 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28  g+PTRMAP_PAGENO(
1ba50 70 42 74 2c 20 6e 4f 72 69 67 29 2b 6e 45 6e 74  pBt, nOrig)+nEnt
1ba60 72 79 29 2f 6e 45 6e 74 72 79 3b 0a 20 20 6e 46  ry)/nEntry;.  nF
1ba70 69 6e 20 3d 20 6e 4f 72 69 67 20 2d 20 6e 46 72  in = nOrig - nFr
1ba80 65 65 20 2d 20 6e 50 74 72 6d 61 70 3b 0a 20 20  ee - nPtrmap;.  
1ba90 69 66 28 20 6e 4f 72 69 67 3e 50 45 4e 44 49 4e  if( nOrig>PENDIN
1baa0 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
1bab0 20 26 26 20 6e 46 69 6e 3c 50 45 4e 44 49 4e 47   && nFin<PENDING
1bac0 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
1bad0 29 7b 0a 20 20 20 20 6e 46 69 6e 2d 2d 3b 0a 20  ){.    nFin--;. 
1bae0 20 7d 0a 20 20 77 68 69 6c 65 28 20 50 54 52 4d   }.  while( PTRM
1baf0 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 6e  AP_ISPAGE(pBt, n
1bb00 46 69 6e 29 20 7c 7c 20 6e 46 69 6e 3d 3d 50 45  Fin) || nFin==PE
1bb10 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
1bb20 70 42 74 29 20 29 7b 0a 20 20 20 20 6e 46 69 6e  pBt) ){.    nFin
1bb30 2d 2d 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  --;.  }..  retur
1bb40 6e 20 6e 46 69 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n nFin;.}../*.**
1bb50 20 41 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63   A write-transac
1bb60 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 6f 70 65  tion must be ope
1bb70 6e 65 64 20 62 65 66 6f 72 65 20 63 61 6c 6c 69  ned before calli
1bb80 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ng this function
1bb90 2e 0a 2a 2a 20 49 74 20 70 65 72 66 6f 72 6d 73  ..** It performs
1bba0 20 61 20 73 69 6e 67 6c 65 20 75 6e 69 74 20 6f   a single unit o
1bbb0 66 20 77 6f 72 6b 20 74 6f 77 61 72 64 73 20 61  f work towards a
1bbc0 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61  n incremental va
1bbd0 63 75 75 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  cuum..**.** If t
1bbe0 68 65 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76  he incremental v
1bbf0 61 63 75 75 6d 20 69 73 20 66 69 6e 69 73 68 65  acuum is finishe
1bc00 64 20 61 66 74 65 72 20 74 68 69 73 20 66 75 6e  d after this fun
1bc10 63 74 69 6f 6e 20 68 61 73 20 72 75 6e 2c 0a 2a  ction has run,.*
1bc20 2a 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73  * SQLITE_DONE is
1bc30 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 69 74   returned. If it
1bc40 20 69 73 20 6e 6f 74 20 66 69 6e 69 73 68 65 64   is not finished
1bc50 2c 20 62 75 74 20 6e 6f 20 65 72 72 6f 72 20 6f  , but no error o
1bc60 63 63 75 72 72 65 64 2c 0a 2a 2a 20 53 51 4c 49  ccurred,.** SQLI
1bc70 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
1bc80 64 2e 20 4f 74 68 65 72 77 69 73 65 20 61 6e 20  d. Otherwise an 
1bc90 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
1bca0 65 2e 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  e. .*/.int sqlit
1bcb0 65 33 42 74 72 65 65 49 6e 63 72 56 61 63 75 75  e3BtreeIncrVacuu
1bcc0 6d 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69  m(Btree *p){.  i
1bcd0 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72 65  nt rc;.  BtShare
1bce0 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
1bcf0 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ..  sqlite3Btree
1bd00 45 6e 74 65 72 28 70 29 3b 0a 20 20 61 73 73 65  Enter(p);.  asse
1bd10 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73  rt( pBt->inTrans
1bd20 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52  action==TRANS_WR
1bd30 49 54 45 20 26 26 20 70 2d 3e 69 6e 54 72 61 6e  ITE && p->inTran
1bd40 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29  s==TRANS_WRITE )
1bd50 3b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 61 75  ;.  if( !pBt->au
1bd60 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  toVacuum ){.    
1bd70 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45  rc = SQLITE_DONE
1bd80 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 50  ;.  }else{.    P
1bd90 67 6e 6f 20 6e 4f 72 69 67 20 3d 20 62 74 72 65  gno nOrig = btre
1bda0 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 3b  ePagecount(pBt);
1bdb0 0a 20 20 20 20 50 67 6e 6f 20 6e 46 72 65 65 20  .    Pgno nFree 
1bdc0 3d 20 67 65 74 34 62 79 74 65 28 26 70 42 74 2d  = get4byte(&pBt-
1bdd0 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  >pPage1->aData[3
1bde0 36 5d 29 3b 0a 20 20 20 20 50 67 6e 6f 20 6e 46  6]);.    Pgno nF
1bdf0 69 6e 20 3d 20 66 69 6e 61 6c 44 62 53 69 7a 65  in = finalDbSize
1be00 28 70 42 74 2c 20 6e 4f 72 69 67 2c 20 6e 46 72  (pBt, nOrig, nFr
1be10 65 65 29 3b 0a 0a 20 20 20 20 69 66 28 20 6e 4f  ee);..    if( nO
1be20 72 69 67 3c 6e 46 69 6e 20 29 7b 0a 20 20 20 20  rig<nFin ){.    
1be30 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
1be40 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
1be50 7d 65 6c 73 65 20 69 66 28 20 6e 46 72 65 65 3e  }else if( nFree>
1be60 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
1be70 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 70  saveAllCursors(p
1be80 42 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  Bt, 0, 0);.     
1be90 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1bea0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  OK ){.        in
1beb0 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72 66  validateAllOverf
1bec0 6c 6f 77 43 61 63 68 65 28 70 42 74 29 3b 0a 20  lowCache(pBt);. 
1bed0 20 20 20 20 20 20 20 72 63 20 3d 20 69 6e 63 72         rc = incr
1bee0 56 61 63 75 75 6d 53 74 65 70 28 70 42 74 2c 20  VacuumStep(pBt, 
1bef0 6e 46 69 6e 2c 20 6e 4f 72 69 67 2c 20 30 29 3b  nFin, nOrig, 0);
1bf00 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
1bf10 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1bf20 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
1bf30 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
1bf40 74 65 28 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  te(pBt->pPage1->
1bf50 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
1bf60 20 20 70 75 74 34 62 79 74 65 28 26 70 42 74 2d    put4byte(&pBt-
1bf70 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 32  >pPage1->aData[2
1bf80 38 5d 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 3b  8], pBt->nPage);
1bf90 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
1bfa0 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  se{.      rc = S
1bfb0 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20  QLITE_DONE;.    
1bfc0 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42  }.  }.  sqlite3B
1bfd0 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
1bfe0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1bff0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1c000 20 69 73 20 63 61 6c 6c 65 64 20 70 72 69 6f 72   is called prior
1c010 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72   to sqlite3Pager
1c020 43 6f 6d 6d 69 74 20 77 68 65 6e 20 61 20 74 72  Commit when a tr
1c030 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20  ansaction.** is 
1c040 63 6f 6d 6d 69 74 74 65 64 20 66 6f 72 20 61 6e  committed for an
1c050 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74   auto-vacuum dat
1c060 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  abase..**.** If 
1c070 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
1c080 75 72 6e 65 64 2c 20 74 68 65 6e 20 2a 70 6e 54  urned, then *pnT
1c090 72 75 6e 63 20 69 73 20 73 65 74 20 74 6f 20 74  runc is set to t
1c0a0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  he number of pag
1c0b0 65 73 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61  es.** the databa
1c0c0 73 65 20 66 69 6c 65 20 73 68 6f 75 6c 64 20 62  se file should b
1c0d0 65 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20 64  e truncated to d
1c0e0 75 72 69 6e 67 20 74 68 65 20 63 6f 6d 6d 69 74  uring the commit
1c0f0 20 70 72 6f 63 65 73 73 2e 20 0a 2a 2a 20 69 2e   process. .** i.
1c100 65 2e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  e. the database 
1c110 68 61 73 20 62 65 65 6e 20 72 65 6f 72 67 61 6e  has been reorgan
1c120 69 7a 65 64 20 73 6f 20 74 68 61 74 20 6f 6e 6c  ized so that onl
1c130 79 20 74 68 65 20 66 69 72 73 74 20 2a 70 6e 54  y the first *pnT
1c140 72 75 6e 63 0a 2a 2a 20 70 61 67 65 73 20 61 72  runc.** pages ar
1c150 65 20 69 6e 20 75 73 65 2e 0a 2a 2f 0a 73 74 61  e in use..*/.sta
1c160 74 69 63 20 69 6e 74 20 61 75 74 6f 56 61 63 75  tic int autoVacu
1c170 75 6d 43 6f 6d 6d 69 74 28 42 74 53 68 61 72 65  umCommit(BtShare
1c180 64 20 2a 70 42 74 29 7b 0a 20 20 69 6e 74 20 72  d *pBt){.  int r
1c190 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1c1a0 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
1c1b0 20 70 42 74 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pBt->pPager;.  
1c1c0 56 56 41 5f 4f 4e 4c 59 28 20 69 6e 74 20 6e 52  VVA_ONLY( int nR
1c1d0 65 66 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  ef = sqlite3Page
1c1e0 72 52 65 66 63 6f 75 6e 74 28 70 50 61 67 65 72  rRefcount(pPager
1c1f0 29 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ) );..  assert( 
1c200 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
1c210 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
1c220 3b 0a 20 20 69 6e 76 61 6c 69 64 61 74 65 41 6c  ;.  invalidateAl
1c230 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70  lOverflowCache(p
1c240 42 74 29 3b 0a 20 20 61 73 73 65 72 74 28 70 42  Bt);.  assert(pB
1c250 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 3b 0a  t->autoVacuum);.
1c260 20 20 69 66 28 20 21 70 42 74 2d 3e 69 6e 63 72    if( !pBt->incr
1c270 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 50 67  Vacuum ){.    Pg
1c280 6e 6f 20 6e 46 69 6e 3b 20 20 20 20 20 20 20 20  no nFin;        
1c290 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
1c2a0 67 65 73 20 69 6e 20 64 61 74 61 62 61 73 65 20  ges in database 
1c2b0 61 66 74 65 72 20 61 75 74 6f 76 61 63 75 75 6d  after autovacuum
1c2c0 69 6e 67 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20  ing */.    Pgno 
1c2d0 6e 46 72 65 65 3b 20 20 20 20 20 20 20 20 2f 2a  nFree;        /*
1c2e0 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
1c2f0 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74   on the freelist
1c300 20 69 6e 69 74 69 61 6c 6c 79 20 2a 2f 0a 20 20   initially */.  
1c310 20 20 50 67 6e 6f 20 69 46 72 65 65 3b 20 20 20    Pgno iFree;   
1c320 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 78 74       /* The next
1c330 20 70 61 67 65 20 74 6f 20 62 65 20 66 72 65 65   page to be free
1c340 64 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 4f  d */.    Pgno nO
1c350 72 69 67 3b 20 20 20 20 20 20 20 20 2f 2a 20 44  rig;        /* D
1c360 61 74 61 62 61 73 65 20 73 69 7a 65 20 62 65 66  atabase size bef
1c370 6f 72 65 20 66 72 65 65 69 6e 67 20 2a 2f 0a 0a  ore freeing */..
1c380 20 20 20 20 6e 4f 72 69 67 20 3d 20 62 74 72 65      nOrig = btre
1c390 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 3b  ePagecount(pBt);
1c3a0 0a 20 20 20 20 69 66 28 20 50 54 52 4d 41 50 5f  .    if( PTRMAP_
1c3b0 49 53 50 41 47 45 28 70 42 74 2c 20 6e 4f 72 69  ISPAGE(pBt, nOri
1c3c0 67 29 20 7c 7c 20 6e 4f 72 69 67 3d 3d 50 45 4e  g) || nOrig==PEN
1c3d0 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
1c3e0 42 74 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  Bt) ){.      /* 
1c3f0 49 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62  It is not possib
1c400 6c 65 20 74 6f 20 63 72 65 61 74 65 20 61 20 64  le to create a d
1c410 61 74 61 62 61 73 65 20 66 6f 72 20 77 68 69 63  atabase for whic
1c420 68 20 74 68 65 20 66 69 6e 61 6c 20 70 61 67 65  h the final page
1c430 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 65 69 74  .      ** is eit
1c440 68 65 72 20 61 20 70 6f 69 6e 74 65 72 2d 6d 61  her a pointer-ma
1c450 70 20 70 61 67 65 20 6f 72 20 74 68 65 20 70 65  p page or the pe
1c460 6e 64 69 6e 67 2d 62 79 74 65 20 70 61 67 65 2e  nding-byte page.
1c470 20 49 66 20 6f 6e 65 0a 20 20 20 20 20 20 2a 2a   If one.      **
1c480 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c   is encountered,
1c490 20 74 68 69 73 20 69 6e 64 69 63 61 74 65 73 20   this indicates 
1c4a0 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20 20 20  corruption..    
1c4b0 20 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72    */.      retur
1c4c0 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
1c4d0 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a 20 20  _BKPT;.    }..  
1c4e0 20 20 6e 46 72 65 65 20 3d 20 67 65 74 34 62 79    nFree = get4by
1c4f0 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d  te(&pBt->pPage1-
1c500 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 20  >aData[36]);.   
1c510 20 6e 46 69 6e 20 3d 20 66 69 6e 61 6c 44 62 53   nFin = finalDbS
1c520 69 7a 65 28 70 42 74 2c 20 6e 4f 72 69 67 2c 20  ize(pBt, nOrig, 
1c530 6e 46 72 65 65 29 3b 0a 20 20 20 20 69 66 28 20  nFree);.    if( 
1c540 6e 46 69 6e 3e 6e 4f 72 69 67 20 29 20 72 65 74  nFin>nOrig ) ret
1c550 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
1c560 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 69 66 28  PT_BKPT;.    if(
1c570 20 6e 46 69 6e 3c 6e 4f 72 69 67 20 29 7b 0a 20   nFin<nOrig ){. 
1c580 20 20 20 20 20 72 63 20 3d 20 73 61 76 65 41 6c       rc = saveAl
1c590 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20 30 2c  lCursors(pBt, 0,
1c5a0 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66   0);.    }.    f
1c5b0 6f 72 28 69 46 72 65 65 3d 6e 4f 72 69 67 3b 20  or(iFree=nOrig; 
1c5c0 69 46 72 65 65 3e 6e 46 69 6e 20 26 26 20 72 63  iFree>nFin && rc
1c5d0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 46 72  ==SQLITE_OK; iFr
1c5e0 65 65 2d 2d 29 7b 0a 20 20 20 20 20 20 72 63 20  ee--){.      rc 
1c5f0 3d 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70  = incrVacuumStep
1c600 28 70 42 74 2c 20 6e 46 69 6e 2c 20 69 46 72 65  (pBt, nFin, iFre
1c610 65 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20  e, 1);.    }.   
1c620 20 69 66 28 20 28 72 63 3d 3d 53 51 4c 49 54 45   if( (rc==SQLITE
1c630 5f 44 4f 4e 45 20 7c 7c 20 72 63 3d 3d 53 51 4c  _DONE || rc==SQL
1c640 49 54 45 5f 4f 4b 29 20 26 26 20 6e 46 72 65 65  ITE_OK) && nFree
1c650 3e 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  >0 ){.      rc =
1c660 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
1c670 74 65 28 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  te(pBt->pPage1->
1c680 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
1c690 70 75 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70  put4byte(&pBt->p
1c6a0 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d  Page1->aData[32]
1c6b0 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 75 74 34  , 0);.      put4
1c6c0 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65  byte(&pBt->pPage
1c6d0 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20 30 29  1->aData[36], 0)
1c6e0 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65  ;.      put4byte
1c6f0 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  (&pBt->pPage1->a
1c700 44 61 74 61 5b 32 38 5d 2c 20 6e 46 69 6e 29 3b  Data[28], nFin);
1c710 0a 20 20 20 20 20 20 70 42 74 2d 3e 62 44 6f 54  .      pBt->bDoT
1c720 72 75 6e 63 61 74 65 20 3d 20 31 3b 0a 20 20 20  runcate = 1;.   
1c730 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20     pBt->nPage = 
1c740 6e 46 69 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20  nFin;.    }.    
1c750 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1c760 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  K ){.      sqlit
1c770 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28  e3PagerRollback(
1c780 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20  pPager);.    }. 
1c790 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 52   }..  assert( nR
1c7a0 65 66 3e 3d 73 71 6c 69 74 65 33 50 61 67 65 72  ef>=sqlite3Pager
1c7b0 52 65 66 63 6f 75 6e 74 28 70 50 61 67 65 72 29  Refcount(pPager)
1c7c0 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   );.  return rc;
1c7d0 0a 7d 0a 0a 23 65 6c 73 65 20 2f 2a 20 69 66 6e  .}..#else /* ifn
1c7e0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1c7f0 41 55 54 4f 56 41 43 55 55 4d 20 2a 2f 0a 23 20  AUTOVACUUM */.# 
1c800 64 65 66 69 6e 65 20 73 65 74 43 68 69 6c 64 50  define setChildP
1c810 74 72 6d 61 70 73 28 78 29 20 53 51 4c 49 54 45  trmaps(x) SQLITE
1c820 5f 4f 4b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  _OK.#endif../*.*
1c830 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64  * This routine d
1c840 6f 65 73 20 74 68 65 20 66 69 72 73 74 20 70 68  oes the first ph
1c850 61 73 65 20 6f 66 20 61 20 74 77 6f 2d 70 68 61  ase of a two-pha
1c860 73 65 20 63 6f 6d 6d 69 74 2e 20 20 54 68 69 73  se commit.  This
1c870 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 63 61 75 73   routine.** caus
1c880 65 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f  es a rollback jo
1c890 75 72 6e 61 6c 20 74 6f 20 62 65 20 63 72 65 61  urnal to be crea
1c8a0 74 65 64 20 28 69 66 20 69 74 20 64 6f 65 73 20  ted (if it does 
1c8b0 6e 6f 74 20 61 6c 72 65 61 64 79 20 65 78 69 73  not already exis
1c8c0 74 29 0a 2a 2a 20 61 6e 64 20 70 6f 70 75 6c 61  t).** and popula
1c8d0 74 65 64 20 77 69 74 68 20 65 6e 6f 75 67 68 20  ted with enough 
1c8e0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 73 6f 20 74  information so t
1c8f0 68 61 74 20 69 66 20 61 20 70 6f 77 65 72 20 6c  hat if a power l
1c900 6f 73 73 20 6f 63 63 75 72 73 0a 2a 2a 20 74 68  oss occurs.** th
1c910 65 20 64 61 74 61 62 61 73 65 20 63 61 6e 20 62  e database can b
1c920 65 20 72 65 73 74 6f 72 65 64 20 74 6f 20 69 74  e restored to it
1c930 73 20 6f 72 69 67 69 6e 61 6c 20 73 74 61 74 65  s original state
1c940 20 62 79 20 70 6c 61 79 69 6e 67 20 62 61 63 6b   by playing back
1c950 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e  .** the journal.
1c960 20 20 54 68 65 6e 20 74 68 65 20 63 6f 6e 74 65    Then the conte
1c970 6e 74 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  nts of the journ
1c980 61 6c 20 61 72 65 20 66 6c 75 73 68 65 64 20 6f  al are flushed o
1c990 75 74 20 74 6f 0a 2a 2a 20 74 68 65 20 64 69 73  ut to.** the dis
1c9a0 6b 2e 20 20 41 66 74 65 72 20 74 68 65 20 6a 6f  k.  After the jo
1c9b0 75 72 6e 61 6c 20 69 73 20 73 61 66 65 6c 79 20  urnal is safely 
1c9c0 6f 6e 20 6f 78 69 64 65 2c 20 74 68 65 20 63 68  on oxide, the ch
1c9d0 61 6e 67 65 73 20 74 6f 20 74 68 65 0a 2a 2a 20  anges to the.** 
1c9e0 64 61 74 61 62 61 73 65 20 61 72 65 20 77 72 69  database are wri
1c9f0 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 64 61  tten into the da
1ca00 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20  tabase file and 
1ca10 66 6c 75 73 68 65 64 20 74 6f 20 6f 78 69 64 65  flushed to oxide
1ca20 2e 0a 2a 2a 20 41 74 20 74 68 65 20 65 6e 64 20  ..** At the end 
1ca30 6f 66 20 74 68 69 73 20 63 61 6c 6c 2c 20 74 68  of this call, th
1ca40 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
1ca50 61 6c 20 73 74 69 6c 6c 20 65 78 69 73 74 73 20  al still exists 
1ca60 6f 6e 20 74 68 65 0a 2a 2a 20 64 69 73 6b 20 61  on the.** disk a
1ca70 6e 64 20 77 65 20 61 72 65 20 73 74 69 6c 6c 20  nd we are still 
1ca80 68 6f 6c 64 69 6e 67 20 61 6c 6c 20 6c 6f 63 6b  holding all lock
1ca90 73 2c 20 73 6f 20 74 68 65 20 74 72 61 6e 73 61  s, so the transa
1caa0 63 74 69 6f 6e 20 68 61 73 20 6e 6f 74 0a 2a 2a  ction has not.**
1cab0 20 63 6f 6d 6d 69 74 74 65 64 2e 20 20 53 65 65   committed.  See
1cac0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
1cad0 6d 69 74 50 68 61 73 65 54 77 6f 28 29 20 66 6f  mitPhaseTwo() fo
1cae0 72 20 74 68 65 20 73 65 63 6f 6e 64 20 70 68 61  r the second pha
1caf0 73 65 20 6f 66 20 74 68 65 0a 2a 2a 20 63 6f 6d  se of the.** com
1cb00 6d 69 74 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a  mit process..**.
1cb10 2a 2a 20 54 68 69 73 20 63 61 6c 6c 20 69 73 20  ** This call is 
1cb20 61 20 6e 6f 2d 6f 70 20 69 66 20 6e 6f 20 77 72  a no-op if no wr
1cb30 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
1cb40 69 73 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74  is currently act
1cb50 69 76 65 20 6f 6e 20 70 42 74 2e 0a 2a 2a 0a 2a  ive on pBt..**.*
1cb60 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 73 79 6e  * Otherwise, syn
1cb70 63 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  c the database f
1cb80 69 6c 65 20 66 6f 72 20 74 68 65 20 62 74 72 65  ile for the btre
1cb90 65 20 70 42 74 2e 20 7a 4d 61 73 74 65 72 20 70  e pBt. zMaster p
1cba0 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 74 68 65 20  oints to.** the 
1cbb0 6e 61 6d 65 20 6f 66 20 61 20 6d 61 73 74 65 72  name of a master
1cbc0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68   journal file th
1cbd0 61 74 20 73 68 6f 75 6c 64 20 62 65 20 77 72 69  at should be wri
1cbe0 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 0a 2a 2a  tten into the.**
1cbf0 20 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75 72   individual jour
1cc00 6e 61 6c 20 66 69 6c 65 2c 20 6f 72 20 69 73 20  nal file, or is 
1cc10 4e 55 4c 4c 2c 20 69 6e 64 69 63 61 74 69 6e 67  NULL, indicating
1cc20 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   no master journ
1cc30 61 6c 20 66 69 6c 65 20 0a 2a 2a 20 28 73 69 6e  al file .** (sin
1cc40 67 6c 65 20 64 61 74 61 62 61 73 65 20 74 72 61  gle database tra
1cc50 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a  nsaction)..**.**
1cc60 20 57 68 65 6e 20 74 68 69 73 20 69 73 20 63 61   When this is ca
1cc70 6c 6c 65 64 2c 20 74 68 65 20 6d 61 73 74 65 72  lled, the master
1cc80 20 6a 6f 75 72 6e 61 6c 20 73 68 6f 75 6c 64 20   journal should 
1cc90 61 6c 72 65 61 64 79 20 68 61 76 65 20 62 65 65  already have bee
1cca0 6e 0a 2a 2a 20 63 72 65 61 74 65 64 2c 20 70 6f  n.** created, po
1ccb0 70 75 6c 61 74 65 64 20 77 69 74 68 20 74 68 69  pulated with thi
1ccc0 73 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65  s journal pointe
1ccd0 72 20 61 6e 64 20 73 79 6e 63 65 64 20 74 6f 20  r and synced to 
1cce0 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65  disk..**.** Once
1ccf0 20 74 68 69 73 20 69 73 20 72 6f 75 74 69 6e 65   this is routine
1cd00 20 68 61 73 20 72 65 74 75 72 6e 65 64 2c 20 74   has returned, t
1cd10 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67 20 72 65  he only thing re
1cd20 71 75 69 72 65 64 20 74 6f 20 63 6f 6d 6d 69 74  quired to commit
1cd30 0a 2a 2a 20 74 68 65 20 77 72 69 74 65 2d 74 72  .** the write-tr
1cd40 61 6e 73 61 63 74 69 6f 6e 20 66 6f 72 20 74 68  ansaction for th
1cd50 69 73 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  is database file
1cd60 20 69 73 20 74 6f 20 64 65 6c 65 74 65 20 74 68   is to delete th
1cd70 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 69 6e  e journal..*/.in
1cd80 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  t sqlite3BtreeCo
1cd90 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 42 74 72  mmitPhaseOne(Btr
1cda0 65 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61  ee *p, const cha
1cdb0 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69  r *zMaster){.  i
1cdc0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
1cdd0 4b 3b 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72  K;.  if( p->inTr
1cde0 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans==TRANS_WRITE
1cdf0 20 29 7b 0a 20 20 20 20 42 74 53 68 61 72 65 64   ){.    BtShared
1ce00 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
1ce10 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
1ce20 45 6e 74 65 72 28 70 29 3b 0a 23 69 66 6e 64 65  Enter(p);.#ifnde
1ce30 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
1ce40 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28  TOVACUUM.    if(
1ce50 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
1ce60 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 61   ){.      rc = a
1ce70 75 74 6f 56 61 63 75 75 6d 43 6f 6d 6d 69 74 28  utoVacuumCommit(
1ce80 70 42 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  pBt);.      if( 
1ce90 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1cea0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1ceb0 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
1cec0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
1ced0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1cee0 20 20 20 20 69 66 28 20 70 42 74 2d 3e 62 44 6f      if( pBt->bDo
1cef0 54 72 75 6e 63 61 74 65 20 29 7b 0a 20 20 20 20  Truncate ){.    
1cf00 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72    sqlite3PagerTr
1cf10 75 6e 63 61 74 65 49 6d 61 67 65 28 70 42 74 2d  uncateImage(pBt-
1cf20 3e 70 50 61 67 65 72 2c 20 70 42 74 2d 3e 6e 50  >pPager, pBt->nP
1cf30 61 67 65 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  age);.    }.#end
1cf40 69 66 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  if.    rc = sqli
1cf50 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68  te3PagerCommitPh
1cf60 61 73 65 4f 6e 65 28 70 42 74 2d 3e 70 50 61 67  aseOne(pBt->pPag
1cf70 65 72 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b  er, zMaster, 0);
1cf80 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
1cf90 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a 20  eLeave(p);.  }. 
1cfa0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1cfb0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
1cfc0 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 66 72 6f  on is called fro
1cfd0 6d 20 62 6f 74 68 20 42 74 72 65 65 43 6f 6d 6d  m both BtreeComm
1cfe0 69 74 50 68 61 73 65 54 77 6f 28 29 20 61 6e 64  itPhaseTwo() and
1cff0 20 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 29   BtreeRollback()
1d000 0a 2a 2a 20 61 74 20 74 68 65 20 63 6f 6e 63 6c  .** at the concl
1d010 75 73 69 6f 6e 20 6f 66 20 61 20 74 72 61 6e 73  usion of a trans
1d020 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  action..*/.stati
1d030 63 20 76 6f 69 64 20 62 74 72 65 65 45 6e 64 54  c void btreeEndT
1d040 72 61 6e 73 61 63 74 69 6f 6e 28 42 74 72 65 65  ransaction(Btree
1d050 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64   *p){.  BtShared
1d060 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
1d070 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
1d080 70 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28  p->db;.  assert(
1d090 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c   sqlite3BtreeHol
1d0a0 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 0a 23  dsMutex(p) );..#
1d0b0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1d0c0 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
1d0d0 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65  pBt->bDoTruncate
1d0e0 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 69   = 0;.#endif.  i
1d0f0 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 54 52  f( p->inTrans>TR
1d100 41 4e 53 5f 4e 4f 4e 45 20 26 26 20 64 62 2d 3e  ANS_NONE && db->
1d110 6e 56 64 62 65 52 65 61 64 3e 31 20 29 7b 0a 20  nVdbeRead>1 ){. 
1d120 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61     /* If there a
1d130 72 65 20 6f 74 68 65 72 20 61 63 74 69 76 65 20  re other active 
1d140 73 74 61 74 65 6d 65 6e 74 73 20 74 68 61 74 20  statements that 
1d150 62 65 6c 6f 6e 67 20 74 6f 20 74 68 69 73 20 64  belong to this d
1d160 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 68  atabase.    ** h
1d170 61 6e 64 6c 65 2c 20 64 6f 77 6e 67 72 61 64 65  andle, downgrade
1d180 20 74 6f 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20   to a read-only 
1d190 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65  transaction. The
1d1a0 20 6f 74 68 65 72 20 73 74 61 74 65 6d 65 6e 74   other statement
1d1b0 73 0a 20 20 20 20 2a 2a 20 6d 61 79 20 73 74 69  s.    ** may sti
1d1c0 6c 6c 20 62 65 20 72 65 61 64 69 6e 67 20 66 72  ll be reading fr
1d1d0 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  om the database.
1d1e0 20 20 2a 2f 0a 20 20 20 20 64 6f 77 6e 67 72 61    */.    downgra
1d1f0 64 65 41 6c 6c 53 68 61 72 65 64 43 61 63 68 65  deAllSharedCache
1d200 54 61 62 6c 65 4c 6f 63 6b 73 28 70 29 3b 0a 20  TableLocks(p);. 
1d210 20 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20     p->inTrans = 
1d220 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20 7d 65  TRANS_READ;.  }e
1d230 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74  lse{.    /* If t
1d240 68 65 20 68 61 6e 64 6c 65 20 68 61 64 20 61 6e  he handle had an
1d250 79 20 6b 69 6e 64 20 6f 66 20 74 72 61 6e 73 61  y kind of transa
1d260 63 74 69 6f 6e 20 6f 70 65 6e 2c 20 64 65 63 72  ction open, decr
1d270 65 6d 65 6e 74 20 74 68 65 20 0a 20 20 20 20 2a  ement the .    *
1d280 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f  * transaction co
1d290 75 6e 74 20 6f 66 20 74 68 65 20 73 68 61 72 65  unt of the share
1d2a0 64 20 62 74 72 65 65 2e 20 49 66 20 74 68 65 20  d btree. If the 
1d2b0 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e  transaction coun
1d2c0 74 20 0a 20 20 20 20 2a 2a 20 72 65 61 63 68 65  t .    ** reache
1d2d0 73 20 30 2c 20 73 65 74 20 74 68 65 20 73 68 61  s 0, set the sha
1d2e0 72 65 64 20 73 74 61 74 65 20 74 6f 20 54 52 41  red state to TRA
1d2f0 4e 53 5f 4e 4f 4e 45 2e 20 54 68 65 20 75 6e 6c  NS_NONE. The unl
1d300 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64  ockBtreeIfUnused
1d310 28 29 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 62  ().    ** call b
1d320 65 6c 6f 77 20 77 69 6c 6c 20 75 6e 6c 6f 63 6b  elow will unlock
1d330 20 74 68 65 20 70 61 67 65 72 2e 20 20 2a 2f 0a   the pager.  */.
1d340 20 20 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61      if( p->inTra
1d350 6e 73 21 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29  ns!=TRANS_NONE )
1d360 7b 0a 20 20 20 20 20 20 63 6c 65 61 72 41 6c 6c  {.      clearAll
1d370 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
1d380 4c 6f 63 6b 73 28 70 29 3b 0a 20 20 20 20 20 20  Locks(p);.      
1d390 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f  pBt->nTransactio
1d3a0 6e 2d 2d 3b 0a 20 20 20 20 20 20 69 66 28 20 30  n--;.      if( 0
1d3b0 3d 3d 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74  ==pBt->nTransact
1d3c0 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ion ){.        p
1d3d0 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
1d3e0 6e 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a  n = TRANS_NONE;.
1d3f0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
1d400 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20 63 75     /* Set the cu
1d410 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  rrent transactio
1d420 6e 20 73 74 61 74 65 20 74 6f 20 54 52 41 4e 53  n state to TRANS
1d430 5f 4e 4f 4e 45 20 61 6e 64 20 75 6e 6c 6f 63 6b  _NONE and unlock
1d440 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 70 61 67   the .    ** pag
1d450 65 72 20 69 66 20 74 68 69 73 20 63 61 6c 6c 20  er if this call 
1d460 63 6c 6f 73 65 64 20 74 68 65 20 6f 6e 6c 79 20  closed the only 
1d470 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 72  read or write tr
1d480 61 6e 73 61 63 74 69 6f 6e 2e 20 20 2a 2f 0a 20  ansaction.  */. 
1d490 20 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20     p->inTrans = 
1d4a0 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20  TRANS_NONE;.    
1d4b0 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75  unlockBtreeIfUnu
1d4c0 73 65 64 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 20  sed(pBt);.  }.. 
1d4d0 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28   btreeIntegrity(
1d4e0 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d  p);.}../*.** Com
1d4f0 6d 69 74 20 74 68 65 20 74 72 61 6e 73 61 63 74  mit the transact
1d500 69 6f 6e 20 63 75 72 72 65 6e 74 6c 79 20 69 6e  ion currently in
1d510 20 70 72 6f 67 72 65 73 73 2e 0a 2a 2a 0a 2a 2a   progress..**.**
1d520 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 6d   This routine im
1d530 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 73 65 63  plements the sec
1d540 6f 6e 64 20 70 68 61 73 65 20 6f 66 20 61 20 32  ond phase of a 2
1d550 2d 70 68 61 73 65 20 63 6f 6d 6d 69 74 2e 20 20  -phase commit.  
1d560 54 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74  The.** sqlite3Bt
1d570 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  reeCommitPhaseOn
1d580 65 28 29 20 72 6f 75 74 69 6e 65 20 64 6f 65 73  e() routine does
1d590 20 74 68 65 20 66 69 72 73 74 20 70 68 61 73 65   the first phase
1d5a0 20 61 6e 64 20 73 68 6f 75 6c 64 0a 2a 2a 20 62   and should.** b
1d5b0 65 20 69 6e 76 6f 6b 65 64 20 70 72 69 6f 72 20  e invoked prior 
1d5c0 74 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20  to calling this 
1d5d0 72 6f 75 74 69 6e 65 2e 20 20 54 68 65 20 73 71  routine.  The sq
1d5e0 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
1d5f0 50 68 61 73 65 4f 6e 65 28 29 0a 2a 2a 20 72 6f  PhaseOne().** ro
1d600 75 74 69 6e 65 20 64 69 64 20 61 6c 6c 20 74 68  utine did all th
1d610 65 20 77 6f 72 6b 20 6f 66 20 77 72 69 74 69 6e  e work of writin
1d620 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 75  g information ou
1d630 74 20 74 6f 20 64 69 73 6b 20 61 6e 64 20 66 6c  t to disk and fl
1d640 75 73 68 69 6e 67 20 74 68 65 0a 2a 2a 20 63 6f  ushing the.** co
1d650 6e 74 65 6e 74 73 20 73 6f 20 74 68 61 74 20 74  ntents so that t
1d660 68 65 79 20 61 72 65 20 77 72 69 74 74 65 6e 20  hey are written 
1d670 6f 6e 74 6f 20 74 68 65 20 64 69 73 6b 20 70 6c  onto the disk pl
1d680 61 74 74 65 72 2e 20 20 41 6c 6c 20 74 68 69 73  atter.  All this
1d690 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 68 61 73 20  .** routine has 
1d6a0 74 6f 20 64 6f 20 69 73 20 64 65 6c 65 74 65 20  to do is delete 
1d6b0 6f 72 20 74 72 75 6e 63 61 74 65 20 6f 72 20 7a  or truncate or z
1d6c0 65 72 6f 20 74 68 65 20 68 65 61 64 65 72 20 69  ero the header i
1d6d0 6e 20 74 68 65 0a 2a 2a 20 74 68 65 20 72 6f 6c  n the.** the rol
1d6e0 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 28 77  lback journal (w
1d6f0 68 69 63 68 20 63 61 75 73 65 73 20 74 68 65 20  hich causes the 
1d700 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 6f 20 63  transaction to c
1d710 6f 6d 6d 69 74 29 20 61 6e 64 0a 2a 2a 20 64 72  ommit) and.** dr
1d720 6f 70 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20  op locks..**.** 
1d730 4e 6f 72 6d 61 6c 6c 79 2c 20 69 66 20 61 6e 20  Normally, if an 
1d740 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69  error occurs whi
1d750 6c 65 20 74 68 65 20 70 61 67 65 72 20 6c 61 79  le the pager lay
1d760 65 72 20 69 73 20 61 74 74 65 6d 70 74 69 6e 67  er is attempting
1d770 20 74 6f 20 0a 2a 2a 20 66 69 6e 61 6c 69 7a 65   to .** finalize
1d780 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   the underlying 
1d790 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68  journal file, th
1d7a0 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
1d7b0 72 6e 73 20 61 6e 20 65 72 72 6f 72 20 61 6e 64  rns an error and
1d7c0 0a 2a 2a 20 74 68 65 20 75 70 70 65 72 20 6c 61  .** the upper la
1d7d0 79 65 72 20 77 69 6c 6c 20 61 74 74 65 6d 70 74  yer will attempt
1d7e0 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 20 48 6f 77   a rollback. How
1d7f0 65 76 65 72 2c 20 69 66 20 74 68 65 20 73 65 63  ever, if the sec
1d800 6f 6e 64 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20  ond argument.** 
1d810 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 74 68 65 6e  is non-zero then
1d820 20 74 68 69 73 20 62 2d 74 72 65 65 20 74 72 61   this b-tree tra
1d830 6e 73 61 63 74 69 6f 6e 20 69 73 20 70 61 72 74  nsaction is part
1d840 20 6f 66 20 61 20 6d 75 6c 74 69 2d 66 69 6c 65   of a multi-file
1d850 20 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e   .** transaction
1d860 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20  . In this case, 
1d870 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
1d880 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
1d890 20 63 6f 6d 6d 69 74 74 65 64 20 0a 2a 2a 20 28   committed .** (
1d8a0 62 79 20 64 65 6c 65 74 69 6e 67 20 61 20 6d 61  by deleting a ma
1d8b0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
1d8c0 65 29 20 61 6e 64 20 74 68 65 20 63 61 6c 6c 65  e) and the calle
1d8d0 72 20 77 69 6c 6c 20 69 67 6e 6f 72 65 20 74 68  r will ignore th
1d8e0 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 73  is .** functions
1d8f0 20 72 65 74 75 72 6e 20 63 6f 64 65 2e 20 53 6f   return code. So
1d900 2c 20 65 76 65 6e 20 69 66 20 61 6e 20 65 72 72  , even if an err
1d910 6f 72 20 6f 63 63 75 72 73 20 69 6e 20 74 68 65  or occurs in the
1d920 20 70 61 67 65 72 20 6c 61 79 65 72 2c 0a 2a 2a   pager layer,.**
1d930 20 72 65 73 65 74 20 74 68 65 20 62 2d 74 72 65   reset the b-tre
1d940 65 20 6f 62 6a 65 63 74 73 20 69 6e 74 65 72 6e  e objects intern
1d950 61 6c 20 73 74 61 74 65 20 74 6f 20 69 6e 64 69  al state to indi
1d960 63 61 74 65 20 74 68 61 74 20 74 68 65 20 77 72  cate that the wr
1d970 69 74 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69  ite.** transacti
1d980 6f 6e 20 68 61 73 20 62 65 65 6e 20 63 6c 6f 73  on has been clos
1d990 65 64 2e 20 54 68 69 73 20 69 73 20 71 75 69 74  ed. This is quit
1d9a0 65 20 73 61 66 65 2c 20 61 73 20 74 68 65 20 70  e safe, as the p
1d9b0 61 67 65 72 20 77 69 6c 6c 20 68 61 76 65 0a 2a  ager will have.*
1d9c0 2a 20 74 72 61 6e 73 69 74 69 6f 6e 65 64 20 74  * transitioned t
1d9d0 6f 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74  o the error stat
1d9e0 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 69  e..**.** This wi
1d9f0 6c 6c 20 72 65 6c 65 61 73 65 20 74 68 65 20 77  ll release the w
1da00 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  rite lock on the
1da10 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
1da20 20 49 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65   If there.** are
1da30 20 6e 6f 20 61 63 74 69 76 65 20 63 75 72 73 6f   no active curso
1da40 72 73 2c 20 69 74 20 61 6c 73 6f 20 72 65 6c 65  rs, it also rele
1da50 61 73 65 73 20 74 68 65 20 72 65 61 64 20 6c 6f  ases the read lo
1da60 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ck..*/.int sqlit
1da70 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
1da80 73 65 54 77 6f 28 42 74 72 65 65 20 2a 70 2c 20  seTwo(Btree *p, 
1da90 69 6e 74 20 62 43 6c 65 61 6e 75 70 29 7b 0a 0a  int bCleanup){..
1daa0 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73    if( p->inTrans
1dab0 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 20 72  ==TRANS_NONE ) r
1dac0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1dad0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
1dae0 6e 74 65 72 28 70 29 3b 0a 20 20 62 74 72 65 65  nter(p);.  btree
1daf0 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 0a 20  Integrity(p);.. 
1db00 20 2f 2a 20 49 66 20 74 68 65 20 68 61 6e 64 6c   /* If the handl
1db10 65 20 68 61 73 20 61 20 77 72 69 74 65 2d 74 72  e has a write-tr
1db20 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 2c 20  ansaction open, 
1db30 63 6f 6d 6d 69 74 20 74 68 65 20 73 68 61 72 65  commit the share
1db40 64 2d 62 74 72 65 65 73 20 0a 20 20 2a 2a 20 74  d-btrees .  ** t
1db50 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 73  ransaction and s
1db60 65 74 20 74 68 65 20 73 68 61 72 65 64 20 73 74  et the shared st
1db70 61 74 65 20 74 6f 20 54 52 41 4e 53 5f 52 45 41  ate to TRANS_REA
1db80 44 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  D..  */.  if( p-
1db90 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
1dba0 57 52 49 54 45 20 29 7b 0a 20 20 20 20 69 6e 74  WRITE ){.    int
1dbb0 20 72 63 3b 0a 20 20 20 20 42 74 53 68 61 72 65   rc;.    BtShare
1dbc0 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
1dbd0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74  .    assert( pBt
1dbe0 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d  ->inTransaction=
1dbf0 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a  =TRANS_WRITE );.
1dc00 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
1dc10 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3e 30 20  >nTransaction>0 
1dc20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
1dc30 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68  te3PagerCommitPh
1dc40 61 73 65 54 77 6f 28 70 42 74 2d 3e 70 50 61 67  aseTwo(pBt->pPag
1dc50 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  er);.    if( rc!
1dc60 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 43  =SQLITE_OK && bC
1dc70 6c 65 61 6e 75 70 3d 3d 30 20 29 7b 0a 20 20 20  leanup==0 ){.   
1dc80 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c     sqlite3BtreeL
1dc90 65 61 76 65 28 70 29 3b 0a 20 20 20 20 20 20 72  eave(p);.      r
1dca0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
1dcb0 20 20 20 20 70 2d 3e 69 44 61 74 61 56 65 72 73      p->iDataVers
1dcc0 69 6f 6e 2d 2d 3b 20 20 2f 2a 20 43 6f 6d 70 65  ion--;  /* Compe
1dcd0 6e 73 61 74 65 20 66 6f 72 20 70 50 61 67 65 72  nsate for pPager
1dce0 2d 3e 69 44 61 74 61 56 65 72 73 69 6f 6e 2b 2b  ->iDataVersion++
1dcf0 3b 20 2a 2f 0a 20 20 20 20 70 42 74 2d 3e 69 6e  ; */.    pBt->in
1dd00 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52  Transaction = TR
1dd10 41 4e 53 5f 52 45 41 44 3b 0a 20 20 20 20 62 74  ANS_READ;.    bt
1dd20 72 65 65 43 6c 65 61 72 48 61 73 43 6f 6e 74 65  reeClearHasConte
1dd30 6e 74 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 20 20  nt(pBt);.  }..  
1dd40 62 74 72 65 65 45 6e 64 54 72 61 6e 73 61 63 74  btreeEndTransact
1dd50 69 6f 6e 28 70 29 3b 0a 20 20 73 71 6c 69 74 65  ion(p);.  sqlite
1dd60 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
1dd70 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1dd80 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20  OK;.}../*.** Do 
1dd90 62 6f 74 68 20 70 68 61 73 65 73 20 6f 66 20 61  both phases of a
1dda0 20 63 6f 6d 6d 69 74 2e 0a 2a 2f 0a 69 6e 74 20   commit..*/.int 
1ddb0 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
1ddc0 69 74 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  it(Btree *p){.  
1ddd0 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65  int rc;.  sqlite
1dde0 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
1ddf0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
1de00 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  reeCommitPhaseOn
1de10 65 28 70 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  e(p, 0);.  if( r
1de20 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1de30 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1de40 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
1de50 54 77 6f 28 70 2c 20 30 29 3b 0a 20 20 7d 0a 20  Two(p, 0);.  }. 
1de60 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
1de70 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
1de80 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
1de90 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74  s routine sets t
1dea0 68 65 20 73 74 61 74 65 20 74 6f 20 43 55 52 53  he state to CURS
1deb0 4f 52 5f 46 41 55 4c 54 20 61 6e 64 20 74 68 65  OR_FAULT and the
1dec0 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 74   error.** code t
1ded0 6f 20 65 72 72 43 6f 64 65 20 66 6f 72 20 65 76  o errCode for ev
1dee0 65 72 79 20 63 75 72 73 6f 72 20 6f 6e 20 61 6e  ery cursor on an
1def0 79 20 42 74 53 68 61 72 65 64 20 74 68 61 74 20  y BtShared that 
1df00 70 42 74 72 65 65 0a 2a 2a 20 72 65 66 65 72 65  pBtree.** refere
1df10 6e 63 65 73 2e 20 20 4f 72 20 69 66 20 74 68 65  nces.  Or if the
1df20 20 77 72 69 74 65 4f 6e 6c 79 20 66 6c 61 67 20   writeOnly flag 
1df30 69 73 20 73 65 74 20 74 6f 20 31 2c 20 74 68 65  is set to 1, the
1df40 6e 20 6f 6e 6c 79 0a 2a 2a 20 74 72 69 70 20 77  n only.** trip w
1df50 72 69 74 65 20 63 75 72 73 6f 72 73 20 61 6e 64  rite cursors and
1df60 20 6c 65 61 76 65 20 72 65 61 64 20 63 75 72 73   leave read curs
1df70 6f 72 73 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a  ors unchanged..*
1df80 2a 0a 2a 2a 20 45 76 65 72 79 20 63 75 72 73 6f  *.** Every curso
1df90 72 20 69 73 20 61 20 63 61 6e 64 69 64 61 74 65  r is a candidate
1dfa0 20 74 6f 20 62 65 20 74 72 69 70 70 65 64 2c 20   to be tripped, 
1dfb0 69 6e 63 6c 75 64 69 6e 67 20 63 75 72 73 6f 72  including cursor
1dfc0 73 0a 2a 2a 20 74 68 61 74 20 62 65 6c 6f 6e 67  s.** that belong
1dfd0 20 74 6f 20 6f 74 68 65 72 20 64 61 74 61 62 61   to other databa
1dfe0 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74  se connections t
1dff0 68 61 74 20 68 61 70 70 65 6e 20 74 6f 20 62 65  hat happen to be
1e000 0a 2a 2a 20 73 68 61 72 69 6e 67 20 74 68 65 20  .** sharing the 
1e010 63 61 63 68 65 20 77 69 74 68 20 70 42 74 72 65  cache with pBtre
1e020 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  e..**.** This ro
1e030 75 74 69 6e 65 20 67 65 74 73 20 63 61 6c 6c 65  utine gets calle
1e040 64 20 77 68 65 6e 20 61 20 72 6f 6c 6c 62 61 63  d when a rollbac
1e050 6b 20 6f 63 63 75 72 73 2e 20 49 66 20 74 68 65  k occurs. If the
1e060 20 77 72 69 74 65 4f 6e 6c 79 0a 2a 2a 20 66 6c   writeOnly.** fl
1e070 61 67 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e  ag is true, then
1e080 20 6f 6e 6c 79 20 77 72 69 74 65 2d 63 75 72 73   only write-curs
1e090 6f 72 73 20 6e 65 65 64 20 62 65 20 74 72 69 70  ors need be trip
1e0a0 70 65 64 20 2d 20 72 65 61 64 2d 6f 6e 6c 79 0a  ped - read-only.
1e0b0 2a 2a 20 63 75 72 73 6f 72 73 20 73 61 76 65 20  ** cursors save 
1e0c0 74 68 65 69 72 20 63 75 72 72 65 6e 74 20 70 6f  their current po
1e0d0 73 69 74 69 6f 6e 73 20 73 6f 20 74 68 61 74 20  sitions so that 
1e0e0 74 68 65 79 20 6d 61 79 20 63 6f 6e 74 69 6e 75  they may continu
1e0f0 65 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20  e .** following 
1e100 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 20 4f 72  the rollback. Or
1e110 2c 20 69 66 20 77 72 69 74 65 4f 6e 6c 79 20 69  , if writeOnly i
1e120 73 20 66 61 6c 73 65 2c 20 61 6c 6c 20 63 75 72  s false, all cur
1e130 73 6f 72 73 20 61 72 65 20 0a 2a 2a 20 74 72 69  sors are .** tri
1e140 70 70 65 64 2e 20 49 6e 20 67 65 6e 65 72 61 6c  pped. In general
1e150 2c 20 77 72 69 74 65 4f 6e 6c 79 20 69 73 20 66  , writeOnly is f
1e160 61 6c 73 65 20 69 66 20 74 68 65 20 74 72 61 6e  alse if the tran
1e170 73 61 63 74 69 6f 6e 20 62 65 69 6e 67 0a 2a 2a  saction being.**
1e180 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 6d 6f 64   rolled back mod
1e190 69 66 69 65 64 20 74 68 65 20 64 61 74 61 62 61  ified the databa
1e1a0 73 65 20 73 63 68 65 6d 61 2e 20 49 6e 20 74 68  se schema. In th
1e1b0 69 73 20 63 61 73 65 20 62 2d 74 72 65 65 20 72  is case b-tree r
1e1c0 6f 6f 74 0a 2a 2a 20 70 61 67 65 73 20 6d 61 79  oot.** pages may
1e1d0 20 62 65 20 6d 6f 76 65 64 20 6f 72 20 64 65 6c   be moved or del
1e1e0 65 74 65 64 20 66 72 6f 6d 20 74 68 65 20 64 61  eted from the da
1e1f0 74 61 62 61 73 65 20 61 6c 74 6f 67 65 74 68 65  tabase altogethe
1e200 72 2c 20 6d 61 6b 69 6e 67 0a 2a 2a 20 69 74 20  r, making.** it 
1e210 75 6e 73 61 66 65 20 66 6f 72 20 72 65 61 64 20  unsafe for read 
1e220 63 75 72 73 6f 72 73 20 74 6f 20 63 6f 6e 74 69  cursors to conti
1e230 6e 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  nue..**.** If th
1e240 65 20 77 72 69 74 65 4f 6e 6c 79 20 66 6c 61 67  e writeOnly flag
1e250 20 69 73 20 74 72 75 65 20 61 6e 64 20 61 6e 20   is true and an 
1e260 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74  error is encount
1e270 65 72 65 64 20 77 68 69 6c 65 20 0a 2a 2a 20 73  ered while .** s
1e280 61 76 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e  aving the curren
1e290 74 20 70 6f 73 69 74 69 6f 6e 20 6f 66 20 61 20  t position of a 
1e2a0 72 65 61 64 2d 6f 6e 6c 79 20 63 75 72 73 6f 72  read-only cursor
1e2b0 2c 20 61 6c 6c 20 63 75 72 73 6f 72 73 2c 20 0a  , all cursors, .
1e2c0 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20 61 6c 6c  ** including all
1e2d0 20 72 65 61 64 2d 63 75 72 73 6f 72 73 20 61 72   read-cursors ar
1e2e0 65 20 74 72 69 70 70 65 64 2e 0a 2a 2a 0a 2a 2a  e tripped..**.**
1e2f0 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
1e300 74 75 72 6e 65 64 20 69 66 20 73 75 63 63 65 73  turned if succes
1e310 73 66 75 6c 2c 20 6f 72 20 69 66 20 61 6e 20 65  sful, or if an e
1e320 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c  rror occurs whil
1e330 65 0a 2a 2a 20 73 61 76 69 6e 67 20 61 20 63 75  e.** saving a cu
1e340 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 2c 20 61  rsor position, a
1e350 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  n SQLite error c
1e360 6f 64 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ode..*/.int sqli
1e370 74 65 33 42 74 72 65 65 54 72 69 70 41 6c 6c 43  te3BtreeTripAllC
1e380 75 72 73 6f 72 73 28 42 74 72 65 65 20 2a 70 42  ursors(Btree *pB
1e390 74 72 65 65 2c 20 69 6e 74 20 65 72 72 43 6f 64  tree, int errCod
1e3a0 65 2c 20 69 6e 74 20 77 72 69 74 65 4f 6e 6c 79  e, int writeOnly
1e3b0 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  ){.  BtCursor *p
1e3c0 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
1e3d0 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72  ITE_OK;..  asser
1e3e0 74 28 20 28 77 72 69 74 65 4f 6e 6c 79 3d 3d 30  t( (writeOnly==0
1e3f0 20 7c 7c 20 77 72 69 74 65 4f 6e 6c 79 3d 3d 31   || writeOnly==1
1e400 29 20 26 26 20 42 54 43 46 5f 57 72 69 74 65 46  ) && BTCF_WriteF
1e410 6c 61 67 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20  lag==1 );.  if( 
1e420 70 42 74 72 65 65 20 29 7b 0a 20 20 20 20 73 71  pBtree ){.    sq
1e430 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
1e440 70 42 74 72 65 65 29 3b 0a 20 20 20 20 66 6f 72  pBtree);.    for
1e450 28 70 3d 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e  (p=pBtree->pBt->
1e460 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d  pCursor; p; p=p-
1e470 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69  >pNext){.      i
1e480 6e 74 20 69 3b 0a 20 20 20 20 20 20 69 66 28 20  nt i;.      if( 
1e490 77 72 69 74 65 4f 6e 6c 79 20 26 26 20 28 70 2d  writeOnly && (p-
1e4a0 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46  >curFlags & BTCF
1e4b0 5f 57 72 69 74 65 46 6c 61 67 29 3d 3d 30 20 29  _WriteFlag)==0 )
1e4c0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d  {.        if( p-
1e4d0 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
1e4e0 56 41 4c 49 44 20 7c 7c 20 70 2d 3e 65 53 74 61  VALID || p->eSta
1e4f0 74 65 3d 3d 43 55 52 53 4f 52 5f 53 4b 49 50 4e  te==CURSOR_SKIPN
1e500 45 58 54 20 29 7b 0a 20 20 20 20 20 20 20 20 20  EXT ){.         
1e510 20 72 63 20 3d 20 73 61 76 65 43 75 72 73 6f 72   rc = saveCursor
1e520 50 6f 73 69 74 69 6f 6e 28 70 29 3b 0a 20 20 20  Position(p);.   
1e530 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
1e540 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1e550 20 20 20 20 20 20 20 20 28 76 6f 69 64 29 73 71          (void)sq
1e560 6c 69 74 65 33 42 74 72 65 65 54 72 69 70 41 6c  lite3BtreeTripAl
1e570 6c 43 75 72 73 6f 72 73 28 70 42 74 72 65 65 2c  lCursors(pBtree,
1e580 20 72 63 2c 20 30 29 3b 0a 20 20 20 20 20 20 20   rc, 0);.       
1e590 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1e5a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1e5b0 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
1e5c0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74         sqlite3Bt
1e5d0 72 65 65 43 6c 65 61 72 43 75 72 73 6f 72 28 70  reeClearCursor(p
1e5e0 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53  );.        p->eS
1e5f0 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 46 41  tate = CURSOR_FA
1e600 55 4c 54 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  ULT;.        p->
1e610 73 6b 69 70 4e 65 78 74 20 3d 20 65 72 72 43 6f  skipNext = errCo
1e620 64 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  de;.      }.    
1e630 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 2d    for(i=0; i<=p-
1e640 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20  >iPage; i++){.  
1e650 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
1e660 65 28 70 2d 3e 61 70 50 61 67 65 5b 69 5d 29 3b  e(p->apPage[i]);
1e670 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 70 50 61  .        p->apPa
1e680 67 65 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20  ge[i] = 0;.     
1e690 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c   }.    }.    sql
1e6a0 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
1e6b0 42 74 72 65 65 29 3b 0a 20 20 7d 0a 20 20 72 65  Btree);.  }.  re
1e6c0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1e6d0 2a 20 52 6f 6c 6c 62 61 63 6b 20 74 68 65 20 74  * Rollback the t
1e6e0 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 70 72  ransaction in pr
1e6f0 6f 67 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  ogress..**.** If
1e700 20 74 72 69 70 43 6f 64 65 20 69 73 20 6e 6f 74   tripCode is not
1e710 20 53 51 4c 49 54 45 5f 4f 4b 20 74 68 65 6e 20   SQLITE_OK then 
1e720 63 75 72 73 6f 72 73 20 77 69 6c 6c 20 62 65 20  cursors will be 
1e730 69 6e 76 61 6c 69 64 61 74 65 64 20 28 74 72 69  invalidated (tri
1e740 70 70 65 64 29 2e 0a 2a 2a 20 4f 6e 6c 79 20 77  pped)..** Only w
1e750 72 69 74 65 20 63 75 72 73 6f 72 73 20 61 72 65  rite cursors are
1e760 20 74 72 69 70 70 65 64 20 69 66 20 77 72 69 74   tripped if writ
1e770 65 4f 6e 6c 79 20 69 73 20 74 72 75 65 20 62 75  eOnly is true bu
1e780 74 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 61 72  t all cursors ar
1e790 65 0a 2a 2a 20 74 72 69 70 70 65 64 20 69 66 20  e.** tripped if 
1e7a0 77 72 69 74 65 4f 6e 6c 79 20 69 73 20 66 61 6c  writeOnly is fal
1e7b0 73 65 2e 20 20 41 6e 79 20 61 74 74 65 6d 70 74  se.  Any attempt
1e7c0 20 74 6f 20 75 73 65 0a 2a 2a 20 61 20 74 72 69   to use.** a tri
1e7d0 70 70 65 64 20 63 75 72 73 6f 72 20 77 69 6c 6c  pped cursor will
1e7e0 20 72 65 73 75 6c 74 20 69 6e 20 61 6e 20 65 72   result in an er
1e7f0 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ror..**.** This 
1e800 77 69 6c 6c 20 72 65 6c 65 61 73 65 20 74 68 65  will release the
1e810 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74   write lock on t
1e820 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1e830 2e 20 20 49 66 20 74 68 65 72 65 0a 2a 2a 20 61  .  If there.** a
1e840 72 65 20 6e 6f 20 61 63 74 69 76 65 20 63 75 72  re no active cur
1e850 73 6f 72 73 2c 20 69 74 20 61 6c 73 6f 20 72 65  sors, it also re
1e860 6c 65 61 73 65 73 20 74 68 65 20 72 65 61 64 20  leases the read 
1e870 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  lock..*/.int sql
1e880 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63  ite3BtreeRollbac
1e890 6b 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  k(Btree *p, int 
1e8a0 74 72 69 70 43 6f 64 65 2c 20 69 6e 74 20 77 72  tripCode, int wr
1e8b0 69 74 65 4f 6e 6c 79 29 7b 0a 20 20 69 6e 74 20  iteOnly){.  int 
1e8c0 72 63 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  rc;.  BtShared *
1e8d0 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
1e8e0 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 3b  MemPage *pPage1;
1e8f0 0a 0a 20 20 61 73 73 65 72 74 28 20 77 72 69 74  ..  assert( writ
1e900 65 4f 6e 6c 79 3d 3d 31 20 7c 7c 20 77 72 69 74  eOnly==1 || writ
1e910 65 4f 6e 6c 79 3d 3d 30 20 29 3b 0a 20 20 61 73  eOnly==0 );.  as
1e920 73 65 72 74 28 20 74 72 69 70 43 6f 64 65 3d 3d  sert( tripCode==
1e930 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c  SQLITE_ABORT_ROL
1e940 4c 42 41 43 4b 20 7c 7c 20 74 72 69 70 43 6f 64  LBACK || tripCod
1e950 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  e==SQLITE_OK );.
1e960 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
1e970 74 65 72 28 70 29 3b 0a 20 20 69 66 28 20 74 72  ter(p);.  if( tr
1e980 69 70 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f  ipCode==SQLITE_O
1e990 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 74 72  K ){.    rc = tr
1e9a0 69 70 43 6f 64 65 20 3d 20 73 61 76 65 41 6c 6c  ipCode = saveAll
1e9b0 43 75 72 73 6f 72 73 28 70 42 74 2c 20 30 2c 20  Cursors(pBt, 0, 
1e9c0 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  0);.    if( rc )
1e9d0 20 77 72 69 74 65 4f 6e 6c 79 20 3d 20 30 3b 0a   writeOnly = 0;.
1e9e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20    }else{.    rc 
1e9f0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  = SQLITE_OK;.  }
1ea00 0a 20 20 69 66 28 20 74 72 69 70 43 6f 64 65 20  .  if( tripCode 
1ea10 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 32 20 3d  ){.    int rc2 =
1ea20 20 73 71 6c 69 74 65 33 42 74 72 65 65 54 72 69   sqlite3BtreeTri
1ea30 70 41 6c 6c 43 75 72 73 6f 72 73 28 70 2c 20 74  pAllCursors(p, t
1ea40 72 69 70 43 6f 64 65 2c 20 77 72 69 74 65 4f 6e  ripCode, writeOn
1ea50 6c 79 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ly);.    assert(
1ea60 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc==SQLITE_OK |
1ea70 7c 20 28 77 72 69 74 65 4f 6e 6c 79 3d 3d 30 20  | (writeOnly==0 
1ea80 26 26 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 4f  && rc2==SQLITE_O
1ea90 4b 29 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63  K) );.    if( rc
1eaa0 32 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  2!=SQLITE_OK ) r
1eab0 63 20 3d 20 72 63 32 3b 0a 20 20 7d 0a 20 20 62  c = rc2;.  }.  b
1eac0 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29  treeIntegrity(p)
1ead0 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72  ;..  if( p->inTr
1eae0 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans==TRANS_WRITE
1eaf0 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 32 3b   ){.    int rc2;
1eb00 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 54 52  ..    assert( TR
1eb10 41 4e 53 5f 57 52 49 54 45 3d 3d 70 42 74 2d 3e  ANS_WRITE==pBt->
1eb20 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 29 3b  inTransaction );
1eb30 0a 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74  .    rc2 = sqlit
1eb40 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28  e3PagerRollback(
1eb50 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20  pBt->pPager);.  
1eb60 20 20 69 66 28 20 72 63 32 21 3d 53 51 4c 49 54    if( rc2!=SQLIT
1eb70 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
1eb80 20 3d 20 72 63 32 3b 0a 20 20 20 20 7d 0a 0a 20   = rc2;.    }.. 
1eb90 20 20 20 2f 2a 20 54 68 65 20 72 6f 6c 6c 62 61     /* The rollba
1eba0 63 6b 20 6d 61 79 20 68 61 76 65 20 64 65 73 74  ck may have dest
1ebb0 72 6f 79 65 64 20 74 68 65 20 70 50 61 67 65 31  royed the pPage1
1ebc0 2d 3e 61 44 61 74 61 20 76 61 6c 75 65 2e 20 20  ->aData value.  
1ebd0 53 6f 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 62  So.    ** call b
1ebe0 74 72 65 65 47 65 74 50 61 67 65 28 29 20 6f 6e  treeGetPage() on
1ebf0 20 70 61 67 65 20 31 20 61 67 61 69 6e 20 74 6f   page 1 again to
1ec00 20 6d 61 6b 65 0a 20 20 20 20 2a 2a 20 73 75 72   make.    ** sur
1ec10 65 20 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20  e pPage1->aData 
1ec20 69 73 20 73 65 74 20 63 6f 72 72 65 63 74 6c 79  is set correctly
1ec30 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 62 74 72  . */.    if( btr
1ec40 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 31  eeGetPage(pBt, 1
1ec50 2c 20 26 70 50 61 67 65 31 2c 20 30 29 3d 3d 53  , &pPage1, 0)==S
1ec60 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1ec70 20 20 69 6e 74 20 6e 50 61 67 65 20 3d 20 67 65    int nPage = ge
1ec80 74 34 62 79 74 65 28 32 38 2b 28 75 38 2a 29 70  t4byte(28+(u8*)p
1ec90 50 61 67 65 31 2d 3e 61 44 61 74 61 29 3b 0a 20  Page1->aData);. 
1eca0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e       testcase( n
1ecb0 50 61 67 65 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Page==0 );.     
1ecc0 20 69 66 28 20 6e 50 61 67 65 3d 3d 30 20 29 20   if( nPage==0 ) 
1ecd0 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
1ece0 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65  count(pBt->pPage
1ecf0 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 20 20  r, &nPage);.    
1ed00 20 20 74 65 73 74 63 61 73 65 28 20 70 42 74 2d    testcase( pBt-
1ed10 3e 6e 50 61 67 65 21 3d 6e 50 61 67 65 20 29 3b  >nPage!=nPage );
1ed20 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 50 61 67  .      pBt->nPag
1ed30 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20 20  e = nPage;.     
1ed40 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61   releasePage(pPa
1ed50 67 65 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ge1);.    }.    
1ed60 61 73 73 65 72 74 28 20 63 6f 75 6e 74 56 61 6c  assert( countVal
1ed70 69 64 43 75 72 73 6f 72 73 28 70 42 74 2c 20 31  idCursors(pBt, 1
1ed80 29 3d 3d 30 20 29 3b 0a 20 20 20 20 70 42 74 2d  )==0 );.    pBt-
1ed90 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d  >inTransaction =
1eda0 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20 20   TRANS_READ;.   
1edb0 20 62 74 72 65 65 43 6c 65 61 72 48 61 73 43 6f   btreeClearHasCo
1edc0 6e 74 65 6e 74 28 70 42 74 29 3b 0a 20 20 7d 0a  ntent(pBt);.  }.
1edd0 0a 20 20 62 74 72 65 65 45 6e 64 54 72 61 6e 73  .  btreeEndTrans
1ede0 61 63 74 69 6f 6e 28 70 29 3b 0a 20 20 73 71 6c  action(p);.  sql
1edf0 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
1ee00 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
1ee10 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 61 72 74 20 61  }../*.** Start a
1ee20 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62 74 72   statement subtr
1ee30 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 73  ansaction. The s
1ee40 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 61  ubtransaction ca
1ee50 6e 20 62 65 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62  n be rolled.** b
1ee60 61 63 6b 20 69 6e 64 65 70 65 6e 64 65 6e 74 6c  ack independentl
1ee70 79 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 74 72  y of the main tr
1ee80 61 6e 73 61 63 74 69 6f 6e 2e 20 59 6f 75 20 6d  ansaction. You m
1ee90 75 73 74 20 73 74 61 72 74 20 61 20 74 72 61 6e  ust start a tran
1eea0 73 61 63 74 69 6f 6e 20 0a 2a 2a 20 62 65 66 6f  saction .** befo
1eeb0 72 65 20 73 74 61 72 74 69 6e 67 20 61 20 73 75  re starting a su
1eec0 62 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68  btransaction. Th
1eed0 65 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e  e subtransaction
1eee0 20 69 73 20 65 6e 64 65 64 20 61 75 74 6f 6d 61   is ended automa
1eef0 74 69 63 61 6c 6c 79 20 0a 2a 2a 20 69 66 20 74  tically .** if t
1ef00 68 65 20 6d 61 69 6e 20 74 72 61 6e 73 61 63 74  he main transact
1ef10 69 6f 6e 20 63 6f 6d 6d 69 74 73 20 6f 72 20 72  ion commits or r
1ef20 6f 6c 6c 73 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a  olls back..**.**
1ef30 20 53 74 61 74 65 6d 65 6e 74 20 73 75 62 74 72   Statement subtr
1ef40 61 6e 73 61 63 74 69 6f 6e 73 20 61 72 65 20 75  ansactions are u
1ef50 73 65 64 20 61 72 6f 75 6e 64 20 69 6e 64 69 76  sed around indiv
1ef60 69 64 75 61 6c 20 53 51 4c 20 73 74 61 74 65 6d  idual SQL statem
1ef70 65 6e 74 73 0a 2a 2a 20 74 68 61 74 20 61 72 65  ents.** that are
1ef80 20 63 6f 6e 74 61 69 6e 65 64 20 77 69 74 68 69   contained withi
1ef90 6e 20 61 20 42 45 47 49 4e 2e 2e 2e 43 4f 4d 4d  n a BEGIN...COMM
1efa0 49 54 20 62 6c 6f 63 6b 2e 20 20 49 66 20 61 20  IT block.  If a 
1efb0 63 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a 20 65 72  constraint.** er
1efc0 72 6f 72 20 6f 63 63 75 72 73 20 77 69 74 68 69  ror occurs withi
1efd0 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 2c  n the statement,
1efe0 20 74 68 65 20 65 66 66 65 63 74 20 6f 66 20 74   the effect of t
1eff0 68 61 74 20 6f 6e 65 20 73 74 61 74 65 6d 65 6e  hat one statemen
1f000 74 0a 2a 2a 20 63 61 6e 20 62 65 20 72 6f 6c 6c  t.** can be roll
1f010 65 64 20 62 61 63 6b 20 77 69 74 68 6f 75 74 20  ed back without 
1f020 68 61 76 69 6e 67 20 74 6f 20 72 6f 6c 6c 62 61  having to rollba
1f030 63 6b 20 74 68 65 20 65 6e 74 69 72 65 20 74 72  ck the entire tr
1f040 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  ansaction..**.**
1f050 20 41 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62   A statement sub
1f060 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20  -transaction is 
1f070 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 61  implemented as a
1f080 6e 20 61 6e 6f 6e 79 6d 6f 75 73 20 73 61 76 65  n anonymous save
1f090 70 6f 69 6e 74 2e 20 54 68 65 0a 2a 2a 20 76 61  point. The.** va
1f0a0 6c 75 65 20 70 61 73 73 65 64 20 61 73 20 74 68  lue passed as th
1f0b0 65 20 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74  e second paramet
1f0c0 65 72 20 69 73 20 74 68 65 20 74 6f 74 61 6c 20  er is the total 
1f0d0 6e 75 6d 62 65 72 20 6f 66 20 73 61 76 65 70 6f  number of savepo
1f0e0 69 6e 74 73 2c 0a 2a 2a 20 69 6e 63 6c 75 64 69  ints,.** includi
1f0f0 6e 67 20 74 68 65 20 6e 65 77 20 61 6e 6f 6e 79  ng the new anony
1f100 6d 6f 75 73 20 73 61 76 65 70 6f 69 6e 74 2c 20  mous savepoint, 
1f110 6f 70 65 6e 20 6f 6e 20 74 68 65 20 42 2d 54 72  open on the B-Tr
1f120 65 65 2e 20 69 2e 65 2e 20 69 66 20 74 68 65 72  ee. i.e. if ther
1f130 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74 69  e.** are no acti
1f140 76 65 20 73 61 76 65 70 6f 69 6e 74 73 20 61 6e  ve savepoints an
1f150 64 20 6e 6f 20 6f 74 68 65 72 20 73 74 61 74 65  d no other state
1f160 6d 65 6e 74 2d 74 72 61 6e 73 61 63 74 69 6f 6e  ment-transaction
1f170 73 20 6f 70 65 6e 2c 0a 2a 2a 20 69 53 74 61 74  s open,.** iStat
1f180 65 6d 65 6e 74 20 69 73 20 31 2e 20 54 68 69 73  ement is 1. This
1f190 20 61 6e 6f 6e 79 6d 6f 75 73 20 73 61 76 65 70   anonymous savep
1f1a0 6f 69 6e 74 20 63 61 6e 20 62 65 20 72 65 6c 65  oint can be rele
1f1b0 61 73 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20 62  ased or rolled b
1f1c0 61 63 6b 0a 2a 2a 20 75 73 69 6e 67 20 74 68 65  ack.** using the
1f1d0 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 61 76   sqlite3BtreeSav
1f1e0 65 70 6f 69 6e 74 28 29 20 66 75 6e 63 74 69 6f  epoint() functio
1f1f0 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  n..*/.int sqlite
1f200 33 42 74 72 65 65 42 65 67 69 6e 53 74 6d 74 28  3BtreeBeginStmt(
1f210 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 69 53  Btree *p, int iS
1f220 74 61 74 65 6d 65 6e 74 29 7b 0a 20 20 69 6e 74  tatement){.  int
1f230 20 72 63 3b 0a 20 20 42 74 53 68 61 72 65 64 20   rc;.  BtShared 
1f240 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
1f250 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
1f260 65 72 28 70 29 3b 0a 20 20 61 73 73 65 72 74 28  er(p);.  assert(
1f270 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41   p->inTrans==TRA
1f280 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 61 73  NS_WRITE );.  as
1f290 73 65 72 74 28 20 28 70 42 74 2d 3e 62 74 73 46  sert( (pBt->btsF
1f2a0 6c 61 67 73 20 26 20 42 54 53 5f 52 45 41 44 5f  lags & BTS_READ_
1f2b0 4f 4e 4c 59 29 3d 3d 30 20 29 3b 0a 20 20 61 73  ONLY)==0 );.  as
1f2c0 73 65 72 74 28 20 69 53 74 61 74 65 6d 65 6e 74  sert( iStatement
1f2d0 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >0 );.  assert( 
1f2e0 69 53 74 61 74 65 6d 65 6e 74 3e 70 2d 3e 64 62  iStatement>p->db
1f2f0 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20 29 3b 0a  ->nSavepoint );.
1f300 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69    assert( pBt->i
1f310 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52  nTransaction==TR
1f320 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 2f  ANS_WRITE );.  /
1f330 2a 20 41 74 20 74 68 65 20 70 61 67 65 72 20 6c  * At the pager l
1f340 65 76 65 6c 2c 20 61 20 73 74 61 74 65 6d 65 6e  evel, a statemen
1f350 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  t transaction is
1f360 20 61 20 73 61 76 65 70 6f 69 6e 74 20 77 69 74   a savepoint wit
1f370 68 0a 20 20 2a 2a 20 61 6e 20 69 6e 64 65 78 20  h.  ** an index 
1f380 67 72 65 61 74 65 72 20 74 68 61 6e 20 61 6c 6c  greater than all
1f390 20 73 61 76 65 70 6f 69 6e 74 73 20 63 72 65 61   savepoints crea
1f3a0 74 65 64 20 65 78 70 6c 69 63 69 74 6c 79 20 75  ted explicitly u
1f3b0 73 69 6e 67 0a 20 20 2a 2a 20 53 51 4c 20 73 74  sing.  ** SQL st
1f3c0 61 74 65 6d 65 6e 74 73 2e 20 49 74 20 69 73 20  atements. It is 
1f3d0 69 6c 6c 65 67 61 6c 20 74 6f 20 6f 70 65 6e 2c  illegal to open,
1f3e0 20 72 65 6c 65 61 73 65 20 6f 72 20 72 6f 6c 6c   release or roll
1f3f0 62 61 63 6b 20 61 6e 79 0a 20 20 2a 2a 20 73 75  back any.  ** su
1f400 63 68 20 73 61 76 65 70 6f 69 6e 74 73 20 77 68  ch savepoints wh
1f410 69 6c 65 20 74 68 65 20 73 74 61 74 65 6d 65 6e  ile the statemen
1f420 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 61  t transaction sa
1f430 76 65 70 6f 69 6e 74 20 69 73 20 61 63 74 69 76  vepoint is activ
1f440 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73  e..  */.  rc = s
1f450 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 53  qlite3PagerOpenS
1f460 61 76 65 70 6f 69 6e 74 28 70 42 74 2d 3e 70 50  avepoint(pBt->pP
1f470 61 67 65 72 2c 20 69 53 74 61 74 65 6d 65 6e 74  ager, iStatement
1f480 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
1f490 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
1f4a0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1f4b0 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   The second argu
1f4c0 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e  ment to this fun
1f4d0 63 74 69 6f 6e 2c 20 6f 70 2c 20 69 73 20 61 6c  ction, op, is al
1f4e0 77 61 79 73 20 53 41 56 45 50 4f 49 4e 54 5f 52  ways SAVEPOINT_R
1f4f0 4f 4c 4c 42 41 43 4b 0a 2a 2a 20 6f 72 20 53 41  OLLBACK.** or SA
1f500 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2e  VEPOINT_RELEASE.
1f510 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 65   This function e
1f520 69 74 68 65 72 20 72 65 6c 65 61 73 65 73 20 6f  ither releases o
1f530 72 20 72 6f 6c 6c 73 20 62 61 63 6b 20 74 68 65  r rolls back the
1f540 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 20 69 64  .** savepoint id
1f550 65 6e 74 69 66 69 65 64 20 62 79 20 70 61 72 61  entified by para
1f560 6d 65 74 65 72 20 69 53 61 76 65 70 6f 69 6e 74  meter iSavepoint
1f570 2c 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 74  , depending on t
1f580 68 65 20 76 61 6c 75 65 20 0a 2a 2a 20 6f 66 20  he value .** of 
1f590 6f 70 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c  op..**.** Normal
1f5a0 6c 79 2c 20 69 53 61 76 65 70 6f 69 6e 74 20 69  ly, iSavepoint i
1f5b0 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f  s greater than o
1f5c0 72 20 65 71 75 61 6c 20 74 6f 20 7a 65 72 6f 2e  r equal to zero.
1f5d0 20 48 6f 77 65 76 65 72 2c 20 69 66 20 6f 70 20   However, if op 
1f5e0 69 73 0a 2a 2a 20 53 41 56 45 50 4f 49 4e 54 5f  is.** SAVEPOINT_
1f5f0 52 4f 4c 4c 42 41 43 4b 2c 20 74 68 65 6e 20 69  ROLLBACK, then i
1f600 53 61 76 65 70 6f 69 6e 74 20 6d 61 79 20 61 6c  Savepoint may al
1f610 73 6f 20 62 65 20 2d 31 2e 20 49 6e 20 74 68 69  so be -1. In thi
1f620 73 20 63 61 73 65 20 74 68 65 20 0a 2a 2a 20 63  s case the .** c
1f630 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 65  ontents of the e
1f640 6e 74 69 72 65 20 74 72 61 6e 73 61 63 74 69 6f  ntire transactio
1f650 6e 20 61 72 65 20 72 6f 6c 6c 65 64 20 62 61 63  n are rolled bac
1f660 6b 2e 20 54 68 69 73 20 69 73 20 64 69 66 66 65  k. This is diffe
1f670 72 65 6e 74 0a 2a 2a 20 66 72 6f 6d 20 61 20 6e  rent.** from a n
1f680 6f 72 6d 61 6c 20 74 72 61 6e 73 61 63 74 69 6f  ormal transactio
1f690 6e 20 72 6f 6c 6c 62 61 63 6b 2c 20 61 73 20 6e  n rollback, as n
1f6a0 6f 20 6c 6f 63 6b 73 20 61 72 65 20 72 65 6c 65  o locks are rele
1f6b0 61 73 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20  ased and the.** 
1f6c0 74 72 61 6e 73 61 63 74 69 6f 6e 20 72 65 6d 61  transaction rema
1f6d0 69 6e 73 20 6f 70 65 6e 2e 0a 2a 2f 0a 69 6e 74  ins open..*/.int
1f6e0 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 61 76   sqlite3BtreeSav
1f6f0 65 70 6f 69 6e 74 28 42 74 72 65 65 20 2a 70 2c  epoint(Btree *p,
1f700 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20 69 53 61   int op, int iSa
1f710 76 65 70 6f 69 6e 74 29 7b 0a 20 20 69 6e 74 20  vepoint){.  int 
1f720 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1f730 20 20 69 66 28 20 70 20 26 26 20 70 2d 3e 69 6e    if( p && p->in
1f740 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49  Trans==TRANS_WRI
1f750 54 45 20 29 7b 0a 20 20 20 20 42 74 53 68 61 72  TE ){.    BtShar
1f760 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
1f770 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6f 70  ;.    assert( op
1f780 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45  ==SAVEPOINT_RELE
1f790 41 53 45 20 7c 7c 20 6f 70 3d 3d 53 41 56 45 50  ASE || op==SAVEP
1f7a0 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 3b  OINT_ROLLBACK );
1f7b0 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 53 61  .    assert( iSa
1f7c0 76 65 70 6f 69 6e 74 3e 3d 30 20 7c 7c 20 28 69  vepoint>=0 || (i
1f7d0 53 61 76 65 70 6f 69 6e 74 3d 3d 2d 31 20 26 26  Savepoint==-1 &&
1f7e0 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52   op==SAVEPOINT_R
1f7f0 4f 4c 4c 42 41 43 4b 29 20 29 3b 0a 20 20 20 20  OLLBACK) );.    
1f800 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
1f810 72 28 70 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  r(p);.    rc = s
1f820 71 6c 69 74 65 33 50 61 67 65 72 53 61 76 65 70  qlite3PagerSavep
1f830 6f 69 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72  oint(pBt->pPager
1f840 2c 20 6f 70 2c 20 69 53 61 76 65 70 6f 69 6e 74  , op, iSavepoint
1f850 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
1f860 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1f870 20 20 69 66 28 20 69 53 61 76 65 70 6f 69 6e 74    if( iSavepoint
1f880 3c 30 20 26 26 20 28 70 42 74 2d 3e 62 74 73 46  <0 && (pBt->btsF
1f890 6c 61 67 73 20 26 20 42 54 53 5f 49 4e 49 54 49  lags & BTS_INITI
1f8a0 41 4c 4c 59 5f 45 4d 50 54 59 29 21 3d 30 20 29  ALLY_EMPTY)!=0 )
1f8b0 7b 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e 6e  {.        pBt->n
1f8c0 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Page = 0;.      
1f8d0 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 6e 65 77  }.      rc = new
1f8e0 44 61 74 61 62 61 73 65 28 70 42 74 29 3b 0a 20  Database(pBt);. 
1f8f0 20 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 20       pBt->nPage 
1f900 3d 20 67 65 74 34 62 79 74 65 28 32 38 20 2b 20  = get4byte(28 + 
1f910 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61  pBt->pPage1->aDa
1f920 74 61 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 54  ta);..      /* T
1f930 68 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65  he database size
1f940 20 77 61 73 20 77 72 69 74 74 65 6e 20 69 6e 74   was written int
1f950 6f 20 74 68 65 20 6f 66 66 73 65 74 20 32 38 20  o the offset 28 
1f960 6f 66 20 74 68 65 20 68 65 61 64 65 72 0a 20 20  of the header.  
1f970 20 20 20 20 2a 2a 20 77 68 65 6e 20 74 68 65 20      ** when the 
1f980 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 74 61 72  transaction star
1f990 74 65 64 2c 20 73 6f 20 77 65 20 6b 6e 6f 77 20  ted, so we know 
1f9a0 74 68 61 74 20 74 68 65 20 76 61 6c 75 65 20 61  that the value a
1f9b0 74 20 6f 66 66 73 65 74 0a 20 20 20 20 20 20 2a  t offset.      *
1f9c0 2a 20 32 38 20 69 73 20 6e 6f 6e 7a 65 72 6f 2e  * 28 is nonzero.
1f9d0 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
1f9e0 28 20 70 42 74 2d 3e 6e 50 61 67 65 3e 30 20 29  ( pBt->nPage>0 )
1f9f0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
1fa00 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
1fa10 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
1fa20 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  c;.}../*.** Crea
1fa30 74 65 20 61 20 6e 65 77 20 63 75 72 73 6f 72 20  te a new cursor 
1fa40 66 6f 72 20 74 68 65 20 42 54 72 65 65 20 77 68  for the BTree wh
1fa50 6f 73 65 20 72 6f 6f 74 20 69 73 20 6f 6e 20 74  ose root is on t
1fa60 68 65 20 70 61 67 65 0a 2a 2a 20 69 54 61 62 6c  he page.** iTabl
1fa70 65 2e 20 49 66 20 61 20 72 65 61 64 2d 6f 6e 6c  e. If a read-onl
1fa80 79 20 63 75 72 73 6f 72 20 69 73 20 72 65 71 75  y cursor is requ
1fa90 65 73 74 65 64 2c 20 69 74 20 69 73 20 61 73 73  ested, it is ass
1faa0 75 6d 65 64 20 74 68 61 74 0a 2a 2a 20 74 68 65  umed that.** the
1fab0 20 63 61 6c 6c 65 72 20 61 6c 72 65 61 64 79 20   caller already 
1fac0 68 61 73 20 61 74 20 6c 65 61 73 74 20 61 20 72  has at least a r
1fad0 65 61 64 2d 6f 6e 6c 79 20 74 72 61 6e 73 61 63  ead-only transac
1fae0 74 69 6f 6e 20 6f 70 65 6e 0a 2a 2a 20 6f 6e 20  tion open.** on 
1faf0 74 68 65 20 64 61 74 61 62 61 73 65 20 61 6c 72  the database alr
1fb00 65 61 64 79 2e 20 49 66 20 61 20 77 72 69 74 65  eady. If a write
1fb10 2d 63 75 72 73 6f 72 20 69 73 20 72 65 71 75 65  -cursor is reque
1fb20 73 74 65 64 2c 20 74 68 65 6e 0a 2a 2a 20 74 68  sted, then.** th
1fb30 65 20 63 61 6c 6c 65 72 20 69 73 20 61 73 73 75  e caller is assu
1fb40 6d 65 64 20 74 6f 20 68 61 76 65 20 61 6e 20 6f  med to have an o
1fb50 70 65 6e 20 77 72 69 74 65 20 74 72 61 6e 73 61  pen write transa
1fb60 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ction..**.** If 
1fb70 77 72 46 6c 61 67 3d 3d 30 2c 20 74 68 65 6e 20  wrFlag==0, then 
1fb80 74 68 65 20 63 75 72 73 6f 72 20 63 61 6e 20 6f  the cursor can o
1fb90 6e 6c 79 20 62 65 20 75 73 65 64 20 66 6f 72 20  nly be used for 
1fba0 72 65 61 64 69 6e 67 2e 0a 2a 2a 20 49 66 20 77  reading..** If w
1fbb0 72 46 6c 61 67 3d 3d 31 2c 20 74 68 65 6e 20 74  rFlag==1, then t
1fbc0 68 65 20 63 75 72 73 6f 72 20 63 61 6e 20 62 65  he cursor can be
1fbd0 20 75 73 65 64 20 66 6f 72 20 72 65 61 64 69 6e   used for readin
1fbe0 67 20 6f 72 20 66 6f 72 0a 2a 2a 20 77 72 69 74  g or for.** writ
1fbf0 69 6e 67 20 69 66 20 6f 74 68 65 72 20 63 6f 6e  ing if other con
1fc00 64 69 74 69 6f 6e 73 20 66 6f 72 20 77 72 69 74  ditions for writ
1fc10 69 6e 67 20 61 72 65 20 61 6c 73 6f 20 6d 65 74  ing are also met
1fc20 2e 20 20 54 68 65 73 65 0a 2a 2a 20 61 72 65 20  .  These.** are 
1fc30 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20 74  the conditions t
1fc40 68 61 74 20 6d 75 73 74 20 62 65 20 6d 65 74 20  hat must be met 
1fc50 69 6e 20 6f 72 64 65 72 20 66 6f 72 20 77 72 69  in order for wri
1fc60 74 69 6e 67 20 74 6f 0a 2a 2a 20 62 65 20 61 6c  ting to.** be al
1fc70 6c 6f 77 65 64 3a 0a 2a 2a 0a 2a 2a 20 31 3a 20  lowed:.**.** 1: 
1fc80 20 54 68 65 20 63 75 72 73 6f 72 20 6d 75 73 74   The cursor must
1fc90 20 68 61 76 65 20 62 65 65 6e 20 6f 70 65 6e 65   have been opene
1fca0 64 20 77 69 74 68 20 77 72 46 6c 61 67 3d 3d 31  d with wrFlag==1
1fcb0 0a 2a 2a 0a 2a 2a 20 32 3a 20 20 4f 74 68 65 72  .**.** 2:  Other
1fcc0 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
1fcd0 74 69 6f 6e 73 20 74 68 61 74 20 73 68 61 72 65  tions that share
1fce0 20 74 68 65 20 73 61 6d 65 20 70 61 67 65 72 20   the same pager 
1fcf0 63 61 63 68 65 0a 2a 2a 20 20 20 20 20 62 75 74  cache.**     but
1fd00 20 77 68 69 63 68 20 61 72 65 20 6e 6f 74 20 69   which are not i
1fd10 6e 20 74 68 65 20 52 45 41 44 5f 55 4e 43 4f 4d  n the READ_UNCOM
1fd20 4d 49 54 54 45 44 20 73 74 61 74 65 20 6d 61 79  MITTED state may
1fd30 20 6e 6f 74 20 68 61 76 65 0a 2a 2a 20 20 20 20   not have.**    
1fd40 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 77 69   cursors open wi
1fd50 74 68 20 77 72 46 6c 61 67 3d 3d 30 20 6f 6e 20  th wrFlag==0 on 
1fd60 74 68 65 20 73 61 6d 65 20 74 61 62 6c 65 2e 20  the same table. 
1fd70 20 4f 74 68 65 72 77 69 73 65 0a 2a 2a 20 20 20   Otherwise.**   
1fd80 20 20 74 68 65 20 63 68 61 6e 67 65 73 20 6d 61    the changes ma
1fd90 64 65 20 62 79 20 74 68 69 73 20 77 72 69 74 65  de by this write
1fda0 20 63 75 72 73 6f 72 20 77 6f 75 6c 64 20 62 65   cursor would be
1fdb0 20 76 69 73 69 62 6c 65 20 74 6f 0a 2a 2a 20 20   visible to.**  
1fdc0 20 20 20 74 68 65 20 72 65 61 64 20 63 75 72 73     the read curs
1fdd0 6f 72 73 20 69 6e 20 74 68 65 20 6f 74 68 65 72  ors in the other
1fde0 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
1fdf0 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 33 3a 20 20  tion..**.** 3:  
1fe00 54 68 65 20 64 61 74 61 62 61 73 65 20 6d 75 73  The database mus
1fe10 74 20 62 65 20 77 72 69 74 61 62 6c 65 20 28 6e  t be writable (n
1fe20 6f 74 20 6f 6e 20 72 65 61 64 2d 6f 6e 6c 79 20  ot on read-only 
1fe30 6d 65 64 69 61 29 0a 2a 2a 0a 2a 2a 20 34 3a 20  media).**.** 4: 
1fe40 20 54 68 65 72 65 20 6d 75 73 74 20 62 65 20 61   There must be a
1fe50 6e 20 61 63 74 69 76 65 20 74 72 61 6e 73 61 63  n active transac
1fe60 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 20 63  tion..**.** No c
1fe70 68 65 63 6b 69 6e 67 20 69 73 20 64 6f 6e 65 20  hecking is done 
1fe80 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61  to make sure tha
1fe90 74 20 70 61 67 65 20 69 54 61 62 6c 65 20 72 65  t page iTable re
1fea0 61 6c 6c 79 20 69 73 20 74 68 65 0a 2a 2a 20 72  ally is the.** r
1feb0 6f 6f 74 20 70 61 67 65 20 6f 66 20 61 20 62 2d  oot page of a b-
1fec0 74 72 65 65 2e 20 20 49 66 20 69 74 20 69 73 20  tree.  If it is 
1fed0 6e 6f 74 2c 20 74 68 65 6e 20 74 68 65 20 63 75  not, then the cu
1fee0 72 73 6f 72 20 61 63 71 75 69 72 65 64 0a 2a 2a  rsor acquired.**
1fef0 20 77 69 6c 6c 20 6e 6f 74 20 77 6f 72 6b 20 63   will not work c
1ff00 6f 72 72 65 63 74 6c 79 2e 0a 2a 2a 0a 2a 2a 20  orrectly..**.** 
1ff10 49 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68  It is assumed th
1ff20 61 74 20 74 68 65 20 73 71 6c 69 74 65 33 42 74  at the sqlite3Bt
1ff30 72 65 65 43 75 72 73 6f 72 5a 65 72 6f 28 29 20  reeCursorZero() 
1ff40 68 61 73 20 62 65 65 6e 20 63 61 6c 6c 65 64 0a  has been called.
1ff50 2a 2a 20 6f 6e 20 70 43 75 72 20 74 6f 20 69 6e  ** on pCur to in
1ff60 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6d 65 6d  itialize the mem
1ff70 6f 72 79 20 73 70 61 63 65 20 70 72 69 6f 72 20  ory space prior 
1ff80 74 6f 20 69 6e 76 6f 6b 69 6e 67 20 74 68 69 73  to invoking this
1ff90 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 73 74 61   routine..*/.sta
1ffa0 74 69 63 20 69 6e 74 20 62 74 72 65 65 43 75 72  tic int btreeCur
1ffb0 73 6f 72 28 0a 20 20 42 74 72 65 65 20 2a 70 2c  sor(.  Btree *p,
1ffc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ffd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1ffe0 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20   The btree */.  
1fff0 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20  int iTable,     
20000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20010 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70         /* Root p
20020 61 67 65 20 6f 66 20 74 61 62 6c 65 20 74 6f 20  age of table to 
20030 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 77 72  open */.  int wr
20040 46 6c 61 67 2c 20 20 20 20 20 20 20 20 20 20 20  Flag,           
20050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20060 20 2f 2a 20 31 20 74 6f 20 77 72 69 74 65 2e 20   /* 1 to write. 
20070 30 20 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20  0 read-only */. 
20080 20 73 74 72 75 63 74 20 4b 65 79 49 6e 66 6f 20   struct KeyInfo 
20090 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20 20  *pKeyInfo,      
200a0 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
200b0 20 61 72 67 20 74 6f 20 63 6f 6d 70 61 72 69 73   arg to comparis
200c0 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  on function */. 
200d0 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 20   BtCursor *pCur 
200e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
200f0 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65          /* Space
20100 20 66 6f 72 20 6e 65 77 20 63 75 72 73 6f 72 20   for new cursor 
20110 2a 2f 0a 29 7b 0a 20 20 42 74 53 68 61 72 65 64  */.){.  BtShared
20120 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 20   *pBt = p->pBt; 
20130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
20140 2a 20 53 68 61 72 65 64 20 62 2d 74 72 65 65 20  * Shared b-tree 
20150 68 61 6e 64 6c 65 20 2a 2f 0a 0a 20 20 61 73 73  handle */..  ass
20160 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65  ert( sqlite3Btre
20170 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29  eHoldsMutex(p) )
20180 3b 0a 20 20 61 73 73 65 72 74 28 20 77 72 46 6c  ;.  assert( wrFl
20190 61 67 3d 3d 30 20 7c 7c 20 77 72 46 6c 61 67 3d  ag==0 || wrFlag=
201a0 3d 31 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  =1 );..  /* The 
201b0 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74  following assert
201c0 20 73 74 61 74 65 6d 65 6e 74 73 20 76 65 72 69   statements veri
201d0 66 79 20 74 68 61 74 20 69 66 20 74 68 69 73 20  fy that if this 
201e0 69 73 20 61 20 73 68 61 72 61 62 6c 65 20 0a 20  is a sharable . 
201f0 20 2a 2a 20 62 2d 74 72 65 65 20 64 61 74 61 62   ** b-tree datab
20200 61 73 65 2c 20 74 68 65 20 63 6f 6e 6e 65 63 74  ase, the connect
20210 69 6f 6e 20 69 73 20 68 6f 6c 64 69 6e 67 20 74  ion is holding t
20220 68 65 20 72 65 71 75 69 72 65 64 20 74 61 62 6c  he required tabl
20230 65 20 6c 6f 63 6b 73 2c 20 0a 20 20 2a 2a 20 61  e locks, .  ** a
20240 6e 64 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72  nd that no other
20250 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 73 20   connection has 
20260 61 6e 79 20 6f 70 65 6e 20 63 75 72 73 6f 72 20  any open cursor 
20270 74 68 61 74 20 63 6f 6e 66 6c 69 63 74 73 20 77  that conflicts w
20280 69 74 68 20 0a 20 20 2a 2a 20 74 68 69 73 20 6c  ith .  ** this l
20290 6f 63 6b 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72  ock.  */.  asser
202a0 74 28 20 68 61 73 53 68 61 72 65 64 43 61 63 68  t( hasSharedCach
202b0 65 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 69 54  eTableLock(p, iT
202c0 61 62 6c 65 2c 20 70 4b 65 79 49 6e 66 6f 21 3d  able, pKeyInfo!=
202d0 30 2c 20 77 72 46 6c 61 67 2b 31 29 20 29 3b 0a  0, wrFlag+1) );.
202e0 20 20 61 73 73 65 72 74 28 20 77 72 46 6c 61 67    assert( wrFlag
202f0 3d 3d 30 20 7c 7c 20 21 68 61 73 52 65 61 64 43  ==0 || !hasReadC
20300 6f 6e 66 6c 69 63 74 73 28 70 2c 20 69 54 61 62  onflicts(p, iTab
20310 6c 65 29 20 29 3b 0a 0a 20 20 2f 2a 20 41 73 73  le) );..  /* Ass
20320 65 72 74 20 74 68 61 74 20 74 68 65 20 63 61 6c  ert that the cal
20330 6c 65 72 20 68 61 73 20 6f 70 65 6e 65 64 20 74  ler has opened t
20340 68 65 20 72 65 71 75 69 72 65 64 20 74 72 61 6e  he required tran
20350 73 61 63 74 69 6f 6e 2e 20 2a 2f 0a 20 20 61 73  saction. */.  as
20360 73 65 72 74 28 20 70 2d 3e 69 6e 54 72 61 6e 73  sert( p->inTrans
20370 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 3b 0a 20  >TRANS_NONE );. 
20380 20 61 73 73 65 72 74 28 20 77 72 46 6c 61 67 3d   assert( wrFlag=
20390 3d 30 20 7c 7c 20 70 2d 3e 69 6e 54 72 61 6e 73  =0 || p->inTrans
203a0 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b  ==TRANS_WRITE );
203b0 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
203c0 70 50 61 67 65 31 20 26 26 20 70 42 74 2d 3e 70  pPage1 && pBt->p
203d0 50 61 67 65 31 2d 3e 61 44 61 74 61 20 29 3b 0a  Page1->aData );.
203e0 0a 20 20 69 66 28 20 4e 45 56 45 52 28 77 72 46  .  if( NEVER(wrF
203f0 6c 61 67 20 26 26 20 28 70 42 74 2d 3e 62 74 73  lag && (pBt->bts
20400 46 6c 61 67 73 20 26 20 42 54 53 5f 52 45 41 44  Flags & BTS_READ
20410 5f 4f 4e 4c 59 29 21 3d 30 29 20 29 7b 0a 20 20  _ONLY)!=0) ){.  
20420 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
20430 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d 0a 20 20  READONLY;.  }.  
20440 69 66 28 20 77 72 46 6c 61 67 20 29 7b 0a 20 20  if( wrFlag ){.  
20450 20 20 61 6c 6c 6f 63 61 74 65 54 65 6d 70 53 70    allocateTempSp
20460 61 63 65 28 70 42 74 29 3b 0a 20 20 20 20 69 66  ace(pBt);.    if
20470 28 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65  ( pBt->pTmpSpace
20480 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
20490 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20  ITE_NOMEM;.  }. 
204a0 20 69 66 28 20 69 54 61 62 6c 65 3d 3d 31 20 26   if( iTable==1 &
204b0 26 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74  & btreePagecount
204c0 28 70 42 74 29 3d 3d 30 20 29 7b 0a 20 20 20 20  (pBt)==0 ){.    
204d0 61 73 73 65 72 74 28 20 77 72 46 6c 61 67 3d 3d  assert( wrFlag==
204e0 30 20 29 3b 0a 20 20 20 20 69 54 61 62 6c 65 20  0 );.    iTable 
204f0 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e  = 0;.  }..  /* N
20500 6f 77 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72  ow that no other
20510 20 65 72 72 6f 72 73 20 63 61 6e 20 6f 63 63 75   errors can occu
20520 72 2c 20 66 69 6e 69 73 68 20 66 69 6c 6c 69 6e  r, finish fillin
20530 67 20 69 6e 20 74 68 65 20 42 74 43 75 72 73 6f  g in the BtCurso
20540 72 0a 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 73  r.  ** variables
20550 20 61 6e 64 20 6c 69 6e 6b 20 74 68 65 20 63 75   and link the cu
20560 72 73 6f 72 20 69 6e 74 6f 20 74 68 65 20 42 74  rsor into the Bt
20570 53 68 61 72 65 64 20 6c 69 73 74 2e 20 20 2a 2f  Shared list.  */
20580 0a 20 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f  .  pCur->pgnoRoo
20590 74 20 3d 20 28 50 67 6e 6f 29 69 54 61 62 6c 65  t = (Pgno)iTable
205a0 3b 0a 20 20 70 43 75 72 2d 3e 69 50 61 67 65 20  ;.  pCur->iPage 
205b0 3d 20 2d 31 3b 0a 20 20 70 43 75 72 2d 3e 70 4b  = -1;.  pCur->pK
205c0 65 79 49 6e 66 6f 20 3d 20 70 4b 65 79 49 6e 66  eyInfo = pKeyInf
205d0 6f 3b 0a 20 20 70 43 75 72 2d 3e 70 42 74 72 65  o;.  pCur->pBtre
205e0 65 20 3d 20 70 3b 0a 20 20 70 43 75 72 2d 3e 70  e = p;.  pCur->p
205f0 42 74 20 3d 20 70 42 74 3b 0a 20 20 61 73 73 65  Bt = pBt;.  asse
20600 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c  rt( wrFlag==0 ||
20610 20 77 72 46 6c 61 67 3d 3d 42 54 43 46 5f 57 72   wrFlag==BTCF_Wr
20620 69 74 65 46 6c 61 67 20 29 3b 0a 20 20 70 43 75  iteFlag );.  pCu
20630 72 2d 3e 63 75 72 46 6c 61 67 73 20 3d 20 77 72  r->curFlags = wr
20640 46 6c 61 67 3b 0a 20 20 70 43 75 72 2d 3e 70 4e  Flag;.  pCur->pN
20650 65 78 74 20 3d 20 70 42 74 2d 3e 70 43 75 72 73  ext = pBt->pCurs
20660 6f 72 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e  or;.  if( pCur->
20670 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 70 43 75  pNext ){.    pCu
20680 72 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20  r->pNext->pPrev 
20690 3d 20 70 43 75 72 3b 0a 20 20 7d 0a 20 20 70 42  = pCur;.  }.  pB
206a0 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20 70 43 75  t->pCursor = pCu
206b0 72 3b 0a 20 20 70 43 75 72 2d 3e 65 53 74 61 74  r;.  pCur->eStat
206c0 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  e = CURSOR_INVAL
206d0 49 44 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ID;.  return SQL
206e0 49 54 45 5f 4f 4b 3b 0a 7d 0a 69 6e 74 20 73 71  ITE_OK;.}.int sq
206f0 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
20700 28 0a 20 20 42 74 72 65 65 20 2a 70 2c 20 20 20  (.  Btree *p,   
20710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20730 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a  /* The btree */.
20740 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20    int iTable,   
20750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
20770 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 61   Root page of ta
20780 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20  ble to open */. 
20790 20 69 6e 74 20 77 72 46 6c 61 67 2c 20 20 20 20   int wrFlag,    
207a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
207b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
207c0 31 20 74 6f 20 77 72 69 74 65 2e 20 30 20 72 65  1 to write. 0 re
207d0 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74 72  ad-only */.  str
207e0 75 63 74 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65  uct KeyInfo *pKe
207f0 79 49 6e 66 6f 2c 20 20 20 20 20 20 20 20 20 20  yInfo,          
20800 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
20810 74 20 61 72 67 20 74 6f 20 78 43 6f 6d 70 61 72  t arg to xCompar
20820 65 28 29 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f  e() */.  BtCurso
20830 72 20 2a 70 43 75 72 20 20 20 20 20 20 20 20 20  r *pCur         
20840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20850 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 6e 65       /* Write ne
20860 77 20 63 75 72 73 6f 72 20 68 65 72 65 20 2a 2f  w cursor here */
20870 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
20880 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
20890 72 28 70 29 3b 0a 20 20 72 63 20 3d 20 62 74 72  r(p);.  rc = btr
208a0 65 65 43 75 72 73 6f 72 28 70 2c 20 69 54 61 62  eeCursor(p, iTab
208b0 6c 65 2c 20 77 72 46 6c 61 67 2c 20 70 4b 65 79  le, wrFlag, pKey
208c0 49 6e 66 6f 2c 20 70 43 75 72 29 3b 0a 20 20 73  Info, pCur);.  s
208d0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
208e0 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
208f0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
20900 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20 61 20  n the size of a 
20910 42 74 43 75 72 73 6f 72 20 6f 62 6a 65 63 74 20  BtCursor object 
20920 69 6e 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20  in bytes..**.** 
20930 54 68 69 73 20 69 6e 74 65 72 66 61 63 65 73 20  This interfaces 
20940 69 73 20 6e 65 65 64 65 64 20 73 6f 20 74 68 61  is needed so tha
20950 74 20 75 73 65 72 73 20 6f 66 20 63 75 72 73 6f  t users of curso
20960 72 73 20 63 61 6e 20 70 72 65 61 6c 6c 6f 63 61  rs can prealloca
20970 74 65 0a 2a 2a 20 73 75 66 66 69 63 69 65 6e 74  te.** sufficient
20980 20 73 74 6f 72 61 67 65 20 74 6f 20 68 6f 6c 64   storage to hold
20990 20 61 20 63 75 72 73 6f 72 2e 20 20 54 68 65 20   a cursor.  The 
209a0 42 74 43 75 72 73 6f 72 20 6f 62 6a 65 63 74 20  BtCursor object 
209b0 69 73 20 6f 70 61 71 75 65 0a 2a 2a 20 74 6f 20  is opaque.** to 
209c0 75 73 65 72 73 20 73 6f 20 74 68 65 79 20 63 61  users so they ca
209d0 6e 6e 6f 74 20 64 6f 20 74 68 65 20 73 69 7a 65  nnot do the size
209e0 6f 66 28 29 20 74 68 65 6d 73 65 6c 76 65 73 20  of() themselves 
209f0 2d 20 74 68 65 79 20 6d 75 73 74 20 63 61 6c 6c  - they must call
20a00 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
20a10 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
20a20 42 74 72 65 65 43 75 72 73 6f 72 53 69 7a 65 28  BtreeCursorSize(
20a30 76 6f 69 64 29 7b 0a 20 20 72 65 74 75 72 6e 20  void){.  return 
20a40 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 42 74  ROUND8(sizeof(Bt
20a50 43 75 72 73 6f 72 29 29 3b 0a 7d 0a 0a 2f 2a 0a  Cursor));.}../*.
20a60 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 6d 65  ** Initialize me
20a70 6d 6f 72 79 20 74 68 61 74 20 77 69 6c 6c 20 62  mory that will b
20a80 65 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f  e converted into
20a90 20 61 20 42 74 43 75 72 73 6f 72 20 6f 62 6a 65   a BtCursor obje
20aa0 63 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 69  ct..**.** The si
20ab0 6d 70 6c 65 20 61 70 70 72 6f 61 63 68 20 68 65  mple approach he
20ac0 72 65 20 77 6f 75 6c 64 20 62 65 20 74 6f 20 6d  re would be to m
20ad0 65 6d 73 65 74 28 29 20 74 68 65 20 65 6e 74 69  emset() the enti
20ae0 72 65 20 6f 62 6a 65 63 74 0a 2a 2a 20 74 6f 20  re object.** to 
20af0 7a 65 72 6f 2e 20 20 42 75 74 20 69 74 20 74 75  zero.  But it tu
20b00 72 6e 73 20 6f 75 74 20 74 68 61 74 20 74 68 65  rns out that the
20b10 20 61 70 50 61 67 65 5b 5d 20 61 6e 64 20 61 69   apPage[] and ai
20b20 49 64 78 5b 5d 20 61 72 72 61 79 73 0a 2a 2a 20  Idx[] arrays.** 
20b30 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62  do not need to b
20b40 65 20 7a 65 72 6f 65 64 20 61 6e 64 20 74 68 65  e zeroed and the
20b50 79 20 61 72 65 20 6c 61 72 67 65 2c 20 73 6f 20  y are large, so 
20b60 77 65 20 63 61 6e 20 73 61 76 65 20 61 20 6c 6f  we can save a lo
20b70 74 0a 2a 2a 20 6f 66 20 72 75 6e 2d 74 69 6d 65  t.** of run-time
20b80 20 62 79 20 73 6b 69 70 70 69 6e 67 20 74 68 65   by skipping the
20b90 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20   initialization 
20ba0 6f 66 20 74 68 6f 73 65 20 65 6c 65 6d 65 6e 74  of those element
20bb0 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
20bc0 65 33 42 74 72 65 65 43 75 72 73 6f 72 5a 65 72  e3BtreeCursorZer
20bd0 6f 28 42 74 43 75 72 73 6f 72 20 2a 70 29 7b 0a  o(BtCursor *p){.
20be0 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 6f    memset(p, 0, o
20bf0 66 66 73 65 74 6f 66 28 42 74 43 75 72 73 6f 72  ffsetof(BtCursor
20c00 2c 20 69 50 61 67 65 29 29 3b 0a 7d 0a 0a 2f 2a  , iPage));.}../*
20c10 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 63 75 72 73  .** Close a curs
20c20 6f 72 2e 20 20 54 68 65 20 72 65 61 64 20 6c 6f  or.  The read lo
20c30 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
20c40 73 65 20 66 69 6c 65 20 69 73 20 72 65 6c 65 61  se file is relea
20c50 73 65 64 0a 2a 2a 20 77 68 65 6e 20 74 68 65 20  sed.** when the 
20c60 6c 61 73 74 20 63 75 72 73 6f 72 20 69 73 20 63  last cursor is c
20c70 6c 6f 73 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  losed..*/.int sq
20c80 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 43  lite3BtreeCloseC
20c90 75 72 73 6f 72 28 42 74 43 75 72 73 6f 72 20 2a  ursor(BtCursor *
20ca0 70 43 75 72 29 7b 0a 20 20 42 74 72 65 65 20 2a  pCur){.  Btree *
20cb0 70 42 74 72 65 65 20 3d 20 70 43 75 72 2d 3e 70  pBtree = pCur->p
20cc0 42 74 72 65 65 3b 0a 20 20 69 66 28 20 70 42 74  Btree;.  if( pBt
20cd0 72 65 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ree ){.    int i
20ce0 3b 0a 20 20 20 20 42 74 53 68 61 72 65 64 20 2a  ;.    BtShared *
20cf0 70 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b  pBt = pCur->pBt;
20d00 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
20d10 65 45 6e 74 65 72 28 70 42 74 72 65 65 29 3b 0a  eEnter(pBtree);.
20d20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
20d30 43 6c 65 61 72 43 75 72 73 6f 72 28 70 43 75 72  ClearCursor(pCur
20d40 29 3b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d  );.    if( pCur-
20d50 3e 70 50 72 65 76 20 29 7b 0a 20 20 20 20 20 20  >pPrev ){.      
20d60 70 43 75 72 2d 3e 70 50 72 65 76 2d 3e 70 4e 65  pCur->pPrev->pNe
20d70 78 74 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74  xt = pCur->pNext
20d80 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
20d90 20 20 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20     pBt->pCursor 
20da0 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20  = pCur->pNext;. 
20db0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 43 75     }.    if( pCu
20dc0 72 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20  r->pNext ){.    
20dd0 20 20 70 43 75 72 2d 3e 70 4e 65 78 74 2d 3e 70    pCur->pNext->p
20de0 50 72 65 76 20 3d 20 70 43 75 72 2d 3e 70 50 72  Prev = pCur->pPr
20df0 65 76 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f  ev;.    }.    fo
20e00 72 28 69 3d 30 3b 20 69 3c 3d 70 43 75 72 2d 3e  r(i=0; i<=pCur->
20e10 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20  iPage; i++){.   
20e20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
20e30 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d 29 3b  Cur->apPage[i]);
20e40 0a 20 20 20 20 7d 0a 20 20 20 20 75 6e 6c 6f 63  .    }.    unloc
20e50 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 70  kBtreeIfUnused(p
20e60 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Bt);.    sqlite3
20e70 5f 66 72 65 65 28 70 43 75 72 2d 3e 61 4f 76 65  _free(pCur->aOve
20e80 72 66 6c 6f 77 29 3b 0a 20 20 20 20 2f 2a 20 73  rflow);.    /* s
20e90 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75 72  qlite3_free(pCur
20ea0 29 3b 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  ); */.    sqlite
20eb0 33 42 74 72 65 65 4c 65 61 76 65 28 70 42 74 72  3BtreeLeave(pBtr
20ec0 65 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ee);.  }.  retur
20ed0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
20ee0 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20  /*.** Make sure 
20ef0 74 68 65 20 42 74 43 75 72 73 6f 72 2a 20 67 69  the BtCursor* gi
20f00 76 65 6e 20 69 6e 20 74 68 65 20 61 72 67 75 6d  ven in the argum
20f10 65 6e 74 20 68 61 73 20 61 20 76 61 6c 69 64 0a  ent has a valid.
20f20 2a 2a 20 42 74 43 75 72 73 6f 72 2e 69 6e 66 6f  ** BtCursor.info
20f30 20 73 74 72 75 63 74 75 72 65 2e 20 20 49 66 20   structure.  If 
20f40 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  it is not alread
20f50 79 20 76 61 6c 69 64 2c 20 63 61 6c 6c 0a 2a 2a  y valid, call.**
20f60 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28   btreeParseCell(
20f70 29 20 74 6f 20 66 69 6c 6c 20 69 74 20 69 6e 2e  ) to fill it in.
20f80 0a 2a 2a 0a 2a 2a 20 42 74 43 75 72 73 6f 72 2e  .**.** BtCursor.
20f90 69 6e 66 6f 20 69 73 20 61 20 63 61 63 68 65 20  info is a cache 
20fa0 6f 66 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69  of the informati
20fb0 6f 6e 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e  on in the curren
20fc0 74 20 63 65 6c 6c 2e 0a 2a 2a 20 55 73 69 6e 67  t cell..** Using
20fd0 20 74 68 69 73 20 63 61 63 68 65 20 72 65 64 75   this cache redu
20fe0 63 65 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ces the number o
20ff0 66 20 63 61 6c 6c 73 20 74 6f 20 62 74 72 65 65  f calls to btree
21000 50 61 72 73 65 43 65 6c 6c 28 29 2e 0a 2a 2a 0a  ParseCell()..**.
21010 2a 2a 20 32 30 30 37 2d 30 36 2d 32 35 3a 20 20  ** 2007-06-25:  
21020 54 68 65 72 65 20 69 73 20 61 20 62 75 67 20 69  There is a bug i
21030 6e 20 73 6f 6d 65 20 76 65 72 73 69 6f 6e 73 20  n some versions 
21040 6f 66 20 4d 53 56 43 20 74 68 61 74 20 63 61 75  of MSVC that cau
21050 73 65 20 74 68 65 0a 2a 2a 20 63 6f 6d 70 69 6c  se the.** compil
21060 65 72 20 74 6f 20 63 72 61 73 68 20 77 68 65 6e  er to crash when
21070 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 29 20 69   getCellInfo() i
21080 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73  s implemented as
21090 20 61 20 6d 61 63 72 6f 2e 0a 2a 2a 20 42 75 74   a macro..** But
210a0 20 74 68 65 72 65 20 69 73 20 61 20 6d 65 61 73   there is a meas
210b0 75 72 65 61 62 6c 65 20 73 70 65 65 64 20 61 64  ureable speed ad
210c0 76 61 6e 74 61 67 65 20 74 6f 20 75 73 69 6e 67  vantage to using
210d0 20 74 68 65 20 6d 61 63 72 6f 20 6f 6e 20 67 63   the macro on gc
210e0 63 0a 2a 2a 20 28 77 68 65 6e 20 6c 65 73 73 20  c.** (when less 
210f0 63 6f 6d 70 69 6c 65 72 20 6f 70 74 69 6d 69 7a  compiler optimiz
21100 61 74 69 6f 6e 73 20 6c 69 6b 65 20 2d 4f 73 20  ations like -Os 
21110 6f 72 20 2d 4f 30 20 61 72 65 20 75 73 65 64 20  or -O0 are used 
21120 61 6e 64 20 74 68 65 0a 2a 2a 20 63 6f 6d 70 69  and the.** compi
21130 6c 65 72 20 69 73 20 6e 6f 74 20 64 6f 69 6e 67  ler is not doing
21140 20 61 67 67 72 65 73 73 69 76 65 20 69 6e 6c 69   aggressive inli
21150 6e 69 6e 67 2e 29 20 20 53 6f 20 77 65 20 75 73  ning.)  So we us
21160 65 20 61 20 72 65 61 6c 20 66 75 6e 63 74 69 6f  e a real functio
21170 6e 0a 2a 2a 20 66 6f 72 20 4d 53 56 43 20 61 6e  n.** for MSVC an
21180 64 20 61 20 6d 61 63 72 6f 20 66 6f 72 20 65 76  d a macro for ev
21190 65 72 79 74 68 69 6e 67 20 65 6c 73 65 2e 20 20  erything else.  
211a0 54 69 63 6b 65 74 20 23 32 34 35 37 2e 0a 2a 2f  Ticket #2457..*/
211b0 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
211c0 20 20 73 74 61 74 69 63 20 76 6f 69 64 20 61 73    static void as
211d0 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28 42 74 43  sertCellInfo(BtC
211e0 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
211f0 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b    CellInfo info;
21200 0a 20 20 20 20 69 6e 74 20 69 50 61 67 65 20 3d  .    int iPage =
21210 20 70 43 75 72 2d 3e 69 50 61 67 65 3b 0a 20 20   pCur->iPage;.  
21220 20 20 6d 65 6d 73 65 74 28 26 69 6e 66 6f 2c 20    memset(&info, 
21230 30 2c 20 73 69 7a 65 6f 66 28 69 6e 66 6f 29 29  0, sizeof(info))
21240 3b 0a 20 20 20 20 62 74 72 65 65 50 61 72 73 65  ;.    btreeParse
21250 43 65 6c 6c 28 70 43 75 72 2d 3e 61 70 50 61 67  Cell(pCur->apPag
21260 65 5b 69 50 61 67 65 5d 2c 20 70 43 75 72 2d 3e  e[iPage], pCur->
21270 61 69 49 64 78 5b 69 50 61 67 65 5d 2c 20 26 69  aiIdx[iPage], &i
21280 6e 66 6f 29 3b 0a 20 20 20 20 61 73 73 65 72 74  nfo);.    assert
21290 28 20 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20  ( CORRUPT_DB || 
212a0 6d 65 6d 63 6d 70 28 26 69 6e 66 6f 2c 20 26 70  memcmp(&info, &p
212b0 43 75 72 2d 3e 69 6e 66 6f 2c 20 73 69 7a 65 6f  Cur->info, sizeo
212c0 66 28 69 6e 66 6f 29 29 3d 3d 30 20 29 3b 0a 20  f(info))==0 );. 
212d0 20 7d 0a 23 65 6c 73 65 0a 20 20 23 64 65 66 69   }.#else.  #defi
212e0 6e 65 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66  ne assertCellInf
212f0 6f 28 78 29 0a 23 65 6e 64 69 66 0a 23 69 66 64  o(x).#endif.#ifd
21300 65 66 20 5f 4d 53 43 5f 56 45 52 0a 20 20 2f 2a  ef _MSC_VER.  /*
21310 20 55 73 65 20 61 20 72 65 61 6c 20 66 75 6e 63   Use a real func
21320 74 69 6f 6e 20 69 6e 20 4d 53 56 43 20 74 6f 20  tion in MSVC to 
21330 77 6f 72 6b 20 61 72 6f 75 6e 64 20 62 75 67 73  work around bugs
21340 20 69 6e 20 74 68 61 74 20 63 6f 6d 70 69 6c 65   in that compile
21350 72 2e 20 2a 2f 0a 20 20 73 74 61 74 69 63 20 76  r. */.  static v
21360 6f 69 64 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28  oid getCellInfo(
21370 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
21380 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69  .    if( pCur->i
21390 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 7b 0a  nfo.nSize==0 ){.
213a0 20 20 20 20 20 20 69 6e 74 20 69 50 61 67 65 20        int iPage 
213b0 3d 20 70 43 75 72 2d 3e 69 50 61 67 65 3b 0a 20  = pCur->iPage;. 
213c0 20 20 20 20 20 62 74 72 65 65 50 61 72 73 65 43       btreeParseC
213d0 65 6c 6c 28 70 43 75 72 2d 3e 61 70 50 61 67 65  ell(pCur->apPage
213e0 5b 69 50 61 67 65 5d 2c 70 43 75 72 2d 3e 61 69  [iPage],pCur->ai
213f0 49 64 78 5b 69 50 61 67 65 5d 2c 26 70 43 75 72  Idx[iPage],&pCur
21400 2d 3e 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 70  ->info);.      p
21410 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d  Cur->curFlags |=
21420 20 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 3b   BTCF_ValidNKey;
21430 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
21440 20 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f    assertCellInfo
21450 28 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20  (pCur);.    }.  
21460 7d 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20 6e 6f  }.#else /* if no
21470 74 20 5f 4d 53 43 5f 56 45 52 20 2a 2f 0a 20 20  t _MSC_VER */.  
21480 2f 2a 20 55 73 65 20 61 20 6d 61 63 72 6f 20 69  /* Use a macro i
21490 6e 20 61 6c 6c 20 6f 74 68 65 72 20 63 6f 6d 70  n all other comp
214a0 69 6c 65 72 73 20 73 6f 20 74 68 61 74 20 74 68  ilers so that th
214b0 65 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e  e function is in
214c0 6c 69 6e 65 64 20 2a 2f 0a 23 64 65 66 69 6e 65  lined */.#define
214d0 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75   getCellInfo(pCu
214e0 72 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r)              
214f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21510 20 20 20 20 20 20 20 20 5c 0a 20 20 69 66 28 20          \.  if( 
21520 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
21530 3d 3d 30 20 29 7b 20 20 20 20 20 20 20 20 20 20  ==0 ){          
21540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21560 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 69           \.    i
21570 6e 74 20 69 50 61 67 65 20 3d 20 70 43 75 72 2d  nt iPage = pCur-
21580 3e 69 50 61 67 65 3b 20 20 20 20 20 20 20 20 20  >iPage;         
21590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
215a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
215b0 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20            \.    
215c0 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 70  btreeParseCell(p
215d0 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 50 61 67  Cur->apPage[iPag
215e0 65 5d 2c 70 43 75 72 2d 3e 61 69 49 64 78 5b 69  e],pCur->aiIdx[i
215f0 50 61 67 65 5d 2c 26 70 43 75 72 2d 3e 69 6e 66  Page],&pCur->inf
21600 6f 29 3b 20 20 20 20 20 20 20 20 5c 0a 20 20 20  o);        \.   
21610 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20   pCur->curFlags 
21620 7c 3d 20 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65  |= BTCF_ValidNKe
21630 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y;              
21640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21650 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
21660 7d 65 6c 73 65 7b 20 20 20 20 20 20 20 20 20 20  }else{          
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 20 20 20 20 20 20 20 20                  
21690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
216a0 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
216b0 20 20 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66     assertCellInf
216c0 6f 28 70 43 75 72 29 3b 20 20 20 20 20 20 20 20  o(pCur);        
216d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
216e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
216f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
21700 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 5f 4d    }.#endif /* _M
21710 53 43 5f 56 45 52 20 2a 2f 0a 0a 23 69 66 6e 64  SC_VER */..#ifnd
21720 65 66 20 4e 44 45 42 55 47 20 20 2f 2a 20 54 68  ef NDEBUG  /* Th
21730 65 20 6e 65 78 74 20 72 6f 75 74 69 6e 65 20 75  e next routine u
21740 73 65 64 20 6f 6e 6c 79 20 77 69 74 68 69 6e 20  sed only within 
21750 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65  assert() stateme
21760 6e 74 73 20 2a 2f 0a 2f 2a 0a 2a 2a 20 52 65 74  nts */./*.** Ret
21770 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20  urn true if the 
21780 67 69 76 65 6e 20 42 74 43 75 72 73 6f 72 20 69  given BtCursor i
21790 73 20 76 61 6c 69 64 2e 20 20 41 20 76 61 6c 69  s valid.  A vali
217a0 64 20 63 75 72 73 6f 72 20 69 73 20 6f 6e 65 0a  d cursor is one.
217b0 2a 2a 20 74 68 61 74 20 69 73 20 63 75 72 72 65  ** that is curre
217c0 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f  ntly pointing to
217d0 20 61 20 72 6f 77 20 69 6e 20 61 20 28 6e 6f 6e   a row in a (non
217e0 2d 65 6d 70 74 79 29 20 74 61 62 6c 65 2e 0a 2a  -empty) table..*
217f0 2a 20 54 68 69 73 20 69 73 20 61 20 76 65 72 69  * This is a veri
21800 66 69 63 61 74 69 6f 6e 20 72 6f 75 74 69 6e 65  fication routine
21810 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 77 69   is used only wi
21820 74 68 69 6e 20 61 73 73 65 72 74 28 29 20 73 74  thin assert() st
21830 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 69 6e 74  atements..*/.int
21840 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
21850 73 6f 72 49 73 56 61 6c 69 64 28 42 74 43 75 72  sorIsValid(BtCur
21860 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 72 65  sor *pCur){.  re
21870 74 75 72 6e 20 70 43 75 72 20 26 26 20 70 43 75  turn pCur && pCu
21880 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
21890 52 5f 56 41 4c 49 44 3b 0a 7d 0a 23 65 6e 64 69  R_VALID;.}.#endi
218a0 66 20 2f 2a 20 4e 44 45 42 55 47 20 2a 2f 0a 0a  f /* NDEBUG */..
218b0 2f 2a 0a 2a 2a 20 53 65 74 20 2a 70 53 69 7a 65  /*.** Set *pSize
218c0 20 74 6f 20 74 68 65 20 73 69 7a 65 20 6f 66 20   to the size of 
218d0 74 68 65 20 62 75 66 66 65 72 20 6e 65 65 64 65  the buffer neede
218e0 64 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 76 61  d to hold the va
218f0 6c 75 65 20 6f 66 0a 2a 2a 20 74 68 65 20 6b 65  lue of.** the ke
21900 79 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e  y for the curren
21910 74 20 65 6e 74 72 79 2e 20 20 49 66 20 74 68 65  t entry.  If the
21920 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 70   cursor is not p
21930 6f 69 6e 74 69 6e 67 0a 2a 2a 20 74 6f 20 61 20  ointing.** to a 
21940 76 61 6c 69 64 20 65 6e 74 72 79 2c 20 2a 70 53  valid entry, *pS
21950 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20 30 2e  ize is set to 0.
21960 20 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 20 74 61   .**.** For a ta
21970 62 6c 65 20 77 69 74 68 20 74 68 65 20 49 4e 54  ble with the INT
21980 4b 45 59 20 66 6c 61 67 20 73 65 74 2c 20 74 68  KEY flag set, th
21990 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
219a0 6e 73 20 74 68 65 20 6b 65 79 0a 2a 2a 20 69 74  ns the key.** it
219b0 73 65 6c 66 2c 20 6e 6f 74 20 74 68 65 20 6e 75  self, not the nu
219c0 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e  mber of bytes in
219d0 20 74 68 65 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20   the key..**.** 
219e0 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20  The caller must 
219f0 70 6f 73 69 74 69 6f 6e 20 74 68 65 20 63 75 72  position the cur
21a00 73 6f 72 20 70 72 69 6f 72 20 74 6f 20 69 6e 76  sor prior to inv
21a10 6f 6b 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69  oking this routi
21a20 6e 65 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 69 73 20  ne..** .** This 
21a30 72 6f 75 74 69 6e 65 20 63 61 6e 6e 6f 74 20 66  routine cannot f
21a40 61 69 6c 2e 20 20 49 74 20 61 6c 77 61 79 73 20  ail.  It always 
21a50 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f  returns SQLITE_O
21a60 4b 2e 20 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  K.  .*/.int sqli
21a70 74 65 33 42 74 72 65 65 4b 65 79 53 69 7a 65 28  te3BtreeKeySize(
21a80 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
21a90 69 36 34 20 2a 70 53 69 7a 65 29 7b 0a 20 20 61  i64 *pSize){.  a
21aa0 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
21ab0 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
21ac0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
21ad0 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
21ae0 56 41 4c 49 44 20 29 3b 0a 20 20 67 65 74 43 65  VALID );.  getCe
21af0 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20  llInfo(pCur);.  
21b00 2a 70 53 69 7a 65 20 3d 20 70 43 75 72 2d 3e 69  *pSize = pCur->i
21b10 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 72 65 74 75  nfo.nKey;.  retu
21b20 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
21b30 0a 2f 2a 0a 2a 2a 20 53 65 74 20 2a 70 53 69 7a  ./*.** Set *pSiz
21b40 65 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20  e to the number 
21b50 6f 66 20 62 79 74 65 73 20 6f 66 20 64 61 74 61  of bytes of data
21b60 20 69 6e 20 74 68 65 20 65 6e 74 72 79 20 74 68   in the entry th
21b70 65 0a 2a 2a 20 63 75 72 73 6f 72 20 63 75 72 72  e.** cursor curr
21b80 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 2e  ently points to.
21b90 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65  .**.** The calle
21ba0 72 20 6d 75 73 74 20 67 75 61 72 61 6e 74 65 65  r must guarantee
21bb0 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72   that the cursor
21bc0 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20   is pointing to 
21bd0 61 20 6e 6f 6e 2d 4e 55 4c 4c 0a 2a 2a 20 76 61  a non-NULL.** va
21be0 6c 69 64 20 65 6e 74 72 79 2e 20 20 49 6e 20 6f  lid entry.  In o
21bf0 74 68 65 72 20 77 6f 72 64 73 2c 20 74 68 65 20  ther words, the 
21c00 63 61 6c 6c 69 6e 67 20 70 72 6f 63 65 64 75 72  calling procedur
21c10 65 20 6d 75 73 74 20 67 75 61 72 61 6e 74 65 65  e must guarantee
21c20 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 63 75 72  .** that the cur
21c30 73 6f 72 20 68 61 73 20 43 75 72 73 6f 72 2e 65  sor has Cursor.e
21c40 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
21c50 4c 49 44 2e 0a 2a 2a 0a 2a 2a 20 46 61 69 6c 75  LID..**.** Failu
21c60 72 65 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62  re is not possib
21c70 6c 65 2e 20 20 54 68 69 73 20 66 75 6e 63 74 69  le.  This functi
21c80 6f 6e 20 61 6c 77 61 79 73 20 72 65 74 75 72 6e  on always return
21c90 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20  s SQLITE_OK..** 
21ca0 49 74 20 6d 69 67 68 74 20 6a 75 73 74 20 61 73  It might just as
21cb0 20 77 65 6c 6c 20 62 65 20 61 20 70 72 6f 63 65   well be a proce
21cc0 64 75 72 65 20 28 72 65 74 75 72 6e 69 6e 67 20  dure (returning 
21cd0 76 6f 69 64 29 20 62 75 74 20 77 65 20 63 6f 6e  void) but we con
21ce0 74 69 6e 75 65 0a 2a 2a 20 74 6f 20 72 65 74 75  tinue.** to retu
21cf0 72 6e 20 61 6e 20 69 6e 74 65 67 65 72 20 72 65  rn an integer re
21d00 73 75 6c 74 20 63 6f 64 65 20 66 6f 72 20 68 69  sult code for hi
21d10 73 74 6f 72 69 63 61 6c 20 72 65 61 73 6f 6e 73  storical reasons
21d20 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
21d30 42 74 72 65 65 44 61 74 61 53 69 7a 65 28 42 74  BtreeDataSize(Bt
21d40 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33  Cursor *pCur, u3
21d50 32 20 2a 70 53 69 7a 65 29 7b 0a 20 20 61 73 73  2 *pSize){.  ass
21d60 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
21d70 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
21d80 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
21d90 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
21da0 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28  LID );.  assert(
21db0 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20   pCur->iPage>=0 
21dc0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
21dd0 72 2d 3e 69 50 61 67 65 3c 42 54 43 55 52 53 4f  r->iPage<BTCURSO
21de0 52 5f 4d 41 58 5f 44 45 50 54 48 20 29 3b 0a 20  R_MAX_DEPTH );. 
21df0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61   assert( pCur->a
21e00 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
21e10 65 5d 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 3d 3d  e]->intKeyLeaf==
21e20 31 20 29 3b 0a 20 20 67 65 74 43 65 6c 6c 49 6e  1 );.  getCellIn
21e30 66 6f 28 70 43 75 72 29 3b 0a 20 20 2a 70 53 69  fo(pCur);.  *pSi
21e40 7a 65 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  ze = pCur->info.
21e50 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 72 65 74 75  nPayload;.  retu
21e60 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
21e70 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65  ./*.** Given the
21e80 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
21e90 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
21ea0 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
21eb0 20 28 70 61 72 61 6d 65 74 65 72 0a 2a 2a 20 6f   (parameter.** o
21ec0 76 66 6c 29 2c 20 74 68 69 73 20 66 75 6e 63 74  vfl), this funct
21ed0 69 6f 6e 20 66 69 6e 64 73 20 74 68 65 20 70 61  ion finds the pa
21ee0 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  ge number of the
21ef0 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74 68   next page in th
21f00 65 20 0a 2a 2a 20 6c 69 6e 6b 65 64 20 6c 69 73  e .** linked lis
21f10 74 20 6f 66 20 6f 76 65 72 66 6c 6f 77 20 70 61  t of overflow pa
21f20 67 65 73 2e 20 49 66 20 70 6f 73 73 69 62 6c 65  ges. If possible
21f30 2c 20 69 74 20 75 73 65 73 20 74 68 65 20 61 75  , it uses the au
21f40 74 6f 2d 76 61 63 75 75 6d 0a 2a 2a 20 70 6f 69  to-vacuum.** poi
21f50 6e 74 65 72 2d 6d 61 70 20 64 61 74 61 20 69 6e  nter-map data in
21f60 73 74 65 61 64 20 6f 66 20 72 65 61 64 69 6e 67  stead of reading
21f70 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
21f80 70 61 67 65 20 6f 76 66 6c 20 74 6f 20 64 6f 20  page ovfl to do 
21f90 73 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  so. .**.** If an
21fa0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 61 6e   error occurs an
21fb0 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
21fc0 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  de is returned. 
21fd0 4f 74 68 65 72 77 69 73 65 3a 0a 2a 2a 0a 2a 2a  Otherwise:.**.**
21fe0 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   The page number
21ff0 20 6f 66 20 74 68 65 20 6e 65 78 74 20 6f 76 65   of the next ove
22000 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 20 74 68  rflow page in th
22010 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 69 73  e linked list is
22020 20 0a 2a 2a 20 77 72 69 74 74 65 6e 20 74 6f 20   .** written to 
22030 2a 70 50 67 6e 6f 4e 65 78 74 2e 20 49 66 20 70  *pPgnoNext. If p
22040 61 67 65 20 6f 76 66 6c 20 69 73 20 74 68 65 20  age ovfl is the 
22050 6c 61 73 74 20 70 61 67 65 20 69 6e 20 69 74 73  last page in its
22060 20 6c 69 6e 6b 65 64 20 0a 2a 2a 20 6c 69 73 74   linked .** list
22070 2c 20 2a 70 50 67 6e 6f 4e 65 78 74 20 69 73 20  , *pPgnoNext is 
22080 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 0a 2a 2a  set to zero. .**
22090 0a 2a 2a 20 49 66 20 70 70 50 61 67 65 20 69 73  .** If ppPage is
220a0 20 6e 6f 74 20 4e 55 4c 4c 2c 20 61 6e 64 20 61   not NULL, and a
220b0 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68   reference to th
220c0 65 20 4d 65 6d 50 61 67 65 20 6f 62 6a 65 63 74  e MemPage object
220d0 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a   corresponding.*
220e0 2a 20 74 6f 20 70 61 67 65 20 6e 75 6d 62 65 72  * to page number
220f0 20 70 4f 76 66 6c 20 77 61 73 20 6f 62 74 61 69   pOvfl was obtai
22100 6e 65 64 2c 20 74 68 65 6e 20 2a 70 70 50 61 67  ned, then *ppPag
22110 65 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e  e is set to poin
22120 74 20 74 6f 20 74 68 61 74 0a 2a 2a 20 72 65 66  t to that.** ref
22130 65 72 65 6e 63 65 2e 20 49 74 20 69 73 20 74 68  erence. It is th
22140 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79  e responsibility
22150 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74   of the caller t
22160 6f 20 63 61 6c 6c 20 72 65 6c 65 61 73 65 50 61  o call releasePa
22170 67 65 28 29 0a 2a 2a 20 6f 6e 20 2a 70 70 50 61  ge().** on *ppPa
22180 67 65 20 74 6f 20 66 72 65 65 20 74 68 65 20 72  ge to free the r
22190 65 66 65 72 65 6e 63 65 2e 20 49 6e 20 6e 6f 20  eference. In no 
221a0 72 65 66 65 72 65 6e 63 65 20 77 61 73 20 6f 62  reference was ob
221b0 74 61 69 6e 65 64 20 28 62 65 63 61 75 73 65 0a  tained (because.
221c0 2a 2a 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d  ** the pointer-m
221d0 61 70 20 77 61 73 20 75 73 65 64 20 74 6f 20 6f  ap was used to o
221e0 62 74 61 69 6e 20 74 68 65 20 76 61 6c 75 65 20  btain the value 
221f0 66 6f 72 20 2a 70 50 67 6e 6f 4e 65 78 74 29 2c  for *pPgnoNext),
22200 20 74 68 65 6e 0a 2a 2a 20 2a 70 70 50 61 67 65   then.** *ppPage
22210 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e   is set to zero.
22220 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67  .*/.static int g
22230 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 0a  etOverflowPage(.
22240 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c    BtShared *pBt,
22250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
22260 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66  * The database f
22270 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6f 76  ile */.  Pgno ov
22280 66 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  fl,             
22290 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74        /* Current
222a0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 6e   overflow page n
222b0 75 6d 62 65 72 20 2a 2f 0a 20 20 4d 65 6d 50 61  umber */.  MemPa
222c0 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20  ge **ppPage,    
222d0 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
222e0 4d 65 6d 50 61 67 65 20 68 61 6e 64 6c 65 20 28  MemPage handle (
222f0 6d 61 79 20 62 65 20 4e 55 4c 4c 29 20 2a 2f 0a  may be NULL) */.
22300 20 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 4e 65 78    Pgno *pPgnoNex
22310 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  t              /
22320 2a 20 4f 55 54 3a 20 4e 65 78 74 20 6f 76 65 72  * OUT: Next over
22330 66 6c 6f 77 20 70 61 67 65 20 6e 75 6d 62 65 72  flow page number
22340 20 2a 2f 0a 29 7b 0a 20 20 50 67 6e 6f 20 6e 65   */.){.  Pgno ne
22350 78 74 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67  xt = 0;.  MemPag
22360 65 20 2a 70 50 61 67 65 20 3d 20 30 3b 0a 20 20  e *pPage = 0;.  
22370 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
22380 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  OK;..  assert( s
22390 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
223a0 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
223b0 0a 20 20 61 73 73 65 72 74 28 70 50 67 6e 6f 4e  .  assert(pPgnoN
223c0 65 78 74 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53  ext);..#ifndef S
223d0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
223e0 41 43 55 55 4d 0a 20 20 2f 2a 20 54 72 79 20 74  ACUUM.  /* Try t
223f0 6f 20 66 69 6e 64 20 74 68 65 20 6e 65 78 74 20  o find the next 
22400 70 61 67 65 20 69 6e 20 74 68 65 20 6f 76 65 72  page in the over
22410 66 6c 6f 77 20 6c 69 73 74 20 75 73 69 6e 67 20  flow list using 
22420 74 68 65 0a 20 20 2a 2a 20 61 75 74 6f 76 61 63  the.  ** autovac
22430 75 75 6d 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  uum pointer-map 
22440 70 61 67 65 73 2e 20 47 75 65 73 73 20 74 68 61  pages. Guess tha
22450 74 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20  t the next page 
22460 69 6e 20 0a 20 20 2a 2a 20 74 68 65 20 6f 76 65  in .  ** the ove
22470 72 66 6c 6f 77 20 6c 69 73 74 20 69 73 20 70 61  rflow list is pa
22480 67 65 20 6e 75 6d 62 65 72 20 28 6f 76 66 6c 2b  ge number (ovfl+
22490 31 29 2e 20 49 66 20 74 68 61 74 20 67 75 65 73  1). If that gues
224a0 73 20 74 75 72 6e 73 20 0a 20 20 2a 2a 20 6f 75  s turns .  ** ou
224b0 74 20 74 6f 20 62 65 20 77 72 6f 6e 67 2c 20 66  t to be wrong, f
224c0 61 6c 6c 20 62 61 63 6b 20 74 6f 20 6c 6f 61 64  all back to load
224d0 69 6e 67 20 74 68 65 20 64 61 74 61 20 6f 66 20  ing the data of 
224e0 70 61 67 65 20 0a 20 20 2a 2a 20 6e 75 6d 62 65  page .  ** numbe
224f0 72 20 6f 76 66 6c 20 74 6f 20 64 65 74 65 72 6d  r ovfl to determ
22500 69 6e 65 20 74 68 65 20 6e 65 78 74 20 70 61 67  ine the next pag
22510 65 20 6e 75 6d 62 65 72 2e 0a 20 20 2a 2f 0a 20  e number..  */. 
22520 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61   if( pBt->autoVa
22530 63 75 75 6d 20 29 7b 0a 20 20 20 20 50 67 6e 6f  cuum ){.    Pgno
22540 20 70 67 6e 6f 3b 0a 20 20 20 20 50 67 6e 6f 20   pgno;.    Pgno 
22550 69 47 75 65 73 73 20 3d 20 6f 76 66 6c 2b 31 3b  iGuess = ovfl+1;
22560 0a 20 20 20 20 75 38 20 65 54 79 70 65 3b 0a 0a  .    u8 eType;..
22570 20 20 20 20 77 68 69 6c 65 28 20 50 54 52 4d 41      while( PTRMA
22580 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 69 47  P_ISPAGE(pBt, iG
22590 75 65 73 73 29 20 7c 7c 20 69 47 75 65 73 73 3d  uess) || iGuess=
225a0 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
225b0 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20  GE(pBt) ){.     
225c0 20 69 47 75 65 73 73 2b 2b 3b 0a 20 20 20 20 7d   iGuess++;.    }
225d0 0a 0a 20 20 20 20 69 66 28 20 69 47 75 65 73 73  ..    if( iGuess
225e0 3c 3d 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74  <=btreePagecount
225f0 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 72  (pBt) ){.      r
22600 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70 42  c = ptrmapGet(pB
22610 74 2c 20 69 47 75 65 73 73 2c 20 26 65 54 79 70  t, iGuess, &eTyp
22620 65 2c 20 26 70 67 6e 6f 29 3b 0a 20 20 20 20 20  e, &pgno);.     
22630 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
22640 4f 4b 20 26 26 20 65 54 79 70 65 3d 3d 50 54 52  OK && eType==PTR
22650 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20 26 26  MAP_OVERFLOW2 &&
22660 20 70 67 6e 6f 3d 3d 6f 76 66 6c 20 29 7b 0a 20   pgno==ovfl ){. 
22670 20 20 20 20 20 20 20 6e 65 78 74 20 3d 20 69 47         next = iG
22680 75 65 73 73 3b 0a 20 20 20 20 20 20 20 20 72 63  uess;.        rc
22690 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a   = SQLITE_DONE;.
226a0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
226b0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65  }.#endif..  asse
226c0 72 74 28 20 6e 65 78 74 3d 3d 30 20 7c 7c 20 72  rt( next==0 || r
226d0 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c==SQLITE_DONE )
226e0 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
226f0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
22700 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70  = btreeGetPage(p
22710 42 74 2c 20 6f 76 66 6c 2c 20 26 70 50 61 67 65  Bt, ovfl, &pPage
22720 2c 20 28 70 70 50 61 67 65 3d 3d 30 29 20 3f 20  , (ppPage==0) ? 
22730 50 41 47 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e  PAGER_GET_READON
22740 4c 59 20 3a 20 30 29 3b 0a 20 20 20 20 61 73 73  LY : 0);.    ass
22750 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
22760 4f 4b 20 7c 7c 20 70 50 61 67 65 3d 3d 30 20 29  OK || pPage==0 )
22770 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
22780 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
22790 20 6e 65 78 74 20 3d 20 67 65 74 34 62 79 74 65   next = get4byte
227a0 28 70 50 61 67 65 2d 3e 61 44 61 74 61 29 3b 0a  (pPage->aData);.
227b0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70 50      }.  }..  *pP
227c0 67 6e 6f 4e 65 78 74 20 3d 20 6e 65 78 74 3b 0a  gnoNext = next;.
227d0 20 20 69 66 28 20 70 70 50 61 67 65 20 29 7b 0a    if( ppPage ){.
227e0 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70 50      *ppPage = pP
227f0 61 67 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  age;.  }else{.  
22800 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
22810 61 67 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  age);.  }.  retu
22820 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 44  rn (rc==SQLITE_D
22830 4f 4e 45 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20  ONE ? SQLITE_OK 
22840 3a 20 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  : rc);.}../*.** 
22850 43 6f 70 79 20 64 61 74 61 20 66 72 6f 6d 20 61  Copy data from a
22860 20 62 75 66 66 65 72 20 74 6f 20 61 20 70 61 67   buffer to a pag
22870 65 2c 20 6f 72 20 66 72 6f 6d 20 61 20 70 61 67  e, or from a pag
22880 65 20 74 6f 20 61 20 62 75 66 66 65 72 2e 0a 2a  e to a buffer..*
22890 2a 0a 2a 2a 20 70 50 61 79 6c 6f 61 64 20 69 73  *.** pPayload is
228a0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 64 61   a pointer to da
228b0 74 61 20 73 74 6f 72 65 64 20 6f 6e 20 64 61 74  ta stored on dat
228c0 61 62 61 73 65 20 70 61 67 65 20 70 44 62 50 61  abase page pDbPa
228d0 67 65 2e 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65  ge..** If argume
228e0 6e 74 20 65 4f 70 20 69 73 20 66 61 6c 73 65 2c  nt eOp is false,
228f0 20 74 68 65 6e 20 6e 42 79 74 65 20 62 79 74 65   then nByte byte
22900 73 20 6f 66 20 64 61 74 61 20 61 72 65 20 63 6f  s of data are co
22910 70 69 65 64 0a 2a 2a 20 66 72 6f 6d 20 70 50 61  pied.** from pPa
22920 79 6c 6f 61 64 20 74 6f 20 74 68 65 20 62 75 66  yload to the buf
22930 66 65 72 20 70 6f 69 6e 74 65 64 20 61 74 20 62  fer pointed at b
22940 79 20 70 42 75 66 2e 20 49 66 20 65 4f 70 20 69  y pBuf. If eOp i
22950 73 20 74 72 75 65 2c 0a 2a 2a 20 74 68 65 6e 20  s true,.** then 
22960 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
22970 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e  e() is called on
22980 20 70 44 62 50 61 67 65 20 61 6e 64 20 6e 42 79   pDbPage and nBy
22990 74 65 20 62 79 74 65 73 0a 2a 2a 20 6f 66 20 64  te bytes.** of d
229a0 61 74 61 20 61 72 65 20 63 6f 70 69 65 64 20 66  ata are copied f
229b0 72 6f 6d 20 74 68 65 20 62 75 66 66 65 72 20 70  rom the buffer p
229c0 42 75 66 20 74 6f 20 70 50 61 79 6c 6f 61 64 2e  Buf to pPayload.
229d0 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  .**.** SQLITE_OK
229e0 20 69 73 20 72 65 74 75 72 6e 65 64 20 6f 6e 20   is returned on 
229f0 73 75 63 63 65 73 73 2c 20 6f 74 68 65 72 77 69  success, otherwi
22a00 73 65 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  se an error code
22a10 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
22a20 63 6f 70 79 50 61 79 6c 6f 61 64 28 0a 20 20 76  copyPayload(.  v
22a30 6f 69 64 20 2a 70 50 61 79 6c 6f 61 64 2c 20 20  oid *pPayload,  
22a40 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
22a50 74 65 72 20 74 6f 20 70 61 67 65 20 64 61 74 61  ter to page data
22a60 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75 66   */.  void *pBuf
22a70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
22a80 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 62 75  /* Pointer to bu
22a90 66 66 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 42  ffer */.  int nB
22aa0 79 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  yte,            
22ab0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
22ac0 20 62 79 74 65 73 20 74 6f 20 63 6f 70 79 20 2a   bytes to copy *
22ad0 2f 0a 20 20 69 6e 74 20 65 4f 70 2c 20 20 20 20  /.  int eOp,    
22ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22af0 20 30 20 2d 3e 20 63 6f 70 79 20 66 72 6f 6d 20   0 -> copy from 
22b00 70 61 67 65 2c 20 31 20 2d 3e 20 63 6f 70 79 20  page, 1 -> copy 
22b10 74 6f 20 70 61 67 65 20 2a 2f 0a 20 20 44 62 50  to page */.  DbP
22b20 61 67 65 20 2a 70 44 62 50 61 67 65 20 20 20 20  age *pDbPage    
22b30 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63         /* Page c
22b40 6f 6e 74 61 69 6e 69 6e 67 20 70 50 61 79 6c 6f  ontaining pPaylo
22b50 61 64 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 65  ad */.){.  if( e
22b60 4f 70 20 29 7b 0a 20 20 20 20 2f 2a 20 43 6f 70  Op ){.    /* Cop
22b70 79 20 64 61 74 61 20 66 72 6f 6d 20 62 75 66 66  y data from buff
22b80 65 72 20 74 6f 20 70 61 67 65 20 28 61 20 77 72  er to page (a wr
22b90 69 74 65 20 6f 70 65 72 61 74 69 6f 6e 29 20 2a  ite operation) *
22ba0 2f 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73  /.    int rc = s
22bb0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
22bc0 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69  (pDbPage);.    i
22bd0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
22be0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
22bf0 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d   rc;.    }.    m
22c00 65 6d 63 70 79 28 70 50 61 79 6c 6f 61 64 2c 20  emcpy(pPayload, 
22c10 70 42 75 66 2c 20 6e 42 79 74 65 29 3b 0a 20 20  pBuf, nByte);.  
22c20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 43 6f  }else{.    /* Co
22c30 70 79 20 64 61 74 61 20 66 72 6f 6d 20 70 61 67  py data from pag
22c40 65 20 74 6f 20 62 75 66 66 65 72 20 28 61 20 72  e to buffer (a r
22c50 65 61 64 20 6f 70 65 72 61 74 69 6f 6e 29 20 2a  ead operation) *
22c60 2f 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 42 75  /.    memcpy(pBu
22c70 66 2c 20 70 50 61 79 6c 6f 61 64 2c 20 6e 42 79  f, pPayload, nBy
22c80 74 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  te);.  }.  retur
22c90 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
22ca0 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
22cb0 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 72  ion is used to r
22cc0 65 61 64 20 6f 72 20 6f 76 65 72 77 72 69 74 65  ead or overwrite
22cd0 20 70 61 79 6c 6f 61 64 20 69 6e 66 6f 72 6d 61   payload informa
22ce0 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20 74 68 65 20  tion.** for the 
22cf0 65 6e 74 72 79 20 74 68 61 74 20 74 68 65 20 70  entry that the p
22d00 43 75 72 20 63 75 72 73 6f 72 20 69 73 20 70 6f  Cur cursor is po
22d10 69 6e 74 69 6e 67 20 74 6f 2e 20 54 68 65 20 65  inting to. The e
22d20 4f 70 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20 69  Op.** argument i
22d30 73 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73  s interpreted as
22d40 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
22d50 20 20 30 3a 20 54 68 65 20 6f 70 65 72 61 74 69    0: The operati
22d60 6f 6e 20 69 73 20 61 20 72 65 61 64 2e 20 50 6f  on is a read. Po
22d70 70 75 6c 61 74 65 20 74 68 65 20 6f 76 65 72 66  pulate the overf
22d80 6c 6f 77 20 63 61 63 68 65 2e 0a 2a 2a 20 20 20  low cache..**   
22d90 31 3a 20 54 68 65 20 6f 70 65 72 61 74 69 6f 6e  1: The operation
22da0 20 69 73 20 61 20 77 72 69 74 65 2e 20 50 6f 70   is a write. Pop
22db0 75 6c 61 74 65 20 74 68 65 20 6f 76 65 72 66 6c  ulate the overfl
22dc0 6f 77 20 63 61 63 68 65 2e 0a 2a 2a 20 20 20 32  ow cache..**   2
22dd0 3a 20 54 68 65 20 6f 70 65 72 61 74 69 6f 6e 20  : The operation 
22de0 69 73 20 61 20 72 65 61 64 2e 20 44 6f 20 6e 6f  is a read. Do no
22df0 74 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20 6f  t populate the o
22e00 76 65 72 66 6c 6f 77 20 63 61 63 68 65 2e 0a 2a  verflow cache..*
22e10 2a 0a 2a 2a 20 41 20 74 6f 74 61 6c 20 6f 66 20  *.** A total of 
22e20 22 61 6d 74 22 20 62 79 74 65 73 20 61 72 65 20  "amt" bytes are 
22e30 72 65 61 64 20 6f 72 20 77 72 69 74 74 65 6e 20  read or written 
22e40 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 22 6f 66  beginning at "of
22e50 66 73 65 74 22 2e 0a 2a 2a 20 44 61 74 61 20 69  fset"..** Data i
22e60 73 20 72 65 61 64 20 74 6f 20 6f 72 20 66 72 6f  s read to or fro
22e70 6d 20 74 68 65 20 62 75 66 66 65 72 20 70 42 75  m the buffer pBu
22e80 66 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6e  f..**.** The con
22e90 74 65 6e 74 20 62 65 69 6e 67 20 72 65 61 64 20  tent being read 
22ea0 6f 72 20 77 72 69 74 74 65 6e 20 6d 69 67 68 74  or written might
22eb0 20 61 70 70 65 61 72 20 6f 6e 20 74 68 65 20 6d   appear on the m
22ec0 61 69 6e 20 70 61 67 65 0a 2a 2a 20 6f 72 20 62  ain page.** or b
22ed0 65 20 73 63 61 74 74 65 72 65 64 20 6f 75 74 20  e scattered out 
22ee0 6f 6e 20 6d 75 6c 74 69 70 6c 65 20 6f 76 65 72  on multiple over
22ef0 66 6c 6f 77 20 70 61 67 65 73 2e 0a 2a 2a 0a 2a  flow pages..**.*
22f00 2a 20 49 66 20 74 68 65 20 63 75 72 72 65 6e 74  * If the current
22f10 20 63 75 72 73 6f 72 20 65 6e 74 72 79 20 75 73   cursor entry us
22f20 65 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f  es one or more o
22f30 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61 6e  verflow pages an
22f40 64 20 74 68 65 0a 2a 2a 20 65 4f 70 20 61 72 67  d the.** eOp arg
22f50 75 6d 65 6e 74 20 69 73 20 6e 6f 74 20 32 2c 20  ument is not 2, 
22f60 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61  this function ma
22f70 79 20 61 6c 6c 6f 63 61 74 65 20 73 70 61 63 65  y allocate space
22f80 20 66 6f 72 20 61 6e 64 20 6c 61 7a 69 6c 79 20   for and lazily 
22f90 0a 2a 2a 20 70 6f 70 75 6c 61 74 65 73 20 74 68  .** populates th
22fa0 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d  e overflow page-
22fb0 6c 69 73 74 20 63 61 63 68 65 20 61 72 72 61 79  list cache array
22fc0 20 28 42 74 43 75 72 73 6f 72 2e 61 4f 76 65 72   (BtCursor.aOver
22fd0 66 6c 6f 77 29 2e 20 0a 2a 2a 20 53 75 62 73 65  flow). .** Subse
22fe0 71 75 65 6e 74 20 63 61 6c 6c 73 20 75 73 65 20  quent calls use 
22ff0 74 68 69 73 20 63 61 63 68 65 20 74 6f 20 6d 61  this cache to ma
23000 6b 65 20 73 65 65 6b 69 6e 67 20 74 6f 20 74 68  ke seeking to th
23010 65 20 73 75 70 70 6c 69 65 64 20 6f 66 66 73 65  e supplied offse
23020 74 20 0a 2a 2a 20 6d 6f 72 65 20 65 66 66 69 63  t .** more effic
23030 69 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65  ient..**.** Once
23040 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
23050 65 2d 6c 69 73 74 20 63 61 63 68 65 20 68 61 73  e-list cache has
23060 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c   been allocated,
23070 20 69 74 20 6d 61 79 20 62 65 0a 2a 2a 20 69 6e   it may be.** in
23080 76 61 6c 69 64 61 74 65 64 20 69 66 20 73 6f 6d  validated if som
23090 65 20 6f 74 68 65 72 20 63 75 72 73 6f 72 20 77  e other cursor w
230a0 72 69 74 65 73 20 74 6f 20 74 68 65 20 73 61 6d  rites to the sam
230b0 65 20 74 61 62 6c 65 2c 20 6f 72 20 69 66 0a 2a  e table, or if.*
230c0 2a 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  * the cursor is 
230d0 6d 6f 76 65 64 20 74 6f 20 61 20 64 69 66 66 65  moved to a diffe
230e0 72 65 6e 74 20 72 6f 77 2e 20 41 64 64 69 74 69  rent row. Additi
230f0 6f 6e 61 6c 6c 79 2c 20 69 6e 20 61 75 74 6f 2d  onally, in auto-
23100 76 61 63 75 75 6d 0a 2a 2a 20 6d 6f 64 65 2c 20  vacuum.** mode, 
23110 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 76  the following ev
23120 65 6e 74 73 20 6d 61 79 20 69 6e 76 61 6c 69 64  ents may invalid
23130 61 74 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20  ate an overflow 
23140 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 2e  page-list cache.
23150 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 41 6e 20 69 6e  .**.**   * An in
23160 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d  cremental vacuum
23170 2c 0a 2a 2a 20 20 20 2a 20 41 20 63 6f 6d 6d 69  ,.**   * A commi
23180 74 20 69 6e 20 61 75 74 6f 5f 76 61 63 75 75 6d  t in auto_vacuum
23190 3d 22 66 75 6c 6c 22 20 6d 6f 64 65 2c 0a 2a 2a  ="full" mode,.**
231a0 20 20 20 2a 20 43 72 65 61 74 69 6e 67 20 61 20     * Creating a 
231b0 74 61 62 6c 65 20 28 6d 61 79 20 72 65 71 75 69  table (may requi
231c0 72 65 20 6d 6f 76 69 6e 67 20 61 6e 20 6f 76 65  re moving an ove
231d0 72 66 6c 6f 77 20 70 61 67 65 29 2e 0a 2a 2f 0a  rflow page)..*/.
231e0 73 74 61 74 69 63 20 69 6e 74 20 61 63 63 65 73  static int acces
231f0 73 50 61 79 6c 6f 61 64 28 0a 20 20 42 74 43 75  sPayload(.  BtCu
23200 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20  rsor *pCur,     
23210 20 2f 2a 20 43 75 72 73 6f 72 20 70 6f 69 6e 74   /* Cursor point
23220 69 6e 67 20 74 6f 20 65 6e 74 72 79 20 74 6f 20  ing to entry to 
23230 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 75  read from */.  u
23240 33 32 20 6f 66 66 73 65 74 2c 20 20 20 20 20 20  32 offset,      
23250 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 72 65 61      /* Begin rea
23260 64 69 6e 67 20 74 68 69 73 20 66 61 72 20 69 6e  ding this far in
23270 74 6f 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 20 20  to payload */.  
23280 75 33 32 20 61 6d 74 2c 20 20 20 20 20 20 20 20  u32 amt,        
23290 20 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68 69       /* Read thi
232a0 73 20 6d 61 6e 79 20 62 79 74 65 73 20 2a 2f 0a  s many bytes */.
232b0 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
232c0 2a 70 42 75 66 2c 20 2f 2a 20 57 72 69 74 65 20  *pBuf, /* Write 
232d0 74 68 65 20 62 79 74 65 73 20 69 6e 74 6f 20 74  the bytes into t
232e0 68 69 73 20 62 75 66 66 65 72 20 2a 2f 20 0a 20  his buffer */ . 
232f0 20 69 6e 74 20 65 4f 70 20 20 20 20 20 20 20 20   int eOp        
23300 20 20 20 20 20 20 2f 2a 20 7a 65 72 6f 20 74 6f        /* zero to
23310 20 72 65 61 64 2e 20 6e 6f 6e 2d 7a 65 72 6f 20   read. non-zero 
23320 74 6f 20 77 72 69 74 65 2e 20 2a 2f 0a 29 7b 0a  to write. */.){.
23330 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
23340 2a 61 50 61 79 6c 6f 61 64 3b 0a 20 20 69 6e 74  *aPayload;.  int
23350 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
23360 0a 20 20 69 6e 74 20 69 49 64 78 20 3d 20 30 3b  .  int iIdx = 0;
23370 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
23380 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65  e = pCur->apPage
23390 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 20 2f  [pCur->iPage]; /
233a0 2a 20 42 74 72 65 65 20 70 61 67 65 20 6f 66 20  * Btree page of 
233b0 63 75 72 72 65 6e 74 20 65 6e 74 72 79 20 2a 2f  current entry */
233c0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
233d0 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b 20 20 20   = pCur->pBt;   
233e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
233f0 2a 20 42 74 72 65 65 20 74 68 69 73 20 63 75 72  * Btree this cur
23400 73 6f 72 20 62 65 6c 6f 6e 67 73 20 74 6f 20 2a  sor belongs to *
23410 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
23420 44 49 52 45 43 54 5f 4f 56 45 52 46 4c 4f 57 5f  DIRECT_OVERFLOW_
23430 52 45 41 44 0a 20 20 75 6e 73 69 67 6e 65 64 20  READ.  unsigned 
23440 63 68 61 72 20 2a 20 63 6f 6e 73 74 20 70 42 75  char * const pBu
23450 66 53 74 61 72 74 20 3d 20 70 42 75 66 3b 0a 20  fStart = pBuf;. 
23460 20 69 6e 74 20 62 45 6e 64 3b 20 20 20 20 20 20   int bEnd;      
23470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23480 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
23490 75 65 20 69 66 20 72 65 61 64 69 6e 67 20 74 6f  ue if reading to
234a0 20 65 6e 64 20 6f 66 20 64 61 74 61 20 2a 2f 0a   end of data */.
234b0 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74  #endif..  assert
234c0 28 20 70 50 61 67 65 20 29 3b 0a 20 20 61 73 73  ( pPage );.  ass
234d0 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
234e0 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
234f0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
23500 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
23510 50 61 67 65 5d 3c 70 50 61 67 65 2d 3e 6e 43 65  Page]<pPage->nCe
23520 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ll );.  assert( 
23530 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
23540 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
23550 72 74 28 20 65 4f 70 21 3d 32 20 7c 7c 20 6f 66  rt( eOp!=2 || of
23560 66 73 65 74 3d 3d 30 20 29 3b 20 20 20 20 2f 2a  fset==0 );    /*
23570 20 41 6c 77 61 79 73 20 73 74 61 72 74 20 66 72   Always start fr
23580 6f 6d 20 62 65 67 69 6e 6e 69 6e 67 20 66 6f 72  om beginning for
23590 20 65 4f 70 3d 3d 32 20 2a 2f 0a 0a 20 20 67 65   eOp==2 */..  ge
235a0 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b  tCellInfo(pCur);
235b0 0a 20 20 61 50 61 79 6c 6f 61 64 20 3d 20 70 43  .  aPayload = pC
235c0 75 72 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f 61  ur->info.pPayloa
235d0 64 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  d;.#ifdef SQLITE
235e0 5f 44 49 52 45 43 54 5f 4f 56 45 52 46 4c 4f 57  _DIRECT_OVERFLOW
235f0 5f 52 45 41 44 0a 20 20 62 45 6e 64 20 3d 20 6f  _READ.  bEnd = o
23600 66 66 73 65 74 2b 61 6d 74 3d 3d 70 43 75 72 2d  ffset+amt==pCur-
23610 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 3b 0a  >info.nPayload;.
23620 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28  #endif.  assert(
23630 20 6f 66 66 73 65 74 2b 61 6d 74 20 3c 3d 20 70   offset+amt <= p
23640 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f  Cur->info.nPaylo
23650 61 64 20 29 3b 0a 0a 20 20 69 66 28 20 26 61 50  ad );..  if( &aP
23660 61 79 6c 6f 61 64 5b 70 43 75 72 2d 3e 69 6e 66  ayload[pCur->inf
23670 6f 2e 6e 4c 6f 63 61 6c 5d 20 3e 20 26 70 50 61  o.nLocal] > &pPa
23680 67 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e 75  ge->aData[pBt->u
23690 73 61 62 6c 65 53 69 7a 65 5d 20 29 7b 0a 20 20  sableSize] ){.  
236a0 20 20 2f 2a 20 54 72 79 69 6e 67 20 74 6f 20 72    /* Trying to r
236b0 65 61 64 20 6f 72 20 77 72 69 74 65 20 70 61 73  ead or write pas
236c0 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
236d0 20 64 61 74 61 20 69 73 20 61 6e 20 65 72 72 6f   data is an erro
236e0 72 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20  r */.    return 
236f0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
23700 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43  KPT;.  }..  /* C
23710 68 65 63 6b 20 69 66 20 64 61 74 61 20 6d 75 73  heck if data mus
23720 74 20 62 65 20 72 65 61 64 2f 77 72 69 74 74 65  t be read/writte
23730 6e 20 74 6f 2f 66 72 6f 6d 20 74 68 65 20 62 74  n to/from the bt
23740 72 65 65 20 70 61 67 65 20 69 74 73 65 6c 66 2e  ree page itself.
23750 20 2a 2f 0a 20 20 69 66 28 20 6f 66 66 73 65 74   */.  if( offset
23760 3c 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63  <pCur->info.nLoc
23770 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 20  al ){.    int a 
23780 3d 20 61 6d 74 3b 0a 20 20 20 20 69 66 28 20 61  = amt;.    if( a
23790 2b 6f 66 66 73 65 74 3e 70 43 75 72 2d 3e 69 6e  +offset>pCur->in
237a0 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20  fo.nLocal ){.   
237b0 20 20 20 61 20 3d 20 70 43 75 72 2d 3e 69 6e 66     a = pCur->inf
237c0 6f 2e 6e 4c 6f 63 61 6c 20 2d 20 6f 66 66 73 65  o.nLocal - offse
237d0 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  t;.    }.    rc 
237e0 3d 20 63 6f 70 79 50 61 79 6c 6f 61 64 28 26 61  = copyPayload(&a
237f0 50 61 79 6c 6f 61 64 5b 6f 66 66 73 65 74 5d 2c  Payload[offset],
23800 20 70 42 75 66 2c 20 61 2c 20 28 65 4f 70 20 26   pBuf, a, (eOp &
23810 20 30 78 30 31 29 2c 20 70 50 61 67 65 2d 3e 70   0x01), pPage->p
23820 44 62 50 61 67 65 29 3b 0a 20 20 20 20 6f 66 66  DbPage);.    off
23830 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 70 42 75  set = 0;.    pBu
23840 66 20 2b 3d 20 61 3b 0a 20 20 20 20 61 6d 74 20  f += a;.    amt 
23850 2d 3d 20 61 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  -= a;.  }else{. 
23860 20 20 20 6f 66 66 73 65 74 20 2d 3d 20 70 43 75     offset -= pCu
23870 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a  r->info.nLocal;.
23880 20 20 7d 0a 0a 0a 20 20 69 66 28 20 72 63 3d 3d    }...  if( rc==
23890 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74  SQLITE_OK && amt
238a0 3e 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  >0 ){.    const 
238b0 75 33 32 20 6f 76 66 6c 53 69 7a 65 20 3d 20 70  u32 ovflSize = p
238c0 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d  Bt->usableSize -
238d0 20 34 3b 20 20 2f 2a 20 42 79 74 65 73 20 63 6f   4;  /* Bytes co
238e0 6e 74 65 6e 74 20 70 65 72 20 6f 76 66 6c 20 70  ntent per ovfl p
238f0 61 67 65 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20  age */.    Pgno 
23900 6e 65 78 74 50 61 67 65 3b 0a 0a 20 20 20 20 6e  nextPage;..    n
23910 65 78 74 50 61 67 65 20 3d 20 67 65 74 34 62 79  extPage = get4by
23920 74 65 28 26 61 50 61 79 6c 6f 61 64 5b 70 43 75  te(&aPayload[pCu
23930 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d 29  r->info.nLocal])
23940 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ;..    /* If the
23950 20 42 74 43 75 72 73 6f 72 2e 61 4f 76 65 72 66   BtCursor.aOverf
23960 6c 6f 77 5b 5d 20 68 61 73 20 6e 6f 74 20 62 65  low[] has not be
23970 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c 20 61 6c  en allocated, al
23980 6c 6f 63 61 74 65 20 69 74 20 6e 6f 77 2e 0a 20  locate it now.. 
23990 20 20 20 2a 2a 20 45 78 63 65 70 74 2c 20 64 6f     ** Except, do
239a0 20 6e 6f 74 20 61 6c 6c 6f 63 61 74 65 20 61 4f   not allocate aO
239b0 76 65 72 66 6c 6f 77 5b 5d 20 66 6f 72 20 65 4f  verflow[] for eO
239c0 70 3d 3d 32 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  p==2..    **.   
239d0 20 2a 2a 20 54 68 65 20 61 4f 76 65 72 66 6c 6f   ** The aOverflo
239e0 77 5b 5d 20 61 72 72 61 79 20 69 73 20 73 69 7a  w[] array is siz
239f0 65 64 20 61 74 20 6f 6e 65 20 65 6e 74 72 79 20  ed at one entry 
23a00 66 6f 72 20 65 61 63 68 20 6f 76 65 72 66 6c 6f  for each overflo
23a10 77 20 70 61 67 65 0a 20 20 20 20 2a 2a 20 69 6e  w page.    ** in
23a20 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 68   the overflow ch
23a30 61 69 6e 2e 20 54 68 65 20 70 61 67 65 20 6e 75  ain. The page nu
23a40 6d 62 65 72 20 6f 66 20 74 68 65 20 66 69 72 73  mber of the firs
23a50 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  t overflow page 
23a60 69 73 0a 20 20 20 20 2a 2a 20 73 74 6f 72 65 64  is.    ** stored
23a70 20 69 6e 20 61 4f 76 65 72 66 6c 6f 77 5b 30 5d   in aOverflow[0]
23a80 2c 20 65 74 63 2e 20 41 20 76 61 6c 75 65 20 6f  , etc. A value o
23a90 66 20 30 20 69 6e 20 74 68 65 20 61 4f 76 65 72  f 0 in the aOver
23aa0 66 6c 6f 77 5b 5d 20 61 72 72 61 79 0a 20 20 20  flow[] array.   
23ab0 20 2a 2a 20 6d 65 61 6e 73 20 22 6e 6f 74 20 79   ** means "not y
23ac0 65 74 20 6b 6e 6f 77 6e 22 20 28 74 68 65 20 63  et known" (the c
23ad0 61 63 68 65 20 69 73 20 6c 61 7a 69 6c 79 20 70  ache is lazily p
23ae0 6f 70 75 6c 61 74 65 64 29 2e 0a 20 20 20 20 2a  opulated)..    *
23af0 2f 0a 20 20 20 20 69 66 28 20 65 4f 70 21 3d 32  /.    if( eOp!=2
23b00 20 26 26 20 28 70 43 75 72 2d 3e 63 75 72 46 6c   && (pCur->curFl
23b10 61 67 73 20 26 20 42 54 43 46 5f 56 61 6c 69 64  ags & BTCF_Valid
23b20 4f 76 66 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Ovfl)==0 ){.    
23b30 20 20 69 6e 74 20 6e 4f 76 66 6c 20 3d 20 28 70    int nOvfl = (p
23b40 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f  Cur->info.nPaylo
23b50 61 64 2d 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c  ad-pCur->info.nL
23b60 6f 63 61 6c 2b 6f 76 66 6c 53 69 7a 65 2d 31 29  ocal+ovflSize-1)
23b70 2f 6f 76 66 6c 53 69 7a 65 3b 0a 20 20 20 20 20  /ovflSize;.     
23b80 20 69 66 28 20 6e 4f 76 66 6c 3e 70 43 75 72 2d   if( nOvfl>pCur-
23b90 3e 6e 4f 76 66 6c 41 6c 6c 6f 63 20 29 7b 0a 20  >nOvflAlloc ){. 
23ba0 20 20 20 20 20 20 20 50 67 6e 6f 20 2a 61 4e 65         Pgno *aNe
23bb0 77 20 3d 20 28 50 67 6e 6f 2a 29 73 71 6c 69 74  w = (Pgno*)sqlit
23bc0 65 33 52 65 61 6c 6c 6f 63 28 0a 20 20 20 20 20  e3Realloc(.     
23bd0 20 20 20 20 20 20 20 70 43 75 72 2d 3e 61 4f 76         pCur->aOv
23be0 65 72 66 6c 6f 77 2c 20 6e 4f 76 66 6c 2a 32 2a  erflow, nOvfl*2*
23bf0 73 69 7a 65 6f 66 28 50 67 6e 6f 29 0a 20 20 20  sizeof(Pgno).   
23c00 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
23c10 69 66 28 20 61 4e 65 77 3d 3d 30 20 29 7b 0a 20  if( aNew==0 ){. 
23c20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
23c30 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
23c40 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
23c50 20 20 20 20 20 70 43 75 72 2d 3e 6e 4f 76 66 6c       pCur->nOvfl
23c60 41 6c 6c 6f 63 20 3d 20 6e 4f 76 66 6c 2a 32 3b  Alloc = nOvfl*2;
23c70 0a 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d  .          pCur-
23c80 3e 61 4f 76 65 72 66 6c 6f 77 20 3d 20 61 4e 65  >aOverflow = aNe
23c90 77 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  w;.        }.   
23ca0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
23cb0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
23cc0 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70          memset(p
23cd0 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 2c 20  Cur->aOverflow, 
23ce0 30 2c 20 6e 4f 76 66 6c 2a 73 69 7a 65 6f 66 28  0, nOvfl*sizeof(
23cf0 50 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 20 20  Pgno));.        
23d00 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 7c  pCur->curFlags |
23d10 3d 20 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c  = BTCF_ValidOvfl
23d20 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
23d30 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6f  .    /* If the o
23d40 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73  verflow page-lis
23d50 74 20 63 61 63 68 65 20 68 61 73 20 62 65 65 6e  t cache has been
23d60 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 74   allocated and t
23d70 68 65 0a 20 20 20 20 2a 2a 20 65 6e 74 72 79 20  he.    ** entry 
23d80 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 72 65  for the first re
23d90 71 75 69 72 65 64 20 6f 76 65 72 66 6c 6f 77 20  quired overflow 
23da0 70 61 67 65 20 69 73 20 76 61 6c 69 64 2c 20 73  page is valid, s
23db0 6b 69 70 0a 20 20 20 20 2a 2a 20 64 69 72 65 63  kip.    ** direc
23dc0 74 6c 79 20 74 6f 20 69 74 2e 0a 20 20 20 20 2a  tly to it..    *
23dd0 2f 0a 20 20 20 20 69 66 28 20 28 70 43 75 72 2d  /.    if( (pCur-
23de0 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46  >curFlags & BTCF
23df0 5f 56 61 6c 69 64 4f 76 66 6c 29 21 3d 30 0a 20  _ValidOvfl)!=0. 
23e00 20 20 20 20 26 26 20 70 43 75 72 2d 3e 61 4f 76      && pCur->aOv
23e10 65 72 66 6c 6f 77 5b 6f 66 66 73 65 74 2f 6f 76  erflow[offset/ov
23e20 66 6c 53 69 7a 65 5d 0a 20 20 20 20 29 7b 0a 20  flSize].    ){. 
23e30 20 20 20 20 20 69 49 64 78 20 3d 20 28 6f 66 66       iIdx = (off
23e40 73 65 74 2f 6f 76 66 6c 53 69 7a 65 29 3b 0a 20  set/ovflSize);. 
23e50 20 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20       nextPage = 
23e60 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b  pCur->aOverflow[
23e70 69 49 64 78 5d 3b 0a 20 20 20 20 20 20 6f 66 66  iIdx];.      off
23e80 73 65 74 20 3d 20 28 6f 66 66 73 65 74 25 6f 76  set = (offset%ov
23e90 66 6c 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 0a  flSize);.    }..
23ea0 20 20 20 20 66 6f 72 28 20 3b 20 72 63 3d 3d 53      for( ; rc==S
23eb0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e  QLITE_OK && amt>
23ec0 30 20 26 26 20 6e 65 78 74 50 61 67 65 3b 20 69  0 && nextPage; i
23ed0 49 64 78 2b 2b 29 7b 0a 0a 20 20 20 20 20 20 2f  Idx++){..      /
23ee0 2a 20 49 66 20 72 65 71 75 69 72 65 64 2c 20 70  * If required, p
23ef0 6f 70 75 6c 61 74 65 20 74 68 65 20 6f 76 65 72  opulate the over
23f00 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63  flow page-list c
23f10 61 63 68 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69  ache. */.      i
23f20 66 28 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61  f( (pCur->curFla
23f30 67 73 20 26 20 42 54 43 46 5f 56 61 6c 69 64 4f  gs & BTCF_ValidO
23f40 76 66 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  vfl)!=0 ){.     
23f50 20 20 20 61 73 73 65 72 74 28 21 70 43 75 72 2d     assert(!pCur-
23f60 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d  >aOverflow[iIdx]
23f70 20 7c 7c 20 70 43 75 72 2d 3e 61 4f 76 65 72 66   || pCur->aOverf
23f80 6c 6f 77 5b 69 49 64 78 5d 3d 3d 6e 65 78 74 50  low[iIdx]==nextP
23f90 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 70 43  age);.        pC
23fa0 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49  ur->aOverflow[iI
23fb0 64 78 5d 20 3d 20 6e 65 78 74 50 61 67 65 3b 0a  dx] = nextPage;.
23fc0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69        }..      i
23fd0 66 28 20 6f 66 66 73 65 74 3e 3d 6f 76 66 6c 53  f( offset>=ovflS
23fe0 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ize ){.        /
23ff0 2a 20 54 68 65 20 6f 6e 6c 79 20 72 65 61 73 6f  * The only reaso
24000 6e 20 74 6f 20 72 65 61 64 20 74 68 69 73 20 70  n to read this p
24010 61 67 65 20 69 73 20 74 6f 20 6f 62 74 61 69 6e  age is to obtain
24020 20 74 68 65 20 70 61 67 65 0a 20 20 20 20 20 20   the page.      
24030 20 20 2a 2a 20 6e 75 6d 62 65 72 20 66 6f 72 20    ** number for 
24040 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e  the next page in
24050 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 68   the overflow ch
24060 61 69 6e 2e 20 54 68 65 20 70 61 67 65 0a 20 20  ain. The page.  
24070 20 20 20 20 20 20 2a 2a 20 64 61 74 61 20 69 73        ** data is
24080 20 6e 6f 74 20 72 65 71 75 69 72 65 64 2e 20 53   not required. S
24090 6f 20 66 69 72 73 74 20 74 72 79 20 74 6f 20 6c  o first try to l
240a0 6f 6f 6b 75 70 20 74 68 65 20 6f 76 65 72 66 6c  ookup the overfl
240b0 6f 77 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61  ow.        ** pa
240c0 67 65 2d 6c 69 73 74 20 63 61 63 68 65 2c 20 69  ge-list cache, i
240d0 66 20 61 6e 79 2c 20 74 68 65 6e 20 66 61 6c 6c  f any, then fall
240e0 20 62 61 63 6b 20 74 6f 20 74 68 65 20 67 65 74   back to the get
240f0 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 29 0a 20  OverflowPage(). 
24100 20 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69         ** functi
24110 6f 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  on..        **. 
24120 20 20 20 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74         ** Note t
24130 68 61 74 20 74 68 65 20 61 4f 76 65 72 66 6c 6f  hat the aOverflo
24140 77 5b 5d 20 61 72 72 61 79 20 6d 75 73 74 20 62  w[] array must b
24150 65 20 61 6c 6c 6f 63 61 74 65 64 20 62 65 63 61  e allocated beca
24160 75 73 65 20 65 4f 70 21 3d 32 0a 20 20 20 20 20  use eOp!=2.     
24170 20 20 20 2a 2a 20 68 65 72 65 2e 20 20 49 66 20     ** here.  If 
24180 65 4f 70 3d 3d 32 2c 20 74 68 65 6e 20 6f 66 66  eOp==2, then off
24190 73 65 74 3d 3d 30 20 61 6e 64 20 74 68 69 73 20  set==0 and this 
241a0 62 72 61 6e 63 68 20 69 73 20 6e 65 76 65 72 20  branch is never 
241b0 74 61 6b 65 6e 2e 0a 20 20 20 20 20 20 20 20 2a  taken..        *
241c0 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  /.        assert
241d0 28 20 65 4f 70 21 3d 32 20 29 3b 0a 20 20 20 20  ( eOp!=2 );.    
241e0 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
241f0 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43  ->curFlags & BTC
24200 46 5f 56 61 6c 69 64 4f 76 66 6c 20 29 3b 0a 20  F_ValidOvfl );. 
24210 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
24220 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 3d  Cur->pBtree->db=
24230 3d 70 42 74 2d 3e 64 62 20 29 3b 0a 20 20 20 20  =pBt->db );.    
24240 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 61 4f      if( pCur->aO
24250 76 65 72 66 6c 6f 77 5b 69 49 64 78 2b 31 5d 20  verflow[iIdx+1] 
24260 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 65 78  ){.          nex
24270 74 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 4f  tPage = pCur->aO
24280 76 65 72 66 6c 6f 77 5b 69 49 64 78 2b 31 5d 3b  verflow[iIdx+1];
24290 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
242a0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 67            rc = g
242b0 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 70  etOverflowPage(p
242c0 42 74 2c 20 6e 65 78 74 50 61 67 65 2c 20 30 2c  Bt, nextPage, 0,
242d0 20 26 6e 65 78 74 50 61 67 65 29 3b 0a 20 20 20   &nextPage);.   
242e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6f       }.        o
242f0 66 66 73 65 74 20 2d 3d 20 6f 76 66 6c 53 69 7a  ffset -= ovflSiz
24300 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  e;.      }else{.
24310 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 65 64 20          /* Need 
24320 74 6f 20 72 65 61 64 20 74 68 69 73 20 70 61 67  to read this pag
24330 65 20 70 72 6f 70 65 72 6c 79 2e 20 49 74 20 63  e properly. It c
24340 6f 6e 74 61 69 6e 73 20 73 6f 6d 65 20 6f 66 20  ontains some of 
24350 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 72  the.        ** r
24360 61 6e 67 65 20 6f 66 20 64 61 74 61 20 74 68 61  ange of data tha
24370 74 20 69 73 20 62 65 69 6e 67 20 72 65 61 64 20  t is being read 
24380 28 65 4f 70 3d 3d 30 29 20 6f 72 20 77 72 69 74  (eOp==0) or writ
24390 74 65 6e 20 28 65 4f 70 21 3d 30 29 2e 0a 20 20  ten (eOp!=0)..  
243a0 20 20 20 20 20 20 2a 2f 0a 23 69 66 64 65 66 20        */.#ifdef 
243b0 53 51 4c 49 54 45 5f 44 49 52 45 43 54 5f 4f 56  SQLITE_DIRECT_OV
243c0 45 52 46 4c 4f 57 5f 52 45 41 44 0a 20 20 20 20  ERFLOW_READ.    
243d0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65      sqlite3_file
243e0 20 2a 66 64 3b 0a 23 65 6e 64 69 66 0a 20 20 20   *fd;.#endif.   
243f0 20 20 20 20 20 69 6e 74 20 61 20 3d 20 61 6d 74       int a = amt
24400 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 20  ;.        if( a 
24410 2b 20 6f 66 66 73 65 74 20 3e 20 6f 76 66 6c 53  + offset > ovflS
24420 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ize ){.         
24430 20 61 20 3d 20 6f 76 66 6c 53 69 7a 65 20 2d 20   a = ovflSize - 
24440 6f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20  offset;.        
24450 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
24460 5f 44 49 52 45 43 54 5f 4f 56 45 52 46 4c 4f 57  _DIRECT_OVERFLOW
24470 5f 52 45 41 44 0a 20 20 20 20 20 20 20 20 2f 2a  _READ.        /*
24480 20 49 66 20 61 6c 6c 20 74 68 65 20 66 6f 6c 6c   If all the foll
24490 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a  owing are true:.
244a0 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
244b0 20 20 20 2a 2a 20 20 20 31 29 20 74 68 69 73 20     **   1) this 
244c0 69 73 20 61 20 72 65 61 64 20 6f 70 65 72 61 74  is a read operat
244d0 69 6f 6e 2c 20 61 6e 64 20 0a 20 20 20 20 20 20  ion, and .      
244e0 20 20 2a 2a 20 20 20 32 29 20 64 61 74 61 20 69    **   2) data i
244f0 73 20 72 65 71 75 69 72 65 64 20 66 72 6f 6d 20  s required from 
24500 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 69  the start of thi
24510 73 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c  s overflow page,
24520 20 61 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20   and.        ** 
24530 20 20 33 29 20 74 68 65 20 64 61 74 61 62 61 73    3) the databas
24540 65 20 69 73 20 66 69 6c 65 2d 62 61 63 6b 65 64  e is file-backed
24550 2c 20 61 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a  , and.        **
24560 20 20 20 34 29 20 74 68 65 72 65 20 69 73 20 6e     4) there is n
24570 6f 20 6f 70 65 6e 20 77 72 69 74 65 2d 74 72 61  o open write-tra
24580 6e 73 61 63 74 69 6f 6e 2c 20 61 6e 64 0a 20 20  nsaction, and.  
24590 20 20 20 20 20 20 2a 2a 20 20 20 35 29 20 74 68        **   5) th
245a0 65 20 64 61 74 61 62 61 73 65 20 69 73 20 6e 6f  e database is no
245b0 74 20 61 20 57 41 4c 20 64 61 74 61 62 61 73 65  t a WAL database
245c0 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 36  ,.        **   6
245d0 29 20 61 6c 6c 20 64 61 74 61 20 66 72 6f 6d 20  ) all data from 
245e0 74 68 65 20 70 61 67 65 20 69 73 20 62 65 69 6e  the page is bein
245f0 67 20 72 65 61 64 2e 0a 20 20 20 20 20 20 20 20  g read..        
24600 2a 2a 20 20 20 37 29 20 61 74 20 6c 65 61 73 74  **   7) at least
24610 20 34 20 62 79 74 65 73 20 68 61 76 65 20 61 6c   4 bytes have al
24620 72 65 61 64 79 20 62 65 65 6e 20 72 65 61 64 20  ready been read 
24630 69 6e 74 6f 20 74 68 65 20 6f 75 74 70 75 74 20  into the output 
24640 62 75 66 66 65 72 20 0a 20 20 20 20 20 20 20 20  buffer .        
24650 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  **.        ** th
24660 65 6e 20 64 61 74 61 20 63 61 6e 20 62 65 20 72  en data can be r
24670 65 61 64 20 64 69 72 65 63 74 6c 79 20 66 72 6f  ead directly fro
24680 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  m the database f
24690 69 6c 65 20 69 6e 74 6f 20 74 68 65 0a 20 20 20  ile into the.   
246a0 20 20 20 20 20 2a 2a 20 6f 75 74 70 75 74 20 62       ** output b
246b0 75 66 66 65 72 2c 20 62 79 70 61 73 73 69 6e 67  uffer, bypassing
246c0 20 74 68 65 20 70 61 67 65 2d 63 61 63 68 65 20   the page-cache 
246d0 61 6c 74 6f 67 65 74 68 65 72 2e 20 54 68 69 73  altogether. This
246e0 20 73 70 65 65 64 73 0a 20 20 20 20 20 20 20 20   speeds.        
246f0 2a 2a 20 75 70 20 6c 6f 61 64 69 6e 67 20 6c 61  ** up loading la
24700 72 67 65 20 72 65 63 6f 72 64 73 20 74 68 61 74  rge records that
24710 20 73 70 61 6e 20 6d 61 6e 79 20 6f 76 65 72 66   span many overf
24720 6c 6f 77 20 70 61 67 65 73 2e 0a 20 20 20 20 20  low pages..     
24730 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66     */.        if
24740 28 20 28 65 4f 70 26 30 78 30 31 29 3d 3d 30 20  ( (eOp&0x01)==0 
24750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24770 20 20 20 20 20 2f 2a 20 28 31 29 20 2a 2f 0a 20       /* (1) */. 
24780 20 20 20 20 20 20 20 20 26 26 20 6f 66 66 73 65          && offse
24790 74 3d 3d 30 20 20 20 20 20 20 20 20 20 20 20 20  t==0            
247a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
247b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
247c0 20 28 32 29 20 2a 2f 0a 20 20 20 20 20 20 20 20   (2) */.        
247d0 20 26 26 20 28 62 45 6e 64 20 7c 7c 20 61 3d 3d   && (bEnd || a==
247e0 6f 76 66 6c 53 69 7a 65 29 20 20 20 20 20 20 20  ovflSize)       
247f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24800 20 20 20 20 20 20 20 2f 2a 20 28 36 29 20 2a 2f         /* (6) */
24810 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 42 74  .         && pBt
24820 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d  ->inTransaction=
24830 3d 54 52 41 4e 53 5f 52 45 41 44 20 20 20 20 20  =TRANS_READ     
24840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24850 2f 2a 20 28 34 29 20 2a 2f 0a 20 20 20 20 20 20  /* (4) */.      
24860 20 20 20 26 26 20 28 66 64 20 3d 20 73 71 6c 69     && (fd = sqli
24870 74 65 33 50 61 67 65 72 46 69 6c 65 28 70 42 74  te3PagerFile(pBt
24880 2d 3e 70 50 61 67 65 72 29 29 2d 3e 70 4d 65 74  ->pPager))->pMet
24890 68 6f 64 73 20 20 20 20 20 2f 2a 20 28 33 29 20  hods     /* (3) 
248a0 2a 2f 0a 20 20 20 20 20 20 20 20 20 26 26 20 70  */.         && p
248b0 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74  Bt->pPage1->aDat
248c0 61 5b 31 39 5d 3d 3d 30 78 30 31 20 20 20 20 20  a[19]==0x01     
248d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
248e0 20 20 2f 2a 20 28 35 29 20 2a 2f 0a 20 20 20 20    /* (5) */.    
248f0 20 20 20 20 20 26 26 20 26 70 42 75 66 5b 2d 34       && &pBuf[-4
24900 5d 3e 3d 70 42 75 66 53 74 61 72 74 20 20 20 20  ]>=pBufStart    
24910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24920 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28 37             /* (7
24930 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 29 7b 0a  ) */.        ){.
24940 20 20 20 20 20 20 20 20 20 20 75 38 20 61 53 61            u8 aSa
24950 76 65 5b 34 5d 3b 0a 20 20 20 20 20 20 20 20 20  ve[4];.         
24960 20 75 38 20 2a 61 57 72 69 74 65 20 3d 20 26 70   u8 *aWrite = &p
24970 42 75 66 5b 2d 34 5d 3b 0a 20 20 20 20 20 20 20  Buf[-4];.       
24980 20 20 20 61 73 73 65 72 74 28 20 61 57 72 69 74     assert( aWrit
24990 65 3e 3d 70 42 75 66 53 74 61 72 74 20 29 3b 20  e>=pBufStart ); 
249a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
249b0 20 20 20 20 20 20 20 20 2f 2a 20 68 65 6e 63 65          /* hence
249c0 20 28 37 29 20 2a 2f 0a 20 20 20 20 20 20 20 20   (7) */.        
249d0 20 20 6d 65 6d 63 70 79 28 61 53 61 76 65 2c 20    memcpy(aSave, 
249e0 61 57 72 69 74 65 2c 20 34 29 3b 0a 20 20 20 20  aWrite, 4);.    
249f0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
24a00 65 33 4f 73 52 65 61 64 28 66 64 2c 20 61 57 72  e3OsRead(fd, aWr
24a10 69 74 65 2c 20 61 2b 34 2c 20 28 69 36 34 29 70  ite, a+4, (i64)p
24a20 42 74 2d 3e 70 61 67 65 53 69 7a 65 2a 28 6e 65  Bt->pageSize*(ne
24a30 78 74 50 61 67 65 2d 31 29 29 3b 0a 20 20 20 20  xtPage-1));.    
24a40 20 20 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d        nextPage =
24a50 20 67 65 74 34 62 79 74 65 28 61 57 72 69 74 65   get4byte(aWrite
24a60 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d  );.          mem
24a70 63 70 79 28 61 57 72 69 74 65 2c 20 61 53 61 76  cpy(aWrite, aSav
24a80 65 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 7d  e, 4);.        }
24a90 65 6c 73 65 0a 23 65 6e 64 69 66 0a 0a 20 20 20  else.#endif..   
24aa0 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20       {.         
24ab0 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65   DbPage *pDbPage
24ac0 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
24ad0 20 73 71 6c 69 74 65 33 50 61 67 65 72 41 63 71   sqlite3PagerAcq
24ae0 75 69 72 65 28 70 42 74 2d 3e 70 50 61 67 65 72  uire(pBt->pPager
24af0 2c 20 6e 65 78 74 50 61 67 65 2c 20 26 70 44 62  , nextPage, &pDb
24b00 50 61 67 65 2c 0a 20 20 20 20 20 20 20 20 20 20  Page,.          
24b10 20 20 20 20 28 28 65 4f 70 26 30 78 30 31 29 3d      ((eOp&0x01)=
24b20 3d 30 20 3f 20 50 41 47 45 52 5f 47 45 54 5f 52  =0 ? PAGER_GET_R
24b30 45 41 44 4f 4e 4c 59 20 3a 20 30 29 0a 20 20 20  EADONLY : 0).   
24b40 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
24b50 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
24b60 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
24b70 20 20 20 20 20 61 50 61 79 6c 6f 61 64 20 3d 20       aPayload = 
24b80 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44  sqlite3PagerGetD
24b90 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20  ata(pDbPage);.  
24ba0 20 20 20 20 20 20 20 20 20 20 6e 65 78 74 50 61            nextPa
24bb0 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 61 50  ge = get4byte(aP
24bc0 61 79 6c 6f 61 64 29 3b 0a 20 20 20 20 20 20 20  ayload);.       
24bd0 20 20 20 20 20 72 63 20 3d 20 63 6f 70 79 50 61       rc = copyPa
24be0 79 6c 6f 61 64 28 26 61 50 61 79 6c 6f 61 64 5b  yload(&aPayload[
24bf0 6f 66 66 73 65 74 2b 34 5d 2c 20 70 42 75 66 2c  offset+4], pBuf,
24c00 20 61 2c 20 28 65 4f 70 26 30 78 30 31 29 2c 20   a, (eOp&0x01), 
24c10 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
24c20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
24c30 65 72 55 6e 72 65 66 28 70 44 62 50 61 67 65 29  erUnref(pDbPage)
24c40 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6f 66  ;.            of
24c50 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  fset = 0;.      
24c60 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
24c70 20 20 20 20 20 20 20 20 61 6d 74 20 2d 3d 20 61          amt -= a
24c80 3b 0a 20 20 20 20 20 20 20 20 70 42 75 66 20 2b  ;.        pBuf +
24c90 3d 20 61 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = a;.      }.   
24ca0 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63   }.  }..  if( rc
24cb0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61  ==SQLITE_OK && a
24cc0 6d 74 3e 30 20 29 7b 0a 20 20 20 20 72 65 74 75  mt>0 ){.    retu
24cd0 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
24ce0 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65  T_BKPT;.  }.  re
24cf0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
24d00 2a 20 52 65 61 64 20 70 61 72 74 20 6f 66 20 74  * Read part of t
24d10 68 65 20 6b 65 79 20 61 73 73 6f 63 69 61 74 65  he key associate
24d20 64 20 77 69 74 68 20 63 75 72 73 6f 72 20 70 43  d with cursor pC
24d30 75 72 2e 20 20 45 78 61 63 74 6c 79 0a 2a 2a 20  ur.  Exactly.** 
24d40 22 61 6d 74 22 20 62 79 74 65 73 20 77 69 6c 6c  "amt" bytes will
24d50 20 62 65 20 74 72 61 6e 73 66 65 72 72 65 64 20   be transferred 
24d60 69 6e 74 6f 20 70 42 75 66 5b 5d 2e 20 20 54 68  into pBuf[].  Th
24d70 65 20 74 72 61 6e 73 66 65 72 0a 2a 2a 20 62 65  e transfer.** be
24d80 67 69 6e 73 20 61 74 20 22 6f 66 66 73 65 74 22  gins at "offset"
24d90 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c  ..**.** The call
24da0 65 72 20 6d 75 73 74 20 65 6e 73 75 72 65 20 74  er must ensure t
24db0 68 61 74 20 70 43 75 72 20 69 73 20 70 6f 69 6e  hat pCur is poin
24dc0 74 69 6e 67 20 74 6f 20 61 20 76 61 6c 69 64 20  ting to a valid 
24dd0 72 6f 77 0a 2a 2a 20 69 6e 20 74 68 65 20 74 61  row.** in the ta
24de0 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  ble..**.** Retur
24df0 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73  n SQLITE_OK on s
24e00 75 63 63 65 73 73 20 6f 72 20 61 6e 20 65 72 72  uccess or an err
24e10 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 79 74 68  or code if anyth
24e20 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e  ing goes.** wron
24e30 67 2e 20 20 41 6e 20 65 72 72 6f 72 20 69 73 20  g.  An error is 
24e40 72 65 74 75 72 6e 65 64 20 69 66 20 22 6f 66 66  returned if "off
24e50 73 65 74 2b 61 6d 74 22 20 69 73 20 6c 61 72 67  set+amt" is larg
24e60 65 72 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20 61  er than.** the a
24e70 76 61 69 6c 61 62 6c 65 20 70 61 79 6c 6f 61 64  vailable payload
24e80 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
24e90 42 74 72 65 65 4b 65 79 28 42 74 43 75 72 73 6f  BtreeKey(BtCurso
24ea0 72 20 2a 70 43 75 72 2c 20 75 33 32 20 6f 66 66  r *pCur, u32 off
24eb0 73 65 74 2c 20 75 33 32 20 61 6d 74 2c 20 76 6f  set, u32 amt, vo
24ec0 69 64 20 2a 70 42 75 66 29 7b 0a 20 20 61 73 73  id *pBuf){.  ass
24ed0 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
24ee0 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
24ef0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
24f00 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
24f10 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28  LID );.  assert(
24f20 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20   pCur->iPage>=0 
24f30 26 26 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  && pCur->apPage[
24f40 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a  pCur->iPage] );.
24f50 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
24f60 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
24f70 65 5d 3c 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  e]<pCur->apPage[
24f80 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43  pCur->iPage]->nC
24f90 65 6c 6c 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  ell );.  return 
24fa0 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 70 43  accessPayload(pC
24fb0 75 72 2c 20 6f 66 66 73 65 74 2c 20 61 6d 74 2c  ur, offset, amt,
24fc0 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a   (unsigned char*
24fd0 29 70 42 75 66 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a  )pBuf, 0);.}../*
24fe0 0a 2a 2a 20 52 65 61 64 20 70 61 72 74 20 6f 66  .** Read part of
24ff0 20 74 68 65 20 64 61 74 61 20 61 73 73 6f 63 69   the data associ
25000 61 74 65 64 20 77 69 74 68 20 63 75 72 73 6f 72  ated with cursor
25010 20 70 43 75 72 2e 20 20 45 78 61 63 74 6c 79 0a   pCur.  Exactly.
25020 2a 2a 20 22 61 6d 74 22 20 62 79 74 65 73 20 77  ** "amt" bytes w
25030 69 6c 6c 20 62 65 20 74 72 61 6e 73 66 65 72 65  ill be transfere
25040 64 20 69 6e 74 6f 20 70 42 75 66 5b 5d 2e 20 20  d into pBuf[].  
25050 54 68 65 20 74 72 61 6e 73 66 65 72 0a 2a 2a 20  The transfer.** 
25060 62 65 67 69 6e 73 20 61 74 20 22 6f 66 66 73 65  begins at "offse
25070 74 22 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  t"..**.** Return
25080 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75   SQLITE_OK on su
25090 63 63 65 73 73 20 6f 72 20 61 6e 20 65 72 72 6f  ccess or an erro
250a0 72 20 63 6f 64 65 20 69 66 20 61 6e 79 74 68 69  r code if anythi
250b0 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67  ng goes.** wrong
250c0 2e 20 20 41 6e 20 65 72 72 6f 72 20 69 73 20 72  .  An error is r
250d0 65 74 75 72 6e 65 64 20 69 66 20 22 6f 66 66 73  eturned if "offs
250e0 65 74 2b 61 6d 74 22 20 69 73 20 6c 61 72 67 65  et+amt" is large
250f0 72 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20 61 76  r than.** the av
25100 61 69 6c 61 62 6c 65 20 70 61 79 6c 6f 61 64 2e  ailable payload.
25110 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
25120 74 72 65 65 44 61 74 61 28 42 74 43 75 72 73 6f  treeData(BtCurso
25130 72 20 2a 70 43 75 72 2c 20 75 33 32 20 6f 66 66  r *pCur, u32 off
25140 73 65 74 2c 20 75 33 32 20 61 6d 74 2c 20 76 6f  set, u32 amt, vo
25150 69 64 20 2a 70 42 75 66 29 7b 0a 20 20 69 6e 74  id *pBuf){.  int
25160 20 72 63 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51   rc;..#ifndef SQ
25170 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c  LITE_OMIT_INCRBL
25180 4f 42 0a 20 20 69 66 20 28 20 70 43 75 72 2d 3e  OB.  if ( pCur->
25190 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49  eState==CURSOR_I
251a0 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 72 65  NVALID ){.    re
251b0 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 42 4f 52  turn SQLITE_ABOR
251c0 54 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  T;.  }.#endif.. 
251d0 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
251e0 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
251f0 29 3b 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72  );.  rc = restor
25200 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
25210 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d  pCur);.  if( rc=
25220 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
25230 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
25240 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
25250 41 4c 49 44 20 29 3b 0a 20 20 20 20 61 73 73 65  ALID );.    asse
25260 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e  rt( pCur->iPage>
25270 3d 30 20 26 26 20 70 43 75 72 2d 3e 61 70 50 61  =0 && pCur->apPa
25280 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20  ge[pCur->iPage] 
25290 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
252a0 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
252b0 3e 69 50 61 67 65 5d 3c 70 43 75 72 2d 3e 61 70  >iPage]<pCur->ap
252c0 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
252d0 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20  ]->nCell );.    
252e0 72 63 20 3d 20 61 63 63 65 73 73 50 61 79 6c 6f  rc = accessPaylo
252f0 61 64 28 70 43 75 72 2c 20 6f 66 66 73 65 74 2c  ad(pCur, offset,
25300 20 61 6d 74 2c 20 70 42 75 66 2c 20 30 29 3b 0a   amt, pBuf, 0);.
25310 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
25320 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
25330 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 61   a pointer to pa
25340 79 6c 6f 61 64 20 69 6e 66 6f 72 6d 61 74 69 6f  yload informatio
25350 6e 20 66 72 6f 6d 20 74 68 65 20 65 6e 74 72 79  n from the entry
25360 20 74 68 61 74 20 74 68 65 20 0a 2a 2a 20 70 43   that the .** pC
25370 75 72 20 63 75 72 73 6f 72 20 69 73 20 70 6f 69  ur cursor is poi
25380 6e 74 69 6e 67 20 74 6f 2e 20 20 54 68 65 20 70  nting to.  The p
25390 6f 69 6e 74 65 72 20 69 73 20 74 6f 20 74 68 65  ointer is to the
253a0 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 0a 2a 2a   beginning of.**
253b0 20 74 68 65 20 6b 65 79 20 69 66 20 69 6e 64 65   the key if inde
253c0 78 20 62 74 72 65 65 73 20 28 70 50 61 67 65 2d  x btrees (pPage-
253d0 3e 69 6e 74 4b 65 79 3d 3d 30 29 20 61 6e 64 20  >intKey==0) and 
253e0 69 73 20 74 68 65 20 64 61 74 61 20 66 6f 72 0a  is the data for.
253f0 2a 2a 20 74 61 62 6c 65 20 62 74 72 65 65 73 20  ** table btrees 
25400 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3d 3d  (pPage->intKey==
25410 31 29 2e 20 54 68 65 20 6e 75 6d 62 65 72 20 6f  1). The number o
25420 66 20 62 79 74 65 73 20 6f 66 20 61 76 61 69 6c  f bytes of avail
25430 61 62 6c 65 0a 2a 2a 20 6b 65 79 2f 64 61 74 61  able.** key/data
25440 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   is written into
25450 20 2a 70 41 6d 74 2e 20 20 49 66 20 2a 70 41 6d   *pAmt.  If *pAm
25460 74 3d 3d 30 2c 20 74 68 65 6e 20 74 68 65 20 76  t==0, then the v
25470 61 6c 75 65 0a 2a 2a 20 72 65 74 75 72 6e 65 64  alue.** returned
25480 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 61 20 76   will not be a v
25490 61 6c 69 64 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a  alid pointer..**
254a0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
254b0 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74   is an optimizat
254c0 69 6f 6e 2e 20 20 49 74 20 69 73 20 63 6f 6d 6d  ion.  It is comm
254d0 6f 6e 20 66 6f 72 20 74 68 65 20 65 6e 74 69 72  on for the entir
254e0 65 20 6b 65 79 0a 2a 2a 20 61 6e 64 20 64 61 74  e key.** and dat
254f0 61 20 74 6f 20 66 69 74 20 6f 6e 20 74 68 65 20  a to fit on the 
25500 6c 6f 63 61 6c 20 70 61 67 65 20 61 6e 64 20 66  local page and f
25510 6f 72 20 74 68 65 72 65 20 74 6f 20 62 65 20 6e  or there to be n
25520 6f 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20 70 61  o overflow.** pa
25530 67 65 73 2e 20 20 57 68 65 6e 20 74 68 61 74 20  ges.  When that 
25540 69 73 20 73 6f 2c 20 74 68 69 73 20 72 6f 75 74  is so, this rout
25550 69 6e 65 20 63 61 6e 20 62 65 20 75 73 65 64 20  ine can be used 
25560 74 6f 20 61 63 63 65 73 73 20 74 68 65 0a 2a 2a  to access the.**
25570 20 6b 65 79 20 61 6e 64 20 64 61 74 61 20 77 69   key and data wi
25580 74 68 6f 75 74 20 6d 61 6b 69 6e 67 20 61 20 63  thout making a c
25590 6f 70 79 2e 20 20 49 66 20 74 68 65 20 6b 65 79  opy.  If the key
255a0 20 61 6e 64 2f 6f 72 20 64 61 74 61 20 73 70 69   and/or data spi
255b0 6c 6c 73 0a 2a 2a 20 6f 6e 74 6f 20 6f 76 65 72  lls.** onto over
255c0 66 6c 6f 77 20 70 61 67 65 73 2c 20 74 68 65 6e  flow pages, then
255d0 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 29   accessPayload()
255e0 20 6d 75 73 74 20 62 65 20 75 73 65 64 20 74 6f   must be used to
255f0 20 72 65 61 73 73 65 6d 62 6c 65 0a 2a 2a 20 74   reassemble.** t
25600 68 65 20 6b 65 79 2f 64 61 74 61 20 61 6e 64 20  he key/data and 
25610 63 6f 70 79 20 69 74 20 69 6e 74 6f 20 61 20 70  copy it into a p
25620 72 65 61 6c 6c 6f 63 61 74 65 64 20 62 75 66 66  reallocated buff
25630 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f  er..**.** The po
25640 69 6e 74 65 72 20 72 65 74 75 72 6e 65 64 20 62  inter returned b
25650 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6c  y this routine l
25660 6f 6f 6b 73 20 64 69 72 65 63 74 6c 79 20 69 6e  ooks directly in
25670 74 6f 20 74 68 65 20 63 61 63 68 65 64 0a 2a 2a  to the cached.**
25680 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61 74   page of the dat
25690 61 62 61 73 65 2e 20 20 54 68 65 20 64 61 74 61  abase.  The data
256a0 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20 6f 72   might change or
256b0 20 6d 6f 76 65 20 74 68 65 20 6e 65 78 74 20 74   move the next t
256c0 69 6d 65 0a 2a 2a 20 61 6e 79 20 62 74 72 65 65  ime.** any btree
256d0 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
256e0 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  ed..*/.static co
256f0 6e 73 74 20 76 6f 69 64 20 2a 66 65 74 63 68 50  nst void *fetchP
25700 61 79 6c 6f 61 64 28 0a 20 20 42 74 43 75 72 73  ayload(.  BtCurs
25710 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20 2f  or *pCur,      /
25720 2a 20 43 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e  * Cursor pointin
25730 67 20 74 6f 20 65 6e 74 72 79 20 74 6f 20 72 65  g to entry to re
25740 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32  ad from */.  u32
25750 20 2a 70 41 6d 74 20 20 20 20 20 20 20 20 20 20   *pAmt          
25760 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e    /* Write the n
25770 75 6d 62 65 72 20 6f 66 20 61 76 61 69 6c 61 62  umber of availab
25780 6c 65 20 62 79 74 65 73 20 68 65 72 65 20 2a 2f  le bytes here */
25790 0a 29 7b 0a 20 20 75 33 32 20 61 6d 74 3b 0a 20  .){.  u32 amt;. 
257a0 20 61 73 73 65 72 74 28 20 70 43 75 72 21 3d 30   assert( pCur!=0
257b0 20 26 26 20 70 43 75 72 2d 3e 69 50 61 67 65 3e   && pCur->iPage>
257c0 3d 30 20 26 26 20 70 43 75 72 2d 3e 61 70 50 61  =0 && pCur->apPa
257d0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29  ge[pCur->iPage])
257e0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
257f0 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
25800 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65  _VALID );.  asse
25810 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
25820 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74  x_held(pCur->pBt
25830 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  ree->db->mutex) 
25840 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  );.  assert( cur
25850 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
25860 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
25870 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
25880 72 2d 3e 69 50 61 67 65 5d 3c 70 43 75 72 2d 3e  r->iPage]<pCur->
25890 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
258a0 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20  ge]->nCell );.  
258b0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 6e  assert( pCur->in
258c0 66 6f 2e 6e 53 69 7a 65 3e 30 20 29 3b 0a 20 20  fo.nSize>0 );.  
258d0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 6e  assert( pCur->in
258e0 66 6f 2e 70 50 61 79 6c 6f 61 64 3e 70 43 75 72  fo.pPayload>pCur
258f0 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
25900 50 61 67 65 5d 2d 3e 61 44 61 74 61 20 7c 7c 20  Page]->aData || 
25910 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20  CORRUPT_DB );.  
25920 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 6e  assert( pCur->in
25930 66 6f 2e 70 50 61 79 6c 6f 61 64 3c 70 43 75 72  fo.pPayload<pCur
25940 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
25950 50 61 67 65 5d 2d 3e 61 44 61 74 61 45 6e 64 20  Page]->aDataEnd 
25960 7c 7c 43 4f 52 52 55 50 54 5f 44 42 29 3b 0a 20  ||CORRUPT_DB);. 
25970 20 61 6d 74 20 3d 20 28 69 6e 74 29 28 70 43 75   amt = (int)(pCu
25980 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
25990 69 50 61 67 65 5d 2d 3e 61 44 61 74 61 45 6e 64  iPage]->aDataEnd
259a0 20 2d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 50   - pCur->info.pP
259b0 61 79 6c 6f 61 64 29 3b 0a 20 20 69 66 28 20 70  ayload);.  if( p
259c0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  Cur->info.nLocal
259d0 3c 61 6d 74 20 29 20 61 6d 74 20 3d 20 70 43 75  <amt ) amt = pCu
259e0 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a  r->info.nLocal;.
259f0 20 20 2a 70 41 6d 74 20 3d 20 61 6d 74 3b 0a 20    *pAmt = amt;. 
25a00 20 72 65 74 75 72 6e 20 28 76 6f 69 64 2a 29 70   return (void*)p
25a10 43 75 72 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f  Cur->info.pPaylo
25a20 61 64 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 46 6f  ad;.}.../*.** Fo
25a30 72 20 74 68 65 20 65 6e 74 72 79 20 74 68 61 74  r the entry that
25a40 20 63 75 72 73 6f 72 20 70 43 75 72 20 69 73 20   cursor pCur is 
25a50 70 6f 69 6e 74 20 74 6f 2c 20 72 65 74 75 72 6e  point to, return
25a60 20 61 73 0a 2a 2a 20 6d 61 6e 79 20 62 79 74 65   as.** many byte
25a70 73 20 6f 66 20 74 68 65 20 6b 65 79 20 6f 72 20  s of the key or 
25a80 64 61 74 61 20 61 73 20 61 72 65 20 61 76 61 69  data as are avai
25a90 6c 61 62 6c 65 20 6f 6e 20 74 68 65 20 6c 6f 63  lable on the loc
25aa0 61 6c 0a 2a 2a 20 62 2d 74 72 65 65 20 70 61 67  al.** b-tree pag
25ab0 65 2e 20 20 57 72 69 74 65 20 74 68 65 20 6e 75  e.  Write the nu
25ac0 6d 62 65 72 20 6f 66 20 61 76 61 69 6c 61 62 6c  mber of availabl
25ad0 65 20 62 79 74 65 73 20 69 6e 74 6f 20 2a 70 41  e bytes into *pA
25ae0 6d 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f  mt..**.** The po
25af0 69 6e 74 65 72 20 72 65 74 75 72 6e 65 64 20 69  inter returned i
25b00 73 20 65 70 68 65 6d 65 72 61 6c 2e 20 20 54 68  s ephemeral.  Th
25b10 65 20 6b 65 79 2f 64 61 74 61 20 6d 61 79 20 6d  e key/data may m
25b20 6f 76 65 0a 2a 2a 20 6f 72 20 62 65 20 64 65 73  ove.** or be des
25b30 74 72 6f 79 65 64 20 6f 6e 20 74 68 65 20 6e 65  troyed on the ne
25b40 78 74 20 63 61 6c 6c 20 74 6f 20 61 6e 79 20 42  xt call to any B
25b50 74 72 65 65 20 72 6f 75 74 69 6e 65 2c 0a 2a 2a  tree routine,.**
25b60 20 69 6e 63 6c 75 64 69 6e 67 20 63 61 6c 6c 73   including calls
25b70 20 66 72 6f 6d 20 6f 74 68 65 72 20 74 68 72 65   from other thre
25b80 61 64 73 20 61 67 61 69 6e 73 74 20 74 68 65 20  ads against the 
25b90 73 61 6d 65 20 63 61 63 68 65 2e 0a 2a 2a 20 48  same cache..** H
25ba0 65 6e 63 65 2c 20 61 20 6d 75 74 65 78 20 6f 6e  ence, a mutex on
25bb0 20 74 68 65 20 42 74 53 68 61 72 65 64 20 73 68   the BtShared sh
25bc0 6f 75 6c 64 20 62 65 20 68 65 6c 64 20 70 72 69  ould be held pri
25bd0 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67 0a 2a 2a  or to calling.**
25be0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a   this routine..*
25bf0 2a 0a 2a 2a 20 54 68 65 73 65 20 72 6f 75 74 69  *.** These routi
25c00 6e 65 73 20 69 73 20 75 73 65 64 20 74 6f 20 67  nes is used to g
25c10 65 74 20 71 75 69 63 6b 20 61 63 63 65 73 73 20  et quick access 
25c20 74 6f 20 6b 65 79 20 61 6e 64 20 64 61 74 61 0a  to key and data.
25c30 2a 2a 20 69 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e  ** in the common
25c40 20 63 61 73 65 20 77 68 65 72 65 20 6e 6f 20 6f   case where no o
25c50 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61 72  verflow pages ar
25c60 65 20 75 73 65 64 2e 0a 2a 2f 0a 63 6f 6e 73 74  e used..*/.const
25c70 20 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 42 74   void *sqlite3Bt
25c80 72 65 65 4b 65 79 46 65 74 63 68 28 42 74 43 75  reeKeyFetch(BtCu
25c90 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20  rsor *pCur, u32 
25ca0 2a 70 41 6d 74 29 7b 0a 20 20 72 65 74 75 72 6e  *pAmt){.  return
25cb0 20 66 65 74 63 68 50 61 79 6c 6f 61 64 28 70 43   fetchPayload(pC
25cc0 75 72 2c 20 70 41 6d 74 29 3b 0a 7d 0a 63 6f 6e  ur, pAmt);.}.con
25cd0 73 74 20 76 6f 69 64 20 2a 73 71 6c 69 74 65 33  st void *sqlite3
25ce0 42 74 72 65 65 44 61 74 61 46 65 74 63 68 28 42  BtreeDataFetch(B
25cf0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75  tCursor *pCur, u
25d00 33 32 20 2a 70 41 6d 74 29 7b 0a 20 20 72 65 74  32 *pAmt){.  ret
25d10 75 72 6e 20 66 65 74 63 68 50 61 79 6c 6f 61 64  urn fetchPayload
25d20 28 70 43 75 72 2c 20 70 41 6d 74 29 3b 0a 7d 0a  (pCur, pAmt);.}.
25d30 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65  ../*.** Move the
25d40 20 63 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20   cursor down to 
25d50 61 20 6e 65 77 20 63 68 69 6c 64 20 70 61 67 65  a new child page
25d60 2e 20 20 54 68 65 20 6e 65 77 50 67 6e 6f 20 61  .  The newPgno a
25d70 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 0a 2a  rgument is the.*
25d80 2a 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  * page number of
25d90 20 74 68 65 20 63 68 69 6c 64 20 70 61 67 65 20   the child page 
25da0 74 6f 20 6d 6f 76 65 20 74 6f 2e 0a 2a 2a 0a 2a  to move to..**.*
25db0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
25dc0 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 43  returns SQLITE_C
25dd0 4f 52 52 55 50 54 20 69 66 20 74 68 65 20 70 61  ORRUPT if the pa
25de0 67 65 2d 68 65 61 64 65 72 20 66 6c 61 67 73 20  ge-header flags 
25df0 66 69 65 6c 64 20 6f 66 0a 2a 2a 20 74 68 65 20  field of.** the 
25e00 6e 65 77 20 63 68 69 6c 64 20 70 61 67 65 20 64  new child page d
25e10 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 74 68  oes not match th
25e20 65 20 66 6c 61 67 73 20 66 69 65 6c 64 20 6f 66  e flags field of
25e30 20 74 68 65 20 70 61 72 65 6e 74 20 28 69 2e 65   the parent (i.e
25e40 2e 0a 2a 2a 20 69 66 20 61 6e 20 69 6e 74 6b 65  ..** if an intke
25e50 79 20 70 61 67 65 20 61 70 70 65 61 72 73 20 74  y page appears t
25e60 6f 20 62 65 20 74 68 65 20 70 61 72 65 6e 74 20  o be the parent 
25e70 6f 66 20 61 20 6e 6f 6e 2d 69 6e 74 6b 65 79 20  of a non-intkey 
25e80 70 61 67 65 2c 20 6f 72 0a 2a 2a 20 76 69 63 65  page, or.** vice
25e90 2d 76 65 72 73 61 29 2e 0a 2a 2f 0a 73 74 61 74  -versa)..*/.stat
25ea0 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 43 68 69  ic int moveToChi
25eb0 6c 64 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  ld(BtCursor *pCu
25ec0 72 2c 20 75 33 32 20 6e 65 77 50 67 6e 6f 29 7b  r, u32 newPgno){
25ed0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74  .  int rc;.  int
25ee0 20 69 20 3d 20 70 43 75 72 2d 3e 69 50 61 67 65   i = pCur->iPage
25ef0 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65  ;.  MemPage *pNe
25f00 77 50 61 67 65 3b 0a 20 20 42 74 53 68 61 72 65  wPage;.  BtShare
25f10 64 20 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e 70  d *pBt = pCur->p
25f20 42 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63  Bt;..  assert( c
25f30 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
25f40 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
25f50 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
25f60 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
25f70 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
25f80 3e 69 50 61 67 65 3c 42 54 43 55 52 53 4f 52 5f  >iPage<BTCURSOR_
25f90 4d 41 58 5f 44 45 50 54 48 20 29 3b 0a 20 20 61  MAX_DEPTH );.  a
25fa0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61  ssert( pCur->iPa
25fb0 67 65 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  ge>=0 );.  if( p
25fc0 43 75 72 2d 3e 69 50 61 67 65 3e 3d 28 42 54 43  Cur->iPage>=(BTC
25fd0 55 52 53 4f 52 5f 4d 41 58 5f 44 45 50 54 48 2d  URSOR_MAX_DEPTH-
25fe0 31 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  1) ){.    return
25ff0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
26000 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  BKPT;.  }.  rc =
26010 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28   getAndInitPage(
26020 70 42 74 2c 20 6e 65 77 50 67 6e 6f 2c 20 26 70  pBt, newPgno, &p
26030 4e 65 77 50 61 67 65 2c 0a 20 20 20 20 20 20 20  NewPage,.       
26040 20 20 20 20 20 20 20 20 28 70 43 75 72 2d 3e 63          (pCur->c
26050 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 57  urFlags & BTCF_W
26060 72 69 74 65 46 6c 61 67 29 3d 3d 30 20 3f 20 50  riteFlag)==0 ? P
26070 41 47 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c  AGER_GET_READONL
26080 59 20 3a 20 30 29 3b 0a 20 20 69 66 28 20 72 63  Y : 0);.  if( rc
26090 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
260a0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 2b 31  pCur->apPage[i+1
260b0 5d 20 3d 20 70 4e 65 77 50 61 67 65 3b 0a 20 20  ] = pNewPage;.  
260c0 70 43 75 72 2d 3e 61 69 49 64 78 5b 69 2b 31 5d  pCur->aiIdx[i+1]
260d0 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 69 50   = 0;.  pCur->iP
260e0 61 67 65 2b 2b 3b 0a 0a 20 20 70 43 75 72 2d 3e  age++;..  pCur->
260f0 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a  info.nSize = 0;.
26100 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73    pCur->curFlags
26110 20 26 3d 20 7e 28 42 54 43 46 5f 56 61 6c 69 64   &= ~(BTCF_Valid
26120 4e 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f  NKey|BTCF_ValidO
26130 76 66 6c 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  vfl);.  if( pNew
26140 50 61 67 65 2d 3e 6e 43 65 6c 6c 3c 31 20 7c 7c  Page->nCell<1 ||
26150 20 70 4e 65 77 50 61 67 65 2d 3e 69 6e 74 4b 65   pNewPage->intKe
26160 79 21 3d 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  y!=pCur->apPage[
26170 69 5d 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20  i]->intKey ){.  
26180 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
26190 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
261a0 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
261b0 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c  E_OK;.}..#if SQL
261c0 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20  ITE_DEBUG./*.** 
261d0 50 61 67 65 20 70 50 61 72 65 6e 74 20 69 73 20  Page pParent is 
261e0 61 6e 20 69 6e 74 65 72 6e 61 6c 20 28 6e 6f 6e  an internal (non
261f0 2d 6c 65 61 66 29 20 74 72 65 65 20 70 61 67 65  -leaf) tree page
26200 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
26210 0a 2a 2a 20 61 73 73 65 72 74 73 20 74 68 61 74  .** asserts that
26220 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 43 68   page number iCh
26230 69 6c 64 20 69 73 20 74 68 65 20 6c 65 66 74 2d  ild is the left-
26240 63 68 69 6c 64 20 69 66 20 74 68 65 20 69 49 64  child if the iId
26250 78 27 74 68 0a 2a 2a 20 63 65 6c 6c 20 69 6e 20  x'th.** cell in 
26260 70 61 67 65 20 70 50 61 72 65 6e 74 2e 20 4f 72  page pParent. Or
26270 2c 20 69 66 20 69 49 64 78 20 69 73 20 65 71 75  , if iIdx is equ
26280 61 6c 20 74 6f 20 74 68 65 20 74 6f 74 61 6c 20  al to the total 
26290 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 63 65 6c  number of.** cel
262a0 6c 73 20 69 6e 20 70 50 61 72 65 6e 74 2c 20 74  ls in pParent, t
262b0 68 61 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20  hat page number 
262c0 69 43 68 69 6c 64 20 69 73 20 74 68 65 20 72 69  iChild is the ri
262d0 67 68 74 2d 63 68 69 6c 64 20 6f 66 0a 2a 2a 20  ght-child of.** 
262e0 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61  the page..*/.sta
262f0 74 69 63 20 76 6f 69 64 20 61 73 73 65 72 74 50  tic void assertP
26300 61 72 65 6e 74 49 6e 64 65 78 28 4d 65 6d 50 61  arentIndex(MemPa
26310 67 65 20 2a 70 50 61 72 65 6e 74 2c 20 69 6e 74  ge *pParent, int
26320 20 69 49 64 78 2c 20 50 67 6e 6f 20 69 43 68 69   iIdx, Pgno iChi
26330 6c 64 29 7b 0a 20 20 69 66 28 20 43 4f 52 52 55  ld){.  if( CORRU
26340 50 54 5f 44 42 20 29 20 72 65 74 75 72 6e 3b 20  PT_DB ) return; 
26350 20 2f 2a 20 54 68 65 20 63 6f 6e 64 69 74 69 6f   /* The conditio
26360 6e 73 20 74 65 73 74 65 64 20 62 65 6c 6f 77 20  ns tested below 
26370 6d 69 67 68 74 20 6e 6f 74 20 62 65 20 74 72 75  might not be tru
26380 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e.              
26390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
263a0 20 69 6e 20 61 20 63 6f 72 72 75 70 74 20 64 61   in a corrupt da
263b0 74 61 62 61 73 65 20 2a 2f 0a 20 20 61 73 73 65  tabase */.  asse
263c0 72 74 28 20 69 49 64 78 3c 3d 70 50 61 72 65 6e  rt( iIdx<=pParen
263d0 74 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 69 66  t->nCell );.  if
263e0 28 20 69 49 64 78 3d 3d 70 50 61 72 65 6e 74 2d  ( iIdx==pParent-
263f0 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 61 73  >nCell ){.    as
26400 73 65 72 74 28 20 67 65 74 34 62 79 74 65 28 26  sert( get4byte(&
26410 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70  pParent->aData[p
26420 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65  Parent->hdrOffse
26430 74 2b 38 5d 29 3d 3d 69 43 68 69 6c 64 20 29 3b  t+8])==iChild );
26440 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
26450 73 65 72 74 28 20 67 65 74 34 62 79 74 65 28 66  sert( get4byte(f
26460 69 6e 64 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c  indCell(pParent,
26470 20 69 49 64 78 29 29 3d 3d 69 43 68 69 6c 64 20   iIdx))==iChild 
26480 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23  );.  }.}.#else.#
26490 20 20 64 65 66 69 6e 65 20 61 73 73 65 72 74 50    define assertP
264a0 61 72 65 6e 74 49 6e 64 65 78 28 78 2c 79 2c 7a  arentIndex(x,y,z
264b0 29 20 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  ) .#endif../*.**
264c0 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72   Move the cursor
264d0 20 75 70 20 74 6f 20 74 68 65 20 70 61 72 65 6e   up to the paren
264e0 74 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 70 43  t page..**.** pC
264f0 75 72 2d 3e 69 64 78 20 69 73 20 73 65 74 20 74  ur->idx is set t
26500 6f 20 74 68 65 20 63 65 6c 6c 20 69 6e 64 65 78  o the cell index
26510 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74   that contains t
26520 68 65 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f  he pointer.** to
26530 20 74 68 65 20 70 61 67 65 20 77 65 20 61 72 65   the page we are
26540 20 63 6f 6d 69 6e 67 20 66 72 6f 6d 2e 20 20 49   coming from.  I
26550 66 20 77 65 20 61 72 65 20 63 6f 6d 69 6e 67 20  f we are coming 
26560 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 72 69 67 68  from the.** righ
26570 74 2d 6d 6f 73 74 20 63 68 69 6c 64 20 70 61 67  t-most child pag
26580 65 20 74 68 65 6e 20 70 43 75 72 2d 3e 69 64 78  e then pCur->idx
26590 20 69 73 20 73 65 74 20 74 6f 20 6f 6e 65 20 6d   is set to one m
265a0 6f 72 65 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20  ore than.** the 
265b0 6c 61 72 67 65 73 74 20 63 65 6c 6c 20 69 6e 64  largest cell ind
265c0 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ex..*/.static vo
265d0 69 64 20 6d 6f 76 65 54 6f 50 61 72 65 6e 74 28  id moveToParent(
265e0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
265f0 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
26600 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
26610 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
26620 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
26630 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61  SOR_VALID );.  a
26640 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61  ssert( pCur->iPa
26650 67 65 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74  ge>0 );.  assert
26660 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  ( pCur->apPage[p
26670 43 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20  Cur->iPage] );. 
26680 20 61 73 73 65 72 74 50 61 72 65 6e 74 49 6e 64   assertParentInd
26690 65 78 28 0a 20 20 20 20 70 43 75 72 2d 3e 61 70  ex(.    pCur->ap
266a0 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
266b0 2d 31 5d 2c 20 0a 20 20 20 20 70 43 75 72 2d 3e  -1], .    pCur->
266c0 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
266d0 65 2d 31 5d 2c 20 0a 20 20 20 20 70 43 75 72 2d  e-1], .    pCur-
266e0 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
266f0 61 67 65 5d 2d 3e 70 67 6e 6f 0a 20 20 29 3b 0a  age]->pgno.  );.
26700 20 20 74 65 73 74 63 61 73 65 28 20 70 43 75 72    testcase( pCur
26710 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
26720 61 67 65 2d 31 5d 20 3e 20 70 43 75 72 2d 3e 61  age-1] > pCur->a
26730 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
26740 65 2d 31 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 0a  e-1]->nCell );..
26750 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 43    releasePage(pC
26760 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
26770 3e 69 50 61 67 65 5d 29 3b 0a 20 20 70 43 75 72  >iPage]);.  pCur
26780 2d 3e 69 50 61 67 65 2d 2d 3b 0a 20 20 70 43 75  ->iPage--;.  pCu
26790 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20  r->info.nSize = 
267a0 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72 46 6c  0;.  pCur->curFl
267b0 61 67 73 20 26 3d 20 7e 28 42 54 43 46 5f 56 61  ags &= ~(BTCF_Va
267c0 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56 61 6c  lidNKey|BTCF_Val
267d0 69 64 4f 76 66 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  idOvfl);.}../*.*
267e0 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f  * Move the curso
267f0 72 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68  r to point to th
26800 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 69  e root page of i
26810 74 73 20 62 2d 74 72 65 65 20 73 74 72 75 63 74  ts b-tree struct
26820 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ure..**.** If th
26830 65 20 74 61 62 6c 65 20 68 61 73 20 61 20 76 69  e table has a vi
26840 72 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 2c  rtual root page,
26850 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72   then the cursor
26860 20 69 73 20 6d 6f 76 65 64 20 74 6f 20 70 6f 69   is moved to poi
26870 6e 74 0a 2a 2a 20 74 6f 20 74 68 65 20 76 69 72  nt.** to the vir
26880 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 20 69  tual root page i
26890 6e 73 74 65 61 64 20 6f 66 20 74 68 65 20 61 63  nstead of the ac
268a0 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 2e 20  tual root page. 
268b0 41 20 74 61 62 6c 65 20 68 61 73 20 61 0a 2a 2a  A table has a.**
268c0 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61   virtual root pa
268d0 67 65 20 77 68 65 6e 20 74 68 65 20 61 63 74 75  ge when the actu
268e0 61 6c 20 72 6f 6f 74 20 70 61 67 65 20 63 6f 6e  al root page con
268f0 74 61 69 6e 73 20 6e 6f 20 63 65 6c 6c 73 20 61  tains no cells a
26900 6e 64 20 61 20 0a 2a 2a 20 73 69 6e 67 6c 65 20  nd a .** single 
26910 63 68 69 6c 64 20 70 61 67 65 2e 20 54 68 69 73  child page. This
26920 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e   can only happen
26930 20 77 69 74 68 20 74 68 65 20 74 61 62 6c 65 20   with the table 
26940 72 6f 6f 74 65 64 20 61 74 20 70 61 67 65 20 31  rooted at page 1
26950 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 62  ..**.** If the b
26960 2d 74 72 65 65 20 73 74 72 75 63 74 75 72 65 20  -tree structure 
26970 69 73 20 65 6d 70 74 79 2c 20 74 68 65 20 63 75  is empty, the cu
26980 72 73 6f 72 20 73 74 61 74 65 20 69 73 20 73 65  rsor state is se
26990 74 20 74 6f 20 0a 2a 2a 20 43 55 52 53 4f 52 5f  t to .** CURSOR_
269a0 49 4e 56 41 4c 49 44 2e 20 4f 74 68 65 72 77 69  INVALID. Otherwi
269b0 73 65 2c 20 74 68 65 20 63 75 72 73 6f 72 20 69  se, the cursor i
269c0 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74  s set to point t
269d0 6f 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 63  o the first.** c
269e0 65 6c 6c 20 6c 6f 63 61 74 65 64 20 6f 6e 20 74  ell located on t
269f0 68 65 20 72 6f 6f 74 20 28 6f 72 20 76 69 72 74  he root (or virt
26a00 75 61 6c 20 72 6f 6f 74 29 20 70 61 67 65 20 61  ual root) page a
26a10 6e 64 20 74 68 65 20 63 75 72 73 6f 72 20 73 74  nd the cursor st
26a20 61 74 65 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f  ate.** is set to
26a30 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 2e 0a 2a   CURSOR_VALID..*
26a40 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 66 75 6e  *.** If this fun
26a50 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 73 75  ction returns su
26a60 63 63 65 73 73 66 75 6c 6c 79 2c 20 69 74 20 6d  ccessfully, it m
26a70 61 79 20 62 65 20 61 73 73 75 6d 65 64 20 74 68  ay be assumed th
26a80 61 74 20 74 68 65 0a 2a 2a 20 70 61 67 65 2d 68  at the.** page-h
26a90 65 61 64 65 72 20 66 6c 61 67 73 20 69 6e 64 69  eader flags indi
26aa0 63 61 74 65 20 74 68 61 74 20 74 68 65 20 5b 76  cate that the [v
26ab0 69 72 74 75 61 6c 5d 20 72 6f 6f 74 2d 70 61 67  irtual] root-pag
26ac0 65 20 69 73 20 74 68 65 20 65 78 70 65 63 74 65  e is the expecte
26ad0 64 20 0a 2a 2a 20 6b 69 6e 64 20 6f 66 20 62 2d  d .** kind of b-
26ae0 74 72 65 65 20 70 61 67 65 20 28 69 2e 65 2e 20  tree page (i.e. 
26af0 69 66 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20  if when opening 
26b00 74 68 65 20 63 75 72 73 6f 72 20 74 68 65 20 63  the cursor the c
26b10 61 6c 6c 65 72 20 64 69 64 20 6e 6f 74 0a 2a 2a  aller did not.**
26b20 20 73 70 65 63 69 66 79 20 61 20 4b 65 79 49 6e   specify a KeyIn
26b30 66 6f 20 73 74 72 75 63 74 75 72 65 20 74 68 65  fo structure the
26b40 20 66 6c 61 67 73 20 62 79 74 65 20 69 73 20 73   flags byte is s
26b50 65 74 20 74 6f 20 30 78 30 35 20 6f 72 20 30 78  et to 0x05 or 0x
26b60 30 44 2c 0a 2a 2a 20 69 6e 64 69 63 61 74 69 6e  0D,.** indicatin
26b70 67 20 61 20 74 61 62 6c 65 20 62 2d 74 72 65 65  g a table b-tree
26b80 2c 20 6f 72 20 69 66 20 74 68 65 20 63 61 6c 6c  , or if the call
26b90 65 72 20 64 69 64 20 73 70 65 63 69 66 79 20 61  er did specify a
26ba0 20 4b 65 79 49 6e 66 6f 20 0a 2a 2a 20 73 74 72   KeyInfo .** str
26bb0 75 63 74 75 72 65 20 74 68 65 20 66 6c 61 67 73  ucture the flags
26bc0 20 62 79 74 65 20 69 73 20 73 65 74 20 74 6f 20   byte is set to 
26bd0 30 78 30 32 20 6f 72 20 30 78 30 41 2c 20 69 6e  0x02 or 0x0A, in
26be0 64 69 63 61 74 69 6e 67 20 61 6e 20 69 6e 64 65  dicating an inde
26bf0 78 0a 2a 2a 20 62 2d 74 72 65 65 29 2e 0a 2a 2f  x.** b-tree)..*/
26c00 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65  .static int move
26c10 54 6f 52 6f 6f 74 28 42 74 43 75 72 73 6f 72 20  ToRoot(BtCursor 
26c20 2a 70 43 75 72 29 7b 0a 20 20 4d 65 6d 50 61 67  *pCur){.  MemPag
26c30 65 20 2a 70 52 6f 6f 74 3b 0a 20 20 69 6e 74 20  e *pRoot;.  int 
26c40 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
26c50 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
26c60 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
26c70 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43  ) );.  assert( C
26c80 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 3c 20  URSOR_INVALID < 
26c90 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45  CURSOR_REQUIRESE
26ca0 45 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  EK );.  assert( 
26cb0 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 20 20 3c  CURSOR_VALID   <
26cc0 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53   CURSOR_REQUIRES
26cd0 45 45 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  EEK );.  assert(
26ce0 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 20 20   CURSOR_FAULT   
26cf0 3e 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45  > CURSOR_REQUIRE
26d00 53 45 45 4b 20 29 3b 0a 20 20 69 66 28 20 70 43  SEEK );.  if( pC
26d10 75 72 2d 3e 65 53 74 61 74 65 3e 3d 43 55 52 53  ur->eState>=CURS
26d20 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29  OR_REQUIRESEEK )
26d30 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e  {.    if( pCur->
26d40 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 46  eState==CURSOR_F
26d50 41 55 4c 54 20 29 7b 0a 20 20 20 20 20 20 61 73  AULT ){.      as
26d60 73 65 72 74 28 20 70 43 75 72 2d 3e 73 6b 69 70  sert( pCur->skip
26d70 4e 65 78 74 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  Next!=SQLITE_OK 
26d80 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
26d90 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3b 0a  pCur->skipNext;.
26da0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
26db0 33 42 74 72 65 65 43 6c 65 61 72 43 75 72 73 6f  3BtreeClearCurso
26dc0 72 28 70 43 75 72 29 3b 0a 20 20 7d 0a 0a 20 20  r(pCur);.  }..  
26dd0 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e  if( pCur->iPage>
26de0 3d 30 20 29 7b 0a 20 20 20 20 77 68 69 6c 65 28  =0 ){.    while(
26df0 20 70 43 75 72 2d 3e 69 50 61 67 65 20 29 20 72   pCur->iPage ) r
26e00 65 6c 65 61 73 65 50 61 67 65 28 70 43 75 72 2d  eleasePage(pCur-
26e10 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
26e20 61 67 65 2d 2d 5d 29 3b 0a 20 20 7d 65 6c 73 65  age--]);.  }else
26e30 20 69 66 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52   if( pCur->pgnoR
26e40 6f 6f 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 43  oot==0 ){.    pC
26e50 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
26e60 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20  SOR_INVALID;.   
26e70 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
26e80 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  K;.  }else{.    
26e90 72 63 20 3d 20 67 65 74 41 6e 64 49 6e 69 74 50  rc = getAndInitP
26ea0 61 67 65 28 70 43 75 72 2d 3e 70 42 74 72 65 65  age(pCur->pBtree
26eb0 2d 3e 70 42 74 2c 20 70 43 75 72 2d 3e 70 67 6e  ->pBt, pCur->pgn
26ec0 6f 52 6f 6f 74 2c 20 26 70 43 75 72 2d 3e 61 70  oRoot, &pCur->ap
26ed0 50 61 67 65 5b 30 5d 2c 0a 20 20 20 20 20 20 20  Page[0],.       
26ee0 20 20 20 20 20 20 20 20 20 20 28 70 43 75 72 2d            (pCur-
26ef0 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46  >curFlags & BTCF
26f00 5f 57 72 69 74 65 46 6c 61 67 29 3d 3d 30 20 3f  _WriteFlag)==0 ?
26f10 20 50 41 47 45 52 5f 47 45 54 5f 52 45 41 44 4f   PAGER_GET_READO
26f20 4e 4c 59 20 3a 20 30 29 3b 0a 20 20 20 20 69 66  NLY : 0);.    if
26f30 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
26f40 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 65  ){.      pCur->e
26f50 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49  State = CURSOR_I
26f60 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 72 65  NVALID;.      re
26f70 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
26f80 20 20 20 70 43 75 72 2d 3e 69 50 61 67 65 20 3d     pCur->iPage =
26f90 20 30 3b 0a 20 20 7d 0a 20 20 70 52 6f 6f 74 20   0;.  }.  pRoot 
26fa0 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30  = pCur->apPage[0
26fb0 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 52 6f  ];.  assert( pRo
26fc0 6f 74 2d 3e 70 67 6e 6f 3d 3d 70 43 75 72 2d 3e  ot->pgno==pCur->
26fd0 70 67 6e 6f 52 6f 6f 74 20 29 3b 0a 0a 20 20 2f  pgnoRoot );..  /
26fe0 2a 20 49 66 20 70 43 75 72 2d 3e 70 4b 65 79 49  * If pCur->pKeyI
26ff0 6e 66 6f 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c  nfo is not NULL,
27000 20 74 68 65 6e 20 74 68 65 20 63 61 6c 6c 65 72   then the caller
27010 20 74 68 61 74 20 6f 70 65 6e 65 64 20 74 68 69   that opened thi
27020 73 20 63 75 72 73 6f 72 0a 20 20 2a 2a 20 65 78  s cursor.  ** ex
27030 70 65 63 74 65 64 20 74 6f 20 6f 70 65 6e 20 69  pected to open i
27040 74 20 6f 6e 20 61 6e 20 69 6e 64 65 78 20 62 2d  t on an index b-
27050 74 72 65 65 2e 20 4f 74 68 65 72 77 69 73 65 2c  tree. Otherwise,
27060 20 69 66 20 70 4b 65 79 49 6e 66 6f 20 69 73 0a   if pKeyInfo is.
27070 20 20 2a 2a 20 4e 55 4c 4c 2c 20 74 68 65 20 63    ** NULL, the c
27080 61 6c 6c 65 72 20 65 78 70 65 63 74 73 20 61 20  aller expects a 
27090 74 61 62 6c 65 20 62 2d 74 72 65 65 2e 20 49 66  table b-tree. If
270a0 20 74 68 69 73 20 69 73 20 6e 6f 74 20 74 68 65   this is not the
270b0 20 63 61 73 65 2c 0a 20 20 2a 2a 20 72 65 74 75   case,.  ** retu
270c0 72 6e 20 61 6e 20 53 51 4c 49 54 45 5f 43 4f 52  rn an SQLITE_COR
270d0 52 55 50 54 20 65 72 72 6f 72 2e 20 0a 20 20 2a  RUPT error. .  *
270e0 2a 0a 20 20 2a 2a 20 45 61 72 6c 69 65 72 20 76  *.  ** Earlier v
270f0 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74  ersions of SQLit
27100 65 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74  e assumed that t
27110 68 69 73 20 74 65 73 74 20 63 6f 75 6c 64 20 6e  his test could n
27120 6f 74 20 66 61 69 6c 0a 20 20 2a 2a 20 69 66 20  ot fail.  ** if 
27130 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 77 61  the root page wa
27140 73 20 61 6c 72 65 61 64 79 20 6c 6f 61 64 65 64  s already loaded
27150 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
27160 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64 20 28  ion was called (
27170 69 2e 65 2e 0a 20 20 2a 2a 20 69 66 20 70 43 75  i.e..  ** if pCu
27180 72 2d 3e 69 50 61 67 65 3e 3d 30 29 2e 20 42 75  r->iPage>=0). Bu
27190 74 20 74 68 69 73 20 69 73 20 6e 6f 74 20 73 6f  t this is not so
271a0 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
271b0 20 69 73 20 63 6f 72 72 75 70 74 65 64 20 0a 20   is corrupted . 
271c0 20 2a 2a 20 69 6e 20 73 75 63 68 20 61 20 77 61   ** in such a wa
271d0 79 20 74 68 61 74 20 70 61 67 65 20 70 52 6f 6f  y that page pRoo
271e0 74 20 69 73 20 6c 69 6e 6b 65 64 20 69 6e 74 6f  t is linked into
271f0 20 61 20 73 65 63 6f 6e 64 20 62 2d 74 72 65 65   a second b-tree
27200 20 74 61 62 6c 65 20 0a 20 20 2a 2a 20 28 6f 72   table .  ** (or
27210 20 74 68 65 20 66 72 65 65 6c 69 73 74 29 2e 20   the freelist). 
27220 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 52   */.  assert( pR
27230 6f 6f 74 2d 3e 69 6e 74 4b 65 79 3d 3d 31 20 7c  oot->intKey==1 |
27240 7c 20 70 52 6f 6f 74 2d 3e 69 6e 74 4b 65 79 3d  | pRoot->intKey=
27250 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 52 6f 6f  =0 );.  if( pRoo
27260 74 2d 3e 69 73 49 6e 69 74 3d 3d 30 20 7c 7c 20  t->isInit==0 || 
27270 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d  (pCur->pKeyInfo=
27280 3d 30 29 21 3d 70 52 6f 6f 74 2d 3e 69 6e 74 4b  =0)!=pRoot->intK
27290 65 79 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ey ){.    return
272a0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
272b0 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 70 43 75  BKPT;.  }..  pCu
272c0 72 2d 3e 61 69 49 64 78 5b 30 5d 20 3d 20 30 3b  r->aiIdx[0] = 0;
272d0 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53  .  pCur->info.nS
272e0 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d  ize = 0;.  pCur-
272f0 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 28 42  >curFlags &= ~(B
27300 54 43 46 5f 41 74 4c 61 73 74 7c 42 54 43 46 5f  TCF_AtLast|BTCF_
27310 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56  ValidNKey|BTCF_V
27320 61 6c 69 64 4f 76 66 6c 29 3b 0a 0a 20 20 69 66  alidOvfl);..  if
27330 28 20 70 52 6f 6f 74 2d 3e 6e 43 65 6c 6c 3e 30  ( pRoot->nCell>0
27340 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53   ){.    pCur->eS
27350 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 56 41  tate = CURSOR_VA
27360 4c 49 44 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  LID;.  }else if(
27370 20 21 70 52 6f 6f 74 2d 3e 6c 65 61 66 20 29 7b   !pRoot->leaf ){
27380 0a 20 20 20 20 50 67 6e 6f 20 73 75 62 70 61 67  .    Pgno subpag
27390 65 3b 0a 20 20 20 20 69 66 28 20 70 52 6f 6f 74  e;.    if( pRoot
273a0 2d 3e 70 67 6e 6f 21 3d 31 20 29 20 72 65 74 75  ->pgno!=1 ) retu
273b0 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
273c0 54 5f 42 4b 50 54 3b 0a 20 20 20 20 73 75 62 70  T_BKPT;.    subp
273d0 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 26  age = get4byte(&
273e0 70 52 6f 6f 74 2d 3e 61 44 61 74 61 5b 70 52 6f  pRoot->aData[pRo
273f0 6f 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  ot->hdrOffset+8]
27400 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74  );.    pCur->eSt
27410 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c  ate = CURSOR_VAL
27420 49 44 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76  ID;.    rc = mov
27430 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 73  eToChild(pCur, s
27440 75 62 70 61 67 65 29 3b 0a 20 20 7d 65 6c 73 65  ubpage);.  }else
27450 7b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61  {.    pCur->eSta
27460 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41  te = CURSOR_INVA
27470 4c 49 44 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  LID;.  }.  retur
27480 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  n rc;.}../*.** M
27490 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 64  ove the cursor d
274a0 6f 77 6e 20 74 6f 20 74 68 65 20 6c 65 66 74 2d  own to the left-
274b0 6d 6f 73 74 20 6c 65 61 66 20 65 6e 74 72 79 20  most leaf entry 
274c0 62 65 6e 65 61 74 68 20 74 68 65 0a 2a 2a 20 65  beneath the.** e
274d0 6e 74 72 79 20 74 6f 20 77 68 69 63 68 20 69 74  ntry to which it
274e0 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f   is currently po
274f0 69 6e 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68  inting..**.** Th
27500 65 20 6c 65 66 74 2d 6d 6f 73 74 20 6c 65 61 66  e left-most leaf
27510 20 69 73 20 74 68 65 20 6f 6e 65 20 77 69 74 68   is the one with
27520 20 74 68 65 20 73 6d 61 6c 6c 65 73 74 20 6b 65   the smallest ke
27530 79 20 2d 20 74 68 65 20 66 69 72 73 74 0a 2a 2a  y - the first.**
27540 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72   in ascending or
27550 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  der..*/.static i
27560 6e 74 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73  nt moveToLeftmos
27570 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  t(BtCursor *pCur
27580 29 7b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a  ){.  Pgno pgno;.
27590 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
275a0 45 5f 4f 4b 3b 0a 20 20 4d 65 6d 50 61 67 65 20  E_OK;.  MemPage 
275b0 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72  *pPage;..  asser
275c0 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
275d0 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61  tex(pCur) );.  a
275e0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
275f0 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
27600 44 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 72 63  D );.  while( rc
27610 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21  ==SQLITE_OK && !
27620 28 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61  (pPage = pCur->a
27630 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
27640 65 5d 29 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  e])->leaf ){.   
27650 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61   assert( pCur->a
27660 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
27670 5d 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29  ]<pPage->nCell )
27680 3b 0a 20 20 20 20 70 67 6e 6f 20 3d 20 67 65 74  ;.    pgno = get
27690 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70  4byte(findCell(p
276a0 50 61 67 65 2c 20 70 43 75 72 2d 3e 61 69 49 64  Page, pCur->aiId
276b0 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 29  x[pCur->iPage]))
276c0 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54  ;.    rc = moveT
276d0 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 70 67 6e  oChild(pCur, pgn
276e0 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  o);.  }.  return
276f0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f   rc;.}../*.** Mo
27700 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 64 6f  ve the cursor do
27710 77 6e 20 74 6f 20 74 68 65 20 72 69 67 68 74 2d  wn to the right-
27720 6d 6f 73 74 20 6c 65 61 66 20 65 6e 74 72 79 20  most leaf entry 
27730 62 65 6e 65 61 74 68 20 74 68 65 0a 2a 2a 20 70  beneath the.** p
27740 61 67 65 20 74 6f 20 77 68 69 63 68 20 69 74 20  age to which it 
27750 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69  is currently poi
27760 6e 74 69 6e 67 2e 20 20 4e 6f 74 69 63 65 20 74  nting.  Notice t
27770 68 65 20 64 69 66 66 65 72 65 6e 63 65 0a 2a 2a  he difference.**
27780 20 62 65 74 77 65 65 6e 20 6d 6f 76 65 54 6f 4c   between moveToL
27790 65 66 74 6d 6f 73 74 28 29 20 61 6e 64 20 6d 6f  eftmost() and mo
277a0 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 29 2e  veToRightmost().
277b0 20 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74    moveToLeftmost
277c0 28 29 0a 2a 2a 20 66 69 6e 64 73 20 74 68 65 20  ().** finds the 
277d0 6c 65 66 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20  left-most entry 
277e0 62 65 6e 65 61 74 68 20 74 68 65 20 2a 65 6e 74  beneath the *ent
277f0 72 79 2a 20 77 68 65 72 65 61 73 20 6d 6f 76 65  ry* whereas move
27800 54 6f 52 69 67 68 74 6d 6f 73 74 28 29 0a 2a 2a  ToRightmost().**
27810 20 66 69 6e 64 73 20 74 68 65 20 72 69 67 68 74   finds the right
27820 2d 6d 6f 73 74 20 65 6e 74 72 79 20 62 65 6e 65  -most entry bene
27830 61 74 68 20 74 68 65 20 2a 70 61 67 65 2a 2e 0a  ath the *page*..
27840 2a 2a 0a 2a 2a 20 54 68 65 20 72 69 67 68 74 2d  **.** The right-
27850 6d 6f 73 74 20 65 6e 74 72 79 20 69 73 20 74 68  most entry is th
27860 65 20 6f 6e 65 20 77 69 74 68 20 74 68 65 20 6c  e one with the l
27870 61 72 67 65 73 74 20 6b 65 79 20 2d 20 74 68 65  argest key - the
27880 20 6c 61 73 74 0a 2a 2a 20 6b 65 79 20 69 6e 20   last.** key in 
27890 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e  ascending order.
278a0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d  .*/.static int m
278b0 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 42  oveToRightmost(B
278c0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
278d0 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 69    Pgno pgno;.  i
278e0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
278f0 4b 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  K;.  MemPage *pP
27900 61 67 65 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65  age = 0;..  asse
27910 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
27920 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
27930 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
27940 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
27950 49 44 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 21  ID );.  while( !
27960 28 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61  (pPage = pCur->a
27970 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
27980 65 5d 29 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  e])->leaf ){.   
27990 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65   pgno = get4byte
279a0 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  (&pPage->aData[p
279b0 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
279c0 38 5d 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 61  8]);.    pCur->a
279d0 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
279e0 5d 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ] = pPage->nCell
279f0 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54  ;.    rc = moveT
27a00 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 70 67 6e  oChild(pCur, pgn
27a10 6f 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  o);.    if( rc )
27a20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
27a30 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43    pCur->aiIdx[pC
27a40 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 70 50 61  ur->iPage] = pPa
27a50 67 65 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a 20 20 61  ge->nCell-1;.  a
27a60 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 6e 66  ssert( pCur->inf
27a70 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 3b 0a 20 20  o.nSize==0 );.  
27a80 61 73 73 65 72 74 28 20 28 70 43 75 72 2d 3e 63  assert( (pCur->c
27a90 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 56  urFlags & BTCF_V
27aa0 61 6c 69 64 4e 4b 65 79 29 3d 3d 30 20 29 3b 0a  alidNKey)==0 );.
27ab0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
27ac0 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74  OK;.}../* Move t
27ad0 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65  he cursor to the
27ae0 20 66 69 72 73 74 20 65 6e 74 72 79 20 69 6e 20   first entry in 
27af0 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74 75  the table.  Retu
27b00 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20  rn SQLITE_OK.** 
27b10 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 53 65 74  on success.  Set
27b20 20 2a 70 52 65 73 20 74 6f 20 30 20 69 66 20 74   *pRes to 0 if t
27b30 68 65 20 63 75 72 73 6f 72 20 61 63 74 75 61 6c  he cursor actual
27b40 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 73 6f 6d  ly points to som
27b50 65 74 68 69 6e 67 0a 2a 2a 20 6f 72 20 73 65 74  ething.** or set
27b60 20 2a 70 52 65 73 20 74 6f 20 31 20 69 66 20 74   *pRes to 1 if t
27b70 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74  he table is empt
27b80 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  y..*/.int sqlite
27b90 33 42 74 72 65 65 46 69 72 73 74 28 42 74 43 75  3BtreeFirst(BtCu
27ba0 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20  rsor *pCur, int 
27bb0 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63  *pRes){.  int rc
27bc0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ;..  assert( cur
27bd0 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
27be0 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
27bf0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
27c00 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65  eld(pCur->pBtree
27c10 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  ->db->mutex) );.
27c20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f    rc = moveToRoo
27c30 74 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72  t(pCur);.  if( r
27c40 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
27c50 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53      if( pCur->eS
27c60 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56  tate==CURSOR_INV
27c70 41 4c 49 44 20 29 7b 0a 20 20 20 20 20 20 61 73  ALID ){.      as
27c80 73 65 72 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f  sert( pCur->pgno
27c90 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d  Root==0 || pCur-
27ca0 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
27cb0 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29  age]->nCell==0 )
27cc0 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20  ;.      *pRes = 
27cd0 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  1;.    }else{.  
27ce0 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
27cf0 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
27d00 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3e 30 20 29  Page]->nCell>0 )
27d10 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20  ;.      *pRes = 
27d20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 6f  0;.      rc = mo
27d30 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75  veToLeftmost(pCu
27d40 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  r);.    }.  }.  
27d50 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
27d60 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72   Move the cursor
27d70 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74   to the last ent
27d80 72 79 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e  ry in the table.
27d90 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
27da0 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73  OK.** on success
27db0 2e 20 20 53 65 74 20 2a 70 52 65 73 20 74 6f 20  .  Set *pRes to 
27dc0 30 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20  0 if the cursor 
27dd0 61 63 74 75 61 6c 6c 79 20 70 6f 69 6e 74 73 20  actually points 
27de0 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20  to something.** 
27df0 6f 72 20 73 65 74 20 2a 70 52 65 73 20 74 6f 20  or set *pRes to 
27e00 31 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 69  1 if the table i
27e10 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20  s empty..*/.int 
27e20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 61 73 74  sqlite3BtreeLast
27e30 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
27e40 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69   int *pRes){.  i
27e50 6e 74 20 72 63 3b 0a 20 0a 20 20 61 73 73 65 72  nt rc;. .  asser
27e60 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
27e70 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61  tex(pCur) );.  a
27e80 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
27e90 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e  utex_held(pCur->
27ea0 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65  pBtree->db->mute
27eb0 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  x) );..  /* If t
27ec0 68 65 20 63 75 72 73 6f 72 20 61 6c 72 65 61 64  he cursor alread
27ed0 79 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  y points to the 
27ee0 6c 61 73 74 20 65 6e 74 72 79 2c 20 74 68 69 73  last entry, this
27ef0 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 2a 2f 0a   is a no-op. */.
27f00 20 20 69 66 28 20 43 55 52 53 4f 52 5f 56 41 4c    if( CURSOR_VAL
27f10 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65  ID==pCur->eState
27f20 20 26 26 20 28 70 43 75 72 2d 3e 63 75 72 46 6c   && (pCur->curFl
27f30 61 67 73 20 26 20 42 54 43 46 5f 41 74 4c 61 73  ags & BTCF_AtLas
27f40 74 29 21 3d 30 20 29 7b 0a 23 69 66 64 65 66 20  t)!=0 ){.#ifdef 
27f50 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20  SQLITE_DEBUG.   
27f60 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20 73   /* This block s
27f70 65 72 76 65 73 20 74 6f 20 61 73 73 65 72 74 28  erves to assert(
27f80 29 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f  ) that the curso
27f90 72 20 72 65 61 6c 6c 79 20 64 6f 65 73 20 70 6f  r really does po
27fa0 69 6e 74 20 0a 20 20 20 20 2a 2a 20 74 6f 20 74  int .    ** to t
27fb0 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e  he last entry in
27fc0 20 74 68 65 20 62 2d 74 72 65 65 2e 20 2a 2f 0a   the b-tree. */.
27fd0 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20      int ii;.    
27fe0 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 43 75  for(ii=0; ii<pCu
27ff0 72 2d 3e 69 50 61 67 65 3b 20 69 69 2b 2b 29 7b  r->iPage; ii++){
28000 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
28010 43 75 72 2d 3e 61 69 49 64 78 5b 69 69 5d 3d 3d  Cur->aiIdx[ii]==
28020 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 69 5d  pCur->apPage[ii]
28030 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 7d  ->nCell );.    }
28040 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75  .    assert( pCu
28050 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
28060 50 61 67 65 5d 3d 3d 70 43 75 72 2d 3e 61 70 50  Page]==pCur->apP
28070 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
28080 2d 3e 6e 43 65 6c 6c 2d 31 20 29 3b 0a 20 20 20  ->nCell-1 );.   
28090 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61   assert( pCur->a
280a0 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
280b0 65 5d 2d 3e 6c 65 61 66 20 29 3b 0a 23 65 6e 64  e]->leaf );.#end
280c0 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  if.    return SQ
280d0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20  LITE_OK;.  }..  
280e0 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28  rc = moveToRoot(
280f0 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d  pCur);.  if( rc=
28100 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
28110 20 20 69 66 28 20 43 55 52 53 4f 52 5f 49 4e 56    if( CURSOR_INV
28120 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61  ALID==pCur->eSta
28130 74 65 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  te ){.      asse
28140 72 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f  rt( pCur->pgnoRo
28150 6f 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 61  ot==0 || pCur->a
28160 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
28170 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a  e]->nCell==0 );.
28180 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b        *pRes = 1;
28190 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
281a0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
281b0 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
281c0 41 4c 49 44 20 29 3b 0a 20 20 20 20 20 20 2a 70  ALID );.      *p
281d0 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  Res = 0;.      r
281e0 63 20 3d 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d  c = moveToRightm
281f0 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 20 20 20  ost(pCur);.     
28200 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
28210 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43  OK ){.        pC
28220 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20  ur->curFlags |= 
28230 42 54 43 46 5f 41 74 4c 61 73 74 3b 0a 20 20 20  BTCF_AtLast;.   
28240 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
28250 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73    pCur->curFlags
28260 20 26 3d 20 7e 42 54 43 46 5f 41 74 4c 61 73 74   &= ~BTCF_AtLast
28270 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 0a 20 20  ;.      }.   .  
28280 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
28290 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20   rc;.}../* Move 
282a0 74 68 65 20 63 75 72 73 6f 72 20 73 6f 20 74 68  the cursor so th
282b0 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20  at it points to 
282c0 61 6e 20 65 6e 74 72 79 20 6e 65 61 72 20 74 68  an entry near th
282d0 65 20 6b 65 79 20 0a 2a 2a 20 73 70 65 63 69 66  e key .** specif
282e0 69 65 64 20 62 79 20 70 49 64 78 4b 65 79 20 6f  ied by pIdxKey o
282f0 72 20 69 6e 74 4b 65 79 2e 20 20 20 52 65 74 75  r intKey.   Retu
28300 72 6e 20 61 20 73 75 63 63 65 73 73 20 63 6f 64  rn a success cod
28310 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 49 4e 54  e..**.** For INT
28320 4b 45 59 20 74 61 62 6c 65 73 2c 20 74 68 65 20  KEY tables, the 
28330 69 6e 74 4b 65 79 20 70 61 72 61 6d 65 74 65 72  intKey parameter
28340 20 69 73 20 75 73 65 64 2e 20 20 70 49 64 78 4b   is used.  pIdxK
28350 65 79 20 0a 2a 2a 20 6d 75 73 74 20 62 65 20 4e  ey .** must be N
28360 55 4c 4c 2e 20 20 46 6f 72 20 69 6e 64 65 78 20  ULL.  For index 
28370 74 61 62 6c 65 73 2c 20 70 49 64 78 4b 65 79 20  tables, pIdxKey 
28380 69 73 20 75 73 65 64 20 61 6e 64 20 69 6e 74 4b  is used and intK
28390 65 79 0a 2a 2a 20 69 73 20 69 67 6e 6f 72 65 64  ey.** is ignored
283a0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 78  ..**.** If an ex
283b0 61 63 74 20 6d 61 74 63 68 20 69 73 20 6e 6f 74  act match is not
283c0 20 66 6f 75 6e 64 2c 20 74 68 65 6e 20 74 68 65   found, then the
283d0 20 63 75 72 73 6f 72 20 69 73 20 61 6c 77 61 79   cursor is alway
283e0 73 0a 2a 2a 20 6c 65 66 74 20 70 6f 69 6e 74 69  s.** left pointi
283f0 6e 67 20 61 74 20 61 20 6c 65 61 66 20 70 61 67  ng at a leaf pag
28400 65 20 77 68 69 63 68 20 77 6f 75 6c 64 20 68 6f  e which would ho
28410 6c 64 20 74 68 65 20 65 6e 74 72 79 20 69 66 20  ld the entry if 
28420 69 74 0a 2a 2a 20 77 65 72 65 20 70 72 65 73 65  it.** were prese
28430 6e 74 2e 20 20 54 68 65 20 63 75 72 73 6f 72 20  nt.  The cursor 
28440 6d 69 67 68 74 20 70 6f 69 6e 74 20 74 6f 20 61  might point to a
28450 6e 20 65 6e 74 72 79 20 74 68 61 74 20 63 6f 6d  n entry that com
28460 65 73 0a 2a 2a 20 62 65 66 6f 72 65 20 6f 72 20  es.** before or 
28470 61 66 74 65 72 20 74 68 65 20 6b 65 79 2e 0a 2a  after the key..*
28480 2a 0a 2a 2a 20 41 6e 20 69 6e 74 65 67 65 72 20  *.** An integer 
28490 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  is written into 
284a0 2a 70 52 65 73 20 77 68 69 63 68 20 69 73 20 74  *pRes which is t
284b0 68 65 20 72 65 73 75 6c 74 20 6f 66 0a 2a 2a 20  he result of.** 
284c0 63 6f 6d 70 61 72 69 6e 67 20 74 68 65 20 6b 65  comparing the ke
284d0 79 20 77 69 74 68 20 74 68 65 20 65 6e 74 72 79  y with the entry
284e0 20 74 6f 20 77 68 69 63 68 20 74 68 65 20 63 75   to which the cu
284f0 72 73 6f 72 20 69 73 20 0a 2a 2a 20 70 6f 69 6e  rsor is .** poin
28500 74 69 6e 67 2e 20 20 54 68 65 20 6d 65 61 6e 69  ting.  The meani
28510 6e 67 20 6f 66 20 74 68 65 20 69 6e 74 65 67 65  ng of the intege
28520 72 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 0a 2a  r written into.*
28530 2a 20 2a 70 52 65 73 20 69 73 20 61 73 20 66 6f  * *pRes is as fo
28540 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  llows:.**.**    
28550 20 2a 70 52 65 73 3c 30 20 20 20 20 20 20 54 68   *pRes<0      Th
28560 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74  e cursor is left
28570 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20   pointing at an 
28580 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20 20 20  entry that.**   
28590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
285a0 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 69  s smaller than i
285b0 6e 74 4b 65 79 2f 70 49 64 78 4b 65 79 20 6f 72  ntKey/pIdxKey or
285c0 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 69 73   if the table is
285d0 20 65 6d 70 74 79 0a 2a 2a 20 20 20 20 20 20 20   empty.**       
285e0 20 20 20 20 20 20 20 20 20 20 20 61 6e 64 20 74             and t
285f0 68 65 20 63 75 72 73 6f 72 20 69 73 20 74 68 65  he cursor is the
28600 72 65 66 6f 72 65 20 6c 65 66 74 20 70 6f 69 6e  refore left poin
28610 74 20 74 6f 20 6e 6f 74 68 69 6e 67 2e 0a 2a 2a  t to nothing..**
28620 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73 3d 3d 30  .**     *pRes==0
28630 20 20 20 20 20 54 68 65 20 63 75 72 73 6f 72 20       The cursor 
28640 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67  is left pointing
28650 20 61 74 20 61 6e 20 65 6e 74 72 79 20 74 68 61   at an entry tha
28660 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  t.**            
28670 20 20 20 20 20 20 65 78 61 63 74 6c 79 20 6d 61        exactly ma
28680 74 63 68 65 73 20 69 6e 74 4b 65 79 2f 70 49 64  tches intKey/pId
28690 78 4b 65 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  xKey..**.**     
286a0 2a 70 52 65 73 3e 30 20 20 20 20 20 20 54 68 65  *pRes>0      The
286b0 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20   cursor is left 
286c0 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65  pointing at an e
286d0 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20 20 20 20  ntry that.**    
286e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73                is
286f0 20 6c 61 72 67 65 72 20 74 68 61 6e 20 69 6e 74   larger than int
28700 4b 65 79 2f 70 49 64 78 4b 65 79 2e 0a 2a 2a 0a  Key/pIdxKey..**.
28710 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
28720 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65  reeMovetoUnpacke
28730 64 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  d(.  BtCursor *p
28740 43 75 72 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  Cur,          /*
28750 20 54 68 65 20 63 75 72 73 6f 72 20 74 6f 20 62   The cursor to b
28760 65 20 6d 6f 76 65 64 20 2a 2f 0a 20 20 55 6e 70  e moved */.  Unp
28770 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 49 64  ackedRecord *pId
28780 78 4b 65 79 2c 20 2f 2a 20 55 6e 70 61 63 6b 65  xKey, /* Unpacke
28790 64 20 69 6e 64 65 78 20 6b 65 79 20 2a 2f 0a 20  d index key */. 
287a0 20 69 36 34 20 69 6e 74 4b 65 79 2c 20 20 20 20   i64 intKey,    
287b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
287c0 20 74 61 62 6c 65 20 6b 65 79 20 2a 2f 0a 20 20   table key */.  
287d0 69 6e 74 20 62 69 61 73 52 69 67 68 74 2c 20 20  int biasRight,  
287e0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74           /* If t
287f0 72 75 65 2c 20 62 69 61 73 20 74 68 65 20 73 65  rue, bias the se
28800 61 72 63 68 20 74 6f 20 74 68 65 20 68 69 67 68  arch to the high
28810 20 65 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 70   end */.  int *p
28820 52 65 73 20 20 20 20 20 20 20 20 20 20 20 20 20  Res             
28830 20 20 20 2f 2a 20 57 72 69 74 65 20 73 65 61 72     /* Write sear
28840 63 68 20 72 65 73 75 6c 74 73 20 68 65 72 65 20  ch results here 
28850 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  */.){.  int rc;.
28860 20 20 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 20    RecordCompare 
28870 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 3b 0a  xRecordCompare;.
28880 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
28890 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
288a0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
288b0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
288c0 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e  d(pCur->pBtree->
288d0 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
288e0 61 73 73 65 72 74 28 20 70 52 65 73 20 29 3b 0a  assert( pRes );.
288f0 20 20 61 73 73 65 72 74 28 20 28 70 49 64 78 4b    assert( (pIdxK
28900 65 79 3d 3d 30 29 3d 3d 28 70 43 75 72 2d 3e 70  ey==0)==(pCur->p
28910 4b 65 79 49 6e 66 6f 3d 3d 30 29 20 29 3b 0a 0a  KeyInfo==0) );..
28920 20 20 2f 2a 20 49 66 20 74 68 65 20 63 75 72 73    /* If the curs
28930 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 70 6f  or is already po
28940 73 69 74 69 6f 6e 65 64 20 61 74 20 74 68 65 20  sitioned at the 
28950 70 6f 69 6e 74 20 77 65 20 61 72 65 20 74 72 79  point we are try
28960 69 6e 67 0a 20 20 2a 2a 20 74 6f 20 6d 6f 76 65  ing.  ** to move
28970 20 74 6f 2c 20 74 68 65 6e 20 6a 75 73 74 20 72   to, then just r
28980 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20 64 6f  eturn without do
28990 69 6e 67 20 61 6e 79 20 77 6f 72 6b 20 2a 2f 0a  ing any work */.
289a0 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
289b0 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
289c0 20 26 26 20 28 70 43 75 72 2d 3e 63 75 72 46 6c   && (pCur->curFl
289d0 61 67 73 20 26 20 42 54 43 46 5f 56 61 6c 69 64  ags & BTCF_Valid
289e0 4e 4b 65 79 29 21 3d 30 0a 20 20 20 26 26 20 70  NKey)!=0.   && p
289f0 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e  Cur->apPage[0]->
28a00 69 6e 74 4b 65 79 20 0a 20 20 29 7b 0a 20 20 20  intKey .  ){.   
28a10 20 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e   if( pCur->info.
28a20 6e 4b 65 79 3d 3d 69 6e 74 4b 65 79 20 29 7b 0a  nKey==intKey ){.
28a30 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b        *pRes = 0;
28a40 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
28a50 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
28a60 20 20 20 69 66 28 20 28 70 43 75 72 2d 3e 63 75     if( (pCur->cu
28a70 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 41 74  rFlags & BTCF_At
28a80 4c 61 73 74 29 21 3d 30 20 26 26 20 70 43 75 72  Last)!=0 && pCur
28a90 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3c 69 6e 74 4b  ->info.nKey<intK
28aa0 65 79 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 65  ey ){.      *pRe
28ab0 73 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 72 65  s = -1;.      re
28ac0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
28ad0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
28ae0 20 70 49 64 78 4b 65 79 20 29 7b 0a 20 20 20 20   pIdxKey ){.    
28af0 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 20 3d  xRecordCompare =
28b00 20 73 71 6c 69 74 65 33 56 64 62 65 46 69 6e 64   sqlite3VdbeFind
28b10 43 6f 6d 70 61 72 65 28 70 49 64 78 4b 65 79 29  Compare(pIdxKey)
28b20 3b 0a 20 20 20 20 70 49 64 78 4b 65 79 2d 3e 65  ;.    pIdxKey->e
28b30 72 72 43 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20  rrCode = 0;.    
28b40 61 73 73 65 72 74 28 20 70 49 64 78 4b 65 79 2d  assert( pIdxKey-
28b50 3e 64 65 66 61 75 6c 74 5f 72 63 3d 3d 31 20 0a  >default_rc==1 .
28b60 20 20 20 20 20 20 20 20 20 7c 7c 20 70 49 64 78           || pIdx
28b70 4b 65 79 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3d  Key->default_rc=
28b80 3d 30 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  =0 .         || 
28b90 70 49 64 78 4b 65 79 2d 3e 64 65 66 61 75 6c 74  pIdxKey->default
28ba0 5f 72 63 3d 3d 2d 31 0a 20 20 20 20 29 3b 0a 20  _rc==-1.    );. 
28bb0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 78 52 65 63   }else{.    xRec
28bc0 6f 72 64 43 6f 6d 70 61 72 65 20 3d 20 30 3b 20  ordCompare = 0; 
28bd0 2f 2a 20 41 6c 6c 20 6b 65 79 73 20 61 72 65 20  /* All keys are 
28be0 69 6e 74 65 67 65 72 73 20 2a 2f 0a 20 20 7d 0a  integers */.  }.
28bf0 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f  .  rc = moveToRo
28c00 6f 74 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20  ot(pCur);.  if( 
28c10 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  rc ){.    return
28c20 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72   rc;.  }.  asser
28c30 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f  t( pCur->pgnoRoo
28c40 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 61 70  t==0 || pCur->ap
28c50 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
28c60 5d 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ] );.  assert( p
28c70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30  Cur->pgnoRoot==0
28c80 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61 67 65   || pCur->apPage
28c90 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 69  [pCur->iPage]->i
28ca0 73 49 6e 69 74 20 29 3b 0a 20 20 61 73 73 65 72  sInit );.  asser
28cb0 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
28cc0 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20  =CURSOR_INVALID 
28cd0 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  || pCur->apPage[
28ce0 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43  pCur->iPage]->nC
28cf0 65 6c 6c 3e 30 20 29 3b 0a 20 20 69 66 28 20 70  ell>0 );.  if( p
28d00 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
28d10 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20  SOR_INVALID ){. 
28d20 20 20 20 2a 70 52 65 73 20 3d 20 2d 31 3b 0a 20     *pRes = -1;. 
28d30 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
28d40 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20  >pgnoRoot==0 || 
28d50 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
28d60 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c  r->iPage]->nCell
28d70 3d 3d 30 20 29 3b 0a 20 20 20 20 72 65 74 75 72  ==0 );.    retur
28d80 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
28d90 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
28da0 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b  >apPage[0]->intK
28db0 65 79 20 7c 7c 20 70 49 64 78 4b 65 79 20 29 3b  ey || pIdxKey );
28dc0 0a 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20  .  for(;;){.    
28dd0 69 6e 74 20 6c 77 72 2c 20 75 70 72 2c 20 69 64  int lwr, upr, id
28de0 78 2c 20 63 3b 0a 20 20 20 20 50 67 6e 6f 20 63  x, c;.    Pgno c
28df0 68 6c 64 50 67 3b 0a 20 20 20 20 4d 65 6d 50 61  hldPg;.    MemPa
28e00 67 65 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72  ge *pPage = pCur
28e10 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
28e20 50 61 67 65 5d 3b 0a 20 20 20 20 75 38 20 2a 70  Page];.    u8 *p
28e30 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  Cell;           
28e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
28e50 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 63 75 72  * Pointer to cur
28e60 72 65 6e 74 20 63 65 6c 6c 20 69 6e 20 70 50 61  rent cell in pPa
28e70 67 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 70 50  ge */..    /* pP
28e80 61 67 65 2d 3e 6e 43 65 6c 6c 20 6d 75 73 74 20  age->nCell must 
28e90 62 65 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  be greater than 
28ea0 7a 65 72 6f 2e 20 49 66 20 74 68 69 73 20 69 73  zero. If this is
28eb0 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 0a 20   the root-page. 
28ec0 20 20 20 2a 2a 20 74 68 65 20 63 75 72 73 6f 72     ** the cursor
28ed0 20 77 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e   would have been
28ee0 20 49 4e 56 41 4c 49 44 20 61 62 6f 76 65 20 61   INVALID above a
28ef0 6e 64 20 74 68 69 73 20 66 6f 72 28 3b 3b 29 20  nd this for(;;) 
28f00 6c 6f 6f 70 0a 20 20 20 20 2a 2a 20 6e 6f 74 20  loop.    ** not 
28f10 72 75 6e 2e 20 49 66 20 74 68 69 73 20 69 73 20  run. If this is 
28f20 6e 6f 74 20 74 68 65 20 72 6f 6f 74 2d 70 61 67  not the root-pag
28f30 65 2c 20 74 68 65 6e 20 74 68 65 20 6d 6f 76 65  e, then the move
28f40 54 6f 43 68 69 6c 64 28 29 20 72 6f 75 74 69 6e  ToChild() routin
28f50 65 0a 20 20 20 20 2a 2a 20 77 6f 75 6c 64 20 68  e.    ** would h
28f60 61 76 65 20 61 6c 72 65 61 64 79 20 64 65 74 65  ave already dete
28f70 63 74 65 64 20 64 62 20 63 6f 72 72 75 70 74 69  cted db corrupti
28f80 6f 6e 2e 20 53 69 6d 69 6c 61 72 6c 79 2c 20 70  on. Similarly, p
28f90 50 61 67 65 20 6d 75 73 74 0a 20 20 20 20 2a 2a  Page must.    **
28fa0 20 62 65 20 74 68 65 20 72 69 67 68 74 20 6b 69   be the right ki
28fb0 6e 64 20 28 69 6e 64 65 78 20 6f 72 20 74 61 62  nd (index or tab
28fc0 6c 65 29 20 6f 66 20 62 2d 74 72 65 65 20 70 61  le) of b-tree pa
28fd0 67 65 2e 20 4f 74 68 65 72 77 69 73 65 0a 20 20  ge. Otherwise.  
28fe0 20 20 2a 2a 20 61 20 6d 6f 76 65 54 6f 43 68 69    ** a moveToChi
28ff0 6c 64 28 29 20 6f 72 20 6d 6f 76 65 54 6f 52 6f  ld() or moveToRo
29000 6f 74 28 29 20 63 61 6c 6c 20 77 6f 75 6c 64 20  ot() call would 
29010 68 61 76 65 20 64 65 74 65 63 74 65 64 20 63 6f  have detected co
29020 72 72 75 70 74 69 6f 6e 2e 20 20 2a 2f 0a 20 20  rruption.  */.  
29030 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
29040 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20 20 20 20  >nCell>0 );.    
29050 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69  assert( pPage->i
29060 6e 74 4b 65 79 3d 3d 28 70 49 64 78 4b 65 79 3d  ntKey==(pIdxKey=
29070 3d 30 29 20 29 3b 0a 20 20 20 20 6c 77 72 20 3d  =0) );.    lwr =
29080 20 30 3b 0a 20 20 20 20 75 70 72 20 3d 20 70 50   0;.    upr = pP
29090 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a 20 20  age->nCell-1;.  
290a0 20 20 61 73 73 65 72 74 28 20 62 69 61 73 52 69    assert( biasRi
290b0 67 68 74 3d 3d 30 20 7c 7c 20 62 69 61 73 52 69  ght==0 || biasRi
290c0 67 68 74 3d 3d 31 20 29 3b 0a 20 20 20 20 69 64  ght==1 );.    id
290d0 78 20 3d 20 75 70 72 3e 3e 28 31 2d 62 69 61 73  x = upr>>(1-bias
290e0 52 69 67 68 74 29 3b 20 2f 2a 20 69 64 78 20 3d  Right); /* idx =
290f0 20 62 69 61 73 52 69 67 68 74 20 3f 20 75 70 72   biasRight ? upr
29100 20 3a 20 28 6c 77 72 2b 75 70 72 29 2f 32 3b 20   : (lwr+upr)/2; 
29110 2a 2f 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49  */.    pCur->aiI
29120 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20  dx[pCur->iPage] 
29130 3d 20 28 75 31 36 29 69 64 78 3b 0a 20 20 20 20  = (u16)idx;.    
29140 69 66 28 20 78 52 65 63 6f 72 64 43 6f 6d 70 61  if( xRecordCompa
29150 72 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66  re==0 ){.      f
29160 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 20 20 20 20  or(;;){.        
29170 69 36 34 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20  i64 nCellKey;.  
29180 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 66 69        pCell = fi
29190 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 64  ndCell(pPage, id
291a0 78 29 20 2b 20 70 50 61 67 65 2d 3e 63 68 69 6c  x) + pPage->chil
291b0 64 50 74 72 53 69 7a 65 3b 0a 20 20 20 20 20 20  dPtrSize;.      
291c0 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74    if( pPage->int
291d0 4b 65 79 4c 65 61 66 20 29 7b 0a 20 20 20 20 20  KeyLeaf ){.     
291e0 20 20 20 20 20 77 68 69 6c 65 28 20 30 78 38 30       while( 0x80
291f0 20 3c 3d 20 2a 28 70 43 65 6c 6c 2b 2b 29 20 29   <= *(pCell++) )
29200 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  {.            if
29210 28 20 70 43 65 6c 6c 3e 3d 70 50 61 67 65 2d 3e  ( pCell>=pPage->
29220 61 44 61 74 61 45 6e 64 20 29 20 72 65 74 75 72  aDataEnd ) retur
29230 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
29240 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20  _BKPT;.         
29250 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
29260 20 20 20 20 20 67 65 74 56 61 72 69 6e 74 28 70       getVarint(p
29270 43 65 6c 6c 2c 20 28 75 36 34 2a 29 26 6e 43 65  Cell, (u64*)&nCe
29280 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20  llKey);.        
29290 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3c 69 6e 74  if( nCellKey<int
292a0 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Key ){.         
292b0 20 6c 77 72 20 3d 20 69 64 78 2b 31 3b 0a 20 20   lwr = idx+1;.  
292c0 20 20 20 20 20 20 20 20 69 66 28 20 6c 77 72 3e          if( lwr>
292d0 75 70 72 20 29 7b 20 63 20 3d 20 2d 31 3b 20 62  upr ){ c = -1; b
292e0 72 65 61 6b 3b 20 7d 0a 20 20 20 20 20 20 20 20  reak; }.        
292f0 7d 65 6c 73 65 20 69 66 28 20 6e 43 65 6c 6c 4b  }else if( nCellK
29300 65 79 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20  ey>intKey ){.   
29310 20 20 20 20 20 20 20 75 70 72 20 3d 20 69 64 78         upr = idx
29320 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  -1;.          if
29330 28 20 6c 77 72 3e 75 70 72 20 29 7b 20 63 20 3d  ( lwr>upr ){ c =
29340 20 2b 31 3b 20 62 72 65 61 6b 3b 20 7d 0a 20 20   +1; break; }.  
29350 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
29360 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e         assert( n
29370 43 65 6c 6c 4b 65 79 3d 3d 69 6e 74 4b 65 79 20  CellKey==intKey 
29380 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 43 75  );.          pCu
29390 72 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20 42  r->curFlags |= B
293a0 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 3b 0a 20  TCF_ValidNKey;. 
293b0 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 69           pCur->i
293c0 6e 66 6f 2e 6e 4b 65 79 20 3d 20 6e 43 65 6c 6c  nfo.nKey = nCell
293d0 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 20 20 70  Key;.          p
293e0 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
293f0 3e 69 50 61 67 65 5d 20 3d 20 28 75 31 36 29 69  >iPage] = (u16)i
29400 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  dx;.          if
29410 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  ( !pPage->leaf )
29420 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c 77  {.            lw
29430 72 20 3d 20 69 64 78 3b 0a 20 20 20 20 20 20 20  r = idx;.       
29440 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f       goto moveto
29450 5f 6e 65 78 74 5f 6c 61 79 65 72 3b 0a 20 20 20  _next_layer;.   
29460 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
29470 20 20 20 20 20 20 20 20 20 20 2a 70 52 65 73 20            *pRes 
29480 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 0;.           
29490 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
294a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74  .            got
294b0 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b  o moveto_finish;
294c0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
294d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61       }.        a
294e0 73 73 65 72 74 28 20 6c 77 72 2b 75 70 72 3e 3d  ssert( lwr+upr>=
294f0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 64 78  0 );.        idx
29500 20 3d 20 28 6c 77 72 2b 75 70 72 29 3e 3e 31 3b   = (lwr+upr)>>1;
29510 20 20 2f 2a 20 69 64 78 20 3d 20 28 6c 77 72 2b    /* idx = (lwr+
29520 75 70 72 29 2f 32 3b 20 2a 2f 0a 20 20 20 20 20  upr)/2; */.     
29530 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
29540 20 20 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20      for(;;){.   
29550 20 20 20 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 0a       int nCell;.
29560 20 20 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20          pCell = 
29570 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20  findCell(pPage, 
29580 69 64 78 29 20 2b 20 70 50 61 67 65 2d 3e 63 68  idx) + pPage->ch
29590 69 6c 64 50 74 72 53 69 7a 65 3b 0a 0a 20 20 20  ildPtrSize;..   
295a0 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 78 69       /* The maxi
295b0 6d 75 6d 20 73 75 70 70 6f 72 74 65 64 20 70 61  mum supported pa
295c0 67 65 2d 73 69 7a 65 20 69 73 20 36 35 35 33 36  ge-size is 65536
295d0 20 62 79 74 65 73 2e 20 54 68 69 73 20 6d 65 61   bytes. This mea
295e0 6e 73 20 74 68 61 74 0a 20 20 20 20 20 20 20 20  ns that.        
295f0 2a 2a 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e  ** the maximum n
29600 75 6d 62 65 72 20 6f 66 20 72 65 63 6f 72 64 20  umber of record 
29610 62 79 74 65 73 20 73 74 6f 72 65 64 20 6f 6e 20  bytes stored on 
29620 61 6e 20 69 6e 64 65 78 20 42 2d 54 72 65 65 0a  an index B-Tree.
29630 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20          ** page 
29640 69 73 20 6c 65 73 73 20 74 68 61 6e 20 31 36 33  is less than 163
29650 38 34 20 62 79 74 65 73 20 61 6e 64 20 6d 61 79  84 bytes and may
29660 20 62 65 20 73 74 6f 72 65 64 20 61 73 20 61 20   be stored as a 
29670 32 2d 62 79 74 65 0a 20 20 20 20 20 20 20 20 2a  2-byte.        *
29680 2a 20 76 61 72 69 6e 74 2e 20 54 68 69 73 20 69  * varint. This i
29690 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75 73  nformation is us
296a0 65 64 20 74 6f 20 61 74 74 65 6d 70 74 20 74 6f  ed to attempt to
296b0 20 61 76 6f 69 64 20 70 61 72 73 69 6e 67 20 0a   avoid parsing .
296c0 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 65          ** the e
296d0 6e 74 69 72 65 20 63 65 6c 6c 20 62 79 20 63 68  ntire cell by ch
296e0 65 63 6b 69 6e 67 20 66 6f 72 20 74 68 65 20 63  ecking for the c
296f0 61 73 65 73 20 77 68 65 72 65 20 74 68 65 20 72  ases where the r
29700 65 63 6f 72 64 20 69 73 20 0a 20 20 20 20 20 20  ecord is .      
29710 20 20 2a 2a 20 73 74 6f 72 65 64 20 65 6e 74 69    ** stored enti
29720 72 65 6c 79 20 77 69 74 68 69 6e 20 74 68 65 20  rely within the 
29730 62 2d 74 72 65 65 20 70 61 67 65 20 62 79 20 69  b-tree page by i
29740 6e 73 70 65 63 74 69 6e 67 20 74 68 65 20 66 69  nspecting the fi
29750 72 73 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  rst .        ** 
29760 32 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 63  2 bytes of the c
29770 65 6c 6c 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ell..        */.
29780 20 20 20 20 20 20 20 20 6e 43 65 6c 6c 20 3d 20          nCell = 
29790 70 43 65 6c 6c 5b 30 5d 3b 0a 20 20 20 20 20 20  pCell[0];.      
297a0 20 20 69 66 28 20 6e 43 65 6c 6c 3c 3d 70 50 61    if( nCell<=pPa
297b0 67 65 2d 3e 6d 61 78 31 62 79 74 65 50 61 79 6c  ge->max1bytePayl
297c0 6f 61 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20  oad ){.         
297d0 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20   /* This branch 
297e0 72 75 6e 73 20 69 66 20 74 68 65 20 72 65 63 6f  runs if the reco
297f0 72 64 2d 73 69 7a 65 20 66 69 65 6c 64 20 6f 66  rd-size field of
29800 20 74 68 65 20 63 65 6c 6c 20 69 73 20 61 0a 20   the cell is a. 
29810 20 20 20 20 20 20 20 20 20 2a 2a 20 73 69 6e 67           ** sing
29820 6c 65 20 62 79 74 65 20 76 61 72 69 6e 74 20 61  le byte varint a
29830 6e 64 20 74 68 65 20 72 65 63 6f 72 64 20 66 69  nd the record fi
29840 74 73 20 65 6e 74 69 72 65 6c 79 20 6f 6e 20 74  ts entirely on t
29850 68 65 20 6d 61 69 6e 0a 20 20 20 20 20 20 20 20  he main.        
29860 20 20 2a 2a 20 62 2d 74 72 65 65 20 70 61 67 65    ** b-tree page
29870 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  .  */.          
29880 74 65 73 74 63 61 73 65 28 20 70 43 65 6c 6c 2b  testcase( pCell+
29890 6e 43 65 6c 6c 2b 31 3d 3d 70 50 61 67 65 2d 3e  nCell+1==pPage->
298a0 61 44 61 74 61 45 6e 64 20 29 3b 0a 20 20 20 20  aDataEnd );.    
298b0 20 20 20 20 20 20 63 20 3d 20 78 52 65 63 6f 72        c = xRecor
298c0 64 43 6f 6d 70 61 72 65 28 6e 43 65 6c 6c 2c 20  dCompare(nCell, 
298d0 28 76 6f 69 64 2a 29 26 70 43 65 6c 6c 5b 31 5d  (void*)&pCell[1]
298e0 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20 20 20 20  , pIdxKey);.    
298f0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21 28      }else if( !(
29900 70 43 65 6c 6c 5b 31 5d 20 26 20 30 78 38 30 29  pCell[1] & 0x80)
29910 20 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 28   .          && (
29920 6e 43 65 6c 6c 20 3d 20 28 28 6e 43 65 6c 6c 26  nCell = ((nCell&
29930 30 78 37 66 29 3c 3c 37 29 20 2b 20 70 43 65 6c  0x7f)<<7) + pCel
29940 6c 5b 31 5d 29 3c 3d 70 50 61 67 65 2d 3e 6d 61  l[1])<=pPage->ma
29950 78 4c 6f 63 61 6c 0a 20 20 20 20 20 20 20 20 29  xLocal.        )
29960 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  {.          /* T
29970 68 65 20 72 65 63 6f 72 64 2d 73 69 7a 65 20 66  he record-size f
29980 69 65 6c 64 20 69 73 20 61 20 32 20 62 79 74 65  ield is a 2 byte
29990 20 76 61 72 69 6e 74 20 61 6e 64 20 74 68 65 20   varint and the 
299a0 72 65 63 6f 72 64 20 0a 20 20 20 20 20 20 20 20  record .        
299b0 20 20 2a 2a 20 66 69 74 73 20 65 6e 74 69 72 65    ** fits entire
299c0 6c 79 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20 62  ly on the main b
299d0 2d 74 72 65 65 20 70 61 67 65 2e 20 20 2a 2f 0a  -tree page.  */.
299e0 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
299f0 73 65 28 20 70 43 65 6c 6c 2b 6e 43 65 6c 6c 2b  se( pCell+nCell+
29a00 32 3d 3d 70 50 61 67 65 2d 3e 61 44 61 74 61 45  2==pPage->aDataE
29a10 6e 64 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  nd );.          
29a20 63 20 3d 20 78 52 65 63 6f 72 64 43 6f 6d 70 61  c = xRecordCompa
29a30 72 65 28 6e 43 65 6c 6c 2c 20 28 76 6f 69 64 2a  re(nCell, (void*
29a40 29 26 70 43 65 6c 6c 5b 32 5d 2c 20 70 49 64 78  )&pCell[2], pIdx
29a50 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  Key);.        }e
29a60 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  lse{.          /
29a70 2a 20 54 68 65 20 72 65 63 6f 72 64 20 66 6c 6f  * The record flo
29a80 77 73 20 6f 76 65 72 20 6f 6e 74 6f 20 6f 6e 65  ws over onto one
29a90 20 6f 72 20 6d 6f 72 65 20 6f 76 65 72 66 6c 6f   or more overflo
29aa0 77 20 70 61 67 65 73 2e 20 49 6e 0a 20 20 20 20  w pages. In.    
29ab0 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 63 61        ** this ca
29ac0 73 65 20 74 68 65 20 77 68 6f 6c 65 20 63 65 6c  se the whole cel
29ad0 6c 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70 61  l needs to be pa
29ae0 72 73 65 64 2c 20 61 20 62 75 66 66 65 72 20 61  rsed, a buffer a
29af0 6c 6c 6f 63 61 74 65 64 0a 20 20 20 20 20 20 20  llocated.       
29b00 20 20 20 2a 2a 20 61 6e 64 20 61 63 63 65 73 73     ** and access
29b10 50 61 79 6c 6f 61 64 28 29 20 75 73 65 64 20 74  Payload() used t
29b20 6f 20 72 65 74 72 69 65 76 65 20 74 68 65 20 72  o retrieve the r
29b30 65 63 6f 72 64 20 69 6e 74 6f 20 74 68 65 0a 20  ecord into the. 
29b40 20 20 20 20 20 20 20 20 20 2a 2a 20 62 75 66 66           ** buff
29b50 65 72 20 62 65 66 6f 72 65 20 56 64 62 65 52 65  er before VdbeRe
29b60 63 6f 72 64 43 6f 6d 70 61 72 65 28 29 20 63 61  cordCompare() ca
29b70 6e 20 62 65 20 63 61 6c 6c 65 64 2e 20 2a 2f 0a  n be called. */.
29b80 20 20 20 20 20 20 20 20 20 20 76 6f 69 64 20 2a            void *
29b90 70 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20  pCellKey;.      
29ba0 20 20 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 70      u8 * const p
29bb0 43 65 6c 6c 42 6f 64 79 20 3d 20 70 43 65 6c 6c  CellBody = pCell
29bc0 20 2d 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50   - pPage->childP
29bd0 74 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20  trSize;.        
29be0 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c    btreeParseCell
29bf0 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  Ptr(pPage, pCell
29c00 42 6f 64 79 2c 20 26 70 43 75 72 2d 3e 69 6e 66  Body, &pCur->inf
29c10 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 43  o);.          nC
29c20 65 6c 6c 20 3d 20 28 69 6e 74 29 70 43 75 72 2d  ell = (int)pCur-
29c30 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 20 20  >info.nKey;.    
29c40 20 20 20 20 20 20 70 43 65 6c 6c 4b 65 79 20 3d        pCellKey =
29c50 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 20   sqlite3Malloc( 
29c60 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 20 20 20  nCell );.       
29c70 20 20 20 69 66 28 20 70 43 65 6c 6c 4b 65 79 3d     if( pCellKey=
29c80 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
29c90 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
29ca0 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 20  MEM;.           
29cb0 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e   goto moveto_fin
29cc0 69 73 68 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ish;.          }
29cd0 0a 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d  .          pCur-
29ce0 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
29cf0 67 65 5d 20 3d 20 28 75 31 36 29 69 64 78 3b 0a  ge] = (u16)idx;.
29d00 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 61            rc = a
29d10 63 63 65 73 73 50 61 79 6c 6f 61 64 28 70 43 75  ccessPayload(pCu
29d20 72 2c 20 30 2c 20 6e 43 65 6c 6c 2c 20 28 75 6e  r, 0, nCell, (un
29d30 73 69 67 6e 65 64 20 63 68 61 72 2a 29 70 43 65  signed char*)pCe
29d40 6c 6c 4b 65 79 2c 20 32 29 3b 0a 20 20 20 20 20  llKey, 2);.     
29d50 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
29d60 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
29d70 65 33 5f 66 72 65 65 28 70 43 65 6c 6c 4b 65 79  e3_free(pCellKey
29d80 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67  );.            g
29d90 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73  oto moveto_finis
29da0 68 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  h;.          }. 
29db0 20 20 20 20 20 20 20 20 20 63 20 3d 20 78 52 65           c = xRe
29dc0 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43 65 6c  cordCompare(nCel
29dd0 6c 2c 20 70 43 65 6c 6c 4b 65 79 2c 20 70 49 64  l, pCellKey, pId
29de0 78 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 20  xKey);.         
29df0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43   sqlite3_free(pC
29e00 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20 20  ellKey);.       
29e10 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72   }.        asser
29e20 74 28 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  t( .            
29e30 28 70 49 64 78 4b 65 79 2d 3e 65 72 72 43 6f 64  (pIdxKey->errCod
29e40 65 21 3d 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  e!=SQLITE_CORRUP
29e50 54 20 7c 7c 20 63 3d 3d 30 29 0a 20 20 20 20 20  T || c==0).     
29e60 20 20 20 20 26 26 20 28 70 49 64 78 4b 65 79 2d      && (pIdxKey-
29e70 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45  >errCode!=SQLITE
29e80 5f 4e 4f 4d 45 4d 20 7c 7c 20 70 43 75 72 2d 3e  _NOMEM || pCur->
29e90 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pBtree->db->mall
29ea0 6f 63 46 61 69 6c 65 64 29 0a 20 20 20 20 20 20  ocFailed).      
29eb0 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28    );.        if(
29ec0 20 63 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20   c<0 ){.        
29ed0 20 20 6c 77 72 20 3d 20 69 64 78 2b 31 3b 0a 20    lwr = idx+1;. 
29ee0 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
29ef0 20 63 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20   c>0 ){.        
29f00 20 20 75 70 72 20 3d 20 69 64 78 2d 31 3b 0a 20    upr = idx-1;. 
29f10 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
29f20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
29f30 63 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  c==0 );.        
29f40 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20    *pRes = 0;.   
29f50 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
29f60 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20  TE_OK;.         
29f70 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
29f80 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75 31 36  r->iPage] = (u16
29f90 29 69 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20  )idx;.          
29fa0 69 66 28 20 70 49 64 78 4b 65 79 2d 3e 65 72 72  if( pIdxKey->err
29fb0 43 6f 64 65 20 29 20 72 63 20 3d 20 53 51 4c 49  Code ) rc = SQLI
29fc0 54 45 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20  TE_CORRUPT;.    
29fd0 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74        goto movet
29fe0 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 20 20  o_finish;.      
29ff0 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
2a000 6c 77 72 3e 75 70 72 20 29 20 62 72 65 61 6b 3b  lwr>upr ) break;
2a010 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
2a020 20 6c 77 72 2b 75 70 72 3e 3d 30 20 29 3b 0a 20   lwr+upr>=0 );. 
2a030 20 20 20 20 20 20 20 69 64 78 20 3d 20 28 6c 77         idx = (lw
2a040 72 2b 75 70 72 29 3e 3e 31 3b 20 20 2f 2a 20 69  r+upr)>>1;  /* i
2a050 64 78 20 3d 20 28 6c 77 72 2b 75 70 72 29 2f 32  dx = (lwr+upr)/2
2a060 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   */.      }.    
2a070 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 6c 77  }.    assert( lw
2a080 72 3d 3d 75 70 72 2b 31 20 7c 7c 20 28 70 50 61  r==upr+1 || (pPa
2a090 67 65 2d 3e 69 6e 74 4b 65 79 20 26 26 20 21 70  ge->intKey && !p
2a0a0 50 61 67 65 2d 3e 6c 65 61 66 29 20 29 3b 0a 20  Page->leaf) );. 
2a0b0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
2a0c0 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 20 20  ->isInit );.    
2a0d0 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20  if( pPage->leaf 
2a0e0 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
2a0f0 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
2a100 72 2d 3e 69 50 61 67 65 5d 3c 70 43 75 72 2d 3e  r->iPage]<pCur->
2a110 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
2a120 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20  ge]->nCell );.  
2a130 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b      pCur->aiIdx[
2a140 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28  pCur->iPage] = (
2a150 75 31 36 29 69 64 78 3b 0a 20 20 20 20 20 20 2a  u16)idx;.      *
2a160 70 52 65 73 20 3d 20 63 3b 0a 20 20 20 20 20 20  pRes = c;.      
2a170 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
2a180 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74        goto movet
2a190 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 7d 0a  o_finish;.    }.
2a1a0 6d 6f 76 65 74 6f 5f 6e 65 78 74 5f 6c 61 79 65  moveto_next_laye
2a1b0 72 3a 0a 20 20 20 20 69 66 28 20 6c 77 72 3e 3d  r:.    if( lwr>=
2a1c0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a  pPage->nCell ){.
2a1d0 20 20 20 20 20 20 63 68 6c 64 50 67 20 3d 20 67        chldPg = g
2a1e0 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e  et4byte(&pPage->
2a1f0 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72  aData[pPage->hdr
2a200 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20  Offset+8]);.    
2a210 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 6c  }else{.      chl
2a220 64 50 67 20 3d 20 67 65 74 34 62 79 74 65 28 66  dPg = get4byte(f
2a230 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 6c  indCell(pPage, l
2a240 77 72 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  wr));.    }.    
2a250 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
2a260 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75 31 36 29  ->iPage] = (u16)
2a270 6c 77 72 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f  lwr;.    rc = mo
2a280 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20  veToChild(pCur, 
2a290 63 68 6c 64 50 67 29 3b 0a 20 20 20 20 69 66 28  chldPg);.    if(
2a2a0 20 72 63 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d   rc ) break;.  }
2a2b0 0a 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3a 0a  .moveto_finish:.
2a2c0 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69    pCur->info.nSi
2a2d0 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e  ze = 0;.  pCur->
2a2e0 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 28 42 54  curFlags &= ~(BT
2a2f0 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43  CF_ValidNKey|BTC
2a300 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3b 0a 20 20  F_ValidOvfl);.  
2a310 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f  return rc;.}.../
2a320 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
2a330 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 69   if the cursor i
2a340 73 20 6e 6f 74 20 70 6f 69 6e 74 69 6e 67 20 61  s not pointing a
2a350 74 20 61 6e 20 65 6e 74 72 79 20 6f 66 20 74 68  t an entry of th
2a360 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54  e table..**.** T
2a370 52 55 45 20 77 69 6c 6c 20 62 65 20 72 65 74 75  RUE will be retu
2a380 72 6e 65 64 20 61 66 74 65 72 20 61 20 63 61 6c  rned after a cal
2a390 6c 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65  l to sqlite3Btre
2a3a0 65 4e 65 78 74 28 29 20 6d 6f 76 65 73 0a 2a 2a  eNext() moves.**
2a3b0 20 70 61 73 74 20 74 68 65 20 6c 61 73 74 20 65   past the last e
2a3c0 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61 62 6c  ntry in the tabl
2a3d0 65 20 6f 72 20 73 71 6c 69 74 65 33 42 74 72 65  e or sqlite3Btre
2a3e0 65 50 72 65 76 28 29 20 6d 6f 76 65 73 20 70 61  ePrev() moves pa
2a3f0 73 74 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20  st.** the first 
2a400 65 6e 74 72 79 2e 20 20 54 52 55 45 20 69 73 20  entry.  TRUE is 
2a410 61 6c 73 6f 20 72 65 74 75 72 6e 65 64 20 69 66  also returned if
2a420 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d   the table is em
2a430 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  pty..*/.int sqli
2a440 74 65 33 42 74 72 65 65 45 6f 66 28 42 74 43 75  te3BtreeEof(BtCu
2a450 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 2f  rsor *pCur){.  /
2a460 2a 20 54 4f 44 4f 3a 20 57 68 61 74 20 69 66 20  * TODO: What if 
2a470 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 69 6e  the cursor is in
2a480 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53   CURSOR_REQUIRES
2a490 45 45 4b 20 62 75 74 20 61 6c 6c 20 74 61 62 6c  EEK but all tabl
2a4a0 65 20 65 6e 74 72 69 65 73 0a 20 20 2a 2a 20 68  e entries.  ** h
2a4b0 61 76 65 20 62 65 65 6e 20 64 65 6c 65 74 65 64  ave been deleted
2a4c0 3f 20 54 68 69 73 20 41 50 49 20 77 69 6c 6c 20  ? This API will 
2a4d0 6e 65 65 64 20 74 6f 20 63 68 61 6e 67 65 20 74  need to change t
2a4e0 6f 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f  o return an erro
2a4f0 72 20 63 6f 64 65 0a 20 20 2a 2a 20 61 73 20 77  r code.  ** as w
2a500 65 6c 6c 20 61 73 20 74 68 65 20 62 6f 6f 6c 65  ell as the boole
2a510 61 6e 20 72 65 73 75 6c 74 20 76 61 6c 75 65 2e  an result value.
2a520 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 28  .  */.  return (
2a530 43 55 52 53 4f 52 5f 56 41 4c 49 44 21 3d 70 43  CURSOR_VALID!=pC
2a540 75 72 2d 3e 65 53 74 61 74 65 29 3b 0a 7d 0a 0a  ur->eState);.}..
2a550 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20 74 68  /*.** Advance th
2a560 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20  e cursor to the 
2a570 6e 65 78 74 20 65 6e 74 72 79 20 69 6e 20 74 68  next entry in th
2a580 65 20 64 61 74 61 62 61 73 65 2e 20 20 49 66 0a  e database.  If.
2a590 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20 74 68  ** successful th
2a5a0 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 30 2e 20  en set *pRes=0. 
2a5b0 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 0a 2a   If the cursor.*
2a5c0 2a 20 77 61 73 20 61 6c 72 65 61 64 79 20 70 6f  * was already po
2a5d0 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 6c 61  inting to the la
2a5e0 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  st entry in the 
2a5f0 64 61 74 61 62 61 73 65 20 62 65 66 6f 72 65 0a  database before.
2a600 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ** this routine 
2a610 77 61 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e  was called, then
2a620 20 73 65 74 20 2a 70 52 65 73 3d 31 2e 0a 2a 2a   set *pRes=1..**
2a630 0a 2a 2a 20 54 68 65 20 6d 61 69 6e 20 65 6e 74  .** The main ent
2a640 72 79 20 70 6f 69 6e 74 20 69 73 20 73 71 6c 69  ry point is sqli
2a650 74 65 33 42 74 72 65 65 4e 65 78 74 28 29 2e 20  te3BtreeNext(). 
2a660 20 54 68 61 74 20 72 6f 75 74 69 6e 65 20 69 73   That routine is
2a670 20 6f 70 74 69 6d 69 7a 65 64 0a 2a 2a 20 66 6f   optimized.** fo
2a680 72 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73  r the common cas
2a690 65 20 6f 66 20 6d 65 72 65 6c 79 20 69 6e 63 72  e of merely incr
2a6a0 65 6d 65 6e 74 69 6e 67 20 74 68 65 20 63 65 6c  ementing the cel
2a6b0 6c 20 63 6f 75 6e 74 65 72 20 42 74 43 75 72 73  l counter BtCurs
2a6c0 6f 72 2e 61 69 49 64 78 0a 2a 2a 20 74 6f 20 74  or.aiIdx.** to t
2a6d0 68 65 20 6e 65 78 74 20 63 65 6c 6c 20 6f 6e 20  he next cell on 
2a6e0 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65  the current page
2a6f0 2e 20 20 54 68 65 20 28 73 6c 6f 77 65 72 29 20  .  The (slower) 
2a700 62 74 72 65 65 4e 65 78 74 28 29 20 68 65 6c 70  btreeNext() help
2a710 65 72 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73  er.** routine is
2a720 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 69 74 20   called when it 
2a730 69 73 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20  is necessary to 
2a740 6d 6f 76 65 20 74 6f 20 61 20 64 69 66 66 65 72  move to a differ
2a750 65 6e 74 20 70 61 67 65 20 6f 72 0a 2a 2a 20 74  ent page or.** t
2a760 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 63 75  o restore the cu
2a770 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  rsor..**.** The 
2a780 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e  calling function
2a790 20 77 69 6c 6c 20 73 65 74 20 2a 70 52 65 73 20   will set *pRes 
2a7a0 74 6f 20 30 20 6f 72 20 31 2e 20 20 54 68 65 20  to 0 or 1.  The 
2a7b0 69 6e 69 74 69 61 6c 20 2a 70 52 65 73 20 76 61  initial *pRes va
2a7c0 6c 75 65 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 31  lue.** will be 1
2a7d0 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 62   if the cursor b
2a7e0 65 69 6e 67 20 73 74 65 70 70 65 64 20 63 6f 72  eing stepped cor
2a7f0 72 65 73 70 6f 6e 64 73 20 74 6f 20 61 6e 20 53  responds to an S
2a800 51 4c 20 69 6e 64 65 78 20 61 6e 64 0a 2a 2a 20  QL index and.** 
2a810 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  if this routine 
2a820 63 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20  could have been 
2a830 73 6b 69 70 70 65 64 20 69 66 20 74 68 61 74 20  skipped if that 
2a840 53 51 4c 20 69 6e 64 65 78 20 68 61 64 20 62 65  SQL index had be
2a850 65 6e 0a 2a 2a 20 61 20 75 6e 69 71 75 65 20 69  en.** a unique i
2a860 6e 64 65 78 2e 20 20 4f 74 68 65 72 77 69 73 65  ndex.  Otherwise
2a870 20 74 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c   the caller will
2a880 20 68 61 76 65 20 73 65 74 20 2a 70 52 65 73 20   have set *pRes 
2a890 74 6f 20 7a 65 72 6f 2e 0a 2a 2a 20 5a 65 72 6f  to zero..** Zero
2a8a0 20 69 73 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63   is the common c
2a8b0 61 73 65 2e 20 54 68 65 20 62 74 72 65 65 20 69  ase. The btree i
2a8c0 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69 73  mplementation is
2a8d0 20 66 72 65 65 20 74 6f 20 75 73 65 20 74 68 65   free to use the
2a8e0 0a 2a 2a 20 69 6e 69 74 69 61 6c 20 2a 70 52 65  .** initial *pRe
2a8f0 73 20 76 61 6c 75 65 20 61 73 20 61 20 68 69 6e  s value as a hin
2a900 74 20 74 6f 20 69 6d 70 72 6f 76 65 20 70 65 72  t to improve per
2a910 66 6f 72 6d 61 6e 63 65 2c 20 62 75 74 20 74 68  formance, but th
2a920 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 53 51 4c  e current.** SQL
2a930 69 74 65 20 62 74 72 65 65 20 69 6d 70 6c 65 6d  ite btree implem
2a940 65 6e 74 61 74 69 6f 6e 20 64 6f 65 73 20 6e 6f  entation does no
2a950 74 2e 20 28 4e 6f 74 65 20 74 68 61 74 20 74 68  t. (Note that th
2a960 65 20 63 6f 6d 64 62 32 20 62 74 72 65 65 0a 2a  e comdb2 btree.*
2a970 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * implementation
2a980 20 64 6f 65 73 20 75 73 65 20 74 68 69 73 20 68   does use this h
2a990 69 6e 74 2c 20 68 6f 77 65 76 65 72 2e 29 0a 2a  int, however.).*
2a9a0 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f  /.static SQLITE_
2a9b0 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74 20 62 74 72  NOINLINE int btr
2a9c0 65 65 4e 65 78 74 28 42 74 43 75 72 73 6f 72 20  eeNext(BtCursor 
2a9d0 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73  *pCur, int *pRes
2a9e0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  ){.  int rc;.  i
2a9f0 6e 74 20 69 64 78 3b 0a 20 20 4d 65 6d 50 61 67  nt idx;.  MemPag
2aa00 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73 73  e *pPage;..  ass
2aa10 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
2aa20 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
2aa30 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 73   assert( pCur->s
2aa40 6b 69 70 4e 65 78 74 3d 3d 30 20 7c 7c 20 70 43  kipNext==0 || pC
2aa50 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53  ur->eState!=CURS
2aa60 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73  OR_VALID );.  as
2aa70 73 65 72 74 28 20 2a 70 52 65 73 3d 3d 30 20 29  sert( *pRes==0 )
2aa80 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53  ;.  if( pCur->eS
2aa90 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c  tate!=CURSOR_VAL
2aaa0 49 44 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ID ){.    assert
2aab0 28 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67  ( (pCur->curFlag
2aac0 73 20 26 20 42 54 43 46 5f 56 61 6c 69 64 4f 76  s & BTCF_ValidOv
2aad0 66 6c 29 3d 3d 30 20 29 3b 0a 20 20 20 20 72 63  fl)==0 );.    rc
2aae0 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72   = restoreCursor
2aaf0 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a  Position(pCur);.
2ab00 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
2ab10 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
2ab20 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
2ab30 20 20 20 20 69 66 28 20 43 55 52 53 4f 52 5f 49      if( CURSOR_I
2ab40 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53  NVALID==pCur->eS
2ab50 74 61 74 65 20 29 7b 0a 20 20 20 20 20 20 2a 70  tate ){.      *p
2ab60 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 72  Res = 1;.      r
2ab70 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2ab80 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
2ab90 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 29 7b  Cur->skipNext ){
2aba0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
2abb0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
2abc0 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70 43 75  SOR_VALID || pCu
2abd0 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
2abe0 52 5f 53 4b 49 50 4e 45 58 54 20 29 3b 0a 20 20  R_SKIPNEXT );.  
2abf0 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65      pCur->eState
2ac00 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b   = CURSOR_VALID;
2ac10 0a 20 20 20 20 20 20 69 66 28 20 70 43 75 72 2d  .      if( pCur-
2ac20 3e 73 6b 69 70 4e 65 78 74 3e 30 20 29 7b 0a 20  >skipNext>0 ){. 
2ac30 20 20 20 20 20 20 20 70 43 75 72 2d 3e 73 6b 69         pCur->ski
2ac40 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 20  pNext = 0;.     
2ac50 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2ac60 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  _OK;.      }.   
2ac70 20 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78     pCur->skipNex
2ac80 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  t = 0;.    }.  }
2ac90 0a 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75 72  ..  pPage = pCur
2aca0 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
2acb0 50 61 67 65 5d 3b 0a 20 20 69 64 78 20 3d 20 2b  Page];.  idx = +
2acc0 2b 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75  +pCur->aiIdx[pCu
2acd0 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 61 73 73  r->iPage];.  ass
2ace0 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e  ert( pPage->isIn
2acf0 69 74 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  it );..  /* If t
2ad00 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2ad10 20 69 73 20 63 6f 72 72 75 70 74 2c 20 69 74 20   is corrupt, it 
2ad20 69 73 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20  is possible for 
2ad30 74 68 65 20 76 61 6c 75 65 20 6f 66 20 69 64 78  the value of idx
2ad40 20 0a 20 20 2a 2a 20 74 6f 20 62 65 20 69 6e 76   .  ** to be inv
2ad50 61 6c 69 64 20 68 65 72 65 2e 20 54 68 69 73 20  alid here. This 
2ad60 63 61 6e 20 6f 6e 6c 79 20 6f 63 63 75 72 20 69  can only occur i
2ad70 66 20 61 20 73 65 63 6f 6e 64 20 63 75 72 73 6f  f a second curso
2ad80 72 20 6d 6f 64 69 66 69 65 73 0a 20 20 2a 2a 20  r modifies.  ** 
2ad90 74 68 65 20 70 61 67 65 20 77 68 69 6c 65 20 63  the page while c
2ada0 75 72 73 6f 72 20 70 43 75 72 20 69 73 20 68 6f  ursor pCur is ho
2adb0 6c 64 69 6e 67 20 61 20 72 65 66 65 72 65 6e 63  lding a referenc
2adc0 65 20 74 6f 20 69 74 2e 20 57 68 69 63 68 20 63  e to it. Which c
2add0 61 6e 0a 20 20 2a 2a 20 6f 6e 6c 79 20 68 61 70  an.  ** only hap
2ade0 70 65 6e 20 69 66 20 74 68 65 20 64 61 74 61 62  pen if the datab
2adf0 61 73 65 20 69 73 20 63 6f 72 72 75 70 74 20 69  ase is corrupt i
2ae00 6e 20 73 75 63 68 20 61 20 77 61 79 20 61 73 20  n such a way as 
2ae10 74 6f 20 6c 69 6e 6b 20 74 68 65 0a 20 20 2a 2a  to link the.  **
2ae20 20 70 61 67 65 20 69 6e 74 6f 20 6d 6f 72 65 20   page into more 
2ae30 74 68 61 6e 20 6f 6e 65 20 62 2d 74 72 65 65 20  than one b-tree 
2ae40 73 74 72 75 63 74 75 72 65 2e 20 2a 2f 0a 20 20  structure. */.  
2ae50 74 65 73 74 63 61 73 65 28 20 69 64 78 3e 70 50  testcase( idx>pP
2ae60 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 0a 20  age->nCell );.. 
2ae70 20 69 66 28 20 69 64 78 3e 3d 70 50 61 67 65 2d   if( idx>=pPage-
2ae80 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 69 66  >nCell ){.    if
2ae90 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  ( !pPage->leaf )
2aea0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 6f 76  {.      rc = mov
2aeb0 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 67  eToChild(pCur, g
2aec0 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e  et4byte(&pPage->
2aed0 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72  aData[pPage->hdr
2aee0 4f 66 66 73 65 74 2b 38 5d 29 29 3b 0a 20 20 20  Offset+8]));.   
2aef0 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
2af00 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 72 65 74  rn rc;.      ret
2af10 75 72 6e 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f  urn moveToLeftmo
2af20 73 74 28 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a  st(pCur);.    }.
2af30 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 69 66      do{.      if
2af40 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3d 3d 30  ( pCur->iPage==0
2af50 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 52 65   ){.        *pRe
2af60 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70  s = 1;.        p
2af70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
2af80 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20  RSOR_INVALID;.  
2af90 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
2afa0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a  ITE_OK;.      }.
2afb0 20 20 20 20 20 20 6d 6f 76 65 54 6f 50 61 72 65        moveToPare
2afc0 6e 74 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20  nt(pCur);.      
2afd0 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70  pPage = pCur->ap
2afe0 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
2aff0 5d 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 70  ];.    }while( p
2b000 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
2b010 3e 69 50 61 67 65 5d 3e 3d 70 50 61 67 65 2d 3e  >iPage]>=pPage->
2b020 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 69 66 28  nCell );.    if(
2b030 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29   pPage->intKey )
2b040 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 73  {.      return s
2b050 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28  qlite3BtreeNext(
2b060 70 43 75 72 2c 20 70 52 65 73 29 3b 0a 20 20 20  pCur, pRes);.   
2b070 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65   }else{.      re
2b080 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2b090 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
2b0a0 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
2b0b0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2b0c0 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  _OK;.  }else{.  
2b0d0 20 20 72 65 74 75 72 6e 20 6d 6f 76 65 54 6f 4c    return moveToL
2b0e0 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20  eftmost(pCur);. 
2b0f0 20 7d 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33   }.}.int sqlite3
2b100 42 74 72 65 65 4e 65 78 74 28 42 74 43 75 72 73  BtreeNext(BtCurs
2b110 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70  or *pCur, int *p
2b120 52 65 73 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20  Res){.  MemPage 
2b130 2a 70 50 61 67 65 3b 0a 20 20 61 73 73 65 72 74  *pPage;.  assert
2b140 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
2b150 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ex(pCur) );.  as
2b160 73 65 72 74 28 20 70 52 65 73 21 3d 30 20 29 3b  sert( pRes!=0 );
2b170 0a 20 20 61 73 73 65 72 74 28 20 2a 70 52 65 73  .  assert( *pRes
2b180 3d 3d 30 20 7c 7c 20 2a 70 52 65 73 3d 3d 31 20  ==0 || *pRes==1 
2b190 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
2b1a0 72 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d 30 20 7c  r->skipNext==0 |
2b1b0 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d  | pCur->eState!=
2b1c0 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
2b1d0 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69    pCur->info.nSi
2b1e0 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e  ze = 0;.  pCur->
2b1f0 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 28 42 54  curFlags &= ~(BT
2b200 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43  CF_ValidNKey|BTC
2b210 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3b 0a 20 20  F_ValidOvfl);.  
2b220 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 69 66 28  *pRes = 0;.  if(
2b230 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43   pCur->eState!=C
2b240 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 20 72 65  URSOR_VALID ) re
2b250 74 75 72 6e 20 62 74 72 65 65 4e 65 78 74 28 70  turn btreeNext(p
2b260 43 75 72 2c 20 70 52 65 73 29 3b 0a 20 20 70 50  Cur, pRes);.  pP
2b270 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61  age = pCur->apPa
2b280 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b  ge[pCur->iPage];
2b290 0a 20 20 69 66 28 20 28 2b 2b 70 43 75 72 2d 3e  .  if( (++pCur->
2b2a0 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
2b2b0 65 5d 29 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c  e])>=pPage->nCel
2b2c0 6c 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 61  l ){.    pCur->a
2b2d0 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
2b2e0 5d 2d 2d 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ]--;.    return 
2b2f0 62 74 72 65 65 4e 65 78 74 28 70 43 75 72 2c 20  btreeNext(pCur, 
2b300 70 52 65 73 29 3b 0a 20 20 7d 0a 20 20 69 66 28  pRes);.  }.  if(
2b310 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a   pPage->leaf ){.
2b320 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2b330 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  E_OK;.  }else{. 
2b340 20 20 20 72 65 74 75 72 6e 20 6d 6f 76 65 54 6f     return moveTo
2b350 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a  Leftmost(pCur);.
2b360 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 65    }.}../*.** Ste
2b370 70 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20  p the cursor to 
2b380 74 68 65 20 62 61 63 6b 20 74 6f 20 74 68 65 20  the back to the 
2b390 70 72 65 76 69 6f 75 73 20 65 6e 74 72 79 20 69  previous entry i
2b3a0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  n the database. 
2b3b0 20 49 66 0a 2a 2a 20 73 75 63 63 65 73 73 66 75   If.** successfu
2b3c0 6c 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73  l then set *pRes
2b3d0 3d 30 2e 20 20 49 66 20 74 68 65 20 63 75 72 73  =0.  If the curs
2b3e0 6f 72 0a 2a 2a 20 77 61 73 20 61 6c 72 65 61 64  or.** was alread
2b3f0 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68  y pointing to th
2b400 65 20 66 69 72 73 74 20 65 6e 74 72 79 20 69 6e  e first entry in
2b410 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62 65   the database be
2b420 66 6f 72 65 0a 2a 2a 20 74 68 69 73 20 72 6f 75  fore.** this rou
2b430 74 69 6e 65 20 77 61 73 20 63 61 6c 6c 65 64 2c  tine was called,
2b440 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d   then set *pRes=
2b450 31 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 69  1..**.** The mai
2b460 6e 20 65 6e 74 72 79 20 70 6f 69 6e 74 20 69 73  n entry point is
2b470 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 72 65   sqlite3BtreePre
2b480 76 69 6f 75 73 28 29 2e 20 20 54 68 61 74 20 72  vious().  That r
2b490 6f 75 74 69 6e 65 20 69 73 20 6f 70 74 69 6d 69  outine is optimi
2b4a0 7a 65 64 0a 2a 2a 20 66 6f 72 20 74 68 65 20 63  zed.** for the c
2b4b0 6f 6d 6d 6f 6e 20 63 61 73 65 20 6f 66 20 6d 65  ommon case of me
2b4c0 72 65 6c 79 20 64 65 63 72 65 6d 65 6e 74 69 6e  rely decrementin
2b4d0 67 20 74 68 65 20 63 65 6c 6c 20 63 6f 75 6e 74  g the cell count
2b4e0 65 72 20 42 74 43 75 72 73 6f 72 2e 61 69 49 64  er BtCursor.aiId
2b4f0 78 0a 2a 2a 20 74 6f 20 74 68 65 20 70 72 65 76  x.** to the prev
2b500 69 6f 75 73 20 63 65 6c 6c 20 6f 6e 20 74 68 65  ious cell on the
2b510 20 63 75 72 72 65 6e 74 20 70 61 67 65 2e 20 20   current page.  
2b520 54 68 65 20 28 73 6c 6f 77 65 72 29 20 62 74 72  The (slower) btr
2b530 65 65 50 72 65 76 69 6f 75 73 28 29 0a 2a 2a 20  eePrevious().** 
2b540 68 65 6c 70 65 72 20 72 6f 75 74 69 6e 65 20 69  helper routine i
2b550 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 69 74  s called when it
2b560 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 74 6f   is necessary to
2b570 20 6d 6f 76 65 20 74 6f 20 61 20 64 69 66 66 65   move to a diffe
2b580 72 65 6e 74 20 70 61 67 65 0a 2a 2a 20 6f 72 20  rent page.** or 
2b590 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 63  to restore the c
2b5a0 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ursor..**.** The
2b5b0 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f   calling functio
2b5c0 6e 20 77 69 6c 6c 20 73 65 74 20 2a 70 52 65 73  n will set *pRes
2b5d0 20 74 6f 20 30 20 6f 72 20 31 2e 20 20 54 68 65   to 0 or 1.  The
2b5e0 20 69 6e 69 74 69 61 6c 20 2a 70 52 65 73 20 76   initial *pRes v
2b5f0 61 6c 75 65 0a 2a 2a 20 77 69 6c 6c 20 62 65 20  alue.** will be 
2b600 31 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20  1 if the cursor 
2b610 62 65 69 6e 67 20 73 74 65 70 70 65 64 20 63 6f  being stepped co
2b620 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 61 6e 20  rresponds to an 
2b630 53 51 4c 20 69 6e 64 65 78 20 61 6e 64 0a 2a 2a  SQL index and.**
2b640 20 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65   if this routine
2b650 20 63 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e   could have been
2b660 20 73 6b 69 70 70 65 64 20 69 66 20 74 68 61 74   skipped if that
2b670 20 53 51 4c 20 69 6e 64 65 78 20 68 61 64 20 62   SQL index had b
2b680 65 65 6e 0a 2a 2a 20 61 20 75 6e 69 71 75 65 20  een.** a unique 
2b690 69 6e 64 65 78 2e 20 20 4f 74 68 65 72 77 69 73  index.  Otherwis
2b6a0 65 20 74 68 65 20 63 61 6c 6c 65 72 20 77 69 6c  e the caller wil
2b6b0 6c 20 68 61 76 65 20 73 65 74 20 2a 70 52 65 73  l have set *pRes
2b6c0 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2a 20 5a 65 72   to zero..** Zer
2b6d0 6f 20 69 73 20 74 68 65 20 63 6f 6d 6d 6f 6e 20  o is the common 
2b6e0 63 61 73 65 2e 20 54 68 65 20 62 74 72 65 65 20  case. The btree 
2b6f0 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69  implementation i
2b700 73 20 66 72 65 65 20 74 6f 20 75 73 65 20 74 68  s free to use th
2b710 65 0a 2a 2a 20 69 6e 69 74 69 61 6c 20 2a 70 52  e.** initial *pR
2b720 65 73 20 76 61 6c 75 65 20 61 73 20 61 20 68 69  es value as a hi
2b730 6e 74 20 74 6f 20 69 6d 70 72 6f 76 65 20 70 65  nt to improve pe
2b740 72 66 6f 72 6d 61 6e 63 65 2c 20 62 75 74 20 74  rformance, but t
2b750 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 53 51  he current.** SQ
2b760 4c 69 74 65 20 62 74 72 65 65 20 69 6d 70 6c 65  Lite btree imple
2b770 6d 65 6e 74 61 74 69 6f 6e 20 64 6f 65 73 20 6e  mentation does n
2b780 6f 74 2e 20 28 4e 6f 74 65 20 74 68 61 74 20 74  ot. (Note that t
2b790 68 65 20 63 6f 6d 64 62 32 20 62 74 72 65 65 0a  he comdb2 btree.
2b7a0 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ** implementatio
2b7b0 6e 20 64 6f 65 73 20 75 73 65 20 74 68 69 73 20  n does use this 
2b7c0 68 69 6e 74 2c 20 68 6f 77 65 76 65 72 2e 29 0a  hint, however.).
2b7d0 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45  */.static SQLITE
2b7e0 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74 20 62 74  _NOINLINE int bt
2b7f0 72 65 65 50 72 65 76 69 6f 75 73 28 42 74 43 75  reePrevious(BtCu
2b800 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20  rsor *pCur, int 
2b810 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63  *pRes){.  int rc
2b820 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
2b830 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63  ge;..  assert( c
2b840 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
2b850 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
2b860 74 28 20 70 52 65 73 21 3d 30 20 29 3b 0a 20 20  t( pRes!=0 );.  
2b870 61 73 73 65 72 74 28 20 2a 70 52 65 73 3d 3d 30  assert( *pRes==0
2b880 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
2b890 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d 30 20  ur->skipNext==0 
2b8a0 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21  || pCur->eState!
2b8b0 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
2b8c0 0a 20 20 61 73 73 65 72 74 28 20 28 70 43 75 72  .  assert( (pCur
2b8d0 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 28 42 54  ->curFlags & (BT
2b8e0 43 46 5f 41 74 4c 61 73 74 7c 42 54 43 46 5f 56  CF_AtLast|BTCF_V
2b8f0 61 6c 69 64 4f 76 66 6c 7c 42 54 43 46 5f 56 61  alidOvfl|BTCF_Va
2b900 6c 69 64 4e 4b 65 79 29 29 3d 3d 30 20 29 3b 0a  lidNKey))==0 );.
2b910 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2b920 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 3b  info.nSize==0 );
2b930 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74  .  if( pCur->eSt
2b940 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate!=CURSOR_VALI
2b950 44 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 72 65  D ){.    rc = re
2b960 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74  storeCursorPosit
2b970 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 20 20 69  ion(pCur);.    i
2b980 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2b990 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
2b9a0 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69   rc;.    }.    i
2b9b0 66 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  f( CURSOR_INVALI
2b9c0 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20  D==pCur->eState 
2b9d0 29 7b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d  ){.      *pRes =
2b9e0 20 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   1;.      return
2b9f0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
2ba00 7d 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e  }.    if( pCur->
2ba10 73 6b 69 70 4e 65 78 74 20 29 7b 0a 20 20 20 20  skipNext ){.    
2ba20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2ba30 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
2ba40 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e 65 53  ALID || pCur->eS
2ba50 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 53 4b 49  tate==CURSOR_SKI
2ba60 50 4e 45 58 54 20 29 3b 0a 20 20 20 20 20 20 70  PNEXT );.      p
2ba70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
2ba80 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 20 20  RSOR_VALID;.    
2ba90 20 20 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70    if( pCur->skip
2baa0 4e 65 78 74 3c 30 20 29 7b 0a 20 20 20 20 20 20  Next<0 ){.      
2bab0 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74    pCur->skipNext
2bac0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 65   = 0;.        re
2bad0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2bae0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 43        }.      pC
2baf0 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30  ur->skipNext = 0
2bb00 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70  ;.    }.  }..  p
2bb10 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50  Page = pCur->apP
2bb20 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
2bb30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
2bb40 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 69  e->isInit );.  i
2bb50 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  f( !pPage->leaf 
2bb60 29 7b 0a 20 20 20 20 69 6e 74 20 69 64 78 20 3d  ){.    int idx =
2bb70 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
2bb80 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20 72  r->iPage];.    r
2bb90 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28  c = moveToChild(
2bba0 70 43 75 72 2c 20 67 65 74 34 62 79 74 65 28 66  pCur, get4byte(f
2bbb0 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69  indCell(pPage, i
2bbc0 64 78 29 29 29 3b 0a 20 20 20 20 69 66 28 20 72  dx)));.    if( r
2bbd0 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
2bbe0 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 69     rc = moveToRi
2bbf0 67 68 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20  ghtmost(pCur);. 
2bc00 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68 69 6c   }else{.    whil
2bc10 65 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70  e( pCur->aiIdx[p
2bc20 43 75 72 2d 3e 69 50 61 67 65 5d 3d 3d 30 20 29  Cur->iPage]==0 )
2bc30 7b 0a 20 20 20 20 20 20 69 66 28 20 70 43 75 72  {.      if( pCur
2bc40 2d 3e 69 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20  ->iPage==0 ){.  
2bc50 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61        pCur->eSta
2bc60 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41  te = CURSOR_INVA
2bc70 4c 49 44 3b 0a 20 20 20 20 20 20 20 20 2a 70 52  LID;.        *pR
2bc80 65 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  es = 1;.        
2bc90 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2bca0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2bcb0 6d 6f 76 65 54 6f 50 61 72 65 6e 74 28 70 43 75  moveToParent(pCu
2bcc0 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  r);.    }.    as
2bcd0 73 65 72 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f  sert( pCur->info
2bce0 2e 6e 53 69 7a 65 3d 3d 30 20 29 3b 0a 20 20 20  .nSize==0 );.   
2bcf0 20 61 73 73 65 72 74 28 20 28 70 43 75 72 2d 3e   assert( (pCur->
2bd00 63 75 72 46 6c 61 67 73 20 26 20 28 42 54 43 46  curFlags & (BTCF
2bd10 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f  _ValidNKey|BTCF_
2bd20 56 61 6c 69 64 4f 76 66 6c 29 29 3d 3d 30 20 29  ValidOvfl))==0 )
2bd30 3b 0a 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49  ;..    pCur->aiI
2bd40 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  dx[pCur->iPage]-
2bd50 2d 3b 0a 20 20 20 20 70 50 61 67 65 20 3d 20 70  -;.    pPage = p
2bd60 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
2bd70 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20 69 66  ->iPage];.    if
2bd80 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20  ( pPage->intKey 
2bd90 26 26 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  && !pPage->leaf 
2bda0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
2bdb0 6c 69 74 65 33 42 74 72 65 65 50 72 65 76 69 6f  lite3BtreePrevio
2bdc0 75 73 28 70 43 75 72 2c 20 70 52 65 73 29 3b 0a  us(pCur, pRes);.
2bdd0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2bde0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2bdf0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
2be00 75 72 6e 20 72 63 3b 0a 7d 0a 69 6e 74 20 73 71  urn rc;.}.int sq
2be10 6c 69 74 65 33 42 74 72 65 65 50 72 65 76 69 6f  lite3BtreePrevio
2be20 75 73 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  us(BtCursor *pCu
2be30 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20  r, int *pRes){. 
2be40 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
2be50 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
2be60 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 52 65  );.  assert( pRe
2be70 73 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  s!=0 );.  assert
2be80 28 20 2a 70 52 65 73 3d 3d 30 20 7c 7c 20 2a 70  ( *pRes==0 || *p
2be90 52 65 73 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65  Res==1 );.  asse
2bea0 72 74 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65  rt( pCur->skipNe
2beb0 78 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 65  xt==0 || pCur->e
2bec0 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41  State!=CURSOR_VA
2bed0 4c 49 44 20 29 3b 0a 20 20 2a 70 52 65 73 20 3d  LID );.  *pRes =
2bee0 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72 46   0;.  pCur->curF
2bef0 6c 61 67 73 20 26 3d 20 7e 28 42 54 43 46 5f 41  lags &= ~(BTCF_A
2bf00 74 4c 61 73 74 7c 42 54 43 46 5f 56 61 6c 69 64  tLast|BTCF_Valid
2bf10 4f 76 66 6c 7c 42 54 43 46 5f 56 61 6c 69 64 4e  Ovfl|BTCF_ValidN
2bf20 4b 65 79 29 3b 0a 20 20 70 43 75 72 2d 3e 69 6e  Key);.  pCur->in
2bf30 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20  fo.nSize = 0;.  
2bf40 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  if( pCur->eState
2bf50 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 0a 20  !=CURSOR_VALID. 
2bf60 20 20 7c 7c 20 70 43 75 72 2d 3e 61 69 49 64 78    || pCur->aiIdx
2bf70 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3d 3d 30  [pCur->iPage]==0
2bf80 0a 20 20 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50  .   || pCur->apP
2bf90 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
2bfa0 2d 3e 6c 65 61 66 3d 3d 30 0a 20 20 29 7b 0a 20  ->leaf==0.  ){. 
2bfb0 20 20 20 72 65 74 75 72 6e 20 62 74 72 65 65 50     return btreeP
2bfc0 72 65 76 69 6f 75 73 28 70 43 75 72 2c 20 70 52  revious(pCur, pR
2bfd0 65 73 29 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d  es);.  }.  pCur-
2bfe0 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
2bff0 67 65 5d 2d 2d 3b 0a 20 20 72 65 74 75 72 6e 20  ge]--;.  return 
2c000 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
2c010 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e  .** Allocate a n
2c020 65 77 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65  ew page from the
2c030 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
2c040 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 77 20 70 61  **.** The new pa
2c050 67 65 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20  ge is marked as 
2c060 64 69 72 74 79 2e 20 20 28 49 6e 20 6f 74 68 65  dirty.  (In othe
2c070 72 20 77 6f 72 64 73 2c 20 73 71 6c 69 74 65 33  r words, sqlite3
2c080 50 61 67 65 72 57 72 69 74 65 28 29 0a 2a 2a 20  PagerWrite().** 
2c090 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
2c0a0 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 6e   called on the n
2c0b0 65 77 20 70 61 67 65 2e 29 20 20 54 68 65 20 6e  ew page.)  The n
2c0c0 65 77 20 70 61 67 65 20 68 61 73 20 61 6c 73 6f  ew page has also
2c0d0 0a 2a 2a 20 62 65 65 6e 20 72 65 66 65 72 65 6e  .** been referen
2c0e0 63 65 64 20 61 6e 64 20 74 68 65 20 63 61 6c 6c  ced and the call
2c0f0 69 6e 67 20 72 6f 75 74 69 6e 65 20 69 73 20 72  ing routine is r
2c100 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 63  esponsible for c
2c110 61 6c 6c 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65  alling.** sqlite
2c120 33 50 61 67 65 72 55 6e 72 65 66 28 29 20 6f 6e  3PagerUnref() on
2c130 20 74 68 65 20 6e 65 77 20 70 61 67 65 20 77 68   the new page wh
2c140 65 6e 20 69 74 20 69 73 20 64 6f 6e 65 2e 0a 2a  en it is done..*
2c150 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69  *.** SQLITE_OK i
2c160 73 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75  s returned on su
2c170 63 63 65 73 73 2e 20 20 41 6e 79 20 6f 74 68 65  ccess.  Any othe
2c180 72 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69  r return value i
2c190 6e 64 69 63 61 74 65 73 0a 2a 2a 20 61 6e 20 65  ndicates.** an e
2c1a0 72 72 6f 72 2e 20 20 2a 70 70 50 61 67 65 20 61  rror.  *ppPage a
2c1b0 6e 64 20 2a 70 50 67 6e 6f 20 61 72 65 20 75 6e  nd *pPgno are un
2c1c0 64 65 66 69 6e 65 64 20 69 6e 20 74 68 65 20 65  defined in the e
2c1d0 76 65 6e 74 20 6f 66 20 61 6e 20 65 72 72 6f 72  vent of an error
2c1e0 2e 0a 2a 2a 20 44 6f 20 6e 6f 74 20 69 6e 76 6f  ..** Do not invo
2c1f0 6b 65 20 73 71 6c 69 74 65 33 50 61 67 65 72 55  ke sqlite3PagerU
2c200 6e 72 65 66 28 29 20 6f 6e 20 2a 70 70 50 61 67  nref() on *ppPag
2c210 65 20 69 66 20 61 6e 20 65 72 72 6f 72 20 69 73  e if an error is
2c220 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a   returned..**.**
2c230 20 49 66 20 74 68 65 20 22 6e 65 61 72 62 79 22   If the "nearby"
2c240 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f   parameter is no
2c250 74 20 30 2c 20 74 68 65 6e 20 61 6e 20 65 66 66  t 0, then an eff
2c260 6f 72 74 20 69 73 20 6d 61 64 65 20 74 6f 20 0a  ort is made to .
2c270 2a 2a 20 6c 6f 63 61 74 65 20 61 20 70 61 67 65  ** locate a page
2c280 20 63 6c 6f 73 65 20 74 6f 20 74 68 65 20 70 61   close to the pa
2c290 67 65 20 6e 75 6d 62 65 72 20 22 6e 65 61 72 62  ge number "nearb
2c2a0 79 22 2e 20 20 54 68 69 73 20 63 61 6e 20 62 65  y".  This can be
2c2b0 20 75 73 65 64 20 69 6e 20 61 6e 0a 2a 2a 20 61   used in an.** a
2c2c0 74 74 65 6d 70 74 20 74 6f 20 6b 65 65 70 20 72  ttempt to keep r
2c2d0 65 6c 61 74 65 64 20 70 61 67 65 73 20 63 6c 6f  elated pages clo
2c2e0 73 65 20 74 6f 20 65 61 63 68 20 6f 74 68 65 72  se to each other
2c2f0 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
2c300 20 66 69 6c 65 2c 0a 2a 2a 20 77 68 69 63 68 20   file,.** which 
2c310 69 6e 20 74 75 72 6e 20 63 61 6e 20 6d 61 6b 65  in turn can make
2c320 20 64 61 74 61 62 61 73 65 20 61 63 63 65 73 73   database access
2c330 20 66 61 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49   faster..**.** I
2c340 66 20 74 68 65 20 65 4d 6f 64 65 20 70 61 72 61  f the eMode para
2c350 6d 65 74 65 72 20 69 73 20 42 54 41 4c 4c 4f 43  meter is BTALLOC
2c360 5f 45 58 41 43 54 20 61 6e 64 20 74 68 65 20 6e  _EXACT and the n
2c370 65 61 72 62 79 20 70 61 67 65 20 65 78 69 73 74  earby page exist
2c380 73 0a 2a 2a 20 61 6e 79 77 68 65 72 65 20 6f 6e  s.** anywhere on
2c390 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 20   the free-list, 
2c3a0 74 68 65 6e 20 69 74 20 69 73 20 67 75 61 72 61  then it is guara
2c3b0 6e 74 65 65 64 20 74 6f 20 62 65 20 72 65 74 75  nteed to be retu
2c3c0 72 6e 65 64 2e 20 20 49 66 0a 2a 2a 20 65 4d 6f  rned.  If.** eMo
2c3d0 64 65 20 69 73 20 42 54 41 4c 4c 4f 43 5f 4c 54  de is BTALLOC_LT
2c3e0 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 72   then the page r
2c3f0 65 74 75 72 6e 65 64 20 77 69 6c 6c 20 62 65 20  eturned will be 
2c400 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75  less than or equ
2c410 61 6c 0a 2a 2a 20 74 6f 20 6e 65 61 72 62 79 20  al.** to nearby 
2c420 69 66 20 61 6e 79 20 73 75 63 68 20 70 61 67 65  if any such page
2c430 20 65 78 69 73 74 73 2e 20 20 49 66 20 65 4d 6f   exists.  If eMo
2c440 64 65 20 69 73 20 42 54 41 4c 4c 4f 43 5f 41 4e  de is BTALLOC_AN
2c450 59 20 74 68 65 6e 20 74 68 65 72 65 0a 2a 2a 20  Y then there.** 
2c460 61 72 65 20 6e 6f 20 72 65 73 74 72 69 63 74 69  are no restricti
2c470 6f 6e 73 20 6f 6e 20 77 68 69 63 68 20 70 61 67  ons on which pag
2c480 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  e is returned..*
2c490 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c  /.static int all
2c4a0 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28 0a  ocateBtreePage(.
2c4b0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c    BtShared *pBt,
2c4c0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
2c4d0 62 74 72 65 65 20 2a 2f 0a 20 20 4d 65 6d 50 61  btree */.  MemPa
2c4e0 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20  ge **ppPage,    
2c4f0 20 20 2f 2a 20 53 74 6f 72 65 20 70 6f 69 6e 74    /* Store point
2c500 65 72 20 74 6f 20 74 68 65 20 61 6c 6c 6f 63 61  er to the alloca
2c510 74 65 64 20 70 61 67 65 20 68 65 72 65 20 2a 2f  ted page here */
2c520 0a 20 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 2c 20  .  Pgno *pPgno, 
2c530 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 6f            /* Sto
2c540 72 65 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  re the page numb
2c550 65 72 20 68 65 72 65 20 2a 2f 0a 20 20 50 67 6e  er here */.  Pgn
2c560 6f 20 6e 65 61 72 62 79 2c 20 20 20 20 20 20 20  o nearby,       
2c570 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f      /* Search fo
2c580 72 20 61 20 70 61 67 65 20 6e 65 61 72 20 74 68  r a page near th
2c590 69 73 20 6f 6e 65 20 2a 2f 0a 20 20 75 38 20 65  is one */.  u8 e
2c5a0 4d 6f 64 65 20 20 20 20 20 20 20 20 20 20 20 20  Mode            
2c5b0 20 20 20 2f 2a 20 42 54 41 4c 4c 4f 43 5f 45 58     /* BTALLOC_EX
2c5c0 41 43 54 2c 20 42 54 41 4c 4c 4f 43 5f 4c 54 2c  ACT, BTALLOC_LT,
2c5d0 20 6f 72 20 42 54 41 4c 4c 4f 43 5f 41 4e 59 20   or BTALLOC_ANY 
2c5e0 2a 2f 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20  */.){.  MemPage 
2c5f0 2a 70 50 61 67 65 31 3b 0a 20 20 69 6e 74 20 72  *pPage1;.  int r
2c600 63 3b 0a 20 20 75 33 32 20 6e 3b 20 20 20 20 20  c;.  u32 n;     
2c610 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
2c620 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69  es on the freeli
2c630 73 74 20 2a 2f 0a 20 20 75 33 32 20 6b 3b 20 20  st */.  u32 k;  
2c640 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2c650 6c 65 61 76 65 73 20 6f 6e 20 74 68 65 20 74 72  leaves on the tr
2c660 75 6e 6b 20 6f 66 20 74 68 65 20 66 72 65 65 6c  unk of the freel
2c670 69 73 74 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  ist */.  MemPage
2c680 20 2a 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20   *pTrunk = 0;.  
2c690 4d 65 6d 50 61 67 65 20 2a 70 50 72 65 76 54 72  MemPage *pPrevTr
2c6a0 75 6e 6b 20 3d 20 30 3b 0a 20 20 50 67 6e 6f 20  unk = 0;.  Pgno 
2c6b0 6d 78 50 61 67 65 3b 20 20 20 20 20 2f 2a 20 54  mxPage;     /* T
2c6c0 6f 74 61 6c 20 73 69 7a 65 20 6f 66 20 74 68 65  otal size of the
2c6d0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
2c6e0 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  /..  assert( sql
2c6f0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
2c700 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
2c710 20 61 73 73 65 72 74 28 20 65 4d 6f 64 65 3d 3d   assert( eMode==
2c720 42 54 41 4c 4c 4f 43 5f 41 4e 59 20 7c 7c 20 28  BTALLOC_ANY || (
2c730 6e 65 61 72 62 79 3e 30 20 26 26 20 49 66 4e 6f  nearby>0 && IfNo
2c740 74 4f 6d 69 74 41 56 28 70 42 74 2d 3e 61 75 74  tOmitAV(pBt->aut
2c750 6f 56 61 63 75 75 6d 29 29 20 29 3b 0a 20 20 70  oVacuum)) );.  p
2c760 50 61 67 65 31 20 3d 20 70 42 74 2d 3e 70 50 61  Page1 = pBt->pPa
2c770 67 65 31 3b 0a 20 20 6d 78 50 61 67 65 20 3d 20  ge1;.  mxPage = 
2c780 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70  btreePagecount(p
2c790 42 74 29 3b 0a 20 20 2f 2a 20 45 56 49 44 45 4e  Bt);.  /* EVIDEN
2c7a0 43 45 2d 4f 46 3a 20 52 2d 30 35 31 31 39 2d 30  CE-OF: R-05119-0
2c7b0 32 36 33 37 20 54 68 65 20 34 2d 62 79 74 65 20  2637 The 4-byte 
2c7c0 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67  big-endian integ
2c7d0 65 72 20 61 74 20 6f 66 66 73 65 74 20 33 36 0a  er at offset 36.
2c7e0 20 20 2a 2a 20 73 74 6f 72 65 73 20 73 74 6f 72    ** stores stor
2c7f0 65 73 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d  es the total num
2c800 62 65 72 20 6f 66 20 70 61 67 65 73 20 6f 6e 20  ber of pages on 
2c810 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20 2a 2f  the freelist. */
2c820 0a 20 20 6e 20 3d 20 67 65 74 34 62 79 74 65 28  .  n = get4byte(
2c830 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
2c840 36 5d 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  6]);.  testcase(
2c850 20 6e 3d 3d 6d 78 50 61 67 65 2d 31 20 29 3b 0a   n==mxPage-1 );.
2c860 20 20 69 66 28 20 6e 3e 3d 6d 78 50 61 67 65 20    if( n>=mxPage 
2c870 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
2c880 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
2c890 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 3e 30  T;.  }.  if( n>0
2c8a0 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72 65   ){.    /* There
2c8b0 20 61 72 65 20 70 61 67 65 73 20 6f 6e 20 74 68   are pages on th
2c8c0 65 20 66 72 65 65 6c 69 73 74 2e 20 20 52 65 75  e freelist.  Reu
2c8d0 73 65 20 6f 6e 65 20 6f 66 20 74 68 6f 73 65 20  se one of those 
2c8e0 70 61 67 65 73 2e 20 2a 2f 0a 20 20 20 20 50 67  pages. */.    Pg
2c8f0 6e 6f 20 69 54 72 75 6e 6b 3b 0a 20 20 20 20 75  no iTrunk;.    u
2c900 38 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30  8 searchList = 0
2c910 3b 20 2f 2a 20 49 66 20 74 68 65 20 66 72 65 65  ; /* If the free
2c920 2d 6c 69 73 74 20 6d 75 73 74 20 62 65 20 73 65  -list must be se
2c930 61 72 63 68 65 64 20 66 6f 72 20 27 6e 65 61 72  arched for 'near
2c940 62 79 27 20 2a 2f 0a 20 20 20 20 0a 20 20 20 20  by' */.    .    
2c950 2f 2a 20 49 66 20 65 4d 6f 64 65 3d 3d 42 54 41  /* If eMode==BTA
2c960 4c 4c 4f 43 5f 45 58 41 43 54 20 61 6e 64 20 61  LLOC_EXACT and a
2c970 20 71 75 65 72 79 20 6f 66 20 74 68 65 20 70 6f   query of the po
2c980 69 6e 74 65 72 2d 6d 61 70 0a 20 20 20 20 2a 2a  inter-map.    **
2c990 20 73 68 6f 77 73 20 74 68 61 74 20 74 68 65 20   shows that the 
2c9a0 70 61 67 65 20 27 6e 65 61 72 62 79 27 20 69 73  page 'nearby' is
2c9b0 20 73 6f 6d 65 77 68 65 72 65 20 6f 6e 20 74 68   somewhere on th
2c9c0 65 20 66 72 65 65 2d 6c 69 73 74 2c 20 74 68 65  e free-list, the
2c9d0 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 65 6e 74  n.    ** the ent
2c9e0 69 72 65 2d 6c 69 73 74 20 77 69 6c 6c 20 62 65  ire-list will be
2c9f0 20 73 65 61 72 63 68 65 64 20 66 6f 72 20 74 68   searched for th
2ca00 61 74 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a  at page..    */.
2ca10 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2ca20 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
2ca30 20 20 20 69 66 28 20 65 4d 6f 64 65 3d 3d 42 54     if( eMode==BT
2ca40 41 4c 4c 4f 43 5f 45 58 41 43 54 20 29 7b 0a 20  ALLOC_EXACT ){. 
2ca50 20 20 20 20 20 69 66 28 20 6e 65 61 72 62 79 3c       if( nearby<
2ca60 3d 6d 78 50 61 67 65 20 29 7b 0a 20 20 20 20 20  =mxPage ){.     
2ca70 20 20 20 75 38 20 65 54 79 70 65 3b 0a 20 20 20     u8 eType;.   
2ca80 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 65 61       assert( nea
2ca90 72 62 79 3e 30 20 29 3b 0a 20 20 20 20 20 20 20  rby>0 );.       
2caa0 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 61 75   assert( pBt->au
2cab0 74 6f 56 61 63 75 75 6d 20 29 3b 0a 20 20 20 20  toVacuum );.    
2cac0 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47      rc = ptrmapG
2cad0 65 74 28 70 42 74 2c 20 6e 65 61 72 62 79 2c 20  et(pBt, nearby, 
2cae0 26 65 54 79 70 65 2c 20 30 29 3b 0a 20 20 20 20  &eType, 0);.    
2caf0 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
2cb00 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
2cb10 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41  if( eType==PTRMA
2cb20 50 5f 46 52 45 45 50 41 47 45 20 29 7b 0a 20 20  P_FREEPAGE ){.  
2cb30 20 20 20 20 20 20 20 20 73 65 61 72 63 68 4c 69          searchLi
2cb40 73 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  st = 1;.        
2cb50 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  }.      }.    }e
2cb60 6c 73 65 20 69 66 28 20 65 4d 6f 64 65 3d 3d 42  lse if( eMode==B
2cb70 54 41 4c 4c 4f 43 5f 4c 45 20 29 7b 0a 20 20 20  TALLOC_LE ){.   
2cb80 20 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20     searchList = 
2cb90 31 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  1;.    }.#endif.
2cba0 0a 20 20 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e  .    /* Decremen
2cbb0 74 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  t the free-list 
2cbc0 63 6f 75 6e 74 20 62 79 20 31 2e 20 53 65 74 20  count by 1. Set 
2cbd0 69 54 72 75 6e 6b 20 74 6f 20 74 68 65 20 69 6e  iTrunk to the in
2cbe0 64 65 78 20 6f 66 20 74 68 65 0a 20 20 20 20 2a  dex of the.    *
2cbf0 2a 20 66 69 72 73 74 20 66 72 65 65 2d 6c 69 73  * first free-lis
2cc00 74 20 74 72 75 6e 6b 20 70 61 67 65 2e 20 69 50  t trunk page. iP
2cc10 72 65 76 54 72 75 6e 6b 20 69 73 20 69 6e 69 74  revTrunk is init
2cc20 69 61 6c 6c 79 20 31 2e 0a 20 20 20 20 2a 2f 0a  ially 1..    */.
2cc30 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2cc40 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65  PagerWrite(pPage
2cc50 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  1->pDbPage);.   
2cc60 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
2cc70 20 72 63 3b 0a 20 20 20 20 70 75 74 34 62 79 74   rc;.    put4byt
2cc80 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  e(&pPage1->aData
2cc90 5b 33 36 5d 2c 20 6e 2d 31 29 3b 0a 0a 20 20 20  [36], n-1);..   
2cca0 20 2f 2a 20 54 68 65 20 63 6f 64 65 20 77 69 74   /* The code wit
2ccb0 68 69 6e 20 74 68 69 73 20 6c 6f 6f 70 20 69 73  hin this loop is
2ccc0 20 72 75 6e 20 6f 6e 6c 79 20 6f 6e 63 65 20 69   run only once i
2ccd0 66 20 74 68 65 20 27 73 65 61 72 63 68 4c 69 73  f the 'searchLis
2cce0 74 27 20 76 61 72 69 61 62 6c 65 0a 20 20 20 20  t' variable.    
2ccf0 2a 2a 20 69 73 20 6e 6f 74 20 74 72 75 65 2e 20  ** is not true. 
2cd00 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 72 75  Otherwise, it ru
2cd10 6e 73 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68  ns once for each
2cd20 20 74 72 75 6e 6b 2d 70 61 67 65 20 6f 6e 20 74   trunk-page on t
2cd30 68 65 0a 20 20 20 20 2a 2a 20 66 72 65 65 2d 6c  he.    ** free-l
2cd40 69 73 74 20 75 6e 74 69 6c 20 74 68 65 20 70 61  ist until the pa
2cd50 67 65 20 27 6e 65 61 72 62 79 27 20 69 73 20 6c  ge 'nearby' is l
2cd60 6f 63 61 74 65 64 20 28 65 4d 6f 64 65 3d 3d 42  ocated (eMode==B
2cd70 54 41 4c 4c 4f 43 5f 45 58 41 43 54 29 0a 20 20  TALLOC_EXACT).  
2cd80 20 20 2a 2a 20 6f 72 20 75 6e 74 69 6c 20 61 20    ** or until a 
2cd90 70 61 67 65 20 6c 65 73 73 20 74 68 61 6e 20 27  page less than '
2cda0 6e 65 61 72 62 79 27 20 69 73 20 6c 6f 63 61 74  nearby' is locat
2cdb0 65 64 20 28 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c  ed (eMode==BTALL
2cdc0 4f 43 5f 4c 54 29 0a 20 20 20 20 2a 2f 0a 20 20  OC_LT).    */.  
2cdd0 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 70 50 72    do {.      pPr
2cde0 65 76 54 72 75 6e 6b 20 3d 20 70 54 72 75 6e 6b  evTrunk = pTrunk
2cdf0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 72 65  ;.      if( pPre
2ce00 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20  vTrunk ){.      
2ce10 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
2ce20 3a 20 52 2d 30 31 35 30 36 2d 31 31 30 35 33 20  : R-01506-11053 
2ce30 54 68 65 20 66 69 72 73 74 20 69 6e 74 65 67 65  The first intege
2ce40 72 20 6f 6e 20 61 20 66 72 65 65 6c 69 73 74 20  r on a freelist 
2ce50 74 72 75 6e 6b 20 70 61 67 65 0a 20 20 20 20 20  trunk page.     
2ce60 20 20 20 2a 2a 20 69 73 20 74 68 65 20 70 61 67     ** is the pag
2ce70 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  e number of the 
2ce80 6e 65 78 74 20 66 72 65 65 6c 69 73 74 20 74 72  next freelist tr
2ce90 75 6e 6b 20 70 61 67 65 20 69 6e 20 74 68 65 20  unk page in the 
2cea0 6c 69 73 74 20 6f 72 0a 20 20 20 20 20 20 20 20  list or.        
2ceb0 2a 2a 20 7a 65 72 6f 20 69 66 20 74 68 69 73 20  ** zero if this 
2cec0 69 73 20 74 68 65 20 6c 61 73 74 20 66 72 65 65  is the last free
2ced0 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 2e  list trunk page.
2cee0 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 54 72 75   */.        iTru
2cef0 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  nk = get4byte(&p
2cf00 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61  PrevTrunk->aData
2cf10 5b 30 5d 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  [0]);.      }els
2cf20 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 56  e{.        /* EV
2cf30 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 39 38  IDENCE-OF: R-598
2cf40 34 31 2d 31 33 37 39 38 20 54 68 65 20 34 2d 62  41-13798 The 4-b
2cf50 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69  yte big-endian i
2cf60 6e 74 65 67 65 72 20 61 74 20 6f 66 66 73 65 74  nteger at offset
2cf70 20 33 32 0a 20 20 20 20 20 20 20 20 2a 2a 20 73   32.        ** s
2cf80 74 6f 72 65 73 20 74 68 65 20 70 61 67 65 20 6e  tores the page n
2cf90 75 6d 62 65 72 20 6f 66 20 74 68 65 20 66 69 72  umber of the fir
2cfa0 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 66  st page of the f
2cfb0 72 65 65 6c 69 73 74 2c 20 6f 72 20 7a 65 72 6f  reelist, or zero
2cfc0 20 69 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 74   if.        ** t
2cfd0 68 65 20 66 72 65 65 6c 69 73 74 20 69 73 20 65  he freelist is e
2cfe0 6d 70 74 79 2e 20 2a 2f 0a 20 20 20 20 20 20 20  mpty. */.       
2cff0 20 69 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79   iTrunk = get4by
2d000 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
2d010 61 5b 33 32 5d 29 3b 0a 20 20 20 20 20 20 7d 0a  a[32]);.      }.
2d020 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
2d030 69 54 72 75 6e 6b 3d 3d 6d 78 50 61 67 65 20 29  iTrunk==mxPage )
2d040 3b 0a 20 20 20 20 20 20 69 66 28 20 69 54 72 75  ;.      if( iTru
2d050 6e 6b 3e 6d 78 50 61 67 65 20 29 7b 0a 20 20 20  nk>mxPage ){.   
2d060 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
2d070 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
2d080 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2d090 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65      rc = btreeGe
2d0a0 74 50 61 67 65 28 70 42 74 2c 20 69 54 72 75 6e  tPage(pBt, iTrun
2d0b0 6b 2c 20 26 70 54 72 75 6e 6b 2c 20 30 29 3b 0a  k, &pTrunk, 0);.
2d0c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
2d0d0 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
2d0e0 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20  pTrunk = 0;.    
2d0f0 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c      goto end_all
2d100 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20  ocate_page;.    
2d110 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74    }.      assert
2d120 28 20 70 54 72 75 6e 6b 21 3d 30 20 29 3b 0a 20  ( pTrunk!=0 );. 
2d130 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 72       assert( pTr
2d140 75 6e 6b 2d 3e 61 44 61 74 61 21 3d 30 20 29 3b  unk->aData!=0 );
2d150 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  .      /* EVIDEN
2d160 43 45 2d 4f 46 3a 20 52 2d 31 33 35 32 33 2d 30  CE-OF: R-13523-0
2d170 34 33 39 34 20 54 68 65 20 73 65 63 6f 6e 64 20  4394 The second 
2d180 69 6e 74 65 67 65 72 20 6f 6e 20 61 20 66 72 65  integer on a fre
2d190 65 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65  elist trunk page
2d1a0 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 74 68 65  .      ** is the
2d1b0 20 6e 75 6d 62 65 72 20 6f 66 20 6c 65 61 66 20   number of leaf 
2d1c0 70 61 67 65 20 70 6f 69 6e 74 65 72 73 20 74 6f  page pointers to
2d1d0 20 66 6f 6c 6c 6f 77 2e 20 2a 2f 0a 20 20 20 20   follow. */.    
2d1e0 20 20 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26    k = get4byte(&
2d1f0 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d  pTrunk->aData[4]
2d200 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6b 3d 3d  );.      if( k==
2d210 30 20 26 26 20 21 73 65 61 72 63 68 4c 69 73 74  0 && !searchList
2d220 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   ){.        /* T
2d230 68 65 20 74 72 75 6e 6b 20 68 61 73 20 6e 6f 20  he trunk has no 
2d240 6c 65 61 76 65 73 20 61 6e 64 20 74 68 65 20 6c  leaves and the l
2d250 69 73 74 20 69 73 20 6e 6f 74 20 62 65 69 6e 67  ist is not being
2d260 20 73 65 61 72 63 68 65 64 2e 20 0a 20 20 20 20   searched. .    
2d270 20 20 20 20 2a 2a 20 53 6f 20 65 78 74 72 61 63      ** So extrac
2d280 74 20 74 68 65 20 74 72 75 6e 6b 20 70 61 67 65  t the trunk page
2d290 20 69 74 73 65 6c 66 20 61 6e 64 20 75 73 65 20   itself and use 
2d2a0 69 74 20 61 73 20 74 68 65 20 6e 65 77 6c 79 20  it as the newly 
2d2b0 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 6c 6f  .        ** allo
2d2c0 63 61 74 65 64 20 70 61 67 65 20 2a 2f 0a 20 20  cated page */.  
2d2d0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
2d2e0 72 65 76 54 72 75 6e 6b 3d 3d 30 20 29 3b 0a 20  revTrunk==0 );. 
2d2f0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
2d300 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 54  te3PagerWrite(pT
2d310 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a  runk->pDbPage);.
2d320 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
2d330 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  {.          goto
2d340 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
2d350 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ge;.        }.  
2d360 20 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 69        *pPgno = i
2d370 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 6d  Trunk;.        m
2d380 65 6d 63 70 79 28 26 70 50 61 67 65 31 2d 3e 61  emcpy(&pPage1->a
2d390 44 61 74 61 5b 33 32 5d 2c 20 26 70 54 72 75 6e  Data[32], &pTrun
2d3a0 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b  k->aData[0], 4);
2d3b0 0a 20 20 20 20 20 20 20 20 2a 70 70 50 61 67 65  .        *ppPage
2d3c0 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20   = pTrunk;.     
2d3d0 20 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20     pTrunk = 0;. 
2d3e0 20 20 20 20 20 20 20 54 52 41 43 45 28 28 22 41         TRACE(("A
2d3f0 4c 4c 4f 43 41 54 45 3a 20 25 64 20 74 72 75 6e  LLOCATE: %d trun
2d400 6b 20 2d 20 25 64 20 66 72 65 65 20 70 61 67 65  k - %d free page
2d410 73 20 6c 65 66 74 5c 6e 22 2c 20 2a 70 50 67 6e  s left\n", *pPgn
2d420 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20 20 20 20 20  o, n-1));.      
2d430 7d 65 6c 73 65 20 69 66 28 20 6b 3e 28 75 33 32  }else if( k>(u32
2d440 29 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  )(pBt->usableSiz
2d450 65 2f 34 20 2d 20 32 29 20 29 7b 0a 20 20 20 20  e/4 - 2) ){.    
2d460 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20      /* Value of 
2d470 6b 20 69 73 20 6f 75 74 20 6f 66 20 72 61 6e 67  k is out of rang
2d480 65 2e 20 20 44 61 74 61 62 61 73 65 20 63 6f 72  e.  Database cor
2d490 72 75 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20  ruption */.     
2d4a0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
2d4b0 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
2d4c0 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c       goto end_al
2d4d0 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 23 69 66  locate_page;.#if
2d4e0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
2d4f0 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
2d500 20 20 7d 65 6c 73 65 20 69 66 28 20 73 65 61 72    }else if( sear
2d510 63 68 4c 69 73 74 20 0a 20 20 20 20 20 20 20 20  chList .        
2d520 20 20 20 20 26 26 20 28 6e 65 61 72 62 79 3d 3d      && (nearby==
2d530 69 54 72 75 6e 6b 20 7c 7c 20 28 69 54 72 75 6e  iTrunk || (iTrun
2d540 6b 3c 6e 65 61 72 62 79 20 26 26 20 65 4d 6f 64  k<nearby && eMod
2d550 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45 29 29 20  e==BTALLOC_LE)) 
2d560 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20  .      ){.      
2d570 20 20 2f 2a 20 54 68 65 20 6c 69 73 74 20 69 73    /* The list is
2d580 20 62 65 69 6e 67 20 73 65 61 72 63 68 65 64 20   being searched 
2d590 61 6e 64 20 74 68 69 73 20 74 72 75 6e 6b 20 70  and this trunk p
2d5a0 61 67 65 20 69 73 20 74 68 65 20 70 61 67 65 0a  age is the page.
2d5b0 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 61 6c          ** to al
2d5c0 6c 6f 63 61 74 65 2c 20 72 65 67 61 72 64 6c 65  locate, regardle
2d5d0 73 73 20 6f 66 20 77 68 65 74 68 65 72 20 69 74  ss of whether it
2d5e0 20 68 61 73 20 6c 65 61 76 65 73 2e 0a 20 20 20   has leaves..   
2d5f0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
2d600 2a 70 50 67 6e 6f 20 3d 20 69 54 72 75 6e 6b 3b  *pPgno = iTrunk;
2d610 0a 20 20 20 20 20 20 20 20 2a 70 70 50 61 67 65  .        *ppPage
2d620 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20   = pTrunk;.     
2d630 20 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20     searchList = 
2d640 30 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  0;.        rc = 
2d650 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
2d660 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67  e(pTrunk->pDbPag
2d670 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  e);.        if( 
2d680 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rc ){.          
2d690 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
2d6a0 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20  e_page;.        
2d6b0 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6b 3d  }.        if( k=
2d6c0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
2d6d0 69 66 28 20 21 70 50 72 65 76 54 72 75 6e 6b 20  if( !pPrevTrunk 
2d6e0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d  ){.            m
2d6f0 65 6d 63 70 79 28 26 70 50 61 67 65 31 2d 3e 61  emcpy(&pPage1->a
2d700 44 61 74 61 5b 33 32 5d 2c 20 26 70 54 72 75 6e  Data[32], &pTrun
2d710 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b  k->aData[0], 4);
2d720 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
2d730 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  {.            rc
2d740 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
2d750 72 69 74 65 28 70 50 72 65 76 54 72 75 6e 6b 2d  rite(pPrevTrunk-
2d760 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
2d770 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
2d780 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2d790 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
2d7a0 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65  nd_allocate_page
2d7b0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
2d7c0 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63              memc
2d7d0 70 79 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e  py(&pPrevTrunk->
2d7e0 61 44 61 74 61 5b 30 5d 2c 20 26 70 54 72 75 6e  aData[0], &pTrun
2d7f0 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b  k->aData[0], 4);
2d800 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2d810 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2d820 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 72 75        /* The tru
2d830 6e 6b 20 70 61 67 65 20 69 73 20 72 65 71 75 69  nk page is requi
2d840 72 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65  red by the calle
2d850 72 20 62 75 74 20 69 74 20 63 6f 6e 74 61 69 6e  r but it contain
2d860 73 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  s .          ** 
2d870 70 6f 69 6e 74 65 72 73 20 74 6f 20 66 72 65 65  pointers to free
2d880 2d 6c 69 73 74 20 6c 65 61 76 65 73 2e 20 54 68  -list leaves. Th
2d890 65 20 66 69 72 73 74 20 6c 65 61 66 20 62 65 63  e first leaf bec
2d8a0 6f 6d 65 73 20 61 20 74 72 75 6e 6b 0a 20 20 20  omes a trunk.   
2d8b0 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20 69         ** page i
2d8c0 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 20 20 20  n this case..   
2d8d0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
2d8e0 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65      MemPage *pNe
2d8f0 77 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20  wTrunk;.        
2d900 20 20 50 67 6e 6f 20 69 4e 65 77 54 72 75 6e 6b    Pgno iNewTrunk
2d910 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 54 72   = get4byte(&pTr
2d920 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d 29 3b 0a  unk->aData[8]);.
2d930 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 4e            if( iN
2d940 65 77 54 72 75 6e 6b 3e 6d 78 50 61 67 65 20 29  ewTrunk>mxPage )
2d950 7b 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  { .            r
2d960 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
2d970 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20  PT_BKPT;.       
2d980 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c       goto end_al
2d990 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20  locate_page;.   
2d9a0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2d9b0 20 20 20 74 65 73 74 63 61 73 65 28 20 69 4e 65     testcase( iNe
2d9c0 77 54 72 75 6e 6b 3d 3d 6d 78 50 61 67 65 20 29  wTrunk==mxPage )
2d9d0 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
2d9e0 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42   btreeGetPage(pB
2d9f0 74 2c 20 69 4e 65 77 54 72 75 6e 6b 2c 20 26 70  t, iNewTrunk, &p
2da00 4e 65 77 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20  NewTrunk, 0);.  
2da10 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
2da20 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2da30 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
2da40 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b  d_allocate_page;
2da50 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2da60 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
2da70 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 4e  te3PagerWrite(pN
2da80 65 77 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65  ewTrunk->pDbPage
2da90 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
2daa0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2dab0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  {.            re
2dac0 6c 65 61 73 65 50 61 67 65 28 70 4e 65 77 54 72  leasePage(pNewTr
2dad0 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20  unk);.          
2dae0 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63    goto end_alloc
2daf0 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20  ate_page;.      
2db00 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2db10 6d 65 6d 63 70 79 28 26 70 4e 65 77 54 72 75 6e  memcpy(&pNewTrun
2db20 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 26 70 54  k->aData[0], &pT
2db30 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20  runk->aData[0], 
2db40 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 75  4);.          pu
2db50 74 34 62 79 74 65 28 26 70 4e 65 77 54 72 75 6e  t4byte(&pNewTrun
2db60 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 6b 2d 31  k->aData[4], k-1
2db70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d  );.          mem
2db80 63 70 79 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e  cpy(&pNewTrunk->
2db90 61 44 61 74 61 5b 38 5d 2c 20 26 70 54 72 75 6e  aData[8], &pTrun
2dba0 6b 2d 3e 61 44 61 74 61 5b 31 32 5d 2c 20 28 6b  k->aData[12], (k
2dbb0 2d 31 29 2a 34 29 3b 0a 20 20 20 20 20 20 20 20  -1)*4);.        
2dbc0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4e    releasePage(pN
2dbd0 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20  ewTrunk);.      
2dbe0 20 20 20 20 69 66 28 20 21 70 50 72 65 76 54 72      if( !pPrevTr
2dbf0 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  unk ){.         
2dc00 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
2dc10 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
2dc20 6c 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61  le(pPage1->pDbPa
2dc30 67 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ge) );.         
2dc40 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61     put4byte(&pPa
2dc50 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20  ge1->aData[32], 
2dc60 69 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20  iNewTrunk);.    
2dc70 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2dc80 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
2dc90 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
2dca0 70 50 72 65 76 54 72 75 6e 6b 2d 3e 70 44 62 50  pPrevTrunk->pDbP
2dcb0 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
2dcc0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
2dcd0 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
2dce0 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65  nd_allocate_page
2dcf0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
2dd00 20 20 20 20 20 20 20 20 20 20 20 20 70 75 74 34              put4
2dd10 62 79 74 65 28 26 70 50 72 65 76 54 72 75 6e 6b  byte(&pPrevTrunk
2dd20 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 69 4e 65 77  ->aData[0], iNew
2dd30 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20  Trunk);.        
2dd40 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
2dd50 20 20 20 20 20 20 70 54 72 75 6e 6b 20 3d 20 30        pTrunk = 0
2dd60 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43 45 28  ;.        TRACE(
2dd70 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 74  ("ALLOCATE: %d t
2dd80 72 75 6e 6b 20 2d 20 25 64 20 66 72 65 65 20 70  runk - %d free p
2dd90 61 67 65 73 20 6c 65 66 74 5c 6e 22 2c 20 2a 70  ages left\n", *p
2dda0 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 23 65 6e  Pgno, n-1));.#en
2ddb0 64 69 66 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  dif.      }else 
2ddc0 69 66 28 20 6b 3e 30 20 29 7b 0a 20 20 20 20 20  if( k>0 ){.     
2ddd0 20 20 20 2f 2a 20 45 78 74 72 61 63 74 20 61 20     /* Extract a 
2dde0 6c 65 61 66 20 66 72 6f 6d 20 74 68 65 20 74 72  leaf from the tr
2ddf0 75 6e 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20 75  unk */.        u
2de00 33 32 20 63 6c 6f 73 65 73 74 3b 0a 20 20 20 20  32 closest;.    
2de10 20 20 20 20 50 67 6e 6f 20 69 50 61 67 65 3b 0a      Pgno iPage;.
2de20 20 20 20 20 20 20 20 20 75 6e 73 69 67 6e 65 64          unsigned
2de30 20 63 68 61 72 20 2a 61 44 61 74 61 20 3d 20 70   char *aData = p
2de40 54 72 75 6e 6b 2d 3e 61 44 61 74 61 3b 0a 20 20  Trunk->aData;.  
2de50 20 20 20 20 20 20 69 66 28 20 6e 65 61 72 62 79        if( nearby
2de60 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  >0 ){.          
2de70 75 33 32 20 69 3b 0a 20 20 20 20 20 20 20 20 20  u32 i;.         
2de80 20 63 6c 6f 73 65 73 74 20 3d 20 30 3b 0a 20 20   closest = 0;.  
2de90 20 20 20 20 20 20 20 20 69 66 28 20 65 4d 6f 64          if( eMod
2dea0 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45 20 29 7b  e==BTALLOC_LE ){
2deb0 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72  .            for
2dec0 28 69 3d 30 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b  (i=0; i<k; i++){
2ded0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
2dee0 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28  Page = get4byte(
2def0 26 61 44 61 74 61 5b 38 2b 69 2a 34 5d 29 3b 0a  &aData[8+i*4]);.
2df00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
2df10 28 20 69 50 61 67 65 3c 3d 6e 65 61 72 62 79 20  ( iPage<=nearby 
2df20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
2df30 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 69 3b 0a     closest = i;.
2df40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2df50 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
2df60 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2df70 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
2df80 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
2df90 20 20 69 6e 74 20 64 69 73 74 3b 0a 20 20 20 20    int dist;.    
2dfa0 20 20 20 20 20 20 20 20 64 69 73 74 20 3d 20 73          dist = s
2dfb0 71 6c 69 74 65 33 41 62 73 49 6e 74 33 32 28 67  qlite3AbsInt32(g
2dfc0 65 74 34 62 79 74 65 28 26 61 44 61 74 61 5b 38  et4byte(&aData[8
2dfd0 5d 29 20 2d 20 6e 65 61 72 62 79 29 3b 0a 20 20  ]) - nearby);.  
2dfe0 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d            for(i=
2dff0 31 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20  1; i<k; i++){.  
2e000 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
2e010 64 32 20 3d 20 73 71 6c 69 74 65 33 41 62 73 49  d2 = sqlite3AbsI
2e020 6e 74 33 32 28 67 65 74 34 62 79 74 65 28 26 61  nt32(get4byte(&a
2e030 44 61 74 61 5b 38 2b 69 2a 34 5d 29 20 2d 20 6e  Data[8+i*4]) - n
2e040 65 61 72 62 79 29 3b 0a 20 20 20 20 20 20 20 20  earby);.        
2e050 20 20 20 20 20 20 69 66 28 20 64 32 3c 64 69 73        if( d2<dis
2e060 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  t ){.           
2e070 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 69       closest = i
2e080 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
2e090 20 20 64 69 73 74 20 3d 20 64 32 3b 0a 20 20 20    dist = d2;.   
2e0a0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
2e0b0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2e0c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
2e0d0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
2e0e0 63 6c 6f 73 65 73 74 20 3d 20 30 3b 0a 20 20 20  closest = 0;.   
2e0f0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
2e100 69 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65  iPage = get4byte
2e110 28 26 61 44 61 74 61 5b 38 2b 63 6c 6f 73 65 73  (&aData[8+closes
2e120 74 2a 34 5d 29 3b 0a 20 20 20 20 20 20 20 20 74  t*4]);.        t
2e130 65 73 74 63 61 73 65 28 20 69 50 61 67 65 3d 3d  estcase( iPage==
2e140 6d 78 50 61 67 65 20 29 3b 0a 20 20 20 20 20 20  mxPage );.      
2e150 20 20 69 66 28 20 69 50 61 67 65 3e 6d 78 50 61    if( iPage>mxPa
2e160 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ge ){.          
2e170 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
2e180 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
2e190 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c      goto end_all
2e1a0 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20  ocate_page;.    
2e1b0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 74 65      }.        te
2e1c0 73 74 63 61 73 65 28 20 69 50 61 67 65 3d 3d 6d  stcase( iPage==m
2e1d0 78 50 61 67 65 20 29 3b 0a 20 20 20 20 20 20 20  xPage );.       
2e1e0 20 69 66 28 20 21 73 65 61 72 63 68 4c 69 73 74   if( !searchList
2e1f0 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 28 69   .         || (i
2e200 50 61 67 65 3d 3d 6e 65 61 72 62 79 20 7c 7c 20  Page==nearby || 
2e210 28 69 50 61 67 65 3c 6e 65 61 72 62 79 20 26 26  (iPage<nearby &&
2e220 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f   eMode==BTALLOC_
2e230 4c 45 29 29 20 0a 20 20 20 20 20 20 20 20 29 7b  LE)) .        ){
2e240 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e  .          int n
2e250 6f 43 6f 6e 74 65 6e 74 3b 0a 20 20 20 20 20 20  oContent;.      
2e260 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 69 50 61      *pPgno = iPa
2e270 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 54 52  ge;.          TR
2e280 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20  ACE(("ALLOCATE: 
2e290 25 64 20 77 61 73 20 6c 65 61 66 20 25 64 20 6f  %d was leaf %d o
2e2a0 66 20 25 64 20 6f 6e 20 74 72 75 6e 6b 20 25 64  f %d on trunk %d
2e2b0 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ".              
2e2c0 20 20 20 22 3a 20 25 64 20 6d 6f 72 65 20 66 72     ": %d more fr
2e2d0 65 65 20 70 61 67 65 73 5c 6e 22 2c 0a 20 20 20  ee pages\n",.   
2e2e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 70                *p
2e2f0 50 67 6e 6f 2c 20 63 6c 6f 73 65 73 74 2b 31 2c  Pgno, closest+1,
2e300 20 6b 2c 20 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f   k, pTrunk->pgno
2e310 2c 20 6e 2d 31 29 29 3b 0a 20 20 20 20 20 20 20  , n-1));.       
2e320 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
2e330 61 67 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b  agerWrite(pTrunk
2e340 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
2e350 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 67        if( rc ) g
2e360 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65  oto end_allocate
2e370 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20  _page;.         
2e380 20 69 66 28 20 63 6c 6f 73 65 73 74 3c 6b 2d 31   if( closest<k-1
2e390 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2e3a0 6d 65 6d 63 70 79 28 26 61 44 61 74 61 5b 38 2b  memcpy(&aData[8+
2e3b0 63 6c 6f 73 65 73 74 2a 34 5d 2c 20 26 61 44 61  closest*4], &aDa
2e3c0 74 61 5b 34 2b 6b 2a 34 5d 2c 20 34 29 3b 0a 20  ta[4+k*4], 4);. 
2e3d0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2e3e0 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 61       put4byte(&a
2e3f0 44 61 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b 0a 20  Data[4], k-1);. 
2e400 20 20 20 20 20 20 20 20 20 6e 6f 43 6f 6e 74 65           noConte
2e410 6e 74 20 3d 20 21 62 74 72 65 65 47 65 74 48 61  nt = !btreeGetHa
2e420 73 43 6f 6e 74 65 6e 74 28 70 42 74 2c 20 2a 70  sContent(pBt, *p
2e430 50 67 6e 6f 29 3f 20 50 41 47 45 52 5f 47 45 54  Pgno)? PAGER_GET
2e440 5f 4e 4f 43 4f 4e 54 45 4e 54 20 3a 20 30 3b 0a  _NOCONTENT : 0;.
2e450 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 62            rc = b
2e460 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
2e470 20 2a 70 50 67 6e 6f 2c 20 70 70 50 61 67 65 2c   *pPgno, ppPage,
2e480 20 6e 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 20   noContent);.   
2e490 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
2e4a0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2e4b0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
2e4c0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 28  ite3PagerWrite((
2e4d0 2a 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61 67  *ppPage)->pDbPag
2e4e0 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
2e4f0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2e500 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
2e510 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a     releasePage(*
2e520 70 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  ppPage);.       
2e530 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2e540 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73 65 61   }.          sea
2e550 72 63 68 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20  rchList = 0;.   
2e560 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
2e570 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
2e580 28 70 50 72 65 76 54 72 75 6e 6b 29 3b 0a 20 20  (pPrevTrunk);.  
2e590 20 20 20 20 70 50 72 65 76 54 72 75 6e 6b 20 3d      pPrevTrunk =
2e5a0 20 30 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20   0;.    }while( 
2e5b0 73 65 61 72 63 68 4c 69 73 74 20 29 3b 0a 20 20  searchList );.  
2e5c0 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68  }else{.    /* Th
2e5d0 65 72 65 20 61 72 65 20 6e 6f 20 70 61 67 65 73  ere are no pages
2e5e0 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74   on the freelist
2e5f0 2c 20 73 6f 20 61 70 70 65 6e 64 20 61 20 6e 65  , so append a ne
2e600 77 20 70 61 67 65 20 74 6f 20 74 68 65 0a 20 20  w page to the.  
2e610 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69 6d    ** database im
2e620 61 67 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  age..    **.    
2e630 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 6e 65 77  ** Normally, new
2e640 20 70 61 67 65 73 20 61 6c 6c 6f 63 61 74 65 64   pages allocated
2e650 20 62 79 20 74 68 69 73 20 62 6c 6f 63 6b 20 63   by this block c
2e660 61 6e 20 62 65 20 72 65 71 75 65 73 74 65 64 20  an be requested 
2e670 66 72 6f 6d 20 74 68 65 0a 20 20 20 20 2a 2a 20  from the.    ** 
2e680 70 61 67 65 72 20 6c 61 79 65 72 20 77 69 74 68  pager layer with
2e690 20 74 68 65 20 27 6e 6f 2d 63 6f 6e 74 65 6e 74   the 'no-content
2e6a0 27 20 66 6c 61 67 20 73 65 74 2e 20 54 68 69 73  ' flag set. This
2e6b0 20 70 72 65 76 65 6e 74 73 20 74 68 65 20 70 61   prevents the pa
2e6c0 67 65 72 0a 20 20 20 20 2a 2a 20 66 72 6f 6d 20  ger.    ** from 
2e6d0 74 72 79 69 6e 67 20 74 6f 20 72 65 61 64 20 74  trying to read t
2e6e0 68 65 20 70 61 67 65 73 20 63 6f 6e 74 65 6e 74  he pages content
2e6f0 20 66 72 6f 6d 20 64 69 73 6b 2e 20 48 6f 77 65   from disk. Howe
2e700 76 65 72 2c 20 69 66 20 74 68 65 0a 20 20 20 20  ver, if the.    
2e710 2a 2a 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73  ** current trans
2e720 61 63 74 69 6f 6e 20 68 61 73 20 61 6c 72 65 61  action has alrea
2e730 64 79 20 72 75 6e 20 6f 6e 65 20 6f 72 20 6d 6f  dy run one or mo
2e740 72 65 20 69 6e 63 72 65 6d 65 6e 74 61 6c 2d 76  re incremental-v
2e750 61 63 75 75 6d 0a 20 20 20 20 2a 2a 20 73 74 65  acuum.    ** ste
2e760 70 73 2c 20 74 68 65 6e 20 74 68 65 20 70 61 67  ps, then the pag
2e770 65 20 77 65 20 61 72 65 20 61 62 6f 75 74 20 74  e we are about t
2e780 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 61 79 20 63  o allocate may c
2e790 6f 6e 74 61 69 6e 20 63 6f 6e 74 65 6e 74 0a 20  ontain content. 
2e7a0 20 20 20 2a 2a 20 74 68 61 74 20 69 73 20 72 65     ** that is re
2e7b0 71 75 69 72 65 64 20 69 6e 20 74 68 65 20 65 76  quired in the ev
2e7c0 65 6e 74 20 6f 66 20 61 20 72 6f 6c 6c 62 61 63  ent of a rollbac
2e7d0 6b 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c  k. In this case,
2e7e0 20 64 6f 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 73   do.    ** not s
2e7f0 65 74 20 74 68 65 20 6e 6f 2d 63 6f 6e 74 65 6e  et the no-conten
2e800 74 20 66 6c 61 67 2e 20 54 68 69 73 20 63 61 75  t flag. This cau
2e810 73 65 73 20 74 68 65 20 70 61 67 65 72 20 74 6f  ses the pager to
2e820 20 6c 6f 61 64 20 61 6e 64 20 6a 6f 75 72 6e 61   load and journa
2e830 6c 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 75 72  l.    ** the cur
2e840 72 65 6e 74 20 70 61 67 65 20 63 6f 6e 74 65 6e  rent page conten
2e850 74 20 62 65 66 6f 72 65 20 6f 76 65 72 77 72 69  t before overwri
2e860 74 69 6e 67 20 69 74 2e 0a 20 20 20 20 2a 2a 0a  ting it..    **.
2e870 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74      ** Note that
2e880 20 74 68 65 20 70 61 67 65 72 20 77 69 6c 6c 20   the pager will 
2e890 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 61 74 74  not actually att
2e8a0 65 6d 70 74 20 74 6f 20 6c 6f 61 64 20 6f 72 20  empt to load or 
2e8b0 6a 6f 75 72 6e 61 6c 20 0a 20 20 20 20 2a 2a 20  journal .    ** 
2e8c0 63 6f 6e 74 65 6e 74 20 66 6f 72 20 61 6e 79 20  content for any 
2e8d0 70 61 67 65 20 74 68 61 74 20 72 65 61 6c 6c 79  page that really
2e8e0 20 64 6f 65 73 20 6c 69 65 20 70 61 73 74 20 74   does lie past t
2e8f0 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 64 61  he end of the da
2e900 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 66 69  tabase.    ** fi
2e910 6c 65 20 6f 6e 20 64 69 73 6b 2e 20 53 6f 20 74  le on disk. So t
2e920 68 65 20 65 66 66 65 63 74 73 20 6f 66 20 64 69  he effects of di
2e930 73 61 62 6c 69 6e 67 20 74 68 65 20 6e 6f 2d 63  sabling the no-c
2e940 6f 6e 74 65 6e 74 20 6f 70 74 69 6d 69 7a 61 74  ontent optimizat
2e950 69 6f 6e 0a 20 20 20 20 2a 2a 20 68 65 72 65 20  ion.    ** here 
2e960 61 72 65 20 63 6f 6e 66 69 6e 65 64 20 74 6f 20  are confined to 
2e970 74 68 6f 73 65 20 70 61 67 65 73 20 74 68 61 74  those pages that
2e980 20 6c 69 65 20 62 65 74 77 65 65 6e 20 74 68 65   lie between the
2e990 20 65 6e 64 20 6f 66 20 74 68 65 0a 20 20 20 20   end of the.    
2e9a0 2a 2a 20 64 61 74 61 62 61 73 65 20 69 6d 61 67  ** database imag
2e9b0 65 20 61 6e 64 20 74 68 65 20 65 6e 64 20 6f 66  e and the end of
2e9c0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2e9d0 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  le..    */.    i
2e9e0 6e 74 20 62 4e 6f 43 6f 6e 74 65 6e 74 20 3d 20  nt bNoContent = 
2e9f0 28 30 3d 3d 49 66 4e 6f 74 4f 6d 69 74 41 56 28  (0==IfNotOmitAV(
2ea00 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65  pBt->bDoTruncate
2ea10 29 29 3f 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f  ))? PAGER_GET_NO
2ea20 43 4f 4e 54 45 4e 54 3a 30 3b 0a 0a 20 20 20 20  CONTENT:0;..    
2ea30 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
2ea40 72 57 72 69 74 65 28 70 42 74 2d 3e 70 50 61 67  rWrite(pBt->pPag
2ea50 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  e1->pDbPage);.  
2ea60 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
2ea70 6e 20 72 63 3b 0a 20 20 20 20 70 42 74 2d 3e 6e  n rc;.    pBt->n
2ea80 50 61 67 65 2b 2b 3b 0a 20 20 20 20 69 66 28 20  Page++;.    if( 
2ea90 70 42 74 2d 3e 6e 50 61 67 65 3d 3d 50 45 4e 44  pBt->nPage==PEND
2eaa0 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
2eab0 74 29 20 29 20 70 42 74 2d 3e 6e 50 61 67 65 2b  t) ) pBt->nPage+
2eac0 2b 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  +;..#ifndef SQLI
2ead0 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
2eae0 55 4d 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e  UM.    if( pBt->
2eaf0 61 75 74 6f 56 61 63 75 75 6d 20 26 26 20 50 54  autoVacuum && PT
2eb00 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c  RMAP_ISPAGE(pBt,
2eb10 20 70 42 74 2d 3e 6e 50 61 67 65 29 20 29 7b 0a   pBt->nPage) ){.
2eb20 20 20 20 20 20 20 2f 2a 20 49 66 20 2a 70 50 67        /* If *pPg
2eb30 6e 6f 20 72 65 66 65 72 73 20 74 6f 20 61 20 70  no refers to a p
2eb40 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 2c  ointer-map page,
2eb50 20 61 6c 6c 6f 63 61 74 65 20 74 77 6f 20 6e 65   allocate two ne
2eb60 77 20 70 61 67 65 73 0a 20 20 20 20 20 20 2a 2a  w pages.      **
2eb70 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
2eb80 68 65 20 66 69 6c 65 20 69 6e 73 74 65 61 64 20  he file instead 
2eb90 6f 66 20 6f 6e 65 2e 20 54 68 65 20 66 69 72 73  of one. The firs
2eba0 74 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65  t allocated page
2ebb0 0a 20 20 20 20 20 20 2a 2a 20 62 65 63 6f 6d 65  .      ** become
2ebc0 73 20 61 20 6e 65 77 20 70 6f 69 6e 74 65 72 2d  s a new pointer-
2ebd0 6d 61 70 20 70 61 67 65 2c 20 74 68 65 20 73 65  map page, the se
2ebe0 63 6f 6e 64 20 69 73 20 75 73 65 64 20 62 79 20  cond is used by 
2ebf0 74 68 65 20 63 61 6c 6c 65 72 2e 0a 20 20 20 20  the caller..    
2ec00 20 20 2a 2f 0a 20 20 20 20 20 20 4d 65 6d 50 61    */.      MemPa
2ec10 67 65 20 2a 70 50 67 20 3d 20 30 3b 0a 20 20 20  ge *pPg = 0;.   
2ec20 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43     TRACE(("ALLOC
2ec30 41 54 45 3a 20 25 64 20 66 72 6f 6d 20 65 6e 64  ATE: %d from end
2ec40 20 6f 66 20 66 69 6c 65 20 28 70 6f 69 6e 74 65   of file (pointe
2ec50 72 2d 6d 61 70 20 70 61 67 65 29 5c 6e 22 2c 20  r-map page)\n", 
2ec60 70 42 74 2d 3e 6e 50 61 67 65 29 29 3b 0a 20 20  pBt->nPage));.  
2ec70 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
2ec80 3e 6e 50 61 67 65 21 3d 50 45 4e 44 49 4e 47 5f  >nPage!=PENDING_
2ec90 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
2eca0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 62 74 72  ;.      rc = btr
2ecb0 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 70  eeGetPage(pBt, p
2ecc0 42 74 2d 3e 6e 50 61 67 65 2c 20 26 70 50 67 2c  Bt->nPage, &pPg,
2ecd0 20 62 4e 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20 20   bNoContent);.  
2ece0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2ecf0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
2ed00 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
2ed10 65 72 57 72 69 74 65 28 70 50 67 2d 3e 70 44 62  erWrite(pPg->pDb
2ed20 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 72  Page);.        r
2ed30 65 6c 65 61 73 65 50 61 67 65 28 70 50 67 29 3b  eleasePage(pPg);
2ed40 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
2ed50 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
2ed60 63 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 50  c;.      pBt->nP
2ed70 61 67 65 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28  age++;.      if(
2ed80 20 70 42 74 2d 3e 6e 50 61 67 65 3d 3d 50 45 4e   pBt->nPage==PEN
2ed90 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
2eda0 42 74 29 20 29 7b 20 70 42 74 2d 3e 6e 50 61 67  Bt) ){ pBt->nPag
2edb0 65 2b 2b 3b 20 7d 0a 20 20 20 20 7d 0a 23 65 6e  e++; }.    }.#en
2edc0 64 69 66 0a 20 20 20 20 70 75 74 34 62 79 74 65  dif.    put4byte
2edd0 28 32 38 20 2b 20 28 75 38 2a 29 70 42 74 2d 3e  (28 + (u8*)pBt->
2ede0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 2c 20 70  pPage1->aData, p
2edf0 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20  Bt->nPage);.    
2ee00 2a 70 50 67 6e 6f 20 3d 20 70 42 74 2d 3e 6e 50  *pPgno = pBt->nP
2ee10 61 67 65 3b 0a 0a 20 20 20 20 61 73 73 65 72 74  age;..    assert
2ee20 28 20 2a 70 50 67 6e 6f 21 3d 50 45 4e 44 49 4e  ( *pPgno!=PENDIN
2ee30 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
2ee40 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 62 74 72   );.    rc = btr
2ee50 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 2a  eeGetPage(pBt, *
2ee60 70 50 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 62  pPgno, ppPage, b
2ee70 4e 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 20 20  NoContent);.    
2ee80 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
2ee90 72 63 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  rc;.    rc = sql
2eea0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 28  ite3PagerWrite((
2eeb0 2a 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61 67  *ppPage)->pDbPag
2eec0 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  e);.    if( rc!=
2eed0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2eee0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a     releasePage(*
2eef0 70 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20  ppPage);.    }. 
2ef00 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43     TRACE(("ALLOC
2ef10 41 54 45 3a 20 25 64 20 66 72 6f 6d 20 65 6e 64  ATE: %d from end
2ef20 20 6f 66 20 66 69 6c 65 5c 6e 22 2c 20 2a 70 50   of file\n", *pP
2ef30 67 6e 6f 29 29 3b 0a 20 20 7d 0a 0a 20 20 61 73  gno));.  }..  as
2ef40 73 65 72 74 28 20 2a 70 50 67 6e 6f 21 3d 50 45  sert( *pPgno!=PE
2ef50 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
2ef60 70 42 74 29 20 29 3b 0a 0a 65 6e 64 5f 61 6c 6c  pBt) );..end_all
2ef70 6f 63 61 74 65 5f 70 61 67 65 3a 0a 20 20 72 65  ocate_page:.  re
2ef80 6c 65 61 73 65 50 61 67 65 28 70 54 72 75 6e 6b  leasePage(pTrunk
2ef90 29 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65  );.  releasePage
2efa0 28 70 50 72 65 76 54 72 75 6e 6b 29 3b 0a 20 20  (pPrevTrunk);.  
2efb0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2efc0 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c  K ){.    if( sql
2efd0 69 74 65 33 50 61 67 65 72 50 61 67 65 52 65 66  ite3PagerPageRef
2efe0 63 6f 75 6e 74 28 28 2a 70 70 50 61 67 65 29 2d  count((*ppPage)-
2eff0 3e 70 44 62 50 61 67 65 29 3e 31 20 29 7b 0a 20  >pDbPage)>1 ){. 
2f000 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
2f010 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20 20  (*ppPage);.     
2f020 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20   *ppPage = 0;.  
2f030 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2f040 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
2f050 20 20 20 20 7d 0a 20 20 20 20 28 2a 70 70 50 61      }.    (*ppPa
2f060 67 65 29 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b  ge)->isInit = 0;
2f070 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70  .  }else{.    *p
2f080 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 7d 0a 20  pPage = 0;.  }. 
2f090 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
2f0a0 49 54 45 5f 4f 4b 20 7c 7c 20 73 71 6c 69 74 65  ITE_OK || sqlite
2f0b0 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
2f0c0 65 28 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62  e((*ppPage)->pDb
2f0d0 50 61 67 65 29 20 29 3b 0a 20 20 72 65 74 75 72  Page) );.  retur
2f0e0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
2f0f0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
2f100 75 73 65 64 20 74 6f 20 61 64 64 20 70 61 67 65  used to add page
2f110 20 69 50 61 67 65 20 74 6f 20 74 68 65 20 64 61   iPage to the da
2f120 74 61 62 61 73 65 20 66 69 6c 65 20 66 72 65 65  tabase file free
2f130 2d 6c 69 73 74 2e 20 0a 2a 2a 20 49 74 20 69 73  -list. .** It is
2f140 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68   assumed that th
2f150 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c  e page is not al
2f160 72 65 61 64 79 20 61 20 70 61 72 74 20 6f 66 20  ready a part of 
2f170 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 0a 2a  the free-list..*
2f180 2a 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 70  *.** The value p
2f190 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
2f1a0 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  ond argument to 
2f1b0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
2f1c0 20 6f 70 74 69 6f 6e 61 6c 2e 0a 2a 2a 20 49 66   optional..** If
2f1d0 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61 70 70   the caller happ
2f1e0 65 6e 73 20 74 6f 20 68 61 76 65 20 61 20 70 6f  ens to have a po
2f1f0 69 6e 74 65 72 20 74 6f 20 74 68 65 20 4d 65 6d  inter to the Mem
2f200 50 61 67 65 20 6f 62 6a 65 63 74 20 0a 2a 2a 20  Page object .** 
2f210 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f  corresponding to
2f220 20 70 61 67 65 20 69 50 61 67 65 20 68 61 6e 64   page iPage hand
2f230 79 2c 20 69 74 20 6d 61 79 20 70 61 73 73 20 69  y, it may pass i
2f240 74 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  t as the second 
2f250 76 61 6c 75 65 2e 20 0a 2a 2a 20 4f 74 68 65 72  value. .** Other
2f260 77 69 73 65 2c 20 69 74 20 6d 61 79 20 70 61 73  wise, it may pas
2f270 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66  s NULL..**.** If
2f280 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
2f290 4d 65 6d 50 61 67 65 20 6f 62 6a 65 63 74 20 69  MemPage object i
2f2a0 73 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  s passed as the 
2f2b0 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c  second argument,
2f2c0 0a 2a 2a 20 69 74 73 20 72 65 66 65 72 65 6e 63  .** its referenc
2f2d0 65 20 63 6f 75 6e 74 20 69 73 20 6e 6f 74 20 61  e count is not a
2f2e0 6c 74 65 72 65 64 20 62 79 20 74 68 69 73 20 66  ltered by this f
2f2f0 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  unction..*/.stat
2f300 69 63 20 69 6e 74 20 66 72 65 65 50 61 67 65 32  ic int freePage2
2f310 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
2f320 4d 65 6d 50 61 67 65 20 2a 70 4d 65 6d 50 61 67  MemPage *pMemPag
2f330 65 2c 20 50 67 6e 6f 20 69 50 61 67 65 29 7b 0a  e, Pgno iPage){.
2f340 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 72 75 6e    MemPage *pTrun
2f350 6b 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  k = 0;          
2f360 20 20 20 20 20 20 2f 2a 20 46 72 65 65 2d 6c 69        /* Free-li
2f370 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f  st trunk page */
2f380 0a 20 20 50 67 6e 6f 20 69 54 72 75 6e 6b 20 3d  .  Pgno iTrunk =
2f390 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
2f3a0 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e         /* Page n
2f3b0 75 6d 62 65 72 20 6f 66 20 66 72 65 65 2d 6c 69  umber of free-li
2f3c0 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f  st trunk page */
2f3d0 20 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61   .  MemPage *pPa
2f3e0 67 65 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65  ge1 = pBt->pPage
2f3f0 31 3b 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c  1;      /* Local
2f400 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 70 61   reference to pa
2f410 67 65 20 31 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  ge 1 */.  MemPag
2f420 65 20 2a 70 50 61 67 65 3b 20 20 20 20 20 20 20  e *pPage;       
2f430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2f440 20 50 61 67 65 20 62 65 69 6e 67 20 66 72 65 65   Page being free
2f450 64 2e 20 4d 61 79 20 62 65 20 4e 55 4c 4c 2e 20  d. May be NULL. 
2f460 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  */.  int rc;    
2f470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f480 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
2f490 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  rn Code */.  int
2f4a0 20 6e 46 72 65 65 3b 20 20 20 20 20 20 20 20 20   nFree;         
2f4b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f4c0 20 2f 2a 20 49 6e 69 74 69 61 6c 20 6e 75 6d 62   /* Initial numb
2f4d0 65 72 20 6f 66 20 70 61 67 65 73 20 6f 6e 20 66  er of pages on f
2f4e0 72 65 65 2d 6c 69 73 74 20 2a 2f 0a 0a 20 20 61  ree-list */..  a
2f4f0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
2f500 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
2f510 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
2f520 74 28 20 69 50 61 67 65 3e 31 20 29 3b 0a 20 20  t( iPage>1 );.  
2f530 61 73 73 65 72 74 28 20 21 70 4d 65 6d 50 61 67  assert( !pMemPag
2f540 65 20 7c 7c 20 70 4d 65 6d 50 61 67 65 2d 3e 70  e || pMemPage->p
2f550 67 6e 6f 3d 3d 69 50 61 67 65 20 29 3b 0a 0a 20  gno==iPage );.. 
2f560 20 69 66 28 20 70 4d 65 6d 50 61 67 65 20 29 7b   if( pMemPage ){
2f570 0a 20 20 20 20 70 50 61 67 65 20 3d 20 70 4d 65  .    pPage = pMe
2f580 6d 50 61 67 65 3b 0a 20 20 20 20 73 71 6c 69 74  mPage;.    sqlit
2f590 65 33 50 61 67 65 72 52 65 66 28 70 50 61 67 65  e3PagerRef(pPage
2f5a0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 65  ->pDbPage);.  }e
2f5b0 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65 20 3d  lse{.    pPage =
2f5c0 20 62 74 72 65 65 50 61 67 65 4c 6f 6f 6b 75 70   btreePageLookup
2f5d0 28 70 42 74 2c 20 69 50 61 67 65 29 3b 0a 20 20  (pBt, iPage);.  
2f5e0 7d 0a 0a 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e  }..  /* Incremen
2f5f0 74 20 74 68 65 20 66 72 65 65 20 70 61 67 65 20  t the free page 
2f600 63 6f 75 6e 74 20 6f 6e 20 70 50 61 67 65 31 20  count on pPage1 
2f610 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  */.  rc = sqlite
2f620 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67  3PagerWrite(pPag
2f630 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  e1->pDbPage);.  
2f640 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 66 72  if( rc ) goto fr
2f650 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 6e 46  eepage_out;.  nF
2f660 72 65 65 20 3d 20 67 65 74 34 62 79 74 65 28 26  ree = get4byte(&
2f670 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36  pPage1->aData[36
2f680 5d 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26  ]);.  put4byte(&
2f690 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36  pPage1->aData[36
2f6a0 5d 2c 20 6e 46 72 65 65 2b 31 29 3b 0a 0a 20 20  ], nFree+1);..  
2f6b0 69 66 28 20 70 42 74 2d 3e 62 74 73 46 6c 61 67  if( pBt->btsFlag
2f6c0 73 20 26 20 42 54 53 5f 53 45 43 55 52 45 5f 44  s & BTS_SECURE_D
2f6d0 45 4c 45 54 45 20 29 7b 0a 20 20 20 20 2f 2a 20  ELETE ){.    /* 
2f6e0 49 66 20 74 68 65 20 73 65 63 75 72 65 5f 64 65  If the secure_de
2f6f0 6c 65 74 65 20 6f 70 74 69 6f 6e 20 69 73 20 65  lete option is e
2f700 6e 61 62 6c 65 64 2c 20 74 68 65 6e 0a 20 20 20  nabled, then.   
2f710 20 2a 2a 20 61 6c 77 61 79 73 20 66 75 6c 6c 79   ** always fully
2f720 20 6f 76 65 72 77 72 69 74 65 20 64 65 6c 65 74   overwrite delet
2f730 65 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77  ed information w
2f740 69 74 68 20 7a 65 72 6f 73 2e 0a 20 20 20 20 2a  ith zeros..    *
2f750 2f 0a 20 20 20 20 69 66 28 20 28 21 70 50 61 67  /.    if( (!pPag
2f760 65 20 26 26 20 28 28 72 63 20 3d 20 62 74 72 65  e && ((rc = btre
2f770 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 50  eGetPage(pBt, iP
2f780 61 67 65 2c 20 26 70 50 61 67 65 2c 20 30 29 29  age, &pPage, 0))
2f790 21 3d 30 29 20 29 0a 20 20 20 20 20 7c 7c 20 20  !=0) ).     ||  
2f7a0 20 20 20 20 20 20 20 20 20 20 28 28 72 63 20 3d            ((rc =
2f7b0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
2f7c0 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  te(pPage->pDbPag
2f7d0 65 29 29 21 3d 30 29 0a 20 20 20 20 29 7b 0a 20  e))!=0).    ){. 
2f7e0 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61       goto freepa
2f7f0 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20  ge_out;.    }.  
2f800 20 20 6d 65 6d 73 65 74 28 70 50 61 67 65 2d 3e    memset(pPage->
2f810 61 44 61 74 61 2c 20 30 2c 20 70 50 61 67 65 2d  aData, 0, pPage-
2f820 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b  >pBt->pageSize);
2f830 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
2f840 65 20 64 61 74 61 62 61 73 65 20 73 75 70 70 6f  e database suppo
2f850 72 74 73 20 61 75 74 6f 2d 76 61 63 75 75 6d 2c  rts auto-vacuum,
2f860 20 77 72 69 74 65 20 61 6e 20 65 6e 74 72 79 20   write an entry 
2f870 69 6e 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d  in the pointer-m
2f880 61 70 0a 20 20 2a 2a 20 74 6f 20 69 6e 64 69 63  ap.  ** to indic
2f890 61 74 65 20 74 68 61 74 20 74 68 65 20 70 61 67  ate that the pag
2f8a0 65 20 69 73 20 66 72 65 65 2e 0a 20 20 2a 2f 0a  e is free..  */.
2f8b0 20 20 69 66 28 20 49 53 41 55 54 4f 56 41 43 55    if( ISAUTOVACU
2f8c0 55 4d 20 29 7b 0a 20 20 20 20 70 74 72 6d 61 70  UM ){.    ptrmap
2f8d0 50 75 74 28 70 42 74 2c 20 69 50 61 67 65 2c 20  Put(pBt, iPage, 
2f8e0 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45 2c  PTRMAP_FREEPAGE,
2f8f0 20 30 2c 20 26 72 63 29 3b 0a 20 20 20 20 69 66   0, &rc);.    if
2f900 28 20 72 63 20 29 20 67 6f 74 6f 20 66 72 65 65  ( rc ) goto free
2f910 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20  page_out;.  }.. 
2f920 20 2f 2a 20 4e 6f 77 20 6d 61 6e 69 70 75 6c 61   /* Now manipula
2f930 74 65 20 74 68 65 20 61 63 74 75 61 6c 20 64 61  te the actual da
2f940 74 61 62 61 73 65 20 66 72 65 65 2d 6c 69 73 74  tabase free-list
2f950 20 73 74 72 75 63 74 75 72 65 2e 20 54 68 65 72   structure. Ther
2f960 65 20 61 72 65 20 74 77 6f 0a 20 20 2a 2a 20 70  e are two.  ** p
2f970 6f 73 73 69 62 69 6c 69 74 69 65 73 2e 20 49 66  ossibilities. If
2f980 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 69   the free-list i
2f990 73 20 63 75 72 72 65 6e 74 6c 79 20 65 6d 70 74  s currently empt
2f9a0 79 2c 20 6f 72 20 69 66 20 74 68 65 20 66 69 72  y, or if the fir
2f9b0 73 74 0a 20 20 2a 2a 20 74 72 75 6e 6b 20 70 61  st.  ** trunk pa
2f9c0 67 65 20 69 6e 20 74 68 65 20 66 72 65 65 2d 6c  ge in the free-l
2f9d0 69 73 74 20 69 73 20 66 75 6c 6c 2c 20 74 68 65  ist is full, the
2f9e0 6e 20 74 68 69 73 20 70 61 67 65 20 77 69 6c 6c  n this page will
2f9f0 20 62 65 63 6f 6d 65 20 61 0a 20 20 2a 2a 20 6e   become a.  ** n
2fa00 65 77 20 66 72 65 65 2d 6c 69 73 74 20 74 72 75  ew free-list tru
2fa10 6e 6b 20 70 61 67 65 2e 20 4f 74 68 65 72 77 69  nk page. Otherwi
2fa20 73 65 2c 20 69 74 20 77 69 6c 6c 20 62 65 63 6f  se, it will beco
2fa30 6d 65 20 61 20 6c 65 61 66 20 6f 66 20 74 68 65  me a leaf of the
2fa40 0a 20 20 2a 2a 20 66 69 72 73 74 20 74 72 75 6e  .  ** first trun
2fa50 6b 20 70 61 67 65 20 69 6e 20 74 68 65 20 63 75  k page in the cu
2fa60 72 72 65 6e 74 20 66 72 65 65 2d 6c 69 73 74 2e  rrent free-list.
2fa70 20 54 68 69 73 20 62 6c 6f 63 6b 20 74 65 73 74   This block test
2fa80 73 20 69 66 20 69 74 0a 20 20 2a 2a 20 69 73 20  s if it.  ** is 
2fa90 70 6f 73 73 69 62 6c 65 20 74 6f 20 61 64 64 20  possible to add 
2faa0 74 68 65 20 70 61 67 65 20 61 73 20 61 20 6e 65  the page as a ne
2fab0 77 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66  w free-list leaf
2fac0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 46 72  ..  */.  if( nFr
2fad0 65 65 21 3d 30 20 29 7b 0a 20 20 20 20 75 33 32  ee!=0 ){.    u32
2fae0 20 6e 4c 65 61 66 3b 20 20 20 20 20 20 20 20 20   nLeaf;         
2faf0 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61         /* Initia
2fb00 6c 20 6e 75 6d 62 65 72 20 6f 66 20 6c 65 61 66  l number of leaf
2fb10 20 63 65 6c 6c 73 20 6f 6e 20 74 72 75 6e 6b 20   cells on trunk 
2fb20 70 61 67 65 20 2a 2f 0a 0a 20 20 20 20 69 54 72  page */..    iTr
2fb30 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26  unk = get4byte(&
2fb40 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32  pPage1->aData[32
2fb50 5d 29 3b 0a 20 20 20 20 72 63 20 3d 20 62 74 72  ]);.    rc = btr
2fb60 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69  eeGetPage(pBt, i
2fb70 54 72 75 6e 6b 2c 20 26 70 54 72 75 6e 6b 2c 20  Trunk, &pTrunk, 
2fb80 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  0);.    if( rc!=
2fb90 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2fba0 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65     goto freepage
2fbb0 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  _out;.    }..   
2fbc0 20 6e 4c 65 61 66 20 3d 20 67 65 74 34 62 79 74   nLeaf = get4byt
2fbd0 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  e(&pTrunk->aData
2fbe0 5b 34 5d 29 3b 0a 20 20 20 20 61 73 73 65 72 74  [4]);.    assert
2fbf0 28 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ( pBt->usableSiz
2fc00 65 3e 33 32 20 29 3b 0a 20 20 20 20 69 66 28 20  e>32 );.    if( 
2fc10 6e 4c 65 61 66 20 3e 20 28 75 33 32 29 70 42 74  nLeaf > (u32)pBt
2fc20 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d  ->usableSize/4 -
2fc30 20 32 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d   2 ){.      rc =
2fc40 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
2fc50 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f  BKPT;.      goto
2fc60 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20   freepage_out;. 
2fc70 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 4c 65     }.    if( nLe
2fc80 61 66 20 3c 20 28 75 33 32 29 70 42 74 2d 3e 75  af < (u32)pBt->u
2fc90 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20  sableSize/4 - 8 
2fca0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e 20 74  ){.      /* In t
2fcb0 68 69 73 20 63 61 73 65 20 74 68 65 72 65 20 69  his case there i
2fcc0 73 20 72 6f 6f 6d 20 6f 6e 20 74 68 65 20 74 72  s room on the tr
2fcd0 75 6e 6b 20 70 61 67 65 20 74 6f 20 69 6e 73 65  unk page to inse
2fce0 72 74 20 74 68 65 20 70 61 67 65 0a 20 20 20 20  rt the page.    
2fcf0 20 20 2a 2a 20 62 65 69 6e 67 20 66 72 65 65 64    ** being freed
2fd00 20 61 73 20 61 20 6e 65 77 20 6c 65 61 66 2e 0a   as a new leaf..
2fd10 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
2fd20 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20  * Note that the 
2fd30 74 72 75 6e 6b 20 70 61 67 65 20 69 73 20 6e 6f  trunk page is no
2fd40 74 20 72 65 61 6c 6c 79 20 66 75 6c 6c 20 75 6e  t really full un
2fd50 74 69 6c 20 69 74 20 63 6f 6e 74 61 69 6e 73 0a  til it contains.
2fd60 20 20 20 20 20 20 2a 2a 20 75 73 61 62 6c 65 53        ** usableS
2fd70 69 7a 65 2f 34 20 2d 20 32 20 65 6e 74 72 69 65  ize/4 - 2 entrie
2fd80 73 2c 20 6e 6f 74 20 75 73 61 62 6c 65 53 69 7a  s, not usableSiz
2fd90 65 2f 34 20 2d 20 38 20 65 6e 74 72 69 65 73 20  e/4 - 8 entries 
2fda0 61 73 20 77 65 20 68 61 76 65 0a 20 20 20 20 20  as we have.     
2fdb0 20 2a 2a 20 63 6f 64 65 64 2e 20 20 42 75 74 20   ** coded.  But 
2fdc0 64 75 65 20 74 6f 20 61 20 63 6f 64 69 6e 67 20  due to a coding 
2fdd0 65 72 72 6f 72 20 69 6e 20 76 65 72 73 69 6f 6e  error in version
2fde0 73 20 6f 66 20 53 51 4c 69 74 65 20 70 72 69 6f  s of SQLite prio
2fdf0 72 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 33 2e  r to.      ** 3.
2fe00 36 2e 30 2c 20 64 61 74 61 62 61 73 65 73 20 77  6.0, databases w
2fe10 69 74 68 20 66 72 65 65 6c 69 73 74 20 74 72 75  ith freelist tru
2fe20 6e 6b 20 70 61 67 65 73 20 68 6f 6c 64 69 6e 67  nk pages holding
2fe30 20 6d 6f 72 65 20 74 68 61 6e 0a 20 20 20 20 20   more than.     
2fe40 20 2a 2a 20 75 73 61 62 6c 65 53 69 7a 65 2f 34   ** usableSize/4
2fe50 20 2d 20 38 20 65 6e 74 72 69 65 73 20 77 69 6c   - 8 entries wil
2fe60 6c 20 62 65 20 72 65 70 6f 72 74 65 64 20 61 73  l be reported as
2fe70 20 63 6f 72 72 75 70 74 2e 20 20 49 6e 20 6f 72   corrupt.  In or
2fe80 64 65 72 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20  der.      ** to 
2fe90 6d 61 69 6e 74 61 69 6e 20 62 61 63 6b 77 61 72  maintain backwar
2fea0 64 73 20 63 6f 6d 70 61 74 69 62 69 6c 69 74 79  ds compatibility
2feb0 20 77 69 74 68 20 6f 6c 64 65 72 20 76 65 72 73   with older vers
2fec0 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 2c 0a  ions of SQLite,.
2fed0 20 20 20 20 20 20 2a 2a 20 77 65 20 77 69 6c 6c        ** we will
2fee0 20 63 6f 6e 74 69 6e 75 65 20 74 6f 20 72 65 73   continue to res
2fef0 74 72 69 63 74 20 74 68 65 20 6e 75 6d 62 65 72  trict the number
2ff00 20 6f 66 20 65 6e 74 72 69 65 73 20 74 6f 20 75   of entries to u
2ff10 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 0a  sableSize/4 - 8.
2ff20 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 6e 6f 77        ** for now
2ff30 2e 20 20 41 74 20 73 6f 6d 65 20 70 6f 69 6e 74  .  At some point
2ff40 20 69 6e 20 74 68 65 20 66 75 74 75 72 65 20 28   in the future (
2ff50 6f 6e 63 65 20 65 76 65 72 79 6f 6e 65 20 68 61  once everyone ha
2ff60 73 20 75 70 67 72 61 64 65 64 0a 20 20 20 20 20  s upgraded.     
2ff70 20 2a 2a 20 74 6f 20 33 2e 36 2e 30 20 6f 72 20   ** to 3.6.0 or 
2ff80 6c 61 74 65 72 29 20 77 65 20 73 68 6f 75 6c 64  later) we should
2ff90 20 63 6f 6e 73 69 64 65 72 20 66 69 78 69 6e 67   consider fixing
2ffa0 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 61 6c   the conditional
2ffb0 20 61 62 6f 76 65 0a 20 20 20 20 20 20 2a 2a 20   above.      ** 
2ffc0 74 6f 20 72 65 61 64 20 22 75 73 61 62 6c 65 53  to read "usableS
2ffd0 69 7a 65 2f 34 2d 32 22 20 69 6e 73 74 65 61 64  ize/4-2" instead
2ffe0 20 6f 66 20 22 75 73 61 62 6c 65 53 69 7a 65 2f   of "usableSize/
2fff0 34 2d 38 22 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  4-8"..      **. 
30000 20 20 20 20 20 2a 2a 20 45 56 49 44 45 4e 43 45       ** EVIDENCE
30010 2d 4f 46 3a 20 52 2d 31 39 39 32 30 2d 31 31 35  -OF: R-19920-115
30020 37 36 20 48 6f 77 65 76 65 72 2c 20 6e 65 77 65  76 However, newe
30030 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51  r versions of SQ
30040 4c 69 74 65 20 73 74 69 6c 6c 0a 20 20 20 20 20  Lite still.     
30050 20 2a 2a 20 61 76 6f 69 64 20 75 73 69 6e 67 20   ** avoid using 
30060 74 68 65 20 6c 61 73 74 20 73 69 78 20 65 6e 74  the last six ent
30070 72 69 65 73 20 69 6e 20 74 68 65 20 66 72 65 65  ries in the free
30080 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20  list trunk page 
30090 61 72 72 61 79 20 69 6e 0a 20 20 20 20 20 20 2a  array in.      *
300a0 2a 20 6f 72 64 65 72 20 74 68 61 74 20 64 61 74  * order that dat
300b0 61 62 61 73 65 20 66 69 6c 65 73 20 63 72 65 61  abase files crea
300c0 74 65 64 20 62 79 20 6e 65 77 65 72 20 76 65 72  ted by newer ver
300d0 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20  sions of SQLite 
300e0 63 61 6e 20 62 65 0a 20 20 20 20 20 20 2a 2a 20  can be.      ** 
300f0 72 65 61 64 20 62 79 20 6f 6c 64 65 72 20 76 65  read by older ve
30100 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65  rsions of SQLite
30110 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
30120 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
30130 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e  erWrite(pTrunk->
30140 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
30150 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
30160 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 75 74  K ){.        put
30170 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61  4byte(&pTrunk->a
30180 44 61 74 61 5b 34 5d 2c 20 6e 4c 65 61 66 2b 31  Data[4], nLeaf+1
30190 29 3b 0a 20 20 20 20 20 20 20 20 70 75 74 34 62  );.        put4b
301a0 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61  yte(&pTrunk->aDa
301b0 74 61 5b 38 2b 6e 4c 65 61 66 2a 34 5d 2c 20 69  ta[8+nLeaf*4], i
301c0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69  Page);.        i
301d0 66 28 20 70 50 61 67 65 20 26 26 20 28 70 42 74  f( pPage && (pBt
301e0 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53  ->btsFlags & BTS
301f0 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 29 3d  _SECURE_DELETE)=
30200 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
30210 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74  sqlite3PagerDont
30220 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62  Write(pPage->pDb
30230 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 7d  Page);.        }
30240 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 62 74  .        rc = bt
30250 72 65 65 53 65 74 48 61 73 43 6f 6e 74 65 6e 74  reeSetHasContent
30260 28 70 42 74 2c 20 69 50 61 67 65 29 3b 0a 20 20  (pBt, iPage);.  
30270 20 20 20 20 7d 0a 20 20 20 20 20 20 54 52 41 43      }.      TRAC
30280 45 28 28 22 46 52 45 45 2d 50 41 47 45 3a 20 25  E(("FREE-PAGE: %
30290 64 20 6c 65 61 66 20 6f 6e 20 74 72 75 6e 6b 20  d leaf on trunk 
302a0 70 61 67 65 20 25 64 5c 6e 22 2c 70 50 61 67 65  page %d\n",pPage
302b0 2d 3e 70 67 6e 6f 2c 70 54 72 75 6e 6b 2d 3e 70  ->pgno,pTrunk->p
302c0 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 67 6f 74  gno));.      got
302d0 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a  o freepage_out;.
302e0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
302f0 49 66 20 63 6f 6e 74 72 6f 6c 20 66 6c 6f 77 73  If control flows
30300 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 2c 20   to this point, 
30310 74 68 65 6e 20 69 74 20 77 61 73 20 6e 6f 74 20  then it was not 
30320 70 6f 73 73 69 62 6c 65 20 74 6f 20 61 64 64 20  possible to add 
30330 74 68 65 0a 20 20 2a 2a 20 74 68 65 20 70 61 67  the.  ** the pag
30340 65 20 62 65 69 6e 67 20 66 72 65 65 64 20 61 73  e being freed as
30350 20 61 20 6c 65 61 66 20 70 61 67 65 20 6f 66 20   a leaf page of 
30360 74 68 65 20 66 69 72 73 74 20 74 72 75 6e 6b 20  the first trunk 
30370 69 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  in the free-list
30380 2e 0a 20 20 2a 2a 20 50 6f 73 73 69 62 6c 79 20  ..  ** Possibly 
30390 62 65 63 61 75 73 65 20 74 68 65 20 66 72 65 65  because the free
303a0 2d 6c 69 73 74 20 69 73 20 65 6d 70 74 79 2c 20  -list is empty, 
303b0 6f 72 20 70 6f 73 73 69 62 6c 79 20 62 65 63 61  or possibly beca
303c0 75 73 65 20 74 68 65 20 0a 20 20 2a 2a 20 66 69  use the .  ** fi
303d0 72 73 74 20 74 72 75 6e 6b 20 69 6e 20 74 68 65  rst trunk in the
303e0 20 66 72 65 65 2d 6c 69 73 74 20 69 73 20 66 75   free-list is fu
303f0 6c 6c 2e 20 45 69 74 68 65 72 20 77 61 79 2c 20  ll. Either way, 
30400 74 68 65 20 70 61 67 65 20 62 65 69 6e 67 20 66  the page being f
30410 72 65 65 64 0a 20 20 2a 2a 20 77 69 6c 6c 20 62  reed.  ** will b
30420 65 63 6f 6d 65 20 74 68 65 20 6e 65 77 20 66 69  ecome the new fi
30430 72 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20 69  rst trunk page i
30440 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e  n the free-list.
30450 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67  .  */.  if( pPag
30460 65 3d 3d 30 20 26 26 20 53 51 4c 49 54 45 5f 4f  e==0 && SQLITE_O
30470 4b 21 3d 28 72 63 20 3d 20 62 74 72 65 65 47 65  K!=(rc = btreeGe
30480 74 50 61 67 65 28 70 42 74 2c 20 69 50 61 67 65  tPage(pBt, iPage
30490 2c 20 26 70 50 61 67 65 2c 20 30 29 29 20 29 7b  , &pPage, 0)) ){
304a0 0a 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61  .    goto freepa
304b0 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 72 63  ge_out;.  }.  rc
304c0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
304d0 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50  rite(pPage->pDbP
304e0 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  age);.  if( rc!=
304f0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
30500 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f   goto freepage_o
30510 75 74 3b 0a 20 20 7d 0a 20 20 70 75 74 34 62 79  ut;.  }.  put4by
30520 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c  te(pPage->aData,
30530 20 69 54 72 75 6e 6b 29 3b 0a 20 20 70 75 74 34   iTrunk);.  put4
30540 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61  byte(&pPage->aDa
30550 74 61 5b 34 5d 2c 20 30 29 3b 0a 20 20 70 75 74  ta[4], 0);.  put
30560 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61  4byte(&pPage1->a
30570 44 61 74 61 5b 33 32 5d 2c 20 69 50 61 67 65 29  Data[32], iPage)
30580 3b 0a 20 20 54 52 41 43 45 28 28 22 46 52 45 45  ;.  TRACE(("FREE
30590 2d 50 41 47 45 3a 20 25 64 20 6e 65 77 20 74 72  -PAGE: %d new tr
305a0 75 6e 6b 20 70 61 67 65 20 72 65 70 6c 61 63 69  unk page replaci
305b0 6e 67 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 2d  ng %d\n", pPage-
305c0 3e 70 67 6e 6f 2c 20 69 54 72 75 6e 6b 29 29 3b  >pgno, iTrunk));
305d0 0a 0a 66 72 65 65 70 61 67 65 5f 6f 75 74 3a 0a  ..freepage_out:.
305e0 20 20 69 66 28 20 70 50 61 67 65 20 29 7b 0a 20    if( pPage ){. 
305f0 20 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74     pPage->isInit
30600 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 6c 65   = 0;.  }.  rele
30610 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a  asePage(pPage);.
30620 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54    releasePage(pT
30630 72 75 6e 6b 29 3b 0a 20 20 72 65 74 75 72 6e 20  runk);.  return 
30640 72 63 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69  rc;.}.static voi
30650 64 20 66 72 65 65 50 61 67 65 28 4d 65 6d 50 61  d freePage(MemPa
30660 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 2a  ge *pPage, int *
30670 70 52 43 29 7b 0a 20 20 69 66 28 20 28 2a 70 52  pRC){.  if( (*pR
30680 43 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  C)==SQLITE_OK ){
30690 0a 20 20 20 20 2a 70 52 43 20 3d 20 66 72 65 65  .    *pRC = free
306a0 50 61 67 65 32 28 70 50 61 67 65 2d 3e 70 42 74  Page2(pPage->pBt
306b0 2c 20 70 50 61 67 65 2c 20 70 50 61 67 65 2d 3e  , pPage, pPage->
306c0 70 67 6e 6f 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  pgno);.  }.}../*
306d0 0a 2a 2a 20 46 72 65 65 20 61 6e 79 20 6f 76 65  .** Free any ove
306e0 72 66 6c 6f 77 20 70 61 67 65 73 20 61 73 73 6f  rflow pages asso
306f0 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
30700 67 69 76 65 6e 20 43 65 6c 6c 2e 20 20 57 72 69  given Cell.  Wri
30710 74 65 20 74 68 65 0a 2a 2a 20 6c 6f 63 61 6c 20  te the.** local 
30720 43 65 6c 6c 20 73 69 7a 65 20 28 74 68 65 20 6e  Cell size (the n
30730 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f  umber of bytes o
30740 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70  n the original p
30750 61 67 65 2c 20 6f 6d 69 74 74 69 6e 67 0a 2a 2a  age, omitting.**
30760 20 6f 76 65 72 66 6c 6f 77 29 20 69 6e 74 6f 20   overflow) into 
30770 2a 70 6e 53 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74  *pnSize..*/.stat
30780 69 63 20 69 6e 74 20 63 6c 65 61 72 43 65 6c 6c  ic int clearCell
30790 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  (.  MemPage *pPa
307a0 67 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ge,          /* 
307b0 54 68 65 20 70 61 67 65 20 74 68 61 74 20 63 6f  The page that co
307c0 6e 74 61 69 6e 73 20 74 68 65 20 43 65 6c 6c 20  ntains the Cell 
307d0 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
307e0 61 72 20 2a 70 43 65 6c 6c 2c 20 20 20 20 2f 2a  ar *pCell,    /*
307f0 20 46 69 72 73 74 20 62 79 74 65 20 6f 66 20 74   First byte of t
30800 68 65 20 43 65 6c 6c 20 2a 2f 0a 20 20 75 31 36  he Cell */.  u16
30810 20 2a 70 6e 53 69 7a 65 20 20 20 20 20 20 20 20   *pnSize        
30820 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74        /* Write t
30830 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 43  he size of the C
30840 65 6c 6c 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  ell here */.){. 
30850 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
30860 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 43   pPage->pBt;.  C
30870 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20  ellInfo info;.  
30880 50 67 6e 6f 20 6f 76 66 6c 50 67 6e 6f 3b 0a 20  Pgno ovflPgno;. 
30890 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 6e   int rc;.  int n
308a0 4f 76 66 6c 3b 0a 20 20 75 33 32 20 6f 76 66 6c  Ovfl;.  u32 ovfl
308b0 50 61 67 65 53 69 7a 65 3b 0a 0a 20 20 61 73 73  PageSize;..  ass
308c0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
308d0 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
308e0 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
308f0 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  btreeParseCellPt
30900 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20  r(pPage, pCell, 
30910 26 69 6e 66 6f 29 3b 0a 20 20 2a 70 6e 53 69 7a  &info);.  *pnSiz
30920 65 20 3d 20 69 6e 66 6f 2e 6e 53 69 7a 65 3b 0a  e = info.nSize;.
30930 20 20 69 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72    if( info.iOver
30940 66 6c 6f 77 3d 3d 30 20 29 7b 0a 20 20 20 20 72  flow==0 ){.    r
30950 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
30960 20 20 2f 2a 20 4e 6f 20 6f 76 65 72 66 6c 6f 77    /* No overflow
30970 20 70 61 67 65 73 2e 20 52 65 74 75 72 6e 20 77   pages. Return w
30980 69 74 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79  ithout doing any
30990 74 68 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20 69  thing */.  }.  i
309a0 66 28 20 70 43 65 6c 6c 2b 69 6e 66 6f 2e 69 4f  f( pCell+info.iO
309b0 76 65 72 66 6c 6f 77 2b 33 20 3e 20 70 50 61 67  verflow+3 > pPag
309c0 65 2d 3e 61 44 61 74 61 2b 70 50 61 67 65 2d 3e  e->aData+pPage->
309d0 6d 61 73 6b 50 61 67 65 20 29 7b 0a 20 20 20 20  maskPage ){.    
309e0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
309f0 52 52 55 50 54 5f 42 4b 50 54 3b 20 20 2f 2a 20  RRUPT_BKPT;  /* 
30a00 43 65 6c 6c 20 65 78 74 65 6e 64 73 20 70 61 73  Cell extends pas
30a10 74 20 65 6e 64 20 6f 66 20 70 61 67 65 20 2a 2f  t end of page */
30a20 0a 20 20 7d 0a 20 20 6f 76 66 6c 50 67 6e 6f 20  .  }.  ovflPgno 
30a30 3d 20 67 65 74 34 62 79 74 65 28 26 70 43 65 6c  = get4byte(&pCel
30a40 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77  l[info.iOverflow
30a50 5d 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42  ]);.  assert( pB
30a60 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3e 20  t->usableSize > 
30a70 34 20 29 3b 0a 20 20 6f 76 66 6c 50 61 67 65 53  4 );.  ovflPageS
30a80 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c  ize = pBt->usabl
30a90 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20 6e 4f 76  eSize - 4;.  nOv
30aa0 66 6c 20 3d 20 28 69 6e 66 6f 2e 6e 50 61 79 6c  fl = (info.nPayl
30ab0 6f 61 64 20 2d 20 69 6e 66 6f 2e 6e 4c 6f 63 61  oad - info.nLoca
30ac0 6c 20 2b 20 6f 76 66 6c 50 61 67 65 53 69 7a 65  l + ovflPageSize
30ad0 20 2d 20 31 29 2f 6f 76 66 6c 50 61 67 65 53 69   - 1)/ovflPageSi
30ae0 7a 65 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 76  ze;.  assert( ov
30af0 66 6c 50 67 6e 6f 3d 3d 30 20 7c 7c 20 6e 4f 76  flPgno==0 || nOv
30b00 66 6c 3e 30 20 29 3b 0a 20 20 77 68 69 6c 65 28  fl>0 );.  while(
30b10 20 6e 4f 76 66 6c 2d 2d 20 29 7b 0a 20 20 20 20   nOvfl-- ){.    
30b20 50 67 6e 6f 20 69 4e 65 78 74 20 3d 20 30 3b 0a  Pgno iNext = 0;.
30b30 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f 76      MemPage *pOv
30b40 66 6c 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  fl = 0;.    if( 
30b50 6f 76 66 6c 50 67 6e 6f 3c 32 20 7c 7c 20 6f 76  ovflPgno<2 || ov
30b60 66 6c 50 67 6e 6f 3e 62 74 72 65 65 50 61 67 65  flPgno>btreePage
30b70 63 6f 75 6e 74 28 70 42 74 29 20 29 7b 0a 20 20  count(pBt) ){.  
30b80 20 20 20 20 2f 2a 20 30 20 69 73 20 6e 6f 74 20      /* 0 is not 
30b90 61 20 6c 65 67 61 6c 20 70 61 67 65 20 6e 75 6d  a legal page num
30ba0 62 65 72 20 61 6e 64 20 70 61 67 65 20 31 20 63  ber and page 1 c
30bb0 61 6e 6e 6f 74 20 62 65 20 61 6e 20 0a 20 20 20  annot be an .   
30bc0 20 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70     ** overflow p
30bd0 61 67 65 2e 20 54 68 65 72 65 66 6f 72 65 20 69  age. Therefore i
30be0 66 20 6f 76 66 6c 50 67 6e 6f 3c 32 20 6f 72 20  f ovflPgno<2 or 
30bf0 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20  past the end of 
30c00 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 66 69  the .      ** fi
30c10 6c 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  le the database 
30c20 6d 75 73 74 20 62 65 20 63 6f 72 72 75 70 74 2e  must be corrupt.
30c30 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e   */.      return
30c40 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
30c50 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20  BKPT;.    }.    
30c60 69 66 28 20 6e 4f 76 66 6c 20 29 7b 0a 20 20 20  if( nOvfl ){.   
30c70 20 20 20 72 63 20 3d 20 67 65 74 4f 76 65 72 66     rc = getOverf
30c80 6c 6f 77 50 61 67 65 28 70 42 74 2c 20 6f 76 66  lowPage(pBt, ovf
30c90 6c 50 67 6e 6f 2c 20 26 70 4f 76 66 6c 2c 20 26  lPgno, &pOvfl, &
30ca0 69 4e 65 78 74 29 3b 0a 20 20 20 20 20 20 69 66  iNext);.      if
30cb0 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
30cc0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
30cd0 20 28 20 70 4f 76 66 6c 20 7c 7c 20 28 28 70 4f   ( pOvfl || ((pO
30ce0 76 66 6c 20 3d 20 62 74 72 65 65 50 61 67 65 4c  vfl = btreePageL
30cf0 6f 6f 6b 75 70 28 70 42 74 2c 20 6f 76 66 6c 50  ookup(pBt, ovflP
30d00 67 6e 6f 29 29 21 3d 30 29 20 29 0a 20 20 20 20  gno))!=0) ).    
30d10 20 26 26 20 73 71 6c 69 74 65 33 50 61 67 65 72   && sqlite3Pager
30d20 50 61 67 65 52 65 66 63 6f 75 6e 74 28 70 4f 76  PageRefcount(pOv
30d30 66 6c 2d 3e 70 44 62 50 61 67 65 29 21 3d 31 0a  fl->pDbPage)!=1.
30d40 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20      ){.      /* 
30d50 54 68 65 72 65 20 69 73 20 6e 6f 20 72 65 61 73  There is no reas
30d60 6f 6e 20 61 6e 79 20 63 75 72 73 6f 72 20 73 68  on any cursor sh
30d70 6f 75 6c 64 20 68 61 76 65 20 61 6e 20 6f 75 74  ould have an out
30d80 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e  standing referen
30d90 63 65 20 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20  ce .      ** to 
30da0 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
30db0 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 61 20   belonging to a 
30dc0 63 65 6c 6c 20 74 68 61 74 20 69 73 20 62 65 69  cell that is bei
30dd0 6e 67 20 64 65 6c 65 74 65 64 2f 75 70 64 61 74  ng deleted/updat
30de0 65 64 2e 0a 20 20 20 20 20 20 2a 2a 20 53 6f 20  ed..      ** So 
30df0 69 66 20 74 68 65 72 65 20 65 78 69 73 74 73 20  if there exists 
30e00 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 72 65  more than one re
30e10 66 65 72 65 6e 63 65 20 74 6f 20 74 68 69 73 20  ference to this 
30e20 70 61 67 65 2c 20 74 68 65 6e 20 69 74 20 0a 20  page, then it . 
30e30 20 20 20 20 20 2a 2a 20 6d 75 73 74 20 6e 6f 74       ** must not
30e40 20 72 65 61 6c 6c 79 20 62 65 20 61 6e 20 6f 76   really be an ov
30e50 65 72 66 6c 6f 77 20 70 61 67 65 20 61 6e 64 20  erflow page and 
30e60 74 68 65 20 64 61 74 61 62 61 73 65 20 6d 75 73  the database mus
30e70 74 20 62 65 20 63 6f 72 72 75 70 74 2e 20 0a 20  t be corrupt. . 
30e80 20 20 20 20 20 2a 2a 20 49 74 20 69 73 20 68 65       ** It is he
30e90 6c 70 66 75 6c 20 74 6f 20 64 65 74 65 63 74 20  lpful to detect 
30ea0 74 68 69 73 20 62 65 66 6f 72 65 20 63 61 6c 6c  this before call
30eb0 69 6e 67 20 66 72 65 65 50 61 67 65 32 28 29 2c  ing freePage2(),
30ec0 20 61 73 20 0a 20 20 20 20 20 20 2a 2a 20 66 72   as .      ** fr
30ed0 65 65 50 61 67 65 32 28 29 20 6d 61 79 20 7a 65  eePage2() may ze
30ee0 72 6f 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74  ro the page cont
30ef0 65 6e 74 73 20 69 66 20 73 65 63 75 72 65 2d 64  ents if secure-d
30f00 65 6c 65 74 65 20 6d 6f 64 65 20 69 73 0a 20 20  elete mode is.  
30f10 20 20 20 20 2a 2a 20 65 6e 61 62 6c 65 64 2e 20      ** enabled. 
30f20 49 66 20 74 68 69 73 20 27 6f 76 65 72 66 6c 6f  If this 'overflo
30f30 77 27 20 70 61 67 65 20 68 61 70 70 65 6e 73 20  w' page happens 
30f40 74 6f 20 62 65 20 61 20 70 61 67 65 20 74 68 61  to be a page tha
30f50 74 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 63  t the.      ** c
30f60 61 6c 6c 65 72 20 69 73 20 69 74 65 72 61 74 69  aller is iterati
30f70 6e 67 20 74 68 72 6f 75 67 68 20 6f 72 20 75 73  ng through or us
30f80 69 6e 67 20 69 6e 20 73 6f 6d 65 20 6f 74 68 65  ing in some othe
30f90 72 20 77 61 79 2c 20 74 68 69 73 0a 20 20 20 20  r way, this.    
30fa0 20 20 2a 2a 20 63 61 6e 20 62 65 20 70 72 6f 62    ** can be prob
30fb0 6c 65 6d 61 74 69 63 2e 0a 20 20 20 20 20 20 2a  lematic..      *
30fc0 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  /.      rc = SQL
30fd0 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
30fe0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
30ff0 20 20 20 72 63 20 3d 20 66 72 65 65 50 61 67 65     rc = freePage
31000 32 28 70 42 74 2c 20 70 4f 76 66 6c 2c 20 6f 76  2(pBt, pOvfl, ov
31010 66 6c 50 67 6e 6f 29 3b 0a 20 20 20 20 7d 0a 0a  flPgno);.    }..
31020 20 20 20 20 69 66 28 20 70 4f 76 66 6c 20 29 7b      if( pOvfl ){
31030 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61  .      sqlite3Pa
31040 67 65 72 55 6e 72 65 66 28 70 4f 76 66 6c 2d 3e  gerUnref(pOvfl->
31050 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a  pDbPage);.    }.
31060 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
31070 75 72 6e 20 72 63 3b 0a 20 20 20 20 6f 76 66 6c  urn rc;.    ovfl
31080 50 67 6e 6f 20 3d 20 69 4e 65 78 74 3b 0a 20 20  Pgno = iNext;.  
31090 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
310a0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  E_OK;.}../*.** C
310b0 72 65 61 74 65 20 74 68 65 20 62 79 74 65 20 73  reate the byte s
310c0 65 71 75 65 6e 63 65 20 75 73 65 64 20 74 6f 20  equence used to 
310d0 72 65 70 72 65 73 65 6e 74 20 61 20 63 65 6c 6c  represent a cell
310e0 20 6f 6e 20 70 61 67 65 20 70 50 61 67 65 0a 2a   on page pPage.*
310f0 2a 20 61 6e 64 20 77 72 69 74 65 20 74 68 61 74  * and write that
31100 20 62 79 74 65 20 73 65 71 75 65 6e 63 65 20 69   byte sequence i
31110 6e 74 6f 20 70 43 65 6c 6c 5b 5d 2e 20 20 4f 76  nto pCell[].  Ov
31120 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61 72 65  erflow pages are
31130 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e  .** allocated an
31140 64 20 66 69 6c 6c 65 64 20 69 6e 20 61 73 20 6e  d filled in as n
31150 65 63 65 73 73 61 72 79 2e 20 20 54 68 65 20 63  ecessary.  The c
31160 61 6c 6c 69 6e 67 20 70 72 6f 63 65 64 75 72 65  alling procedure
31170 0a 2a 2a 20 69 73 20 72 65 73 70 6f 6e 73 69 62  .** is responsib
31180 6c 65 20 66 6f 72 20 6d 61 6b 69 6e 67 20 73 75  le for making su
31190 72 65 20 73 75 66 66 69 63 69 65 6e 74 20 73 70  re sufficient sp
311a0 61 63 65 20 68 61 73 20 62 65 65 6e 20 61 6c 6c  ace has been all
311b0 6f 63 61 74 65 64 0a 2a 2a 20 66 6f 72 20 70 43  ocated.** for pC
311c0 65 6c 6c 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74  ell[]..**.** Not
311d0 65 20 74 68 61 74 20 70 43 65 6c 6c 20 64 6f 65  e that pCell doe
311e0 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 20  s not necessary 
311f0 6e 65 65 64 20 74 6f 20 70 6f 69 6e 74 20 74 6f  need to point to
31200 20 74 68 65 20 70 50 61 67 65 2d 3e 61 44 61 74   the pPage->aDat
31210 61 0a 2a 2a 20 61 72 65 61 2e 20 20 70 43 65 6c  a.** area.  pCel
31220 6c 20 6d 69 67 68 74 20 70 6f 69 6e 74 20 74 6f  l might point to
31230 20 73 6f 6d 65 20 74 65 6d 70 6f 72 61 72 79 20   some temporary 
31240 73 74 6f 72 61 67 65 2e 20 20 54 68 65 20 63 65  storage.  The ce
31250 6c 6c 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 63 6f  ll will.** be co
31260 6e 73 74 72 75 63 74 65 64 20 69 6e 20 74 68 69  nstructed in thi
31270 73 20 74 65 6d 70 6f 72 61 72 79 20 61 72 65 61  s temporary area
31280 20 74 68 65 6e 20 63 6f 70 69 65 64 20 69 6e 74   then copied int
31290 6f 20 70 50 61 67 65 2d 3e 61 44 61 74 61 0a 2a  o pPage->aData.*
312a0 2a 20 6c 61 74 65 72 2e 0a 2a 2f 0a 73 74 61 74  * later..*/.stat
312b0 69 63 20 69 6e 74 20 66 69 6c 6c 49 6e 43 65 6c  ic int fillInCel
312c0 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  l(.  MemPage *pP
312d0 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  age,            
312e0 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20      /* The page 
312f0 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68  that contains th
31300 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 6e 73 69  e cell */.  unsi
31310 67 6e 65 64 20 63 68 61 72 20 2a 70 43 65 6c 6c  gned char *pCell
31320 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f  ,          /* Co
31330 6d 70 6c 65 74 65 20 74 65 78 74 20 6f 66 20 74  mplete text of t
31340 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 63 6f 6e  he cell */.  con
31350 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20 69  st void *pKey, i
31360 36 34 20 6e 4b 65 79 2c 20 20 20 20 2f 2a 20 54  64 nKey,    /* T
31370 68 65 20 6b 65 79 20 2a 2f 0a 20 20 63 6f 6e 73  he key */.  cons
31380 74 20 76 6f 69 64 20 2a 70 44 61 74 61 2c 69 6e  t void *pData,in
31390 74 20 6e 44 61 74 61 2c 20 20 20 2f 2a 20 54 68  t nData,   /* Th
313a0 65 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20  e data */.  int 
313b0 6e 5a 65 72 6f 2c 20 20 20 20 20 20 20 20 20 20  nZero,          
313c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78             /* Ex
313d0 74 72 61 20 7a 65 72 6f 20 62 79 74 65 73 20 74  tra zero bytes t
313e0 6f 20 61 70 70 65 6e 64 20 74 6f 20 70 44 61 74  o append to pDat
313f0 61 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 53 69  a */.  int *pnSi
31400 7a 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ze              
31410 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 63        /* Write c
31420 65 6c 6c 20 73 69 7a 65 20 68 65 72 65 20 2a 2f  ell size here */
31430 0a 29 7b 0a 20 20 69 6e 74 20 6e 50 61 79 6c 6f  .){.  int nPaylo
31440 61 64 3b 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a  ad;.  const u8 *
31450 70 53 72 63 3b 0a 20 20 69 6e 74 20 6e 53 72 63  pSrc;.  int nSrc
31460 2c 20 6e 2c 20 72 63 3b 0a 20 20 69 6e 74 20 73  , n, rc;.  int s
31470 70 61 63 65 4c 65 66 74 3b 0a 20 20 4d 65 6d 50  paceLeft;.  MemP
31480 61 67 65 20 2a 70 4f 76 66 6c 20 3d 20 30 3b 0a  age *pOvfl = 0;.
31490 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 6f 52 65    MemPage *pToRe
314a0 6c 65 61 73 65 20 3d 20 30 3b 0a 20 20 75 6e 73  lease = 0;.  uns
314b0 69 67 6e 65 64 20 63 68 61 72 20 2a 70 50 72 69  igned char *pPri
314c0 6f 72 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  or;.  unsigned c
314d0 68 61 72 20 2a 70 50 61 79 6c 6f 61 64 3b 0a 20  har *pPayload;. 
314e0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
314f0 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 50   pPage->pBt;.  P
31500 67 6e 6f 20 70 67 6e 6f 4f 76 66 6c 20 3d 20 30  gno pgnoOvfl = 0
31510 3b 0a 20 20 69 6e 74 20 6e 48 65 61 64 65 72 3b  ;.  int nHeader;
31520 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
31530 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
31540 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
31550 29 20 29 3b 0a 0a 20 20 2f 2a 20 70 50 61 67 65  ) );..  /* pPage
31560 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72   is not necessar
31570 69 6c 79 20 77 72 69 74 65 61 62 6c 65 20 73 69  ily writeable si
31580 6e 63 65 20 70 43 65 6c 6c 20 6d 69 67 68 74 20  nce pCell might 
31590 62 65 20 61 75 78 69 6c 69 61 72 79 0a 20 20 2a  be auxiliary.  *
315a0 2a 20 62 75 66 66 65 72 20 73 70 61 63 65 20 74  * buffer space t
315b0 68 61 74 20 69 73 20 73 65 70 61 72 61 74 65 20  hat is separate 
315c0 66 72 6f 6d 20 74 68 65 20 70 50 61 67 65 20 62  from the pPage b
315d0 75 66 66 65 72 20 61 72 65 61 20 2a 2f 0a 20 20  uffer area */.  
315e0 61 73 73 65 72 74 28 20 70 43 65 6c 6c 3c 70 50  assert( pCell<pP
315f0 61 67 65 2d 3e 61 44 61 74 61 20 7c 7c 20 70 43  age->aData || pC
31600 65 6c 6c 3e 3d 26 70 50 61 67 65 2d 3e 61 44 61  ell>=&pPage->aDa
31610 74 61 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  ta[pBt->pageSize
31620 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c  ].            ||
31630 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
31640 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
31650 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 2f  pDbPage) );..  /
31660 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 68 65  * Fill in the he
31670 61 64 65 72 2e 20 2a 2f 0a 20 20 6e 48 65 61 64  ader. */.  nHead
31680 65 72 20 3d 20 70 50 61 67 65 2d 3e 63 68 69 6c  er = pPage->chil
31690 64 50 74 72 53 69 7a 65 3b 0a 20 20 6e 50 61 79  dPtrSize;.  nPay
316a0 6c 6f 61 64 20 3d 20 6e 44 61 74 61 20 2b 20 6e  load = nData + n
316b0 5a 65 72 6f 3b 0a 20 20 69 66 28 20 70 50 61 67  Zero;.  if( pPag
316c0 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20 29 7b  e->intKeyLeaf ){
316d0 0a 20 20 20 20 6e 48 65 61 64 65 72 20 2b 3d 20  .    nHeader += 
316e0 70 75 74 56 61 72 69 6e 74 33 32 28 26 70 43 65  putVarint32(&pCe
316f0 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c 20 6e 50 61  ll[nHeader], nPa
31700 79 6c 6f 61 64 29 3b 0a 20 20 7d 65 6c 73 65 7b  yload);.  }else{
31710 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 44 61  .    assert( nDa
31720 74 61 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  ta==0 );.    ass
31730 65 72 74 28 20 6e 5a 65 72 6f 3d 3d 30 20 29 3b  ert( nZero==0 );
31740 0a 20 20 7d 0a 20 20 6e 48 65 61 64 65 72 20 2b  .  }.  nHeader +
31750 3d 20 70 75 74 56 61 72 69 6e 74 28 26 70 43 65  = putVarint(&pCe
31760 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c 20 2a 28 75  ll[nHeader], *(u
31770 36 34 2a 29 26 6e 4b 65 79 29 3b 0a 20 20 0a 20  64*)&nKey);.  . 
31780 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65 20   /* Fill in the 
31790 70 61 79 6c 6f 61 64 20 73 69 7a 65 20 2a 2f 0a  payload size */.
317a0 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74    if( pPage->int
317b0 4b 65 79 20 29 7b 0a 20 20 20 20 70 53 72 63 20  Key ){.    pSrc 
317c0 3d 20 70 44 61 74 61 3b 0a 20 20 20 20 6e 53 72  = pData;.    nSr
317d0 63 20 3d 20 6e 44 61 74 61 3b 0a 20 20 20 20 6e  c = nData;.    n
317e0 44 61 74 61 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  Data = 0;.  }els
317f0 65 7b 20 0a 20 20 20 20 69 66 28 20 4e 45 56 45  e{ .    if( NEVE
31800 52 28 6e 4b 65 79 3e 30 78 37 66 66 66 66 66 66  R(nKey>0x7ffffff
31810 66 20 7c 7c 20 70 4b 65 79 3d 3d 30 29 20 29 7b  f || pKey==0) ){
31820 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
31830 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
31840 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 50 61  T;.    }.    nPa
31850 79 6c 6f 61 64 20 3d 20 28 69 6e 74 29 6e 4b 65  yload = (int)nKe
31860 79 3b 0a 20 20 20 20 70 53 72 63 20 3d 20 70 4b  y;.    pSrc = pK
31870 65 79 3b 0a 20 20 20 20 6e 53 72 63 20 3d 20 28  ey;.    nSrc = (
31880 69 6e 74 29 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20  int)nKey;.  }.  
31890 69 66 28 20 6e 50 61 79 6c 6f 61 64 3c 3d 70 50  if( nPayload<=pP
318a0 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b  age->maxLocal ){
318b0 0a 20 20 20 20 6e 20 3d 20 6e 48 65 61 64 65 72  .    n = nHeader
318c0 20 2b 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 20   + nPayload;.   
318d0 20 74 65 73 74 63 61 73 65 28 20 6e 3d 3d 33 20   testcase( n==3 
318e0 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
318f0 20 6e 3d 3d 34 20 29 3b 0a 20 20 20 20 69 66 28   n==4 );.    if(
31900 20 6e 3c 34 20 29 20 6e 20 3d 20 34 3b 0a 20 20   n<4 ) n = 4;.  
31910 20 20 2a 70 6e 53 69 7a 65 20 3d 20 6e 3b 0a 20    *pnSize = n;. 
31920 20 20 20 73 70 61 63 65 4c 65 66 74 20 3d 20 6e     spaceLeft = n
31930 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20 70 50 72  Payload;.    pPr
31940 69 6f 72 20 3d 20 70 43 65 6c 6c 3b 0a 20 20 7d  ior = pCell;.  }
31950 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6d 6e  else{.    int mn
31960 20 3d 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63   = pPage->minLoc
31970 61 6c 3b 0a 20 20 20 20 6e 20 3d 20 6d 6e 20 2b  al;.    n = mn +
31980 20 28 6e 50 61 79 6c 6f 61 64 20 2d 20 6d 6e 29   (nPayload - mn)
31990 20 25 20 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e   % (pPage->pBt->
319a0 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 29 3b  usableSize - 4);
319b0 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e  .    testcase( n
319c0 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  ==pPage->maxLoca
319d0 6c 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  l );.    testcas
319e0 65 28 20 6e 3d 3d 70 50 61 67 65 2d 3e 6d 61 78  e( n==pPage->max
319f0 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 20 20 69  Local+1 );.    i
31a00 66 28 20 6e 20 3e 20 70 50 61 67 65 2d 3e 6d 61  f( n > pPage->ma
31a10 78 4c 6f 63 61 6c 20 29 20 6e 20 3d 20 6d 6e 3b  xLocal ) n = mn;
31a20 0a 20 20 20 20 73 70 61 63 65 4c 65 66 74 20 3d  .    spaceLeft =
31a30 20 6e 3b 0a 20 20 20 20 2a 70 6e 53 69 7a 65 20   n;.    *pnSize 
31a40 3d 20 6e 20 2b 20 6e 48 65 61 64 65 72 20 2b 20  = n + nHeader + 
31a50 34 3b 0a 20 20 20 20 70 50 72 69 6f 72 20 3d 20  4;.    pPrior = 
31a60 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 2b 6e  &pCell[nHeader+n
31a70 5d 3b 0a 20 20 7d 0a 20 20 70 50 61 79 6c 6f 61  ];.  }.  pPayloa
31a80 64 20 3d 20 26 70 43 65 6c 6c 5b 6e 48 65 61 64  d = &pCell[nHead
31a90 65 72 5d 3b 0a 0a 20 20 2f 2a 20 41 74 20 74 68  er];..  /* At th
31aa0 69 73 20 70 6f 69 6e 74 20 76 61 72 69 61 62 6c  is point variabl
31ab0 65 73 20 73 68 6f 75 6c 64 20 62 65 20 73 65 74  es should be set
31ac0 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 2a   as follows:.  *
31ad0 2a 0a 20 20 2a 2a 20 20 20 6e 50 61 79 6c 6f 61  *.  **   nPayloa
31ae0 64 20 20 20 20 20 20 20 20 20 20 20 54 6f 74 61  d           Tota
31af0 6c 20 70 61 79 6c 6f 61 64 20 73 69 7a 65 20 69  l payload size i
31b00 6e 20 62 79 74 65 73 0a 20 20 2a 2a 20 20 20 70  n bytes.  **   p
31b10 50 61 79 6c 6f 61 64 20 20 20 20 20 20 20 20 20  Payload         
31b20 20 20 42 65 67 69 6e 20 77 72 69 74 69 6e 67 20    Begin writing 
31b30 70 61 79 6c 6f 61 64 20 68 65 72 65 0a 20 20 2a  payload here.  *
31b40 2a 20 20 20 73 70 61 63 65 4c 65 66 74 20 20 20  *   spaceLeft   
31b50 20 20 20 20 20 20 20 53 70 61 63 65 20 61 76 61         Space ava
31b60 69 6c 61 62 6c 65 20 61 74 20 70 50 61 79 6c 6f  ilable at pPaylo
31b70 61 64 2e 20 20 49 66 20 6e 50 61 79 6c 6f 61 64  ad.  If nPayload
31b80 3e 73 70 61 63 65 4c 65 66 74 2c 0a 20 20 2a 2a  >spaceLeft,.  **
31b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31ba0 20 20 20 20 20 20 74 68 61 74 20 6d 65 61 6e 73        that means
31bb0 20 63 6f 6e 74 65 6e 74 20 6d 75 73 74 20 73 70   content must sp
31bc0 69 6c 6c 20 69 6e 74 6f 20 6f 76 65 72 66 6c 6f  ill into overflo
31bd0 77 20 70 61 67 65 73 2e 0a 20 20 2a 2a 20 20 20  w pages..  **   
31be0 2a 70 6e 53 69 7a 65 20 20 20 20 20 20 20 20 20  *pnSize         
31bf0 20 20 20 53 69 7a 65 20 6f 66 20 74 68 65 20 6c     Size of the l
31c00 6f 63 61 6c 20 63 65 6c 6c 20 28 6e 6f 74 20 63  ocal cell (not c
31c10 6f 75 6e 74 69 6e 67 20 6f 76 65 72 66 6c 6f 77  ounting overflow
31c20 20 70 61 67 65 73 29 0a 20 20 2a 2a 20 20 20 70   pages).  **   p
31c30 50 72 69 6f 72 20 20 20 20 20 20 20 20 20 20 20  Prior           
31c40 20 20 57 68 65 72 65 20 74 6f 20 77 72 69 74 65    Where to write
31c50 20 74 68 65 20 70 67 6e 6f 20 6f 66 20 74 68 65   the pgno of the
31c60 20 66 69 72 73 74 20 6f 76 65 72 66 6c 6f 77 20   first overflow 
31c70 70 61 67 65 0a 20 20 2a 2a 0a 20 20 2a 2a 20 55  page.  **.  ** U
31c80 73 65 20 61 20 63 61 6c 6c 20 74 6f 20 62 74 72  se a call to btr
31c90 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29  eeParseCellPtr()
31ca0 20 74 6f 20 76 65 72 69 66 79 20 74 68 61 74 20   to verify that 
31cb0 74 68 65 20 76 61 6c 75 65 73 20 61 62 6f 76 65  the values above
31cc0 0a 20 20 2a 2a 20 77 65 72 65 20 63 6f 6d 70 75  .  ** were compu
31cd0 74 65 64 20 63 6f 72 72 65 63 74 6c 79 2e 0a 20  ted correctly.. 
31ce0 20 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 44   */.#if SQLITE_D
31cf0 45 42 55 47 0a 20 20 7b 0a 20 20 20 20 43 65 6c  EBUG.  {.    Cel
31d00 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20  lInfo info;.    
31d10 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  btreeParseCellPt
31d20 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20  r(pPage, pCell, 
31d30 26 69 6e 66 6f 29 3b 0a 20 20 20 20 61 73 73 65  &info);.    asse
31d40 72 74 28 20 6e 48 65 61 64 65 72 3d 28 69 6e 74  rt( nHeader=(int
31d50 29 28 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64 20  )(info.pPayload 
31d60 2d 20 70 43 65 6c 6c 29 20 29 3b 0a 20 20 20 20  - pCell) );.    
31d70 61 73 73 65 72 74 28 20 69 6e 66 6f 2e 6e 4b 65  assert( info.nKe
31d80 79 3d 3d 6e 4b 65 79 20 29 3b 0a 20 20 20 20 61  y==nKey );.    a
31d90 73 73 65 72 74 28 20 2a 70 6e 53 69 7a 65 20 3d  ssert( *pnSize =
31da0 3d 20 69 6e 66 6f 2e 6e 53 69 7a 65 20 29 3b 0a  = info.nSize );.
31db0 20 20 20 20 61 73 73 65 72 74 28 20 73 70 61 63      assert( spac
31dc0 65 4c 65 66 74 20 3d 3d 20 69 6e 66 6f 2e 6e 4c  eLeft == info.nL
31dd0 6f 63 61 6c 20 29 3b 0a 20 20 20 20 61 73 73 65  ocal );.    asse
31de0 72 74 28 20 70 50 72 69 6f 72 20 3d 3d 20 26 70  rt( pPrior == &p
31df0 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66  Cell[info.iOverf
31e00 6c 6f 77 5d 20 29 3b 0a 20 20 7d 0a 23 65 6e 64  low] );.  }.#end
31e10 69 66 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20 74  if..  /* Write t
31e20 68 65 20 70 61 79 6c 6f 61 64 20 69 6e 74 6f 20  he payload into 
31e30 74 68 65 20 6c 6f 63 61 6c 20 43 65 6c 6c 20 61  the local Cell a
31e40 6e 64 20 61 6e 79 20 65 78 74 72 61 20 69 6e 74  nd any extra int
31e50 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  o overflow pages
31e60 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 6e 50 61   */.  while( nPa
31e70 79 6c 6f 61 64 3e 30 20 29 7b 0a 20 20 20 20 69  yload>0 ){.    i
31e80 66 28 20 73 70 61 63 65 4c 65 66 74 3d 3d 30 20  f( spaceLeft==0 
31e90 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
31ea0 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
31eb0 4d 0a 20 20 20 20 20 20 50 67 6e 6f 20 70 67 6e  M.      Pgno pgn
31ec0 6f 50 74 72 6d 61 70 20 3d 20 70 67 6e 6f 4f 76  oPtrmap = pgnoOv
31ed0 66 6c 3b 20 2f 2a 20 4f 76 65 72 66 6c 6f 77 20  fl; /* Overflow 
31ee0 70 61 67 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70  page pointer-map
31ef0 20 65 6e 74 72 79 20 70 61 67 65 20 2a 2f 0a 20   entry page */. 
31f00 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75       if( pBt->au
31f10 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  toVacuum ){.    
31f20 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 20 20      do{.        
31f30 20 20 70 67 6e 6f 4f 76 66 6c 2b 2b 3b 0a 20 20    pgnoOvfl++;.  
31f40 20 20 20 20 20 20 7d 20 77 68 69 6c 65 28 20 0a        } while( .
31f50 20 20 20 20 20 20 20 20 20 20 50 54 52 4d 41 50            PTRMAP
31f60 5f 49 53 50 41 47 45 28 70 42 74 2c 20 70 67 6e  _ISPAGE(pBt, pgn
31f70 6f 4f 76 66 6c 29 20 7c 7c 20 70 67 6e 6f 4f 76  oOvfl) || pgnoOv
31f80 66 6c 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  fl==PENDING_BYTE
31f90 5f 50 41 47 45 28 70 42 74 29 20 0a 20 20 20 20  _PAGE(pBt) .    
31fa0 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 23      );.      }.#
31fb0 65 6e 64 69 66 0a 20 20 20 20 20 20 72 63 20 3d  endif.      rc =
31fc0 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61   allocateBtreePa
31fd0 67 65 28 70 42 74 2c 20 26 70 4f 76 66 6c 2c 20  ge(pBt, &pOvfl, 
31fe0 26 70 67 6e 6f 4f 76 66 6c 2c 20 70 67 6e 6f 4f  &pgnoOvfl, pgnoO
31ff0 76 66 6c 2c 20 30 29 3b 0a 23 69 66 6e 64 65 66  vfl, 0);.#ifndef
32000 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
32010 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 2f 2a  OVACUUM.      /*
32020 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
32030 20 73 75 70 70 6f 72 74 73 20 61 75 74 6f 2d 76   supports auto-v
32040 61 63 75 75 6d 2c 20 61 6e 64 20 74 68 65 20 73  acuum, and the s
32050 65 63 6f 6e 64 20 6f 72 20 73 75 62 73 65 71 75  econd or subsequ
32060 65 6e 74 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65  ent.      ** ove
32070 72 66 6c 6f 77 20 70 61 67 65 20 69 73 20 62 65  rflow page is be
32080 69 6e 67 20 61 6c 6c 6f 63 61 74 65 64 2c 20 61  ing allocated, a
32090 64 64 20 61 6e 20 65 6e 74 72 79 20 74 6f 20 74  dd an entry to t
320a0 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20  he pointer-map. 
320b0 20 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 61 74       ** for that
320c0 20 70 61 67 65 20 6e 6f 77 2e 20 0a 20 20 20 20   page now. .    
320d0 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66    **.      ** If
320e0 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72   this is the fir
320f0 73 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  st overflow page
32100 2c 20 74 68 65 6e 20 77 72 69 74 65 20 61 20 70  , then write a p
32110 61 72 74 69 61 6c 20 65 6e 74 72 79 20 0a 20 20  artial entry .  
32120 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 70 6f      ** to the po
32130 69 6e 74 65 72 2d 6d 61 70 2e 20 49 66 20 77 65  inter-map. If we
32140 20 77 72 69 74 65 20 6e 6f 74 68 69 6e 67 20 74   write nothing t
32150 6f 20 74 68 69 73 20 70 6f 69 6e 74 65 72 2d 6d  o this pointer-m
32160 61 70 20 73 6c 6f 74 2c 0a 20 20 20 20 20 20 2a  ap slot,.      *
32170 2a 20 74 68 65 6e 20 74 68 65 20 6f 70 74 69 6d  * then the optim
32180 69 73 74 69 63 20 6f 76 65 72 66 6c 6f 77 20 63  istic overflow c
32190 68 61 69 6e 20 70 72 6f 63 65 73 73 69 6e 67 20  hain processing 
321a0 69 6e 20 63 6c 65 61 72 43 65 6c 6c 28 29 0a 20  in clearCell(). 
321b0 20 20 20 20 20 2a 2a 20 6d 61 79 20 6d 69 73 69       ** may misi
321c0 6e 74 65 72 70 72 65 74 20 74 68 65 20 75 6e 69  nterpret the uni
321d0 6e 69 74 69 61 6c 69 7a 65 64 20 76 61 6c 75 65  nitialized value
321e0 73 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65  s and delete the
321f0 0a 20 20 20 20 20 20 2a 2a 20 77 72 6f 6e 67 20  .      ** wrong 
32200 70 61 67 65 73 20 66 72 6f 6d 20 74 68 65 20 64  pages from the d
32210 61 74 61 62 61 73 65 2e 0a 20 20 20 20 20 20 2a  atabase..      *
32220 2f 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 2d  /.      if( pBt-
32230 3e 61 75 74 6f 56 61 63 75 75 6d 20 26 26 20 72  >autoVacuum && r
32240 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
32250 20 20 20 20 20 20 20 20 75 38 20 65 54 79 70 65          u8 eType
32260 20 3d 20 28 70 67 6e 6f 50 74 72 6d 61 70 3f 50   = (pgnoPtrmap?P
32270 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 3a  TRMAP_OVERFLOW2:
32280 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31  PTRMAP_OVERFLOW1
32290 29 3b 0a 20 20 20 20 20 20 20 20 70 74 72 6d 61  );.        ptrma
322a0 70 50 75 74 28 70 42 74 2c 20 70 67 6e 6f 4f 76  pPut(pBt, pgnoOv
322b0 66 6c 2c 20 65 54 79 70 65 2c 20 70 67 6e 6f 50  fl, eType, pgnoP
322c0 74 72 6d 61 70 2c 20 26 72 63 29 3b 0a 20 20 20  trmap, &rc);.   
322d0 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
322e0 20 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65           release
322f0 50 61 67 65 28 70 4f 76 66 6c 29 3b 0a 20 20 20  Page(pOvfl);.   
32300 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23       }.      }.#
32310 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66 28 20  endif.      if( 
32320 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  rc ){.        re
32330 6c 65 61 73 65 50 61 67 65 28 70 54 6f 52 65 6c  leasePage(pToRel
32340 65 61 73 65 29 3b 0a 20 20 20 20 20 20 20 20 72  ease);.        r
32350 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
32360 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 70  }..      /* If p
32370 54 6f 52 65 6c 65 61 73 65 20 69 73 20 6e 6f 74  ToRelease is not
32380 20 7a 65 72 6f 20 74 68 61 6e 20 70 50 72 69 6f   zero than pPrio
32390 72 20 70 6f 69 6e 74 73 20 69 6e 74 6f 20 74 68  r points into th
323a0 65 20 64 61 74 61 20 61 72 65 61 0a 20 20 20 20  e data area.    
323b0 20 20 2a 2a 20 6f 66 20 70 54 6f 52 65 6c 65 61    ** of pToRelea
323c0 73 65 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 70  se.  Make sure p
323d0 54 6f 52 65 6c 65 61 73 65 20 69 73 20 73 74 69  ToRelease is sti
323e0 6c 6c 20 77 72 69 74 65 61 62 6c 65 2e 20 2a 2f  ll writeable. */
323f0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
32400 54 6f 52 65 6c 65 61 73 65 3d 3d 30 20 7c 7c 20  ToRelease==0 || 
32410 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
32420 69 74 65 61 62 6c 65 28 70 54 6f 52 65 6c 65 61  iteable(pToRelea
32430 73 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  se->pDbPage) );.
32440 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 70 50 72  .      /* If pPr
32450 69 6f 72 20 69 73 20 70 61 72 74 20 6f 66 20 74  ior is part of t
32460 68 65 20 64 61 74 61 20 61 72 65 61 20 6f 66 20  he data area of 
32470 70 50 61 67 65 2c 20 74 68 65 6e 20 6d 61 6b 65  pPage, then make
32480 20 73 75 72 65 20 70 50 61 67 65 0a 20 20 20 20   sure pPage.    
32490 20 20 2a 2a 20 69 73 20 73 74 69 6c 6c 20 77 72    ** is still wr
324a0 69 74 65 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20  iteable */.     
324b0 20 61 73 73 65 72 74 28 20 70 50 72 69 6f 72 3c   assert( pPrior<
324c0 70 50 61 67 65 2d 3e 61 44 61 74 61 20 7c 7c 20  pPage->aData || 
324d0 70 50 72 69 6f 72 3e 3d 26 70 50 61 67 65 2d 3e  pPrior>=&pPage->
324e0 61 44 61 74 61 5b 70 42 74 2d 3e 70 61 67 65 53  aData[pBt->pageS
324f0 69 7a 65 5d 0a 20 20 20 20 20 20 20 20 20 20 20  ize].           
32500 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72   || sqlite3Pager
32510 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
32520 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a  e->pDbPage) );..
32530 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 70        put4byte(p
32540 50 72 69 6f 72 2c 20 70 67 6e 6f 4f 76 66 6c 29  Prior, pgnoOvfl)
32550 3b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  ;.      releaseP
32560 61 67 65 28 70 54 6f 52 65 6c 65 61 73 65 29 3b  age(pToRelease);
32570 0a 20 20 20 20 20 20 70 54 6f 52 65 6c 65 61 73  .      pToReleas
32580 65 20 3d 20 70 4f 76 66 6c 3b 0a 20 20 20 20 20  e = pOvfl;.     
32590 20 70 50 72 69 6f 72 20 3d 20 70 4f 76 66 6c 2d   pPrior = pOvfl-
325a0 3e 61 44 61 74 61 3b 0a 20 20 20 20 20 20 70 75  >aData;.      pu
325b0 74 34 62 79 74 65 28 70 50 72 69 6f 72 2c 20 30  t4byte(pPrior, 0
325c0 29 3b 0a 20 20 20 20 20 20 70 50 61 79 6c 6f 61  );.      pPayloa
325d0 64 20 3d 20 26 70 4f 76 66 6c 2d 3e 61 44 61 74  d = &pOvfl->aDat
325e0 61 5b 34 5d 3b 0a 20 20 20 20 20 20 73 70 61 63  a[4];.      spac
325f0 65 4c 65 66 74 20 3d 20 70 42 74 2d 3e 75 73 61  eLeft = pBt->usa
32600 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20 20  bleSize - 4;.   
32610 20 7d 0a 20 20 20 20 6e 20 3d 20 6e 50 61 79 6c   }.    n = nPayl
32620 6f 61 64 3b 0a 20 20 20 20 69 66 28 20 6e 3e 73  oad;.    if( n>s
32630 70 61 63 65 4c 65 66 74 20 29 20 6e 20 3d 20 73  paceLeft ) n = s
32640 70 61 63 65 4c 65 66 74 3b 0a 0a 20 20 20 20 2f  paceLeft;..    /
32650 2a 20 49 66 20 70 54 6f 52 65 6c 65 61 73 65 20  * If pToRelease 
32660 69 73 20 6e 6f 74 20 7a 65 72 6f 20 74 68 61 6e  is not zero than
32670 20 70 50 61 79 6c 6f 61 64 20 70 6f 69 6e 74 73   pPayload points
32680 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 20 61   into the data a
32690 72 65 61 0a 20 20 20 20 2a 2a 20 6f 66 20 70 54  rea.    ** of pT
326a0 6f 52 65 6c 65 61 73 65 2e 20 20 4d 61 6b 65 20  oRelease.  Make 
326b0 73 75 72 65 20 70 54 6f 52 65 6c 65 61 73 65 20  sure pToRelease 
326c0 69 73 20 73 74 69 6c 6c 20 77 72 69 74 65 61 62  is still writeab
326d0 6c 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  le. */.    asser
326e0 74 28 20 70 54 6f 52 65 6c 65 61 73 65 3d 3d 30  t( pToRelease==0
326f0 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72   || sqlite3Pager
32700 49 73 77 72 69 74 65 61 62 6c 65 28 70 54 6f 52  Iswriteable(pToR
32710 65 6c 65 61 73 65 2d 3e 70 44 62 50 61 67 65 29  elease->pDbPage)
32720 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70   );..    /* If p
32730 50 61 79 6c 6f 61 64 20 69 73 20 70 61 72 74 20  Payload is part 
32740 6f 66 20 74 68 65 20 64 61 74 61 20 61 72 65 61  of the data area
32750 20 6f 66 20 70 50 61 67 65 2c 20 74 68 65 6e 20   of pPage, then 
32760 6d 61 6b 65 20 73 75 72 65 20 70 50 61 67 65 0a  make sure pPage.
32770 20 20 20 20 2a 2a 20 69 73 20 73 74 69 6c 6c 20      ** is still 
32780 77 72 69 74 65 61 62 6c 65 20 2a 2f 0a 20 20 20  writeable */.   
32790 20 61 73 73 65 72 74 28 20 70 50 61 79 6c 6f 61   assert( pPayloa
327a0 64 3c 70 50 61 67 65 2d 3e 61 44 61 74 61 20 7c  d<pPage->aData |
327b0 7c 20 70 50 61 79 6c 6f 61 64 3e 3d 26 70 50 61  | pPayload>=&pPa
327c0 67 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e 70  ge->aData[pBt->p
327d0 61 67 65 53 69 7a 65 5d 0a 20 20 20 20 20 20 20  ageSize].       
327e0 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 50       || sqlite3P
327f0 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
32800 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
32810 29 3b 0a 0a 20 20 20 20 69 66 28 20 6e 53 72 63  );..    if( nSrc
32820 3e 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  >0 ){.      if( 
32830 6e 3e 6e 53 72 63 20 29 20 6e 20 3d 20 6e 53 72  n>nSrc ) n = nSr
32840 63 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  c;.      assert(
32850 20 70 53 72 63 20 29 3b 0a 20 20 20 20 20 20 6d   pSrc );.      m
32860 65 6d 63 70 79 28 70 50 61 79 6c 6f 61 64 2c 20  emcpy(pPayload, 
32870 70 53 72 63 2c 20 6e 29 3b 0a 20 20 20 20 7d 65  pSrc, n);.    }e
32880 6c 73 65 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65  lse{.      memse
32890 74 28 70 50 61 79 6c 6f 61 64 2c 20 30 2c 20 6e  t(pPayload, 0, n
328a0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 50 61  );.    }.    nPa
328b0 79 6c 6f 61 64 20 2d 3d 20 6e 3b 0a 20 20 20 20  yload -= n;.    
328c0 70 50 61 79 6c 6f 61 64 20 2b 3d 20 6e 3b 0a 20  pPayload += n;. 
328d0 20 20 20 70 53 72 63 20 2b 3d 20 6e 3b 0a 20 20     pSrc += n;.  
328e0 20 20 6e 53 72 63 20 2d 3d 20 6e 3b 0a 20 20 20    nSrc -= n;.   
328f0 20 73 70 61 63 65 4c 65 66 74 20 2d 3d 20 6e 3b   spaceLeft -= n;
32900 0a 20 20 20 20 69 66 28 20 6e 53 72 63 3d 3d 30  .    if( nSrc==0
32910 20 29 7b 0a 20 20 20 20 20 20 6e 53 72 63 20 3d   ){.      nSrc =
32920 20 6e 44 61 74 61 3b 0a 20 20 20 20 20 20 70 53   nData;.      pS
32930 72 63 20 3d 20 70 44 61 74 61 3b 0a 20 20 20 20  rc = pData;.    
32940 7d 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 50  }.  }.  releaseP
32950 61 67 65 28 70 54 6f 52 65 6c 65 61 73 65 29 3b  age(pToRelease);
32960 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
32970 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  _OK;.}../*.** Re
32980 6d 6f 76 65 20 74 68 65 20 69 2d 74 68 20 63 65  move the i-th ce
32990 6c 6c 20 66 72 6f 6d 20 70 50 61 67 65 2e 20 20  ll from pPage.  
329a0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65 66 66  This routine eff
329b0 65 63 74 73 20 70 50 61 67 65 20 6f 6e 6c 79 2e  ects pPage only.
329c0 0a 2a 2a 20 54 68 65 20 63 65 6c 6c 20 63 6f 6e  .** The cell con
329d0 74 65 6e 74 20 69 73 20 6e 6f 74 20 66 72 65 65  tent is not free
329e0 64 20 6f 72 20 64 65 61 6c 6c 6f 63 61 74 65 64  d or deallocated
329f0 2e 20 20 49 74 20 69 73 20 61 73 73 75 6d 65 64  .  It is assumed
32a00 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 63 65 6c   that.** the cel
32a10 6c 20 63 6f 6e 74 65 6e 74 20 68 61 73 20 62 65  l content has be
32a20 65 6e 20 63 6f 70 69 65 64 20 73 6f 6d 65 70 6c  en copied somepl
32a30 61 63 65 20 65 6c 73 65 2e 20 20 54 68 69 73 20  ace else.  This 
32a40 72 6f 75 74 69 6e 65 20 6a 75 73 74 0a 2a 2a 20  routine just.** 
32a50 72 65 6d 6f 76 65 73 20 74 68 65 20 72 65 66 65  removes the refe
32a60 72 65 6e 63 65 20 74 6f 20 74 68 65 20 63 65 6c  rence to the cel
32a70 6c 20 66 72 6f 6d 20 70 50 61 67 65 2e 0a 2a 2a  l from pPage..**
32a80 0a 2a 2a 20 22 73 7a 22 20 6d 75 73 74 20 62 65  .** "sz" must be
32a90 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
32aa0 79 74 65 73 20 69 6e 20 74 68 65 20 63 65 6c 6c  ytes in the cell
32ab0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
32ac0 20 64 72 6f 70 43 65 6c 6c 28 4d 65 6d 50 61 67   dropCell(MemPag
32ad0 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 69 64  e *pPage, int id
32ae0 78 2c 20 69 6e 74 20 73 7a 2c 20 69 6e 74 20 2a  x, int sz, int *
32af0 70 52 43 29 7b 0a 20 20 75 33 32 20 70 63 3b 20  pRC){.  u32 pc; 
32b00 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
32b10 74 20 74 6f 20 63 65 6c 6c 20 63 6f 6e 74 65 6e  t to cell conten
32b20 74 20 6f 66 20 63 65 6c 6c 20 62 65 69 6e 67 20  t of cell being 
32b30 64 65 6c 65 74 65 64 20 2a 2f 0a 20 20 75 38 20  deleted */.  u8 
32b40 2a 64 61 74 61 3b 20 20 20 20 20 20 20 2f 2a 20  *data;       /* 
32b50 70 50 61 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a  pPage->aData */.
32b60 20 20 75 38 20 2a 70 74 72 3b 20 20 20 20 20 20    u8 *ptr;      
32b70 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 6d 6f 76    /* Used to mov
32b80 65 20 62 79 74 65 73 20 61 72 6f 75 6e 64 20 77  e bytes around w
32b90 69 74 68 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a  ithin data[] */.
32ba0 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
32bb0 20 20 2f 2a 20 54 68 65 20 72 65 74 75 72 6e 20    /* The return 
32bc0 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 68 64  code */.  int hd
32bd0 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 42 65 67  r;        /* Beg
32be0 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 68 65  inning of the he
32bf0 61 64 65 72 2e 20 20 30 20 6d 6f 73 74 20 70 61  ader.  0 most pa
32c00 67 65 73 2e 20 20 31 30 30 20 70 61 67 65 20 31  ges.  100 page 1
32c10 20 2a 2f 0a 0a 20 20 69 66 28 20 2a 70 52 43 20   */..  if( *pRC 
32c20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 61 73 73  ) return;..  ass
32c30 65 72 74 28 20 69 64 78 3e 3d 30 20 26 26 20 69  ert( idx>=0 && i
32c40 64 78 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  dx<pPage->nCell 
32c50 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 7a 3d  );.  assert( sz=
32c60 3d 63 65 6c 6c 53 69 7a 65 28 70 50 61 67 65 2c  =cellSize(pPage,
32c70 20 69 64 78 29 20 29 3b 0a 20 20 61 73 73 65 72   idx) );.  asser
32c80 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
32c90 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
32ca0 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
32cb0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
32cc0 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
32cd0 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
32ce0 0a 20 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d  .  data = pPage-
32cf0 3e 61 44 61 74 61 3b 0a 20 20 70 74 72 20 3d 20  >aData;.  ptr = 
32d00 26 70 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64 78  &pPage->aCellIdx
32d10 5b 32 2a 69 64 78 5d 3b 0a 20 20 70 63 20 3d 20  [2*idx];.  pc = 
32d20 67 65 74 32 62 79 74 65 28 70 74 72 29 3b 0a 20  get2byte(ptr);. 
32d30 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64   hdr = pPage->hd
32d40 72 4f 66 66 73 65 74 3b 0a 20 20 74 65 73 74 63  rOffset;.  testc
32d50 61 73 65 28 20 70 63 3d 3d 67 65 74 32 62 79 74  ase( pc==get2byt
32d60 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 20  e(&data[hdr+5]) 
32d70 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70  );.  testcase( p
32d80 63 2b 73 7a 3d 3d 70 50 61 67 65 2d 3e 70 42 74  c+sz==pPage->pBt
32d90 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a  ->usableSize );.
32da0 20 20 69 66 28 20 70 63 20 3c 20 28 75 33 32 29    if( pc < (u32)
32db0 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
32dc0 64 72 2b 35 5d 29 20 7c 7c 20 70 63 2b 73 7a 20  dr+5]) || pc+sz 
32dd0 3e 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  > pPage->pBt->us
32de0 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20  ableSize ){.    
32df0 2a 70 52 43 20 3d 20 53 51 4c 49 54 45 5f 43 4f  *pRC = SQLITE_CO
32e00 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
32e10 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 72 63  return;.  }.  rc
32e20 20 3d 20 66 72 65 65 53 70 61 63 65 28 70 50 61   = freeSpace(pPa
32e30 67 65 2c 20 70 63 2c 20 73 7a 29 3b 0a 20 20 69  ge, pc, sz);.  i
32e40 66 28 20 72 63 20 29 7b 0a 20 20 20 20 2a 70 52  f( rc ){.    *pR
32e50 43 20 3d 20 72 63 3b 0a 20 20 20 20 72 65 74 75  C = rc;.    retu
32e60 72 6e 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d  rn;.  }.  pPage-
32e70 3e 6e 43 65 6c 6c 2d 2d 3b 0a 20 20 69 66 28 20  >nCell--;.  if( 
32e80 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20  pPage->nCell==0 
32e90 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 64  ){.    memset(&d
32ea0 61 74 61 5b 68 64 72 2b 31 5d 2c 20 30 2c 20 34  ata[hdr+1], 0, 4
32eb0 29 3b 0a 20 20 20 20 64 61 74 61 5b 68 64 72 2b  );.    data[hdr+
32ec0 37 5d 20 3d 20 30 3b 0a 20 20 20 20 70 75 74 32  7] = 0;.    put2
32ed0 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
32ee0 5d 2c 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75  ], pPage->pBt->u
32ef0 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20 20 20  sableSize);.    
32f00 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20 70  pPage->nFree = p
32f10 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
32f20 65 53 69 7a 65 20 2d 20 70 50 61 67 65 2d 3e 68  eSize - pPage->h
32f30 64 72 4f 66 66 73 65 74 0a 20 20 20 20 20 20 20  drOffset.       
32f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32f50 2d 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74  - pPage->childPt
32f60 72 53 69 7a 65 20 2d 20 38 3b 0a 20 20 7d 65 6c  rSize - 8;.  }el
32f70 73 65 7b 0a 20 20 20 20 6d 65 6d 6d 6f 76 65 28  se{.    memmove(
32f80 70 74 72 2c 20 70 74 72 2b 32 2c 20 32 2a 28 70  ptr, ptr+2, 2*(p
32f90 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 2d 20 69 64  Page->nCell - id
32fa0 78 29 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74  x));.    put2byt
32fb0 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 2c 20  e(&data[hdr+3], 
32fc0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a 20  pPage->nCell);. 
32fd0 20 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20     pPage->nFree 
32fe0 2b 3d 20 32 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  += 2;.  }.}../*.
32ff0 2a 2a 20 49 6e 73 65 72 74 20 61 20 6e 65 77 20  ** Insert a new 
33000 63 65 6c 6c 20 6f 6e 20 70 50 61 67 65 20 61 74  cell on pPage at
33010 20 63 65 6c 6c 20 69 6e 64 65 78 20 22 69 22 2e   cell index "i".
33020 20 20 70 43 65 6c 6c 20 70 6f 69 6e 74 73 20 74    pCell points t
33030 6f 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74  o the.** content
33040 20 6f 66 20 74 68 65 20 63 65 6c 6c 2e 0a 2a 2a   of the cell..**
33050 0a 2a 2a 20 49 66 20 74 68 65 20 63 65 6c 6c 20  .** If the cell 
33060 63 6f 6e 74 65 6e 74 20 77 69 6c 6c 20 66 69 74  content will fit
33070 20 6f 6e 20 74 68 65 20 70 61 67 65 2c 20 74 68   on the page, th
33080 65 6e 20 70 75 74 20 69 74 20 74 68 65 72 65 2e  en put it there.
33090 20 20 49 66 20 69 74 0a 2a 2a 20 77 69 6c 6c 20    If it.** will 
330a0 6e 6f 74 20 66 69 74 2c 20 74 68 65 6e 20 6d 61  not fit, then ma
330b0 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  ke a copy of the
330c0 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 6e   cell content in
330d0 74 6f 20 70 54 65 6d 70 20 69 66 0a 2a 2a 20 70  to pTemp if.** p
330e0 54 65 6d 70 20 69 73 20 6e 6f 74 20 6e 75 6c 6c  Temp is not null
330f0 2e 20 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66  .  Regardless of
33100 20 70 54 65 6d 70 2c 20 61 6c 6c 6f 63 61 74 65   pTemp, allocate
33110 20 61 20 6e 65 77 20 65 6e 74 72 79 0a 2a 2a 20   a new entry.** 
33120 69 6e 20 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c  in pPage->apOvfl
33130 5b 5d 20 61 6e 64 20 6d 61 6b 65 20 69 74 20 70  [] and make it p
33140 6f 69 6e 74 20 74 6f 20 74 68 65 20 63 65 6c 6c  oint to the cell
33150 20 63 6f 6e 74 65 6e 74 20 28 65 69 74 68 65 72   content (either
33160 0a 2a 2a 20 69 6e 20 70 54 65 6d 70 20 6f 72 20  .** in pTemp or 
33170 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 43 65  the original pCe
33180 6c 6c 29 20 61 6e 64 20 61 6c 73 6f 20 72 65 63  ll) and also rec
33190 6f 72 64 20 69 74 73 20 69 6e 64 65 78 2e 20 0a  ord its index. .
331a0 2a 2a 20 41 6c 6c 6f 63 61 74 69 6e 67 20 61 20  ** Allocating a 
331b0 6e 65 77 20 65 6e 74 72 79 20 69 6e 20 70 50 61  new entry in pPa
331c0 67 65 2d 3e 61 43 65 6c 6c 5b 5d 20 69 6d 70 6c  ge->aCell[] impl
331d0 69 65 73 20 74 68 61 74 20 0a 2a 2a 20 70 50 61  ies that .** pPa
331e0 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 69 73  ge->nOverflow is
331f0 20 69 6e 63 72 65 6d 65 6e 74 65 64 2e 0a 2a 2f   incremented..*/
33200 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69 6e 73  .static void ins
33210 65 72 74 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61  ertCell(.  MemPa
33220 67 65 20 2a 70 50 61 67 65 2c 20 20 20 2f 2a 20  ge *pPage,   /* 
33230 50 61 67 65 20 69 6e 74 6f 20 77 68 69 63 68 20  Page into which 
33240 77 65 20 61 72 65 20 63 6f 70 79 69 6e 67 20 2a  we are copying *
33250 2f 0a 20 20 69 6e 74 20 69 2c 20 20 20 20 20 20  /.  int i,      
33260 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 63 65 6c        /* New cel
33270 6c 20 62 65 63 6f 6d 65 73 20 74 68 65 20 69 2d  l becomes the i-
33280 74 68 20 63 65 6c 6c 20 6f 66 20 74 68 65 20 70  th cell of the p
33290 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65  age */.  u8 *pCe
332a0 6c 6c 2c 20 20 20 20 20 20 20 20 2f 2a 20 43 6f  ll,        /* Co
332b0 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 6e 65 77  ntent of the new
332c0 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 73   cell */.  int s
332d0 7a 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  z,           /* 
332e0 42 79 74 65 73 20 6f 66 20 63 6f 6e 74 65 6e 74  Bytes of content
332f0 20 69 6e 20 70 43 65 6c 6c 20 2a 2f 0a 20 20 75   in pCell */.  u
33300 38 20 2a 70 54 65 6d 70 2c 20 20 20 20 20 20 20  8 *pTemp,       
33310 20 2f 2a 20 54 65 6d 70 20 73 74 6f 72 61 67 65   /* Temp storage
33320 20 73 70 61 63 65 20 66 6f 72 20 70 43 65 6c 6c   space for pCell
33330 2c 20 69 66 20 6e 65 65 64 65 64 20 2a 2f 0a 20  , if needed */. 
33340 20 50 67 6e 6f 20 69 43 68 69 6c 64 2c 20 20 20   Pgno iChild,   
33350 20 20 20 2f 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72     /* If non-zer
33360 6f 2c 20 72 65 70 6c 61 63 65 20 66 69 72 73 74  o, replace first
33370 20 34 20 62 79 74 65 73 20 77 69 74 68 20 74 68   4 bytes with th
33380 69 73 20 76 61 6c 75 65 20 2a 2f 0a 20 20 69 6e  is value */.  in
33390 74 20 2a 70 52 43 20 20 20 20 20 20 20 20 20 20  t *pRC          
333a0 2f 2a 20 52 65 61 64 20 61 6e 64 20 77 72 69 74  /* Read and writ
333b0 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 66 72  e return code fr
333c0 6f 6d 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  om here */.){.  
333d0 69 6e 74 20 69 64 78 20 3d 20 30 3b 20 20 20 20  int idx = 0;    
333e0 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 77 72    /* Where to wr
333f0 69 74 65 20 6e 65 77 20 63 65 6c 6c 20 63 6f 6e  ite new cell con
33400 74 65 6e 74 20 69 6e 20 64 61 74 61 5b 5d 20 2a  tent in data[] *
33410 2f 0a 20 20 69 6e 74 20 6a 3b 20 20 20 20 20 20  /.  int j;      
33420 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
33430 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 65  unter */.  int e
33440 6e 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  nd;          /* 
33450 46 69 72 73 74 20 62 79 74 65 20 70 61 73 74 20  First byte past 
33460 74 68 65 20 6c 61 73 74 20 63 65 6c 6c 20 70 6f  the last cell po
33470 69 6e 74 65 72 20 69 6e 20 64 61 74 61 5b 5d 20  inter in data[] 
33480 2a 2f 0a 20 20 69 6e 74 20 69 6e 73 3b 20 20 20  */.  int ins;   
33490 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
334a0 69 6e 20 64 61 74 61 5b 5d 20 77 68 65 72 65 20  in data[] where 
334b0 6e 65 77 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  new cell pointer
334c0 20 69 73 20 69 6e 73 65 72 74 65 64 20 2a 2f 0a   is inserted */.
334d0 20 20 69 6e 74 20 63 65 6c 6c 4f 66 66 73 65 74    int cellOffset
334e0 3b 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f  ;   /* Address o
334f0 66 20 66 69 72 73 74 20 63 65 6c 6c 20 70 6f 69  f first cell poi
33500 6e 74 65 72 20 69 6e 20 64 61 74 61 5b 5d 20 2a  nter in data[] *
33510 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b 20 20 20  /.  u8 *data;   
33520 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e        /* The con
33530 74 65 6e 74 20 6f 66 20 74 68 65 20 77 68 6f 6c  tent of the whol
33540 65 20 70 61 67 65 20 2a 2f 0a 0a 20 20 69 66 28  e page */..  if(
33550 20 2a 70 52 43 20 29 20 72 65 74 75 72 6e 3b 0a   *pRC ) return;.
33560 0a 20 20 61 73 73 65 72 74 28 20 69 3e 3d 30 20  .  assert( i>=0 
33570 26 26 20 69 3c 3d 70 50 61 67 65 2d 3e 6e 43 65  && i<=pPage->nCe
33580 6c 6c 2b 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  ll+pPage->nOverf
33590 6c 6f 77 20 29 3b 0a 20 20 61 73 73 65 72 74 28  low );.  assert(
335a0 20 4d 58 5f 43 45 4c 4c 28 70 50 61 67 65 2d 3e   MX_CELL(pPage->
335b0 70 42 74 29 3c 3d 31 30 39 32 31 20 29 3b 0a 20  pBt)<=10921 );. 
335c0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
335d0 6e 43 65 6c 6c 3c 3d 4d 58 5f 43 45 4c 4c 28 70  nCell<=MX_CELL(p
335e0 50 61 67 65 2d 3e 70 42 74 29 20 7c 7c 20 43 4f  Page->pBt) || CO
335f0 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 61 73  RRUPT_DB );.  as
33600 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76  sert( pPage->nOv
33610 65 72 66 6c 6f 77 3c 3d 41 72 72 61 79 53 69 7a  erflow<=ArraySiz
33620 65 28 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c 29  e(pPage->apOvfl)
33630 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 41 72   );.  assert( Ar
33640 72 61 79 53 69 7a 65 28 70 50 61 67 65 2d 3e 61  raySize(pPage->a
33650 70 4f 76 66 6c 29 3d 3d 41 72 72 61 79 53 69 7a  pOvfl)==ArraySiz
33660 65 28 70 50 61 67 65 2d 3e 61 69 4f 76 66 6c 29  e(pPage->aiOvfl)
33670 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
33680 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
33690 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
336a0 65 78 29 20 29 3b 0a 20 20 2f 2a 20 54 68 65 20  ex) );.  /* The 
336b0 63 65 6c 6c 20 73 68 6f 75 6c 64 20 6e 6f 72 6d  cell should norm
336c0 61 6c 6c 79 20 62 65 20 73 69 7a 65 64 20 63 6f  ally be sized co
336d0 72 72 65 63 74 6c 79 2e 20 20 48 6f 77 65 76 65  rrectly.  Howeve
336e0 72 2c 20 77 68 65 6e 20 6d 6f 76 69 6e 67 20 61  r, when moving a
336f0 0a 20 20 2a 2a 20 6d 61 6c 66 6f 72 6d 65 64 20  .  ** malformed 
33700 63 65 6c 6c 20 66 72 6f 6d 20 61 20 6c 65 61 66  cell from a leaf
33710 20 70 61 67 65 20 74 6f 20 61 6e 20 69 6e 74 65   page to an inte
33720 72 69 6f 72 20 70 61 67 65 2c 20 69 66 20 74 68  rior page, if th
33730 65 20 63 65 6c 6c 20 73 69 7a 65 0a 20 20 2a 2a  e cell size.  **
33740 20 77 61 6e 74 65 64 20 74 6f 20 62 65 20 6c 65   wanted to be le
33750 73 73 20 74 68 61 6e 20 34 20 62 75 74 20 67 6f  ss than 4 but go
33760 74 20 72 6f 75 6e 64 65 64 20 75 70 20 74 6f 20  t rounded up to 
33770 34 20 6f 6e 20 74 68 65 20 6c 65 61 66 2c 20 74  4 on the leaf, t
33780 68 65 6e 20 73 69 7a 65 0a 20 20 2a 2a 20 6d 69  hen size.  ** mi
33790 67 68 74 20 62 65 20 6c 65 73 73 20 74 68 61 6e  ght be less than
337a0 20 38 20 28 6c 65 61 66 2d 73 69 7a 65 20 2b 20   8 (leaf-size + 
337b0 70 6f 69 6e 74 65 72 29 20 6f 6e 20 74 68 65 20  pointer) on the 
337c0 69 6e 74 65 72 69 6f 72 20 6e 6f 64 65 2e 20 20  interior node.  
337d0 48 65 6e 63 65 0a 20 20 2a 2a 20 74 68 65 20 74  Hence.  ** the t
337e0 65 72 6d 20 61 66 74 65 72 20 74 68 65 20 7c 7c  erm after the ||
337f0 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   in the followin
33800 67 20 61 73 73 65 72 74 28 29 2e 20 2a 2f 0a 20  g assert(). */. 
33810 20 61 73 73 65 72 74 28 20 73 7a 3d 3d 63 65 6c   assert( sz==cel
33820 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20  lSizePtr(pPage, 
33830 70 43 65 6c 6c 29 20 7c 7c 20 28 73 7a 3d 3d 38  pCell) || (sz==8
33840 20 26 26 20 69 43 68 69 6c 64 3e 30 29 20 29 3b   && iChild>0) );
33850 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 4f  .  if( pPage->nO
33860 76 65 72 66 6c 6f 77 20 7c 7c 20 73 7a 2b 32 3e  verflow || sz+2>
33870 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 29 7b 0a  pPage->nFree ){.
33880 20 20 20 20 69 66 28 20 70 54 65 6d 70 20 29 7b      if( pTemp ){
33890 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 54  .      memcpy(pT
338a0 65 6d 70 2c 20 70 43 65 6c 6c 2c 20 73 7a 29 3b  emp, pCell, sz);
338b0 0a 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 70  .      pCell = p
338c0 54 65 6d 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Temp;.    }.    
338d0 69 66 28 20 69 43 68 69 6c 64 20 29 7b 0a 20 20  if( iChild ){.  
338e0 20 20 20 20 70 75 74 34 62 79 74 65 28 70 43 65      put4byte(pCe
338f0 6c 6c 2c 20 69 43 68 69 6c 64 29 3b 0a 20 20 20  ll, iChild);.   
33900 20 7d 0a 20 20 20 20 6a 20 3d 20 70 50 61 67 65   }.    j = pPage
33910 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2b 2b 3b 0a 20  ->nOverflow++;. 
33920 20 20 20 61 73 73 65 72 74 28 20 6a 3c 28 69 6e     assert( j<(in
33930 74 29 28 73 69 7a 65 6f 66 28 70 50 61 67 65 2d  t)(sizeof(pPage-
33940 3e 61 70 4f 76 66 6c 29 2f 73 69 7a 65 6f 66 28  >apOvfl)/sizeof(
33950 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c 5b 30 5d  pPage->apOvfl[0]
33960 29 29 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d  )) );.    pPage-
33970 3e 61 70 4f 76 66 6c 5b 6a 5d 20 3d 20 70 43 65  >apOvfl[j] = pCe
33980 6c 6c 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 61  ll;.    pPage->a
33990 69 4f 76 66 6c 5b 6a 5d 20 3d 20 28 75 31 36 29  iOvfl[j] = (u16)
339a0 69 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  i;.  }else{.    
339b0 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33  int rc = sqlite3
339c0 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65  PagerWrite(pPage
339d0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
339e0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
339f0 4b 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 43 20  K ){.      *pRC 
33a00 3d 20 72 63 3b 0a 20 20 20 20 20 20 72 65 74 75  = rc;.      retu
33a10 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  rn;.    }.    as
33a20 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
33a30 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
33a40 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
33a50 0a 20 20 20 20 64 61 74 61 20 3d 20 70 50 61 67  .    data = pPag
33a60 65 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 63 65  e->aData;.    ce
33a70 6c 6c 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65  llOffset = pPage
33a80 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20  ->cellOffset;.  
33a90 20 20 65 6e 64 20 3d 20 63 65 6c 6c 4f 66 66 73    end = cellOffs
33aa0 65 74 20 2b 20 32 2a 70 50 61 67 65 2d 3e 6e 43  et + 2*pPage->nC
33ab0 65 6c 6c 3b 0a 20 20 20 20 69 6e 73 20 3d 20 63  ell;.    ins = c
33ac0 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 69 3b  ellOffset + 2*i;
33ad0 0a 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61  .    rc = alloca
33ae0 74 65 53 70 61 63 65 28 70 50 61 67 65 2c 20 73  teSpace(pPage, s
33af0 7a 2c 20 26 69 64 78 29 3b 0a 20 20 20 20 69 66  z, &idx);.    if
33b00 28 20 72 63 20 29 7b 20 2a 70 52 43 20 3d 20 72  ( rc ){ *pRC = r
33b10 63 3b 20 72 65 74 75 72 6e 3b 20 7d 0a 20 20 20  c; return; }.   
33b20 20 2f 2a 20 54 68 65 20 61 6c 6c 6f 63 61 74 65   /* The allocate
33b30 53 70 61 63 65 28 29 20 72 6f 75 74 69 6e 65 20  Space() routine 
33b40 67 75 61 72 61 6e 74 65 65 73 20 74 68 65 20 66  guarantees the f
33b50 6f 6c 6c 6f 77 69 6e 67 20 74 77 6f 20 70 72 6f  ollowing two pro
33b60 70 65 72 74 69 65 73 0a 20 20 20 20 2a 2a 20 69  perties.    ** i
33b70 66 20 69 74 20 72 65 74 75 72 6e 73 20 73 75 63  f it returns suc
33b80 63 65 73 73 20 2a 2f 0a 20 20 20 20 61 73 73 65  cess */.    asse
33b90 72 74 28 20 69 64 78 20 3e 3d 20 65 6e 64 2b 32  rt( idx >= end+2
33ba0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
33bb0 69 64 78 2b 73 7a 20 3c 3d 20 28 69 6e 74 29 70  idx+sz <= (int)p
33bc0 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
33bd0 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 70 50 61  eSize );.    pPa
33be0 67 65 2d 3e 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20  ge->nCell++;.   
33bf0 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2d 3d   pPage->nFree -=
33c00 20 28 75 31 36 29 28 32 20 2b 20 73 7a 29 3b 0a   (u16)(2 + sz);.
33c10 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61      memcpy(&data
33c20 5b 69 64 78 5d 2c 20 70 43 65 6c 6c 2c 20 73 7a  [idx], pCell, sz
33c30 29 3b 0a 20 20 20 20 69 66 28 20 69 43 68 69 6c  );.    if( iChil
33c40 64 20 29 7b 0a 20 20 20 20 20 20 70 75 74 34 62  d ){.      put4b
33c50 79 74 65 28 26 64 61 74 61 5b 69 64 78 5d 2c 20  yte(&data[idx], 
33c60 69 43 68 69 6c 64 29 3b 0a 20 20 20 20 7d 0a 20  iChild);.    }. 
33c70 20 20 20 6d 65 6d 6d 6f 76 65 28 26 64 61 74 61     memmove(&data
33c80 5b 69 6e 73 2b 32 5d 2c 20 26 64 61 74 61 5b 69  [ins+2], &data[i
33c90 6e 73 5d 2c 20 65 6e 64 2d 69 6e 73 29 3b 0a 20  ns], end-ins);. 
33ca0 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74     put2byte(&dat
33cb0 61 5b 69 6e 73 5d 2c 20 69 64 78 29 3b 0a 20 20  a[ins], idx);.  
33cc0 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
33cd0 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
33ce0 74 2b 33 5d 2c 20 70 50 61 67 65 2d 3e 6e 43 65  t+3], pPage->nCe
33cf0 6c 6c 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  ll);.#ifndef SQL
33d00 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
33d10 55 55 4d 0a 20 20 20 20 69 66 28 20 70 50 61 67  UUM.    if( pPag
33d20 65 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  e->pBt->autoVacu
33d30 75 6d 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  um ){.      /* T
33d40 68 65 20 63 65 6c 6c 20 6d 61 79 20 63 6f 6e 74  he cell may cont
33d50 61 69 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ain a pointer to
33d60 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
33d70 65 2e 20 49 66 20 73 6f 2c 20 77 72 69 74 65 0a  e. If so, write.
33d80 20 20 20 20 20 20 2a 2a 20 74 68 65 20 65 6e 74        ** the ent
33d90 72 79 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66  ry for the overf
33da0 6c 6f 77 20 70 61 67 65 20 69 6e 74 6f 20 74 68  low page into th
33db0 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 20  e pointer map.. 
33dc0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 74       */.      pt
33dd0 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28 70  rmapPutOvflPtr(p
33de0 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 70 52 43  Page, pCell, pRC
33df0 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
33e00 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 72    }.}../*.** Arr
33e10 61 79 20 61 70 43 65 6c 6c 5b 5d 20 63 6f 6e 74  ay apCell[] cont
33e20 61 69 6e 73 20 70 6f 69 6e 74 65 72 73 20 74 6f  ains pointers to
33e30 20 6e 43 65 6c 6c 20 62 2d 74 72 65 65 20 70 61   nCell b-tree pa
33e40 67 65 20 63 65 6c 6c 73 2e 20 54 68 65 20 0a 2a  ge cells. The .*
33e50 2a 20 73 7a 43 65 6c 6c 5b 5d 20 61 72 72 61 79  * szCell[] array
33e60 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 73 69   contains the si
33e70 7a 65 20 69 6e 20 62 79 74 65 73 20 6f 66 20 65  ze in bytes of e
33e80 61 63 68 20 63 65 6c 6c 2e 20 54 68 69 73 20 66  ach cell. This f
33e90 75 6e 63 74 69 6f 6e 0a 2a 2a 20 72 65 70 6c 61  unction.** repla
33ea0 63 65 73 20 74 68 65 20 63 75 72 72 65 6e 74 20  ces the current 
33eb0 63 6f 6e 74 65 6e 74 73 20 6f 66 20 70 61 67 65  contents of page
33ec0 20 70 50 67 20 77 69 74 68 20 74 68 65 20 63 6f   pPg with the co
33ed0 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 63 65  ntents of the ce
33ee0 6c 6c 0a 2a 2a 20 61 72 72 61 79 2e 0a 2a 2a 0a  ll.** array..**.
33ef0 2a 2a 20 53 6f 6d 65 20 6f 66 20 74 68 65 20 63  ** Some of the c
33f00 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d  ells in apCell[]
33f10 20 6d 61 79 20 63 75 72 72 65 6e 74 6c 79 20 62   may currently b
33f20 65 20 73 74 6f 72 65 64 20 69 6e 20 70 50 67 2e  e stored in pPg.
33f30 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f   This.** functio
33f40 6e 20 77 6f 72 6b 73 20 61 72 6f 75 6e 64 20 70  n works around p
33f50 72 6f 62 6c 65 6d 73 20 63 61 75 73 65 64 20 62  roblems caused b
33f60 79 20 74 68 69 73 20 62 79 20 6d 61 6b 69 6e 67  y this by making
33f70 20 61 20 63 6f 70 79 20 6f 66 20 61 6e 79 20 0a   a copy of any .
33f80 2a 2a 20 73 75 63 68 20 63 65 6c 6c 73 20 62 65  ** such cells be
33f90 66 6f 72 65 20 6f 76 65 72 77 72 69 74 69 6e 67  fore overwriting
33fa0 20 74 68 65 20 70 61 67 65 20 64 61 74 61 2e 0a   the page data..
33fb0 2a 2a 0a 2a 2a 20 54 68 65 20 4d 65 6d 50 61 67  **.** The MemPag
33fc0 65 2e 6e 46 72 65 65 20 66 69 65 6c 64 20 69 73  e.nFree field is
33fd0 20 69 6e 76 61 6c 69 64 61 74 65 64 20 62 79 20   invalidated by 
33fe0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 49  this function. I
33ff0 74 20 69 73 20 74 68 65 20 0a 2a 2a 20 72 65 73  t is the .** res
34000 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74  ponsibility of t
34010 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 73 65 74  he caller to set
34020 20 69 74 20 63 6f 72 72 65 63 74 6c 79 2e 0a 2a   it correctly..*
34030 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65  /.static void re
34040 62 75 69 6c 64 50 61 67 65 28 0a 20 20 4d 65 6d  buildPage(.  Mem
34050 50 61 67 65 20 2a 70 50 67 2c 20 20 20 20 20 20  Page *pPg,      
34060 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
34070 45 64 69 74 20 74 68 69 73 20 70 61 67 65 20 2a  Edit this page *
34080 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 2c 20 20  /.  int nCell,  
34090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
340a0 20 20 20 20 2f 2a 20 46 69 6e 61 6c 20 6e 75 6d      /* Final num
340b0 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 6f 6e 20  ber of cells on 
340c0 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 61  page */.  u8 **a
340d0 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20  pCell,          
340e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72            /* Arr
340f0 61 79 20 6f 66 20 63 65 6c 6c 73 20 2a 2f 0a 20  ay of cells */. 
34100 20 75 31 36 20 2a 73 7a 43 65 6c 6c 20 20 20 20   u16 *szCell    
34110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34120 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 63 65 6c   /* Array of cel
34130 6c 20 73 69 7a 65 73 20 2a 2f 0a 29 7b 0a 20 20  l sizes */.){.  
34140 63 6f 6e 73 74 20 69 6e 74 20 68 64 72 20 3d 20  const int hdr = 
34150 70 50 67 2d 3e 68 64 72 4f 66 66 73 65 74 3b 20  pPg->hdrOffset; 
34160 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
34170 65 74 20 6f 66 20 68 65 61 64 65 72 20 6f 6e 20  et of header on 
34180 70 50 67 20 2a 2f 0a 20 20 75 38 20 2a 20 63 6f  pPg */.  u8 * co
34190 6e 73 74 20 61 44 61 74 61 20 3d 20 70 50 67 2d  nst aData = pPg-
341a0 3e 61 44 61 74 61 3b 20 20 20 20 20 20 20 20 20  >aData;         
341b0 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
341c0 64 61 74 61 20 66 6f 72 20 70 50 67 20 2a 2f 0a  data for pPg */.
341d0 20 20 63 6f 6e 73 74 20 69 6e 74 20 75 73 61 62    const int usab
341e0 6c 65 53 69 7a 65 20 3d 20 70 50 67 2d 3e 70 42  leSize = pPg->pB
341f0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20  t->usableSize;. 
34200 20 75 38 20 2a 20 63 6f 6e 73 74 20 70 45 6e 64   u8 * const pEnd
34210 20 3d 20 26 61 44 61 74 61 5b 75 73 61 62 6c 65   = &aData[usable
34220 53 69 7a 65 5d 3b 0a 20 20 69 6e 74 20 69 3b 0a  Size];.  int i;.
34230 20 20 75 38 20 2a 70 43 65 6c 6c 70 74 72 20 3d    u8 *pCellptr =
34240 20 70 50 67 2d 3e 61 43 65 6c 6c 49 64 78 3b 0a   pPg->aCellIdx;.
34250 20 20 75 38 20 2a 70 54 6d 70 20 3d 20 73 71 6c    u8 *pTmp = sql
34260 69 74 65 33 50 61 67 65 72 54 65 6d 70 53 70 61  ite3PagerTempSpa
34270 63 65 28 70 50 67 2d 3e 70 42 74 2d 3e 70 50 61  ce(pPg->pBt->pPa
34280 67 65 72 29 3b 0a 20 20 75 38 20 2a 70 44 61 74  ger);.  u8 *pDat
34290 61 3b 0a 0a 20 20 69 20 3d 20 67 65 74 32 62 79  a;..  i = get2by
342a0 74 65 28 26 61 44 61 74 61 5b 68 64 72 2b 35 5d  te(&aData[hdr+5]
342b0 29 3b 0a 20 20 6d 65 6d 63 70 79 28 26 70 54 6d  );.  memcpy(&pTm
342c0 70 5b 69 5d 2c 20 26 61 44 61 74 61 5b 69 5d 2c  p[i], &aData[i],
342d0 20 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 69 29   usableSize - i)
342e0 3b 0a 0a 20 20 70 44 61 74 61 20 3d 20 70 45 6e  ;..  pData = pEn
342f0 64 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  d;.  for(i=0; i<
34300 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  nCell; i++){.   
34310 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20 61 70 43   u8 *pCell = apC
34320 65 6c 6c 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20  ell[i];.    if( 
34330 70 43 65 6c 6c 3e 61 44 61 74 61 20 26 26 20 70  pCell>aData && p
34340 43 65 6c 6c 3c 70 45 6e 64 20 29 7b 0a 20 20 20  Cell<pEnd ){.   
34350 20 20 20 70 43 65 6c 6c 20 3d 20 26 70 54 6d 70     pCell = &pTmp
34360 5b 70 43 65 6c 6c 20 2d 20 61 44 61 74 61 5d 3b  [pCell - aData];
34370 0a 20 20 20 20 7d 0a 20 20 20 20 70 44 61 74 61  .    }.    pData
34380 20 2d 3d 20 73 7a 43 65 6c 6c 5b 69 5d 3b 0a 20   -= szCell[i];. 
34390 20 20 20 6d 65 6d 63 70 79 28 70 44 61 74 61 2c     memcpy(pData,
343a0 20 70 43 65 6c 6c 2c 20 73 7a 43 65 6c 6c 5b 69   pCell, szCell[i
343b0 5d 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65  ]);.    put2byte
343c0 28 70 43 65 6c 6c 70 74 72 2c 20 28 70 44 61 74  (pCellptr, (pDat
343d0 61 20 2d 20 61 44 61 74 61 29 29 3b 0a 20 20 20  a - aData));.   
343e0 20 70 43 65 6c 6c 70 74 72 20 2b 3d 20 32 3b 0a   pCellptr += 2;.
343f0 20 20 20 20 61 73 73 65 72 74 28 20 73 7a 43 65      assert( szCe
34400 6c 6c 5b 69 5d 3d 3d 63 65 6c 6c 53 69 7a 65 50  ll[i]==cellSizeP
34410 74 72 28 70 50 67 2c 20 70 43 65 6c 6c 29 20 7c  tr(pPg, pCell) |
34420 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a  | CORRUPT_DB );.
34430 20 20 20 20 74 65 73 74 63 61 73 65 28 20 73 7a      testcase( sz
34440 43 65 6c 6c 5b 69 5d 3d 3d 63 65 6c 6c 53 69 7a  Cell[i]==cellSiz
34450 65 50 74 72 28 70 50 67 2c 70 43 65 6c 6c 29 20  ePtr(pPg,pCell) 
34460 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65  );.  }..  /* The
34470 20 70 50 67 2d 3e 6e 46 72 65 65 20 66 69 65 6c   pPg->nFree fiel
34480 64 20 69 73 20 6e 6f 77 20 73 65 74 20 69 6e 63  d is now set inc
34490 6f 72 72 65 63 74 6c 79 2e 20 54 68 65 20 63 61  orrectly. The ca
344a0 6c 6c 65 72 20 77 69 6c 6c 20 66 69 78 20 69 74  ller will fix it
344b0 2e 20 2a 2f 0a 20 20 70 50 67 2d 3e 6e 43 65 6c  . */.  pPg->nCel
344c0 6c 20 3d 20 6e 43 65 6c 6c 3b 0a 20 20 70 50 67  l = nCell;.  pPg
344d0 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b  ->nOverflow = 0;
344e0 0a 0a 20 20 70 75 74 32 62 79 74 65 28 26 61 44  ..  put2byte(&aD
344f0 61 74 61 5b 68 64 72 2b 31 5d 2c 20 30 29 3b 0a  ata[hdr+1], 0);.
34500 20 20 70 75 74 32 62 79 74 65 28 26 61 44 61 74    put2byte(&aDat
34510 61 5b 68 64 72 2b 33 5d 2c 20 70 50 67 2d 3e 6e  a[hdr+3], pPg->n
34520 43 65 6c 6c 29 3b 0a 20 20 70 75 74 32 62 79 74  Cell);.  put2byt
34530 65 28 26 61 44 61 74 61 5b 68 64 72 2b 35 5d 2c  e(&aData[hdr+5],
34540 20 70 44 61 74 61 20 2d 20 61 44 61 74 61 29 3b   pData - aData);
34550 0a 20 20 61 44 61 74 61 5b 68 64 72 2b 37 5d 20  .  aData[hdr+7] 
34560 3d 20 30 78 30 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  = 0x00;.}../*.**
34570 20 41 72 72 61 79 20 61 70 43 65 6c 6c 5b 5d 20   Array apCell[] 
34580 63 6f 6e 74 61 69 6e 73 20 6e 43 65 6c 6c 20 70  contains nCell p
34590 6f 69 6e 74 65 72 73 20 74 6f 20 62 2d 74 72 65  ointers to b-tre
345a0 65 20 63 65 6c 6c 73 2e 20 41 72 72 61 79 20 73  e cells. Array s
345b0 7a 43 65 6c 6c 0a 2a 2a 20 63 6f 6e 74 61 69 6e  zCell.** contain
345c0 73 20 74 68 65 20 73 69 7a 65 20 69 6e 20 62 79  s the size in by
345d0 74 65 73 20 6f 66 20 65 61 63 68 20 73 75 63 68  tes of each such
345e0 20 63 65 6c 6c 2e 20 54 68 69 73 20 66 75 6e 63   cell. This func
345f0 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74 6f  tion attempts to
34600 20 0a 2a 2a 20 61 64 64 20 74 68 65 20 63 65 6c   .** add the cel
34610 6c 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  ls stored in the
34620 20 61 72 72 61 79 20 74 6f 20 70 61 67 65 20 70   array to page p
34630 50 67 2e 20 49 66 20 69 74 20 63 61 6e 6e 6f 74  Pg. If it cannot
34640 20 28 62 65 63 61 75 73 65 20 0a 2a 2a 20 74 68   (because .** th
34650 65 20 70 61 67 65 20 6e 65 65 64 73 20 74 6f 20  e page needs to 
34660 62 65 20 64 65 66 72 61 67 6d 65 6e 74 65 64 20  be defragmented 
34670 62 65 66 6f 72 65 20 74 68 65 20 63 65 6c 6c 73  before the cells
34680 20 77 69 6c 6c 20 66 69 74 29 2c 20 6e 6f 6e 2d   will fit), non-
34690 7a 65 72 6f 0a 2a 2a 20 69 73 20 72 65 74 75 72  zero.** is retur
346a0 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ned. Otherwise, 
346b0 69 66 20 74 68 65 20 63 65 6c 6c 73 20 61 72 65  if the cells are
346c0 20 61 64 64 65 64 20 73 75 63 63 65 73 73 66 75   added successfu
346d0 6c 6c 79 2c 20 7a 65 72 6f 20 69 73 0a 2a 2a 20  lly, zero is.** 
346e0 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
346f0 41 72 67 75 6d 65 6e 74 20 70 43 65 6c 6c 70 74  Argument pCellpt
34700 72 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  r points to the 
34710 66 69 72 73 74 20 65 6e 74 72 79 20 69 6e 20 74  first entry in t
34720 68 65 20 63 65 6c 6c 2d 70 6f 69 6e 74 65 72 20  he cell-pointer 
34730 61 72 72 61 79 0a 2a 2a 20 28 70 61 72 74 20 6f  array.** (part o
34740 66 20 70 61 67 65 20 70 50 67 29 20 74 6f 20 70  f page pPg) to p
34750 6f 70 75 6c 61 74 65 2e 20 41 66 74 65 72 20 63  opulate. After c
34760 65 6c 6c 20 61 70 43 65 6c 6c 5b 30 5d 20 69 73  ell apCell[0] is
34770 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 0a   written to the.
34780 2a 2a 20 70 61 67 65 20 62 6f 64 79 2c 20 61 20  ** page body, a 
34790 31 36 2d 62 69 74 20 6f 66 66 73 65 74 20 69 73  16-bit offset is
347a0 20 77 72 69 74 74 65 6e 20 74 6f 20 70 43 65 6c   written to pCel
347b0 6c 70 74 72 2e 20 41 6e 64 20 73 6f 20 6f 6e 2c  lptr. And so on,
347c0 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20 63 65 6c   for each.** cel
347d0 6c 20 69 6e 20 74 68 65 20 61 72 72 61 79 2e 20  l in the array. 
347e0 49 74 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e  It is the respon
347f0 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20  sibility of the 
34800 63 61 6c 6c 65 72 20 74 6f 20 65 6e 73 75 72 65  caller to ensure
34810 0a 2a 2a 20 74 68 61 74 20 69 74 20 69 73 20 73  .** that it is s
34820 61 66 65 20 74 6f 20 6f 76 65 72 77 72 69 74 65  afe to overwrite
34830 20 74 68 69 73 20 70 61 72 74 20 6f 66 20 74 68   this part of th
34840 65 20 63 65 6c 6c 2d 70 6f 69 6e 74 65 72 20 61  e cell-pointer a
34850 72 72 61 79 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  rray..**.** When
34860 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
34870 73 20 63 61 6c 6c 65 64 2c 20 2a 70 70 44 61 74  s called, *ppDat
34880 61 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  a points to the 
34890 73 74 61 72 74 20 6f 66 20 74 68 65 20 0a 2a 2a  start of the .**
348a0 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 6f 6e   content area on
348b0 20 70 61 67 65 20 70 50 67 2e 20 49 66 20 74 68   page pPg. If th
348c0 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 63 6f  e size of the co
348d0 6e 74 65 6e 74 20 61 72 65 61 20 69 73 20 65 78  ntent area is ex
348e0 74 65 6e 64 65 64 2c 0a 2a 2a 20 2a 70 70 44 61  tended,.** *ppDa
348f0 74 61 20 69 73 20 75 70 64 61 74 65 64 20 74 6f  ta is updated to
34900 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6e 65   point to the ne
34910 77 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 63  w start of the c
34920 6f 6e 74 65 6e 74 20 61 72 65 61 0a 2a 2a 20 62  ontent area.** b
34930 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
34940 0a 2a 2a 0a 2a 2a 20 46 69 6e 61 6c 6c 79 2c 20  .**.** Finally, 
34950 61 72 67 75 6d 65 6e 74 20 70 42 65 67 69 6e 20  argument pBegin 
34960 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 62 79  points to the by
34970 74 65 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66  te immediately f
34980 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 0a 2a 2a 20  ollowing the.** 
34990 65 6e 64 20 6f 66 20 74 68 65 20 73 70 61 63 65  end of the space
349a0 20 72 65 71 75 69 72 65 64 20 62 79 20 74 68 69   required by thi
349b0 73 20 70 61 67 65 20 66 6f 72 20 74 68 65 20 63  s page for the c
349c0 65 6c 6c 2d 70 6f 69 6e 74 65 72 20 61 72 65 61  ell-pointer area
349d0 20 28 66 6f 72 0a 2a 2a 20 61 6c 6c 20 63 65 6c   (for.** all cel
349e0 6c 73 20 2d 20 6e 6f 74 20 6a 75 73 74 20 74 68  ls - not just th
349f0 6f 73 65 20 69 6e 73 65 72 74 65 64 20 62 79 20  ose inserted by 
34a00 74 68 65 20 63 75 72 72 65 6e 74 20 63 61 6c 6c  the current call
34a10 29 2e 20 49 66 20 74 68 65 20 63 6f 6e 74 65 6e  ). If the conten
34a20 74 0a 2a 2a 20 61 72 65 61 20 6d 75 73 74 20 62  t.** area must b
34a30 65 20 65 78 74 65 6e 64 65 64 20 74 6f 20 62 65  e extended to be
34a40 66 6f 72 65 20 74 68 69 73 20 70 6f 69 6e 74 20  fore this point 
34a50 69 6e 20 6f 72 64 65 72 20 74 6f 20 61 63 63 6f  in order to acco
34a60 6d 6f 64 61 74 65 20 61 6c 6c 0a 2a 2a 20 63 65  modate all.** ce
34a70 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 2c  lls in apCell[],
34a80 20 74 68 65 6e 20 74 68 65 20 63 65 6c 6c 73 20   then the cells 
34a90 64 6f 20 6e 6f 74 20 66 69 74 20 61 6e 64 20 6e  do not fit and n
34aa0 6f 6e 2d 7a 65 72 6f 20 69 73 20 72 65 74 75 72  on-zero is retur
34ab0 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
34ac0 6e 74 20 70 61 67 65 49 6e 73 65 72 74 41 72 72  nt pageInsertArr
34ad0 61 79 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  ay(.  MemPage *p
34ae0 50 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  Pg,             
34af0 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 74 6f        /* Page to
34b00 20 61 64 64 20 63 65 6c 6c 73 20 74 6f 20 2a 2f   add cells to */
34b10 0a 20 20 75 38 20 2a 70 42 65 67 69 6e 2c 20 20  .  u8 *pBegin,  
34b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34b30 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 63 65 6c     /* End of cel
34b40 6c 2d 70 6f 69 6e 74 65 72 20 61 72 72 61 79 20  l-pointer array 
34b50 2a 2f 0a 20 20 75 38 20 2a 2a 70 70 44 61 74 61  */.  u8 **ppData
34b60 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
34b70 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20       /* IN/OUT: 
34b80 50 61 67 65 20 63 6f 6e 74 65 6e 74 20 2d 61 72  Page content -ar
34b90 65 61 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20  ea pointer */.  
34ba0 75 38 20 2a 70 43 65 6c 6c 70 74 72 2c 20 20 20  u8 *pCellptr,   
34bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34bc0 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 63 65  /* Pointer to ce
34bd0 6c 6c 2d 70 6f 69 6e 74 65 72 20 61 72 65 61 20  ll-pointer area 
34be0 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 2c 20  */.  int nCell, 
34bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34c00 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
34c10 66 20 63 65 6c 6c 73 20 74 6f 20 61 64 64 20 74  f cells to add t
34c20 6f 20 70 50 67 20 2a 2f 0a 20 20 75 38 20 2a 2a  o pPg */.  u8 **
34c30 61 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20  apCell,         
34c40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72             /* Ar
34c50 72 61 79 20 6f 66 20 63 65 6c 6c 73 20 2a 2f 0a  ray of cells */.
34c60 20 20 75 31 36 20 2a 73 7a 43 65 6c 6c 20 20 20    u16 *szCell   
34c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34c80 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 63 65    /* Array of ce
34c90 6c 6c 20 73 69 7a 65 73 20 2a 2f 0a 29 7b 0a 20  ll sizes */.){. 
34ca0 20 69 6e 74 20 69 3b 0a 20 20 75 38 20 2a 61 44   int i;.  u8 *aD
34cb0 61 74 61 20 3d 20 70 50 67 2d 3e 61 44 61 74 61  ata = pPg->aData
34cc0 3b 0a 20 20 75 38 20 2a 70 44 61 74 61 20 3d 20  ;.  u8 *pData = 
34cd0 2a 70 70 44 61 74 61 3b 0a 20 20 63 6f 6e 73 74  *ppData;.  const
34ce0 20 69 6e 74 20 62 46 72 65 65 6c 69 73 74 20 3d   int bFreelist =
34cf0 20 61 44 61 74 61 5b 31 5d 20 7c 7c 20 61 44 61   aData[1] || aDa
34d00 74 61 5b 32 5d 3b 0a 20 20 61 73 73 65 72 74 28  ta[2];.  assert(
34d10 20 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20 70   CORRUPT_DB || p
34d20 50 67 2d 3e 68 64 72 4f 66 66 73 65 74 3d 3d 30  Pg->hdrOffset==0
34d30 20 29 3b 20 20 20 20 2f 2a 20 4e 65 76 65 72 20   );    /* Never 
34d40 63 61 6c 6c 65 64 20 6f 6e 20 70 61 67 65 20 31  called on page 1
34d50 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
34d60 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20  <nCell; i++){.  
34d70 20 20 69 6e 74 20 73 7a 20 3d 20 73 7a 43 65 6c    int sz = szCel
34d80 6c 5b 69 5d 3b 0a 20 20 20 20 69 6e 74 20 72 63  l[i];.    int rc
34d90 3b 0a 20 20 20 20 75 38 20 2a 70 53 6c 6f 74 3b  ;.    u8 *pSlot;
34da0 0a 20 20 20 20 69 66 28 20 62 46 72 65 65 6c 69  .    if( bFreeli
34db0 73 74 3d 3d 30 20 7c 7c 20 28 70 53 6c 6f 74 20  st==0 || (pSlot 
34dc0 3d 20 70 61 67 65 46 69 6e 64 53 6c 6f 74 28 70  = pageFindSlot(p
34dd0 50 67 2c 20 73 7a 2c 20 26 72 63 2c 20 30 29 29  Pg, sz, &rc, 0))
34de0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 44 61  ==0 ){.      pDa
34df0 74 61 20 2d 3d 20 73 7a 3b 0a 20 20 20 20 20 20  ta -= sz;.      
34e00 69 66 28 20 70 44 61 74 61 3c 70 42 65 67 69 6e  if( pData<pBegin
34e10 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20   ) return 1;.   
34e20 20 20 20 70 53 6c 6f 74 20 3d 20 70 44 61 74 61     pSlot = pData
34e30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 63  ;.    }.    memc
34e40 70 79 28 70 53 6c 6f 74 2c 20 61 70 43 65 6c 6c  py(pSlot, apCell
34e50 5b 69 5d 2c 20 73 7a 29 3b 0a 20 20 20 20 70 75  [i], sz);.    pu
34e60 74 32 62 79 74 65 28 70 43 65 6c 6c 70 74 72 2c  t2byte(pCellptr,
34e70 20 28 70 53 6c 6f 74 20 2d 20 61 44 61 74 61 29   (pSlot - aData)
34e80 29 3b 0a 20 20 20 20 70 43 65 6c 6c 70 74 72 20  );.    pCellptr 
34e90 2b 3d 20 32 3b 0a 20 20 7d 0a 20 20 2a 70 70 44  += 2;.  }.  *ppD
34ea0 61 74 61 20 3d 20 70 44 61 74 61 3b 0a 20 20 72  ata = pData;.  r
34eb0 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
34ec0 2a 20 41 72 72 61 79 20 61 70 43 65 6c 6c 5b 5d  * Array apCell[]
34ed0 20 63 6f 6e 74 61 69 6e 73 20 6e 43 65 6c 6c 20   contains nCell 
34ee0 70 6f 69 6e 74 65 72 73 20 74 6f 20 62 2d 74 72  pointers to b-tr
34ef0 65 65 20 63 65 6c 6c 73 2e 20 41 72 72 61 79 20  ee cells. Array 
34f00 73 7a 43 65 6c 6c 20 0a 2a 2a 20 63 6f 6e 74 61  szCell .** conta
34f10 69 6e 73 20 74 68 65 20 73 69 7a 65 20 69 6e 20  ins the size in 
34f20 62 79 74 65 73 20 6f 66 20 65 61 63 68 20 73 75  bytes of each su
34f30 63 68 20 63 65 6c 6c 2e 20 54 68 69 73 20 66 75  ch cell. This fu
34f40 6e 63 74 69 6f 6e 20 61 64 64 73 20 74 68 65 0a  nction adds the.
34f50 2a 2a 20 73 70 61 63 65 20 61 73 73 6f 63 69 61  ** space associa
34f60 74 65 64 20 77 69 74 68 20 65 61 63 68 20 63 65  ted with each ce
34f70 6c 6c 20 69 6e 20 74 68 65 20 61 72 72 61 79 20  ll in the array 
34f80 74 68 61 74 20 69 73 20 63 75 72 72 65 6e 74 6c  that is currentl
34f90 79 20 73 74 6f 72 65 64 20 0a 2a 2a 20 77 69 74  y stored .** wit
34fa0 68 69 6e 20 74 68 65 20 62 6f 64 79 20 6f 66 20  hin the body of 
34fb0 70 50 67 20 74 6f 20 74 68 65 20 70 50 67 20 66  pPg to the pPg f
34fc0 72 65 65 2d 6c 69 73 74 2e 20 54 68 65 20 63 65  ree-list. The ce
34fd0 6c 6c 2d 70 6f 69 6e 74 65 72 73 20 61 6e 64 20  ll-pointers and 
34fe0 6f 74 68 65 72 0a 2a 2a 20 66 69 65 6c 64 73 20  other.** fields 
34ff0 6f 66 20 74 68 65 20 70 61 67 65 20 61 72 65 20  of the page are 
35000 6e 6f 74 20 75 70 64 61 74 65 64 2e 0a 2a 2a 0a  not updated..**.
35010 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
35020 20 72 65 74 75 72 6e 73 20 74 68 65 20 74 6f 74   returns the tot
35030 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 63 65 6c  al number of cel
35040 6c 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  ls added to the 
35050 66 72 65 65 2d 6c 69 73 74 2e 0a 2a 2f 0a 73 74  free-list..*/.st
35060 61 74 69 63 20 69 6e 74 20 70 61 67 65 46 72 65  atic int pageFre
35070 65 41 72 72 61 79 28 0a 20 20 4d 65 6d 50 61 67  eArray(.  MemPag
35080 65 20 2a 70 50 67 2c 20 20 20 20 20 20 20 20 20  e *pPg,         
35090 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
350a0 65 20 74 6f 20 65 64 69 74 20 2a 2f 0a 20 20 69  e to edit */.  i
350b0 6e 74 20 6e 43 65 6c 6c 2c 20 20 20 20 20 20 20  nt nCell,       
350c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
350d0 2a 20 43 65 6c 6c 73 20 74 6f 20 64 65 6c 65 74  * Cells to delet
350e0 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43 65  e */.  u8 **apCe
350f0 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ll,             
35100 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20         /* Array 
35110 6f 66 20 63 65 6c 6c 73 20 2a 2f 0a 20 20 75 31  of cells */.  u1
35120 36 20 2a 73 7a 43 65 6c 6c 20 20 20 20 20 20 20  6 *szCell       
35130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
35140 20 41 72 72 61 79 20 6f 66 20 63 65 6c 6c 20 73   Array of cell s
35150 69 7a 65 73 20 2a 2f 0a 29 7b 0a 20 20 75 38 20  izes */.){.  u8 
35160 2a 20 63 6f 6e 73 74 20 61 44 61 74 61 20 3d 20  * const aData = 
35170 70 50 67 2d 3e 61 44 61 74 61 3b 0a 20 20 75 38  pPg->aData;.  u8
35180 20 2a 20 63 6f 6e 73 74 20 70 45 6e 64 20 3d 20   * const pEnd = 
35190 26 61 44 61 74 61 5b 70 50 67 2d 3e 70 42 74 2d  &aData[pPg->pBt-
351a0 3e 75 73 61 62 6c 65 53 69 7a 65 5d 3b 0a 20 20  >usableSize];.  
351b0 75 38 20 2a 20 63 6f 6e 73 74 20 70 53 74 61 72  u8 * const pStar
351c0 74 20 3d 20 26 61 44 61 74 61 5b 70 50 67 2d 3e  t = &aData[pPg->
351d0 68 64 72 4f 66 66 73 65 74 20 2b 20 38 20 2b 20  hdrOffset + 8 + 
351e0 70 50 67 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a  pPg->childPtrSiz
351f0 65 5d 3b 0a 20 20 69 6e 74 20 6e 52 65 74 20 3d  e];.  int nRet =
35200 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 75   0;.  int i;.  u
35210 38 20 2a 70 46 72 65 65 20 3d 20 30 3b 0a 20 20  8 *pFree = 0;.  
35220 69 6e 74 20 73 7a 46 72 65 65 20 3d 20 30 3b 0a  int szFree = 0;.
35230 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43  .  for(i=0; i<nC
35240 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75  ell; i++){.    u
35250 38 20 2a 70 43 65 6c 6c 20 3d 20 61 70 43 65 6c  8 *pCell = apCel
35260 6c 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 43  l[i];.    if( pC
35270 65 6c 6c 3e 3d 70 53 74 61 72 74 20 26 26 20 70  ell>=pStart && p
35280 43 65 6c 6c 3c 70 45 6e 64 20 29 7b 0a 20 20 20  Cell<pEnd ){.   
35290 20 20 20 69 6e 74 20 73 7a 20 3d 20 73 7a 43 65     int sz = szCe
352a0 6c 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28  ll[i];.      if(
352b0 20 70 46 72 65 65 21 3d 28 70 43 65 6c 6c 20 2b   pFree!=(pCell +
352c0 20 73 7a 29 20 29 7b 0a 20 20 20 20 20 20 20 20   sz) ){.        
352d0 69 66 28 20 70 46 72 65 65 20 29 7b 0a 20 20 20  if( pFree ){.   
352e0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
352f0 46 72 65 65 3e 61 44 61 74 61 20 26 26 20 28 70  Free>aData && (p
35300 46 72 65 65 20 2d 20 61 44 61 74 61 29 3c 36 35  Free - aData)<65
35310 35 33 36 20 29 3b 0a 20 20 20 20 20 20 20 20 20  536 );.         
35320 20 66 72 65 65 53 70 61 63 65 28 70 50 67 2c 20   freeSpace(pPg, 
35330 28 75 31 36 29 28 70 46 72 65 65 20 2d 20 61 44  (u16)(pFree - aD
35340 61 74 61 29 2c 20 73 7a 46 72 65 65 29 3b 0a 20  ata), szFree);. 
35350 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
35360 20 70 46 72 65 65 20 3d 20 70 43 65 6c 6c 3b 0a   pFree = pCell;.
35370 20 20 20 20 20 20 20 20 73 7a 46 72 65 65 20 3d          szFree =
35380 20 73 7a 3b 0a 20 20 20 20 20 20 20 20 69 66 28   sz;.        if(
35390 20 70 46 72 65 65 2b 73 7a 3e 70 45 6e 64 20 29   pFree+sz>pEnd )
353a0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20   return 0;.     
353b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
353c0 70 46 72 65 65 20 3d 20 70 43 65 6c 6c 3b 0a 20  pFree = pCell;. 
353d0 20 20 20 20 20 20 20 73 7a 46 72 65 65 20 2b 3d         szFree +=
353e0 20 73 7a 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   sz;.      }.   
353f0 20 20 20 6e 52 65 74 2b 2b 3b 0a 20 20 20 20 7d     nRet++;.    }
35400 0a 20 20 7d 0a 20 20 69 66 28 20 70 46 72 65 65  .  }.  if( pFree
35410 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
35420 70 46 72 65 65 3e 61 44 61 74 61 20 26 26 20 28  pFree>aData && (
35430 70 46 72 65 65 20 2d 20 61 44 61 74 61 29 3c 36  pFree - aData)<6
35440 35 35 33 36 20 29 3b 0a 20 20 20 20 66 72 65 65  5536 );.    free
35450 53 70 61 63 65 28 70 50 67 2c 20 28 75 31 36 29  Space(pPg, (u16)
35460 28 70 46 72 65 65 20 2d 20 61 44 61 74 61 29 2c  (pFree - aData),
35470 20 73 7a 46 72 65 65 29 3b 0a 20 20 7d 0a 20 20   szFree);.  }.  
35480 72 65 74 75 72 6e 20 6e 52 65 74 3b 0a 7d 0a 0a  return nRet;.}..
35490 2f 2a 0a 2a 2a 20 61 70 43 65 6c 6c 5b 5d 20 61  /*.** apCell[] a
354a0 6e 64 20 73 7a 43 65 6c 6c 5b 5d 20 63 6f 6e 74  nd szCell[] cont
354b0 61 69 6e 73 20 70 6f 69 6e 74 65 72 73 20 74 6f  ains pointers to
354c0 20 61 6e 64 20 73 69 7a 65 73 20 6f 66 20 61 6c   and sizes of al
354d0 6c 20 63 65 6c 6c 73 20 69 6e 20 74 68 65 0a 2a  l cells in the.*
354e0 2a 20 70 61 67 65 73 20 62 65 69 6e 67 20 62 61  * pages being ba
354f0 6c 61 6e 63 65 64 2e 20 20 54 68 65 20 63 75 72  lanced.  The cur
35500 72 65 6e 74 20 70 61 67 65 2c 20 70 50 67 2c 20  rent page, pPg, 
35510 68 61 73 20 70 50 67 2d 3e 6e 43 65 6c 6c 20 63  has pPg->nCell c
35520 65 6c 6c 73 20 73 74 61 72 74 69 6e 67 0a 2a 2a  ells starting.**
35530 20 77 69 74 68 20 61 70 43 65 6c 6c 5b 69 4f 6c   with apCell[iOl
35540 64 5d 2e 20 20 41 66 74 65 72 20 62 61 6c 61 6e  d].  After balan
35550 63 69 6e 67 2c 20 74 68 69 73 20 70 61 67 65 20  cing, this page 
35560 73 68 6f 75 6c 64 20 68 6f 6c 64 20 6e 4e 65 77  should hold nNew
35570 20 63 65 6c 6c 73 0a 2a 2a 20 73 74 61 72 74 69   cells.** starti
35580 6e 67 20 61 74 20 61 70 43 65 6c 6c 5b 69 4e 65  ng at apCell[iNe
35590 77 5d 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  w]..**.** This r
355a0 6f 75 74 69 6e 65 20 6d 61 6b 65 73 20 74 68 65  outine makes the
355b0 20 6e 65 63 65 73 73 61 72 79 20 61 64 6a 75 73   necessary adjus
355c0 74 6d 65 6e 74 73 20 74 6f 20 70 50 67 20 73 6f  tments to pPg so
355d0 20 74 68 61 74 20 69 74 20 63 6f 6e 74 61 69 6e   that it contain
355e0 73 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65 63 74  s.** the correct
355f0 20 63 65 6c 6c 73 20 61 66 74 65 72 20 62 65 69   cells after bei
35600 6e 67 20 62 61 6c 61 6e 63 65 64 2e 0a 2a 2a 0a  ng balanced..**.
35610 2a 2a 20 54 68 65 20 70 50 67 2d 3e 6e 46 72 65  ** The pPg->nFre
35620 65 20 66 69 65 6c 64 20 69 73 20 69 6e 76 61 6c  e field is inval
35630 69 64 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  id when this fun
35640 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2e 20 49  ction returns. I
35650 74 20 69 73 20 74 68 65 0a 2a 2a 20 72 65 73 70  t is the.** resp
35660 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68  onsibility of th
35670 65 20 63 61 6c 6c 65 72 20 74 6f 20 73 65 74 20  e caller to set 
35680 69 74 20 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2f  it correctly..*/
35690 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 64 69  .static void edi
356a0 74 50 61 67 65 28 0a 20 20 4d 65 6d 50 61 67 65  tPage(.  MemPage
356b0 20 2a 70 50 67 2c 20 20 20 20 20 20 20 20 20 20   *pPg,          
356c0 20 20 20 20 20 20 20 20 20 2f 2a 20 45 64 69 74           /* Edit
356d0 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20 20   this page */.  
356e0 69 6e 74 20 69 4f 6c 64 2c 20 20 20 20 20 20 20  int iOld,       
356f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35700 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66 69 72 73  /* Index of firs
35710 74 20 63 65 6c 6c 20 63 75 72 72 65 6e 74 6c 79  t cell currently
35720 20 6f 6e 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e   on page */.  in
35730 74 20 69 4e 65 77 2c 20 20 20 20 20 20 20 20 20  t iNew,         
35740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
35750 20 49 6e 64 65 78 20 6f 66 20 6e 65 77 20 66 69   Index of new fi
35760 72 73 74 20 63 65 6c 6c 20 6f 6e 20 70 61 67 65  rst cell on page
35770 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 65 77 2c 20   */.  int nNew, 
35780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35790 20 20 20 20 20 20 2f 2a 20 46 69 6e 61 6c 20 6e        /* Final n
357a0 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 6f  umber of cells o
357b0 6e 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a  n page */.  u8 *
357c0 2a 61 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20  *apCell,        
357d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
357e0 72 72 61 79 20 6f 66 20 63 65 6c 6c 73 20 2a 2f  rray of cells */
357f0 0a 20 20 75 31 36 20 2a 73 7a 43 65 6c 6c 20 20  .  u16 *szCell  
35800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35810 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 63     /* Array of c
35820 65 6c 6c 20 73 69 7a 65 73 20 2a 2f 0a 29 7b 0a  ell sizes */.){.
35830 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 61 44 61    u8 * const aDa
35840 74 61 20 3d 20 70 50 67 2d 3e 61 44 61 74 61 3b  ta = pPg->aData;
35850 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 68 64 72  .  const int hdr
35860 20 3d 20 70 50 67 2d 3e 68 64 72 4f 66 66 73 65   = pPg->hdrOffse
35870 74 3b 0a 20 20 75 38 20 2a 70 42 65 67 69 6e 20  t;.  u8 *pBegin 
35880 3d 20 26 70 50 67 2d 3e 61 43 65 6c 6c 49 64 78  = &pPg->aCellIdx
35890 5b 6e 4e 65 77 20 2a 20 32 5d 3b 0a 20 20 69 6e  [nNew * 2];.  in
358a0 74 20 6e 43 65 6c 6c 20 3d 20 70 50 67 2d 3e 6e  t nCell = pPg->n
358b0 43 65 6c 6c 3b 20 20 20 20 20 20 20 2f 2a 20 43  Cell;       /* C
358c0 65 6c 6c 73 20 73 74 6f 72 65 64 20 6f 6e 20 70  ells stored on p
358d0 50 67 20 2a 2f 0a 20 20 75 38 20 2a 70 44 61 74  Pg */.  u8 *pDat
358e0 61 3b 0a 20 20 75 38 20 2a 70 43 65 6c 6c 70 74  a;.  u8 *pCellpt
358f0 72 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  r;.  int i;.  in
35900 74 20 69 4f 6c 64 45 6e 64 20 3d 20 69 4f 6c 64  t iOldEnd = iOld
35910 20 2b 20 70 50 67 2d 3e 6e 43 65 6c 6c 20 2b 20   + pPg->nCell + 
35920 70 50 67 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a  pPg->nOverflow;.
35930 20 20 69 6e 74 20 69 4e 65 77 45 6e 64 20 3d 20    int iNewEnd = 
35940 69 4e 65 77 20 2b 20 6e 4e 65 77 3b 0a 0a 23 69  iNew + nNew;..#i
35950 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
35960 47 0a 20 20 75 38 20 2a 70 54 6d 70 20 3d 20 73  G.  u8 *pTmp = s
35970 71 6c 69 74 65 33 50 61 67 65 72 54 65 6d 70 53  qlite3PagerTempS
35980 70 61 63 65 28 70 50 67 2d 3e 70 42 74 2d 3e 70  pace(pPg->pBt->p
35990 50 61 67 65 72 29 3b 0a 20 20 6d 65 6d 63 70 79  Pager);.  memcpy
359a0 28 70 54 6d 70 2c 20 61 44 61 74 61 2c 20 70 50  (pTmp, aData, pP
359b0 67 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  g->pBt->usableSi
359c0 7a 65 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  ze);.#endif..  /
359d0 2a 20 52 65 6d 6f 76 65 20 63 65 6c 6c 73 20 66  * Remove cells f
359e0 72 6f 6d 20 74 68 65 20 73 74 61 72 74 20 61 6e  rom the start an
359f0 64 20 65 6e 64 20 6f 66 20 74 68 65 20 70 61 67  d end of the pag
35a00 65 20 2a 2f 0a 20 20 69 66 28 20 69 4f 6c 64 3c  e */.  if( iOld<
35a10 69 4e 65 77 20 29 7b 0a 20 20 20 20 69 6e 74 20  iNew ){.    int 
35a20 6e 53 68 69 66 74 20 3d 20 70 61 67 65 46 72 65  nShift = pageFre
35a30 65 41 72 72 61 79 28 0a 20 20 20 20 20 20 20 20  eArray(.        
35a40 70 50 67 2c 20 69 4e 65 77 2d 69 4f 6c 64 2c 20  pPg, iNew-iOld, 
35a50 26 61 70 43 65 6c 6c 5b 69 4f 6c 64 5d 2c 20 26  &apCell[iOld], &
35a60 73 7a 43 65 6c 6c 5b 69 4f 6c 64 5d 0a 20 20 20  szCell[iOld].   
35a70 20 29 3b 0a 20 20 20 20 6d 65 6d 6d 6f 76 65 28   );.    memmove(
35a80 70 50 67 2d 3e 61 43 65 6c 6c 49 64 78 2c 20 26  pPg->aCellIdx, &
35a90 70 50 67 2d 3e 61 43 65 6c 6c 49 64 78 5b 6e 53  pPg->aCellIdx[nS
35aa0 68 69 66 74 2a 32 5d 2c 20 6e 43 65 6c 6c 2a 32  hift*2], nCell*2
35ab0 29 3b 0a 20 20 20 20 6e 43 65 6c 6c 20 2d 3d 20  );.    nCell -= 
35ac0 6e 53 68 69 66 74 3b 0a 20 20 7d 0a 20 20 69 66  nShift;.  }.  if
35ad0 28 20 69 4e 65 77 45 6e 64 20 3c 20 69 4f 6c 64  ( iNewEnd < iOld
35ae0 45 6e 64 20 29 7b 0a 20 20 20 20 6e 43 65 6c 6c  End ){.    nCell
35af0 20 2d 3d 20 70 61 67 65 46 72 65 65 41 72 72 61   -= pageFreeArra
35b00 79 28 0a 20 20 20 20 20 20 20 20 70 50 67 2c 20  y(.        pPg, 
35b10 69 4f 6c 64 45 6e 64 2d 69 4e 65 77 45 6e 64 2c  iOldEnd-iNewEnd,
35b20 20 26 61 70 43 65 6c 6c 5b 69 4e 65 77 45 6e 64   &apCell[iNewEnd
35b30 5d 2c 20 26 73 7a 43 65 6c 6c 5b 69 4e 65 77 45  ], &szCell[iNewE
35b40 6e 64 5d 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 0a  nd].    );.  }..
35b50 20 20 70 44 61 74 61 20 3d 20 26 61 44 61 74 61    pData = &aData
35b60 5b 67 65 74 32 62 79 74 65 4e 6f 74 5a 65 72 6f  [get2byteNotZero
35b70 28 26 61 44 61 74 61 5b 68 64 72 2b 35 5d 29 5d  (&aData[hdr+5])]
35b80 3b 0a 20 20 69 66 28 20 70 44 61 74 61 3c 70 42  ;.  if( pData<pB
35b90 65 67 69 6e 20 29 20 67 6f 74 6f 20 65 64 69 74  egin ) goto edit
35ba0 70 61 67 65 5f 66 61 69 6c 3b 0a 0a 20 20 2f 2a  page_fail;..  /*
35bb0 20 41 64 64 20 63 65 6c 6c 73 20 74 6f 20 74 68   Add cells to th
35bc0 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 70  e start of the p
35bd0 61 67 65 20 2a 2f 0a 20 20 69 66 28 20 69 4e 65  age */.  if( iNe
35be0 77 3c 69 4f 6c 64 20 29 7b 0a 20 20 20 20 69 6e  w<iOld ){.    in
35bf0 74 20 6e 41 64 64 20 3d 20 4d 49 4e 28 6e 4e 65  t nAdd = MIN(nNe
35c00 77 2c 69 4f 6c 64 2d 69 4e 65 77 29 3b 0a 20 20  w,iOld-iNew);.  
35c10 20 20 61 73 73 65 72 74 28 20 28 69 4f 6c 64 2d    assert( (iOld-
35c20 69 4e 65 77 29 3c 6e 4e 65 77 20 7c 7c 20 6e 43  iNew)<nNew || nC
35c30 65 6c 6c 3d 3d 30 20 7c 7c 20 43 4f 52 52 55 50  ell==0 || CORRUP
35c40 54 5f 44 42 20 29 3b 0a 20 20 20 20 70 43 65 6c  T_DB );.    pCel
35c50 6c 70 74 72 20 3d 20 70 50 67 2d 3e 61 43 65 6c  lptr = pPg->aCel
35c60 6c 49 64 78 3b 0a 20 20 20 20 6d 65 6d 6d 6f 76  lIdx;.    memmov
35c70 65 28 26 70 43 65 6c 6c 70 74 72 5b 6e 41 64 64  e(&pCellptr[nAdd
35c80 2a 32 5d 2c 20 70 43 65 6c 6c 70 74 72 2c 20 6e  *2], pCellptr, n
35c90 43 65 6c 6c 2a 32 29 3b 0a 20 20 20 20 69 66 28  Cell*2);.    if(
35ca0 20 70 61 67 65 49 6e 73 65 72 74 41 72 72 61 79   pageInsertArray
35cb0 28 0a 20 20 20 20 20 20 20 20 20 20 70 50 67 2c  (.          pPg,
35cc0 20 70 42 65 67 69 6e 2c 20 26 70 44 61 74 61 2c   pBegin, &pData,
35cd0 20 70 43 65 6c 6c 70 74 72 2c 0a 20 20 20 20 20   pCellptr,.     
35ce0 20 20 20 20 20 6e 41 64 64 2c 20 26 61 70 43 65       nAdd, &apCe
35cf0 6c 6c 5b 69 4e 65 77 5d 2c 20 26 73 7a 43 65 6c  ll[iNew], &szCel
35d00 6c 5b 69 4e 65 77 5d 0a 20 20 20 20 29 20 29 20  l[iNew].    ) ) 
35d10 67 6f 74 6f 20 65 64 69 74 70 61 67 65 5f 66 61  goto editpage_fa
35d20 69 6c 3b 0a 20 20 20 20 6e 43 65 6c 6c 20 2b 3d  il;.    nCell +=
35d30 20 6e 41 64 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a   nAdd;.  }..  /*
35d40 20 41 64 64 20 61 6e 79 20 6f 76 65 72 66 6c 6f   Add any overflo
35d50 77 20 63 65 6c 6c 73 20 2a 2f 0a 20 20 66 6f 72  w cells */.  for
35d60 28 69 3d 30 3b 20 69 3c 70 50 67 2d 3e 6e 4f 76  (i=0; i<pPg->nOv
35d70 65 72 66 6c 6f 77 3b 20 69 2b 2b 29 7b 0a 20 20  erflow; i++){.  
35d80 20 20 69 6e 74 20 69 43 65 6c 6c 20 3d 20 28 69    int iCell = (i
35d90 4f 6c 64 20 2b 20 70 50 67 2d 3e 61 69 4f 76 66  Old + pPg->aiOvf
35da0 6c 5b 69 5d 29 20 2d 20 69 4e 65 77 3b 0a 20 20  l[i]) - iNew;.  
35db0 20 20 69 66 28 20 69 43 65 6c 6c 3e 3d 30 20 26    if( iCell>=0 &
35dc0 26 20 69 43 65 6c 6c 3c 6e 4e 65 77 20 29 7b 0a  & iCell<nNew ){.
35dd0 20 20 20 20 20 20 70 43 65 6c 6c 70 74 72 20 3d        pCellptr =
35de0 20 26 70 50 67 2d 3e 61 43 65 6c 6c 49 64 78 5b   &pPg->aCellIdx[
35df0 69 43 65 6c 6c 20 2a 20 32 5d 3b 0a 20 20 20 20  iCell * 2];.    
35e00 20 20 6d 65 6d 6d 6f 76 65 28 26 70 43 65 6c 6c    memmove(&pCell
35e10 70 74 72 5b 32 5d 2c 20 70 43 65 6c 6c 70 74 72  ptr[2], pCellptr
35e20 2c 20 28 6e 43 65 6c 6c 20 2d 20 69 43 65 6c 6c  , (nCell - iCell
35e30 29 20 2a 20 32 29 3b 0a 20 20 20 20 20 20 6e 43  ) * 2);.      nC
35e40 65 6c 6c 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28  ell++;.      if(
35e50 20 70 61 67 65 49 6e 73 65 72 74 41 72 72 61 79   pageInsertArray
35e60 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 50  (.            pP
35e70 67 2c 20 70 42 65 67 69 6e 2c 20 26 70 44 61 74  g, pBegin, &pDat
35e80 61 2c 20 70 43 65 6c 6c 70 74 72 2c 0a 20 20 20  a, pCellptr,.   
35e90 20 20 20 20 20 20 20 20 20 31 2c 20 26 61 70 43           1, &apC
35ea0 65 6c 6c 5b 69 43 65 6c 6c 20 2b 20 69 4e 65 77  ell[iCell + iNew
35eb0 5d 2c 20 26 73 7a 43 65 6c 6c 5b 69 43 65 6c 6c  ], &szCell[iCell
35ec0 20 2b 20 69 4e 65 77 5d 0a 20 20 20 20 20 20 29   + iNew].      )
35ed0 20 29 20 67 6f 74 6f 20 65 64 69 74 70 61 67 65   ) goto editpage
35ee0 5f 66 61 69 6c 3b 0a 20 20 20 20 7d 0a 20 20 7d  _fail;.    }.  }
35ef0 0a 0a 20 20 2f 2a 20 41 70 70 65 6e 64 20 63 65  ..  /* Append ce
35f00 6c 6c 73 20 74 6f 20 74 68 65 20 65 6e 64 20 6f  lls to the end o
35f10 66 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20  f the page */.  
35f20 70 43 65 6c 6c 70 74 72 20 3d 20 26 70 50 67 2d  pCellptr = &pPg-
35f30 3e 61 43 65 6c 6c 49 64 78 5b 6e 43 65 6c 6c 2a  >aCellIdx[nCell*
35f40 32 5d 3b 0a 20 20 69 66 28 20 70 61 67 65 49 6e  2];.  if( pageIn
35f50 73 65 72 74 41 72 72 61 79 28 0a 20 20 20 20 20  sertArray(.     
35f60 20 20 20 70 50 67 2c 20 70 42 65 67 69 6e 2c 20     pPg, pBegin, 
35f70 26 70 44 61 74 61 2c 20 70 43 65 6c 6c 70 74 72  &pData, pCellptr
35f80 2c 0a 20 20 20 20 20 20 20 20 6e 4e 65 77 2d 6e  ,.        nNew-n
35f90 43 65 6c 6c 2c 20 26 61 70 43 65 6c 6c 5b 69 4e  Cell, &apCell[iN
35fa0 65 77 2b 6e 43 65 6c 6c 5d 2c 20 26 73 7a 43 65  ew+nCell], &szCe
35fb0 6c 6c 5b 69 4e 65 77 2b 6e 43 65 6c 6c 5d 0a 20  ll[iNew+nCell]. 
35fc0 20 29 20 29 20 67 6f 74 6f 20 65 64 69 74 70 61   ) ) goto editpa
35fd0 67 65 5f 66 61 69 6c 3b 0a 0a 20 20 70 50 67 2d  ge_fail;..  pPg-
35fe0 3e 6e 43 65 6c 6c 20 3d 20 6e 4e 65 77 3b 0a 20  >nCell = nNew;. 
35ff0 20 70 50 67 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20   pPg->nOverflow 
36000 3d 20 30 3b 0a 0a 20 20 70 75 74 32 62 79 74 65  = 0;..  put2byte
36010 28 26 61 44 61 74 61 5b 68 64 72 2b 33 5d 2c 20  (&aData[hdr+3], 
36020 70 50 67 2d 3e 6e 43 65 6c 6c 29 3b 0a 20 20 70  pPg->nCell);.  p
36030 75 74 32 62 79 74 65 28 26 61 44 61 74 61 5b 68  ut2byte(&aData[h
36040 64 72 2b 35 5d 2c 20 70 44 61 74 61 20 2d 20 61  dr+5], pData - a
36050 44 61 74 61 29 3b 0a 0a 23 69 66 64 65 66 20 53  Data);..#ifdef S
36060 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 66 6f  QLITE_DEBUG.  fo
36070 72 28 69 3d 30 3b 20 69 3c 6e 4e 65 77 20 26 26  r(i=0; i<nNew &&
36080 20 21 43 4f 52 52 55 50 54 5f 44 42 3b 20 69 2b   !CORRUPT_DB; i+
36090 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70 43 65 6c  +){.    u8 *pCel
360a0 6c 20 3d 20 61 70 43 65 6c 6c 5b 69 2b 69 4e 65  l = apCell[i+iNe
360b0 77 5d 3b 0a 20 20 20 20 69 6e 74 20 69 4f 66 66  w];.    int iOff
360c0 20 3d 20 67 65 74 32 62 79 74 65 28 26 70 50 67   = get2byte(&pPg
360d0 2d 3e 61 43 65 6c 6c 49 64 78 5b 69 2a 32 5d 29  ->aCellIdx[i*2])
360e0 3b 0a 20 20 20 20 69 66 28 20 70 43 65 6c 6c 3e  ;.    if( pCell>
360f0 3d 61 44 61 74 61 20 26 26 20 70 43 65 6c 6c 3c  =aData && pCell<
36100 26 61 44 61 74 61 5b 70 50 67 2d 3e 70 42 74 2d  &aData[pPg->pBt-
36110 3e 75 73 61 62 6c 65 53 69 7a 65 5d 20 29 7b 0a  >usableSize] ){.
36120 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 26 70        pCell = &p
36130 54 6d 70 5b 70 43 65 6c 6c 20 2d 20 61 44 61 74  Tmp[pCell - aDat
36140 61 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  a];.    }.    as
36150 73 65 72 74 28 20 30 3d 3d 6d 65 6d 63 6d 70 28  sert( 0==memcmp(
36160 70 43 65 6c 6c 2c 20 26 61 44 61 74 61 5b 69 4f  pCell, &aData[iO
36170 66 66 5d 2c 20 73 7a 43 65 6c 6c 5b 69 2b 69 4e  ff], szCell[i+iN
36180 65 77 5d 29 20 29 3b 0a 20 20 7d 0a 23 65 6e 64  ew]) );.  }.#end
36190 69 66 0a 0a 20 20 72 65 74 75 72 6e 3b 0a 20 65  if..  return;. e
361a0 64 69 74 70 61 67 65 5f 66 61 69 6c 3a 0a 20 20  ditpage_fail:.  
361b0 2f 2a 20 55 6e 61 62 6c 65 20 74 6f 20 65 64 69  /* Unable to edi
361c0 74 20 74 68 69 73 20 70 61 67 65 2e 20 52 65 62  t this page. Reb
361d0 75 69 6c 64 20 69 74 20 66 72 6f 6d 20 73 63 72  uild it from scr
361e0 61 74 63 68 20 69 6e 73 74 65 61 64 2e 20 2a 2f  atch instead. */
361f0 0a 20 20 72 65 62 75 69 6c 64 50 61 67 65 28 70  .  rebuildPage(p
36200 50 67 2c 20 6e 4e 65 77 2c 20 26 61 70 43 65 6c  Pg, nNew, &apCel
36210 6c 5b 69 4e 65 77 5d 2c 20 26 73 7a 43 65 6c 6c  l[iNew], &szCell
36220 5b 69 4e 65 77 5d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  [iNew]);.}../*.*
36230 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
36240 70 61 72 61 6d 65 74 65 72 73 20 64 65 74 65 72  parameters deter
36250 6d 69 6e 65 20 68 6f 77 20 6d 61 6e 79 20 61 64  mine how many ad
36260 6a 61 63 65 6e 74 20 70 61 67 65 73 20 67 65 74  jacent pages get
36270 20 69 6e 76 6f 6c 76 65 64 0a 2a 2a 20 69 6e 20   involved.** in 
36280 61 20 62 61 6c 61 6e 63 69 6e 67 20 6f 70 65 72  a balancing oper
36290 61 74 69 6f 6e 2e 20 20 4e 4e 20 69 73 20 74 68  ation.  NN is th
362a0 65 20 6e 75 6d 62 65 72 20 6f 66 20 6e 65 69 67  e number of neig
362b0 68 62 6f 72 73 20 6f 6e 20 65 69 74 68 65 72 20  hbors on either 
362c0 73 69 64 65 0a 2a 2a 20 6f 66 20 74 68 65 20 70  side.** of the p
362d0 61 67 65 20 74 68 61 74 20 70 61 72 74 69 63 69  age that partici
362e0 70 61 74 65 20 69 6e 20 74 68 65 20 62 61 6c 61  pate in the bala
362f0 6e 63 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 2e  ncing operation.
36300 20 20 4e 42 20 69 73 20 74 68 65 0a 2a 2a 20 74    NB is the.** t
36310 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70  otal number of p
36320 61 67 65 73 20 74 68 61 74 20 70 61 72 74 69 63  ages that partic
36330 69 70 61 74 65 2c 20 69 6e 63 6c 75 64 69 6e 67  ipate, including
36340 20 74 68 65 20 74 61 72 67 65 74 20 70 61 67 65   the target page
36350 20 61 6e 64 0a 2a 2a 20 4e 4e 20 6e 65 69 67 68   and.** NN neigh
36360 62 6f 72 73 20 6f 6e 20 65 69 74 68 65 72 20 73  bors on either s
36370 69 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d  ide..**.** The m
36380 69 6e 69 6d 75 6d 20 76 61 6c 75 65 20 6f 66 20  inimum value of 
36390 4e 4e 20 69 73 20 31 20 28 6f 66 20 63 6f 75 72  NN is 1 (of cour
363a0 73 65 29 2e 20 20 49 6e 63 72 65 61 73 69 6e 67  se).  Increasing
363b0 20 4e 4e 20 61 62 6f 76 65 20 31 0a 2a 2a 20 28   NN above 1.** (
363c0 74 6f 20 32 20 6f 72 20 33 29 20 67 69 76 65 73  to 2 or 3) gives
363d0 20 61 20 6d 6f 64 65 73 74 20 69 6d 70 72 6f 76   a modest improv
363e0 65 6d 65 6e 74 20 69 6e 20 53 45 4c 45 43 54 20  ement in SELECT 
363f0 61 6e 64 20 44 45 4c 45 54 45 20 70 65 72 66 6f  and DELETE perfo
36400 72 6d 61 6e 63 65 0a 2a 2a 20 69 6e 20 65 78 63  rmance.** in exc
36410 68 61 6e 67 65 20 66 6f 72 20 61 20 6c 61 72 67  hange for a larg
36420 65 72 20 64 65 67 72 61 64 61 74 69 6f 6e 20 69  er degradation i
36430 6e 20 49 4e 53 45 52 54 20 61 6e 64 20 55 50 44  n INSERT and UPD
36440 41 54 45 20 70 65 72 66 6f 72 6d 61 6e 63 65 2e  ATE performance.
36450 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 6f 66  .** The value of
36460 20 4e 4e 20 61 70 70 65 61 72 73 20 74 6f 20 67   NN appears to g
36470 69 76 65 20 74 68 65 20 62 65 73 74 20 72 65 73  ive the best res
36480 75 6c 74 73 20 6f 76 65 72 61 6c 6c 2e 0a 2a 2f  ults overall..*/
36490 0a 23 64 65 66 69 6e 65 20 4e 4e 20 31 20 20 20  .#define NN 1   
364a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
364b0 62 65 72 20 6f 66 20 6e 65 69 67 68 62 6f 72 73  ber of neighbors
364c0 20 6f 6e 20 65 69 74 68 65 72 20 73 69 64 65 20   on either side 
364d0 6f 66 20 70 50 61 67 65 20 2a 2f 0a 23 64 65 66  of pPage */.#def
364e0 69 6e 65 20 4e 42 20 28 4e 4e 2a 32 2b 31 29 20  ine NB (NN*2+1) 
364f0 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 70 61       /* Total pa
36500 67 65 73 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20  ges involved in 
36510 74 68 65 20 62 61 6c 61 6e 63 65 20 2a 2f 0a 0a  the balance */..
36520 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
36530 4f 4d 49 54 5f 51 55 49 43 4b 42 41 4c 41 4e 43  OMIT_QUICKBALANC
36540 45 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 76 65 72  E./*.** This ver
36550 73 69 6f 6e 20 6f 66 20 62 61 6c 61 6e 63 65 28  sion of balance(
36560 29 20 68 61 6e 64 6c 65 73 20 74 68 65 20 63 6f  ) handles the co
36570 6d 6d 6f 6e 20 73 70 65 63 69 61 6c 20 63 61 73  mmon special cas
36580 65 20 77 68 65 72 65 0a 2a 2a 20 61 20 6e 65 77  e where.** a new
36590 20 65 6e 74 72 79 20 69 73 20 62 65 69 6e 67 20   entry is being 
365a0 69 6e 73 65 72 74 65 64 20 6f 6e 20 74 68 65 20  inserted on the 
365b0 65 78 74 72 65 6d 65 20 72 69 67 68 74 2d 65 6e  extreme right-en
365c0 64 20 6f 66 20 74 68 65 0a 2a 2a 20 74 72 65 65  d of the.** tree
365d0 2c 20 69 6e 20 6f 74 68 65 72 20 77 6f 72 64 73  , in other words
365e0 2c 20 77 68 65 6e 20 74 68 65 20 6e 65 77 20 65  , when the new e
365f0 6e 74 72 79 20 77 69 6c 6c 20 62 65 63 6f 6d 65  ntry will become
36600 20 74 68 65 20 6c 61 72 67 65 73 74 0a 2a 2a 20   the largest.** 
36610 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74 72 65  entry in the tre
36620 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 73 74 65 61 64  e..**.** Instead
36630 20 6f 66 20 74 72 79 69 6e 67 20 74 6f 20 62 61   of trying to ba
36640 6c 61 6e 63 65 20 74 68 65 20 33 20 72 69 67 68  lance the 3 righ
36650 74 2d 6d 6f 73 74 20 6c 65 61 66 20 70 61 67 65  t-most leaf page
36660 73 2c 20 6a 75 73 74 20 61 64 64 0a 2a 2a 20 61  s, just add.** a
36670 20 6e 65 77 20 70 61 67 65 20 74 6f 20 74 68 65   new page to the
36680 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65   right-hand side
36690 20 61 6e 64 20 70 75 74 20 74 68 65 20 6f 6e 65   and put the one
366a0 20 6e 65 77 20 65 6e 74 72 79 20 69 6e 0a 2a 2a   new entry in.**
366b0 20 74 68 61 74 20 70 61 67 65 2e 20 20 54 68 69   that page.  Thi
366c0 73 20 6c 65 61 76 65 73 20 74 68 65 20 72 69 67  s leaves the rig
366d0 68 74 20 73 69 64 65 20 6f 66 20 74 68 65 20 74  ht side of the t
366e0 72 65 65 20 73 6f 6d 65 77 68 61 74 0a 2a 2a 20  ree somewhat.** 
366f0 75 6e 62 61 6c 61 6e 63 65 64 2e 20 20 42 75 74  unbalanced.  But
36700 20 6f 64 64 73 20 61 72 65 20 74 68 61 74 20 77   odds are that w
36710 65 20 77 69 6c 6c 20 62 65 20 69 6e 73 65 72 74  e will be insert
36720 69 6e 67 20 6e 65 77 20 65 6e 74 72 69 65 73 0a  ing new entries.
36730 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20 73 6f  ** at the end so
36740 6f 6e 20 61 66 74 65 72 77 61 72 64 73 20 73 6f  on afterwards so
36750 20 74 68 65 20 6e 65 61 72 6c 79 20 65 6d 70 74   the nearly empt
36760 79 20 70 61 67 65 20 77 69 6c 6c 20 71 75 69 63  y page will quic
36770 6b 6c 79 0a 2a 2a 20 66 69 6c 6c 20 75 70 2e 20  kly.** fill up. 
36780 20 4f 6e 20 61 76 65 72 61 67 65 2e 0a 2a 2a 0a   On average..**.
36790 2a 2a 20 70 50 61 67 65 20 69 73 20 74 68 65 20  ** pPage is the 
367a0 6c 65 61 66 20 70 61 67 65 20 77 68 69 63 68 20  leaf page which 
367b0 69 73 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73  is the right-mos
367c0 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 74 72  t page in the tr
367d0 65 65 2e 0a 2a 2a 20 70 50 61 72 65 6e 74 20 69  ee..** pParent i
367e0 73 20 69 74 73 20 70 61 72 65 6e 74 2e 20 20 70  s its parent.  p
367f0 50 61 67 65 20 6d 75 73 74 20 68 61 76 65 20 61  Page must have a
36800 20 73 69 6e 67 6c 65 20 6f 76 65 72 66 6c 6f 77   single overflow
36810 20 65 6e 74 72 79 0a 2a 2a 20 77 68 69 63 68 20   entry.** which 
36820 69 73 20 61 6c 73 6f 20 74 68 65 20 72 69 67 68  is also the righ
36830 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 6f 6e 20  t-most entry on 
36840 74 68 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  the page..**.** 
36850 54 68 65 20 70 53 70 61 63 65 20 62 75 66 66 65  The pSpace buffe
36860 72 20 69 73 20 75 73 65 64 20 74 6f 20 73 74 6f  r is used to sto
36870 72 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20 63  re a temporary c
36880 6f 70 79 20 6f 66 20 74 68 65 20 64 69 76 69 64  opy of the divid
36890 65 72 0a 2a 2a 20 63 65 6c 6c 20 74 68 61 74 20  er.** cell that 
368a0 77 69 6c 6c 20 62 65 20 69 6e 73 65 72 74 65 64  will be inserted
368b0 20 69 6e 74 6f 20 70 50 61 72 65 6e 74 2e 20 53   into pParent. S
368c0 75 63 68 20 61 20 63 65 6c 6c 20 63 6f 6e 73 69  uch a cell consi
368d0 73 74 73 20 6f 66 20 61 20 34 0a 2a 2a 20 62 79  sts of a 4.** by
368e0 74 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 66  te page number f
368f0 6f 6c 6c 6f 77 65 64 20 62 79 20 61 20 76 61 72  ollowed by a var
36900 69 61 62 6c 65 20 6c 65 6e 67 74 68 20 69 6e 74  iable length int
36910 65 67 65 72 2e 20 49 6e 20 6f 74 68 65 72 0a 2a  eger. In other.*
36920 2a 20 77 6f 72 64 73 2c 20 61 74 20 6d 6f 73 74  * words, at most
36930 20 31 33 20 62 79 74 65 73 2e 20 48 65 6e 63 65   13 bytes. Hence
36940 20 74 68 65 20 70 53 70 61 63 65 20 62 75 66 66   the pSpace buff
36950 65 72 20 6d 75 73 74 20 62 65 20 61 74 0a 2a 2a  er must be at.**
36960 20 6c 65 61 73 74 20 31 33 20 62 79 74 65 73 20   least 13 bytes 
36970 69 6e 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74  in size..*/.stat
36980 69 63 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f 71  ic int balance_q
36990 75 69 63 6b 28 4d 65 6d 50 61 67 65 20 2a 70 50  uick(MemPage *pP
369a0 61 72 65 6e 74 2c 20 4d 65 6d 50 61 67 65 20 2a  arent, MemPage *
369b0 70 50 61 67 65 2c 20 75 38 20 2a 70 53 70 61 63  pPage, u8 *pSpac
369c0 65 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  e){.  BtShared *
369d0 63 6f 6e 73 74 20 70 42 74 20 3d 20 70 50 61 67  const pBt = pPag
369e0 65 2d 3e 70 42 74 3b 20 20 20 20 2f 2a 20 42 2d  e->pBt;    /* B-
369f0 54 72 65 65 20 44 61 74 61 62 61 73 65 20 2a 2f  Tree Database */
36a00 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77  .  MemPage *pNew
36a10 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
36a20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 6c 79          /* Newly
36a30 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 20   allocated page 
36a40 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  */.  int rc;    
36a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36a60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
36a70 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 50 67  urn Code */.  Pg
36a80 6e 6f 20 70 67 6e 6f 4e 65 77 3b 20 20 20 20 20  no pgnoNew;     
36a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36aa0 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65     /* Page numbe
36ab0 72 20 6f 66 20 70 4e 65 77 20 2a 2f 0a 0a 20 20  r of pNew */..  
36ac0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
36ad0 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
36ae0 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
36af0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
36b00 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
36b10 6c 65 28 70 50 61 72 65 6e 74 2d 3e 70 44 62 50  le(pParent->pDbP
36b20 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74  age) );.  assert
36b30 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  ( pPage->nOverfl
36b40 6f 77 3d 3d 31 20 29 3b 0a 0a 20 20 2f 2a 20 54  ow==1 );..  /* T
36b50 68 69 73 20 65 72 72 6f 72 20 63 6f 6e 64 69 74  his error condit
36b60 69 6f 6e 20 69 73 20 6e 6f 77 20 63 61 75 67 68  ion is now caugh
36b70 74 20 70 72 69 6f 72 20 74 6f 20 72 65 61 63 68  t prior to reach
36b80 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ing this functio
36b90 6e 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52  n */.  if( NEVER
36ba0 28 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30  (pPage->nCell==0
36bb0 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ) ) return SQLIT
36bc0 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
36bd0 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61  .  /* Allocate a
36be0 20 6e 65 77 20 70 61 67 65 2e 20 54 68 69 73 20   new page. This 
36bf0 70 61 67 65 20 77 69 6c 6c 20 62 65 63 6f 6d 65  page will become
36c00 20 74 68 65 20 72 69 67 68 74 2d 73 69 62 6c 69   the right-sibli
36c10 6e 67 20 6f 66 20 0a 20 20 2a 2a 20 70 50 61 67  ng of .  ** pPag
36c20 65 2e 20 4d 61 6b 65 20 74 68 65 20 70 61 72 65  e. Make the pare
36c30 6e 74 20 70 61 67 65 20 77 72 69 74 61 62 6c 65  nt page writable
36c40 2c 20 73 6f 20 74 68 61 74 20 74 68 65 20 6e 65  , so that the ne
36c50 77 20 64 69 76 69 64 65 72 20 63 65 6c 6c 0a 20  w divider cell. 
36c60 20 2a 2a 20 6d 61 79 20 62 65 20 69 6e 73 65 72   ** may be inser
36c70 74 65 64 2e 20 49 66 20 62 6f 74 68 20 74 68 65  ted. If both the
36c80 73 65 20 6f 70 65 72 61 74 69 6f 6e 73 20 61 72  se operations ar
36c90 65 20 73 75 63 63 65 73 73 66 75 6c 2c 20 70 72  e successful, pr
36ca0 6f 63 65 65 64 2e 0a 20 20 2a 2f 0a 20 20 72 63  oceed..  */.  rc
36cb0 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65   = allocateBtree
36cc0 50 61 67 65 28 70 42 74 2c 20 26 70 4e 65 77 2c  Page(pBt, &pNew,
36cd0 20 26 70 67 6e 6f 4e 65 77 2c 20 30 2c 20 30 29   &pgnoNew, 0, 0)
36ce0 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  ;..  if( rc==SQL
36cf0 49 54 45 5f 4f 4b 20 29 7b 0a 0a 20 20 20 20 75  ITE_OK ){..    u
36d00 38 20 2a 70 4f 75 74 20 3d 20 26 70 53 70 61 63  8 *pOut = &pSpac
36d10 65 5b 34 5d 3b 0a 20 20 20 20 75 38 20 2a 70 43  e[4];.    u8 *pC
36d20 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 61 70 4f  ell = pPage->apO
36d30 76 66 6c 5b 30 5d 3b 0a 20 20 20 20 75 31 36 20  vfl[0];.    u16 
36d40 73 7a 43 65 6c 6c 20 3d 20 63 65 6c 6c 53 69 7a  szCell = cellSiz
36d50 65 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c  ePtr(pPage, pCel
36d60 6c 29 3b 0a 20 20 20 20 75 38 20 2a 70 53 74 6f  l);.    u8 *pSto
36d70 70 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  p;..    assert( 
36d80 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
36d90 69 74 65 61 62 6c 65 28 70 4e 65 77 2d 3e 70 44  iteable(pNew->pD
36da0 62 50 61 67 65 29 20 29 3b 0a 20 20 20 20 61 73  bPage) );.    as
36db0 73 65 72 74 28 20 70 50 61 67 65 2d 3e 61 44 61  sert( pPage->aDa
36dc0 74 61 5b 30 5d 3d 3d 28 50 54 46 5f 49 4e 54 4b  ta[0]==(PTF_INTK
36dd0 45 59 7c 50 54 46 5f 4c 45 41 46 44 41 54 41 7c  EY|PTF_LEAFDATA|
36de0 50 54 46 5f 4c 45 41 46 29 20 29 3b 0a 20 20 20  PTF_LEAF) );.   
36df0 20 7a 65 72 6f 50 61 67 65 28 70 4e 65 77 2c 20   zeroPage(pNew, 
36e00 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c  PTF_INTKEY|PTF_L
36e10 45 41 46 44 41 54 41 7c 50 54 46 5f 4c 45 41 46  EAFDATA|PTF_LEAF
36e20 29 3b 0a 20 20 20 20 72 65 62 75 69 6c 64 50 61  );.    rebuildPa
36e30 67 65 28 70 4e 65 77 2c 20 31 2c 20 26 70 43 65  ge(pNew, 1, &pCe
36e40 6c 6c 2c 20 26 73 7a 43 65 6c 6c 29 3b 0a 20 20  ll, &szCell);.  
36e50 20 20 70 4e 65 77 2d 3e 6e 46 72 65 65 20 3d 20    pNew->nFree = 
36e60 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
36e70 2d 20 70 4e 65 77 2d 3e 63 65 6c 6c 4f 66 66 73  - pNew->cellOffs
36e80 65 74 20 2d 20 32 20 2d 20 73 7a 43 65 6c 6c 3b  et - 2 - szCell;
36e90 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73  ..    /* If this
36ea0 20 69 73 20 61 6e 20 61 75 74 6f 2d 76 61 63 75   is an auto-vacu
36eb0 75 6d 20 64 61 74 61 62 61 73 65 2c 20 75 70 64  um database, upd
36ec0 61 74 65 20 74 68 65 20 70 6f 69 6e 74 65 72 20  ate the pointer 
36ed0 6d 61 70 0a 20 20 20 20 2a 2a 20 77 69 74 68 20  map.    ** with 
36ee0 65 6e 74 72 69 65 73 20 66 6f 72 20 74 68 65 20  entries for the 
36ef0 6e 65 77 20 70 61 67 65 2c 20 61 6e 64 20 61 6e  new page, and an
36f00 79 20 70 6f 69 6e 74 65 72 20 66 72 6f 6d 20 74  y pointer from t
36f10 68 65 20 0a 20 20 20 20 2a 2a 20 63 65 6c 6c 20  he .    ** cell 
36f20 6f 6e 20 74 68 65 20 70 61 67 65 20 74 6f 20 61  on the page to a
36f30 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e  n overflow page.
36f40 20 49 66 20 65 69 74 68 65 72 20 6f 66 20 74 68   If either of th
36f50 65 73 65 0a 20 20 20 20 2a 2a 20 6f 70 65 72 61  ese.    ** opera
36f60 74 69 6f 6e 73 20 66 61 69 6c 73 2c 20 74 68 65  tions fails, the
36f70 20 72 65 74 75 72 6e 20 63 6f 64 65 20 69 73 20   return code is 
36f80 73 65 74 2c 20 62 75 74 20 74 68 65 20 63 6f 6e  set, but the con
36f90 74 65 6e 74 73 0a 20 20 20 20 2a 2a 20 6f 66 20  tents.    ** of 
36fa0 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 20  the parent page 
36fb0 61 72 65 20 73 74 69 6c 6c 20 6d 61 6e 69 70 75  are still manipu
36fc0 6c 61 74 65 64 20 62 79 20 74 68 68 20 63 6f 64  lated by thh cod
36fd0 65 20 62 65 6c 6f 77 2e 0a 20 20 20 20 2a 2a 20  e below..    ** 
36fe0 54 68 61 74 20 69 73 20 4f 6b 2c 20 61 74 20 74  That is Ok, at t
36ff0 68 69 73 20 70 6f 69 6e 74 20 74 68 65 20 70 61  his point the pa
37000 72 65 6e 74 20 70 61 67 65 20 69 73 20 67 75 61  rent page is gua
37010 72 61 6e 74 65 65 64 20 74 6f 0a 20 20 20 20 2a  ranteed to.    *
37020 2a 20 62 65 20 6d 61 72 6b 65 64 20 61 73 20 64  * be marked as d
37030 69 72 74 79 2e 20 52 65 74 75 72 6e 69 6e 67 20  irty. Returning 
37040 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 77 69  an error code wi
37050 6c 6c 20 63 61 75 73 65 20 61 0a 20 20 20 20 2a  ll cause a.    *
37060 2a 20 72 6f 6c 6c 62 61 63 6b 2c 20 75 6e 64 6f  * rollback, undo
37070 69 6e 67 20 61 6e 79 20 63 68 61 6e 67 65 73 20  ing any changes 
37080 6d 61 64 65 20 74 6f 20 74 68 65 20 70 61 72 65  made to the pare
37090 6e 74 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a  nt page..    */.
370a0 20 20 20 20 69 66 28 20 49 53 41 55 54 4f 56 41      if( ISAUTOVA
370b0 43 55 55 4d 20 29 7b 0a 20 20 20 20 20 20 70 74  CUUM ){.      pt
370c0 72 6d 61 70 50 75 74 28 70 42 74 2c 20 70 67 6e  rmapPut(pBt, pgn
370d0 6f 4e 65 77 2c 20 50 54 52 4d 41 50 5f 42 54 52  oNew, PTRMAP_BTR
370e0 45 45 2c 20 70 50 61 72 65 6e 74 2d 3e 70 67 6e  EE, pParent->pgn
370f0 6f 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20 69  o, &rc);.      i
37100 66 28 20 73 7a 43 65 6c 6c 3e 70 4e 65 77 2d 3e  f( szCell>pNew->
37110 6d 69 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20  minLocal ){.    
37120 20 20 20 20 70 74 72 6d 61 70 50 75 74 4f 76 66      ptrmapPutOvf
37130 6c 50 74 72 28 70 4e 65 77 2c 20 70 43 65 6c 6c  lPtr(pNew, pCell
37140 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20 7d 0a  , &rc);.      }.
37150 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20      }.  .    /* 
37160 43 72 65 61 74 65 20 61 20 64 69 76 69 64 65 72  Create a divider
37170 20 63 65 6c 6c 20 74 6f 20 69 6e 73 65 72 74 20   cell to insert 
37180 69 6e 74 6f 20 70 50 61 72 65 6e 74 2e 20 54 68  into pParent. Th
37190 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c 0a 20  e divider cell. 
371a0 20 20 20 2a 2a 20 63 6f 6e 73 69 73 74 73 20 6f     ** consists o
371b0 66 20 61 20 34 2d 62 79 74 65 20 70 61 67 65 20  f a 4-byte page 
371c0 6e 75 6d 62 65 72 20 28 74 68 65 20 70 61 67 65  number (the page
371d0 20 6e 75 6d 62 65 72 20 6f 66 20 70 50 61 67 65   number of pPage
371e0 29 20 61 6e 64 0a 20 20 20 20 2a 2a 20 61 20 76  ) and.    ** a v
371f0 61 72 69 61 62 6c 65 20 6c 65 6e 67 74 68 20 6b  ariable length k
37200 65 79 20 76 61 6c 75 65 20 28 77 68 69 63 68 20  ey value (which 
37210 6d 75 73 74 20 62 65 20 74 68 65 20 73 61 6d 65  must be the same
37220 20 76 61 6c 75 65 20 61 73 20 74 68 65 0a 20 20   value as the.  
37230 20 20 2a 2a 20 6c 61 72 67 65 73 74 20 6b 65 79    ** largest key
37240 20 6f 6e 20 70 50 61 67 65 29 2e 0a 20 20 20 20   on pPage)..    
37250 2a 2a 0a 20 20 20 20 2a 2a 20 54 6f 20 66 69 6e  **.    ** To fin
37260 64 20 74 68 65 20 6c 61 72 67 65 73 74 20 6b 65  d the largest ke
37270 79 20 76 61 6c 75 65 20 6f 6e 20 70 50 61 67 65  y value on pPage
37280 2c 20 66 69 72 73 74 20 66 69 6e 64 20 74 68 65  , first find the
37290 20 72 69 67 68 74 2d 6d 6f 73 74 20 0a 20 20 20   right-most .   
372a0 20 2a 2a 20 63 65 6c 6c 20 6f 6e 20 70 50 61 67   ** cell on pPag
372b0 65 2e 20 54 68 65 20 66 69 72 73 74 20 74 77 6f  e. The first two
372c0 20 66 69 65 6c 64 73 20 6f 66 20 74 68 69 73 20   fields of this 
372d0 63 65 6c 6c 20 61 72 65 20 74 68 65 20 0a 20 20  cell are the .  
372e0 20 20 2a 2a 20 72 65 63 6f 72 64 2d 6c 65 6e 67    ** record-leng
372f0 74 68 20 28 61 20 76 61 72 69 61 62 6c 65 20 6c  th (a variable l
37300 65 6e 67 74 68 20 69 6e 74 65 67 65 72 20 61 74  ength integer at
37310 20 6d 6f 73 74 20 33 32 2d 62 69 74 73 20 69 6e   most 32-bits in
37320 20 73 69 7a 65 29 0a 20 20 20 20 2a 2a 20 61 6e   size).    ** an
37330 64 20 74 68 65 20 6b 65 79 20 76 61 6c 75 65 20  d the key value 
37340 28 61 20 76 61 72 69 61 62 6c 65 20 6c 65 6e 67  (a variable leng
37350 74 68 20 69 6e 74 65 67 65 72 2c 20 6d 61 79 20  th integer, may 
37360 68 61 76 65 20 61 6e 79 20 76 61 6c 75 65 29 2e  have any value).
37370 0a 20 20 20 20 2a 2a 20 54 68 65 20 66 69 72 73  .    ** The firs
37380 74 20 6f 66 20 74 68 65 20 77 68 69 6c 65 28 2e  t of the while(.
37390 2e 2e 29 20 6c 6f 6f 70 73 20 62 65 6c 6f 77 20  ..) loops below 
373a0 73 6b 69 70 73 20 6f 76 65 72 20 74 68 65 20 72  skips over the r
373b0 65 63 6f 72 64 2d 6c 65 6e 67 74 68 0a 20 20 20  ecord-length.   
373c0 20 2a 2a 20 66 69 65 6c 64 2e 20 54 68 65 20 73   ** field. The s
373d0 65 63 6f 6e 64 20 77 68 69 6c 65 28 2e 2e 2e 29  econd while(...)
373e0 20 6c 6f 6f 70 20 63 6f 70 69 65 73 20 74 68 65   loop copies the
373f0 20 6b 65 79 20 76 61 6c 75 65 20 66 72 6f 6d 20   key value from 
37400 74 68 65 0a 20 20 20 20 2a 2a 20 63 65 6c 6c 20  the.    ** cell 
37410 6f 6e 20 70 50 61 67 65 20 69 6e 74 6f 20 74 68  on pPage into th
37420 65 20 70 53 70 61 63 65 20 62 75 66 66 65 72 2e  e pSpace buffer.
37430 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 43 65 6c  .    */.    pCel
37440 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61  l = findCell(pPa
37450 67 65 2c 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ge, pPage->nCell
37460 2d 31 29 3b 0a 20 20 20 20 70 53 74 6f 70 20 3d  -1);.    pStop =
37470 20 26 70 43 65 6c 6c 5b 39 5d 3b 0a 20 20 20 20   &pCell[9];.    
37480 77 68 69 6c 65 28 20 28 2a 28 70 43 65 6c 6c 2b  while( (*(pCell+
37490 2b 29 26 30 78 38 30 29 20 26 26 20 70 43 65 6c  +)&0x80) && pCel
374a0 6c 3c 70 53 74 6f 70 20 29 3b 0a 20 20 20 20 70  l<pStop );.    p
374b0 53 74 6f 70 20 3d 20 26 70 43 65 6c 6c 5b 39 5d  Stop = &pCell[9]
374c0 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 28 2a  ;.    while( ((*
374d0 28 70 4f 75 74 2b 2b 29 20 3d 20 2a 28 70 43 65  (pOut++) = *(pCe
374e0 6c 6c 2b 2b 29 29 26 30 78 38 30 29 20 26 26 20  ll++))&0x80) && 
374f0 70 43 65 6c 6c 3c 70 53 74 6f 70 20 29 3b 0a 0a  pCell<pStop );..
37500 20 20 20 20 2f 2a 20 49 6e 73 65 72 74 20 74 68      /* Insert th
37510 65 20 6e 65 77 20 64 69 76 69 64 65 72 20 63 65  e new divider ce
37520 6c 6c 20 69 6e 74 6f 20 70 50 61 72 65 6e 74 2e  ll into pParent.
37530 20 2a 2f 0a 20 20 20 20 69 6e 73 65 72 74 43 65   */.    insertCe
37540 6c 6c 28 70 50 61 72 65 6e 74 2c 20 70 50 61 72  ll(pParent, pPar
37550 65 6e 74 2d 3e 6e 43 65 6c 6c 2c 20 70 53 70 61  ent->nCell, pSpa
37560 63 65 2c 20 28 69 6e 74 29 28 70 4f 75 74 2d 70  ce, (int)(pOut-p
37570 53 70 61 63 65 29 2c 0a 20 20 20 20 20 20 20 20  Space),.        
37580 20 20 20 20 20 20 20 30 2c 20 70 50 61 67 65 2d         0, pPage-
37590 3e 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 0a 20 20  >pgno, &rc);..  
375a0 20 20 2f 2a 20 53 65 74 20 74 68 65 20 72 69 67    /* Set the rig
375b0 68 74 2d 63 68 69 6c 64 20 70 6f 69 6e 74 65 72  ht-child pointer
375c0 20 6f 66 20 70 50 61 72 65 6e 74 20 74 6f 20 70   of pParent to p
375d0 6f 69 6e 74 20 74 6f 20 74 68 65 20 6e 65 77 20  oint to the new 
375e0 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 70 75 74  page. */.    put
375f0 34 62 79 74 65 28 26 70 50 61 72 65 6e 74 2d 3e  4byte(&pParent->
37600 61 44 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68  aData[pParent->h
37610 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20 70 67 6e  drOffset+8], pgn
37620 6f 4e 65 77 29 3b 0a 20 20 0a 20 20 20 20 2f 2a  oNew);.  .    /*
37630 20 52 65 6c 65 61 73 65 20 74 68 65 20 72 65 66   Release the ref
37640 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 6e 65  erence to the ne
37650 77 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 72  w page. */.    r
37660 65 6c 65 61 73 65 50 61 67 65 28 70 4e 65 77 29  eleasePage(pNew)
37670 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
37680 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  rc;.}.#endif /* 
37690 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 51 55 49 43  SQLITE_OMIT_QUIC
376a0 4b 42 41 4c 41 4e 43 45 20 2a 2f 0a 0a 23 69 66  KBALANCE */..#if
376b0 20 30 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75   0./*.** This fu
376c0 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20  nction does not 
376d0 63 6f 6e 74 72 69 62 75 74 65 20 61 6e 79 74 68  contribute anyth
376e0 69 6e 67 20 74 6f 20 74 68 65 20 6f 70 65 72 61  ing to the opera
376f0 74 69 6f 6e 20 6f 66 20 53 51 4c 69 74 65 2e 0a  tion of SQLite..
37700 2a 2a 20 69 74 20 69 73 20 73 6f 6d 65 74 69 6d  ** it is sometim
37710 65 73 20 61 63 74 69 76 61 74 65 64 20 74 65 6d  es activated tem
37720 70 6f 72 61 72 69 6c 79 20 77 68 69 6c 65 20 64  porarily while d
37730 65 62 75 67 67 69 6e 67 20 63 6f 64 65 20 72 65  ebugging code re
37740 73 70 6f 6e 73 69 62 6c 65 20 0a 2a 2a 20 66 6f  sponsible .** fo
37750 72 20 73 65 74 74 69 6e 67 20 70 6f 69 6e 74 65  r setting pointe
37760 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 2e 0a 2a  r-map entries..*
37770 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 74 72  /.static int ptr
37780 6d 61 70 43 68 65 63 6b 50 61 67 65 73 28 4d 65  mapCheckPages(Me
37790 6d 50 61 67 65 20 2a 2a 61 70 50 61 67 65 2c 20  mPage **apPage, 
377a0 69 6e 74 20 6e 50 61 67 65 29 7b 0a 20 20 69 6e  int nPage){.  in
377b0 74 20 69 2c 20 6a 3b 0a 20 20 66 6f 72 28 69 3d  t i, j;.  for(i=
377c0 30 3b 20 69 3c 6e 50 61 67 65 3b 20 69 2b 2b 29  0; i<nPage; i++)
377d0 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 3b 0a 20 20  {.    Pgno n;.  
377e0 20 20 75 38 20 65 3b 0a 20 20 20 20 4d 65 6d 50    u8 e;.    MemP
377f0 61 67 65 20 2a 70 50 61 67 65 20 3d 20 61 70 50  age *pPage = apP
37800 61 67 65 5b 69 5d 3b 0a 20 20 20 20 42 74 53 68  age[i];.    BtSh
37810 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67  ared *pBt = pPag
37820 65 2d 3e 70 42 74 3b 0a 20 20 20 20 61 73 73 65  e->pBt;.    asse
37830 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69  rt( pPage->isIni
37840 74 20 29 3b 0a 0a 20 20 20 20 66 6f 72 28 6a 3d  t );..    for(j=
37850 30 3b 20 6a 3c 70 50 61 67 65 2d 3e 6e 43 65 6c  0; j<pPage->nCel
37860 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 43  l; j++){.      C
37870 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20  ellInfo info;.  
37880 20 20 20 20 75 38 20 2a 7a 3b 0a 20 20 20 20 20      u8 *z;.     
37890 0a 20 20 20 20 20 20 7a 20 3d 20 66 69 6e 64 43  .      z = findC
378a0 65 6c 6c 28 70 50 61 67 65 2c 20 6a 29 3b 0a 20  ell(pPage, j);. 
378b0 20 20 20 20 20 62 74 72 65 65 50 61 72 73 65 43       btreeParseC
378c0 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 7a 2c  ellPtr(pPage, z,
378d0 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 69   &info);.      i
378e0 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f  f( info.iOverflo
378f0 77 20 29 7b 0a 20 20 20 20 20 20 20 20 50 67 6e  w ){.        Pgn
37900 6f 20 6f 76 66 6c 20 3d 20 67 65 74 34 62 79 74  o ovfl = get4byt
37910 65 28 26 7a 5b 69 6e 66 6f 2e 69 4f 76 65 72 66  e(&z[info.iOverf
37920 6c 6f 77 5d 29 3b 0a 20 20 20 20 20 20 20 20 70  low]);.        p
37930 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20 6f 76  trmapGet(pBt, ov
37940 66 6c 2c 20 26 65 2c 20 26 6e 29 3b 0a 20 20 20  fl, &e, &n);.   
37950 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 3d 3d       assert( n==
37960 70 50 61 67 65 2d 3e 70 67 6e 6f 20 26 26 20 65  pPage->pgno && e
37970 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  ==PTRMAP_OVERFLO
37980 57 31 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  W1 );.      }.  
37990 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e      if( !pPage->
379a0 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20  leaf ){.        
379b0 50 67 6e 6f 20 63 68 69 6c 64 20 3d 20 67 65 74  Pgno child = get
379c0 34 62 79 74 65 28 7a 29 3b 0a 20 20 20 20 20 20  4byte(z);.      
379d0 20 20 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c    ptrmapGet(pBt,
379e0 20 63 68 69 6c 64 2c 20 26 65 2c 20 26 6e 29 3b   child, &e, &n);
379f0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
37a00 20 6e 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20   n==pPage->pgno 
37a10 26 26 20 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52  && e==PTRMAP_BTR
37a20 45 45 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  EE );.      }.  
37a30 20 20 7d 0a 20 20 20 20 69 66 28 20 21 70 50 61    }.    if( !pPa
37a40 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
37a50 20 20 50 67 6e 6f 20 63 68 69 6c 64 20 3d 20 67    Pgno child = g
37a60 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e  et4byte(&pPage->
37a70 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72  aData[pPage->hdr
37a80 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20  Offset+8]);.    
37a90 20 20 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c    ptrmapGet(pBt,
37aa0 20 63 68 69 6c 64 2c 20 26 65 2c 20 26 6e 29 3b   child, &e, &n);
37ab0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e  .      assert( n
37ac0 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20 26 26  ==pPage->pgno &&
37ad0 20 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45 45   e==PTRMAP_BTREE
37ae0 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   );.    }.  }.  
37af0 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64  return 1;.}.#end
37b00 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  if../*.** This f
37b10 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20  unction is used 
37b20 74 6f 20 63 6f 70 79 20 74 68 65 20 63 6f 6e 74  to copy the cont
37b30 65 6e 74 73 20 6f 66 20 74 68 65 20 62 2d 74 72  ents of the b-tr
37b40 65 65 20 6e 6f 64 65 20 73 74 6f 72 65 64 20 0a  ee node stored .
37b50 2a 2a 20 6f 6e 20 70 61 67 65 20 70 46 72 6f 6d  ** on page pFrom
37b60 20 74 6f 20 70 61 67 65 20 70 54 6f 2e 20 49 66   to page pTo. If
37b70 20 70 61 67 65 20 70 46 72 6f 6d 20 77 61 73 20   page pFrom was 
37b80 6e 6f 74 20 61 20 6c 65 61 66 20 70 61 67 65 2c  not a leaf page,
37b90 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 70 6f 69   then.** the poi
37ba0 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73  nter-map entries
37bb0 20 66 6f 72 20 65 61 63 68 20 63 68 69 6c 64 20   for each child 
37bc0 70 61 67 65 20 61 72 65 20 75 70 64 61 74 65 64  page are updated
37bd0 20 73 6f 20 74 68 61 74 20 74 68 65 0a 2a 2a 20   so that the.** 
37be0 70 61 72 65 6e 74 20 70 61 67 65 20 73 74 6f 72  parent page stor
37bf0 65 64 20 69 6e 20 74 68 65 20 70 6f 69 6e 74 65  ed in the pointe
37c00 72 20 6d 61 70 20 69 73 20 70 61 67 65 20 70 54  r map is page pT
37c10 6f 2e 20 49 66 20 70 46 72 6f 6d 20 63 6f 6e 74  o. If pFrom cont
37c20 61 69 6e 65 64 0a 2a 2a 20 61 6e 79 20 63 65 6c  ained.** any cel
37c30 6c 73 20 77 69 74 68 20 6f 76 65 72 66 6c 6f 77  ls with overflow
37c40 20 70 61 67 65 20 70 6f 69 6e 74 65 72 73 2c 20   page pointers, 
37c50 74 68 65 6e 20 74 68 65 20 63 6f 72 72 65 73 70  then the corresp
37c60 6f 6e 64 69 6e 67 20 70 6f 69 6e 74 65 72 0a 2a  onding pointer.*
37c70 2a 20 6d 61 70 20 65 6e 74 72 69 65 73 20 61 72  * map entries ar
37c80 65 20 61 6c 73 6f 20 75 70 64 61 74 65 64 20 73  e also updated s
37c90 6f 20 74 68 61 74 20 74 68 65 20 70 61 72 65 6e  o that the paren
37ca0 74 20 70 61 67 65 20 69 73 20 70 61 67 65 20 70  t page is page p
37cb0 54 6f 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 46 72  To..**.** If pFr
37cc0 6f 6d 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  om is currently 
37cd0 63 61 72 72 79 69 6e 67 20 61 6e 79 20 6f 76 65  carrying any ove
37ce0 72 66 6c 6f 77 20 63 65 6c 6c 73 20 28 65 6e 74  rflow cells (ent
37cf0 72 69 65 73 20 69 6e 20 74 68 65 0a 2a 2a 20 4d  ries in the.** M
37d00 65 6d 50 61 67 65 2e 61 70 4f 76 66 6c 5b 5d 20  emPage.apOvfl[] 
37d10 61 72 72 61 79 29 2c 20 74 68 65 79 20 61 72 65  array), they are
37d20 20 6e 6f 74 20 63 6f 70 69 65 64 20 74 6f 20 70   not copied to p
37d30 54 6f 2e 20 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72  To. .**.** Befor
37d40 65 20 72 65 74 75 72 6e 69 6e 67 2c 20 70 61 67  e returning, pag
37d50 65 20 70 54 6f 20 69 73 20 72 65 69 6e 69 74 69  e pTo is reiniti
37d60 61 6c 69 7a 65 64 20 75 73 69 6e 67 20 62 74 72  alized using btr
37d70 65 65 49 6e 69 74 50 61 67 65 28 29 2e 0a 2a 2a  eeInitPage()..**
37d80 0a 2a 2a 20 54 68 65 20 70 65 72 66 6f 72 6d 61  .** The performa
37d90 6e 63 65 20 6f 66 20 74 68 69 73 20 66 75 6e 63  nce of this func
37da0 74 69 6f 6e 20 69 73 20 6e 6f 74 20 63 72 69 74  tion is not crit
37db0 69 63 61 6c 2e 20 49 74 20 69 73 20 6f 6e 6c 79  ical. It is only
37dc0 20 75 73 65 64 20 62 79 20 0a 2a 2a 20 74 68 65   used by .** the
37dd0 20 62 61 6c 61 6e 63 65 5f 73 68 61 6c 6c 6f 77   balance_shallow
37de0 65 72 28 29 20 61 6e 64 20 62 61 6c 61 6e 63 65  er() and balance
37df0 5f 64 65 65 70 65 72 28 29 20 70 72 6f 63 65 64  _deeper() proced
37e00 75 72 65 73 2c 20 6e 65 69 74 68 65 72 20 6f 66  ures, neither of
37e10 0a 2a 2a 20 77 68 69 63 68 20 61 72 65 20 63 61  .** which are ca
37e20 6c 6c 65 64 20 6f 66 74 65 6e 20 75 6e 64 65 72  lled often under
37e30 20 6e 6f 72 6d 61 6c 20 63 69 72 63 75 6d 73 74   normal circumst
37e40 61 6e 63 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  ances..*/.static
37e50 20 76 6f 69 64 20 63 6f 70 79 4e 6f 64 65 43 6f   void copyNodeCo
37e60 6e 74 65 6e 74 28 4d 65 6d 50 61 67 65 20 2a 70  ntent(MemPage *p
37e70 46 72 6f 6d 2c 20 4d 65 6d 50 61 67 65 20 2a 70  From, MemPage *p
37e80 54 6f 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20  To, int *pRC){. 
37e90 20 69 66 28 20 28 2a 70 52 43 29 3d 3d 53 51 4c   if( (*pRC)==SQL
37ea0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 42 74  ITE_OK ){.    Bt
37eb0 53 68 61 72 65 64 20 2a 20 63 6f 6e 73 74 20 70  Shared * const p
37ec0 42 74 20 3d 20 70 46 72 6f 6d 2d 3e 70 42 74 3b  Bt = pFrom->pBt;
37ed0 0a 20 20 20 20 75 38 20 2a 20 63 6f 6e 73 74 20  .    u8 * const 
37ee0 61 46 72 6f 6d 20 3d 20 70 46 72 6f 6d 2d 3e 61  aFrom = pFrom->a
37ef0 44 61 74 61 3b 0a 20 20 20 20 75 38 20 2a 20 63  Data;.    u8 * c
37f00 6f 6e 73 74 20 61 54 6f 20 3d 20 70 54 6f 2d 3e  onst aTo = pTo->
37f10 61 44 61 74 61 3b 0a 20 20 20 20 69 6e 74 20 63  aData;.    int c
37f20 6f 6e 73 74 20 69 46 72 6f 6d 48 64 72 20 3d 20  onst iFromHdr = 
37f30 70 46 72 6f 6d 2d 3e 68 64 72 4f 66 66 73 65 74  pFrom->hdrOffset
37f40 3b 0a 20 20 20 20 69 6e 74 20 63 6f 6e 73 74 20  ;.    int const 
37f50 69 54 6f 48 64 72 20 3d 20 28 28 70 54 6f 2d 3e  iToHdr = ((pTo->
37f60 70 67 6e 6f 3d 3d 31 29 20 3f 20 31 30 30 20 3a  pgno==1) ? 100 :
37f70 20 30 29 3b 0a 20 20 20 20 69 6e 74 20 72 63 3b   0);.    int rc;
37f80 0a 20 20 20 20 69 6e 74 20 69 44 61 74 61 3b 0a  .    int iData;.
37f90 20 20 0a 20 20 0a 20 20 20 20 61 73 73 65 72 74    .  .    assert
37fa0 28 20 70 46 72 6f 6d 2d 3e 69 73 49 6e 69 74 20  ( pFrom->isInit 
37fb0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
37fc0 46 72 6f 6d 2d 3e 6e 46 72 65 65 3e 3d 69 54 6f  From->nFree>=iTo
37fd0 48 64 72 20 29 3b 0a 20 20 20 20 61 73 73 65 72  Hdr );.    asser
37fe0 74 28 20 67 65 74 32 62 79 74 65 28 26 61 46 72  t( get2byte(&aFr
37ff0 6f 6d 5b 69 46 72 6f 6d 48 64 72 2b 35 5d 29 20  om[iFromHdr+5]) 
38000 3c 3d 20 28 69 6e 74 29 70 42 74 2d 3e 75 73 61  <= (int)pBt->usa
38010 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 0a 20 20  bleSize );.  .  
38020 20 20 2f 2a 20 43 6f 70 79 20 74 68 65 20 62 2d    /* Copy the b-
38030 74 72 65 65 20 6e 6f 64 65 20 63 6f 6e 74 65 6e  tree node conten
38040 74 20 66 72 6f 6d 20 70 61 67 65 20 70 46 72 6f  t from page pFro
38050 6d 20 74 6f 20 70 61 67 65 20 70 54 6f 2e 20 2a  m to page pTo. *
38060 2f 0a 20 20 20 20 69 44 61 74 61 20 3d 20 67 65  /.    iData = ge
38070 74 32 62 79 74 65 28 26 61 46 72 6f 6d 5b 69 46  t2byte(&aFrom[iF
38080 72 6f 6d 48 64 72 2b 35 5d 29 3b 0a 20 20 20 20  romHdr+5]);.    
38090 6d 65 6d 63 70 79 28 26 61 54 6f 5b 69 44 61 74  memcpy(&aTo[iDat
380a0 61 5d 2c 20 26 61 46 72 6f 6d 5b 69 44 61 74 61  a], &aFrom[iData
380b0 5d 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  ], pBt->usableSi
380c0 7a 65 2d 69 44 61 74 61 29 3b 0a 20 20 20 20 6d  ze-iData);.    m
380d0 65 6d 63 70 79 28 26 61 54 6f 5b 69 54 6f 48 64  emcpy(&aTo[iToHd
380e0 72 5d 2c 20 26 61 46 72 6f 6d 5b 69 46 72 6f 6d  r], &aFrom[iFrom
380f0 48 64 72 5d 2c 20 70 46 72 6f 6d 2d 3e 63 65 6c  Hdr], pFrom->cel
38100 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70 46 72 6f  lOffset + 2*pFro
38110 6d 2d 3e 6e 43 65 6c 6c 29 3b 0a 20 20 0a 20 20  m->nCell);.  .  
38120 20 20 2f 2a 20 52 65 69 6e 69 74 69 61 6c 69 7a    /* Reinitializ
38130 65 20 70 61 67 65 20 70 54 6f 20 73 6f 20 74 68  e page pTo so th
38140 61 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  at the contents 
38150 6f 66 20 74 68 65 20 4d 65 6d 50 61 67 65 20 73  of the MemPage s
38160 74 72 75 63 74 75 72 65 0a 20 20 20 20 2a 2a 20  tructure.    ** 
38170 6d 61 74 63 68 20 74 68 65 20 6e 65 77 20 64 61  match the new da
38180 74 61 2e 20 54 68 65 20 69 6e 69 74 69 61 6c 69  ta. The initiali
38190 7a 61 74 69 6f 6e 20 6f 66 20 70 54 6f 20 63 61  zation of pTo ca
381a0 6e 20 61 63 74 75 61 6c 6c 79 20 66 61 69 6c 20  n actually fail 
381b0 75 6e 64 65 72 0a 20 20 20 20 2a 2a 20 66 61 69  under.    ** fai
381c0 72 6c 79 20 6f 62 73 63 75 72 65 20 63 69 72 63  rly obscure circ
381d0 75 6d 73 74 61 6e 63 65 73 2c 20 65 76 65 6e 20  umstances, even 
381e0 74 68 6f 75 67 68 20 69 74 20 69 73 20 61 20 63  though it is a c
381f0 6f 70 79 20 6f 66 20 69 6e 69 74 69 61 6c 69 7a  opy of initializ
38200 65 64 20 0a 20 20 20 20 2a 2a 20 70 61 67 65 20  ed .    ** page 
38210 70 46 72 6f 6d 2e 0a 20 20 20 20 2a 2f 0a 20 20  pFrom..    */.  
38220 20 20 70 54 6f 2d 3e 69 73 49 6e 69 74 20 3d 20    pTo->isInit = 
38230 30 3b 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65  0;.    rc = btre
38240 65 49 6e 69 74 50 61 67 65 28 70 54 6f 29 3b 0a  eInitPage(pTo);.
38250 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
38260 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2a  TE_OK ){.      *
38270 70 52 43 20 3d 20 72 63 3b 0a 20 20 20 20 20 20  pRC = rc;.      
38280 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20  return;.    }.  
38290 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20  .    /* If this 
382a0 69 73 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75  is an auto-vacuu
382b0 6d 20 64 61 74 61 62 61 73 65 2c 20 75 70 64 61  m database, upda
382c0 74 65 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d  te the pointer-m
382d0 61 70 20 65 6e 74 72 69 65 73 0a 20 20 20 20 2a  ap entries.    *
382e0 2a 20 66 6f 72 20 61 6e 79 20 62 2d 74 72 65 65  * for any b-tree
382f0 20 6f 72 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   or overflow pag
38300 65 73 20 74 68 61 74 20 70 54 6f 20 6e 6f 77 20  es that pTo now 
38310 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 70 6f 69  contains the poi
38320 6e 74 65 72 73 20 74 6f 2e 0a 20 20 20 20 2a 2f  nters to..    */
38330 0a 20 20 20 20 69 66 28 20 49 53 41 55 54 4f 56  .    if( ISAUTOV
38340 41 43 55 55 4d 20 29 7b 0a 20 20 20 20 20 20 2a  ACUUM ){.      *
38350 70 52 43 20 3d 20 73 65 74 43 68 69 6c 64 50 74  pRC = setChildPt
38360 72 6d 61 70 73 28 70 54 6f 29 3b 0a 20 20 20 20  rmaps(pTo);.    
38370 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  }.  }.}../*.** T
38380 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 64 69  his routine redi
38390 73 74 72 69 62 75 74 65 73 20 63 65 6c 6c 73 20  stributes cells 
383a0 6f 6e 20 74 68 65 20 69 50 61 72 65 6e 74 49 64  on the iParentId
383b0 78 27 74 68 20 63 68 69 6c 64 20 6f 66 20 70 50  x'th child of pP
383c0 61 72 65 6e 74 0a 2a 2a 20 28 68 65 72 65 61 66  arent.** (hereaf
383d0 74 65 72 20 22 74 68 65 20 70 61 67 65 22 29 20  ter "the page") 
383e0 61 6e 64 20 75 70 20 74 6f 20 32 20 73 69 62 6c  and up to 2 sibl
383f0 69 6e 67 73 20 73 6f 20 74 68 61 74 20 61 6c 6c  ings so that all
38400 20 70 61 67 65 73 20 68 61 76 65 20 61 62 6f 75   pages have abou
38410 74 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20 61 6d  t the.** same am
38420 6f 75 6e 74 20 6f 66 20 66 72 65 65 20 73 70 61  ount of free spa
38430 63 65 2e 20 55 73 75 61 6c 6c 79 20 61 20 73 69  ce. Usually a si
38440 6e 67 6c 65 20 73 69 62 6c 69 6e 67 20 6f 6e 20  ngle sibling on 
38450 65 69 74 68 65 72 20 73 69 64 65 20 6f 66 20 74  either side of t
38460 68 65 0a 2a 2a 20 70 61 67 65 20 61 72 65 20 75  he.** page are u
38470 73 65 64 20 69 6e 20 74 68 65 20 62 61 6c 61 6e  sed in the balan
38480 63 69 6e 67 2c 20 74 68 6f 75 67 68 20 62 6f 74  cing, though bot
38490 68 20 73 69 62 6c 69 6e 67 73 20 6d 69 67 68 74  h