/ Hex Artifact Content
Login

Artifact ce342e156716fb64b9cf5c040260d0b47989f37b:


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 69  BtCursor *p;.  i
40f0: 66 28 20 70 42 74 72 65 65 2d 3e 68 61 73 49 6e  f( pBtree->hasIn
4100: 63 72 62 6c 6f 62 43 75 72 3d 3d 30 20 29 20 72  crblobCur==0 ) r
4110: 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28  eturn;.  assert(
4120: 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c   sqlite3BtreeHol
4130: 64 73 4d 75 74 65 78 28 70 42 74 72 65 65 29 20  dsMutex(pBtree) 
4140: 29 3b 0a 20 20 70 42 74 72 65 65 2d 3e 68 61 73  );.  pBtree->has
4150: 49 6e 63 72 62 6c 6f 62 43 75 72 20 3d 20 30 3b  IncrblobCur = 0;
4160: 0a 20 20 66 6f 72 28 70 3d 70 42 74 72 65 65 2d  .  for(p=pBtree-
4170: 3e 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70  >pBt->pCursor; p
4180: 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20  ; p=p->pNext){. 
4190: 20 20 20 69 66 28 20 28 70 2d 3e 63 75 72 46 6c     if( (p->curFl
41a0: 61 67 73 20 26 20 42 54 43 46 5f 49 6e 63 72 62  ags & BTCF_Incrb
41b0: 6c 6f 62 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  lob)!=0 ){.     
41c0: 20 70 42 74 72 65 65 2d 3e 68 61 73 49 6e 63 72   pBtree->hasIncr
41d0: 62 6c 6f 62 43 75 72 20 3d 20 31 3b 0a 20 20 20  blobCur = 1;.   
41e0: 20 20 20 69 66 28 20 69 73 43 6c 65 61 72 54 61     if( isClearTa
41f0: 62 6c 65 20 7c 7c 20 70 2d 3e 69 6e 66 6f 2e 6e  ble || p->info.n
4200: 4b 65 79 3d 3d 69 52 6f 77 20 29 7b 0a 20 20 20  Key==iRow ){.   
4210: 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65 20 3d       p->eState =
4220: 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b   CURSOR_INVALID;
4230: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
4240: 20 7d 0a 7d 0a 0a 23 65 6c 73 65 0a 20 20 2f 2a   }.}..#else.  /*
4250: 20 53 74 75 62 20 66 75 6e 63 74 69 6f 6e 20 77   Stub function w
4260: 68 65 6e 20 49 4e 43 52 42 4c 4f 42 20 69 73 20  hen INCRBLOB is 
4270: 6f 6d 69 74 74 65 64 20 2a 2f 0a 20 20 23 64 65  omitted */.  #de
4280: 66 69 6e 65 20 69 6e 76 61 6c 69 64 61 74 65 49  fine invalidateI
4290: 6e 63 72 62 6c 6f 62 43 75 72 73 6f 72 73 28 78  ncrblobCursors(x
42a0: 2c 79 2c 7a 29 0a 23 65 6e 64 69 66 20 2f 2a 20  ,y,z).#endif /* 
42b0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52  SQLITE_OMIT_INCR
42c0: 42 4c 4f 42 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53  BLOB */../*.** S
42d0: 65 74 20 62 69 74 20 70 67 6e 6f 20 6f 66 20 74  et bit pgno of t
42e0: 68 65 20 42 74 53 68 61 72 65 64 2e 70 48 61 73  he BtShared.pHas
42f0: 43 6f 6e 74 65 6e 74 20 62 69 74 76 65 63 2e 20  Content bitvec. 
4300: 54 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20 0a  This is called .
4310: 2a 2a 20 77 68 65 6e 20 61 20 70 61 67 65 20 74  ** when a page t
4320: 68 61 74 20 70 72 65 76 69 6f 75 73 6c 79 20 63  hat previously c
4330: 6f 6e 74 61 69 6e 65 64 20 64 61 74 61 20 62 65  ontained data be
4340: 63 6f 6d 65 73 20 61 20 66 72 65 65 2d 6c 69 73  comes a free-lis
4350: 74 20 6c 65 61 66 20 0a 2a 2a 20 70 61 67 65 2e  t leaf .** page.
4360: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 42 74 53 68 61  .**.** The BtSha
4370: 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20  red.pHasContent 
4380: 62 69 74 76 65 63 20 65 78 69 73 74 73 20 74 6f  bitvec exists to
4390: 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 61 6e 20   work around an 
43a0: 6f 62 73 63 75 72 65 0a 2a 2a 20 62 75 67 20 63  obscure.** bug c
43b0: 61 75 73 65 64 20 62 79 20 74 68 65 20 69 6e 74  aused by the int
43c0: 65 72 61 63 74 69 6f 6e 20 6f 66 20 74 77 6f 20  eraction of two 
43d0: 75 73 65 66 75 6c 20 49 4f 20 6f 70 74 69 6d 69  useful IO optimi
43e0: 7a 61 74 69 6f 6e 73 20 73 75 72 72 6f 75 6e 64  zations surround
43f0: 69 6e 67 0a 2a 2a 20 66 72 65 65 2d 6c 69 73 74  ing.** free-list
4400: 20 6c 65 61 66 20 70 61 67 65 73 3a 0a 2a 2a 0a   leaf pages:.**.
4410: 2a 2a 20 20 20 31 29 20 57 68 65 6e 20 61 6c 6c  **   1) When all
4420: 20 64 61 74 61 20 69 73 20 64 65 6c 65 74 65 64   data is deleted
4430: 20 66 72 6f 6d 20 61 20 70 61 67 65 20 61 6e 64   from a page and
4440: 20 74 68 65 20 70 61 67 65 20 62 65 63 6f 6d 65   the page become
4450: 73 0a 2a 2a 20 20 20 20 20 20 61 20 66 72 65 65  s.**      a free
4460: 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65 2c  -list leaf page,
4470: 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
4480: 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
4490: 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 20 20  database.**     
44a0: 20 28 61 73 20 66 72 65 65 2d 6c 69 73 74 20 6c   (as free-list l
44b0: 65 61 66 20 70 61 67 65 73 20 63 6f 6e 74 61 69  eaf pages contai
44c0: 6e 20 6e 6f 20 6d 65 61 6e 69 6e 67 66 75 6c 20  n no meaningful 
44d0: 64 61 74 61 29 2e 20 53 6f 6d 65 74 69 6d 65 73  data). Sometimes
44e0: 0a 2a 2a 20 20 20 20 20 20 73 75 63 68 20 61 20  .**      such a 
44f0: 70 61 67 65 20 69 73 20 6e 6f 74 20 65 76 65 6e  page is not even
4500: 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 28 61 73 20   journalled (as 
4510: 69 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 6d  it will not be m
4520: 6f 64 69 66 69 65 64 2c 0a 2a 2a 20 20 20 20 20  odified,.**     
4530: 20 77 68 79 20 62 6f 74 68 65 72 20 6a 6f 75 72   why bother jour
4540: 6e 61 6c 6c 69 6e 67 20 69 74 3f 29 2e 0a 2a 2a  nalling it?)..**
4550: 0a 2a 2a 20 20 20 32 29 20 57 68 65 6e 20 61 20  .**   2) When a 
4560: 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70  free-list leaf p
4570: 61 67 65 20 69 73 20 72 65 75 73 65 64 2c 20 69  age is reused, i
4580: 74 73 20 63 6f 6e 74 65 6e 74 20 69 73 20 6e 6f  ts content is no
4590: 74 20 72 65 61 64 0a 2a 2a 20 20 20 20 20 20 66  t read.**      f
45a0: 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
45b0: 20 6f 72 20 77 72 69 74 74 65 6e 20 74 6f 20 74   or written to t
45c0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
45d0: 28 77 68 79 20 73 68 6f 75 6c 64 20 69 74 0a 2a  (why should it.*
45e0: 2a 20 20 20 20 20 20 62 65 2c 20 69 66 20 69 74  *      be, if it
45f0: 20 69 73 20 6e 6f 74 20 61 74 20 61 6c 6c 20 6d   is not at all m
4600: 65 61 6e 69 6e 67 66 75 6c 3f 29 2e 0a 2a 2a 0a  eaningful?)..**.
4610: 2a 2a 20 42 79 20 74 68 65 6d 73 65 6c 76 65 73  ** By themselves
4620: 2c 20 74 68 65 73 65 20 6f 70 74 69 6d 69 7a 61  , these optimiza
4630: 74 69 6f 6e 73 20 77 6f 72 6b 20 66 69 6e 65 20  tions work fine 
4640: 61 6e 64 20 70 72 6f 76 69 64 65 20 61 20 68 61  and provide a ha
4650: 6e 64 79 0a 2a 2a 20 70 65 72 66 6f 72 6d 61 6e  ndy.** performan
4660: 63 65 20 62 6f 6f 73 74 20 74 6f 20 62 75 6c 6b  ce boost to bulk
4670: 20 64 65 6c 65 74 65 20 6f 72 20 69 6e 73 65 72   delete or inser
4680: 74 20 6f 70 65 72 61 74 69 6f 6e 73 2e 20 48 6f  t operations. Ho
4690: 77 65 76 65 72 2c 20 69 66 0a 2a 2a 20 61 20 70  wever, if.** a p
46a0: 61 67 65 20 69 73 20 6d 6f 76 65 64 20 74 6f 20  age is moved to 
46b0: 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 61 6e  the free-list an
46c0: 64 20 74 68 65 6e 20 72 65 75 73 65 64 20 77 69  d then reused wi
46d0: 74 68 69 6e 20 74 68 65 20 73 61 6d 65 0a 2a 2a  thin the same.**
46e0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 61 20   transaction, a 
46f0: 70 72 6f 62 6c 65 6d 20 63 6f 6d 65 73 20 75 70  problem comes up
4700: 2e 20 49 66 20 74 68 65 20 70 61 67 65 20 69 73  . If the page is
4710: 20 6e 6f 74 20 6a 6f 75 72 6e 61 6c 6c 65 64 20   not journalled 
4720: 77 68 65 6e 0a 2a 2a 20 69 74 20 69 73 20 6d 6f  when.** it is mo
4730: 76 65 64 20 74 6f 20 74 68 65 20 66 72 65 65 2d  ved to the free-
4740: 6c 69 73 74 20 61 6e 64 20 69 74 20 69 73 20 61  list and it is a
4750: 6c 73 6f 20 6e 6f 74 20 6a 6f 75 72 6e 61 6c 6c  lso not journall
4760: 65 64 20 77 68 65 6e 20 69 74 0a 2a 2a 20 69 73  ed when it.** is
4770: 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
4780: 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 61 6e  the free-list an
4790: 64 20 72 65 75 73 65 64 2c 20 74 68 65 6e 20 74  d reused, then t
47a0: 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61  he original data
47b0: 0a 2a 2a 20 6d 61 79 20 62 65 20 6c 6f 73 74 2e  .** may be lost.
47c0: 20 49 6e 20 74 68 65 20 65 76 65 6e 74 20 6f 66   In the event of
47d0: 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 69 74 20   a rollback, it 
47e0: 6d 61 79 20 6e 6f 74 20 62 65 20 70 6f 73 73 69  may not be possi
47f0: 62 6c 65 0a 2a 2a 20 74 6f 20 72 65 73 74 6f 72  ble.** to restor
4800: 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74  e the database t
4810: 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 63  o its original c
4820: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 0a 2a 2a  onfiguration..**
4830: 0a 2a 2a 20 54 68 65 20 73 6f 6c 75 74 69 6f 6e  .** The solution
4840: 20 69 73 20 74 68 65 20 42 74 53 68 61 72 65 64   is the BtShared
4850: 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 62 69 74  .pHasContent bit
4860: 76 65 63 2e 20 57 68 65 6e 65 76 65 72 20 61 20  vec. Whenever a 
4870: 70 61 67 65 20 69 73 20 0a 2a 2a 20 6d 6f 76 65  page is .** move
4880: 64 20 74 6f 20 62 65 63 6f 6d 65 20 61 20 66 72  d to become a fr
4890: 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67  ee-list leaf pag
48a0: 65 2c 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  e, the correspon
48b0: 64 69 6e 67 20 62 69 74 20 69 73 0a 2a 2a 20 73  ding bit is.** s
48c0: 65 74 20 69 6e 20 74 68 65 20 62 69 74 76 65 63  et in the bitvec
48d0: 2e 20 57 68 65 6e 65 76 65 72 20 61 20 6c 65 61  . Whenever a lea
48e0: 66 20 70 61 67 65 20 69 73 20 65 78 74 72 61 63  f page is extrac
48f0: 74 65 64 20 66 72 6f 6d 20 74 68 65 20 66 72 65  ted from the fre
4900: 65 2d 6c 69 73 74 2c 0a 2a 2a 20 6f 70 74 69 6d  e-list,.** optim
4910: 69 7a 61 74 69 6f 6e 20 32 20 61 62 6f 76 65 20  ization 2 above 
4920: 69 73 20 6f 6d 69 74 74 65 64 20 69 66 20 74 68  is omitted if th
4930: 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
4940: 62 69 74 20 69 73 20 61 6c 72 65 61 64 79 0a 2a  bit is already.*
4950: 2a 20 73 65 74 20 69 6e 20 42 74 53 68 61 72 65  * set in BtShare
4960: 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 2e 20 54  d.pHasContent. T
4970: 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
4980: 68 65 20 62 69 74 76 65 63 20 61 72 65 20 63 6c  he bitvec are cl
4990: 65 61 72 65 64 0a 2a 2a 20 61 74 20 74 68 65 20  eared.** at the 
49a0: 65 6e 64 20 6f 66 20 65 76 65 72 79 20 74 72 61  end of every tra
49b0: 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  nsaction..*/.sta
49c0: 74 69 63 20 69 6e 74 20 62 74 72 65 65 53 65 74  tic int btreeSet
49d0: 48 61 73 43 6f 6e 74 65 6e 74 28 42 74 53 68 61  HasContent(BtSha
49e0: 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70  red *pBt, Pgno p
49f0: 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  gno){.  int rc =
4a00: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66   SQLITE_OK;.  if
4a10: 28 20 21 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74  ( !pBt->pHasCont
4a20: 65 6e 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ent ){.    asser
4a30: 74 28 20 70 67 6e 6f 3c 3d 70 42 74 2d 3e 6e 50  t( pgno<=pBt->nP
4a40: 61 67 65 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e  age );.    pBt->
4a50: 70 48 61 73 43 6f 6e 74 65 6e 74 20 3d 20 73 71  pHasContent = sq
4a60: 6c 69 74 65 33 42 69 74 76 65 63 43 72 65 61 74  lite3BitvecCreat
4a70: 65 28 70 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20  e(pBt->nPage);. 
4a80: 20 20 20 69 66 28 20 21 70 42 74 2d 3e 70 48 61     if( !pBt->pHa
4a90: 73 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20  sContent ){.    
4aa0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
4ab0: 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  MEM;.    }.  }. 
4ac0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
4ad0: 4f 4b 20 26 26 20 70 67 6e 6f 3c 3d 73 71 6c 69  OK && pgno<=sqli
4ae0: 74 65 33 42 69 74 76 65 63 53 69 7a 65 28 70 42  te3BitvecSize(pB
4af0: 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 29 20  t->pHasContent) 
4b00: 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
4b10: 74 65 33 42 69 74 76 65 63 53 65 74 28 70 42 74  te3BitvecSet(pBt
4b20: 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 2c 20 70  ->pHasContent, p
4b30: 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  gno);.  }.  retu
4b40: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
4b50: 51 75 65 72 79 20 74 68 65 20 42 74 53 68 61 72  Query the BtShar
4b60: 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 76  ed.pHasContent v
4b70: 65 63 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ector..**.** Thi
4b80: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
4b90: 6c 6c 65 64 20 77 68 65 6e 20 61 20 66 72 65 65  lled when a free
4ba0: 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65 20  -list leaf page 
4bb0: 69 73 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20  is removed from 
4bc0: 74 68 65 0a 2a 2a 20 66 72 65 65 2d 6c 69 73 74  the.** free-list
4bd0: 20 66 6f 72 20 72 65 75 73 65 2e 20 49 74 20 72   for reuse. It r
4be0: 65 74 75 72 6e 73 20 66 61 6c 73 65 20 69 66 20  eturns false if 
4bf0: 69 74 20 69 73 20 73 61 66 65 20 74 6f 20 72 65  it is safe to re
4c00: 74 72 69 65 76 65 20 74 68 65 0a 2a 2a 20 70 61  trieve the.** pa
4c10: 67 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65  ge from the page
4c20: 72 20 6c 61 79 65 72 20 77 69 74 68 20 74 68 65  r layer with the
4c30: 20 27 6e 6f 2d 63 6f 6e 74 65 6e 74 27 20 66 6c   'no-content' fl
4c40: 61 67 20 73 65 74 2e 20 54 72 75 65 20 6f 74 68  ag set. True oth
4c50: 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69  erwise..*/.stati
4c60: 63 20 69 6e 74 20 62 74 72 65 65 47 65 74 48 61  c int btreeGetHa
4c70: 73 43 6f 6e 74 65 6e 74 28 42 74 53 68 61 72 65  sContent(BtShare
4c80: 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e  d *pBt, Pgno pgn
4c90: 6f 29 7b 0a 20 20 42 69 74 76 65 63 20 2a 70 20  o){.  Bitvec *p 
4ca0: 3d 20 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65  = pBt->pHasConte
4cb0: 6e 74 3b 0a 20 20 72 65 74 75 72 6e 20 28 70 20  nt;.  return (p 
4cc0: 26 26 20 28 70 67 6e 6f 3e 73 71 6c 69 74 65 33  && (pgno>sqlite3
4cd0: 42 69 74 76 65 63 53 69 7a 65 28 70 29 20 7c 7c  BitvecSize(p) ||
4ce0: 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 54 65   sqlite3BitvecTe
4cf0: 73 74 28 70 2c 20 70 67 6e 6f 29 29 29 3b 0a 7d  st(p, pgno)));.}
4d00: 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 28 64  ../*.** Clear (d
4d10: 65 73 74 72 6f 79 29 20 74 68 65 20 42 74 53 68  estroy) the BtSh
4d20: 61 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74  ared.pHasContent
4d30: 20 62 69 74 76 65 63 2e 20 54 68 69 73 20 73 68   bitvec. This sh
4d40: 6f 75 6c 64 20 62 65 0a 2a 2a 20 69 6e 76 6f 6b  ould be.** invok
4d50: 65 64 20 61 74 20 74 68 65 20 63 6f 6e 63 6c 75  ed at the conclu
4d60: 73 69 6f 6e 20 6f 66 20 65 61 63 68 20 77 72 69  sion of each wri
4d70: 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  te-transaction..
4d80: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62  */.static void b
4d90: 74 72 65 65 43 6c 65 61 72 48 61 73 43 6f 6e 74  treeClearHasCont
4da0: 65 6e 74 28 42 74 53 68 61 72 65 64 20 2a 70 42  ent(BtShared *pB
4db0: 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 42 69 74  t){.  sqlite3Bit
4dc0: 76 65 63 44 65 73 74 72 6f 79 28 70 42 74 2d 3e  vecDestroy(pBt->
4dd0: 70 48 61 73 43 6f 6e 74 65 6e 74 29 3b 0a 20 20  pHasContent);.  
4de0: 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74  pBt->pHasContent
4df0: 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52   = 0;.}../*.** R
4e00: 65 6c 65 61 73 65 20 61 6c 6c 20 6f 66 20 74 68  elease all of th
4e10: 65 20 61 70 50 61 67 65 5b 5d 20 70 61 67 65 73  e apPage[] pages
4e20: 20 66 6f 72 20 61 20 63 75 72 73 6f 72 2e 0a 2a   for a cursor..*
4e30: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 74  /.static void bt
4e40: 72 65 65 52 65 6c 65 61 73 65 41 6c 6c 43 75 72  reeReleaseAllCur
4e50: 73 6f 72 50 61 67 65 73 28 42 74 43 75 72 73 6f  sorPages(BtCurso
4e60: 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74 20  r *pCur){.  int 
4e70: 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  i;.  for(i=0; i<
4e80: 3d 70 43 75 72 2d 3e 69 50 61 67 65 3b 20 69 2b  =pCur->iPage; i+
4e90: 2b 29 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 50  +){.    releaseP
4ea0: 61 67 65 28 70 43 75 72 2d 3e 61 70 50 61 67 65  age(pCur->apPage
4eb0: 5b 69 5d 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e  [i]);.    pCur->
4ec0: 61 70 50 61 67 65 5b 69 5d 20 3d 20 30 3b 0a 20  apPage[i] = 0;. 
4ed0: 20 7d 0a 20 20 70 43 75 72 2d 3e 69 50 61 67 65   }.  pCur->iPage
4ee0: 20 3d 20 2d 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a   = -1;.}.../*.**
4ef0: 20 53 61 76 65 20 74 68 65 20 63 75 72 72 65 6e   Save the curren
4f00: 74 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f  t cursor positio
4f10: 6e 20 69 6e 20 74 68 65 20 76 61 72 69 61 62 6c  n in the variabl
4f20: 65 73 20 42 74 43 75 72 73 6f 72 2e 6e 4b 65 79  es BtCursor.nKey
4f30: 20 0a 2a 2a 20 61 6e 64 20 42 74 43 75 72 73 6f   .** and BtCurso
4f40: 72 2e 70 4b 65 79 2e 20 54 68 65 20 63 75 72 73  r.pKey. The curs
4f50: 6f 72 27 73 20 73 74 61 74 65 20 69 73 20 73 65  or's state is se
4f60: 74 20 74 6f 20 43 55 52 53 4f 52 5f 52 45 51 55  t to CURSOR_REQU
4f70: 49 52 45 53 45 45 4b 2e 0a 2a 2a 0a 2a 2a 20 54  IRESEEK..**.** T
4f80: 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 65  he caller must e
4f90: 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20 63  nsure that the c
4fa0: 75 72 73 6f 72 20 69 73 20 76 61 6c 69 64 20 28  ursor is valid (
4fb0: 68 61 73 20 65 53 74 61 74 65 3d 3d 43 55 52 53  has eState==CURS
4fc0: 4f 52 5f 56 41 4c 49 44 29 0a 2a 2a 20 70 72 69  OR_VALID).** pri
4fd0: 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67 20 74 68  or to calling th
4fe0: 69 73 20 72 6f 75 74 69 6e 65 2e 20 20 0a 2a 2f  is routine.  .*/
4ff0: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61 76 65  .static int save
5000: 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 42  CursorPosition(B
5010: 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
5020: 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73    int rc;..  ass
5030: 65 72 74 28 20 43 55 52 53 4f 52 5f 56 41 4c 49  ert( CURSOR_VALI
5040: 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20  D==pCur->eState 
5050: 7c 7c 20 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45  || CURSOR_SKIPNE
5060: 58 54 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65  XT==pCur->eState
5070: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 30 3d   );.  assert( 0=
5080: 3d 70 43 75 72 2d 3e 70 4b 65 79 20 29 3b 0a 20  =pCur->pKey );. 
5090: 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
50a0: 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
50b0: 29 3b 0a 0a 20 20 69 66 28 20 70 43 75 72 2d 3e  );..  if( pCur->
50c0: 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 53  eState==CURSOR_S
50d0: 4b 49 50 4e 45 58 54 20 29 7b 0a 20 20 20 20 70  KIPNEXT ){.    p
50e0: 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
50f0: 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 7d 65  RSOR_VALID;.  }e
5100: 6c 73 65 7b 0a 20 20 20 20 70 43 75 72 2d 3e 73  lse{.    pCur->s
5110: 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 7d  kipNext = 0;.  }
5120: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42  .  rc = sqlite3B
5130: 74 72 65 65 4b 65 79 53 69 7a 65 28 70 43 75 72  treeKeySize(pCur
5140: 2c 20 26 70 43 75 72 2d 3e 6e 4b 65 79 29 3b 0a  , &pCur->nKey);.
5150: 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
5160: 4c 49 54 45 5f 4f 4b 20 29 3b 20 20 2f 2a 20 4b  LITE_OK );  /* K
5170: 65 79 53 69 7a 65 28 29 20 63 61 6e 6e 6f 74 20  eySize() cannot 
5180: 66 61 69 6c 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66  fail */..  /* If
5190: 20 74 68 69 73 20 69 73 20 61 6e 20 69 6e 74 4b   this is an intK
51a0: 65 79 20 74 61 62 6c 65 2c 20 74 68 65 6e 20 74  ey table, then t
51b0: 68 65 20 61 62 6f 76 65 20 63 61 6c 6c 20 74 6f  he above call to
51c0: 20 42 74 72 65 65 4b 65 79 53 69 7a 65 28 29 0a   BtreeKeySize().
51d0: 20 20 2a 2a 20 73 74 6f 72 65 73 20 74 68 65 20    ** stores the 
51e0: 69 6e 74 65 67 65 72 20 6b 65 79 20 69 6e 20 70  integer key in p
51f0: 43 75 72 2d 3e 6e 4b 65 79 2e 20 49 6e 20 74 68  Cur->nKey. In th
5200: 69 73 20 63 61 73 65 20 74 68 69 73 20 76 61 6c  is case this val
5210: 75 65 20 69 73 0a 20 20 2a 2a 20 61 6c 6c 20 74  ue is.  ** all t
5220: 68 61 74 20 69 73 20 72 65 71 75 69 72 65 64 2e  hat is required.
5230: 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 70   Otherwise, if p
5240: 43 75 72 20 69 73 20 6e 6f 74 20 6f 70 65 6e 20  Cur is not open 
5250: 6f 6e 20 61 6e 20 69 6e 74 4b 65 79 0a 20 20 2a  on an intKey.  *
5260: 2a 20 74 61 62 6c 65 2c 20 74 68 65 6e 20 6d 61  * table, then ma
5270: 6c 6c 6f 63 20 73 70 61 63 65 20 66 6f 72 20 61  lloc space for a
5280: 6e 64 20 73 74 6f 72 65 20 74 68 65 20 70 43 75  nd store the pCu
5290: 72 2d 3e 6e 4b 65 79 20 62 79 74 65 73 20 6f 66  r->nKey bytes of
52a0: 20 6b 65 79 20 0a 20 20 2a 2a 20 64 61 74 61 2e   key .  ** data.
52b0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 30 3d 3d 70  .  */.  if( 0==p
52c0: 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79 20 29  Cur->curIntKey )
52d0: 7b 0a 20 20 20 20 76 6f 69 64 20 2a 70 4b 65 79  {.    void *pKey
52e0: 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
52f0: 28 20 70 43 75 72 2d 3e 6e 4b 65 79 20 29 3b 0a  ( pCur->nKey );.
5300: 20 20 20 20 69 66 28 20 70 4b 65 79 20 29 7b 0a      if( pKey ){.
5310: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
5320: 65 33 42 74 72 65 65 4b 65 79 28 70 43 75 72 2c  e3BtreeKey(pCur,
5330: 20 30 2c 20 28 69 6e 74 29 70 43 75 72 2d 3e 6e   0, (int)pCur->n
5340: 4b 65 79 2c 20 70 4b 65 79 29 3b 0a 20 20 20 20  Key, pKey);.    
5350: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
5360: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70  _OK ){.        p
5370: 43 75 72 2d 3e 70 4b 65 79 20 3d 20 70 4b 65 79  Cur->pKey = pKey
5380: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
5390: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
53a0: 72 65 65 28 70 4b 65 79 29 3b 0a 20 20 20 20 20  ree(pKey);.     
53b0: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
53c0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
53d0: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d  NOMEM;.    }.  }
53e0: 0a 20 20 61 73 73 65 72 74 28 20 21 70 43 75 72  .  assert( !pCur
53f0: 2d 3e 63 75 72 49 6e 74 4b 65 79 20 7c 7c 20 21  ->curIntKey || !
5400: 70 43 75 72 2d 3e 70 4b 65 79 20 29 3b 0a 0a 20  pCur->pKey );.. 
5410: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
5420: 4f 4b 20 29 7b 0a 20 20 20 20 62 74 72 65 65 52  OK ){.    btreeR
5430: 65 6c 65 61 73 65 41 6c 6c 43 75 72 73 6f 72 50  eleaseAllCursorP
5440: 61 67 65 73 28 70 43 75 72 29 3b 0a 20 20 20 20  ages(pCur);.    
5450: 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
5460: 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45  URSOR_REQUIRESEE
5470: 4b 3b 0a 20 20 7d 0a 0a 20 20 69 6e 76 61 6c 69  K;.  }..  invali
5480: 64 61 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68  dateOverflowCach
5490: 65 28 70 43 75 72 29 3b 0a 20 20 72 65 74 75 72  e(pCur);.  retur
54a0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77  n rc;.}../* Forw
54b0: 61 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f  ard reference */
54c0: 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49  .static int SQLI
54d0: 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 73 61 76 65  TE_NOINLINE save
54e0: 43 75 72 73 6f 72 73 4f 6e 4c 69 73 74 28 42 74  CursorsOnList(Bt
54f0: 43 75 72 73 6f 72 2a 2c 50 67 6e 6f 2c 42 74 43  Cursor*,Pgno,BtC
5500: 75 72 73 6f 72 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20  ursor*);../*.** 
5510: 53 61 76 65 20 74 68 65 20 70 6f 73 69 74 69 6f  Save the positio
5520: 6e 73 20 6f 66 20 61 6c 6c 20 63 75 72 73 6f 72  ns of all cursor
5530: 73 20 28 65 78 63 65 70 74 20 70 45 78 63 65 70  s (except pExcep
5540: 74 29 20 74 68 61 74 20 61 72 65 20 6f 70 65 6e  t) that are open
5550: 20 6f 6e 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65   on.** the table
5560: 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20   with root-page 
5570: 69 52 6f 6f 74 2e 20 20 22 53 61 76 69 6e 67 20  iRoot.  "Saving 
5580: 74 68 65 20 63 75 72 73 6f 72 20 70 6f 73 69 74  the cursor posit
5590: 69 6f 6e 22 20 6d 65 61 6e 73 20 74 68 61 74 0a  ion" means that.
55a0: 2a 2a 20 74 68 65 20 6c 6f 63 61 74 69 6f 6e 20  ** the location 
55b0: 69 6e 20 74 68 65 20 62 74 72 65 65 20 69 73 20  in the btree is 
55c0: 72 65 6d 65 6d 62 65 72 65 64 20 69 6e 20 73 75  remembered in su
55d0: 63 68 20 61 20 77 61 79 20 74 68 61 74 20 69 74  ch a way that it
55e0: 20 63 61 6e 20 62 65 0a 2a 2a 20 6d 6f 76 65 64   can be.** moved
55f0: 20 62 61 63 6b 20 74 6f 20 74 68 65 20 73 61 6d   back to the sam
5600: 65 20 73 70 6f 74 20 61 66 74 65 72 20 74 68 65  e spot after the
5610: 20 62 74 72 65 65 20 68 61 73 20 62 65 65 6e 20   btree has been 
5620: 6d 6f 64 69 66 69 65 64 2e 20 20 54 68 69 73 0a  modified.  This.
5630: 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  ** routine is ca
5640: 6c 6c 65 64 20 6a 75 73 74 20 62 65 66 6f 72 65  lled just before
5650: 20 63 75 72 73 6f 72 20 70 45 78 63 65 70 74 20   cursor pExcept 
5660: 69 73 20 75 73 65 64 20 74 6f 20 6d 6f 64 69 66  is used to modif
5670: 79 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65 2c 20  y the.** table, 
5680: 66 6f 72 20 65 78 61 6d 70 6c 65 20 69 6e 20 42  for example in B
5690: 74 72 65 65 44 65 6c 65 74 65 28 29 20 6f 72 20  treeDelete() or 
56a0: 42 74 72 65 65 49 6e 73 65 72 74 28 29 2e 0a 2a  BtreeInsert()..*
56b0: 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74  *.** Implementat
56c0: 69 6f 6e 20 6e 6f 74 65 3a 20 20 54 68 69 73 20  ion note:  This 
56d0: 72 6f 75 74 69 6e 65 20 6d 65 72 65 6c 79 20 63  routine merely c
56e0: 68 65 63 6b 73 20 74 6f 20 73 65 65 20 69 66 20  hecks to see if 
56f0: 61 6e 79 20 63 75 72 73 6f 72 73 0a 2a 2a 20 6e  any cursors.** n
5700: 65 65 64 20 74 6f 20 62 65 20 73 61 76 65 64 2e  eed to be saved.
5710: 20 20 49 74 20 63 61 6c 6c 73 20 6f 75 74 20 74    It calls out t
5720: 6f 20 73 61 76 65 43 75 72 73 6f 72 73 4f 6e 4c  o saveCursorsOnL
5730: 69 73 74 28 29 20 69 6e 20 74 68 65 20 28 75 6e  ist() in the (un
5740: 75 73 75 61 6c 29 0a 2a 2a 20 65 76 65 6e 74 20  usual).** event 
5750: 74 68 61 74 20 63 75 72 73 6f 72 73 20 61 72 65  that cursors are
5760: 20 69 6e 20 6e 65 65 64 20 74 6f 20 62 65 69 6e   in need to bein
5770: 67 20 73 61 76 65 64 2e 0a 2a 2f 0a 73 74 61 74  g saved..*/.stat
5780: 69 63 20 69 6e 74 20 73 61 76 65 41 6c 6c 43 75  ic int saveAllCu
5790: 72 73 6f 72 73 28 42 74 53 68 61 72 65 64 20 2a  rsors(BtShared *
57a0: 70 42 74 2c 20 50 67 6e 6f 20 69 52 6f 6f 74 2c  pBt, Pgno iRoot,
57b0: 20 42 74 43 75 72 73 6f 72 20 2a 70 45 78 63 65   BtCursor *pExce
57c0: 70 74 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20  pt){.  BtCursor 
57d0: 2a 70 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  *p;.  assert( sq
57e0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
57f0: 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
5800: 20 20 61 73 73 65 72 74 28 20 70 45 78 63 65 70    assert( pExcep
5810: 74 3d 3d 30 20 7c 7c 20 70 45 78 63 65 70 74 2d  t==0 || pExcept-
5820: 3e 70 42 74 3d 3d 70 42 74 20 29 3b 0a 20 20 66  >pBt==pBt );.  f
5830: 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75 72 73 6f  or(p=pBt->pCurso
5840: 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74  r; p; p=p->pNext
5850: 29 7b 0a 20 20 20 20 69 66 28 20 70 21 3d 70 45  ){.    if( p!=pE
5860: 78 63 65 70 74 20 26 26 20 28 30 3d 3d 69 52 6f  xcept && (0==iRo
5870: 6f 74 20 7c 7c 20 70 2d 3e 70 67 6e 6f 52 6f 6f  ot || p->pgnoRoo
5880: 74 3d 3d 69 52 6f 6f 74 29 20 29 20 62 72 65 61  t==iRoot) ) brea
5890: 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  k;.  }.  return 
58a0: 70 20 3f 20 73 61 76 65 43 75 72 73 6f 72 73 4f  p ? saveCursorsO
58b0: 6e 4c 69 73 74 28 70 2c 20 69 52 6f 6f 74 2c 20  nList(p, iRoot, 
58c0: 70 45 78 63 65 70 74 29 20 3a 20 53 51 4c 49 54  pExcept) : SQLIT
58d0: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 54 68 69 73  E_OK;.}../* This
58e0: 20 68 65 6c 70 65 72 20 72 6f 75 74 69 6e 65 20   helper routine 
58f0: 74 6f 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72  to saveAllCursor
5900: 73 20 64 6f 65 73 20 74 68 65 20 61 63 74 75 61  s does the actua
5910: 6c 20 77 6f 72 6b 20 6f 66 20 73 61 76 69 6e 67  l work of saving
5920: 0a 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 73 20  .** the cursors 
5930: 69 66 20 61 6e 64 20 77 68 65 6e 20 61 20 63 75  if and when a cu
5940: 72 73 6f 72 20 69 73 20 66 6f 75 6e 64 20 74 68  rsor is found th
5950: 61 74 20 61 63 74 75 61 6c 6c 79 20 72 65 71 75  at actually requ
5960: 69 72 65 73 20 73 61 76 69 6e 67 2e 0a 2a 2a 20  ires saving..** 
5970: 54 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20  The common case 
5980: 69 73 20 74 68 61 74 20 6e 6f 20 63 75 72 73 6f  is that no curso
5990: 72 73 20 6e 65 65 64 20 74 6f 20 62 65 20 73 61  rs need to be sa
59a0: 76 65 64 2c 20 73 6f 20 74 68 69 73 20 72 6f 75  ved, so this rou
59b0: 74 69 6e 65 20 69 73 0a 2a 2a 20 62 72 6f 6b 65  tine is.** broke
59c0: 6e 20 6f 75 74 20 66 72 6f 6d 20 69 74 73 20 63  n out from its c
59d0: 61 6c 6c 65 72 20 74 6f 20 61 76 6f 69 64 20 75  aller to avoid u
59e0: 6e 6e 65 63 65 73 73 61 72 79 20 73 74 61 63 6b  nnecessary stack
59f0: 20 70 6f 69 6e 74 65 72 20 6d 6f 76 65 6d 65 6e   pointer movemen
5a00: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
5a10: 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45   SQLITE_NOINLINE
5a20: 20 73 61 76 65 43 75 72 73 6f 72 73 4f 6e 4c 69   saveCursorsOnLi
5a30: 73 74 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  st(.  BtCursor *
5a40: 70 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  p,         /* Th
5a50: 65 20 66 69 72 73 74 20 63 75 72 73 6f 72 20 74  e first cursor t
5a60: 68 61 74 20 6e 65 65 64 73 20 73 61 76 69 6e 67  hat needs saving
5a70: 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 52 6f 6f 74   */.  Pgno iRoot
5a80: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e  ,          /* On
5a90: 6c 79 20 73 61 76 65 20 63 75 72 73 6f 72 20 77  ly save cursor w
5aa0: 69 74 68 20 74 68 69 73 20 69 52 6f 6f 74 2e 20  ith this iRoot. 
5ab0: 53 61 76 65 20 61 6c 6c 20 69 66 20 7a 65 72 6f  Save all if zero
5ac0: 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72 20 2a   */.  BtCursor *
5ad0: 70 45 78 63 65 70 74 20 20 20 20 2f 2a 20 44 6f  pExcept    /* Do
5ae0: 20 6e 6f 74 20 73 61 76 65 20 74 68 69 73 20 63   not save this c
5af0: 75 72 73 6f 72 20 2a 2f 0a 29 7b 0a 20 20 64 6f  ursor */.){.  do
5b00: 7b 0a 20 20 20 20 69 66 28 20 70 21 3d 70 45 78  {.    if( p!=pEx
5b10: 63 65 70 74 20 26 26 20 28 30 3d 3d 69 52 6f 6f  cept && (0==iRoo
5b20: 74 20 7c 7c 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74  t || p->pgnoRoot
5b30: 3d 3d 69 52 6f 6f 74 29 20 29 7b 0a 20 20 20 20  ==iRoot) ){.    
5b40: 20 20 69 66 28 20 70 2d 3e 65 53 74 61 74 65 3d    if( p->eState=
5b50: 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c  =CURSOR_VALID ||
5b60: 20 70 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53   p->eState==CURS
5b70: 4f 52 5f 53 4b 49 50 4e 45 58 54 20 29 7b 0a 20  OR_SKIPNEXT ){. 
5b80: 20 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20         int rc = 
5b90: 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69  saveCursorPositi
5ba0: 6f 6e 28 70 29 3b 0a 20 20 20 20 20 20 20 20 69  on(p);.        i
5bb0: 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63  f( SQLITE_OK!=rc
5bc0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
5bd0: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
5be0: 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
5bf0: 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
5c00: 28 20 70 2d 3e 69 50 61 67 65 3e 30 20 29 3b 0a  ( p->iPage>0 );.
5c10: 20 20 20 20 20 20 20 20 62 74 72 65 65 52 65 6c          btreeRel
5c20: 65 61 73 65 41 6c 6c 43 75 72 73 6f 72 50 61 67  easeAllCursorPag
5c30: 65 73 28 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20  es(p);.      }. 
5c40: 20 20 20 7d 0a 20 20 20 20 70 20 3d 20 70 2d 3e     }.    p = p->
5c50: 70 4e 65 78 74 3b 0a 20 20 7d 77 68 69 6c 65 28  pNext;.  }while(
5c60: 20 70 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 53   p );.  return S
5c70: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
5c80: 2a 2a 20 43 6c 65 61 72 20 74 68 65 20 63 75 72  ** Clear the cur
5c90: 72 65 6e 74 20 63 75 72 73 6f 72 20 70 6f 73 69  rent cursor posi
5ca0: 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tion..*/.void sq
5cb0: 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61 72 43  lite3BtreeClearC
5cc0: 75 72 73 6f 72 28 42 74 43 75 72 73 6f 72 20 2a  ursor(BtCursor *
5cd0: 70 43 75 72 29 7b 0a 20 20 61 73 73 65 72 74 28  pCur){.  assert(
5ce0: 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
5cf0: 78 28 70 43 75 72 29 20 29 3b 0a 20 20 73 71 6c  x(pCur) );.  sql
5d00: 69 74 65 33 5f 66 72 65 65 28 70 43 75 72 2d 3e  ite3_free(pCur->
5d10: 70 4b 65 79 29 3b 0a 20 20 70 43 75 72 2d 3e 70  pKey);.  pCur->p
5d20: 4b 65 79 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d  Key = 0;.  pCur-
5d30: 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
5d40: 5f 49 4e 56 41 4c 49 44 3b 0a 7d 0a 0a 2f 2a 0a  _INVALID;.}../*.
5d50: 2a 2a 20 49 6e 20 74 68 69 73 20 76 65 72 73 69  ** In this versi
5d60: 6f 6e 20 6f 66 20 42 74 72 65 65 4d 6f 76 65 74  on of BtreeMovet
5d70: 6f 2c 20 70 4b 65 79 20 69 73 20 61 20 70 61 63  o, pKey is a pac
5d80: 6b 65 64 20 69 6e 64 65 78 20 72 65 63 6f 72 64  ked index record
5d90: 0a 2a 2a 20 73 75 63 68 20 61 73 20 69 73 20 67  .** such as is g
5da0: 65 6e 65 72 61 74 65 64 20 62 79 20 74 68 65 20  enerated by the 
5db0: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70  OP_MakeRecord op
5dc0: 63 6f 64 65 2e 20 20 55 6e 70 61 63 6b 20 74 68  code.  Unpack th
5dd0: 65 0a 2a 2a 20 72 65 63 6f 72 64 20 61 6e 64 20  e.** record and 
5de0: 74 68 65 6e 20 63 61 6c 6c 20 42 74 72 65 65 4d  then call BtreeM
5df0: 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 29 20  ovetoUnpacked() 
5e00: 74 6f 20 64 6f 20 74 68 65 20 77 6f 72 6b 2e 0a  to do the work..
5e10: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74  */.static int bt
5e20: 72 65 65 4d 6f 76 65 74 6f 28 0a 20 20 42 74 43  reeMoveto(.  BtC
5e30: 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20  ursor *pCur,    
5e40: 20 2f 2a 20 43 75 72 73 6f 72 20 6f 70 65 6e 20   /* Cursor open 
5e50: 6f 6e 20 74 68 65 20 62 74 72 65 65 20 74 6f 20  on the btree to 
5e60: 62 65 20 73 65 61 72 63 68 65 64 20 2a 2f 0a 20  be searched */. 
5e70: 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65   const void *pKe
5e80: 79 2c 20 20 20 2f 2a 20 50 61 63 6b 65 64 20 6b  y,   /* Packed k
5e90: 65 79 20 69 66 20 74 68 65 20 62 74 72 65 65 20  ey if the btree 
5ea0: 69 73 20 61 6e 20 69 6e 64 65 78 20 2a 2f 0a 20  is an index */. 
5eb0: 20 69 36 34 20 6e 4b 65 79 2c 20 20 20 20 20 20   i64 nKey,      
5ec0: 20 20 20 20 20 2f 2a 20 49 6e 74 65 67 65 72 20       /* Integer 
5ed0: 6b 65 79 20 66 6f 72 20 74 61 62 6c 65 73 2e 20  key for tables. 
5ee0: 20 53 69 7a 65 20 6f 66 20 70 4b 65 79 20 66 6f   Size of pKey fo
5ef0: 72 20 69 6e 64 69 63 65 73 20 2a 2f 0a 20 20 69  r indices */.  i
5f00: 6e 74 20 62 69 61 73 2c 20 20 20 20 20 20 20 20  nt bias,        
5f10: 20 20 20 2f 2a 20 42 69 61 73 20 73 65 61 72 63     /* Bias searc
5f20: 68 20 74 6f 20 74 68 65 20 68 69 67 68 20 65 6e  h to the high en
5f30: 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73  d */.  int *pRes
5f40: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
5f50: 69 74 65 20 73 65 61 72 63 68 20 72 65 73 75 6c  ite search resul
5f60: 74 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  ts here */.){.  
5f70: 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
5f80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74             /* St
5f90: 61 74 75 73 20 63 6f 64 65 20 2a 2f 0a 20 20 55  atus code */.  U
5fa0: 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70  npackedRecord *p
5fb0: 49 64 78 4b 65 79 3b 20 20 20 2f 2a 20 55 6e 70  IdxKey;   /* Unp
5fc0: 61 63 6b 65 64 20 69 6e 64 65 78 20 6b 65 79 20  acked index key 
5fd0: 2a 2f 0a 20 20 63 68 61 72 20 61 53 70 61 63 65  */.  char aSpace
5fe0: 5b 32 30 30 5d 3b 20 20 20 20 20 20 20 20 20 20  [200];          
5ff0: 2f 2a 20 54 65 6d 70 20 73 70 61 63 65 20 66 6f  /* Temp space fo
6000: 72 20 70 49 64 78 4b 65 79 20 2d 20 74 6f 20 61  r pIdxKey - to a
6010: 76 6f 69 64 20 61 20 6d 61 6c 6c 6f 63 20 2a 2f  void a malloc */
6020: 0a 20 20 63 68 61 72 20 2a 70 46 72 65 65 20 3d  .  char *pFree =
6030: 20 30 3b 0a 0a 20 20 69 66 28 20 70 4b 65 79 20   0;..  if( pKey 
6040: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e  ){.    assert( n
6050: 4b 65 79 3d 3d 28 69 36 34 29 28 69 6e 74 29 6e  Key==(i64)(int)n
6060: 4b 65 79 20 29 3b 0a 20 20 20 20 70 49 64 78 4b  Key );.    pIdxK
6070: 65 79 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ey = sqlite3Vdbe
6080: 41 6c 6c 6f 63 55 6e 70 61 63 6b 65 64 52 65 63  AllocUnpackedRec
6090: 6f 72 64 28 0a 20 20 20 20 20 20 20 20 70 43 75  ord(.        pCu
60a0: 72 2d 3e 70 4b 65 79 49 6e 66 6f 2c 20 61 53 70  r->pKeyInfo, aSp
60b0: 61 63 65 2c 20 73 69 7a 65 6f 66 28 61 53 70 61  ace, sizeof(aSpa
60c0: 63 65 29 2c 20 26 70 46 72 65 65 0a 20 20 20 20  ce), &pFree.    
60d0: 29 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78 4b  );.    if( pIdxK
60e0: 65 79 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  ey==0 ) return S
60f0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
6100: 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
6110: 72 64 55 6e 70 61 63 6b 28 70 43 75 72 2d 3e 70  rdUnpack(pCur->p
6120: 4b 65 79 49 6e 66 6f 2c 20 28 69 6e 74 29 6e 4b  KeyInfo, (int)nK
6130: 65 79 2c 20 70 4b 65 79 2c 20 70 49 64 78 4b 65  ey, pKey, pIdxKe
6140: 79 29 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78  y);.    if( pIdx
6150: 4b 65 79 2d 3e 6e 46 69 65 6c 64 3d 3d 30 20 29  Key->nField==0 )
6160: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  {.      sqlite3D
6170: 62 46 72 65 65 28 70 43 75 72 2d 3e 70 4b 65 79  bFree(pCur->pKey
6180: 49 6e 66 6f 2d 3e 64 62 2c 20 70 46 72 65 65 29  Info->db, pFree)
6190: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
61a0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
61b0: 50 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  PT;.    }.  }els
61c0: 65 7b 0a 20 20 20 20 70 49 64 78 4b 65 79 20 3d  e{.    pIdxKey =
61d0: 20 30 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73   0;.  }.  rc = s
61e0: 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74  qlite3BtreeMovet
61f0: 6f 55 6e 70 61 63 6b 65 64 28 70 43 75 72 2c 20  oUnpacked(pCur, 
6200: 70 49 64 78 4b 65 79 2c 20 6e 4b 65 79 2c 20 62  pIdxKey, nKey, b
6210: 69 61 73 2c 20 70 52 65 73 29 3b 0a 20 20 69 66  ias, pRes);.  if
6220: 28 20 70 46 72 65 65 20 29 7b 0a 20 20 20 20 73  ( pFree ){.    s
6230: 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 43 75  qlite3DbFree(pCu
6240: 72 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2c  r->pKeyInfo->db,
6250: 20 70 46 72 65 65 29 3b 0a 20 20 7d 0a 20 20 72   pFree);.  }.  r
6260: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
6270: 2a 2a 20 52 65 73 74 6f 72 65 20 74 68 65 20 63  ** Restore the c
6280: 75 72 73 6f 72 20 74 6f 20 74 68 65 20 70 6f 73  ursor to the pos
6290: 69 74 69 6f 6e 20 69 74 20 77 61 73 20 69 6e 20  ition it was in 
62a0: 28 6f 72 20 61 73 20 63 6c 6f 73 65 20 74 6f 20  (or as close to 
62b0: 61 73 20 70 6f 73 73 69 62 6c 65 29 0a 2a 2a 20  as possible).** 
62c0: 77 68 65 6e 20 73 61 76 65 43 75 72 73 6f 72 50  when saveCursorP
62d0: 6f 73 69 74 69 6f 6e 28 29 20 77 61 73 20 63 61  osition() was ca
62e0: 6c 6c 65 64 2e 20 4e 6f 74 65 20 74 68 61 74 20  lled. Note that 
62f0: 74 68 69 73 20 63 61 6c 6c 20 64 65 6c 65 74 65  this call delete
6300: 73 20 74 68 65 20 0a 2a 2a 20 73 61 76 65 64 20  s the .** saved 
6310: 70 6f 73 69 74 69 6f 6e 20 69 6e 66 6f 20 73 74  position info st
6320: 6f 72 65 64 20 62 79 20 73 61 76 65 43 75 72 73  ored by saveCurs
6330: 6f 72 50 6f 73 69 74 69 6f 6e 28 29 2c 20 73 6f  orPosition(), so
6340: 20 74 68 65 72 65 20 63 61 6e 20 62 65 0a 2a 2a   there can be.**
6350: 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20 65 66 66   at most one eff
6360: 65 63 74 69 76 65 20 72 65 73 74 6f 72 65 43 75  ective restoreCu
6370: 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 20 63  rsorPosition() c
6380: 61 6c 6c 20 61 66 74 65 72 20 65 61 63 68 20 0a  all after each .
6390: 2a 2a 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73  ** saveCursorPos
63a0: 69 74 69 6f 6e 28 29 2e 0a 2a 2f 0a 73 74 61 74  ition()..*/.stat
63b0: 69 63 20 69 6e 74 20 62 74 72 65 65 52 65 73 74  ic int btreeRest
63c0: 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  oreCursorPositio
63d0: 6e 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  n(BtCursor *pCur
63e0: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  ){.  int rc;.  i
63f0: 6e 74 20 73 6b 69 70 4e 65 78 74 3b 0a 20 20 61  nt skipNext;.  a
6400: 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
6410: 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
6420: 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
6430: 3e 65 53 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f  >eState>=CURSOR_
6440: 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20  REQUIRESEEK );. 
6450: 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74   if( pCur->eStat
6460: 65 3d 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54 20  e==CURSOR_FAULT 
6470: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 43  ){.    return pC
6480: 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3b 0a 20 20  ur->skipNext;.  
6490: 7d 0a 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65  }.  pCur->eState
64a0: 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49   = CURSOR_INVALI
64b0: 44 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65 4d  D;.  rc = btreeM
64c0: 6f 76 65 74 6f 28 70 43 75 72 2c 20 70 43 75 72  oveto(pCur, pCur
64d0: 2d 3e 70 4b 65 79 2c 20 70 43 75 72 2d 3e 6e 4b  ->pKey, pCur->nK
64e0: 65 79 2c 20 30 2c 20 26 73 6b 69 70 4e 65 78 74  ey, 0, &skipNext
64f0: 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
6500: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71  ITE_OK ){.    sq
6510: 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75 72 2d  lite3_free(pCur-
6520: 3e 70 4b 65 79 29 3b 0a 20 20 20 20 70 43 75 72  >pKey);.    pCur
6530: 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20  ->pKey = 0;.    
6540: 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
6550: 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
6560: 49 44 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61  ID || pCur->eSta
6570: 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c  te==CURSOR_INVAL
6580: 49 44 20 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e  ID );.    pCur->
6590: 73 6b 69 70 4e 65 78 74 20 7c 3d 20 73 6b 69 70  skipNext |= skip
65a0: 4e 65 78 74 3b 0a 20 20 20 20 69 66 28 20 70 43  Next;.    if( pC
65b0: 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 26 26 20  ur->skipNext && 
65c0: 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
65d0: 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20  RSOR_VALID ){.  
65e0: 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65      pCur->eState
65f0: 20 3d 20 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45   = CURSOR_SKIPNE
6600: 58 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  XT;.    }.  }.  
6610: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 64  return rc;.}..#d
6620: 65 66 69 6e 65 20 72 65 73 74 6f 72 65 43 75 72  efine restoreCur
6630: 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29 20 5c  sorPosition(p) \
6640: 0a 20 20 28 70 2d 3e 65 53 74 61 74 65 3e 3d 43  .  (p->eState>=C
6650: 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45  URSOR_REQUIRESEE
6660: 4b 20 3f 20 5c 0a 20 20 20 20 20 20 20 20 20 62  K ? \.         b
6670: 74 72 65 65 52 65 73 74 6f 72 65 43 75 72 73 6f  treeRestoreCurso
6680: 72 50 6f 73 69 74 69 6f 6e 28 70 29 20 3a 20 5c  rPosition(p) : \
6690: 0a 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45  .         SQLITE
66a0: 5f 4f 4b 29 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65  _OK)../*.** Dete
66b0: 72 6d 69 6e 65 20 77 68 65 74 68 65 72 20 6f 72  rmine whether or
66c0: 20 6e 6f 74 20 61 20 63 75 72 73 6f 72 20 68 61   not a cursor ha
66d0: 73 20 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65  s moved from the
66e0: 20 70 6f 73 69 74 69 6f 6e 20 77 68 65 72 65 0a   position where.
66f0: 2a 2a 20 69 74 20 77 61 73 20 6c 61 73 74 20 70  ** it was last p
6700: 6c 61 63 65 64 2c 20 6f 72 20 68 61 73 20 62 65  laced, or has be
6710: 65 6e 20 69 6e 76 61 6c 69 64 61 74 65 64 20 66  en invalidated f
6720: 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 72 65 61  or any other rea
6730: 73 6f 6e 2e 0a 2a 2a 20 43 75 72 73 6f 72 73 20  son..** Cursors 
6740: 63 61 6e 20 6d 6f 76 65 20 77 68 65 6e 20 74 68  can move when th
6750: 65 20 72 6f 77 20 74 68 65 79 20 61 72 65 20 70  e row they are p
6760: 6f 69 6e 74 69 6e 67 20 61 74 20 69 73 20 64 65  ointing at is de
6770: 6c 65 74 65 64 20 6f 75 74 0a 2a 2a 20 66 72 6f  leted out.** fro
6780: 6d 20 75 6e 64 65 72 20 74 68 65 6d 2c 20 66 6f  m under them, fo
6790: 72 20 65 78 61 6d 70 6c 65 2e 20 20 43 75 72 73  r example.  Curs
67a0: 6f 72 20 6d 69 67 68 74 20 61 6c 73 6f 20 6d 6f  or might also mo
67b0: 76 65 20 69 66 20 61 20 62 74 72 65 65 0a 2a 2a  ve if a btree.**
67c0: 20 69 73 20 72 65 62 61 6c 61 6e 63 65 64 2e 0a   is rebalanced..
67d0: 2a 2a 0a 2a 2a 20 43 61 6c 6c 69 6e 67 20 74 68  **.** Calling th
67e0: 69 73 20 72 6f 75 74 69 6e 65 20 77 69 74 68 20  is routine with 
67f0: 61 20 4e 55 4c 4c 20 63 75 72 73 6f 72 20 70 6f  a NULL cursor po
6800: 69 6e 74 65 72 20 72 65 74 75 72 6e 73 20 66 61  inter returns fa
6810: 6c 73 65 2e 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74  lse..**.** Use t
6820: 68 65 20 73 65 70 61 72 61 74 65 20 73 71 6c 69  he separate sqli
6830: 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 52 65  te3BtreeCursorRe
6840: 73 74 6f 72 65 28 29 20 72 6f 75 74 69 6e 65 20  store() routine 
6850: 74 6f 20 72 65 73 74 6f 72 65 20 61 20 63 75 72  to restore a cur
6860: 73 6f 72 0a 2a 2a 20 62 61 63 6b 20 74 6f 20 77  sor.** back to w
6870: 68 65 72 65 20 69 74 20 6f 75 67 68 74 20 74 6f  here it ought to
6880: 20 62 65 20 69 66 20 74 68 69 73 20 72 6f 75 74   be if this rout
6890: 69 6e 65 20 72 65 74 75 72 6e 73 20 74 72 75 65  ine returns true
68a0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
68b0: 42 74 72 65 65 43 75 72 73 6f 72 48 61 73 4d 6f  BtreeCursorHasMo
68c0: 76 65 64 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ved(BtCursor *pC
68d0: 75 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 43  ur){.  return pC
68e0: 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53  ur->eState!=CURS
68f0: 4f 52 5f 56 41 4c 49 44 3b 0a 7d 0a 0a 2f 2a 0a  OR_VALID;.}../*.
6900: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
6910: 72 65 73 74 6f 72 65 73 20 61 20 63 75 72 73 6f  restores a curso
6920: 72 20 62 61 63 6b 20 74 6f 20 69 74 73 20 6f 72  r back to its or
6930: 69 67 69 6e 61 6c 20 70 6f 73 69 74 69 6f 6e 20  iginal position 
6940: 61 66 74 65 72 20 69 74 0a 2a 2a 20 68 61 73 20  after it.** has 
6950: 62 65 65 6e 20 6d 6f 76 65 64 20 62 79 20 73 6f  been moved by so
6960: 6d 65 20 6f 75 74 73 69 64 65 20 61 63 74 69 76  me outside activ
6970: 69 74 79 20 28 73 75 63 68 20 61 73 20 61 20 62  ity (such as a b
6980: 74 72 65 65 20 72 65 62 61 6c 61 6e 63 65 20 6f  tree rebalance o
6990: 72 0a 2a 2a 20 61 20 72 6f 77 20 68 61 76 69 6e  r.** a row havin
69a0: 67 20 62 65 65 6e 20 64 65 6c 65 74 65 64 20 6f  g been deleted o
69b0: 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 74 68  ut from under th
69c0: 65 20 63 75 72 73 6f 72 29 2e 20 20 0a 2a 2a 0a  e cursor).  .**.
69d0: 2a 2a 20 4f 6e 20 73 75 63 63 65 73 73 2c 20 74  ** On success, t
69e0: 68 65 20 2a 70 44 69 66 66 65 72 65 6e 74 52 6f  he *pDifferentRo
69f0: 77 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 66  w parameter is f
6a00: 61 6c 73 65 20 69 66 20 74 68 65 20 63 75 72 73  alse if the curs
6a10: 6f 72 20 69 73 20 6c 65 66 74 0a 2a 2a 20 70 6f  or is left.** po
6a20: 69 6e 74 69 6e 67 20 61 74 20 65 78 61 63 74 6c  inting at exactl
6a30: 79 20 74 68 65 20 73 61 6d 65 20 72 6f 77 2e 20  y the same row. 
6a40: 20 2a 70 44 69 66 66 65 72 6e 74 52 6f 77 20 69   *pDifferntRow i
6a50: 73 20 74 68 65 20 72 6f 77 20 74 68 65 20 63 75  s the row the cu
6a60: 72 73 6f 72 0a 2a 2a 20 77 61 73 20 70 6f 69 6e  rsor.** was poin
6a70: 74 69 6e 67 20 74 6f 20 68 61 73 20 62 65 65 6e  ting to has been
6a80: 20 64 65 6c 65 74 65 64 2c 20 66 6f 72 63 69 6e   deleted, forcin
6a90: 67 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20  g the cursor to 
6aa0: 70 6f 69 6e 74 20 74 6f 20 73 6f 6d 65 0a 2a 2a  point to some.**
6ab0: 20 6e 65 61 72 62 79 20 72 6f 77 2e 0a 2a 2a 0a   nearby row..**.
6ac0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
6ad0: 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20 63  should only be c
6ae0: 61 6c 6c 65 64 20 66 6f 72 20 61 20 63 75 72 73  alled for a curs
6af0: 6f 72 20 74 68 61 74 20 6a 75 73 74 20 72 65 74  or that just ret
6b00: 75 72 6e 65 64 0a 2a 2a 20 54 52 55 45 20 66 72  urned.** TRUE fr
6b10: 6f 6d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  om sqlite3BtreeC
6b20: 75 72 73 6f 72 48 61 73 4d 6f 76 65 64 28 29 2e  ursorHasMoved().
6b30: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
6b40: 74 72 65 65 43 75 72 73 6f 72 52 65 73 74 6f 72  treeCursorRestor
6b50: 65 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  e(BtCursor *pCur
6b60: 2c 20 69 6e 74 20 2a 70 44 69 66 66 65 72 65 6e  , int *pDifferen
6b70: 74 52 6f 77 29 7b 0a 20 20 69 6e 74 20 72 63 3b  tRow){.  int rc;
6b80: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ..  assert( pCur
6b90: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
6ba0: 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43   pCur->eState!=C
6bb0: 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
6bc0: 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72   rc = restoreCur
6bd0: 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72  sorPosition(pCur
6be0: 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
6bf0: 20 20 20 2a 70 44 69 66 66 65 72 65 6e 74 52 6f     *pDifferentRo
6c00: 77 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72  w = 1;.    retur
6c10: 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20  n rc;.  }.  if( 
6c20: 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55  pCur->eState!=CU
6c30: 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20  RSOR_VALID ){.  
6c40: 20 20 2a 70 44 69 66 66 65 72 65 6e 74 52 6f 77    *pDifferentRow
6c50: 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 1;.  }else{. 
6c60: 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
6c70: 3e 73 6b 69 70 4e 65 78 74 3d 3d 30 20 29 3b 0a  >skipNext==0 );.
6c80: 20 20 20 20 2a 70 44 69 66 66 65 72 65 6e 74 52      *pDifferentR
6c90: 6f 77 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  ow = 0;.  }.  re
6ca0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
6cb0: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
6cc0: 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
6cd0: 4d 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20  M./*.** Given a 
6ce0: 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 61  page number of a
6cf0: 20 72 65 67 75 6c 61 72 20 64 61 74 61 62 61 73   regular databas
6d00: 65 20 70 61 67 65 2c 20 72 65 74 75 72 6e 20 74  e page, return t
6d10: 68 65 20 70 61 67 65 0a 2a 2a 20 6e 75 6d 62 65  he page.** numbe
6d20: 72 20 66 6f 72 20 74 68 65 20 70 6f 69 6e 74 65  r for the pointe
6d30: 72 2d 6d 61 70 20 70 61 67 65 20 74 68 61 74 20  r-map page that 
6d40: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 65 6e 74  contains the ent
6d50: 72 79 20 66 6f 72 20 74 68 65 0a 2a 2a 20 69 6e  ry for the.** in
6d60: 70 75 74 20 70 61 67 65 20 6e 75 6d 62 65 72 2e  put page number.
6d70: 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20  .**.** Return 0 
6d80: 28 6e 6f 74 20 61 20 76 61 6c 69 64 20 70 61 67  (not a valid pag
6d90: 65 29 20 66 6f 72 20 70 67 6e 6f 3d 3d 31 20 73  e) for pgno==1 s
6da0: 69 6e 63 65 20 74 68 65 72 65 20 69 73 0a 2a 2a  ince there is.**
6db0: 20 6e 6f 20 70 6f 69 6e 74 65 72 20 6d 61 70 20   no pointer map 
6dc0: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
6dd0: 70 61 67 65 20 31 2e 20 20 54 68 65 20 69 6e 74  page 1.  The int
6de0: 65 67 72 69 74 79 5f 63 68 65 63 6b 20 6c 6f 67  egrity_check log
6df0: 69 63 0a 2a 2a 20 72 65 71 75 69 72 65 73 20 74  ic.** requires t
6e00: 68 61 74 20 70 74 72 6d 61 70 50 61 67 65 6e 6f  hat ptrmapPageno
6e10: 28 2a 2c 31 29 21 3d 31 2e 0a 2a 2f 0a 73 74 61  (*,1)!=1..*/.sta
6e20: 74 69 63 20 50 67 6e 6f 20 70 74 72 6d 61 70 50  tic Pgno ptrmapP
6e30: 61 67 65 6e 6f 28 42 74 53 68 61 72 65 64 20 2a  ageno(BtShared *
6e40: 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b  pBt, Pgno pgno){
6e50: 0a 20 20 69 6e 74 20 6e 50 61 67 65 73 50 65 72  .  int nPagesPer
6e60: 4d 61 70 50 61 67 65 3b 0a 20 20 50 67 6e 6f 20  MapPage;.  Pgno 
6e70: 69 50 74 72 4d 61 70 2c 20 72 65 74 3b 0a 20 20  iPtrMap, ret;.  
6e80: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
6e90: 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
6ea0: 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20  mutex) );.  if( 
6eb0: 70 67 6e 6f 3c 32 20 29 20 72 65 74 75 72 6e 20  pgno<2 ) return 
6ec0: 30 3b 0a 20 20 6e 50 61 67 65 73 50 65 72 4d 61  0;.  nPagesPerMa
6ed0: 70 50 61 67 65 20 3d 20 28 70 42 74 2d 3e 75 73  pPage = (pBt->us
6ee0: 61 62 6c 65 53 69 7a 65 2f 35 29 2b 31 3b 0a 20  ableSize/5)+1;. 
6ef0: 20 69 50 74 72 4d 61 70 20 3d 20 28 70 67 6e 6f   iPtrMap = (pgno
6f00: 2d 32 29 2f 6e 50 61 67 65 73 50 65 72 4d 61 70  -2)/nPagesPerMap
6f10: 50 61 67 65 3b 0a 20 20 72 65 74 20 3d 20 28 69  Page;.  ret = (i
6f20: 50 74 72 4d 61 70 2a 6e 50 61 67 65 73 50 65 72  PtrMap*nPagesPer
6f30: 4d 61 70 50 61 67 65 29 20 2b 20 32 3b 20 0a 20  MapPage) + 2; . 
6f40: 20 69 66 28 20 72 65 74 3d 3d 50 45 4e 44 49 4e   if( ret==PENDIN
6f50: 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
6f60: 20 29 7b 0a 20 20 20 20 72 65 74 2b 2b 3b 0a 20   ){.    ret++;. 
6f70: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 65 74 3b   }.  return ret;
6f80: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  .}../*.** Write 
6f90: 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20 74 68  an entry into th
6fa0: 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 2a  e pointer map..*
6fb0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
6fc0: 65 20 75 70 64 61 74 65 73 20 74 68 65 20 70 6f  e updates the po
6fd0: 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 79 20  inter map entry 
6fe0: 66 6f 72 20 70 61 67 65 20 6e 75 6d 62 65 72 20  for page number 
6ff0: 27 6b 65 79 27 0a 2a 2a 20 73 6f 20 74 68 61 74  'key'.** so that
7000: 20 69 74 20 6d 61 70 73 20 74 6f 20 74 79 70 65   it maps to type
7010: 20 27 65 54 79 70 65 27 20 61 6e 64 20 70 61 72   'eType' and par
7020: 65 6e 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20  ent page number 
7030: 27 70 67 6e 6f 27 2e 0a 2a 2a 0a 2a 2a 20 49 66  'pgno'..**.** If
7040: 20 2a 70 52 43 20 69 73 20 69 6e 69 74 69 61 6c   *pRC is initial
7050: 6c 79 20 6e 6f 6e 2d 7a 65 72 6f 20 28 6e 6f 6e  ly non-zero (non
7060: 2d 53 51 4c 49 54 45 5f 4f 4b 29 20 74 68 65 6e  -SQLITE_OK) then
7070: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
7080: 0a 2a 2a 20 61 20 6e 6f 2d 6f 70 2e 20 20 49 66  .** a no-op.  If
7090: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
70a0: 2c 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74  , the appropriat
70b0: 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  e error code is 
70c0: 77 72 69 74 74 65 6e 0a 2a 2a 20 69 6e 74 6f 20  written.** into 
70d0: 2a 70 52 43 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  *pRC..*/.static 
70e0: 76 6f 69 64 20 70 74 72 6d 61 70 50 75 74 28 42  void ptrmapPut(B
70f0: 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67  tShared *pBt, Pg
7100: 6e 6f 20 6b 65 79 2c 20 75 38 20 65 54 79 70 65  no key, u8 eType
7110: 2c 20 50 67 6e 6f 20 70 61 72 65 6e 74 2c 20 69  , Pgno parent, i
7120: 6e 74 20 2a 70 52 43 29 7b 0a 20 20 44 62 50 61  nt *pRC){.  DbPa
7130: 67 65 20 2a 70 44 62 50 61 67 65 3b 20 20 2f 2a  ge *pDbPage;  /*
7140: 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   The pointer map
7150: 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 70   page */.  u8 *p
7160: 50 74 72 6d 61 70 3b 20 20 20 20 20 20 2f 2a 20  Ptrmap;      /* 
7170: 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  The pointer map 
7180: 64 61 74 61 20 2a 2f 0a 20 20 50 67 6e 6f 20 69  data */.  Pgno i
7190: 50 74 72 6d 61 70 3b 20 20 20 20 20 2f 2a 20 54  Ptrmap;     /* T
71a0: 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70  he pointer map p
71b0: 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20  age number */.  
71c0: 69 6e 74 20 6f 66 66 73 65 74 3b 20 20 20 20 20  int offset;     
71d0: 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 20 70    /* Offset in p
71e0: 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20  ointer map page 
71f0: 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  */.  int rc;    
7200: 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
7210: 20 63 6f 64 65 20 66 72 6f 6d 20 73 75 62 66 75   code from subfu
7220: 6e 63 74 69 6f 6e 73 20 2a 2f 0a 0a 20 20 69 66  nctions */..  if
7230: 28 20 2a 70 52 43 20 29 20 72 65 74 75 72 6e 3b  ( *pRC ) return;
7240: 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
7250: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
7260: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
7270: 2f 2a 20 54 68 65 20 6d 61 73 74 65 72 2d 6a 6f  /* The master-jo
7280: 75 72 6e 61 6c 20 70 61 67 65 20 6e 75 6d 62 65  urnal page numbe
7290: 72 20 6d 75 73 74 20 6e 65 76 65 72 20 62 65 20  r must never be 
72a0: 75 73 65 64 20 61 73 20 61 20 70 6f 69 6e 74 65  used as a pointe
72b0: 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20  r map page */.  
72c0: 61 73 73 65 72 74 28 20 30 3d 3d 50 54 52 4d 41  assert( 0==PTRMA
72d0: 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 50 45  P_ISPAGE(pBt, PE
72e0: 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
72f0: 70 42 74 29 29 20 29 3b 0a 0a 20 20 61 73 73 65  pBt)) );..  asse
7300: 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  rt( pBt->autoVac
7310: 75 75 6d 20 29 3b 0a 20 20 69 66 28 20 6b 65 79  uum );.  if( key
7320: 3d 3d 30 20 29 7b 0a 20 20 20 20 2a 70 52 43 20  ==0 ){.    *pRC 
7330: 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
7340: 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72  _BKPT;.    retur
7350: 6e 3b 0a 20 20 7d 0a 20 20 69 50 74 72 6d 61 70  n;.  }.  iPtrmap
7360: 20 3d 20 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f   = PTRMAP_PAGENO
7370: 28 70 42 74 2c 20 6b 65 79 29 3b 0a 20 20 72 63  (pBt, key);.  rc
7380: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47   = sqlite3PagerG
7390: 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  et(pBt->pPager, 
73a0: 69 50 74 72 6d 61 70 2c 20 26 70 44 62 50 61 67  iPtrmap, &pDbPag
73b0: 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  e);.  if( rc!=SQ
73c0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a  LITE_OK ){.    *
73d0: 70 52 43 20 3d 20 72 63 3b 0a 20 20 20 20 72 65  pRC = rc;.    re
73e0: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 6f 66 66 73  turn;.  }.  offs
73f0: 65 74 20 3d 20 50 54 52 4d 41 50 5f 50 54 52 4f  et = PTRMAP_PTRO
7400: 46 46 53 45 54 28 69 50 74 72 6d 61 70 2c 20 6b  FFSET(iPtrmap, k
7410: 65 79 29 3b 0a 20 20 69 66 28 20 6f 66 66 73 65  ey);.  if( offse
7420: 74 3c 30 20 29 7b 0a 20 20 20 20 2a 70 52 43 20  t<0 ){.    *pRC 
7430: 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
7440: 5f 42 4b 50 54 3b 0a 20 20 20 20 67 6f 74 6f 20  _BKPT;.    goto 
7450: 70 74 72 6d 61 70 5f 65 78 69 74 3b 0a 20 20 7d  ptrmap_exit;.  }
7460: 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73 65  .  assert( offse
7470: 74 20 3c 3d 20 28 69 6e 74 29 70 42 74 2d 3e 75  t <= (int)pBt->u
7480: 73 61 62 6c 65 53 69 7a 65 2d 35 20 29 3b 0a 20  sableSize-5 );. 
7490: 20 70 50 74 72 6d 61 70 20 3d 20 28 75 38 20 2a   pPtrmap = (u8 *
74a0: 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74  )sqlite3PagerGet
74b0: 44 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a 0a  Data(pDbPage);..
74c0: 20 20 69 66 28 20 65 54 79 70 65 21 3d 70 50 74    if( eType!=pPt
74d0: 72 6d 61 70 5b 6f 66 66 73 65 74 5d 20 7c 7c 20  rmap[offset] || 
74e0: 67 65 74 34 62 79 74 65 28 26 70 50 74 72 6d 61  get4byte(&pPtrma
74f0: 70 5b 6f 66 66 73 65 74 2b 31 5d 29 21 3d 70 61  p[offset+1])!=pa
7500: 72 65 6e 74 20 29 7b 0a 20 20 20 20 54 52 41 43  rent ){.    TRAC
7510: 45 28 28 22 50 54 52 4d 41 50 5f 55 50 44 41 54  E(("PTRMAP_UPDAT
7520: 45 3a 20 25 64 2d 3e 28 25 64 2c 25 64 29 5c 6e  E: %d->(%d,%d)\n
7530: 22 2c 20 6b 65 79 2c 20 65 54 79 70 65 2c 20 70  ", key, eType, p
7540: 61 72 65 6e 74 29 29 3b 0a 20 20 20 20 2a 70 52  arent));.    *pR
7550: 43 3d 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  C= rc = sqlite3P
7560: 61 67 65 72 57 72 69 74 65 28 70 44 62 50 61 67  agerWrite(pDbPag
7570: 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  e);.    if( rc==
7580: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
7590: 20 20 20 70 50 74 72 6d 61 70 5b 6f 66 66 73 65     pPtrmap[offse
75a0: 74 5d 20 3d 20 65 54 79 70 65 3b 0a 20 20 20 20  t] = eType;.    
75b0: 20 20 70 75 74 34 62 79 74 65 28 26 70 50 74 72    put4byte(&pPtr
75c0: 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d 2c 20 70  map[offset+1], p
75d0: 61 72 65 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20  arent);.    }.  
75e0: 7d 0a 0a 70 74 72 6d 61 70 5f 65 78 69 74 3a 0a  }..ptrmap_exit:.
75f0: 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
7600: 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a 7d 0a  ref(pDbPage);.}.
7610: 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 6e 20 65  ./*.** Read an e
7620: 6e 74 72 79 20 66 72 6f 6d 20 74 68 65 20 70 6f  ntry from the po
7630: 69 6e 74 65 72 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a  inter map..**.**
7640: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   This routine re
7650: 74 72 69 65 76 65 73 20 74 68 65 20 70 6f 69 6e  trieves the poin
7660: 74 65 72 20 6d 61 70 20 65 6e 74 72 79 20 66 6f  ter map entry fo
7670: 72 20 70 61 67 65 20 27 6b 65 79 27 2c 20 77 72  r page 'key', wr
7680: 69 74 69 6e 67 0a 2a 2a 20 74 68 65 20 74 79 70  iting.** the typ
7690: 65 20 61 6e 64 20 70 61 72 65 6e 74 20 70 61 67  e and parent pag
76a0: 65 20 6e 75 6d 62 65 72 20 74 6f 20 2a 70 45 54  e number to *pET
76b0: 79 70 65 20 61 6e 64 20 2a 70 50 67 6e 6f 20 72  ype and *pPgno r
76c0: 65 73 70 65 63 74 69 76 65 6c 79 2e 0a 2a 2a 20  espectively..** 
76d0: 41 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  An error code is
76e0: 20 72 65 74 75 72 6e 65 64 20 69 66 20 73 6f 6d   returned if som
76f0: 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e  ething goes wron
7700: 67 2c 20 6f 74 68 65 72 77 69 73 65 20 53 51 4c  g, otherwise SQL
7710: 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69  ITE_OK..*/.stati
7720: 63 20 69 6e 74 20 70 74 72 6d 61 70 47 65 74 28  c int ptrmapGet(
7730: 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50  BtShared *pBt, P
7740: 67 6e 6f 20 6b 65 79 2c 20 75 38 20 2a 70 45 54  gno key, u8 *pET
7750: 79 70 65 2c 20 50 67 6e 6f 20 2a 70 50 67 6e 6f  ype, Pgno *pPgno
7760: 29 7b 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62  ){.  DbPage *pDb
7770: 50 61 67 65 3b 20 20 20 2f 2a 20 54 68 65 20 70  Page;   /* The p
7780: 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20  ointer map page 
7790: 2a 2f 0a 20 20 69 6e 74 20 69 50 74 72 6d 61 70  */.  int iPtrmap
77a0: 3b 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74  ;       /* Point
77b0: 65 72 20 6d 61 70 20 70 61 67 65 20 69 6e 64 65  er map page inde
77c0: 78 20 2a 2f 0a 20 20 75 38 20 2a 70 50 74 72 6d  x */.  u8 *pPtrm
77d0: 61 70 3b 20 20 20 20 20 20 20 2f 2a 20 50 6f 69  ap;       /* Poi
77e0: 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 64 61  nter map page da
77f0: 74 61 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 66 73  ta */.  int offs
7800: 65 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 4f 66  et;        /* Of
7810: 66 73 65 74 20 6f 66 20 65 6e 74 72 79 20 69 6e  fset of entry in
7820: 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 2a 2f 0a   pointer map */.
7830: 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73    int rc;..  ass
7840: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
7850: 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
7860: 65 78 29 20 29 3b 0a 0a 20 20 69 50 74 72 6d 61  ex) );..  iPtrma
7870: 70 20 3d 20 50 54 52 4d 41 50 5f 50 41 47 45 4e  p = PTRMAP_PAGEN
7880: 4f 28 70 42 74 2c 20 6b 65 79 29 3b 0a 20 20 72  O(pBt, key);.  r
7890: 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
78a0: 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  Get(pBt->pPager,
78b0: 20 69 50 74 72 6d 61 70 2c 20 26 70 44 62 50 61   iPtrmap, &pDbPa
78c0: 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 30  ge);.  if( rc!=0
78d0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
78e0: 63 3b 0a 20 20 7d 0a 20 20 70 50 74 72 6d 61 70  c;.  }.  pPtrmap
78f0: 20 3d 20 28 75 38 20 2a 29 73 71 6c 69 74 65 33   = (u8 *)sqlite3
7900: 50 61 67 65 72 47 65 74 44 61 74 61 28 70 44 62  PagerGetData(pDb
7910: 50 61 67 65 29 3b 0a 0a 20 20 6f 66 66 73 65 74  Page);..  offset
7920: 20 3d 20 50 54 52 4d 41 50 5f 50 54 52 4f 46 46   = PTRMAP_PTROFF
7930: 53 45 54 28 69 50 74 72 6d 61 70 2c 20 6b 65 79  SET(iPtrmap, key
7940: 29 3b 0a 20 20 69 66 28 20 6f 66 66 73 65 74 3c  );.  if( offset<
7950: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
7960: 50 61 67 65 72 55 6e 72 65 66 28 70 44 62 50 61  PagerUnref(pDbPa
7970: 67 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ge);.    return 
7980: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
7990: 4b 50 54 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  KPT;.  }.  asser
79a0: 74 28 20 6f 66 66 73 65 74 20 3c 3d 20 28 69 6e  t( offset <= (in
79b0: 74 29 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  t)pBt->usableSiz
79c0: 65 2d 35 20 29 3b 0a 20 20 61 73 73 65 72 74 28  e-5 );.  assert(
79d0: 20 70 45 54 79 70 65 21 3d 30 20 29 3b 0a 20 20   pEType!=0 );.  
79e0: 2a 70 45 54 79 70 65 20 3d 20 70 50 74 72 6d 61  *pEType = pPtrma
79f0: 70 5b 6f 66 66 73 65 74 5d 3b 0a 20 20 69 66 28  p[offset];.  if(
7a00: 20 70 50 67 6e 6f 20 29 20 2a 70 50 67 6e 6f 20   pPgno ) *pPgno 
7a10: 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 74 72  = get4byte(&pPtr
7a20: 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d 29 3b 0a  map[offset+1]);.
7a30: 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55  .  sqlite3PagerU
7a40: 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20  nref(pDbPage);. 
7a50: 20 69 66 28 20 2a 70 45 54 79 70 65 3c 31 20 7c   if( *pEType<1 |
7a60: 7c 20 2a 70 45 54 79 70 65 3e 35 20 29 20 72 65  | *pEType>5 ) re
7a70: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
7a80: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 72 65 74 75  UPT_BKPT;.  retu
7a90: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
7aa0: 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20 64 65 66  .#else /* if def
7ab0: 69 6e 65 64 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ined SQLITE_OMIT
7ac0: 5f 41 55 54 4f 56 41 43 55 55 4d 20 2a 2f 0a 20  _AUTOVACUUM */. 
7ad0: 20 23 64 65 66 69 6e 65 20 70 74 72 6d 61 70 50   #define ptrmapP
7ae0: 75 74 28 77 2c 78 2c 79 2c 7a 2c 72 63 29 0a 20  ut(w,x,y,z,rc). 
7af0: 20 23 64 65 66 69 6e 65 20 70 74 72 6d 61 70 47   #define ptrmapG
7b00: 65 74 28 77 2c 78 2c 79 2c 7a 29 20 53 51 4c 49  et(w,x,y,z) SQLI
7b10: 54 45 5f 4f 4b 0a 20 20 23 64 65 66 69 6e 65 20  TE_OK.  #define 
7b20: 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72  ptrmapPutOvflPtr
7b30: 28 78 2c 20 79 2c 20 72 63 29 0a 23 65 6e 64 69  (x, y, rc).#endi
7b40: 66 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61  f../*.** Given a
7b50: 20 62 74 72 65 65 20 70 61 67 65 20 61 6e 64 20   btree page and 
7b60: 61 20 63 65 6c 6c 20 69 6e 64 65 78 20 28 30 20  a cell index (0 
7b70: 6d 65 61 6e 73 20 74 68 65 20 66 69 72 73 74 20  means the first 
7b80: 63 65 6c 6c 20 6f 6e 0a 2a 2a 20 74 68 65 20 70  cell on.** the p
7b90: 61 67 65 2c 20 31 20 6d 65 61 6e 73 20 74 68 65  age, 1 means the
7ba0: 20 73 65 63 6f 6e 64 20 63 65 6c 6c 2c 20 61 6e   second cell, an
7bb0: 64 20 73 6f 20 66 6f 72 74 68 29 20 72 65 74 75  d so forth) retu
7bc0: 72 6e 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20  rn a pointer.** 
7bd0: 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  to the cell cont
7be0: 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 66 69 6e 64 43  ent..**.** findC
7bf0: 65 6c 6c 50 61 73 74 50 74 72 28 29 20 64 6f 65  ellPastPtr() doe
7c00: 73 20 74 68 65 20 73 61 6d 65 20 65 78 63 65 70  s the same excep
7c10: 74 20 69 74 20 73 6b 69 70 73 20 70 61 73 74 20  t it skips past 
7c20: 74 68 65 20 69 6e 69 74 69 61 6c 0a 2a 2a 20 34  the initial.** 4
7c30: 2d 62 79 74 65 20 63 68 69 6c 64 20 70 6f 69 6e  -byte child poin
7c40: 74 65 72 20 66 6f 75 6e 64 20 6f 6e 20 69 6e 74  ter found on int
7c50: 65 72 69 6f 72 20 70 61 67 65 73 2c 20 69 66 20  erior pages, if 
7c60: 74 68 65 72 65 20 69 73 20 6f 6e 65 2e 0a 2a 2a  there is one..**
7c70: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
7c80: 20 77 6f 72 6b 73 20 6f 6e 6c 79 20 66 6f 72 20   works only for 
7c90: 70 61 67 65 73 20 74 68 61 74 20 64 6f 20 6e 6f  pages that do no
7ca0: 74 20 63 6f 6e 74 61 69 6e 20 6f 76 65 72 66 6c  t contain overfl
7cb0: 6f 77 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 23 64 65  ow cells..*/.#de
7cc0: 66 69 6e 65 20 66 69 6e 64 43 65 6c 6c 28 50 2c  fine findCell(P,
7cd0: 49 29 20 5c 0a 20 20 28 28 50 29 2d 3e 61 44 61  I) \.  ((P)->aDa
7ce0: 74 61 20 2b 20 28 28 50 29 2d 3e 6d 61 73 6b 50  ta + ((P)->maskP
7cf0: 61 67 65 20 26 20 67 65 74 32 62 79 74 65 28 26  age & get2byte(&
7d00: 28 50 29 2d 3e 61 43 65 6c 6c 49 64 78 5b 32 2a  (P)->aCellIdx[2*
7d10: 28 49 29 5d 29 29 29 0a 23 64 65 66 69 6e 65 20  (I)]))).#define 
7d20: 66 69 6e 64 43 65 6c 6c 50 61 73 74 50 74 72 28  findCellPastPtr(
7d30: 50 2c 49 29 20 5c 0a 20 20 28 28 50 29 2d 3e 61  P,I) \.  ((P)->a
7d40: 44 61 74 61 4f 66 73 74 20 2b 20 28 28 50 29 2d  DataOfst + ((P)-
7d50: 3e 6d 61 73 6b 50 61 67 65 20 26 20 67 65 74 32  >maskPage & get2
7d60: 62 79 74 65 28 26 28 50 29 2d 3e 61 43 65 6c 6c  byte(&(P)->aCell
7d70: 49 64 78 5b 32 2a 28 49 29 5d 29 29 29 0a 0a 0a  Idx[2*(I)])))...
7d80: 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 63 6f  /*.** This is co
7d90: 6d 6d 6f 6e 20 74 61 69 6c 20 70 72 6f 63 65 73  mmon tail proces
7da0: 73 69 6e 67 20 66 6f 72 20 62 74 72 65 65 50 61  sing for btreePa
7db0: 72 73 65 43 65 6c 6c 50 74 72 28 29 20 61 6e 64  rseCellPtr() and
7dc0: 0a 2a 2a 20 62 74 72 65 65 50 61 72 73 65 43 65  .** btreeParseCe
7dd0: 6c 6c 50 74 72 49 6e 64 65 78 28 29 20 66 6f 72  llPtrIndex() for
7de0: 20 74 68 65 20 63 61 73 65 20 77 68 65 6e 20 74   the case when t
7df0: 68 65 20 63 65 6c 6c 20 64 6f 65 73 20 6e 6f 74  he cell does not
7e00: 20 66 69 74 20 65 6e 74 69 72 65 6c 79 0a 2a 2a   fit entirely.**
7e10: 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20 42 2d 74   on a single B-t
7e20: 72 65 65 20 70 61 67 65 2e 20 20 4d 61 6b 65 20  ree page.  Make 
7e30: 6e 65 63 65 73 73 61 72 79 20 61 64 6a 75 73 74  necessary adjust
7e40: 6d 65 6e 74 73 20 74 6f 20 74 68 65 20 43 65 6c  ments to the Cel
7e50: 6c 49 6e 66 6f 0a 2a 2a 20 73 74 72 75 63 74 75  lInfo.** structu
7e60: 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51  re..*/.static SQ
7e70: 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76 6f  LITE_NOINLINE vo
7e80: 69 64 20 62 74 72 65 65 50 61 72 73 65 43 65 6c  id btreeParseCel
7e90: 6c 41 64 6a 75 73 74 53 69 7a 65 46 6f 72 4f 76  lAdjustSizeForOv
7ea0: 65 72 66 6c 6f 77 28 0a 20 20 4d 65 6d 50 61 67  erflow(.  MemPag
7eb0: 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20  e *pPage,       
7ec0: 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69    /* Page contai
7ed0: 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f  ning the cell */
7ee0: 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20  .  u8 *pCell,   
7ef0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
7f00: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63 65 6c  inter to the cel
7f10: 6c 20 74 65 78 74 2e 20 2a 2f 0a 20 20 43 65 6c  l text. */.  Cel
7f20: 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20  lInfo *pInfo    
7f30: 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20       /* Fill in 
7f40: 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20 2a  this structure *
7f50: 2f 0a 29 7b 0a 20 20 2f 2a 20 49 66 20 74 68 65  /.){.  /* If the
7f60: 20 70 61 79 6c 6f 61 64 20 77 69 6c 6c 20 6e 6f   payload will no
7f70: 74 20 66 69 74 20 63 6f 6d 70 6c 65 74 65 6c 79  t fit completely
7f80: 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70 61   on the local pa
7f90: 67 65 2c 20 77 65 20 68 61 76 65 0a 20 20 2a 2a  ge, we have.  **
7fa0: 20 74 6f 20 64 65 63 69 64 65 20 68 6f 77 20 6d   to decide how m
7fb0: 75 63 68 20 74 6f 20 73 74 6f 72 65 20 6c 6f 63  uch to store loc
7fc0: 61 6c 6c 79 20 61 6e 64 20 68 6f 77 20 6d 75 63  ally and how muc
7fd0: 68 20 74 6f 20 73 70 69 6c 6c 20 6f 6e 74 6f 0a  h to spill onto.
7fe0: 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70 61    ** overflow pa
7ff0: 67 65 73 2e 20 20 54 68 65 20 73 74 72 61 74 65  ges.  The strate
8000: 67 79 20 69 73 20 74 6f 20 6d 69 6e 69 6d 69 7a  gy is to minimiz
8010: 65 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20  e the amount of 
8020: 75 6e 75 73 65 64 0a 20 20 2a 2a 20 73 70 61 63  unused.  ** spac
8030: 65 20 6f 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  e on overflow pa
8040: 67 65 73 20 77 68 69 6c 65 20 6b 65 65 70 69 6e  ges while keepin
8050: 67 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20  g the amount of 
8060: 6c 6f 63 61 6c 20 73 74 6f 72 61 67 65 0a 20 20  local storage.  
8070: 2a 2a 20 69 6e 20 62 65 74 77 65 65 6e 20 6d 69  ** in between mi
8080: 6e 4c 6f 63 61 6c 20 61 6e 64 20 6d 61 78 4c 6f  nLocal and maxLo
8090: 63 61 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57  cal..  **.  ** W
80a0: 61 72 6e 69 6e 67 3a 20 20 63 68 61 6e 67 69 6e  arning:  changin
80b0: 67 20 74 68 65 20 77 61 79 20 6f 76 65 72 66 6c  g the way overfl
80c0: 6f 77 20 70 61 79 6c 6f 61 64 20 69 73 20 64 69  ow payload is di
80d0: 73 74 72 69 62 75 74 65 64 20 69 6e 20 61 6e 79  stributed in any
80e0: 0a 20 20 2a 2a 20 77 61 79 20 77 69 6c 6c 20 72  .  ** way will r
80f0: 65 73 75 6c 74 20 69 6e 20 61 6e 20 69 6e 63 6f  esult in an inco
8100: 6d 70 61 74 69 62 6c 65 20 66 69 6c 65 20 66 6f  mpatible file fo
8110: 72 6d 61 74 2e 0a 20 20 2a 2f 0a 20 20 69 6e 74  rmat..  */.  int
8120: 20 6d 69 6e 4c 6f 63 61 6c 3b 20 20 2f 2a 20 4d   minLocal;  /* M
8130: 69 6e 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66  inimum amount of
8140: 20 70 61 79 6c 6f 61 64 20 68 65 6c 64 20 6c 6f   payload held lo
8150: 63 61 6c 6c 79 20 2a 2f 0a 20 20 69 6e 74 20 6d  cally */.  int m
8160: 61 78 4c 6f 63 61 6c 3b 20 20 2f 2a 20 4d 61 78  axLocal;  /* Max
8170: 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70  imum amount of p
8180: 61 79 6c 6f 61 64 20 68 65 6c 64 20 6c 6f 63 61  ayload held loca
8190: 6c 6c 79 20 2a 2f 0a 20 20 69 6e 74 20 73 75 72  lly */.  int sur
81a0: 70 6c 75 73 3b 20 20 20 2f 2a 20 4f 76 65 72 66  plus;   /* Overf
81b0: 6c 6f 77 20 70 61 79 6c 6f 61 64 20 61 76 61 69  low payload avai
81c0: 6c 61 62 6c 65 20 66 6f 72 20 6c 6f 63 61 6c 20  lable for local 
81d0: 73 74 6f 72 61 67 65 20 2a 2f 0a 0a 20 20 6d 69  storage */..  mi
81e0: 6e 4c 6f 63 61 6c 20 3d 20 70 50 61 67 65 2d 3e  nLocal = pPage->
81f0: 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 6d 61 78 4c  minLocal;.  maxL
8200: 6f 63 61 6c 20 3d 20 70 50 61 67 65 2d 3e 6d 61  ocal = pPage->ma
8210: 78 4c 6f 63 61 6c 3b 0a 20 20 73 75 72 70 6c 75  xLocal;.  surplu
8220: 73 20 3d 20 6d 69 6e 4c 6f 63 61 6c 20 2b 20 28  s = minLocal + (
8230: 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20  pInfo->nPayload 
8240: 2d 20 6d 69 6e 4c 6f 63 61 6c 29 25 28 70 50 61  - minLocal)%(pPa
8250: 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
8260: 69 7a 65 2d 34 29 3b 0a 20 20 74 65 73 74 63 61  ize-4);.  testca
8270: 73 65 28 20 73 75 72 70 6c 75 73 3d 3d 6d 61 78  se( surplus==max
8280: 4c 6f 63 61 6c 20 29 3b 0a 20 20 74 65 73 74 63  Local );.  testc
8290: 61 73 65 28 20 73 75 72 70 6c 75 73 3d 3d 6d 61  ase( surplus==ma
82a0: 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 69 66  xLocal+1 );.  if
82b0: 28 20 73 75 72 70 6c 75 73 20 3c 3d 20 6d 61 78  ( surplus <= max
82c0: 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 70 49 6e  Local ){.    pIn
82d0: 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75 31  fo->nLocal = (u1
82e0: 36 29 73 75 72 70 6c 75 73 3b 0a 20 20 7d 65 6c  6)surplus;.  }el
82f0: 73 65 7b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e  se{.    pInfo->n
8300: 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 6d 69 6e  Local = (u16)min
8310: 4c 6f 63 61 6c 3b 0a 20 20 7d 0a 20 20 70 49 6e  Local;.  }.  pIn
8320: 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77 20 3d 20  fo->iOverflow = 
8330: 28 75 31 36 29 28 26 70 49 6e 66 6f 2d 3e 70 50  (u16)(&pInfo->pP
8340: 61 79 6c 6f 61 64 5b 70 49 6e 66 6f 2d 3e 6e 4c  ayload[pInfo->nL
8350: 6f 63 61 6c 5d 20 2d 20 70 43 65 6c 6c 29 3b 0a  ocal] - pCell);.
8360: 20 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d    pInfo->nSize =
8370: 20 70 49 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f   pInfo->iOverflo
8380: 77 20 2b 20 34 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  w + 4;.}../*.** 
8390: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f  The following ro
83a0: 75 74 69 6e 65 73 20 61 72 65 20 69 6d 70 6c 65  utines are imple
83b0: 6d 65 6e 74 61 74 69 6f 6e 73 20 6f 66 20 74 68  mentations of th
83c0: 65 20 4d 65 6d 50 61 67 65 2e 78 50 61 72 73 65  e MemPage.xParse
83d0: 43 65 6c 6c 28 29 0a 2a 2a 20 6d 65 74 68 6f 64  Cell().** method
83e0: 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 73 65 20 61 20  ..**.** Parse a 
83f0: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 62 6c 6f  cell content blo
8400: 63 6b 20 61 6e 64 20 66 69 6c 6c 20 69 6e 20 74  ck and fill in t
8410: 68 65 20 43 65 6c 6c 49 6e 66 6f 20 73 74 72 75  he CellInfo stru
8420: 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 62 74 72  cture..**.** btr
8430: 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29  eeParseCellPtr()
8440: 20 20 20 20 20 20 20 20 3d 3e 20 20 20 74 61 62          =>   tab
8450: 6c 65 20 62 74 72 65 65 20 6c 65 61 66 20 6e 6f  le btree leaf no
8460: 64 65 73 0a 2a 2a 20 62 74 72 65 65 50 61 72 73  des.** btreePars
8470: 65 43 65 6c 6c 4e 6f 50 61 79 6c 6f 61 64 28 29  eCellNoPayload()
8480: 20 20 3d 3e 20 20 20 74 61 62 6c 65 20 62 74 72    =>   table btr
8490: 65 65 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65  ee internal node
84a0: 73 0a 2a 2a 20 62 74 72 65 65 50 61 72 73 65 43  s.** btreeParseC
84b0: 65 6c 6c 50 74 72 49 6e 64 65 78 28 29 20 20 20  ellPtrIndex()   
84c0: 3d 3e 20 20 20 69 6e 64 65 78 20 62 74 72 65 65  =>   index btree
84d0: 20 6e 6f 64 65 73 0a 2a 2a 0a 2a 2a 20 54 68 65   nodes.**.** The
84e0: 72 65 20 69 73 20 61 6c 73 6f 20 61 20 77 72 61  re is also a wra
84f0: 70 70 65 72 20 66 75 6e 63 74 69 6f 6e 20 62 74  pper function bt
8500: 72 65 65 50 61 72 73 65 43 65 6c 6c 28 29 20 74  reeParseCell() t
8510: 68 61 74 20 77 6f 72 6b 73 20 66 6f 72 0a 2a 2a  hat works for.**
8520: 20 61 6c 6c 20 4d 65 6d 50 61 67 65 20 74 79 70   all MemPage typ
8530: 65 73 20 61 6e 64 20 74 68 61 74 20 72 65 66 65  es and that refe
8540: 72 65 6e 63 65 73 20 74 68 65 20 63 65 6c 6c 20  rences the cell 
8550: 62 79 20 69 6e 64 65 78 20 72 61 74 68 65 72 20  by index rather 
8560: 74 68 61 6e 0a 2a 2a 20 62 79 20 70 6f 69 6e 74  than.** by point
8570: 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  er..*/.static vo
8580: 69 64 20 62 74 72 65 65 50 61 72 73 65 43 65 6c  id btreeParseCel
8590: 6c 50 74 72 4e 6f 50 61 79 6c 6f 61 64 28 0a 20  lPtrNoPayload(. 
85a0: 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c   MemPage *pPage,
85b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
85c0: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
85d0: 63 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 43  cell */.  u8 *pC
85e0: 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  ell,            
85f0: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
8600: 74 68 65 20 63 65 6c 6c 20 74 65 78 74 2e 20 2a  the cell text. *
8610: 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49  /.  CellInfo *pI
8620: 6e 66 6f 20 20 20 20 20 20 20 20 20 2f 2a 20 46  nfo         /* F
8630: 69 6c 6c 20 69 6e 20 74 68 69 73 20 73 74 72 75  ill in this stru
8640: 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 61 73  cture */.){.  as
8650: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
8660: 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
8670: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
8680: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
8690: 6c 65 61 66 3d 3d 30 20 29 3b 0a 20 20 61 73 73  leaf==0 );.  ass
86a0: 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 6f 50 61  ert( pPage->noPa
86b0: 79 6c 6f 61 64 20 29 3b 0a 20 20 61 73 73 65 72  yload );.  asser
86c0: 74 28 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50  t( pPage->childP
86d0: 74 72 53 69 7a 65 3d 3d 34 20 29 3b 0a 20 20 70  trSize==4 );.  p
86e0: 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 34 20  Info->nSize = 4 
86f0: 2b 20 67 65 74 56 61 72 69 6e 74 28 26 70 43 65  + getVarint(&pCe
8700: 6c 6c 5b 34 5d 2c 20 28 75 36 34 2a 29 26 70 49  ll[4], (u64*)&pI
8710: 6e 66 6f 2d 3e 6e 4b 65 79 29 3b 0a 20 20 70 49  nfo->nKey);.  pI
8720: 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20 3d 20  nfo->nPayload = 
8730: 30 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63  0;.  pInfo->nLoc
8740: 61 6c 20 3d 20 30 3b 0a 20 20 70 49 6e 66 6f 2d  al = 0;.  pInfo-
8750: 3e 69 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a  >iOverflow = 0;.
8760: 20 20 70 49 6e 66 6f 2d 3e 70 50 61 79 6c 6f 61    pInfo->pPayloa
8770: 64 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 3b  d = 0;.  return;
8780: 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62  .}.static void b
8790: 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
87a0: 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  (.  MemPage *pPa
87b0: 67 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50  ge,         /* P
87c0: 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  age containing t
87d0: 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 38 20  he cell */.  u8 
87e0: 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20  *pCell,         
87f0: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
8800: 74 6f 20 74 68 65 20 63 65 6c 6c 20 74 65 78 74  to the cell text
8810: 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20  . */.  CellInfo 
8820: 2a 70 49 6e 66 6f 20 20 20 20 20 20 20 20 20 2f  *pInfo         /
8830: 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69 73 20 73  * Fill in this s
8840: 74 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20  tructure */.){. 
8850: 20 75 38 20 2a 70 49 74 65 72 3b 20 20 20 20 20   u8 *pIter;     
8860: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20           /* For 
8870: 73 63 61 6e 6e 69 6e 67 20 74 68 72 6f 75 67 68  scanning through
8880: 20 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 33 32 20   pCell */.  u32 
8890: 6e 50 61 79 6c 6f 61 64 3b 20 20 20 20 20 20 20  nPayload;       
88a0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
88b0: 20 62 79 74 65 73 20 6f 66 20 63 65 6c 6c 20 70   bytes of cell p
88c0: 61 79 6c 6f 61 64 20 2a 2f 0a 20 20 75 36 34 20  ayload */.  u64 
88d0: 69 4b 65 79 3b 20 20 20 20 20 20 20 20 20 20 20  iKey;           
88e0: 20 20 20 20 2f 2a 20 45 78 74 72 61 63 74 65 64      /* Extracted
88f0: 20 4b 65 79 20 76 61 6c 75 65 20 2a 2f 0a 0a 20   Key value */.. 
8900: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
8910: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
8920: 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
8930: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
8940: 65 2d 3e 6c 65 61 66 3d 3d 30 20 7c 7c 20 70 50  e->leaf==0 || pP
8950: 61 67 65 2d 3e 6c 65 61 66 3d 3d 31 20 29 3b 0a  age->leaf==1 );.
8960: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
8970: 3e 69 6e 74 4b 65 79 4c 65 61 66 20 7c 7c 20 70  >intKeyLeaf || p
8980: 50 61 67 65 2d 3e 6e 6f 50 61 79 6c 6f 61 64 20  Page->noPayload 
8990: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
89a0: 67 65 2d 3e 6e 6f 50 61 79 6c 6f 61 64 3d 3d 30  ge->noPayload==0
89b0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
89c0: 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20  age->intKeyLeaf 
89d0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
89e0: 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65  ge->childPtrSize
89f0: 3d 3d 30 20 29 3b 0a 20 20 70 49 74 65 72 20 3d  ==0 );.  pIter =
8a00: 20 70 43 65 6c 6c 3b 0a 0a 20 20 2f 2a 20 54 68   pCell;..  /* Th
8a10: 65 20 6e 65 78 74 20 62 6c 6f 63 6b 20 6f 66 20  e next block of 
8a20: 63 6f 64 65 20 69 73 20 65 71 75 69 76 61 6c 65  code is equivale
8a30: 6e 74 20 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  nt to:.  **.  **
8a40: 20 20 20 20 20 70 49 74 65 72 20 2b 3d 20 67 65       pIter += ge
8a50: 74 56 61 72 69 6e 74 33 32 28 70 49 74 65 72 2c  tVarint32(pIter,
8a60: 20 6e 50 61 79 6c 6f 61 64 29 3b 0a 20 20 2a 2a   nPayload);.  **
8a70: 0a 20 20 2a 2a 20 54 68 65 20 63 6f 64 65 20 69  .  ** The code i
8a80: 73 20 69 6e 6c 69 6e 65 64 20 74 6f 20 61 76 6f  s inlined to avo
8a90: 69 64 20 61 20 66 75 6e 63 74 69 6f 6e 20 63 61  id a function ca
8aa0: 6c 6c 2e 0a 20 20 2a 2f 0a 20 20 6e 50 61 79 6c  ll..  */.  nPayl
8ab0: 6f 61 64 20 3d 20 2a 70 49 74 65 72 3b 0a 20 20  oad = *pIter;.  
8ac0: 69 66 28 20 6e 50 61 79 6c 6f 61 64 3e 3d 30 78  if( nPayload>=0x
8ad0: 38 30 20 29 7b 0a 20 20 20 20 75 38 20 2a 70 45  80 ){.    u8 *pE
8ae0: 6e 64 20 3d 20 26 70 49 74 65 72 5b 38 5d 3b 0a  nd = &pIter[8];.
8af0: 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 26 3d 20      nPayload &= 
8b00: 30 78 37 66 3b 0a 20 20 20 20 64 6f 7b 0a 20 20  0x7f;.    do{.  
8b10: 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20 28      nPayload = (
8b20: 6e 50 61 79 6c 6f 61 64 3c 3c 37 29 20 7c 20 28  nPayload<<7) | (
8b30: 2a 2b 2b 70 49 74 65 72 20 26 20 30 78 37 66 29  *++pIter & 0x7f)
8b40: 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 28 2a  ;.    }while( (*
8b50: 70 49 74 65 72 29 3e 3d 30 78 38 30 20 26 26 20  pIter)>=0x80 && 
8b60: 70 49 74 65 72 3c 70 45 6e 64 20 29 3b 0a 20 20  pIter<pEnd );.  
8b70: 7d 0a 20 20 70 49 74 65 72 2b 2b 3b 0a 0a 20 20  }.  pIter++;..  
8b80: 2f 2a 20 54 68 65 20 6e 65 78 74 20 62 6c 6f 63  /* The next bloc
8b90: 6b 20 6f 66 20 63 6f 64 65 20 69 73 20 65 71 75  k of code is equ
8ba0: 69 76 61 6c 65 6e 74 20 74 6f 3a 0a 20 20 2a 2a  ivalent to:.  **
8bb0: 0a 20 20 2a 2a 20 20 20 20 20 70 49 74 65 72 20  .  **     pIter 
8bc0: 2b 3d 20 67 65 74 56 61 72 69 6e 74 28 70 49 74  += getVarint(pIt
8bd0: 65 72 2c 20 28 75 36 34 2a 29 26 70 49 6e 66 6f  er, (u64*)&pInfo
8be0: 2d 3e 6e 4b 65 79 29 3b 0a 20 20 2a 2a 0a 20 20  ->nKey);.  **.  
8bf0: 2a 2a 20 54 68 65 20 63 6f 64 65 20 69 73 20 69  ** The code is i
8c00: 6e 6c 69 6e 65 64 20 74 6f 20 61 76 6f 69 64 20  nlined to avoid 
8c10: 61 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 2e  a function call.
8c20: 0a 20 20 2a 2f 0a 20 20 69 4b 65 79 20 3d 20 2a  .  */.  iKey = *
8c30: 70 49 74 65 72 3b 0a 20 20 69 66 28 20 69 4b 65  pIter;.  if( iKe
8c40: 79 3e 3d 30 78 38 30 20 29 7b 0a 20 20 20 20 75  y>=0x80 ){.    u
8c50: 38 20 2a 70 45 6e 64 20 3d 20 26 70 49 74 65 72  8 *pEnd = &pIter
8c60: 5b 37 5d 3b 0a 20 20 20 20 69 4b 65 79 20 26 3d  [7];.    iKey &=
8c70: 20 30 78 37 66 3b 0a 20 20 20 20 77 68 69 6c 65   0x7f;.    while
8c80: 28 31 29 7b 0a 20 20 20 20 20 20 69 4b 65 79 20  (1){.      iKey 
8c90: 3d 20 28 69 4b 65 79 3c 3c 37 29 20 7c 20 28 2a  = (iKey<<7) | (*
8ca0: 2b 2b 70 49 74 65 72 20 26 20 30 78 37 66 29 3b  ++pIter & 0x7f);
8cb0: 0a 20 20 20 20 20 20 69 66 28 20 28 2a 70 49 74  .      if( (*pIt
8cc0: 65 72 29 3c 30 78 38 30 20 29 20 62 72 65 61 6b  er)<0x80 ) break
8cd0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65  ;.      if( pIte
8ce0: 72 3e 3d 70 45 6e 64 20 29 7b 0a 20 20 20 20 20  r>=pEnd ){.     
8cf0: 20 20 20 69 4b 65 79 20 3d 20 28 69 4b 65 79 3c     iKey = (iKey<
8d00: 3c 38 29 20 7c 20 2a 2b 2b 70 49 74 65 72 3b 0a  <8) | *++pIter;.
8d10: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
8d20: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
8d30: 0a 20 20 70 49 74 65 72 2b 2b 3b 0a 0a 20 20 70  .  pIter++;..  p
8d40: 49 6e 66 6f 2d 3e 6e 4b 65 79 20 3d 20 2a 28 69  Info->nKey = *(i
8d50: 36 34 2a 29 26 69 4b 65 79 3b 0a 20 20 70 49 6e  64*)&iKey;.  pIn
8d60: 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20 3d 20 6e  fo->nPayload = n
8d70: 50 61 79 6c 6f 61 64 3b 0a 20 20 70 49 6e 66 6f  Payload;.  pInfo
8d80: 2d 3e 70 50 61 79 6c 6f 61 64 20 3d 20 70 49 74  ->pPayload = pIt
8d90: 65 72 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20  er;.  testcase( 
8da0: 6e 50 61 79 6c 6f 61 64 3d 3d 70 50 61 67 65 2d  nPayload==pPage-
8db0: 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 74  >maxLocal );.  t
8dc0: 65 73 74 63 61 73 65 28 20 6e 50 61 79 6c 6f 61  estcase( nPayloa
8dd0: 64 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  d==pPage->maxLoc
8de0: 61 6c 2b 31 20 29 3b 0a 20 20 69 66 28 20 6e 50  al+1 );.  if( nP
8df0: 61 79 6c 6f 61 64 3c 3d 70 50 61 67 65 2d 3e 6d  ayload<=pPage->m
8e00: 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 2f  axLocal ){.    /
8e10: 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 28 65  * This is the (e
8e20: 61 73 79 29 20 63 6f 6d 6d 6f 6e 20 63 61 73 65  asy) common case
8e30: 20 77 68 65 72 65 20 74 68 65 20 65 6e 74 69 72   where the entir
8e40: 65 20 70 61 79 6c 6f 61 64 20 66 69 74 73 0a 20  e payload fits. 
8e50: 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6c 6f 63     ** on the loc
8e60: 61 6c 20 70 61 67 65 2e 20 20 4e 6f 20 6f 76 65  al page.  No ove
8e70: 72 66 6c 6f 77 20 69 73 20 72 65 71 75 69 72 65  rflow is require
8e80: 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 49  d..    */.    pI
8e90: 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 6e 50 61  nfo->nSize = nPa
8ea0: 79 6c 6f 61 64 20 2b 20 28 75 31 36 29 28 70 49  yload + (u16)(pI
8eb0: 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b 0a 20 20  ter - pCell);.  
8ec0: 20 20 69 66 28 20 70 49 6e 66 6f 2d 3e 6e 53 69    if( pInfo->nSi
8ed0: 7a 65 3c 34 20 29 20 70 49 6e 66 6f 2d 3e 6e 53  ze<4 ) pInfo->nS
8ee0: 69 7a 65 20 3d 20 34 3b 0a 20 20 20 20 70 49 6e  ize = 4;.    pIn
8ef0: 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75 31  fo->nLocal = (u1
8f00: 36 29 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20  6)nPayload;.    
8f10: 70 49 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77  pInfo->iOverflow
8f20: 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
8f30: 20 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c     btreeParseCel
8f40: 6c 41 64 6a 75 73 74 53 69 7a 65 46 6f 72 4f 76  lAdjustSizeForOv
8f50: 65 72 66 6c 6f 77 28 70 50 61 67 65 2c 20 70 43  erflow(pPage, pC
8f60: 65 6c 6c 2c 20 70 49 6e 66 6f 29 3b 0a 20 20 7d  ell, pInfo);.  }
8f70: 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62  .}.static void b
8f80: 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
8f90: 49 6e 64 65 78 28 0a 20 20 4d 65 6d 50 61 67 65  Index(.  MemPage
8fa0: 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20 20   *pPage,        
8fb0: 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e   /* Page contain
8fc0: 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a  ing the cell */.
8fd0: 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20    u8 *pCell,    
8fe0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
8ff0: 6e 74 65 72 20 74 6f 20 74 68 65 20 63 65 6c 6c  nter to the cell
9000: 20 74 65 78 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c   text. */.  Cell
9010: 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20  Info *pInfo     
9020: 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74      /* Fill in t
9030: 68 69 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f  his structure */
9040: 0a 29 7b 0a 20 20 75 38 20 2a 70 49 74 65 72 3b  .){.  u8 *pIter;
9050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9060: 20 46 6f 72 20 73 63 61 6e 6e 69 6e 67 20 74 68   For scanning th
9070: 72 6f 75 67 68 20 70 43 65 6c 6c 20 2a 2f 0a 20  rough pCell */. 
9080: 20 75 33 32 20 6e 50 61 79 6c 6f 61 64 3b 20 20   u32 nPayload;  
9090: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
90a0: 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 63  er of bytes of c
90b0: 65 6c 6c 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 0a  ell payload */..
90c0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
90d0: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
90e0: 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
90f0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
9100: 67 65 2d 3e 6c 65 61 66 3d 3d 30 20 7c 7c 20 70  ge->leaf==0 || p
9110: 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 31 20 29 3b  Page->leaf==1 );
9120: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
9130: 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 3d 3d 30 20  ->intKeyLeaf==0 
9140: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
9150: 67 65 2d 3e 6e 6f 50 61 79 6c 6f 61 64 3d 3d 30  ge->noPayload==0
9160: 20 29 3b 0a 20 20 70 49 74 65 72 20 3d 20 70 43   );.  pIter = pC
9170: 65 6c 6c 20 2b 20 70 50 61 67 65 2d 3e 63 68 69  ell + pPage->chi
9180: 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20 6e 50 61  ldPtrSize;.  nPa
9190: 79 6c 6f 61 64 20 3d 20 2a 70 49 74 65 72 3b 0a  yload = *pIter;.
91a0: 20 20 69 66 28 20 6e 50 61 79 6c 6f 61 64 3e 3d    if( nPayload>=
91b0: 30 78 38 30 20 29 7b 0a 20 20 20 20 75 38 20 2a  0x80 ){.    u8 *
91c0: 70 45 6e 64 20 3d 20 26 70 49 74 65 72 5b 38 5d  pEnd = &pIter[8]
91d0: 3b 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 26  ;.    nPayload &
91e0: 3d 20 30 78 37 66 3b 0a 20 20 20 20 64 6f 7b 0a  = 0x7f;.    do{.
91f0: 20 20 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 3d        nPayload =
9200: 20 28 6e 50 61 79 6c 6f 61 64 3c 3c 37 29 20 7c   (nPayload<<7) |
9210: 20 28 2a 2b 2b 70 49 74 65 72 20 26 20 30 78 37   (*++pIter & 0x7
9220: 66 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20  f);.    }while( 
9230: 2a 28 70 49 74 65 72 29 3e 3d 30 78 38 30 20 26  *(pIter)>=0x80 &
9240: 26 20 70 49 74 65 72 3c 70 45 6e 64 20 29 3b 0a  & pIter<pEnd );.
9250: 20 20 7d 0a 20 20 70 49 74 65 72 2b 2b 3b 0a 20    }.  pIter++;. 
9260: 20 70 49 6e 66 6f 2d 3e 6e 4b 65 79 20 3d 20 6e   pInfo->nKey = n
9270: 50 61 79 6c 6f 61 64 3b 0a 20 20 70 49 6e 66 6f  Payload;.  pInfo
9280: 2d 3e 6e 50 61 79 6c 6f 61 64 20 3d 20 6e 50 61  ->nPayload = nPa
9290: 79 6c 6f 61 64 3b 0a 20 20 70 49 6e 66 6f 2d 3e  yload;.  pInfo->
92a0: 70 50 61 79 6c 6f 61 64 20 3d 20 70 49 74 65 72  pPayload = pIter
92b0: 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 50  ;.  testcase( nP
92c0: 61 79 6c 6f 61 64 3d 3d 70 50 61 67 65 2d 3e 6d  ayload==pPage->m
92d0: 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 74 65 73  axLocal );.  tes
92e0: 74 63 61 73 65 28 20 6e 50 61 79 6c 6f 61 64 3d  tcase( nPayload=
92f0: 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c  =pPage->maxLocal
9300: 2b 31 20 29 3b 0a 20 20 69 66 28 20 6e 50 61 79  +1 );.  if( nPay
9310: 6c 6f 61 64 3c 3d 70 50 61 67 65 2d 3e 6d 61 78  load<=pPage->max
9320: 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 2f 2a 20  Local ){.    /* 
9330: 54 68 69 73 20 69 73 20 74 68 65 20 28 65 61 73  This is the (eas
9340: 79 29 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77  y) common case w
9350: 68 65 72 65 20 74 68 65 20 65 6e 74 69 72 65 20  here the entire 
9360: 70 61 79 6c 6f 61 64 20 66 69 74 73 0a 20 20 20  payload fits.   
9370: 20 2a 2a 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c   ** on the local
9380: 20 70 61 67 65 2e 20 20 4e 6f 20 6f 76 65 72 66   page.  No overf
9390: 6c 6f 77 20 69 73 20 72 65 71 75 69 72 65 64 2e  low is required.
93a0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 49 6e 66  .    */.    pInf
93b0: 6f 2d 3e 6e 53 69 7a 65 20 3d 20 6e 50 61 79 6c  o->nSize = nPayl
93c0: 6f 61 64 20 2b 20 28 75 31 36 29 28 70 49 74 65  oad + (u16)(pIte
93d0: 72 20 2d 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20  r - pCell);.    
93e0: 69 66 28 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65  if( pInfo->nSize
93f0: 3c 34 20 29 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a  <4 ) pInfo->nSiz
9400: 65 20 3d 20 34 3b 0a 20 20 20 20 70 49 6e 66 6f  e = 4;.    pInfo
9410: 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29  ->nLocal = (u16)
9420: 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20 70 49  nPayload;.    pI
9430: 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77 20 3d  nfo->iOverflow =
9440: 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
9450: 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 41   btreeParseCellA
9460: 64 6a 75 73 74 53 69 7a 65 46 6f 72 4f 76 65 72  djustSizeForOver
9470: 66 6c 6f 77 28 70 50 61 67 65 2c 20 70 43 65 6c  flow(pPage, pCel
9480: 6c 2c 20 70 49 6e 66 6f 29 3b 0a 20 20 7d 0a 7d  l, pInfo);.  }.}
9490: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 74 72  .static void btr
94a0: 65 65 50 61 72 73 65 43 65 6c 6c 28 0a 20 20 4d  eeParseCell(.  M
94b0: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20  emPage *pPage,  
94c0: 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63         /* Page c
94d0: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63 65  ontaining the ce
94e0: 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c  ll */.  int iCel
94f0: 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
9500: 2f 2a 20 54 68 65 20 63 65 6c 6c 20 69 6e 64 65  /* The cell inde
9510: 78 2e 20 20 46 69 72 73 74 20 63 65 6c 6c 20 69  x.  First cell i
9520: 73 20 30 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66  s 0 */.  CellInf
9530: 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20 20 20 20  o *pInfo        
9540: 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69 73   /* Fill in this
9550: 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b   structure */.){
9560: 0a 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65  .  pPage->xParse
9570: 43 65 6c 6c 28 70 50 61 67 65 2c 20 66 69 6e 64  Cell(pPage, find
9580: 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65 6c  Cell(pPage, iCel
9590: 6c 29 2c 20 70 49 6e 66 6f 29 3b 0a 7d 0a 0a 2f  l), pInfo);.}../
95a0: 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
95b0: 6e 67 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20  ng routines are 
95c0: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20  implementations 
95d0: 6f 66 20 74 68 65 20 4d 65 6d 50 61 67 65 2e 78  of the MemPage.x
95e0: 43 65 6c 6c 53 69 7a 65 0a 2a 2a 20 6d 65 74 68  CellSize.** meth
95f0: 6f 64 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6d 70 75 74  od..**.** Comput
9600: 65 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62  e the total numb
9610: 65 72 20 6f 66 20 62 79 74 65 73 20 74 68 61 74  er of bytes that
9620: 20 61 20 43 65 6c 6c 20 6e 65 65 64 73 20 69 6e   a Cell needs in
9630: 20 74 68 65 20 63 65 6c 6c 0a 2a 2a 20 64 61 74   the cell.** dat
9640: 61 20 61 72 65 61 20 6f 66 20 74 68 65 20 62 74  a area of the bt
9650: 72 65 65 2d 70 61 67 65 2e 20 20 54 68 65 20 72  ree-page.  The r
9660: 65 74 75 72 6e 20 6e 75 6d 62 65 72 20 69 6e 63  eturn number inc
9670: 6c 75 64 65 73 20 74 68 65 20 63 65 6c 6c 0a 2a  ludes the cell.*
9680: 2a 20 64 61 74 61 20 68 65 61 64 65 72 20 61 6e  * data header an
9690: 64 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 79 6c  d the local payl
96a0: 6f 61 64 2c 20 62 75 74 20 6e 6f 74 20 61 6e 79  oad, but not any
96b0: 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 6f   overflow page o
96c0: 72 0a 2a 2a 20 74 68 65 20 73 70 61 63 65 20 75  r.** the space u
96d0: 73 65 64 20 62 79 20 74 68 65 20 63 65 6c 6c 20  sed by the cell 
96e0: 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 63  pointer..**.** c
96f0: 65 6c 6c 53 69 7a 65 50 74 72 4e 6f 50 61 79 6c  ellSizePtrNoPayl
9700: 6f 61 64 28 29 20 20 20 20 3d 3e 20 20 20 74 61  oad()    =>   ta
9710: 62 6c 65 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64  ble internal nod
9720: 65 73 0a 2a 2a 20 63 65 6c 6c 53 69 7a 65 50 74  es.** cellSizePt
9730: 72 28 29 20 20 20 20 20 20 20 20 20 20 20 20 20  r()             
9740: 3d 3e 20 20 20 61 6c 6c 20 69 6e 64 65 78 20 6e  =>   all index n
9750: 6f 64 65 73 20 26 20 74 61 62 6c 65 20 6c 65 61  odes & table lea
9760: 66 20 6e 6f 64 65 73 0a 2a 2f 0a 73 74 61 74 69  f nodes.*/.stati
9770: 63 20 75 31 36 20 63 65 6c 6c 53 69 7a 65 50 74  c u16 cellSizePt
9780: 72 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  r(MemPage *pPage
9790: 2c 20 75 38 20 2a 70 43 65 6c 6c 29 7b 0a 20 20  , u8 *pCell){.  
97a0: 75 38 20 2a 70 49 74 65 72 20 3d 20 70 43 65 6c  u8 *pIter = pCel
97b0: 6c 20 2b 20 70 50 61 67 65 2d 3e 63 68 69 6c 64  l + pPage->child
97c0: 50 74 72 53 69 7a 65 3b 20 2f 2a 20 46 6f 72 20  PtrSize; /* For 
97d0: 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 62 79 74  looping over byt
97e0: 65 73 20 6f 66 20 70 43 65 6c 6c 20 2a 2f 0a 20  es of pCell */. 
97f0: 20 75 38 20 2a 70 45 6e 64 3b 20 20 20 20 20 20   u8 *pEnd;      
9800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9810: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 6e 64            /* End
9820: 20 6d 61 72 6b 20 66 6f 72 20 61 20 76 61 72 69   mark for a vari
9830: 6e 74 20 2a 2f 0a 20 20 75 33 32 20 6e 53 69 7a  nt */.  u32 nSiz
9840: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
9850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9860: 20 2f 2a 20 53 69 7a 65 20 76 61 6c 75 65 20 74   /* Size value t
9870: 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 0a 23 69 66  o return */..#if
9880: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
9890: 0a 20 20 2f 2a 20 54 68 65 20 76 61 6c 75 65 20  .  /* The value 
98a0: 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 69 73  returned by this
98b0: 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64   function should
98c0: 20 61 6c 77 61 79 73 20 62 65 20 74 68 65 20 73   always be the s
98d0: 61 6d 65 20 61 73 0a 20 20 2a 2a 20 74 68 65 20  ame as.  ** the 
98e0: 28 43 65 6c 6c 49 6e 66 6f 2e 6e 53 69 7a 65 29  (CellInfo.nSize)
98f0: 20 76 61 6c 75 65 20 66 6f 75 6e 64 20 62 79 20   value found by 
9900: 64 6f 69 6e 67 20 61 20 66 75 6c 6c 20 70 61 72  doing a full par
9910: 73 65 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 63  se of the.  ** c
9920: 65 6c 6c 2e 20 49 66 20 53 51 4c 49 54 45 5f 44  ell. If SQLITE_D
9930: 45 42 55 47 20 69 73 20 64 65 66 69 6e 65 64 2c  EBUG is defined,
9940: 20 61 6e 20 61 73 73 65 72 74 28 29 20 61 74 20   an assert() at 
9950: 74 68 65 20 62 6f 74 74 6f 6d 20 6f 66 0a 20 20  the bottom of.  
9960: 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** this function
9970: 20 76 65 72 69 66 69 65 73 20 74 68 61 74 20 74   verifies that t
9980: 68 69 73 20 69 6e 76 61 72 69 61 6e 74 20 69 73  his invariant is
9990: 20 6e 6f 74 20 76 69 6f 6c 61 74 65 64 2e 20 2a   not violated. *
99a0: 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 64 65 62  /.  CellInfo deb
99b0: 75 67 69 6e 66 6f 3b 0a 20 20 70 50 61 67 65 2d  uginfo;.  pPage-
99c0: 3e 78 50 61 72 73 65 43 65 6c 6c 28 70 50 61 67  >xParseCell(pPag
99d0: 65 2c 20 70 43 65 6c 6c 2c 20 26 64 65 62 75 67  e, pCell, &debug
99e0: 69 6e 66 6f 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  info);.#endif.. 
99f0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
9a00: 6e 6f 50 61 79 6c 6f 61 64 3d 3d 30 20 29 3b 0a  noPayload==0 );.
9a10: 20 20 6e 53 69 7a 65 20 3d 20 2a 70 49 74 65 72    nSize = *pIter
9a20: 3b 0a 20 20 69 66 28 20 6e 53 69 7a 65 3e 3d 30  ;.  if( nSize>=0
9a30: 78 38 30 20 29 7b 0a 20 20 20 20 70 45 6e 64 20  x80 ){.    pEnd 
9a40: 3d 20 26 70 49 74 65 72 5b 38 5d 3b 0a 20 20 20  = &pIter[8];.   
9a50: 20 6e 53 69 7a 65 20 26 3d 20 30 78 37 66 3b 0a   nSize &= 0x7f;.
9a60: 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 6e 53      do{.      nS
9a70: 69 7a 65 20 3d 20 28 6e 53 69 7a 65 3c 3c 37 29  ize = (nSize<<7)
9a80: 20 7c 20 28 2a 2b 2b 70 49 74 65 72 20 26 20 30   | (*++pIter & 0
9a90: 78 37 66 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65  x7f);.    }while
9aa0: 28 20 2a 28 70 49 74 65 72 29 3e 3d 30 78 38 30  ( *(pIter)>=0x80
9ab0: 20 26 26 20 70 49 74 65 72 3c 70 45 6e 64 20 29   && pIter<pEnd )
9ac0: 3b 0a 20 20 7d 0a 20 20 70 49 74 65 72 2b 2b 3b  ;.  }.  pIter++;
9ad0: 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e  .  if( pPage->in
9ae0: 74 4b 65 79 20 29 7b 0a 20 20 20 20 2f 2a 20 70  tKey ){.    /* p
9af0: 49 74 65 72 20 6e 6f 77 20 70 6f 69 6e 74 73 20  Iter now points 
9b00: 61 74 20 74 68 65 20 36 34 2d 62 69 74 20 69 6e  at the 64-bit in
9b10: 74 65 67 65 72 20 6b 65 79 20 76 61 6c 75 65 2c  teger key value,
9b20: 20 61 20 76 61 72 69 61 62 6c 65 20 6c 65 6e 67   a variable leng
9b30: 74 68 20 0a 20 20 20 20 2a 2a 20 69 6e 74 65 67  th .    ** integ
9b40: 65 72 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  er. The followin
9b50: 67 20 62 6c 6f 63 6b 20 6d 6f 76 65 73 20 70 49  g block moves pI
9b60: 74 65 72 20 74 6f 20 70 6f 69 6e 74 20 61 74 20  ter to point at 
9b70: 74 68 65 20 66 69 72 73 74 20 62 79 74 65 0a 20  the first byte. 
9b80: 20 20 20 2a 2a 20 70 61 73 74 20 74 68 65 20 65     ** past the e
9b90: 6e 64 20 6f 66 20 74 68 65 20 6b 65 79 20 76 61  nd of the key va
9ba0: 6c 75 65 2e 20 2a 2f 0a 20 20 20 20 70 45 6e 64  lue. */.    pEnd
9bb0: 20 3d 20 26 70 49 74 65 72 5b 39 5d 3b 0a 20 20   = &pIter[9];.  
9bc0: 20 20 77 68 69 6c 65 28 20 28 2a 70 49 74 65 72    while( (*pIter
9bd0: 2b 2b 29 26 30 78 38 30 20 26 26 20 70 49 74 65  ++)&0x80 && pIte
9be0: 72 3c 70 45 6e 64 20 29 3b 0a 20 20 7d 0a 20 20  r<pEnd );.  }.  
9bf0: 74 65 73 74 63 61 73 65 28 20 6e 53 69 7a 65 3d  testcase( nSize=
9c00: 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c  =pPage->maxLocal
9c10: 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
9c20: 6e 53 69 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d 61  nSize==pPage->ma
9c30: 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 69 66  xLocal+1 );.  if
9c40: 28 20 6e 53 69 7a 65 3c 3d 70 50 61 67 65 2d 3e  ( nSize<=pPage->
9c50: 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20  maxLocal ){.    
9c60: 6e 53 69 7a 65 20 2b 3d 20 28 75 33 32 29 28 70  nSize += (u32)(p
9c70: 49 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b 0a 20  Iter - pCell);. 
9c80: 20 20 20 69 66 28 20 6e 53 69 7a 65 3c 34 20 29     if( nSize<4 )
9c90: 20 6e 53 69 7a 65 20 3d 20 34 3b 0a 20 20 7d 65   nSize = 4;.  }e
9ca0: 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6d 69 6e  lse{.    int min
9cb0: 4c 6f 63 61 6c 20 3d 20 70 50 61 67 65 2d 3e 6d  Local = pPage->m
9cc0: 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 6e 53 69  inLocal;.    nSi
9cd0: 7a 65 20 3d 20 6d 69 6e 4c 6f 63 61 6c 20 2b 20  ze = minLocal + 
9ce0: 28 6e 53 69 7a 65 20 2d 20 6d 69 6e 4c 6f 63 61  (nSize - minLoca
9cf0: 6c 29 20 25 20 28 70 50 61 67 65 2d 3e 70 42 74  l) % (pPage->pBt
9d00: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34  ->usableSize - 4
9d10: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
9d20: 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d   nSize==pPage->m
9d30: 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 20 20 74  axLocal );.    t
9d40: 65 73 74 63 61 73 65 28 20 6e 53 69 7a 65 3d 3d  estcase( nSize==
9d50: 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b  pPage->maxLocal+
9d60: 31 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 53 69  1 );.    if( nSi
9d70: 7a 65 3e 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  ze>pPage->maxLoc
9d80: 61 6c 20 29 7b 0a 20 20 20 20 20 20 6e 53 69 7a  al ){.      nSiz
9d90: 65 20 3d 20 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20  e = minLocal;.  
9da0: 20 20 7d 0a 20 20 20 20 6e 53 69 7a 65 20 2b 3d    }.    nSize +=
9db0: 20 34 20 2b 20 28 75 31 36 29 28 70 49 74 65 72   4 + (u16)(pIter
9dc0: 20 2d 20 70 43 65 6c 6c 29 3b 0a 20 20 7d 0a 20   - pCell);.  }. 
9dd0: 20 61 73 73 65 72 74 28 20 6e 53 69 7a 65 3d 3d   assert( nSize==
9de0: 64 65 62 75 67 69 6e 66 6f 2e 6e 53 69 7a 65 20  debuginfo.nSize 
9df0: 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b  || CORRUPT_DB );
9e00: 0a 20 20 72 65 74 75 72 6e 20 28 75 31 36 29 6e  .  return (u16)n
9e10: 53 69 7a 65 3b 0a 7d 0a 73 74 61 74 69 63 20 75  Size;.}.static u
9e20: 31 36 20 63 65 6c 6c 53 69 7a 65 50 74 72 4e 6f  16 cellSizePtrNo
9e30: 50 61 79 6c 6f 61 64 28 4d 65 6d 50 61 67 65 20  Payload(MemPage 
9e40: 2a 70 50 61 67 65 2c 20 75 38 20 2a 70 43 65 6c  *pPage, u8 *pCel
9e50: 6c 29 7b 0a 20 20 75 38 20 2a 70 49 74 65 72 20  l){.  u8 *pIter 
9e60: 3d 20 70 43 65 6c 6c 20 2b 20 34 3b 20 2f 2a 20  = pCell + 4; /* 
9e70: 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72  For looping over
9e80: 20 62 79 74 65 73 20 6f 66 20 70 43 65 6c 6c 20   bytes of pCell 
9e90: 2a 2f 0a 20 20 75 38 20 2a 70 45 6e 64 3b 20 20  */.  u8 *pEnd;  
9ea0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
9eb0: 6e 64 20 6d 61 72 6b 20 66 6f 72 20 61 20 76 61  nd mark for a va
9ec0: 72 69 6e 74 20 2a 2f 0a 0a 23 69 66 64 65 66 20  rint */..#ifdef 
9ed0: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f  SQLITE_DEBUG.  /
9ee0: 2a 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75  * The value retu
9ef0: 72 6e 65 64 20 62 79 20 74 68 69 73 20 66 75 6e  rned by this fun
9f00: 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 61 6c 77  ction should alw
9f10: 61 79 73 20 62 65 20 74 68 65 20 73 61 6d 65 20  ays be the same 
9f20: 61 73 0a 20 20 2a 2a 20 74 68 65 20 28 43 65 6c  as.  ** the (Cel
9f30: 6c 49 6e 66 6f 2e 6e 53 69 7a 65 29 20 76 61 6c  lInfo.nSize) val
9f40: 75 65 20 66 6f 75 6e 64 20 62 79 20 64 6f 69 6e  ue found by doin
9f50: 67 20 61 20 66 75 6c 6c 20 70 61 72 73 65 20 6f  g a full parse o
9f60: 66 20 74 68 65 0a 20 20 2a 2a 20 63 65 6c 6c 2e  f the.  ** cell.
9f70: 20 49 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47   If SQLITE_DEBUG
9f80: 20 69 73 20 64 65 66 69 6e 65 64 2c 20 61 6e 20   is defined, an 
9f90: 61 73 73 65 72 74 28 29 20 61 74 20 74 68 65 20  assert() at the 
9fa0: 62 6f 74 74 6f 6d 20 6f 66 0a 20 20 2a 2a 20 74  bottom of.  ** t
9fb0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 76 65 72  his function ver
9fc0: 69 66 69 65 73 20 74 68 61 74 20 74 68 69 73 20  ifies that this 
9fd0: 69 6e 76 61 72 69 61 6e 74 20 69 73 20 6e 6f 74  invariant is not
9fe0: 20 76 69 6f 6c 61 74 65 64 2e 20 2a 2f 0a 20 20   violated. */.  
9ff0: 43 65 6c 6c 49 6e 66 6f 20 64 65 62 75 67 69 6e  CellInfo debugin
a000: 66 6f 3b 0a 20 20 70 50 61 67 65 2d 3e 78 50 61  fo;.  pPage->xPa
a010: 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 70  rseCell(pPage, p
a020: 43 65 6c 6c 2c 20 26 64 65 62 75 67 69 6e 66 6f  Cell, &debuginfo
a030: 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73  );.#endif..  ass
a040: 65 72 74 28 20 70 50 61 67 65 2d 3e 63 68 69 6c  ert( pPage->chil
a050: 64 50 74 72 53 69 7a 65 3d 3d 34 20 29 3b 0a 20  dPtrSize==4 );. 
a060: 20 70 45 6e 64 20 3d 20 70 49 74 65 72 20 2b 20   pEnd = pIter + 
a070: 39 3b 0a 20 20 77 68 69 6c 65 28 20 28 2a 70 49  9;.  while( (*pI
a080: 74 65 72 2b 2b 29 26 30 78 38 30 20 26 26 20 70  ter++)&0x80 && p
a090: 49 74 65 72 3c 70 45 6e 64 20 29 3b 0a 20 20 61  Iter<pEnd );.  a
a0a0: 73 73 65 72 74 28 20 64 65 62 75 67 69 6e 66 6f  ssert( debuginfo
a0b0: 2e 6e 53 69 7a 65 3d 3d 28 75 31 36 29 28 70 49  .nSize==(u16)(pI
a0c0: 74 65 72 20 2d 20 70 43 65 6c 6c 29 20 7c 7c 20  ter - pCell) || 
a0d0: 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20  CORRUPT_DB );.  
a0e0: 72 65 74 75 72 6e 20 28 75 31 36 29 28 70 49 74  return (u16)(pIt
a0f0: 65 72 20 2d 20 70 43 65 6c 6c 29 3b 0a 7d 0a 0a  er - pCell);.}..
a100: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
a110: 45 42 55 47 0a 2f 2a 20 54 68 69 73 20 76 61 72  EBUG./* This var
a120: 69 61 74 69 6f 6e 20 6f 6e 20 63 65 6c 6c 53 69  iation on cellSi
a130: 7a 65 50 74 72 28 29 20 69 73 20 75 73 65 64 20  zePtr() is used 
a140: 69 6e 73 69 64 65 20 6f 66 20 61 73 73 65 72 74  inside of assert
a150: 28 29 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2a  () statements.**
a160: 20 6f 6e 6c 79 2e 20 2a 2f 0a 73 74 61 74 69 63   only. */.static
a170: 20 75 31 36 20 63 65 6c 6c 53 69 7a 65 28 4d 65   u16 cellSize(Me
a180: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e  mPage *pPage, in
a190: 74 20 69 43 65 6c 6c 29 7b 0a 20 20 72 65 74 75  t iCell){.  retu
a1a0: 72 6e 20 70 50 61 67 65 2d 3e 78 43 65 6c 6c 53  rn pPage->xCellS
a1b0: 69 7a 65 28 70 50 61 67 65 2c 20 66 69 6e 64 43  ize(pPage, findC
a1c0: 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65 6c 6c  ell(pPage, iCell
a1d0: 29 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  ));.}.#endif..#i
a1e0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
a1f0: 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a  T_AUTOVACUUM./*.
a200: 2a 2a 20 49 66 20 74 68 65 20 63 65 6c 6c 20 70  ** If the cell p
a210: 43 65 6c 6c 2c 20 70 61 72 74 20 6f 66 20 70 61  Cell, part of pa
a220: 67 65 20 70 50 61 67 65 20 63 6f 6e 74 61 69 6e  ge pPage contain
a230: 73 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74  s a pointer.** t
a240: 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  o an overflow pa
a250: 67 65 2c 20 69 6e 73 65 72 74 20 61 6e 20 65 6e  ge, insert an en
a260: 74 72 79 20 69 6e 74 6f 20 74 68 65 20 70 6f 69  try into the poi
a270: 6e 74 65 72 2d 6d 61 70 0a 2a 2a 20 66 6f 72 20  nter-map.** for 
a280: 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  the overflow pag
a290: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
a2a0: 64 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50  d ptrmapPutOvflP
a2b0: 74 72 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  tr(MemPage *pPag
a2c0: 65 2c 20 75 38 20 2a 70 43 65 6c 6c 2c 20 69 6e  e, u8 *pCell, in
a2d0: 74 20 2a 70 52 43 29 7b 0a 20 20 43 65 6c 6c 49  t *pRC){.  CellI
a2e0: 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 69 66 28 20  nfo info;.  if( 
a2f0: 2a 70 52 43 20 29 20 72 65 74 75 72 6e 3b 0a 20  *pRC ) return;. 
a300: 20 61 73 73 65 72 74 28 20 70 43 65 6c 6c 21 3d   assert( pCell!=
a310: 30 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e 78 50  0 );.  pPage->xP
a320: 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20  arseCell(pPage, 
a330: 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20  pCell, &info);. 
a340: 20 69 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66   if( info.iOverf
a350: 6c 6f 77 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20  low ){.    Pgno 
a360: 6f 76 66 6c 20 3d 20 67 65 74 34 62 79 74 65 28  ovfl = get4byte(
a370: 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65  &pCell[info.iOve
a380: 72 66 6c 6f 77 5d 29 3b 0a 20 20 20 20 70 74 72  rflow]);.    ptr
a390: 6d 61 70 50 75 74 28 70 50 61 67 65 2d 3e 70 42  mapPut(pPage->pB
a3a0: 74 2c 20 6f 76 66 6c 2c 20 50 54 52 4d 41 50 5f  t, ovfl, PTRMAP_
a3b0: 4f 56 45 52 46 4c 4f 57 31 2c 20 70 50 61 67 65  OVERFLOW1, pPage
a3c0: 2d 3e 70 67 6e 6f 2c 20 70 52 43 29 3b 0a 20 20  ->pgno, pRC);.  
a3d0: 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a  }.}.#endif.../*.
a3e0: 2a 2a 20 44 65 66 72 61 67 6d 65 6e 74 20 74 68  ** Defragment th
a3f0: 65 20 70 61 67 65 20 67 69 76 65 6e 2e 20 20 41  e page given.  A
a400: 6c 6c 20 43 65 6c 6c 73 20 61 72 65 20 6d 6f 76  ll Cells are mov
a410: 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20 65 6e 64  ed to the.** end
a420: 20 6f 66 20 74 68 65 20 70 61 67 65 20 61 6e 64   of the page and
a430: 20 61 6c 6c 20 66 72 65 65 20 73 70 61 63 65 20   all free space 
a440: 69 73 20 63 6f 6c 6c 65 63 74 65 64 20 69 6e 74  is collected int
a450: 6f 20 6f 6e 65 0a 2a 2a 20 62 69 67 20 46 72 65  o one.** big Fre
a460: 65 42 6c 6b 20 74 68 61 74 20 6f 63 63 75 72 73  eBlk that occurs
a470: 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20   in between the 
a480: 68 65 61 64 65 72 20 61 6e 64 20 63 65 6c 6c 0a  header and cell.
a490: 2a 2a 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79  ** pointer array
a4a0: 20 61 6e 64 20 74 68 65 20 63 65 6c 6c 20 63 6f   and the cell co
a4b0: 6e 74 65 6e 74 20 61 72 65 61 2e 0a 2a 2a 0a 2a  ntent area..**.*
a4c0: 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
a4d0: 2d 34 34 35 38 32 2d 36 30 31 33 38 20 53 51 4c  -44582-60138 SQL
a4e0: 69 74 65 20 6d 61 79 20 66 72 6f 6d 20 74 69 6d  ite may from tim
a4f0: 65 20 74 6f 20 74 69 6d 65 20 72 65 6f 72 67 61  e to time reorga
a500: 6e 69 7a 65 20 61 0a 2a 2a 20 62 2d 74 72 65 65  nize a.** b-tree
a510: 20 70 61 67 65 20 73 6f 20 74 68 61 74 20 74 68   page so that th
a520: 65 72 65 20 61 72 65 20 6e 6f 20 66 72 65 65 62  ere are no freeb
a530: 6c 6f 63 6b 73 20 6f 72 20 66 72 61 67 6d 65 6e  locks or fragmen
a540: 74 20 62 79 74 65 73 2c 20 61 6c 6c 0a 2a 2a 20  t bytes, all.** 
a550: 75 6e 75 73 65 64 20 62 79 74 65 73 20 61 72 65  unused bytes are
a560: 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68   contained in th
a570: 65 20 75 6e 61 6c 6c 6f 63 61 74 65 64 20 73 70  e unallocated sp
a580: 61 63 65 20 72 65 67 69 6f 6e 2c 20 61 6e 64 20  ace region, and 
a590: 61 6c 6c 0a 2a 2a 20 63 65 6c 6c 73 20 61 72 65  all.** cells are
a5a0: 20 70 61 63 6b 65 64 20 74 69 67 68 74 6c 79 20   packed tightly 
a5b0: 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  at the end of th
a5c0: 65 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69  e page..*/.stati
a5d0: 63 20 69 6e 74 20 64 65 66 72 61 67 6d 65 6e 74  c int defragment
a5e0: 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50  Page(MemPage *pP
a5f0: 61 67 65 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20  age){.  int i;  
a600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a610: 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
a620: 65 72 20 2a 2f 0a 20 20 69 6e 74 20 70 63 3b 20  er */.  int pc; 
a630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a640: 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
a650: 20 74 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 2a   the i-th cell *
a660: 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20 20 20 20  /.  int hdr;    
a670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a680: 2a 20 4f 66 66 73 65 74 20 74 6f 20 74 68 65 20  * Offset to the 
a690: 70 61 67 65 20 68 65 61 64 65 72 20 2a 2f 0a 20  page header */. 
a6a0: 20 69 6e 74 20 73 69 7a 65 3b 20 20 20 20 20 20   int size;      
a6b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
a6c0: 69 7a 65 20 6f 66 20 61 20 63 65 6c 6c 20 2a 2f  ize of a cell */
a6d0: 0a 20 20 69 6e 74 20 75 73 61 62 6c 65 53 69 7a  .  int usableSiz
a6e0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
a6f0: 20 4e 75 6d 62 65 72 20 6f 66 20 75 73 61 62 6c   Number of usabl
a700: 65 20 62 79 74 65 73 20 6f 6e 20 61 20 70 61 67  e bytes on a pag
a710: 65 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 4f  e */.  int cellO
a720: 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 20 20  ffset;          
a730: 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 74    /* Offset to t
a740: 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20  he cell pointer 
a750: 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 63  array */.  int c
a760: 62 72 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  brk;            
a770: 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
a780: 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  to the cell cont
a790: 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20 69 6e  ent area */.  in
a7a0: 74 20 6e 43 65 6c 6c 3b 20 20 20 20 20 20 20 20  t nCell;        
a7b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
a7c0: 65 72 20 6f 66 20 63 65 6c 6c 73 20 6f 6e 20 74  er of cells on t
a7d0: 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 75 6e 73  he page */.  uns
a7e0: 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61  igned char *data
a7f0: 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70  ;       /* The p
a800: 61 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 75 6e  age data */.  un
a810: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 74 65 6d  signed char *tem
a820: 70 3b 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70  p;       /* Temp
a830: 20 61 72 65 61 20 66 6f 72 20 63 65 6c 6c 20 63   area for cell c
a840: 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 75 6e 73 69  ontent */.  unsi
a850: 67 6e 65 64 20 63 68 61 72 20 2a 73 72 63 3b 20  gned char *src; 
a860: 20 20 20 20 20 20 20 2f 2a 20 53 6f 75 72 63 65         /* Source
a870: 20 6f 66 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20   of content */. 
a880: 20 69 6e 74 20 69 43 65 6c 6c 46 69 72 73 74 3b   int iCellFirst;
a890: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
a8a0: 69 72 73 74 20 61 6c 6c 6f 77 61 62 6c 65 20 63  irst allowable c
a8b0: 65 6c 6c 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69  ell index */.  i
a8c0: 6e 74 20 69 43 65 6c 6c 4c 61 73 74 3b 20 20 20  nt iCellLast;   
a8d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 73            /* Las
a8e0: 74 20 70 6f 73 73 69 62 6c 65 20 63 65 6c 6c 20  t possible cell 
a8f0: 69 6e 64 65 78 20 2a 2f 0a 0a 0a 20 20 61 73 73  index */...  ass
a900: 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
a910: 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
a920: 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
a930: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
a940: 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20 61 73 73  >pBt!=0 );.  ass
a950: 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 2d  ert( pPage->pBt-
a960: 3e 75 73 61 62 6c 65 53 69 7a 65 20 3c 3d 20 53  >usableSize <= S
a970: 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53  QLITE_MAX_PAGE_S
a980: 49 5a 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  IZE );.  assert(
a990: 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
a9a0: 77 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  w==0 );.  assert
a9b0: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
a9c0: 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
a9d0: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 74 65 6d  >mutex) );.  tem
a9e0: 70 20 3d 20 30 3b 0a 20 20 73 72 63 20 3d 20 64  p = 0;.  src = d
a9f0: 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61  ata = pPage->aDa
aa00: 74 61 3b 0a 20 20 68 64 72 20 3d 20 70 50 61 67  ta;.  hdr = pPag
aa10: 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20  e->hdrOffset;.  
aa20: 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 70 50 61  cellOffset = pPa
aa30: 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 3b 0a  ge->cellOffset;.
aa40: 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d    nCell = pPage-
aa50: 3e 6e 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72 74  >nCell;.  assert
aa60: 28 20 6e 43 65 6c 6c 3d 3d 67 65 74 32 62 79 74  ( nCell==get2byt
aa70: 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 29 20  e(&data[hdr+3]) 
aa80: 29 3b 0a 20 20 75 73 61 62 6c 65 53 69 7a 65 20  );.  usableSize 
aa90: 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  = pPage->pBt->us
aaa0: 61 62 6c 65 53 69 7a 65 3b 0a 20 20 63 62 72 6b  ableSize;.  cbrk
aab0: 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20   = usableSize;. 
aac0: 20 69 43 65 6c 6c 46 69 72 73 74 20 3d 20 63 65   iCellFirst = ce
aad0: 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 6e 43 65  llOffset + 2*nCe
aae0: 6c 6c 3b 0a 20 20 69 43 65 6c 6c 4c 61 73 74 20  ll;.  iCellLast 
aaf0: 3d 20 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34  = usableSize - 4
ab00: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  ;.  for(i=0; i<n
ab10: 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Cell; i++){.    
ab20: 75 38 20 2a 70 41 64 64 72 3b 20 20 20 20 20 2f  u8 *pAddr;     /
ab30: 2a 20 54 68 65 20 69 2d 74 68 20 63 65 6c 6c 20  * The i-th cell 
ab40: 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 20 20 70  pointer */.    p
ab50: 41 64 64 72 20 3d 20 26 64 61 74 61 5b 63 65 6c  Addr = &data[cel
ab60: 6c 4f 66 66 73 65 74 20 2b 20 69 2a 32 5d 3b 0a  lOffset + i*2];.
ab70: 20 20 20 20 70 63 20 3d 20 67 65 74 32 62 79 74      pc = get2byt
ab80: 65 28 70 41 64 64 72 29 3b 0a 20 20 20 20 74 65  e(pAddr);.    te
ab90: 73 74 63 61 73 65 28 20 70 63 3d 3d 69 43 65 6c  stcase( pc==iCel
aba0: 6c 46 69 72 73 74 20 29 3b 0a 20 20 20 20 74 65  lFirst );.    te
abb0: 73 74 63 61 73 65 28 20 70 63 3d 3d 69 43 65 6c  stcase( pc==iCel
abc0: 6c 4c 61 73 74 20 29 3b 0a 20 20 20 20 2f 2a 20  lLast );.    /* 
abd0: 54 68 65 73 65 20 63 6f 6e 64 69 74 69 6f 6e 73  These conditions
abe0: 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65   have already be
abf0: 65 6e 20 76 65 72 69 66 69 65 64 20 69 6e 20 62  en verified in b
ac00: 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 0a 20  treeInitPage(). 
ac10: 20 20 20 2a 2a 20 69 66 20 50 52 41 47 4d 41 20     ** if PRAGMA 
ac20: 63 65 6c 6c 5f 73 69 7a 65 5f 63 68 65 63 6b 3d  cell_size_check=
ac30: 4f 4e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ON..    */.    i
ac40: 66 28 20 70 63 3c 69 43 65 6c 6c 46 69 72 73 74  f( pc<iCellFirst
ac50: 20 7c 7c 20 70 63 3e 69 43 65 6c 6c 4c 61 73 74   || pc>iCellLast
ac60: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
ac70: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
ac80: 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20  BKPT;.    }.    
ac90: 61 73 73 65 72 74 28 20 70 63 3e 3d 69 43 65 6c  assert( pc>=iCel
aca0: 6c 46 69 72 73 74 20 26 26 20 70 63 3c 3d 69 43  lFirst && pc<=iC
acb0: 65 6c 6c 4c 61 73 74 20 29 3b 0a 20 20 20 20 73  ellLast );.    s
acc0: 69 7a 65 20 3d 20 70 50 61 67 65 2d 3e 78 43 65  ize = pPage->xCe
acd0: 6c 6c 53 69 7a 65 28 70 50 61 67 65 2c 20 26 73  llSize(pPage, &s
ace0: 72 63 5b 70 63 5d 29 3b 0a 20 20 20 20 63 62 72  rc[pc]);.    cbr
acf0: 6b 20 2d 3d 20 73 69 7a 65 3b 0a 20 20 20 20 69  k -= size;.    i
ad00: 66 28 20 63 62 72 6b 3c 69 43 65 6c 6c 46 69 72  f( cbrk<iCellFir
ad10: 73 74 20 7c 7c 20 70 63 2b 73 69 7a 65 3e 75 73  st || pc+size>us
ad20: 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20  ableSize ){.    
ad30: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
ad40: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
ad50: 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
ad60: 63 62 72 6b 2b 73 69 7a 65 3c 3d 75 73 61 62 6c  cbrk+size<=usabl
ad70: 65 53 69 7a 65 20 26 26 20 63 62 72 6b 3e 3d 69  eSize && cbrk>=i
ad80: 43 65 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20 20  CellFirst );.   
ad90: 20 74 65 73 74 63 61 73 65 28 20 63 62 72 6b 2b   testcase( cbrk+
ada0: 73 69 7a 65 3d 3d 75 73 61 62 6c 65 53 69 7a 65  size==usableSize
adb0: 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
adc0: 28 20 70 63 2b 73 69 7a 65 3d 3d 75 73 61 62 6c  ( pc+size==usabl
add0: 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 70 75 74  eSize );.    put
ade0: 32 62 79 74 65 28 70 41 64 64 72 2c 20 63 62 72  2byte(pAddr, cbr
adf0: 6b 29 3b 0a 20 20 20 20 69 66 28 20 74 65 6d 70  k);.    if( temp
ae00: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ==0 ){.      int
ae10: 20 78 3b 0a 20 20 20 20 20 20 69 66 28 20 63 62   x;.      if( cb
ae20: 72 6b 3d 3d 70 63 20 29 20 63 6f 6e 74 69 6e 75  rk==pc ) continu
ae30: 65 3b 0a 20 20 20 20 20 20 74 65 6d 70 20 3d 20  e;.      temp = 
ae40: 73 71 6c 69 74 65 33 50 61 67 65 72 54 65 6d 70  sqlite3PagerTemp
ae50: 53 70 61 63 65 28 70 50 61 67 65 2d 3e 70 42 74  Space(pPage->pBt
ae60: 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  ->pPager);.     
ae70: 20 78 20 3d 20 67 65 74 32 62 79 74 65 28 26 64   x = get2byte(&d
ae80: 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20  ata[hdr+5]);.   
ae90: 20 20 20 6d 65 6d 63 70 79 28 26 74 65 6d 70 5b     memcpy(&temp[
aea0: 78 5d 2c 20 26 64 61 74 61 5b 78 5d 2c 20 28 63  x], &data[x], (c
aeb0: 62 72 6b 2b 73 69 7a 65 29 20 2d 20 78 29 3b 0a  brk+size) - x);.
aec0: 20 20 20 20 20 20 73 72 63 20 3d 20 74 65 6d 70        src = temp
aed0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 63  ;.    }.    memc
aee0: 70 79 28 26 64 61 74 61 5b 63 62 72 6b 5d 2c 20  py(&data[cbrk], 
aef0: 26 73 72 63 5b 70 63 5d 2c 20 73 69 7a 65 29 3b  &src[pc], size);
af00: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 63  .  }.  assert( c
af10: 62 72 6b 3e 3d 69 43 65 6c 6c 46 69 72 73 74 20  brk>=iCellFirst 
af20: 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64  );.  put2byte(&d
af30: 61 74 61 5b 68 64 72 2b 35 5d 2c 20 63 62 72 6b  ata[hdr+5], cbrk
af40: 29 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b 31 5d  );.  data[hdr+1]
af50: 20 3d 20 30 3b 0a 20 20 64 61 74 61 5b 68 64 72   = 0;.  data[hdr
af60: 2b 32 5d 20 3d 20 30 3b 0a 20 20 64 61 74 61 5b  +2] = 0;.  data[
af70: 68 64 72 2b 37 5d 20 3d 20 30 3b 0a 20 20 6d 65  hdr+7] = 0;.  me
af80: 6d 73 65 74 28 26 64 61 74 61 5b 69 43 65 6c 6c  mset(&data[iCell
af90: 46 69 72 73 74 5d 2c 20 30 2c 20 63 62 72 6b 2d  First], 0, cbrk-
afa0: 69 43 65 6c 6c 46 69 72 73 74 29 3b 0a 20 20 61  iCellFirst);.  a
afb0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
afc0: 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
afd0: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
afe0: 3b 0a 20 20 69 66 28 20 63 62 72 6b 2d 69 43 65  ;.  if( cbrk-iCe
aff0: 6c 6c 46 69 72 73 74 21 3d 70 50 61 67 65 2d 3e  llFirst!=pPage->
b000: 6e 46 72 65 65 20 29 7b 0a 20 20 20 20 72 65 74  nFree ){.    ret
b010: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
b020: 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72  PT_BKPT;.  }.  r
b030: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
b040: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63 68  .}../*.** Search
b050: 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 6f   the free-list o
b060: 6e 20 70 61 67 65 20 70 50 67 20 66 6f 72 20 73  n page pPg for s
b070: 70 61 63 65 20 74 6f 20 73 74 6f 72 65 20 61 20  pace to store a 
b080: 63 65 6c 6c 20 6e 42 79 74 65 20 62 79 74 65 73  cell nByte bytes
b090: 20 69 6e 0a 2a 2a 20 73 69 7a 65 2e 20 49 66 20   in.** size. If 
b0a0: 6f 6e 65 20 63 61 6e 20 62 65 20 66 6f 75 6e 64  one can be found
b0b0: 2c 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  , return a point
b0c0: 65 72 20 74 6f 20 74 68 65 20 73 70 61 63 65 20  er to the space 
b0d0: 61 6e 64 20 72 65 6d 6f 76 65 20 69 74 0a 2a 2a  and remove it.**
b0e0: 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 2d 6c   from the free-l
b0f0: 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f  ist..**.** If no
b100: 20 73 75 69 74 61 62 6c 65 20 73 70 61 63 65 20   suitable space 
b110: 63 61 6e 20 62 65 20 66 6f 75 6e 64 20 6f 6e 20  can be found on 
b120: 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 20 72  the free-list, r
b130: 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a  eturn NULL..**.*
b140: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
b150: 6d 61 79 20 64 65 74 65 63 74 20 63 6f 72 72 75  may detect corru
b160: 70 74 69 6f 6e 20 77 69 74 68 69 6e 20 70 50 67  ption within pPg
b170: 2e 20 20 49 66 20 63 6f 72 72 75 70 74 69 6f 6e  .  If corruption
b180: 20 69 73 0a 2a 2a 20 64 65 74 65 63 74 65 64 20   is.** detected 
b190: 74 68 65 6e 20 2a 70 52 63 20 69 73 20 73 65 74  then *pRc is set
b1a0: 20 74 6f 20 53 51 4c 49 54 45 5f 43 4f 52 52 55   to SQLITE_CORRU
b1b0: 50 54 20 61 6e 64 20 4e 55 4c 4c 20 69 73 20 72  PT and NULL is r
b1c0: 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 53  eturned..**.** S
b1d0: 6c 6f 74 73 20 6f 6e 20 74 68 65 20 66 72 65 65  lots on the free
b1e0: 20 6c 69 73 74 20 74 68 61 74 20 61 72 65 20 62   list that are b
b1f0: 65 74 77 65 65 6e 20 31 20 61 6e 64 20 33 20 62  etween 1 and 3 b
b200: 79 74 65 73 20 6c 61 72 67 65 72 20 74 68 61 6e  ytes larger than
b210: 20 6e 42 79 74 65 0a 2a 2a 20 77 69 6c 6c 20 62   nByte.** will b
b220: 65 20 69 67 6e 6f 72 65 64 20 69 66 20 61 64 64  e ignored if add
b230: 69 6e 67 20 74 68 65 20 65 78 74 72 61 20 73 70  ing the extra sp
b240: 61 63 65 20 74 6f 20 74 68 65 20 66 72 61 67 6d  ace to the fragm
b250: 65 6e 74 61 74 69 6f 6e 20 63 6f 75 6e 74 0a 2a  entation count.*
b260: 2a 20 63 61 75 73 65 73 20 74 68 65 20 66 72 61  * causes the fra
b270: 67 6d 65 6e 74 61 74 69 6f 6e 20 63 6f 75 6e 74  gmentation count
b280: 20 74 6f 20 65 78 63 65 65 64 20 36 30 2e 0a 2a   to exceed 60..*
b290: 2f 0a 73 74 61 74 69 63 20 75 38 20 2a 70 61 67  /.static u8 *pag
b2a0: 65 46 69 6e 64 53 6c 6f 74 28 4d 65 6d 50 61 67  eFindSlot(MemPag
b2b0: 65 20 2a 70 50 67 2c 20 69 6e 74 20 6e 42 79 74  e *pPg, int nByt
b2c0: 65 2c 20 69 6e 74 20 2a 70 52 63 29 7b 0a 20 20  e, int *pRc){.  
b2d0: 63 6f 6e 73 74 20 69 6e 74 20 68 64 72 20 3d 20  const int hdr = 
b2e0: 70 50 67 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a  pPg->hdrOffset;.
b2f0: 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 61 44 61    u8 * const aDa
b300: 74 61 20 3d 20 70 50 67 2d 3e 61 44 61 74 61 3b  ta = pPg->aData;
b310: 0a 20 20 69 6e 74 20 69 41 64 64 72 20 3d 20 68  .  int iAddr = h
b320: 64 72 20 2b 20 31 3b 0a 20 20 69 6e 74 20 70 63  dr + 1;.  int pc
b330: 20 3d 20 67 65 74 32 62 79 74 65 28 26 61 44 61   = get2byte(&aDa
b340: 74 61 5b 69 41 64 64 72 5d 29 3b 0a 20 20 69 6e  ta[iAddr]);.  in
b350: 74 20 78 3b 0a 20 20 69 6e 74 20 75 73 61 62 6c  t x;.  int usabl
b360: 65 53 69 7a 65 20 3d 20 70 50 67 2d 3e 70 42 74  eSize = pPg->pBt
b370: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 0a 20  ->usableSize;.. 
b380: 20 61 73 73 65 72 74 28 20 70 63 3e 30 20 29 3b   assert( pc>0 );
b390: 0a 20 20 64 6f 7b 0a 20 20 20 20 69 6e 74 20 73  .  do{.    int s
b3a0: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
b3b0: 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 66  /* Size of the f
b3c0: 72 65 65 20 73 6c 6f 74 20 2a 2f 0a 20 20 20 20  ree slot */.    
b3d0: 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
b3e0: 52 2d 30 36 38 36 36 2d 33 39 31 32 35 20 46 72  R-06866-39125 Fr
b3f0: 65 65 62 6c 6f 63 6b 73 20 61 72 65 20 61 6c 77  eeblocks are alw
b400: 61 79 73 20 63 6f 6e 6e 65 63 74 65 64 20 69 6e  ays connected in
b410: 20 6f 72 64 65 72 20 6f 66 0a 20 20 20 20 2a 2a   order of.    **
b420: 20 69 6e 63 72 65 61 73 69 6e 67 20 6f 66 66 73   increasing offs
b430: 65 74 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  et. */.    if( p
b440: 63 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34 20 7c  c>usableSize-4 |
b450: 7c 20 70 63 3c 69 41 64 64 72 2b 34 20 29 7b 0a  | pc<iAddr+4 ){.
b460: 20 20 20 20 20 20 2a 70 52 63 20 3d 20 53 51 4c        *pRc = SQL
b470: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
b480: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  ;.      return 0
b490: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 45  ;.    }.    /* E
b4a0: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 32  VIDENCE-OF: R-22
b4b0: 37 31 30 2d 35 33 33 32 38 20 54 68 65 20 74 68  710-53328 The th
b4c0: 69 72 64 20 61 6e 64 20 66 6f 75 72 74 68 20 62  ird and fourth b
b4d0: 79 74 65 73 20 6f 66 20 65 61 63 68 0a 20 20 20  ytes of each.   
b4e0: 20 2a 2a 20 66 72 65 65 62 6c 6f 63 6b 20 66 6f   ** freeblock fo
b4f0: 72 6d 20 61 20 62 69 67 2d 65 6e 64 69 61 6e 20  rm a big-endian 
b500: 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73  integer which is
b510: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
b520: 20 66 72 65 65 62 6c 6f 63 6b 0a 20 20 20 20 2a   freeblock.    *
b530: 2a 20 69 6e 20 62 79 74 65 73 2c 20 69 6e 63 6c  * in bytes, incl
b540: 75 64 69 6e 67 20 74 68 65 20 34 2d 62 79 74 65  uding the 4-byte
b550: 20 68 65 61 64 65 72 2e 20 2a 2f 0a 20 20 20 20   header. */.    
b560: 73 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28  size = get2byte(
b570: 26 61 44 61 74 61 5b 70 63 2b 32 5d 29 3b 0a 20  &aData[pc+2]);. 
b580: 20 20 20 69 66 28 20 28 78 20 3d 20 73 69 7a 65     if( (x = size
b590: 20 2d 20 6e 42 79 74 65 29 3e 3d 30 20 29 7b 0a   - nByte)>=0 ){.
b5a0: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
b5b0: 78 3d 3d 34 20 29 3b 0a 20 20 20 20 20 20 74 65  x==4 );.      te
b5c0: 73 74 63 61 73 65 28 20 78 3d 3d 33 20 29 3b 0a  stcase( x==3 );.
b5d0: 20 20 20 20 20 20 69 66 28 20 70 63 20 3c 20 70        if( pc < p
b5e0: 50 67 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 2b 32  Pg->cellOffset+2
b5f0: 2a 70 50 67 2d 3e 6e 43 65 6c 6c 20 7c 7c 20 73  *pPg->nCell || s
b600: 69 7a 65 2b 70 63 20 3e 20 75 73 61 62 6c 65 53  ize+pc > usableS
b610: 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 2a  ize ){.        *
b620: 70 52 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52  pRc = SQLITE_COR
b630: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
b640: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
b650: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 78 3c 34     }else if( x<4
b660: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 45   ){.        /* E
b670: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 31  VIDENCE-OF: R-11
b680: 34 39 38 2d 35 38 30 32 32 20 49 6e 20 61 20 77  498-58022 In a w
b690: 65 6c 6c 2d 66 6f 72 6d 65 64 20 62 2d 74 72 65  ell-formed b-tre
b6a0: 65 20 70 61 67 65 2c 20 74 68 65 20 74 6f 74 61  e page, the tota
b6b0: 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 75 6d  l.        ** num
b6c0: 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20  ber of bytes in 
b6d0: 66 72 61 67 6d 65 6e 74 73 20 6d 61 79 20 6e 6f  fragments may no
b6e0: 74 20 65 78 63 65 65 64 20 36 30 2e 20 2a 2f 0a  t exceed 60. */.
b6f0: 20 20 20 20 20 20 20 20 69 66 28 20 61 44 61 74          if( aDat
b700: 61 5b 68 64 72 2b 37 5d 3e 35 37 20 29 20 72 65  a[hdr+7]>57 ) re
b710: 74 75 72 6e 20 30 3b 0a 0a 20 20 20 20 20 20 20  turn 0;..       
b720: 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 73   /* Remove the s
b730: 6c 6f 74 20 66 72 6f 6d 20 74 68 65 20 66 72 65  lot from the fre
b740: 65 2d 6c 69 73 74 2e 20 55 70 64 61 74 65 20 74  e-list. Update t
b750: 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 20  he number of.   
b760: 20 20 20 20 20 2a 2a 20 66 72 61 67 6d 65 6e 74       ** fragment
b770: 65 64 20 62 79 74 65 73 20 77 69 74 68 69 6e 20  ed bytes within 
b780: 74 68 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20  the page. */.   
b790: 20 20 20 20 20 6d 65 6d 63 70 79 28 26 61 44 61       memcpy(&aDa
b7a0: 74 61 5b 69 41 64 64 72 5d 2c 20 26 61 44 61 74  ta[iAddr], &aDat
b7b0: 61 5b 70 63 5d 2c 20 32 29 3b 0a 20 20 20 20 20  a[pc], 2);.     
b7c0: 20 20 20 61 44 61 74 61 5b 68 64 72 2b 37 5d 20     aData[hdr+7] 
b7d0: 2b 3d 20 28 75 38 29 78 3b 0a 20 20 20 20 20 20  += (u8)x;.      
b7e0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f  }else{.        /
b7f0: 2a 20 54 68 65 20 73 6c 6f 74 20 72 65 6d 61 69  * The slot remai
b800: 6e 73 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c  ns on the free-l
b810: 69 73 74 2e 20 52 65 64 75 63 65 20 69 74 73 20  ist. Reduce its 
b820: 73 69 7a 65 20 74 6f 20 61 63 63 6f 75 6e 74 0a  size to account.
b830: 20 20 20 20 20 20 20 20 20 2a 2a 20 66 6f 72 20           ** for 
b840: 74 68 65 20 70 6f 72 74 69 6f 6e 20 75 73 65 64  the portion used
b850: 20 62 79 20 74 68 65 20 6e 65 77 20 61 6c 6c 6f   by the new allo
b860: 63 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20  cation. */.     
b870: 20 20 20 70 75 74 32 62 79 74 65 28 26 61 44 61     put2byte(&aDa
b880: 74 61 5b 70 63 2b 32 5d 2c 20 78 29 3b 0a 20 20  ta[pc+2], x);.  
b890: 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75      }.      retu
b8a0: 72 6e 20 26 61 44 61 74 61 5b 70 63 20 2b 20 78  rn &aData[pc + x
b8b0: 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 41 64  ];.    }.    iAd
b8c0: 64 72 20 3d 20 70 63 3b 0a 20 20 20 20 70 63 20  dr = pc;.    pc 
b8d0: 3d 20 67 65 74 32 62 79 74 65 28 26 61 44 61 74  = get2byte(&aDat
b8e0: 61 5b 70 63 5d 29 3b 0a 20 20 7d 77 68 69 6c 65  a[pc]);.  }while
b8f0: 28 20 70 63 20 29 3b 0a 0a 20 20 72 65 74 75 72  ( pc );..  retur
b900: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c  n 0;.}../*.** Al
b910: 6c 6f 63 61 74 65 20 6e 42 79 74 65 20 62 79 74  locate nByte byt
b920: 65 73 20 6f 66 20 73 70 61 63 65 20 66 72 6f 6d  es of space from
b930: 20 77 69 74 68 69 6e 20 74 68 65 20 42 2d 54 72   within the B-Tr
b940: 65 65 20 70 61 67 65 20 70 61 73 73 65 64 0a 2a  ee page passed.*
b950: 2a 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61  * as the first a
b960: 72 67 75 6d 65 6e 74 2e 20 57 72 69 74 65 20 69  rgument. Write i
b970: 6e 74 6f 20 2a 70 49 64 78 20 74 68 65 20 69 6e  nto *pIdx the in
b980: 64 65 78 20 69 6e 74 6f 20 70 50 61 67 65 2d 3e  dex into pPage->
b990: 61 44 61 74 61 5b 5d 0a 2a 2a 20 6f 66 20 74 68  aData[].** of th
b9a0: 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 20  e first byte of 
b9b0: 61 6c 6c 6f 63 61 74 65 64 20 73 70 61 63 65 2e  allocated space.
b9c0: 20 52 65 74 75 72 6e 20 65 69 74 68 65 72 20 53   Return either S
b9d0: 51 4c 49 54 45 5f 4f 4b 20 6f 72 0a 2a 2a 20 61  QLITE_OK or.** a
b9e0: 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 28 75 73  n error code (us
b9f0: 75 61 6c 6c 79 20 53 51 4c 49 54 45 5f 43 4f 52  ually SQLITE_COR
ba00: 52 55 50 54 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  RUPT)..**.** The
ba10: 20 63 61 6c 6c 65 72 20 67 75 61 72 61 6e 74 65   caller guarante
ba20: 65 73 20 74 68 61 74 20 74 68 65 72 65 20 69 73  es that there is
ba30: 20 73 75 66 66 69 63 69 65 6e 74 20 73 70 61 63   sufficient spac
ba40: 65 20 74 6f 20 6d 61 6b 65 20 74 68 65 0a 2a 2a  e to make the.**
ba50: 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 20 54 68   allocation.  Th
ba60: 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74  is routine might
ba70: 20 6e 65 65 64 20 74 6f 20 64 65 66 72 61 67 6d   need to defragm
ba80: 65 6e 74 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ent in order to 
ba90: 62 72 69 6e 67 0a 2a 2a 20 61 6c 6c 20 74 68 65  bring.** all the
baa0: 20 73 70 61 63 65 20 74 6f 67 65 74 68 65 72 2c   space together,
bab0: 20 68 6f 77 65 76 65 72 2e 20 20 54 68 69 73 20   however.  This 
bac0: 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 61 76 6f  routine will avo
bad0: 69 64 20 75 73 69 6e 67 0a 2a 2a 20 74 68 65 20  id using.** the 
bae0: 66 69 72 73 74 20 74 77 6f 20 62 79 74 65 73 20  first two bytes 
baf0: 70 61 73 74 20 74 68 65 20 63 65 6c 6c 20 70 6f  past the cell po
bb00: 69 6e 74 65 72 20 61 72 65 61 20 73 69 6e 63 65  inter area since
bb10: 20 70 72 65 73 75 6d 61 62 6c 79 20 74 68 69 73   presumably this
bb20: 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69  .** allocation i
bb30: 73 20 62 65 69 6e 67 20 6d 61 64 65 20 69 6e 20  s being made in 
bb40: 6f 72 64 65 72 20 74 6f 20 69 6e 73 65 72 74 20  order to insert 
bb50: 61 20 6e 65 77 20 63 65 6c 6c 2c 20 73 6f 20 77  a new cell, so w
bb60: 65 20 77 69 6c 6c 0a 2a 2a 20 61 6c 73 6f 20 65  e will.** also e
bb70: 6e 64 20 75 70 20 6e 65 65 64 69 6e 67 20 61 20  nd up needing a 
bb80: 6e 65 77 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  new cell pointer
bb90: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
bba0: 61 6c 6c 6f 63 61 74 65 53 70 61 63 65 28 4d 65  allocateSpace(Me
bbb0: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e  mPage *pPage, in
bbc0: 74 20 6e 42 79 74 65 2c 20 69 6e 74 20 2a 70 49  t nByte, int *pI
bbd0: 64 78 29 7b 0a 20 20 63 6f 6e 73 74 20 69 6e 74  dx){.  const int
bbe0: 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64   hdr = pPage->hd
bbf0: 72 4f 66 66 73 65 74 3b 20 20 20 20 2f 2a 20 4c  rOffset;    /* L
bc00: 6f 63 61 6c 20 63 61 63 68 65 20 6f 66 20 70 50  ocal cache of pP
bc10: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 20 2a  age->hdrOffset *
bc20: 2f 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 64  /.  u8 * const d
bc30: 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61  ata = pPage->aDa
bc40: 74 61 3b 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61  ta;      /* Loca
bc50: 6c 20 63 61 63 68 65 20 6f 66 20 70 50 61 67 65  l cache of pPage
bc60: 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20 69 6e 74  ->aData */.  int
bc70: 20 74 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20   top;           
bc80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bc90: 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20    /* First byte 
bca0: 6f 66 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  of cell content 
bcb0: 61 72 65 61 20 2a 2f 0a 20 20 69 6e 74 20 72 63  area */.  int rc
bcc0: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
bcd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
bce0: 2a 20 49 6e 74 65 67 65 72 20 72 65 74 75 72 6e  * Integer return
bcf0: 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 67   code */.  int g
bd00: 61 70 3b 20 20 20 20 20 20 20 20 2f 2a 20 46 69  ap;        /* Fi
bd10: 72 73 74 20 62 79 74 65 20 6f 66 20 67 61 70 20  rst byte of gap 
bd20: 62 65 74 77 65 65 6e 20 63 65 6c 6c 20 70 6f 69  between cell poi
bd30: 6e 74 65 72 73 20 61 6e 64 20 63 65 6c 6c 20 63  nters and cell c
bd40: 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 0a 20 20 61  ontent */.  .  a
bd50: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
bd60: 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
bd70: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
bd80: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
bd90: 65 2d 3e 70 42 74 20 29 3b 0a 20 20 61 73 73 65  e->pBt );.  asse
bda0: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
bdb0: 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
bdc0: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
bdd0: 73 73 65 72 74 28 20 6e 42 79 74 65 3e 3d 30 20  ssert( nByte>=0 
bde0: 29 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63  );  /* Minimum c
bdf0: 65 6c 6c 20 73 69 7a 65 20 69 73 20 34 20 2a 2f  ell size is 4 */
be00: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
be10: 2d 3e 6e 46 72 65 65 3e 3d 6e 42 79 74 65 20 29  ->nFree>=nByte )
be20: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
be30: 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20  e->nOverflow==0 
be40: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 42 79  );.  assert( nBy
be50: 74 65 20 3c 20 28 69 6e 74 29 28 70 50 61 67 65  te < (int)(pPage
be60: 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
be70: 65 2d 38 29 20 29 3b 0a 0a 20 20 61 73 73 65 72  e-8) );..  asser
be80: 74 28 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66  t( pPage->cellOf
be90: 66 73 65 74 20 3d 3d 20 68 64 72 20 2b 20 31 32  fset == hdr + 12
bea0: 20 2d 20 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66   - 4*pPage->leaf
beb0: 20 29 3b 0a 20 20 67 61 70 20 3d 20 70 50 61 67   );.  gap = pPag
bec0: 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20  e->cellOffset + 
bed0: 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a  2*pPage->nCell;.
bee0: 20 20 61 73 73 65 72 74 28 20 67 61 70 3c 3d 36    assert( gap<=6
bef0: 35 35 33 36 20 29 3b 0a 20 20 2f 2a 20 45 56 49  5536 );.  /* EVI
bf00: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 39 33 35  DENCE-OF: R-2935
bf10: 36 2d 30 32 33 39 31 20 49 66 20 74 68 65 20 64  6-02391 If the d
bf20: 61 74 61 62 61 73 65 20 75 73 65 73 20 61 20 36  atabase uses a 6
bf30: 35 35 33 36 2d 62 79 74 65 20 70 61 67 65 20 73  5536-byte page s
bf40: 69 7a 65 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65  ize.  ** and the
bf50: 20 72 65 73 65 72 76 65 64 20 73 70 61 63 65 20   reserved space 
bf60: 69 73 20 7a 65 72 6f 20 28 74 68 65 20 75 73 75  is zero (the usu
bf70: 61 6c 20 76 61 6c 75 65 20 66 6f 72 20 72 65 73  al value for res
bf80: 65 72 76 65 64 20 73 70 61 63 65 29 0a 20 20 2a  erved space).  *
bf90: 2a 20 74 68 65 6e 20 74 68 65 20 63 65 6c 6c 20  * then the cell 
bfa0: 63 6f 6e 74 65 6e 74 20 6f 66 66 73 65 74 20 6f  content offset o
bfb0: 66 20 61 6e 20 65 6d 70 74 79 20 70 61 67 65 20  f an empty page 
bfc0: 77 61 6e 74 73 20 74 6f 20 62 65 20 36 35 35 33  wants to be 6553
bfd0: 36 2e 0a 20 20 2a 2a 20 48 6f 77 65 76 65 72 2c  6..  ** However,
bfe0: 20 74 68 61 74 20 69 6e 74 65 67 65 72 20 69 73   that integer is
bff0: 20 74 6f 6f 20 6c 61 72 67 65 20 74 6f 20 62 65   too large to be
c000: 20 73 74 6f 72 65 64 20 69 6e 20 61 20 32 2d 62   stored in a 2-b
c010: 79 74 65 20 75 6e 73 69 67 6e 65 64 0a 20 20 2a  yte unsigned.  *
c020: 2a 20 69 6e 74 65 67 65 72 2c 20 73 6f 20 61 20  * integer, so a 
c030: 76 61 6c 75 65 20 6f 66 20 30 20 69 73 20 75 73  value of 0 is us
c040: 65 64 20 69 6e 20 69 74 73 20 70 6c 61 63 65 2e  ed in its place.
c050: 20 2a 2f 0a 20 20 74 6f 70 20 3d 20 67 65 74 32   */.  top = get2
c060: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
c070: 5d 29 3b 0a 20 20 61 73 73 65 72 74 28 20 74 6f  ]);.  assert( to
c080: 70 3c 3d 28 69 6e 74 29 70 50 61 67 65 2d 3e 70  p<=(int)pPage->p
c090: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29  Bt->usableSize )
c0a0: 3b 20 2f 2a 20 50 72 65 76 65 6e 74 20 62 79 20  ; /* Prevent by 
c0b0: 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28 29  getAndInitPage()
c0c0: 20 2a 2f 0a 20 20 69 66 28 20 67 61 70 3e 74 6f   */.  if( gap>to
c0d0: 70 20 29 7b 0a 20 20 20 20 69 66 28 20 74 6f 70  p ){.    if( top
c0e0: 3d 3d 30 20 26 26 20 70 50 61 67 65 2d 3e 70 42  ==0 && pPage->pB
c0f0: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3d 3d 36  t->usableSize==6
c100: 35 35 33 36 20 29 7b 0a 20 20 20 20 20 20 74 6f  5536 ){.      to
c110: 70 20 3d 20 36 35 35 33 36 3b 0a 20 20 20 20 7d  p = 65536;.    }
c120: 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 74 75  else{.      retu
c130: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
c140: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20  T_BKPT;.    }.  
c150: 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  }..  /* If there
c160: 20 69 73 20 65 6e 6f 75 67 68 20 73 70 61 63 65   is enough space
c170: 20 62 65 74 77 65 65 6e 20 67 61 70 20 61 6e 64   between gap and
c180: 20 74 6f 70 20 66 6f 72 20 6f 6e 65 20 6d 6f 72   top for one mor
c190: 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 0a 20  e cell pointer. 
c1a0: 20 2a 2a 20 61 72 72 61 79 20 65 6e 74 72 79 20   ** array entry 
c1b0: 6f 66 66 73 65 74 2c 20 61 6e 64 20 69 66 20 74  offset, and if t
c1c0: 68 65 20 66 72 65 65 6c 69 73 74 20 69 73 20 6e  he freelist is n
c1d0: 6f 74 20 65 6d 70 74 79 2c 20 74 68 65 6e 20 73  ot empty, then s
c1e0: 65 61 72 63 68 20 74 68 65 0a 20 20 2a 2a 20 66  earch the.  ** f
c1f0: 72 65 65 6c 69 73 74 20 6c 6f 6f 6b 69 6e 67 20  reelist looking 
c200: 66 6f 72 20 61 20 66 72 65 65 20 73 6c 6f 74 20  for a free slot 
c210: 62 69 67 20 65 6e 6f 75 67 68 20 74 6f 20 73 61  big enough to sa
c220: 74 69 73 66 79 20 74 68 65 20 72 65 71 75 65 73  tisfy the reques
c230: 74 2e 0a 20 20 2a 2f 0a 20 20 74 65 73 74 63 61  t..  */.  testca
c240: 73 65 28 20 67 61 70 2b 32 3d 3d 74 6f 70 20 29  se( gap+2==top )
c250: 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 67 61  ;.  testcase( ga
c260: 70 2b 31 3d 3d 74 6f 70 20 29 3b 0a 20 20 74 65  p+1==top );.  te
c270: 73 74 63 61 73 65 28 20 67 61 70 3d 3d 74 6f 70  stcase( gap==top
c280: 20 29 3b 0a 20 20 69 66 28 20 28 64 61 74 61 5b   );.  if( (data[
c290: 68 64 72 2b 32 5d 20 7c 7c 20 64 61 74 61 5b 68  hdr+2] || data[h
c2a0: 64 72 2b 31 5d 29 20 26 26 20 67 61 70 2b 32 3c  dr+1]) && gap+2<
c2b0: 3d 74 6f 70 20 29 7b 0a 20 20 20 20 75 38 20 2a  =top ){.    u8 *
c2c0: 70 53 70 61 63 65 20 3d 20 70 61 67 65 46 69 6e  pSpace = pageFin
c2d0: 64 53 6c 6f 74 28 70 50 61 67 65 2c 20 6e 42 79  dSlot(pPage, nBy
c2e0: 74 65 2c 20 26 72 63 29 3b 0a 20 20 20 20 69 66  te, &rc);.    if
c2f0: 28 20 70 53 70 61 63 65 20 29 7b 0a 20 20 20 20  ( pSpace ){.    
c300: 20 20 61 73 73 65 72 74 28 20 70 53 70 61 63 65    assert( pSpace
c310: 3e 3d 64 61 74 61 20 26 26 20 28 70 53 70 61 63  >=data && (pSpac
c320: 65 20 2d 20 64 61 74 61 29 3c 36 35 35 33 36 20  e - data)<65536 
c330: 29 3b 0a 20 20 20 20 20 20 2a 70 49 64 78 20 3d  );.      *pIdx =
c340: 20 28 69 6e 74 29 28 70 53 70 61 63 65 20 2d 20   (int)(pSpace - 
c350: 64 61 74 61 29 3b 0a 20 20 20 20 20 20 72 65 74  data);.      ret
c360: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
c370: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 20     }else if( rc 
c380: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
c390: 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  rc;.    }.  }.. 
c3a0: 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74 20   /* The request 
c3b0: 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 66 75 6c  could not be ful
c3c0: 66 69 6c 6c 65 64 20 75 73 69 6e 67 20 61 20 66  filled using a f
c3d0: 72 65 65 6c 69 73 74 20 73 6c 6f 74 2e 20 20 43  reelist slot.  C
c3e0: 68 65 63 6b 0a 20 20 2a 2a 20 74 6f 20 73 65 65  heck.  ** to see
c3f0: 20 69 66 20 64 65 66 72 61 67 6d 65 6e 74 61 74   if defragmentat
c400: 69 6f 6e 20 69 73 20 6e 65 63 65 73 73 61 72 79  ion is necessary
c410: 2e 0a 20 20 2a 2f 0a 20 20 74 65 73 74 63 61 73  ..  */.  testcas
c420: 65 28 20 67 61 70 2b 32 2b 6e 42 79 74 65 3d 3d  e( gap+2+nByte==
c430: 74 6f 70 20 29 3b 0a 20 20 69 66 28 20 67 61 70  top );.  if( gap
c440: 2b 32 2b 6e 42 79 74 65 3e 74 6f 70 20 29 7b 0a  +2+nByte>top ){.
c450: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
c460: 65 2d 3e 6e 43 65 6c 6c 3e 30 20 7c 7c 20 43 4f  e->nCell>0 || CO
c470: 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 20 20  RRUPT_DB );.    
c480: 72 63 20 3d 20 64 65 66 72 61 67 6d 65 6e 74 50  rc = defragmentP
c490: 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20  age(pPage);.    
c4a0: 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
c4b0: 72 63 3b 0a 20 20 20 20 74 6f 70 20 3d 20 67 65  rc;.    top = ge
c4c0: 74 32 62 79 74 65 4e 6f 74 5a 65 72 6f 28 26 64  t2byteNotZero(&d
c4d0: 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20  ata[hdr+5]);.   
c4e0: 20 61 73 73 65 72 74 28 20 67 61 70 2b 6e 42 79   assert( gap+nBy
c4f0: 74 65 3c 3d 74 6f 70 20 29 3b 0a 20 20 7d 0a 0a  te<=top );.  }..
c500: 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 6d  .  /* Allocate m
c510: 65 6d 6f 72 79 20 66 72 6f 6d 20 74 68 65 20 67  emory from the g
c520: 61 70 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68  ap in between th
c530: 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61  e cell pointer a
c540: 72 72 61 79 0a 20 20 2a 2a 20 61 6e 64 20 74 68  rray.  ** and th
c550: 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61  e cell content a
c560: 72 65 61 2e 20 20 54 68 65 20 62 74 72 65 65 49  rea.  The btreeI
c570: 6e 69 74 50 61 67 65 28 29 20 63 61 6c 6c 20 68  nitPage() call h
c580: 61 73 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20  as already.  ** 
c590: 76 61 6c 69 64 61 74 65 64 20 74 68 65 20 66 72  validated the fr
c5a0: 65 65 6c 69 73 74 2e 20 20 47 69 76 65 6e 20 74  eelist.  Given t
c5b0: 68 61 74 20 74 68 65 20 66 72 65 65 6c 69 73 74  hat the freelist
c5c0: 20 69 73 20 76 61 6c 69 64 2c 20 74 68 65 72 65   is valid, there
c5d0: 0a 20 20 2a 2a 20 69 73 20 6e 6f 20 77 61 79 20  .  ** is no way 
c5e0: 74 68 61 74 20 74 68 65 20 61 6c 6c 6f 63 61 74  that the allocat
c5f0: 69 6f 6e 20 63 61 6e 20 65 78 74 65 6e 64 20 6f  ion can extend o
c600: 66 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  ff the end of th
c610: 65 20 70 61 67 65 2e 0a 20 20 2a 2a 20 54 68 65  e page..  ** The
c620: 20 61 73 73 65 72 74 28 29 20 62 65 6c 6f 77 20   assert() below 
c630: 76 65 72 69 66 69 65 73 20 74 68 65 20 70 72 65  verifies the pre
c640: 76 69 6f 75 73 20 73 65 6e 74 65 6e 63 65 2e 0a  vious sentence..
c650: 20 20 2a 2f 0a 20 20 74 6f 70 20 2d 3d 20 6e 42    */.  top -= nB
c660: 79 74 65 3b 0a 20 20 70 75 74 32 62 79 74 65 28  yte;.  put2byte(
c670: 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 74 6f  &data[hdr+5], to
c680: 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 74 6f  p);.  assert( to
c690: 70 2b 6e 42 79 74 65 20 3c 3d 20 28 69 6e 74 29  p+nByte <= (int)
c6a0: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
c6b0: 6c 65 53 69 7a 65 20 29 3b 0a 20 20 2a 70 49 64  leSize );.  *pId
c6c0: 78 20 3d 20 74 6f 70 3b 0a 20 20 72 65 74 75 72  x = top;.  retur
c6d0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
c6e0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 73  /*.** Return a s
c6f0: 65 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 50  ection of the pP
c700: 61 67 65 2d 3e 61 44 61 74 61 20 74 6f 20 74 68  age->aData to th
c710: 65 20 66 72 65 65 6c 69 73 74 2e 0a 2a 2a 20 54  e freelist..** T
c720: 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66  he first byte of
c730: 20 74 68 65 20 6e 65 77 20 66 72 65 65 20 62 6c   the new free bl
c740: 6f 63 6b 20 69 73 20 70 50 61 67 65 2d 3e 61 44  ock is pPage->aD
c750: 61 74 61 5b 69 53 74 61 72 74 5d 0a 2a 2a 20 61  ata[iStart].** a
c760: 6e 64 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  nd the size of t
c770: 68 65 20 62 6c 6f 63 6b 20 69 73 20 69 53 69 7a  he block is iSiz
c780: 65 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 41  e bytes..**.** A
c790: 64 6a 61 63 65 6e 74 20 66 72 65 65 62 6c 6f 63  djacent freebloc
c7a0: 6b 73 20 61 72 65 20 63 6f 61 6c 65 73 63 65 64  ks are coalesced
c7b0: 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61  ..**.** Note tha
c7c0: 74 20 65 76 65 6e 20 74 68 6f 75 67 68 20 74 68  t even though th
c7d0: 65 20 66 72 65 65 62 6c 6f 63 6b 20 6c 69 73 74  e freeblock list
c7e0: 20 77 61 73 20 63 68 65 63 6b 65 64 20 62 79 20   was checked by 
c7f0: 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 2c  btreeInitPage(),
c800: 0a 2a 2a 20 74 68 61 74 20 72 6f 75 74 69 6e 65  .** that routine
c810: 20 77 69 6c 6c 20 6e 6f 74 20 64 65 74 65 63 74   will not detect
c820: 20 6f 76 65 72 6c 61 70 20 62 65 74 77 65 65 6e   overlap between
c830: 20 63 65 6c 6c 73 20 6f 72 20 66 72 65 65 62 6c   cells or freebl
c840: 6f 63 6b 73 2e 20 20 4e 6f 72 0a 2a 2a 20 64 6f  ocks.  Nor.** do
c850: 65 73 20 69 74 20 64 65 74 65 63 74 20 63 65 6c  es it detect cel
c860: 6c 73 20 6f 72 20 66 72 65 65 62 6c 6f 63 6b 73  ls or freeblocks
c870: 20 74 68 61 74 20 65 6e 63 72 6f 75 63 68 20 69   that encrouch i
c880: 6e 74 6f 20 74 68 65 20 72 65 73 65 72 76 65 64  nto the reserved
c890: 20 62 79 74 65 73 0a 2a 2a 20 61 74 20 74 68 65   bytes.** at the
c8a0: 20 65 6e 64 20 6f 66 20 74 68 65 20 70 61 67 65   end of the page
c8b0: 2e 20 20 53 6f 20 64 6f 20 61 64 64 69 74 69 6f  .  So do additio
c8c0: 6e 61 6c 20 63 6f 72 72 75 70 74 69 6f 6e 20 63  nal corruption c
c8d0: 68 65 63 6b 73 20 69 6e 73 69 64 65 20 74 68 69  hecks inside thi
c8e0: 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 61 6e 64  s.** routine and
c8f0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
c900: 4f 52 52 55 50 54 20 69 66 20 61 6e 79 20 70 72  ORRUPT if any pr
c910: 6f 62 6c 65 6d 73 20 61 72 65 20 66 6f 75 6e 64  oblems are found
c920: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
c930: 66 72 65 65 53 70 61 63 65 28 4d 65 6d 50 61 67  freeSpace(MemPag
c940: 65 20 2a 70 50 61 67 65 2c 20 75 31 36 20 69 53  e *pPage, u16 iS
c950: 74 61 72 74 2c 20 75 31 36 20 69 53 69 7a 65 29  tart, u16 iSize)
c960: 7b 0a 20 20 75 31 36 20 69 50 74 72 3b 20 20 20  {.  u16 iPtr;   
c970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c980: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
c990: 72 65 73 73 20 6f 66 20 70 74 72 20 74 6f 20 6e  ress of ptr to n
c9a0: 65 78 74 20 66 72 65 65 62 6c 6f 63 6b 20 2a 2f  ext freeblock */
c9b0: 0a 20 20 75 31 36 20 69 46 72 65 65 42 6c 6b 3b  .  u16 iFreeBlk;
c9c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c9d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
c9e0: 65 73 73 20 6f 66 20 74 68 65 20 6e 65 78 74 20  ess of the next 
c9f0: 66 72 65 65 62 6c 6f 63 6b 20 2a 2f 0a 20 20 75  freeblock */.  u
ca00: 38 20 68 64 72 3b 20 20 20 20 20 20 20 20 20 20  8 hdr;          
ca10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ca20: 20 20 20 20 20 2f 2a 20 50 61 67 65 20 68 65 61       /* Page hea
ca30: 64 65 72 20 73 69 7a 65 2e 20 20 30 20 6f 72 20  der size.  0 or 
ca40: 31 30 30 20 2a 2f 0a 20 20 75 38 20 6e 46 72 61  100 */.  u8 nFra
ca50: 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  g = 0;          
ca60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
ca70: 2a 20 52 65 64 75 63 74 69 6f 6e 20 69 6e 20 66  * Reduction in f
ca80: 72 61 67 6d 65 6e 74 61 74 69 6f 6e 20 2a 2f 0a  ragmentation */.
ca90: 20 20 75 31 36 20 69 4f 72 69 67 53 69 7a 65 20    u16 iOrigSize 
caa0: 3d 20 69 53 69 7a 65 3b 20 20 20 20 20 20 20 20  = iSize;        
cab0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69          /* Origi
cac0: 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 69 53 69  nal value of iSi
cad0: 7a 65 20 2a 2f 0a 20 20 75 33 32 20 69 4c 61 73  ze */.  u32 iLas
cae0: 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e  t = pPage->pBt->
caf0: 75 73 61 62 6c 65 53 69 7a 65 2d 34 3b 20 2f 2a  usableSize-4; /*
cb00: 20 4c 61 72 67 65 73 74 20 70 6f 73 73 69 62 6c   Largest possibl
cb10: 65 20 66 72 65 65 62 6c 6f 63 6b 20 6f 66 66 73  e freeblock offs
cb20: 65 74 20 2a 2f 0a 20 20 75 33 32 20 69 45 6e 64  et */.  u32 iEnd
cb30: 20 3d 20 69 53 74 61 72 74 20 2b 20 69 53 69 7a   = iStart + iSiz
cb40: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
cb50: 20 46 69 72 73 74 20 62 79 74 65 20 70 61 73 74   First byte past
cb60: 20 74 68 65 20 69 53 74 61 72 74 20 62 75 66 66   the iStart buff
cb70: 65 72 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  er */.  unsigned
cb80: 20 63 68 61 72 20 2a 64 61 74 61 20 3d 20 70 50   char *data = pP
cb90: 61 67 65 2d 3e 61 44 61 74 61 3b 20 20 20 2f 2a  age->aData;   /*
cba0: 20 50 61 67 65 20 63 6f 6e 74 65 6e 74 20 2a 2f   Page content */
cbb0: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
cbc0: 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20 61  e->pBt!=0 );.  a
cbd0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
cbe0: 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
cbf0: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
cc00: 3b 0a 20 20 61 73 73 65 72 74 28 20 43 4f 52 52  ;.  assert( CORR
cc10: 55 50 54 5f 44 42 20 7c 7c 20 69 53 74 61 72 74  UPT_DB || iStart
cc20: 3e 3d 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  >=pPage->hdrOffs
cc30: 65 74 2b 36 2b 70 50 61 67 65 2d 3e 63 68 69 6c  et+6+pPage->chil
cc40: 64 50 74 72 53 69 7a 65 20 29 3b 0a 20 20 61 73  dPtrSize );.  as
cc50: 73 65 72 74 28 20 43 4f 52 52 55 50 54 5f 44 42  sert( CORRUPT_DB
cc60: 20 7c 7c 20 69 45 6e 64 20 3c 3d 20 70 50 61 67   || iEnd <= pPag
cc70: 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
cc80: 7a 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ze );.  assert( 
cc90: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
cca0: 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
ccb0: 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
ccc0: 74 28 20 69 53 69 7a 65 3e 3d 34 20 29 3b 20 20  t( iSize>=4 );  
ccd0: 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c   /* Minimum cell
cce0: 20 73 69 7a 65 20 69 73 20 34 20 2a 2f 0a 20 20   size is 4 */.  
ccf0: 61 73 73 65 72 74 28 20 69 53 74 61 72 74 3c 3d  assert( iStart<=
cd00: 69 4c 61 73 74 20 29 3b 0a 0a 20 20 2f 2a 20 4f  iLast );..  /* O
cd10: 76 65 72 77 72 69 74 65 20 64 65 6c 65 74 65 64  verwrite deleted
cd20: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 69 74   information wit
cd30: 68 20 7a 65 72 6f 73 20 77 68 65 6e 20 74 68 65  h zeros when the
cd40: 20 73 65 63 75 72 65 5f 64 65 6c 65 74 65 0a 20   secure_delete. 
cd50: 20 2a 2a 20 6f 70 74 69 6f 6e 20 69 73 20 65 6e   ** option is en
cd60: 61 62 6c 65 64 20 2a 2f 0a 20 20 69 66 28 20 70  abled */.  if( p
cd70: 50 61 67 65 2d 3e 70 42 74 2d 3e 62 74 73 46 6c  Page->pBt->btsFl
cd80: 61 67 73 20 26 20 42 54 53 5f 53 45 43 55 52 45  ags & BTS_SECURE
cd90: 5f 44 45 4c 45 54 45 20 29 7b 0a 20 20 20 20 6d  _DELETE ){.    m
cda0: 65 6d 73 65 74 28 26 64 61 74 61 5b 69 53 74 61  emset(&data[iSta
cdb0: 72 74 5d 2c 20 30 2c 20 69 53 69 7a 65 29 3b 0a  rt], 0, iSize);.
cdc0: 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 6c 69    }..  /* The li
cdd0: 73 74 20 6f 66 20 66 72 65 65 62 6c 6f 63 6b 73  st of freeblocks
cde0: 20 6d 75 73 74 20 62 65 20 69 6e 20 61 73 63 65   must be in asce
cdf0: 6e 64 69 6e 67 20 6f 72 64 65 72 2e 20 20 46 69  nding order.  Fi
ce00: 6e 64 20 74 68 65 20 0a 20 20 2a 2a 20 73 70 6f  nd the .  ** spo
ce10: 74 20 6f 6e 20 74 68 65 20 6c 69 73 74 20 77 68  t on the list wh
ce20: 65 72 65 20 69 53 74 61 72 74 20 73 68 6f 75 6c  ere iStart shoul
ce30: 64 20 62 65 20 69 6e 73 65 72 74 65 64 2e 0a 20  d be inserted.. 
ce40: 20 2a 2f 0a 20 20 68 64 72 20 3d 20 70 50 61 67   */.  hdr = pPag
ce50: 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20  e->hdrOffset;.  
ce60: 69 50 74 72 20 3d 20 68 64 72 20 2b 20 31 3b 0a  iPtr = hdr + 1;.
ce70: 20 20 69 66 28 20 64 61 74 61 5b 69 50 74 72 2b    if( data[iPtr+
ce80: 31 5d 3d 3d 30 20 26 26 20 64 61 74 61 5b 69 50  1]==0 && data[iP
ce90: 74 72 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 69 46  tr]==0 ){.    iF
cea0: 72 65 65 42 6c 6b 20 3d 20 30 3b 20 20 2f 2a 20  reeBlk = 0;  /* 
ceb0: 53 68 6f 72 74 63 75 74 20 66 6f 72 20 74 68 65  Shortcut for the
cec0: 20 63 61 73 65 20 77 68 65 6e 20 74 68 65 20 66   case when the f
ced0: 72 65 65 6c 69 73 74 20 69 73 20 65 6d 70 74 79  reelist is empty
cee0: 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   */.  }else{.   
cef0: 20 77 68 69 6c 65 28 20 28 69 46 72 65 65 42 6c   while( (iFreeBl
cf00: 6b 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  k = get2byte(&da
cf10: 74 61 5b 69 50 74 72 5d 29 29 3e 30 20 26 26 20  ta[iPtr]))>0 && 
cf20: 69 46 72 65 65 42 6c 6b 3c 69 53 74 61 72 74 20  iFreeBlk<iStart 
cf30: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 46 72  ){.      if( iFr
cf40: 65 65 42 6c 6b 3c 69 50 74 72 2b 34 20 29 20 72  eeBlk<iPtr+4 ) r
cf50: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
cf60: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
cf70: 20 69 50 74 72 20 3d 20 69 46 72 65 65 42 6c 6b   iPtr = iFreeBlk
cf80: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
cf90: 69 46 72 65 65 42 6c 6b 3e 69 4c 61 73 74 20 29  iFreeBlk>iLast )
cfa0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
cfb0: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
cfc0: 20 61 73 73 65 72 74 28 20 69 46 72 65 65 42 6c   assert( iFreeBl
cfd0: 6b 3e 69 50 74 72 20 7c 7c 20 69 46 72 65 65 42  k>iPtr || iFreeB
cfe0: 6c 6b 3d 3d 30 20 29 3b 0a 20 20 0a 20 20 20 20  lk==0 );.  .    
cff0: 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74  /* At this point
d000: 3a 0a 20 20 20 20 2a 2a 20 20 20 20 69 46 72 65  :.    **    iFre
d010: 65 42 6c 6b 3a 20 20 20 46 69 72 73 74 20 66 72  eBlk:   First fr
d020: 65 65 62 6c 6f 63 6b 20 61 66 74 65 72 20 69 53  eeblock after iS
d030: 74 61 72 74 2c 20 6f 72 20 7a 65 72 6f 20 69 66  tart, or zero if
d040: 20 6e 6f 6e 65 0a 20 20 20 20 2a 2a 20 20 20 20   none.    **    
d050: 69 50 74 72 3a 20 20 20 20 20 20 20 54 68 65 20  iPtr:       The 
d060: 61 64 64 72 65 73 73 20 6f 66 20 61 20 70 6f 69  address of a poi
d070: 6e 74 65 72 20 74 6f 20 69 46 72 65 65 42 6c 6b  nter to iFreeBlk
d080: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43  .    **.    ** C
d090: 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 69  heck to see if i
d0a0: 46 72 65 65 42 6c 6b 20 73 68 6f 75 6c 64 20 62  FreeBlk should b
d0b0: 65 20 63 6f 61 6c 65 73 63 65 64 20 6f 6e 74 6f  e coalesced onto
d0c0: 20 74 68 65 20 65 6e 64 20 6f 66 20 69 53 74 61   the end of iSta
d0d0: 72 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  rt..    */.    i
d0e0: 66 28 20 69 46 72 65 65 42 6c 6b 20 26 26 20 69  f( iFreeBlk && i
d0f0: 45 6e 64 2b 33 3e 3d 69 46 72 65 65 42 6c 6b 20  End+3>=iFreeBlk 
d100: 29 7b 0a 20 20 20 20 20 20 6e 46 72 61 67 20 3d  ){.      nFrag =
d110: 20 69 46 72 65 65 42 6c 6b 20 2d 20 69 45 6e 64   iFreeBlk - iEnd
d120: 3b 0a 20 20 20 20 20 20 69 66 28 20 69 45 6e 64  ;.      if( iEnd
d130: 3e 69 46 72 65 65 42 6c 6b 20 29 20 72 65 74 75  >iFreeBlk ) retu
d140: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
d150: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 69 45  T_BKPT;.      iE
d160: 6e 64 20 3d 20 69 46 72 65 65 42 6c 6b 20 2b 20  nd = iFreeBlk + 
d170: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 69  get2byte(&data[i
d180: 46 72 65 65 42 6c 6b 2b 32 5d 29 3b 0a 20 20 20  FreeBlk+2]);.   
d190: 20 20 20 69 66 28 20 69 45 6e 64 20 3e 20 70 50     if( iEnd > pP
d1a0: 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
d1b0: 53 69 7a 65 20 29 20 72 65 74 75 72 6e 20 53 51  Size ) return SQ
d1c0: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
d1d0: 54 3b 0a 20 20 20 20 20 20 69 53 69 7a 65 20 3d  T;.      iSize =
d1e0: 20 69 45 6e 64 20 2d 20 69 53 74 61 72 74 3b 0a   iEnd - iStart;.
d1f0: 20 20 20 20 20 20 69 46 72 65 65 42 6c 6b 20 3d        iFreeBlk =
d200: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
d210: 69 46 72 65 65 42 6c 6b 5d 29 3b 0a 20 20 20 20  iFreeBlk]);.    
d220: 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 69  }.  .    /* If i
d230: 50 74 72 20 69 73 20 61 6e 6f 74 68 65 72 20 66  Ptr is another f
d240: 72 65 65 62 6c 6f 63 6b 20 28 74 68 61 74 20 69  reeblock (that i
d250: 73 2c 20 69 66 20 69 50 74 72 20 69 73 20 6e 6f  s, if iPtr is no
d260: 74 20 74 68 65 20 66 72 65 65 6c 69 73 74 0a 20  t the freelist. 
d270: 20 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20 69 6e     ** pointer in
d280: 20 74 68 65 20 70 61 67 65 20 68 65 61 64 65 72   the page header
d290: 29 20 74 68 65 6e 20 63 68 65 63 6b 20 74 6f 20  ) then check to 
d2a0: 73 65 65 20 69 66 20 69 53 74 61 72 74 20 73 68  see if iStart sh
d2b0: 6f 75 6c 64 20 62 65 0a 20 20 20 20 2a 2a 20 63  ould be.    ** c
d2c0: 6f 61 6c 65 73 63 65 64 20 6f 6e 74 6f 20 74 68  oalesced onto th
d2d0: 65 20 65 6e 64 20 6f 66 20 69 50 74 72 2e 0a 20  e end of iPtr.. 
d2e0: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 50     */.    if( iP
d2f0: 74 72 3e 68 64 72 2b 31 20 29 7b 0a 20 20 20 20  tr>hdr+1 ){.    
d300: 20 20 69 6e 74 20 69 50 74 72 45 6e 64 20 3d 20    int iPtrEnd = 
d310: 69 50 74 72 20 2b 20 67 65 74 32 62 79 74 65 28  iPtr + get2byte(
d320: 26 64 61 74 61 5b 69 50 74 72 2b 32 5d 29 3b 0a  &data[iPtr+2]);.
d330: 20 20 20 20 20 20 69 66 28 20 69 50 74 72 45 6e        if( iPtrEn
d340: 64 2b 33 3e 3d 69 53 74 61 72 74 20 29 7b 0a 20  d+3>=iStart ){. 
d350: 20 20 20 20 20 20 20 69 66 28 20 69 50 74 72 45         if( iPtrE
d360: 6e 64 3e 69 53 74 61 72 74 20 29 20 72 65 74 75  nd>iStart ) retu
d370: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
d380: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20  T_BKPT;.        
d390: 6e 46 72 61 67 20 2b 3d 20 69 53 74 61 72 74 20  nFrag += iStart 
d3a0: 2d 20 69 50 74 72 45 6e 64 3b 0a 20 20 20 20 20  - iPtrEnd;.     
d3b0: 20 20 20 69 53 69 7a 65 20 3d 20 69 45 6e 64 20     iSize = iEnd 
d3c0: 2d 20 69 50 74 72 3b 0a 20 20 20 20 20 20 20 20  - iPtr;.        
d3d0: 69 53 74 61 72 74 20 3d 20 69 50 74 72 3b 0a 20  iStart = iPtr;. 
d3e0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
d3f0: 20 69 66 28 20 6e 46 72 61 67 3e 64 61 74 61 5b   if( nFrag>data[
d400: 68 64 72 2b 37 5d 20 29 20 72 65 74 75 72 6e 20  hdr+7] ) return 
d410: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
d420: 4b 50 54 3b 0a 20 20 20 20 64 61 74 61 5b 68 64  KPT;.    data[hd
d430: 72 2b 37 5d 20 2d 3d 20 6e 46 72 61 67 3b 0a 20  r+7] -= nFrag;. 
d440: 20 7d 0a 20 20 69 66 28 20 69 53 74 61 72 74 3d   }.  if( iStart=
d450: 3d 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b  =get2byte(&data[
d460: 68 64 72 2b 35 5d 29 20 29 7b 0a 20 20 20 20 2f  hdr+5]) ){.    /
d470: 2a 20 54 68 65 20 6e 65 77 20 66 72 65 65 62 6c  * The new freebl
d480: 6f 63 6b 20 69 73 20 61 74 20 74 68 65 20 62 65  ock is at the be
d490: 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 63  ginning of the c
d4a0: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
d4b0: 2c 0a 20 20 20 20 2a 2a 20 73 6f 20 6a 75 73 74  ,.    ** so just
d4c0: 20 65 78 74 65 6e 64 20 74 68 65 20 63 65 6c 6c   extend the cell
d4d0: 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 72 61   content area ra
d4e0: 74 68 65 72 20 74 68 61 6e 20 63 72 65 61 74 65  ther than create
d4f0: 20 61 6e 6f 74 68 65 72 0a 20 20 20 20 2a 2a 20   another.    ** 
d500: 66 72 65 65 6c 69 73 74 20 65 6e 74 72 79 20 2a  freelist entry *
d510: 2f 0a 20 20 20 20 69 66 28 20 69 50 74 72 21 3d  /.    if( iPtr!=
d520: 68 64 72 2b 31 20 29 20 72 65 74 75 72 6e 20 53  hdr+1 ) return S
d530: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
d540: 50 54 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65  PT;.    put2byte
d550: 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 2c 20 69  (&data[hdr+1], i
d560: 46 72 65 65 42 6c 6b 29 3b 0a 20 20 20 20 70 75  FreeBlk);.    pu
d570: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
d580: 2b 35 5d 2c 20 69 45 6e 64 29 3b 0a 20 20 7d 65  +5], iEnd);.  }e
d590: 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 6e 73 65  lse{.    /* Inse
d5a0: 72 74 20 74 68 65 20 6e 65 77 20 66 72 65 65 62  rt the new freeb
d5b0: 6c 6f 63 6b 20 69 6e 74 6f 20 74 68 65 20 66 72  lock into the fr
d5c0: 65 65 6c 69 73 74 20 2a 2f 0a 20 20 20 20 70 75  eelist */.    pu
d5d0: 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 50 74  t2byte(&data[iPt
d5e0: 72 5d 2c 20 69 53 74 61 72 74 29 3b 0a 20 20 20  r], iStart);.   
d5f0: 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
d600: 69 53 74 61 72 74 5d 2c 20 69 46 72 65 65 42 6c  iStart], iFreeBl
d610: 6b 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65  k);.    put2byte
d620: 28 26 64 61 74 61 5b 69 53 74 61 72 74 2b 32 5d  (&data[iStart+2]
d630: 2c 20 69 53 69 7a 65 29 3b 0a 20 20 7d 0a 20 20  , iSize);.  }.  
d640: 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2b 3d 20  pPage->nFree += 
d650: 69 4f 72 69 67 53 69 7a 65 3b 0a 20 20 72 65 74  iOrigSize;.  ret
d660: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
d670: 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6f 64 65 20 74  ../*.** Decode t
d680: 68 65 20 66 6c 61 67 73 20 62 79 74 65 20 28 74  he flags byte (t
d690: 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66  he first byte of
d6a0: 20 74 68 65 20 68 65 61 64 65 72 29 20 66 6f 72   the header) for
d6b0: 20 61 20 70 61 67 65 0a 2a 2a 20 61 6e 64 20 69   a page.** and i
d6c0: 6e 69 74 69 61 6c 69 7a 65 20 66 69 65 6c 64 73  nitialize fields
d6d0: 20 6f 66 20 74 68 65 20 4d 65 6d 50 61 67 65 20   of the MemPage 
d6e0: 73 74 72 75 63 74 75 72 65 20 61 63 63 6f 72 64  structure accord
d6f0: 69 6e 67 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c  ingly..**.** Onl
d700: 79 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  y the following 
d710: 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 61 72 65  combinations are
d720: 20 73 75 70 70 6f 72 74 65 64 2e 20 20 41 6e 79   supported.  Any
d730: 74 68 69 6e 67 20 64 69 66 66 65 72 65 6e 74 0a  thing different.
d740: 2a 2a 20 69 6e 64 69 63 61 74 65 73 20 61 20 63  ** indicates a c
d750: 6f 72 72 75 70 74 20 64 61 74 61 62 61 73 65 20  orrupt database 
d760: 66 69 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  files:.**.**    
d770: 20 20 20 20 20 50 54 46 5f 5a 45 52 4f 44 41 54       PTF_ZERODAT
d780: 41 0a 2a 2a 20 20 20 20 20 20 20 20 20 50 54 46  A.**         PTF
d790: 5f 5a 45 52 4f 44 41 54 41 20 7c 20 50 54 46 5f  _ZERODATA | PTF_
d7a0: 4c 45 41 46 0a 2a 2a 20 20 20 20 20 20 20 20 20  LEAF.**         
d7b0: 50 54 46 5f 4c 45 41 46 44 41 54 41 20 7c 20 50  PTF_LEAFDATA | P
d7c0: 54 46 5f 49 4e 54 4b 45 59 0a 2a 2a 20 20 20 20  TF_INTKEY.**    
d7d0: 20 20 20 20 20 50 54 46 5f 4c 45 41 46 44 41 54       PTF_LEAFDAT
d7e0: 41 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59 20 7c  A | PTF_INTKEY |
d7f0: 20 50 54 46 5f 4c 45 41 46 0a 2a 2f 0a 73 74 61   PTF_LEAF.*/.sta
d800: 74 69 63 20 69 6e 74 20 64 65 63 6f 64 65 46 6c  tic int decodeFl
d810: 61 67 73 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  ags(MemPage *pPa
d820: 67 65 2c 20 69 6e 74 20 66 6c 61 67 42 79 74 65  ge, int flagByte
d830: 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
d840: 42 74 3b 20 20 20 20 20 2f 2a 20 41 20 63 6f 70  Bt;     /* A cop
d850: 79 20 6f 66 20 70 50 61 67 65 2d 3e 70 42 74 20  y of pPage->pBt 
d860: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  */..  assert( pP
d870: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3d 3d  age->hdrOffset==
d880: 28 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 31 20  (pPage->pgno==1 
d890: 3f 20 31 30 30 20 3a 20 30 29 20 29 3b 0a 20 20  ? 100 : 0) );.  
d8a0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
d8b0: 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
d8c0: 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
d8d0: 0a 20 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 3d  .  pPage->leaf =
d8e0: 20 28 75 38 29 28 66 6c 61 67 42 79 74 65 3e 3e   (u8)(flagByte>>
d8f0: 33 29 3b 20 20 61 73 73 65 72 74 28 20 50 54 46  3);  assert( PTF
d900: 5f 4c 45 41 46 20 3d 3d 20 31 3c 3c 33 20 29 3b  _LEAF == 1<<3 );
d910: 0a 20 20 66 6c 61 67 42 79 74 65 20 26 3d 20 7e  .  flagByte &= ~
d920: 50 54 46 5f 4c 45 41 46 3b 0a 20 20 70 50 61 67  PTF_LEAF;.  pPag
d930: 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 20  e->childPtrSize 
d940: 3d 20 34 2d 34 2a 70 50 61 67 65 2d 3e 6c 65 61  = 4-4*pPage->lea
d950: 66 3b 0a 20 20 70 50 61 67 65 2d 3e 78 43 65 6c  f;.  pPage->xCel
d960: 6c 53 69 7a 65 20 3d 20 63 65 6c 6c 53 69 7a 65  lSize = cellSize
d970: 50 74 72 3b 0a 20 20 70 42 74 20 3d 20 70 50 61  Ptr;.  pBt = pPa
d980: 67 65 2d 3e 70 42 74 3b 0a 20 20 69 66 28 20 66  ge->pBt;.  if( f
d990: 6c 61 67 42 79 74 65 3d 3d 28 50 54 46 5f 4c 45  lagByte==(PTF_LE
d9a0: 41 46 44 41 54 41 20 7c 20 50 54 46 5f 49 4e 54  AFDATA | PTF_INT
d9b0: 4b 45 59 29 20 29 7b 0a 20 20 20 20 2f 2a 20 45  KEY) ){.    /* E
d9c0: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 33  VIDENCE-OF: R-03
d9d0: 36 34 30 2d 31 33 34 31 35 20 41 20 76 61 6c 75  640-13415 A valu
d9e0: 65 20 6f 66 20 35 20 6d 65 61 6e 73 20 74 68 65  e of 5 means the
d9f0: 20 70 61 67 65 20 69 73 20 61 6e 20 69 6e 74 65   page is an inte
da00: 72 69 6f 72 0a 20 20 20 20 2a 2a 20 74 61 62 6c  rior.    ** tabl
da10: 65 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20 2a  e b-tree page. *
da20: 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 50  /.    assert( (P
da30: 54 46 5f 4c 45 41 46 44 41 54 41 7c 50 54 46 5f  TF_LEAFDATA|PTF_
da40: 49 4e 54 4b 45 59 29 3d 3d 35 20 29 3b 0a 20 20  INTKEY)==5 );.  
da50: 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
da60: 3a 20 52 2d 32 30 35 30 31 2d 36 31 37 39 36 20  : R-20501-61796 
da70: 41 20 76 61 6c 75 65 20 6f 66 20 31 33 20 6d 65  A value of 13 me
da80: 61 6e 73 20 74 68 65 20 70 61 67 65 20 69 73 20  ans the page is 
da90: 61 20 6c 65 61 66 0a 20 20 20 20 2a 2a 20 74 61  a leaf.    ** ta
daa0: 62 6c 65 20 62 2d 74 72 65 65 20 70 61 67 65 2e  ble b-tree page.
dab0: 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
dac0: 28 50 54 46 5f 4c 45 41 46 44 41 54 41 7c 50 54  (PTF_LEAFDATA|PT
dad0: 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41  F_INTKEY|PTF_LEA
dae0: 46 29 3d 3d 31 33 20 29 3b 0a 20 20 20 20 70 50  F)==13 );.    pP
daf0: 61 67 65 2d 3e 69 6e 74 4b 65 79 20 3d 20 31 3b  age->intKey = 1;
db00: 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e  .    if( pPage->
db10: 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 70 50  leaf ){.      pP
db20: 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20  age->intKeyLeaf 
db30: 3d 20 31 3b 0a 20 20 20 20 20 20 70 50 61 67 65  = 1;.      pPage
db40: 2d 3e 6e 6f 50 61 79 6c 6f 61 64 20 3d 20 30 3b  ->noPayload = 0;
db50: 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e 78 50  .      pPage->xP
db60: 61 72 73 65 43 65 6c 6c 20 3d 20 62 74 72 65 65  arseCell = btree
db70: 50 61 72 73 65 43 65 6c 6c 50 74 72 3b 0a 20 20  ParseCellPtr;.  
db80: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
db90: 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66  Page->intKeyLeaf
dba0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67   = 0;.      pPag
dbb0: 65 2d 3e 6e 6f 50 61 79 6c 6f 61 64 20 3d 20 31  e->noPayload = 1
dbc0: 3b 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e 78  ;.      pPage->x
dbd0: 43 65 6c 6c 53 69 7a 65 20 3d 20 63 65 6c 6c 53  CellSize = cellS
dbe0: 69 7a 65 50 74 72 4e 6f 50 61 79 6c 6f 61 64 3b  izePtrNoPayload;
dbf0: 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e 78 50  .      pPage->xP
dc00: 61 72 73 65 43 65 6c 6c 20 3d 20 62 74 72 65 65  arseCell = btree
dc10: 50 61 72 73 65 43 65 6c 6c 50 74 72 4e 6f 50 61  ParseCellPtrNoPa
dc20: 79 6c 6f 61 64 3b 0a 20 20 20 20 7d 0a 20 20 20  yload;.    }.   
dc30: 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c   pPage->maxLocal
dc40: 20 3d 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66 3b   = pBt->maxLeaf;
dc50: 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 69 6e 4c  .    pPage->minL
dc60: 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e 4c  ocal = pBt->minL
dc70: 65 61 66 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  eaf;.  }else if(
dc80: 20 66 6c 61 67 42 79 74 65 3d 3d 50 54 46 5f 5a   flagByte==PTF_Z
dc90: 45 52 4f 44 41 54 41 20 29 7b 0a 20 20 20 20 2f  ERODATA ){.    /
dca0: 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
dcb0: 2d 32 37 32 32 35 2d 35 33 39 33 36 20 41 20 76  -27225-53936 A v
dcc0: 61 6c 75 65 20 6f 66 20 32 20 6d 65 61 6e 73 20  alue of 2 means 
dcd0: 74 68 65 20 70 61 67 65 20 69 73 20 61 6e 20 69  the page is an i
dce0: 6e 74 65 72 69 6f 72 0a 20 20 20 20 2a 2a 20 69  nterior.    ** i
dcf0: 6e 64 65 78 20 62 2d 74 72 65 65 20 70 61 67 65  ndex b-tree page
dd00: 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  . */.    assert(
dd10: 20 28 50 54 46 5f 5a 45 52 4f 44 41 54 41 29 3d   (PTF_ZERODATA)=
dd20: 3d 32 20 29 3b 0a 20 20 20 20 2f 2a 20 45 56 49  =2 );.    /* EVI
dd30: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 36 35 37  DENCE-OF: R-1657
dd40: 31 2d 31 31 36 31 35 20 41 20 76 61 6c 75 65 20  1-11615 A value 
dd50: 6f 66 20 31 30 20 6d 65 61 6e 73 20 74 68 65 20  of 10 means the 
dd60: 70 61 67 65 20 69 73 20 61 20 6c 65 61 66 0a 20  page is a leaf. 
dd70: 20 20 20 2a 2a 20 69 6e 64 65 78 20 62 2d 74 72     ** index b-tr
dd80: 65 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20  ee page. */.    
dd90: 61 73 73 65 72 74 28 20 28 50 54 46 5f 5a 45 52  assert( (PTF_ZER
dda0: 4f 44 41 54 41 7c 50 54 46 5f 4c 45 41 46 29 3d  ODATA|PTF_LEAF)=
ddb0: 3d 31 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65  =10 );.    pPage
ddc0: 2d 3e 69 6e 74 4b 65 79 20 3d 20 30 3b 0a 20 20  ->intKey = 0;.  
ddd0: 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c    pPage->intKeyL
dde0: 65 61 66 20 3d 20 30 3b 0a 20 20 20 20 70 50 61  eaf = 0;.    pPa
ddf0: 67 65 2d 3e 6e 6f 50 61 79 6c 6f 61 64 20 3d 20  ge->noPayload = 
de00: 30 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 78 50  0;.    pPage->xP
de10: 61 72 73 65 43 65 6c 6c 20 3d 20 62 74 72 65 65  arseCell = btree
de20: 50 61 72 73 65 43 65 6c 6c 50 74 72 49 6e 64 65  ParseCellPtrInde
de30: 78 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 61  x;.    pPage->ma
de40: 78 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 61  xLocal = pBt->ma
de50: 78 4c 6f 63 61 6c 3b 0a 20 20 20 20 70 50 61 67  xLocal;.    pPag
de60: 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 42  e->minLocal = pB
de70: 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 7d  t->minLocal;.  }
de80: 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 45 56 49  else{.    /* EVI
de90: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 37 36 30  DENCE-OF: R-4760
dea0: 38 2d 35 36 34 36 39 20 41 6e 79 20 6f 74 68 65  8-56469 Any othe
deb0: 72 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20  r value for the 
dec0: 62 2d 74 72 65 65 20 70 61 67 65 20 74 79 70 65  b-tree page type
ded0: 20 69 73 0a 20 20 20 20 2a 2a 20 61 6e 20 65 72   is.    ** an er
dee0: 72 6f 72 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75  ror. */.    retu
def0: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
df00: 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 70 50  T_BKPT;.  }.  pP
df10: 61 67 65 2d 3e 6d 61 78 31 62 79 74 65 50 61 79  age->max1bytePay
df20: 6c 6f 61 64 20 3d 20 70 42 74 2d 3e 6d 61 78 31  load = pBt->max1
df30: 62 79 74 65 50 61 79 6c 6f 61 64 3b 0a 20 20 72  bytePayload;.  r
df40: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
df50: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61  .}../*.** Initia
df60: 6c 69 7a 65 20 74 68 65 20 61 75 78 69 6c 69 61  lize the auxilia
df70: 72 79 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  ry information f
df80: 6f 72 20 61 20 64 69 73 6b 20 62 6c 6f 63 6b 2e  or a disk block.
df90: 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51  .**.** Return SQ
dfa0: 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65  LITE_OK on succe
dfb0: 73 73 2e 20 20 49 66 20 77 65 20 73 65 65 20 74  ss.  If we see t
dfc0: 68 61 74 20 74 68 65 20 70 61 67 65 20 64 6f 65  hat the page doe
dfd0: 73 0a 2a 2a 20 6e 6f 74 20 63 6f 6e 74 61 69 6e  s.** not contain
dfe0: 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 64   a well-formed d
dff0: 61 74 61 62 61 73 65 20 70 61 67 65 2c 20 74 68  atabase page, th
e000: 65 6e 20 72 65 74 75 72 6e 20 0a 2a 2a 20 53 51  en return .** SQ
e010: 4c 49 54 45 5f 43 4f 52 52 55 50 54 2e 20 20 4e  LITE_CORRUPT.  N
e020: 6f 74 65 20 74 68 61 74 20 61 20 72 65 74 75 72  ote that a retur
e030: 6e 20 6f 66 20 53 51 4c 49 54 45 5f 4f 4b 20 64  n of SQLITE_OK d
e040: 6f 65 73 20 6e 6f 74 0a 2a 2a 20 67 75 61 72 61  oes not.** guara
e050: 6e 74 65 65 20 74 68 61 74 20 74 68 65 20 70 61  ntee that the pa
e060: 67 65 20 69 73 20 77 65 6c 6c 2d 66 6f 72 6d 65  ge is well-forme
e070: 64 2e 20 20 49 74 20 6f 6e 6c 79 20 73 68 6f 77  d.  It only show
e080: 73 20 74 68 61 74 0a 2a 2a 20 77 65 20 66 61 69  s that.** we fai
e090: 6c 65 64 20 74 6f 20 64 65 74 65 63 74 20 61 6e  led to detect an
e0a0: 79 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f  y corruption..*/
e0b0: 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65  .static int btre
e0c0: 65 49 6e 69 74 50 61 67 65 28 4d 65 6d 50 61 67  eInitPage(MemPag
e0d0: 65 20 2a 70 50 61 67 65 29 7b 0a 0a 20 20 61 73  e *pPage){..  as
e0e0: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74  sert( pPage->pBt
e0f0: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
e100: 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 64 62 21   pPage->pBt->db!
e110: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
e120: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
e130: 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
e140: 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
e150: 74 28 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d  t( pPage->pgno==
e160: 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
e170: 6e 75 6d 62 65 72 28 70 50 61 67 65 2d 3e 70 44  number(pPage->pD
e180: 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65  bPage) );.  asse
e190: 72 74 28 20 70 50 61 67 65 20 3d 3d 20 73 71 6c  rt( pPage == sql
e1a0: 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72  ite3PagerGetExtr
e1b0: 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  a(pPage->pDbPage
e1c0: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
e1d0: 50 61 67 65 2d 3e 61 44 61 74 61 20 3d 3d 20 73  Page->aData == s
e1e0: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61  qlite3PagerGetDa
e1f0: 74 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  ta(pPage->pDbPag
e200: 65 29 20 29 3b 0a 0a 20 20 69 66 28 20 21 70 50  e) );..  if( !pP
e210: 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 7b 0a 20  age->isInit ){. 
e220: 20 20 20 75 31 36 20 70 63 3b 20 20 20 20 20 20     u16 pc;      
e230: 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
e240: 20 6f 66 20 61 20 66 72 65 65 62 6c 6f 63 6b 20   of a freeblock 
e250: 77 69 74 68 69 6e 20 70 50 61 67 65 2d 3e 61 44  within pPage->aD
e260: 61 74 61 5b 5d 20 2a 2f 0a 20 20 20 20 75 38 20  ata[] */.    u8 
e270: 68 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  hdr;            
e280: 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 62 65 67  /* Offset to beg
e290: 69 6e 6e 69 6e 67 20 6f 66 20 70 61 67 65 20 68  inning of page h
e2a0: 65 61 64 65 72 20 2a 2f 0a 20 20 20 20 75 38 20  eader */.    u8 
e2b0: 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20 20 20  *data;          
e2c0: 2f 2a 20 45 71 75 61 6c 20 74 6f 20 70 50 61 67  /* Equal to pPag
e2d0: 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20 20 20  e->aData */.    
e2e0: 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20 20  BtShared *pBt;  
e2f0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 69        /* The mai
e300: 6e 20 62 74 72 65 65 20 73 74 72 75 63 74 75 72  n btree structur
e310: 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 75 73 61  e */.    int usa
e320: 62 6c 65 53 69 7a 65 3b 20 20 20 20 2f 2a 20 41  bleSize;    /* A
e330: 6d 6f 75 6e 74 20 6f 66 20 75 73 61 62 6c 65 20  mount of usable 
e340: 73 70 61 63 65 20 6f 6e 20 65 61 63 68 20 70 61  space on each pa
e350: 67 65 20 2a 2f 0a 20 20 20 20 75 31 36 20 63 65  ge */.    u16 ce
e360: 6c 6c 4f 66 66 73 65 74 3b 20 20 20 20 2f 2a 20  llOffset;    /* 
e370: 4f 66 66 73 65 74 20 66 72 6f 6d 20 73 74 61 72  Offset from star
e380: 74 20 6f 66 20 70 61 67 65 20 74 6f 20 66 69 72  t of page to fir
e390: 73 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20  st cell pointer 
e3a0: 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 46 72 65 65  */.    int nFree
e3b0: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d  ;         /* Num
e3c0: 62 65 72 20 6f 66 20 75 6e 75 73 65 64 20 62 79  ber of unused by
e3d0: 74 65 73 20 6f 6e 20 74 68 65 20 70 61 67 65 20  tes on the page 
e3e0: 2a 2f 0a 20 20 20 20 69 6e 74 20 74 6f 70 3b 20  */.    int top; 
e3f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
e400: 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 63  st byte of the c
e410: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
e420: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43 65 6c   */.    int iCel
e430: 6c 46 69 72 73 74 3b 20 20 20 20 2f 2a 20 46 69  lFirst;    /* Fi
e440: 72 73 74 20 61 6c 6c 6f 77 61 62 6c 65 20 63 65  rst allowable ce
e450: 6c 6c 20 6f 72 20 66 72 65 65 62 6c 6f 63 6b 20  ll or freeblock 
e460: 6f 66 66 73 65 74 20 2a 2f 0a 20 20 20 20 69 6e  offset */.    in
e470: 74 20 69 43 65 6c 6c 4c 61 73 74 3b 20 20 20 20  t iCellLast;    
e480: 20 2f 2a 20 4c 61 73 74 20 70 6f 73 73 69 62 6c   /* Last possibl
e490: 65 20 63 65 6c 6c 20 6f 72 20 66 72 65 65 62 6c  e cell or freebl
e4a0: 6f 63 6b 20 6f 66 66 73 65 74 20 2a 2f 0a 0a 20  ock offset */.. 
e4b0: 20 20 20 70 42 74 20 3d 20 70 50 61 67 65 2d 3e     pBt = pPage->
e4c0: 70 42 74 3b 0a 0a 20 20 20 20 68 64 72 20 3d 20  pBt;..    hdr = 
e4d0: 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
e4e0: 3b 0a 20 20 20 20 64 61 74 61 20 3d 20 70 50 61  ;.    data = pPa
e4f0: 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 2f  ge->aData;.    /
e500: 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
e510: 2d 32 38 35 39 34 2d 30 32 38 39 30 20 54 68 65  -28594-02890 The
e520: 20 6f 6e 65 2d 62 79 74 65 20 66 6c 61 67 20 61   one-byte flag a
e530: 74 20 6f 66 66 73 65 74 20 30 20 69 6e 64 69 63  t offset 0 indic
e540: 61 74 69 6e 67 0a 20 20 20 20 2a 2a 20 74 68 65  ating.    ** the
e550: 20 62 2d 74 72 65 65 20 70 61 67 65 20 74 79 70   b-tree page typ
e560: 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 64 65  e. */.    if( de
e570: 63 6f 64 65 46 6c 61 67 73 28 70 50 61 67 65 2c  codeFlags(pPage,
e580: 20 64 61 74 61 5b 68 64 72 5d 29 20 29 20 72 65   data[hdr]) ) re
e590: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
e5a0: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 61 73  UPT_BKPT;.    as
e5b0: 73 65 72 74 28 20 70 42 74 2d 3e 70 61 67 65 53  sert( pBt->pageS
e5c0: 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 42 74 2d  ize>=512 && pBt-
e5d0: 3e 70 61 67 65 53 69 7a 65 3c 3d 36 35 35 33 36  >pageSize<=65536
e5e0: 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d   );.    pPage->m
e5f0: 61 73 6b 50 61 67 65 20 3d 20 28 75 31 36 29 28  askPage = (u16)(
e600: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20  pBt->pageSize - 
e610: 31 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e  1);.    pPage->n
e620: 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20  Overflow = 0;.  
e630: 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70    usableSize = p
e640: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a  Bt->usableSize;.
e650: 20 20 20 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f      pPage->cellO
e660: 66 66 73 65 74 20 3d 20 63 65 6c 6c 4f 66 66 73  ffset = cellOffs
e670: 65 74 20 3d 20 68 64 72 20 2b 20 38 20 2b 20 70  et = hdr + 8 + p
e680: 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69  Page->childPtrSi
e690: 7a 65 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 61  ze;.    pPage->a
e6a0: 44 61 74 61 45 6e 64 20 3d 20 26 64 61 74 61 5b  DataEnd = &data[
e6b0: 75 73 61 62 6c 65 53 69 7a 65 5d 3b 0a 20 20 20  usableSize];.   
e6c0: 20 70 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64 78   pPage->aCellIdx
e6d0: 20 3d 20 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66   = &data[cellOff
e6e0: 73 65 74 5d 3b 0a 20 20 20 20 70 50 61 67 65 2d  set];.    pPage-
e6f0: 3e 61 44 61 74 61 4f 66 73 74 20 3d 20 26 64 61  >aDataOfst = &da
e700: 74 61 5b 70 50 61 67 65 2d 3e 63 68 69 6c 64 50  ta[pPage->childP
e710: 74 72 53 69 7a 65 5d 3b 0a 20 20 20 20 2f 2a 20  trSize];.    /* 
e720: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35  EVIDENCE-OF: R-5
e730: 38 30 31 35 2d 34 38 31 37 35 20 54 68 65 20 74  8015-48175 The t
e740: 77 6f 2d 62 79 74 65 20 69 6e 74 65 67 65 72 20  wo-byte integer 
e750: 61 74 20 6f 66 66 73 65 74 20 35 20 64 65 73 69  at offset 5 desi
e760: 67 6e 61 74 65 73 0a 20 20 20 20 2a 2a 20 74 68  gnates.    ** th
e770: 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 63  e start of the c
e780: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
e790: 2e 20 41 20 7a 65 72 6f 20 76 61 6c 75 65 20 66  . A zero value f
e7a0: 6f 72 20 74 68 69 73 20 69 6e 74 65 67 65 72 20  or this integer 
e7b0: 69 73 0a 20 20 20 20 2a 2a 20 69 6e 74 65 72 70  is.    ** interp
e7c0: 72 65 74 65 64 20 61 73 20 36 35 35 33 36 2e 20  reted as 65536. 
e7d0: 2a 2f 0a 20 20 20 20 74 6f 70 20 3d 20 67 65 74  */.    top = get
e7e0: 32 62 79 74 65 4e 6f 74 5a 65 72 6f 28 26 64 61  2byteNotZero(&da
e7f0: 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20  ta[hdr+5]);.    
e800: 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
e810: 52 2d 33 37 30 30 32 2d 33 32 37 37 34 20 54 68  R-37002-32774 Th
e820: 65 20 74 77 6f 2d 62 79 74 65 20 69 6e 74 65 67  e two-byte integ
e830: 65 72 20 61 74 20 6f 66 66 73 65 74 20 33 20 67  er at offset 3 g
e840: 69 76 65 73 20 74 68 65 0a 20 20 20 20 2a 2a 20  ives the.    ** 
e850: 6e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20  number of cells 
e860: 6f 6e 20 74 68 65 20 70 61 67 65 2e 20 2a 2f 0a  on the page. */.
e870: 20 20 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c      pPage->nCell
e880: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
e890: 61 5b 68 64 72 2b 33 5d 29 3b 0a 20 20 20 20 69  a[hdr+3]);.    i
e8a0: 66 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e  f( pPage->nCell>
e8b0: 4d 58 5f 43 45 4c 4c 28 70 42 74 29 20 29 7b 0a  MX_CELL(pBt) ){.
e8c0: 20 20 20 20 20 20 2f 2a 20 54 6f 20 6d 61 6e 79        /* To many
e8d0: 20 63 65 6c 6c 73 20 66 6f 72 20 61 20 73 69 6e   cells for a sin
e8e0: 67 6c 65 20 70 61 67 65 2e 20 20 54 68 65 20 70  gle page.  The p
e8f0: 61 67 65 20 6d 75 73 74 20 62 65 20 63 6f 72 72  age must be corr
e900: 75 70 74 20 2a 2f 0a 20 20 20 20 20 20 72 65 74  upt */.      ret
e910: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
e920: 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20  PT_BKPT;.    }. 
e930: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 50 61     testcase( pPa
e940: 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 4d 58 5f 43 45  ge->nCell==MX_CE
e950: 4c 4c 28 70 42 74 29 20 29 3b 0a 20 20 20 20 2f  LL(pBt) );.    /
e960: 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
e970: 2d 32 34 30 38 39 2d 35 37 39 37 39 20 49 66 20  -24089-57979 If 
e980: 61 20 70 61 67 65 20 63 6f 6e 74 61 69 6e 73 20  a page contains 
e990: 6e 6f 20 63 65 6c 6c 73 20 28 77 68 69 63 68 20  no cells (which 
e9a0: 69 73 20 6f 6e 6c 79 0a 20 20 20 20 2a 2a 20 70  is only.    ** p
e9b0: 6f 73 73 69 62 6c 65 20 66 6f 72 20 61 20 72 6f  ossible for a ro
e9c0: 6f 74 20 70 61 67 65 20 6f 66 20 61 20 74 61 62  ot page of a tab
e9d0: 6c 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  le that contains
e9e0: 20 6e 6f 20 72 6f 77 73 29 20 74 68 65 6e 20 74   no rows) then t
e9f0: 68 65 0a 20 20 20 20 2a 2a 20 6f 66 66 73 65 74  he.    ** offset
ea00: 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e   to the cell con
ea10: 74 65 6e 74 20 61 72 65 61 20 77 69 6c 6c 20 65  tent area will e
ea20: 71 75 61 6c 20 74 68 65 20 70 61 67 65 20 73 69  qual the page si
ea30: 7a 65 20 6d 69 6e 75 73 20 74 68 65 0a 20 20 20  ze minus the.   
ea40: 20 2a 2a 20 62 79 74 65 73 20 6f 66 20 72 65 73   ** bytes of res
ea50: 65 72 76 65 64 20 73 70 61 63 65 2e 20 2a 2f 0a  erved space. */.
ea60: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
ea70: 65 2d 3e 6e 43 65 6c 6c 3e 30 20 7c 7c 20 74 6f  e->nCell>0 || to
ea80: 70 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20 7c 7c  p==usableSize ||
ea90: 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 0a   CORRUPT_DB );..
eaa0: 20 20 20 20 2f 2a 20 41 20 6d 61 6c 66 6f 72 6d      /* A malform
eab0: 65 64 20 64 61 74 61 62 61 73 65 20 70 61 67 65  ed database page
eac0: 20 6d 69 67 68 74 20 63 61 75 73 65 20 75 73 20   might cause us 
ead0: 74 6f 20 72 65 61 64 20 70 61 73 74 20 74 68 65  to read past the
eae0: 20 65 6e 64 0a 20 20 20 20 2a 2a 20 6f 66 20 70   end.    ** of p
eaf0: 61 67 65 20 77 68 65 6e 20 70 61 72 73 69 6e 67  age when parsing
eb00: 20 61 20 63 65 6c 6c 2e 20 20 0a 20 20 20 20 2a   a cell.  .    *
eb10: 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 66 6f 6c  *.    ** The fol
eb20: 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 6f 66 20  lowing block of 
eb30: 63 6f 64 65 20 63 68 65 63 6b 73 20 65 61 72 6c  code checks earl
eb40: 79 20 74 6f 20 73 65 65 20 69 66 20 61 20 63 65  y to see if a ce
eb50: 6c 6c 20 65 78 74 65 6e 64 73 0a 20 20 20 20 2a  ll extends.    *
eb60: 2a 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f  * past the end o
eb70: 66 20 61 20 70 61 67 65 20 62 6f 75 6e 64 61 72  f a page boundar
eb80: 79 20 61 6e 64 20 63 61 75 73 65 73 20 53 51 4c  y and causes SQL
eb90: 49 54 45 5f 43 4f 52 52 55 50 54 20 74 6f 20 62  ITE_CORRUPT to b
eba0: 65 20 0a 20 20 20 20 2a 2a 20 72 65 74 75 72 6e  e .    ** return
ebb0: 65 64 20 69 66 20 69 74 20 64 6f 65 73 2e 0a 20  ed if it does.. 
ebc0: 20 20 20 2a 2f 0a 20 20 20 20 69 43 65 6c 6c 46     */.    iCellF
ebd0: 69 72 73 74 20 3d 20 63 65 6c 6c 4f 66 66 73 65  irst = cellOffse
ebe0: 74 20 2b 20 32 2a 70 50 61 67 65 2d 3e 6e 43 65  t + 2*pPage->nCe
ebf0: 6c 6c 3b 0a 20 20 20 20 69 43 65 6c 6c 4c 61 73  ll;.    iCellLas
ec00: 74 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 20 2d  t = usableSize -
ec10: 20 34 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d   4;.    if( pBt-
ec20: 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  >db->flags & SQL
ec30: 49 54 45 5f 43 65 6c 6c 53 69 7a 65 43 6b 20 29  ITE_CellSizeCk )
ec40: 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 20 20  {.      int i;  
ec50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
ec60: 65 78 20 69 6e 74 6f 20 74 68 65 20 63 65 6c 6c  ex into the cell
ec70: 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79 20 2a   pointer array *
ec80: 2f 0a 20 20 20 20 20 20 69 6e 74 20 73 7a 3b 20  /.      int sz; 
ec90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
eca0: 65 20 6f 66 20 61 20 63 65 6c 6c 20 2a 2f 0a 0a  e of a cell */..
ecb0: 20 20 20 20 20 20 69 66 28 20 21 70 50 61 67 65        if( !pPage
ecc0: 2d 3e 6c 65 61 66 20 29 20 69 43 65 6c 6c 4c 61  ->leaf ) iCellLa
ecd0: 73 74 2d 2d 3b 0a 20 20 20 20 20 20 66 6f 72 28  st--;.      for(
ece0: 69 3d 30 3b 20 69 3c 70 50 61 67 65 2d 3e 6e 43  i=0; i<pPage->nC
ecf0: 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  ell; i++){.     
ed00: 20 20 20 70 63 20 3d 20 67 65 74 32 62 79 74 65     pc = get2byte
ed10: 28 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65  (&data[cellOffse
ed20: 74 2b 69 2a 32 5d 29 3b 0a 20 20 20 20 20 20 20  t+i*2]);.       
ed30: 20 74 65 73 74 63 61 73 65 28 20 70 63 3d 3d 69   testcase( pc==i
ed40: 43 65 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20 20  CellFirst );.   
ed50: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
ed60: 63 3d 3d 69 43 65 6c 6c 4c 61 73 74 20 29 3b 0a  c==iCellLast );.
ed70: 20 20 20 20 20 20 20 20 69 66 28 20 70 63 3c 69          if( pc<i
ed80: 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63 3e  CellFirst || pc>
ed90: 69 43 65 6c 6c 4c 61 73 74 20 29 7b 0a 20 20 20  iCellLast ){.   
eda0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
edb0: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
edc0: 54 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  T;.        }.   
edd0: 20 20 20 20 20 73 7a 20 3d 20 70 50 61 67 65 2d       sz = pPage-
ede0: 3e 78 43 65 6c 6c 53 69 7a 65 28 70 50 61 67 65  >xCellSize(pPage
edf0: 2c 20 26 64 61 74 61 5b 70 63 5d 29 3b 0a 20 20  , &data[pc]);.  
ee00: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
ee10: 70 63 2b 73 7a 3d 3d 75 73 61 62 6c 65 53 69 7a  pc+sz==usableSiz
ee20: 65 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  e );.        if(
ee30: 20 70 63 2b 73 7a 3e 75 73 61 62 6c 65 53 69 7a   pc+sz>usableSiz
ee40: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  e ){.          r
ee50: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
ee60: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
ee70: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
ee80: 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c     if( !pPage->l
ee90: 65 61 66 20 29 20 69 43 65 6c 6c 4c 61 73 74 2b  eaf ) iCellLast+
eea0: 2b 3b 0a 20 20 20 20 7d 20 20 0a 0a 20 20 20 20  +;.    }  ..    
eeb0: 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 74  /* Compute the t
eec0: 6f 74 61 6c 20 66 72 65 65 20 73 70 61 63 65 20  otal free space 
eed0: 6f 6e 20 74 68 65 20 70 61 67 65 0a 20 20 20 20  on the page.    
eee0: 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  ** EVIDENCE-OF: 
eef0: 52 2d 32 33 35 38 38 2d 33 34 34 35 30 20 54 68  R-23588-34450 Th
ef00: 65 20 74 77 6f 2d 62 79 74 65 20 69 6e 74 65 67  e two-byte integ
ef10: 65 72 20 61 74 20 6f 66 66 73 65 74 20 31 20 67  er at offset 1 g
ef20: 69 76 65 73 20 74 68 65 0a 20 20 20 20 2a 2a 20  ives the.    ** 
ef30: 73 74 61 72 74 20 6f 66 20 74 68 65 20 66 69 72  start of the fir
ef40: 73 74 20 66 72 65 65 62 6c 6f 63 6b 20 6f 6e 20  st freeblock on 
ef50: 74 68 65 20 70 61 67 65 2c 20 6f 72 20 69 73 20  the page, or is 
ef60: 7a 65 72 6f 20 69 66 20 74 68 65 72 65 20 61 72  zero if there ar
ef70: 65 20 6e 6f 0a 20 20 20 20 2a 2a 20 66 72 65 65  e no.    ** free
ef80: 62 6c 6f 63 6b 73 2e 20 2a 2f 0a 20 20 20 20 70  blocks. */.    p
ef90: 63 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  c = get2byte(&da
efa0: 74 61 5b 68 64 72 2b 31 5d 29 3b 0a 20 20 20 20  ta[hdr+1]);.    
efb0: 6e 46 72 65 65 20 3d 20 64 61 74 61 5b 68 64 72  nFree = data[hdr
efc0: 2b 37 5d 20 2b 20 74 6f 70 3b 20 20 2f 2a 20 49  +7] + top;  /* I
efd0: 6e 69 74 20 6e 46 72 65 65 20 74 6f 20 6e 6f 6e  nit nFree to non
efe0: 2d 66 72 65 65 62 6c 6f 63 6b 20 66 72 65 65 20  -freeblock free 
eff0: 73 70 61 63 65 20 2a 2f 0a 20 20 20 20 77 68 69  space */.    whi
f000: 6c 65 28 20 70 63 3e 30 20 29 7b 0a 20 20 20 20  le( pc>0 ){.    
f010: 20 20 75 31 36 20 6e 65 78 74 2c 20 73 69 7a 65    u16 next, size
f020: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 63 3c 69  ;.      if( pc<i
f030: 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63 3e  CellFirst || pc>
f040: 69 43 65 6c 6c 4c 61 73 74 20 29 7b 0a 20 20 20  iCellLast ){.   
f050: 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45       /* EVIDENCE
f060: 2d 4f 46 3a 20 52 2d 35 35 35 33 30 2d 35 32 39  -OF: R-55530-529
f070: 33 30 20 49 6e 20 61 20 77 65 6c 6c 2d 66 6f 72  30 In a well-for
f080: 6d 65 64 20 62 2d 74 72 65 65 20 70 61 67 65 2c  med b-tree page,
f090: 20 74 68 65 72 65 20 77 69 6c 6c 0a 20 20 20 20   there will.    
f0a0: 20 20 20 20 2a 2a 20 61 6c 77 61 79 73 20 62 65      ** always be
f0b0: 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 63 65   at least one ce
f0c0: 6c 6c 20 62 65 66 6f 72 65 20 74 68 65 20 66 69  ll before the fi
f0d0: 72 73 74 20 66 72 65 65 62 6c 6f 63 6b 2e 0a 20  rst freeblock.. 
f0e0: 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
f0f0: 20 20 2a 2a 20 4f 72 2c 20 74 68 65 20 66 72 65    ** Or, the fre
f100: 65 62 6c 6f 63 6b 20 69 73 20 6f 66 66 20 74 68  eblock is off th
f110: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70 61 67  e end of the pag
f120: 65 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  e.        */.   
f130: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
f140: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
f150: 20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20   .      }.      
f160: 6e 65 78 74 20 3d 20 67 65 74 32 62 79 74 65 28  next = get2byte(
f170: 26 64 61 74 61 5b 70 63 5d 29 3b 0a 20 20 20 20  &data[pc]);.    
f180: 20 20 73 69 7a 65 20 3d 20 67 65 74 32 62 79 74    size = get2byt
f190: 65 28 26 64 61 74 61 5b 70 63 2b 32 5d 29 3b 0a  e(&data[pc+2]);.
f1a0: 20 20 20 20 20 20 69 66 28 20 28 6e 65 78 74 3e        if( (next>
f1b0: 30 20 26 26 20 6e 65 78 74 3c 3d 70 63 2b 73 69  0 && next<=pc+si
f1c0: 7a 65 2b 33 29 20 7c 7c 20 70 63 2b 73 69 7a 65  ze+3) || pc+size
f1d0: 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20  >usableSize ){. 
f1e0: 20 20 20 20 20 20 20 2f 2a 20 46 72 65 65 20 62         /* Free b
f1f0: 6c 6f 63 6b 73 20 6d 75 73 74 20 62 65 20 69 6e  locks must be in
f200: 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72   ascending order
f210: 2e 20 41 6e 64 20 74 68 65 20 6c 61 73 74 20 62  . And the last b
f220: 79 74 65 20 6f 66 0a 20 20 20 20 20 20 20 20 2a  yte of.        *
f230: 2a 20 74 68 65 20 66 72 65 65 2d 62 6c 6f 63 6b  * the free-block
f240: 20 6d 75 73 74 20 6c 69 65 20 6f 6e 20 74 68 65   must lie on the
f250: 20 64 61 74 61 62 61 73 65 20 70 61 67 65 2e 20   database page. 
f260: 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 74 75   */.        retu
f270: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
f280: 54 5f 42 4b 50 54 3b 20 0a 20 20 20 20 20 20 7d  T_BKPT; .      }
f290: 0a 20 20 20 20 20 20 6e 46 72 65 65 20 3d 20 6e  .      nFree = n
f2a0: 46 72 65 65 20 2b 20 73 69 7a 65 3b 0a 20 20 20  Free + size;.   
f2b0: 20 20 20 70 63 20 3d 20 6e 65 78 74 3b 0a 20 20     pc = next;.  
f2c0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 74 20 74    }..    /* At t
f2d0: 68 69 73 20 70 6f 69 6e 74 2c 20 6e 46 72 65 65  his point, nFree
f2e0: 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 73 75   contains the su
f2f0: 6d 20 6f 66 20 74 68 65 20 6f 66 66 73 65 74 20  m of the offset 
f300: 74 6f 20 74 68 65 20 73 74 61 72 74 0a 20 20 20  to the start.   
f310: 20 2a 2a 20 6f 66 20 74 68 65 20 63 65 6c 6c 2d   ** of the cell-
f320: 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 70 6c 75  content area plu
f330: 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
f340: 66 72 65 65 20 62 79 74 65 73 20 77 69 74 68 69  free bytes withi
f350: 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 65 6c  n.    ** the cel
f360: 6c 2d 63 6f 6e 74 65 6e 74 20 61 72 65 61 2e 20  l-content area. 
f370: 49 66 20 74 68 69 73 20 69 73 20 67 72 65 61 74  If this is great
f380: 65 72 20 74 68 61 6e 20 74 68 65 20 75 73 61 62  er than the usab
f390: 6c 65 2d 73 69 7a 65 0a 20 20 20 20 2a 2a 20 6f  le-size.    ** o
f3a0: 66 20 74 68 65 20 70 61 67 65 2c 20 74 68 65 6e  f the page, then
f3b0: 20 74 68 65 20 70 61 67 65 20 6d 75 73 74 20 62   the page must b
f3c0: 65 20 63 6f 72 72 75 70 74 65 64 2e 20 54 68 69  e corrupted. Thi
f3d0: 73 20 63 68 65 63 6b 20 61 6c 73 6f 0a 20 20 20  s check also.   
f3e0: 20 2a 2a 20 73 65 72 76 65 73 20 74 6f 20 76 65   ** serves to ve
f3f0: 72 69 66 79 20 74 68 61 74 20 74 68 65 20 6f 66  rify that the of
f400: 66 73 65 74 20 74 6f 20 74 68 65 20 73 74 61 72  fset to the star
f410: 74 20 6f 66 20 74 68 65 20 63 65 6c 6c 2d 63 6f  t of the cell-co
f420: 6e 74 65 6e 74 0a 20 20 20 20 2a 2a 20 61 72 65  ntent.    ** are
f430: 61 2c 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20  a, according to 
f440: 74 68 65 20 70 61 67 65 20 68 65 61 64 65 72 2c  the page header,
f450: 20 6c 69 65 73 20 77 69 74 68 69 6e 20 74 68 65   lies within the
f460: 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   page..    */.  
f470: 20 20 69 66 28 20 6e 46 72 65 65 3e 75 73 61 62    if( nFree>usab
f480: 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  leSize ){.      
f490: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
f4a0: 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20 20  RRUPT_BKPT; .   
f4b0: 20 7d 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 46   }.    pPage->nF
f4c0: 72 65 65 20 3d 20 28 75 31 36 29 28 6e 46 72 65  ree = (u16)(nFre
f4d0: 65 20 2d 20 69 43 65 6c 6c 46 69 72 73 74 29 3b  e - iCellFirst);
f4e0: 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49 6e  .    pPage->isIn
f4f0: 69 74 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65  it = 1;.  }.  re
f500: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
f510: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 75 70 20  }../*.** Set up 
f520: 61 20 72 61 77 20 70 61 67 65 20 73 6f 20 74 68  a raw page so th
f530: 61 74 20 69 74 20 6c 6f 6f 6b 73 20 6c 69 6b 65  at it looks like
f540: 20 61 20 64 61 74 61 62 61 73 65 20 70 61 67 65   a database page
f550: 20 68 6f 6c 64 69 6e 67 0a 2a 2a 20 6e 6f 20 65   holding.** no e
f560: 6e 74 72 69 65 73 2e 0a 2a 2f 0a 73 74 61 74 69  ntries..*/.stati
f570: 63 20 76 6f 69 64 20 7a 65 72 6f 50 61 67 65 28  c void zeroPage(
f580: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
f590: 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 75 6e  int flags){.  un
f5a0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74  signed char *dat
f5b0: 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61  a = pPage->aData
f5c0: 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
f5d0: 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a  t = pPage->pBt;.
f5e0: 20 20 75 38 20 68 64 72 20 3d 20 70 50 61 67 65    u8 hdr = pPage
f5f0: 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 75  ->hdrOffset;.  u
f600: 31 36 20 66 69 72 73 74 3b 0a 0a 20 20 61 73 73  16 first;..  ass
f610: 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
f620: 72 50 61 67 65 6e 75 6d 62 65 72 28 70 50 61 67  rPagenumber(pPag
f630: 65 2d 3e 70 44 62 50 61 67 65 29 3d 3d 70 50 61  e->pDbPage)==pPa
f640: 67 65 2d 3e 70 67 6e 6f 20 29 3b 0a 20 20 61 73  ge->pgno );.  as
f650: 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
f660: 65 72 47 65 74 45 78 74 72 61 28 70 50 61 67 65  erGetExtra(pPage
f670: 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d 20 28 76  ->pDbPage) == (v
f680: 6f 69 64 2a 29 70 50 61 67 65 20 29 3b 0a 20 20  oid*)pPage );.  
f690: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
f6a0: 61 67 65 72 47 65 74 44 61 74 61 28 70 50 61 67  agerGetData(pPag
f6b0: 65 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d 20 64  e->pDbPage) == d
f6c0: 61 74 61 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ata );.  assert(
f6d0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
f6e0: 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
f6f0: 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73  pDbPage) );.  as
f700: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
f710: 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
f720: 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20 70 42  tex) );.  if( pB
f730: 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54  t->btsFlags & BT
f740: 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 20  S_SECURE_DELETE 
f750: 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 64  ){.    memset(&d
f760: 61 74 61 5b 68 64 72 5d 2c 20 30 2c 20 70 42 74  ata[hdr], 0, pBt
f770: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 68  ->usableSize - h
f780: 64 72 29 3b 0a 20 20 7d 0a 20 20 64 61 74 61 5b  dr);.  }.  data[
f790: 68 64 72 5d 20 3d 20 28 63 68 61 72 29 66 6c 61  hdr] = (char)fla
f7a0: 67 73 3b 0a 20 20 66 69 72 73 74 20 3d 20 68 64  gs;.  first = hd
f7b0: 72 20 2b 20 28 28 66 6c 61 67 73 26 50 54 46 5f  r + ((flags&PTF_
f7c0: 4c 45 41 46 29 3d 3d 30 20 3f 20 31 32 20 3a 20  LEAF)==0 ? 12 : 
f7d0: 38 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 61  8);.  memset(&da
f7e0: 74 61 5b 68 64 72 2b 31 5d 2c 20 30 2c 20 34 29  ta[hdr+1], 0, 4)
f7f0: 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b 37 5d 20  ;.  data[hdr+7] 
f800: 3d 20 30 3b 0a 20 20 70 75 74 32 62 79 74 65 28  = 0;.  put2byte(
f810: 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 70 42  &data[hdr+5], pB
f820: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a  t->usableSize);.
f830: 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d    pPage->nFree =
f840: 20 28 75 31 36 29 28 70 42 74 2d 3e 75 73 61 62   (u16)(pBt->usab
f850: 6c 65 53 69 7a 65 20 2d 20 66 69 72 73 74 29 3b  leSize - first);
f860: 0a 20 20 64 65 63 6f 64 65 46 6c 61 67 73 28 70  .  decodeFlags(p
f870: 50 61 67 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20  Page, flags);.  
f880: 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65  pPage->cellOffse
f890: 74 20 3d 20 66 69 72 73 74 3b 0a 20 20 70 50 61  t = first;.  pPa
f8a0: 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 3d 20 26  ge->aDataEnd = &
f8b0: 64 61 74 61 5b 70 42 74 2d 3e 75 73 61 62 6c 65  data[pBt->usable
f8c0: 53 69 7a 65 5d 3b 0a 20 20 70 50 61 67 65 2d 3e  Size];.  pPage->
f8d0: 61 43 65 6c 6c 49 64 78 20 3d 20 26 64 61 74 61  aCellIdx = &data
f8e0: 5b 66 69 72 73 74 5d 3b 0a 20 20 70 50 61 67 65  [first];.  pPage
f8f0: 2d 3e 61 44 61 74 61 4f 66 73 74 20 3d 20 26 64  ->aDataOfst = &d
f900: 61 74 61 5b 70 50 61 67 65 2d 3e 63 68 69 6c 64  ata[pPage->child
f910: 50 74 72 53 69 7a 65 5d 3b 0a 20 20 70 50 61 67  PtrSize];.  pPag
f920: 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30  e->nOverflow = 0
f930: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ;.  assert( pBt-
f940: 3e 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26  >pageSize>=512 &
f950: 26 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c  & pBt->pageSize<
f960: 3d 36 35 35 33 36 20 29 3b 0a 20 20 70 50 61 67  =65536 );.  pPag
f970: 65 2d 3e 6d 61 73 6b 50 61 67 65 20 3d 20 28 75  e->maskPage = (u
f980: 31 36 29 28 70 42 74 2d 3e 70 61 67 65 53 69 7a  16)(pBt->pageSiz
f990: 65 20 2d 20 31 29 3b 0a 20 20 70 50 61 67 65 2d  e - 1);.  pPage-
f9a0: 3e 6e 43 65 6c 6c 20 3d 20 30 3b 0a 20 20 70 50  >nCell = 0;.  pP
f9b0: 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 31 3b  age->isInit = 1;
f9c0: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65  .}.../*.** Conve
f9d0: 72 74 20 61 20 44 62 50 61 67 65 20 6f 62 74 61  rt a DbPage obta
f9e0: 69 6e 65 64 20 66 72 6f 6d 20 74 68 65 20 70 61  ined from the pa
f9f0: 67 65 72 20 69 6e 74 6f 20 61 20 4d 65 6d 50 61  ger into a MemPa
fa00: 67 65 20 75 73 65 64 20 62 79 0a 2a 2a 20 74 68  ge used by.** th
fa10: 65 20 62 74 72 65 65 20 6c 61 79 65 72 2e 0a 2a  e btree layer..*
fa20: 2f 0a 73 74 61 74 69 63 20 4d 65 6d 50 61 67 65  /.static MemPage
fa30: 20 2a 62 74 72 65 65 50 61 67 65 46 72 6f 6d 44   *btreePageFromD
fa40: 62 50 61 67 65 28 44 62 50 61 67 65 20 2a 70 44  bPage(DbPage *pD
fa50: 62 50 61 67 65 2c 20 50 67 6e 6f 20 70 67 6e 6f  bPage, Pgno pgno
fa60: 2c 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 29  , BtShared *pBt)
fa70: 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  {.  MemPage *pPa
fa80: 67 65 20 3d 20 28 4d 65 6d 50 61 67 65 2a 29 73  ge = (MemPage*)s
fa90: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78  qlite3PagerGetEx
faa0: 74 72 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20  tra(pDbPage);.  
fab0: 70 50 61 67 65 2d 3e 61 44 61 74 61 20 3d 20 73  pPage->aData = s
fac0: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61  qlite3PagerGetDa
fad0: 74 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20 70  ta(pDbPage);.  p
fae0: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 20 3d 20  Page->pDbPage = 
faf0: 70 44 62 50 61 67 65 3b 0a 20 20 70 50 61 67 65  pDbPage;.  pPage
fb00: 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 70  ->pBt = pBt;.  p
fb10: 50 61 67 65 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e  Page->pgno = pgn
fb20: 6f 3b 0a 20 20 70 50 61 67 65 2d 3e 68 64 72 4f  o;.  pPage->hdrO
fb30: 66 66 73 65 74 20 3d 20 70 67 6e 6f 3d 3d 31 20  ffset = pgno==1 
fb40: 3f 20 31 30 30 20 3a 20 30 3b 0a 20 20 72 65 74  ? 100 : 0;.  ret
fb50: 75 72 6e 20 70 50 61 67 65 3b 20 0a 7d 0a 0a 2f  urn pPage; .}../
fb60: 2a 0a 2a 2a 20 47 65 74 20 61 20 70 61 67 65 20  *.** Get a page 
fb70: 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72 2e 20  from the pager. 
fb80: 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
fb90: 4d 65 6d 50 61 67 65 2e 70 42 74 20 61 6e 64 0a  MemPage.pBt and.
fba0: 2a 2a 20 4d 65 6d 50 61 67 65 2e 61 44 61 74 61  ** MemPage.aData
fbb0: 20 65 6c 65 6d 65 6e 74 73 20 69 66 20 6e 65 65   elements if nee
fbc0: 64 65 64 2e 20 20 53 65 65 20 61 6c 73 6f 3a 20  ded.  See also: 
fbd0: 62 74 72 65 65 47 65 74 55 6e 75 73 65 64 50 61  btreeGetUnusedPa
fbe0: 67 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ge()..**.** If t
fbf0: 68 65 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43  he PAGER_GET_NOC
fc00: 4f 4e 54 45 4e 54 20 66 6c 61 67 20 69 73 20 73  ONTENT flag is s
fc10: 65 74 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61  et, it means tha
fc20: 74 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65  t we do not care
fc30: 0a 2a 2a 20 61 62 6f 75 74 20 74 68 65 20 63 6f  .** about the co
fc40: 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67  ntent of the pag
fc50: 65 20 61 74 20 74 68 69 73 20 74 69 6d 65 2e 20  e at this time. 
fc60: 20 53 6f 20 64 6f 20 6e 6f 74 20 67 6f 20 74 6f   So do not go to
fc70: 20 74 68 65 20 64 69 73 6b 0a 2a 2a 20 74 6f 20   the disk.** to 
fc80: 66 65 74 63 68 20 74 68 65 20 63 6f 6e 74 65 6e  fetch the conten
fc90: 74 2e 20 20 4a 75 73 74 20 66 69 6c 6c 20 69 6e  t.  Just fill in
fca0: 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 77 69 74   the content wit
fcb0: 68 20 7a 65 72 6f 73 20 66 6f 72 20 6e 6f 77 2e  h zeros for now.
fcc0: 0a 2a 2a 20 49 66 20 69 6e 20 74 68 65 20 66 75  .** If in the fu
fcd0: 74 75 72 65 20 77 65 20 63 61 6c 6c 20 73 71 6c  ture we call sql
fce0: 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29  ite3PagerWrite()
fcf0: 20 6f 6e 20 74 68 69 73 20 70 61 67 65 2c 20 74   on this page, t
fd00: 68 61 74 0a 2a 2a 20 6d 65 61 6e 73 20 77 65 20  hat.** means we 
fd10: 68 61 76 65 20 73 74 61 72 74 65 64 20 74 6f 20  have started to 
fd20: 62 65 20 63 6f 6e 63 65 72 6e 65 64 20 61 62 6f  be concerned abo
fd30: 75 74 20 63 6f 6e 74 65 6e 74 20 61 6e 64 20 74  ut content and t
fd40: 68 65 20 64 69 73 6b 0a 2a 2a 20 72 65 61 64 20  he disk.** read 
fd50: 73 68 6f 75 6c 64 20 6f 63 63 75 72 20 61 74 20  should occur at 
fd60: 74 68 61 74 20 70 6f 69 6e 74 2e 0a 2a 2f 0a 73  that point..*/.s
fd70: 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 47  tatic int btreeG
fd80: 65 74 50 61 67 65 28 0a 20 20 42 74 53 68 61 72  etPage(.  BtShar
fd90: 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 2f  ed *pBt,       /
fda0: 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20  * The btree */. 
fdb0: 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20   Pgno pgno,     
fdc0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
fdd0: 6f 66 20 74 68 65 20 70 61 67 65 20 74 6f 20 66  of the page to f
fde0: 65 74 63 68 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  etch */.  MemPag
fdf0: 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 2f  e **ppPage,    /
fe00: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70 61 67  * Return the pag
fe10: 65 20 69 6e 20 74 68 69 73 20 70 61 72 61 6d 65  e in this parame
fe20: 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61  ter */.  int fla
fe30: 67 73 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  gs            /*
fe40: 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e   PAGER_GET_NOCON
fe50: 54 45 4e 54 20 6f 72 20 50 41 47 45 52 5f 47 45  TENT or PAGER_GE
fe60: 54 5f 52 45 41 44 4f 4e 4c 59 20 2a 2f 0a 29 7b  T_READONLY */.){
fe70: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 44 62 50  .  int rc;.  DbP
fe80: 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 0a 20  age *pDbPage;.. 
fe90: 20 61 73 73 65 72 74 28 20 66 6c 61 67 73 3d 3d   assert( flags==
fea0: 30 20 7c 7c 20 66 6c 61 67 73 3d 3d 50 41 47 45  0 || flags==PAGE
feb0: 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20  R_GET_NOCONTENT 
fec0: 7c 7c 20 66 6c 61 67 73 3d 3d 50 41 47 45 52 5f  || flags==PAGER_
fed0: 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20 29 3b 0a  GET_READONLY );.
fee0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
fef0: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
ff00: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 63  ->mutex) );.  rc
ff10: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 41   = sqlite3PagerA
ff20: 63 71 75 69 72 65 28 70 42 74 2d 3e 70 50 61 67  cquire(pBt->pPag
ff30: 65 72 2c 20 70 67 6e 6f 2c 20 28 44 62 50 61 67  er, pgno, (DbPag
ff40: 65 2a 2a 29 26 70 44 62 50 61 67 65 2c 20 66 6c  e**)&pDbPage, fl
ff50: 61 67 73 29 3b 0a 20 20 69 66 28 20 72 63 20 29  ags);.  if( rc )
ff60: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 2a 70   return rc;.  *p
ff70: 70 50 61 67 65 20 3d 20 62 74 72 65 65 50 61 67  pPage = btreePag
ff80: 65 46 72 6f 6d 44 62 50 61 67 65 28 70 44 62 50  eFromDbPage(pDbP
ff90: 61 67 65 2c 20 70 67 6e 6f 2c 20 70 42 74 29 3b  age, pgno, pBt);
ffa0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
ffb0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  _OK;.}../*.** Re
ffc0: 74 72 69 65 76 65 20 61 20 70 61 67 65 20 66 72  trieve a page fr
ffd0: 6f 6d 20 74 68 65 20 70 61 67 65 72 20 63 61 63  om the pager cac
ffe0: 68 65 2e 20 49 66 20 74 68 65 20 72 65 71 75 65  he. If the reque
fff0: 73 74 65 64 20 70 61 67 65 20 69 73 20 6e 6f 74  sted page is not
10000 0a 2a 2a 20 61 6c 72 65 61 64 79 20 69 6e 20 74  .** already in t
10010 68 65 20 70 61 67 65 72 20 63 61 63 68 65 20 72  he pager cache r
10020 65 74 75 72 6e 20 4e 55 4c 4c 2e 20 49 6e 69 74  eturn NULL. Init
10030 69 61 6c 69 7a 65 20 74 68 65 20 4d 65 6d 50 61  ialize the MemPa
10040 67 65 2e 70 42 74 20 61 6e 64 0a 2a 2a 20 4d 65  ge.pBt and.** Me
10050 6d 50 61 67 65 2e 61 44 61 74 61 20 65 6c 65 6d  mPage.aData elem
10060 65 6e 74 73 20 69 66 20 6e 65 65 64 65 64 2e 0a  ents if needed..
10070 2a 2f 0a 73 74 61 74 69 63 20 4d 65 6d 50 61 67  */.static MemPag
10080 65 20 2a 62 74 72 65 65 50 61 67 65 4c 6f 6f 6b  e *btreePageLook
10090 75 70 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  up(BtShared *pBt
100a0 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20  , Pgno pgno){.  
100b0 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b  DbPage *pDbPage;
100c0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
100d0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
100e0 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70  t->mutex) );.  p
100f0 44 62 50 61 67 65 20 3d 20 73 71 6c 69 74 65 33  DbPage = sqlite3
10100 50 61 67 65 72 4c 6f 6f 6b 75 70 28 70 42 74 2d  PagerLookup(pBt-
10110 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a  >pPager, pgno);.
10120 20 20 69 66 28 20 70 44 62 50 61 67 65 20 29 7b    if( pDbPage ){
10130 0a 20 20 20 20 72 65 74 75 72 6e 20 62 74 72 65  .    return btre
10140 65 50 61 67 65 46 72 6f 6d 44 62 50 61 67 65 28  ePageFromDbPage(
10150 70 44 62 50 61 67 65 2c 20 70 67 6e 6f 2c 20 70  pDbPage, pgno, p
10160 42 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  Bt);.  }.  retur
10170 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  n 0;.}../*.** Re
10180 74 75 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66  turn the size of
10190 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
101a0 6c 65 20 69 6e 20 70 61 67 65 73 2e 20 49 66 20  le in pages. If 
101b0 74 68 65 72 65 20 69 73 20 61 6e 79 20 6b 69 6e  there is any kin
101c0 64 20 6f 66 0a 2a 2a 20 65 72 72 6f 72 2c 20 72  d of.** error, r
101d0 65 74 75 72 6e 20 28 28 75 6e 73 69 67 6e 65 64  eturn ((unsigned
101e0 20 69 6e 74 29 2d 31 29 2e 0a 2a 2f 0a 73 74 61   int)-1)..*/.sta
101f0 74 69 63 20 50 67 6e 6f 20 62 74 72 65 65 50 61  tic Pgno btreePa
10200 67 65 63 6f 75 6e 74 28 42 74 53 68 61 72 65 64  gecount(BtShared
10210 20 2a 70 42 74 29 7b 0a 20 20 72 65 74 75 72 6e   *pBt){.  return
10220 20 70 42 74 2d 3e 6e 50 61 67 65 3b 0a 7d 0a 75   pBt->nPage;.}.u
10230 33 32 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  32 sqlite3BtreeL
10240 61 73 74 50 61 67 65 28 42 74 72 65 65 20 2a 70  astPage(Btree *p
10250 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ){.  assert( sql
10260 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75  ite3BtreeHoldsMu
10270 74 65 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65  tex(p) );.  asse
10280 72 74 28 20 28 28 70 2d 3e 70 42 74 2d 3e 6e 50  rt( ((p->pBt->nP
10290 61 67 65 29 26 30 78 38 30 30 30 30 30 30 29 3d  age)&0x8000000)=
102a0 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 62  =0 );.  return b
102b0 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 2d  treePagecount(p-
102c0 3e 70 42 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  >pBt);.}../*.** 
102d0 47 65 74 20 61 20 70 61 67 65 20 66 72 6f 6d 20  Get a page from 
102e0 74 68 65 20 70 61 67 65 72 20 61 6e 64 20 69 6e  the pager and in
102f0 69 74 69 61 6c 69 7a 65 20 69 74 2e 0a 2a 2a 0a  itialize it..**.
10300 2a 2a 20 49 66 20 70 43 75 72 21 3d 30 20 74 68  ** If pCur!=0 th
10310 65 6e 20 74 68 65 20 70 61 67 65 20 69 73 20 62  en the page is b
10320 65 69 6e 67 20 66 65 74 63 68 65 64 20 61 73 20  eing fetched as 
10330 70 61 72 74 20 6f 66 20 61 20 6d 6f 76 65 54 6f  part of a moveTo
10340 43 68 69 6c 64 28 29 0a 2a 2a 20 63 61 6c 6c 2e  Child().** call.
10350 20 20 44 6f 20 61 64 64 69 74 69 6f 6e 61 6c 20    Do additional 
10360 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20  sanity checking 
10370 6f 6e 20 74 68 65 20 70 61 67 65 20 69 6e 20 74  on the page in t
10380 68 69 73 20 63 61 73 65 2e 0a 2a 2a 20 41 6e 64  his case..** And
10390 20 69 66 20 74 68 65 20 66 65 74 63 68 20 66 61   if the fetch fa
103a0 69 6c 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  ils, this routin
103b0 65 20 6d 75 73 74 20 64 65 63 72 65 6d 65 6e 74  e must decrement
103c0 20 70 43 75 72 2d 3e 69 50 61 67 65 2e 0a 2a 2a   pCur->iPage..**
103d0 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 69 73 20  .** The page is 
103e0 66 65 74 63 68 65 64 20 61 73 20 72 65 61 64 2d  fetched as read-
103f0 77 72 69 74 65 20 75 6e 6c 65 73 73 20 70 43 75  write unless pCu
10400 72 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 61 6e  r is not NULL an
10410 64 20 69 73 0a 2a 2a 20 61 20 72 65 61 64 2d 6f  d is.** a read-o
10420 6e 6c 79 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a  nly cursor..**.*
10430 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
10440 63 75 72 73 2c 20 74 68 65 6e 20 2a 70 70 50 61  curs, then *ppPa
10450 67 65 20 69 73 20 75 6e 64 65 66 69 6e 65 64 2e  ge is undefined.
10460 20 49 74 0a 2a 2a 20 6d 61 79 20 72 65 6d 61 69   It.** may remai
10470 6e 20 75 6e 63 68 61 6e 67 65 64 2c 20 6f 72 20  n unchanged, or 
10480 69 74 20 6d 61 79 20 62 65 20 73 65 74 20 74 6f  it may be set to
10490 20 61 6e 20 69 6e 76 61 6c 69 64 20 76 61 6c 75   an invalid valu
104a0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
104b0 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28   getAndInitPage(
104c0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
104d0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
104e0 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
104f0 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e  se file */.  Pgn
10500 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20  o pgno,         
10510 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10520 4e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70 61  Number of the pa
10530 67 65 20 74 6f 20 67 65 74 20 2a 2f 0a 20 20 4d  ge to get */.  M
10540 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c  emPage **ppPage,
10550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
10560 2a 20 57 72 69 74 65 20 74 68 65 20 70 61 67 65  * Write the page
10570 20 70 6f 69 6e 74 65 72 20 68 65 72 65 20 2a 2f   pointer here */
10580 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
10590 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r,              
105a0 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 74 6f 20     /* Cursor to 
105b0 72 65 63 65 69 76 65 20 74 68 65 20 70 61 67 65  receive the page
105c0 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69  , or NULL */.  i
105d0 6e 74 20 62 52 65 61 64 4f 6e 6c 79 20 20 20 20  nt bReadOnly    
105e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
105f0 2a 20 54 72 75 65 20 66 6f 72 20 61 20 72 65 61  * True for a rea
10600 64 2d 6f 6e 6c 79 20 70 61 67 65 20 2a 2f 0a 29  d-only page */.)
10610 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 44 62  {.  int rc;.  Db
10620 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 20  Page *pDbPage;. 
10630 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
10640 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
10650 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
10660 65 72 74 28 20 70 43 75 72 3d 3d 30 20 7c 7c 20  ert( pCur==0 || 
10670 70 70 50 61 67 65 3d 3d 26 70 43 75 72 2d 3e 61  ppPage==&pCur->a
10680 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
10690 65 5d 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  e] );.  assert( 
106a0 70 43 75 72 3d 3d 30 20 7c 7c 20 62 52 65 61 64  pCur==0 || bRead
106b0 4f 6e 6c 79 3d 3d 70 43 75 72 2d 3e 63 75 72 50  Only==pCur->curP
106c0 61 67 65 72 46 6c 61 67 73 20 29 3b 0a 20 20 61  agerFlags );.  a
106d0 73 73 65 72 74 28 20 70 43 75 72 3d 3d 30 20 7c  ssert( pCur==0 |
106e0 7c 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 30 20  | pCur->iPage>0 
106f0 29 3b 0a 0a 20 20 69 66 28 20 70 67 6e 6f 3e 62  );..  if( pgno>b
10700 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42  treePagecount(pB
10710 74 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  t) ){.    rc = S
10720 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
10730 50 54 3b 0a 20 20 20 20 67 6f 74 6f 20 67 65 74  PT;.    goto get
10740 41 6e 64 49 6e 69 74 50 61 67 65 5f 65 72 72 6f  AndInitPage_erro
10750 72 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71  r;.  }.  rc = sq
10760 6c 69 74 65 33 50 61 67 65 72 41 63 71 75 69 72  lite3PagerAcquir
10770 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70  e(pBt->pPager, p
10780 67 6e 6f 2c 20 28 44 62 50 61 67 65 2a 2a 29 26  gno, (DbPage**)&
10790 70 44 62 50 61 67 65 2c 20 62 52 65 61 64 4f 6e  pDbPage, bReadOn
107a0 6c 79 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  ly);.  if( rc ){
107b0 0a 20 20 20 20 67 6f 74 6f 20 67 65 74 41 6e 64  .    goto getAnd
107c0 49 6e 69 74 50 61 67 65 5f 65 72 72 6f 72 3b 0a  InitPage_error;.
107d0 20 20 7d 0a 20 20 2a 70 70 50 61 67 65 20 3d 20    }.  *ppPage = 
107e0 62 74 72 65 65 50 61 67 65 46 72 6f 6d 44 62 50  btreePageFromDbP
107f0 61 67 65 28 70 44 62 50 61 67 65 2c 20 70 67 6e  age(pDbPage, pgn
10800 6f 2c 20 70 42 74 29 3b 0a 20 20 69 66 28 20 28  o, pBt);.  if( (
10810 2a 70 70 50 61 67 65 29 2d 3e 69 73 49 6e 69 74  *ppPage)->isInit
10820 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ==0 ){.    rc = 
10830 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 2a 70  btreeInitPage(*p
10840 70 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  pPage);.    if( 
10850 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
10860 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
10870 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20  ge(*ppPage);.   
10880 20 20 20 67 6f 74 6f 20 67 65 74 41 6e 64 49 6e     goto getAndIn
10890 69 74 50 61 67 65 5f 65 72 72 6f 72 3b 0a 20 20  itPage_error;.  
108a0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66    }.  }..  /* If
108b0 20 6f 62 74 61 69 6e 69 6e 67 20 61 20 63 68 69   obtaining a chi
108c0 6c 64 20 70 61 67 65 20 66 6f 72 20 61 20 63 75  ld page for a cu
108d0 72 73 6f 72 2c 20 77 65 20 6d 75 73 74 20 76 65  rsor, we must ve
108e0 72 69 66 79 20 74 68 61 74 20 74 68 65 20 70 61  rify that the pa
108f0 67 65 20 69 73 0a 20 20 2a 2a 20 63 6f 6d 70 61  ge is.  ** compa
10900 74 69 62 6c 65 20 77 69 74 68 20 74 68 65 20 72  tible with the r
10910 6f 6f 74 20 70 61 67 65 2e 20 2a 2f 0a 20 20 69  oot page. */.  i
10920 66 28 20 70 43 75 72 0a 20 20 20 26 26 20 28 28  f( pCur.   && ((
10930 2a 70 70 50 61 67 65 29 2d 3e 6e 43 65 6c 6c 3c  *ppPage)->nCell<
10940 31 20 7c 7c 20 28 2a 70 70 50 61 67 65 29 2d 3e  1 || (*ppPage)->
10950 69 6e 74 4b 65 79 21 3d 70 43 75 72 2d 3e 63 75  intKey!=pCur->cu
10960 72 49 6e 74 4b 65 79 29 0a 20 20 29 7b 0a 20 20  rIntKey).  ){.  
10970 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
10980 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
10990 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50  releasePage(*ppP
109a0 61 67 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 67  age);.    goto g
109b0 65 74 41 6e 64 49 6e 69 74 50 61 67 65 5f 65 72  etAndInitPage_er
109c0 72 6f 72 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ror;.  }.  retur
109d0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 67 65  n SQLITE_OK;..ge
109e0 74 41 6e 64 49 6e 69 74 50 61 67 65 5f 65 72 72  tAndInitPage_err
109f0 6f 72 3a 0a 20 20 69 66 28 20 70 43 75 72 20 29  or:.  if( pCur )
10a00 20 70 43 75 72 2d 3e 69 50 61 67 65 2d 2d 3b 0a   pCur->iPage--;.
10a10 20 20 74 65 73 74 63 61 73 65 28 20 70 67 6e 6f    testcase( pgno
10a20 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
10a30 20 70 67 6e 6f 21 3d 30 20 7c 7c 20 72 63 3d 3d   pgno!=0 || rc==
10a40 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 29  SQLITE_CORRUPT )
10a50 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
10a60 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20  ../*.** Release 
10a70 61 20 4d 65 6d 50 61 67 65 2e 20 20 54 68 69 73  a MemPage.  This
10a80 20 73 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65   should be calle
10a90 64 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20  d once for each 
10aa0 70 72 69 6f 72 0a 2a 2a 20 63 61 6c 6c 20 74 6f  prior.** call to
10ab0 20 62 74 72 65 65 47 65 74 50 61 67 65 2e 0a 2a   btreeGetPage..*
10ac0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65  /.static void re
10ad0 6c 65 61 73 65 50 61 67 65 4e 6f 74 4e 75 6c 6c  leasePageNotNull
10ae0 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29  (MemPage *pPage)
10af0 7b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  {.  assert( pPag
10b00 65 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 61 73  e->aData );.  as
10b10 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74  sert( pPage->pBt
10b20 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
10b30 61 67 65 2d 3e 70 44 62 50 61 67 65 21 3d 30 20  age->pDbPage!=0 
10b40 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
10b50 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72  ite3PagerGetExtr
10b60 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  a(pPage->pDbPage
10b70 29 20 3d 3d 20 28 76 6f 69 64 2a 29 70 50 61 67  ) == (void*)pPag
10b80 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  e );.  assert( s
10b90 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61  qlite3PagerGetDa
10ba0 74 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  ta(pPage->pDbPag
10bb0 65 29 3d 3d 70 50 61 67 65 2d 3e 61 44 61 74 61  e)==pPage->aData
10bc0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
10bd0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
10be0 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
10bf0 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  ex) );.  sqlite3
10c00 50 61 67 65 72 55 6e 72 65 66 4e 6f 74 4e 75 6c  PagerUnrefNotNul
10c10 6c 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  l(pPage->pDbPage
10c20 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64  );.}.static void
10c30 20 72 65 6c 65 61 73 65 50 61 67 65 28 4d 65 6d   releasePage(Mem
10c40 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20  Page *pPage){.  
10c50 69 66 28 20 70 50 61 67 65 20 29 20 72 65 6c 65  if( pPage ) rele
10c60 61 73 65 50 61 67 65 4e 6f 74 4e 75 6c 6c 28 70  asePageNotNull(p
10c70 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Page);.}../*.** 
10c80 47 65 74 20 61 6e 20 75 6e 75 73 65 64 20 70 61  Get an unused pa
10c90 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77  ge..**.** This w
10ca0 6f 72 6b 73 20 6a 75 73 74 20 6c 69 6b 65 20 62  orks just like b
10cb0 74 72 65 65 47 65 74 50 61 67 65 28 29 20 77 69  treeGetPage() wi
10cc0 74 68 20 74 68 65 20 61 64 64 69 74 69 6f 6e 3a  th the addition:
10cd0 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 49 66 20 74  .**.**   *  If t
10ce0 68 65 20 70 61 67 65 20 69 73 20 61 6c 72 65 61  he page is alrea
10cf0 64 79 20 69 6e 20 75 73 65 20 66 6f 72 20 73 6f  dy in use for so
10d00 6d 65 20 6f 74 68 65 72 20 70 75 72 70 6f 73 65  me other purpose
10d10 2c 20 69 6d 6d 65 64 69 61 74 65 6c 79 0a 2a 2a  , immediately.**
10d20 20 20 20 20 20 20 72 65 6c 65 61 73 65 20 69 74        release it
10d30 20 61 6e 64 20 72 65 74 75 72 6e 20 61 6e 20 53   and return an S
10d40 51 4c 49 54 45 5f 43 55 52 52 55 50 54 20 65 72  QLITE_CURRUPT er
10d50 72 6f 72 2e 0a 2a 2a 20 20 20 2a 20 20 4d 61 6b  ror..**   *  Mak
10d60 65 20 73 75 72 65 20 74 68 65 20 69 73 49 6e 69  e sure the isIni
10d70 74 20 66 6c 61 67 20 69 73 20 63 6c 65 61 72 0a  t flag is clear.
10d80 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74  */.static int bt
10d90 72 65 65 47 65 74 55 6e 75 73 65 64 50 61 67 65  reeGetUnusedPage
10da0 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  (.  BtShared *pB
10db0 74 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  t,       /* The 
10dc0 62 74 72 65 65 20 2a 2f 0a 20 20 50 67 6e 6f 20  btree */.  Pgno 
10dd0 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20  pgno,           
10de0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 68 65  /* Number of the
10df0 20 70 61 67 65 20 74 6f 20 66 65 74 63 68 20 2a   page to fetch *
10e00 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70  /.  MemPage **pp
10e10 50 61 67 65 2c 20 20 20 20 2f 2a 20 52 65 74 75  Page,    /* Retu
10e20 72 6e 20 74 68 65 20 70 61 67 65 20 69 6e 20 74  rn the page in t
10e30 68 69 73 20 70 61 72 61 6d 65 74 65 72 20 2a 2f  his parameter */
10e40 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20  .  int flags    
10e50 20 20 20 20 20 20 20 20 2f 2a 20 50 41 47 45 52          /* PAGER
10e60 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 6f  _GET_NOCONTENT o
10e70 72 20 50 41 47 45 52 5f 47 45 54 5f 52 45 41 44  r PAGER_GET_READ
10e80 4f 4e 4c 59 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ONLY */.){.  int
10e90 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61   rc = btreeGetPa
10ea0 67 65 28 70 42 74 2c 20 70 67 6e 6f 2c 20 70 70  ge(pBt, pgno, pp
10eb0 50 61 67 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20  Page, flags);.  
10ec0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
10ed0 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c  K ){.    if( sql
10ee0 69 74 65 33 50 61 67 65 72 50 61 67 65 52 65 66  ite3PagerPageRef
10ef0 63 6f 75 6e 74 28 28 2a 70 70 50 61 67 65 29 2d  count((*ppPage)-
10f00 3e 70 44 62 50 61 67 65 29 3e 31 20 29 7b 0a 20  >pDbPage)>1 ){. 
10f10 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
10f20 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20 20  (*ppPage);.     
10f30 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20   *ppPage = 0;.  
10f40 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
10f50 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
10f60 20 20 20 20 7d 0a 20 20 20 20 28 2a 70 70 50 61      }.    (*ppPa
10f70 67 65 29 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b  ge)->isInit = 0;
10f80 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70  .  }else{.    *p
10f90 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 7d 0a 20  pPage = 0;.  }. 
10fa0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
10fb0 2f 2a 0a 2a 2a 20 44 75 72 69 6e 67 20 61 20 72  /*.** During a r
10fc0 6f 6c 6c 62 61 63 6b 2c 20 77 68 65 6e 20 74 68  ollback, when th
10fd0 65 20 70 61 67 65 72 20 72 65 6c 6f 61 64 73 20  e pager reloads 
10fe0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 74 6f  information into
10ff0 20 74 68 65 20 63 61 63 68 65 0a 2a 2a 20 73 6f   the cache.** so
11000 20 74 68 61 74 20 74 68 65 20 63 61 63 68 65 20   that the cache 
11010 69 73 20 72 65 73 74 6f 72 65 64 20 74 6f 20 69  is restored to i
11020 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 74 61 74  ts original stat
11030 65 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  e at the start o
11040 66 0a 2a 2a 20 74 68 65 20 74 72 61 6e 73 61 63  f.** the transac
11050 74 69 6f 6e 2c 20 66 6f 72 20 65 61 63 68 20 70  tion, for each p
11060 61 67 65 20 72 65 73 74 6f 72 65 64 20 74 68 69  age restored thi
11070 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
11080 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  led..**.** This 
11090 72 6f 75 74 69 6e 65 20 6e 65 65 64 73 20 74 6f  routine needs to
110a0 20 72 65 73 65 74 20 74 68 65 20 65 78 74 72 61   reset the extra
110b0 20 64 61 74 61 20 73 65 63 74 69 6f 6e 20 61 74   data section at
110c0 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a   the end of the.
110d0 2a 2a 20 70 61 67 65 20 74 6f 20 61 67 72 65 65  ** page to agree
110e0 20 77 69 74 68 20 74 68 65 20 72 65 73 74 6f 72   with the restor
110f0 65 64 20 64 61 74 61 2e 0a 2a 2f 0a 73 74 61 74  ed data..*/.stat
11100 69 63 20 76 6f 69 64 20 70 61 67 65 52 65 69 6e  ic void pageRein
11110 69 74 28 44 62 50 61 67 65 20 2a 70 44 61 74 61  it(DbPage *pData
11120 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  ){.  MemPage *pP
11130 61 67 65 3b 0a 20 20 70 50 61 67 65 20 3d 20 28  age;.  pPage = (
11140 4d 65 6d 50 61 67 65 20 2a 29 73 71 6c 69 74 65  MemPage *)sqlite
11150 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70  3PagerGetExtra(p
11160 44 61 74 61 29 3b 0a 20 20 61 73 73 65 72 74 28  Data);.  assert(
11170 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
11180 65 52 65 66 63 6f 75 6e 74 28 70 44 61 74 61 29  eRefcount(pData)
11190 3e 30 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67  >0 );.  if( pPag
111a0 65 2d 3e 69 73 49 6e 69 74 20 29 7b 0a 20 20 20  e->isInit ){.   
111b0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
111c0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
111d0 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
111e0 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49  ;.    pPage->isI
111f0 6e 69 74 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  nit = 0;.    if(
11200 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
11210 65 52 65 66 63 6f 75 6e 74 28 70 44 61 74 61 29  eRefcount(pData)
11220 3e 31 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 70  >1 ){.      /* p
11230 50 61 67 65 20 6d 69 67 68 74 20 6e 6f 74 20 62  Page might not b
11240 65 20 61 20 62 74 72 65 65 20 70 61 67 65 3b 20  e a btree page; 
11250 20 69 74 20 6d 69 67 68 74 20 62 65 20 61 6e 20   it might be an 
11260 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 0a 20 20  overflow page.  
11270 20 20 20 20 2a 2a 20 6f 72 20 70 74 72 6d 61 70      ** or ptrmap
11280 20 70 61 67 65 20 6f 72 20 61 20 66 72 65 65 20   page or a free 
11290 70 61 67 65 2e 20 20 49 6e 20 74 68 6f 73 65 20  page.  In those 
112a0 63 61 73 65 73 2c 20 74 68 65 20 66 6f 6c 6c 6f  cases, the follo
112b0 77 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 63 61  wing.      ** ca
112c0 6c 6c 20 74 6f 20 62 74 72 65 65 49 6e 69 74 50  ll to btreeInitP
112d0 61 67 65 28 29 20 77 69 6c 6c 20 6c 69 6b 65 6c  age() will likel
112e0 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  y return SQLITE_
112f0 43 4f 52 52 55 50 54 2e 0a 20 20 20 20 20 20 2a  CORRUPT..      *
11300 2a 20 42 75 74 20 6e 6f 20 68 61 72 6d 20 69 73  * But no harm is
11310 20 64 6f 6e 65 20 62 79 20 74 68 69 73 2e 20 20   done by this.  
11320 41 6e 64 20 69 74 20 69 73 20 76 65 72 79 20 69  And it is very i
11330 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 0a 20 20  mportant that.  
11340 20 20 20 20 2a 2a 20 62 74 72 65 65 49 6e 69 74      ** btreeInit
11350 50 61 67 65 28 29 20 62 65 20 63 61 6c 6c 65 64  Page() be called
11360 20 6f 6e 20 65 76 65 72 79 20 62 74 72 65 65 20   on every btree 
11370 70 61 67 65 20 73 6f 20 77 65 20 6d 61 6b 65 0a  page so we make.
11380 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63 61 6c        ** the cal
11390 6c 20 66 6f 72 20 65 76 65 72 79 20 70 61 67 65  l for every page
113a0 20 74 68 61 74 20 63 6f 6d 65 73 20 69 6e 20 66   that comes in f
113b0 6f 72 20 72 65 2d 69 6e 69 74 69 6e 67 2e 20 2a  or re-initing. *
113c0 2f 0a 20 20 20 20 20 20 62 74 72 65 65 49 6e 69  /.      btreeIni
113d0 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  tPage(pPage);.  
113e0 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
113f0 20 49 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79   Invoke the busy
11400 20 68 61 6e 64 6c 65 72 20 66 6f 72 20 61 20 62   handler for a b
11410 74 72 65 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tree..*/.static 
11420 69 6e 74 20 62 74 72 65 65 49 6e 76 6f 6b 65 42  int btreeInvokeB
11430 75 73 79 48 61 6e 64 6c 65 72 28 76 6f 69 64 20  usyHandler(void 
11440 2a 70 41 72 67 29 7b 0a 20 20 42 74 53 68 61 72  *pArg){.  BtShar
11450 65 64 20 2a 70 42 74 20 3d 20 28 42 74 53 68 61  ed *pBt = (BtSha
11460 72 65 64 2a 29 70 41 72 67 3b 0a 20 20 61 73 73  red*)pArg;.  ass
11470 65 72 74 28 20 70 42 74 2d 3e 64 62 20 29 3b 0a  ert( pBt->db );.
11480 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
11490 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
114a0 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  ->db->mutex) );.
114b0 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
114c0 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65  InvokeBusyHandle
114d0 72 28 26 70 42 74 2d 3e 64 62 2d 3e 62 75 73 79  r(&pBt->db->busy
114e0 48 61 6e 64 6c 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a  Handler);.}../*.
114f0 2a 2a 20 4f 70 65 6e 20 61 20 64 61 74 61 62 61  ** Open a databa
11500 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20  se file..** .** 
11510 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 74 68 65  zFilename is the
11520 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74   name of the dat
11530 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20  abase file.  If 
11540 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55 4c  zFilename is NUL
11550 4c 0a 2a 2a 20 74 68 65 6e 20 61 6e 20 65 70 68  L.** then an eph
11560 65 6d 65 72 61 6c 20 64 61 74 61 62 61 73 65 20  emeral database 
11570 69 73 20 63 72 65 61 74 65 64 2e 20 20 54 68 65  is created.  The
11580 20 65 70 68 65 6d 65 72 61 6c 20 64 61 74 61 62   ephemeral datab
11590 61 73 65 20 6d 69 67 68 74 0a 2a 2a 20 62 65 20  ase might.** be 
115a0 65 78 63 6c 75 73 69 76 65 6c 79 20 69 6e 20 6d  exclusively in m
115b0 65 6d 6f 72 79 2c 20 6f 72 20 69 74 20 6d 69 67  emory, or it mig
115c0 68 74 20 75 73 65 20 61 20 64 69 73 6b 2d 62 61  ht use a disk-ba
115d0 73 65 64 20 6d 65 6d 6f 72 79 20 63 61 63 68 65  sed memory cache
115e0 2e 0a 2a 2a 20 45 69 74 68 65 72 20 77 61 79 2c  ..** Either way,
115f0 20 74 68 65 20 65 70 68 65 6d 65 72 61 6c 20 64   the ephemeral d
11600 61 74 61 62 61 73 65 20 77 69 6c 6c 20 62 65 20  atabase will be 
11610 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65  automatically de
11620 6c 65 74 65 64 20 0a 2a 2a 20 77 68 65 6e 20 73  leted .** when s
11630 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65  qlite3BtreeClose
11640 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a  () is called..**
11650 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65  .** If zFilename
11660 20 69 73 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 74   is ":memory:" t
11670 68 65 6e 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  hen an in-memory
11680 20 64 61 74 61 62 61 73 65 20 69 73 20 63 72 65   database is cre
11690 61 74 65 64 0a 2a 2a 20 74 68 61 74 20 69 73 20  ated.** that is 
116a0 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65  automatically de
116b0 73 74 72 6f 79 65 64 20 77 68 65 6e 20 69 74 20  stroyed when it 
116c0 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a  is closed..**.**
116d0 20 54 68 65 20 22 66 6c 61 67 73 22 20 70 61 72   The "flags" par
116e0 61 6d 65 74 65 72 20 69 73 20 61 20 62 69 74 6d  ameter is a bitm
116f0 61 73 6b 20 74 68 61 74 20 6d 69 67 68 74 20 63  ask that might c
11700 6f 6e 74 61 69 6e 20 62 69 74 73 20 6c 69 6b 65  ontain bits like
11710 0a 2a 2a 20 42 54 52 45 45 5f 4f 4d 49 54 5f 4a  .** BTREE_OMIT_J
11720 4f 55 52 4e 41 4c 20 61 6e 64 2f 6f 72 20 42 54  OURNAL and/or BT
11730 52 45 45 5f 4d 45 4d 4f 52 59 2e 0a 2a 2a 0a 2a  REE_MEMORY..**.*
11740 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73  * If the databas
11750 65 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65  e is already ope
11760 6e 65 64 20 69 6e 20 74 68 65 20 73 61 6d 65 20  ned in the same 
11770 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
11780 69 6f 6e 0a 2a 2a 20 61 6e 64 20 77 65 20 61 72  ion.** and we ar
11790 65 20 69 6e 20 73 68 61 72 65 64 20 63 61 63 68  e in shared cach
117a0 65 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68 65  e mode, then the
117b0 20 6f 70 65 6e 20 77 69 6c 6c 20 66 61 69 6c 20   open will fail 
117c0 77 69 74 68 20 61 6e 0a 2a 2a 20 53 51 4c 49 54  with an.** SQLIT
117d0 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 65 72 72  E_CONSTRAINT err
117e0 6f 72 2e 20 20 57 65 20 63 61 6e 6e 6f 74 20 61  or.  We cannot a
117f0 6c 6c 6f 77 20 74 77 6f 20 6f 72 20 6d 6f 72 65  llow two or more
11800 20 42 74 53 68 61 72 65 64 0a 2a 2a 20 6f 62 6a   BtShared.** obj
11810 65 63 74 73 20 69 6e 20 74 68 65 20 73 61 6d 65  ects in the same
11820 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
11830 74 69 6f 6e 20 73 69 6e 63 65 20 64 6f 69 6e 67  tion since doing
11840 20 73 6f 20 77 69 6c 6c 20 6c 65 61 64 0a 2a 2a   so will lead.**
11850 20 74 6f 20 70 72 6f 62 6c 65 6d 73 20 77 69 74   to problems wit
11860 68 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2f 0a 69 6e  h locking..*/.in
11870 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4f 70  t sqlite3BtreeOp
11880 65 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  en(.  sqlite3_vf
11890 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20 2f 2a  s *pVfs,      /*
118a0 20 56 46 53 20 74 6f 20 75 73 65 20 66 6f 72 20   VFS to use for 
118b0 74 68 69 73 20 62 2d 74 72 65 65 20 2a 2f 0a 20  this b-tree */. 
118c0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69   const char *zFi
118d0 6c 65 6e 61 6d 65 2c 20 20 2f 2a 20 4e 61 6d 65  lename,  /* Name
118e0 20 6f 66 20 74 68 65 20 66 69 6c 65 20 63 6f 6e   of the file con
118f0 74 61 69 6e 69 6e 67 20 74 68 65 20 42 54 72 65  taining the BTre
11900 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  e database */.  
11910 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
11920 20 20 20 20 20 20 20 20 2f 2a 20 41 73 73 6f 63          /* Assoc
11930 69 61 74 65 64 20 64 61 74 61 62 61 73 65 20 68  iated database h
11940 61 6e 64 6c 65 20 2a 2f 0a 20 20 42 74 72 65 65  andle */.  Btree
11950 20 2a 2a 70 70 42 74 72 65 65 2c 20 20 20 20 20   **ppBtree,     
11960 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
11970 20 6e 65 77 20 42 74 72 65 65 20 6f 62 6a 65 63   new Btree objec
11980 74 20 77 72 69 74 74 65 6e 20 68 65 72 65 20 2a  t written here *
11990 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20  /.  int flags,  
119a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
119b0 70 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20  ptions */.  int 
119c0 76 66 73 46 6c 61 67 73 20 20 20 20 20 20 20 20  vfsFlags        
119d0 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 70 61 73      /* Flags pas
119e0 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f 20 73  sed through to s
119f0 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70 65 6e  qlite3_vfs.xOpen
11a00 28 29 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68 61  () */.){.  BtSha
11a10 72 65 64 20 2a 70 42 74 20 3d 20 30 3b 20 20 20  red *pBt = 0;   
11a20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 68 61            /* Sha
11a30 72 65 64 20 70 61 72 74 20 6f 66 20 62 74 72 65  red part of btre
11a40 65 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20  e structure */. 
11a50 20 42 74 72 65 65 20 2a 70 3b 20 20 20 20 20 20   Btree *p;      
11a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11a70 2f 2a 20 48 61 6e 64 6c 65 20 74 6f 20 72 65 74  /* Handle to ret
11a80 75 72 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  urn */.  sqlite3
11a90 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 4f 70 65  _mutex *mutexOpe
11aa0 6e 20 3d 20 30 3b 20 20 2f 2a 20 50 72 65 76 65  n = 0;  /* Preve
11ab0 6e 74 73 20 61 20 72 61 63 65 20 63 6f 6e 64 69  nts a race condi
11ac0 74 69 6f 6e 2e 20 54 69 63 6b 65 74 20 23 33 35  tion. Ticket #35
11ad0 33 37 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  37 */.  int rc =
11ae0 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
11af0 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
11b00 20 63 6f 64 65 20 66 72 6f 6d 20 74 68 69 73 20   code from this 
11b10 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 75 38  function */.  u8
11b20 20 6e 52 65 73 65 72 76 65 3b 20 20 20 20 20 20   nReserve;      
11b30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11b40 42 79 74 65 20 6f 66 20 75 6e 75 73 65 64 20 73  Byte of unused s
11b50 70 61 63 65 20 6f 6e 20 65 61 63 68 20 70 61 67  pace on each pag
11b60 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  e */.  unsigned 
11b70 63 68 61 72 20 7a 44 62 48 65 61 64 65 72 5b 31  char zDbHeader[1
11b80 30 30 5d 3b 20 20 2f 2a 20 44 61 74 61 62 61 73  00];  /* Databas
11b90 65 20 68 65 61 64 65 72 20 63 6f 6e 74 65 6e 74  e header content
11ba0 20 2a 2f 0a 0a 20 20 2f 2a 20 54 72 75 65 20 69   */..  /* True i
11bb0 66 20 6f 70 65 6e 69 6e 67 20 61 6e 20 65 70 68  f opening an eph
11bc0 65 6d 65 72 61 6c 2c 20 74 65 6d 70 6f 72 61 72  emeral, temporar
11bd0 79 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  y database */.  
11be0 63 6f 6e 73 74 20 69 6e 74 20 69 73 54 65 6d 70  const int isTemp
11bf0 44 62 20 3d 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d  Db = zFilename==
11c00 30 20 7c 7c 20 7a 46 69 6c 65 6e 61 6d 65 5b 30  0 || zFilename[0
11c10 5d 3d 3d 30 3b 0a 0a 20 20 2f 2a 20 53 65 74 20  ]==0;..  /* Set 
11c20 74 68 65 20 76 61 72 69 61 62 6c 65 20 69 73 4d  the variable isM
11c30 65 6d 64 62 20 74 6f 20 74 72 75 65 20 66 6f 72  emdb to true for
11c40 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61   an in-memory da
11c50 74 61 62 61 73 65 2c 20 6f 72 20 0a 20 20 2a 2a  tabase, or .  **
11c60 20 66 61 6c 73 65 20 66 6f 72 20 61 20 66 69 6c   false for a fil
11c70 65 2d 62 61 73 65 64 20 64 61 74 61 62 61 73 65  e-based database
11c80 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  ..  */.#ifdef SQ
11c90 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59  LITE_OMIT_MEMORY
11ca0 44 42 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 69  DB.  const int i
11cb0 73 4d 65 6d 64 62 20 3d 20 30 3b 0a 23 65 6c 73  sMemdb = 0;.#els
11cc0 65 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 73  e.  const int is
11cd0 4d 65 6d 64 62 20 3d 20 28 7a 46 69 6c 65 6e 61  Memdb = (zFilena
11ce0 6d 65 20 26 26 20 73 74 72 63 6d 70 28 7a 46 69  me && strcmp(zFi
11cf0 6c 65 6e 61 6d 65 2c 20 22 3a 6d 65 6d 6f 72 79  lename, ":memory
11d00 3a 22 29 3d 3d 30 29 0a 20 20 20 20 20 20 20 20  :")==0).        
11d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
11d20 7c 20 28 69 73 54 65 6d 70 44 62 20 26 26 20 73  | (isTempDb && s
11d30 71 6c 69 74 65 33 54 65 6d 70 49 6e 4d 65 6d 6f  qlite3TempInMemo
11d40 72 79 28 64 62 29 29 0a 20 20 20 20 20 20 20 20  ry(db)).        
11d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
11d60 7c 20 28 76 66 73 46 6c 61 67 73 20 26 20 53 51  | (vfsFlags & SQ
11d70 4c 49 54 45 5f 4f 50 45 4e 5f 4d 45 4d 4f 52 59  LITE_OPEN_MEMORY
11d80 29 21 3d 30 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  )!=0;.#endif..  
11d90 61 73 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b  assert( db!=0 );
11da0 0a 20 20 61 73 73 65 72 74 28 20 70 56 66 73 21  .  assert( pVfs!
11db0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
11dc0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
11dd0 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  ld(db->mutex) );
11de0 0a 20 20 61 73 73 65 72 74 28 20 28 66 6c 61 67  .  assert( (flag
11df0 73 26 30 78 66 66 29 3d 3d 66 6c 61 67 73 20 29  s&0xff)==flags )
11e00 3b 20 20 20 2f 2a 20 66 6c 61 67 73 20 66 69 74  ;   /* flags fit
11e10 20 69 6e 20 38 20 62 69 74 73 20 2a 2f 0a 0a 20   in 8 bits */.. 
11e20 20 2f 2a 20 4f 6e 6c 79 20 61 20 42 54 52 45 45   /* Only a BTREE
11e30 5f 53 49 4e 47 4c 45 20 64 61 74 61 62 61 73 65  _SINGLE database
11e40 20 63 61 6e 20 62 65 20 42 54 52 45 45 5f 55 4e   can be BTREE_UN
11e50 4f 52 44 45 52 45 44 20 2a 2f 0a 20 20 61 73 73  ORDERED */.  ass
11e60 65 72 74 28 20 28 66 6c 61 67 73 20 26 20 42 54  ert( (flags & BT
11e70 52 45 45 5f 55 4e 4f 52 44 45 52 45 44 29 3d 3d  REE_UNORDERED)==
11e80 30 20 7c 7c 20 28 66 6c 61 67 73 20 26 20 42 54  0 || (flags & BT
11e90 52 45 45 5f 53 49 4e 47 4c 45 29 21 3d 30 20 29  REE_SINGLE)!=0 )
11ea0 3b 0a 0a 20 20 2f 2a 20 41 20 42 54 52 45 45 5f  ;..  /* A BTREE_
11eb0 53 49 4e 47 4c 45 20 64 61 74 61 62 61 73 65 20  SINGLE database 
11ec0 69 73 20 61 6c 77 61 79 73 20 61 20 74 65 6d 70  is always a temp
11ed0 6f 72 61 72 79 20 61 6e 64 2f 6f 72 20 65 70 68  orary and/or eph
11ee0 65 6d 65 72 61 6c 20 2a 2f 0a 20 20 61 73 73 65  emeral */.  asse
11ef0 72 74 28 20 28 66 6c 61 67 73 20 26 20 42 54 52  rt( (flags & BTR
11f00 45 45 5f 53 49 4e 47 4c 45 29 3d 3d 30 20 7c 7c  EE_SINGLE)==0 ||
11f10 20 69 73 54 65 6d 70 44 62 20 29 3b 0a 0a 20 20   isTempDb );..  
11f20 69 66 28 20 69 73 4d 65 6d 64 62 20 29 7b 0a 20  if( isMemdb ){. 
11f30 20 20 20 66 6c 61 67 73 20 7c 3d 20 42 54 52 45     flags |= BTRE
11f40 45 5f 4d 45 4d 4f 52 59 3b 0a 20 20 7d 0a 20 20  E_MEMORY;.  }.  
11f50 69 66 28 20 28 76 66 73 46 6c 61 67 73 20 26 20  if( (vfsFlags & 
11f60 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
11f70 5f 44 42 29 21 3d 30 20 26 26 20 28 69 73 4d 65  _DB)!=0 && (isMe
11f80 6d 64 62 20 7c 7c 20 69 73 54 65 6d 70 44 62 29  mdb || isTempDb)
11f90 20 29 7b 0a 20 20 20 20 76 66 73 46 6c 61 67 73   ){.    vfsFlags
11fa0 20 3d 20 28 76 66 73 46 6c 61 67 73 20 26 20 7e   = (vfsFlags & ~
11fb0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
11fc0 5f 44 42 29 20 7c 20 53 51 4c 49 54 45 5f 4f 50  _DB) | SQLITE_OP
11fd0 45 4e 5f 54 45 4d 50 5f 44 42 3b 0a 20 20 7d 0a  EN_TEMP_DB;.  }.
11fe0 20 20 70 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c    p = sqlite3Mal
11ff0 6c 6f 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28 42  locZero(sizeof(B
12000 74 72 65 65 29 29 3b 0a 20 20 69 66 28 20 21 70  tree));.  if( !p
12010 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
12020 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
12030 0a 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20  .  p->inTrans = 
12040 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 70 2d  TRANS_NONE;.  p-
12050 3e 64 62 20 3d 20 64 62 3b 0a 23 69 66 6e 64 65  >db = db;.#ifnde
12060 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  f SQLITE_OMIT_SH
12070 41 52 45 44 5f 43 41 43 48 45 0a 20 20 70 2d 3e  ARED_CACHE.  p->
12080 6c 6f 63 6b 2e 70 42 74 72 65 65 20 3d 20 70 3b  lock.pBtree = p;
12090 0a 20 20 70 2d 3e 6c 6f 63 6b 2e 69 54 61 62 6c  .  p->lock.iTabl
120a0 65 20 3d 20 31 3b 0a 23 65 6e 64 69 66 0a 0a 23  e = 1;.#endif..#
120b0 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
120c0 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
120d0 41 43 48 45 29 20 26 26 20 21 64 65 66 69 6e 65  ACHE) && !define
120e0 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49  d(SQLITE_OMIT_DI
120f0 53 4b 49 4f 29 0a 20 20 2f 2a 0a 20 20 2a 2a 20  SKIO).  /*.  ** 
12100 49 66 20 74 68 69 73 20 42 74 72 65 65 20 69 73  If this Btree is
12110 20 61 20 63 61 6e 64 69 64 61 74 65 20 66 6f 72   a candidate for
12120 20 73 68 61 72 65 64 20 63 61 63 68 65 2c 20 74   shared cache, t
12130 72 79 20 74 6f 20 66 69 6e 64 20 61 6e 0a 20 20  ry to find an.  
12140 2a 2a 20 65 78 69 73 74 69 6e 67 20 42 74 53 68  ** existing BtSh
12150 61 72 65 64 20 6f 62 6a 65 63 74 20 74 68 61 74  ared object that
12160 20 77 65 20 63 61 6e 20 73 68 61 72 65 20 77 69   we can share wi
12170 74 68 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73  th.  */.  if( is
12180 54 65 6d 70 44 62 3d 3d 30 20 26 26 20 28 69 73  TempDb==0 && (is
12190 4d 65 6d 64 62 3d 3d 30 20 7c 7c 20 28 76 66 73  Memdb==0 || (vfs
121a0 46 6c 61 67 73 26 53 51 4c 49 54 45 5f 4f 50 45  Flags&SQLITE_OPE
121b0 4e 5f 55 52 49 29 21 3d 30 29 20 29 7b 0a 20 20  N_URI)!=0) ){.  
121c0 20 20 69 66 28 20 76 66 73 46 6c 61 67 73 20 26    if( vfsFlags &
121d0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 48 41   SQLITE_OPEN_SHA
121e0 52 45 44 43 41 43 48 45 20 29 7b 0a 20 20 20 20  REDCACHE ){.    
121f0 20 20 69 6e 74 20 6e 46 69 6c 65 6e 61 6d 65 20    int nFilename 
12200 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
12210 30 28 7a 46 69 6c 65 6e 61 6d 65 29 2b 31 3b 0a  0(zFilename)+1;.
12220 20 20 20 20 20 20 69 6e 74 20 6e 46 75 6c 6c 50        int nFullP
12230 61 74 68 6e 61 6d 65 20 3d 20 70 56 66 73 2d 3e  athname = pVfs->
12240 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20  mxPathname+1;.  
12250 20 20 20 20 63 68 61 72 20 2a 7a 46 75 6c 6c 50      char *zFullP
12260 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65  athname = sqlite
12270 33 4d 61 6c 6c 6f 63 28 4d 41 58 28 6e 46 75 6c  3Malloc(MAX(nFul
12280 6c 50 61 74 68 6e 61 6d 65 2c 6e 46 69 6c 65 6e  lPathname,nFilen
12290 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 4d 55 54  ame));.      MUT
122a0 45 58 5f 4c 4f 47 49 43 28 20 73 71 6c 69 74 65  EX_LOGIC( sqlite
122b0 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 53 68  3_mutex *mutexSh
122c0 61 72 65 64 3b 20 29 0a 0a 20 20 20 20 20 20 70  ared; )..      p
122d0 2d 3e 73 68 61 72 61 62 6c 65 20 3d 20 31 3b 0a  ->sharable = 1;.
122e0 20 20 20 20 20 20 69 66 28 20 21 7a 46 75 6c 6c        if( !zFull
122f0 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20  Pathname ){.    
12300 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
12310 28 70 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  (p);.        ret
12320 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
12330 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
12340 69 66 28 20 69 73 4d 65 6d 64 62 20 29 7b 0a 20  if( isMemdb ){. 
12350 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 46         memcpy(zF
12360 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 7a 46 69  ullPathname, zFi
12370 6c 65 6e 61 6d 65 2c 20 6e 46 69 6c 65 6e 61 6d  lename, nFilenam
12380 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  e);.      }else{
12390 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
123a0 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e  lite3OsFullPathn
123b0 61 6d 65 28 70 56 66 73 2c 20 7a 46 69 6c 65 6e  ame(pVfs, zFilen
123c0 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ame,.           
123d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
123e0 20 20 20 20 20 20 20 20 6e 46 75 6c 6c 50 61 74          nFullPat
123f0 68 6e 61 6d 65 2c 20 7a 46 75 6c 6c 50 61 74 68  hname, zFullPath
12400 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 69  name);.        i
12410 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
12420 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
12430 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a  zFullPathname);.
12440 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
12450 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20 20  3_free(p);.     
12460 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
12470 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
12480 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52  }.#if SQLITE_THR
12490 45 41 44 53 41 46 45 0a 20 20 20 20 20 20 6d 75  EADSAFE.      mu
124a0 74 65 78 4f 70 65 6e 20 3d 20 73 71 6c 69 74 65  texOpen = sqlite
124b0 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49  3MutexAlloc(SQLI
124c0 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
124d0 4f 50 45 4e 29 3b 0a 20 20 20 20 20 20 73 71 6c  OPEN);.      sql
124e0 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
124f0 28 6d 75 74 65 78 4f 70 65 6e 29 3b 0a 20 20 20  (mutexOpen);.   
12500 20 20 20 6d 75 74 65 78 53 68 61 72 65 64 20 3d     mutexShared =
12510 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c   sqlite3MutexAll
12520 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  oc(SQLITE_MUTEX_
12530 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 0a  STATIC_MASTER);.
12540 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
12550 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 53  tex_enter(mutexS
12560 68 61 72 65 64 29 3b 0a 23 65 6e 64 69 66 0a 20  hared);.#endif. 
12570 20 20 20 20 20 66 6f 72 28 70 42 74 3d 47 4c 4f       for(pBt=GLO
12580 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71  BAL(BtShared*,sq
12590 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65  lite3SharedCache
125a0 4c 69 73 74 29 3b 20 70 42 74 3b 20 70 42 74 3d  List); pBt; pBt=
125b0 70 42 74 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  pBt->pNext){.   
125c0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74       assert( pBt
125d0 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 20 20  ->nRef>0 );.    
125e0 20 20 20 20 69 66 28 20 30 3d 3d 73 74 72 63 6d      if( 0==strcm
125f0 70 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c  p(zFullPathname,
12600 20 73 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c   sqlite3PagerFil
12610 65 6e 61 6d 65 28 70 42 74 2d 3e 70 50 61 67 65  ename(pBt->pPage
12620 72 2c 20 30 29 29 0a 20 20 20 20 20 20 20 20 20  r, 0)).         
12630 20 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74          && sqlit
12640 65 33 50 61 67 65 72 56 66 73 28 70 42 74 2d 3e  e3PagerVfs(pBt->
12650 70 50 61 67 65 72 29 3d 3d 70 56 66 73 20 29 7b  pPager)==pVfs ){
12660 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69  .          int i
12670 44 62 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f  Db;.          fo
12680 72 28 69 44 62 3d 64 62 2d 3e 6e 44 62 2d 31 3b  r(iDb=db->nDb-1;
12690 20 69 44 62 3e 3d 30 3b 20 69 44 62 2d 2d 29 7b   iDb>=0; iDb--){
126a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 42 74 72  .            Btr
126b0 65 65 20 2a 70 45 78 69 73 74 69 6e 67 20 3d 20  ee *pExisting = 
126c0 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74  db->aDb[iDb].pBt
126d0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
126e0 28 20 70 45 78 69 73 74 69 6e 67 20 26 26 20 70  ( pExisting && p
126f0 45 78 69 73 74 69 6e 67 2d 3e 70 42 74 3d 3d 70  Existing->pBt==p
12700 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  Bt ){.          
12710 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
12720 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 53 68 61  x_leave(mutexSha
12730 72 65 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20  red);.          
12740 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
12750 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 4f 70 65  x_leave(mutexOpe
12760 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  n);.            
12770 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
12780 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20  FullPathname);. 
12790 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
127a0 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20  ite3_free(p);.  
127b0 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
127c0 72 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  rn SQLITE_CONSTR
127d0 41 49 4e 54 3b 0a 20 20 20 20 20 20 20 20 20 20  AINT;.          
127e0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
127f0 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 42 74            p->pBt
12800 20 3d 20 70 42 74 3b 0a 20 20 20 20 20 20 20 20   = pBt;.        
12810 20 20 70 42 74 2d 3e 6e 52 65 66 2b 2b 3b 0a 20    pBt->nRef++;. 
12820 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
12830 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
12840 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  }.      sqlite3_
12850 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65  mutex_leave(mute
12860 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20 20  xShared);.      
12870 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 46 75  sqlite3_free(zFu
12880 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20  llPathname);.   
12890 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
128a0 5f 44 45 42 55 47 0a 20 20 20 20 65 6c 73 65 7b  _DEBUG.    else{
128b0 0a 20 20 20 20 20 20 2f 2a 20 49 6e 20 64 65 62  .      /* In deb
128c0 75 67 20 6d 6f 64 65 2c 20 77 65 20 6d 61 72 6b  ug mode, we mark
128d0 20 61 6c 6c 20 70 65 72 73 69 73 74 65 6e 74 20   all persistent 
128e0 64 61 74 61 62 61 73 65 73 20 61 73 20 73 68 61  databases as sha
128f0 72 61 62 6c 65 0a 20 20 20 20 20 20 2a 2a 20 65  rable.      ** e
12900 76 65 6e 20 77 68 65 6e 20 74 68 65 79 20 61 72  ven when they ar
12910 65 20 6e 6f 74 2e 20 20 54 68 69 73 20 65 78 65  e not.  This exe
12920 72 63 69 73 65 73 20 74 68 65 20 6c 6f 63 6b 69  rcises the locki
12930 6e 67 20 63 6f 64 65 20 61 6e 64 0a 20 20 20 20  ng code and.    
12940 20 20 2a 2a 20 67 69 76 65 73 20 6d 6f 72 65 20    ** gives more 
12950 6f 70 70 6f 72 74 75 6e 69 74 79 20 66 6f 72 20  opportunity for 
12960 61 73 73 65 72 74 73 28 73 71 6c 69 74 65 33 5f  asserts(sqlite3_
12970 6d 75 74 65 78 5f 68 65 6c 64 28 29 29 0a 20 20  mutex_held()).  
12980 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74      ** statement
12990 73 20 74 6f 20 66 69 6e 64 20 6c 6f 63 6b 69 6e  s to find lockin
129a0 67 20 70 72 6f 62 6c 65 6d 73 2e 0a 20 20 20 20  g problems..    
129b0 20 20 2a 2f 0a 20 20 20 20 20 20 70 2d 3e 73 68    */.      p->sh
129c0 61 72 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20  arable = 1;.    
129d0 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 23 65 6e  }.#endif.  }.#en
129e0 64 69 66 0a 20 20 69 66 28 20 70 42 74 3d 3d 30  dif.  if( pBt==0
129f0 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a   ){.    /*.    *
12a00 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
12a10 61 73 73 65 72 74 73 20 6d 61 6b 65 20 73 75 72  asserts make sur
12a20 65 20 74 68 61 74 20 73 74 72 75 63 74 75 72 65  e that structure
12a30 73 20 75 73 65 64 20 62 79 20 74 68 65 20 62 74  s used by the bt
12a40 72 65 65 20 61 72 65 0a 20 20 20 20 2a 2a 20 74  ree are.    ** t
12a50 68 65 20 72 69 67 68 74 20 73 69 7a 65 2e 20 20  he right size.  
12a60 54 68 69 73 20 69 73 20 74 6f 20 67 75 61 72 64  This is to guard
12a70 20 61 67 61 69 6e 73 74 20 73 69 7a 65 20 63 68   against size ch
12a80 61 6e 67 65 73 20 74 68 61 74 20 72 65 73 75 6c  anges that resul
12a90 74 0a 20 20 20 20 2a 2a 20 77 68 65 6e 20 63 6f  t.    ** when co
12aa0 6d 70 69 6c 69 6e 67 20 6f 6e 20 61 20 64 69 66  mpiling on a dif
12ab0 66 65 72 65 6e 74 20 61 72 63 68 69 74 65 63 74  ferent architect
12ac0 75 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ure..    */.    
12ad0 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 69  assert( sizeof(i
12ae0 36 34 29 3d 3d 38 20 29 3b 0a 20 20 20 20 61 73  64)==8 );.    as
12af0 73 65 72 74 28 20 73 69 7a 65 6f 66 28 75 36 34  sert( sizeof(u64
12b00 29 3d 3d 38 20 29 3b 0a 20 20 20 20 61 73 73 65  )==8 );.    asse
12b10 72 74 28 20 73 69 7a 65 6f 66 28 75 33 32 29 3d  rt( sizeof(u32)=
12b20 3d 34 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =4 );.    assert
12b30 28 20 73 69 7a 65 6f 66 28 75 31 36 29 3d 3d 32  ( sizeof(u16)==2
12b40 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
12b50 73 69 7a 65 6f 66 28 50 67 6e 6f 29 3d 3d 34 20  sizeof(Pgno)==4 
12b60 29 3b 0a 20 20 0a 20 20 20 20 70 42 74 20 3d 20  );.  .    pBt = 
12b70 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72  sqlite3MallocZer
12b80 6f 28 20 73 69 7a 65 6f 66 28 2a 70 42 74 29 20  o( sizeof(*pBt) 
12b90 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74 3d 3d  );.    if( pBt==
12ba0 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
12bb0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
12bc0 20 20 20 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f      goto btree_o
12bd0 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20  pen_out;.    }. 
12be0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
12bf0 61 67 65 72 4f 70 65 6e 28 70 56 66 73 2c 20 26  agerOpen(pVfs, &
12c00 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 7a 46 69  pBt->pPager, zFi
12c10 6c 65 6e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20  lename,.        
12c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12c30 20 20 45 58 54 52 41 5f 53 49 5a 45 2c 20 66 6c    EXTRA_SIZE, fl
12c40 61 67 73 2c 20 76 66 73 46 6c 61 67 73 2c 20 70  ags, vfsFlags, p
12c50 61 67 65 52 65 69 6e 69 74 29 3b 0a 20 20 20 20  ageReinit);.    
12c60 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
12c70 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  K ){.      sqlit
12c80 65 33 50 61 67 65 72 53 65 74 4d 6d 61 70 4c 69  e3PagerSetMmapLi
12c90 6d 69 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  mit(pBt->pPager,
12ca0 20 64 62 2d 3e 73 7a 4d 6d 61 70 29 3b 0a 20 20   db->szMmap);.  
12cb0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
12cc0 50 61 67 65 72 52 65 61 64 46 69 6c 65 68 65 61  PagerReadFilehea
12cd0 64 65 72 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  der(pBt->pPager,
12ce0 73 69 7a 65 6f 66 28 7a 44 62 48 65 61 64 65 72  sizeof(zDbHeader
12cf0 29 2c 7a 44 62 48 65 61 64 65 72 29 3b 0a 20 20  ),zDbHeader);.  
12d00 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d    }.    if( rc!=
12d10 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
12d20 20 20 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70     goto btree_op
12d30 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20  en_out;.    }.  
12d40 20 20 70 42 74 2d 3e 6f 70 65 6e 46 6c 61 67 73    pBt->openFlags
12d50 20 3d 20 28 75 38 29 66 6c 61 67 73 3b 0a 20 20   = (u8)flags;.  
12d60 20 20 70 42 74 2d 3e 64 62 20 3d 20 64 62 3b 0a    pBt->db = db;.
12d70 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
12d80 53 65 74 42 75 73 79 68 61 6e 64 6c 65 72 28 70  SetBusyhandler(p
12d90 42 74 2d 3e 70 50 61 67 65 72 2c 20 62 74 72 65  Bt->pPager, btre
12da0 65 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c  eInvokeBusyHandl
12db0 65 72 2c 20 70 42 74 29 3b 0a 20 20 20 20 70 2d  er, pBt);.    p-
12dc0 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 0a 20  >pBt = pBt;.  . 
12dd0 20 20 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20     pBt->pCursor 
12de0 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d 3e 70 50  = 0;.    pBt->pP
12df0 61 67 65 31 20 3d 20 30 3b 0a 20 20 20 20 69 66  age1 = 0;.    if
12e00 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
12e10 72 65 61 64 6f 6e 6c 79 28 70 42 74 2d 3e 70 50  readonly(pBt->pP
12e20 61 67 65 72 29 20 29 20 70 42 74 2d 3e 62 74 73  ager) ) pBt->bts
12e30 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 52 45 41  Flags |= BTS_REA
12e40 44 5f 4f 4e 4c 59 3b 0a 23 69 66 64 65 66 20 53  D_ONLY;.#ifdef S
12e50 51 4c 49 54 45 5f 53 45 43 55 52 45 5f 44 45 4c  QLITE_SECURE_DEL
12e60 45 54 45 0a 20 20 20 20 70 42 74 2d 3e 62 74 73  ETE.    pBt->bts
12e70 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 53 45 43  Flags |= BTS_SEC
12e80 55 52 45 5f 44 45 4c 45 54 45 3b 0a 23 65 6e 64  URE_DELETE;.#end
12e90 69 66 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  if.    /* EVIDEN
12ea0 43 45 2d 4f 46 3a 20 52 2d 35 31 38 37 33 2d 33  CE-OF: R-51873-3
12eb0 39 36 31 38 20 54 68 65 20 70 61 67 65 20 73 69  9618 The page si
12ec0 7a 65 20 66 6f 72 20 61 20 64 61 74 61 62 61 73  ze for a databas
12ed0 65 20 66 69 6c 65 20 69 73 0a 20 20 20 20 2a 2a  e file is.    **
12ee0 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74   determined by t
12ef0 68 65 20 32 2d 62 79 74 65 20 69 6e 74 65 67 65  he 2-byte intege
12f00 72 20 6c 6f 63 61 74 65 64 20 61 74 20 61 6e 20  r located at an 
12f10 6f 66 66 73 65 74 20 6f 66 20 31 36 20 62 79 74  offset of 16 byt
12f20 65 73 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 74  es from.    ** t
12f30 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  he beginning of 
12f40 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
12f50 65 2e 20 2a 2f 0a 20 20 20 20 70 42 74 2d 3e 70  e. */.    pBt->p
12f60 61 67 65 53 69 7a 65 20 3d 20 28 7a 44 62 48 65  ageSize = (zDbHe
12f70 61 64 65 72 5b 31 36 5d 3c 3c 38 29 20 7c 20 28  ader[16]<<8) | (
12f80 7a 44 62 48 65 61 64 65 72 5b 31 37 5d 3c 3c 31  zDbHeader[17]<<1
12f90 36 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d  6);.    if( pBt-
12fa0 3e 70 61 67 65 53 69 7a 65 3c 35 31 32 20 7c 7c  >pageSize<512 ||
12fb0 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 53   pBt->pageSize>S
12fc0 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53  QLITE_MAX_PAGE_S
12fd0 49 5a 45 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  IZE.         || 
12fe0 28 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2d  ((pBt->pageSize-
12ff0 31 29 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  1)&pBt->pageSize
13000 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 42  )!=0 ){.      pB
13010 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 30 3b  t->pageSize = 0;
13020 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
13030 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
13040 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
13050 6d 61 67 69 63 20 6e 61 6d 65 20 22 3a 6d 65 6d  magic name ":mem
13060 6f 72 79 3a 22 20 77 69 6c 6c 20 63 72 65 61 74  ory:" will creat
13070 65 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  e an in-memory d
13080 61 74 61 62 61 73 65 2c 20 74 68 65 6e 0a 20 20  atabase, then.  
13090 20 20 20 20 2a 2a 20 6c 65 61 76 65 20 74 68 65      ** leave the
130a0 20 61 75 74 6f 56 61 63 75 75 6d 20 6d 6f 64 65   autoVacuum mode
130b0 20 61 74 20 30 20 28 64 6f 20 6e 6f 74 20 61 75   at 0 (do not au
130c0 74 6f 2d 76 61 63 75 75 6d 29 2c 20 65 76 65 6e  to-vacuum), even
130d0 20 69 66 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c   if.      ** SQL
130e0 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f  ITE_DEFAULT_AUTO
130f0 56 41 43 55 55 4d 20 69 73 20 74 72 75 65 2e 20  VACUUM is true. 
13100 4f 6e 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e  On the other han
13110 64 2c 20 69 66 0a 20 20 20 20 20 20 2a 2a 20 53  d, if.      ** S
13120 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52  QLITE_OMIT_MEMOR
13130 59 44 42 20 68 61 73 20 62 65 65 6e 20 64 65 66  YDB has been def
13140 69 6e 65 64 2c 20 74 68 65 6e 20 22 3a 6d 65 6d  ined, then ":mem
13150 6f 72 79 3a 22 20 69 73 20 6a 75 73 74 20 61 0a  ory:" is just a.
13160 20 20 20 20 20 20 2a 2a 20 72 65 67 75 6c 61 72        ** regular
13170 20 66 69 6c 65 2d 6e 61 6d 65 2e 20 49 6e 20 74   file-name. In t
13180 68 69 73 20 63 61 73 65 20 74 68 65 20 61 75 74  his case the aut
13190 6f 2d 76 61 63 75 75 6d 20 61 70 70 6c 69 65 73  o-vacuum applies
131a0 20 61 73 20 70 65 72 20 6e 6f 72 6d 61 6c 2e 0a   as per normal..
131b0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
131c0 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20  f( zFilename && 
131d0 21 69 73 4d 65 6d 64 62 20 29 7b 0a 20 20 20 20  !isMemdb ){.    
131e0 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63      pBt->autoVac
131f0 75 75 6d 20 3d 20 28 53 51 4c 49 54 45 5f 44 45  uum = (SQLITE_DE
13200 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d  FAULT_AUTOVACUUM
13210 20 3f 20 31 20 3a 20 30 29 3b 0a 20 20 20 20 20   ? 1 : 0);.     
13220 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75     pBt->incrVacu
13230 75 6d 20 3d 20 28 53 51 4c 49 54 45 5f 44 45 46  um = (SQLITE_DEF
13240 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 3d  AULT_AUTOVACUUM=
13250 3d 32 20 3f 20 31 20 3a 20 30 29 3b 0a 20 20 20  =2 ? 1 : 0);.   
13260 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
13270 20 20 6e 52 65 73 65 72 76 65 20 3d 20 30 3b 0a    nReserve = 0;.
13280 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
13290 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
132a0 20 52 2d 33 37 34 39 37 2d 34 32 34 31 32 20 54   R-37497-42412 T
132b0 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 72  he size of the r
132c0 65 73 65 72 76 65 64 20 72 65 67 69 6f 6e 20 69  eserved region i
132d0 73 0a 20 20 20 20 20 20 2a 2a 20 64 65 74 65 72  s.      ** deter
132e0 6d 69 6e 65 64 20 62 79 20 74 68 65 20 6f 6e 65  mined by the one
132f0 2d 62 79 74 65 20 75 6e 73 69 67 6e 65 64 20 69  -byte unsigned i
13300 6e 74 65 67 65 72 20 66 6f 75 6e 64 20 61 74 20  nteger found at 
13310 61 6e 20 6f 66 66 73 65 74 20 6f 66 20 32 30 0a  an offset of 20.
13320 20 20 20 20 20 20 2a 2a 20 69 6e 74 6f 20 74 68        ** into th
13330 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
13340 68 65 61 64 65 72 2e 20 2a 2f 0a 20 20 20 20 20  header. */.     
13350 20 6e 52 65 73 65 72 76 65 20 3d 20 7a 44 62 48   nReserve = zDbH
13360 65 61 64 65 72 5b 32 30 5d 3b 0a 20 20 20 20 20  eader[20];.     
13370 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c   pBt->btsFlags |
13380 3d 20 42 54 53 5f 50 41 47 45 53 49 5a 45 5f 46  = BTS_PAGESIZE_F
13390 49 58 45 44 3b 0a 23 69 66 6e 64 65 66 20 53 51  IXED;.#ifndef SQ
133a0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
133b0 43 55 55 4d 0a 20 20 20 20 20 20 70 42 74 2d 3e  CUUM.      pBt->
133c0 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 28 67 65  autoVacuum = (ge
133d0 74 34 62 79 74 65 28 26 7a 44 62 48 65 61 64 65  t4byte(&zDbHeade
133e0 72 5b 33 36 20 2b 20 34 2a 34 5d 29 3f 31 3a 30  r[36 + 4*4])?1:0
133f0 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 69 6e  );.      pBt->in
13400 63 72 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34  crVacuum = (get4
13410 62 79 74 65 28 26 7a 44 62 48 65 61 64 65 72 5b  byte(&zDbHeader[
13420 33 36 20 2b 20 37 2a 34 5d 29 3f 31 3a 30 29 3b  36 + 7*4])?1:0);
13430 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20  .#endif.    }.  
13440 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
13450 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 70  gerSetPagesize(p
13460 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70 42 74  Bt->pPager, &pBt
13470 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6e 52 65 73  ->pageSize, nRes
13480 65 72 76 65 29 3b 0a 20 20 20 20 69 66 28 20 72  erve);.    if( r
13490 63 20 29 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f  c ) goto btree_o
134a0 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 70 42 74  pen_out;.    pBt
134b0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70  ->usableSize = p
134c0 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 6e  Bt->pageSize - n
134d0 52 65 73 65 72 76 65 3b 0a 20 20 20 20 61 73 73  Reserve;.    ass
134e0 65 72 74 28 20 28 70 42 74 2d 3e 70 61 67 65 53  ert( (pBt->pageS
134f0 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 20 20  ize & 7)==0 );  
13500 2f 2a 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 6d  /* 8-byte alignm
13510 65 6e 74 20 6f 66 20 70 61 67 65 53 69 7a 65 20  ent of pageSize 
13520 2a 2f 0a 20 20 20 0a 23 69 66 20 21 64 65 66 69  */.   .#if !defi
13530 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
13540 53 48 41 52 45 44 5f 43 41 43 48 45 29 20 26 26  SHARED_CACHE) &&
13550 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
13560 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20  _OMIT_DISKIO).  
13570 20 20 2f 2a 20 41 64 64 20 74 68 65 20 6e 65 77    /* Add the new
13580 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74   BtShared object
13590 20 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c   to the linked l
135a0 69 73 74 20 73 68 61 72 61 62 6c 65 20 42 74 53  ist sharable BtS
135b0 68 61 72 65 64 73 2e 0a 20 20 20 20 2a 2f 0a 20  hareds..    */. 
135c0 20 20 20 69 66 28 20 70 2d 3e 73 68 61 72 61 62     if( p->sharab
135d0 6c 65 20 29 7b 0a 20 20 20 20 20 20 4d 55 54 45  le ){.      MUTE
135e0 58 5f 4c 4f 47 49 43 28 20 73 71 6c 69 74 65 33  X_LOGIC( sqlite3
135f0 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 53 68 61  _mutex *mutexSha
13600 72 65 64 3b 20 29 0a 20 20 20 20 20 20 70 42 74  red; ).      pBt
13610 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20 20  ->nRef = 1;.    
13620 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20 6d    MUTEX_LOGIC( m
13630 75 74 65 78 53 68 61 72 65 64 20 3d 20 73 71 6c  utexShared = sql
13640 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53  ite3MutexAlloc(S
13650 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54  QLITE_MUTEX_STAT
13660 49 43 5f 4d 41 53 54 45 52 29 3b 29 0a 20 20 20  IC_MASTER);).   
13670 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 54 48     if( SQLITE_TH
13680 52 45 41 44 53 41 46 45 20 26 26 20 73 71 6c 69  READSAFE && sqli
13690 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
136a0 62 43 6f 72 65 4d 75 74 65 78 20 29 7b 0a 20 20  bCoreMutex ){.  
136b0 20 20 20 20 20 20 70 42 74 2d 3e 6d 75 74 65 78        pBt->mutex
136c0 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41   = sqlite3MutexA
136d0 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
136e0 58 5f 46 41 53 54 29 3b 0a 20 20 20 20 20 20 20  X_FAST);.       
136f0 20 69 66 28 20 70 42 74 2d 3e 6d 75 74 65 78 3d   if( pBt->mutex=
13700 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
13710 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
13720 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d  M;.          db-
13730 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20  >mallocFailed = 
13740 30 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  0;.          got
13750 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74  o btree_open_out
13760 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
13770 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
13780 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 75  3_mutex_enter(mu
13790 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20  texShared);.    
137a0 20 20 70 42 74 2d 3e 70 4e 65 78 74 20 3d 20 47    pBt->pNext = G
137b0 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c  LOBAL(BtShared*,
137c0 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63  sqlite3SharedCac
137d0 68 65 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 47  heList);.      G
137e0 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c  LOBAL(BtShared*,
137f0 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63  sqlite3SharedCac
13800 68 65 4c 69 73 74 29 20 3d 20 70 42 74 3b 0a 20  heList) = pBt;. 
13810 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74       sqlite3_mut
13820 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 53 68  ex_leave(mutexSh
13830 61 72 65 64 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  ared);.    }.#en
13840 64 69 66 0a 20 20 7d 0a 0a 23 69 66 20 21 64 65  dif.  }..#if !de
13850 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
13860 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 20  T_SHARED_CACHE) 
13870 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  && !defined(SQLI
13880 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a  TE_OMIT_DISKIO).
13890 20 20 2f 2a 20 49 66 20 74 68 65 20 6e 65 77 20    /* If the new 
138a0 42 74 72 65 65 20 75 73 65 73 20 61 20 73 68 61  Btree uses a sha
138b0 72 61 62 6c 65 20 70 42 74 53 68 61 72 65 64 2c  rable pBtShared,
138c0 20 74 68 65 6e 20 6c 69 6e 6b 20 74 68 65 20 6e   then link the n
138d0 65 77 0a 20 20 2a 2a 20 42 74 72 65 65 20 69 6e  ew.  ** Btree in
138e0 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20 61  to the list of a
138f0 6c 6c 20 73 68 61 72 61 62 6c 65 20 42 74 72 65  ll sharable Btre
13900 65 73 20 66 6f 72 20 74 68 65 20 73 61 6d 65 20  es for the same 
13910 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 20 20 2a 2a  connection..  **
13920 20 54 68 65 20 6c 69 73 74 20 69 73 20 6b 65 70   The list is kep
13930 74 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f  t in ascending o
13940 72 64 65 72 20 62 79 20 70 42 74 20 61 64 64 72  rder by pBt addr
13950 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ess..  */.  if( 
13960 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20  p->sharable ){. 
13970 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 42 74     int i;.    Bt
13980 72 65 65 20 2a 70 53 69 62 3b 0a 20 20 20 20 66  ree *pSib;.    f
13990 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44  or(i=0; i<db->nD
139a0 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  b; i++){.      i
139b0 66 28 20 28 70 53 69 62 20 3d 20 64 62 2d 3e 61  f( (pSib = db->a
139c0 44 62 5b 69 5d 2e 70 42 74 29 21 3d 30 20 26 26  Db[i].pBt)!=0 &&
139d0 20 70 53 69 62 2d 3e 73 68 61 72 61 62 6c 65 20   pSib->sharable 
139e0 29 7b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65  ){.        while
139f0 28 20 70 53 69 62 2d 3e 70 50 72 65 76 20 29 7b  ( pSib->pPrev ){
13a00 20 70 53 69 62 20 3d 20 70 53 69 62 2d 3e 70 50   pSib = pSib->pP
13a10 72 65 76 3b 20 7d 0a 20 20 20 20 20 20 20 20 69  rev; }.        i
13a20 66 28 20 70 2d 3e 70 42 74 3c 70 53 69 62 2d 3e  f( p->pBt<pSib->
13a30 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  pBt ){.         
13a40 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53 69 62   p->pNext = pSib
13a50 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70  ;.          p->p
13a60 50 72 65 76 20 3d 20 30 3b 0a 20 20 20 20 20 20  Prev = 0;.      
13a70 20 20 20 20 70 53 69 62 2d 3e 70 50 72 65 76 20      pSib->pPrev 
13a80 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  = p;.        }el
13a90 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 77 68  se{.          wh
13aa0 69 6c 65 28 20 70 53 69 62 2d 3e 70 4e 65 78 74  ile( pSib->pNext
13ab0 20 26 26 20 70 53 69 62 2d 3e 70 4e 65 78 74 2d   && pSib->pNext-
13ac0 3e 70 42 74 3c 70 2d 3e 70 42 74 20 29 7b 0a 20  >pBt<p->pBt ){. 
13ad0 20 20 20 20 20 20 20 20 20 20 20 70 53 69 62 20             pSib 
13ae0 3d 20 70 53 69 62 2d 3e 70 4e 65 78 74 3b 0a 20  = pSib->pNext;. 
13af0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
13b00 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20       p->pNext = 
13b10 70 53 69 62 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  pSib->pNext;.   
13b20 20 20 20 20 20 20 20 70 2d 3e 70 50 72 65 76 20         p->pPrev 
13b30 3d 20 70 53 69 62 3b 0a 20 20 20 20 20 20 20 20  = pSib;.        
13b40 20 20 69 66 28 20 70 2d 3e 70 4e 65 78 74 20 29    if( p->pNext )
13b50 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 2d  {.            p-
13b60 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20  >pNext->pPrev = 
13b70 70 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  p;.          }. 
13b80 20 20 20 20 20 20 20 20 20 70 53 69 62 2d 3e 70           pSib->p
13b90 4e 65 78 74 20 3d 20 70 3b 0a 20 20 20 20 20 20  Next = p;.      
13ba0 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61    }.        brea
13bb0 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
13bc0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 2a 70  .  }.#endif.  *p
13bd0 70 42 74 72 65 65 20 3d 20 70 3b 0a 0a 62 74 72  pBtree = p;..btr
13be0 65 65 5f 6f 70 65 6e 5f 6f 75 74 3a 0a 20 20 69  ee_open_out:.  i
13bf0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
13c00 20 29 7b 0a 20 20 20 20 69 66 28 20 70 42 74 20   ){.    if( pBt 
13c10 26 26 20 70 42 74 2d 3e 70 50 61 67 65 72 20 29  && pBt->pPager )
13c20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  {.      sqlite3P
13c30 61 67 65 72 43 6c 6f 73 65 28 70 42 74 2d 3e 70  agerClose(pBt->p
13c40 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20  Pager);.    }.  
13c50 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
13c60 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Bt);.    sqlite3
13c70 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20 2a 70  _free(p);.    *p
13c80 70 42 74 72 65 65 20 3d 20 30 3b 0a 20 20 7d 65  pBtree = 0;.  }e
13c90 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74  lse{.    /* If t
13ca0 68 65 20 42 2d 54 72 65 65 20 77 61 73 20 73 75  he B-Tree was su
13cb0 63 63 65 73 73 66 75 6c 6c 79 20 6f 70 65 6e 65  ccessfully opene
13cc0 64 2c 20 73 65 74 20 74 68 65 20 70 61 67 65 72  d, set the pager
13cd0 2d 63 61 63 68 65 20 73 69 7a 65 20 74 6f 20 74  -cache size to t
13ce0 68 65 0a 20 20 20 20 2a 2a 20 64 65 66 61 75 6c  he.    ** defaul
13cf0 74 20 76 61 6c 75 65 2e 20 45 78 63 65 70 74 2c  t value. Except,
13d00 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20 6f 6e   when opening on
13d10 20 61 6e 20 65 78 69 73 74 69 6e 67 20 73 68 61   an existing sha
13d20 72 65 64 20 70 61 67 65 72 2d 63 61 63 68 65 2c  red pager-cache,
13d30 0a 20 20 20 20 2a 2a 20 64 6f 20 6e 6f 74 20 63  .    ** do not c
13d40 68 61 6e 67 65 20 74 68 65 20 70 61 67 65 72 2d  hange the pager-
13d50 63 61 63 68 65 20 73 69 7a 65 2e 0a 20 20 20 20  cache size..    
13d60 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  */.    if( sqlit
13d70 65 33 42 74 72 65 65 53 63 68 65 6d 61 28 70 2c  e3BtreeSchema(p,
13d80 20 30 2c 20 30 29 3d 3d 30 20 29 7b 0a 20 20 20   0, 0)==0 ){.   
13d90 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53     sqlite3PagerS
13da0 65 74 43 61 63 68 65 73 69 7a 65 28 70 2d 3e 70  etCachesize(p->p
13db0 42 74 2d 3e 70 50 61 67 65 72 2c 20 53 51 4c 49  Bt->pPager, SQLI
13dc0 54 45 5f 44 45 46 41 55 4c 54 5f 43 41 43 48 45  TE_DEFAULT_CACHE
13dd0 5f 53 49 5a 45 29 3b 0a 20 20 20 20 7d 0a 20 20  _SIZE);.    }.  
13de0 7d 0a 20 20 69 66 28 20 6d 75 74 65 78 4f 70 65  }.  if( mutexOpe
13df0 6e 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  n ){.    assert(
13e00 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
13e10 65 6c 64 28 6d 75 74 65 78 4f 70 65 6e 29 20 29  eld(mutexOpen) )
13e20 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75  ;.    sqlite3_mu
13e30 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 4f  tex_leave(mutexO
13e40 70 65 6e 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  pen);.  }.  retu
13e50 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
13e60 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20 42 74  Decrement the Bt
13e70 53 68 61 72 65 64 2e 6e 52 65 66 20 63 6f 75 6e  Shared.nRef coun
13e80 74 65 72 2e 20 20 57 68 65 6e 20 69 74 20 72 65  ter.  When it re
13e90 61 63 68 65 73 20 7a 65 72 6f 2c 0a 2a 2a 20 72  aches zero,.** r
13ea0 65 6d 6f 76 65 20 74 68 65 20 42 74 53 68 61 72  emove the BtShar
13eb0 65 64 20 73 74 72 75 63 74 75 72 65 20 66 72 6f  ed structure fro
13ec0 6d 20 74 68 65 20 73 68 61 72 69 6e 67 20 6c 69  m the sharing li
13ed0 73 74 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74  st.  Return.** t
13ee0 72 75 65 20 69 66 20 74 68 65 20 42 74 53 68 61  rue if the BtSha
13ef0 72 65 64 2e 6e 52 65 66 20 63 6f 75 6e 74 65 72  red.nRef counter
13f00 20 72 65 61 63 68 65 73 20 7a 65 72 6f 20 61 6e   reaches zero an
13f10 64 20 72 65 74 75 72 6e 0a 2a 2a 20 66 61 6c 73  d return.** fals
13f20 65 20 69 66 20 69 74 20 69 73 20 73 74 69 6c 6c  e if it is still
13f30 20 70 6f 73 69 74 69 76 65 2e 0a 2a 2f 0a 73 74   positive..*/.st
13f40 61 74 69 63 20 69 6e 74 20 72 65 6d 6f 76 65 46  atic int removeF
13f50 72 6f 6d 53 68 61 72 69 6e 67 4c 69 73 74 28 42  romSharingList(B
13f60 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 23  tShared *pBt){.#
13f70 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
13f80 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a  IT_SHARED_CACHE.
13f90 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20 73    MUTEX_LOGIC( s
13fa0 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 70 4d  qlite3_mutex *pM
13fb0 61 73 74 65 72 3b 20 29 0a 20 20 42 74 53 68 61  aster; ).  BtSha
13fc0 72 65 64 20 2a 70 4c 69 73 74 3b 0a 20 20 69 6e  red *pList;.  in
13fd0 74 20 72 65 6d 6f 76 65 64 20 3d 20 30 3b 0a 0a  t removed = 0;..
13fe0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
13ff0 33 5f 6d 75 74 65 78 5f 6e 6f 74 68 65 6c 64 28  3_mutex_notheld(
14000 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
14010 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20 70 4d   MUTEX_LOGIC( pM
14020 61 73 74 65 72 20 3d 20 73 71 6c 69 74 65 33 4d  aster = sqlite3M
14030 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45  utexAlloc(SQLITE
14040 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41  _MUTEX_STATIC_MA
14050 53 54 45 52 29 3b 20 29 0a 20 20 73 71 6c 69 74  STER); ).  sqlit
14060 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70  e3_mutex_enter(p
14070 4d 61 73 74 65 72 29 3b 0a 20 20 70 42 74 2d 3e  Master);.  pBt->
14080 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20 70 42  nRef--;.  if( pB
14090 74 2d 3e 6e 52 65 66 3c 3d 30 20 29 7b 0a 20 20  t->nRef<=0 ){.  
140a0 20 20 69 66 28 20 47 4c 4f 42 41 4c 28 42 74 53    if( GLOBAL(BtS
140b0 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68  hared*,sqlite3Sh
140c0 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 3d 3d  aredCacheList)==
140d0 70 42 74 20 29 7b 0a 20 20 20 20 20 20 47 4c 4f  pBt ){.      GLO
140e0 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71  BAL(BtShared*,sq
140f0 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65  lite3SharedCache
14100 4c 69 73 74 29 20 3d 20 70 42 74 2d 3e 70 4e 65  List) = pBt->pNe
14110 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  xt;.    }else{. 
14120 20 20 20 20 20 70 4c 69 73 74 20 3d 20 47 4c 4f       pList = GLO
14130 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71  BAL(BtShared*,sq
14140 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65  lite3SharedCache
14150 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 77 68 69  List);.      whi
14160 6c 65 28 20 41 4c 57 41 59 53 28 70 4c 69 73 74  le( ALWAYS(pList
14170 29 20 26 26 20 70 4c 69 73 74 2d 3e 70 4e 65 78  ) && pList->pNex
14180 74 21 3d 70 42 74 20 29 7b 0a 20 20 20 20 20 20  t!=pBt ){.      
14190 20 20 70 4c 69 73 74 3d 70 4c 69 73 74 2d 3e 70    pList=pList->p
141a0 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Next;.      }.  
141b0 20 20 20 20 69 66 28 20 41 4c 57 41 59 53 28 70      if( ALWAYS(p
141c0 4c 69 73 74 29 20 29 7b 0a 20 20 20 20 20 20 20  List) ){.       
141d0 20 70 4c 69 73 74 2d 3e 70 4e 65 78 74 20 3d 20   pList->pNext = 
141e0 70 42 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  pBt->pNext;.    
141f0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
14200 28 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53  ( SQLITE_THREADS
14210 41 46 45 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  AFE ){.      sql
14220 69 74 65 33 5f 6d 75 74 65 78 5f 66 72 65 65 28  ite3_mutex_free(
14230 70 42 74 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20  pBt->mutex);.   
14240 20 7d 0a 20 20 20 20 72 65 6d 6f 76 65 64 20 3d   }.    removed =
14250 20 31 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65   1;.  }.  sqlite
14260 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 4d  3_mutex_leave(pM
14270 61 73 74 65 72 29 3b 0a 20 20 72 65 74 75 72 6e  aster);.  return
14280 20 72 65 6d 6f 76 65 64 3b 0a 23 65 6c 73 65 0a   removed;.#else.
14290 20 20 72 65 74 75 72 6e 20 31 3b 0a 23 65 6e 64    return 1;.#end
142a0 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65  if.}../*.** Make
142b0 20 73 75 72 65 20 70 42 74 2d 3e 70 54 6d 70 53   sure pBt->pTmpS
142c0 70 61 63 65 20 70 6f 69 6e 74 73 20 74 6f 20 61  pace points to a
142d0 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 6f 66 20  n allocation of 
142e0 0a 2a 2a 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45  .** MX_CELL_SIZE
142f0 28 70 42 74 29 20 62 79 74 65 73 20 77 69 74 68  (pBt) bytes with
14300 20 61 20 34 2d 62 79 74 65 20 70 72 65 66 69 78   a 4-byte prefix
14310 20 66 6f 72 20 61 20 6c 65 66 74 2d 63 68 69 6c   for a left-chil
14320 64 0a 2a 2a 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f  d.** pointer..*/
14330 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 6c 6c  .static void all
14340 6f 63 61 74 65 54 65 6d 70 53 70 61 63 65 28 42  ocateTempSpace(B
14350 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20  tShared *pBt){. 
14360 20 69 66 28 20 21 70 42 74 2d 3e 70 54 6d 70 53   if( !pBt->pTmpS
14370 70 61 63 65 20 29 7b 0a 20 20 20 20 70 42 74 2d  pace ){.    pBt-
14380 3e 70 54 6d 70 53 70 61 63 65 20 3d 20 73 71 6c  >pTmpSpace = sql
14390 69 74 65 33 50 61 67 65 4d 61 6c 6c 6f 63 28 20  ite3PageMalloc( 
143a0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b  pBt->pageSize );
143b0 0a 0a 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20  ..    /* One of 
143c0 74 68 65 20 75 73 65 73 20 6f 66 20 70 42 74 2d  the uses of pBt-
143d0 3e 70 54 6d 70 53 70 61 63 65 20 69 73 20 74 6f  >pTmpSpace is to
143e0 20 66 6f 72 6d 61 74 20 63 65 6c 6c 73 20 62 65   format cells be
143f0 66 6f 72 65 0a 20 20 20 20 2a 2a 20 69 6e 73 65  fore.    ** inse
14400 72 74 69 6e 67 20 74 68 65 6d 20 69 6e 74 6f 20  rting them into 
14410 61 20 6c 65 61 66 20 70 61 67 65 20 28 66 75 6e  a leaf page (fun
14420 63 74 69 6f 6e 20 66 69 6c 6c 49 6e 43 65 6c 6c  ction fillInCell
14430 28 29 29 2e 20 49 66 0a 20 20 20 20 2a 2a 20 61  ()). If.    ** a
14440 20 63 65 6c 6c 20 69 73 20 6c 65 73 73 20 74 68   cell is less th
14450 61 6e 20 34 20 62 79 74 65 73 20 69 6e 20 73 69  an 4 bytes in si
14460 7a 65 2c 20 69 74 20 69 73 20 72 6f 75 6e 64 65  ze, it is rounde
14470 64 20 75 70 20 74 6f 20 34 20 62 79 74 65 73 0a  d up to 4 bytes.
14480 20 20 20 20 2a 2a 20 62 79 20 74 68 65 20 76 61      ** by the va
14490 72 69 6f 75 73 20 72 6f 75 74 69 6e 65 73 20 74  rious routines t
144a0 68 61 74 20 6d 61 6e 69 70 75 6c 61 74 65 20 62  hat manipulate b
144b0 69 6e 61 72 79 20 63 65 6c 6c 73 2e 20 57 68 69  inary cells. Whi
144c0 63 68 0a 20 20 20 20 2a 2a 20 63 61 6e 20 6d 65  ch.    ** can me
144d0 61 6e 20 74 68 61 74 20 66 69 6c 6c 49 6e 43 65  an that fillInCe
144e0 6c 6c 28 29 20 6f 6e 6c 79 20 69 6e 69 74 69 61  ll() only initia
144f0 6c 69 7a 65 73 20 74 68 65 20 66 69 72 73 74 20  lizes the first 
14500 32 20 6f 72 20 33 0a 20 20 20 20 2a 2a 20 62 79  2 or 3.    ** by
14510 74 65 73 20 6f 66 20 70 54 6d 70 53 70 61 63 65  tes of pTmpSpace
14520 2c 20 62 75 74 20 74 68 61 74 20 74 68 65 20 66  , but that the f
14530 69 72 73 74 20 34 20 62 79 74 65 73 20 61 72 65  irst 4 bytes are
14540 20 63 6f 70 69 65 64 20 66 72 6f 6d 0a 20 20 20   copied from.   
14550 20 2a 2a 20 69 74 20 69 6e 74 6f 20 61 20 64 61   ** it into a da
14560 74 61 62 61 73 65 20 70 61 67 65 2e 20 54 68 69  tabase page. Thi
14570 73 20 69 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c  s is not actuall
14580 79 20 61 20 70 72 6f 62 6c 65 6d 2c 20 62 75 74  y a problem, but
14590 20 69 74 0a 20 20 20 20 2a 2a 20 64 6f 65 73 20   it.    ** does 
145a0 63 61 75 73 65 20 61 20 76 61 6c 67 72 69 6e 64  cause a valgrind
145b0 20 65 72 72 6f 72 20 77 68 65 6e 20 74 68 65 20   error when the 
145c0 31 20 6f 72 20 32 20 62 79 74 65 73 20 6f 66 20  1 or 2 bytes of 
145d0 75 6e 69 74 69 61 6c 69 7a 65 64 20 0a 20 20 20  unitialized .   
145e0 20 2a 2a 20 64 61 74 61 20 69 73 20 70 61 73 73   ** data is pass
145f0 65 64 20 74 6f 20 73 79 73 74 65 6d 20 63 61 6c  ed to system cal
14600 6c 20 77 72 69 74 65 28 29 2e 20 53 6f 20 74 6f  l write(). So to
14610 20 61 76 6f 69 64 20 74 68 69 73 20 65 72 72 6f   avoid this erro
14620 72 2c 0a 20 20 20 20 2a 2a 20 7a 65 72 6f 20 74  r,.    ** zero t
14630 68 65 20 66 69 72 73 74 20 34 20 62 79 74 65 73  he first 4 bytes
14640 20 6f 66 20 74 65 6d 70 20 73 70 61 63 65 20 68   of temp space h
14650 65 72 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ere..    **.    
14660 2a 2a 20 41 6c 73 6f 3a 20 20 50 72 6f 76 69 64  ** Also:  Provid
14670 65 20 66 6f 75 72 20 62 79 74 65 73 20 6f 66 20  e four bytes of 
14680 69 6e 69 74 69 61 6c 69 7a 65 64 20 73 70 61 63  initialized spac
14690 65 20 62 65 66 6f 72 65 20 74 68 65 0a 20 20 20  e before the.   
146a0 20 2a 2a 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66   ** beginning of
146b0 20 70 54 6d 70 53 70 61 63 65 20 61 73 20 61 6e   pTmpSpace as an
146c0 20 61 72 65 61 20 61 76 61 69 6c 61 62 6c 65 20   area available 
146d0 74 6f 20 70 72 65 70 65 6e 64 20 74 68 65 0a 20  to prepend the. 
146e0 20 20 20 2a 2a 20 6c 65 66 74 2d 63 68 69 6c 64     ** left-child
146f0 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
14700 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 61 20 63  beginning of a c
14710 65 6c 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ell..    */.    
14720 69 66 28 20 70 42 74 2d 3e 70 54 6d 70 53 70 61  if( pBt->pTmpSpa
14730 63 65 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73  ce ){.      mems
14740 65 74 28 70 42 74 2d 3e 70 54 6d 70 53 70 61 63  et(pBt->pTmpSpac
14750 65 2c 20 30 2c 20 38 29 3b 0a 20 20 20 20 20 20  e, 0, 8);.      
14760 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 2b  pBt->pTmpSpace +
14770 3d 20 34 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  = 4;.    }.  }.}
14780 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 74 68 65  ../*.** Free the
14790 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20   pBt->pTmpSpace 
147a0 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2f 0a 73 74  allocation.*/.st
147b0 61 74 69 63 20 76 6f 69 64 20 66 72 65 65 54 65  atic void freeTe
147c0 6d 70 53 70 61 63 65 28 42 74 53 68 61 72 65 64  mpSpace(BtShared
147d0 20 2a 70 42 74 29 7b 0a 20 20 69 66 28 20 70 42   *pBt){.  if( pB
147e0 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 29 7b 0a  t->pTmpSpace ){.
147f0 20 20 20 20 70 42 74 2d 3e 70 54 6d 70 53 70 61      pBt->pTmpSpa
14800 63 65 20 2d 3d 20 34 3b 0a 20 20 20 20 73 71 6c  ce -= 4;.    sql
14810 69 74 65 33 50 61 67 65 46 72 65 65 28 70 42 74  ite3PageFree(pBt
14820 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a 20 20  ->pTmpSpace);.  
14830 20 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65    pBt->pTmpSpace
14840 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a   = 0;.  }.}../*.
14850 2a 2a 20 43 6c 6f 73 65 20 61 6e 20 6f 70 65 6e  ** Close an open
14860 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 69 6e   database and in
14870 76 61 6c 69 64 61 74 65 20 61 6c 6c 20 63 75 72  validate all cur
14880 73 6f 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  sors..*/.int sql
14890 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 28 42  ite3BtreeClose(B
148a0 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68  tree *p){.  BtSh
148b0 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
148c0 42 74 3b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  Bt;.  BtCursor *
148d0 70 43 75 72 3b 0a 0a 20 20 2f 2a 20 43 6c 6f 73  pCur;..  /* Clos
148e0 65 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 6f 70  e all cursors op
148f0 65 6e 65 64 20 76 69 61 20 74 68 69 73 20 68 61  ened via this ha
14900 6e 64 6c 65 2e 20 20 2a 2f 0a 20 20 61 73 73 65  ndle.  */.  asse
14910 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
14920 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75  x_held(p->db->mu
14930 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65  tex) );.  sqlite
14940 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
14950 20 20 70 43 75 72 20 3d 20 70 42 74 2d 3e 70 43    pCur = pBt->pC
14960 75 72 73 6f 72 3b 0a 20 20 77 68 69 6c 65 28 20  ursor;.  while( 
14970 70 43 75 72 20 29 7b 0a 20 20 20 20 42 74 43 75  pCur ){.    BtCu
14980 72 73 6f 72 20 2a 70 54 6d 70 20 3d 20 70 43 75  rsor *pTmp = pCu
14990 72 3b 0a 20 20 20 20 70 43 75 72 20 3d 20 70 43  r;.    pCur = pC
149a0 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 69  ur->pNext;.    i
149b0 66 28 20 70 54 6d 70 2d 3e 70 42 74 72 65 65 3d  f( pTmp->pBtree=
149c0 3d 70 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =p ){.      sqli
149d0 74 65 33 42 74 72 65 65 43 6c 6f 73 65 43 75 72  te3BtreeCloseCur
149e0 73 6f 72 28 70 54 6d 70 29 3b 0a 20 20 20 20 7d  sor(pTmp);.    }
149f0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 6f 6c 6c 62  .  }..  /* Rollb
14a00 61 63 6b 20 61 6e 79 20 61 63 74 69 76 65 20 74  ack any active t
14a10 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 66  ransaction and f
14a20 72 65 65 20 74 68 65 20 68 61 6e 64 6c 65 20 73  ree the handle s
14a30 74 72 75 63 74 75 72 65 2e 0a 20 20 2a 2a 20 54  tructure..  ** T
14a40 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74  he call to sqlit
14a50 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28  e3BtreeRollback(
14a60 29 20 64 72 6f 70 73 20 61 6e 79 20 74 61 62 6c  ) drops any tabl
14a70 65 2d 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79 0a  e-locks held by.
14a80 20 20 2a 2a 20 74 68 69 73 20 68 61 6e 64 6c 65    ** this handle
14a90 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
14aa0 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 70 2c  BtreeRollback(p,
14ab0 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 30 29 3b 0a   SQLITE_OK, 0);.
14ac0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
14ad0 61 76 65 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66  ave(p);..  /* If
14ae0 20 74 68 65 72 65 20 61 72 65 20 73 74 69 6c 6c   there are still
14af0 20 6f 74 68 65 72 20 6f 75 74 73 74 61 6e 64 69   other outstandi
14b00 6e 67 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  ng references to
14b10 20 74 68 65 20 73 68 61 72 65 64 2d 62 74 72 65   the shared-btre
14b20 65 0a 20 20 2a 2a 20 73 74 72 75 63 74 75 72 65  e.  ** structure
14b30 2c 20 72 65 74 75 72 6e 20 6e 6f 77 2e 20 54 68  , return now. Th
14b40 65 20 72 65 6d 61 69 6e 64 65 72 20 6f 66 20 74  e remainder of t
14b50 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 63 6c  his procedure cl
14b60 65 61 6e 73 20 0a 20 20 2a 2a 20 75 70 20 74 68  eans .  ** up th
14b70 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 2e 0a  e shared-btree..
14b80 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
14b90 2d 3e 77 61 6e 74 54 6f 4c 6f 63 6b 3d 3d 30 20  ->wantToLock==0 
14ba0 26 26 20 70 2d 3e 6c 6f 63 6b 65 64 3d 3d 30 20  && p->locked==0 
14bb0 29 3b 0a 20 20 69 66 28 20 21 70 2d 3e 73 68 61  );.  if( !p->sha
14bc0 72 61 62 6c 65 20 7c 7c 20 72 65 6d 6f 76 65 46  rable || removeF
14bd0 72 6f 6d 53 68 61 72 69 6e 67 4c 69 73 74 28 70  romSharingList(p
14be0 42 74 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  Bt) ){.    /* Th
14bf0 65 20 70 42 74 20 69 73 20 6e 6f 20 6c 6f 6e 67  e pBt is no long
14c00 65 72 20 6f 6e 20 74 68 65 20 73 68 61 72 69 6e  er on the sharin
14c10 67 20 6c 69 73 74 2c 20 73 6f 20 77 65 20 63 61  g list, so we ca
14c20 6e 20 61 63 63 65 73 73 0a 20 20 20 20 2a 2a 20  n access.    ** 
14c30 69 74 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e  it without havin
14c40 67 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 75  g to hold the mu
14c50 74 65 78 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  tex..    **.    
14c60 2a 2a 20 43 6c 65 61 6e 20 6f 75 74 20 61 6e 64  ** Clean out and
14c70 20 64 65 6c 65 74 65 20 74 68 65 20 42 74 53 68   delete the BtSh
14c80 61 72 65 64 20 6f 62 6a 65 63 74 2e 0a 20 20 20  ared object..   
14c90 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
14ca0 21 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 29 3b  !pBt->pCursor );
14cb0 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
14cc0 72 43 6c 6f 73 65 28 70 42 74 2d 3e 70 50 61 67  rClose(pBt->pPag
14cd0 65 72 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74  er);.    if( pBt
14ce0 2d 3e 78 46 72 65 65 53 63 68 65 6d 61 20 26 26  ->xFreeSchema &&
14cf0 20 70 42 74 2d 3e 70 53 63 68 65 6d 61 20 29 7b   pBt->pSchema ){
14d00 0a 20 20 20 20 20 20 70 42 74 2d 3e 78 46 72 65  .      pBt->xFre
14d10 65 53 63 68 65 6d 61 28 70 42 74 2d 3e 70 53 63  eSchema(pBt->pSc
14d20 68 65 6d 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20  hema);.    }.   
14d30 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 30   sqlite3DbFree(0
14d40 2c 20 70 42 74 2d 3e 70 53 63 68 65 6d 61 29 3b  , pBt->pSchema);
14d50 0a 20 20 20 20 66 72 65 65 54 65 6d 70 53 70 61  .    freeTempSpa
14d60 63 65 28 70 42 74 29 3b 0a 20 20 20 20 73 71 6c  ce(pBt);.    sql
14d70 69 74 65 33 5f 66 72 65 65 28 70 42 74 29 3b 0a  ite3_free(pBt);.
14d80 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c    }..#ifndef SQL
14d90 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
14da0 43 41 43 48 45 0a 20 20 61 73 73 65 72 74 28 20  CACHE.  assert( 
14db0 70 2d 3e 77 61 6e 74 54 6f 4c 6f 63 6b 3d 3d 30  p->wantToLock==0
14dc0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
14dd0 3e 6c 6f 63 6b 65 64 3d 3d 30 20 29 3b 0a 20 20  >locked==0 );.  
14de0 69 66 28 20 70 2d 3e 70 50 72 65 76 20 29 20 70  if( p->pPrev ) p
14df0 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d  ->pPrev->pNext =
14e00 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 69 66 28   p->pNext;.  if(
14e10 20 70 2d 3e 70 4e 65 78 74 20 29 20 70 2d 3e 70   p->pNext ) p->p
14e20 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 2d  Next->pPrev = p-
14e30 3e 70 50 72 65 76 3b 0a 23 65 6e 64 69 66 0a 0a  >pPrev;.#endif..
14e40 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
14e50 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
14e60 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
14e70 43 68 61 6e 67 65 20 74 68 65 20 6c 69 6d 69 74  Change the limit
14e80 20 6f 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   on the number o
14e90 66 20 70 61 67 65 73 20 61 6c 6c 6f 77 65 64 20  f pages allowed 
14ea0 69 6e 20 74 68 65 20 63 61 63 68 65 2e 0a 2a 2a  in the cache..**
14eb0 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20  .** The maximum 
14ec0 6e 75 6d 62 65 72 20 6f 66 20 63 61 63 68 65 20  number of cache 
14ed0 70 61 67 65 73 20 69 73 20 73 65 74 20 74 6f 20  pages is set to 
14ee0 74 68 65 20 61 62 73 6f 6c 75 74 65 0a 2a 2a 20  the absolute.** 
14ef0 76 61 6c 75 65 20 6f 66 20 6d 78 50 61 67 65 2e  value of mxPage.
14f00 20 20 49 66 20 6d 78 50 61 67 65 20 69 73 20 6e    If mxPage is n
14f10 65 67 61 74 69 76 65 2c 20 74 68 65 20 70 61 67  egative, the pag
14f20 65 72 20 77 69 6c 6c 0a 2a 2a 20 6f 70 65 72 61  er will.** opera
14f30 74 65 20 61 73 79 6e 63 68 72 6f 6e 6f 75 73 6c  te asynchronousl
14f40 79 20 2d 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20  y - it will not 
14f50 73 74 6f 70 20 74 6f 20 64 6f 20 66 73 79 6e 63  stop to do fsync
14f60 28 29 73 0a 2a 2a 20 74 6f 20 69 6e 73 75 72 65  ()s.** to insure
14f70 20 64 61 74 61 20 69 73 20 77 72 69 74 74 65 6e   data is written
14f80 20 74 6f 20 74 68 65 20 64 69 73 6b 20 73 75 72   to the disk sur
14f90 66 61 63 65 20 62 65 66 6f 72 65 0a 2a 2a 20 63  face before.** c
14fa0 6f 6e 74 69 6e 75 69 6e 67 2e 20 20 54 72 61 6e  ontinuing.  Tran
14fb0 73 61 63 74 69 6f 6e 73 20 73 74 69 6c 6c 20 77  sactions still w
14fc0 6f 72 6b 20 69 66 20 73 79 6e 63 68 72 6f 6e 6f  ork if synchrono
14fd0 75 73 20 69 73 20 6f 66 66 2c 0a 2a 2a 20 61 6e  us is off,.** an
14fe0 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63  d the database c
14ff0 61 6e 6e 6f 74 20 62 65 20 63 6f 72 72 75 70 74  annot be corrupt
15000 65 64 20 69 66 20 74 68 69 73 20 70 72 6f 67 72  ed if this progr
15010 61 6d 0a 2a 2a 20 63 72 61 73 68 65 73 2e 20 20  am.** crashes.  
15020 42 75 74 20 69 66 20 74 68 65 20 6f 70 65 72 61  But if the opera
15030 74 69 6e 67 20 73 79 73 74 65 6d 20 63 72 61 73  ting system cras
15040 68 65 73 20 6f 72 20 74 68 65 72 65 20 69 73 0a  hes or there is.
15050 2a 2a 20 61 6e 20 61 62 72 75 70 74 20 70 6f 77  ** an abrupt pow
15060 65 72 20 66 61 69 6c 75 72 65 20 77 68 65 6e 20  er failure when 
15070 73 79 6e 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f  synchronous is o
15080 66 66 2c 20 74 68 65 20 64 61 74 61 62 61 73 65  ff, the database
15090 0a 2a 2a 20 63 6f 75 6c 64 20 62 65 20 6c 65 66  .** could be lef
150a0 74 20 69 6e 20 61 6e 20 69 6e 63 6f 6e 73 69 73  t in an inconsis
150b0 74 65 6e 74 20 61 6e 64 20 75 6e 72 65 63 6f 76  tent and unrecov
150c0 65 72 61 62 6c 65 20 73 74 61 74 65 2e 0a 2a 2a  erable state..**
150d0 20 53 79 6e 63 68 72 6f 6e 6f 75 73 20 69 73 20   Synchronous is 
150e0 6f 6e 20 62 79 20 64 65 66 61 75 6c 74 20 73 6f  on by default so
150f0 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70   database corrup
15100 74 69 6f 6e 20 69 73 20 6e 6f 74 0a 2a 2a 20 6e  tion is not.** n
15110 6f 72 6d 61 6c 6c 79 20 61 20 77 6f 72 72 79 2e  ormally a worry.
15120 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
15130 74 72 65 65 53 65 74 43 61 63 68 65 53 69 7a 65  treeSetCacheSize
15140 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6d  (Btree *p, int m
15150 78 50 61 67 65 29 7b 0a 20 20 42 74 53 68 61 72  xPage){.  BtShar
15160 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
15170 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
15180 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
15190 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  ->db->mutex) );.
151a0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
151b0 74 65 72 28 70 29 3b 0a 20 20 73 71 6c 69 74 65  ter(p);.  sqlite
151c0 33 50 61 67 65 72 53 65 74 43 61 63 68 65 73 69  3PagerSetCachesi
151d0 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  ze(pBt->pPager, 
151e0 6d 78 50 61 67 65 29 3b 0a 20 20 73 71 6c 69 74  mxPage);.  sqlit
151f0 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
15200 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
15210 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49  _OK;.}..#if SQLI
15220 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
15230 3e 30 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  >0./*.** Change 
15240 74 68 65 20 6c 69 6d 69 74 20 6f 6e 20 74 68 65  the limit on the
15250 20 61 6d 6f 75 6e 74 20 6f 66 20 74 68 65 20 64   amount of the d
15260 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 68 61  atabase file tha
15270 74 20 6d 61 79 20 62 65 0a 2a 2a 20 6d 65 6d 6f  t may be.** memo
15280 72 79 20 6d 61 70 70 65 64 2e 0a 2a 2f 0a 69 6e  ry mapped..*/.in
15290 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65  t sqlite3BtreeSe
152a0 74 4d 6d 61 70 4c 69 6d 69 74 28 42 74 72 65 65  tMmapLimit(Btree
152b0 20 2a 70 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74   *p, sqlite3_int
152c0 36 34 20 73 7a 4d 6d 61 70 29 7b 0a 20 20 42 74  64 szMmap){.  Bt
152d0 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
152e0 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20  >pBt;.  assert( 
152f0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
15300 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29  ld(p->db->mutex)
15310 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72   );.  sqlite3Btr
15320 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 73 71  eeEnter(p);.  sq
15330 6c 69 74 65 33 50 61 67 65 72 53 65 74 4d 6d 61  lite3PagerSetMma
15340 70 4c 69 6d 69 74 28 70 42 74 2d 3e 70 50 61 67  pLimit(pBt->pPag
15350 65 72 2c 20 73 7a 4d 6d 61 70 29 3b 0a 20 20 73  er, szMmap);.  s
15360 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
15370 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  (p);.  return SQ
15380 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69  LITE_OK;.}.#endi
15390 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4d 41 58 5f  f /* SQLITE_MAX_
153a0 4d 4d 41 50 5f 53 49 5a 45 3e 30 20 2a 2f 0a 0a  MMAP_SIZE>0 */..
153b0 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
153c0 20 77 61 79 20 64 61 74 61 20 69 73 20 73 79 6e   way data is syn
153d0 63 65 64 20 74 6f 20 64 69 73 6b 20 69 6e 20 6f  ced to disk in o
153e0 72 64 65 72 20 74 6f 20 69 6e 63 72 65 61 73 65  rder to increase
153f0 20 6f 72 20 64 65 63 72 65 61 73 65 0a 2a 2a 20   or decrease.** 
15400 68 6f 77 20 77 65 6c 6c 20 74 68 65 20 64 61 74  how well the dat
15410 61 62 61 73 65 20 72 65 73 69 73 74 73 20 64 61  abase resists da
15420 6d 61 67 65 20 64 75 65 20 74 6f 20 4f 53 20 63  mage due to OS c
15430 72 61 73 68 65 73 20 61 6e 64 20 70 6f 77 65 72  rashes and power
15440 0a 2a 2a 20 66 61 69 6c 75 72 65 73 2e 20 20 4c  .** failures.  L
15450 65 76 65 6c 20 31 20 69 73 20 74 68 65 20 73 61  evel 1 is the sa
15460 6d 65 20 61 73 20 61 73 79 6e 63 68 72 6f 6e 6f  me as asynchrono
15470 75 73 20 28 6e 6f 20 73 79 6e 63 73 28 29 20 6f  us (no syncs() o
15480 63 63 75 72 20 61 6e 64 0a 2a 2a 20 74 68 65 72  ccur and.** ther
15490 65 20 69 73 20 61 20 68 69 67 68 20 70 72 6f 62  e is a high prob
154a0 61 62 69 6c 69 74 79 20 6f 66 20 64 61 6d 61 67  ability of damag
154b0 65 29 20 20 4c 65 76 65 6c 20 32 20 69 73 20 74  e)  Level 2 is t
154c0 68 65 20 64 65 66 61 75 6c 74 2e 20 20 54 68 65  he default.  The
154d0 72 65 0a 2a 2a 20 69 73 20 61 20 76 65 72 79 20  re.** is a very 
154e0 6c 6f 77 20 62 75 74 20 6e 6f 6e 2d 7a 65 72 6f  low but non-zero
154f0 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20   probability of 
15500 64 61 6d 61 67 65 2e 20 20 4c 65 76 65 6c 20 33  damage.  Level 3
15510 20 72 65 64 75 63 65 73 20 74 68 65 0a 2a 2a 20   reduces the.** 
15520 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 64  probability of d
15530 61 6d 61 67 65 20 74 6f 20 6e 65 61 72 20 7a 65  amage to near ze
15540 72 6f 20 62 75 74 20 77 69 74 68 20 61 20 77 72  ro but with a wr
15550 69 74 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 20  ite performance 
15560 72 65 64 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 23 69  reduction..*/.#i
15570 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
15580 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53 0a  T_PAGER_PRAGMAS.
15590 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
155a0 53 65 74 50 61 67 65 72 46 6c 61 67 73 28 0a 20  SetPagerFlags(. 
155b0 20 42 74 72 65 65 20 2a 70 2c 20 20 20 20 20 20   Btree *p,      
155c0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62          /* The b
155d0 74 72 65 65 20 74 6f 20 73 65 74 20 74 68 65 20  tree to set the 
155e0 73 61 66 65 74 79 20 6c 65 76 65 6c 20 6f 6e 20  safety level on 
155f0 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 70 67  */.  unsigned pg
15600 46 6c 61 67 73 20 20 20 20 20 20 20 2f 2a 20 56  Flags       /* V
15610 61 72 69 6f 75 73 20 50 41 47 45 52 5f 2a 20 66  arious PAGER_* f
15620 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20 20 42 74 53  lags */.){.  BtS
15630 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
15640 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73  pBt;.  assert( s
15650 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
15660 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  d(p->db->mutex) 
15670 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
15680 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 73 71 6c  eEnter(p);.  sql
15690 69 74 65 33 50 61 67 65 72 53 65 74 46 6c 61 67  ite3PagerSetFlag
156a0 73 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70  s(pBt->pPager, p
156b0 67 46 6c 61 67 73 29 3b 0a 20 20 73 71 6c 69 74  gFlags);.  sqlit
156c0 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
156d0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
156e0 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  _OK;.}.#endif../
156f0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
15700 20 69 66 20 74 68 65 20 67 69 76 65 6e 20 62 74   if the given bt
15710 72 65 65 20 69 73 20 73 65 74 20 74 6f 20 73 61  ree is set to sa
15720 66 65 74 79 20 6c 65 76 65 6c 20 31 2e 20 20 49  fety level 1.  I
15730 6e 20 6f 74 68 65 72 0a 2a 2a 20 77 6f 72 64 73  n other.** words
15740 2c 20 72 65 74 75 72 6e 20 54 52 55 45 20 69 66  , return TRUE if
15750 20 6e 6f 20 73 79 6e 63 28 29 20 6f 63 63 75 72   no sync() occur
15760 73 20 6f 6e 20 74 68 65 20 64 69 73 6b 20 66 69  s on the disk fi
15770 6c 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  les..*/.int sqli
15780 74 65 33 42 74 72 65 65 53 79 6e 63 44 69 73 61  te3BtreeSyncDisa
15790 62 6c 65 64 28 42 74 72 65 65 20 2a 70 29 7b 0a  bled(Btree *p){.
157a0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
157b0 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20  = p->pBt;.  int 
157c0 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  rc;.  assert( sq
157d0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
157e0 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  (p->db->mutex) )
157f0 3b 20 20 0a 20 20 73 71 6c 69 74 65 33 42 74 72  ;  .  sqlite3Btr
15800 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 61 73  eeEnter(p);.  as
15810 73 65 72 74 28 20 70 42 74 20 26 26 20 70 42 74  sert( pBt && pBt
15820 2d 3e 70 50 61 67 65 72 20 29 3b 0a 20 20 72 63  ->pPager );.  rc
15830 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4e   = sqlite3PagerN
15840 6f 73 79 6e 63 28 70 42 74 2d 3e 70 50 61 67 65  osync(pBt->pPage
15850 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  r);.  sqlite3Btr
15860 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
15870 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
15880 2a 20 43 68 61 6e 67 65 20 74 68 65 20 64 65 66  * Change the def
15890 61 75 6c 74 20 70 61 67 65 73 20 73 69 7a 65 20  ault pages size 
158a0 61 6e 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  and the number o
158b0 66 20 72 65 73 65 72 76 65 64 20 62 79 74 65 73  f reserved bytes
158c0 20 70 65 72 20 70 61 67 65 2e 0a 2a 2a 20 4f 72   per page..** Or
158d0 2c 20 69 66 20 74 68 65 20 70 61 67 65 20 73 69  , if the page si
158e0 7a 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  ze has already b
158f0 65 65 6e 20 66 69 78 65 64 2c 20 72 65 74 75 72  een fixed, retur
15900 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  n SQLITE_READONL
15910 59 20 0a 2a 2a 20 77 69 74 68 6f 75 74 20 63 68  Y .** without ch
15920 61 6e 67 69 6e 67 20 61 6e 79 74 68 69 6e 67 2e  anging anything.
15930 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20  .**.** The page 
15940 73 69 7a 65 20 6d 75 73 74 20 62 65 20 61 20 70  size must be a p
15950 6f 77 65 72 20 6f 66 20 32 20 62 65 74 77 65 65  ower of 2 betwee
15960 6e 20 35 31 32 20 61 6e 64 20 36 35 35 33 36 2e  n 512 and 65536.
15970 20 20 49 66 20 74 68 65 20 70 61 67 65 0a 2a 2a    If the page.**
15980 20 73 69 7a 65 20 73 75 70 70 6c 69 65 64 20 64   size supplied d
15990 6f 65 73 20 6e 6f 74 20 6d 65 65 74 20 74 68 69  oes not meet thi
159a0 73 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 68 65  s constraint the
159b0 6e 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20  n the page size 
159c0 69 73 20 6e 6f 74 0a 2a 2a 20 63 68 61 6e 67 65  is not.** change
159d0 64 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65 20 73 69  d..**.** Page si
159e0 7a 65 73 20 61 72 65 20 63 6f 6e 73 74 72 61 69  zes are constrai
159f0 6e 65 64 20 74 6f 20 62 65 20 61 20 70 6f 77 65  ned to be a powe
15a00 72 20 6f 66 20 74 77 6f 20 73 6f 20 74 68 61 74  r of two so that
15a10 20 74 68 65 20 72 65 67 69 6f 6e 0a 2a 2a 20 6f   the region.** o
15a20 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
15a30 69 6c 65 20 75 73 65 64 20 66 6f 72 20 6c 6f 63  ile used for loc
15a40 6b 69 6e 67 20 28 62 65 67 69 6e 6e 69 6e 67 20  king (beginning 
15a50 61 74 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c  at PENDING_BYTE,
15a60 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 62 79  .** the first by
15a70 74 65 20 70 61 73 74 20 74 68 65 20 31 47 42 20  te past the 1GB 
15a80 62 6f 75 6e 64 61 72 79 2c 20 30 78 34 30 30 30  boundary, 0x4000
15a90 30 30 30 30 29 20 6e 65 65 64 73 20 74 6f 20 6f  0000) needs to o
15aa0 63 63 75 72 0a 2a 2a 20 61 74 20 74 68 65 20 62  ccur.** at the b
15ab0 65 67 69 6e 6e 69 6e 67 20 6f 66 20 61 20 70 61  eginning of a pa
15ac0 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72  ge..**.** If par
15ad0 61 6d 65 74 65 72 20 6e 52 65 73 65 72 76 65 20  ameter nReserve 
15ae0 69 73 20 6c 65 73 73 20 74 68 61 6e 20 7a 65 72  is less than zer
15af0 6f 2c 20 74 68 65 6e 20 74 68 65 20 6e 75 6d 62  o, then the numb
15b00 65 72 20 6f 66 20 72 65 73 65 72 76 65 64 0a 2a  er of reserved.*
15b10 2a 20 62 79 74 65 73 20 70 65 72 20 70 61 67 65  * bytes per page
15b20 20 69 73 20 6c 65 66 74 20 75 6e 63 68 61 6e 67   is left unchang
15b30 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ed..**.** If the
15b40 20 69 46 69 78 21 3d 30 20 74 68 65 6e 20 74 68   iFix!=0 then th
15b50 65 20 42 54 53 5f 50 41 47 45 53 49 5a 45 5f 46  e BTS_PAGESIZE_F
15b60 49 58 45 44 20 66 6c 61 67 20 69 73 20 73 65 74  IXED flag is set
15b70 20 73 6f 20 74 68 61 74 20 74 68 65 20 70 61 67   so that the pag
15b80 65 20 73 69 7a 65 0a 2a 2a 20 61 6e 64 20 61 75  e size.** and au
15b90 74 6f 76 61 63 75 75 6d 20 6d 6f 64 65 20 63 61  tovacuum mode ca
15ba0 6e 20 6e 6f 20 6c 6f 6e 67 65 72 20 62 65 20 63  n no longer be c
15bb0 68 61 6e 67 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  hanged..*/.int s
15bc0 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 50 61  qlite3BtreeSetPa
15bd0 67 65 53 69 7a 65 28 42 74 72 65 65 20 2a 70 2c  geSize(Btree *p,
15be0 20 69 6e 74 20 70 61 67 65 53 69 7a 65 2c 20 69   int pageSize, i
15bf0 6e 74 20 6e 52 65 73 65 72 76 65 2c 20 69 6e 74  nt nReserve, int
15c00 20 69 46 69 78 29 7b 0a 20 20 69 6e 74 20 72 63   iFix){.  int rc
15c10 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
15c20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
15c30 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74  p->pBt;.  assert
15c40 28 20 6e 52 65 73 65 72 76 65 3e 3d 2d 31 20 26  ( nReserve>=-1 &
15c50 26 20 6e 52 65 73 65 72 76 65 3c 3d 32 35 35 20  & nReserve<=255 
15c60 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
15c70 65 45 6e 74 65 72 28 70 29 3b 0a 23 69 66 20 53  eEnter(p);.#if S
15c80 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a  QLITE_HAS_CODEC.
15c90 20 20 69 66 28 20 6e 52 65 73 65 72 76 65 3e 70    if( nReserve>p
15ca0 42 74 2d 3e 6f 70 74 69 6d 61 6c 52 65 73 65 72  Bt->optimalReser
15cb0 76 65 20 29 20 70 42 74 2d 3e 6f 70 74 69 6d 61  ve ) pBt->optima
15cc0 6c 52 65 73 65 72 76 65 20 3d 20 28 75 38 29 6e  lReserve = (u8)n
15cd0 52 65 73 65 72 76 65 3b 0a 23 65 6e 64 69 66 0a  Reserve;.#endif.
15ce0 20 20 69 66 28 20 70 42 74 2d 3e 62 74 73 46 6c    if( pBt->btsFl
15cf0 61 67 73 20 26 20 42 54 53 5f 50 41 47 45 53 49  ags & BTS_PAGESI
15d00 5a 45 5f 46 49 58 45 44 20 29 7b 0a 20 20 20 20  ZE_FIXED ){.    
15d10 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
15d20 65 28 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  e(p);.    return
15d30 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
15d40 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 52 65 73  ;.  }.  if( nRes
15d50 65 72 76 65 3c 30 20 29 7b 0a 20 20 20 20 6e 52  erve<0 ){.    nR
15d60 65 73 65 72 76 65 20 3d 20 70 42 74 2d 3e 70 61  eserve = pBt->pa
15d70 67 65 53 69 7a 65 20 2d 20 70 42 74 2d 3e 75 73  geSize - pBt->us
15d80 61 62 6c 65 53 69 7a 65 3b 0a 20 20 7d 0a 20 20  ableSize;.  }.  
15d90 61 73 73 65 72 74 28 20 6e 52 65 73 65 72 76 65  assert( nReserve
15da0 3e 3d 30 20 26 26 20 6e 52 65 73 65 72 76 65 3c  >=0 && nReserve<
15db0 3d 32 35 35 20 29 3b 0a 20 20 69 66 28 20 70 61  =255 );.  if( pa
15dc0 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70  geSize>=512 && p
15dd0 61 67 65 53 69 7a 65 3c 3d 53 51 4c 49 54 45 5f  ageSize<=SQLITE_
15de0 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 26 26  MAX_PAGE_SIZE &&
15df0 0a 20 20 20 20 20 20 20 20 28 28 70 61 67 65 53  .        ((pageS
15e00 69 7a 65 2d 31 29 26 70 61 67 65 53 69 7a 65 29  ize-1)&pageSize)
15e10 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ==0 ){.    asser
15e20 74 28 20 28 70 61 67 65 53 69 7a 65 20 26 20 37  t( (pageSize & 7
15e30 29 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  )==0 );.    asse
15e40 72 74 28 20 21 70 42 74 2d 3e 70 43 75 72 73 6f  rt( !pBt->pCurso
15e50 72 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70 61  r );.    pBt->pa
15e60 67 65 53 69 7a 65 20 3d 20 28 75 33 32 29 70 61  geSize = (u32)pa
15e70 67 65 53 69 7a 65 3b 0a 20 20 20 20 66 72 65 65  geSize;.    free
15e80 54 65 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a  TempSpace(pBt);.
15e90 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74    }.  rc = sqlit
15ea0 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73 69  e3PagerSetPagesi
15eb0 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  ze(pBt->pPager, 
15ec0 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2c 20  &pBt->pageSize, 
15ed0 6e 52 65 73 65 72 76 65 29 3b 0a 20 20 70 42 74  nReserve);.  pBt
15ee0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70  ->usableSize = p
15ef0 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 28  Bt->pageSize - (
15f00 75 31 36 29 6e 52 65 73 65 72 76 65 3b 0a 20 20  u16)nReserve;.  
15f10 69 66 28 20 69 46 69 78 20 29 20 70 42 74 2d 3e  if( iFix ) pBt->
15f20 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f  btsFlags |= BTS_
15f30 50 41 47 45 53 49 5a 45 5f 46 49 58 45 44 3b 0a  PAGESIZE_FIXED;.
15f40 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
15f50 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
15f60 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
15f70 74 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74  turn the current
15f80 6c 79 20 64 65 66 69 6e 65 64 20 70 61 67 65 20  ly defined page 
15f90 73 69 7a 65 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  size.*/.int sqli
15fa0 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65 53  te3BtreeGetPageS
15fb0 69 7a 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  ize(Btree *p){. 
15fc0 20 72 65 74 75 72 6e 20 70 2d 3e 70 42 74 2d 3e   return p->pBt->
15fd0 70 61 67 65 53 69 7a 65 3b 0a 7d 0a 0a 2f 2a 0a  pageSize;.}../*.
15fe0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
15ff0 20 69 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 73   is similar to s
16000 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 52 65  qlite3BtreeGetRe
16010 73 65 72 76 65 28 29 2c 20 65 78 63 65 70 74 20  serve(), except 
16020 74 68 61 74 20 69 74 0a 2a 2a 20 6d 61 79 20 6f  that it.** may o
16030 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 69 66  nly be called if
16040 20 69 74 20 69 73 20 67 75 61 72 61 6e 74 65 65   it is guarantee
16050 64 20 74 68 61 74 20 74 68 65 20 62 2d 74 72 65  d that the b-tre
16060 65 20 6d 75 74 65 78 20 69 73 20 61 6c 72 65 61  e mutex is alrea
16070 64 79 0a 2a 2a 20 68 65 6c 64 2e 0a 2a 2a 0a 2a  dy.** held..**.*
16080 2a 20 54 68 69 73 20 69 73 20 75 73 65 66 75 6c  * This is useful
16090 20 69 6e 20 6f 6e 65 20 73 70 65 63 69 61 6c 20   in one special 
160a0 63 61 73 65 20 69 6e 20 74 68 65 20 62 61 63 6b  case in the back
160b0 75 70 20 41 50 49 20 63 6f 64 65 20 77 68 65 72  up API code wher
160c0 65 20 69 74 20 69 73 0a 2a 2a 20 6b 6e 6f 77 6e  e it is.** known
160d0 20 74 68 61 74 20 74 68 65 20 73 68 61 72 65 64   that the shared
160e0 20 62 2d 74 72 65 65 20 6d 75 74 65 78 20 69 73   b-tree mutex is
160f0 20 68 65 6c 64 2c 20 62 75 74 20 74 68 65 20 6d   held, but the m
16100 75 74 65 78 20 6f 6e 20 74 68 65 20 0a 2a 2a 20  utex on the .** 
16110 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
16120 74 68 61 74 20 6f 77 6e 73 20 2a 70 20 69 73 20  that owns *p is 
16130 6e 6f 74 2e 20 49 6e 20 74 68 69 73 20 63 61 73  not. In this cas
16140 65 20 69 66 20 73 71 6c 69 74 65 33 42 74 72 65  e if sqlite3Btre
16150 65 45 6e 74 65 72 28 29 0a 2a 2a 20 77 65 72 65  eEnter().** were
16160 20 74 6f 20 62 65 20 63 61 6c 6c 65 64 2c 20 69   to be called, i
16170 74 20 6d 69 67 68 74 20 63 6f 6c 6c 69 64 65 20  t might collide 
16180 77 69 74 68 20 73 6f 6d 65 20 6f 74 68 65 72 20  with some other 
16190 6f 70 65 72 61 74 69 6f 6e 20 6f 6e 20 74 68 65  operation on the
161a0 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 68 61 6e  .** database han
161b0 64 6c 65 20 74 68 61 74 20 6f 77 6e 73 20 2a 70  dle that owns *p
161c0 2c 20 63 61 75 73 69 6e 67 20 75 6e 64 65 66 69  , causing undefi
161d0 6e 65 64 20 62 65 68 61 76 69 6f 72 2e 0a 2a 2f  ned behavior..*/
161e0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
161f0 65 47 65 74 52 65 73 65 72 76 65 4e 6f 4d 75 74  eGetReserveNoMut
16200 65 78 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  ex(Btree *p){.  
16210 69 6e 74 20 6e 3b 0a 20 20 61 73 73 65 72 74 28  int n;.  assert(
16220 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
16230 65 6c 64 28 70 2d 3e 70 42 74 2d 3e 6d 75 74 65  eld(p->pBt->mute
16240 78 29 20 29 3b 0a 20 20 6e 20 3d 20 70 2d 3e 70  x) );.  n = p->p
16250 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70  Bt->pageSize - p
16260 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
16270 65 3b 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d  e;.  return n;.}
16280 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
16290 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
162a0 65 73 20 6f 66 20 73 70 61 63 65 20 61 74 20 74  es of space at t
162b0 68 65 20 65 6e 64 20 6f 66 20 65 76 65 72 79 20  he end of every 
162c0 70 61 67 65 20 74 68 61 74 0a 2a 2a 20 61 72 65  page that.** are
162d0 20 69 6e 74 65 6e 74 75 61 6c 6c 79 20 6c 65 66   intentually lef
162e0 74 20 75 6e 75 73 65 64 2e 20 20 54 68 69 73 20  t unused.  This 
162f0 69 73 20 74 68 65 20 22 72 65 73 65 72 76 65 64  is the "reserved
16300 22 20 73 70 61 63 65 20 74 68 61 74 20 69 73 0a  " space that is.
16310 2a 2a 20 73 6f 6d 65 74 69 6d 65 73 20 75 73 65  ** sometimes use
16320 64 20 62 79 20 65 78 74 65 6e 73 69 6f 6e 73 2e  d by extensions.
16330 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45  .**.** If SQLITE
16340 5f 48 41 53 5f 4d 55 54 45 58 20 69 73 20 64 65  _HAS_MUTEX is de
16350 66 69 6e 65 64 20 74 68 65 6e 20 74 68 65 20 6e  fined then the n
16360 75 6d 62 65 72 20 72 65 74 75 72 6e 65 64 20 69  umber returned i
16370 73 20 74 68 65 0a 2a 2a 20 67 72 65 61 74 65 72  s the.** greater
16380 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   of the current 
16390 72 65 73 65 72 76 65 64 20 73 70 61 63 65 20 61  reserved space a
163a0 6e 64 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 72  nd the maximum r
163b0 65 71 75 65 73 74 65 64 0a 2a 2a 20 72 65 73 65  equested.** rese
163c0 72 76 65 20 73 70 61 63 65 2e 0a 2a 2f 0a 69 6e  rve space..*/.in
163d0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  t sqlite3BtreeGe
163e0 74 4f 70 74 69 6d 61 6c 52 65 73 65 72 76 65 28  tOptimalReserve(
163f0 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74  Btree *p){.  int
16400 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72   n;.  sqlite3Btr
16410 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 6e 20  eeEnter(p);.  n 
16420 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  = sqlite3BtreeGe
16430 74 52 65 73 65 72 76 65 4e 6f 4d 75 74 65 78 28  tReserveNoMutex(
16440 70 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  p);.#ifdef SQLIT
16450 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 69 66  E_HAS_CODEC.  if
16460 28 20 6e 3c 70 2d 3e 70 42 74 2d 3e 6f 70 74 69  ( n<p->pBt->opti
16470 6d 61 6c 52 65 73 65 72 76 65 20 29 20 6e 20 3d  malReserve ) n =
16480 20 70 2d 3e 70 42 74 2d 3e 6f 70 74 69 6d 61 6c   p->pBt->optimal
16490 52 65 73 65 72 76 65 3b 0a 23 65 6e 64 69 66 0a  Reserve;.#endif.
164a0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
164b0 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
164c0 20 6e 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 65   n;.}.../*.** Se
164d0 74 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 70 61  t the maximum pa
164e0 67 65 20 63 6f 75 6e 74 20 66 6f 72 20 61 20 64  ge count for a d
164f0 61 74 61 62 61 73 65 20 69 66 20 6d 78 50 61 67  atabase if mxPag
16500 65 20 69 73 20 70 6f 73 69 74 69 76 65 2e 0a 2a  e is positive..*
16510 2a 20 4e 6f 20 63 68 61 6e 67 65 73 20 61 72 65  * No changes are
16520 20 6d 61 64 65 20 69 66 20 6d 78 50 61 67 65 20   made if mxPage 
16530 69 73 20 30 20 6f 72 20 6e 65 67 61 74 69 76 65  is 0 or negative
16540 2e 0a 2a 2a 20 52 65 67 61 72 64 6c 65 73 73 20  ..** Regardless 
16550 6f 66 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  of the value of 
16560 6d 78 50 61 67 65 2c 20 72 65 74 75 72 6e 20 74  mxPage, return t
16570 68 65 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20  he maximum page 
16580 63 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  count..*/.int sq
16590 6c 69 74 65 33 42 74 72 65 65 4d 61 78 50 61 67  lite3BtreeMaxPag
165a0 65 43 6f 75 6e 74 28 42 74 72 65 65 20 2a 70 2c  eCount(Btree *p,
165b0 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20   int mxPage){.  
165c0 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33  int n;.  sqlite3
165d0 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
165e0 20 6e 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65   n = sqlite3Page
165f0 72 4d 61 78 50 61 67 65 43 6f 75 6e 74 28 70 2d  rMaxPageCount(p-
16600 3e 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6d 78  >pBt->pPager, mx
16610 50 61 67 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  Page);.  sqlite3
16620 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
16630 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a   return n;.}../*
16640 0a 2a 2a 20 53 65 74 20 74 68 65 20 42 54 53 5f  .** Set the BTS_
16650 53 45 43 55 52 45 5f 44 45 4c 45 54 45 20 66 6c  SECURE_DELETE fl
16660 61 67 20 69 66 20 6e 65 77 46 6c 61 67 20 69 73  ag if newFlag is
16670 20 30 20 6f 72 20 31 2e 20 20 49 66 20 6e 65 77   0 or 1.  If new
16680 46 6c 61 67 20 69 73 20 2d 31 2c 0a 2a 2a 20 74  Flag is -1,.** t
16690 68 65 6e 20 6d 61 6b 65 20 6e 6f 20 63 68 61 6e  hen make no chan
166a0 67 65 73 2e 20 20 41 6c 77 61 79 73 20 72 65 74  ges.  Always ret
166b0 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66  urn the value of
166c0 20 74 68 65 20 42 54 53 5f 53 45 43 55 52 45 5f   the BTS_SECURE_
166d0 44 45 4c 45 54 45 0a 2a 2a 20 73 65 74 74 69 6e  DELETE.** settin
166e0 67 20 61 66 74 65 72 20 74 68 65 20 63 68 61 6e  g after the chan
166f0 67 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ge..*/.int sqlit
16700 65 33 42 74 72 65 65 53 65 63 75 72 65 44 65 6c  e3BtreeSecureDel
16710 65 74 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  ete(Btree *p, in
16720 74 20 6e 65 77 46 6c 61 67 29 7b 0a 20 20 69 6e  t newFlag){.  in
16730 74 20 62 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  t b;.  if( p==0 
16740 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 73 71  ) return 0;.  sq
16750 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
16760 70 29 3b 0a 20 20 69 66 28 20 6e 65 77 46 6c 61  p);.  if( newFla
16770 67 3e 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 70  g>=0 ){.    p->p
16780 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d 20  Bt->btsFlags &= 
16790 7e 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45  ~BTS_SECURE_DELE
167a0 54 45 3b 0a 20 20 20 20 69 66 28 20 6e 65 77 46  TE;.    if( newF
167b0 6c 61 67 20 29 20 70 2d 3e 70 42 74 2d 3e 62 74  lag ) p->pBt->bt
167c0 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 53 45  sFlags |= BTS_SE
167d0 43 55 52 45 5f 44 45 4c 45 54 45 3b 0a 20 20 7d  CURE_DELETE;.  }
167e0 20 0a 20 20 62 20 3d 20 28 70 2d 3e 70 42 74 2d   .  b = (p->pBt-
167f0 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f  >btsFlags & BTS_
16800 53 45 43 55 52 45 5f 44 45 4c 45 54 45 29 21 3d  SECURE_DELETE)!=
16810 30 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  0;.  sqlite3Btre
16820 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
16830 75 72 6e 20 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn b;.}../*.** 
16840 43 68 61 6e 67 65 20 74 68 65 20 27 61 75 74 6f  Change the 'auto
16850 2d 76 61 63 75 75 6d 27 20 70 72 6f 70 65 72 74  -vacuum' propert
16860 79 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  y of the databas
16870 65 2e 20 49 66 20 74 68 65 20 27 61 75 74 6f 56  e. If the 'autoV
16880 61 63 75 75 6d 27 0a 2a 2a 20 70 61 72 61 6d 65  acuum'.** parame
16890 74 65 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  ter is non-zero,
168a0 20 74 68 65 6e 20 61 75 74 6f 2d 76 61 63 75 75   then auto-vacuu
168b0 6d 20 6d 6f 64 65 20 69 73 20 65 6e 61 62 6c 65  m mode is enable
168c0 64 2e 20 49 66 20 7a 65 72 6f 2c 20 69 74 0a 2a  d. If zero, it.*
168d0 2a 20 69 73 20 64 69 73 61 62 6c 65 64 2e 20 54  * is disabled. T
168e0 68 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65  he default value
168f0 20 66 6f 72 20 74 68 65 20 61 75 74 6f 2d 76 61   for the auto-va
16900 63 75 75 6d 20 70 72 6f 70 65 72 74 79 20 69 73  cuum property is
16910 20 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20   .** determined 
16920 62 79 20 74 68 65 20 53 51 4c 49 54 45 5f 44 45  by the SQLITE_DE
16930 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d  FAULT_AUTOVACUUM
16940 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 69 6e 74 20 73   macro..*/.int s
16950 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 41 75  qlite3BtreeSetAu
16960 74 6f 56 61 63 75 75 6d 28 42 74 72 65 65 20 2a  toVacuum(Btree *
16970 70 2c 20 69 6e 74 20 61 75 74 6f 56 61 63 75 75  p, int autoVacuu
16980 6d 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  m){.#ifdef SQLIT
16990 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
169a0 4d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  M.  return SQLIT
169b0 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 23 65 6c 73  E_READONLY;.#els
169c0 65 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  e.  BtShared *pB
169d0 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e  t = p->pBt;.  in
169e0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
169f0 3b 0a 20 20 75 38 20 61 76 20 3d 20 28 75 38 29  ;.  u8 av = (u8)
16a00 61 75 74 6f 56 61 63 75 75 6d 3b 0a 0a 20 20 73  autoVacuum;..  s
16a10 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
16a20 28 70 29 3b 0a 20 20 69 66 28 20 28 70 42 74 2d  (p);.  if( (pBt-
16a30 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f  >btsFlags & BTS_
16a40 50 41 47 45 53 49 5a 45 5f 46 49 58 45 44 29 21  PAGESIZE_FIXED)!
16a50 3d 30 20 26 26 20 28 61 76 20 3f 31 3a 30 29 21  =0 && (av ?1:0)!
16a60 3d 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d  =pBt->autoVacuum
16a70 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
16a80 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20  ITE_READONLY;.  
16a90 7d 65 6c 73 65 7b 0a 20 20 20 20 70 42 74 2d 3e  }else{.    pBt->
16aa0 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 61 76 20  autoVacuum = av 
16ab0 3f 31 3a 30 3b 0a 20 20 20 20 70 42 74 2d 3e 69  ?1:0;.    pBt->i
16ac0 6e 63 72 56 61 63 75 75 6d 20 3d 20 61 76 3d 3d  ncrVacuum = av==
16ad0 32 20 3f 31 3a 30 3b 0a 20 20 7d 0a 20 20 73 71  2 ?1:0;.  }.  sq
16ae0 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
16af0 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
16b00 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
16b10 20 52 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75   Return the valu
16b20 65 20 6f 66 20 74 68 65 20 27 61 75 74 6f 2d 76  e of the 'auto-v
16b30 61 63 75 75 6d 27 20 70 72 6f 70 65 72 74 79 2e  acuum' property.
16b40 20 49 66 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   If auto-vacuum 
16b50 69 73 20 0a 2a 2a 20 65 6e 61 62 6c 65 64 20 31  is .** enabled 1
16b60 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74   is returned. Ot
16b70 68 65 72 77 69 73 65 20 30 2e 0a 2a 2f 0a 69 6e  herwise 0..*/.in
16b80 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  t sqlite3BtreeGe
16b90 74 41 75 74 6f 56 61 63 75 75 6d 28 42 74 72 65  tAutoVacuum(Btre
16ba0 65 20 2a 70 29 7b 0a 23 69 66 64 65 66 20 53 51  e *p){.#ifdef SQ
16bb0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
16bc0 43 55 55 4d 0a 20 20 72 65 74 75 72 6e 20 42 54  CUUM.  return BT
16bd0 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 4e  REE_AUTOVACUUM_N
16be0 4f 4e 45 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74  ONE;.#else.  int
16bf0 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74   rc;.  sqlite3Bt
16c00 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 72  reeEnter(p);.  r
16c10 63 20 3d 20 28 0a 20 20 20 20 28 21 70 2d 3e 70  c = (.    (!p->p
16c20 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 3f  Bt->autoVacuum)?
16c30 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d  BTREE_AUTOVACUUM
16c40 5f 4e 4f 4e 45 3a 0a 20 20 20 20 28 21 70 2d 3e  _NONE:.    (!p->
16c50 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 29  pBt->incrVacuum)
16c60 3f 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55  ?BTREE_AUTOVACUU
16c70 4d 5f 46 55 4c 4c 3a 0a 20 20 20 20 42 54 52 45  M_FULL:.    BTRE
16c80 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 49 4e 43  E_AUTOVACUUM_INC
16c90 52 0a 20 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  R.  );.  sqlite3
16ca0 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
16cb0 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64   return rc;.#end
16cc0 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 74  if.}.../*.** Get
16cd0 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
16ce0 70 50 61 67 65 31 20 6f 66 20 74 68 65 20 64 61  pPage1 of the da
16cf0 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 54 68  tabase file.  Th
16d00 69 73 20 77 69 6c 6c 0a 2a 2a 20 61 6c 73 6f 20  is will.** also 
16d10 61 63 71 75 69 72 65 20 61 20 72 65 61 64 6c 6f  acquire a readlo
16d20 63 6b 20 6f 6e 20 74 68 61 74 20 66 69 6c 65 2e  ck on that file.
16d30 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  .**.** SQLITE_OK
16d40 20 69 73 20 72 65 74 75 72 6e 65 64 20 6f 6e 20   is returned on 
16d50 73 75 63 63 65 73 73 2e 20 20 49 66 20 74 68 65  success.  If the
16d60 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 0a 2a   file is not a.*
16d70 2a 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 64 61  * well-formed da
16d80 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65  tabase file, the
16d90 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
16da0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a   is returned..**
16db0 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20   SQLITE_BUSY is 
16dc0 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65 20  returned if the 
16dd0 64 61 74 61 62 61 73 65 20 69 73 20 6c 6f 63 6b  database is lock
16de0 65 64 2e 20 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  ed.  SQLITE_NOME
16df0 4d 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64  M.** is returned
16e00 20 69 66 20 77 65 20 72 75 6e 20 6f 75 74 20 6f   if we run out o
16e10 66 20 6d 65 6d 6f 72 79 2e 20 0a 2a 2f 0a 73 74  f memory. .*/.st
16e20 61 74 69 63 20 69 6e 74 20 6c 6f 63 6b 42 74 72  atic int lockBtr
16e30 65 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  ee(BtShared *pBt
16e40 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
16e50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
16e60 75 6c 74 20 63 6f 64 65 20 66 72 6f 6d 20 73 75  ult code from su
16e70 62 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20  bfunctions */.  
16e80 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 3b  MemPage *pPage1;
16e90 20 20 20 20 20 2f 2a 20 50 61 67 65 20 31 20 6f       /* Page 1 o
16ea0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
16eb0 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61  ile */.  int nPa
16ec0 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ge;           /*
16ed0 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
16ee0 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
16ef0 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65 46   */.  int nPageF
16f00 69 6c 65 20 3d 20 30 3b 20 20 20 2f 2a 20 4e 75  ile = 0;   /* Nu
16f10 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
16f20 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
16f30 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67  le */.  int nPag
16f40 65 48 65 61 64 65 72 3b 20 20 20 20 20 2f 2a 20  eHeader;     /* 
16f50 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
16f60 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
16f70 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 68 64 72  according to hdr
16f80 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73   */..  assert( s
16f90 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
16fa0 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
16fb0 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
16fc0 70 50 61 67 65 31 3d 3d 30 20 29 3b 0a 20 20 72  pPage1==0 );.  r
16fd0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
16fe0 53 68 61 72 65 64 4c 6f 63 6b 28 70 42 74 2d 3e  SharedLock(pBt->
16ff0 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 72  pPager);.  if( r
17000 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
17010 65 74 75 72 6e 20 72 63 3b 0a 20 20 72 63 20 3d  eturn rc;.  rc =
17020 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42   btreeGetPage(pB
17030 74 2c 20 31 2c 20 26 70 50 61 67 65 31 2c 20 30  t, 1, &pPage1, 0
17040 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
17050 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
17060 72 63 3b 0a 0a 20 20 2f 2a 20 44 6f 20 73 6f 6d  rc;..  /* Do som
17070 65 20 63 68 65 63 6b 69 6e 67 20 74 6f 20 68 65  e checking to he
17080 6c 70 20 69 6e 73 75 72 65 20 74 68 65 20 66 69  lp insure the fi
17090 6c 65 20 77 65 20 6f 70 65 6e 65 64 20 72 65 61  le we opened rea
170a0 6c 6c 79 20 69 73 0a 20 20 2a 2a 20 61 20 76 61  lly is.  ** a va
170b0 6c 69 64 20 64 61 74 61 62 61 73 65 20 66 69 6c  lid database fil
170c0 65 2e 20 0a 20 20 2a 2f 0a 20 20 6e 50 61 67 65  e. .  */.  nPage
170d0 20 3d 20 6e 50 61 67 65 48 65 61 64 65 72 20 3d   = nPageHeader =
170e0 20 67 65 74 34 62 79 74 65 28 32 38 2b 28 75 38   get4byte(28+(u8
170f0 2a 29 70 50 61 67 65 31 2d 3e 61 44 61 74 61 29  *)pPage1->aData)
17100 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  ;.  sqlite3Pager
17110 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70  Pagecount(pBt->p
17120 50 61 67 65 72 2c 20 26 6e 50 61 67 65 46 69 6c  Pager, &nPageFil
17130 65 29 3b 0a 20 20 69 66 28 20 6e 50 61 67 65 3d  e);.  if( nPage=
17140 3d 30 20 7c 7c 20 6d 65 6d 63 6d 70 28 32 34 2b  =0 || memcmp(24+
17150 28 75 38 2a 29 70 50 61 67 65 31 2d 3e 61 44 61  (u8*)pPage1->aDa
17160 74 61 2c 20 39 32 2b 28 75 38 2a 29 70 50 61 67  ta, 92+(u8*)pPag
17170 65 31 2d 3e 61 44 61 74 61 2c 34 29 21 3d 30 20  e1->aData,4)!=0 
17180 29 7b 0a 20 20 20 20 6e 50 61 67 65 20 3d 20 6e  ){.    nPage = n
17190 50 61 67 65 46 69 6c 65 3b 0a 20 20 7d 0a 20 20  PageFile;.  }.  
171a0 69 66 28 20 6e 50 61 67 65 3e 30 20 29 7b 0a 20  if( nPage>0 ){. 
171b0 20 20 20 75 33 32 20 70 61 67 65 53 69 7a 65 3b     u32 pageSize;
171c0 0a 20 20 20 20 75 33 32 20 75 73 61 62 6c 65 53  .    u32 usableS
171d0 69 7a 65 3b 0a 20 20 20 20 75 38 20 2a 70 61 67  ize;.    u8 *pag
171e0 65 31 20 3d 20 70 50 61 67 65 31 2d 3e 61 44 61  e1 = pPage1->aDa
171f0 74 61 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  ta;.    rc = SQL
17200 49 54 45 5f 4e 4f 54 41 44 42 3b 0a 20 20 20 20  ITE_NOTADB;.    
17210 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
17220 52 2d 34 33 37 33 37 2d 33 39 39 39 39 20 45 76  R-43737-39999 Ev
17230 65 72 79 20 76 61 6c 69 64 20 53 51 4c 69 74 65  ery valid SQLite
17240 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 62   database file b
17250 65 67 69 6e 73 0a 20 20 20 20 2a 2a 20 77 69 74  egins.    ** wit
17260 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  h the following 
17270 31 36 20 62 79 74 65 73 20 28 69 6e 20 68 65 78  16 bytes (in hex
17280 29 3a 20 35 33 20 35 31 20 34 63 20 36 39 20 37  ): 53 51 4c 69 7
17290 34 20 36 35 20 32 30 20 36 36 20 36 66 20 37 32  4 65 20 66 6f 72
172a0 20 36 64 0a 20 20 20 20 2a 2a 20 36 31 20 37 34   6d.    ** 61 74
172b0 20 32 30 20 33 33 20 30 30 2e 20 2a 2f 0a 20 20   20 33 00. */.  
172c0 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 70 61 67    if( memcmp(pag
172d0 65 31 2c 20 7a 4d 61 67 69 63 48 65 61 64 65 72  e1, zMagicHeader
172e0 2c 20 31 36 29 21 3d 30 20 29 7b 0a 20 20 20 20  , 16)!=0 ){.    
172f0 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69    goto page1_ini
17300 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a  t_failed;.    }.
17310 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
17320 4d 49 54 5f 57 41 4c 0a 20 20 20 20 69 66 28 20  MIT_WAL.    if( 
17330 70 61 67 65 31 5b 31 38 5d 3e 31 20 29 7b 0a 20  page1[18]>1 ){. 
17340 20 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61       pBt->btsFla
17350 67 73 20 7c 3d 20 42 54 53 5f 52 45 41 44 5f 4f  gs |= BTS_READ_O
17360 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  NLY;.    }.    i
17370 66 28 20 70 61 67 65 31 5b 31 39 5d 3e 31 20 29  f( page1[19]>1 )
17380 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67  {.      goto pag
17390 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a  e1_init_failed;.
173a0 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20      }.#else.    
173b0 69 66 28 20 70 61 67 65 31 5b 31 38 5d 3e 32 20  if( page1[18]>2 
173c0 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 62 74  ){.      pBt->bt
173d0 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 52 45  sFlags |= BTS_RE
173e0 41 44 5f 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20  AD_ONLY;.    }. 
173f0 20 20 20 69 66 28 20 70 61 67 65 31 5b 31 39 5d     if( page1[19]
17400 3e 32 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  >2 ){.      goto
17410 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c   page1_init_fail
17420 65 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ed;.    }..    /
17430 2a 20 49 66 20 74 68 65 20 77 72 69 74 65 20 76  * If the write v
17440 65 72 73 69 6f 6e 20 69 73 20 73 65 74 20 74 6f  ersion is set to
17450 20 32 2c 20 74 68 69 73 20 64 61 74 61 62 61 73   2, this databas
17460 65 20 73 68 6f 75 6c 64 20 62 65 20 61 63 63 65  e should be acce
17470 73 73 65 64 0a 20 20 20 20 2a 2a 20 69 6e 20 57  ssed.    ** in W
17480 41 4c 20 6d 6f 64 65 2e 20 49 66 20 74 68 65 20  AL mode. If the 
17490 6c 6f 67 20 69 73 20 6e 6f 74 20 61 6c 72 65 61  log is not alrea
174a0 64 79 20 6f 70 65 6e 2c 20 6f 70 65 6e 20 69 74  dy open, open it
174b0 20 6e 6f 77 2e 20 54 68 65 6e 20 0a 20 20 20 20   now. Then .    
174c0 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ** return SQLITE
174d0 5f 4f 4b 20 61 6e 64 20 72 65 74 75 72 6e 20 77  _OK and return w
174e0 69 74 68 6f 75 74 20 70 6f 70 75 6c 61 74 69 6e  ithout populatin
174f0 67 20 42 74 53 68 61 72 65 64 2e 70 50 61 67 65  g BtShared.pPage
17500 31 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 63 61  1..    ** The ca
17510 6c 6c 65 72 20 64 65 74 65 63 74 73 20 74 68 69  ller detects thi
17520 73 20 61 6e 64 20 63 61 6c 6c 73 20 74 68 69 73  s and calls this
17530 20 66 75 6e 63 74 69 6f 6e 20 61 67 61 69 6e 2e   function again.
17540 20 54 68 69 73 20 69 73 0a 20 20 20 20 2a 2a 20   This is.    ** 
17550 72 65 71 75 69 72 65 64 20 61 73 20 74 68 65 20  required as the 
17560 76 65 72 73 69 6f 6e 20 6f 66 20 70 61 67 65 20  version of page 
17570 31 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 74  1 currently in t
17580 68 65 20 70 61 67 65 31 20 62 75 66 66 65 72 0a  he page1 buffer.
17590 20 20 20 20 2a 2a 20 6d 61 79 20 6e 6f 74 20 62      ** may not b
175a0 65 20 74 68 65 20 6c 61 74 65 73 74 20 76 65 72  e the latest ver
175b0 73 69 6f 6e 20 2d 20 74 68 65 72 65 20 6d 61 79  sion - there may
175c0 20 62 65 20 61 20 6e 65 77 65 72 20 6f 6e 65 20   be a newer one 
175d0 69 6e 20 74 68 65 20 6c 6f 67 0a 20 20 20 20 2a  in the log.    *
175e0 2a 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20  * file..    */. 
175f0 20 20 20 69 66 28 20 70 61 67 65 31 5b 31 39 5d     if( page1[19]
17600 3d 3d 32 20 26 26 20 28 70 42 74 2d 3e 62 74 73  ==2 && (pBt->bts
17610 46 6c 61 67 73 20 26 20 42 54 53 5f 4e 4f 5f 57  Flags & BTS_NO_W
17620 41 4c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  AL)==0 ){.      
17630 69 6e 74 20 69 73 4f 70 65 6e 20 3d 20 30 3b 0a  int isOpen = 0;.
17640 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
17650 65 33 50 61 67 65 72 4f 70 65 6e 57 61 6c 28 70  e3PagerOpenWal(p
17660 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 69 73 4f  Bt->pPager, &isO
17670 70 65 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20  pen);.      if( 
17680 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
17690 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61  .        goto pa
176a0 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b  ge1_init_failed;
176b0 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
176c0 20 69 73 4f 70 65 6e 3d 3d 30 20 29 7b 0a 20 20   isOpen==0 ){.  
176d0 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
176e0 65 28 70 50 61 67 65 31 29 3b 0a 20 20 20 20 20  e(pPage1);.     
176f0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
17700 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  _OK;.      }.   
17710 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
17720 4f 54 41 44 42 3b 0a 20 20 20 20 7d 0a 23 65 6e  OTADB;.    }.#en
17730 64 69 66 0a 0a 20 20 20 20 2f 2a 20 45 56 49 44  dif..    /* EVID
17740 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 35 34 36 35  ENCE-OF: R-15465
17750 2d 32 30 38 31 33 20 54 68 65 20 6d 61 78 69 6d  -20813 The maxim
17760 75 6d 20 61 6e 64 20 6d 69 6e 69 6d 75 6d 20 65  um and minimum e
17770 6d 62 65 64 64 65 64 20 70 61 79 6c 6f 61 64 0a  mbedded payload.
17780 20 20 20 20 2a 2a 20 66 72 61 63 74 69 6f 6e 73      ** fractions
17790 20 61 6e 64 20 74 68 65 20 6c 65 61 66 20 70 61   and the leaf pa
177a0 79 6c 6f 61 64 20 66 72 61 63 74 69 6f 6e 20 76  yload fraction v
177b0 61 6c 75 65 73 20 6d 75 73 74 20 62 65 20 36 34  alues must be 64
177c0 2c 20 33 32 2c 20 61 6e 64 20 33 32 2e 0a 20 20  , 32, and 32..  
177d0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    **.    ** The 
177e0 6f 72 69 67 69 6e 61 6c 20 64 65 73 69 67 6e 20  original design 
177f0 61 6c 6c 6f 77 65 64 20 74 68 65 73 65 20 61 6d  allowed these am
17800 6f 75 6e 74 73 20 74 6f 20 76 61 72 79 2c 20 62  ounts to vary, b
17810 75 74 20 61 73 20 6f 66 0a 20 20 20 20 2a 2a 20  ut as of.    ** 
17820 76 65 72 73 69 6f 6e 20 33 2e 36 2e 30 2c 20 77  version 3.6.0, w
17830 65 20 72 65 71 75 69 72 65 20 74 68 65 6d 20 74  e require them t
17840 6f 20 62 65 20 66 69 78 65 64 2e 0a 20 20 20 20  o be fixed..    
17850 2a 2f 0a 20 20 20 20 69 66 28 20 6d 65 6d 63 6d  */.    if( memcm
17860 70 28 26 70 61 67 65 31 5b 32 31 5d 2c 20 22 5c  p(&page1[21], "\
17870 31 30 30 5c 30 34 30 5c 30 34 30 22 2c 33 29 21  100\040\040",3)!
17880 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  =0 ){.      goto
17890 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c   page1_init_fail
178a0 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a  ed;.    }.    /*
178b0 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
178c0 35 31 38 37 33 2d 33 39 36 31 38 20 54 68 65 20  51873-39618 The 
178d0 70 61 67 65 20 73 69 7a 65 20 66 6f 72 20 61 20  page size for a 
178e0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
178f0 0a 20 20 20 20 2a 2a 20 64 65 74 65 72 6d 69 6e  .    ** determin
17900 65 64 20 62 79 20 74 68 65 20 32 2d 62 79 74 65  ed by the 2-byte
17910 20 69 6e 74 65 67 65 72 20 6c 6f 63 61 74 65 64   integer located
17920 20 61 74 20 61 6e 20 6f 66 66 73 65 74 20 6f 66   at an offset of
17930 20 31 36 20 62 79 74 65 73 20 66 72 6f 6d 0a 20   16 bytes from. 
17940 20 20 20 2a 2a 20 74 68 65 20 62 65 67 69 6e 6e     ** the beginn
17950 69 6e 67 20 6f 66 20 74 68 65 20 64 61 74 61 62  ing of the datab
17960 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20  ase file. */.   
17970 20 70 61 67 65 53 69 7a 65 20 3d 20 28 70 61 67   pageSize = (pag
17980 65 31 5b 31 36 5d 3c 3c 38 29 20 7c 20 28 70 61  e1[16]<<8) | (pa
17990 67 65 31 5b 31 37 5d 3c 3c 31 36 29 3b 0a 20 20  ge1[17]<<16);.  
179a0 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
179b0 3a 20 52 2d 32 35 30 30 38 2d 32 31 36 38 38 20  : R-25008-21688 
179c0 54 68 65 20 73 69 7a 65 20 6f 66 20 61 20 70 61  The size of a pa
179d0 67 65 20 69 73 20 61 20 70 6f 77 65 72 20 6f 66  ge is a power of
179e0 20 74 77 6f 0a 20 20 20 20 2a 2a 20 62 65 74 77   two.    ** betw
179f0 65 65 6e 20 35 31 32 20 61 6e 64 20 36 35 35 33  een 512 and 6553
17a00 36 20 69 6e 63 6c 75 73 69 76 65 2e 20 2a 2f 0a  6 inclusive. */.
17a10 20 20 20 20 69 66 28 20 28 28 70 61 67 65 53 69      if( ((pageSi
17a20 7a 65 2d 31 29 26 70 61 67 65 53 69 7a 65 29 21  ze-1)&pageSize)!
17a30 3d 30 0a 20 20 20 20 20 7c 7c 20 70 61 67 65 53  =0.     || pageS
17a40 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 50  ize>SQLITE_MAX_P
17a50 41 47 45 5f 53 49 5a 45 20 0a 20 20 20 20 20 7c  AGE_SIZE .     |
17a60 7c 20 70 61 67 65 53 69 7a 65 3c 3d 32 35 36 20  | pageSize<=256 
17a70 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 67 6f  .    ){.      go
17a80 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61  to page1_init_fa
17a90 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20  iled;.    }.    
17aa0 61 73 73 65 72 74 28 20 28 70 61 67 65 53 69 7a  assert( (pageSiz
17ab0 65 20 26 20 37 29 3d 3d 30 20 29 3b 0a 20 20 20  e & 7)==0 );.   
17ac0 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
17ad0 20 52 2d 35 39 33 31 30 2d 35 31 32 30 35 20 54   R-59310-51205 T
17ae0 68 65 20 22 72 65 73 65 72 76 65 64 20 73 70 61  he "reserved spa
17af0 63 65 22 20 73 69 7a 65 20 69 6e 20 74 68 65 20  ce" size in the 
17b00 31 2d 62 79 74 65 0a 20 20 20 20 2a 2a 20 69 6e  1-byte.    ** in
17b10 74 65 67 65 72 20 61 74 20 6f 66 66 73 65 74 20  teger at offset 
17b20 32 30 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  20 is the number
17b30 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73 70 61   of bytes of spa
17b40 63 65 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  ce at the end of
17b50 0a 20 20 20 20 2a 2a 20 65 61 63 68 20 70 61 67  .    ** each pag
17b60 65 20 74 6f 20 72 65 73 65 72 76 65 20 66 6f 72  e to reserve for
17b70 20 65 78 74 65 6e 73 69 6f 6e 73 2e 20 0a 20 20   extensions. .  
17b80 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 56 49 44    **.    ** EVID
17b90 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 37 34 39 37  ENCE-OF: R-37497
17ba0 2d 34 32 34 31 32 20 54 68 65 20 73 69 7a 65 20  -42412 The size 
17bb0 6f 66 20 74 68 65 20 72 65 73 65 72 76 65 64 20  of the reserved 
17bc0 72 65 67 69 6f 6e 20 69 73 0a 20 20 20 20 2a 2a  region is.    **
17bd0 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74   determined by t
17be0 68 65 20 6f 6e 65 2d 62 79 74 65 20 75 6e 73 69  he one-byte unsi
17bf0 67 6e 65 64 20 69 6e 74 65 67 65 72 20 66 6f 75  gned integer fou
17c00 6e 64 20 61 74 20 61 6e 20 6f 66 66 73 65 74 20  nd at an offset 
17c10 6f 66 20 32 30 0a 20 20 20 20 2a 2a 20 69 6e 74  of 20.    ** int
17c20 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
17c30 69 6c 65 20 68 65 61 64 65 72 2e 20 2a 2f 0a 20  ile header. */. 
17c40 20 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20     usableSize = 
17c50 70 61 67 65 53 69 7a 65 20 2d 20 70 61 67 65 31  pageSize - page1
17c60 5b 32 30 5d 3b 0a 20 20 20 20 69 66 28 20 28 75  [20];.    if( (u
17c70 33 32 29 70 61 67 65 53 69 7a 65 21 3d 70 42 74  32)pageSize!=pBt
17c80 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a 20 20  ->pageSize ){.  
17c90 20 20 20 20 2f 2a 20 41 66 74 65 72 20 72 65 61      /* After rea
17ca0 64 69 6e 67 20 74 68 65 20 66 69 72 73 74 20 70  ding the first p
17cb0 61 67 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  age of the datab
17cc0 61 73 65 20 61 73 73 75 6d 69 6e 67 20 61 20 70  ase assuming a p
17cd0 61 67 65 20 73 69 7a 65 0a 20 20 20 20 20 20 2a  age size.      *
17ce0 2a 20 6f 66 20 42 74 53 68 61 72 65 64 2e 70 61  * of BtShared.pa
17cf0 67 65 53 69 7a 65 2c 20 77 65 20 68 61 76 65 20  geSize, we have 
17d00 64 69 73 63 6f 76 65 72 65 64 20 74 68 61 74 20  discovered that 
17d10 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 69 73  the page-size is
17d20 0a 20 20 20 20 20 20 2a 2a 20 61 63 74 75 61 6c  .      ** actual
17d30 6c 79 20 70 61 67 65 53 69 7a 65 2e 20 55 6e 6c  ly pageSize. Unl
17d40 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61 73 65  ock the database
17d50 2c 20 6c 65 61 76 65 20 70 42 74 2d 3e 70 50 61  , leave pBt->pPa
17d60 67 65 31 20 61 74 0a 20 20 20 20 20 20 2a 2a 20  ge1 at.      ** 
17d70 7a 65 72 6f 20 61 6e 64 20 72 65 74 75 72 6e 20  zero and return 
17d80 53 51 4c 49 54 45 5f 4f 4b 2e 20 54 68 65 20 63  SQLITE_OK. The c
17d90 61 6c 6c 65 72 20 77 69 6c 6c 20 63 61 6c 6c 20  aller will call 
17da0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 20 20  this function.  
17db0 20 20 20 20 2a 2a 20 61 67 61 69 6e 20 77 69 74      ** again wit
17dc0 68 20 74 68 65 20 63 6f 72 72 65 63 74 20 70 61  h the correct pa
17dd0 67 65 2d 73 69 7a 65 2e 0a 20 20 20 20 20 20 2a  ge-size..      *
17de0 2f 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  /.      releaseP
17df0 61 67 65 28 70 50 61 67 65 31 29 3b 0a 20 20 20  age(pPage1);.   
17e00 20 20 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69     pBt->usableSi
17e10 7a 65 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 3b  ze = usableSize;
17e20 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 61 67 65  .      pBt->page
17e30 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a 65 3b  Size = pageSize;
17e40 0a 20 20 20 20 20 20 66 72 65 65 54 65 6d 70 53  .      freeTempS
17e50 70 61 63 65 28 70 42 74 29 3b 0a 20 20 20 20 20  pace(pBt);.     
17e60 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
17e70 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 70 42  erSetPagesize(pB
17e80 74 2d 3e 70 50 61 67 65 72 2c 20 26 70 42 74 2d  t->pPager, &pBt-
17e90 3e 70 61 67 65 53 69 7a 65 2c 0a 20 20 20 20 20  >pageSize,.     
17ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 61                pa
17ec0 67 65 53 69 7a 65 2d 75 73 61 62 6c 65 53 69 7a  geSize-usableSiz
17ed0 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  e);.      return
17ee0 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69   rc;.    }.    i
17ef0 66 28 20 28 70 42 74 2d 3e 64 62 2d 3e 66 6c 61  f( (pBt->db->fla
17f00 67 73 20 26 20 53 51 4c 49 54 45 5f 52 65 63 6f  gs & SQLITE_Reco
17f10 76 65 72 79 4d 6f 64 65 29 3d 3d 30 20 26 26 20  veryMode)==0 && 
17f20 6e 50 61 67 65 3e 6e 50 61 67 65 46 69 6c 65 20  nPage>nPageFile 
17f30 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
17f40 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
17f50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61  T;.      goto pa
17f60 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b  ge1_init_failed;
17f70 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 45 56  .    }.    /* EV
17f80 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 38 33  IDENCE-OF: R-283
17f90 31 32 2d 36 34 37 30 34 20 48 6f 77 65 76 65 72  12-64704 However
17fa0 2c 20 74 68 65 20 75 73 61 62 6c 65 20 73 69 7a  , the usable siz
17fb0 65 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64  e is not allowed
17fc0 20 74 6f 0a 20 20 20 20 2a 2a 20 62 65 20 6c 65   to.    ** be le
17fd0 73 73 20 74 68 61 6e 20 34 38 30 2e 20 49 6e 20  ss than 480. In 
17fe0 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 69 66 20  other words, if 
17ff0 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73  the page size is
18000 20 35 31 32 2c 20 74 68 65 6e 20 74 68 65 0a 20   512, then the. 
18010 20 20 20 2a 2a 20 72 65 73 65 72 76 65 64 20 73     ** reserved s
18020 70 61 63 65 20 73 69 7a 65 20 63 61 6e 6e 6f 74  pace size cannot
18030 20 65 78 63 65 65 64 20 33 32 2e 20 2a 2f 0a 20   exceed 32. */. 
18040 20 20 20 69 66 28 20 75 73 61 62 6c 65 53 69 7a     if( usableSiz
18050 65 3c 34 38 30 20 29 7b 0a 20 20 20 20 20 20 67  e<480 ){.      g
18060 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66  oto page1_init_f
18070 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20  ailed;.    }.   
18080 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d   pBt->pageSize =
18090 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 70   pageSize;.    p
180a0 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d  Bt->usableSize =
180b0 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 23 69 66   usableSize;.#if
180c0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
180d0 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
180e0 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
180f0 3d 20 28 67 65 74 34 62 79 74 65 28 26 70 61 67  = (get4byte(&pag
18100 65 31 5b 33 36 20 2b 20 34 2a 34 5d 29 3f 31 3a  e1[36 + 4*4])?1:
18110 30 29 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e 63  0);.    pBt->inc
18120 72 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62  rVacuum = (get4b
18130 79 74 65 28 26 70 61 67 65 31 5b 33 36 20 2b 20  yte(&page1[36 + 
18140 37 2a 34 5d 29 3f 31 3a 30 29 3b 0a 23 65 6e 64  7*4])?1:0);.#end
18150 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20 6d 61 78  if.  }..  /* max
18160 4c 6f 63 61 6c 20 69 73 20 74 68 65 20 6d 61 78  Local is the max
18170 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70  imum amount of p
18180 61 79 6c 6f 61 64 20 74 6f 20 73 74 6f 72 65 20  ayload to store 
18190 6c 6f 63 61 6c 6c 79 20 66 6f 72 0a 20 20 2a 2a  locally for.  **
181a0 20 61 20 63 65 6c 6c 2e 20 20 4d 61 6b 65 20 73   a cell.  Make s
181b0 75 72 65 20 69 74 20 69 73 20 73 6d 61 6c 6c 20  ure it is small 
181c0 65 6e 6f 75 67 68 20 73 6f 20 74 68 61 74 20 61  enough so that a
181d0 74 20 6c 65 61 73 74 20 6d 69 6e 46 61 6e 6f 75  t least minFanou
181e0 74 0a 20 20 2a 2a 20 63 65 6c 6c 73 20 63 61 6e  t.  ** cells can
181f0 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20 6f 6e 65   will fit on one
18200 20 70 61 67 65 2e 20 20 57 65 20 61 73 73 75 6d   page.  We assum
18210 65 20 61 20 31 30 2d 62 79 74 65 20 70 61 67 65  e a 10-byte page
18220 20 68 65 61 64 65 72 2e 0a 20 20 2a 2a 20 42 65   header..  ** Be
18230 73 69 64 65 73 20 74 68 65 20 70 61 79 6c 6f 61  sides the payloa
18240 64 2c 20 74 68 65 20 63 65 6c 6c 20 6d 75 73 74  d, the cell must
18250 20 73 74 6f 72 65 3a 0a 20 20 2a 2a 20 20 20 20   store:.  **    
18260 20 32 2d 62 79 74 65 20 70 6f 69 6e 74 65 72 20   2-byte pointer 
18270 74 6f 20 74 68 65 20 63 65 6c 6c 0a 20 20 2a 2a  to the cell.  **
18280 20 20 20 20 20 34 2d 62 79 74 65 20 63 68 69 6c       4-byte chil
18290 64 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 20  d pointer.  **  
182a0 20 20 20 39 2d 62 79 74 65 20 6e 4b 65 79 20 76     9-byte nKey v
182b0 61 6c 75 65 0a 20 20 2a 2a 20 20 20 20 20 34 2d  alue.  **     4-
182c0 62 79 74 65 20 6e 44 61 74 61 20 76 61 6c 75 65  byte nData value
182d0 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62 79 74 65  .  **     4-byte
182e0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 70   overflow page p
182f0 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 53 6f 20 61  ointer.  ** So a
18300 20 63 65 6c 6c 20 63 6f 6e 73 69 73 74 73 20 6f   cell consists o
18310 66 20 61 20 32 2d 62 79 74 65 20 70 6f 69 6e 74  f a 2-byte point
18320 65 72 2c 20 61 20 68 65 61 64 65 72 20 77 68 69  er, a header whi
18330 63 68 20 69 73 20 61 73 20 6d 75 63 68 20 61 73  ch is as much as
18340 0a 20 20 2a 2a 20 31 37 20 62 79 74 65 73 20 6c  .  ** 17 bytes l
18350 6f 6e 67 2c 20 30 20 74 6f 20 4e 20 62 79 74 65  ong, 0 to N byte
18360 73 20 6f 66 20 70 61 79 6c 6f 61 64 2c 20 61 6e  s of payload, an
18370 64 20 61 6e 20 6f 70 74 69 6f 6e 61 6c 20 34 20  d an optional 4 
18380 62 79 74 65 20 6f 76 65 72 66 6c 6f 77 0a 20 20  byte overflow.  
18390 2a 2a 20 70 61 67 65 20 70 6f 69 6e 74 65 72 2e  ** page pointer.
183a0 0a 20 20 2a 2f 0a 20 20 70 42 74 2d 3e 6d 61 78  .  */.  pBt->max
183b0 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 28 28 70  Local = (u16)((p
183c0 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31  Bt->usableSize-1
183d0 32 29 2a 36 34 2f 32 35 35 20 2d 20 32 33 29 3b  2)*64/255 - 23);
183e0 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c 6f 63 61 6c  .  pBt->minLocal
183f0 20 3d 20 28 75 31 36 29 28 28 70 42 74 2d 3e 75   = (u16)((pBt->u
18400 73 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a 33 32  sableSize-12)*32
18410 2f 32 35 35 20 2d 20 32 33 29 3b 0a 20 20 70 42  /255 - 23);.  pB
18420 74 2d 3e 6d 61 78 4c 65 61 66 20 3d 20 28 75 31  t->maxLeaf = (u1
18430 36 29 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  6)(pBt->usableSi
18440 7a 65 20 2d 20 33 35 29 3b 0a 20 20 70 42 74 2d  ze - 35);.  pBt-
18450 3e 6d 69 6e 4c 65 61 66 20 3d 20 28 75 31 36 29  >minLeaf = (u16)
18460 28 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ((pBt->usableSiz
18470 65 2d 31 32 29 2a 33 32 2f 32 35 35 20 2d 20 32  e-12)*32/255 - 2
18480 33 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 6d  3);.  if( pBt->m
18490 61 78 4c 6f 63 61 6c 3e 31 32 37 20 29 7b 0a 20  axLocal>127 ){. 
184a0 20 20 20 70 42 74 2d 3e 6d 61 78 31 62 79 74 65     pBt->max1byte
184b0 50 61 79 6c 6f 61 64 20 3d 20 31 32 37 3b 0a 20  Payload = 127;. 
184c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 42 74 2d   }else{.    pBt-
184d0 3e 6d 61 78 31 62 79 74 65 50 61 79 6c 6f 61 64  >max1bytePayload
184e0 20 3d 20 28 75 38 29 70 42 74 2d 3e 6d 61 78 4c   = (u8)pBt->maxL
184f0 6f 63 61 6c 3b 0a 20 20 7d 0a 20 20 61 73 73 65  ocal;.  }.  asse
18500 72 74 28 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66  rt( pBt->maxLeaf
18510 20 2b 20 32 33 20 3c 3d 20 4d 58 5f 43 45 4c 4c   + 23 <= MX_CELL
18520 5f 53 49 5a 45 28 70 42 74 29 20 29 3b 0a 20 20  _SIZE(pBt) );.  
18530 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 70 50  pBt->pPage1 = pP
18540 61 67 65 31 3b 0a 20 20 70 42 74 2d 3e 6e 50 61  age1;.  pBt->nPa
18550 67 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 72 65  ge = nPage;.  re
18560 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
18570 0a 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c  .page1_init_fail
18580 65 64 3a 0a 20 20 72 65 6c 65 61 73 65 50 61 67  ed:.  releasePag
18590 65 28 70 50 61 67 65 31 29 3b 0a 20 20 70 42 74  e(pPage1);.  pBt
185a0 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a 20 20  ->pPage1 = 0;.  
185b0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69  return rc;.}..#i
185c0 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 2f 2a 0a  fndef NDEBUG./*.
185d0 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
185e0 6d 62 65 72 20 6f 66 20 63 75 72 73 6f 72 73 20  mber of cursors 
185f0 6f 70 65 6e 20 6f 6e 20 70 42 74 2e 20 54 68 69  open on pBt. Thi
18600 73 20 69 73 20 66 6f 72 20 75 73 65 0a 2a 2a 20  s is for use.** 
18610 69 6e 20 61 73 73 65 72 74 28 29 20 65 78 70 72  in assert() expr
18620 65 73 73 69 6f 6e 73 2c 20 73 6f 20 69 74 20 69  essions, so it i
18630 73 20 6f 6e 6c 79 20 63 6f 6d 70 69 6c 65 64 20  s only compiled 
18640 69 66 20 4e 44 45 42 55 47 20 69 73 20 6e 6f 74  if NDEBUG is not
18650 0a 2a 2a 20 64 65 66 69 6e 65 64 2e 0a 2a 2a 0a  .** defined..**.
18660 2a 2a 20 4f 6e 6c 79 20 77 72 69 74 65 20 63 75  ** Only write cu
18670 72 73 6f 72 73 20 61 72 65 20 63 6f 75 6e 74 65  rsors are counte
18680 64 20 69 66 20 77 72 4f 6e 6c 79 20 69 73 20 74  d if wrOnly is t
18690 72 75 65 2e 20 20 49 66 20 77 72 4f 6e 6c 79 20  rue.  If wrOnly 
186a0 69 73 0a 2a 2a 20 66 61 6c 73 65 20 74 68 65 6e  is.** false then
186b0 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 61 72 65   all cursors are
186c0 20 63 6f 75 6e 74 65 64 2e 0a 2a 2a 0a 2a 2a 20   counted..**.** 
186d0 46 6f 72 20 74 68 65 20 70 75 72 70 6f 73 65 73  For the purposes
186e0 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65   of this routine
186f0 2c 20 61 20 63 75 72 73 6f 72 20 69 73 20 61 6e  , a cursor is an
18700 79 20 63 75 72 73 6f 72 20 74 68 61 74 0a 2a 2a  y cursor that.**
18710 20 69 73 20 63 61 70 61 62 6c 65 20 6f 66 20 72   is capable of r
18720 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e  eading or writin
18730 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  g to the databas
18740 65 2e 20 20 43 75 72 73 6f 72 73 20 74 68 61 74  e.  Cursors that
18750 0a 2a 2a 20 68 61 76 65 20 62 65 65 6e 20 74 72  .** have been tr
18760 69 70 70 65 64 20 69 6e 74 6f 20 74 68 65 20 43  ipped into the C
18770 55 52 53 4f 52 5f 46 41 55 4c 54 20 73 74 61 74  URSOR_FAULT stat
18780 65 20 61 72 65 20 6e 6f 74 20 63 6f 75 6e 74 65  e are not counte
18790 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
187a0 20 63 6f 75 6e 74 56 61 6c 69 64 43 75 72 73 6f   countValidCurso
187b0 72 73 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  rs(BtShared *pBt
187c0 2c 20 69 6e 74 20 77 72 4f 6e 6c 79 29 7b 0a 20  , int wrOnly){. 
187d0 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 3b   BtCursor *pCur;
187e0 0a 20 20 69 6e 74 20 72 20 3d 20 30 3b 0a 20 20  .  int r = 0;.  
187f0 66 6f 72 28 70 43 75 72 3d 70 42 74 2d 3e 70 43  for(pCur=pBt->pC
18800 75 72 73 6f 72 3b 20 70 43 75 72 3b 20 70 43 75  ursor; pCur; pCu
18810 72 3d 70 43 75 72 2d 3e 70 4e 65 78 74 29 7b 0a  r=pCur->pNext){.
18820 20 20 20 20 69 66 28 20 28 77 72 4f 6e 6c 79 3d      if( (wrOnly=
18830 3d 30 20 7c 7c 20 28 70 43 75 72 2d 3e 63 75 72  =0 || (pCur->cur
18840 46 6c 61 67 73 20 26 20 42 54 43 46 5f 57 72 69  Flags & BTCF_Wri
18850 74 65 46 6c 61 67 29 21 3d 30 29 0a 20 20 20 20  teFlag)!=0).    
18860 20 26 26 20 70 43 75 72 2d 3e 65 53 74 61 74 65   && pCur->eState
18870 21 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 29  !=CURSOR_FAULT )
18880 20 72 2b 2b 3b 20 0a 20 20 7d 0a 20 20 72 65 74   r++; .  }.  ret
18890 75 72 6e 20 72 3b 0a 7d 0a 23 65 6e 64 69 66 0a  urn r;.}.#endif.
188a0 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20  ./*.** If there 
188b0 61 72 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69  are no outstandi
188c0 6e 67 20 63 75 72 73 6f 72 73 20 61 6e 64 20 77  ng cursors and w
188d0 65 20 61 72 65 20 6e 6f 74 20 69 6e 20 74 68 65  e are not in the
188e0 20 6d 69 64 64 6c 65 0a 2a 2a 20 6f 66 20 61 20   middle.** of a 
188f0 74 72 61 6e 73 61 63 74 69 6f 6e 20 62 75 74 20  transaction but 
18900 74 68 65 72 65 20 69 73 20 61 20 72 65 61 64 20  there is a read 
18910 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
18920 62 61 73 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68  base, then.** th
18930 69 73 20 72 6f 75 74 69 6e 65 20 75 6e 72 65 66  is routine unref
18940 73 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65  s the first page
18950 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
18960 20 66 69 6c 65 20 77 68 69 63 68 20 0a 2a 2a 20   file which .** 
18970 68 61 73 20 74 68 65 20 65 66 66 65 63 74 20 6f  has the effect o
18980 66 20 72 65 6c 65 61 73 69 6e 67 20 74 68 65 20  f releasing the 
18990 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a  read lock..**.**
189a0 20 49 66 20 74 68 65 72 65 20 69 73 20 61 20 74   If there is a t
189b0 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 70 72  ransaction in pr
189c0 6f 67 72 65 73 73 2c 20 74 68 69 73 20 72 6f 75  ogress, this rou
189d0 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tine is a no-op.
189e0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
189f0 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75  unlockBtreeIfUnu
18a00 73 65 64 28 42 74 53 68 61 72 65 64 20 2a 70 42  sed(BtShared *pB
18a10 74 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71  t){.  assert( sq
18a20 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
18a30 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
18a40 20 20 61 73 73 65 72 74 28 20 63 6f 75 6e 74 56    assert( countV
18a50 61 6c 69 64 43 75 72 73 6f 72 73 28 70 42 74 2c  alidCursors(pBt,
18a60 30 29 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 69 6e  0)==0 || pBt->in
18a70 54 72 61 6e 73 61 63 74 69 6f 6e 3e 54 52 41 4e  Transaction>TRAN
18a80 53 5f 4e 4f 4e 45 20 29 3b 0a 20 20 69 66 28 20  S_NONE );.  if( 
18a90 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
18aa0 6f 6e 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 26  on==TRANS_NONE &
18ab0 26 20 70 42 74 2d 3e 70 50 61 67 65 31 21 3d 30  & pBt->pPage1!=0
18ac0 20 29 7b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20   ){.    MemPage 
18ad0 2a 70 50 61 67 65 31 20 3d 20 70 42 74 2d 3e 70  *pPage1 = pBt->p
18ae0 50 61 67 65 31 3b 0a 20 20 20 20 61 73 73 65 72  Page1;.    asser
18af0 74 28 20 70 50 61 67 65 31 2d 3e 61 44 61 74 61  t( pPage1->aData
18b00 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
18b10 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 63  sqlite3PagerRefc
18b20 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72  ount(pBt->pPager
18b30 29 3d 3d 31 20 29 3b 0a 20 20 20 20 70 42 74 2d  )==1 );.    pBt-
18b40 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a 20 20 20  >pPage1 = 0;.   
18b50 20 72 65 6c 65 61 73 65 50 61 67 65 4e 6f 74 4e   releasePageNotN
18b60 75 6c 6c 28 70 50 61 67 65 31 29 3b 0a 20 20 7d  ull(pPage1);.  }
18b70 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70 42 74  .}../*.** If pBt
18b80 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20 65 6d   points to an em
18b90 70 74 79 20 66 69 6c 65 20 74 68 65 6e 20 63 6f  pty file then co
18ba0 6e 76 65 72 74 20 74 68 61 74 20 65 6d 70 74 79  nvert that empty
18bb0 20 66 69 6c 65 0a 2a 2a 20 69 6e 74 6f 20 61 20   file.** into a 
18bc0 6e 65 77 20 65 6d 70 74 79 20 64 61 74 61 62 61  new empty databa
18bd0 73 65 20 62 79 20 69 6e 69 74 69 61 6c 69 7a 69  se by initializi
18be0 6e 67 20 74 68 65 20 66 69 72 73 74 20 70 61 67  ng the first pag
18bf0 65 20 6f 66 0a 2a 2a 20 74 68 65 20 64 61 74 61  e of.** the data
18c00 62 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  base..*/.static 
18c10 69 6e 74 20 6e 65 77 44 61 74 61 62 61 73 65 28  int newDatabase(
18c20 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
18c30 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 31 3b 0a    MemPage *pP1;.
18c40 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
18c50 2a 64 61 74 61 3b 0a 20 20 69 6e 74 20 72 63 3b  *data;.  int rc;
18c60 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
18c70 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
18c80 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
18c90 69 66 28 20 70 42 74 2d 3e 6e 50 61 67 65 3e 30  if( pBt->nPage>0
18ca0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
18cb0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
18cc0 70 50 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65  pP1 = pBt->pPage
18cd0 31 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 31  1;.  assert( pP1
18ce0 21 3d 30 20 29 3b 0a 20 20 64 61 74 61 20 3d 20  !=0 );.  data = 
18cf0 70 50 31 2d 3e 61 44 61 74 61 3b 0a 20 20 72 63  pP1->aData;.  rc
18d00 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
18d10 72 69 74 65 28 70 50 31 2d 3e 70 44 62 50 61 67  rite(pP1->pDbPag
18d20 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72  e);.  if( rc ) r
18d30 65 74 75 72 6e 20 72 63 3b 0a 20 20 6d 65 6d 63  eturn rc;.  memc
18d40 70 79 28 64 61 74 61 2c 20 7a 4d 61 67 69 63 48  py(data, zMagicH
18d50 65 61 64 65 72 2c 20 73 69 7a 65 6f 66 28 7a 4d  eader, sizeof(zM
18d60 61 67 69 63 48 65 61 64 65 72 29 29 3b 0a 20 20  agicHeader));.  
18d70 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 7a  assert( sizeof(z
18d80 4d 61 67 69 63 48 65 61 64 65 72 29 3d 3d 31 36  MagicHeader)==16
18d90 20 29 3b 0a 20 20 64 61 74 61 5b 31 36 5d 20 3d   );.  data[16] =
18da0 20 28 75 38 29 28 28 70 42 74 2d 3e 70 61 67 65   (u8)((pBt->page
18db0 53 69 7a 65 3e 3e 38 29 26 30 78 66 66 29 3b 0a  Size>>8)&0xff);.
18dc0 20 20 64 61 74 61 5b 31 37 5d 20 3d 20 28 75 38    data[17] = (u8
18dd0 29 28 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  )((pBt->pageSize
18de0 3e 3e 31 36 29 26 30 78 66 66 29 3b 0a 20 20 64  >>16)&0xff);.  d
18df0 61 74 61 5b 31 38 5d 20 3d 20 31 3b 0a 20 20 64  ata[18] = 1;.  d
18e00 61 74 61 5b 31 39 5d 20 3d 20 31 3b 0a 20 20 61  ata[19] = 1;.  a
18e10 73 73 65 72 74 28 20 70 42 74 2d 3e 75 73 61 62  ssert( pBt->usab
18e20 6c 65 53 69 7a 65 3c 3d 70 42 74 2d 3e 70 61 67  leSize<=pBt->pag
18e30 65 53 69 7a 65 20 26 26 20 70 42 74 2d 3e 75 73  eSize && pBt->us
18e40 61 62 6c 65 53 69 7a 65 2b 32 35 35 3e 3d 70 42  ableSize+255>=pB
18e50 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  t->pageSize);.  
18e60 64 61 74 61 5b 32 30 5d 20 3d 20 28 75 38 29 28  data[20] = (u8)(
18e70 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20  pBt->pageSize - 
18e80 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29  pBt->usableSize)
18e90 3b 0a 20 20 64 61 74 61 5b 32 31 5d 20 3d 20 36  ;.  data[21] = 6
18ea0 34 3b 0a 20 20 64 61 74 61 5b 32 32 5d 20 3d 20  4;.  data[22] = 
18eb0 33 32 3b 0a 20 20 64 61 74 61 5b 32 33 5d 20 3d  32;.  data[23] =
18ec0 20 33 32 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64   32;.  memset(&d
18ed0 61 74 61 5b 32 34 5d 2c 20 30 2c 20 31 30 30 2d  ata[24], 0, 100-
18ee0 32 34 29 3b 0a 20 20 7a 65 72 6f 50 61 67 65 28  24);.  zeroPage(
18ef0 70 50 31 2c 20 50 54 46 5f 49 4e 54 4b 45 59 7c  pP1, PTF_INTKEY|
18f00 50 54 46 5f 4c 45 41 46 7c 50 54 46 5f 4c 45 41  PTF_LEAF|PTF_LEA
18f10 46 44 41 54 41 20 29 3b 0a 20 20 70 42 74 2d 3e  FDATA );.  pBt->
18f20 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f  btsFlags |= BTS_
18f30 50 41 47 45 53 49 5a 45 5f 46 49 58 45 44 3b 0a  PAGESIZE_FIXED;.
18f40 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
18f50 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
18f60 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 61 75   assert( pBt->au
18f70 74 6f 56 61 63 75 75 6d 3d 3d 31 20 7c 7c 20 70  toVacuum==1 || p
18f80 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 3d 3d  Bt->autoVacuum==
18f90 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
18fa0 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 3d 3d  Bt->incrVacuum==
18fb0 31 20 7c 7c 20 70 42 74 2d 3e 69 6e 63 72 56 61  1 || pBt->incrVa
18fc0 63 75 75 6d 3d 3d 30 20 29 3b 0a 20 20 70 75 74  cuum==0 );.  put
18fd0 34 62 79 74 65 28 26 64 61 74 61 5b 33 36 20 2b  4byte(&data[36 +
18fe0 20 34 2a 34 5d 2c 20 70 42 74 2d 3e 61 75 74 6f   4*4], pBt->auto
18ff0 56 61 63 75 75 6d 29 3b 0a 20 20 70 75 74 34 62  Vacuum);.  put4b
19000 79 74 65 28 26 64 61 74 61 5b 33 36 20 2b 20 37  yte(&data[36 + 7
19010 2a 34 5d 2c 20 70 42 74 2d 3e 69 6e 63 72 56 61  *4], pBt->incrVa
19020 63 75 75 6d 29 3b 0a 23 65 6e 64 69 66 0a 20 20  cuum);.#endif.  
19030 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 31 3b 0a  pBt->nPage = 1;.
19040 20 20 64 61 74 61 5b 33 31 5d 20 3d 20 31 3b 0a    data[31] = 1;.
19050 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
19060 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69  OK;.}../*.** Ini
19070 74 69 61 6c 69 7a 65 20 74 68 65 20 66 69 72 73  tialize the firs
19080 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61  t page of the da
19090 74 61 62 61 73 65 20 66 69 6c 65 20 28 63 72 65  tabase file (cre
190a0 61 74 69 6e 67 20 61 20 64 61 74 61 62 61 73 65  ating a database
190b0 0a 2a 2a 20 63 6f 6e 73 69 73 74 69 6e 67 20 6f  .** consisting o
190c0 66 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65 20  f a single page 
190d0 61 6e 64 20 6e 6f 20 73 63 68 65 6d 61 20 6f 62  and no schema ob
190e0 6a 65 63 74 73 29 2e 20 52 65 74 75 72 6e 20 53  jects). Return S
190f0 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 66 20 73  QLITE_OK.** if s
19100 75 63 63 65 73 73 66 75 6c 2c 20 6f 72 20 61 6e  uccessful, or an
19110 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
19120 64 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f  de otherwise..*/
19130 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
19140 65 4e 65 77 44 62 28 42 74 72 65 65 20 2a 70 29  eNewDb(Btree *p)
19150 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71  {.  int rc;.  sq
19160 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
19170 70 29 3b 0a 20 20 70 2d 3e 70 42 74 2d 3e 6e 50  p);.  p->pBt->nP
19180 61 67 65 20 3d 20 30 3b 0a 20 20 72 63 20 3d 20  age = 0;.  rc = 
19190 6e 65 77 44 61 74 61 62 61 73 65 28 70 2d 3e 70  newDatabase(p->p
191a0 42 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  Bt);.  sqlite3Bt
191b0 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
191c0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
191d0 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 73 74  ** Attempt to st
191e0 61 72 74 20 61 20 6e 65 77 20 74 72 61 6e 73 61  art a new transa
191f0 63 74 69 6f 6e 2e 20 41 20 77 72 69 74 65 2d 74  ction. A write-t
19200 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73  ransaction.** is
19210 20 73 74 61 72 74 65 64 20 69 66 20 74 68 65 20   started if the 
19220 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
19230 69 73 20 6e 6f 6e 7a 65 72 6f 2c 20 6f 74 68 65  is nonzero, othe
19240 72 77 69 73 65 20 61 20 72 65 61 64 2d 0a 2a 2a  rwise a read-.**
19250 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 49   transaction.  I
19260 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  f the second arg
19270 75 6d 65 6e 74 20 69 73 20 32 20 6f 72 20 6d 6f  ument is 2 or mo
19280 72 65 20 61 6e 64 20 65 78 63 6c 75 73 69 76 65  re and exclusive
19290 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  .** transaction 
192a0 69 73 20 73 74 61 72 74 65 64 2c 20 6d 65 61 6e  is started, mean
192b0 69 6e 67 20 74 68 61 74 20 6e 6f 20 6f 74 68 65  ing that no othe
192c0 72 20 70 72 6f 63 65 73 73 20 69 73 20 61 6c 6c  r process is all
192d0 6f 77 65 64 0a 2a 2a 20 74 6f 20 61 63 63 65 73  owed.** to acces
192e0 73 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  s the database. 
192f0 20 41 20 70 72 65 65 78 69 73 74 69 6e 67 20 74   A preexisting t
19300 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20 6e  ransaction may n
19310 6f 74 20 62 65 0a 2a 2a 20 75 70 67 72 61 64 65  ot be.** upgrade
19320 64 20 74 6f 20 65 78 63 6c 75 73 69 76 65 20 62  d to exclusive b
19330 79 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72  y calling this r
19340 6f 75 74 69 6e 65 20 61 20 73 65 63 6f 6e 64 20  outine a second 
19350 74 69 6d 65 20 2d 20 74 68 65 0a 2a 2a 20 65 78  time - the.** ex
19360 63 6c 75 73 69 76 69 74 79 20 66 6c 61 67 20 6f  clusivity flag o
19370 6e 6c 79 20 77 6f 72 6b 73 20 66 6f 72 20 61 20  nly works for a 
19380 6e 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  new transaction.
19390 0a 2a 2a 0a 2a 2a 20 41 20 77 72 69 74 65 2d 74  .**.** A write-t
193a0 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20  ransaction must 
193b0 62 65 20 73 74 61 72 74 65 64 20 62 65 66 6f 72  be started befor
193c0 65 20 61 74 74 65 6d 70 74 69 6e 67 20 61 6e 79  e attempting any
193d0 20 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f 20   .** changes to 
193e0 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 4e  the database.  N
193f0 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  one of the follo
19400 77 69 6e 67 20 72 6f 75 74 69 6e 65 73 20 0a 2a  wing routines .*
19410 2a 20 77 69 6c 6c 20 77 6f 72 6b 20 75 6e 6c 65  * will work unle
19420 73 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  ss a transaction
19430 20 69 73 20 73 74 61 72 74 65 64 20 66 69 72 73   is started firs
19440 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 73 71  t:.**.**      sq
19450 6c 69 74 65 33 42 74 72 65 65 43 72 65 61 74 65  lite3BtreeCreate
19460 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20  Table().**      
19470 73 71 6c 69 74 65 33 42 74 72 65 65 43 72 65 61  sqlite3BtreeCrea
19480 74 65 49 6e 64 65 78 28 29 0a 2a 2a 20 20 20 20  teIndex().**    
19490 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c    sqlite3BtreeCl
194a0 65 61 72 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20  earTable().**   
194b0 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 44     sqlite3BtreeD
194c0 72 6f 70 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20  ropTable().**   
194d0 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 49     sqlite3BtreeI
194e0 6e 73 65 72 74 28 29 0a 2a 2a 20 20 20 20 20 20  nsert().**      
194f0 73 71 6c 69 74 65 33 42 74 72 65 65 44 65 6c 65  sqlite3BtreeDele
19500 74 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c  te().**      sql
19510 69 74 65 33 42 74 72 65 65 55 70 64 61 74 65 4d  ite3BtreeUpdateM
19520 65 74 61 28 29 0a 2a 2a 0a 2a 2a 20 49 66 20 61  eta().**.** If a
19530 6e 20 69 6e 69 74 69 61 6c 20 61 74 74 65 6d 70  n initial attemp
19540 74 20 74 6f 20 61 63 71 75 69 72 65 20 74 68 65  t to acquire the
19550 20 6c 6f 63 6b 20 66 61 69 6c 73 20 62 65 63 61   lock fails beca
19560 75 73 65 20 6f 66 20 6c 6f 63 6b 20 63 6f 6e 74  use of lock cont
19570 65 6e 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 74 68  ention.** and th
19580 65 20 64 61 74 61 62 61 73 65 20 77 61 73 20 70  e database was p
19590 72 65 76 69 6f 75 73 6c 79 20 75 6e 6c 6f 63 6b  reviously unlock
195a0 65 64 2c 20 74 68 65 6e 20 69 6e 76 6f 6b 65 20  ed, then invoke 
195b0 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72  the busy handler
195c0 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 69 73 20  .** if there is 
195d0 6f 6e 65 2e 20 20 42 75 74 20 69 66 20 74 68 65  one.  But if the
195e0 72 65 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c  re was previousl
195f0 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b 2c 20 64  y a read-lock, d
19600 6f 20 6e 6f 74 0a 2a 2a 20 69 6e 76 6f 6b 65 20  o not.** invoke 
19610 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72  the busy handler
19620 20 2d 20 6a 75 73 74 20 72 65 74 75 72 6e 20 53   - just return S
19630 51 4c 49 54 45 5f 42 55 53 59 2e 20 20 53 51 4c  QLITE_BUSY.  SQL
19640 49 54 45 5f 42 55 53 59 20 69 73 20 0a 2a 2a 20  ITE_BUSY is .** 
19650 72 65 74 75 72 6e 65 64 20 77 68 65 6e 20 74 68  returned when th
19660 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 61  ere is already a
19670 20 72 65 61 64 2d 6c 6f 63 6b 20 69 6e 20 6f 72   read-lock in or
19680 64 65 72 20 74 6f 20 61 76 6f 69 64 20 61 20 64  der to avoid a d
19690 65 61 64 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53  eadlock..**.** S
196a0 75 70 70 6f 73 65 20 74 68 65 72 65 20 61 72 65  uppose there are
196b0 20 74 77 6f 20 70 72 6f 63 65 73 73 65 73 20 41   two processes A
196c0 20 61 6e 64 20 42 2e 20 20 41 20 68 61 73 20 61   and B.  A has a
196d0 20 72 65 61 64 20 6c 6f 63 6b 20 61 6e 64 20 42   read lock and B
196e0 20 68 61 73 0a 2a 2a 20 61 20 72 65 73 65 72 76   has.** a reserv
196f0 65 64 20 6c 6f 63 6b 2e 20 20 42 20 74 72 69 65  ed lock.  B trie
19700 73 20 74 6f 20 70 72 6f 6d 6f 74 65 20 74 6f 20  s to promote to 
19710 65 78 63 6c 75 73 69 76 65 20 62 75 74 20 69 73  exclusive but is
19720 20 62 6c 6f 63 6b 65 64 20 62 65 63 61 75 73 65   blocked because
19730 0a 2a 2a 20 6f 66 20 41 27 73 20 72 65 61 64 20  .** of A's read 
19740 6c 6f 63 6b 2e 20 20 41 20 74 72 69 65 73 20 74  lock.  A tries t
19750 6f 20 70 72 6f 6d 6f 74 65 20 74 6f 20 72 65 73  o promote to res
19760 65 72 76 65 64 20 62 75 74 20 69 73 20 62 6c 6f  erved but is blo
19770 63 6b 65 64 20 62 79 20 42 2e 0a 2a 2a 20 4f 6e  cked by B..** On
19780 65 20 6f 72 20 74 68 65 20 6f 74 68 65 72 20 6f  e or the other o
19790 66 20 74 68 65 20 74 77 6f 20 70 72 6f 63 65 73  f the two proces
197a0 73 65 73 20 6d 75 73 74 20 67 69 76 65 20 77 61  ses must give wa
197b0 79 20 6f 72 20 74 68 65 72 65 20 63 61 6e 20 62  y or there can b
197c0 65 0a 2a 2a 20 6e 6f 20 70 72 6f 67 72 65 73 73  e.** no progress
197d0 2e 20 20 42 79 20 72 65 74 75 72 6e 69 6e 67 20  .  By returning 
197e0 53 51 4c 49 54 45 5f 42 55 53 59 20 61 6e 64 20  SQLITE_BUSY and 
197f0 6e 6f 74 20 69 6e 76 6f 6b 69 6e 67 20 74 68 65  not invoking the
19800 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 0a 2a   busy callback.*
19810 2a 20 77 68 65 6e 20 41 20 61 6c 72 65 61 64 79  * when A already
19820 20 68 61 73 20 61 20 72 65 61 64 20 6c 6f 63 6b   has a read lock
19830 2c 20 77 65 20 65 6e 63 6f 75 72 61 67 65 20 41  , we encourage A
19840 20 74 6f 20 67 69 76 65 20 75 70 20 61 6e 64 20   to give up and 
19850 6c 65 74 20 42 0a 2a 2a 20 70 72 6f 63 65 65 64  let B.** proceed
19860 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
19870 42 74 72 65 65 42 65 67 69 6e 54 72 61 6e 73 28  BtreeBeginTrans(
19880 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 77 72  Btree *p, int wr
19890 66 6c 61 67 29 7b 0a 20 20 73 71 6c 69 74 65 33  flag){.  sqlite3
198a0 20 2a 70 42 6c 6f 63 6b 20 3d 20 30 3b 0a 20 20   *pBlock = 0;.  
198b0 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
198c0 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72 63  p->pBt;.  int rc
198d0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
198e0 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
198f0 65 72 28 70 29 3b 0a 20 20 62 74 72 65 65 49 6e  er(p);.  btreeIn
19900 74 65 67 72 69 74 79 28 70 29 3b 0a 0a 20 20 2f  tegrity(p);..  /
19910 2a 20 49 66 20 74 68 65 20 62 74 72 65 65 20 69  * If the btree i
19920 73 20 61 6c 72 65 61 64 79 20 69 6e 20 61 20 77  s already in a w
19930 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
19940 2c 20 6f 72 20 69 74 0a 20 20 2a 2a 20 69 73 20  , or it.  ** is 
19950 61 6c 72 65 61 64 79 20 69 6e 20 61 20 72 65 61  already in a rea
19960 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e  d-transaction an
19970 64 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63  d a read-transac
19980 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 72 65 71  tion.  ** is req
19990 75 65 73 74 65 64 2c 20 74 68 69 73 20 69 73 20  uested, this is 
199a0 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20  a no-op..  */.  
199b0 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d  if( p->inTrans==
199c0 54 52 41 4e 53 5f 57 52 49 54 45 20 7c 7c 20 28  TRANS_WRITE || (
199d0 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  p->inTrans==TRAN
199e0 53 5f 52 45 41 44 20 26 26 20 21 77 72 66 6c 61  S_READ && !wrfla
199f0 67 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 74  g) ){.    goto t
19a00 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a  rans_begun;.  }.
19a10 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69    assert( pBt->i
19a20 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52  nTransaction==TR
19a30 41 4e 53 5f 57 52 49 54 45 20 7c 7c 20 49 66 4e  ANS_WRITE || IfN
19a40 6f 74 4f 6d 69 74 41 56 28 70 42 74 2d 3e 62 44  otOmitAV(pBt->bD
19a50 6f 54 72 75 6e 63 61 74 65 29 3d 3d 30 20 29 3b  oTruncate)==0 );
19a60 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20 74 72 61  ..  /* Write tra
19a70 6e 73 61 63 74 69 6f 6e 73 20 61 72 65 20 6e 6f  nsactions are no
19a80 74 20 70 6f 73 73 69 62 6c 65 20 6f 6e 20 61 20  t possible on a 
19a90 72 65 61 64 2d 6f 6e 6c 79 20 64 61 74 61 62 61  read-only databa
19aa0 73 65 20 2a 2f 0a 20 20 69 66 28 20 28 70 42 74  se */.  if( (pBt
19ab0 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53  ->btsFlags & BTS
19ac0 5f 52 45 41 44 5f 4f 4e 4c 59 29 21 3d 30 20 26  _READ_ONLY)!=0 &
19ad0 26 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20  & wrflag ){.    
19ae0 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44  rc = SQLITE_READ
19af0 4f 4e 4c 59 3b 0a 20 20 20 20 67 6f 74 6f 20 74  ONLY;.    goto t
19b00 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a  rans_begun;.  }.
19b10 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
19b20 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
19b30 45 0a 20 20 2f 2a 20 49 66 20 61 6e 6f 74 68 65  E.  /* If anothe
19b40 72 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  r database handl
19b50 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 6f 70  e has already op
19b60 65 6e 65 64 20 61 20 77 72 69 74 65 20 74 72 61  ened a write tra
19b70 6e 73 61 63 74 69 6f 6e 20 0a 20 20 2a 2a 20 6f  nsaction .  ** o
19b80 6e 20 74 68 69 73 20 73 68 61 72 65 64 2d 62 74  n this shared-bt
19b90 72 65 65 20 73 74 72 75 63 74 75 72 65 20 61 6e  ree structure an
19ba0 64 20 61 20 73 65 63 6f 6e 64 20 77 72 69 74 65  d a second write
19bb0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 0a   transaction is.
19bc0 20 20 2a 2a 20 72 65 71 75 65 73 74 65 64 2c 20    ** requested, 
19bd0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f  return SQLITE_LO
19be0 43 4b 45 44 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  CKED..  */.  if(
19bf0 20 28 77 72 66 6c 61 67 20 26 26 20 70 42 74 2d   (wrflag && pBt-
19c00 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d  >inTransaction==
19c10 54 52 41 4e 53 5f 57 52 49 54 45 29 0a 20 20 20  TRANS_WRITE).   
19c20 7c 7c 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67  || (pBt->btsFlag
19c30 73 20 26 20 42 54 53 5f 50 45 4e 44 49 4e 47 29  s & BTS_PENDING)
19c40 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20 70 42 6c  !=0.  ){.    pBl
19c50 6f 63 6b 20 3d 20 70 42 74 2d 3e 70 57 72 69 74  ock = pBt->pWrit
19c60 65 72 2d 3e 64 62 3b 0a 20 20 7d 65 6c 73 65 20  er->db;.  }else 
19c70 69 66 28 20 77 72 66 6c 61 67 3e 31 20 29 7b 0a  if( wrflag>1 ){.
19c80 20 20 20 20 42 74 4c 6f 63 6b 20 2a 70 49 74 65      BtLock *pIte
19c90 72 3b 0a 20 20 20 20 66 6f 72 28 70 49 74 65 72  r;.    for(pIter
19ca0 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 49 74  =pBt->pLock; pIt
19cb0 65 72 3b 20 70 49 74 65 72 3d 70 49 74 65 72 2d  er; pIter=pIter-
19cc0 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69  >pNext){.      i
19cd0 66 28 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65  f( pIter->pBtree
19ce0 21 3d 70 20 29 7b 0a 20 20 20 20 20 20 20 20 70  !=p ){.        p
19cf0 42 6c 6f 63 6b 20 3d 20 70 49 74 65 72 2d 3e 70  Block = pIter->p
19d00 42 74 72 65 65 2d 3e 64 62 3b 0a 20 20 20 20 20  Btree->db;.     
19d10 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
19d20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  }.    }.  }.  if
19d30 28 20 70 42 6c 6f 63 6b 20 29 7b 0a 20 20 20 20  ( pBlock ){.    
19d40 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f  sqlite3Connectio
19d50 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64 62 2c 20  nBlocked(p->db, 
19d60 70 42 6c 6f 63 6b 29 3b 0a 20 20 20 20 72 63 20  pBlock);.    rc 
19d70 3d 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f  = SQLITE_LOCKED_
19d80 53 48 41 52 45 44 43 41 43 48 45 3b 0a 20 20 20  SHAREDCACHE;.   
19d90 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67 75   goto trans_begu
19da0 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  n;.  }.#endif.. 
19db0 20 2f 2a 20 41 6e 79 20 72 65 61 64 2d 6f 6e 6c   /* Any read-onl
19dc0 79 20 6f 72 20 72 65 61 64 2d 77 72 69 74 65 20  y or read-write 
19dd0 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6d 70 6c  transaction impl
19de0 69 65 73 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20  ies a read-lock 
19df0 6f 6e 20 0a 20 20 2a 2a 20 70 61 67 65 20 31 2e  on .  ** page 1.
19e00 20 53 6f 20 69 66 20 73 6f 6d 65 20 6f 74 68 65   So if some othe
19e10 72 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 63  r shared-cache c
19e20 6c 69 65 6e 74 20 61 6c 72 65 61 64 79 20 68 61  lient already ha
19e30 73 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 0a  s a write-lock .
19e40 20 20 2a 2a 20 6f 6e 20 70 61 67 65 20 31 2c 20    ** on page 1, 
19e50 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
19e60 63 61 6e 6e 6f 74 20 62 65 20 6f 70 65 6e 65 64  cannot be opened
19e70 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 71 75 65 72  . */.  rc = quer
19e80 79 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  ySharedCacheTabl
19e90 65 4c 6f 63 6b 28 70 2c 20 4d 41 53 54 45 52 5f  eLock(p, MASTER_
19ea0 52 4f 4f 54 2c 20 52 45 41 44 5f 4c 4f 43 4b 29  ROOT, READ_LOCK)
19eb0 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f  ;.  if( SQLITE_O
19ec0 4b 21 3d 72 63 20 29 20 67 6f 74 6f 20 74 72 61  K!=rc ) goto tra
19ed0 6e 73 5f 62 65 67 75 6e 3b 0a 0a 20 20 70 42 74  ns_begun;..  pBt
19ee0 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d 20 7e 42  ->btsFlags &= ~B
19ef0 54 53 5f 49 4e 49 54 49 41 4c 4c 59 5f 45 4d 50  TS_INITIALLY_EMP
19f00 54 59 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 6e  TY;.  if( pBt->n
19f10 50 61 67 65 3d 3d 30 20 29 20 70 42 74 2d 3e 62  Page==0 ) pBt->b
19f20 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 49  tsFlags |= BTS_I
19f30 4e 49 54 49 41 4c 4c 59 5f 45 4d 50 54 59 3b 0a  NITIALLY_EMPTY;.
19f40 20 20 64 6f 20 7b 0a 20 20 20 20 2f 2a 20 43 61    do {.    /* Ca
19f50 6c 6c 20 6c 6f 63 6b 42 74 72 65 65 28 29 20 75  ll lockBtree() u
19f60 6e 74 69 6c 20 65 69 74 68 65 72 20 70 42 74 2d  ntil either pBt-
19f70 3e 70 50 61 67 65 31 20 69 73 20 70 6f 70 75 6c  >pPage1 is popul
19f80 61 74 65 64 20 6f 72 0a 20 20 20 20 2a 2a 20 6c  ated or.    ** l
19f90 6f 63 6b 42 74 72 65 65 28 29 20 72 65 74 75 72  ockBtree() retur
19fa0 6e 73 20 73 6f 6d 65 74 68 69 6e 67 20 6f 74 68  ns something oth
19fb0 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f  er than SQLITE_O
19fc0 4b 2e 20 6c 6f 63 6b 42 74 72 65 65 28 29 0a 20  K. lockBtree(). 
19fd0 20 20 20 2a 2a 20 6d 61 79 20 72 65 74 75 72 6e     ** may return
19fe0 20 53 51 4c 49 54 45 5f 4f 4b 20 62 75 74 20 6c   SQLITE_OK but l
19ff0 65 61 76 65 20 70 42 74 2d 3e 70 50 61 67 65 31  eave pBt->pPage1
1a000 20 73 65 74 20 74 6f 20 30 20 69 66 20 61 66 74   set to 0 if aft
1a010 65 72 0a 20 20 20 20 2a 2a 20 72 65 61 64 69 6e  er.    ** readin
1a020 67 20 70 61 67 65 20 31 20 69 74 20 64 69 73 63  g page 1 it disc
1a030 6f 76 65 72 73 20 74 68 61 74 20 74 68 65 20 70  overs that the p
1a040 61 67 65 2d 73 69 7a 65 20 6f 66 20 74 68 65 20  age-size of the 
1a050 64 61 74 61 62 61 73 65 20 0a 20 20 20 20 2a 2a  database .    **
1a060 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 70 42 74   file is not pBt
1a070 2d 3e 70 61 67 65 53 69 7a 65 2e 20 49 6e 20 74  ->pageSize. In t
1a080 68 69 73 20 63 61 73 65 20 6c 6f 63 6b 42 74 72  his case lockBtr
1a090 65 65 28 29 20 77 69 6c 6c 20 75 70 64 61 74 65  ee() will update
1a0a0 0a 20 20 20 20 2a 2a 20 70 42 74 2d 3e 70 61 67  .    ** pBt->pag
1a0b0 65 53 69 7a 65 20 74 6f 20 74 68 65 20 70 61 67  eSize to the pag
1a0c0 65 2d 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69  e-size of the fi
1a0d0 6c 65 20 6f 6e 20 64 69 73 6b 2e 0a 20 20 20 20  le on disk..    
1a0e0 2a 2f 0a 20 20 20 20 77 68 69 6c 65 28 20 70 42  */.    while( pB
1a0f0 74 2d 3e 70 50 61 67 65 31 3d 3d 30 20 26 26 20  t->pPage1==0 && 
1a100 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d  SQLITE_OK==(rc =
1a110 20 6c 6f 63 6b 42 74 72 65 65 28 70 42 74 29 29   lockBtree(pBt))
1a120 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 72 63 3d   );..    if( rc=
1a130 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 77 72  =SQLITE_OK && wr
1a140 66 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 69 66  flag ){.      if
1a150 28 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  ( (pBt->btsFlags
1a160 20 26 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59   & BTS_READ_ONLY
1a170 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
1a180 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44  rc = SQLITE_READ
1a190 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ONLY;.      }els
1a1a0 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  e{.        rc = 
1a1b0 73 71 6c 69 74 65 33 50 61 67 65 72 42 65 67 69  sqlite3PagerBegi
1a1c0 6e 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 77 72  n(pBt->pPager,wr
1a1d0 66 6c 61 67 3e 31 2c 73 71 6c 69 74 65 33 54 65  flag>1,sqlite3Te
1a1e0 6d 70 49 6e 4d 65 6d 6f 72 79 28 70 2d 3e 64 62  mpInMemory(p->db
1a1f0 29 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ));.        if( 
1a200 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1a210 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
1a220 6e 65 77 44 61 74 61 62 61 73 65 28 70 42 74 29  newDatabase(pBt)
1a230 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1a240 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20    }.    }.  .   
1a250 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1a260 4f 4b 20 29 7b 0a 20 20 20 20 20 20 75 6e 6c 6f  OK ){.      unlo
1a270 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28  ckBtreeIfUnused(
1a280 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 77  pBt);.    }.  }w
1a290 68 69 6c 65 28 20 28 72 63 26 30 78 46 46 29 3d  hile( (rc&0xFF)=
1a2a0 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20  =SQLITE_BUSY && 
1a2b0 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
1a2c0 6f 6e 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 26  on==TRANS_NONE &
1a2d0 26 0a 20 20 20 20 20 20 20 20 20 20 62 74 72 65  &.          btre
1a2e0 65 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c  eInvokeBusyHandl
1a2f0 65 72 28 70 42 74 29 20 29 3b 0a 0a 20 20 69 66  er(pBt) );..  if
1a300 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1a310 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 6e  ){.    if( p->in
1a320 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 4e 4f 4e  Trans==TRANS_NON
1a330 45 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e  E ){.      pBt->
1a340 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2b 2b 3b 0a  nTransaction++;.
1a350 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1a360 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
1a370 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 73 68  .      if( p->sh
1a380 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20  arable ){.      
1a390 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6c 6f 63    assert( p->loc
1a3a0 6b 2e 70 42 74 72 65 65 3d 3d 70 20 26 26 20 70  k.pBtree==p && p
1a3b0 2d 3e 6c 6f 63 6b 2e 69 54 61 62 6c 65 3d 3d 31  ->lock.iTable==1
1a3c0 20 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6c   );.        p->l
1a3d0 6f 63 6b 2e 65 4c 6f 63 6b 20 3d 20 52 45 41 44  ock.eLock = READ
1a3e0 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 70  _LOCK;.        p
1a3f0 2d 3e 6c 6f 63 6b 2e 70 4e 65 78 74 20 3d 20 70  ->lock.pNext = p
1a400 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 20 20 20  Bt->pLock;.     
1a410 20 20 20 70 42 74 2d 3e 70 4c 6f 63 6b 20 3d 20     pBt->pLock = 
1a420 26 70 2d 3e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20  &p->lock;.      
1a430 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20  }.#endif.    }. 
1a440 20 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20     p->inTrans = 
1a450 28 77 72 66 6c 61 67 3f 54 52 41 4e 53 5f 57 52  (wrflag?TRANS_WR
1a460 49 54 45 3a 54 52 41 4e 53 5f 52 45 41 44 29 3b  ITE:TRANS_READ);
1a470 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 6e 54 72  .    if( p->inTr
1a480 61 6e 73 3e 70 42 74 2d 3e 69 6e 54 72 61 6e 73  ans>pBt->inTrans
1a490 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20  action ){.      
1a4a0 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
1a4b0 6f 6e 20 3d 20 70 2d 3e 69 6e 54 72 61 6e 73 3b  on = p->inTrans;
1a4c0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 77  .    }.    if( w
1a4d0 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 4d  rflag ){.      M
1a4e0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 20 3d  emPage *pPage1 =
1a4f0 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 23 69   pBt->pPage1;.#i
1a500 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1a510 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20  T_SHARED_CACHE. 
1a520 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 42       assert( !pB
1a530 74 2d 3e 70 57 72 69 74 65 72 20 29 3b 0a 20 20  t->pWriter );.  
1a540 20 20 20 20 70 42 74 2d 3e 70 57 72 69 74 65 72      pBt->pWriter
1a550 20 3d 20 70 3b 0a 20 20 20 20 20 20 70 42 74 2d   = p;.      pBt-
1a560 3e 62 74 73 46 6c 61 67 73 20 26 3d 20 7e 42 54  >btsFlags &= ~BT
1a570 53 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 20  S_EXCLUSIVE;.   
1a580 20 20 20 69 66 28 20 77 72 66 6c 61 67 3e 31 20     if( wrflag>1 
1a590 29 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20  ) pBt->btsFlags 
1a5a0 7c 3d 20 42 54 53 5f 45 58 43 4c 55 53 49 56 45  |= BTS_EXCLUSIVE
1a5b0 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20 20  ;.#endif..      
1a5c0 2f 2a 20 49 66 20 74 68 65 20 64 62 2d 73 69 7a  /* If the db-siz
1a5d0 65 20 68 65 61 64 65 72 20 66 69 65 6c 64 20 69  e header field i
1a5e0 73 20 69 6e 63 6f 72 72 65 63 74 20 28 61 73 20  s incorrect (as 
1a5f0 69 74 20 6d 61 79 20 62 65 20 69 66 20 61 6e 20  it may be if an 
1a600 6f 6c 64 0a 20 20 20 20 20 20 2a 2a 20 63 6c 69  old.      ** cli
1a610 65 6e 74 20 68 61 73 20 62 65 65 6e 20 77 72 69  ent has been wri
1a620 74 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73  ting the databas
1a630 65 20 66 69 6c 65 29 2c 20 75 70 64 61 74 65 20  e file), update 
1a640 69 74 20 6e 6f 77 2e 20 44 6f 69 6e 67 0a 20 20  it now. Doing.  
1a650 20 20 20 20 2a 2a 20 74 68 69 73 20 73 6f 6f 6e      ** this soon
1a660 65 72 20 72 61 74 68 65 72 20 74 68 61 6e 20 6c  er rather than l
1a670 61 74 65 72 20 6d 65 61 6e 73 20 74 68 65 20 64  ater means the d
1a680 61 74 61 62 61 73 65 20 73 69 7a 65 20 63 61 6e  atabase size can
1a690 20 73 61 66 65 6c 79 20 0a 20 20 20 20 20 20 2a   safely .      *
1a6a0 2a 20 72 65 2d 72 65 61 64 20 74 68 65 20 64 61  * re-read the da
1a6b0 74 61 62 61 73 65 20 73 69 7a 65 20 66 72 6f 6d  tabase size from
1a6c0 20 70 61 67 65 20 31 20 69 66 20 61 20 73 61 76   page 1 if a sav
1a6d0 65 70 6f 69 6e 74 20 6f 72 20 74 72 61 6e 73 61  epoint or transa
1a6e0 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 72  ction.      ** r
1a6f0 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 20 77  ollback occurs w
1a700 69 74 68 69 6e 20 74 68 65 20 74 72 61 6e 73 61  ithin the transa
1a710 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a  ction..      */.
1a720 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6e        if( pBt->n
1a730 50 61 67 65 21 3d 67 65 74 34 62 79 74 65 28 26  Page!=get4byte(&
1a740 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 32 38  pPage1->aData[28
1a750 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  ]) ){.        rc
1a760 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
1a770 72 69 74 65 28 70 50 61 67 65 31 2d 3e 70 44 62  rite(pPage1->pDb
1a780 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69  Page);.        i
1a790 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1a7a0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 75   ){.          pu
1a7b0 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e  t4byte(&pPage1->
1a7c0 61 44 61 74 61 5b 32 38 5d 2c 20 70 42 74 2d 3e  aData[28], pBt->
1a7d0 6e 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  nPage);.        
1a7e0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
1a7f0 20 20 7d 0a 0a 0a 74 72 61 6e 73 5f 62 65 67 75    }...trans_begu
1a800 6e 3a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  n:.  if( rc==SQL
1a810 49 54 45 5f 4f 4b 20 26 26 20 77 72 66 6c 61 67  ITE_OK && wrflag
1a820 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20   ){.    /* This 
1a830 63 61 6c 6c 20 6d 61 6b 65 73 20 73 75 72 65 20  call makes sure 
1a840 74 68 61 74 20 74 68 65 20 70 61 67 65 72 20 68  that the pager h
1a850 61 73 20 74 68 65 20 63 6f 72 72 65 63 74 20 6e  as the correct n
1a860 75 6d 62 65 72 20 6f 66 0a 20 20 20 20 2a 2a 20  umber of.    ** 
1a870 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 2e  open savepoints.
1a880 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20 70   If the second p
1a890 61 72 61 6d 65 74 65 72 20 69 73 20 67 72 65 61  arameter is grea
1a8a0 74 65 72 20 74 68 61 6e 20 30 20 61 6e 64 0a 20  ter than 0 and. 
1a8b0 20 20 20 2a 2a 20 74 68 65 20 73 75 62 2d 6a 6f     ** the sub-jo
1a8c0 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20 61 6c 72  urnal is not alr
1a8d0 65 61 64 79 20 6f 70 65 6e 2c 20 74 68 65 6e 20  eady open, then 
1a8e0 69 74 20 77 69 6c 6c 20 62 65 20 6f 70 65 6e 65  it will be opene
1a8f0 64 20 68 65 72 65 2e 0a 20 20 20 20 2a 2f 0a 20  d here..    */. 
1a900 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
1a910 61 67 65 72 4f 70 65 6e 53 61 76 65 70 6f 69 6e  agerOpenSavepoin
1a920 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70  t(pBt->pPager, p
1a930 2d 3e 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74  ->db->nSavepoint
1a940 29 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65 49  );.  }..  btreeI
1a950 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 20 20 73  ntegrity(p);.  s
1a960 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
1a970 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
1a980 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
1a990 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
1a9a0 55 55 4d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  UUM../*.** Set t
1a9b0 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65  he pointer-map e
1a9c0 6e 74 72 69 65 73 20 66 6f 72 20 61 6c 6c 20 63  ntries for all c
1a9d0 68 69 6c 64 72 65 6e 20 6f 66 20 70 61 67 65 20  hildren of page 
1a9e0 70 50 61 67 65 2e 20 41 6c 73 6f 2c 20 69 66 0a  pPage. Also, if.
1a9f0 2a 2a 20 70 50 61 67 65 20 63 6f 6e 74 61 69 6e  ** pPage contain
1aa00 73 20 63 65 6c 6c 73 20 74 68 61 74 20 70 6f 69  s cells that poi
1aa10 6e 74 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70  nt to overflow p
1aa20 61 67 65 73 2c 20 73 65 74 20 74 68 65 20 70 6f  ages, set the po
1aa30 69 6e 74 65 72 0a 2a 2a 20 6d 61 70 20 65 6e 74  inter.** map ent
1aa40 72 69 65 73 20 66 6f 72 20 74 68 65 20 6f 76 65  ries for the ove
1aa50 72 66 6c 6f 77 20 70 61 67 65 73 20 61 73 20 77  rflow pages as w
1aa60 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ell..*/.static i
1aa70 6e 74 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61  nt setChildPtrma
1aa80 70 73 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ps(MemPage *pPag
1aa90 65 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20  e){.  int i;    
1aaa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aab0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 75 6e           /* Coun
1aac0 74 65 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a  ter variable */.
1aad0 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 20 20    int nCell;    
1aae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aaf0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1ab00 66 20 63 65 6c 6c 73 20 69 6e 20 70 61 67 65 20  f cells in page 
1ab10 70 50 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 72  pPage */.  int r
1ab20 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
1ab30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1ab40 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
1ab50 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
1ab60 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20  = pPage->pBt;.  
1ab70 75 38 20 69 73 49 6e 69 74 4f 72 69 67 20 3d 20  u8 isInitOrig = 
1ab80 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 3b 0a 20  pPage->isInit;. 
1ab90 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 50 61   Pgno pgno = pPa
1aba0 67 65 2d 3e 70 67 6e 6f 3b 0a 0a 20 20 61 73 73  ge->pgno;..  ass
1abb0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
1abc0 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
1abd0 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
1abe0 72 63 20 3d 20 62 74 72 65 65 49 6e 69 74 50 61  rc = btreeInitPa
1abf0 67 65 28 70 50 61 67 65 29 3b 0a 20 20 69 66 28  ge(pPage);.  if(
1ac00 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1ac10 7b 0a 20 20 20 20 67 6f 74 6f 20 73 65 74 5f 63  {.    goto set_c
1ac20 68 69 6c 64 5f 70 74 72 6d 61 70 73 5f 6f 75 74  hild_ptrmaps_out
1ac30 3b 0a 20 20 7d 0a 20 20 6e 43 65 6c 6c 20 3d 20  ;.  }.  nCell = 
1ac40 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20  pPage->nCell;.. 
1ac50 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c   for(i=0; i<nCel
1ac60 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20  l; i++){.    u8 
1ac70 2a 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c  *pCell = findCel
1ac80 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a 0a 20 20  l(pPage, i);..  
1ac90 20 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50    ptrmapPutOvflP
1aca0 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c  tr(pPage, pCell,
1acb0 20 26 72 63 29 3b 0a 0a 20 20 20 20 69 66 28 20   &rc);..    if( 
1acc0 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a  !pPage->leaf ){.
1acd0 20 20 20 20 20 20 50 67 6e 6f 20 63 68 69 6c 64        Pgno child
1ace0 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28  Pgno = get4byte(
1acf0 70 43 65 6c 6c 29 3b 0a 20 20 20 20 20 20 70 74  pCell);.      pt
1ad00 72 6d 61 70 50 75 74 28 70 42 74 2c 20 63 68 69  rmapPut(pBt, chi
1ad10 6c 64 50 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42  ldPgno, PTRMAP_B
1ad20 54 52 45 45 2c 20 70 67 6e 6f 2c 20 26 72 63 29  TREE, pgno, &rc)
1ad30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  ;.    }.  }..  i
1ad40 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  f( !pPage->leaf 
1ad50 29 7b 0a 20 20 20 20 50 67 6e 6f 20 63 68 69 6c  ){.    Pgno chil
1ad60 64 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65  dPgno = get4byte
1ad70 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  (&pPage->aData[p
1ad80 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
1ad90 38 5d 29 3b 0a 20 20 20 20 70 74 72 6d 61 70 50  8]);.    ptrmapP
1ada0 75 74 28 70 42 74 2c 20 63 68 69 6c 64 50 67 6e  ut(pBt, childPgn
1adb0 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c  o, PTRMAP_BTREE,
1adc0 20 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 7d   pgno, &rc);.  }
1add0 0a 0a 73 65 74 5f 63 68 69 6c 64 5f 70 74 72 6d  ..set_child_ptrm
1ade0 61 70 73 5f 6f 75 74 3a 0a 20 20 70 50 61 67 65  aps_out:.  pPage
1adf0 2d 3e 69 73 49 6e 69 74 20 3d 20 69 73 49 6e 69  ->isInit = isIni
1ae00 74 4f 72 69 67 3b 0a 20 20 72 65 74 75 72 6e 20  tOrig;.  return 
1ae10 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d  rc;.}../*.** Som
1ae20 65 77 68 65 72 65 20 6f 6e 20 70 50 61 67 65 20  ewhere on pPage 
1ae30 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
1ae40 70 61 67 65 20 69 46 72 6f 6d 2e 20 20 4d 6f 64  page iFrom.  Mod
1ae50 69 66 79 20 74 68 69 73 20 70 6f 69 6e 74 65 72  ify this pointer
1ae60 20 73 6f 0a 2a 2a 20 74 68 61 74 20 69 74 20 70   so.** that it p
1ae70 6f 69 6e 74 73 20 74 6f 20 69 54 6f 2e 20 50 61  oints to iTo. Pa
1ae80 72 61 6d 65 74 65 72 20 65 54 79 70 65 20 64 65  rameter eType de
1ae90 73 63 72 69 62 65 73 20 74 68 65 20 74 79 70 65  scribes the type
1aea0 20 6f 66 20 70 6f 69 6e 74 65 72 20 74 6f 0a 2a   of pointer to.*
1aeb0 2a 20 62 65 20 6d 6f 64 69 66 69 65 64 2c 20 61  * be modified, a
1aec0 73 20 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  s  follows:.**.*
1aed0 2a 20 50 54 52 4d 41 50 5f 42 54 52 45 45 3a 20  * PTRMAP_BTREE: 
1aee0 20 20 20 20 70 50 61 67 65 20 69 73 20 61 20 62      pPage is a b
1aef0 74 72 65 65 2d 70 61 67 65 2e 20 54 68 65 20 70  tree-page. The p
1af00 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20 61 74  ointer points at
1af10 20 61 20 63 68 69 6c 64 20 0a 2a 2a 20 20 20 20   a child .**    
1af20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
1af30 61 67 65 20 6f 66 20 70 50 61 67 65 2e 0a 2a 2a  age of pPage..**
1af40 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f 56 45 52 46  .** PTRMAP_OVERF
1af50 4c 4f 57 31 3a 20 70 50 61 67 65 20 69 73 20 61  LOW1: pPage is a
1af60 20 62 74 72 65 65 2d 70 61 67 65 2e 20 54 68 65   btree-page. The
1af70 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20   pointer points 
1af80 61 74 20 61 6e 20 6f 76 65 72 66 6c 6f 77 0a 2a  at an overflow.*
1af90 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
1afa0 20 20 20 20 70 61 67 65 20 70 6f 69 6e 74 65 64      page pointed
1afb0 20 74 6f 20 62 79 20 6f 6e 65 20 6f 66 20 74 68   to by one of th
1afc0 65 20 63 65 6c 6c 73 20 6f 6e 20 70 50 61 67 65  e cells on pPage
1afd0 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f  ..**.** PTRMAP_O
1afe0 56 45 52 46 4c 4f 57 32 3a 20 70 50 61 67 65 20  VERFLOW2: pPage 
1aff0 69 73 20 61 6e 20 6f 76 65 72 66 6c 6f 77 2d 70  is an overflow-p
1b000 61 67 65 2e 20 54 68 65 20 70 6f 69 6e 74 65 72  age. The pointer
1b010 20 70 6f 69 6e 74 73 20 61 74 20 74 68 65 20 6e   points at the n
1b020 65 78 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ext.**          
1b030 20 20 20 20 20 20 20 20 20 6f 76 65 72 66 6c 6f           overflo
1b040 77 20 70 61 67 65 20 69 6e 20 74 68 65 20 6c 69  w page in the li
1b050 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  st..*/.static in
1b060 74 20 6d 6f 64 69 66 79 50 61 67 65 50 6f 69 6e  t modifyPagePoin
1b070 74 65 72 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  ter(MemPage *pPa
1b080 67 65 2c 20 50 67 6e 6f 20 69 46 72 6f 6d 2c 20  ge, Pgno iFrom, 
1b090 50 67 6e 6f 20 69 54 6f 2c 20 75 38 20 65 54 79  Pgno iTo, u8 eTy
1b0a0 70 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73  pe){.  assert( s
1b0b0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
1b0c0 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
1b0d0 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
1b0e0 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
1b0f0 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
1b100 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 69  >pDbPage) );.  i
1b110 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  f( eType==PTRMAP
1b120 5f 4f 56 45 52 46 4c 4f 57 32 20 29 7b 0a 20 20  _OVERFLOW2 ){.  
1b130 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72    /* The pointer
1b140 20 69 73 20 61 6c 77 61 79 73 20 74 68 65 20 66   is always the f
1b150 69 72 73 74 20 34 20 62 79 74 65 73 20 6f 66 20  irst 4 bytes of 
1b160 74 68 65 20 70 61 67 65 20 69 6e 20 74 68 69 73  the page in this
1b170 20 63 61 73 65 2e 20 20 2a 2f 0a 20 20 20 20 69   case.  */.    i
1b180 66 28 20 67 65 74 34 62 79 74 65 28 70 50 61 67  f( get4byte(pPag
1b190 65 2d 3e 61 44 61 74 61 29 21 3d 69 46 72 6f 6d  e->aData)!=iFrom
1b1a0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
1b1b0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
1b1c0 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20  BKPT;.    }.    
1b1d0 70 75 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e  put4byte(pPage->
1b1e0 61 44 61 74 61 2c 20 69 54 6f 29 3b 0a 20 20 7d  aData, iTo);.  }
1b1f0 65 6c 73 65 7b 0a 20 20 20 20 75 38 20 69 73 49  else{.    u8 isI
1b200 6e 69 74 4f 72 69 67 20 3d 20 70 50 61 67 65 2d  nitOrig = pPage-
1b210 3e 69 73 49 6e 69 74 3b 0a 20 20 20 20 69 6e 74  >isInit;.    int
1b220 20 69 3b 0a 20 20 20 20 69 6e 74 20 6e 43 65 6c   i;.    int nCel
1b230 6c 3b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 0a  l;.    int rc;..
1b240 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 49 6e      rc = btreeIn
1b250 69 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  itPage(pPage);. 
1b260 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
1b270 72 6e 20 72 63 3b 0a 20 20 20 20 6e 43 65 6c 6c  rn rc;.    nCell
1b280 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b   = pPage->nCell;
1b290 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ..    for(i=0; i
1b2a0 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20  <nCell; i++){.  
1b2b0 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20      u8 *pCell = 
1b2c0 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20  findCell(pPage, 
1b2d0 69 29 3b 0a 20 20 20 20 20 20 69 66 28 20 65 54  i);.      if( eT
1b2e0 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52  ype==PTRMAP_OVER
1b2f0 46 4c 4f 57 31 20 29 7b 0a 20 20 20 20 20 20 20  FLOW1 ){.       
1b300 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a   CellInfo info;.
1b310 20 20 20 20 20 20 20 20 70 50 61 67 65 2d 3e 78          pPage->x
1b320 50 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c  ParseCell(pPage,
1b330 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a   pCell, &info);.
1b340 20 20 20 20 20 20 20 20 69 66 28 20 69 6e 66 6f          if( info
1b350 2e 69 4f 76 65 72 66 6c 6f 77 0a 20 20 20 20 20  .iOverflow.     
1b360 20 20 20 20 26 26 20 70 43 65 6c 6c 2b 69 6e 66      && pCell+inf
1b370 6f 2e 69 4f 76 65 72 66 6c 6f 77 2b 33 3c 3d 70  o.iOverflow+3<=p
1b380 50 61 67 65 2d 3e 61 44 61 74 61 2b 70 50 61 67  Page->aData+pPag
1b390 65 2d 3e 6d 61 73 6b 50 61 67 65 0a 20 20 20 20  e->maskPage.    
1b3a0 20 20 20 20 20 26 26 20 69 46 72 6f 6d 3d 3d 67       && iFrom==g
1b3b0 65 74 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69  et4byte(&pCell[i
1b3c0 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 0a  nfo.iOverflow]).
1b3d0 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
1b3e0 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
1b3f0 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66  Cell[info.iOverf
1b400 6c 6f 77 5d 2c 20 69 54 6f 29 3b 0a 20 20 20 20  low], iTo);.    
1b410 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1b420 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
1b430 73 65 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  se{.        if( 
1b440 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c 29 3d  get4byte(pCell)=
1b450 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20  =iFrom ){.      
1b460 20 20 20 20 70 75 74 34 62 79 74 65 28 70 43 65      put4byte(pCe
1b470 6c 6c 2c 20 69 54 6f 29 3b 0a 20 20 20 20 20 20  ll, iTo);.      
1b480 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
1b490 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
1b4a0 20 7d 0a 20 20 0a 20 20 20 20 69 66 28 20 69 3d   }.  .    if( i=
1b4b0 3d 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20  =nCell ){.      
1b4c0 69 66 28 20 65 54 79 70 65 21 3d 50 54 52 4d 41  if( eType!=PTRMA
1b4d0 50 5f 42 54 52 45 45 20 7c 7c 20 0a 20 20 20 20  P_BTREE || .    
1b4e0 20 20 20 20 20 20 67 65 74 34 62 79 74 65 28 26        get4byte(&
1b4f0 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61  pPage->aData[pPa
1b500 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  ge->hdrOffset+8]
1b510 29 21 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20  )!=iFrom ){.    
1b520 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1b530 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
1b540 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 75        }.      pu
1b550 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61  t4byte(&pPage->a
1b560 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f  Data[pPage->hdrO
1b570 66 66 73 65 74 2b 38 5d 2c 20 69 54 6f 29 3b 0a  ffset+8], iTo);.
1b580 20 20 20 20 7d 0a 0a 20 20 20 20 70 50 61 67 65      }..    pPage
1b590 2d 3e 69 73 49 6e 69 74 20 3d 20 69 73 49 6e 69  ->isInit = isIni
1b5a0 74 4f 72 69 67 3b 0a 20 20 7d 0a 20 20 72 65 74  tOrig;.  }.  ret
1b5b0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
1b5c0 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68  .../*.** Move th
1b5d0 65 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20  e open database 
1b5e0 70 61 67 65 20 70 44 62 50 61 67 65 20 74 6f 20  page pDbPage to 
1b5f0 6c 6f 63 61 74 69 6f 6e 20 69 46 72 65 65 50 61  location iFreePa
1b600 67 65 20 69 6e 20 74 68 65 20 0a 2a 2a 20 64 61  ge in the .** da
1b610 74 61 62 61 73 65 2e 20 54 68 65 20 70 44 62 50  tabase. The pDbP
1b620 61 67 65 20 72 65 66 65 72 65 6e 63 65 20 72 65  age reference re
1b630 6d 61 69 6e 73 20 76 61 6c 69 64 2e 0a 2a 2a 0a  mains valid..**.
1b640 2a 2a 20 54 68 65 20 69 73 43 6f 6d 6d 69 74 20  ** The isCommit 
1b650 66 6c 61 67 20 69 6e 64 69 63 61 74 65 73 20 74  flag indicates t
1b660 68 61 74 20 74 68 65 72 65 20 69 73 20 6e 6f 20  hat there is no 
1b670 6e 65 65 64 20 74 6f 20 72 65 6d 65 6d 62 65 72  need to remember
1b680 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 6a 6f 75   that.** the jou
1b690 72 6e 61 6c 20 6e 65 65 64 73 20 74 6f 20 62 65  rnal needs to be
1b6a0 20 73 79 6e 63 28 29 65 64 20 62 65 66 6f 72 65   sync()ed before
1b6b0 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20 70   database page p
1b6c0 44 62 50 61 67 65 2d 3e 70 67 6e 6f 20 0a 2a 2a  DbPage->pgno .**
1b6d0 20 63 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20   can be written 
1b6e0 74 6f 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 68  to. The caller h
1b6f0 61 73 20 61 6c 72 65 61 64 79 20 70 72 6f 6d 69  as already promi
1b700 73 65 64 20 6e 6f 74 20 74 6f 20 77 72 69 74 65  sed not to write
1b710 20 74 6f 20 74 68 61 74 0a 2a 2a 20 70 61 67 65   to that.** page
1b720 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1b730 72 65 6c 6f 63 61 74 65 50 61 67 65 28 0a 20 20  relocatePage(.  
1b740 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20  BtShared *pBt,  
1b750 20 20 20 20 20 20 20 20 20 2f 2a 20 42 74 72 65           /* Btre
1b760 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  e */.  MemPage *
1b770 70 44 62 50 61 67 65 2c 20 20 20 20 20 20 20 20  pDbPage,        
1b780 2f 2a 20 4f 70 65 6e 20 70 61 67 65 20 74 6f 20  /* Open page to 
1b790 6d 6f 76 65 20 2a 2f 0a 20 20 75 38 20 65 54 79  move */.  u8 eTy
1b7a0 70 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  pe,             
1b7b0 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61     /* Pointer ma
1b7c0 70 20 27 74 79 70 65 27 20 65 6e 74 72 79 20 66  p 'type' entry f
1b7d0 6f 72 20 70 44 62 50 61 67 65 20 2a 2f 0a 20 20  or pDbPage */.  
1b7e0 50 67 6e 6f 20 69 50 74 72 50 61 67 65 2c 20 20  Pgno iPtrPage,  
1b7f0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
1b800 74 65 72 20 6d 61 70 20 27 70 61 67 65 2d 6e 6f  ter map 'page-no
1b810 27 20 65 6e 74 72 79 20 66 6f 72 20 70 44 62 50  ' entry for pDbP
1b820 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 46  age */.  Pgno iF
1b830 72 65 65 50 61 67 65 2c 20 20 20 20 20 20 20 20  reePage,        
1b840 20 20 2f 2a 20 54 68 65 20 6c 6f 63 61 74 69 6f    /* The locatio
1b850 6e 20 74 6f 20 6d 6f 76 65 20 70 44 62 50 61 67  n to move pDbPag
1b860 65 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 69 73  e to */.  int is
1b870 43 6f 6d 6d 69 74 20 20 20 20 20 20 20 20 20 20  Commit          
1b880 20 20 20 2f 2a 20 69 73 43 6f 6d 6d 69 74 20 66     /* isCommit f
1b890 6c 61 67 20 70 61 73 73 65 64 20 74 6f 20 73 71  lag passed to sq
1b8a0 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65 70 61  lite3PagerMovepa
1b8b0 67 65 20 2a 2f 0a 29 7b 0a 20 20 4d 65 6d 50 61  ge */.){.  MemPa
1b8c0 67 65 20 2a 70 50 74 72 50 61 67 65 3b 20 20 20  ge *pPtrPage;   
1b8d0 2f 2a 20 54 68 65 20 70 61 67 65 20 74 68 61 74  /* The page that
1b8e0 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e   contains a poin
1b8f0 74 65 72 20 74 6f 20 70 44 62 50 61 67 65 20 2a  ter to pDbPage *
1b900 2f 0a 20 20 50 67 6e 6f 20 69 44 62 50 61 67 65  /.  Pgno iDbPage
1b910 20 3d 20 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f   = pDbPage->pgno
1b920 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  ;.  Pager *pPage
1b930 72 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 72 3b  r = pBt->pPager;
1b940 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73  .  int rc;..  as
1b950 73 65 72 74 28 20 65 54 79 70 65 3d 3d 50 54 52  sert( eType==PTR
1b960 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20 7c 7c  MAP_OVERFLOW2 ||
1b970 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f   eType==PTRMAP_O
1b980 56 45 52 46 4c 4f 57 31 20 7c 7c 20 0a 20 20 20  VERFLOW1 || .   
1b990 20 20 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50     eType==PTRMAP
1b9a0 5f 42 54 52 45 45 20 7c 7c 20 65 54 79 70 65 3d  _BTREE || eType=
1b9b0 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45  =PTRMAP_ROOTPAGE
1b9c0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
1b9d0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
1b9e0 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
1b9f0 20 20 61 73 73 65 72 74 28 20 70 44 62 50 61 67    assert( pDbPag
1ba00 65 2d 3e 70 42 74 3d 3d 70 42 74 20 29 3b 0a 0a  e->pBt==pBt );..
1ba10 20 20 2f 2a 20 4d 6f 76 65 20 70 61 67 65 20 69    /* Move page i
1ba20 44 62 50 61 67 65 20 66 72 6f 6d 20 69 74 73 20  DbPage from its 
1ba30 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e  current location
1ba40 20 74 6f 20 70 61 67 65 20 6e 75 6d 62 65 72 20   to page number 
1ba50 69 46 72 65 65 50 61 67 65 20 2a 2f 0a 20 20 54  iFreePage */.  T
1ba60 52 41 43 45 28 28 22 41 55 54 4f 56 41 43 55 55  RACE(("AUTOVACUU
1ba70 4d 3a 20 4d 6f 76 69 6e 67 20 25 64 20 74 6f 20  M: Moving %d to 
1ba80 66 72 65 65 20 70 61 67 65 20 25 64 20 28 70 74  free page %d (pt
1ba90 72 20 70 61 67 65 20 25 64 20 74 79 70 65 20 25  r page %d type %
1baa0 64 29 5c 6e 22 2c 20 0a 20 20 20 20 20 20 69 44  d)\n", .      iD
1bab0 62 50 61 67 65 2c 20 69 46 72 65 65 50 61 67 65  bPage, iFreePage
1bac0 2c 20 69 50 74 72 50 61 67 65 2c 20 65 54 79 70  , iPtrPage, eTyp
1bad0 65 29 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  e));.  rc = sqli
1bae0 74 65 33 50 61 67 65 72 4d 6f 76 65 70 61 67 65  te3PagerMovepage
1baf0 28 70 50 61 67 65 72 2c 20 70 44 62 50 61 67 65  (pPager, pDbPage
1bb00 2d 3e 70 44 62 50 61 67 65 2c 20 69 46 72 65 65  ->pDbPage, iFree
1bb10 50 61 67 65 2c 20 69 73 43 6f 6d 6d 69 74 29 3b  Page, isCommit);
1bb20 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
1bb30 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75  E_OK ){.    retu
1bb40 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 44 62  rn rc;.  }.  pDb
1bb50 50 61 67 65 2d 3e 70 67 6e 6f 20 3d 20 69 46 72  Page->pgno = iFr
1bb60 65 65 50 61 67 65 3b 0a 0a 20 20 2f 2a 20 49 66  eePage;..  /* If
1bb70 20 70 44 62 50 61 67 65 20 77 61 73 20 61 20 62   pDbPage was a b
1bb80 74 72 65 65 2d 70 61 67 65 2c 20 74 68 65 6e 20  tree-page, then 
1bb90 69 74 20 6d 61 79 20 68 61 76 65 20 63 68 69 6c  it may have chil
1bba0 64 20 70 61 67 65 73 20 61 6e 64 2f 6f 72 20 63  d pages and/or c
1bbb0 65 6c 6c 73 0a 20 20 2a 2a 20 74 68 61 74 20 70  ells.  ** that p
1bbc0 6f 69 6e 74 20 74 6f 20 6f 76 65 72 66 6c 6f 77  oint to overflow
1bbd0 20 70 61 67 65 73 2e 20 54 68 65 20 70 6f 69 6e   pages. The poin
1bbe0 74 65 72 20 6d 61 70 20 65 6e 74 72 69 65 73 20  ter map entries 
1bbf0 66 6f 72 20 61 6c 6c 20 74 68 65 73 65 0a 20 20  for all these.  
1bc00 2a 2a 20 70 61 67 65 73 20 6e 65 65 64 20 74 6f  ** pages need to
1bc10 20 62 65 20 63 68 61 6e 67 65 64 2e 0a 20 20 2a   be changed..  *
1bc20 2a 0a 20 20 2a 2a 20 49 66 20 70 44 62 50 61 67  *.  ** If pDbPag
1bc30 65 20 69 73 20 61 6e 20 6f 76 65 72 66 6c 6f 77  e is an overflow
1bc40 20 70 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20   page, then the 
1bc50 66 69 72 73 74 20 34 20 62 79 74 65 73 20 6d 61  first 4 bytes ma
1bc60 79 20 73 74 6f 72 65 20 61 0a 20 20 2a 2a 20 70  y store a.  ** p
1bc70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 75 62 73  ointer to a subs
1bc80 65 71 75 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20  equent overflow 
1bc90 70 61 67 65 2e 20 49 66 20 74 68 69 73 20 69 73  page. If this is
1bca0 20 74 68 65 20 63 61 73 65 2c 20 74 68 65 6e 0a   the case, then.
1bcb0 20 20 2a 2a 20 74 68 65 20 70 6f 69 6e 74 65 72    ** the pointer
1bcc0 20 6d 61 70 20 6e 65 65 64 73 20 74 6f 20 62 65   map needs to be
1bcd0 20 75 70 64 61 74 65 64 20 66 6f 72 20 74 68 65   updated for the
1bce0 20 73 75 62 73 65 71 75 65 6e 74 20 6f 76 65 72   subsequent over
1bcf0 66 6c 6f 77 20 70 61 67 65 2e 0a 20 20 2a 2f 0a  flow page..  */.
1bd00 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52    if( eType==PTR
1bd10 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20 65 54 79  MAP_BTREE || eTy
1bd20 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50  pe==PTRMAP_ROOTP
1bd30 41 47 45 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  AGE ){.    rc = 
1bd40 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70 73 28  setChildPtrmaps(
1bd50 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66  pDbPage);.    if
1bd60 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1bd70 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
1bd80 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  rc;.    }.  }els
1bd90 65 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 65 78 74  e{.    Pgno next
1bda0 4f 76 66 6c 20 3d 20 67 65 74 34 62 79 74 65 28  Ovfl = get4byte(
1bdb0 70 44 62 50 61 67 65 2d 3e 61 44 61 74 61 29 3b  pDbPage->aData);
1bdc0 0a 20 20 20 20 69 66 28 20 6e 65 78 74 4f 76 66  .    if( nextOvf
1bdd0 6c 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 74  l!=0 ){.      pt
1bde0 72 6d 61 70 50 75 74 28 70 42 74 2c 20 6e 65 78  rmapPut(pBt, nex
1bdf0 74 4f 76 66 6c 2c 20 50 54 52 4d 41 50 5f 4f 56  tOvfl, PTRMAP_OV
1be00 45 52 46 4c 4f 57 32 2c 20 69 46 72 65 65 50 61  ERFLOW2, iFreePa
1be10 67 65 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20  ge, &rc);.      
1be20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1be30 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  K ){.        ret
1be40 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
1be50 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
1be60 46 69 78 20 74 68 65 20 64 61 74 61 62 61 73 65  Fix the database
1be70 20 70 6f 69 6e 74 65 72 20 6f 6e 20 70 61 67 65   pointer on page
1be80 20 69 50 74 72 50 61 67 65 20 74 68 61 74 20 70   iPtrPage that p
1be90 6f 69 6e 74 65 64 20 61 74 20 69 44 62 50 61 67  ointed at iDbPag
1bea0 65 20 73 6f 0a 20 20 2a 2a 20 74 68 61 74 20 69  e so.  ** that i
1beb0 74 20 70 6f 69 6e 74 73 20 61 74 20 69 46 72 65  t points at iFre
1bec0 65 50 61 67 65 2e 20 41 6c 73 6f 20 66 69 78 20  ePage. Also fix 
1bed0 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  the pointer map 
1bee0 65 6e 74 72 79 20 66 6f 72 0a 20 20 2a 2a 20 69  entry for.  ** i
1bef0 50 74 72 50 61 67 65 2e 0a 20 20 2a 2f 0a 20 20  PtrPage..  */.  
1bf00 69 66 28 20 65 54 79 70 65 21 3d 50 54 52 4d 41  if( eType!=PTRMA
1bf10 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20  P_ROOTPAGE ){.  
1bf20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50    rc = btreeGetP
1bf30 61 67 65 28 70 42 74 2c 20 69 50 74 72 50 61 67  age(pBt, iPtrPag
1bf40 65 2c 20 26 70 50 74 72 50 61 67 65 2c 20 30 29  e, &pPtrPage, 0)
1bf50 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
1bf60 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1bf70 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1bf80 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  }.    rc = sqlit
1bf90 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 74  e3PagerWrite(pPt
1bfa0 72 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b  rPage->pDbPage);
1bfb0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
1bfc0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1bfd0 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 74 72  releasePage(pPtr
1bfe0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 72 65 74  Page);.      ret
1bff0 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
1c000 20 20 72 63 20 3d 20 6d 6f 64 69 66 79 50 61 67    rc = modifyPag
1c010 65 50 6f 69 6e 74 65 72 28 70 50 74 72 50 61 67  ePointer(pPtrPag
1c020 65 2c 20 69 44 62 50 61 67 65 2c 20 69 46 72 65  e, iDbPage, iFre
1c030 65 50 61 67 65 2c 20 65 54 79 70 65 29 3b 0a 20  ePage, eType);. 
1c040 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
1c050 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20 69 66  PtrPage);.    if
1c060 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1c070 29 7b 0a 20 20 20 20 20 20 70 74 72 6d 61 70 50  ){.      ptrmapP
1c080 75 74 28 70 42 74 2c 20 69 46 72 65 65 50 61 67  ut(pBt, iFreePag
1c090 65 2c 20 65 54 79 70 65 2c 20 69 50 74 72 50 61  e, eType, iPtrPa
1c0a0 67 65 2c 20 26 72 63 29 3b 0a 20 20 20 20 7d 0a  ge, &rc);.    }.
1c0b0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
1c0c0 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 64  .}../* Forward d
1c0d0 65 63 6c 61 72 61 74 69 6f 6e 20 72 65 71 75 69  eclaration requi
1c0e0 72 65 64 20 62 79 20 69 6e 63 72 56 61 63 75 75  red by incrVacuu
1c0f0 6d 53 74 65 70 28 29 2e 20 2a 2f 0a 73 74 61 74  mStep(). */.stat
1c100 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 42  ic int allocateB
1c110 74 72 65 65 50 61 67 65 28 42 74 53 68 61 72 65  treePage(BtShare
1c120 64 20 2a 2c 20 4d 65 6d 50 61 67 65 20 2a 2a 2c  d *, MemPage **,
1c130 20 50 67 6e 6f 20 2a 2c 20 50 67 6e 6f 2c 20 75   Pgno *, Pgno, u
1c140 38 29 3b 0a 0a 2f 2a 0a 2a 2a 20 50 65 72 66 6f  8);../*.** Perfo
1c150 72 6d 20 61 20 73 69 6e 67 6c 65 20 73 74 65 70  rm a single step
1c160 20 6f 66 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74   of an increment
1c170 61 6c 2d 76 61 63 75 75 6d 2e 20 49 66 20 73 75  al-vacuum. If su
1c180 63 63 65 73 73 66 75 6c 2c 20 72 65 74 75 72 6e  ccessful, return
1c190 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49  .** SQLITE_OK. I
1c1a0 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 77 6f  f there is no wo
1c1b0 72 6b 20 74 6f 20 64 6f 20 28 61 6e 64 20 74 68  rk to do (and th
1c1c0 65 72 65 66 6f 72 65 20 6e 6f 20 70 6f 69 6e 74  erefore no point
1c1d0 20 69 6e 20 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20   in .** calling 
1c1e0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 67  this function ag
1c1f0 61 69 6e 29 2c 20 72 65 74 75 72 6e 20 53 51 4c  ain), return SQL
1c200 49 54 45 5f 44 4f 4e 45 2e 20 4f 72 2c 20 69 66  ITE_DONE. Or, if
1c210 20 61 6e 20 65 72 72 6f 72 20 0a 2a 2a 20 6f 63   an error .** oc
1c220 63 75 72 73 2c 20 72 65 74 75 72 6e 20 73 6f 6d  curs, return som
1c230 65 20 6f 74 68 65 72 20 65 72 72 6f 72 20 63 6f  e other error co
1c240 64 65 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 72 65 20 73  de..**.** More s
1c250 70 65 63 69 66 69 63 61 6c 6c 79 2c 20 74 68 69  pecifically, thi
1c260 73 20 66 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d  s function attem
1c270 70 74 73 20 74 6f 20 72 65 2d 6f 72 67 61 6e 69  pts to re-organi
1c280 7a 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ze the database 
1c290 73 6f 20 0a 2a 2a 20 74 68 61 74 20 74 68 65 20  so .** that the 
1c2a0 6c 61 73 74 20 70 61 67 65 20 6f 66 20 74 68 65  last page of the
1c2b0 20 66 69 6c 65 20 63 75 72 72 65 6e 74 6c 79 20   file currently 
1c2c0 69 6e 20 75 73 65 20 69 73 20 6e 6f 20 6c 6f 6e  in use is no lon
1c2d0 67 65 72 20 69 6e 20 75 73 65 2e 0a 2a 2a 0a 2a  ger in use..**.*
1c2e0 2a 20 50 61 72 61 6d 65 74 65 72 20 6e 46 69 6e  * Parameter nFin
1c2f0 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
1c300 66 20 70 61 67 65 73 20 74 68 61 74 20 74 68 69  f pages that thi
1c310 73 20 64 61 74 61 62 61 73 65 20 77 6f 75 6c 64  s database would
1c320 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 77 65 72 65   contain.** were
1c330 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63   this function c
1c340 61 6c 6c 65 64 20 75 6e 74 69 6c 20 69 74 20 72  alled until it r
1c350 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 44 4f  eturns SQLITE_DO
1c360 4e 45 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  NE..**.** If the
1c370 20 62 43 6f 6d 6d 69 74 20 70 61 72 61 6d 65 74   bCommit paramet
1c380 65 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  er is non-zero, 
1c390 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 73  this function as
1c3a0 73 75 6d 65 73 20 74 68 61 74 20 74 68 65 20 0a  sumes that the .
1c3b0 2a 2a 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 6b  ** caller will k
1c3c0 65 65 70 20 63 61 6c 6c 69 6e 67 20 69 6e 63 72  eep calling incr
1c3d0 56 61 63 75 75 6d 53 74 65 70 28 29 20 75 6e 74  VacuumStep() unt
1c3e0 69 6c 20 69 74 20 72 65 74 75 72 6e 73 20 53 51  il it returns SQ
1c3f0 4c 49 54 45 5f 44 4f 4e 45 20 0a 2a 2a 20 6f 72  LITE_DONE .** or
1c400 20 61 6e 20 65 72 72 6f 72 2e 20 62 43 6f 6d 6d   an error. bComm
1c410 69 74 20 69 73 20 70 61 73 73 65 64 20 74 72 75  it is passed tru
1c420 65 20 66 6f 72 20 61 6e 20 61 75 74 6f 2d 76 61  e for an auto-va
1c430 63 75 75 6d 2d 6f 6e 2d 63 6f 6d 6d 69 74 20 0a  cuum-on-commit .
1c440 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 2c 20 6f 72  ** operation, or
1c450 20 66 61 6c 73 65 20 66 6f 72 20 61 6e 20 69 6e   false for an in
1c460 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d  cremental vacuum
1c470 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1c480 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28 42  incrVacuumStep(B
1c490 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67  tShared *pBt, Pg
1c4a0 6e 6f 20 6e 46 69 6e 2c 20 50 67 6e 6f 20 69 4c  no nFin, Pgno iL
1c4b0 61 73 74 50 67 2c 20 69 6e 74 20 62 43 6f 6d 6d  astPg, int bComm
1c4c0 69 74 29 7b 0a 20 20 50 67 6e 6f 20 6e 46 72 65  it){.  Pgno nFre
1c4d0 65 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20 20  eList;          
1c4e0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
1c4f0 67 65 73 20 73 74 69 6c 6c 20 6f 6e 20 74 68 65  ges still on the
1c500 20 66 72 65 65 2d 6c 69 73 74 20 2a 2f 0a 20 20   free-list */.  
1c510 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72  int rc;..  asser
1c520 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
1c530 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
1c540 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  ) );.  assert( i
1c550 4c 61 73 74 50 67 3e 6e 46 69 6e 20 29 3b 0a 0a  LastPg>nFin );..
1c560 20 20 69 66 28 20 21 50 54 52 4d 41 50 5f 49 53    if( !PTRMAP_IS
1c570 50 41 47 45 28 70 42 74 2c 20 69 4c 61 73 74 50  PAGE(pBt, iLastP
1c580 67 29 20 26 26 20 69 4c 61 73 74 50 67 21 3d 50  g) && iLastPg!=P
1c590 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
1c5a0 28 70 42 74 29 20 29 7b 0a 20 20 20 20 75 38 20  (pBt) ){.    u8 
1c5b0 65 54 79 70 65 3b 0a 20 20 20 20 50 67 6e 6f 20  eType;.    Pgno 
1c5c0 69 50 74 72 50 61 67 65 3b 0a 0a 20 20 20 20 6e  iPtrPage;..    n
1c5d0 46 72 65 65 4c 69 73 74 20 3d 20 67 65 74 34 62  FreeList = get4b
1c5e0 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31  yte(&pBt->pPage1
1c5f0 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20  ->aData[36]);.  
1c600 20 20 69 66 28 20 6e 46 72 65 65 4c 69 73 74 3d    if( nFreeList=
1c610 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  =0 ){.      retu
1c620 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a  rn SQLITE_DONE;.
1c630 20 20 20 20 7d 0a 0a 20 20 20 20 72 63 20 3d 20      }..    rc = 
1c640 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20 69  ptrmapGet(pBt, i
1c650 4c 61 73 74 50 67 2c 20 26 65 54 79 70 65 2c 20  LastPg, &eType, 
1c660 26 69 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20  &iPtrPage);.    
1c670 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1c680 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  K ){.      retur
1c690 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
1c6a0 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41  if( eType==PTRMA
1c6b0 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20  P_ROOTPAGE ){.  
1c6c0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1c6d0 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
1c6e0 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 65      }..    if( e
1c6f0 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45  Type==PTRMAP_FRE
1c700 45 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20 69  EPAGE ){.      i
1c710 66 28 20 62 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b  f( bCommit==0 ){
1c720 0a 20 20 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f  .        /* Remo
1c730 76 65 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d  ve the page from
1c740 20 74 68 65 20 66 69 6c 65 73 20 66 72 65 65 2d   the files free-
1c750 6c 69 73 74 2e 20 54 68 69 73 20 69 73 20 6e 6f  list. This is no
1c760 74 20 72 65 71 75 69 72 65 64 0a 20 20 20 20 20  t required.     
1c770 20 20 20 2a 2a 20 69 66 20 62 43 6f 6d 6d 69 74     ** if bCommit
1c780 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2e 20 49 6e   is non-zero. In
1c790 20 74 68 61 74 20 63 61 73 65 2c 20 74 68 65 20   that case, the 
1c7a0 66 72 65 65 2d 6c 69 73 74 20 77 69 6c 6c 20 62  free-list will b
1c7b0 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 72 75  e.        ** tru
1c7c0 6e 63 61 74 65 64 20 74 6f 20 7a 65 72 6f 20 61  ncated to zero a
1c7d0 66 74 65 72 20 74 68 69 73 20 66 75 6e 63 74 69  fter this functi
1c7e0 6f 6e 20 72 65 74 75 72 6e 73 2c 20 73 6f 20 69  on returns, so i
1c7f0 74 20 64 6f 65 73 6e 27 74 20 0a 20 20 20 20 20  t doesn't .     
1c800 20 20 20 2a 2a 20 6d 61 74 74 65 72 20 69 66 20     ** matter if 
1c810 69 74 20 73 74 69 6c 6c 20 63 6f 6e 74 61 69 6e  it still contain
1c820 73 20 73 6f 6d 65 20 67 61 72 62 61 67 65 20 65  s some garbage e
1c830 6e 74 72 69 65 73 2e 0a 20 20 20 20 20 20 20 20  ntries..        
1c840 2a 2f 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20  */.        Pgno 
1c850 69 46 72 65 65 50 67 3b 0a 20 20 20 20 20 20 20  iFreePg;.       
1c860 20 4d 65 6d 50 61 67 65 20 2a 70 46 72 65 65 50   MemPage *pFreeP
1c870 67 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  g;.        rc = 
1c880 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67  allocateBtreePag
1c890 65 28 70 42 74 2c 20 26 70 46 72 65 65 50 67 2c  e(pBt, &pFreePg,
1c8a0 20 26 69 46 72 65 65 50 67 2c 20 69 4c 61 73 74   &iFreePg, iLast
1c8b0 50 67 2c 20 42 54 41 4c 4c 4f 43 5f 45 58 41 43  Pg, BTALLOC_EXAC
1c8c0 54 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  T);.        if( 
1c8d0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1c8e0 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
1c8f0 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a  n rc;.        }.
1c900 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
1c910 69 46 72 65 65 50 67 3d 3d 69 4c 61 73 74 50 67  iFreePg==iLastPg
1c920 20 29 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65   );.        rele
1c930 61 73 65 50 61 67 65 28 70 46 72 65 65 50 67 29  asePage(pFreePg)
1c940 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20  ;.      }.    } 
1c950 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 50 67 6e  else {.      Pgn
1c960 6f 20 69 46 72 65 65 50 67 3b 20 20 20 20 20 20  o iFreePg;      
1c970 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
1c980 6f 66 20 66 72 65 65 20 70 61 67 65 20 74 6f 20  of free page to 
1c990 6d 6f 76 65 20 70 4c 61 73 74 50 67 20 74 6f 20  move pLastPg to 
1c9a0 2a 2f 0a 20 20 20 20 20 20 4d 65 6d 50 61 67 65  */.      MemPage
1c9b0 20 2a 70 4c 61 73 74 50 67 3b 0a 20 20 20 20 20   *pLastPg;.     
1c9c0 20 75 38 20 65 4d 6f 64 65 20 3d 20 42 54 41 4c   u8 eMode = BTAL
1c9d0 4c 4f 43 5f 41 4e 59 3b 20 20 20 2f 2a 20 4d 6f  LOC_ANY;   /* Mo
1c9e0 64 65 20 70 61 72 61 6d 65 74 65 72 20 66 6f 72  de parameter for
1c9f0 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61   allocateBtreePa
1ca00 67 65 28 29 20 2a 2f 0a 20 20 20 20 20 20 50 67  ge() */.      Pg
1ca10 6e 6f 20 69 4e 65 61 72 20 3d 20 30 3b 20 20 20  no iNear = 0;   
1ca20 20 20 20 20 20 20 20 20 2f 2a 20 6e 65 61 72 62          /* nearb
1ca30 79 20 70 61 72 61 6d 65 74 65 72 20 66 6f 72 20  y parameter for 
1ca40 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67  allocateBtreePag
1ca50 65 28 29 20 2a 2f 0a 0a 20 20 20 20 20 20 72 63  e() */..      rc
1ca60 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28   = btreeGetPage(
1ca70 70 42 74 2c 20 69 4c 61 73 74 50 67 2c 20 26 70  pBt, iLastPg, &p
1ca80 4c 61 73 74 50 67 2c 20 30 29 3b 0a 20 20 20 20  LastPg, 0);.    
1ca90 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1caa0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
1cab0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
1cac0 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 62  }..      /* If b
1cad0 43 6f 6d 6d 69 74 20 69 73 20 7a 65 72 6f 2c 20  Commit is zero, 
1cae0 74 68 69 73 20 6c 6f 6f 70 20 72 75 6e 73 20 65  this loop runs e
1caf0 78 61 63 74 6c 79 20 6f 6e 63 65 20 61 6e 64 20  xactly once and 
1cb00 70 61 67 65 20 70 4c 61 73 74 50 67 0a 20 20 20  page pLastPg.   
1cb10 20 20 20 2a 2a 20 69 73 20 73 77 61 70 70 65 64     ** is swapped
1cb20 20 77 69 74 68 20 74 68 65 20 66 69 72 73 74 20   with the first 
1cb30 66 72 65 65 20 70 61 67 65 20 70 75 6c 6c 65 64  free page pulled
1cb40 20 6f 66 66 20 74 68 65 20 66 72 65 65 20 6c 69   off the free li
1cb50 73 74 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  st..      **.   
1cb60 20 20 20 2a 2a 20 4f 6e 20 74 68 65 20 6f 74 68     ** On the oth
1cb70 65 72 20 68 61 6e 64 2c 20 69 66 20 62 43 6f 6d  er hand, if bCom
1cb80 6d 69 74 20 69 73 20 67 72 65 61 74 65 72 20 74  mit is greater t
1cb90 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 6b  han zero, then k
1cba0 65 65 70 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 6f  eep.      ** loo
1cbb0 70 69 6e 67 20 75 6e 74 69 6c 20 61 20 66 72 65  ping until a fre
1cbc0 65 2d 70 61 67 65 20 6c 6f 63 61 74 65 64 20 77  e-page located w
1cbd0 69 74 68 69 6e 20 74 68 65 20 66 69 72 73 74 20  ithin the first 
1cbe0 6e 46 69 6e 20 70 61 67 65 73 0a 20 20 20 20 20  nFin pages.     
1cbf0 20 2a 2a 20 6f 66 20 74 68 65 20 66 69 6c 65 20   ** of the file 
1cc00 69 73 20 66 6f 75 6e 64 2e 0a 20 20 20 20 20 20  is found..      
1cc10 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 62 43 6f  */.      if( bCo
1cc20 6d 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  mmit==0 ){.     
1cc30 20 20 20 65 4d 6f 64 65 20 3d 20 42 54 41 4c 4c     eMode = BTALL
1cc40 4f 43 5f 4c 45 3b 0a 20 20 20 20 20 20 20 20 69  OC_LE;.        i
1cc50 4e 65 61 72 20 3d 20 6e 46 69 6e 3b 0a 20 20 20  Near = nFin;.   
1cc60 20 20 20 7d 0a 20 20 20 20 20 20 64 6f 20 7b 0a     }.      do {.
1cc70 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20          MemPage 
1cc80 2a 70 46 72 65 65 50 67 3b 0a 20 20 20 20 20 20  *pFreePg;.      
1cc90 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42    rc = allocateB
1cca0 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70  treePage(pBt, &p
1ccb0 46 72 65 65 50 67 2c 20 26 69 46 72 65 65 50 67  FreePg, &iFreePg
1ccc0 2c 20 69 4e 65 61 72 2c 20 65 4d 6f 64 65 29 3b  , iNear, eMode);
1ccd0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
1cce0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1ccf0 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
1cd00 61 67 65 28 70 4c 61 73 74 50 67 29 3b 0a 20 20  age(pLastPg);.  
1cd10 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
1cd20 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  c;.        }.   
1cd30 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
1cd40 28 70 46 72 65 65 50 67 29 3b 0a 20 20 20 20 20  (pFreePg);.     
1cd50 20 7d 77 68 69 6c 65 28 20 62 43 6f 6d 6d 69 74   }while( bCommit
1cd60 20 26 26 20 69 46 72 65 65 50 67 3e 6e 46 69 6e   && iFreePg>nFin
1cd70 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
1cd80 28 20 69 46 72 65 65 50 67 3c 69 4c 61 73 74 50  ( iFreePg<iLastP
1cd90 67 20 29 3b 0a 20 20 20 20 20 20 0a 20 20 20 20  g );.      .    
1cda0 20 20 72 63 20 3d 20 72 65 6c 6f 63 61 74 65 50    rc = relocateP
1cdb0 61 67 65 28 70 42 74 2c 20 70 4c 61 73 74 50 67  age(pBt, pLastPg
1cdc0 2c 20 65 54 79 70 65 2c 20 69 50 74 72 50 61 67  , eType, iPtrPag
1cdd0 65 2c 20 69 46 72 65 65 50 67 2c 20 62 43 6f 6d  e, iFreePg, bCom
1cde0 6d 69 74 29 3b 0a 20 20 20 20 20 20 72 65 6c 65  mit);.      rele
1cdf0 61 73 65 50 61 67 65 28 70 4c 61 73 74 50 67 29  asePage(pLastPg)
1ce00 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
1ce10 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1ce20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
1ce30 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1ce40 7d 0a 0a 20 20 69 66 28 20 62 43 6f 6d 6d 69 74  }..  if( bCommit
1ce50 3d 3d 30 20 29 7b 0a 20 20 20 20 64 6f 20 7b 0a  ==0 ){.    do {.
1ce60 20 20 20 20 20 20 69 4c 61 73 74 50 67 2d 2d 3b        iLastPg--;
1ce70 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 69 4c 61  .    }while( iLa
1ce80 73 74 50 67 3d 3d 50 45 4e 44 49 4e 47 5f 42 59  stPg==PENDING_BY
1ce90 54 45 5f 50 41 47 45 28 70 42 74 29 20 7c 7c 20  TE_PAGE(pBt) || 
1cea0 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42  PTRMAP_ISPAGE(pB
1ceb0 74 2c 20 69 4c 61 73 74 50 67 29 20 29 3b 0a 20  t, iLastPg) );. 
1cec0 20 20 20 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63     pBt->bDoTrunc
1ced0 61 74 65 20 3d 20 31 3b 0a 20 20 20 20 70 42 74  ate = 1;.    pBt
1cee0 2d 3e 6e 50 61 67 65 20 3d 20 69 4c 61 73 74 50  ->nPage = iLastP
1cef0 67 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  g;.  }.  return 
1cf00 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
1cf10 0a 2a 2a 20 54 68 65 20 64 61 74 61 62 61 73 65  .** The database
1cf20 20 6f 70 65 6e 65 64 20 62 79 20 74 68 65 20 66   opened by the f
1cf30 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73  irst argument is
1cf40 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   an auto-vacuum 
1cf50 64 61 74 61 62 61 73 65 0a 2a 2a 20 6e 4f 72 69  database.** nOri
1cf60 67 20 70 61 67 65 73 20 69 6e 20 73 69 7a 65 20  g pages in size 
1cf70 63 6f 6e 74 61 69 6e 69 6e 67 20 6e 46 72 65 65  containing nFree
1cf80 20 66 72 65 65 20 70 61 67 65 73 2e 20 52 65 74   free pages. Ret
1cf90 75 72 6e 20 74 68 65 20 65 78 70 65 63 74 65 64  urn the expected
1cfa0 20 0a 2a 2a 20 73 69 7a 65 20 6f 66 20 74 68 65   .** size of the
1cfb0 20 64 61 74 61 62 61 73 65 20 69 6e 20 70 61 67   database in pag
1cfc0 65 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 6e 20  es following an 
1cfd0 61 75 74 6f 2d 76 61 63 75 75 6d 20 6f 70 65 72  auto-vacuum oper
1cfe0 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ation..*/.static
1cff0 20 50 67 6e 6f 20 66 69 6e 61 6c 44 62 53 69 7a   Pgno finalDbSiz
1d000 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c  e(BtShared *pBt,
1d010 20 50 67 6e 6f 20 6e 4f 72 69 67 2c 20 50 67 6e   Pgno nOrig, Pgn
1d020 6f 20 6e 46 72 65 65 29 7b 0a 20 20 69 6e 74 20  o nFree){.  int 
1d030 6e 45 6e 74 72 79 3b 20 20 20 20 20 20 20 20 20  nEntry;         
1d040 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1d050 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73  umber of entries
1d060 20 6f 6e 20 6f 6e 65 20 70 74 72 6d 61 70 20 70   on one ptrmap p
1d070 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 50  age */.  Pgno nP
1d080 74 72 6d 61 70 3b 20 20 20 20 20 20 20 20 20 20  trmap;          
1d090 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1d0a0 65 72 20 6f 66 20 50 74 72 4d 61 70 20 70 61 67  er of PtrMap pag
1d0b0 65 73 20 74 6f 20 62 65 20 66 72 65 65 64 20 2a  es to be freed *
1d0c0 2f 0a 20 20 50 67 6e 6f 20 6e 46 69 6e 3b 20 20  /.  Pgno nFin;  
1d0d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d0e0 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 76 61      /* Return va
1d0f0 6c 75 65 20 2a 2f 0a 0a 20 20 6e 45 6e 74 72 79  lue */..  nEntry
1d100 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69   = pBt->usableSi
1d110 7a 65 2f 35 3b 0a 20 20 6e 50 74 72 6d 61 70 20  ze/5;.  nPtrmap 
1d120 3d 20 28 6e 46 72 65 65 2d 6e 4f 72 69 67 2b 50  = (nFree-nOrig+P
1d130 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74  TRMAP_PAGENO(pBt
1d140 2c 20 6e 4f 72 69 67 29 2b 6e 45 6e 74 72 79 29  , nOrig)+nEntry)
1d150 2f 6e 45 6e 74 72 79 3b 0a 20 20 6e 46 69 6e 20  /nEntry;.  nFin 
1d160 3d 20 6e 4f 72 69 67 20 2d 20 6e 46 72 65 65 20  = nOrig - nFree 
1d170 2d 20 6e 50 74 72 6d 61 70 3b 0a 20 20 69 66 28  - nPtrmap;.  if(
1d180 20 6e 4f 72 69 67 3e 50 45 4e 44 49 4e 47 5f 42   nOrig>PENDING_B
1d190 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 26 26  YTE_PAGE(pBt) &&
1d1a0 20 6e 46 69 6e 3c 50 45 4e 44 49 4e 47 5f 42 59   nFin<PENDING_BY
1d1b0 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a  TE_PAGE(pBt) ){.
1d1c0 20 20 20 20 6e 46 69 6e 2d 2d 3b 0a 20 20 7d 0a      nFin--;.  }.
1d1d0 20 20 77 68 69 6c 65 28 20 50 54 52 4d 41 50 5f    while( PTRMAP_
1d1e0 49 53 50 41 47 45 28 70 42 74 2c 20 6e 46 69 6e  ISPAGE(pBt, nFin
1d1f0 29 20 7c 7c 20 6e 46 69 6e 3d 3d 50 45 4e 44 49  ) || nFin==PENDI
1d200 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
1d210 29 20 29 7b 0a 20 20 20 20 6e 46 69 6e 2d 2d 3b  ) ){.    nFin--;
1d220 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 6e  .  }..  return n
1d230 46 69 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20  Fin;.}../*.** A 
1d240 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
1d250 6e 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 65 64  n must be opened
1d260 20 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20   before calling 
1d270 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  this function..*
1d280 2a 20 49 74 20 70 65 72 66 6f 72 6d 73 20 61 20  * It performs a 
1d290 73 69 6e 67 6c 65 20 75 6e 69 74 20 6f 66 20 77  single unit of w
1d2a0 6f 72 6b 20 74 6f 77 61 72 64 73 20 61 6e 20 69  ork towards an i
1d2b0 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75  ncremental vacuu
1d2c0 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  m..**.** If the 
1d2d0 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75  incremental vacu
1d2e0 75 6d 20 69 73 20 66 69 6e 69 73 68 65 64 20 61  um is finished a
1d2f0 66 74 65 72 20 74 68 69 73 20 66 75 6e 63 74 69  fter this functi
1d300 6f 6e 20 68 61 73 20 72 75 6e 2c 0a 2a 2a 20 53  on has run,.** S
1d310 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73 20 72 65  QLITE_DONE is re
1d320 74 75 72 6e 65 64 2e 20 49 66 20 69 74 20 69 73  turned. If it is
1d330 20 6e 6f 74 20 66 69 6e 69 73 68 65 64 2c 20 62   not finished, b
1d340 75 74 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75  ut no error occu
1d350 72 72 65 64 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f  rred,.** SQLITE_
1d360 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  OK is returned. 
1d370 4f 74 68 65 72 77 69 73 65 20 61 6e 20 53 51 4c  Otherwise an SQL
1d380 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20  ite error code. 
1d390 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
1d3a0 74 72 65 65 49 6e 63 72 56 61 63 75 75 6d 28 42  treeIncrVacuum(B
1d3b0 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  tree *p){.  int 
1d3c0 72 63 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  rc;.  BtShared *
1d3d0 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20  pBt = p->pBt;.. 
1d3e0 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
1d3f0 65 72 28 70 29 3b 0a 20 20 61 73 73 65 72 74 28  er(p);.  assert(
1d400 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
1d410 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ion==TRANS_WRITE
1d420 20 26 26 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d   && p->inTrans==
1d430 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20  TRANS_WRITE );. 
1d440 20 69 66 28 20 21 70 42 74 2d 3e 61 75 74 6f 56   if( !pBt->autoV
1d450 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 72 63 20  acuum ){.    rc 
1d460 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  = SQLITE_DONE;. 
1d470 20 7d 65 6c 73 65 7b 0a 20 20 20 20 50 67 6e 6f   }else{.    Pgno
1d480 20 6e 4f 72 69 67 20 3d 20 62 74 72 65 65 50 61   nOrig = btreePa
1d490 67 65 63 6f 75 6e 74 28 70 42 74 29 3b 0a 20 20  gecount(pBt);.  
1d4a0 20 20 50 67 6e 6f 20 6e 46 72 65 65 20 3d 20 67    Pgno nFree = g
1d4b0 65 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50  et4byte(&pBt->pP
1d4c0 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29  age1->aData[36])
1d4d0 3b 0a 20 20 20 20 50 67 6e 6f 20 6e 46 69 6e 20  ;.    Pgno nFin 
1d4e0 3d 20 66 69 6e 61 6c 44 62 53 69 7a 65 28 70 42  = finalDbSize(pB
1d4f0 74 2c 20 6e 4f 72 69 67 2c 20 6e 46 72 65 65 29  t, nOrig, nFree)
1d500 3b 0a 0a 20 20 20 20 69 66 28 20 6e 4f 72 69 67  ;..    if( nOrig
1d510 3c 6e 46 69 6e 20 29 7b 0a 20 20 20 20 20 20 72  <nFin ){.      r
1d520 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
1d530 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 65 6c  PT_BKPT;.    }el
1d540 73 65 20 69 66 28 20 6e 46 72 65 65 3e 30 20 29  se if( nFree>0 )
1d550 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 61 76  {.      rc = sav
1d560 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 2c  eAllCursors(pBt,
1d570 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66   0, 0);.      if
1d580 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1d590 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 76 61 6c  ){.        inval
1d5a0 69 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77  idateAllOverflow
1d5b0 43 61 63 68 65 28 70 42 74 29 3b 0a 20 20 20 20  Cache(pBt);.    
1d5c0 20 20 20 20 72 63 20 3d 20 69 6e 63 72 56 61 63      rc = incrVac
1d5d0 75 75 6d 53 74 65 70 28 70 42 74 2c 20 6e 46 69  uumStep(pBt, nFi
1d5e0 6e 2c 20 6e 4f 72 69 67 2c 20 30 29 3b 0a 20 20  n, nOrig, 0);.  
1d5f0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
1d600 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1d610 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
1d620 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
1d630 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62  pBt->pPage1->pDb
1d640 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 70  Page);.        p
1d650 75 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50  ut4byte(&pBt->pP
1d660 61 67 65 31 2d 3e 61 44 61 74 61 5b 32 38 5d 2c  age1->aData[28],
1d670 20 70 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20   pBt->nPage);.  
1d680 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
1d690 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
1d6a0 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20  TE_DONE;.    }. 
1d6b0 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65   }.  sqlite3Btre
1d6c0 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
1d6d0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1d6e0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
1d6f0 20 63 61 6c 6c 65 64 20 70 72 69 6f 72 20 74 6f   called prior to
1d700 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d   sqlite3PagerCom
1d710 6d 69 74 20 77 68 65 6e 20 61 20 74 72 61 6e 73  mit when a trans
1d720 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 63 6f 6d  action.** is com
1d730 6d 69 74 74 65 64 20 66 6f 72 20 61 6e 20 61 75  mitted for an au
1d740 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61  to-vacuum databa
1d750 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c  se..**.** If SQL
1d760 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
1d770 65 64 2c 20 74 68 65 6e 20 2a 70 6e 54 72 75 6e  ed, then *pnTrun
1d780 63 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  c is set to the 
1d790 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 0a  number of pages.
1d7a0 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
1d7b0 66 69 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 74  file should be t
1d7c0 72 75 6e 63 61 74 65 64 20 74 6f 20 64 75 72 69  runcated to duri
1d7d0 6e 67 20 74 68 65 20 63 6f 6d 6d 69 74 20 70 72  ng the commit pr
1d7e0 6f 63 65 73 73 2e 20 0a 2a 2a 20 69 2e 65 2e 20  ocess. .** i.e. 
1d7f0 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61 73  the database has
1d800 20 62 65 65 6e 20 72 65 6f 72 67 61 6e 69 7a 65   been reorganize
1d810 64 20 73 6f 20 74 68 61 74 20 6f 6e 6c 79 20 74  d so that only t
1d820 68 65 20 66 69 72 73 74 20 2a 70 6e 54 72 75 6e  he first *pnTrun
1d830 63 0a 2a 2a 20 70 61 67 65 73 20 61 72 65 20 69  c.** pages are i
1d840 6e 20 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  n use..*/.static
1d850 20 69 6e 74 20 61 75 74 6f 56 61 63 75 75 6d 43   int autoVacuumC
1d860 6f 6d 6d 69 74 28 42 74 53 68 61 72 65 64 20 2a  ommit(BtShared *
1d870 70 42 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  pBt){.  int rc =
1d880 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 61   SQLITE_OK;.  Pa
1d890 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 42  ger *pPager = pB
1d8a0 74 2d 3e 70 50 61 67 65 72 3b 0a 20 20 56 56 41  t->pPager;.  VVA
1d8b0 5f 4f 4e 4c 59 28 20 69 6e 74 20 6e 52 65 66 20  _ONLY( int nRef 
1d8c0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65  = sqlite3PagerRe
1d8d0 66 63 6f 75 6e 74 28 70 50 61 67 65 72 29 20 29  fcount(pPager) )
1d8e0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
1d8f0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
1d900 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
1d910 20 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76   invalidateAllOv
1d920 65 72 66 6c 6f 77 43 61 63 68 65 28 70 42 74 29  erflowCache(pBt)
1d930 3b 0a 20 20 61 73 73 65 72 74 28 70 42 74 2d 3e  ;.  assert(pBt->
1d940 61 75 74 6f 56 61 63 75 75 6d 29 3b 0a 20 20 69  autoVacuum);.  i
1d950 66 28 20 21 70 42 74 2d 3e 69 6e 63 72 56 61 63  f( !pBt->incrVac
1d960 75 75 6d 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20  uum ){.    Pgno 
1d970 6e 46 69 6e 3b 20 20 20 20 20 20 20 20 20 2f 2a  nFin;         /*
1d980 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
1d990 20 69 6e 20 64 61 74 61 62 61 73 65 20 61 66 74   in database aft
1d9a0 65 72 20 61 75 74 6f 76 61 63 75 75 6d 69 6e 67  er autovacuuming
1d9b0 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 46 72   */.    Pgno nFr
1d9c0 65 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  ee;        /* Nu
1d9d0 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 6f 6e  mber of pages on
1d9e0 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 69 6e   the freelist in
1d9f0 69 74 69 61 6c 6c 79 20 2a 2f 0a 20 20 20 20 50  itially */.    P
1da00 67 6e 6f 20 69 46 72 65 65 3b 20 20 20 20 20 20  gno iFree;      
1da10 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 70 61    /* The next pa
1da20 67 65 20 74 6f 20 62 65 20 66 72 65 65 64 20 2a  ge to be freed *
1da30 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 4f 72 69 67  /.    Pgno nOrig
1da40 3b 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61  ;        /* Data
1da50 62 61 73 65 20 73 69 7a 65 20 62 65 66 6f 72 65  base size before
1da60 20 66 72 65 65 69 6e 67 20 2a 2f 0a 0a 20 20 20   freeing */..   
1da70 20 6e 4f 72 69 67 20 3d 20 62 74 72 65 65 50 61   nOrig = btreePa
1da80 67 65 63 6f 75 6e 74 28 70 42 74 29 3b 0a 20 20  gecount(pBt);.  
1da90 20 20 69 66 28 20 50 54 52 4d 41 50 5f 49 53 50    if( PTRMAP_ISP
1daa0 41 47 45 28 70 42 74 2c 20 6e 4f 72 69 67 29 20  AGE(pBt, nOrig) 
1dab0 7c 7c 20 6e 4f 72 69 67 3d 3d 50 45 4e 44 49 4e  || nOrig==PENDIN
1dac0 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
1dad0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 74 20   ){.      /* It 
1dae0 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20  is not possible 
1daf0 74 6f 20 63 72 65 61 74 65 20 61 20 64 61 74 61  to create a data
1db00 62 61 73 65 20 66 6f 72 20 77 68 69 63 68 20 74  base for which t
1db10 68 65 20 66 69 6e 61 6c 20 70 61 67 65 0a 20 20  he final page.  
1db20 20 20 20 20 2a 2a 20 69 73 20 65 69 74 68 65 72      ** is either
1db30 20 61 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70   a pointer-map p
1db40 61 67 65 20 6f 72 20 74 68 65 20 70 65 6e 64 69  age or the pendi
1db50 6e 67 2d 62 79 74 65 20 70 61 67 65 2e 20 49 66  ng-byte page. If
1db60 20 6f 6e 65 0a 20 20 20 20 20 20 2a 2a 20 69 73   one.      ** is
1db70 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 74 68   encountered, th
1db80 69 73 20 69 6e 64 69 63 61 74 65 73 20 63 6f 72  is indicates cor
1db90 72 75 70 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a  ruption..      *
1dba0 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  /.      return S
1dbb0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
1dbc0 50 54 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6e  PT;.    }..    n
1dbd0 46 72 65 65 20 3d 20 67 65 74 34 62 79 74 65 28  Free = get4byte(
1dbe0 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44  &pBt->pPage1->aD
1dbf0 61 74 61 5b 33 36 5d 29 3b 0a 20 20 20 20 6e 46  ata[36]);.    nF
1dc00 69 6e 20 3d 20 66 69 6e 61 6c 44 62 53 69 7a 65  in = finalDbSize
1dc10 28 70 42 74 2c 20 6e 4f 72 69 67 2c 20 6e 46 72  (pBt, nOrig, nFr
1dc20 65 65 29 3b 0a 20 20 20 20 69 66 28 20 6e 46 69  ee);.    if( nFi
1dc30 6e 3e 6e 4f 72 69 67 20 29 20 72 65 74 75 72 6e  n>nOrig ) return
1dc40 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
1dc50 42 4b 50 54 3b 0a 20 20 20 20 69 66 28 20 6e 46  BKPT;.    if( nF
1dc60 69 6e 3c 6e 4f 72 69 67 20 29 7b 0a 20 20 20 20  in<nOrig ){.    
1dc70 20 20 72 63 20 3d 20 73 61 76 65 41 6c 6c 43 75    rc = saveAllCu
1dc80 72 73 6f 72 73 28 70 42 74 2c 20 30 2c 20 30 29  rsors(pBt, 0, 0)
1dc90 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
1dca0 69 46 72 65 65 3d 6e 4f 72 69 67 3b 20 69 46 72  iFree=nOrig; iFr
1dcb0 65 65 3e 6e 46 69 6e 20 26 26 20 72 63 3d 3d 53  ee>nFin && rc==S
1dcc0 51 4c 49 54 45 5f 4f 4b 3b 20 69 46 72 65 65 2d  QLITE_OK; iFree-
1dcd0 2d 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 69  -){.      rc = i
1dce0 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28 70 42  ncrVacuumStep(pB
1dcf0 74 2c 20 6e 46 69 6e 2c 20 69 46 72 65 65 2c 20  t, nFin, iFree, 
1dd00 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  1);.    }.    if
1dd10 28 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f  ( (rc==SQLITE_DO
1dd20 4e 45 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45  NE || rc==SQLITE
1dd30 5f 4f 4b 29 20 26 26 20 6e 46 72 65 65 3e 30 20  _OK) && nFree>0 
1dd40 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
1dd50 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
1dd60 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62  pBt->pPage1->pDb
1dd70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 70 75 74  Page);.      put
1dd80 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67  4byte(&pBt->pPag
1dd90 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 30  e1->aData[32], 0
1dda0 29 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74  );.      put4byt
1ddb0 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  e(&pBt->pPage1->
1ddc0 61 44 61 74 61 5b 33 36 5d 2c 20 30 29 3b 0a 20  aData[36], 0);. 
1ddd0 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
1dde0 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74  Bt->pPage1->aDat
1ddf0 61 5b 32 38 5d 2c 20 6e 46 69 6e 29 3b 0a 20 20  a[28], nFin);.  
1de00 20 20 20 20 70 42 74 2d 3e 62 44 6f 54 72 75 6e      pBt->bDoTrun
1de10 63 61 74 65 20 3d 20 31 3b 0a 20 20 20 20 20 20  cate = 1;.      
1de20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 6e 46 69  pBt->nPage = nFi
1de30 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  n;.    }.    if(
1de40 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1de50 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  {.      sqlite3P
1de60 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70 50 61  agerRollback(pPa
1de70 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ger);.    }.  }.
1de80 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65 66 3e  .  assert( nRef>
1de90 3d 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66  =sqlite3PagerRef
1dea0 63 6f 75 6e 74 28 70 50 61 67 65 72 29 20 29 3b  count(pPager) );
1deb0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1dec0 0a 23 65 6c 73 65 20 2f 2a 20 69 66 6e 64 65 66  .#else /* ifndef
1ded0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
1dee0 4f 56 41 43 55 55 4d 20 2a 2f 0a 23 20 64 65 66  OVACUUM */.# def
1def0 69 6e 65 20 73 65 74 43 68 69 6c 64 50 74 72 6d  ine setChildPtrm
1df00 61 70 73 28 78 29 20 53 51 4c 49 54 45 5f 4f 4b  aps(x) SQLITE_OK
1df10 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
1df20 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73  his routine does
1df30 20 74 68 65 20 66 69 72 73 74 20 70 68 61 73 65   the first phase
1df40 20 6f 66 20 61 20 74 77 6f 2d 70 68 61 73 65 20   of a two-phase 
1df50 63 6f 6d 6d 69 74 2e 20 20 54 68 69 73 20 72 6f  commit.  This ro
1df60 75 74 69 6e 65 0a 2a 2a 20 63 61 75 73 65 73 20  utine.** causes 
1df70 61 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  a rollback journ
1df80 61 6c 20 74 6f 20 62 65 20 63 72 65 61 74 65 64  al to be created
1df90 20 28 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74   (if it does not
1dfa0 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 29 0a   already exist).
1dfb0 2a 2a 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 64  ** and populated
1dfc0 20 77 69 74 68 20 65 6e 6f 75 67 68 20 69 6e 66   with enough inf
1dfd0 6f 72 6d 61 74 69 6f 6e 20 73 6f 20 74 68 61 74  ormation so that
1dfe0 20 69 66 20 61 20 70 6f 77 65 72 20 6c 6f 73 73   if a power loss
1dff0 20 6f 63 63 75 72 73 0a 2a 2a 20 74 68 65 20 64   occurs.** the d
1e000 61 74 61 62 61 73 65 20 63 61 6e 20 62 65 20 72  atabase can be r
1e010 65 73 74 6f 72 65 64 20 74 6f 20 69 74 73 20 6f  estored to its o
1e020 72 69 67 69 6e 61 6c 20 73 74 61 74 65 20 62 79  riginal state by
1e030 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 0a 2a 2a   playing back.**
1e040 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 54   the journal.  T
1e050 68 65 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  hen the contents
1e060 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
1e070 61 72 65 20 66 6c 75 73 68 65 64 20 6f 75 74 20  are flushed out 
1e080 74 6f 0a 2a 2a 20 74 68 65 20 64 69 73 6b 2e 20  to.** the disk. 
1e090 20 41 66 74 65 72 20 74 68 65 20 6a 6f 75 72 6e   After the journ
1e0a0 61 6c 20 69 73 20 73 61 66 65 6c 79 20 6f 6e 20  al is safely on 
1e0b0 6f 78 69 64 65 2c 20 74 68 65 20 63 68 61 6e 67  oxide, the chang
1e0c0 65 73 20 74 6f 20 74 68 65 0a 2a 2a 20 64 61 74  es to the.** dat
1e0d0 61 62 61 73 65 20 61 72 65 20 77 72 69 74 74 65  abase are writte
1e0e0 6e 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62  n into the datab
1e0f0 61 73 65 20 66 69 6c 65 20 61 6e 64 20 66 6c 75  ase file and flu
1e100 73 68 65 64 20 74 6f 20 6f 78 69 64 65 2e 0a 2a  shed to oxide..*
1e110 2a 20 41 74 20 74 68 65 20 65 6e 64 20 6f 66 20  * At the end of 
1e120 74 68 69 73 20 63 61 6c 6c 2c 20 74 68 65 20 72  this call, the r
1e130 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20  ollback journal 
1e140 73 74 69 6c 6c 20 65 78 69 73 74 73 20 6f 6e 20  still exists on 
1e150 74 68 65 0a 2a 2a 20 64 69 73 6b 20 61 6e 64 20  the.** disk and 
1e160 77 65 20 61 72 65 20 73 74 69 6c 6c 20 68 6f 6c  we are still hol
1e170 64 69 6e 67 20 61 6c 6c 20 6c 6f 63 6b 73 2c 20  ding all locks, 
1e180 73 6f 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  so the transacti
1e190 6f 6e 20 68 61 73 20 6e 6f 74 0a 2a 2a 20 63 6f  on has not.** co
1e1a0 6d 6d 69 74 74 65 64 2e 20 20 53 65 65 20 73 71  mmitted.  See sq
1e1b0 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
1e1c0 50 68 61 73 65 54 77 6f 28 29 20 66 6f 72 20 74  PhaseTwo() for t
1e1d0 68 65 20 73 65 63 6f 6e 64 20 70 68 61 73 65 20  he second phase 
1e1e0 6f 66 20 74 68 65 0a 2a 2a 20 63 6f 6d 6d 69 74  of the.** commit
1e1f0 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20   process..**.** 
1e200 54 68 69 73 20 63 61 6c 6c 20 69 73 20 61 20 6e  This call is a n
1e210 6f 2d 6f 70 20 69 66 20 6e 6f 20 77 72 69 74 65  o-op if no write
1e220 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20  -transaction is 
1e230 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65  currently active
1e240 20 6f 6e 20 70 42 74 2e 0a 2a 2a 0a 2a 2a 20 4f   on pBt..**.** O
1e250 74 68 65 72 77 69 73 65 2c 20 73 79 6e 63 20 74  therwise, sync t
1e260 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1e270 20 66 6f 72 20 74 68 65 20 62 74 72 65 65 20 70   for the btree p
1e280 42 74 2e 20 7a 4d 61 73 74 65 72 20 70 6f 69 6e  Bt. zMaster poin
1e290 74 73 20 74 6f 0a 2a 2a 20 74 68 65 20 6e 61 6d  ts to.** the nam
1e2a0 65 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f  e of a master jo
1e2b0 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 61 74 20  urnal file that 
1e2c0 73 68 6f 75 6c 64 20 62 65 20 77 72 69 74 74 65  should be writte
1e2d0 6e 20 69 6e 74 6f 20 74 68 65 0a 2a 2a 20 69 6e  n into the.** in
1e2e0 64 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c  dividual journal
1e2f0 20 66 69 6c 65 2c 20 6f 72 20 69 73 20 4e 55 4c   file, or is NUL
1e300 4c 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 6e 6f  L, indicating no
1e310 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
1e320 66 69 6c 65 20 0a 2a 2a 20 28 73 69 6e 67 6c 65  file .** (single
1e330 20 64 61 74 61 62 61 73 65 20 74 72 61 6e 73 61   database transa
1e340 63 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20 57 68  ction)..**.** Wh
1e350 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65  en this is calle
1e360 64 2c 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  d, the master jo
1e370 75 72 6e 61 6c 20 73 68 6f 75 6c 64 20 61 6c 72  urnal should alr
1e380 65 61 64 79 20 68 61 76 65 20 62 65 65 6e 0a 2a  eady have been.*
1e390 2a 20 63 72 65 61 74 65 64 2c 20 70 6f 70 75 6c  * created, popul
1e3a0 61 74 65 64 20 77 69 74 68 20 74 68 69 73 20 6a  ated with this j
1e3b0 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20 61  ournal pointer a
1e3c0 6e 64 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73  nd synced to dis
1e3d0 6b 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 74 68  k..**.** Once th
1e3e0 69 73 20 69 73 20 72 6f 75 74 69 6e 65 20 68 61  is is routine ha
1e3f0 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65 20  s returned, the 
1e400 6f 6e 6c 79 20 74 68 69 6e 67 20 72 65 71 75 69  only thing requi
1e410 72 65 64 20 74 6f 20 63 6f 6d 6d 69 74 0a 2a 2a  red to commit.**
1e420 20 74 68 65 20 77 72 69 74 65 2d 74 72 61 6e 73   the write-trans
1e430 61 63 74 69 6f 6e 20 66 6f 72 20 74 68 69 73 20  action for this 
1e440 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
1e450 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6a   to delete the j
1e460 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 69 6e 74 20 73  ournal..*/.int s
1e470 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
1e480 74 50 68 61 73 65 4f 6e 65 28 42 74 72 65 65 20  tPhaseOne(Btree 
1e490 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  *p, const char *
1e4a0 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20  zMaster){.  int 
1e4b0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1e4c0 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73    if( p->inTrans
1e4d0 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b  ==TRANS_WRITE ){
1e4e0 0a 20 20 20 20 42 74 53 68 61 72 65 64 20 2a 70  .    BtShared *p
1e4f0 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 20  Bt = p->pBt;.   
1e500 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
1e510 65 72 28 70 29 3b 0a 23 69 66 6e 64 65 66 20 53  er(p);.#ifndef S
1e520 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
1e530 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70 42  ACUUM.    if( pB
1e540 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b  t->autoVacuum ){
1e550 0a 20 20 20 20 20 20 72 63 20 3d 20 61 75 74 6f  .      rc = auto
1e560 56 61 63 75 75 6d 43 6f 6d 6d 69 74 28 70 42 74  VacuumCommit(pBt
1e570 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
1e580 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1e590 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
1e5a0 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20  eeLeave(p);.    
1e5b0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1e5c0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
1e5d0 20 69 66 28 20 70 42 74 2d 3e 62 44 6f 54 72 75   if( pBt->bDoTru
1e5e0 6e 63 61 74 65 20 29 7b 0a 20 20 20 20 20 20 73  ncate ){.      s
1e5f0 71 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e 63  qlite3PagerTrunc
1e600 61 74 65 49 6d 61 67 65 28 70 42 74 2d 3e 70 50  ateImage(pBt->pP
1e610 61 67 65 72 2c 20 70 42 74 2d 3e 6e 50 61 67 65  ager, pBt->nPage
1e620 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
1e630 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1e640 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65  PagerCommitPhase
1e650 4f 6e 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  One(pBt->pPager,
1e660 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20 20   zMaster, 0);.  
1e670 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
1e680 61 76 65 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65  ave(p);.  }.  re
1e690 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1e6a0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
1e6b0 69 73 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 62  is called from b
1e6c0 6f 74 68 20 42 74 72 65 65 43 6f 6d 6d 69 74 50  oth BtreeCommitP
1e6d0 68 61 73 65 54 77 6f 28 29 20 61 6e 64 20 42 74  haseTwo() and Bt
1e6e0 72 65 65 52 6f 6c 6c 62 61 63 6b 28 29 0a 2a 2a  reeRollback().**
1e6f0 20 61 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69   at the conclusi
1e700 6f 6e 20 6f 66 20 61 20 74 72 61 6e 73 61 63 74  on of a transact
1e710 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ion..*/.static v
1e720 6f 69 64 20 62 74 72 65 65 45 6e 64 54 72 61 6e  oid btreeEndTran
1e730 73 61 63 74 69 6f 6e 28 42 74 72 65 65 20 2a 70  saction(Btree *p
1e740 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
1e750 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 73  Bt = p->pBt;.  s
1e760 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e  qlite3 *db = p->
1e770 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  db;.  assert( sq
1e780 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d  lite3BtreeHoldsM
1e790 75 74 65 78 28 70 29 20 29 3b 0a 0a 23 69 66 6e  utex(p) );..#ifn
1e7a0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1e7b0 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 70 42 74  AUTOVACUUM.  pBt
1e7c0 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65 20 3d 20  ->bDoTruncate = 
1e7d0 30 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20  0;.#endif.  if( 
1e7e0 70 2d 3e 69 6e 54 72 61 6e 73 3e 54 52 41 4e 53  p->inTrans>TRANS
1e7f0 5f 4e 4f 4e 45 20 26 26 20 64 62 2d 3e 6e 56 64  _NONE && db->nVd
1e800 62 65 52 65 61 64 3e 31 20 29 7b 0a 20 20 20 20  beRead>1 ){.    
1e810 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  /* If there are 
1e820 6f 74 68 65 72 20 61 63 74 69 76 65 20 73 74 61  other active sta
1e830 74 65 6d 65 6e 74 73 20 74 68 61 74 20 62 65 6c  tements that bel
1e840 6f 6e 67 20 74 6f 20 74 68 69 73 20 64 61 74 61  ong to this data
1e850 62 61 73 65 0a 20 20 20 20 2a 2a 20 68 61 6e 64  base.    ** hand
1e860 6c 65 2c 20 64 6f 77 6e 67 72 61 64 65 20 74 6f  le, downgrade to
1e870 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 74 72 61   a read-only tra
1e880 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 6f 74  nsaction. The ot
1e890 68 65 72 20 73 74 61 74 65 6d 65 6e 74 73 0a 20  her statements. 
1e8a0 20 20 20 2a 2a 20 6d 61 79 20 73 74 69 6c 6c 20     ** may still 
1e8b0 62 65 20 72 65 61 64 69 6e 67 20 66 72 6f 6d 20  be reading from 
1e8c0 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 2a  the database.  *
1e8d0 2f 0a 20 20 20 20 64 6f 77 6e 67 72 61 64 65 41  /.    downgradeA
1e8e0 6c 6c 53 68 61 72 65 64 43 61 63 68 65 54 61 62  llSharedCacheTab
1e8f0 6c 65 4c 6f 63 6b 73 28 70 29 3b 0a 20 20 20 20  leLocks(p);.    
1e900 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52 41  p->inTrans = TRA
1e910 4e 53 5f 52 45 41 44 3b 0a 20 20 7d 65 6c 73 65  NS_READ;.  }else
1e920 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  {.    /* If the 
1e930 68 61 6e 64 6c 65 20 68 61 64 20 61 6e 79 20 6b  handle had any k
1e940 69 6e 64 20 6f 66 20 74 72 61 6e 73 61 63 74 69  ind of transacti
1e950 6f 6e 20 6f 70 65 6e 2c 20 64 65 63 72 65 6d 65  on open, decreme
1e960 6e 74 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 74  nt the .    ** t
1e970 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74  ransaction count
1e980 20 6f 66 20 74 68 65 20 73 68 61 72 65 64 20 62   of the shared b
1e990 74 72 65 65 2e 20 49 66 20 74 68 65 20 74 72 61  tree. If the tra
1e9a0 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 20 0a  nsaction count .
1e9b0 20 20 20 20 2a 2a 20 72 65 61 63 68 65 73 20 30      ** reaches 0
1e9c0 2c 20 73 65 74 20 74 68 65 20 73 68 61 72 65 64  , set the shared
1e9d0 20 73 74 61 74 65 20 74 6f 20 54 52 41 4e 53 5f   state to TRANS_
1e9e0 4e 4f 4e 45 2e 20 54 68 65 20 75 6e 6c 6f 63 6b  NONE. The unlock
1e9f0 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 29 0a  BtreeIfUnused().
1ea00 20 20 20 20 2a 2a 20 63 61 6c 6c 20 62 65 6c 6f      ** call belo
1ea10 77 20 77 69 6c 6c 20 75 6e 6c 6f 63 6b 20 74 68  w will unlock th
1ea20 65 20 70 61 67 65 72 2e 20 20 2a 2f 0a 20 20 20  e pager.  */.   
1ea30 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 21   if( p->inTrans!
1ea40 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20  =TRANS_NONE ){. 
1ea50 20 20 20 20 20 63 6c 65 61 72 41 6c 6c 53 68 61       clearAllSha
1ea60 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
1ea70 6b 73 28 70 29 3b 0a 20 20 20 20 20 20 70 42 74  ks(p);.      pBt
1ea80 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2d 2d  ->nTransaction--
1ea90 3b 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 70  ;.      if( 0==p
1eaa0 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e  Bt->nTransaction
1eab0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42 74 2d   ){.        pBt-
1eac0 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d  >inTransaction =
1ead0 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20   TRANS_NONE;.   
1eae0 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
1eaf0 2f 2a 20 53 65 74 20 74 68 65 20 63 75 72 72 65  /* Set the curre
1eb00 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73  nt transaction s
1eb10 74 61 74 65 20 74 6f 20 54 52 41 4e 53 5f 4e 4f  tate to TRANS_NO
1eb20 4e 45 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74 68  NE and unlock th
1eb30 65 20 0a 20 20 20 20 2a 2a 20 70 61 67 65 72 20  e .    ** pager 
1eb40 69 66 20 74 68 69 73 20 63 61 6c 6c 20 63 6c 6f  if this call clo
1eb50 73 65 64 20 74 68 65 20 6f 6e 6c 79 20 72 65 61  sed the only rea
1eb60 64 20 6f 72 20 77 72 69 74 65 20 74 72 61 6e 73  d or write trans
1eb70 61 63 74 69 6f 6e 2e 20 20 2a 2f 0a 20 20 20 20  action.  */.    
1eb80 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52 41  p->inTrans = TRA
1eb90 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20 75 6e 6c  NS_NONE;.    unl
1eba0 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64  ockBtreeIfUnused
1ebb0 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 20 20 62 74  (pBt);.  }..  bt
1ebc0 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b  reeIntegrity(p);
1ebd0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74  .}../*.** Commit
1ebe0 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
1ebf0 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 70 72   currently in pr
1ec00 6f 67 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  ogress..**.** Th
1ec10 69 73 20 72 6f 75 74 69 6e 65 20 69 6d 70 6c 65  is routine imple
1ec20 6d 65 6e 74 73 20 74 68 65 20 73 65 63 6f 6e 64  ments the second
1ec30 20 70 68 61 73 65 20 6f 66 20 61 20 32 2d 70 68   phase of a 2-ph
1ec40 61 73 65 20 63 6f 6d 6d 69 74 2e 20 20 54 68 65  ase commit.  The
1ec50 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65  .** sqlite3Btree
1ec60 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29  CommitPhaseOne()
1ec70 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 74 68   routine does th
1ec80 65 20 66 69 72 73 74 20 70 68 61 73 65 20 61 6e  e first phase an
1ec90 64 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 69  d should.** be i
1eca0 6e 76 6f 6b 65 64 20 70 72 69 6f 72 20 74 6f 20  nvoked prior to 
1ecb0 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75  calling this rou
1ecc0 74 69 6e 65 2e 20 20 54 68 65 20 73 71 6c 69 74  tine.  The sqlit
1ecd0 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
1ece0 73 65 4f 6e 65 28 29 0a 2a 2a 20 72 6f 75 74 69  seOne().** routi
1ecf0 6e 65 20 64 69 64 20 61 6c 6c 20 74 68 65 20 77  ne did all the w
1ed00 6f 72 6b 20 6f 66 20 77 72 69 74 69 6e 67 20 69  ork of writing i
1ed10 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 75 74 20 74  nformation out t
1ed20 6f 20 64 69 73 6b 20 61 6e 64 20 66 6c 75 73 68  o disk and flush
1ed30 69 6e 67 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65  ing the.** conte
1ed40 6e 74 73 20 73 6f 20 74 68 61 74 20 74 68 65 79  nts so that they
1ed50 20 61 72 65 20 77 72 69 74 74 65 6e 20 6f 6e 74   are written ont
1ed60 6f 20 74 68 65 20 64 69 73 6b 20 70 6c 61 74 74  o the disk platt
1ed70 65 72 2e 20 20 41 6c 6c 20 74 68 69 73 0a 2a 2a  er.  All this.**
1ed80 20 72 6f 75 74 69 6e 65 20 68 61 73 20 74 6f 20   routine has to 
1ed90 64 6f 20 69 73 20 64 65 6c 65 74 65 20 6f 72 20  do is delete or 
1eda0 74 72 75 6e 63 61 74 65 20 6f 72 20 7a 65 72 6f  truncate or zero
1edb0 20 74 68 65 20 68 65 61 64 65 72 20 69 6e 20 74   the header in t
1edc0 68 65 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61  he.** the rollba
1edd0 63 6b 20 6a 6f 75 72 6e 61 6c 20 28 77 68 69 63  ck journal (whic
1ede0 68 20 63 61 75 73 65 73 20 74 68 65 20 74 72 61  h causes the tra
1edf0 6e 73 61 63 74 69 6f 6e 20 74 6f 20 63 6f 6d 6d  nsaction to comm
1ee00 69 74 29 20 61 6e 64 0a 2a 2a 20 64 72 6f 70 20  it) and.** drop 
1ee10 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72  locks..**.** Nor
1ee20 6d 61 6c 6c 79 2c 20 69 66 20 61 6e 20 65 72 72  mally, if an err
1ee30 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
1ee40 74 68 65 20 70 61 67 65 72 20 6c 61 79 65 72 20  the pager layer 
1ee50 69 73 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f  is attempting to
1ee60 20 0a 2a 2a 20 66 69 6e 61 6c 69 7a 65 20 74 68   .** finalize th
1ee70 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 6a 6f 75  e underlying jou
1ee80 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 69 73 20  rnal file, this 
1ee90 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
1eea0 20 61 6e 20 65 72 72 6f 72 20 61 6e 64 0a 2a 2a   an error and.**
1eeb0 20 74 68 65 20 75 70 70 65 72 20 6c 61 79 65 72   the upper layer
1eec0 20 77 69 6c 6c 20 61 74 74 65 6d 70 74 20 61 20   will attempt a 
1eed0 72 6f 6c 6c 62 61 63 6b 2e 20 48 6f 77 65 76 65  rollback. Howeve
1eee0 72 2c 20 69 66 20 74 68 65 20 73 65 63 6f 6e 64  r, if the second
1eef0 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 69 73 20   argument.** is 
1ef00 6e 6f 6e 2d 7a 65 72 6f 20 74 68 65 6e 20 74 68  non-zero then th
1ef10 69 73 20 62 2d 74 72 65 65 20 74 72 61 6e 73 61  is b-tree transa
1ef20 63 74 69 6f 6e 20 69 73 20 70 61 72 74 20 6f 66  ction is part of
1ef30 20 61 20 6d 75 6c 74 69 2d 66 69 6c 65 20 0a 2a   a multi-file .*
1ef40 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49  * transaction. I
1ef50 6e 20 74 68 69 73 20 63 61 73 65 2c 20 74 68 65  n this case, the
1ef60 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73   transaction has
1ef70 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63 6f   already been co
1ef80 6d 6d 69 74 74 65 64 20 0a 2a 2a 20 28 62 79 20  mmitted .** (by 
1ef90 64 65 6c 65 74 69 6e 67 20 61 20 6d 61 73 74 65  deleting a maste
1efa0 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20  r journal file) 
1efb0 61 6e 64 20 74 68 65 20 63 61 6c 6c 65 72 20 77  and the caller w
1efc0 69 6c 6c 20 69 67 6e 6f 72 65 20 74 68 69 73 20  ill ignore this 
1efd0 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 73 20 72 65  .** functions re
1efe0 74 75 72 6e 20 63 6f 64 65 2e 20 53 6f 2c 20 65  turn code. So, e
1eff0 76 65 6e 20 69 66 20 61 6e 20 65 72 72 6f 72 20  ven if an error 
1f000 6f 63 63 75 72 73 20 69 6e 20 74 68 65 20 70 61  occurs in the pa
1f010 67 65 72 20 6c 61 79 65 72 2c 0a 2a 2a 20 72 65  ger layer,.** re
1f020 73 65 74 20 74 68 65 20 62 2d 74 72 65 65 20 6f  set the b-tree o
1f030 62 6a 65 63 74 73 20 69 6e 74 65 72 6e 61 6c 20  bjects internal 
1f040 73 74 61 74 65 20 74 6f 20 69 6e 64 69 63 61 74  state to indicat
1f050 65 20 74 68 61 74 20 74 68 65 20 77 72 69 74 65  e that the write
1f060 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  .** transaction 
1f070 68 61 73 20 62 65 65 6e 20 63 6c 6f 73 65 64 2e  has been closed.
1f080 20 54 68 69 73 20 69 73 20 71 75 69 74 65 20 73   This is quite s
1f090 61 66 65 2c 20 61 73 20 74 68 65 20 70 61 67 65  afe, as the page
1f0a0 72 20 77 69 6c 6c 20 68 61 76 65 0a 2a 2a 20 74  r will have.** t
1f0b0 72 61 6e 73 69 74 69 6f 6e 65 64 20 74 6f 20 74  ransitioned to t
1f0c0 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 2e 0a  he error state..
1f0d0 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20  **.** This will 
1f0e0 72 65 6c 65 61 73 65 20 74 68 65 20 77 72 69 74  release the writ
1f0f0 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  e lock on the da
1f100 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66  tabase file.  If
1f110 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f   there.** are no
1f120 20 61 63 74 69 76 65 20 63 75 72 73 6f 72 73 2c   active cursors,
1f130 20 69 74 20 61 6c 73 6f 20 72 65 6c 65 61 73 65   it also release
1f140 73 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e  s the read lock.
1f150 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
1f160 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54  treeCommitPhaseT
1f170 77 6f 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  wo(Btree *p, int
1f180 20 62 43 6c 65 61 6e 75 70 29 7b 0a 0a 20 20 69   bCleanup){..  i
1f190 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  f( p->inTrans==T
1f1a0 52 41 4e 53 5f 4e 4f 4e 45 20 29 20 72 65 74 75  RANS_NONE ) retu
1f1b0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
1f1c0 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
1f1d0 72 28 70 29 3b 0a 20 20 62 74 72 65 65 49 6e 74  r(p);.  btreeInt
1f1e0 65 67 72 69 74 79 28 70 29 3b 0a 0a 20 20 2f 2a  egrity(p);..  /*
1f1f0 20 49 66 20 74 68 65 20 68 61 6e 64 6c 65 20 68   If the handle h
1f200 61 73 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73  as a write-trans
1f210 61 63 74 69 6f 6e 20 6f 70 65 6e 2c 20 63 6f 6d  action open, com
1f220 6d 69 74 20 74 68 65 20 73 68 61 72 65 64 2d 62  mit the shared-b
1f230 74 72 65 65 73 20 0a 20 20 2a 2a 20 74 72 61 6e  trees .  ** tran
1f240 73 61 63 74 69 6f 6e 20 61 6e 64 20 73 65 74 20  saction and set 
1f250 74 68 65 20 73 68 61 72 65 64 20 73 74 61 74 65  the shared state
1f260 20 74 6f 20 54 52 41 4e 53 5f 52 45 41 44 2e 0a   to TRANS_READ..
1f270 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 6e    */.  if( p->in
1f280 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49  Trans==TRANS_WRI
1f290 54 45 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63  TE ){.    int rc
1f2a0 3b 0a 20 20 20 20 42 74 53 68 61 72 65 64 20 2a  ;.    BtShared *
1f2b0 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
1f2c0 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69    assert( pBt->i
1f2d0 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52  nTransaction==TR
1f2e0 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 20  ANS_WRITE );.   
1f2f0 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6e 54   assert( pBt->nT
1f300 72 61 6e 73 61 63 74 69 6f 6e 3e 30 20 29 3b 0a  ransaction>0 );.
1f310 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1f320 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65  PagerCommitPhase
1f330 54 77 6f 28 70 42 74 2d 3e 70 50 61 67 65 72 29  Two(pBt->pPager)
1f340 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
1f350 4c 49 54 45 5f 4f 4b 20 26 26 20 62 43 6c 65 61  LITE_OK && bClea
1f360 6e 75 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  nup==0 ){.      
1f370 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
1f380 65 28 70 29 3b 0a 20 20 20 20 20 20 72 65 74 75  e(p);.      retu
1f390 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
1f3a0 20 70 2d 3e 69 44 61 74 61 56 65 72 73 69 6f 6e   p->iDataVersion
1f3b0 2d 2d 3b 20 20 2f 2a 20 43 6f 6d 70 65 6e 73 61  --;  /* Compensa
1f3c0 74 65 20 66 6f 72 20 70 50 61 67 65 72 2d 3e 69  te for pPager->i
1f3d0 44 61 74 61 56 65 72 73 69 6f 6e 2b 2b 3b 20 2a  DataVersion++; *
1f3e0 2f 0a 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61  /.    pBt->inTra
1f3f0 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53  nsaction = TRANS
1f400 5f 52 45 41 44 3b 0a 20 20 20 20 62 74 72 65 65  _READ;.    btree
1f410 43 6c 65 61 72 48 61 73 43 6f 6e 74 65 6e 74 28  ClearHasContent(
1f420 70 42 74 29 3b 0a 20 20 7d 0a 0a 20 20 62 74 72  pBt);.  }..  btr
1f430 65 65 45 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e  eeEndTransaction
1f440 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  (p);.  sqlite3Bt
1f450 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
1f460 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1f470 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 62 6f 74  .}../*.** Do bot
1f480 68 20 70 68 61 73 65 73 20 6f 66 20 61 20 63 6f  h phases of a co
1f490 6d 6d 69 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  mmit..*/.int sql
1f4a0 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 28  ite3BtreeCommit(
1f4b0 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74  Btree *p){.  int
1f4c0 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74   rc;.  sqlite3Bt
1f4d0 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 72  reeEnter(p);.  r
1f4e0 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
1f4f0 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70  CommitPhaseOne(p
1f500 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  , 0);.  if( rc==
1f510 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1f520 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
1f530 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f  eeCommitPhaseTwo
1f540 28 70 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 73 71  (p, 0);.  }.  sq
1f550 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
1f560 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
1f570 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
1f580 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68 65 20  outine sets the 
1f590 73 74 61 74 65 20 74 6f 20 43 55 52 53 4f 52 5f  state to CURSOR_
1f5a0 46 41 55 4c 54 20 61 6e 64 20 74 68 65 20 65 72  FAULT and the er
1f5b0 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 74 6f 20 65  ror.** code to e
1f5c0 72 72 43 6f 64 65 20 66 6f 72 20 65 76 65 72 79  rrCode for every
1f5d0 20 63 75 72 73 6f 72 20 6f 6e 20 61 6e 79 20 42   cursor on any B
1f5e0 74 53 68 61 72 65 64 20 74 68 61 74 20 70 42 74  tShared that pBt
1f5f0 72 65 65 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65  ree.** reference
1f600 73 2e 20 20 4f 72 20 69 66 20 74 68 65 20 77 72  s.  Or if the wr
1f610 69 74 65 4f 6e 6c 79 20 66 6c 61 67 20 69 73 20  iteOnly flag is 
1f620 73 65 74 20 74 6f 20 31 2c 20 74 68 65 6e 20 6f  set to 1, then o
1f630 6e 6c 79 0a 2a 2a 20 74 72 69 70 20 77 72 69 74  nly.** trip writ
1f640 65 20 63 75 72 73 6f 72 73 20 61 6e 64 20 6c 65  e cursors and le
1f650 61 76 65 20 72 65 61 64 20 63 75 72 73 6f 72 73  ave read cursors
1f660 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a   unchanged..**.*
1f670 2a 20 45 76 65 72 79 20 63 75 72 73 6f 72 20 69  * Every cursor i
1f680 73 20 61 20 63 61 6e 64 69 64 61 74 65 20 74 6f  s a candidate to
1f690 20 62 65 20 74 72 69 70 70 65 64 2c 20 69 6e 63   be tripped, inc
1f6a0 6c 75 64 69 6e 67 20 63 75 72 73 6f 72 73 0a 2a  luding cursors.*
1f6b0 2a 20 74 68 61 74 20 62 65 6c 6f 6e 67 20 74 6f  * that belong to
1f6c0 20 6f 74 68 65 72 20 64 61 74 61 62 61 73 65 20   other database 
1f6d0 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 68 61 74  connections that
1f6e0 20 68 61 70 70 65 6e 20 74 6f 20 62 65 0a 2a 2a   happen to be.**
1f6f0 20 73 68 61 72 69 6e 67 20 74 68 65 20 63 61 63   sharing the cac
1f700 68 65 20 77 69 74 68 20 70 42 74 72 65 65 2e 0a  he with pBtree..
1f710 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
1f720 6e 65 20 67 65 74 73 20 63 61 6c 6c 65 64 20 77  ne gets called w
1f730 68 65 6e 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f  hen a rollback o
1f740 63 63 75 72 73 2e 20 49 66 20 74 68 65 20 77 72  ccurs. If the wr
1f750 69 74 65 4f 6e 6c 79 0a 2a 2a 20 66 6c 61 67 20  iteOnly.** flag 
1f760 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 6f 6e  is true, then on
1f770 6c 79 20 77 72 69 74 65 2d 63 75 72 73 6f 72 73  ly write-cursors
1f780 20 6e 65 65 64 20 62 65 20 74 72 69 70 70 65 64   need be tripped
1f790 20 2d 20 72 65 61 64 2d 6f 6e 6c 79 0a 2a 2a 20   - read-only.** 
1f7a0 63 75 72 73 6f 72 73 20 73 61 76 65 20 74 68 65  cursors save the
1f7b0 69 72 20 63 75 72 72 65 6e 74 20 70 6f 73 69 74  ir current posit
1f7c0 69 6f 6e 73 20 73 6f 20 74 68 61 74 20 74 68 65  ions so that the
1f7d0 79 20 6d 61 79 20 63 6f 6e 74 69 6e 75 65 20 0a  y may continue .
1f7e0 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65  ** following the
1f7f0 20 72 6f 6c 6c 62 61 63 6b 2e 20 4f 72 2c 20 69   rollback. Or, i
1f800 66 20 77 72 69 74 65 4f 6e 6c 79 20 69 73 20 66  f writeOnly is f
1f810 61 6c 73 65 2c 20 61 6c 6c 20 63 75 72 73 6f 72  alse, all cursor
1f820 73 20 61 72 65 20 0a 2a 2a 20 74 72 69 70 70 65  s are .** trippe
1f830 64 2e 20 49 6e 20 67 65 6e 65 72 61 6c 2c 20 77  d. In general, w
1f840 72 69 74 65 4f 6e 6c 79 20 69 73 20 66 61 6c 73  riteOnly is fals
1f850 65 20 69 66 20 74 68 65 20 74 72 61 6e 73 61 63  e if the transac
1f860 74 69 6f 6e 20 62 65 69 6e 67 0a 2a 2a 20 72 6f  tion being.** ro
1f870 6c 6c 65 64 20 62 61 63 6b 20 6d 6f 64 69 66 69  lled back modifi
1f880 65 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ed the database 
1f890 73 63 68 65 6d 61 2e 20 49 6e 20 74 68 69 73 20  schema. In this 
1f8a0 63 61 73 65 20 62 2d 74 72 65 65 20 72 6f 6f 74  case b-tree root
1f8b0 0a 2a 2a 20 70 61 67 65 73 20 6d 61 79 20 62 65  .** pages may be
1f8c0 20 6d 6f 76 65 64 20 6f 72 20 64 65 6c 65 74 65   moved or delete
1f8d0 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  d from the datab
1f8e0 61 73 65 20 61 6c 74 6f 67 65 74 68 65 72 2c 20  ase altogether, 
1f8f0 6d 61 6b 69 6e 67 0a 2a 2a 20 69 74 20 75 6e 73  making.** it uns
1f900 61 66 65 20 66 6f 72 20 72 65 61 64 20 63 75 72  afe for read cur
1f910 73 6f 72 73 20 74 6f 20 63 6f 6e 74 69 6e 75 65  sors to continue
1f920 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 77  ..**.** If the w
1f930 72 69 74 65 4f 6e 6c 79 20 66 6c 61 67 20 69 73  riteOnly flag is
1f940 20 74 72 75 65 20 61 6e 64 20 61 6e 20 65 72 72   true and an err
1f950 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65  or is encountere
1f960 64 20 77 68 69 6c 65 20 0a 2a 2a 20 73 61 76 69  d while .** savi
1f970 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  ng the current p
1f980 6f 73 69 74 69 6f 6e 20 6f 66 20 61 20 72 65 61  osition of a rea
1f990 64 2d 6f 6e 6c 79 20 63 75 72 73 6f 72 2c 20 61  d-only cursor, a
1f9a0 6c 6c 20 63 75 72 73 6f 72 73 2c 20 0a 2a 2a 20  ll cursors, .** 
1f9b0 69 6e 63 6c 75 64 69 6e 67 20 61 6c 6c 20 72 65  including all re
1f9c0 61 64 2d 63 75 72 73 6f 72 73 20 61 72 65 20 74  ad-cursors are t
1f9d0 72 69 70 70 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 51  ripped..**.** SQ
1f9e0 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
1f9f0 6e 65 64 20 69 66 20 73 75 63 63 65 73 73 66 75  ned if successfu
1fa00 6c 2c 20 6f 72 20 69 66 20 61 6e 20 65 72 72 6f  l, or if an erro
1fa10 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 0a 2a  r occurs while.*
1fa20 2a 20 73 61 76 69 6e 67 20 61 20 63 75 72 73 6f  * saving a curso
1fa30 72 20 70 6f 73 69 74 69 6f 6e 2c 20 61 6e 20 53  r position, an S
1fa40 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
1fa50 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1fa60 42 74 72 65 65 54 72 69 70 41 6c 6c 43 75 72 73  BtreeTripAllCurs
1fa70 6f 72 73 28 42 74 72 65 65 20 2a 70 42 74 72 65  ors(Btree *pBtre
1fa80 65 2c 20 69 6e 74 20 65 72 72 43 6f 64 65 2c 20  e, int errCode, 
1fa90 69 6e 74 20 77 72 69 74 65 4f 6e 6c 79 29 7b 0a  int writeOnly){.
1faa0 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20    BtCursor *p;. 
1fab0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
1fac0 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  _OK;..  assert( 
1fad0 28 77 72 69 74 65 4f 6e 6c 79 3d 3d 30 20 7c 7c  (writeOnly==0 ||
1fae0 20 77 72 69 74 65 4f 6e 6c 79 3d 3d 31 29 20 26   writeOnly==1) &
1faf0 26 20 42 54 43 46 5f 57 72 69 74 65 46 6c 61 67  & BTCF_WriteFlag
1fb00 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20 70 42 74  ==1 );.  if( pBt
1fb10 72 65 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ree ){.    sqlit
1fb20 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 42 74  e3BtreeEnter(pBt
1fb30 72 65 65 29 3b 0a 20 20 20 20 66 6f 72 28 70 3d  ree);.    for(p=
1fb40 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 43 75  pBtree->pBt->pCu
1fb50 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e  rsor; p; p=p->pN
1fb60 65 78 74 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  ext){.      int 
1fb70 69 3b 0a 20 20 20 20 20 20 69 66 28 20 77 72 69  i;.      if( wri
1fb80 74 65 4f 6e 6c 79 20 26 26 20 28 70 2d 3e 63 75  teOnly && (p->cu
1fb90 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 57 72  rFlags & BTCF_Wr
1fba0 69 74 65 46 6c 61 67 29 3d 3d 30 20 29 7b 0a 20  iteFlag)==0 ){. 
1fbb0 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 65 53         if( p->eS
1fbc0 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
1fbd0 49 44 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d  ID || p->eState=
1fbe0 3d 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54  =CURSOR_SKIPNEXT
1fbf0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
1fc00 20 3d 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73   = saveCursorPos
1fc10 69 74 69 6f 6e 28 70 29 3b 0a 20 20 20 20 20 20  ition(p);.      
1fc20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1fc30 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1fc40 20 20 20 20 20 28 76 6f 69 64 29 73 71 6c 69 74       (void)sqlit
1fc50 65 33 42 74 72 65 65 54 72 69 70 41 6c 6c 43 75  e3BtreeTripAllCu
1fc60 72 73 6f 72 73 28 70 42 74 72 65 65 2c 20 72 63  rsors(pBtree, rc
1fc70 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
1fc80 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
1fc90 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
1fca0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1fcb0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
1fcc0 43 6c 65 61 72 43 75 72 73 6f 72 28 70 29 3b 0a  ClearCursor(p);.
1fcd0 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74          p->eStat
1fce0 65 20 3d 20 43 55 52 53 4f 52 5f 46 41 55 4c 54  e = CURSOR_FAULT
1fcf0 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 73 6b 69  ;.        p->ski
1fd00 70 4e 65 78 74 20 3d 20 65 72 72 43 6f 64 65 3b  pNext = errCode;
1fd10 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66  .      }.      f
1fd20 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 2d 3e 69 50  or(i=0; i<=p->iP
1fd30 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  age; i++){.     
1fd40 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
1fd50 2d 3e 61 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20  ->apPage[i]);.  
1fd60 20 20 20 20 20 20 70 2d 3e 61 70 50 61 67 65 5b        p->apPage[
1fd70 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  i] = 0;.      }.
1fd80 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
1fd90 33 42 74 72 65 65 4c 65 61 76 65 28 70 42 74 72  3BtreeLeave(pBtr
1fda0 65 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ee);.  }.  retur
1fdb0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
1fdc0 6f 6c 6c 62 61 63 6b 20 74 68 65 20 74 72 61 6e  ollback the tran
1fdd0 73 61 63 74 69 6f 6e 20 69 6e 20 70 72 6f 67 72  saction in progr
1fde0 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 72  ess..**.** If tr
1fdf0 69 70 43 6f 64 65 20 69 73 20 6e 6f 74 20 53 51  ipCode is not SQ
1fe00 4c 49 54 45 5f 4f 4b 20 74 68 65 6e 20 63 75 72  LITE_OK then cur
1fe10 73 6f 72 73 20 77 69 6c 6c 20 62 65 20 69 6e 76  sors will be inv
1fe20 61 6c 69 64 61 74 65 64 20 28 74 72 69 70 70 65  alidated (trippe
1fe30 64 29 2e 0a 2a 2a 20 4f 6e 6c 79 20 77 72 69 74  d)..** Only writ
1fe40 65 20 63 75 72 73 6f 72 73 20 61 72 65 20 74 72  e cursors are tr
1fe50 69 70 70 65 64 20 69 66 20 77 72 69 74 65 4f 6e  ipped if writeOn
1fe60 6c 79 20 69 73 20 74 72 75 65 20 62 75 74 20 61  ly is true but a
1fe70 6c 6c 20 63 75 72 73 6f 72 73 20 61 72 65 0a 2a  ll cursors are.*
1fe80 2a 20 74 72 69 70 70 65 64 20 69 66 20 77 72 69  * tripped if wri
1fe90 74 65 4f 6e 6c 79 20 69 73 20 66 61 6c 73 65 2e  teOnly is false.
1fea0 20 20 41 6e 79 20 61 74 74 65 6d 70 74 20 74 6f    Any attempt to
1feb0 20 75 73 65 0a 2a 2a 20 61 20 74 72 69 70 70 65   use.** a trippe
1fec0 64 20 63 75 72 73 6f 72 20 77 69 6c 6c 20 72 65  d cursor will re
1fed0 73 75 6c 74 20 69 6e 20 61 6e 20 65 72 72 6f 72  sult in an error
1fee0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 69 6c  ..**.** This wil
1fef0 6c 20 72 65 6c 65 61 73 65 20 74 68 65 20 77 72  l release the wr
1ff00 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ite lock on the 
1ff10 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
1ff20 49 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20  If there.** are 
1ff30 6e 6f 20 61 63 74 69 76 65 20 63 75 72 73 6f 72  no active cursor
1ff40 73 2c 20 69 74 20 61 6c 73 6f 20 72 65 6c 65 61  s, it also relea
1ff50 73 65 73 20 74 68 65 20 72 65 61 64 20 6c 6f 63  ses the read loc
1ff60 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  k..*/.int sqlite
1ff70 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 42  3BtreeRollback(B
1ff80 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 74 72 69  tree *p, int tri
1ff90 70 43 6f 64 65 2c 20 69 6e 74 20 77 72 69 74 65  pCode, int write
1ffa0 4f 6e 6c 79 29 7b 0a 20 20 69 6e 74 20 72 63 3b  Only){.  int rc;
1ffb0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
1ffc0 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 4d 65 6d   = p->pBt;.  Mem
1ffd0 50 61 67 65 20 2a 70 50 61 67 65 31 3b 0a 0a 20  Page *pPage1;.. 
1ffe0 20 61 73 73 65 72 74 28 20 77 72 69 74 65 4f 6e   assert( writeOn
1fff0 6c 79 3d 3d 31 20 7c 7c 20 77 72 69 74 65 4f 6e  ly==1 || writeOn
20000 6c 79 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ly==0 );.  asser
20010 74 28 20 74 72 69 70 43 6f 64 65 3d 3d 53 51 4c  t( tripCode==SQL
20020 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41  ITE_ABORT_ROLLBA
20030 43 4b 20 7c 7c 20 74 72 69 70 43 6f 64 65 3d 3d  CK || tripCode==
20040 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 73  SQLITE_OK );.  s
20050 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
20060 28 70 29 3b 0a 20 20 69 66 28 20 74 72 69 70 43  (p);.  if( tripC
20070 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  ode==SQLITE_OK )
20080 7b 0a 20 20 20 20 72 63 20 3d 20 74 72 69 70 43  {.    rc = tripC
20090 6f 64 65 20 3d 20 73 61 76 65 41 6c 6c 43 75 72  ode = saveAllCur
200a0 73 6f 72 73 28 70 42 74 2c 20 30 2c 20 30 29 3b  sors(pBt, 0, 0);
200b0 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 77 72  .    if( rc ) wr
200c0 69 74 65 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20 7d  iteOnly = 0;.  }
200d0 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 53  else{.    rc = S
200e0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
200f0 69 66 28 20 74 72 69 70 43 6f 64 65 20 29 7b 0a  if( tripCode ){.
20100 20 20 20 20 69 6e 74 20 72 63 32 20 3d 20 73 71      int rc2 = sq
20110 6c 69 74 65 33 42 74 72 65 65 54 72 69 70 41 6c  lite3BtreeTripAl
20120 6c 43 75 72 73 6f 72 73 28 70 2c 20 74 72 69 70  lCursors(p, trip
20130 43 6f 64 65 2c 20 77 72 69 74 65 4f 6e 6c 79 29  Code, writeOnly)
20140 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63  ;.    assert( rc
20150 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28  ==SQLITE_OK || (
20160 77 72 69 74 65 4f 6e 6c 79 3d 3d 30 20 26 26 20  writeOnly==0 && 
20170 72 63 32 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 20  rc2==SQLITE_OK) 
20180 29 3b 0a 20 20 20 20 69 66 28 20 72 63 32 21 3d  );.    if( rc2!=
20190 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d  SQLITE_OK ) rc =
201a0 20 72 63 32 3b 0a 20 20 7d 0a 20 20 62 74 72 65   rc2;.  }.  btre
201b0 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 0a  eIntegrity(p);..
201c0 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73    if( p->inTrans
201d0 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b  ==TRANS_WRITE ){
201e0 0a 20 20 20 20 69 6e 74 20 72 63 32 3b 0a 0a 20  .    int rc2;.. 
201f0 20 20 20 61 73 73 65 72 74 28 20 54 52 41 4e 53     assert( TRANS
20200 5f 57 52 49 54 45 3d 3d 70 42 74 2d 3e 69 6e 54  _WRITE==pBt->inT
20210 72 61 6e 73 61 63 74 69 6f 6e 20 29 3b 0a 20 20  ransaction );.  
20220 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33 50    rc2 = sqlite3P
20230 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70 42 74  agerRollback(pBt
20240 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69  ->pPager);.    i
20250 66 28 20 72 63 32 21 3d 53 51 4c 49 54 45 5f 4f  f( rc2!=SQLITE_O
20260 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
20270 72 63 32 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  rc2;.    }..    
20280 2f 2a 20 54 68 65 20 72 6f 6c 6c 62 61 63 6b 20  /* The rollback 
20290 6d 61 79 20 68 61 76 65 20 64 65 73 74 72 6f 79  may have destroy
202a0 65 64 20 74 68 65 20 70 50 61 67 65 31 2d 3e 61  ed the pPage1->a
202b0 44 61 74 61 20 76 61 6c 75 65 2e 20 20 53 6f 0a  Data value.  So.
202c0 20 20 20 20 2a 2a 20 63 61 6c 6c 20 62 74 72 65      ** call btre
202d0 65 47 65 74 50 61 67 65 28 29 20 6f 6e 20 70 61  eGetPage() on pa
202e0 67 65 20 31 20 61 67 61 69 6e 20 74 6f 20 6d 61  ge 1 again to ma
202f0 6b 65 0a 20 20 20 20 2a 2a 20 73 75 72 65 20 70  ke.    ** sure p
20300 50 61 67 65 31 2d 3e 61 44 61 74 61 20 69 73 20  Page1->aData is 
20310 73 65 74 20 63 6f 72 72 65 63 74 6c 79 2e 20 2a  set correctly. *
20320 2f 0a 20 20 20 20 69 66 28 20 62 74 72 65 65 47  /.    if( btreeG
20330 65 74 50 61 67 65 28 70 42 74 2c 20 31 2c 20 26  etPage(pBt, 1, &
20340 70 50 61 67 65 31 2c 20 30 29 3d 3d 53 51 4c 49  pPage1, 0)==SQLI
20350 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69  TE_OK ){.      i
20360 6e 74 20 6e 50 61 67 65 20 3d 20 67 65 74 34 62  nt nPage = get4b
20370 79 74 65 28 32 38 2b 28 75 38 2a 29 70 50 61 67  yte(28+(u8*)pPag
20380 65 31 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20  e1->aData);.    
20390 20 20 74 65 73 74 63 61 73 65 28 20 6e 50 61 67    testcase( nPag
203a0 65 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66  e==0 );.      if
203b0 28 20 6e 50 61 67 65 3d 3d 30 20 29 20 73 71 6c  ( nPage==0 ) sql
203c0 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75  ite3PagerPagecou
203d0 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  nt(pBt->pPager, 
203e0 26 6e 50 61 67 65 29 3b 0a 20 20 20 20 20 20 74  &nPage);.      t
203f0 65 73 74 63 61 73 65 28 20 70 42 74 2d 3e 6e 50  estcase( pBt->nP
20400 61 67 65 21 3d 6e 50 61 67 65 20 29 3b 0a 20 20  age!=nPage );.  
20410 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d      pBt->nPage =
20420 20 6e 50 61 67 65 3b 0a 20 20 20 20 20 20 72 65   nPage;.      re
20430 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65 31  leasePage(pPage1
20440 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  );.    }.    ass
20450 65 72 74 28 20 63 6f 75 6e 74 56 61 6c 69 64 43  ert( countValidC
20460 75 72 73 6f 72 73 28 70 42 74 2c 20 31 29 3d 3d  ursors(pBt, 1)==
20470 30 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e  0 );.    pBt->in
20480 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52  Transaction = TR
20490 41 4e 53 5f 52 45 41 44 3b 0a 20 20 20 20 62 74  ANS_READ;.    bt
204a0 72 65 65 43 6c 65 61 72 48 61 73 43 6f 6e 74 65  reeClearHasConte
204b0 6e 74 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 20 20  nt(pBt);.  }..  
204c0 62 74 72 65 65 45 6e 64 54 72 61 6e 73 61 63 74  btreeEndTransact
204d0 69 6f 6e 28 70 29 3b 0a 20 20 73 71 6c 69 74 65  ion(p);.  sqlite
204e0 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
204f0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
20500 2f 2a 0a 2a 2a 20 53 74 61 72 74 20 61 20 73 74  /*.** Start a st
20510 61 74 65 6d 65 6e 74 20 73 75 62 74 72 61 6e 73  atement subtrans
20520 61 63 74 69 6f 6e 2e 20 54 68 65 20 73 75 62 74  action. The subt
20530 72 61 6e 73 61 63 74 69 6f 6e 20 63 61 6e 20 62  ransaction can b
20540 65 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b  e rolled.** back
20550 20 69 6e 64 65 70 65 6e 64 65 6e 74 6c 79 20 6f   independently o
20560 66 20 74 68 65 20 6d 61 69 6e 20 74 72 61 6e 73  f the main trans
20570 61 63 74 69 6f 6e 2e 20 59 6f 75 20 6d 75 73 74  action. You must
20580 20 73 74 61 72 74 20 61 20 74 72 61 6e 73 61 63   start a transac
20590 74 69 6f 6e 20 0a 2a 2a 20 62 65 66 6f 72 65 20  tion .** before 
205a0 73 74 61 72 74 69 6e 67 20 61 20 73 75 62 74 72  starting a subtr
205b0 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 73  ansaction. The s
205c0 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  ubtransaction is
205d0 20 65 6e 64 65 64 20 61 75 74 6f 6d 61 74 69 63   ended automatic
205e0 61 6c 6c 79 20 0a 2a 2a 20 69 66 20 74 68 65 20  ally .** if the 
205f0 6d 61 69 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e  main transaction
20600 20 63 6f 6d 6d 69 74 73 20 6f 72 20 72 6f 6c 6c   commits or roll
20610 73 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 74  s back..**.** St
20620 61 74 65 6d 65 6e 74 20 73 75 62 74 72 61 6e 73  atement subtrans
20630 61 63 74 69 6f 6e 73 20 61 72 65 20 75 73 65 64  actions are used
20640 20 61 72 6f 75 6e 64 20 69 6e 64 69 76 69 64 75   around individu
20650 61 6c 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  al SQL statement
20660 73 0a 2a 2a 20 74 68 61 74 20 61 72 65 20 63 6f  s.** that are co
20670 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e 20 61  ntained within a
20680 20 42 45 47 49 4e 2e 2e 2e 43 4f 4d 4d 49 54 20   BEGIN...COMMIT 
20690 62 6c 6f 63 6b 2e 20 20 49 66 20 61 20 63 6f 6e  block.  If a con
206a0 73 74 72 61 69 6e 74 0a 2a 2a 20 65 72 72 6f 72  straint.** error
206b0 20 6f 63 63 75 72 73 20 77 69 74 68 69 6e 20 74   occurs within t
206c0 68 65 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68  he statement, th
206d0 65 20 65 66 66 65 63 74 20 6f 66 20 74 68 61 74  e effect of that
206e0 20 6f 6e 65 20 73 74 61 74 65 6d 65 6e 74 0a 2a   one statement.*
206f0 2a 20 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64 20  * can be rolled 
20700 62 61 63 6b 20 77 69 74 68 6f 75 74 20 68 61 76  back without hav
20710 69 6e 67 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20  ing to rollback 
20720 74 68 65 20 65 6e 74 69 72 65 20 74 72 61 6e 73  the entire trans
20730 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20  action..**.** A 
20740 73 74 61 74 65 6d 65 6e 74 20 73 75 62 2d 74 72  statement sub-tr
20750 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 69 6d 70  ansaction is imp
20760 6c 65 6d 65 6e 74 65 64 20 61 73 20 61 6e 20 61  lemented as an a
20770 6e 6f 6e 79 6d 6f 75 73 20 73 61 76 65 70 6f 69  nonymous savepoi
20780 6e 74 2e 20 54 68 65 0a 2a 2a 20 76 61 6c 75 65  nt. The.** value
20790 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73   passed as the s
207a0 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65 72 20  econd parameter 
207b0 69 73 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d  is the total num
207c0 62 65 72 20 6f 66 20 73 61 76 65 70 6f 69 6e 74  ber of savepoint
207d0 73 2c 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20  s,.** including 
207e0 74 68 65 20 6e 65 77 20 61 6e 6f 6e 79 6d 6f 75  the new anonymou
207f0 73 20 73 61 76 65 70 6f 69 6e 74 2c 20 6f 70 65  s savepoint, ope
20800 6e 20 6f 6e 20 74 68 65 20 42 2d 54 72 65 65 2e  n on the B-Tree.
20810 20 69 2e 65 2e 20 69 66 20 74 68 65 72 65 0a 2a   i.e. if there.*
20820 2a 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20  * are no active 
20830 73 61 76 65 70 6f 69 6e 74 73 20 61 6e 64 20 6e  savepoints and n
20840 6f 20 6f 74 68 65 72 20 73 74 61 74 65 6d 65 6e  o other statemen
20850 74 2d 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 6f  t-transactions o
20860 70 65 6e 2c 0a 2a 2a 20 69 53 74 61 74 65 6d 65  pen,.** iStateme
20870 6e 74 20 69 73 20 31 2e 20 54 68 69 73 20 61 6e  nt is 1. This an
20880 6f 6e 79 6d 6f 75 73 20 73 61 76 65 70 6f 69 6e  onymous savepoin
20890 74 20 63 61 6e 20 62 65 20 72 65 6c 65 61 73 65  t can be release
208a0 64 20 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63 6b  d or rolled back
208b0 0a 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 73 71  .** using the sq
208c0 6c 69 74 65 33 42 74 72 65 65 53 61 76 65 70 6f  lite3BtreeSavepo
208d0 69 6e 74 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a  int() function..
208e0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
208f0 72 65 65 42 65 67 69 6e 53 74 6d 74 28 42 74 72  reeBeginStmt(Btr
20900 65 65 20 2a 70 2c 20 69 6e 74 20 69 53 74 61 74  ee *p, int iStat
20910 65 6d 65 6e 74 29 7b 0a 20 20 69 6e 74 20 72 63  ement){.  int rc
20920 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
20930 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 73 71  t = p->pBt;.  sq
20940 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
20950 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d  p);.  assert( p-
20960 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
20970 57 52 49 54 45 20 29 3b 0a 20 20 61 73 73 65 72  WRITE );.  asser
20980 74 28 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67  t( (pBt->btsFlag
20990 73 20 26 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c  s & BTS_READ_ONL
209a0 59 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  Y)==0 );.  asser
209b0 74 28 20 69 53 74 61 74 65 6d 65 6e 74 3e 30 20  t( iStatement>0 
209c0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 53 74  );.  assert( iSt
209d0 61 74 65 6d 65 6e 74 3e 70 2d 3e 64 62 2d 3e 6e  atement>p->db->n
209e0 53 61 76 65 70 6f 69 6e 74 20 29 3b 0a 20 20 61  Savepoint );.  a
209f0 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72  ssert( pBt->inTr
20a00 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53  ansaction==TRANS
20a10 5f 57 52 49 54 45 20 29 3b 0a 20 20 2f 2a 20 41  _WRITE );.  /* A
20a20 74 20 74 68 65 20 70 61 67 65 72 20 6c 65 76 65  t the pager leve
20a30 6c 2c 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74  l, a statement t
20a40 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 20  ransaction is a 
20a50 73 61 76 65 70 6f 69 6e 74 20 77 69 74 68 0a 20  savepoint with. 
20a60 20 2a 2a 20 61 6e 20 69 6e 64 65 78 20 67 72 65   ** an index gre
20a70 61 74 65 72 20 74 68 61 6e 20 61 6c 6c 20 73 61  ater than all sa
20a80 76 65 70 6f 69 6e 74 73 20 63 72 65 61 74 65 64  vepoints created
20a90 20 65 78 70 6c 69 63 69 74 6c 79 20 75 73 69 6e   explicitly usin
20aa0 67 0a 20 20 2a 2a 20 53 51 4c 20 73 74 61 74 65  g.  ** SQL state
20ab0 6d 65 6e 74 73 2e 20 49 74 20 69 73 20 69 6c 6c  ments. It is ill
20ac0 65 67 61 6c 20 74 6f 20 6f 70 65 6e 2c 20 72 65  egal to open, re
20ad0 6c 65 61 73 65 20 6f 72 20 72 6f 6c 6c 62 61 63  lease or rollbac
20ae0 6b 20 61 6e 79 0a 20 20 2a 2a 20 73 75 63 68 20  k any.  ** such 
20af0 73 61 76 65 70 6f 69 6e 74 73 20 77 68 69 6c 65  savepoints while
20b00 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74   the statement t
20b10 72 61 6e 73 61 63 74 69 6f 6e 20 73 61 76 65 70  ransaction savep
20b20 6f 69 6e 74 20 69 73 20 61 63 74 69 76 65 2e 0a  oint is active..
20b30 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69    */.  rc = sqli
20b40 74 65 33 50 61 67 65 72 4f 70 65 6e 53 61 76 65  te3PagerOpenSave
20b50 70 6f 69 6e 74 28 70 42 74 2d 3e 70 50 61 67 65  point(pBt->pPage
20b60 72 2c 20 69 53 74 61 74 65 6d 65 6e 74 29 3b 0a  r, iStatement);.
20b70 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
20b80 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
20b90 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
20ba0 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
20bb0 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69  t to this functi
20bc0 6f 6e 2c 20 6f 70 2c 20 69 73 20 61 6c 77 61 79  on, op, is alway
20bd0 73 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  s SAVEPOINT_ROLL
20be0 42 41 43 4b 0a 2a 2a 20 6f 72 20 53 41 56 45 50  BACK.** or SAVEP
20bf0 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2e 20 54 68  OINT_RELEASE. Th
20c00 69 73 20 66 75 6e 63 74 69 6f 6e 20 65 69 74 68  is function eith
20c10 65 72 20 72 65 6c 65 61 73 65 73 20 6f 72 20 72  er releases or r
20c20 6f 6c 6c 73 20 62 61 63 6b 20 74 68 65 0a 2a 2a  olls back the.**
20c30 20 73 61 76 65 70 6f 69 6e 74 20 69 64 65 6e 74   savepoint ident
20c40 69 66 69 65 64 20 62 79 20 70 61 72 61 6d 65 74  ified by paramet
20c50 65 72 20 69 53 61 76 65 70 6f 69 6e 74 2c 20 64  er iSavepoint, d
20c60 65 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20  epending on the 
20c70 76 61 6c 75 65 20 0a 2a 2a 20 6f 66 20 6f 70 2e  value .** of op.
20c80 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c  .**.** Normally,
20c90 20 69 53 61 76 65 70 6f 69 6e 74 20 69 73 20 67   iSavepoint is g
20ca0 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65  reater than or e
20cb0 71 75 61 6c 20 74 6f 20 7a 65 72 6f 2e 20 48 6f  qual to zero. Ho
20cc0 77 65 76 65 72 2c 20 69 66 20 6f 70 20 69 73 0a  wever, if op is.
20cd0 2a 2a 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  ** SAVEPOINT_ROL
20ce0 4c 42 41 43 4b 2c 20 74 68 65 6e 20 69 53 61 76  LBACK, then iSav
20cf0 65 70 6f 69 6e 74 20 6d 61 79 20 61 6c 73 6f 20  epoint may also 
20d00 62 65 20 2d 31 2e 20 49 6e 20 74 68 69 73 20 63  be -1. In this c
20d10 61 73 65 20 74 68 65 20 0a 2a 2a 20 63 6f 6e 74  ase the .** cont
20d20 65 6e 74 73 20 6f 66 20 74 68 65 20 65 6e 74 69  ents of the enti
20d30 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61  re transaction a
20d40 72 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20  re rolled back. 
20d50 54 68 69 73 20 69 73 20 64 69 66 66 65 72 65 6e  This is differen
20d60 74 0a 2a 2a 20 66 72 6f 6d 20 61 20 6e 6f 72 6d  t.** from a norm
20d70 61 6c 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 72  al transaction r
20d80 6f 6c 6c 62 61 63 6b 2c 20 61 73 20 6e 6f 20 6c  ollback, as no l
20d90 6f 63 6b 73 20 61 72 65 20 72 65 6c 65 61 73 65  ocks are release
20da0 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20 74 72 61  d and the.** tra
20db0 6e 73 61 63 74 69 6f 6e 20 72 65 6d 61 69 6e 73  nsaction remains
20dc0 20 6f 70 65 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71   open..*/.int sq
20dd0 6c 69 74 65 33 42 74 72 65 65 53 61 76 65 70 6f  lite3BtreeSavepo
20de0 69 6e 74 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  int(Btree *p, in
20df0 74 20 6f 70 2c 20 69 6e 74 20 69 53 61 76 65 70  t op, int iSavep
20e00 6f 69 6e 74 29 7b 0a 20 20 69 6e 74 20 72 63 20  oint){.  int rc 
20e10 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
20e20 66 28 20 70 20 26 26 20 70 2d 3e 69 6e 54 72 61  f( p && p->inTra
20e30 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  ns==TRANS_WRITE 
20e40 29 7b 0a 20 20 20 20 42 74 53 68 61 72 65 64 20  ){.    BtShared 
20e50 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
20e60 20 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 53     assert( op==S
20e70 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45  AVEPOINT_RELEASE
20e80 20 7c 7c 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e   || op==SAVEPOIN
20e90 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 3b 0a 20 20  T_ROLLBACK );.  
20ea0 20 20 61 73 73 65 72 74 28 20 69 53 61 76 65 70    assert( iSavep
20eb0 6f 69 6e 74 3e 3d 30 20 7c 7c 20 28 69 53 61 76  oint>=0 || (iSav
20ec0 65 70 6f 69 6e 74 3d 3d 2d 31 20 26 26 20 6f 70  epoint==-1 && op
20ed0 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  ==SAVEPOINT_ROLL
20ee0 42 41 43 4b 29 20 29 3b 0a 20 20 20 20 73 71 6c  BACK) );.    sql
20ef0 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
20f00 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
20f10 74 65 33 50 61 67 65 72 53 61 76 65 70 6f 69 6e  te3PagerSavepoin
20f20 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6f  t(pBt->pPager, o
20f30 70 2c 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a  p, iSavepoint);.
20f40 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
20f50 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69  TE_OK ){.      i
20f60 66 28 20 69 53 61 76 65 70 6f 69 6e 74 3c 30 20  f( iSavepoint<0 
20f70 26 26 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67  && (pBt->btsFlag
20f80 73 20 26 20 42 54 53 5f 49 4e 49 54 49 41 4c 4c  s & BTS_INITIALL
20f90 59 5f 45 4d 50 54 59 29 21 3d 30 20 29 7b 0a 20  Y_EMPTY)!=0 ){. 
20fa0 20 20 20 20 20 20 20 70 42 74 2d 3e 6e 50 61 67         pBt->nPag
20fb0 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  e = 0;.      }. 
20fc0 20 20 20 20 20 72 63 20 3d 20 6e 65 77 44 61 74       rc = newDat
20fd0 61 62 61 73 65 28 70 42 74 29 3b 0a 20 20 20 20  abase(pBt);.    
20fe0 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 67    pBt->nPage = g
20ff0 65 74 34 62 79 74 65 28 32 38 20 2b 20 70 42 74  et4byte(28 + pBt
21000 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 29  ->pPage1->aData)
21010 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ;..      /* The 
21020 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 77 61  database size wa
21030 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74  s written into t
21040 68 65 20 6f 66 66 73 65 74 20 32 38 20 6f 66 20  he offset 28 of 
21050 74 68 65 20 68 65 61 64 65 72 0a 20 20 20 20 20  the header.     
21060 20 2a 2a 20 77 68 65 6e 20 74 68 65 20 74 72 61   ** when the tra
21070 6e 73 61 63 74 69 6f 6e 20 73 74 61 72 74 65 64  nsaction started
21080 2c 20 73 6f 20 77 65 20 6b 6e 6f 77 20 74 68 61  , so we know tha
21090 74 20 74 68 65 20 76 61 6c 75 65 20 61 74 20 6f  t the value at o
210a0 66 66 73 65 74 0a 20 20 20 20 20 20 2a 2a 20 32  ffset.      ** 2
210b0 38 20 69 73 20 6e 6f 6e 7a 65 72 6f 2e 20 2a 2f  8 is nonzero. */
210c0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
210d0 42 74 2d 3e 6e 50 61 67 65 3e 30 20 29 3b 0a 20  Bt->nPage>0 );. 
210e0 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
210f0 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
21100 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
21110 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20  }../*.** Create 
21120 61 20 6e 65 77 20 63 75 72 73 6f 72 20 66 6f 72  a new cursor for
21130 20 74 68 65 20 42 54 72 65 65 20 77 68 6f 73 65   the BTree whose
21140 20 72 6f 6f 74 20 69 73 20 6f 6e 20 74 68 65 20   root is on the 
21150 70 61 67 65 0a 2a 2a 20 69 54 61 62 6c 65 2e 20  page.** iTable. 
21160 49 66 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 63  If a read-only c
21170 75 72 73 6f 72 20 69 73 20 72 65 71 75 65 73 74  ursor is request
21180 65 64 2c 20 69 74 20 69 73 20 61 73 73 75 6d 65  ed, it is assume
21190 64 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 63 61  d that.** the ca
211a0 6c 6c 65 72 20 61 6c 72 65 61 64 79 20 68 61 73  ller already has
211b0 20 61 74 20 6c 65 61 73 74 20 61 20 72 65 61 64   at least a read
211c0 2d 6f 6e 6c 79 20 74 72 61 6e 73 61 63 74 69 6f  -only transactio
211d0 6e 20 6f 70 65 6e 0a 2a 2a 20 6f 6e 20 74 68 65  n open.** on the
211e0 20 64 61 74 61 62 61 73 65 20 61 6c 72 65 61 64   database alread
211f0 79 2e 20 49 66 20 61 20 77 72 69 74 65 2d 63 75  y. If a write-cu
21200 72 73 6f 72 20 69 73 20 72 65 71 75 65 73 74 65  rsor is requeste
21210 64 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 63  d, then.** the c
21220 61 6c 6c 65 72 20 69 73 20 61 73 73 75 6d 65 64  aller is assumed
21230 20 74 6f 20 68 61 76 65 20 61 6e 20 6f 70 65 6e   to have an open
21240 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
21250 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77 72 46  on..**.** If wrF
21260 6c 61 67 3d 3d 30 2c 20 74 68 65 6e 20 74 68 65  lag==0, then the
21270 20 63 75 72 73 6f 72 20 63 61 6e 20 6f 6e 6c 79   cursor can only
21280 20 62 65 20 75 73 65 64 20 66 6f 72 20 72 65 61   be used for rea
21290 64 69 6e 67 2e 0a 2a 2a 20 49 66 20 77 72 46 6c  ding..** If wrFl
212a0 61 67 3d 3d 31 2c 20 74 68 65 6e 20 74 68 65 20  ag==1, then the 
212b0 63 75 72 73 6f 72 20 63 61 6e 20 62 65 20 75 73  cursor can be us
212c0 65 64 20 66 6f 72 20 72 65 61 64 69 6e 67 20 6f  ed for reading o
212d0 72 20 66 6f 72 0a 2a 2a 20 77 72 69 74 69 6e 67  r for.** writing
212e0 20 69 66 20 6f 74 68 65 72 20 63 6f 6e 64 69 74   if other condit
212f0 69 6f 6e 73 20 66 6f 72 20 77 72 69 74 69 6e 67  ions for writing
21300 20 61 72 65 20 61 6c 73 6f 20 6d 65 74 2e 20 20   are also met.  
21310 54 68 65 73 65 0a 2a 2a 20 61 72 65 20 74 68 65  These.** are the
21320 20 63 6f 6e 64 69 74 69 6f 6e 73 20 74 68 61 74   conditions that
21330 20 6d 75 73 74 20 62 65 20 6d 65 74 20 69 6e 20   must be met in 
21340 6f 72 64 65 72 20 66 6f 72 20 77 72 69 74 69 6e  order for writin
21350 67 20 74 6f 0a 2a 2a 20 62 65 20 61 6c 6c 6f 77  g to.** be allow
21360 65 64 3a 0a 2a 2a 0a 2a 2a 20 31 3a 20 20 54 68  ed:.**.** 1:  Th
21370 65 20 63 75 72 73 6f 72 20 6d 75 73 74 20 68 61  e cursor must ha
21380 76 65 20 62 65 65 6e 20 6f 70 65 6e 65 64 20 77  ve been opened w
21390 69 74 68 20 77 72 46 6c 61 67 3d 3d 31 0a 2a 2a  ith wrFlag==1.**
213a0 0a 2a 2a 20 32 3a 20 20 4f 74 68 65 72 20 64 61  .** 2:  Other da
213b0 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
213c0 6e 73 20 74 68 61 74 20 73 68 61 72 65 20 74 68  ns that share th
213d0 65 20 73 61 6d 65 20 70 61 67 65 72 20 63 61 63  e same pager cac
213e0 68 65 0a 2a 2a 20 20 20 20 20 62 75 74 20 77 68  he.**     but wh
213f0 69 63 68 20 61 72 65 20 6e 6f 74 20 69 6e 20 74  ich are not in t
21400 68 65 20 52 45 41 44 5f 55 4e 43 4f 4d 4d 49 54  he READ_UNCOMMIT
21410 54 45 44 20 73 74 61 74 65 20 6d 61 79 20 6e 6f  TED state may no
21420 74 20 68 61 76 65 0a 2a 2a 20 20 20 20 20 63 75  t have.**     cu
21430 72 73 6f 72 73 20 6f 70 65 6e 20 77 69 74 68 20  rsors open with 
21440 77 72 46 6c 61 67 3d 3d 30 20 6f 6e 20 74 68 65  wrFlag==0 on the
21450 20 73 61 6d 65 20 74 61 62 6c 65 2e 20 20 4f 74   same table.  Ot
21460 68 65 72 77 69 73 65 0a 2a 2a 20 20 20 20 20 74  herwise.**     t
21470 68 65 20 63 68 61 6e 67 65 73 20 6d 61 64 65 20  he changes made 
21480 62 79 20 74 68 69 73 20 77 72 69 74 65 20 63 75  by this write cu
21490 72 73 6f 72 20 77 6f 75 6c 64 20 62 65 20 76 69  rsor would be vi
214a0 73 69 62 6c 65 20 74 6f 0a 2a 2a 20 20 20 20 20  sible to.**     
214b0 74 68 65 20 72 65 61 64 20 63 75 72 73 6f 72 73  the read cursors
214c0 20 69 6e 20 74 68 65 20 6f 74 68 65 72 20 64 61   in the other da
214d0 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
214e0 6e 2e 0a 2a 2a 0a 2a 2a 20 33 3a 20 20 54 68 65  n..**.** 3:  The
214f0 20 64 61 74 61 62 61 73 65 20 6d 75 73 74 20 62   database must b
21500 65 20 77 72 69 74 61 62 6c 65 20 28 6e 6f 74 20  e writable (not 
21510 6f 6e 20 72 65 61 64 2d 6f 6e 6c 79 20 6d 65 64  on read-only med
21520 69 61 29 0a 2a 2a 0a 2a 2a 20 34 3a 20 20 54 68  ia).**.** 4:  Th
21530 65 72 65 20 6d 75 73 74 20 62 65 20 61 6e 20 61  ere must be an a
21540 63 74 69 76 65 20 74 72 61 6e 73 61 63 74 69 6f  ctive transactio
21550 6e 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 20 63 68 65 63  n..**.** No chec
21560 6b 69 6e 67 20 69 73 20 64 6f 6e 65 20 74 6f 20  king is done to 
21570 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 70  make sure that p
21580 61 67 65 20 69 54 61 62 6c 65 20 72 65 61 6c 6c  age iTable reall
21590 79 20 69 73 20 74 68 65 0a 2a 2a 20 72 6f 6f 74  y is the.** root
215a0 20 70 61 67 65 20 6f 66 20 61 20 62 2d 74 72 65   page of a b-tre
215b0 65 2e 20 20 49 66 20 69 74 20 69 73 20 6e 6f 74  e.  If it is not
215c0 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f  , then the curso
215d0 72 20 61 63 71 75 69 72 65 64 0a 2a 2a 20 77 69  r acquired.** wi
215e0 6c 6c 20 6e 6f 74 20 77 6f 72 6b 20 63 6f 72 72  ll not work corr
215f0 65 63 74 6c 79 2e 0a 2a 2a 0a 2a 2a 20 49 74 20  ectly..**.** It 
21600 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 20  is assumed that 
21610 74 68 65 20 73 71 6c 69 74 65 33 42 74 72 65 65  the sqlite3Btree
21620 43 75 72 73 6f 72 5a 65 72 6f 28 29 20 68 61 73  CursorZero() has
21630 20 62 65 65 6e 20 63 61 6c 6c 65 64 0a 2a 2a 20   been called.** 
21640 6f 6e 20 70 43 75 72 20 74 6f 20 69 6e 69 74 69  on pCur to initi
21650 61 6c 69 7a 65 20 74 68 65 20 6d 65 6d 6f 72 79  alize the memory
21660 20 73 70 61 63 65 20 70 72 69 6f 72 20 74 6f 20   space prior to 
21670 69 6e 76 6f 6b 69 6e 67 20 74 68 69 73 20 72 6f  invoking this ro
21680 75 74 69 6e 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  utine..*/.static
21690 20 69 6e 74 20 62 74 72 65 65 43 75 72 73 6f 72   int btreeCursor
216a0 28 0a 20 20 42 74 72 65 65 20 2a 70 2c 20 20 20  (.  Btree *p,   
216b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
216c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
216d0 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74  e btree */.  int
216e0 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20   iTable,        
216f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21700 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65      /* Root page
21710 20 6f 66 20 74 61 62 6c 65 20 74 6f 20 6f 70 65   of table to ope
21720 6e 20 2a 2f 0a 20 20 69 6e 74 20 77 72 46 6c 61  n */.  int wrFla
21730 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g,              
21740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21750 20 31 20 74 6f 20 77 72 69 74 65 2e 20 30 20 72   1 to write. 0 r
21760 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74  ead-only */.  st
21770 72 75 63 74 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  ruct KeyInfo *pK
21780 65 79 49 6e 66 6f 2c 20 20 20 20 20 20 20 20 20  eyInfo,         
21790 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72       /* First ar
217a0 67 20 74 6f 20 63 6f 6d 70 61 72 69 73 6f 6e 20  g to comparison 
217b0 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 42 74  function */.  Bt
217c0 43 75 72 73 6f 72 20 2a 70 43 75 72 20 20 20 20  Cursor *pCur    
217d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
217e0 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20 66 6f       /* Space fo
217f0 72 20 6e 65 77 20 63 75 72 73 6f 72 20 2a 2f 0a  r new cursor */.
21800 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
21810 42 74 20 3d 20 70 2d 3e 70 42 74 3b 20 20 20 20  Bt = p->pBt;    
21820 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
21830 68 61 72 65 64 20 62 2d 74 72 65 65 20 68 61 6e  hared b-tree han
21840 64 6c 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  dle */..  assert
21850 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f  ( sqlite3BtreeHo
21860 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20  ldsMutex(p) );. 
21870 20 61 73 73 65 72 74 28 20 77 72 46 6c 61 67 3d   assert( wrFlag=
21880 3d 30 20 7c 7c 20 77 72 46 6c 61 67 3d 3d 31 20  =0 || wrFlag==1 
21890 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c  );..  /* The fol
218a0 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 20 73 74  lowing assert st
218b0 61 74 65 6d 65 6e 74 73 20 76 65 72 69 66 79 20  atements verify 
218c0 74 68 61 74 20 69 66 20 74 68 69 73 20 69 73 20  that if this is 
218d0 61 20 73 68 61 72 61 62 6c 65 20 0a 20 20 2a 2a  a sharable .  **
218e0 20 62 2d 74 72 65 65 20 64 61 74 61 62 61 73 65   b-tree database
218f0 2c 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  , the connection
21900 20 69 73 20 68 6f 6c 64 69 6e 67 20 74 68 65 20   is holding the 
21910 72 65 71 75 69 72 65 64 20 74 61 62 6c 65 20 6c  required table l
21920 6f 63 6b 73 2c 20 0a 20 20 2a 2a 20 61 6e 64 20  ocks, .  ** and 
21930 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 63 6f  that no other co
21940 6e 6e 65 63 74 69 6f 6e 20 68 61 73 20 61 6e 79  nnection has any
21950 20 6f 70 65 6e 20 63 75 72 73 6f 72 20 74 68 61   open cursor tha
21960 74 20 63 6f 6e 66 6c 69 63 74 73 20 77 69 74 68  t conflicts with
21970 20 0a 20 20 2a 2a 20 74 68 69 73 20 6c 6f 63 6b   .  ** this lock
21980 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
21990 68 61 73 53 68 61 72 65 64 43 61 63 68 65 54 61  hasSharedCacheTa
219a0 62 6c 65 4c 6f 63 6b 28 70 2c 20 69 54 61 62 6c  bleLock(p, iTabl
219b0 65 2c 20 70 4b 65 79 49 6e 66 6f 21 3d 30 2c 20  e, pKeyInfo!=0, 
219c0 77 72 46 6c 61 67 2b 31 29 20 29 3b 0a 20 20 61  wrFlag+1) );.  a
219d0 73 73 65 72 74 28 20 77 72 46 6c 61 67 3d 3d 30  ssert( wrFlag==0
219e0 20 7c 7c 20 21 68 61 73 52 65 61 64 43 6f 6e 66   || !hasReadConf
219f0 6c 69 63 74 73 28 70 2c 20 69 54 61 62 6c 65 29  licts(p, iTable)
21a00 20 29 3b 0a 0a 20 20 2f 2a 20 41 73 73 65 72 74   );..  /* Assert
21a10 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72   that the caller
21a20 20 68 61 73 20 6f 70 65 6e 65 64 20 74 68 65 20   has opened the 
21a30 72 65 71 75 69 72 65 64 20 74 72 61 6e 73 61 63  required transac
21a40 74 69 6f 6e 2e 20 2a 2f 0a 20 20 61 73 73 65 72  tion. */.  asser
21a50 74 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 54 52  t( p->inTrans>TR
21a60 41 4e 53 5f 4e 4f 4e 45 20 29 3b 0a 20 20 61 73  ANS_NONE );.  as
21a70 73 65 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20  sert( wrFlag==0 
21a80 7c 7c 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  || p->inTrans==T
21a90 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20  RANS_WRITE );.  
21aa0 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70 50 61  assert( pBt->pPa
21ab0 67 65 31 20 26 26 20 70 42 74 2d 3e 70 50 61 67  ge1 && pBt->pPag
21ac0 65 31 2d 3e 61 44 61 74 61 20 29 3b 0a 0a 20 20  e1->aData );..  
21ad0 69 66 28 20 4e 45 56 45 52 28 77 72 46 6c 61 67  if( NEVER(wrFlag
21ae0 20 26 26 20 28 70 42 74 2d 3e 62 74 73 46 6c 61   && (pBt->btsFla
21af0 67 73 20 26 20 42 54 53 5f 52 45 41 44 5f 4f 4e  gs & BTS_READ_ON
21b00 4c 59 29 21 3d 30 29 20 29 7b 0a 20 20 20 20 72  LY)!=0) ){.    r
21b10 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41  eturn SQLITE_REA
21b20 44 4f 4e 4c 59 3b 0a 20 20 7d 0a 20 20 69 66 28  DONLY;.  }.  if(
21b30 20 77 72 46 6c 61 67 20 29 7b 0a 20 20 20 20 61   wrFlag ){.    a
21b40 6c 6c 6f 63 61 74 65 54 65 6d 70 53 70 61 63 65  llocateTempSpace
21b50 28 70 42 74 29 3b 0a 20 20 20 20 69 66 28 20 70  (pBt);.    if( p
21b60 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 3d 3d 30  Bt->pTmpSpace==0
21b70 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
21b80 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 69 66  _NOMEM;.  }.  if
21b90 28 20 69 54 61 62 6c 65 3d 3d 31 20 26 26 20 62  ( iTable==1 && b
21ba0 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42  treePagecount(pB
21bb0 74 29 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73  t)==0 ){.    ass
21bc0 65 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 29  ert( wrFlag==0 )
21bd0 3b 0a 20 20 20 20 69 54 61 62 6c 65 20 3d 20 30  ;.    iTable = 0
21be0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20  ;.  }..  /* Now 
21bf0 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 65 72  that no other er
21c00 72 6f 72 73 20 63 61 6e 20 6f 63 63 75 72 2c 20  rors can occur, 
21c10 66 69 6e 69 73 68 20 66 69 6c 6c 69 6e 67 20 69  finish filling i
21c20 6e 20 74 68 65 20 42 74 43 75 72 73 6f 72 0a 20  n the BtCursor. 
21c30 20 2a 2a 20 76 61 72 69 61 62 6c 65 73 20 61 6e   ** variables an
21c40 64 20 6c 69 6e 6b 20 74 68 65 20 63 75 72 73 6f  d link the curso
21c50 72 20 69 6e 74 6f 20 74 68 65 20 42 74 53 68 61  r into the BtSha
21c60 72 65 64 20 6c 69 73 74 2e 20 20 2a 2f 0a 20 20  red list.  */.  
21c70 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20 3d  pCur->pgnoRoot =
21c80 20 28 50 67 6e 6f 29 69 54 61 62 6c 65 3b 0a 20   (Pgno)iTable;. 
21c90 20 70 43 75 72 2d 3e 69 50 61 67 65 20 3d 20 2d   pCur->iPage = -
21ca0 31 3b 0a 20 20 70 43 75 72 2d 3e 70 4b 65 79 49  1;.  pCur->pKeyI
21cb0 6e 66 6f 20 3d 20 70 4b 65 79 49 6e 66 6f 3b 0a  nfo = pKeyInfo;.
21cc0 20 20 70 43 75 72 2d 3e 70 42 74 72 65 65 20 3d    pCur->pBtree =
21cd0 20 70 3b 0a 20 20 70 43 75 72 2d 3e 70 42 74 20   p;.  pCur->pBt 
21ce0 3d 20 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28  = pBt;.  assert(
21cf0 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20 77 72   wrFlag==0 || wr
21d00 46 6c 61 67 3d 3d 42 54 43 46 5f 57 72 69 74 65  Flag==BTCF_Write
21d10 46 6c 61 67 20 29 3b 0a 20 20 70 43 75 72 2d 3e  Flag );.  pCur->
21d20 63 75 72 46 6c 61 67 73 20 3d 20 77 72 46 6c 61  curFlags = wrFla
21d30 67 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72 50 61  g;.  pCur->curPa
21d40 67 65 72 46 6c 61 67 73 20 3d 20 77 72 46 6c 61  gerFlags = wrFla
21d50 67 20 3f 20 30 20 3a 20 50 41 47 45 52 5f 47 45  g ? 0 : PAGER_GE
21d60 54 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 70 43  T_READONLY;.  pC
21d70 75 72 2d 3e 70 4e 65 78 74 20 3d 20 70 42 74 2d  ur->pNext = pBt-
21d80 3e 70 43 75 72 73 6f 72 3b 0a 20 20 69 66 28 20  >pCursor;.  if( 
21d90 70 43 75 72 2d 3e 70 4e 65 78 74 20 29 7b 0a 20  pCur->pNext ){. 
21da0 20 20 20 70 43 75 72 2d 3e 70 4e 65 78 74 2d 3e     pCur->pNext->
21db0 70 50 72 65 76 20 3d 20 70 43 75 72 3b 0a 20 20  pPrev = pCur;.  
21dc0 7d 0a 20 20 70 42 74 2d 3e 70 43 75 72 73 6f 72  }.  pBt->pCursor
21dd0 20 3d 20 70 43 75 72 3b 0a 20 20 70 43 75 72 2d   = pCur;.  pCur-
21de0 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
21df0 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 72 65 74 75  _INVALID;.  retu
21e00 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
21e10 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
21e20 43 75 72 73 6f 72 28 0a 20 20 42 74 72 65 65 20  Cursor(.  Btree 
21e30 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
21e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21e50 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72        /* The btr
21e60 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62  ee */.  int iTab
21e70 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  le,             
21e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21e90 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65      /* Root page
21ea0 20 6f 66 20 74 61 62 6c 65 20 74 6f 20 6f 70 65   of table to ope
21eb0 6e 20 2a 2f 0a 20 20 69 6e 74 20 77 72 46 6c 61  n */.  int wrFla
21ec0 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g,              
21ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21ee0 20 20 20 2f 2a 20 31 20 74 6f 20 77 72 69 74 65     /* 1 to write
21ef0 2e 20 30 20 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f  . 0 read-only */
21f00 0a 20 20 73 74 72 75 63 74 20 4b 65 79 49 6e 66  .  struct KeyInf
21f10 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20  o *pKeyInfo,    
21f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
21f30 2a 20 46 69 72 73 74 20 61 72 67 20 74 6f 20 78  * First arg to x
21f40 43 6f 6d 70 61 72 65 28 29 20 2a 2f 0a 20 20 42  Compare() */.  B
21f50 74 43 75 72 73 6f 72 20 2a 70 43 75 72 20 20 20  tCursor *pCur   
21f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21f70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
21f80 69 74 65 20 6e 65 77 20 63 75 72 73 6f 72 20 68  ite new cursor h
21f90 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ere */.){.  int 
21fa0 72 63 3b 0a 20 20 69 66 28 20 69 54 61 62 6c 65  rc;.  if( iTable
21fb0 3c 31 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  <1 ){.    rc = S
21fc0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
21fd0 50 54 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  PT;.  }else{.   
21fe0 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
21ff0 65 72 28 70 29 3b 0a 20 20 20 20 72 63 20 3d 20  er(p);.    rc = 
22000 62 74 72 65 65 43 75 72 73 6f 72 28 70 2c 20 69  btreeCursor(p, i
22010 54 61 62 6c 65 2c 20 77 72 46 6c 61 67 2c 20 70  Table, wrFlag, p
22020 4b 65 79 49 6e 66 6f 2c 20 70 43 75 72 29 3b 0a  KeyInfo, pCur);.
22030 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
22040 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a 20 20  Leave(p);.  }.  
22050 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
22060 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73  .** Return the s
22070 69 7a 65 20 6f 66 20 61 20 42 74 43 75 72 73 6f  ize of a BtCurso
22080 72 20 6f 62 6a 65 63 74 20 69 6e 20 62 79 74 65  r object in byte
22090 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 6e  s..**.** This in
220a0 74 65 72 66 61 63 65 73 20 69 73 20 6e 65 65 64  terfaces is need
220b0 65 64 20 73 6f 20 74 68 61 74 20 75 73 65 72 73  ed so that users
220c0 20 6f 66 20 63 75 72 73 6f 72 73 20 63 61 6e 20   of cursors can 
220d0 70 72 65 61 6c 6c 6f 63 61 74 65 0a 2a 2a 20 73  preallocate.** s
220e0 75 66 66 69 63 69 65 6e 74 20 73 74 6f 72 61 67  ufficient storag
220f0 65 20 74 6f 20 68 6f 6c 64 20 61 20 63 75 72 73  e to hold a curs
22100 6f 72 2e 20 20 54 68 65 20 42 74 43 75 72 73 6f  or.  The BtCurso
22110 72 20 6f 62 6a 65 63 74 20 69 73 20 6f 70 61 71  r object is opaq
22120 75 65 0a 2a 2a 20 74 6f 20 75 73 65 72 73 20 73  ue.** to users s
22130 6f 20 74 68 65 79 20 63 61 6e 6e 6f 74 20 64 6f  o they cannot do
22140 20 74 68 65 20 73 69 7a 65 6f 66 28 29 20 74 68   the sizeof() th
22150 65 6d 73 65 6c 76 65 73 20 2d 20 74 68 65 79 20  emselves - they 
22160 6d 75 73 74 20 63 61 6c 6c 0a 2a 2a 20 74 68 69  must call.** thi
22170 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 69 6e  s routine..*/.in
22180 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  t sqlite3BtreeCu
22190 72 73 6f 72 53 69 7a 65 28 76 6f 69 64 29 7b 0a  rsorSize(void){.
221a0 20 20 72 65 74 75 72 6e 20 52 4f 55 4e 44 38 28    return ROUND8(
221b0 73 69 7a 65 6f 66 28 42 74 43 75 72 73 6f 72 29  sizeof(BtCursor)
221c0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74  );.}../*.** Init
221d0 69 61 6c 69 7a 65 20 6d 65 6d 6f 72 79 20 74 68  ialize memory th
221e0 61 74 20 77 69 6c 6c 20 62 65 20 63 6f 6e 76 65  at will be conve
221f0 72 74 65 64 20 69 6e 74 6f 20 61 20 42 74 43 75  rted into a BtCu
22200 72 73 6f 72 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a  rsor object..**.
22210 2a 2a 20 54 68 65 20 73 69 6d 70 6c 65 20 61 70  ** The simple ap
22220 70 72 6f 61 63 68 20 68 65 72 65 20 77 6f 75 6c  proach here woul
22230 64 20 62 65 20 74 6f 20 6d 65 6d 73 65 74 28 29  d be to memset()
22240 20 74 68 65 20 65 6e 74 69 72 65 20 6f 62 6a 65   the entire obje
22250 63 74 0a 2a 2a 20 74 6f 20 7a 65 72 6f 2e 20 20  ct.** to zero.  
22260 42 75 74 20 69 74 20 74 75 72 6e 73 20 6f 75 74  But it turns out
22270 20 74 68 61 74 20 74 68 65 20 61 70 50 61 67 65   that the apPage
22280 5b 5d 20 61 6e 64 20 61 69 49 64 78 5b 5d 20 61  [] and aiIdx[] a
22290 72 72 61 79 73 0a 2a 2a 20 64 6f 20 6e 6f 74 20  rrays.** do not 
222a0 6e 65 65 64 20 74 6f 20 62 65 20 7a 65 72 6f 65  need to be zeroe
222b0 64 20 61 6e 64 20 74 68 65 79 20 61 72 65 20 6c  d and they are l
222c0 61 72 67 65 2c 20 73 6f 20 77 65 20 63 61 6e 20  arge, so we can 
222d0 73 61 76 65 20 61 20 6c 6f 74 0a 2a 2a 20 6f 66  save a lot.** of
222e0 20 72 75 6e 2d 74 69 6d 65 20 62 79 20 73 6b 69   run-time by ski
222f0 70 70 69 6e 67 20 74 68 65 20 69 6e 69 74 69 61  pping the initia
22300 6c 69 7a 61 74 69 6f 6e 20 6f 66 20 74 68 6f 73  lization of thos
22310 65 20 65 6c 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 76  e elements..*/.v
22320 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72 65 65  oid sqlite3Btree
22330 43 75 72 73 6f 72 5a 65 72 6f 28 42 74 43 75 72  CursorZero(BtCur
22340 73 6f 72 20 2a 70 29 7b 0a 20 20 6d 65 6d 73 65  sor *p){.  memse
22350 74 28 70 2c 20 30 2c 20 6f 66 66 73 65 74 6f 66  t(p, 0, offsetof
22360 28 42 74 43 75 72 73 6f 72 2c 20 69 50 61 67 65  (BtCursor, iPage
22370 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f  ));.}../*.** Clo
22380 73 65 20 61 20 63 75 72 73 6f 72 2e 20 20 54 68  se a cursor.  Th
22390 65 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74  e read lock on t
223a0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
223b0 20 69 73 20 72 65 6c 65 61 73 65 64 0a 2a 2a 20   is released.** 
223c0 77 68 65 6e 20 74 68 65 20 6c 61 73 74 20 63 75  when the last cu
223d0 72 73 6f 72 20 69 73 20 63 6c 6f 73 65 64 2e 0a  rsor is closed..
223e0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
223f0 72 65 65 43 6c 6f 73 65 43 75 72 73 6f 72 28 42  reeCloseCursor(B
22400 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
22410 20 20 42 74 72 65 65 20 2a 70 42 74 72 65 65 20    Btree *pBtree 
22420 3d 20 70 43 75 72 2d 3e 70 42 74 72 65 65 3b 0a  = pCur->pBtree;.
22430 20 20 69 66 28 20 70 42 74 72 65 65 20 29 7b 0a    if( pBtree ){.
22440 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 42      int i;.    B
22450 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
22460 43 75 72 2d 3e 70 42 74 3b 0a 20 20 20 20 73 71  Cur->pBt;.    sq
22470 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
22480 70 42 74 72 65 65 29 3b 0a 20 20 20 20 73 71 6c  pBtree);.    sql
22490 69 74 65 33 42 74 72 65 65 43 6c 65 61 72 43 75  ite3BtreeClearCu
224a0 72 73 6f 72 28 70 43 75 72 29 3b 0a 20 20 20 20  rsor(pCur);.    
224b0 69 66 28 20 70 43 75 72 2d 3e 70 50 72 65 76 20  if( pCur->pPrev 
224c0 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 70  ){.      pCur->p
224d0 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 43  Prev->pNext = pC
224e0 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d  ur->pNext;.    }
224f0 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 42 74 2d  else{.      pBt-
22500 3e 70 43 75 72 73 6f 72 20 3d 20 70 43 75 72 2d  >pCursor = pCur-
22510 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20  >pNext;.    }.  
22520 20 20 69 66 28 20 70 43 75 72 2d 3e 70 4e 65 78    if( pCur->pNex
22530 74 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d  t ){.      pCur-
22540 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20  >pNext->pPrev = 
22550 70 43 75 72 2d 3e 70 50 72 65 76 3b 0a 20 20 20  pCur->pPrev;.   
22560 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20   }.    for(i=0; 
22570 69 3c 3d 70 43 75 72 2d 3e 69 50 61 67 65 3b 20  i<=pCur->iPage; 
22580 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 65 6c 65  i++){.      rele
22590 61 73 65 50 61 67 65 28 70 43 75 72 2d 3e 61 70  asePage(pCur->ap
225a0 50 61 67 65 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a  Page[i]);.    }.
225b0 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49      unlockBtreeI
225c0 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20  fUnused(pBt);.  
225d0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
225e0 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 29 3b  Cur->aOverflow);
225f0 0a 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f  .    /* sqlite3_
22600 66 72 65 65 28 70 43 75 72 29 3b 20 2a 2f 0a 20  free(pCur); */. 
22610 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c     sqlite3BtreeL
22620 65 61 76 65 28 70 42 74 72 65 65 29 3b 0a 20 20  eave(pBtree);.  
22630 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
22640 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  E_OK;.}../*.** M
22650 61 6b 65 20 73 75 72 65 20 74 68 65 20 42 74 43  ake sure the BtC
22660 75 72 73 6f 72 2a 20 67 69 76 65 6e 20 69 6e 20  ursor* given in 
22670 74 68 65 20 61 72 67 75 6d 65 6e 74 20 68 61 73  the argument has
22680 20 61 20 76 61 6c 69 64 0a 2a 2a 20 42 74 43 75   a valid.** BtCu
22690 72 73 6f 72 2e 69 6e 66 6f 20 73 74 72 75 63 74  rsor.info struct
226a0 75 72 65 2e 20 20 49 66 20 69 74 20 69 73 20 6e  ure.  If it is n
226b0 6f 74 20 61 6c 72 65 61 64 79 20 76 61 6c 69 64  ot already valid
226c0 2c 20 63 61 6c 6c 0a 2a 2a 20 62 74 72 65 65 50  , call.** btreeP
226d0 61 72 73 65 43 65 6c 6c 28 29 20 74 6f 20 66 69  arseCell() to fi
226e0 6c 6c 20 69 74 20 69 6e 2e 0a 2a 2a 0a 2a 2a 20  ll it in..**.** 
226f0 42 74 43 75 72 73 6f 72 2e 69 6e 66 6f 20 69 73  BtCursor.info is
22700 20 61 20 63 61 63 68 65 20 6f 66 20 74 68 65 20   a cache of the 
22710 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 74  information in t
22720 68 65 20 63 75 72 72 65 6e 74 20 63 65 6c 6c 2e  he current cell.
22730 0a 2a 2a 20 55 73 69 6e 67 20 74 68 69 73 20 63  .** Using this c
22740 61 63 68 65 20 72 65 64 75 63 65 73 20 74 68 65  ache reduces the
22750 20 6e 75 6d 62 65 72 20 6f 66 20 63 61 6c 6c 73   number of calls
22760 20 74 6f 20 62 74 72 65 65 50 61 72 73 65 43 65   to btreeParseCe
22770 6c 6c 28 29 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  ll()..*/.#ifndef
22780 20 4e 44 45 42 55 47 0a 20 20 73 74 61 74 69 63   NDEBUG.  static
22790 20 76 6f 69 64 20 61 73 73 65 72 74 43 65 6c 6c   void assertCell
227a0 49 6e 66 6f 28 42 74 43 75 72 73 6f 72 20 2a 70  Info(BtCursor *p
227b0 43 75 72 29 7b 0a 20 20 20 20 43 65 6c 6c 49 6e  Cur){.    CellIn
227c0 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 69 6e 74  fo info;.    int
227d0 20 69 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 69   iPage = pCur->i
227e0 50 61 67 65 3b 0a 20 20 20 20 6d 65 6d 73 65 74  Page;.    memset
227f0 28 26 69 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f  (&info, 0, sizeo
22800 66 28 69 6e 66 6f 29 29 3b 0a 20 20 20 20 62 74  f(info));.    bt
22810 72 65 65 50 61 72 73 65 43 65 6c 6c 28 70 43 75  reeParseCell(pCu
22820 72 2d 3e 61 70 50 61 67 65 5b 69 50 61 67 65 5d  r->apPage[iPage]
22830 2c 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 69 50  , pCur->aiIdx[iP
22840 61 67 65 5d 2c 20 26 69 6e 66 6f 29 3b 0a 20 20  age], &info);.  
22850 20 20 61 73 73 65 72 74 28 20 43 4f 52 52 55 50    assert( CORRUP
22860 54 5f 44 42 20 7c 7c 20 6d 65 6d 63 6d 70 28 26  T_DB || memcmp(&
22870 69 6e 66 6f 2c 20 26 70 43 75 72 2d 3e 69 6e 66  info, &pCur->inf
22880 6f 2c 20 73 69 7a 65 6f 66 28 69 6e 66 6f 29 29  o, sizeof(info))
22890 3d 3d 30 20 29 3b 0a 20 20 7d 0a 23 65 6c 73 65  ==0 );.  }.#else
228a0 0a 20 20 23 64 65 66 69 6e 65 20 61 73 73 65 72  .  #define asser
228b0 74 43 65 6c 6c 49 6e 66 6f 28 78 29 0a 23 65 6e  tCellInfo(x).#en
228c0 64 69 66 0a 73 74 61 74 69 63 20 53 51 4c 49 54  dif.static SQLIT
228d0 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76 6f 69 64 20  E_NOINLINE void 
228e0 67 65 74 43 65 6c 6c 49 6e 66 6f 28 42 74 43 75  getCellInfo(BtCu
228f0 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69  rsor *pCur){.  i
22900 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53  f( pCur->info.nS
22910 69 7a 65 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e  ize==0 ){.    in
22920 74 20 69 50 61 67 65 20 3d 20 70 43 75 72 2d 3e  t iPage = pCur->
22930 69 50 61 67 65 3b 0a 20 20 20 20 70 43 75 72 2d  iPage;.    pCur-
22940 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20 42 54 43  >curFlags |= BTC
22950 46 5f 56 61 6c 69 64 4e 4b 65 79 3b 0a 20 20 20  F_ValidNKey;.   
22960 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28   btreeParseCell(
22970 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 50 61  pCur->apPage[iPa
22980 67 65 5d 2c 70 43 75 72 2d 3e 61 69 49 64 78 5b  ge],pCur->aiIdx[
22990 69 50 61 67 65 5d 2c 26 70 43 75 72 2d 3e 69 6e  iPage],&pCur->in
229a0 66 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  fo);.  }else{.  
229b0 20 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f    assertCellInfo
229c0 28 70 43 75 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 23  (pCur);.  }.}..#
229d0 69 66 6e 64 65 66 20 4e 44 45 42 55 47 20 20 2f  ifndef NDEBUG  /
229e0 2a 20 54 68 65 20 6e 65 78 74 20 72 6f 75 74 69  * The next routi
229f0 6e 65 20 75 73 65 64 20 6f 6e 6c 79 20 77 69 74  ne used only wit
22a00 68 69 6e 20 61 73 73 65 72 74 28 29 20 73 74 61  hin assert() sta
22a10 74 65 6d 65 6e 74 73 20 2a 2f 0a 2f 2a 0a 2a 2a  tements */./*.**
22a20 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
22a30 74 68 65 20 67 69 76 65 6e 20 42 74 43 75 72 73  the given BtCurs
22a40 6f 72 20 69 73 20 76 61 6c 69 64 2e 20 20 41 20  or is valid.  A 
22a50 76 61 6c 69 64 20 63 75 72 73 6f 72 20 69 73 20  valid cursor is 
22a60 6f 6e 65 0a 2a 2a 20 74 68 61 74 20 69 73 20 63  one.** that is c
22a70 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e  urrently pointin
22a80 67 20 74 6f 20 61 20 72 6f 77 20 69 6e 20 61 20  g to a row in a 
22a90 28 6e 6f 6e 2d 65 6d 70 74 79 29 20 74 61 62 6c  (non-empty) tabl
22aa0 65 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20  e..** This is a 
22ab0 76 65 72 69 66 69 63 61 74 69 6f 6e 20 72 6f 75  verification rou
22ac0 74 69 6e 65 20 69 73 20 75 73 65 64 20 6f 6e 6c  tine is used onl
22ad0 79 20 77 69 74 68 69 6e 20 61 73 73 65 72 74 28  y within assert(
22ae0 29 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f  ) statements..*/
22af0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
22b00 65 43 75 72 73 6f 72 49 73 56 61 6c 69 64 28 42  eCursorIsValid(B
22b10 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
22b20 20 20 72 65 74 75 72 6e 20 70 43 75 72 20 26 26    return pCur &&
22b30 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
22b40 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 7d 0a 23  URSOR_VALID;.}.#
22b50 65 6e 64 69 66 20 2f 2a 20 4e 44 45 42 55 47 20  endif /* NDEBUG 
22b60 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 2a 70  */../*.** Set *p
22b70 53 69 7a 65 20 74 6f 20 74 68 65 20 73 69 7a 65  Size to the size
22b80 20 6f 66 20 74 68 65 20 62 75 66 66 65 72 20 6e   of the buffer n
22b90 65 65 64 65 64 20 74 6f 20 68 6f 6c 64 20 74 68  eeded to hold th
22ba0 65 20 76 61 6c 75 65 20 6f 66 0a 2a 2a 20 74 68  e value of.** th
22bb0 65 20 6b 65 79 20 66 6f 72 20 74 68 65 20 63 75  e key for the cu
22bc0 72 72 65 6e 74 20 65 6e 74 72 79 2e 20 20 49 66  rrent entry.  If
22bd0 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6e   the cursor is n
22be0 6f 74 20 70 6f 69 6e 74 69 6e 67 0a 2a 2a 20 74  ot pointing.** t
22bf0 6f 20 61 20 76 61 6c 69 64 20 65 6e 74 72 79 2c  o a valid entry,
22c00 20 2a 70 53 69 7a 65 20 69 73 20 73 65 74 20 74   *pSize is set t
22c10 6f 20 30 2e 20 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  o 0. .**.** For 
22c20 61 20 74 61 62 6c 65 20 77 69 74 68 20 74 68 65  a table with the
22c30 20 49 4e 54 4b 45 59 20 66 6c 61 67 20 73 65 74   INTKEY flag set
22c40 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  , this routine r
22c50 65 74 75 72 6e 73 20 74 68 65 20 6b 65 79 0a 2a  eturns the key.*
22c60 2a 20 69 74 73 65 6c 66 2c 20 6e 6f 74 20 74 68  * itself, not th
22c70 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
22c80 73 20 69 6e 20 74 68 65 20 6b 65 79 2e 0a 2a 2a  s in the key..**
22c90 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 6d  .** The caller m
22ca0 75 73 74 20 70 6f 73 69 74 69 6f 6e 20 74 68 65  ust position the
22cb0 20 63 75 72 73 6f 72 20 70 72 69 6f 72 20 74 6f   cursor prior to
22cc0 20 69 6e 76 6f 6b 69 6e 67 20 74 68 69 73 20 72   invoking this r
22cd0 6f 75 74 69 6e 65 2e 0a 2a 2a 20 0a 2a 2a 20 54  outine..** .** T
22ce0 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 6e  his routine cann
22cf0 6f 74 20 66 61 69 6c 2e 20 20 49 74 20 61 6c 77  ot fail.  It alw
22d00 61 79 73 20 72 65 74 75 72 6e 73 20 53 51 4c 49  ays returns SQLI
22d10 54 45 5f 4f 4b 2e 20 20 0a 2a 2f 0a 69 6e 74 20  TE_OK.  .*/.int 
22d20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 53  sqlite3BtreeKeyS
22d30 69 7a 65 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ize(BtCursor *pC
22d40 75 72 2c 20 69 36 34 20 2a 70 53 69 7a 65 29 7b  ur, i64 *pSize){
22d50 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
22d60 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
22d70 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
22d80 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
22d90 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 67  SOR_VALID );.  g
22da0 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29  etCellInfo(pCur)
22db0 3b 0a 20 20 2a 70 53 69 7a 65 20 3d 20 70 43 75  ;.  *pSize = pCu
22dc0 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20  r->info.nKey;.  
22dd0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
22de0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 2a  ;.}../*.** Set *
22df0 70 53 69 7a 65 20 74 6f 20 74 68 65 20 6e 75 6d  pSize to the num
22e00 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20  ber of bytes of 
22e10 64 61 74 61 20 69 6e 20 74 68 65 20 65 6e 74 72  data in the entr
22e20 79 20 74 68 65 0a 2a 2a 20 63 75 72 73 6f 72 20  y the.** cursor 
22e30 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73  currently points
22e40 20 74 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63   to..**.** The c
22e50 61 6c 6c 65 72 20 6d 75 73 74 20 67 75 61 72 61  aller must guara
22e60 6e 74 65 65 20 74 68 61 74 20 74 68 65 20 63 75  ntee that the cu
22e70 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e 67  rsor is pointing
22e80 20 74 6f 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 0a 2a   to a non-NULL.*
22e90 2a 20 76 61 6c 69 64 20 65 6e 74 72 79 2e 20 20  * valid entry.  
22ea0 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
22eb0 74 68 65 20 63 61 6c 6c 69 6e 67 20 70 72 6f 63  the calling proc
22ec0 65 64 75 72 65 20 6d 75 73 74 20 67 75 61 72 61  edure must guara
22ed0 6e 74 65 65 0a 2a 2a 20 74 68 61 74 20 74 68 65  ntee.** that the
22ee0 20 63 75 72 73 6f 72 20 68 61 73 20 43 75 72 73   cursor has Curs
22ef0 6f 72 2e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  or.eState==CURSO
22f00 52 5f 56 41 4c 49 44 2e 0a 2a 2a 0a 2a 2a 20 46  R_VALID..**.** F
22f10 61 69 6c 75 72 65 20 69 73 20 6e 6f 74 20 70 6f  ailure is not po
22f20 73 73 69 62 6c 65 2e 20 20 54 68 69 73 20 66 75  ssible.  This fu
22f30 6e 63 74 69 6f 6e 20 61 6c 77 61 79 73 20 72 65  nction always re
22f40 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e  turns SQLITE_OK.
22f50 0a 2a 2a 20 49 74 20 6d 69 67 68 74 20 6a 75 73  .** It might jus
22f60 74 20 61 73 20 77 65 6c 6c 20 62 65 20 61 20 70  t as well be a p
22f70 72 6f 63 65 64 75 72 65 20 28 72 65 74 75 72 6e  rocedure (return
22f80 69 6e 67 20 76 6f 69 64 29 20 62 75 74 20 77 65  ing void) but we
22f90 20 63 6f 6e 74 69 6e 75 65 0a 2a 2a 20 74 6f 20   continue.** to 
22fa0 72 65 74 75 72 6e 20 61 6e 20 69 6e 74 65 67 65  return an intege
22fb0 72 20 72 65 73 75 6c 74 20 63 6f 64 65 20 66 6f  r result code fo
22fc0 72 20 68 69 73 74 6f 72 69 63 61 6c 20 72 65 61  r historical rea
22fd0 73 6f 6e 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  sons..*/.int sql
22fe0 69 74 65 33 42 74 72 65 65 44 61 74 61 53 69 7a  ite3BtreeDataSiz
22ff0 65 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  e(BtCursor *pCur
23000 2c 20 75 33 32 20 2a 70 53 69 7a 65 29 7b 0a 20  , u32 *pSize){. 
23010 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
23020 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
23030 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
23040 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
23050 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73  R_VALID );.  ass
23060 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65  ert( pCur->iPage
23070 3e 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  >=0 );.  assert(
23080 20 70 43 75 72 2d 3e 69 50 61 67 65 3c 42 54 43   pCur->iPage<BTC
23090 55 52 53 4f 52 5f 4d 41 58 5f 44 45 50 54 48 20  URSOR_MAX_DEPTH 
230a0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
230b0 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
230c0 69 50 61 67 65 5d 2d 3e 69 6e 74 4b 65 79 4c 65  iPage]->intKeyLe
230d0 61 66 3d 3d 31 20 29 3b 0a 20 20 67 65 74 43 65  af==1 );.  getCe
230e0 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20  llInfo(pCur);.  
230f0 2a 70 53 69 7a 65 20 3d 20 70 43 75 72 2d 3e 69  *pSize = pCur->i
23100 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 3b 0a 20 20  nfo.nPayload;.  
23110 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
23120 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e  ;.}../*.** Given
23130 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
23140 20 6f 66 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20   of an overflow 
23150 70 61 67 65 20 69 6e 20 74 68 65 20 64 61 74 61  page in the data
23160 62 61 73 65 20 28 70 61 72 61 6d 65 74 65 72 0a  base (parameter.
23170 2a 2a 20 6f 76 66 6c 29 2c 20 74 68 69 73 20 66  ** ovfl), this f
23180 75 6e 63 74 69 6f 6e 20 66 69 6e 64 73 20 74 68  unction finds th
23190 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  e page number of
231a0 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 69   the next page i
231b0 6e 20 74 68 65 20 0a 2a 2a 20 6c 69 6e 6b 65 64  n the .** linked
231c0 20 6c 69 73 74 20 6f 66 20 6f 76 65 72 66 6c 6f   list of overflo
231d0 77 20 70 61 67 65 73 2e 20 49 66 20 70 6f 73 73  w pages. If poss
231e0 69 62 6c 65 2c 20 69 74 20 75 73 65 73 20 74 68  ible, it uses th
231f0 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 0a 2a 2a  e auto-vacuum.**
23200 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 64 61 74   pointer-map dat
23210 61 20 69 6e 73 74 65 61 64 20 6f 66 20 72 65 61  a instead of rea
23220 64 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74  ding the content
23230 20 6f 66 20 70 61 67 65 20 6f 76 66 6c 20 74 6f   of page ovfl to
23240 20 64 6f 20 73 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49   do so. .**.** I
23250 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
23260 73 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  s an SQLite erro
23270 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
23280 65 64 2e 20 4f 74 68 65 72 77 69 73 65 3a 0a 2a  ed. Otherwise:.*
23290 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 6e 75  *.** The page nu
232a0 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65 78 74  mber of the next
232b0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69   overflow page i
232c0 6e 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73  n the linked lis
232d0 74 20 69 73 20 0a 2a 2a 20 77 72 69 74 74 65 6e  t is .** written
232e0 20 74 6f 20 2a 70 50 67 6e 6f 4e 65 78 74 2e 20   to *pPgnoNext. 
232f0 49 66 20 70 61 67 65 20 6f 76 66 6c 20 69 73 20  If page ovfl is 
23300 74 68 65 20 6c 61 73 74 20 70 61 67 65 20 69 6e  the last page in
23310 20 69 74 73 20 6c 69 6e 6b 65 64 20 0a 2a 2a 20   its linked .** 
23320 6c 69 73 74 2c 20 2a 70 50 67 6e 6f 4e 65 78 74  list, *pPgnoNext
23330 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e   is set to zero.
23340 20 0a 2a 2a 0a 2a 2a 20 49 66 20 70 70 50 61 67   .**.** If ppPag
23350 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 61  e is not NULL, a
23360 6e 64 20 61 20 72 65 66 65 72 65 6e 63 65 20 74  nd a reference t
23370 6f 20 74 68 65 20 4d 65 6d 50 61 67 65 20 6f 62  o the MemPage ob
23380 6a 65 63 74 20 63 6f 72 72 65 73 70 6f 6e 64 69  ject correspondi
23390 6e 67 0a 2a 2a 20 74 6f 20 70 61 67 65 20 6e 75  ng.** to page nu
233a0 6d 62 65 72 20 70 4f 76 66 6c 20 77 61 73 20 6f  mber pOvfl was o
233b0 62 74 61 69 6e 65 64 2c 20 74 68 65 6e 20 2a 70  btained, then *p
233c0 70 50 61 67 65 20 69 73 20 73 65 74 20 74 6f 20  pPage is set to 
233d0 70 6f 69 6e 74 20 74 6f 20 74 68 61 74 0a 2a 2a  point to that.**
233e0 20 72 65 66 65 72 65 6e 63 65 2e 20 49 74 20 69   reference. It i
233f0 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69  s the responsibi
23400 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c  lity of the call
23410 65 72 20 74 6f 20 63 61 6c 6c 20 72 65 6c 65 61  er to call relea
23420 73 65 50 61 67 65 28 29 0a 2a 2a 20 6f 6e 20 2a  sePage().** on *
23430 70 70 50 61 67 65 20 74 6f 20 66 72 65 65 20 74  ppPage to free t
23440 68 65 20 72 65 66 65 72 65 6e 63 65 2e 20 49 6e  he reference. In
23450 20 6e 6f 20 72 65 66 65 72 65 6e 63 65 20 77 61   no reference wa
23460 73 20 6f 62 74 61 69 6e 65 64 20 28 62 65 63 61  s obtained (beca
23470 75 73 65 0a 2a 2a 20 74 68 65 20 70 6f 69 6e 74  use.** the point
23480 65 72 2d 6d 61 70 20 77 61 73 20 75 73 65 64 20  er-map was used 
23490 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 76 61  to obtain the va
234a0 6c 75 65 20 66 6f 72 20 2a 70 50 67 6e 6f 4e 65  lue for *pPgnoNe
234b0 78 74 29 2c 20 74 68 65 6e 0a 2a 2a 20 2a 70 70  xt), then.** *pp
234c0 50 61 67 65 20 69 73 20 73 65 74 20 74 6f 20 7a  Page is set to z
234d0 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ero..*/.static i
234e0 6e 74 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61  nt getOverflowPa
234f0 67 65 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a  ge(.  BtShared *
23500 70 42 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  pBt,            
23510 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
23520 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e  se file */.  Pgn
23530 6f 20 6f 76 66 6c 2c 20 20 20 20 20 20 20 20 20  o ovfl,         
23540 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
23550 72 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70 61  rent overflow pa
23560 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 4d  ge number */.  M
23570 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c  emPage **ppPage,
23580 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
23590 55 54 3a 20 4d 65 6d 50 61 67 65 20 68 61 6e 64  UT: MemPage hand
235a0 6c 65 20 28 6d 61 79 20 62 65 20 4e 55 4c 4c 29  le (may be NULL)
235b0 20 2a 2f 0a 20 20 50 67 6e 6f 20 2a 70 50 67 6e   */.  Pgno *pPgn
235c0 6f 4e 65 78 74 20 20 20 20 20 20 20 20 20 20 20  oNext           
235d0 20 20 20 2f 2a 20 4f 55 54 3a 20 4e 65 78 74 20     /* OUT: Next 
235e0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 6e 75  overflow page nu
235f0 6d 62 65 72 20 2a 2f 0a 29 7b 0a 20 20 50 67 6e  mber */.){.  Pgn
23600 6f 20 6e 65 78 74 20 3d 20 30 3b 0a 20 20 4d 65  o next = 0;.  Me
23610 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 30  mPage *pPage = 0
23620 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
23630 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72  ITE_OK;..  asser
23640 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
23650 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
23660 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 70 50  ) );.  assert(pP
23670 67 6e 6f 4e 65 78 74 29 3b 0a 0a 23 69 66 6e 64  gnoNext);..#ifnd
23680 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
23690 55 54 4f 56 41 43 55 55 4d 0a 20 20 2f 2a 20 54  UTOVACUUM.  /* T
236a0 72 79 20 74 6f 20 66 69 6e 64 20 74 68 65 20 6e  ry to find the n
236b0 65 78 74 20 70 61 67 65 20 69 6e 20 74 68 65 20  ext page in the 
236c0 6f 76 65 72 66 6c 6f 77 20 6c 69 73 74 20 75 73  overflow list us
236d0 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 61 75 74  ing the.  ** aut
236e0 6f 76 61 63 75 75 6d 20 70 6f 69 6e 74 65 72 2d  ovacuum pointer-
236f0 6d 61 70 20 70 61 67 65 73 2e 20 47 75 65 73 73  map pages. Guess
23700 20 74 68 61 74 20 74 68 65 20 6e 65 78 74 20 70   that the next p
23710 61 67 65 20 69 6e 20 0a 20 20 2a 2a 20 74 68 65  age in .  ** the
23720 20 6f 76 65 72 66 6c 6f 77 20 6c 69 73 74 20 69   overflow list i
23730 73 20 70 61 67 65 20 6e 75 6d 62 65 72 20 28 6f  s page number (o
23740 76 66 6c 2b 31 29 2e 20 49 66 20 74 68 61 74 20  vfl+1). If that 
23750 67 75 65 73 73 20 74 75 72 6e 73 20 0a 20 20 2a  guess turns .  *
23760 2a 20 6f 75 74 20 74 6f 20 62 65 20 77 72 6f 6e  * out to be wron
23770 67 2c 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20  g, fall back to 
23780 6c 6f 61 64 69 6e 67 20 74 68 65 20 64 61 74 61  loading the data
23790 20 6f 66 20 70 61 67 65 20 0a 20 20 2a 2a 20 6e   of page .  ** n
237a0 75 6d 62 65 72 20 6f 76 66 6c 20 74 6f 20 64 65  umber ovfl to de
237b0 74 65 72 6d 69 6e 65 20 74 68 65 20 6e 65 78 74  termine the next
237c0 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a 20 20   page number..  
237d0 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e 61 75  */.  if( pBt->au
237e0 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  toVacuum ){.    
237f0 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 20 20 50  Pgno pgno;.    P
23800 67 6e 6f 20 69 47 75 65 73 73 20 3d 20 6f 76 66  gno iGuess = ovf
23810 6c 2b 31 3b 0a 20 20 20 20 75 38 20 65 54 79 70  l+1;.    u8 eTyp
23820 65 3b 0a 0a 20 20 20 20 77 68 69 6c 65 28 20 50  e;..    while( P
23830 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74  TRMAP_ISPAGE(pBt
23840 2c 20 69 47 75 65 73 73 29 20 7c 7c 20 69 47 75  , iGuess) || iGu
23850 65 73 73 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54  ess==PENDING_BYT
23860 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20  E_PAGE(pBt) ){. 
23870 20 20 20 20 20 69 47 75 65 73 73 2b 2b 3b 0a 20       iGuess++;. 
23880 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 69 47     }..    if( iG
23890 75 65 73 73 3c 3d 62 74 72 65 65 50 61 67 65 63  uess<=btreePagec
238a0 6f 75 6e 74 28 70 42 74 29 20 29 7b 0a 20 20 20  ount(pBt) ){.   
238b0 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65     rc = ptrmapGe
238c0 74 28 70 42 74 2c 20 69 47 75 65 73 73 2c 20 26  t(pBt, iGuess, &
238d0 65 54 79 70 65 2c 20 26 70 67 6e 6f 29 3b 0a 20  eType, &pgno);. 
238e0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
238f0 49 54 45 5f 4f 4b 20 26 26 20 65 54 79 70 65 3d  ITE_OK && eType=
23900 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57  =PTRMAP_OVERFLOW
23910 32 20 26 26 20 70 67 6e 6f 3d 3d 6f 76 66 6c 20  2 && pgno==ovfl 
23920 29 7b 0a 20 20 20 20 20 20 20 20 6e 65 78 74 20  ){.        next 
23930 3d 20 69 47 75 65 73 73 3b 0a 20 20 20 20 20 20  = iGuess;.      
23940 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f    rc = SQLITE_DO
23950 4e 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  NE;.      }.    
23960 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  }.  }.#endif..  
23970 61 73 73 65 72 74 28 20 6e 65 78 74 3d 3d 30 20  assert( next==0 
23980 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f  || rc==SQLITE_DO
23990 4e 45 20 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  NE );.  if( rc==
239a0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
239b0 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61   rc = btreeGetPa
239c0 67 65 28 70 42 74 2c 20 6f 76 66 6c 2c 20 26 70  ge(pBt, ovfl, &p
239d0 50 61 67 65 2c 20 28 70 70 50 61 67 65 3d 3d 30  Page, (ppPage==0
239e0 29 20 3f 20 50 41 47 45 52 5f 47 45 54 5f 52 45  ) ? PAGER_GET_RE
239f0 41 44 4f 4e 4c 59 20 3a 20 30 29 3b 0a 20 20 20  ADONLY : 0);.   
23a00 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
23a10 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 3d  ITE_OK || pPage=
23a20 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63  =0 );.    if( rc
23a30 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
23a40 20 20 20 20 20 6e 65 78 74 20 3d 20 67 65 74 34       next = get4
23a50 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74  byte(pPage->aDat
23a60 61 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  a);.    }.  }.. 
23a70 20 2a 70 50 67 6e 6f 4e 65 78 74 20 3d 20 6e 65   *pPgnoNext = ne
23a80 78 74 3b 0a 20 20 69 66 28 20 70 70 50 61 67 65  xt;.  if( ppPage
23a90 20 29 7b 0a 20 20 20 20 2a 70 70 50 61 67 65 20   ){.    *ppPage 
23aa0 3d 20 70 50 61 67 65 3b 0a 20 20 7d 65 6c 73 65  = pPage;.  }else
23ab0 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67  {.    releasePag
23ac0 65 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20  e(pPage);.  }.  
23ad0 72 65 74 75 72 6e 20 28 72 63 3d 3d 53 51 4c 49  return (rc==SQLI
23ae0 54 45 5f 44 4f 4e 45 20 3f 20 53 51 4c 49 54 45  TE_DONE ? SQLITE
23af0 5f 4f 4b 20 3a 20 72 63 29 3b 0a 7d 0a 0a 2f 2a  _OK : rc);.}../*
23b00 0a 2a 2a 20 43 6f 70 79 20 64 61 74 61 20 66 72  .** Copy data fr
23b10 6f 6d 20 61 20 62 75 66 66 65 72 20 74 6f 20 61  om a buffer to a
23b20 20 70 61 67 65 2c 20 6f 72 20 66 72 6f 6d 20 61   page, or from a
23b30 20 70 61 67 65 20 74 6f 20 61 20 62 75 66 66 65   page to a buffe
23b40 72 2e 0a 2a 2a 0a 2a 2a 20 70 50 61 79 6c 6f 61  r..**.** pPayloa
23b50 64 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  d is a pointer t
23b60 6f 20 64 61 74 61 20 73 74 6f 72 65 64 20 6f 6e  o data stored on
23b70 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20 70   database page p
23b80 44 62 50 61 67 65 2e 0a 2a 2a 20 49 66 20 61 72  DbPage..** If ar
23b90 67 75 6d 65 6e 74 20 65 4f 70 20 69 73 20 66 61  gument eOp is fa
23ba0 6c 73 65 2c 20 74 68 65 6e 20 6e 42 79 74 65 20  lse, then nByte 
23bb0 62 79 74 65 73 20 6f 66 20 64 61 74 61 20 61 72  bytes of data ar
23bc0 65 20 63 6f 70 69 65 64 0a 2a 2a 20 66 72 6f 6d  e copied.** from
23bd0 20 70 50 61 79 6c 6f 61 64 20 74 6f 20 74 68 65   pPayload to the
23be0 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64 20   buffer pointed 
23bf0 61 74 20 62 79 20 70 42 75 66 2e 20 49 66 20 65  at by pBuf. If e
23c00 4f 70 20 69 73 20 74 72 75 65 2c 0a 2a 2a 20 74  Op is true,.** t
23c10 68 65 6e 20 73 71 6c 69 74 65 33 50 61 67 65 72  hen sqlite3Pager
23c20 57 72 69 74 65 28 29 20 69 73 20 63 61 6c 6c 65  Write() is calle
23c30 64 20 6f 6e 20 70 44 62 50 61 67 65 20 61 6e 64  d on pDbPage and
23c40 20 6e 42 79 74 65 20 62 79 74 65 73 0a 2a 2a 20   nByte bytes.** 
23c50 6f 66 20 64 61 74 61 20 61 72 65 20 63 6f 70 69  of data are copi
23c60 65 64 20 66 72 6f 6d 20 74 68 65 20 62 75 66 66  ed from the buff
23c70 65 72 20 70 42 75 66 20 74 6f 20 70 50 61 79 6c  er pBuf to pPayl
23c80 6f 61 64 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54  oad..**.** SQLIT
23c90 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
23ca0 20 6f 6e 20 73 75 63 63 65 73 73 2c 20 6f 74 68   on success, oth
23cb0 65 72 77 69 73 65 20 61 6e 20 65 72 72 6f 72 20  erwise an error 
23cc0 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  code..*/.static 
23cd0 69 6e 74 20 63 6f 70 79 50 61 79 6c 6f 61 64 28  int copyPayload(
23ce0 0a 20 20 76 6f 69 64 20 2a 70 50 61 79 6c 6f 61  .  void *pPayloa
23cf0 64 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  d,           /* 
23d00 50 6f 69 6e 74 65 72 20 74 6f 20 70 61 67 65 20  Pointer to page 
23d10 64 61 74 61 20 2a 2f 0a 20 20 76 6f 69 64 20 2a  data */.  void *
23d20 70 42 75 66 2c 20 20 20 20 20 20 20 20 20 20 20  pBuf,           
23d30 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
23d40 6f 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 69 6e  o buffer */.  in
23d50 74 20 6e 42 79 74 65 2c 20 20 20 20 20 20 20 20  t nByte,        
23d60 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
23d70 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20 63 6f  r of bytes to co
23d80 70 79 20 2a 2f 0a 20 20 69 6e 74 20 65 4f 70 2c  py */.  int eOp,
23d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23da0 20 20 2f 2a 20 30 20 2d 3e 20 63 6f 70 79 20 66    /* 0 -> copy f
23db0 72 6f 6d 20 70 61 67 65 2c 20 31 20 2d 3e 20 63  rom page, 1 -> c
23dc0 6f 70 79 20 74 6f 20 70 61 67 65 20 2a 2f 0a 20  opy to page */. 
23dd0 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65   DbPage *pDbPage
23de0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
23df0 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70 50  ge containing pP
23e00 61 79 6c 6f 61 64 20 2a 2f 0a 29 7b 0a 20 20 69  ayload */.){.  i
23e10 66 28 20 65 4f 70 20 29 7b 0a 20 20 20 20 2f 2a  f( eOp ){.    /*
23e20 20 43 6f 70 79 20 64 61 74 61 20 66 72 6f 6d 20   Copy data from 
23e30 62 75 66 66 65 72 20 74 6f 20 70 61 67 65 20 28  buffer to page (
23e40 61 20 77 72 69 74 65 20 6f 70 65 72 61 74 69 6f  a write operatio
23e50 6e 29 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 63  n) */.    int rc
23e60 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
23e70 72 69 74 65 28 70 44 62 50 61 67 65 29 3b 0a 20  rite(pDbPage);. 
23e80 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
23e90 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
23ea0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
23eb0 20 20 20 6d 65 6d 63 70 79 28 70 50 61 79 6c 6f     memcpy(pPaylo
23ec0 61 64 2c 20 70 42 75 66 2c 20 6e 42 79 74 65 29  ad, pBuf, nByte)
23ed0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
23ee0 2a 20 43 6f 70 79 20 64 61 74 61 20 66 72 6f 6d  * Copy data from
23ef0 20 70 61 67 65 20 74 6f 20 62 75 66 66 65 72 20   page to buffer 
23f00 28 61 20 72 65 61 64 20 6f 70 65 72 61 74 69 6f  (a read operatio
23f10 6e 29 20 2a 2f 0a 20 20 20 20 6d 65 6d 63 70 79  n) */.    memcpy
23f20 28 70 42 75 66 2c 20 70 50 61 79 6c 6f 61 64 2c  (pBuf, pPayload,
23f30 20 6e 42 79 74 65 29 3b 0a 20 20 7d 0a 20 20 72   nByte);.  }.  r
23f40 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
23f50 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
23f60 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20  unction is used 
23f70 74 6f 20 72 65 61 64 20 6f 72 20 6f 76 65 72 77  to read or overw
23f80 72 69 74 65 20 70 61 79 6c 6f 61 64 20 69 6e 66  rite payload inf
23f90 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20  ormation.** for 
23fa0 74 68 65 20 65 6e 74 72 79 20 74 68 61 74 20 74  the entry that t
23fb0 68 65 20 70 43 75 72 20 63 75 72 73 6f 72 20 69  he pCur cursor i
23fc0 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 54  s pointing to. T
23fd0 68 65 20 65 4f 70 0a 2a 2a 20 61 72 67 75 6d 65  he eOp.** argume
23fe0 6e 74 20 69 73 20 69 6e 74 65 72 70 72 65 74 65  nt is interprete
23ff0 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a  d as follows:.**
24000 0a 2a 2a 20 20 20 30 3a 20 54 68 65 20 6f 70 65  .**   0: The ope
24010 72 61 74 69 6f 6e 20 69 73 20 61 20 72 65 61 64  ration is a read
24020 2e 20 50 6f 70 75 6c 61 74 65 20 74 68 65 20 6f  . Populate the o
24030 76 65 72 66 6c 6f 77 20 63 61 63 68 65 2e 0a 2a  verflow cache..*
24040 2a 20 20 20 31 3a 20 54 68 65 20 6f 70 65 72 61  *   1: The opera
24050 74 69 6f 6e 20 69 73 20 61 20 77 72 69 74 65 2e  tion is a write.
24060 20 50 6f 70 75 6c 61 74 65 20 74 68 65 20 6f 76   Populate the ov
24070 65 72 66 6c 6f 77 20 63 61 63 68 65 2e 0a 2a 2a  erflow cache..**
24080 20 20 20 32 3a 20 54 68 65 20 6f 70 65 72 61 74     2: The operat
24090 69 6f 6e 20 69 73 20 61 20 72 65 61 64 2e 20 44  ion is a read. D
240a0 6f 20 6e 6f 74 20 70 6f 70 75 6c 61 74 65 20 74  o not populate t
240b0 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 61 63 68  he overflow cach
240c0 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 6f 74 61 6c  e..**.** A total
240d0 20 6f 66 20 22 61 6d 74 22 20 62 79 74 65 73 20   of "amt" bytes 
240e0 61 72 65 20 72 65 61 64 20 6f 72 20 77 72 69 74  are read or writ
240f0 74 65 6e 20 62 65 67 69 6e 6e 69 6e 67 20 61 74  ten beginning at
24100 20 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 20 44 61   "offset"..** Da
24110 74 61 20 69 73 20 72 65 61 64 20 74 6f 20 6f 72  ta is read to or
24120 20 66 72 6f 6d 20 74 68 65 20 62 75 66 66 65 72   from the buffer
24130 20 70 42 75 66 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   pBuf..**.** The
24140 20 63 6f 6e 74 65 6e 74 20 62 65 69 6e 67 20 72   content being r
24150 65 61 64 20 6f 72 20 77 72 69 74 74 65 6e 20 6d  ead or written m
24160 69 67 68 74 20 61 70 70 65 61 72 20 6f 6e 20 74  ight appear on t
24170 68 65 20 6d 61 69 6e 20 70 61 67 65 0a 2a 2a 20  he main page.** 
24180 6f 72 20 62 65 20 73 63 61 74 74 65 72 65 64 20  or be scattered 
24190 6f 75 74 20 6f 6e 20 6d 75 6c 74 69 70 6c 65 20  out on multiple 
241a0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 0a  overflow pages..
241b0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 75 72  **.** If the cur
241c0 72 65 6e 74 20 63 75 72 73 6f 72 20 65 6e 74 72  rent cursor entr
241d0 79 20 75 73 65 73 20 6f 6e 65 20 6f 72 20 6d 6f  y uses one or mo
241e0 72 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  re overflow page
241f0 73 20 61 6e 64 20 74 68 65 0a 2a 2a 20 65 4f 70  s and the.** eOp
24200 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 74   argument is not
24210 20 32 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f   2, this functio
24220 6e 20 6d 61 79 20 61 6c 6c 6f 63 61 74 65 20 73  n may allocate s
24230 70 61 63 65 20 66 6f 72 20 61 6e 64 20 6c 61 7a  pace for and laz
24240 69 6c 79 20 0a 2a 2a 20 70 6f 70 75 6c 61 74 65  ily .** populate
24250 73 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70  s the overflow p
24260 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 20 61  age-list cache a
24270 72 72 61 79 20 28 42 74 43 75 72 73 6f 72 2e 61  rray (BtCursor.a
24280 4f 76 65 72 66 6c 6f 77 29 2e 20 0a 2a 2a 20 53  Overflow). .** S
24290 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20  ubsequent calls 
242a0 75 73 65 20 74 68 69 73 20 63 61 63 68 65 20 74  use this cache t
242b0 6f 20 6d 61 6b 65 20 73 65 65 6b 69 6e 67 20 74  o make seeking t
242c0 6f 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 6f  o the supplied o
242d0 66 66 73 65 74 20 0a 2a 2a 20 6d 6f 72 65 20 65  ffset .** more e
242e0 66 66 69 63 69 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  fficient..**.** 
242f0 4f 6e 63 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77  Once an overflow
24300 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65   page-list cache
24310 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61   has been alloca
24320 74 65 64 2c 20 69 74 20 6d 61 79 20 62 65 0a 2a  ted, it may be.*
24330 2a 20 69 6e 76 61 6c 69 64 61 74 65 64 20 69 66  * invalidated if
24340 20 73 6f 6d 65 20 6f 74 68 65 72 20 63 75 72 73   some other curs
24350 6f 72 20 77 72 69 74 65 73 20 74 6f 20 74 68 65  or writes to the
24360 20 73 61 6d 65 20 74 61 62 6c 65 2c 20 6f 72 20   same table, or 
24370 69 66 0a 2a 2a 20 74 68 65 20 63 75 72 73 6f 72  if.** the cursor
24380 20 69 73 20 6d 6f 76 65 64 20 74 6f 20 61 20 64   is moved to a d
24390 69 66 66 65 72 65 6e 74 20 72 6f 77 2e 20 41 64  ifferent row. Ad
243a0 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 69 6e 20 61  ditionally, in a
243b0 75 74 6f 2d 76 61 63 75 75 6d 0a 2a 2a 20 6d 6f  uto-vacuum.** mo
243c0 64 65 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  de, the followin
243d0 67 20 65 76 65 6e 74 73 20 6d 61 79 20 69 6e 76  g events may inv
243e0 61 6c 69 64 61 74 65 20 61 6e 20 6f 76 65 72 66  alidate an overf
243f0 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61  low page-list ca
24400 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 41  che..**.**   * A
24410 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61  n incremental va
24420 63 75 75 6d 2c 0a 2a 2a 20 20 20 2a 20 41 20 63  cuum,.**   * A c
24430 6f 6d 6d 69 74 20 69 6e 20 61 75 74 6f 5f 76 61  ommit in auto_va
24440 63 75 75 6d 3d 22 66 75 6c 6c 22 20 6d 6f 64 65  cuum="full" mode
24450 2c 0a 2a 2a 20 20 20 2a 20 43 72 65 61 74 69 6e  ,.**   * Creatin
24460 67 20 61 20 74 61 62 6c 65 20 28 6d 61 79 20 72  g a table (may r
24470 65 71 75 69 72 65 20 6d 6f 76 69 6e 67 20 61 6e  equire moving an
24480 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 29 2e   overflow page).
24490 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
244a0 63 63 65 73 73 50 61 79 6c 6f 61 64 28 0a 20 20  ccessPayload(.  
244b0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
244c0 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 70       /* Cursor p
244d0 6f 69 6e 74 69 6e 67 20 74 6f 20 65 6e 74 72 79  ointing to entry
244e0 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f   to read from */
244f0 0a 20 20 75 33 32 20 6f 66 66 73 65 74 2c 20 20  .  u32 offset,  
24500 20 20 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e          /* Begin
24510 20 72 65 61 64 69 6e 67 20 74 68 69 73 20 66 61   reading this fa
24520 72 20 69 6e 74 6f 20 70 61 79 6c 6f 61 64 20 2a  r into payload *
24530 2f 0a 20 20 75 33 32 20 61 6d 74 2c 20 20 20 20  /.  u32 amt,    
24540 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 61 64           /* Read
24550 20 74 68 69 73 20 6d 61 6e 79 20 62 79 74 65 73   this many bytes
24560 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
24570 68 61 72 20 2a 70 42 75 66 2c 20 2f 2a 20 57 72  har *pBuf, /* Wr
24580 69 74 65 20 74 68 65 20 62 79 74 65 73 20 69 6e  ite the bytes in
24590 74 6f 20 74 68 69 73 20 62 75 66 66 65 72 20 2a  to this buffer *
245a0 2f 20 0a 20 20 69 6e 74 20 65 4f 70 20 20 20 20  / .  int eOp    
245b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 65 72            /* zer
245c0 6f 20 74 6f 20 72 65 61 64 2e 20 6e 6f 6e 2d 7a  o to read. non-z
245d0 65 72 6f 20 74 6f 20 77 72 69 74 65 2e 20 2a 2f  ero to write. */
245e0 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  .){.  unsigned c
245f0 68 61 72 20 2a 61 50 61 79 6c 6f 61 64 3b 0a 20  har *aPayload;. 
24600 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
24610 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 49 64 78 20  _OK;.  int iIdx 
24620 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  = 0;.  MemPage *
24630 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70  pPage = pCur->ap
24640 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
24650 5d 3b 20 2f 2a 20 42 74 72 65 65 20 70 61 67 65  ]; /* Btree page
24660 20 6f 66 20 63 75 72 72 65 6e 74 20 65 6e 74 72   of current entr
24670 79 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20  y */.  BtShared 
24680 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74  *pBt = pCur->pBt
24690 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
246a0 20 20 20 2f 2a 20 42 74 72 65 65 20 74 68 69 73     /* Btree this
246b0 20 63 75 72 73 6f 72 20 62 65 6c 6f 6e 67 73 20   cursor belongs 
246c0 74 6f 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  to */.#ifdef SQL
246d0 49 54 45 5f 44 49 52 45 43 54 5f 4f 56 45 52 46  ITE_DIRECT_OVERF
246e0 4c 4f 57 5f 52 45 41 44 0a 20 20 75 6e 73 69 67  LOW_READ.  unsig
246f0 6e 65 64 20 63 68 61 72 20 2a 20 63 6f 6e 73 74  ned char * const
24700 20 70 42 75 66 53 74 61 72 74 20 3d 20 70 42 75   pBufStart = pBu
24710 66 3b 0a 20 20 69 6e 74 20 62 45 6e 64 3b 20 20  f;.  int bEnd;  
24720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
24740 2a 20 54 72 75 65 20 69 66 20 72 65 61 64 69 6e  * True if readin
24750 67 20 74 6f 20 65 6e 64 20 6f 66 20 64 61 74 61  g to end of data
24760 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73   */.#endif..  as
24770 73 65 72 74 28 20 70 50 61 67 65 20 29 3b 0a 20  sert( pPage );. 
24780 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
24790 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
247a0 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28  LID );.  assert(
247b0 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
247c0 72 2d 3e 69 50 61 67 65 5d 3c 70 50 61 67 65 2d  r->iPage]<pPage-
247d0 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65  >nCell );.  asse
247e0 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
247f0 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
24800 61 73 73 65 72 74 28 20 65 4f 70 21 3d 32 20 7c  assert( eOp!=2 |
24810 7c 20 6f 66 66 73 65 74 3d 3d 30 20 29 3b 20 20  | offset==0 );  
24820 20 20 2f 2a 20 41 6c 77 61 79 73 20 73 74 61 72    /* Always star
24830 74 20 66 72 6f 6d 20 62 65 67 69 6e 6e 69 6e 67  t from beginning
24840 20 66 6f 72 20 65 4f 70 3d 3d 32 20 2a 2f 0a 0a   for eOp==2 */..
24850 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43    getCellInfo(pC
24860 75 72 29 3b 0a 20 20 61 50 61 79 6c 6f 61 64 20  ur);.  aPayload 
24870 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 50 61  = pCur->info.pPa
24880 79 6c 6f 61 64 3b 0a 23 69 66 64 65 66 20 53 51  yload;.#ifdef SQ
24890 4c 49 54 45 5f 44 49 52 45 43 54 5f 4f 56 45 52  LITE_DIRECT_OVER
248a0 46 4c 4f 57 5f 52 45 41 44 0a 20 20 62 45 6e 64  FLOW_READ.  bEnd
248b0 20 3d 20 6f 66 66 73 65 74 2b 61 6d 74 3d 3d 70   = offset+amt==p
248c0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f  Cur->info.nPaylo
248d0 61 64 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73  ad;.#endif.  ass
248e0 65 72 74 28 20 6f 66 66 73 65 74 2b 61 6d 74 20  ert( offset+amt 
248f0 3c 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50  <= pCur->info.nP
24900 61 79 6c 6f 61 64 20 29 3b 0a 0a 20 20 69 66 28  ayload );..  if(
24910 20 26 61 50 61 79 6c 6f 61 64 5b 70 43 75 72 2d   &aPayload[pCur-
24920 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d 20 3e 20  >info.nLocal] > 
24930 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 42  &pPage->aData[pB
24940 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 5d 20 29  t->usableSize] )
24950 7b 0a 20 20 20 20 2f 2a 20 54 72 79 69 6e 67 20  {.    /* Trying 
24960 74 6f 20 72 65 61 64 20 6f 72 20 77 72 69 74 65  to read or write
24970 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66   past the end of
24980 20 74 68 65 20 64 61 74 61 20 69 73 20 61 6e 20   the data is an 
24990 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 72 65 74  error */.    ret
249a0 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
249b0 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20  PT_BKPT;.  }..  
249c0 2f 2a 20 43 68 65 63 6b 20 69 66 20 64 61 74 61  /* Check if data
249d0 20 6d 75 73 74 20 62 65 20 72 65 61 64 2f 77 72   must be read/wr
249e0 69 74 74 65 6e 20 74 6f 2f 66 72 6f 6d 20 74 68  itten to/from th
249f0 65 20 62 74 72 65 65 20 70 61 67 65 20 69 74 73  e btree page its
24a00 65 6c 66 2e 20 2a 2f 0a 20 20 69 66 28 20 6f 66  elf. */.  if( of
24a10 66 73 65 74 3c 70 43 75 72 2d 3e 69 6e 66 6f 2e  fset<pCur->info.
24a20 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 69 6e  nLocal ){.    in
24a30 74 20 61 20 3d 20 61 6d 74 3b 0a 20 20 20 20 69  t a = amt;.    i
24a40 66 28 20 61 2b 6f 66 66 73 65 74 3e 70 43 75 72  f( a+offset>pCur
24a50 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b  ->info.nLocal ){
24a60 0a 20 20 20 20 20 20 61 20 3d 20 70 43 75 72 2d  .      a = pCur-
24a70 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2d 20 6f  >info.nLocal - o
24a80 66 66 73 65 74 3b 0a 20 20 20 20 7d 0a 20 20 20  ffset;.    }.   
24a90 20 72 63 20 3d 20 63 6f 70 79 50 61 79 6c 6f 61   rc = copyPayloa
24aa0 64 28 26 61 50 61 79 6c 6f 61 64 5b 6f 66 66 73  d(&aPayload[offs
24ab0 65 74 5d 2c 20 70 42 75 66 2c 20 61 2c 20 28 65  et], pBuf, a, (e
24ac0 4f 70 20 26 20 30 78 30 31 29 2c 20 70 50 61 67  Op & 0x01), pPag
24ad0 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  e->pDbPage);.   
24ae0 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20   offset = 0;.   
24af0 20 70 42 75 66 20 2b 3d 20 61 3b 0a 20 20 20 20   pBuf += a;.    
24b00 61 6d 74 20 2d 3d 20 61 3b 0a 20 20 7d 65 6c 73  amt -= a;.  }els
24b10 65 7b 0a 20 20 20 20 6f 66 66 73 65 74 20 2d 3d  e{.    offset -=
24b20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63   pCur->info.nLoc
24b30 61 6c 3b 0a 20 20 7d 0a 0a 0a 20 20 69 66 28 20  al;.  }...  if( 
24b40 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
24b50 20 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20 63 6f   amt>0 ){.    co
24b60 6e 73 74 20 75 33 32 20 6f 76 66 6c 53 69 7a 65  nst u32 ovflSize
24b70 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69   = pBt->usableSi
24b80 7a 65 20 2d 20 34 3b 20 20 2f 2a 20 42 79 74 65  ze - 4;  /* Byte
24b90 73 20 63 6f 6e 74 65 6e 74 20 70 65 72 20 6f 76  s content per ov
24ba0 66 6c 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 50  fl page */.    P
24bb0 67 6e 6f 20 6e 65 78 74 50 61 67 65 3b 0a 0a 20  gno nextPage;.. 
24bc0 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20 67 65     nextPage = ge
24bd0 74 34 62 79 74 65 28 26 61 50 61 79 6c 6f 61 64  t4byte(&aPayload
24be0 5b 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63  [pCur->info.nLoc
24bf0 61 6c 5d 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  al]);..    /* If
24c00 20 74 68 65 20 42 74 43 75 72 73 6f 72 2e 61 4f   the BtCursor.aO
24c10 76 65 72 66 6c 6f 77 5b 5d 20 68 61 73 20 6e 6f  verflow[] has no
24c20 74 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64  t been allocated
24c30 2c 20 61 6c 6c 6f 63 61 74 65 20 69 74 20 6e 6f  , allocate it no
24c40 77 2e 0a 20 20 20 20 2a 2a 20 45 78 63 65 70 74  w..    ** Except
24c50 2c 20 64 6f 20 6e 6f 74 20 61 6c 6c 6f 63 61 74  , do not allocat
24c60 65 20 61 4f 76 65 72 66 6c 6f 77 5b 5d 20 66 6f  e aOverflow[] fo
24c70 72 20 65 4f 70 3d 3d 32 2e 0a 20 20 20 20 2a 2a  r eOp==2..    **
24c80 0a 20 20 20 20 2a 2a 20 54 68 65 20 61 4f 76 65  .    ** The aOve
24c90 72 66 6c 6f 77 5b 5d 20 61 72 72 61 79 20 69 73  rflow[] array is
24ca0 20 73 69 7a 65 64 20 61 74 20 6f 6e 65 20 65 6e   sized at one en
24cb0 74 72 79 20 66 6f 72 20 65 61 63 68 20 6f 76 65  try for each ove
24cc0 72 66 6c 6f 77 20 70 61 67 65 0a 20 20 20 20 2a  rflow page.    *
24cd0 2a 20 69 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f  * in the overflo
24ce0 77 20 63 68 61 69 6e 2e 20 54 68 65 20 70 61 67  w chain. The pag
24cf0 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  e number of the 
24d00 66 69 72 73 74 20 6f 76 65 72 66 6c 6f 77 20 70  first overflow p
24d10 61 67 65 20 69 73 0a 20 20 20 20 2a 2a 20 73 74  age is.    ** st
24d20 6f 72 65 64 20 69 6e 20 61 4f 76 65 72 66 6c 6f  ored in aOverflo
24d30 77 5b 30 5d 2c 20 65 74 63 2e 20 41 20 76 61 6c  w[0], etc. A val
24d40 75 65 20 6f 66 20 30 20 69 6e 20 74 68 65 20 61  ue of 0 in the a
24d50 4f 76 65 72 66 6c 6f 77 5b 5d 20 61 72 72 61 79  Overflow[] array
24d60 0a 20 20 20 20 2a 2a 20 6d 65 61 6e 73 20 22 6e  .    ** means "n
24d70 6f 74 20 79 65 74 20 6b 6e 6f 77 6e 22 20 28 74  ot yet known" (t
24d80 68 65 20 63 61 63 68 65 20 69 73 20 6c 61 7a 69  he cache is lazi
24d90 6c 79 20 70 6f 70 75 6c 61 74 65 64 29 2e 0a 20  ly populated).. 
24da0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 65 4f     */.    if( eO
24db0 70 21 3d 32 20 26 26 20 28 70 43 75 72 2d 3e 63  p!=2 && (pCur->c
24dc0 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 56  urFlags & BTCF_V
24dd0 61 6c 69 64 4f 76 66 6c 29 3d 3d 30 20 29 7b 0a  alidOvfl)==0 ){.
24de0 20 20 20 20 20 20 69 6e 74 20 6e 4f 76 66 6c 20        int nOvfl 
24df0 3d 20 28 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50  = (pCur->info.nP
24e00 61 79 6c 6f 61 64 2d 70 43 75 72 2d 3e 69 6e 66  ayload-pCur->inf
24e10 6f 2e 6e 4c 6f 63 61 6c 2b 6f 76 66 6c 53 69 7a  o.nLocal+ovflSiz
24e20 65 2d 31 29 2f 6f 76 66 6c 53 69 7a 65 3b 0a 20  e-1)/ovflSize;. 
24e30 20 20 20 20 20 69 66 28 20 6e 4f 76 66 6c 3e 70       if( nOvfl>p
24e40 43 75 72 2d 3e 6e 4f 76 66 6c 41 6c 6c 6f 63 20  Cur->nOvflAlloc 
24e50 29 7b 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20  ){.        Pgno 
24e60 2a 61 4e 65 77 20 3d 20 28 50 67 6e 6f 2a 29 73  *aNew = (Pgno*)s
24e70 71 6c 69 74 65 33 52 65 61 6c 6c 6f 63 28 0a 20  qlite3Realloc(. 
24e80 20 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d             pCur-
24e90 3e 61 4f 76 65 72 66 6c 6f 77 2c 20 6e 4f 76 66  >aOverflow, nOvf
24ea0 6c 2a 32 2a 73 69 7a 65 6f 66 28 50 67 6e 6f 29  l*2*sizeof(Pgno)
24eb0 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .        );.    
24ec0 20 20 20 20 69 66 28 20 61 4e 65 77 3d 3d 30 20      if( aNew==0 
24ed0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
24ee0 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
24ef0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
24f00 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 6e           pCur->n
24f10 4f 76 66 6c 41 6c 6c 6f 63 20 3d 20 6e 4f 76 66  OvflAlloc = nOvf
24f20 6c 2a 32 3b 0a 20 20 20 20 20 20 20 20 20 20 70  l*2;.          p
24f30 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 3d  Cur->aOverflow =
24f40 20 61 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 7d   aNew;.        }
24f50 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
24f60 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
24f70 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73   ){.        mems
24f80 65 74 28 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c  et(pCur->aOverfl
24f90 6f 77 2c 20 30 2c 20 6e 4f 76 66 6c 2a 73 69 7a  ow, 0, nOvfl*siz
24fa0 65 6f 66 28 50 67 6e 6f 29 29 3b 0a 20 20 20 20  eof(Pgno));.    
24fb0 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61      pCur->curFla
24fc0 67 73 20 7c 3d 20 42 54 43 46 5f 56 61 6c 69 64  gs |= BTCF_Valid
24fd0 4f 76 66 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Ovfl;.      }.  
24fe0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74    }..    /* If t
24ff0 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  he overflow page
25000 2d 6c 69 73 74 20 63 61 63 68 65 20 68 61 73 20  -list cache has 
25010 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 61  been allocated a
25020 6e 64 20 74 68 65 0a 20 20 20 20 2a 2a 20 65 6e  nd the.    ** en
25030 74 72 79 20 66 6f 72 20 74 68 65 20 66 69 72 73  try for the firs
25040 74 20 72 65 71 75 69 72 65 64 20 6f 76 65 72 66  t required overf
25050 6c 6f 77 20 70 61 67 65 20 69 73 20 76 61 6c 69  low page is vali
25060 64 2c 20 73 6b 69 70 0a 20 20 20 20 2a 2a 20 64  d, skip.    ** d
25070 69 72 65 63 74 6c 79 20 74 6f 20 69 74 2e 0a 20  irectly to it.. 
25080 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 70     */.    if( (p
25090 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20  Cur->curFlags & 
250a0 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 21  BTCF_ValidOvfl)!
250b0 3d 30 0a 20 20 20 20 20 26 26 20 70 43 75 72 2d  =0.     && pCur-
250c0 3e 61 4f 76 65 72 66 6c 6f 77 5b 6f 66 66 73 65  >aOverflow[offse
250d0 74 2f 6f 76 66 6c 53 69 7a 65 5d 0a 20 20 20 20  t/ovflSize].    
250e0 29 7b 0a 20 20 20 20 20 20 69 49 64 78 20 3d 20  ){.      iIdx = 
250f0 28 6f 66 66 73 65 74 2f 6f 76 66 6c 53 69 7a 65  (offset/ovflSize
25100 29 3b 0a 20 20 20 20 20 20 6e 65 78 74 50 61 67  );.      nextPag
25110 65 20 3d 20 70 43 75 72 2d 3e 61 4f 76 65 72 66  e = pCur->aOverf
25120 6c 6f 77 5b 69 49 64 78 5d 3b 0a 20 20 20 20 20  low[iIdx];.     
25130 20 6f 66 66 73 65 74 20 3d 20 28 6f 66 66 73 65   offset = (offse
25140 74 25 6f 76 66 6c 53 69 7a 65 29 3b 0a 20 20 20  t%ovflSize);.   
25150 20 7d 0a 0a 20 20 20 20 66 6f 72 28 20 3b 20 72   }..    for( ; r
25160 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
25170 61 6d 74 3e 30 20 26 26 20 6e 65 78 74 50 61 67  amt>0 && nextPag
25180 65 3b 20 69 49 64 78 2b 2b 29 7b 0a 0a 20 20 20  e; iIdx++){..   
25190 20 20 20 2f 2a 20 49 66 20 72 65 71 75 69 72 65     /* If require
251a0 64 2c 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20  d, populate the 
251b0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69  overflow page-li
251c0 73 74 20 63 61 63 68 65 2e 20 2a 2f 0a 20 20 20  st cache. */.   
251d0 20 20 20 69 66 28 20 28 70 43 75 72 2d 3e 63 75     if( (pCur->cu
251e0 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 56 61  rFlags & BTCF_Va
251f0 6c 69 64 4f 76 66 6c 29 21 3d 30 20 29 7b 0a 20  lidOvfl)!=0 ){. 
25200 20 20 20 20 20 20 20 61 73 73 65 72 74 28 21 70         assert(!p
25210 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69  Cur->aOverflow[i
25220 49 64 78 5d 20 7c 7c 20 70 43 75 72 2d 3e 61 4f  Idx] || pCur->aO
25230 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 3d 3d 6e  verflow[iIdx]==n
25240 65 78 74 50 61 67 65 29 3b 0a 20 20 20 20 20 20  extPage);.      
25250 20 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f    pCur->aOverflo
25260 77 5b 69 49 64 78 5d 20 3d 20 6e 65 78 74 50 61  w[iIdx] = nextPa
25270 67 65 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  ge;.      }..   
25280 20 20 20 69 66 28 20 6f 66 66 73 65 74 3e 3d 6f     if( offset>=o
25290 76 66 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  vflSize ){.     
252a0 20 20 20 2f 2a 20 54 68 65 20 6f 6e 6c 79 20 72     /* The only r
252b0 65 61 73 6f 6e 20 74 6f 20 72 65 61 64 20 74 68  eason to read th
252c0 69 73 20 70 61 67 65 20 69 73 20 74 6f 20 6f 62  is page is to ob
252d0 74 61 69 6e 20 74 68 65 20 70 61 67 65 0a 20 20  tain the page.  
252e0 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20        ** number 
252f0 66 6f 72 20 74 68 65 20 6e 65 78 74 20 70 61 67  for the next pag
25300 65 20 69 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f  e in the overflo
25310 77 20 63 68 61 69 6e 2e 20 54 68 65 20 70 61 67  w chain. The pag
25320 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 61 74  e.        ** dat
25330 61 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65  a is not require
25340 64 2e 20 53 6f 20 66 69 72 73 74 20 74 72 79 20  d. So first try 
25350 74 6f 20 6c 6f 6f 6b 75 70 20 74 68 65 20 6f 76  to lookup the ov
25360 65 72 66 6c 6f 77 0a 20 20 20 20 20 20 20 20 2a  erflow.        *
25370 2a 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68  * page-list cach
25380 65 2c 20 69 66 20 61 6e 79 2c 20 74 68 65 6e 20  e, if any, then 
25390 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20 74 68 65  fall back to the
253a0 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65   getOverflowPage
253b0 28 29 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 75  ().        ** fu
253c0 6e 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 20 20  nction..        
253d0 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 4e 6f  **.        ** No
253e0 74 65 20 74 68 61 74 20 74 68 65 20 61 4f 76 65  te that the aOve
253f0 72 66 6c 6f 77 5b 5d 20 61 72 72 61 79 20 6d 75  rflow[] array mu
25400 73 74 20 62 65 20 61 6c 6c 6f 63 61 74 65 64 20  st be allocated 
25410 62 65 63 61 75 73 65 20 65 4f 70 21 3d 32 0a 20  because eOp!=2. 
25420 20 20 20 20 20 20 20 2a 2a 20 68 65 72 65 2e 20         ** here. 
25430 20 49 66 20 65 4f 70 3d 3d 32 2c 20 74 68 65 6e   If eOp==2, then
25440 20 6f 66 66 73 65 74 3d 3d 30 20 61 6e 64 20 74   offset==0 and t
25450 68 69 73 20 62 72 61 6e 63 68 20 69 73 20 6e 65  his branch is ne
25460 76 65 72 20 74 61 6b 65 6e 2e 0a 20 20 20 20 20  ver taken..     
25470 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73     */.        as
25480 73 65 72 74 28 20 65 4f 70 21 3d 32 20 29 3b 0a  sert( eOp!=2 );.
25490 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
254a0 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26  pCur->curFlags &
254b0 20 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 20   BTCF_ValidOvfl 
254c0 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
254d0 74 28 20 70 43 75 72 2d 3e 70 42 74 72 65 65 2d  t( pCur->pBtree-
254e0 3e 64 62 3d 3d 70 42 74 2d 3e 64 62 20 29 3b 0a  >db==pBt->db );.
254f0 20 20 20 20 20 20 20 20 69 66 28 20 70 43 75 72          if( pCur
25500 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78  ->aOverflow[iIdx
25510 2b 31 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20  +1] ){.         
25520 20 6e 65 78 74 50 61 67 65 20 3d 20 70 43 75 72   nextPage = pCur
25530 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78  ->aOverflow[iIdx
25540 2b 31 5d 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  +1];.        }el
25550 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63  se{.          rc
25560 20 3d 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61   = getOverflowPa
25570 67 65 28 70 42 74 2c 20 6e 65 78 74 50 61 67 65  ge(pBt, nextPage
25580 2c 20 30 2c 20 26 6e 65 78 74 50 61 67 65 29 3b  , 0, &nextPage);
25590 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
255a0 20 20 20 6f 66 66 73 65 74 20 2d 3d 20 6f 76 66     offset -= ovf
255b0 6c 53 69 7a 65 3b 0a 20 20 20 20 20 20 7d 65 6c  lSize;.      }el
255c0 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4e  se{.        /* N
255d0 65 65 64 20 74 6f 20 72 65 61 64 20 74 68 69 73  eed to read this
255e0 20 70 61 67 65 20 70 72 6f 70 65 72 6c 79 2e 20   page properly. 
255f0 49 74 20 63 6f 6e 74 61 69 6e 73 20 73 6f 6d 65  It contains some
25600 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 20 20   of the.        
25610 2a 2a 20 72 61 6e 67 65 20 6f 66 20 64 61 74 61  ** range of data
25620 20 74 68 61 74 20 69 73 20 62 65 69 6e 67 20 72   that is being r
25630 65 61 64 20 28 65 4f 70 3d 3d 30 29 20 6f 72 20  ead (eOp==0) or 
25640 77 72 69 74 74 65 6e 20 28 65 4f 70 21 3d 30 29  written (eOp!=0)
25650 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 23 69 66  ..        */.#if
25660 64 65 66 20 53 51 4c 49 54 45 5f 44 49 52 45 43  def SQLITE_DIREC
25670 54 5f 4f 56 45 52 46 4c 4f 57 5f 52 45 41 44 0a  T_OVERFLOW_READ.
25680 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
25690 66 69 6c 65 20 2a 66 64 3b 0a 23 65 6e 64 69 66  file *fd;.#endif
256a0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61 20 3d  .        int a =
256b0 20 61 6d 74 3b 0a 20 20 20 20 20 20 20 20 69 66   amt;.        if
256c0 28 20 61 20 2b 20 6f 66 66 73 65 74 20 3e 20 6f  ( a + offset > o
256d0 76 66 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  vflSize ){.     
256e0 20 20 20 20 20 61 20 3d 20 6f 76 66 6c 53 69 7a       a = ovflSiz
256f0 65 20 2d 20 6f 66 66 73 65 74 3b 0a 20 20 20 20  e - offset;.    
25700 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51      }..#ifdef SQ
25710 4c 49 54 45 5f 44 49 52 45 43 54 5f 4f 56 45 52  LITE_DIRECT_OVER
25720 46 4c 4f 57 5f 52 45 41 44 0a 20 20 20 20 20 20  FLOW_READ.      
25730 20 20 2f 2a 20 49 66 20 61 6c 6c 20 74 68 65 20    /* If all the 
25740 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72  following are tr
25750 75 65 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  ue:.        **. 
25760 20 20 20 20 20 20 20 2a 2a 20 20 20 31 29 20 74         **   1) t
25770 68 69 73 20 69 73 20 61 20 72 65 61 64 20 6f 70  his is a read op
25780 65 72 61 74 69 6f 6e 2c 20 61 6e 64 20 0a 20 20  eration, and .  
25790 20 20 20 20 20 20 2a 2a 20 20 20 32 29 20 64 61        **   2) da
257a0 74 61 20 69 73 20 72 65 71 75 69 72 65 64 20 66  ta is required f
257b0 72 6f 6d 20 74 68 65 20 73 74 61 72 74 20 6f 66  rom the start of
257c0 20 74 68 69 73 20 6f 76 65 72 66 6c 6f 77 20 70   this overflow p
257d0 61 67 65 2c 20 61 6e 64 0a 20 20 20 20 20 20 20  age, and.       
257e0 20 2a 2a 20 20 20 33 29 20 74 68 65 20 64 61 74   **   3) the dat
257f0 61 62 61 73 65 20 69 73 20 66 69 6c 65 2d 62 61  abase is file-ba
25800 63 6b 65 64 2c 20 61 6e 64 0a 20 20 20 20 20 20  cked, and.      
25810 20 20 2a 2a 20 20 20 34 29 20 74 68 65 72 65 20    **   4) there 
25820 69 73 20 6e 6f 20 6f 70 65 6e 20 77 72 69 74 65  is no open write
25830 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 61 6e  -transaction, an
25840 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 35  d.        **   5
25850 29 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  ) the database i
25860 73 20 6e 6f 74 20 61 20 57 41 4c 20 64 61 74 61  s not a WAL data
25870 62 61 73 65 2c 0a 20 20 20 20 20 20 20 20 2a 2a  base,.        **
25880 20 20 20 36 29 20 61 6c 6c 20 64 61 74 61 20 66     6) all data f
25890 72 6f 6d 20 74 68 65 20 70 61 67 65 20 69 73 20  rom the page is 
258a0 62 65 69 6e 67 20 72 65 61 64 2e 0a 20 20 20 20  being read..    
258b0 20 20 20 20 2a 2a 20 20 20 37 29 20 61 74 20 6c      **   7) at l
258c0 65 61 73 74 20 34 20 62 79 74 65 73 20 68 61 76  east 4 bytes hav
258d0 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 72  e already been r
258e0 65 61 64 20 69 6e 74 6f 20 74 68 65 20 6f 75 74  ead into the out
258f0 70 75 74 20 62 75 66 66 65 72 20 0a 20 20 20 20  put buffer .    
25900 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
25910 2a 20 74 68 65 6e 20 64 61 74 61 20 63 61 6e 20  * then data can 
25920 62 65 20 72 65 61 64 20 64 69 72 65 63 74 6c 79  be read directly
25930 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
25940 73 65 20 66 69 6c 65 20 69 6e 74 6f 20 74 68 65  se file into the
25950 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 75 74 70  .        ** outp
25960 75 74 20 62 75 66 66 65 72 2c 20 62 79 70 61 73  ut buffer, bypas
25970 73 69 6e 67 20 74 68 65 20 70 61 67 65 2d 63 61  sing the page-ca
25980 63 68 65 20 61 6c 74 6f 67 65 74 68 65 72 2e 20  che altogether. 
25990 54 68 69 73 20 73 70 65 65 64 73 0a 20 20 20 20  This speeds.    
259a0 20 20 20 20 2a 2a 20 75 70 20 6c 6f 61 64 69 6e      ** up loadin
259b0 67 20 6c 61 72 67 65 20 72 65 63 6f 72 64 73 20  g large records 
259c0 74 68 61 74 20 73 70 61 6e 20 6d 61 6e 79 20 6f  that span many o
259d0 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 0a 20  verflow pages.. 
259e0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
259f0 20 20 69 66 28 20 28 65 4f 70 26 30 78 30 31 29    if( (eOp&0x01)
25a00 3d 3d 30 20 20 20 20 20 20 20 20 20 20 20 20 20  ==0             
25a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25a20 20 20 20 20 20 20 20 20 20 2f 2a 20 28 31 29 20           /* (1) 
25a30 2a 2f 0a 20 20 20 20 20 20 20 20 20 26 26 20 6f  */.         && o
25a40 66 66 73 65 74 3d 3d 30 20 20 20 20 20 20 20 20  ffset==0        
25a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25a70 20 20 2f 2a 20 28 32 29 20 2a 2f 0a 20 20 20 20    /* (2) */.    
25a80 20 20 20 20 20 26 26 20 28 62 45 6e 64 20 7c 7c       && (bEnd ||
25a90 20 61 3d 3d 6f 76 66 6c 53 69 7a 65 29 20 20 20   a==ovflSize)   
25aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25ab0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28 36             /* (6
25ac0 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 26 26  ) */.         &&
25ad0 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
25ae0 69 6f 6e 3d 3d 54 52 41 4e 53 5f 52 45 41 44 20  ion==TRANS_READ 
25af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25b00 20 20 20 20 2f 2a 20 28 34 29 20 2a 2f 0a 20 20      /* (4) */.  
25b10 20 20 20 20 20 20 20 26 26 20 28 66 64 20 3d 20         && (fd = 
25b20 73 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65  sqlite3PagerFile
25b30 28 70 42 74 2d 3e 70 50 61 67 65 72 29 29 2d 3e  (pBt->pPager))->
25b40 70 4d 65 74 68 6f 64 73 20 20 20 20 20 2f 2a 20  pMethods     /* 
25b50 28 33 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  (3) */.         
25b60 26 26 20 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  && pBt->pPage1->
25b70 61 44 61 74 61 5b 31 39 5d 3d 3d 30 78 30 31 20  aData[19]==0x01 
25b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25b90 20 20 20 20 20 20 2f 2a 20 28 35 29 20 2a 2f 0a        /* (5) */.
25ba0 20 20 20 20 20 20 20 20 20 26 26 20 26 70 42 75           && &pBu
25bb0 66 5b 2d 34 5d 3e 3d 70 42 75 66 53 74 61 72 74  f[-4]>=pBufStart
25bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
25be0 2a 20 28 37 29 20 2a 2f 0a 20 20 20 20 20 20 20  * (7) */.       
25bf0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 38   ){.          u8
25c00 20 61 53 61 76 65 5b 34 5d 3b 0a 20 20 20 20 20   aSave[4];.     
25c10 20 20 20 20 20 75 38 20 2a 61 57 72 69 74 65 20       u8 *aWrite 
25c20 3d 20 26 70 42 75 66 5b 2d 34 5d 3b 0a 20 20 20  = &pBuf[-4];.   
25c30 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 61         assert( a
25c40 57 72 69 74 65 3e 3d 70 42 75 66 53 74 61 72 74  Write>=pBufStart
25c50 20 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   );             
25c60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 68              /* h
25c70 65 6e 63 65 20 28 37 29 20 2a 2f 0a 20 20 20 20  ence (7) */.    
25c80 20 20 20 20 20 20 6d 65 6d 63 70 79 28 61 53 61        memcpy(aSa
25c90 76 65 2c 20 61 57 72 69 74 65 2c 20 34 29 3b 0a  ve, aWrite, 4);.
25ca0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
25cb0 71 6c 69 74 65 33 4f 73 52 65 61 64 28 66 64 2c  qlite3OsRead(fd,
25cc0 20 61 57 72 69 74 65 2c 20 61 2b 34 2c 20 28 69   aWrite, a+4, (i
25cd0 36 34 29 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  64)pBt->pageSize
25ce0 2a 28 6e 65 78 74 50 61 67 65 2d 31 29 29 3b 0a  *(nextPage-1));.
25cf0 20 20 20 20 20 20 20 20 20 20 6e 65 78 74 50 61            nextPa
25d00 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 61 57  ge = get4byte(aW
25d10 72 69 74 65 29 3b 0a 20 20 20 20 20 20 20 20 20  rite);.         
25d20 20 6d 65 6d 63 70 79 28 61 57 72 69 74 65 2c 20   memcpy(aWrite, 
25d30 61 53 61 76 65 2c 20 34 29 3b 0a 20 20 20 20 20  aSave, 4);.     
25d40 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a     }else.#endif.
25d50 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20  .        {.     
25d60 20 20 20 20 20 44 62 50 61 67 65 20 2a 70 44 62       DbPage *pDb
25d70 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Page;.          
25d80 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
25d90 72 41 63 71 75 69 72 65 28 70 42 74 2d 3e 70 50  rAcquire(pBt->pP
25da0 61 67 65 72 2c 20 6e 65 78 74 50 61 67 65 2c 20  ager, nextPage, 
25db0 26 70 44 62 50 61 67 65 2c 0a 20 20 20 20 20 20  &pDbPage,.      
25dc0 20 20 20 20 20 20 20 20 28 28 65 4f 70 26 30 78          ((eOp&0x
25dd0 30 31 29 3d 3d 30 20 3f 20 50 41 47 45 52 5f 47  01)==0 ? PAGER_G
25de0 45 54 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 30 29  ET_READONLY : 0)
25df0 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20  .          );.  
25e00 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
25e10 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
25e20 20 20 20 20 20 20 20 20 20 61 50 61 79 6c 6f 61           aPayloa
25e30 64 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  d = sqlite3Pager
25e40 47 65 74 44 61 74 61 28 70 44 62 50 61 67 65 29  GetData(pDbPage)
25e50 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e 65  ;.            ne
25e60 78 74 50 61 67 65 20 3d 20 67 65 74 34 62 79 74  xtPage = get4byt
25e70 65 28 61 50 61 79 6c 6f 61 64 29 3b 0a 20 20 20  e(aPayload);.   
25e80 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 63 6f           rc = co
25e90 70 79 50 61 79 6c 6f 61 64 28 26 61 50 61 79 6c  pyPayload(&aPayl
25ea0 6f 61 64 5b 6f 66 66 73 65 74 2b 34 5d 2c 20 70  oad[offset+4], p
25eb0 42 75 66 2c 20 61 2c 20 28 65 4f 70 26 30 78 30  Buf, a, (eOp&0x0
25ec0 31 29 2c 20 70 44 62 50 61 67 65 29 3b 0a 20 20  1), pDbPage);.  
25ed0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
25ee0 33 50 61 67 65 72 55 6e 72 65 66 28 70 44 62 50  3PagerUnref(pDbP
25ef0 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
25f00 20 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20    offset = 0;.  
25f10 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
25f20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 6d 74 20    }.        amt 
25f30 2d 3d 20 61 3b 0a 20 20 20 20 20 20 20 20 70 42  -= a;.        pB
25f40 75 66 20 2b 3d 20 61 3b 0a 20 20 20 20 20 20 7d  uf += a;.      }
25f50 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
25f60 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
25f70 26 26 20 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20  && amt>0 ){.    
25f80 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
25f90 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
25fa0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
25fb0 2f 2a 0a 2a 2a 20 52 65 61 64 20 70 61 72 74 20  /*.** Read part 
25fc0 6f 66 20 74 68 65 20 6b 65 79 20 61 73 73 6f 63  of the key assoc
25fd0 69 61 74 65 64 20 77 69 74 68 20 63 75 72 73 6f  iated with curso
25fe0 72 20 70 43 75 72 2e 20 20 45 78 61 63 74 6c 79  r pCur.  Exactly
25ff0 0a 2a 2a 20 22 61 6d 74 22 20 62 79 74 65 73 20  .** "amt" bytes 
26000 77 69 6c 6c 20 62 65 20 74 72 61 6e 73 66 65 72  will be transfer
26010 72 65 64 20 69 6e 74 6f 20 70 42 75 66 5b 5d 2e  red into pBuf[].
26020 20 20 54 68 65 20 74 72 61 6e 73 66 65 72 0a 2a    The transfer.*
26030 2a 20 62 65 67 69 6e 73 20 61 74 20 22 6f 66 66  * begins at "off
26040 73 65 74 22 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  set"..**.** The 
26050 63 61 6c 6c 65 72 20 6d 75 73 74 20 65 6e 73 75  caller must ensu
26060 72 65 20 74 68 61 74 20 70 43 75 72 20 69 73 20  re that pCur is 
26070 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20 76 61  pointing to a va
26080 6c 69 64 20 72 6f 77 0a 2a 2a 20 69 6e 20 74 68  lid row.** in th
26090 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 52  e table..**.** R
260a0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
260b0 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20 61 6e  on success or an
260c0 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61   error code if a
260d0 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20  nything goes.** 
260e0 77 72 6f 6e 67 2e 20 20 41 6e 20 65 72 72 6f 72  wrong.  An error
260f0 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
26100 22 6f 66 66 73 65 74 2b 61 6d 74 22 20 69 73 20  "offset+amt" is 
26110 6c 61 72 67 65 72 20 74 68 61 6e 0a 2a 2a 20 74  larger than.** t
26120 68 65 20 61 76 61 69 6c 61 62 6c 65 20 70 61 79  he available pay
26130 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  load..*/.int sql
26140 69 74 65 33 42 74 72 65 65 4b 65 79 28 42 74 43  ite3BtreeKey(BtC
26150 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32  ursor *pCur, u32
26160 20 6f 66 66 73 65 74 2c 20 75 33 32 20 61 6d 74   offset, u32 amt
26170 2c 20 76 6f 69 64 20 2a 70 42 75 66 29 7b 0a 20  , void *pBuf){. 
26180 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
26190 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
261a0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
261b0 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
261c0 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73  R_VALID );.  ass
261d0 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65  ert( pCur->iPage
261e0 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 61 70 50  >=0 && pCur->apP
261f0 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
26200 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
26210 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
26220 69 50 61 67 65 5d 3c 70 43 75 72 2d 3e 61 70 50  iPage]<pCur->apP
26230 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
26240 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 72 65 74  ->nCell );.  ret
26250 75 72 6e 20 61 63 63 65 73 73 50 61 79 6c 6f 61  urn accessPayloa
26260 64 28 70 43 75 72 2c 20 6f 66 66 73 65 74 2c 20  d(pCur, offset, 
26270 61 6d 74 2c 20 28 75 6e 73 69 67 6e 65 64 20 63  amt, (unsigned c
26280 68 61 72 2a 29 70 42 75 66 2c 20 30 29 3b 0a 7d  har*)pBuf, 0);.}
26290 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 70 61 72  ../*.** Read par
262a0 74 20 6f 66 20 74 68 65 20 64 61 74 61 20 61 73  t of the data as
262b0 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 63 75  sociated with cu
262c0 72 73 6f 72 20 70 43 75 72 2e 20 20 45 78 61 63  rsor pCur.  Exac
262d0 74 6c 79 0a 2a 2a 20 22 61 6d 74 22 20 62 79 74  tly.** "amt" byt
262e0 65 73 20 77 69 6c 6c 20 62 65 20 74 72 61 6e 73  es will be trans
262f0 66 65 72 65 64 20 69 6e 74 6f 20 70 42 75 66 5b  fered into pBuf[
26300 5d 2e 20 20 54 68 65 20 74 72 61 6e 73 66 65 72  ].  The transfer
26310 0a 2a 2a 20 62 65 67 69 6e 73 20 61 74 20 22 6f  .** begins at "o
26320 66 66 73 65 74 22 2e 0a 2a 2a 0a 2a 2a 20 52 65  ffset"..**.** Re
26330 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
26340 6e 20 73 75 63 63 65 73 73 20 6f 72 20 61 6e 20  n success or an 
26350 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e  error code if an
26360 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77  ything goes.** w
26370 72 6f 6e 67 2e 20 20 41 6e 20 65 72 72 6f 72 20  rong.  An error 
26380 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 22  is returned if "
26390 6f 66 66 73 65 74 2b 61 6d 74 22 20 69 73 20 6c  offset+amt" is l
263a0 61 72 67 65 72 20 74 68 61 6e 0a 2a 2a 20 74 68  arger than.** th
263b0 65 20 61 76 61 69 6c 61 62 6c 65 20 70 61 79 6c  e available payl
263c0 6f 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  oad..*/.int sqli
263d0 74 65 33 42 74 72 65 65 44 61 74 61 28 42 74 43  te3BtreeData(BtC
263e0 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32  ursor *pCur, u32
263f0 20 6f 66 66 73 65 74 2c 20 75 33 32 20 61 6d 74   offset, u32 amt
26400 2c 20 76 6f 69 64 20 2a 70 42 75 66 29 7b 0a 20  , void *pBuf){. 
26410 20 69 6e 74 20 72 63 3b 0a 0a 23 69 66 6e 64 65   int rc;..#ifnde
26420 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e  f SQLITE_OMIT_IN
26430 43 52 42 4c 4f 42 0a 20 20 69 66 20 28 20 70 43  CRBLOB.  if ( pC
26440 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
26450 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20  OR_INVALID ){.  
26460 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
26470 41 42 4f 52 54 3b 0a 20 20 7d 0a 23 65 6e 64 69  ABORT;.  }.#endi
26480 66 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  f..  assert( cur
26490 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
264a0 75 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 72 65  ur) );.  rc = re
264b0 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74  storeCursorPosit
264c0 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28  ion(pCur);.  if(
264d0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
264e0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  {.    assert( pC
264f0 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
26500 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20 20  OR_VALID );.    
26510 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50  assert( pCur->iP
26520 61 67 65 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e  age>=0 && pCur->
26530 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
26540 67 65 5d 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ge] );.    asser
26550 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70  t( pCur->aiIdx[p
26560 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 43 75 72  Cur->iPage]<pCur
26570 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
26580 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  Page]->nCell );.
26590 20 20 20 20 72 63 20 3d 20 61 63 63 65 73 73 50      rc = accessP
265a0 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 6f 66 66  ayload(pCur, off
265b0 73 65 74 2c 20 61 6d 74 2c 20 70 42 75 66 2c 20  set, amt, pBuf, 
265c0 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  0);.  }.  return
265d0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
265e0 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
265f0 6f 20 70 61 79 6c 6f 61 64 20 69 6e 66 6f 72 6d  o payload inform
26600 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 65  ation from the e
26610 6e 74 72 79 20 74 68 61 74 20 74 68 65 20 0a 2a  ntry that the .*
26620 2a 20 70 43 75 72 20 63 75 72 73 6f 72 20 69 73  * pCur cursor is
26630 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 20 54   pointing to.  T
26640 68 65 20 70 6f 69 6e 74 65 72 20 69 73 20 74 6f  he pointer is to
26650 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
26660 66 0a 2a 2a 20 74 68 65 20 6b 65 79 20 69 66 20  f.** the key if 
26670 69 6e 64 65 78 20 62 74 72 65 65 73 20 28 70 50  index btrees (pP
26680 61 67 65 2d 3e 69 6e 74 4b 65 79 3d 3d 30 29 20  age->intKey==0) 
26690 61 6e 64 20 69 73 20 74 68 65 20 64 61 74 61 20  and is the data 
266a0 66 6f 72 0a 2a 2a 20 74 61 62 6c 65 20 62 74 72  for.** table btr
266b0 65 65 73 20 28 70 50 61 67 65 2d 3e 69 6e 74 4b  ees (pPage->intK
266c0 65 79 3d 3d 31 29 2e 20 54 68 65 20 6e 75 6d 62  ey==1). The numb
266d0 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 61  er of bytes of a
266e0 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 6b 65 79 2f  vailable.** key/
266f0 64 61 74 61 20 69 73 20 77 72 69 74 74 65 6e 20  data is written 
26700 69 6e 74 6f 20 2a 70 41 6d 74 2e 20 20 49 66 20  into *pAmt.  If 
26710 2a 70 41 6d 74 3d 3d 30 2c 20 74 68 65 6e 20 74  *pAmt==0, then t
26720 68 65 20 76 61 6c 75 65 0a 2a 2a 20 72 65 74 75  he value.** retu
26730 72 6e 65 64 20 77 69 6c 6c 20 6e 6f 74 20 62 65  rned will not be
26740 20 61 20 76 61 6c 69 64 20 70 6f 69 6e 74 65 72   a valid pointer
26750 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
26760 74 69 6e 65 20 69 73 20 61 6e 20 6f 70 74 69 6d  tine is an optim
26770 69 7a 61 74 69 6f 6e 2e 20 20 49 74 20 69 73 20  ization.  It is 
26780 63 6f 6d 6d 6f 6e 20 66 6f 72 20 74 68 65 20 65  common for the e
26790 6e 74 69 72 65 20 6b 65 79 0a 2a 2a 20 61 6e 64  ntire key.** and
267a0 20 64 61 74 61 20 74 6f 20 66 69 74 20 6f 6e 20   data to fit on 
267b0 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65 20 61  the local page a
267c0 6e 64 20 66 6f 72 20 74 68 65 72 65 20 74 6f 20  nd for there to 
267d0 62 65 20 6e 6f 20 6f 76 65 72 66 6c 6f 77 0a 2a  be no overflow.*
267e0 2a 20 70 61 67 65 73 2e 20 20 57 68 65 6e 20 74  * pages.  When t
267f0 68 61 74 20 69 73 20 73 6f 2c 20 74 68 69 73 20  hat is so, this 
26800 72 6f 75 74 69 6e 65 20 63 61 6e 20 62 65 20 75  routine can be u
26810 73 65 64 20 74 6f 20 61 63 63 65 73 73 20 74 68  sed to access th
26820 65 0a 2a 2a 20 6b 65 79 20 61 6e 64 20 64 61 74  e.** key and dat
26830 61 20 77 69 74 68 6f 75 74 20 6d 61 6b 69 6e 67  a without making
26840 20 61 20 63 6f 70 79 2e 20 20 49 66 20 74 68 65   a copy.  If the
26850 20 6b 65 79 20 61 6e 64 2f 6f 72 20 64 61 74 61   key and/or data
26860 20 73 70 69 6c 6c 73 0a 2a 2a 20 6f 6e 74 6f 20   spills.** onto 
26870 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2c 20  overflow pages, 
26880 74 68 65 6e 20 61 63 63 65 73 73 50 61 79 6c 6f  then accessPaylo
26890 61 64 28 29 20 6d 75 73 74 20 62 65 20 75 73 65  ad() must be use
268a0 64 20 74 6f 20 72 65 61 73 73 65 6d 62 6c 65 0a  d to reassemble.
268b0 2a 2a 20 74 68 65 20 6b 65 79 2f 64 61 74 61 20  ** the key/data 
268c0 61 6e 64 20 63 6f 70 79 20 69 74 20 69 6e 74 6f  and copy it into
268d0 20 61 20 70 72 65 61 6c 6c 6f 63 61 74 65 64 20   a preallocated 
268e0 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68  buffer..**.** Th
268f0 65 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72 6e  e pointer return
26900 65 64 20 62 79 20 74 68 69 73 20 72 6f 75 74 69  ed by this routi
26910 6e 65 20 6c 6f 6f 6b 73 20 64 69 72 65 63 74 6c  ne looks directl
26920 79 20 69 6e 74 6f 20 74 68 65 20 63 61 63 68 65  y into the cache
26930 64 0a 2a 2a 20 70 61 67 65 20 6f 66 20 74 68 65  d.** page of the
26940 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 65 20   database.  The 
26950 64 61 74 61 20 6d 69 67 68 74 20 63 68 61 6e 67  data might chang
26960 65 20 6f 72 20 6d 6f 76 65 20 74 68 65 20 6e 65  e or move the ne
26970 78 74 20 74 69 6d 65 0a 2a 2a 20 61 6e 79 20 62  xt time.** any b
26980 74 72 65 65 20 72 6f 75 74 69 6e 65 20 69 73 20  tree routine is 
26990 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  called..*/.stati
269a0 63 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 66 65  c const void *fe
269b0 74 63 68 50 61 79 6c 6f 61 64 28 0a 20 20 42 74  tchPayload(.  Bt
269c0 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20  Cursor *pCur,   
269d0 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 70 6f 69     /* Cursor poi
269e0 6e 74 69 6e 67 20 74 6f 20 65 6e 74 72 79 20 74  nting to entry t
269f0 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20  o read from */. 
26a00 20 75 33 32 20 2a 70 41 6d 74 20 20 20 20 20 20   u32 *pAmt      
26a10 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74        /* Write t
26a20 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 76 61  he number of ava
26a30 69 6c 61 62 6c 65 20 62 79 74 65 73 20 68 65 72  ilable bytes her
26a40 65 20 2a 2f 0a 29 7b 0a 20 20 75 33 32 20 61 6d  e */.){.  u32 am
26a50 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  t;.  assert( pCu
26a60 72 21 3d 30 20 26 26 20 70 43 75 72 2d 3e 69 50  r!=0 && pCur->iP
26a70 61 67 65 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e  age>=0 && pCur->
26a80 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
26a90 67 65 5d 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ge]);.  assert( 
26aa0 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
26ab0 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
26ac0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
26ad0 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d  mutex_held(pCur-
26ae0 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74  >pBtree->db->mut
26af0 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
26b00 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
26b10 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  x(pCur) );.  ass
26b20 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78  ert( pCur->aiIdx
26b30 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 43  [pCur->iPage]<pC
26b40 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
26b50 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29  >iPage]->nCell )
26b60 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
26b70 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3e 30 20 29  ->info.nSize>0 )
26b80 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
26b90 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64 3e  ->info.pPayload>
26ba0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
26bb0 72 2d 3e 69 50 61 67 65 5d 2d 3e 61 44 61 74 61  r->iPage]->aData
26bc0 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29   || CORRUPT_DB )
26bd0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
26be0 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64 3c  ->info.pPayload<
26bf0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
26c00 72 2d 3e 69 50 61 67 65 5d 2d 3e 61 44 61 74 61  r->iPage]->aData
26c10 45 6e 64 20 7c 7c 43 4f 52 52 55 50 54 5f 44 42  End ||CORRUPT_DB
26c20 29 3b 0a 20 20 61 6d 74 20 3d 20 28 69 6e 74 29  );.  amt = (int)
26c30 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43  (pCur->apPage[pC
26c40 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 61 44 61 74  ur->iPage]->aDat
26c50 61 45 6e 64 20 2d 20 70 43 75 72 2d 3e 69 6e 66  aEnd - pCur->inf
26c60 6f 2e 70 50 61 79 6c 6f 61 64 29 3b 0a 20 20 69  o.pPayload);.  i
26c70 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c  f( pCur->info.nL
26c80 6f 63 61 6c 3c 61 6d 74 20 29 20 61 6d 74 20 3d  ocal<amt ) amt =
26c90 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63   pCur->info.nLoc
26ca0 61 6c 3b 0a 20 20 2a 70 41 6d 74 20 3d 20 61 6d  al;.  *pAmt = am
26cb0 74 3b 0a 20 20 72 65 74 75 72 6e 20 28 76 6f 69  t;.  return (voi
26cc0 64 2a 29 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 50  d*)pCur->info.pP
26cd0 61 79 6c 6f 61 64 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  ayload;.}.../*.*
26ce0 2a 20 46 6f 72 20 74 68 65 20 65 6e 74 72 79 20  * For the entry 
26cf0 74 68 61 74 20 63 75 72 73 6f 72 20 70 43 75 72  that cursor pCur
26d00 20 69 73 20 70 6f 69 6e 74 20 74 6f 2c 20 72 65   is point to, re
26d10 74 75 72 6e 20 61 73 0a 2a 2a 20 6d 61 6e 79 20  turn as.** many 
26d20 62 79 74 65 73 20 6f 66 20 74 68 65 20 6b 65 79  bytes of the key
26d30 20 6f 72 20 64 61 74 61 20 61 73 20 61 72 65 20   or data as are 
26d40 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 74 68 65  available on the
26d50 20 6c 6f 63 61 6c 0a 2a 2a 20 62 2d 74 72 65 65   local.** b-tree
26d60 20 70 61 67 65 2e 20 20 57 72 69 74 65 20 74 68   page.  Write th
26d70 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 76 61 69  e number of avai
26d80 6c 61 62 6c 65 20 62 79 74 65 73 20 69 6e 74 6f  lable bytes into
26d90 20 2a 70 41 6d 74 2e 0a 2a 2a 0a 2a 2a 20 54 68   *pAmt..**.** Th
26da0 65 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72 6e  e pointer return
26db0 65 64 20 69 73 20 65 70 68 65 6d 65 72 61 6c 2e  ed is ephemeral.
26dc0 20 20 54 68 65 20 6b 65 79 2f 64 61 74 61 20 6d    The key/data m
26dd0 61 79 20 6d 6f 76 65 0a 2a 2a 20 6f 72 20 62 65  ay move.** or be
26de0 20 64 65 73 74 72 6f 79 65 64 20 6f 6e 20 74 68   destroyed on th
26df0 65 20 6e 65 78 74 20 63 61 6c 6c 20 74 6f 20 61  e next call to a
26e00 6e 79 20 42 74 72 65 65 20 72 6f 75 74 69 6e 65  ny Btree routine
26e10 2c 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20 63  ,.** including c
26e20 61 6c 6c 73 20 66 72 6f 6d 20 6f 74 68 65 72 20  alls from other 
26e30 74 68 72 65 61 64 73 20 61 67 61 69 6e 73 74 20  threads against 
26e40 74 68 65 20 73 61 6d 65 20 63 61 63 68 65 2e 0a  the same cache..
26e50 2a 2a 20 48 65 6e 63 65 2c 20 61 20 6d 75 74 65  ** Hence, a mute
26e60 78 20 6f 6e 20 74 68 65 20 42 74 53 68 61 72 65  x on the BtShare
26e70 64 20 73 68 6f 75 6c 64 20 62 65 20 68 65 6c 64  d should be held
26e80 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e   prior to callin
26e90 67 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e  g.** this routin
26ea0 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 72  e..**.** These r
26eb0 6f 75 74 69 6e 65 73 20 69 73 20 75 73 65 64 20  outines is used 
26ec0 74 6f 20 67 65 74 20 71 75 69 63 6b 20 61 63 63  to get quick acc
26ed0 65 73 73 20 74 6f 20 6b 65 79 20 61 6e 64 20 64  ess to key and d
26ee0 61 74 61 0a 2a 2a 20 69 6e 20 74 68 65 20 63 6f  ata.** in the co
26ef0 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20  mmon case where 
26f00 6e 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  no overflow page
26f10 73 20 61 72 65 20 75 73 65 64 2e 0a 2a 2f 0a 63  s are used..*/.c
26f20 6f 6e 73 74 20 76 6f 69 64 20 2a 73 71 6c 69 74  onst void *sqlit
26f30 65 33 42 74 72 65 65 4b 65 79 46 65 74 63 68 28  e3BtreeKeyFetch(
26f40 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
26f50 75 33 32 20 2a 70 41 6d 74 29 7b 0a 20 20 72 65  u32 *pAmt){.  re
26f60 74 75 72 6e 20 66 65 74 63 68 50 61 79 6c 6f 61  turn fetchPayloa
26f70 64 28 70 43 75 72 2c 20 70 41 6d 74 29 3b 0a 7d  d(pCur, pAmt);.}
26f80 0a 63 6f 6e 73 74 20 76 6f 69 64 20 2a 73 71 6c  .const void *sql
26f90 69 74 65 33 42 74 72 65 65 44 61 74 61 46 65 74  ite3BtreeDataFet
26fa0 63 68 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  ch(BtCursor *pCu
26fb0 72 2c 20 75 33 32 20 2a 70 41 6d 74 29 7b 0a 20  r, u32 *pAmt){. 
26fc0 20 72 65 74 75 72 6e 20 66 65 74 63 68 50 61 79   return fetchPay
26fd0 6c 6f 61 64 28 70 43 75 72 2c 20 70 41 6d 74 29  load(pCur, pAmt)
26fe0 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65  ;.}.../*.** Move
26ff0 20 74 68 65 20 63 75 72 73 6f 72 20 64 6f 77 6e   the cursor down
27000 20 74 6f 20 61 20 6e 65 77 20 63 68 69 6c 64 20   to a new child 
27010 70 61 67 65 2e 20 20 54 68 65 20 6e 65 77 50 67  page.  The newPg
27020 6e 6f 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74  no argument is t
27030 68 65 0a 2a 2a 20 70 61 67 65 20 6e 75 6d 62 65  he.** page numbe
27040 72 20 6f 66 20 74 68 65 20 63 68 69 6c 64 20 70  r of the child p
27050 61 67 65 20 74 6f 20 6d 6f 76 65 20 74 6f 2e 0a  age to move to..
27060 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
27070 69 6f 6e 20 72 65 74 75 72 6e 73 20 53 51 4c 49  ion returns SQLI
27080 54 45 5f 43 4f 52 52 55 50 54 20 69 66 20 74 68  TE_CORRUPT if th
27090 65 20 70 61 67 65 2d 68 65 61 64 65 72 20 66 6c  e page-header fl
270a0 61 67 73 20 66 69 65 6c 64 20 6f 66 0a 2a 2a 20  ags field of.** 
270b0 74 68 65 20 6e 65 77 20 63 68 69 6c 64 20 70 61  the new child pa
270c0 67 65 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63  ge does not matc
270d0 68 20 74 68 65 20 66 6c 61 67 73 20 66 69 65 6c  h the flags fiel
270e0 64 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74 20  d of the parent 
270f0 28 69 2e 65 2e 0a 2a 2a 20 69 66 20 61 6e 20 69  (i.e..** if an i
27100 6e 74 6b 65 79 20 70 61 67 65 20 61 70 70 65 61  ntkey page appea
27110 72 73 20 74 6f 20 62 65 20 74 68 65 20 70 61 72  rs to be the par
27120 65 6e 74 20 6f 66 20 61 20 6e 6f 6e 2d 69 6e 74  ent of a non-int
27130 6b 65 79 20 70 61 67 65 2c 20 6f 72 0a 2a 2a 20  key page, or.** 
27140 76 69 63 65 2d 76 65 72 73 61 29 2e 0a 2a 2f 0a  vice-versa)..*/.
27150 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54  static int moveT
27160 6f 43 68 69 6c 64 28 42 74 43 75 72 73 6f 72 20  oChild(BtCursor 
27170 2a 70 43 75 72 2c 20 75 33 32 20 6e 65 77 50 67  *pCur, u32 newPg
27180 6e 6f 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  no){.  BtShared 
27190 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74  *pBt = pCur->pBt
271a0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ;..  assert( cur
271b0 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
271c0 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
271d0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
271e0 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
271f0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
27200 50 61 67 65 3c 42 54 43 55 52 53 4f 52 5f 4d 41  Page<BTCURSOR_MA
27210 58 5f 44 45 50 54 48 20 29 3b 0a 20 20 61 73 73  X_DEPTH );.  ass
27220 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65  ert( pCur->iPage
27230 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 43 75  >=0 );.  if( pCu
27240 72 2d 3e 69 50 61 67 65 3e 3d 28 42 54 43 55 52  r->iPage>=(BTCUR
27250 53 4f 52 5f 4d 41 58 5f 44 45 50 54 48 2d 31 29  SOR_MAX_DEPTH-1)
27260 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
27270 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
27280 50 54 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e  PT;.  }.  pCur->
27290 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a  info.nSize = 0;.
272a0 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73    pCur->curFlags
272b0 20 26 3d 20 7e 28 42 54 43 46 5f 56 61 6c 69 64   &= ~(BTCF_Valid
272c0 4e 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f  NKey|BTCF_ValidO
272d0 76 66 6c 29 3b 0a 20 20 70 43 75 72 2d 3e 69 50  vfl);.  pCur->iP
272e0 61 67 65 2b 2b 3b 0a 20 20 70 43 75 72 2d 3e 61  age++;.  pCur->a
272f0 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
27300 5d 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  ] = 0;.  return 
27310 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28 70  getAndInitPage(p
27320 42 74 2c 20 6e 65 77 50 67 6e 6f 2c 20 26 70 43  Bt, newPgno, &pC
27330 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
27340 3e 69 50 61 67 65 5d 2c 0a 20 20 20 20 20 20 20  >iPage],.       
27350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27360 20 70 43 75 72 2c 20 70 43 75 72 2d 3e 63 75 72   pCur, pCur->cur
27370 50 61 67 65 72 46 6c 61 67 73 29 3b 0a 7d 0a 0a  PagerFlags);.}..
27380 23 69 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  #if SQLITE_DEBUG
27390 0a 2f 2a 0a 2a 2a 20 50 61 67 65 20 70 50 61 72  ./*.** Page pPar
273a0 65 6e 74 20 69 73 20 61 6e 20 69 6e 74 65 72 6e  ent is an intern
273b0 61 6c 20 28 6e 6f 6e 2d 6c 65 61 66 29 20 74 72  al (non-leaf) tr
273c0 65 65 20 70 61 67 65 2e 20 54 68 69 73 20 66 75  ee page. This fu
273d0 6e 63 74 69 6f 6e 20 0a 2a 2a 20 61 73 73 65 72  nction .** asser
273e0 74 73 20 74 68 61 74 20 70 61 67 65 20 6e 75 6d  ts that page num
273f0 62 65 72 20 69 43 68 69 6c 64 20 69 73 20 74 68  ber iChild is th
27400 65 20 6c 65 66 74 2d 63 68 69 6c 64 20 69 66 20  e left-child if 
27410 74 68 65 20 69 49 64 78 27 74 68 0a 2a 2a 20 63  the iIdx'th.** c
27420 65 6c 6c 20 69 6e 20 70 61 67 65 20 70 50 61 72  ell in page pPar
27430 65 6e 74 2e 20 4f 72 2c 20 69 66 20 69 49 64 78  ent. Or, if iIdx
27440 20 69 73 20 65 71 75 61 6c 20 74 6f 20 74 68 65   is equal to the
27450 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   total number of
27460 0a 2a 2a 20 63 65 6c 6c 73 20 69 6e 20 70 50 61  .** cells in pPa
27470 72 65 6e 74 2c 20 74 68 61 74 20 70 61 67 65 20  rent, that page 
27480 6e 75 6d 62 65 72 20 69 43 68 69 6c 64 20 69 73  number iChild is
27490 20 74 68 65 20 72 69 67 68 74 2d 63 68 69 6c 64   the right-child
274a0 20 6f 66 0a 2a 2a 20 74 68 65 20 70 61 67 65 2e   of.** the page.
274b0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
274c0 61 73 73 65 72 74 50 61 72 65 6e 74 49 6e 64 65  assertParentInde
274d0 78 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65  x(MemPage *pPare
274e0 6e 74 2c 20 69 6e 74 20 69 49 64 78 2c 20 50 67  nt, int iIdx, Pg
274f0 6e 6f 20 69 43 68 69 6c 64 29 7b 0a 20 20 69 66  no iChild){.  if
27500 28 20 43 4f 52 52 55 50 54 5f 44 42 20 29 20 72  ( CORRUPT_DB ) r
27510 65 74 75 72 6e 3b 20 20 2f 2a 20 54 68 65 20 63  eturn;  /* The c
27520 6f 6e 64 69 74 69 6f 6e 73 20 74 65 73 74 65 64  onditions tested
27530 20 62 65 6c 6f 77 20 6d 69 67 68 74 20 6e 6f 74   below might not
27540 20 62 65 20 74 72 75 65 0a 20 20 20 20 20 20 20   be true.       
27550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27560 20 20 20 20 20 2a 2a 20 69 6e 20 61 20 63 6f 72       ** in a cor
27570 72 75 70 74 20 64 61 74 61 62 61 73 65 20 2a 2f  rupt database */
27580 0a 20 20 61 73 73 65 72 74 28 20 69 49 64 78 3c  .  assert( iIdx<
27590 3d 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20  =pParent->nCell 
275a0 29 3b 0a 20 20 69 66 28 20 69 49 64 78 3d 3d 70  );.  if( iIdx==p
275b0 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b  Parent->nCell ){
275c0 0a 20 20 20 20 61 73 73 65 72 74 28 20 67 65 74  .    assert( get
275d0 34 62 79 74 65 28 26 70 50 61 72 65 6e 74 2d 3e  4byte(&pParent->
275e0 61 44 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68  aData[pParent->h
275f0 64 72 4f 66 66 73 65 74 2b 38 5d 29 3d 3d 69 43  drOffset+8])==iC
27600 68 69 6c 64 20 29 3b 0a 20 20 7d 65 6c 73 65 7b  hild );.  }else{
27610 0a 20 20 20 20 61 73 73 65 72 74 28 20 67 65 74  .    assert( get
27620 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70  4byte(findCell(p
27630 50 61 72 65 6e 74 2c 20 69 49 64 78 29 29 3d 3d  Parent, iIdx))==
27640 69 43 68 69 6c 64 20 29 3b 0a 20 20 7d 0a 7d 0a  iChild );.  }.}.
27650 23 65 6c 73 65 0a 23 20 20 64 65 66 69 6e 65 20  #else.#  define 
27660 61 73 73 65 72 74 50 61 72 65 6e 74 49 6e 64 65  assertParentInde
27670 78 28 78 2c 79 2c 7a 29 20 0a 23 65 6e 64 69 66  x(x,y,z) .#endif
27680 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65  ../*.** Move the
27690 20 63 75 72 73 6f 72 20 75 70 20 74 6f 20 74 68   cursor up to th
276a0 65 20 70 61 72 65 6e 74 20 70 61 67 65 2e 0a 2a  e parent page..*
276b0 2a 0a 2a 2a 20 70 43 75 72 2d 3e 69 64 78 20 69  *.** pCur->idx i
276c0 73 20 73 65 74 20 74 6f 20 74 68 65 20 63 65 6c  s set to the cel
276d0 6c 20 69 6e 64 65 78 20 74 68 61 74 20 63 6f 6e  l index that con
276e0 74 61 69 6e 73 20 74 68 65 20 70 6f 69 6e 74 65  tains the pointe
276f0 72 0a 2a 2a 20 74 6f 20 74 68 65 20 70 61 67 65  r.** to the page
27700 20 77 65 20 61 72 65 20 63 6f 6d 69 6e 67 20 66   we are coming f
27710 72 6f 6d 2e 20 20 49 66 20 77 65 20 61 72 65 20  rom.  If we are 
27720 63 6f 6d 69 6e 67 20 66 72 6f 6d 20 74 68 65 0a  coming from the.
27730 2a 2a 20 72 69 67 68 74 2d 6d 6f 73 74 20 63 68  ** right-most ch
27740 69 6c 64 20 70 61 67 65 20 74 68 65 6e 20 70 43  ild page then pC
27750 75 72 2d 3e 69 64 78 20 69 73 20 73 65 74 20 74  ur->idx is set t
27760 6f 20 6f 6e 65 20 6d 6f 72 65 20 74 68 61 6e 0a  o one more than.
27770 2a 2a 20 74 68 65 20 6c 61 72 67 65 73 74 20 63  ** the largest c
27780 65 6c 6c 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74  ell index..*/.st
27790 61 74 69 63 20 76 6f 69 64 20 6d 6f 76 65 54 6f  atic void moveTo
277a0 50 61 72 65 6e 74 28 42 74 43 75 72 73 6f 72 20  Parent(BtCursor 
277b0 2a 70 43 75 72 29 7b 0a 20 20 61 73 73 65 72 74  *pCur){.  assert
277c0 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
277d0 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ex(pCur) );.  as
277e0 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
277f0 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
27800 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
27810 75 72 2d 3e 69 50 61 67 65 3e 30 20 29 3b 0a 20  ur->iPage>0 );. 
27820 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61   assert( pCur->a
27830 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
27840 65 5d 20 29 3b 0a 20 20 61 73 73 65 72 74 50 61  e] );.  assertPa
27850 72 65 6e 74 49 6e 64 65 78 28 0a 20 20 20 20 70  rentIndex(.    p
27860 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
27870 2d 3e 69 50 61 67 65 2d 31 5d 2c 20 0a 20 20 20  ->iPage-1], .   
27880 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
27890 72 2d 3e 69 50 61 67 65 2d 31 5d 2c 20 0a 20 20  r->iPage-1], .  
278a0 20 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70    pCur->apPage[p
278b0 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 70 67 6e  Cur->iPage]->pgn
278c0 6f 0a 20 20 29 3b 0a 20 20 74 65 73 74 63 61 73  o.  );.  testcas
278d0 65 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70  e( pCur->aiIdx[p
278e0 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d 20 3e 20  Cur->iPage-1] > 
278f0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
27900 72 2d 3e 69 50 61 67 65 2d 31 5d 2d 3e 6e 43 65  r->iPage-1]->nCe
27910 6c 6c 20 29 3b 0a 20 20 70 43 75 72 2d 3e 69 6e  ll );.  pCur->in
27920 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20  fo.nSize = 0;.  
27930 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26  pCur->curFlags &
27940 3d 20 7e 28 42 54 43 46 5f 56 61 6c 69 64 4e 4b  = ~(BTCF_ValidNK
27950 65 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66  ey|BTCF_ValidOvf
27960 6c 29 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67  l);.  releasePag
27970 65 4e 6f 74 4e 75 6c 6c 28 70 43 75 72 2d 3e 61  eNotNull(pCur->a
27980 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
27990 65 2d 2d 5d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  e--]);.}../*.** 
279a0 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20  Move the cursor 
279b0 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  to point to the 
279c0 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 69 74 73  root page of its
279d0 20 62 2d 74 72 65 65 20 73 74 72 75 63 74 75 72   b-tree structur
279e0 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
279f0 74 61 62 6c 65 20 68 61 73 20 61 20 76 69 72 74  table has a virt
27a00 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 2c 20 74  ual root page, t
27a10 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20 69  hen the cursor i
27a20 73 20 6d 6f 76 65 64 20 74 6f 20 70 6f 69 6e 74  s moved to point
27a30 0a 2a 2a 20 74 6f 20 74 68 65 20 76 69 72 74 75  .** to the virtu
27a40 61 6c 20 72 6f 6f 74 20 70 61 67 65 20 69 6e 73  al root page ins
27a50 74 65 61 64 20 6f 66 20 74 68 65 20 61 63 74 75  tead of the actu
27a60 61 6c 20 72 6f 6f 74 20 70 61 67 65 2e 20 41 20  al root page. A 
27a70 74 61 62 6c 65 20 68 61 73 20 61 0a 2a 2a 20 76  table has a.** v
27a80 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65  irtual root page
27a90 20 77 68 65 6e 20 74 68 65 20 61 63 74 75 61 6c   when the actual
27aa0 20 72 6f 6f 74 20 70 61 67 65 20 63 6f 6e 74 61   root page conta
27ab0 69 6e 73 20 6e 6f 20 63 65 6c 6c 73 20 61 6e 64  ins no cells and
27ac0 20 61 20 0a 2a 2a 20 73 69 6e 67 6c 65 20 63 68   a .** single ch
27ad0 69 6c 64 20 70 61 67 65 2e 20 54 68 69 73 20 63  ild page. This c
27ae0 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 77  an only happen w
27af0 69 74 68 20 74 68 65 20 74 61 62 6c 65 20 72 6f  ith the table ro
27b00 6f 74 65 64 20 61 74 20 70 61 67 65 20 31 2e 0a  oted at page 1..
27b10 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 62 2d 74  **.** If the b-t
27b20 72 65 65 20 73 74 72 75 63 74 75 72 65 20 69 73  ree structure is
27b30 20 65 6d 70 74 79 2c 20 74 68 65 20 63 75 72 73   empty, the curs
27b40 6f 72 20 73 74 61 74 65 20 69 73 20 73 65 74 20  or state is set 
27b50 74 6f 20 0a 2a 2a 20 43 55 52 53 4f 52 5f 49 4e  to .** CURSOR_IN
27b60 56 41 4c 49 44 2e 20 4f 74 68 65 72 77 69 73 65  VALID. Otherwise
27b70 2c 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  , the cursor is 
27b80 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  set to point to 
27b90 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 63 65 6c  the first.** cel
27ba0 6c 20 6c 6f 63 61 74 65 64 20 6f 6e 20 74 68 65  l located on the
27bb0 20 72 6f 6f 74 20 28 6f 72 20 76 69 72 74 75 61   root (or virtua
27bc0 6c 20 72 6f 6f 74 29 20 70 61 67 65 20 61 6e 64  l root) page and
27bd0 20 74 68 65 20 63 75 72 73 6f 72 20 73 74 61 74   the cursor stat
27be0 65 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 43  e.** is set to C
27bf0 55 52 53 4f 52 5f 56 41 4c 49 44 2e 0a 2a 2a 0a  URSOR_VALID..**.
27c00 2a 2a 20 49 66 20 74 68 69 73 20 66 75 6e 63 74  ** If this funct
27c10 69 6f 6e 20 72 65 74 75 72 6e 73 20 73 75 63 63  ion returns succ
27c20 65 73 73 66 75 6c 6c 79 2c 20 69 74 20 6d 61 79  essfully, it may
27c30 20 62 65 20 61 73 73 75 6d 65 64 20 74 68 61 74   be assumed that
27c40 20 74 68 65 0a 2a 2a 20 70 61 67 65 2d 68 65 61   the.** page-hea
27c50 64 65 72 20 66 6c 61 67 73 20 69 6e 64 69 63 61  der flags indica
27c60 74 65 20 74 68 61 74 20 74 68 65 20 5b 76 69 72  te that the [vir
27c70 74 75 61 6c 5d 20 72 6f 6f 74 2d 70 61 67 65 20  tual] root-page 
27c80 69 73 20 74 68 65 20 65 78 70 65 63 74 65 64 20  is the expected 
27c90 0a 2a 2a 20 6b 69 6e 64 20 6f 66 20 62 2d 74 72  .** kind of b-tr
27ca0 65 65 20 70 61 67 65 20 28 69 2e 65 2e 20 69 66  ee page (i.e. if
27cb0 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20 74 68   when opening th
27cc0 65 20 63 75 72 73 6f 72 20 74 68 65 20 63 61 6c  e cursor the cal
27cd0 6c 65 72 20 64 69 64 20 6e 6f 74 0a 2a 2a 20 73  ler did not.** s
27ce0 70 65 63 69 66 79 20 61 20 4b 65 79 49 6e 66 6f  pecify a KeyInfo
27cf0 20 73 74 72 75 63 74 75 72 65 20 74 68 65 20 66   structure the f
27d00 6c 61 67 73 20 62 79 74 65 20 69 73 20 73 65 74  lags byte is set
27d10 20 74 6f 20 30 78 30 35 20 6f 72 20 30 78 30 44   to 0x05 or 0x0D
27d20 2c 0a 2a 2a 20 69 6e 64 69 63 61 74 69 6e 67 20  ,.** indicating 
27d30 61 20 74 61 62 6c 65 20 62 2d 74 72 65 65 2c 20  a table b-tree, 
27d40 6f 72 20 69 66 20 74 68 65 20 63 61 6c 6c 65 72  or if the caller
27d50 20 64 69 64 20 73 70 65 63 69 66 79 20 61 20 4b   did specify a K
27d60 65 79 49 6e 66 6f 20 0a 2a 2a 20 73 74 72 75 63  eyInfo .** struc
27d70 74 75 72 65 20 74 68 65 20 66 6c 61 67 73 20 62  ture the flags b
27d80 79 74 65 20 69 73 20 73 65 74 20 74 6f 20 30 78  yte is set to 0x
27d90 30 32 20 6f 72 20 30 78 30 41 2c 20 69 6e 64 69  02 or 0x0A, indi
27da0 63 61 74 69 6e 67 20 61 6e 20 69 6e 64 65 78 0a  cating an index.
27db0 2a 2a 20 62 2d 74 72 65 65 29 2e 0a 2a 2f 0a 73  ** b-tree)..*/.s
27dc0 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f  tatic int moveTo
27dd0 52 6f 6f 74 28 42 74 43 75 72 73 6f 72 20 2a 70  Root(BtCursor *p
27de0 43 75 72 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20  Cur){.  MemPage 
27df0 2a 70 52 6f 6f 74 3b 0a 20 20 69 6e 74 20 72 63  *pRoot;.  int rc
27e00 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
27e10 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
27e20 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
27e30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55 52  );.  assert( CUR
27e40 53 4f 52 5f 49 4e 56 41 4c 49 44 20 3c 20 43 55  SOR_INVALID < CU
27e50 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b  RSOR_REQUIRESEEK
27e60 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55   );.  assert( CU
27e70 52 53 4f 52 5f 56 41 4c 49 44 20 20 20 3c 20 43  RSOR_VALID   < C
27e80 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45  URSOR_REQUIRESEE
27e90 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43  K );.  assert( C
27ea0 55 52 53 4f 52 5f 46 41 55 4c 54 20 20 20 3e 20  URSOR_FAULT   > 
27eb0 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45  CURSOR_REQUIRESE
27ec0 45 4b 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72  EK );.  if( pCur
27ed0 2d 3e 65 53 74 61 74 65 3e 3d 43 55 52 53 4f 52  ->eState>=CURSOR
27ee0 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29 7b 0a  _REQUIRESEEK ){.
27ef0 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53      if( pCur->eS
27f00 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 46 41 55  tate==CURSOR_FAU
27f10 4c 54 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  LT ){.      asse
27f20 72 74 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65  rt( pCur->skipNe
27f30 78 74 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  xt!=SQLITE_OK );
27f40 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 43  .      return pC
27f50 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3b 0a 20 20  ur->skipNext;.  
27f60 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 42    }.    sqlite3B
27f70 74 72 65 65 43 6c 65 61 72 43 75 72 73 6f 72 28  treeClearCursor(
27f80 70 43 75 72 29 3b 0a 20 20 7d 0a 0a 20 20 69 66  pCur);.  }..  if
27f90 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30  ( pCur->iPage>=0
27fa0 20 29 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 70   ){.    while( p
27fb0 43 75 72 2d 3e 69 50 61 67 65 20 29 7b 0a 20 20  Cur->iPage ){.  
27fc0 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
27fd0 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
27fe0 50 61 67 65 5d 21 3d 30 20 29 3b 0a 20 20 20 20  Page]!=0 );.    
27ff0 20 20 72 65 6c 65 61 73 65 50 61 67 65 4e 6f 74    releasePageNot
28000 4e 75 6c 6c 28 70 43 75 72 2d 3e 61 70 50 61 67  Null(pCur->apPag
28010 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 2d 5d  e[pCur->iPage--]
28020 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
28030 20 69 66 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52   if( pCur->pgnoR
28040 6f 6f 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 43  oot==0 ){.    pC
28050 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
28060 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20  SOR_INVALID;.   
28070 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
28080 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  K;.  }else{.    
28090 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50  assert( pCur->iP
280a0 61 67 65 3d 3d 28 2d 31 29 20 29 3b 0a 20 20 20  age==(-1) );.   
280b0 20 72 63 20 3d 20 67 65 74 41 6e 64 49 6e 69 74   rc = getAndInit
280c0 50 61 67 65 28 70 43 75 72 2d 3e 70 42 74 72 65  Page(pCur->pBtre
280d0 65 2d 3e 70 42 74 2c 20 70 43 75 72 2d 3e 70 67  e->pBt, pCur->pg
280e0 6e 6f 52 6f 6f 74 2c 20 26 70 43 75 72 2d 3e 61  noRoot, &pCur->a
280f0 70 50 61 67 65 5b 30 5d 2c 0a 20 20 20 20 20 20  pPage[0],.      
28100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28110 20 20 30 2c 20 70 43 75 72 2d 3e 63 75 72 50 61    0, pCur->curPa
28120 67 65 72 46 6c 61 67 73 29 3b 0a 20 20 20 20 69  gerFlags);.    i
28130 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
28140 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e   ){.      pCur->
28150 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
28160 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 72  INVALID;.      r
28170 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
28180 20 20 20 20 70 43 75 72 2d 3e 69 50 61 67 65 20      pCur->iPage 
28190 3d 20 30 3b 0a 20 20 20 20 70 43 75 72 2d 3e 63  = 0;.    pCur->c
281a0 75 72 49 6e 74 4b 65 79 20 3d 20 70 43 75 72 2d  urIntKey = pCur-
281b0 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b  >apPage[0]->intK
281c0 65 79 3b 0a 20 20 7d 0a 20 20 70 52 6f 6f 74 20  ey;.  }.  pRoot 
281d0 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30  = pCur->apPage[0
281e0 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 52 6f  ];.  assert( pRo
281f0 6f 74 2d 3e 70 67 6e 6f 3d 3d 70 43 75 72 2d 3e  ot->pgno==pCur->
28200 70 67 6e 6f 52 6f 6f 74 20 29 3b 0a 0a 20 20 2f  pgnoRoot );..  /
28210 2a 20 49 66 20 70 43 75 72 2d 3e 70 4b 65 79 49  * If pCur->pKeyI
28220 6e 66 6f 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c  nfo is not NULL,
28230 20 74 68 65 6e 20 74 68 65 20 63 61 6c 6c 65 72   then the caller
28240 20 74 68 61 74 20 6f 70 65 6e 65 64 20 74 68 69   that opened thi
28250 73 20 63 75 72 73 6f 72 0a 20 20 2a 2a 20 65 78  s cursor.  ** ex
28260 70 65 63 74 65 64 20 74 6f 20 6f 70 65 6e 20 69  pected to open i
28270 74 20 6f 6e 20 61 6e 20 69 6e 64 65 78 20 62 2d  t on an index b-
28280 74 72 65 65 2e 20 4f 74 68 65 72 77 69 73 65 2c  tree. Otherwise,
28290 20 69 66 20 70 4b 65 79 49 6e 66 6f 20 69 73 0a   if pKeyInfo is.
282a0 20 20 2a 2a 20 4e 55 4c 4c 2c 20 74 68 65 20 63    ** NULL, the c
282b0 61 6c 6c 65 72 20 65 78 70 65 63 74 73 20 61 20  aller expects a 
282c0 74 61 62 6c 65 20 62 2d 74 72 65 65 2e 20 49 66  table b-tree. If
282d0 20 74 68 69 73 20 69 73 20 6e 6f 74 20 74 68 65   this is not the
282e0 20 63 61 73 65 2c 0a 20 20 2a 2a 20 72 65 74 75   case,.  ** retu
282f0 72 6e 20 61 6e 20 53 51 4c 49 54 45 5f 43 4f 52  rn an SQLITE_COR
28300 52 55 50 54 20 65 72 72 6f 72 2e 20 0a 20 20 2a  RUPT error. .  *
28310 2a 0a 20 20 2a 2a 20 45 61 72 6c 69 65 72 20 76  *.  ** Earlier v
28320 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74  ersions of SQLit
28330 65 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74  e assumed that t
28340 68 69 73 20 74 65 73 74 20 63 6f 75 6c 64 20 6e  his test could n
28350 6f 74 20 66 61 69 6c 0a 20 20 2a 2a 20 69 66 20  ot fail.  ** if 
28360 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 77 61  the root page wa
28370 73 20 61 6c 72 65 61 64 79 20 6c 6f 61 64 65 64  s already loaded
28380 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
28390 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64 20 28  ion was called (
283a0 69 2e 65 2e 0a 20 20 2a 2a 20 69 66 20 70 43 75  i.e..  ** if pCu
283b0 72 2d 3e 69 50 61 67 65 3e 3d 30 29 2e 20 42 75  r->iPage>=0). Bu
283c0 74 20 74 68 69 73 20 69 73 20 6e 6f 74 20 73 6f  t this is not so
283d0 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
283e0 20 69 73 20 63 6f 72 72 75 70 74 65 64 20 0a 20   is corrupted . 
283f0 20 2a 2a 20 69 6e 20 73 75 63 68 20 61 20 77 61   ** in such a wa
28400 79 20 74 68 61 74 20 70 61 67 65 20 70 52 6f 6f  y that page pRoo
28410 74 20 69 73 20 6c 69 6e 6b 65 64 20 69 6e 74 6f  t is linked into
28420 20 61 20 73 65 63 6f 6e 64 20 62 2d 74 72 65 65   a second b-tree
28430 20 74 61 62 6c 65 20 0a 20 20 2a 2a 20 28 6f 72   table .  ** (or
28440 20 74 68 65 20 66 72 65 65 6c 69 73 74 29 2e 20   the freelist). 
28450 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 52   */.  assert( pR
28460 6f 6f 74 2d 3e 69 6e 74 4b 65 79 3d 3d 31 20 7c  oot->intKey==1 |
28470 7c 20 70 52 6f 6f 74 2d 3e 69 6e 74 4b 65 79 3d  | pRoot->intKey=
28480 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 52 6f 6f  =0 );.  if( pRoo
28490 74 2d 3e 69 73 49 6e 69 74 3d 3d 30 20 7c 7c 20  t->isInit==0 || 
284a0 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d  (pCur->pKeyInfo=
284b0 3d 30 29 21 3d 70 52 6f 6f 74 2d 3e 69 6e 74 4b  =0)!=pRoot->intK
284c0 65 79 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ey ){.    return
284d0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
284e0 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 70 43 75  BKPT;.  }..  pCu
284f0 72 2d 3e 61 69 49 64 78 5b 30 5d 20 3d 20 30 3b  r->aiIdx[0] = 0;
28500 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53  .  pCur->info.nS
28510 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d  ize = 0;.  pCur-
28520 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 28 42  >curFlags &= ~(B
28530 54 43 46 5f 41 74 4c 61 73 74 7c 42 54 43 46 5f  TCF_AtLast|BTCF_
28540 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56  ValidNKey|BTCF_V
28550 61 6c 69 64 4f 76 66 6c 29 3b 0a 0a 20 20 69 66  alidOvfl);..  if
28560 28 20 70 52 6f 6f 74 2d 3e 6e 43 65 6c 6c 3e 30  ( pRoot->nCell>0
28570 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53   ){.    pCur->eS
28580 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 56 41  tate = CURSOR_VA
28590 4c 49 44 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  LID;.  }else if(
285a0 20 21 70 52 6f 6f 74 2d 3e 6c 65 61 66 20 29 7b   !pRoot->leaf ){
285b0 0a 20 20 20 20 50 67 6e 6f 20 73 75 62 70 61 67  .    Pgno subpag
285c0 65 3b 0a 20 20 20 20 69 66 28 20 70 52 6f 6f 74  e;.    if( pRoot
285d0 2d 3e 70 67 6e 6f 21 3d 31 20 29 20 72 65 74 75  ->pgno!=1 ) retu
285e0 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
285f0 54 5f 42 4b 50 54 3b 0a 20 20 20 20 73 75 62 70  T_BKPT;.    subp
28600 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 26  age = get4byte(&
28610 70 52 6f 6f 74 2d 3e 61 44 61 74 61 5b 70 52 6f  pRoot->aData[pRo
28620 6f 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  ot->hdrOffset+8]
28630 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74  );.    pCur->eSt
28640 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c  ate = CURSOR_VAL
28650 49 44 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76  ID;.    rc = mov
28660 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 73  eToChild(pCur, s
28670 75 62 70 61 67 65 29 3b 0a 20 20 7d 65 6c 73 65  ubpage);.  }else
28680 7b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61  {.    pCur->eSta
28690 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41  te = CURSOR_INVA
286a0 4c 49 44 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  LID;.  }.  retur
286b0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  n rc;.}../*.** M
286c0 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 64  ove the cursor d
286d0 6f 77 6e 20 74 6f 20 74 68 65 20 6c 65 66 74 2d  own to the left-
286e0 6d 6f 73 74 20 6c 65 61 66 20 65 6e 74 72 79 20  most leaf entry 
286f0 62 65 6e 65 61 74 68 20 74 68 65 0a 2a 2a 20 65  beneath the.** e
28700 6e 74 72 79 20 74 6f 20 77 68 69 63 68 20 69 74  ntry to which it
28710 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f   is currently po
28720 69 6e 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68  inting..**.** Th
28730 65 20 6c 65 66 74 2d 6d 6f 73 74 20 6c 65 61 66  e left-most leaf
28740 20 69 73 20 74 68 65 20 6f 6e 65 20 77 69 74 68   is the one with
28750 20 74 68 65 20 73 6d 61 6c 6c 65 73 74 20 6b 65   the smallest ke
28760 79 20 2d 20 74 68 65 20 66 69 72 73 74 0a 2a 2a  y - the first.**
28770 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72   in ascending or
28780 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  der..*/.static i
28790 6e 74 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73  nt moveToLeftmos
287a0 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  t(BtCursor *pCur
287b0 29 7b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a  ){.  Pgno pgno;.
287c0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
287d0 45 5f 4f 4b 3b 0a 20 20 4d 65 6d 50 61 67 65 20  E_OK;.  MemPage 
287e0 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72  *pPage;..  asser
287f0 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
28800 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61  tex(pCur) );.  a
28810 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
28820 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
28830 44 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 72 63  D );.  while( rc
28840 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21  ==SQLITE_OK && !
28850 28 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61  (pPage = pCur->a
28860 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
28870 65 5d 29 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  e])->leaf ){.   
28880 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61   assert( pCur->a
28890 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
288a0 5d 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29  ]<pPage->nCell )
288b0 3b 0a 20 20 20 20 70 67 6e 6f 20 3d 20 67 65 74  ;.    pgno = get
288c0 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70  4byte(findCell(p
288d0 50 61 67 65 2c 20 70 43 75 72 2d 3e 61 69 49 64  Page, pCur->aiId
288e0 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 29  x[pCur->iPage]))
288f0 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54  ;.    rc = moveT
28900 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 70 67 6e  oChild(pCur, pgn
28910 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  o);.  }.  return
28920 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f   rc;.}../*.** Mo
28930 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 64 6f  ve the cursor do
28940 77 6e 20 74 6f 20 74 68 65 20 72 69 67 68 74 2d  wn to the right-
28950 6d 6f 73 74 20 6c 65 61 66 20 65 6e 74 72 79 20  most leaf entry 
28960 62 65 6e 65 61 74 68 20 74 68 65 0a 2a 2a 20 70  beneath the.** p
28970 61 67 65 20 74 6f 20 77 68 69 63 68 20 69 74 20  age to which it 
28980 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69  is currently poi
28990 6e 74 69 6e 67 2e 20 20 4e 6f 74 69 63 65 20 74  nting.  Notice t
289a0 68 65 20 64 69 66 66 65 72 65 6e 63 65 0a 2a 2a  he difference.**
289b0 20 62 65 74 77 65 65 6e 20 6d 6f 76 65 54 6f 4c   between moveToL
289c0 65 66 74 6d 6f 73 74 28 29 20 61 6e 64 20 6d 6f  eftmost() and mo
289d0 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 29 2e  veToRightmost().
289e0 20 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74    moveToLeftmost
289f0 28 29 0a 2a 2a 20 66 69 6e 64 73 20 74 68 65 20  ().** finds the 
28a00 6c 65 66 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20  left-most entry 
28a10 62 65 6e 65 61 74 68 20 74 68 65 20 2a 65 6e 74  beneath the *ent
28a20 72 79 2a 20 77 68 65 72 65 61 73 20 6d 6f 76 65  ry* whereas move
28a30 54 6f 52 69 67 68 74 6d 6f 73 74 28 29 0a 2a 2a  ToRightmost().**
28a40 20 66 69 6e 64 73 20 74 68 65 20 72 69 67 68 74   finds the right
28a50 2d 6d 6f 73 74 20 65 6e 74 72 79 20 62 65 6e 65  -most entry bene
28a60 61 74 68 20 74 68 65 20 2a 70 61 67 65 2a 2e 0a  ath the *page*..
28a70 2a 2a 0a 2a 2a 20 54 68 65 20 72 69 67 68 74 2d  **.** The right-
28a80 6d 6f 73 74 20 65 6e 74 72 79 20 69 73 20 74 68  most entry is th
28a90 65 20 6f 6e 65 20 77 69 74 68 20 74 68 65 20 6c  e one with the l
28aa0 61 72 67 65 73 74 20 6b 65 79 20 2d 20 74 68 65  argest key - the
28ab0 20 6c 61 73 74 0a 2a 2a 20 6b 65 79 20 69 6e 20   last.** key in 
28ac0 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e  ascending order.
28ad0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d  .*/.static int m
28ae0 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 42  oveToRightmost(B
28af0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
28b00 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 69    Pgno pgno;.  i
28b10 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
28b20 4b 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  K;.  MemPage *pP
28b30 61 67 65 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65  age = 0;..  asse
28b40 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
28b50 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
28b60 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
28b70 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
28b80 49 44 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 21  ID );.  while( !
28b90 28 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61  (pPage = pCur->a
28ba0 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
28bb0 65 5d 29 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  e])->leaf ){.   
28bc0 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65   pgno = get4byte
28bd0 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  (&pPage->aData[p
28be0 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
28bf0 38 5d 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 61  8]);.    pCur->a
28c00 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
28c10 5d 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ] = pPage->nCell
28c20 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54  ;.    rc = moveT
28c30 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 70 67 6e  oChild(pCur, pgn
28c40 6f 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  o);.    if( rc )
28c50 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
28c60 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43    pCur->aiIdx[pC
28c70 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 70 50 61  ur->iPage] = pPa
28c80 67 65 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a 20 20 61  ge->nCell-1;.  a
28c90 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 6e 66  ssert( pCur->inf
28ca0 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 3b 0a 20 20  o.nSize==0 );.  
28cb0 61 73 73 65 72 74 28 20 28 70 43 75 72 2d 3e 63  assert( (pCur->c
28cc0 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 56  urFlags & BTCF_V
28cd0 61 6c 69 64 4e 4b 65 79 29 3d 3d 30 20 29 3b 0a  alidNKey)==0 );.
28ce0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
28cf0 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74  OK;.}../* Move t
28d00 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65  he cursor to the
28d10 20 66 69 72 73 74 20 65 6e 74 72 79 20 69 6e 20   first entry in 
28d20 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74 75  the table.  Retu
28d30 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20  rn SQLITE_OK.** 
28d40 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 53 65 74  on success.  Set
28d50 20 2a 70 52 65 73 20 74 6f 20 30 20 69 66 20 74   *pRes to 0 if t
28d60 68 65 20 63 75 72 73 6f 72 20 61 63 74 75 61 6c  he cursor actual
28d70 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 73 6f 6d  ly points to som
28d80 65 74 68 69 6e 67 0a 2a 2a 20 6f 72 20 73 65 74  ething.** or set
28d90 20 2a 70 52 65 73 20 74 6f 20 31 20 69 66 20 74   *pRes to 1 if t
28da0 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74  he table is empt
28db0 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  y..*/.int sqlite
28dc0 33 42 74 72 65 65 46 69 72 73 74 28 42 74 43 75  3BtreeFirst(BtCu
28dd0 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20  rsor *pCur, int 
28de0 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63  *pRes){.  int rc
28df0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ;..  assert( cur
28e00 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
28e10 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
28e20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
28e30 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65  eld(pCur->pBtree
28e40 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  ->db->mutex) );.
28e50 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f    rc = moveToRoo
28e60 74 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72  t(pCur);.  if( r
28e70 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
28e80 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53      if( pCur->eS
28e90 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56  tate==CURSOR_INV
28ea0 41 4c 49 44 20 29 7b 0a 20 20 20 20 20 20 61 73  ALID ){.      as
28eb0 73 65 72 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f  sert( pCur->pgno
28ec0 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d  Root==0 || pCur-
28ed0 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
28ee0 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29  age]->nCell==0 )
28ef0 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20  ;.      *pRes = 
28f00 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  1;.    }else{.  
28f10 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
28f20 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
28f30 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3e 30 20 29  Page]->nCell>0 )
28f40 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20  ;.      *pRes = 
28f50 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 6f  0;.      rc = mo
28f60 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75  veToLeftmost(pCu
28f70 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  r);.    }.  }.  
28f80 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
28f90 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72   Move the cursor
28fa0 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74   to the last ent
28fb0 72 79 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e  ry in the table.
28fc0 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
28fd0 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73  OK.** on success
28fe0 2e 20 20 53 65 74 20 2a 70 52 65 73 20 74 6f 20  .  Set *pRes to 
28ff0 30 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20  0 if the cursor 
29000 61 63 74 75 61 6c 6c 79 20 70 6f 69 6e 74 73 20  actually points 
29010 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20  to something.** 
29020 6f 72 20 73 65 74 20 2a 70 52 65 73 20 74 6f 20  or set *pRes to 
29030 31 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 69  1 if the table i
29040 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20  s empty..*/.int 
29050 73 71 6c 69 74 65 33 42 74 72 65 65 4c 61 73 74  sqlite3BtreeLast
29060 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
29070 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69   int *pRes){.  i
29080 6e 74 20 72 63 3b 0a 20 0a 20 20 61 73 73 65 72  nt rc;. .  asser
29090 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
290a0 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61  tex(pCur) );.  a
290b0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
290c0 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e  utex_held(pCur->
290d0 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65  pBtree->db->mute
290e0 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  x) );..  /* If t
290f0 68 65 20 63 75 72 73 6f 72 20 61 6c 72 65 61 64  he cursor alread
29100 79 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  y points to the 
29110 6c 61 73 74 20 65 6e 74 72 79 2c 20 74 68 69 73  last entry, this
29120 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 2a 2f 0a   is a no-op. */.
29130 20 20 69 66 28 20 43 55 52 53 4f 52 5f 56 41 4c    if( CURSOR_VAL
29140 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65  ID==pCur->eState
29150 20 26 26 20 28 70 43 75 72 2d 3e 63 75 72 46 6c   && (pCur->curFl
29160 61 67 73 20 26 20 42 54 43 46 5f 41 74 4c 61 73  ags & BTCF_AtLas
29170 74 29 21 3d 30 20 29 7b 0a 23 69 66 64 65 66 20  t)!=0 ){.#ifdef 
29180 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20  SQLITE_DEBUG.   
29190 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20 73   /* This block s
291a0 65 72 76 65 73 20 74 6f 20 61 73 73 65 72 74 28  erves to assert(
291b0 29 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f  ) that the curso
291c0 72 20 72 65 61 6c 6c 79 20 64 6f 65 73 20 70 6f  r really does po
291d0 69 6e 74 20 0a 20 20 20 20 2a 2a 20 74 6f 20 74  int .    ** to t
291e0 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e  he last entry in
291f0 20 74 68 65 20 62 2d 74 72 65 65 2e 20 2a 2f 0a   the b-tree. */.
29200 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20      int ii;.    
29210 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 43 75  for(ii=0; ii<pCu
29220 72 2d 3e 69 50 61 67 65 3b 20 69 69 2b 2b 29 7b  r->iPage; ii++){
29230 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
29240 43 75 72 2d 3e 61 69 49 64 78 5b 69 69 5d 3d 3d  Cur->aiIdx[ii]==
29250 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 69 5d  pCur->apPage[ii]
29260 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 7d  ->nCell );.    }
29270 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75  .    assert( pCu
29280 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
29290 50 61 67 65 5d 3d 3d 70 43 75 72 2d 3e 61 70 50  Page]==pCur->apP
292a0 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
292b0 2d 3e 6e 43 65 6c 6c 2d 31 20 29 3b 0a 20 20 20  ->nCell-1 );.   
292c0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61   assert( pCur->a
292d0 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
292e0 65 5d 2d 3e 6c 65 61 66 20 29 3b 0a 23 65 6e 64  e]->leaf );.#end
292f0 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  if.    return SQ
29300 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20  LITE_OK;.  }..  
29310 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28  rc = moveToRoot(
29320 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d  pCur);.  if( rc=
29330 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
29340 20 20 69 66 28 20 43 55 52 53 4f 52 5f 49 4e 56    if( CURSOR_INV
29350 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61  ALID==pCur->eSta
29360 74 65 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  te ){.      asse
29370 72 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f  rt( pCur->pgnoRo
29380 6f 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 61  ot==0 || pCur->a
29390 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
293a0 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a  e]->nCell==0 );.
293b0 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b        *pRes = 1;
293c0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
293d0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
293e0 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
293f0 41 4c 49 44 20 29 3b 0a 20 20 20 20 20 20 2a 70  ALID );.      *p
29400 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  Res = 0;.      r
29410 63 20 3d 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d  c = moveToRightm
29420 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 20 20 20  ost(pCur);.     
29430 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
29440 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43  OK ){.        pC
29450 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20  ur->curFlags |= 
29460 42 54 43 46 5f 41 74 4c 61 73 74 3b 0a 20 20 20  BTCF_AtLast;.   
29470 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
29480 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73    pCur->curFlags
29490 20 26 3d 20 7e 42 54 43 46 5f 41 74 4c 61 73 74   &= ~BTCF_AtLast
294a0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 0a 20 20  ;.      }.   .  
294b0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
294c0 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20   rc;.}../* Move 
294d0 74 68 65 20 63 75 72 73 6f 72 20 73 6f 20 74 68  the cursor so th
294e0 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20  at it points to 
294f0 61 6e 20 65 6e 74 72 79 20 6e 65 61 72 20 74 68  an entry near th
29500 65 20 6b 65 79 20 0a 2a 2a 20 73 70 65 63 69 66  e key .** specif
29510 69 65 64 20 62 79 20 70 49 64 78 4b 65 79 20 6f  ied by pIdxKey o
29520 72 20 69 6e 74 4b 65 79 2e 20 20 20 52 65 74 75  r intKey.   Retu
29530 72 6e 20 61 20 73 75 63 63 65 73 73 20 63 6f 64  rn a success cod
29540 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 49 4e 54  e..**.** For INT
29550 4b 45 59 20 74 61 62 6c 65 73 2c 20 74 68 65 20  KEY tables, the 
29560 69 6e 74 4b 65 79 20 70 61 72 61 6d 65 74 65 72  intKey parameter
29570 20 69 73 20 75 73 65 64 2e 20 20 70 49 64 78 4b   is used.  pIdxK
29580 65 79 20 0a 2a 2a 20 6d 75 73 74 20 62 65 20 4e  ey .** must be N
29590 55 4c 4c 2e 20 20 46 6f 72 20 69 6e 64 65 78 20  ULL.  For index 
295a0 74 61 62 6c 65 73 2c 20 70 49 64 78 4b 65 79 20  tables, pIdxKey 
295b0 69 73 20 75 73 65 64 20 61 6e 64 20 69 6e 74 4b  is used and intK
295c0 65 79 0a 2a 2a 20 69 73 20 69 67 6e 6f 72 65 64  ey.** is ignored
295d0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 78  ..**.** If an ex
295e0 61 63 74 20 6d 61 74 63 68 20 69 73 20 6e 6f 74  act match is not
295f0 20 66 6f 75 6e 64 2c 20 74 68 65 6e 20 74 68 65   found, then the
29600 20 63 75 72 73 6f 72 20 69 73 20 61 6c 77 61 79   cursor is alway
29610 73 0a 2a 2a 20 6c 65 66 74 20 70 6f 69 6e 74 69  s.** left pointi
29620 6e 67 20 61 74 20 61 20 6c 65 61 66 20 70 61 67  ng at a leaf pag
29630 65 20 77 68 69 63 68 20 77 6f 75 6c 64 20 68 6f  e which would ho
29640 6c 64 20 74 68 65 20 65 6e 74 72 79 20 69 66 20  ld the entry if 
29650 69 74 0a 2a 2a 20 77 65 72 65 20 70 72 65 73 65  it.** were prese
29660 6e 74 2e 20 20 54 68 65 20 63 75 72 73 6f 72 20  nt.  The cursor 
29670 6d 69 67 68 74 20 70 6f 69 6e 74 20 74 6f 20 61  might point to a
29680 6e 20 65 6e 74 72 79 20 74 68 61 74 20 63 6f 6d  n entry that com
29690 65 73 0a 2a 2a 20 62 65 66 6f 72 65 20 6f 72 20  es.** before or 
296a0 61 66 74 65 72 20 74 68 65 20 6b 65 79 2e 0a 2a  after the key..*
296b0 2a 0a 2a 2a 20 41 6e 20 69 6e 74 65 67 65 72 20  *.** An integer 
296c0 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  is written into 
296d0 2a 70 52 65 73 20 77 68 69 63 68 20 69 73 20 74  *pRes which is t
296e0 68 65 20 72 65 73 75 6c 74 20 6f 66 0a 2a 2a 20  he result of.** 
296f0 63 6f 6d 70 61 72 69 6e 67 20 74 68 65 20 6b 65  comparing the ke
29700 79 20 77 69 74 68 20 74 68 65 20 65 6e 74 72 79  y with the entry
29710 20 74 6f 20 77 68 69 63 68 20 74 68 65 20 63 75   to which the cu
29720 72 73 6f 72 20 69 73 20 0a 2a 2a 20 70 6f 69 6e  rsor is .** poin
29730 74 69 6e 67 2e 20 20 54 68 65 20 6d 65 61 6e 69  ting.  The meani
29740 6e 67 20 6f 66 20 74 68 65 20 69 6e 74 65 67 65  ng of the intege
29750 72 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 0a 2a  r written into.*
29760 2a 20 2a 70 52 65 73 20 69 73 20 61 73 20 66 6f  * *pRes is as fo
29770 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  llows:.**.**    
29780 20 2a 70 52 65 73 3c 30 20 20 20 20 20 20 54 68   *pRes<0      Th
29790 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74  e cursor is left
297a0 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20   pointing at an 
297b0 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20 20 20  entry that.**   
297c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
297d0 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 69  s smaller than i
297e0 6e 74 4b 65 79 2f 70 49 64 78 4b 65 79 20 6f 72  ntKey/pIdxKey or
297f0 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 69 73   if the table is
29800 20 65 6d 70 74 79 0a 2a 2a 20 20 20 20 20 20 20   empty.**       
29810 20 20 20 20 20 20 20 20 20 20 20 61 6e 64 20 74             and t
29820 68 65 20 63 75 72 73 6f 72 20 69 73 20 74 68 65  he cursor is the
29830 72 65 66 6f 72 65 20 6c 65 66 74 20 70 6f 69 6e  refore left poin
29840 74 20 74 6f 20 6e 6f 74 68 69 6e 67 2e 0a 2a 2a  t to nothing..**
29850 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73 3d 3d 30  .**     *pRes==0
29860 20 20 20 20 20 54 68 65 20 63 75 72 73 6f 72 20       The cursor 
29870 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67  is left pointing
29880 20 61 74 20 61 6e 20 65 6e 74 72 79 20 74 68 61   at an entry tha
29890 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  t.**            
298a0 20 20 20 20 20 20 65 78 61 63 74 6c 79 20 6d 61        exactly ma
298b0 74 63 68 65 73 20 69 6e 74 4b 65 79 2f 70 49 64  tches intKey/pId
298c0 78 4b 65 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  xKey..**.**     
298d0 2a 70 52 65 73 3e 30 20 20 20 20 20 20 54 68 65  *pRes>0      The
298e0 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20   cursor is left 
298f0 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65  pointing at an e
29900 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20 20 20 20  ntry that.**    
29910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73                is
29920 20 6c 61 72 67 65 72 20 74 68 61 6e 20 69 6e 74   larger than int
29930 4b 65 79 2f 70 49 64 78 4b 65 79 2e 0a 2a 2a 0a  Key/pIdxKey..**.
29940 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
29950 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65  reeMovetoUnpacke
29960 64 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  d(.  BtCursor *p
29970 43 75 72 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  Cur,          /*
29980 20 54 68 65 20 63 75 72 73 6f 72 20 74 6f 20 62   The cursor to b
29990 65 20 6d 6f 76 65 64 20 2a 2f 0a 20 20 55 6e 70  e moved */.  Unp
299a0 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 49 64  ackedRecord *pId
299b0 78 4b 65 79 2c 20 2f 2a 20 55 6e 70 61 63 6b 65  xKey, /* Unpacke
299c0 64 20 69 6e 64 65 78 20 6b 65 79 20 2a 2f 0a 20  d index key */. 
299d0 20 69 36 34 20 69 6e 74 4b 65 79 2c 20 20 20 20   i64 intKey,    
299e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
299f0 20 74 61 62 6c 65 20 6b 65 79 20 2a 2f 0a 20 20   table key */.  
29a00 69 6e 74 20 62 69 61 73 52 69 67 68 74 2c 20 20  int biasRight,  
29a10 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74           /* If t
29a20 72 75 65 2c 20 62 69 61 73 20 74 68 65 20 73 65  rue, bias the se
29a30 61 72 63 68 20 74 6f 20 74 68 65 20 68 69 67 68  arch to the high
29a40 20 65 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 70   end */.  int *p
29a50 52 65 73 20 20 20 20 20 20 20 20 20 20 20 20 20  Res             
29a60 20 20 20 2f 2a 20 57 72 69 74 65 20 73 65 61 72     /* Write sear
29a70 63 68 20 72 65 73 75 6c 74 73 20 68 65 72 65 20  ch results here 
29a80 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  */.){.  int rc;.
29a90 20 20 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 20    RecordCompare 
29aa0 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 3b 0a  xRecordCompare;.
29ab0 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
29ac0 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
29ad0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
29ae0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
29af0 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e  d(pCur->pBtree->
29b00 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
29b10 61 73 73 65 72 74 28 20 70 52 65 73 20 29 3b 0a  assert( pRes );.
29b20 20 20 61 73 73 65 72 74 28 20 28 70 49 64 78 4b    assert( (pIdxK
29b30 65 79 3d 3d 30 29 3d 3d 28 70 43 75 72 2d 3e 70  ey==0)==(pCur->p
29b40 4b 65 79 49 6e 66 6f 3d 3d 30 29 20 29 3b 0a 0a  KeyInfo==0) );..
29b50 20 20 2f 2a 20 49 66 20 74 68 65 20 63 75 72 73    /* If the curs
29b60 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 70 6f  or is already po
29b70 73 69 74 69 6f 6e 65 64 20 61 74 20 74 68 65 20  sitioned at the 
29b80 70 6f 69 6e 74 20 77 65 20 61 72 65 20 74 72 79  point we are try
29b90 69 6e 67 0a 20 20 2a 2a 20 74 6f 20 6d 6f 76 65  ing.  ** to move
29ba0 20 74 6f 2c 20 74 68 65 6e 20 6a 75 73 74 20 72   to, then just r
29bb0 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20 64 6f  eturn without do
29bc0 69 6e 67 20 61 6e 79 20 77 6f 72 6b 20 2a 2f 0a  ing any work */.
29bd0 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
29be0 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
29bf0 20 26 26 20 28 70 43 75 72 2d 3e 63 75 72 46 6c   && (pCur->curFl
29c00 61 67 73 20 26 20 42 54 43 46 5f 56 61 6c 69 64  ags & BTCF_Valid
29c10 4e 4b 65 79 29 21 3d 30 0a 20 20 20 26 26 20 70  NKey)!=0.   && p
29c20 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79 20 0a  Cur->curIntKey .
29c30 20 20 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75    ){.    if( pCu
29c40 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 69 6e  r->info.nKey==in
29c50 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 2a 70  tKey ){.      *p
29c60 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  Res = 0;.      r
29c70 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
29c80 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28  .    }.    if( (
29c90 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26  pCur->curFlags &
29ca0 20 42 54 43 46 5f 41 74 4c 61 73 74 29 21 3d 30   BTCF_AtLast)!=0
29cb0 20 26 26 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e   && pCur->info.n
29cc0 4b 65 79 3c 69 6e 74 4b 65 79 20 29 7b 0a 20 20  Key<intKey ){.  
29cd0 20 20 20 20 2a 70 52 65 73 20 3d 20 2d 31 3b 0a      *pRes = -1;.
29ce0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
29cf0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
29d00 7d 0a 0a 20 20 69 66 28 20 70 49 64 78 4b 65 79  }..  if( pIdxKey
29d10 20 29 7b 0a 20 20 20 20 78 52 65 63 6f 72 64 43   ){.    xRecordC
29d20 6f 6d 70 61 72 65 20 3d 20 73 71 6c 69 74 65 33  ompare = sqlite3
29d30 56 64 62 65 46 69 6e 64 43 6f 6d 70 61 72 65 28  VdbeFindCompare(
29d40 70 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 70 49  pIdxKey);.    pI
29d50 64 78 4b 65 79 2d 3e 65 72 72 43 6f 64 65 20 3d  dxKey->errCode =
29d60 20 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   0;.    assert( 
29d70 70 49 64 78 4b 65 79 2d 3e 64 65 66 61 75 6c 74  pIdxKey->default
29d80 5f 72 63 3d 3d 31 20 0a 20 20 20 20 20 20 20 20  _rc==1 .        
29d90 20 7c 7c 20 70 49 64 78 4b 65 79 2d 3e 64 65 66   || pIdxKey->def
29da0 61 75 6c 74 5f 72 63 3d 3d 30 20 0a 20 20 20 20  ault_rc==0 .    
29db0 20 20 20 20 20 7c 7c 20 70 49 64 78 4b 65 79 2d       || pIdxKey-
29dc0 3e 64 65 66 61 75 6c 74 5f 72 63 3d 3d 2d 31 0a  >default_rc==-1.
29dd0 20 20 20 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a      );.  }else{.
29de0 20 20 20 20 78 52 65 63 6f 72 64 43 6f 6d 70 61      xRecordCompa
29df0 72 65 20 3d 20 30 3b 20 2f 2a 20 41 6c 6c 20 6b  re = 0; /* All k
29e00 65 79 73 20 61 72 65 20 69 6e 74 65 67 65 72 73  eys are integers
29e10 20 2a 2f 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20   */.  }..  rc = 
29e20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29  moveToRoot(pCur)
29e30 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
29e40 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
29e50 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
29e60 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20  >pgnoRoot==0 || 
29e70 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
29e80 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20 61  r->iPage] );.  a
29e90 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 67 6e  ssert( pCur->pgn
29ea0 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75 72  oRoot==0 || pCur
29eb0 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
29ec0 50 61 67 65 5d 2d 3e 69 73 49 6e 69 74 20 29 3b  Page]->isInit );
29ed0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
29ee0 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
29ef0 49 4e 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d  INVALID || pCur-
29f00 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
29f10 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b  age]->nCell>0 );
29f20 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74  .  if( pCur->eSt
29f30 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41  ate==CURSOR_INVA
29f40 4c 49 44 20 29 7b 0a 20 20 20 20 2a 70 52 65 73  LID ){.    *pRes
29f50 20 3d 20 2d 31 3b 0a 20 20 20 20 61 73 73 65 72   = -1;.    asser
29f60 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f  t( pCur->pgnoRoo
29f70 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 61 70  t==0 || pCur->ap
29f80 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
29f90 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20  ]->nCell==0 );. 
29fa0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
29fb0 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  _OK;.  }.  asser
29fc0 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  t( pCur->apPage[
29fd0 30 5d 2d 3e 69 6e 74 4b 65 79 3d 3d 70 43 75 72  0]->intKey==pCur
29fe0 2d 3e 63 75 72 49 6e 74 4b 65 79 20 29 3b 0a 20  ->curIntKey );. 
29ff0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 63   assert( pCur->c
2a000 75 72 49 6e 74 4b 65 79 20 7c 7c 20 70 49 64 78  urIntKey || pIdx
2a010 4b 65 79 20 29 3b 0a 20 20 66 6f 72 28 3b 3b 29  Key );.  for(;;)
2a020 7b 0a 20 20 20 20 69 6e 74 20 6c 77 72 2c 20 75  {.    int lwr, u
2a030 70 72 2c 20 69 64 78 2c 20 63 3b 0a 20 20 20 20  pr, idx, c;.    
2a040 50 67 6e 6f 20 63 68 6c 64 50 67 3b 0a 20 20 20  Pgno chldPg;.   
2a050 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20   MemPage *pPage 
2a060 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  = pCur->apPage[p
2a070 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20  Cur->iPage];.   
2a080 20 75 38 20 2a 70 43 65 6c 6c 3b 20 20 20 20 20   u8 *pCell;     
2a090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a0a0 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
2a0b0 74 6f 20 63 75 72 72 65 6e 74 20 63 65 6c 6c 20  to current cell 
2a0c0 69 6e 20 70 50 61 67 65 20 2a 2f 0a 0a 20 20 20  in pPage */..   
2a0d0 20 2f 2a 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c   /* pPage->nCell
2a0e0 20 6d 75 73 74 20 62 65 20 67 72 65 61 74 65 72   must be greater
2a0f0 20 74 68 61 6e 20 7a 65 72 6f 2e 20 49 66 20 74   than zero. If t
2a100 68 69 73 20 69 73 20 74 68 65 20 72 6f 6f 74 2d  his is the root-
2a110 70 61 67 65 0a 20 20 20 20 2a 2a 20 74 68 65 20  page.    ** the 
2a120 63 75 72 73 6f 72 20 77 6f 75 6c 64 20 68 61 76  cursor would hav
2a130 65 20 62 65 65 6e 20 49 4e 56 41 4c 49 44 20 61  e been INVALID a
2a140 62 6f 76 65 20 61 6e 64 20 74 68 69 73 20 66 6f  bove and this fo
2a150 72 28 3b 3b 29 20 6c 6f 6f 70 0a 20 20 20 20 2a  r(;;) loop.    *
2a160 2a 20 6e 6f 74 20 72 75 6e 2e 20 49 66 20 74 68  * not run. If th
2a170 69 73 20 69 73 20 6e 6f 74 20 74 68 65 20 72 6f  is is not the ro
2a180 6f 74 2d 70 61 67 65 2c 20 74 68 65 6e 20 74 68  ot-page, then th
2a190 65 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 29 20  e moveToChild() 
2a1a0 72 6f 75 74 69 6e 65 0a 20 20 20 20 2a 2a 20 77  routine.    ** w
2a1b0 6f 75 6c 64 20 68 61 76 65 20 61 6c 72 65 61 64  ould have alread
2a1c0 79 20 64 65 74 65 63 74 65 64 20 64 62 20 63 6f  y detected db co
2a1d0 72 72 75 70 74 69 6f 6e 2e 20 53 69 6d 69 6c 61  rruption. Simila
2a1e0 72 6c 79 2c 20 70 50 61 67 65 20 6d 75 73 74 0a  rly, pPage must.
2a1f0 20 20 20 20 2a 2a 20 62 65 20 74 68 65 20 72 69      ** be the ri
2a200 67 68 74 20 6b 69 6e 64 20 28 69 6e 64 65 78 20  ght kind (index 
2a210 6f 72 20 74 61 62 6c 65 29 20 6f 66 20 62 2d 74  or table) of b-t
2a220 72 65 65 20 70 61 67 65 2e 20 4f 74 68 65 72 77  ree page. Otherw
2a230 69 73 65 0a 20 20 20 20 2a 2a 20 61 20 6d 6f 76  ise.    ** a mov
2a240 65 54 6f 43 68 69 6c 64 28 29 20 6f 72 20 6d 6f  eToChild() or mo
2a250 76 65 54 6f 52 6f 6f 74 28 29 20 63 61 6c 6c 20  veToRoot() call 
2a260 77 6f 75 6c 64 20 68 61 76 65 20 64 65 74 65 63  would have detec
2a270 74 65 64 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20  ted corruption. 
2a280 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
2a290 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 29  pPage->nCell>0 )
2a2a0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
2a2b0 61 67 65 2d 3e 69 6e 74 4b 65 79 3d 3d 28 70 49  age->intKey==(pI
2a2c0 64 78 4b 65 79 3d 3d 30 29 20 29 3b 0a 20 20 20  dxKey==0) );.   
2a2d0 20 6c 77 72 20 3d 20 30 3b 0a 20 20 20 20 75 70   lwr = 0;.    up
2a2e0 72 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  r = pPage->nCell
2a2f0 2d 31 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  -1;.    assert( 
2a300 62 69 61 73 52 69 67 68 74 3d 3d 30 20 7c 7c 20  biasRight==0 || 
2a310 62 69 61 73 52 69 67 68 74 3d 3d 31 20 29 3b 0a  biasRight==1 );.
2a320 20 20 20 20 69 64 78 20 3d 20 75 70 72 3e 3e 28      idx = upr>>(
2a330 31 2d 62 69 61 73 52 69 67 68 74 29 3b 20 2f 2a  1-biasRight); /*
2a340 20 69 64 78 20 3d 20 62 69 61 73 52 69 67 68 74   idx = biasRight
2a350 20 3f 20 75 70 72 20 3a 20 28 6c 77 72 2b 75 70   ? upr : (lwr+up
2a360 72 29 2f 32 3b 20 2a 2f 0a 20 20 20 20 70 43 75  r)/2; */.    pCu
2a370 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
2a380 50 61 67 65 5d 20 3d 20 28 75 31 36 29 69 64 78  Page] = (u16)idx
2a390 3b 0a 20 20 20 20 69 66 28 20 78 52 65 63 6f 72  ;.    if( xRecor
2a3a0 64 43 6f 6d 70 61 72 65 3d 3d 30 20 29 7b 0a 20  dCompare==0 ){. 
2a3b0 20 20 20 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20       for(;;){.  
2a3c0 20 20 20 20 20 20 69 36 34 20 6e 43 65 6c 6c 4b        i64 nCellK
2a3d0 65 79 3b 0a 20 20 20 20 20 20 20 20 70 43 65 6c  ey;.        pCel
2a3e0 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 50 61 73 74  l = findCellPast
2a3f0 50 74 72 28 70 50 61 67 65 2c 20 69 64 78 29 3b  Ptr(pPage, idx);
2a400 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61  .        if( pPa
2a410 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20 29  ge->intKeyLeaf )
2a420 7b 0a 20 20 20 20 20 20 20 20 20 20 77 68 69 6c  {.          whil
2a430 65 28 20 30 78 38 30 20 3c 3d 20 2a 28 70 43 65  e( 0x80 <= *(pCe
2a440 6c 6c 2b 2b 29 20 29 7b 0a 20 20 20 20 20 20 20  ll++) ){.       
2a450 20 20 20 20 20 69 66 28 20 70 43 65 6c 6c 3e 3d       if( pCell>=
2a460 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20  pPage->aDataEnd 
2a470 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
2a480 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
2a490 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2a4a0 20 20 7d 0a 20 20 20 20 20 20 20 20 67 65 74 56    }.        getV
2a4b0 61 72 69 6e 74 28 70 43 65 6c 6c 2c 20 28 75 36  arint(pCell, (u6
2a4c0 34 2a 29 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20  4*)&nCellKey);. 
2a4d0 20 20 20 20 20 20 20 69 66 28 20 6e 43 65 6c 6c         if( nCell
2a4e0 4b 65 79 3c 69 6e 74 4b 65 79 20 29 7b 0a 20 20  Key<intKey ){.  
2a4f0 20 20 20 20 20 20 20 20 6c 77 72 20 3d 20 69 64          lwr = id
2a500 78 2b 31 3b 0a 20 20 20 20 20 20 20 20 20 20 69  x+1;.          i
2a510 66 28 20 6c 77 72 3e 75 70 72 20 29 7b 20 63 20  f( lwr>upr ){ c 
2a520 3d 20 2d 31 3b 20 62 72 65 61 6b 3b 20 7d 0a 20  = -1; break; }. 
2a530 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
2a540 20 6e 43 65 6c 6c 4b 65 79 3e 69 6e 74 4b 65 79   nCellKey>intKey
2a550 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 70   ){.          up
2a560 72 20 3d 20 69 64 78 2d 31 3b 0a 20 20 20 20 20  r = idx-1;.     
2a570 20 20 20 20 20 69 66 28 20 6c 77 72 3e 75 70 72       if( lwr>upr
2a580 20 29 7b 20 63 20 3d 20 2b 31 3b 20 62 72 65 61   ){ c = +1; brea
2a590 6b 3b 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c  k; }.        }el
2a5a0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73  se{.          as
2a5b0 73 65 72 74 28 20 6e 43 65 6c 6c 4b 65 79 3d 3d  sert( nCellKey==
2a5c0 69 6e 74 4b 65 79 20 29 3b 0a 20 20 20 20 20 20  intKey );.      
2a5d0 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61      pCur->curFla
2a5e0 67 73 20 7c 3d 20 42 54 43 46 5f 56 61 6c 69 64  gs |= BTCF_Valid
2a5f0 4e 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 20 20  NKey;.          
2a600 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 20  pCur->info.nKey 
2a610 3d 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20  = nCellKey;.    
2a620 20 20 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64        pCur->aiId
2a630 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d  x[pCur->iPage] =
2a640 20 28 75 31 36 29 69 64 78 3b 0a 20 20 20 20 20   (u16)idx;.     
2a650 20 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d       if( !pPage-
2a660 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20  >leaf ){.       
2a670 20 20 20 20 20 6c 77 72 20 3d 20 69 64 78 3b 0a       lwr = idx;.
2a680 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f              goto
2a690 20 6d 6f 76 65 74 6f 5f 6e 65 78 74 5f 6c 61 79   moveto_next_lay
2a6a0 65 72 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  er;.          }e
2a6b0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
2a6c0 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20   *pRes = 0;.    
2a6d0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
2a6e0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20  ITE_OK;.        
2a6f0 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f      goto moveto_
2a700 66 69 6e 69 73 68 3b 0a 20 20 20 20 20 20 20 20  finish;.        
2a710 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
2a720 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6c 77        assert( lw
2a730 72 2b 75 70 72 3e 3d 30 20 29 3b 0a 20 20 20 20  r+upr>=0 );.    
2a740 20 20 20 20 69 64 78 20 3d 20 28 6c 77 72 2b 75      idx = (lwr+u
2a750 70 72 29 3e 3e 31 3b 20 20 2f 2a 20 69 64 78 20  pr)>>1;  /* idx 
2a760 3d 20 28 6c 77 72 2b 75 70 72 29 2f 32 3b 20 2a  = (lwr+upr)/2; *
2a770 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  /.      }.    }e
2a780 6c 73 65 7b 0a 20 20 20 20 20 20 66 6f 72 28 3b  lse{.      for(;
2a790 3b 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  ;){.        int 
2a7a0 6e 43 65 6c 6c 3b 20 20 2f 2a 20 53 69 7a 65 20  nCell;  /* Size 
2a7b0 6f 66 20 74 68 65 20 70 43 65 6c 6c 20 63 65 6c  of the pCell cel
2a7c0 6c 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20  l in bytes */.  
2a7d0 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 66 69        pCell = fi
2a7e0 6e 64 43 65 6c 6c 50 61 73 74 50 74 72 28 70 50  ndCellPastPtr(pP
2a7f0 61 67 65 2c 20 69 64 78 29 3b 0a 0a 20 20 20 20  age, idx);..    
2a800 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 78 69 6d      /* The maxim
2a810 75 6d 20 73 75 70 70 6f 72 74 65 64 20 70 61 67  um supported pag
2a820 65 2d 73 69 7a 65 20 69 73 20 36 35 35 33 36 20  e-size is 65536 
2a830 62 79 74 65 73 2e 20 54 68 69 73 20 6d 65 61 6e  bytes. This mean
2a840 73 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a  s that.        *
2a850 2a 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75  * the maximum nu
2a860 6d 62 65 72 20 6f 66 20 72 65 63 6f 72 64 20 62  mber of record b
2a870 79 74 65 73 20 73 74 6f 72 65 64 20 6f 6e 20 61  ytes stored on a
2a880 6e 20 69 6e 64 65 78 20 42 2d 54 72 65 65 0a 20  n index B-Tree. 
2a890 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20 69         ** page i
2a8a0 73 20 6c 65 73 73 20 74 68 61 6e 20 31 36 33 38  s less than 1638
2a8b0 34 20 62 79 74 65 73 20 61 6e 64 20 6d 61 79 20  4 bytes and may 
2a8c0 62 65 20 73 74 6f 72 65 64 20 61 73 20 61 20 32  be stored as a 2
2a8d0 2d 62 79 74 65 0a 20 20 20 20 20 20 20 20 2a 2a  -byte.        **
2a8e0 20 76 61 72 69 6e 74 2e 20 54 68 69 73 20 69 6e   varint. This in
2a8f0 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75 73 65  formation is use
2a900 64 20 74 6f 20 61 74 74 65 6d 70 74 20 74 6f 20  d to attempt to 
2a910 61 76 6f 69 64 20 70 61 72 73 69 6e 67 20 0a 20  avoid parsing . 
2a920 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 65 6e         ** the en
2a930 74 69 72 65 20 63 65 6c 6c 20 62 79 20 63 68 65  tire cell by che
2a940 63 6b 69 6e 67 20 66 6f 72 20 74 68 65 20 63 61  cking for the ca
2a950 73 65 73 20 77 68 65 72 65 20 74 68 65 20 72 65  ses where the re
2a960 63 6f 72 64 20 69 73 20 0a 20 20 20 20 20 20 20  cord is .       
2a970 20 2a 2a 20 73 74 6f 72 65 64 20 65 6e 74 69 72   ** stored entir
2a980 65 6c 79 20 77 69 74 68 69 6e 20 74 68 65 20 62  ely within the b
2a990 2d 74 72 65 65 20 70 61 67 65 20 62 79 20 69 6e  -tree page by in
2a9a0 73 70 65 63 74 69 6e 67 20 74 68 65 20 66 69 72  specting the fir
2a9b0 73 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 32  st .        ** 2
2a9c0 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 63 65   bytes of the ce
2a9d0 6c 6c 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ll..        */. 
2a9e0 20 20 20 20 20 20 20 6e 43 65 6c 6c 20 3d 20 70         nCell = p
2a9f0 43 65 6c 6c 5b 30 5d 3b 0a 20 20 20 20 20 20 20  Cell[0];.       
2aa00 20 69 66 28 20 6e 43 65 6c 6c 3c 3d 70 50 61 67   if( nCell<=pPag
2aa10 65 2d 3e 6d 61 78 31 62 79 74 65 50 61 79 6c 6f  e->max1bytePaylo
2aa20 61 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ad ){.          
2aa30 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20 72  /* This branch r
2aa40 75 6e 73 20 69 66 20 74 68 65 20 72 65 63 6f 72  uns if the recor
2aa50 64 2d 73 69 7a 65 20 66 69 65 6c 64 20 6f 66 20  d-size field of 
2aa60 74 68 65 20 63 65 6c 6c 20 69 73 20 61 0a 20 20  the cell is a.  
2aa70 20 20 20 20 20 20 20 20 2a 2a 20 73 69 6e 67 6c          ** singl
2aa80 65 20 62 79 74 65 20 76 61 72 69 6e 74 20 61 6e  e byte varint an
2aa90 64 20 74 68 65 20 72 65 63 6f 72 64 20 66 69 74  d the record fit
2aaa0 73 20 65 6e 74 69 72 65 6c 79 20 6f 6e 20 74 68  s entirely on th
2aab0 65 20 6d 61 69 6e 0a 20 20 20 20 20 20 20 20 20  e main.         
2aac0 20 2a 2a 20 62 2d 74 72 65 65 20 70 61 67 65 2e   ** b-tree page.
2aad0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 74    */.          t
2aae0 65 73 74 63 61 73 65 28 20 70 43 65 6c 6c 2b 6e  estcase( pCell+n
2aaf0 43 65 6c 6c 2b 31 3d 3d 70 50 61 67 65 2d 3e 61  Cell+1==pPage->a
2ab00 44 61 74 61 45 6e 64 20 29 3b 0a 20 20 20 20 20  DataEnd );.     
2ab10 20 20 20 20 20 63 20 3d 20 78 52 65 63 6f 72 64       c = xRecord
2ab20 43 6f 6d 70 61 72 65 28 6e 43 65 6c 6c 2c 20 28  Compare(nCell, (
2ab30 76 6f 69 64 2a 29 26 70 43 65 6c 6c 5b 31 5d 2c  void*)&pCell[1],
2ab40 20 70 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 20   pIdxKey);.     
2ab50 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21 28 70     }else if( !(p
2ab60 43 65 6c 6c 5b 31 5d 20 26 20 30 78 38 30 29 20  Cell[1] & 0x80) 
2ab70 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 28 6e  .          && (n
2ab80 43 65 6c 6c 20 3d 20 28 28 6e 43 65 6c 6c 26 30  Cell = ((nCell&0
2ab90 78 37 66 29 3c 3c 37 29 20 2b 20 70 43 65 6c 6c  x7f)<<7) + pCell
2aba0 5b 31 5d 29 3c 3d 70 50 61 67 65 2d 3e 6d 61 78  [1])<=pPage->max
2abb0 4c 6f 63 61 6c 0a 20 20 20 20 20 20 20 20 29 7b  Local.        ){
2abc0 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  .          /* Th
2abd0 65 20 72 65 63 6f 72 64 2d 73 69 7a 65 20 66 69  e record-size fi
2abe0 65 6c 64 20 69 73 20 61 20 32 20 62 79 74 65 20  eld is a 2 byte 
2abf0 76 61 72 69 6e 74 20 61 6e 64 20 74 68 65 20 72  varint and the r
2ac00 65 63 6f 72 64 20 0a 20 20 20 20 20 20 20 20 20  ecord .         
2ac10 20 2a 2a 20 66 69 74 73 20 65 6e 74 69 72 65 6c   ** fits entirel
2ac20 79 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20 62 2d  y on the main b-
2ac30 74 72 65 65 20 70 61 67 65 2e 20 20 2a 2f 0a 20  tree page.  */. 
2ac40 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
2ac50 65 28 20 70 43 65 6c 6c 2b 6e 43 65 6c 6c 2b 32  e( pCell+nCell+2
2ac60 3d 3d 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e  ==pPage->aDataEn
2ac70 64 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63  d );.          c
2ac80 20 3d 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72   = xRecordCompar
2ac90 65 28 6e 43 65 6c 6c 2c 20 28 76 6f 69 64 2a 29  e(nCell, (void*)
2aca0 26 70 43 65 6c 6c 5b 32 5d 2c 20 70 49 64 78 4b  &pCell[2], pIdxK
2acb0 65 79 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  ey);.        }el
2acc0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  se{.          /*
2acd0 20 54 68 65 20 72 65 63 6f 72 64 20 66 6c 6f 77   The record flow
2ace0 73 20 6f 76 65 72 20 6f 6e 74 6f 20 6f 6e 65 20  s over onto one 
2acf0 6f 72 20 6d 6f 72 65 20 6f 76 65 72 66 6c 6f 77  or more overflow
2ad00 20 70 61 67 65 73 2e 20 49 6e 0a 20 20 20 20 20   pages. In.     
2ad10 20 20 20 20 20 2a 2a 20 74 68 69 73 20 63 61 73       ** this cas
2ad20 65 20 74 68 65 20 77 68 6f 6c 65 20 63 65 6c 6c  e the whole cell
2ad30 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70 61 72   needs to be par
2ad40 73 65 64 2c 20 61 20 62 75 66 66 65 72 20 61 6c  sed, a buffer al
2ad50 6c 6f 63 61 74 65 64 0a 20 20 20 20 20 20 20 20  located.        
2ad60 20 20 2a 2a 20 61 6e 64 20 61 63 63 65 73 73 50    ** and accessP
2ad70 61 79 6c 6f 61 64 28 29 20 75 73 65 64 20 74 6f  ayload() used to
2ad80 20 72 65 74 72 69 65 76 65 20 74 68 65 20 72 65   retrieve the re
2ad90 63 6f 72 64 20 69 6e 74 6f 20 74 68 65 0a 20 20  cord into the.  
2ada0 20 20 20 20 20 20 20 20 2a 2a 20 62 75 66 66 65          ** buffe
2adb0 72 20 62 65 66 6f 72 65 20 56 64 62 65 52 65 63  r before VdbeRec
2adc0 6f 72 64 43 6f 6d 70 61 72 65 28 29 20 63 61 6e  ordCompare() can
2add0 20 62 65 20 63 61 6c 6c 65 64 2e 20 0a 20 20 20   be called. .   
2ade0 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
2adf0 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20 72 65      ** If the re
2ae00 63 6f 72 64 20 69 73 20 63 6f 72 72 75 70 74 2c  cord is corrupt,
2ae10 20 74 68 65 20 78 52 65 63 6f 72 64 43 6f 6d 70   the xRecordComp
2ae20 61 72 65 20 72 6f 75 74 69 6e 65 20 6d 61 79 20  are routine may 
2ae30 72 65 61 64 0a 20 20 20 20 20 20 20 20 20 20 2a  read.          *
2ae40 2a 20 75 70 20 74 6f 20 74 77 6f 20 76 61 72 69  * up to two vari
2ae50 6e 74 73 20 70 61 73 74 20 74 68 65 20 65 6e 64  nts past the end
2ae60 20 6f 66 20 74 68 65 20 62 75 66 66 65 72 2e 20   of the buffer. 
2ae70 41 6e 20 65 78 74 72 61 20 31 38 20 0a 20 20 20  An extra 18 .   
2ae80 20 20 20 20 20 20 20 2a 2a 20 62 79 74 65 73 20         ** bytes 
2ae90 6f 66 20 70 61 64 64 69 6e 67 20 69 73 20 61 6c  of padding is al
2aea0 6c 6f 63 61 74 65 64 20 61 74 20 74 68 65 20 65  located at the e
2aeb0 6e 64 20 6f 66 20 74 68 65 20 62 75 66 66 65 72  nd of the buffer
2aec0 20 69 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a   in.          **
2aed0 20 63 61 73 65 20 74 68 69 73 20 68 61 70 70 65   case this happe
2aee0 6e 73 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20  ns.  */.        
2aef0 20 20 76 6f 69 64 20 2a 70 43 65 6c 6c 4b 65 79    void *pCellKey
2af00 3b 0a 20 20 20 20 20 20 20 20 20 20 75 38 20 2a  ;.          u8 *
2af10 20 63 6f 6e 73 74 20 70 43 65 6c 6c 42 6f 64 79   const pCellBody
2af20 20 3d 20 70 43 65 6c 6c 20 2d 20 70 50 61 67 65   = pCell - pPage
2af30 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a  ->childPtrSize;.
2af40 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 2d            pPage-
2af50 3e 78 50 61 72 73 65 43 65 6c 6c 28 70 50 61 67  >xParseCell(pPag
2af60 65 2c 20 70 43 65 6c 6c 42 6f 64 79 2c 20 26 70  e, pCellBody, &p
2af70 43 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20 20 20 20  Cur->info);.    
2af80 20 20 20 20 20 20 6e 43 65 6c 6c 20 3d 20 28 69        nCell = (i
2af90 6e 74 29 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b  nt)pCur->info.nK
2afa0 65 79 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65  ey;.          te
2afb0 73 74 63 61 73 65 28 20 6e 43 65 6c 6c 3c 30 20  stcase( nCell<0 
2afc0 29 3b 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20  );   /* True if 
2afd0 6b 65 79 20 73 69 7a 65 20 69 73 20 32 5e 33 32  key size is 2^32
2afe0 20 6f 72 20 6d 6f 72 65 20 2a 2f 0a 20 20 20 20   or more */.    
2aff0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
2b000 6e 43 65 6c 6c 3d 3d 30 20 29 3b 20 20 2f 2a 20  nCell==0 );  /* 
2b010 49 6e 76 61 6c 69 64 20 6b 65 79 20 73 69 7a 65  Invalid key size
2b020 3a 20 20 30 78 38 30 20 30 78 38 30 20 30 78 30  :  0x80 0x80 0x0
2b030 30 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 74  0 */.          t
2b040 65 73 74 63 61 73 65 28 20 6e 43 65 6c 6c 3d 3d  estcase( nCell==
2b050 31 20 29 3b 20 20 2f 2a 20 49 6e 76 61 6c 69 64  1 );  /* Invalid
2b060 20 6b 65 79 20 73 69 7a 65 3a 20 20 30 78 38 30   key size:  0x80
2b070 20 30 78 38 30 20 30 78 30 31 20 2a 2f 0a 20 20   0x80 0x01 */.  
2b080 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
2b090 28 20 6e 43 65 6c 6c 3d 3d 32 20 29 3b 20 20 2f  ( nCell==2 );  /
2b0a0 2a 20 4d 69 6e 69 6d 75 6d 20 6c 65 67 61 6c 20  * Minimum legal 
2b0b0 69 6e 64 65 78 20 6b 65 79 20 73 69 7a 65 20 2a  index key size *
2b0c0 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  /.          if( 
2b0d0 6e 43 65 6c 6c 3c 32 20 29 7b 0a 20 20 20 20 20  nCell<2 ){.     
2b0e0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
2b0f0 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
2b100 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74  .            got
2b110 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b  o moveto_finish;
2b120 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2b130 20 20 20 20 20 20 20 70 43 65 6c 6c 4b 65 79 20         pCellKey 
2b140 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28  = sqlite3Malloc(
2b150 20 6e 43 65 6c 6c 2b 31 38 20 29 3b 0a 20 20 20   nCell+18 );.   
2b160 20 20 20 20 20 20 20 69 66 28 20 70 43 65 6c 6c         if( pCell
2b170 4b 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Key==0 ){.      
2b180 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
2b190 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20  E_NOMEM;.       
2b1a0 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f       goto moveto
2b1b0 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 20 20 20  _finish;.       
2b1c0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70     }.          p
2b1d0 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
2b1e0 3e 69 50 61 67 65 5d 20 3d 20 28 75 31 36 29 69  >iPage] = (u16)i
2b1f0 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63  dx;.          rc
2b200 20 3d 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64   = accessPayload
2b210 28 70 43 75 72 2c 20 30 2c 20 6e 43 65 6c 6c 2c  (pCur, 0, nCell,
2b220 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a   (unsigned char*
2b230 29 70 43 65 6c 6c 4b 65 79 2c 20 32 29 3b 0a 20  )pCellKey, 2);. 
2b240 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20           if( rc 
2b250 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
2b260 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 65 6c  qlite3_free(pCel
2b270 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 20  lKey);.         
2b280 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66     goto moveto_f
2b290 69 6e 69 73 68 3b 0a 20 20 20 20 20 20 20 20 20  inish;.         
2b2a0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d   }.          c =
2b2b0 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28   xRecordCompare(
2b2c0 6e 43 65 6c 6c 2c 20 70 43 65 6c 6c 4b 65 79 2c  nCell, pCellKey,
2b2d0 20 70 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 20   pIdxKey);.     
2b2e0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
2b2f0 65 28 70 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20  e(pCellKey);.   
2b300 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61       }.        a
2b310 73 73 65 72 74 28 20 0a 20 20 20 20 20 20 20 20  ssert( .        
2b320 20 20 20 20 28 70 49 64 78 4b 65 79 2d 3e 65 72      (pIdxKey->er
2b330 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 43 4f  rCode!=SQLITE_CO
2b340 52 52 55 50 54 20 7c 7c 20 63 3d 3d 30 29 0a 20  RRUPT || c==0). 
2b350 20 20 20 20 20 20 20 20 26 26 20 28 70 49 64 78          && (pIdx
2b360 4b 65 79 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51  Key->errCode!=SQ
2b370 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 70 43  LITE_NOMEM || pC
2b380 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e  ur->pBtree->db->
2b390 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 29 0a 20 20  mallocFailed).  
2b3a0 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20        );.       
2b3b0 20 69 66 28 20 63 3c 30 20 29 7b 0a 20 20 20 20   if( c<0 ){.    
2b3c0 20 20 20 20 20 20 6c 77 72 20 3d 20 69 64 78 2b        lwr = idx+
2b3d0 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  1;.        }else
2b3e0 20 69 66 28 20 63 3e 30 20 29 7b 0a 20 20 20 20   if( c>0 ){.    
2b3f0 20 20 20 20 20 20 75 70 72 20 3d 20 69 64 78 2d        upr = idx-
2b400 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  1;.        }else
2b410 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  {.          asse
2b420 72 74 28 20 63 3d 3d 30 20 29 3b 0a 20 20 20 20  rt( c==0 );.    
2b430 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b        *pRes = 0;
2b440 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
2b450 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
2b460 20 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78       pCur->aiIdx
2b470 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20  [pCur->iPage] = 
2b480 28 75 31 36 29 69 64 78 3b 0a 20 20 20 20 20 20  (u16)idx;.      
2b490 20 20 20 20 69 66 28 20 70 49 64 78 4b 65 79 2d      if( pIdxKey-
2b4a0 3e 65 72 72 43 6f 64 65 20 29 20 72 63 20 3d 20  >errCode ) rc = 
2b4b0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b 0a  SQLITE_CORRUPT;.
2b4c0 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d            goto m
2b4d0 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20  oveto_finish;.  
2b4e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2b4f0 69 66 28 20 6c 77 72 3e 75 70 72 20 29 20 62 72  if( lwr>upr ) br
2b500 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 61 73 73  eak;.        ass
2b510 65 72 74 28 20 6c 77 72 2b 75 70 72 3e 3d 30 20  ert( lwr+upr>=0 
2b520 29 3b 0a 20 20 20 20 20 20 20 20 69 64 78 20 3d  );.        idx =
2b530 20 28 6c 77 72 2b 75 70 72 29 3e 3e 31 3b 20 20   (lwr+upr)>>1;  
2b540 2f 2a 20 69 64 78 20 3d 20 28 6c 77 72 2b 75 70  /* idx = (lwr+up
2b550 72 29 2f 32 20 2a 2f 0a 20 20 20 20 20 20 7d 0a  r)/2 */.      }.
2b560 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
2b570 28 20 6c 77 72 3d 3d 75 70 72 2b 31 20 7c 7c 20  ( lwr==upr+1 || 
2b580 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 26  (pPage->intKey &
2b590 26 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 29 20  & !pPage->leaf) 
2b5a0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
2b5b0 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a  Page->isInit );.
2b5c0 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c      if( pPage->l
2b5d0 65 61 66 20 29 7b 0a 20 20 20 20 20 20 61 73 73  eaf ){.      ass
2b5e0 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78  ert( pCur->aiIdx
2b5f0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 43  [pCur->iPage]<pC
2b600 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
2b610 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29  >iPage]->nCell )
2b620 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 61 69  ;.      pCur->ai
2b630 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
2b640 20 3d 20 28 75 31 36 29 69 64 78 3b 0a 20 20 20   = (u16)idx;.   
2b650 20 20 20 2a 70 52 65 73 20 3d 20 63 3b 0a 20 20     *pRes = c;.  
2b660 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2b670 4f 4b 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d  OK;.      goto m
2b680 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20  oveto_finish;.  
2b690 20 20 7d 0a 6d 6f 76 65 74 6f 5f 6e 65 78 74 5f    }.moveto_next_
2b6a0 6c 61 79 65 72 3a 0a 20 20 20 20 69 66 28 20 6c  layer:.    if( l
2b6b0 77 72 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  wr>=pPage->nCell
2b6c0 20 29 7b 0a 20 20 20 20 20 20 63 68 6c 64 50 67   ){.      chldPg
2b6d0 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61   = get4byte(&pPa
2b6e0 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d  ge->aData[pPage-
2b6f0 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a  >hdrOffset+8]);.
2b700 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2b710 20 63 68 6c 64 50 67 20 3d 20 67 65 74 34 62 79   chldPg = get4by
2b720 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 67  te(findCell(pPag
2b730 65 2c 20 6c 77 72 29 29 3b 0a 20 20 20 20 7d 0a  e, lwr));.    }.
2b740 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b      pCur->aiIdx[
2b750 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28  pCur->iPage] = (
2b760 75 31 36 29 6c 77 72 3b 0a 20 20 20 20 72 63 20  u16)lwr;.    rc 
2b770 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43  = moveToChild(pC
2b780 75 72 2c 20 63 68 6c 64 50 67 29 3b 0a 20 20 20  ur, chldPg);.   
2b790 20 69 66 28 20 72 63 20 29 20 62 72 65 61 6b 3b   if( rc ) break;
2b7a0 0a 20 20 7d 0a 6d 6f 76 65 74 6f 5f 66 69 6e 69  .  }.moveto_fini
2b7b0 73 68 3a 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f  sh:.  pCur->info
2b7c0 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43  .nSize = 0;.  pC
2b7d0 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20  ur->curFlags &= 
2b7e0 7e 28 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79  ~(BTCF_ValidNKey
2b7f0 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29  |BTCF_ValidOvfl)
2b800 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
2b810 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  .../*.** Return 
2b820 54 52 55 45 20 69 66 20 74 68 65 20 63 75 72 73  TRUE if the curs
2b830 6f 72 20 69 73 20 6e 6f 74 20 70 6f 69 6e 74 69  or is not pointi
2b840 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20 6f  ng at an entry o
2b850 66 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a  f the table..**.
2b860 2a 2a 20 54 52 55 45 20 77 69 6c 6c 20 62 65 20  ** TRUE will be 
2b870 72 65 74 75 72 6e 65 64 20 61 66 74 65 72 20 61  returned after a
2b880 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
2b890 42 74 72 65 65 4e 65 78 74 28 29 20 6d 6f 76 65  BtreeNext() move
2b8a0 73 0a 2a 2a 20 70 61 73 74 20 74 68 65 20 6c 61  s.** past the la
2b8b0 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  st entry in the 
2b8c0 74 61 62 6c 65 20 6f 72 20 73 71 6c 69 74 65 33  table or sqlite3
2b8d0 42 74 72 65 65 50 72 65 76 28 29 20 6d 6f 76 65  BtreePrev() move
2b8e0 73 20 70 61 73 74 0a 2a 2a 20 74 68 65 20 66 69  s past.** the fi
2b8f0 72 73 74 20 65 6e 74 72 79 2e 20 20 54 52 55 45  rst entry.  TRUE
2b900 20 69 73 20 61 6c 73 6f 20 72 65 74 75 72 6e 65   is also returne
2b910 64 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 69  d if the table i
2b920 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20  s empty..*/.int 
2b930 73 71 6c 69 74 65 33 42 74 72 65 65 45 6f 66 28  sqlite3BtreeEof(
2b940 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
2b950 0a 20 20 2f 2a 20 54 4f 44 4f 3a 20 57 68 61 74  .  /* TODO: What
2b960 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 69   if the cursor i
2b970 73 20 69 6e 20 43 55 52 53 4f 52 5f 52 45 51 55  s in CURSOR_REQU
2b980 49 52 45 53 45 45 4b 20 62 75 74 20 61 6c 6c 20  IRESEEK but all 
2b990 74 61 62 6c 65 20 65 6e 74 72 69 65 73 0a 20 20  table entries.  
2b9a0 2a 2a 20 68 61 76 65 20 62 65 65 6e 20 64 65 6c  ** have been del
2b9b0 65 74 65 64 3f 20 54 68 69 73 20 41 50 49 20 77  eted? This API w
2b9c0 69 6c 6c 20 6e 65 65 64 20 74 6f 20 63 68 61 6e  ill need to chan
2b9d0 67 65 20 74 6f 20 72 65 74 75 72 6e 20 61 6e 20  ge to return an 
2b9e0 65 72 72 6f 72 20 63 6f 64 65 0a 20 20 2a 2a 20  error code.  ** 
2b9f0 61 73 20 77 65 6c 6c 20 61 73 20 74 68 65 20 62  as well as the b
2ba00 6f 6f 6c 65 61 6e 20 72 65 73 75 6c 74 20 76 61  oolean result va
2ba10 6c 75 65 2e 0a 20 20 2a 2f 0a 20 20 72 65 74 75  lue..  */.  retu
2ba20 72 6e 20 28 43 55 52 53 4f 52 5f 56 41 4c 49 44  rn (CURSOR_VALID
2ba30 21 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 29 3b  !=pCur->eState);
2ba40 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63  .}../*.** Advanc
2ba50 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20  e the cursor to 
2ba60 74 68 65 20 6e 65 78 74 20 65 6e 74 72 79 20 69  the next entry i
2ba70 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  n the database. 
2ba80 20 49 66 0a 2a 2a 20 73 75 63 63 65 73 73 66 75   If.** successfu
2ba90 6c 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73  l then set *pRes
2baa0 3d 30 2e 20 20 49 66 20 74 68 65 20 63 75 72 73  =0.  If the curs
2bab0 6f 72 0a 2a 2a 20 77 61 73 20 61 6c 72 65 61 64  or.** was alread
2bac0 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68  y pointing to th
2bad0 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20  e last entry in 
2bae0 74 68 65 20 64 61 74 61 62 61 73 65 20 62 65 66  the database bef
2baf0 6f 72 65 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74  ore.** this rout
2bb00 69 6e 65 20 77 61 73 20 63 61 6c 6c 65 64 2c 20  ine was called, 
2bb10 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 31  then set *pRes=1
2bb20 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 69 6e  ..**.** The main
2bb30 20 65 6e 74 72 79 20 70 6f 69 6e 74 20 69 73 20   entry point is 
2bb40 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74  sqlite3BtreeNext
2bb50 28 29 2e 20 20 54 68 61 74 20 72 6f 75 74 69 6e  ().  That routin
2bb60 65 20 69 73 20 6f 70 74 69 6d 69 7a 65 64 0a 2a  e is optimized.*
2bb70 2a 20 66 6f 72 20 74 68 65 20 63 6f 6d 6d 6f 6e  * for the common
2bb80 20 63 61 73 65 20 6f 66 20 6d 65 72 65 6c 79 20   case of merely 
2bb90 69 6e 63 72 65 6d 65 6e 74 69 6e 67 20 74 68 65  incrementing the
2bba0 20 63 65 6c 6c 20 63 6f 75 6e 74 65 72 20 42 74   cell counter Bt
2bbb0 43 75 72 73 6f 72 2e 61 69 49 64 78 0a 2a 2a 20  Cursor.aiIdx.** 
2bbc0 74 6f 20 74 68 65 20 6e 65 78 74 20 63 65 6c 6c  to the next cell
2bbd0 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   on the current 
2bbe0 70 61 67 65 2e 20 20 54 68 65 20 28 73 6c 6f 77  page.  The (slow
2bbf0 65 72 29 20 62 74 72 65 65 4e 65 78 74 28 29 20  er) btreeNext() 
2bc00 68 65 6c 70 65 72 0a 2a 2a 20 72 6f 75 74 69 6e  helper.** routin
2bc10 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e  e is called when
2bc20 20 69 74 20 69 73 20 6e 65 63 65 73 73 61 72 79   it is necessary
2bc30 20 74 6f 20 6d 6f 76 65 20 74 6f 20 61 20 64 69   to move to a di
2bc40 66 66 65 72 65 6e 74 20 70 61 67 65 20 6f 72 0a  fferent page or.
2bc50 2a 2a 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68  ** to restore th
2bc60 65 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20  e cursor..**.** 
2bc70 54 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63  The calling func
2bc80 74 69 6f 6e 20 77 69 6c 6c 20 73 65 74 20 2a 70  tion will set *p
2bc90 52 65 73 20 74 6f 20 30 20 6f 72 20 31 2e 20 20  Res to 0 or 1.  
2bca0 54 68 65 20 69 6e 69 74 69 61 6c 20 2a 70 52 65  The initial *pRe
2bcb0 73 20 76 61 6c 75 65 0a 2a 2a 20 77 69 6c 6c 20  s value.** will 
2bcc0 62 65 20 31 20 69 66 20 74 68 65 20 63 75 72 73  be 1 if the curs
2bcd0 6f 72 20 62 65 69 6e 67 20 73 74 65 70 70 65 64  or being stepped
2bce0 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20   corresponds to 
2bcf0 61 6e 20 53 51 4c 20 69 6e 64 65 78 20 61 6e 64  an SQL index and
2bd00 0a 2a 2a 20 69 66 20 74 68 69 73 20 72 6f 75 74  .** if this rout
2bd10 69 6e 65 20 63 6f 75 6c 64 20 68 61 76 65 20 62  ine could have b
2bd20 65 65 6e 20 73 6b 69 70 70 65 64 20 69 66 20 74  een skipped if t
2bd30 68 61 74 20 53 51 4c 20 69 6e 64 65 78 20 68 61  hat SQL index ha
2bd40 64 20 62 65 65 6e 0a 2a 2a 20 61 20 75 6e 69 71  d been.** a uniq
2bd50 75 65 20 69 6e 64 65 78 2e 20 20 4f 74 68 65 72  ue index.  Other
2bd60 77 69 73 65 20 74 68 65 20 63 61 6c 6c 65 72 20  wise the caller 
2bd70 77 69 6c 6c 20 68 61 76 65 20 73 65 74 20 2a 70  will have set *p
2bd80 52 65 73 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2a 20  Res to zero..** 
2bd90 5a 65 72 6f 20 69 73 20 74 68 65 20 63 6f 6d 6d  Zero is the comm
2bda0 6f 6e 20 63 61 73 65 2e 20 54 68 65 20 62 74 72  on case. The btr
2bdb0 65 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ee implementatio
2bdc0 6e 20 69 73 20 66 72 65 65 20 74 6f 20 75 73 65  n is free to use
2bdd0 20 74 68 65 0a 2a 2a 20 69 6e 69 74 69 61 6c 20   the.** initial 
2bde0 2a 70 52 65 73 20 76 61 6c 75 65 20 61 73 20 61  *pRes value as a
2bdf0 20 68 69 6e 74 20 74 6f 20 69 6d 70 72 6f 76 65   hint to improve
2be00 20 70 65 72 66 6f 72 6d 61 6e 63 65 2c 20 62 75   performance, bu
2be10 74 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a  t the current.**
2be20 20 53 51 4c 69 74 65 20 62 74 72 65 65 20 69 6d   SQLite btree im
2be30 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 64 6f 65  plementation doe
2be40 73 20 6e 6f 74 2e 20 28 4e 6f 74 65 20 74 68 61  s not. (Note tha
2be50 74 20 74 68 65 20 63 6f 6d 64 62 32 20 62 74 72  t the comdb2 btr
2be60 65 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61  ee.** implementa
2be70 74 69 6f 6e 20 64 6f 65 73 20 75 73 65 20 74 68  tion does use th
2be80 69 73 20 68 69 6e 74 2c 20 68 6f 77 65 76 65 72  is hint, however
2be90 2e 29 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c  .).*/.static SQL
2bea0 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74  ITE_NOINLINE int
2beb0 20 62 74 72 65 65 4e 65 78 74 28 42 74 43 75 72   btreeNext(BtCur
2bec0 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a  sor *pCur, int *
2bed0 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b  pRes){.  int rc;
2bee0 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20 20 4d 65  .  int idx;.  Me
2bef0 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20  mPage *pPage;.. 
2bf00 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
2bf10 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
2bf20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
2bf30 72 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d 30 20 7c  r->skipNext==0 |
2bf40 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d  | pCur->eState!=
2bf50 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
2bf60 20 20 61 73 73 65 72 74 28 20 2a 70 52 65 73 3d    assert( *pRes=
2bf70 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72  =0 );.  if( pCur
2bf80 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52  ->eState!=CURSOR
2bf90 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 61 73  _VALID ){.    as
2bfa0 73 65 72 74 28 20 28 70 43 75 72 2d 3e 63 75 72  sert( (pCur->cur
2bfb0 46 6c 61 67 73 20 26 20 42 54 43 46 5f 56 61 6c  Flags & BTCF_Val
2bfc0 69 64 4f 76 66 6c 29 3d 3d 30 20 29 3b 0a 20 20  idOvfl)==0 );.  
2bfd0 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75    rc = restoreCu
2bfe0 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75  rsorPosition(pCu
2bff0 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  r);.    if( rc!=
2c000 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2c010 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
2c020 20 20 7d 0a 20 20 20 20 69 66 28 20 43 55 52 53    }.    if( CURS
2c030 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72  OR_INVALID==pCur
2c040 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20  ->eState ){.    
2c050 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20    *pRes = 1;.   
2c060 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2c070 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  _OK;.    }.    i
2c080 66 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78  f( pCur->skipNex
2c090 74 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  t ){.      asser
2c0a0 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
2c0b0 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c  =CURSOR_VALID ||
2c0c0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
2c0d0 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54 20 29  URSOR_SKIPNEXT )
2c0e0 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53  ;.      pCur->eS
2c0f0 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 56 41  tate = CURSOR_VA
2c100 4c 49 44 3b 0a 20 20 20 20 20 20 69 66 28 20 70  LID;.      if( p
2c110 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3e 30 20  Cur->skipNext>0 
2c120 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d  ){.        pCur-
2c130 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a 20  >skipNext = 0;. 
2c140 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
2c150 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d  LITE_OK;.      }
2c160 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 73 6b 69  .      pCur->ski
2c170 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 7d  pNext = 0;.    }
2c180 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 20 3d 20  .  }..  pPage = 
2c190 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
2c1a0 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 69 64 78  r->iPage];.  idx
2c1b0 20 3d 20 2b 2b 70 43 75 72 2d 3e 61 69 49 64 78   = ++pCur->aiIdx
2c1c0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20  [pCur->iPage];. 
2c1d0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
2c1e0 69 73 49 6e 69 74 20 29 3b 0a 0a 20 20 2f 2a 20  isInit );..  /* 
2c1f0 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  If the database 
2c200 66 69 6c 65 20 69 73 20 63 6f 72 72 75 70 74 2c  file is corrupt,
2c210 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20   it is possible 
2c220 66 6f 72 20 74 68 65 20 76 61 6c 75 65 20 6f 66  for the value of
2c230 20 69 64 78 20 0a 20 20 2a 2a 20 74 6f 20 62 65   idx .  ** to be
2c240 20 69 6e 76 61 6c 69 64 20 68 65 72 65 2e 20 54   invalid here. T
2c250 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20 6f 63 63  his can only occ
2c260 75 72 20 69 66 20 61 20 73 65 63 6f 6e 64 20 63  ur if a second c
2c270 75 72 73 6f 72 20 6d 6f 64 69 66 69 65 73 0a 20  ursor modifies. 
2c280 20 2a 2a 20 74 68 65 20 70 61 67 65 20 77 68 69   ** the page whi
2c290 6c 65 20 63 75 72 73 6f 72 20 70 43 75 72 20 69  le cursor pCur i
2c2a0 73 20 68 6f 6c 64 69 6e 67 20 61 20 72 65 66 65  s holding a refe
2c2b0 72 65 6e 63 65 20 74 6f 20 69 74 2e 20 57 68 69  rence to it. Whi
2c2c0 63 68 20 63 61 6e 0a 20 20 2a 2a 20 6f 6e 6c 79  ch can.  ** only
2c2d0 20 68 61 70 70 65 6e 20 69 66 20 74 68 65 20 64   happen if the d
2c2e0 61 74 61 62 61 73 65 20 69 73 20 63 6f 72 72 75  atabase is corru
2c2f0 70 74 20 69 6e 20 73 75 63 68 20 61 20 77 61 79  pt in such a way
2c300 20 61 73 20 74 6f 20 6c 69 6e 6b 20 74 68 65 0a   as to link the.
2c310 20 20 2a 2a 20 70 61 67 65 20 69 6e 74 6f 20 6d    ** page into m
2c320 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 62 2d 74  ore than one b-t
2c330 72 65 65 20 73 74 72 75 63 74 75 72 65 2e 20 2a  ree structure. *
2c340 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20 69 64  /.  testcase( id
2c350 78 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29  x>pPage->nCell )
2c360 3b 0a 0a 20 20 69 66 28 20 69 64 78 3e 3d 70 50  ;..  if( idx>=pP
2c370 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20  age->nCell ){.  
2c380 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
2c390 61 66 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  af ){.      rc =
2c3a0 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75   moveToChild(pCu
2c3b0 72 2c 20 67 65 74 34 62 79 74 65 28 26 70 50 61  r, get4byte(&pPa
2c3c0 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d  ge->aData[pPage-
2c3d0 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 29 3b  >hdrOffset+8]));
2c3e0 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20  .      if( rc ) 
2c3f0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
2c400 20 72 65 74 75 72 6e 20 6d 6f 76 65 54 6f 4c 65   return moveToLe
2c410 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20  ftmost(pCur);.  
2c420 20 20 7d 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20    }.    do{.    
2c430 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67    if( pCur->iPag
2c440 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
2c450 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 20  *pRes = 1;.     
2c460 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20     pCur->eState 
2c470 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  = CURSOR_INVALID
2c480 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
2c490 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
2c4a0 20 20 7d 0a 20 20 20 20 20 20 6d 6f 76 65 54 6f    }.      moveTo
2c4b0 50 61 72 65 6e 74 28 70 43 75 72 29 3b 0a 20 20  Parent(pCur);.  
2c4c0 20 20 20 20 70 50 61 67 65 20 3d 20 70 43 75 72      pPage = pCur
2c4d0 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
2c4e0 50 61 67 65 5d 3b 0a 20 20 20 20 7d 77 68 69 6c  Page];.    }whil
2c4f0 65 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70  e( pCur->aiIdx[p
2c500 43 75 72 2d 3e 69 50 61 67 65 5d 3e 3d 70 50 61  Cur->iPage]>=pPa
2c510 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20  ge->nCell );.   
2c520 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b   if( pPage->intK
2c530 65 79 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  ey ){.      retu
2c540 72 6e 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e  rn sqlite3BtreeN
2c550 65 78 74 28 70 43 75 72 2c 20 70 52 65 73 29 3b  ext(pCur, pRes);
2c560 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2c570 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2c580 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  OK;.    }.  }.  
2c590 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20  if( pPage->leaf 
2c5a0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
2c5b0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65  LITE_OK;.  }else
2c5c0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 6d 6f 76  {.    return mov
2c5d0 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72  eToLeftmost(pCur
2c5e0 29 3b 0a 20 20 7d 0a 7d 0a 69 6e 74 20 73 71 6c  );.  }.}.int sql
2c5f0 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 42 74  ite3BtreeNext(Bt
2c600 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e  Cursor *pCur, in
2c610 74 20 2a 70 52 65 73 29 7b 0a 20 20 4d 65 6d 50  t *pRes){.  MemP
2c620 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 61 73  age *pPage;.  as
2c630 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
2c640 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
2c650 20 20 61 73 73 65 72 74 28 20 70 52 65 73 21 3d    assert( pRes!=
2c660 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 2a  0 );.  assert( *
2c670 70 52 65 73 3d 3d 30 20 7c 7c 20 2a 70 52 65 73  pRes==0 || *pRes
2c680 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==1 );.  assert(
2c690 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3d   pCur->skipNext=
2c6a0 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61  =0 || pCur->eSta
2c6b0 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te!=CURSOR_VALID
2c6c0 20 29 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f   );.  pCur->info
2c6d0 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43  .nSize = 0;.  pC
2c6e0 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20  ur->curFlags &= 
2c6f0 7e 28 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79  ~(BTCF_ValidNKey
2c700 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29  |BTCF_ValidOvfl)
2c710 3b 0a 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20  ;.  *pRes = 0;. 
2c720 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74   if( pCur->eStat
2c730 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e!=CURSOR_VALID 
2c740 29 20 72 65 74 75 72 6e 20 62 74 72 65 65 4e 65  ) return btreeNe
2c750 78 74 28 70 43 75 72 2c 20 70 52 65 73 29 3b 0a  xt(pCur, pRes);.
2c760 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e    pPage = pCur->
2c770 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
2c780 67 65 5d 3b 0a 20 20 69 66 28 20 28 2b 2b 70 43  ge];.  if( (++pC
2c790 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
2c7a0 69 50 61 67 65 5d 29 3e 3d 70 50 61 67 65 2d 3e  iPage])>=pPage->
2c7b0 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 70 43 75  nCell ){.    pCu
2c7c0 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
2c7d0 50 61 67 65 5d 2d 2d 3b 0a 20 20 20 20 72 65 74  Page]--;.    ret
2c7e0 75 72 6e 20 62 74 72 65 65 4e 65 78 74 28 70 43  urn btreeNext(pC
2c7f0 75 72 2c 20 70 52 65 73 29 3b 0a 20 20 7d 0a 20  ur, pRes);.  }. 
2c800 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66   if( pPage->leaf
2c810 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
2c820 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73  QLITE_OK;.  }els
2c830 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 6d 6f  e{.    return mo
2c840 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75  veToLeftmost(pCu
2c850 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  r);.  }.}../*.**
2c860 20 53 74 65 70 20 74 68 65 20 63 75 72 73 6f 72   Step the cursor
2c870 20 74 6f 20 74 68 65 20 62 61 63 6b 20 74 6f 20   to the back to 
2c880 74 68 65 20 70 72 65 76 69 6f 75 73 20 65 6e 74  the previous ent
2c890 72 79 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ry in the databa
2c8a0 73 65 2e 20 20 49 66 0a 2a 2a 20 73 75 63 63 65  se.  If.** succe
2c8b0 73 73 66 75 6c 20 74 68 65 6e 20 73 65 74 20 2a  ssful then set *
2c8c0 70 52 65 73 3d 30 2e 20 20 49 66 20 74 68 65 20  pRes=0.  If the 
2c8d0 63 75 72 73 6f 72 0a 2a 2a 20 77 61 73 20 61 6c  cursor.** was al
2c8e0 72 65 61 64 79 20 70 6f 69 6e 74 69 6e 67 20 74  ready pointing t
2c8f0 6f 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72  o the first entr
2c900 79 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  y in the databas
2c910 65 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 69 73  e before.** this
2c920 20 72 6f 75 74 69 6e 65 20 77 61 73 20 63 61 6c   routine was cal
2c930 6c 65 64 2c 20 74 68 65 6e 20 73 65 74 20 2a 70  led, then set *p
2c940 52 65 73 3d 31 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  Res=1..**.** The
2c950 20 6d 61 69 6e 20 65 6e 74 72 79 20 70 6f 69 6e   main entry poin
2c960 74 20 69 73 20 73 71 6c 69 74 65 33 42 74 72 65  t is sqlite3Btre
2c970 65 50 72 65 76 69 6f 75 73 28 29 2e 20 20 54 68  ePrevious().  Th
2c980 61 74 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 70  at routine is op
2c990 74 69 6d 69 7a 65 64 0a 2a 2a 20 66 6f 72 20 74  timized.** for t
2c9a0 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 6f  he common case o
2c9b0 66 20 6d 65 72 65 6c 79 20 64 65 63 72 65 6d 65  f merely decreme
2c9c0 6e 74 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 63  nting the cell c
2c9d0 6f 75 6e 74 65 72 20 42 74 43 75 72 73 6f 72 2e  ounter BtCursor.
2c9e0 61 69 49 64 78 0a 2a 2a 20 74 6f 20 74 68 65 20  aiIdx.** to the 
2c9f0 70 72 65 76 69 6f 75 73 20 63 65 6c 6c 20 6f 6e  previous cell on
2ca00 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67   the current pag
2ca10 65 2e 20 20 54 68 65 20 28 73 6c 6f 77 65 72 29  e.  The (slower)
2ca20 20 62 74 72 65 65 50 72 65 76 69 6f 75 73 28 29   btreePrevious()
2ca30 0a 2a 2a 20 68 65 6c 70 65 72 20 72 6f 75 74 69  .** helper routi
2ca40 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65  ne is called whe
2ca50 6e 20 69 74 20 69 73 20 6e 65 63 65 73 73 61 72  n it is necessar
2ca60 79 20 74 6f 20 6d 6f 76 65 20 74 6f 20 61 20 64  y to move to a d
2ca70 69 66 66 65 72 65 6e 74 20 70 61 67 65 0a 2a 2a  ifferent page.**
2ca80 20 6f 72 20 74 6f 20 72 65 73 74 6f 72 65 20 74   or to restore t
2ca90 68 65 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a  he cursor..**.**
2caa0 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e   The calling fun
2cab0 63 74 69 6f 6e 20 77 69 6c 6c 20 73 65 74 20 2a  ction will set *
2cac0 70 52 65 73 20 74 6f 20 30 20 6f 72 20 31 2e 20  pRes to 0 or 1. 
2cad0 20 54 68 65 20 69 6e 69 74 69 61 6c 20 2a 70 52   The initial *pR
2cae0 65 73 20 76 61 6c 75 65 0a 2a 2a 20 77 69 6c 6c  es value.** will
2caf0 20 62 65 20 31 20 69 66 20 74 68 65 20 63 75 72   be 1 if the cur
2cb00 73 6f 72 20 62 65 69 6e 67 20 73 74 65 70 70 65  sor being steppe
2cb10 64 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f  d corresponds to
2cb20 20 61 6e 20 53 51 4c 20 69 6e 64 65 78 20 61 6e   an SQL index an
2cb30 64 0a 2a 2a 20 69 66 20 74 68 69 73 20 72 6f 75  d.** if this rou
2cb40 74 69 6e 65 20 63 6f 75 6c 64 20 68 61 76 65 20  tine could have 
2cb50 62 65 65 6e 20 73 6b 69 70 70 65 64 20 69 66 20  been skipped if 
2cb60 74 68 61 74 20 53 51 4c 20 69 6e 64 65 78 20 68  that SQL index h
2cb70 61 64 20 62 65 65 6e 0a 2a 2a 20 61 20 75 6e 69  ad been.** a uni
2cb80 71 75 65 20 69 6e 64 65 78 2e 20 20 4f 74 68 65  que index.  Othe
2cb90 72 77 69 73 65 20 74 68 65 20 63 61 6c 6c 65 72  rwise the caller
2cba0 20 77 69 6c 6c 20 68 61 76 65 20 73 65 74 20 2a   will have set *
2cbb0 70 52 65 73 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2a  pRes to zero..**
2cbc0 20 5a 65 72 6f 20 69 73 20 74 68 65 20 63 6f 6d   Zero is the com
2cbd0 6d 6f 6e 20 63 61 73 65 2e 20 54 68 65 20 62 74  mon case. The bt
2cbe0 72 65 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ree implementati
2cbf0 6f 6e 20 69 73 20 66 72 65 65 20 74 6f 20 75 73  on is free to us
2cc00 65 20 74 68 65 0a 2a 2a 20 69 6e 69 74 69 61 6c  e the.** initial
2cc10 20 2a 70 52 65 73 20 76 61 6c 75 65 20 61 73 20   *pRes value as 
2cc20 61 20 68 69 6e 74 20 74 6f 20 69 6d 70 72 6f 76  a hint to improv
2cc30 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 2c 20 62  e performance, b
2cc40 75 74 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a  ut the current.*
2cc50 2a 20 53 51 4c 69 74 65 20 62 74 72 65 65 20 69  * SQLite btree i
2cc60 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 64 6f  mplementation do
2cc70 65 73 20 6e 6f 74 2e 20 28 4e 6f 74 65 20 74 68  es not. (Note th
2cc80 61 74 20 74 68 65 20 63 6f 6d 64 62 32 20 62 74  at the comdb2 bt
2cc90 72 65 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74  ree.** implement
2cca0 61 74 69 6f 6e 20 64 6f 65 73 20 75 73 65 20 74  ation does use t
2ccb0 68 69 73 20 68 69 6e 74 2c 20 68 6f 77 65 76 65  his hint, howeve
2ccc0 72 2e 29 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51  r.).*/.static SQ
2ccd0 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e  LITE_NOINLINE in
2cce0 74 20 62 74 72 65 65 50 72 65 76 69 6f 75 73 28  t btreePrevious(
2ccf0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
2cd00 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e  int *pRes){.  in
2cd10 74 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20  t rc;.  MemPage 
2cd20 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72  *pPage;..  asser
2cd30 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
2cd40 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61  tex(pCur) );.  a
2cd50 73 73 65 72 74 28 20 70 52 65 73 21 3d 30 20 29  ssert( pRes!=0 )
2cd60 3b 0a 20 20 61 73 73 65 72 74 28 20 2a 70 52 65  ;.  assert( *pRe
2cd70 73 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  s==0 );.  assert
2cd80 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74  ( pCur->skipNext
2cd90 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74  ==0 || pCur->eSt
2cda0 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate!=CURSOR_VALI
2cdb0 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  D );.  assert( (
2cdc0 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26  pCur->curFlags &
2cdd0 20 28 42 54 43 46 5f 41 74 4c 61 73 74 7c 42 54   (BTCF_AtLast|BT
2cde0 43 46 5f 56 61 6c 69 64 4f 76 66 6c 7c 42 54 43  CF_ValidOvfl|BTC
2cdf0 46 5f 56 61 6c 69 64 4e 4b 65 79 29 29 3d 3d 30  F_ValidNKey))==0
2ce00 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
2ce10 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d  ur->info.nSize==
2ce20 30 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d  0 );.  if( pCur-
2ce30 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f  >eState!=CURSOR_
2ce40 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 72 63 20  VALID ){.    rc 
2ce50 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50  = restoreCursorP
2ce60 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20  osition(pCur);. 
2ce70 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
2ce80 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
2ce90 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
2cea0 20 20 20 69 66 28 20 43 55 52 53 4f 52 5f 49 4e     if( CURSOR_IN
2ceb0 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74  VALID==pCur->eSt
2cec0 61 74 65 20 29 7b 0a 20 20 20 20 20 20 2a 70 52  ate ){.      *pR
2ced0 65 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 72 65  es = 1;.      re
2cee0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2cef0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 43      }.    if( pC
2cf00 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 29 7b 0a  ur->skipNext ){.
2cf10 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
2cf20 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
2cf30 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70 43 75 72  OR_VALID || pCur
2cf40 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
2cf50 5f 53 4b 49 50 4e 45 58 54 20 29 3b 0a 20 20 20  _SKIPNEXT );.   
2cf60 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20     pCur->eState 
2cf70 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a  = CURSOR_VALID;.
2cf80 20 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e        if( pCur->
2cf90 73 6b 69 70 4e 65 78 74 3c 30 20 29 7b 0a 20 20  skipNext<0 ){.  
2cfa0 20 20 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70        pCur->skip
2cfb0 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  Next = 0;.      
2cfc0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2cfd0 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OK;.      }.    
2cfe0 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74    pCur->skipNext
2cff0 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
2d000 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d  .  pPage = pCur-
2d010 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
2d020 61 67 65 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  age];.  assert( 
2d030 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b  pPage->isInit );
2d040 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c  .  if( !pPage->l
2d050 65 61 66 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  eaf ){.    int i
2d060 64 78 20 3d 20 70 43 75 72 2d 3e 61 69 49 64 78  dx = pCur->aiIdx
2d070 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20  [pCur->iPage];. 
2d080 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68     rc = moveToCh
2d090 69 6c 64 28 70 43 75 72 2c 20 67 65 74 34 62 79  ild(pCur, get4by
2d0a0 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 67  te(findCell(pPag
2d0b0 65 2c 20 69 64 78 29 29 29 3b 0a 20 20 20 20 69  e, idx)));.    i
2d0c0 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
2d0d0 63 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65  c;.    rc = move
2d0e0 54 6f 52 69 67 68 74 6d 6f 73 74 28 70 43 75 72  ToRightmost(pCur
2d0f0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
2d100 77 68 69 6c 65 28 20 70 43 75 72 2d 3e 61 69 49  while( pCur->aiI
2d110 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3d  dx[pCur->iPage]=
2d120 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
2d130 70 43 75 72 2d 3e 69 50 61 67 65 3d 3d 30 20 29  pCur->iPage==0 )
2d140 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e  {.        pCur->
2d150 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
2d160 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 20  INVALID;.       
2d170 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20   *pRes = 1;.    
2d180 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2d190 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  E_OK;.      }.  
2d1a0 20 20 20 20 6d 6f 76 65 54 6f 50 61 72 65 6e 74      moveToParent
2d1b0 28 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20  (pCur);.    }.  
2d1c0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2d1d0 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 3b  info.nSize==0 );
2d1e0 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70 43  .    assert( (pC
2d1f0 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 28  ur->curFlags & (
2d200 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42  BTCF_ValidNKey|B
2d210 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 29 3d  TCF_ValidOvfl))=
2d220 3d 30 20 29 3b 0a 0a 20 20 20 20 70 43 75 72 2d  =0 );..    pCur-
2d230 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
2d240 67 65 5d 2d 2d 3b 0a 20 20 20 20 70 50 61 67 65  ge]--;.    pPage
2d250 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b   = pCur->apPage[
2d260 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20  pCur->iPage];.  
2d270 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74    if( pPage->int
2d280 4b 65 79 20 26 26 20 21 70 50 61 67 65 2d 3e 6c  Key && !pPage->l
2d290 65 61 66 20 29 7b 0a 20 20 20 20 20 20 72 63 20  eaf ){.      rc 
2d2a0 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 72  = sqlite3BtreePr
2d2b0 65 76 69 6f 75 73 28 70 43 75 72 2c 20 70 52 65  evious(pCur, pRe
2d2c0 73 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  s);.    }else{. 
2d2d0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
2d2e0 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  _OK;.    }.  }. 
2d2f0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 69 6e   return rc;.}.in
2d300 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 72  t sqlite3BtreePr
2d310 65 76 69 6f 75 73 28 42 74 43 75 72 73 6f 72 20  evious(BtCursor 
2d320 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73  *pCur, int *pRes
2d330 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ){.  assert( cur
2d340 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
2d350 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
2d360 20 70 52 65 73 21 3d 30 20 29 3b 0a 20 20 61 73   pRes!=0 );.  as
2d370 73 65 72 74 28 20 2a 70 52 65 73 3d 3d 30 20 7c  sert( *pRes==0 |
2d380 7c 20 2a 70 52 65 73 3d 3d 31 20 29 3b 0a 20 20  | *pRes==1 );.  
2d390 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 73 6b  assert( pCur->sk
2d3a0 69 70 4e 65 78 74 3d 3d 30 20 7c 7c 20 70 43 75  ipNext==0 || pCu
2d3b0 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f  r->eState!=CURSO
2d3c0 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 2a 70 52  R_VALID );.  *pR
2d3d0 65 73 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e  es = 0;.  pCur->
2d3e0 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 28 42 54  curFlags &= ~(BT
2d3f0 43 46 5f 41 74 4c 61 73 74 7c 42 54 43 46 5f 56  CF_AtLast|BTCF_V
2d400 61 6c 69 64 4f 76 66 6c 7c 42 54 43 46 5f 56 61  alidOvfl|BTCF_Va
2d410 6c 69 64 4e 4b 65 79 29 3b 0a 20 20 70 43 75 72  lidNKey);.  pCur
2d420 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30  ->info.nSize = 0
2d430 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53  ;.  if( pCur->eS
2d440 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c  tate!=CURSOR_VAL
2d450 49 44 0a 20 20 20 7c 7c 20 70 43 75 72 2d 3e 61  ID.   || pCur->a
2d460 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
2d470 5d 3d 3d 30 0a 20 20 20 7c 7c 20 70 43 75 72 2d  ]==0.   || pCur-
2d480 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
2d490 61 67 65 5d 2d 3e 6c 65 61 66 3d 3d 30 0a 20 20  age]->leaf==0.  
2d4a0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 62 74  ){.    return bt
2d4b0 72 65 65 50 72 65 76 69 6f 75 73 28 70 43 75 72  reePrevious(pCur
2d4c0 2c 20 70 52 65 73 29 3b 0a 20 20 7d 0a 20 20 70  , pRes);.  }.  p
2d4d0 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
2d4e0 3e 69 50 61 67 65 5d 2d 2d 3b 0a 20 20 72 65 74  >iPage]--;.  ret
2d4f0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
2d500 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65  ../*.** Allocate
2d510 20 61 20 6e 65 77 20 70 61 67 65 20 66 72 6f 6d   a new page from
2d520 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2d530 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65  le..**.** The ne
2d540 77 20 70 61 67 65 20 69 73 20 6d 61 72 6b 65 64  w page is marked
2d550 20 61 73 20 64 69 72 74 79 2e 20 20 28 49 6e 20   as dirty.  (In 
2d560 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 73 71 6c  other words, sql
2d570 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29  ite3PagerWrite()
2d580 0a 2a 2a 20 68 61 73 20 61 6c 72 65 61 64 79 20  .** has already 
2d590 62 65 65 6e 20 63 61 6c 6c 65 64 20 6f 6e 20 74  been called on t
2d5a0 68 65 20 6e 65 77 20 70 61 67 65 2e 29 20 20 54  he new page.)  T
2d5b0 68 65 20 6e 65 77 20 70 61 67 65 20 68 61 73 20  he new page has 
2d5c0 61 6c 73 6f 0a 2a 2a 20 62 65 65 6e 20 72 65 66  also.** been ref
2d5d0 65 72 65 6e 63 65 64 20 61 6e 64 20 74 68 65 20  erenced and the 
2d5e0 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 20  calling routine 
2d5f0 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  is responsible f
2d600 6f 72 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73 71  or calling.** sq
2d610 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
2d620 29 20 6f 6e 20 74 68 65 20 6e 65 77 20 70 61 67  ) on the new pag
2d630 65 20 77 68 65 6e 20 69 74 20 69 73 20 64 6f 6e  e when it is don
2d640 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f  e..**.** SQLITE_
2d650 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 6f  OK is returned o
2d660 6e 20 73 75 63 63 65 73 73 2e 20 20 41 6e 79 20  n success.  Any 
2d670 6f 74 68 65 72 20 72 65 74 75 72 6e 20 76 61 6c  other return val
2d680 75 65 20 69 6e 64 69 63 61 74 65 73 0a 2a 2a 20  ue indicates.** 
2d690 61 6e 20 65 72 72 6f 72 2e 20 20 2a 70 70 50 61  an error.  *ppPa
2d6a0 67 65 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c  ge is set to NUL
2d6b0 4c 20 69 6e 20 74 68 65 20 65 76 65 6e 74 20 6f  L in the event o
2d6c0 66 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a  f an error..**.*
2d6d0 2a 20 49 66 20 74 68 65 20 22 6e 65 61 72 62 79  * If the "nearby
2d6e0 22 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e  " parameter is n
2d6f0 6f 74 20 30 2c 20 74 68 65 6e 20 61 6e 20 65 66  ot 0, then an ef
2d700 66 6f 72 74 20 69 73 20 6d 61 64 65 20 74 6f 20  fort is made to 
2d710 0a 2a 2a 20 6c 6f 63 61 74 65 20 61 20 70 61 67  .** locate a pag
2d720 65 20 63 6c 6f 73 65 20 74 6f 20 74 68 65 20 70  e close to the p
2d730 61 67 65 20 6e 75 6d 62 65 72 20 22 6e 65 61 72  age number "near
2d740 62 79 22 2e 20 20 54 68 69 73 20 63 61 6e 20 62  by".  This can b
2d750 65 20 75 73 65 64 20 69 6e 20 61 6e 0a 2a 2a 20  e used in an.** 
2d760 61 74 74 65 6d 70 74 20 74 6f 20 6b 65 65 70 20  attempt to keep 
2d770 72 65 6c 61 74 65 64 20 70 61 67 65 73 20 63 6c  related pages cl
2d780 6f 73 65 20 74 6f 20 65 61 63 68 20 6f 74 68 65  ose to each othe
2d790 72 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  r in the databas
2d7a0 65 20 66 69 6c 65 2c 0a 2a 2a 20 77 68 69 63 68  e file,.** which
2d7b0 20 69 6e 20 74 75 72 6e 20 63 61 6e 20 6d 61 6b   in turn can mak
2d7c0 65 20 64 61 74 61 62 61 73 65 20 61 63 63 65 73  e database acces
2d7d0 73 20 66 61 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20  s faster..**.** 
2d7e0 49 66 20 74 68 65 20 65 4d 6f 64 65 20 70 61 72  If the eMode par
2d7f0 61 6d 65 74 65 72 20 69 73 20 42 54 41 4c 4c 4f  ameter is BTALLO
2d800 43 5f 45 58 41 43 54 20 61 6e 64 20 74 68 65 20  C_EXACT and the 
2d810 6e 65 61 72 62 79 20 70 61 67 65 20 65 78 69 73  nearby page exis
2d820 74 73 0a 2a 2a 20 61 6e 79 77 68 65 72 65 20 6f  ts.** anywhere o
2d830 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c  n the free-list,
2d840 20 74 68 65 6e 20 69 74 20 69 73 20 67 75 61 72   then it is guar
2d850 61 6e 74 65 65 64 20 74 6f 20 62 65 20 72 65 74  anteed to be ret
2d860 75 72 6e 65 64 2e 20 20 49 66 0a 2a 2a 20 65 4d  urned.  If.** eM
2d870 6f 64 65 20 69 73 20 42 54 41 4c 4c 4f 43 5f 4c  ode is BTALLOC_L
2d880 54 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20  T then the page 
2d890 72 65 74 75 72 6e 65 64 20 77 69 6c 6c 20 62 65  returned will be
2d8a0 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71   less than or eq
2d8b0 75 61 6c 0a 2a 2a 20 74 6f 20 6e 65 61 72 62 79  ual.** to nearby
2d8c0 20 69 66 20 61 6e 79 20 73 75 63 68 20 70 61 67   if any such pag
2d8d0 65 20 65 78 69 73 74 73 2e 20 20 49 66 20 65 4d  e exists.  If eM
2d8e0 6f 64 65 20 69 73 20 42 54 41 4c 4c 4f 43 5f 41  ode is BTALLOC_A
2d8f0 4e 59 20 74 68 65 6e 20 74 68 65 72 65 0a 2a 2a  NY then there.**
2d900 20 61 72 65 20 6e 6f 20 72 65 73 74 72 69 63 74   are no restrict
2d910 69 6f 6e 73 20 6f 6e 20 77 68 69 63 68 20 70 61  ions on which pa
2d920 67 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  ge is returned..
2d930 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c  */.static int al
2d940 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28  locateBtreePage(
2d950 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
2d960 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ,         /* The
2d970 20 62 74 72 65 65 20 2a 2f 0a 20 20 4d 65 6d 50   btree */.  MemP
2d980 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20  age **ppPage,   
2d990 20 20 20 2f 2a 20 53 74 6f 72 65 20 70 6f 69 6e     /* Store poin
2d9a0 74 65 72 20 74 6f 20 74 68 65 20 61 6c 6c 6f 63  ter to the alloc
2d9b0 61 74 65 64 20 70 61 67 65 20 68 65 72 65 20 2a  ated page here *
2d9c0 2f 0a 20 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 2c  /.  Pgno *pPgno,
2d9d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74             /* St
2d9e0 6f 72 65 20 74 68 65 20 70 61 67 65 20 6e 75 6d  ore the page num
2d9f0 62 65 72 20 68 65 72 65 20 2a 2f 0a 20 20 50 67  ber here */.  Pg
2da00 6e 6f 20 6e 65 61 72 62 79 2c 20 20 20 20 20 20  no nearby,      
2da10 20 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20 66       /* Search f
2da20 6f 72 20 61 20 70 61 67 65 20 6e 65 61 72 20 74  or a page near t
2da30 68 69 73 20 6f 6e 65 20 2a 2f 0a 20 20 75 38 20  his one */.  u8 
2da40 65 4d 6f 64 65 20 20 20 20 20 20 20 20 20 20 20  eMode           
2da50 20 20 20 20 2f 2a 20 42 54 41 4c 4c 4f 43 5f 45      /* BTALLOC_E
2da60 58 41 43 54 2c 20 42 54 41 4c 4c 4f 43 5f 4c 54  XACT, BTALLOC_LT
2da70 2c 20 6f 72 20 42 54 41 4c 4c 4f 43 5f 41 4e 59  , or BTALLOC_ANY
2da80 20 2a 2f 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65   */.){.  MemPage
2da90 20 2a 70 50 61 67 65 31 3b 0a 20 20 69 6e 74 20   *pPage1;.  int 
2daa0 72 63 3b 0a 20 20 75 33 32 20 6e 3b 20 20 20 20  rc;.  u32 n;    
2dab0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
2dac0 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c  ges on the freel
2dad0 69 73 74 20 2a 2f 0a 20 20 75 33 32 20 6b 3b 20  ist */.  u32 k; 
2dae0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
2daf0 20 6c 65 61 76 65 73 20 6f 6e 20 74 68 65 20 74   leaves on the t
2db00 72 75 6e 6b 20 6f 66 20 74 68 65 20 66 72 65 65  runk of the free
2db10 6c 69 73 74 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  list */.  MemPag
2db20 65 20 2a 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20  e *pTrunk = 0;. 
2db30 20 4d 65 6d 50 61 67 65 20 2a 70 50 72 65 76 54   MemPage *pPrevT
2db40 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 50 67 6e 6f  runk = 0;.  Pgno
2db50 20 6d 78 50 61 67 65 3b 20 20 20 20 20 2f 2a 20   mxPage;     /* 
2db60 54 6f 74 61 6c 20 73 69 7a 65 20 6f 66 20 74 68  Total size of th
2db70 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
2db80 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  */..  assert( sq
2db90 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
2dba0 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
2dbb0 20 20 61 73 73 65 72 74 28 20 65 4d 6f 64 65 3d    assert( eMode=
2dbc0 3d 42 54 41 4c 4c 4f 43 5f 41 4e 59 20 7c 7c 20  =BTALLOC_ANY || 
2dbd0 28 6e 65 61 72 62 79 3e 30 20 26 26 20 49 66 4e  (nearby>0 && IfN
2dbe0 6f 74 4f 6d 69 74 41 56 28 70 42 74 2d 3e 61 75  otOmitAV(pBt->au
2dbf0 74 6f 56 61 63 75 75 6d 29 29 20 29 3b 0a 20 20  toVacuum)) );.  
2dc00 70 50 61 67 65 31 20 3d 20 70 42 74 2d 3e 70 50  pPage1 = pBt->pP
2dc10 61 67 65 31 3b 0a 20 20 6d 78 50 61 67 65 20 3d  age1;.  mxPage =
2dc20 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28   btreePagecount(
2dc30 70 42 74 29 3b 0a 20 20 2f 2a 20 45 56 49 44 45  pBt);.  /* EVIDE
2dc40 4e 43 45 2d 4f 46 3a 20 52 2d 30 35 31 31 39 2d  NCE-OF: R-05119-
2dc50 30 32 36 33 37 20 54 68 65 20 34 2d 62 79 74 65  02637 The 4-byte
2dc60 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65   big-endian inte
2dc70 67 65 72 20 61 74 20 6f 66 66 73 65 74 20 33 36  ger at offset 36
2dc80 0a 20 20 2a 2a 20 73 74 6f 72 65 73 20 73 74 6f  .  ** stores sto
2dc90 72 65 73 20 74 68 65 20 74 6f 74 61 6c 20 6e 75  res the total nu
2dca0 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 6f 6e  mber of pages on
2dcb0 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20 2a   the freelist. *
2dcc0 2f 0a 20 20 6e 20 3d 20 67 65 74 34 62 79 74 65  /.  n = get4byte
2dcd0 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
2dce0 33 36 5d 29 3b 0a 20 20 74 65 73 74 63 61 73 65  36]);.  testcase
2dcf0 28 20 6e 3d 3d 6d 78 50 61 67 65 2d 31 20 29 3b  ( n==mxPage-1 );
2dd00 0a 20 20 69 66 28 20 6e 3e 3d 6d 78 50 61 67 65  .  if( n>=mxPage
2dd10 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
2dd20 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
2dd30 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 3e  PT;.  }.  if( n>
2dd40 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72  0 ){.    /* Ther
2dd50 65 20 61 72 65 20 70 61 67 65 73 20 6f 6e 20 74  e are pages on t
2dd60 68 65 20 66 72 65 65 6c 69 73 74 2e 20 20 52 65  he freelist.  Re
2dd70 75 73 65 20 6f 6e 65 20 6f 66 20 74 68 6f 73 65  use one of those
2dd80 20 70 61 67 65 73 2e 20 2a 2f 0a 20 20 20 20 50   pages. */.    P
2dd90 67 6e 6f 20 69 54 72 75 6e 6b 3b 0a 20 20 20 20  gno iTrunk;.    
2dda0 75 38 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20  u8 searchList = 
2ddb0 30 3b 20 2f 2a 20 49 66 20 74 68 65 20 66 72 65  0; /* If the fre
2ddc0 65 2d 6c 69 73 74 20 6d 75 73 74 20 62 65 20 73  e-list must be s
2ddd0 65 61 72 63 68 65 64 20 66 6f 72 20 27 6e 65 61  earched for 'nea
2dde0 72 62 79 27 20 2a 2f 0a 20 20 20 20 75 33 32 20  rby' */.    u32 
2ddf0 6e 53 65 61 72 63 68 20 3d 20 30 3b 20 20 20 2f  nSearch = 0;   /
2de00 2a 20 43 6f 75 6e 74 20 6f 66 20 74 68 65 20 6e  * Count of the n
2de10 75 6d 62 65 72 20 6f 66 20 73 65 61 72 63 68 20  umber of search 
2de20 61 74 74 65 6d 70 74 73 20 2a 2f 0a 20 20 20 20  attempts */.    
2de30 0a 20 20 20 20 2f 2a 20 49 66 20 65 4d 6f 64 65  .    /* If eMode
2de40 3d 3d 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20  ==BTALLOC_EXACT 
2de50 61 6e 64 20 61 20 71 75 65 72 79 20 6f 66 20 74  and a query of t
2de60 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20  he pointer-map. 
2de70 20 20 20 2a 2a 20 73 68 6f 77 73 20 74 68 61 74     ** shows that
2de80 20 74 68 65 20 70 61 67 65 20 27 6e 65 61 72 62   the page 'nearb
2de90 79 27 20 69 73 20 73 6f 6d 65 77 68 65 72 65 20  y' is somewhere 
2dea0 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  on the free-list
2deb0 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 74 68  , then.    ** th
2dec0 65 20 65 6e 74 69 72 65 2d 6c 69 73 74 20 77 69  e entire-list wi
2ded0 6c 6c 20 62 65 20 73 65 61 72 63 68 65 64 20 66  ll be searched f
2dee0 6f 72 20 74 68 61 74 20 70 61 67 65 2e 0a 20 20  or that page..  
2def0 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c    */.#ifndef SQL
2df00 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
2df10 55 55 4d 0a 20 20 20 20 69 66 28 20 65 4d 6f 64  UUM.    if( eMod
2df20 65 3d 3d 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54  e==BTALLOC_EXACT
2df30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 65   ){.      if( ne
2df40 61 72 62 79 3c 3d 6d 78 50 61 67 65 20 29 7b 0a  arby<=mxPage ){.
2df50 20 20 20 20 20 20 20 20 75 38 20 65 54 79 70 65          u8 eType
2df60 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
2df70 28 20 6e 65 61 72 62 79 3e 30 20 29 3b 0a 20 20  ( nearby>0 );.  
2df80 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 42        assert( pB
2df90 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 3b  t->autoVacuum );
2dfa0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 74  .        rc = pt
2dfb0 72 6d 61 70 47 65 74 28 70 42 74 2c 20 6e 65 61  rmapGet(pBt, nea
2dfc0 72 62 79 2c 20 26 65 54 79 70 65 2c 20 30 29 3b  rby, &eType, 0);
2dfd0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20  .        if( rc 
2dfe0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
2dff0 20 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d       if( eType==
2e000 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45 20  PTRMAP_FREEPAGE 
2e010 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 65 61  ){.          sea
2e020 72 63 68 4c 69 73 74 20 3d 20 31 3b 0a 20 20 20  rchList = 1;.   
2e030 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
2e040 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65 4d 6f     }else if( eMo
2e050 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45 20 29  de==BTALLOC_LE )
2e060 7b 0a 20 20 20 20 20 20 73 65 61 72 63 68 4c 69  {.      searchLi
2e070 73 74 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 23 65  st = 1;.    }.#e
2e080 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 44 65 63  ndif..    /* Dec
2e090 72 65 6d 65 6e 74 20 74 68 65 20 66 72 65 65 2d  rement the free-
2e0a0 6c 69 73 74 20 63 6f 75 6e 74 20 62 79 20 31 2e  list count by 1.
2e0b0 20 53 65 74 20 69 54 72 75 6e 6b 20 74 6f 20 74   Set iTrunk to t
2e0c0 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 0a  he index of the.
2e0d0 20 20 20 20 2a 2a 20 66 69 72 73 74 20 66 72 65      ** first fre
2e0e0 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67  e-list trunk pag
2e0f0 65 2e 20 69 50 72 65 76 54 72 75 6e 6b 20 69 73  e. iPrevTrunk is
2e100 20 69 6e 69 74 69 61 6c 6c 79 20 31 2e 0a 20 20   initially 1..  
2e110 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71    */.    rc = sq
2e120 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
2e130 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29  pPage1->pDbPage)
2e140 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  ;.    if( rc ) r
2e150 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 75  eturn rc;.    pu
2e160 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e  t4byte(&pPage1->
2e170 61 44 61 74 61 5b 33 36 5d 2c 20 6e 2d 31 29 3b  aData[36], n-1);
2e180 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 64  ..    /* The cod
2e190 65 20 77 69 74 68 69 6e 20 74 68 69 73 20 6c 6f  e within this lo
2e1a0 6f 70 20 69 73 20 72 75 6e 20 6f 6e 6c 79 20 6f  op is run only o
2e1b0 6e 63 65 20 69 66 20 74 68 65 20 27 73 65 61 72  nce if the 'sear
2e1c0 63 68 4c 69 73 74 27 20 76 61 72 69 61 62 6c 65  chList' variable
2e1d0 0a 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 74  .    ** is not t
2e1e0 72 75 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  rue. Otherwise, 
2e1f0 69 74 20 72 75 6e 73 20 6f 6e 63 65 20 66 6f 72  it runs once for
2e200 20 65 61 63 68 20 74 72 75 6e 6b 2d 70 61 67 65   each trunk-page
2e210 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 66   on the.    ** f
2e220 72 65 65 2d 6c 69 73 74 20 75 6e 74 69 6c 20 74  ree-list until t
2e230 68 65 20 70 61 67 65 20 27 6e 65 61 72 62 79 27  he page 'nearby'
2e240 20 69 73 20 6c 6f 63 61 74 65 64 20 28 65 4d 6f   is located (eMo
2e250 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 45 58 41 43  de==BTALLOC_EXAC
2e260 54 29 0a 20 20 20 20 2a 2a 20 6f 72 20 75 6e 74  T).    ** or unt
2e270 69 6c 20 61 20 70 61 67 65 20 6c 65 73 73 20 74  il a page less t
2e280 68 61 6e 20 27 6e 65 61 72 62 79 27 20 69 73 20  han 'nearby' is 
2e290 6c 6f 63 61 74 65 64 20 28 65 4d 6f 64 65 3d 3d  located (eMode==
2e2a0 42 54 41 4c 4c 4f 43 5f 4c 54 29 0a 20 20 20 20  BTALLOC_LT).    
2e2b0 2a 2f 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20  */.    do {.    
2e2c0 20 20 70 50 72 65 76 54 72 75 6e 6b 20 3d 20 70    pPrevTrunk = p
2e2d0 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 69 66 28  Trunk;.      if(
2e2e0 20 70 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20   pPrevTrunk ){. 
2e2f0 20 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e         /* EVIDEN
2e300 43 45 2d 4f 46 3a 20 52 2d 30 31 35 30 36 2d 31  CE-OF: R-01506-1
2e310 31 30 35 33 20 54 68 65 20 66 69 72 73 74 20 69  1053 The first i
2e320 6e 74 65 67 65 72 20 6f 6e 20 61 20 66 72 65 65  nteger on a free
2e330 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 0a  list trunk page.
2e340 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20 74 68          ** is th
2e350 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  e page number of
2e360 20 74 68 65 20 6e 65 78 74 20 66 72 65 65 6c 69   the next freeli
2e370 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20 69 6e  st trunk page in
2e380 20 74 68 65 20 6c 69 73 74 20 6f 72 0a 20 20 20   the list or.   
2e390 20 20 20 20 20 2a 2a 20 7a 65 72 6f 20 69 66 20       ** zero if 
2e3a0 74 68 69 73 20 69 73 20 74 68 65 20 6c 61 73 74  this is the last
2e3b0 20 66 72 65 65 6c 69 73 74 20 74 72 75 6e 6b 20   freelist trunk 
2e3c0 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20  page. */.       
2e3d0 20 69 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79   iTrunk = get4by
2e3e0 74 65 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e  te(&pPrevTrunk->
2e3f0 61 44 61 74 61 5b 30 5d 29 3b 0a 20 20 20 20 20  aData[0]);.     
2e400 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2e410 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
2e420 52 2d 35 39 38 34 31 2d 31 33 37 39 38 20 54 68  R-59841-13798 Th
2e430 65 20 34 2d 62 79 74 65 20 62 69 67 2d 65 6e 64  e 4-byte big-end
2e440 69 61 6e 20 69 6e 74 65 67 65 72 20 61 74 20 6f  ian integer at o
2e450 66 66 73 65 74 20 33 32 0a 20 20 20 20 20 20 20  ffset 32.       
2e460 20 2a 2a 20 73 74 6f 72 65 73 20 74 68 65 20 70   ** stores the p
2e470 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  age number of th
2e480 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 20  e first page of 
2e490 74 68 65 20 66 72 65 65 6c 69 73 74 2c 20 6f 72  the freelist, or
2e4a0 20 7a 65 72 6f 20 69 66 0a 20 20 20 20 20 20 20   zero if.       
2e4b0 20 2a 2a 20 74 68 65 20 66 72 65 65 6c 69 73 74   ** the freelist
2e4c0 20 69 73 20 65 6d 70 74 79 2e 20 2a 2f 0a 20 20   is empty. */.  
2e4d0 20 20 20 20 20 20 69 54 72 75 6e 6b 20 3d 20 67        iTrunk = g
2e4e0 65 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d  et4byte(&pPage1-
2e4f0 3e 61 44 61 74 61 5b 33 32 5d 29 3b 0a 20 20 20  >aData[32]);.   
2e500 20 20 20 7d 0a 20 20 20 20 20 20 74 65 73 74 63     }.      testc
2e510 61 73 65 28 20 69 54 72 75 6e 6b 3d 3d 6d 78 50  ase( iTrunk==mxP
2e520 61 67 65 20 29 3b 0a 20 20 20 20 20 20 69 66 28  age );.      if(
2e530 20 69 54 72 75 6e 6b 3e 6d 78 50 61 67 65 20 7c   iTrunk>mxPage |
2e540 7c 20 6e 53 65 61 72 63 68 2b 2b 20 3e 20 6e 20  | nSearch++ > n 
2e550 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
2e560 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
2e570 4b 50 54 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  KPT;.      }else
2e580 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 62  {.        rc = b
2e590 74 72 65 65 47 65 74 55 6e 75 73 65 64 50 61 67  treeGetUnusedPag
2e5a0 65 28 70 42 74 2c 20 69 54 72 75 6e 6b 2c 20 26  e(pBt, iTrunk, &
2e5b0 70 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20  pTrunk, 0);.    
2e5c0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63    }.      if( rc
2e5d0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 54 72 75   ){.        pTru
2e5e0 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  nk = 0;.        
2e5f0 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
2e600 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 7d 0a  e_page;.      }.
2e610 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54        assert( pT
2e620 72 75 6e 6b 21 3d 30 20 29 3b 0a 20 20 20 20 20  runk!=0 );.     
2e630 20 61 73 73 65 72 74 28 20 70 54 72 75 6e 6b 2d   assert( pTrunk-
2e640 3e 61 44 61 74 61 21 3d 30 20 29 3b 0a 20 20 20  >aData!=0 );.   
2e650 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
2e660 46 3a 20 52 2d 31 33 35 32 33 2d 30 34 33 39 34  F: R-13523-04394
2e670 20 54 68 65 20 73 65 63 6f 6e 64 20 69 6e 74 65   The second inte
2e680 67 65 72 20 6f 6e 20 61 20 66 72 65 65 6c 69 73  ger on a freelis
2e690 74 20 74 72 75 6e 6b 20 70 61 67 65 0a 20 20 20  t trunk page.   
2e6a0 20 20 20 2a 2a 20 69 73 20 74 68 65 20 6e 75 6d     ** is the num
2e6b0 62 65 72 20 6f 66 20 6c 65 61 66 20 70 61 67 65  ber of leaf page
2e6c0 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 66 6f 6c   pointers to fol
2e6d0 6c 6f 77 2e 20 2a 2f 0a 20 20 20 20 20 20 6b 20  low. */.      k 
2e6e0 3d 20 67 65 74 34 62 79 74 65 28 26 70 54 72 75  = get4byte(&pTru
2e6f0 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 29 3b 0a 20  nk->aData[4]);. 
2e700 20 20 20 20 20 69 66 28 20 6b 3d 3d 30 20 26 26       if( k==0 &&
2e710 20 21 73 65 61 72 63 68 4c 69 73 74 20 29 7b 0a   !searchList ){.
2e720 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74          /* The t
2e730 72 75 6e 6b 20 68 61 73 20 6e 6f 20 6c 65 61 76  runk has no leav
2e740 65 73 20 61 6e 64 20 74 68 65 20 6c 69 73 74 20  es and the list 
2e750 69 73 20 6e 6f 74 20 62 65 69 6e 67 20 73 65 61  is not being sea
2e760 72 63 68 65 64 2e 20 0a 20 20 20 20 20 20 20 20  rched. .        
2e770 2a 2a 20 53 6f 20 65 78 74 72 61 63 74 20 74 68  ** So extract th
2e780 65 20 74 72 75 6e 6b 20 70 61 67 65 20 69 74 73  e trunk page its
2e790 65 6c 66 20 61 6e 64 20 75 73 65 20 69 74 20 61  elf and use it a
2e7a0 73 20 74 68 65 20 6e 65 77 6c 79 20 0a 20 20 20  s the newly .   
2e7b0 20 20 20 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65       ** allocate
2e7c0 64 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20  d page */.      
2e7d0 20 20 61 73 73 65 72 74 28 20 70 50 72 65 76 54    assert( pPrevT
2e7e0 72 75 6e 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 20  runk==0 );.     
2e7f0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
2e800 61 67 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b  agerWrite(pTrunk
2e810 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
2e820 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
2e830 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
2e840 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
2e850 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2e860 20 20 2a 70 50 67 6e 6f 20 3d 20 69 54 72 75 6e    *pPgno = iTrun
2e870 6b 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  k;.        memcp
2e880 79 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  y(&pPage1->aData
2e890 5b 33 32 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61  [32], &pTrunk->a
2e8a0 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20  Data[0], 4);.   
2e8b0 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70       *ppPage = p
2e8c0 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 70  Trunk;.        p
2e8d0 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20  Trunk = 0;.     
2e8e0 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43     TRACE(("ALLOC
2e8f0 41 54 45 3a 20 25 64 20 74 72 75 6e 6b 20 2d 20  ATE: %d trunk - 
2e900 25 64 20 66 72 65 65 20 70 61 67 65 73 20 6c 65  %d free pages le
2e910 66 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f 2c 20 6e  ft\n", *pPgno, n
2e920 2d 31 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  -1));.      }els
2e930 65 20 69 66 28 20 6b 3e 28 75 33 32 29 28 70 42  e if( k>(u32)(pB
2e940 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34 20  t->usableSize/4 
2e950 2d 20 32 29 20 29 7b 0a 20 20 20 20 20 20 20 20  - 2) ){.        
2e960 2f 2a 20 56 61 6c 75 65 20 6f 66 20 6b 20 69 73  /* Value of k is
2e970 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 20 20   out of range.  
2e980 44 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74  Database corrupt
2e990 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 72  ion */.        r
2e9a0 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
2e9b0 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20  PT_BKPT;.       
2e9c0 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
2e9d0 74 65 5f 70 61 67 65 3b 0a 23 69 66 6e 64 65 66  te_page;.#ifndef
2e9e0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
2e9f0 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 7d 65  OVACUUM.      }e
2ea00 6c 73 65 20 69 66 28 20 73 65 61 72 63 68 4c 69  lse if( searchLi
2ea10 73 74 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  st .            
2ea20 26 26 20 28 6e 65 61 72 62 79 3d 3d 69 54 72 75  && (nearby==iTru
2ea30 6e 6b 20 7c 7c 20 28 69 54 72 75 6e 6b 3c 6e 65  nk || (iTrunk<ne
2ea40 61 72 62 79 20 26 26 20 65 4d 6f 64 65 3d 3d 42  arby && eMode==B
2ea50 54 41 4c 4c 4f 43 5f 4c 45 29 29 20 0a 20 20 20  TALLOC_LE)) .   
2ea60 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a     ){.        /*
2ea70 20 54 68 65 20 6c 69 73 74 20 69 73 20 62 65 69   The list is bei
2ea80 6e 67 20 73 65 61 72 63 68 65 64 20 61 6e 64 20  ng searched and 
2ea90 74 68 69 73 20 74 72 75 6e 6b 20 70 61 67 65 20  this trunk page 
2eaa0 69 73 20 74 68 65 20 70 61 67 65 0a 20 20 20 20  is the page.    
2eab0 20 20 20 20 2a 2a 20 74 6f 20 61 6c 6c 6f 63 61      ** to alloca
2eac0 74 65 2c 20 72 65 67 61 72 64 6c 65 73 73 20 6f  te, regardless o
2ead0 66 20 77 68 65 74 68 65 72 20 69 74 20 68 61 73  f whether it has
2eae0 20 6c 65 61 76 65 73 2e 0a 20 20 20 20 20 20 20   leaves..       
2eaf0 20 2a 2f 0a 20 20 20 20 20 20 20 20 2a 70 50 67   */.        *pPg
2eb00 6e 6f 20 3d 20 69 54 72 75 6e 6b 3b 0a 20 20 20  no = iTrunk;.   
2eb10 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70       *ppPage = p
2eb20 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 73  Trunk;.        s
2eb30 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b 0a 20  earchList = 0;. 
2eb40 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
2eb50 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 54  te3PagerWrite(pT
2eb60 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a  runk->pDbPage);.
2eb70 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
2eb80 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  {.          goto
2eb90 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
2eba0 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ge;.        }.  
2ebb0 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 30 20 29        if( k==0 )
2ebc0 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
2ebd0 21 70 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20  !pPrevTrunk ){. 
2ebe0 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70             memcp
2ebf0 79 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  y(&pPage1->aData
2ec00 5b 33 32 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61  [32], &pTrunk->a
2ec10 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20  Data[0], 4);.   
2ec20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
2ec30 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
2ec40 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
2ec50 28 70 50 72 65 76 54 72 75 6e 6b 2d 3e 70 44 62  (pPrevTrunk->pDb
2ec60 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
2ec70 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
2ec80 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
2ec90 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
2eca0 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
2ecb0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2ecc0 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
2ecd0 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74  pPrevTrunk->aDat
2ece0 61 5b 30 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61  a[0], &pTrunk->a
2ecf0 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20  Data[0], 4);.   
2ed00 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2ed10 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2ed20 20 20 2f 2a 20 54 68 65 20 74 72 75 6e 6b 20 70    /* The trunk p
2ed30 61 67 65 20 69 73 20 72 65 71 75 69 72 65 64 20  age is required 
2ed40 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20 62 75  by the caller bu
2ed50 74 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 0a 20  t it contains . 
2ed60 20 20 20 20 20 20 20 20 20 2a 2a 20 70 6f 69 6e           ** poin
2ed70 74 65 72 73 20 74 6f 20 66 72 65 65 2d 6c 69 73  ters to free-lis
2ed80 74 20 6c 65 61 76 65 73 2e 20 54 68 65 20 66 69  t leaves. The fi
2ed90 72 73 74 20 6c 65 61 66 20 62 65 63 6f 6d 65 73  rst leaf becomes
2eda0 20 61 20 74 72 75 6e 6b 0a 20 20 20 20 20 20 20   a trunk.       
2edb0 20 20 20 2a 2a 20 70 61 67 65 20 69 6e 20 74 68     ** page in th
2edc0 69 73 20 63 61 73 65 2e 0a 20 20 20 20 20 20 20  is case..       
2edd0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
2ede0 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 54 72 75  MemPage *pNewTru
2edf0 6e 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 50 67  nk;.          Pg
2ee00 6e 6f 20 69 4e 65 77 54 72 75 6e 6b 20 3d 20 67  no iNewTrunk = g
2ee10 65 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d  et4byte(&pTrunk-
2ee20 3e 61 44 61 74 61 5b 38 5d 29 3b 0a 20 20 20 20  >aData[8]);.    
2ee30 20 20 20 20 20 20 69 66 28 20 69 4e 65 77 54 72        if( iNewTr
2ee40 75 6e 6b 3e 6d 78 50 61 67 65 20 29 7b 20 0a 20  unk>mxPage ){ . 
2ee50 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
2ee60 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
2ee70 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 20  KPT;.           
2ee80 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
2ee90 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20  te_page;.       
2eea0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 74     }.          t
2eeb0 65 73 74 63 61 73 65 28 20 69 4e 65 77 54 72 75  estcase( iNewTru
2eec0 6e 6b 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20  nk==mxPage );.  
2eed0 20 20 20 20 20 20 20 20 72 63 20 3d 20 62 74 72          rc = btr
2eee0 65 65 47 65 74 55 6e 75 73 65 64 50 61 67 65 28  eeGetUnusedPage(
2eef0 70 42 74 2c 20 69 4e 65 77 54 72 75 6e 6b 2c 20  pBt, iNewTrunk, 
2ef00 26 70 4e 65 77 54 72 75 6e 6b 2c 20 30 29 3b 0a  &pNewTrunk, 0);.
2ef10 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
2ef20 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2ef30 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20             goto 
2ef40 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67  end_allocate_pag
2ef50 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  e;.          }. 
2ef60 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
2ef70 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
2ef80 70 4e 65 77 54 72 75 6e 6b 2d 3e 70 44 62 50 61  pNewTrunk->pDbPa
2ef90 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ge);.          i
2efa0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2efb0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2efc0 72 65 6c 65 61 73 65 50 61 67 65 28 70 4e 65 77  releasePage(pNew
2efd0 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20  Trunk);.        
2efe0 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c      goto end_all
2eff0 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20  ocate_page;.    
2f000 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2f010 20 20 6d 65 6d 63 70 79 28 26 70 4e 65 77 54 72    memcpy(&pNewTr
2f020 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 26  unk->aData[0], &
2f030 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d  pTrunk->aData[0]
2f040 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 4);.          
2f050 70 75 74 34 62 79 74 65 28 26 70 4e 65 77 54 72  put4byte(&pNewTr
2f060 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 6b  unk->aData[4], k
2f070 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6d  -1);.          m
2f080 65 6d 63 70 79 28 26 70 4e 65 77 54 72 75 6e 6b  emcpy(&pNewTrunk
2f090 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 26 70 54 72  ->aData[8], &pTr
2f0a0 75 6e 6b 2d 3e 61 44 61 74 61 5b 31 32 5d 2c 20  unk->aData[12], 
2f0b0 28 6b 2d 31 29 2a 34 29 3b 0a 20 20 20 20 20 20  (k-1)*4);.      
2f0c0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
2f0d0 70 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20  pNewTrunk);.    
2f0e0 20 20 20 20 20 20 69 66 28 20 21 70 50 72 65 76        if( !pPrev
2f0f0 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20  Trunk ){.       
2f100 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c       assert( sql
2f110 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
2f120 61 62 6c 65 28 70 50 61 67 65 31 2d 3e 70 44 62  able(pPage1->pDb
2f130 50 61 67 65 29 20 29 3b 0a 20 20 20 20 20 20 20  Page) );.       
2f140 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
2f150 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d  Page1->aData[32]
2f160 2c 20 69 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20  , iNewTrunk);.  
2f170 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
2f180 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
2f190 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
2f1a0 65 28 70 50 72 65 76 54 72 75 6e 6b 2d 3e 70 44  e(pPrevTrunk->pD
2f1b0 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
2f1c0 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
2f1d0 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f              goto
2f1e0 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
2f1f0 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ge;.            
2f200 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 75  }.            pu
2f210 74 34 62 79 74 65 28 26 70 50 72 65 76 54 72 75  t4byte(&pPrevTru
2f220 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 69 4e  nk->aData[0], iN
2f230 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20  ewTrunk);.      
2f240 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
2f250 20 20 20 20 20 20 20 20 70 54 72 75 6e 6b 20 3d          pTrunk =
2f260 20 30 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43   0;.        TRAC
2f270 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64  E(("ALLOCATE: %d
2f280 20 74 72 75 6e 6b 20 2d 20 25 64 20 66 72 65 65   trunk - %d free
2f290 20 70 61 67 65 73 20 6c 65 66 74 5c 6e 22 2c 20   pages left\n", 
2f2a0 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 23  *pPgno, n-1));.#
2f2b0 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 65 6c 73  endif.      }els
2f2c0 65 20 69 66 28 20 6b 3e 30 20 29 7b 0a 20 20 20  e if( k>0 ){.   
2f2d0 20 20 20 20 20 2f 2a 20 45 78 74 72 61 63 74 20       /* Extract 
2f2e0 61 20 6c 65 61 66 20 66 72 6f 6d 20 74 68 65 20  a leaf from the 
2f2f0 74 72 75 6e 6b 20 2a 2f 0a 20 20 20 20 20 20 20  trunk */.       
2f300 20 75 33 32 20 63 6c 6f 73 65 73 74 3b 0a 20 20   u32 closest;.  
2f310 20 20 20 20 20 20 50 67 6e 6f 20 69 50 61 67 65        Pgno iPage
2f320 3b 0a 20 20 20 20 20 20 20 20 75 6e 73 69 67 6e  ;.        unsign
2f330 65 64 20 63 68 61 72 20 2a 61 44 61 74 61 20 3d  ed char *aData =
2f340 20 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 3b 0a   pTrunk->aData;.
2f350 20 20 20 20 20 20 20 20 69 66 28 20 6e 65 61 72          if( near
2f360 62 79 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  by>0 ){.        
2f370 20 20 75 33 32 20 69 3b 0a 20 20 20 20 20 20 20    u32 i;.       
2f380 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 30 3b 0a     closest = 0;.
2f390 20 20 20 20 20 20 20 20 20 20 69 66 28 20 65 4d            if( eM
2f3a0 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45 20  ode==BTALLOC_LE 
2f3b0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66  ){.            f
2f3c0 6f 72 28 69 3d 30 3b 20 69 3c 6b 3b 20 69 2b 2b  or(i=0; i<k; i++
2f3d0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
2f3e0 20 69 50 61 67 65 20 3d 20 67 65 74 34 62 79 74   iPage = get4byt
2f3f0 65 28 26 61 44 61 74 61 5b 38 2b 69 2a 34 5d 29  e(&aData[8+i*4])
2f400 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
2f410 69 66 28 20 69 50 61 67 65 3c 3d 6e 65 61 72 62  if( iPage<=nearb
2f420 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  y ){.           
2f430 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 69       closest = i
2f440 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
2f450 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
2f460 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2f470 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2f480 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2f490 20 20 20 20 69 6e 74 20 64 69 73 74 3b 0a 20 20      int dist;.  
2f4a0 20 20 20 20 20 20 20 20 20 20 64 69 73 74 20 3d            dist =
2f4b0 20 73 71 6c 69 74 65 33 41 62 73 49 6e 74 33 32   sqlite3AbsInt32
2f4c0 28 67 65 74 34 62 79 74 65 28 26 61 44 61 74 61  (get4byte(&aData
2f4d0 5b 38 5d 29 20 2d 20 6e 65 61 72 62 79 29 3b 0a  [8]) - nearby);.
2f4e0 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28              for(
2f4f0 69 3d 31 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a  i=1; i<k; i++){.
2f500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e                in
2f510 74 20 64 32 20 3d 20 73 71 6c 69 74 65 33 41 62  t d2 = sqlite3Ab
2f520 73 49 6e 74 33 32 28 67 65 74 34 62 79 74 65 28  sInt32(get4byte(
2f530 26 61 44 61 74 61 5b 38 2b 69 2a 34 5d 29 20 2d  &aData[8+i*4]) -
2f540 20 6e 65 61 72 62 79 29 3b 0a 20 20 20 20 20 20   nearby);.      
2f550 20 20 20 20 20 20 20 20 69 66 28 20 64 32 3c 64          if( d2<d
2f560 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ist ){.         
2f570 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d         closest =
2f580 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   i;.            
2f590 20 20 20 20 64 69 73 74 20 3d 20 64 32 3b 0a 20      dist = d2;. 
2f5a0 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
2f5b0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
2f5c0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2f5d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2f5e0 20 20 63 6c 6f 73 65 73 74 20 3d 20 30 3b 0a 20    closest = 0;. 
2f5f0 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
2f600 20 20 69 50 61 67 65 20 3d 20 67 65 74 34 62 79    iPage = get4by
2f610 74 65 28 26 61 44 61 74 61 5b 38 2b 63 6c 6f 73  te(&aData[8+clos
2f620 65 73 74 2a 34 5d 29 3b 0a 20 20 20 20 20 20 20  est*4]);.       
2f630 20 74 65 73 74 63 61 73 65 28 20 69 50 61 67 65   testcase( iPage
2f640 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20 20 20  ==mxPage );.    
2f650 20 20 20 20 69 66 28 20 69 50 61 67 65 3e 6d 78      if( iPage>mx
2f660 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Page ){.        
2f670 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
2f680 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
2f690 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
2f6a0 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
2f6b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2f6c0 74 65 73 74 63 61 73 65 28 20 69 50 61 67 65 3d  testcase( iPage=
2f6d0 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20 20 20 20  =mxPage );.     
2f6e0 20 20 20 69 66 28 20 21 73 65 61 72 63 68 4c 69     if( !searchLi
2f6f0 73 74 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  st .         || 
2f700 28 69 50 61 67 65 3d 3d 6e 65 61 72 62 79 20 7c  (iPage==nearby |
2f710 7c 20 28 69 50 61 67 65 3c 6e 65 61 72 62 79 20  | (iPage<nearby 
2f720 26 26 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f  && eMode==BTALLO
2f730 43 5f 4c 45 29 29 20 0a 20 20 20 20 20 20 20 20  C_LE)) .        
2f740 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  ){.          int
2f750 20 6e 6f 43 6f 6e 74 65 6e 74 3b 0a 20 20 20 20   noContent;.    
2f760 20 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 69        *pPgno = i
2f770 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Page;.          
2f780 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45  TRACE(("ALLOCATE
2f790 3a 20 25 64 20 77 61 73 20 6c 65 61 66 20 25 64  : %d was leaf %d
2f7a0 20 6f 66 20 25 64 20 6f 6e 20 74 72 75 6e 6b 20   of %d on trunk 
2f7b0 25 64 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  %d".            
2f7c0 20 20 20 20 20 22 3a 20 25 64 20 6d 6f 72 65 20       ": %d more 
2f7d0 66 72 65 65 20 70 61 67 65 73 5c 6e 22 2c 0a 20  free pages\n",. 
2f7e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f7f0 2a 70 50 67 6e 6f 2c 20 63 6c 6f 73 65 73 74 2b  *pPgno, closest+
2f800 31 2c 20 6b 2c 20 70 54 72 75 6e 6b 2d 3e 70 67  1, k, pTrunk->pg
2f810 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20 20 20 20  no, n-1));.     
2f820 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
2f830 33 50 61 67 65 72 57 72 69 74 65 28 70 54 72 75  3PagerWrite(pTru
2f840 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  nk->pDbPage);.  
2f850 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
2f860 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
2f870 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20  te_page;.       
2f880 20 20 20 69 66 28 20 63 6c 6f 73 65 73 74 3c 6b     if( closest<k
2f890 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  -1 ){.          
2f8a0 20 20 6d 65 6d 63 70 79 28 26 61 44 61 74 61 5b    memcpy(&aData[
2f8b0 38 2b 63 6c 6f 73 65 73 74 2a 34 5d 2c 20 26 61  8+closest*4], &a
2f8c0 44 61 74 61 5b 34 2b 6b 2a 34 5d 2c 20 34 29 3b  Data[4+k*4], 4);
2f8d0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2f8e0 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
2f8f0 26 61 44 61 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b  &aData[4], k-1);
2f900 0a 20 20 20 20 20 20 20 20 20 20 6e 6f 43 6f 6e  .          noCon
2f910 74 65 6e 74 20 3d 20 21 62 74 72 65 65 47 65 74  tent = !btreeGet
2f920 48 61 73 43 6f 6e 74 65 6e 74 28 70 42 74 2c 20  HasContent(pBt, 
2f930 2a 70 50 67 6e 6f 29 3f 20 50 41 47 45 52 5f 47  *pPgno)? PAGER_G
2f940 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 3a 20 30  ET_NOCONTENT : 0
2f950 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
2f960 20 62 74 72 65 65 47 65 74 55 6e 75 73 65 64 50   btreeGetUnusedP
2f970 61 67 65 28 70 42 74 2c 20 2a 70 50 67 6e 6f 2c  age(pBt, *pPgno,
2f980 20 70 70 50 61 67 65 2c 20 6e 6f 43 6f 6e 74 65   ppPage, noConte
2f990 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  nt);.          i
2f9a0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2f9b0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2f9c0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
2f9d0 72 57 72 69 74 65 28 28 2a 70 70 50 61 67 65 29  rWrite((*ppPage)
2f9e0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
2f9f0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
2fa00 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2fa10 20 20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61             relea
2fa20 73 65 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b  sePage(*ppPage);
2fa30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a  .              *
2fa40 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20  ppPage = 0;.    
2fa50 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2fa60 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2fa70 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b 0a  searchList = 0;.
2fa80 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2fa90 7d 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  }.      releaseP
2faa0 61 67 65 28 70 50 72 65 76 54 72 75 6e 6b 29 3b  age(pPrevTrunk);
2fab0 0a 20 20 20 20 20 20 70 50 72 65 76 54 72 75 6e  .      pPrevTrun
2fac0 6b 20 3d 20 30 3b 0a 20 20 20 20 7d 77 68 69 6c  k = 0;.    }whil
2fad0 65 28 20 73 65 61 72 63 68 4c 69 73 74 20 29 3b  e( searchList );
2fae0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
2faf0 20 54 68 65 72 65 20 61 72 65 20 6e 6f 20 70 61   There are no pa
2fb00 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c  ges on the freel
2fb10 69 73 74 2c 20 73 6f 20 61 70 70 65 6e 64 20 61  ist, so append a
2fb20 20 6e 65 77 20 70 61 67 65 20 74 6f 20 74 68 65   new page to the
2fb30 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65  .    ** database
2fb40 20 69 6d 61 67 65 2e 0a 20 20 20 20 2a 2a 0a 20   image..    **. 
2fb50 20 20 20 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20     ** Normally, 
2fb60 6e 65 77 20 70 61 67 65 73 20 61 6c 6c 6f 63 61  new pages alloca
2fb70 74 65 64 20 62 79 20 74 68 69 73 20 62 6c 6f 63  ted by this bloc
2fb80 6b 20 63 61 6e 20 62 65 20 72 65 71 75 65 73 74  k can be request
2fb90 65 64 20 66 72 6f 6d 20 74 68 65 0a 20 20 20 20  ed from the.    
2fba0 2a 2a 20 70 61 67 65 72 20 6c 61 79 65 72 20 77  ** pager layer w
2fbb0 69 74 68 20 74 68 65 20 27 6e 6f 2d 63 6f 6e 74  ith the 'no-cont
2fbc0 65 6e 74 27 20 66 6c 61 67 20 73 65 74 2e 20 54  ent' flag set. T
2fbd0 68 69 73 20 70 72 65 76 65 6e 74 73 20 74 68 65  his prevents the
2fbe0 20 70 61 67 65 72 0a 20 20 20 20 2a 2a 20 66 72   pager.    ** fr
2fbf0 6f 6d 20 74 72 79 69 6e 67 20 74 6f 20 72 65 61  om trying to rea
2fc00 64 20 74 68 65 20 70 61 67 65 73 20 63 6f 6e 74  d the pages cont
2fc10 65 6e 74 20 66 72 6f 6d 20 64 69 73 6b 2e 20 48  ent from disk. H
2fc20 6f 77 65 76 65 72 2c 20 69 66 20 74 68 65 0a 20  owever, if the. 
2fc30 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 74 72     ** current tr
2fc40 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 61 6c  ansaction has al
2fc50 72 65 61 64 79 20 72 75 6e 20 6f 6e 65 20 6f 72  ready run one or
2fc60 20 6d 6f 72 65 20 69 6e 63 72 65 6d 65 6e 74 61   more incrementa
2fc70 6c 2d 76 61 63 75 75 6d 0a 20 20 20 20 2a 2a 20  l-vacuum.    ** 
2fc80 73 74 65 70 73 2c 20 74 68 65 6e 20 74 68 65 20  steps, then the 
2fc90 70 61 67 65 20 77 65 20 61 72 65 20 61 62 6f 75  page we are abou
2fca0 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 61  t to allocate ma
2fcb0 79 20 63 6f 6e 74 61 69 6e 20 63 6f 6e 74 65 6e  y contain conten
2fcc0 74 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 69 73  t.    ** that is
2fcd0 20 72 65 71 75 69 72 65 64 20 69 6e 20 74 68 65   required in the
2fce0 20 65 76 65 6e 74 20 6f 66 20 61 20 72 6f 6c 6c   event of a roll
2fcf0 62 61 63 6b 2e 20 49 6e 20 74 68 69 73 20 63 61  back. In this ca
2fd00 73 65 2c 20 64 6f 0a 20 20 20 20 2a 2a 20 6e 6f  se, do.    ** no
2fd10 74 20 73 65 74 20 74 68 65 20 6e 6f 2d 63 6f 6e  t set the no-con
2fd20 74 65 6e 74 20 66 6c 61 67 2e 20 54 68 69 73 20  tent flag. This 
2fd30 63 61 75 73 65 73 20 74 68 65 20 70 61 67 65 72  causes the pager
2fd40 20 74 6f 20 6c 6f 61 64 20 61 6e 64 20 6a 6f 75   to load and jou
2fd50 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 74 68 65 20  rnal.    ** the 
2fd60 63 75 72 72 65 6e 74 20 70 61 67 65 20 63 6f 6e  current page con
2fd70 74 65 6e 74 20 62 65 66 6f 72 65 20 6f 76 65 72  tent before over
2fd80 77 72 69 74 69 6e 67 20 69 74 2e 0a 20 20 20 20  writing it..    
2fd90 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74  **.    ** Note t
2fda0 68 61 74 20 74 68 65 20 70 61 67 65 72 20 77 69  hat the pager wi
2fdb0 6c 6c 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20  ll not actually 
2fdc0 61 74 74 65 6d 70 74 20 74 6f 20 6c 6f 61 64 20  attempt to load 
2fdd0 6f 72 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 20 20  or journal .    
2fde0 2a 2a 20 63 6f 6e 74 65 6e 74 20 66 6f 72 20 61  ** content for a
2fdf0 6e 79 20 70 61 67 65 20 74 68 61 74 20 72 65 61  ny page that rea
2fe00 6c 6c 79 20 64 6f 65 73 20 6c 69 65 20 70 61 73  lly does lie pas
2fe10 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
2fe20 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a   database.    **
2fe30 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 20 53   file on disk. S
2fe40 6f 20 74 68 65 20 65 66 66 65 63 74 73 20 6f 66  o the effects of
2fe50 20 64 69 73 61 62 6c 69 6e 67 20 74 68 65 20 6e   disabling the n
2fe60 6f 2d 63 6f 6e 74 65 6e 74 20 6f 70 74 69 6d 69  o-content optimi
2fe70 7a 61 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 68 65  zation.    ** he
2fe80 72 65 20 61 72 65 20 63 6f 6e 66 69 6e 65 64 20  re are confined 
2fe90 74 6f 20 74 68 6f 73 65 20 70 61 67 65 73 20 74  to those pages t
2fea0 68 61 74 20 6c 69 65 20 62 65 74 77 65 65 6e 20  hat lie between 
2feb0 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 20  the end of the. 
2fec0 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69     ** database i
2fed0 6d 61 67 65 20 61 6e 64 20 74 68 65 20 65 6e 64  mage and the end
2fee0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
2fef0 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   file..    */.  
2ff00 20 20 69 6e 74 20 62 4e 6f 43 6f 6e 74 65 6e 74    int bNoContent
2ff10 20 3d 20 28 30 3d 3d 49 66 4e 6f 74 4f 6d 69 74   = (0==IfNotOmit
2ff20 41 56 28 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63  AV(pBt->bDoTrunc
2ff30 61 74 65 29 29 3f 20 50 41 47 45 52 5f 47 45 54  ate))? PAGER_GET
2ff40 5f 4e 4f 43 4f 4e 54 45 4e 54 3a 30 3b 0a 0a 20  _NOCONTENT:0;.. 
2ff50 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
2ff60 61 67 65 72 57 72 69 74 65 28 70 42 74 2d 3e 70  agerWrite(pBt->p
2ff70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b  Page1->pDbPage);
2ff80 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
2ff90 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 42 74  turn rc;.    pBt
2ffa0 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 20 20 20 20 69  ->nPage++;.    i
2ffb0 66 28 20 70 42 74 2d 3e 6e 50 61 67 65 3d 3d 50  f( pBt->nPage==P
2ffc0 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
2ffd0 28 70 42 74 29 20 29 20 70 42 74 2d 3e 6e 50 61  (pBt) ) pBt->nPa
2ffe0 67 65 2b 2b 3b 0a 0a 23 69 66 6e 64 65 66 20 53  ge++;..#ifndef S
2fff0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
30000 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70 42  ACUUM.    if( pB
30010 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 26 26  t->autoVacuum &&
30020 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70   PTRMAP_ISPAGE(p
30030 42 74 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 20  Bt, pBt->nPage) 
30040 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 2a  ){.      /* If *
30050 70 50 67 6e 6f 20 72 65 66 65 72 73 20 74 6f 20  pPgno refers to 
30060 61 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61  a pointer-map pa
30070 67 65 2c 20 61 6c 6c 6f 63 61 74 65 20 74 77 6f  ge, allocate two
30080 20 6e 65 77 20 70 61 67 65 73 0a 20 20 20 20 20   new pages.     
30090 20 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20 6f   ** at the end o
300a0 66 20 74 68 65 20 66 69 6c 65 20 69 6e 73 74 65  f the file inste
300b0 61 64 20 6f 66 20 6f 6e 65 2e 20 54 68 65 20 66  ad of one. The f
300c0 69 72 73 74 20 61 6c 6c 6f 63 61 74 65 64 20 70  irst allocated p
300d0 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 62 65 63  age.      ** bec
300e0 6f 6d 65 73 20 61 20 6e 65 77 20 70 6f 69 6e 74  omes a new point
300f0 65 72 2d 6d 61 70 20 70 61 67 65 2c 20 74 68 65  er-map page, the
30100 20 73 65 63 6f 6e 64 20 69 73 20 75 73 65 64 20   second is used 
30110 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 20  by the caller.. 
30120 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 4d 65       */.      Me
30130 6d 50 61 67 65 20 2a 70 50 67 20 3d 20 30 3b 0a  mPage *pPg = 0;.
30140 20 20 20 20 20 20 54 52 41 43 45 28 28 22 41 4c        TRACE(("AL
30150 4c 4f 43 41 54 45 3a 20 25 64 20 66 72 6f 6d 20  LOCATE: %d from 
30160 65 6e 64 20 6f 66 20 66 69 6c 65 20 28 70 6f 69  end of file (poi
30170 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 29 5c 6e  nter-map page)\n
30180 22 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 29 3b  ", pBt->nPage));
30190 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
301a0 42 74 2d 3e 6e 50 61 67 65 21 3d 50 45 4e 44 49  Bt->nPage!=PENDI
301b0 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
301c0 29 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  ) );.      rc = 
301d0 62 74 72 65 65 47 65 74 55 6e 75 73 65 64 50 61  btreeGetUnusedPa
301e0 67 65 28 70 42 74 2c 20 70 42 74 2d 3e 6e 50 61  ge(pBt, pBt->nPa
301f0 67 65 2c 20 26 70 50 67 2c 20 62 4e 6f 43 6f 6e  ge, &pPg, bNoCon
30200 74 65 6e 74 29 3b 0a 20 20 20 20 20 20 69 66 28  tent);.      if(
30210 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
30220 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
30230 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
30240 28 70 50 67 2d 3e 70 44 62 50 61 67 65 29 3b 0a  (pPg->pDbPage);.
30250 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
30260 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20  age(pPg);.      
30270 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  }.      if( rc )
30280 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
30290 20 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 0a    pBt->nPage++;.
302a0 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6e        if( pBt->n
302b0 50 61 67 65 3d 3d 50 45 4e 44 49 4e 47 5f 42 59  Page==PENDING_BY
302c0 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 20  TE_PAGE(pBt) ){ 
302d0 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 20 7d 0a  pBt->nPage++; }.
302e0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
302f0 20 70 75 74 34 62 79 74 65 28 32 38 20 2b 20 28   put4byte(28 + (
30300 75 38 2a 29 70 42 74 2d 3e 70 50 61 67 65 31 2d  u8*)pBt->pPage1-
30310 3e 61 44 61 74 61 2c 20 70 42 74 2d 3e 6e 50 61  >aData, pBt->nPa
30320 67 65 29 3b 0a 20 20 20 20 2a 70 50 67 6e 6f 20  ge);.    *pPgno 
30330 3d 20 70 42 74 2d 3e 6e 50 61 67 65 3b 0a 0a 20  = pBt->nPage;.. 
30340 20 20 20 61 73 73 65 72 74 28 20 2a 70 50 67 6e     assert( *pPgn
30350 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  o!=PENDING_BYTE_
30360 50 41 47 45 28 70 42 74 29 20 29 3b 0a 20 20 20  PAGE(pBt) );.   
30370 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 55 6e   rc = btreeGetUn
30380 75 73 65 64 50 61 67 65 28 70 42 74 2c 20 2a 70  usedPage(pBt, *p
30390 50 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 62 4e  Pgno, ppPage, bN
303a0 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 20 20 69  oContent);.    i
303b0 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
303c0 63 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  c;.    rc = sqli
303d0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 28 2a  te3PagerWrite((*
303e0 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65  ppPage)->pDbPage
303f0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
30400 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
30410 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70    releasePage(*p
30420 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 2a 70  pPage);.      *p
30430 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 7d  pPage = 0;.    }
30440 0a 20 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c  .    TRACE(("ALL
30450 4f 43 41 54 45 3a 20 25 64 20 66 72 6f 6d 20 65  OCATE: %d from e
30460 6e 64 20 6f 66 20 66 69 6c 65 5c 6e 22 2c 20 2a  nd of file\n", *
30470 70 50 67 6e 6f 29 29 3b 0a 20 20 7d 0a 0a 20 20  pPgno));.  }..  
30480 61 73 73 65 72 74 28 20 2a 70 50 67 6e 6f 21 3d  assert( *pPgno!=
30490 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
304a0 45 28 70 42 74 29 20 29 3b 0a 0a 65 6e 64 5f 61  E(pBt) );..end_a
304b0 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3a 0a 20 20  llocate_page:.  
304c0 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 72 75  releasePage(pTru
304d0 6e 6b 29 3b 0a 20 20 72 65 6c 65 61 73 65 50 61  nk);.  releasePa
304e0 67 65 28 70 50 72 65 76 54 72 75 6e 6b 29 3b 0a  ge(pPrevTrunk);.
304f0 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
30500 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 71 6c 69 74  LITE_OK || sqlit
30510 65 33 50 61 67 65 72 50 61 67 65 52 65 66 63 6f  e3PagerPageRefco
30520 75 6e 74 28 28 2a 70 70 50 61 67 65 29 2d 3e 70  unt((*ppPage)->p
30530 44 62 50 61 67 65 29 3c 3d 31 20 29 3b 0a 20 20  DbPage)<=1 );.  
30540 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
30550 54 45 5f 4f 4b 20 7c 7c 20 28 2a 70 70 50 61 67  TE_OK || (*ppPag
30560 65 29 2d 3e 69 73 49 6e 69 74 3d 3d 30 20 29 3b  e)->isInit==0 );
30570 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
30580 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
30590 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20  tion is used to 
305a0 61 64 64 20 70 61 67 65 20 69 50 61 67 65 20 74  add page iPage t
305b0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
305c0 69 6c 65 20 66 72 65 65 2d 6c 69 73 74 2e 20 0a  ile free-list. .
305d0 2a 2a 20 49 74 20 69 73 20 61 73 73 75 6d 65 64  ** It is assumed
305e0 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 69   that the page i
305f0 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 61 20  s not already a 
30600 70 61 72 74 20 6f 66 20 74 68 65 20 66 72 65 65  part of the free
30610 2d 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  -list..**.** The
30620 20 76 61 6c 75 65 20 70 61 73 73 65 64 20 61 73   value passed as
30630 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
30640 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e  ment to this fun
30650 63 74 69 6f 6e 20 69 73 20 6f 70 74 69 6f 6e 61  ction is optiona
30660 6c 2e 0a 2a 2a 20 49 66 20 74 68 65 20 63 61 6c  l..** If the cal
30670 6c 65 72 20 68 61 70 70 65 6e 73 20 74 6f 20 68  ler happens to h
30680 61 76 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ave a pointer to
30690 20 74 68 65 20 4d 65 6d 50 61 67 65 20 6f 62 6a   the MemPage obj
306a0 65 63 74 20 0a 2a 2a 20 63 6f 72 72 65 73 70 6f  ect .** correspo
306b0 6e 64 69 6e 67 20 74 6f 20 70 61 67 65 20 69 50  nding to page iP
306c0 61 67 65 20 68 61 6e 64 79 2c 20 69 74 20 6d 61  age handy, it ma
306d0 79 20 70 61 73 73 20 69 74 20 61 73 20 74 68 65  y pass it as the
306e0 20 73 65 63 6f 6e 64 20 76 61 6c 75 65 2e 20 0a   second value. .
306f0 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74  ** Otherwise, it
30700 20 6d 61 79 20 70 61 73 73 20 4e 55 4c 4c 2e 0a   may pass NULL..
30710 2a 2a 0a 2a 2a 20 49 66 20 61 20 70 6f 69 6e 74  **.** If a point
30720 65 72 20 74 6f 20 61 20 4d 65 6d 50 61 67 65 20  er to a MemPage 
30730 6f 62 6a 65 63 74 20 69 73 20 70 61 73 73 65 64  object is passed
30740 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
30750 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20 69 74 73 20  rgument,.** its 
30760 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
30770 69 73 20 6e 6f 74 20 61 6c 74 65 72 65 64 20 62  is not altered b
30780 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  y this function.
30790 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
307a0 72 65 65 50 61 67 65 32 28 42 74 53 68 61 72 65  reePage2(BtShare
307b0 64 20 2a 70 42 74 2c 20 4d 65 6d 50 61 67 65 20  d *pBt, MemPage 
307c0 2a 70 4d 65 6d 50 61 67 65 2c 20 50 67 6e 6f 20  *pMemPage, Pgno 
307d0 69 50 61 67 65 29 7b 0a 20 20 4d 65 6d 50 61 67  iPage){.  MemPag
307e0 65 20 2a 70 54 72 75 6e 6b 20 3d 20 30 3b 20 20  e *pTrunk = 0;  
307f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
30800 20 46 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b   Free-list trunk
30810 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20   page */.  Pgno 
30820 69 54 72 75 6e 6b 20 3d 20 30 3b 20 20 20 20 20  iTrunk = 0;     
30830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
30840 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  * Page number of
30850 20 66 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b   free-list trunk
30860 20 70 61 67 65 20 2a 2f 20 0a 20 20 4d 65 6d 50   page */ .  MemP
30870 61 67 65 20 2a 70 50 61 67 65 31 20 3d 20 70 42  age *pPage1 = pB
30880 74 2d 3e 70 50 61 67 65 31 3b 20 20 20 20 20 20  t->pPage1;      
30890 2f 2a 20 4c 6f 63 61 6c 20 72 65 66 65 72 65 6e  /* Local referen
308a0 63 65 20 74 6f 20 70 61 67 65 20 31 20 2a 2f 0a  ce to page 1 */.
308b0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
308c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
308d0 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 62 65        /* Page be
308e0 69 6e 67 20 66 72 65 65 64 2e 20 4d 61 79 20 62  ing freed. May b
308f0 65 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69 6e 74  e NULL. */.  int
30900 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
30910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30920 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 65 20   /* Return Code 
30930 2a 2f 0a 20 20 69 6e 74 20 6e 46 72 65 65 3b 20  */.  int nFree; 
30940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30950 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74           /* Init
30960 69 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  ial number of pa
30970 67 65 73 20 6f 6e 20 66 72 65 65 2d 6c 69 73 74  ges on free-list
30980 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73   */..  assert( s
30990 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
309a0 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
309b0 0a 20 20 61 73 73 65 72 74 28 20 43 4f 52 52 55  .  assert( CORRU
309c0 50 54 5f 44 42 20 7c 7c 20 69 50 61 67 65 3e 31  PT_DB || iPage>1
309d0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70   );.  assert( !p
309e0 4d 65 6d 50 61 67 65 20 7c 7c 20 70 4d 65 6d 50  MemPage || pMemP
309f0 61 67 65 2d 3e 70 67 6e 6f 3d 3d 69 50 61 67 65  age->pgno==iPage
30a00 20 29 3b 0a 0a 20 20 69 66 28 20 69 50 61 67 65   );..  if( iPage
30a10 3c 32 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  <2 ) return SQLI
30a20 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
30a30 0a 20 20 69 66 28 20 70 4d 65 6d 50 61 67 65 20  .  if( pMemPage 
30a40 29 7b 0a 20 20 20 20 70 50 61 67 65 20 3d 20 70  ){.    pPage = p
30a50 4d 65 6d 50 61 67 65 3b 0a 20 20 20 20 73 71 6c  MemPage;.    sql
30a60 69 74 65 33 50 61 67 65 72 52 65 66 28 70 50 61  ite3PagerRef(pPa
30a70 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  ge->pDbPage);.  
30a80 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65  }else{.    pPage
30a90 20 3d 20 62 74 72 65 65 50 61 67 65 4c 6f 6f 6b   = btreePageLook
30aa0 75 70 28 70 42 74 2c 20 69 50 61 67 65 29 3b 0a  up(pBt, iPage);.
30ab0 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 63 72 65 6d    }..  /* Increm
30ac0 65 6e 74 20 74 68 65 20 66 72 65 65 20 70 61 67  ent the free pag
30ad0 65 20 63 6f 75 6e 74 20 6f 6e 20 70 50 61 67 65  e count on pPage
30ae0 31 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69  1 */.  rc = sqli
30af0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
30b00 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a  age1->pDbPage);.
30b10 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
30b20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20  freepage_out;.  
30b30 6e 46 72 65 65 20 3d 20 67 65 74 34 62 79 74 65  nFree = get4byte
30b40 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
30b50 33 36 5d 29 3b 0a 20 20 70 75 74 34 62 79 74 65  36]);.  put4byte
30b60 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
30b70 33 36 5d 2c 20 6e 46 72 65 65 2b 31 29 3b 0a 0a  36], nFree+1);..
30b80 20 20 69 66 28 20 70 42 74 2d 3e 62 74 73 46 6c    if( pBt->btsFl
30b90 61 67 73 20 26 20 42 54 53 5f 53 45 43 55 52 45  ags & BTS_SECURE
30ba0 5f 44 45 4c 45 54 45 20 29 7b 0a 20 20 20 20 2f  _DELETE ){.    /
30bb0 2a 20 49 66 20 74 68 65 20 73 65 63 75 72 65 5f  * If the secure_
30bc0 64 65 6c 65 74 65 20 6f 70 74 69 6f 6e 20 69 73  delete option is
30bd0 20 65 6e 61 62 6c 65 64 2c 20 74 68 65 6e 0a 20   enabled, then. 
30be0 20 20 20 2a 2a 20 61 6c 77 61 79 73 20 66 75 6c     ** always ful
30bf0 6c 79 20 6f 76 65 72 77 72 69 74 65 20 64 65 6c  ly overwrite del
30c00 65 74 65 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  eted information
30c10 20 77 69 74 68 20 7a 65 72 6f 73 2e 0a 20 20 20   with zeros..   
30c20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 21 70 50   */.    if( (!pP
30c30 61 67 65 20 26 26 20 28 28 72 63 20 3d 20 62 74  age && ((rc = bt
30c40 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
30c50 69 50 61 67 65 2c 20 26 70 50 61 67 65 2c 20 30  iPage, &pPage, 0
30c60 29 29 21 3d 30 29 20 29 0a 20 20 20 20 20 7c 7c  ))!=0) ).     ||
30c70 20 20 20 20 20 20 20 20 20 20 20 20 28 28 72 63              ((rc
30c80 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
30c90 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50  rite(pPage->pDbP
30ca0 61 67 65 29 29 21 3d 30 29 0a 20 20 20 20 29 7b  age))!=0).    ){
30cb0 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65  .      goto free
30cc0 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  page_out;.    }.
30cd0 20 20 20 20 6d 65 6d 73 65 74 28 70 50 61 67 65      memset(pPage
30ce0 2d 3e 61 44 61 74 61 2c 20 30 2c 20 70 50 61 67  ->aData, 0, pPag
30cf0 65 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  e->pBt->pageSize
30d00 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  );.  }..  /* If 
30d10 74 68 65 20 64 61 74 61 62 61 73 65 20 73 75 70  the database sup
30d20 70 6f 72 74 73 20 61 75 74 6f 2d 76 61 63 75 75  ports auto-vacuu
30d30 6d 2c 20 77 72 69 74 65 20 61 6e 20 65 6e 74 72  m, write an entr
30d40 79 20 69 6e 20 74 68 65 20 70 6f 69 6e 74 65 72  y in the pointer
30d50 2d 6d 61 70 0a 20 20 2a 2a 20 74 6f 20 69 6e 64  -map.  ** to ind
30d60 69 63 61 74 65 20 74 68 61 74 20 74 68 65 20 70  icate that the p
30d70 61 67 65 20 69 73 20 66 72 65 65 2e 0a 20 20 2a  age is free..  *
30d80 2f 0a 20 20 69 66 28 20 49 53 41 55 54 4f 56 41  /.  if( ISAUTOVA
30d90 43 55 55 4d 20 29 7b 0a 20 20 20 20 70 74 72 6d  CUUM ){.    ptrm
30da0 61 70 50 75 74 28 70 42 74 2c 20 69 50 61 67 65  apPut(pBt, iPage
30db0 2c 20 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47  , PTRMAP_FREEPAG
30dc0 45 2c 20 30 2c 20 26 72 63 29 3b 0a 20 20 20 20  E, 0, &rc);.    
30dd0 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 66 72  if( rc ) goto fr
30de0 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a  eepage_out;.  }.
30df0 0a 20 20 2f 2a 20 4e 6f 77 20 6d 61 6e 69 70 75  .  /* Now manipu
30e00 6c 61 74 65 20 74 68 65 20 61 63 74 75 61 6c 20  late the actual 
30e10 64 61 74 61 62 61 73 65 20 66 72 65 65 2d 6c 69  database free-li
30e20 73 74 20 73 74 72 75 63 74 75 72 65 2e 20 54 68  st structure. Th
30e30 65 72 65 20 61 72 65 20 74 77 6f 0a 20 20 2a 2a  ere are two.  **
30e40 20 70 6f 73 73 69 62 69 6c 69 74 69 65 73 2e 20   possibilities. 
30e50 49 66 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  If the free-list
30e60 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 65 6d   is currently em
30e70 70 74 79 2c 20 6f 72 20 69 66 20 74 68 65 20 66  pty, or if the f
30e80 69 72 73 74 0a 20 20 2a 2a 20 74 72 75 6e 6b 20  irst.  ** trunk 
30e90 70 61 67 65 20 69 6e 20 74 68 65 20 66 72 65 65  page in the free
30ea0 2d 6c 69 73 74 20 69 73 20 66 75 6c 6c 2c 20 74  -list is full, t
30eb0 68 65 6e 20 74 68 69 73 20 70 61 67 65 20 77 69  hen this page wi
30ec0 6c 6c 20 62 65 63 6f 6d 65 20 61 0a 20 20 2a 2a  ll become a.  **
30ed0 20 6e 65 77 20 66 72 65 65 2d 6c 69 73 74 20 74   new free-list t
30ee0 72 75 6e 6b 20 70 61 67 65 2e 20 4f 74 68 65 72  runk page. Other
30ef0 77 69 73 65 2c 20 69 74 20 77 69 6c 6c 20 62 65  wise, it will be
30f00 63 6f 6d 65 20 61 20 6c 65 61 66 20 6f 66 20 74  come a leaf of t
30f10 68 65 0a 20 20 2a 2a 20 66 69 72 73 74 20 74 72  he.  ** first tr
30f20 75 6e 6b 20 70 61 67 65 20 69 6e 20 74 68 65 20  unk page in the 
30f30 63 75 72 72 65 6e 74 20 66 72 65 65 2d 6c 69 73  current free-lis
30f40 74 2e 20 54 68 69 73 20 62 6c 6f 63 6b 20 74 65  t. This block te
30f50 73 74 73 20 69 66 20 69 74 0a 20 20 2a 2a 20 69  sts if it.  ** i
30f60 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 61 64  s possible to ad
30f70 64 20 74 68 65 20 70 61 67 65 20 61 73 20 61 20  d the page as a 
30f80 6e 65 77 20 66 72 65 65 2d 6c 69 73 74 20 6c 65  new free-list le
30f90 61 66 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e  af..  */.  if( n
30fa0 46 72 65 65 21 3d 30 20 29 7b 0a 20 20 20 20 75  Free!=0 ){.    u
30fb0 33 32 20 6e 4c 65 61 66 3b 20 20 20 20 20 20 20  32 nLeaf;       
30fc0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74           /* Init
30fd0 69 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 6c 65  ial number of le
30fe0 61 66 20 63 65 6c 6c 73 20 6f 6e 20 74 72 75 6e  af cells on trun
30ff0 6b 20 70 61 67 65 20 2a 2f 0a 0a 20 20 20 20 69  k page */..    i
31000 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65  Trunk = get4byte
31010 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
31020 33 32 5d 29 3b 0a 20 20 20 20 72 63 20 3d 20 62  32]);.    rc = b
31030 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
31040 20 69 54 72 75 6e 6b 2c 20 26 70 54 72 75 6e 6b   iTrunk, &pTrunk
31050 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 0);.    if( rc
31060 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
31070 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61       goto freepa
31080 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 0a 20  ge_out;.    }.. 
31090 20 20 20 6e 4c 65 61 66 20 3d 20 67 65 74 34 62     nLeaf = get4b
310a0 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61  yte(&pTrunk->aDa
310b0 74 61 5b 34 5d 29 3b 0a 20 20 20 20 61 73 73 65  ta[4]);.    asse
310c0 72 74 28 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  rt( pBt->usableS
310d0 69 7a 65 3e 33 32 20 29 3b 0a 20 20 20 20 69 66  ize>32 );.    if
310e0 28 20 6e 4c 65 61 66 20 3e 20 28 75 33 32 29 70  ( nLeaf > (u32)p
310f0 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34  Bt->usableSize/4
31100 20 2d 20 32 20 29 7b 0a 20 20 20 20 20 20 72 63   - 2 ){.      rc
31110 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
31120 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f  T_BKPT;.      go
31130 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b  to freepage_out;
31140 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e  .    }.    if( n
31150 4c 65 61 66 20 3c 20 28 75 33 32 29 70 42 74 2d  Leaf < (u32)pBt-
31160 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20  >usableSize/4 - 
31170 38 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e  8 ){.      /* In
31180 20 74 68 69 73 20 63 61 73 65 20 74 68 65 72 65   this case there
31190 20 69 73 20 72 6f 6f 6d 20 6f 6e 20 74 68 65 20   is room on the 
311a0 74 72 75 6e 6b 20 70 61 67 65 20 74 6f 20 69 6e  trunk page to in
311b0 73 65 72 74 20 74 68 65 20 70 61 67 65 0a 20 20  sert the page.  
311c0 20 20 20 20 2a 2a 20 62 65 69 6e 67 20 66 72 65      ** being fre
311d0 65 64 20 61 73 20 61 20 6e 65 77 20 6c 65 61 66  ed as a new leaf
311e0 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
311f0 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68   ** Note that th
31200 65 20 74 72 75 6e 6b 20 70 61 67 65 20 69 73 20  e trunk page is 
31210 6e 6f 74 20 72 65 61 6c 6c 79 20 66 75 6c 6c 20  not really full 
31220 75 6e 74 69 6c 20 69 74 20 63 6f 6e 74 61 69 6e  until it contain
31230 73 0a 20 20 20 20 20 20 2a 2a 20 75 73 61 62 6c  s.      ** usabl
31240 65 53 69 7a 65 2f 34 20 2d 20 32 20 65 6e 74 72  eSize/4 - 2 entr
31250 69 65 73 2c 20 6e 6f 74 20 75 73 61 62 6c 65 53  ies, not usableS
31260 69 7a 65 2f 34 20 2d 20 38 20 65 6e 74 72 69 65  ize/4 - 8 entrie
31270 73 20 61 73 20 77 65 20 68 61 76 65 0a 20 20 20  s as we have.   
31280 20 20 20 2a 2a 20 63 6f 64 65 64 2e 20 20 42 75     ** coded.  Bu
31290 74 20 64 75 65 20 74 6f 20 61 20 63 6f 64 69 6e  t due to a codin
312a0 67 20 65 72 72 6f 72 20 69 6e 20 76 65 72 73 69  g error in versi
312b0 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 70 72  ons of SQLite pr
312c0 69 6f 72 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  ior to.      ** 
312d0 33 2e 36 2e 30 2c 20 64 61 74 61 62 61 73 65 73  3.6.0, databases
312e0 20 77 69 74 68 20 66 72 65 65 6c 69 73 74 20 74   with freelist t
312f0 72 75 6e 6b 20 70 61 67 65 73 20 68 6f 6c 64 69  runk pages holdi
31300 6e 67 20 6d 6f 72 65 20 74 68 61 6e 0a 20 20 20  ng more than.   
31310 20 20 20 2a 2a 20 75 73 61 62 6c 65 53 69 7a 65     ** usableSize
31320 2f 34 20 2d 20 38 20 65 6e 74 72 69 65 73 20 77  /4 - 8 entries w
31330 69 6c 6c 20 62 65 20 72 65 70 6f 72 74 65 64 20  ill be reported 
31340 61 73 20 63 6f 72 72 75 70 74 2e 20 20 49 6e 20  as corrupt.  In 
31350 6f 72 64 65 72 0a 20 20 20 20 20 20 2a 2a 20 74  order.      ** t
31360 6f 20 6d 61 69 6e 74 61 69 6e 20 62 61 63 6b 77  o maintain backw
31370 61 72 64 73 20 63 6f 6d 70 61 74 69 62 69 6c 69  ards compatibili
31380 74 79 20 77 69 74 68 20 6f 6c 64 65 72 20 76 65  ty with older ve
31390 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65  rsions of SQLite
313a0 2c 0a 20 20 20 20 20 20 2a 2a 20 77 65 20 77 69  ,.      ** we wi
313b0 6c 6c 20 63 6f 6e 74 69 6e 75 65 20 74 6f 20 72  ll continue to r
313c0 65 73 74 72 69 63 74 20 74 68 65 20 6e 75 6d 62  estrict the numb
313d0 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 74 6f  er of entries to
313e0 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20   usableSize/4 - 
313f0 38 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 6e  8.      ** for n
31400 6f 77 2e 20 20 41 74 20 73 6f 6d 65 20 70 6f 69  ow.  At some poi
31410 6e 74 20 69 6e 20 74 68 65 20 66 75 74 75 72 65  nt in the future
31420 20 28 6f 6e 63 65 20 65 76 65 72 79 6f 6e 65 20   (once everyone 
31430 68 61 73 20 75 70 67 72 61 64 65 64 0a 20 20 20  has upgraded.   
31440 20 20 20 2a 2a 20 74 6f 20 33 2e 36 2e 30 20 6f     ** to 3.6.0 o
31450 72 20 6c 61 74 65 72 29 20 77 65 20 73 68 6f 75  r later) we shou
31460 6c 64 20 63 6f 6e 73 69 64 65 72 20 66 69 78 69  ld consider fixi
31470 6e 67 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e  ng the condition
31480 61 6c 20 61 62 6f 76 65 0a 20 20 20 20 20 20 2a  al above.      *
31490 2a 20 74 6f 20 72 65 61 64 20 22 75 73 61 62 6c  * to read "usabl
314a0 65 53 69 7a 65 2f 34 2d 32 22 20 69 6e 73 74 65  eSize/4-2" inste
314b0 61 64 20 6f 66 20 22 75 73 61 62 6c 65 53 69 7a  ad of "usableSiz
314c0 65 2f 34 2d 38 22 2e 0a 20 20 20 20 20 20 2a 2a  e/4-8"..      **
314d0 0a 20 20 20 20 20 20 2a 2a 20 45 56 49 44 45 4e  .      ** EVIDEN
314e0 43 45 2d 4f 46 3a 20 52 2d 31 39 39 32 30 2d 31  CE-OF: R-19920-1
314f0 31 35 37 36 20 48 6f 77 65 76 65 72 2c 20 6e 65  1576 However, ne
31500 77 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  wer versions of 
31510 53 51 4c 69 74 65 20 73 74 69 6c 6c 0a 20 20 20  SQLite still.   
31520 20 20 20 2a 2a 20 61 76 6f 69 64 20 75 73 69 6e     ** avoid usin
31530 67 20 74 68 65 20 6c 61 73 74 20 73 69 78 20 65  g the last six e
31540 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 66 72  ntries in the fr
31550 65 65 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67  eelist trunk pag
31560 65 20 61 72 72 61 79 20 69 6e 0a 20 20 20 20 20  e array in.     
31570 20 2a 2a 20 6f 72 64 65 72 20 74 68 61 74 20 64   ** order that d
31580 61 74 61 62 61 73 65 20 66 69 6c 65 73 20 63 72  atabase files cr
31590 65 61 74 65 64 20 62 79 20 6e 65 77 65 72 20 76  eated by newer v
315a0 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74  ersions of SQLit
315b0 65 20 63 61 6e 20 62 65 0a 20 20 20 20 20 20 2a  e can be.      *
315c0 2a 20 72 65 61 64 20 62 79 20 6f 6c 64 65 72 20  * read by older 
315d0 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69  versions of SQLi
315e0 74 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  te..      */.   
315f0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
31600 61 67 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b  agerWrite(pTrunk
31610 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
31620 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
31630 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70  _OK ){.        p
31640 75 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d  ut4byte(&pTrunk-
31650 3e 61 44 61 74 61 5b 34 5d 2c 20 6e 4c 65 61 66  >aData[4], nLeaf
31660 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 70 75 74  +1);.        put
31670 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61  4byte(&pTrunk->a
31680 44 61 74 61 5b 38 2b 6e 4c 65 61 66 2a 34 5d 2c  Data[8+nLeaf*4],
31690 20 69 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20   iPage);.       
316a0 20 69 66 28 20 70 50 61 67 65 20 26 26 20 28 70   if( pPage && (p
316b0 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42  Bt->btsFlags & B
316c0 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45  TS_SECURE_DELETE
316d0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
316e0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f    sqlite3PagerDo
316f0 6e 74 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70  ntWrite(pPage->p
31700 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
31710 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20   }.        rc = 
31720 62 74 72 65 65 53 65 74 48 61 73 43 6f 6e 74 65  btreeSetHasConte
31730 6e 74 28 70 42 74 2c 20 69 50 61 67 65 29 3b 0a  nt(pBt, iPage);.
31740 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 54 52        }.      TR
31750 41 43 45 28 28 22 46 52 45 45 2d 50 41 47 45 3a  ACE(("FREE-PAGE:
31760 20 25 64 20 6c 65 61 66 20 6f 6e 20 74 72 75 6e   %d leaf on trun
31770 6b 20 70 61 67 65 20 25 64 5c 6e 22 2c 70 50 61  k page %d\n",pPa
31780 67 65 2d 3e 70 67 6e 6f 2c 70 54 72 75 6e 6b 2d  ge->pgno,pTrunk-
31790 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 67  >pgno));.      g
317a0 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74  oto freepage_out
317b0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
317c0 2a 20 49 66 20 63 6f 6e 74 72 6f 6c 20 66 6c 6f  * If control flo
317d0 77 73 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74  ws to this point
317e0 2c 20 74 68 65 6e 20 69 74 20 77 61 73 20 6e 6f  , then it was no
317f0 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 61 64  t possible to ad
31800 64 20 74 68 65 0a 20 20 2a 2a 20 74 68 65 20 70  d the.  ** the p
31810 61 67 65 20 62 65 69 6e 67 20 66 72 65 65 64 20  age being freed 
31820 61 73 20 61 20 6c 65 61 66 20 70 61 67 65 20 6f  as a leaf page o
31830 66 20 74 68 65 20 66 69 72 73 74 20 74 72 75 6e  f the first trun
31840 6b 20 69 6e 20 74 68 65 20 66 72 65 65 2d 6c 69  k in the free-li
31850 73 74 2e 0a 20 20 2a 2a 20 50 6f 73 73 69 62 6c  st..  ** Possibl
31860 79 20 62 65 63 61 75 73 65 20 74 68 65 20 66 72  y because the fr
31870 65 65 2d 6c 69 73 74 20 69 73 20 65 6d 70 74 79  ee-list is empty
31880 2c 20 6f 72 20 70 6f 73 73 69 62 6c 79 20 62 65  , or possibly be
31890 63 61 75 73 65 20 74 68 65 20 0a 20 20 2a 2a 20  cause the .  ** 
318a0 66 69 72 73 74 20 74 72 75 6e 6b 20 69 6e 20 74  first trunk in t
318b0 68 65 20 66 72 65 65 2d 6c 69 73 74 20 69 73 20  he free-list is 
318c0 66 75 6c 6c 2e 20 45 69 74 68 65 72 20 77 61 79  full. Either way
318d0 2c 20 74 68 65 20 70 61 67 65 20 62 65 69 6e 67  , the page being
318e0 20 66 72 65 65 64 0a 20 20 2a 2a 20 77 69 6c 6c   freed.  ** will
318f0 20 62 65 63 6f 6d 65 20 74 68 65 20 6e 65 77 20   become the new 
31900 66 69 72 73 74 20 74 72 75 6e 6b 20 70 61 67 65  first trunk page
31910 20 69 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73   in the free-lis
31920 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  t..  */.  if( pP
31930 61 67 65 3d 3d 30 20 26 26 20 53 51 4c 49 54 45  age==0 && SQLITE
31940 5f 4f 4b 21 3d 28 72 63 20 3d 20 62 74 72 65 65  _OK!=(rc = btree
31950 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 50 61  GetPage(pBt, iPa
31960 67 65 2c 20 26 70 50 61 67 65 2c 20 30 29 29 20  ge, &pPage, 0)) 
31970 29 7b 0a 20 20 20 20 67 6f 74 6f 20 66 72 65 65  ){.    goto free
31980 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20  page_out;.  }.  
31990 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
319a0 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44  rWrite(pPage->pD
319b0 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63  bPage);.  if( rc
319c0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
319d0 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65     goto freepage
319e0 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 70 75 74 34  _out;.  }.  put4
319f0 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74  byte(pPage->aDat
31a00 61 2c 20 69 54 72 75 6e 6b 29 3b 0a 20 20 70 75  a, iTrunk);.  pu
31a10 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61  t4byte(&pPage->a
31a20 44 61 74 61 5b 34 5d 2c 20 30 29 3b 0a 20 20 70  Data[4], 0);.  p
31a30 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d  ut4byte(&pPage1-
31a40 3e 61 44 61 74 61 5b 33 32 5d 2c 20 69 50 61 67  >aData[32], iPag
31a50 65 29 3b 0a 20 20 54 52 41 43 45 28 28 22 46 52  e);.  TRACE(("FR
31a60 45 45 2d 50 41 47 45 3a 20 25 64 20 6e 65 77 20  EE-PAGE: %d new 
31a70 74 72 75 6e 6b 20 70 61 67 65 20 72 65 70 6c 61  trunk page repla
31a80 63 69 6e 67 20 25 64 5c 6e 22 2c 20 70 50 61 67  cing %d\n", pPag
31a90 65 2d 3e 70 67 6e 6f 2c 20 69 54 72 75 6e 6b 29  e->pgno, iTrunk)
31aa0 29 3b 0a 0a 66 72 65 65 70 61 67 65 5f 6f 75 74  );..freepage_out
31ab0 3a 0a 20 20 69 66 28 20 70 50 61 67 65 20 29 7b  :.  if( pPage ){
31ac0 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49 6e  .    pPage->isIn
31ad0 69 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  it = 0;.  }.  re
31ae0 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29  leasePage(pPage)
31af0 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28  ;.  releasePage(
31b00 70 54 72 75 6e 6b 29 3b 0a 20 20 72 65 74 75 72  pTrunk);.  retur
31b10 6e 20 72 63 3b 0a 7d 0a 73 74 61 74 69 63 20 76  n rc;.}.static v
31b20 6f 69 64 20 66 72 65 65 50 61 67 65 28 4d 65 6d  oid freePage(Mem
31b30 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74  Page *pPage, int
31b40 20 2a 70 52 43 29 7b 0a 20 20 69 66 28 20 28 2a   *pRC){.  if( (*
31b50 70 52 43 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  pRC)==SQLITE_OK 
31b60 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 66 72  ){.    *pRC = fr
31b70 65 65 50 61 67 65 32 28 70 50 61 67 65 2d 3e 70  eePage2(pPage->p
31b80 42 74 2c 20 70 50 61 67 65 2c 20 70 50 61 67 65  Bt, pPage, pPage
31b90 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a 7d 0a 0a  ->pgno);.  }.}..
31ba0 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6e 79 20 6f  /*.** Free any o
31bb0 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61 73  verflow pages as
31bc0 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
31bd0 65 20 67 69 76 65 6e 20 43 65 6c 6c 2e 20 20 57  e given Cell.  W
31be0 72 69 74 65 20 74 68 65 0a 2a 2a 20 6c 6f 63 61  rite the.** loca
31bf0 6c 20 43 65 6c 6c 20 73 69 7a 65 20 28 74 68 65  l Cell size (the
31c00 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
31c10 20 6f 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   on the original
31c20 20 70 61 67 65 2c 20 6f 6d 69 74 74 69 6e 67 0a   page, omitting.
31c30 2a 2a 20 6f 76 65 72 66 6c 6f 77 29 20 69 6e 74  ** overflow) int
31c40 6f 20 2a 70 6e 53 69 7a 65 2e 0a 2a 2f 0a 73 74  o *pnSize..*/.st
31c50 61 74 69 63 20 69 6e 74 20 63 6c 65 61 72 43 65  atic int clearCe
31c60 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  ll(.  MemPage *p
31c70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 2f  Page,          /
31c80 2a 20 54 68 65 20 70 61 67 65 20 74 68 61 74 20  * The page that 
31c90 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 43 65 6c  contains the Cel
31ca0 6c 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  l */.  unsigned 
31cb0 63 68 61 72 20 2a 70 43 65 6c 6c 2c 20 20 20 20  char *pCell,    
31cc0 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f 66  /* First byte of
31cd0 20 74 68 65 20 43 65 6c 6c 20 2a 2f 0a 20 20 75   the Cell */.  u
31ce0 31 36 20 2a 70 6e 53 69 7a 65 20 20 20 20 20 20  16 *pnSize      
31cf0 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
31d00 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
31d10 20 43 65 6c 6c 20 68 65 72 65 20 2a 2f 0a 29 7b   Cell here */.){
31d20 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
31d30 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20   = pPage->pBt;. 
31d40 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a   CellInfo info;.
31d50 20 20 50 67 6e 6f 20 6f 76 66 6c 50 67 6e 6f 3b    Pgno ovflPgno;
31d60 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74  .  int rc;.  int
31d70 20 6e 4f 76 66 6c 3b 0a 20 20 75 33 32 20 6f 76   nOvfl;.  u32 ov
31d80 66 6c 50 61 67 65 53 69 7a 65 3b 0a 0a 20 20 61  flPageSize;..  a
31d90 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
31da0 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
31db0 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
31dc0 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43    pPage->xParseC
31dd0 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  ell(pPage, pCell
31de0 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 2a 70 6e 53  , &info);.  *pnS
31df0 69 7a 65 20 3d 20 69 6e 66 6f 2e 6e 53 69 7a 65  ize = info.nSize
31e00 3b 0a 20 20 69 66 28 20 69 6e 66 6f 2e 69 4f 76  ;.  if( info.iOv
31e10 65 72 66 6c 6f 77 3d 3d 30 20 29 7b 0a 20 20 20  erflow==0 ){.   
31e20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
31e30 4b 3b 20 20 2f 2a 20 4e 6f 20 6f 76 65 72 66 6c  K;  /* No overfl
31e40 6f 77 20 70 61 67 65 73 2e 20 52 65 74 75 72 6e  ow pages. Return
31e50 20 77 69 74 68 6f 75 74 20 64 6f 69 6e 67 20 61   without doing a
31e60 6e 79 74 68 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20  nything */.  }. 
31e70 20 69 66 28 20 70 43 65 6c 6c 2b 69 6e 66 6f 2e   if( pCell+info.
31e80 69 4f 76 65 72 66 6c 6f 77 2b 33 20 3e 20 70 50  iOverflow+3 > pP
31e90 61 67 65 2d 3e 61 44 61 74 61 2b 70 50 61 67 65  age->aData+pPage
31ea0 2d 3e 6d 61 73 6b 50 61 67 65 20 29 7b 0a 20 20  ->maskPage ){.  
31eb0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
31ec0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 20 2f  CORRUPT_BKPT;  /
31ed0 2a 20 43 65 6c 6c 20 65 78 74 65 6e 64 73 20 70  * Cell extends p
31ee0 61 73 74 20 65 6e 64 20 6f 66 20 70 61 67 65 20  ast end of page 
31ef0 2a 2f 0a 20 20 7d 0a 20 20 6f 76 66 6c 50 67 6e  */.  }.  ovflPgn
31f00 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 43  o = get4byte(&pC
31f10 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c  ell[info.iOverfl
31f20 6f 77 5d 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ow]);.  assert( 
31f30 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
31f40 3e 20 34 20 29 3b 0a 20 20 6f 76 66 6c 50 61 67  > 4 );.  ovflPag
31f50 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61  eSize = pBt->usa
31f60 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20 6e  bleSize - 4;.  n
31f70 4f 76 66 6c 20 3d 20 28 69 6e 66 6f 2e 6e 50 61  Ovfl = (info.nPa
31f80 79 6c 6f 61 64 20 2d 20 69 6e 66 6f 2e 6e 4c 6f  yload - info.nLo
31f90 63 61 6c 20 2b 20 6f 76 66 6c 50 61 67 65 53 69  cal + ovflPageSi
31fa0 7a 65 20 2d 20 31 29 2f 6f 76 66 6c 50 61 67 65  ze - 1)/ovflPage
31fb0 53 69 7a 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Size;.  assert( 
31fc0 6e 4f 76 66 6c 3e 30 20 7c 7c 20 0a 20 20 20 20  nOvfl>0 || .    
31fd0 28 43 4f 52 52 55 50 54 5f 44 42 20 26 26 20 28  (CORRUPT_DB && (
31fe0 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 2b 20  info.nPayload + 
31ff0 6f 76 66 6c 50 61 67 65 53 69 7a 65 29 3c 6f 76  ovflPageSize)<ov
32000 66 6c 50 61 67 65 53 69 7a 65 29 0a 20 20 29 3b  flPageSize).  );
32010 0a 20 20 77 68 69 6c 65 28 20 6e 4f 76 66 6c 2d  .  while( nOvfl-
32020 2d 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 69 4e  - ){.    Pgno iN
32030 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 4d 65 6d  ext = 0;.    Mem
32040 50 61 67 65 20 2a 70 4f 76 66 6c 20 3d 20 30 3b  Page *pOvfl = 0;
32050 0a 20 20 20 20 69 66 28 20 6f 76 66 6c 50 67 6e  .    if( ovflPgn
32060 6f 3c 32 20 7c 7c 20 6f 76 66 6c 50 67 6e 6f 3e  o<2 || ovflPgno>
32070 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70  btreePagecount(p
32080 42 74 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  Bt) ){.      /* 
32090 30 20 69 73 20 6e 6f 74 20 61 20 6c 65 67 61 6c  0 is not a legal
320a0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 61 6e 64   page number and
320b0 20 70 61 67 65 20 31 20 63 61 6e 6e 6f 74 20 62   page 1 cannot b
320c0 65 20 61 6e 20 0a 20 20 20 20 20 20 2a 2a 20 6f  e an .      ** o
320d0 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20 54 68  verflow page. Th
320e0 65 72 65 66 6f 72 65 20 69 66 20 6f 76 66 6c 50  erefore if ovflP
320f0 67 6e 6f 3c 32 20 6f 72 20 70 61 73 74 20 74 68  gno<2 or past th
32100 65 20 65 6e 64 20 6f 66 20 74 68 65 20 0a 20 20  e end of the .  
32110 20 20 20 20 2a 2a 20 66 69 6c 65 20 74 68 65 20      ** file the 
32120 64 61 74 61 62 61 73 65 20 6d 75 73 74 20 62 65  database must be
32130 20 63 6f 72 72 75 70 74 2e 20 2a 2f 0a 20 20 20   corrupt. */.   
32140 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
32150 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
32160 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 4f 76     }.    if( nOv
32170 66 6c 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  fl ){.      rc =
32180 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65   getOverflowPage
32190 28 70 42 74 2c 20 6f 76 66 6c 50 67 6e 6f 2c 20  (pBt, ovflPgno, 
321a0 26 70 4f 76 66 6c 2c 20 26 69 4e 65 78 74 29 3b  &pOvfl, &iNext);
321b0 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20  .      if( rc ) 
321c0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
321d0 0a 0a 20 20 20 20 69 66 28 20 28 20 70 4f 76 66  ..    if( ( pOvf
321e0 6c 20 7c 7c 20 28 28 70 4f 76 66 6c 20 3d 20 62  l || ((pOvfl = b
321f0 74 72 65 65 50 61 67 65 4c 6f 6f 6b 75 70 28 70  treePageLookup(p
32200 42 74 2c 20 6f 76 66 6c 50 67 6e 6f 29 29 21 3d  Bt, ovflPgno))!=
32210 30 29 20 29 0a 20 20 20 20 20 26 26 20 73 71 6c  0) ).     && sql
32220 69 74 65 33 50 61 67 65 72 50 61 67 65 52 65 66  ite3PagerPageRef
32230 63 6f 75 6e 74 28 70 4f 76 66 6c 2d 3e 70 44 62  count(pOvfl->pDb
32240 50 61 67 65 29 21 3d 31 0a 20 20 20 20 29 7b 0a  Page)!=1.    ){.
32250 20 20 20 20 20 20 2f 2a 20 54 68 65 72 65 20 69        /* There i
32260 73 20 6e 6f 20 72 65 61 73 6f 6e 20 61 6e 79 20  s no reason any 
32270 63 75 72 73 6f 72 20 73 68 6f 75 6c 64 20 68 61  cursor should ha
32280 76 65 20 61 6e 20 6f 75 74 73 74 61 6e 64 69 6e  ve an outstandin
32290 67 20 72 65 66 65 72 65 6e 63 65 20 0a 20 20 20  g reference .   
322a0 20 20 20 2a 2a 20 74 6f 20 61 6e 20 6f 76 65 72     ** to an over
322b0 66 6c 6f 77 20 70 61 67 65 20 62 65 6c 6f 6e 67  flow page belong
322c0 69 6e 67 20 74 6f 20 61 20 63 65 6c 6c 20 74 68  ing to a cell th
322d0 61 74 20 69 73 20 62 65 69 6e 67 20 64 65 6c 65  at is being dele
322e0 74 65 64 2f 75 70 64 61 74 65 64 2e 0a 20 20 20  ted/updated..   
322f0 20 20 20 2a 2a 20 53 6f 20 69 66 20 74 68 65 72     ** So if ther
32300 65 20 65 78 69 73 74 73 20 6d 6f 72 65 20 74 68  e exists more th
32310 61 6e 20 6f 6e 65 20 72 65 66 65 72 65 6e 63 65  an one reference
32320 20 74 6f 20 74 68 69 73 20 70 61 67 65 2c 20 74   to this page, t
32330 68 65 6e 20 69 74 20 0a 20 20 20 20 20 20 2a 2a  hen it .      **
32340 20 6d 75 73 74 20 6e 6f 74 20 72 65 61 6c 6c 79   must not really
32350 20 62 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20   be an overflow 
32360 70 61 67 65 20 61 6e 64 20 74 68 65 20 64 61 74  page and the dat
32370 61 62 61 73 65 20 6d 75 73 74 20 62 65 20 63 6f  abase must be co
32380 72 72 75 70 74 2e 20 0a 20 20 20 20 20 20 2a 2a  rrupt. .      **
32390 20 49 74 20 69 73 20 68 65 6c 70 66 75 6c 20 74   It is helpful t
323a0 6f 20 64 65 74 65 63 74 20 74 68 69 73 20 62 65  o detect this be
323b0 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 66 72 65  fore calling fre
323c0 65 50 61 67 65 32 28 29 2c 20 61 73 20 0a 20 20  ePage2(), as .  
323d0 20 20 20 20 2a 2a 20 66 72 65 65 50 61 67 65 32      ** freePage2
323e0 28 29 20 6d 61 79 20 7a 65 72 6f 20 74 68 65 20  () may zero the 
323f0 70 61 67 65 20 63 6f 6e 74 65 6e 74 73 20 69 66  page contents if
32400 20 73 65 63 75 72 65 2d 64 65 6c 65 74 65 20 6d   secure-delete m
32410 6f 64 65 20 69 73 0a 20 20 20 20 20 20 2a 2a 20  ode is.      ** 
32420 65 6e 61 62 6c 65 64 2e 20 49 66 20 74 68 69 73  enabled. If this
32430 20 27 6f 76 65 72 66 6c 6f 77 27 20 70 61 67 65   'overflow' page
32440 20 68 61 70 70 65 6e 73 20 74 6f 20 62 65 20 61   happens to be a
32450 20 70 61 67 65 20 74 68 61 74 20 74 68 65 0a 20   page that the. 
32460 20 20 20 20 20 2a 2a 20 63 61 6c 6c 65 72 20 69       ** caller i
32470 73 20 69 74 65 72 61 74 69 6e 67 20 74 68 72 6f  s iterating thro
32480 75 67 68 20 6f 72 20 75 73 69 6e 67 20 69 6e 20  ugh or using in 
32490 73 6f 6d 65 20 6f 74 68 65 72 20 77 61 79 2c 20  some other way, 
324a0 74 68 69 73 0a 20 20 20 20 20 20 2a 2a 20 63 61  this.      ** ca
324b0 6e 20 62 65 20 70 72 6f 62 6c 65 6d 61 74 69 63  n be problematic
324c0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
324d0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
324e0 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  RUPT_BKPT;.    }
324f0 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
32500 20 66 72 65 65 50 61 67 65 32 28 70 42 74 2c 20   freePage2(pBt, 
32510 70 4f 76 66 6c 2c 20 6f 76 66 6c 50 67 6e 6f 29  pOvfl, ovflPgno)
32520 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
32530 20 70 4f 76 66 6c 20 29 7b 0a 20 20 20 20 20 20   pOvfl ){.      
32540 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
32550 66 28 70 4f 76 66 6c 2d 3e 70 44 62 50 61 67 65  f(pOvfl->pDbPage
32560 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
32570 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
32580 0a 20 20 20 20 6f 76 66 6c 50 67 6e 6f 20 3d 20  .    ovflPgno = 
32590 69 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 72 65 74  iNext;.  }.  ret
325a0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
325b0 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 74  ../*.** Create t
325c0 68 65 20 62 79 74 65 20 73 65 71 75 65 6e 63 65  he byte sequence
325d0 20 75 73 65 64 20 74 6f 20 72 65 70 72 65 73 65   used to represe
325e0 6e 74 20 61 20 63 65 6c 6c 20 6f 6e 20 70 61 67  nt a cell on pag
325f0 65 20 70 50 61 67 65 0a 2a 2a 20 61 6e 64 20 77  e pPage.** and w
32600 72 69 74 65 20 74 68 61 74 20 62 79 74 65 20 73  rite that byte s
32610 65 71 75 65 6e 63 65 20 69 6e 74 6f 20 70 43 65  equence into pCe
32620 6c 6c 5b 5d 2e 20 20 4f 76 65 72 66 6c 6f 77 20  ll[].  Overflow 
32630 70 61 67 65 73 20 61 72 65 0a 2a 2a 20 61 6c 6c  pages are.** all
32640 6f 63 61 74 65 64 20 61 6e 64 20 66 69 6c 6c 65  ocated and fille
32650 64 20 69 6e 20 61 73 20 6e 65 63 65 73 73 61 72  d in as necessar
32660 79 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 20  y.  The calling 
32670 70 72 6f 63 65 64 75 72 65 0a 2a 2a 20 69 73 20  procedure.** is 
32680 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20  responsible for 
32690 6d 61 6b 69 6e 67 20 73 75 72 65 20 73 75 66 66  making sure suff
326a0 69 63 69 65 6e 74 20 73 70 61 63 65 20 68 61 73  icient space has
326b0 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 0a   been allocated.
326c0 2a 2a 20 66 6f 72 20 70 43 65 6c 6c 5b 5d 2e 0a  ** for pCell[]..
326d0 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  **.** Note that 
326e0 70 43 65 6c 6c 20 64 6f 65 73 20 6e 6f 74 20 6e  pCell does not n
326f0 65 63 65 73 73 61 72 79 20 6e 65 65 64 20 74 6f  ecessary need to
32700 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 70 50   point to the pP
32710 61 67 65 2d 3e 61 44 61 74 61 0a 2a 2a 20 61 72  age->aData.** ar
32720 65 61 2e 20 20 70 43 65 6c 6c 20 6d 69 67 68 74  ea.  pCell might
32730 20 70 6f 69 6e 74 20 74 6f 20 73 6f 6d 65 20 74   point to some t
32740 65 6d 70 6f 72 61 72 79 20 73 74 6f 72 61 67 65  emporary storage
32750 2e 20 20 54 68 65 20 63 65 6c 6c 20 77 69 6c 6c  .  The cell will
32760 0a 2a 2a 20 62 65 20 63 6f 6e 73 74 72 75 63 74  .** be construct
32770 65 64 20 69 6e 20 74 68 69 73 20 74 65 6d 70 6f  ed in this tempo
32780 72 61 72 79 20 61 72 65 61 20 74 68 65 6e 20 63  rary area then c
32790 6f 70 69 65 64 20 69 6e 74 6f 20 70 50 61 67 65  opied into pPage
327a0 2d 3e 61 44 61 74 61 0a 2a 2a 20 6c 61 74 65 72  ->aData.** later
327b0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
327c0 66 69 6c 6c 49 6e 43 65 6c 6c 28 0a 20 20 4d 65  fillInCell(.  Me
327d0 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20  mPage *pPage,   
327e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
327f0 54 68 65 20 70 61 67 65 20 74 68 61 74 20 63 6f  The page that co
32800 6e 74 61 69 6e 73 20 74 68 65 20 63 65 6c 6c 20  ntains the cell 
32810 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
32820 61 72 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20  ar *pCell,      
32830 20 20 20 20 2f 2a 20 43 6f 6d 70 6c 65 74 65 20      /* Complete 
32840 74 65 78 74 20 6f 66 20 74 68 65 20 63 65 6c 6c  text of the cell
32850 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64   */.  const void
32860 20 2a 70 4b 65 79 2c 20 69 36 34 20 6e 4b 65 79   *pKey, i64 nKey
32870 2c 20 20 20 20 2f 2a 20 54 68 65 20 6b 65 79 20  ,    /* The key 
32880 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  */.  const void 
32890 2a 70 44 61 74 61 2c 69 6e 74 20 6e 44 61 74 61  *pData,int nData
328a0 2c 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 20  ,   /* The data 
328b0 2a 2f 0a 20 20 69 6e 74 20 6e 5a 65 72 6f 2c 20  */.  int nZero, 
328c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
328d0 20 20 20 20 2f 2a 20 45 78 74 72 61 20 7a 65 72      /* Extra zer
328e0 6f 20 62 79 74 65 73 20 74 6f 20 61 70 70 65 6e  o bytes to appen
328f0 64 20 74 6f 20 70 44 61 74 61 20 2a 2f 0a 20 20  d to pData */.  
32900 69 6e 74 20 2a 70 6e 53 69 7a 65 20 20 20 20 20  int *pnSize     
32910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
32920 2a 20 57 72 69 74 65 20 63 65 6c 6c 20 73 69 7a  * Write cell siz
32930 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69  e here */.){.  i
32940 6e 74 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 63  nt nPayload;.  c
32950 6f 6e 73 74 20 75 38 20 2a 70 53 72 63 3b 0a 20  onst u8 *pSrc;. 
32960 20 69 6e 74 20 6e 53 72 63 2c 20 6e 2c 20 72 63   int nSrc, n, rc
32970 3b 0a 20 20 69 6e 74 20 73 70 61 63 65 4c 65 66  ;.  int spaceLef
32980 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f  t;.  MemPage *pO
32990 76 66 6c 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61  vfl = 0;.  MemPa
329a0 67 65 20 2a 70 54 6f 52 65 6c 65 61 73 65 20 3d  ge *pToRelease =
329b0 20 30 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   0;.  unsigned c
329c0 68 61 72 20 2a 70 50 72 69 6f 72 3b 0a 20 20 75  har *pPrior;.  u
329d0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 50  nsigned char *pP
329e0 61 79 6c 6f 61 64 3b 0a 20 20 42 74 53 68 61 72  ayload;.  BtShar
329f0 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d  ed *pBt = pPage-
32a00 3e 70 42 74 3b 0a 20 20 50 67 6e 6f 20 70 67 6e  >pBt;.  Pgno pgn
32a10 6f 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 69 6e 74  oOvfl = 0;.  int
32a20 20 6e 48 65 61 64 65 72 3b 0a 0a 20 20 61 73 73   nHeader;..  ass
32a30 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
32a40 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
32a50 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20  Bt->mutex) );.. 
32a60 20 2f 2a 20 70 50 61 67 65 20 69 73 20 6e 6f 74   /* pPage is not
32a70 20 6e 65 63 65 73 73 61 72 69 6c 79 20 77 72 69   necessarily wri
32a80 74 65 61 62 6c 65 20 73 69 6e 63 65 20 70 43 65  teable since pCe
32a90 6c 6c 20 6d 69 67 68 74 20 62 65 20 61 75 78 69  ll might be auxi
32aa0 6c 69 61 72 79 0a 20 20 2a 2a 20 62 75 66 66 65  liary.  ** buffe
32ab0 72 20 73 70 61 63 65 20 74 68 61 74 20 69 73 20  r space that is 
32ac0 73 65 70 61 72 61 74 65 20 66 72 6f 6d 20 74 68  separate from th
32ad0 65 20 70 50 61 67 65 20 62 75 66 66 65 72 20 61  e pPage buffer a
32ae0 72 65 61 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  rea */.  assert(
32af0 20 70 43 65 6c 6c 3c 70 50 61 67 65 2d 3e 61 44   pCell<pPage->aD
32b00 61 74 61 20 7c 7c 20 70 43 65 6c 6c 3e 3d 26 70  ata || pCell>=&p
32b10 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d  Page->aData[pBt-
32b20 3e 70 61 67 65 53 69 7a 65 5d 0a 20 20 20 20 20  >pageSize].     
32b30 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65         || sqlite
32b40 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
32b50 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
32b60 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20  ) );..  /* Fill 
32b70 69 6e 20 74 68 65 20 68 65 61 64 65 72 2e 20 2a  in the header. *
32b80 2f 0a 20 20 6e 48 65 61 64 65 72 20 3d 20 70 50  /.  nHeader = pP
32b90 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a  age->childPtrSiz
32ba0 65 3b 0a 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20  e;.  nPayload = 
32bb0 6e 44 61 74 61 20 2b 20 6e 5a 65 72 6f 3b 0a 20  nData + nZero;. 
32bc0 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b   if( pPage->intK
32bd0 65 79 4c 65 61 66 20 29 7b 0a 20 20 20 20 6e 48  eyLeaf ){.    nH
32be0 65 61 64 65 72 20 2b 3d 20 70 75 74 56 61 72 69  eader += putVari
32bf0 6e 74 33 32 28 26 70 43 65 6c 6c 5b 6e 48 65 61  nt32(&pCell[nHea
32c00 64 65 72 5d 2c 20 6e 50 61 79 6c 6f 61 64 29 3b  der], nPayload);
32c10 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
32c20 73 65 72 74 28 20 6e 44 61 74 61 3d 3d 30 20 29  sert( nData==0 )
32c30 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 5a  ;.    assert( nZ
32c40 65 72 6f 3d 3d 30 20 29 3b 0a 20 20 7d 0a 20 20  ero==0 );.  }.  
32c50 6e 48 65 61 64 65 72 20 2b 3d 20 70 75 74 56 61  nHeader += putVa
32c60 72 69 6e 74 28 26 70 43 65 6c 6c 5b 6e 48 65 61  rint(&pCell[nHea
32c70 64 65 72 5d 2c 20 2a 28 75 36 34 2a 29 26 6e 4b  der], *(u64*)&nK
32c80 65 79 29 3b 0a 20 20 0a 20 20 2f 2a 20 46 69 6c  ey);.  .  /* Fil
32c90 6c 20 69 6e 20 74 68 65 20 70 61 79 6c 6f 61 64  l in the payload
32ca0 20 73 69 7a 65 20 2a 2f 0a 20 20 69 66 28 20 70   size */.  if( p
32cb0 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a  Page->intKey ){.
32cc0 20 20 20 20 70 53 72 63 20 3d 20 70 44 61 74 61      pSrc = pData
32cd0 3b 0a 20 20 20 20 6e 53 72 63 20 3d 20 6e 44 61  ;.    nSrc = nDa
32ce0 74 61 3b 0a 20 20 20 20 6e 44 61 74 61 20 3d 20  ta;.    nData = 
32cf0 30 3b 0a 20 20 7d 65 6c 73 65 7b 20 0a 20 20 20  0;.  }else{ .   
32d00 20 69 66 28 20 4e 45 56 45 52 28 6e 4b 65 79 3e   if( NEVER(nKey>
32d10 30 78 37 66 66 66 66 66 66 66 20 7c 7c 20 70 4b  0x7fffffff || pK
32d20 65 79 3d 3d 30 29 20 29 7b 0a 20 20 20 20 20 20  ey==0) ){.      
32d30 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
32d40 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
32d50 7d 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 3d  }.    nPayload =
32d60 20 28 69 6e 74 29 6e 4b 65 79 3b 0a 20 20 20 20   (int)nKey;.    
32d70 70 53 72 63 20 3d 20 70 4b 65 79 3b 0a 20 20 20  pSrc = pKey;.   
32d80 20 6e 53 72 63 20 3d 20 28 69 6e 74 29 6e 4b 65   nSrc = (int)nKe
32d90 79 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 50 61  y;.  }.  if( nPa
32da0 79 6c 6f 61 64 3c 3d 70 50 61 67 65 2d 3e 6d 61  yload<=pPage->ma
32db0 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 6e 20  xLocal ){.    n 
32dc0 3d 20 6e 48 65 61 64 65 72 20 2b 20 6e 50 61 79  = nHeader + nPay
32dd0 6c 6f 61 64 3b 0a 20 20 20 20 74 65 73 74 63 61  load;.    testca
32de0 73 65 28 20 6e 3d 3d 33 20 29 3b 0a 20 20 20 20  se( n==3 );.    
32df0 74 65 73 74 63 61 73 65 28 20 6e 3d 3d 34 20 29  testcase( n==4 )
32e00 3b 0a 20 20 20 20 69 66 28 20 6e 3c 34 20 29 20  ;.    if( n<4 ) 
32e10 6e 20 3d 20 34 3b 0a 20 20 20 20 2a 70 6e 53 69  n = 4;.    *pnSi
32e20 7a 65 20 3d 20 6e 3b 0a 20 20 20 20 73 70 61 63  ze = n;.    spac
32e30 65 4c 65 66 74 20 3d 20 6e 50 61 79 6c 6f 61 64  eLeft = nPayload
32e40 3b 0a 20 20 20 20 70 50 72 69 6f 72 20 3d 20 70  ;.    pPrior = p
32e50 43 65 6c 6c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Cell;.  }else{. 
32e60 20 20 20 69 6e 74 20 6d 6e 20 3d 20 70 50 61 67     int mn = pPag
32e70 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20  e->minLocal;.   
32e80 20 6e 20 3d 20 6d 6e 20 2b 20 28 6e 50 61 79 6c   n = mn + (nPayl
32e90 6f 61 64 20 2d 20 6d 6e 29 20 25 20 28 70 50 61  oad - mn) % (pPa
32ea0 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
32eb0 69 7a 65 20 2d 20 34 29 3b 0a 20 20 20 20 74 65  ize - 4);.    te
32ec0 73 74 63 61 73 65 28 20 6e 3d 3d 70 50 61 67 65  stcase( n==pPage
32ed0 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20  ->maxLocal );.  
32ee0 20 20 74 65 73 74 63 61 73 65 28 20 6e 3d 3d 70    testcase( n==p
32ef0 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31  Page->maxLocal+1
32f00 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 20 3e 20   );.    if( n > 
32f10 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20  pPage->maxLocal 
32f20 29 20 6e 20 3d 20 6d 6e 3b 0a 20 20 20 20 73 70  ) n = mn;.    sp
32f30 61 63 65 4c 65 66 74 20 3d 20 6e 3b 0a 20 20 20  aceLeft = n;.   
32f40 20 2a 70 6e 53 69 7a 65 20 3d 20 6e 20 2b 20 6e   *pnSize = n + n
32f50 48 65 61 64 65 72 20 2b 20 34 3b 0a 20 20 20 20  Header + 4;.    
32f60 70 50 72 69 6f 72 20 3d 20 26 70 43 65 6c 6c 5b  pPrior = &pCell[
32f70 6e 48 65 61 64 65 72 2b 6e 5d 3b 0a 20 20 7d 0a  nHeader+n];.  }.
32f80 20 20 70 50 61 79 6c 6f 61 64 20 3d 20 26 70 43    pPayload = &pC
32f90 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 3b 0a 0a 20  ell[nHeader];.. 
32fa0 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e   /* At this poin
32fb0 74 20 76 61 72 69 61 62 6c 65 73 20 73 68 6f 75  t variables shou
32fc0 6c 64 20 62 65 20 73 65 74 20 61 73 20 66 6f 6c  ld be set as fol
32fd0 6c 6f 77 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  lows:.  **.  ** 
32fe0 20 20 6e 50 61 79 6c 6f 61 64 20 20 20 20 20 20    nPayload      
32ff0 20 20 20 20 20 54 6f 74 61 6c 20 70 61 79 6c 6f       Total paylo
33000 61 64 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73  ad size in bytes
33010 0a 20 20 2a 2a 20 20 20 70 50 61 79 6c 6f 61 64  .  **   pPayload
33020 20 20 20 20 20 20 20 20 20 20 20 42 65 67 69 6e             Begin
33030 20 77 72 69 74 69 6e 67 20 70 61 79 6c 6f 61 64   writing payload
33040 20 68 65 72 65 0a 20 20 2a 2a 20 20 20 73 70 61   here.  **   spa
33050 63 65 4c 65 66 74 20 20 20 20 20 20 20 20 20 20  ceLeft          
33060 53 70 61 63 65 20 61 76 61 69 6c 61 62 6c 65 20  Space available 
33070 61 74 20 70 50 61 79 6c 6f 61 64 2e 20 20 49 66  at pPayload.  If
33080 20 6e 50 61 79 6c 6f 61 64 3e 73 70 61 63 65 4c   nPayload>spaceL
33090 65 66 74 2c 0a 20 20 2a 2a 20 20 20 20 20 20 20  eft,.  **       
330a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
330b0 68 61 74 20 6d 65 61 6e 73 20 63 6f 6e 74 65 6e  hat means conten
330c0 74 20 6d 75 73 74 20 73 70 69 6c 6c 20 69 6e 74  t must spill int
330d0 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  o overflow pages
330e0 2e 0a 20 20 2a 2a 20 20 20 2a 70 6e 53 69 7a 65  ..  **   *pnSize
330f0 20 20 20 20 20 20 20 20 20 20 20 20 53 69 7a 65              Size
33100 20 6f 66 20 74 68 65 20 6c 6f 63 61 6c 20 63 65   of the local ce
33110 6c 6c 20 28 6e 6f 74 20 63 6f 75 6e 74 69 6e 67  ll (not counting
33120 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 29   overflow pages)
33130 0a 20 20 2a 2a 20 20 20 70 50 72 69 6f 72 20 20  .  **   pPrior  
33140 20 20 20 20 20 20 20 20 20 20 20 57 68 65 72 65             Where
33150 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 70 67   to write the pg
33160 6e 6f 20 6f 66 20 74 68 65 20 66 69 72 73 74 20  no of the first 
33170 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 0a 20 20  overflow page.  
33180 2a 2a 0a 20 20 2a 2a 20 55 73 65 20 61 20 63 61  **.  ** Use a ca
33190 6c 6c 20 74 6f 20 62 74 72 65 65 50 61 72 73 65  ll to btreeParse
331a0 43 65 6c 6c 50 74 72 28 29 20 74 6f 20 76 65 72  CellPtr() to ver
331b0 69 66 79 20 74 68 61 74 20 74 68 65 20 76 61 6c  ify that the val
331c0 75 65 73 20 61 62 6f 76 65 0a 20 20 2a 2a 20 77  ues above.  ** w
331d0 65 72 65 20 63 6f 6d 70 75 74 65 64 20 63 6f 72  ere computed cor
331e0 72 65 63 74 6c 79 2e 0a 20 20 2a 2f 0a 23 69 66  rectly..  */.#if
331f0 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
33200 7b 0a 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69  {.    CellInfo i
33210 6e 66 6f 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  nfo;.    pPage->
33220 78 50 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65  xParseCell(pPage
33230 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b  , pCell, &info);
33240 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 48 65  .    assert( nHe
33250 61 64 65 72 3d 28 69 6e 74 29 28 69 6e 66 6f 2e  ader=(int)(info.
33260 70 50 61 79 6c 6f 61 64 20 2d 20 70 43 65 6c 6c  pPayload - pCell
33270 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ) );.    assert(
33280 20 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 6e 4b 65 79   info.nKey==nKey
33290 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
332a0 2a 70 6e 53 69 7a 65 20 3d 3d 20 69 6e 66 6f 2e  *pnSize == info.
332b0 6e 53 69 7a 65 20 29 3b 0a 20 20 20 20 61 73 73  nSize );.    ass
332c0 65 72 74 28 20 73 70 61 63 65 4c 65 66 74 20 3d  ert( spaceLeft =
332d0 3d 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 3b  = info.nLocal );
332e0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 72  .    assert( pPr
332f0 69 6f 72 20 3d 3d 20 26 70 43 65 6c 6c 5b 69 6e  ior == &pCell[in
33300 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 20 29 3b  fo.iOverflow] );
33310 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
33320 2a 20 57 72 69 74 65 20 74 68 65 20 70 61 79 6c  * Write the payl
33330 6f 61 64 20 69 6e 74 6f 20 74 68 65 20 6c 6f 63  oad into the loc
33340 61 6c 20 43 65 6c 6c 20 61 6e 64 20 61 6e 79 20  al Cell and any 
33350 65 78 74 72 61 20 69 6e 74 6f 20 6f 76 65 72 66  extra into overf
33360 6c 6f 77 20 70 61 67 65 73 20 2a 2f 0a 20 20 77  low pages */.  w
33370 68 69 6c 65 28 20 6e 50 61 79 6c 6f 61 64 3e 30  hile( nPayload>0
33380 20 29 7b 0a 20 20 20 20 69 66 28 20 73 70 61 63   ){.    if( spac
33390 65 4c 65 66 74 3d 3d 30 20 29 7b 0a 23 69 66 6e  eLeft==0 ){.#ifn
333a0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
333b0 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20  AUTOVACUUM.     
333c0 20 50 67 6e 6f 20 70 67 6e 6f 50 74 72 6d 61 70   Pgno pgnoPtrmap
333d0 20 3d 20 70 67 6e 6f 4f 76 66 6c 3b 20 2f 2a 20   = pgnoOvfl; /* 
333e0 4f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 70 6f  Overflow page po
333f0 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 79 20  inter-map entry 
33400 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 69 66  page */.      if
33410 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
33420 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 64 6f 7b  m ){.        do{
33430 0a 20 20 20 20 20 20 20 20 20 20 70 67 6e 6f 4f  .          pgnoO
33440 76 66 6c 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d  vfl++;.        }
33450 20 77 68 69 6c 65 28 20 0a 20 20 20 20 20 20 20   while( .       
33460 20 20 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45     PTRMAP_ISPAGE
33470 28 70 42 74 2c 20 70 67 6e 6f 4f 76 66 6c 29 20  (pBt, pgnoOvfl) 
33480 7c 7c 20 70 67 6e 6f 4f 76 66 6c 3d 3d 50 45 4e  || pgnoOvfl==PEN
33490 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
334a0 42 74 29 20 0a 20 20 20 20 20 20 20 20 29 3b 0a  Bt) .        );.
334b0 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
334c0 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61       rc = alloca
334d0 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c  teBtreePage(pBt,
334e0 20 26 70 4f 76 66 6c 2c 20 26 70 67 6e 6f 4f 76   &pOvfl, &pgnoOv
334f0 66 6c 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 30 29  fl, pgnoOvfl, 0)
33500 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
33510 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
33520 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
33530 20 64 61 74 61 62 61 73 65 20 73 75 70 70 6f 72   database suppor
33540 74 73 20 61 75 74 6f 2d 76 61 63 75 75 6d 2c 20  ts auto-vacuum, 
33550 61 6e 64 20 74 68 65 20 73 65 63 6f 6e 64 20 6f  and the second o
33560 72 20 73 75 62 73 65 71 75 65 6e 74 0a 20 20 20  r subsequent.   
33570 20 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70     ** overflow p
33580 61 67 65 20 69 73 20 62 65 69 6e 67 20 61 6c 6c  age is being all
33590 6f 63 61 74 65 64 2c 20 61 64 64 20 61 6e 20 65  ocated, add an e
335a0 6e 74 72 79 20 74 6f 20 74 68 65 20 70 6f 69 6e  ntry to the poin
335b0 74 65 72 2d 6d 61 70 0a 20 20 20 20 20 20 2a 2a  ter-map.      **
335c0 20 66 6f 72 20 74 68 61 74 20 70 61 67 65 20 6e   for that page n
335d0 6f 77 2e 20 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ow. .      **.  
335e0 20 20 20 20 2a 2a 20 49 66 20 74 68 69 73 20 69      ** If this i
335f0 73 20 74 68 65 20 66 69 72 73 74 20 6f 76 65 72  s the first over
33600 66 6c 6f 77 20 70 61 67 65 2c 20 74 68 65 6e 20  flow page, then 
33610 77 72 69 74 65 20 61 20 70 61 72 74 69 61 6c 20  write a partial 
33620 65 6e 74 72 79 20 0a 20 20 20 20 20 20 2a 2a 20  entry .      ** 
33630 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d  to the pointer-m
33640 61 70 2e 20 49 66 20 77 65 20 77 72 69 74 65 20  ap. If we write 
33650 6e 6f 74 68 69 6e 67 20 74 6f 20 74 68 69 73 20  nothing to this 
33660 70 6f 69 6e 74 65 72 2d 6d 61 70 20 73 6c 6f 74  pointer-map slot
33670 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20  ,.      ** then 
33680 74 68 65 20 6f 70 74 69 6d 69 73 74 69 63 20 6f  the optimistic o
33690 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 20 70 72  verflow chain pr
336a0 6f 63 65 73 73 69 6e 67 20 69 6e 20 63 6c 65 61  ocessing in clea
336b0 72 43 65 6c 6c 28 29 0a 20 20 20 20 20 20 2a 2a  rCell().      **
336c0 20 6d 61 79 20 6d 69 73 69 6e 74 65 72 70 72 65   may misinterpre
336d0 74 20 74 68 65 20 75 6e 69 6e 69 74 69 61 6c 69  t the uninitiali
336e0 7a 65 64 20 76 61 6c 75 65 73 20 61 6e 64 20 64  zed values and d
336f0 65 6c 65 74 65 20 74 68 65 0a 20 20 20 20 20 20  elete the.      
33700 2a 2a 20 77 72 6f 6e 67 20 70 61 67 65 73 20 66  ** wrong pages f
33710 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
33720 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
33730 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61   if( pBt->autoVa
33740 63 75 75 6d 20 26 26 20 72 63 3d 3d 53 51 4c 49  cuum && rc==SQLI
33750 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
33760 20 75 38 20 65 54 79 70 65 20 3d 20 28 70 67 6e   u8 eType = (pgn
33770 6f 50 74 72 6d 61 70 3f 50 54 52 4d 41 50 5f 4f  oPtrmap?PTRMAP_O
33780 56 45 52 46 4c 4f 57 32 3a 50 54 52 4d 41 50 5f  VERFLOW2:PTRMAP_
33790 4f 56 45 52 46 4c 4f 57 31 29 3b 0a 20 20 20 20  OVERFLOW1);.    
337a0 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42      ptrmapPut(pB
337b0 74 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 65 54 79  t, pgnoOvfl, eTy
337c0 70 65 2c 20 70 67 6e 6f 50 74 72 6d 61 70 2c 20  pe, pgnoPtrmap, 
337d0 26 72 63 29 3b 0a 20 20 20 20 20 20 20 20 69 66  &rc);.        if
337e0 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
337f0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4f    releasePage(pO
33800 76 66 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  vfl);.        }.
33810 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
33820 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
33830 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
33840 67 65 28 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a  ge(pToRelease);.
33850 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
33860 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  c;.      }..    
33870 20 20 2f 2a 20 49 66 20 70 54 6f 52 65 6c 65 61    /* If pToRelea
33880 73 65 20 69 73 20 6e 6f 74 20 7a 65 72 6f 20 74  se is not zero t
33890 68 61 6e 20 70 50 72 69 6f 72 20 70 6f 69 6e 74  han pPrior point
338a0 73 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 20  s into the data 
338b0 61 72 65 61 0a 20 20 20 20 20 20 2a 2a 20 6f 66  area.      ** of
338c0 20 70 54 6f 52 65 6c 65 61 73 65 2e 20 20 4d 61   pToRelease.  Ma
338d0 6b 65 20 73 75 72 65 20 70 54 6f 52 65 6c 65 61  ke sure pToRelea
338e0 73 65 20 69 73 20 73 74 69 6c 6c 20 77 72 69 74  se is still writ
338f0 65 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20  eable. */.      
33900 61 73 73 65 72 74 28 20 70 54 6f 52 65 6c 65 61  assert( pToRelea
33910 73 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33  se==0 || sqlite3
33920 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
33930 28 70 54 6f 52 65 6c 65 61 73 65 2d 3e 70 44 62  (pToRelease->pDb
33940 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 20 20  Page) );..      
33950 2f 2a 20 49 66 20 70 50 72 69 6f 72 20 69 73 20  /* If pPrior is 
33960 70 61 72 74 20 6f 66 20 74 68 65 20 64 61 74 61  part of the data
33970 20 61 72 65 61 20 6f 66 20 70 50 61 67 65 2c 20   area of pPage, 
33980 74 68 65 6e 20 6d 61 6b 65 20 73 75 72 65 20 70  then make sure p
33990 50 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 69 73  Page.      ** is
339a0 20 73 74 69 6c 6c 20 77 72 69 74 65 61 62 6c 65   still writeable
339b0 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
339c0 28 20 70 50 72 69 6f 72 3c 70 50 61 67 65 2d 3e  ( pPrior<pPage->
339d0 61 44 61 74 61 20 7c 7c 20 70 50 72 69 6f 72 3e  aData || pPrior>
339e0 3d 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  =&pPage->aData[p
339f0 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d 0a 20 20  Bt->pageSize].  
33a00 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c            || sql
33a10 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
33a20 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
33a30 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 20 20 70  age) );..      p
33a40 75 74 34 62 79 74 65 28 70 50 72 69 6f 72 2c 20  ut4byte(pPrior, 
33a50 70 67 6e 6f 4f 76 66 6c 29 3b 0a 20 20 20 20 20  pgnoOvfl);.     
33a60 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 6f   releasePage(pTo
33a70 52 65 6c 65 61 73 65 29 3b 0a 20 20 20 20 20 20  Release);.      
33a80 70 54 6f 52 65 6c 65 61 73 65 20 3d 20 70 4f 76  pToRelease = pOv
33a90 66 6c 3b 0a 20 20 20 20 20 20 70 50 72 69 6f 72  fl;.      pPrior
33aa0 20 3d 20 70 4f 76 66 6c 2d 3e 61 44 61 74 61 3b   = pOvfl->aData;
33ab0 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28  .      put4byte(
33ac0 70 50 72 69 6f 72 2c 20 30 29 3b 0a 20 20 20 20  pPrior, 0);.    
33ad0 20 20 70 50 61 79 6c 6f 61 64 20 3d 20 26 70 4f    pPayload = &pO
33ae0 76 66 6c 2d 3e 61 44 61 74 61 5b 34 5d 3b 0a 20  vfl->aData[4];. 
33af0 20 20 20 20 20 73 70 61 63 65 4c 65 66 74 20 3d       spaceLeft =
33b00 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
33b10 20 2d 20 34 3b 0a 20 20 20 20 7d 0a 20 20 20 20   - 4;.    }.    
33b20 6e 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20  n = nPayload;.  
33b30 20 20 69 66 28 20 6e 3e 73 70 61 63 65 4c 65 66    if( n>spaceLef
33b40 74 20 29 20 6e 20 3d 20 73 70 61 63 65 4c 65 66  t ) n = spaceLef
33b50 74 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70 54  t;..    /* If pT
33b60 6f 52 65 6c 65 61 73 65 20 69 73 20 6e 6f 74 20  oRelease is not 
33b70 7a 65 72 6f 20 74 68 61 6e 20 70 50 61 79 6c 6f  zero than pPaylo
33b80 61 64 20 70 6f 69 6e 74 73 20 69 6e 74 6f 20 74  ad points into t
33b90 68 65 20 64 61 74 61 20 61 72 65 61 0a 20 20 20  he data area.   
33ba0 20 2a 2a 20 6f 66 20 70 54 6f 52 65 6c 65 61 73   ** of pToReleas
33bb0 65 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 70 54  e.  Make sure pT
33bc0 6f 52 65 6c 65 61 73 65 20 69 73 20 73 74 69 6c  oRelease is stil
33bd0 6c 20 77 72 69 74 65 61 62 6c 65 2e 20 2a 2f 0a  l writeable. */.
33be0 20 20 20 20 61 73 73 65 72 74 28 20 70 54 6f 52      assert( pToR
33bf0 65 6c 65 61 73 65 3d 3d 30 20 7c 7c 20 73 71 6c  elease==0 || sql
33c00 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
33c10 61 62 6c 65 28 70 54 6f 52 65 6c 65 61 73 65 2d  able(pToRelease-
33c20 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20  >pDbPage) );..  
33c30 20 20 2f 2a 20 49 66 20 70 50 61 79 6c 6f 61 64    /* If pPayload
33c40 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20   is part of the 
33c50 64 61 74 61 20 61 72 65 61 20 6f 66 20 70 50 61  data area of pPa
33c60 67 65 2c 20 74 68 65 6e 20 6d 61 6b 65 20 73 75  ge, then make su
33c70 72 65 20 70 50 61 67 65 0a 20 20 20 20 2a 2a 20  re pPage.    ** 
33c80 69 73 20 73 74 69 6c 6c 20 77 72 69 74 65 61 62  is still writeab
33c90 6c 65 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  le */.    assert
33ca0 28 20 70 50 61 79 6c 6f 61 64 3c 70 50 61 67 65  ( pPayload<pPage
33cb0 2d 3e 61 44 61 74 61 20 7c 7c 20 70 50 61 79 6c  ->aData || pPayl
33cc0 6f 61 64 3e 3d 26 70 50 61 67 65 2d 3e 61 44 61  oad>=&pPage->aDa
33cd0 74 61 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  ta[pBt->pageSize
33ce0 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c  ].            ||
33cf0 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
33d00 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
33d10 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20  pDbPage) );..   
33d20 20 69 66 28 20 6e 53 72 63 3e 30 20 29 7b 0a 20   if( nSrc>0 ){. 
33d30 20 20 20 20 20 69 66 28 20 6e 3e 6e 53 72 63 20       if( n>nSrc 
33d40 29 20 6e 20 3d 20 6e 53 72 63 3b 0a 20 20 20 20  ) n = nSrc;.    
33d50 20 20 61 73 73 65 72 74 28 20 70 53 72 63 20 29    assert( pSrc )
33d60 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70  ;.      memcpy(p
33d70 50 61 79 6c 6f 61 64 2c 20 70 53 72 63 2c 20 6e  Payload, pSrc, n
33d80 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
33d90 20 20 20 20 6d 65 6d 73 65 74 28 70 50 61 79 6c      memset(pPayl
33da0 6f 61 64 2c 20 30 2c 20 6e 29 3b 0a 20 20 20 20  oad, 0, n);.    
33db0 7d 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 2d  }.    nPayload -
33dc0 3d 20 6e 3b 0a 20 20 20 20 70 50 61 79 6c 6f 61  = n;.    pPayloa
33dd0 64 20 2b 3d 20 6e 3b 0a 20 20 20 20 70 53 72 63  d += n;.    pSrc
33de0 20 2b 3d 20 6e 3b 0a 20 20 20 20 6e 53 72 63 20   += n;.    nSrc 
33df0 2d 3d 20 6e 3b 0a 20 20 20 20 73 70 61 63 65 4c  -= n;.    spaceL
33e00 65 66 74 20 2d 3d 20 6e 3b 0a 20 20 20 20 69 66  eft -= n;.    if
33e10 28 20 6e 53 72 63 3d 3d 30 20 29 7b 0a 20 20 20  ( nSrc==0 ){.   
33e20 20 20 20 6e 53 72 63 20 3d 20 6e 44 61 74 61 3b     nSrc = nData;
33e30 0a 20 20 20 20 20 20 70 53 72 63 20 3d 20 70 44  .      pSrc = pD
33e40 61 74 61 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ata;.    }.  }. 
33e50 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 6f   releasePage(pTo
33e60 52 65 6c 65 61 73 65 29 3b 0a 20 20 72 65 74 75  Release);.  retu
33e70 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
33e80 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74 68  ./*.** Remove th
33e90 65 20 69 2d 74 68 20 63 65 6c 6c 20 66 72 6f 6d  e i-th cell from
33ea0 20 70 50 61 67 65 2e 20 20 54 68 69 73 20 72 6f   pPage.  This ro
33eb0 75 74 69 6e 65 20 65 66 66 65 63 74 73 20 70 50  utine effects pP
33ec0 61 67 65 20 6f 6e 6c 79 2e 0a 2a 2a 20 54 68 65  age only..** The
33ed0 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 73   cell content is
33ee0 20 6e 6f 74 20 66 72 65 65 64 20 6f 72 20 64 65   not freed or de
33ef0 61 6c 6c 6f 63 61 74 65 64 2e 20 20 49 74 20 69  allocated.  It i
33f00 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 0a 2a  s assumed that.*
33f10 2a 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  * the cell conte
33f20 6e 74 20 68 61 73 20 62 65 65 6e 20 63 6f 70 69  nt has been copi
33f30 65 64 20 73 6f 6d 65 70 6c 61 63 65 20 65 6c 73  ed someplace els
33f40 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  e.  This routine
33f50 20 6a 75 73 74 0a 2a 2a 20 72 65 6d 6f 76 65 73   just.** removes
33f60 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 74   the reference t
33f70 6f 20 74 68 65 20 63 65 6c 6c 20 66 72 6f 6d 20  o the cell from 
33f80 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 22 73 7a  pPage..**.** "sz
33f90 22 20 6d 75 73 74 20 62 65 20 74 68 65 20 6e 75  " must be the nu
33fa0 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e  mber of bytes in
33fb0 20 74 68 65 20 63 65 6c 6c 2e 0a 2a 2f 0a 73 74   the cell..*/.st
33fc0 61 74 69 63 20 76 6f 69 64 20 64 72 6f 70 43 65  atic void dropCe
33fd0 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ll(MemPage *pPag
33fe0 65 2c 20 69 6e 74 20 69 64 78 2c 20 69 6e 74 20  e, int idx, int 
33ff0 73 7a 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20  sz, int *pRC){. 
34000 20 75 33 32 20 70 63 3b 20 20 20 20 20 20 20 20   u32 pc;        
34010 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 63 65   /* Offset to ce
34020 6c 6c 20 63 6f 6e 74 65 6e 74 20 6f 66 20 63 65  ll content of ce
34030 6c 6c 20 62 65 69 6e 67 20 64 65 6c 65 74 65 64  ll being deleted
34040 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b 20   */.  u8 *data; 
34050 20 20 20 20 20 20 2f 2a 20 70 50 61 67 65 2d 3e        /* pPage->
34060 61 44 61 74 61 20 2a 2f 0a 20 20 75 38 20 2a 70  aData */.  u8 *p
34070 74 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 55 73  tr;        /* Us
34080 65 64 20 74 6f 20 6d 6f 76 65 20 62 79 74 65 73  ed to move bytes
34090 20 61 72 6f 75 6e 64 20 77 69 74 68 69 6e 20 64   around within d
340a0 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 72  ata[] */.  int r
340b0 63 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  c;         /* Th
340c0 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  e return code */
340d0 0a 20 20 69 6e 74 20 68 64 72 3b 20 20 20 20 20  .  int hdr;     
340e0 20 20 20 2f 2a 20 42 65 67 69 6e 6e 69 6e 67 20     /* Beginning 
340f0 6f 66 20 74 68 65 20 68 65 61 64 65 72 2e 20 20  of the header.  
34100 30 20 6d 6f 73 74 20 70 61 67 65 73 2e 20 20 31  0 most pages.  1
34110 30 30 20 70 61 67 65 20 31 20 2a 2f 0a 0a 20 20  00 page 1 */..  
34120 69 66 28 20 2a 70 52 43 20 29 20 72 65 74 75 72  if( *pRC ) retur
34130 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69 64  n;..  assert( id
34140 78 3e 3d 30 20 26 26 20 69 64 78 3c 70 50 61 67  x>=0 && idx<pPag
34150 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73  e->nCell );.  as
34160 73 65 72 74 28 20 43 4f 52 52 55 50 54 5f 44 42  sert( CORRUPT_DB
34170 20 7c 7c 20 73 7a 3d 3d 63 65 6c 6c 53 69 7a 65   || sz==cellSize
34180 28 70 50 61 67 65 2c 20 69 64 78 29 20 29 3b 0a  (pPage, idx) );.
34190 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
341a0 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
341b0 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
341c0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
341d0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
341e0 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
341f0 74 65 78 29 20 29 3b 0a 20 20 64 61 74 61 20 3d  tex) );.  data =
34200 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20   pPage->aData;. 
34210 20 70 74 72 20 3d 20 26 70 50 61 67 65 2d 3e 61   ptr = &pPage->a
34220 43 65 6c 6c 49 64 78 5b 32 2a 69 64 78 5d 3b 0a  CellIdx[2*idx];.
34230 20 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 28    pc = get2byte(
34240 70 74 72 29 3b 0a 20 20 68 64 72 20 3d 20 70 50  ptr);.  hdr = pP
34250 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a  age->hdrOffset;.
34260 20 20 74 65 73 74 63 61 73 65 28 20 70 63 3d 3d    testcase( pc==
34270 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
34280 64 72 2b 35 5d 29 20 29 3b 0a 20 20 74 65 73 74  dr+5]) );.  test
34290 63 61 73 65 28 20 70 63 2b 73 7a 3d 3d 70 50 61  case( pc+sz==pPa
342a0 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
342b0 69 7a 65 20 29 3b 0a 20 20 69 66 28 20 70 63 20  ize );.  if( pc 
342c0 3c 20 28 75 33 32 29 67 65 74 32 62 79 74 65 28  < (u32)get2byte(
342d0 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 20 7c 7c  &data[hdr+5]) ||
342e0 20 70 63 2b 73 7a 20 3e 20 70 50 61 67 65 2d 3e   pc+sz > pPage->
342f0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
34300 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 53 51  ){.    *pRC = SQ
34310 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
34320 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  T;.    return;. 
34330 20 7d 0a 20 20 72 63 20 3d 20 66 72 65 65 53 70   }.  rc = freeSp
34340 61 63 65 28 70 50 61 67 65 2c 20 70 63 2c 20 73  ace(pPage, pc, s
34350 7a 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a  z);.  if( rc ){.
34360 20 20 20 20 2a 70 52 43 20 3d 20 72 63 3b 0a 20      *pRC = rc;. 
34370 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
34380 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 2d 3b   pPage->nCell--;
34390 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 43  .  if( pPage->nC
343a0 65 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 6d 65  ell==0 ){.    me
343b0 6d 73 65 74 28 26 64 61 74 61 5b 68 64 72 2b 31  mset(&data[hdr+1
343c0 5d 2c 20 30 2c 20 34 29 3b 0a 20 20 20 20 64 61  ], 0, 4);.    da
343d0 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a 20  ta[hdr+7] = 0;. 
343e0 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74     put2byte(&dat
343f0 61 5b 68 64 72 2b 35 5d 2c 20 70 50 61 67 65 2d  a[hdr+5], pPage-
34400 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
34410 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 46  );.    pPage->nF
34420 72 65 65 20 3d 20 70 50 61 67 65 2d 3e 70 42 74  ree = pPage->pBt
34430 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 70  ->usableSize - p
34440 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 0a  Page->hdrOffset.
34450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34460 20 20 20 20 20 20 20 2d 20 70 50 61 67 65 2d 3e         - pPage->
34470 63 68 69 6c 64 50 74 72 53 69 7a 65 20 2d 20 38  childPtrSize - 8
34480 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6d  ;.  }else{.    m
34490 65 6d 6d 6f 76 65 28 70 74 72 2c 20 70 74 72 2b  emmove(ptr, ptr+
344a0 32 2c 20 32 2a 28 70 50 61 67 65 2d 3e 6e 43 65  2, 2*(pPage->nCe
344b0 6c 6c 20 2d 20 69 64 78 29 29 3b 0a 20 20 20 20  ll - idx));.    
344c0 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  put2byte(&data[h
344d0 64 72 2b 33 5d 2c 20 70 50 61 67 65 2d 3e 6e 43  dr+3], pPage->nC
344e0 65 6c 6c 29 3b 0a 20 20 20 20 70 50 61 67 65 2d  ell);.    pPage-
344f0 3e 6e 46 72 65 65 20 2b 3d 20 32 3b 0a 20 20 7d  >nFree += 2;.  }
34500 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74  .}../*.** Insert
34510 20 61 20 6e 65 77 20 63 65 6c 6c 20 6f 6e 20 70   a new cell on p
34520 50 61 67 65 20 61 74 20 63 65 6c 6c 20 69 6e 64  Page at cell ind
34530 65 78 20 22 69 22 2e 20 20 70 43 65 6c 6c 20 70  ex "i".  pCell p
34540 6f 69 6e 74 73 20 74 6f 20 74 68 65 0a 2a 2a 20  oints to the.** 
34550 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 63  content of the c
34560 65 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ell..**.** If th
34570 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 77  e cell content w
34580 69 6c 6c 20 66 69 74 20 6f 6e 20 74 68 65 20 70  ill fit on the p
34590 61 67 65 2c 20 74 68 65 6e 20 70 75 74 20 69 74  age, then put it
345a0 20 74 68 65 72 65 2e 20 20 49 66 20 69 74 0a 2a   there.  If it.*
345b0 2a 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74 2c 20  * will not fit, 
345c0 74 68 65 6e 20 6d 61 6b 65 20 61 20 63 6f 70 79  then make a copy
345d0 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e   of the cell con
345e0 74 65 6e 74 20 69 6e 74 6f 20 70 54 65 6d 70 20  tent into pTemp 
345f0 69 66 0a 2a 2a 20 70 54 65 6d 70 20 69 73 20 6e  if.** pTemp is n
34600 6f 74 20 6e 75 6c 6c 2e 20 20 52 65 67 61 72 64  ot null.  Regard
34610 6c 65 73 73 20 6f 66 20 70 54 65 6d 70 2c 20 61  less of pTemp, a
34620 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 65 6e  llocate a new en
34630 74 72 79 0a 2a 2a 20 69 6e 20 70 50 61 67 65 2d  try.** in pPage-
34640 3e 61 70 4f 76 66 6c 5b 5d 20 61 6e 64 20 6d 61  >apOvfl[] and ma
34650 6b 65 20 69 74 20 70 6f 69 6e 74 20 74 6f 20 74  ke it point to t
34660 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
34670 28 65 69 74 68 65 72 0a 2a 2a 20 69 6e 20 70 54  (either.** in pT
34680 65 6d 70 20 6f 72 20 74 68 65 20 6f 72 69 67 69  emp or the origi
34690 6e 61 6c 20 70 43 65 6c 6c 29 20 61 6e 64 20 61  nal pCell) and a
346a0 6c 73 6f 20 72 65 63 6f 72 64 20 69 74 73 20 69  lso record its i
346b0 6e 64 65 78 2e 20 0a 2a 2a 20 41 6c 6c 6f 63 61  ndex. .** Alloca
346c0 74 69 6e 67 20 61 20 6e 65 77 20 65 6e 74 72 79  ting a new entry
346d0 20 69 6e 20 70 50 61 67 65 2d 3e 61 43 65 6c 6c   in pPage->aCell
346e0 5b 5d 20 69 6d 70 6c 69 65 73 20 74 68 61 74 20  [] implies that 
346f0 0a 2a 2a 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72  .** pPage->nOver
34700 66 6c 6f 77 20 69 73 20 69 6e 63 72 65 6d 65 6e  flow is incremen
34710 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ted..*/.static v
34720 6f 69 64 20 69 6e 73 65 72 74 43 65 6c 6c 28 0a  oid insertCell(.
34730 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
34740 2c 20 20 20 2f 2a 20 50 61 67 65 20 69 6e 74 6f  ,   /* Page into
34750 20 77 68 69 63 68 20 77 65 20 61 72 65 20 63 6f   which we are co
34760 70 79 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 69  pying */.  int i
34770 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
34780 4e 65 77 20 63 65 6c 6c 20 62 65 63 6f 6d 65 73  New cell becomes
34790 20 74 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 6f   the i-th cell o
347a0 66 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20  f the page */.  
347b0 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20  u8 *pCell,      
347c0 20 20 2f 2a 20 43 6f 6e 74 65 6e 74 20 6f 66 20    /* Content of 
347d0 74 68 65 20 6e 65 77 20 63 65 6c 6c 20 2a 2f 0a  the new cell */.
347e0 20 20 69 6e 74 20 73 7a 2c 20 20 20 20 20 20 20    int sz,       
347f0 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20      /* Bytes of 
34800 63 6f 6e 74 65 6e 74 20 69 6e 20 70 43 65 6c 6c  content in pCell
34810 20 2a 2f 0a 20 20 75 38 20 2a 70 54 65 6d 70 2c   */.  u8 *pTemp,
34820 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20          /* Temp 
34830 73 74 6f 72 61 67 65 20 73 70 61 63 65 20 66 6f  storage space fo
34840 72 20 70 43 65 6c 6c 2c 20 69 66 20 6e 65 65 64  r pCell, if need
34850 65 64 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 43 68  ed */.  Pgno iCh
34860 69 6c 64 2c 20 20 20 20 20 20 2f 2a 20 49 66 20  ild,      /* If 
34870 6e 6f 6e 2d 7a 65 72 6f 2c 20 72 65 70 6c 61 63  non-zero, replac
34880 65 20 66 69 72 73 74 20 34 20 62 79 74 65 73 20  e first 4 bytes 
34890 77 69 74 68 20 74 68 69 73 20 76 61 6c 75 65 20  with this value 
348a0 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 43 20 20 20  */.  int *pRC   
348b0 20 20 20 20 20 20 20 2f 2a 20 52 65 61 64 20 61         /* Read a
348c0 6e 64 20 77 72 69 74 65 20 72 65 74 75 72 6e 20  nd write return 
348d0 63 6f 64 65 20 66 72 6f 6d 20 68 65 72 65 20 2a  code from here *
348e0 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 64 78 20 3d  /.){.  int idx =
348f0 20 30 3b 20 20 20 20 20 20 2f 2a 20 57 68 65 72   0;      /* Wher
34900 65 20 74 6f 20 77 72 69 74 65 20 6e 65 77 20 63  e to write new c
34910 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 6e 20 64  ell content in d
34920 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6a  ata[] */.  int j
34930 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
34940 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
34950 20 20 75 38 20 2a 64 61 74 61 3b 20 20 20 20 20    u8 *data;     
34960 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 74 65      /* The conte
34970 6e 74 20 6f 66 20 74 68 65 20 77 68 6f 6c 65 20  nt of the whole 
34980 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 70 49  page */.  u8 *pI
34990 6e 73 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ns;         /* T
349a0 68 65 20 70 6f 69 6e 74 20 69 6e 20 70 50 61 67  he point in pPag
349b0 65 2d 3e 61 43 65 6c 6c 49 64 78 5b 5d 20 77 68  e->aCellIdx[] wh
349c0 65 72 65 20 6e 6f 20 63 65 6c 6c 20 69 6e 73 65  ere no cell inse
349d0 72 74 65 64 20 2a 2f 0a 0a 20 20 69 66 28 20 2a  rted */..  if( *
349e0 70 52 43 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20  pRC ) return;.. 
349f0 20 61 73 73 65 72 74 28 20 69 3e 3d 30 20 26 26   assert( i>=0 &&
34a00 20 69 3c 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c   i<=pPage->nCell
34a10 2b 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f  +pPage->nOverflo
34a20 77 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 4d  w );.  assert( M
34a30 58 5f 43 45 4c 4c 28 70 50 61 67 65 2d 3e 70 42  X_CELL(pPage->pB
34a40 74 29 3c 3d 31 30 39 32 31 20 29 3b 0a 20 20 61  t)<=10921 );.  a
34a50 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43  ssert( pPage->nC
34a60 65 6c 6c 3c 3d 4d 58 5f 43 45 4c 4c 28 70 50 61  ell<=MX_CELL(pPa
34a70 67 65 2d 3e 70 42 74 29 20 7c 7c 20 43 4f 52 52  ge->pBt) || CORR
34a80 55 50 54 5f 44 42 20 29 3b 0a 20 20 61 73 73 65  UPT_DB );.  asse
34a90 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72  rt( pPage->nOver
34aa0 66 6c 6f 77 3c 3d 41 72 72 61 79 53 69 7a 65 28  flow<=ArraySize(
34ab0 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c 29 20 29  pPage->apOvfl) )
34ac0 3b 0a 20 20 61 73 73 65 72 74 28 20 41 72 72 61  ;.  assert( Arra
34ad0 79 53 69 7a 65 28 70 50 61 67 65 2d 3e 61 70 4f  ySize(pPage->apO
34ae0 76 66 6c 29 3d 3d 41 72 72 61 79 53 69 7a 65 28  vfl)==ArraySize(
34af0 70 50 61 67 65 2d 3e 61 69 4f 76 66 6c 29 20 29  pPage->aiOvfl) )
34b00 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
34b10 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
34b20 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
34b30 29 20 29 3b 0a 20 20 2f 2a 20 54 68 65 20 63 65  ) );.  /* The ce
34b40 6c 6c 20 73 68 6f 75 6c 64 20 6e 6f 72 6d 61 6c  ll should normal
34b50 6c 79 20 62 65 20 73 69 7a 65 64 20 63 6f 72 72  ly be sized corr
34b60 65 63 74 6c 79 2e 20 20 48 6f 77 65 76 65 72 2c  ectly.  However,
34b70 20 77 68 65 6e 20 6d 6f 76 69 6e 67 20 61 0a 20   when moving a. 
34b80 20 2a 2a 20 6d 61 6c 66 6f 72 6d 65 64 20 63 65   ** malformed ce
34b90 6c 6c 20 66 72 6f 6d 20 61 20 6c 65 61 66 20 70  ll from a leaf p
34ba0 61 67 65 20 74 6f 20 61 6e 20 69 6e 74 65 72 69  age to an interi
34bb0 6f 72 20 70 61 67 65 2c 20 69 66 20 74 68 65 20  or page, if the 
34bc0 63 65 6c 6c 20 73 69 7a 65 0a 20 20 2a 2a 20 77  cell size.  ** w
34bd0 61 6e 74 65 64 20 74 6f 20 62 65 20 6c 65 73 73  anted to be less
34be0 20 74 68 61 6e 20 34 20 62 75 74 20 67 6f 74 20   than 4 but got 
34bf0 72 6f 75 6e 64 65 64 20 75 70 20 74 6f 20 34 20  rounded up to 4 
34c00 6f 6e 20 74 68 65 20 6c 65 61 66 2c 20 74 68 65  on the leaf, the
34c10 6e 20 73 69 7a 65 0a 20 20 2a 2a 20 6d 69 67 68  n size.  ** migh
34c20 74 20 62 65 20 6c 65 73 73 20 74 68 61 6e 20 38  t be less than 8
34c30 20 28 6c 65 61 66 2d 73 69 7a 65 20 2b 20 70 6f   (leaf-size + po
34c40 69 6e 74 65 72 29 20 6f 6e 20 74 68 65 20 69 6e  inter) on the in
34c50 74 65 72 69 6f 72 20 6e 6f 64 65 2e 20 20 48 65  terior node.  He
34c60 6e 63 65 0a 20 20 2a 2a 20 74 68 65 20 74 65 72  nce.  ** the ter
34c70 6d 20 61 66 74 65 72 20 74 68 65 20 7c 7c 20 69  m after the || i
34c80 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  n the following 
34c90 61 73 73 65 72 74 28 29 2e 20 2a 2f 0a 20 20 61  assert(). */.  a
34ca0 73 73 65 72 74 28 20 73 7a 3d 3d 70 50 61 67 65  ssert( sz==pPage
34cb0 2d 3e 78 43 65 6c 6c 53 69 7a 65 28 70 50 61 67  ->xCellSize(pPag
34cc0 65 2c 20 70 43 65 6c 6c 29 20 7c 7c 20 28 73 7a  e, pCell) || (sz
34cd0 3d 3d 38 20 26 26 20 69 43 68 69 6c 64 3e 30 29  ==8 && iChild>0)
34ce0 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d   );.  if( pPage-
34cf0 3e 6e 4f 76 65 72 66 6c 6f 77 20 7c 7c 20 73 7a  >nOverflow || sz
34d00 2b 32 3e 70 50 61 67 65 2d 3e 6e 46 72 65 65 20  +2>pPage->nFree 
34d10 29 7b 0a 20 20 20 20 69 66 28 20 70 54 65 6d 70  ){.    if( pTemp
34d20 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79   ){.      memcpy
34d30 28 70 54 65 6d 70 2c 20 70 43 65 6c 6c 2c 20 73  (pTemp, pCell, s
34d40 7a 29 3b 0a 20 20 20 20 20 20 70 43 65 6c 6c 20  z);.      pCell 
34d50 3d 20 70 54 65 6d 70 3b 0a 20 20 20 20 7d 0a 20  = pTemp;.    }. 
34d60 20 20 20 69 66 28 20 69 43 68 69 6c 64 20 29 7b     if( iChild ){
34d70 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28  .      put4byte(
34d80 70 43 65 6c 6c 2c 20 69 43 68 69 6c 64 29 3b 0a  pCell, iChild);.
34d90 20 20 20 20 7d 0a 20 20 20 20 6a 20 3d 20 70 50      }.    j = pP
34da0 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2b 2b  age->nOverflow++
34db0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c  ;.    assert( j<
34dc0 28 69 6e 74 29 28 73 69 7a 65 6f 66 28 70 50 61  (int)(sizeof(pPa
34dd0 67 65 2d 3e 61 70 4f 76 66 6c 29 2f 73 69 7a 65  ge->apOvfl)/size
34de0 6f 66 28 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c  of(pPage->apOvfl
34df0 5b 30 5d 29 29 20 29 3b 0a 20 20 20 20 70 50 61  [0])) );.    pPa
34e00 67 65 2d 3e 61 70 4f 76 66 6c 5b 6a 5d 20 3d 20  ge->apOvfl[j] = 
34e10 70 43 65 6c 6c 3b 0a 20 20 20 20 70 50 61 67 65  pCell;.    pPage
34e20 2d 3e 61 69 4f 76 66 6c 5b 6a 5d 20 3d 20 28 75  ->aiOvfl[j] = (u
34e30 31 36 29 69 3b 0a 0a 20 20 20 20 2f 2a 20 57 68  16)i;..    /* Wh
34e40 65 6e 20 6d 75 6c 74 69 70 6c 65 20 6f 76 65 72  en multiple over
34e50 66 6c 6f 77 73 20 6f 63 63 75 72 2c 20 74 68 65  flows occur, the
34e60 79 20 61 72 65 20 61 6c 77 61 79 73 20 73 65 71  y are always seq
34e70 75 65 6e 74 69 61 6c 20 61 6e 64 20 69 6e 0a 20  uential and in. 
34e80 20 20 20 2a 2a 20 73 6f 72 74 65 64 20 6f 72 64     ** sorted ord
34e90 65 72 2e 20 20 54 68 69 73 20 69 6e 76 61 72 69  er.  This invari
34ea0 61 6e 74 73 20 61 72 69 73 65 20 62 65 63 61 75  ants arise becau
34eb0 73 65 20 6d 75 6c 74 69 70 6c 65 20 6f 76 65 72  se multiple over
34ec0 66 6c 6f 77 73 20 63 61 6e 0a 20 20 20 20 2a 2a  flows can.    **
34ed0 20 6f 6e 6c 79 20 6f 63 63 75 72 20 77 68 65 6e   only occur when
34ee0 20 69 6e 73 65 72 74 69 6e 67 20 64 69 76 69 64   inserting divid
34ef0 65 72 20 63 65 6c 6c 73 20 69 6e 74 6f 20 74 68  er cells into th
34f00 65 20 70 61 72 65 6e 74 20 70 61 67 65 20 64 75  e parent page du
34f10 72 69 6e 67 0a 20 20 20 20 2a 2a 20 62 61 6c 61  ring.    ** bala
34f20 6e 63 69 6e 67 2c 20 61 6e 64 20 74 68 65 20 64  ncing, and the d
34f30 69 76 69 64 65 72 73 20 61 72 65 20 61 64 6a 61  ividers are adja
34f40 63 65 6e 74 20 61 6e 64 20 73 6f 72 74 65 64 2e  cent and sorted.
34f50 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  .    */.    asse
34f60 72 74 28 20 6a 3d 3d 30 20 7c 7c 20 70 50 61 67  rt( j==0 || pPag
34f70 65 2d 3e 61 69 4f 76 66 6c 5b 6a 2d 31 5d 3c 28  e->aiOvfl[j-1]<(
34f80 75 31 36 29 69 20 29 3b 20 2f 2a 20 4f 76 65 72  u16)i ); /* Over
34f90 66 6c 6f 77 73 20 69 6e 20 73 6f 72 74 65 64 20  flows in sorted 
34fa0 6f 72 64 65 72 20 2a 2f 0a 20 20 20 20 61 73 73  order */.    ass
34fb0 65 72 74 28 20 6a 3d 3d 30 20 7c 7c 20 69 3d 3d  ert( j==0 || i==
34fc0 70 50 61 67 65 2d 3e 61 69 4f 76 66 6c 5b 6a 2d  pPage->aiOvfl[j-
34fd0 31 5d 2b 31 20 29 3b 20 20 20 2f 2a 20 4f 76 65  1]+1 );   /* Ove
34fe0 72 66 6c 6f 77 73 20 61 72 65 20 73 65 71 75 65  rflows are seque
34ff0 6e 74 69 61 6c 20 2a 2f 0a 20 20 7d 65 6c 73 65  ntial */.  }else
35000 7b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73  {.    int rc = s
35010 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
35020 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
35030 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
35040 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
35050 20 2a 70 52 43 20 3d 20 72 63 3b 0a 20 20 20 20   *pRC = rc;.    
35060 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a    return;.    }.
35070 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
35080 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
35090 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
350a0 67 65 29 20 29 3b 0a 20 20 20 20 64 61 74 61 20  ge) );.    data 
350b0 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a  = pPage->aData;.
350c0 20 20 20 20 61 73 73 65 72 74 28 20 26 64 61 74      assert( &dat
350d0 61 5b 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66  a[pPage->cellOff
350e0 73 65 74 5d 3d 3d 70 50 61 67 65 2d 3e 61 43 65  set]==pPage->aCe
350f0 6c 6c 49 64 78 20 29 3b 0a 20 20 20 20 72 63 20  llIdx );.    rc 
35100 3d 20 61 6c 6c 6f 63 61 74 65 53 70 61 63 65 28  = allocateSpace(
35110 70 50 61 67 65 2c 20 73 7a 2c 20 26 69 64 78 29  pPage, sz, &idx)
35120 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 20  ;.    if( rc ){ 
35130 2a 70 52 43 20 3d 20 72 63 3b 20 72 65 74 75 72  *pRC = rc; retur
35140 6e 3b 20 7d 0a 20 20 20 20 2f 2a 20 54 68 65 20  n; }.    /* The 
35150 61 6c 6c 6f 63 61 74 65 53 70 61 63 65 28 29 20  allocateSpace() 
35160 72 6f 75 74 69 6e 65 20 67 75 61 72 61 6e 74 65  routine guarante
35170 65 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  es the following
35180 20 70 72 6f 70 65 72 74 69 65 73 0a 20 20 20 20   properties.    
35190 2a 2a 20 69 66 20 69 74 20 72 65 74 75 72 6e 73  ** if it returns
351a0 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 2a 2f   successfully */
351b0 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 64 78  .    assert( idx
351c0 20 3e 3d 20 30 20 29 3b 0a 20 20 20 20 61 73 73   >= 0 );.    ass
351d0 65 72 74 28 20 69 64 78 20 3e 3d 20 70 50 61 67  ert( idx >= pPag
351e0 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 2b 32 2a  e->cellOffset+2*
351f0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b 32 20 7c  pPage->nCell+2 |
35200 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a  | CORRUPT_DB );.
35210 20 20 20 20 61 73 73 65 72 74 28 20 69 64 78 2b      assert( idx+
35220 73 7a 20 3c 3d 20 28 69 6e 74 29 70 50 61 67 65  sz <= (int)pPage
35230 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
35240 65 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  e );.    pPage->
35250 6e 46 72 65 65 20 2d 3d 20 28 75 31 36 29 28 32  nFree -= (u16)(2
35260 20 2b 20 73 7a 29 3b 0a 20 20 20 20 6d 65 6d 63   + sz);.    memc
35270 70 79 28 26 64 61 74 61 5b 69 64 78 5d 2c 20 70  py(&data[idx], p
35280 43 65 6c 6c 2c 20 73 7a 29 3b 0a 20 20 20 20 69  Cell, sz);.    i
35290 66 28 20 69 43 68 69 6c 64 20 29 7b 0a 20 20 20  f( iChild ){.   
352a0 20 20 20 70 75 74 34 62 79 74 65 28 26 64 61 74     put4byte(&dat
352b0 61 5b 69 64 78 5d 2c 20 69 43 68 69 6c 64 29 3b  a[idx], iChild);
352c0 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 6e 73 20  .    }.    pIns 
352d0 3d 20 70 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64  = pPage->aCellId
352e0 78 20 2b 20 69 2a 32 3b 0a 20 20 20 20 6d 65 6d  x + i*2;.    mem
352f0 6d 6f 76 65 28 70 49 6e 73 2b 32 2c 20 70 49 6e  move(pIns+2, pIn
35300 73 2c 20 32 2a 28 70 50 61 67 65 2d 3e 6e 43 65  s, 2*(pPage->nCe
35310 6c 6c 20 2d 20 69 29 29 3b 0a 20 20 20 20 70 75  ll - i));.    pu
35320 74 32 62 79 74 65 28 70 49 6e 73 2c 20 69 64 78  t2byte(pIns, idx
35330 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 43  );.    pPage->nC
35340 65 6c 6c 2b 2b 3b 0a 20 20 20 20 2f 2a 20 69 6e  ell++;.    /* in
35350 63 72 65 6d 65 6e 74 20 74 68 65 20 63 65 6c 6c  crement the cell
35360 20 63 6f 75 6e 74 20 2a 2f 0a 20 20 20 20 69 66   count */.    if
35370 28 20 28 2b 2b 64 61 74 61 5b 70 50 61 67 65 2d  ( (++data[pPage-
35380 3e 68 64 72 4f 66 66 73 65 74 2b 34 5d 29 3d 3d  >hdrOffset+4])==
35390 30 20 29 20 64 61 74 61 5b 70 50 61 67 65 2d 3e  0 ) data[pPage->
353a0 68 64 72 4f 66 66 73 65 74 2b 33 5d 2b 2b 3b 0a  hdrOffset+3]++;.
353b0 20 20 20 20 61 73 73 65 72 74 28 20 67 65 74 32      assert( get2
353c0 62 79 74 65 28 26 64 61 74 61 5b 70 50 61 67 65  byte(&data[pPage
353d0 2d 3e 68 64 72 4f 66 66 73 65 74 2b 33 5d 29 3d  ->hdrOffset+3])=
353e0 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b  =pPage->nCell );
353f0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
35400 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
35410 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 70      if( pPage->p
35420 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
35430 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63  {.      /* The c
35440 65 6c 6c 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20  ell may contain 
35450 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20  a pointer to an 
35460 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20 49  overflow page. I
35470 66 20 73 6f 2c 20 77 72 69 74 65 0a 20 20 20 20  f so, write.    
35480 20 20 2a 2a 20 74 68 65 20 65 6e 74 72 79 20 66    ** the entry f
35490 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  or the overflow 
354a0 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20 70 6f  page into the po
354b0 69 6e 74 65 72 20 6d 61 70 2e 0a 20 20 20 20 20  inter map..     
354c0 20 2a 2f 0a 20 20 20 20 20 20 70 74 72 6d 61 70   */.      ptrmap
354d0 50 75 74 4f 76 66 6c 50 74 72 28 70 50 61 67 65  PutOvflPtr(pPage
354e0 2c 20 70 43 65 6c 6c 2c 20 70 52 43 29 3b 0a 20  , pCell, pRC);. 
354f0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
35500 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 43 65 6c 6c 41  }../*.** A CellA
35510 72 72 61 79 20 6f 62 6a 65 63 74 20 63 6f 6e 74  rray object cont
35520 61 69 6e 73 20 61 20 63 61 63 68 65 20 6f 66 20  ains a cache of 
35530 70 6f 69 6e 74 65 72 73 20 61 6e 64 20 73 69 7a  pointers and siz
35540 65 73 20 66 6f 72 20 61 0a 2a 2a 20 63 6f 6e 73  es for a.** cons
35550 65 63 75 74 69 76 65 20 73 65 71 75 65 6e 63 65  ecutive sequence
35560 20 6f 66 20 63 65 6c 6c 73 20 74 68 61 74 20 6d   of cells that m
35570 69 67 68 74 20 62 65 20 68 65 6c 64 20 6d 75 6c  ight be held mul
35580 74 69 70 6c 65 20 70 61 67 65 73 2e 0a 2a 2f 0a  tiple pages..*/.
35590 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 43  typedef struct C
355a0 65 6c 6c 41 72 72 61 79 20 43 65 6c 6c 41 72 72  ellArray CellArr
355b0 61 79 3b 0a 73 74 72 75 63 74 20 43 65 6c 6c 41  ay;.struct CellA
355c0 72 72 61 79 20 7b 0a 20 20 69 6e 74 20 6e 43 65  rray {.  int nCe
355d0 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
355e0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 65   /* Number of ce
355f0 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20  lls in apCell[] 
35600 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 52  */.  MemPage *pR
35610 65 66 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ef;          /* 
35620 52 65 66 65 72 65 6e 63 65 20 70 61 67 65 20 2a  Reference page *
35630 2f 0a 20 20 75 38 20 2a 2a 61 70 43 65 6c 6c 3b  /.  u8 **apCell;
35640 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
35650 6c 6c 20 63 65 6c 6c 73 20 62 65 67 69 6e 20 62  ll cells begin b
35660 61 6c 61 6e 63 65 64 20 2a 2f 0a 20 20 75 31 36  alanced */.  u16
35670 20 2a 73 7a 43 65 6c 6c 3b 20 20 20 20 20 20 20   *szCell;       
35680 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 73 69       /* Local si
35690 7a 65 20 6f 66 20 61 6c 6c 20 63 65 6c 6c 73 20  ze of all cells 
356a0 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 2a 2f 0a 7d  in apCell[] */.}
356b0 3b 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75  ;../*.** Make su
356c0 72 65 20 74 68 65 20 63 65 6c 6c 20 73 69 7a 65  re the cell size
356d0 73 20 61 74 20 69 64 78 2c 20 69 64 78 2b 31 2c  s at idx, idx+1,
356e0 20 2e 2e 2e 2c 20 69 64 78 2b 4e 2d 31 20 68 61   ..., idx+N-1 ha
356f0 76 65 20 62 65 65 6e 0a 2a 2a 20 63 6f 6d 70 75  ve been.** compu
35700 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ted..*/.static v
35710 6f 69 64 20 70 6f 70 75 6c 61 74 65 43 65 6c 6c  oid populateCell
35720 43 61 63 68 65 28 43 65 6c 6c 41 72 72 61 79 20  Cache(CellArray 
35730 2a 70 2c 20 69 6e 74 20 69 64 78 2c 20 69 6e 74  *p, int idx, int
35740 20 4e 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69   N){.  assert( i
35750 64 78 3e 3d 30 20 26 26 20 69 64 78 2b 4e 3c 3d  dx>=0 && idx+N<=
35760 70 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 77 68  p->nCell );.  wh
35770 69 6c 65 28 20 4e 3e 30 20 29 7b 0a 20 20 20 20  ile( N>0 ){.    
35780 61 73 73 65 72 74 28 20 70 2d 3e 61 70 43 65 6c  assert( p->apCel
35790 6c 5b 69 64 78 5d 21 3d 30 20 29 3b 0a 20 20 20  l[idx]!=0 );.   
357a0 20 69 66 28 20 70 2d 3e 73 7a 43 65 6c 6c 5b 69   if( p->szCell[i
357b0 64 78 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  dx]==0 ){.      
357c0 70 2d 3e 73 7a 43 65 6c 6c 5b 69 64 78 5d 20 3d  p->szCell[idx] =
357d0 20 70 2d 3e 70 52 65 66 2d 3e 78 43 65 6c 6c 53   p->pRef->xCellS
357e0 69 7a 65 28 70 2d 3e 70 52 65 66 2c 20 70 2d 3e  ize(p->pRef, p->
357f0 61 70 43 65 6c 6c 5b 69 64 78 5d 29 3b 0a 20 20  apCell[idx]);.  
35800 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
35810 73 73 65 72 74 28 20 43 4f 52 52 55 50 54 5f 44  ssert( CORRUPT_D
35820 42 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20  B ||.           
35830 20 20 20 70 2d 3e 73 7a 43 65 6c 6c 5b 69 64 78     p->szCell[idx
35840 5d 3d 3d 70 2d 3e 70 52 65 66 2d 3e 78 43 65 6c  ]==p->pRef->xCel
35850 6c 53 69 7a 65 28 70 2d 3e 70 52 65 66 2c 20 70  lSize(p->pRef, p
35860 2d 3e 61 70 43 65 6c 6c 5b 69 64 78 5d 29 20 29  ->apCell[idx]) )
35870 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 64 78 2b  ;.    }.    idx+
35880 2b 3b 0a 20 20 20 20 4e 2d 2d 3b 0a 20 20 7d 0a  +;.    N--;.  }.
35890 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
358a0 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
358b0 4e 74 68 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74  Nth element of t
358c0 68 65 20 63 65 6c 6c 20 61 72 72 61 79 0a 2a 2f  he cell array.*/
358d0 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e  .static SQLITE_N
358e0 4f 49 4e 4c 49 4e 45 20 75 31 36 20 63 6f 6d 70  OINLINE u16 comp
358f0 75 74 65 43 65 6c 6c 53 69 7a 65 28 43 65 6c 6c  uteCellSize(Cell
35900 41 72 72 61 79 20 2a 70 2c 20 69 6e 74 20 4e 29  Array *p, int N)
35910 7b 0a 20 20 61 73 73 65 72 74 28 20 4e 3e 3d 30  {.  assert( N>=0
35920 20 26 26 20 4e 3c 70 2d 3e 6e 43 65 6c 6c 20 29   && N<p->nCell )
35930 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 73  ;.  assert( p->s
35940 7a 43 65 6c 6c 5b 4e 5d 3d 3d 30 20 29 3b 0a 20  zCell[N]==0 );. 
35950 20 70 2d 3e 73 7a 43 65 6c 6c 5b 4e 5d 20 3d 20   p->szCell[N] = 
35960 70 2d 3e 70 52 65 66 2d 3e 78 43 65 6c 6c 53 69  p->pRef->xCellSi
35970 7a 65 28 70 2d 3e 70 52 65 66 2c 20 70 2d 3e 61  ze(p->pRef, p->a
35980 70 43 65 6c 6c 5b 4e 5d 29 3b 0a 20 20 72 65 74  pCell[N]);.  ret
35990 75 72 6e 20 70 2d 3e 73 7a 43 65 6c 6c 5b 4e 5d  urn p->szCell[N]
359a0 3b 0a 7d 0a 73 74 61 74 69 63 20 75 31 36 20 63  ;.}.static u16 c
359b0 61 63 68 65 64 43 65 6c 6c 53 69 7a 65 28 43 65  achedCellSize(Ce
359c0 6c 6c 41 72 72 61 79 20 2a 70 2c 20 69 6e 74 20  llArray *p, int 
359d0 4e 29 7b 0a 20 20 61 73 73 65 72 74 28 20 4e 3e  N){.  assert( N>
359e0 3d 30 20 26 26 20 4e 3c 70 2d 3e 6e 43 65 6c 6c  =0 && N<p->nCell
359f0 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 73 7a 43   );.  if( p->szC
35a00 65 6c 6c 5b 4e 5d 20 29 20 72 65 74 75 72 6e 20  ell[N] ) return 
35a10 70 2d 3e 73 7a 43 65 6c 6c 5b 4e 5d 3b 0a 20 20  p->szCell[N];.  
35a20 72 65 74 75 72 6e 20 63 6f 6d 70 75 74 65 43 65  return computeCe
35a30 6c 6c 53 69 7a 65 28 70 2c 20 4e 29 3b 0a 7d 0a  llSize(p, N);.}.
35a40 0a 2f 2a 0a 2a 2a 20 41 72 72 61 79 20 61 70 43  ./*.** Array apC
35a50 65 6c 6c 5b 5d 20 63 6f 6e 74 61 69 6e 73 20 70  ell[] contains p
35a60 6f 69 6e 74 65 72 73 20 74 6f 20 6e 43 65 6c 6c  ointers to nCell
35a70 20 62 2d 74 72 65 65 20 70 61 67 65 20 63 65 6c   b-tree page cel
35a80 6c 73 2e 20 54 68 65 20 0a 2a 2a 20 73 7a 43 65  ls. The .** szCe
35a90 6c 6c 5b 5d 20 61 72 72 61 79 20 63 6f 6e 74 61  ll[] array conta
35aa0 69 6e 73 20 74 68 65 20 73 69 7a 65 20 69 6e 20  ins the size in 
35ab0 62 79 74 65 73 20 6f 66 20 65 61 63 68 20 63 65  bytes of each ce
35ac0 6c 6c 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  ll. This functio
35ad0 6e 0a 2a 2a 20 72 65 70 6c 61 63 65 73 20 74 68  n.** replaces th
35ae0 65 20 63 75 72 72 65 6e 74 20 63 6f 6e 74 65 6e  e current conten
35af0 74 73 20 6f 66 20 70 61 67 65 20 70 50 67 20 77  ts of page pPg w
35b00 69 74 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ith the contents
35b10 20 6f 66 20 74 68 65 20 63 65 6c 6c 0a 2a 2a 20   of the cell.** 
35b20 61 72 72 61 79 2e 0a 2a 2a 0a 2a 2a 20 53 6f 6d  array..**.** Som
35b30 65 20 6f 66 20 74 68 65 20 63 65 6c 6c 73 20 69  e of the cells i
35b40 6e 20 61 70 43 65 6c 6c 5b 5d 20 6d 61 79 20 63  n apCell[] may c
35b50 75 72 72 65 6e 74 6c 79 20 62 65 20 73 74 6f 72  urrently be stor
35b60 65 64 20 69 6e 20 70 50 67 2e 20 54 68 69 73 0a  ed in pPg. This.
35b70 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 77 6f 72 6b  ** function work
35b80 73 20 61 72 6f 75 6e 64 20 70 72 6f 62 6c 65 6d  s around problem
35b90 73 20 63 61 75 73 65 64 20 62 79 20 74 68 69 73  s caused by this
35ba0 20 62 79 20 6d 61 6b 69 6e 67 20 61 20 63 6f 70   by making a cop
35bb0 79 20 6f 66 20 61 6e 79 20 0a 2a 2a 20 73 75 63  y of any .** suc
35bc0 68 20 63 65 6c 6c 73 20 62 65 66 6f 72 65 20 6f  h cells before o
35bd0 76 65 72 77 72 69 74 69 6e 67 20 74 68 65 20 70  verwriting the p
35be0 61 67 65 20 64 61 74 61 2e 0a 2a 2a 0a 2a 2a 20  age data..**.** 
35bf0 54 68 65 20 4d 65 6d 50 61 67 65 2e 6e 46 72 65  The MemPage.nFre
35c00 65 20 66 69 65 6c 64 20 69 73 20 69 6e 76 61 6c  e field is inval
35c10 69 64 61 74 65 64 20 62 79 20 74 68 69 73 20 66  idated by this f
35c20 75 6e 63 74 69 6f 6e 2e 20 49 74 20 69 73 20 74  unction. It is t
35c30 68 65 20 0a 2a 2a 20 72 65 73 70 6f 6e 73 69 62  he .** responsib
35c40 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c  ility of the cal
35c50 6c 65 72 20 74 6f 20 73 65 74 20 69 74 20 63 6f  ler to set it co
35c60 72 72 65 63 74 6c 79 2e 0a 2a 2f 0a 73 74 61 74  rrectly..*/.stat
35c70 69 63 20 69 6e 74 20 72 65 62 75 69 6c 64 50 61  ic int rebuildPa
35c80 67 65 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  ge(.  MemPage *p
35c90 50 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  Pg,             
35ca0 20 20 20 20 20 20 2f 2a 20 45 64 69 74 20 74 68        /* Edit th
35cb0 69 73 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74  is page */.  int
35cc0 20 6e 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20   nCell,         
35cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
35ce0 46 69 6e 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  Final number of 
35cf0 63 65 6c 6c 73 20 6f 6e 20 70 61 67 65 20 2a 2f  cells on page */
35d00 0a 20 20 75 38 20 2a 2a 61 70 43 65 6c 6c 2c 20  .  u8 **apCell, 
35d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35d20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 63     /* Array of c
35d30 65 6c 6c 73 20 2a 2f 0a 20 20 75 31 36 20 2a 73  ells */.  u16 *s
35d40 7a 43 65 6c 6c 20 20 20 20 20 20 20 20 20 20 20  zCell           
35d50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72            /* Arr
35d60 61 79 20 6f 66 20 63 65 6c 6c 20 73 69 7a 65 73  ay of cell sizes
35d70 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 69   */.){.  const i
35d80 6e 74 20 68 64 72 20 3d 20 70 50 67 2d 3e 68 64  nt hdr = pPg->hd
35d90 72 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20  rOffset;        
35da0 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 68    /* Offset of h
35db0 65 61 64 65 72 20 6f 6e 20 70 50 67 20 2a 2f 0a  eader on pPg */.
35dc0 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 61 44 61    u8 * const aDa
35dd0 74 61 20 3d 20 70 50 67 2d 3e 61 44 61 74 61 3b  ta = pPg->aData;
35de0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
35df0 69 6e 74 65 72 20 74 6f 20 64 61 74 61 20 66 6f  inter to data fo
35e00 72 20 70 50 67 20 2a 2f 0a 20 20 63 6f 6e 73 74  r pPg */.  const
35e10 20 69 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 20   int usableSize 
35e20 3d 20 70 50 67 2d 3e 70 42 74 2d 3e 75 73 61 62  = pPg->pBt->usab
35e30 6c 65 53 69 7a 65 3b 0a 20 20 75 38 20 2a 20 63  leSize;.  u8 * c
35e40 6f 6e 73 74 20 70 45 6e 64 20 3d 20 26 61 44 61  onst pEnd = &aDa
35e50 74 61 5b 75 73 61 62 6c 65 53 69 7a 65 5d 3b 0a  ta[usableSize];.
35e60 20 20 69 6e 74 20 69 3b 0a 20 20 75 38 20 2a 70    int i;.  u8 *p
35e70 43 65 6c 6c 70 74 72 20 3d 20 70 50 67 2d 3e 61  Cellptr = pPg->a
35e80 43 65 6c 6c 49 64 78 3b 0a 20 20 75 38 20 2a 70  CellIdx;.  u8 *p
35e90 54 6d 70 20 3d 20 73 71 6c 69 74 65 33 50 61 67  Tmp = sqlite3Pag
35ea0 65 72 54 65 6d 70 53 70 61 63 65 28 70 50 67 2d  erTempSpace(pPg-
35eb0 3e 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20  >pBt->pPager);. 
35ec0 20 75 38 20 2a 70 44 61 74 61 3b 0a 0a 20 20 69   u8 *pData;..  i
35ed0 20 3d 20 67 65 74 32 62 79 74 65 28 26 61 44 61   = get2byte(&aDa
35ee0 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 6d 65  ta[hdr+5]);.  me
35ef0 6d 63 70 79 28 26 70 54 6d 70 5b 69 5d 2c 20 26  mcpy(&pTmp[i], &
35f00 61 44 61 74 61 5b 69 5d 2c 20 75 73 61 62 6c 65  aData[i], usable
35f10 53 69 7a 65 20 2d 20 69 29 3b 0a 0a 20 20 70 44  Size - i);..  pD
35f20 61 74 61 20 3d 20 70 45 6e 64 3b 0a 20 20 66 6f  ata = pEnd;.  fo
35f30 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20  r(i=0; i<nCell; 
35f40 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70 43  i++){.    u8 *pC
35f50 65 6c 6c 20 3d 20 61 70 43 65 6c 6c 5b 69 5d 3b  ell = apCell[i];
35f60 0a 20 20 20 20 69 66 28 20 70 43 65 6c 6c 3e 61  .    if( pCell>a
35f70 44 61 74 61 20 26 26 20 70 43 65 6c 6c 3c 70 45  Data && pCell<pE
35f80 6e 64 20 29 7b 0a 20 20 20 20 20 20 70 43 65 6c  nd ){.      pCel
35f90 6c 20 3d 20 26 70 54 6d 70 5b 70 43 65 6c 6c 20  l = &pTmp[pCell 
35fa0 2d 20 61 44 61 74 61 5d 3b 0a 20 20 20 20 7d 0a  - aData];.    }.
35fb0 20 20 20 20 70 44 61 74 61 20 2d 3d 20 73 7a 43      pData -= szC
35fc0 65 6c 6c 5b 69 5d 3b 0a 20 20 20 20 70 75 74 32  ell[i];.    put2
35fd0 62 79 74 65 28 70 43 65 6c 6c 70 74 72 2c 20 28  byte(pCellptr, (
35fe0 70 44 61 74 61 20 2d 20 61 44 61 74 61 29 29 3b  pData - aData));
35ff0 0a 20 20 20 20 70 43 65 6c 6c 70 74 72 20 2b 3d  .    pCellptr +=
36000 20 32 3b 0a 20 20 20 20 69 66 28 20 70 44 61 74   2;.    if( pDat
36010 61 20 3c 20 70 43 65 6c 6c 70 74 72 20 29 20 72  a < pCellptr ) r
36020 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
36030 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 6d  RUPT_BKPT;.    m
36040 65 6d 63 70 79 28 70 44 61 74 61 2c 20 70 43 65  emcpy(pData, pCe
36050 6c 6c 2c 20 73 7a 43 65 6c 6c 5b 69 5d 29 3b 0a  ll, szCell[i]);.
36060 20 20 20 20 61 73 73 65 72 74 28 20 73 7a 43 65      assert( szCe
36070 6c 6c 5b 69 5d 3d 3d 70 50 67 2d 3e 78 43 65 6c  ll[i]==pPg->xCel
36080 6c 53 69 7a 65 28 70 50 67 2c 20 70 43 65 6c 6c  lSize(pPg, pCell
36090 29 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20  ) || CORRUPT_DB 
360a0 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
360b0 20 73 7a 43 65 6c 6c 5b 69 5d 21 3d 70 50 67 2d   szCell[i]!=pPg-
360c0 3e 78 43 65 6c 6c 53 69 7a 65 28 70 50 67 2c 70  >xCellSize(pPg,p
360d0 43 65 6c 6c 29 20 29 3b 0a 20 20 7d 0a 0a 20 20  Cell) );.  }..  
360e0 2f 2a 20 54 68 65 20 70 50 67 2d 3e 6e 46 72 65  /* The pPg->nFre
360f0 65 20 66 69 65 6c 64 20 69 73 20 6e 6f 77 20 73  e field is now s
36100 65 74 20 69 6e 63 6f 72 72 65 63 74 6c 79 2e 20  et incorrectly. 
36110 54 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20  The caller will 
36120 66 69 78 20 69 74 2e 20 2a 2f 0a 20 20 70 50 67  fix it. */.  pPg
36130 2d 3e 6e 43 65 6c 6c 20 3d 20 6e 43 65 6c 6c 3b  ->nCell = nCell;
36140 0a 20 20 70 50 67 2d 3e 6e 4f 76 65 72 66 6c 6f  .  pPg->nOverflo
36150 77 20 3d 20 30 3b 0a 0a 20 20 70 75 74 32 62 79  w = 0;..  put2by
36160 74 65 28 26 61 44 61 74 61 5b 68 64 72 2b 31 5d  te(&aData[hdr+1]
36170 2c 20 30 29 3b 0a 20 20 70 75 74 32 62 79 74 65  , 0);.  put2byte
36180 28 26 61 44 61 74 61 5b 68 64 72 2b 33 5d 2c 20  (&aData[hdr+3], 
36190 70 50 67 2d 3e 6e 43 65 6c 6c 29 3b 0a 20 20 70  pPg->nCell);.  p
361a0 75 74 32 62 79 74 65 28 26 61 44 61 74 61 5b 68  ut2byte(&aData[h
361b0 64 72 2b 35 5d 2c 20 70 44 61 74 61 20 2d 20 61  dr+5], pData - a
361c0 44 61 74 61 29 3b 0a 20 20 61 44 61 74 61 5b 68  Data);.  aData[h
361d0 64 72 2b 37 5d 20 3d 20 30 78 30 30 3b 0a 20 20  dr+7] = 0x00;.  
361e0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
361f0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 72 61 79  ;.}../*.** Array
36200 20 61 70 43 65 6c 6c 5b 5d 20 63 6f 6e 74 61 69   apCell[] contai
36210 6e 73 20 6e 43 65 6c 6c 20 70 6f 69 6e 74 65 72  ns nCell pointer
36220 73 20 74 6f 20 62 2d 74 72 65 65 20 63 65 6c 6c  s to b-tree cell
36230 73 2e 20 41 72 72 61 79 20 73 7a 43 65 6c 6c 0a  s. Array szCell.
36240 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  ** contains the 
36250 73 69 7a 65 20 69 6e 20 62 79 74 65 73 20 6f 66  size in bytes of
36260 20 65 61 63 68 20 73 75 63 68 20 63 65 6c 6c 2e   each such cell.
36270 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   This function a
36280 74 74 65 6d 70 74 73 20 74 6f 20 0a 2a 2a 20 61  ttempts to .** a
36290 64 64 20 74 68 65 20 63 65 6c 6c 73 20 73 74 6f  dd the cells sto
362a0 72 65 64 20 69 6e 20 74 68 65 20 61 72 72 61 79  red in the array
362b0 20 74 6f 20 70 61 67 65 20 70 50 67 2e 20 49 66   to page pPg. If
362c0 20 69 74 20 63 61 6e 6e 6f 74 20 28 62 65 63 61   it cannot (beca
362d0 75 73 65 20 0a 2a 2a 20 74 68 65 20 70 61 67 65  use .** the page
362e0 20 6e 65 65 64 73 20 74 6f 20 62 65 20 64 65 66   needs to be def
362f0 72 61 67 6d 65 6e 74 65 64 20 62 65 66 6f 72 65  ragmented before
36300 20 74 68 65 20 63 65 6c 6c 73 20 77 69 6c 6c 20   the cells will 
36310 66 69 74 29 2c 20 6e 6f 6e 2d 7a 65 72 6f 0a 2a  fit), non-zero.*
36320 2a 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f  * is returned. O
36330 74 68 65 72 77 69 73 65 2c 20 69 66 20 74 68 65  therwise, if the
36340 20 63 65 6c 6c 73 20 61 72 65 20 61 64 64 65 64   cells are added
36350 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 7a   successfully, z
36360 65 72 6f 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e  ero is.** return
36370 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65  ed..**.** Argume
36380 6e 74 20 70 43 65 6c 6c 70 74 72 20 70 6f 69 6e  nt pCellptr poin
36390 74 73 20 74 6f 20 74 68 65 20 66 69 72 73 74 20  ts to the first 
363a0 65 6e 74 72 79 20 69 6e 20 74 68 65 20 63 65 6c  entry in the cel
363b0 6c 2d 70 6f 69 6e 74 65 72 20 61 72 72 61 79 0a  l-pointer array.
363c0 2a 2a 20 28 70 61 72 74 20 6f 66 20 70 61 67 65  ** (part of page
363d0 20 70 50 67 29 20 74 6f 20 70 6f 70 75 6c 61 74   pPg) to populat
363e0 65 2e 20 41 66 74 65 72 20 63 65 6c 6c 20 61 70  e. After cell ap
363f0 43 65 6c 6c 5b 30 5d 20 69 73 20 77 72 69 74 74  Cell[0] is writt
36400 65 6e 20 74 6f 20 74 68 65 0a 2a 2a 20 70 61 67  en to the.** pag
36410 65 20 62 6f 64 79 2c 20 61 20 31 36 2d 62 69 74  e body, a 16-bit
36420 20 6f 66 66 73 65 74 20 69 73 20 77 72 69 74 74   offset is writt
36430 65 6e 20 74 6f 20 70 43 65 6c 6c 70 74 72 2e 20  en to pCellptr. 
36440 41 6e 64 20 73 6f 20 6f 6e 2c 20 66 6f 72 20 65  And so on, for e
36450 61 63 68 0a 2a 2a 20 63 65 6c 6c 20 69 6e 20 74  ach.** cell in t
36460 68 65 20 61 72 72 61 79 2e 20 49 74 20 69 73 20  he array. It is 
36470 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69  the responsibili
36480 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72  ty of the caller
36490 20 74 6f 20 65 6e 73 75 72 65 0a 2a 2a 20 74 68   to ensure.** th
364a0 61 74 20 69 74 20 69 73 20 73 61 66 65 20 74 6f  at it is safe to
364b0 20 6f 76 65 72 77 72 69 74 65 20 74 68 69 73 20   overwrite this 
364c0 70 61 72 74 20 6f 66 20 74 68 65 20 63 65 6c 6c  part of the cell
364d0 2d 70 6f 69 6e 74 65 72 20 61 72 72 61 79 2e 0a  -pointer array..
364e0 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20  **.** When this 
364f0 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
36500 65 64 2c 20 2a 70 70 44 61 74 61 20 70 6f 69 6e  ed, *ppData poin
36510 74 73 20 74 6f 20 74 68 65 20 73 74 61 72 74 20  ts to the start 
36520 6f 66 20 74 68 65 20 0a 2a 2a 20 63 6f 6e 74 65  of the .** conte
36530 6e 74 20 61 72 65 61 20 6f 6e 20 70 61 67 65 20  nt area on page 
36540 70 50 67 2e 20 49 66 20 74 68 65 20 73 69 7a 65  pPg. If the size
36550 20 6f 66 20 74 68 65 20 63 6f 6e 74 65 6e 74 20   of the content 
36560 61 72 65 61 20 69 73 20 65 78 74 65 6e 64 65 64  area is extended
36570 2c 0a 2a 2a 20 2a 70 70 44 61 74 61 20 69 73 20  ,.** *ppData is 
36580 75 70 64 61 74 65 64 20 74 6f 20 70 6f 69 6e 74  updated to point
36590 20 74 6f 20 74 68 65 20 6e 65 77 20 73 74 61 72   to the new star
365a0 74 20 6f 66 20 74 68 65 20 63 6f 6e 74 65 6e 74  t of the content
365b0 20 61 72 65 61 0a 2a 2a 20 62 65 66 6f 72 65 20   area.** before 
365c0 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a  returning..**.**
365d0 20 46 69 6e 61 6c 6c 79 2c 20 61 72 67 75 6d 65   Finally, argume
365e0 6e 74 20 70 42 65 67 69 6e 20 70 6f 69 6e 74 73  nt pBegin points
365f0 20 74 6f 20 74 68 65 20 62 79 74 65 20 69 6d 6d   to the byte imm
36600 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69  ediately followi
36610 6e 67 20 74 68 65 0a 2a 2a 20 65 6e 64 20 6f 66  ng the.** end of
36620 20 74 68 65 20 73 70 61 63 65 20 72 65 71 75 69   the space requi
36630 72 65 64 20 62 79 20 74 68 69 73 20 70 61 67 65  red by this page
36640 20 66 6f 72 20 74 68 65 20 63 65 6c 6c 2d 70 6f   for the cell-po
36650 69 6e 74 65 72 20 61 72 65 61 20 28 66 6f 72 0a  inter area (for.
36660 2a 2a 20 61 6c 6c 20 63 65 6c 6c 73 20 2d 20 6e  ** all cells - n
36670 6f 74 20 6a 75 73 74 20 74 68 6f 73 65 20 69 6e  ot just those in
36680 73 65 72 74 65 64 20 62 79 20 74 68 65 20 63 75  serted by the cu
36690 72 72 65 6e 74 20 63 61 6c 6c 29 2e 20 49 66 20  rrent call). If 
366a0 74 68 65 20 63 6f 6e 74 65 6e 74 0a 2a 2a 20 61  the content.** a
366b0 72 65 61 20 6d 75 73 74 20 62 65 20 65 78 74 65  rea must be exte
366c0 6e 64 65 64 20 74 6f 20 62 65 66 6f 72 65 20 74  nded to before t
366d0 68 69 73 20 70 6f 69 6e 74 20 69 6e 20 6f 72 64  his point in ord
366e0 65 72 20 74 6f 20 61 63 63 6f 6d 6f 64 61 74 65  er to accomodate
366f0 20 61 6c 6c 0a 2a 2a 20 63 65 6c 6c 73 20 69 6e   all.** cells in
36700 20 61 70 43 65 6c 6c 5b 5d 2c 20 74 68 65 6e 20   apCell[], then 
36710 74 68 65 20 63 65 6c 6c 73 20 64 6f 20 6e 6f 74  the cells do not
36720 20 66 69 74 20 61 6e 64 20 6e 6f 6e 2d 7a 65 72   fit and non-zer
36730 6f 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  o is returned..*
36740 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
36750 65 49 6e 73 65 72 74 41 72 72 61 79 28 0a 20 20  eInsertArray(.  
36760 4d 65 6d 50 61 67 65 20 2a 70 50 67 2c 20 20 20  MemPage *pPg,   
36770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36780 2f 2a 20 50 61 67 65 20 74 6f 20 61 64 64 20 63  /* Page to add c
36790 65 6c 6c 73 20 74 6f 20 2a 2f 0a 20 20 75 38 20  ells to */.  u8 
367a0 2a 70 42 65 67 69 6e 2c 20 20 20 20 20 20 20 20  *pBegin,        
367b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
367c0 45 6e 64 20 6f 66 20 63 65 6c 6c 2d 70 6f 69 6e  End of cell-poin
367d0 74 65 72 20 61 72 72 61 79 20 2a 2f 0a 20 20 75  ter array */.  u
367e0 38 20 2a 2a 70 70 44 61 74 61 2c 20 20 20 20 20  8 **ppData,     
367f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
36800 2a 20 49 4e 2f 4f 55 54 3a 20 50 61 67 65 20 63  * IN/OUT: Page c
36810 6f 6e 74 65 6e 74 20 2d 61 72 65 61 20 70 6f 69  ontent -area poi
36820 6e 74 65 72 20 2a 2f 0a 20 20 75 38 20 2a 70 43  nter */.  u8 *pC
36830 65 6c 6c 70 74 72 2c 20 20 20 20 20 20 20 20 20  ellptr,         
36840 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
36850 6e 74 65 72 20 74 6f 20 63 65 6c 6c 2d 70 6f 69  nter to cell-poi
36860 6e 74 65 72 20 61 72 65 61 20 2a 2f 0a 20 20 69  nter area */.  i
36870 6e 74 20 69 46 69 72 73 74 2c 20 20 20 20 20 20  nt iFirst,      
36880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
36890 2a 20 49 6e 64 65 78 20 6f 66 20 66 69 72 73 74  * Index of first
368a0 20 63 65 6c 6c 20 74 6f 20 61 64 64 20 2a 2f 0a   cell to add */.
368b0 20 20 69 6e 74 20 6e 43 65 6c 6c 2c 20 20 20 20    int nCell,    
368c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
368d0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
368e0 65 6c 6c 73 20 74 6f 20 61 64 64 20 74 6f 20 70  ells to add to p
368f0 50 67 20 2a 2f 0a 20 20 43 65 6c 6c 41 72 72 61  Pg */.  CellArra
36900 79 20 2a 70 43 41 72 72 61 79 20 20 20 20 20 20  y *pCArray      
36910 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79          /* Array
36920 20 6f 66 20 63 65 6c 6c 73 20 2a 2f 0a 29 7b 0a   of cells */.){.
36930 20 20 69 6e 74 20 69 3b 0a 20 20 75 38 20 2a 61    int i;.  u8 *a
36940 44 61 74 61 20 3d 20 70 50 67 2d 3e 61 44 61 74  Data = pPg->aDat
36950 61 3b 0a 20 20 75 38 20 2a 70 44 61 74 61 20 3d  a;.  u8 *pData =
36960 20 2a 70 70 44 61 74 61 3b 0a 20 20 69 6e 74 20   *ppData;.  int 
36970 69 45 6e 64 20 3d 20 69 46 69 72 73 74 20 2b 20  iEnd = iFirst + 
36980 6e 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28  nCell;.  assert(
36990 20 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20 70   CORRUPT_DB || p
369a0 50 67 2d 3e 68 64 72 4f 66 66 73 65 74 3d 3d 30  Pg->hdrOffset==0
369b0 20 29 3b 20 20 20 20 2f 2a 20 4e 65 76 65 72 20   );    /* Never 
369c0 63 61 6c 6c 65 64 20 6f 6e 20 70 61 67 65 20 31  called on page 1
369d0 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 69 46 69 72   */.  for(i=iFir
369e0 73 74 3b 20 69 3c 69 45 6e 64 3b 20 69 2b 2b 29  st; i<iEnd; i++)
369f0 7b 0a 20 20 20 20 69 6e 74 20 73 7a 2c 20 72 63  {.    int sz, rc
36a00 3b 0a 20 20 20 20 75 38 20 2a 70 53 6c 6f 74 3b  ;.    u8 *pSlot;
36a10 0a 20 20 20 20 73 7a 20 3d 20 63 61 63 68 65 64  .    sz = cached
36a20 43 65 6c 6c 53 69 7a 65 28 70 43 41 72 72 61 79  CellSize(pCArray
36a30 2c 20 69 29 3b 0a 20 20 20 20 69 66 28 20 28 61  , i);.    if( (a
36a40 44 61 74 61 5b 31 5d 3d 3d 30 20 26 26 20 61 44  Data[1]==0 && aD
36a50 61 74 61 5b 32 5d 3d 3d 30 29 20 7c 7c 20 28 70  ata[2]==0) || (p
36a60 53 6c 6f 74 20 3d 20 70 61 67 65 46 69 6e 64 53  Slot = pageFindS
36a70 6c 6f 74 28 70 50 67 2c 73 7a 2c 26 72 63 29 29  lot(pPg,sz,&rc))
36a80 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 44 61  ==0 ){.      pDa
36a90 74 61 20 2d 3d 20 73 7a 3b 0a 20 20 20 20 20 20  ta -= sz;.      
36aa0 69 66 28 20 70 44 61 74 61 3c 70 42 65 67 69 6e  if( pData<pBegin
36ab0 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20   ) return 1;.   
36ac0 20 20 20 70 53 6c 6f 74 20 3d 20 70 44 61 74 61     pSlot = pData
36ad0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 63  ;.    }.    memc
36ae0 70 79 28 70 53 6c 6f 74 2c 20 70 43 41 72 72 61  py(pSlot, pCArra
36af0 79 2d 3e 61 70 43 65 6c 6c 5b 69 5d 2c 20 73 7a  y->apCell[i], sz
36b00 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65 28  );.    put2byte(
36b10 70 43 65 6c 6c 70 74 72 2c 20 28 70 53 6c 6f 74  pCellptr, (pSlot
36b20 20 2d 20 61 44 61 74 61 29 29 3b 0a 20 20 20 20   - aData));.    
36b30 70 43 65 6c 6c 70 74 72 20 2b 3d 20 32 3b 0a 20  pCellptr += 2;. 
36b40 20 7d 0a 20 20 2a 70 70 44 61 74 61 20 3d 20 70   }.  *ppData = p
36b50 44 61 74 61 3b 0a 20 20 72 65 74 75 72 6e 20 30  Data;.  return 0
36b60 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 72 61 79  ;.}../*.** Array
36b70 20 61 70 43 65 6c 6c 5b 5d 20 63 6f 6e 74 61 69   apCell[] contai
36b80 6e 73 20 6e 43 65 6c 6c 20 70 6f 69 6e 74 65 72  ns nCell pointer
36b90 73 20 74 6f 20 62 2d 74 72 65 65 20 63 65 6c 6c  s to b-tree cell
36ba0 73 2e 20 41 72 72 61 79 20 73 7a 43 65 6c 6c 20  s. Array szCell 
36bb0 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  .** contains the
36bc0 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73 20 6f   size in bytes o
36bd0 66 20 65 61 63 68 20 73 75 63 68 20 63 65 6c 6c  f each such cell
36be0 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
36bf0 61 64 64 73 20 74 68 65 0a 2a 2a 20 73 70 61 63  adds the.** spac
36c00 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  e associated wit
36c10 68 20 65 61 63 68 20 63 65 6c 6c 20 69 6e 20 74  h each cell in t
36c20 68 65 20 61 72 72 61 79 20 74 68 61 74 20 69 73  he array that is
36c30 20 63 75 72 72 65 6e 74 6c 79 20 73 74 6f 72 65   currently store
36c40 64 20 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 65  d .** within the
36c50 20 62 6f 64 79 20 6f 66 20 70 50 67 20 74 6f 20   body of pPg to 
36c60 74 68 65 20 70 50 67 20 66 72 65 65 2d 6c 69 73  the pPg free-lis
36c70 74 2e 20 54 68 65 20 63 65 6c 6c 2d 70 6f 69 6e  t. The cell-poin
36c80 74 65 72 73 20 61 6e 64 20 6f 74 68 65 72 0a 2a  ters and other.*
36c90 2a 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20  * fields of the 
36ca0 70 61 67 65 20 61 72 65 20 6e 6f 74 20 75 70 64  page are not upd
36cb0 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ated..**.** This
36cc0 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
36cd0 73 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62  s the total numb
36ce0 65 72 20 6f 66 20 63 65 6c 6c 73 20 61 64 64 65  er of cells adde
36cf0 64 20 74 6f 20 74 68 65 20 66 72 65 65 2d 6c 69  d to the free-li
36d00 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  st..*/.static in
36d10 74 20 70 61 67 65 46 72 65 65 41 72 72 61 79 28  t pageFreeArray(
36d20 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 67 2c  .  MemPage *pPg,
36d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36d40 20 20 20 2f 2a 20 50 61 67 65 20 74 6f 20 65 64     /* Page to ed
36d50 69 74 20 2a 2f 0a 20 20 69 6e 74 20 69 46 69 72  it */.  int iFir
36d60 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  st,             
36d70 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
36d80 20 63 65 6c 6c 20 74 6f 20 64 65 6c 65 74 65 20   cell to delete 
36d90 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 2c 20  */.  int nCell, 
36da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36db0 20 20 20 20 20 2f 2a 20 43 65 6c 6c 73 20 74 6f       /* Cells to
36dc0 20 64 65 6c 65 74 65 20 2a 2f 0a 20 20 43 65 6c   delete */.  Cel
36dd0 6c 41 72 72 61 79 20 2a 70 43 41 72 72 61 79 20  lArray *pCArray 
36de0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
36df0 41 72 72 61 79 20 6f 66 20 63 65 6c 6c 73 20 2a  Array of cells *
36e00 2f 0a 29 7b 0a 20 20 75 38 20 2a 20 63 6f 6e 73  /.){.  u8 * cons
36e10 74 20 61 44 61 74 61 20 3d 20 70 50 67 2d 3e 61  t aData = pPg->a
36e20 44 61 74 61 3b 0a 20 20 75 38 20 2a 20 63 6f 6e  Data;.  u8 * con
36e30 73 74 20 70 45 6e 64 20 3d 20 26 61 44 61 74 61  st pEnd = &aData
36e40 5b 70 50 67 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  [pPg->pBt->usabl
36e50 65 53 69 7a 65 5d 3b 0a 20 20 75 38 20 2a 20 63  eSize];.  u8 * c
36e60 6f 6e 73 74 20 70 53 74 61 72 74 20 3d 20 26 61  onst pStart = &a
36e70 44 61 74 61 5b 70 50 67 2d 3e 68 64 72 4f 66 66  Data[pPg->hdrOff
36e80 73 65 74 20 2b 20 38 20 2b 20 70 50 67 2d 3e 63  set + 8 + pPg->c
36e90 68 69 6c 64 50 74 72 53 69 7a 65 5d 3b 0a 20 20  hildPtrSize];.  
36ea0 69 6e 74 20 6e 52 65 74 20 3d 20 30 3b 0a 20 20  int nRet = 0;.  
36eb0 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 69 45 6e  int i;.  int iEn
36ec0 64 20 3d 20 69 46 69 72 73 74 20 2b 20 6e 43 65  d = iFirst + nCe
36ed0 6c 6c 3b 0a 20 20 75 38 20 2a 70 46 72 65 65 20  ll;.  u8 *pFree 
36ee0 3d 20 30 3b 0a 20 20 69 6e 74 20 73 7a 46 72 65  = 0;.  int szFre
36ef0 65 20 3d 20 30 3b 0a 0a 20 20 66 6f 72 28 69 3d  e = 0;..  for(i=
36f00 69 46 69 72 73 74 3b 20 69 3c 69 45 6e 64 3b 20  iFirst; i<iEnd; 
36f10 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70 43  i++){.    u8 *pC
36f20 65 6c 6c 20 3d 20 70 43 41 72 72 61 79 2d 3e 61  ell = pCArray->a
36f30 70 43 65 6c 6c 5b 69 5d 3b 0a 20 20 20 20 69 66  pCell[i];.    if
36f40 28 20 70 43 65 6c 6c 3e 3d 70 53 74 61 72 74 20  ( pCell>=pStart 
36f50 26 26 20 70 43 65 6c 6c 3c 70 45 6e 64 20 29 7b  && pCell<pEnd ){
36f60 0a 20 20 20 20 20 20 69 6e 74 20 73 7a 3b 0a 20  .      int sz;. 
36f70 20 20 20 20 20 2f 2a 20 4e 6f 20 6e 65 65 64 20       /* No need 
36f80 74 6f 20 75 73 65 20 63 61 63 68 65 64 43 65 6c  to use cachedCel
36f90 6c 53 69 7a 65 28 29 20 68 65 72 65 2e 20 20 54  lSize() here.  T
36fa0 68 65 20 73 69 7a 65 73 20 6f 66 20 61 6c 6c 20  he sizes of all 
36fb0 63 65 6c 6c 73 20 74 68 61 74 0a 20 20 20 20 20  cells that.     
36fc0 20 2a 2a 20 61 72 65 20 74 6f 20 62 65 20 66 72   ** are to be fr
36fd0 65 65 64 20 68 61 76 65 20 61 6c 72 65 61 64 79  eed have already
36fe0 20 62 65 65 6e 20 63 6f 6d 70 75 74 69 6e 67 20   been computing 
36ff0 77 68 69 6c 65 20 64 65 63 69 64 69 6e 67 20 77  while deciding w
37000 68 69 63 68 0a 20 20 20 20 20 20 2a 2a 20 63 65  hich.      ** ce
37010 6c 6c 73 20 6e 65 65 64 20 66 72 65 65 69 6e 67  lls need freeing
37020 20 2a 2f 0a 20 20 20 20 20 20 73 7a 20 3d 20 70   */.      sz = p
37030 43 41 72 72 61 79 2d 3e 73 7a 43 65 6c 6c 5b 69  CArray->szCell[i
37040 5d 3b 20 20 61 73 73 65 72 74 28 20 73 7a 3e 30  ];  assert( sz>0
37050 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 46   );.      if( pF
37060 72 65 65 21 3d 28 70 43 65 6c 6c 20 2b 20 73 7a  ree!=(pCell + sz
37070 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ) ){.        if(
37080 20 70 46 72 65 65 20 29 7b 0a 20 20 20 20 20 20   pFree ){.      
37090 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72 65      assert( pFre
370a0 65 3e 61 44 61 74 61 20 26 26 20 28 70 46 72 65  e>aData && (pFre
370b0 65 20 2d 20 61 44 61 74 61 29 3c 36 35 35 33 36  e - aData)<65536
370c0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 66 72   );.          fr
370d0 65 65 53 70 61 63 65 28 70 50 67 2c 20 28 75 31  eeSpace(pPg, (u1
370e0 36 29 28 70 46 72 65 65 20 2d 20 61 44 61 74 61  6)(pFree - aData
370f0 29 2c 20 73 7a 46 72 65 65 29 3b 0a 20 20 20 20  ), szFree);.    
37100 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 46      }.        pF
37110 72 65 65 20 3d 20 70 43 65 6c 6c 3b 0a 20 20 20  ree = pCell;.   
37120 20 20 20 20 20 73 7a 46 72 65 65 20 3d 20 73 7a       szFree = sz
37130 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 46  ;.        if( pF
37140 72 65 65 2b 73 7a 3e 70 45 6e 64 20 29 20 72 65  ree+sz>pEnd ) re
37150 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 65  turn 0;.      }e
37160 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 46 72  lse{.        pFr
37170 65 65 20 3d 20 70 43 65 6c 6c 3b 0a 20 20 20 20  ee = pCell;.    
37180 20 20 20 20 73 7a 46 72 65 65 20 2b 3d 20 73 7a      szFree += sz
37190 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
371a0 6e 52 65 74 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  nRet++;.    }.  
371b0 7d 0a 20 20 69 66 28 20 70 46 72 65 65 20 29 7b  }.  if( pFree ){
371c0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72  .    assert( pFr
371d0 65 65 3e 61 44 61 74 61 20 26 26 20 28 70 46 72  ee>aData && (pFr
371e0 65 65 20 2d 20 61 44 61 74 61 29 3c 36 35 35 33  ee - aData)<6553
371f0 36 20 29 3b 0a 20 20 20 20 66 72 65 65 53 70 61  6 );.    freeSpa
37200 63 65 28 70 50 67 2c 20 28 75 31 36 29 28 70 46  ce(pPg, (u16)(pF
37210 72 65 65 20 2d 20 61 44 61 74 61 29 2c 20 73 7a  ree - aData), sz
37220 46 72 65 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74  Free);.  }.  ret
37230 75 72 6e 20 6e 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a  urn nRet;.}../*.
37240 2a 2a 20 61 70 43 65 6c 6c 5b 5d 20 61 6e 64 20  ** apCell[] and 
37250 73 7a 43 65 6c 6c 5b 5d 20 63 6f 6e 74 61 69 6e  szCell[] contain
37260 73 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 61 6e  s pointers to an
37270 64 20 73 69 7a 65 73 20 6f 66 20 61 6c 6c 20 63  d sizes of all c
37280 65 6c 6c 73 20 69 6e 20 74 68 65 0a 2a 2a 20 70  ells in the.** p
37290 61 67 65 73 20 62 65 69 6e 67 20 62 61 6c 61 6e  ages being balan
372a0 63 65 64 2e 20 20 54 68 65 20 63 75 72 72 65 6e  ced.  The curren
372b0 74 20 70 61 67 65 2c 20 70 50 67 2c 20 68 61 73  t page, pPg, has
372c0 20 70 50 67 2d 3e 6e 43 65 6c 6c 20 63 65 6c 6c   pPg->nCell cell
372d0 73 20 73 74 61 72 74 69 6e 67 0a 2a 2a 20 77 69  s starting.** wi
372e0 74 68 20 61 70 43 65 6c 6c 5b 69 4f 6c 64 5d 2e  th apCell[iOld].
372f0 20 20 41 66 74 65 72 20 62 61 6c 61 6e 63 69 6e    After balancin
37300 67 2c 20 74 68 69 73 20 70 61 67 65 20 73 68 6f  g, this page sho
37310 75 6c 64 20 68 6f 6c 64 20 6e 4e 65 77 20 63 65  uld hold nNew ce
37320 6c 6c 73 0a 2a 2a 20 73 74 61 72 74 69 6e 67 20  lls.** starting 
37330 61 74 20 61 70 43 65 6c 6c 5b 69 4e 65 77 5d 2e  at apCell[iNew].
37340 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
37350 69 6e 65 20 6d 61 6b 65 73 20 74 68 65 20 6e 65  ine makes the ne
37360 63 65 73 73 61 72 79 20 61 64 6a 75 73 74 6d 65  cessary adjustme
37370 6e 74 73 20 74 6f 20 70 50 67 20 73 6f 20 74 68  nts to pPg so th
37380 61 74 20 69 74 20 63 6f 6e 74 61 69 6e 73 0a 2a  at it contains.*
37390 2a 20 74 68 65 20 63 6f 72 72 65 63 74 20 63 65  * the correct ce
373a0 6c 6c 73 20 61 66 74 65 72 20 62 65 69 6e 67 20  lls after being 
373b0 62 61 6c 61 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20  balanced..**.** 
373c0 54 68 65 20 70 50 67 2d 3e 6e 46 72 65 65 20 66  The pPg->nFree f
373d0 69 65 6c 64 20 69 73 20 69 6e 76 61 6c 69 64 20  ield is invalid 
373e0 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
373f0 6f 6e 20 72 65 74 75 72 6e 73 2e 20 49 74 20 69  on returns. It i
37400 73 20 74 68 65 0a 2a 2a 20 72 65 73 70 6f 6e 73  s the.** respons
37410 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63  ibility of the c
37420 61 6c 6c 65 72 20 74 6f 20 73 65 74 20 69 74 20  aller to set it 
37430 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2f 0a 73 74  correctly..*/.st
37440 61 74 69 63 20 69 6e 74 20 65 64 69 74 50 61 67  atic int editPag
37450 65 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  e(.  MemPage *pP
37460 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g,              
37470 20 20 20 20 20 2f 2a 20 45 64 69 74 20 74 68 69       /* Edit thi
37480 73 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20  s page */.  int 
37490 69 4f 6c 64 2c 20 20 20 20 20 20 20 20 20 20 20  iOld,           
374a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
374b0 6e 64 65 78 20 6f 66 20 66 69 72 73 74 20 63 65  ndex of first ce
374c0 6c 6c 20 63 75 72 72 65 6e 74 6c 79 20 6f 6e 20  ll currently on 
374d0 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4e  page */.  int iN
374e0 65 77 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ew,             
374f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
37500 65 78 20 6f 66 20 6e 65 77 20 66 69 72 73 74 20  ex of new first 
37510 63 65 6c 6c 20 6f 6e 20 70 61 67 65 20 2a 2f 0a  cell on page */.
37520 20 20 69 6e 74 20 6e 4e 65 77 2c 20 20 20 20 20    int nNew,     
37530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37540 20 20 2f 2a 20 46 69 6e 61 6c 20 6e 75 6d 62 65    /* Final numbe
37550 72 20 6f 66 20 63 65 6c 6c 73 20 6f 6e 20 70 61  r of cells on pa
37560 67 65 20 2a 2f 0a 20 20 43 65 6c 6c 41 72 72 61  ge */.  CellArra
37570 79 20 2a 70 43 41 72 72 61 79 20 20 20 20 20 20  y *pCArray      
37580 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79          /* Array
37590 20 6f 66 20 63 65 6c 6c 73 20 61 6e 64 20 73 69   of cells and si
375a0 7a 65 73 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a  zes */.){.  u8 *
375b0 20 63 6f 6e 73 74 20 61 44 61 74 61 20 3d 20 70   const aData = p
375c0 50 67 2d 3e 61 44 61 74 61 3b 0a 20 20 63 6f 6e  Pg->aData;.  con
375d0 73 74 20 69 6e 74 20 68 64 72 20 3d 20 70 50 67  st int hdr = pPg
375e0 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 75  ->hdrOffset;.  u
375f0 38 20 2a 70 42 65 67 69 6e 20 3d 20 26 70 50 67  8 *pBegin = &pPg
37600 2d 3e 61 43 65 6c 6c 49 64 78 5b 6e 4e 65 77 20  ->aCellIdx[nNew 
37610 2a 20 32 5d 3b 0a 20 20 69 6e 74 20 6e 43 65 6c  * 2];.  int nCel
37620 6c 20 3d 20 70 50 67 2d 3e 6e 43 65 6c 6c 3b 20  l = pPg->nCell; 
37630 20 20 20 20 20 20 2f 2a 20 43 65 6c 6c 73 20 73        /* Cells s
37640 74 6f 72 65 64 20 6f 6e 20 70 50 67 20 2a 2f 0a  tored on pPg */.
37650 20 20 75 38 20 2a 70 44 61 74 61 3b 0a 20 20 75    u8 *pData;.  u
37660 38 20 2a 70 43 65 6c 6c 70 74 72 3b 0a 20 20 69  8 *pCellptr;.  i
37670 6e 74 20 69 3b 0a 20 20 69 6e 74 20 69 4f 6c 64  nt i;.  int iOld
37680 45 6e 64 20 3d 20 69 4f 6c 64 20 2b 20 70 50 67  End = iOld + pPg
37690 2d 3e 6e 43 65 6c 6c 20 2b 20 70 50 67 2d 3e 6e  ->nCell + pPg->n
376a0 4f 76 65 72 66 6c 6f 77 3b 0a 20 20 69 6e 74 20  Overflow;.  int 
376b0 69 4e 65 77 45 6e 64 20 3d 20 69 4e 65 77 20 2b  iNewEnd = iNew +
376c0 20 6e 4e 65 77 3b 0a 0a 23 69 66 64 65 66 20 53   nNew;..#ifdef S
376d0 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 75 38  QLITE_DEBUG.  u8
376e0 20 2a 70 54 6d 70 20 3d 20 73 71 6c 69 74 65 33   *pTmp = sqlite3
376f0 50 61 67 65 72 54 65 6d 70 53 70 61 63 65 28 70  PagerTempSpace(p
37700 50 67 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 29  Pg->pBt->pPager)
37710 3b 0a 20 20 6d 65 6d 63 70 79 28 70 54 6d 70 2c  ;.  memcpy(pTmp,
37720 20 61 44 61 74 61 2c 20 70 50 67 2d 3e 70 42 74   aData, pPg->pBt
37730 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a 23  ->usableSize);.#
37740 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 52 65 6d 6f  endif..  /* Remo
37750 76 65 20 63 65 6c 6c 73 20 66 72 6f 6d 20 74 68  ve cells from th
37760 65 20 73 74 61 72 74 20 61 6e 64 20 65 6e 64 20  e start and end 
37770 6f 66 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20  of the page */. 
37780 20 69 66 28 20 69 4f 6c 64 3c 69 4e 65 77 20 29   if( iOld<iNew )
37790 7b 0a 20 20 20 20 69 6e 74 20 6e 53 68 69 66 74  {.    int nShift
377a0 20 3d 20 70 61 67 65 46 72 65 65 41 72 72 61 79   = pageFreeArray
377b0 28 70 50 67 2c 20 69 4f 6c 64 2c 20 69 4e 65 77  (pPg, iOld, iNew
377c0 2d 69 4f 6c 64 2c 20 70 43 41 72 72 61 79 29 3b  -iOld, pCArray);
377d0 0a 20 20 20 20 6d 65 6d 6d 6f 76 65 28 70 50 67  .    memmove(pPg
377e0 2d 3e 61 43 65 6c 6c 49 64 78 2c 20 26 70 50 67  ->aCellIdx, &pPg
377f0 2d 3e 61 43 65 6c 6c 49 64 78 5b 6e 53 68 69 66  ->aCellIdx[nShif
37800 74 2a 32 5d 2c 20 6e 43 65 6c 6c 2a 32 29 3b 0a  t*2], nCell*2);.
37810 20 20 20 20 6e 43 65 6c 6c 20 2d 3d 20 6e 53 68      nCell -= nSh
37820 69 66 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69  ift;.  }.  if( i
37830 4e 65 77 45 6e 64 20 3c 20 69 4f 6c 64 45 6e 64  NewEnd < iOldEnd
37840 20 29 7b 0a 20 20 20 20 6e 43 65 6c 6c 20 2d 3d   ){.    nCell -=
37850 20 70 61 67 65 46 72 65 65 41 72 72 61 79 28 70   pageFreeArray(p
37860 50 67 2c 20 69 4e 65 77 45 6e 64 2c 20 69 4f 6c  Pg, iNewEnd, iOl
37870 64 45 6e 64 20 2d 20 69 4e 65 77 45 6e 64 2c 20  dEnd - iNewEnd, 
37880 70 43 41 72 72 61 79 29 3b 0a 20 20 7d 0a 0a 20  pCArray);.  }.. 
37890 20 70 44 61 74 61 20 3d 20 26 61 44 61 74 61 5b   pData = &aData[
378a0 67 65 74 32 62 79 74 65 4e 6f 74 5a 65 72 6f 28  get2byteNotZero(
378b0 26 61 44 61 74 61 5b 68 64 72 2b 35 5d 29 5d 3b  &aData[hdr+5])];
378c0 0a 20 20 69 66 28 20 70 44 61 74 61 3c 70 42 65  .  if( pData<pBe
378d0 67 69 6e 20 29 20 67 6f 74 6f 20 65 64 69 74 70  gin ) goto editp
378e0 61 67 65 5f 66 61 69 6c 3b 0a 0a 20 20 2f 2a 20  age_fail;..  /* 
378f0 41 64 64 20 63 65 6c 6c 73 20 74 6f 20 74 68 65  Add cells to the
37900 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 70 61   start of the pa
37910 67 65 20 2a 2f 0a 20 20 69 66 28 20 69 4e 65 77  ge */.  if( iNew
37920 3c 69 4f 6c 64 20 29 7b 0a 20 20 20 20 69 6e 74  <iOld ){.    int
37930 20 6e 41 64 64 20 3d 20 4d 49 4e 28 6e 4e 65 77   nAdd = MIN(nNew
37940 2c 69 4f 6c 64 2d 69 4e 65 77 29 3b 0a 20 20 20  ,iOld-iNew);.   
37950 20 61 73 73 65 72 74 28 20 28 69 4f 6c 64 2d 69   assert( (iOld-i
37960 4e 65 77 29 3c 6e 4e 65 77 20 7c 7c 20 6e 43 65  New)<nNew || nCe
37970 6c 6c 3d 3d 30 20 7c 7c 20 43 4f 52 52 55 50 54  ll==0 || CORRUPT
37980 5f 44 42 20 29 3b 0a 20 20 20 20 70 43 65 6c 6c  _DB );.    pCell
37990 70 74 72 20 3d 20 70 50 67 2d 3e 61 43 65 6c 6c  ptr = pPg->aCell
379a0 49 64 78 3b 0a 20 20 20 20 6d 65 6d 6d 6f 76 65  Idx;.    memmove
379b0 28 26 70 43 65 6c 6c 70 74 72 5b 6e 41 64 64 2a  (&pCellptr[nAdd*
379c0 32 5d 2c 20 70 43 65 6c 6c 70 74 72 2c 20 6e 43  2], pCellptr, nC
379d0 65 6c 6c 2a 32 29 3b 0a 20 20 20 20 69 66 28 20  ell*2);.    if( 
379e0 70 61 67 65 49 6e 73 65 72 74 41 72 72 61 79 28  pageInsertArray(
379f0 0a 20 20 20 20 20 20 20 20 20 20 70 50 67 2c 20  .          pPg, 
37a00 70 42 65 67 69 6e 2c 20 26 70 44 61 74 61 2c 20  pBegin, &pData, 
37a10 70 43 65 6c 6c 70 74 72 2c 0a 20 20 20 20 20 20  pCellptr,.      
37a20 20 20 20 20 69 4e 65 77 2c 20 6e 41 64 64 2c 20      iNew, nAdd, 
37a30 70 43 41 72 72 61 79 0a 20 20 20 20 29 20 29 20  pCArray.    ) ) 
37a40 67 6f 74 6f 20 65 64 69 74 70 61 67 65 5f 66 61  goto editpage_fa
37a50 69 6c 3b 0a 20 20 20 20 6e 43 65 6c 6c 20 2b 3d  il;.    nCell +=
37a60 20 6e 41 64 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a   nAdd;.  }..  /*
37a70 20 41 64 64 20 61 6e 79 20 6f 76 65 72 66 6c 6f   Add any overflo
37a80 77 20 63 65 6c 6c 73 20 2a 2f 0a 20 20 66 6f 72  w cells */.  for
37a90 28 69 3d 30 3b 20 69 3c 70 50 67 2d 3e 6e 4f 76  (i=0; i<pPg->nOv
37aa0 65 72 66 6c 6f 77 3b 20 69 2b 2b 29 7b 0a 20 20  erflow; i++){.  
37ab0 20 20 69 6e 74 20 69 43 65 6c 6c 20 3d 20 28 69    int iCell = (i
37ac0 4f 6c 64 20 2b 20 70 50 67 2d 3e 61 69 4f 76 66  Old + pPg->aiOvf
37ad0 6c 5b 69 5d 29 20 2d 20 69 4e 65 77 3b 0a 20 20  l[i]) - iNew;.  
37ae0 20 20 69 66 28 20 69 43 65 6c 6c 3e 3d 30 20 26    if( iCell>=0 &
37af0 26 20 69 43 65 6c 6c 3c 6e 4e 65 77 20 29 7b 0a  & iCell<nNew ){.
37b00 20 20 20 20 20 20 70 43 65 6c 6c 70 74 72 20 3d        pCellptr =
37b10 20 26 70 50 67 2d 3e 61 43 65 6c 6c 49 64 78 5b   &pPg->aCellIdx[
37b20 69 43 65 6c 6c 20 2a 20 32 5d 3b 0a 20 20 20 20  iCell * 2];.    
37b30 20 20 6d 65 6d 6d 6f 76 65 28 26 70 43 65 6c 6c    memmove(&pCell
37b40 70 74 72 5b 32 5d 2c 20 70 43 65 6c 6c 70 74 72  ptr[2], pCellptr
37b50 2c 20 28 6e 43 65 6c 6c 20 2d 20 69 43 65 6c 6c  , (nCell - iCell
37b60 29 20 2a 20 32 29 3b 0a 20 20 20 20 20 20 6e 43  ) * 2);.      nC
37b70 65 6c 6c 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28  ell++;.      if(
37b80 20 70 61 67 65 49 6e 73 65 72 74 41 72 72 61 79   pageInsertArray
37b90 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 50  (.            pP
37ba0 67 2c 20 70 42 65 67 69 6e 2c 20 26 70 44 61 74  g, pBegin, &pDat
37bb0 61 2c 20 70 43 65 6c 6c 70 74 72 2c 0a 20 20 20  a, pCellptr,.   
37bc0 20 20 20 20 20 20 20 20 20 69 43 65 6c 6c 2b 69           iCell+i
37bd0 4e 65 77 2c 20 31 2c 20 70 43 41 72 72 61 79 0a  New, 1, pCArray.
37be0 20 20 20 20 20 20 29 20 29 20 67 6f 74 6f 20 65        ) ) goto e
37bf0 64 69 74 70 61 67 65 5f 66 61 69 6c 3b 0a 20 20  ditpage_fail;.  
37c00 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 70    }.  }..  /* Ap
37c10 70 65 6e 64 20 63 65 6c 6c 73 20 74 6f 20 74 68  pend cells to th
37c20 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70 61 67  e end of the pag
37c30 65 20 2a 2f 0a 20 20 70 43 65 6c 6c 70 74 72 20  e */.  pCellptr 
37c40 3d 20 26 70 50 67 2d 3e 61 43 65 6c 6c 49 64 78  = &pPg->aCellIdx
37c50 5b 6e 43 65 6c 6c 2a 32 5d 3b 0a 20 20 69 66 28  [nCell*2];.  if(
37c60 20 70 61 67 65 49 6e 73 65 72 74 41 72 72 61 79   pageInsertArray
37c70 28 0a 20 20 20 20 20 20 20 20 70 50 67 2c 20 70  (.        pPg, p
37c80 42 65 67 69 6e 2c 20 26 70 44 61 74 61 2c 20 70  Begin, &pData, p
37c90 43 65 6c 6c 70 74 72 2c 0a 20 20 20 20 20 20 20  Cellptr,.       
37ca0 20 69 4e 65 77 2b 6e 43 65 6c 6c 2c 20 6e 4e 65   iNew+nCell, nNe
37cb0 77 2d 6e 43 65 6c 6c 2c 20 70 43 41 72 72 61 79  w-nCell, pCArray
37cc0 0a 20 20 29 20 29 20 67 6f 74 6f 20 65 64 69 74  .  ) ) goto edit
37cd0 70 61 67 65 5f 66 61 69 6c 3b 0a 0a 20 20 70 50  page_fail;..  pP
37ce0 67 2d 3e 6e 43 65 6c 6c 20 3d 20 6e 4e 65 77 3b  g->nCell = nNew;
37cf0 0a 20 20 70 50 67 2d 3e 6e 4f 76 65 72 66 6c 6f  .  pPg->nOverflo
37d00 77 20 3d 20 30 3b 0a 0a 20 20 70 75 74 32 62 79  w = 0;..  put2by
37d10 74 65 28 26 61 44 61 74 61 5b 68 64 72 2b 33 5d  te(&aData[hdr+3]
37d20 2c 20 70 50 67 2d 3e 6e 43 65 6c 6c 29 3b 0a 20  , pPg->nCell);. 
37d30 20 70 75 74 32 62 79 74 65 28 26 61 44 61 74 61   put2byte(&aData
37d40 5b 68 64 72 2b 35 5d 2c 20 70 44 61 74 61 20 2d  [hdr+5], pData -
37d50 20 61 44 61 74 61 29 3b 0a 0a 23 69 66 64 65 66   aData);..#ifdef
37d60 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
37d70 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4e 65 77 20  for(i=0; i<nNew 
37d80 26 26 20 21 43 4f 52 52 55 50 54 5f 44 42 3b 20  && !CORRUPT_DB; 
37d90 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70 43  i++){.    u8 *pC
37da0 65 6c 6c 20 3d 20 70 43 41 72 72 61 79 2d 3e 61  ell = pCArray->a
37db0 70 43 65 6c 6c 5b 69 2b 69 4e 65 77 5d 3b 0a 20  pCell[i+iNew];. 
37dc0 20 20 20 69 6e 74 20 69 4f 66 66 20 3d 20 67 65     int iOff = ge
37dd0 74 32 62 79 74 65 28 26 70 50 67 2d 3e 61 43 65  t2byte(&pPg->aCe
37de0 6c 6c 49 64 78 5b 69 2a 32 5d 29 3b 0a 20 20 20  llIdx[i*2]);.   
37df0 20 69 66 28 20 70 43 65 6c 6c 3e 3d 61 44 61 74   if( pCell>=aDat
37e00 61 20 26 26 20 70 43 65 6c 6c 3c 26 61 44 61 74  a && pCell<&aDat
37e10 61 5b 70 50 67 2d 3e 70 42 74 2d 3e 75 73 61 62  a[pPg->pBt->usab
37e20 6c 65 53 69 7a 65 5d 20 29 7b 0a 20 20 20 20 20  leSize] ){.     
37e30 20 70 43 65 6c 6c 20 3d 20 26 70 54 6d 70 5b 70   pCell = &pTmp[p
37e40 43 65 6c 6c 20 2d 20 61 44 61 74 61 5d 3b 0a 20  Cell - aData];. 
37e50 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
37e60 20 30 3d 3d 6d 65 6d 63 6d 70 28 70 43 65 6c 6c   0==memcmp(pCell
37e70 2c 20 26 61 44 61 74 61 5b 69 4f 66 66 5d 2c 0a  , &aData[iOff],.
37e80 20 20 20 20 20 20 20 20 20 20 20 20 70 43 41 72              pCAr
37e90 72 61 79 2d 3e 70 52 65 66 2d 3e 78 43 65 6c 6c  ray->pRef->xCell
37ea0 53 69 7a 65 28 70 43 41 72 72 61 79 2d 3e 70 52  Size(pCArray->pR
37eb0 65 66 2c 20 70 43 41 72 72 61 79 2d 3e 61 70 43  ef, pCArray->apC
37ec0 65 6c 6c 5b 69 2b 69 4e 65 77 5d 29 29 20 29 3b  ell[i+iNew])) );
37ed0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72  .  }.#endif..  r
37ee0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
37ef0 0a 20 65 64 69 74 70 61 67 65 5f 66 61 69 6c 3a  . editpage_fail:
37f00 0a 20 20 2f 2a 20 55 6e 61 62 6c 65 20 74 6f 20  .  /* Unable to 
37f10 65 64 69 74 20 74 68 69 73 20 70 61 67 65 2e 20  edit this page. 
37f20 52 65 62 75 69 6c 64 20 69 74 20 66 72 6f 6d 20  Rebuild it from 
37f30 73 63 72 61 74 63 68 20 69 6e 73 74 65 61 64 2e  scratch instead.
37f40 20 2a 2f 0a 20 20 70 6f 70 75 6c 61 74 65 43 65   */.  populateCe
37f50 6c 6c 43 61 63 68 65 28 70 43 41 72 72 61 79 2c  llCache(pCArray,
37f60 20 69 4e 65 77 2c 20 6e 4e 65 77 29 3b 0a 20 20   iNew, nNew);.  
37f70 72 65 74 75 72 6e 20 72 65 62 75 69 6c 64 50 61  return rebuildPa
37f80 67 65 28 70 50 67 2c 20 6e 4e 65 77 2c 20 26 70  ge(pPg, nNew, &p
37f90 43 41 72 72 61 79 2d 3e 61 70 43 65 6c 6c 5b 69  CArray->apCell[i
37fa0 4e 65 77 5d 2c 20 26 70 43 41 72 72 61 79 2d 3e  New], &pCArray->
37fb0 73 7a 43 65 6c 6c 5b 69 4e 65 77 5d 29 3b 0a 7d  szCell[iNew]);.}
37fc0 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
37fd0 6f 77 69 6e 67 20 70 61 72 61 6d 65 74 65 72 73  owing parameters
37fe0 20 64 65 74 65 72 6d 69 6e 65 20 68 6f 77 20 6d   determine how m
37ff0 61 6e 79 20 61 64 6a 61 63 65 6e 74 20 70 61 67  any adjacent pag
38000 65 73 20 67 65 74 20 69 6e 76 6f 6c 76 65 64 0a  es get involved.
38010 2a 2a 20 69 6e 20 61 20 62 61 6c 61 6e 63 69 6e  ** in a balancin
38020 67 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 4e 4e  g operation.  NN
38030 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
38040 66 20 6e 65 69 67 68 62 6f 72 73 20 6f 6e 20 65  f neighbors on e
38050 69 74 68 65 72 20 73 69 64 65 0a 2a 2a 20 6f 66  ither side.** of
38060 20 74 68 65 20 70 61 67 65 20 74 68 61 74 20 70   the page that p
38070 61 72 74 69 63 69 70 61 74 65 20 69 6e 20 74 68  articipate in th
38080 65 20 62 61 6c 61 6e 63 69 6e 67 20 6f 70 65 72  e balancing oper
38090 61 74 69 6f 6e 2e 20 20 4e 42 20 69 73 20 74 68  ation.  NB is th
380a0 65 0a 2a 2a 20 74 6f 74 61 6c 20 6e 75 6d 62 65  e.** total numbe
380b0 72 20 6f 66 20 70 61 67 65 73 20 74 68 61 74 20  r of pages that 
380c0 70 61 72 74 69 63 69 70 61 74 65 2c 20 69 6e 63  participate, inc
380d0 6c 75 64 69 6e 67 20 74 68 65 20 74 61 72 67 65  luding the targe
380e0 74 20 70 61 67 65 20 61 6e 64 0a 2a 2a 20 4e 4e  t page and.** NN
380f0 20 6e 65 69 67 68 62 6f 72 73 20 6f 6e 20 65 69   neighbors on ei
38100 74 68 65 72 20 73 69 64 65 2e 0a 2a 2a 0a 2a 2a  ther side..**.**
38110 20 54 68 65 20 6d 69 6e 69 6d 75 6d 20 76 61 6c   The minimum val
38120 75 65 20 6f 66 20 4e 4e 20 69 73 20 31 20 28 6f  ue of NN is 1 (o
38130 66 20 63 6f 75 72 73 65 29 2e 20 20 49 6e 63 72  f course).  Incr
38140 65 61 73 69 6e 67 20 4e 4e 20 61 62 6f 76 65 20  easing NN above 
38150 31 0a 2a 2a 20 28 74 6f 20 32 20 6f 72 20 33 29  1.** (to 2 or 3)
38160 20 67 69 76 65 73 20 61 20 6d 6f 64 65 73 74 20   gives a modest 
38170 69 6d 70 72 6f 76 65 6d 65 6e 74 20 69 6e 20 53  improvement in S
38180 45 4c 45 43 54 20 61 6e 64 20 44 45 4c 45 54 45  ELECT and DELETE
38190 20 70 65 72 66 6f 72 6d 61 6e 63 65 0a 2a 2a 20   performance.** 
381a0 69 6e 20 65 78 63 68 61 6e 67 65 20 66 6f 72 20  in exchange for 
381b0 61 20 6c 61 72 67 65 72 20 64 65 67 72 61 64 61  a larger degrada
381c0 74 69 6f 6e 20 69 6e 20 49 4e 53 45 52 54 20 61  tion in INSERT a
381d0 6e 64 20 55 50 44 41 54 45 20 70 65 72 66 6f 72  nd UPDATE perfor
381e0 6d 61 6e 63 65 2e 0a 2a 2a 20 54 68 65 20 76 61  mance..** The va
381f0 6c 75 65 20 6f 66 20 4e 4e 20 61 70 70 65 61 72  lue of NN appear
38200 73 20 74 6f 20 67 69 76 65 20 74 68 65 20 62 65  s to give the be
38210 73 74 20 72 65 73 75 6c 74 73 20 6f 76 65 72 61  st results overa
38220 6c 6c 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4e  ll..*/.#define N
38230 4e 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20  N 1             
38240 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6e 65 69  /* Number of nei
38250 67 68 62 6f 72 73 20 6f 6e 20 65 69 74 68 65 72  ghbors on either
38260 20 73 69 64 65 20 6f 66 20 70 50 61 67 65 20 2a   side of pPage *
38270 2f 0a 23 64 65 66 69 6e 65 20 4e 42 20 28 4e 4e  /.#define NB (NN
38280 2a 32 2b 31 29 20 20 20 20 20 20 2f 2a 20 54 6f  *2+1)      /* To
38290 74 61 6c 20 70 61 67 65 73 20 69 6e 76 6f 6c 76  tal pages involv
382a0 65 64 20 69 6e 20 74 68 65 20 62 61 6c 61 6e 63  ed in the balanc
382b0 65 20 2a 2f 0a 0a 0a 23 69 66 6e 64 65 66 20 53  e */...#ifndef S
382c0 51 4c 49 54 45 5f 4f 4d 49 54 5f 51 55 49 43 4b  QLITE_OMIT_QUICK
382d0 42 41 4c 41 4e 43 45 0a 2f 2a 0a 2a 2a 20 54 68  BALANCE./*.** Th
382e0 69 73 20 76 65 72 73 69 6f 6e 20 6f 66 20 62 61  is version of ba
382f0 6c 61 6e 63 65 28 29 20 68 61 6e 64 6c 65 73 20  lance() handles 
38300 74 68 65 20 63 6f 6d 6d 6f 6e 20 73 70 65 63 69  the common speci
38310 61 6c 20 63 61 73 65 20 77 68 65 72 65 0a 2a 2a  al case where.**
38320 20 61 20 6e 65 77 20 65 6e 74 72 79 20 69 73 20   a new entry is 
38330 62 65 69 6e 67 20 69 6e 73 65 72 74 65 64 20 6f  being inserted o
38340 6e 20 74 68 65 20 65 78 74 72 65 6d 65 20 72 69  n the extreme ri
38350 67 68 74 2d 65 6e 64 20 6f 66 20 74 68 65 0a 2a  ght-end of the.*
38360 2a 20 74 72 65 65 2c 20 69 6e 20 6f 74 68 65 72  * tree, in other
38370 20 77 6f 72 64 73 2c 20 77 68 65 6e 20 74 68 65   words, when the
38380 20 6e 65 77 20 65 6e 74 72 79 20 77 69 6c 6c 20   new entry will 
38390 62 65 63 6f 6d 65 20 74 68 65 20 6c 61 72 67 65  become the large
383a0 73 74 0a 2a 2a 20 65 6e 74 72 79 20 69 6e 20 74  st.** entry in t
383b0 68 65 20 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 49  he tree..**.** I
383c0 6e 73 74 65 61 64 20 6f 66 20 74 72 79 69 6e 67  nstead of trying
383d0 20 74 6f 20 62 61 6c 61 6e 63 65 20 74 68 65 20   to balance the 
383e0 33 20 72 69 67 68 74 2d 6d 6f 73 74 20 6c 65 61  3 right-most lea
383f0 66 20 70 61 67 65 73 2c 20 6a 75 73 74 20 61 64  f pages, just ad
38400 64 0a 2a 2a 20 61 20 6e 65 77 20 70 61 67 65 20  d.** a new page 
38410 74 6f 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e  to the right-han
38420 64 20 73 69 64 65 20 61 6e 64 20 70 75 74 20 74  d side and put t
38430 68 65 20 6f 6e 65 20 6e 65 77 20 65 6e 74 72 79  he one new entry
38440 20 69 6e 0a 2a 2a 20 74 68 61 74 20 70 61 67 65   in.** that