/ Hex Artifact Content
Login

Artifact 7dcddf0ae24076ba6ee3cda393c6211a5c6a2477:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 41 70 72 69 6c  /*.** 2004 April
0010: 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74   6.**.** The aut
0020: 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f  hor disclaims co
0030: 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20  pyright to this 
0040: 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e  source code.  In
0050: 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c   place of.** a l
0060: 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72  egal notice, her
0070: 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a  e is a blessing:
0080: 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f  .**.**    May yo
0090: 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f  u do good and no
00a0: 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61  t evil..**    Ma
00b0: 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69  y you find forgi
00c0: 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73  veness for yours
00d0: 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20  elf and forgive 
00e0: 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61  others..**    Ma
00f0: 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65  y you share free
0100: 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67  ly, never taking
0110: 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67   more than you g
0120: 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ive..**.********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 69  *.** This file i
0180: 6d 70 6c 65 6d 65 6e 74 73 20 61 6e 20 65 78 74  mplements an ext
0190: 65 72 6e 61 6c 20 28 64 69 73 6b 2d 62 61 73 65  ernal (disk-base
01a0: 64 29 20 64 61 74 61 62 61 73 65 20 75 73 69 6e  d) database usin
01b0: 67 20 42 54 72 65 65 73 2e 0a 2a 2a 20 53 65 65  g BTrees..** See
01c0: 20 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d   the header comm
01d0: 65 6e 74 20 6f 6e 20 22 62 74 72 65 65 49 6e 74  ent on "btreeInt
01e0: 2e 68 22 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  .h" for addition
01f0: 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  al information..
0200: 2a 2a 20 49 6e 63 6c 75 64 69 6e 67 20 61 20 64  ** Including a d
0210: 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 66 69  escription of fi
0220: 6c 65 20 66 6f 72 6d 61 74 20 61 6e 64 20 61 6e  le format and an
0230: 20 6f 76 65 72 76 69 65 77 20 6f 66 20 6f 70 65   overview of ope
0240: 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 6e 63 6c  ration..*/.#incl
0250: 75 64 65 20 22 62 74 72 65 65 49 6e 74 2e 68 22  ude "btreeInt.h"
0260: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 68 65 61 64  ../*.** The head
0270: 65 72 20 73 74 72 69 6e 67 20 74 68 61 74 20 61  er string that a
0280: 70 70 65 61 72 73 20 61 74 20 74 68 65 20 62 65  ppears at the be
0290: 67 69 6e 6e 69 6e 67 20 6f 66 20 65 76 65 72 79  ginning of every
02a0: 0a 2a 2a 20 53 51 4c 69 74 65 20 64 61 74 61 62  .** SQLite datab
02b0: 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ase..*/.static c
02c0: 6f 6e 73 74 20 63 68 61 72 20 7a 4d 61 67 69 63  onst char zMagic
02d0: 48 65 61 64 65 72 5b 5d 20 3d 20 53 51 4c 49 54  Header[] = SQLIT
02e0: 45 5f 46 49 4c 45 5f 48 45 41 44 45 52 3b 0a 0a  E_FILE_HEADER;..
02f0: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 69 73 20 67  /*.** Set this g
0300: 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 74  lobal variable t
0310: 6f 20 31 20 74 6f 20 65 6e 61 62 6c 65 20 74 72  o 1 to enable tr
0320: 61 63 69 6e 67 20 75 73 69 6e 67 20 74 68 65 20  acing using the 
0330: 54 52 41 43 45 0a 2a 2a 20 6d 61 63 72 6f 2e 0a  TRACE.** macro..
0340: 2a 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73 71 6c  */.#if 0.int sql
0350: 69 74 65 33 42 74 72 65 65 54 72 61 63 65 3d 31  ite3BtreeTrace=1
0360: 3b 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 6e  ;  /* True to en
0370: 61 62 6c 65 20 74 72 61 63 69 6e 67 20 2a 2f 0a  able tracing */.
0380: 23 20 64 65 66 69 6e 65 20 54 52 41 43 45 28 58  # define TRACE(X
0390: 29 20 20 69 66 28 73 71 6c 69 74 65 33 42 74 72  )  if(sqlite3Btr
03a0: 65 65 54 72 61 63 65 29 7b 70 72 69 6e 74 66 20  eeTrace){printf 
03b0: 58 3b 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29  X;fflush(stdout)
03c0: 3b 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  ;}.#else.# defin
03d0: 65 20 54 52 41 43 45 28 58 29 0a 23 65 6e 64 69  e TRACE(X).#endi
03e0: 66 0a 0a 2f 2a 0a 2a 2a 20 45 78 74 72 61 63 74  f../*.** Extract
03f0: 20 61 20 32 2d 62 79 74 65 20 62 69 67 2d 65 6e   a 2-byte big-en
0400: 64 69 61 6e 20 69 6e 74 65 67 65 72 20 66 72 6f  dian integer fro
0410: 6d 20 61 6e 20 61 72 72 61 79 20 6f 66 20 75 6e  m an array of un
0420: 73 69 67 6e 65 64 20 62 79 74 65 73 2e 0a 2a 2a  signed bytes..**
0430: 20 42 75 74 20 69 66 20 74 68 65 20 76 61 6c 75   But if the valu
0440: 65 20 69 73 20 7a 65 72 6f 2c 20 6d 61 6b 65 20  e is zero, make 
0450: 69 74 20 36 35 35 33 36 2e 0a 2a 2a 0a 2a 2a 20  it 65536..**.** 
0460: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
0470: 75 73 65 64 20 74 6f 20 65 78 74 72 61 63 74 20  used to extract 
0480: 74 68 65 20 22 6f 66 66 73 65 74 20 74 6f 20 63  the "offset to c
0490: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
04a0: 22 20 76 61 6c 75 65 0a 2a 2a 20 66 72 6f 6d 20  " value.** from 
04b0: 74 68 65 20 68 65 61 64 65 72 20 6f 66 20 61 20  the header of a 
04c0: 62 74 72 65 65 20 70 61 67 65 2e 20 20 49 66 20  btree page.  If 
04d0: 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73  the page size is
04e0: 20 36 35 35 33 36 20 61 6e 64 20 74 68 65 20 70   65536 and the p
04f0: 61 67 65 0a 2a 2a 20 69 73 20 65 6d 70 74 79 2c  age.** is empty,
0500: 20 74 68 65 20 6f 66 66 73 65 74 20 73 68 6f 75   the offset shou
0510: 6c 64 20 62 65 20 36 35 35 33 36 2c 20 62 75 74  ld be 65536, but
0520: 20 74 68 65 20 32 2d 62 79 74 65 20 76 61 6c 75   the 2-byte valu
0530: 65 20 73 74 6f 72 65 73 20 7a 65 72 6f 2e 0a 2a  e stores zero..*
0540: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d  * This routine m
0550: 61 6b 65 73 20 74 68 65 20 6e 65 63 65 73 73 61  akes the necessa
0560: 72 79 20 61 64 6a 75 73 74 6d 65 6e 74 20 74 6f  ry adjustment to
0570: 20 36 35 35 33 36 2e 0a 2a 2f 0a 23 64 65 66 69   65536..*/.#defi
0580: 6e 65 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65  ne get2byteNotZe
0590: 72 6f 28 58 29 20 20 28 28 28 28 28 69 6e 74 29  ro(X)  (((((int)
05a0: 67 65 74 32 62 79 74 65 28 58 29 29 2d 31 29 26  get2byte(X))-1)&
05b0: 30 78 66 66 66 66 29 2b 31 29 0a 0a 2f 2a 0a 2a  0xffff)+1)../*.*
05c0: 2a 20 56 61 6c 75 65 73 20 70 61 73 73 65 64 20  * Values passed 
05d0: 61 73 20 74 68 65 20 35 74 68 20 61 72 67 75 6d  as the 5th argum
05e0: 65 6e 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 42  ent to allocateB
05f0: 74 72 65 65 50 61 67 65 28 29 0a 2a 2f 0a 23 64  treePage().*/.#d
0600: 65 66 69 6e 65 20 42 54 41 4c 4c 4f 43 5f 41 4e  efine BTALLOC_AN
0610: 59 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20  Y   0           
0620: 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 79 20  /* Allocate any 
0630: 70 61 67 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20  page */.#define 
0640: 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20 31 20  BTALLOC_EXACT 1 
0650: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c            /* All
0660: 6f 63 61 74 65 20 65 78 61 63 74 20 70 61 67 65  ocate exact page
0670: 20 69 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a   if possible */.
0680: 23 64 65 66 69 6e 65 20 42 54 41 4c 4c 4f 43 5f  #define BTALLOC_
0690: 4c 45 20 20 20 20 32 20 20 20 20 20 20 20 20 20  LE    2         
06a0: 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e    /* Allocate an
06b0: 79 20 70 61 67 65 20 3c 3d 20 74 68 65 20 70 61  y page <= the pa
06c0: 72 61 6d 65 74 65 72 20 2a 2f 0a 0a 2f 2a 0a 2a  rameter */../*.*
06d0: 2a 20 4d 61 63 72 6f 20 49 66 4e 6f 74 4f 6d 69  * Macro IfNotOmi
06e0: 74 41 56 28 78 29 20 72 65 74 75 72 6e 73 20 28  tAV(x) returns (
06f0: 78 29 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49  x) if SQLITE_OMI
0700: 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 69 73 20  T_AUTOVACUUM is 
0710: 6e 6f 74 20 0a 2a 2a 20 64 65 66 69 6e 65 64 2c  not .** defined,
0720: 20 6f 72 20 30 20 69 66 20 69 74 20 69 73 2e 20   or 0 if it is. 
0730: 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a  For example:.**.
0740: 2a 2a 20 20 20 62 49 6e 63 72 56 61 63 75 75 6d  **   bIncrVacuum
0750: 20 3d 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70   = IfNotOmitAV(p
0760: 42 74 53 68 61 72 65 64 2d 3e 69 6e 63 72 56 61  BtShared->incrVa
0770: 63 75 75 6d 29 3b 0a 2a 2f 0a 23 69 66 6e 64 65  cuum);.*/.#ifnde
0780: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
0790: 54 4f 56 41 43 55 55 4d 0a 23 64 65 66 69 6e 65  TOVACUUM.#define
07a0: 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 65 78 70   IfNotOmitAV(exp
07b0: 72 29 20 28 65 78 70 72 29 0a 23 65 6c 73 65 0a  r) (expr).#else.
07c0: 23 64 65 66 69 6e 65 20 49 66 4e 6f 74 4f 6d 69  #define IfNotOmi
07d0: 74 41 56 28 65 78 70 72 29 20 30 0a 23 65 6e 64  tAV(expr) 0.#end
07e0: 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
07f0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
0800: 41 43 48 45 0a 2f 2a 0a 2a 2a 20 41 20 6c 69 73  ACHE./*.** A lis
0810: 74 20 6f 66 20 42 74 53 68 61 72 65 64 20 6f 62  t of BtShared ob
0820: 6a 65 63 74 73 20 74 68 61 74 20 61 72 65 20 65  jects that are e
0830: 6c 69 67 69 62 6c 65 20 66 6f 72 20 70 61 72 74  ligible for part
0840: 69 63 69 70 61 74 69 6f 6e 0a 2a 2a 20 69 6e 20  icipation.** in 
0850: 73 68 61 72 65 64 20 63 61 63 68 65 2e 20 20 54  shared cache.  T
0860: 68 69 73 20 76 61 72 69 61 62 6c 65 20 68 61 73  his variable has
0870: 20 66 69 6c 65 20 73 63 6f 70 65 20 64 75 72 69   file scope duri
0880: 6e 67 20 6e 6f 72 6d 61 6c 20 62 75 69 6c 64 73  ng normal builds
0890: 2c 0a 2a 2a 20 62 75 74 20 74 68 65 20 74 65 73  ,.** but the tes
08a0: 74 20 68 61 72 6e 65 73 73 20 6e 65 65 64 73 20  t harness needs 
08b0: 74 6f 20 61 63 63 65 73 73 20 69 74 20 73 6f 20  to access it so 
08c0: 77 65 20 6d 61 6b 65 20 69 74 20 67 6c 6f 62 61  we make it globa
08d0: 6c 20 66 6f 72 20 0a 2a 2a 20 74 65 73 74 20 62  l for .** test b
08e0: 75 69 6c 64 73 2e 0a 2a 2a 0a 2a 2a 20 41 63 63  uilds..**.** Acc
08f0: 65 73 73 20 74 6f 20 74 68 69 73 20 76 61 72 69  ess to this vari
0900: 61 62 6c 65 20 69 73 20 70 72 6f 74 65 63 74 65  able is protecte
0910: 64 20 62 79 20 53 51 4c 49 54 45 5f 4d 55 54 45  d by SQLITE_MUTE
0920: 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 2e  X_STATIC_MASTER.
0930: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
0940: 45 5f 54 45 53 54 0a 42 74 53 68 61 72 65 64 20  E_TEST.BtShared 
0950: 2a 53 51 4c 49 54 45 5f 57 53 44 20 73 71 6c 69  *SQLITE_WSD sqli
0960: 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69  te3SharedCacheLi
0970: 73 74 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 73 74  st = 0;.#else.st
0980: 61 74 69 63 20 42 74 53 68 61 72 65 64 20 2a 53  atic BtShared *S
0990: 51 4c 49 54 45 5f 57 53 44 20 73 71 6c 69 74 65  QLITE_WSD sqlite
09a0: 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74  3SharedCacheList
09b0: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 65 6e   = 0;.#endif.#en
09c0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
09d0: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20  IT_SHARED_CACHE 
09e0: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
09f0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
0a00: 41 43 48 45 0a 2f 2a 0a 2a 2a 20 45 6e 61 62 6c  ACHE./*.** Enabl
0a10: 65 20 6f 72 20 64 69 73 61 62 6c 65 20 74 68 65  e or disable the
0a20: 20 73 68 61 72 65 64 20 70 61 67 65 72 20 61 6e   shared pager an
0a30: 64 20 73 63 68 65 6d 61 20 66 65 61 74 75 72 65  d schema feature
0a40: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  s..**.** This ro
0a50: 75 74 69 6e 65 20 68 61 73 20 6e 6f 20 65 66 66  utine has no eff
0a60: 65 63 74 20 6f 6e 20 65 78 69 73 74 69 6e 67 20  ect on existing 
0a70: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
0a80: 69 6f 6e 73 2e 0a 2a 2a 20 54 68 65 20 73 68 61  ions..** The sha
0a90: 72 65 64 20 63 61 63 68 65 20 73 65 74 74 69 6e  red cache settin
0aa0: 67 20 65 66 66 65 63 74 73 20 6f 6e 6c 79 20 66  g effects only f
0ab0: 75 74 75 72 65 20 63 61 6c 6c 73 20 74 6f 0a 2a  uture calls to.*
0ac0: 2a 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29  * sqlite3_open()
0ad0: 2c 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36  , sqlite3_open16
0ae0: 28 29 2c 20 6f 72 20 73 71 6c 69 74 65 33 5f 6f  (), or sqlite3_o
0af0: 70 65 6e 5f 76 32 28 29 2e 0a 2a 2f 0a 69 6e 74  pen_v2()..*/.int
0b00: 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f   sqlite3_enable_
0b10: 73 68 61 72 65 64 5f 63 61 63 68 65 28 69 6e 74  shared_cache(int
0b20: 20 65 6e 61 62 6c 65 29 7b 0a 20 20 73 71 6c 69   enable){.  sqli
0b30: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
0b40: 73 68 61 72 65 64 43 61 63 68 65 45 6e 61 62 6c  sharedCacheEnabl
0b50: 65 64 20 3d 20 65 6e 61 62 6c 65 3b 0a 20 20 72  ed = enable;.  r
0b60: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
0b70: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 0a 23 69 66  .}.#endif....#if
0b80: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
0b90: 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 2f  SHARED_CACHE.  /
0ba0: 2a 0a 20 20 2a 2a 20 54 68 65 20 66 75 6e 63 74  *.  ** The funct
0bb0: 69 6f 6e 73 20 71 75 65 72 79 53 68 61 72 65 64  ions queryShared
0bc0: 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29  CacheTableLock()
0bd0: 2c 20 73 65 74 53 68 61 72 65 64 43 61 63 68 65  , setSharedCache
0be0: 54 61 62 6c 65 4c 6f 63 6b 28 29 2c 0a 20 20 2a  TableLock(),.  *
0bf0: 2a 20 61 6e 64 20 63 6c 65 61 72 41 6c 6c 53 68  * and clearAllSh
0c00: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
0c10: 63 6b 73 28 29 0a 20 20 2a 2a 20 6d 61 6e 69 70  cks().  ** manip
0c20: 75 6c 61 74 65 20 65 6e 74 72 69 65 73 20 69 6e  ulate entries in
0c30: 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 4c   the BtShared.pL
0c40: 6f 63 6b 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  ock linked list 
0c50: 75 73 65 64 20 74 6f 20 73 74 6f 72 65 0a 20 20  used to store.  
0c60: 2a 2a 20 73 68 61 72 65 64 2d 63 61 63 68 65 20  ** shared-cache 
0c70: 74 61 62 6c 65 20 6c 65 76 65 6c 20 6c 6f 63 6b  table level lock
0c80: 73 2e 20 49 66 20 74 68 65 20 6c 69 62 72 61 72  s. If the librar
0c90: 79 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 77 69  y is compiled wi
0ca0: 74 68 20 74 68 65 0a 20 20 2a 2a 20 73 68 61 72  th the.  ** shar
0cb0: 65 64 2d 63 61 63 68 65 20 66 65 61 74 75 72 65  ed-cache feature
0cc0: 20 64 69 73 61 62 6c 65 64 2c 20 74 68 65 6e 20   disabled, then 
0cd0: 74 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 65 76  there is only ev
0ce0: 65 72 20 6f 6e 65 20 75 73 65 72 0a 20 20 2a 2a  er one user.  **
0cf0: 20 6f 66 20 65 61 63 68 20 42 74 53 68 61 72 65   of each BtShare
0d00: 64 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20  d structure and 
0d10: 73 6f 20 74 68 69 73 20 6c 6f 63 6b 69 6e 67 20  so this locking 
0d20: 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79  is not necessary
0d30: 2e 20 0a 20 20 2a 2a 20 53 6f 20 64 65 66 69 6e  . .  ** So defin
0d40: 65 20 74 68 65 20 6c 6f 63 6b 20 72 65 6c 61 74  e the lock relat
0d50: 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 61 73 20  ed functions as 
0d60: 6e 6f 2d 6f 70 73 2e 0a 20 20 2a 2f 0a 20 20 23  no-ops..  */.  #
0d70: 64 65 66 69 6e 65 20 71 75 65 72 79 53 68 61 72  define queryShar
0d80: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
0d90: 28 61 2c 62 2c 63 29 20 53 51 4c 49 54 45 5f 4f  (a,b,c) SQLITE_O
0da0: 4b 0a 20 20 23 64 65 66 69 6e 65 20 73 65 74 53  K.  #define setS
0db0: 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
0dc0: 6f 63 6b 28 61 2c 62 2c 63 29 20 53 51 4c 49 54  ock(a,b,c) SQLIT
0dd0: 45 5f 4f 4b 0a 20 20 23 64 65 66 69 6e 65 20 63  E_OK.  #define c
0de0: 6c 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63  learAllSharedCac
0df0: 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a  heTableLocks(a).
0e00: 20 20 23 64 65 66 69 6e 65 20 64 6f 77 6e 67 72    #define downgr
0e10: 61 64 65 41 6c 6c 53 68 61 72 65 64 43 61 63 68  adeAllSharedCach
0e20: 65 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a 20  eTableLocks(a). 
0e30: 20 23 64 65 66 69 6e 65 20 68 61 73 53 68 61 72   #define hasShar
0e40: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
0e50: 28 61 2c 62 2c 63 2c 64 29 20 31 0a 20 20 23 64  (a,b,c,d) 1.  #d
0e60: 65 66 69 6e 65 20 68 61 73 52 65 61 64 43 6f 6e  efine hasReadCon
0e70: 66 6c 69 63 74 73 28 61 2c 20 62 29 20 30 0a 23  flicts(a, b) 0.#
0e80: 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53  endif..#ifndef S
0e90: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
0ea0: 44 5f 43 41 43 48 45 0a 0a 23 69 66 64 65 66 20  D_CACHE..#ifdef 
0eb0: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a  SQLITE_DEBUG./*.
0ec0: 2a 2a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  **** This functi
0ed0: 6f 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20  on is only used 
0ee0: 61 73 20 70 61 72 74 20 6f 66 20 61 6e 20 61 73  as part of an as
0ef0: 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
0f00: 2e 20 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 43 68 65 63  . ***.**.** Chec
0f10: 6b 20 74 6f 20 73 65 65 20 69 66 20 70 42 74 72  k to see if pBtr
0f20: 65 65 20 68 6f 6c 64 73 20 74 68 65 20 72 65 71  ee holds the req
0f30: 75 69 72 65 64 20 6c 6f 63 6b 73 20 74 6f 20 72  uired locks to r
0f40: 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 6f 20  ead or write to 
0f50: 74 68 65 20 0a 2a 2a 20 74 61 62 6c 65 20 77 69  the .** table wi
0f60: 74 68 20 72 6f 6f 74 20 70 61 67 65 20 69 52 6f  th root page iRo
0f70: 6f 74 2e 20 20 20 52 65 74 75 72 6e 20 31 20 69  ot.   Return 1 i
0f80: 66 20 69 74 20 64 6f 65 73 20 61 6e 64 20 30 20  f it does and 0 
0f90: 69 66 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f  if not..**.** Fo
0fa0: 72 20 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e 20  r example, when 
0fb0: 77 72 69 74 69 6e 67 20 74 6f 20 61 20 74 61 62  writing to a tab
0fc0: 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67  le with root-pag
0fd0: 65 20 69 52 6f 6f 74 20 76 69 61 20 0a 2a 2a 20  e iRoot via .** 
0fe0: 42 74 72 65 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  Btree connection
0ff0: 20 70 42 74 72 65 65 3a 0a 2a 2a 0a 2a 2a 20 20   pBtree:.**.**  
1000: 20 20 61 73 73 65 72 74 28 20 68 61 73 53 68 61    assert( hasSha
1010: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
1020: 6b 28 70 42 74 72 65 65 2c 20 69 52 6f 6f 74 2c  k(pBtree, iRoot,
1030: 20 30 2c 20 57 52 49 54 45 5f 4c 4f 43 4b 29 20   0, WRITE_LOCK) 
1040: 29 3b 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77 72  );.**.** When wr
1050: 69 74 69 6e 67 20 74 6f 20 61 6e 20 69 6e 64 65  iting to an inde
1060: 78 20 74 68 61 74 20 72 65 73 69 64 65 73 20 69  x that resides i
1070: 6e 20 61 20 73 68 61 72 61 62 6c 65 20 64 61 74  n a sharable dat
1080: 61 62 61 73 65 2c 20 74 68 65 20 0a 2a 2a 20 63  abase, the .** c
1090: 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20 68 61 76  aller should hav
10a0: 65 20 66 69 72 73 74 20 6f 62 74 61 69 6e 65 64  e first obtained
10b0: 20 61 20 6c 6f 63 6b 20 73 70 65 63 69 66 79 69   a lock specifyi
10c0: 6e 67 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  ng the root page
10d0: 20 6f 66 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65   of.** the corre
10e0: 73 70 6f 6e 64 69 6e 67 20 74 61 62 6c 65 2e 20  sponding table. 
10f0: 54 68 69 73 20 6d 61 6b 65 73 20 74 68 69 6e 67  This makes thing
1100: 73 20 61 20 62 69 74 20 6d 6f 72 65 20 63 6f 6d  s a bit more com
1110: 70 6c 69 63 61 74 65 64 2c 0a 2a 2a 20 61 73 20  plicated,.** as 
1120: 74 68 69 73 20 6d 6f 64 75 6c 65 20 74 72 65 61  this module trea
1130: 74 73 20 65 61 63 68 20 74 61 62 6c 65 20 61 73  ts each table as
1140: 20 61 20 73 65 70 61 72 61 74 65 20 73 74 72 75   a separate stru
1150: 63 74 75 72 65 2e 20 54 6f 20 64 65 74 65 72 6d  cture. To determ
1160: 69 6e 65 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65  ine.** the table
1170: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
1180: 6f 20 74 68 65 20 69 6e 64 65 78 20 62 65 69 6e  o the index bein
1190: 67 20 77 72 69 74 74 65 6e 2c 20 74 68 69 73 0a  g written, this.
11a0: 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20  ** function has 
11b0: 74 6f 20 73 65 61 72 63 68 20 74 68 72 6f 75 67  to search throug
11c0: 68 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  h the database s
11d0: 63 68 65 6d 61 2e 0a 2a 2a 0a 2a 2a 20 49 6e 73  chema..**.** Ins
11e0: 74 65 61 64 20 6f 66 20 61 20 6c 6f 63 6b 20 6f  tead of a lock o
11f0: 6e 20 74 68 65 20 74 61 62 6c 65 2f 69 6e 64 65  n the table/inde
1200: 78 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67 65  x rooted at page
1210: 20 69 52 6f 6f 74 2c 20 74 68 65 20 63 61 6c 6c   iRoot, the call
1220: 65 72 20 6d 61 79 0a 2a 2a 20 68 6f 6c 64 20 61  er may.** hold a
1230: 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74   write-lock on t
1240: 68 65 20 73 63 68 65 6d 61 20 74 61 62 6c 65 20  he schema table 
1250: 28 72 6f 6f 74 20 70 61 67 65 20 31 29 2e 20 54  (root page 1). T
1260: 68 69 73 20 69 73 20 61 6c 73 6f 0a 2a 2a 20 61  his is also.** a
1270: 63 63 65 70 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74  cceptable..*/.st
1280: 61 74 69 63 20 69 6e 74 20 68 61 73 53 68 61 72  atic int hasShar
1290: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
12a0: 28 0a 20 20 42 74 72 65 65 20 2a 70 42 74 72 65  (.  Btree *pBtre
12b0: 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61  e,         /* Ha
12c0: 6e 64 6c 65 20 74 68 61 74 20 6d 75 73 74 20 68  ndle that must h
12d0: 6f 6c 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 50 67  old lock */.  Pg
12e0: 6e 6f 20 69 52 6f 6f 74 2c 20 20 20 20 20 20 20  no iRoot,       
12f0: 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67       /* Root pag
1300: 65 20 6f 66 20 62 2d 74 72 65 65 20 2a 2f 0a 20  e of b-tree */. 
1310: 20 69 6e 74 20 69 73 49 6e 64 65 78 2c 20 20 20   int isIndex,   
1320: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
1330: 69 66 20 69 52 6f 6f 74 20 69 73 20 74 68 65 20  if iRoot is the 
1340: 72 6f 6f 74 20 6f 66 20 61 6e 20 69 6e 64 65 78  root of an index
1350: 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74   b-tree */.  int
1360: 20 65 4c 6f 63 6b 54 79 70 65 20 20 20 20 20 20   eLockType      
1370: 20 20 20 20 2f 2a 20 52 65 71 75 69 72 65 64 20      /* Required 
1380: 6c 6f 63 6b 20 74 79 70 65 20 28 52 45 41 44 5f  lock type (READ_
1390: 4c 4f 43 4b 20 6f 72 20 57 52 49 54 45 5f 4c 4f  LOCK or WRITE_LO
13a0: 43 4b 29 20 2a 2f 0a 29 7b 0a 20 20 53 63 68 65  CK) */.){.  Sche
13b0: 6d 61 20 2a 70 53 63 68 65 6d 61 20 3d 20 28 53  ma *pSchema = (S
13c0: 63 68 65 6d 61 20 2a 29 70 42 74 72 65 65 2d 3e  chema *)pBtree->
13d0: 70 42 74 2d 3e 70 53 63 68 65 6d 61 3b 0a 20 20  pBt->pSchema;.  
13e0: 50 67 6e 6f 20 69 54 61 62 20 3d 20 30 3b 0a 20  Pgno iTab = 0;. 
13f0: 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 3b 0a   BtLock *pLock;.
1400: 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 64 61  .  /* If this da
1410: 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20 73 68  tabase is not sh
1420: 61 72 65 61 62 6c 65 2c 20 6f 72 20 69 66 20 74  areable, or if t
1430: 68 65 20 63 6c 69 65 6e 74 20 69 73 20 72 65 61  he client is rea
1440: 64 69 6e 67 0a 20 20 2a 2a 20 61 6e 64 20 68 61  ding.  ** and ha
1450: 73 20 74 68 65 20 72 65 61 64 2d 75 6e 63 6f 6d  s the read-uncom
1460: 6d 69 74 74 65 64 20 66 6c 61 67 20 73 65 74 2c  mitted flag set,
1470: 20 74 68 65 6e 20 6e 6f 20 6c 6f 63 6b 20 69 73   then no lock is
1480: 20 72 65 71 75 69 72 65 64 2e 20 0a 20 20 2a 2a   required. .  **
1490: 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 6d 6d   Return true imm
14a0: 65 64 69 61 74 65 6c 79 2e 0a 20 20 2a 2f 0a 20  ediately..  */. 
14b0: 20 69 66 28 20 28 70 42 74 72 65 65 2d 3e 73 68   if( (pBtree->sh
14c0: 61 72 61 62 6c 65 3d 3d 30 29 0a 20 20 20 7c 7c  arable==0).   ||
14d0: 20 28 65 4c 6f 63 6b 54 79 70 65 3d 3d 52 45 41   (eLockType==REA
14e0: 44 5f 4c 4f 43 4b 20 26 26 20 28 70 42 74 72 65  D_LOCK && (pBtre
14f0: 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  e->db->flags & S
1500: 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d  QLITE_ReadUncomm
1510: 69 74 74 65 64 29 29 0a 20 20 29 7b 0a 20 20 20  itted)).  ){.   
1520: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a   return 1;.  }..
1530: 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6c 69 65    /* If the clie
1540: 6e 74 20 69 73 20 72 65 61 64 69 6e 67 20 20 6f  nt is reading  o
1550: 72 20 77 72 69 74 69 6e 67 20 61 6e 20 69 6e 64  r writing an ind
1560: 65 78 20 61 6e 64 20 74 68 65 20 73 63 68 65 6d  ex and the schem
1570: 61 20 69 73 0a 20 20 2a 2a 20 6e 6f 74 20 6c 6f  a is.  ** not lo
1580: 61 64 65 64 2c 20 74 68 65 6e 20 69 74 20 69 73  aded, then it is
1590: 20 74 6f 6f 20 64 69 66 66 69 63 75 6c 74 20 74   too difficult t
15a0: 6f 20 61 63 74 75 61 6c 6c 79 20 63 68 65 63 6b  o actually check
15b0: 20 74 6f 20 73 65 65 20 69 66 0a 20 20 2a 2a 20   to see if.  ** 
15c0: 74 68 65 20 63 6f 72 72 65 63 74 20 6c 6f 63 6b  the correct lock
15d0: 73 20 61 72 65 20 68 65 6c 64 2e 20 20 53 6f 20  s are held.  So 
15e0: 64 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20 2d 20  do not bother - 
15f0: 6a 75 73 74 20 72 65 74 75 72 6e 20 74 72 75 65  just return true
1600: 2e 0a 20 20 2a 2a 20 54 68 69 73 20 63 61 73 65  ..  ** This case
1610: 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6d 65 20 75   does not come u
1620: 70 20 76 65 72 79 20 6f 66 74 65 6e 20 61 6e 79  p very often any
1630: 68 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  how..  */.  if( 
1640: 69 73 49 6e 64 65 78 20 26 26 20 28 21 70 53 63  isIndex && (!pSc
1650: 68 65 6d 61 20 7c 7c 20 28 70 53 63 68 65 6d 61  hema || (pSchema
1660: 2d 3e 73 63 68 65 6d 61 46 6c 61 67 73 26 44 42  ->schemaFlags&DB
1670: 5f 53 63 68 65 6d 61 4c 6f 61 64 65 64 29 3d 3d  _SchemaLoaded)==
1680: 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  0) ){.    return
1690: 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69   1;.  }..  /* Fi
16a0: 67 75 72 65 20 6f 75 74 20 74 68 65 20 72 6f 6f  gure out the roo
16b0: 74 2d 70 61 67 65 20 74 68 61 74 20 74 68 65 20  t-page that the 
16c0: 6c 6f 63 6b 20 73 68 6f 75 6c 64 20 62 65 20 68  lock should be h
16d0: 65 6c 64 20 6f 6e 2e 20 46 6f 72 20 74 61 62 6c  eld on. For tabl
16e0: 65 0a 20 20 2a 2a 20 62 2d 74 72 65 65 73 2c 20  e.  ** b-trees, 
16f0: 74 68 69 73 20 69 73 20 6a 75 73 74 20 74 68 65  this is just the
1700: 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 68   root page of th
1710: 65 20 62 2d 74 72 65 65 20 62 65 69 6e 67 20 72  e b-tree being r
1720: 65 61 64 20 6f 72 0a 20 20 2a 2a 20 77 72 69 74  ead or.  ** writ
1730: 74 65 6e 2e 20 46 6f 72 20 69 6e 64 65 78 20 62  ten. For index b
1740: 2d 74 72 65 65 73 2c 20 69 74 20 69 73 20 74 68  -trees, it is th
1750: 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74  e root page of t
1760: 68 65 20 61 73 73 6f 63 69 61 74 65 64 0a 20 20  he associated.  
1770: 2a 2a 20 74 61 62 6c 65 2e 20 20 2a 2f 0a 20 20  ** table.  */.  
1780: 69 66 28 20 69 73 49 6e 64 65 78 20 29 7b 0a 20  if( isIndex ){. 
1790: 20 20 20 48 61 73 68 45 6c 65 6d 20 2a 70 3b 0a     HashElem *p;.
17a0: 20 20 20 20 66 6f 72 28 70 3d 73 71 6c 69 74 65      for(p=sqlite
17b0: 48 61 73 68 46 69 72 73 74 28 26 70 53 63 68 65  HashFirst(&pSche
17c0: 6d 61 2d 3e 69 64 78 48 61 73 68 29 3b 20 70 3b  ma->idxHash); p;
17d0: 20 70 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78   p=sqliteHashNex
17e0: 74 28 70 29 29 7b 0a 20 20 20 20 20 20 49 6e 64  t(p)){.      Ind
17f0: 65 78 20 2a 70 49 64 78 20 3d 20 28 49 6e 64 65  ex *pIdx = (Inde
1800: 78 20 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61  x *)sqliteHashDa
1810: 74 61 28 70 29 3b 0a 20 20 20 20 20 20 69 66 28  ta(p);.      if(
1820: 20 70 49 64 78 2d 3e 74 6e 75 6d 3d 3d 28 69 6e   pIdx->tnum==(in
1830: 74 29 69 52 6f 6f 74 20 29 7b 0a 20 20 20 20 20  t)iRoot ){.     
1840: 20 20 20 69 66 28 20 69 54 61 62 20 29 7b 0a 20     if( iTab ){. 
1850: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 77 6f 20           /* Two 
1860: 6f 72 20 6d 6f 72 65 20 69 6e 64 65 78 65 73 20  or more indexes 
1870: 73 68 61 72 65 20 74 68 65 20 73 61 6d 65 20 72  share the same r
1880: 6f 6f 74 20 70 61 67 65 2e 20 20 54 68 65 72 65  oot page.  There
1890: 20 6d 75 73 74 0a 20 20 20 20 20 20 20 20 20 20   must.          
18a0: 2a 2a 20 62 65 20 69 6d 70 6f 73 74 65 72 20 74  ** be imposter t
18b0: 61 62 6c 65 73 2e 20 20 53 6f 20 6a 75 73 74 20  ables.  So just 
18c0: 72 65 74 75 72 6e 20 74 72 75 65 2e 20 20 54 68  return true.  Th
18d0: 65 20 61 73 73 65 72 74 20 69 73 20 6e 6f 74 0a  e assert is not.
18e0: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 75 73 65            ** use
18f0: 66 75 6c 20 69 6e 20 74 68 61 74 20 63 61 73 65  ful in that case
1900: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72  . */.          r
1910: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20  eturn 1;.       
1920: 20 7d 0a 20 20 20 20 20 20 20 20 69 54 61 62 20   }.        iTab 
1930: 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e  = pIdx->pTable->
1940: 74 6e 75 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  tnum;.      }.  
1950: 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
1960: 20 69 54 61 62 20 3d 20 69 52 6f 6f 74 3b 0a 20   iTab = iRoot;. 
1970: 20 7d 0a 0a 20 20 2f 2a 20 53 65 61 72 63 68 20   }..  /* Search 
1980: 66 6f 72 20 74 68 65 20 72 65 71 75 69 72 65 64  for the required
1990: 20 6c 6f 63 6b 2e 20 45 69 74 68 65 72 20 61 20   lock. Either a 
19a0: 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 72 6f  write-lock on ro
19b0: 6f 74 2d 70 61 67 65 20 69 54 61 62 2c 20 61 20  ot-page iTab, a 
19c0: 0a 20 20 2a 2a 20 77 72 69 74 65 2d 6c 6f 63 6b  .  ** write-lock
19d0: 20 6f 6e 20 74 68 65 20 73 63 68 65 6d 61 20 74   on the schema t
19e0: 61 62 6c 65 2c 20 6f 72 20 28 69 66 20 74 68 65  able, or (if the
19f0: 20 63 6c 69 65 6e 74 20 69 73 20 72 65 61 64 69   client is readi
1a00: 6e 67 29 20 61 0a 20 20 2a 2a 20 72 65 61 64 2d  ng) a.  ** read-
1a10: 6c 6f 63 6b 20 6f 6e 20 69 54 61 62 20 77 69 6c  lock on iTab wil
1a20: 6c 20 73 75 66 66 69 63 65 2e 20 52 65 74 75 72  l suffice. Retur
1a30: 6e 20 31 20 69 66 20 61 6e 79 20 6f 66 20 74 68  n 1 if any of th
1a40: 65 73 65 20 61 72 65 20 66 6f 75 6e 64 2e 20 20  ese are found.  
1a50: 2a 2f 0a 20 20 66 6f 72 28 70 4c 6f 63 6b 3d 70  */.  for(pLock=p
1a60: 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 4c 6f 63  Btree->pBt->pLoc
1a70: 6b 3b 20 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b 3d  k; pLock; pLock=
1a80: 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 29 7b 0a 20  pLock->pNext){. 
1a90: 20 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e 70 42     if( pLock->pB
1aa0: 74 72 65 65 3d 3d 70 42 74 72 65 65 20 0a 20 20  tree==pBtree .  
1ab0: 20 20 20 26 26 20 28 70 4c 6f 63 6b 2d 3e 69 54     && (pLock->iT
1ac0: 61 62 6c 65 3d 3d 69 54 61 62 20 7c 7c 20 28 70  able==iTab || (p
1ad0: 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 3d 3d 57 52 49  Lock->eLock==WRI
1ae0: 54 45 5f 4c 4f 43 4b 20 26 26 20 70 4c 6f 63 6b  TE_LOCK && pLock
1af0: 2d 3e 69 54 61 62 6c 65 3d 3d 31 29 29 0a 20 20  ->iTable==1)).  
1b00: 20 20 20 26 26 20 70 4c 6f 63 6b 2d 3e 65 4c 6f     && pLock->eLo
1b10: 63 6b 3e 3d 65 4c 6f 63 6b 54 79 70 65 20 0a 20  ck>=eLockType . 
1b20: 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75     ){.      retu
1b30: 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rn 1;.    }.  }.
1b40: 0a 20 20 2f 2a 20 46 61 69 6c 65 64 20 74 6f 20  .  /* Failed to 
1b50: 66 69 6e 64 20 74 68 65 20 72 65 71 75 69 72 65  find the require
1b60: 64 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 72 65 74  d lock. */.  ret
1b70: 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 20  urn 0;.}.#endif 
1b80: 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20  /* SQLITE_DEBUG 
1b90: 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  */..#ifdef SQLIT
1ba0: 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 2a 2a 20  E_DEBUG./*.**** 
1bb0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61  This function ma
1bc0: 79 20 62 65 20 75 73 65 64 20 61 73 20 70 61 72  y be used as par
1bd0: 74 20 6f 66 20 61 73 73 65 72 74 28 29 20 73 74  t of assert() st
1be0: 61 74 65 6d 65 6e 74 73 20 6f 6e 6c 79 2e 20 2a  atements only. *
1bf0: 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ***.**.** Return
1c00: 20 74 72 75 65 20 69 66 20 69 74 20 77 6f 75 6c   true if it woul
1c10: 64 20 62 65 20 69 6c 6c 65 67 61 6c 20 66 6f 72  d be illegal for
1c20: 20 70 42 74 72 65 65 20 74 6f 20 77 72 69 74 65   pBtree to write
1c30: 20 69 6e 74 6f 20 74 68 65 0a 2a 2a 20 74 61 62   into the.** tab
1c40: 6c 65 20 6f 72 20 69 6e 64 65 78 20 72 6f 6f 74  le or index root
1c50: 65 64 20 61 74 20 69 52 6f 6f 74 20 62 65 63 61  ed at iRoot beca
1c60: 75 73 65 20 6f 74 68 65 72 20 73 68 61 72 65 64  use other shared
1c70: 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 72 65   connections are
1c80: 0a 2a 2a 20 73 69 6d 75 6c 74 61 6e 65 6f 75 73  .** simultaneous
1c90: 6c 79 20 72 65 61 64 69 6e 67 20 74 68 61 74 20  ly reading that 
1ca0: 73 61 6d 65 20 74 61 62 6c 65 20 6f 72 20 69 6e  same table or in
1cb0: 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73  dex..**.** It is
1cc0: 20 69 6c 6c 65 67 61 6c 20 66 6f 72 20 70 42 74   illegal for pBt
1cd0: 72 65 65 20 74 6f 20 77 72 69 74 65 20 69 66 20  ree to write if 
1ce0: 73 6f 6d 65 20 6f 74 68 65 72 20 42 74 72 65 65  some other Btree
1cf0: 20 6f 62 6a 65 63 74 20 74 68 61 74 0a 2a 2a 20   object that.** 
1d00: 73 68 61 72 65 73 20 74 68 65 20 73 61 6d 65 20  shares the same 
1d10: 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74 20  BtShared object 
1d20: 69 73 20 63 75 72 72 65 6e 74 6c 79 20 72 65 61  is currently rea
1d30: 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 0a  ding or writing.
1d40: 2a 2a 20 74 68 65 20 69 52 6f 6f 74 20 74 61 62  ** the iRoot tab
1d50: 6c 65 2e 20 20 45 78 63 65 70 74 2c 20 69 66 20  le.  Except, if 
1d60: 74 68 65 20 6f 74 68 65 72 20 42 74 72 65 65 20  the other Btree 
1d70: 6f 62 6a 65 63 74 20 68 61 73 20 74 68 65 0a 2a  object has the.*
1d80: 2a 20 72 65 61 64 2d 75 6e 63 6f 6d 6d 69 74 74  * read-uncommitt
1d90: 65 64 20 66 6c 61 67 20 73 65 74 2c 20 74 68 65  ed flag set, the
1da0: 6e 20 69 74 20 69 73 20 4f 4b 20 66 6f 72 20 74  n it is OK for t
1db0: 68 65 20 6f 74 68 65 72 20 6f 62 6a 65 63 74 20  he other object 
1dc0: 74 6f 0a 2a 2a 20 68 61 76 65 20 61 20 72 65 61  to.** have a rea
1dd0: 64 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20  d cursor..**.** 
1de0: 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 62 65 66  For example, bef
1df0: 6f 72 65 20 77 72 69 74 69 6e 67 20 74 6f 20 61  ore writing to a
1e00: 6e 79 20 70 61 72 74 20 6f 66 20 74 68 65 20 74  ny part of the t
1e10: 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 0a 2a 2a  able or index.**
1e20: 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67 65 20   rooted at page 
1e30: 69 52 6f 6f 74 2c 20 6f 6e 65 20 73 68 6f 75 6c  iRoot, one shoul
1e40: 64 20 63 61 6c 6c 3a 0a 2a 2a 0a 2a 2a 20 20 20  d call:.**.**   
1e50: 20 61 73 73 65 72 74 28 20 21 68 61 73 52 65 61   assert( !hasRea
1e60: 64 43 6f 6e 66 6c 69 63 74 73 28 70 42 74 72 65  dConflicts(pBtre
1e70: 65 2c 20 69 52 6f 6f 74 29 20 29 3b 0a 2a 2f 0a  e, iRoot) );.*/.
1e80: 73 74 61 74 69 63 20 69 6e 74 20 68 61 73 52 65  static int hasRe
1e90: 61 64 43 6f 6e 66 6c 69 63 74 73 28 42 74 72 65  adConflicts(Btre
1ea0: 65 20 2a 70 42 74 72 65 65 2c 20 50 67 6e 6f 20  e *pBtree, Pgno 
1eb0: 69 52 6f 6f 74 29 7b 0a 20 20 42 74 43 75 72 73  iRoot){.  BtCurs
1ec0: 6f 72 20 2a 70 3b 0a 20 20 66 6f 72 28 70 3d 70  or *p;.  for(p=p
1ed0: 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 43 75 72  Btree->pBt->pCur
1ee0: 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65  sor; p; p=p->pNe
1ef0: 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  xt){.    if( p->
1f00: 70 67 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f 74 20  pgnoRoot==iRoot 
1f10: 0a 20 20 20 20 20 26 26 20 70 2d 3e 70 42 74 72  .     && p->pBtr
1f20: 65 65 21 3d 70 42 74 72 65 65 0a 20 20 20 20 20  ee!=pBtree.     
1f30: 26 26 20 30 3d 3d 28 70 2d 3e 70 42 74 72 65 65  && 0==(p->pBtree
1f40: 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51  ->db->flags & SQ
1f50: 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69  LITE_ReadUncommi
1f60: 74 74 65 64 29 0a 20 20 20 20 29 7b 0a 20 20 20  tted).    ){.   
1f70: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
1f80: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
1f90: 30 3b 0a 7d 0a 23 65 6e 64 69 66 20 20 20 20 2f  0;.}.#endif    /
1fa0: 2a 20 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  * #ifdef SQLITE_
1fb0: 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  DEBUG */../*.** 
1fc0: 51 75 65 72 79 20 74 6f 20 73 65 65 20 69 66 20  Query to see if 
1fd0: 42 74 72 65 65 20 68 61 6e 64 6c 65 20 70 20 6d  Btree handle p m
1fe0: 61 79 20 6f 62 74 61 69 6e 20 61 20 6c 6f 63 6b  ay obtain a lock
1ff0: 20 6f 66 20 74 79 70 65 20 65 4c 6f 63 6b 20 0a   of type eLock .
2000: 2a 2a 20 28 52 45 41 44 5f 4c 4f 43 4b 20 6f 72  ** (READ_LOCK or
2010: 20 57 52 49 54 45 5f 4c 4f 43 4b 29 20 6f 6e 20   WRITE_LOCK) on 
2020: 74 68 65 20 74 61 62 6c 65 20 77 69 74 68 20 72  the table with r
2030: 6f 6f 74 2d 70 61 67 65 20 69 54 61 62 2e 20 52  oot-page iTab. R
2040: 65 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f  eturn.** SQLITE_
2050: 4f 4b 20 69 66 20 74 68 65 20 6c 6f 63 6b 20 6d  OK if the lock m
2060: 61 79 20 62 65 20 6f 62 74 61 69 6e 65 64 20 28  ay be obtained (
2070: 62 79 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73 65  by calling.** se
2080: 74 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  tSharedCacheTabl
2090: 65 4c 6f 63 6b 28 29 29 2c 20 6f 72 20 53 51 4c  eLock()), or SQL
20a0: 49 54 45 5f 4c 4f 43 4b 45 44 20 69 66 20 6e 6f  ITE_LOCKED if no
20b0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
20c0: 20 71 75 65 72 79 53 68 61 72 65 64 43 61 63 68   querySharedCach
20d0: 65 54 61 62 6c 65 4c 6f 63 6b 28 42 74 72 65 65  eTableLock(Btree
20e0: 20 2a 70 2c 20 50 67 6e 6f 20 69 54 61 62 2c 20   *p, Pgno iTab, 
20f0: 75 38 20 65 4c 6f 63 6b 29 7b 0a 20 20 42 74 53  u8 eLock){.  BtS
2100: 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
2110: 70 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70  pBt;.  BtLock *p
2120: 49 74 65 72 3b 0a 0a 20 20 61 73 73 65 72 74 28  Iter;..  assert(
2130: 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c   sqlite3BtreeHol
2140: 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20  dsMutex(p) );.  
2150: 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52  assert( eLock==R
2160: 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63  EAD_LOCK || eLoc
2170: 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29 3b  k==WRITE_LOCK );
2180: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62  .  assert( p->db
2190: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
21a0: 20 21 28 70 2d 3e 64 62 2d 3e 66 6c 61 67 73 26   !(p->db->flags&
21b0: 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d  SQLITE_ReadUncom
21c0: 6d 69 74 74 65 64 29 7c 7c 65 4c 6f 63 6b 3d 3d  mitted)||eLock==
21d0: 57 52 49 54 45 5f 4c 4f 43 4b 7c 7c 69 54 61 62  WRITE_LOCK||iTab
21e0: 3d 3d 31 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 49  ==1 );.  .  /* I
21f0: 66 20 72 65 71 75 65 73 74 69 6e 67 20 61 20 77  f requesting a w
2200: 72 69 74 65 2d 6c 6f 63 6b 2c 20 74 68 65 6e 20  rite-lock, then 
2210: 74 68 65 20 42 74 72 65 65 20 6d 75 73 74 20 68  the Btree must h
2220: 61 76 65 20 61 6e 20 6f 70 65 6e 20 77 72 69 74  ave an open writ
2230: 65 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69  e.  ** transacti
2240: 6f 6e 20 6f 6e 20 74 68 69 73 20 66 69 6c 65 2e  on on this file.
2250: 20 41 6e 64 2c 20 6f 62 76 69 6f 75 73 6c 79 2c   And, obviously,
2260: 20 66 6f 72 20 74 68 69 73 20 74 6f 20 62 65 20   for this to be 
2270: 73 6f 20 74 68 65 72 65 20 0a 20 20 2a 2a 20 6d  so there .  ** m
2280: 75 73 74 20 62 65 20 61 6e 20 6f 70 65 6e 20 77  ust be an open w
2290: 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
22a0: 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 69 74 73   on the file its
22b0: 65 6c 66 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  elf..  */.  asse
22c0: 72 74 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f  rt( eLock==READ_
22d0: 4c 4f 43 4b 20 7c 7c 20 28 70 3d 3d 70 42 74 2d  LOCK || (p==pBt-
22e0: 3e 70 57 72 69 74 65 72 20 26 26 20 70 2d 3e 69  >pWriter && p->i
22f0: 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52  nTrans==TRANS_WR
2300: 49 54 45 29 20 29 3b 0a 20 20 61 73 73 65 72 74  ITE) );.  assert
2310: 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f  ( eLock==READ_LO
2320: 43 4b 20 7c 7c 20 70 42 74 2d 3e 69 6e 54 72 61  CK || pBt->inTra
2330: 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f  nsaction==TRANS_
2340: 57 52 49 54 45 20 29 3b 0a 20 20 0a 20 20 2f 2a  WRITE );.  .  /*
2350: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
2360: 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20   a no-op if the 
2370: 73 68 61 72 65 64 2d 63 61 63 68 65 20 69 73 20  shared-cache is 
2380: 6e 6f 74 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 20  not enabled */. 
2390: 20 69 66 28 20 21 70 2d 3e 73 68 61 72 61 62 6c   if( !p->sharabl
23a0: 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
23b0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
23c0: 20 20 2f 2a 20 49 66 20 73 6f 6d 65 20 6f 74 68    /* If some oth
23d0: 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73  er connection is
23e0: 20 68 6f 6c 64 69 6e 67 20 61 6e 20 65 78 63 6c   holding an excl
23f0: 75 73 69 76 65 20 6c 6f 63 6b 2c 20 74 68 65 0a  usive lock, the.
2400: 20 20 2a 2a 20 72 65 71 75 65 73 74 65 64 20 6c    ** requested l
2410: 6f 63 6b 20 6d 61 79 20 6e 6f 74 20 62 65 20 6f  ock may not be o
2420: 62 74 61 69 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20  btained..  */.  
2430: 69 66 28 20 70 42 74 2d 3e 70 57 72 69 74 65 72  if( pBt->pWriter
2440: 21 3d 70 20 26 26 20 28 70 42 74 2d 3e 62 74 73  !=p && (pBt->bts
2450: 46 6c 61 67 73 20 26 20 42 54 53 5f 45 58 43 4c  Flags & BTS_EXCL
2460: 55 53 49 56 45 29 21 3d 30 20 29 7b 0a 20 20 20  USIVE)!=0 ){.   
2470: 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69   sqlite3Connecti
2480: 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64 62 2c  onBlocked(p->db,
2490: 20 70 42 74 2d 3e 70 57 72 69 74 65 72 2d 3e 64   pBt->pWriter->d
24a0: 62 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  b);.    return S
24b0: 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41  QLITE_LOCKED_SHA
24c0: 52 45 44 43 41 43 48 45 3b 0a 20 20 7d 0a 0a 20  REDCACHE;.  }.. 
24d0: 20 66 6f 72 28 70 49 74 65 72 3d 70 42 74 2d 3e   for(pIter=pBt->
24e0: 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70 49  pLock; pIter; pI
24f0: 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78 74  ter=pIter->pNext
2500: 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 63 6f  ){.    /* The co
2510: 6e 64 69 74 69 6f 6e 20 28 70 49 74 65 72 2d 3e  ndition (pIter->
2520: 65 4c 6f 63 6b 21 3d 65 4c 6f 63 6b 29 20 69 6e  eLock!=eLock) in
2530: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69   the following i
2540: 66 28 2e 2e 2e 29 20 0a 20 20 20 20 2a 2a 20 73  f(...) .    ** s
2550: 74 61 74 65 6d 65 6e 74 20 69 73 20 61 20 73 69  tatement is a si
2560: 6d 70 6c 69 66 69 63 61 74 69 6f 6e 20 6f 66 3a  mplification of:
2570: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
2580: 20 28 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c   (eLock==WRITE_L
2590: 4f 43 4b 20 7c 7c 20 70 49 74 65 72 2d 3e 65 4c  OCK || pIter->eL
25a0: 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 29  ock==WRITE_LOCK)
25b0: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 73  .    **.    ** s
25c0: 69 6e 63 65 20 77 65 20 6b 6e 6f 77 20 74 68 61  ince we know tha
25d0: 74 20 69 66 20 65 4c 6f 63 6b 3d 3d 57 52 49 54  t if eLock==WRIT
25e0: 45 5f 4c 4f 43 4b 2c 20 74 68 65 6e 20 6e 6f 20  E_LOCK, then no 
25f0: 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e  other connection
2600: 0a 20 20 20 20 2a 2a 20 6d 61 79 20 68 6f 6c 64  .    ** may hold
2610: 20 61 20 57 52 49 54 45 5f 4c 4f 43 4b 20 6f 6e   a WRITE_LOCK on
2620: 20 61 6e 79 20 74 61 62 6c 65 20 69 6e 20 74 68   any table in th
2630: 69 73 20 66 69 6c 65 20 28 73 69 6e 63 65 20 74  is file (since t
2640: 68 65 72 65 20 63 61 6e 0a 20 20 20 20 2a 2a 20  here can.    ** 
2650: 6f 6e 6c 79 20 62 65 20 61 20 73 69 6e 67 6c 65  only be a single
2660: 20 77 72 69 74 65 72 29 2e 0a 20 20 20 20 2a 2f   writer)..    */
2670: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74  .    assert( pIt
2680: 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f  er->eLock==READ_
2690: 4c 4f 43 4b 20 7c 7c 20 70 49 74 65 72 2d 3e 65  LOCK || pIter->e
26a0: 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b  Lock==WRITE_LOCK
26b0: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
26c0: 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b  eLock==READ_LOCK
26d0: 20 7c 7c 20 70 49 74 65 72 2d 3e 70 42 74 72 65   || pIter->pBtre
26e0: 65 3d 3d 70 20 7c 7c 20 70 49 74 65 72 2d 3e 65  e==p || pIter->e
26f0: 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 29  Lock==READ_LOCK)
2700: 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65 72 2d  ;.    if( pIter-
2710: 3e 70 42 74 72 65 65 21 3d 70 20 26 26 20 70 49  >pBtree!=p && pI
2720: 74 65 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61  ter->iTable==iTa
2730: 62 20 26 26 20 70 49 74 65 72 2d 3e 65 4c 6f 63  b && pIter->eLoc
2740: 6b 21 3d 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20  k!=eLock ){.    
2750: 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74    sqlite3Connect
2760: 69 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64 62  ionBlocked(p->db
2770: 2c 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65 2d  , pIter->pBtree-
2780: 3e 64 62 29 3b 0a 20 20 20 20 20 20 69 66 28 20  >db);.      if( 
2790: 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43  eLock==WRITE_LOC
27a0: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  K ){.        ass
27b0: 65 72 74 28 20 70 3d 3d 70 42 74 2d 3e 70 57 72  ert( p==pBt->pWr
27c0: 69 74 65 72 20 29 3b 0a 20 20 20 20 20 20 20 20  iter );.        
27d0: 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d  pBt->btsFlags |=
27e0: 20 42 54 53 5f 50 45 4e 44 49 4e 47 3b 0a 20 20   BTS_PENDING;.  
27f0: 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75      }.      retu
2800: 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44  rn SQLITE_LOCKED
2810: 5f 53 48 41 52 45 44 43 41 43 48 45 3b 0a 20 20  _SHAREDCACHE;.  
2820: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
2830: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65   SQLITE_OK;.}.#e
2840: 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f  ndif /* !SQLITE_
2850: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
2860: 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  E */..#ifndef SQ
2870: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
2880: 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 41 64 64  _CACHE./*.** Add
2890: 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 74   a lock on the t
28a0: 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70  able with root-p
28b0: 61 67 65 20 69 54 61 62 6c 65 20 74 6f 20 74 68  age iTable to th
28c0: 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 20 75  e shared-btree u
28d0: 73 65 64 0a 2a 2a 20 62 79 20 42 74 72 65 65 20  sed.** by Btree 
28e0: 68 61 6e 64 6c 65 20 70 2e 20 50 61 72 61 6d 65  handle p. Parame
28f0: 74 65 72 20 65 4c 6f 63 6b 20 6d 75 73 74 20 62  ter eLock must b
2900: 65 20 65 69 74 68 65 72 20 52 45 41 44 5f 4c 4f  e either READ_LO
2910: 43 4b 20 6f 72 20 0a 2a 2a 20 57 52 49 54 45 5f  CK or .** WRITE_
2920: 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  LOCK..**.** This
2930: 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65   function assume
2940: 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  s the following:
2950: 0a 2a 2a 0a 2a 2a 20 20 20 28 61 29 20 54 68 65  .**.**   (a) The
2960: 20 73 70 65 63 69 66 69 65 64 20 42 74 72 65 65   specified Btree
2970: 20 6f 62 6a 65 63 74 20 70 20 69 73 20 63 6f 6e   object p is con
2980: 6e 65 63 74 65 64 20 74 6f 20 61 20 73 68 61 72  nected to a shar
2990: 61 62 6c 65 0a 2a 2a 20 20 20 20 20 20 20 64 61  able.**       da
29a0: 74 61 62 61 73 65 20 28 6f 6e 65 20 77 69 74 68  tabase (one with
29b0: 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 73 68   the BtShared.sh
29c0: 61 72 61 62 6c 65 20 66 6c 61 67 20 73 65 74 29  arable flag set)
29d0: 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 28 62  , and.**.**   (b
29e0: 29 20 4e 6f 20 6f 74 68 65 72 20 42 74 72 65 65  ) No other Btree
29f0: 20 6f 62 6a 65 63 74 73 20 68 6f 6c 64 20 61 20   objects hold a 
2a00: 6c 6f 63 6b 20 74 68 61 74 20 63 6f 6e 66 6c 69  lock that confli
2a10: 63 74 73 0a 2a 2a 20 20 20 20 20 20 20 77 69 74  cts.**       wit
2a20: 68 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  h the requested 
2a30: 6c 6f 63 6b 20 28 69 2e 65 2e 20 71 75 65 72 79  lock (i.e. query
2a40: 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
2a50: 4c 6f 63 6b 28 29 20 68 61 73 0a 2a 2a 20 20 20  Lock() has.**   
2a60: 20 20 20 20 61 6c 72 65 61 64 79 20 62 65 65 6e      already been
2a70: 20 63 61 6c 6c 65 64 20 61 6e 64 20 72 65 74 75   called and retu
2a80: 72 6e 65 64 20 53 51 4c 49 54 45 5f 4f 4b 29 2e  rned SQLITE_OK).
2a90: 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  .**.** SQLITE_OK
2aa0: 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
2ab0: 74 68 65 20 6c 6f 63 6b 20 69 73 20 61 64 64 65  the lock is adde
2ac0: 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2e 20  d successfully. 
2ad0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 0a 2a 2a  SQLITE_NOMEM .**
2ae0: 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
2af0: 61 20 6d 61 6c 6c 6f 63 20 61 74 74 65 6d 70 74  a malloc attempt
2b00: 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69   fails..*/.stati
2b10: 63 20 69 6e 74 20 73 65 74 53 68 61 72 65 64 43  c int setSharedC
2b20: 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 42 74  acheTableLock(Bt
2b30: 72 65 65 20 2a 70 2c 20 50 67 6e 6f 20 69 54 61  ree *p, Pgno iTa
2b40: 62 6c 65 2c 20 75 38 20 65 4c 6f 63 6b 29 7b 0a  ble, u8 eLock){.
2b50: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
2b60: 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74 4c 6f  = p->pBt;.  BtLo
2b70: 63 6b 20 2a 70 4c 6f 63 6b 20 3d 20 30 3b 0a 20  ck *pLock = 0;. 
2b80: 20 42 74 4c 6f 63 6b 20 2a 70 49 74 65 72 3b 0a   BtLock *pIter;.
2b90: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
2ba0: 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65  e3BtreeHoldsMute
2bb0: 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74  x(p) );.  assert
2bc0: 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f  ( eLock==READ_LO
2bd0: 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 57 52 49  CK || eLock==WRI
2be0: 54 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73  TE_LOCK );.  ass
2bf0: 65 72 74 28 20 70 2d 3e 64 62 21 3d 30 20 29 3b  ert( p->db!=0 );
2c00: 0a 0a 20 20 2f 2a 20 41 20 63 6f 6e 6e 65 63 74  ..  /* A connect
2c10: 69 6f 6e 20 77 69 74 68 20 74 68 65 20 72 65 61  ion with the rea
2c20: 64 2d 75 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c  d-uncommitted fl
2c30: 61 67 20 73 65 74 20 77 69 6c 6c 20 6e 65 76 65  ag set will neve
2c40: 72 20 74 72 79 20 74 6f 0a 20 20 2a 2a 20 6f 62  r try to.  ** ob
2c50: 74 61 69 6e 20 61 20 72 65 61 64 2d 6c 6f 63 6b  tain a read-lock
2c60: 20 75 73 69 6e 67 20 74 68 69 73 20 66 75 6e 63   using this func
2c70: 74 69 6f 6e 2e 20 54 68 65 20 6f 6e 6c 79 20 72  tion. The only r
2c80: 65 61 64 2d 6c 6f 63 6b 20 6f 62 74 61 69 6e 65  ead-lock obtaine
2c90: 64 0a 20 20 2a 2a 20 62 79 20 61 20 63 6f 6e 6e  d.  ** by a conn
2ca0: 65 63 74 69 6f 6e 20 69 6e 20 72 65 61 64 2d 75  ection in read-u
2cb0: 6e 63 6f 6d 6d 69 74 74 65 64 20 6d 6f 64 65 20  ncommitted mode 
2cc0: 69 73 20 6f 6e 20 74 68 65 20 73 71 6c 69 74 65  is on the sqlite
2cd0: 5f 6d 61 73 74 65 72 20 0a 20 20 2a 2a 20 74 61  _master .  ** ta
2ce0: 62 6c 65 2c 20 61 6e 64 20 74 68 61 74 20 6c 6f  ble, and that lo
2cf0: 63 6b 20 69 73 20 6f 62 74 61 69 6e 65 64 20 69  ck is obtained i
2d00: 6e 20 42 74 72 65 65 42 65 67 69 6e 54 72 61 6e  n BtreeBeginTran
2d10: 73 28 29 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72  s().  */.  asser
2d20: 74 28 20 30 3d 3d 28 70 2d 3e 64 62 2d 3e 66 6c  t( 0==(p->db->fl
2d30: 61 67 73 26 53 51 4c 49 54 45 5f 52 65 61 64 55  ags&SQLITE_ReadU
2d40: 6e 63 6f 6d 6d 69 74 74 65 64 29 20 7c 7c 20 65  ncommitted) || e
2d50: 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b  Lock==WRITE_LOCK
2d60: 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66   );..  /* This f
2d70: 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 6f  unction should o
2d80: 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e  nly be called on
2d90: 20 61 20 73 68 61 72 61 62 6c 65 20 62 2d 74 72   a sharable b-tr
2da0: 65 65 20 61 66 74 65 72 20 69 74 20 0a 20 20 2a  ee after it .  *
2db0: 2a 20 68 61 73 20 62 65 65 6e 20 64 65 74 65 72  * has been deter
2dc0: 6d 69 6e 65 64 20 74 68 61 74 20 6e 6f 20 6f 74  mined that no ot
2dd0: 68 65 72 20 62 2d 74 72 65 65 20 68 6f 6c 64 73  her b-tree holds
2de0: 20 61 20 63 6f 6e 66 6c 69 63 74 69 6e 67 20 6c   a conflicting l
2df0: 6f 63 6b 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72  ock.  */.  asser
2e00: 74 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 29  t( p->sharable )
2e10: 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c 49  ;.  assert( SQLI
2e20: 54 45 5f 4f 4b 3d 3d 71 75 65 72 79 53 68 61 72  TE_OK==queryShar
2e30: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
2e40: 28 70 2c 20 69 54 61 62 6c 65 2c 20 65 4c 6f 63  (p, iTable, eLoc
2e50: 6b 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 72 73  k) );..  /* Firs
2e60: 74 20 73 65 61 72 63 68 20 74 68 65 20 6c 69 73  t search the lis
2e70: 74 20 66 6f 72 20 61 6e 20 65 78 69 73 74 69 6e  t for an existin
2e80: 67 20 6c 6f 63 6b 20 6f 6e 20 74 68 69 73 20 74  g lock on this t
2e90: 61 62 6c 65 2e 20 2a 2f 0a 20 20 66 6f 72 28 70  able. */.  for(p
2ea0: 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b  Iter=pBt->pLock;
2eb0: 20 70 49 74 65 72 3b 20 70 49 74 65 72 3d 70 49   pIter; pIter=pI
2ec0: 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  ter->pNext){.   
2ed0: 20 69 66 28 20 70 49 74 65 72 2d 3e 69 54 61 62   if( pIter->iTab
2ee0: 6c 65 3d 3d 69 54 61 62 6c 65 20 26 26 20 70 49  le==iTable && pI
2ef0: 74 65 72 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29  ter->pBtree==p )
2f00: 7b 0a 20 20 20 20 20 20 70 4c 6f 63 6b 20 3d 20  {.      pLock = 
2f10: 70 49 74 65 72 3b 0a 20 20 20 20 20 20 62 72 65  pIter;.      bre
2f20: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ak;.    }.  }.. 
2f30: 20 2f 2a 20 49 66 20 74 68 65 20 61 62 6f 76 65   /* If the above
2f40: 20 73 65 61 72 63 68 20 64 69 64 20 6e 6f 74 20   search did not 
2f50: 66 69 6e 64 20 61 20 42 74 4c 6f 63 6b 20 73 74  find a BtLock st
2f60: 72 75 63 74 20 61 73 73 6f 63 69 61 74 69 6e 67  ruct associating
2f70: 20 42 74 72 65 65 20 70 0a 20 20 2a 2a 20 77 69   Btree p.  ** wi
2f80: 74 68 20 74 61 62 6c 65 20 69 54 61 62 6c 65 2c  th table iTable,
2f90: 20 61 6c 6c 6f 63 61 74 65 20 6f 6e 65 20 61 6e   allocate one an
2fa0: 64 20 6c 69 6e 6b 20 69 74 20 69 6e 74 6f 20 74  d link it into t
2fb0: 68 65 20 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20  he list..  */.  
2fc0: 69 66 28 20 21 70 4c 6f 63 6b 20 29 7b 0a 20 20  if( !pLock ){.  
2fd0: 20 20 70 4c 6f 63 6b 20 3d 20 28 42 74 4c 6f 63    pLock = (BtLoc
2fe0: 6b 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  k *)sqlite3Mallo
2ff0: 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28 42 74 4c  cZero(sizeof(BtL
3000: 6f 63 6b 29 29 3b 0a 20 20 20 20 69 66 28 20 21  ock));.    if( !
3010: 70 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 72  pLock ){.      r
3020: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
3030: 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c  EM;.    }.    pL
3040: 6f 63 6b 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54  ock->iTable = iT
3050: 61 62 6c 65 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d  able;.    pLock-
3060: 3e 70 42 74 72 65 65 20 3d 20 70 3b 0a 20 20 20  >pBtree = p;.   
3070: 20 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 20 3d 20   pLock->pNext = 
3080: 70 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 20 20  pBt->pLock;.    
3090: 70 42 74 2d 3e 70 4c 6f 63 6b 20 3d 20 70 4c 6f  pBt->pLock = pLo
30a0: 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65  ck;.  }..  /* Se
30b0: 74 20 74 68 65 20 42 74 4c 6f 63 6b 2e 65 4c 6f  t the BtLock.eLo
30c0: 63 6b 20 76 61 72 69 61 62 6c 65 20 74 6f 20 74  ck variable to t
30d0: 68 65 20 6d 61 78 69 6d 75 6d 20 6f 66 20 74 68  he maximum of th
30e0: 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 6b 0a 20  e current lock. 
30f0: 20 2a 2a 20 61 6e 64 20 74 68 65 20 72 65 71 75   ** and the requ
3100: 65 73 74 65 64 20 6c 6f 63 6b 2e 20 54 68 69 73  ested lock. This
3110: 20 6d 65 61 6e 73 20 69 66 20 61 20 77 72 69 74   means if a writ
3120: 65 2d 6c 6f 63 6b 20 77 61 73 20 61 6c 72 65 61  e-lock was alrea
3130: 64 79 20 68 65 6c 64 0a 20 20 2a 2a 20 61 6e 64  dy held.  ** and
3140: 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 72 65 71   a read-lock req
3150: 75 65 73 74 65 64 2c 20 77 65 20 64 6f 6e 27 74  uested, we don't
3160: 20 69 6e 63 6f 72 72 65 63 74 6c 79 20 64 6f 77   incorrectly dow
3170: 6e 67 72 61 64 65 20 74 68 65 20 6c 6f 63 6b 2e  ngrade the lock.
3180: 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
3190: 57 52 49 54 45 5f 4c 4f 43 4b 3e 52 45 41 44 5f  WRITE_LOCK>READ_
31a0: 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 65 4c  LOCK );.  if( eL
31b0: 6f 63 6b 3e 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b  ock>pLock->eLock
31c0: 20 29 7b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 65   ){.    pLock->e
31d0: 4c 6f 63 6b 20 3d 20 65 4c 6f 63 6b 3b 0a 20 20  Lock = eLock;.  
31e0: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  }..  return SQLI
31f0: 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20  TE_OK;.}.#endif 
3200: 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  /* !SQLITE_OMIT_
3210: 53 48 41 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a  SHARED_CACHE */.
3220: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
3230: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
3240: 45 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20  E./*.** Release 
3250: 61 6c 6c 20 74 68 65 20 74 61 62 6c 65 20 6c 6f  all the table lo
3260: 63 6b 73 20 28 6c 6f 63 6b 73 20 6f 62 74 61 69  cks (locks obtai
3270: 6e 65 64 20 76 69 61 20 63 61 6c 6c 73 20 74 6f  ned via calls to
3280: 0a 2a 2a 20 74 68 65 20 73 65 74 53 68 61 72 65  .** the setShare
3290: 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28  dCacheTableLock(
32a0: 29 20 70 72 6f 63 65 64 75 72 65 29 20 68 65 6c  ) procedure) hel
32b0: 64 20 62 79 20 42 74 72 65 65 20 6f 62 6a 65 63  d by Btree objec
32c0: 74 20 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  t p..**.** This 
32d0: 66 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65 73  function assumes
32e0: 20 74 68 61 74 20 42 74 72 65 65 20 70 20 68 61   that Btree p ha
32f0: 73 20 61 6e 20 6f 70 65 6e 20 72 65 61 64 20 6f  s an open read o
3300: 72 20 77 72 69 74 65 20 0a 2a 2a 20 74 72 61 6e  r write .** tran
3310: 73 61 63 74 69 6f 6e 2e 20 49 66 20 69 74 20 64  saction. If it d
3320: 6f 65 73 20 6e 6f 74 2c 20 74 68 65 6e 20 74 68  oes not, then th
3330: 65 20 42 54 53 5f 50 45 4e 44 49 4e 47 20 66 6c  e BTS_PENDING fl
3340: 61 67 0a 2a 2a 20 6d 61 79 20 62 65 20 69 6e 63  ag.** may be inc
3350: 6f 72 72 65 63 74 6c 79 20 63 6c 65 61 72 65 64  orrectly cleared
3360: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
3370: 20 63 6c 65 61 72 41 6c 6c 53 68 61 72 65 64 43   clearAllSharedC
3380: 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 42  acheTableLocks(B
3390: 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68  tree *p){.  BtSh
33a0: 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
33b0: 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 2a 70  Bt;.  BtLock **p
33c0: 70 49 74 65 72 20 3d 20 26 70 42 74 2d 3e 70 4c  pIter = &pBt->pL
33d0: 6f 63 6b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ock;..  assert( 
33e0: 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64  sqlite3BtreeHold
33f0: 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61  sMutex(p) );.  a
3400: 73 73 65 72 74 28 20 70 2d 3e 73 68 61 72 61 62  ssert( p->sharab
3410: 6c 65 20 7c 7c 20 30 3d 3d 2a 70 70 49 74 65 72  le || 0==*ppIter
3420: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
3430: 3e 69 6e 54 72 61 6e 73 3e 30 20 29 3b 0a 0a 20  >inTrans>0 );.. 
3440: 20 77 68 69 6c 65 28 20 2a 70 70 49 74 65 72 20   while( *ppIter 
3450: 29 7b 0a 20 20 20 20 42 74 4c 6f 63 6b 20 2a 70  ){.    BtLock *p
3460: 4c 6f 63 6b 20 3d 20 2a 70 70 49 74 65 72 3b 0a  Lock = *ppIter;.
3470: 20 20 20 20 61 73 73 65 72 74 28 20 28 70 42 74      assert( (pBt
3480: 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53  ->btsFlags & BTS
3490: 5f 45 58 43 4c 55 53 49 56 45 29 3d 3d 30 20 7c  _EXCLUSIVE)==0 |
34a0: 7c 20 70 42 74 2d 3e 70 57 72 69 74 65 72 3d 3d  | pBt->pWriter==
34b0: 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 20 29 3b  pLock->pBtree );
34c0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f  .    assert( pLo
34d0: 63 6b 2d 3e 70 42 74 72 65 65 2d 3e 69 6e 54 72  ck->pBtree->inTr
34e0: 61 6e 73 3e 3d 70 4c 6f 63 6b 2d 3e 65 4c 6f 63  ans>=pLock->eLoc
34f0: 6b 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 6f  k );.    if( pLo
3500: 63 6b 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29 7b  ck->pBtree==p ){
3510: 0a 20 20 20 20 20 20 2a 70 70 49 74 65 72 20 3d  .      *ppIter =
3520: 20 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a 20   pLock->pNext;. 
3530: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f       assert( pLo
3540: 63 6b 2d 3e 69 54 61 62 6c 65 21 3d 31 20 7c 7c  ck->iTable!=1 ||
3550: 20 70 4c 6f 63 6b 3d 3d 26 70 2d 3e 6c 6f 63 6b   pLock==&p->lock
3560: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c   );.      if( pL
3570: 6f 63 6b 2d 3e 69 54 61 62 6c 65 21 3d 31 20 29  ock->iTable!=1 )
3580: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
3590: 33 5f 66 72 65 65 28 70 4c 6f 63 6b 29 3b 0a 20  3_free(pLock);. 
35a0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
35b0: 7b 0a 20 20 20 20 20 20 70 70 49 74 65 72 20 3d  {.      ppIter =
35c0: 20 26 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a   &pLock->pNext;.
35d0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73      }.  }..  ass
35e0: 65 72 74 28 20 28 70 42 74 2d 3e 62 74 73 46 6c  ert( (pBt->btsFl
35f0: 61 67 73 20 26 20 42 54 53 5f 50 45 4e 44 49 4e  ags & BTS_PENDIN
3600: 47 29 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 70 57  G)==0 || pBt->pW
3610: 72 69 74 65 72 20 29 3b 0a 20 20 69 66 28 20 70  riter );.  if( p
3620: 42 74 2d 3e 70 57 72 69 74 65 72 3d 3d 70 20 29  Bt->pWriter==p )
3630: 7b 0a 20 20 20 20 70 42 74 2d 3e 70 57 72 69 74  {.    pBt->pWrit
3640: 65 72 20 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d  er = 0;.    pBt-
3650: 3e 62 74 73 46 6c 61 67 73 20 26 3d 20 7e 28 42  >btsFlags &= ~(B
3660: 54 53 5f 45 58 43 4c 55 53 49 56 45 7c 42 54 53  TS_EXCLUSIVE|BTS
3670: 5f 50 45 4e 44 49 4e 47 29 3b 0a 20 20 7d 65 6c  _PENDING);.  }el
3680: 73 65 20 69 66 28 20 70 42 74 2d 3e 6e 54 72 61  se if( pBt->nTra
3690: 6e 73 61 63 74 69 6f 6e 3d 3d 32 20 29 7b 0a 20  nsaction==2 ){. 
36a0: 20 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74     /* This funct
36b0: 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68  ion is called wh
36c0: 65 6e 20 42 74 72 65 65 20 70 20 69 73 20 63 6f  en Btree p is co
36d0: 6e 63 6c 75 64 69 6e 67 20 69 74 73 20 0a 20 20  ncluding its .  
36e0: 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
36f0: 2e 20 49 66 20 74 68 65 72 65 20 63 75 72 72 65  . If there curre
3700: 6e 74 6c 79 20 65 78 69 73 74 73 20 61 20 77 72  ntly exists a wr
3710: 69 74 65 72 2c 20 61 6e 64 20 70 20 69 73 20 6e  iter, and p is n
3720: 6f 74 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 77  ot.    ** that w
3730: 72 69 74 65 72 2c 20 74 68 65 6e 20 74 68 65 20  riter, then the 
3740: 6e 75 6d 62 65 72 20 6f 66 20 6c 6f 63 6b 73 20  number of locks 
3750: 68 65 6c 64 20 62 79 20 63 6f 6e 6e 65 63 74 69  held by connecti
3760: 6f 6e 73 20 6f 74 68 65 72 0a 20 20 20 20 2a 2a  ons other.    **
3770: 20 74 68 61 6e 20 74 68 65 20 77 72 69 74 65 72   than the writer
3780: 20 6d 75 73 74 20 62 65 20 61 62 6f 75 74 20 74   must be about t
3790: 6f 20 64 72 6f 70 20 74 6f 20 7a 65 72 6f 2e 20  o drop to zero. 
37a0: 49 6e 20 74 68 69 73 20 63 61 73 65 0a 20 20 20  In this case.   
37b0: 20 2a 2a 20 73 65 74 20 74 68 65 20 42 54 53 5f   ** set the BTS_
37c0: 50 45 4e 44 49 4e 47 20 66 6c 61 67 20 74 6f 20  PENDING flag to 
37d0: 30 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  0..    **.    **
37e0: 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 74   If there is not
37f0: 20 63 75 72 72 65 6e 74 6c 79 20 61 20 77 72 69   currently a wri
3800: 74 65 72 2c 20 74 68 65 6e 20 42 54 53 5f 50 45  ter, then BTS_PE
3810: 4e 44 49 4e 47 20 6d 75 73 74 0a 20 20 20 20 2a  NDING must.    *
3820: 2a 20 62 65 20 7a 65 72 6f 20 61 6c 72 65 61 64  * be zero alread
3830: 79 2e 20 53 6f 20 74 68 69 73 20 6e 65 78 74 20  y. So this next 
3840: 6c 69 6e 65 20 69 73 20 68 61 72 6d 6c 65 73 73  line is harmless
3850: 20 69 6e 20 74 68 61 74 20 63 61 73 65 2e 0a 20   in that case.. 
3860: 20 20 20 2a 2f 0a 20 20 20 20 70 42 74 2d 3e 62     */.    pBt->b
3870: 74 73 46 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f  tsFlags &= ~BTS_
3880: 50 45 4e 44 49 4e 47 3b 0a 20 20 7d 0a 7d 0a 0a  PENDING;.  }.}..
3890: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
38a0: 69 6f 6e 20 63 68 61 6e 67 65 73 20 61 6c 6c 20  ion changes all 
38b0: 77 72 69 74 65 2d 6c 6f 63 6b 73 20 68 65 6c 64  write-locks held
38c0: 20 62 79 20 42 74 72 65 65 20 70 20 69 6e 74 6f   by Btree p into
38d0: 20 72 65 61 64 2d 6c 6f 63 6b 73 2e 0a 2a 2f 0a   read-locks..*/.
38e0: 73 74 61 74 69 63 20 76 6f 69 64 20 64 6f 77 6e  static void down
38f0: 67 72 61 64 65 41 6c 6c 53 68 61 72 65 64 43 61  gradeAllSharedCa
3900: 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 42 74  cheTableLocks(Bt
3910: 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61  ree *p){.  BtSha
3920: 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
3930: 74 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 57  t;.  if( pBt->pW
3940: 72 69 74 65 72 3d 3d 70 20 29 7b 0a 20 20 20 20  riter==p ){.    
3950: 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 3b 0a 20  BtLock *pLock;. 
3960: 20 20 20 70 42 74 2d 3e 70 57 72 69 74 65 72 20     pBt->pWriter 
3970: 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d 3e 62 74  = 0;.    pBt->bt
3980: 73 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 53 5f  sFlags &= ~(BTS_
3990: 45 58 43 4c 55 53 49 56 45 7c 42 54 53 5f 50 45  EXCLUSIVE|BTS_PE
39a0: 4e 44 49 4e 47 29 3b 0a 20 20 20 20 66 6f 72 28  NDING);.    for(
39b0: 70 4c 6f 63 6b 3d 70 42 74 2d 3e 70 4c 6f 63 6b  pLock=pBt->pLock
39c0: 3b 20 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b 3d 70  ; pLock; pLock=p
39d0: 4c 6f 63 6b 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  Lock->pNext){.  
39e0: 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63      assert( pLoc
39f0: 6b 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c  k->eLock==READ_L
3a00: 4f 43 4b 20 7c 7c 20 70 4c 6f 63 6b 2d 3e 70 42  OCK || pLock->pB
3a10: 74 72 65 65 3d 3d 70 20 29 3b 0a 20 20 20 20 20  tree==p );.     
3a20: 20 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 3d 20   pLock->eLock = 
3a30: 52 45 41 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d  READ_LOCK;.    }
3a40: 0a 20 20 7d 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f  .  }.}..#endif /
3a50: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  * SQLITE_OMIT_SH
3a60: 41 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 73  ARED_CACHE */..s
3a70: 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61  tatic void relea
3a80: 73 65 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a  sePage(MemPage *
3a90: 70 50 61 67 65 29 3b 20 20 2f 2a 20 46 6f 72 77  pPage);  /* Forw
3aa0: 61 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f  ard reference */
3ab0: 0a 0a 2f 2a 0a 2a 2a 2a 2a 2a 20 54 68 69 73 20  ../*.***** This 
3ac0: 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
3ad0: 69 6e 73 69 64 65 20 6f 66 20 61 73 73 65 72 74  inside of assert
3ae0: 28 29 20 6f 6e 6c 79 20 2a 2a 2a 2a 0a 2a 2a 0a  () only ****.**.
3af0: 2a 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 74  ** Verify that t
3b00: 68 65 20 63 75 72 73 6f 72 20 68 6f 6c 64 73 20  he cursor holds 
3b10: 74 68 65 20 6d 75 74 65 78 20 6f 6e 20 69 74 73  the mutex on its
3b20: 20 42 74 53 68 61 72 65 64 0a 2a 2f 0a 23 69 66   BtShared.*/.#if
3b30: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
3b40: 0a 73 74 61 74 69 63 20 69 6e 74 20 63 75 72 73  .static int curs
3b50: 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 42 74 43  orHoldsMutex(BtC
3b60: 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 72 65 74  ursor *p){.  ret
3b70: 75 72 6e 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  urn sqlite3_mute
3b80: 78 5f 68 65 6c 64 28 70 2d 3e 70 42 74 2d 3e 6d  x_held(p->pBt->m
3b90: 75 74 65 78 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a  utex);.}.#endif.
3ba0: 0a 2f 2a 0a 2a 2a 20 49 6e 76 61 6c 69 64 61 74  ./*.** Invalidat
3bb0: 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63  e the overflow c
3bc0: 61 63 68 65 20 6f 66 20 74 68 65 20 63 75 72 73  ache of the curs
3bd0: 6f 72 20 70 61 73 73 65 64 20 61 73 20 74 68 65  or passed as the
3be0: 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e   first argument.
3bf0: 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 68 61 72 65  .** on the share
3c00: 64 20 62 74 72 65 65 20 73 74 72 75 63 74 75 72  d btree structur
3c10: 65 20 70 42 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e  e pBt..*/.#defin
3c20: 65 20 69 6e 76 61 6c 69 64 61 74 65 4f 76 65 72  e invalidateOver
3c30: 66 6c 6f 77 43 61 63 68 65 28 70 43 75 72 29 20  flowCache(pCur) 
3c40: 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20  (pCur->curFlags 
3c50: 26 3d 20 7e 42 54 43 46 5f 56 61 6c 69 64 4f 76  &= ~BTCF_ValidOv
3c60: 66 6c 29 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 61 6c  fl)../*.** Inval
3c70: 69 64 61 74 65 20 74 68 65 20 6f 76 65 72 66 6c  idate the overfl
3c80: 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63  ow page-list cac
3c90: 68 65 20 66 6f 72 20 61 6c 6c 20 63 75 72 73 6f  he for all curso
3ca0: 72 73 20 6f 70 65 6e 65 64 0a 2a 2a 20 6f 6e 20  rs opened.** on 
3cb0: 74 68 65 20 73 68 61 72 65 64 20 62 74 72 65 65  the shared btree
3cc0: 20 73 74 72 75 63 74 75 72 65 20 70 42 74 2e 0a   structure pBt..
3cd0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69  */.static void i
3ce0: 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72  nvalidateAllOver
3cf0: 66 6c 6f 77 43 61 63 68 65 28 42 74 53 68 61 72  flowCache(BtShar
3d00: 65 64 20 2a 70 42 74 29 7b 0a 20 20 42 74 43 75  ed *pBt){.  BtCu
3d10: 72 73 6f 72 20 2a 70 3b 0a 20 20 61 73 73 65 72  rsor *p;.  asser
3d20: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
3d30: 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
3d40: 29 20 29 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74  ) );.  for(p=pBt
3d50: 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d  ->pCursor; p; p=
3d60: 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69  p->pNext){.    i
3d70: 6e 76 61 6c 69 64 61 74 65 4f 76 65 72 66 6c 6f  nvalidateOverflo
3d80: 77 43 61 63 68 65 28 70 29 3b 0a 20 20 7d 0a 7d  wCache(p);.  }.}
3d90: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
3da0: 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 2f  _OMIT_INCRBLOB./
3db0: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
3dc0: 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 62 65 66  on is called bef
3dd0: 6f 72 65 20 6d 6f 64 69 66 79 69 6e 67 20 74 68  ore modifying th
3de0: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 61 20  e contents of a 
3df0: 74 61 62 6c 65 0a 2a 2a 20 74 6f 20 69 6e 76 61  table.** to inva
3e00: 6c 69 64 61 74 65 20 61 6e 79 20 69 6e 63 72 62  lidate any incrb
3e10: 6c 6f 62 20 63 75 72 73 6f 72 73 20 74 68 61 74  lob cursors that
3e20: 20 61 72 65 20 6f 70 65 6e 20 6f 6e 20 74 68 65   are open on the
3e30: 0a 2a 2a 20 72 6f 77 20 6f 72 20 6f 6e 65 20 6f  .** row or one o
3e40: 66 20 74 68 65 20 72 6f 77 73 20 62 65 69 6e 67  f the rows being
3e50: 20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a   modified..**.**
3e60: 20 49 66 20 61 72 67 75 6d 65 6e 74 20 69 73 43   If argument isC
3e70: 6c 65 61 72 54 61 62 6c 65 20 69 73 20 74 72 75  learTable is tru
3e80: 65 2c 20 74 68 65 6e 20 74 68 65 20 65 6e 74 69  e, then the enti
3e90: 72 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  re contents of t
3ea0: 68 65 0a 2a 2a 20 74 61 62 6c 65 20 69 73 20 61  he.** table is a
3eb0: 62 6f 75 74 20 74 6f 20 62 65 20 64 65 6c 65 74  bout to be delet
3ec0: 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ed. In this case
3ed0: 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c 20   invalidate all 
3ee0: 69 6e 63 72 62 6c 6f 62 0a 2a 2a 20 63 75 72 73  incrblob.** curs
3ef0: 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 61 6e 79 20  ors open on any 
3f00: 72 6f 77 20 77 69 74 68 69 6e 20 74 68 65 20 74  row within the t
3f10: 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70  able with root-p
3f20: 61 67 65 20 70 67 6e 6f 52 6f 6f 74 2e 0a 2a 2a  age pgnoRoot..**
3f30: 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69  .** Otherwise, i
3f40: 66 20 61 72 67 75 6d 65 6e 74 20 69 73 43 6c 65  f argument isCle
3f50: 61 72 54 61 62 6c 65 20 69 73 20 66 61 6c 73 65  arTable is false
3f60: 2c 20 74 68 65 6e 20 74 68 65 20 72 6f 77 20 77  , then the row w
3f70: 69 74 68 0a 2a 2a 20 72 6f 77 69 64 20 69 52 6f  ith.** rowid iRo
3f80: 77 20 69 73 20 62 65 69 6e 67 20 72 65 70 6c 61  w is being repla
3f90: 63 65 64 20 6f 72 20 64 65 6c 65 74 65 64 2e 20  ced or deleted. 
3fa0: 49 6e 20 74 68 69 73 20 63 61 73 65 20 69 6e 76  In this case inv
3fb0: 61 6c 69 64 61 74 65 0a 2a 2a 20 6f 6e 6c 79 20  alidate.** only 
3fc0: 74 68 6f 73 65 20 69 6e 63 72 62 6c 6f 62 20 63  those incrblob c
3fd0: 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74  ursors open on t
3fe0: 68 61 74 20 73 70 65 63 69 66 69 63 20 72 6f 77  hat specific row
3ff0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
4000: 20 69 6e 76 61 6c 69 64 61 74 65 49 6e 63 72 62   invalidateIncrb
4010: 6c 6f 62 43 75 72 73 6f 72 73 28 0a 20 20 42 74  lobCursors(.  Bt
4020: 72 65 65 20 2a 70 42 74 72 65 65 2c 20 20 20 20  ree *pBtree,    
4030: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74        /* The dat
4040: 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 63 68  abase file to ch
4050: 65 63 6b 20 2a 2f 0a 20 20 69 36 34 20 69 52 6f  eck */.  i64 iRo
4060: 77 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  w,              
4070: 20 2f 2a 20 54 68 65 20 72 6f 77 69 64 20 74 68   /* The rowid th
4080: 61 74 20 6d 69 67 68 74 20 62 65 20 63 68 61 6e  at might be chan
4090: 67 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 69 73  ging */.  int is
40a0: 43 6c 65 61 72 54 61 62 6c 65 20 20 20 20 20 20  ClearTable      
40b0: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 6c 6c    /* True if all
40c0: 20 72 6f 77 73 20 61 72 65 20 62 65 69 6e 67 20   rows are being 
40d0: 64 65 6c 65 74 65 64 20 2a 2f 0a 29 7b 0a 20 20  deleted */.){.  
40e0: 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 42  BtCursor *p;.  B
40f0: 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
4100: 42 74 72 65 65 2d 3e 70 42 74 3b 0a 20 20 61 73  Btree->pBt;.  as
4110: 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72  sert( sqlite3Btr
4120: 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 42 74  eeHoldsMutex(pBt
4130: 72 65 65 29 20 29 3b 0a 20 20 66 6f 72 28 70 3d  ree) );.  for(p=
4140: 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b  pBt->pCursor; p;
4150: 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20   p=p->pNext){.  
4160: 20 20 69 66 28 20 28 70 2d 3e 63 75 72 46 6c 61    if( (p->curFla
4170: 67 73 20 26 20 42 54 43 46 5f 49 6e 63 72 62 6c  gs & BTCF_Incrbl
4180: 6f 62 29 21 3d 30 0a 20 20 20 20 20 26 26 20 28  ob)!=0.     && (
4190: 69 73 43 6c 65 61 72 54 61 62 6c 65 20 7c 7c 20  isClearTable || 
41a0: 70 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 69 52  p->info.nKey==iR
41b0: 6f 77 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  ow).    ){.     
41c0: 20 70 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52   p->eState = CUR
41d0: 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20  SOR_INVALID;.   
41e0: 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 65 6c 73 65 0a   }.  }.}..#else.
41f0: 20 20 2f 2a 20 53 74 75 62 20 66 75 6e 63 74 69    /* Stub functi
4200: 6f 6e 20 77 68 65 6e 20 49 4e 43 52 42 4c 4f 42  on when INCRBLOB
4210: 20 69 73 20 6f 6d 69 74 74 65 64 20 2a 2f 0a 20   is omitted */. 
4220: 20 23 64 65 66 69 6e 65 20 69 6e 76 61 6c 69 64   #define invalid
4230: 61 74 65 49 6e 63 72 62 6c 6f 62 43 75 72 73 6f  ateIncrblobCurso
4240: 72 73 28 78 2c 79 2c 7a 29 0a 23 65 6e 64 69 66  rs(x,y,z).#endif
4250: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
4260: 49 4e 43 52 42 4c 4f 42 20 2a 2f 0a 0a 2f 2a 0a  INCRBLOB */../*.
4270: 2a 2a 20 53 65 74 20 62 69 74 20 70 67 6e 6f 20  ** Set bit pgno 
4280: 6f 66 20 74 68 65 20 42 74 53 68 61 72 65 64 2e  of the BtShared.
4290: 70 48 61 73 43 6f 6e 74 65 6e 74 20 62 69 74 76  pHasContent bitv
42a0: 65 63 2e 20 54 68 69 73 20 69 73 20 63 61 6c 6c  ec. This is call
42b0: 65 64 20 0a 2a 2a 20 77 68 65 6e 20 61 20 70 61  ed .** when a pa
42c0: 67 65 20 74 68 61 74 20 70 72 65 76 69 6f 75 73  ge that previous
42d0: 6c 79 20 63 6f 6e 74 61 69 6e 65 64 20 64 61 74  ly contained dat
42e0: 61 20 62 65 63 6f 6d 65 73 20 61 20 66 72 65 65  a becomes a free
42f0: 2d 6c 69 73 74 20 6c 65 61 66 20 0a 2a 2a 20 70  -list leaf .** p
4300: 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 42  age..**.** The B
4310: 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74  tShared.pHasCont
4320: 65 6e 74 20 62 69 74 76 65 63 20 65 78 69 73 74  ent bitvec exist
4330: 73 20 74 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64  s to work around
4340: 20 61 6e 20 6f 62 73 63 75 72 65 0a 2a 2a 20 62   an obscure.** b
4350: 75 67 20 63 61 75 73 65 64 20 62 79 20 74 68 65  ug caused by the
4360: 20 69 6e 74 65 72 61 63 74 69 6f 6e 20 6f 66 20   interaction of 
4370: 74 77 6f 20 75 73 65 66 75 6c 20 49 4f 20 6f 70  two useful IO op
4380: 74 69 6d 69 7a 61 74 69 6f 6e 73 20 73 75 72 72  timizations surr
4390: 6f 75 6e 64 69 6e 67 0a 2a 2a 20 66 72 65 65 2d  ounding.** free-
43a0: 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65 73 3a  list leaf pages:
43b0: 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20 57 68 65 6e  .**.**   1) When
43c0: 20 61 6c 6c 20 64 61 74 61 20 69 73 20 64 65 6c   all data is del
43d0: 65 74 65 64 20 66 72 6f 6d 20 61 20 70 61 67 65  eted from a page
43e0: 20 61 6e 64 20 74 68 65 20 70 61 67 65 20 62 65   and the page be
43f0: 63 6f 6d 65 73 0a 2a 2a 20 20 20 20 20 20 61 20  comes.**      a 
4400: 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70  free-list leaf p
4410: 61 67 65 2c 20 74 68 65 20 70 61 67 65 20 69 73  age, the page is
4420: 20 6e 6f 74 20 77 72 69 74 74 65 6e 20 74 6f 20   not written to 
4430: 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  the database.** 
4440: 20 20 20 20 20 28 61 73 20 66 72 65 65 2d 6c 69       (as free-li
4450: 73 74 20 6c 65 61 66 20 70 61 67 65 73 20 63 6f  st leaf pages co
4460: 6e 74 61 69 6e 20 6e 6f 20 6d 65 61 6e 69 6e 67  ntain no meaning
4470: 66 75 6c 20 64 61 74 61 29 2e 20 53 6f 6d 65 74  ful data). Somet
4480: 69 6d 65 73 0a 2a 2a 20 20 20 20 20 20 73 75 63  imes.**      suc
4490: 68 20 61 20 70 61 67 65 20 69 73 20 6e 6f 74 20  h a page is not 
44a0: 65 76 65 6e 20 6a 6f 75 72 6e 61 6c 6c 65 64 20  even journalled 
44b0: 28 61 73 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20  (as it will not 
44c0: 62 65 20 6d 6f 64 69 66 69 65 64 2c 0a 2a 2a 20  be modified,.** 
44d0: 20 20 20 20 20 77 68 79 20 62 6f 74 68 65 72 20       why bother 
44e0: 6a 6f 75 72 6e 61 6c 6c 69 6e 67 20 69 74 3f 29  journalling it?)
44f0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 29 20 57 68 65  ..**.**   2) Whe
4500: 6e 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65  n a free-list le
4510: 61 66 20 70 61 67 65 20 69 73 20 72 65 75 73 65  af page is reuse
4520: 64 2c 20 69 74 73 20 63 6f 6e 74 65 6e 74 20 69  d, its content i
4530: 73 20 6e 6f 74 20 72 65 61 64 0a 2a 2a 20 20 20  s not read.**   
4540: 20 20 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61     from the data
4550: 62 61 73 65 20 6f 72 20 77 72 69 74 74 65 6e 20  base or written 
4560: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
4570: 69 6c 65 20 28 77 68 79 20 73 68 6f 75 6c 64 20  ile (why should 
4580: 69 74 0a 2a 2a 20 20 20 20 20 20 62 65 2c 20 69  it.**      be, i
4590: 66 20 69 74 20 69 73 20 6e 6f 74 20 61 74 20 61  f it is not at a
45a0: 6c 6c 20 6d 65 61 6e 69 6e 67 66 75 6c 3f 29 2e  ll meaningful?).
45b0: 0a 2a 2a 0a 2a 2a 20 42 79 20 74 68 65 6d 73 65  .**.** By themse
45c0: 6c 76 65 73 2c 20 74 68 65 73 65 20 6f 70 74 69  lves, these opti
45d0: 6d 69 7a 61 74 69 6f 6e 73 20 77 6f 72 6b 20 66  mizations work f
45e0: 69 6e 65 20 61 6e 64 20 70 72 6f 76 69 64 65 20  ine and provide 
45f0: 61 20 68 61 6e 64 79 0a 2a 2a 20 70 65 72 66 6f  a handy.** perfo
4600: 72 6d 61 6e 63 65 20 62 6f 6f 73 74 20 74 6f 20  rmance boost to 
4610: 62 75 6c 6b 20 64 65 6c 65 74 65 20 6f 72 20 69  bulk delete or i
4620: 6e 73 65 72 74 20 6f 70 65 72 61 74 69 6f 6e 73  nsert operations
4630: 2e 20 48 6f 77 65 76 65 72 2c 20 69 66 0a 2a 2a  . However, if.**
4640: 20 61 20 70 61 67 65 20 69 73 20 6d 6f 76 65 64   a page is moved
4650: 20 74 6f 20 74 68 65 20 66 72 65 65 2d 6c 69 73   to the free-lis
4660: 74 20 61 6e 64 20 74 68 65 6e 20 72 65 75 73 65  t and then reuse
4670: 64 20 77 69 74 68 69 6e 20 74 68 65 20 73 61 6d  d within the sam
4680: 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e  e.** transaction
4690: 2c 20 61 20 70 72 6f 62 6c 65 6d 20 63 6f 6d 65  , a problem come
46a0: 73 20 75 70 2e 20 49 66 20 74 68 65 20 70 61 67  s up. If the pag
46b0: 65 20 69 73 20 6e 6f 74 20 6a 6f 75 72 6e 61 6c  e is not journal
46c0: 6c 65 64 20 77 68 65 6e 0a 2a 2a 20 69 74 20 69  led when.** it i
46d0: 73 20 6d 6f 76 65 64 20 74 6f 20 74 68 65 20 66  s moved to the f
46e0: 72 65 65 2d 6c 69 73 74 20 61 6e 64 20 69 74 20  ree-list and it 
46f0: 69 73 20 61 6c 73 6f 20 6e 6f 74 20 6a 6f 75 72  is also not jour
4700: 6e 61 6c 6c 65 64 20 77 68 65 6e 20 69 74 0a 2a  nalled when it.*
4710: 2a 20 69 73 20 65 78 74 72 61 63 74 65 64 20 66  * is extracted f
4720: 72 6f 6d 20 74 68 65 20 66 72 65 65 2d 6c 69 73  rom the free-lis
4730: 74 20 61 6e 64 20 72 65 75 73 65 64 2c 20 74 68  t and reused, th
4740: 65 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  en the original 
4750: 64 61 74 61 0a 2a 2a 20 6d 61 79 20 62 65 20 6c  data.** may be l
4760: 6f 73 74 2e 20 49 6e 20 74 68 65 20 65 76 65 6e  ost. In the even
4770: 74 20 6f 66 20 61 20 72 6f 6c 6c 62 61 63 6b 2c  t of a rollback,
4780: 20 69 74 20 6d 61 79 20 6e 6f 74 20 62 65 20 70   it may not be p
4790: 6f 73 73 69 62 6c 65 0a 2a 2a 20 74 6f 20 72 65  ossible.** to re
47a0: 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 62 61  store the databa
47b0: 73 65 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e  se to its origin
47c0: 61 6c 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  al configuration
47d0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 6f 6c 75  ..**.** The solu
47e0: 74 69 6f 6e 20 69 73 20 74 68 65 20 42 74 53 68  tion is the BtSh
47f0: 61 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74  ared.pHasContent
4800: 20 62 69 74 76 65 63 2e 20 57 68 65 6e 65 76 65   bitvec. Wheneve
4810: 72 20 61 20 70 61 67 65 20 69 73 20 0a 2a 2a 20  r a page is .** 
4820: 6d 6f 76 65 64 20 74 6f 20 62 65 63 6f 6d 65 20  moved to become 
4830: 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66  a free-list leaf
4840: 20 70 61 67 65 2c 20 74 68 65 20 63 6f 72 72 65   page, the corre
4850: 73 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 0a  sponding bit is.
4860: 2a 2a 20 73 65 74 20 69 6e 20 74 68 65 20 62 69  ** set in the bi
4870: 74 76 65 63 2e 20 57 68 65 6e 65 76 65 72 20 61  tvec. Whenever a
4880: 20 6c 65 61 66 20 70 61 67 65 20 69 73 20 65 78   leaf page is ex
4890: 74 72 61 63 74 65 64 20 66 72 6f 6d 20 74 68 65  tracted from the
48a0: 20 66 72 65 65 2d 6c 69 73 74 2c 0a 2a 2a 20 6f   free-list,.** o
48b0: 70 74 69 6d 69 7a 61 74 69 6f 6e 20 32 20 61 62  ptimization 2 ab
48c0: 6f 76 65 20 69 73 20 6f 6d 69 74 74 65 64 20 69  ove is omitted i
48d0: 66 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  f the correspond
48e0: 69 6e 67 20 62 69 74 20 69 73 20 61 6c 72 65 61  ing bit is alrea
48f0: 64 79 0a 2a 2a 20 73 65 74 20 69 6e 20 42 74 53  dy.** set in BtS
4900: 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e  hared.pHasConten
4910: 74 2e 20 54 68 65 20 63 6f 6e 74 65 6e 74 73 20  t. The contents 
4920: 6f 66 20 74 68 65 20 62 69 74 76 65 63 20 61 72  of the bitvec ar
4930: 65 20 63 6c 65 61 72 65 64 0a 2a 2a 20 61 74 20  e cleared.** at 
4940: 74 68 65 20 65 6e 64 20 6f 66 20 65 76 65 72 79  the end of every
4950: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f   transaction..*/
4960: 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65  .static int btre
4970: 65 53 65 74 48 61 73 43 6f 6e 74 65 6e 74 28 42  eSetHasContent(B
4980: 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67  tShared *pBt, Pg
4990: 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 69 6e 74 20  no pgno){.  int 
49a0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
49b0: 20 20 69 66 28 20 21 70 42 74 2d 3e 70 48 61 73    if( !pBt->pHas
49c0: 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20 61  Content ){.    a
49d0: 73 73 65 72 74 28 20 70 67 6e 6f 3c 3d 70 42 74  ssert( pgno<=pBt
49e0: 2d 3e 6e 50 61 67 65 20 29 3b 0a 20 20 20 20 70  ->nPage );.    p
49f0: 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20  Bt->pHasContent 
4a00: 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 43  = sqlite3BitvecC
4a10: 72 65 61 74 65 28 70 42 74 2d 3e 6e 50 61 67 65  reate(pBt->nPage
4a20: 29 3b 0a 20 20 20 20 69 66 28 20 21 70 42 74 2d  );.    if( !pBt-
4a30: 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20 29 7b 0a  >pHasContent ){.
4a40: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
4a50: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20  E_NOMEM;.    }. 
4a60: 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c   }.  if( rc==SQL
4a70: 49 54 45 5f 4f 4b 20 26 26 20 70 67 6e 6f 3c 3d  ITE_OK && pgno<=
4a80: 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 69 7a  sqlite3BitvecSiz
4a90: 65 28 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65  e(pBt->pHasConte
4aa0: 6e 74 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  nt) ){.    rc = 
4ab0: 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 65 74  sqlite3BitvecSet
4ac0: 28 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e  (pBt->pHasConten
4ad0: 74 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20  t, pgno);.  }.  
4ae0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
4af0: 0a 2a 2a 20 51 75 65 72 79 20 74 68 65 20 42 74  .** Query the Bt
4b00: 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74 65  Shared.pHasConte
4b10: 6e 74 20 76 65 63 74 6f 72 2e 0a 2a 2a 0a 2a 2a  nt vector..**.**
4b20: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
4b30: 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20  s called when a 
4b40: 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70  free-list leaf p
4b50: 61 67 65 20 69 73 20 72 65 6d 6f 76 65 64 20 66  age is removed f
4b60: 72 6f 6d 20 74 68 65 0a 2a 2a 20 66 72 65 65 2d  rom the.** free-
4b70: 6c 69 73 74 20 66 6f 72 20 72 65 75 73 65 2e 20  list for reuse. 
4b80: 49 74 20 72 65 74 75 72 6e 73 20 66 61 6c 73 65  It returns false
4b90: 20 69 66 20 69 74 20 69 73 20 73 61 66 65 20 74   if it is safe t
4ba0: 6f 20 72 65 74 72 69 65 76 65 20 74 68 65 0a 2a  o retrieve the.*
4bb0: 2a 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20  * page from the 
4bc0: 70 61 67 65 72 20 6c 61 79 65 72 20 77 69 74 68  pager layer with
4bd0: 20 74 68 65 20 27 6e 6f 2d 63 6f 6e 74 65 6e 74   the 'no-content
4be0: 27 20 66 6c 61 67 20 73 65 74 2e 20 54 72 75 65  ' flag set. True
4bf0: 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73   otherwise..*/.s
4c00: 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 47  tatic int btreeG
4c10: 65 74 48 61 73 43 6f 6e 74 65 6e 74 28 42 74 53  etHasContent(BtS
4c20: 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f  hared *pBt, Pgno
4c30: 20 70 67 6e 6f 29 7b 0a 20 20 42 69 74 76 65 63   pgno){.  Bitvec
4c40: 20 2a 70 20 3d 20 70 42 74 2d 3e 70 48 61 73 43   *p = pBt->pHasC
4c50: 6f 6e 74 65 6e 74 3b 0a 20 20 72 65 74 75 72 6e  ontent;.  return
4c60: 20 28 70 20 26 26 20 28 70 67 6e 6f 3e 73 71 6c   (p && (pgno>sql
4c70: 69 74 65 33 42 69 74 76 65 63 53 69 7a 65 28 70  ite3BitvecSize(p
4c80: 29 20 7c 7c 20 73 71 6c 69 74 65 33 42 69 74 76  ) || sqlite3Bitv
4c90: 65 63 54 65 73 74 28 70 2c 20 70 67 6e 6f 29 29  ecTest(p, pgno))
4ca0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61  );.}../*.** Clea
4cb0: 72 20 28 64 65 73 74 72 6f 79 29 20 74 68 65 20  r (destroy) the 
4cc0: 42 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e  BtShared.pHasCon
4cd0: 74 65 6e 74 20 62 69 74 76 65 63 2e 20 54 68 69  tent bitvec. Thi
4ce0: 73 20 73 68 6f 75 6c 64 20 62 65 0a 2a 2a 20 69  s should be.** i
4cf0: 6e 76 6f 6b 65 64 20 61 74 20 74 68 65 20 63 6f  nvoked at the co
4d00: 6e 63 6c 75 73 69 6f 6e 20 6f 66 20 65 61 63 68  nclusion of each
4d10: 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
4d20: 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  on..*/.static vo
4d30: 69 64 20 62 74 72 65 65 43 6c 65 61 72 48 61 73  id btreeClearHas
4d40: 43 6f 6e 74 65 6e 74 28 42 74 53 68 61 72 65 64  Content(BtShared
4d50: 20 2a 70 42 74 29 7b 0a 20 20 73 71 6c 69 74 65   *pBt){.  sqlite
4d60: 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70  3BitvecDestroy(p
4d70: 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 29  Bt->pHasContent)
4d80: 3b 0a 20 20 70 42 74 2d 3e 70 48 61 73 43 6f 6e  ;.  pBt->pHasCon
4d90: 74 65 6e 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  tent = 0;.}../*.
4da0: 2a 2a 20 52 65 6c 65 61 73 65 20 61 6c 6c 20 6f  ** Release all o
4db0: 66 20 74 68 65 20 61 70 50 61 67 65 5b 5d 20 70  f the apPage[] p
4dc0: 61 67 65 73 20 66 6f 72 20 61 20 63 75 72 73 6f  ages for a curso
4dd0: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  r..*/.static voi
4de0: 64 20 62 74 72 65 65 52 65 6c 65 61 73 65 41 6c  d btreeReleaseAl
4df0: 6c 43 75 72 73 6f 72 50 61 67 65 73 28 42 74 43  lCursorPages(BtC
4e00: 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
4e10: 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30  int i;.  for(i=0
4e20: 3b 20 69 3c 3d 70 43 75 72 2d 3e 69 50 61 67 65  ; i<=pCur->iPage
4e30: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 72 65 6c 65  ; i++){.    rele
4e40: 61 73 65 50 61 67 65 28 70 43 75 72 2d 3e 61 70  asePage(pCur->ap
4e50: 50 61 67 65 5b 69 5d 29 3b 0a 20 20 20 20 70 43  Page[i]);.    pC
4e60: 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d 20 3d 20  ur->apPage[i] = 
4e70: 30 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 69  0;.  }.  pCur->i
4e80: 50 61 67 65 20 3d 20 2d 31 3b 0a 7d 0a 0a 0a 2f  Page = -1;.}.../
4e90: 2a 0a 2a 2a 20 53 61 76 65 20 74 68 65 20 63 75  *.** Save the cu
4ea0: 72 72 65 6e 74 20 63 75 72 73 6f 72 20 70 6f 73  rrent cursor pos
4eb0: 69 74 69 6f 6e 20 69 6e 20 74 68 65 20 76 61 72  ition in the var
4ec0: 69 61 62 6c 65 73 20 42 74 43 75 72 73 6f 72 2e  iables BtCursor.
4ed0: 6e 4b 65 79 20 0a 2a 2a 20 61 6e 64 20 42 74 43  nKey .** and BtC
4ee0: 75 72 73 6f 72 2e 70 4b 65 79 2e 20 54 68 65 20  ursor.pKey. The 
4ef0: 63 75 72 73 6f 72 27 73 20 73 74 61 74 65 20 69  cursor's state i
4f00: 73 20 73 65 74 20 74 6f 20 43 55 52 53 4f 52 5f  s set to CURSOR_
4f10: 52 45 51 55 49 52 45 53 45 45 4b 2e 0a 2a 2a 0a  REQUIRESEEK..**.
4f20: 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75  ** The caller mu
4f30: 73 74 20 65 6e 73 75 72 65 20 74 68 61 74 20 74  st ensure that t
4f40: 68 65 20 63 75 72 73 6f 72 20 69 73 20 76 61 6c  he cursor is val
4f50: 69 64 20 28 68 61 73 20 65 53 74 61 74 65 3d 3d  id (has eState==
4f60: 43 55 52 53 4f 52 5f 56 41 4c 49 44 29 0a 2a 2a  CURSOR_VALID).**
4f70: 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e   prior to callin
4f80: 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20  g this routine. 
4f90: 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20   .*/.static int 
4fa0: 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69  saveCursorPositi
4fb0: 6f 6e 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  on(BtCursor *pCu
4fc0: 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  r){.  int rc;.. 
4fd0: 20 61 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f   assert( CURSOR_
4fe0: 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74  VALID==pCur->eSt
4ff0: 61 74 65 20 7c 7c 20 43 55 52 53 4f 52 5f 53 4b  ate || CURSOR_SK
5000: 49 50 4e 45 58 54 3d 3d 70 43 75 72 2d 3e 65 53  IPNEXT==pCur->eS
5010: 74 61 74 65 20 29 3b 0a 20 20 61 73 73 65 72 74  tate );.  assert
5020: 28 20 30 3d 3d 70 43 75 72 2d 3e 70 4b 65 79 20  ( 0==pCur->pKey 
5030: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  );.  assert( cur
5040: 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
5050: 75 72 29 20 29 3b 0a 0a 20 20 69 66 28 20 70 43  ur) );..  if( pC
5060: 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
5070: 4f 52 5f 53 4b 49 50 4e 45 58 54 20 29 7b 0a 20  OR_SKIPNEXT ){. 
5080: 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20     pCur->eState 
5090: 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a  = CURSOR_VALID;.
50a0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 43 75    }else{.    pCu
50b0: 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b  r->skipNext = 0;
50c0: 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69  .  }.  rc = sqli
50d0: 74 65 33 42 74 72 65 65 4b 65 79 53 69 7a 65 28  te3BtreeKeySize(
50e0: 70 43 75 72 2c 20 26 70 43 75 72 2d 3e 6e 4b 65  pCur, &pCur->nKe
50f0: 79 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63  y);.  assert( rc
5100: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 20 20  ==SQLITE_OK );  
5110: 2f 2a 20 4b 65 79 53 69 7a 65 28 29 20 63 61 6e  /* KeySize() can
5120: 6e 6f 74 20 66 61 69 6c 20 2a 2f 0a 0a 20 20 2f  not fail */..  /
5130: 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20  * If this is an 
5140: 69 6e 74 4b 65 79 20 74 61 62 6c 65 2c 20 74 68  intKey table, th
5150: 65 6e 20 74 68 65 20 61 62 6f 76 65 20 63 61 6c  en the above cal
5160: 6c 20 74 6f 20 42 74 72 65 65 4b 65 79 53 69 7a  l to BtreeKeySiz
5170: 65 28 29 0a 20 20 2a 2a 20 73 74 6f 72 65 73 20  e().  ** stores 
5180: 74 68 65 20 69 6e 74 65 67 65 72 20 6b 65 79 20  the integer key 
5190: 69 6e 20 70 43 75 72 2d 3e 6e 4b 65 79 2e 20 49  in pCur->nKey. I
51a0: 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 69 73  n this case this
51b0: 20 76 61 6c 75 65 20 69 73 0a 20 20 2a 2a 20 61   value is.  ** a
51c0: 6c 6c 20 74 68 61 74 20 69 73 20 72 65 71 75 69  ll that is requi
51d0: 72 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  red. Otherwise, 
51e0: 69 66 20 70 43 75 72 20 69 73 20 6e 6f 74 20 6f  if pCur is not o
51f0: 70 65 6e 20 6f 6e 20 61 6e 20 69 6e 74 4b 65 79  pen on an intKey
5200: 0a 20 20 2a 2a 20 74 61 62 6c 65 2c 20 74 68 65  .  ** table, the
5210: 6e 20 6d 61 6c 6c 6f 63 20 73 70 61 63 65 20 66  n malloc space f
5220: 6f 72 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65  or and store the
5230: 20 70 43 75 72 2d 3e 6e 4b 65 79 20 62 79 74 65   pCur->nKey byte
5240: 73 20 6f 66 20 6b 65 79 20 0a 20 20 2a 2a 20 64  s of key .  ** d
5250: 61 74 61 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ata..  */.  if( 
5260: 30 3d 3d 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  0==pCur->apPage[
5270: 30 5d 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20  0]->intKey ){.  
5280: 20 20 76 6f 69 64 20 2a 70 4b 65 79 20 3d 20 73    void *pKey = s
5290: 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 20 70 43  qlite3Malloc( pC
52a0: 75 72 2d 3e 6e 4b 65 79 20 29 3b 0a 20 20 20 20  ur->nKey );.    
52b0: 69 66 28 20 70 4b 65 79 20 29 7b 0a 20 20 20 20  if( pKey ){.    
52c0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
52d0: 72 65 65 4b 65 79 28 70 43 75 72 2c 20 30 2c 20  reeKey(pCur, 0, 
52e0: 28 69 6e 74 29 70 43 75 72 2d 3e 6e 4b 65 79 2c  (int)pCur->nKey,
52f0: 20 70 4b 65 79 29 3b 0a 20 20 20 20 20 20 69 66   pKey);.      if
5300: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
5310: 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d  ){.        pCur-
5320: 3e 70 4b 65 79 20 3d 20 70 4b 65 79 3b 0a 20 20  >pKey = pKey;.  
5330: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
5340: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
5350: 70 4b 65 79 29 3b 0a 20 20 20 20 20 20 7d 0a 20  pKey);.      }. 
5360: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
5370: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
5380: 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61  M;.    }.  }.  a
5390: 73 73 65 72 74 28 20 21 70 43 75 72 2d 3e 61 70  ssert( !pCur->ap
53a0: 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20  Page[0]->intKey 
53b0: 7c 7c 20 21 70 43 75 72 2d 3e 70 4b 65 79 20 29  || !pCur->pKey )
53c0: 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  ;..  if( rc==SQL
53d0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 62 74  ITE_OK ){.    bt
53e0: 72 65 65 52 65 6c 65 61 73 65 41 6c 6c 43 75 72  reeReleaseAllCur
53f0: 73 6f 72 50 61 67 65 73 28 70 43 75 72 29 3b 0a  sorPages(pCur);.
5400: 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65      pCur->eState
5410: 20 3d 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52   = CURSOR_REQUIR
5420: 45 53 45 45 4b 3b 0a 20 20 7d 0a 0a 20 20 69 6e  ESEEK;.  }..  in
5430: 76 61 6c 69 64 61 74 65 4f 76 65 72 66 6c 6f 77  validateOverflow
5440: 43 61 63 68 65 28 70 43 75 72 29 3b 0a 20 20 72  Cache(pCur);.  r
5450: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20  eturn rc;.}../* 
5460: 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63  Forward referenc
5470: 65 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  e */.static int 
5480: 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20  SQLITE_NOINLINE 
5490: 73 61 76 65 43 75 72 73 6f 72 73 4f 6e 4c 69 73  saveCursorsOnLis
54a0: 74 28 42 74 43 75 72 73 6f 72 2a 2c 50 67 6e 6f  t(BtCursor*,Pgno
54b0: 2c 42 74 43 75 72 73 6f 72 2a 29 3b 0a 0a 2f 2a  ,BtCursor*);../*
54c0: 0a 2a 2a 20 53 61 76 65 20 74 68 65 20 70 6f 73  .** Save the pos
54d0: 69 74 69 6f 6e 73 20 6f 66 20 61 6c 6c 20 63 75  itions of all cu
54e0: 72 73 6f 72 73 20 28 65 78 63 65 70 74 20 70 45  rsors (except pE
54f0: 78 63 65 70 74 29 20 74 68 61 74 20 61 72 65 20  xcept) that are 
5500: 6f 70 65 6e 20 6f 6e 0a 2a 2a 20 74 68 65 20 74  open on.** the t
5510: 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70  able with root-p
5520: 61 67 65 20 69 52 6f 6f 74 2e 20 20 22 53 61 76  age iRoot.  "Sav
5530: 69 6e 67 20 74 68 65 20 63 75 72 73 6f 72 20 70  ing the cursor p
5540: 6f 73 69 74 69 6f 6e 22 20 6d 65 61 6e 73 20 74  osition" means t
5550: 68 61 74 0a 2a 2a 20 74 68 65 20 6c 6f 63 61 74  hat.** the locat
5560: 69 6f 6e 20 69 6e 20 74 68 65 20 62 74 72 65 65  ion in the btree
5570: 20 69 73 20 72 65 6d 65 6d 62 65 72 65 64 20 69   is remembered i
5580: 6e 20 73 75 63 68 20 61 20 77 61 79 20 74 68 61  n such a way tha
5590: 74 20 69 74 20 63 61 6e 20 62 65 0a 2a 2a 20 6d  t it can be.** m
55a0: 6f 76 65 64 20 62 61 63 6b 20 74 6f 20 74 68 65  oved back to the
55b0: 20 73 61 6d 65 20 73 70 6f 74 20 61 66 74 65 72   same spot after
55c0: 20 74 68 65 20 62 74 72 65 65 20 68 61 73 20 62   the btree has b
55d0: 65 65 6e 20 6d 6f 64 69 66 69 65 64 2e 20 20 54  een modified.  T
55e0: 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69  his.** routine i
55f0: 73 20 63 61 6c 6c 65 64 20 6a 75 73 74 20 62 65  s called just be
5600: 66 6f 72 65 20 63 75 72 73 6f 72 20 70 45 78 63  fore cursor pExc
5610: 65 70 74 20 69 73 20 75 73 65 64 20 74 6f 20 6d  ept is used to m
5620: 6f 64 69 66 79 20 74 68 65 0a 2a 2a 20 74 61 62  odify the.** tab
5630: 6c 65 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 20  le, for example 
5640: 69 6e 20 42 74 72 65 65 44 65 6c 65 74 65 28 29  in BtreeDelete()
5650: 20 6f 72 20 42 74 72 65 65 49 6e 73 65 72 74 28   or BtreeInsert(
5660: 29 2e 0a 2a 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65  )..**.** Impleme
5670: 6e 74 61 74 69 6f 6e 20 6e 6f 74 65 3a 20 20 54  ntation note:  T
5680: 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 65 72 65  his routine mere
5690: 6c 79 20 63 68 65 63 6b 73 20 74 6f 20 73 65 65  ly checks to see
56a0: 20 69 66 20 61 6e 79 20 63 75 72 73 6f 72 73 0a   if any cursors.
56b0: 2a 2a 20 6e 65 65 64 20 74 6f 20 62 65 20 73 61  ** need to be sa
56c0: 76 65 64 2e 20 20 49 74 20 63 61 6c 6c 73 20 6f  ved.  It calls o
56d0: 75 74 20 74 6f 20 73 61 76 65 43 75 72 73 6f 72  ut to saveCursor
56e0: 73 4f 6e 4c 69 73 74 28 29 20 69 6e 20 74 68 65  sOnList() in the
56f0: 20 28 75 6e 75 73 75 61 6c 29 0a 2a 2a 20 65 76   (unusual).** ev
5700: 65 6e 74 20 74 68 61 74 20 63 75 72 73 6f 72 73  ent that cursors
5710: 20 61 72 65 20 69 6e 20 6e 65 65 64 20 74 6f 20   are in need to 
5720: 62 65 69 6e 67 20 73 61 76 65 64 2e 0a 2a 2f 0a  being saved..*/.
5730: 73 74 61 74 69 63 20 69 6e 74 20 73 61 76 65 41  static int saveA
5740: 6c 6c 43 75 72 73 6f 72 73 28 42 74 53 68 61 72  llCursors(BtShar
5750: 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 69 52  ed *pBt, Pgno iR
5760: 6f 6f 74 2c 20 42 74 43 75 72 73 6f 72 20 2a 70  oot, BtCursor *p
5770: 45 78 63 65 70 74 29 7b 0a 20 20 42 74 43 75 72  Except){.  BtCur
5780: 73 6f 72 20 2a 70 3b 0a 20 20 61 73 73 65 72 74  sor *p;.  assert
5790: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
57a0: 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
57b0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45   );.  assert( pE
57c0: 78 63 65 70 74 3d 3d 30 20 7c 7c 20 70 45 78 63  xcept==0 || pExc
57d0: 65 70 74 2d 3e 70 42 74 3d 3d 70 42 74 20 29 3b  ept->pBt==pBt );
57e0: 0a 20 20 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43  .  for(p=pBt->pC
57f0: 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70  ursor; p; p=p->p
5800: 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70  Next){.    if( p
5810: 21 3d 70 45 78 63 65 70 74 20 26 26 20 28 30 3d  !=pExcept && (0=
5820: 3d 69 52 6f 6f 74 20 7c 7c 20 70 2d 3e 70 67 6e  =iRoot || p->pgn
5830: 6f 52 6f 6f 74 3d 3d 69 52 6f 6f 74 29 20 29 20  oRoot==iRoot) ) 
5840: 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74  break;.  }.  ret
5850: 75 72 6e 20 70 20 3f 20 73 61 76 65 43 75 72 73  urn p ? saveCurs
5860: 6f 72 73 4f 6e 4c 69 73 74 28 70 2c 20 69 52 6f  orsOnList(p, iRo
5870: 6f 74 2c 20 70 45 78 63 65 70 74 29 20 3a 20 53  ot, pExcept) : S
5880: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20  QLITE_OK;.}../* 
5890: 54 68 69 73 20 68 65 6c 70 65 72 20 72 6f 75 74  This helper rout
58a0: 69 6e 65 20 74 6f 20 73 61 76 65 41 6c 6c 43 75  ine to saveAllCu
58b0: 72 73 6f 72 73 20 64 6f 65 73 20 74 68 65 20 61  rsors does the a
58c0: 63 74 75 61 6c 20 77 6f 72 6b 20 6f 66 20 73 61  ctual work of sa
58d0: 76 69 6e 67 0a 2a 2a 20 74 68 65 20 63 75 72 73  ving.** the curs
58e0: 6f 72 73 20 69 66 20 61 6e 64 20 77 68 65 6e 20  ors if and when 
58f0: 61 20 63 75 72 73 6f 72 20 69 73 20 66 6f 75 6e  a cursor is foun
5900: 64 20 74 68 61 74 20 61 63 74 75 61 6c 6c 79 20  d that actually 
5910: 72 65 71 75 69 72 65 73 20 73 61 76 69 6e 67 2e  requires saving.
5920: 0a 2a 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e 20 63  .** The common c
5930: 61 73 65 20 69 73 20 74 68 61 74 20 6e 6f 20 63  ase is that no c
5940: 75 72 73 6f 72 73 20 6e 65 65 64 20 74 6f 20 62  ursors need to b
5950: 65 20 73 61 76 65 64 2c 20 73 6f 20 74 68 69 73  e saved, so this
5960: 20 72 6f 75 74 69 6e 65 20 69 73 0a 2a 2a 20 62   routine is.** b
5970: 72 6f 6b 65 6e 20 6f 75 74 20 66 72 6f 6d 20 69  roken out from i
5980: 74 73 20 63 61 6c 6c 65 72 20 74 6f 20 61 76 6f  ts caller to avo
5990: 69 64 20 75 6e 6e 65 63 65 73 73 61 72 79 20 73  id unnecessary s
59a0: 74 61 63 6b 20 70 6f 69 6e 74 65 72 20 6d 6f 76  tack pointer mov
59b0: 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  ement..*/.static
59c0: 20 69 6e 74 20 53 51 4c 49 54 45 5f 4e 4f 49 4e   int SQLITE_NOIN
59d0: 4c 49 4e 45 20 73 61 76 65 43 75 72 73 6f 72 73  LINE saveCursors
59e0: 4f 6e 4c 69 73 74 28 0a 20 20 42 74 43 75 72 73  OnList(.  BtCurs
59f0: 6f 72 20 2a 70 2c 20 20 20 20 20 20 20 20 20 2f  or *p,         /
5a00: 2a 20 54 68 65 20 66 69 72 73 74 20 63 75 72 73  * The first curs
5a10: 6f 72 20 74 68 61 74 20 6e 65 65 64 73 20 73 61  or that needs sa
5a20: 76 69 6e 67 20 2a 2f 0a 20 20 50 67 6e 6f 20 69  ving */.  Pgno i
5a30: 52 6f 6f 74 2c 20 20 20 20 20 20 20 20 20 20 2f  Root,          /
5a40: 2a 20 4f 6e 6c 79 20 73 61 76 65 20 63 75 72 73  * Only save curs
5a50: 6f 72 20 77 69 74 68 20 74 68 69 73 20 69 52 6f  or with this iRo
5a60: 6f 74 2e 20 53 61 76 65 20 61 6c 6c 20 69 66 20  ot. Save all if 
5a70: 7a 65 72 6f 20 2a 2f 0a 20 20 42 74 43 75 72 73  zero */.  BtCurs
5a80: 6f 72 20 2a 70 45 78 63 65 70 74 20 20 20 20 2f  or *pExcept    /
5a90: 2a 20 44 6f 20 6e 6f 74 20 73 61 76 65 20 74 68  * Do not save th
5aa0: 69 73 20 63 75 72 73 6f 72 20 2a 2f 0a 29 7b 0a  is cursor */.){.
5ab0: 20 20 64 6f 7b 0a 20 20 20 20 69 66 28 20 70 21    do{.    if( p!
5ac0: 3d 70 45 78 63 65 70 74 20 26 26 20 28 30 3d 3d  =pExcept && (0==
5ad0: 69 52 6f 6f 74 20 7c 7c 20 70 2d 3e 70 67 6e 6f  iRoot || p->pgno
5ae0: 52 6f 6f 74 3d 3d 69 52 6f 6f 74 29 20 29 7b 0a  Root==iRoot) ){.
5af0: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 65 53 74        if( p->eSt
5b00: 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
5b10: 44 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d  D || p->eState==
5b20: 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54 20  CURSOR_SKIPNEXT 
5b30: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72  ){.        int r
5b40: 63 20 3d 20 73 61 76 65 43 75 72 73 6f 72 50 6f  c = saveCursorPo
5b50: 73 69 74 69 6f 6e 28 70 29 3b 0a 20 20 20 20 20  sition(p);.     
5b60: 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b     if( SQLITE_OK
5b70: 21 3d 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  !=rc ){.        
5b80: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
5b90: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
5ba0: 73 65 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74  se{.        test
5bb0: 63 61 73 65 28 20 70 2d 3e 69 50 61 67 65 3e 30  case( p->iPage>0
5bc0: 20 29 3b 0a 20 20 20 20 20 20 20 20 62 74 72 65   );.        btre
5bd0: 65 52 65 6c 65 61 73 65 41 6c 6c 43 75 72 73 6f  eReleaseAllCurso
5be0: 72 50 61 67 65 73 28 70 29 3b 0a 20 20 20 20 20  rPages(p);.     
5bf0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 20 3d   }.    }.    p =
5c00: 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 77 68   p->pNext;.  }wh
5c10: 69 6c 65 28 20 70 20 29 3b 0a 20 20 72 65 74 75  ile( p );.  retu
5c20: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
5c30: 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65  ./*.** Clear the
5c40: 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20   current cursor 
5c50: 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  position..*/.voi
5c60: 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c  d sqlite3BtreeCl
5c70: 65 61 72 43 75 72 73 6f 72 28 42 74 43 75 72 73  earCursor(BtCurs
5c80: 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73 73  or *pCur){.  ass
5c90: 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
5ca0: 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
5cb0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43   sqlite3_free(pC
5cc0: 75 72 2d 3e 70 4b 65 79 29 3b 0a 20 20 70 43 75  ur->pKey);.  pCu
5cd0: 72 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a 20 20 70  r->pKey = 0;.  p
5ce0: 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
5cf0: 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 7d 0a  RSOR_INVALID;.}.
5d00: 0a 2f 2a 0a 2a 2a 20 49 6e 20 74 68 69 73 20 76  ./*.** In this v
5d10: 65 72 73 69 6f 6e 20 6f 66 20 42 74 72 65 65 4d  ersion of BtreeM
5d20: 6f 76 65 74 6f 2c 20 70 4b 65 79 20 69 73 20 61  oveto, pKey is a
5d30: 20 70 61 63 6b 65 64 20 69 6e 64 65 78 20 72 65   packed index re
5d40: 63 6f 72 64 0a 2a 2a 20 73 75 63 68 20 61 73 20  cord.** such as 
5d50: 69 73 20 67 65 6e 65 72 61 74 65 64 20 62 79 20  is generated by 
5d60: 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  the OP_MakeRecor
5d70: 64 20 6f 70 63 6f 64 65 2e 20 20 55 6e 70 61 63  d opcode.  Unpac
5d80: 6b 20 74 68 65 0a 2a 2a 20 72 65 63 6f 72 64 20  k the.** record 
5d90: 61 6e 64 20 74 68 65 6e 20 63 61 6c 6c 20 42 74  and then call Bt
5da0: 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65  reeMovetoUnpacke
5db0: 64 28 29 20 74 6f 20 64 6f 20 74 68 65 20 77 6f  d() to do the wo
5dc0: 72 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  rk..*/.static in
5dd0: 74 20 62 74 72 65 65 4d 6f 76 65 74 6f 28 0a 20  t btreeMoveto(. 
5de0: 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c   BtCursor *pCur,
5df0: 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6f       /* Cursor o
5e00: 70 65 6e 20 6f 6e 20 74 68 65 20 62 74 72 65 65  pen on the btree
5e10: 20 74 6f 20 62 65 20 73 65 61 72 63 68 65 64 20   to be searched 
5e20: 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  */.  const void 
5e30: 2a 70 4b 65 79 2c 20 20 20 2f 2a 20 50 61 63 6b  *pKey,   /* Pack
5e40: 65 64 20 6b 65 79 20 69 66 20 74 68 65 20 62 74  ed key if the bt
5e50: 72 65 65 20 69 73 20 61 6e 20 69 6e 64 65 78 20  ree is an index 
5e60: 2a 2f 0a 20 20 69 36 34 20 6e 4b 65 79 2c 20 20  */.  i64 nKey,  
5e70: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 74 65           /* Inte
5e80: 67 65 72 20 6b 65 79 20 66 6f 72 20 74 61 62 6c  ger key for tabl
5e90: 65 73 2e 20 20 53 69 7a 65 20 6f 66 20 70 4b 65  es.  Size of pKe
5ea0: 79 20 66 6f 72 20 69 6e 64 69 63 65 73 20 2a 2f  y for indices */
5eb0: 0a 20 20 69 6e 74 20 62 69 61 73 2c 20 20 20 20  .  int bias,    
5ec0: 20 20 20 20 20 20 20 2f 2a 20 42 69 61 73 20 73         /* Bias s
5ed0: 65 61 72 63 68 20 74 6f 20 74 68 65 20 68 69 67  earch to the hig
5ee0: 68 20 65 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 2a  h end */.  int *
5ef0: 70 52 65 73 20 20 20 20 20 20 20 20 20 20 20 2f  pRes           /
5f00: 2a 20 57 72 69 74 65 20 73 65 61 72 63 68 20 72  * Write search r
5f10: 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 29  esults here */.)
5f20: 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  {.  int rc;     
5f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5f40: 2a 20 53 74 61 74 75 73 20 63 6f 64 65 20 2a 2f  * Status code */
5f50: 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  .  UnpackedRecor
5f60: 64 20 2a 70 49 64 78 4b 65 79 3b 20 20 20 2f 2a  d *pIdxKey;   /*
5f70: 20 55 6e 70 61 63 6b 65 64 20 69 6e 64 65 78 20   Unpacked index 
5f80: 6b 65 79 20 2a 2f 0a 20 20 63 68 61 72 20 61 53  key */.  char aS
5f90: 70 61 63 65 5b 32 30 30 5d 3b 20 20 20 20 20 20  pace[200];      
5fa0: 20 20 20 20 2f 2a 20 54 65 6d 70 20 73 70 61 63      /* Temp spac
5fb0: 65 20 66 6f 72 20 70 49 64 78 4b 65 79 20 2d 20  e for pIdxKey - 
5fc0: 74 6f 20 61 76 6f 69 64 20 61 20 6d 61 6c 6c 6f  to avoid a mallo
5fd0: 63 20 2a 2f 0a 20 20 63 68 61 72 20 2a 70 46 72  c */.  char *pFr
5fe0: 65 65 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70  ee = 0;..  if( p
5ff0: 4b 65 79 20 29 7b 0a 20 20 20 20 61 73 73 65 72  Key ){.    asser
6000: 74 28 20 6e 4b 65 79 3d 3d 28 69 36 34 29 28 69  t( nKey==(i64)(i
6010: 6e 74 29 6e 4b 65 79 20 29 3b 0a 20 20 20 20 70  nt)nKey );.    p
6020: 49 64 78 4b 65 79 20 3d 20 73 71 6c 69 74 65 33  IdxKey = sqlite3
6030: 56 64 62 65 41 6c 6c 6f 63 55 6e 70 61 63 6b 65  VdbeAllocUnpacke
6040: 64 52 65 63 6f 72 64 28 0a 20 20 20 20 20 20 20  dRecord(.       
6050: 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 2c   pCur->pKeyInfo,
6060: 20 61 53 70 61 63 65 2c 20 73 69 7a 65 6f 66 28   aSpace, sizeof(
6070: 61 53 70 61 63 65 29 2c 20 26 70 46 72 65 65 0a  aSpace), &pFree.
6080: 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 70      );.    if( p
6090: 49 64 78 4b 65 79 3d 3d 30 20 29 20 72 65 74 75  IdxKey==0 ) retu
60a0: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
60b0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
60c0: 52 65 63 6f 72 64 55 6e 70 61 63 6b 28 70 43 75  RecordUnpack(pCu
60d0: 72 2d 3e 70 4b 65 79 49 6e 66 6f 2c 20 28 69 6e  r->pKeyInfo, (in
60e0: 74 29 6e 4b 65 79 2c 20 70 4b 65 79 2c 20 70 49  t)nKey, pKey, pI
60f0: 64 78 4b 65 79 29 3b 0a 20 20 20 20 69 66 28 20  dxKey);.    if( 
6100: 70 49 64 78 4b 65 79 2d 3e 6e 46 69 65 6c 64 3d  pIdxKey->nField=
6110: 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
6120: 74 65 33 44 62 46 72 65 65 28 70 43 75 72 2d 3e  te3DbFree(pCur->
6130: 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2c 20 70 46  pKeyInfo->db, pF
6140: 72 65 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ree);.      retu
6150: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
6160: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20  T_BKPT;.    }.  
6170: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 64 78 4b  }else{.    pIdxK
6180: 65 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 63  ey = 0;.  }.  rc
6190: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d   = sqlite3BtreeM
61a0: 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 70 43  ovetoUnpacked(pC
61b0: 75 72 2c 20 70 49 64 78 4b 65 79 2c 20 6e 4b 65  ur, pIdxKey, nKe
61c0: 79 2c 20 62 69 61 73 2c 20 70 52 65 73 29 3b 0a  y, bias, pRes);.
61d0: 20 20 69 66 28 20 70 46 72 65 65 20 29 7b 0a 20    if( pFree ){. 
61e0: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
61f0: 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 2d  (pCur->pKeyInfo-
6200: 3e 64 62 2c 20 70 46 72 65 65 29 3b 0a 20 20 7d  >db, pFree);.  }
6210: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
6220: 0a 2f 2a 0a 2a 2a 20 52 65 73 74 6f 72 65 20 74  ./*.** Restore t
6230: 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65  he cursor to the
6240: 20 70 6f 73 69 74 69 6f 6e 20 69 74 20 77 61 73   position it was
6250: 20 69 6e 20 28 6f 72 20 61 73 20 63 6c 6f 73 65   in (or as close
6260: 20 74 6f 20 61 73 20 70 6f 73 73 69 62 6c 65 29   to as possible)
6270: 0a 2a 2a 20 77 68 65 6e 20 73 61 76 65 43 75 72  .** when saveCur
6280: 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 20 77 61  sorPosition() wa
6290: 73 20 63 61 6c 6c 65 64 2e 20 4e 6f 74 65 20 74  s called. Note t
62a0: 68 61 74 20 74 68 69 73 20 63 61 6c 6c 20 64 65  hat this call de
62b0: 6c 65 74 65 73 20 74 68 65 20 0a 2a 2a 20 73 61  letes the .** sa
62c0: 76 65 64 20 70 6f 73 69 74 69 6f 6e 20 69 6e 66  ved position inf
62d0: 6f 20 73 74 6f 72 65 64 20 62 79 20 73 61 76 65  o stored by save
62e0: 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29  CursorPosition()
62f0: 2c 20 73 6f 20 74 68 65 72 65 20 63 61 6e 20 62  , so there can b
6300: 65 0a 2a 2a 20 61 74 20 6d 6f 73 74 20 6f 6e 65  e.** at most one
6310: 20 65 66 66 65 63 74 69 76 65 20 72 65 73 74 6f   effective resto
6320: 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  reCursorPosition
6330: 28 29 20 63 61 6c 6c 20 61 66 74 65 72 20 65 61  () call after ea
6340: 63 68 20 0a 2a 2a 20 73 61 76 65 43 75 72 73 6f  ch .** saveCurso
6350: 72 50 6f 73 69 74 69 6f 6e 28 29 2e 0a 2a 2f 0a  rPosition()..*/.
6360: 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65  static int btree
6370: 52 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73  RestoreCursorPos
6380: 69 74 69 6f 6e 28 42 74 43 75 72 73 6f 72 20 2a  ition(BtCursor *
6390: 70 43 75 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  pCur){.  int rc;
63a0: 0a 20 20 69 6e 74 20 73 6b 69 70 4e 65 78 74 3b  .  int skipNext;
63b0: 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
63c0: 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
63d0: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
63e0: 43 75 72 2d 3e 65 53 74 61 74 65 3e 3d 43 55 52  Cur->eState>=CUR
63f0: 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20  SOR_REQUIRESEEK 
6400: 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65  );.  if( pCur->e
6410: 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 46 41  State==CURSOR_FA
6420: 55 4c 54 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ULT ){.    retur
6430: 6e 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74  n pCur->skipNext
6440: 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 65 53  ;.  }.  pCur->eS
6450: 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e  tate = CURSOR_IN
6460: 56 41 4c 49 44 3b 0a 20 20 72 63 20 3d 20 62 74  VALID;.  rc = bt
6470: 72 65 65 4d 6f 76 65 74 6f 28 70 43 75 72 2c 20  reeMoveto(pCur, 
6480: 70 43 75 72 2d 3e 70 4b 65 79 2c 20 70 43 75 72  pCur->pKey, pCur
6490: 2d 3e 6e 4b 65 79 2c 20 30 2c 20 26 73 6b 69 70  ->nKey, 0, &skip
64a0: 4e 65 78 74 29 3b 0a 20 20 69 66 28 20 72 63 3d  Next);.  if( rc=
64b0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
64c0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
64d0: 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 20 20 20 20  Cur->pKey);.    
64e0: 70 43 75 72 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a  pCur->pKey = 0;.
64f0: 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
6500: 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
6510: 5f 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e  _VALID || pCur->
6520: 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49  eState==CURSOR_I
6530: 4e 56 41 4c 49 44 20 29 3b 0a 20 20 20 20 70 43  NVALID );.    pC
6540: 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 7c 3d 20  ur->skipNext |= 
6550: 73 6b 69 70 4e 65 78 74 3b 0a 20 20 20 20 69 66  skipNext;.    if
6560: 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74  ( pCur->skipNext
6570: 20 26 26 20 70 43 75 72 2d 3e 65 53 74 61 74 65   && pCur->eState
6580: 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
6590: 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53  {.      pCur->eS
65a0: 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 53 4b  tate = CURSOR_SK
65b0: 49 50 4e 45 58 54 3b 0a 20 20 20 20 7d 0a 20 20  IPNEXT;.    }.  
65c0: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
65d0: 0a 0a 23 64 65 66 69 6e 65 20 72 65 73 74 6f 72  ..#define restor
65e0: 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
65f0: 70 29 20 5c 0a 20 20 28 70 2d 3e 65 53 74 61 74  p) \.  (p->eStat
6600: 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55 49 52  e>=CURSOR_REQUIR
6610: 45 53 45 45 4b 20 3f 20 5c 0a 20 20 20 20 20 20  ESEEK ? \.      
6620: 20 20 20 62 74 72 65 65 52 65 73 74 6f 72 65 43     btreeRestoreC
6630: 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29  ursorPosition(p)
6640: 20 3a 20 5c 0a 20 20 20 20 20 20 20 20 20 53 51   : \.         SQ
6650: 4c 49 54 45 5f 4f 4b 29 0a 0a 2f 2a 0a 2a 2a 20  LITE_OK)../*.** 
6660: 44 65 74 65 72 6d 69 6e 65 20 77 68 65 74 68 65  Determine whethe
6670: 72 20 6f 72 20 6e 6f 74 20 61 20 63 75 72 73 6f  r or not a curso
6680: 72 20 68 61 73 20 6d 6f 76 65 64 20 66 72 6f 6d  r has moved from
6690: 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 77 68   the position wh
66a0: 65 72 65 0a 2a 2a 20 69 74 20 77 61 73 20 6c 61  ere.** it was la
66b0: 73 74 20 70 6c 61 63 65 64 2c 20 6f 72 20 68 61  st placed, or ha
66c0: 73 20 62 65 65 6e 20 69 6e 76 61 6c 69 64 61 74  s been invalidat
66d0: 65 64 20 66 6f 72 20 61 6e 79 20 6f 74 68 65 72  ed for any other
66e0: 20 72 65 61 73 6f 6e 2e 0a 2a 2a 20 43 75 72 73   reason..** Curs
66f0: 6f 72 73 20 63 61 6e 20 6d 6f 76 65 20 77 68 65  ors can move whe
6700: 6e 20 74 68 65 20 72 6f 77 20 74 68 65 79 20 61  n the row they a
6710: 72 65 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 69  re pointing at i
6720: 73 20 64 65 6c 65 74 65 64 20 6f 75 74 0a 2a 2a  s deleted out.**
6730: 20 66 72 6f 6d 20 75 6e 64 65 72 20 74 68 65 6d   from under them
6740: 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2e 20 20  , for example.  
6750: 43 75 72 73 6f 72 20 6d 69 67 68 74 20 61 6c 73  Cursor might als
6760: 6f 20 6d 6f 76 65 20 69 66 20 61 20 62 74 72 65  o move if a btre
6770: 65 0a 2a 2a 20 69 73 20 72 65 62 61 6c 61 6e 63  e.** is rebalanc
6780: 65 64 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 69 6e  ed..**.** Callin
6790: 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  g this routine w
67a0: 69 74 68 20 61 20 4e 55 4c 4c 20 63 75 72 73 6f  ith a NULL curso
67b0: 72 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72 6e  r pointer return
67c0: 73 20 66 61 6c 73 65 2e 0a 2a 2a 0a 2a 2a 20 55  s false..**.** U
67d0: 73 65 20 74 68 65 20 73 65 70 61 72 61 74 65 20  se the separate 
67e0: 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
67f0: 6f 72 52 65 73 74 6f 72 65 28 29 20 72 6f 75 74  orRestore() rout
6800: 69 6e 65 20 74 6f 20 72 65 73 74 6f 72 65 20 61  ine to restore a
6810: 20 63 75 72 73 6f 72 0a 2a 2a 20 62 61 63 6b 20   cursor.** back 
6820: 74 6f 20 77 68 65 72 65 20 69 74 20 6f 75 67 68  to where it ough
6830: 74 20 74 6f 20 62 65 20 69 66 20 74 68 69 73 20  t to be if this 
6840: 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
6850: 74 72 75 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  true..*/.int sql
6860: 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 48  ite3BtreeCursorH
6870: 61 73 4d 6f 76 65 64 28 42 74 43 75 72 73 6f 72  asMoved(BtCursor
6880: 20 2a 70 43 75 72 29 7b 0a 20 20 72 65 74 75 72   *pCur){.  retur
6890: 6e 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d  n pCur->eState!=
68a0: 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 7d 0a  CURSOR_VALID;.}.
68b0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
68c0: 69 6e 65 20 72 65 73 74 6f 72 65 73 20 61 20 63  ine restores a c
68d0: 75 72 73 6f 72 20 62 61 63 6b 20 74 6f 20 69 74  ursor back to it
68e0: 73 20 6f 72 69 67 69 6e 61 6c 20 70 6f 73 69 74  s original posit
68f0: 69 6f 6e 20 61 66 74 65 72 20 69 74 0a 2a 2a 20  ion after it.** 
6900: 68 61 73 20 62 65 65 6e 20 6d 6f 76 65 64 20 62  has been moved b
6910: 79 20 73 6f 6d 65 20 6f 75 74 73 69 64 65 20 61  y some outside a
6920: 63 74 69 76 69 74 79 20 28 73 75 63 68 20 61 73  ctivity (such as
6930: 20 61 20 62 74 72 65 65 20 72 65 62 61 6c 61 6e   a btree rebalan
6940: 63 65 20 6f 72 0a 2a 2a 20 61 20 72 6f 77 20 68  ce or.** a row h
6950: 61 76 69 6e 67 20 62 65 65 6e 20 64 65 6c 65 74  aving been delet
6960: 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65  ed out from unde
6970: 72 20 74 68 65 20 63 75 72 73 6f 72 29 2e 20 20  r the cursor).  
6980: 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 75 63 63 65 73  .**.** On succes
6990: 73 2c 20 74 68 65 20 2a 70 44 69 66 66 65 72 65  s, the *pDiffere
69a0: 6e 74 52 6f 77 20 70 61 72 61 6d 65 74 65 72 20  ntRow parameter 
69b0: 69 73 20 66 61 6c 73 65 20 69 66 20 74 68 65 20  is false if the 
69c0: 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74 0a 2a  cursor is left.*
69d0: 2a 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 65 78  * pointing at ex
69e0: 61 63 74 6c 79 20 74 68 65 20 73 61 6d 65 20 72  actly the same r
69f0: 6f 77 2e 20 20 2a 70 44 69 66 66 65 72 6e 74 52  ow.  *pDifferntR
6a00: 6f 77 20 69 73 20 74 68 65 20 72 6f 77 20 74 68  ow is the row th
6a10: 65 20 63 75 72 73 6f 72 0a 2a 2a 20 77 61 73 20  e cursor.** was 
6a20: 70 6f 69 6e 74 69 6e 67 20 74 6f 20 68 61 73 20  pointing to has 
6a30: 62 65 65 6e 20 64 65 6c 65 74 65 64 2c 20 66 6f  been deleted, fo
6a40: 72 63 69 6e 67 20 74 68 65 20 63 75 72 73 6f 72  rcing the cursor
6a50: 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 73 6f 6d   to point to som
6a60: 65 0a 2a 2a 20 6e 65 61 72 62 79 20 72 6f 77 2e  e.** nearby row.
6a70: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
6a80: 69 6e 65 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20  ine should only 
6a90: 62 65 20 63 61 6c 6c 65 64 20 66 6f 72 20 61 20  be called for a 
6aa0: 63 75 72 73 6f 72 20 74 68 61 74 20 6a 75 73 74  cursor that just
6ab0: 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 54 52 55   returned.** TRU
6ac0: 45 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 42 74  E from sqlite3Bt
6ad0: 72 65 65 43 75 72 73 6f 72 48 61 73 4d 6f 76 65  reeCursorHasMove
6ae0: 64 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  d()..*/.int sqli
6af0: 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 52 65  te3BtreeCursorRe
6b00: 73 74 6f 72 65 28 42 74 43 75 72 73 6f 72 20 2a  store(BtCursor *
6b10: 70 43 75 72 2c 20 69 6e 74 20 2a 70 44 69 66 66  pCur, int *pDiff
6b20: 65 72 65 6e 74 52 6f 77 29 7b 0a 20 20 69 6e 74  erentRow){.  int
6b30: 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   rc;..  assert( 
6b40: 70 43 75 72 21 3d 30 20 29 3b 0a 20 20 61 73 73  pCur!=0 );.  ass
6b50: 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
6b60: 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e!=CURSOR_VALID 
6b70: 29 3b 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72  );.  rc = restor
6b80: 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
6b90: 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 20  pCur);.  if( rc 
6ba0: 29 7b 0a 20 20 20 20 2a 70 44 69 66 66 65 72 65  ){.    *pDiffere
6bb0: 6e 74 52 6f 77 20 3d 20 31 3b 0a 20 20 20 20 72  ntRow = 1;.    r
6bc0: 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
6bd0: 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  if( pCur->eState
6be0: 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  !=CURSOR_VALID )
6bf0: 7b 0a 20 20 20 20 2a 70 44 69 66 66 65 72 65 6e  {.    *pDifferen
6c00: 74 52 6f 77 20 3d 20 31 3b 0a 20 20 7d 65 6c 73  tRow = 1;.  }els
6c10: 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  e{.    assert( p
6c20: 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d 30  Cur->skipNext==0
6c30: 20 29 3b 0a 20 20 20 20 2a 70 44 69 66 66 65 72   );.    *pDiffer
6c40: 65 6e 74 52 6f 77 20 3d 20 30 3b 0a 20 20 7d 0a  entRow = 0;.  }.
6c50: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
6c60: 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  OK;.}..#ifndef S
6c70: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
6c80: 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 47 69 76 65  ACUUM./*.** Give
6c90: 6e 20 61 20 70 61 67 65 20 6e 75 6d 62 65 72 20  n a page number 
6ca0: 6f 66 20 61 20 72 65 67 75 6c 61 72 20 64 61 74  of a regular dat
6cb0: 61 62 61 73 65 20 70 61 67 65 2c 20 72 65 74 75  abase page, retu
6cc0: 72 6e 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 6e  rn the page.** n
6cd0: 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 70 6f  umber for the po
6ce0: 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 20 74  inter-map page t
6cf0: 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  hat contains the
6d00: 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 0a 2a   entry for the.*
6d10: 2a 20 69 6e 70 75 74 20 70 61 67 65 20 6e 75 6d  * input page num
6d20: 62 65 72 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  ber..**.** Retur
6d30: 6e 20 30 20 28 6e 6f 74 20 61 20 76 61 6c 69 64  n 0 (not a valid
6d40: 20 70 61 67 65 29 20 66 6f 72 20 70 67 6e 6f 3d   page) for pgno=
6d50: 3d 31 20 73 69 6e 63 65 20 74 68 65 72 65 20 69  =1 since there i
6d60: 73 0a 2a 2a 20 6e 6f 20 70 6f 69 6e 74 65 72 20  s.** no pointer 
6d70: 6d 61 70 20 61 73 73 6f 63 69 61 74 65 64 20 77  map associated w
6d80: 69 74 68 20 70 61 67 65 20 31 2e 20 20 54 68 65  ith page 1.  The
6d90: 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b   integrity_check
6da0: 20 6c 6f 67 69 63 0a 2a 2a 20 72 65 71 75 69 72   logic.** requir
6db0: 65 73 20 74 68 61 74 20 70 74 72 6d 61 70 50 61  es that ptrmapPa
6dc0: 67 65 6e 6f 28 2a 2c 31 29 21 3d 31 2e 0a 2a 2f  geno(*,1)!=1..*/
6dd0: 0a 73 74 61 74 69 63 20 50 67 6e 6f 20 70 74 72  .static Pgno ptr
6de0: 6d 61 70 50 61 67 65 6e 6f 28 42 74 53 68 61 72  mapPageno(BtShar
6df0: 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67  ed *pBt, Pgno pg
6e00: 6e 6f 29 7b 0a 20 20 69 6e 74 20 6e 50 61 67 65  no){.  int nPage
6e10: 73 50 65 72 4d 61 70 50 61 67 65 3b 0a 20 20 50  sPerMapPage;.  P
6e20: 67 6e 6f 20 69 50 74 72 4d 61 70 2c 20 72 65 74  gno iPtrMap, ret
6e30: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
6e40: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
6e50: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
6e60: 69 66 28 20 70 67 6e 6f 3c 32 20 29 20 72 65 74  if( pgno<2 ) ret
6e70: 75 72 6e 20 30 3b 0a 20 20 6e 50 61 67 65 73 50  urn 0;.  nPagesP
6e80: 65 72 4d 61 70 50 61 67 65 20 3d 20 28 70 42 74  erMapPage = (pBt
6e90: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 35 29 2b  ->usableSize/5)+
6ea0: 31 3b 0a 20 20 69 50 74 72 4d 61 70 20 3d 20 28  1;.  iPtrMap = (
6eb0: 70 67 6e 6f 2d 32 29 2f 6e 50 61 67 65 73 50 65  pgno-2)/nPagesPe
6ec0: 72 4d 61 70 50 61 67 65 3b 0a 20 20 72 65 74 20  rMapPage;.  ret 
6ed0: 3d 20 28 69 50 74 72 4d 61 70 2a 6e 50 61 67 65  = (iPtrMap*nPage
6ee0: 73 50 65 72 4d 61 70 50 61 67 65 29 20 2b 20 32  sPerMapPage) + 2
6ef0: 3b 20 0a 20 20 69 66 28 20 72 65 74 3d 3d 50 45  ; .  if( ret==PE
6f00: 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
6f10: 70 42 74 29 20 29 7b 0a 20 20 20 20 72 65 74 2b  pBt) ){.    ret+
6f20: 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  +;.  }.  return 
6f30: 72 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72  ret;.}../*.** Wr
6f40: 69 74 65 20 61 6e 20 65 6e 74 72 79 20 69 6e 74  ite an entry int
6f50: 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  o the pointer ma
6f60: 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  p..**.** This ro
6f70: 75 74 69 6e 65 20 75 70 64 61 74 65 73 20 74 68  utine updates th
6f80: 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e  e pointer map en
6f90: 74 72 79 20 66 6f 72 20 70 61 67 65 20 6e 75 6d  try for page num
6fa0: 62 65 72 20 27 6b 65 79 27 0a 2a 2a 20 73 6f 20  ber 'key'.** so 
6fb0: 74 68 61 74 20 69 74 20 6d 61 70 73 20 74 6f 20  that it maps to 
6fc0: 74 79 70 65 20 27 65 54 79 70 65 27 20 61 6e 64  type 'eType' and
6fd0: 20 70 61 72 65 6e 74 20 70 61 67 65 20 6e 75 6d   parent page num
6fe0: 62 65 72 20 27 70 67 6e 6f 27 2e 0a 2a 2a 0a 2a  ber 'pgno'..**.*
6ff0: 2a 20 49 66 20 2a 70 52 43 20 69 73 20 69 6e 69  * If *pRC is ini
7000: 74 69 61 6c 6c 79 20 6e 6f 6e 2d 7a 65 72 6f 20  tially non-zero 
7010: 28 6e 6f 6e 2d 53 51 4c 49 54 45 5f 4f 4b 29 20  (non-SQLITE_OK) 
7020: 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  then this routin
7030: 65 20 69 73 0a 2a 2a 20 61 20 6e 6f 2d 6f 70 2e  e is.** a no-op.
7040: 20 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63    If an error oc
7050: 63 75 72 73 2c 20 74 68 65 20 61 70 70 72 6f 70  curs, the approp
7060: 72 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65  riate error code
7070: 20 69 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20 69   is written.** i
7080: 6e 74 6f 20 2a 70 52 43 2e 0a 2a 2f 0a 73 74 61  nto *pRC..*/.sta
7090: 74 69 63 20 76 6f 69 64 20 70 74 72 6d 61 70 50  tic void ptrmapP
70a0: 75 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  ut(BtShared *pBt
70b0: 2c 20 50 67 6e 6f 20 6b 65 79 2c 20 75 38 20 65  , Pgno key, u8 e
70c0: 54 79 70 65 2c 20 50 67 6e 6f 20 70 61 72 65 6e  Type, Pgno paren
70d0: 74 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20  t, int *pRC){.  
70e0: 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b  DbPage *pDbPage;
70f0: 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72    /* The pointer
7100: 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 75   map page */.  u
7110: 38 20 2a 70 50 74 72 6d 61 70 3b 20 20 20 20 20  8 *pPtrmap;     
7120: 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20   /* The pointer 
7130: 6d 61 70 20 64 61 74 61 20 2a 2f 0a 20 20 50 67  map data */.  Pg
7140: 6e 6f 20 69 50 74 72 6d 61 70 3b 20 20 20 20 20  no iPtrmap;     
7150: 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d  /* The pointer m
7160: 61 70 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a  ap page number *
7170: 2f 0a 20 20 69 6e 74 20 6f 66 66 73 65 74 3b 20  /.  int offset; 
7180: 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
7190: 69 6e 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70  in pointer map p
71a0: 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  age */.  int rc;
71b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
71c0: 74 75 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20 73  turn code from s
71d0: 75 62 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 0a  ubfunctions */..
71e0: 20 20 69 66 28 20 2a 70 52 43 20 29 20 72 65 74    if( *pRC ) ret
71f0: 75 72 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  urn;..  assert( 
7200: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
7210: 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
7220: 3b 0a 20 20 2f 2a 20 54 68 65 20 6d 61 73 74 65  ;.  /* The maste
7230: 72 2d 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 6e  r-journal page n
7240: 75 6d 62 65 72 20 6d 75 73 74 20 6e 65 76 65 72  umber must never
7250: 20 62 65 20 75 73 65 64 20 61 73 20 61 20 70 6f   be used as a po
7260: 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 2a  inter map page *
7270: 2f 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d 50  /.  assert( 0==P
7280: 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74  TRMAP_ISPAGE(pBt
7290: 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  , PENDING_BYTE_P
72a0: 41 47 45 28 70 42 74 29 29 20 29 3b 0a 0a 20 20  AGE(pBt)) );..  
72b0: 61 73 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74  assert( pBt->aut
72c0: 6f 56 61 63 75 75 6d 20 29 3b 0a 20 20 69 66 28  oVacuum );.  if(
72d0: 20 6b 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20 2a   key==0 ){.    *
72e0: 70 52 43 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52  pRC = SQLITE_COR
72f0: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 72  RUPT_BKPT;.    r
7300: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 50 74  eturn;.  }.  iPt
7310: 72 6d 61 70 20 3d 20 50 54 52 4d 41 50 5f 50 41  rmap = PTRMAP_PA
7320: 47 45 4e 4f 28 70 42 74 2c 20 6b 65 79 29 3b 0a  GENO(pBt, key);.
7330: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
7340: 67 65 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67  gerGet(pBt->pPag
7350: 65 72 2c 20 69 50 74 72 6d 61 70 2c 20 26 70 44  er, iPtrmap, &pD
7360: 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63  bPage);.  if( rc
7370: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
7380: 20 20 20 2a 70 52 43 20 3d 20 72 63 3b 0a 20 20     *pRC = rc;.  
7390: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
73a0: 6f 66 66 73 65 74 20 3d 20 50 54 52 4d 41 50 5f  offset = PTRMAP_
73b0: 50 54 52 4f 46 46 53 45 54 28 69 50 74 72 6d 61  PTROFFSET(iPtrma
73c0: 70 2c 20 6b 65 79 29 3b 0a 20 20 69 66 28 20 6f  p, key);.  if( o
73d0: 66 66 73 65 74 3c 30 20 29 7b 0a 20 20 20 20 2a  ffset<0 ){.    *
73e0: 70 52 43 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52  pRC = SQLITE_COR
73f0: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 67  RUPT_BKPT;.    g
7400: 6f 74 6f 20 70 74 72 6d 61 70 5f 65 78 69 74 3b  oto ptrmap_exit;
7410: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6f  .  }.  assert( o
7420: 66 66 73 65 74 20 3c 3d 20 28 69 6e 74 29 70 42  ffset <= (int)pB
7430: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 35 20  t->usableSize-5 
7440: 29 3b 0a 20 20 70 50 74 72 6d 61 70 20 3d 20 28  );.  pPtrmap = (
7450: 75 38 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65  u8 *)sqlite3Page
7460: 72 47 65 74 44 61 74 61 28 70 44 62 50 61 67 65  rGetData(pDbPage
7470: 29 3b 0a 0a 20 20 69 66 28 20 65 54 79 70 65 21  );..  if( eType!
7480: 3d 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d  =pPtrmap[offset]
7490: 20 7c 7c 20 67 65 74 34 62 79 74 65 28 26 70 50   || get4byte(&pP
74a0: 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d 29  trmap[offset+1])
74b0: 21 3d 70 61 72 65 6e 74 20 29 7b 0a 20 20 20 20  !=parent ){.    
74c0: 54 52 41 43 45 28 28 22 50 54 52 4d 41 50 5f 55  TRACE(("PTRMAP_U
74d0: 50 44 41 54 45 3a 20 25 64 2d 3e 28 25 64 2c 25  PDATE: %d->(%d,%
74e0: 64 29 5c 6e 22 2c 20 6b 65 79 2c 20 65 54 79 70  d)\n", key, eTyp
74f0: 65 2c 20 70 61 72 65 6e 74 29 29 3b 0a 20 20 20  e, parent));.   
7500: 20 2a 70 52 43 3d 20 72 63 20 3d 20 73 71 6c 69   *pRC= rc = sqli
7510: 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 44  te3PagerWrite(pD
7520: 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
7530: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
7540: 0a 20 20 20 20 20 20 70 50 74 72 6d 61 70 5b 6f  .      pPtrmap[o
7550: 66 66 73 65 74 5d 20 3d 20 65 54 79 70 65 3b 0a  ffset] = eType;.
7560: 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
7570: 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31  pPtrmap[offset+1
7580: 5d 2c 20 70 61 72 65 6e 74 29 3b 0a 20 20 20 20  ], parent);.    
7590: 7d 0a 20 20 7d 0a 0a 70 74 72 6d 61 70 5f 65 78  }.  }..ptrmap_ex
75a0: 69 74 3a 0a 20 20 73 71 6c 69 74 65 33 50 61 67  it:.  sqlite3Pag
75b0: 65 72 55 6e 72 65 66 28 70 44 62 50 61 67 65 29  erUnref(pDbPage)
75c0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  ;.}../*.** Read 
75d0: 61 6e 20 65 6e 74 72 79 20 66 72 6f 6d 20 74 68  an entry from th
75e0: 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 2a  e pointer map..*
75f0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
7600: 65 20 72 65 74 72 69 65 76 65 73 20 74 68 65 20  e retrieves the 
7610: 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72  pointer map entr
7620: 79 20 66 6f 72 20 70 61 67 65 20 27 6b 65 79 27  y for page 'key'
7630: 2c 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65  , writing.** the
7640: 20 74 79 70 65 20 61 6e 64 20 70 61 72 65 6e 74   type and parent
7650: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20   page number to 
7660: 2a 70 45 54 79 70 65 20 61 6e 64 20 2a 70 50 67  *pEType and *pPg
7670: 6e 6f 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e  no respectively.
7680: 0a 2a 2a 20 41 6e 20 65 72 72 6f 72 20 63 6f 64  .** An error cod
7690: 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  e is returned if
76a0: 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20   something goes 
76b0: 77 72 6f 6e 67 2c 20 6f 74 68 65 72 77 69 73 65  wrong, otherwise
76c0: 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73   SQLITE_OK..*/.s
76d0: 74 61 74 69 63 20 69 6e 74 20 70 74 72 6d 61 70  tatic int ptrmap
76e0: 47 65 74 28 42 74 53 68 61 72 65 64 20 2a 70 42  Get(BtShared *pB
76f0: 74 2c 20 50 67 6e 6f 20 6b 65 79 2c 20 75 38 20  t, Pgno key, u8 
7700: 2a 70 45 54 79 70 65 2c 20 50 67 6e 6f 20 2a 70  *pEType, Pgno *p
7710: 50 67 6e 6f 29 7b 0a 20 20 44 62 50 61 67 65 20  Pgno){.  DbPage 
7720: 2a 70 44 62 50 61 67 65 3b 20 20 20 2f 2a 20 54  *pDbPage;   /* T
7730: 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70  he pointer map p
7740: 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 69 50 74  age */.  int iPt
7750: 72 6d 61 70 3b 20 20 20 20 20 20 20 2f 2a 20 50  rmap;       /* P
7760: 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20  ointer map page 
7770: 69 6e 64 65 78 20 2a 2f 0a 20 20 75 38 20 2a 70  index */.  u8 *p
7780: 50 74 72 6d 61 70 3b 20 20 20 20 20 20 20 2f 2a  Ptrmap;       /*
7790: 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67   Pointer map pag
77a0: 65 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20  e data */.  int 
77b0: 6f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 2f  offset;        /
77c0: 2a 20 4f 66 66 73 65 74 20 6f 66 20 65 6e 74 72  * Offset of entr
77d0: 79 20 69 6e 20 70 6f 69 6e 74 65 72 20 6d 61 70  y in pointer map
77e0: 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20   */.  int rc;.. 
77f0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
7800: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
7810: 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 69 50  >mutex) );..  iP
7820: 74 72 6d 61 70 20 3d 20 50 54 52 4d 41 50 5f 50  trmap = PTRMAP_P
7830: 41 47 45 4e 4f 28 70 42 74 2c 20 6b 65 79 29 3b  AGENO(pBt, key);
7840: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
7850: 61 67 65 72 47 65 74 28 70 42 74 2d 3e 70 50 61  agerGet(pBt->pPa
7860: 67 65 72 2c 20 69 50 74 72 6d 61 70 2c 20 26 70  ger, iPtrmap, &p
7870: 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72  DbPage);.  if( r
7880: 63 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  c!=0 ){.    retu
7890: 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 50 74  rn rc;.  }.  pPt
78a0: 72 6d 61 70 20 3d 20 28 75 38 20 2a 29 73 71 6c  rmap = (u8 *)sql
78b0: 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
78c0: 28 70 44 62 50 61 67 65 29 3b 0a 0a 20 20 6f 66  (pDbPage);..  of
78d0: 66 73 65 74 20 3d 20 50 54 52 4d 41 50 5f 50 54  fset = PTRMAP_PT
78e0: 52 4f 46 46 53 45 54 28 69 50 74 72 6d 61 70 2c  ROFFSET(iPtrmap,
78f0: 20 6b 65 79 29 3b 0a 20 20 69 66 28 20 6f 66 66   key);.  if( off
7900: 73 65 74 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c  set<0 ){.    sql
7910: 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
7920: 44 62 50 61 67 65 29 3b 0a 20 20 20 20 72 65 74  DbPage);.    ret
7930: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
7940: 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 61  PT_BKPT;.  }.  a
7950: 73 73 65 72 74 28 20 6f 66 66 73 65 74 20 3c 3d  ssert( offset <=
7960: 20 28 69 6e 74 29 70 42 74 2d 3e 75 73 61 62 6c   (int)pBt->usabl
7970: 65 53 69 7a 65 2d 35 20 29 3b 0a 20 20 61 73 73  eSize-5 );.  ass
7980: 65 72 74 28 20 70 45 54 79 70 65 21 3d 30 20 29  ert( pEType!=0 )
7990: 3b 0a 20 20 2a 70 45 54 79 70 65 20 3d 20 70 50  ;.  *pEType = pP
79a0: 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d 3b 0a 20  trmap[offset];. 
79b0: 20 69 66 28 20 70 50 67 6e 6f 20 29 20 2a 70 50   if( pPgno ) *pP
79c0: 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26  gno = get4byte(&
79d0: 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31  pPtrmap[offset+1
79e0: 5d 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 50 61  ]);..  sqlite3Pa
79f0: 67 65 72 55 6e 72 65 66 28 70 44 62 50 61 67 65  gerUnref(pDbPage
7a00: 29 3b 0a 20 20 69 66 28 20 2a 70 45 54 79 70 65  );.  if( *pEType
7a10: 3c 31 20 7c 7c 20 2a 70 45 54 79 70 65 3e 35 20  <1 || *pEType>5 
7a20: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
7a30: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
7a40: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
7a50: 3b 0a 7d 0a 0a 23 65 6c 73 65 20 2f 2a 20 69 66  ;.}..#else /* if
7a60: 20 64 65 66 69 6e 65 64 20 53 51 4c 49 54 45 5f   defined SQLITE_
7a70: 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 20  OMIT_AUTOVACUUM 
7a80: 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20 70 74 72  */.  #define ptr
7a90: 6d 61 70 50 75 74 28 77 2c 78 2c 79 2c 7a 2c 72  mapPut(w,x,y,z,r
7aa0: 63 29 0a 20 20 23 64 65 66 69 6e 65 20 70 74 72  c).  #define ptr
7ab0: 6d 61 70 47 65 74 28 77 2c 78 2c 79 2c 7a 29 20  mapGet(w,x,y,z) 
7ac0: 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 23 64 65 66  SQLITE_OK.  #def
7ad0: 69 6e 65 20 70 74 72 6d 61 70 50 75 74 4f 76 66  ine ptrmapPutOvf
7ae0: 6c 50 74 72 28 78 2c 20 79 2c 20 72 63 29 0a 23  lPtr(x, y, rc).#
7af0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 69 76  endif../*.** Giv
7b00: 65 6e 20 61 20 62 74 72 65 65 20 70 61 67 65 20  en a btree page 
7b10: 61 6e 64 20 61 20 63 65 6c 6c 20 69 6e 64 65 78  and a cell index
7b20: 20 28 30 20 6d 65 61 6e 73 20 74 68 65 20 66 69   (0 means the fi
7b30: 72 73 74 20 63 65 6c 6c 20 6f 6e 0a 2a 2a 20 74  rst cell on.** t
7b40: 68 65 20 70 61 67 65 2c 20 31 20 6d 65 61 6e 73  he page, 1 means
7b50: 20 74 68 65 20 73 65 63 6f 6e 64 20 63 65 6c 6c   the second cell
7b60: 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74 68 29 20  , and so forth) 
7b70: 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  return a pointer
7b80: 0a 2a 2a 20 74 6f 20 74 68 65 20 63 65 6c 6c 20  .** to the cell 
7b90: 63 6f 6e 74 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54  content..**.** T
7ba0: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 6f 72 6b  his routine work
7bb0: 73 20 6f 6e 6c 79 20 66 6f 72 20 70 61 67 65 73  s only for pages
7bc0: 20 74 68 61 74 20 64 6f 20 6e 6f 74 20 63 6f 6e   that do not con
7bd0: 74 61 69 6e 20 6f 76 65 72 66 6c 6f 77 20 63 65  tain overflow ce
7be0: 6c 6c 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  lls..*/.#define 
7bf0: 66 69 6e 64 43 65 6c 6c 28 50 2c 49 29 20 5c 0a  findCell(P,I) \.
7c00: 20 20 28 28 50 29 2d 3e 61 44 61 74 61 20 2b 20    ((P)->aData + 
7c10: 28 28 50 29 2d 3e 6d 61 73 6b 50 61 67 65 20 26  ((P)->maskPage &
7c20: 20 67 65 74 32 62 79 74 65 28 26 28 50 29 2d 3e   get2byte(&(P)->
7c30: 61 43 65 6c 6c 49 64 78 5b 32 2a 28 49 29 5d 29  aCellIdx[2*(I)])
7c40: 29 29 0a 23 64 65 66 69 6e 65 20 66 69 6e 64 43  )).#define findC
7c50: 65 6c 6c 76 32 28 44 2c 4d 2c 4f 2c 49 29 20 28  ellv2(D,M,O,I) (
7c60: 44 2b 28 4d 26 67 65 74 32 62 79 74 65 28 44 2b  D+(M&get2byte(D+
7c70: 28 4f 2b 32 2a 28 49 29 29 29 29 29 0a 0a 0a 2f  (O+2*(I))))).../
7c80: 2a 0a 2a 2a 20 54 68 69 73 20 61 20 6d 6f 72 65  *.** This a more
7c90: 20 63 6f 6d 70 6c 65 78 20 76 65 72 73 69 6f 6e   complex version
7ca0: 20 6f 66 20 66 69 6e 64 43 65 6c 6c 28 29 20 74   of findCell() t
7cb0: 68 61 74 20 77 6f 72 6b 73 20 66 6f 72 0a 2a 2a  hat works for.**
7cc0: 20 70 61 67 65 73 20 74 68 61 74 20 64 6f 20 63   pages that do c
7cd0: 6f 6e 74 61 69 6e 20 6f 76 65 72 66 6c 6f 77 20  ontain overflow 
7ce0: 63 65 6c 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  cells..*/.static
7cf0: 20 75 38 20 2a 66 69 6e 64 4f 76 65 72 66 6c 6f   u8 *findOverflo
7d00: 77 43 65 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70  wCell(MemPage *p
7d10: 50 61 67 65 2c 20 69 6e 74 20 69 43 65 6c 6c 29  Page, int iCell)
7d20: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73  {.  int i;.  ass
7d30: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
7d40: 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
7d50: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
7d60: 66 6f 72 28 69 3d 70 50 61 67 65 2d 3e 6e 4f 76  for(i=pPage->nOv
7d70: 65 72 66 6c 6f 77 2d 31 3b 20 69 3e 3d 30 3b 20  erflow-1; i>=0; 
7d80: 69 2d 2d 29 7b 0a 20 20 20 20 69 6e 74 20 6b 3b  i--){.    int k;
7d90: 0a 20 20 20 20 6b 20 3d 20 70 50 61 67 65 2d 3e  .    k = pPage->
7da0: 61 69 4f 76 66 6c 5b 69 5d 3b 0a 20 20 20 20 69  aiOvfl[i];.    i
7db0: 66 28 20 6b 3c 3d 69 43 65 6c 6c 20 29 7b 0a 20  f( k<=iCell ){. 
7dc0: 20 20 20 20 20 69 66 28 20 6b 3d 3d 69 43 65 6c       if( k==iCel
7dd0: 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  l ){.        ret
7de0: 75 72 6e 20 70 50 61 67 65 2d 3e 61 70 4f 76 66  urn pPage->apOvf
7df0: 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  l[i];.      }.  
7e00: 20 20 20 20 69 43 65 6c 6c 2d 2d 3b 0a 20 20 20      iCell--;.   
7e10: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
7e20: 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20  findCell(pPage, 
7e30: 69 43 65 6c 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  iCell);.}../*.**
7e40: 20 50 61 72 73 65 20 61 20 63 65 6c 6c 20 63 6f   Parse a cell co
7e50: 6e 74 65 6e 74 20 62 6c 6f 63 6b 20 61 6e 64 20  ntent block and 
7e60: 66 69 6c 6c 20 69 6e 20 74 68 65 20 43 65 6c 6c  fill in the Cell
7e70: 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e 20  Info structure. 
7e80: 20 54 68 65 72 65 0a 2a 2a 20 61 72 65 20 74 77   There.** are tw
7e90: 6f 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 68  o versions of th
7ea0: 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 20 62 74  is function.  bt
7eb0: 72 65 65 50 61 72 73 65 43 65 6c 6c 28 29 20 74  reeParseCell() t
7ec0: 61 6b 65 73 20 61 20 0a 2a 2a 20 63 65 6c 6c 20  akes a .** cell 
7ed0: 69 6e 64 65 78 20 61 73 20 74 68 65 20 73 65 63  index as the sec
7ee0: 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 61 6e 64  ond argument and
7ef0: 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50   btreeParseCellP
7f00: 74 72 28 29 20 0a 2a 2a 20 74 61 6b 65 73 20 61  tr() .** takes a
7f10: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
7f20: 62 6f 64 79 20 6f 66 20 74 68 65 20 63 65 6c 6c  body of the cell
7f30: 20 61 73 20 69 74 73 20 73 65 63 6f 6e 64 20 61   as its second a
7f40: 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74  rgument..*/.stat
7f50: 69 63 20 76 6f 69 64 20 62 74 72 65 65 50 61 72  ic void btreePar
7f60: 73 65 43 65 6c 6c 50 74 72 28 0a 20 20 4d 65 6d  seCellPtr(.  Mem
7f70: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20  Page *pPage,    
7f80: 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e       /* Page con
7f90: 74 61 69 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c  taining the cell
7fa0: 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c   */.  u8 *pCell,
7fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7fc0: 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   Pointer to the 
7fd0: 63 65 6c 6c 20 74 65 78 74 2e 20 2a 2f 0a 20 20  cell text. */.  
7fe0: 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20  CellInfo *pInfo 
7ff0: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20          /* Fill 
8000: 69 6e 20 74 68 69 73 20 73 74 72 75 63 74 75 72  in this structur
8010: 65 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a 70 49  e */.){.  u8 *pI
8020: 74 65 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  ter;            
8030: 20 20 2f 2a 20 46 6f 72 20 73 63 61 6e 6e 69 6e    /* For scannin
8040: 67 20 74 68 72 6f 75 67 68 20 70 43 65 6c 6c 20  g through pCell 
8050: 2a 2f 0a 20 20 75 33 32 20 6e 50 61 79 6c 6f 61  */.  u32 nPayloa
8060: 64 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  d;           /* 
8070: 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
8080: 6f 66 20 63 65 6c 6c 20 70 61 79 6c 6f 61 64 20  of cell payload 
8090: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  */..  assert( sq
80a0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
80b0: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
80c0: 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
80d0: 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 30 20   pPage->leaf==0 
80e0: 7c 7c 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d  || pPage->leaf==
80f0: 31 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  1 );.  if( pPage
8100: 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20 29 7b 0a  ->intKeyLeaf ){.
8110: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
8120: 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3d  e->childPtrSize=
8130: 3d 30 20 29 3b 0a 20 20 20 20 70 49 74 65 72 20  =0 );.    pIter 
8140: 3d 20 70 43 65 6c 6c 20 2b 20 67 65 74 56 61 72  = pCell + getVar
8150: 69 6e 74 33 32 28 70 43 65 6c 6c 2c 20 6e 50 61  int32(pCell, nPa
8160: 79 6c 6f 61 64 29 3b 0a 20 20 20 20 70 49 74 65  yload);.    pIte
8170: 72 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 28 70  r += getVarint(p
8180: 49 74 65 72 2c 20 28 75 36 34 2a 29 26 70 49 6e  Iter, (u64*)&pIn
8190: 66 6f 2d 3e 6e 4b 65 79 29 3b 0a 20 20 7d 65 6c  fo->nKey);.  }el
81a0: 73 65 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 6f  se if( pPage->no
81b0: 50 61 79 6c 6f 61 64 20 29 7b 0a 20 20 20 20 61  Payload ){.    a
81c0: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 63 68  ssert( pPage->ch
81d0: 69 6c 64 50 74 72 53 69 7a 65 3d 3d 34 20 29 3b  ildPtrSize==4 );
81e0: 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a  .    pInfo->nSiz
81f0: 65 20 3d 20 34 20 2b 20 67 65 74 56 61 72 69 6e  e = 4 + getVarin
8200: 74 28 26 70 43 65 6c 6c 5b 34 5d 2c 20 28 75 36  t(&pCell[4], (u6
8210: 34 2a 29 26 70 49 6e 66 6f 2d 3e 6e 4b 65 79 29  4*)&pInfo->nKey)
8220: 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 50 61  ;.    pInfo->nPa
8230: 79 6c 6f 61 64 20 3d 20 30 3b 0a 20 20 20 20 70  yload = 0;.    p
8240: 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 30  Info->nLocal = 0
8250: 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 69 4f 76  ;.    pInfo->iOv
8260: 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 20 20  erflow = 0;.    
8270: 70 49 6e 66 6f 2d 3e 70 50 61 79 6c 6f 61 64 20  pInfo->pPayload 
8280: 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  = 0;.    return;
8290: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49  .  }else{.    pI
82a0: 74 65 72 20 3d 20 70 43 65 6c 6c 20 2b 20 70 50  ter = pCell + pP
82b0: 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a  age->childPtrSiz
82c0: 65 3b 0a 20 20 20 20 70 49 74 65 72 20 2b 3d 20  e;.    pIter += 
82d0: 67 65 74 56 61 72 69 6e 74 33 32 28 70 49 74 65  getVarint32(pIte
82e0: 72 2c 20 6e 50 61 79 6c 6f 61 64 29 3b 0a 20 20  r, nPayload);.  
82f0: 20 20 70 49 6e 66 6f 2d 3e 6e 4b 65 79 20 3d 20    pInfo->nKey = 
8300: 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 7d 0a 20 20  nPayload;.  }.  
8310: 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20  pInfo->nPayload 
8320: 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 70 49  = nPayload;.  pI
8330: 6e 66 6f 2d 3e 70 50 61 79 6c 6f 61 64 20 3d 20  nfo->pPayload = 
8340: 70 49 74 65 72 3b 0a 20 20 74 65 73 74 63 61 73  pIter;.  testcas
8350: 65 28 20 6e 50 61 79 6c 6f 61 64 3d 3d 70 50 61  e( nPayload==pPa
8360: 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a  ge->maxLocal );.
8370: 20 20 74 65 73 74 63 61 73 65 28 20 6e 50 61 79    testcase( nPay
8380: 6c 6f 61 64 3d 3d 70 50 61 67 65 2d 3e 6d 61 78  load==pPage->max
8390: 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 69 66 28  Local+1 );.  if(
83a0: 20 6e 50 61 79 6c 6f 61 64 3c 3d 70 50 61 67 65   nPayload<=pPage
83b0: 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20  ->maxLocal ){.  
83c0: 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74 68 65    /* This is the
83d0: 20 28 65 61 73 79 29 20 63 6f 6d 6d 6f 6e 20 63   (easy) common c
83e0: 61 73 65 20 77 68 65 72 65 20 74 68 65 20 65 6e  ase where the en
83f0: 74 69 72 65 20 70 61 79 6c 6f 61 64 20 66 69 74  tire payload fit
8400: 73 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20  s.    ** on the 
8410: 6c 6f 63 61 6c 20 70 61 67 65 2e 20 20 4e 6f 20  local page.  No 
8420: 6f 76 65 72 66 6c 6f 77 20 69 73 20 72 65 71 75  overflow is requ
8430: 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ired..    */.   
8440: 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20   pInfo->nSize = 
8450: 6e 50 61 79 6c 6f 61 64 20 2b 20 28 75 31 36 29  nPayload + (u16)
8460: 28 70 49 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b  (pIter - pCell);
8470: 0a 20 20 20 20 69 66 28 20 70 49 6e 66 6f 2d 3e  .    if( pInfo->
8480: 6e 53 69 7a 65 3c 34 20 29 20 70 49 6e 66 6f 2d  nSize<4 ) pInfo-
8490: 3e 6e 53 69 7a 65 20 3d 20 34 3b 0a 20 20 20 20  >nSize = 4;.    
84a0: 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20  pInfo->nLocal = 
84b0: 28 75 31 36 29 6e 50 61 79 6c 6f 61 64 3b 0a 20  (u16)nPayload;. 
84c0: 20 20 20 70 49 6e 66 6f 2d 3e 69 4f 76 65 72 66     pInfo->iOverf
84d0: 6c 6f 77 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  low = 0;.  }else
84e0: 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  {.    /* If the 
84f0: 70 61 79 6c 6f 61 64 20 77 69 6c 6c 20 6e 6f 74  payload will not
8500: 20 66 69 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20   fit completely 
8510: 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 67  on the local pag
8520: 65 2c 20 77 65 20 68 61 76 65 0a 20 20 20 20 2a  e, we have.    *
8530: 2a 20 74 6f 20 64 65 63 69 64 65 20 68 6f 77 20  * to decide how 
8540: 6d 75 63 68 20 74 6f 20 73 74 6f 72 65 20 6c 6f  much to store lo
8550: 63 61 6c 6c 79 20 61 6e 64 20 68 6f 77 20 6d 75  cally and how mu
8560: 63 68 20 74 6f 20 73 70 69 6c 6c 20 6f 6e 74 6f  ch to spill onto
8570: 0a 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77  .    ** overflow
8580: 20 70 61 67 65 73 2e 20 20 54 68 65 20 73 74 72   pages.  The str
8590: 61 74 65 67 79 20 69 73 20 74 6f 20 6d 69 6e 69  ategy is to mini
85a0: 6d 69 7a 65 20 74 68 65 20 61 6d 6f 75 6e 74 20  mize the amount 
85b0: 6f 66 20 75 6e 75 73 65 64 0a 20 20 20 20 2a 2a  of unused.    **
85c0: 20 73 70 61 63 65 20 6f 6e 20 6f 76 65 72 66 6c   space on overfl
85d0: 6f 77 20 70 61 67 65 73 20 77 68 69 6c 65 20 6b  ow pages while k
85e0: 65 65 70 69 6e 67 20 74 68 65 20 61 6d 6f 75 6e  eeping the amoun
85f0: 74 20 6f 66 20 6c 6f 63 61 6c 20 73 74 6f 72 61  t of local stora
8600: 67 65 0a 20 20 20 20 2a 2a 20 69 6e 20 62 65 74  ge.    ** in bet
8610: 77 65 65 6e 20 6d 69 6e 4c 6f 63 61 6c 20 61 6e  ween minLocal an
8620: 64 20 6d 61 78 4c 6f 63 61 6c 2e 0a 20 20 20 20  d maxLocal..    
8630: 2a 2a 0a 20 20 20 20 2a 2a 20 57 61 72 6e 69 6e  **.    ** Warnin
8640: 67 3a 20 20 63 68 61 6e 67 69 6e 67 20 74 68 65  g:  changing the
8650: 20 77 61 79 20 6f 76 65 72 66 6c 6f 77 20 70 61   way overflow pa
8660: 79 6c 6f 61 64 20 69 73 20 64 69 73 74 72 69 62  yload is distrib
8670: 75 74 65 64 20 69 6e 20 61 6e 79 0a 20 20 20 20  uted in any.    
8680: 2a 2a 20 77 61 79 20 77 69 6c 6c 20 72 65 73 75  ** way will resu
8690: 6c 74 20 69 6e 20 61 6e 20 69 6e 63 6f 6d 70 61  lt in an incompa
86a0: 74 69 62 6c 65 20 66 69 6c 65 20 66 6f 72 6d 61  tible file forma
86b0: 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e  t..    */.    in
86c0: 74 20 6d 69 6e 4c 6f 63 61 6c 3b 20 20 2f 2a 20  t minLocal;  /* 
86d0: 4d 69 6e 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f  Minimum amount o
86e0: 66 20 70 61 79 6c 6f 61 64 20 68 65 6c 64 20 6c  f payload held l
86f0: 6f 63 61 6c 6c 79 20 2a 2f 0a 20 20 20 20 69 6e  ocally */.    in
8700: 74 20 6d 61 78 4c 6f 63 61 6c 3b 20 20 2f 2a 20  t maxLocal;  /* 
8710: 4d 61 78 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f  Maximum amount o
8720: 66 20 70 61 79 6c 6f 61 64 20 68 65 6c 64 20 6c  f payload held l
8730: 6f 63 61 6c 6c 79 20 2a 2f 0a 20 20 20 20 69 6e  ocally */.    in
8740: 74 20 73 75 72 70 6c 75 73 3b 20 20 20 2f 2a 20  t surplus;   /* 
8750: 4f 76 65 72 66 6c 6f 77 20 70 61 79 6c 6f 61 64  Overflow payload
8760: 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 6c   available for l
8770: 6f 63 61 6c 20 73 74 6f 72 61 67 65 20 2a 2f 0a  ocal storage */.
8780: 0a 20 20 20 20 6d 69 6e 4c 6f 63 61 6c 20 3d 20  .    minLocal = 
8790: 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b  pPage->minLocal;
87a0: 0a 20 20 20 20 6d 61 78 4c 6f 63 61 6c 20 3d 20  .    maxLocal = 
87b0: 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 3b  pPage->maxLocal;
87c0: 0a 20 20 20 20 73 75 72 70 6c 75 73 20 3d 20 6d  .    surplus = m
87d0: 69 6e 4c 6f 63 61 6c 20 2b 20 28 6e 50 61 79 6c  inLocal + (nPayl
87e0: 6f 61 64 20 2d 20 6d 69 6e 4c 6f 63 61 6c 29 25  oad - minLocal)%
87f0: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61  (pPage->pBt->usa
8800: 62 6c 65 53 69 7a 65 20 2d 20 34 29 3b 0a 20 20  bleSize - 4);.  
8810: 20 20 74 65 73 74 63 61 73 65 28 20 73 75 72 70    testcase( surp
8820: 6c 75 73 3d 3d 6d 61 78 4c 6f 63 61 6c 20 29 3b  lus==maxLocal );
8830: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 73  .    testcase( s
8840: 75 72 70 6c 75 73 3d 3d 6d 61 78 4c 6f 63 61 6c  urplus==maxLocal
8850: 2b 31 20 29 3b 0a 20 20 20 20 69 66 28 20 73 75  +1 );.    if( su
8860: 72 70 6c 75 73 20 3c 3d 20 6d 61 78 4c 6f 63 61  rplus <= maxLoca
8870: 6c 20 29 7b 0a 20 20 20 20 20 20 70 49 6e 66 6f  l ){.      pInfo
8880: 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29  ->nLocal = (u16)
8890: 73 75 72 70 6c 75 73 3b 0a 20 20 20 20 7d 65 6c  surplus;.    }el
88a0: 73 65 7b 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d  se{.      pInfo-
88b0: 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 6d  >nLocal = (u16)m
88c0: 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 7d 0a 20  inLocal;.    }. 
88d0: 20 20 20 70 49 6e 66 6f 2d 3e 69 4f 76 65 72 66     pInfo->iOverf
88e0: 6c 6f 77 20 3d 20 28 75 31 36 29 28 26 70 49 6e  low = (u16)(&pIn
88f0: 66 6f 2d 3e 70 50 61 79 6c 6f 61 64 5b 70 49 6e  fo->pPayload[pIn
8900: 66 6f 2d 3e 6e 4c 6f 63 61 6c 5d 20 2d 20 70 43  fo->nLocal] - pC
8910: 65 6c 6c 29 3b 0a 20 20 20 20 70 49 6e 66 6f 2d  ell);.    pInfo-
8920: 3e 6e 53 69 7a 65 20 3d 20 70 49 6e 66 6f 2d 3e  >nSize = pInfo->
8930: 69 4f 76 65 72 66 6c 6f 77 20 2b 20 34 3b 0a 20  iOverflow + 4;. 
8940: 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64   }.}.static void
8950: 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28   btreeParseCell(
8960: 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
8970: 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  e,         /* Pa
8980: 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  ge containing th
8990: 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20  e cell */.  int 
89a0: 69 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20  iCell,          
89b0: 20 20 20 20 2f 2a 20 54 68 65 20 63 65 6c 6c 20      /* The cell 
89c0: 69 6e 64 65 78 2e 20 20 46 69 72 73 74 20 63 65  index.  First ce
89d0: 6c 6c 20 69 73 20 30 20 2a 2f 0a 20 20 43 65 6c  ll is 0 */.  Cel
89e0: 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20  lInfo *pInfo    
89f0: 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20       /* Fill in 
8a00: 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20 2a  this structure *
8a10: 2f 0a 29 7b 0a 20 20 62 74 72 65 65 50 61 72 73  /.){.  btreePars
8a20: 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20  eCellPtr(pPage, 
8a30: 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20  findCell(pPage, 
8a40: 69 43 65 6c 6c 29 2c 20 70 49 6e 66 6f 29 3b 0a  iCell), pInfo);.
8a50: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65  }../*.** Compute
8a60: 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65   the total numbe
8a70: 72 20 6f 66 20 62 79 74 65 73 20 74 68 61 74 20  r of bytes that 
8a80: 61 20 43 65 6c 6c 20 6e 65 65 64 73 20 69 6e 20  a Cell needs in 
8a90: 74 68 65 20 63 65 6c 6c 0a 2a 2a 20 64 61 74 61  the cell.** data
8aa0: 20 61 72 65 61 20 6f 66 20 74 68 65 20 62 74 72   area of the btr
8ab0: 65 65 2d 70 61 67 65 2e 20 20 54 68 65 20 72 65  ee-page.  The re
8ac0: 74 75 72 6e 20 6e 75 6d 62 65 72 20 69 6e 63 6c  turn number incl
8ad0: 75 64 65 73 20 74 68 65 20 63 65 6c 6c 0a 2a 2a  udes the cell.**
8ae0: 20 64 61 74 61 20 68 65 61 64 65 72 20 61 6e 64   data header and
8af0: 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 79 6c 6f   the local paylo
8b00: 61 64 2c 20 62 75 74 20 6e 6f 74 20 61 6e 79 20  ad, but not any 
8b10: 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 6f 72  overflow page or
8b20: 0a 2a 2a 20 74 68 65 20 73 70 61 63 65 20 75 73  .** the space us
8b30: 65 64 20 62 79 20 74 68 65 20 63 65 6c 6c 20 70  ed by the cell p
8b40: 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  ointer..*/.stati
8b50: 63 20 75 31 36 20 63 65 6c 6c 53 69 7a 65 50 74  c u16 cellSizePt
8b60: 72 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  r(MemPage *pPage
8b70: 2c 20 75 38 20 2a 70 43 65 6c 6c 29 7b 0a 20 20  , u8 *pCell){.  
8b80: 75 38 20 2a 70 49 74 65 72 20 3d 20 70 43 65 6c  u8 *pIter = pCel
8b90: 6c 20 2b 20 70 50 61 67 65 2d 3e 63 68 69 6c 64  l + pPage->child
8ba0: 50 74 72 53 69 7a 65 3b 20 2f 2a 20 46 6f 72 20  PtrSize; /* For 
8bb0: 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 62 79 74  looping over byt
8bc0: 65 73 20 6f 66 20 70 43 65 6c 6c 20 2a 2f 0a 20  es of pCell */. 
8bd0: 20 75 38 20 2a 70 45 6e 64 3b 20 20 20 20 20 20   u8 *pEnd;      
8be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8bf0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 6e 64            /* End
8c00: 20 6d 61 72 6b 20 66 6f 72 20 61 20 76 61 72 69   mark for a vari
8c10: 6e 74 20 2a 2f 0a 20 20 75 33 32 20 6e 53 69 7a  nt */.  u32 nSiz
8c20: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
8c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8c40: 20 2f 2a 20 53 69 7a 65 20 76 61 6c 75 65 20 74   /* Size value t
8c50: 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 0a 23 69 66  o return */..#if
8c60: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
8c70: 0a 20 20 2f 2a 20 54 68 65 20 76 61 6c 75 65 20  .  /* The value 
8c80: 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 69 73  returned by this
8c90: 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64   function should
8ca0: 20 61 6c 77 61 79 73 20 62 65 20 74 68 65 20 73   always be the s
8cb0: 61 6d 65 20 61 73 0a 20 20 2a 2a 20 74 68 65 20  ame as.  ** the 
8cc0: 28 43 65 6c 6c 49 6e 66 6f 2e 6e 53 69 7a 65 29  (CellInfo.nSize)
8cd0: 20 76 61 6c 75 65 20 66 6f 75 6e 64 20 62 79 20   value found by 
8ce0: 64 6f 69 6e 67 20 61 20 66 75 6c 6c 20 70 61 72  doing a full par
8cf0: 73 65 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 63  se of the.  ** c
8d00: 65 6c 6c 2e 20 49 66 20 53 51 4c 49 54 45 5f 44  ell. If SQLITE_D
8d10: 45 42 55 47 20 69 73 20 64 65 66 69 6e 65 64 2c  EBUG is defined,
8d20: 20 61 6e 20 61 73 73 65 72 74 28 29 20 61 74 20   an assert() at 
8d30: 74 68 65 20 62 6f 74 74 6f 6d 20 6f 66 0a 20 20  the bottom of.  
8d40: 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** this function
8d50: 20 76 65 72 69 66 69 65 73 20 74 68 61 74 20 74   verifies that t
8d60: 68 69 73 20 69 6e 76 61 72 69 61 6e 74 20 69 73  his invariant is
8d70: 20 6e 6f 74 20 76 69 6f 6c 61 74 65 64 2e 20 2a   not violated. *
8d80: 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 64 65 62  /.  CellInfo deb
8d90: 75 67 69 6e 66 6f 3b 0a 20 20 62 74 72 65 65 50  uginfo;.  btreeP
8da0: 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67  arseCellPtr(pPag
8db0: 65 2c 20 70 43 65 6c 6c 2c 20 26 64 65 62 75 67  e, pCell, &debug
8dc0: 69 6e 66 6f 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  info);.#endif.. 
8dd0: 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 6f 50 61   if( pPage->noPa
8de0: 79 6c 6f 61 64 20 29 7b 0a 20 20 20 20 70 45 6e  yload ){.    pEn
8df0: 64 20 3d 20 26 70 49 74 65 72 5b 39 5d 3b 0a 20  d = &pIter[9];. 
8e00: 20 20 20 77 68 69 6c 65 28 20 28 2a 70 49 74 65     while( (*pIte
8e10: 72 2b 2b 29 26 30 78 38 30 20 26 26 20 70 49 74  r++)&0x80 && pIt
8e20: 65 72 3c 70 45 6e 64 20 29 3b 0a 20 20 20 20 61  er<pEnd );.    a
8e30: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 63 68  ssert( pPage->ch
8e40: 69 6c 64 50 74 72 53 69 7a 65 3d 3d 34 20 29 3b  ildPtrSize==4 );
8e50: 0a 20 20 20 20 72 65 74 75 72 6e 20 28 75 31 36  .    return (u16
8e60: 29 28 70 49 74 65 72 20 2d 20 70 43 65 6c 6c 29  )(pIter - pCell)
8e70: 3b 0a 20 20 7d 0a 20 20 6e 53 69 7a 65 20 3d 20  ;.  }.  nSize = 
8e80: 2a 70 49 74 65 72 3b 0a 20 20 69 66 28 20 6e 53  *pIter;.  if( nS
8e90: 69 7a 65 3e 3d 30 78 38 30 20 29 7b 0a 20 20 20  ize>=0x80 ){.   
8ea0: 20 70 45 6e 64 20 3d 20 26 70 49 74 65 72 5b 39   pEnd = &pIter[9
8eb0: 5d 3b 0a 20 20 20 20 6e 53 69 7a 65 20 26 3d 20  ];.    nSize &= 
8ec0: 30 78 37 66 3b 0a 20 20 20 20 64 6f 7b 0a 20 20  0x7f;.    do{.  
8ed0: 20 20 20 20 6e 53 69 7a 65 20 3d 20 28 6e 53 69      nSize = (nSi
8ee0: 7a 65 3c 3c 37 29 20 7c 20 28 2a 2b 2b 70 49 74  ze<<7) | (*++pIt
8ef0: 65 72 20 26 20 30 78 37 66 29 3b 0a 20 20 20 20  er & 0x7f);.    
8f00: 7d 77 68 69 6c 65 28 20 2a 28 70 49 74 65 72 29  }while( *(pIter)
8f10: 3e 3d 30 78 38 30 20 26 26 20 70 49 74 65 72 3c  >=0x80 && pIter<
8f20: 70 45 6e 64 20 29 3b 0a 20 20 7d 0a 20 20 70 49  pEnd );.  }.  pI
8f30: 74 65 72 2b 2b 3b 0a 20 20 69 66 28 20 70 50 61  ter++;.  if( pPa
8f40: 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20  ge->intKey ){.  
8f50: 20 20 2f 2a 20 70 49 74 65 72 20 6e 6f 77 20 70    /* pIter now p
8f60: 6f 69 6e 74 73 20 61 74 20 74 68 65 20 36 34 2d  oints at the 64-
8f70: 62 69 74 20 69 6e 74 65 67 65 72 20 6b 65 79 20  bit integer key 
8f80: 76 61 6c 75 65 2c 20 61 20 76 61 72 69 61 62 6c  value, a variabl
8f90: 65 20 6c 65 6e 67 74 68 20 0a 20 20 20 20 2a 2a  e length .    **
8fa0: 20 69 6e 74 65 67 65 72 2e 20 54 68 65 20 66 6f   integer. The fo
8fb0: 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 6d 6f  llowing block mo
8fc0: 76 65 73 20 70 49 74 65 72 20 74 6f 20 70 6f 69  ves pIter to poi
8fd0: 6e 74 20 61 74 20 74 68 65 20 66 69 72 73 74 20  nt at the first 
8fe0: 62 79 74 65 0a 20 20 20 20 2a 2a 20 70 61 73 74  byte.    ** past
8ff0: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
9000: 6b 65 79 20 76 61 6c 75 65 2e 20 2a 2f 0a 20 20  key value. */.  
9010: 20 20 70 45 6e 64 20 3d 20 26 70 49 74 65 72 5b    pEnd = &pIter[
9020: 39 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28  9];.    while( (
9030: 2a 70 49 74 65 72 2b 2b 29 26 30 78 38 30 20 26  *pIter++)&0x80 &
9040: 26 20 70 49 74 65 72 3c 70 45 6e 64 20 29 3b 0a  & pIter<pEnd );.
9050: 20 20 7d 0a 20 20 74 65 73 74 63 61 73 65 28 20    }.  testcase( 
9060: 6e 53 69 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d 61  nSize==pPage->ma
9070: 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 74 65 73 74  xLocal );.  test
9080: 63 61 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61  case( nSize==pPa
9090: 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29  ge->maxLocal+1 )
90a0: 3b 0a 20 20 69 66 28 20 6e 53 69 7a 65 3c 3d 70  ;.  if( nSize<=p
90b0: 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29  Page->maxLocal )
90c0: 7b 0a 20 20 20 20 6e 53 69 7a 65 20 2b 3d 20 28  {.    nSize += (
90d0: 75 33 32 29 28 70 49 74 65 72 20 2d 20 70 43 65  u32)(pIter - pCe
90e0: 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20 6e 53 69  ll);.    if( nSi
90f0: 7a 65 3c 34 20 29 20 6e 53 69 7a 65 20 3d 20 34  ze<4 ) nSize = 4
9100: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
9110: 6e 74 20 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 50  nt minLocal = pP
9120: 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20  age->minLocal;. 
9130: 20 20 20 6e 53 69 7a 65 20 3d 20 6d 69 6e 4c 6f     nSize = minLo
9140: 63 61 6c 20 2b 20 28 6e 53 69 7a 65 20 2d 20 6d  cal + (nSize - m
9150: 69 6e 4c 6f 63 61 6c 29 20 25 20 28 70 50 61 67  inLocal) % (pPag
9160: 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
9170: 7a 65 20 2d 20 34 29 3b 0a 20 20 20 20 74 65 73  ze - 4);.    tes
9180: 74 63 61 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50  tcase( nSize==pP
9190: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b  age->maxLocal );
91a0: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e  .    testcase( n
91b0: 53 69 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78  Size==pPage->max
91c0: 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 20 20 69  Local+1 );.    i
91d0: 66 28 20 6e 53 69 7a 65 3e 70 50 61 67 65 2d 3e  f( nSize>pPage->
91e0: 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20  maxLocal ){.    
91f0: 20 20 6e 53 69 7a 65 20 3d 20 6d 69 6e 4c 6f 63    nSize = minLoc
9200: 61 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 53  al;.    }.    nS
9210: 69 7a 65 20 2b 3d 20 34 20 2b 20 28 75 31 36 29  ize += 4 + (u16)
9220: 28 70 49 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b  (pIter - pCell);
9230: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e  .  }.  assert( n
9240: 53 69 7a 65 3d 3d 64 65 62 75 67 69 6e 66 6f 2e  Size==debuginfo.
9250: 6e 53 69 7a 65 20 7c 7c 20 43 4f 52 52 55 50 54  nSize || CORRUPT
9260: 5f 44 42 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  _DB );.  return 
9270: 28 75 31 36 29 6e 53 69 7a 65 3b 0a 7d 0a 0a 23  (u16)nSize;.}..#
9280: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
9290: 55 47 0a 2f 2a 20 54 68 69 73 20 76 61 72 69 61  UG./* This varia
92a0: 74 69 6f 6e 20 6f 6e 20 63 65 6c 6c 53 69 7a 65  tion on cellSize
92b0: 50 74 72 28 29 20 69 73 20 75 73 65 64 20 69 6e  Ptr() is used in
92c0: 73 69 64 65 20 6f 66 20 61 73 73 65 72 74 28 29  side of assert()
92d0: 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2a 20 6f   statements.** o
92e0: 6e 6c 79 2e 20 2a 2f 0a 73 74 61 74 69 63 20 75  nly. */.static u
92f0: 31 36 20 63 65 6c 6c 53 69 7a 65 28 4d 65 6d 50  16 cellSize(MemP
9300: 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20  age *pPage, int 
9310: 69 43 65 6c 6c 29 7b 0a 20 20 72 65 74 75 72 6e  iCell){.  return
9320: 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61   cellSizePtr(pPa
9330: 67 65 2c 20 66 69 6e 64 43 65 6c 6c 28 70 50 61  ge, findCell(pPa
9340: 67 65 2c 20 69 43 65 6c 6c 29 29 3b 0a 7d 0a 23  ge, iCell));.}.#
9350: 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53  endif..#ifndef S
9360: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
9370: 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 49 66 20 74  ACUUM./*.** If t
9380: 68 65 20 63 65 6c 6c 20 70 43 65 6c 6c 2c 20 70  he cell pCell, p
9390: 61 72 74 20 6f 66 20 70 61 67 65 20 70 50 61 67  art of page pPag
93a0: 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69  e contains a poi
93b0: 6e 74 65 72 0a 2a 2a 20 74 6f 20 61 6e 20 6f 76  nter.** to an ov
93c0: 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 69 6e 73  erflow page, ins
93d0: 65 72 74 20 61 6e 20 65 6e 74 72 79 20 69 6e 74  ert an entry int
93e0: 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61  o the pointer-ma
93f0: 70 0a 2a 2a 20 66 6f 72 20 74 68 65 20 6f 76 65  p.** for the ove
9400: 72 66 6c 6f 77 20 70 61 67 65 2e 0a 2a 2f 0a 73  rflow page..*/.s
9410: 74 61 74 69 63 20 76 6f 69 64 20 70 74 72 6d 61  tatic void ptrma
9420: 70 50 75 74 4f 76 66 6c 50 74 72 28 4d 65 6d 50  pPutOvflPtr(MemP
9430: 61 67 65 20 2a 70 50 61 67 65 2c 20 75 38 20 2a  age *pPage, u8 *
9440: 70 43 65 6c 6c 2c 20 69 6e 74 20 2a 70 52 43 29  pCell, int *pRC)
9450: 7b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66  {.  CellInfo inf
9460: 6f 3b 0a 20 20 69 66 28 20 2a 70 52 43 20 29 20  o;.  if( *pRC ) 
9470: 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74  return;.  assert
9480: 28 20 70 43 65 6c 6c 21 3d 30 20 29 3b 0a 20 20  ( pCell!=0 );.  
9490: 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  btreeParseCellPt
94a0: 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20  r(pPage, pCell, 
94b0: 26 69 6e 66 6f 29 3b 0a 20 20 69 66 28 20 69 6e  &info);.  if( in
94c0: 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 20 29 7b 0a  fo.iOverflow ){.
94d0: 20 20 20 20 50 67 6e 6f 20 6f 76 66 6c 20 3d 20      Pgno ovfl = 
94e0: 67 65 74 34 62 79 74 65 28 26 70 43 65 6c 6c 5b  get4byte(&pCell[
94f0: 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29  info.iOverflow])
9500: 3b 0a 20 20 20 20 70 74 72 6d 61 70 50 75 74 28  ;.    ptrmapPut(
9510: 70 50 61 67 65 2d 3e 70 42 74 2c 20 6f 76 66 6c  pPage->pBt, ovfl
9520: 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  , PTRMAP_OVERFLO
9530: 57 31 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c  W1, pPage->pgno,
9540: 20 70 52 43 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e   pRC);.  }.}.#en
9550: 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 72  dif.../*.** Defr
9560: 61 67 6d 65 6e 74 20 74 68 65 20 70 61 67 65 20  agment the page 
9570: 67 69 76 65 6e 2e 20 20 41 6c 6c 20 43 65 6c 6c  given.  All Cell
9580: 73 20 61 72 65 20 6d 6f 76 65 64 20 74 6f 20 74  s are moved to t
9590: 68 65 0a 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65  he.** end of the
95a0: 20 70 61 67 65 20 61 6e 64 20 61 6c 6c 20 66 72   page and all fr
95b0: 65 65 20 73 70 61 63 65 20 69 73 20 63 6f 6c 6c  ee space is coll
95c0: 65 63 74 65 64 20 69 6e 74 6f 20 6f 6e 65 0a 2a  ected into one.*
95d0: 2a 20 62 69 67 20 46 72 65 65 42 6c 6b 20 74 68  * big FreeBlk th
95e0: 61 74 20 6f 63 63 75 72 73 20 69 6e 20 62 65 74  at occurs in bet
95f0: 77 65 65 6e 20 74 68 65 20 68 65 61 64 65 72 20  ween the header 
9600: 61 6e 64 20 63 65 6c 6c 0a 2a 2a 20 70 6f 69 6e  and cell.** poin
9610: 74 65 72 20 61 72 72 61 79 20 61 6e 64 20 74 68  ter array and th
9620: 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61  e cell content a
9630: 72 65 61 2e 0a 2a 2a 0a 2a 2a 20 45 56 49 44 45  rea..**.** EVIDE
9640: 4e 43 45 2d 4f 46 3a 20 52 2d 34 34 35 38 32 2d  NCE-OF: R-44582-
9650: 36 30 31 33 38 20 53 51 4c 69 74 65 20 6d 61 79  60138 SQLite may
9660: 20 66 72 6f 6d 20 74 69 6d 65 20 74 6f 20 74 69   from time to ti
9670: 6d 65 20 72 65 6f 72 67 61 6e 69 7a 65 20 61 0a  me reorganize a.
9680: 2a 2a 20 62 2d 74 72 65 65 20 70 61 67 65 20 73  ** b-tree page s
9690: 6f 20 74 68 61 74 20 74 68 65 72 65 20 61 72 65  o that there are
96a0: 20 6e 6f 20 66 72 65 65 62 6c 6f 63 6b 73 20 6f   no freeblocks o
96b0: 72 20 66 72 61 67 6d 65 6e 74 20 62 79 74 65 73  r fragment bytes
96c0: 2c 20 61 6c 6c 0a 2a 2a 20 75 6e 75 73 65 64 20  , all.** unused 
96d0: 62 79 74 65 73 20 61 72 65 20 63 6f 6e 74 61 69  bytes are contai
96e0: 6e 65 64 20 69 6e 20 74 68 65 20 75 6e 61 6c 6c  ned in the unall
96f0: 6f 63 61 74 65 64 20 73 70 61 63 65 20 72 65 67  ocated space reg
9700: 69 6f 6e 2c 20 61 6e 64 20 61 6c 6c 0a 2a 2a 20  ion, and all.** 
9710: 63 65 6c 6c 73 20 61 72 65 20 70 61 63 6b 65 64  cells are packed
9720: 20 74 69 67 68 74 6c 79 20 61 74 20 74 68 65 20   tightly at the 
9730: 65 6e 64 20 6f 66 20 74 68 65 20 70 61 67 65 2e  end of the page.
9740: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64  .*/.static int d
9750: 65 66 72 61 67 6d 65 6e 74 50 61 67 65 28 4d 65  efragmentPage(Me
9760: 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20  mPage *pPage){. 
9770: 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
9780: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
9790: 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
97a0: 20 69 6e 74 20 70 63 3b 20 20 20 20 20 20 20 20   int pc;        
97b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
97c0: 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 69 2d  ddress of the i-
97d0: 74 68 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74  th cell */.  int
97e0: 20 68 64 72 3b 20 20 20 20 20 20 20 20 20 20 20   hdr;           
97f0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
9800: 74 20 74 6f 20 74 68 65 20 70 61 67 65 20 68 65  t to the page he
9810: 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 73 69  ader */.  int si
9820: 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
9830: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
9840: 61 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20  a cell */.  int 
9850: 75 73 61 62 6c 65 53 69 7a 65 3b 20 20 20 20 20  usableSize;     
9860: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
9870: 20 6f 66 20 75 73 61 62 6c 65 20 62 79 74 65 73   of usable bytes
9880: 20 6f 6e 20 61 20 70 61 67 65 20 2a 2f 0a 20 20   on a page */.  
9890: 69 6e 74 20 63 65 6c 6c 4f 66 66 73 65 74 3b 20  int cellOffset; 
98a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66             /* Of
98b0: 66 73 65 74 20 74 6f 20 74 68 65 20 63 65 6c 6c  fset to the cell
98c0: 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79 20 2a   pointer array *
98d0: 2f 0a 20 20 69 6e 74 20 63 62 72 6b 3b 20 20 20  /.  int cbrk;   
98e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
98f0: 2a 20 4f 66 66 73 65 74 20 74 6f 20 74 68 65 20  * Offset to the 
9900: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65  cell content are
9910: 61 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c  a */.  int nCell
9920: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
9930: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
9940: 65 6c 6c 73 20 6f 6e 20 74 68 65 20 70 61 67 65  ells on the page
9950: 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
9960: 68 61 72 20 2a 64 61 74 61 3b 20 20 20 20 20 20  har *data;      
9970: 20 2f 2a 20 54 68 65 20 70 61 67 65 20 64 61 74   /* The page dat
9980: 61 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  a */.  unsigned 
9990: 63 68 61 72 20 2a 74 65 6d 70 3b 20 20 20 20 20  char *temp;     
99a0: 20 20 2f 2a 20 54 65 6d 70 20 61 72 65 61 20 66    /* Temp area f
99b0: 6f 72 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  or cell content 
99c0: 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
99d0: 61 72 20 2a 73 72 63 3b 20 20 20 20 20 20 20 20  ar *src;        
99e0: 2f 2a 20 53 6f 75 72 63 65 20 6f 66 20 63 6f 6e  /* Source of con
99f0: 74 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69 43  tent */.  int iC
9a00: 65 6c 6c 46 69 72 73 74 3b 20 20 20 20 20 20 20  ellFirst;       
9a10: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 6c       /* First al
9a20: 6c 6f 77 61 62 6c 65 20 63 65 6c 6c 20 69 6e 64  lowable cell ind
9a30: 65 78 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c  ex */.  int iCel
9a40: 6c 4c 61 73 74 3b 20 20 20 20 20 20 20 20 20 20  lLast;          
9a50: 20 20 20 2f 2a 20 4c 61 73 74 20 70 6f 73 73 69     /* Last possi
9a60: 62 6c 65 20 63 65 6c 6c 20 69 6e 64 65 78 20 2a  ble cell index *
9a70: 2f 0a 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  /...  assert( sq
9a80: 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
9a90: 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
9aa0: 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72  Page) );.  asser
9ab0: 74 28 20 70 50 61 67 65 2d 3e 70 42 74 21 3d 30  t( pPage->pBt!=0
9ac0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
9ad0: 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
9ae0: 53 69 7a 65 20 3c 3d 20 53 51 4c 49 54 45 5f 4d  Size <= SQLITE_M
9af0: 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 29 3b 0a  AX_PAGE_SIZE );.
9b00: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
9b10: 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b  >nOverflow==0 );
9b20: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
9b30: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
9b40: 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
9b50: 20 29 3b 0a 20 20 74 65 6d 70 20 3d 20 30 3b 0a   );.  temp = 0;.
9b60: 20 20 73 72 63 20 3d 20 64 61 74 61 20 3d 20 70    src = data = p
9b70: 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 68  Page->aData;.  h
9b80: 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f  dr = pPage->hdrO
9b90: 66 66 73 65 74 3b 0a 20 20 63 65 6c 6c 4f 66 66  ffset;.  cellOff
9ba0: 73 65 74 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c  set = pPage->cel
9bb0: 6c 4f 66 66 73 65 74 3b 0a 20 20 6e 43 65 6c 6c  lOffset;.  nCell
9bc0: 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b   = pPage->nCell;
9bd0: 0a 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c  .  assert( nCell
9be0: 3d 3d 67 65 74 32 62 79 74 65 28 26 64 61 74 61  ==get2byte(&data
9bf0: 5b 68 64 72 2b 33 5d 29 20 29 3b 0a 20 20 75 73  [hdr+3]) );.  us
9c00: 61 62 6c 65 53 69 7a 65 20 3d 20 70 50 61 67 65  ableSize = pPage
9c10: 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
9c20: 65 3b 0a 20 20 63 62 72 6b 20 3d 20 75 73 61 62  e;.  cbrk = usab
9c30: 6c 65 53 69 7a 65 3b 0a 20 20 69 43 65 6c 6c 46  leSize;.  iCellF
9c40: 69 72 73 74 20 3d 20 63 65 6c 6c 4f 66 66 73 65  irst = cellOffse
9c50: 74 20 2b 20 32 2a 6e 43 65 6c 6c 3b 0a 20 20 69  t + 2*nCell;.  i
9c60: 43 65 6c 6c 4c 61 73 74 20 3d 20 75 73 61 62 6c  CellLast = usabl
9c70: 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20 66 6f 72  eSize - 4;.  for
9c80: 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69  (i=0; i<nCell; i
9c90: 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70 41 64  ++){.    u8 *pAd
9ca0: 64 72 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 69  dr;     /* The i
9cb0: 2d 74 68 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  -th cell pointer
9cc0: 20 2a 2f 0a 20 20 20 20 70 41 64 64 72 20 3d 20   */.    pAddr = 
9cd0: 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74  &data[cellOffset
9ce0: 20 2b 20 69 2a 32 5d 3b 0a 20 20 20 20 70 63 20   + i*2];.    pc 
9cf0: 3d 20 67 65 74 32 62 79 74 65 28 70 41 64 64 72  = get2byte(pAddr
9d00: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
9d10: 20 70 63 3d 3d 69 43 65 6c 6c 46 69 72 73 74 20   pc==iCellFirst 
9d20: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
9d30: 20 70 63 3d 3d 69 43 65 6c 6c 4c 61 73 74 20 29   pc==iCellLast )
9d40: 3b 0a 20 20 20 20 2f 2a 20 54 68 65 73 65 20 63  ;.    /* These c
9d50: 6f 6e 64 69 74 69 6f 6e 73 20 68 61 76 65 20 61  onditions have a
9d60: 6c 72 65 61 64 79 20 62 65 65 6e 20 76 65 72 69  lready been veri
9d70: 66 69 65 64 20 69 6e 20 62 74 72 65 65 49 6e 69  fied in btreeIni
9d80: 74 50 61 67 65 28 29 0a 20 20 20 20 2a 2a 20 69  tPage().    ** i
9d90: 66 20 50 52 41 47 4d 41 20 63 65 6c 6c 5f 73 69  f PRAGMA cell_si
9da0: 7a 65 5f 63 68 65 63 6b 3d 4f 4e 2e 0a 20 20 20  ze_check=ON..   
9db0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 63 3c 69   */.    if( pc<i
9dc0: 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63 3e  CellFirst || pc>
9dd0: 69 43 65 6c 6c 4c 61 73 74 20 29 7b 0a 20 20 20  iCellLast ){.   
9de0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
9df0: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
9e00: 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
9e10: 20 70 63 3e 3d 69 43 65 6c 6c 46 69 72 73 74 20   pc>=iCellFirst 
9e20: 26 26 20 70 63 3c 3d 69 43 65 6c 6c 4c 61 73 74  && pc<=iCellLast
9e30: 20 29 3b 0a 20 20 20 20 73 69 7a 65 20 3d 20 63   );.    size = c
9e40: 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65  ellSizePtr(pPage
9e50: 2c 20 26 73 72 63 5b 70 63 5d 29 3b 0a 20 20 20  , &src[pc]);.   
9e60: 20 63 62 72 6b 20 2d 3d 20 73 69 7a 65 3b 0a 20   cbrk -= size;. 
9e70: 20 20 20 69 66 28 20 63 62 72 6b 3c 69 43 65 6c     if( cbrk<iCel
9e80: 6c 46 69 72 73 74 20 7c 7c 20 70 63 2b 73 69 7a  lFirst || pc+siz
9e90: 65 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a  e>usableSize ){.
9ea0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
9eb0: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
9ec0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
9ed0: 72 74 28 20 63 62 72 6b 2b 73 69 7a 65 3c 3d 75  rt( cbrk+size<=u
9ee0: 73 61 62 6c 65 53 69 7a 65 20 26 26 20 63 62 72  sableSize && cbr
9ef0: 6b 3e 3d 69 43 65 6c 6c 46 69 72 73 74 20 29 3b  k>=iCellFirst );
9f00: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 63  .    testcase( c
9f10: 62 72 6b 2b 73 69 7a 65 3d 3d 75 73 61 62 6c 65  brk+size==usable
9f20: 53 69 7a 65 20 29 3b 0a 20 20 20 20 74 65 73 74  Size );.    test
9f30: 63 61 73 65 28 20 70 63 2b 73 69 7a 65 3d 3d 75  case( pc+size==u
9f40: 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20  sableSize );.   
9f50: 20 70 75 74 32 62 79 74 65 28 70 41 64 64 72 2c   put2byte(pAddr,
9f60: 20 63 62 72 6b 29 3b 0a 20 20 20 20 69 66 28 20   cbrk);.    if( 
9f70: 74 65 6d 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20  temp==0 ){.     
9f80: 20 69 6e 74 20 78 3b 0a 20 20 20 20 20 20 69 66   int x;.      if
9f90: 28 20 63 62 72 6b 3d 3d 70 63 20 29 20 63 6f 6e  ( cbrk==pc ) con
9fa0: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 74 65 6d  tinue;.      tem
9fb0: 70 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  p = sqlite3Pager
9fc0: 54 65 6d 70 53 70 61 63 65 28 70 50 61 67 65 2d  TempSpace(pPage-
9fd0: 3e 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20  >pBt->pPager);. 
9fe0: 20 20 20 20 20 78 20 3d 20 67 65 74 32 62 79 74       x = get2byt
9ff0: 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b  e(&data[hdr+5]);
a000: 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 74  .      memcpy(&t
a010: 65 6d 70 5b 78 5d 2c 20 26 64 61 74 61 5b 78 5d  emp[x], &data[x]
a020: 2c 20 28 63 62 72 6b 2b 73 69 7a 65 29 20 2d 20  , (cbrk+size) - 
a030: 78 29 3b 0a 20 20 20 20 20 20 73 72 63 20 3d 20  x);.      src = 
a040: 74 65 6d 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20  temp;.    }.    
a050: 6d 65 6d 63 70 79 28 26 64 61 74 61 5b 63 62 72  memcpy(&data[cbr
a060: 6b 5d 2c 20 26 73 72 63 5b 70 63 5d 2c 20 73 69  k], &src[pc], si
a070: 7a 65 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  ze);.  }.  asser
a080: 74 28 20 63 62 72 6b 3e 3d 69 43 65 6c 6c 46 69  t( cbrk>=iCellFi
a090: 72 73 74 20 29 3b 0a 20 20 70 75 74 32 62 79 74  rst );.  put2byt
a0a0: 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20  e(&data[hdr+5], 
a0b0: 63 62 72 6b 29 3b 0a 20 20 64 61 74 61 5b 68 64  cbrk);.  data[hd
a0c0: 72 2b 31 5d 20 3d 20 30 3b 0a 20 20 64 61 74 61  r+1] = 0;.  data
a0d0: 5b 68 64 72 2b 32 5d 20 3d 20 30 3b 0a 20 20 64  [hdr+2] = 0;.  d
a0e0: 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a  ata[hdr+7] = 0;.
a0f0: 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 69    memset(&data[i
a100: 43 65 6c 6c 46 69 72 73 74 5d 2c 20 30 2c 20 63  CellFirst], 0, c
a110: 62 72 6b 2d 69 43 65 6c 6c 46 69 72 73 74 29 3b  brk-iCellFirst);
a120: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
a130: 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
a140: 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
a150: 65 29 20 29 3b 0a 20 20 69 66 28 20 63 62 72 6b  e) );.  if( cbrk
a160: 2d 69 43 65 6c 6c 46 69 72 73 74 21 3d 70 50 61  -iCellFirst!=pPa
a170: 67 65 2d 3e 6e 46 72 65 65 20 29 7b 0a 20 20 20  ge->nFree ){.   
a180: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
a190: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d  ORRUPT_BKPT;.  }
a1a0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
a1b0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  _OK;.}../*.** Se
a1c0: 61 72 63 68 20 74 68 65 20 66 72 65 65 2d 6c 69  arch the free-li
a1d0: 73 74 20 6f 6e 20 70 61 67 65 20 70 50 67 20 66  st on page pPg f
a1e0: 6f 72 20 73 70 61 63 65 20 74 6f 20 73 74 6f 72  or space to stor
a1f0: 65 20 61 20 63 65 6c 6c 20 6e 42 79 74 65 20 62  e a cell nByte b
a200: 79 74 65 73 20 69 6e 0a 2a 2a 20 73 69 7a 65 2e  ytes in.** size.
a210: 20 49 66 20 6f 6e 65 20 63 61 6e 20 62 65 20 66   If one can be f
a220: 6f 75 6e 64 2c 20 72 65 74 75 72 6e 20 61 20 70  ound, return a p
a230: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 73 70  ointer to the sp
a240: 61 63 65 20 61 6e 64 20 72 65 6d 6f 76 65 20 69  ace and remove i
a250: 74 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 66 72  t.** from the fr
a260: 65 65 2d 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 49  ee-list..**.** I
a270: 66 20 6e 6f 20 73 75 69 74 61 62 6c 65 20 73 70  f no suitable sp
a280: 61 63 65 20 63 61 6e 20 62 65 20 66 6f 75 6e 64  ace can be found
a290: 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73   on the free-lis
a2a0: 74 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a  t, return NULL..
a2b0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
a2c0: 69 6f 6e 20 6d 61 79 20 64 65 74 65 63 74 20 63  ion may detect c
a2d0: 6f 72 72 75 70 74 69 6f 6e 20 77 69 74 68 69 6e  orruption within
a2e0: 20 70 50 67 2e 20 20 49 66 20 63 6f 72 72 75 70   pPg.  If corrup
a2f0: 74 69 6f 6e 20 69 73 0a 2a 2a 20 64 65 74 65 63  tion is.** detec
a300: 74 65 64 20 74 68 65 6e 20 2a 70 52 63 20 69 73  ted then *pRc is
a310: 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 43   set to SQLITE_C
a320: 4f 52 52 55 50 54 20 61 6e 64 20 4e 55 4c 4c 20  ORRUPT and NULL 
a330: 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a  is returned..**.
a340: 2a 2a 20 49 66 20 61 20 73 6c 6f 74 20 6f 66 20  ** If a slot of 
a350: 61 74 20 6c 65 61 73 74 20 6e 42 79 74 65 20 62  at least nByte b
a360: 79 74 65 73 20 69 73 20 66 6f 75 6e 64 20 62 75  ytes is found bu
a370: 74 20 63 61 6e 6e 6f 74 20 62 65 20 75 73 65 64  t cannot be used
a380: 20 62 65 63 61 75 73 65 20 0a 2a 2a 20 74 68 65   because .** the
a390: 72 65 20 61 72 65 20 61 6c 72 65 61 64 79 20 61  re are already a
a3a0: 74 20 6c 65 61 73 74 20 36 30 20 66 72 61 67 6d  t least 60 fragm
a3b0: 65 6e 74 65 64 20 62 79 74 65 73 20 6f 6e 20 74  ented bytes on t
a3c0: 68 65 20 70 61 67 65 2c 20 72 65 74 75 72 6e 20  he page, return 
a3d0: 4e 55 4c 4c 2e 0a 2a 2a 20 49 6e 20 74 68 69 73  NULL..** In this
a3e0: 20 63 61 73 65 2c 20 69 66 20 70 62 44 65 66 72   case, if pbDefr
a3f0: 61 67 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  ag parameter is 
a400: 6e 6f 74 20 4e 55 4c 4c 2c 20 73 65 74 20 2a 70  not NULL, set *p
a410: 62 44 65 66 72 61 67 20 74 6f 20 74 72 75 65 2e  bDefrag to true.
a420: 0a 2a 2f 0a 73 74 61 74 69 63 20 75 38 20 2a 70  .*/.static u8 *p
a430: 61 67 65 46 69 6e 64 53 6c 6f 74 28 4d 65 6d 50  ageFindSlot(MemP
a440: 61 67 65 20 2a 70 50 67 2c 20 69 6e 74 20 6e 42  age *pPg, int nB
a450: 79 74 65 2c 20 69 6e 74 20 2a 70 52 63 2c 20 69  yte, int *pRc, i
a460: 6e 74 20 2a 70 62 44 65 66 72 61 67 29 7b 0a 20  nt *pbDefrag){. 
a470: 20 63 6f 6e 73 74 20 69 6e 74 20 68 64 72 20 3d   const int hdr =
a480: 20 70 50 67 2d 3e 68 64 72 4f 66 66 73 65 74 3b   pPg->hdrOffset;
a490: 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 61 44  .  u8 * const aD
a4a0: 61 74 61 20 3d 20 70 50 67 2d 3e 61 44 61 74 61  ata = pPg->aData
a4b0: 3b 0a 20 20 69 6e 74 20 69 41 64 64 72 3b 0a 20  ;.  int iAddr;. 
a4c0: 20 69 6e 74 20 70 63 3b 0a 20 20 69 6e 74 20 75   int pc;.  int u
a4d0: 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 50 67 2d  sableSize = pPg-
a4e0: 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
a4f0: 3b 0a 0a 20 20 66 6f 72 28 69 41 64 64 72 3d 68  ;..  for(iAddr=h
a500: 64 72 2b 31 3b 20 28 70 63 20 3d 20 67 65 74 32  dr+1; (pc = get2
a510: 62 79 74 65 28 26 61 44 61 74 61 5b 69 41 64 64  byte(&aData[iAdd
a520: 72 5d 29 29 3e 30 3b 20 69 41 64 64 72 3d 70 63  r]))>0; iAddr=pc
a530: 29 7b 0a 20 20 20 20 69 6e 74 20 73 69 7a 65 3b  ){.    int size;
a540: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
a550: 69 7a 65 20 6f 66 20 74 68 65 20 66 72 65 65 20  ize of the free 
a560: 73 6c 6f 74 20 2a 2f 0a 20 20 20 20 2f 2a 20 45  slot */.    /* E
a570: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 36  VIDENCE-OF: R-06
a580: 38 36 36 2d 33 39 31 32 35 20 46 72 65 65 62 6c  866-39125 Freebl
a590: 6f 63 6b 73 20 61 72 65 20 61 6c 77 61 79 73 20  ocks are always 
a5a0: 63 6f 6e 6e 65 63 74 65 64 20 69 6e 20 6f 72 64  connected in ord
a5b0: 65 72 20 6f 66 0a 20 20 20 20 2a 2a 20 69 6e 63  er of.    ** inc
a5c0: 72 65 61 73 69 6e 67 20 6f 66 66 73 65 74 2e 20  reasing offset. 
a5d0: 2a 2f 0a 20 20 20 20 69 66 28 20 70 63 3e 75 73  */.    if( pc>us
a5e0: 61 62 6c 65 53 69 7a 65 2d 34 20 7c 7c 20 70 63  ableSize-4 || pc
a5f0: 3c 69 41 64 64 72 2b 34 20 29 7b 0a 20 20 20 20  <iAddr+4 ){.    
a600: 20 20 2a 70 52 63 20 3d 20 53 51 4c 49 54 45 5f    *pRc = SQLITE_
a610: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
a620: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
a630: 20 20 7d 0a 20 20 20 20 2f 2a 20 45 56 49 44 45    }.    /* EVIDE
a640: 4e 43 45 2d 4f 46 3a 20 52 2d 32 32 37 31 30 2d  NCE-OF: R-22710-
a650: 35 33 33 32 38 20 54 68 65 20 74 68 69 72 64 20  53328 The third 
a660: 61 6e 64 20 66 6f 75 72 74 68 20 62 79 74 65 73  and fourth bytes
a670: 20 6f 66 20 65 61 63 68 0a 20 20 20 20 2a 2a 20   of each.    ** 
a680: 66 72 65 65 62 6c 6f 63 6b 20 66 6f 72 6d 20 61  freeblock form a
a690: 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65   big-endian inte
a6a0: 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65  ger which is the
a6b0: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66 72 65   size of the fre
a6c0: 65 62 6c 6f 63 6b 0a 20 20 20 20 2a 2a 20 69 6e  eblock.    ** in
a6d0: 20 62 79 74 65 73 2c 20 69 6e 63 6c 75 64 69 6e   bytes, includin
a6e0: 67 20 74 68 65 20 34 2d 62 79 74 65 20 68 65 61  g the 4-byte hea
a6f0: 64 65 72 2e 20 2a 2f 0a 20 20 20 20 73 69 7a 65  der. */.    size
a700: 20 3d 20 67 65 74 32 62 79 74 65 28 26 61 44 61   = get2byte(&aDa
a710: 74 61 5b 70 63 2b 32 5d 29 3b 0a 20 20 20 20 69  ta[pc+2]);.    i
a720: 66 28 20 73 69 7a 65 3e 3d 6e 42 79 74 65 20 29  f( size>=nByte )
a730: 7b 0a 20 20 20 20 20 20 69 6e 74 20 78 20 3d 20  {.      int x = 
a740: 73 69 7a 65 20 2d 20 6e 42 79 74 65 3b 0a 20 20  size - nByte;.  
a750: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 78 3d      testcase( x=
a760: 3d 34 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  =4 );.      test
a770: 63 61 73 65 28 20 78 3d 3d 33 20 29 3b 0a 20 20  case( x==3 );.  
a780: 20 20 20 20 69 66 28 20 78 3c 34 20 29 7b 0a 20      if( x<4 ){. 
a790: 20 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e         /* EVIDEN
a7a0: 43 45 2d 4f 46 3a 20 52 2d 31 31 34 39 38 2d 35  CE-OF: R-11498-5
a7b0: 38 30 32 32 20 49 6e 20 61 20 77 65 6c 6c 2d 66  8022 In a well-f
a7c0: 6f 72 6d 65 64 20 62 2d 74 72 65 65 20 70 61 67  ormed b-tree pag
a7d0: 65 2c 20 74 68 65 20 74 6f 74 61 6c 0a 20 20 20  e, the total.   
a7e0: 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f       ** number o
a7f0: 66 20 62 79 74 65 73 20 69 6e 20 66 72 61 67 6d  f bytes in fragm
a800: 65 6e 74 73 20 6d 61 79 20 6e 6f 74 20 65 78 63  ents may not exc
a810: 65 65 64 20 36 30 2e 20 2a 2f 0a 20 20 20 20 20  eed 60. */.     
a820: 20 20 20 69 66 28 20 61 44 61 74 61 5b 68 64 72     if( aData[hdr
a830: 2b 37 5d 3e 3d 36 30 20 29 7b 0a 20 20 20 20 20  +7]>=60 ){.     
a840: 20 20 20 20 20 69 66 28 20 70 62 44 65 66 72 61       if( pbDefra
a850: 67 20 29 20 2a 70 62 44 65 66 72 61 67 20 3d 20  g ) *pbDefrag = 
a860: 31 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  1;.          ret
a870: 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  urn 0;.        }
a880: 0a 20 20 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f  .        /* Remo
a890: 76 65 20 74 68 65 20 73 6c 6f 74 20 66 72 6f 6d  ve the slot from
a8a0: 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 20   the free-list. 
a8b0: 55 70 64 61 74 65 20 74 68 65 20 6e 75 6d 62 65  Update the numbe
a8c0: 72 20 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a 20  r of.        ** 
a8d0: 66 72 61 67 6d 65 6e 74 65 64 20 62 79 74 65 73  fragmented bytes
a8e0: 20 77 69 74 68 69 6e 20 74 68 65 20 70 61 67 65   within the page
a8f0: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 6d 65 6d  . */.        mem
a900: 63 70 79 28 26 61 44 61 74 61 5b 69 41 64 64 72  cpy(&aData[iAddr
a910: 5d 2c 20 26 61 44 61 74 61 5b 70 63 5d 2c 20 32  ], &aData[pc], 2
a920: 29 3b 0a 20 20 20 20 20 20 20 20 61 44 61 74 61  );.        aData
a930: 5b 68 64 72 2b 37 5d 20 2b 3d 20 28 75 38 29 78  [hdr+7] += (u8)x
a940: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
a950: 28 20 70 63 20 3c 20 70 50 67 2d 3e 63 65 6c 6c  ( pc < pPg->cell
a960: 4f 66 66 73 65 74 2b 32 2a 70 50 67 2d 3e 6e 43  Offset+2*pPg->nC
a970: 65 6c 6c 20 7c 7c 20 73 69 7a 65 2b 70 63 20 3e  ell || size+pc >
a980: 20 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20   usableSize ){. 
a990: 20 20 20 20 20 20 20 2a 70 52 63 20 3d 20 53 51         *pRc = SQ
a9a0: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
a9b0: 54 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  T;.        retur
a9c0: 6e 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  n 0;.      }else
a9d0: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  {.        /* The
a9e0: 20 73 6c 6f 74 20 72 65 6d 61 69 6e 73 20 6f 6e   slot remains on
a9f0: 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 20   the free-list. 
aa00: 52 65 64 75 63 65 20 69 74 73 20 73 69 7a 65 20  Reduce its size 
aa10: 74 6f 20 61 63 63 6f 75 6e 74 0a 20 20 20 20 20  to account.     
aa20: 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 70      ** for the p
aa30: 6f 72 74 69 6f 6e 20 75 73 65 64 20 62 79 20 74  ortion used by t
aa40: 68 65 20 6e 65 77 20 61 6c 6c 6f 63 61 74 69 6f  he new allocatio
aa50: 6e 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 75  n. */.        pu
aa60: 74 32 62 79 74 65 28 26 61 44 61 74 61 5b 70 63  t2byte(&aData[pc
aa70: 2b 32 5d 2c 20 78 29 3b 0a 20 20 20 20 20 20 7d  +2], x);.      }
aa80: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 26 61  .      return &a
aa90: 44 61 74 61 5b 70 63 20 2b 20 78 5d 3b 0a 20 20  Data[pc + x];.  
aaa0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
aab0: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c  n 0;.}../*.** Al
aac0: 6c 6f 63 61 74 65 20 6e 42 79 74 65 20 62 79 74  locate nByte byt
aad0: 65 73 20 6f 66 20 73 70 61 63 65 20 66 72 6f 6d  es of space from
aae0: 20 77 69 74 68 69 6e 20 74 68 65 20 42 2d 54 72   within the B-Tr
aaf0: 65 65 20 70 61 67 65 20 70 61 73 73 65 64 0a 2a  ee page passed.*
ab00: 2a 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61  * as the first a
ab10: 72 67 75 6d 65 6e 74 2e 20 57 72 69 74 65 20 69  rgument. Write i
ab20: 6e 74 6f 20 2a 70 49 64 78 20 74 68 65 20 69 6e  nto *pIdx the in
ab30: 64 65 78 20 69 6e 74 6f 20 70 50 61 67 65 2d 3e  dex into pPage->
ab40: 61 44 61 74 61 5b 5d 0a 2a 2a 20 6f 66 20 74 68  aData[].** of th
ab50: 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 20  e first byte of 
ab60: 61 6c 6c 6f 63 61 74 65 64 20 73 70 61 63 65 2e  allocated space.
ab70: 20 52 65 74 75 72 6e 20 65 69 74 68 65 72 20 53   Return either S
ab80: 51 4c 49 54 45 5f 4f 4b 20 6f 72 0a 2a 2a 20 61  QLITE_OK or.** a
ab90: 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 28 75 73  n error code (us
aba0: 75 61 6c 6c 79 20 53 51 4c 49 54 45 5f 43 4f 52  ually SQLITE_COR
abb0: 52 55 50 54 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  RUPT)..**.** The
abc0: 20 63 61 6c 6c 65 72 20 67 75 61 72 61 6e 74 65   caller guarante
abd0: 65 73 20 74 68 61 74 20 74 68 65 72 65 20 69 73  es that there is
abe0: 20 73 75 66 66 69 63 69 65 6e 74 20 73 70 61 63   sufficient spac
abf0: 65 20 74 6f 20 6d 61 6b 65 20 74 68 65 0a 2a 2a  e to make the.**
ac00: 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 20 54 68   allocation.  Th
ac10: 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74  is routine might
ac20: 20 6e 65 65 64 20 74 6f 20 64 65 66 72 61 67 6d   need to defragm
ac30: 65 6e 74 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ent in order to 
ac40: 62 72 69 6e 67 0a 2a 2a 20 61 6c 6c 20 74 68 65  bring.** all the
ac50: 20 73 70 61 63 65 20 74 6f 67 65 74 68 65 72 2c   space together,
ac60: 20 68 6f 77 65 76 65 72 2e 20 20 54 68 69 73 20   however.  This 
ac70: 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 61 76 6f  routine will avo
ac80: 69 64 20 75 73 69 6e 67 0a 2a 2a 20 74 68 65 20  id using.** the 
ac90: 66 69 72 73 74 20 74 77 6f 20 62 79 74 65 73 20  first two bytes 
aca0: 70 61 73 74 20 74 68 65 20 63 65 6c 6c 20 70 6f  past the cell po
acb0: 69 6e 74 65 72 20 61 72 65 61 20 73 69 6e 63 65  inter area since
acc0: 20 70 72 65 73 75 6d 61 62 6c 79 20 74 68 69 73   presumably this
acd0: 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69  .** allocation i
ace0: 73 20 62 65 69 6e 67 20 6d 61 64 65 20 69 6e 20  s being made in 
acf0: 6f 72 64 65 72 20 74 6f 20 69 6e 73 65 72 74 20  order to insert 
ad00: 61 20 6e 65 77 20 63 65 6c 6c 2c 20 73 6f 20 77  a new cell, so w
ad10: 65 20 77 69 6c 6c 0a 2a 2a 20 61 6c 73 6f 20 65  e will.** also e
ad20: 6e 64 20 75 70 20 6e 65 65 64 69 6e 67 20 61 20  nd up needing a 
ad30: 6e 65 77 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  new cell pointer
ad40: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
ad50: 61 6c 6c 6f 63 61 74 65 53 70 61 63 65 28 4d 65  allocateSpace(Me
ad60: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e  mPage *pPage, in
ad70: 74 20 6e 42 79 74 65 2c 20 69 6e 74 20 2a 70 49  t nByte, int *pI
ad80: 64 78 29 7b 0a 20 20 63 6f 6e 73 74 20 69 6e 74  dx){.  const int
ad90: 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64   hdr = pPage->hd
ada0: 72 4f 66 66 73 65 74 3b 20 20 20 20 2f 2a 20 4c  rOffset;    /* L
adb0: 6f 63 61 6c 20 63 61 63 68 65 20 6f 66 20 70 50  ocal cache of pP
adc0: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 20 2a  age->hdrOffset *
add0: 2f 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 64  /.  u8 * const d
ade0: 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61  ata = pPage->aDa
adf0: 74 61 3b 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61  ta;      /* Loca
ae00: 6c 20 63 61 63 68 65 20 6f 66 20 70 50 61 67 65  l cache of pPage
ae10: 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20 69 6e 74  ->aData */.  int
ae20: 20 74 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20   top;           
ae30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ae40: 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20    /* First byte 
ae50: 6f 66 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  of cell content 
ae60: 61 72 65 61 20 2a 2f 0a 20 20 69 6e 74 20 72 63  area */.  int rc
ae70: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
ae80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
ae90: 2a 20 49 6e 74 65 67 65 72 20 72 65 74 75 72 6e  * Integer return
aea0: 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 67   code */.  int g
aeb0: 61 70 3b 20 20 20 20 20 20 20 20 2f 2a 20 46 69  ap;        /* Fi
aec0: 72 73 74 20 62 79 74 65 20 6f 66 20 67 61 70 20  rst byte of gap 
aed0: 62 65 74 77 65 65 6e 20 63 65 6c 6c 20 70 6f 69  between cell poi
aee0: 6e 74 65 72 73 20 61 6e 64 20 63 65 6c 6c 20 63  nters and cell c
aef0: 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 0a 20 20 61  ontent */.  .  a
af00: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
af10: 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
af20: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
af30: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
af40: 65 2d 3e 70 42 74 20 29 3b 0a 20 20 61 73 73 65  e->pBt );.  asse
af50: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
af60: 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
af70: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
af80: 73 73 65 72 74 28 20 6e 42 79 74 65 3e 3d 30 20  ssert( nByte>=0 
af90: 29 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63  );  /* Minimum c
afa0: 65 6c 6c 20 73 69 7a 65 20 69 73 20 34 20 2a 2f  ell size is 4 */
afb0: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
afc0: 2d 3e 6e 46 72 65 65 3e 3d 6e 42 79 74 65 20 29  ->nFree>=nByte )
afd0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
afe0: 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20  e->nOverflow==0 
aff0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 42 79  );.  assert( nBy
b000: 74 65 20 3c 20 28 69 6e 74 29 28 70 50 61 67 65  te < (int)(pPage
b010: 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
b020: 65 2d 38 29 20 29 3b 0a 0a 20 20 61 73 73 65 72  e-8) );..  asser
b030: 74 28 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66  t( pPage->cellOf
b040: 66 73 65 74 20 3d 3d 20 68 64 72 20 2b 20 31 32  fset == hdr + 12
b050: 20 2d 20 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66   - 4*pPage->leaf
b060: 20 29 3b 0a 20 20 67 61 70 20 3d 20 70 50 61 67   );.  gap = pPag
b070: 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20  e->cellOffset + 
b080: 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a  2*pPage->nCell;.
b090: 20 20 61 73 73 65 72 74 28 20 67 61 70 3c 3d 36    assert( gap<=6
b0a0: 35 35 33 36 20 29 3b 0a 20 20 2f 2a 20 45 56 49  5536 );.  /* EVI
b0b0: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 39 33 35  DENCE-OF: R-2935
b0c0: 36 2d 30 32 33 39 31 20 49 66 20 74 68 65 20 64  6-02391 If the d
b0d0: 61 74 61 62 61 73 65 20 75 73 65 73 20 61 20 36  atabase uses a 6
b0e0: 35 35 33 36 2d 62 79 74 65 20 70 61 67 65 20 73  5536-byte page s
b0f0: 69 7a 65 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65  ize.  ** and the
b100: 20 72 65 73 65 72 76 65 64 20 73 70 61 63 65 20   reserved space 
b110: 69 73 20 7a 65 72 6f 20 28 74 68 65 20 75 73 75  is zero (the usu
b120: 61 6c 20 76 61 6c 75 65 20 66 6f 72 20 72 65 73  al value for res
b130: 65 72 76 65 64 20 73 70 61 63 65 29 0a 20 20 2a  erved space).  *
b140: 2a 20 74 68 65 6e 20 74 68 65 20 63 65 6c 6c 20  * then the cell 
b150: 63 6f 6e 74 65 6e 74 20 6f 66 66 73 65 74 20 6f  content offset o
b160: 66 20 61 6e 20 65 6d 70 74 79 20 70 61 67 65 20  f an empty page 
b170: 77 61 6e 74 73 20 74 6f 20 62 65 20 36 35 35 33  wants to be 6553
b180: 36 2e 0a 20 20 2a 2a 20 48 6f 77 65 76 65 72 2c  6..  ** However,
b190: 20 74 68 61 74 20 69 6e 74 65 67 65 72 20 69 73   that integer is
b1a0: 20 74 6f 6f 20 6c 61 72 67 65 20 74 6f 20 62 65   too large to be
b1b0: 20 73 74 6f 72 65 64 20 69 6e 20 61 20 32 2d 62   stored in a 2-b
b1c0: 79 74 65 20 75 6e 73 69 67 6e 65 64 0a 20 20 2a  yte unsigned.  *
b1d0: 2a 20 69 6e 74 65 67 65 72 2c 20 73 6f 20 61 20  * integer, so a 
b1e0: 76 61 6c 75 65 20 6f 66 20 30 20 69 73 20 75 73  value of 0 is us
b1f0: 65 64 20 69 6e 20 69 74 73 20 70 6c 61 63 65 2e  ed in its place.
b200: 20 2a 2f 0a 20 20 74 6f 70 20 3d 20 67 65 74 32   */.  top = get2
b210: 62 79 74 65 4e 6f 74 5a 65 72 6f 28 26 64 61 74  byteNotZero(&dat
b220: 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 69 66 28  a[hdr+5]);.  if(
b230: 20 67 61 70 3e 74 6f 70 20 7c 7c 20 28 75 33 32   gap>top || (u32
b240: 29 74 6f 70 3e 70 50 61 67 65 2d 3e 70 42 74 2d  )top>pPage->pBt-
b250: 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 20 72 65  >usableSize ) re
b260: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
b270: 55 50 54 5f 42 4b 50 54 3b 0a 0a 20 20 2f 2a 20  UPT_BKPT;..  /* 
b280: 49 66 20 74 68 65 72 65 20 69 73 20 65 6e 6f 75  If there is enou
b290: 67 68 20 73 70 61 63 65 20 62 65 74 77 65 65 6e  gh space between
b2a0: 20 67 61 70 20 61 6e 64 20 74 6f 70 20 66 6f 72   gap and top for
b2b0: 20 6f 6e 65 20 6d 6f 72 65 20 63 65 6c 6c 20 70   one more cell p
b2c0: 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 61 72 72 61  ointer.  ** arra
b2d0: 79 20 65 6e 74 72 79 20 6f 66 66 73 65 74 2c 20  y entry offset, 
b2e0: 61 6e 64 20 69 66 20 74 68 65 20 66 72 65 65 6c  and if the freel
b2f0: 69 73 74 20 69 73 20 6e 6f 74 20 65 6d 70 74 79  ist is not empty
b300: 2c 20 74 68 65 6e 20 73 65 61 72 63 68 20 74 68  , then search th
b310: 65 0a 20 20 2a 2a 20 66 72 65 65 6c 69 73 74 20  e.  ** freelist 
b320: 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 20 66 72  looking for a fr
b330: 65 65 20 73 6c 6f 74 20 62 69 67 20 65 6e 6f 75  ee slot big enou
b340: 67 68 20 74 6f 20 73 61 74 69 73 66 79 20 74 68  gh to satisfy th
b350: 65 20 72 65 71 75 65 73 74 2e 0a 20 20 2a 2f 0a  e request..  */.
b360: 20 20 74 65 73 74 63 61 73 65 28 20 67 61 70 2b    testcase( gap+
b370: 32 3d 3d 74 6f 70 20 29 3b 0a 20 20 74 65 73 74  2==top );.  test
b380: 63 61 73 65 28 20 67 61 70 2b 31 3d 3d 74 6f 70  case( gap+1==top
b390: 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
b3a0: 67 61 70 3d 3d 74 6f 70 20 29 3b 0a 20 20 69 66  gap==top );.  if
b3b0: 28 20 67 61 70 2b 32 3c 3d 74 6f 70 20 26 26 20  ( gap+2<=top && 
b3c0: 28 64 61 74 61 5b 68 64 72 2b 31 5d 20 7c 7c 20  (data[hdr+1] || 
b3d0: 64 61 74 61 5b 68 64 72 2b 32 5d 29 20 29 7b 0a  data[hdr+2]) ){.
b3e0: 20 20 20 20 69 6e 74 20 62 44 65 66 72 61 67 20      int bDefrag 
b3f0: 3d 20 30 3b 0a 20 20 20 20 75 38 20 2a 70 53 70  = 0;.    u8 *pSp
b400: 61 63 65 20 3d 20 70 61 67 65 46 69 6e 64 53 6c  ace = pageFindSl
b410: 6f 74 28 70 50 61 67 65 2c 20 6e 42 79 74 65 2c  ot(pPage, nByte,
b420: 20 26 72 63 2c 20 26 62 44 65 66 72 61 67 29 3b   &rc, &bDefrag);
b430: 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
b440: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 69 66 28  turn rc;.    if(
b450: 20 62 44 65 66 72 61 67 20 29 20 67 6f 74 6f 20   bDefrag ) goto 
b460: 64 65 66 72 61 67 6d 65 6e 74 5f 70 61 67 65 3b  defragment_page;
b470: 0a 20 20 20 20 69 66 28 20 70 53 70 61 63 65 20  .    if( pSpace 
b480: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
b490: 20 70 53 70 61 63 65 3e 3d 64 61 74 61 20 26 26   pSpace>=data &&
b4a0: 20 28 70 53 70 61 63 65 20 2d 20 64 61 74 61 29   (pSpace - data)
b4b0: 3c 36 35 35 33 36 20 29 3b 0a 20 20 20 20 20 20  <65536 );.      
b4c0: 2a 70 49 64 78 20 3d 20 28 69 6e 74 29 28 70 53  *pIdx = (int)(pS
b4d0: 70 61 63 65 20 2d 20 64 61 74 61 29 3b 0a 20 20  pace - data);.  
b4e0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
b4f0: 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  E_OK;.    }.  }.
b500: 0a 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73  .  /* The reques
b510: 74 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 66  t could not be f
b520: 75 6c 66 69 6c 6c 65 64 20 75 73 69 6e 67 20 61  ulfilled using a
b530: 20 66 72 65 65 6c 69 73 74 20 73 6c 6f 74 2e 20   freelist slot. 
b540: 20 43 68 65 63 6b 0a 20 20 2a 2a 20 74 6f 20 73   Check.  ** to s
b550: 65 65 20 69 66 20 64 65 66 72 61 67 6d 65 6e 74  ee if defragment
b560: 61 74 69 6f 6e 20 69 73 20 6e 65 63 65 73 73 61  ation is necessa
b570: 72 79 2e 0a 20 20 2a 2f 0a 20 20 74 65 73 74 63  ry..  */.  testc
b580: 61 73 65 28 20 67 61 70 2b 32 2b 6e 42 79 74 65  ase( gap+2+nByte
b590: 3d 3d 74 6f 70 20 29 3b 0a 20 20 69 66 28 20 67  ==top );.  if( g
b5a0: 61 70 2b 32 2b 6e 42 79 74 65 3e 74 6f 70 20 29  ap+2+nByte>top )
b5b0: 7b 0a 20 64 65 66 72 61 67 6d 65 6e 74 5f 70 61  {. defragment_pa
b5c0: 67 65 3a 0a 20 20 20 20 61 73 73 65 72 74 28 20  ge:.    assert( 
b5d0: 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 7c  pPage->nCell>0 |
b5e0: 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a  | CORRUPT_DB );.
b5f0: 20 20 20 20 72 63 20 3d 20 64 65 66 72 61 67 6d      rc = defragm
b600: 65 6e 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a  entPage(pPage);.
b610: 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
b620: 75 72 6e 20 72 63 3b 0a 20 20 20 20 74 6f 70 20  urn rc;.    top 
b630: 3d 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65 72  = get2byteNotZer
b640: 6f 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b  o(&data[hdr+5]);
b650: 0a 20 20 20 20 61 73 73 65 72 74 28 20 67 61 70  .    assert( gap
b660: 2b 6e 42 79 74 65 3c 3d 74 6f 70 20 29 3b 0a 20  +nByte<=top );. 
b670: 20 7d 0a 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61   }...  /* Alloca
b680: 74 65 20 6d 65 6d 6f 72 79 20 66 72 6f 6d 20 74  te memory from t
b690: 68 65 20 67 61 70 20 69 6e 20 62 65 74 77 65 65  he gap in betwee
b6a0: 6e 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74  n the cell point
b6b0: 65 72 20 61 72 72 61 79 0a 20 20 2a 2a 20 61 6e  er array.  ** an
b6c0: 64 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  d the cell conte
b6d0: 6e 74 20 61 72 65 61 2e 20 20 54 68 65 20 62 74  nt area.  The bt
b6e0: 72 65 65 49 6e 69 74 50 61 67 65 28 29 20 63 61  reeInitPage() ca
b6f0: 6c 6c 20 68 61 73 20 61 6c 72 65 61 64 79 0a 20  ll has already. 
b700: 20 2a 2a 20 76 61 6c 69 64 61 74 65 64 20 74 68   ** validated th
b710: 65 20 66 72 65 65 6c 69 73 74 2e 20 20 47 69 76  e freelist.  Giv
b720: 65 6e 20 74 68 61 74 20 74 68 65 20 66 72 65 65  en that the free
b730: 6c 69 73 74 20 69 73 20 76 61 6c 69 64 2c 20 74  list is valid, t
b740: 68 65 72 65 0a 20 20 2a 2a 20 69 73 20 6e 6f 20  here.  ** is no 
b750: 77 61 79 20 74 68 61 74 20 74 68 65 20 61 6c 6c  way that the all
b760: 6f 63 61 74 69 6f 6e 20 63 61 6e 20 65 78 74 65  ocation can exte
b770: 6e 64 20 6f 66 66 20 74 68 65 20 65 6e 64 20 6f  nd off the end o
b780: 66 20 74 68 65 20 70 61 67 65 2e 0a 20 20 2a 2a  f the page..  **
b790: 20 54 68 65 20 61 73 73 65 72 74 28 29 20 62 65   The assert() be
b7a0: 6c 6f 77 20 76 65 72 69 66 69 65 73 20 74 68 65  low verifies the
b7b0: 20 70 72 65 76 69 6f 75 73 20 73 65 6e 74 65 6e   previous senten
b7c0: 63 65 2e 0a 20 20 2a 2f 0a 20 20 74 6f 70 20 2d  ce..  */.  top -
b7d0: 3d 20 6e 42 79 74 65 3b 0a 20 20 70 75 74 32 62  = nByte;.  put2b
b7e0: 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
b7f0: 2c 20 74 6f 70 29 3b 0a 20 20 61 73 73 65 72 74  , top);.  assert
b800: 28 20 74 6f 70 2b 6e 42 79 74 65 20 3c 3d 20 28  ( top+nByte <= (
b810: 69 6e 74 29 70 50 61 67 65 2d 3e 70 42 74 2d 3e  int)pPage->pBt->
b820: 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20  usableSize );.  
b830: 2a 70 49 64 78 20 3d 20 74 6f 70 3b 0a 20 20 72  *pIdx = top;.  r
b840: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
b850: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
b860: 20 61 20 73 65 63 74 69 6f 6e 20 6f 66 20 74 68   a section of th
b870: 65 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 74  e pPage->aData t
b880: 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 0a  o the freelist..
b890: 2a 2a 20 54 68 65 20 66 69 72 73 74 20 62 79 74  ** The first byt
b8a0: 65 20 6f 66 20 74 68 65 20 6e 65 77 20 66 72 65  e of the new fre
b8b0: 65 20 62 6c 6f 63 6b 20 69 73 20 70 50 61 67 65  e block is pPage
b8c0: 2d 3e 61 44 61 74 61 5b 69 53 74 61 72 74 5d 0a  ->aData[iStart].
b8d0: 2a 2a 20 61 6e 64 20 74 68 65 20 73 69 7a 65 20  ** and the size 
b8e0: 6f 66 20 74 68 65 20 62 6c 6f 63 6b 20 69 73 20  of the block is 
b8f0: 69 53 69 7a 65 20 62 79 74 65 73 2e 0a 2a 2a 0a  iSize bytes..**.
b900: 2a 2a 20 41 64 6a 61 63 65 6e 74 20 66 72 65 65  ** Adjacent free
b910: 62 6c 6f 63 6b 73 20 61 72 65 20 63 6f 61 6c 65  blocks are coale
b920: 73 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65  sced..**.** Note
b930: 20 74 68 61 74 20 65 76 65 6e 20 74 68 6f 75 67   that even thoug
b940: 68 20 74 68 65 20 66 72 65 65 62 6c 6f 63 6b 20  h the freeblock 
b950: 6c 69 73 74 20 77 61 73 20 63 68 65 63 6b 65 64  list was checked
b960: 20 62 79 20 62 74 72 65 65 49 6e 69 74 50 61 67   by btreeInitPag
b970: 65 28 29 2c 0a 2a 2a 20 74 68 61 74 20 72 6f 75  e(),.** that rou
b980: 74 69 6e 65 20 77 69 6c 6c 20 6e 6f 74 20 64 65  tine will not de
b990: 74 65 63 74 20 6f 76 65 72 6c 61 70 20 62 65 74  tect overlap bet
b9a0: 77 65 65 6e 20 63 65 6c 6c 73 20 6f 72 20 66 72  ween cells or fr
b9b0: 65 65 62 6c 6f 63 6b 73 2e 20 20 4e 6f 72 0a 2a  eeblocks.  Nor.*
b9c0: 2a 20 64 6f 65 73 20 69 74 20 64 65 74 65 63 74  * does it detect
b9d0: 20 63 65 6c 6c 73 20 6f 72 20 66 72 65 65 62 6c   cells or freebl
b9e0: 6f 63 6b 73 20 74 68 61 74 20 65 6e 63 72 6f 75  ocks that encrou
b9f0: 63 68 20 69 6e 74 6f 20 74 68 65 20 72 65 73 65  ch into the rese
ba00: 72 76 65 64 20 62 79 74 65 73 0a 2a 2a 20 61 74  rved bytes.** at
ba10: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
ba20: 70 61 67 65 2e 20 20 53 6f 20 64 6f 20 61 64 64  page.  So do add
ba30: 69 74 69 6f 6e 61 6c 20 63 6f 72 72 75 70 74 69  itional corrupti
ba40: 6f 6e 20 63 68 65 63 6b 73 20 69 6e 73 69 64 65  on checks inside
ba50: 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65   this.** routine
ba60: 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49   and return SQLI
ba70: 54 45 5f 43 4f 52 52 55 50 54 20 69 66 20 61 6e  TE_CORRUPT if an
ba80: 79 20 70 72 6f 62 6c 65 6d 73 20 61 72 65 20 66  y problems are f
ba90: 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ound..*/.static 
baa0: 69 6e 74 20 66 72 65 65 53 70 61 63 65 28 4d 65  int freeSpace(Me
bab0: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75 31  mPage *pPage, u1
bac0: 36 20 69 53 74 61 72 74 2c 20 75 31 36 20 69 53  6 iStart, u16 iS
bad0: 69 7a 65 29 7b 0a 20 20 75 31 36 20 69 50 74 72  ize){.  u16 iPtr
bae0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
baf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
bb00: 20 41 64 64 72 65 73 73 20 6f 66 20 70 74 72 20   Address of ptr 
bb10: 74 6f 20 6e 65 78 74 20 66 72 65 65 62 6c 6f 63  to next freebloc
bb20: 6b 20 2a 2f 0a 20 20 75 31 36 20 69 46 72 65 65  k */.  u16 iFree
bb30: 42 6c 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  Blk;            
bb40: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
bb50: 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 6e  Address of the n
bb60: 65 78 74 20 66 72 65 65 62 6c 6f 63 6b 20 2a 2f  ext freeblock */
bb70: 0a 20 20 75 38 20 68 64 72 3b 20 20 20 20 20 20  .  u8 hdr;      
bb80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bb90: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
bba0: 20 68 65 61 64 65 72 20 73 69 7a 65 2e 20 20 30   header size.  0
bbb0: 20 6f 72 20 31 30 30 20 2a 2f 0a 20 20 75 38 20   or 100 */.  u8 
bbc0: 6e 46 72 61 67 20 3d 20 30 3b 20 20 20 20 20 20  nFrag = 0;      
bbd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bbe0: 20 20 20 2f 2a 20 52 65 64 75 63 74 69 6f 6e 20     /* Reduction 
bbf0: 69 6e 20 66 72 61 67 6d 65 6e 74 61 74 69 6f 6e  in fragmentation
bc00: 20 2a 2f 0a 20 20 75 31 36 20 69 4f 72 69 67 53   */.  u16 iOrigS
bc10: 69 7a 65 20 3d 20 69 53 69 7a 65 3b 20 20 20 20  ize = iSize;    
bc20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
bc30: 72 69 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66  riginal value of
bc40: 20 69 53 69 7a 65 20 2a 2f 0a 20 20 75 33 32 20   iSize */.  u32 
bc50: 69 4c 61 73 74 20 3d 20 70 50 61 67 65 2d 3e 70  iLast = pPage->p
bc60: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34  Bt->usableSize-4
bc70: 3b 20 2f 2a 20 4c 61 72 67 65 73 74 20 70 6f 73  ; /* Largest pos
bc80: 73 69 62 6c 65 20 66 72 65 65 62 6c 6f 63 6b 20  sible freeblock 
bc90: 6f 66 66 73 65 74 20 2a 2f 0a 20 20 75 33 32 20  offset */.  u32 
bca0: 69 45 6e 64 20 3d 20 69 53 74 61 72 74 20 2b 20  iEnd = iStart + 
bcb0: 69 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  iSize;          
bcc0: 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20    /* First byte 
bcd0: 70 61 73 74 20 74 68 65 20 69 53 74 61 72 74 20  past the iStart 
bce0: 62 75 66 66 65 72 20 2a 2f 0a 20 20 75 6e 73 69  buffer */.  unsi
bcf0: 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61 20  gned char *data 
bd00: 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 20  = pPage->aData; 
bd10: 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 65 6e    /* Page conten
bd20: 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  t */..  assert( 
bd30: 70 50 61 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b  pPage->pBt!=0 );
bd40: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
bd50: 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
bd60: 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
bd70: 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  e) );.  assert( 
bd80: 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20 69 53  CORRUPT_DB || iS
bd90: 74 61 72 74 3e 3d 70 50 61 67 65 2d 3e 68 64 72  tart>=pPage->hdr
bda0: 4f 66 66 73 65 74 2b 36 2b 70 50 61 67 65 2d 3e  Offset+6+pPage->
bdb0: 63 68 69 6c 64 50 74 72 53 69 7a 65 20 29 3b 0a  childPtrSize );.
bdc0: 20 20 61 73 73 65 72 74 28 20 43 4f 52 52 55 50    assert( CORRUP
bdd0: 54 5f 44 42 20 7c 7c 20 69 45 6e 64 20 3c 3d 20  T_DB || iEnd <= 
bde0: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
bdf0: 6c 65 53 69 7a 65 20 29 3b 0a 20 20 61 73 73 65  leSize );.  asse
be00: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
be10: 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
be20: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
be30: 73 73 65 72 74 28 20 69 53 69 7a 65 3e 3d 34 20  ssert( iSize>=4 
be40: 29 3b 20 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20  );   /* Minimum 
be50: 63 65 6c 6c 20 73 69 7a 65 20 69 73 20 34 20 2a  cell size is 4 *
be60: 2f 0a 20 20 61 73 73 65 72 74 28 20 69 53 74 61  /.  assert( iSta
be70: 72 74 3c 3d 69 4c 61 73 74 20 29 3b 0a 0a 20 20  rt<=iLast );..  
be80: 2f 2a 20 4f 76 65 72 77 72 69 74 65 20 64 65 6c  /* Overwrite del
be90: 65 74 65 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  eted information
bea0: 20 77 69 74 68 20 7a 65 72 6f 73 20 77 68 65 6e   with zeros when
beb0: 20 74 68 65 20 73 65 63 75 72 65 5f 64 65 6c 65   the secure_dele
bec0: 74 65 0a 20 20 2a 2a 20 6f 70 74 69 6f 6e 20 69  te.  ** option i
bed0: 73 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 20 20 69  s enabled */.  i
bee0: 66 28 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 62  f( pPage->pBt->b
bef0: 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 53 45  tsFlags & BTS_SE
bf00: 43 55 52 45 5f 44 45 4c 45 54 45 20 29 7b 0a 20  CURE_DELETE ){. 
bf10: 20 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b     memset(&data[
bf20: 69 53 74 61 72 74 5d 2c 20 30 2c 20 69 53 69 7a  iStart], 0, iSiz
bf30: 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68  e);.  }..  /* Th
bf40: 65 20 6c 69 73 74 20 6f 66 20 66 72 65 65 62 6c  e list of freebl
bf50: 6f 63 6b 73 20 6d 75 73 74 20 62 65 20 69 6e 20  ocks must be in 
bf60: 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e  ascending order.
bf70: 20 20 46 69 6e 64 20 74 68 65 20 0a 20 20 2a 2a    Find the .  **
bf80: 20 73 70 6f 74 20 6f 6e 20 74 68 65 20 6c 69 73   spot on the lis
bf90: 74 20 77 68 65 72 65 20 69 53 74 61 72 74 20 73  t where iStart s
bfa0: 68 6f 75 6c 64 20 62 65 20 69 6e 73 65 72 74 65  hould be inserte
bfb0: 64 2e 0a 20 20 2a 2f 0a 20 20 68 64 72 20 3d 20  d..  */.  hdr = 
bfc0: 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
bfd0: 3b 0a 20 20 69 50 74 72 20 3d 20 68 64 72 20 2b  ;.  iPtr = hdr +
bfe0: 20 31 3b 0a 20 20 69 66 28 20 64 61 74 61 5b 69   1;.  if( data[i
bff0: 50 74 72 2b 31 5d 3d 3d 30 20 26 26 20 64 61 74  Ptr+1]==0 && dat
c000: 61 5b 69 50 74 72 5d 3d 3d 30 20 29 7b 0a 20 20  a[iPtr]==0 ){.  
c010: 20 20 69 46 72 65 65 42 6c 6b 20 3d 20 30 3b 20    iFreeBlk = 0; 
c020: 20 2f 2a 20 53 68 6f 72 74 63 75 74 20 66 6f 72   /* Shortcut for
c030: 20 74 68 65 20 63 61 73 65 20 77 68 65 6e 20 74   the case when t
c040: 68 65 20 66 72 65 65 6c 69 73 74 20 69 73 20 65  he freelist is e
c050: 6d 70 74 79 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b  mpty */.  }else{
c060: 0a 20 20 20 20 77 68 69 6c 65 28 20 28 69 46 72  .    while( (iFr
c070: 65 65 42 6c 6b 20 3d 20 67 65 74 32 62 79 74 65  eeBlk = get2byte
c080: 28 26 64 61 74 61 5b 69 50 74 72 5d 29 29 3e 30  (&data[iPtr]))>0
c090: 20 26 26 20 69 46 72 65 65 42 6c 6b 3c 69 53 74   && iFreeBlk<iSt
c0a0: 61 72 74 20 29 7b 0a 20 20 20 20 20 20 69 66 28  art ){.      if(
c0b0: 20 69 46 72 65 65 42 6c 6b 3c 69 50 74 72 2b 34   iFreeBlk<iPtr+4
c0c0: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
c0d0: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
c0e0: 20 20 20 20 20 69 50 74 72 20 3d 20 69 46 72 65       iPtr = iFre
c0f0: 65 42 6c 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  eBlk;.    }.    
c100: 69 66 28 20 69 46 72 65 65 42 6c 6b 3e 69 4c 61  if( iFreeBlk>iLa
c110: 73 74 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  st ) return SQLI
c120: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
c130: 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 46 72  .    assert( iFr
c140: 65 65 42 6c 6b 3e 69 50 74 72 20 7c 7c 20 69 46  eeBlk>iPtr || iF
c150: 72 65 65 42 6c 6b 3d 3d 30 20 29 3b 0a 20 20 0a  reeBlk==0 );.  .
c160: 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70      /* At this p
c170: 6f 69 6e 74 3a 0a 20 20 20 20 2a 2a 20 20 20 20  oint:.    **    
c180: 69 46 72 65 65 42 6c 6b 3a 20 20 20 46 69 72 73  iFreeBlk:   Firs
c190: 74 20 66 72 65 65 62 6c 6f 63 6b 20 61 66 74 65  t freeblock afte
c1a0: 72 20 69 53 74 61 72 74 2c 20 6f 72 20 7a 65 72  r iStart, or zer
c1b0: 6f 20 69 66 20 6e 6f 6e 65 0a 20 20 20 20 2a 2a  o if none.    **
c1c0: 20 20 20 20 69 50 74 72 3a 20 20 20 20 20 20 20      iPtr:       
c1d0: 54 68 65 20 61 64 64 72 65 73 73 20 6f 66 20 61  The address of a
c1e0: 20 70 6f 69 6e 74 65 72 20 69 46 72 65 65 42 6c   pointer iFreeBl
c1f0: 6b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  k.    **.    ** 
c200: 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
c210: 69 46 72 65 65 42 6c 6b 20 73 68 6f 75 6c 64 20  iFreeBlk should 
c220: 62 65 20 63 6f 61 6c 65 73 63 65 64 20 6f 6e 74  be coalesced ont
c230: 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 69 53 74  o the end of iSt
c240: 61 72 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  art..    */.    
c250: 69 66 28 20 69 46 72 65 65 42 6c 6b 20 26 26 20  if( iFreeBlk && 
c260: 69 45 6e 64 2b 33 3e 3d 69 46 72 65 65 42 6c 6b  iEnd+3>=iFreeBlk
c270: 20 29 7b 0a 20 20 20 20 20 20 6e 46 72 61 67 20   ){.      nFrag 
c280: 3d 20 69 46 72 65 65 42 6c 6b 20 2d 20 69 45 6e  = iFreeBlk - iEn
c290: 64 3b 0a 20 20 20 20 20 20 69 66 28 20 69 45 6e  d;.      if( iEn
c2a0: 64 3e 69 46 72 65 65 42 6c 6b 20 29 20 72 65 74  d>iFreeBlk ) ret
c2b0: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
c2c0: 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 69  PT_BKPT;.      i
c2d0: 45 6e 64 20 3d 20 69 46 72 65 65 42 6c 6b 20 2b  End = iFreeBlk +
c2e0: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
c2f0: 69 46 72 65 65 42 6c 6b 2b 32 5d 29 3b 0a 20 20  iFreeBlk+2]);.  
c300: 20 20 20 20 69 53 69 7a 65 20 3d 20 69 45 6e 64      iSize = iEnd
c310: 20 2d 20 69 53 74 61 72 74 3b 0a 20 20 20 20 20   - iStart;.     
c320: 20 69 46 72 65 65 42 6c 6b 20 3d 20 67 65 74 32   iFreeBlk = get2
c330: 62 79 74 65 28 26 64 61 74 61 5b 69 46 72 65 65  byte(&data[iFree
c340: 42 6c 6b 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 0a  Blk]);.    }.  .
c350: 20 20 20 20 2f 2a 20 49 66 20 69 50 74 72 20 69      /* If iPtr i
c360: 73 20 61 6e 6f 74 68 65 72 20 66 72 65 65 62 6c  s another freebl
c370: 6f 63 6b 20 28 74 68 61 74 20 69 73 2c 20 69 66  ock (that is, if
c380: 20 69 50 74 72 20 69 73 20 6e 6f 74 20 74 68 65   iPtr is not the
c390: 20 66 72 65 65 6c 69 73 74 0a 20 20 20 20 2a 2a   freelist.    **
c3a0: 20 70 6f 69 6e 74 65 72 20 69 6e 20 74 68 65 20   pointer in the 
c3b0: 70 61 67 65 20 68 65 61 64 65 72 29 20 74 68 65  page header) the
c3c0: 6e 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20 69  n check to see i
c3d0: 66 20 69 53 74 61 72 74 20 73 68 6f 75 6c 64 20  f iStart should 
c3e0: 62 65 0a 20 20 20 20 2a 2a 20 63 6f 61 6c 65 73  be.    ** coales
c3f0: 63 65 64 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64  ced onto the end
c400: 20 6f 66 20 69 50 74 72 2e 0a 20 20 20 20 2a 2f   of iPtr..    */
c410: 0a 20 20 20 20 69 66 28 20 69 50 74 72 3e 68 64  .    if( iPtr>hd
c420: 72 2b 31 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  r+1 ){.      int
c430: 20 69 50 74 72 45 6e 64 20 3d 20 69 50 74 72 20   iPtrEnd = iPtr 
c440: 2b 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  + get2byte(&data
c450: 5b 69 50 74 72 2b 32 5d 29 3b 0a 20 20 20 20 20  [iPtr+2]);.     
c460: 20 69 66 28 20 69 50 74 72 45 6e 64 2b 33 3e 3d   if( iPtrEnd+3>=
c470: 69 53 74 61 72 74 20 29 7b 0a 20 20 20 20 20 20  iStart ){.      
c480: 20 20 69 66 28 20 69 50 74 72 45 6e 64 3e 69 53    if( iPtrEnd>iS
c490: 74 61 72 74 20 29 20 72 65 74 75 72 6e 20 53 51  tart ) return SQ
c4a0: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
c4b0: 54 3b 0a 20 20 20 20 20 20 20 20 6e 46 72 61 67  T;.        nFrag
c4c0: 20 2b 3d 20 69 53 74 61 72 74 20 2d 20 69 50 74   += iStart - iPt
c4d0: 72 45 6e 64 3b 0a 20 20 20 20 20 20 20 20 69 53  rEnd;.        iS
c4e0: 69 7a 65 20 3d 20 69 45 6e 64 20 2d 20 69 50 74  ize = iEnd - iPt
c4f0: 72 3b 0a 20 20 20 20 20 20 20 20 69 53 74 61 72  r;.        iStar
c500: 74 20 3d 20 69 50 74 72 3b 0a 20 20 20 20 20 20  t = iPtr;.      
c510: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
c520: 6e 46 72 61 67 3e 64 61 74 61 5b 68 64 72 2b 37  nFrag>data[hdr+7
c530: 5d 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ] ) return SQLIT
c540: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
c550: 20 20 20 20 64 61 74 61 5b 68 64 72 2b 37 5d 20      data[hdr+7] 
c560: 2d 3d 20 6e 46 72 61 67 3b 0a 20 20 7d 0a 20 20  -= nFrag;.  }.  
c570: 69 66 28 20 69 53 74 61 72 74 3d 3d 67 65 74 32  if( iStart==get2
c580: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
c590: 5d 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  ]) ){.    /* The
c5a0: 20 6e 65 77 20 66 72 65 65 62 6c 6f 63 6b 20 69   new freeblock i
c5b0: 73 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69  s at the beginni
c5c0: 6e 67 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 63  ng of the cell c
c5d0: 6f 6e 74 65 6e 74 20 61 72 65 61 2c 0a 20 20 20  ontent area,.   
c5e0: 20 2a 2a 20 73 6f 20 6a 75 73 74 20 65 78 74 65   ** so just exte
c5f0: 6e 64 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  nd the cell cont
c600: 65 6e 74 20 61 72 65 61 20 72 61 74 68 65 72 20  ent area rather 
c610: 74 68 61 6e 20 63 72 65 61 74 65 20 61 6e 6f 74  than create anot
c620: 68 65 72 0a 20 20 20 20 2a 2a 20 66 72 65 65 6c  her.    ** freel
c630: 69 73 74 20 65 6e 74 72 79 20 2a 2f 0a 20 20 20  ist entry */.   
c640: 20 69 66 28 20 69 50 74 72 21 3d 68 64 72 2b 31   if( iPtr!=hdr+1
c650: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
c660: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
c670: 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74     put2byte(&dat
c680: 61 5b 68 64 72 2b 31 5d 2c 20 69 46 72 65 65 42  a[hdr+1], iFreeB
c690: 6c 6b 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74  lk);.    put2byt
c6a0: 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20  e(&data[hdr+5], 
c6b0: 69 45 6e 64 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  iEnd);.  }else{.
c6c0: 20 20 20 20 2f 2a 20 49 6e 73 65 72 74 20 74 68      /* Insert th
c6d0: 65 20 6e 65 77 20 66 72 65 65 62 6c 6f 63 6b 20  e new freeblock 
c6e0: 69 6e 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73  into the freelis
c6f0: 74 20 2a 2f 0a 20 20 20 20 70 75 74 32 62 79 74  t */.    put2byt
c700: 65 28 26 64 61 74 61 5b 69 50 74 72 5d 2c 20 69  e(&data[iPtr], i
c710: 53 74 61 72 74 29 3b 0a 20 20 20 20 70 75 74 32  Start);.    put2
c720: 62 79 74 65 28 26 64 61 74 61 5b 69 53 74 61 72  byte(&data[iStar
c730: 74 5d 2c 20 69 46 72 65 65 42 6c 6b 29 3b 0a 20  t], iFreeBlk);. 
c740: 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74     put2byte(&dat
c750: 61 5b 69 53 74 61 72 74 2b 32 5d 2c 20 69 53 69  a[iStart+2], iSi
c760: 7a 65 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  ze);.  }.  pPage
c770: 2d 3e 6e 46 72 65 65 20 2b 3d 20 69 4f 72 69 67  ->nFree += iOrig
c780: 53 69 7a 65 3b 0a 20 20 72 65 74 75 72 6e 20 53  Size;.  return S
c790: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
c7a0: 2a 2a 20 44 65 63 6f 64 65 20 74 68 65 20 66 6c  ** Decode the fl
c7b0: 61 67 73 20 62 79 74 65 20 28 74 68 65 20 66 69  ags byte (the fi
c7c0: 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20  rst byte of the 
c7d0: 68 65 61 64 65 72 29 20 66 6f 72 20 61 20 70 61  header) for a pa
c7e0: 67 65 0a 2a 2a 20 61 6e 64 20 69 6e 69 74 69 61  ge.** and initia
c7f0: 6c 69 7a 65 20 66 69 65 6c 64 73 20 6f 66 20 74  lize fields of t
c800: 68 65 20 4d 65 6d 50 61 67 65 20 73 74 72 75 63  he MemPage struc
c810: 74 75 72 65 20 61 63 63 6f 72 64 69 6e 67 6c 79  ture accordingly
c820: 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 74 68 65  ..**.** Only the
c830: 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6d 62 69   following combi
c840: 6e 61 74 69 6f 6e 73 20 61 72 65 20 73 75 70 70  nations are supp
c850: 6f 72 74 65 64 2e 20 20 41 6e 79 74 68 69 6e 67  orted.  Anything
c860: 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 69 6e   different.** in
c870: 64 69 63 61 74 65 73 20 61 20 63 6f 72 72 75 70  dicates a corrup
c880: 74 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73  t database files
c890: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20  :.**.**         
c8a0: 50 54 46 5f 5a 45 52 4f 44 41 54 41 0a 2a 2a 20  PTF_ZERODATA.** 
c8b0: 20 20 20 20 20 20 20 20 50 54 46 5f 5a 45 52 4f          PTF_ZERO
c8c0: 44 41 54 41 20 7c 20 50 54 46 5f 4c 45 41 46 0a  DATA | PTF_LEAF.
c8d0: 2a 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f 4c  **         PTF_L
c8e0: 45 41 46 44 41 54 41 20 7c 20 50 54 46 5f 49 4e  EAFDATA | PTF_IN
c8f0: 54 4b 45 59 0a 2a 2a 20 20 20 20 20 20 20 20 20  TKEY.**         
c900: 50 54 46 5f 4c 45 41 46 44 41 54 41 20 7c 20 50  PTF_LEAFDATA | P
c910: 54 46 5f 49 4e 54 4b 45 59 20 7c 20 50 54 46 5f  TF_INTKEY | PTF_
c920: 4c 45 41 46 0a 2a 2f 0a 73 74 61 74 69 63 20 69  LEAF.*/.static i
c930: 6e 74 20 64 65 63 6f 64 65 46 6c 61 67 73 28 4d  nt decodeFlags(M
c940: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69  emPage *pPage, i
c950: 6e 74 20 66 6c 61 67 42 79 74 65 29 7b 0a 20 20  nt flagByte){.  
c960: 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20 20  BtShared *pBt;  
c970: 20 20 20 2f 2a 20 41 20 63 6f 70 79 20 6f 66 20     /* A copy of 
c980: 70 50 61 67 65 2d 3e 70 42 74 20 2a 2f 0a 0a 20  pPage->pBt */.. 
c990: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
c9a0: 68 64 72 4f 66 66 73 65 74 3d 3d 28 70 50 61 67  hdrOffset==(pPag
c9b0: 65 2d 3e 70 67 6e 6f 3d 3d 31 20 3f 20 31 30 30  e->pgno==1 ? 100
c9c0: 20 3a 20 30 29 20 29 3b 0a 20 20 61 73 73 65 72   : 0) );.  asser
c9d0: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
c9e0: 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
c9f0: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70 50  ->mutex) );.  pP
ca00: 61 67 65 2d 3e 6c 65 61 66 20 3d 20 28 75 38 29  age->leaf = (u8)
ca10: 28 66 6c 61 67 42 79 74 65 3e 3e 33 29 3b 20 20  (flagByte>>3);  
ca20: 61 73 73 65 72 74 28 20 50 54 46 5f 4c 45 41 46  assert( PTF_LEAF
ca30: 20 3d 3d 20 31 3c 3c 33 20 29 3b 0a 20 20 66 6c   == 1<<3 );.  fl
ca40: 61 67 42 79 74 65 20 26 3d 20 7e 50 54 46 5f 4c  agByte &= ~PTF_L
ca50: 45 41 46 3b 0a 20 20 70 50 61 67 65 2d 3e 63 68  EAF;.  pPage->ch
ca60: 69 6c 64 50 74 72 53 69 7a 65 20 3d 20 34 2d 34  ildPtrSize = 4-4
ca70: 2a 70 50 61 67 65 2d 3e 6c 65 61 66 3b 0a 20 20  *pPage->leaf;.  
ca80: 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74  pBt = pPage->pBt
ca90: 3b 0a 20 20 69 66 28 20 66 6c 61 67 42 79 74 65  ;.  if( flagByte
caa0: 3d 3d 28 50 54 46 5f 4c 45 41 46 44 41 54 41 20  ==(PTF_LEAFDATA 
cab0: 7c 20 50 54 46 5f 49 4e 54 4b 45 59 29 20 29 7b  | PTF_INTKEY) ){
cac0: 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45  .    /* EVIDENCE
cad0: 2d 4f 46 3a 20 52 2d 30 33 36 34 30 2d 31 33 34  -OF: R-03640-134
cae0: 31 35 20 41 20 76 61 6c 75 65 20 6f 66 20 35 20  15 A value of 5 
caf0: 6d 65 61 6e 73 20 74 68 65 20 70 61 67 65 20 69  means the page i
cb00: 73 20 61 6e 20 69 6e 74 65 72 69 6f 72 0a 20 20  s an interior.  
cb10: 20 20 2a 2a 20 74 61 62 6c 65 20 62 2d 74 72 65    ** table b-tre
cb20: 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 61  e page. */.    a
cb30: 73 73 65 72 74 28 20 28 50 54 46 5f 4c 45 41 46  ssert( (PTF_LEAF
cb40: 44 41 54 41 7c 50 54 46 5f 49 4e 54 4b 45 59 29  DATA|PTF_INTKEY)
cb50: 3d 3d 35 20 29 3b 0a 20 20 20 20 2f 2a 20 45 56  ==5 );.    /* EV
cb60: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 30 35  IDENCE-OF: R-205
cb70: 30 31 2d 36 31 37 39 36 20 41 20 76 61 6c 75 65  01-61796 A value
cb80: 20 6f 66 20 31 33 20 6d 65 61 6e 73 20 74 68 65   of 13 means the
cb90: 20 70 61 67 65 20 69 73 20 61 20 6c 65 61 66 0a   page is a leaf.
cba0: 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 62 2d 74      ** table b-t
cbb0: 72 65 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20  ree page. */.   
cbc0: 20 61 73 73 65 72 74 28 20 28 50 54 46 5f 4c 45   assert( (PTF_LE
cbd0: 41 46 44 41 54 41 7c 50 54 46 5f 49 4e 54 4b 45  AFDATA|PTF_INTKE
cbe0: 59 7c 50 54 46 5f 4c 45 41 46 29 3d 3d 31 33 20  Y|PTF_LEAF)==13 
cbf0: 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 6e  );.    pPage->in
cc00: 74 4b 65 79 20 3d 20 31 3b 0a 20 20 20 20 70 50  tKey = 1;.    pP
cc10: 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20  age->intKeyLeaf 
cc20: 3d 20 70 50 61 67 65 2d 3e 6c 65 61 66 3b 0a 20  = pPage->leaf;. 
cc30: 20 20 20 70 50 61 67 65 2d 3e 6e 6f 50 61 79 6c     pPage->noPayl
cc40: 6f 61 64 20 3d 20 21 70 50 61 67 65 2d 3e 6c 65  oad = !pPage->le
cc50: 61 66 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d  af;.    pPage->m
cc60: 61 78 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d  axLocal = pBt->m
cc70: 61 78 4c 65 61 66 3b 0a 20 20 20 20 70 50 61 67  axLeaf;.    pPag
cc80: 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 42  e->minLocal = pB
cc90: 74 2d 3e 6d 69 6e 4c 65 61 66 3b 0a 20 20 7d 65  t->minLeaf;.  }e
cca0: 6c 73 65 20 69 66 28 20 66 6c 61 67 42 79 74 65  lse if( flagByte
ccb0: 3d 3d 50 54 46 5f 5a 45 52 4f 44 41 54 41 20 29  ==PTF_ZERODATA )
ccc0: 7b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43  {.    /* EVIDENC
ccd0: 45 2d 4f 46 3a 20 52 2d 32 37 32 32 35 2d 35 33  E-OF: R-27225-53
cce0: 39 33 36 20 41 20 76 61 6c 75 65 20 6f 66 20 32  936 A value of 2
ccf0: 20 6d 65 61 6e 73 20 74 68 65 20 70 61 67 65 20   means the page 
cd00: 69 73 20 61 6e 20 69 6e 74 65 72 69 6f 72 0a 20  is an interior. 
cd10: 20 20 20 2a 2a 20 69 6e 64 65 78 20 62 2d 74 72     ** index b-tr
cd20: 65 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20  ee page. */.    
cd30: 61 73 73 65 72 74 28 20 28 50 54 46 5f 5a 45 52  assert( (PTF_ZER
cd40: 4f 44 41 54 41 29 3d 3d 32 20 29 3b 0a 20 20 20  ODATA)==2 );.   
cd50: 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
cd60: 20 52 2d 31 36 35 37 31 2d 31 31 36 31 35 20 41   R-16571-11615 A
cd70: 20 76 61 6c 75 65 20 6f 66 20 31 30 20 6d 65 61   value of 10 mea
cd80: 6e 73 20 74 68 65 20 70 61 67 65 20 69 73 20 61  ns the page is a
cd90: 20 6c 65 61 66 0a 20 20 20 20 2a 2a 20 69 6e 64   leaf.    ** ind
cda0: 65 78 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20  ex b-tree page. 
cdb0: 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  */.    assert( (
cdc0: 50 54 46 5f 5a 45 52 4f 44 41 54 41 7c 50 54 46  PTF_ZERODATA|PTF
cdd0: 5f 4c 45 41 46 29 3d 3d 31 30 20 29 3b 0a 20 20  _LEAF)==10 );.  
cde0: 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20    pPage->intKey 
cdf0: 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  = 0;.    pPage->
ce00: 69 6e 74 4b 65 79 4c 65 61 66 20 3d 20 30 3b 0a  intKeyLeaf = 0;.
ce10: 20 20 20 20 70 50 61 67 65 2d 3e 6e 6f 50 61 79      pPage->noPay
ce20: 6c 6f 61 64 20 3d 20 30 3b 0a 20 20 20 20 70 50  load = 0;.    pP
ce30: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20  age->maxLocal = 
ce40: 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20  pBt->maxLocal;. 
ce50: 20 20 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63     pPage->minLoc
ce60: 61 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e 4c 6f 63  al = pBt->minLoc
ce70: 61 6c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  al;.  }else{.   
ce80: 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
ce90: 20 52 2d 34 37 36 30 38 2d 35 36 34 36 39 20 41   R-47608-56469 A
cea0: 6e 79 20 6f 74 68 65 72 20 76 61 6c 75 65 20 66  ny other value f
ceb0: 6f 72 20 74 68 65 20 62 2d 74 72 65 65 20 70 61  or the b-tree pa
cec0: 67 65 20 74 79 70 65 20 69 73 0a 20 20 20 20 2a  ge type is.    *
ced0: 2a 20 61 6e 20 65 72 72 6f 72 2e 20 2a 2f 0a 20  * an error. */. 
cee0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
cef0: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
cf00: 20 7d 0a 20 20 70 50 61 67 65 2d 3e 6d 61 78 31   }.  pPage->max1
cf10: 62 79 74 65 50 61 79 6c 6f 61 64 20 3d 20 70 42  bytePayload = pB
cf20: 74 2d 3e 6d 61 78 31 62 79 74 65 50 61 79 6c 6f  t->max1bytePaylo
cf30: 61 64 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ad;.  return SQL
cf40: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
cf50: 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
cf60: 61 75 78 69 6c 69 61 72 79 20 69 6e 66 6f 72 6d  auxiliary inform
cf70: 61 74 69 6f 6e 20 66 6f 72 20 61 20 64 69 73 6b  ation for a disk
cf80: 20 62 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 52 65   block..**.** Re
cf90: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
cfa0: 6e 20 73 75 63 63 65 73 73 2e 20 20 49 66 20 77  n success.  If w
cfb0: 65 20 73 65 65 20 74 68 61 74 20 74 68 65 20 70  e see that the p
cfc0: 61 67 65 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20  age does.** not 
cfd0: 63 6f 6e 74 61 69 6e 20 61 20 77 65 6c 6c 2d 66  contain a well-f
cfe0: 6f 72 6d 65 64 20 64 61 74 61 62 61 73 65 20 70  ormed database p
cff0: 61 67 65 2c 20 74 68 65 6e 20 72 65 74 75 72 6e  age, then return
d000: 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 52 52   .** SQLITE_CORR
d010: 55 50 54 2e 20 20 4e 6f 74 65 20 74 68 61 74 20  UPT.  Note that 
d020: 61 20 72 65 74 75 72 6e 20 6f 66 20 53 51 4c 49  a return of SQLI
d030: 54 45 5f 4f 4b 20 64 6f 65 73 20 6e 6f 74 0a 2a  TE_OK does not.*
d040: 2a 20 67 75 61 72 61 6e 74 65 65 20 74 68 61 74  * guarantee that
d050: 20 74 68 65 20 70 61 67 65 20 69 73 20 77 65 6c   the page is wel
d060: 6c 2d 66 6f 72 6d 65 64 2e 20 20 49 74 20 6f 6e  l-formed.  It on
d070: 6c 79 20 73 68 6f 77 73 20 74 68 61 74 0a 2a 2a  ly shows that.**
d080: 20 77 65 20 66 61 69 6c 65 64 20 74 6f 20 64 65   we failed to de
d090: 74 65 63 74 20 61 6e 79 20 63 6f 72 72 75 70 74  tect any corrupt
d0a0: 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ion..*/.static i
d0b0: 6e 74 20 62 74 72 65 65 49 6e 69 74 50 61 67 65  nt btreeInitPage
d0c0: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29  (MemPage *pPage)
d0d0: 7b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  {..  assert( pPa
d0e0: 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20  ge->pBt!=0 );.  
d0f0: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70  assert( pPage->p
d100: 42 74 2d 3e 64 62 21 3d 30 20 29 3b 0a 20 20 61  Bt->db!=0 );.  a
d110: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
d120: 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
d130: 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
d140: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
d150: 3e 70 67 6e 6f 3d 3d 73 71 6c 69 74 65 33 50 61  >pgno==sqlite3Pa
d160: 67 65 72 50 61 67 65 6e 75 6d 62 65 72 28 70 50  gerPagenumber(pP
d170: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
d180: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
d190: 20 3d 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72   == sqlite3Pager
d1a0: 47 65 74 45 78 74 72 61 28 70 50 61 67 65 2d 3e  GetExtra(pPage->
d1b0: 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73  pDbPage) );.  as
d1c0: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 61 44 61  sert( pPage->aDa
d1d0: 74 61 20 3d 3d 20 73 71 6c 69 74 65 33 50 61 67  ta == sqlite3Pag
d1e0: 65 72 47 65 74 44 61 74 61 28 70 50 61 67 65 2d  erGetData(pPage-
d1f0: 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20  >pDbPage) );..  
d200: 69 66 28 20 21 70 50 61 67 65 2d 3e 69 73 49 6e  if( !pPage->isIn
d210: 69 74 20 29 7b 0a 20 20 20 20 75 31 36 20 70 63  it ){.    u16 pc
d220: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
d230: 41 64 64 72 65 73 73 20 6f 66 20 61 20 66 72 65  Address of a fre
d240: 65 62 6c 6f 63 6b 20 77 69 74 68 69 6e 20 70 50  eblock within pP
d250: 61 67 65 2d 3e 61 44 61 74 61 5b 5d 20 2a 2f 0a  age->aData[] */.
d260: 20 20 20 20 75 38 20 68 64 72 3b 20 20 20 20 20      u8 hdr;     
d270: 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
d280: 20 74 6f 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66   to beginning of
d290: 20 70 61 67 65 20 68 65 61 64 65 72 20 2a 2f 0a   page header */.
d2a0: 20 20 20 20 75 38 20 2a 64 61 74 61 3b 20 20 20      u8 *data;   
d2b0: 20 20 20 20 20 20 20 2f 2a 20 45 71 75 61 6c 20         /* Equal 
d2c0: 74 6f 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20  to pPage->aData 
d2d0: 2a 2f 0a 20 20 20 20 42 74 53 68 61 72 65 64 20  */.    BtShared 
d2e0: 2a 70 42 74 3b 20 20 20 20 20 20 20 20 2f 2a 20  *pBt;        /* 
d2f0: 54 68 65 20 6d 61 69 6e 20 62 74 72 65 65 20 73  The main btree s
d300: 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 20 20  tructure */.    
d310: 69 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 3b 20  int usableSize; 
d320: 20 20 20 2f 2a 20 41 6d 6f 75 6e 74 20 6f 66 20     /* Amount of 
d330: 75 73 61 62 6c 65 20 73 70 61 63 65 20 6f 6e 20  usable space on 
d340: 65 61 63 68 20 70 61 67 65 20 2a 2f 0a 20 20 20  each page */.   
d350: 20 75 31 36 20 63 65 6c 6c 4f 66 66 73 65 74 3b   u16 cellOffset;
d360: 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 66 72      /* Offset fr
d370: 6f 6d 20 73 74 61 72 74 20 6f 66 20 70 61 67 65  om start of page
d380: 20 74 6f 20 66 69 72 73 74 20 63 65 6c 6c 20 70   to first cell p
d390: 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 20 20 69 6e  ointer */.    in
d3a0: 74 20 6e 46 72 65 65 3b 20 20 20 20 20 20 20 20  t nFree;        
d3b0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 6e   /* Number of un
d3c0: 75 73 65 64 20 62 79 74 65 73 20 6f 6e 20 74 68  used bytes on th
d3d0: 65 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 69 6e  e page */.    in
d3e0: 74 20 74 6f 70 3b 20 20 20 20 20 20 20 20 20 20  t top;          
d3f0: 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f   /* First byte o
d400: 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  f the cell conte
d410: 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20 20 20 69  nt area */.    i
d420: 6e 74 20 69 43 65 6c 6c 46 69 72 73 74 3b 20 20  nt iCellFirst;  
d430: 20 20 2f 2a 20 46 69 72 73 74 20 61 6c 6c 6f 77    /* First allow
d440: 61 62 6c 65 20 63 65 6c 6c 20 6f 72 20 66 72 65  able cell or fre
d450: 65 62 6c 6f 63 6b 20 6f 66 66 73 65 74 20 2a 2f  eblock offset */
d460: 0a 20 20 20 20 69 6e 74 20 69 43 65 6c 6c 4c 61  .    int iCellLa
d470: 73 74 3b 20 20 20 20 20 2f 2a 20 4c 61 73 74 20  st;     /* Last 
d480: 70 6f 73 73 69 62 6c 65 20 63 65 6c 6c 20 6f 72  possible cell or
d490: 20 66 72 65 65 62 6c 6f 63 6b 20 6f 66 66 73 65   freeblock offse
d4a0: 74 20 2a 2f 0a 0a 20 20 20 20 70 42 74 20 3d 20  t */..    pBt = 
d4b0: 70 50 61 67 65 2d 3e 70 42 74 3b 0a 0a 20 20 20  pPage->pBt;..   
d4c0: 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64   hdr = pPage->hd
d4d0: 72 4f 66 66 73 65 74 3b 0a 20 20 20 20 64 61 74  rOffset;.    dat
d4e0: 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61  a = pPage->aData
d4f0: 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43  ;.    /* EVIDENC
d500: 45 2d 4f 46 3a 20 52 2d 32 38 35 39 34 2d 30 32  E-OF: R-28594-02
d510: 38 39 30 20 54 68 65 20 6f 6e 65 2d 62 79 74 65  890 The one-byte
d520: 20 66 6c 61 67 20 61 74 20 6f 66 66 73 65 74 20   flag at offset 
d530: 30 20 69 6e 64 69 63 61 74 69 6e 67 0a 20 20 20  0 indicating.   
d540: 20 2a 2a 20 74 68 65 20 62 2d 74 72 65 65 20 70   ** the b-tree p
d550: 61 67 65 20 74 79 70 65 2e 20 2a 2f 0a 20 20 20  age type. */.   
d560: 20 69 66 28 20 64 65 63 6f 64 65 46 6c 61 67 73   if( decodeFlags
d570: 28 70 50 61 67 65 2c 20 64 61 74 61 5b 68 64 72  (pPage, data[hdr
d580: 5d 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  ]) ) return SQLI
d590: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
d5a0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74  .    assert( pBt
d5b0: 2d 3e 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20  ->pageSize>=512 
d5c0: 26 26 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  && pBt->pageSize
d5d0: 3c 3d 36 35 35 33 36 20 29 3b 0a 20 20 20 20 70  <=65536 );.    p
d5e0: 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65 20 3d  Page->maskPage =
d5f0: 20 28 75 31 36 29 28 70 42 74 2d 3e 70 61 67 65   (u16)(pBt->page
d600: 53 69 7a 65 20 2d 20 31 29 3b 0a 20 20 20 20 70  Size - 1);.    p
d610: 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20  Page->nOverflow 
d620: 3d 20 30 3b 0a 20 20 20 20 75 73 61 62 6c 65 53  = 0;.    usableS
d630: 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c  ize = pBt->usabl
d640: 65 53 69 7a 65 3b 0a 20 20 20 20 70 50 61 67 65  eSize;.    pPage
d650: 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 63  ->cellOffset = c
d660: 65 6c 6c 4f 66 66 73 65 74 20 3d 20 68 64 72 20  ellOffset = hdr 
d670: 2b 20 38 20 2b 20 70 50 61 67 65 2d 3e 63 68 69  + 8 + pPage->chi
d680: 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20 20 20 70  ldPtrSize;.    p
d690: 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 3d  Page->aDataEnd =
d6a0: 20 26 64 61 74 61 5b 75 73 61 62 6c 65 53 69 7a   &data[usableSiz
d6b0: 65 5d 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 61  e];.    pPage->a
d6c0: 43 65 6c 6c 49 64 78 20 3d 20 26 64 61 74 61 5b  CellIdx = &data[
d6d0: 63 65 6c 6c 4f 66 66 73 65 74 5d 3b 0a 20 20 20  cellOffset];.   
d6e0: 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
d6f0: 20 52 2d 35 38 30 31 35 2d 34 38 31 37 35 20 54   R-58015-48175 T
d700: 68 65 20 74 77 6f 2d 62 79 74 65 20 69 6e 74 65  he two-byte inte
d710: 67 65 72 20 61 74 20 6f 66 66 73 65 74 20 35 20  ger at offset 5 
d720: 64 65 73 69 67 6e 61 74 65 73 0a 20 20 20 20 2a  designates.    *
d730: 2a 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  * the start of t
d740: 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
d750: 61 72 65 61 2e 20 41 20 7a 65 72 6f 20 76 61 6c  area. A zero val
d760: 75 65 20 66 6f 72 20 74 68 69 73 20 69 6e 74 65  ue for this inte
d770: 67 65 72 20 69 73 0a 20 20 20 20 2a 2a 20 69 6e  ger is.    ** in
d780: 74 65 72 70 72 65 74 65 64 20 61 73 20 36 35 35  terpreted as 655
d790: 33 36 2e 20 2a 2f 0a 20 20 20 20 74 6f 70 20 3d  36. */.    top =
d7a0: 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65 72 6f   get2byteNotZero
d7b0: 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a  (&data[hdr+5]);.
d7c0: 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
d7d0: 4f 46 3a 20 52 2d 33 37 30 30 32 2d 33 32 37 37  OF: R-37002-3277
d7e0: 34 20 54 68 65 20 74 77 6f 2d 62 79 74 65 20 69  4 The two-byte i
d7f0: 6e 74 65 67 65 72 20 61 74 20 6f 66 66 73 65 74  nteger at offset
d800: 20 33 20 67 69 76 65 73 20 74 68 65 0a 20 20 20   3 gives the.   
d810: 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 63 65   ** number of ce
d820: 6c 6c 73 20 6f 6e 20 74 68 65 20 70 61 67 65 2e  lls on the page.
d830: 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e   */.    pPage->n
d840: 43 65 6c 6c 20 3d 20 67 65 74 32 62 79 74 65 28  Cell = get2byte(
d850: 26 64 61 74 61 5b 68 64 72 2b 33 5d 29 3b 0a 20  &data[hdr+3]);. 
d860: 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 43     if( pPage->nC
d870: 65 6c 6c 3e 4d 58 5f 43 45 4c 4c 28 70 42 74 29  ell>MX_CELL(pBt)
d880: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 6f 20   ){.      /* To 
d890: 6d 61 6e 79 20 63 65 6c 6c 73 20 66 6f 72 20 61  many cells for a
d8a0: 20 73 69 6e 67 6c 65 20 70 61 67 65 2e 20 20 54   single page.  T
d8b0: 68 65 20 70 61 67 65 20 6d 75 73 74 20 62 65 20  he page must be 
d8c0: 63 6f 72 72 75 70 74 20 2a 2f 0a 20 20 20 20 20  corrupt */.     
d8d0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
d8e0: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
d8f0: 20 7d 0a 20 20 20 20 74 65 73 74 63 61 73 65 28   }.    testcase(
d900: 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 4d   pPage->nCell==M
d910: 58 5f 43 45 4c 4c 28 70 42 74 29 20 29 3b 0a 20  X_CELL(pBt) );. 
d920: 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
d930: 46 3a 20 52 2d 32 34 30 38 39 2d 35 37 39 37 39  F: R-24089-57979
d940: 20 49 66 20 61 20 70 61 67 65 20 63 6f 6e 74 61   If a page conta
d950: 69 6e 73 20 6e 6f 20 63 65 6c 6c 73 20 28 77 68  ins no cells (wh
d960: 69 63 68 20 69 73 20 6f 6e 6c 79 0a 20 20 20 20  ich is only.    
d970: 2a 2a 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20  ** possible for 
d980: 61 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 61  a root page of a
d990: 20 74 61 62 6c 65 20 74 68 61 74 20 63 6f 6e 74   table that cont
d9a0: 61 69 6e 73 20 6e 6f 20 72 6f 77 73 29 20 74 68  ains no rows) th
d9b0: 65 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f 66  en the.    ** of
d9c0: 66 73 65 74 20 74 6f 20 74 68 65 20 63 65 6c 6c  fset to the cell
d9d0: 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 77 69   content area wi
d9e0: 6c 6c 20 65 71 75 61 6c 20 74 68 65 20 70 61 67  ll equal the pag
d9f0: 65 20 73 69 7a 65 20 6d 69 6e 75 73 20 74 68 65  e size minus the
da00: 0a 20 20 20 20 2a 2a 20 62 79 74 65 73 20 6f 66  .    ** bytes of
da10: 20 72 65 73 65 72 76 65 64 20 73 70 61 63 65 2e   reserved space.
da20: 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
da30: 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 7c  pPage->nCell>0 |
da40: 7c 20 74 6f 70 3d 3d 75 73 61 62 6c 65 53 69 7a  | top==usableSiz
da50: 65 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20  e || CORRUPT_DB 
da60: 29 3b 0a 0a 20 20 20 20 2f 2a 20 41 20 6d 61 6c  );..    /* A mal
da70: 66 6f 72 6d 65 64 20 64 61 74 61 62 61 73 65 20  formed database 
da80: 70 61 67 65 20 6d 69 67 68 74 20 63 61 75 73 65  page might cause
da90: 20 75 73 20 74 6f 20 72 65 61 64 20 70 61 73 74   us to read past
daa0: 20 74 68 65 20 65 6e 64 0a 20 20 20 20 2a 2a 20   the end.    ** 
dab0: 6f 66 20 70 61 67 65 20 77 68 65 6e 20 70 61 72  of page when par
dac0: 73 69 6e 67 20 61 20 63 65 6c 6c 2e 20 20 0a 20  sing a cell.  . 
dad0: 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65     **.    ** The
dae0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b   following block
daf0: 20 6f 66 20 63 6f 64 65 20 63 68 65 63 6b 73 20   of code checks 
db00: 65 61 72 6c 79 20 74 6f 20 73 65 65 20 69 66 20  early to see if 
db10: 61 20 63 65 6c 6c 20 65 78 74 65 6e 64 73 0a 20  a cell extends. 
db20: 20 20 20 2a 2a 20 70 61 73 74 20 74 68 65 20 65     ** past the e
db30: 6e 64 20 6f 66 20 61 20 70 61 67 65 20 62 6f 75  nd of a page bou
db40: 6e 64 61 72 79 20 61 6e 64 20 63 61 75 73 65 73  ndary and causes
db50: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20   SQLITE_CORRUPT 
db60: 74 6f 20 62 65 20 0a 20 20 20 20 2a 2a 20 72 65  to be .    ** re
db70: 74 75 72 6e 65 64 20 69 66 20 69 74 20 64 6f 65  turned if it doe
db80: 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 43  s..    */.    iC
db90: 65 6c 6c 46 69 72 73 74 20 3d 20 63 65 6c 6c 4f  ellFirst = cellO
dba0: 66 66 73 65 74 20 2b 20 32 2a 70 50 61 67 65 2d  ffset + 2*pPage-
dbb0: 3e 6e 43 65 6c 6c 3b 0a 20 20 20 20 69 43 65 6c  >nCell;.    iCel
dbc0: 6c 4c 61 73 74 20 3d 20 75 73 61 62 6c 65 53 69  lLast = usableSi
dbd0: 7a 65 20 2d 20 34 3b 0a 20 20 20 20 69 66 28 20  ze - 4;.    if( 
dbe0: 70 42 74 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26  pBt->db->flags &
dbf0: 20 53 51 4c 49 54 45 5f 43 65 6c 6c 53 69 7a 65   SQLITE_CellSize
dc00: 43 6b 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  Ck ){.      int 
dc10: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  i;            /*
dc20: 20 49 6e 64 65 78 20 69 6e 74 6f 20 74 68 65 20   Index into the 
dc30: 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 72  cell pointer arr
dc40: 61 79 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  ay */.      int 
dc50: 73 7a 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  sz;           /*
dc60: 20 53 69 7a 65 20 6f 66 20 61 20 63 65 6c 6c 20   Size of a cell 
dc70: 2a 2f 0a 0a 20 20 20 20 20 20 69 66 28 20 21 70  */..      if( !p
dc80: 50 61 67 65 2d 3e 6c 65 61 66 20 29 20 69 43 65  Page->leaf ) iCe
dc90: 6c 6c 4c 61 73 74 2d 2d 3b 0a 20 20 20 20 20 20  llLast--;.      
dca0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 67 65  for(i=0; i<pPage
dcb0: 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20  ->nCell; i++){. 
dcc0: 20 20 20 20 20 20 20 70 63 20 3d 20 67 65 74 32         pc = get2
dcd0: 62 79 74 65 28 26 64 61 74 61 5b 63 65 6c 6c 4f  byte(&data[cellO
dce0: 66 66 73 65 74 2b 69 2a 32 5d 29 3b 0a 20 20 20  ffset+i*2]);.   
dcf0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
dd00: 63 3d 3d 69 43 65 6c 6c 46 69 72 73 74 20 29 3b  c==iCellFirst );
dd10: 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
dd20: 65 28 20 70 63 3d 3d 69 43 65 6c 6c 4c 61 73 74  e( pc==iCellLast
dd30: 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
dd40: 70 63 3c 69 43 65 6c 6c 46 69 72 73 74 20 7c 7c  pc<iCellFirst ||
dd50: 20 70 63 3e 69 43 65 6c 6c 4c 61 73 74 20 29 7b   pc>iCellLast ){
dd60: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
dd70: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
dd80: 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 7d  _BKPT;.        }
dd90: 0a 20 20 20 20 20 20 20 20 73 7a 20 3d 20 63 65  .        sz = ce
dda0: 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c  llSizePtr(pPage,
ddb0: 20 26 64 61 74 61 5b 70 63 5d 29 3b 0a 20 20 20   &data[pc]);.   
ddc0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
ddd0: 63 2b 73 7a 3d 3d 75 73 61 62 6c 65 53 69 7a 65  c+sz==usableSize
dde0: 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
ddf0: 70 63 2b 73 7a 3e 75 73 61 62 6c 65 53 69 7a 65  pc+sz>usableSize
de00: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
de10: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
de20: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
de30: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
de40: 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
de50: 61 66 20 29 20 69 43 65 6c 6c 4c 61 73 74 2b 2b  af ) iCellLast++
de60: 3b 0a 20 20 20 20 7d 20 20 0a 0a 20 20 20 20 2f  ;.    }  ..    /
de70: 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 74 6f  * Compute the to
de80: 74 61 6c 20 66 72 65 65 20 73 70 61 63 65 20 6f  tal free space o
de90: 6e 20 74 68 65 20 70 61 67 65 0a 20 20 20 20 2a  n the page.    *
dea0: 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
deb0: 2d 32 33 35 38 38 2d 33 34 34 35 30 20 54 68 65  -23588-34450 The
dec0: 20 74 77 6f 2d 62 79 74 65 20 69 6e 74 65 67 65   two-byte intege
ded0: 72 20 61 74 20 6f 66 66 73 65 74 20 31 20 67 69  r at offset 1 gi
dee0: 76 65 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 73  ves the.    ** s
def0: 74 61 72 74 20 6f 66 20 74 68 65 20 66 69 72 73  tart of the firs
df00: 74 20 66 72 65 65 62 6c 6f 63 6b 20 6f 6e 20 74  t freeblock on t
df10: 68 65 20 70 61 67 65 2c 20 6f 72 20 69 73 20 7a  he page, or is z
df20: 65 72 6f 20 69 66 20 74 68 65 72 65 20 61 72 65  ero if there are
df30: 20 6e 6f 0a 20 20 20 20 2a 2a 20 66 72 65 65 62   no.    ** freeb
df40: 6c 6f 63 6b 73 2e 20 2a 2f 0a 20 20 20 20 70 63  locks. */.    pc
df50: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
df60: 61 5b 68 64 72 2b 31 5d 29 3b 0a 20 20 20 20 6e  a[hdr+1]);.    n
df70: 46 72 65 65 20 3d 20 64 61 74 61 5b 68 64 72 2b  Free = data[hdr+
df80: 37 5d 20 2b 20 74 6f 70 3b 20 20 2f 2a 20 49 6e  7] + top;  /* In
df90: 69 74 20 6e 46 72 65 65 20 74 6f 20 6e 6f 6e 2d  it nFree to non-
dfa0: 66 72 65 65 62 6c 6f 63 6b 20 66 72 65 65 20 73  freeblock free s
dfb0: 70 61 63 65 20 2a 2f 0a 20 20 20 20 77 68 69 6c  pace */.    whil
dfc0: 65 28 20 70 63 3e 30 20 29 7b 0a 20 20 20 20 20  e( pc>0 ){.     
dfd0: 20 75 31 36 20 6e 65 78 74 2c 20 73 69 7a 65 3b   u16 next, size;
dfe0: 0a 20 20 20 20 20 20 69 66 28 20 70 63 3c 69 43  .      if( pc<iC
dff0: 65 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63 3e 69  ellFirst || pc>i
e000: 43 65 6c 6c 4c 61 73 74 20 29 7b 0a 20 20 20 20  CellLast ){.    
e010: 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
e020: 4f 46 3a 20 52 2d 35 35 35 33 30 2d 35 32 39 33  OF: R-55530-5293
e030: 30 20 49 6e 20 61 20 77 65 6c 6c 2d 66 6f 72 6d  0 In a well-form
e040: 65 64 20 62 2d 74 72 65 65 20 70 61 67 65 2c 20  ed b-tree page, 
e050: 74 68 65 72 65 20 77 69 6c 6c 0a 20 20 20 20 20  there will.     
e060: 20 20 20 2a 2a 20 61 6c 77 61 79 73 20 62 65 20     ** always be 
e070: 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 63 65 6c  at least one cel
e080: 6c 20 62 65 66 6f 72 65 20 74 68 65 20 66 69 72  l before the fir
e090: 73 74 20 66 72 65 65 62 6c 6f 63 6b 2e 0a 20 20  st freeblock..  
e0a0: 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
e0b0: 20 2a 2a 20 4f 72 2c 20 74 68 65 20 66 72 65 65   ** Or, the free
e0c0: 62 6c 6f 63 6b 20 69 73 20 6f 66 66 20 74 68 65  block is off the
e0d0: 20 65 6e 64 20 6f 66 20 74 68 65 20 70 61 67 65   end of the page
e0e0: 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
e0f0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
e100: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20  E_CORRUPT_BKPT; 
e110: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e  .      }.      n
e120: 65 78 74 20 3d 20 67 65 74 32 62 79 74 65 28 26  ext = get2byte(&
e130: 64 61 74 61 5b 70 63 5d 29 3b 0a 20 20 20 20 20  data[pc]);.     
e140: 20 73 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65   size = get2byte
e150: 28 26 64 61 74 61 5b 70 63 2b 32 5d 29 3b 0a 20  (&data[pc+2]);. 
e160: 20 20 20 20 20 69 66 28 20 28 6e 65 78 74 3e 30       if( (next>0
e170: 20 26 26 20 6e 65 78 74 3c 3d 70 63 2b 73 69 7a   && next<=pc+siz
e180: 65 2b 33 29 20 7c 7c 20 70 63 2b 73 69 7a 65 3e  e+3) || pc+size>
e190: 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20  usableSize ){.  
e1a0: 20 20 20 20 20 20 2f 2a 20 46 72 65 65 20 62 6c        /* Free bl
e1b0: 6f 63 6b 73 20 6d 75 73 74 20 62 65 20 69 6e 20  ocks must be in 
e1c0: 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e  ascending order.
e1d0: 20 41 6e 64 20 74 68 65 20 6c 61 73 74 20 62 79   And the last by
e1e0: 74 65 20 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a  te of.        **
e1f0: 20 74 68 65 20 66 72 65 65 2d 62 6c 6f 63 6b 20   the free-block 
e200: 6d 75 73 74 20 6c 69 65 20 6f 6e 20 74 68 65 20  must lie on the 
e210: 64 61 74 61 62 61 73 65 20 70 61 67 65 2e 20 20  database page.  
e220: 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  */.        retur
e230: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
e240: 5f 42 4b 50 54 3b 20 0a 20 20 20 20 20 20 7d 0a  _BKPT; .      }.
e250: 20 20 20 20 20 20 6e 46 72 65 65 20 3d 20 6e 46        nFree = nF
e260: 72 65 65 20 2b 20 73 69 7a 65 3b 0a 20 20 20 20  ree + size;.    
e270: 20 20 70 63 20 3d 20 6e 65 78 74 3b 0a 20 20 20    pc = next;.   
e280: 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 74 20 74 68   }..    /* At th
e290: 69 73 20 70 6f 69 6e 74 2c 20 6e 46 72 65 65 20  is point, nFree 
e2a0: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 73 75 6d  contains the sum
e2b0: 20 6f 66 20 74 68 65 20 6f 66 66 73 65 74 20 74   of the offset t
e2c0: 6f 20 74 68 65 20 73 74 61 72 74 0a 20 20 20 20  o the start.    
e2d0: 2a 2a 20 6f 66 20 74 68 65 20 63 65 6c 6c 2d 63  ** of the cell-c
e2e0: 6f 6e 74 65 6e 74 20 61 72 65 61 20 70 6c 75 73  ontent area plus
e2f0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66   the number of f
e300: 72 65 65 20 62 79 74 65 73 20 77 69 74 68 69 6e  ree bytes within
e310: 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 65 6c 6c  .    ** the cell
e320: 2d 63 6f 6e 74 65 6e 74 20 61 72 65 61 2e 20 49  -content area. I
e330: 66 20 74 68 69 73 20 69 73 20 67 72 65 61 74 65  f this is greate
e340: 72 20 74 68 61 6e 20 74 68 65 20 75 73 61 62 6c  r than the usabl
e350: 65 2d 73 69 7a 65 0a 20 20 20 20 2a 2a 20 6f 66  e-size.    ** of
e360: 20 74 68 65 20 70 61 67 65 2c 20 74 68 65 6e 20   the page, then 
e370: 74 68 65 20 70 61 67 65 20 6d 75 73 74 20 62 65  the page must be
e380: 20 63 6f 72 72 75 70 74 65 64 2e 20 54 68 69 73   corrupted. This
e390: 20 63 68 65 63 6b 20 61 6c 73 6f 0a 20 20 20 20   check also.    
e3a0: 2a 2a 20 73 65 72 76 65 73 20 74 6f 20 76 65 72  ** serves to ver
e3b0: 69 66 79 20 74 68 61 74 20 74 68 65 20 6f 66 66  ify that the off
e3c0: 73 65 74 20 74 6f 20 74 68 65 20 73 74 61 72 74  set to the start
e3d0: 20 6f 66 20 74 68 65 20 63 65 6c 6c 2d 63 6f 6e   of the cell-con
e3e0: 74 65 6e 74 0a 20 20 20 20 2a 2a 20 61 72 65 61  tent.    ** area
e3f0: 2c 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74  , according to t
e400: 68 65 20 70 61 67 65 20 68 65 61 64 65 72 2c 20  he page header, 
e410: 6c 69 65 73 20 77 69 74 68 69 6e 20 74 68 65 20  lies within the 
e420: 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  page..    */.   
e430: 20 69 66 28 20 6e 46 72 65 65 3e 75 73 61 62 6c   if( nFree>usabl
e440: 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 72  eSize ){.      r
e450: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
e460: 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20 20 20  RUPT_BKPT; .    
e470: 7d 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 46 72  }.    pPage->nFr
e480: 65 65 20 3d 20 28 75 31 36 29 28 6e 46 72 65 65  ee = (u16)(nFree
e490: 20 2d 20 69 43 65 6c 6c 46 69 72 73 74 29 3b 0a   - iCellFirst);.
e4a0: 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69      pPage->isIni
e4b0: 74 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74  t = 1;.  }.  ret
e4c0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
e4d0: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 75 70 20 61  ../*.** Set up a
e4e0: 20 72 61 77 20 70 61 67 65 20 73 6f 20 74 68 61   raw page so tha
e4f0: 74 20 69 74 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20  t it looks like 
e500: 61 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  a database page 
e510: 68 6f 6c 64 69 6e 67 0a 2a 2a 20 6e 6f 20 65 6e  holding.** no en
e520: 74 72 69 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  tries..*/.static
e530: 20 76 6f 69 64 20 7a 65 72 6f 50 61 67 65 28 4d   void zeroPage(M
e540: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69  emPage *pPage, i
e550: 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 75 6e 73  nt flags){.  uns
e560: 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61  igned char *data
e570: 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b   = pPage->aData;
e580: 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
e590: 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20   = pPage->pBt;. 
e5a0: 20 75 38 20 68 64 72 20 3d 20 70 50 61 67 65 2d   u8 hdr = pPage-
e5b0: 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 75 31  >hdrOffset;.  u1
e5c0: 36 20 66 69 72 73 74 3b 0a 0a 20 20 61 73 73 65  6 first;..  asse
e5d0: 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
e5e0: 50 61 67 65 6e 75 6d 62 65 72 28 70 50 61 67 65  Pagenumber(pPage
e5f0: 2d 3e 70 44 62 50 61 67 65 29 3d 3d 70 50 61 67  ->pDbPage)==pPag
e600: 65 2d 3e 70 67 6e 6f 20 29 3b 0a 20 20 61 73 73  e->pgno );.  ass
e610: 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
e620: 72 47 65 74 45 78 74 72 61 28 70 50 61 67 65 2d  rGetExtra(pPage-
e630: 3e 70 44 62 50 61 67 65 29 20 3d 3d 20 28 76 6f  >pDbPage) == (vo
e640: 69 64 2a 29 70 50 61 67 65 20 29 3b 0a 20 20 61  id*)pPage );.  a
e650: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
e660: 67 65 72 47 65 74 44 61 74 61 28 70 50 61 67 65  gerGetData(pPage
e670: 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d 20 64 61  ->pDbPage) == da
e680: 74 61 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ta );.  assert( 
e690: 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
e6a0: 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70  iteable(pPage->p
e6b0: 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73  DbPage) );.  ass
e6c0: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
e6d0: 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
e6e0: 65 78 29 20 29 3b 0a 20 20 69 66 28 20 70 42 74  ex) );.  if( pBt
e6f0: 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53  ->btsFlags & BTS
e700: 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 20 29  _SECURE_DELETE )
e710: 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 64 61  {.    memset(&da
e720: 74 61 5b 68 64 72 5d 2c 20 30 2c 20 70 42 74 2d  ta[hdr], 0, pBt-
e730: 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 68 64  >usableSize - hd
e740: 72 29 3b 0a 20 20 7d 0a 20 20 64 61 74 61 5b 68  r);.  }.  data[h
e750: 64 72 5d 20 3d 20 28 63 68 61 72 29 66 6c 61 67  dr] = (char)flag
e760: 73 3b 0a 20 20 66 69 72 73 74 20 3d 20 68 64 72  s;.  first = hdr
e770: 20 2b 20 28 28 66 6c 61 67 73 26 50 54 46 5f 4c   + ((flags&PTF_L
e780: 45 41 46 29 3d 3d 30 20 3f 20 31 32 20 3a 20 38  EAF)==0 ? 12 : 8
e790: 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74  );.  memset(&dat
e7a0: 61 5b 68 64 72 2b 31 5d 2c 20 30 2c 20 34 29 3b  a[hdr+1], 0, 4);
e7b0: 0a 20 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d  .  data[hdr+7] =
e7c0: 20 30 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26   0;.  put2byte(&
e7d0: 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 70 42 74  data[hdr+5], pBt
e7e0: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20  ->usableSize);. 
e7f0: 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20   pPage->nFree = 
e800: 28 75 31 36 29 28 70 42 74 2d 3e 75 73 61 62 6c  (u16)(pBt->usabl
e810: 65 53 69 7a 65 20 2d 20 66 69 72 73 74 29 3b 0a  eSize - first);.
e820: 20 20 64 65 63 6f 64 65 46 6c 61 67 73 28 70 50    decodeFlags(pP
e830: 61 67 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70  age, flags);.  p
e840: 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74  Page->cellOffset
e850: 20 3d 20 66 69 72 73 74 3b 0a 20 20 70 50 61 67   = first;.  pPag
e860: 65 2d 3e 61 44 61 74 61 45 6e 64 20 3d 20 26 64  e->aDataEnd = &d
e870: 61 74 61 5b 70 42 74 2d 3e 75 73 61 62 6c 65 53  ata[pBt->usableS
e880: 69 7a 65 5d 3b 0a 20 20 70 50 61 67 65 2d 3e 61  ize];.  pPage->a
e890: 43 65 6c 6c 49 64 78 20 3d 20 26 64 61 74 61 5b  CellIdx = &data[
e8a0: 66 69 72 73 74 5d 3b 0a 20 20 70 50 61 67 65 2d  first];.  pPage-
e8b0: 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a  >nOverflow = 0;.
e8c0: 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70    assert( pBt->p
e8d0: 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20  ageSize>=512 && 
e8e0: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c 3d 36  pBt->pageSize<=6
e8f0: 35 35 33 36 20 29 3b 0a 20 20 70 50 61 67 65 2d  5536 );.  pPage-
e900: 3e 6d 61 73 6b 50 61 67 65 20 3d 20 28 75 31 36  >maskPage = (u16
e910: 29 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  )(pBt->pageSize 
e920: 2d 20 31 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e  - 1);.  pPage->n
e930: 43 65 6c 6c 20 3d 20 30 3b 0a 20 20 70 50 61 67  Cell = 0;.  pPag
e940: 65 2d 3e 69 73 49 6e 69 74 20 3d 20 31 3b 0a 7d  e->isInit = 1;.}
e950: 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74  .../*.** Convert
e960: 20 61 20 44 62 50 61 67 65 20 6f 62 74 61 69 6e   a DbPage obtain
e970: 65 64 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65  ed from the page
e980: 72 20 69 6e 74 6f 20 61 20 4d 65 6d 50 61 67 65  r into a MemPage
e990: 20 75 73 65 64 20 62 79 0a 2a 2a 20 74 68 65 20   used by.** the 
e9a0: 62 74 72 65 65 20 6c 61 79 65 72 2e 0a 2a 2f 0a  btree layer..*/.
e9b0: 73 74 61 74 69 63 20 4d 65 6d 50 61 67 65 20 2a  static MemPage *
e9c0: 62 74 72 65 65 50 61 67 65 46 72 6f 6d 44 62 50  btreePageFromDbP
e9d0: 61 67 65 28 44 62 50 61 67 65 20 2a 70 44 62 50  age(DbPage *pDbP
e9e0: 61 67 65 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c 20  age, Pgno pgno, 
e9f0: 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
ea00: 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
ea10: 20 3d 20 28 4d 65 6d 50 61 67 65 2a 29 73 71 6c   = (MemPage*)sql
ea20: 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72  ite3PagerGetExtr
ea30: 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20 70 50  a(pDbPage);.  pP
ea40: 61 67 65 2d 3e 61 44 61 74 61 20 3d 20 73 71 6c  age->aData = sql
ea50: 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
ea60: 28 70 44 62 50 61 67 65 29 3b 0a 20 20 70 50 61  (pDbPage);.  pPa
ea70: 67 65 2d 3e 70 44 62 50 61 67 65 20 3d 20 70 44  ge->pDbPage = pD
ea80: 62 50 61 67 65 3b 0a 20 20 70 50 61 67 65 2d 3e  bPage;.  pPage->
ea90: 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 70 50 61  pBt = pBt;.  pPa
eaa0: 67 65 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b  ge->pgno = pgno;
eab0: 0a 20 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  .  pPage->hdrOff
eac0: 73 65 74 20 3d 20 70 50 61 67 65 2d 3e 70 67 6e  set = pPage->pgn
ead0: 6f 3d 3d 31 20 3f 20 31 30 30 20 3a 20 30 3b 0a  o==1 ? 100 : 0;.
eae0: 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 3b 20    return pPage; 
eaf0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20  .}../*.** Get a 
eb00: 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 70 61  page from the pa
eb10: 67 65 72 2e 20 20 49 6e 69 74 69 61 6c 69 7a 65  ger.  Initialize
eb20: 20 74 68 65 20 4d 65 6d 50 61 67 65 2e 70 42 74   the MemPage.pBt
eb30: 20 61 6e 64 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e   and.** MemPage.
eb40: 61 44 61 74 61 20 65 6c 65 6d 65 6e 74 73 20 69  aData elements i
eb50: 66 20 6e 65 65 64 65 64 2e 20 20 53 65 65 20 61  f needed.  See a
eb60: 6c 73 6f 3a 20 62 74 72 65 65 47 65 74 55 6e 75  lso: btreeGetUnu
eb70: 73 65 64 50 61 67 65 28 29 2e 0a 2a 2a 0a 2a 2a  sedPage()..**.**
eb80: 20 49 66 20 74 68 65 20 50 41 47 45 52 5f 47 45   If the PAGER_GE
eb90: 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 66 6c 61 67  T_NOCONTENT flag
eba0: 20 69 73 20 73 65 74 2c 20 69 74 20 6d 65 61 6e   is set, it mean
ebb0: 73 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74  s that we do not
ebc0: 20 63 61 72 65 0a 2a 2a 20 61 62 6f 75 74 20 74   care.** about t
ebd0: 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68  he content of th
ebe0: 65 20 70 61 67 65 20 61 74 20 74 68 69 73 20 74  e page at this t
ebf0: 69 6d 65 2e 20 20 53 6f 20 64 6f 20 6e 6f 74 20  ime.  So do not 
ec00: 67 6f 20 74 6f 20 74 68 65 20 64 69 73 6b 0a 2a  go to the disk.*
ec10: 2a 20 74 6f 20 66 65 74 63 68 20 74 68 65 20 63  * to fetch the c
ec20: 6f 6e 74 65 6e 74 2e 20 20 4a 75 73 74 20 66 69  ontent.  Just fi
ec30: 6c 6c 20 69 6e 20 74 68 65 20 63 6f 6e 74 65 6e  ll in the conten
ec40: 74 20 77 69 74 68 20 7a 65 72 6f 73 20 66 6f 72  t with zeros for
ec50: 20 6e 6f 77 2e 0a 2a 2a 20 49 66 20 69 6e 20 74   now..** If in t
ec60: 68 65 20 66 75 74 75 72 65 20 77 65 20 63 61 6c  he future we cal
ec70: 6c 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  l sqlite3PagerWr
ec80: 69 74 65 28 29 20 6f 6e 20 74 68 69 73 20 70 61  ite() on this pa
ec90: 67 65 2c 20 74 68 61 74 0a 2a 2a 20 6d 65 61 6e  ge, that.** mean
eca0: 73 20 77 65 20 68 61 76 65 20 73 74 61 72 74 65  s we have starte
ecb0: 64 20 74 6f 20 62 65 20 63 6f 6e 63 65 72 6e 65  d to be concerne
ecc0: 64 20 61 62 6f 75 74 20 63 6f 6e 74 65 6e 74 20  d about content 
ecd0: 61 6e 64 20 74 68 65 20 64 69 73 6b 0a 2a 2a 20  and the disk.** 
ece0: 72 65 61 64 20 73 68 6f 75 6c 64 20 6f 63 63 75  read should occu
ecf0: 72 20 61 74 20 74 68 61 74 20 70 6f 69 6e 74 2e  r at that point.
ed00: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
ed10: 74 72 65 65 47 65 74 50 61 67 65 28 0a 20 20 42  treeGetPage(.  B
ed20: 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20  tShared *pBt,   
ed30: 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65      /* The btree
ed40: 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c   */.  Pgno pgno,
ed50: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
ed60: 6d 62 65 72 20 6f 66 20 74 68 65 20 70 61 67 65  mber of the page
ed70: 20 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20 20 4d   to fetch */.  M
ed80: 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c  emPage **ppPage,
ed90: 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68      /* Return th
eda0: 65 20 70 61 67 65 20 69 6e 20 74 68 69 73 20 70  e page in this p
edb0: 61 72 61 6d 65 74 65 72 20 2a 2f 0a 20 20 69 6e  arameter */.  in
edc0: 74 20 66 6c 61 67 73 20 20 20 20 20 20 20 20 20  t flags         
edd0: 20 20 20 2f 2a 20 50 41 47 45 52 5f 47 45 54 5f     /* PAGER_GET_
ede0: 4e 4f 43 4f 4e 54 45 4e 54 20 6f 72 20 50 41 47  NOCONTENT or PAG
edf0: 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20  ER_GET_READONLY 
ee00: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  */.){.  int rc;.
ee10: 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67    DbPage *pDbPag
ee20: 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 66 6c  e;..  assert( fl
ee30: 61 67 73 3d 3d 30 20 7c 7c 20 66 6c 61 67 73 3d  ags==0 || flags=
ee40: 3d 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e  =PAGER_GET_NOCON
ee50: 54 45 4e 54 20 7c 7c 20 66 6c 61 67 73 3d 3d 50  TENT || flags==P
ee60: 41 47 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c  AGER_GET_READONL
ee70: 59 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  Y );.  assert( s
ee80: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
ee90: 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
eea0: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
eeb0: 61 67 65 72 41 63 71 75 69 72 65 28 70 42 74 2d  agerAcquire(pBt-
eec0: 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20 28  >pPager, pgno, (
eed0: 44 62 50 61 67 65 2a 2a 29 26 70 44 62 50 61 67  DbPage**)&pDbPag
eee0: 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20 69 66 28  e, flags);.  if(
eef0: 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
ef00: 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 62 74 72  .  *ppPage = btr
ef10: 65 65 50 61 67 65 46 72 6f 6d 44 62 50 61 67 65  eePageFromDbPage
ef20: 28 70 44 62 50 61 67 65 2c 20 70 67 6e 6f 2c 20  (pDbPage, pgno, 
ef30: 70 42 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  pBt);.  return S
ef40: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
ef50: 2a 2a 20 52 65 74 72 69 65 76 65 20 61 20 70 61  ** Retrieve a pa
ef60: 67 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65  ge from the page
ef70: 72 20 63 61 63 68 65 2e 20 49 66 20 74 68 65 20  r cache. If the 
ef80: 72 65 71 75 65 73 74 65 64 20 70 61 67 65 20 69  requested page i
ef90: 73 20 6e 6f 74 0a 2a 2a 20 61 6c 72 65 61 64 79  s not.** already
efa0: 20 69 6e 20 74 68 65 20 70 61 67 65 72 20 63 61   in the pager ca
efb0: 63 68 65 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e  che return NULL.
efc0: 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
efd0: 4d 65 6d 50 61 67 65 2e 70 42 74 20 61 6e 64 0a  MemPage.pBt and.
efe0: 2a 2a 20 4d 65 6d 50 61 67 65 2e 61 44 61 74 61  ** MemPage.aData
eff0: 20 65 6c 65 6d 65 6e 74 73 20 69 66 20 6e 65 65   elements if nee
f000: 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4d  ded..*/.static M
f010: 65 6d 50 61 67 65 20 2a 62 74 72 65 65 50 61 67  emPage *btreePag
f020: 65 4c 6f 6f 6b 75 70 28 42 74 53 68 61 72 65 64  eLookup(BtShared
f030: 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f   *pBt, Pgno pgno
f040: 29 7b 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62  ){.  DbPage *pDb
f050: 50 61 67 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Page;.  assert( 
f060: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
f070: 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
f080: 3b 0a 20 20 70 44 62 50 61 67 65 20 3d 20 73 71  ;.  pDbPage = sq
f090: 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70  lite3PagerLookup
f0a0: 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 67  (pBt->pPager, pg
f0b0: 6e 6f 29 3b 0a 20 20 69 66 28 20 70 44 62 50 61  no);.  if( pDbPa
f0c0: 67 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ge ){.    return
f0d0: 20 62 74 72 65 65 50 61 67 65 46 72 6f 6d 44 62   btreePageFromDb
f0e0: 50 61 67 65 28 70 44 62 50 61 67 65 2c 20 70 67  Page(pDbPage, pg
f0f0: 6e 6f 2c 20 70 42 74 29 3b 0a 20 20 7d 0a 20 20  no, pBt);.  }.  
f100: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
f110: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73 69  ** Return the si
f120: 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
f130: 73 65 20 66 69 6c 65 20 69 6e 20 70 61 67 65 73  se file in pages
f140: 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6e  . If there is an
f150: 79 20 6b 69 6e 64 20 6f 66 0a 2a 2a 20 65 72 72  y kind of.** err
f160: 6f 72 2c 20 72 65 74 75 72 6e 20 28 28 75 6e 73  or, return ((uns
f170: 69 67 6e 65 64 20 69 6e 74 29 2d 31 29 2e 0a 2a  igned int)-1)..*
f180: 2f 0a 73 74 61 74 69 63 20 50 67 6e 6f 20 62 74  /.static Pgno bt
f190: 72 65 65 50 61 67 65 63 6f 75 6e 74 28 42 74 53  reePagecount(BtS
f1a0: 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 72  hared *pBt){.  r
f1b0: 65 74 75 72 6e 20 70 42 74 2d 3e 6e 50 61 67 65  eturn pBt->nPage
f1c0: 3b 0a 7d 0a 75 33 32 20 73 71 6c 69 74 65 33 42  ;.}.u32 sqlite3B
f1d0: 74 72 65 65 4c 61 73 74 50 61 67 65 28 42 74 72  treeLastPage(Btr
f1e0: 65 65 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74  ee *p){.  assert
f1f0: 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f  ( sqlite3BtreeHo
f200: 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20  ldsMutex(p) );. 
f210: 20 61 73 73 65 72 74 28 20 28 28 70 2d 3e 70 42   assert( ((p->pB
f220: 74 2d 3e 6e 50 61 67 65 29 26 30 78 38 30 30 30  t->nPage)&0x8000
f230: 30 30 30 29 3d 3d 30 20 29 3b 0a 20 20 72 65 74  000)==0 );.  ret
f240: 75 72 6e 20 62 74 72 65 65 50 61 67 65 63 6f 75  urn btreePagecou
f250: 6e 74 28 70 2d 3e 70 42 74 29 3b 0a 7d 0a 0a 2f  nt(p->pBt);.}../
f260: 2a 0a 2a 2a 20 47 65 74 20 61 20 70 61 67 65 20  *.** Get a page 
f270: 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20 61  from the pager a
f280: 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 69 74  nd initialize it
f290: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
f2a0: 69 73 20 6a 75 73 74 20 61 0a 2a 2a 20 63 6f 6e  is just a.** con
f2b0: 76 65 6e 69 65 6e 63 65 20 77 72 61 70 70 65 72  venience wrapper
f2c0: 20 61 72 6f 75 6e 64 20 73 65 70 61 72 61 74 65   around separate
f2d0: 20 63 61 6c 6c 73 20 74 6f 20 62 74 72 65 65 47   calls to btreeG
f2e0: 65 74 50 61 67 65 28 29 20 61 6e 64 20 0a 2a 2a  etPage() and .**
f2f0: 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29   btreeInitPage()
f300: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ..**.** If an er
f310: 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 6e  ror occurs, then
f320: 20 74 68 65 20 76 61 6c 75 65 20 2a 70 70 50 61   the value *ppPa
f330: 67 65 20 69 73 20 73 65 74 20 74 6f 20 69 73 20  ge is set to is 
f340: 75 6e 64 65 66 69 6e 65 64 2e 20 49 74 0a 2a 2a  undefined. It.**
f350: 20 6d 61 79 20 72 65 6d 61 69 6e 20 75 6e 63 68   may remain unch
f360: 61 6e 67 65 64 2c 20 6f 72 20 69 74 20 6d 61 79  anged, or it may
f370: 20 62 65 20 73 65 74 20 74 6f 20 61 6e 20 69 6e   be set to an in
f380: 76 61 6c 69 64 20 76 61 6c 75 65 2e 0a 2a 2f 0a  valid value..*/.
f390: 73 74 61 74 69 63 20 69 6e 74 20 67 65 74 41 6e  static int getAn
f3a0: 64 49 6e 69 74 50 61 67 65 28 0a 20 20 42 74 53  dInitPage(.  BtS
f3b0: 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20  hared *pBt,     
f3c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
f3d0: 54 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  The database fil
f3e0: 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  e */.  Pgno pgno
f3f0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
f400: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
f410: 20 6f 66 20 74 68 65 20 70 61 67 65 20 74 6f 20   of the page to 
f420: 67 65 74 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  get */.  MemPage
f430: 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 20 20   **ppPage,      
f440: 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
f450: 65 20 74 68 65 20 70 61 67 65 20 70 6f 69 6e 74  e the page point
f460: 65 72 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74  er here */.  int
f470: 20 62 52 65 61 64 6f 6e 6c 79 20 20 20 20 20 20   bReadonly      
f480: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
f490: 50 41 47 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e  PAGER_GET_READON
f4a0: 4c 59 20 6f 72 20 30 20 2a 2f 0a 29 7b 0a 20 20  LY or 0 */.){.  
f4b0: 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74  int rc;.  assert
f4c0: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
f4d0: 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
f4e0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 62 52   );.  assert( bR
f4f0: 65 61 64 6f 6e 6c 79 3d 3d 50 41 47 45 52 5f 47  eadonly==PAGER_G
f500: 45 54 5f 52 45 41 44 4f 4e 4c 59 20 7c 7c 20 62  ET_READONLY || b
f510: 52 65 61 64 6f 6e 6c 79 3d 3d 30 20 29 3b 0a 0a  Readonly==0 );..
f520: 20 20 69 66 28 20 70 67 6e 6f 3e 62 74 72 65 65    if( pgno>btree
f530: 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 20 29  Pagecount(pBt) )
f540: 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
f550: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
f560: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20    }else{.    rc 
f570: 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70  = btreeGetPage(p
f580: 42 74 2c 20 70 67 6e 6f 2c 20 70 70 50 61 67 65  Bt, pgno, ppPage
f590: 2c 20 62 52 65 61 64 6f 6e 6c 79 29 3b 0a 20 20  , bReadonly);.  
f5a0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
f5b0: 5f 4f 4b 20 26 26 20 28 2a 70 70 50 61 67 65 29  _OK && (*ppPage)
f5c0: 2d 3e 69 73 49 6e 69 74 3d 3d 30 20 29 7b 0a 20  ->isInit==0 ){. 
f5d0: 20 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 49       rc = btreeI
f5e0: 6e 69 74 50 61 67 65 28 2a 70 70 50 61 67 65 29  nitPage(*ppPage)
f5f0: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
f600: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
f610: 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
f620: 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20 20  (*ppPage);.     
f630: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
f640: 74 65 73 74 63 61 73 65 28 20 70 67 6e 6f 3d 3d  testcase( pgno==
f650: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
f660: 67 6e 6f 21 3d 30 20 7c 7c 20 72 63 3d 3d 53 51  gno!=0 || rc==SQ
f670: 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 29 3b 0a  LITE_CORRUPT );.
f680: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
f690: 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20  /*.** Release a 
f6a0: 4d 65 6d 50 61 67 65 2e 20 20 54 68 69 73 20 73  MemPage.  This s
f6b0: 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65 64 20  hould be called 
f6c0: 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 70 72  once for each pr
f6d0: 69 6f 72 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 62  ior.** call to b
f6e0: 74 72 65 65 47 65 74 50 61 67 65 2e 0a 2a 2f 0a  treeGetPage..*/.
f6f0: 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65  static void rele
f700: 61 73 65 50 61 67 65 28 4d 65 6d 50 61 67 65 20  asePage(MemPage 
f710: 2a 70 50 61 67 65 29 7b 0a 20 20 69 66 28 20 70  *pPage){.  if( p
f720: 50 61 67 65 20 29 7b 0a 20 20 20 20 61 73 73 65  Page ){.    asse
f730: 72 74 28 20 70 50 61 67 65 2d 3e 61 44 61 74 61  rt( pPage->aData
f740: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
f750: 70 50 61 67 65 2d 3e 70 42 74 20 29 3b 0a 20 20  pPage->pBt );.  
f760: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
f770: 3e 70 44 62 50 61 67 65 21 3d 30 20 29 3b 0a 20  >pDbPage!=0 );. 
f780: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
f790: 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28  e3PagerGetExtra(
f7a0: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
f7b0: 3d 3d 20 28 76 6f 69 64 2a 29 70 50 61 67 65 20  == (void*)pPage 
f7c0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  );.    assert( s
f7d0: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61  qlite3PagerGetDa
f7e0: 74 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  ta(pPage->pDbPag
f7f0: 65 29 3d 3d 70 50 61 67 65 2d 3e 61 44 61 74 61  e)==pPage->aData
f800: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
f810: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
f820: 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
f830: 75 74 65 78 29 20 29 3b 0a 20 20 20 20 73 71 6c  utex) );.    sql
f840: 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 4e 6f  ite3PagerUnrefNo
f850: 74 4e 75 6c 6c 28 70 50 61 67 65 2d 3e 70 44 62  tNull(pPage->pDb
f860: 50 61 67 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  Page);.  }.}../*
f870: 0a 2a 2a 20 47 65 74 20 61 6e 20 75 6e 75 73 65  .** Get an unuse
f880: 64 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  d page..**.** Th
f890: 69 73 20 77 6f 72 6b 73 20 6a 75 73 74 20 6c 69  is works just li
f8a0: 6b 65 20 62 74 72 65 65 47 65 74 50 61 67 65 28  ke btreeGetPage(
f8b0: 29 20 77 69 74 68 20 74 68 65 20 61 64 64 69 74  ) with the addit
f8c0: 69 6f 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20  ion:.**.**   *  
f8d0: 49 66 20 74 68 65 20 70 61 67 65 20 69 73 20 61  If the page is a
f8e0: 6c 72 65 61 64 79 20 69 6e 20 75 73 65 20 66 6f  lready in use fo
f8f0: 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 75 72  r some other pur
f900: 70 6f 73 65 2c 20 69 6d 6d 65 64 69 61 74 65 6c  pose, immediatel
f910: 79 0a 2a 2a 20 20 20 20 20 20 72 65 6c 65 61 73  y.**      releas
f920: 65 20 69 74 20 61 6e 64 20 72 65 74 75 72 6e 20  e it and return 
f930: 61 6e 20 53 51 4c 49 54 45 5f 43 55 52 52 55 50  an SQLITE_CURRUP
f940: 54 20 65 72 72 6f 72 2e 0a 2a 2a 20 20 20 2a 20  T error..**   * 
f950: 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 69   Make sure the i
f960: 73 49 6e 69 74 20 66 6c 61 67 20 69 73 20 63 6c  sInit flag is cl
f970: 65 61 72 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ear.*/.static in
f980: 74 20 62 74 72 65 65 47 65 74 55 6e 75 73 65 64  t btreeGetUnused
f990: 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64  Page(.  BtShared
f9a0: 20 2a 70 42 74 2c 20 20 20 20 20 20 20 2f 2a 20   *pBt,       /* 
f9b0: 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 50  The btree */.  P
f9c0: 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20  gno pgno,       
f9d0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
f9e0: 20 74 68 65 20 70 61 67 65 20 74 6f 20 66 65 74   the page to fet
f9f0: 63 68 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  ch */.  MemPage 
fa00: 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 2f 2a 20  **ppPage,    /* 
fa10: 52 65 74 75 72 6e 20 74 68 65 20 70 61 67 65 20  Return the page 
fa20: 69 6e 20 74 68 69 73 20 70 61 72 61 6d 65 74 65  in this paramete
fa30: 72 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73  r */.  int flags
fa40: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
fa50: 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45  AGER_GET_NOCONTE
fa60: 4e 54 20 6f 72 20 50 41 47 45 52 5f 47 45 54 5f  NT or PAGER_GET_
fa70: 52 45 41 44 4f 4e 4c 59 20 2a 2f 0a 29 7b 0a 20  READONLY */.){. 
fa80: 20 69 6e 74 20 72 63 20 3d 20 62 74 72 65 65 47   int rc = btreeG
fa90: 65 74 50 61 67 65 28 70 42 74 2c 20 70 67 6e 6f  etPage(pBt, pgno
faa0: 2c 20 70 70 50 61 67 65 2c 20 66 6c 61 67 73 29  , ppPage, flags)
fab0: 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
fac0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
fad0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
fae0: 65 52 65 66 63 6f 75 6e 74 28 28 2a 70 70 50 61  eRefcount((*ppPa
faf0: 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3e 31 20  ge)->pDbPage)>1 
fb00: 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  ){.      release
fb10: 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20  Page(*ppPage);. 
fb20: 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 30       *ppPage = 0
fb30: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
fb40: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
fb50: 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 28 2a  PT;.    }.    (*
fb60: 70 70 50 61 67 65 29 2d 3e 69 73 49 6e 69 74 20  ppPage)->isInit 
fb70: 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
fb80: 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20    *ppPage = 0;. 
fb90: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
fba0: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 44 75 72 69 6e 67  }.../*.** During
fbb0: 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 77 68 65   a rollback, whe
fbc0: 6e 20 74 68 65 20 70 61 67 65 72 20 72 65 6c 6f  n the pager relo
fbd0: 61 64 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ads information 
fbe0: 69 6e 74 6f 20 74 68 65 20 63 61 63 68 65 0a 2a  into the cache.*
fbf0: 2a 20 73 6f 20 74 68 61 74 20 74 68 65 20 63 61  * so that the ca
fc00: 63 68 65 20 69 73 20 72 65 73 74 6f 72 65 64 20  che is restored 
fc10: 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20  to its original 
fc20: 73 74 61 74 65 20 61 74 20 74 68 65 20 73 74 61  state at the sta
fc30: 72 74 20 6f 66 0a 2a 2a 20 74 68 65 20 74 72 61  rt of.** the tra
fc40: 6e 73 61 63 74 69 6f 6e 2c 20 66 6f 72 20 65 61  nsaction, for ea
fc50: 63 68 20 70 61 67 65 20 72 65 73 74 6f 72 65 64  ch page restored
fc60: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
fc70: 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54   called..**.** T
fc80: 68 69 73 20 72 6f 75 74 69 6e 65 20 6e 65 65 64  his routine need
fc90: 73 20 74 6f 20 72 65 73 65 74 20 74 68 65 20 65  s to reset the e
fca0: 78 74 72 61 20 64 61 74 61 20 73 65 63 74 69 6f  xtra data sectio
fcb0: 6e 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  n at the end of 
fcc0: 74 68 65 0a 2a 2a 20 70 61 67 65 20 74 6f 20 61  the.** page to a
fcd0: 67 72 65 65 20 77 69 74 68 20 74 68 65 20 72 65  gree with the re
fce0: 73 74 6f 72 65 64 20 64 61 74 61 2e 0a 2a 2f 0a  stored data..*/.
fcf0: 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
fd00: 52 65 69 6e 69 74 28 44 62 50 61 67 65 20 2a 70  Reinit(DbPage *p
fd10: 44 61 74 61 29 7b 0a 20 20 4d 65 6d 50 61 67 65  Data){.  MemPage
fd20: 20 2a 70 50 61 67 65 3b 0a 20 20 70 50 61 67 65   *pPage;.  pPage
fd30: 20 3d 20 28 4d 65 6d 50 61 67 65 20 2a 29 73 71   = (MemPage *)sq
fd40: 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74  lite3PagerGetExt
fd50: 72 61 28 70 44 61 74 61 29 3b 0a 20 20 61 73 73  ra(pData);.  ass
fd60: 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
fd70: 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28 70 44  rPageRefcount(pD
fd80: 61 74 61 29 3e 30 20 29 3b 0a 20 20 69 66 28 20  ata)>0 );.  if( 
fd90: 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 7b  pPage->isInit ){
fda0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
fdb0: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
fdc0: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
fdd0: 78 29 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d  x) );.    pPage-
fde0: 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 20  >isInit = 0;.   
fdf0: 20 69 66 28 20 73 71 6c 69 74 65 33 50 61 67 65   if( sqlite3Page
fe00: 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28 70 44  rPageRefcount(pD
fe10: 61 74 61 29 3e 31 20 29 7b 0a 20 20 20 20 20 20  ata)>1 ){.      
fe20: 2f 2a 20 70 50 61 67 65 20 6d 69 67 68 74 20 6e  /* pPage might n
fe30: 6f 74 20 62 65 20 61 20 62 74 72 65 65 20 70 61  ot be a btree pa
fe40: 67 65 3b 20 20 69 74 20 6d 69 67 68 74 20 62 65  ge;  it might be
fe50: 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
fe60: 65 0a 20 20 20 20 20 20 2a 2a 20 6f 72 20 70 74  e.      ** or pt
fe70: 72 6d 61 70 20 70 61 67 65 20 6f 72 20 61 20 66  rmap page or a f
fe80: 72 65 65 20 70 61 67 65 2e 20 20 49 6e 20 74 68  ree page.  In th
fe90: 6f 73 65 20 63 61 73 65 73 2c 20 74 68 65 20 66  ose cases, the f
fea0: 6f 6c 6c 6f 77 69 6e 67 0a 20 20 20 20 20 20 2a  ollowing.      *
feb0: 2a 20 63 61 6c 6c 20 74 6f 20 62 74 72 65 65 49  * call to btreeI
fec0: 6e 69 74 50 61 67 65 28 29 20 77 69 6c 6c 20 6c  nitPage() will l
fed0: 69 6b 65 6c 79 20 72 65 74 75 72 6e 20 53 51 4c  ikely return SQL
fee0: 49 54 45 5f 43 4f 52 52 55 50 54 2e 0a 20 20 20  ITE_CORRUPT..   
fef0: 20 20 20 2a 2a 20 42 75 74 20 6e 6f 20 68 61 72     ** But no har
ff00: 6d 20 69 73 20 64 6f 6e 65 20 62 79 20 74 68 69  m is done by thi
ff10: 73 2e 20 20 41 6e 64 20 69 74 20 69 73 20 76 65  s.  And it is ve
ff20: 72 79 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61  ry important tha
ff30: 74 0a 20 20 20 20 20 20 2a 2a 20 62 74 72 65 65  t.      ** btree
ff40: 49 6e 69 74 50 61 67 65 28 29 20 62 65 20 63 61  InitPage() be ca
ff50: 6c 6c 65 64 20 6f 6e 20 65 76 65 72 79 20 62 74  lled on every bt
ff60: 72 65 65 20 70 61 67 65 20 73 6f 20 77 65 20 6d  ree page so we m
ff70: 61 6b 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  ake.      ** the
ff80: 20 63 61 6c 6c 20 66 6f 72 20 65 76 65 72 79 20   call for every 
ff90: 70 61 67 65 20 74 68 61 74 20 63 6f 6d 65 73 20  page that comes 
ffa0: 69 6e 20 66 6f 72 20 72 65 2d 69 6e 69 74 69 6e  in for re-initin
ffb0: 67 2e 20 2a 2f 0a 20 20 20 20 20 20 62 74 72 65  g. */.      btre
ffc0: 65 49 6e 69 74 50 61 67 65 28 70 50 61 67 65 29  eInitPage(pPage)
ffd0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
ffe0: 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20  *.** Invoke the 
fff0: 62 75 73 79 20 68 61 6e 64 6c 65 72 20 66 6f 72  busy handler for
10000 20 61 20 62 74 72 65 65 2e 0a 2a 2f 0a 73 74 61   a btree..*/.sta
10010 74 69 63 20 69 6e 74 20 62 74 72 65 65 49 6e 76  tic int btreeInv
10020 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 28 76  okeBusyHandler(v
10030 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 42 74  oid *pArg){.  Bt
10040 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 28 42  Shared *pBt = (B
10050 74 53 68 61 72 65 64 2a 29 70 41 72 67 3b 0a 20  tShared*)pArg;. 
10060 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 64 62   assert( pBt->db
10070 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
10080 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
10090 28 70 42 74 2d 3e 64 62 2d 3e 6d 75 74 65 78 29  (pBt->db->mutex)
100a0 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c   );.  return sql
100b0 69 74 65 33 49 6e 76 6f 6b 65 42 75 73 79 48 61  ite3InvokeBusyHa
100c0 6e 64 6c 65 72 28 26 70 42 74 2d 3e 64 62 2d 3e  ndler(&pBt->db->
100d0 62 75 73 79 48 61 6e 64 6c 65 72 29 3b 0a 7d 0a  busyHandler);.}.
100e0 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 64 61  ./*.** Open a da
100f0 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20  tabase file..** 
10100 0a 2a 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73  .** zFilename is
10110 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
10120 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
10130 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73   If zFilename is
10140 20 4e 55 4c 4c 0a 2a 2a 20 74 68 65 6e 20 61 6e   NULL.** then an
10150 20 65 70 68 65 6d 65 72 61 6c 20 64 61 74 61 62   ephemeral datab
10160 61 73 65 20 69 73 20 63 72 65 61 74 65 64 2e 20  ase is created. 
10170 20 54 68 65 20 65 70 68 65 6d 65 72 61 6c 20 64   The ephemeral d
10180 61 74 61 62 61 73 65 20 6d 69 67 68 74 0a 2a 2a  atabase might.**
10190 20 62 65 20 65 78 63 6c 75 73 69 76 65 6c 79 20   be exclusively 
101a0 69 6e 20 6d 65 6d 6f 72 79 2c 20 6f 72 20 69 74  in memory, or it
101b0 20 6d 69 67 68 74 20 75 73 65 20 61 20 64 69 73   might use a dis
101c0 6b 2d 62 61 73 65 64 20 6d 65 6d 6f 72 79 20 63  k-based memory c
101d0 61 63 68 65 2e 0a 2a 2a 20 45 69 74 68 65 72 20  ache..** Either 
101e0 77 61 79 2c 20 74 68 65 20 65 70 68 65 6d 65 72  way, the ephemer
101f0 61 6c 20 64 61 74 61 62 61 73 65 20 77 69 6c 6c  al database will
10200 20 62 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c   be automaticall
10210 79 20 64 65 6c 65 74 65 64 20 0a 2a 2a 20 77 68  y deleted .** wh
10220 65 6e 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  en sqlite3BtreeC
10230 6c 6f 73 65 28 29 20 69 73 20 63 61 6c 6c 65 64  lose() is called
10240 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 46 69 6c 65  ..**.** If zFile
10250 6e 61 6d 65 20 69 73 20 22 3a 6d 65 6d 6f 72 79  name is ":memory
10260 3a 22 20 74 68 65 6e 20 61 6e 20 69 6e 2d 6d 65  :" then an in-me
10270 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20 69 73  mory database is
10280 20 63 72 65 61 74 65 64 0a 2a 2a 20 74 68 61 74   created.** that
10290 20 69 73 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c   is automaticall
102a0 79 20 64 65 73 74 72 6f 79 65 64 20 77 68 65 6e  y destroyed when
102b0 20 69 74 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a   it is closed..*
102c0 2a 0a 2a 2a 20 54 68 65 20 22 66 6c 61 67 73 22  *.** The "flags"
102d0 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 61 20   parameter is a 
102e0 62 69 74 6d 61 73 6b 20 74 68 61 74 20 6d 69 67  bitmask that mig
102f0 68 74 20 63 6f 6e 74 61 69 6e 20 62 69 74 73 20  ht contain bits 
10300 6c 69 6b 65 0a 2a 2a 20 42 54 52 45 45 5f 4f 4d  like.** BTREE_OM
10310 49 54 5f 4a 4f 55 52 4e 41 4c 20 61 6e 64 2f 6f  IT_JOURNAL and/o
10320 72 20 42 54 52 45 45 5f 4d 45 4d 4f 52 59 2e 0a  r BTREE_MEMORY..
10330 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64 61 74  **.** If the dat
10340 61 62 61 73 65 20 69 73 20 61 6c 72 65 61 64 79  abase is already
10350 20 6f 70 65 6e 65 64 20 69 6e 20 74 68 65 20 73   opened in the s
10360 61 6d 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  ame database con
10370 6e 65 63 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 77  nection.** and w
10380 65 20 61 72 65 20 69 6e 20 73 68 61 72 65 64 20  e are in shared 
10390 63 61 63 68 65 20 6d 6f 64 65 2c 20 74 68 65 6e  cache mode, then
103a0 20 74 68 65 20 6f 70 65 6e 20 77 69 6c 6c 20 66   the open will f
103b0 61 69 6c 20 77 69 74 68 20 61 6e 0a 2a 2a 20 53  ail with an.** S
103c0 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
103d0 20 65 72 72 6f 72 2e 20 20 57 65 20 63 61 6e 6e   error.  We cann
103e0 6f 74 20 61 6c 6c 6f 77 20 74 77 6f 20 6f 72 20  ot allow two or 
103f0 6d 6f 72 65 20 42 74 53 68 61 72 65 64 0a 2a 2a  more BtShared.**
10400 20 6f 62 6a 65 63 74 73 20 69 6e 20 74 68 65 20   objects in the 
10410 73 61 6d 65 20 64 61 74 61 62 61 73 65 20 63 6f  same database co
10420 6e 6e 65 63 74 69 6f 6e 20 73 69 6e 63 65 20 64  nnection since d
10430 6f 69 6e 67 20 73 6f 20 77 69 6c 6c 20 6c 65 61  oing so will lea
10440 64 0a 2a 2a 20 74 6f 20 70 72 6f 62 6c 65 6d 73  d.** to problems
10450 20 77 69 74 68 20 6c 6f 63 6b 69 6e 67 2e 0a 2a   with locking..*
10460 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
10470 65 65 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74 65  eeOpen(.  sqlite
10480 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20  3_vfs *pVfs,    
10490 20 20 2f 2a 20 56 46 53 20 74 6f 20 75 73 65 20    /* VFS to use 
104a0 66 6f 72 20 74 68 69 73 20 62 2d 74 72 65 65 20  for this b-tree 
104b0 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
104c0 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 2f 2a 20  *zFilename,  /* 
104d0 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65  Name of the file
104e0 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
104f0 42 54 72 65 65 20 64 61 74 61 62 61 73 65 20 2a  BTree database *
10500 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  /.  sqlite3 *db,
10510 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
10520 73 73 6f 63 69 61 74 65 64 20 64 61 74 61 62 61  ssociated databa
10530 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 42  se handle */.  B
10540 74 72 65 65 20 2a 2a 70 70 42 74 72 65 65 2c 20  tree **ppBtree, 
10550 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
10560 72 20 74 6f 20 6e 65 77 20 42 74 72 65 65 20 6f  r to new Btree o
10570 62 6a 65 63 74 20 77 72 69 74 74 65 6e 20 68 65  bject written he
10580 72 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  re */.  int flag
10590 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s,              
105a0 2f 2a 20 4f 70 74 69 6f 6e 73 20 2a 2f 0a 20 20  /* Options */.  
105b0 69 6e 74 20 76 66 73 46 6c 61 67 73 20 20 20 20  int vfsFlags    
105c0 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73          /* Flags
105d0 20 70 61 73 73 65 64 20 74 68 72 6f 75 67 68 20   passed through 
105e0 74 6f 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 78  to sqlite3_vfs.x
105f0 4f 70 65 6e 28 29 20 2a 2f 0a 29 7b 0a 20 20 42  Open() */.){.  B
10600 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 30  tShared *pBt = 0
10610 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
10620 20 53 68 61 72 65 64 20 70 61 72 74 20 6f 66 20   Shared part of 
10630 62 74 72 65 65 20 73 74 72 75 63 74 75 72 65 20  btree structure 
10640 2a 2f 0a 20 20 42 74 72 65 65 20 2a 70 3b 20 20  */.  Btree *p;  
10650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10660 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 74 6f      /* Handle to
10670 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 73 71 6c   return */.  sql
10680 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65  ite3_mutex *mute
10690 78 4f 70 65 6e 20 3d 20 30 3b 20 20 2f 2a 20 50  xOpen = 0;  /* P
106a0 72 65 76 65 6e 74 73 20 61 20 72 61 63 65 20 63  revents a race c
106b0 6f 6e 64 69 74 69 6f 6e 2e 20 54 69 63 6b 65 74  ondition. Ticket
106c0 20 23 33 35 33 37 20 2a 2f 0a 20 20 69 6e 74 20   #3537 */.  int 
106d0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
106e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
106f0 73 75 6c 74 20 63 6f 64 65 20 66 72 6f 6d 20 74  sult code from t
10700 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  his function */.
10710 20 20 75 38 20 6e 52 65 73 65 72 76 65 3b 20 20    u8 nReserve;  
10720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10730 20 2f 2a 20 42 79 74 65 20 6f 66 20 75 6e 75 73   /* Byte of unus
10740 65 64 20 73 70 61 63 65 20 6f 6e 20 65 61 63 68  ed space on each
10750 20 70 61 67 65 20 2a 2f 0a 20 20 75 6e 73 69 67   page */.  unsig
10760 6e 65 64 20 63 68 61 72 20 7a 44 62 48 65 61 64  ned char zDbHead
10770 65 72 5b 31 30 30 5d 3b 20 20 2f 2a 20 44 61 74  er[100];  /* Dat
10780 61 62 61 73 65 20 68 65 61 64 65 72 20 63 6f 6e  abase header con
10790 74 65 6e 74 20 2a 2f 0a 0a 20 20 2f 2a 20 54 72  tent */..  /* Tr
107a0 75 65 20 69 66 20 6f 70 65 6e 69 6e 67 20 61 6e  ue if opening an
107b0 20 65 70 68 65 6d 65 72 61 6c 2c 20 74 65 6d 70   ephemeral, temp
107c0 6f 72 61 72 79 20 64 61 74 61 62 61 73 65 20 2a  orary database *
107d0 2f 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 73  /.  const int is
107e0 54 65 6d 70 44 62 20 3d 20 7a 46 69 6c 65 6e 61  TempDb = zFilena
107f0 6d 65 3d 3d 30 20 7c 7c 20 7a 46 69 6c 65 6e 61  me==0 || zFilena
10800 6d 65 5b 30 5d 3d 3d 30 3b 0a 0a 20 20 2f 2a 20  me[0]==0;..  /* 
10810 53 65 74 20 74 68 65 20 76 61 72 69 61 62 6c 65  Set the variable
10820 20 69 73 4d 65 6d 64 62 20 74 6f 20 74 72 75 65   isMemdb to true
10830 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72   for an in-memor
10840 79 20 64 61 74 61 62 61 73 65 2c 20 6f 72 20 0a  y database, or .
10850 20 20 2a 2a 20 66 61 6c 73 65 20 66 6f 72 20 61    ** false for a
10860 20 66 69 6c 65 2d 62 61 73 65 64 20 64 61 74 61   file-based data
10870 62 61 73 65 2e 0a 20 20 2a 2f 0a 23 69 66 64 65  base..  */.#ifde
10880 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45  f SQLITE_OMIT_ME
10890 4d 4f 52 59 44 42 0a 20 20 63 6f 6e 73 74 20 69  MORYDB.  const i
108a0 6e 74 20 69 73 4d 65 6d 64 62 20 3d 20 30 3b 0a  nt isMemdb = 0;.
108b0 23 65 6c 73 65 0a 20 20 63 6f 6e 73 74 20 69 6e  #else.  const in
108c0 74 20 69 73 4d 65 6d 64 62 20 3d 20 28 7a 46 69  t isMemdb = (zFi
108d0 6c 65 6e 61 6d 65 20 26 26 20 73 74 72 63 6d 70  lename && strcmp
108e0 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 22 3a 6d 65  (zFilename, ":me
108f0 6d 6f 72 79 3a 22 29 3d 3d 30 29 0a 20 20 20 20  mory:")==0).    
10900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10910 20 20 20 7c 7c 20 28 69 73 54 65 6d 70 44 62 20     || (isTempDb 
10920 26 26 20 73 71 6c 69 74 65 33 54 65 6d 70 49 6e  && sqlite3TempIn
10930 4d 65 6d 6f 72 79 28 64 62 29 29 0a 20 20 20 20  Memory(db)).    
10940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10950 20 20 20 7c 7c 20 28 76 66 73 46 6c 61 67 73 20     || (vfsFlags 
10960 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 45  & SQLITE_OPEN_ME
10970 4d 4f 52 59 29 21 3d 30 3b 0a 23 65 6e 64 69 66  MORY)!=0;.#endif
10980 0a 0a 20 20 61 73 73 65 72 74 28 20 64 62 21 3d  ..  assert( db!=
10990 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
109a0 56 66 73 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  Vfs!=0 );.  asse
109b0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
109c0 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78  x_held(db->mutex
109d0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  ) );.  assert( (
109e0 66 6c 61 67 73 26 30 78 66 66 29 3d 3d 66 6c 61  flags&0xff)==fla
109f0 67 73 20 29 3b 20 20 20 2f 2a 20 66 6c 61 67 73  gs );   /* flags
10a00 20 66 69 74 20 69 6e 20 38 20 62 69 74 73 20 2a   fit in 8 bits *
10a10 2f 0a 0a 20 20 2f 2a 20 4f 6e 6c 79 20 61 20 42  /..  /* Only a B
10a20 54 52 45 45 5f 53 49 4e 47 4c 45 20 64 61 74 61  TREE_SINGLE data
10a30 62 61 73 65 20 63 61 6e 20 62 65 20 42 54 52 45  base can be BTRE
10a40 45 5f 55 4e 4f 52 44 45 52 45 44 20 2a 2f 0a 20  E_UNORDERED */. 
10a50 20 61 73 73 65 72 74 28 20 28 66 6c 61 67 73 20   assert( (flags 
10a60 26 20 42 54 52 45 45 5f 55 4e 4f 52 44 45 52 45  & BTREE_UNORDERE
10a70 44 29 3d 3d 30 20 7c 7c 20 28 66 6c 61 67 73 20  D)==0 || (flags 
10a80 26 20 42 54 52 45 45 5f 53 49 4e 47 4c 45 29 21  & BTREE_SINGLE)!
10a90 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 41 20 42 54  =0 );..  /* A BT
10aa0 52 45 45 5f 53 49 4e 47 4c 45 20 64 61 74 61 62  REE_SINGLE datab
10ab0 61 73 65 20 69 73 20 61 6c 77 61 79 73 20 61 20  ase is always a 
10ac0 74 65 6d 70 6f 72 61 72 79 20 61 6e 64 2f 6f 72  temporary and/or
10ad0 20 65 70 68 65 6d 65 72 61 6c 20 2a 2f 0a 20 20   ephemeral */.  
10ae0 61 73 73 65 72 74 28 20 28 66 6c 61 67 73 20 26  assert( (flags &
10af0 20 42 54 52 45 45 5f 53 49 4e 47 4c 45 29 3d 3d   BTREE_SINGLE)==
10b00 30 20 7c 7c 20 69 73 54 65 6d 70 44 62 20 29 3b  0 || isTempDb );
10b10 0a 0a 20 20 69 66 28 20 69 73 4d 65 6d 64 62 20  ..  if( isMemdb 
10b20 29 7b 0a 20 20 20 20 66 6c 61 67 73 20 7c 3d 20  ){.    flags |= 
10b30 42 54 52 45 45 5f 4d 45 4d 4f 52 59 3b 0a 20 20  BTREE_MEMORY;.  
10b40 7d 0a 20 20 69 66 28 20 28 76 66 73 46 6c 61 67  }.  if( (vfsFlag
10b50 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
10b60 4d 41 49 4e 5f 44 42 29 21 3d 30 20 26 26 20 28  MAIN_DB)!=0 && (
10b70 69 73 4d 65 6d 64 62 20 7c 7c 20 69 73 54 65 6d  isMemdb || isTem
10b80 70 44 62 29 20 29 7b 0a 20 20 20 20 76 66 73 46  pDb) ){.    vfsF
10b90 6c 61 67 73 20 3d 20 28 76 66 73 46 6c 61 67 73  lags = (vfsFlags
10ba0 20 26 20 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f   & ~SQLITE_OPEN_
10bb0 4d 41 49 4e 5f 44 42 29 20 7c 20 53 51 4c 49 54  MAIN_DB) | SQLIT
10bc0 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 3b 0a  E_OPEN_TEMP_DB;.
10bd0 20 20 7d 0a 20 20 70 20 3d 20 73 71 6c 69 74 65    }.  p = sqlite
10be0 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a 65  3MallocZero(size
10bf0 6f 66 28 42 74 72 65 65 29 29 3b 0a 20 20 69 66  of(Btree));.  if
10c00 28 20 21 70 20 29 7b 0a 20 20 20 20 72 65 74 75  ( !p ){.    retu
10c10 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
10c20 0a 20 20 7d 0a 20 20 70 2d 3e 69 6e 54 72 61 6e  .  }.  p->inTran
10c30 73 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a  s = TRANS_NONE;.
10c40 20 20 70 2d 3e 64 62 20 3d 20 64 62 3b 0a 23 69    p->db = db;.#i
10c50 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
10c60 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20  T_SHARED_CACHE. 
10c70 20 70 2d 3e 6c 6f 63 6b 2e 70 42 74 72 65 65 20   p->lock.pBtree 
10c80 3d 20 70 3b 0a 20 20 70 2d 3e 6c 6f 63 6b 2e 69  = p;.  p->lock.i
10c90 54 61 62 6c 65 20 3d 20 31 3b 0a 23 65 6e 64 69  Table = 1;.#endi
10ca0 66 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  f..#if !defined(
10cb0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
10cc0 45 44 5f 43 41 43 48 45 29 20 26 26 20 21 64 65  ED_CACHE) && !de
10cd0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
10ce0 54 5f 44 49 53 4b 49 4f 29 0a 20 20 2f 2a 0a 20  T_DISKIO).  /*. 
10cf0 20 2a 2a 20 49 66 20 74 68 69 73 20 42 74 72 65   ** If this Btre
10d00 65 20 69 73 20 61 20 63 61 6e 64 69 64 61 74 65  e is a candidate
10d10 20 66 6f 72 20 73 68 61 72 65 64 20 63 61 63 68   for shared cach
10d20 65 2c 20 74 72 79 20 74 6f 20 66 69 6e 64 20 61  e, try to find a
10d30 6e 0a 20 20 2a 2a 20 65 78 69 73 74 69 6e 67 20  n.  ** existing 
10d40 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74 20  BtShared object 
10d50 74 68 61 74 20 77 65 20 63 61 6e 20 73 68 61 72  that we can shar
10d60 65 20 77 69 74 68 0a 20 20 2a 2f 0a 20 20 69 66  e with.  */.  if
10d70 28 20 69 73 54 65 6d 70 44 62 3d 3d 30 20 26 26  ( isTempDb==0 &&
10d80 20 28 69 73 4d 65 6d 64 62 3d 3d 30 20 7c 7c 20   (isMemdb==0 || 
10d90 28 76 66 73 46 6c 61 67 73 26 53 51 4c 49 54 45  (vfsFlags&SQLITE
10da0 5f 4f 50 45 4e 5f 55 52 49 29 21 3d 30 29 20 29  _OPEN_URI)!=0) )
10db0 7b 0a 20 20 20 20 69 66 28 20 76 66 73 46 6c 61  {.    if( vfsFla
10dc0 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
10dd0 5f 53 48 41 52 45 44 43 41 43 48 45 20 29 7b 0a  _SHAREDCACHE ){.
10de0 20 20 20 20 20 20 69 6e 74 20 6e 46 69 6c 65 6e        int nFilen
10df0 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72  ame = sqlite3Str
10e00 6c 65 6e 33 30 28 7a 46 69 6c 65 6e 61 6d 65 29  len30(zFilename)
10e10 2b 31 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 46  +1;.      int nF
10e20 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 70 56  ullPathname = pV
10e30 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31  fs->mxPathname+1
10e40 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 46  ;.      char *zF
10e50 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73 71  ullPathname = sq
10e60 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 4d 41 58 28  lite3Malloc(MAX(
10e70 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 6e 46  nFullPathname,nF
10e80 69 6c 65 6e 61 6d 65 29 29 3b 0a 20 20 20 20 20  ilename));.     
10e90 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20 73 71   MUTEX_LOGIC( sq
10ea0 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74  lite3_mutex *mut
10eb0 65 78 53 68 61 72 65 64 3b 20 29 0a 0a 20 20 20  exShared; )..   
10ec0 20 20 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 3d     p->sharable =
10ed0 20 31 3b 0a 20 20 20 20 20 20 69 66 28 20 21 7a   1;.      if( !z
10ee0 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 29 7b 0a  FullPathname ){.
10ef0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
10f00 66 72 65 65 28 70 29 3b 0a 20 20 20 20 20 20 20  free(p);.       
10f10 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
10f20 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  OMEM;.      }.  
10f30 20 20 20 20 69 66 28 20 69 73 4d 65 6d 64 62 20      if( isMemdb 
10f40 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  ){.        memcp
10f50 79 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c  y(zFullPathname,
10f60 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 46 69 6c   zFilename, nFil
10f70 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 65  ename);.      }e
10f80 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20  lse{.        rc 
10f90 3d 20 73 71 6c 69 74 65 33 4f 73 46 75 6c 6c 50  = sqlite3OsFullP
10fa0 61 74 68 6e 61 6d 65 28 70 56 66 73 2c 20 7a 46  athname(pVfs, zF
10fb0 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 20 20 20 20  ilename,.       
10fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10fd0 20 20 20 20 20 20 20 20 20 20 20 20 6e 46 75 6c              nFul
10fe0 6c 50 61 74 68 6e 61 6d 65 2c 20 7a 46 75 6c 6c  lPathname, zFull
10ff0 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20  Pathname);.     
11000 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
11010 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
11020 72 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  ree(zFullPathnam
11030 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  e);.          sq
11040 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20  lite3_free(p);. 
11050 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
11060 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rc;.        }.  
11070 20 20 20 20 7d 0a 23 69 66 20 53 51 4c 49 54 45      }.#if SQLITE
11080 5f 54 48 52 45 41 44 53 41 46 45 0a 20 20 20 20  _THREADSAFE.    
11090 20 20 6d 75 74 65 78 4f 70 65 6e 20 3d 20 73 71    mutexOpen = sq
110a0 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28  lite3MutexAlloc(
110b0 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41  SQLITE_MUTEX_STA
110c0 54 49 43 5f 4f 50 45 4e 29 3b 0a 20 20 20 20 20  TIC_OPEN);.     
110d0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
110e0 6e 74 65 72 28 6d 75 74 65 78 4f 70 65 6e 29 3b  nter(mutexOpen);
110f0 0a 20 20 20 20 20 20 6d 75 74 65 78 53 68 61 72  .      mutexShar
11100 65 64 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65  ed = sqlite3Mute
11110 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55  xAlloc(SQLITE_MU
11120 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45  TEX_STATIC_MASTE
11130 52 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  R);.      sqlite
11140 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 75  3_mutex_enter(mu
11150 74 65 78 53 68 61 72 65 64 29 3b 0a 23 65 6e 64  texShared);.#end
11160 69 66 0a 20 20 20 20 20 20 66 6f 72 28 70 42 74  if.      for(pBt
11170 3d 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64  =GLOBAL(BtShared
11180 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64 43  *,sqlite3SharedC
11190 61 63 68 65 4c 69 73 74 29 3b 20 70 42 74 3b 20  acheList); pBt; 
111a0 70 42 74 3d 70 42 74 2d 3e 70 4e 65 78 74 29 7b  pBt=pBt->pNext){
111b0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
111c0 20 70 42 74 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a   pBt->nRef>0 );.
111d0 20 20 20 20 20 20 20 20 69 66 28 20 30 3d 3d 73          if( 0==s
111e0 74 72 63 6d 70 28 7a 46 75 6c 6c 50 61 74 68 6e  trcmp(zFullPathn
111f0 61 6d 65 2c 20 73 71 6c 69 74 65 33 50 61 67 65  ame, sqlite3Page
11200 72 46 69 6c 65 6e 61 6d 65 28 70 42 74 2d 3e 70  rFilename(pBt->p
11210 50 61 67 65 72 2c 20 30 29 29 0a 20 20 20 20 20  Pager, 0)).     
11220 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 73              && s
11230 71 6c 69 74 65 33 50 61 67 65 72 56 66 73 28 70  qlite3PagerVfs(p
11240 42 74 2d 3e 70 50 61 67 65 72 29 3d 3d 70 56 66  Bt->pPager)==pVf
11250 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  s ){.          i
11260 6e 74 20 69 44 62 3b 0a 20 20 20 20 20 20 20 20  nt iDb;.        
11270 20 20 66 6f 72 28 69 44 62 3d 64 62 2d 3e 6e 44    for(iDb=db->nD
11280 62 2d 31 3b 20 69 44 62 3e 3d 30 3b 20 69 44 62  b-1; iDb>=0; iDb
11290 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  --){.           
112a0 20 42 74 72 65 65 20 2a 70 45 78 69 73 74 69 6e   Btree *pExistin
112b0 67 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  g = db->aDb[iDb]
112c0 2e 70 42 74 3b 0a 20 20 20 20 20 20 20 20 20 20  .pBt;.          
112d0 20 20 69 66 28 20 70 45 78 69 73 74 69 6e 67 20    if( pExisting 
112e0 26 26 20 70 45 78 69 73 74 69 6e 67 2d 3e 70 42  && pExisting->pB
112f0 74 3d 3d 70 42 74 20 29 7b 0a 20 20 20 20 20 20  t==pBt ){.      
11300 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
11310 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65  mutex_leave(mute
11320 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20 20  xShared);.      
11330 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
11340 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65  mutex_leave(mute
11350 78 4f 70 65 6e 29 3b 0a 20 20 20 20 20 20 20 20  xOpen);.        
11360 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
11370 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  ee(zFullPathname
11380 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
11390 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29   sqlite3_free(p)
113a0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
113b0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
113c0 4e 53 54 52 41 49 4e 54 3b 0a 20 20 20 20 20 20  NSTRAINT;.      
113d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
113e0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 2d    }.          p-
113f0 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 20 20  >pBt = pBt;.    
11400 20 20 20 20 20 20 70 42 74 2d 3e 6e 52 65 66 2b        pBt->nRef+
11410 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  +;.          bre
11420 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
11430 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
11440 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
11450 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20  mutexShared);.  
11460 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
11470 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b  (zFullPathname);
11480 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51  .    }.#ifdef SQ
11490 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 65  LITE_DEBUG.    e
114a0 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e  lse{.      /* In
114b0 20 64 65 62 75 67 20 6d 6f 64 65 2c 20 77 65 20   debug mode, we 
114c0 6d 61 72 6b 20 61 6c 6c 20 70 65 72 73 69 73 74  mark all persist
114d0 65 6e 74 20 64 61 74 61 62 61 73 65 73 20 61 73  ent databases as
114e0 20 73 68 61 72 61 62 6c 65 0a 20 20 20 20 20 20   sharable.      
114f0 2a 2a 20 65 76 65 6e 20 77 68 65 6e 20 74 68 65  ** even when the
11500 79 20 61 72 65 20 6e 6f 74 2e 20 20 54 68 69 73  y are not.  This
11510 20 65 78 65 72 63 69 73 65 73 20 74 68 65 20 6c   exercises the l
11520 6f 63 6b 69 6e 67 20 63 6f 64 65 20 61 6e 64 0a  ocking code and.
11530 20 20 20 20 20 20 2a 2a 20 67 69 76 65 73 20 6d        ** gives m
11540 6f 72 65 20 6f 70 70 6f 72 74 75 6e 69 74 79 20  ore opportunity 
11550 66 6f 72 20 61 73 73 65 72 74 73 28 73 71 6c 69  for asserts(sqli
11560 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 29  te3_mutex_held()
11570 29 0a 20 20 20 20 20 20 2a 2a 20 73 74 61 74 65  ).      ** state
11580 6d 65 6e 74 73 20 74 6f 20 66 69 6e 64 20 6c 6f  ments to find lo
11590 63 6b 69 6e 67 20 70 72 6f 62 6c 65 6d 73 2e 0a  cking problems..
115a0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70        */.      p
115b0 2d 3e 73 68 61 72 61 62 6c 65 20 3d 20 31 3b 0a  ->sharable = 1;.
115c0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
115d0 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 42  .#endif.  if( pB
115e0 74 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 0a 20  t==0 ){.    /*. 
115f0 20 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77     ** The follow
11600 69 6e 67 20 61 73 73 65 72 74 73 20 6d 61 6b 65  ing asserts make
11610 20 73 75 72 65 20 74 68 61 74 20 73 74 72 75 63   sure that struc
11620 74 75 72 65 73 20 75 73 65 64 20 62 79 20 74 68  tures used by th
11630 65 20 62 74 72 65 65 20 61 72 65 0a 20 20 20 20  e btree are.    
11640 2a 2a 20 74 68 65 20 72 69 67 68 74 20 73 69 7a  ** the right siz
11650 65 2e 20 20 54 68 69 73 20 69 73 20 74 6f 20 67  e.  This is to g
11660 75 61 72 64 20 61 67 61 69 6e 73 74 20 73 69 7a  uard against siz
11670 65 20 63 68 61 6e 67 65 73 20 74 68 61 74 20 72  e changes that r
11680 65 73 75 6c 74 0a 20 20 20 20 2a 2a 20 77 68 65  esult.    ** whe
11690 6e 20 63 6f 6d 70 69 6c 69 6e 67 20 6f 6e 20 61  n compiling on a
116a0 20 64 69 66 66 65 72 65 6e 74 20 61 72 63 68 69   different archi
116b0 74 65 63 74 75 72 65 2e 0a 20 20 20 20 2a 2f 0a  tecture..    */.
116c0 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65      assert( size
116d0 6f 66 28 69 36 34 29 3d 3d 38 20 29 3b 0a 20 20  of(i64)==8 );.  
116e0 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66    assert( sizeof
116f0 28 75 36 34 29 3d 3d 38 20 29 3b 0a 20 20 20 20  (u64)==8 );.    
11700 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 75  assert( sizeof(u
11710 33 32 29 3d 3d 34 20 29 3b 0a 20 20 20 20 61 73  32)==4 );.    as
11720 73 65 72 74 28 20 73 69 7a 65 6f 66 28 75 31 36  sert( sizeof(u16
11730 29 3d 3d 32 20 29 3b 0a 20 20 20 20 61 73 73 65  )==2 );.    asse
11740 72 74 28 20 73 69 7a 65 6f 66 28 50 67 6e 6f 29  rt( sizeof(Pgno)
11750 3d 3d 34 20 29 3b 0a 20 20 0a 20 20 20 20 70 42  ==4 );.  .    pB
11760 74 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  t = sqlite3Mallo
11770 63 5a 65 72 6f 28 20 73 69 7a 65 6f 66 28 2a 70  cZero( sizeof(*p
11780 42 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70  Bt) );.    if( p
11790 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  Bt==0 ){.      r
117a0 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
117b0 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 74 72  ;.      goto btr
117c0 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20  ee_open_out;.   
117d0 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69   }.    rc = sqli
117e0 74 65 33 50 61 67 65 72 4f 70 65 6e 28 70 56 66  te3PagerOpen(pVf
117f0 73 2c 20 26 70 42 74 2d 3e 70 50 61 67 65 72 2c  s, &pBt->pPager,
11800 20 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 20   zFilename,.    
11810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11820 20 20 20 20 20 20 45 58 54 52 41 5f 53 49 5a 45        EXTRA_SIZE
11830 2c 20 66 6c 61 67 73 2c 20 76 66 73 46 6c 61 67  , flags, vfsFlag
11840 73 2c 20 70 61 67 65 52 65 69 6e 69 74 29 3b 0a  s, pageReinit);.
11850 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
11860 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73  TE_OK ){.      s
11870 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 4d 6d  qlite3PagerSetMm
11880 61 70 4c 69 6d 69 74 28 70 42 74 2d 3e 70 50 61  apLimit(pBt->pPa
11890 67 65 72 2c 20 64 62 2d 3e 73 7a 4d 6d 61 70 29  ger, db->szMmap)
118a0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
118b0 69 74 65 33 50 61 67 65 72 52 65 61 64 46 69 6c  ite3PagerReadFil
118c0 65 68 65 61 64 65 72 28 70 42 74 2d 3e 70 50 61  eheader(pBt->pPa
118d0 67 65 72 2c 73 69 7a 65 6f 66 28 7a 44 62 48 65  ger,sizeof(zDbHe
118e0 61 64 65 72 29 2c 7a 44 62 48 65 61 64 65 72 29  ader),zDbHeader)
118f0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
11900 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
11910 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 74 72 65  .      goto btre
11920 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20  e_open_out;.    
11930 7d 0a 20 20 20 20 70 42 74 2d 3e 6f 70 65 6e 46  }.    pBt->openF
11940 6c 61 67 73 20 3d 20 28 75 38 29 66 6c 61 67 73  lags = (u8)flags
11950 3b 0a 20 20 20 20 70 42 74 2d 3e 64 62 20 3d 20  ;.    pBt->db = 
11960 64 62 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50  db;.    sqlite3P
11970 61 67 65 72 53 65 74 42 75 73 79 68 61 6e 64 6c  agerSetBusyhandl
11980 65 72 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  er(pBt->pPager, 
11990 62 74 72 65 65 49 6e 76 6f 6b 65 42 75 73 79 48  btreeInvokeBusyH
119a0 61 6e 64 6c 65 72 2c 20 70 42 74 29 3b 0a 20 20  andler, pBt);.  
119b0 20 20 70 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a    p->pBt = pBt;.
119c0 20 20 0a 20 20 20 20 70 42 74 2d 3e 70 43 75 72    .    pBt->pCur
119d0 73 6f 72 20 3d 20 30 3b 0a 20 20 20 20 70 42 74  sor = 0;.    pBt
119e0 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a 20 20  ->pPage1 = 0;.  
119f0 20 20 69 66 28 20 73 71 6c 69 74 65 33 50 61 67    if( sqlite3Pag
11a00 65 72 49 73 72 65 61 64 6f 6e 6c 79 28 70 42 74  erIsreadonly(pBt
11a10 2d 3e 70 50 61 67 65 72 29 20 29 20 70 42 74 2d  ->pPager) ) pBt-
11a20 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53  >btsFlags |= BTS
11a30 5f 52 45 41 44 5f 4f 4e 4c 59 3b 0a 23 69 66 64  _READ_ONLY;.#ifd
11a40 65 66 20 53 51 4c 49 54 45 5f 53 45 43 55 52 45  ef SQLITE_SECURE
11a50 5f 44 45 4c 45 54 45 0a 20 20 20 20 70 42 74 2d  _DELETE.    pBt-
11a60 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53  >btsFlags |= BTS
11a70 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 3b 0a  _SECURE_DELETE;.
11a80 23 65 6e 64 69 66 0a 20 20 20 20 2f 2a 20 45 56  #endif.    /* EV
11a90 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 31 38  IDENCE-OF: R-518
11aa0 37 33 2d 33 39 36 31 38 20 54 68 65 20 70 61 67  73-39618 The pag
11ab0 65 20 73 69 7a 65 20 66 6f 72 20 61 20 64 61 74  e size for a dat
11ac0 61 62 61 73 65 20 66 69 6c 65 20 69 73 0a 20 20  abase file is.  
11ad0 20 20 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20    ** determined 
11ae0 62 79 20 74 68 65 20 32 2d 62 79 74 65 20 69 6e  by the 2-byte in
11af0 74 65 67 65 72 20 6c 6f 63 61 74 65 64 20 61 74  teger located at
11b00 20 61 6e 20 6f 66 66 73 65 74 20 6f 66 20 31 36   an offset of 16
11b10 20 62 79 74 65 73 20 66 72 6f 6d 0a 20 20 20 20   bytes from.    
11b20 2a 2a 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  ** the beginning
11b30 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
11b40 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 70 42   file. */.    pB
11b50 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 28 7a  t->pageSize = (z
11b60 44 62 48 65 61 64 65 72 5b 31 36 5d 3c 3c 38 29  DbHeader[16]<<8)
11b70 20 7c 20 28 7a 44 62 48 65 61 64 65 72 5b 31 37   | (zDbHeader[17
11b80 5d 3c 3c 31 36 29 3b 0a 20 20 20 20 69 66 28 20  ]<<16);.    if( 
11b90 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c 35 31  pBt->pageSize<51
11ba0 32 20 7c 7c 20 70 42 74 2d 3e 70 61 67 65 53 69  2 || pBt->pageSi
11bb0 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41  ze>SQLITE_MAX_PA
11bc0 47 45 5f 53 49 5a 45 0a 20 20 20 20 20 20 20 20  GE_SIZE.        
11bd0 20 7c 7c 20 28 28 70 42 74 2d 3e 70 61 67 65 53   || ((pBt->pageS
11be0 69 7a 65 2d 31 29 26 70 42 74 2d 3e 70 61 67 65  ize-1)&pBt->page
11bf0 53 69 7a 65 29 21 3d 30 20 29 7b 0a 20 20 20 20  Size)!=0 ){.    
11c00 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20    pBt->pageSize 
11c10 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  = 0;.#ifndef SQL
11c20 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
11c30 55 55 4d 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  UUM.      /* If 
11c40 74 68 65 20 6d 61 67 69 63 20 6e 61 6d 65 20 22  the magic name "
11c50 3a 6d 65 6d 6f 72 79 3a 22 20 77 69 6c 6c 20 63  :memory:" will c
11c60 72 65 61 74 65 20 61 6e 20 69 6e 2d 6d 65 6d 6f  reate an in-memo
11c70 72 79 20 64 61 74 61 62 61 73 65 2c 20 74 68 65  ry database, the
11c80 6e 0a 20 20 20 20 20 20 2a 2a 20 6c 65 61 76 65  n.      ** leave
11c90 20 74 68 65 20 61 75 74 6f 56 61 63 75 75 6d 20   the autoVacuum 
11ca0 6d 6f 64 65 20 61 74 20 30 20 28 64 6f 20 6e 6f  mode at 0 (do no
11cb0 74 20 61 75 74 6f 2d 76 61 63 75 75 6d 29 2c 20  t auto-vacuum), 
11cc0 65 76 65 6e 20 69 66 0a 20 20 20 20 20 20 2a 2a  even if.      **
11cd0 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
11ce0 41 55 54 4f 56 41 43 55 55 4d 20 69 73 20 74 72  AUTOVACUUM is tr
11cf0 75 65 2e 20 4f 6e 20 74 68 65 20 6f 74 68 65 72  ue. On the other
11d00 20 68 61 6e 64 2c 20 69 66 0a 20 20 20 20 20 20   hand, if.      
11d10 2a 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d  ** SQLITE_OMIT_M
11d20 45 4d 4f 52 59 44 42 20 68 61 73 20 62 65 65 6e  EMORYDB has been
11d30 20 64 65 66 69 6e 65 64 2c 20 74 68 65 6e 20 22   defined, then "
11d40 3a 6d 65 6d 6f 72 79 3a 22 20 69 73 20 6a 75 73  :memory:" is jus
11d50 74 20 61 0a 20 20 20 20 20 20 2a 2a 20 72 65 67  t a.      ** reg
11d60 75 6c 61 72 20 66 69 6c 65 2d 6e 61 6d 65 2e 20  ular file-name. 
11d70 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
11d80 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 61 70 70   auto-vacuum app
11d90 6c 69 65 73 20 61 73 20 70 65 72 20 6e 6f 72 6d  lies as per norm
11da0 61 6c 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  al..      */.   
11db0 20 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65     if( zFilename
11dc0 20 26 26 20 21 69 73 4d 65 6d 64 62 20 29 7b 0a   && !isMemdb ){.
11dd0 20 20 20 20 20 20 20 20 70 42 74 2d 3e 61 75 74          pBt->aut
11de0 6f 56 61 63 75 75 6d 20 3d 20 28 53 51 4c 49 54  oVacuum = (SQLIT
11df0 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41  E_DEFAULT_AUTOVA
11e00 43 55 55 4d 20 3f 20 31 20 3a 20 30 29 3b 0a 20  CUUM ? 1 : 0);. 
11e10 20 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 63 72         pBt->incr
11e20 56 61 63 75 75 6d 20 3d 20 28 53 51 4c 49 54 45  Vacuum = (SQLITE
11e30 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43  _DEFAULT_AUTOVAC
11e40 55 55 4d 3d 3d 32 20 3f 20 31 20 3a 20 30 29 3b  UUM==2 ? 1 : 0);
11e50 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
11e60 20 20 20 20 20 20 6e 52 65 73 65 72 76 65 20 3d        nReserve =
11e70 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
11e80 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45       /* EVIDENCE
11e90 2d 4f 46 3a 20 52 2d 33 37 34 39 37 2d 34 32 34  -OF: R-37497-424
11ea0 31 32 20 54 68 65 20 73 69 7a 65 20 6f 66 20 74  12 The size of t
11eb0 68 65 20 72 65 73 65 72 76 65 64 20 72 65 67 69  he reserved regi
11ec0 6f 6e 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 64  on is.      ** d
11ed0 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65  etermined by the
11ee0 20 6f 6e 65 2d 62 79 74 65 20 75 6e 73 69 67 6e   one-byte unsign
11ef0 65 64 20 69 6e 74 65 67 65 72 20 66 6f 75 6e 64  ed integer found
11f00 20 61 74 20 61 6e 20 6f 66 66 73 65 74 20 6f 66   at an offset of
11f10 20 32 30 0a 20 20 20 20 20 20 2a 2a 20 69 6e 74   20.      ** int
11f20 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
11f30 69 6c 65 20 68 65 61 64 65 72 2e 20 2a 2f 0a 20  ile header. */. 
11f40 20 20 20 20 20 6e 52 65 73 65 72 76 65 20 3d 20       nReserve = 
11f50 7a 44 62 48 65 61 64 65 72 5b 32 30 5d 3b 0a 20  zDbHeader[20];. 
11f60 20 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61       pBt->btsFla
11f70 67 73 20 7c 3d 20 42 54 53 5f 50 41 47 45 53 49  gs |= BTS_PAGESI
11f80 5a 45 5f 46 49 58 45 44 3b 0a 23 69 66 6e 64 65  ZE_FIXED;.#ifnde
11f90 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
11fa0 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 70  TOVACUUM.      p
11fb0 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d  Bt->autoVacuum =
11fc0 20 28 67 65 74 34 62 79 74 65 28 26 7a 44 62 48   (get4byte(&zDbH
11fd0 65 61 64 65 72 5b 33 36 20 2b 20 34 2a 34 5d 29  eader[36 + 4*4])
11fe0 3f 31 3a 30 29 3b 0a 20 20 20 20 20 20 70 42 74  ?1:0);.      pBt
11ff0 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 28  ->incrVacuum = (
12000 67 65 74 34 62 79 74 65 28 26 7a 44 62 48 65 61  get4byte(&zDbHea
12010 64 65 72 5b 33 36 20 2b 20 37 2a 34 5d 29 3f 31  der[36 + 7*4])?1
12020 3a 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  :0);.#endif.    
12030 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  }.    rc = sqlit
12040 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73 69  e3PagerSetPagesi
12050 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  ze(pBt->pPager, 
12060 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2c 20  &pBt->pageSize, 
12070 6e 52 65 73 65 72 76 65 29 3b 0a 20 20 20 20 69  nReserve);.    i
12080 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62 74 72  f( rc ) goto btr
12090 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20  ee_open_out;.   
120a0 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
120b0 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65   = pBt->pageSize
120c0 20 2d 20 6e 52 65 73 65 72 76 65 3b 0a 20 20 20   - nReserve;.   
120d0 20 61 73 73 65 72 74 28 20 28 70 42 74 2d 3e 70   assert( (pBt->p
120e0 61 67 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20  ageSize & 7)==0 
120f0 29 3b 20 20 2f 2a 20 38 2d 62 79 74 65 20 61 6c  );  /* 8-byte al
12100 69 67 6e 6d 65 6e 74 20 6f 66 20 70 61 67 65 53  ignment of pageS
12110 69 7a 65 20 2a 2f 0a 20 20 20 0a 23 69 66 20 21  ize */.   .#if !
12120 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
12130 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
12140 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51  ) && !defined(SQ
12150 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f  LITE_OMIT_DISKIO
12160 29 0a 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65  ).    /* Add the
12170 20 6e 65 77 20 42 74 53 68 61 72 65 64 20 6f 62   new BtShared ob
12180 6a 65 63 74 20 74 6f 20 74 68 65 20 6c 69 6e 6b  ject to the link
12190 65 64 20 6c 69 73 74 20 73 68 61 72 61 62 6c 65  ed list sharable
121a0 20 42 74 53 68 61 72 65 64 73 2e 0a 20 20 20 20   BtShareds..    
121b0 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 73 68  */.    if( p->sh
121c0 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20  arable ){.      
121d0 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20 73 71 6c  MUTEX_LOGIC( sql
121e0 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65  ite3_mutex *mute
121f0 78 53 68 61 72 65 64 3b 20 29 0a 20 20 20 20 20  xShared; ).     
12200 20 70 42 74 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a   pBt->nRef = 1;.
12210 20 20 20 20 20 20 4d 55 54 45 58 5f 4c 4f 47 49        MUTEX_LOGI
12220 43 28 20 6d 75 74 65 78 53 68 61 72 65 64 20 3d  C( mutexShared =
12230 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c   sqlite3MutexAll
12240 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  oc(SQLITE_MUTEX_
12250 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 29  STATIC_MASTER);)
12260 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c 49 54  .      if( SQLIT
12270 45 5f 54 48 52 45 41 44 53 41 46 45 20 26 26 20  E_THREADSAFE && 
12280 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
12290 66 69 67 2e 62 43 6f 72 65 4d 75 74 65 78 20 29  fig.bCoreMutex )
122a0 7b 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e 6d  {.        pBt->m
122b0 75 74 65 78 20 3d 20 73 71 6c 69 74 65 33 4d 75  utex = sqlite3Mu
122c0 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f  texAlloc(SQLITE_
122d0 4d 55 54 45 58 5f 46 41 53 54 29 3b 0a 20 20 20  MUTEX_FAST);.   
122e0 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6d 75       if( pBt->mu
122f0 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  tex==0 ){.      
12300 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
12310 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20  NOMEM;.         
12320 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
12330 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  d = 0;.         
12340 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e   goto btree_open
12350 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  _out;.        }.
12360 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
12370 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
12380 72 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a  r(mutexShared);.
12390 20 20 20 20 20 20 70 42 74 2d 3e 70 4e 65 78 74        pBt->pNext
123a0 20 3d 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72   = GLOBAL(BtShar
123b0 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65  ed*,sqlite3Share
123c0 64 43 61 63 68 65 4c 69 73 74 29 3b 0a 20 20 20  dCacheList);.   
123d0 20 20 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72     GLOBAL(BtShar
123e0 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65  ed*,sqlite3Share
123f0 64 43 61 63 68 65 4c 69 73 74 29 20 3d 20 70 42  dCacheList) = pB
12400 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  t;.      sqlite3
12410 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74  _mutex_leave(mut
12420 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20 7d  exShared);.    }
12430 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 23 69 66  .#endif.  }..#if
12440 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
12450 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
12460 48 45 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  HE) && !defined(
12470 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b  SQLITE_OMIT_DISK
12480 49 4f 29 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  IO).  /* If the 
12490 6e 65 77 20 42 74 72 65 65 20 75 73 65 73 20 61  new Btree uses a
124a0 20 73 68 61 72 61 62 6c 65 20 70 42 74 53 68 61   sharable pBtSha
124b0 72 65 64 2c 20 74 68 65 6e 20 6c 69 6e 6b 20 74  red, then link t
124c0 68 65 20 6e 65 77 0a 20 20 2a 2a 20 42 74 72 65  he new.  ** Btre
124d0 65 20 69 6e 74 6f 20 74 68 65 20 6c 69 73 74 20  e into the list 
124e0 6f 66 20 61 6c 6c 20 73 68 61 72 61 62 6c 65 20  of all sharable 
124f0 42 74 72 65 65 73 20 66 6f 72 20 74 68 65 20 73  Btrees for the s
12500 61 6d 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a  ame connection..
12510 20 20 2a 2a 20 54 68 65 20 6c 69 73 74 20 69 73    ** The list is
12520 20 6b 65 70 74 20 69 6e 20 61 73 63 65 6e 64 69   kept in ascendi
12530 6e 67 20 6f 72 64 65 72 20 62 79 20 70 42 74 20  ng order by pBt 
12540 61 64 64 72 65 73 73 2e 0a 20 20 2a 2f 0a 20 20  address..  */.  
12550 69 66 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20  if( p->sharable 
12560 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
12570 20 20 42 74 72 65 65 20 2a 70 53 69 62 3b 0a 20    Btree *pSib;. 
12580 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62     for(i=0; i<db
12590 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nDb; i++){.   
125a0 20 20 20 69 66 28 20 28 70 53 69 62 20 3d 20 64     if( (pSib = d
125b0 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 29 21 3d  b->aDb[i].pBt)!=
125c0 30 20 26 26 20 70 53 69 62 2d 3e 73 68 61 72 61  0 && pSib->shara
125d0 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 77  ble ){.        w
125e0 68 69 6c 65 28 20 70 53 69 62 2d 3e 70 50 72 65  hile( pSib->pPre
125f0 76 20 29 7b 20 70 53 69 62 20 3d 20 70 53 69 62  v ){ pSib = pSib
12600 2d 3e 70 50 72 65 76 3b 20 7d 0a 20 20 20 20 20  ->pPrev; }.     
12610 20 20 20 69 66 28 20 70 2d 3e 70 42 74 3c 70 53     if( p->pBt<pS
12620 69 62 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20 20  ib->pBt ){.     
12630 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20       p->pNext = 
12640 70 53 69 62 3b 0a 20 20 20 20 20 20 20 20 20 20  pSib;.          
12650 70 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20 20  p->pPrev = 0;.  
12660 20 20 20 20 20 20 20 20 70 53 69 62 2d 3e 70 50          pSib->pP
12670 72 65 76 20 3d 20 70 3b 0a 20 20 20 20 20 20 20  rev = p;.       
12680 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
12690 20 20 77 68 69 6c 65 28 20 70 53 69 62 2d 3e 70    while( pSib->p
126a0 4e 65 78 74 20 26 26 20 70 53 69 62 2d 3e 70 4e  Next && pSib->pN
126b0 65 78 74 2d 3e 70 42 74 3c 70 2d 3e 70 42 74 20  ext->pBt<p->pBt 
126c0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
126d0 53 69 62 20 3d 20 70 53 69 62 2d 3e 70 4e 65 78  Sib = pSib->pNex
126e0 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  t;.          }. 
126f0 20 20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78           p->pNex
12700 74 20 3d 20 70 53 69 62 2d 3e 70 4e 65 78 74 3b  t = pSib->pNext;
12710 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 50  .          p->pP
12720 72 65 76 20 3d 20 70 53 69 62 3b 0a 20 20 20 20  rev = pSib;.    
12730 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 4e 65        if( p->pNe
12740 78 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  xt ){.          
12750 20 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65    p->pNext->pPre
12760 76 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 20  v = p;.         
12770 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 53 69   }.          pSi
12780 62 2d 3e 70 4e 65 78 74 20 3d 20 70 3b 0a 20 20  b->pNext = p;.  
12790 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
127a0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
127b0 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
127c0 20 20 2a 70 70 42 74 72 65 65 20 3d 20 70 3b 0a    *ppBtree = p;.
127d0 0a 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3a  .btree_open_out:
127e0 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
127f0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  E_OK ){.    if( 
12800 70 42 74 20 26 26 20 70 42 74 2d 3e 70 50 61 67  pBt && pBt->pPag
12810 65 72 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  er ){.      sqli
12820 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28 70 42  te3PagerClose(pB
12830 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20  t->pPager);.    
12840 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  }.    sqlite3_fr
12850 65 65 28 70 42 74 29 3b 0a 20 20 20 20 73 71 6c  ee(pBt);.    sql
12860 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20  ite3_free(p);.  
12870 20 20 2a 70 70 42 74 72 65 65 20 3d 20 30 3b 0a    *ppBtree = 0;.
12880 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
12890 49 66 20 74 68 65 20 42 2d 54 72 65 65 20 77 61  If the B-Tree wa
128a0 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 6f  s successfully o
128b0 70 65 6e 65 64 2c 20 73 65 74 20 74 68 65 20 70  pened, set the p
128c0 61 67 65 72 2d 63 61 63 68 65 20 73 69 7a 65 20  ager-cache size 
128d0 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 65  to the.    ** de
128e0 66 61 75 6c 74 20 76 61 6c 75 65 2e 20 45 78 63  fault value. Exc
128f0 65 70 74 2c 20 77 68 65 6e 20 6f 70 65 6e 69 6e  ept, when openin
12900 67 20 6f 6e 20 61 6e 20 65 78 69 73 74 69 6e 67  g on an existing
12910 20 73 68 61 72 65 64 20 70 61 67 65 72 2d 63 61   shared pager-ca
12920 63 68 65 2c 0a 20 20 20 20 2a 2a 20 64 6f 20 6e  che,.    ** do n
12930 6f 74 20 63 68 61 6e 67 65 20 74 68 65 20 70 61  ot change the pa
12940 67 65 72 2d 63 61 63 68 65 20 73 69 7a 65 2e 0a  ger-cache size..
12950 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73      */.    if( s
12960 71 6c 69 74 65 33 42 74 72 65 65 53 63 68 65 6d  qlite3BtreeSchem
12970 61 28 70 2c 20 30 2c 20 30 29 3d 3d 30 20 29 7b  a(p, 0, 0)==0 ){
12980 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61  .      sqlite3Pa
12990 67 65 72 53 65 74 43 61 63 68 65 73 69 7a 65 28  gerSetCachesize(
129a0 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  p->pBt->pPager, 
129b0 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 43  SQLITE_DEFAULT_C
129c0 41 43 48 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20  ACHE_SIZE);.    
129d0 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6d 75 74 65  }.  }.  if( mute
129e0 78 4f 70 65 6e 20 29 7b 0a 20 20 20 20 61 73 73  xOpen ){.    ass
129f0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
12a00 65 78 5f 68 65 6c 64 28 6d 75 74 65 78 4f 70 65  ex_held(mutexOpe
12a10 6e 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  n) );.    sqlite
12a20 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75  3_mutex_leave(mu
12a30 74 65 78 4f 70 65 6e 29 3b 0a 20 20 7d 0a 20 20  texOpen);.  }.  
12a40 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
12a50 0a 2a 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68  .** Decrement th
12a60 65 20 42 74 53 68 61 72 65 64 2e 6e 52 65 66 20  e BtShared.nRef 
12a70 63 6f 75 6e 74 65 72 2e 20 20 57 68 65 6e 20 69  counter.  When i
12a80 74 20 72 65 61 63 68 65 73 20 7a 65 72 6f 2c 0a  t reaches zero,.
12a90 2a 2a 20 72 65 6d 6f 76 65 20 74 68 65 20 42 74  ** remove the Bt
12aa0 53 68 61 72 65 64 20 73 74 72 75 63 74 75 72 65  Shared structure
12ab0 20 66 72 6f 6d 20 74 68 65 20 73 68 61 72 69 6e   from the sharin
12ac0 67 20 6c 69 73 74 2e 20 20 52 65 74 75 72 6e 0a  g list.  Return.
12ad0 2a 2a 20 74 72 75 65 20 69 66 20 74 68 65 20 42  ** true if the B
12ae0 74 53 68 61 72 65 64 2e 6e 52 65 66 20 63 6f 75  tShared.nRef cou
12af0 6e 74 65 72 20 72 65 61 63 68 65 73 20 7a 65 72  nter reaches zer
12b00 6f 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20  o and return.** 
12b10 66 61 6c 73 65 20 69 66 20 69 74 20 69 73 20 73  false if it is s
12b20 74 69 6c 6c 20 70 6f 73 69 74 69 76 65 2e 0a 2a  till positive..*
12b30 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 6d  /.static int rem
12b40 6f 76 65 46 72 6f 6d 53 68 61 72 69 6e 67 4c 69  oveFromSharingLi
12b50 73 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  st(BtShared *pBt
12b60 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
12b70 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
12b80 43 48 45 0a 20 20 4d 55 54 45 58 5f 4c 4f 47 49  CHE.  MUTEX_LOGI
12b90 43 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  C( sqlite3_mutex
12ba0 20 2a 70 4d 61 73 74 65 72 3b 20 29 0a 20 20 42   *pMaster; ).  B
12bb0 74 53 68 61 72 65 64 20 2a 70 4c 69 73 74 3b 0a  tShared *pList;.
12bc0 20 20 69 6e 74 20 72 65 6d 6f 76 65 64 20 3d 20    int removed = 
12bd0 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  0;..  assert( sq
12be0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6e 6f 74 68  lite3_mutex_noth
12bf0 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
12c00 29 3b 0a 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43  );.  MUTEX_LOGIC
12c10 28 20 70 4d 61 73 74 65 72 20 3d 20 73 71 6c 69  ( pMaster = sqli
12c20 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51  te3MutexAlloc(SQ
12c30 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49  LITE_MUTEX_STATI
12c40 43 5f 4d 41 53 54 45 52 29 3b 20 29 0a 20 20 73  C_MASTER); ).  s
12c50 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
12c60 65 72 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 70  er(pMaster);.  p
12c70 42 74 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66  Bt->nRef--;.  if
12c80 28 20 70 42 74 2d 3e 6e 52 65 66 3c 3d 30 20 29  ( pBt->nRef<=0 )
12c90 7b 0a 20 20 20 20 69 66 28 20 47 4c 4f 42 41 4c  {.    if( GLOBAL
12ca0 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74  (BtShared*,sqlit
12cb0 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73  e3SharedCacheLis
12cc0 74 29 3d 3d 70 42 74 20 29 7b 0a 20 20 20 20 20  t)==pBt ){.     
12cd0 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64   GLOBAL(BtShared
12ce0 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64 43  *,sqlite3SharedC
12cf0 61 63 68 65 4c 69 73 74 29 20 3d 20 70 42 74 2d  acheList) = pBt-
12d00 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 65 6c 73  >pNext;.    }els
12d10 65 7b 0a 20 20 20 20 20 20 70 4c 69 73 74 20 3d  e{.      pList =
12d20 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64   GLOBAL(BtShared
12d30 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64 43  *,sqlite3SharedC
12d40 61 63 68 65 4c 69 73 74 29 3b 0a 20 20 20 20 20  acheList);.     
12d50 20 77 68 69 6c 65 28 20 41 4c 57 41 59 53 28 70   while( ALWAYS(p
12d60 4c 69 73 74 29 20 26 26 20 70 4c 69 73 74 2d 3e  List) && pList->
12d70 70 4e 65 78 74 21 3d 70 42 74 20 29 7b 0a 20 20  pNext!=pBt ){.  
12d80 20 20 20 20 20 20 70 4c 69 73 74 3d 70 4c 69 73        pList=pLis
12d90 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  t->pNext;.      
12da0 7d 0a 20 20 20 20 20 20 69 66 28 20 41 4c 57 41  }.      if( ALWA
12db0 59 53 28 70 4c 69 73 74 29 20 29 7b 0a 20 20 20  YS(pList) ){.   
12dc0 20 20 20 20 20 70 4c 69 73 74 2d 3e 70 4e 65 78       pList->pNex
12dd0 74 20 3d 20 70 42 74 2d 3e 70 4e 65 78 74 3b 0a  t = pBt->pNext;.
12de0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
12df0 20 20 69 66 28 20 53 51 4c 49 54 45 5f 54 48 52    if( SQLITE_THR
12e00 45 41 44 53 41 46 45 20 29 7b 0a 20 20 20 20 20  EADSAFE ){.     
12e10 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66   sqlite3_mutex_f
12e20 72 65 65 28 70 42 74 2d 3e 6d 75 74 65 78 29 3b  ree(pBt->mutex);
12e30 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 6d 6f 76  .    }.    remov
12e40 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 73 71  ed = 1;.  }.  sq
12e50 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
12e60 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 72 65  e(pMaster);.  re
12e70 74 75 72 6e 20 72 65 6d 6f 76 65 64 3b 0a 23 65  turn removed;.#e
12e80 6c 73 65 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a  lse.  return 1;.
12e90 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
12ea0 4d 61 6b 65 20 73 75 72 65 20 70 42 74 2d 3e 70  Make sure pBt->p
12eb0 54 6d 70 53 70 61 63 65 20 70 6f 69 6e 74 73 20  TmpSpace points 
12ec0 74 6f 20 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e  to an allocation
12ed0 20 6f 66 20 0a 2a 2a 20 4d 58 5f 43 45 4c 4c 5f   of .** MX_CELL_
12ee0 53 49 5a 45 28 70 42 74 29 20 62 79 74 65 73 20  SIZE(pBt) bytes 
12ef0 77 69 74 68 20 61 20 34 2d 62 79 74 65 20 70 72  with a 4-byte pr
12f00 65 66 69 78 20 66 6f 72 20 61 20 6c 65 66 74 2d  efix for a left-
12f10 63 68 69 6c 64 0a 2a 2a 20 70 6f 69 6e 74 65 72  child.** pointer
12f20 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
12f30 20 61 6c 6c 6f 63 61 74 65 54 65 6d 70 53 70 61   allocateTempSpa
12f40 63 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  ce(BtShared *pBt
12f50 29 7b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 70  ){.  if( !pBt->p
12f60 54 6d 70 53 70 61 63 65 20 29 7b 0a 20 20 20 20  TmpSpace ){.    
12f70 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d  pBt->pTmpSpace =
12f80 20 73 71 6c 69 74 65 33 50 61 67 65 4d 61 6c 6c   sqlite3PageMall
12f90 6f 63 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  oc( pBt->pageSiz
12fa0 65 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 4f 6e 65  e );..    /* One
12fb0 20 6f 66 20 74 68 65 20 75 73 65 73 20 6f 66 20   of the uses of 
12fc0 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 69  pBt->pTmpSpace i
12fd0 73 20 74 6f 20 66 6f 72 6d 61 74 20 63 65 6c 6c  s to format cell
12fe0 73 20 62 65 66 6f 72 65 0a 20 20 20 20 2a 2a 20  s before.    ** 
12ff0 69 6e 73 65 72 74 69 6e 67 20 74 68 65 6d 20 69  inserting them i
13000 6e 74 6f 20 61 20 6c 65 61 66 20 70 61 67 65 20  nto a leaf page 
13010 28 66 75 6e 63 74 69 6f 6e 20 66 69 6c 6c 49 6e  (function fillIn
13020 43 65 6c 6c 28 29 29 2e 20 49 66 0a 20 20 20 20  Cell()). If.    
13030 2a 2a 20 61 20 63 65 6c 6c 20 69 73 20 6c 65 73  ** a cell is les
13040 73 20 74 68 61 6e 20 34 20 62 79 74 65 73 20 69  s than 4 bytes i
13050 6e 20 73 69 7a 65 2c 20 69 74 20 69 73 20 72 6f  n size, it is ro
13060 75 6e 64 65 64 20 75 70 20 74 6f 20 34 20 62 79  unded up to 4 by
13070 74 65 73 0a 20 20 20 20 2a 2a 20 62 79 20 74 68  tes.    ** by th
13080 65 20 76 61 72 69 6f 75 73 20 72 6f 75 74 69 6e  e various routin
13090 65 73 20 74 68 61 74 20 6d 61 6e 69 70 75 6c 61  es that manipula
130a0 74 65 20 62 69 6e 61 72 79 20 63 65 6c 6c 73 2e  te binary cells.
130b0 20 57 68 69 63 68 0a 20 20 20 20 2a 2a 20 63 61   Which.    ** ca
130c0 6e 20 6d 65 61 6e 20 74 68 61 74 20 66 69 6c 6c  n mean that fill
130d0 49 6e 43 65 6c 6c 28 29 20 6f 6e 6c 79 20 69 6e  InCell() only in
130e0 69 74 69 61 6c 69 7a 65 73 20 74 68 65 20 66 69  itializes the fi
130f0 72 73 74 20 32 20 6f 72 20 33 0a 20 20 20 20 2a  rst 2 or 3.    *
13100 2a 20 62 79 74 65 73 20 6f 66 20 70 54 6d 70 53  * bytes of pTmpS
13110 70 61 63 65 2c 20 62 75 74 20 74 68 61 74 20 74  pace, but that t
13120 68 65 20 66 69 72 73 74 20 34 20 62 79 74 65 73  he first 4 bytes
13130 20 61 72 65 20 63 6f 70 69 65 64 20 66 72 6f 6d   are copied from
13140 0a 20 20 20 20 2a 2a 20 69 74 20 69 6e 74 6f 20  .    ** it into 
13150 61 20 64 61 74 61 62 61 73 65 20 70 61 67 65 2e  a database page.
13160 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61 63 74   This is not act
13170 75 61 6c 6c 79 20 61 20 70 72 6f 62 6c 65 6d 2c  ually a problem,
13180 20 62 75 74 20 69 74 0a 20 20 20 20 2a 2a 20 64   but it.    ** d
13190 6f 65 73 20 63 61 75 73 65 20 61 20 76 61 6c 67  oes cause a valg
131a0 72 69 6e 64 20 65 72 72 6f 72 20 77 68 65 6e 20  rind error when 
131b0 74 68 65 20 31 20 6f 72 20 32 20 62 79 74 65 73  the 1 or 2 bytes
131c0 20 6f 66 20 75 6e 69 74 69 61 6c 69 7a 65 64 20   of unitialized 
131d0 0a 20 20 20 20 2a 2a 20 64 61 74 61 20 69 73 20  .    ** data is 
131e0 70 61 73 73 65 64 20 74 6f 20 73 79 73 74 65 6d  passed to system
131f0 20 63 61 6c 6c 20 77 72 69 74 65 28 29 2e 20 53   call write(). S
13200 6f 20 74 6f 20 61 76 6f 69 64 20 74 68 69 73 20  o to avoid this 
13210 65 72 72 6f 72 2c 0a 20 20 20 20 2a 2a 20 7a 65  error,.    ** ze
13220 72 6f 20 74 68 65 20 66 69 72 73 74 20 34 20 62  ro the first 4 b
13230 79 74 65 73 20 6f 66 20 74 65 6d 70 20 73 70 61  ytes of temp spa
13240 63 65 20 68 65 72 65 2e 0a 20 20 20 20 2a 2a 0a  ce here..    **.
13250 20 20 20 20 2a 2a 20 41 6c 73 6f 3a 20 20 50 72      ** Also:  Pr
13260 6f 76 69 64 65 20 66 6f 75 72 20 62 79 74 65 73  ovide four bytes
13270 20 6f 66 20 69 6e 69 74 69 61 6c 69 7a 65 64 20   of initialized 
13280 73 70 61 63 65 20 62 65 66 6f 72 65 20 74 68 65  space before the
13290 0a 20 20 20 20 2a 2a 20 62 65 67 69 6e 6e 69 6e  .    ** beginnin
132a0 67 20 6f 66 20 70 54 6d 70 53 70 61 63 65 20 61  g of pTmpSpace a
132b0 73 20 61 6e 20 61 72 65 61 20 61 76 61 69 6c 61  s an area availa
132c0 62 6c 65 20 74 6f 20 70 72 65 70 65 6e 64 20 74  ble to prepend t
132d0 68 65 0a 20 20 20 20 2a 2a 20 6c 65 66 74 2d 63  he.    ** left-c
132e0 68 69 6c 64 20 70 6f 69 6e 74 65 72 20 74 6f 20  hild pointer to 
132f0 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
13300 20 61 20 63 65 6c 6c 2e 0a 20 20 20 20 2a 2f 0a   a cell..    */.
13310 20 20 20 20 69 66 28 20 70 42 74 2d 3e 70 54 6d      if( pBt->pTm
13320 70 53 70 61 63 65 20 29 7b 0a 20 20 20 20 20 20  pSpace ){.      
13330 6d 65 6d 73 65 74 28 70 42 74 2d 3e 70 54 6d 70  memset(pBt->pTmp
13340 53 70 61 63 65 2c 20 30 2c 20 38 29 3b 0a 20 20  Space, 0, 8);.  
13350 20 20 20 20 70 42 74 2d 3e 70 54 6d 70 53 70 61      pBt->pTmpSpa
13360 63 65 20 2b 3d 20 34 3b 0a 20 20 20 20 7d 0a 20  ce += 4;.    }. 
13370 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65   }.}../*.** Free
13380 20 74 68 65 20 70 42 74 2d 3e 70 54 6d 70 53 70   the pBt->pTmpSp
13390 61 63 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a  ace allocation.*
133a0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 72  /.static void fr
133b0 65 65 54 65 6d 70 53 70 61 63 65 28 42 74 53 68  eeTempSpace(BtSh
133c0 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 66  ared *pBt){.  if
133d0 28 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65  ( pBt->pTmpSpace
133e0 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e 70 54 6d   ){.    pBt->pTm
133f0 70 53 70 61 63 65 20 2d 3d 20 34 3b 0a 20 20 20  pSpace -= 4;.   
13400 20 73 71 6c 69 74 65 33 50 61 67 65 46 72 65 65   sqlite3PageFree
13410 28 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 29  (pBt->pTmpSpace)
13420 3b 0a 20 20 20 20 70 42 74 2d 3e 70 54 6d 70 53  ;.    pBt->pTmpS
13430 70 61 63 65 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a  pace = 0;.  }.}.
13440 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e 20  ./*.** Close an 
13450 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 61 6e  open database an
13460 64 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c  d invalidate all
13470 20 63 75 72 73 6f 72 73 2e 0a 2a 2f 0a 69 6e 74   cursors..*/.int
13480 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f   sqlite3BtreeClo
13490 73 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  se(Btree *p){.  
134a0 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
134b0 70 2d 3e 70 42 74 3b 0a 20 20 42 74 43 75 72 73  p->pBt;.  BtCurs
134c0 6f 72 20 2a 70 43 75 72 3b 0a 0a 20 20 2f 2a 20  or *pCur;..  /* 
134d0 43 6c 6f 73 65 20 61 6c 6c 20 63 75 72 73 6f 72  Close all cursor
134e0 73 20 6f 70 65 6e 65 64 20 76 69 61 20 74 68 69  s opened via thi
134f0 73 20 68 61 6e 64 6c 65 2e 20 20 2a 2f 0a 20 20  s handle.  */.  
13500 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
13510 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62  mutex_held(p->db
13520 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71  ->mutex) );.  sq
13530 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
13540 70 29 3b 0a 20 20 70 43 75 72 20 3d 20 70 42 74  p);.  pCur = pBt
13550 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 77 68 69  ->pCursor;.  whi
13560 6c 65 28 20 70 43 75 72 20 29 7b 0a 20 20 20 20  le( pCur ){.    
13570 42 74 43 75 72 73 6f 72 20 2a 70 54 6d 70 20 3d  BtCursor *pTmp =
13580 20 70 43 75 72 3b 0a 20 20 20 20 70 43 75 72 20   pCur;.    pCur 
13590 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20  = pCur->pNext;. 
135a0 20 20 20 69 66 28 20 70 54 6d 70 2d 3e 70 42 74     if( pTmp->pBt
135b0 72 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20  ree==p ){.      
135c0 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73  sqlite3BtreeClos
135d0 65 43 75 72 73 6f 72 28 70 54 6d 70 29 3b 0a 20  eCursor(pTmp);. 
135e0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52     }.  }..  /* R
135f0 6f 6c 6c 62 61 63 6b 20 61 6e 79 20 61 63 74 69  ollback any acti
13600 76 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61  ve transaction a
13610 6e 64 20 66 72 65 65 20 74 68 65 20 68 61 6e 64  nd free the hand
13620 6c 65 20 73 74 72 75 63 74 75 72 65 2e 0a 20 20  le structure..  
13630 2a 2a 20 54 68 65 20 63 61 6c 6c 20 74 6f 20 73  ** The call to s
13640 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62  qlite3BtreeRollb
13650 61 63 6b 28 29 20 64 72 6f 70 73 20 61 6e 79 20  ack() drops any 
13660 74 61 62 6c 65 2d 6c 6f 63 6b 73 20 68 65 6c 64  table-locks held
13670 20 62 79 0a 20 20 2a 2a 20 74 68 69 73 20 68 61   by.  ** this ha
13680 6e 64 6c 65 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  ndle..  */.  sql
13690 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63  ite3BtreeRollbac
136a0 6b 28 70 2c 20 53 51 4c 49 54 45 5f 4f 4b 2c 20  k(p, SQLITE_OK, 
136b0 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  0);.  sqlite3Btr
136c0 65 65 4c 65 61 76 65 28 70 29 3b 0a 0a 20 20 2f  eeLeave(p);..  /
136d0 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 73  * If there are s
136e0 74 69 6c 6c 20 6f 74 68 65 72 20 6f 75 74 73 74  till other outst
136f0 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65  anding reference
13700 73 20 74 6f 20 74 68 65 20 73 68 61 72 65 64 2d  s to the shared-
13710 62 74 72 65 65 0a 20 20 2a 2a 20 73 74 72 75 63  btree.  ** struc
13720 74 75 72 65 2c 20 72 65 74 75 72 6e 20 6e 6f 77  ture, return now
13730 2e 20 54 68 65 20 72 65 6d 61 69 6e 64 65 72 20  . The remainder 
13740 6f 66 20 74 68 69 73 20 70 72 6f 63 65 64 75 72  of this procedur
13750 65 20 63 6c 65 61 6e 73 20 0a 20 20 2a 2a 20 75  e cleans .  ** u
13760 70 20 74 68 65 20 73 68 61 72 65 64 2d 62 74 72  p the shared-btr
13770 65 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ee..  */.  asser
13780 74 28 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f 63 6b  t( p->wantToLock
13790 3d 3d 30 20 26 26 20 70 2d 3e 6c 6f 63 6b 65 64  ==0 && p->locked
137a0 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 21 70 2d  ==0 );.  if( !p-
137b0 3e 73 68 61 72 61 62 6c 65 20 7c 7c 20 72 65 6d  >sharable || rem
137c0 6f 76 65 46 72 6f 6d 53 68 61 72 69 6e 67 4c 69  oveFromSharingLi
137d0 73 74 28 70 42 74 29 20 29 7b 0a 20 20 20 20 2f  st(pBt) ){.    /
137e0 2a 20 54 68 65 20 70 42 74 20 69 73 20 6e 6f 20  * The pBt is no 
137f0 6c 6f 6e 67 65 72 20 6f 6e 20 74 68 65 20 73 68  longer on the sh
13800 61 72 69 6e 67 20 6c 69 73 74 2c 20 73 6f 20 77  aring list, so w
13810 65 20 63 61 6e 20 61 63 63 65 73 73 0a 20 20 20  e can access.   
13820 20 2a 2a 20 69 74 20 77 69 74 68 6f 75 74 20 68   ** it without h
13830 61 76 69 6e 67 20 74 6f 20 68 6f 6c 64 20 74 68  aving to hold th
13840 65 20 6d 75 74 65 78 2e 0a 20 20 20 20 2a 2a 0a  e mutex..    **.
13850 20 20 20 20 2a 2a 20 43 6c 65 61 6e 20 6f 75 74      ** Clean out
13860 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65 20   and delete the 
13870 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74 2e  BtShared object.
13880 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  .    */.    asse
13890 72 74 28 20 21 70 42 74 2d 3e 70 43 75 72 73 6f  rt( !pBt->pCurso
138a0 72 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  r );.    sqlite3
138b0 50 61 67 65 72 43 6c 6f 73 65 28 70 42 74 2d 3e  PagerClose(pBt->
138c0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28  pPager);.    if(
138d0 20 70 42 74 2d 3e 78 46 72 65 65 53 63 68 65 6d   pBt->xFreeSchem
138e0 61 20 26 26 20 70 42 74 2d 3e 70 53 63 68 65 6d  a && pBt->pSchem
138f0 61 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e  a ){.      pBt->
13900 78 46 72 65 65 53 63 68 65 6d 61 28 70 42 74 2d  xFreeSchema(pBt-
13910 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 7d  >pSchema);.    }
13920 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
13930 65 65 28 30 2c 20 70 42 74 2d 3e 70 53 63 68 65  ee(0, pBt->pSche
13940 6d 61 29 3b 0a 20 20 20 20 66 72 65 65 54 65 6d  ma);.    freeTem
13950 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20 20  pSpace(pBt);.   
13960 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 42   sqlite3_free(pB
13970 74 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66  t);.  }..#ifndef
13980 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41   SQLITE_OMIT_SHA
13990 52 45 44 5f 43 41 43 48 45 0a 20 20 61 73 73 65  RED_CACHE.  asse
139a0 72 74 28 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f 63  rt( p->wantToLoc
139b0 6b 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  k==0 );.  assert
139c0 28 20 70 2d 3e 6c 6f 63 6b 65 64 3d 3d 30 20 29  ( p->locked==0 )
139d0 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 65 76  ;.  if( p->pPrev
139e0 20 29 20 70 2d 3e 70 50 72 65 76 2d 3e 70 4e 65   ) p->pPrev->pNe
139f0 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20  xt = p->pNext;. 
13a00 20 69 66 28 20 70 2d 3e 70 4e 65 78 74 20 29 20   if( p->pNext ) 
13a10 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20  p->pNext->pPrev 
13a20 3d 20 70 2d 3e 70 50 72 65 76 3b 0a 23 65 6e 64  = p->pPrev;.#end
13a30 69 66 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  if..  sqlite3_fr
13a40 65 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ee(p);.  return 
13a50 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
13a60 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6c  .** Change the l
13a70 69 6d 69 74 20 6f 6e 20 74 68 65 20 6e 75 6d 62  imit on the numb
13a80 65 72 20 6f 66 20 70 61 67 65 73 20 61 6c 6c 6f  er of pages allo
13a90 77 65 64 20 69 6e 20 74 68 65 20 63 61 63 68 65  wed in the cache
13aa0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69  ..**.** The maxi
13ab0 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 63 61  mum number of ca
13ac0 63 68 65 20 70 61 67 65 73 20 69 73 20 73 65 74  che pages is set
13ad0 20 74 6f 20 74 68 65 20 61 62 73 6f 6c 75 74 65   to the absolute
13ae0 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 6d 78 50  .** value of mxP
13af0 61 67 65 2e 20 20 49 66 20 6d 78 50 61 67 65 20  age.  If mxPage 
13b00 69 73 20 6e 65 67 61 74 69 76 65 2c 20 74 68 65  is negative, the
13b10 20 70 61 67 65 72 20 77 69 6c 6c 0a 2a 2a 20 6f   pager will.** o
13b20 70 65 72 61 74 65 20 61 73 79 6e 63 68 72 6f 6e  perate asynchron
13b30 6f 75 73 6c 79 20 2d 20 69 74 20 77 69 6c 6c 20  ously - it will 
13b40 6e 6f 74 20 73 74 6f 70 20 74 6f 20 64 6f 20 66  not stop to do f
13b50 73 79 6e 63 28 29 73 0a 2a 2a 20 74 6f 20 69 6e  sync()s.** to in
13b60 73 75 72 65 20 64 61 74 61 20 69 73 20 77 72 69  sure data is wri
13b70 74 74 65 6e 20 74 6f 20 74 68 65 20 64 69 73 6b  tten to the disk
13b80 20 73 75 72 66 61 63 65 20 62 65 66 6f 72 65 0a   surface before.
13b90 2a 2a 20 63 6f 6e 74 69 6e 75 69 6e 67 2e 20 20  ** continuing.  
13ba0 54 72 61 6e 73 61 63 74 69 6f 6e 73 20 73 74 69  Transactions sti
13bb0 6c 6c 20 77 6f 72 6b 20 69 66 20 73 79 6e 63 68  ll work if synch
13bc0 72 6f 6e 6f 75 73 20 69 73 20 6f 66 66 2c 0a 2a  ronous is off,.*
13bd0 2a 20 61 6e 64 20 74 68 65 20 64 61 74 61 62 61  * and the databa
13be0 73 65 20 63 61 6e 6e 6f 74 20 62 65 20 63 6f 72  se cannot be cor
13bf0 72 75 70 74 65 64 20 69 66 20 74 68 69 73 20 70  rupted if this p
13c00 72 6f 67 72 61 6d 0a 2a 2a 20 63 72 61 73 68 65  rogram.** crashe
13c10 73 2e 20 20 42 75 74 20 69 66 20 74 68 65 20 6f  s.  But if the o
13c20 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20  perating system 
13c30 63 72 61 73 68 65 73 20 6f 72 20 74 68 65 72 65  crashes or there
13c40 20 69 73 0a 2a 2a 20 61 6e 20 61 62 72 75 70 74   is.** an abrupt
13c50 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 77   power failure w
13c60 68 65 6e 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20  hen synchronous 
13c70 69 73 20 6f 66 66 2c 20 74 68 65 20 64 61 74 61  is off, the data
13c80 62 61 73 65 0a 2a 2a 20 63 6f 75 6c 64 20 62 65  base.** could be
13c90 20 6c 65 66 74 20 69 6e 20 61 6e 20 69 6e 63 6f   left in an inco
13ca0 6e 73 69 73 74 65 6e 74 20 61 6e 64 20 75 6e 72  nsistent and unr
13cb0 65 63 6f 76 65 72 61 62 6c 65 20 73 74 61 74 65  ecoverable state
13cc0 2e 0a 2a 2a 20 53 79 6e 63 68 72 6f 6e 6f 75 73  ..** Synchronous
13cd0 20 69 73 20 6f 6e 20 62 79 20 64 65 66 61 75 6c   is on by defaul
13ce0 74 20 73 6f 20 64 61 74 61 62 61 73 65 20 63 6f  t so database co
13cf0 72 72 75 70 74 69 6f 6e 20 69 73 20 6e 6f 74 0a  rruption is not.
13d00 2a 2a 20 6e 6f 72 6d 61 6c 6c 79 20 61 20 77 6f  ** normally a wo
13d10 72 72 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  rry..*/.int sqli
13d20 74 65 33 42 74 72 65 65 53 65 74 43 61 63 68 65  te3BtreeSetCache
13d30 53 69 7a 65 28 42 74 72 65 65 20 2a 70 2c 20 69  Size(Btree *p, i
13d40 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 42 74  nt mxPage){.  Bt
13d50 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
13d60 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20  >pBt;.  assert( 
13d70 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
13d80 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29  ld(p->db->mutex)
13d90 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72   );.  sqlite3Btr
13da0 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 73 71  eeEnter(p);.  sq
13db0 6c 69 74 65 33 50 61 67 65 72 53 65 74 43 61 63  lite3PagerSetCac
13dc0 68 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67  hesize(pBt->pPag
13dd0 65 72 2c 20 6d 78 50 61 67 65 29 3b 0a 20 20 73  er, mxPage);.  s
13de0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
13df0 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  (p);.  return SQ
13e00 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20  LITE_OK;.}..#if 
13e10 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f  SQLITE_MAX_MMAP_
13e20 53 49 5a 45 3e 30 0a 2f 2a 0a 2a 2a 20 43 68 61  SIZE>0./*.** Cha
13e30 6e 67 65 20 74 68 65 20 6c 69 6d 69 74 20 6f 6e  nge the limit on
13e40 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74   the amount of t
13e50 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
13e60 20 74 68 61 74 20 6d 61 79 20 62 65 0a 2a 2a 20   that may be.** 
13e70 6d 65 6d 6f 72 79 20 6d 61 70 70 65 64 2e 0a 2a  memory mapped..*
13e80 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
13e90 65 65 53 65 74 4d 6d 61 70 4c 69 6d 69 74 28 42  eeSetMmapLimit(B
13ea0 74 72 65 65 20 2a 70 2c 20 73 71 6c 69 74 65 33  tree *p, sqlite3
13eb0 5f 69 6e 74 36 34 20 73 7a 4d 6d 61 70 29 7b 0a  _int64 szMmap){.
13ec0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
13ed0 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65  = p->pBt;.  asse
13ee0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
13ef0 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75  x_held(p->db->mu
13f00 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65  tex) );.  sqlite
13f10 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
13f20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65    sqlite3PagerSe
13f30 74 4d 6d 61 70 4c 69 6d 69 74 28 70 42 74 2d 3e  tMmapLimit(pBt->
13f40 70 50 61 67 65 72 2c 20 73 7a 4d 6d 61 70 29 3b  pPager, szMmap);
13f50 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
13f60 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
13f70 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23  n SQLITE_OK;.}.#
13f80 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
13f90 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 20  MAX_MMAP_SIZE>0 
13fa0 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  */../*.** Change
13fb0 20 74 68 65 20 77 61 79 20 64 61 74 61 20 69 73   the way data is
13fc0 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 20   synced to disk 
13fd0 69 6e 20 6f 72 64 65 72 20 74 6f 20 69 6e 63 72  in order to incr
13fe0 65 61 73 65 20 6f 72 20 64 65 63 72 65 61 73 65  ease or decrease
13ff0 0a 2a 2a 20 68 6f 77 20 77 65 6c 6c 20 74 68 65  .** how well the
14000 20 64 61 74 61 62 61 73 65 20 72 65 73 69 73 74   database resist
14010 73 20 64 61 6d 61 67 65 20 64 75 65 20 74 6f 20  s damage due to 
14020 4f 53 20 63 72 61 73 68 65 73 20 61 6e 64 20 70  OS crashes and p
14030 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65 73  ower.** failures
14040 2e 20 20 4c 65 76 65 6c 20 31 20 69 73 20 74 68  .  Level 1 is th
14050 65 20 73 61 6d 65 20 61 73 20 61 73 79 6e 63 68  e same as asynch
14060 72 6f 6e 6f 75 73 20 28 6e 6f 20 73 79 6e 63 73  ronous (no syncs
14070 28 29 20 6f 63 63 75 72 20 61 6e 64 0a 2a 2a 20  () occur and.** 
14080 74 68 65 72 65 20 69 73 20 61 20 68 69 67 68 20  there is a high 
14090 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 64  probability of d
140a0 61 6d 61 67 65 29 20 20 4c 65 76 65 6c 20 32 20  amage)  Level 2 
140b0 69 73 20 74 68 65 20 64 65 66 61 75 6c 74 2e 20  is the default. 
140c0 20 54 68 65 72 65 0a 2a 2a 20 69 73 20 61 20 76   There.** is a v
140d0 65 72 79 20 6c 6f 77 20 62 75 74 20 6e 6f 6e 2d  ery low but non-
140e0 7a 65 72 6f 20 70 72 6f 62 61 62 69 6c 69 74 79  zero probability
140f0 20 6f 66 20 64 61 6d 61 67 65 2e 20 20 4c 65 76   of damage.  Lev
14100 65 6c 20 33 20 72 65 64 75 63 65 73 20 74 68 65  el 3 reduces the
14110 0a 2a 2a 20 70 72 6f 62 61 62 69 6c 69 74 79 20  .** probability 
14120 6f 66 20 64 61 6d 61 67 65 20 74 6f 20 6e 65 61  of damage to nea
14130 72 20 7a 65 72 6f 20 62 75 74 20 77 69 74 68 20  r zero but with 
14140 61 20 77 72 69 74 65 20 70 65 72 66 6f 72 6d 61  a write performa
14150 6e 63 65 20 72 65 64 75 63 74 69 6f 6e 2e 0a 2a  nce reduction..*
14160 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
14170 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47  _OMIT_PAGER_PRAG
14180 4d 41 53 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  MAS.int sqlite3B
14190 74 72 65 65 53 65 74 50 61 67 65 72 46 6c 61 67  treeSetPagerFlag
141a0 73 28 0a 20 20 42 74 72 65 65 20 2a 70 2c 20 20  s(.  Btree *p,  
141b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
141c0 68 65 20 62 74 72 65 65 20 74 6f 20 73 65 74 20  he btree to set 
141d0 74 68 65 20 73 61 66 65 74 79 20 6c 65 76 65 6c  the safety level
141e0 20 6f 6e 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65   on */.  unsigne
141f0 64 20 70 67 46 6c 61 67 73 20 20 20 20 20 20 20  d pgFlags       
14200 2f 2a 20 56 61 72 69 6f 75 73 20 50 41 47 45 52  /* Various PAGER
14210 5f 2a 20 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20  _* flags */.){. 
14220 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
14230 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72   p->pBt;.  asser
14240 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
14250 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74  _held(p->db->mut
14260 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  ex) );.  sqlite3
14270 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
14280 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
14290 46 6c 61 67 73 28 70 42 74 2d 3e 70 50 61 67 65  Flags(pBt->pPage
142a0 72 2c 20 70 67 46 6c 61 67 73 29 3b 0a 20 20 73  r, pgFlags);.  s
142b0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
142c0 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  (p);.  return SQ
142d0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69  LITE_OK;.}.#endi
142e0 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  f../*.** Return 
142f0 54 52 55 45 20 69 66 20 74 68 65 20 67 69 76 65  TRUE if the give
14300 6e 20 62 74 72 65 65 20 69 73 20 73 65 74 20 74  n btree is set t
14310 6f 20 73 61 66 65 74 79 20 6c 65 76 65 6c 20 31  o safety level 1
14320 2e 20 20 49 6e 20 6f 74 68 65 72 0a 2a 2a 20 77  .  In other.** w
14330 6f 72 64 73 2c 20 72 65 74 75 72 6e 20 54 52 55  ords, return TRU
14340 45 20 69 66 20 6e 6f 20 73 79 6e 63 28 29 20 6f  E if no sync() o
14350 63 63 75 72 73 20 6f 6e 20 74 68 65 20 64 69 73  ccurs on the dis
14360 6b 20 66 69 6c 65 73 2e 0a 2a 2f 0a 69 6e 74 20  k files..*/.int 
14370 73 71 6c 69 74 65 33 42 74 72 65 65 53 79 6e 63  sqlite3BtreeSync
14380 44 69 73 61 62 6c 65 64 28 42 74 72 65 65 20 2a  Disabled(Btree *
14390 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  p){.  BtShared *
143a0 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
143b0 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74  int rc;.  assert
143c0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
143d0 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65  held(p->db->mute
143e0 78 29 20 29 3b 20 20 0a 20 20 73 71 6c 69 74 65  x) );  .  sqlite
143f0 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
14400 20 20 61 73 73 65 72 74 28 20 70 42 74 20 26 26    assert( pBt &&
14410 20 70 42 74 2d 3e 70 50 61 67 65 72 20 29 3b 0a   pBt->pPager );.
14420 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
14430 67 65 72 4e 6f 73 79 6e 63 28 70 42 74 2d 3e 70  gerNosync(pBt->p
14440 50 61 67 65 72 29 3b 0a 20 20 73 71 6c 69 74 65  Pager);.  sqlite
14450 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
14460 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
14470 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
14480 20 64 65 66 61 75 6c 74 20 70 61 67 65 73 20 73   default pages s
14490 69 7a 65 20 61 6e 64 20 74 68 65 20 6e 75 6d 62  ize and the numb
144a0 65 72 20 6f 66 20 72 65 73 65 72 76 65 64 20 62  er of reserved b
144b0 79 74 65 73 20 70 65 72 20 70 61 67 65 2e 0a 2a  ytes per page..*
144c0 2a 20 4f 72 2c 20 69 66 20 74 68 65 20 70 61 67  * Or, if the pag
144d0 65 20 73 69 7a 65 20 68 61 73 20 61 6c 72 65 61  e size has alrea
144e0 64 79 20 62 65 65 6e 20 66 69 78 65 64 2c 20 72  dy been fixed, r
144f0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41  eturn SQLITE_REA
14500 44 4f 4e 4c 59 20 0a 2a 2a 20 77 69 74 68 6f 75  DONLY .** withou
14510 74 20 63 68 61 6e 67 69 6e 67 20 61 6e 79 74 68  t changing anyth
14520 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  ing..**.** The p
14530 61 67 65 20 73 69 7a 65 20 6d 75 73 74 20 62 65  age size must be
14540 20 61 20 70 6f 77 65 72 20 6f 66 20 32 20 62 65   a power of 2 be
14550 74 77 65 65 6e 20 35 31 32 20 61 6e 64 20 36 35  tween 512 and 65
14560 35 33 36 2e 20 20 49 66 20 74 68 65 20 70 61 67  536.  If the pag
14570 65 0a 2a 2a 20 73 69 7a 65 20 73 75 70 70 6c 69  e.** size suppli
14580 65 64 20 64 6f 65 73 20 6e 6f 74 20 6d 65 65 74  ed does not meet
14590 20 74 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74   this constraint
145a0 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 73   then the page s
145b0 69 7a 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 63 68  ize is not.** ch
145c0 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 50 61 67  anged..**.** Pag
145d0 65 20 73 69 7a 65 73 20 61 72 65 20 63 6f 6e 73  e sizes are cons
145e0 74 72 61 69 6e 65 64 20 74 6f 20 62 65 20 61 20  trained to be a 
145f0 70 6f 77 65 72 20 6f 66 20 74 77 6f 20 73 6f 20  power of two so 
14600 74 68 61 74 20 74 68 65 20 72 65 67 69 6f 6e 0a  that the region.
14610 2a 2a 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ** of the databa
14620 73 65 20 66 69 6c 65 20 75 73 65 64 20 66 6f 72  se file used for
14630 20 6c 6f 63 6b 69 6e 67 20 28 62 65 67 69 6e 6e   locking (beginn
14640 69 6e 67 20 61 74 20 50 45 4e 44 49 4e 47 5f 42  ing at PENDING_B
14650 59 54 45 2c 0a 2a 2a 20 74 68 65 20 66 69 72 73  YTE,.** the firs
14660 74 20 62 79 74 65 20 70 61 73 74 20 74 68 65 20  t byte past the 
14670 31 47 42 20 62 6f 75 6e 64 61 72 79 2c 20 30 78  1GB boundary, 0x
14680 34 30 30 30 30 30 30 30 29 20 6e 65 65 64 73 20  40000000) needs 
14690 74 6f 20 6f 63 63 75 72 0a 2a 2a 20 61 74 20 74  to occur.** at t
146a0 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  he beginning of 
146b0 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  a page..**.** If
146c0 20 70 61 72 61 6d 65 74 65 72 20 6e 52 65 73 65   parameter nRese
146d0 72 76 65 20 69 73 20 6c 65 73 73 20 74 68 61 6e  rve is less than
146e0 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20   zero, then the 
146f0 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 65 72 76  number of reserv
14700 65 64 0a 2a 2a 20 62 79 74 65 73 20 70 65 72 20  ed.** bytes per 
14710 70 61 67 65 20 69 73 20 6c 65 66 74 20 75 6e 63  page is left unc
14720 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  hanged..**.** If
14730 20 74 68 65 20 69 46 69 78 21 3d 30 20 74 68 65   the iFix!=0 the
14740 6e 20 74 68 65 20 42 54 53 5f 50 41 47 45 53 49  n the BTS_PAGESI
14750 5a 45 5f 46 49 58 45 44 20 66 6c 61 67 20 69 73  ZE_FIXED flag is
14760 20 73 65 74 20 73 6f 20 74 68 61 74 20 74 68 65   set so that the
14770 20 70 61 67 65 20 73 69 7a 65 0a 2a 2a 20 61 6e   page size.** an
14780 64 20 61 75 74 6f 76 61 63 75 75 6d 20 6d 6f 64  d autovacuum mod
14790 65 20 63 61 6e 20 6e 6f 20 6c 6f 6e 67 65 72 20  e can no longer 
147a0 62 65 20 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 69  be changed..*/.i
147b0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53  nt sqlite3BtreeS
147c0 65 74 50 61 67 65 53 69 7a 65 28 42 74 72 65 65  etPageSize(Btree
147d0 20 2a 70 2c 20 69 6e 74 20 70 61 67 65 53 69 7a   *p, int pageSiz
147e0 65 2c 20 69 6e 74 20 6e 52 65 73 65 72 76 65 2c  e, int nReserve,
147f0 20 69 6e 74 20 69 46 69 78 29 7b 0a 20 20 69 6e   int iFix){.  in
14800 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
14810 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
14820 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73  t = p->pBt;.  as
14830 73 65 72 74 28 20 6e 52 65 73 65 72 76 65 3e 3d  sert( nReserve>=
14840 2d 31 20 26 26 20 6e 52 65 73 65 72 76 65 3c 3d  -1 && nReserve<=
14850 32 35 35 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  255 );.  sqlite3
14860 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 23  BtreeEnter(p);.#
14870 69 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f  if SQLITE_HAS_CO
14880 44 45 43 0a 20 20 69 66 28 20 6e 52 65 73 65 72  DEC.  if( nReser
14890 76 65 3e 70 42 74 2d 3e 6f 70 74 69 6d 61 6c 52  ve>pBt->optimalR
148a0 65 73 65 72 76 65 20 29 20 70 42 74 2d 3e 6f 70  eserve ) pBt->op
148b0 74 69 6d 61 6c 52 65 73 65 72 76 65 20 3d 20 28  timalReserve = (
148c0 75 38 29 6e 52 65 73 65 72 76 65 3b 0a 23 65 6e  u8)nReserve;.#en
148d0 64 69 66 0a 20 20 69 66 28 20 70 42 74 2d 3e 62  dif.  if( pBt->b
148e0 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 50 41  tsFlags & BTS_PA
148f0 47 45 53 49 5a 45 5f 46 49 58 45 44 20 29 7b 0a  GESIZE_FIXED ){.
14900 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
14910 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 72 65  Leave(p);.    re
14920 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44  turn SQLITE_READ
14930 4f 4e 4c 59 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ONLY;.  }.  if( 
14940 6e 52 65 73 65 72 76 65 3c 30 20 29 7b 0a 20 20  nReserve<0 ){.  
14950 20 20 6e 52 65 73 65 72 76 65 20 3d 20 70 42 74    nReserve = pBt
14960 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 42 74  ->pageSize - pBt
14970 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20  ->usableSize;.  
14980 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65 73  }.  assert( nRes
14990 65 72 76 65 3e 3d 30 20 26 26 20 6e 52 65 73 65  erve>=0 && nRese
149a0 72 76 65 3c 3d 32 35 35 20 29 3b 0a 20 20 69 66  rve<=255 );.  if
149b0 28 20 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20  ( pageSize>=512 
149c0 26 26 20 70 61 67 65 53 69 7a 65 3c 3d 53 51 4c  && pageSize<=SQL
149d0 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a  ITE_MAX_PAGE_SIZ
149e0 45 20 26 26 0a 20 20 20 20 20 20 20 20 28 28 70  E &&.        ((p
149f0 61 67 65 53 69 7a 65 2d 31 29 26 70 61 67 65 53  ageSize-1)&pageS
14a00 69 7a 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 61  ize)==0 ){.    a
14a10 73 73 65 72 74 28 20 28 70 61 67 65 53 69 7a 65  ssert( (pageSize
14a20 20 26 20 37 29 3d 3d 30 20 29 3b 0a 20 20 20 20   & 7)==0 );.    
14a30 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e 70 43  assert( !pBt->pC
14a40 75 72 73 6f 72 20 29 3b 0a 20 20 20 20 70 42 74  ursor );.    pBt
14a50 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 28 75 33  ->pageSize = (u3
14a60 32 29 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20  2)pageSize;.    
14a70 66 72 65 65 54 65 6d 70 53 70 61 63 65 28 70 42  freeTempSpace(pB
14a80 74 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73  t);.  }.  rc = s
14a90 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61  qlite3PagerSetPa
14aa0 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67  gesize(pBt->pPag
14ab0 65 72 2c 20 26 70 42 74 2d 3e 70 61 67 65 53 69  er, &pBt->pageSi
14ac0 7a 65 2c 20 6e 52 65 73 65 72 76 65 29 3b 0a 20  ze, nReserve);. 
14ad0 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
14ae0 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65   = pBt->pageSize
14af0 20 2d 20 28 75 31 36 29 6e 52 65 73 65 72 76 65   - (u16)nReserve
14b00 3b 0a 20 20 69 66 28 20 69 46 69 78 20 29 20 70  ;.  if( iFix ) p
14b10 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20  Bt->btsFlags |= 
14b20 42 54 53 5f 50 41 47 45 53 49 5a 45 5f 46 49 58  BTS_PAGESIZE_FIX
14b30 45 44 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  ED;.  sqlite3Btr
14b40 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
14b50 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
14b60 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63 75 72  * Return the cur
14b70 72 65 6e 74 6c 79 20 64 65 66 69 6e 65 64 20 70  rently defined p
14b80 61 67 65 20 73 69 7a 65 0a 2a 2f 0a 69 6e 74 20  age size.*/.int 
14b90 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50  sqlite3BtreeGetP
14ba0 61 67 65 53 69 7a 65 28 42 74 72 65 65 20 2a 70  ageSize(Btree *p
14bb0 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 70  ){.  return p->p
14bc0 42 74 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 7d 0a  Bt->pageSize;.}.
14bd0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
14be0 74 69 6f 6e 20 69 73 20 73 69 6d 69 6c 61 72 20  tion is similar 
14bf0 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65 47  to sqlite3BtreeG
14c00 65 74 52 65 73 65 72 76 65 28 29 2c 20 65 78 63  etReserve(), exc
14c10 65 70 74 20 74 68 61 74 20 69 74 0a 2a 2a 20 6d  ept that it.** m
14c20 61 79 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65  ay only be calle
14c30 64 20 69 66 20 69 74 20 69 73 20 67 75 61 72 61  d if it is guara
14c40 6e 74 65 65 64 20 74 68 61 74 20 74 68 65 20 62  nteed that the b
14c50 2d 74 72 65 65 20 6d 75 74 65 78 20 69 73 20 61  -tree mutex is a
14c60 6c 72 65 61 64 79 0a 2a 2a 20 68 65 6c 64 2e 0a  lready.** held..
14c70 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 75 73  **.** This is us
14c80 65 66 75 6c 20 69 6e 20 6f 6e 65 20 73 70 65 63  eful in one spec
14c90 69 61 6c 20 63 61 73 65 20 69 6e 20 74 68 65 20  ial case in the 
14ca0 62 61 63 6b 75 70 20 41 50 49 20 63 6f 64 65 20  backup API code 
14cb0 77 68 65 72 65 20 69 74 20 69 73 0a 2a 2a 20 6b  where it is.** k
14cc0 6e 6f 77 6e 20 74 68 61 74 20 74 68 65 20 73 68  nown that the sh
14cd0 61 72 65 64 20 62 2d 74 72 65 65 20 6d 75 74 65  ared b-tree mute
14ce0 78 20 69 73 20 68 65 6c 64 2c 20 62 75 74 20 74  x is held, but t
14cf0 68 65 20 6d 75 74 65 78 20 6f 6e 20 74 68 65 20  he mutex on the 
14d00 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 68 61 6e  .** database han
14d10 64 6c 65 20 74 68 61 74 20 6f 77 6e 73 20 2a 70  dle that owns *p
14d20 20 69 73 20 6e 6f 74 2e 20 49 6e 20 74 68 69 73   is not. In this
14d30 20 63 61 73 65 20 69 66 20 73 71 6c 69 74 65 33   case if sqlite3
14d40 42 74 72 65 65 45 6e 74 65 72 28 29 0a 2a 2a 20  BtreeEnter().** 
14d50 77 65 72 65 20 74 6f 20 62 65 20 63 61 6c 6c 65  were to be calle
14d60 64 2c 20 69 74 20 6d 69 67 68 74 20 63 6f 6c 6c  d, it might coll
14d70 69 64 65 20 77 69 74 68 20 73 6f 6d 65 20 6f 74  ide with some ot
14d80 68 65 72 20 6f 70 65 72 61 74 69 6f 6e 20 6f 6e  her operation on
14d90 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
14da0 20 68 61 6e 64 6c 65 20 74 68 61 74 20 6f 77 6e   handle that own
14db0 73 20 2a 70 2c 20 63 61 75 73 69 6e 67 20 75 6e  s *p, causing un
14dc0 64 65 66 69 6e 65 64 20 62 65 68 61 76 69 6f 72  defined behavior
14dd0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
14de0 42 74 72 65 65 47 65 74 52 65 73 65 72 76 65 4e  BtreeGetReserveN
14df0 6f 4d 75 74 65 78 28 42 74 72 65 65 20 2a 70 29  oMutex(Btree *p)
14e00 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 61 73 73  {.  int n;.  ass
14e10 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
14e20 65 78 5f 68 65 6c 64 28 70 2d 3e 70 42 74 2d 3e  ex_held(p->pBt->
14e30 6d 75 74 65 78 29 20 29 3b 0a 20 20 6e 20 3d 20  mutex) );.  n = 
14e40 70 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  p->pBt->pageSize
14e50 20 2d 20 70 2d 3e 70 42 74 2d 3e 75 73 61 62 6c   - p->pBt->usabl
14e60 65 53 69 7a 65 3b 0a 20 20 72 65 74 75 72 6e 20  eSize;.  return 
14e70 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  n;.}../*.** Retu
14e80 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
14e90 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20   bytes of space 
14ea0 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 65 76  at the end of ev
14eb0 65 72 79 20 70 61 67 65 20 74 68 61 74 0a 2a 2a  ery page that.**
14ec0 20 61 72 65 20 69 6e 74 65 6e 74 75 61 6c 6c 79   are intentually
14ed0 20 6c 65 66 74 20 75 6e 75 73 65 64 2e 20 20 54   left unused.  T
14ee0 68 69 73 20 69 73 20 74 68 65 20 22 72 65 73 65  his is the "rese
14ef0 72 76 65 64 22 20 73 70 61 63 65 20 74 68 61 74  rved" space that
14f00 20 69 73 0a 2a 2a 20 73 6f 6d 65 74 69 6d 65 73   is.** sometimes
14f10 20 75 73 65 64 20 62 79 20 65 78 74 65 6e 73 69   used by extensi
14f20 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51  ons..**.** If SQ
14f30 4c 49 54 45 5f 48 41 53 5f 4d 55 54 45 58 20 69  LITE_HAS_MUTEX i
14f40 73 20 64 65 66 69 6e 65 64 20 74 68 65 6e 20 74  s defined then t
14f50 68 65 20 6e 75 6d 62 65 72 20 72 65 74 75 72 6e  he number return
14f60 65 64 20 69 73 20 74 68 65 0a 2a 2a 20 67 72 65  ed is the.** gre
14f70 61 74 65 72 20 6f 66 20 74 68 65 20 63 75 72 72  ater of the curr
14f80 65 6e 74 20 72 65 73 65 72 76 65 64 20 73 70 61  ent reserved spa
14f90 63 65 20 61 6e 64 20 74 68 65 20 6d 61 78 69 6d  ce and the maxim
14fa0 75 6d 20 72 65 71 75 65 73 74 65 64 0a 2a 2a 20  um requested.** 
14fb0 72 65 73 65 72 76 65 20 73 70 61 63 65 2e 0a 2a  reserve space..*
14fc0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
14fd0 65 65 47 65 74 4f 70 74 69 6d 61 6c 52 65 73 65  eeGetOptimalRese
14fe0 72 76 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  rve(Btree *p){. 
14ff0 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65   int n;.  sqlite
15000 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
15010 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 42 74 72    n = sqlite3Btr
15020 65 65 47 65 74 52 65 73 65 72 76 65 4e 6f 4d 75  eeGetReserveNoMu
15030 74 65 78 28 70 29 3b 0a 23 69 66 64 65 66 20 53  tex(p);.#ifdef S
15040 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a  QLITE_HAS_CODEC.
15050 20 20 69 66 28 20 6e 3c 70 2d 3e 70 42 74 2d 3e    if( n<p->pBt->
15060 6f 70 74 69 6d 61 6c 52 65 73 65 72 76 65 20 29  optimalReserve )
15070 20 6e 20 3d 20 70 2d 3e 70 42 74 2d 3e 6f 70 74   n = p->pBt->opt
15080 69 6d 61 6c 52 65 73 65 72 76 65 3b 0a 23 65 6e  imalReserve;.#en
15090 64 69 66 0a 20 20 73 71 6c 69 74 65 33 42 74 72  dif.  sqlite3Btr
150a0 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
150b0 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  turn n;.}.../*.*
150c0 2a 20 53 65 74 20 74 68 65 20 6d 61 78 69 6d 75  * Set the maximu
150d0 6d 20 70 61 67 65 20 63 6f 75 6e 74 20 66 6f 72  m page count for
150e0 20 61 20 64 61 74 61 62 61 73 65 20 69 66 20 6d   a database if m
150f0 78 50 61 67 65 20 69 73 20 70 6f 73 69 74 69 76  xPage is positiv
15100 65 2e 0a 2a 2a 20 4e 6f 20 63 68 61 6e 67 65 73  e..** No changes
15110 20 61 72 65 20 6d 61 64 65 20 69 66 20 6d 78 50   are made if mxP
15120 61 67 65 20 69 73 20 30 20 6f 72 20 6e 65 67 61  age is 0 or nega
15130 74 69 76 65 2e 0a 2a 2a 20 52 65 67 61 72 64 6c  tive..** Regardl
15140 65 73 73 20 6f 66 20 74 68 65 20 76 61 6c 75 65  ess of the value
15150 20 6f 66 20 6d 78 50 61 67 65 2c 20 72 65 74 75   of mxPage, retu
15160 72 6e 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 70  rn the maximum p
15170 61 67 65 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e  age count..*/.in
15180 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 61  t sqlite3BtreeMa
15190 78 50 61 67 65 43 6f 75 6e 74 28 42 74 72 65 65  xPageCount(Btree
151a0 20 2a 70 2c 20 69 6e 74 20 6d 78 50 61 67 65 29   *p, int mxPage)
151b0 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c  {.  int n;.  sql
151c0 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
151d0 29 3b 0a 20 20 6e 20 3d 20 73 71 6c 69 74 65 33  );.  n = sqlite3
151e0 50 61 67 65 72 4d 61 78 50 61 67 65 43 6f 75 6e  PagerMaxPageCoun
151f0 74 28 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72  t(p->pBt->pPager
15200 2c 20 6d 78 50 61 67 65 29 3b 0a 20 20 73 71 6c  , mxPage);.  sql
15210 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
15220 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d  );.  return n;.}
15230 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
15240 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54  BTS_SECURE_DELET
15250 45 20 66 6c 61 67 20 69 66 20 6e 65 77 46 6c 61  E flag if newFla
15260 67 20 69 73 20 30 20 6f 72 20 31 2e 20 20 49 66  g is 0 or 1.  If
15270 20 6e 65 77 46 6c 61 67 20 69 73 20 2d 31 2c 0a   newFlag is -1,.
15280 2a 2a 20 74 68 65 6e 20 6d 61 6b 65 20 6e 6f 20  ** then make no 
15290 63 68 61 6e 67 65 73 2e 20 20 41 6c 77 61 79 73  changes.  Always
152a0 20 72 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75   return the valu
152b0 65 20 6f 66 20 74 68 65 20 42 54 53 5f 53 45 43  e of the BTS_SEC
152c0 55 52 45 5f 44 45 4c 45 54 45 0a 2a 2a 20 73 65  URE_DELETE.** se
152d0 74 74 69 6e 67 20 61 66 74 65 72 20 74 68 65 20  tting after the 
152e0 63 68 61 6e 67 65 2e 0a 2a 2f 0a 69 6e 74 20 73  change..*/.int s
152f0 71 6c 69 74 65 33 42 74 72 65 65 53 65 63 75 72  qlite3BtreeSecur
15300 65 44 65 6c 65 74 65 28 42 74 72 65 65 20 2a 70  eDelete(Btree *p
15310 2c 20 69 6e 74 20 6e 65 77 46 6c 61 67 29 7b 0a  , int newFlag){.
15320 20 20 69 6e 74 20 62 3b 0a 20 20 69 66 28 20 70    int b;.  if( p
15330 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
15340 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
15350 74 65 72 28 70 29 3b 0a 20 20 69 66 28 20 6e 65  ter(p);.  if( ne
15360 77 46 6c 61 67 3e 3d 30 20 29 7b 0a 20 20 20 20  wFlag>=0 ){.    
15370 70 2d 3e 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  p->pBt->btsFlags
15380 20 26 3d 20 7e 42 54 53 5f 53 45 43 55 52 45 5f   &= ~BTS_SECURE_
15390 44 45 4c 45 54 45 3b 0a 20 20 20 20 69 66 28 20  DELETE;.    if( 
153a0 6e 65 77 46 6c 61 67 20 29 20 70 2d 3e 70 42 74  newFlag ) p->pBt
153b0 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54  ->btsFlags |= BT
153c0 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 3b  S_SECURE_DELETE;
153d0 0a 20 20 7d 20 0a 20 20 62 20 3d 20 28 70 2d 3e  .  } .  b = (p->
153e0 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20  pBt->btsFlags & 
153f0 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54  BTS_SECURE_DELET
15400 45 29 21 3d 30 3b 0a 20 20 73 71 6c 69 74 65 33  E)!=0;.  sqlite3
15410 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
15420 20 72 65 74 75 72 6e 20 62 3b 0a 7d 0a 0a 2f 2a   return b;.}../*
15430 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 27  .** Change the '
15440 61 75 74 6f 2d 76 61 63 75 75 6d 27 20 70 72 6f  auto-vacuum' pro
15450 70 65 72 74 79 20 6f 66 20 74 68 65 20 64 61 74  perty of the dat
15460 61 62 61 73 65 2e 20 49 66 20 74 68 65 20 27 61  abase. If the 'a
15470 75 74 6f 56 61 63 75 75 6d 27 0a 2a 2a 20 70 61  utoVacuum'.** pa
15480 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 6e 2d 7a  rameter is non-z
15490 65 72 6f 2c 20 74 68 65 6e 20 61 75 74 6f 2d 76  ero, then auto-v
154a0 61 63 75 75 6d 20 6d 6f 64 65 20 69 73 20 65 6e  acuum mode is en
154b0 61 62 6c 65 64 2e 20 49 66 20 7a 65 72 6f 2c 20  abled. If zero, 
154c0 69 74 0a 2a 2a 20 69 73 20 64 69 73 61 62 6c 65  it.** is disable
154d0 64 2e 20 54 68 65 20 64 65 66 61 75 6c 74 20 76  d. The default v
154e0 61 6c 75 65 20 66 6f 72 20 74 68 65 20 61 75 74  alue for the aut
154f0 6f 2d 76 61 63 75 75 6d 20 70 72 6f 70 65 72 74  o-vacuum propert
15500 79 20 69 73 20 0a 2a 2a 20 64 65 74 65 72 6d 69  y is .** determi
15510 6e 65 64 20 62 79 20 74 68 65 20 53 51 4c 49 54  ned by the SQLIT
15520 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41  E_DEFAULT_AUTOVA
15530 43 55 55 4d 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 69  CUUM macro..*/.i
15540 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53  nt sqlite3BtreeS
15550 65 74 41 75 74 6f 56 61 63 75 75 6d 28 42 74 72  etAutoVacuum(Btr
15560 65 65 20 2a 70 2c 20 69 6e 74 20 61 75 74 6f 56  ee *p, int autoV
15570 61 63 75 75 6d 29 7b 0a 23 69 66 64 65 66 20 53  acuum){.#ifdef S
15580 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
15590 41 43 55 55 4d 0a 20 20 72 65 74 75 72 6e 20 53  ACUUM.  return S
155a0 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a  QLITE_READONLY;.
155b0 23 65 6c 73 65 0a 20 20 42 74 53 68 61 72 65 64  #else.  BtShared
155c0 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
155d0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
155e0 45 5f 4f 4b 3b 0a 20 20 75 38 20 61 76 20 3d 20  E_OK;.  u8 av = 
155f0 28 75 38 29 61 75 74 6f 56 61 63 75 75 6d 3b 0a  (u8)autoVacuum;.
15600 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
15610 6e 74 65 72 28 70 29 3b 0a 20 20 69 66 28 20 28  nter(p);.  if( (
15620 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20  pBt->btsFlags & 
15630 42 54 53 5f 50 41 47 45 53 49 5a 45 5f 46 49 58  BTS_PAGESIZE_FIX
15640 45 44 29 21 3d 30 20 26 26 20 28 61 76 20 3f 31  ED)!=0 && (av ?1
15650 3a 30 29 21 3d 70 42 74 2d 3e 61 75 74 6f 56 61  :0)!=pBt->autoVa
15660 63 75 75 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d  cuum ){.    rc =
15670 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
15680 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
15690 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d  Bt->autoVacuum =
156a0 20 61 76 20 3f 31 3a 30 3b 0a 20 20 20 20 70 42   av ?1:0;.    pB
156b0 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20  t->incrVacuum = 
156c0 61 76 3d 3d 32 20 3f 31 3a 30 3b 0a 20 20 7d 0a  av==2 ?1:0;.  }.
156d0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
156e0 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
156f0 20 72 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f   rc;.#endif.}../
15700 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
15710 76 61 6c 75 65 20 6f 66 20 74 68 65 20 27 61 75  value of the 'au
15720 74 6f 2d 76 61 63 75 75 6d 27 20 70 72 6f 70 65  to-vacuum' prope
15730 72 74 79 2e 20 49 66 20 61 75 74 6f 2d 76 61 63  rty. If auto-vac
15740 75 75 6d 20 69 73 20 0a 2a 2a 20 65 6e 61 62 6c  uum is .** enabl
15750 65 64 20 31 20 69 73 20 72 65 74 75 72 6e 65 64  ed 1 is returned
15760 2e 20 4f 74 68 65 72 77 69 73 65 20 30 2e 0a 2a  . Otherwise 0..*
15770 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
15780 65 65 47 65 74 41 75 74 6f 56 61 63 75 75 6d 28  eeGetAutoVacuum(
15790 42 74 72 65 65 20 2a 70 29 7b 0a 23 69 66 64 65  Btree *p){.#ifde
157a0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
157b0 54 4f 56 41 43 55 55 4d 0a 20 20 72 65 74 75 72  TOVACUUM.  retur
157c0 6e 20 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55  n BTREE_AUTOVACU
157d0 55 4d 5f 4e 4f 4e 45 3b 0a 23 65 6c 73 65 0a 20  UM_NONE;.#else. 
157e0 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74   int rc;.  sqlit
157f0 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
15800 0a 20 20 72 63 20 3d 20 28 0a 20 20 20 20 28 21  .  rc = (.    (!
15810 70 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  p->pBt->autoVacu
15820 75 6d 29 3f 42 54 52 45 45 5f 41 55 54 4f 56 41  um)?BTREE_AUTOVA
15830 43 55 55 4d 5f 4e 4f 4e 45 3a 0a 20 20 20 20 28  CUUM_NONE:.    (
15840 21 70 2d 3e 70 42 74 2d 3e 69 6e 63 72 56 61 63  !p->pBt->incrVac
15850 75 75 6d 29 3f 42 54 52 45 45 5f 41 55 54 4f 56  uum)?BTREE_AUTOV
15860 41 43 55 55 4d 5f 46 55 4c 4c 3a 0a 20 20 20 20  ACUUM_FULL:.    
15870 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d  BTREE_AUTOVACUUM
15880 5f 49 4e 43 52 0a 20 20 29 3b 0a 20 20 73 71 6c  _INCR.  );.  sql
15890 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
158a0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
158b0 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  #endif.}.../*.**
158c0 20 47 65 74 20 61 20 72 65 66 65 72 65 6e 63 65   Get a reference
158d0 20 74 6f 20 70 50 61 67 65 31 20 6f 66 20 74 68   to pPage1 of th
158e0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
158f0 20 20 54 68 69 73 20 77 69 6c 6c 0a 2a 2a 20 61    This will.** a
15900 6c 73 6f 20 61 63 71 75 69 72 65 20 61 20 72 65  lso acquire a re
15910 61 64 6c 6f 63 6b 20 6f 6e 20 74 68 61 74 20 66  adlock on that f
15920 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54  ile..**.** SQLIT
15930 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
15940 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 49 66   on success.  If
15950 20 74 68 65 20 66 69 6c 65 20 69 73 20 6e 6f 74   the file is not
15960 20 61 0a 2a 2a 20 77 65 6c 6c 2d 66 6f 72 6d 65   a.** well-forme
15970 64 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  d database file,
15980 20 74 68 65 6e 20 53 51 4c 49 54 45 5f 43 4f 52   then SQLITE_COR
15990 52 55 50 54 20 69 73 20 72 65 74 75 72 6e 65 64  RUPT is returned
159a0 2e 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59  ..** SQLITE_BUSY
159b0 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
159c0 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
159d0 6c 6f 63 6b 65 64 2e 20 20 53 51 4c 49 54 45 5f  locked.  SQLITE_
159e0 4e 4f 4d 45 4d 0a 2a 2a 20 69 73 20 72 65 74 75  NOMEM.** is retu
159f0 72 6e 65 64 20 69 66 20 77 65 20 72 75 6e 20 6f  rned if we run o
15a00 75 74 20 6f 66 20 6d 65 6d 6f 72 79 2e 20 0a 2a  ut of memory. .*
15a10 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 6f 63  /.static int loc
15a20 6b 42 74 72 65 65 28 42 74 53 68 61 72 65 64 20  kBtree(BtShared 
15a30 2a 70 42 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b  *pBt){.  int rc;
15a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
15a50 20 52 65 73 75 6c 74 20 63 6f 64 65 20 66 72 6f   Result code fro
15a60 6d 20 73 75 62 66 75 6e 63 74 69 6f 6e 73 20 2a  m subfunctions *
15a70 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  /.  MemPage *pPa
15a80 67 65 31 3b 20 20 20 20 20 2f 2a 20 50 61 67 65  ge1;     /* Page
15a90 20 31 20 6f 66 20 74 68 65 20 64 61 74 61 62 61   1 of the databa
15aa0 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  se file */.  int
15ab0 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20 20   nPage;         
15ac0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
15ad0 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61  ages in the data
15ae0 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50  base */.  int nP
15af0 61 67 65 46 69 6c 65 20 3d 20 30 3b 20 20 20 2f  ageFile = 0;   /
15b00 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
15b10 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  s in the databas
15b20 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  e file */.  int 
15b30 6e 50 61 67 65 48 65 61 64 65 72 3b 20 20 20 20  nPageHeader;    
15b40 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
15b50 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61 62  ges in the datab
15b60 61 73 65 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  ase according to
15b70 20 68 64 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72   hdr */..  asser
15b80 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
15b90 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
15ba0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
15bb0 42 74 2d 3e 70 50 61 67 65 31 3d 3d 30 20 29 3b  Bt->pPage1==0 );
15bc0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
15bd0 61 67 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 70  agerSharedLock(p
15be0 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 69  Bt->pPager);.  i
15bf0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
15c00 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
15c10 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67  rc = btreeGetPag
15c20 65 28 70 42 74 2c 20 31 2c 20 26 70 50 61 67 65  e(pBt, 1, &pPage
15c30 31 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21  1, 0);.  if( rc!
15c40 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
15c50 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 44 6f  urn rc;..  /* Do
15c60 20 73 6f 6d 65 20 63 68 65 63 6b 69 6e 67 20 74   some checking t
15c70 6f 20 68 65 6c 70 20 69 6e 73 75 72 65 20 74 68  o help insure th
15c80 65 20 66 69 6c 65 20 77 65 20 6f 70 65 6e 65 64  e file we opened
15c90 20 72 65 61 6c 6c 79 20 69 73 0a 20 20 2a 2a 20   really is.  ** 
15ca0 61 20 76 61 6c 69 64 20 64 61 74 61 62 61 73 65  a valid database
15cb0 20 66 69 6c 65 2e 20 0a 20 20 2a 2f 0a 20 20 6e   file. .  */.  n
15cc0 50 61 67 65 20 3d 20 6e 50 61 67 65 48 65 61 64  Page = nPageHead
15cd0 65 72 20 3d 20 67 65 74 34 62 79 74 65 28 32 38  er = get4byte(28
15ce0 2b 28 75 38 2a 29 70 50 61 67 65 31 2d 3e 61 44  +(u8*)pPage1->aD
15cf0 61 74 61 29 3b 0a 20 20 73 71 6c 69 74 65 33 50  ata);.  sqlite3P
15d00 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42  agerPagecount(pB
15d10 74 2d 3e 70 50 61 67 65 72 2c 20 26 6e 50 61 67  t->pPager, &nPag
15d20 65 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 6e 50  eFile);.  if( nP
15d30 61 67 65 3d 3d 30 20 7c 7c 20 6d 65 6d 63 6d 70  age==0 || memcmp
15d40 28 32 34 2b 28 75 38 2a 29 70 50 61 67 65 31 2d  (24+(u8*)pPage1-
15d50 3e 61 44 61 74 61 2c 20 39 32 2b 28 75 38 2a 29  >aData, 92+(u8*)
15d60 70 50 61 67 65 31 2d 3e 61 44 61 74 61 2c 34 29  pPage1->aData,4)
15d70 21 3d 30 20 29 7b 0a 20 20 20 20 6e 50 61 67 65  !=0 ){.    nPage
15d80 20 3d 20 6e 50 61 67 65 46 69 6c 65 3b 0a 20 20   = nPageFile;.  
15d90 7d 0a 20 20 69 66 28 20 6e 50 61 67 65 3e 30 20  }.  if( nPage>0 
15da0 29 7b 0a 20 20 20 20 75 33 32 20 70 61 67 65 53  ){.    u32 pageS
15db0 69 7a 65 3b 0a 20 20 20 20 75 33 32 20 75 73 61  ize;.    u32 usa
15dc0 62 6c 65 53 69 7a 65 3b 0a 20 20 20 20 75 38 20  bleSize;.    u8 
15dd0 2a 70 61 67 65 31 20 3d 20 70 50 61 67 65 31 2d  *page1 = pPage1-
15de0 3e 61 44 61 74 61 3b 0a 20 20 20 20 72 63 20 3d  >aData;.    rc =
15df0 20 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42 3b 0a   SQLITE_NOTADB;.
15e00 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
15e10 4f 46 3a 20 52 2d 34 33 37 33 37 2d 33 39 39 39  OF: R-43737-3999
15e20 39 20 45 76 65 72 79 20 76 61 6c 69 64 20 53 51  9 Every valid SQ
15e30 4c 69 74 65 20 64 61 74 61 62 61 73 65 20 66 69  Lite database fi
15e40 6c 65 20 62 65 67 69 6e 73 0a 20 20 20 20 2a 2a  le begins.    **
15e50 20 77 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77   with the follow
15e60 69 6e 67 20 31 36 20 62 79 74 65 73 20 28 69 6e  ing 16 bytes (in
15e70 20 68 65 78 29 3a 20 35 33 20 35 31 20 34 63 20   hex): 53 51 4c 
15e80 36 39 20 37 34 20 36 35 20 32 30 20 36 36 20 36  69 74 65 20 66 6
15e90 66 20 37 32 20 36 64 0a 20 20 20 20 2a 2a 20 36  f 72 6d.    ** 6
15ea0 31 20 37 34 20 32 30 20 33 33 20 30 30 2e 20 2a  1 74 20 33 00. *
15eb0 2f 0a 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70  /.    if( memcmp
15ec0 28 70 61 67 65 31 2c 20 7a 4d 61 67 69 63 48 65  (page1, zMagicHe
15ed0 61 64 65 72 2c 20 31 36 29 21 3d 30 20 29 7b 0a  ader, 16)!=0 ){.
15ee0 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31        goto page1
15ef0 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20  _init_failed;.  
15f00 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49    }..#ifdef SQLI
15f10 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 20 20  TE_OMIT_WAL.    
15f20 69 66 28 20 70 61 67 65 31 5b 31 38 5d 3e 31 20  if( page1[18]>1 
15f30 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 62 74  ){.      pBt->bt
15f40 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 52 45  sFlags |= BTS_RE
15f50 41 44 5f 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20  AD_ONLY;.    }. 
15f60 20 20 20 69 66 28 20 70 61 67 65 31 5b 31 39 5d     if( page1[19]
15f70 3e 31 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  >1 ){.      goto
15f80 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c   page1_init_fail
15f90 65 64 3b 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a  ed;.    }.#else.
15fa0 20 20 20 20 69 66 28 20 70 61 67 65 31 5b 31 38      if( page1[18
15fb0 5d 3e 32 20 29 7b 0a 20 20 20 20 20 20 70 42 74  ]>2 ){.      pBt
15fc0 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54  ->btsFlags |= BT
15fd0 53 5f 52 45 41 44 5f 4f 4e 4c 59 3b 0a 20 20 20  S_READ_ONLY;.   
15fe0 20 7d 0a 20 20 20 20 69 66 28 20 70 61 67 65 31   }.    if( page1
15ff0 5b 31 39 5d 3e 32 20 29 7b 0a 20 20 20 20 20 20  [19]>2 ){.      
16000 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f  goto page1_init_
16010 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a 20  failed;.    }.. 
16020 20 20 20 2f 2a 20 49 66 20 74 68 65 20 77 72 69     /* If the wri
16030 74 65 20 76 65 72 73 69 6f 6e 20 69 73 20 73 65  te version is se
16040 74 20 74 6f 20 32 2c 20 74 68 69 73 20 64 61 74  t to 2, this dat
16050 61 62 61 73 65 20 73 68 6f 75 6c 64 20 62 65 20  abase should be 
16060 61 63 63 65 73 73 65 64 0a 20 20 20 20 2a 2a 20  accessed.    ** 
16070 69 6e 20 57 41 4c 20 6d 6f 64 65 2e 20 49 66 20  in WAL mode. If 
16080 74 68 65 20 6c 6f 67 20 69 73 20 6e 6f 74 20 61  the log is not a
16090 6c 72 65 61 64 79 20 6f 70 65 6e 2c 20 6f 70 65  lready open, ope
160a0 6e 20 69 74 20 6e 6f 77 2e 20 54 68 65 6e 20 0a  n it now. Then .
160b0 20 20 20 20 2a 2a 20 72 65 74 75 72 6e 20 53 51      ** return SQ
160c0 4c 49 54 45 5f 4f 4b 20 61 6e 64 20 72 65 74 75  LITE_OK and retu
160d0 72 6e 20 77 69 74 68 6f 75 74 20 70 6f 70 75 6c  rn without popul
160e0 61 74 69 6e 67 20 42 74 53 68 61 72 65 64 2e 70  ating BtShared.p
160f0 50 61 67 65 31 2e 0a 20 20 20 20 2a 2a 20 54 68  Page1..    ** Th
16100 65 20 63 61 6c 6c 65 72 20 64 65 74 65 63 74 73  e caller detects
16110 20 74 68 69 73 20 61 6e 64 20 63 61 6c 6c 73 20   this and calls 
16120 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 67  this function ag
16130 61 69 6e 2e 20 54 68 69 73 20 69 73 0a 20 20 20  ain. This is.   
16140 20 2a 2a 20 72 65 71 75 69 72 65 64 20 61 73 20   ** required as 
16150 74 68 65 20 76 65 72 73 69 6f 6e 20 6f 66 20 70  the version of p
16160 61 67 65 20 31 20 63 75 72 72 65 6e 74 6c 79 20  age 1 currently 
16170 69 6e 20 74 68 65 20 70 61 67 65 31 20 62 75 66  in the page1 buf
16180 66 65 72 0a 20 20 20 20 2a 2a 20 6d 61 79 20 6e  fer.    ** may n
16190 6f 74 20 62 65 20 74 68 65 20 6c 61 74 65 73 74  ot be the latest
161a0 20 76 65 72 73 69 6f 6e 20 2d 20 74 68 65 72 65   version - there
161b0 20 6d 61 79 20 62 65 20 61 20 6e 65 77 65 72 20   may be a newer 
161c0 6f 6e 65 20 69 6e 20 74 68 65 20 6c 6f 67 0a 20  one in the log. 
161d0 20 20 20 2a 2a 20 66 69 6c 65 2e 0a 20 20 20 20     ** file..    
161e0 2a 2f 0a 20 20 20 20 69 66 28 20 70 61 67 65 31  */.    if( page1
161f0 5b 31 39 5d 3d 3d 32 20 26 26 20 28 70 42 74 2d  [19]==2 && (pBt-
16200 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f  >btsFlags & BTS_
16210 4e 4f 5f 57 41 4c 29 3d 3d 30 20 29 7b 0a 20 20  NO_WAL)==0 ){.  
16220 20 20 20 20 69 6e 74 20 69 73 4f 70 65 6e 20 3d      int isOpen =
16230 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   0;.      rc = s
16240 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 57  qlite3PagerOpenW
16250 61 6c 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  al(pBt->pPager, 
16260 26 69 73 4f 70 65 6e 29 3b 0a 20 20 20 20 20 20  &isOpen);.      
16270 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
16280 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74  K ){.        got
16290 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69  o page1_init_fai
162a0 6c 65 64 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  led;.      }else
162b0 20 69 66 28 20 69 73 4f 70 65 6e 3d 3d 30 20 29   if( isOpen==0 )
162c0 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73  {.        releas
162d0 65 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a 20  ePage(pPage1);. 
162e0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
162f0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d  LITE_OK;.      }
16300 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
16310 54 45 5f 4e 4f 54 41 44 42 3b 0a 20 20 20 20 7d  TE_NOTADB;.    }
16320 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20  .#endif..    /* 
16330 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31  EVIDENCE-OF: R-1
16340 35 34 36 35 2d 32 30 38 31 33 20 54 68 65 20 6d  5465-20813 The m
16350 61 78 69 6d 75 6d 20 61 6e 64 20 6d 69 6e 69 6d  aximum and minim
16360 75 6d 20 65 6d 62 65 64 64 65 64 20 70 61 79 6c  um embedded payl
16370 6f 61 64 0a 20 20 20 20 2a 2a 20 66 72 61 63 74  oad.    ** fract
16380 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 6c 65 61  ions and the lea
16390 66 20 70 61 79 6c 6f 61 64 20 66 72 61 63 74 69  f payload fracti
163a0 6f 6e 20 76 61 6c 75 65 73 20 6d 75 73 74 20 62  on values must b
163b0 65 20 36 34 2c 20 33 32 2c 20 61 6e 64 20 33 32  e 64, 32, and 32
163c0 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
163d0 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 65 73  The original des
163e0 69 67 6e 20 61 6c 6c 6f 77 65 64 20 74 68 65 73  ign allowed thes
163f0 65 20 61 6d 6f 75 6e 74 73 20 74 6f 20 76 61 72  e amounts to var
16400 79 2c 20 62 75 74 20 61 73 20 6f 66 0a 20 20 20  y, but as of.   
16410 20 2a 2a 20 76 65 72 73 69 6f 6e 20 33 2e 36 2e   ** version 3.6.
16420 30 2c 20 77 65 20 72 65 71 75 69 72 65 20 74 68  0, we require th
16430 65 6d 20 74 6f 20 62 65 20 66 69 78 65 64 2e 0a  em to be fixed..
16440 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6d      */.    if( m
16450 65 6d 63 6d 70 28 26 70 61 67 65 31 5b 32 31 5d  emcmp(&page1[21]
16460 2c 20 22 5c 31 30 30 5c 30 34 30 5c 30 34 30 22  , "\100\040\040"
16470 2c 33 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  ,3)!=0 ){.      
16480 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f  goto page1_init_
16490 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20  failed;.    }.  
164a0 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
164b0 3a 20 52 2d 35 31 38 37 33 2d 33 39 36 31 38 20  : R-51873-39618 
164c0 54 68 65 20 70 61 67 65 20 73 69 7a 65 20 66 6f  The page size fo
164d0 72 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c  r a database fil
164e0 65 20 69 73 0a 20 20 20 20 2a 2a 20 64 65 74 65  e is.    ** dete
164f0 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20 32 2d  rmined by the 2-
16500 62 79 74 65 20 69 6e 74 65 67 65 72 20 6c 6f 63  byte integer loc
16510 61 74 65 64 20 61 74 20 61 6e 20 6f 66 66 73 65  ated at an offse
16520 74 20 6f 66 20 31 36 20 62 79 74 65 73 20 66 72  t of 16 bytes fr
16530 6f 6d 0a 20 20 20 20 2a 2a 20 74 68 65 20 62 65  om.    ** the be
16540 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 64  ginning of the d
16550 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f  atabase file. */
16560 0a 20 20 20 20 70 61 67 65 53 69 7a 65 20 3d 20  .    pageSize = 
16570 28 70 61 67 65 31 5b 31 36 5d 3c 3c 38 29 20 7c  (page1[16]<<8) |
16580 20 28 70 61 67 65 31 5b 31 37 5d 3c 3c 31 36 29   (page1[17]<<16)
16590 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43  ;.    /* EVIDENC
165a0 45 2d 4f 46 3a 20 52 2d 32 35 30 30 38 2d 32 31  E-OF: R-25008-21
165b0 36 38 38 20 54 68 65 20 73 69 7a 65 20 6f 66 20  688 The size of 
165c0 61 20 70 61 67 65 20 69 73 20 61 20 70 6f 77 65  a page is a powe
165d0 72 20 6f 66 20 74 77 6f 0a 20 20 20 20 2a 2a 20  r of two.    ** 
165e0 62 65 74 77 65 65 6e 20 35 31 32 20 61 6e 64 20  between 512 and 
165f0 36 35 35 33 36 20 69 6e 63 6c 75 73 69 76 65 2e  65536 inclusive.
16600 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 28 70 61   */.    if( ((pa
16610 67 65 53 69 7a 65 2d 31 29 26 70 61 67 65 53 69  geSize-1)&pageSi
16620 7a 65 29 21 3d 30 0a 20 20 20 20 20 7c 7c 20 70  ze)!=0.     || p
16630 61 67 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d  ageSize>SQLITE_M
16640 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 0a 20 20  AX_PAGE_SIZE .  
16650 20 20 20 7c 7c 20 70 61 67 65 53 69 7a 65 3c 3d     || pageSize<=
16660 32 35 36 20 0a 20 20 20 20 29 7b 0a 20 20 20 20  256 .    ){.    
16670 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69    goto page1_ini
16680 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a  t_failed;.    }.
16690 20 20 20 20 61 73 73 65 72 74 28 20 28 70 61 67      assert( (pag
166a0 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b  eSize & 7)==0 );
166b0 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45  .    /* EVIDENCE
166c0 2d 4f 46 3a 20 52 2d 35 39 33 31 30 2d 35 31 32  -OF: R-59310-512
166d0 30 35 20 54 68 65 20 22 72 65 73 65 72 76 65 64  05 The "reserved
166e0 20 73 70 61 63 65 22 20 73 69 7a 65 20 69 6e 20   space" size in 
166f0 74 68 65 20 31 2d 62 79 74 65 0a 20 20 20 20 2a  the 1-byte.    *
16700 2a 20 69 6e 74 65 67 65 72 20 61 74 20 6f 66 66  * integer at off
16710 73 65 74 20 32 30 20 69 73 20 74 68 65 20 6e 75  set 20 is the nu
16720 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66  mber of bytes of
16730 20 73 70 61 63 65 20 61 74 20 74 68 65 20 65 6e   space at the en
16740 64 20 6f 66 0a 20 20 20 20 2a 2a 20 65 61 63 68  d of.    ** each
16750 20 70 61 67 65 20 74 6f 20 72 65 73 65 72 76 65   page to reserve
16760 20 66 6f 72 20 65 78 74 65 6e 73 69 6f 6e 73 2e   for extensions.
16770 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20   .    **.    ** 
16780 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33  EVIDENCE-OF: R-3
16790 37 34 39 37 2d 34 32 34 31 32 20 54 68 65 20 73  7497-42412 The s
167a0 69 7a 65 20 6f 66 20 74 68 65 20 72 65 73 65 72  ize of the reser
167b0 76 65 64 20 72 65 67 69 6f 6e 20 69 73 0a 20 20  ved region is.  
167c0 20 20 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20    ** determined 
167d0 62 79 20 74 68 65 20 6f 6e 65 2d 62 79 74 65 20  by the one-byte 
167e0 75 6e 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  unsigned integer
167f0 20 66 6f 75 6e 64 20 61 74 20 61 6e 20 6f 66 66   found at an off
16800 73 65 74 20 6f 66 20 32 30 0a 20 20 20 20 2a 2a  set of 20.    **
16810 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61   into the databa
16820 73 65 20 66 69 6c 65 20 68 65 61 64 65 72 2e 20  se file header. 
16830 2a 2f 0a 20 20 20 20 75 73 61 62 6c 65 53 69 7a  */.    usableSiz
16840 65 20 3d 20 70 61 67 65 53 69 7a 65 20 2d 20 70  e = pageSize - p
16850 61 67 65 31 5b 32 30 5d 3b 0a 20 20 20 20 69 66  age1[20];.    if
16860 28 20 28 75 33 32 29 70 61 67 65 53 69 7a 65 21  ( (u32)pageSize!
16870 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 29  =pBt->pageSize )
16880 7b 0a 20 20 20 20 20 20 2f 2a 20 41 66 74 65 72  {.      /* After
16890 20 72 65 61 64 69 6e 67 20 74 68 65 20 66 69 72   reading the fir
168a0 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 64  st page of the d
168b0 61 74 61 62 61 73 65 20 61 73 73 75 6d 69 6e 67  atabase assuming
168c0 20 61 20 70 61 67 65 20 73 69 7a 65 0a 20 20 20   a page size.   
168d0 20 20 20 2a 2a 20 6f 66 20 42 74 53 68 61 72 65     ** of BtShare
168e0 64 2e 70 61 67 65 53 69 7a 65 2c 20 77 65 20 68  d.pageSize, we h
168f0 61 76 65 20 64 69 73 63 6f 76 65 72 65 64 20 74  ave discovered t
16900 68 61 74 20 74 68 65 20 70 61 67 65 2d 73 69 7a  hat the page-siz
16910 65 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 61 63  e is.      ** ac
16920 74 75 61 6c 6c 79 20 70 61 67 65 53 69 7a 65 2e  tually pageSize.
16930 20 55 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61   Unlock the data
16940 62 61 73 65 2c 20 6c 65 61 76 65 20 70 42 74 2d  base, leave pBt-
16950 3e 70 50 61 67 65 31 20 61 74 0a 20 20 20 20 20  >pPage1 at.     
16960 20 2a 2a 20 7a 65 72 6f 20 61 6e 64 20 72 65 74   ** zero and ret
16970 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 54  urn SQLITE_OK. T
16980 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 63  he caller will c
16990 61 6c 6c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  all this functio
169a0 6e 0a 20 20 20 20 20 20 2a 2a 20 61 67 61 69 6e  n.      ** again
169b0 20 77 69 74 68 20 74 68 65 20 63 6f 72 72 65 63   with the correc
169c0 74 20 70 61 67 65 2d 73 69 7a 65 2e 0a 20 20 20  t page-size..   
169d0 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 65 6c 65     */.      rele
169e0 61 73 65 50 61 67 65 28 70 50 61 67 65 31 29 3b  asePage(pPage1);
169f0 0a 20 20 20 20 20 20 70 42 74 2d 3e 75 73 61 62  .      pBt->usab
16a00 6c 65 53 69 7a 65 20 3d 20 75 73 61 62 6c 65 53  leSize = usableS
16a10 69 7a 65 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e  ize;.      pBt->
16a20 70 61 67 65 53 69 7a 65 20 3d 20 70 61 67 65 53  pageSize = pageS
16a30 69 7a 65 3b 0a 20 20 20 20 20 20 66 72 65 65 54  ize;.      freeT
16a40 65 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20  empSpace(pBt);. 
16a50 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
16a60 33 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a  3PagerSetPagesiz
16a70 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26  e(pBt->pPager, &
16a80 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2c 0a 20  pBt->pageSize,. 
16a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16ab0 20 20 70 61 67 65 53 69 7a 65 2d 75 73 61 62 6c    pageSize-usabl
16ac0 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 72 65  eSize);.      re
16ad0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
16ae0 20 20 20 69 66 28 20 28 70 42 74 2d 3e 64 62 2d     if( (pBt->db-
16af0 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
16b00 52 65 63 6f 76 65 72 79 4d 6f 64 65 29 3d 3d 30  RecoveryMode)==0
16b10 20 26 26 20 6e 50 61 67 65 3e 6e 50 61 67 65 46   && nPage>nPageF
16b20 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ile ){.      rc 
16b30 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
16b40 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74  _BKPT;.      got
16b50 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69  o page1_init_fai
16b60 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f  led;.    }.    /
16b70 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
16b80 2d 32 38 33 31 32 2d 36 34 37 30 34 20 48 6f 77  -28312-64704 How
16b90 65 76 65 72 2c 20 74 68 65 20 75 73 61 62 6c 65  ever, the usable
16ba0 20 73 69 7a 65 20 69 73 20 6e 6f 74 20 61 6c 6c   size is not all
16bb0 6f 77 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 62  owed to.    ** b
16bc0 65 20 6c 65 73 73 20 74 68 61 6e 20 34 38 30 2e  e less than 480.
16bd0 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
16be0 20 69 66 20 74 68 65 20 70 61 67 65 20 73 69 7a   if the page siz
16bf0 65 20 69 73 20 35 31 32 2c 20 74 68 65 6e 20 74  e is 512, then t
16c00 68 65 0a 20 20 20 20 2a 2a 20 72 65 73 65 72 76  he.    ** reserv
16c10 65 64 20 73 70 61 63 65 20 73 69 7a 65 20 63 61  ed space size ca
16c20 6e 6e 6f 74 20 65 78 63 65 65 64 20 33 32 2e 20  nnot exceed 32. 
16c30 2a 2f 0a 20 20 20 20 69 66 28 20 75 73 61 62 6c  */.    if( usabl
16c40 65 53 69 7a 65 3c 34 38 30 20 29 7b 0a 20 20 20  eSize<480 ){.   
16c50 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e     goto page1_in
16c60 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d  it_failed;.    }
16c70 0a 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69  .    pBt->pageSi
16c80 7a 65 20 3d 20 70 61 67 65 53 69 7a 65 3b 0a 20  ze = pageSize;. 
16c90 20 20 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69     pBt->usableSi
16ca0 7a 65 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 3b  ze = usableSize;
16cb0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
16cc0 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
16cd0 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63      pBt->autoVac
16ce0 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28  uum = (get4byte(
16cf0 26 70 61 67 65 31 5b 33 36 20 2b 20 34 2a 34 5d  &page1[36 + 4*4]
16d00 29 3f 31 3a 30 29 3b 0a 20 20 20 20 70 42 74 2d  )?1:0);.    pBt-
16d10 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 28 67  >incrVacuum = (g
16d20 65 74 34 62 79 74 65 28 26 70 61 67 65 31 5b 33  et4byte(&page1[3
16d30 36 20 2b 20 37 2a 34 5d 29 3f 31 3a 30 29 3b 0a  6 + 7*4])?1:0);.
16d40 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a  #endif.  }..  /*
16d50 20 6d 61 78 4c 6f 63 61 6c 20 69 73 20 74 68 65   maxLocal is the
16d60 20 6d 61 78 69 6d 75 6d 20 61 6d 6f 75 6e 74 20   maximum amount 
16d70 6f 66 20 70 61 79 6c 6f 61 64 20 74 6f 20 73 74  of payload to st
16d80 6f 72 65 20 6c 6f 63 61 6c 6c 79 20 66 6f 72 0a  ore locally for.
16d90 20 20 2a 2a 20 61 20 63 65 6c 6c 2e 20 20 4d 61    ** a cell.  Ma
16da0 6b 65 20 73 75 72 65 20 69 74 20 69 73 20 73 6d  ke sure it is sm
16db0 61 6c 6c 20 65 6e 6f 75 67 68 20 73 6f 20 74 68  all enough so th
16dc0 61 74 20 61 74 20 6c 65 61 73 74 20 6d 69 6e 46  at at least minF
16dd0 61 6e 6f 75 74 0a 20 20 2a 2a 20 63 65 6c 6c 73  anout.  ** cells
16de0 20 63 61 6e 20 77 69 6c 6c 20 66 69 74 20 6f 6e   can will fit on
16df0 20 6f 6e 65 20 70 61 67 65 2e 20 20 57 65 20 61   one page.  We a
16e00 73 73 75 6d 65 20 61 20 31 30 2d 62 79 74 65 20  ssume a 10-byte 
16e10 70 61 67 65 20 68 65 61 64 65 72 2e 0a 20 20 2a  page header..  *
16e20 2a 20 42 65 73 69 64 65 73 20 74 68 65 20 70 61  * Besides the pa
16e30 79 6c 6f 61 64 2c 20 74 68 65 20 63 65 6c 6c 20  yload, the cell 
16e40 6d 75 73 74 20 73 74 6f 72 65 3a 0a 20 20 2a 2a  must store:.  **
16e50 20 20 20 20 20 32 2d 62 79 74 65 20 70 6f 69 6e       2-byte poin
16e60 74 65 72 20 74 6f 20 74 68 65 20 63 65 6c 6c 0a  ter to the cell.
16e70 20 20 2a 2a 20 20 20 20 20 34 2d 62 79 74 65 20    **     4-byte 
16e80 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 0a 20 20  child pointer.  
16e90 2a 2a 20 20 20 20 20 39 2d 62 79 74 65 20 6e 4b  **     9-byte nK
16ea0 65 79 20 76 61 6c 75 65 0a 20 20 2a 2a 20 20 20  ey value.  **   
16eb0 20 20 34 2d 62 79 74 65 20 6e 44 61 74 61 20 76    4-byte nData v
16ec0 61 6c 75 65 0a 20 20 2a 2a 20 20 20 20 20 34 2d  alue.  **     4-
16ed0 62 79 74 65 20 6f 76 65 72 66 6c 6f 77 20 70 61  byte overflow pa
16ee0 67 65 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20  ge pointer.  ** 
16ef0 53 6f 20 61 20 63 65 6c 6c 20 63 6f 6e 73 69 73  So a cell consis
16f00 74 73 20 6f 66 20 61 20 32 2d 62 79 74 65 20 70  ts of a 2-byte p
16f10 6f 69 6e 74 65 72 2c 20 61 20 68 65 61 64 65 72  ointer, a header
16f20 20 77 68 69 63 68 20 69 73 20 61 73 20 6d 75 63   which is as muc
16f30 68 20 61 73 0a 20 20 2a 2a 20 31 37 20 62 79 74  h as.  ** 17 byt
16f40 65 73 20 6c 6f 6e 67 2c 20 30 20 74 6f 20 4e 20  es long, 0 to N 
16f50 62 79 74 65 73 20 6f 66 20 70 61 79 6c 6f 61 64  bytes of payload
16f60 2c 20 61 6e 64 20 61 6e 20 6f 70 74 69 6f 6e 61  , and an optiona
16f70 6c 20 34 20 62 79 74 65 20 6f 76 65 72 66 6c 6f  l 4 byte overflo
16f80 77 0a 20 20 2a 2a 20 70 61 67 65 20 70 6f 69 6e  w.  ** page poin
16f90 74 65 72 2e 0a 20 20 2a 2f 0a 20 20 70 42 74 2d  ter..  */.  pBt-
16fa0 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 28 75 31 36  >maxLocal = (u16
16fb0 29 28 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  )((pBt->usableSi
16fc0 7a 65 2d 31 32 29 2a 36 34 2f 32 35 35 20 2d 20  ze-12)*64/255 - 
16fd0 32 33 29 3b 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c  23);.  pBt->minL
16fe0 6f 63 61 6c 20 3d 20 28 75 31 36 29 28 28 70 42  ocal = (u16)((pB
16ff0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31 32  t->usableSize-12
17000 29 2a 33 32 2f 32 35 35 20 2d 20 32 33 29 3b 0a  )*32/255 - 23);.
17010 20 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66 20 3d    pBt->maxLeaf =
17020 20 28 75 31 36 29 28 70 42 74 2d 3e 75 73 61 62   (u16)(pBt->usab
17030 6c 65 53 69 7a 65 20 2d 20 33 35 29 3b 0a 20 20  leSize - 35);.  
17040 70 42 74 2d 3e 6d 69 6e 4c 65 61 66 20 3d 20 28  pBt->minLeaf = (
17050 75 31 36 29 28 28 70 42 74 2d 3e 75 73 61 62 6c  u16)((pBt->usabl
17060 65 53 69 7a 65 2d 31 32 29 2a 33 32 2f 32 35 35  eSize-12)*32/255
17070 20 2d 20 32 33 29 3b 0a 20 20 69 66 28 20 70 42   - 23);.  if( pB
17080 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3e 31 32 37 20  t->maxLocal>127 
17090 29 7b 0a 20 20 20 20 70 42 74 2d 3e 6d 61 78 31  ){.    pBt->max1
170a0 62 79 74 65 50 61 79 6c 6f 61 64 20 3d 20 31 32  bytePayload = 12
170b0 37 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  7;.  }else{.    
170c0 70 42 74 2d 3e 6d 61 78 31 62 79 74 65 50 61 79  pBt->max1bytePay
170d0 6c 6f 61 64 20 3d 20 28 75 38 29 70 42 74 2d 3e  load = (u8)pBt->
170e0 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20 7d 0a 20 20  maxLocal;.  }.  
170f0 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6d 61 78  assert( pBt->max
17100 4c 65 61 66 20 2b 20 32 33 20 3c 3d 20 4d 58 5f  Leaf + 23 <= MX_
17110 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20 29  CELL_SIZE(pBt) )
17120 3b 0a 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20  ;.  pBt->pPage1 
17130 3d 20 70 50 61 67 65 31 3b 0a 20 20 70 42 74 2d  = pPage1;.  pBt-
17140 3e 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 3b 0a  >nPage = nPage;.
17150 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
17160 4f 4b 3b 0a 0a 70 61 67 65 31 5f 69 6e 69 74 5f  OK;..page1_init_
17170 66 61 69 6c 65 64 3a 0a 20 20 72 65 6c 65 61 73  failed:.  releas
17180 65 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a 20  ePage(pPage1);. 
17190 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 30   pBt->pPage1 = 0
171a0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
171b0 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  ..#ifndef NDEBUG
171c0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
171d0 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 75 72 73  e number of curs
171e0 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 70 42 74 2e  ors open on pBt.
171f0 20 54 68 69 73 20 69 73 20 66 6f 72 20 75 73 65   This is for use
17200 0a 2a 2a 20 69 6e 20 61 73 73 65 72 74 28 29 20  .** in assert() 
17210 65 78 70 72 65 73 73 69 6f 6e 73 2c 20 73 6f 20  expressions, so 
17220 69 74 20 69 73 20 6f 6e 6c 79 20 63 6f 6d 70 69  it is only compi
17230 6c 65 64 20 69 66 20 4e 44 45 42 55 47 20 69 73  led if NDEBUG is
17240 20 6e 6f 74 0a 2a 2a 20 64 65 66 69 6e 65 64 2e   not.** defined.
17250 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 77 72 69 74  .**.** Only writ
17260 65 20 63 75 72 73 6f 72 73 20 61 72 65 20 63 6f  e cursors are co
17270 75 6e 74 65 64 20 69 66 20 77 72 4f 6e 6c 79 20  unted if wrOnly 
17280 69 73 20 74 72 75 65 2e 20 20 49 66 20 77 72 4f  is true.  If wrO
17290 6e 6c 79 20 69 73 0a 2a 2a 20 66 61 6c 73 65 20  nly is.** false 
172a0 74 68 65 6e 20 61 6c 6c 20 63 75 72 73 6f 72 73  then all cursors
172b0 20 61 72 65 20 63 6f 75 6e 74 65 64 2e 0a 2a 2a   are counted..**
172c0 0a 2a 2a 20 46 6f 72 20 74 68 65 20 70 75 72 70  .** For the purp
172d0 6f 73 65 73 20 6f 66 20 74 68 69 73 20 72 6f 75  oses of this rou
172e0 74 69 6e 65 2c 20 61 20 63 75 72 73 6f 72 20 69  tine, a cursor i
172f0 73 20 61 6e 79 20 63 75 72 73 6f 72 20 74 68 61  s any cursor tha
17300 74 0a 2a 2a 20 69 73 20 63 61 70 61 62 6c 65 20  t.** is capable 
17310 6f 66 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72  of reading or wr
17320 69 74 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74  iting to the dat
17330 61 62 61 73 65 2e 20 20 43 75 72 73 6f 72 73 20  abase.  Cursors 
17340 74 68 61 74 0a 2a 2a 20 68 61 76 65 20 62 65 65  that.** have bee
17350 6e 20 74 72 69 70 70 65 64 20 69 6e 74 6f 20 74  n tripped into t
17360 68 65 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 20  he CURSOR_FAULT 
17370 73 74 61 74 65 20 61 72 65 20 6e 6f 74 20 63 6f  state are not co
17380 75 6e 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  unted..*/.static
17390 20 69 6e 74 20 63 6f 75 6e 74 56 61 6c 69 64 43   int countValidC
173a0 75 72 73 6f 72 73 28 42 74 53 68 61 72 65 64 20  ursors(BtShared 
173b0 2a 70 42 74 2c 20 69 6e 74 20 77 72 4f 6e 6c 79  *pBt, int wrOnly
173c0 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  ){.  BtCursor *p
173d0 43 75 72 3b 0a 20 20 69 6e 74 20 72 20 3d 20 30  Cur;.  int r = 0
173e0 3b 0a 20 20 66 6f 72 28 70 43 75 72 3d 70 42 74  ;.  for(pCur=pBt
173f0 2d 3e 70 43 75 72 73 6f 72 3b 20 70 43 75 72 3b  ->pCursor; pCur;
17400 20 70 43 75 72 3d 70 43 75 72 2d 3e 70 4e 65 78   pCur=pCur->pNex
17410 74 29 7b 0a 20 20 20 20 69 66 28 20 28 77 72 4f  t){.    if( (wrO
17420 6e 6c 79 3d 3d 30 20 7c 7c 20 28 70 43 75 72 2d  nly==0 || (pCur-
17430 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46  >curFlags & BTCF
17440 5f 57 72 69 74 65 46 6c 61 67 29 21 3d 30 29 0a  _WriteFlag)!=0).
17450 20 20 20 20 20 26 26 20 70 43 75 72 2d 3e 65 53       && pCur->eS
17460 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 46 41 55  tate!=CURSOR_FAU
17470 4c 54 20 29 20 72 2b 2b 3b 20 0a 20 20 7d 0a 20  LT ) r++; .  }. 
17480 20 72 65 74 75 72 6e 20 72 3b 0a 7d 0a 23 65 6e   return r;.}.#en
17490 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  dif../*.** If th
174a0 65 72 65 20 61 72 65 20 6e 6f 20 6f 75 74 73 74  ere are no outst
174b0 61 6e 64 69 6e 67 20 63 75 72 73 6f 72 73 20 61  anding cursors a
174c0 6e 64 20 77 65 20 61 72 65 20 6e 6f 74 20 69 6e  nd we are not in
174d0 20 74 68 65 20 6d 69 64 64 6c 65 0a 2a 2a 20 6f   the middle.** o
174e0 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  f a transaction 
174f0 62 75 74 20 74 68 65 72 65 20 69 73 20 61 20 72  but there is a r
17500 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ead lock on the 
17510 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e 0a 2a  database, then.*
17520 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 75  * this routine u
17530 6e 72 65 66 73 20 74 68 65 20 66 69 72 73 74 20  nrefs the first 
17540 70 61 67 65 20 6f 66 20 74 68 65 20 64 61 74 61  page of the data
17550 62 61 73 65 20 66 69 6c 65 20 77 68 69 63 68 20  base file which 
17560 0a 2a 2a 20 68 61 73 20 74 68 65 20 65 66 66 65  .** has the effe
17570 63 74 20 6f 66 20 72 65 6c 65 61 73 69 6e 67 20  ct of releasing 
17580 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a  the read lock..*
17590 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 69 73  *.** If there is
175a0 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
175b0 6e 20 70 72 6f 67 72 65 73 73 2c 20 74 68 69 73  n progress, this
175c0 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f   routine is a no
175d0 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  -op..*/.static v
175e0 6f 69 64 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49  oid unlockBtreeI
175f0 66 55 6e 75 73 65 64 28 42 74 53 68 61 72 65 64  fUnused(BtShared
17600 20 2a 70 42 74 29 7b 0a 20 20 61 73 73 65 72 74   *pBt){.  assert
17610 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
17620 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
17630 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63 6f   );.  assert( co
17640 75 6e 74 56 61 6c 69 64 43 75 72 73 6f 72 73 28  untValidCursors(
17650 70 42 74 2c 30 29 3d 3d 30 20 7c 7c 20 70 42 74  pBt,0)==0 || pBt
17660 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3e  ->inTransaction>
17670 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 3b 0a 20 20  TRANS_NONE );.  
17680 69 66 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73  if( pBt->inTrans
17690 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 4e 4f  action==TRANS_NO
176a0 4e 45 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65  NE && pBt->pPage
176b0 31 21 3d 30 20 29 7b 0a 20 20 20 20 4d 65 6d 50  1!=0 ){.    MemP
176c0 61 67 65 20 2a 70 50 61 67 65 31 20 3d 20 70 42  age *pPage1 = pB
176d0 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20 20 20 61  t->pPage1;.    a
176e0 73 73 65 72 74 28 20 70 50 61 67 65 31 2d 3e 61  ssert( pPage1->a
176f0 44 61 74 61 20 29 3b 0a 20 20 20 20 61 73 73 65  Data );.    asse
17700 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
17710 52 65 66 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50  Refcount(pBt->pP
17720 61 67 65 72 29 3d 3d 31 20 29 3b 0a 20 20 20 20  ager)==1 );.    
17730 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b  pBt->pPage1 = 0;
17740 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65  .    releasePage
17750 28 70 50 61 67 65 31 29 3b 0a 20 20 7d 0a 7d 0a  (pPage1);.  }.}.
17760 0a 2f 2a 0a 2a 2a 20 49 66 20 70 42 74 20 70 6f  ./*.** If pBt po
17770 69 6e 74 73 20 74 6f 20 61 6e 20 65 6d 70 74 79  ints to an empty
17780 20 66 69 6c 65 20 74 68 65 6e 20 63 6f 6e 76 65   file then conve
17790 72 74 20 74 68 61 74 20 65 6d 70 74 79 20 66 69  rt that empty fi
177a0 6c 65 0a 2a 2a 20 69 6e 74 6f 20 61 20 6e 65 77  le.** into a new
177b0 20 65 6d 70 74 79 20 64 61 74 61 62 61 73 65 20   empty database 
177c0 62 79 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20  by initializing 
177d0 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f  the first page o
177e0 66 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  f.** the databas
177f0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
17800 20 6e 65 77 44 61 74 61 62 61 73 65 28 42 74 53   newDatabase(BtS
17810 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 4d  hared *pBt){.  M
17820 65 6d 50 61 67 65 20 2a 70 50 31 3b 0a 20 20 75  emPage *pP1;.  u
17830 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61  nsigned char *da
17840 74 61 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  ta;.  int rc;.. 
17850 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
17860 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
17870 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28  >mutex) );.  if(
17880 20 70 42 74 2d 3e 6e 50 61 67 65 3e 30 20 29 7b   pBt->nPage>0 ){
17890 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
178a0 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 50 31  TE_OK;.  }.  pP1
178b0 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a   = pBt->pPage1;.
178c0 20 20 61 73 73 65 72 74 28 20 70 50 31 21 3d 30    assert( pP1!=0
178d0 20 29 3b 0a 20 20 64 61 74 61 20 3d 20 70 50 31   );.  data = pP1
178e0 2d 3e 61 44 61 74 61 3b 0a 20 20 72 63 20 3d 20  ->aData;.  rc = 
178f0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
17900 65 28 70 50 31 2d 3e 70 44 62 50 61 67 65 29 3b  e(pP1->pDbPage);
17910 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75  .  if( rc ) retu
17920 72 6e 20 72 63 3b 0a 20 20 6d 65 6d 63 70 79 28  rn rc;.  memcpy(
17930 64 61 74 61 2c 20 7a 4d 61 67 69 63 48 65 61 64  data, zMagicHead
17940 65 72 2c 20 73 69 7a 65 6f 66 28 7a 4d 61 67 69  er, sizeof(zMagi
17950 63 48 65 61 64 65 72 29 29 3b 0a 20 20 61 73 73  cHeader));.  ass
17960 65 72 74 28 20 73 69 7a 65 6f 66 28 7a 4d 61 67  ert( sizeof(zMag
17970 69 63 48 65 61 64 65 72 29 3d 3d 31 36 20 29 3b  icHeader)==16 );
17980 0a 20 20 64 61 74 61 5b 31 36 5d 20 3d 20 28 75  .  data[16] = (u
17990 38 29 28 28 70 42 74 2d 3e 70 61 67 65 53 69 7a  8)((pBt->pageSiz
179a0 65 3e 3e 38 29 26 30 78 66 66 29 3b 0a 20 20 64  e>>8)&0xff);.  d
179b0 61 74 61 5b 31 37 5d 20 3d 20 28 75 38 29 28 28  ata[17] = (u8)((
179c0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3e 31  pBt->pageSize>>1
179d0 36 29 26 30 78 66 66 29 3b 0a 20 20 64 61 74 61  6)&0xff);.  data
179e0 5b 31 38 5d 20 3d 20 31 3b 0a 20 20 64 61 74 61  [18] = 1;.  data
179f0 5b 31 39 5d 20 3d 20 31 3b 0a 20 20 61 73 73 65  [19] = 1;.  asse
17a00 72 74 28 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  rt( pBt->usableS
17a10 69 7a 65 3c 3d 70 42 74 2d 3e 70 61 67 65 53 69  ize<=pBt->pageSi
17a20 7a 65 20 26 26 20 70 42 74 2d 3e 75 73 61 62 6c  ze && pBt->usabl
17a30 65 53 69 7a 65 2b 32 35 35 3e 3d 70 42 74 2d 3e  eSize+255>=pBt->
17a40 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 64 61 74  pageSize);.  dat
17a50 61 5b 32 30 5d 20 3d 20 28 75 38 29 28 70 42 74  a[20] = (u8)(pBt
17a60 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 42 74  ->pageSize - pBt
17a70 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20  ->usableSize);. 
17a80 20 64 61 74 61 5b 32 31 5d 20 3d 20 36 34 3b 0a   data[21] = 64;.
17a90 20 20 64 61 74 61 5b 32 32 5d 20 3d 20 33 32 3b    data[22] = 32;
17aa0 0a 20 20 64 61 74 61 5b 32 33 5d 20 3d 20 33 32  .  data[23] = 32
17ab0 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61  ;.  memset(&data
17ac0 5b 32 34 5d 2c 20 30 2c 20 31 30 30 2d 32 34 29  [24], 0, 100-24)
17ad0 3b 0a 20 20 7a 65 72 6f 50 61 67 65 28 70 50 31  ;.  zeroPage(pP1
17ae0 2c 20 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46  , PTF_INTKEY|PTF
17af0 5f 4c 45 41 46 7c 50 54 46 5f 4c 45 41 46 44 41  _LEAF|PTF_LEAFDA
17b00 54 41 20 29 3b 0a 20 20 70 42 74 2d 3e 62 74 73  TA );.  pBt->bts
17b10 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 50 41 47  Flags |= BTS_PAG
17b20 45 53 49 5a 45 5f 46 49 58 45 44 3b 0a 23 69 66  ESIZE_FIXED;.#if
17b30 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
17b40 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 61 73  _AUTOVACUUM.  as
17b50 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56  sert( pBt->autoV
17b60 61 63 75 75 6d 3d 3d 31 20 7c 7c 20 70 42 74 2d  acuum==1 || pBt-
17b70 3e 61 75 74 6f 56 61 63 75 75 6d 3d 3d 30 20 29  >autoVacuum==0 )
17b80 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ;.  assert( pBt-
17b90 3e 69 6e 63 72 56 61 63 75 75 6d 3d 3d 31 20 7c  >incrVacuum==1 |
17ba0 7c 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75  | pBt->incrVacuu
17bb0 6d 3d 3d 30 20 29 3b 0a 20 20 70 75 74 34 62 79  m==0 );.  put4by
17bc0 74 65 28 26 64 61 74 61 5b 33 36 20 2b 20 34 2a  te(&data[36 + 4*
17bd0 34 5d 2c 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  4], pBt->autoVac
17be0 75 75 6d 29 3b 0a 20 20 70 75 74 34 62 79 74 65  uum);.  put4byte
17bf0 28 26 64 61 74 61 5b 33 36 20 2b 20 37 2a 34 5d  (&data[36 + 7*4]
17c00 2c 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75  , pBt->incrVacuu
17c10 6d 29 3b 0a 23 65 6e 64 69 66 0a 20 20 70 42 74  m);.#endif.  pBt
17c20 2d 3e 6e 50 61 67 65 20 3d 20 31 3b 0a 20 20 64  ->nPage = 1;.  d
17c30 61 74 61 5b 33 31 5d 20 3d 20 31 3b 0a 20 20 72  ata[31] = 1;.  r
17c40 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
17c50 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61  .}../*.** Initia
17c60 6c 69 7a 65 20 74 68 65 20 66 69 72 73 74 20 70  lize the first p
17c70 61 67 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  age of the datab
17c80 61 73 65 20 66 69 6c 65 20 28 63 72 65 61 74 69  ase file (creati
17c90 6e 67 20 61 20 64 61 74 61 62 61 73 65 0a 2a 2a  ng a database.**
17ca0 20 63 6f 6e 73 69 73 74 69 6e 67 20 6f 66 20 61   consisting of a
17cb0 20 73 69 6e 67 6c 65 20 70 61 67 65 20 61 6e 64   single page and
17cc0 20 6e 6f 20 73 63 68 65 6d 61 20 6f 62 6a 65 63   no schema objec
17cd0 74 73 29 2e 20 52 65 74 75 72 6e 20 53 51 4c 49  ts). Return SQLI
17ce0 54 45 5f 4f 4b 0a 2a 2a 20 69 66 20 73 75 63 63  TE_OK.** if succ
17cf0 65 73 73 66 75 6c 2c 20 6f 72 20 61 6e 20 53 51  essful, or an SQ
17d00 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  Lite error code 
17d10 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 69 6e  otherwise..*/.in
17d20 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65  t sqlite3BtreeNe
17d30 77 44 62 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  wDb(Btree *p){. 
17d40 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74   int rc;.  sqlit
17d50 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
17d60 0a 20 20 70 2d 3e 70 42 74 2d 3e 6e 50 61 67 65  .  p->pBt->nPage
17d70 20 3d 20 30 3b 0a 20 20 72 63 20 3d 20 6e 65 77   = 0;.  rc = new
17d80 44 61 74 61 62 61 73 65 28 70 2d 3e 70 42 74 29  Database(p->pBt)
17d90 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
17da0 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
17db0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
17dc0 41 74 74 65 6d 70 74 20 74 6f 20 73 74 61 72 74  Attempt to start
17dd0 20 61 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69   a new transacti
17de0 6f 6e 2e 20 41 20 77 72 69 74 65 2d 74 72 61 6e  on. A write-tran
17df0 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 73 74  saction.** is st
17e00 61 72 74 65 64 20 69 66 20 74 68 65 20 73 65 63  arted if the sec
17e10 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ond argument is 
17e20 6e 6f 6e 7a 65 72 6f 2c 20 6f 74 68 65 72 77 69  nonzero, otherwi
17e30 73 65 20 61 20 72 65 61 64 2d 0a 2a 2a 20 74 72  se a read-.** tr
17e40 61 6e 73 61 63 74 69 6f 6e 2e 20 20 49 66 20 74  ansaction.  If t
17e50 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
17e60 6e 74 20 69 73 20 32 20 6f 72 20 6d 6f 72 65 20  nt is 2 or more 
17e70 61 6e 64 20 65 78 63 6c 75 73 69 76 65 0a 2a 2a  and exclusive.**
17e80 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
17e90 73 74 61 72 74 65 64 2c 20 6d 65 61 6e 69 6e 67  started, meaning
17ea0 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 70   that no other p
17eb0 72 6f 63 65 73 73 20 69 73 20 61 6c 6c 6f 77 65  rocess is allowe
17ec0 64 0a 2a 2a 20 74 6f 20 61 63 63 65 73 73 20 74  d.** to access t
17ed0 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 41 20  he database.  A 
17ee0 70 72 65 65 78 69 73 74 69 6e 67 20 74 72 61 6e  preexisting tran
17ef0 73 61 63 74 69 6f 6e 20 6d 61 79 20 6e 6f 74 20  saction may not 
17f00 62 65 0a 2a 2a 20 75 70 67 72 61 64 65 64 20 74  be.** upgraded t
17f10 6f 20 65 78 63 6c 75 73 69 76 65 20 62 79 20 63  o exclusive by c
17f20 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74  alling this rout
17f30 69 6e 65 20 61 20 73 65 63 6f 6e 64 20 74 69 6d  ine a second tim
17f40 65 20 2d 20 74 68 65 0a 2a 2a 20 65 78 63 6c 75  e - the.** exclu
17f50 73 69 76 69 74 79 20 66 6c 61 67 20 6f 6e 6c 79  sivity flag only
17f60 20 77 6f 72 6b 73 20 66 6f 72 20 61 20 6e 65 77   works for a new
17f70 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
17f80 0a 2a 2a 20 41 20 77 72 69 74 65 2d 74 72 61 6e  .** A write-tran
17f90 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20  saction must be 
17fa0 73 74 61 72 74 65 64 20 62 65 66 6f 72 65 20 61  started before a
17fb0 74 74 65 6d 70 74 69 6e 67 20 61 6e 79 20 0a 2a  ttempting any .*
17fc0 2a 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65  * changes to the
17fd0 20 64 61 74 61 62 61 73 65 2e 20 20 4e 6f 6e 65   database.  None
17fe0 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
17ff0 67 20 72 6f 75 74 69 6e 65 73 20 0a 2a 2a 20 77  g routines .** w
18000 69 6c 6c 20 77 6f 72 6b 20 75 6e 6c 65 73 73 20  ill work unless 
18010 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  a transaction is
18020 20 73 74 61 72 74 65 64 20 66 69 72 73 74 3a 0a   started first:.
18030 2a 2a 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74  **.**      sqlit
18040 65 33 42 74 72 65 65 43 72 65 61 74 65 54 61 62  e3BtreeCreateTab
18050 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c  le().**      sql
18060 69 74 65 33 42 74 72 65 65 43 72 65 61 74 65 49  ite3BtreeCreateI
18070 6e 64 65 78 28 29 0a 2a 2a 20 20 20 20 20 20 73  ndex().**      s
18080 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61 72  qlite3BtreeClear
18090 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20  Table().**      
180a0 73 71 6c 69 74 65 33 42 74 72 65 65 44 72 6f 70  sqlite3BtreeDrop
180b0 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20  Table().**      
180c0 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 73 65  sqlite3BtreeInse
180d0 72 74 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c  rt().**      sql
180e0 69 74 65 33 42 74 72 65 65 44 65 6c 65 74 65 28  ite3BtreeDelete(
180f0 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65  ).**      sqlite
18100 33 42 74 72 65 65 55 70 64 61 74 65 4d 65 74 61  3BtreeUpdateMeta
18110 28 29 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 69  ().**.** If an i
18120 6e 69 74 69 61 6c 20 61 74 74 65 6d 70 74 20 74  nitial attempt t
18130 6f 20 61 63 71 75 69 72 65 20 74 68 65 20 6c 6f  o acquire the lo
18140 63 6b 20 66 61 69 6c 73 20 62 65 63 61 75 73 65  ck fails because
18150 20 6f 66 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74   of lock content
18160 69 6f 6e 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64  ion.** and the d
18170 61 74 61 62 61 73 65 20 77 61 73 20 70 72 65 76  atabase was prev
18180 69 6f 75 73 6c 79 20 75 6e 6c 6f 63 6b 65 64 2c  iously unlocked,
18190 20 74 68 65 6e 20 69 6e 76 6f 6b 65 20 74 68 65   then invoke the
181a0 20 62 75 73 79 20 68 61 6e 64 6c 65 72 0a 2a 2a   busy handler.**
181b0 20 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e 65   if there is one
181c0 2e 20 20 42 75 74 20 69 66 20 74 68 65 72 65 20  .  But if there 
181d0 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 61  was previously a
181e0 20 72 65 61 64 2d 6c 6f 63 6b 2c 20 64 6f 20 6e   read-lock, do n
181f0 6f 74 0a 2a 2a 20 69 6e 76 6f 6b 65 20 74 68 65  ot.** invoke the
18200 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20 2d 20   busy handler - 
18210 6a 75 73 74 20 72 65 74 75 72 6e 20 53 51 4c 49  just return SQLI
18220 54 45 5f 42 55 53 59 2e 20 20 53 51 4c 49 54 45  TE_BUSY.  SQLITE
18230 5f 42 55 53 59 20 69 73 20 0a 2a 2a 20 72 65 74  _BUSY is .** ret
18240 75 72 6e 65 64 20 77 68 65 6e 20 74 68 65 72 65  urned when there
18250 20 69 73 20 61 6c 72 65 61 64 79 20 61 20 72 65   is already a re
18260 61 64 2d 6c 6f 63 6b 20 69 6e 20 6f 72 64 65 72  ad-lock in order
18270 20 74 6f 20 61 76 6f 69 64 20 61 20 64 65 61 64   to avoid a dead
18280 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 75 70 70  lock..**.** Supp
18290 6f 73 65 20 74 68 65 72 65 20 61 72 65 20 74 77  ose there are tw
182a0 6f 20 70 72 6f 63 65 73 73 65 73 20 41 20 61 6e  o processes A an
182b0 64 20 42 2e 20 20 41 20 68 61 73 20 61 20 72 65  d B.  A has a re
182c0 61 64 20 6c 6f 63 6b 20 61 6e 64 20 42 20 68 61  ad lock and B ha
182d0 73 0a 2a 2a 20 61 20 72 65 73 65 72 76 65 64 20  s.** a reserved 
182e0 6c 6f 63 6b 2e 20 20 42 20 74 72 69 65 73 20 74  lock.  B tries t
182f0 6f 20 70 72 6f 6d 6f 74 65 20 74 6f 20 65 78 63  o promote to exc
18300 6c 75 73 69 76 65 20 62 75 74 20 69 73 20 62 6c  lusive but is bl
18310 6f 63 6b 65 64 20 62 65 63 61 75 73 65 0a 2a 2a  ocked because.**
18320 20 6f 66 20 41 27 73 20 72 65 61 64 20 6c 6f 63   of A's read loc
18330 6b 2e 20 20 41 20 74 72 69 65 73 20 74 6f 20 70  k.  A tries to p
18340 72 6f 6d 6f 74 65 20 74 6f 20 72 65 73 65 72 76  romote to reserv
18350 65 64 20 62 75 74 20 69 73 20 62 6c 6f 63 6b 65  ed but is blocke
18360 64 20 62 79 20 42 2e 0a 2a 2a 20 4f 6e 65 20 6f  d by B..** One o
18370 72 20 74 68 65 20 6f 74 68 65 72 20 6f 66 20 74  r the other of t
18380 68 65 20 74 77 6f 20 70 72 6f 63 65 73 73 65 73  he two processes
18390 20 6d 75 73 74 20 67 69 76 65 20 77 61 79 20 6f   must give way o
183a0 72 20 74 68 65 72 65 20 63 61 6e 20 62 65 0a 2a  r there can be.*
183b0 2a 20 6e 6f 20 70 72 6f 67 72 65 73 73 2e 20 20  * no progress.  
183c0 42 79 20 72 65 74 75 72 6e 69 6e 67 20 53 51 4c  By returning SQL
183d0 49 54 45 5f 42 55 53 59 20 61 6e 64 20 6e 6f 74  ITE_BUSY and not
183e0 20 69 6e 76 6f 6b 69 6e 67 20 74 68 65 20 62 75   invoking the bu
183f0 73 79 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a 20 77  sy callback.** w
18400 68 65 6e 20 41 20 61 6c 72 65 61 64 79 20 68 61  hen A already ha
18410 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 2c 20 77  s a read lock, w
18420 65 20 65 6e 63 6f 75 72 61 67 65 20 41 20 74 6f  e encourage A to
18430 20 67 69 76 65 20 75 70 20 61 6e 64 20 6c 65 74   give up and let
18440 20 42 0a 2a 2a 20 70 72 6f 63 65 65 64 2e 0a 2a   B.** proceed..*
18450 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
18460 65 65 42 65 67 69 6e 54 72 61 6e 73 28 42 74 72  eeBeginTrans(Btr
18470 65 65 20 2a 70 2c 20 69 6e 74 20 77 72 66 6c 61  ee *p, int wrfla
18480 67 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 70  g){.  sqlite3 *p
18490 42 6c 6f 63 6b 20 3d 20 30 3b 0a 20 20 42 74 53  Block = 0;.  BtS
184a0 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
184b0 70 42 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  pBt;.  int rc = 
184c0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 73 71  SQLITE_OK;..  sq
184d0 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
184e0 70 29 3b 0a 20 20 62 74 72 65 65 49 6e 74 65 67  p);.  btreeInteg
184f0 72 69 74 79 28 70 29 3b 0a 0a 20 20 2f 2a 20 49  rity(p);..  /* I
18500 66 20 74 68 65 20 62 74 72 65 65 20 69 73 20 61  f the btree is a
18510 6c 72 65 61 64 79 20 69 6e 20 61 20 77 72 69 74  lready in a writ
18520 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 6f  e-transaction, o
18530 72 20 69 74 0a 20 20 2a 2a 20 69 73 20 61 6c 72  r it.  ** is alr
18540 65 61 64 79 20 69 6e 20 61 20 72 65 61 64 2d 74  eady in a read-t
18550 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 61  ransaction and a
18560 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f   read-transactio
18570 6e 0a 20 20 2a 2a 20 69 73 20 72 65 71 75 65 73  n.  ** is reques
18580 74 65 64 2c 20 74 68 69 73 20 69 73 20 61 20 6e  ted, this is a n
18590 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  o-op..  */.  if(
185a0 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41   p->inTrans==TRA
185b0 4e 53 5f 57 52 49 54 45 20 7c 7c 20 28 70 2d 3e  NS_WRITE || (p->
185c0 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 52  inTrans==TRANS_R
185d0 45 41 44 20 26 26 20 21 77 72 66 6c 61 67 29 20  EAD && !wrflag) 
185e0 29 7b 0a 20 20 20 20 67 6f 74 6f 20 74 72 61 6e  ){.    goto tran
185f0 73 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 20 20 61  s_begun;.  }.  a
18600 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72  ssert( pBt->inTr
18610 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53  ansaction==TRANS
18620 5f 57 52 49 54 45 20 7c 7c 20 49 66 4e 6f 74 4f  _WRITE || IfNotO
18630 6d 69 74 41 56 28 70 42 74 2d 3e 62 44 6f 54 72  mitAV(pBt->bDoTr
18640 75 6e 63 61 74 65 29 3d 3d 30 20 29 3b 0a 0a 20  uncate)==0 );.. 
18650 20 2f 2a 20 57 72 69 74 65 20 74 72 61 6e 73 61   /* Write transa
18660 63 74 69 6f 6e 73 20 61 72 65 20 6e 6f 74 20 70  ctions are not p
18670 6f 73 73 69 62 6c 65 20 6f 6e 20 61 20 72 65 61  ossible on a rea
18680 64 2d 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 20  d-only database 
18690 2a 2f 0a 20 20 69 66 28 20 28 70 42 74 2d 3e 62  */.  if( (pBt->b
186a0 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 52 45  tsFlags & BTS_RE
186b0 41 44 5f 4f 4e 4c 59 29 21 3d 30 20 26 26 20 77  AD_ONLY)!=0 && w
186c0 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 72 63 20  rflag ){.    rc 
186d0 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  = SQLITE_READONL
186e0 59 3b 0a 20 20 20 20 67 6f 74 6f 20 74 72 61 6e  Y;.    goto tran
186f0 73 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 0a 23 69  s_begun;.  }..#i
18700 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
18710 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20  T_SHARED_CACHE. 
18720 20 2f 2a 20 49 66 20 61 6e 6f 74 68 65 72 20 64   /* If another d
18730 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 68  atabase handle h
18740 61 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 65  as already opene
18750 64 20 61 20 77 72 69 74 65 20 74 72 61 6e 73 61  d a write transa
18760 63 74 69 6f 6e 20 0a 20 20 2a 2a 20 6f 6e 20 74  ction .  ** on t
18770 68 69 73 20 73 68 61 72 65 64 2d 62 74 72 65 65  his shared-btree
18780 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 61   structure and a
18790 20 73 65 63 6f 6e 64 20 77 72 69 74 65 20 74 72   second write tr
187a0 61 6e 73 61 63 74 69 6f 6e 20 69 73 0a 20 20 2a  ansaction is.  *
187b0 2a 20 72 65 71 75 65 73 74 65 64 2c 20 72 65 74  * requested, ret
187c0 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45  urn SQLITE_LOCKE
187d0 44 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 77  D..  */.  if( (w
187e0 72 66 6c 61 67 20 26 26 20 70 42 74 2d 3e 69 6e  rflag && pBt->in
187f0 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41  Transaction==TRA
18800 4e 53 5f 57 52 49 54 45 29 0a 20 20 20 7c 7c 20  NS_WRITE).   || 
18810 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26  (pBt->btsFlags &
18820 20 42 54 53 5f 50 45 4e 44 49 4e 47 29 21 3d 30   BTS_PENDING)!=0
18830 0a 20 20 29 7b 0a 20 20 20 20 70 42 6c 6f 63 6b  .  ){.    pBlock
18840 20 3d 20 70 42 74 2d 3e 70 57 72 69 74 65 72 2d   = pBt->pWriter-
18850 3e 64 62 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  >db;.  }else if(
18860 20 77 72 66 6c 61 67 3e 31 20 29 7b 0a 20 20 20   wrflag>1 ){.   
18870 20 42 74 4c 6f 63 6b 20 2a 70 49 74 65 72 3b 0a   BtLock *pIter;.
18880 20 20 20 20 66 6f 72 28 70 49 74 65 72 3d 70 42      for(pIter=pB
18890 74 2d 3e 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b  t->pLock; pIter;
188a0 20 70 49 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e   pIter=pIter->pN
188b0 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ext){.      if( 
188c0 70 49 74 65 72 2d 3e 70 42 74 72 65 65 21 3d 70  pIter->pBtree!=p
188d0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42 6c 6f   ){.        pBlo
188e0 63 6b 20 3d 20 70 49 74 65 72 2d 3e 70 42 74 72  ck = pIter->pBtr
188f0 65 65 2d 3e 64 62 3b 0a 20 20 20 20 20 20 20 20  ee->db;.        
18900 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
18910 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70     }.  }.  if( p
18920 42 6c 6f 63 6b 20 29 7b 0a 20 20 20 20 73 71 6c  Block ){.    sql
18930 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c  ite3ConnectionBl
18940 6f 63 6b 65 64 28 70 2d 3e 64 62 2c 20 70 42 6c  ocked(p->db, pBl
18950 6f 63 6b 29 3b 0a 20 20 20 20 72 63 20 3d 20 53  ock);.    rc = S
18960 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41  QLITE_LOCKED_SHA
18970 52 45 44 43 41 43 48 45 3b 0a 20 20 20 20 67 6f  REDCACHE;.    go
18980 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a  to trans_begun;.
18990 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
189a0 20 41 6e 79 20 72 65 61 64 2d 6f 6e 6c 79 20 6f   Any read-only o
189b0 72 20 72 65 61 64 2d 77 72 69 74 65 20 74 72 61  r read-write tra
189c0 6e 73 61 63 74 69 6f 6e 20 69 6d 70 6c 69 65 73  nsaction implies
189d0 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20   a read-lock on 
189e0 0a 20 20 2a 2a 20 70 61 67 65 20 31 2e 20 53 6f  .  ** page 1. So
189f0 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 73   if some other s
18a00 68 61 72 65 64 2d 63 61 63 68 65 20 63 6c 69 65  hared-cache clie
18a10 6e 74 20 61 6c 72 65 61 64 79 20 68 61 73 20 61  nt already has a
18a20 20 77 72 69 74 65 2d 6c 6f 63 6b 20 0a 20 20 2a   write-lock .  *
18a30 2a 20 6f 6e 20 70 61 67 65 20 31 2c 20 74 68 65  * on page 1, the
18a40 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 61 6e   transaction can
18a50 6e 6f 74 20 62 65 20 6f 70 65 6e 65 64 2e 20 2a  not be opened. *
18a60 2f 0a 20 20 72 63 20 3d 20 71 75 65 72 79 53 68  /.  rc = querySh
18a70 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
18a80 63 6b 28 70 2c 20 4d 41 53 54 45 52 5f 52 4f 4f  ck(p, MASTER_ROO
18a90 54 2c 20 52 45 41 44 5f 4c 4f 43 4b 29 3b 0a 20  T, READ_LOCK);. 
18aa0 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d   if( SQLITE_OK!=
18ab0 72 63 20 29 20 67 6f 74 6f 20 74 72 61 6e 73 5f  rc ) goto trans_
18ac0 62 65 67 75 6e 3b 0a 0a 20 20 70 42 74 2d 3e 62  begun;..  pBt->b
18ad0 74 73 46 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f  tsFlags &= ~BTS_
18ae0 49 4e 49 54 49 41 4c 4c 59 5f 45 4d 50 54 59 3b  INITIALLY_EMPTY;
18af0 0a 20 20 69 66 28 20 70 42 74 2d 3e 6e 50 61 67  .  if( pBt->nPag
18b00 65 3d 3d 30 20 29 20 70 42 74 2d 3e 62 74 73 46  e==0 ) pBt->btsF
18b10 6c 61 67 73 20 7c 3d 20 42 54 53 5f 49 4e 49 54  lags |= BTS_INIT
18b20 49 41 4c 4c 59 5f 45 4d 50 54 59 3b 0a 20 20 64  IALLY_EMPTY;.  d
18b30 6f 20 7b 0a 20 20 20 20 2f 2a 20 43 61 6c 6c 20  o {.    /* Call 
18b40 6c 6f 63 6b 42 74 72 65 65 28 29 20 75 6e 74 69  lockBtree() unti
18b50 6c 20 65 69 74 68 65 72 20 70 42 74 2d 3e 70 50  l either pBt->pP
18b60 61 67 65 31 20 69 73 20 70 6f 70 75 6c 61 74 65  age1 is populate
18b70 64 20 6f 72 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b  d or.    ** lock
18b80 42 74 72 65 65 28 29 20 72 65 74 75 72 6e 73 20  Btree() returns 
18b90 73 6f 6d 65 74 68 69 6e 67 20 6f 74 68 65 72 20  something other 
18ba0 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20  than SQLITE_OK. 
18bb0 6c 6f 63 6b 42 74 72 65 65 28 29 0a 20 20 20 20  lockBtree().    
18bc0 2a 2a 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51  ** may return SQ
18bd0 4c 49 54 45 5f 4f 4b 20 62 75 74 20 6c 65 61 76  LITE_OK but leav
18be0 65 20 70 42 74 2d 3e 70 50 61 67 65 31 20 73 65  e pBt->pPage1 se
18bf0 74 20 74 6f 20 30 20 69 66 20 61 66 74 65 72 0a  t to 0 if after.
18c00 20 20 20 20 2a 2a 20 72 65 61 64 69 6e 67 20 70      ** reading p
18c10 61 67 65 20 31 20 69 74 20 64 69 73 63 6f 76 65  age 1 it discove
18c20 72 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65  rs that the page
18c30 2d 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74  -size of the dat
18c40 61 62 61 73 65 20 0a 20 20 20 20 2a 2a 20 66 69  abase .    ** fi
18c50 6c 65 20 69 73 20 6e 6f 74 20 70 42 74 2d 3e 70  le is not pBt->p
18c60 61 67 65 53 69 7a 65 2e 20 49 6e 20 74 68 69 73  ageSize. In this
18c70 20 63 61 73 65 20 6c 6f 63 6b 42 74 72 65 65 28   case lockBtree(
18c80 29 20 77 69 6c 6c 20 75 70 64 61 74 65 0a 20 20  ) will update.  
18c90 20 20 2a 2a 20 70 42 74 2d 3e 70 61 67 65 53 69    ** pBt->pageSi
18ca0 7a 65 20 74 6f 20 74 68 65 20 70 61 67 65 2d 73  ze to the page-s
18cb0 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20  ize of the file 
18cc0 6f 6e 20 64 69 73 6b 2e 0a 20 20 20 20 2a 2f 0a  on disk..    */.
18cd0 20 20 20 20 77 68 69 6c 65 28 20 70 42 74 2d 3e      while( pBt->
18ce0 70 50 61 67 65 31 3d 3d 30 20 26 26 20 53 51 4c  pPage1==0 && SQL
18cf0 49 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20 6c 6f  ITE_OK==(rc = lo
18d00 63 6b 42 74 72 65 65 28 70 42 74 29 29 20 29 3b  ckBtree(pBt)) );
18d10 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ..    if( rc==SQ
18d20 4c 49 54 45 5f 4f 4b 20 26 26 20 77 72 66 6c 61  LITE_OK && wrfla
18d30 67 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28  g ){.      if( (
18d40 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20  pBt->btsFlags & 
18d50 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 29 21 3d  BTS_READ_ONLY)!=
18d60 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  0 ){.        rc 
18d70 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  = SQLITE_READONL
18d80 59 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  Y;.      }else{.
18d90 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
18da0 69 74 65 33 50 61 67 65 72 42 65 67 69 6e 28 70  ite3PagerBegin(p
18db0 42 74 2d 3e 70 50 61 67 65 72 2c 77 72 66 6c 61  Bt->pPager,wrfla
18dc0 67 3e 31 2c 73 71 6c 69 74 65 33 54 65 6d 70 49  g>1,sqlite3TempI
18dd0 6e 4d 65 6d 6f 72 79 28 70 2d 3e 64 62 29 29 3b  nMemory(p->db));
18de0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
18df0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
18e00 20 20 20 20 20 20 20 20 72 63 20 3d 20 6e 65 77          rc = new
18e10 44 61 74 61 62 61 73 65 28 70 42 74 29 3b 0a 20  Database(pBt);. 
18e20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
18e30 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 69 66  .    }.  .    if
18e40 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
18e50 29 7b 0a 20 20 20 20 20 20 75 6e 6c 6f 63 6b 42  ){.      unlockB
18e60 74 72 65 65 49 66 55 6e 75 73 65 64 28 70 42 74  treeIfUnused(pBt
18e70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c  );.    }.  }whil
18e80 65 28 20 28 72 63 26 30 78 46 46 29 3d 3d 53 51  e( (rc&0xFF)==SQ
18e90 4c 49 54 45 5f 42 55 53 59 20 26 26 20 70 42 74  LITE_BUSY && pBt
18ea0 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d  ->inTransaction=
18eb0 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 0a 20  =TRANS_NONE &&. 
18ec0 20 20 20 20 20 20 20 20 20 62 74 72 65 65 49 6e           btreeIn
18ed0 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 28  vokeBusyHandler(
18ee0 70 42 74 29 20 29 3b 0a 0a 20 20 69 66 28 20 72  pBt) );..  if( r
18ef0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
18f00 20 20 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61      if( p->inTra
18f10 6e 73 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29  ns==TRANS_NONE )
18f20 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 54 72  {.      pBt->nTr
18f30 61 6e 73 61 63 74 69 6f 6e 2b 2b 3b 0a 23 69 66  ansaction++;.#if
18f40 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
18f50 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20  _SHARED_CACHE.  
18f60 20 20 20 20 69 66 28 20 70 2d 3e 73 68 61 72 61      if( p->shara
18f70 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 61  ble ){.        a
18f80 73 73 65 72 74 28 20 70 2d 3e 6c 6f 63 6b 2e 70  ssert( p->lock.p
18f90 42 74 72 65 65 3d 3d 70 20 26 26 20 70 2d 3e 6c  Btree==p && p->l
18fa0 6f 63 6b 2e 69 54 61 62 6c 65 3d 3d 31 20 29 3b  ock.iTable==1 );
18fb0 0a 20 20 20 20 20 20 20 20 70 2d 3e 6c 6f 63 6b  .        p->lock
18fc0 2e 65 4c 6f 63 6b 20 3d 20 52 45 41 44 5f 4c 4f  .eLock = READ_LO
18fd0 43 4b 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6c  CK;.        p->l
18fe0 6f 63 6b 2e 70 4e 65 78 74 20 3d 20 70 42 74 2d  ock.pNext = pBt-
18ff0 3e 70 4c 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20  >pLock;.        
19000 70 42 74 2d 3e 70 4c 6f 63 6b 20 3d 20 26 70 2d  pBt->pLock = &p-
19010 3e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 7d 0a 23  >lock;.      }.#
19020 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20  endif.    }.    
19030 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 28 77 72  p->inTrans = (wr
19040 66 6c 61 67 3f 54 52 41 4e 53 5f 57 52 49 54 45  flag?TRANS_WRITE
19050 3a 54 52 41 4e 53 5f 52 45 41 44 29 3b 0a 20 20  :TRANS_READ);.  
19060 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73    if( p->inTrans
19070 3e 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74  >pBt->inTransact
19080 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 70 42 74  ion ){.      pBt
19090 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20  ->inTransaction 
190a0 3d 20 70 2d 3e 69 6e 54 72 61 6e 73 3b 0a 20 20  = p->inTrans;.  
190b0 20 20 7d 0a 20 20 20 20 69 66 28 20 77 72 66 6c    }.    if( wrfl
190c0 61 67 20 29 7b 0a 20 20 20 20 20 20 4d 65 6d 50  ag ){.      MemP
190d0 61 67 65 20 2a 70 50 61 67 65 31 20 3d 20 70 42  age *pPage1 = pB
190e0 74 2d 3e 70 50 61 67 65 31 3b 0a 23 69 66 6e 64  t->pPage1;.#ifnd
190f0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
19100 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 20 20  HARED_CACHE.    
19110 20 20 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e    assert( !pBt->
19120 70 57 72 69 74 65 72 20 29 3b 0a 20 20 20 20 20  pWriter );.     
19130 20 70 42 74 2d 3e 70 57 72 69 74 65 72 20 3d 20   pBt->pWriter = 
19140 70 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 62 74  p;.      pBt->bt
19150 73 46 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f 45  sFlags &= ~BTS_E
19160 58 43 4c 55 53 49 56 45 3b 0a 20 20 20 20 20 20  XCLUSIVE;.      
19170 69 66 28 20 77 72 66 6c 61 67 3e 31 20 29 20 70  if( wrflag>1 ) p
19180 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20  Bt->btsFlags |= 
19190 42 54 53 5f 45 58 43 4c 55 53 49 56 45 3b 0a 23  BTS_EXCLUSIVE;.#
191a0 65 6e 64 69 66 0a 0a 20 20 20 20 20 20 2f 2a 20  endif..      /* 
191b0 49 66 20 74 68 65 20 64 62 2d 73 69 7a 65 20 68  If the db-size h
191c0 65 61 64 65 72 20 66 69 65 6c 64 20 69 73 20 69  eader field is i
191d0 6e 63 6f 72 72 65 63 74 20 28 61 73 20 69 74 20  ncorrect (as it 
191e0 6d 61 79 20 62 65 20 69 66 20 61 6e 20 6f 6c 64  may be if an old
191f0 0a 20 20 20 20 20 20 2a 2a 20 63 6c 69 65 6e 74  .      ** client
19200 20 68 61 73 20 62 65 65 6e 20 77 72 69 74 69 6e   has been writin
19210 67 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  g the database f
19220 69 6c 65 29 2c 20 75 70 64 61 74 65 20 69 74 20  ile), update it 
19230 6e 6f 77 2e 20 44 6f 69 6e 67 0a 20 20 20 20 20  now. Doing.     
19240 20 2a 2a 20 74 68 69 73 20 73 6f 6f 6e 65 72 20   ** this sooner 
19250 72 61 74 68 65 72 20 74 68 61 6e 20 6c 61 74 65  rather than late
19260 72 20 6d 65 61 6e 73 20 74 68 65 20 64 61 74 61  r means the data
19270 62 61 73 65 20 73 69 7a 65 20 63 61 6e 20 73 61  base size can sa
19280 66 65 6c 79 20 0a 20 20 20 20 20 20 2a 2a 20 72  fely .      ** r
19290 65 2d 72 65 61 64 20 74 68 65 20 64 61 74 61 62  e-read the datab
192a0 61 73 65 20 73 69 7a 65 20 66 72 6f 6d 20 70 61  ase size from pa
192b0 67 65 20 31 20 69 66 20 61 20 73 61 76 65 70 6f  ge 1 if a savepo
192c0 69 6e 74 20 6f 72 20 74 72 61 6e 73 61 63 74 69  int or transacti
192d0 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 72 6f 6c 6c  on.      ** roll
192e0 62 61 63 6b 20 6f 63 63 75 72 73 20 77 69 74 68  back occurs with
192f0 69 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  in the transacti
19300 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  on..      */.   
19310 20 20 20 69 66 28 20 70 42 74 2d 3e 6e 50 61 67     if( pBt->nPag
19320 65 21 3d 67 65 74 34 62 79 74 65 28 26 70 50 61  e!=get4byte(&pPa
19330 67 65 31 2d 3e 61 44 61 74 61 5b 32 38 5d 29 20  ge1->aData[28]) 
19340 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
19350 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
19360 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67  e(pPage1->pDbPag
19370 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  e);.        if( 
19380 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
19390 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62  .          put4b
193a0 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61  yte(&pPage1->aDa
193b0 74 61 5b 32 38 5d 2c 20 70 42 74 2d 3e 6e 50 61  ta[28], pBt->nPa
193c0 67 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ge);.        }. 
193d0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
193e0 0a 0a 0a 74 72 61 6e 73 5f 62 65 67 75 6e 3a 0a  ...trans_begun:.
193f0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
19400 5f 4f 4b 20 26 26 20 77 72 66 6c 61 67 20 29 7b  _OK && wrflag ){
19410 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61 6c  .    /* This cal
19420 6c 20 6d 61 6b 65 73 20 73 75 72 65 20 74 68 61  l makes sure tha
19430 74 20 74 68 65 20 70 61 67 65 72 20 68 61 73 20  t the pager has 
19440 74 68 65 20 63 6f 72 72 65 63 74 20 6e 75 6d 62  the correct numb
19450 65 72 20 6f 66 0a 20 20 20 20 2a 2a 20 6f 70 65  er of.    ** ope
19460 6e 20 73 61 76 65 70 6f 69 6e 74 73 2e 20 49 66  n savepoints. If
19470 20 74 68 65 20 73 65 63 6f 6e 64 20 70 61 72 61   the second para
19480 6d 65 74 65 72 20 69 73 20 67 72 65 61 74 65 72  meter is greater
19490 20 74 68 61 6e 20 30 20 61 6e 64 0a 20 20 20 20   than 0 and.    
194a0 2a 2a 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  ** the sub-journ
194b0 61 6c 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  al is not alread
194c0 79 20 6f 70 65 6e 2c 20 74 68 65 6e 20 69 74 20  y open, then it 
194d0 77 69 6c 6c 20 62 65 20 6f 70 65 6e 65 64 20 68  will be opened h
194e0 65 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ere..    */.    
194f0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
19500 72 4f 70 65 6e 53 61 76 65 70 6f 69 6e 74 28 70  rOpenSavepoint(p
19510 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 2d 3e 64  Bt->pPager, p->d
19520 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 29 3b 0a  b->nSavepoint);.
19530 20 20 7d 0a 0a 20 20 62 74 72 65 65 49 6e 74 65    }..  btreeInte
19540 67 72 69 74 79 28 70 29 3b 0a 20 20 73 71 6c 69  grity(p);.  sqli
19550 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
19560 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
19570 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
19580 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
19590 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
195a0 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72  pointer-map entr
195b0 69 65 73 20 66 6f 72 20 61 6c 6c 20 63 68 69 6c  ies for all chil
195c0 64 72 65 6e 20 6f 66 20 70 61 67 65 20 70 50 61  dren of page pPa
195d0 67 65 2e 20 41 6c 73 6f 2c 20 69 66 0a 2a 2a 20  ge. Also, if.** 
195e0 70 50 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 63  pPage contains c
195f0 65 6c 6c 73 20 74 68 61 74 20 70 6f 69 6e 74 20  ells that point 
19600 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  to overflow page
19610 73 2c 20 73 65 74 20 74 68 65 20 70 6f 69 6e 74  s, set the point
19620 65 72 0a 2a 2a 20 6d 61 70 20 65 6e 74 72 69 65  er.** map entrie
19630 73 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c  s for the overfl
19640 6f 77 20 70 61 67 65 73 20 61 73 20 77 65 6c 6c  ow pages as well
19650 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
19660 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70 73 28  setChildPtrmaps(
19670 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b  MemPage *pPage){
19680 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
19690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
196a0 20 20 20 20 20 20 2f 2a 20 43 6f 75 6e 74 65 72        /* Counter
196b0 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 69   variable */.  i
196c0 6e 74 20 6e 43 65 6c 6c 3b 20 20 20 20 20 20 20  nt nCell;       
196d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
196e0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
196f0 65 6c 6c 73 20 69 6e 20 70 61 67 65 20 70 50 61  ells in page pPa
19700 67 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  ge */.  int rc; 
19710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19720 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
19730 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 42  turn code */.  B
19740 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
19750 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 75 38 20  Page->pBt;.  u8 
19760 69 73 49 6e 69 74 4f 72 69 67 20 3d 20 70 50 61  isInitOrig = pPa
19770 67 65 2d 3e 69 73 49 6e 69 74 3b 0a 20 20 50 67  ge->isInit;.  Pg
19780 6e 6f 20 70 67 6e 6f 20 3d 20 70 50 61 67 65 2d  no pgno = pPage-
19790 3e 70 67 6e 6f 3b 0a 0a 20 20 61 73 73 65 72 74  >pgno;..  assert
197a0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
197b0 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
197c0 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 63 20  >mutex) );.  rc 
197d0 3d 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28  = btreeInitPage(
197e0 70 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63  pPage);.  if( rc
197f0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
19800 20 20 20 67 6f 74 6f 20 73 65 74 5f 63 68 69 6c     goto set_chil
19810 64 5f 70 74 72 6d 61 70 73 5f 6f 75 74 3b 0a 20  d_ptrmaps_out;. 
19820 20 7d 0a 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61   }.  nCell = pPa
19830 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20 66 6f  ge->nCell;..  fo
19840 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20  r(i=0; i<nCell; 
19850 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70 43  i++){.    u8 *pC
19860 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70  ell = findCell(p
19870 50 61 67 65 2c 20 69 29 3b 0a 0a 20 20 20 20 70  Page, i);..    p
19880 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28  trmapPutOvflPtr(
19890 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 72  pPage, pCell, &r
198a0 63 29 3b 0a 0a 20 20 20 20 69 66 28 20 21 70 50  c);..    if( !pP
198b0 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
198c0 20 20 20 50 67 6e 6f 20 63 68 69 6c 64 50 67 6e     Pgno childPgn
198d0 6f 20 3d 20 67 65 74 34 62 79 74 65 28 70 43 65  o = get4byte(pCe
198e0 6c 6c 29 3b 0a 20 20 20 20 20 20 70 74 72 6d 61  ll);.      ptrma
198f0 70 50 75 74 28 70 42 74 2c 20 63 68 69 6c 64 50  pPut(pBt, childP
19900 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45  gno, PTRMAP_BTRE
19910 45 2c 20 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20  E, pgno, &rc);. 
19920 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
19930 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a  !pPage->leaf ){.
19940 20 20 20 20 50 67 6e 6f 20 63 68 69 6c 64 50 67      Pgno childPg
19950 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  no = get4byte(&p
19960 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67  Page->aData[pPag
19970 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29  e->hdrOffset+8])
19980 3b 0a 20 20 20 20 70 74 72 6d 61 70 50 75 74 28  ;.    ptrmapPut(
19990 70 42 74 2c 20 63 68 69 6c 64 50 67 6e 6f 2c 20  pBt, childPgno, 
199a0 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 67  PTRMAP_BTREE, pg
199b0 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 7d 0a 0a 73  no, &rc);.  }..s
199c0 65 74 5f 63 68 69 6c 64 5f 70 74 72 6d 61 70 73  et_child_ptrmaps
199d0 5f 6f 75 74 3a 0a 20 20 70 50 61 67 65 2d 3e 69  _out:.  pPage->i
199e0 73 49 6e 69 74 20 3d 20 69 73 49 6e 69 74 4f 72  sInit = isInitOr
199f0 69 67 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ig;.  return rc;
19a00 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 77 68  .}../*.** Somewh
19a10 65 72 65 20 6f 6e 20 70 50 61 67 65 20 69 73 20  ere on pPage is 
19a20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 61 67  a pointer to pag
19a30 65 20 69 46 72 6f 6d 2e 20 20 4d 6f 64 69 66 79  e iFrom.  Modify
19a40 20 74 68 69 73 20 70 6f 69 6e 74 65 72 20 73 6f   this pointer so
19a50 0a 2a 2a 20 74 68 61 74 20 69 74 20 70 6f 69 6e  .** that it poin
19a60 74 73 20 74 6f 20 69 54 6f 2e 20 50 61 72 61 6d  ts to iTo. Param
19a70 65 74 65 72 20 65 54 79 70 65 20 64 65 73 63 72  eter eType descr
19a80 69 62 65 73 20 74 68 65 20 74 79 70 65 20 6f 66  ibes the type of
19a90 20 70 6f 69 6e 74 65 72 20 74 6f 0a 2a 2a 20 62   pointer to.** b
19aa0 65 20 6d 6f 64 69 66 69 65 64 2c 20 61 73 20 20  e modified, as  
19ab0 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 50  follows:.**.** P
19ac0 54 52 4d 41 50 5f 42 54 52 45 45 3a 20 20 20 20  TRMAP_BTREE:    
19ad0 20 70 50 61 67 65 20 69 73 20 61 20 62 74 72 65   pPage is a btre
19ae0 65 2d 70 61 67 65 2e 20 54 68 65 20 70 6f 69 6e  e-page. The poin
19af0 74 65 72 20 70 6f 69 6e 74 73 20 61 74 20 61 20  ter points at a 
19b00 63 68 69 6c 64 20 0a 2a 2a 20 20 20 20 20 20 20  child .**       
19b10 20 20 20 20 20 20 20 20 20 20 20 20 70 61 67 65              page
19b20 20 6f 66 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a   of pPage..**.**
19b30 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57   PTRMAP_OVERFLOW
19b40 31 3a 20 70 50 61 67 65 20 69 73 20 61 20 62 74  1: pPage is a bt
19b50 72 65 65 2d 70 61 67 65 2e 20 54 68 65 20 70 6f  ree-page. The po
19b60 69 6e 74 65 72 20 70 6f 69 6e 74 73 20 61 74 20  inter points at 
19b70 61 6e 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20 20  an overflow.**  
19b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19b90 20 70 61 67 65 20 70 6f 69 6e 74 65 64 20 74 6f   page pointed to
19ba0 20 62 79 20 6f 6e 65 20 6f 66 20 74 68 65 20 63   by one of the c
19bb0 65 6c 6c 73 20 6f 6e 20 70 50 61 67 65 2e 0a 2a  ells on pPage..*
19bc0 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f 56 45 52  *.** PTRMAP_OVER
19bd0 46 4c 4f 57 32 3a 20 70 50 61 67 65 20 69 73 20  FLOW2: pPage is 
19be0 61 6e 20 6f 76 65 72 66 6c 6f 77 2d 70 61 67 65  an overflow-page
19bf0 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20 70 6f  . The pointer po
19c00 69 6e 74 73 20 61 74 20 74 68 65 20 6e 65 78 74  ints at the next
19c10 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
19c20 20 20 20 20 20 20 6f 76 65 72 66 6c 6f 77 20 70        overflow p
19c30 61 67 65 20 69 6e 20 74 68 65 20 6c 69 73 74 2e  age in the list.
19c40 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d  .*/.static int m
19c50 6f 64 69 66 79 50 61 67 65 50 6f 69 6e 74 65 72  odifyPagePointer
19c60 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
19c70 20 50 67 6e 6f 20 69 46 72 6f 6d 2c 20 50 67 6e   Pgno iFrom, Pgn
19c80 6f 20 69 54 6f 2c 20 75 38 20 65 54 79 70 65 29  o iTo, u8 eType)
19c90 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  {.  assert( sqli
19ca0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
19cb0 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
19cc0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
19cd0 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
19ce0 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
19cf0 62 50 61 67 65 29 20 29 3b 0a 20 20 69 66 28 20  bPage) );.  if( 
19d00 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56  eType==PTRMAP_OV
19d10 45 52 46 4c 4f 57 32 20 29 7b 0a 20 20 20 20 2f  ERFLOW2 ){.    /
19d20 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 69 73  * The pointer is
19d30 20 61 6c 77 61 79 73 20 74 68 65 20 66 69 72 73   always the firs
19d40 74 20 34 20 62 79 74 65 73 20 6f 66 20 74 68 65  t 4 bytes of the
19d50 20 70 61 67 65 20 69 6e 20 74 68 69 73 20 63 61   page in this ca
19d60 73 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  se.  */.    if( 
19d70 67 65 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e  get4byte(pPage->
19d80 61 44 61 74 61 29 21 3d 69 46 72 6f 6d 20 29 7b  aData)!=iFrom ){
19d90 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
19da0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
19db0 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 75 74  T;.    }.    put
19dc0 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61  4byte(pPage->aDa
19dd0 74 61 2c 20 69 54 6f 29 3b 0a 20 20 7d 65 6c 73  ta, iTo);.  }els
19de0 65 7b 0a 20 20 20 20 75 38 20 69 73 49 6e 69 74  e{.    u8 isInit
19df0 4f 72 69 67 20 3d 20 70 50 61 67 65 2d 3e 69 73  Orig = pPage->is
19e00 49 6e 69 74 3b 0a 20 20 20 20 69 6e 74 20 69 3b  Init;.    int i;
19e10 0a 20 20 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 0a  .    int nCell;.
19e20 20 20 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 20      int rc;..   
19e30 20 72 63 20 3d 20 62 74 72 65 65 49 6e 69 74 50   rc = btreeInitP
19e40 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20  age(pPage);.    
19e50 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
19e60 72 63 3b 0a 20 20 20 20 6e 43 65 6c 6c 20 3d 20  rc;.    nCell = 
19e70 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20  pPage->nCell;.. 
19e80 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43     for(i=0; i<nC
19e90 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  ell; i++){.     
19ea0 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20 66 69 6e   u8 *pCell = fin
19eb0 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b  dCell(pPage, i);
19ec0 0a 20 20 20 20 20 20 69 66 28 20 65 54 79 70 65  .      if( eType
19ed0 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  ==PTRMAP_OVERFLO
19ee0 57 31 20 29 7b 0a 20 20 20 20 20 20 20 20 43 65  W1 ){.        Ce
19ef0 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20  llInfo info;.   
19f00 20 20 20 20 20 62 74 72 65 65 50 61 72 73 65 43       btreeParseC
19f10 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43  ellPtr(pPage, pC
19f20 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20  ell, &info);.   
19f30 20 20 20 20 20 69 66 28 20 69 6e 66 6f 2e 69 4f       if( info.iO
19f40 76 65 72 66 6c 6f 77 0a 20 20 20 20 20 20 20 20  verflow.        
19f50 20 26 26 20 70 43 65 6c 6c 2b 69 6e 66 6f 2e 69   && pCell+info.i
19f60 4f 76 65 72 66 6c 6f 77 2b 33 3c 3d 70 50 61 67  Overflow+3<=pPag
19f70 65 2d 3e 61 44 61 74 61 2b 70 50 61 67 65 2d 3e  e->aData+pPage->
19f80 6d 61 73 6b 50 61 67 65 0a 20 20 20 20 20 20 20  maskPage.       
19f90 20 20 26 26 20 69 46 72 6f 6d 3d 3d 67 65 74 34    && iFrom==get4
19fa0 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f  byte(&pCell[info
19fb0 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 0a 20 20 20  .iOverflow]).   
19fc0 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
19fd0 20 20 70 75 74 34 62 79 74 65 28 26 70 43 65 6c    put4byte(&pCel
19fe0 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77  l[info.iOverflow
19ff0 5d 2c 20 69 54 6f 29 3b 0a 20 20 20 20 20 20 20  ], iTo);.       
1a000 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
1a010 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
1a020 0a 20 20 20 20 20 20 20 20 69 66 28 20 67 65 74  .        if( get
1a030 34 62 79 74 65 28 70 43 65 6c 6c 29 3d 3d 69 46  4byte(pCell)==iF
1a040 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 20  rom ){.         
1a050 20 70 75 74 34 62 79 74 65 28 70 43 65 6c 6c 2c   put4byte(pCell,
1a060 20 69 54 6f 29 3b 0a 20 20 20 20 20 20 20 20 20   iTo);.         
1a070 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
1a080 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
1a090 20 20 0a 20 20 20 20 69 66 28 20 69 3d 3d 6e 43    .    if( i==nC
1a0a0 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ell ){.      if(
1a0b0 20 65 54 79 70 65 21 3d 50 54 52 4d 41 50 5f 42   eType!=PTRMAP_B
1a0c0 54 52 45 45 20 7c 7c 20 0a 20 20 20 20 20 20 20  TREE || .       
1a0d0 20 20 20 67 65 74 34 62 79 74 65 28 26 70 50 61     get4byte(&pPa
1a0e0 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d  ge->aData[pPage-
1a0f0 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 21 3d  >hdrOffset+8])!=
1a100 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 20  iFrom ){.       
1a110 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
1a120 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
1a130 20 20 20 7d 0a 20 20 20 20 20 20 70 75 74 34 62     }.      put4b
1a140 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74  yte(&pPage->aDat
1a150 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
1a160 65 74 2b 38 5d 2c 20 69 54 6f 29 3b 0a 20 20 20  et+8], iTo);.   
1a170 20 7d 0a 0a 20 20 20 20 70 50 61 67 65 2d 3e 69   }..    pPage->i
1a180 73 49 6e 69 74 20 3d 20 69 73 49 6e 69 74 4f 72  sInit = isInitOr
1a190 69 67 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ig;.  }.  return
1a1a0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a   SQLITE_OK;.}...
1a1b0 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 6f  /*.** Move the o
1a1c0 70 65 6e 20 64 61 74 61 62 61 73 65 20 70 61 67  pen database pag
1a1d0 65 20 70 44 62 50 61 67 65 20 74 6f 20 6c 6f 63  e pDbPage to loc
1a1e0 61 74 69 6f 6e 20 69 46 72 65 65 50 61 67 65 20  ation iFreePage 
1a1f0 69 6e 20 74 68 65 20 0a 2a 2a 20 64 61 74 61 62  in the .** datab
1a200 61 73 65 2e 20 54 68 65 20 70 44 62 50 61 67 65  ase. The pDbPage
1a210 20 72 65 66 65 72 65 6e 63 65 20 72 65 6d 61 69   reference remai
1a220 6e 73 20 76 61 6c 69 64 2e 0a 2a 2a 0a 2a 2a 20  ns valid..**.** 
1a230 54 68 65 20 69 73 43 6f 6d 6d 69 74 20 66 6c 61  The isCommit fla
1a240 67 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74  g indicates that
1a250 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65   there is no nee
1a260 64 20 74 6f 20 72 65 6d 65 6d 62 65 72 20 74 68  d to remember th
1a270 61 74 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61  at.** the journa
1a280 6c 20 6e 65 65 64 73 20 74 6f 20 62 65 20 73 79  l needs to be sy
1a290 6e 63 28 29 65 64 20 62 65 66 6f 72 65 20 64 61  nc()ed before da
1a2a0 74 61 62 61 73 65 20 70 61 67 65 20 70 44 62 50  tabase page pDbP
1a2b0 61 67 65 2d 3e 70 67 6e 6f 20 0a 2a 2a 20 63 61  age->pgno .** ca
1a2c0 6e 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f 2e  n be written to.
1a2d0 20 54 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20   The caller has 
1a2e0 61 6c 72 65 61 64 79 20 70 72 6f 6d 69 73 65 64  already promised
1a2f0 20 6e 6f 74 20 74 6f 20 77 72 69 74 65 20 74 6f   not to write to
1a300 20 74 68 61 74 0a 2a 2a 20 70 61 67 65 2e 0a 2a   that.** page..*
1a310 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 6c  /.static int rel
1a320 6f 63 61 74 65 50 61 67 65 28 0a 20 20 42 74 53  ocatePage(.  BtS
1a330 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20  hared *pBt,     
1a340 20 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20 2a        /* Btree *
1a350 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 44 62  /.  MemPage *pDb
1a360 50 61 67 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  Page,        /* 
1a370 4f 70 65 6e 20 70 61 67 65 20 74 6f 20 6d 6f 76  Open page to mov
1a380 65 20 2a 2f 0a 20 20 75 38 20 65 54 79 70 65 2c  e */.  u8 eType,
1a390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a3a0 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 27  /* Pointer map '
1a3b0 74 79 70 65 27 20 65 6e 74 72 79 20 66 6f 72 20  type' entry for 
1a3c0 70 44 62 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e  pDbPage */.  Pgn
1a3d0 6f 20 69 50 74 72 50 61 67 65 2c 20 20 20 20 20  o iPtrPage,     
1a3e0 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
1a3f0 20 6d 61 70 20 27 70 61 67 65 2d 6e 6f 27 20 65   map 'page-no' e
1a400 6e 74 72 79 20 66 6f 72 20 70 44 62 50 61 67 65  ntry for pDbPage
1a410 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 46 72 65 65   */.  Pgno iFree
1a420 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 2f  Page,          /
1a430 2a 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20 74  * The location t
1a440 6f 20 6d 6f 76 65 20 70 44 62 50 61 67 65 20 74  o move pDbPage t
1a450 6f 20 2a 2f 0a 20 20 69 6e 74 20 69 73 43 6f 6d  o */.  int isCom
1a460 6d 69 74 20 20 20 20 20 20 20 20 20 20 20 20 20  mit             
1a470 2f 2a 20 69 73 43 6f 6d 6d 69 74 20 66 6c 61 67  /* isCommit flag
1a480 20 70 61 73 73 65 64 20 74 6f 20 73 71 6c 69 74   passed to sqlit
1a490 65 33 50 61 67 65 72 4d 6f 76 65 70 61 67 65 20  e3PagerMovepage 
1a4a0 2a 2f 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20  */.){.  MemPage 
1a4b0 2a 70 50 74 72 50 61 67 65 3b 20 20 20 2f 2a 20  *pPtrPage;   /* 
1a4c0 54 68 65 20 70 61 67 65 20 74 68 61 74 20 63 6f  The page that co
1a4d0 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72  ntains a pointer
1a4e0 20 74 6f 20 70 44 62 50 61 67 65 20 2a 2f 0a 20   to pDbPage */. 
1a4f0 20 50 67 6e 6f 20 69 44 62 50 61 67 65 20 3d 20   Pgno iDbPage = 
1a500 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a 20  pDbPage->pgno;. 
1a510 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
1a520 20 70 42 74 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pBt->pPager;.  
1a530 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72  int rc;..  asser
1a540 74 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  t( eType==PTRMAP
1a550 5f 4f 56 45 52 46 4c 4f 57 32 20 7c 7c 20 65 54  _OVERFLOW2 || eT
1a560 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52  ype==PTRMAP_OVER
1a570 46 4c 4f 57 31 20 7c 7c 20 0a 20 20 20 20 20 20  FLOW1 || .      
1a580 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 42 54  eType==PTRMAP_BT
1a590 52 45 45 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54  REE || eType==PT
1a5a0 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 3b  RMAP_ROOTPAGE );
1a5b0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
1a5c0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
1a5d0 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
1a5e0 73 73 65 72 74 28 20 70 44 62 50 61 67 65 2d 3e  ssert( pDbPage->
1a5f0 70 42 74 3d 3d 70 42 74 20 29 3b 0a 0a 20 20 2f  pBt==pBt );..  /
1a600 2a 20 4d 6f 76 65 20 70 61 67 65 20 69 44 62 50  * Move page iDbP
1a610 61 67 65 20 66 72 6f 6d 20 69 74 73 20 63 75 72  age from its cur
1a620 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 74 6f  rent location to
1a630 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 46 72   page number iFr
1a640 65 65 50 61 67 65 20 2a 2f 0a 20 20 54 52 41 43  eePage */.  TRAC
1a650 45 28 28 22 41 55 54 4f 56 41 43 55 55 4d 3a 20  E(("AUTOVACUUM: 
1a660 4d 6f 76 69 6e 67 20 25 64 20 74 6f 20 66 72 65  Moving %d to fre
1a670 65 20 70 61 67 65 20 25 64 20 28 70 74 72 20 70  e page %d (ptr p
1a680 61 67 65 20 25 64 20 74 79 70 65 20 25 64 29 5c  age %d type %d)\
1a690 6e 22 2c 20 0a 20 20 20 20 20 20 69 44 62 50 61  n", .      iDbPa
1a6a0 67 65 2c 20 69 46 72 65 65 50 61 67 65 2c 20 69  ge, iFreePage, i
1a6b0 50 74 72 50 61 67 65 2c 20 65 54 79 70 65 29 29  PtrPage, eType))
1a6c0 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
1a6d0 50 61 67 65 72 4d 6f 76 65 70 61 67 65 28 70 50  PagerMovepage(pP
1a6e0 61 67 65 72 2c 20 70 44 62 50 61 67 65 2d 3e 70  ager, pDbPage->p
1a6f0 44 62 50 61 67 65 2c 20 69 46 72 65 65 50 61 67  DbPage, iFreePag
1a700 65 2c 20 69 73 43 6f 6d 6d 69 74 29 3b 0a 20 20  e, isCommit);.  
1a710 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1a720 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  K ){.    return 
1a730 72 63 3b 0a 20 20 7d 0a 20 20 70 44 62 50 61 67  rc;.  }.  pDbPag
1a740 65 2d 3e 70 67 6e 6f 20 3d 20 69 46 72 65 65 50  e->pgno = iFreeP
1a750 61 67 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 44  age;..  /* If pD
1a760 62 50 61 67 65 20 77 61 73 20 61 20 62 74 72 65  bPage was a btre
1a770 65 2d 70 61 67 65 2c 20 74 68 65 6e 20 69 74 20  e-page, then it 
1a780 6d 61 79 20 68 61 76 65 20 63 68 69 6c 64 20 70  may have child p
1a790 61 67 65 73 20 61 6e 64 2f 6f 72 20 63 65 6c 6c  ages and/or cell
1a7a0 73 0a 20 20 2a 2a 20 74 68 61 74 20 70 6f 69 6e  s.  ** that poin
1a7b0 74 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61  t to overflow pa
1a7c0 67 65 73 2e 20 54 68 65 20 70 6f 69 6e 74 65 72  ges. The pointer
1a7d0 20 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72   map entries for
1a7e0 20 61 6c 6c 20 74 68 65 73 65 0a 20 20 2a 2a 20   all these.  ** 
1a7f0 70 61 67 65 73 20 6e 65 65 64 20 74 6f 20 62 65  pages need to be
1a800 20 63 68 61 6e 67 65 64 2e 0a 20 20 2a 2a 0a 20   changed..  **. 
1a810 20 2a 2a 20 49 66 20 70 44 62 50 61 67 65 20 69   ** If pDbPage i
1a820 73 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  s an overflow pa
1a830 67 65 2c 20 74 68 65 6e 20 74 68 65 20 66 69 72  ge, then the fir
1a840 73 74 20 34 20 62 79 74 65 73 20 6d 61 79 20 73  st 4 bytes may s
1a850 74 6f 72 65 20 61 0a 20 20 2a 2a 20 70 6f 69 6e  tore a.  ** poin
1a860 74 65 72 20 74 6f 20 61 20 73 75 62 73 65 71 75  ter to a subsequ
1a870 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  ent overflow pag
1a880 65 2e 20 49 66 20 74 68 69 73 20 69 73 20 74 68  e. If this is th
1a890 65 20 63 61 73 65 2c 20 74 68 65 6e 0a 20 20 2a  e case, then.  *
1a8a0 2a 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  * the pointer ma
1a8b0 70 20 6e 65 65 64 73 20 74 6f 20 62 65 20 75 70  p needs to be up
1a8c0 64 61 74 65 64 20 66 6f 72 20 74 68 65 20 73 75  dated for the su
1a8d0 62 73 65 71 75 65 6e 74 20 6f 76 65 72 66 6c 6f  bsequent overflo
1a8e0 77 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69  w page..  */.  i
1a8f0 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  f( eType==PTRMAP
1a900 5f 42 54 52 45 45 20 7c 7c 20 65 54 79 70 65 3d  _BTREE || eType=
1a910 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45  =PTRMAP_ROOTPAGE
1a920 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 65 74   ){.    rc = set
1a930 43 68 69 6c 64 50 74 72 6d 61 70 73 28 70 44 62  ChildPtrmaps(pDb
1a940 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
1a950 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1a960 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1a970 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
1a980 20 20 20 20 50 67 6e 6f 20 6e 65 78 74 4f 76 66      Pgno nextOvf
1a990 6c 20 3d 20 67 65 74 34 62 79 74 65 28 70 44 62  l = get4byte(pDb
1a9a0 50 61 67 65 2d 3e 61 44 61 74 61 29 3b 0a 20 20  Page->aData);.  
1a9b0 20 20 69 66 28 20 6e 65 78 74 4f 76 66 6c 21 3d    if( nextOvfl!=
1a9c0 30 20 29 7b 0a 20 20 20 20 20 20 70 74 72 6d 61  0 ){.      ptrma
1a9d0 70 50 75 74 28 70 42 74 2c 20 6e 65 78 74 4f 76  pPut(pBt, nextOv
1a9e0 66 6c 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52 46  fl, PTRMAP_OVERF
1a9f0 4c 4f 57 32 2c 20 69 46 72 65 65 50 61 67 65 2c  LOW2, iFreePage,
1aa00 20 26 72 63 29 3b 0a 20 20 20 20 20 20 69 66 28   &rc);.      if(
1aa10 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1aa20 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
1aa30 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
1aa40 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 78   }.  }..  /* Fix
1aa50 20 74 68 65 20 64 61 74 61 62 61 73 65 20 70 6f   the database po
1aa60 69 6e 74 65 72 20 6f 6e 20 70 61 67 65 20 69 50  inter on page iP
1aa70 74 72 50 61 67 65 20 74 68 61 74 20 70 6f 69 6e  trPage that poin
1aa80 74 65 64 20 61 74 20 69 44 62 50 61 67 65 20 73  ted at iDbPage s
1aa90 6f 0a 20 20 2a 2a 20 74 68 61 74 20 69 74 20 70  o.  ** that it p
1aaa0 6f 69 6e 74 73 20 61 74 20 69 46 72 65 65 50 61  oints at iFreePa
1aab0 67 65 2e 20 41 6c 73 6f 20 66 69 78 20 74 68 65  ge. Also fix the
1aac0 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74   pointer map ent
1aad0 72 79 20 66 6f 72 0a 20 20 2a 2a 20 69 50 74 72  ry for.  ** iPtr
1aae0 50 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  Page..  */.  if(
1aaf0 20 65 54 79 70 65 21 3d 50 54 52 4d 41 50 5f 52   eType!=PTRMAP_R
1ab00 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20 20 20 72  OOTPAGE ){.    r
1ab10 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65  c = btreeGetPage
1ab20 28 70 42 74 2c 20 69 50 74 72 50 61 67 65 2c 20  (pBt, iPtrPage, 
1ab30 26 70 50 74 72 50 61 67 65 2c 20 30 29 3b 0a 20  &pPtrPage, 0);. 
1ab40 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1ab50 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
1ab60 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
1ab70 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
1ab80 61 67 65 72 57 72 69 74 65 28 70 50 74 72 50 61  agerWrite(pPtrPa
1ab90 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  ge->pDbPage);.  
1aba0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1abb0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 6c  _OK ){.      rel
1abc0 65 61 73 65 50 61 67 65 28 70 50 74 72 50 61 67  easePage(pPtrPag
1abd0 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  e);.      return
1abe0 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72   rc;.    }.    r
1abf0 63 20 3d 20 6d 6f 64 69 66 79 50 61 67 65 50 6f  c = modifyPagePo
1ac00 69 6e 74 65 72 28 70 50 74 72 50 61 67 65 2c 20  inter(pPtrPage, 
1ac10 69 44 62 50 61 67 65 2c 20 69 46 72 65 65 50 61  iDbPage, iFreePa
1ac20 67 65 2c 20 65 54 79 70 65 29 3b 0a 20 20 20 20  ge, eType);.    
1ac30 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 74 72  releasePage(pPtr
1ac40 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
1ac50 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1ac60 20 20 20 20 20 20 70 74 72 6d 61 70 50 75 74 28        ptrmapPut(
1ac70 70 42 74 2c 20 69 46 72 65 65 50 61 67 65 2c 20  pBt, iFreePage, 
1ac80 65 54 79 70 65 2c 20 69 50 74 72 50 61 67 65 2c  eType, iPtrPage,
1ac90 20 26 72 63 29 3b 0a 20 20 20 20 7d 0a 20 20 7d   &rc);.    }.  }
1aca0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1acb0 0a 2f 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c  ./* Forward decl
1acc0 61 72 61 74 69 6f 6e 20 72 65 71 75 69 72 65 64  aration required
1acd0 20 62 79 20 69 6e 63 72 56 61 63 75 75 6d 53 74   by incrVacuumSt
1ace0 65 70 28 29 2e 20 2a 2f 0a 73 74 61 74 69 63 20  ep(). */.static 
1acf0 69 6e 74 20 61 6c 6c 6f 63 61 74 65 42 74 72 65  int allocateBtre
1ad00 65 50 61 67 65 28 42 74 53 68 61 72 65 64 20 2a  ePage(BtShared *
1ad10 2c 20 4d 65 6d 50 61 67 65 20 2a 2a 2c 20 50 67  , MemPage **, Pg
1ad20 6e 6f 20 2a 2c 20 50 67 6e 6f 2c 20 75 38 29 3b  no *, Pgno, u8);
1ad30 0a 0a 2f 2a 0a 2a 2a 20 50 65 72 66 6f 72 6d 20  ../*.** Perform 
1ad40 61 20 73 69 6e 67 6c 65 20 73 74 65 70 20 6f 66  a single step of
1ad50 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 2d   an incremental-
1ad60 76 61 63 75 75 6d 2e 20 49 66 20 73 75 63 63 65  vacuum. If succe
1ad70 73 73 66 75 6c 2c 20 72 65 74 75 72 6e 0a 2a 2a  ssful, return.**
1ad80 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66 20 74   SQLITE_OK. If t
1ad90 68 65 72 65 20 69 73 20 6e 6f 20 77 6f 72 6b 20  here is no work 
1ada0 74 6f 20 64 6f 20 28 61 6e 64 20 74 68 65 72 65  to do (and there
1adb0 66 6f 72 65 20 6e 6f 20 70 6f 69 6e 74 20 69 6e  fore no point in
1adc0 20 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 74 68 69   .** calling thi
1add0 73 20 66 75 6e 63 74 69 6f 6e 20 61 67 61 69 6e  s function again
1ade0 29 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ), return SQLITE
1adf0 5f 44 4f 4e 45 2e 20 4f 72 2c 20 69 66 20 61 6e  _DONE. Or, if an
1ae00 20 65 72 72 6f 72 20 0a 2a 2a 20 6f 63 63 75 72   error .** occur
1ae10 73 2c 20 72 65 74 75 72 6e 20 73 6f 6d 65 20 6f  s, return some o
1ae20 74 68 65 72 20 65 72 72 6f 72 20 63 6f 64 65 2e  ther error code.
1ae30 0a 2a 2a 0a 2a 2a 20 4d 6f 72 65 20 73 70 65 63  .**.** More spec
1ae40 69 66 69 63 61 6c 6c 79 2c 20 74 68 69 73 20 66  ifically, this f
1ae50 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73  unction attempts
1ae60 20 74 6f 20 72 65 2d 6f 72 67 61 6e 69 7a 65 20   to re-organize 
1ae70 74 68 65 20 64 61 74 61 62 61 73 65 20 73 6f 20  the database so 
1ae80 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 6c 61 73  .** that the las
1ae90 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 66 69  t page of the fi
1aea0 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20  le currently in 
1aeb0 75 73 65 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72  use is no longer
1aec0 20 69 6e 20 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 50   in use..**.** P
1aed0 61 72 61 6d 65 74 65 72 20 6e 46 69 6e 20 69 73  arameter nFin is
1aee0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
1aef0 61 67 65 73 20 74 68 61 74 20 74 68 69 73 20 64  ages that this d
1af00 61 74 61 62 61 73 65 20 77 6f 75 6c 64 20 63 6f  atabase would co
1af10 6e 74 61 69 6e 0a 2a 2a 20 77 65 72 65 20 74 68  ntain.** were th
1af20 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c  is function call
1af30 65 64 20 75 6e 74 69 6c 20 69 74 20 72 65 74 75  ed until it retu
1af40 72 6e 73 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e  rns SQLITE_DONE.
1af50 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 62 43  .**.** If the bC
1af60 6f 6d 6d 69 74 20 70 61 72 61 6d 65 74 65 72 20  ommit parameter 
1af70 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 69  is non-zero, thi
1af80 73 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d  s function assum
1af90 65 73 20 74 68 61 74 20 74 68 65 20 0a 2a 2a 20  es that the .** 
1afa0 63 61 6c 6c 65 72 20 77 69 6c 6c 20 6b 65 65 70  caller will keep
1afb0 20 63 61 6c 6c 69 6e 67 20 69 6e 63 72 56 61 63   calling incrVac
1afc0 75 75 6d 53 74 65 70 28 29 20 75 6e 74 69 6c 20  uumStep() until 
1afd0 69 74 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  it returns SQLIT
1afe0 45 5f 44 4f 4e 45 20 0a 2a 2a 20 6f 72 20 61 6e  E_DONE .** or an
1aff0 20 65 72 72 6f 72 2e 20 62 43 6f 6d 6d 69 74 20   error. bCommit 
1b000 69 73 20 70 61 73 73 65 64 20 74 72 75 65 20 66  is passed true f
1b010 6f 72 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75  or an auto-vacuu
1b020 6d 2d 6f 6e 2d 63 6f 6d 6d 69 74 20 0a 2a 2a 20  m-on-commit .** 
1b030 6f 70 65 72 61 74 69 6f 6e 2c 20 6f 72 20 66 61  operation, or fa
1b040 6c 73 65 20 66 6f 72 20 61 6e 20 69 6e 63 72 65  lse for an incre
1b050 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 2e 0a 2a  mental vacuum..*
1b060 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 63  /.static int inc
1b070 72 56 61 63 75 75 6d 53 74 65 70 28 42 74 53 68  rVacuumStep(BtSh
1b080 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20  ared *pBt, Pgno 
1b090 6e 46 69 6e 2c 20 50 67 6e 6f 20 69 4c 61 73 74  nFin, Pgno iLast
1b0a0 50 67 2c 20 69 6e 74 20 62 43 6f 6d 6d 69 74 29  Pg, int bCommit)
1b0b0 7b 0a 20 20 50 67 6e 6f 20 6e 46 72 65 65 4c 69  {.  Pgno nFreeLi
1b0c0 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  st;           /*
1b0d0 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
1b0e0 20 73 74 69 6c 6c 20 6f 6e 20 74 68 65 20 66 72   still on the fr
1b0f0 65 65 2d 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74  ee-list */.  int
1b100 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   rc;..  assert( 
1b110 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
1b120 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
1b130 3b 0a 20 20 61 73 73 65 72 74 28 20 69 4c 61 73  ;.  assert( iLas
1b140 74 50 67 3e 6e 46 69 6e 20 29 3b 0a 0a 20 20 69  tPg>nFin );..  i
1b150 66 28 20 21 50 54 52 4d 41 50 5f 49 53 50 41 47  f( !PTRMAP_ISPAG
1b160 45 28 70 42 74 2c 20 69 4c 61 73 74 50 67 29 20  E(pBt, iLastPg) 
1b170 26 26 20 69 4c 61 73 74 50 67 21 3d 50 45 4e 44  && iLastPg!=PEND
1b180 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
1b190 74 29 20 29 7b 0a 20 20 20 20 75 38 20 65 54 79  t) ){.    u8 eTy
1b1a0 70 65 3b 0a 20 20 20 20 50 67 6e 6f 20 69 50 74  pe;.    Pgno iPt
1b1b0 72 50 61 67 65 3b 0a 0a 20 20 20 20 6e 46 72 65  rPage;..    nFre
1b1c0 65 4c 69 73 74 20 3d 20 67 65 74 34 62 79 74 65  eList = get4byte
1b1d0 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  (&pBt->pPage1->a
1b1e0 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 20 20 69  Data[36]);.    i
1b1f0 66 28 20 6e 46 72 65 65 4c 69 73 74 3d 3d 30 20  f( nFreeList==0 
1b200 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
1b210 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20  SQLITE_DONE;.   
1b220 20 7d 0a 0a 20 20 20 20 72 63 20 3d 20 70 74 72   }..    rc = ptr
1b230 6d 61 70 47 65 74 28 70 42 74 2c 20 69 4c 61 73  mapGet(pBt, iLas
1b240 74 50 67 2c 20 26 65 54 79 70 65 2c 20 26 69 50  tPg, &eType, &iP
1b250 74 72 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  trPage);.    if(
1b260 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1b270 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
1b280 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  c;.    }.    if(
1b290 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52   eType==PTRMAP_R
1b2a0 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20 20 20 20  OOTPAGE ){.     
1b2b0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
1b2c0 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
1b2d0 20 7d 0a 0a 20 20 20 20 69 66 28 20 65 54 79 70   }..    if( eTyp
1b2e0 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45 50 41  e==PTRMAP_FREEPA
1b2f0 47 45 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  GE ){.      if( 
1b300 62 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b 0a 20 20  bCommit==0 ){.  
1b310 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20        /* Remove 
1b320 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20 74 68  the page from th
1b330 65 20 66 69 6c 65 73 20 66 72 65 65 2d 6c 69 73  e files free-lis
1b340 74 2e 20 54 68 69 73 20 69 73 20 6e 6f 74 20 72  t. This is not r
1b350 65 71 75 69 72 65 64 0a 20 20 20 20 20 20 20 20  equired.        
1b360 2a 2a 20 69 66 20 62 43 6f 6d 6d 69 74 20 69 73  ** if bCommit is
1b370 20 6e 6f 6e 2d 7a 65 72 6f 2e 20 49 6e 20 74 68   non-zero. In th
1b380 61 74 20 63 61 73 65 2c 20 74 68 65 20 66 72 65  at case, the fre
1b390 65 2d 6c 69 73 74 20 77 69 6c 6c 20 62 65 0a 20  e-list will be. 
1b3a0 20 20 20 20 20 20 20 2a 2a 20 74 72 75 6e 63 61         ** trunca
1b3b0 74 65 64 20 74 6f 20 7a 65 72 6f 20 61 66 74 65  ted to zero afte
1b3c0 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  r this function 
1b3d0 72 65 74 75 72 6e 73 2c 20 73 6f 20 69 74 20 64  returns, so it d
1b3e0 6f 65 73 6e 27 74 20 0a 20 20 20 20 20 20 20 20  oesn't .        
1b3f0 2a 2a 20 6d 61 74 74 65 72 20 69 66 20 69 74 20  ** matter if it 
1b400 73 74 69 6c 6c 20 63 6f 6e 74 61 69 6e 73 20 73  still contains s
1b410 6f 6d 65 20 67 61 72 62 61 67 65 20 65 6e 74 72  ome garbage entr
1b420 69 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ies..        */.
1b430 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69 46 72          Pgno iFr
1b440 65 65 50 67 3b 0a 20 20 20 20 20 20 20 20 4d 65  eePg;.        Me
1b450 6d 50 61 67 65 20 2a 70 46 72 65 65 50 67 3b 0a  mPage *pFreePg;.
1b460 20 20 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c          rc = all
1b470 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70  ocateBtreePage(p
1b480 42 74 2c 20 26 70 46 72 65 65 50 67 2c 20 26 69  Bt, &pFreePg, &i
1b490 46 72 65 65 50 67 2c 20 69 4c 61 73 74 50 67 2c  FreePg, iLastPg,
1b4a0 20 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 29 3b   BTALLOC_EXACT);
1b4b0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
1b4c0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1b4d0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
1b4e0 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  c;.        }.   
1b4f0 20 20 20 20 20 61 73 73 65 72 74 28 20 69 46 72       assert( iFr
1b500 65 65 50 67 3d 3d 69 4c 61 73 74 50 67 20 29 3b  eePg==iLastPg );
1b510 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65  .        release
1b520 50 61 67 65 28 70 46 72 65 65 50 67 29 3b 0a 20  Page(pFreePg);. 
1b530 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 65 6c 73       }.    } els
1b540 65 20 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 69  e {.      Pgno i
1b550 46 72 65 65 50 67 3b 20 20 20 20 20 20 20 20 20  FreePg;         
1b560 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
1b570 66 72 65 65 20 70 61 67 65 20 74 6f 20 6d 6f 76  free page to mov
1b580 65 20 70 4c 61 73 74 50 67 20 74 6f 20 2a 2f 0a  e pLastPg to */.
1b590 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70        MemPage *p
1b5a0 4c 61 73 74 50 67 3b 0a 20 20 20 20 20 20 75 38  LastPg;.      u8
1b5b0 20 65 4d 6f 64 65 20 3d 20 42 54 41 4c 4c 4f 43   eMode = BTALLOC
1b5c0 5f 41 4e 59 3b 20 20 20 2f 2a 20 4d 6f 64 65 20  _ANY;   /* Mode 
1b5d0 70 61 72 61 6d 65 74 65 72 20 66 6f 72 20 61 6c  parameter for al
1b5e0 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28  locateBtreePage(
1b5f0 29 20 2a 2f 0a 20 20 20 20 20 20 50 67 6e 6f 20  ) */.      Pgno 
1b600 69 4e 65 61 72 20 3d 20 30 3b 20 20 20 20 20 20  iNear = 0;      
1b610 20 20 20 20 20 2f 2a 20 6e 65 61 72 62 79 20 70       /* nearby p
1b620 61 72 61 6d 65 74 65 72 20 66 6f 72 20 61 6c 6c  arameter for all
1b630 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28 29  ocateBtreePage()
1b640 20 2a 2f 0a 0a 20 20 20 20 20 20 72 63 20 3d 20   */..      rc = 
1b650 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  btreeGetPage(pBt
1b660 2c 20 69 4c 61 73 74 50 67 2c 20 26 70 4c 61 73  , iLastPg, &pLas
1b670 74 50 67 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  tPg, 0);.      i
1b680 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1b690 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
1b6a0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a  rn rc;.      }..
1b6b0 20 20 20 20 20 20 2f 2a 20 49 66 20 62 43 6f 6d        /* If bCom
1b6c0 6d 69 74 20 69 73 20 7a 65 72 6f 2c 20 74 68 69  mit is zero, thi
1b6d0 73 20 6c 6f 6f 70 20 72 75 6e 73 20 65 78 61 63  s loop runs exac
1b6e0 74 6c 79 20 6f 6e 63 65 20 61 6e 64 20 70 61 67  tly once and pag
1b6f0 65 20 70 4c 61 73 74 50 67 0a 20 20 20 20 20 20  e pLastPg.      
1b700 2a 2a 20 69 73 20 73 77 61 70 70 65 64 20 77 69  ** is swapped wi
1b710 74 68 20 74 68 65 20 66 69 72 73 74 20 66 72 65  th the first fre
1b720 65 20 70 61 67 65 20 70 75 6c 6c 65 64 20 6f 66  e page pulled of
1b730 66 20 74 68 65 20 66 72 65 65 20 6c 69 73 74 2e  f the free list.
1b740 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
1b750 2a 2a 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20  ** On the other 
1b760 68 61 6e 64 2c 20 69 66 20 62 43 6f 6d 6d 69 74  hand, if bCommit
1b770 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
1b780 20 7a 65 72 6f 2c 20 74 68 65 6e 20 6b 65 65 70   zero, then keep
1b790 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 6f 70 69 6e  .      ** loopin
1b7a0 67 20 75 6e 74 69 6c 20 61 20 66 72 65 65 2d 70  g until a free-p
1b7b0 61 67 65 20 6c 6f 63 61 74 65 64 20 77 69 74 68  age located with
1b7c0 69 6e 20 74 68 65 20 66 69 72 73 74 20 6e 46 69  in the first nFi
1b7d0 6e 20 70 61 67 65 73 0a 20 20 20 20 20 20 2a 2a  n pages.      **
1b7e0 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 73 20   of the file is 
1b7f0 66 6f 75 6e 64 2e 0a 20 20 20 20 20 20 2a 2f 0a  found..      */.
1b800 20 20 20 20 20 20 69 66 28 20 62 43 6f 6d 6d 69        if( bCommi
1b810 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  t==0 ){.        
1b820 65 4d 6f 64 65 20 3d 20 42 54 41 4c 4c 4f 43 5f  eMode = BTALLOC_
1b830 4c 45 3b 0a 20 20 20 20 20 20 20 20 69 4e 65 61  LE;.        iNea
1b840 72 20 3d 20 6e 46 69 6e 3b 0a 20 20 20 20 20 20  r = nFin;.      
1b850 7d 0a 20 20 20 20 20 20 64 6f 20 7b 0a 20 20 20  }.      do {.   
1b860 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 46       MemPage *pF
1b870 72 65 65 50 67 3b 0a 20 20 20 20 20 20 20 20 72  reePg;.        r
1b880 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65  c = allocateBtre
1b890 65 50 61 67 65 28 70 42 74 2c 20 26 70 46 72 65  ePage(pBt, &pFre
1b8a0 65 50 67 2c 20 26 69 46 72 65 65 50 67 2c 20 69  ePg, &iFreePg, i
1b8b0 4e 65 61 72 2c 20 65 4d 6f 64 65 29 3b 0a 20 20  Near, eMode);.  
1b8c0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
1b8d0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1b8e0 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
1b8f0 28 70 4c 61 73 74 50 67 29 3b 0a 20 20 20 20 20  (pLastPg);.     
1b900 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
1b910 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1b920 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 46    releasePage(pF
1b930 72 65 65 50 67 29 3b 0a 20 20 20 20 20 20 7d 77  reePg);.      }w
1b940 68 69 6c 65 28 20 62 43 6f 6d 6d 69 74 20 26 26  hile( bCommit &&
1b950 20 69 46 72 65 65 50 67 3e 6e 46 69 6e 20 29 3b   iFreePg>nFin );
1b960 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69  .      assert( i
1b970 46 72 65 65 50 67 3c 69 4c 61 73 74 50 67 20 29  FreePg<iLastPg )
1b980 3b 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20 72  ;.      .      r
1b990 63 20 3d 20 72 65 6c 6f 63 61 74 65 50 61 67 65  c = relocatePage
1b9a0 28 70 42 74 2c 20 70 4c 61 73 74 50 67 2c 20 65  (pBt, pLastPg, e
1b9b0 54 79 70 65 2c 20 69 50 74 72 50 61 67 65 2c 20  Type, iPtrPage, 
1b9c0 69 46 72 65 65 50 67 2c 20 62 43 6f 6d 6d 69 74  iFreePg, bCommit
1b9d0 29 3b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  );.      release
1b9e0 50 61 67 65 28 70 4c 61 73 74 50 67 29 3b 0a 20  Page(pLastPg);. 
1b9f0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
1ba00 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1ba10 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
1ba20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
1ba30 20 20 69 66 28 20 62 43 6f 6d 6d 69 74 3d 3d 30    if( bCommit==0
1ba40 20 29 7b 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20   ){.    do {.   
1ba50 20 20 20 69 4c 61 73 74 50 67 2d 2d 3b 0a 20 20     iLastPg--;.  
1ba60 20 20 7d 77 68 69 6c 65 28 20 69 4c 61 73 74 50    }while( iLastP
1ba70 67 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  g==PENDING_BYTE_
1ba80 50 41 47 45 28 70 42 74 29 20 7c 7c 20 50 54 52  PAGE(pBt) || PTR
1ba90 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20  MAP_ISPAGE(pBt, 
1baa0 69 4c 61 73 74 50 67 29 20 29 3b 0a 20 20 20 20  iLastPg) );.    
1bab0 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65  pBt->bDoTruncate
1bac0 20 3d 20 31 3b 0a 20 20 20 20 70 42 74 2d 3e 6e   = 1;.    pBt->n
1bad0 50 61 67 65 20 3d 20 69 4c 61 73 74 50 67 3b 0a  Page = iLastPg;.
1bae0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
1baf0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
1bb00 20 54 68 65 20 64 61 74 61 62 61 73 65 20 6f 70   The database op
1bb10 65 6e 65 64 20 62 79 20 74 68 65 20 66 69 72 73  ened by the firs
1bb20 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 6e  t argument is an
1bb30 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74   auto-vacuum dat
1bb40 61 62 61 73 65 0a 2a 2a 20 6e 4f 72 69 67 20 70  abase.** nOrig p
1bb50 61 67 65 73 20 69 6e 20 73 69 7a 65 20 63 6f 6e  ages in size con
1bb60 74 61 69 6e 69 6e 67 20 6e 46 72 65 65 20 66 72  taining nFree fr
1bb70 65 65 20 70 61 67 65 73 2e 20 52 65 74 75 72 6e  ee pages. Return
1bb80 20 74 68 65 20 65 78 70 65 63 74 65 64 20 0a 2a   the expected .*
1bb90 2a 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61  * size of the da
1bba0 74 61 62 61 73 65 20 69 6e 20 70 61 67 65 73 20  tabase in pages 
1bbb0 66 6f 6c 6c 6f 77 69 6e 67 20 61 6e 20 61 75 74  following an aut
1bbc0 6f 2d 76 61 63 75 75 6d 20 6f 70 65 72 61 74 69  o-vacuum operati
1bbd0 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67  on..*/.static Pg
1bbe0 6e 6f 20 66 69 6e 61 6c 44 62 53 69 7a 65 28 42  no finalDbSize(B
1bbf0 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67  tShared *pBt, Pg
1bc00 6e 6f 20 6e 4f 72 69 67 2c 20 50 67 6e 6f 20 6e  no nOrig, Pgno n
1bc10 46 72 65 65 29 7b 0a 20 20 69 6e 74 20 6e 45 6e  Free){.  int nEn
1bc20 74 72 79 3b 20 20 20 20 20 20 20 20 20 20 20 20  try;            
1bc30 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1bc40 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 6f 6e  er of entries on
1bc50 20 6f 6e 65 20 70 74 72 6d 61 70 20 70 61 67 65   one ptrmap page
1bc60 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 50 74 72 6d   */.  Pgno nPtrm
1bc70 61 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ap;             
1bc80 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1bc90 6f 66 20 50 74 72 4d 61 70 20 70 61 67 65 73 20  of PtrMap pages 
1bca0 74 6f 20 62 65 20 66 72 65 65 64 20 2a 2f 0a 20  to be freed */. 
1bcb0 20 50 67 6e 6f 20 6e 46 69 6e 3b 20 20 20 20 20   Pgno nFin;     
1bcc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bcd0 20 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c 75 65   /* Return value
1bce0 20 2a 2f 0a 0a 20 20 6e 45 6e 74 72 79 20 3d 20   */..  nEntry = 
1bcf0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f  pBt->usableSize/
1bd00 35 3b 0a 20 20 6e 50 74 72 6d 61 70 20 3d 20 28  5;.  nPtrmap = (
1bd10 6e 46 72 65 65 2d 6e 4f 72 69 67 2b 50 54 52 4d  nFree-nOrig+PTRM
1bd20 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 6e  AP_PAGENO(pBt, n
1bd30 4f 72 69 67 29 2b 6e 45 6e 74 72 79 29 2f 6e 45  Orig)+nEntry)/nE
1bd40 6e 74 72 79 3b 0a 20 20 6e 46 69 6e 20 3d 20 6e  ntry;.  nFin = n
1bd50 4f 72 69 67 20 2d 20 6e 46 72 65 65 20 2d 20 6e  Orig - nFree - n
1bd60 50 74 72 6d 61 70 3b 0a 20 20 69 66 28 20 6e 4f  Ptrmap;.  if( nO
1bd70 72 69 67 3e 50 45 4e 44 49 4e 47 5f 42 59 54 45  rig>PENDING_BYTE
1bd80 5f 50 41 47 45 28 70 42 74 29 20 26 26 20 6e 46  _PAGE(pBt) && nF
1bd90 69 6e 3c 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  in<PENDING_BYTE_
1bda0 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20  PAGE(pBt) ){.   
1bdb0 20 6e 46 69 6e 2d 2d 3b 0a 20 20 7d 0a 20 20 77   nFin--;.  }.  w
1bdc0 68 69 6c 65 28 20 50 54 52 4d 41 50 5f 49 53 50  hile( PTRMAP_ISP
1bdd0 41 47 45 28 70 42 74 2c 20 6e 46 69 6e 29 20 7c  AGE(pBt, nFin) |
1bde0 7c 20 6e 46 69 6e 3d 3d 50 45 4e 44 49 4e 47 5f  | nFin==PENDING_
1bdf0 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
1be00 7b 0a 20 20 20 20 6e 46 69 6e 2d 2d 3b 0a 20 20  {.    nFin--;.  
1be10 7d 0a 0a 20 20 72 65 74 75 72 6e 20 6e 46 69 6e  }..  return nFin
1be20 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 77 72 69  ;.}../*.** A wri
1be30 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d  te-transaction m
1be40 75 73 74 20 62 65 20 6f 70 65 6e 65 64 20 62 65  ust be opened be
1be50 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 74 68 69  fore calling thi
1be60 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 20 49  s function..** I
1be70 74 20 70 65 72 66 6f 72 6d 73 20 61 20 73 69 6e  t performs a sin
1be80 67 6c 65 20 75 6e 69 74 20 6f 66 20 77 6f 72 6b  gle unit of work
1be90 20 74 6f 77 61 72 64 73 20 61 6e 20 69 6e 63 72   towards an incr
1bea0 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 2e 0a  emental vacuum..
1beb0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e 63  **.** If the inc
1bec0 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 20  remental vacuum 
1bed0 69 73 20 66 69 6e 69 73 68 65 64 20 61 66 74 65  is finished afte
1bee0 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  r this function 
1bef0 68 61 73 20 72 75 6e 2c 0a 2a 2a 20 53 51 4c 49  has run,.** SQLI
1bf00 54 45 5f 44 4f 4e 45 20 69 73 20 72 65 74 75 72  TE_DONE is retur
1bf10 6e 65 64 2e 20 49 66 20 69 74 20 69 73 20 6e 6f  ned. If it is no
1bf20 74 20 66 69 6e 69 73 68 65 64 2c 20 62 75 74 20  t finished, but 
1bf30 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65  no error occurre
1bf40 64 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  d,.** SQLITE_OK 
1bf50 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68  is returned. Oth
1bf60 65 72 77 69 73 65 20 61 6e 20 53 51 4c 69 74 65  erwise an SQLite
1bf70 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 0a 2a 2f   error code. .*/
1bf80 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
1bf90 65 49 6e 63 72 56 61 63 75 75 6d 28 42 74 72 65  eIncrVacuum(Btre
1bfa0 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b  e *p){.  int rc;
1bfb0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
1bfc0 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 73 71   = p->pBt;..  sq
1bfd0 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
1bfe0 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42  p);.  assert( pB
1bff0 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
1c000 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 26 26  ==TRANS_WRITE &&
1c010 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41   p->inTrans==TRA
1c020 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 69 66  NS_WRITE );.  if
1c030 28 20 21 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  ( !pBt->autoVacu
1c040 75 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  um ){.    rc = S
1c050 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 65  QLITE_DONE;.  }e
1c060 6c 73 65 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 4f  lse{.    Pgno nO
1c070 72 69 67 20 3d 20 62 74 72 65 65 50 61 67 65 63  rig = btreePagec
1c080 6f 75 6e 74 28 70 42 74 29 3b 0a 20 20 20 20 50  ount(pBt);.    P
1c090 67 6e 6f 20 6e 46 72 65 65 20 3d 20 67 65 74 34  gno nFree = get4
1c0a0 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65  byte(&pBt->pPage
1c0b0 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20  1->aData[36]);. 
1c0c0 20 20 20 50 67 6e 6f 20 6e 46 69 6e 20 3d 20 66     Pgno nFin = f
1c0d0 69 6e 61 6c 44 62 53 69 7a 65 28 70 42 74 2c 20  inalDbSize(pBt, 
1c0e0 6e 4f 72 69 67 2c 20 6e 46 72 65 65 29 3b 0a 0a  nOrig, nFree);..
1c0f0 20 20 20 20 69 66 28 20 6e 4f 72 69 67 3c 6e 46      if( nOrig<nF
1c100 69 6e 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  in ){.      rc =
1c110 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
1c120 42 4b 50 54 3b 0a 20 20 20 20 7d 65 6c 73 65 20  BKPT;.    }else 
1c130 69 66 28 20 6e 46 72 65 65 3e 30 20 29 7b 0a 20  if( nFree>0 ){. 
1c140 20 20 20 20 20 72 63 20 3d 20 73 61 76 65 41 6c       rc = saveAl
1c150 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20 30 2c  lCursors(pBt, 0,
1c160 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72   0);.      if( r
1c170 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1c180 20 20 20 20 20 20 20 20 69 6e 76 61 6c 69 64 61          invalida
1c190 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63  teAllOverflowCac
1c1a0 68 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20 20  he(pBt);.       
1c1b0 20 72 63 20 3d 20 69 6e 63 72 56 61 63 75 75 6d   rc = incrVacuum
1c1c0 53 74 65 70 28 70 42 74 2c 20 6e 46 69 6e 2c 20  Step(pBt, nFin, 
1c1d0 6e 4f 72 69 67 2c 20 30 29 3b 0a 20 20 20 20 20  nOrig, 0);.     
1c1e0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d   }.      if( rc=
1c1f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1c200 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1c210 65 33 50 61 67 65 72 57 72 69 74 65 28 70 42 74  e3PagerWrite(pBt
1c220 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67  ->pPage1->pDbPag
1c230 65 29 3b 0a 20 20 20 20 20 20 20 20 70 75 74 34  e);.        put4
1c240 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65  byte(&pBt->pPage
1c250 31 2d 3e 61 44 61 74 61 5b 32 38 5d 2c 20 70 42  1->aData[28], pB
1c260 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20 20  t->nPage);.     
1c270 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
1c280 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1c290 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  DONE;.    }.  }.
1c2a0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
1c2b0 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
1c2c0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
1c2d0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
1c2e0 6c 6c 65 64 20 70 72 69 6f 72 20 74 6f 20 73 71  lled prior to sq
1c2f0 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74  lite3PagerCommit
1c300 20 77 68 65 6e 20 61 20 74 72 61 6e 73 61 63 74   when a transact
1c310 69 6f 6e 0a 2a 2a 20 69 73 20 63 6f 6d 6d 69 74  ion.** is commit
1c320 74 65 64 20 66 6f 72 20 61 6e 20 61 75 74 6f 2d  ted for an auto-
1c330 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 2e  vacuum database.
1c340 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45  .**.** If SQLITE
1c350 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2c  _OK is returned,
1c360 20 74 68 65 6e 20 2a 70 6e 54 72 75 6e 63 20 69   then *pnTrunc i
1c370 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d  s set to the num
1c380 62 65 72 20 6f 66 20 70 61 67 65 73 0a 2a 2a 20  ber of pages.** 
1c390 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1c3a0 65 20 73 68 6f 75 6c 64 20 62 65 20 74 72 75 6e  e should be trun
1c3b0 63 61 74 65 64 20 74 6f 20 64 75 72 69 6e 67 20  cated to during 
1c3c0 74 68 65 20 63 6f 6d 6d 69 74 20 70 72 6f 63 65  the commit proce
1c3d0 73 73 2e 20 0a 2a 2a 20 69 2e 65 2e 20 74 68 65  ss. .** i.e. the
1c3e0 20 64 61 74 61 62 61 73 65 20 68 61 73 20 62 65   database has be
1c3f0 65 6e 20 72 65 6f 72 67 61 6e 69 7a 65 64 20 73  en reorganized s
1c400 6f 20 74 68 61 74 20 6f 6e 6c 79 20 74 68 65 20  o that only the 
1c410 66 69 72 73 74 20 2a 70 6e 54 72 75 6e 63 0a 2a  first *pnTrunc.*
1c420 2a 20 70 61 67 65 73 20 61 72 65 20 69 6e 20 75  * pages are in u
1c430 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  se..*/.static in
1c440 74 20 61 75 74 6f 56 61 63 75 75 6d 43 6f 6d 6d  t autoVacuumComm
1c450 69 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  it(BtShared *pBt
1c460 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
1c470 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 61 67 65 72  LITE_OK;.  Pager
1c480 20 2a 70 50 61 67 65 72 20 3d 20 70 42 74 2d 3e   *pPager = pBt->
1c490 70 50 61 67 65 72 3b 0a 20 20 56 56 41 5f 4f 4e  pPager;.  VVA_ON
1c4a0 4c 59 28 20 69 6e 74 20 6e 52 65 66 20 3d 20 73  LY( int nRef = s
1c4b0 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 63 6f  qlite3PagerRefco
1c4c0 75 6e 74 28 70 50 61 67 65 72 29 20 29 3b 0a 0a  unt(pPager) );..
1c4d0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
1c4e0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
1c4f0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 6e  ->mutex) );.  in
1c500 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72 66  validateAllOverf
1c510 6c 6f 77 43 61 63 68 65 28 70 42 74 29 3b 0a 20  lowCache(pBt);. 
1c520 20 61 73 73 65 72 74 28 70 42 74 2d 3e 61 75 74   assert(pBt->aut
1c530 6f 56 61 63 75 75 6d 29 3b 0a 20 20 69 66 28 20  oVacuum);.  if( 
1c540 21 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d  !pBt->incrVacuum
1c550 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 46 69   ){.    Pgno nFi
1c560 6e 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  n;         /* Nu
1c570 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
1c580 20 64 61 74 61 62 61 73 65 20 61 66 74 65 72 20   database after 
1c590 61 75 74 6f 76 61 63 75 75 6d 69 6e 67 20 2a 2f  autovacuuming */
1c5a0 0a 20 20 20 20 50 67 6e 6f 20 6e 46 72 65 65 3b  .    Pgno nFree;
1c5b0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1c5c0 72 20 6f 66 20 70 61 67 65 73 20 6f 6e 20 74 68  r of pages on th
1c5d0 65 20 66 72 65 65 6c 69 73 74 20 69 6e 69 74 69  e freelist initi
1c5e0 61 6c 6c 79 20 2a 2f 0a 20 20 20 20 50 67 6e 6f  ally */.    Pgno
1c5f0 20 69 46 72 65 65 3b 20 20 20 20 20 20 20 20 2f   iFree;        /
1c600 2a 20 54 68 65 20 6e 65 78 74 20 70 61 67 65 20  * The next page 
1c610 74 6f 20 62 65 20 66 72 65 65 64 20 2a 2f 0a 20  to be freed */. 
1c620 20 20 20 50 67 6e 6f 20 6e 4f 72 69 67 3b 20 20     Pgno nOrig;  
1c630 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
1c640 65 20 73 69 7a 65 20 62 65 66 6f 72 65 20 66 72  e size before fr
1c650 65 65 69 6e 67 20 2a 2f 0a 0a 20 20 20 20 6e 4f  eeing */..    nO
1c660 72 69 67 20 3d 20 62 74 72 65 65 50 61 67 65 63  rig = btreePagec
1c670 6f 75 6e 74 28 70 42 74 29 3b 0a 20 20 20 20 69  ount(pBt);.    i
1c680 66 28 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45  f( PTRMAP_ISPAGE
1c690 28 70 42 74 2c 20 6e 4f 72 69 67 29 20 7c 7c 20  (pBt, nOrig) || 
1c6a0 6e 4f 72 69 67 3d 3d 50 45 4e 44 49 4e 47 5f 42  nOrig==PENDING_B
1c6b0 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b  YTE_PAGE(pBt) ){
1c6c0 0a 20 20 20 20 20 20 2f 2a 20 49 74 20 69 73 20  .      /* It is 
1c6d0 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20  not possible to 
1c6e0 63 72 65 61 74 65 20 61 20 64 61 74 61 62 61 73  create a databas
1c6f0 65 20 66 6f 72 20 77 68 69 63 68 20 74 68 65 20  e for which the 
1c700 66 69 6e 61 6c 20 70 61 67 65 0a 20 20 20 20 20  final page.     
1c710 20 2a 2a 20 69 73 20 65 69 74 68 65 72 20 61 20   ** is either a 
1c720 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65  pointer-map page
1c730 20 6f 72 20 74 68 65 20 70 65 6e 64 69 6e 67 2d   or the pending-
1c740 62 79 74 65 20 70 61 67 65 2e 20 49 66 20 6f 6e  byte page. If on
1c750 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 65 6e  e.      ** is en
1c760 63 6f 75 6e 74 65 72 65 64 2c 20 74 68 69 73 20  countered, this 
1c770 69 6e 64 69 63 61 74 65 73 20 63 6f 72 72 75 70  indicates corrup
1c780 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  tion..      */. 
1c790 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
1c7a0 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
1c7b0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6e 46 72 65  .    }..    nFre
1c7c0 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 42  e = get4byte(&pB
1c7d0 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61  t->pPage1->aData
1c7e0 5b 33 36 5d 29 3b 0a 20 20 20 20 6e 46 69 6e 20  [36]);.    nFin 
1c7f0 3d 20 66 69 6e 61 6c 44 62 53 69 7a 65 28 70 42  = finalDbSize(pB
1c800 74 2c 20 6e 4f 72 69 67 2c 20 6e 46 72 65 65 29  t, nOrig, nFree)
1c810 3b 0a 20 20 20 20 69 66 28 20 6e 46 69 6e 3e 6e  ;.    if( nFin>n
1c820 4f 72 69 67 20 29 20 72 65 74 75 72 6e 20 53 51  Orig ) return SQ
1c830 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
1c840 54 3b 0a 20 20 20 20 69 66 28 20 6e 46 69 6e 3c  T;.    if( nFin<
1c850 6e 4f 72 69 67 20 29 7b 0a 20 20 20 20 20 20 72  nOrig ){.      r
1c860 63 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73 6f  c = saveAllCurso
1c870 72 73 28 70 42 74 2c 20 30 2c 20 30 29 3b 0a 20  rs(pBt, 0, 0);. 
1c880 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 46 72     }.    for(iFr
1c890 65 65 3d 6e 4f 72 69 67 3b 20 69 46 72 65 65 3e  ee=nOrig; iFree>
1c8a0 6e 46 69 6e 20 26 26 20 72 63 3d 3d 53 51 4c 49  nFin && rc==SQLI
1c8b0 54 45 5f 4f 4b 3b 20 69 46 72 65 65 2d 2d 29 7b  TE_OK; iFree--){
1c8c0 0a 20 20 20 20 20 20 72 63 20 3d 20 69 6e 63 72  .      rc = incr
1c8d0 56 61 63 75 75 6d 53 74 65 70 28 70 42 74 2c 20  VacuumStep(pBt, 
1c8e0 6e 46 69 6e 2c 20 69 46 72 65 65 2c 20 31 29 3b  nFin, iFree, 1);
1c8f0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28  .    }.    if( (
1c900 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc==SQLITE_DONE 
1c910 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  || rc==SQLITE_OK
1c920 29 20 26 26 20 6e 46 72 65 65 3e 30 20 29 7b 0a  ) && nFree>0 ){.
1c930 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1c940 65 33 50 61 67 65 72 57 72 69 74 65 28 70 42 74  e3PagerWrite(pBt
1c950 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67  ->pPage1->pDbPag
1c960 65 29 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79  e);.      put4by
1c970 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d  te(&pBt->pPage1-
1c980 3e 61 44 61 74 61 5b 33 32 5d 2c 20 30 29 3b 0a  >aData[32], 0);.
1c990 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
1c9a0 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61  pBt->pPage1->aDa
1c9b0 74 61 5b 33 36 5d 2c 20 30 29 3b 0a 20 20 20 20  ta[36], 0);.    
1c9c0 20 20 70 75 74 34 62 79 74 65 28 26 70 42 74 2d    put4byte(&pBt-
1c9d0 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 32  >pPage1->aData[2
1c9e0 38 5d 2c 20 6e 46 69 6e 29 3b 0a 20 20 20 20 20  8], nFin);.     
1c9f0 20 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74   pBt->bDoTruncat
1ca00 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 42 74  e = 1;.      pBt
1ca10 2d 3e 6e 50 61 67 65 20 3d 20 6e 46 69 6e 3b 0a  ->nPage = nFin;.
1ca20 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
1ca30 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1ca40 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
1ca50 72 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72  rRollback(pPager
1ca60 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
1ca70 61 73 73 65 72 74 28 20 6e 52 65 66 3e 3d 73 71  assert( nRef>=sq
1ca80 6c 69 74 65 33 50 61 67 65 72 52 65 66 63 6f 75  lite3PagerRefcou
1ca90 6e 74 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  nt(pPager) );.  
1caa0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65  return rc;.}..#e
1cab0 6c 73 65 20 2f 2a 20 69 66 6e 64 65 66 20 53 51  lse /* ifndef SQ
1cac0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
1cad0 43 55 55 4d 20 2a 2f 0a 23 20 64 65 66 69 6e 65  CUUM */.# define
1cae0 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70 73   setChildPtrmaps
1caf0 28 78 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 23 65  (x) SQLITE_OK.#e
1cb00 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ndif../*.** This
1cb10 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 74 68   routine does th
1cb20 65 20 66 69 72 73 74 20 70 68 61 73 65 20 6f 66  e first phase of
1cb30 20 61 20 74 77 6f 2d 70 68 61 73 65 20 63 6f 6d   a two-phase com
1cb40 6d 69 74 2e 20 20 54 68 69 73 20 72 6f 75 74 69  mit.  This routi
1cb50 6e 65 0a 2a 2a 20 63 61 75 73 65 73 20 61 20 72  ne.** causes a r
1cb60 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20  ollback journal 
1cb70 74 6f 20 62 65 20 63 72 65 61 74 65 64 20 28 69  to be created (i
1cb80 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 61 6c  f it does not al
1cb90 72 65 61 64 79 20 65 78 69 73 74 29 0a 2a 2a 20  ready exist).** 
1cba0 61 6e 64 20 70 6f 70 75 6c 61 74 65 64 20 77 69  and populated wi
1cbb0 74 68 20 65 6e 6f 75 67 68 20 69 6e 66 6f 72 6d  th enough inform
1cbc0 61 74 69 6f 6e 20 73 6f 20 74 68 61 74 20 69 66  ation so that if
1cbd0 20 61 20 70 6f 77 65 72 20 6c 6f 73 73 20 6f 63   a power loss oc
1cbe0 63 75 72 73 0a 2a 2a 20 74 68 65 20 64 61 74 61  curs.** the data
1cbf0 62 61 73 65 20 63 61 6e 20 62 65 20 72 65 73 74  base can be rest
1cc00 6f 72 65 64 20 74 6f 20 69 74 73 20 6f 72 69 67  ored to its orig
1cc10 69 6e 61 6c 20 73 74 61 74 65 20 62 79 20 70 6c  inal state by pl
1cc20 61 79 69 6e 67 20 62 61 63 6b 0a 2a 2a 20 74 68  aying back.** th
1cc30 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 6e  e journal.  Then
1cc40 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
1cc50 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 72 65   the journal are
1cc60 20 66 6c 75 73 68 65 64 20 6f 75 74 20 74 6f 0a   flushed out to.
1cc70 2a 2a 20 74 68 65 20 64 69 73 6b 2e 20 20 41 66  ** the disk.  Af
1cc80 74 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ter the journal 
1cc90 69 73 20 73 61 66 65 6c 79 20 6f 6e 20 6f 78 69  is safely on oxi
1cca0 64 65 2c 20 74 68 65 20 63 68 61 6e 67 65 73 20  de, the changes 
1ccb0 74 6f 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61  to the.** databa
1ccc0 73 65 20 61 72 65 20 77 72 69 74 74 65 6e 20 69  se are written i
1ccd0 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65  nto the database
1cce0 20 66 69 6c 65 20 61 6e 64 20 66 6c 75 73 68 65   file and flushe
1ccf0 64 20 74 6f 20 6f 78 69 64 65 2e 0a 2a 2a 20 41  d to oxide..** A
1cd00 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 69  t the end of thi
1cd10 73 20 63 61 6c 6c 2c 20 74 68 65 20 72 6f 6c 6c  s call, the roll
1cd20 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 73 74 69  back journal sti
1cd30 6c 6c 20 65 78 69 73 74 73 20 6f 6e 20 74 68 65  ll exists on the
1cd40 0a 2a 2a 20 64 69 73 6b 20 61 6e 64 20 77 65 20  .** disk and we 
1cd50 61 72 65 20 73 74 69 6c 6c 20 68 6f 6c 64 69 6e  are still holdin
1cd60 67 20 61 6c 6c 20 6c 6f 63 6b 73 2c 20 73 6f 20  g all locks, so 
1cd70 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
1cd80 68 61 73 20 6e 6f 74 0a 2a 2a 20 63 6f 6d 6d 69  has not.** commi
1cd90 74 74 65 64 2e 20 20 53 65 65 20 73 71 6c 69 74  tted.  See sqlit
1cda0 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
1cdb0 73 65 54 77 6f 28 29 20 66 6f 72 20 74 68 65 20  seTwo() for the 
1cdc0 73 65 63 6f 6e 64 20 70 68 61 73 65 20 6f 66 20  second phase of 
1cdd0 74 68 65 0a 2a 2a 20 63 6f 6d 6d 69 74 20 70 72  the.** commit pr
1cde0 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ocess..**.** Thi
1cdf0 73 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f  s call is a no-o
1ce00 70 20 69 66 20 6e 6f 20 77 72 69 74 65 2d 74 72  p if no write-tr
1ce10 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 75 72  ansaction is cur
1ce20 72 65 6e 74 6c 79 20 61 63 74 69 76 65 20 6f 6e  rently active on
1ce30 20 70 42 74 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65   pBt..**.** Othe
1ce40 72 77 69 73 65 2c 20 73 79 6e 63 20 74 68 65 20  rwise, sync the 
1ce50 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 66 6f  database file fo
1ce60 72 20 74 68 65 20 62 74 72 65 65 20 70 42 74 2e  r the btree pBt.
1ce70 20 7a 4d 61 73 74 65 72 20 70 6f 69 6e 74 73 20   zMaster points 
1ce80 74 6f 0a 2a 2a 20 74 68 65 20 6e 61 6d 65 20 6f  to.** the name o
1ce90 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  f a master journ
1cea0 61 6c 20 66 69 6c 65 20 74 68 61 74 20 73 68 6f  al file that sho
1ceb0 75 6c 64 20 62 65 20 77 72 69 74 74 65 6e 20 69  uld be written i
1cec0 6e 74 6f 20 74 68 65 0a 2a 2a 20 69 6e 64 69 76  nto the.** indiv
1ced0 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 20 66 69  idual journal fi
1cee0 6c 65 2c 20 6f 72 20 69 73 20 4e 55 4c 4c 2c 20  le, or is NULL, 
1cef0 69 6e 64 69 63 61 74 69 6e 67 20 6e 6f 20 6d 61  indicating no ma
1cf00 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
1cf10 65 20 0a 2a 2a 20 28 73 69 6e 67 6c 65 20 64 61  e .** (single da
1cf20 74 61 62 61 73 65 20 74 72 61 6e 73 61 63 74 69  tabase transacti
1cf30 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  on)..**.** When 
1cf40 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64 2c 20  this is called, 
1cf50 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
1cf60 61 6c 20 73 68 6f 75 6c 64 20 61 6c 72 65 61 64  al should alread
1cf70 79 20 68 61 76 65 20 62 65 65 6e 0a 2a 2a 20 63  y have been.** c
1cf80 72 65 61 74 65 64 2c 20 70 6f 70 75 6c 61 74 65  reated, populate
1cf90 64 20 77 69 74 68 20 74 68 69 73 20 6a 6f 75 72  d with this jour
1cfa0 6e 61 6c 20 70 6f 69 6e 74 65 72 20 61 6e 64 20  nal pointer and 
1cfb0 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e 0a  synced to disk..
1cfc0 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 74 68 69 73 20  **.** Once this 
1cfd0 69 73 20 72 6f 75 74 69 6e 65 20 68 61 73 20 72  is routine has r
1cfe0 65 74 75 72 6e 65 64 2c 20 74 68 65 20 6f 6e 6c  eturned, the onl
1cff0 79 20 74 68 69 6e 67 20 72 65 71 75 69 72 65 64  y thing required
1d000 20 74 6f 20 63 6f 6d 6d 69 74 0a 2a 2a 20 74 68   to commit.** th
1d010 65 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  e write-transact
1d020 69 6f 6e 20 66 6f 72 20 74 68 69 73 20 64 61 74  ion for this dat
1d030 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 74 6f  abase file is to
1d040 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72   delete the jour
1d050 6e 61 6c 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  nal..*/.int sqli
1d060 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
1d070 61 73 65 4f 6e 65 28 42 74 72 65 65 20 2a 70 2c  aseOne(Btree *p,
1d080 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61   const char *zMa
1d090 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20  ster){.  int rc 
1d0a0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
1d0b0 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  f( p->inTrans==T
1d0c0 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20  RANS_WRITE ){.  
1d0d0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
1d0e0 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 20 20 73 71  = p->pBt;.    sq
1d0f0 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
1d100 70 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  p);.#ifndef SQLI
1d110 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
1d120 55 4d 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e  UM.    if( pBt->
1d130 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20  autoVacuum ){.  
1d140 20 20 20 20 72 63 20 3d 20 61 75 74 6f 56 61 63      rc = autoVac
1d150 75 75 6d 43 6f 6d 6d 69 74 28 70 42 74 29 3b 0a  uumCommit(pBt);.
1d160 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
1d170 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1d180 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c     sqlite3BtreeL
1d190 65 61 76 65 28 70 29 3b 0a 20 20 20 20 20 20 20  eave(p);.       
1d1a0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1d1b0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
1d1c0 28 20 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61  ( pBt->bDoTrunca
1d1d0 74 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  te ){.      sqli
1d1e0 74 65 33 50 61 67 65 72 54 72 75 6e 63 61 74 65  te3PagerTruncate
1d1f0 49 6d 61 67 65 28 70 42 74 2d 3e 70 50 61 67 65  Image(pBt->pPage
1d200 72 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 3b 0a  r, pBt->nPage);.
1d210 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
1d220 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
1d230 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65  erCommitPhaseOne
1d240 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 7a 4d  (pBt->pPager, zM
1d250 61 73 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 73  aster, 0);.    s
1d260 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
1d270 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  (p);.  }.  retur
1d280 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
1d290 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
1d2a0 63 61 6c 6c 65 64 20 66 72 6f 6d 20 62 6f 74 68  called from both
1d2b0 20 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73   BtreeCommitPhas
1d2c0 65 54 77 6f 28 29 20 61 6e 64 20 42 74 72 65 65  eTwo() and Btree
1d2d0 52 6f 6c 6c 62 61 63 6b 28 29 0a 2a 2a 20 61 74  Rollback().** at
1d2e0 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e 20   the conclusion 
1d2f0 6f 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  of a transaction
1d300 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1d310 20 62 74 72 65 65 45 6e 64 54 72 61 6e 73 61 63   btreeEndTransac
1d320 74 69 6f 6e 28 42 74 72 65 65 20 2a 70 29 7b 0a  tion(Btree *p){.
1d330 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
1d340 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69  = p->pBt;.  sqli
1d350 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b  te3 *db = p->db;
1d360 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
1d370 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65  e3BtreeHoldsMute
1d380 78 28 70 29 20 29 3b 0a 0a 23 69 66 6e 64 65 66  x(p) );..#ifndef
1d390 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
1d3a0 4f 56 41 43 55 55 4d 0a 20 20 70 42 74 2d 3e 62  OVACUUM.  pBt->b
1d3b0 44 6f 54 72 75 6e 63 61 74 65 20 3d 20 30 3b 0a  DoTruncate = 0;.
1d3c0 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 2d 3e  #endif.  if( p->
1d3d0 69 6e 54 72 61 6e 73 3e 54 52 41 4e 53 5f 4e 4f  inTrans>TRANS_NO
1d3e0 4e 45 20 26 26 20 64 62 2d 3e 6e 56 64 62 65 52  NE && db->nVdbeR
1d3f0 65 61 64 3e 31 20 29 7b 0a 20 20 20 20 2f 2a 20  ead>1 ){.    /* 
1d400 49 66 20 74 68 65 72 65 20 61 72 65 20 6f 74 68  If there are oth
1d410 65 72 20 61 63 74 69 76 65 20 73 74 61 74 65 6d  er active statem
1d420 65 6e 74 73 20 74 68 61 74 20 62 65 6c 6f 6e 67  ents that belong
1d430 20 74 6f 20 74 68 69 73 20 64 61 74 61 62 61 73   to this databas
1d440 65 0a 20 20 20 20 2a 2a 20 68 61 6e 64 6c 65 2c  e.    ** handle,
1d450 20 64 6f 77 6e 67 72 61 64 65 20 74 6f 20 61 20   downgrade to a 
1d460 72 65 61 64 2d 6f 6e 6c 79 20 74 72 61 6e 73 61  read-only transa
1d470 63 74 69 6f 6e 2e 20 54 68 65 20 6f 74 68 65 72  ction. The other
1d480 20 73 74 61 74 65 6d 65 6e 74 73 0a 20 20 20 20   statements.    
1d490 2a 2a 20 6d 61 79 20 73 74 69 6c 6c 20 62 65 20  ** may still be 
1d4a0 72 65 61 64 69 6e 67 20 66 72 6f 6d 20 74 68 65  reading from the
1d4b0 20 64 61 74 61 62 61 73 65 2e 20 20 2a 2f 0a 20   database.  */. 
1d4c0 20 20 20 64 6f 77 6e 67 72 61 64 65 41 6c 6c 53     downgradeAllS
1d4d0 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
1d4e0 6f 63 6b 73 28 70 29 3b 0a 20 20 20 20 70 2d 3e  ocks(p);.    p->
1d4f0 69 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f  inTrans = TRANS_
1d500 52 45 41 44 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  READ;.  }else{. 
1d510 20 20 20 2f 2a 20 49 66 20 74 68 65 20 68 61 6e     /* If the han
1d520 64 6c 65 20 68 61 64 20 61 6e 79 20 6b 69 6e 64  dle had any kind
1d530 20 6f 66 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   of transaction 
1d540 6f 70 65 6e 2c 20 64 65 63 72 65 6d 65 6e 74 20  open, decrement 
1d550 74 68 65 20 0a 20 20 20 20 2a 2a 20 74 72 61 6e  the .    ** tran
1d560 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 20 6f 66  saction count of
1d570 20 74 68 65 20 73 68 61 72 65 64 20 62 74 72 65   the shared btre
1d580 65 2e 20 49 66 20 74 68 65 20 74 72 61 6e 73 61  e. If the transa
1d590 63 74 69 6f 6e 20 63 6f 75 6e 74 20 0a 20 20 20  ction count .   
1d5a0 20 2a 2a 20 72 65 61 63 68 65 73 20 30 2c 20 73   ** reaches 0, s
1d5b0 65 74 20 74 68 65 20 73 68 61 72 65 64 20 73 74  et the shared st
1d5c0 61 74 65 20 74 6f 20 54 52 41 4e 53 5f 4e 4f 4e  ate to TRANS_NON
1d5d0 45 2e 20 54 68 65 20 75 6e 6c 6f 63 6b 42 74 72  E. The unlockBtr
1d5e0 65 65 49 66 55 6e 75 73 65 64 28 29 0a 20 20 20  eeIfUnused().   
1d5f0 20 2a 2a 20 63 61 6c 6c 20 62 65 6c 6f 77 20 77   ** call below w
1d600 69 6c 6c 20 75 6e 6c 6f 63 6b 20 74 68 65 20 70  ill unlock the p
1d610 61 67 65 72 2e 20 20 2a 2f 0a 20 20 20 20 69 66  ager.  */.    if
1d620 28 20 70 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52  ( p->inTrans!=TR
1d630 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20  ANS_NONE ){.    
1d640 20 20 63 6c 65 61 72 41 6c 6c 53 68 61 72 65 64    clearAllShared
1d650 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28  CacheTableLocks(
1d660 70 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e  p);.      pBt->n
1d670 54 72 61 6e 73 61 63 74 69 6f 6e 2d 2d 3b 0a 20  Transaction--;. 
1d680 20 20 20 20 20 69 66 28 20 30 3d 3d 70 42 74 2d       if( 0==pBt-
1d690 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 29 7b  >nTransaction ){
1d6a0 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e 69 6e  .        pBt->in
1d6b0 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52  Transaction = TR
1d6c0 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20  ANS_NONE;.      
1d6d0 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
1d6e0 53 65 74 20 74 68 65 20 63 75 72 72 65 6e 74 20  Set the current 
1d6f0 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 74 61 74  transaction stat
1d700 65 20 74 6f 20 54 52 41 4e 53 5f 4e 4f 4e 45 20  e to TRANS_NONE 
1d710 61 6e 64 20 75 6e 6c 6f 63 6b 20 74 68 65 20 0a  and unlock the .
1d720 20 20 20 20 2a 2a 20 70 61 67 65 72 20 69 66 20      ** pager if 
1d730 74 68 69 73 20 63 61 6c 6c 20 63 6c 6f 73 65 64  this call closed
1d740 20 74 68 65 20 6f 6e 6c 79 20 72 65 61 64 20 6f   the only read o
1d750 72 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  r write transact
1d760 69 6f 6e 2e 20 20 2a 2f 0a 20 20 20 20 70 2d 3e  ion.  */.    p->
1d770 69 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f  inTrans = TRANS_
1d780 4e 4f 4e 45 3b 0a 20 20 20 20 75 6e 6c 6f 63 6b  NONE;.    unlock
1d790 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 70 42  BtreeIfUnused(pB
1d7a0 74 29 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65  t);.  }..  btree
1d7b0 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 7d 0a  Integrity(p);.}.
1d7c0 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 74 68  ./*.** Commit th
1d7d0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 75  e transaction cu
1d7e0 72 72 65 6e 74 6c 79 20 69 6e 20 70 72 6f 67 72  rrently in progr
1d7f0 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ess..**.** This 
1d800 72 6f 75 74 69 6e 65 20 69 6d 70 6c 65 6d 65 6e  routine implemen
1d810 74 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70 68  ts the second ph
1d820 61 73 65 20 6f 66 20 61 20 32 2d 70 68 61 73 65  ase of a 2-phase
1d830 20 63 6f 6d 6d 69 74 2e 20 20 54 68 65 0a 2a 2a   commit.  The.**
1d840 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
1d850 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 20 72 6f  mitPhaseOne() ro
1d860 75 74 69 6e 65 20 64 6f 65 73 20 74 68 65 20 66  utine does the f
1d870 69 72 73 74 20 70 68 61 73 65 20 61 6e 64 20 73  irst phase and s
1d880 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 69 6e 76 6f  hould.** be invo
1d890 6b 65 64 20 70 72 69 6f 72 20 74 6f 20 63 61 6c  ked prior to cal
1d8a0 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e  ling this routin
1d8b0 65 2e 20 20 54 68 65 20 73 71 6c 69 74 65 33 42  e.  The sqlite3B
1d8c0 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f  treeCommitPhaseO
1d8d0 6e 65 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  ne().** routine 
1d8e0 64 69 64 20 61 6c 6c 20 74 68 65 20 77 6f 72 6b  did all the work
1d8f0 20 6f 66 20 77 72 69 74 69 6e 67 20 69 6e 66 6f   of writing info
1d900 72 6d 61 74 69 6f 6e 20 6f 75 74 20 74 6f 20 64  rmation out to d
1d910 69 73 6b 20 61 6e 64 20 66 6c 75 73 68 69 6e 67  isk and flushing
1d920 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73   the.** contents
1d930 20 73 6f 20 74 68 61 74 20 74 68 65 79 20 61 72   so that they ar
1d940 65 20 77 72 69 74 74 65 6e 20 6f 6e 74 6f 20 74  e written onto t
1d950 68 65 20 64 69 73 6b 20 70 6c 61 74 74 65 72 2e  he disk platter.
1d960 20 20 41 6c 6c 20 74 68 69 73 0a 2a 2a 20 72 6f    All this.** ro
1d970 75 74 69 6e 65 20 68 61 73 20 74 6f 20 64 6f 20  utine has to do 
1d980 69 73 20 64 65 6c 65 74 65 20 6f 72 20 74 72 75  is delete or tru
1d990 6e 63 61 74 65 20 6f 72 20 7a 65 72 6f 20 74 68  ncate or zero th
1d9a0 65 20 68 65 61 64 65 72 20 69 6e 20 74 68 65 0a  e header in the.
1d9b0 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  ** the rollback 
1d9c0 6a 6f 75 72 6e 61 6c 20 28 77 68 69 63 68 20 63  journal (which c
1d9d0 61 75 73 65 73 20 74 68 65 20 74 72 61 6e 73 61  auses the transa
1d9e0 63 74 69 6f 6e 20 74 6f 20 63 6f 6d 6d 69 74 29  ction to commit)
1d9f0 20 61 6e 64 0a 2a 2a 20 64 72 6f 70 20 6c 6f 63   and.** drop loc
1da00 6b 73 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c  ks..**.** Normal
1da10 6c 79 2c 20 69 66 20 61 6e 20 65 72 72 6f 72 20  ly, if an error 
1da20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74 68 65  occurs while the
1da30 20 70 61 67 65 72 20 6c 61 79 65 72 20 69 73 20   pager layer is 
1da40 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 0a 2a  attempting to .*
1da50 2a 20 66 69 6e 61 6c 69 7a 65 20 74 68 65 20 75  * finalize the u
1da60 6e 64 65 72 6c 79 69 6e 67 20 6a 6f 75 72 6e 61  nderlying journa
1da70 6c 20 66 69 6c 65 2c 20 74 68 69 73 20 66 75 6e  l file, this fun
1da80 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 61 6e  ction returns an
1da90 20 65 72 72 6f 72 20 61 6e 64 0a 2a 2a 20 74 68   error and.** th
1daa0 65 20 75 70 70 65 72 20 6c 61 79 65 72 20 77 69  e upper layer wi
1dab0 6c 6c 20 61 74 74 65 6d 70 74 20 61 20 72 6f 6c  ll attempt a rol
1dac0 6c 62 61 63 6b 2e 20 48 6f 77 65 76 65 72 2c 20  lback. However, 
1dad0 69 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  if the second ar
1dae0 67 75 6d 65 6e 74 0a 2a 2a 20 69 73 20 6e 6f 6e  gument.** is non
1daf0 2d 7a 65 72 6f 20 74 68 65 6e 20 74 68 69 73 20  -zero then this 
1db00 62 2d 74 72 65 65 20 74 72 61 6e 73 61 63 74 69  b-tree transacti
1db10 6f 6e 20 69 73 20 70 61 72 74 20 6f 66 20 61 20  on is part of a 
1db20 6d 75 6c 74 69 2d 66 69 6c 65 20 0a 2a 2a 20 74  multi-file .** t
1db30 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 6e 20 74  ransaction. In t
1db40 68 69 73 20 63 61 73 65 2c 20 74 68 65 20 74 72  his case, the tr
1db50 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 61 6c  ansaction has al
1db60 72 65 61 64 79 20 62 65 65 6e 20 63 6f 6d 6d 69  ready been commi
1db70 74 74 65 64 20 0a 2a 2a 20 28 62 79 20 64 65 6c  tted .** (by del
1db80 65 74 69 6e 67 20 61 20 6d 61 73 74 65 72 20 6a  eting a master j
1db90 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20 61 6e 64  ournal file) and
1dba0 20 74 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c   the caller will
1dbb0 20 69 67 6e 6f 72 65 20 74 68 69 73 20 0a 2a 2a   ignore this .**
1dbc0 20 66 75 6e 63 74 69 6f 6e 73 20 72 65 74 75 72   functions retur
1dbd0 6e 20 63 6f 64 65 2e 20 53 6f 2c 20 65 76 65 6e  n code. So, even
1dbe0 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   if an error occ
1dbf0 75 72 73 20 69 6e 20 74 68 65 20 70 61 67 65 72  urs in the pager
1dc00 20 6c 61 79 65 72 2c 0a 2a 2a 20 72 65 73 65 74   layer,.** reset
1dc10 20 74 68 65 20 62 2d 74 72 65 65 20 6f 62 6a 65   the b-tree obje
1dc20 63 74 73 20 69 6e 74 65 72 6e 61 6c 20 73 74 61  cts internal sta
1dc30 74 65 20 74 6f 20 69 6e 64 69 63 61 74 65 20 74  te to indicate t
1dc40 68 61 74 20 74 68 65 20 77 72 69 74 65 0a 2a 2a  hat the write.**
1dc50 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73   transaction has
1dc60 20 62 65 65 6e 20 63 6c 6f 73 65 64 2e 20 54 68   been closed. Th
1dc70 69 73 20 69 73 20 71 75 69 74 65 20 73 61 66 65  is is quite safe
1dc80 2c 20 61 73 20 74 68 65 20 70 61 67 65 72 20 77  , as the pager w
1dc90 69 6c 6c 20 68 61 76 65 0a 2a 2a 20 74 72 61 6e  ill have.** tran
1dca0 73 69 74 69 6f 6e 65 64 20 74 6f 20 74 68 65 20  sitioned to the 
1dcb0 65 72 72 6f 72 20 73 74 61 74 65 2e 0a 2a 2a 0a  error state..**.
1dcc0 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20 72 65 6c  ** This will rel
1dcd0 65 61 73 65 20 74 68 65 20 77 72 69 74 65 20 6c  ease the write l
1dce0 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
1dcf0 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20 74 68  ase file.  If th
1dd00 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63  ere.** are no ac
1dd10 74 69 76 65 20 63 75 72 73 6f 72 73 2c 20 69 74  tive cursors, it
1dd20 20 61 6c 73 6f 20 72 65 6c 65 61 73 65 73 20 74   also releases t
1dd30 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f  he read lock..*/
1dd40 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
1dd50 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28  eCommitPhaseTwo(
1dd60 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 62 43  Btree *p, int bC
1dd70 6c 65 61 6e 75 70 29 7b 0a 0a 20 20 69 66 28 20  leanup){..  if( 
1dd80 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  p->inTrans==TRAN
1dd90 53 5f 4e 4f 4e 45 20 29 20 72 65 74 75 72 6e 20  S_NONE ) return 
1dda0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 73 71 6c  SQLITE_OK;.  sql
1ddb0 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
1ddc0 29 3b 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72  );.  btreeIntegr
1ddd0 69 74 79 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66  ity(p);..  /* If
1dde0 20 74 68 65 20 68 61 6e 64 6c 65 20 68 61 73 20   the handle has 
1ddf0 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  a write-transact
1de00 69 6f 6e 20 6f 70 65 6e 2c 20 63 6f 6d 6d 69 74  ion open, commit
1de10 20 74 68 65 20 73 68 61 72 65 64 2d 62 74 72 65   the shared-btre
1de20 65 73 20 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63  es .  ** transac
1de30 74 69 6f 6e 20 61 6e 64 20 73 65 74 20 74 68 65  tion and set the
1de40 20 73 68 61 72 65 64 20 73 74 61 74 65 20 74 6f   shared state to
1de50 20 54 52 41 4e 53 5f 52 45 41 44 2e 0a 20 20 2a   TRANS_READ..  *
1de60 2f 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61  /.  if( p->inTra
1de70 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  ns==TRANS_WRITE 
1de80 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20  ){.    int rc;. 
1de90 20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74     BtShared *pBt
1dea0 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 20 20 61   = p->pBt;.    a
1deb0 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72  ssert( pBt->inTr
1dec0 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53  ansaction==TRANS
1ded0 5f 57 52 49 54 45 20 29 3b 0a 20 20 20 20 61 73  _WRITE );.    as
1dee0 73 65 72 74 28 20 70 42 74 2d 3e 6e 54 72 61 6e  sert( pBt->nTran
1def0 73 61 63 74 69 6f 6e 3e 30 20 29 3b 0a 20 20 20  saction>0 );.   
1df00 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
1df10 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f  erCommitPhaseTwo
1df20 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20  (pBt->pPager);. 
1df30 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1df40 45 5f 4f 4b 20 26 26 20 62 43 6c 65 61 6e 75 70  E_OK && bCleanup
1df50 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
1df60 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
1df70 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
1df80 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d  rc;.    }.    p-
1df90 3e 69 44 61 74 61 56 65 72 73 69 6f 6e 2d 2d 3b  >iDataVersion--;
1dfa0 20 20 2f 2a 20 43 6f 6d 70 65 6e 73 61 74 65 20    /* Compensate 
1dfb0 66 6f 72 20 70 50 61 67 65 72 2d 3e 69 44 61 74  for pPager->iDat
1dfc0 61 56 65 72 73 69 6f 6e 2b 2b 3b 20 2a 2f 0a 20  aVersion++; */. 
1dfd0 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61     pBt->inTransa
1dfe0 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 52 45  ction = TRANS_RE
1dff0 41 44 3b 0a 20 20 20 20 62 74 72 65 65 43 6c 65  AD;.    btreeCle
1e000 61 72 48 61 73 43 6f 6e 74 65 6e 74 28 70 42 74  arHasContent(pBt
1e010 29 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65 45  );.  }..  btreeE
1e020 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 29  ndTransaction(p)
1e030 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
1e040 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
1e050 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
1e060 0a 2f 2a 0a 2a 2a 20 44 6f 20 62 6f 74 68 20 70  ./*.** Do both p
1e070 68 61 73 65 73 20 6f 66 20 61 20 63 6f 6d 6d 69  hases of a commi
1e080 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
1e090 33 42 74 72 65 65 43 6f 6d 6d 69 74 28 42 74 72  3BtreeCommit(Btr
1e0a0 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63  ee *p){.  int rc
1e0b0 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
1e0c0 45 6e 74 65 72 28 70 29 3b 0a 20 20 72 63 20 3d  Enter(p);.  rc =
1e0d0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
1e0e0 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 2c 20 30  mitPhaseOne(p, 0
1e0f0 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
1e100 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
1e110 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43   = sqlite3BtreeC
1e120 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70 2c  ommitPhaseTwo(p,
1e130 20 30 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74   0);.  }.  sqlit
1e140 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
1e150 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1e160 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
1e170 69 6e 65 20 73 65 74 73 20 74 68 65 20 73 74 61  ine sets the sta
1e180 74 65 20 74 6f 20 43 55 52 53 4f 52 5f 46 41 55  te to CURSOR_FAU
1e190 4c 54 20 61 6e 64 20 74 68 65 20 65 72 72 6f 72  LT and the error
1e1a0 0a 2a 2a 20 63 6f 64 65 20 74 6f 20 65 72 72 43  .** code to errC
1e1b0 6f 64 65 20 66 6f 72 20 65 76 65 72 79 20 63 75  ode for every cu
1e1c0 72 73 6f 72 20 6f 6e 20 61 6e 79 20 42 74 53 68  rsor on any BtSh
1e1d0 61 72 65 64 20 74 68 61 74 20 70 42 74 72 65 65  ared that pBtree
1e1e0 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 2e 20  .** references. 
1e1f0 20 4f 72 20 69 66 20 74 68 65 20 77 72 69 74 65   Or if the write
1e200 4f 6e 6c 79 20 66 6c 61 67 20 69 73 20 73 65 74  Only flag is set
1e210 20 74 6f 20 31 2c 20 74 68 65 6e 20 6f 6e 6c 79   to 1, then only
1e220 0a 2a 2a 20 74 72 69 70 20 77 72 69 74 65 20 63  .** trip write c
1e230 75 72 73 6f 72 73 20 61 6e 64 20 6c 65 61 76 65  ursors and leave
1e240 20 72 65 61 64 20 63 75 72 73 6f 72 73 20 75 6e   read cursors un
1e250 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 45  changed..**.** E
1e260 76 65 72 79 20 63 75 72 73 6f 72 20 69 73 20 61  very cursor is a
1e270 20 63 61 6e 64 69 64 61 74 65 20 74 6f 20 62 65   candidate to be
1e280 20 74 72 69 70 70 65 64 2c 20 69 6e 63 6c 75 64   tripped, includ
1e290 69 6e 67 20 63 75 72 73 6f 72 73 0a 2a 2a 20 74  ing cursors.** t
1e2a0 68 61 74 20 62 65 6c 6f 6e 67 20 74 6f 20 6f 74  hat belong to ot
1e2b0 68 65 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e  her database con
1e2c0 6e 65 63 74 69 6f 6e 73 20 74 68 61 74 20 68 61  nections that ha
1e2d0 70 70 65 6e 20 74 6f 20 62 65 0a 2a 2a 20 73 68  ppen to be.** sh
1e2e0 61 72 69 6e 67 20 74 68 65 20 63 61 63 68 65 20  aring the cache 
1e2f0 77 69 74 68 20 70 42 74 72 65 65 2e 0a 2a 2a 0a  with pBtree..**.
1e300 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1e310 67 65 74 73 20 63 61 6c 6c 65 64 20 77 68 65 6e  gets called when
1e320 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75   a rollback occu
1e330 72 73 2e 20 49 66 20 74 68 65 20 77 72 69 74 65  rs. If the write
1e340 4f 6e 6c 79 0a 2a 2a 20 66 6c 61 67 20 69 73 20  Only.** flag is 
1e350 74 72 75 65 2c 20 74 68 65 6e 20 6f 6e 6c 79 20  true, then only 
1e360 77 72 69 74 65 2d 63 75 72 73 6f 72 73 20 6e 65  write-cursors ne
1e370 65 64 20 62 65 20 74 72 69 70 70 65 64 20 2d 20  ed be tripped - 
1e380 72 65 61 64 2d 6f 6e 6c 79 0a 2a 2a 20 63 75 72  read-only.** cur
1e390 73 6f 72 73 20 73 61 76 65 20 74 68 65 69 72 20  sors save their 
1e3a0 63 75 72 72 65 6e 74 20 70 6f 73 69 74 69 6f 6e  current position
1e3b0 73 20 73 6f 20 74 68 61 74 20 74 68 65 79 20 6d  s so that they m
1e3c0 61 79 20 63 6f 6e 74 69 6e 75 65 20 0a 2a 2a 20  ay continue .** 
1e3d0 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 72 6f  following the ro
1e3e0 6c 6c 62 61 63 6b 2e 20 4f 72 2c 20 69 66 20 77  llback. Or, if w
1e3f0 72 69 74 65 4f 6e 6c 79 20 69 73 20 66 61 6c 73  riteOnly is fals
1e400 65 2c 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 61  e, all cursors a
1e410 72 65 20 0a 2a 2a 20 74 72 69 70 70 65 64 2e 20  re .** tripped. 
1e420 49 6e 20 67 65 6e 65 72 61 6c 2c 20 77 72 69 74  In general, writ
1e430 65 4f 6e 6c 79 20 69 73 20 66 61 6c 73 65 20 69  eOnly is false i
1e440 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  f the transactio
1e450 6e 20 62 65 69 6e 67 0a 2a 2a 20 72 6f 6c 6c 65  n being.** rolle
1e460 64 20 62 61 63 6b 20 6d 6f 64 69 66 69 65 64 20  d back modified 
1e470 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63 68  the database sch
1e480 65 6d 61 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ema. In this cas
1e490 65 20 62 2d 74 72 65 65 20 72 6f 6f 74 0a 2a 2a  e b-tree root.**
1e4a0 20 70 61 67 65 73 20 6d 61 79 20 62 65 20 6d 6f   pages may be mo
1e4b0 76 65 64 20 6f 72 20 64 65 6c 65 74 65 64 20 66  ved or deleted f
1e4c0 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
1e4d0 20 61 6c 74 6f 67 65 74 68 65 72 2c 20 6d 61 6b   altogether, mak
1e4e0 69 6e 67 0a 2a 2a 20 69 74 20 75 6e 73 61 66 65  ing.** it unsafe
1e4f0 20 66 6f 72 20 72 65 61 64 20 63 75 72 73 6f 72   for read cursor
1e500 73 20 74 6f 20 63 6f 6e 74 69 6e 75 65 2e 0a 2a  s to continue..*
1e510 2a 0a 2a 2a 20 49 66 20 74 68 65 20 77 72 69 74  *.** If the writ
1e520 65 4f 6e 6c 79 20 66 6c 61 67 20 69 73 20 74 72  eOnly flag is tr
1e530 75 65 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20  ue and an error 
1e540 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 77  is encountered w
1e550 68 69 6c 65 20 0a 2a 2a 20 73 61 76 69 6e 67 20  hile .** saving 
1e560 74 68 65 20 63 75 72 72 65 6e 74 20 70 6f 73 69  the current posi
1e570 74 69 6f 6e 20 6f 66 20 61 20 72 65 61 64 2d 6f  tion of a read-o
1e580 6e 6c 79 20 63 75 72 73 6f 72 2c 20 61 6c 6c 20  nly cursor, all 
1e590 63 75 72 73 6f 72 73 2c 20 0a 2a 2a 20 69 6e 63  cursors, .** inc
1e5a0 6c 75 64 69 6e 67 20 61 6c 6c 20 72 65 61 64 2d  luding all read-
1e5b0 63 75 72 73 6f 72 73 20 61 72 65 20 74 72 69 70  cursors are trip
1e5c0 70 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54  ped..**.** SQLIT
1e5d0 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
1e5e0 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   if successful, 
1e5f0 6f 72 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f  or if an error o
1e600 63 63 75 72 73 20 77 68 69 6c 65 0a 2a 2a 20 73  ccurs while.** s
1e610 61 76 69 6e 67 20 61 20 63 75 72 73 6f 72 20 70  aving a cursor p
1e620 6f 73 69 74 69 6f 6e 2c 20 61 6e 20 53 51 4c 69  osition, an SQLi
1e630 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a  te error code..*
1e640 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
1e650 65 65 54 72 69 70 41 6c 6c 43 75 72 73 6f 72 73  eeTripAllCursors
1e660 28 42 74 72 65 65 20 2a 70 42 74 72 65 65 2c 20  (Btree *pBtree, 
1e670 69 6e 74 20 65 72 72 43 6f 64 65 2c 20 69 6e 74  int errCode, int
1e680 20 77 72 69 74 65 4f 6e 6c 79 29 7b 0a 20 20 42   writeOnly){.  B
1e690 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 69 6e  tCursor *p;.  in
1e6a0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
1e6b0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 28 77 72  ;..  assert( (wr
1e6c0 69 74 65 4f 6e 6c 79 3d 3d 30 20 7c 7c 20 77 72  iteOnly==0 || wr
1e6d0 69 74 65 4f 6e 6c 79 3d 3d 31 29 20 26 26 20 42  iteOnly==1) && B
1e6e0 54 43 46 5f 57 72 69 74 65 46 6c 61 67 3d 3d 31  TCF_WriteFlag==1
1e6f0 20 29 3b 0a 20 20 69 66 28 20 70 42 74 72 65 65   );.  if( pBtree
1e700 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42   ){.    sqlite3B
1e710 74 72 65 65 45 6e 74 65 72 28 70 42 74 72 65 65  treeEnter(pBtree
1e720 29 3b 0a 20 20 20 20 66 6f 72 28 70 3d 70 42 74  );.    for(p=pBt
1e730 72 65 65 2d 3e 70 42 74 2d 3e 70 43 75 72 73 6f  ree->pBt->pCurso
1e740 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74  r; p; p=p->pNext
1e750 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  ){.      int i;.
1e760 20 20 20 20 20 20 69 66 28 20 77 72 69 74 65 4f        if( writeO
1e770 6e 6c 79 20 26 26 20 28 70 2d 3e 63 75 72 46 6c  nly && (p->curFl
1e780 61 67 73 20 26 20 42 54 43 46 5f 57 72 69 74 65  ags & BTCF_Write
1e790 46 6c 61 67 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Flag)==0 ){.    
1e7a0 20 20 20 20 69 66 28 20 70 2d 3e 65 53 74 61 74      if( p->eStat
1e7b0 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
1e7c0 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 43 55  || p->eState==CU
1e7d0 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54 20 29 7b  RSOR_SKIPNEXT ){
1e7e0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
1e7f0 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69  saveCursorPositi
1e800 6f 6e 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20  on(p);.         
1e810 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1e820 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
1e830 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33 42    (void)sqlite3B
1e840 74 72 65 65 54 72 69 70 41 6c 6c 43 75 72 73 6f  treeTripAllCurso
1e850 72 73 28 70 42 74 72 65 65 2c 20 72 63 2c 20 30  rs(pBtree, rc, 0
1e860 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  );.            b
1e870 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
1e880 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
1e890 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1e8a0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65   sqlite3BtreeCle
1e8b0 61 72 43 75 72 73 6f 72 28 70 29 3b 0a 20 20 20  arCursor(p);.   
1e8c0 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65 20 3d       p->eState =
1e8d0 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 3b 0a 20   CURSOR_FAULT;. 
1e8e0 20 20 20 20 20 20 20 70 2d 3e 73 6b 69 70 4e 65         p->skipNe
1e8f0 78 74 20 3d 20 65 72 72 43 6f 64 65 3b 0a 20 20  xt = errCode;.  
1e900 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28      }.      for(
1e910 69 3d 30 3b 20 69 3c 3d 70 2d 3e 69 50 61 67 65  i=0; i<=p->iPage
1e920 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
1e930 72 65 6c 65 61 73 65 50 61 67 65 28 70 2d 3e 61  releasePage(p->a
1e940 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20 20 20 20  pPage[i]);.     
1e950 20 20 20 70 2d 3e 61 70 50 61 67 65 5b 69 5d 20     p->apPage[i] 
1e960 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
1e970 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74   }.    sqlite3Bt
1e980 72 65 65 4c 65 61 76 65 28 70 42 74 72 65 65 29  reeLeave(pBtree)
1e990 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
1e9a0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c  c;.}../*.** Roll
1e9b0 62 61 63 6b 20 74 68 65 20 74 72 61 6e 73 61 63  back the transac
1e9c0 74 69 6f 6e 20 69 6e 20 70 72 6f 67 72 65 73 73  tion in progress
1e9d0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 72 69 70 43  ..**.** If tripC
1e9e0 6f 64 65 20 69 73 20 6e 6f 74 20 53 51 4c 49 54  ode is not SQLIT
1e9f0 45 5f 4f 4b 20 74 68 65 6e 20 63 75 72 73 6f 72  E_OK then cursor
1ea00 73 20 77 69 6c 6c 20 62 65 20 69 6e 76 61 6c 69  s will be invali
1ea10 64 61 74 65 64 20 28 74 72 69 70 70 65 64 29 2e  dated (tripped).
1ea20 0a 2a 2a 20 4f 6e 6c 79 20 77 72 69 74 65 20 63  .** Only write c
1ea30 75 72 73 6f 72 73 20 61 72 65 20 74 72 69 70 70  ursors are tripp
1ea40 65 64 20 69 66 20 77 72 69 74 65 4f 6e 6c 79 20  ed if writeOnly 
1ea50 69 73 20 74 72 75 65 20 62 75 74 20 61 6c 6c 20  is true but all 
1ea60 63 75 72 73 6f 72 73 20 61 72 65 0a 2a 2a 20 74  cursors are.** t
1ea70 72 69 70 70 65 64 20 69 66 20 77 72 69 74 65 4f  ripped if writeO
1ea80 6e 6c 79 20 69 73 20 66 61 6c 73 65 2e 20 20 41  nly is false.  A
1ea90 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73  ny attempt to us
1eaa0 65 0a 2a 2a 20 61 20 74 72 69 70 70 65 64 20 63  e.** a tripped c
1eab0 75 72 73 6f 72 20 77 69 6c 6c 20 72 65 73 75 6c  ursor will resul
1eac0 74 20 69 6e 20 61 6e 20 65 72 72 6f 72 2e 0a 2a  t in an error..*
1ead0 2a 0a 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20 72  *.** This will r
1eae0 65 6c 65 61 73 65 20 74 68 65 20 77 72 69 74 65  elease the write
1eaf0 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
1eb00 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20  abase file.  If 
1eb10 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20  there.** are no 
1eb20 61 63 74 69 76 65 20 63 75 72 73 6f 72 73 2c 20  active cursors, 
1eb30 69 74 20 61 6c 73 6f 20 72 65 6c 65 61 73 65 73  it also releases
1eb40 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a   the read lock..
1eb50 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
1eb60 72 65 65 52 6f 6c 6c 62 61 63 6b 28 42 74 72 65  reeRollback(Btre
1eb70 65 20 2a 70 2c 20 69 6e 74 20 74 72 69 70 43 6f  e *p, int tripCo
1eb80 64 65 2c 20 69 6e 74 20 77 72 69 74 65 4f 6e 6c  de, int writeOnl
1eb90 79 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  y){.  int rc;.  
1eba0 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
1ebb0 70 2d 3e 70 42 74 3b 0a 20 20 4d 65 6d 50 61 67  p->pBt;.  MemPag
1ebc0 65 20 2a 70 50 61 67 65 31 3b 0a 0a 20 20 61 73  e *pPage1;..  as
1ebd0 73 65 72 74 28 20 77 72 69 74 65 4f 6e 6c 79 3d  sert( writeOnly=
1ebe0 3d 31 20 7c 7c 20 77 72 69 74 65 4f 6e 6c 79 3d  =1 || writeOnly=
1ebf0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
1ec00 74 72 69 70 43 6f 64 65 3d 3d 53 51 4c 49 54 45  tripCode==SQLITE
1ec10 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b 20  _ABORT_ROLLBACK 
1ec20 7c 7c 20 74 72 69 70 43 6f 64 65 3d 3d 53 51 4c  || tripCode==SQL
1ec30 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 73 71 6c 69  ITE_OK );.  sqli
1ec40 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
1ec50 3b 0a 20 20 69 66 28 20 74 72 69 70 43 6f 64 65  ;.  if( tripCode
1ec60 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1ec70 20 20 20 72 63 20 3d 20 74 72 69 70 43 6f 64 65     rc = tripCode
1ec80 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72   = saveAllCursor
1ec90 73 28 70 42 74 2c 20 30 2c 20 30 29 3b 0a 20 20  s(pBt, 0, 0);.  
1eca0 20 20 69 66 28 20 72 63 20 29 20 77 72 69 74 65    if( rc ) write
1ecb0 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  Only = 0;.  }els
1ecc0 65 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  e{.    rc = SQLI
1ecd0 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28  TE_OK;.  }.  if(
1ece0 20 74 72 69 70 43 6f 64 65 20 29 7b 0a 20 20 20   tripCode ){.   
1ecf0 20 69 6e 74 20 72 63 32 20 3d 20 73 71 6c 69 74   int rc2 = sqlit
1ed00 65 33 42 74 72 65 65 54 72 69 70 41 6c 6c 43 75  e3BtreeTripAllCu
1ed10 72 73 6f 72 73 28 70 2c 20 74 72 69 70 43 6f 64  rsors(p, tripCod
1ed20 65 2c 20 77 72 69 74 65 4f 6e 6c 79 29 3b 0a 20  e, writeOnly);. 
1ed30 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53     assert( rc==S
1ed40 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 77 72 69  QLITE_OK || (wri
1ed50 74 65 4f 6e 6c 79 3d 3d 30 20 26 26 20 72 63 32  teOnly==0 && rc2
1ed60 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 29 3b 0a  ==SQLITE_OK) );.
1ed70 20 20 20 20 69 66 28 20 72 63 32 21 3d 53 51 4c      if( rc2!=SQL
1ed80 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20 72 63  ITE_OK ) rc = rc
1ed90 32 3b 0a 20 20 7d 0a 20 20 62 74 72 65 65 49 6e  2;.  }.  btreeIn
1eda0 74 65 67 72 69 74 79 28 70 29 3b 0a 0a 20 20 69  tegrity(p);..  i
1edb0 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  f( p->inTrans==T
1edc0 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20  RANS_WRITE ){.  
1edd0 20 20 69 6e 74 20 72 63 32 3b 0a 0a 20 20 20 20    int rc2;..    
1ede0 61 73 73 65 72 74 28 20 54 52 41 4e 53 5f 57 52  assert( TRANS_WR
1edf0 49 54 45 3d 3d 70 42 74 2d 3e 69 6e 54 72 61 6e  ITE==pBt->inTran
1ee00 73 61 63 74 69 6f 6e 20 29 3b 0a 20 20 20 20 72  saction );.    r
1ee10 63 32 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  c2 = sqlite3Page
1ee20 72 52 6f 6c 6c 62 61 63 6b 28 70 42 74 2d 3e 70  rRollback(pBt->p
1ee30 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20  Pager);.    if( 
1ee40 72 63 32 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  rc2!=SQLITE_OK )
1ee50 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 72 63 32  {.      rc = rc2
1ee60 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
1ee70 54 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6d 61 79  The rollback may
1ee80 20 68 61 76 65 20 64 65 73 74 72 6f 79 65 64 20   have destroyed 
1ee90 74 68 65 20 70 50 61 67 65 31 2d 3e 61 44 61 74  the pPage1->aDat
1eea0 61 20 76 61 6c 75 65 2e 20 20 53 6f 0a 20 20 20  a value.  So.   
1eeb0 20 2a 2a 20 63 61 6c 6c 20 62 74 72 65 65 47 65   ** call btreeGe
1eec0 74 50 61 67 65 28 29 20 6f 6e 20 70 61 67 65 20  tPage() on page 
1eed0 31 20 61 67 61 69 6e 20 74 6f 20 6d 61 6b 65 0a  1 again to make.
1eee0 20 20 20 20 2a 2a 20 73 75 72 65 20 70 50 61 67      ** sure pPag
1eef0 65 31 2d 3e 61 44 61 74 61 20 69 73 20 73 65 74  e1->aData is set
1ef00 20 63 6f 72 72 65 63 74 6c 79 2e 20 2a 2f 0a 20   correctly. */. 
1ef10 20 20 20 69 66 28 20 62 74 72 65 65 47 65 74 50     if( btreeGetP
1ef20 61 67 65 28 70 42 74 2c 20 31 2c 20 26 70 50 61  age(pBt, 1, &pPa
1ef30 67 65 31 2c 20 30 29 3d 3d 53 51 4c 49 54 45 5f  ge1, 0)==SQLITE_
1ef40 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  OK ){.      int 
1ef50 6e 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65  nPage = get4byte
1ef60 28 32 38 2b 28 75 38 2a 29 70 50 61 67 65 31 2d  (28+(u8*)pPage1-
1ef70 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 20 20 74  >aData);.      t
1ef80 65 73 74 63 61 73 65 28 20 6e 50 61 67 65 3d 3d  estcase( nPage==
1ef90 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e  0 );.      if( n
1efa0 50 61 67 65 3d 3d 30 20 29 20 73 71 6c 69 74 65  Page==0 ) sqlite
1efb0 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  3PagerPagecount(
1efc0 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 6e 50  pBt->pPager, &nP
1efd0 61 67 65 29 3b 0a 20 20 20 20 20 20 74 65 73 74  age);.      test
1efe0 63 61 73 65 28 20 70 42 74 2d 3e 6e 50 61 67 65  case( pBt->nPage
1eff0 21 3d 6e 50 61 67 65 20 29 3b 0a 20 20 20 20 20  !=nPage );.     
1f000 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 6e 50   pBt->nPage = nP
1f010 61 67 65 3b 0a 20 20 20 20 20 20 72 65 6c 65 61  age;.      relea
1f020 73 65 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a  sePage(pPage1);.
1f030 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
1f040 28 20 63 6f 75 6e 74 56 61 6c 69 64 43 75 72 73  ( countValidCurs
1f050 6f 72 73 28 70 42 74 2c 20 31 29 3d 3d 30 20 29  ors(pBt, 1)==0 )
1f060 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61  ;.    pBt->inTra
1f070 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53  nsaction = TRANS
1f080 5f 52 45 41 44 3b 0a 20 20 20 20 62 74 72 65 65  _READ;.    btree
1f090 43 6c 65 61 72 48 61 73 43 6f 6e 74 65 6e 74 28  ClearHasContent(
1f0a0 70 42 74 29 3b 0a 20 20 7d 0a 0a 20 20 62 74 72  pBt);.  }..  btr
1f0b0 65 65 45 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e  eeEndTransaction
1f0c0 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  (p);.  sqlite3Bt
1f0d0 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
1f0e0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1f0f0 2a 2a 20 53 74 61 72 74 20 61 20 73 74 61 74 65  ** Start a state
1f100 6d 65 6e 74 20 73 75 62 74 72 61 6e 73 61 63 74  ment subtransact
1f110 69 6f 6e 2e 20 54 68 65 20 73 75 62 74 72 61 6e  ion. The subtran
1f120 73 61 63 74 69 6f 6e 20 63 61 6e 20 62 65 20 72  saction can be r
1f130 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20 69 6e  olled.** back in
1f140 64 65 70 65 6e 64 65 6e 74 6c 79 20 6f 66 20 74  dependently of t
1f150 68 65 20 6d 61 69 6e 20 74 72 61 6e 73 61 63 74  he main transact
1f160 69 6f 6e 2e 20 59 6f 75 20 6d 75 73 74 20 73 74  ion. You must st
1f170 61 72 74 20 61 20 74 72 61 6e 73 61 63 74 69 6f  art a transactio
1f180 6e 20 0a 2a 2a 20 62 65 66 6f 72 65 20 73 74 61  n .** before sta
1f190 72 74 69 6e 67 20 61 20 73 75 62 74 72 61 6e 73  rting a subtrans
1f1a0 61 63 74 69 6f 6e 2e 20 54 68 65 20 73 75 62 74  action. The subt
1f1b0 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 65 6e  ransaction is en
1f1c0 64 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  ded automaticall
1f1d0 79 20 0a 2a 2a 20 69 66 20 74 68 65 20 6d 61 69  y .** if the mai
1f1e0 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f  n transaction co
1f1f0 6d 6d 69 74 73 20 6f 72 20 72 6f 6c 6c 73 20 62  mmits or rolls b
1f200 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 74 61 74 65  ack..**.** State
1f210 6d 65 6e 74 20 73 75 62 74 72 61 6e 73 61 63 74  ment subtransact
1f220 69 6f 6e 73 20 61 72 65 20 75 73 65 64 20 61 72  ions are used ar
1f230 6f 75 6e 64 20 69 6e 64 69 76 69 64 75 61 6c 20  ound individual 
1f240 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a  SQL statements.*
1f250 2a 20 74 68 61 74 20 61 72 65 20 63 6f 6e 74 61  * that are conta
1f260 69 6e 65 64 20 77 69 74 68 69 6e 20 61 20 42 45  ined within a BE
1f270 47 49 4e 2e 2e 2e 43 4f 4d 4d 49 54 20 62 6c 6f  GIN...COMMIT blo
1f280 63 6b 2e 20 20 49 66 20 61 20 63 6f 6e 73 74 72  ck.  If a constr
1f290 61 69 6e 74 0a 2a 2a 20 65 72 72 6f 72 20 6f 63  aint.** error oc
1f2a0 63 75 72 73 20 77 69 74 68 69 6e 20 74 68 65 20  curs within the 
1f2b0 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 20 65  statement, the e
1f2c0 66 66 65 63 74 20 6f 66 20 74 68 61 74 20 6f 6e  ffect of that on
1f2d0 65 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 63  e statement.** c
1f2e0 61 6e 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  an be rolled bac
1f2f0 6b 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67  k without having
1f300 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65   to rollback the
1f310 20 65 6e 74 69 72 65 20 74 72 61 6e 73 61 63 74   entire transact
1f320 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20 73 74 61  ion..**.** A sta
1f330 74 65 6d 65 6e 74 20 73 75 62 2d 74 72 61 6e 73  tement sub-trans
1f340 61 63 74 69 6f 6e 20 69 73 20 69 6d 70 6c 65 6d  action is implem
1f350 65 6e 74 65 64 20 61 73 20 61 6e 20 61 6e 6f 6e  ented as an anon
1f360 79 6d 6f 75 73 20 73 61 76 65 70 6f 69 6e 74 2e  ymous savepoint.
1f370 20 54 68 65 0a 2a 2a 20 76 61 6c 75 65 20 70 61   The.** value pa
1f380 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
1f390 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  nd parameter is 
1f3a0 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72  the total number
1f3b0 20 6f 66 20 73 61 76 65 70 6f 69 6e 74 73 2c 0a   of savepoints,.
1f3c0 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65  ** including the
1f3d0 20 6e 65 77 20 61 6e 6f 6e 79 6d 6f 75 73 20 73   new anonymous s
1f3e0 61 76 65 70 6f 69 6e 74 2c 20 6f 70 65 6e 20 6f  avepoint, open o
1f3f0 6e 20 74 68 65 20 42 2d 54 72 65 65 2e 20 69 2e  n the B-Tree. i.
1f400 65 2e 20 69 66 20 74 68 65 72 65 0a 2a 2a 20 61  e. if there.** a
1f410 72 65 20 6e 6f 20 61 63 74 69 76 65 20 73 61 76  re no active sav
1f420 65 70 6f 69 6e 74 73 20 61 6e 64 20 6e 6f 20 6f  epoints and no o
1f430 74 68 65 72 20 73 74 61 74 65 6d 65 6e 74 2d 74  ther statement-t
1f440 72 61 6e 73 61 63 74 69 6f 6e 73 20 6f 70 65 6e  ransactions open
1f450 2c 0a 2a 2a 20 69 53 74 61 74 65 6d 65 6e 74 20  ,.** iStatement 
1f460 69 73 20 31 2e 20 54 68 69 73 20 61 6e 6f 6e 79  is 1. This anony
1f470 6d 6f 75 73 20 73 61 76 65 70 6f 69 6e 74 20 63  mous savepoint c
1f480 61 6e 20 62 65 20 72 65 6c 65 61 73 65 64 20 6f  an be released o
1f490 72 20 72 6f 6c 6c 65 64 20 62 61 63 6b 0a 2a 2a  r rolled back.**
1f4a0 20 75 73 69 6e 67 20 74 68 65 20 73 71 6c 69 74   using the sqlit
1f4b0 65 33 42 74 72 65 65 53 61 76 65 70 6f 69 6e 74  e3BtreeSavepoint
1f4c0 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  () function..*/.
1f4d0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
1f4e0 42 65 67 69 6e 53 74 6d 74 28 42 74 72 65 65 20  BeginStmt(Btree 
1f4f0 2a 70 2c 20 69 6e 74 20 69 53 74 61 74 65 6d 65  *p, int iStateme
1f500 6e 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  nt){.  int rc;. 
1f510 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
1f520 20 70 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74   p->pBt;.  sqlit
1f530 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
1f540 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 6e  .  assert( p->in
1f550 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49  Trans==TRANS_WRI
1f560 54 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  TE );.  assert( 
1f570 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26  (pBt->btsFlags &
1f580 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 29 3d   BTS_READ_ONLY)=
1f590 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
1f5a0 69 53 74 61 74 65 6d 65 6e 74 3e 30 20 29 3b 0a  iStatement>0 );.
1f5b0 20 20 61 73 73 65 72 74 28 20 69 53 74 61 74 65    assert( iState
1f5c0 6d 65 6e 74 3e 70 2d 3e 64 62 2d 3e 6e 53 61 76  ment>p->db->nSav
1f5d0 65 70 6f 69 6e 74 20 29 3b 0a 20 20 61 73 73 65  epoint );.  asse
1f5e0 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73  rt( pBt->inTrans
1f5f0 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52  action==TRANS_WR
1f600 49 54 45 20 29 3b 0a 20 20 2f 2a 20 41 74 20 74  ITE );.  /* At t
1f610 68 65 20 70 61 67 65 72 20 6c 65 76 65 6c 2c 20  he pager level, 
1f620 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  a statement tran
1f630 73 61 63 74 69 6f 6e 20 69 73 20 61 20 73 61 76  saction is a sav
1f640 65 70 6f 69 6e 74 20 77 69 74 68 0a 20 20 2a 2a  epoint with.  **
1f650 20 61 6e 20 69 6e 64 65 78 20 67 72 65 61 74 65   an index greate
1f660 72 20 74 68 61 6e 20 61 6c 6c 20 73 61 76 65 70  r than all savep
1f670 6f 69 6e 74 73 20 63 72 65 61 74 65 64 20 65 78  oints created ex
1f680 70 6c 69 63 69 74 6c 79 20 75 73 69 6e 67 0a 20  plicitly using. 
1f690 20 2a 2a 20 53 51 4c 20 73 74 61 74 65 6d 65 6e   ** SQL statemen
1f6a0 74 73 2e 20 49 74 20 69 73 20 69 6c 6c 65 67 61  ts. It is illega
1f6b0 6c 20 74 6f 20 6f 70 65 6e 2c 20 72 65 6c 65 61  l to open, relea
1f6c0 73 65 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 61  se or rollback a
1f6d0 6e 79 0a 20 20 2a 2a 20 73 75 63 68 20 73 61 76  ny.  ** such sav
1f6e0 65 70 6f 69 6e 74 73 20 77 68 69 6c 65 20 74 68  epoints while th
1f6f0 65 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  e statement tran
1f700 73 61 63 74 69 6f 6e 20 73 61 76 65 70 6f 69 6e  saction savepoin
1f710 74 20 69 73 20 61 63 74 69 76 65 2e 0a 20 20 2a  t is active..  *
1f720 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  /.  rc = sqlite3
1f730 50 61 67 65 72 4f 70 65 6e 53 61 76 65 70 6f 69  PagerOpenSavepoi
1f740 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  nt(pBt->pPager, 
1f750 69 53 74 61 74 65 6d 65 6e 74 29 3b 0a 20 20 73  iStatement);.  s
1f760 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
1f770 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
1f780 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73  ;.}../*.** The s
1f790 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74  econd argument t
1f7a0 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c  o this function,
1f7b0 20 6f 70 2c 20 69 73 20 61 6c 77 61 79 73 20 53   op, is always S
1f7c0 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
1f7d0 4b 0a 2a 2a 20 6f 72 20 53 41 56 45 50 4f 49 4e  K.** or SAVEPOIN
1f7e0 54 5f 52 45 4c 45 41 53 45 2e 20 54 68 69 73 20  T_RELEASE. This 
1f7f0 66 75 6e 63 74 69 6f 6e 20 65 69 74 68 65 72 20  function either 
1f800 72 65 6c 65 61 73 65 73 20 6f 72 20 72 6f 6c 6c  releases or roll
1f810 73 20 62 61 63 6b 20 74 68 65 0a 2a 2a 20 73 61  s back the.** sa
1f820 76 65 70 6f 69 6e 74 20 69 64 65 6e 74 69 66 69  vepoint identifi
1f830 65 64 20 62 79 20 70 61 72 61 6d 65 74 65 72 20  ed by parameter 
1f840 69 53 61 76 65 70 6f 69 6e 74 2c 20 64 65 70 65  iSavepoint, depe
1f850 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20 76 61 6c  nding on the val
1f860 75 65 20 0a 2a 2a 20 6f 66 20 6f 70 2e 0a 2a 2a  ue .** of op..**
1f870 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69 53  .** Normally, iS
1f880 61 76 65 70 6f 69 6e 74 20 69 73 20 67 72 65 61  avepoint is grea
1f890 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ter than or equa
1f8a0 6c 20 74 6f 20 7a 65 72 6f 2e 20 48 6f 77 65 76  l to zero. Howev
1f8b0 65 72 2c 20 69 66 20 6f 70 20 69 73 0a 2a 2a 20  er, if op is.** 
1f8c0 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
1f8d0 43 4b 2c 20 74 68 65 6e 20 69 53 61 76 65 70 6f  CK, then iSavepo
1f8e0 69 6e 74 20 6d 61 79 20 61 6c 73 6f 20 62 65 20  int may also be 
1f8f0 2d 31 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  -1. In this case
1f900 20 74 68 65 20 0a 2a 2a 20 63 6f 6e 74 65 6e 74   the .** content
1f910 73 20 6f 66 20 74 68 65 20 65 6e 74 69 72 65 20  s of the entire 
1f920 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 72 65 20  transaction are 
1f930 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 54 68 69  rolled back. Thi
1f940 73 20 69 73 20 64 69 66 66 65 72 65 6e 74 0a 2a  s is different.*
1f950 2a 20 66 72 6f 6d 20 61 20 6e 6f 72 6d 61 6c 20  * from a normal 
1f960 74 72 61 6e 73 61 63 74 69 6f 6e 20 72 6f 6c 6c  transaction roll
1f970 62 61 63 6b 2c 20 61 73 20 6e 6f 20 6c 6f 63 6b  back, as no lock
1f980 73 20 61 72 65 20 72 65 6c 65 61 73 65 64 20 61  s are released a
1f990 6e 64 20 74 68 65 0a 2a 2a 20 74 72 61 6e 73 61  nd the.** transa
1f9a0 63 74 69 6f 6e 20 72 65 6d 61 69 6e 73 20 6f 70  ction remains op
1f9b0 65 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  en..*/.int sqlit
1f9c0 65 33 42 74 72 65 65 53 61 76 65 70 6f 69 6e 74  e3BtreeSavepoint
1f9d0 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6f  (Btree *p, int o
1f9e0 70 2c 20 69 6e 74 20 69 53 61 76 65 70 6f 69 6e  p, int iSavepoin
1f9f0 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  t){.  int rc = S
1fa00 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20  QLITE_OK;.  if( 
1fa10 70 20 26 26 20 70 2d 3e 69 6e 54 72 61 6e 73 3d  p && p->inTrans=
1fa20 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a  =TRANS_WRITE ){.
1fa30 20 20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42      BtShared *pB
1fa40 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 20 20  t = p->pBt;.    
1fa50 61 73 73 65 72 74 28 20 6f 70 3d 3d 53 41 56 45  assert( op==SAVE
1fa60 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 20 7c 7c  POINT_RELEASE ||
1fa70 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52   op==SAVEPOINT_R
1fa80 4f 4c 4c 42 41 43 4b 20 29 3b 0a 20 20 20 20 61  OLLBACK );.    a
1fa90 73 73 65 72 74 28 20 69 53 61 76 65 70 6f 69 6e  ssert( iSavepoin
1faa0 74 3e 3d 30 20 7c 7c 20 28 69 53 61 76 65 70 6f  t>=0 || (iSavepo
1fab0 69 6e 74 3d 3d 2d 31 20 26 26 20 6f 70 3d 3d 53  int==-1 && op==S
1fac0 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
1fad0 4b 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  K) );.    sqlite
1fae0 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
1faf0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1fb00 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 28 70  PagerSavepoint(p
1fb10 42 74 2d 3e 70 50 61 67 65 72 2c 20 6f 70 2c 20  Bt->pPager, op, 
1fb20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20  iSavepoint);.   
1fb30 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1fb40 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  OK ){.      if( 
1fb50 69 53 61 76 65 70 6f 69 6e 74 3c 30 20 26 26 20  iSavepoint<0 && 
1fb60 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26  (pBt->btsFlags &
1fb70 20 42 54 53 5f 49 4e 49 54 49 41 4c 4c 59 5f 45   BTS_INITIALLY_E
1fb80 4d 50 54 59 29 21 3d 30 20 29 7b 0a 20 20 20 20  MPTY)!=0 ){.    
1fb90 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d      pBt->nPage =
1fba0 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
1fbb0 20 20 72 63 20 3d 20 6e 65 77 44 61 74 61 62 61    rc = newDataba
1fbc0 73 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20 70  se(pBt);.      p
1fbd0 42 74 2d 3e 6e 50 61 67 65 20 3d 20 67 65 74 34  Bt->nPage = get4
1fbe0 62 79 74 65 28 32 38 20 2b 20 70 42 74 2d 3e 70  byte(28 + pBt->p
1fbf0 50 61 67 65 31 2d 3e 61 44 61 74 61 29 3b 0a 0a  Page1->aData);..
1fc00 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74        /* The dat
1fc10 61 62 61 73 65 20 73 69 7a 65 20 77 61 73 20 77  abase size was w
1fc20 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
1fc30 6f 66 66 73 65 74 20 32 38 20 6f 66 20 74 68 65  offset 28 of the
1fc40 20 68 65 61 64 65 72 0a 20 20 20 20 20 20 2a 2a   header.      **
1fc50 20 77 68 65 6e 20 74 68 65 20 74 72 61 6e 73 61   when the transa
1fc60 63 74 69 6f 6e 20 73 74 61 72 74 65 64 2c 20 73  ction started, s
1fc70 6f 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74  o we know that t
1fc80 68 65 20 76 61 6c 75 65 20 61 74 20 6f 66 66 73  he value at offs
1fc90 65 74 0a 20 20 20 20 20 20 2a 2a 20 32 38 20 69  et.      ** 28 i
1fca0 73 20 6e 6f 6e 7a 65 72 6f 2e 20 2a 2f 0a 20 20  s nonzero. */.  
1fcb0 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
1fcc0 3e 6e 50 61 67 65 3e 30 20 29 3b 0a 20 20 20 20  >nPage>0 );.    
1fcd0 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  }.    sqlite3Btr
1fce0 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a  eeLeave(p);.  }.
1fcf0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1fd00 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e  /*.** Create a n
1fd10 65 77 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68  ew cursor for th
1fd20 65 20 42 54 72 65 65 20 77 68 6f 73 65 20 72 6f  e BTree whose ro
1fd30 6f 74 20 69 73 20 6f 6e 20 74 68 65 20 70 61 67  ot is on the pag
1fd40 65 0a 2a 2a 20 69 54 61 62 6c 65 2e 20 49 66 20  e.** iTable. If 
1fd50 61 20 72 65 61 64 2d 6f 6e 6c 79 20 63 75 72 73  a read-only curs
1fd60 6f 72 20 69 73 20 72 65 71 75 65 73 74 65 64 2c  or is requested,
1fd70 20 69 74 20 69 73 20 61 73 73 75 6d 65 64 20 74   it is assumed t
1fd80 68 61 74 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65  hat.** the calle
1fd90 72 20 61 6c 72 65 61 64 79 20 68 61 73 20 61 74  r already has at
1fda0 20 6c 65 61 73 74 20 61 20 72 65 61 64 2d 6f 6e   least a read-on
1fdb0 6c 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f  ly transaction o
1fdc0 70 65 6e 0a 2a 2a 20 6f 6e 20 74 68 65 20 64 61  pen.** on the da
1fdd0 74 61 62 61 73 65 20 61 6c 72 65 61 64 79 2e 20  tabase already. 
1fde0 49 66 20 61 20 77 72 69 74 65 2d 63 75 72 73 6f  If a write-curso
1fdf0 72 20 69 73 20 72 65 71 75 65 73 74 65 64 2c 20  r is requested, 
1fe00 74 68 65 6e 0a 2a 2a 20 74 68 65 20 63 61 6c 6c  then.** the call
1fe10 65 72 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f  er is assumed to
1fe20 20 68 61 76 65 20 61 6e 20 6f 70 65 6e 20 77 72   have an open wr
1fe30 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ite transaction.
1fe40 0a 2a 2a 0a 2a 2a 20 49 66 20 77 72 46 6c 61 67  .**.** If wrFlag
1fe50 3d 3d 30 2c 20 74 68 65 6e 20 74 68 65 20 63 75  ==0, then the cu
1fe60 72 73 6f 72 20 63 61 6e 20 6f 6e 6c 79 20 62 65  rsor can only be
1fe70 20 75 73 65 64 20 66 6f 72 20 72 65 61 64 69 6e   used for readin
1fe80 67 2e 0a 2a 2a 20 49 66 20 77 72 46 6c 61 67 3d  g..** If wrFlag=
1fe90 3d 31 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72  =1, then the cur
1fea0 73 6f 72 20 63 61 6e 20 62 65 20 75 73 65 64 20  sor can be used 
1feb0 66 6f 72 20 72 65 61 64 69 6e 67 20 6f 72 20 66  for reading or f
1fec0 6f 72 0a 2a 2a 20 77 72 69 74 69 6e 67 20 69 66  or.** writing if
1fed0 20 6f 74 68 65 72 20 63 6f 6e 64 69 74 69 6f 6e   other condition
1fee0 73 20 66 6f 72 20 77 72 69 74 69 6e 67 20 61 72  s for writing ar
1fef0 65 20 61 6c 73 6f 20 6d 65 74 2e 20 20 54 68 65  e also met.  The
1ff00 73 65 0a 2a 2a 20 61 72 65 20 74 68 65 20 63 6f  se.** are the co
1ff10 6e 64 69 74 69 6f 6e 73 20 74 68 61 74 20 6d 75  nditions that mu
1ff20 73 74 20 62 65 20 6d 65 74 20 69 6e 20 6f 72 64  st be met in ord
1ff30 65 72 20 66 6f 72 20 77 72 69 74 69 6e 67 20 74  er for writing t
1ff40 6f 0a 2a 2a 20 62 65 20 61 6c 6c 6f 77 65 64 3a  o.** be allowed:
1ff50 0a 2a 2a 0a 2a 2a 20 31 3a 20 20 54 68 65 20 63  .**.** 1:  The c
1ff60 75 72 73 6f 72 20 6d 75 73 74 20 68 61 76 65 20  ursor must have 
1ff70 62 65 65 6e 20 6f 70 65 6e 65 64 20 77 69 74 68  been opened with
1ff80 20 77 72 46 6c 61 67 3d 3d 31 0a 2a 2a 0a 2a 2a   wrFlag==1.**.**
1ff90 20 32 3a 20 20 4f 74 68 65 72 20 64 61 74 61 62   2:  Other datab
1ffa0 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20  ase connections 
1ffb0 74 68 61 74 20 73 68 61 72 65 20 74 68 65 20 73  that share the s
1ffc0 61 6d 65 20 70 61 67 65 72 20 63 61 63 68 65 0a  ame pager cache.
1ffd0 2a 2a 20 20 20 20 20 62 75 74 20 77 68 69 63 68  **     but which
1ffe0 20 61 72 65 20 6e 6f 74 20 69 6e 20 74 68 65 20   are not in the 
1fff0 52 45 41 44 5f 55 4e 43 4f 4d 4d 49 54 54 45 44  READ_UNCOMMITTED
20000 20 73 74 61 74 65 20 6d 61 79 20 6e 6f 74 20 68   state may not h
20010 61 76 65 0a 2a 2a 20 20 20 20 20 63 75 72 73 6f  ave.**     curso
20020 72 73 20 6f 70 65 6e 20 77 69 74 68 20 77 72 46  rs open with wrF
20030 6c 61 67 3d 3d 30 20 6f 6e 20 74 68 65 20 73 61  lag==0 on the sa
20040 6d 65 20 74 61 62 6c 65 2e 20 20 4f 74 68 65 72  me table.  Other
20050 77 69 73 65 0a 2a 2a 20 20 20 20 20 74 68 65 20  wise.**     the 
20060 63 68 61 6e 67 65 73 20 6d 61 64 65 20 62 79 20  changes made by 
20070 74 68 69 73 20 77 72 69 74 65 20 63 75 72 73 6f  this write curso
20080 72 20 77 6f 75 6c 64 20 62 65 20 76 69 73 69 62  r would be visib
20090 6c 65 20 74 6f 0a 2a 2a 20 20 20 20 20 74 68 65  le to.**     the
200a0 20 72 65 61 64 20 63 75 72 73 6f 72 73 20 69 6e   read cursors in
200b0 20 74 68 65 20 6f 74 68 65 72 20 64 61 74 61 62   the other datab
200c0 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a  ase connection..
200d0 2a 2a 0a 2a 2a 20 33 3a 20 20 54 68 65 20 64 61  **.** 3:  The da
200e0 74 61 62 61 73 65 20 6d 75 73 74 20 62 65 20 77  tabase must be w
200f0 72 69 74 61 62 6c 65 20 28 6e 6f 74 20 6f 6e 20  ritable (not on 
20100 72 65 61 64 2d 6f 6e 6c 79 20 6d 65 64 69 61 29  read-only media)
20110 0a 2a 2a 0a 2a 2a 20 34 3a 20 20 54 68 65 72 65  .**.** 4:  There
20120 20 6d 75 73 74 20 62 65 20 61 6e 20 61 63 74 69   must be an acti
20130 76 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  ve transaction..
20140 2a 2a 0a 2a 2a 20 4e 6f 20 63 68 65 63 6b 69 6e  **.** No checkin
20150 67 20 69 73 20 64 6f 6e 65 20 74 6f 20 6d 61 6b  g is done to mak
20160 65 20 73 75 72 65 20 74 68 61 74 20 70 61 67 65  e sure that page
20170 20 69 54 61 62 6c 65 20 72 65 61 6c 6c 79 20 69   iTable really i
20180 73 20 74 68 65 0a 2a 2a 20 72 6f 6f 74 20 70 61  s the.** root pa
20190 67 65 20 6f 66 20 61 20 62 2d 74 72 65 65 2e 20  ge of a b-tree. 
201a0 20 49 66 20 69 74 20 69 73 20 6e 6f 74 2c 20 74   If it is not, t
201b0 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20 61  hen the cursor a
201c0 63 71 75 69 72 65 64 0a 2a 2a 20 77 69 6c 6c 20  cquired.** will 
201d0 6e 6f 74 20 77 6f 72 6b 20 63 6f 72 72 65 63 74  not work correct
201e0 6c 79 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20  ly..**.** It is 
201f0 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65  assumed that the
20200 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
20210 73 6f 72 5a 65 72 6f 28 29 20 68 61 73 20 62 65  sorZero() has be
20220 65 6e 20 63 61 6c 6c 65 64 0a 2a 2a 20 6f 6e 20  en called.** on 
20230 70 43 75 72 20 74 6f 20 69 6e 69 74 69 61 6c 69  pCur to initiali
20240 7a 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 73 70  ze the memory sp
20250 61 63 65 20 70 72 69 6f 72 20 74 6f 20 69 6e 76  ace prior to inv
20260 6f 6b 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69  oking this routi
20270 6e 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ne..*/.static in
20280 74 20 62 74 72 65 65 43 75 72 73 6f 72 28 0a 20  t btreeCursor(. 
20290 20 42 74 72 65 65 20 2a 70 2c 20 20 20 20 20 20   Btree *p,      
202a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
202b0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62          /* The b
202c0 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54  tree */.  int iT
202d0 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20  able,           
202e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
202f0 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66   /* Root page of
20300 20 74 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a   table to open *
20310 2f 0a 20 20 69 6e 74 20 77 72 46 6c 61 67 2c 20  /.  int wrFlag, 
20320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20330 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20             /* 1 
20340 74 6f 20 77 72 69 74 65 2e 20 30 20 72 65 61 64  to write. 0 read
20350 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74 72 75 63  -only */.  struc
20360 74 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49  t KeyInfo *pKeyI
20370 6e 66 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20  nfo,            
20380 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67 20 74    /* First arg t
20390 6f 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e  o comparison fun
203a0 63 74 69 6f 6e 20 2a 2f 0a 20 20 42 74 43 75 72  ction */.  BtCur
203b0 73 6f 72 20 2a 70 43 75 72 20 20 20 20 20 20 20  sor *pCur       
203c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
203d0 20 20 2f 2a 20 53 70 61 63 65 20 66 6f 72 20 6e    /* Space for n
203e0 65 77 20 63 75 72 73 6f 72 20 2a 2f 0a 29 7b 0a  ew cursor */.){.
203f0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
20400 3d 20 70 2d 3e 70 42 74 3b 20 20 20 20 20 20 20  = p->pBt;       
20410 20 20 20 20 20 20 20 20 20 2f 2a 20 53 68 61 72           /* Shar
20420 65 64 20 62 2d 74 72 65 65 20 68 61 6e 64 6c 65  ed b-tree handle
20430 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73   */..  assert( s
20440 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73  qlite3BtreeHolds
20450 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61 73  Mutex(p) );.  as
20460 73 65 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20  sert( wrFlag==0 
20470 7c 7c 20 77 72 46 6c 61 67 3d 3d 31 20 29 3b 0a  || wrFlag==1 );.
20480 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  .  /* The follow
20490 69 6e 67 20 61 73 73 65 72 74 20 73 74 61 74 65  ing assert state
204a0 6d 65 6e 74 73 20 76 65 72 69 66 79 20 74 68 61  ments verify tha
204b0 74 20 69 66 20 74 68 69 73 20 69 73 20 61 20 73  t if this is a s
204c0 68 61 72 61 62 6c 65 20 0a 20 20 2a 2a 20 62 2d  harable .  ** b-
204d0 74 72 65 65 20 64 61 74 61 62 61 73 65 2c 20 74  tree database, t
204e0 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73  he connection is
204f0 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 72 65 71   holding the req
20500 75 69 72 65 64 20 74 61 62 6c 65 20 6c 6f 63 6b  uired table lock
20510 73 2c 20 0a 20 20 2a 2a 20 61 6e 64 20 74 68 61  s, .  ** and tha
20520 74 20 6e 6f 20 6f 74 68 65 72 20 63 6f 6e 6e 65  t no other conne
20530 63 74 69 6f 6e 20 68 61 73 20 61 6e 79 20 6f 70  ction has any op
20540 65 6e 20 63 75 72 73 6f 72 20 74 68 61 74 20 63  en cursor that c
20550 6f 6e 66 6c 69 63 74 73 20 77 69 74 68 20 0a 20  onflicts with . 
20560 20 2a 2a 20 74 68 69 73 20 6c 6f 63 6b 2e 20 20   ** this lock.  
20570 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 68 61 73  */.  assert( has
20580 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
20590 4c 6f 63 6b 28 70 2c 20 69 54 61 62 6c 65 2c 20  Lock(p, iTable, 
205a0 70 4b 65 79 49 6e 66 6f 21 3d 30 2c 20 77 72 46  pKeyInfo!=0, wrF
205b0 6c 61 67 2b 31 29 20 29 3b 0a 20 20 61 73 73 65  lag+1) );.  asse
205c0 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c  rt( wrFlag==0 ||
205d0 20 21 68 61 73 52 65 61 64 43 6f 6e 66 6c 69 63   !hasReadConflic
205e0 74 73 28 70 2c 20 69 54 61 62 6c 65 29 20 29 3b  ts(p, iTable) );
205f0 0a 0a 20 20 2f 2a 20 41 73 73 65 72 74 20 74 68  ..  /* Assert th
20600 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61  at the caller ha
20610 73 20 6f 70 65 6e 65 64 20 74 68 65 20 72 65 71  s opened the req
20620 75 69 72 65 64 20 74 72 61 6e 73 61 63 74 69 6f  uired transactio
20630 6e 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  n. */.  assert( 
20640 70 2d 3e 69 6e 54 72 61 6e 73 3e 54 52 41 4e 53  p->inTrans>TRANS
20650 5f 4e 4f 4e 45 20 29 3b 0a 20 20 61 73 73 65 72  _NONE );.  asser
20660 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20  t( wrFlag==0 || 
20670 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  p->inTrans==TRAN
20680 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 61 73 73  S_WRITE );.  ass
20690 65 72 74 28 20 70 42 74 2d 3e 70 50 61 67 65 31  ert( pBt->pPage1
206a0 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65 31 2d   && pBt->pPage1-
206b0 3e 61 44 61 74 61 20 29 3b 0a 0a 20 20 69 66 28  >aData );..  if(
206c0 20 4e 45 56 45 52 28 77 72 46 6c 61 67 20 26 26   NEVER(wrFlag &&
206d0 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20   (pBt->btsFlags 
206e0 26 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 29  & BTS_READ_ONLY)
206f0 21 3d 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75  !=0) ){.    retu
20700 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e  rn SQLITE_READON
20710 4c 59 3b 0a 20 20 7d 0a 20 20 69 66 28 20 77 72  LY;.  }.  if( wr
20720 46 6c 61 67 20 29 7b 0a 20 20 20 20 61 6c 6c 6f  Flag ){.    allo
20730 63 61 74 65 54 65 6d 70 53 70 61 63 65 28 70 42  cateTempSpace(pB
20740 74 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d  t);.    if( pBt-
20750 3e 70 54 6d 70 53 70 61 63 65 3d 3d 30 20 29 20  >pTmpSpace==0 ) 
20760 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
20770 4d 45 4d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69  MEM;.  }.  if( i
20780 54 61 62 6c 65 3d 3d 31 20 26 26 20 62 74 72 65  Table==1 && btre
20790 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 3d  ePagecount(pBt)=
207a0 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  =0 ){.    assert
207b0 28 20 77 72 46 6c 61 67 3d 3d 30 20 29 3b 0a 20  ( wrFlag==0 );. 
207c0 20 20 20 69 54 61 62 6c 65 20 3d 20 30 3b 0a 20     iTable = 0;. 
207d0 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20 74 68 61   }..  /* Now tha
207e0 74 20 6e 6f 20 6f 74 68 65 72 20 65 72 72 6f 72  t no other error
207f0 73 20 63 61 6e 20 6f 63 63 75 72 2c 20 66 69 6e  s can occur, fin
20800 69 73 68 20 66 69 6c 6c 69 6e 67 20 69 6e 20 74  ish filling in t
20810 68 65 20 42 74 43 75 72 73 6f 72 0a 20 20 2a 2a  he BtCursor.  **
20820 20 76 61 72 69 61 62 6c 65 73 20 61 6e 64 20 6c   variables and l
20830 69 6e 6b 20 74 68 65 20 63 75 72 73 6f 72 20 69  ink the cursor i
20840 6e 74 6f 20 74 68 65 20 42 74 53 68 61 72 65 64  nto the BtShared
20850 20 6c 69 73 74 2e 20 20 2a 2f 0a 20 20 70 43 75   list.  */.  pCu
20860 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20 3d 20 28 50  r->pgnoRoot = (P
20870 67 6e 6f 29 69 54 61 62 6c 65 3b 0a 20 20 70 43  gno)iTable;.  pC
20880 75 72 2d 3e 69 50 61 67 65 20 3d 20 2d 31 3b 0a  ur->iPage = -1;.
20890 20 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f    pCur->pKeyInfo
208a0 20 3d 20 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 70   = pKeyInfo;.  p
208b0 43 75 72 2d 3e 70 42 74 72 65 65 20 3d 20 70 3b  Cur->pBtree = p;
208c0 0a 20 20 70 43 75 72 2d 3e 70 42 74 20 3d 20 70  .  pCur->pBt = p
208d0 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20 77 72  Bt;.  assert( wr
208e0 46 6c 61 67 3d 3d 30 20 7c 7c 20 77 72 46 6c 61  Flag==0 || wrFla
208f0 67 3d 3d 42 54 43 46 5f 57 72 69 74 65 46 6c 61  g==BTCF_WriteFla
20900 67 20 29 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72  g );.  pCur->cur
20910 46 6c 61 67 73 20 3d 20 77 72 46 6c 61 67 3b 0a  Flags = wrFlag;.
20920 20 20 70 43 75 72 2d 3e 70 4e 65 78 74 20 3d 20    pCur->pNext = 
20930 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20  pBt->pCursor;.  
20940 69 66 28 20 70 43 75 72 2d 3e 70 4e 65 78 74 20  if( pCur->pNext 
20950 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 70 4e 65  ){.    pCur->pNe
20960 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 43 75 72  xt->pPrev = pCur
20970 3b 0a 20 20 7d 0a 20 20 70 42 74 2d 3e 70 43 75  ;.  }.  pBt->pCu
20980 72 73 6f 72 20 3d 20 70 43 75 72 3b 0a 20 20 70  rsor = pCur;.  p
20990 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
209a0 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20  RSOR_INVALID;.  
209b0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
209c0 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  ;.}.int sqlite3B
209d0 74 72 65 65 43 75 72 73 6f 72 28 0a 20 20 42 74  treeCursor(.  Bt
209e0 72 65 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ree *p,         
209f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20a00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
20a10 20 62 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20   btree */.  int 
20a20 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20  iTable,         
20a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20a40 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20          /* Root 
20a50 70 61 67 65 20 6f 66 20 74 61 62 6c 65 20 74 6f  page of table to
20a60 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 77   open */.  int w
20a70 72 46 6c 61 67 2c 20 20 20 20 20 20 20 20 20 20  rFlag,          
20a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20a90 20 20 20 20 20 20 20 2f 2a 20 31 20 74 6f 20 77         /* 1 to w
20aa0 72 69 74 65 2e 20 30 20 72 65 61 64 2d 6f 6e 6c  rite. 0 read-onl
20ab0 79 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 4b 65  y */.  struct Ke
20ac0 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c  yInfo *pKeyInfo,
20ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20ae0 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67 20     /* First arg 
20af0 74 6f 20 78 43 6f 6d 70 61 72 65 28 29 20 2a 2f  to xCompare() */
20b00 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
20b10 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r               
20b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
20b30 2a 20 57 72 69 74 65 20 6e 65 77 20 63 75 72 73  * Write new curs
20b40 6f 72 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  or here */.){.  
20b50 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 69 54  int rc;.  if( iT
20b60 61 62 6c 65 3c 31 20 29 7b 0a 20 20 20 20 72 63  able<1 ){.    rc
20b70 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
20b80 54 5f 42 4b 50 54 3b 0a 20 20 7d 65 6c 73 65 7b  T_BKPT;.  }else{
20b90 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
20ba0 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 20 20 72  eEnter(p);.    r
20bb0 63 20 3d 20 62 74 72 65 65 43 75 72 73 6f 72 28  c = btreeCursor(
20bc0 70 2c 20 69 54 61 62 6c 65 2c 20 77 72 46 6c 61  p, iTable, wrFla
20bd0 67 2c 20 70 4b 65 79 49 6e 66 6f 2c 20 70 43 75  g, pKeyInfo, pCu
20be0 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42  r);.    sqlite3B
20bf0 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
20c00 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
20c10 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
20c20 68 65 20 73 69 7a 65 20 6f 66 20 61 20 42 74 43  he size of a BtC
20c30 75 72 73 6f 72 20 6f 62 6a 65 63 74 20 69 6e 20  ursor object in 
20c40 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  bytes..**.** Thi
20c50 73 20 69 6e 74 65 72 66 61 63 65 73 20 69 73 20  s interfaces is 
20c60 6e 65 65 64 65 64 20 73 6f 20 74 68 61 74 20 75  needed so that u
20c70 73 65 72 73 20 6f 66 20 63 75 72 73 6f 72 73 20  sers of cursors 
20c80 63 61 6e 20 70 72 65 61 6c 6c 6f 63 61 74 65 0a  can preallocate.
20c90 2a 2a 20 73 75 66 66 69 63 69 65 6e 74 20 73 74  ** sufficient st
20ca0 6f 72 61 67 65 20 74 6f 20 68 6f 6c 64 20 61 20  orage to hold a 
20cb0 63 75 72 73 6f 72 2e 20 20 54 68 65 20 42 74 43  cursor.  The BtC
20cc0 75 72 73 6f 72 20 6f 62 6a 65 63 74 20 69 73 20  ursor object is 
20cd0 6f 70 61 71 75 65 0a 2a 2a 20 74 6f 20 75 73 65  opaque.** to use
20ce0 72 73 20 73 6f 20 74 68 65 79 20 63 61 6e 6e 6f  rs so they canno
20cf0 74 20 64 6f 20 74 68 65 20 73 69 7a 65 6f 66 28  t do the sizeof(
20d00 29 20 74 68 65 6d 73 65 6c 76 65 73 20 2d 20 74  ) themselves - t
20d10 68 65 79 20 6d 75 73 74 20 63 61 6c 6c 0a 2a 2a  hey must call.**
20d20 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a   this routine..*
20d30 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
20d40 65 65 43 75 72 73 6f 72 53 69 7a 65 28 76 6f 69  eeCursorSize(voi
20d50 64 29 7b 0a 20 20 72 65 74 75 72 6e 20 52 4f 55  d){.  return ROU
20d60 4e 44 38 28 73 69 7a 65 6f 66 28 42 74 43 75 72  ND8(sizeof(BtCur
20d70 73 6f 72 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  sor));.}../*.** 
20d80 49 6e 69 74 69 61 6c 69 7a 65 20 6d 65 6d 6f 72  Initialize memor
20d90 79 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 63  y that will be c
20da0 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 61 20  onverted into a 
20db0 42 74 43 75 72 73 6f 72 20 6f 62 6a 65 63 74 2e  BtCursor object.
20dc0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 69 6d 70 6c  .**.** The simpl
20dd0 65 20 61 70 70 72 6f 61 63 68 20 68 65 72 65 20  e approach here 
20de0 77 6f 75 6c 64 20 62 65 20 74 6f 20 6d 65 6d 73  would be to mems
20df0 65 74 28 29 20 74 68 65 20 65 6e 74 69 72 65 20  et() the entire 
20e00 6f 62 6a 65 63 74 0a 2a 2a 20 74 6f 20 7a 65 72  object.** to zer
20e10 6f 2e 20 20 42 75 74 20 69 74 20 74 75 72 6e 73  o.  But it turns
20e20 20 6f 75 74 20 74 68 61 74 20 74 68 65 20 61 70   out that the ap
20e30 50 61 67 65 5b 5d 20 61 6e 64 20 61 69 49 64 78  Page[] and aiIdx
20e40 5b 5d 20 61 72 72 61 79 73 0a 2a 2a 20 64 6f 20  [] arrays.** do 
20e50 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 7a  not need to be z
20e60 65 72 6f 65 64 20 61 6e 64 20 74 68 65 79 20 61  eroed and they a
20e70 72 65 20 6c 61 72 67 65 2c 20 73 6f 20 77 65 20  re large, so we 
20e80 63 61 6e 20 73 61 76 65 20 61 20 6c 6f 74 0a 2a  can save a lot.*
20e90 2a 20 6f 66 20 72 75 6e 2d 74 69 6d 65 20 62 79  * of run-time by
20ea0 20 73 6b 69 70 70 69 6e 67 20 74 68 65 20 69 6e   skipping the in
20eb0 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 6f 66 20  itialization of 
20ec0 74 68 6f 73 65 20 65 6c 65 6d 65 6e 74 73 2e 0a  those elements..
20ed0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42  */.void sqlite3B
20ee0 74 72 65 65 43 75 72 73 6f 72 5a 65 72 6f 28 42  treeCursorZero(B
20ef0 74 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 6d  tCursor *p){.  m
20f00 65 6d 73 65 74 28 70 2c 20 30 2c 20 6f 66 66 73  emset(p, 0, offs
20f10 65 74 6f 66 28 42 74 43 75 72 73 6f 72 2c 20 69  etof(BtCursor, i
20f20 50 61 67 65 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Page));.}../*.**
20f30 20 43 6c 6f 73 65 20 61 20 63 75 72 73 6f 72 2e   Close a cursor.
20f40 20 20 54 68 65 20 72 65 61 64 20 6c 6f 63 6b 20    The read lock 
20f50 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
20f60 66 69 6c 65 20 69 73 20 72 65 6c 65 61 73 65 64  file is released
20f70 0a 2a 2a 20 77 68 65 6e 20 74 68 65 20 6c 61 73  .** when the las
20f80 74 20 63 75 72 73 6f 72 20 69 73 20 63 6c 6f 73  t cursor is clos
20f90 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
20fa0 65 33 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73  e3BtreeCloseCurs
20fb0 6f 72 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  or(BtCursor *pCu
20fc0 72 29 7b 0a 20 20 42 74 72 65 65 20 2a 70 42 74  r){.  Btree *pBt
20fd0 72 65 65 20 3d 20 70 43 75 72 2d 3e 70 42 74 72  ree = pCur->pBtr
20fe0 65 65 3b 0a 20 20 69 66 28 20 70 42 74 72 65 65  ee;.  if( pBtree
20ff0 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
21000 20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74     BtShared *pBt
21010 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b 0a 20 20   = pCur->pBt;.  
21020 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
21030 74 65 72 28 70 42 74 72 65 65 29 3b 0a 20 20 20  ter(pBtree);.   
21040 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65   sqlite3BtreeCle
21050 61 72 43 75 72 73 6f 72 28 70 43 75 72 29 3b 0a  arCursor(pCur);.
21060 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 70 50      if( pCur->pP
21070 72 65 76 20 29 7b 0a 20 20 20 20 20 20 70 43 75  rev ){.      pCu
21080 72 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 20  r->pPrev->pNext 
21090 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20  = pCur->pNext;. 
210a0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
210b0 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20 70  pBt->pCursor = p
210c0 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  Cur->pNext;.    
210d0 7d 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e  }.    if( pCur->
210e0 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20 70  pNext ){.      p
210f0 43 75 72 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65  Cur->pNext->pPre
21100 76 20 3d 20 70 43 75 72 2d 3e 70 50 72 65 76 3b  v = pCur->pPrev;
21110 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69  .    }.    for(i
21120 3d 30 3b 20 69 3c 3d 70 43 75 72 2d 3e 69 50 61  =0; i<=pCur->iPa
21130 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ge; i++){.      
21140 72 65 6c 65 61 73 65 50 61 67 65 28 70 43 75 72  releasePage(pCur
21150 2d 3e 61 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20  ->apPage[i]);.  
21160 20 20 7d 0a 20 20 20 20 75 6e 6c 6f 63 6b 42 74    }.    unlockBt
21170 72 65 65 49 66 55 6e 75 73 65 64 28 70 42 74 29  reeIfUnused(pBt)
21180 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
21190 65 65 28 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c  ee(pCur->aOverfl
211a0 6f 77 29 3b 0a 20 20 20 20 2f 2a 20 73 71 6c 69  ow);.    /* sqli
211b0 74 65 33 5f 66 72 65 65 28 70 43 75 72 29 3b 20  te3_free(pCur); 
211c0 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  */.    sqlite3Bt
211d0 72 65 65 4c 65 61 76 65 28 70 42 74 72 65 65 29  reeLeave(pBtree)
211e0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
211f0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
21200 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  ** Make sure the
21210 20 42 74 43 75 72 73 6f 72 2a 20 67 69 76 65 6e   BtCursor* given
21220 20 69 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74   in the argument
21230 20 68 61 73 20 61 20 76 61 6c 69 64 0a 2a 2a 20   has a valid.** 
21240 42 74 43 75 72 73 6f 72 2e 69 6e 66 6f 20 73 74  BtCursor.info st
21250 72 75 63 74 75 72 65 2e 20 20 49 66 20 69 74 20  ructure.  If it 
21260 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 76  is not already v
21270 61 6c 69 64 2c 20 63 61 6c 6c 0a 2a 2a 20 62 74  alid, call.** bt
21280 72 65 65 50 61 72 73 65 43 65 6c 6c 28 29 20 74  reeParseCell() t
21290 6f 20 66 69 6c 6c 20 69 74 20 69 6e 2e 0a 2a 2a  o fill it in..**
212a0 0a 2a 2a 20 42 74 43 75 72 73 6f 72 2e 69 6e 66  .** BtCursor.inf
212b0 6f 20 69 73 20 61 20 63 61 63 68 65 20 6f 66 20  o is a cache of 
212c0 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  the information 
212d0 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 63  in the current c
212e0 65 6c 6c 2e 0a 2a 2a 20 55 73 69 6e 67 20 74 68  ell..** Using th
212f0 69 73 20 63 61 63 68 65 20 72 65 64 75 63 65 73  is cache reduces
21300 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   the number of c
21310 61 6c 6c 73 20 74 6f 20 62 74 72 65 65 50 61 72  alls to btreePar
21320 73 65 43 65 6c 6c 28 29 2e 0a 2a 2a 0a 2a 2a 20  seCell()..**.** 
21330 32 30 30 37 2d 30 36 2d 32 35 3a 20 20 54 68 65  2007-06-25:  The
21340 72 65 20 69 73 20 61 20 62 75 67 20 69 6e 20 73  re is a bug in s
21350 6f 6d 65 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  ome versions of 
21360 4d 53 56 43 20 74 68 61 74 20 63 61 75 73 65 20  MSVC that cause 
21370 74 68 65 0a 2a 2a 20 63 6f 6d 70 69 6c 65 72 20  the.** compiler 
21380 74 6f 20 63 72 61 73 68 20 77 68 65 6e 20 67 65  to crash when ge
21390 74 43 65 6c 6c 49 6e 66 6f 28 29 20 69 73 20 69  tCellInfo() is i
213a0 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 61 20  mplemented as a 
213b0 6d 61 63 72 6f 2e 0a 2a 2a 20 42 75 74 20 74 68  macro..** But th
213c0 65 72 65 20 69 73 20 61 20 6d 65 61 73 75 72 65  ere is a measure
213d0 61 62 6c 65 20 73 70 65 65 64 20 61 64 76 61 6e  able speed advan
213e0 74 61 67 65 20 74 6f 20 75 73 69 6e 67 20 74 68  tage to using th
213f0 65 20 6d 61 63 72 6f 20 6f 6e 20 67 63 63 0a 2a  e macro on gcc.*
21400 2a 20 28 77 68 65 6e 20 6c 65 73 73 20 63 6f 6d  * (when less com
21410 70 69 6c 65 72 20 6f 70 74 69 6d 69 7a 61 74 69  piler optimizati
21420 6f 6e 73 20 6c 69 6b 65 20 2d 4f 73 20 6f 72 20  ons like -Os or 
21430 2d 4f 30 20 61 72 65 20 75 73 65 64 20 61 6e 64  -O0 are used and
21440 20 74 68 65 0a 2a 2a 20 63 6f 6d 70 69 6c 65 72   the.** compiler
21450 20 69 73 20 6e 6f 74 20 64 6f 69 6e 67 20 61 67   is not doing ag
21460 67 72 65 73 73 69 76 65 20 69 6e 6c 69 6e 69 6e  gressive inlinin
21470 67 2e 29 20 20 53 6f 20 77 65 20 75 73 65 20 61  g.)  So we use a
21480 20 72 65 61 6c 20 66 75 6e 63 74 69 6f 6e 0a 2a   real function.*
21490 2a 20 66 6f 72 20 4d 53 56 43 20 61 6e 64 20 61  * for MSVC and a
214a0 20 6d 61 63 72 6f 20 66 6f 72 20 65 76 65 72 79   macro for every
214b0 74 68 69 6e 67 20 65 6c 73 65 2e 20 20 54 69 63  thing else.  Tic
214c0 6b 65 74 20 23 32 34 35 37 2e 0a 2a 2f 0a 23 69  ket #2457..*/.#i
214d0 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 73  fndef NDEBUG.  s
214e0 74 61 74 69 63 20 76 6f 69 64 20 61 73 73 65 72  tatic void asser
214f0 74 43 65 6c 6c 49 6e 66 6f 28 42 74 43 75 72 73  tCellInfo(BtCurs
21500 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 20 20 43  or *pCur){.    C
21510 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20  ellInfo info;.  
21520 20 20 69 6e 74 20 69 50 61 67 65 20 3d 20 70 43    int iPage = pC
21530 75 72 2d 3e 69 50 61 67 65 3b 0a 20 20 20 20 6d  ur->iPage;.    m
21540 65 6d 73 65 74 28 26 69 6e 66 6f 2c 20 30 2c 20  emset(&info, 0, 
21550 73 69 7a 65 6f 66 28 69 6e 66 6f 29 29 3b 0a 20  sizeof(info));. 
21560 20 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c     btreeParseCel
21570 6c 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69  l(pCur->apPage[i
21580 50 61 67 65 5d 2c 20 70 43 75 72 2d 3e 61 69 49  Page], pCur->aiI
21590 64 78 5b 69 50 61 67 65 5d 2c 20 26 69 6e 66 6f  dx[iPage], &info
215a0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 43  );.    assert( C
215b0 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20 6d 65 6d  ORRUPT_DB || mem
215c0 63 6d 70 28 26 69 6e 66 6f 2c 20 26 70 43 75 72  cmp(&info, &pCur
215d0 2d 3e 69 6e 66 6f 2c 20 73 69 7a 65 6f 66 28 69  ->info, sizeof(i
215e0 6e 66 6f 29 29 3d 3d 30 20 29 3b 0a 20 20 7d 0a  nfo))==0 );.  }.
215f0 23 65 6c 73 65 0a 20 20 23 64 65 66 69 6e 65 20  #else.  #define 
21600 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28 78  assertCellInfo(x
21610 29 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20  ).#endif.#ifdef 
21620 5f 4d 53 43 5f 56 45 52 0a 20 20 2f 2a 20 55 73  _MSC_VER.  /* Us
21630 65 20 61 20 72 65 61 6c 20 66 75 6e 63 74 69 6f  e a real functio
21640 6e 20 69 6e 20 4d 53 56 43 20 74 6f 20 77 6f 72  n in MSVC to wor
21650 6b 20 61 72 6f 75 6e 64 20 62 75 67 73 20 69 6e  k around bugs in
21660 20 74 68 61 74 20 63 6f 6d 70 69 6c 65 72 2e 20   that compiler. 
21670 2a 2f 0a 20 20 73 74 61 74 69 63 20 76 6f 69 64  */.  static void
21680 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 42 74 43   getCellInfo(BtC
21690 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
216a0 20 20 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f    if( pCur->info
216b0 2e 6e 53 69 7a 65 3d 3d 30 20 29 7b 0a 20 20 20  .nSize==0 ){.   
216c0 20 20 20 69 6e 74 20 69 50 61 67 65 20 3d 20 70     int iPage = p
216d0 43 75 72 2d 3e 69 50 61 67 65 3b 0a 20 20 20 20  Cur->iPage;.    
216e0 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c    btreeParseCell
216f0 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 50  (pCur->apPage[iP
21700 61 67 65 5d 2c 70 43 75 72 2d 3e 61 69 49 64 78  age],pCur->aiIdx
21710 5b 69 50 61 67 65 5d 2c 26 70 43 75 72 2d 3e 69  [iPage],&pCur->i
21720 6e 66 6f 29 3b 0a 20 20 20 20 20 20 70 43 75 72  nfo);.      pCur
21730 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20 42 54  ->curFlags |= BT
21740 43 46 5f 56 61 6c 69 64 4e 4b 65 79 3b 0a 20 20  CF_ValidNKey;.  
21750 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
21760 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28 70 43  ssertCellInfo(pC
21770 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  ur);.    }.  }.#
21780 65 6c 73 65 20 2f 2a 20 69 66 20 6e 6f 74 20 5f  else /* if not _
21790 4d 53 43 5f 56 45 52 20 2a 2f 0a 20 20 2f 2a 20  MSC_VER */.  /* 
217a0 55 73 65 20 61 20 6d 61 63 72 6f 20 69 6e 20 61  Use a macro in a
217b0 6c 6c 20 6f 74 68 65 72 20 63 6f 6d 70 69 6c 65  ll other compile
217c0 72 73 20 73 6f 20 74 68 61 74 20 74 68 65 20 66  rs so that the f
217d0 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e 6c 69 6e  unction is inlin
217e0 65 64 20 2a 2f 0a 23 64 65 66 69 6e 65 20 67 65  ed */.#define ge
217f0 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 20  tCellInfo(pCur) 
21800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21830 20 20 20 20 20 5c 0a 20 20 69 66 28 20 70 43 75       \.  if( pCu
21840 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30  r->info.nSize==0
21850 20 29 7b 20 20 20 20 20 20 20 20 20 20 20 20 20   ){             
21860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21880 20 20 20 20 20 20 5c 0a 20 20 20 20 69 6e 74 20        \.    int 
21890 69 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 69 50  iPage = pCur->iP
218a0 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  age;            
218b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
218c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
218d0 20 20 20 20 20 20 20 5c 0a 20 20 20 20 62 74 72         \.    btr
218e0 65 65 50 61 72 73 65 43 65 6c 6c 28 70 43 75 72  eeParseCell(pCur
218f0 2d 3e 61 70 50 61 67 65 5b 69 50 61 67 65 5d 2c  ->apPage[iPage],
21900 70 43 75 72 2d 3e 61 69 49 64 78 5b 69 50 61 67  pCur->aiIdx[iPag
21910 65 5d 2c 26 70 43 75 72 2d 3e 69 6e 66 6f 29 3b  e],&pCur->info);
21920 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 70 43          \.    pC
21930 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20  ur->curFlags |= 
21940 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 3b 20  BTCF_ValidNKey; 
21950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21970 20 20 20 20 20 20 20 20 20 5c 0a 20 20 7d 65 6c           \.  }el
21980 73 65 7b 20 20 20 20 20 20 20 20 20 20 20 20 20  se{             
21990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
219a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
219b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
219c0 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20            \.    
219d0 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28 70  assertCellInfo(p
219e0 43 75 72 29 3b 20 20 20 20 20 20 20 20 20 20 20  Cur);           
219f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21a10 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 7d             \.  }
21a20 0a 23 65 6e 64 69 66 20 2f 2a 20 5f 4d 53 43 5f  .#endif /* _MSC_
21a30 56 45 52 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20  VER */..#ifndef 
21a40 4e 44 45 42 55 47 20 20 2f 2a 20 54 68 65 20 6e  NDEBUG  /* The n
21a50 65 78 74 20 72 6f 75 74 69 6e 65 20 75 73 65 64  ext routine used
21a60 20 6f 6e 6c 79 20 77 69 74 68 69 6e 20 61 73 73   only within ass
21a70 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73  ert() statements
21a80 20 2a 2f 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e   */./*.** Return
21a90 20 74 72 75 65 20 69 66 20 74 68 65 20 67 69 76   true if the giv
21aa0 65 6e 20 42 74 43 75 72 73 6f 72 20 69 73 20 76  en BtCursor is v
21ab0 61 6c 69 64 2e 20 20 41 20 76 61 6c 69 64 20 63  alid.  A valid c
21ac0 75 72 73 6f 72 20 69 73 20 6f 6e 65 0a 2a 2a 20  ursor is one.** 
21ad0 74 68 61 74 20 69 73 20 63 75 72 72 65 6e 74 6c  that is currentl
21ae0 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20  y pointing to a 
21af0 72 6f 77 20 69 6e 20 61 20 28 6e 6f 6e 2d 65 6d  row in a (non-em
21b00 70 74 79 29 20 74 61 62 6c 65 2e 0a 2a 2a 20 54  pty) table..** T
21b10 68 69 73 20 69 73 20 61 20 76 65 72 69 66 69 63  his is a verific
21b20 61 74 69 6f 6e 20 72 6f 75 74 69 6e 65 20 69 73  ation routine is
21b30 20 75 73 65 64 20 6f 6e 6c 79 20 77 69 74 68 69   used only withi
21b40 6e 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65  n assert() state
21b50 6d 65 6e 74 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ments..*/.int sq
21b60 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
21b70 49 73 56 61 6c 69 64 28 42 74 43 75 72 73 6f 72  IsValid(BtCursor
21b80 20 2a 70 43 75 72 29 7b 0a 20 20 72 65 74 75 72   *pCur){.  retur
21b90 6e 20 70 43 75 72 20 26 26 20 70 43 75 72 2d 3e  n pCur && pCur->
21ba0 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
21bb0 41 4c 49 44 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  ALID;.}.#endif /
21bc0 2a 20 4e 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a  * NDEBUG */../*.
21bd0 2a 2a 20 53 65 74 20 2a 70 53 69 7a 65 20 74 6f  ** Set *pSize to
21be0 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
21bf0 20 62 75 66 66 65 72 20 6e 65 65 64 65 64 20 74   buffer needed t
21c00 6f 20 68 6f 6c 64 20 74 68 65 20 76 61 6c 75 65  o hold the value
21c10 20 6f 66 0a 2a 2a 20 74 68 65 20 6b 65 79 20 66   of.** the key f
21c20 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 65  or the current e
21c30 6e 74 72 79 2e 20 20 49 66 20 74 68 65 20 63 75  ntry.  If the cu
21c40 72 73 6f 72 20 69 73 20 6e 6f 74 20 70 6f 69 6e  rsor is not poin
21c50 74 69 6e 67 0a 2a 2a 20 74 6f 20 61 20 76 61 6c  ting.** to a val
21c60 69 64 20 65 6e 74 72 79 2c 20 2a 70 53 69 7a 65  id entry, *pSize
21c70 20 69 73 20 73 65 74 20 74 6f 20 30 2e 20 0a 2a   is set to 0. .*
21c80 2a 0a 2a 2a 20 46 6f 72 20 61 20 74 61 62 6c 65  *.** For a table
21c90 20 77 69 74 68 20 74 68 65 20 49 4e 54 4b 45 59   with the INTKEY
21ca0 20 66 6c 61 67 20 73 65 74 2c 20 74 68 69 73 20   flag set, this 
21cb0 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
21cc0 74 68 65 20 6b 65 79 0a 2a 2a 20 69 74 73 65 6c  the key.** itsel
21cd0 66 2c 20 6e 6f 74 20 74 68 65 20 6e 75 6d 62 65  f, not the numbe
21ce0 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68  r of bytes in th
21cf0 65 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  e key..**.** The
21d00 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 70 6f 73   caller must pos
21d10 69 74 69 6f 6e 20 74 68 65 20 63 75 72 73 6f 72  ition the cursor
21d20 20 70 72 69 6f 72 20 74 6f 20 69 6e 76 6f 6b 69   prior to invoki
21d30 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e  ng this routine.
21d40 0a 2a 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75  .** .** This rou
21d50 74 69 6e 65 20 63 61 6e 6e 6f 74 20 66 61 69 6c  tine cannot fail
21d60 2e 20 20 49 74 20 61 6c 77 61 79 73 20 72 65 74  .  It always ret
21d70 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 20  urns SQLITE_OK. 
21d80 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33   .*/.int sqlite3
21d90 42 74 72 65 65 4b 65 79 53 69 7a 65 28 42 74 43  BtreeKeySize(BtC
21da0 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 36 34  ursor *pCur, i64
21db0 20 2a 70 53 69 7a 65 29 7b 0a 20 20 61 73 73 65   *pSize){.  asse
21dc0 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
21dd0 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
21de0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
21df0 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
21e00 49 44 20 29 3b 0a 20 20 67 65 74 43 65 6c 6c 49  ID );.  getCellI
21e10 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 2a 70 53  nfo(pCur);.  *pS
21e20 69 7a 65 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f  ize = pCur->info
21e30 2e 6e 4b 65 79 3b 0a 20 20 72 65 74 75 72 6e 20  .nKey;.  return 
21e40 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
21e50 0a 2a 2a 20 53 65 74 20 2a 70 53 69 7a 65 20 74  .** Set *pSize t
21e60 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  o the number of 
21e70 62 79 74 65 73 20 6f 66 20 64 61 74 61 20 69 6e  bytes of data in
21e80 20 74 68 65 20 65 6e 74 72 79 20 74 68 65 0a 2a   the entry the.*
21e90 2a 20 63 75 72 73 6f 72 20 63 75 72 72 65 6e 74  * cursor current
21ea0 6c 79 20 70 6f 69 6e 74 73 20 74 6f 2e 0a 2a 2a  ly points to..**
21eb0 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 6d  .** The caller m
21ec0 75 73 74 20 67 75 61 72 61 6e 74 65 65 20 74 68  ust guarantee th
21ed0 61 74 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  at the cursor is
21ee0 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20 6e   pointing to a n
21ef0 6f 6e 2d 4e 55 4c 4c 0a 2a 2a 20 76 61 6c 69 64  on-NULL.** valid
21f00 20 65 6e 74 72 79 2e 20 20 49 6e 20 6f 74 68 65   entry.  In othe
21f10 72 20 77 6f 72 64 73 2c 20 74 68 65 20 63 61 6c  r words, the cal
21f20 6c 69 6e 67 20 70 72 6f 63 65 64 75 72 65 20 6d  ling procedure m
21f30 75 73 74 20 67 75 61 72 61 6e 74 65 65 0a 2a 2a  ust guarantee.**
21f40 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72   that the cursor
21f50 20 68 61 73 20 43 75 72 73 6f 72 2e 65 53 74 61   has Cursor.eSta
21f60 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
21f70 2e 0a 2a 2a 0a 2a 2a 20 46 61 69 6c 75 72 65 20  ..**.** Failure 
21f80 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 2e  is not possible.
21f90 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20    This function 
21fa0 61 6c 77 61 79 73 20 72 65 74 75 72 6e 73 20 53  always returns S
21fb0 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 49 74 20  QLITE_OK..** It 
21fc0 6d 69 67 68 74 20 6a 75 73 74 20 61 73 20 77 65  might just as we
21fd0 6c 6c 20 62 65 20 61 20 70 72 6f 63 65 64 75 72  ll be a procedur
21fe0 65 20 28 72 65 74 75 72 6e 69 6e 67 20 76 6f 69  e (returning voi
21ff0 64 29 20 62 75 74 20 77 65 20 63 6f 6e 74 69 6e  d) but we contin
22000 75 65 0a 2a 2a 20 74 6f 20 72 65 74 75 72 6e 20  ue.** to return 
22010 61 6e 20 69 6e 74 65 67 65 72 20 72 65 73 75 6c  an integer resul
22020 74 20 63 6f 64 65 20 66 6f 72 20 68 69 73 74 6f  t code for histo
22030 72 69 63 61 6c 20 72 65 61 73 6f 6e 73 2e 0a 2a  rical reasons..*
22040 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
22050 65 65 44 61 74 61 53 69 7a 65 28 42 74 43 75 72  eeDataSize(BtCur
22060 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20 2a  sor *pCur, u32 *
22070 70 53 69 7a 65 29 7b 0a 20 20 61 73 73 65 72 74  pSize){.  assert
22080 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
22090 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ex(pCur) );.  as
220a0 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
220b0 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
220c0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
220d0 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 29 3b 0a  ur->iPage>=0 );.
220e0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
220f0 69 50 61 67 65 3c 42 54 43 55 52 53 4f 52 5f 4d  iPage<BTCURSOR_M
22100 41 58 5f 44 45 50 54 48 20 29 3b 0a 20 20 61 73  AX_DEPTH );.  as
22110 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61  sert( pCur->apPa
22120 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
22130 3e 69 6e 74 4b 65 79 4c 65 61 66 3d 3d 31 20 29  >intKeyLeaf==1 )
22140 3b 0a 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28  ;.  getCellInfo(
22150 70 43 75 72 29 3b 0a 20 20 2a 70 53 69 7a 65 20  pCur);.  *pSize 
22160 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50 61  = pCur->info.nPa
22170 79 6c 6f 61 64 3b 0a 20 20 72 65 74 75 72 6e 20  yload;.  return 
22180 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
22190 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65 20 70 61  .** Given the pa
221a0 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 6e 20  ge number of an 
221b0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e  overflow page in
221c0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 28 70   the database (p
221d0 61 72 61 6d 65 74 65 72 0a 2a 2a 20 6f 76 66 6c  arameter.** ovfl
221e0 29 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ), this function
221f0 20 66 69 6e 64 73 20 74 68 65 20 70 61 67 65 20   finds the page 
22200 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65  number of the ne
22210 78 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 0a  xt page in the .
22220 2a 2a 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f  ** linked list o
22230 66 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  f overflow pages
22240 2e 20 49 66 20 70 6f 73 73 69 62 6c 65 2c 20 69  . If possible, i
22250 74 20 75 73 65 73 20 74 68 65 20 61 75 74 6f 2d  t uses the auto-
22260 76 61 63 75 75 6d 0a 2a 2a 20 70 6f 69 6e 74 65  vacuum.** pointe
22270 72 2d 6d 61 70 20 64 61 74 61 20 69 6e 73 74 65  r-map data inste
22280 61 64 20 6f 66 20 72 65 61 64 69 6e 67 20 74 68  ad of reading th
22290 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 70 61 67  e content of pag
222a0 65 20 6f 76 66 6c 20 74 6f 20 64 6f 20 73 6f 2e  e ovfl to do so.
222b0 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72   .**.** If an er
222c0 72 6f 72 20 6f 63 63 75 72 73 20 61 6e 20 53 51  ror occurs an SQ
222d0 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  Lite error code 
222e0 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68  is returned. Oth
222f0 65 72 77 69 73 65 3a 0a 2a 2a 0a 2a 2a 20 54 68  erwise:.**.** Th
22300 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  e page number of
22310 20 74 68 65 20 6e 65 78 74 20 6f 76 65 72 66 6c   the next overfl
22320 6f 77 20 70 61 67 65 20 69 6e 20 74 68 65 20 6c  ow page in the l
22330 69 6e 6b 65 64 20 6c 69 73 74 20 69 73 20 0a 2a  inked list is .*
22340 2a 20 77 72 69 74 74 65 6e 20 74 6f 20 2a 70 50  * written to *pP
22350 67 6e 6f 4e 65 78 74 2e 20 49 66 20 70 61 67 65  gnoNext. If page
22360 20 6f 76 66 6c 20 69 73 20 74 68 65 20 6c 61 73   ovfl is the las
22370 74 20 70 61 67 65 20 69 6e 20 69 74 73 20 6c 69  t page in its li
22380 6e 6b 65 64 20 0a 2a 2a 20 6c 69 73 74 2c 20 2a  nked .** list, *
22390 70 50 67 6e 6f 4e 65 78 74 20 69 73 20 73 65 74  pPgnoNext is set
223a0 20 74 6f 20 7a 65 72 6f 2e 20 0a 2a 2a 0a 2a 2a   to zero. .**.**
223b0 20 49 66 20 70 70 50 61 67 65 20 69 73 20 6e 6f   If ppPage is no
223c0 74 20 4e 55 4c 4c 2c 20 61 6e 64 20 61 20 72 65  t NULL, and a re
223d0 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 4d  ference to the M
223e0 65 6d 50 61 67 65 20 6f 62 6a 65 63 74 20 63 6f  emPage object co
223f0 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 74  rresponding.** t
22400 6f 20 70 61 67 65 20 6e 75 6d 62 65 72 20 70 4f  o page number pO
22410 76 66 6c 20 77 61 73 20 6f 62 74 61 69 6e 65 64  vfl was obtained
22420 2c 20 74 68 65 6e 20 2a 70 70 50 61 67 65 20 69  , then *ppPage i
22430 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74  s set to point t
22440 6f 20 74 68 61 74 0a 2a 2a 20 72 65 66 65 72 65  o that.** refere
22450 6e 63 65 2e 20 49 74 20 69 73 20 74 68 65 20 72  nce. It is the r
22460 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66  esponsibility of
22470 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 63   the caller to c
22480 61 6c 6c 20 72 65 6c 65 61 73 65 50 61 67 65 28  all releasePage(
22490 29 0a 2a 2a 20 6f 6e 20 2a 70 70 50 61 67 65 20  ).** on *ppPage 
224a0 74 6f 20 66 72 65 65 20 74 68 65 20 72 65 66 65  to free the refe
224b0 72 65 6e 63 65 2e 20 49 6e 20 6e 6f 20 72 65 66  rence. In no ref
224c0 65 72 65 6e 63 65 20 77 61 73 20 6f 62 74 61 69  erence was obtai
224d0 6e 65 64 20 28 62 65 63 61 75 73 65 0a 2a 2a 20  ned (because.** 
224e0 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  the pointer-map 
224f0 77 61 73 20 75 73 65 64 20 74 6f 20 6f 62 74 61  was used to obta
22500 69 6e 20 74 68 65 20 76 61 6c 75 65 20 66 6f 72  in the value for
22510 20 2a 70 50 67 6e 6f 4e 65 78 74 29 2c 20 74 68   *pPgnoNext), th
22520 65 6e 0a 2a 2a 20 2a 70 70 50 61 67 65 20 69 73  en.** *ppPage is
22530 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2f   set to zero..*/
22540 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 74 4f  .static int getO
22550 76 65 72 66 6c 6f 77 50 61 67 65 28 0a 20 20 42  verflowPage(.  B
22560 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20  tShared *pBt,   
22570 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
22580 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
22590 20 2a 2f 0a 20 20 50 67 6e 6f 20 6f 76 66 6c 2c   */.  Pgno ovfl,
225a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
225b0 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6f 76     /* Current ov
225c0 65 72 66 6c 6f 77 20 70 61 67 65 20 6e 75 6d 62  erflow page numb
225d0 65 72 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  er */.  MemPage 
225e0 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 20 20 20  **ppPage,       
225f0 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4d 65 6d       /* OUT: Mem
22600 50 61 67 65 20 68 61 6e 64 6c 65 20 28 6d 61 79  Page handle (may
22610 20 62 65 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20 50   be NULL) */.  P
22620 67 6e 6f 20 2a 70 50 67 6e 6f 4e 65 78 74 20 20  gno *pPgnoNext  
22630 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
22640 55 54 3a 20 4e 65 78 74 20 6f 76 65 72 66 6c 6f  UT: Next overflo
22650 77 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f  w page number */
22660 0a 29 7b 0a 20 20 50 67 6e 6f 20 6e 65 78 74 20  .){.  Pgno next 
22670 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  = 0;.  MemPage *
22680 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 69 6e 74  pPage = 0;.  int
22690 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
226a0 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
226b0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
226c0 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
226d0 61 73 73 65 72 74 28 70 50 67 6e 6f 4e 65 78 74  assert(pPgnoNext
226e0 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  );..#ifndef SQLI
226f0 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
22700 55 4d 0a 20 20 2f 2a 20 54 72 79 20 74 6f 20 66  UM.  /* Try to f
22710 69 6e 64 20 74 68 65 20 6e 65 78 74 20 70 61 67  ind the next pag
22720 65 20 69 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f  e in the overflo
22730 77 20 6c 69 73 74 20 75 73 69 6e 67 20 74 68 65  w list using the
22740 0a 20 20 2a 2a 20 61 75 74 6f 76 61 63 75 75 6d  .  ** autovacuum
22750 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67   pointer-map pag
22760 65 73 2e 20 47 75 65 73 73 20 74 68 61 74 20 74  es. Guess that t
22770 68 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20  he next page in 
22780 0a 20 20 2a 2a 20 74 68 65 20 6f 76 65 72 66 6c  .  ** the overfl
22790 6f 77 20 6c 69 73 74 20 69 73 20 70 61 67 65 20  ow list is page 
227a0 6e 75 6d 62 65 72 20 28 6f 76 66 6c 2b 31 29 2e  number (ovfl+1).
227b0 20 49 66 20 74 68 61 74 20 67 75 65 73 73 20 74   If that guess t
227c0 75 72 6e 73 20 0a 20 20 2a 2a 20 6f 75 74 20 74  urns .  ** out t
227d0 6f 20 62 65 20 77 72 6f 6e 67 2c 20 66 61 6c 6c  o be wrong, fall
227e0 20 62 61 63 6b 20 74 6f 20 6c 6f 61 64 69 6e 67   back to loading
227f0 20 74 68 65 20 64 61 74 61 20 6f 66 20 70 61 67   the data of pag
22800 65 20 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f  e .  ** number o
22810 76 66 6c 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  vfl to determine
22820 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 6e   the next page n
22830 75 6d 62 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66  umber..  */.  if
22840 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
22850 6d 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 70 67  m ){.    Pgno pg
22860 6e 6f 3b 0a 20 20 20 20 50 67 6e 6f 20 69 47 75  no;.    Pgno iGu
22870 65 73 73 20 3d 20 6f 76 66 6c 2b 31 3b 0a 20 20  ess = ovfl+1;.  
22880 20 20 75 38 20 65 54 79 70 65 3b 0a 0a 20 20 20    u8 eType;..   
22890 20 77 68 69 6c 65 28 20 50 54 52 4d 41 50 5f 49   while( PTRMAP_I
228a0 53 50 41 47 45 28 70 42 74 2c 20 69 47 75 65 73  SPAGE(pBt, iGues
228b0 73 29 20 7c 7c 20 69 47 75 65 73 73 3d 3d 50 45  s) || iGuess==PE
228c0 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
228d0 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 69 47  pBt) ){.      iG
228e0 75 65 73 73 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20  uess++;.    }.. 
228f0 20 20 20 69 66 28 20 69 47 75 65 73 73 3c 3d 62     if( iGuess<=b
22900 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42  treePagecount(pB
22910 74 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  t) ){.      rc =
22920 20 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20   ptrmapGet(pBt, 
22930 69 47 75 65 73 73 2c 20 26 65 54 79 70 65 2c 20  iGuess, &eType, 
22940 26 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66  &pgno);.      if
22950 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
22960 26 26 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  && eType==PTRMAP
22970 5f 4f 56 45 52 46 4c 4f 57 32 20 26 26 20 70 67  _OVERFLOW2 && pg
22980 6e 6f 3d 3d 6f 76 66 6c 20 29 7b 0a 20 20 20 20  no==ovfl ){.    
22990 20 20 20 20 6e 65 78 74 20 3d 20 69 47 75 65 73      next = iGues
229a0 73 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  s;.        rc = 
229b0 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20  SQLITE_DONE;.   
229c0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23     }.    }.  }.#
229d0 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28  endif..  assert(
229e0 20 6e 65 78 74 3d 3d 30 20 7c 7c 20 72 63 3d 3d   next==0 || rc==
229f0 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20  SQLITE_DONE );. 
22a00 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
22a10 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 62  OK ){.    rc = b
22a20 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
22a30 20 6f 76 66 6c 2c 20 26 70 50 61 67 65 2c 20 28   ovfl, &pPage, (
22a40 70 70 50 61 67 65 3d 3d 30 29 20 3f 20 50 41 47  ppPage==0) ? PAG
22a50 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20  ER_GET_READONLY 
22a60 3a 20 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74  : 0);.    assert
22a70 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
22a80 7c 7c 20 70 50 61 67 65 3d 3d 30 20 29 3b 0a 20  || pPage==0 );. 
22a90 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
22aa0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 6e 65  E_OK ){.      ne
22ab0 78 74 20 3d 20 67 65 74 34 62 79 74 65 28 70 50  xt = get4byte(pP
22ac0 61 67 65 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20  age->aData);.   
22ad0 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70 50 67 6e 6f   }.  }..  *pPgno
22ae0 4e 65 78 74 20 3d 20 6e 65 78 74 3b 0a 20 20 69  Next = next;.  i
22af0 66 28 20 70 70 50 61 67 65 20 29 7b 0a 20 20 20  f( ppPage ){.   
22b00 20 2a 70 70 50 61 67 65 20 3d 20 70 50 61 67 65   *ppPage = pPage
22b10 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
22b20 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65  eleasePage(pPage
22b30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
22b40 28 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45  (rc==SQLITE_DONE
22b50 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 72   ? SQLITE_OK : r
22b60 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70  c);.}../*.** Cop
22b70 79 20 64 61 74 61 20 66 72 6f 6d 20 61 20 62 75  y data from a bu
22b80 66 66 65 72 20 74 6f 20 61 20 70 61 67 65 2c 20  ffer to a page, 
22b90 6f 72 20 66 72 6f 6d 20 61 20 70 61 67 65 20 74  or from a page t
22ba0 6f 20 61 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a  o a buffer..**.*
22bb0 2a 20 70 50 61 79 6c 6f 61 64 20 69 73 20 61 20  * pPayload is a 
22bc0 70 6f 69 6e 74 65 72 20 74 6f 20 64 61 74 61 20  pointer to data 
22bd0 73 74 6f 72 65 64 20 6f 6e 20 64 61 74 61 62 61  stored on databa
22be0 73 65 20 70 61 67 65 20 70 44 62 50 61 67 65 2e  se page pDbPage.
22bf0 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20  .** If argument 
22c00 65 4f 70 20 69 73 20 66 61 6c 73 65 2c 20 74 68  eOp is false, th
22c10 65 6e 20 6e 42 79 74 65 20 62 79 74 65 73 20 6f  en nByte bytes o
22c20 66 20 64 61 74 61 20 61 72 65 20 63 6f 70 69 65  f data are copie
22c30 64 0a 2a 2a 20 66 72 6f 6d 20 70 50 61 79 6c 6f  d.** from pPaylo
22c40 61 64 20 74 6f 20 74 68 65 20 62 75 66 66 65 72  ad to the buffer
22c50 20 70 6f 69 6e 74 65 64 20 61 74 20 62 79 20 70   pointed at by p
22c60 42 75 66 2e 20 49 66 20 65 4f 70 20 69 73 20 74  Buf. If eOp is t
22c70 72 75 65 2c 0a 2a 2a 20 74 68 65 6e 20 73 71 6c  rue,.** then sql
22c80 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29  ite3PagerWrite()
22c90 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 70 44   is called on pD
22ca0 62 50 61 67 65 20 61 6e 64 20 6e 42 79 74 65 20  bPage and nByte 
22cb0 62 79 74 65 73 0a 2a 2a 20 6f 66 20 64 61 74 61  bytes.** of data
22cc0 20 61 72 65 20 63 6f 70 69 65 64 20 66 72 6f 6d   are copied from
22cd0 20 74 68 65 20 62 75 66 66 65 72 20 70 42 75 66   the buffer pBuf
22ce0 20 74 6f 20 70 50 61 79 6c 6f 61 64 2e 0a 2a 2a   to pPayload..**
22cf0 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  .** SQLITE_OK is
22d00 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63   returned on suc
22d10 63 65 73 73 2c 20 6f 74 68 65 72 77 69 73 65 20  cess, otherwise 
22d20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a  an error code..*
22d30 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 70  /.static int cop
22d40 79 50 61 79 6c 6f 61 64 28 0a 20 20 76 6f 69 64  yPayload(.  void
22d50 20 2a 70 50 61 79 6c 6f 61 64 2c 20 20 20 20 20   *pPayload,     
22d60 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
22d70 20 74 6f 20 70 61 67 65 20 64 61 74 61 20 2a 2f   to page data */
22d80 0a 20 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 20  .  void *pBuf,  
22d90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
22da0 50 6f 69 6e 74 65 72 20 74 6f 20 62 75 66 66 65  Pointer to buffe
22db0 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65  r */.  int nByte
22dc0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
22dd0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
22de0 74 65 73 20 74 6f 20 63 6f 70 79 20 2a 2f 0a 20  tes to copy */. 
22df0 20 69 6e 74 20 65 4f 70 2c 20 20 20 20 20 20 20   int eOp,       
22e00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 30 20             /* 0 
22e10 2d 3e 20 63 6f 70 79 20 66 72 6f 6d 20 70 61 67  -> copy from pag
22e20 65 2c 20 31 20 2d 3e 20 63 6f 70 79 20 74 6f 20  e, 1 -> copy to 
22e30 70 61 67 65 20 2a 2f 0a 20 20 44 62 50 61 67 65  page */.  DbPage
22e40 20 2a 70 44 62 50 61 67 65 20 20 20 20 20 20 20   *pDbPage       
22e50 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74      /* Page cont
22e60 61 69 6e 69 6e 67 20 70 50 61 79 6c 6f 61 64 20  aining pPayload 
22e70 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 65 4f 70 20  */.){.  if( eOp 
22e80 29 7b 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 64  ){.    /* Copy d
22e90 61 74 61 20 66 72 6f 6d 20 62 75 66 66 65 72 20  ata from buffer 
22ea0 74 6f 20 70 61 67 65 20 28 61 20 77 72 69 74 65  to page (a write
22eb0 20 6f 70 65 72 61 74 69 6f 6e 29 20 2a 2f 0a 20   operation) */. 
22ec0 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69     int rc = sqli
22ed0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 44  te3PagerWrite(pD
22ee0 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
22ef0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
22f00 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
22f10 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 63  ;.    }.    memc
22f20 70 79 28 70 50 61 79 6c 6f 61 64 2c 20 70 42 75  py(pPayload, pBu
22f30 66 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d 65 6c  f, nByte);.  }el
22f40 73 65 7b 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20  se{.    /* Copy 
22f50 64 61 74 61 20 66 72 6f 6d 20 70 61 67 65 20 74  data from page t
22f60 6f 20 62 75 66 66 65 72 20 28 61 20 72 65 61 64  o buffer (a read
22f70 20 6f 70 65 72 61 74 69 6f 6e 29 20 2a 2f 0a 20   operation) */. 
22f80 20 20 20 6d 65 6d 63 70 79 28 70 42 75 66 2c 20     memcpy(pBuf, 
22f90 70 50 61 79 6c 6f 61 64 2c 20 6e 42 79 74 65 29  pPayload, nByte)
22fa0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
22fb0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
22fc0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
22fd0 20 69 73 20 75 73 65 64 20 74 6f 20 72 65 61 64   is used to read
22fe0 20 6f 72 20 6f 76 65 72 77 72 69 74 65 20 70 61   or overwrite pa
22ff0 79 6c 6f 61 64 20 69 6e 66 6f 72 6d 61 74 69 6f  yload informatio
23000 6e 0a 2a 2a 20 66 6f 72 20 74 68 65 20 65 6e 74  n.** for the ent
23010 72 79 20 74 68 61 74 20 74 68 65 20 70 43 75 72  ry that the pCur
23020 20 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74   cursor is point
23030 69 6e 67 20 74 6f 2e 20 54 68 65 20 65 4f 70 0a  ing to. The eOp.
23040 2a 2a 20 61 72 67 75 6d 65 6e 74 20 69 73 20 69  ** argument is i
23050 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 66 6f  nterpreted as fo
23060 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 30  llows:.**.**   0
23070 3a 20 54 68 65 20 6f 70 65 72 61 74 69 6f 6e 20  : The operation 
23080 69 73 20 61 20 72 65 61 64 2e 20 50 6f 70 75 6c  is a read. Popul
23090 61 74 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  ate the overflow
230a0 20 63 61 63 68 65 2e 0a 2a 2a 20 20 20 31 3a 20   cache..**   1: 
230b0 54 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 69 73  The operation is
230c0 20 61 20 77 72 69 74 65 2e 20 50 6f 70 75 6c 61   a write. Popula
230d0 74 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  te the overflow 
230e0 63 61 63 68 65 2e 0a 2a 2a 20 20 20 32 3a 20 54  cache..**   2: T
230f0 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20  he operation is 
23100 61 20 72 65 61 64 2e 20 44 6f 20 6e 6f 74 20 70  a read. Do not p
23110 6f 70 75 6c 61 74 65 20 74 68 65 20 6f 76 65 72  opulate the over
23120 66 6c 6f 77 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a  flow cache..**.*
23130 2a 20 41 20 74 6f 74 61 6c 20 6f 66 20 22 61 6d  * A total of "am
23140 74 22 20 62 79 74 65 73 20 61 72 65 20 72 65 61  t" bytes are rea
23150 64 20 6f 72 20 77 72 69 74 74 65 6e 20 62 65 67  d or written beg
23160 69 6e 6e 69 6e 67 20 61 74 20 22 6f 66 66 73 65  inning at "offse
23170 74 22 2e 0a 2a 2a 20 44 61 74 61 20 69 73 20 72  t"..** Data is r
23180 65 61 64 20 74 6f 20 6f 72 20 66 72 6f 6d 20 74  ead to or from t
23190 68 65 20 62 75 66 66 65 72 20 70 42 75 66 2e 0a  he buffer pBuf..
231a0 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6e 74 65 6e  **.** The conten
231b0 74 20 62 65 69 6e 67 20 72 65 61 64 20 6f 72 20  t being read or 
231c0 77 72 69 74 74 65 6e 20 6d 69 67 68 74 20 61 70  written might ap
231d0 70 65 61 72 20 6f 6e 20 74 68 65 20 6d 61 69 6e  pear on the main
231e0 20 70 61 67 65 0a 2a 2a 20 6f 72 20 62 65 20 73   page.** or be s
231f0 63 61 74 74 65 72 65 64 20 6f 75 74 20 6f 6e 20  cattered out on 
23200 6d 75 6c 74 69 70 6c 65 20 6f 76 65 72 66 6c 6f  multiple overflo
23210 77 20 70 61 67 65 73 2e 0a 2a 2a 0a 2a 2a 20 49  w pages..**.** I
23220 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 75  f the current cu
23230 72 73 6f 72 20 65 6e 74 72 79 20 75 73 65 73 20  rsor entry uses 
23240 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 76 65 72  one or more over
23250 66 6c 6f 77 20 70 61 67 65 73 20 61 6e 64 20 74  flow pages and t
23260 68 65 0a 2a 2a 20 65 4f 70 20 61 72 67 75 6d 65  he.** eOp argume
23270 6e 74 20 69 73 20 6e 6f 74 20 32 2c 20 74 68 69  nt is not 2, thi
23280 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 61  s function may a
23290 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f  llocate space fo
232a0 72 20 61 6e 64 20 6c 61 7a 69 6c 79 20 0a 2a 2a  r and lazily .**
232b0 20 70 6f 70 75 6c 61 74 65 73 20 74 68 65 20 6f   populates the o
232c0 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73  verflow page-lis
232d0 74 20 63 61 63 68 65 20 61 72 72 61 79 20 28 42  t cache array (B
232e0 74 43 75 72 73 6f 72 2e 61 4f 76 65 72 66 6c 6f  tCursor.aOverflo
232f0 77 29 2e 20 0a 2a 2a 20 53 75 62 73 65 71 75 65  w). .** Subseque
23300 6e 74 20 63 61 6c 6c 73 20 75 73 65 20 74 68 69  nt calls use thi
23310 73 20 63 61 63 68 65 20 74 6f 20 6d 61 6b 65 20  s cache to make 
23320 73 65 65 6b 69 6e 67 20 74 6f 20 74 68 65 20 73  seeking to the s
23330 75 70 70 6c 69 65 64 20 6f 66 66 73 65 74 20 0a  upplied offset .
23340 2a 2a 20 6d 6f 72 65 20 65 66 66 69 63 69 65 6e  ** more efficien
23350 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 61 6e  t..**.** Once an
23360 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c   overflow page-l
23370 69 73 74 20 63 61 63 68 65 20 68 61 73 20 62 65  ist cache has be
23380 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c 20 69 74  en allocated, it
23390 20 6d 61 79 20 62 65 0a 2a 2a 20 69 6e 76 61 6c   may be.** inval
233a0 69 64 61 74 65 64 20 69 66 20 73 6f 6d 65 20 6f  idated if some o
233b0 74 68 65 72 20 63 75 72 73 6f 72 20 77 72 69 74  ther cursor writ
233c0 65 73 20 74 6f 20 74 68 65 20 73 61 6d 65 20 74  es to the same t
233d0 61 62 6c 65 2c 20 6f 72 20 69 66 0a 2a 2a 20 74  able, or if.** t
233e0 68 65 20 63 75 72 73 6f 72 20 69 73 20 6d 6f 76  he cursor is mov
233f0 65 64 20 74 6f 20 61 20 64 69 66 66 65 72 65 6e  ed to a differen
23400 74 20 72 6f 77 2e 20 41 64 64 69 74 69 6f 6e 61  t row. Additiona
23410 6c 6c 79 2c 20 69 6e 20 61 75 74 6f 2d 76 61 63  lly, in auto-vac
23420 75 75 6d 0a 2a 2a 20 6d 6f 64 65 2c 20 74 68 65  uum.** mode, the
23430 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 76 65 6e 74   following event
23440 73 20 6d 61 79 20 69 6e 76 61 6c 69 64 61 74 65  s may invalidate
23450 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
23460 65 2d 6c 69 73 74 20 63 61 63 68 65 2e 0a 2a 2a  e-list cache..**
23470 0a 2a 2a 20 20 20 2a 20 41 6e 20 69 6e 63 72 65  .**   * An incre
23480 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 2c 0a 2a  mental vacuum,.*
23490 2a 20 20 20 2a 20 41 20 63 6f 6d 6d 69 74 20 69  *   * A commit i
234a0 6e 20 61 75 74 6f 5f 76 61 63 75 75 6d 3d 22 66  n auto_vacuum="f
234b0 75 6c 6c 22 20 6d 6f 64 65 2c 0a 2a 2a 20 20 20  ull" mode,.**   
234c0 2a 20 43 72 65 61 74 69 6e 67 20 61 20 74 61 62  * Creating a tab
234d0 6c 65 20 28 6d 61 79 20 72 65 71 75 69 72 65 20  le (may require 
234e0 6d 6f 76 69 6e 67 20 61 6e 20 6f 76 65 72 66 6c  moving an overfl
234f0 6f 77 20 70 61 67 65 29 2e 0a 2a 2f 0a 73 74 61  ow page)..*/.sta
23500 74 69 63 20 69 6e 74 20 61 63 63 65 73 73 50 61  tic int accessPa
23510 79 6c 6f 61 64 28 0a 20 20 42 74 43 75 72 73 6f  yload(.  BtCurso
23520 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20 2f 2a  r *pCur,      /*
23530 20 43 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67   Cursor pointing
23540 20 74 6f 20 65 6e 74 72 79 20 74 6f 20 72 65 61   to entry to rea
23550 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32 20  d from */.  u32 
23560 6f 66 66 73 65 74 2c 20 20 20 20 20 20 20 20 20  offset,         
23570 20 2f 2a 20 42 65 67 69 6e 20 72 65 61 64 69 6e   /* Begin readin
23580 67 20 74 68 69 73 20 66 61 72 20 69 6e 74 6f 20  g this far into 
23590 70 61 79 6c 6f 61 64 20 2a 2f 0a 20 20 75 33 32  payload */.  u32
235a0 20 61 6d 74 2c 20 20 20 20 20 20 20 20 20 20 20   amt,           
235b0 20 20 2f 2a 20 52 65 61 64 20 74 68 69 73 20 6d    /* Read this m
235c0 61 6e 79 20 62 79 74 65 73 20 2a 2f 0a 20 20 75  any bytes */.  u
235d0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 42  nsigned char *pB
235e0 75 66 2c 20 2f 2a 20 57 72 69 74 65 20 74 68 65  uf, /* Write the
235f0 20 62 79 74 65 73 20 69 6e 74 6f 20 74 68 69 73   bytes into this
23600 20 62 75 66 66 65 72 20 2a 2f 20 0a 20 20 69 6e   buffer */ .  in
23610 74 20 65 4f 70 20 20 20 20 20 20 20 20 20 20 20  t eOp           
23620 20 20 20 2f 2a 20 7a 65 72 6f 20 74 6f 20 72 65     /* zero to re
23630 61 64 2e 20 6e 6f 6e 2d 7a 65 72 6f 20 74 6f 20  ad. non-zero to 
23640 77 72 69 74 65 2e 20 2a 2f 0a 29 7b 0a 20 20 75  write. */.){.  u
23650 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 50  nsigned char *aP
23660 61 79 6c 6f 61 64 3b 0a 20 20 69 6e 74 20 72 63  ayload;.  int rc
23670 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
23680 69 6e 74 20 69 49 64 78 20 3d 20 30 3b 0a 20 20  int iIdx = 0;.  
23690 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d  MemPage *pPage =
236a0 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
236b0 75 72 2d 3e 69 50 61 67 65 5d 3b 20 2f 2a 20 42  ur->iPage]; /* B
236c0 74 72 65 65 20 70 61 67 65 20 6f 66 20 63 75 72  tree page of cur
236d0 72 65 6e 74 20 65 6e 74 72 79 20 2a 2f 0a 20 20  rent entry */.  
236e0 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
236f0 70 43 75 72 2d 3e 70 42 74 3b 20 20 20 20 20 20  pCur->pBt;      
23700 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
23710 74 72 65 65 20 74 68 69 73 20 63 75 72 73 6f 72  tree this cursor
23720 20 62 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a 23   belongs to */.#
23730 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 49 52  ifdef SQLITE_DIR
23740 45 43 54 5f 4f 56 45 52 46 4c 4f 57 5f 52 45 41  ECT_OVERFLOW_REA
23750 44 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  D.  unsigned cha
23760 72 20 2a 20 63 6f 6e 73 74 20 70 42 75 66 53 74  r * const pBufSt
23770 61 72 74 20 3d 20 70 42 75 66 3b 0a 20 20 69 6e  art = pBuf;.  in
23780 74 20 62 45 6e 64 3b 20 20 20 20 20 20 20 20 20  t bEnd;         
23790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
237a0 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
237b0 69 66 20 72 65 61 64 69 6e 67 20 74 6f 20 65 6e  if reading to en
237c0 64 20 6f 66 20 64 61 74 61 20 2a 2f 0a 23 65 6e  d of data */.#en
237d0 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70  dif..  assert( p
237e0 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74  Page );.  assert
237f0 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
23800 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
23810 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
23820 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
23830 65 5d 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  e]<pPage->nCell 
23840 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  );.  assert( cur
23850 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
23860 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
23870 20 65 4f 70 21 3d 32 20 7c 7c 20 6f 66 66 73 65   eOp!=2 || offse
23880 74 3d 3d 30 20 29 3b 20 20 20 20 2f 2a 20 41 6c  t==0 );    /* Al
23890 77 61 79 73 20 73 74 61 72 74 20 66 72 6f 6d 20  ways start from 
238a0 62 65 67 69 6e 6e 69 6e 67 20 66 6f 72 20 65 4f  beginning for eO
238b0 70 3d 3d 32 20 2a 2f 0a 0a 20 20 67 65 74 43 65  p==2 */..  getCe
238c0 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20  llInfo(pCur);.  
238d0 61 50 61 79 6c 6f 61 64 20 3d 20 70 43 75 72 2d  aPayload = pCur-
238e0 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64 3b 0a  >info.pPayload;.
238f0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 49  #ifdef SQLITE_DI
23900 52 45 43 54 5f 4f 56 45 52 46 4c 4f 57 5f 52 45  RECT_OVERFLOW_RE
23910 41 44 0a 20 20 62 45 6e 64 20 3d 20 6f 66 66 73  AD.  bEnd = offs
23920 65 74 2b 61 6d 74 3d 3d 70 43 75 72 2d 3e 69 6e  et+amt==pCur->in
23930 66 6f 2e 6e 50 61 79 6c 6f 61 64 3b 0a 23 65 6e  fo.nPayload;.#en
23940 64 69 66 0a 20 20 61 73 73 65 72 74 28 20 6f 66  dif.  assert( of
23950 66 73 65 74 2b 61 6d 74 20 3c 3d 20 70 43 75 72  fset+amt <= pCur
23960 2d 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20  ->info.nPayload 
23970 29 3b 0a 0a 20 20 69 66 28 20 26 61 50 61 79 6c  );..  if( &aPayl
23980 6f 61 64 5b 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  oad[pCur->info.n
23990 4c 6f 63 61 6c 5d 20 3e 20 26 70 50 61 67 65 2d  Local] > &pPage-
239a0 3e 61 44 61 74 61 5b 70 42 74 2d 3e 75 73 61 62  >aData[pBt->usab
239b0 6c 65 53 69 7a 65 5d 20 29 7b 0a 20 20 20 20 2f  leSize] ){.    /
239c0 2a 20 54 72 79 69 6e 67 20 74 6f 20 72 65 61 64  * Trying to read
239d0 20 6f 72 20 77 72 69 74 65 20 70 61 73 74 20 74   or write past t
239e0 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 64 61  he end of the da
239f0 74 61 20 69 73 20 61 6e 20 65 72 72 6f 72 20 2a  ta is an error *
23a00 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  /.    return SQL
23a10 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
23a20 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63  ;.  }..  /* Chec
23a30 6b 20 69 66 20 64 61 74 61 20 6d 75 73 74 20 62  k if data must b
23a40 65 20 72 65 61 64 2f 77 72 69 74 74 65 6e 20 74  e read/written t
23a50 6f 2f 66 72 6f 6d 20 74 68 65 20 62 74 72 65 65  o/from the btree
23a60 20 70 61 67 65 20 69 74 73 65 6c 66 2e 20 2a 2f   page itself. */
23a70 0a 20 20 69 66 28 20 6f 66 66 73 65 74 3c 70 43  .  if( offset<pC
23a80 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20  ur->info.nLocal 
23a90 29 7b 0a 20 20 20 20 69 6e 74 20 61 20 3d 20 61  ){.    int a = a
23aa0 6d 74 3b 0a 20 20 20 20 69 66 28 20 61 2b 6f 66  mt;.    if( a+of
23ab0 66 73 65 74 3e 70 43 75 72 2d 3e 69 6e 66 6f 2e  fset>pCur->info.
23ac0 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20  nLocal ){.      
23ad0 61 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  a = pCur->info.n
23ae0 4c 6f 63 61 6c 20 2d 20 6f 66 66 73 65 74 3b 0a  Local - offset;.
23af0 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 63      }.    rc = c
23b00 6f 70 79 50 61 79 6c 6f 61 64 28 26 61 50 61 79  opyPayload(&aPay
23b10 6c 6f 61 64 5b 6f 66 66 73 65 74 5d 2c 20 70 42  load[offset], pB
23b20 75 66 2c 20 61 2c 20 28 65 4f 70 20 26 20 30 78  uf, a, (eOp & 0x
23b30 30 31 29 2c 20 70 50 61 67 65 2d 3e 70 44 62 50  01), pPage->pDbP
23b40 61 67 65 29 3b 0a 20 20 20 20 6f 66 66 73 65 74  age);.    offset
23b50 20 3d 20 30 3b 0a 20 20 20 20 70 42 75 66 20 2b   = 0;.    pBuf +
23b60 3d 20 61 3b 0a 20 20 20 20 61 6d 74 20 2d 3d 20  = a;.    amt -= 
23b70 61 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  a;.  }else{.    
23b80 6f 66 66 73 65 74 20 2d 3d 20 70 43 75 72 2d 3e  offset -= pCur->
23b90 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 7d  info.nLocal;.  }
23ba0 0a 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  ...  if( rc==SQL
23bb0 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20  ITE_OK && amt>0 
23bc0 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 75 33 32  ){.    const u32
23bd0 20 6f 76 66 6c 53 69 7a 65 20 3d 20 70 42 74 2d   ovflSize = pBt-
23be0 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b  >usableSize - 4;
23bf0 20 20 2f 2a 20 42 79 74 65 73 20 63 6f 6e 74 65    /* Bytes conte
23c00 6e 74 20 70 65 72 20 6f 76 66 6c 20 70 61 67 65  nt per ovfl page
23c10 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 65 78   */.    Pgno nex
23c20 74 50 61 67 65 3b 0a 0a 20 20 20 20 6e 65 78 74  tPage;..    next
23c30 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28  Page = get4byte(
23c40 26 61 50 61 79 6c 6f 61 64 5b 70 43 75 72 2d 3e  &aPayload[pCur->
23c50 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d 29 3b 0a 0a  info.nLocal]);..
23c60 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 42 74      /* If the Bt
23c70 43 75 72 73 6f 72 2e 61 4f 76 65 72 66 6c 6f 77  Cursor.aOverflow
23c80 5b 5d 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20  [] has not been 
23c90 61 6c 6c 6f 63 61 74 65 64 2c 20 61 6c 6c 6f 63  allocated, alloc
23ca0 61 74 65 20 69 74 20 6e 6f 77 2e 0a 20 20 20 20  ate it now..    
23cb0 2a 2a 20 45 78 63 65 70 74 2c 20 64 6f 20 6e 6f  ** Except, do no
23cc0 74 20 61 6c 6c 6f 63 61 74 65 20 61 4f 76 65 72  t allocate aOver
23cd0 66 6c 6f 77 5b 5d 20 66 6f 72 20 65 4f 70 3d 3d  flow[] for eOp==
23ce0 32 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  2..    **.    **
23cf0 20 54 68 65 20 61 4f 76 65 72 66 6c 6f 77 5b 5d   The aOverflow[]
23d00 20 61 72 72 61 79 20 69 73 20 73 69 7a 65 64 20   array is sized 
23d10 61 74 20 6f 6e 65 20 65 6e 74 72 79 20 66 6f 72  at one entry for
23d20 20 65 61 63 68 20 6f 76 65 72 66 6c 6f 77 20 70   each overflow p
23d30 61 67 65 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68  age.    ** in th
23d40 65 20 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e  e overflow chain
23d50 2e 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65  . The page numbe
23d60 72 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 6f  r of the first o
23d70 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 73 0a  verflow page is.
23d80 20 20 20 20 2a 2a 20 73 74 6f 72 65 64 20 69 6e      ** stored in
23d90 20 61 4f 76 65 72 66 6c 6f 77 5b 30 5d 2c 20 65   aOverflow[0], e
23da0 74 63 2e 20 41 20 76 61 6c 75 65 20 6f 66 20 30  tc. A value of 0
23db0 20 69 6e 20 74 68 65 20 61 4f 76 65 72 66 6c 6f   in the aOverflo
23dc0 77 5b 5d 20 61 72 72 61 79 0a 20 20 20 20 2a 2a  w[] array.    **
23dd0 20 6d 65 61 6e 73 20 22 6e 6f 74 20 79 65 74 20   means "not yet 
23de0 6b 6e 6f 77 6e 22 20 28 74 68 65 20 63 61 63 68  known" (the cach
23df0 65 20 69 73 20 6c 61 7a 69 6c 79 20 70 6f 70 75  e is lazily popu
23e00 6c 61 74 65 64 29 2e 0a 20 20 20 20 2a 2f 0a 20  lated)..    */. 
23e10 20 20 20 69 66 28 20 65 4f 70 21 3d 32 20 26 26     if( eOp!=2 &&
23e20 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73   (pCur->curFlags
23e30 20 26 20 42 54 43 46 5f 56 61 6c 69 64 4f 76 66   & BTCF_ValidOvf
23e40 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  l)==0 ){.      i
23e50 6e 74 20 6e 4f 76 66 6c 20 3d 20 28 70 43 75 72  nt nOvfl = (pCur
23e60 2d 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 2d  ->info.nPayload-
23e70 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61  pCur->info.nLoca
23e80 6c 2b 6f 76 66 6c 53 69 7a 65 2d 31 29 2f 6f 76  l+ovflSize-1)/ov
23e90 66 6c 53 69 7a 65 3b 0a 20 20 20 20 20 20 69 66  flSize;.      if
23ea0 28 20 6e 4f 76 66 6c 3e 70 43 75 72 2d 3e 6e 4f  ( nOvfl>pCur->nO
23eb0 76 66 6c 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20  vflAlloc ){.    
23ec0 20 20 20 20 50 67 6e 6f 20 2a 61 4e 65 77 20 3d      Pgno *aNew =
23ed0 20 28 50 67 6e 6f 2a 29 73 71 6c 69 74 65 33 52   (Pgno*)sqlite3R
23ee0 65 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20 20 20  ealloc(.        
23ef0 20 20 20 20 70 43 75 72 2d 3e 61 4f 76 65 72 66      pCur->aOverf
23f00 6c 6f 77 2c 20 6e 4f 76 66 6c 2a 32 2a 73 69 7a  low, nOvfl*2*siz
23f10 65 6f 66 28 50 67 6e 6f 29 0a 20 20 20 20 20 20  eof(Pgno).      
23f20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28    );.        if(
23f30 20 61 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20   aNew==0 ){.    
23f40 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
23f50 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20  E_NOMEM;.       
23f60 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
23f70 20 20 70 43 75 72 2d 3e 6e 4f 76 66 6c 41 6c 6c    pCur->nOvflAll
23f80 6f 63 20 3d 20 6e 4f 76 66 6c 2a 32 3b 0a 20 20  oc = nOvfl*2;.  
23f90 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 61 4f          pCur->aO
23fa0 76 65 72 66 6c 6f 77 20 3d 20 61 4e 65 77 3b 0a  verflow = aNew;.
23fb0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
23fc0 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  }.      if( rc==
23fd0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
23fe0 20 20 20 20 20 6d 65 6d 73 65 74 28 70 43 75 72       memset(pCur
23ff0 2d 3e 61 4f 76 65 72 66 6c 6f 77 2c 20 30 2c 20  ->aOverflow, 0, 
24000 6e 4f 76 66 6c 2a 73 69 7a 65 6f 66 28 50 67 6e  nOvfl*sizeof(Pgn
24010 6f 29 29 3b 0a 20 20 20 20 20 20 20 20 70 43 75  o));.        pCu
24020 72 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20 42  r->curFlags |= B
24030 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 3b 0a 20  TCF_ValidOvfl;. 
24040 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
24050 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 76 65 72    /* If the over
24060 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63  flow page-list c
24070 61 63 68 65 20 68 61 73 20 62 65 65 6e 20 61 6c  ache has been al
24080 6c 6f 63 61 74 65 64 20 61 6e 64 20 74 68 65 0a  located and the.
24090 20 20 20 20 2a 2a 20 65 6e 74 72 79 20 66 6f 72      ** entry for
240a0 20 74 68 65 20 66 69 72 73 74 20 72 65 71 75 69   the first requi
240b0 72 65 64 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  red overflow pag
240c0 65 20 69 73 20 76 61 6c 69 64 2c 20 73 6b 69 70  e is valid, skip
240d0 0a 20 20 20 20 2a 2a 20 64 69 72 65 63 74 6c 79  .    ** directly
240e0 20 74 6f 20 69 74 2e 0a 20 20 20 20 2a 2f 0a 20   to it..    */. 
240f0 20 20 20 69 66 28 20 28 70 43 75 72 2d 3e 63 75     if( (pCur->cu
24100 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 56 61  rFlags & BTCF_Va
24110 6c 69 64 4f 76 66 6c 29 21 3d 30 0a 20 20 20 20  lidOvfl)!=0.    
24120 20 26 26 20 70 43 75 72 2d 3e 61 4f 76 65 72 66   && pCur->aOverf
24130 6c 6f 77 5b 6f 66 66 73 65 74 2f 6f 76 66 6c 53  low[offset/ovflS
24140 69 7a 65 5d 0a 20 20 20 20 29 7b 0a 20 20 20 20  ize].    ){.    
24150 20 20 69 49 64 78 20 3d 20 28 6f 66 66 73 65 74    iIdx = (offset
24160 2f 6f 76 66 6c 53 69 7a 65 29 3b 0a 20 20 20 20  /ovflSize);.    
24170 20 20 6e 65 78 74 50 61 67 65 20 3d 20 70 43 75    nextPage = pCu
24180 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64  r->aOverflow[iId
24190 78 5d 3b 0a 20 20 20 20 20 20 6f 66 66 73 65 74  x];.      offset
241a0 20 3d 20 28 6f 66 66 73 65 74 25 6f 76 66 6c 53   = (offset%ovflS
241b0 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  ize);.    }..   
241c0 20 66 6f 72 28 20 3b 20 72 63 3d 3d 53 51 4c 49   for( ; rc==SQLI
241d0 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20 26  TE_OK && amt>0 &
241e0 26 20 6e 65 78 74 50 61 67 65 3b 20 69 49 64 78  & nextPage; iIdx
241f0 2b 2b 29 7b 0a 0a 20 20 20 20 20 20 2f 2a 20 49  ++){..      /* I
24200 66 20 72 65 71 75 69 72 65 64 2c 20 70 6f 70 75  f required, popu
24210 6c 61 74 65 20 74 68 65 20 6f 76 65 72 66 6c 6f  late the overflo
24220 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68  w page-list cach
24230 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  e. */.      if( 
24240 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20  (pCur->curFlags 
24250 26 20 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c  & BTCF_ValidOvfl
24260 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
24270 61 73 73 65 72 74 28 21 70 43 75 72 2d 3e 61 4f  assert(!pCur->aO
24280 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 20 7c 7c  verflow[iIdx] ||
24290 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77   pCur->aOverflow
242a0 5b 69 49 64 78 5d 3d 3d 6e 65 78 74 50 61 67 65  [iIdx]==nextPage
242b0 29 3b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d  );.        pCur-
242c0 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d  >aOverflow[iIdx]
242d0 20 3d 20 6e 65 78 74 50 61 67 65 3b 0a 20 20 20   = nextPage;.   
242e0 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20     }..      if( 
242f0 6f 66 66 73 65 74 3e 3d 6f 76 66 6c 53 69 7a 65  offset>=ovflSize
24300 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   ){.        /* T
24310 68 65 20 6f 6e 6c 79 20 72 65 61 73 6f 6e 20 74  he only reason t
24320 6f 20 72 65 61 64 20 74 68 69 73 20 70 61 67 65  o read this page
24330 20 69 73 20 74 6f 20 6f 62 74 61 69 6e 20 74 68   is to obtain th
24340 65 20 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a  e page.        *
24350 2a 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65  * number for the
24360 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74 68   next page in th
24370 65 20 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e  e overflow chain
24380 2e 20 54 68 65 20 70 61 67 65 0a 20 20 20 20 20  . The page.     
24390 20 20 20 2a 2a 20 64 61 74 61 20 69 73 20 6e 6f     ** data is no
243a0 74 20 72 65 71 75 69 72 65 64 2e 20 53 6f 20 66  t required. So f
243b0 69 72 73 74 20 74 72 79 20 74 6f 20 6c 6f 6f 6b  irst try to look
243c0 75 70 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 0a  up the overflow.
243d0 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65 2d          ** page-
243e0 6c 69 73 74 20 63 61 63 68 65 2c 20 69 66 20 61  list cache, if a
243f0 6e 79 2c 20 74 68 65 6e 20 66 61 6c 6c 20 62 61  ny, then fall ba
24400 63 6b 20 74 6f 20 74 68 65 20 67 65 74 4f 76 65  ck to the getOve
24410 72 66 6c 6f 77 50 61 67 65 28 29 0a 20 20 20 20  rflowPage().    
24420 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e      ** function.
24430 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
24440 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74      ** Note that
24450 20 74 68 65 20 61 4f 76 65 72 66 6c 6f 77 5b 5d   the aOverflow[]
24460 20 61 72 72 61 79 20 6d 75 73 74 20 62 65 20 61   array must be a
24470 6c 6c 6f 63 61 74 65 64 20 62 65 63 61 75 73 65  llocated because
24480 20 65 4f 70 21 3d 32 0a 20 20 20 20 20 20 20 20   eOp!=2.        
24490 2a 2a 20 68 65 72 65 2e 20 20 49 66 20 65 4f 70  ** here.  If eOp
244a0 3d 3d 32 2c 20 74 68 65 6e 20 6f 66 66 73 65 74  ==2, then offset
244b0 3d 3d 30 20 61 6e 64 20 74 68 69 73 20 62 72 61  ==0 and this bra
244c0 6e 63 68 20 69 73 20 6e 65 76 65 72 20 74 61 6b  nch is never tak
244d0 65 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  en..        */. 
244e0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 65         assert( e
244f0 4f 70 21 3d 32 20 29 3b 0a 20 20 20 20 20 20 20  Op!=2 );.       
24500 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 63   assert( pCur->c
24510 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 56  urFlags & BTCF_V
24520 61 6c 69 64 4f 76 66 6c 20 29 3b 0a 20 20 20 20  alidOvfl );.    
24530 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
24540 2d 3e 70 42 74 72 65 65 2d 3e 64 62 3d 3d 70 42  ->pBtree->db==pB
24550 74 2d 3e 64 62 20 29 3b 0a 20 20 20 20 20 20 20  t->db );.       
24560 20 69 66 28 20 70 43 75 72 2d 3e 61 4f 76 65 72   if( pCur->aOver
24570 66 6c 6f 77 5b 69 49 64 78 2b 31 5d 20 29 7b 0a  flow[iIdx+1] ){.
24580 20 20 20 20 20 20 20 20 20 20 6e 65 78 74 50 61            nextPa
24590 67 65 20 3d 20 70 43 75 72 2d 3e 61 4f 76 65 72  ge = pCur->aOver
245a0 66 6c 6f 77 5b 69 49 64 78 2b 31 5d 3b 0a 20 20  flow[iIdx+1];.  
245b0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
245c0 20 20 20 20 20 20 20 72 63 20 3d 20 67 65 74 4f         rc = getO
245d0 76 65 72 66 6c 6f 77 50 61 67 65 28 70 42 74 2c  verflowPage(pBt,
245e0 20 6e 65 78 74 50 61 67 65 2c 20 30 2c 20 26 6e   nextPage, 0, &n
245f0 65 78 74 50 61 67 65 29 3b 0a 20 20 20 20 20 20  extPage);.      
24600 20 20 7d 0a 20 20 20 20 20 20 20 20 6f 66 66 73    }.        offs
24610 65 74 20 2d 3d 20 6f 76 66 6c 53 69 7a 65 3b 0a  et -= ovflSize;.
24620 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
24630 20 20 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20       /* Need to 
24640 72 65 61 64 20 74 68 69 73 20 70 61 67 65 20 70  read this page p
24650 72 6f 70 65 72 6c 79 2e 20 49 74 20 63 6f 6e 74  roperly. It cont
24660 61 69 6e 73 20 73 6f 6d 65 20 6f 66 20 74 68 65  ains some of the
24670 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 61 6e 67  .        ** rang
24680 65 20 6f 66 20 64 61 74 61 20 74 68 61 74 20 69  e of data that i
24690 73 20 62 65 69 6e 67 20 72 65 61 64 20 28 65 4f  s being read (eO
246a0 70 3d 3d 30 29 20 6f 72 20 77 72 69 74 74 65 6e  p==0) or written
246b0 20 28 65 4f 70 21 3d 30 29 2e 0a 20 20 20 20 20   (eOp!=0)..     
246c0 20 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c     */.#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 20 20 20 20 20  LOW_READ.       
246f0 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66   sqlite3_file *f
24700 64 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  d;.#endif.      
24710 20 20 69 6e 74 20 61 20 3d 20 61 6d 74 3b 0a 20    int a = amt;. 
24720 20 20 20 20 20 20 20 69 66 28 20 61 20 2b 20 6f         if( a + o
24730 66 66 73 65 74 20 3e 20 6f 76 66 6c 53 69 7a 65  ffset > ovflSize
24740 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 20   ){.          a 
24750 3d 20 6f 76 66 6c 53 69 7a 65 20 2d 20 6f 66 66  = ovflSize - off
24760 73 65 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a  set;.        }..
24770 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 49  #ifdef SQLITE_DI
24780 52 45 43 54 5f 4f 56 45 52 46 4c 4f 57 5f 52 45  RECT_OVERFLOW_RE
24790 41 44 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66  AD.        /* If
247a0 20 61 6c 6c 20 74 68 65 20 66 6f 6c 6c 6f 77 69   all the followi
247b0 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 20 20 20  ng are true:.   
247c0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
247d0 2a 2a 20 20 20 31 29 20 74 68 69 73 20 69 73 20  **   1) this is 
247e0 61 20 72 65 61 64 20 6f 70 65 72 61 74 69 6f 6e  a read operation
247f0 2c 20 61 6e 64 20 0a 20 20 20 20 20 20 20 20 2a  , and .        *
24800 2a 20 20 20 32 29 20 64 61 74 61 20 69 73 20 72  *   2) data is r
24810 65 71 75 69 72 65 64 20 66 72 6f 6d 20 74 68 65  equired from the
24820 20 73 74 61 72 74 20 6f 66 20 74 68 69 73 20 6f   start of this o
24830 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 61 6e  verflow page, an
24840 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 33  d.        **   3
24850 29 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  ) the database i
24860 73 20 66 69 6c 65 2d 62 61 63 6b 65 64 2c 20 61  s file-backed, a
24870 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  nd.        **   
24880 34 29 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6f  4) there is no o
24890 70 65 6e 20 77 72 69 74 65 2d 74 72 61 6e 73 61  pen write-transa
248a0 63 74 69 6f 6e 2c 20 61 6e 64 0a 20 20 20 20 20  ction, and.     
248b0 20 20 20 2a 2a 20 20 20 35 29 20 74 68 65 20 64     **   5) the d
248c0 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20 61  atabase is not a
248d0 20 57 41 4c 20 64 61 74 61 62 61 73 65 2c 0a 20   WAL database,. 
248e0 20 20 20 20 20 20 20 2a 2a 20 20 20 36 29 20 61         **   6) a
248f0 6c 6c 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65  ll data from the
24900 20 70 61 67 65 20 69 73 20 62 65 69 6e 67 20 72   page is being r
24910 65 61 64 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20  ead..        ** 
24920 20 20 37 29 20 61 74 20 6c 65 61 73 74 20 34 20    7) at least 4 
24930 62 79 74 65 73 20 68 61 76 65 20 61 6c 72 65 61  bytes have alrea
24940 64 79 20 62 65 65 6e 20 72 65 61 64 20 69 6e 74  dy been read int
24950 6f 20 74 68 65 20 6f 75 74 70 75 74 20 62 75 66  o the output buf
24960 66 65 72 20 0a 20 20 20 20 20 20 20 20 2a 2a 0a  fer .        **.
24970 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20          ** then 
24980 64 61 74 61 20 63 61 6e 20 62 65 20 72 65 61 64  data can be read
24990 20 64 69 72 65 63 74 6c 79 20 66 72 6f 6d 20 74   directly from t
249a0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
249b0 20 69 6e 74 6f 20 74 68 65 0a 20 20 20 20 20 20   into the.      
249c0 20 20 2a 2a 20 6f 75 74 70 75 74 20 62 75 66 66    ** output buff
249d0 65 72 2c 20 62 79 70 61 73 73 69 6e 67 20 74 68  er, bypassing th
249e0 65 20 70 61 67 65 2d 63 61 63 68 65 20 61 6c 74  e page-cache alt
249f0 6f 67 65 74 68 65 72 2e 20 54 68 69 73 20 73 70  ogether. This sp
24a00 65 65 64 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  eeds.        ** 
24a10 75 70 20 6c 6f 61 64 69 6e 67 20 6c 61 72 67 65  up loading large
24a20 20 72 65 63 6f 72 64 73 20 74 68 61 74 20 73 70   records that sp
24a30 61 6e 20 6d 61 6e 79 20 6f 76 65 72 66 6c 6f 77  an many overflow
24a40 20 70 61 67 65 73 2e 0a 20 20 20 20 20 20 20 20   pages..        
24a50 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 28  */.        if( (
24a60 65 4f 70 26 30 78 30 31 29 3d 3d 30 20 20 20 20  eOp&0x01)==0    
24a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24a90 20 20 2f 2a 20 28 31 29 20 2a 2f 0a 20 20 20 20    /* (1) */.    
24aa0 20 20 20 20 20 26 26 20 6f 66 66 73 65 74 3d 3d       && offset==
24ab0 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
24ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24ad0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28 32             /* (2
24ae0 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 26 26  ) */.         &&
24af0 20 28 62 45 6e 64 20 7c 7c 20 61 3d 3d 6f 76 66   (bEnd || a==ovf
24b00 6c 53 69 7a 65 29 20 20 20 20 20 20 20 20 20 20  lSize)          
24b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24b20 20 20 20 20 2f 2a 20 28 36 29 20 2a 2f 0a 20 20      /* (6) */.  
24b30 20 20 20 20 20 20 20 26 26 20 70 42 74 2d 3e 69         && pBt->i
24b40 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52  nTransaction==TR
24b50 41 4e 53 5f 52 45 41 44 20 20 20 20 20 20 20 20  ANS_READ        
24b60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24b70 28 34 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  (4) */.         
24b80 26 26 20 28 66 64 20 3d 20 73 71 6c 69 74 65 33  && (fd = sqlite3
24b90 50 61 67 65 72 46 69 6c 65 28 70 42 74 2d 3e 70  PagerFile(pBt->p
24ba0 50 61 67 65 72 29 29 2d 3e 70 4d 65 74 68 6f 64  Pager))->pMethod
24bb0 73 20 20 20 20 20 2f 2a 20 28 33 29 20 2a 2f 0a  s     /* (3) */.
24bc0 20 20 20 20 20 20 20 20 20 26 26 20 70 42 74 2d           && pBt-
24bd0 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 31  >pPage1->aData[1
24be0 39 5d 3d 3d 30 78 30 31 20 20 20 20 20 20 20 20  9]==0x01        
24bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
24c00 2a 20 28 35 29 20 2a 2f 0a 20 20 20 20 20 20 20  * (5) */.       
24c10 20 20 26 26 20 26 70 42 75 66 5b 2d 34 5d 3e 3d    && &pBuf[-4]>=
24c20 70 42 75 66 53 74 61 72 74 20 20 20 20 20 20 20  pBufStart       
24c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24c40 20 20 20 20 20 20 20 20 2f 2a 20 28 37 29 20 2a          /* (7) *
24c50 2f 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20  /.        ){.   
24c60 20 20 20 20 20 20 20 75 38 20 61 53 61 76 65 5b         u8 aSave[
24c70 34 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 75 38  4];.          u8
24c80 20 2a 61 57 72 69 74 65 20 3d 20 26 70 42 75 66   *aWrite = &pBuf
24c90 5b 2d 34 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  [-4];.          
24ca0 61 73 73 65 72 74 28 20 61 57 72 69 74 65 3e 3d  assert( aWrite>=
24cb0 70 42 75 66 53 74 61 72 74 20 29 3b 20 20 20 20  pBufStart );    
24cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24cd0 20 20 20 20 20 2f 2a 20 68 65 6e 63 65 20 28 37       /* hence (7
24ce0 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 6d  ) */.          m
24cf0 65 6d 63 70 79 28 61 53 61 76 65 2c 20 61 57 72  emcpy(aSave, aWr
24d00 69 74 65 2c 20 34 29 3b 0a 20 20 20 20 20 20 20  ite, 4);.       
24d10 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
24d20 73 52 65 61 64 28 66 64 2c 20 61 57 72 69 74 65  sRead(fd, aWrite
24d30 2c 20 61 2b 34 2c 20 28 69 36 34 29 70 42 74 2d  , a+4, (i64)pBt-
24d40 3e 70 61 67 65 53 69 7a 65 2a 28 6e 65 78 74 50  >pageSize*(nextP
24d50 61 67 65 2d 31 29 29 3b 0a 20 20 20 20 20 20 20  age-1));.       
24d60 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20 67 65     nextPage = ge
24d70 74 34 62 79 74 65 28 61 57 72 69 74 65 29 3b 0a  t4byte(aWrite);.
24d80 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
24d90 28 61 57 72 69 74 65 2c 20 61 53 61 76 65 2c 20  (aWrite, aSave, 
24da0 34 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  4);.        }els
24db0 65 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20 20  e.#endif..      
24dc0 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20 44 62    {.          Db
24dd0 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 20  Page *pDbPage;. 
24de0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
24df0 6c 69 74 65 33 50 61 67 65 72 41 63 71 75 69 72  lite3PagerAcquir
24e00 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6e  e(pBt->pPager, n
24e10 65 78 74 50 61 67 65 2c 20 26 70 44 62 50 61 67  extPage, &pDbPag
24e20 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
24e30 20 28 28 65 4f 70 26 30 78 30 31 29 3d 3d 30 20   ((eOp&0x01)==0 
24e40 3f 20 50 41 47 45 52 5f 47 45 54 5f 52 45 41 44  ? PAGER_GET_READ
24e50 4f 4e 4c 59 20 3a 20 30 29 0a 20 20 20 20 20 20  ONLY : 0).      
24e60 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 20      );.         
24e70 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
24e80 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
24e90 20 20 61 50 61 79 6c 6f 61 64 20 3d 20 73 71 6c    aPayload = sql
24ea0 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
24eb0 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  (pDbPage);.     
24ec0 20 20 20 20 20 20 20 6e 65 78 74 50 61 67 65 20         nextPage 
24ed0 3d 20 67 65 74 34 62 79 74 65 28 61 50 61 79 6c  = get4byte(aPayl
24ee0 6f 61 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20  oad);.          
24ef0 20 20 72 63 20 3d 20 63 6f 70 79 50 61 79 6c 6f    rc = copyPaylo
24f00 61 64 28 26 61 50 61 79 6c 6f 61 64 5b 6f 66 66  ad(&aPayload[off
24f10 73 65 74 2b 34 5d 2c 20 70 42 75 66 2c 20 61 2c  set+4], pBuf, a,
24f20 20 28 65 4f 70 26 30 78 30 31 29 2c 20 70 44 62   (eOp&0x01), pDb
24f30 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
24f40 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
24f50 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20  nref(pDbPage);. 
24f60 20 20 20 20 20 20 20 20 20 20 20 6f 66 66 73 65             offse
24f70 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  t = 0;.         
24f80 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
24f90 20 20 20 20 20 61 6d 74 20 2d 3d 20 61 3b 0a 20       amt -= a;. 
24fa0 20 20 20 20 20 20 20 70 42 75 66 20 2b 3d 20 61         pBuf += a
24fb0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
24fc0 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53    }..  if( rc==S
24fd0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e  QLITE_OK && amt>
24fe0 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
24ff0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
25000 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  KPT;.  }.  retur
25010 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
25020 65 61 64 20 70 61 72 74 20 6f 66 20 74 68 65 20  ead part of the 
25030 6b 65 79 20 61 73 73 6f 63 69 61 74 65 64 20 77  key associated w
25040 69 74 68 20 63 75 72 73 6f 72 20 70 43 75 72 2e  ith cursor pCur.
25050 20 20 45 78 61 63 74 6c 79 0a 2a 2a 20 22 61 6d    Exactly.** "am
25060 74 22 20 62 79 74 65 73 20 77 69 6c 6c 20 62 65  t" bytes will be
25070 20 74 72 61 6e 73 66 65 72 72 65 64 20 69 6e 74   transferred int
25080 6f 20 70 42 75 66 5b 5d 2e 20 20 54 68 65 20 74  o pBuf[].  The t
25090 72 61 6e 73 66 65 72 0a 2a 2a 20 62 65 67 69 6e  ransfer.** begin
250a0 73 20 61 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a  s at "offset"..*
250b0 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20  *.** The caller 
250c0 6d 75 73 74 20 65 6e 73 75 72 65 20 74 68 61 74  must ensure that
250d0 20 70 43 75 72 20 69 73 20 70 6f 69 6e 74 69 6e   pCur is pointin
250e0 67 20 74 6f 20 61 20 76 61 6c 69 64 20 72 6f 77  g to a valid row
250f0 0a 2a 2a 20 69 6e 20 74 68 65 20 74 61 62 6c 65  .** in the table
25100 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53  ..**.** Return S
25110 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63  QLITE_OK on succ
25120 65 73 73 20 6f 72 20 61 6e 20 65 72 72 6f 72 20  ess or an error 
25130 63 6f 64 65 20 69 66 20 61 6e 79 74 68 69 6e 67  code if anything
25140 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 20   goes.** wrong. 
25150 20 41 6e 20 65 72 72 6f 72 20 69 73 20 72 65 74   An error is ret
25160 75 72 6e 65 64 20 69 66 20 22 6f 66 66 73 65 74  urned if "offset
25170 2b 61 6d 74 22 20 69 73 20 6c 61 72 67 65 72 20  +amt" is larger 
25180 74 68 61 6e 0a 2a 2a 20 74 68 65 20 61 76 61 69  than.** the avai
25190 6c 61 62 6c 65 20 70 61 79 6c 6f 61 64 2e 0a 2a  lable payload..*
251a0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
251b0 65 65 4b 65 79 28 42 74 43 75 72 73 6f 72 20 2a  eeKey(BtCursor *
251c0 70 43 75 72 2c 20 75 33 32 20 6f 66 66 73 65 74  pCur, u32 offset
251d0 2c 20 75 33 32 20 61 6d 74 2c 20 76 6f 69 64 20  , u32 amt, void 
251e0 2a 70 42 75 66 29 7b 0a 20 20 61 73 73 65 72 74  *pBuf){.  assert
251f0 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
25200 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ex(pCur) );.  as
25210 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
25220 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
25230 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
25240 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 26 26 20  ur->iPage>=0 && 
25250 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
25260 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20 61  r->iPage] );.  a
25270 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49  ssert( pCur->aiI
25280 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c  dx[pCur->iPage]<
25290 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
252a0 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c  r->iPage]->nCell
252b0 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 61 63 63   );.  return acc
252c0 65 73 73 50 61 79 6c 6f 61 64 28 70 43 75 72 2c  essPayload(pCur,
252d0 20 6f 66 66 73 65 74 2c 20 61 6d 74 2c 20 28 75   offset, amt, (u
252e0 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 70 42  nsigned char*)pB
252f0 75 66 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  uf, 0);.}../*.**
25300 20 52 65 61 64 20 70 61 72 74 20 6f 66 20 74 68   Read part of th
25310 65 20 64 61 74 61 20 61 73 73 6f 63 69 61 74 65  e data associate
25320 64 20 77 69 74 68 20 63 75 72 73 6f 72 20 70 43  d with cursor pC
25330 75 72 2e 20 20 45 78 61 63 74 6c 79 0a 2a 2a 20  ur.  Exactly.** 
25340 22 61 6d 74 22 20 62 79 74 65 73 20 77 69 6c 6c  "amt" bytes will
25350 20 62 65 20 74 72 61 6e 73 66 65 72 65 64 20 69   be transfered i
25360 6e 74 6f 20 70 42 75 66 5b 5d 2e 20 20 54 68 65  nto pBuf[].  The
25370 20 74 72 61 6e 73 66 65 72 0a 2a 2a 20 62 65 67   transfer.** beg
25380 69 6e 73 20 61 74 20 22 6f 66 66 73 65 74 22 2e  ins at "offset".
25390 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51  .**.** Return SQ
253a0 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65  LITE_OK on succe
253b0 73 73 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63  ss or an error c
253c0 6f 64 65 20 69 66 20 61 6e 79 74 68 69 6e 67 20  ode if anything 
253d0 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 20 20  goes.** wrong.  
253e0 41 6e 20 65 72 72 6f 72 20 69 73 20 72 65 74 75  An error is retu
253f0 72 6e 65 64 20 69 66 20 22 6f 66 66 73 65 74 2b  rned if "offset+
25400 61 6d 74 22 20 69 73 20 6c 61 72 67 65 72 20 74  amt" is larger t
25410 68 61 6e 0a 2a 2a 20 74 68 65 20 61 76 61 69 6c  han.** the avail
25420 61 62 6c 65 20 70 61 79 6c 6f 61 64 2e 0a 2a 2f  able payload..*/
25430 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
25440 65 44 61 74 61 28 42 74 43 75 72 73 6f 72 20 2a  eData(BtCursor *
25450 70 43 75 72 2c 20 75 33 32 20 6f 66 66 73 65 74  pCur, u32 offset
25460 2c 20 75 33 32 20 61 6d 74 2c 20 76 6f 69 64 20  , u32 amt, void 
25470 2a 70 42 75 66 29 7b 0a 20 20 69 6e 74 20 72 63  *pBuf){.  int rc
25480 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
25490 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a  E_OMIT_INCRBLOB.
254a0 20 20 69 66 20 28 20 70 43 75 72 2d 3e 65 53 74    if ( pCur->eSt
254b0 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41  ate==CURSOR_INVA
254c0 4c 49 44 20 29 7b 0a 20 20 20 20 72 65 74 75 72  LID ){.    retur
254d0 6e 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 3b 0a  n SQLITE_ABORT;.
254e0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73    }.#endif..  as
254f0 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
25500 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
25510 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75    rc = restoreCu
25520 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75  rsorPosition(pCu
25530 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  r);.  if( rc==SQ
25540 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61  LITE_OK ){.    a
25550 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
25560 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
25570 44 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  D );.    assert(
25580 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20   pCur->iPage>=0 
25590 26 26 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  && pCur->apPage[
255a0 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a  pCur->iPage] );.
255b0 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
255c0 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
255d0 61 67 65 5d 3c 70 43 75 72 2d 3e 61 70 50 61 67  age]<pCur->apPag
255e0 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e  e[pCur->iPage]->
255f0 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 72 63 20  nCell );.    rc 
25600 3d 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28  = accessPayload(
25610 70 43 75 72 2c 20 6f 66 66 73 65 74 2c 20 61 6d  pCur, offset, am
25620 74 2c 20 70 42 75 66 2c 20 30 29 3b 0a 20 20 7d  t, pBuf, 0);.  }
25630 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
25640 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
25650 70 6f 69 6e 74 65 72 20 74 6f 20 70 61 79 6c 6f  pointer to paylo
25660 61 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  ad information f
25670 72 6f 6d 20 74 68 65 20 65 6e 74 72 79 20 74 68  rom the entry th
25680 61 74 20 74 68 65 20 0a 2a 2a 20 70 43 75 72 20  at the .** pCur 
25690 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69  cursor is pointi
256a0 6e 67 20 74 6f 2e 20 20 54 68 65 20 70 6f 69 6e  ng to.  The poin
256b0 74 65 72 20 69 73 20 74 6f 20 74 68 65 20 62 65  ter is to the be
256c0 67 69 6e 6e 69 6e 67 20 6f 66 0a 2a 2a 20 74 68  ginning of.** th
256d0 65 20 6b 65 79 20 69 66 20 69 6e 64 65 78 20 62  e key if index b
256e0 74 72 65 65 73 20 28 70 50 61 67 65 2d 3e 69 6e  trees (pPage->in
256f0 74 4b 65 79 3d 3d 30 29 20 61 6e 64 20 69 73 20  tKey==0) and is 
25700 74 68 65 20 64 61 74 61 20 66 6f 72 0a 2a 2a 20  the data for.** 
25710 74 61 62 6c 65 20 62 74 72 65 65 73 20 28 70 50  table btrees (pP
25720 61 67 65 2d 3e 69 6e 74 4b 65 79 3d 3d 31 29 2e  age->intKey==1).
25730 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   The number of b
25740 79 74 65 73 20 6f 66 20 61 76 61 69 6c 61 62 6c  ytes of availabl
25750 65 0a 2a 2a 20 6b 65 79 2f 64 61 74 61 20 69 73  e.** key/data is
25760 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 2a 70   written into *p
25770 41 6d 74 2e 20 20 49 66 20 2a 70 41 6d 74 3d 3d  Amt.  If *pAmt==
25780 30 2c 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75  0, then the valu
25790 65 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 77 69  e.** returned wi
257a0 6c 6c 20 6e 6f 74 20 62 65 20 61 20 76 61 6c 69  ll not be a vali
257b0 64 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a  d pointer..**.**
257c0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
257d0 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e   an optimization
257e0 2e 20 20 49 74 20 69 73 20 63 6f 6d 6d 6f 6e 20  .  It is common 
257f0 66 6f 72 20 74 68 65 20 65 6e 74 69 72 65 20 6b  for the entire k
25800 65 79 0a 2a 2a 20 61 6e 64 20 64 61 74 61 20 74  ey.** and data t
25810 6f 20 66 69 74 20 6f 6e 20 74 68 65 20 6c 6f 63  o fit on the loc
25820 61 6c 20 70 61 67 65 20 61 6e 64 20 66 6f 72 20  al page and for 
25830 74 68 65 72 65 20 74 6f 20 62 65 20 6e 6f 20 6f  there to be no o
25840 76 65 72 66 6c 6f 77 0a 2a 2a 20 70 61 67 65 73  verflow.** pages
25850 2e 20 20 57 68 65 6e 20 74 68 61 74 20 69 73 20  .  When that is 
25860 73 6f 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  so, this routine
25870 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20   can be used to 
25880 61 63 63 65 73 73 20 74 68 65 0a 2a 2a 20 6b 65  access the.** ke
25890 79 20 61 6e 64 20 64 61 74 61 20 77 69 74 68 6f  y and data witho
258a0 75 74 20 6d 61 6b 69 6e 67 20 61 20 63 6f 70 79  ut making a copy
258b0 2e 20 20 49 66 20 74 68 65 20 6b 65 79 20 61 6e  .  If the key an
258c0 64 2f 6f 72 20 64 61 74 61 20 73 70 69 6c 6c 73  d/or data spills
258d0 0a 2a 2a 20 6f 6e 74 6f 20 6f 76 65 72 66 6c 6f  .** onto overflo
258e0 77 20 70 61 67 65 73 2c 20 74 68 65 6e 20 61 63  w pages, then ac
258f0 63 65 73 73 50 61 79 6c 6f 61 64 28 29 20 6d 75  cessPayload() mu
25900 73 74 20 62 65 20 75 73 65 64 20 74 6f 20 72 65  st be used to re
25910 61 73 73 65 6d 62 6c 65 0a 2a 2a 20 74 68 65 20  assemble.** the 
25920 6b 65 79 2f 64 61 74 61 20 61 6e 64 20 63 6f 70  key/data and cop
25930 79 20 69 74 20 69 6e 74 6f 20 61 20 70 72 65 61  y it into a prea
25940 6c 6c 6f 63 61 74 65 64 20 62 75 66 66 65 72 2e  llocated buffer.
25950 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f 69 6e 74  .**.** The point
25960 65 72 20 72 65 74 75 72 6e 65 64 20 62 79 20 74  er returned by t
25970 68 69 73 20 72 6f 75 74 69 6e 65 20 6c 6f 6f 6b  his routine look
25980 73 20 64 69 72 65 63 74 6c 79 20 69 6e 74 6f 20  s directly into 
25990 74 68 65 20 63 61 63 68 65 64 0a 2a 2a 20 70 61  the cached.** pa
259a0 67 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ge of the databa
259b0 73 65 2e 20 20 54 68 65 20 64 61 74 61 20 6d 69  se.  The data mi
259c0 67 68 74 20 63 68 61 6e 67 65 20 6f 72 20 6d 6f  ght change or mo
259d0 76 65 20 74 68 65 20 6e 65 78 74 20 74 69 6d 65  ve the next time
259e0 0a 2a 2a 20 61 6e 79 20 62 74 72 65 65 20 72 6f  .** any btree ro
259f0 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e  utine is called.
25a00 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .*/.static const
25a10 20 76 6f 69 64 20 2a 66 65 74 63 68 50 61 79 6c   void *fetchPayl
25a20 6f 61 64 28 0a 20 20 42 74 43 75 72 73 6f 72 20  oad(.  BtCursor 
25a30 2a 70 43 75 72 2c 20 20 20 20 20 20 2f 2a 20 43  *pCur,      /* C
25a40 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74  ursor pointing t
25a50 6f 20 65 6e 74 72 79 20 74 6f 20 72 65 61 64 20  o entry to read 
25a60 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32 20 2a 70  from */.  u32 *p
25a70 41 6d 74 20 20 20 20 20 20 20 20 20 20 20 20 2f  Amt            /
25a80 2a 20 57 72 69 74 65 20 74 68 65 20 6e 75 6d 62  * Write the numb
25a90 65 72 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20  er of available 
25aa0 62 79 74 65 73 20 68 65 72 65 20 2a 2f 0a 29 7b  bytes here */.){
25ab0 0a 20 20 75 33 32 20 61 6d 74 3b 0a 20 20 61 73  .  u32 amt;.  as
25ac0 73 65 72 74 28 20 70 43 75 72 21 3d 30 20 26 26  sert( pCur!=0 &&
25ad0 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20   pCur->iPage>=0 
25ae0 26 26 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  && pCur->apPage[
25af0 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 3b 0a 20  pCur->iPage]);. 
25b00 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
25b10 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
25b20 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28  LID );.  assert(
25b30 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
25b40 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65  eld(pCur->pBtree
25b50 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  ->db->mutex) );.
25b60 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
25b70 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
25b80 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
25b90 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
25ba0 69 50 61 67 65 5d 3c 70 43 75 72 2d 3e 61 70 50  iPage]<pCur->apP
25bb0 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
25bc0 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73  ->nCell );.  ass
25bd0 65 72 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  ert( pCur->info.
25be0 6e 53 69 7a 65 3e 30 20 29 3b 0a 20 20 61 73 73  nSize>0 );.  ass
25bf0 65 72 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  ert( pCur->info.
25c00 70 50 61 79 6c 6f 61 64 3e 70 43 75 72 2d 3e 61  pPayload>pCur->a
25c10 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
25c20 65 5d 2d 3e 61 44 61 74 61 20 7c 7c 20 43 4f 52  e]->aData || COR
25c30 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 61 73 73  RUPT_DB );.  ass
25c40 65 72 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  ert( pCur->info.
25c50 70 50 61 79 6c 6f 61 64 3c 70 43 75 72 2d 3e 61  pPayload<pCur->a
25c60 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
25c70 65 5d 2d 3e 61 44 61 74 61 45 6e 64 20 7c 7c 43  e]->aDataEnd ||C
25c80 4f 52 52 55 50 54 5f 44 42 29 3b 0a 20 20 61 6d  ORRUPT_DB);.  am
25c90 74 20 3d 20 28 69 6e 74 29 28 70 43 75 72 2d 3e  t = (int)(pCur->
25ca0 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
25cb0 67 65 5d 2d 3e 61 44 61 74 61 45 6e 64 20 2d 20  ge]->aDataEnd - 
25cc0 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c  pCur->info.pPayl
25cd0 6f 61 64 29 3b 0a 20 20 69 66 28 20 70 43 75 72  oad);.  if( pCur
25ce0 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3c 61 6d  ->info.nLocal<am
25cf0 74 20 29 20 61 6d 74 20 3d 20 70 43 75 72 2d 3e  t ) amt = pCur->
25d00 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 2a  info.nLocal;.  *
25d10 70 41 6d 74 20 3d 20 61 6d 74 3b 0a 20 20 72 65  pAmt = amt;.  re
25d20 74 75 72 6e 20 28 76 6f 69 64 2a 29 70 43 75 72  turn (void*)pCur
25d30 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64 3b  ->info.pPayload;
25d40 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 74  .}.../*.** For t
25d50 68 65 20 65 6e 74 72 79 20 74 68 61 74 20 63 75  he entry that cu
25d60 72 73 6f 72 20 70 43 75 72 20 69 73 20 70 6f 69  rsor pCur is poi
25d70 6e 74 20 74 6f 2c 20 72 65 74 75 72 6e 20 61 73  nt to, return as
25d80 0a 2a 2a 20 6d 61 6e 79 20 62 79 74 65 73 20 6f  .** many bytes o
25d90 66 20 74 68 65 20 6b 65 79 20 6f 72 20 64 61 74  f the key or dat
25da0 61 20 61 73 20 61 72 65 20 61 76 61 69 6c 61 62  a as are availab
25db0 6c 65 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 0a  le on the local.
25dc0 2a 2a 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20  ** b-tree page. 
25dd0 20 57 72 69 74 65 20 74 68 65 20 6e 75 6d 62 65   Write the numbe
25de0 72 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 62  r of available b
25df0 79 74 65 73 20 69 6e 74 6f 20 2a 70 41 6d 74 2e  ytes into *pAmt.
25e00 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f 69 6e 74  .**.** The point
25e10 65 72 20 72 65 74 75 72 6e 65 64 20 69 73 20 65  er returned is e
25e20 70 68 65 6d 65 72 61 6c 2e 20 20 54 68 65 20 6b  phemeral.  The k
25e30 65 79 2f 64 61 74 61 20 6d 61 79 20 6d 6f 76 65  ey/data may move
25e40 0a 2a 2a 20 6f 72 20 62 65 20 64 65 73 74 72 6f  .** or be destro
25e50 79 65 64 20 6f 6e 20 74 68 65 20 6e 65 78 74 20  yed on the next 
25e60 63 61 6c 6c 20 74 6f 20 61 6e 79 20 42 74 72 65  call to any Btre
25e70 65 20 72 6f 75 74 69 6e 65 2c 0a 2a 2a 20 69 6e  e routine,.** in
25e80 63 6c 75 64 69 6e 67 20 63 61 6c 6c 73 20 66 72  cluding calls fr
25e90 6f 6d 20 6f 74 68 65 72 20 74 68 72 65 61 64 73  om other threads
25ea0 20 61 67 61 69 6e 73 74 20 74 68 65 20 73 61 6d   against the sam
25eb0 65 20 63 61 63 68 65 2e 0a 2a 2a 20 48 65 6e 63  e cache..** Henc
25ec0 65 2c 20 61 20 6d 75 74 65 78 20 6f 6e 20 74 68  e, a mutex on th
25ed0 65 20 42 74 53 68 61 72 65 64 20 73 68 6f 75 6c  e BtShared shoul
25ee0 64 20 62 65 20 68 65 6c 64 20 70 72 69 6f 72 20  d be held prior 
25ef0 74 6f 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 74 68  to calling.** th
25f00 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a  is routine..**.*
25f10 2a 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65 73  * These routines
25f20 20 69 73 20 75 73 65 64 20 74 6f 20 67 65 74 20   is used to get 
25f30 71 75 69 63 6b 20 61 63 63 65 73 73 20 74 6f 20  quick access to 
25f40 6b 65 79 20 61 6e 64 20 64 61 74 61 0a 2a 2a 20  key and data.** 
25f50 69 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61  in the common ca
25f60 73 65 20 77 68 65 72 65 20 6e 6f 20 6f 76 65 72  se where no over
25f70 66 6c 6f 77 20 70 61 67 65 73 20 61 72 65 20 75  flow pages are u
25f80 73 65 64 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 76 6f  sed..*/.const vo
25f90 69 64 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65  id *sqlite3Btree
25fa0 4b 65 79 46 65 74 63 68 28 42 74 43 75 72 73 6f  KeyFetch(BtCurso
25fb0 72 20 2a 70 43 75 72 2c 20 75 33 32 20 2a 70 41  r *pCur, u32 *pA
25fc0 6d 74 29 7b 0a 20 20 72 65 74 75 72 6e 20 66 65  mt){.  return fe
25fd0 74 63 68 50 61 79 6c 6f 61 64 28 70 43 75 72 2c  tchPayload(pCur,
25fe0 20 70 41 6d 74 29 3b 0a 7d 0a 63 6f 6e 73 74 20   pAmt);.}.const 
25ff0 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 42 74 72  void *sqlite3Btr
26000 65 65 44 61 74 61 46 65 74 63 68 28 42 74 43 75  eeDataFetch(BtCu
26010 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20  rsor *pCur, u32 
26020 2a 70 41 6d 74 29 7b 0a 20 20 72 65 74 75 72 6e  *pAmt){.  return
26030 20 66 65 74 63 68 50 61 79 6c 6f 61 64 28 70 43   fetchPayload(pC
26040 75 72 2c 20 70 41 6d 74 29 3b 0a 7d 0a 0a 0a 2f  ur, pAmt);.}.../
26050 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75  *.** Move the cu
26060 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20 61 20 6e  rsor down to a n
26070 65 77 20 63 68 69 6c 64 20 70 61 67 65 2e 20 20  ew child page.  
26080 54 68 65 20 6e 65 77 50 67 6e 6f 20 61 72 67 75  The newPgno argu
26090 6d 65 6e 74 20 69 73 20 74 68 65 0a 2a 2a 20 70  ment is the.** p
260a0 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  age number of th
260b0 65 20 63 68 69 6c 64 20 70 61 67 65 20 74 6f 20  e child page to 
260c0 6d 6f 76 65 20 74 6f 2e 0a 2a 2a 0a 2a 2a 20 54  move to..**.** T
260d0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
260e0 75 72 6e 73 20 53 51 4c 49 54 45 5f 43 4f 52 52  urns SQLITE_CORR
260f0 55 50 54 20 69 66 20 74 68 65 20 70 61 67 65 2d  UPT if the page-
26100 68 65 61 64 65 72 20 66 6c 61 67 73 20 66 69 65  header flags fie
26110 6c 64 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77  ld of.** the new
26120 20 63 68 69 6c 64 20 70 61 67 65 20 64 6f 65 73   child page does
26130 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 20 66   not match the f
26140 6c 61 67 73 20 66 69 65 6c 64 20 6f 66 20 74 68  lags field of th
26150 65 20 70 61 72 65 6e 74 20 28 69 2e 65 2e 0a 2a  e parent (i.e..*
26160 2a 20 69 66 20 61 6e 20 69 6e 74 6b 65 79 20 70  * if an intkey p
26170 61 67 65 20 61 70 70 65 61 72 73 20 74 6f 20 62  age appears to b
26180 65 20 74 68 65 20 70 61 72 65 6e 74 20 6f 66 20  e the parent of 
26190 61 20 6e 6f 6e 2d 69 6e 74 6b 65 79 20 70 61 67  a non-intkey pag
261a0 65 2c 20 6f 72 0a 2a 2a 20 76 69 63 65 2d 76 65  e, or.** vice-ve
261b0 72 73 61 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rsa)..*/.static 
261c0 69 6e 74 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28  int moveToChild(
261d0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
261e0 75 33 32 20 6e 65 77 50 67 6e 6f 29 7b 0a 20 20  u32 newPgno){.  
261f0 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 69 20  int rc;.  int i 
26200 3d 20 70 43 75 72 2d 3e 69 50 61 67 65 3b 0a 20  = pCur->iPage;. 
26210 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 50 61   MemPage *pNewPa
26220 67 65 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  ge;.  BtShared *
26230 70 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b  pBt = pCur->pBt;
26240 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
26250 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
26260 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
26270 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
26280 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
26290 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50  assert( pCur->iP
262a0 61 67 65 3c 42 54 43 55 52 53 4f 52 5f 4d 41 58  age<BTCURSOR_MAX
262b0 5f 44 45 50 54 48 20 29 3b 0a 20 20 61 73 73 65  _DEPTH );.  asse
262c0 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e  rt( pCur->iPage>
262d0 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72  =0 );.  if( pCur
262e0 2d 3e 69 50 61 67 65 3e 3d 28 42 54 43 55 52 53  ->iPage>=(BTCURS
262f0 4f 52 5f 4d 41 58 5f 44 45 50 54 48 2d 31 29 20  OR_MAX_DEPTH-1) 
26300 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
26310 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
26320 54 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 67 65  T;.  }.  rc = ge
26330 74 41 6e 64 49 6e 69 74 50 61 67 65 28 70 42 74  tAndInitPage(pBt
26340 2c 20 6e 65 77 50 67 6e 6f 2c 20 26 70 4e 65 77  , newPgno, &pNew
26350 50 61 67 65 2c 0a 20 20 20 20 20 20 20 20 20 20  Page,.          
26360 20 20 20 20 20 28 70 43 75 72 2d 3e 63 75 72 46       (pCur->curF
26370 6c 61 67 73 20 26 20 42 54 43 46 5f 57 72 69 74  lags & BTCF_Writ
26380 65 46 6c 61 67 29 3d 3d 30 20 3f 20 50 41 47 45  eFlag)==0 ? PAGE
26390 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20 3a  R_GET_READONLY :
263a0 20 30 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20   0);.  if( rc ) 
263b0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 70 43 75  return rc;.  pCu
263c0 72 2d 3e 61 70 50 61 67 65 5b 69 2b 31 5d 20 3d  r->apPage[i+1] =
263d0 20 70 4e 65 77 50 61 67 65 3b 0a 20 20 70 43 75   pNewPage;.  pCu
263e0 72 2d 3e 61 69 49 64 78 5b 69 2b 31 5d 20 3d 20  r->aiIdx[i+1] = 
263f0 30 3b 0a 20 20 70 43 75 72 2d 3e 69 50 61 67 65  0;.  pCur->iPage
26400 2b 2b 3b 0a 0a 20 20 70 43 75 72 2d 3e 69 6e 66  ++;..  pCur->inf
26410 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70  o.nSize = 0;.  p
26420 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d  Cur->curFlags &=
26430 20 7e 28 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65   ~(BTCF_ValidNKe
26440 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c  y|BTCF_ValidOvfl
26450 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 50 61 67  );.  if( pNewPag
26460 65 2d 3e 6e 43 65 6c 6c 3c 31 20 7c 7c 20 70 4e  e->nCell<1 || pN
26470 65 77 50 61 67 65 2d 3e 69 6e 74 4b 65 79 21 3d  ewPage->intKey!=
26480 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d 2d  pCur->apPage[i]-
26490 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 72  >intKey ){.    r
264a0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
264b0 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20  RUPT_BKPT;.  }. 
264c0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
264d0 4b 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45  K;.}..#if SQLITE
264e0 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 50 61 67  _DEBUG./*.** Pag
264f0 65 20 70 50 61 72 65 6e 74 20 69 73 20 61 6e 20  e pParent is an 
26500 69 6e 74 65 72 6e 61 6c 20 28 6e 6f 6e 2d 6c 65  internal (non-le
26510 61 66 29 20 74 72 65 65 20 70 61 67 65 2e 20 54  af) tree page. T
26520 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 0a 2a 2a  his function .**
26530 20 61 73 73 65 72 74 73 20 74 68 61 74 20 70 61   asserts that pa
26540 67 65 20 6e 75 6d 62 65 72 20 69 43 68 69 6c 64  ge number iChild
26550 20 69 73 20 74 68 65 20 6c 65 66 74 2d 63 68 69   is the left-chi
26560 6c 64 20 69 66 20 74 68 65 20 69 49 64 78 27 74  ld if the iIdx't
26570 68 0a 2a 2a 20 63 65 6c 6c 20 69 6e 20 70 61 67  h.** cell in pag
26580 65 20 70 50 61 72 65 6e 74 2e 20 4f 72 2c 20 69  e pParent. Or, i
26590 66 20 69 49 64 78 20 69 73 20 65 71 75 61 6c 20  f iIdx is equal 
265a0 74 6f 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d  to the total num
265b0 62 65 72 20 6f 66 0a 2a 2a 20 63 65 6c 6c 73 20  ber of.** cells 
265c0 69 6e 20 70 50 61 72 65 6e 74 2c 20 74 68 61 74  in pParent, that
265d0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 43 68   page number iCh
265e0 69 6c 64 20 69 73 20 74 68 65 20 72 69 67 68 74  ild is the right
265f0 2d 63 68 69 6c 64 20 6f 66 0a 2a 2a 20 74 68 65  -child of.** the
26600 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   page..*/.static
26610 20 76 6f 69 64 20 61 73 73 65 72 74 50 61 72 65   void assertPare
26620 6e 74 49 6e 64 65 78 28 4d 65 6d 50 61 67 65 20  ntIndex(MemPage 
26630 2a 70 50 61 72 65 6e 74 2c 20 69 6e 74 20 69 49  *pParent, int iI
26640 64 78 2c 20 50 67 6e 6f 20 69 43 68 69 6c 64 29  dx, Pgno iChild)
26650 7b 0a 20 20 69 66 28 20 43 4f 52 52 55 50 54 5f  {.  if( CORRUPT_
26660 44 42 20 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a  DB ) return;  /*
26670 20 54 68 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20   The conditions 
26680 74 65 73 74 65 64 20 62 65 6c 6f 77 20 6d 69 67  tested below mig
26690 68 74 20 6e 6f 74 20 62 65 20 74 72 75 65 0a 20  ht not be true. 
266a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
266b0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 6e             ** in
266c0 20 61 20 63 6f 72 72 75 70 74 20 64 61 74 61 62   a corrupt datab
266d0 61 73 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ase */.  assert(
266e0 20 69 49 64 78 3c 3d 70 50 61 72 65 6e 74 2d 3e   iIdx<=pParent->
266f0 6e 43 65 6c 6c 20 29 3b 0a 20 20 69 66 28 20 69  nCell );.  if( i
26700 49 64 78 3d 3d 70 50 61 72 65 6e 74 2d 3e 6e 43  Idx==pParent->nC
26710 65 6c 6c 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ell ){.    asser
26720 74 28 20 67 65 74 34 62 79 74 65 28 26 70 50 61  t( get4byte(&pPa
26730 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61 72  rent->aData[pPar
26740 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  ent->hdrOffset+8
26750 5d 29 3d 3d 69 43 68 69 6c 64 20 29 3b 0a 20 20  ])==iChild );.  
26760 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
26770 74 28 20 67 65 74 34 62 79 74 65 28 66 69 6e 64  t( get4byte(find
26780 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 69 49  Cell(pParent, iI
26790 64 78 29 29 3d 3d 69 43 68 69 6c 64 20 29 3b 0a  dx))==iChild );.
267a0 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 20 64    }.}.#else.#  d
267b0 65 66 69 6e 65 20 61 73 73 65 72 74 50 61 72 65  efine assertPare
267c0 6e 74 49 6e 64 65 78 28 78 2c 79 2c 7a 29 20 0a  ntIndex(x,y,z) .
267d0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 6f  #endif../*.** Mo
267e0 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 75 70  ve the cursor up
267f0 20 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20 70   to the parent p
26800 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 70 43 75 72 2d  age..**.** pCur-
26810 3e 69 64 78 20 69 73 20 73 65 74 20 74 6f 20 74  >idx is set to t
26820 68 65 20 63 65 6c 6c 20 69 6e 64 65 78 20 74 68  he cell index th
26830 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  at contains the 
26840 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68  pointer.** to th
26850 65 20 70 61 67 65 20 77 65 20 61 72 65 20 63 6f  e page we are co
26860 6d 69 6e 67 20 66 72 6f 6d 2e 20 20 49 66 20 77  ming from.  If w
26870 65 20 61 72 65 20 63 6f 6d 69 6e 67 20 66 72 6f  e are coming fro
26880 6d 20 74 68 65 0a 2a 2a 20 72 69 67 68 74 2d 6d  m the.** right-m
26890 6f 73 74 20 63 68 69 6c 64 20 70 61 67 65 20 74  ost child page t
268a0 68 65 6e 20 70 43 75 72 2d 3e 69 64 78 20 69 73  hen pCur->idx is
268b0 20 73 65 74 20 74 6f 20 6f 6e 65 20 6d 6f 72 65   set to one more
268c0 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20 6c 61 72   than.** the lar
268d0 67 65 73 74 20 63 65 6c 6c 20 69 6e 64 65 78 2e  gest cell index.
268e0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
268f0 6d 6f 76 65 54 6f 50 61 72 65 6e 74 28 42 74 43  moveToParent(BtC
26900 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
26910 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
26920 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
26930 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
26940 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
26950 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65  _VALID );.  asse
26960 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e  rt( pCur->iPage>
26970 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
26980 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
26990 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20 61 73  ->iPage] );.  as
269a0 73 65 72 74 50 61 72 65 6e 74 49 6e 64 65 78 28  sertParentIndex(
269b0 0a 20 20 20 20 70 43 75 72 2d 3e 61 70 50 61 67  .    pCur->apPag
269c0 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d  e[pCur->iPage-1]
269d0 2c 20 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49  , .    pCur->aiI
269e0 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 31  dx[pCur->iPage-1
269f0 5d 2c 20 0a 20 20 20 20 70 43 75 72 2d 3e 61 70  ], .    pCur->ap
26a00 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
26a10 5d 2d 3e 70 67 6e 6f 0a 20 20 29 3b 0a 20 20 74  ]->pgno.  );.  t
26a20 65 73 74 63 61 73 65 28 20 70 43 75 72 2d 3e 61  estcase( pCur->a
26a30 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
26a40 2d 31 5d 20 3e 20 70 43 75 72 2d 3e 61 70 50 61  -1] > pCur->apPa
26a50 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 31  ge[pCur->iPage-1
26a60 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 0a 20 20 72  ]->nCell );..  r
26a70 65 6c 65 61 73 65 50 61 67 65 28 70 43 75 72 2d  eleasePage(pCur-
26a80 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
26a90 61 67 65 5d 29 3b 0a 20 20 70 43 75 72 2d 3e 69  age]);.  pCur->i
26aa0 50 61 67 65 2d 2d 3b 0a 20 20 70 43 75 72 2d 3e  Page--;.  pCur->
26ab0 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a  info.nSize = 0;.
26ac0 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73    pCur->curFlags
26ad0 20 26 3d 20 7e 28 42 54 43 46 5f 56 61 6c 69 64   &= ~(BTCF_Valid
26ae0 4e 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f  NKey|BTCF_ValidO
26af0 76 66 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  vfl);.}../*.** M
26b00 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 74  ove the cursor t
26b10 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 72  o point to the r
26b20 6f 6f 74 20 70 61 67 65 20 6f 66 20 69 74 73 20  oot page of its 
26b30 62 2d 74 72 65 65 20 73 74 72 75 63 74 75 72 65  b-tree structure
26b40 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 74  ..**.** If the t
26b50 61 62 6c 65 20 68 61 73 20 61 20 76 69 72 74 75  able has a virtu
26b60 61 6c 20 72 6f 6f 74 20 70 61 67 65 2c 20 74 68  al root page, th
26b70 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  en the cursor is
26b80 20 6d 6f 76 65 64 20 74 6f 20 70 6f 69 6e 74 0a   moved to point.
26b90 2a 2a 20 74 6f 20 74 68 65 20 76 69 72 74 75 61  ** to the virtua
26ba0 6c 20 72 6f 6f 74 20 70 61 67 65 20 69 6e 73 74  l root page inst
26bb0 65 61 64 20 6f 66 20 74 68 65 20 61 63 74 75 61  ead of the actua
26bc0 6c 20 72 6f 6f 74 20 70 61 67 65 2e 20 41 20 74  l root page. A t
26bd0 61 62 6c 65 20 68 61 73 20 61 0a 2a 2a 20 76 69  able has a.** vi
26be0 72 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 20  rtual root page 
26bf0 77 68 65 6e 20 74 68 65 20 61 63 74 75 61 6c 20  when the actual 
26c00 72 6f 6f 74 20 70 61 67 65 20 63 6f 6e 74 61 69  root page contai
26c10 6e 73 20 6e 6f 20 63 65 6c 6c 73 20 61 6e 64 20  ns no cells and 
26c20 61 20 0a 2a 2a 20 73 69 6e 67 6c 65 20 63 68 69  a .** single chi
26c30 6c 64 20 70 61 67 65 2e 20 54 68 69 73 20 63 61  ld page. This ca
26c40 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 77 69  n only happen wi
26c50 74 68 20 74 68 65 20 74 61 62 6c 65 20 72 6f 6f  th the table roo
26c60 74 65 64 20 61 74 20 70 61 67 65 20 31 2e 0a 2a  ted at page 1..*
26c70 2a 0a 2a 2a 20 49 66 20 74 68 65 20 62 2d 74 72  *.** If the b-tr
26c80 65 65 20 73 74 72 75 63 74 75 72 65 20 69 73 20  ee structure is 
26c90 65 6d 70 74 79 2c 20 74 68 65 20 63 75 72 73 6f  empty, the curso
26ca0 72 20 73 74 61 74 65 20 69 73 20 73 65 74 20 74  r state is set t
26cb0 6f 20 0a 2a 2a 20 43 55 52 53 4f 52 5f 49 4e 56  o .** CURSOR_INV
26cc0 41 4c 49 44 2e 20 4f 74 68 65 72 77 69 73 65 2c  ALID. Otherwise,
26cd0 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 73   the cursor is s
26ce0 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74  et to point to t
26cf0 68 65 20 66 69 72 73 74 0a 2a 2a 20 63 65 6c 6c  he first.** cell
26d00 20 6c 6f 63 61 74 65 64 20 6f 6e 20 74 68 65 20   located on the 
26d10 72 6f 6f 74 20 28 6f 72 20 76 69 72 74 75 61 6c  root (or virtual
26d20 20 72 6f 6f 74 29 20 70 61 67 65 20 61 6e 64 20   root) page and 
26d30 74 68 65 20 63 75 72 73 6f 72 20 73 74 61 74 65  the cursor state
26d40 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 43 55  .** is set to CU
26d50 52 53 4f 52 5f 56 41 4c 49 44 2e 0a 2a 2a 0a 2a  RSOR_VALID..**.*
26d60 2a 20 49 66 20 74 68 69 73 20 66 75 6e 63 74 69  * If this functi
26d70 6f 6e 20 72 65 74 75 72 6e 73 20 73 75 63 63 65  on returns succe
26d80 73 73 66 75 6c 6c 79 2c 20 69 74 20 6d 61 79 20  ssfully, it may 
26d90 62 65 20 61 73 73 75 6d 65 64 20 74 68 61 74 20  be assumed that 
26da0 74 68 65 0a 2a 2a 20 70 61 67 65 2d 68 65 61 64  the.** page-head
26db0 65 72 20 66 6c 61 67 73 20 69 6e 64 69 63 61 74  er flags indicat
26dc0 65 20 74 68 61 74 20 74 68 65 20 5b 76 69 72 74  e that the [virt
26dd0 75 61 6c 5d 20 72 6f 6f 74 2d 70 61 67 65 20 69  ual] root-page i
26de0 73 20 74 68 65 20 65 78 70 65 63 74 65 64 20 0a  s the expected .
26df0 2a 2a 20 6b 69 6e 64 20 6f 66 20 62 2d 74 72 65  ** kind of b-tre
26e00 65 20 70 61 67 65 20 28 69 2e 65 2e 20 69 66 20  e page (i.e. if 
26e10 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20 74 68 65  when opening the
26e20 20 63 75 72 73 6f 72 20 74 68 65 20 63 61 6c 6c   cursor the call
26e30 65 72 20 64 69 64 20 6e 6f 74 0a 2a 2a 20 73 70  er did not.** sp
26e40 65 63 69 66 79 20 61 20 4b 65 79 49 6e 66 6f 20  ecify a KeyInfo 
26e50 73 74 72 75 63 74 75 72 65 20 74 68 65 20 66 6c  structure the fl
26e60 61 67 73 20 62 79 74 65 20 69 73 20 73 65 74 20  ags byte is set 
26e70 74 6f 20 30 78 30 35 20 6f 72 20 30 78 30 44 2c  to 0x05 or 0x0D,
26e80 0a 2a 2a 20 69 6e 64 69 63 61 74 69 6e 67 20 61  .** indicating a
26e90 20 74 61 62 6c 65 20 62 2d 74 72 65 65 2c 20 6f   table b-tree, o
26ea0 72 20 69 66 20 74 68 65 20 63 61 6c 6c 65 72 20  r if the caller 
26eb0 64 69 64 20 73 70 65 63 69 66 79 20 61 20 4b 65  did specify a Ke
26ec0 79 49 6e 66 6f 20 0a 2a 2a 20 73 74 72 75 63 74  yInfo .** struct
26ed0 75 72 65 20 74 68 65 20 66 6c 61 67 73 20 62 79  ure the flags by
26ee0 74 65 20 69 73 20 73 65 74 20 74 6f 20 30 78 30  te is set to 0x0
26ef0 32 20 6f 72 20 30 78 30 41 2c 20 69 6e 64 69 63  2 or 0x0A, indic
26f00 61 74 69 6e 67 20 61 6e 20 69 6e 64 65 78 0a 2a  ating an index.*
26f10 2a 20 62 2d 74 72 65 65 29 2e 0a 2a 2f 0a 73 74  * b-tree)..*/.st
26f20 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 52  atic int moveToR
26f30 6f 6f 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43  oot(BtCursor *pC
26f40 75 72 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  ur){.  MemPage *
26f50 70 52 6f 6f 74 3b 0a 20 20 69 6e 74 20 72 63 20  pRoot;.  int rc 
26f60 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
26f70 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
26f80 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
26f90 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55 52 53  ;.  assert( CURS
26fa0 4f 52 5f 49 4e 56 41 4c 49 44 20 3c 20 43 55 52  OR_INVALID < CUR
26fb0 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20  SOR_REQUIRESEEK 
26fc0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55 52  );.  assert( CUR
26fd0 53 4f 52 5f 56 41 4c 49 44 20 20 20 3c 20 43 55  SOR_VALID   < CU
26fe0 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b  RSOR_REQUIRESEEK
26ff0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55   );.  assert( CU
27000 52 53 4f 52 5f 46 41 55 4c 54 20 20 20 3e 20 43  RSOR_FAULT   > C
27010 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45  URSOR_REQUIRESEE
27020 4b 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d  K );.  if( pCur-
27030 3e 65 53 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f  >eState>=CURSOR_
27040 52 45 51 55 49 52 45 53 45 45 4b 20 29 7b 0a 20  REQUIRESEEK ){. 
27050 20 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74     if( pCur->eSt
27060 61 74 65 3d 3d 43 55 52 53 4f 52 5f 46 41 55 4c  ate==CURSOR_FAUL
27070 54 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  T ){.      asser
27080 74 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78  t( pCur->skipNex
27090 74 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  t!=SQLITE_OK );.
270a0 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 43 75        return pCu
270b0 72 2d 3e 73 6b 69 70 4e 65 78 74 3b 0a 20 20 20  r->skipNext;.   
270c0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74   }.    sqlite3Bt
270d0 72 65 65 43 6c 65 61 72 43 75 72 73 6f 72 28 70  reeClearCursor(p
270e0 43 75 72 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  Cur);.  }..  if(
270f0 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20   pCur->iPage>=0 
27100 29 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 43  ){.    while( pC
27110 75 72 2d 3e 69 50 61 67 65 20 29 20 72 65 6c 65  ur->iPage ) rele
27120 61 73 65 50 61 67 65 28 70 43 75 72 2d 3e 61 70  asePage(pCur->ap
27130 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
27140 2d 2d 5d 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66  --]);.  }else if
27150 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74  ( pCur->pgnoRoot
27160 3d 3d 30 20 29 7b 0a 20 20 20 20 70 43 75 72 2d  ==0 ){.    pCur-
27170 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
27180 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 72 65  _INVALID;.    re
27190 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
271a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20    }else{.    rc 
271b0 3d 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65  = getAndInitPage
271c0 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 70  (pCur->pBtree->p
271d0 42 74 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f  Bt, pCur->pgnoRo
271e0 6f 74 2c 20 26 70 43 75 72 2d 3e 61 70 50 61 67  ot, &pCur->apPag
271f0 65 5b 30 5d 2c 0a 20 20 20 20 20 20 20 20 20 20  e[0],.          
27200 20 20 20 20 20 20 20 28 70 43 75 72 2d 3e 63 75         (pCur->cu
27210 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 57 72  rFlags & BTCF_Wr
27220 69 74 65 46 6c 61 67 29 3d 3d 30 20 3f 20 50 41  iteFlag)==0 ? PA
27230 47 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59  GER_GET_READONLY
27240 20 3a 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72   : 0);.    if( r
27250 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
27260 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61        pCur->eSta
27270 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41  te = CURSOR_INVA
27280 4c 49 44 3b 0a 20 20 20 20 20 20 72 65 74 75 72  LID;.      retur
27290 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
272a0 70 43 75 72 2d 3e 69 50 61 67 65 20 3d 20 30 3b  pCur->iPage = 0;
272b0 0a 20 20 7d 0a 20 20 70 52 6f 6f 74 20 3d 20 70  .  }.  pRoot = p
272c0 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 3b 0a  Cur->apPage[0];.
272d0 20 20 61 73 73 65 72 74 28 20 70 52 6f 6f 74 2d    assert( pRoot-
272e0 3e 70 67 6e 6f 3d 3d 70 43 75 72 2d 3e 70 67 6e  >pgno==pCur->pgn
272f0 6f 52 6f 6f 74 20 29 3b 0a 0a 20 20 2f 2a 20 49  oRoot );..  /* I
27300 66 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f  f pCur->pKeyInfo
27310 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68   is not NULL, th
27320 65 6e 20 74 68 65 20 63 61 6c 6c 65 72 20 74 68  en the caller th
27330 61 74 20 6f 70 65 6e 65 64 20 74 68 69 73 20 63  at opened this c
27340 75 72 73 6f 72 0a 20 20 2a 2a 20 65 78 70 65 63  ursor.  ** expec
27350 74 65 64 20 74 6f 20 6f 70 65 6e 20 69 74 20 6f  ted to open it o
27360 6e 20 61 6e 20 69 6e 64 65 78 20 62 2d 74 72 65  n an index b-tre
27370 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  e. Otherwise, if
27380 20 70 4b 65 79 49 6e 66 6f 20 69 73 0a 20 20 2a   pKeyInfo is.  *
27390 2a 20 4e 55 4c 4c 2c 20 74 68 65 20 63 61 6c 6c  * NULL, the call
273a0 65 72 20 65 78 70 65 63 74 73 20 61 20 74 61 62  er expects a tab
273b0 6c 65 20 62 2d 74 72 65 65 2e 20 49 66 20 74 68  le b-tree. If th
273c0 69 73 20 69 73 20 6e 6f 74 20 74 68 65 20 63 61  is is not the ca
273d0 73 65 2c 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20  se,.  ** return 
273e0 61 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  an SQLITE_CORRUP
273f0 54 20 65 72 72 6f 72 2e 20 0a 20 20 2a 2a 0a 20  T error. .  **. 
27400 20 2a 2a 20 45 61 72 6c 69 65 72 20 76 65 72 73   ** Earlier vers
27410 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 61  ions of SQLite a
27420 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 69 73  ssumed that this
27430 20 74 65 73 74 20 63 6f 75 6c 64 20 6e 6f 74 20   test could not 
27440 66 61 69 6c 0a 20 20 2a 2a 20 69 66 20 74 68 65  fail.  ** if the
27450 20 72 6f 6f 74 20 70 61 67 65 20 77 61 73 20 61   root page was a
27460 6c 72 65 61 64 79 20 6c 6f 61 64 65 64 20 77 68  lready loaded wh
27470 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
27480 20 77 61 73 20 63 61 6c 6c 65 64 20 28 69 2e 65   was called (i.e
27490 2e 0a 20 20 2a 2a 20 69 66 20 70 43 75 72 2d 3e  ..  ** if pCur->
274a0 69 50 61 67 65 3e 3d 30 29 2e 20 42 75 74 20 74  iPage>=0). But t
274b0 68 69 73 20 69 73 20 6e 6f 74 20 73 6f 20 69 66  his is not so if
274c0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
274d0 20 63 6f 72 72 75 70 74 65 64 20 0a 20 20 2a 2a   corrupted .  **
274e0 20 69 6e 20 73 75 63 68 20 61 20 77 61 79 20 74   in such a way t
274f0 68 61 74 20 70 61 67 65 20 70 52 6f 6f 74 20 69  hat page pRoot i
27500 73 20 6c 69 6e 6b 65 64 20 69 6e 74 6f 20 61 20  s linked into a 
27510 73 65 63 6f 6e 64 20 62 2d 74 72 65 65 20 74 61  second b-tree ta
27520 62 6c 65 20 0a 20 20 2a 2a 20 28 6f 72 20 74 68  ble .  ** (or th
27530 65 20 66 72 65 65 6c 69 73 74 29 2e 20 20 2a 2f  e freelist).  */
27540 0a 20 20 61 73 73 65 72 74 28 20 70 52 6f 6f 74  .  assert( pRoot
27550 2d 3e 69 6e 74 4b 65 79 3d 3d 31 20 7c 7c 20 70  ->intKey==1 || p
27560 52 6f 6f 74 2d 3e 69 6e 74 4b 65 79 3d 3d 30 20  Root->intKey==0 
27570 29 3b 0a 20 20 69 66 28 20 70 52 6f 6f 74 2d 3e  );.  if( pRoot->
27580 69 73 49 6e 69 74 3d 3d 30 20 7c 7c 20 28 70 43  isInit==0 || (pC
27590 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d 30 29  ur->pKeyInfo==0)
275a0 21 3d 70 52 6f 6f 74 2d 3e 69 6e 74 4b 65 79 20  !=pRoot->intKey 
275b0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
275c0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
275d0 54 3b 0a 20 20 7d 0a 0a 20 20 70 43 75 72 2d 3e  T;.  }..  pCur->
275e0 61 69 49 64 78 5b 30 5d 20 3d 20 30 3b 0a 20 20  aiIdx[0] = 0;.  
275f0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
27600 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75   = 0;.  pCur->cu
27610 72 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 43 46  rFlags &= ~(BTCF
27620 5f 41 74 4c 61 73 74 7c 42 54 43 46 5f 56 61 6c  _AtLast|BTCF_Val
27630 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69  idNKey|BTCF_Vali
27640 64 4f 76 66 6c 29 3b 0a 0a 20 20 69 66 28 20 70  dOvfl);..  if( p
27650 52 6f 6f 74 2d 3e 6e 43 65 6c 6c 3e 30 20 29 7b  Root->nCell>0 ){
27660 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74  .    pCur->eStat
27670 65 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49 44  e = CURSOR_VALID
27680 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21 70  ;.  }else if( !p
27690 52 6f 6f 74 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Root->leaf ){.  
276a0 20 20 50 67 6e 6f 20 73 75 62 70 61 67 65 3b 0a    Pgno subpage;.
276b0 20 20 20 20 69 66 28 20 70 52 6f 6f 74 2d 3e 70      if( pRoot->p
276c0 67 6e 6f 21 3d 31 20 29 20 72 65 74 75 72 6e 20  gno!=1 ) return 
276d0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
276e0 4b 50 54 3b 0a 20 20 20 20 73 75 62 70 61 67 65  KPT;.    subpage
276f0 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 52 6f   = get4byte(&pRo
27700 6f 74 2d 3e 61 44 61 74 61 5b 70 52 6f 6f 74 2d  ot->aData[pRoot-
27710 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a  >hdrOffset+8]);.
27720 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65      pCur->eState
27730 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b   = CURSOR_VALID;
27740 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f  .    rc = moveTo
27750 43 68 69 6c 64 28 70 43 75 72 2c 20 73 75 62 70  Child(pCur, subp
27760 61 67 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  age);.  }else{. 
27770 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20     pCur->eState 
27780 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  = CURSOR_INVALID
27790 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
277a0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65  c;.}../*.** Move
277b0 20 74 68 65 20 63 75 72 73 6f 72 20 64 6f 77 6e   the cursor down
277c0 20 74 6f 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73   to the left-mos
277d0 74 20 6c 65 61 66 20 65 6e 74 72 79 20 62 65 6e  t leaf entry ben
277e0 65 61 74 68 20 74 68 65 0a 2a 2a 20 65 6e 74 72  eath the.** entr
277f0 79 20 74 6f 20 77 68 69 63 68 20 69 74 20 69 73  y to which it is
27800 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74   currently point
27810 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c  ing..**.** The l
27820 65 66 74 2d 6d 6f 73 74 20 6c 65 61 66 20 69 73  eft-most leaf is
27830 20 74 68 65 20 6f 6e 65 20 77 69 74 68 20 74 68   the one with th
27840 65 20 73 6d 61 6c 6c 65 73 74 20 6b 65 79 20 2d  e smallest key -
27850 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 69 6e   the first.** in
27860 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72   ascending order
27870 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
27880 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 42  moveToLeftmost(B
27890 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
278a0 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 69    Pgno pgno;.  i
278b0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
278c0 4b 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  K;.  MemPage *pP
278d0 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  age;..  assert( 
278e0 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
278f0 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
27900 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
27910 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
27920 3b 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53  ;.  while( rc==S
27930 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 28 70 50  QLITE_OK && !(pP
27940 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61  age = pCur->apPa
27950 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29  ge[pCur->iPage])
27960 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 61 73  ->leaf ){.    as
27970 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64  sert( pCur->aiId
27980 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70  x[pCur->iPage]<p
27990 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  Page->nCell );. 
279a0 20 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79     pgno = get4by
279b0 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 67  te(findCell(pPag
279c0 65 2c 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70  e, pCur->aiIdx[p
279d0 43 75 72 2d 3e 69 50 61 67 65 5d 29 29 3b 0a 20  Cur->iPage]));. 
279e0 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68     rc = moveToCh
279f0 69 6c 64 28 70 43 75 72 2c 20 70 67 6e 6f 29 3b  ild(pCur, pgno);
27a00 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
27a10 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20  ;.}../*.** Move 
27a20 74 68 65 20 63 75 72 73 6f 72 20 64 6f 77 6e 20  the cursor down 
27a30 74 6f 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73  to the right-mos
27a40 74 20 6c 65 61 66 20 65 6e 74 72 79 20 62 65 6e  t leaf entry ben
27a50 65 61 74 68 20 74 68 65 0a 2a 2a 20 70 61 67 65  eath the.** page
27a60 20 74 6f 20 77 68 69 63 68 20 69 74 20 69 73 20   to which it is 
27a70 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69  currently pointi
27a80 6e 67 2e 20 20 4e 6f 74 69 63 65 20 74 68 65 20  ng.  Notice the 
27a90 64 69 66 66 65 72 65 6e 63 65 0a 2a 2a 20 62 65  difference.** be
27aa0 74 77 65 65 6e 20 6d 6f 76 65 54 6f 4c 65 66 74  tween moveToLeft
27ab0 6d 6f 73 74 28 29 20 61 6e 64 20 6d 6f 76 65 54  most() and moveT
27ac0 6f 52 69 67 68 74 6d 6f 73 74 28 29 2e 20 20 6d  oRightmost().  m
27ad0 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 29 0a  oveToLeftmost().
27ae0 2a 2a 20 66 69 6e 64 73 20 74 68 65 20 6c 65 66  ** finds the lef
27af0 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 62 65 6e  t-most entry ben
27b00 65 61 74 68 20 74 68 65 20 2a 65 6e 74 72 79 2a  eath the *entry*
27b10 20 77 68 65 72 65 61 73 20 6d 6f 76 65 54 6f 52   whereas moveToR
27b20 69 67 68 74 6d 6f 73 74 28 29 0a 2a 2a 20 66 69  ightmost().** fi
27b30 6e 64 73 20 74 68 65 20 72 69 67 68 74 2d 6d 6f  nds the right-mo
27b40 73 74 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68  st entry beneath
27b50 20 74 68 65 20 2a 70 61 67 65 2a 2e 0a 2a 2a 0a   the *page*..**.
27b60 2a 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73  ** The right-mos
27b70 74 20 65 6e 74 72 79 20 69 73 20 74 68 65 20 6f  t entry is the o
27b80 6e 65 20 77 69 74 68 20 74 68 65 20 6c 61 72 67  ne with the larg
27b90 65 73 74 20 6b 65 79 20 2d 20 74 68 65 20 6c 61  est key - the la
27ba0 73 74 0a 2a 2a 20 6b 65 79 20 69 6e 20 61 73 63  st.** key in asc
27bb0 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 0a 2a 2f  ending order..*/
27bc0 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65  .static int move
27bd0 54 6f 52 69 67 68 74 6d 6f 73 74 28 42 74 43 75  ToRightmost(BtCu
27be0 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 50  rsor *pCur){.  P
27bf0 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e 74 20  gno pgno;.  int 
27c00 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
27c10 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
27c20 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28   = 0;..  assert(
27c30 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
27c40 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  x(pCur) );.  ass
27c50 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
27c60 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
27c70 29 3b 0a 20 20 77 68 69 6c 65 28 20 21 28 70 50  );.  while( !(pP
27c80 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61  age = pCur->apPa
27c90 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29  ge[pCur->iPage])
27ca0 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 70 67  ->leaf ){.    pg
27cb0 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  no = get4byte(&p
27cc0 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67  Page->aData[pPag
27cd0 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29  e->hdrOffset+8])
27ce0 3b 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64  ;.    pCur->aiId
27cf0 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d  x[pCur->iPage] =
27d00 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20   pPage->nCell;. 
27d10 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68     rc = moveToCh
27d20 69 6c 64 28 70 43 75 72 2c 20 70 67 6e 6f 29 3b  ild(pCur, pgno);
27d30 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
27d40 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70  turn rc;.  }.  p
27d50 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
27d60 3e 69 50 61 67 65 5d 20 3d 20 70 50 61 67 65 2d  >iPage] = pPage-
27d70 3e 6e 43 65 6c 6c 2d 31 3b 0a 20 20 61 73 73 65  >nCell-1;.  asse
27d80 72 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  rt( pCur->info.n
27d90 53 69 7a 65 3d 3d 30 20 29 3b 0a 20 20 61 73 73  Size==0 );.  ass
27da0 65 72 74 28 20 28 70 43 75 72 2d 3e 63 75 72 46  ert( (pCur->curF
27db0 6c 61 67 73 20 26 20 42 54 43 46 5f 56 61 6c 69  lags & BTCF_Vali
27dc0 64 4e 4b 65 79 29 3d 3d 30 20 29 3b 0a 20 20 72  dNKey)==0 );.  r
27dd0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
27de0 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20  .}../* Move the 
27df0 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 66 69  cursor to the fi
27e00 72 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  rst entry in the
27e10 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20   table.  Return 
27e20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20  SQLITE_OK.** on 
27e30 73 75 63 63 65 73 73 2e 20 20 53 65 74 20 2a 70  success.  Set *p
27e40 52 65 73 20 74 6f 20 30 20 69 66 20 74 68 65 20  Res to 0 if the 
27e50 63 75 72 73 6f 72 20 61 63 74 75 61 6c 6c 79 20  cursor actually 
27e60 70 6f 69 6e 74 73 20 74 6f 20 73 6f 6d 65 74 68  points to someth
27e70 69 6e 67 0a 2a 2a 20 6f 72 20 73 65 74 20 2a 70  ing.** or set *p
27e80 52 65 73 20 74 6f 20 31 20 69 66 20 74 68 65 20  Res to 1 if the 
27e90 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a  table is empty..
27ea0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
27eb0 72 65 65 46 69 72 73 74 28 42 74 43 75 72 73 6f  reeFirst(BtCurso
27ec0 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52  r *pCur, int *pR
27ed0 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  es){.  int rc;..
27ee0 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
27ef0 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
27f00 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
27f10 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
27f20 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64  (pCur->pBtree->d
27f30 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72  b->mutex) );.  r
27f40 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70  c = moveToRoot(p
27f50 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  Cur);.  if( rc==
27f60 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
27f70 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74   if( pCur->eStat
27f80 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  e==CURSOR_INVALI
27f90 44 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  D ){.      asser
27fa0 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f  t( pCur->pgnoRoo
27fb0 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 61 70  t==0 || pCur->ap
27fc0 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
27fd0 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20  ]->nCell==0 );. 
27fe0 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a       *pRes = 1;.
27ff0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
28000 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61   assert( pCur->a
28010 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
28020 65 5d 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20  e]->nCell>0 );. 
28030 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a       *pRes = 0;.
28040 20 20 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54        rc = moveT
28050 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b  oLeftmost(pCur);
28060 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
28070 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f  urn rc;.}../* Mo
28080 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f  ve the cursor to
28090 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20   the last entry 
280a0 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52  in the table.  R
280b0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a  eturn SQLITE_OK.
280c0 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20  ** on success.  
280d0 53 65 74 20 2a 70 52 65 73 20 74 6f 20 30 20 69  Set *pRes to 0 i
280e0 66 20 74 68 65 20 63 75 72 73 6f 72 20 61 63 74  f the cursor act
280f0 75 61 6c 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20  ually points to 
28100 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f 72 20  something.** or 
28110 73 65 74 20 2a 70 52 65 73 20 74 6f 20 31 20 69  set *pRes to 1 i
28120 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 65  f the table is e
28130 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  mpty..*/.int sql
28140 69 74 65 33 42 74 72 65 65 4c 61 73 74 28 42 74  ite3BtreeLast(Bt
28150 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e  Cursor *pCur, in
28160 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20  t *pRes){.  int 
28170 72 63 3b 0a 20 0a 20 20 61 73 73 65 72 74 28 20  rc;. .  assert( 
28180 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
28190 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
281a0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
281b0 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74  x_held(pCur->pBt
281c0 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  ree->db->mutex) 
281d0 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
281e0 63 75 72 73 6f 72 20 61 6c 72 65 61 64 79 20 70  cursor already p
281f0 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 6c 61 73  oints to the las
28200 74 20 65 6e 74 72 79 2c 20 74 68 69 73 20 69 73  t entry, this is
28210 20 61 20 6e 6f 2d 6f 70 2e 20 2a 2f 0a 20 20 69   a no-op. */.  i
28220 66 28 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3d  f( CURSOR_VALID=
28230 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 26 26  =pCur->eState &&
28240 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73   (pCur->curFlags
28250 20 26 20 42 54 43 46 5f 41 74 4c 61 73 74 29 21   & BTCF_AtLast)!
28260 3d 30 20 29 7b 0a 23 69 66 64 65 66 20 53 51 4c  =0 ){.#ifdef SQL
28270 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 2f 2a  ITE_DEBUG.    /*
28280 20 54 68 69 73 20 62 6c 6f 63 6b 20 73 65 72 76   This block serv
28290 65 73 20 74 6f 20 61 73 73 65 72 74 28 29 20 74  es to assert() t
282a0 68 61 74 20 74 68 65 20 63 75 72 73 6f 72 20 72  hat the cursor r
282b0 65 61 6c 6c 79 20 64 6f 65 73 20 70 6f 69 6e 74  eally does point
282c0 20 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20   .    ** to the 
282d0 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68  last entry in th
282e0 65 20 62 2d 74 72 65 65 2e 20 2a 2f 0a 20 20 20  e b-tree. */.   
282f0 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 66 6f 72   int ii;.    for
28300 28 69 69 3d 30 3b 20 69 69 3c 70 43 75 72 2d 3e  (ii=0; ii<pCur->
28310 69 50 61 67 65 3b 20 69 69 2b 2b 29 7b 0a 20 20  iPage; ii++){.  
28320 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
28330 2d 3e 61 69 49 64 78 5b 69 69 5d 3d 3d 70 43 75  ->aiIdx[ii]==pCu
28340 72 2d 3e 61 70 50 61 67 65 5b 69 69 5d 2d 3e 6e  r->apPage[ii]->n
28350 43 65 6c 6c 20 29 3b 0a 20 20 20 20 7d 0a 20 20  Cell );.    }.  
28360 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
28370 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
28380 65 5d 3d 3d 70 43 75 72 2d 3e 61 70 50 61 67 65  e]==pCur->apPage
28390 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e  [pCur->iPage]->n
283a0 43 65 6c 6c 2d 31 20 29 3b 0a 20 20 20 20 61 73  Cell-1 );.    as
283b0 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61  sert( pCur->apPa
283c0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
283d0 3e 6c 65 61 66 20 29 3b 0a 23 65 6e 64 69 66 0a  >leaf );.#endif.
283e0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
283f0 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 72 63 20  E_OK;.  }..  rc 
28400 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75  = moveToRoot(pCu
28410 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  r);.  if( rc==SQ
28420 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
28430 66 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  f( CURSOR_INVALI
28440 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20  D==pCur->eState 
28450 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
28460 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d   pCur->pgnoRoot=
28470 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61  =0 || pCur->apPa
28480 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
28490 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  >nCell==0 );.   
284a0 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20     *pRes = 1;.  
284b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
284c0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
284d0 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
284e0 44 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73  D );.      *pRes
284f0 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d   = 0;.      rc =
28500 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74   moveToRightmost
28510 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20 69 66  (pCur);.      if
28520 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
28530 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d  ){.        pCur-
28540 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20 42 54 43  >curFlags |= BTC
28550 46 5f 41 74 4c 61 73 74 3b 0a 20 20 20 20 20 20  F_AtLast;.      
28560 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
28570 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d  Cur->curFlags &=
28580 20 7e 42 54 43 46 5f 41 74 4c 61 73 74 3b 0a 20   ~BTCF_AtLast;. 
28590 20 20 20 20 20 7d 0a 20 20 20 0a 20 20 20 20 7d       }.   .    }
285a0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
285b0 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65  ;.}../* Move the
285c0 20 63 75 72 73 6f 72 20 73 6f 20 74 68 61 74 20   cursor so that 
285d0 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20  it points to an 
285e0 65 6e 74 72 79 20 6e 65 61 72 20 74 68 65 20 6b  entry near the k
285f0 65 79 20 0a 2a 2a 20 73 70 65 63 69 66 69 65 64  ey .** specified
28600 20 62 79 20 70 49 64 78 4b 65 79 20 6f 72 20 69   by pIdxKey or i
28610 6e 74 4b 65 79 2e 20 20 20 52 65 74 75 72 6e 20  ntKey.   Return 
28620 61 20 73 75 63 63 65 73 73 20 63 6f 64 65 2e 0a  a success code..
28630 2a 2a 0a 2a 2a 20 46 6f 72 20 49 4e 54 4b 45 59  **.** For INTKEY
28640 20 74 61 62 6c 65 73 2c 20 74 68 65 20 69 6e 74   tables, the int
28650 4b 65 79 20 70 61 72 61 6d 65 74 65 72 20 69 73  Key parameter is
28660 20 75 73 65 64 2e 20 20 70 49 64 78 4b 65 79 20   used.  pIdxKey 
28670 0a 2a 2a 20 6d 75 73 74 20 62 65 20 4e 55 4c 4c  .** must be NULL
28680 2e 20 20 46 6f 72 20 69 6e 64 65 78 20 74 61 62  .  For index tab
28690 6c 65 73 2c 20 70 49 64 78 4b 65 79 20 69 73 20  les, pIdxKey is 
286a0 75 73 65 64 20 61 6e 64 20 69 6e 74 4b 65 79 0a  used and intKey.
286b0 2a 2a 20 69 73 20 69 67 6e 6f 72 65 64 2e 0a 2a  ** is ignored..*
286c0 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 78 61 63 74  *.** If an exact
286d0 20 6d 61 74 63 68 20 69 73 20 6e 6f 74 20 66 6f   match is not fo
286e0 75 6e 64 2c 20 74 68 65 6e 20 74 68 65 20 63 75  und, then the cu
286f0 72 73 6f 72 20 69 73 20 61 6c 77 61 79 73 0a 2a  rsor is always.*
28700 2a 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20  * left pointing 
28710 61 74 20 61 20 6c 65 61 66 20 70 61 67 65 20 77  at a leaf page w
28720 68 69 63 68 20 77 6f 75 6c 64 20 68 6f 6c 64 20  hich would hold 
28730 74 68 65 20 65 6e 74 72 79 20 69 66 20 69 74 0a  the entry if it.
28740 2a 2a 20 77 65 72 65 20 70 72 65 73 65 6e 74 2e  ** were present.
28750 20 20 54 68 65 20 63 75 72 73 6f 72 20 6d 69 67    The cursor mig
28760 68 74 20 70 6f 69 6e 74 20 74 6f 20 61 6e 20 65  ht point to an e
28770 6e 74 72 79 20 74 68 61 74 20 63 6f 6d 65 73 0a  ntry that comes.
28780 2a 2a 20 62 65 66 6f 72 65 20 6f 72 20 61 66 74  ** before or aft
28790 65 72 20 74 68 65 20 6b 65 79 2e 0a 2a 2a 0a 2a  er the key..**.*
287a0 2a 20 41 6e 20 69 6e 74 65 67 65 72 20 69 73 20  * An integer is 
287b0 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 2a 70 52  written into *pR
287c0 65 73 20 77 68 69 63 68 20 69 73 20 74 68 65 20  es which is the 
287d0 72 65 73 75 6c 74 20 6f 66 0a 2a 2a 20 63 6f 6d  result of.** com
287e0 70 61 72 69 6e 67 20 74 68 65 20 6b 65 79 20 77  paring the key w
287f0 69 74 68 20 74 68 65 20 65 6e 74 72 79 20 74 6f  ith the entry to
28800 20 77 68 69 63 68 20 74 68 65 20 63 75 72 73 6f   which the curso
28810 72 20 69 73 20 0a 2a 2a 20 70 6f 69 6e 74 69 6e  r is .** pointin
28820 67 2e 20 20 54 68 65 20 6d 65 61 6e 69 6e 67 20  g.  The meaning 
28830 6f 66 20 74 68 65 20 69 6e 74 65 67 65 72 20 77  of the integer w
28840 72 69 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20 2a  ritten into.** *
28850 70 52 65 73 20 69 73 20 61 73 20 66 6f 6c 6c 6f  pRes is as follo
28860 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70  ws:.**.**     *p
28870 52 65 73 3c 30 20 20 20 20 20 20 54 68 65 20 63  Res<0      The c
28880 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20 70 6f  ursor is left po
28890 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74  inting at an ent
288a0 72 79 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20  ry that.**      
288b0 20 20 20 20 20 20 20 20 20 20 20 20 69 73 20 73              is s
288c0 6d 61 6c 6c 65 72 20 74 68 61 6e 20 69 6e 74 4b  maller than intK
288d0 65 79 2f 70 49 64 78 4b 65 79 20 6f 72 20 69 66  ey/pIdxKey or if
288e0 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d   the table is em
288f0 70 74 79 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  pty.**          
28900 20 20 20 20 20 20 20 20 61 6e 64 20 74 68 65 20          and the 
28910 63 75 72 73 6f 72 20 69 73 20 74 68 65 72 65 66  cursor is theref
28920 6f 72 65 20 6c 65 66 74 20 70 6f 69 6e 74 20 74  ore left point t
28930 6f 20 6e 6f 74 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a  o nothing..**.**
28940 20 20 20 20 20 2a 70 52 65 73 3d 3d 30 20 20 20       *pRes==0   
28950 20 20 54 68 65 20 63 75 72 73 6f 72 20 69 73 20    The cursor is 
28960 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74  left pointing at
28970 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74 0a 2a   an entry that.*
28980 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
28990 20 20 20 65 78 61 63 74 6c 79 20 6d 61 74 63 68     exactly match
289a0 65 73 20 69 6e 74 4b 65 79 2f 70 49 64 78 4b 65  es intKey/pIdxKe
289b0 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52  y..**.**     *pR
289c0 65 73 3e 30 20 20 20 20 20 20 54 68 65 20 63 75  es>0      The cu
289d0 72 73 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69  rsor is left poi
289e0 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72  nting at an entr
289f0 79 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20  y that.**       
28a00 20 20 20 20 20 20 20 20 20 20 20 69 73 20 6c 61             is la
28a10 72 67 65 72 20 74 68 61 6e 20 69 6e 74 4b 65 79  rger than intKey
28a20 2f 70 49 64 78 4b 65 79 2e 0a 2a 2a 0a 2a 2f 0a  /pIdxKey..**.*/.
28a30 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
28a40 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 0a  MovetoUnpacked(.
28a50 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72    BtCursor *pCur
28a60 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ,          /* Th
28a70 65 20 63 75 72 73 6f 72 20 74 6f 20 62 65 20 6d  e cursor to be m
28a80 6f 76 65 64 20 2a 2f 0a 20 20 55 6e 70 61 63 6b  oved */.  Unpack
28a90 65 64 52 65 63 6f 72 64 20 2a 70 49 64 78 4b 65  edRecord *pIdxKe
28aa0 79 2c 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20 69  y, /* Unpacked i
28ab0 6e 64 65 78 20 6b 65 79 20 2a 2f 0a 20 20 69 36  ndex key */.  i6
28ac0 34 20 69 6e 74 4b 65 79 2c 20 20 20 20 20 20 20  4 intKey,       
28ad0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 61         /* The ta
28ae0 62 6c 65 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74  ble key */.  int
28af0 20 62 69 61 73 52 69 67 68 74 2c 20 20 20 20 20   biasRight,     
28b00 20 20 20 20 20 20 2f 2a 20 49 66 20 74 72 75 65        /* If true
28b10 2c 20 62 69 61 73 20 74 68 65 20 73 65 61 72 63  , bias the searc
28b20 68 20 74 6f 20 74 68 65 20 68 69 67 68 20 65 6e  h to the high en
28b30 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73  d */.  int *pRes
28b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28b50 2f 2a 20 57 72 69 74 65 20 73 65 61 72 63 68 20  /* Write search 
28b60 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a  results here */.
28b70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 52  ){.  int rc;.  R
28b80 65 63 6f 72 64 43 6f 6d 70 61 72 65 20 78 52 65  ecordCompare xRe
28b90 63 6f 72 64 43 6f 6d 70 61 72 65 3b 0a 0a 20 20  cordCompare;..  
28ba0 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
28bb0 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
28bc0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
28bd0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
28be0 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d  Cur->pBtree->db-
28bf0 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
28c00 65 72 74 28 20 70 52 65 73 20 29 3b 0a 20 20 61  ert( pRes );.  a
28c10 73 73 65 72 74 28 20 28 70 49 64 78 4b 65 79 3d  ssert( (pIdxKey=
28c20 3d 30 29 3d 3d 28 70 43 75 72 2d 3e 70 4b 65 79  =0)==(pCur->pKey
28c30 49 6e 66 6f 3d 3d 30 29 20 29 3b 0a 0a 20 20 2f  Info==0) );..  /
28c40 2a 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20  * If the cursor 
28c50 69 73 20 61 6c 72 65 61 64 79 20 70 6f 73 69 74  is already posit
28c60 69 6f 6e 65 64 20 61 74 20 74 68 65 20 70 6f 69  ioned at the poi
28c70 6e 74 20 77 65 20 61 72 65 20 74 72 79 69 6e 67  nt we are trying
28c80 0a 20 20 2a 2a 20 74 6f 20 6d 6f 76 65 20 74 6f  .  ** to move to
28c90 2c 20 74 68 65 6e 20 6a 75 73 74 20 72 65 74 75  , then just retu
28ca0 72 6e 20 77 69 74 68 6f 75 74 20 64 6f 69 6e 67  rn without doing
28cb0 20 61 6e 79 20 77 6f 72 6b 20 2a 2f 0a 20 20 69   any work */.  i
28cc0 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  f( pCur->eState=
28cd0 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 26 26  =CURSOR_VALID &&
28ce0 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73   (pCur->curFlags
28cf0 20 26 20 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65   & BTCF_ValidNKe
28d00 79 29 21 3d 30 0a 20 20 20 26 26 20 70 43 75 72  y)!=0.   && pCur
28d10 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74  ->apPage[0]->int
28d20 4b 65 79 20 0a 20 20 29 7b 0a 20 20 20 20 69 66  Key .  ){.    if
28d30 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65  ( pCur->info.nKe
28d40 79 3d 3d 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20  y==intKey ){.   
28d50 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20     *pRes = 0;.  
28d60 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
28d70 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  E_OK;.    }.    
28d80 69 66 28 20 28 70 43 75 72 2d 3e 63 75 72 46 6c  if( (pCur->curFl
28d90 61 67 73 20 26 20 42 54 43 46 5f 41 74 4c 61 73  ags & BTCF_AtLas
28da0 74 29 21 3d 30 20 26 26 20 70 43 75 72 2d 3e 69  t)!=0 && pCur->i
28db0 6e 66 6f 2e 6e 4b 65 79 3c 69 6e 74 4b 65 79 20  nfo.nKey<intKey 
28dc0 29 7b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d  ){.      *pRes =
28dd0 20 2d 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72   -1;.      retur
28de0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
28df0 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 49   }.  }..  if( pI
28e00 64 78 4b 65 79 20 29 7b 0a 20 20 20 20 78 52 65  dxKey ){.    xRe
28e10 63 6f 72 64 43 6f 6d 70 61 72 65 20 3d 20 73 71  cordCompare = sq
28e20 6c 69 74 65 33 56 64 62 65 46 69 6e 64 43 6f 6d  lite3VdbeFindCom
28e30 70 61 72 65 28 70 49 64 78 4b 65 79 29 3b 0a 20  pare(pIdxKey);. 
28e40 20 20 20 70 49 64 78 4b 65 79 2d 3e 65 72 72 43     pIdxKey->errC
28e50 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 61 73 73  ode = 0;.    ass
28e60 65 72 74 28 20 70 49 64 78 4b 65 79 2d 3e 64 65  ert( pIdxKey->de
28e70 66 61 75 6c 74 5f 72 63 3d 3d 31 20 0a 20 20 20  fault_rc==1 .   
28e80 20 20 20 20 20 20 7c 7c 20 70 49 64 78 4b 65 79        || pIdxKey
28e90 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3d 3d 30 20  ->default_rc==0 
28ea0 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 49 64  .         || pId
28eb0 78 4b 65 79 2d 3e 64 65 66 61 75 6c 74 5f 72 63  xKey->default_rc
28ec0 3d 3d 2d 31 0a 20 20 20 20 29 3b 0a 20 20 7d 65  ==-1.    );.  }e
28ed0 6c 73 65 7b 0a 20 20 20 20 78 52 65 63 6f 72 64  lse{.    xRecord
28ee0 43 6f 6d 70 61 72 65 20 3d 20 30 3b 20 2f 2a 20  Compare = 0; /* 
28ef0 41 6c 6c 20 6b 65 79 73 20 61 72 65 20 69 6e 74  All keys are int
28f00 65 67 65 72 73 20 2a 2f 0a 20 20 7d 0a 0a 20 20  egers */.  }..  
28f10 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28  rc = moveToRoot(
28f20 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 20  pCur);.  if( rc 
28f30 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
28f40 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
28f50 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d  pCur->pgnoRoot==
28f60 30 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61 67  0 || pCur->apPag
28f70 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 29  e[pCur->iPage] )
28f80 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
28f90 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c  ->pgnoRoot==0 ||
28fa0 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
28fb0 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 69 73 49 6e  ur->iPage]->isIn
28fc0 69 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  it );.  assert( 
28fd0 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
28fe0 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 7c 7c 20  RSOR_INVALID || 
28ff0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
29000 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c  r->iPage]->nCell
29010 3e 30 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72  >0 );.  if( pCur
29020 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
29030 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20 20  _INVALID ){.    
29040 2a 70 52 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20  *pRes = -1;.    
29050 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 67  assert( pCur->pg
29060 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75  noRoot==0 || pCu
29070 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
29080 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30  iPage]->nCell==0
29090 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   );.    return S
290a0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
290b0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70  assert( pCur->ap
290c0 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20  Page[0]->intKey 
290d0 7c 7c 20 70 49 64 78 4b 65 79 20 29 3b 0a 20 20  || pIdxKey );.  
290e0 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 69 6e 74  for(;;){.    int
290f0 20 6c 77 72 2c 20 75 70 72 2c 20 69 64 78 2c 20   lwr, upr, idx, 
29100 63 3b 0a 20 20 20 20 50 67 6e 6f 20 63 68 6c 64  c;.    Pgno chld
29110 50 67 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20  Pg;.    MemPage 
29120 2a 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61  *pPage = pCur->a
29130 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
29140 65 5d 3b 0a 20 20 20 20 75 38 20 2a 70 43 65 6c  e];.    u8 *pCel
29150 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
29160 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
29170 6f 69 6e 74 65 72 20 74 6f 20 63 75 72 72 65 6e  ointer to curren
29180 74 20 63 65 6c 6c 20 69 6e 20 70 50 61 67 65 20  t cell in pPage 
29190 2a 2f 0a 0a 20 20 20 20 2f 2a 20 70 50 61 67 65  */..    /* pPage
291a0 2d 3e 6e 43 65 6c 6c 20 6d 75 73 74 20 62 65 20  ->nCell must be 
291b0 67 72 65 61 74 65 72 20 74 68 61 6e 20 7a 65 72  greater than zer
291c0 6f 2e 20 49 66 20 74 68 69 73 20 69 73 20 74 68  o. If this is th
291d0 65 20 72 6f 6f 74 2d 70 61 67 65 0a 20 20 20 20  e root-page.    
291e0 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 20 77 6f  ** the cursor wo
291f0 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20 49 4e  uld have been IN
29200 56 41 4c 49 44 20 61 62 6f 76 65 20 61 6e 64 20  VALID above and 
29210 74 68 69 73 20 66 6f 72 28 3b 3b 29 20 6c 6f 6f  this for(;;) loo
29220 70 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 72 75 6e  p.    ** not run
29230 2e 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f 74  . If this is not
29240 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 2c 20   the root-page, 
29250 74 68 65 6e 20 74 68 65 20 6d 6f 76 65 54 6f 43  then the moveToC
29260 68 69 6c 64 28 29 20 72 6f 75 74 69 6e 65 0a 20  hild() routine. 
29270 20 20 20 2a 2a 20 77 6f 75 6c 64 20 68 61 76 65     ** would have
29280 20 61 6c 72 65 61 64 79 20 64 65 74 65 63 74 65   already detecte
29290 64 20 64 62 20 63 6f 72 72 75 70 74 69 6f 6e 2e  d db corruption.
292a0 20 53 69 6d 69 6c 61 72 6c 79 2c 20 70 50 61 67   Similarly, pPag
292b0 65 20 6d 75 73 74 0a 20 20 20 20 2a 2a 20 62 65  e must.    ** be
292c0 20 74 68 65 20 72 69 67 68 74 20 6b 69 6e 64 20   the right kind 
292d0 28 69 6e 64 65 78 20 6f 72 20 74 61 62 6c 65 29  (index or table)
292e0 20 6f 66 20 62 2d 74 72 65 65 20 70 61 67 65 2e   of b-tree page.
292f0 20 4f 74 68 65 72 77 69 73 65 0a 20 20 20 20 2a   Otherwise.    *
29300 2a 20 61 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28  * a moveToChild(
29310 29 20 6f 72 20 6d 6f 76 65 54 6f 52 6f 6f 74 28  ) or moveToRoot(
29320 29 20 63 61 6c 6c 20 77 6f 75 6c 64 20 68 61 76  ) call would hav
29330 65 20 64 65 74 65 63 74 65 64 20 63 6f 72 72 75  e detected corru
29340 70 74 69 6f 6e 2e 20 20 2a 2f 0a 20 20 20 20 61  ption.  */.    a
29350 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43  ssert( pPage->nC
29360 65 6c 6c 3e 30 20 29 3b 0a 20 20 20 20 61 73 73  ell>0 );.    ass
29370 65 72 74 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b  ert( pPage->intK
29380 65 79 3d 3d 28 70 49 64 78 4b 65 79 3d 3d 30 29  ey==(pIdxKey==0)
29390 20 29 3b 0a 20 20 20 20 6c 77 72 20 3d 20 30 3b   );.    lwr = 0;
293a0 0a 20 20 20 20 75 70 72 20 3d 20 70 50 61 67 65  .    upr = pPage
293b0 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a 20 20 20 20 61  ->nCell-1;.    a
293c0 73 73 65 72 74 28 20 62 69 61 73 52 69 67 68 74  ssert( biasRight
293d0 3d 3d 30 20 7c 7c 20 62 69 61 73 52 69 67 68 74  ==0 || biasRight
293e0 3d 3d 31 20 29 3b 0a 20 20 20 20 69 64 78 20 3d  ==1 );.    idx =
293f0 20 75 70 72 3e 3e 28 31 2d 62 69 61 73 52 69 67   upr>>(1-biasRig
29400 68 74 29 3b 20 2f 2a 20 69 64 78 20 3d 20 62 69  ht); /* idx = bi
29410 61 73 52 69 67 68 74 20 3f 20 75 70 72 20 3a 20  asRight ? upr : 
29420 28 6c 77 72 2b 75 70 72 29 2f 32 3b 20 2a 2f 0a  (lwr+upr)/2; */.
29430 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b      pCur->aiIdx[
29440 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28  pCur->iPage] = (
29450 75 31 36 29 69 64 78 3b 0a 20 20 20 20 69 66 28  u16)idx;.    if(
29460 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 3d   xRecordCompare=
29470 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28  =0 ){.      for(
29480 3b 3b 29 7b 0a 20 20 20 20 20 20 20 20 69 36 34  ;;){.        i64
29490 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20   nCellKey;.     
294a0 20 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43     pCell = findC
294b0 65 6c 6c 28 70 50 61 67 65 2c 20 69 64 78 29 20  ell(pPage, idx) 
294c0 2b 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74  + pPage->childPt
294d0 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 69  rSize;.        i
294e0 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  f( pPage->intKey
294f0 4c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20  Leaf ){.        
29500 20 20 77 68 69 6c 65 28 20 30 78 38 30 20 3c 3d    while( 0x80 <=
29510 20 2a 28 70 43 65 6c 6c 2b 2b 29 20 29 7b 0a 20   *(pCell++) ){. 
29520 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
29530 43 65 6c 6c 3e 3d 70 50 61 67 65 2d 3e 61 44 61  Cell>=pPage->aDa
29540 74 61 45 6e 64 20 29 20 72 65 74 75 72 6e 20 53  taEnd ) return S
29550 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
29560 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  PT;.          }.
29570 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
29580 20 20 67 65 74 56 61 72 69 6e 74 28 70 43 65 6c    getVarint(pCel
29590 6c 2c 20 28 75 36 34 2a 29 26 6e 43 65 6c 6c 4b  l, (u64*)&nCellK
295a0 65 79 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ey);.        if(
295b0 20 6e 43 65 6c 6c 4b 65 79 3c 69 6e 74 4b 65 79   nCellKey<intKey
295c0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6c 77   ){.          lw
295d0 72 20 3d 20 69 64 78 2b 31 3b 0a 20 20 20 20 20  r = idx+1;.     
295e0 20 20 20 20 20 69 66 28 20 6c 77 72 3e 75 70 72       if( lwr>upr
295f0 20 29 7b 20 63 20 3d 20 2d 31 3b 20 62 72 65 61   ){ c = -1; brea
29600 6b 3b 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c  k; }.        }el
29610 73 65 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3e  se if( nCellKey>
29620 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20  intKey ){.      
29630 20 20 20 20 75 70 72 20 3d 20 69 64 78 2d 31 3b      upr = idx-1;
29640 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6c  .          if( l
29650 77 72 3e 75 70 72 20 29 7b 20 63 20 3d 20 2b 31  wr>upr ){ c = +1
29660 3b 20 62 72 65 61 6b 3b 20 7d 0a 20 20 20 20 20  ; break; }.     
29670 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
29680 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c      assert( nCel
29690 6c 4b 65 79 3d 3d 69 6e 74 4b 65 79 20 29 3b 0a  lKey==intKey );.
296a0 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e            pCur->
296b0 63 75 72 46 6c 61 67 73 20 7c 3d 20 42 54 43 46  curFlags |= BTCF
296c0 5f 56 61 6c 69 64 4e 4b 65 79 3b 0a 20 20 20 20  _ValidNKey;.    
296d0 20 20 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f        pCur->info
296e0 2e 6e 4b 65 79 20 3d 20 6e 43 65 6c 6c 4b 65 79  .nKey = nCellKey
296f0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 43 75 72  ;.          pCur
29700 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
29710 61 67 65 5d 20 3d 20 28 75 31 36 29 69 64 78 3b  age] = (u16)idx;
29720 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21  .          if( !
29730 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
29740 20 20 20 20 20 20 20 20 20 20 20 6c 77 72 20 3d             lwr =
29750 20 69 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20   idx;.          
29760 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 6e 65    goto moveto_ne
29770 78 74 5f 6c 61 79 65 72 3b 0a 20 20 20 20 20 20  xt_layer;.      
29780 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
29790 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30         *pRes = 0
297a0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  ;.            rc
297b0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
297c0 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d            goto m
297d0 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20  oveto_finish;.  
297e0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
297f0 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65    }.        asse
29800 72 74 28 20 6c 77 72 2b 75 70 72 3e 3d 30 20 29  rt( lwr+upr>=0 )
29810 3b 0a 20 20 20 20 20 20 20 20 69 64 78 20 3d 20  ;.        idx = 
29820 28 6c 77 72 2b 75 70 72 29 3e 3e 31 3b 20 20 2f  (lwr+upr)>>1;  /
29830 2a 20 69 64 78 20 3d 20 28 6c 77 72 2b 75 70 72  * idx = (lwr+upr
29840 29 2f 32 3b 20 2a 2f 0a 20 20 20 20 20 20 7d 0a  )/2; */.      }.
29850 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
29860 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 20 20   for(;;){.      
29870 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 2f 2a    int nCell;  /*
29880 20 53 69 7a 65 20 6f 66 20 74 68 65 20 70 43 65   Size of the pCe
29890 6c 6c 20 63 65 6c 6c 20 69 6e 20 62 79 74 65 73  ll cell in bytes
298a0 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 43 65 6c   */.        pCel
298b0 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61  l = findCell(pPa
298c0 67 65 2c 20 69 64 78 29 20 2b 20 70 50 61 67 65  ge, idx) + pPage
298d0 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a  ->childPtrSize;.
298e0 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
298f0 6d 61 78 69 6d 75 6d 20 73 75 70 70 6f 72 74 65  maximum supporte
29900 64 20 70 61 67 65 2d 73 69 7a 65 20 69 73 20 36  d page-size is 6
29910 35 35 33 36 20 62 79 74 65 73 2e 20 54 68 69 73  5536 bytes. This
29920 20 6d 65 61 6e 73 20 74 68 61 74 0a 20 20 20 20   means that.    
29930 20 20 20 20 2a 2a 20 74 68 65 20 6d 61 78 69 6d      ** the maxim
29940 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 63  um number of rec
29950 6f 72 64 20 62 79 74 65 73 20 73 74 6f 72 65 64  ord bytes stored
29960 20 6f 6e 20 61 6e 20 69 6e 64 65 78 20 42 2d 54   on an index B-T
29970 72 65 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70  ree.        ** p
29980 61 67 65 20 69 73 20 6c 65 73 73 20 74 68 61 6e  age is less than
29990 20 31 36 33 38 34 20 62 79 74 65 73 20 61 6e 64   16384 bytes and
299a0 20 6d 61 79 20 62 65 20 73 74 6f 72 65 64 20 61   may be stored a
299b0 73 20 61 20 32 2d 62 79 74 65 0a 20 20 20 20 20  s a 2-byte.     
299c0 20 20 20 2a 2a 20 76 61 72 69 6e 74 2e 20 54 68     ** varint. Th
299d0 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  is information i
299e0 73 20 75 73 65 64 20 74 6f 20 61 74 74 65 6d 70  s used to attemp
299f0 74 20 74 6f 20 61 76 6f 69 64 20 70 61 72 73 69  t to avoid parsi
29a00 6e 67 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ng .        ** t
29a10 68 65 20 65 6e 74 69 72 65 20 63 65 6c 6c 20 62  he entire cell b
29a20 79 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 74  y checking for t
29a30 68 65 20 63 61 73 65 73 20 77 68 65 72 65 20 74  he cases where t
29a40 68 65 20 72 65 63 6f 72 64 20 69 73 20 0a 20 20  he record is .  
29a50 20 20 20 20 20 20 2a 2a 20 73 74 6f 72 65 64 20        ** stored 
29a60 65 6e 74 69 72 65 6c 79 20 77 69 74 68 69 6e 20  entirely within 
29a70 74 68 65 20 62 2d 74 72 65 65 20 70 61 67 65 20  the b-tree page 
29a80 62 79 20 69 6e 73 70 65 63 74 69 6e 67 20 74 68  by inspecting th
29a90 65 20 66 69 72 73 74 20 0a 20 20 20 20 20 20 20  e first .       
29aa0 20 2a 2a 20 32 20 62 79 74 65 73 20 6f 66 20 74   ** 2 bytes of t
29ab0 68 65 20 63 65 6c 6c 2e 0a 20 20 20 20 20 20 20  he cell..       
29ac0 20 2a 2f 0a 20 20 20 20 20 20 20 20 6e 43 65 6c   */.        nCel
29ad0 6c 20 3d 20 70 43 65 6c 6c 5b 30 5d 3b 0a 20 20  l = pCell[0];.  
29ae0 20 20 20 20 20 20 69 66 28 20 6e 43 65 6c 6c 3c        if( nCell<
29af0 3d 70 50 61 67 65 2d 3e 6d 61 78 31 62 79 74 65  =pPage->max1byte
29b00 50 61 79 6c 6f 61 64 20 29 7b 0a 20 20 20 20 20  Payload ){.     
29b10 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61       /* This bra
29b20 6e 63 68 20 72 75 6e 73 20 69 66 20 74 68 65 20  nch runs if the 
29b30 72 65 63 6f 72 64 2d 73 69 7a 65 20 66 69 65 6c  record-size fiel
29b40 64 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 69 73  d of the cell is
29b50 20 61 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20   a.          ** 
29b60 73 69 6e 67 6c 65 20 62 79 74 65 20 76 61 72 69  single byte vari
29b70 6e 74 20 61 6e 64 20 74 68 65 20 72 65 63 6f 72  nt and the recor
29b80 64 20 66 69 74 73 20 65 6e 74 69 72 65 6c 79 20  d fits entirely 
29b90 6f 6e 20 74 68 65 20 6d 61 69 6e 0a 20 20 20 20  on the main.    
29ba0 20 20 20 20 20 20 2a 2a 20 62 2d 74 72 65 65 20        ** b-tree 
29bb0 70 61 67 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20  page.  */.      
29bc0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 43      testcase( pC
29bd0 65 6c 6c 2b 6e 43 65 6c 6c 2b 31 3d 3d 70 50 61  ell+nCell+1==pPa
29be0 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 29 3b 0a  ge->aDataEnd );.
29bf0 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 78 52            c = xR
29c00 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43 65  ecordCompare(nCe
29c10 6c 6c 2c 20 28 76 6f 69 64 2a 29 26 70 43 65 6c  ll, (void*)&pCel
29c20 6c 5b 31 5d 2c 20 70 49 64 78 4b 65 79 29 3b 0a  l[1], pIdxKey);.
29c30 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
29c40 28 20 21 28 70 43 65 6c 6c 5b 31 5d 20 26 20 30  ( !(pCell[1] & 0
29c50 78 38 30 29 20 0a 20 20 20 20 20 20 20 20 20 20  x80) .          
29c60 26 26 20 28 6e 43 65 6c 6c 20 3d 20 28 28 6e 43  && (nCell = ((nC
29c70 65 6c 6c 26 30 78 37 66 29 3c 3c 37 29 20 2b 20  ell&0x7f)<<7) + 
29c80 70 43 65 6c 6c 5b 31 5d 29 3c 3d 70 50 61 67 65  pCell[1])<=pPage
29c90 2d 3e 6d 61 78 4c 6f 63 61 6c 0a 20 20 20 20 20  ->maxLocal.     
29ca0 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
29cb0 2f 2a 20 54 68 65 20 72 65 63 6f 72 64 2d 73 69  /* The record-si
29cc0 7a 65 20 66 69 65 6c 64 20 69 73 20 61 20 32 20  ze field is a 2 
29cd0 62 79 74 65 20 76 61 72 69 6e 74 20 61 6e 64 20  byte varint and 
29ce0 74 68 65 20 72 65 63 6f 72 64 20 0a 20 20 20 20  the record .    
29cf0 20 20 20 20 20 20 2a 2a 20 66 69 74 73 20 65 6e        ** fits en
29d00 74 69 72 65 6c 79 20 6f 6e 20 74 68 65 20 6d 61  tirely on the ma
29d10 69 6e 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20  in b-tree page. 
29d20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 74 65   */.          te
29d30 73 74 63 61 73 65 28 20 70 43 65 6c 6c 2b 6e 43  stcase( pCell+nC
29d40 65 6c 6c 2b 32 3d 3d 70 50 61 67 65 2d 3e 61 44  ell+2==pPage->aD
29d50 61 74 61 45 6e 64 20 29 3b 0a 20 20 20 20 20 20  ataEnd );.      
29d60 20 20 20 20 63 20 3d 20 78 52 65 63 6f 72 64 43      c = xRecordC
29d70 6f 6d 70 61 72 65 28 6e 43 65 6c 6c 2c 20 28 76  ompare(nCell, (v
29d80 6f 69 64 2a 29 26 70 43 65 6c 6c 5b 32 5d 2c 20  oid*)&pCell[2], 
29d90 70 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 20 20  pIdxKey);.      
29da0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
29db0 20 20 20 2f 2a 20 54 68 65 20 72 65 63 6f 72 64     /* The record
29dc0 20 66 6c 6f 77 73 20 6f 76 65 72 20 6f 6e 74 6f   flows over onto
29dd0 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 76 65   one or more ove
29de0 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 49 6e 0a  rflow pages. In.
29df0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 69            ** thi
29e00 73 20 63 61 73 65 20 74 68 65 20 77 68 6f 6c 65  s case the whole
29e10 20 63 65 6c 6c 20 6e 65 65 64 73 20 74 6f 20 62   cell needs to b
29e20 65 20 70 61 72 73 65 64 2c 20 61 20 62 75 66 66  e parsed, a buff
29e30 65 72 20 61 6c 6c 6f 63 61 74 65 64 0a 20 20 20  er allocated.   
29e40 20 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 61 63         ** and ac
29e50 63 65 73 73 50 61 79 6c 6f 61 64 28 29 20 75 73  cessPayload() us
29e60 65 64 20 74 6f 20 72 65 74 72 69 65 76 65 20 74  ed to retrieve t
29e70 68 65 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 74  he record into t
29e80 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  he.          ** 
29e90 62 75 66 66 65 72 20 62 65 66 6f 72 65 20 56 64  buffer before Vd
29ea0 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28  beRecordCompare(
29eb0 29 20 63 61 6e 20 62 65 20 63 61 6c 6c 65 64 2e  ) can be called.
29ec0 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 0a 20   .          **. 
29ed0 20 20 20 20 20 20 20 20 20 2a 2a 20 49 66 20 74           ** If t
29ee0 68 65 20 72 65 63 6f 72 64 20 69 73 20 63 6f 72  he record is cor
29ef0 72 75 70 74 2c 20 74 68 65 20 78 52 65 63 6f 72  rupt, the xRecor
29f00 64 43 6f 6d 70 61 72 65 20 72 6f 75 74 69 6e 65  dCompare routine
29f10 20 6d 61 79 20 72 65 61 64 0a 20 20 20 20 20 20   may read.      
29f20 20 20 20 20 2a 2a 20 75 70 20 74 6f 20 74 77 6f      ** up to two
29f30 20 76 61 72 69 6e 74 73 20 70 61 73 74 20 74 68   varints past th
29f40 65 20 65 6e 64 20 6f 66 20 74 68 65 20 62 75 66  e end of the buf
29f50 66 65 72 2e 20 41 6e 20 65 78 74 72 61 20 31 38  fer. An extra 18
29f60 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62   .          ** b
29f70 79 74 65 73 20 6f 66 20 70 61 64 64 69 6e 67 20  ytes of padding 
29f80 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 74 20  is allocated at 
29f90 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 62  the end of the b
29fa0 75 66 66 65 72 20 69 6e 0a 20 20 20 20 20 20 20  uffer in.       
29fb0 20 20 20 2a 2a 20 63 61 73 65 20 74 68 69 73 20     ** case this 
29fc0 68 61 70 70 65 6e 73 2e 20 20 2a 2f 0a 20 20 20  happens.  */.   
29fd0 20 20 20 20 20 20 20 76 6f 69 64 20 2a 70 43 65         void *pCe
29fe0 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 20  llKey;.         
29ff0 20 75 38 20 2a 20 63 6f 6e 73 74 20 70 43 65 6c   u8 * const pCel
2a000 6c 42 6f 64 79 20 3d 20 70 43 65 6c 6c 20 2d 20  lBody = pCell - 
2a010 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53  pPage->childPtrS
2a020 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 20 20 62  ize;.          b
2a030 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
2a040 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 42 6f 64  (pPage, pCellBod
2a050 79 2c 20 26 70 43 75 72 2d 3e 69 6e 66 6f 29 3b  y, &pCur->info);
2a060 0a 20 20 20 20 20 20 20 20 20 20 6e 43 65 6c 6c  .          nCell
2a070 20 3d 20 28 69 6e 74 29 70 43 75 72 2d 3e 69 6e   = (int)pCur->in
2a080 66 6f 2e 6e 4b 65 79 3b 0a 20 20 20 20 20 20 20  fo.nKey;.       
2a090 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 43 65     testcase( nCe
2a0a0 6c 6c 3c 30 20 29 3b 20 20 20 2f 2a 20 54 72 75  ll<0 );   /* Tru
2a0b0 65 20 69 66 20 6b 65 79 20 73 69 7a 65 20 69 73  e if key size is
2a0c0 20 32 5e 33 32 20 6f 72 20 6d 6f 72 65 20 2a 2f   2^32 or more */
2a0d0 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63  .          testc
2a0e0 61 73 65 28 20 6e 43 65 6c 6c 3d 3d 30 20 29 3b  ase( nCell==0 );
2a0f0 20 20 2f 2a 20 49 6e 76 61 6c 69 64 20 6b 65 79    /* Invalid key
2a100 20 73 69 7a 65 3a 20 20 30 78 38 30 20 30 78 38   size:  0x80 0x8
2a110 30 20 30 78 30 30 20 2a 2f 0a 20 20 20 20 20 20  0 0x00 */.      
2a120 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 43      testcase( nC
2a130 65 6c 6c 3d 3d 31 20 29 3b 20 20 2f 2a 20 49 6e  ell==1 );  /* In
2a140 76 61 6c 69 64 20 6b 65 79 20 73 69 7a 65 3a 20  valid key size: 
2a150 20 30 78 38 30 20 30 78 38 30 20 30 78 30 31 20   0x80 0x80 0x01 
2a160 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 74 65 73  */.          tes
2a170 74 63 61 73 65 28 20 6e 43 65 6c 6c 3d 3d 32 20  tcase( nCell==2 
2a180 29 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 6c  );  /* Minimum l
2a190 65 67 61 6c 20 69 6e 64 65 78 20 6b 65 79 20 73  egal index key s
2a1a0 69 7a 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ize */.         
2a1b0 20 69 66 28 20 6e 43 65 6c 6c 3c 32 20 29 7b 0a   if( nCell<2 ){.
2a1c0 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
2a1d0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
2a1e0 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20  BKPT;.          
2a1f0 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69    goto moveto_fi
2a200 6e 69 73 68 3b 0a 20 20 20 20 20 20 20 20 20 20  nish;.          
2a210 7d 0a 20 20 20 20 20 20 20 20 20 20 70 43 65 6c  }.          pCel
2a220 6c 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 4d 61  lKey = sqlite3Ma
2a230 6c 6c 6f 63 28 20 6e 43 65 6c 6c 2b 31 38 20 29  lloc( nCell+18 )
2a240 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
2a250 70 43 65 6c 6c 4b 65 79 3d 3d 30 20 29 7b 0a 20  pCellKey==0 ){. 
2a260 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
2a270 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
2a280 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d            goto m
2a290 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20  oveto_finish;.  
2a2a0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2a2b0 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b      pCur->aiIdx[
2a2c0 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28  pCur->iPage] = (
2a2d0 75 31 36 29 69 64 78 3b 0a 20 20 20 20 20 20 20  u16)idx;.       
2a2e0 20 20 20 72 63 20 3d 20 61 63 63 65 73 73 50 61     rc = accessPa
2a2f0 79 6c 6f 61 64 28 70 43 75 72 2c 20 30 2c 20 6e  yload(pCur, 0, n
2a300 43 65 6c 6c 2c 20 28 75 6e 73 69 67 6e 65 64 20  Cell, (unsigned 
2a310 63 68 61 72 2a 29 70 43 65 6c 6c 4b 65 79 2c 20  char*)pCellKey, 
2a320 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  2);.          if
2a330 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
2a340 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
2a350 28 70 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20  (pCellKey);.    
2a360 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76          goto mov
2a370 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20  eto_finish;.    
2a380 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2a390 20 20 63 20 3d 20 78 52 65 63 6f 72 64 43 6f 6d    c = xRecordCom
2a3a0 70 61 72 65 28 6e 43 65 6c 6c 2c 20 70 43 65 6c  pare(nCell, pCel
2a3b0 6c 4b 65 79 2c 20 70 49 64 78 4b 65 79 29 3b 0a  lKey, pIdxKey);.
2a3c0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
2a3d0 33 5f 66 72 65 65 28 70 43 65 6c 6c 4b 65 79 29  3_free(pCellKey)
2a3e0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2a3f0 20 20 20 20 61 73 73 65 72 74 28 20 0a 20 20 20      assert( .   
2a400 20 20 20 20 20 20 20 20 20 28 70 49 64 78 4b 65           (pIdxKe
2a410 79 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49  y->errCode!=SQLI
2a420 54 45 5f 43 4f 52 52 55 50 54 20 7c 7c 20 63 3d  TE_CORRUPT || c=
2a430 3d 30 29 0a 20 20 20 20 20 20 20 20 20 26 26 20  =0).         && 
2a440 28 70 49 64 78 4b 65 79 2d 3e 65 72 72 43 6f 64  (pIdxKey->errCod
2a450 65 21 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  e!=SQLITE_NOMEM 
2a460 7c 7c 20 70 43 75 72 2d 3e 70 42 74 72 65 65 2d  || pCur->pBtree-
2a470 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
2a480 64 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20  d).        );.  
2a490 20 20 20 20 20 20 69 66 28 20 63 3c 30 20 29 7b        if( c<0 ){
2a4a0 0a 20 20 20 20 20 20 20 20 20 20 6c 77 72 20 3d  .          lwr =
2a4b0 20 69 64 78 2b 31 3b 0a 20 20 20 20 20 20 20 20   idx+1;.        
2a4c0 7d 65 6c 73 65 20 69 66 28 20 63 3e 30 20 29 7b  }else if( c>0 ){
2a4d0 0a 20 20 20 20 20 20 20 20 20 20 75 70 72 20 3d  .          upr =
2a4e0 20 69 64 78 2d 31 3b 0a 20 20 20 20 20 20 20 20   idx-1;.        
2a4f0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
2a500 20 61 73 73 65 72 74 28 20 63 3d 3d 30 20 29 3b   assert( c==0 );
2a510 0a 20 20 20 20 20 20 20 20 20 20 2a 70 52 65 73  .          *pRes
2a520 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
2a530 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
2a540 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e            pCur->
2a550 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
2a560 65 5d 20 3d 20 28 75 31 36 29 69 64 78 3b 0a 20  e] = (u16)idx;. 
2a570 20 20 20 20 20 20 20 20 20 69 66 28 20 70 49 64           if( pId
2a580 78 4b 65 79 2d 3e 65 72 72 43 6f 64 65 20 29 20  xKey->errCode ) 
2a590 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
2a5a0 55 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 67  UPT;.          g
2a5b0 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73  oto moveto_finis
2a5c0 68 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  h;.        }.   
2a5d0 20 20 20 20 20 69 66 28 20 6c 77 72 3e 75 70 72       if( lwr>upr
2a5e0 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
2a5f0 20 20 61 73 73 65 72 74 28 20 6c 77 72 2b 75 70    assert( lwr+up
2a600 72 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  r>=0 );.        
2a610 69 64 78 20 3d 20 28 6c 77 72 2b 75 70 72 29 3e  idx = (lwr+upr)>
2a620 3e 31 3b 20 20 2f 2a 20 69 64 78 20 3d 20 28 6c  >1;  /* idx = (l
2a630 77 72 2b 75 70 72 29 2f 32 20 2a 2f 0a 20 20 20  wr+upr)/2 */.   
2a640 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61     }.    }.    a
2a650 73 73 65 72 74 28 20 6c 77 72 3d 3d 75 70 72 2b  ssert( lwr==upr+
2a660 31 20 7c 7c 20 28 70 50 61 67 65 2d 3e 69 6e 74  1 || (pPage->int
2a670 4b 65 79 20 26 26 20 21 70 50 61 67 65 2d 3e 6c  Key && !pPage->l
2a680 65 61 66 29 20 29 3b 0a 20 20 20 20 61 73 73 65  eaf) );.    asse
2a690 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69  rt( pPage->isIni
2a6a0 74 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61  t );.    if( pPa
2a6b0 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
2a6c0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2a6d0 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
2a6e0 65 5d 3c 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  e]<pCur->apPage[
2a6f0 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43  pCur->iPage]->nC
2a700 65 6c 6c 20 29 3b 0a 20 20 20 20 20 20 70 43 75  ell );.      pCu
2a710 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
2a720 50 61 67 65 5d 20 3d 20 28 75 31 36 29 69 64 78  Page] = (u16)idx
2a730 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20  ;.      *pRes = 
2a740 63 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  c;.      rc = SQ
2a750 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 67  LITE_OK;.      g
2a760 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73  oto moveto_finis
2a770 68 3b 0a 20 20 20 20 7d 0a 6d 6f 76 65 74 6f 5f  h;.    }.moveto_
2a780 6e 65 78 74 5f 6c 61 79 65 72 3a 0a 20 20 20 20  next_layer:.    
2a790 69 66 28 20 6c 77 72 3e 3d 70 50 61 67 65 2d 3e  if( lwr>=pPage->
2a7a0 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 63  nCell ){.      c
2a7b0 68 6c 64 50 67 20 3d 20 67 65 74 34 62 79 74 65  hldPg = get4byte
2a7c0 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  (&pPage->aData[p
2a7d0 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
2a7e0 38 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  8]);.    }else{.
2a7f0 20 20 20 20 20 20 63 68 6c 64 50 67 20 3d 20 67        chldPg = g
2a800 65 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c  et4byte(findCell
2a810 28 70 50 61 67 65 2c 20 6c 77 72 29 29 3b 0a 20  (pPage, lwr));. 
2a820 20 20 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e 61     }.    pCur->a
2a830 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
2a840 5d 20 3d 20 28 75 31 36 29 6c 77 72 3b 0a 20 20  ] = (u16)lwr;.  
2a850 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69    rc = moveToChi
2a860 6c 64 28 70 43 75 72 2c 20 63 68 6c 64 50 67 29  ld(pCur, chldPg)
2a870 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 62  ;.    if( rc ) b
2a880 72 65 61 6b 3b 0a 20 20 7d 0a 6d 6f 76 65 74 6f  reak;.  }.moveto
2a890 5f 66 69 6e 69 73 68 3a 0a 20 20 70 43 75 72 2d  _finish:.  pCur-
2a8a0 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b  >info.nSize = 0;
2a8b0 0a 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67  .  pCur->curFlag
2a8c0 73 20 26 3d 20 7e 28 42 54 43 46 5f 56 61 6c 69  s &= ~(BTCF_Vali
2a8d0 64 4e 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69 64  dNKey|BTCF_Valid
2a8e0 4f 76 66 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20  Ovfl);.  return 
2a8f0 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65  rc;.}.../*.** Re
2a900 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65  turn TRUE if the
2a910 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 70   cursor is not p
2a920 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e  ointing at an en
2a930 74 72 79 20 6f 66 20 74 68 65 20 74 61 62 6c 65  try of the table
2a940 2e 0a 2a 2a 0a 2a 2a 20 54 52 55 45 20 77 69 6c  ..**.** TRUE wil
2a950 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20 61 66  l be returned af
2a960 74 65 72 20 61 20 63 61 6c 6c 20 74 6f 20 73 71  ter a call to sq
2a970 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 29  lite3BtreeNext()
2a980 20 6d 6f 76 65 73 0a 2a 2a 20 70 61 73 74 20 74   moves.** past t
2a990 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e  he last entry in
2a9a0 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20 73 71   the table or sq
2a9b0 6c 69 74 65 33 42 74 72 65 65 50 72 65 76 28 29  lite3BtreePrev()
2a9c0 20 6d 6f 76 65 73 20 70 61 73 74 0a 2a 2a 20 74   moves past.** t
2a9d0 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 2e 20  he first entry. 
2a9e0 20 54 52 55 45 20 69 73 20 61 6c 73 6f 20 72 65   TRUE is also re
2a9f0 74 75 72 6e 65 64 20 69 66 20 74 68 65 20 74 61  turned if the ta
2aa00 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f  ble is empty..*/
2aa10 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
2aa20 65 45 6f 66 28 42 74 43 75 72 73 6f 72 20 2a 70  eEof(BtCursor *p
2aa30 43 75 72 29 7b 0a 20 20 2f 2a 20 54 4f 44 4f 3a  Cur){.  /* TODO:
2aa40 20 57 68 61 74 20 69 66 20 74 68 65 20 63 75 72   What if the cur
2aa50 73 6f 72 20 69 73 20 69 6e 20 43 55 52 53 4f 52  sor is in CURSOR
2aa60 5f 52 45 51 55 49 52 45 53 45 45 4b 20 62 75 74  _REQUIRESEEK but
2aa70 20 61 6c 6c 20 74 61 62 6c 65 20 65 6e 74 72 69   all table entri
2aa80 65 73 0a 20 20 2a 2a 20 68 61 76 65 20 62 65 65  es.  ** have bee
2aa90 6e 20 64 65 6c 65 74 65 64 3f 20 54 68 69 73 20  n deleted? This 
2aaa0 41 50 49 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f  API will need to
2aab0 20 63 68 61 6e 67 65 20 74 6f 20 72 65 74 75 72   change to retur
2aac0 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 0a  n an error code.
2aad0 20 20 2a 2a 20 61 73 20 77 65 6c 6c 20 61 73 20    ** as well as 
2aae0 74 68 65 20 62 6f 6f 6c 65 61 6e 20 72 65 73 75  the boolean resu
2aaf0 6c 74 20 76 61 6c 75 65 2e 0a 20 20 2a 2f 0a 20  lt value..  */. 
2ab00 20 72 65 74 75 72 6e 20 28 43 55 52 53 4f 52 5f   return (CURSOR_
2ab10 56 41 4c 49 44 21 3d 70 43 75 72 2d 3e 65 53 74  VALID!=pCur->eSt
2ab20 61 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ate);.}../*.** A
2ab30 64 76 61 6e 63 65 20 74 68 65 20 63 75 72 73 6f  dvance the curso
2ab40 72 20 74 6f 20 74 68 65 20 6e 65 78 74 20 65 6e  r to the next en
2ab50 74 72 79 20 69 6e 20 74 68 65 20 64 61 74 61 62  try in the datab
2ab60 61 73 65 2e 20 20 49 66 0a 2a 2a 20 73 75 63 63  ase.  If.** succ
2ab70 65 73 73 66 75 6c 20 74 68 65 6e 20 73 65 74 20  essful then set 
2ab80 2a 70 52 65 73 3d 30 2e 20 20 49 66 20 74 68 65  *pRes=0.  If the
2ab90 20 63 75 72 73 6f 72 0a 2a 2a 20 77 61 73 20 61   cursor.** was a
2aba0 6c 72 65 61 64 79 20 70 6f 69 6e 74 69 6e 67 20  lready pointing 
2abb0 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72  to the last entr
2abc0 79 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  y in the databas
2abd0 65 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 69 73  e before.** this
2abe0 20 72 6f 75 74 69 6e 65 20 77 61 73 20 63 61 6c   routine was cal
2abf0 6c 65 64 2c 20 74 68 65 6e 20 73 65 74 20 2a 70  led, then set *p
2ac00 52 65 73 3d 31 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  Res=1..**.** The
2ac10 20 6d 61 69 6e 20 65 6e 74 72 79 20 70 6f 69 6e   main entry poin
2ac20 74 20 69 73 20 73 71 6c 69 74 65 33 42 74 72 65  t is sqlite3Btre
2ac30 65 4e 65 78 74 28 29 2e 20 20 54 68 61 74 20 72  eNext().  That r
2ac40 6f 75 74 69 6e 65 20 69 73 20 6f 70 74 69 6d 69  outine is optimi
2ac50 7a 65 64 0a 2a 2a 20 66 6f 72 20 74 68 65 20 63  zed.** for the c
2ac60 6f 6d 6d 6f 6e 20 63 61 73 65 20 6f 66 20 6d 65  ommon case of me
2ac70 72 65 6c 79 20 69 6e 63 72 65 6d 65 6e 74 69 6e  rely incrementin
2ac80 67 20 74 68 65 20 63 65 6c 6c 20 63 6f 75 6e 74  g the cell count
2ac90 65 72 20 42 74 43 75 72 73 6f 72 2e 61 69 49 64  er BtCursor.aiId
2aca0 78 0a 2a 2a 20 74 6f 20 74 68 65 20 6e 65 78 74  x.** to the next
2acb0 20 63 65 6c 6c 20 6f 6e 20 74 68 65 20 63 75 72   cell on the cur
2acc0 72 65 6e 74 20 70 61 67 65 2e 20 20 54 68 65 20  rent page.  The 
2acd0 28 73 6c 6f 77 65 72 29 20 62 74 72 65 65 4e 65  (slower) btreeNe
2ace0 78 74 28 29 20 68 65 6c 70 65 72 0a 2a 2a 20 72  xt() helper.** r
2acf0 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
2ad00 20 77 68 65 6e 20 69 74 20 69 73 20 6e 65 63 65   when it is nece
2ad10 73 73 61 72 79 20 74 6f 20 6d 6f 76 65 20 74 6f  ssary to move to
2ad20 20 61 20 64 69 66 66 65 72 65 6e 74 20 70 61 67   a different pag
2ad30 65 20 6f 72 0a 2a 2a 20 74 6f 20 72 65 73 74 6f  e or.** to resto
2ad40 72 65 20 74 68 65 20 63 75 72 73 6f 72 2e 0a 2a  re the cursor..*
2ad50 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 69 6e 67  *.** The calling
2ad60 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 73   function will s
2ad70 65 74 20 2a 70 52 65 73 20 74 6f 20 30 20 6f 72  et *pRes to 0 or
2ad80 20 31 2e 20 20 54 68 65 20 69 6e 69 74 69 61 6c   1.  The initial
2ad90 20 2a 70 52 65 73 20 76 61 6c 75 65 0a 2a 2a 20   *pRes value.** 
2ada0 77 69 6c 6c 20 62 65 20 31 20 69 66 20 74 68 65  will be 1 if the
2adb0 20 63 75 72 73 6f 72 20 62 65 69 6e 67 20 73 74   cursor being st
2adc0 65 70 70 65 64 20 63 6f 72 72 65 73 70 6f 6e 64  epped correspond
2add0 73 20 74 6f 20 61 6e 20 53 51 4c 20 69 6e 64 65  s to an SQL inde
2ade0 78 20 61 6e 64 0a 2a 2a 20 69 66 20 74 68 69 73  x and.** if this
2adf0 20 72 6f 75 74 69 6e 65 20 63 6f 75 6c 64 20 68   routine could h
2ae00 61 76 65 20 62 65 65 6e 20 73 6b 69 70 70 65 64  ave been skipped
2ae10 20 69 66 20 74 68 61 74 20 53 51 4c 20 69 6e 64   if that SQL ind
2ae20 65 78 20 68 61 64 20 62 65 65 6e 0a 2a 2a 20 61  ex had been.** a
2ae30 20 75 6e 69 71 75 65 20 69 6e 64 65 78 2e 20 20   unique index.  
2ae40 4f 74 68 65 72 77 69 73 65 20 74 68 65 20 63 61  Otherwise the ca
2ae50 6c 6c 65 72 20 77 69 6c 6c 20 68 61 76 65 20 73  ller will have s
2ae60 65 74 20 2a 70 52 65 73 20 74 6f 20 7a 65 72 6f  et *pRes to zero
2ae70 2e 0a 2a 2a 20 5a 65 72 6f 20 69 73 20 74 68 65  ..** Zero is the
2ae80 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 2e 20 54 68   common case. Th
2ae90 65 20 62 74 72 65 65 20 69 6d 70 6c 65 6d 65 6e  e btree implemen
2aea0 74 61 74 69 6f 6e 20 69 73 20 66 72 65 65 20 74  tation is free t
2aeb0 6f 20 75 73 65 20 74 68 65 0a 2a 2a 20 69 6e 69  o use the.** ini
2aec0 74 69 61 6c 20 2a 70 52 65 73 20 76 61 6c 75 65  tial *pRes value
2aed0 20 61 73 20 61 20 68 69 6e 74 20 74 6f 20 69 6d   as a hint to im
2aee0 70 72 6f 76 65 20 70 65 72 66 6f 72 6d 61 6e 63  prove performanc
2aef0 65 2c 20 62 75 74 20 74 68 65 20 63 75 72 72 65  e, but the curre
2af00 6e 74 0a 2a 2a 20 53 51 4c 69 74 65 20 62 74 72  nt.** SQLite btr
2af10 65 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ee implementatio
2af20 6e 20 64 6f 65 73 20 6e 6f 74 2e 20 28 4e 6f 74  n does not. (Not
2af30 65 20 74 68 61 74 20 74 68 65 20 63 6f 6d 64 62  e that the comdb
2af40 32 20 62 74 72 65 65 0a 2a 2a 20 69 6d 70 6c 65  2 btree.** imple
2af50 6d 65 6e 74 61 74 69 6f 6e 20 64 6f 65 73 20 75  mentation does u
2af60 73 65 20 74 68 69 73 20 68 69 6e 74 2c 20 68 6f  se this hint, ho
2af70 77 65 76 65 72 2e 29 0a 2a 2f 0a 73 74 61 74 69  wever.).*/.stati
2af80 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e  c SQLITE_NOINLIN
2af90 45 20 69 6e 74 20 62 74 72 65 65 4e 65 78 74 28  E int btreeNext(
2afa0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
2afb0 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e  int *pRes){.  in
2afc0 74 20 72 63 3b 0a 20 20 69 6e 74 20 69 64 78 3b  t rc;.  int idx;
2afd0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
2afe0 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  e;..  assert( cu
2aff0 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
2b000 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
2b010 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74  ( pCur->skipNext
2b020 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74  ==0 || pCur->eSt
2b030 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate!=CURSOR_VALI
2b040 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 2a  D );.  assert( *
2b050 70 52 65 73 3d 3d 30 20 29 3b 0a 20 20 69 66 28  pRes==0 );.  if(
2b060 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43   pCur->eState!=C
2b070 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20  URSOR_VALID ){. 
2b080 20 20 20 61 73 73 65 72 74 28 20 28 70 43 75 72     assert( (pCur
2b090 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43  ->curFlags & BTC
2b0a0 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3d 3d 30 20  F_ValidOvfl)==0 
2b0b0 29 3b 0a 20 20 20 20 72 63 20 3d 20 72 65 73 74  );.    rc = rest
2b0c0 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  oreCursorPositio
2b0d0 6e 28 70 43 75 72 29 3b 0a 20 20 20 20 69 66 28  n(pCur);.    if(
2b0e0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2b0f0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
2b100 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  c;.    }.    if(
2b110 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d   CURSOR_INVALID=
2b120 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29 7b  =pCur->eState ){
2b130 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31  .      *pRes = 1
2b140 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
2b150 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
2b160 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 73 6b      if( pCur->sk
2b170 69 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20  ipNext ){.      
2b180 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
2b190 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
2b1a0 49 44 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61  ID || pCur->eSta
2b1b0 74 65 3d 3d 43 55 52 53 4f 52 5f 53 4b 49 50 4e  te==CURSOR_SKIPN
2b1c0 45 58 54 20 29 3b 0a 20 20 20 20 20 20 70 43 75  EXT );.      pCu
2b1d0 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
2b1e0 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 20 20 20 20  OR_VALID;.      
2b1f0 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65  if( pCur->skipNe
2b200 78 74 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  xt>0 ){.        
2b210 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d  pCur->skipNext =
2b220 20 30 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75   0;.        retu
2b230 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
2b240 20 20 20 20 7d 0a 20 20 20 20 20 20 70 43 75 72      }.      pCur
2b250 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a  ->skipNext = 0;.
2b260 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 50 61      }.  }..  pPa
2b270 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67  ge = pCur->apPag
2b280 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a  e[pCur->iPage];.
2b290 20 20 69 64 78 20 3d 20 2b 2b 70 43 75 72 2d 3e    idx = ++pCur->
2b2a0 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
2b2b0 65 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  e];.  assert( pP
2b2c0 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 0a  age->isInit );..
2b2d0 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61    /* If the data
2b2e0 62 61 73 65 20 66 69 6c 65 20 69 73 20 63 6f 72  base file is cor
2b2f0 72 75 70 74 2c 20 69 74 20 69 73 20 70 6f 73 73  rupt, it is poss
2b300 69 62 6c 65 20 66 6f 72 20 74 68 65 20 76 61 6c  ible for the val
2b310 75 65 20 6f 66 20 69 64 78 20 0a 20 20 2a 2a 20  ue of idx .  ** 
2b320 74 6f 20 62 65 20 69 6e 76 61 6c 69 64 20 68 65  to be invalid he
2b330 72 65 2e 20 54 68 69 73 20 63 61 6e 20 6f 6e 6c  re. This can onl
2b340 79 20 6f 63 63 75 72 20 69 66 20 61 20 73 65 63  y occur if a sec
2b350 6f 6e 64 20 63 75 72 73 6f 72 20 6d 6f 64 69 66  ond cursor modif
2b360 69 65 73 0a 20 20 2a 2a 20 74 68 65 20 70 61 67  ies.  ** the pag
2b370 65 20 77 68 69 6c 65 20 63 75 72 73 6f 72 20 70  e while cursor p
2b380 43 75 72 20 69 73 20 68 6f 6c 64 69 6e 67 20 61  Cur is holding a
2b390 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 69 74   reference to it
2b3a0 2e 20 57 68 69 63 68 20 63 61 6e 0a 20 20 2a 2a  . Which can.  **
2b3b0 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 69 66 20   only happen if 
2b3c0 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
2b3d0 63 6f 72 72 75 70 74 20 69 6e 20 73 75 63 68 20  corrupt in such 
2b3e0 61 20 77 61 79 20 61 73 20 74 6f 20 6c 69 6e 6b  a way as to link
2b3f0 20 74 68 65 0a 20 20 2a 2a 20 70 61 67 65 20 69   the.  ** page i
2b400 6e 74 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e  nto more than on
2b410 65 20 62 2d 74 72 65 65 20 73 74 72 75 63 74 75  e b-tree structu
2b420 72 65 2e 20 2a 2f 0a 20 20 74 65 73 74 63 61 73  re. */.  testcas
2b430 65 28 20 69 64 78 3e 70 50 61 67 65 2d 3e 6e 43  e( idx>pPage->nC
2b440 65 6c 6c 20 29 3b 0a 0a 20 20 69 66 28 20 69 64  ell );..  if( id
2b450 78 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  x>=pPage->nCell 
2b460 29 7b 0a 20 20 20 20 69 66 28 20 21 70 50 61 67  ){.    if( !pPag
2b470 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20  e->leaf ){.     
2b480 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c   rc = moveToChil
2b490 64 28 70 43 75 72 2c 20 67 65 74 34 62 79 74 65  d(pCur, get4byte
2b4a0 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  (&pPage->aData[p
2b4b0 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
2b4c0 38 5d 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20  8]));.      if( 
2b4d0 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
2b4e0 20 20 20 20 20 20 72 65 74 75 72 6e 20 6d 6f 76        return mov
2b4f0 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72  eToLeftmost(pCur
2b500 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 6f 7b  );.    }.    do{
2b510 0a 20 20 20 20 20 20 69 66 28 20 70 43 75 72 2d  .      if( pCur-
2b520 3e 69 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20  >iPage==0 ){.   
2b530 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a       *pRes = 1;.
2b540 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53          pCur->eS
2b550 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e  tate = CURSOR_IN
2b560 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 20 20 72  VALID;.        r
2b570 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2b580 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d  .      }.      m
2b590 6f 76 65 54 6f 50 61 72 65 6e 74 28 70 43 75 72  oveToParent(pCur
2b5a0 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 20 3d  );.      pPage =
2b5b0 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
2b5c0 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20  ur->iPage];.    
2b5d0 7d 77 68 69 6c 65 28 20 70 43 75 72 2d 3e 61 69  }while( pCur->ai
2b5e0 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
2b5f0 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29  >=pPage->nCell )
2b600 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d  ;.    if( pPage-
2b610 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20  >intKey ){.     
2b620 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 42   return sqlite3B
2b630 74 72 65 65 4e 65 78 74 28 70 43 75 72 2c 20 70  treeNext(pCur, p
2b640 52 65 73 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Res);.    }else{
2b650 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
2b660 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
2b670 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e   }.  if( pPage->
2b680 6c 65 61 66 20 29 7b 0a 20 20 20 20 72 65 74 75  leaf ){.    retu
2b690 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
2b6a0 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72  }else{.    retur
2b6b0 6e 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74  n moveToLeftmost
2b6c0 28 70 43 75 72 29 3b 0a 20 20 7d 0a 7d 0a 69 6e  (pCur);.  }.}.in
2b6d0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65  t sqlite3BtreeNe
2b6e0 78 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  xt(BtCursor *pCu
2b6f0 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20  r, int *pRes){. 
2b700 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b   MemPage *pPage;
2b710 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
2b720 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
2b730 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
2b740 52 65 73 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  Res!=0 );.  asse
2b750 72 74 28 20 2a 70 52 65 73 3d 3d 30 20 7c 7c 20  rt( *pRes==0 || 
2b760 2a 70 52 65 73 3d 3d 31 20 29 3b 0a 20 20 61 73  *pRes==1 );.  as
2b770 73 65 72 74 28 20 70 43 75 72 2d 3e 73 6b 69 70  sert( pCur->skip
2b780 4e 65 78 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d  Next==0 || pCur-
2b790 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f  >eState!=CURSOR_
2b7a0 56 41 4c 49 44 20 29 3b 0a 20 20 70 43 75 72 2d  VALID );.  pCur-
2b7b0 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b  >info.nSize = 0;
2b7c0 0a 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67  .  pCur->curFlag
2b7d0 73 20 26 3d 20 7e 28 42 54 43 46 5f 56 61 6c 69  s &= ~(BTCF_Vali
2b7e0 64 4e 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69 64  dNKey|BTCF_Valid
2b7f0 4f 76 66 6c 29 3b 0a 20 20 2a 70 52 65 73 20 3d  Ovfl);.  *pRes =
2b800 20 30 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e   0;.  if( pCur->
2b810 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56  eState!=CURSOR_V
2b820 41 4c 49 44 20 29 20 72 65 74 75 72 6e 20 62 74  ALID ) return bt
2b830 72 65 65 4e 65 78 74 28 70 43 75 72 2c 20 70 52  reeNext(pCur, pR
2b840 65 73 29 3b 0a 20 20 70 50 61 67 65 20 3d 20 70  es);.  pPage = p
2b850 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
2b860 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 69 66 28 20  ->iPage];.  if( 
2b870 28 2b 2b 70 43 75 72 2d 3e 61 69 49 64 78 5b 70  (++pCur->aiIdx[p
2b880 43 75 72 2d 3e 69 50 61 67 65 5d 29 3e 3d 70 50  Cur->iPage])>=pP
2b890 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20  age->nCell ){.  
2b8a0 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43    pCur->aiIdx[pC
2b8b0 75 72 2d 3e 69 50 61 67 65 5d 2d 2d 3b 0a 20 20  ur->iPage]--;.  
2b8c0 20 20 72 65 74 75 72 6e 20 62 74 72 65 65 4e 65    return btreeNe
2b8d0 78 74 28 70 43 75 72 2c 20 70 52 65 73 29 3b 0a  xt(pCur, pRes);.
2b8e0 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 2d    }.  if( pPage-
2b8f0 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 72 65 74  >leaf ){.    ret
2b900 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
2b910 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75   }else{.    retu
2b920 72 6e 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73  rn moveToLeftmos
2b930 74 28 70 43 75 72 29 3b 0a 20 20 7d 0a 7d 0a 0a  t(pCur);.  }.}..
2b940 2f 2a 0a 2a 2a 20 53 74 65 70 20 74 68 65 20 63  /*.** Step the c
2b950 75 72 73 6f 72 20 74 6f 20 74 68 65 20 62 61 63  ursor to the bac
2b960 6b 20 74 6f 20 74 68 65 20 70 72 65 76 69 6f 75  k to the previou
2b970 73 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64  s entry in the d
2b980 61 74 61 62 61 73 65 2e 20 20 49 66 0a 2a 2a 20  atabase.  If.** 
2b990 73 75 63 63 65 73 73 66 75 6c 20 74 68 65 6e 20  successful then 
2b9a0 73 65 74 20 2a 70 52 65 73 3d 30 2e 20 20 49 66  set *pRes=0.  If
2b9b0 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 77   the cursor.** w
2b9c0 61 73 20 61 6c 72 65 61 64 79 20 70 6f 69 6e 74  as already point
2b9d0 69 6e 67 20 74 6f 20 74 68 65 20 66 69 72 73 74  ing to the first
2b9e0 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61   entry in the da
2b9f0 74 61 62 61 73 65 20 62 65 66 6f 72 65 0a 2a 2a  tabase before.**
2ba00 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61   this routine wa
2ba10 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20 73  s called, then s
2ba20 65 74 20 2a 70 52 65 73 3d 31 2e 0a 2a 2a 0a 2a  et *pRes=1..**.*
2ba30 2a 20 54 68 65 20 6d 61 69 6e 20 65 6e 74 72 79  * The main entry
2ba40 20 70 6f 69 6e 74 20 69 73 20 73 71 6c 69 74 65   point is sqlite
2ba50 33 42 74 72 65 65 50 72 65 76 69 6f 75 73 28 29  3BtreePrevious()
2ba60 2e 20 20 54 68 61 74 20 72 6f 75 74 69 6e 65 20  .  That routine 
2ba70 69 73 20 6f 70 74 69 6d 69 7a 65 64 0a 2a 2a 20  is optimized.** 
2ba80 66 6f 72 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63  for the common c
2ba90 61 73 65 20 6f 66 20 6d 65 72 65 6c 79 20 64 65  ase of merely de
2baa0 63 72 65 6d 65 6e 74 69 6e 67 20 74 68 65 20 63  crementing the c
2bab0 65 6c 6c 20 63 6f 75 6e 74 65 72 20 42 74 43 75  ell counter BtCu
2bac0 72 73 6f 72 2e 61 69 49 64 78 0a 2a 2a 20 74 6f  rsor.aiIdx.** to
2bad0 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 63 65   the previous ce
2bae0 6c 6c 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e  ll on the curren
2baf0 74 20 70 61 67 65 2e 20 20 54 68 65 20 28 73 6c  t page.  The (sl
2bb00 6f 77 65 72 29 20 62 74 72 65 65 50 72 65 76 69  ower) btreePrevi
2bb10 6f 75 73 28 29 0a 2a 2a 20 68 65 6c 70 65 72 20  ous().** helper 
2bb20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
2bb30 64 20 77 68 65 6e 20 69 74 20 69 73 20 6e 65 63  d when it is nec
2bb40 65 73 73 61 72 79 20 74 6f 20 6d 6f 76 65 20 74  essary to move t
2bb50 6f 20 61 20 64 69 66 66 65 72 65 6e 74 20 70 61  o a different pa
2bb60 67 65 0a 2a 2a 20 6f 72 20 74 6f 20 72 65 73 74  ge.** or to rest
2bb70 6f 72 65 20 74 68 65 20 63 75 72 73 6f 72 2e 0a  ore the cursor..
2bb80 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 69 6e  **.** The callin
2bb90 67 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20  g function will 
2bba0 73 65 74 20 2a 70 52 65 73 20 74 6f 20 30 20 6f  set *pRes to 0 o
2bbb0 72 20 31 2e 20 20 54 68 65 20 69 6e 69 74 69 61  r 1.  The initia
2bbc0 6c 20 2a 70 52 65 73 20 76 61 6c 75 65 0a 2a 2a  l *pRes value.**
2bbd0 20 77 69 6c 6c 20 62 65 20 31 20 69 66 20 74 68   will be 1 if th
2bbe0 65 20 63 75 72 73 6f 72 20 62 65 69 6e 67 20 73  e cursor being s
2bbf0 74 65 70 70 65 64 20 63 6f 72 72 65 73 70 6f 6e  tepped correspon
2bc00 64 73 20 74 6f 20 61 6e 20 53 51 4c 20 69 6e 64  ds to an SQL ind
2bc10 65 78 20 61 6e 64 0a 2a 2a 20 69 66 20 74 68 69  ex and.** if thi
2bc20 73 20 72 6f 75 74 69 6e 65 20 63 6f 75 6c 64 20  s routine could 
2bc30 68 61 76 65 20 62 65 65 6e 20 73 6b 69 70 70 65  have been skippe
2bc40 64 20 69 66 20 74 68 61 74 20 53 51 4c 20 69 6e  d if that SQL in
2bc50 64 65 78 20 68 61 64 20 62 65 65 6e 0a 2a 2a 20  dex had been.** 
2bc60 61 20 75 6e 69 71 75 65 20 69 6e 64 65 78 2e 20  a unique index. 
2bc70 20 4f 74 68 65 72 77 69 73 65 20 74 68 65 20 63   Otherwise the c
2bc80 61 6c 6c 65 72 20 77 69 6c 6c 20 68 61 76 65 20  aller will have 
2bc90 73 65 74 20 2a 70 52 65 73 20 74 6f 20 7a 65 72  set *pRes to zer
2bca0 6f 2e 0a 2a 2a 20 5a 65 72 6f 20 69 73 20 74 68  o..** Zero is th
2bcb0 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 2e 20 54  e common case. T
2bcc0 68 65 20 62 74 72 65 65 20 69 6d 70 6c 65 6d 65  he btree impleme
2bcd0 6e 74 61 74 69 6f 6e 20 69 73 20 66 72 65 65 20  ntation is free 
2bce0 74 6f 20 75 73 65 20 74 68 65 0a 2a 2a 20 69 6e  to use the.** in
2bcf0 69 74 69 61 6c 20 2a 70 52 65 73 20 76 61 6c 75  itial *pRes valu
2bd00 65 20 61 73 20 61 20 68 69 6e 74 20 74 6f 20 69  e as a hint to i
2bd10 6d 70 72 6f 76 65 20 70 65 72 66 6f 72 6d 61 6e  mprove performan
2bd20 63 65 2c 20 62 75 74 20 74 68 65 20 63 75 72 72  ce, but the curr
2bd30 65 6e 74 0a 2a 2a 20 53 51 4c 69 74 65 20 62 74  ent.** SQLite bt
2bd40 72 65 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ree implementati
2bd50 6f 6e 20 64 6f 65 73 20 6e 6f 74 2e 20 28 4e 6f  on does not. (No
2bd60 74 65 20 74 68 61 74 20 74 68 65 20 63 6f 6d 64  te that the comd
2bd70 62 32 20 62 74 72 65 65 0a 2a 2a 20 69 6d 70 6c  b2 btree.** impl
2bd80 65 6d 65 6e 74 61 74 69 6f 6e 20 64 6f 65 73 20  ementation does 
2bd90 75 73 65 20 74 68 69 73 20 68 69 6e 74 2c 20 68  use this hint, h
2bda0 6f 77 65 76 65 72 2e 29 0a 2a 2f 0a 73 74 61 74  owever.).*/.stat
2bdb0 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49  ic SQLITE_NOINLI
2bdc0 4e 45 20 69 6e 74 20 62 74 72 65 65 50 72 65 76  NE int btreePrev
2bdd0 69 6f 75 73 28 42 74 43 75 72 73 6f 72 20 2a 70  ious(BtCursor *p
2bde0 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b  Cur, int *pRes){
2bdf0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d  .  int rc;.  Mem
2be00 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20  Page *pPage;..  
2be10 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
2be20 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
2be30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 52 65 73  ;.  assert( pRes
2be40 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
2be50 20 2a 70 52 65 73 3d 3d 30 20 29 3b 0a 20 20 61   *pRes==0 );.  a
2be60 73 73 65 72 74 28 20 70 43 75 72 2d 3e 73 6b 69  ssert( pCur->ski
2be70 70 4e 65 78 74 3d 3d 30 20 7c 7c 20 70 43 75 72  pNext==0 || pCur
2be80 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52  ->eState!=CURSOR
2be90 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65  _VALID );.  asse
2bea0 72 74 28 20 28 70 43 75 72 2d 3e 63 75 72 46 6c  rt( (pCur->curFl
2beb0 61 67 73 20 26 20 28 42 54 43 46 5f 41 74 4c 61  ags & (BTCF_AtLa
2bec0 73 74 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66  st|BTCF_ValidOvf
2bed0 6c 7c 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79  l|BTCF_ValidNKey
2bee0 29 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ))==0 );.  asser
2bef0 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53  t( pCur->info.nS
2bf00 69 7a 65 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  ize==0 );.  if( 
2bf10 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55  pCur->eState!=CU
2bf20 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20  RSOR_VALID ){.  
2bf30 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75    rc = restoreCu
2bf40 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75  rsorPosition(pCu
2bf50 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  r);.    if( rc!=
2bf60 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2bf70 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
2bf80 20 20 7d 0a 20 20 20 20 69 66 28 20 43 55 52 53    }.    if( CURS
2bf90 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72  OR_INVALID==pCur
2bfa0 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20  ->eState ){.    
2bfb0 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20    *pRes = 1;.   
2bfc0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2bfd0 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  _OK;.    }.    i
2bfe0 66 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78  f( pCur->skipNex
2bff0 74 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  t ){.      asser
2c000 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
2c010 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c  =CURSOR_VALID ||
2c020 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
2c030 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54 20 29  URSOR_SKIPNEXT )
2c040 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53  ;.      pCur->eS
2c050 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 56 41  tate = CURSOR_VA
2c060 4c 49 44 3b 0a 20 20 20 20 20 20 69 66 28 20 70  LID;.      if( p
2c070 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3c 30 20  Cur->skipNext<0 
2c080 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d  ){.        pCur-
2c090 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a 20  >skipNext = 0;. 
2c0a0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
2c0b0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d  LITE_OK;.      }
2c0c0 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 73 6b 69  .      pCur->ski
2c0d0 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 7d  pNext = 0;.    }
2c0e0 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 20 3d 20  .  }..  pPage = 
2c0f0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
2c100 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 61 73 73  r->iPage];.  ass
2c110 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e  ert( pPage->isIn
2c120 69 74 20 29 3b 0a 20 20 69 66 28 20 21 70 50 61  it );.  if( !pPa
2c130 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
2c140 69 6e 74 20 69 64 78 20 3d 20 70 43 75 72 2d 3e  int idx = pCur->
2c150 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
2c160 65 5d 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76  e];.    rc = mov
2c170 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 67  eToChild(pCur, g
2c180 65 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c  et4byte(findCell
2c190 28 70 50 61 67 65 2c 20 69 64 78 29 29 29 3b 0a  (pPage, idx)));.
2c1a0 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
2c1b0 75 72 6e 20 72 63 3b 0a 20 20 20 20 72 63 20 3d  urn rc;.    rc =
2c1c0 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74   moveToRightmost
2c1d0 28 70 43 75 72 29 3b 0a 20 20 7d 65 6c 73 65 7b  (pCur);.  }else{
2c1e0 0a 20 20 20 20 77 68 69 6c 65 28 20 70 43 75 72  .    while( pCur
2c1f0 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
2c200 61 67 65 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20  age]==0 ){.     
2c210 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65   if( pCur->iPage
2c220 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ==0 ){.        p
2c230 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
2c240 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20  RSOR_INVALID;.  
2c250 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b        *pRes = 1;
2c260 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
2c270 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
2c280 20 7d 0a 20 20 20 20 20 20 6d 6f 76 65 54 6f 50   }.      moveToP
2c290 61 72 65 6e 74 28 70 43 75 72 29 3b 0a 20 20 20  arent(pCur);.   
2c2a0 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70   }.    assert( p
2c2b0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d  Cur->info.nSize=
2c2c0 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
2c2d0 28 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67  ( (pCur->curFlag
2c2e0 73 20 26 20 28 42 54 43 46 5f 56 61 6c 69 64 4e  s & (BTCF_ValidN
2c2f0 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76  Key|BTCF_ValidOv
2c300 66 6c 29 29 3d 3d 30 20 29 3b 0a 0a 20 20 20 20  fl))==0 );..    
2c310 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
2c320 2d 3e 69 50 61 67 65 5d 2d 2d 3b 0a 20 20 20 20  ->iPage]--;.    
2c330 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70  pPage = pCur->ap
2c340 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
2c350 5d 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  ];.    if( pPage
2c360 2d 3e 69 6e 74 4b 65 79 20 26 26 20 21 70 50 61  ->intKey && !pPa
2c370 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
2c380 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
2c390 72 65 65 50 72 65 76 69 6f 75 73 28 70 43 75 72  reePrevious(pCur
2c3a0 2c 20 70 52 65 73 29 3b 0a 20 20 20 20 7d 65 6c  , pRes);.    }el
2c3b0 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  se{.      rc = S
2c3c0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
2c3d0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
2c3e0 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  .}.int sqlite3Bt
2c3f0 72 65 65 50 72 65 76 69 6f 75 73 28 42 74 43 75  reePrevious(BtCu
2c400 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20  rsor *pCur, int 
2c410 2a 70 52 65 73 29 7b 0a 20 20 61 73 73 65 72 74  *pRes){.  assert
2c420 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
2c430 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ex(pCur) );.  as
2c440 73 65 72 74 28 20 70 52 65 73 21 3d 30 20 29 3b  sert( pRes!=0 );
2c450 0a 20 20 61 73 73 65 72 74 28 20 2a 70 52 65 73  .  assert( *pRes
2c460 3d 3d 30 20 7c 7c 20 2a 70 52 65 73 3d 3d 31 20  ==0 || *pRes==1 
2c470 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
2c480 72 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d 30 20 7c  r->skipNext==0 |
2c490 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d  | pCur->eState!=
2c4a0 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
2c4b0 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 70    *pRes = 0;.  p
2c4c0 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d  Cur->curFlags &=
2c4d0 20 7e 28 42 54 43 46 5f 41 74 4c 61 73 74 7c 42   ~(BTCF_AtLast|B
2c4e0 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 7c 42 54  TCF_ValidOvfl|BT
2c4f0 43 46 5f 56 61 6c 69 64 4e 4b 65 79 29 3b 0a 20  CF_ValidNKey);. 
2c500 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
2c510 65 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 43 75  e = 0;.  if( pCu
2c520 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f  r->eState!=CURSO
2c530 52 5f 56 41 4c 49 44 0a 20 20 20 7c 7c 20 70 43  R_VALID.   || pC
2c540 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
2c550 69 50 61 67 65 5d 3d 3d 30 0a 20 20 20 7c 7c 20  iPage]==0.   || 
2c560 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
2c570 72 2d 3e 69 50 61 67 65 5d 2d 3e 6c 65 61 66 3d  r->iPage]->leaf=
2c580 3d 30 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75  =0.  ){.    retu
2c590 72 6e 20 62 74 72 65 65 50 72 65 76 69 6f 75 73  rn btreePrevious
2c5a0 28 70 43 75 72 2c 20 70 52 65 73 29 3b 0a 20 20  (pCur, pRes);.  
2c5b0 7d 0a 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  }.  pCur->aiIdx[
2c5c0 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 2d 3b 0a  pCur->iPage]--;.
2c5d0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2c5e0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c  OK;.}../*.** All
2c5f0 6f 63 61 74 65 20 61 20 6e 65 77 20 70 61 67 65  ocate a new page
2c600 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
2c610 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54  se file..**.** T
2c620 68 65 20 6e 65 77 20 70 61 67 65 20 69 73 20 6d  he new page is m
2c630 61 72 6b 65 64 20 61 73 20 64 69 72 74 79 2e 20  arked as dirty. 
2c640 20 28 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73   (In other words
2c650 2c 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  , sqlite3PagerWr
2c660 69 74 65 28 29 0a 2a 2a 20 68 61 73 20 61 6c 72  ite().** has alr
2c670 65 61 64 79 20 62 65 65 6e 20 63 61 6c 6c 65 64  eady been called
2c680 20 6f 6e 20 74 68 65 20 6e 65 77 20 70 61 67 65   on the new page
2c690 2e 29 20 20 54 68 65 20 6e 65 77 20 70 61 67 65  .)  The new page
2c6a0 20 68 61 73 20 61 6c 73 6f 0a 2a 2a 20 62 65 65   has also.** bee
2c6b0 6e 20 72 65 66 65 72 65 6e 63 65 64 20 61 6e 64  n referenced and
2c6c0 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 72 6f 75   the calling rou
2c6d0 74 69 6e 65 20 69 73 20 72 65 73 70 6f 6e 73 69  tine is responsi
2c6e0 62 6c 65 20 66 6f 72 20 63 61 6c 6c 69 6e 67 0a  ble for calling.
2c6f0 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 55  ** sqlite3PagerU
2c700 6e 72 65 66 28 29 20 6f 6e 20 74 68 65 20 6e 65  nref() on the ne
2c710 77 20 70 61 67 65 20 77 68 65 6e 20 69 74 20 69  w page when it i
2c720 73 20 64 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 53 51  s done..**.** SQ
2c730 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
2c740 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73 2e 20  ned on success. 
2c750 20 41 6e 79 20 6f 74 68 65 72 20 72 65 74 75 72   Any other retur
2c760 6e 20 76 61 6c 75 65 20 69 6e 64 69 63 61 74 65  n value indicate
2c770 73 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 2e 20 20  s.** an error.  
2c780 2a 70 70 50 61 67 65 20 61 6e 64 20 2a 70 50 67  *ppPage and *pPg
2c790 6e 6f 20 61 72 65 20 75 6e 64 65 66 69 6e 65 64  no are undefined
2c7a0 20 69 6e 20 74 68 65 20 65 76 65 6e 74 20 6f 66   in the event of
2c7b0 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a 20 44 6f   an error..** Do
2c7c0 20 6e 6f 74 20 69 6e 76 6f 6b 65 20 73 71 6c 69   not invoke sqli
2c7d0 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 29 20  te3PagerUnref() 
2c7e0 6f 6e 20 2a 70 70 50 61 67 65 20 69 66 20 61 6e  on *ppPage if an
2c7f0 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e   error is return
2c800 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ed..**.** If the
2c810 20 22 6e 65 61 72 62 79 22 20 70 61 72 61 6d 65   "nearby" parame
2c820 74 65 72 20 69 73 20 6e 6f 74 20 30 2c 20 74 68  ter is not 0, th
2c830 65 6e 20 61 6e 20 65 66 66 6f 72 74 20 69 73 20  en an effort is 
2c840 6d 61 64 65 20 74 6f 20 0a 2a 2a 20 6c 6f 63 61  made to .** loca
2c850 74 65 20 61 20 70 61 67 65 20 63 6c 6f 73 65 20  te a page close 
2c860 74 6f 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  to the page numb
2c870 65 72 20 22 6e 65 61 72 62 79 22 2e 20 20 54 68  er "nearby".  Th
2c880 69 73 20 63 61 6e 20 62 65 20 75 73 65 64 20 69  is can be used i
2c890 6e 20 61 6e 0a 2a 2a 20 61 74 74 65 6d 70 74 20  n an.** attempt 
2c8a0 74 6f 20 6b 65 65 70 20 72 65 6c 61 74 65 64 20  to keep related 
2c8b0 70 61 67 65 73 20 63 6c 6f 73 65 20 74 6f 20 65  pages close to e
2c8c0 61 63 68 20 6f 74 68 65 72 20 69 6e 20 74 68 65  ach other in the
2c8d0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 0a   database file,.
2c8e0 2a 2a 20 77 68 69 63 68 20 69 6e 20 74 75 72 6e  ** which in turn
2c8f0 20 63 61 6e 20 6d 61 6b 65 20 64 61 74 61 62 61   can make databa
2c900 73 65 20 61 63 63 65 73 73 20 66 61 73 74 65 72  se access faster
2c910 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65  ..**.** If the e
2c920 4d 6f 64 65 20 70 61 72 61 6d 65 74 65 72 20 69  Mode parameter i
2c930 73 20 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20  s BTALLOC_EXACT 
2c940 61 6e 64 20 74 68 65 20 6e 65 61 72 62 79 20 70  and the nearby p
2c950 61 67 65 20 65 78 69 73 74 73 0a 2a 2a 20 61 6e  age exists.** an
2c960 79 77 68 65 72 65 20 6f 6e 20 74 68 65 20 66 72  ywhere on the fr
2c970 65 65 2d 6c 69 73 74 2c 20 74 68 65 6e 20 69 74  ee-list, then it
2c980 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
2c990 6f 20 62 65 20 72 65 74 75 72 6e 65 64 2e 20 20  o be returned.  
2c9a0 49 66 0a 2a 2a 20 65 4d 6f 64 65 20 69 73 20 42  If.** eMode is B
2c9b0 54 41 4c 4c 4f 43 5f 4c 54 20 74 68 65 6e 20 74  TALLOC_LT then t
2c9c0 68 65 20 70 61 67 65 20 72 65 74 75 72 6e 65 64  he page returned
2c9d0 20 77 69 6c 6c 20 62 65 20 6c 65 73 73 20 74 68   will be less th
2c9e0 61 6e 20 6f 72 20 65 71 75 61 6c 0a 2a 2a 20 74  an or equal.** t
2c9f0 6f 20 6e 65 61 72 62 79 20 69 66 20 61 6e 79 20  o nearby if any 
2ca00 73 75 63 68 20 70 61 67 65 20 65 78 69 73 74 73  such page exists
2ca10 2e 20 20 49 66 20 65 4d 6f 64 65 20 69 73 20 42  .  If eMode is B
2ca20 54 41 4c 4c 4f 43 5f 41 4e 59 20 74 68 65 6e 20  TALLOC_ANY then 
2ca30 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20  there.** are no 
2ca40 72 65 73 74 72 69 63 74 69 6f 6e 73 20 6f 6e 20  restrictions on 
2ca50 77 68 69 63 68 20 70 61 67 65 20 69 73 20 72 65  which page is re
2ca60 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
2ca70 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 42 74  c int allocateBt
2ca80 72 65 65 50 61 67 65 28 0a 20 20 42 74 53 68 61  reePage(.  BtSha
2ca90 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20  red *pBt,       
2caa0 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a    /* The btree *
2cab0 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70  /.  MemPage **pp
2cac0 50 61 67 65 2c 20 20 20 20 20 20 2f 2a 20 53 74  Page,      /* St
2cad0 6f 72 65 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  ore pointer to t
2cae0 68 65 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67  he allocated pag
2caf0 65 20 68 65 72 65 20 2a 2f 0a 20 20 50 67 6e 6f  e here */.  Pgno
2cb00 20 2a 70 50 67 6e 6f 2c 20 20 20 20 20 20 20 20   *pPgno,        
2cb10 20 20 20 2f 2a 20 53 74 6f 72 65 20 74 68 65 20     /* Store the 
2cb20 70 61 67 65 20 6e 75 6d 62 65 72 20 68 65 72 65  page number here
2cb30 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 65 61 72 62   */.  Pgno nearb
2cb40 79 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  y,           /* 
2cb50 53 65 61 72 63 68 20 66 6f 72 20 61 20 70 61 67  Search for a pag
2cb60 65 20 6e 65 61 72 20 74 68 69 73 20 6f 6e 65 20  e near this one 
2cb70 2a 2f 0a 20 20 75 38 20 65 4d 6f 64 65 20 20 20  */.  u8 eMode   
2cb80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
2cb90 54 41 4c 4c 4f 43 5f 45 58 41 43 54 2c 20 42 54  TALLOC_EXACT, BT
2cba0 41 4c 4c 4f 43 5f 4c 54 2c 20 6f 72 20 42 54 41  ALLOC_LT, or BTA
2cbb0 4c 4c 4f 43 5f 41 4e 59 20 2a 2f 0a 29 7b 0a 20  LLOC_ANY */.){. 
2cbc0 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31   MemPage *pPage1
2cbd0 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 33  ;.  int rc;.  u3
2cbe0 32 20 6e 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62  2 n;     /* Numb
2cbf0 65 72 20 6f 66 20 70 61 67 65 73 20 6f 6e 20 74  er of pages on t
2cc00 68 65 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20  he freelist */. 
2cc10 20 75 33 32 20 6b 3b 20 20 20 20 20 2f 2a 20 4e   u32 k;     /* N
2cc20 75 6d 62 65 72 20 6f 66 20 6c 65 61 76 65 73 20  umber of leaves 
2cc30 6f 6e 20 74 68 65 20 74 72 75 6e 6b 20 6f 66 20  on the trunk of 
2cc40 74 68 65 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a  the freelist */.
2cc50 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 72 75 6e    MemPage *pTrun
2cc60 6b 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65  k = 0;.  MemPage
2cc70 20 2a 70 50 72 65 76 54 72 75 6e 6b 20 3d 20 30   *pPrevTrunk = 0
2cc80 3b 0a 20 20 50 67 6e 6f 20 6d 78 50 61 67 65 3b  ;.  Pgno mxPage;
2cc90 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69       /* Total si
2cca0 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
2ccb0 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 61 73  se file */..  as
2ccc0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
2ccd0 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
2cce0 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
2ccf0 28 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43  ( eMode==BTALLOC
2cd00 5f 41 4e 59 20 7c 7c 20 28 6e 65 61 72 62 79 3e  _ANY || (nearby>
2cd10 30 20 26 26 20 49 66 4e 6f 74 4f 6d 69 74 41 56  0 && IfNotOmitAV
2cd20 28 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d  (pBt->autoVacuum
2cd30 29 29 20 29 3b 0a 20 20 70 50 61 67 65 31 20 3d  )) );.  pPage1 =
2cd40 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20   pBt->pPage1;.  
2cd50 6d 78 50 61 67 65 20 3d 20 62 74 72 65 65 50 61  mxPage = btreePa
2cd60 67 65 63 6f 75 6e 74 28 70 42 74 29 3b 0a 20 20  gecount(pBt);.  
2cd70 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
2cd80 52 2d 30 35 31 31 39 2d 30 32 36 33 37 20 54 68  R-05119-02637 Th
2cd90 65 20 34 2d 62 79 74 65 20 62 69 67 2d 65 6e 64  e 4-byte big-end
2cda0 69 61 6e 20 69 6e 74 65 67 65 72 20 61 74 20 6f  ian integer at o
2cdb0 66 66 73 65 74 20 33 36 0a 20 20 2a 2a 20 73 74  ffset 36.  ** st
2cdc0 6f 72 65 73 20 73 74 6f 72 65 73 20 74 68 65 20  ores stores the 
2cdd0 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  total number of 
2cde0 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65  pages on the fre
2cdf0 65 6c 69 73 74 2e 20 2a 2f 0a 20 20 6e 20 3d 20  elist. */.  n = 
2ce00 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 31  get4byte(&pPage1
2ce10 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20  ->aData[36]);.  
2ce20 74 65 73 74 63 61 73 65 28 20 6e 3d 3d 6d 78 50  testcase( n==mxP
2ce30 61 67 65 2d 31 20 29 3b 0a 20 20 69 66 28 20 6e  age-1 );.  if( n
2ce40 3e 3d 6d 78 50 61 67 65 20 29 7b 0a 20 20 20 20  >=mxPage ){.    
2ce50 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
2ce60 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
2ce70 20 20 69 66 28 20 6e 3e 30 20 29 7b 0a 20 20 20    if( n>0 ){.   
2ce80 20 2f 2a 20 54 68 65 72 65 20 61 72 65 20 70 61   /* There are pa
2ce90 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c  ges on the freel
2cea0 69 73 74 2e 20 20 52 65 75 73 65 20 6f 6e 65 20  ist.  Reuse one 
2ceb0 6f 66 20 74 68 6f 73 65 20 70 61 67 65 73 2e 20  of those pages. 
2cec0 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 69 54 72 75  */.    Pgno iTru
2ced0 6e 6b 3b 0a 20 20 20 20 75 38 20 73 65 61 72 63  nk;.    u8 searc
2cee0 68 4c 69 73 74 20 3d 20 30 3b 20 2f 2a 20 49 66  hList = 0; /* If
2cef0 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 6d   the free-list m
2cf00 75 73 74 20 62 65 20 73 65 61 72 63 68 65 64 20  ust be searched 
2cf10 66 6f 72 20 27 6e 65 61 72 62 79 27 20 2a 2f 0a  for 'nearby' */.
2cf20 20 20 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 65      .    /* If e
2cf30 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 45 58  Mode==BTALLOC_EX
2cf40 41 43 54 20 61 6e 64 20 61 20 71 75 65 72 79 20  ACT and a query 
2cf50 6f 66 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d  of the pointer-m
2cf60 61 70 0a 20 20 20 20 2a 2a 20 73 68 6f 77 73 20  ap.    ** shows 
2cf70 74 68 61 74 20 74 68 65 20 70 61 67 65 20 27 6e  that the page 'n
2cf80 65 61 72 62 79 27 20 69 73 20 73 6f 6d 65 77 68  earby' is somewh
2cf90 65 72 65 20 6f 6e 20 74 68 65 20 66 72 65 65 2d  ere on the free-
2cfa0 6c 69 73 74 2c 20 74 68 65 6e 0a 20 20 20 20 2a  list, then.    *
2cfb0 2a 20 74 68 65 20 65 6e 74 69 72 65 2d 6c 69 73  * the entire-lis
2cfc0 74 20 77 69 6c 6c 20 62 65 20 73 65 61 72 63 68  t will be search
2cfd0 65 64 20 66 6f 72 20 74 68 61 74 20 70 61 67 65  ed for that page
2cfe0 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65 66  ..    */.#ifndef
2cff0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
2d000 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20  OVACUUM.    if( 
2d010 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 45  eMode==BTALLOC_E
2d020 58 41 43 54 20 29 7b 0a 20 20 20 20 20 20 69 66  XACT ){.      if
2d030 28 20 6e 65 61 72 62 79 3c 3d 6d 78 50 61 67 65  ( nearby<=mxPage
2d040 20 29 7b 0a 20 20 20 20 20 20 20 20 75 38 20 65   ){.        u8 e
2d050 54 79 70 65 3b 0a 20 20 20 20 20 20 20 20 61 73  Type;.        as
2d060 73 65 72 74 28 20 6e 65 61 72 62 79 3e 30 20 29  sert( nearby>0 )
2d070 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
2d080 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
2d090 6d 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  m );.        rc 
2d0a0 3d 20 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c  = ptrmapGet(pBt,
2d0b0 20 6e 65 61 72 62 79 2c 20 26 65 54 79 70 65 2c   nearby, &eType,
2d0c0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   0);.        if(
2d0d0 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
2d0e0 0a 20 20 20 20 20 20 20 20 69 66 28 20 65 54 79  .        if( eTy
2d0f0 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45 50  pe==PTRMAP_FREEP
2d100 41 47 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20  AGE ){.         
2d110 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20 31 3b   searchList = 1;
2d120 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2d130 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28   }.    }else if(
2d140 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f   eMode==BTALLOC_
2d150 4c 45 20 29 7b 0a 20 20 20 20 20 20 73 65 61 72  LE ){.      sear
2d160 63 68 4c 69 73 74 20 3d 20 31 3b 0a 20 20 20 20  chList = 1;.    
2d170 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a  }.#endif..    /*
2d180 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20 66   Decrement the f
2d190 72 65 65 2d 6c 69 73 74 20 63 6f 75 6e 74 20 62  ree-list count b
2d1a0 79 20 31 2e 20 53 65 74 20 69 54 72 75 6e 6b 20  y 1. Set iTrunk 
2d1b0 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  to the index of 
2d1c0 74 68 65 0a 20 20 20 20 2a 2a 20 66 69 72 73 74  the.    ** first
2d1d0 20 66 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b   free-list trunk
2d1e0 20 70 61 67 65 2e 20 69 50 72 65 76 54 72 75 6e   page. iPrevTrun
2d1f0 6b 20 69 73 20 69 6e 69 74 69 61 6c 6c 79 20 31  k is initially 1
2d200 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  ..    */.    rc 
2d210 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
2d220 69 74 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50  ite(pPage1->pDbP
2d230 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
2d240 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
2d250 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67    put4byte(&pPag
2d260 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20 6e  e1->aData[36], n
2d270 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65  -1);..    /* The
2d280 20 63 6f 64 65 20 77 69 74 68 69 6e 20 74 68 69   code within thi
2d290 73 20 6c 6f 6f 70 20 69 73 20 72 75 6e 20 6f 6e  s loop is run on
2d2a0 6c 79 20 6f 6e 63 65 20 69 66 20 74 68 65 20 27  ly once if the '
2d2b0 73 65 61 72 63 68 4c 69 73 74 27 20 76 61 72 69  searchList' vari
2d2c0 61 62 6c 65 0a 20 20 20 20 2a 2a 20 69 73 20 6e  able.    ** is n
2d2d0 6f 74 20 74 72 75 65 2e 20 4f 74 68 65 72 77 69  ot true. Otherwi
2d2e0 73 65 2c 20 69 74 20 72 75 6e 73 20 6f 6e 63 65  se, it runs once
2d2f0 20 66 6f 72 20 65 61 63 68 20 74 72 75 6e 6b 2d   for each trunk-
2d300 70 61 67 65 20 6f 6e 20 74 68 65 0a 20 20 20 20  page on the.    
2d310 2a 2a 20 66 72 65 65 2d 6c 69 73 74 20 75 6e 74  ** free-list unt
2d320 69 6c 20 74 68 65 20 70 61 67 65 20 27 6e 65 61  il the page 'nea
2d330 72 62 79 27 20 69 73 20 6c 6f 63 61 74 65 64 20  rby' is located 
2d340 28 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f  (eMode==BTALLOC_
2d350 45 58 41 43 54 29 0a 20 20 20 20 2a 2a 20 6f 72  EXACT).    ** or
2d360 20 75 6e 74 69 6c 20 61 20 70 61 67 65 20 6c 65   until a page le
2d370 73 73 20 74 68 61 6e 20 27 6e 65 61 72 62 79 27  ss than 'nearby'
2d380 20 69 73 20 6c 6f 63 61 74 65 64 20 28 65 4d 6f   is located (eMo
2d390 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 54 29 0a  de==BTALLOC_LT).
2d3a0 20 20 20 20 2a 2f 0a 20 20 20 20 64 6f 20 7b 0a      */.    do {.
2d3b0 20 20 20 20 20 20 70 50 72 65 76 54 72 75 6e 6b        pPrevTrunk
2d3c0 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20   = pTrunk;.     
2d3d0 20 69 66 28 20 70 50 72 65 76 54 72 75 6e 6b 20   if( pPrevTrunk 
2d3e0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 56  ){.        /* EV
2d3f0 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 31 35  IDENCE-OF: R-015
2d400 30 36 2d 31 31 30 35 33 20 54 68 65 20 66 69 72  06-11053 The fir
2d410 73 74 20 69 6e 74 65 67 65 72 20 6f 6e 20 61 20  st integer on a 
2d420 66 72 65 65 6c 69 73 74 20 74 72 75 6e 6b 20 70  freelist trunk p
2d430 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  age.        ** i
2d440 73 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  s the page numbe
2d450 72 20 6f 66 20 74 68 65 20 6e 65 78 74 20 66 72  r of the next fr
2d460 65 65 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67  eelist trunk pag
2d470 65 20 69 6e 20 74 68 65 20 6c 69 73 74 20 6f 72  e in the list or
2d480 0a 20 20 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f  .        ** zero
2d490 20 69 66 20 74 68 69 73 20 69 73 20 74 68 65 20   if this is the 
2d4a0 6c 61 73 74 20 66 72 65 65 6c 69 73 74 20 74 72  last freelist tr
2d4b0 75 6e 6b 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20  unk page. */.   
2d4c0 20 20 20 20 20 69 54 72 75 6e 6b 20 3d 20 67 65       iTrunk = ge
2d4d0 74 34 62 79 74 65 28 26 70 50 72 65 76 54 72 75  t4byte(&pPrevTru
2d4e0 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 29 3b 0a 20  nk->aData[0]);. 
2d4f0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2d500 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
2d510 4f 46 3a 20 52 2d 35 39 38 34 31 2d 31 33 37 39  OF: R-59841-1379
2d520 38 20 54 68 65 20 34 2d 62 79 74 65 20 62 69 67  8 The 4-byte big
2d530 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20  -endian integer 
2d540 61 74 20 6f 66 66 73 65 74 20 33 32 0a 20 20 20  at offset 32.   
2d550 20 20 20 20 20 2a 2a 20 73 74 6f 72 65 73 20 74       ** stores t
2d560 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  he page number o
2d570 66 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65  f the first page
2d580 20 6f 66 20 74 68 65 20 66 72 65 65 6c 69 73 74   of the freelist
2d590 2c 20 6f 72 20 7a 65 72 6f 20 69 66 0a 20 20 20  , or zero if.   
2d5a0 20 20 20 20 20 2a 2a 20 74 68 65 20 66 72 65 65       ** the free
2d5b0 6c 69 73 74 20 69 73 20 65 6d 70 74 79 2e 20 2a  list is empty. *
2d5c0 2f 0a 20 20 20 20 20 20 20 20 69 54 72 75 6e 6b  /.        iTrunk
2d5d0 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61   = get4byte(&pPa
2d5e0 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 29 3b  ge1->aData[32]);
2d5f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 74  .      }.      t
2d600 65 73 74 63 61 73 65 28 20 69 54 72 75 6e 6b 3d  estcase( iTrunk=
2d610 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20 20 20 20  =mxPage );.     
2d620 20 69 66 28 20 69 54 72 75 6e 6b 3e 6d 78 50 61   if( iTrunk>mxPa
2d630 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  ge ){.        rc
2d640 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
2d650 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d 65  T_BKPT;.      }e
2d660 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20  lse{.        rc 
2d670 3d 20 62 74 72 65 65 47 65 74 55 6e 75 73 65 64  = btreeGetUnused
2d680 50 61 67 65 28 70 42 74 2c 20 69 54 72 75 6e 6b  Page(pBt, iTrunk
2d690 2c 20 26 70 54 72 75 6e 6b 2c 20 30 29 3b 0a 20  , &pTrunk, 0);. 
2d6a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
2d6b0 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 70   rc ){.        p
2d6c0 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20  Trunk = 0;.     
2d6d0 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f     goto end_allo
2d6e0 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20  cate_page;.     
2d6f0 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   }.      assert(
2d700 20 70 54 72 75 6e 6b 21 3d 30 20 29 3b 0a 20 20   pTrunk!=0 );.  
2d710 20 20 20 20 61 73 73 65 72 74 28 20 70 54 72 75      assert( pTru
2d720 6e 6b 2d 3e 61 44 61 74 61 21 3d 30 20 29 3b 0a  nk->aData!=0 );.
2d730 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43        /* EVIDENC
2d740 45 2d 4f 46 3a 20 52 2d 31 33 35 32 33 2d 30 34  E-OF: R-13523-04
2d750 33 39 34 20 54 68 65 20 73 65 63 6f 6e 64 20 69  394 The second i
2d760 6e 74 65 67 65 72 20 6f 6e 20 61 20 66 72 65 65  nteger on a free
2d770 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 0a  list trunk page.
2d780 20 20 20 20 20 20 2a 2a 20 69 73 20 74 68 65 20        ** is the 
2d790 6e 75 6d 62 65 72 20 6f 66 20 6c 65 61 66 20 70  number of leaf p
2d7a0 61 67 65 20 70 6f 69 6e 74 65 72 73 20 74 6f 20  age pointers to 
2d7b0 66 6f 6c 6c 6f 77 2e 20 2a 2f 0a 20 20 20 20 20  follow. */.     
2d7c0 20 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26 70   k = get4byte(&p
2d7d0 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 29  Trunk->aData[4])
2d7e0 3b 0a 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 30  ;.      if( k==0
2d7f0 20 26 26 20 21 73 65 61 72 63 68 4c 69 73 74 20   && !searchList 
2d800 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ){.        /* Th
2d810 65 20 74 72 75 6e 6b 20 68 61 73 20 6e 6f 20 6c  e trunk has no l
2d820 65 61 76 65 73 20 61 6e 64 20 74 68 65 20 6c 69  eaves and the li
2d830 73 74 20 69 73 20 6e 6f 74 20 62 65 69 6e 67 20  st is not being 
2d840 73 65 61 72 63 68 65 64 2e 20 0a 20 20 20 20 20  searched. .     
2d850 20 20 20 2a 2a 20 53 6f 20 65 78 74 72 61 63 74     ** So extract
2d860 20 74 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20   the trunk page 
2d870 69 74 73 65 6c 66 20 61 6e 64 20 75 73 65 20 69  itself and use i
2d880 74 20 61 73 20 74 68 65 20 6e 65 77 6c 79 20 0a  t as the newly .
2d890 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 6c 6f 63          ** alloc
2d8a0 61 74 65 64 20 70 61 67 65 20 2a 2f 0a 20 20 20  ated page */.   
2d8b0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 72       assert( pPr
2d8c0 65 76 54 72 75 6e 6b 3d 3d 30 20 29 3b 0a 20 20  evTrunk==0 );.  
2d8d0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
2d8e0 65 33 50 61 67 65 72 57 72 69 74 65 28 70 54 72  e3PagerWrite(pTr
2d8f0 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  unk->pDbPage);. 
2d900 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b         if( rc ){
2d910 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
2d920 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67  end_allocate_pag
2d930 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  e;.        }.   
2d940 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 69 54       *pPgno = iT
2d950 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 6d 65  runk;.        me
2d960 6d 63 70 79 28 26 70 50 61 67 65 31 2d 3e 61 44  mcpy(&pPage1->aD
2d970 61 74 61 5b 33 32 5d 2c 20 26 70 54 72 75 6e 6b  ata[32], &pTrunk
2d980 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a  ->aData[0], 4);.
2d990 20 20 20 20 20 20 20 20 2a 70 70 50 61 67 65 20          *ppPage 
2d9a0 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20  = pTrunk;.      
2d9b0 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20    pTrunk = 0;.  
2d9c0 20 20 20 20 20 20 54 52 41 43 45 28 28 22 41 4c        TRACE(("AL
2d9d0 4c 4f 43 41 54 45 3a 20 25 64 20 74 72 75 6e 6b  LOCATE: %d trunk
2d9e0 20 2d 20 25 64 20 66 72 65 65 20 70 61 67 65 73   - %d free pages
2d9f0 20 6c 65 66 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f   left\n", *pPgno
2da00 2c 20 6e 2d 31 29 29 3b 0a 20 20 20 20 20 20 7d  , n-1));.      }
2da10 65 6c 73 65 20 69 66 28 20 6b 3e 28 75 33 32 29  else if( k>(u32)
2da20 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  (pBt->usableSize
2da30 2f 34 20 2d 20 32 29 20 29 7b 0a 20 20 20 20 20  /4 - 2) ){.     
2da40 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20 6b     /* Value of k
2da50 20 69 73 20 6f 75 74 20 6f 66 20 72 61 6e 67 65   is out of range
2da60 2e 20 20 44 61 74 61 62 61 73 65 20 63 6f 72 72  .  Database corr
2da70 75 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20  uption */.      
2da80 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
2da90 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
2daa0 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c      goto end_all
2dab0 6f 63 61 74 65 5f 70 61 67 65 3b 0a 23 69 66 6e  ocate_page;.#ifn
2dac0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2dad0 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20  AUTOVACUUM.     
2dae0 20 7d 65 6c 73 65 20 69 66 28 20 73 65 61 72 63   }else if( searc
2daf0 68 4c 69 73 74 20 0a 20 20 20 20 20 20 20 20 20  hList .         
2db00 20 20 20 26 26 20 28 6e 65 61 72 62 79 3d 3d 69     && (nearby==i
2db10 54 72 75 6e 6b 20 7c 7c 20 28 69 54 72 75 6e 6b  Trunk || (iTrunk
2db20 3c 6e 65 61 72 62 79 20 26 26 20 65 4d 6f 64 65  <nearby && eMode
2db30 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45 29 29 20 0a  ==BTALLOC_LE)) .
2db40 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
2db50 20 2f 2a 20 54 68 65 20 6c 69 73 74 20 69 73 20   /* The list is 
2db60 62 65 69 6e 67 20 73 65 61 72 63 68 65 64 20 61  being searched a
2db70 6e 64 20 74 68 69 73 20 74 72 75 6e 6b 20 70 61  nd this trunk pa
2db80 67 65 20 69 73 20 74 68 65 20 70 61 67 65 0a 20  ge is the page. 
2db90 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 61 6c 6c         ** to all
2dba0 6f 63 61 74 65 2c 20 72 65 67 61 72 64 6c 65 73  ocate, regardles
2dbb0 73 20 6f 66 20 77 68 65 74 68 65 72 20 69 74 20  s of whether it 
2dbc0 68 61 73 20 6c 65 61 76 65 73 2e 0a 20 20 20 20  has leaves..    
2dbd0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 2a      */.        *
2dbe0 70 50 67 6e 6f 20 3d 20 69 54 72 75 6e 6b 3b 0a  pPgno = iTrunk;.
2dbf0 20 20 20 20 20 20 20 20 2a 70 70 50 61 67 65 20          *ppPage 
2dc00 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20  = pTrunk;.      
2dc10 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30    searchList = 0
2dc20 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
2dc30 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
2dc40 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65  (pTrunk->pDbPage
2dc50 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
2dc60 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67  c ){.          g
2dc70 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65  oto end_allocate
2dc80 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 7d  _page;.        }
2dc90 0a 20 20 20 20 20 20 20 20 69 66 28 20 6b 3d 3d  .        if( k==
2dca0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  0 ){.          i
2dcb0 66 28 20 21 70 50 72 65 76 54 72 75 6e 6b 20 29  f( !pPrevTrunk )
2dcc0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 65  {.            me
2dcd0 6d 63 70 79 28 26 70 50 61 67 65 31 2d 3e 61 44  mcpy(&pPage1->aD
2dce0 61 74 61 5b 33 32 5d 2c 20 26 70 54 72 75 6e 6b  ata[32], &pTrunk
2dcf0 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a  ->aData[0], 4);.
2dd00 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
2dd10 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
2dd20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
2dd30 69 74 65 28 70 50 72 65 76 54 72 75 6e 6b 2d 3e  ite(pPrevTrunk->
2dd40 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
2dd50 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
2dd60 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2dd70 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
2dd80 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b  d_allocate_page;
2dd90 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
2dda0 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70             memcp
2ddb0 79 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61  y(&pPrevTrunk->a
2ddc0 44 61 74 61 5b 30 5d 2c 20 26 70 54 72 75 6e 6b  Data[0], &pTrunk
2ddd0 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a  ->aData[0], 4);.
2dde0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2ddf0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2de00 20 20 20 20 20 2f 2a 20 54 68 65 20 74 72 75 6e       /* The trun
2de10 6b 20 70 61 67 65 20 69 73 20 72 65 71 75 69 72  k page is requir
2de20 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72  ed by the caller
2de30 20 62 75 74 20 69 74 20 63 6f 6e 74 61 69 6e 73   but it contains
2de40 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70   .          ** p
2de50 6f 69 6e 74 65 72 73 20 74 6f 20 66 72 65 65 2d  ointers to free-
2de60 6c 69 73 74 20 6c 65 61 76 65 73 2e 20 54 68 65  list leaves. The
2de70 20 66 69 72 73 74 20 6c 65 61 66 20 62 65 63 6f   first leaf beco
2de80 6d 65 73 20 61 20 74 72 75 6e 6b 0a 20 20 20 20  mes a trunk.    
2de90 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20 69 6e        ** page in
2dea0 20 74 68 69 73 20 63 61 73 65 2e 0a 20 20 20 20   this case..    
2deb0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
2dec0 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77     MemPage *pNew
2ded0 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 20  Trunk;.         
2dee0 20 50 67 6e 6f 20 69 4e 65 77 54 72 75 6e 6b 20   Pgno iNewTrunk 
2def0 3d 20 67 65 74 34 62 79 74 65 28 26 70 54 72 75  = get4byte(&pTru
2df00 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d 29 3b 0a 20  nk->aData[8]);. 
2df10 20 20 20 20 20 20 20 20 20 69 66 28 20 69 4e 65           if( iNe
2df20 77 54 72 75 6e 6b 3e 6d 78 50 61 67 65 20 29 7b  wTrunk>mxPage ){
2df30 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63   .            rc
2df40 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
2df50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20  T_BKPT;.        
2df60 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c      goto end_all
2df70 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20  ocate_page;.    
2df80 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2df90 20 20 74 65 73 74 63 61 73 65 28 20 69 4e 65 77    testcase( iNew
2dfa0 54 72 75 6e 6b 3d 3d 6d 78 50 61 67 65 20 29 3b  Trunk==mxPage );
2dfb0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
2dfc0 62 74 72 65 65 47 65 74 55 6e 75 73 65 64 50 61  btreeGetUnusedPa
2dfd0 67 65 28 70 42 74 2c 20 69 4e 65 77 54 72 75 6e  ge(pBt, iNewTrun
2dfe0 6b 2c 20 26 70 4e 65 77 54 72 75 6e 6b 2c 20 30  k, &pNewTrunk, 0
2dff0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
2e000 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2e010 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f  {.            go
2e020 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
2e030 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20  page;.          
2e040 7d 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  }.          rc =
2e050 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
2e060 74 65 28 70 4e 65 77 54 72 75 6e 6b 2d 3e 70 44  te(pNewTrunk->pD
2e070 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
2e080 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2e090 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
2e0a0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
2e0b0 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20  NewTrunk);.     
2e0c0 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
2e0d0 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20  allocate_page;. 
2e0e0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2e0f0 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4e 65       memcpy(&pNe
2e100 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d  wTrunk->aData[0]
2e110 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  , &pTrunk->aData
2e120 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20  [0], 4);.       
2e130 20 20 20 70 75 74 34 62 79 74 65 28 26 70 4e 65     put4byte(&pNe
2e140 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d  wTrunk->aData[4]
2e150 2c 20 6b 2d 31 29 3b 0a 20 20 20 20 20 20 20 20  , k-1);.        
2e160 20 20 6d 65 6d 63 70 79 28 26 70 4e 65 77 54 72    memcpy(&pNewTr
2e170 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 26  unk->aData[8], &
2e180 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 31 32  pTrunk->aData[12
2e190 5d 2c 20 28 6b 2d 31 29 2a 34 29 3b 0a 20 20 20  ], (k-1)*4);.   
2e1a0 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
2e1b0 67 65 28 70 4e 65 77 54 72 75 6e 6b 29 3b 0a 20  ge(pNewTrunk);. 
2e1c0 20 20 20 20 20 20 20 20 20 69 66 28 20 21 70 50           if( !pP
2e1d0 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20  revTrunk ){.    
2e1e0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
2e1f0 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
2e200 69 74 65 61 62 6c 65 28 70 50 61 67 65 31 2d 3e  iteable(pPage1->
2e210 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 20 20  pDbPage) );.    
2e220 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
2e230 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
2e240 33 32 5d 2c 20 69 4e 65 77 54 72 75 6e 6b 29 3b  32], iNewTrunk);
2e250 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
2e260 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  {.            rc
2e270 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
2e280 72 69 74 65 28 70 50 72 65 76 54 72 75 6e 6b 2d  rite(pPrevTrunk-
2e290 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
2e2a0 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b         if( rc ){
2e2b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 67  .              g
2e2c0 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65  oto end_allocate
2e2d0 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20  _page;.         
2e2e0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
2e2f0 20 70 75 74 34 62 79 74 65 28 26 70 50 72 65 76   put4byte(&pPrev
2e300 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c  Trunk->aData[0],
2e310 20 69 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20   iNewTrunk);.   
2e320 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2e330 20 7d 0a 20 20 20 20 20 20 20 20 70 54 72 75 6e   }.        pTrun
2e340 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 54  k = 0;.        T
2e350 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a  RACE(("ALLOCATE:
2e360 20 25 64 20 74 72 75 6e 6b 20 2d 20 25 64 20 66   %d trunk - %d f
2e370 72 65 65 20 70 61 67 65 73 20 6c 65 66 74 5c 6e  ree pages left\n
2e380 22 2c 20 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29 29  ", *pPgno, n-1))
2e390 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7d  ;.#endif.      }
2e3a0 65 6c 73 65 20 69 66 28 20 6b 3e 30 20 29 7b 0a  else if( k>0 ){.
2e3b0 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61          /* Extra
2e3c0 63 74 20 61 20 6c 65 61 66 20 66 72 6f 6d 20 74  ct a leaf from t
2e3d0 68 65 20 74 72 75 6e 6b 20 2a 2f 0a 20 20 20 20  he trunk */.    
2e3e0 20 20 20 20 75 33 32 20 63 6c 6f 73 65 73 74 3b      u32 closest;
2e3f0 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69 50  .        Pgno iP
2e400 61 67 65 3b 0a 20 20 20 20 20 20 20 20 75 6e 73  age;.        uns
2e410 69 67 6e 65 64 20 63 68 61 72 20 2a 61 44 61 74  igned char *aDat
2e420 61 20 3d 20 70 54 72 75 6e 6b 2d 3e 61 44 61 74  a = pTrunk->aDat
2e430 61 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e  a;.        if( n
2e440 65 61 72 62 79 3e 30 20 29 7b 0a 20 20 20 20 20  earby>0 ){.     
2e450 20 20 20 20 20 75 33 32 20 69 3b 0a 20 20 20 20       u32 i;.    
2e460 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d 20        closest = 
2e470 30 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  0;.          if(
2e480 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f   eMode==BTALLOC_
2e490 4c 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  LE ){.          
2e4a0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6b 3b 20    for(i=0; i<k; 
2e4b0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
2e4c0 20 20 20 20 69 50 61 67 65 20 3d 20 67 65 74 34      iPage = get4
2e4d0 62 79 74 65 28 26 61 44 61 74 61 5b 38 2b 69 2a  byte(&aData[8+i*
2e4e0 34 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  4]);.           
2e4f0 20 20 20 69 66 28 20 69 50 61 67 65 3c 3d 6e 65     if( iPage<=ne
2e500 61 72 62 79 20 29 7b 0a 20 20 20 20 20 20 20 20  arby ){.        
2e510 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20          closest 
2e520 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = i;.           
2e530 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
2e540 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2e550 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2e560 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2e570 20 20 20 20 20 20 20 69 6e 74 20 64 69 73 74 3b         int dist;
2e580 0a 20 20 20 20 20 20 20 20 20 20 20 20 64 69 73  .            dis
2e590 74 20 3d 20 73 71 6c 69 74 65 33 41 62 73 49 6e  t = sqlite3AbsIn
2e5a0 74 33 32 28 67 65 74 34 62 79 74 65 28 26 61 44  t32(get4byte(&aD
2e5b0 61 74 61 5b 38 5d 29 20 2d 20 6e 65 61 72 62 79  ata[8]) - nearby
2e5c0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66  );.            f
2e5d0 6f 72 28 69 3d 31 3b 20 69 3c 6b 3b 20 69 2b 2b  or(i=1; i<k; i++
2e5e0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
2e5f0 20 69 6e 74 20 64 32 20 3d 20 73 71 6c 69 74 65   int d2 = sqlite
2e600 33 41 62 73 49 6e 74 33 32 28 67 65 74 34 62 79  3AbsInt32(get4by
2e610 74 65 28 26 61 44 61 74 61 5b 38 2b 69 2a 34 5d  te(&aData[8+i*4]
2e620 29 20 2d 20 6e 65 61 72 62 79 29 3b 0a 20 20 20  ) - nearby);.   
2e630 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 64             if( d
2e640 32 3c 64 69 73 74 20 29 7b 0a 20 20 20 20 20 20  2<dist ){.      
2e650 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73            closes
2e660 74 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 20  t = i;.         
2e670 20 20 20 20 20 20 20 64 69 73 74 20 3d 20 64 32         dist = d2
2e680 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
2e690 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  }.            }.
2e6a0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2e6b0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2e6c0 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 30       closest = 0
2e6d0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
2e6e0 20 20 20 20 20 69 50 61 67 65 20 3d 20 67 65 74       iPage = get
2e6f0 34 62 79 74 65 28 26 61 44 61 74 61 5b 38 2b 63  4byte(&aData[8+c
2e700 6c 6f 73 65 73 74 2a 34 5d 29 3b 0a 20 20 20 20  losest*4]);.    
2e710 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 50      testcase( iP
2e720 61 67 65 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20  age==mxPage );. 
2e730 20 20 20 20 20 20 20 69 66 28 20 69 50 61 67 65         if( iPage
2e740 3e 6d 78 50 61 67 65 20 29 7b 0a 20 20 20 20 20  >mxPage ){.     
2e750 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
2e760 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
2e770 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
2e780 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b  d_allocate_page;
2e790 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2e7a0 20 20 20 74 65 73 74 63 61 73 65 28 20 69 50 61     testcase( iPa
2e7b0 67 65 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20  ge==mxPage );.  
2e7c0 20 20 20 20 20 20 69 66 28 20 21 73 65 61 72 63        if( !searc
2e7d0 68 4c 69 73 74 20 0a 20 20 20 20 20 20 20 20 20  hList .         
2e7e0 7c 7c 20 28 69 50 61 67 65 3d 3d 6e 65 61 72 62  || (iPage==nearb
2e7f0 79 20 7c 7c 20 28 69 50 61 67 65 3c 6e 65 61 72  y || (iPage<near
2e800 62 79 20 26 26 20 65 4d 6f 64 65 3d 3d 42 54 41  by && eMode==BTA
2e810 4c 4c 4f 43 5f 4c 45 29 29 20 0a 20 20 20 20 20  LLOC_LE)) .     
2e820 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
2e830 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74 3b 0a 20  int noContent;. 
2e840 20 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f 20           *pPgno 
2e850 3d 20 69 50 61 67 65 3b 0a 20 20 20 20 20 20 20  = iPage;.       
2e860 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43     TRACE(("ALLOC
2e870 41 54 45 3a 20 25 64 20 77 61 73 20 6c 65 61 66  ATE: %d was leaf
2e880 20 25 64 20 6f 66 20 25 64 20 6f 6e 20 74 72 75   %d of %d on tru
2e890 6e 6b 20 25 64 22 0a 20 20 20 20 20 20 20 20 20  nk %d".         
2e8a0 20 20 20 20 20 20 20 20 22 3a 20 25 64 20 6d 6f          ": %d mo
2e8b0 72 65 20 66 72 65 65 20 70 61 67 65 73 5c 6e 22  re free pages\n"
2e8c0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2e8d0 20 20 20 2a 70 50 67 6e 6f 2c 20 63 6c 6f 73 65     *pPgno, close
2e8e0 73 74 2b 31 2c 20 6b 2c 20 70 54 72 75 6e 6b 2d  st+1, k, pTrunk-
2e8f0 3e 70 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20  >pgno, n-1));.  
2e900 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
2e910 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
2e920 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b  Trunk->pDbPage);
2e930 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
2e940 63 20 29 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c  c ) goto end_all
2e950 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20  ocate_page;.    
2e960 20 20 20 20 20 20 69 66 28 20 63 6c 6f 73 65 73        if( closes
2e970 74 3c 6b 2d 31 20 29 7b 0a 20 20 20 20 20 20 20  t<k-1 ){.       
2e980 20 20 20 20 20 6d 65 6d 63 70 79 28 26 61 44 61       memcpy(&aDa
2e990 74 61 5b 38 2b 63 6c 6f 73 65 73 74 2a 34 5d 2c  ta[8+closest*4],
2e9a0 20 26 61 44 61 74 61 5b 34 2b 6b 2a 34 5d 2c 20   &aData[4+k*4], 
2e9b0 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  4);.          }.
2e9c0 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79            put4by
2e9d0 74 65 28 26 61 44 61 74 61 5b 34 5d 2c 20 6b 2d  te(&aData[4], k-
2e9e0 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 6f  1);.          no
2e9f0 43 6f 6e 74 65 6e 74 20 3d 20 21 62 74 72 65 65  Content = !btree
2ea00 47 65 74 48 61 73 43 6f 6e 74 65 6e 74 28 70 42  GetHasContent(pB
2ea10 74 2c 20 2a 70 50 67 6e 6f 29 3f 20 50 41 47 45  t, *pPgno)? PAGE
2ea20 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20  R_GET_NOCONTENT 
2ea30 3a 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 72  : 0;.          r
2ea40 63 20 3d 20 62 74 72 65 65 47 65 74 55 6e 75 73  c = btreeGetUnus
2ea50 65 64 50 61 67 65 28 70 42 74 2c 20 2a 70 50 67  edPage(pBt, *pPg
2ea60 6e 6f 2c 20 70 70 50 61 67 65 2c 20 6e 6f 43 6f  no, ppPage, noCo
2ea70 6e 74 65 6e 74 29 3b 0a 20 20 20 20 20 20 20 20  ntent);.        
2ea80 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2ea90 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
2eaa0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
2eab0 61 67 65 72 57 72 69 74 65 28 28 2a 70 70 50 61  agerWrite((*ppPa
2eac0 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  ge)->pDbPage);. 
2ead0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72             if( r
2eae0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2eaf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
2eb00 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50 61 67  leasePage(*ppPag
2eb10 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
2eb20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  }.          }.  
2eb30 20 20 20 20 20 20 20 20 73 65 61 72 63 68 4c 69          searchLi
2eb40 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  st = 0;.        
2eb50 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
2eb60 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 72 65  releasePage(pPre
2eb70 76 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 70  vTrunk);.      p
2eb80 50 72 65 76 54 72 75 6e 6b 20 3d 20 30 3b 0a 20  PrevTrunk = 0;. 
2eb90 20 20 20 7d 77 68 69 6c 65 28 20 73 65 61 72 63     }while( searc
2eba0 68 4c 69 73 74 20 29 3b 0a 20 20 7d 65 6c 73 65  hList );.  }else
2ebb0 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72 65 20 61  {.    /* There a
2ebc0 72 65 20 6e 6f 20 70 61 67 65 73 20 6f 6e 20 74  re no pages on t
2ebd0 68 65 20 66 72 65 65 6c 69 73 74 2c 20 73 6f 20  he freelist, so 
2ebe0 61 70 70 65 6e 64 20 61 20 6e 65 77 20 70 61 67  append a new pag
2ebf0 65 20 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20  e to the.    ** 
2ec00 64 61 74 61 62 61 73 65 20 69 6d 61 67 65 2e 0a  database image..
2ec10 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f      **.    ** No
2ec20 72 6d 61 6c 6c 79 2c 20 6e 65 77 20 70 61 67 65  rmally, new page
2ec30 73 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 74  s allocated by t
2ec40 68 69 73 20 62 6c 6f 63 6b 20 63 61 6e 20 62 65  his block can be
2ec50 20 72 65 71 75 65 73 74 65 64 20 66 72 6f 6d 20   requested from 
2ec60 74 68 65 0a 20 20 20 20 2a 2a 20 70 61 67 65 72  the.    ** pager
2ec70 20 6c 61 79 65 72 20 77 69 74 68 20 74 68 65 20   layer with the 
2ec80 27 6e 6f 2d 63 6f 6e 74 65 6e 74 27 20 66 6c 61  'no-content' fla
2ec90 67 20 73 65 74 2e 20 54 68 69 73 20 70 72 65 76  g set. This prev
2eca0 65 6e 74 73 20 74 68 65 20 70 61 67 65 72 0a 20  ents the pager. 
2ecb0 20 20 20 2a 2a 20 66 72 6f 6d 20 74 72 79 69 6e     ** from tryin
2ecc0 67 20 74 6f 20 72 65 61 64 20 74 68 65 20 70 61  g to read the pa
2ecd0 67 65 73 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d  ges content from
2ece0 20 64 69 73 6b 2e 20 48 6f 77 65 76 65 72 2c 20   disk. However, 
2ecf0 69 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 75  if the.    ** cu
2ed00 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  rrent transactio
2ed10 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20 72 75  n has already ru
2ed20 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 69 6e  n one or more in
2ed30 63 72 65 6d 65 6e 74 61 6c 2d 76 61 63 75 75 6d  cremental-vacuum
2ed40 0a 20 20 20 20 2a 2a 20 73 74 65 70 73 2c 20 74  .    ** steps, t
2ed50 68 65 6e 20 74 68 65 20 70 61 67 65 20 77 65 20  hen the page we 
2ed60 61 72 65 20 61 62 6f 75 74 20 74 6f 20 61 6c 6c  are about to all
2ed70 6f 63 61 74 65 20 6d 61 79 20 63 6f 6e 74 61 69  ocate may contai
2ed80 6e 20 63 6f 6e 74 65 6e 74 0a 20 20 20 20 2a 2a  n content.    **
2ed90 20 74 68 61 74 20 69 73 20 72 65 71 75 69 72 65   that is require
2eda0 64 20 69 6e 20 74 68 65 20 65 76 65 6e 74 20 6f  d in the event o
2edb0 66 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 20 49 6e  f a rollback. In
2edc0 20 74 68 69 73 20 63 61 73 65 2c 20 64 6f 0a 20   this case, do. 
2edd0 20 20 20 2a 2a 20 6e 6f 74 20 73 65 74 20 74 68     ** not set th
2ede0 65 20 6e 6f 2d 63 6f 6e 74 65 6e 74 20 66 6c 61  e no-content fla
2edf0 67 2e 20 54 68 69 73 20 63 61 75 73 65 73 20 74  g. This causes t
2ee00 68 65 20 70 61 67 65 72 20 74 6f 20 6c 6f 61 64  he pager to load
2ee10 20 61 6e 64 20 6a 6f 75 72 6e 61 6c 0a 20 20 20   and journal.   
2ee20 20 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20   ** the current 
2ee30 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 62 65 66  page content bef
2ee40 6f 72 65 20 6f 76 65 72 77 72 69 74 69 6e 67 20  ore overwriting 
2ee50 69 74 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  it..    **.    *
2ee60 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20  * Note that the 
2ee70 70 61 67 65 72 20 77 69 6c 6c 20 6e 6f 74 20 61  pager will not a
2ee80 63 74 75 61 6c 6c 79 20 61 74 74 65 6d 70 74 20  ctually attempt 
2ee90 74 6f 20 6c 6f 61 64 20 6f 72 20 6a 6f 75 72 6e  to load or journ
2eea0 61 6c 20 0a 20 20 20 20 2a 2a 20 63 6f 6e 74 65  al .    ** conte
2eeb0 6e 74 20 66 6f 72 20 61 6e 79 20 70 61 67 65 20  nt for any page 
2eec0 74 68 61 74 20 72 65 61 6c 6c 79 20 64 6f 65 73  that really does
2eed0 20 6c 69 65 20 70 61 73 74 20 74 68 65 20 65 6e   lie past the en
2eee0 64 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  d of the databas
2eef0 65 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 6f 6e  e.    ** file on
2ef00 20 64 69 73 6b 2e 20 53 6f 20 74 68 65 20 65 66   disk. So the ef
2ef10 66 65 63 74 73 20 6f 66 20 64 69 73 61 62 6c 69  fects of disabli
2ef20 6e 67 20 74 68 65 20 6e 6f 2d 63 6f 6e 74 65 6e  ng the no-conten
2ef30 74 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a 20  t optimization. 
2ef40 20 20 20 2a 2a 20 68 65 72 65 20 61 72 65 20 63     ** here are c
2ef50 6f 6e 66 69 6e 65 64 20 74 6f 20 74 68 6f 73 65  onfined to those
2ef60 20 70 61 67 65 73 20 74 68 61 74 20 6c 69 65 20   pages that lie 
2ef70 62 65 74 77 65 65 6e 20 74 68 65 20 65 6e 64 20  between the end 
2ef80 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61  of the.    ** da
2ef90 74 61 62 61 73 65 20 69 6d 61 67 65 20 61 6e 64  tabase image and
2efa0 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
2efb0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20  database file.. 
2efc0 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 62 4e     */.    int bN
2efd0 6f 43 6f 6e 74 65 6e 74 20 3d 20 28 30 3d 3d 49  oContent = (0==I
2efe0 66 4e 6f 74 4f 6d 69 74 41 56 28 70 42 74 2d 3e  fNotOmitAV(pBt->
2eff0 62 44 6f 54 72 75 6e 63 61 74 65 29 29 3f 20 50  bDoTruncate))? P
2f000 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45  AGER_GET_NOCONTE
2f010 4e 54 3a 30 3b 0a 0a 20 20 20 20 72 63 20 3d 20  NT:0;..    rc = 
2f020 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
2f030 65 28 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 70  e(pBt->pPage1->p
2f040 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  DbPage);.    if(
2f050 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
2f060 0a 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 2b  .    pBt->nPage+
2f070 2b 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e  +;.    if( pBt->
2f080 6e 50 61 67 65 3d 3d 50 45 4e 44 49 4e 47 5f 42  nPage==PENDING_B
2f090 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 20  YTE_PAGE(pBt) ) 
2f0a0 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 0a 23  pBt->nPage++;..#
2f0b0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2f0c0 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
2f0d0 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56    if( pBt->autoV
2f0e0 61 63 75 75 6d 20 26 26 20 50 54 52 4d 41 50 5f  acuum && PTRMAP_
2f0f0 49 53 50 41 47 45 28 70 42 74 2c 20 70 42 74 2d  ISPAGE(pBt, pBt-
2f100 3e 6e 50 61 67 65 29 20 29 7b 0a 20 20 20 20 20  >nPage) ){.     
2f110 20 2f 2a 20 49 66 20 2a 70 50 67 6e 6f 20 72 65   /* If *pPgno re
2f120 66 65 72 73 20 74 6f 20 61 20 70 6f 69 6e 74 65  fers to a pointe
2f130 72 2d 6d 61 70 20 70 61 67 65 2c 20 61 6c 6c 6f  r-map page, allo
2f140 63 61 74 65 20 74 77 6f 20 6e 65 77 20 70 61 67  cate two new pag
2f150 65 73 0a 20 20 20 20 20 20 2a 2a 20 61 74 20 74  es.      ** at t
2f160 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69  he end of the fi
2f170 6c 65 20 69 6e 73 74 65 61 64 20 6f 66 20 6f 6e  le instead of on
2f180 65 2e 20 54 68 65 20 66 69 72 73 74 20 61 6c 6c  e. The first all
2f190 6f 63 61 74 65 64 20 70 61 67 65 0a 20 20 20 20  ocated page.    
2f1a0 20 20 2a 2a 20 62 65 63 6f 6d 65 73 20 61 20 6e    ** becomes a n
2f1b0 65 77 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70  ew pointer-map p
2f1c0 61 67 65 2c 20 74 68 65 20 73 65 63 6f 6e 64 20  age, the second 
2f1d0 69 73 20 75 73 65 64 20 62 79 20 74 68 65 20 63  is used by the c
2f1e0 61 6c 6c 65 72 2e 0a 20 20 20 20 20 20 2a 2f 0a  aller..      */.
2f1f0 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70        MemPage *p
2f200 50 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 54 52  Pg = 0;.      TR
2f210 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20  ACE(("ALLOCATE: 
2f220 25 64 20 66 72 6f 6d 20 65 6e 64 20 6f 66 20 66  %d from end of f
2f230 69 6c 65 20 28 70 6f 69 6e 74 65 72 2d 6d 61 70  ile (pointer-map
2f240 20 70 61 67 65 29 5c 6e 22 2c 20 70 42 74 2d 3e   page)\n", pBt->
2f250 6e 50 61 67 65 29 29 3b 0a 20 20 20 20 20 20 61  nPage));.      a
2f260 73 73 65 72 74 28 20 70 42 74 2d 3e 6e 50 61 67  ssert( pBt->nPag
2f270 65 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  e!=PENDING_BYTE_
2f280 50 41 47 45 28 70 42 74 29 20 29 3b 0a 20 20 20  PAGE(pBt) );.   
2f290 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74     rc = btreeGet
2f2a0 55 6e 75 73 65 64 50 61 67 65 28 70 42 74 2c 20  UnusedPage(pBt, 
2f2b0 70 42 74 2d 3e 6e 50 61 67 65 2c 20 26 70 50 67  pBt->nPage, &pPg
2f2c0 2c 20 62 4e 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20  , bNoContent);. 
2f2d0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
2f2e0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2f2f0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
2f300 67 65 72 57 72 69 74 65 28 70 50 67 2d 3e 70 44  gerWrite(pPg->pD
2f310 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
2f320 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 67 29  releasePage(pPg)
2f330 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2f340 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
2f350 72 63 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e  rc;.      pBt->n
2f360 50 61 67 65 2b 2b 3b 0a 20 20 20 20 20 20 69 66  Page++;.      if
2f370 28 20 70 42 74 2d 3e 6e 50 61 67 65 3d 3d 50 45  ( pBt->nPage==PE
2f380 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
2f390 70 42 74 29 20 29 7b 20 70 42 74 2d 3e 6e 50 61  pBt) ){ pBt->nPa
2f3a0 67 65 2b 2b 3b 20 7d 0a 20 20 20 20 7d 0a 23 65  ge++; }.    }.#e
2f3b0 6e 64 69 66 0a 20 20 20 20 70 75 74 34 62 79 74  ndif.    put4byt
2f3c0 65 28 32 38 20 2b 20 28 75 38 2a 29 70 42 74 2d  e(28 + (u8*)pBt-
2f3d0 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 2c 20  >pPage1->aData, 
2f3e0 70 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20  pBt->nPage);.   
2f3f0 20 2a 70 50 67 6e 6f 20 3d 20 70 42 74 2d 3e 6e   *pPgno = pBt->n
2f400 50 61 67 65 3b 0a 0a 20 20 20 20 61 73 73 65 72  Page;..    asser
2f410 74 28 20 2a 70 50 67 6e 6f 21 3d 50 45 4e 44 49  t( *pPgno!=PENDI
2f420 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
2f430 29 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 62 74  ) );.    rc = bt
2f440 72 65 65 47 65 74 55 6e 75 73 65 64 50 61 67 65  reeGetUnusedPage
2f450 28 70 42 74 2c 20 2a 70 50 67 6e 6f 2c 20 70 70  (pBt, *pPgno, pp
2f460 50 61 67 65 2c 20 62 4e 6f 43 6f 6e 74 65 6e 74  Page, bNoContent
2f470 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
2f480 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 72  return rc;.    r
2f490 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
2f4a0 57 72 69 74 65 28 28 2a 70 70 50 61 67 65 29 2d  Write((*ppPage)-
2f4b0 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69  >pDbPage);.    i
2f4c0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2f4d0 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73   ){.      releas
2f4e0 65 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a  ePage(*ppPage);.
2f4f0 20 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20        *ppPage = 
2f500 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 52 41  0;.    }.    TRA
2f510 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25  CE(("ALLOCATE: %
2f520 64 20 66 72 6f 6d 20 65 6e 64 20 6f 66 20 66 69  d from end of fi
2f530 6c 65 5c 6e 22 2c 20 2a 70 50 67 6e 6f 29 29 3b  le\n", *pPgno));
2f540 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20  .  }..  assert( 
2f550 2a 70 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f  *pPgno!=PENDING_
2f560 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
2f570 3b 0a 0a 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  ;..end_allocate_
2f580 70 61 67 65 3a 0a 20 20 72 65 6c 65 61 73 65 50  page:.  releaseP
2f590 61 67 65 28 70 54 72 75 6e 6b 29 3b 0a 20 20 72  age(pTrunk);.  r
2f5a0 65 6c 65 61 73 65 50 61 67 65 28 70 50 72 65 76  eleasePage(pPrev
2f5b0 54 72 75 6e 6b 29 3b 0a 20 20 61 73 73 65 72 74  Trunk);.  assert
2f5c0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2f5d0 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72 50  || sqlite3PagerP
2f5e0 61 67 65 52 65 66 63 6f 75 6e 74 28 28 2a 70 70  ageRefcount((*pp
2f5f0 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3c  Page)->pDbPage)<
2f600 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =1 );.  assert( 
2f610 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
2f620 20 28 2a 70 70 50 61 67 65 29 2d 3e 69 73 49 6e   (*ppPage)->isIn
2f630 69 74 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72  it==0 );.  retur
2f640 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
2f650 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
2f660 75 73 65 64 20 74 6f 20 61 64 64 20 70 61 67 65  used to add page
2f670 20 69 50 61 67 65 20 74 6f 20 74 68 65 20 64 61   iPage to the da
2f680 74 61 62 61 73 65 20 66 69 6c 65 20 66 72 65 65  tabase file free
2f690 2d 6c 69 73 74 2e 20 0a 2a 2a 20 49 74 20 69 73  -list. .** It is
2f6a0 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68   assumed that th
2f6b0 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c  e page is not al
2f6c0 72 65 61 64 79 20 61 20 70 61 72 74 20 6f 66 20  ready a part of 
2f6d0 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 0a 2a  the free-list..*
2f6e0 2a 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 70  *.** The value p
2f6f0 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
2f700 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  ond argument to 
2f710 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
2f720 20 6f 70 74 69 6f 6e 61 6c 2e 0a 2a 2a 20 49 66   optional..** If
2f730 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61 70 70   the caller happ
2f740 65 6e 73 20 74 6f 20 68 61 76 65 20 61 20 70 6f  ens to have a po
2f750 69 6e 74 65 72 20 74 6f 20 74 68 65 20 4d 65 6d  inter to the Mem
2f760 50 61 67 65 20 6f 62 6a 65 63 74 20 0a 2a 2a 20  Page object .** 
2f770 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f  corresponding to
2f780 20 70 61 67 65 20 69 50 61 67 65 20 68 61 6e 64   page iPage hand
2f790 79 2c 20 69 74 20 6d 61 79 20 70 61 73 73 20 69  y, it may pass i
2f7a0 74 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  t as the second 
2f7b0 76 61 6c 75 65 2e 20 0a 2a 2a 20 4f 74 68 65 72  value. .** Other
2f7c0 77 69 73 65 2c 20 69 74 20 6d 61 79 20 70 61 73  wise, it may pas
2f7d0 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66  s NULL..**.** If
2f7e0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
2f7f0 4d 65 6d 50 61 67 65 20 6f 62 6a 65 63 74 20 69  MemPage object i
2f800 73 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  s passed as the 
2f810 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c  second argument,
2f820 0a 2a 2a 20 69 74 73 20 72 65 66 65 72 65 6e 63  .** its referenc
2f830 65 20 63 6f 75 6e 74 20 69 73 20 6e 6f 74 20 61  e count is not a
2f840 6c 74 65 72 65 64 20 62 79 20 74 68 69 73 20 66  ltered by this f
2f850 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  unction..*/.stat
2f860 69 63 20 69 6e 74 20 66 72 65 65 50 61 67 65 32  ic int freePage2
2f870 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
2f880 4d 65 6d 50 61 67 65 20 2a 70 4d 65 6d 50 61 67  MemPage *pMemPag
2f890 65 2c 20 50 67 6e 6f 20 69 50 61 67 65 29 7b 0a  e, Pgno iPage){.
2f8a0 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 72 75 6e    MemPage *pTrun
2f8b0 6b 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  k = 0;          
2f8c0 20 20 20 20 20 20 2f 2a 20 46 72 65 65 2d 6c 69        /* Free-li
2f8d0 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f  st trunk page */
2f8e0 0a 20 20 50 67 6e 6f 20 69 54 72 75 6e 6b 20 3d  .  Pgno iTrunk =
2f8f0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
2f900 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e         /* Page n
2f910 75 6d 62 65 72 20 6f 66 20 66 72 65 65 2d 6c 69  umber of free-li
2f920 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f  st trunk page */
2f930 20 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61   .  MemPage *pPa
2f940 67 65 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65  ge1 = pBt->pPage
2f950 31 3b 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c  1;      /* Local
2f960 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 70 61   reference to pa
2f970 67 65 20 31 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  ge 1 */.  MemPag
2f980 65 20 2a 70 50 61 67 65 3b 20 20 20 20 20 20 20  e *pPage;       
2f990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2f9a0 20 50 61 67 65 20 62 65 69 6e 67 20 66 72 65 65   Page being free
2f9b0 64 2e 20 4d 61 79 20 62 65 20 4e 55 4c 4c 2e 20  d. May be NULL. 
2f9c0 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  */.  int rc;    
2f9d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f9e0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
2f9f0 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  rn Code */.  int
2fa00 20 6e 46 72 65 65 3b 20 20 20 20 20 20 20 20 20   nFree;         
2fa10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fa20 20 2f 2a 20 49 6e 69 74 69 61 6c 20 6e 75 6d 62   /* Initial numb
2fa30 65 72 20 6f 66 20 70 61 67 65 73 20 6f 6e 20 66  er of pages on f
2fa40 72 65 65 2d 6c 69 73 74 20 2a 2f 0a 0a 20 20 61  ree-list */..  a
2fa50 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
2fa60 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
2fa70 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
2fa80 74 28 20 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c  t( CORRUPT_DB ||
2fa90 20 69 50 61 67 65 3e 31 20 29 3b 0a 20 20 61 73   iPage>1 );.  as
2faa0 73 65 72 74 28 20 21 70 4d 65 6d 50 61 67 65 20  sert( !pMemPage 
2fab0 7c 7c 20 70 4d 65 6d 50 61 67 65 2d 3e 70 67 6e  || pMemPage->pgn
2fac0 6f 3d 3d 69 50 61 67 65 20 29 3b 0a 0a 20 20 69  o==iPage );..  i
2fad0 66 28 20 69 50 61 67 65 3c 32 20 29 20 72 65 74  f( iPage<2 ) ret
2fae0 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
2faf0 50 54 5f 42 4b 50 54 3b 0a 20 20 69 66 28 20 70  PT_BKPT;.  if( p
2fb00 4d 65 6d 50 61 67 65 20 29 7b 0a 20 20 20 20 70  MemPage ){.    p
2fb10 50 61 67 65 20 3d 20 70 4d 65 6d 50 61 67 65 3b  Page = pMemPage;
2fb20 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
2fb30 72 52 65 66 28 70 50 61 67 65 2d 3e 70 44 62 50  rRef(pPage->pDbP
2fb40 61 67 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  age);.  }else{. 
2fb50 20 20 20 70 50 61 67 65 20 3d 20 62 74 72 65 65     pPage = btree
2fb60 50 61 67 65 4c 6f 6f 6b 75 70 28 70 42 74 2c 20  PageLookup(pBt, 
2fb70 69 50 61 67 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f  iPage);.  }..  /
2fb80 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20  * Increment the 
2fb90 66 72 65 65 20 70 61 67 65 20 63 6f 75 6e 74 20  free page count 
2fba0 6f 6e 20 70 50 61 67 65 31 20 2a 2f 0a 20 20 72  on pPage1 */.  r
2fbb0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
2fbc0 57 72 69 74 65 28 70 50 61 67 65 31 2d 3e 70 44  Write(pPage1->pD
2fbd0 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63  bPage);.  if( rc
2fbe0 20 29 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65   ) goto freepage
2fbf0 5f 6f 75 74 3b 0a 20 20 6e 46 72 65 65 20 3d 20  _out;.  nFree = 
2fc00 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 31  get4byte(&pPage1
2fc10 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20  ->aData[36]);.  
2fc20 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31  put4byte(&pPage1
2fc30 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20 6e 46 72  ->aData[36], nFr
2fc40 65 65 2b 31 29 3b 0a 0a 20 20 69 66 28 20 70 42  ee+1);..  if( pB
2fc50 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54  t->btsFlags & BT
2fc60 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 20  S_SECURE_DELETE 
2fc70 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ){.    /* If the
2fc80 20 73 65 63 75 72 65 5f 64 65 6c 65 74 65 20 6f   secure_delete o
2fc90 70 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64  ption is enabled
2fca0 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 61 6c  , then.    ** al
2fcb0 77 61 79 73 20 66 75 6c 6c 79 20 6f 76 65 72 77  ways fully overw
2fcc0 72 69 74 65 20 64 65 6c 65 74 65 64 20 69 6e 66  rite deleted inf
2fcd0 6f 72 6d 61 74 69 6f 6e 20 77 69 74 68 20 7a 65  ormation with ze
2fce0 72 6f 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ros..    */.    
2fcf0 69 66 28 20 28 21 70 50 61 67 65 20 26 26 20 28  if( (!pPage && (
2fd00 28 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61  (rc = btreeGetPa
2fd10 67 65 28 70 42 74 2c 20 69 50 61 67 65 2c 20 26  ge(pBt, iPage, &
2fd20 70 50 61 67 65 2c 20 30 29 29 21 3d 30 29 20 29  pPage, 0))!=0) )
2fd30 0a 20 20 20 20 20 7c 7c 20 20 20 20 20 20 20 20  .     ||        
2fd40 20 20 20 20 28 28 72 63 20 3d 20 73 71 6c 69 74      ((rc = sqlit
2fd50 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61  e3PagerWrite(pPa
2fd60 67 65 2d 3e 70 44 62 50 61 67 65 29 29 21 3d 30  ge->pDbPage))!=0
2fd70 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 67  ).    ){.      g
2fd80 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74  oto freepage_out
2fd90 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 73  ;.    }.    mems
2fda0 65 74 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c  et(pPage->aData,
2fdb0 20 30 2c 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e   0, pPage->pBt->
2fdc0 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a  pageSize);.  }..
2fdd0 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61    /* If the data
2fde0 62 61 73 65 20 73 75 70 70 6f 72 74 73 20 61 75  base supports au
2fdf0 74 6f 2d 76 61 63 75 75 6d 2c 20 77 72 69 74 65  to-vacuum, write
2fe00 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 74 68 65   an entry in the
2fe10 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 2a   pointer-map.  *
2fe20 2a 20 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68  * to indicate th
2fe30 61 74 20 74 68 65 20 70 61 67 65 20 69 73 20 66  at the page is f
2fe40 72 65 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ree..  */.  if( 
2fe50 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a  ISAUTOVACUUM ){.
2fe60 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42      ptrmapPut(pB
2fe70 74 2c 20 69 50 61 67 65 2c 20 50 54 52 4d 41 50  t, iPage, PTRMAP
2fe80 5f 46 52 45 45 50 41 47 45 2c 20 30 2c 20 26 72  _FREEPAGE, 0, &r
2fe90 63 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  c);.    if( rc )
2fea0 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f   goto freepage_o
2feb0 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f  ut;.  }..  /* No
2fec0 77 20 6d 61 6e 69 70 75 6c 61 74 65 20 74 68 65  w manipulate the
2fed0 20 61 63 74 75 61 6c 20 64 61 74 61 62 61 73 65   actual database
2fee0 20 66 72 65 65 2d 6c 69 73 74 20 73 74 72 75 63   free-list struc
2fef0 74 75 72 65 2e 20 54 68 65 72 65 20 61 72 65 20  ture. There are 
2ff00 74 77 6f 0a 20 20 2a 2a 20 70 6f 73 73 69 62 69  two.  ** possibi
2ff10 6c 69 74 69 65 73 2e 20 49 66 20 74 68 65 20 66  lities. If the f
2ff20 72 65 65 2d 6c 69 73 74 20 69 73 20 63 75 72 72  ree-list is curr
2ff30 65 6e 74 6c 79 20 65 6d 70 74 79 2c 20 6f 72 20  ently empty, or 
2ff40 69 66 20 74 68 65 20 66 69 72 73 74 0a 20 20 2a  if the first.  *
2ff50 2a 20 74 72 75 6e 6b 20 70 61 67 65 20 69 6e 20  * trunk page in 
2ff60 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 69 73  the free-list is
2ff70 20 66 75 6c 6c 2c 20 74 68 65 6e 20 74 68 69 73   full, then this
2ff80 20 70 61 67 65 20 77 69 6c 6c 20 62 65 63 6f 6d   page will becom
2ff90 65 20 61 0a 20 20 2a 2a 20 6e 65 77 20 66 72 65  e a.  ** new fre
2ffa0 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67  e-list trunk pag
2ffb0 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74  e. Otherwise, it
2ffc0 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 61 20 6c   will become a l
2ffd0 65 61 66 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20  eaf of the.  ** 
2ffe0 66 69 72 73 74 20 74 72 75 6e 6b 20 70 61 67 65  first trunk page
2fff0 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   in the current 
30000 66 72 65 65 2d 6c 69 73 74 2e 20 54 68 69 73 20  free-list. This 
30010 62 6c 6f 63 6b 20 74 65 73 74 73 20 69 66 20 69  block tests if i
30020 74 0a 20 20 2a 2a 20 69 73 20 70 6f 73 73 69 62  t.  ** is possib
30030 6c 65 20 74 6f 20 61 64 64 20 74 68 65 20 70 61  le to add the pa
30040 67 65 20 61 73 20 61 20 6e 65 77 20 66 72 65 65  ge as a new free
30050 2d 6c 69 73 74 20 6c 65 61 66 2e 0a 20 20 2a 2f  -list leaf..  */
30060 0a 20 20 69 66 28 20 6e 46 72 65 65 21 3d 30 20  .  if( nFree!=0 
30070 29 7b 0a 20 20 20 20 75 33 32 20 6e 4c 65 61 66  ){.    u32 nLeaf
30080 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
30090 20 2f 2a 20 49 6e 69 74 69 61 6c 20 6e 75 6d 62   /* Initial numb
300a0 65 72 20 6f 66 20 6c 65 61 66 20 63 65 6c 6c 73  er of leaf cells
300b0 20 6f 6e 20 74 72 75 6e 6b 20 70 61 67 65 20 2a   on trunk page *
300c0 2f 0a 0a 20 20 20 20 69 54 72 75 6e 6b 20 3d 20  /..    iTrunk = 
300d0 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 31  get4byte(&pPage1
300e0 2d 3e 61 44 61 74 61 5b 33 32 5d 29 3b 0a 20 20  ->aData[32]);.  
300f0 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50    rc = btreeGetP
30100 61 67 65 28 70 42 74 2c 20 69 54 72 75 6e 6b 2c  age(pBt, iTrunk,
30110 20 26 70 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20   &pTrunk, 0);.  
30120 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
30130 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  _OK ){.      got
30140 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a  o freepage_out;.
30150 20 20 20 20 7d 0a 0a 20 20 20 20 6e 4c 65 61 66      }..    nLeaf
30160 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 54 72   = get4byte(&pTr
30170 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 29 3b 0a  unk->aData[4]);.
30180 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
30190 3e 75 73 61 62 6c 65 53 69 7a 65 3e 33 32 20 29  >usableSize>32 )
301a0 3b 0a 20 20 20 20 69 66 28 20 6e 4c 65 61 66 20  ;.    if( nLeaf 
301b0 3e 20 28 75 33 32 29 70 42 74 2d 3e 75 73 61 62  > (u32)pBt->usab
301c0 6c 65 53 69 7a 65 2f 34 20 2d 20 32 20 29 7b 0a  leSize/4 - 2 ){.
301d0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
301e0 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
301f0 20 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70        goto freep
30200 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20  age_out;.    }. 
30210 20 20 20 69 66 28 20 6e 4c 65 61 66 20 3c 20 28     if( nLeaf < (
30220 75 33 32 29 70 42 74 2d 3e 75 73 61 62 6c 65 53  u32)pBt->usableS
30230 69 7a 65 2f 34 20 2d 20 38 20 29 7b 0a 20 20 20  ize/4 - 8 ){.   
30240 20 20 20 2f 2a 20 49 6e 20 74 68 69 73 20 63 61     /* In this ca
30250 73 65 20 74 68 65 72 65 20 69 73 20 72 6f 6f 6d  se there is room
30260 20 6f 6e 20 74 68 65 20 74 72 75 6e 6b 20 70 61   on the trunk pa
30270 67 65 20 74 6f 20 69 6e 73 65 72 74 20 74 68 65  ge to insert the
30280 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 62   page.      ** b
30290 65 69 6e 67 20 66 72 65 65 64 20 61 73 20 61 20  eing freed as a 
302a0 6e 65 77 20 6c 65 61 66 2e 0a 20 20 20 20 20 20  new leaf..      
302b0 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4e 6f 74 65  **.      ** Note
302c0 20 74 68 61 74 20 74 68 65 20 74 72 75 6e 6b 20   that the trunk 
302d0 70 61 67 65 20 69 73 20 6e 6f 74 20 72 65 61 6c  page is not real
302e0 6c 79 20 66 75 6c 6c 20 75 6e 74 69 6c 20 69 74  ly full until it
302f0 20 63 6f 6e 74 61 69 6e 73 0a 20 20 20 20 20 20   contains.      
30300 2a 2a 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20  ** usableSize/4 
30310 2d 20 32 20 65 6e 74 72 69 65 73 2c 20 6e 6f 74  - 2 entries, not
30320 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20   usableSize/4 - 
30330 38 20 65 6e 74 72 69 65 73 20 61 73 20 77 65 20  8 entries as we 
30340 68 61 76 65 0a 20 20 20 20 20 20 2a 2a 20 63 6f  have.      ** co
30350 64 65 64 2e 20 20 42 75 74 20 64 75 65 20 74 6f  ded.  But due to
30360 20 61 20 63 6f 64 69 6e 67 20 65 72 72 6f 72 20   a coding error 
30370 69 6e 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53  in versions of S
30380 51 4c 69 74 65 20 70 72 69 6f 72 20 74 6f 0a 20  QLite prior to. 
30390 20 20 20 20 20 2a 2a 20 33 2e 36 2e 30 2c 20 64       ** 3.6.0, d
303a0 61 74 61 62 61 73 65 73 20 77 69 74 68 20 66 72  atabases with fr
303b0 65 65 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67  eelist trunk pag
303c0 65 73 20 68 6f 6c 64 69 6e 67 20 6d 6f 72 65 20  es holding more 
303d0 74 68 61 6e 0a 20 20 20 20 20 20 2a 2a 20 75 73  than.      ** us
303e0 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20 65  ableSize/4 - 8 e
303f0 6e 74 72 69 65 73 20 77 69 6c 6c 20 62 65 20 72  ntries will be r
30400 65 70 6f 72 74 65 64 20 61 73 20 63 6f 72 72 75  eported as corru
30410 70 74 2e 20 20 49 6e 20 6f 72 64 65 72 0a 20 20  pt.  In order.  
30420 20 20 20 20 2a 2a 20 74 6f 20 6d 61 69 6e 74 61      ** to mainta
30430 69 6e 20 62 61 63 6b 77 61 72 64 73 20 63 6f 6d  in backwards com
30440 70 61 74 69 62 69 6c 69 74 79 20 77 69 74 68 20  patibility with 
30450 6f 6c 64 65 72 20 76 65 72 73 69 6f 6e 73 20 6f  older versions o
30460 66 20 53 51 4c 69 74 65 2c 0a 20 20 20 20 20 20  f SQLite,.      
30470 2a 2a 20 77 65 20 77 69 6c 6c 20 63 6f 6e 74 69  ** we will conti
30480 6e 75 65 20 74 6f 20 72 65 73 74 72 69 63 74 20  nue to restrict 
30490 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e  the number of en
304a0 74 72 69 65 73 20 74 6f 20 75 73 61 62 6c 65 53  tries to usableS
304b0 69 7a 65 2f 34 20 2d 20 38 0a 20 20 20 20 20 20  ize/4 - 8.      
304c0 2a 2a 20 66 6f 72 20 6e 6f 77 2e 20 20 41 74 20  ** for now.  At 
304d0 73 6f 6d 65 20 70 6f 69 6e 74 20 69 6e 20 74 68  some point in th
304e0 65 20 66 75 74 75 72 65 20 28 6f 6e 63 65 20 65  e future (once e
304f0 76 65 72 79 6f 6e 65 20 68 61 73 20 75 70 67 72  veryone has upgr
30500 61 64 65 64 0a 20 20 20 20 20 20 2a 2a 20 74 6f  aded.      ** to
30510 20 33 2e 36 2e 30 20 6f 72 20 6c 61 74 65 72 29   3.6.0 or later)
30520 20 77 65 20 73 68 6f 75 6c 64 20 63 6f 6e 73 69   we should consi
30530 64 65 72 20 66 69 78 69 6e 67 20 74 68 65 20 63  der fixing the c
30540 6f 6e 64 69 74 69 6f 6e 61 6c 20 61 62 6f 76 65  onditional above
30550 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 72 65 61  .      ** to rea
30560 64 20 22 75 73 61 62 6c 65 53 69 7a 65 2f 34 2d  d "usableSize/4-
30570 32 22 20 69 6e 73 74 65 61 64 20 6f 66 20 22 75  2" instead of "u
30580 73 61 62 6c 65 53 69 7a 65 2f 34 2d 38 22 2e 0a  sableSize/4-8"..
30590 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
305a0 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
305b0 2d 31 39 39 32 30 2d 31 31 35 37 36 20 48 6f 77  -19920-11576 How
305c0 65 76 65 72 2c 20 6e 65 77 65 72 20 76 65 72 73  ever, newer vers
305d0 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 73  ions of SQLite s
305e0 74 69 6c 6c 0a 20 20 20 20 20 20 2a 2a 20 61 76  till.      ** av
305f0 6f 69 64 20 75 73 69 6e 67 20 74 68 65 20 6c 61  oid using the la
30600 73 74 20 73 69 78 20 65 6e 74 72 69 65 73 20 69  st six entries i
30610 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 74  n the freelist t
30620 72 75 6e 6b 20 70 61 67 65 20 61 72 72 61 79 20  runk page array 
30630 69 6e 0a 20 20 20 20 20 20 2a 2a 20 6f 72 64 65  in.      ** orde
30640 72 20 74 68 61 74 20 64 61 74 61 62 61 73 65 20  r that database 
30650 66 69 6c 65 73 20 63 72 65 61 74 65 64 20 62 79  files created by
30660 20 6e 65 77 65 72 20 76 65 72 73 69 6f 6e 73 20   newer versions 
30670 6f 66 20 53 51 4c 69 74 65 20 63 61 6e 20 62 65  of SQLite can be
30680 0a 20 20 20 20 20 20 2a 2a 20 72 65 61 64 20 62  .      ** read b
30690 79 20 6f 6c 64 65 72 20 76 65 72 73 69 6f 6e 73  y older versions
306a0 20 6f 66 20 53 51 4c 69 74 65 2e 0a 20 20 20 20   of SQLite..    
306b0 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20    */.      rc = 
306c0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
306d0 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67  e(pTrunk->pDbPag
306e0 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  e);.      if( rc
306f0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
30700 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
30710 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34  &pTrunk->aData[4
30720 5d 2c 20 6e 4c 65 61 66 2b 31 29 3b 0a 20 20 20  ], nLeaf+1);.   
30730 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
30740 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 2b 6e  Trunk->aData[8+n
30750 4c 65 61 66 2a 34 5d 2c 20 69 50 61 67 65 29 3b  Leaf*4], iPage);
30760 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61  .        if( pPa
30770 67 65 20 26 26 20 28 70 42 74 2d 3e 62 74 73 46  ge && (pBt->btsF
30780 6c 61 67 73 20 26 20 42 54 53 5f 53 45 43 55 52  lags & BTS_SECUR
30790 45 5f 44 45 4c 45 54 45 29 3d 3d 30 20 29 7b 0a  E_DELETE)==0 ){.
307a0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
307b0 33 50 61 67 65 72 44 6f 6e 74 57 72 69 74 65 28  3PagerDontWrite(
307c0 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b  pPage->pDbPage);
307d0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
307e0 20 20 20 72 63 20 3d 20 62 74 72 65 65 53 65 74     rc = btreeSet
307f0 48 61 73 43 6f 6e 74 65 6e 74 28 70 42 74 2c 20  HasContent(pBt, 
30800 69 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a  iPage);.      }.
30810 20 20 20 20 20 20 54 52 41 43 45 28 28 22 46 52        TRACE(("FR
30820 45 45 2d 50 41 47 45 3a 20 25 64 20 6c 65 61 66  EE-PAGE: %d leaf
30830 20 6f 6e 20 74 72 75 6e 6b 20 70 61 67 65 20 25   on trunk page %
30840 64 5c 6e 22 2c 70 50 61 67 65 2d 3e 70 67 6e 6f  d\n",pPage->pgno
30850 2c 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 29 29 3b  ,pTrunk->pgno));
30860 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65  .      goto free
30870 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  page_out;.    }.
30880 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 63 6f 6e    }..  /* If con
30890 74 72 6f 6c 20 66 6c 6f 77 73 20 74 6f 20 74 68  trol flows to th
308a0 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20 69  is point, then i
308b0 74 20 77 61 73 20 6e 6f 74 20 70 6f 73 73 69 62  t was not possib
308c0 6c 65 20 74 6f 20 61 64 64 20 74 68 65 0a 20 20  le to add the.  
308d0 2a 2a 20 74 68 65 20 70 61 67 65 20 62 65 69 6e  ** the page bein
308e0 67 20 66 72 65 65 64 20 61 73 20 61 20 6c 65 61  g freed as a lea
308f0 66 20 70 61 67 65 20 6f 66 20 74 68 65 20 66 69  f page of the fi
30900 72 73 74 20 74 72 75 6e 6b 20 69 6e 20 74 68 65  rst trunk in the
30910 20 66 72 65 65 2d 6c 69 73 74 2e 0a 20 20 2a 2a   free-list..  **
30920 20 50 6f 73 73 69 62 6c 79 20 62 65 63 61 75 73   Possibly becaus
30930 65 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  e the free-list 
30940 69 73 20 65 6d 70 74 79 2c 20 6f 72 20 70 6f 73  is empty, or pos
30950 73 69 62 6c 79 20 62 65 63 61 75 73 65 20 74 68  sibly because th
30960 65 20 0a 20 20 2a 2a 20 66 69 72 73 74 20 74 72  e .  ** first tr
30970 75 6e 6b 20 69 6e 20 74 68 65 20 66 72 65 65 2d  unk in the free-
30980 6c 69 73 74 20 69 73 20 66 75 6c 6c 2e 20 45 69  list is full. Ei
30990 74 68 65 72 20 77 61 79 2c 20 74 68 65 20 70 61  ther way, the pa
309a0 67 65 20 62 65 69 6e 67 20 66 72 65 65 64 0a 20  ge being freed. 
309b0 20 2a 2a 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20   ** will become 
309c0 74 68 65 20 6e 65 77 20 66 69 72 73 74 20 74 72  the new first tr
309d0 75 6e 6b 20 70 61 67 65 20 69 6e 20 74 68 65 20  unk page in the 
309e0 66 72 65 65 2d 6c 69 73 74 2e 0a 20 20 2a 2f 0a  free-list..  */.
309f0 20 20 69 66 28 20 70 50 61 67 65 3d 3d 30 20 26    if( pPage==0 &
30a00 26 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63  & SQLITE_OK!=(rc
30a10 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28   = btreeGetPage(
30a20 70 42 74 2c 20 69 50 61 67 65 2c 20 26 70 50 61  pBt, iPage, &pPa
30a30 67 65 2c 20 30 29 29 20 29 7b 0a 20 20 20 20 67  ge, 0)) ){.    g
30a40 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74  oto freepage_out
30a50 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c  ;.  }.  rc = sql
30a60 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
30a70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Page->pDbPage);.
30a80 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
30a90 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  _OK ){.    goto 
30aa0 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20  freepage_out;.  
30ab0 7d 0a 20 20 70 75 74 34 62 79 74 65 28 70 50 61  }.  put4byte(pPa
30ac0 67 65 2d 3e 61 44 61 74 61 2c 20 69 54 72 75 6e  ge->aData, iTrun
30ad0 6b 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26  k);.  put4byte(&
30ae0 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 34 5d 2c  pPage->aData[4],
30af0 20 30 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28   0);.  put4byte(
30b00 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
30b10 32 5d 2c 20 69 50 61 67 65 29 3b 0a 20 20 54 52  2], iPage);.  TR
30b20 41 43 45 28 28 22 46 52 45 45 2d 50 41 47 45 3a  ACE(("FREE-PAGE:
30b30 20 25 64 20 6e 65 77 20 74 72 75 6e 6b 20 70 61   %d new trunk pa
30b40 67 65 20 72 65 70 6c 61 63 69 6e 67 20 25 64 5c  ge replacing %d\
30b50 6e 22 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c  n", pPage->pgno,
30b60 20 69 54 72 75 6e 6b 29 29 3b 0a 0a 66 72 65 65   iTrunk));..free
30b70 70 61 67 65 5f 6f 75 74 3a 0a 20 20 69 66 28 20  page_out:.  if( 
30b80 70 50 61 67 65 20 29 7b 0a 20 20 20 20 70 50 61  pPage ){.    pPa
30b90 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a  ge->isInit = 0;.
30ba0 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 50 61 67    }.  releasePag
30bb0 65 28 70 50 61 67 65 29 3b 0a 20 20 72 65 6c 65  e(pPage);.  rele
30bc0 61 73 65 50 61 67 65 28 70 54 72 75 6e 6b 29 3b  asePage(pTrunk);
30bd0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
30be0 73 74 61 74 69 63 20 76 6f 69 64 20 66 72 65 65  static void free
30bf0 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50  Page(MemPage *pP
30c00 61 67 65 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a  age, int *pRC){.
30c10 20 20 69 66 28 20 28 2a 70 52 43 29 3d 3d 53 51    if( (*pRC)==SQ
30c20 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a  LITE_OK ){.    *
30c30 70 52 43 20 3d 20 66 72 65 65 50 61 67 65 32 28  pRC = freePage2(
30c40 70 50 61 67 65 2d 3e 70 42 74 2c 20 70 50 61 67  pPage->pBt, pPag
30c50 65 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b  e, pPage->pgno);
30c60 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72  .  }.}../*.** Fr
30c70 65 65 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20  ee any overflow 
30c80 70 61 67 65 73 20 61 73 73 6f 63 69 61 74 65 64  pages associated
30c90 20 77 69 74 68 20 74 68 65 20 67 69 76 65 6e 20   with the given 
30ca0 43 65 6c 6c 2e 20 20 57 72 69 74 65 20 74 68 65  Cell.  Write the
30cb0 0a 2a 2a 20 6c 6f 63 61 6c 20 43 65 6c 6c 20 73  .** local Cell s
30cc0 69 7a 65 20 28 74 68 65 20 6e 75 6d 62 65 72 20  ize (the number 
30cd0 6f 66 20 62 79 74 65 73 20 6f 6e 20 74 68 65 20  of bytes on the 
30ce0 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 2c 20 6f  original page, o
30cf0 6d 69 74 74 69 6e 67 0a 2a 2a 20 6f 76 65 72 66  mitting.** overf
30d00 6c 6f 77 29 20 69 6e 74 6f 20 2a 70 6e 53 69 7a  low) into *pnSiz
30d10 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
30d20 20 63 6c 65 61 72 43 65 6c 6c 28 0a 20 20 4d 65   clearCell(.  Me
30d30 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20  mPage *pPage,   
30d40 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
30d50 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  ge that contains
30d60 20 74 68 65 20 43 65 6c 6c 20 2a 2f 0a 20 20 75   the Cell */.  u
30d70 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 43  nsigned char *pC
30d80 65 6c 6c 2c 20 20 20 20 2f 2a 20 46 69 72 73 74  ell,    /* First
30d90 20 62 79 74 65 20 6f 66 20 74 68 65 20 43 65 6c   byte of the Cel
30da0 6c 20 2a 2f 0a 20 20 75 31 36 20 2a 70 6e 53 69  l */.  u16 *pnSi
30db0 7a 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ze              
30dc0 2f 2a 20 57 72 69 74 65 20 74 68 65 20 73 69 7a  /* Write the siz
30dd0 65 20 6f 66 20 74 68 65 20 43 65 6c 6c 20 68 65  e of the Cell he
30de0 72 65 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68 61  re */.){.  BtSha
30df0 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65  red *pBt = pPage
30e00 2d 3e 70 42 74 3b 0a 20 20 43 65 6c 6c 49 6e 66  ->pBt;.  CellInf
30e10 6f 20 69 6e 66 6f 3b 0a 20 20 50 67 6e 6f 20 6f  o info;.  Pgno o
30e20 76 66 6c 50 67 6e 6f 3b 0a 20 20 69 6e 74 20 72  vflPgno;.  int r
30e30 63 3b 0a 20 20 69 6e 74 20 6e 4f 76 66 6c 3b 0a  c;.  int nOvfl;.
30e40 20 20 75 33 32 20 6f 76 66 6c 50 61 67 65 53 69    u32 ovflPageSi
30e50 7a 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  ze;..  assert( s
30e60 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
30e70 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
30e80 74 65 78 29 20 29 3b 0a 20 20 62 74 72 65 65 50  tex) );.  btreeP
30e90 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67  arseCellPtr(pPag
30ea0 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29  e, pCell, &info)
30eb0 3b 0a 20 20 2a 70 6e 53 69 7a 65 20 3d 20 69 6e  ;.  *pnSize = in
30ec0 66 6f 2e 6e 53 69 7a 65 3b 0a 20 20 69 66 28 20  fo.nSize;.  if( 
30ed0 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 3d 3d  info.iOverflow==
30ee0 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
30ef0 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 2f 2a 20 4e  SQLITE_OK;  /* N
30f00 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  o overflow pages
30f10 2e 20 52 65 74 75 72 6e 20 77 69 74 68 6f 75 74  . Return without
30f20 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 20   doing anything 
30f30 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 65  */.  }.  if( pCe
30f40 6c 6c 2b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f  ll+info.iOverflo
30f50 77 2b 33 20 3e 20 70 50 61 67 65 2d 3e 61 44 61  w+3 > pPage->aDa
30f60 74 61 2b 70 50 61 67 65 2d 3e 6d 61 73 6b 50 61  ta+pPage->maskPa
30f70 67 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ge ){.    return
30f80 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
30f90 42 4b 50 54 3b 20 20 2f 2a 20 43 65 6c 6c 20 65  BKPT;  /* Cell e
30fa0 78 74 65 6e 64 73 20 70 61 73 74 20 65 6e 64 20  xtends past end 
30fb0 6f 66 20 70 61 67 65 20 2a 2f 0a 20 20 7d 0a 20  of page */.  }. 
30fc0 20 6f 76 66 6c 50 67 6e 6f 20 3d 20 67 65 74 34   ovflPgno = get4
30fd0 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f  byte(&pCell[info
30fe0 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a 20 20  .iOverflow]);.  
30ff0 61 73 73 65 72 74 28 20 70 42 74 2d 3e 75 73 61  assert( pBt->usa
31000 62 6c 65 53 69 7a 65 20 3e 20 34 20 29 3b 0a 20  bleSize > 4 );. 
31010 20 6f 76 66 6c 50 61 67 65 53 69 7a 65 20 3d 20   ovflPageSize = 
31020 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
31030 2d 20 34 3b 0a 20 20 6e 4f 76 66 6c 20 3d 20 28  - 4;.  nOvfl = (
31040 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 2d 20  info.nPayload - 
31050 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2b 20 6f 76  info.nLocal + ov
31060 66 6c 50 61 67 65 53 69 7a 65 20 2d 20 31 29 2f  flPageSize - 1)/
31070 6f 76 66 6c 50 61 67 65 53 69 7a 65 3b 0a 20 20  ovflPageSize;.  
31080 61 73 73 65 72 74 28 20 6e 4f 76 66 6c 3e 30 20  assert( nOvfl>0 
31090 7c 7c 20 0a 20 20 20 20 28 43 4f 52 52 55 50 54  || .    (CORRUPT
310a0 5f 44 42 20 26 26 20 28 69 6e 66 6f 2e 6e 50 61  _DB && (info.nPa
310b0 79 6c 6f 61 64 20 2b 20 6f 76 66 6c 50 61 67 65  yload + ovflPage
310c0 53 69 7a 65 29 3c 6f 76 66 6c 50 61 67 65 53 69  Size)<ovflPageSi
310d0 7a 65 29 0a 20 20 29 3b 0a 20 20 77 68 69 6c 65  ze).  );.  while
310e0 28 20 6e 4f 76 66 6c 2d 2d 20 29 7b 0a 20 20 20  ( nOvfl-- ){.   
310f0 20 50 67 6e 6f 20 69 4e 65 78 74 20 3d 20 30 3b   Pgno iNext = 0;
31100 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f  .    MemPage *pO
31110 76 66 6c 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  vfl = 0;.    if(
31120 20 6f 76 66 6c 50 67 6e 6f 3c 32 20 7c 7c 20 6f   ovflPgno<2 || o
31130 76 66 6c 50 67 6e 6f 3e 62 74 72 65 65 50 61 67  vflPgno>btreePag
31140 65 63 6f 75 6e 74 28 70 42 74 29 20 29 7b 0a 20  ecount(pBt) ){. 
31150 20 20 20 20 20 2f 2a 20 30 20 69 73 20 6e 6f 74       /* 0 is not
31160 20 61 20 6c 65 67 61 6c 20 70 61 67 65 20 6e 75   a legal page nu
31170 6d 62 65 72 20 61 6e 64 20 70 61 67 65 20 31 20  mber and page 1 
31180 63 61 6e 6e 6f 74 20 62 65 20 61 6e 20 0a 20 20  cannot be an .  
31190 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20      ** overflow 
311a0 70 61 67 65 2e 20 54 68 65 72 65 66 6f 72 65 20  page. Therefore 
311b0 69 66 20 6f 76 66 6c 50 67 6e 6f 3c 32 20 6f 72  if ovflPgno<2 or
311c0 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66   past the end of
311d0 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 66   the .      ** f
311e0 69 6c 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ile the database
311f0 20 6d 75 73 74 20 62 65 20 63 6f 72 72 75 70 74   must be corrupt
31200 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72  . */.      retur
31210 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
31220 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20  _BKPT;.    }.   
31230 20 69 66 28 20 6e 4f 76 66 6c 20 29 7b 0a 20 20   if( nOvfl ){.  
31240 20 20 20 20 72 63 20 3d 20 67 65 74 4f 76 65 72      rc = getOver
31250 66 6c 6f 77 50 61 67 65 28 70 42 74 2c 20 6f 76  flowPage(pBt, ov
31260 66 6c 50 67 6e 6f 2c 20 26 70 4f 76 66 6c 2c 20  flPgno, &pOvfl, 
31270 26 69 4e 65 78 74 29 3b 0a 20 20 20 20 20 20 69  &iNext);.      i
31280 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
31290 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  c;.    }..    if
312a0 28 20 28 20 70 4f 76 66 6c 20 7c 7c 20 28 28 70  ( ( pOvfl || ((p
312b0 4f 76 66 6c 20 3d 20 62 74 72 65 65 50 61 67 65  Ovfl = btreePage
312c0 4c 6f 6f 6b 75 70 28 70 42 74 2c 20 6f 76 66 6c  Lookup(pBt, ovfl
312d0 50 67 6e 6f 29 29 21 3d 30 29 20 29 0a 20 20 20  Pgno))!=0) ).   
312e0 20 20 26 26 20 73 71 6c 69 74 65 33 50 61 67 65    && sqlite3Page
312f0 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28 70 4f  rPageRefcount(pO
31300 76 66 6c 2d 3e 70 44 62 50 61 67 65 29 21 3d 31  vfl->pDbPage)!=1
31310 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a  .    ){.      /*
31320 20 54 68 65 72 65 20 69 73 20 6e 6f 20 72 65 61   There is no rea
31330 73 6f 6e 20 61 6e 79 20 63 75 72 73 6f 72 20 73  son any cursor s
31340 68 6f 75 6c 64 20 68 61 76 65 20 61 6e 20 6f 75  hould have an ou
31350 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65  tstanding refere
31360 6e 63 65 20 0a 20 20 20 20 20 20 2a 2a 20 74 6f  nce .      ** to
31370 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
31380 65 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 61  e belonging to a
31390 20 63 65 6c 6c 20 74 68 61 74 20 69 73 20 62 65   cell that is be
313a0 69 6e 67 20 64 65 6c 65 74 65 64 2f 75 70 64 61  ing deleted/upda
313b0 74 65 64 2e 0a 20 20 20 20 20 20 2a 2a 20 53 6f  ted..      ** So
313c0 20 69 66 20 74 68 65 72 65 20 65 78 69 73 74 73   if there exists
313d0 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 72   more than one r
313e0 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 69 73  eference to this
313f0 20 70 61 67 65 2c 20 74 68 65 6e 20 69 74 20 0a   page, then it .
31400 20 20 20 20 20 20 2a 2a 20 6d 75 73 74 20 6e 6f        ** must no
31410 74 20 72 65 61 6c 6c 79 20 62 65 20 61 6e 20 6f  t really be an o
31420 76 65 72 66 6c 6f 77 20 70 61 67 65 20 61 6e 64  verflow page and
31430 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6d 75   the database mu
31440 73 74 20 62 65 20 63 6f 72 72 75 70 74 2e 20 0a  st be corrupt. .
31450 20 20 20 20 20 20 2a 2a 20 49 74 20 69 73 20 68        ** It is h
31460 65 6c 70 66 75 6c 20 74 6f 20 64 65 74 65 63 74  elpful to detect
31470 20 74 68 69 73 20 62 65 66 6f 72 65 20 63 61 6c   this before cal
31480 6c 69 6e 67 20 66 72 65 65 50 61 67 65 32 28 29  ling freePage2()
31490 2c 20 61 73 20 0a 20 20 20 20 20 20 2a 2a 20 66  , as .      ** f
314a0 72 65 65 50 61 67 65 32 28 29 20 6d 61 79 20 7a  reePage2() may z
314b0 65 72 6f 20 74 68 65 20 70 61 67 65 20 63 6f 6e  ero the page con
314c0 74 65 6e 74 73 20 69 66 20 73 65 63 75 72 65 2d  tents if secure-
314d0 64 65 6c 65 74 65 20 6d 6f 64 65 20 69 73 0a 20  delete mode is. 
314e0 20 20 20 20 20 2a 2a 20 65 6e 61 62 6c 65 64 2e       ** enabled.
314f0 20 49 66 20 74 68 69 73 20 27 6f 76 65 72 66 6c   If this 'overfl
31500 6f 77 27 20 70 61 67 65 20 68 61 70 70 65 6e 73  ow' page happens
31510 20 74 6f 20 62 65 20 61 20 70 61 67 65 20 74 68   to be a page th
31520 61 74 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  at the.      ** 
31530 63 61 6c 6c 65 72 20 69 73 20 69 74 65 72 61 74  caller is iterat
31540 69 6e 67 20 74 68 72 6f 75 67 68 20 6f 72 20 75  ing through or u
31550 73 69 6e 67 20 69 6e 20 73 6f 6d 65 20 6f 74 68  sing in some oth
31560 65 72 20 77 61 79 2c 20 74 68 69 73 0a 20 20 20  er way, this.   
31570 20 20 20 2a 2a 20 63 61 6e 20 62 65 20 70 72 6f     ** can be pro
31580 62 6c 65 6d 61 74 69 63 2e 0a 20 20 20 20 20 20  blematic..      
31590 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  */.      rc = SQ
315a0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
315b0 54 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  T;.    }else{.  
315c0 20 20 20 20 72 63 20 3d 20 66 72 65 65 50 61 67      rc = freePag
315d0 65 32 28 70 42 74 2c 20 70 4f 76 66 6c 2c 20 6f  e2(pBt, pOvfl, o
315e0 76 66 6c 50 67 6e 6f 29 3b 0a 20 20 20 20 7d 0a  vflPgno);.    }.
315f0 0a 20 20 20 20 69 66 28 20 70 4f 76 66 6c 20 29  .    if( pOvfl )
31600 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  {.      sqlite3P
31610 61 67 65 72 55 6e 72 65 66 28 70 4f 76 66 6c 2d  agerUnref(pOvfl-
31620 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 7d  >pDbPage);.    }
31630 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
31640 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 6f 76 66  turn rc;.    ovf
31650 6c 50 67 6e 6f 20 3d 20 69 4e 65 78 74 3b 0a 20  lPgno = iNext;. 
31660 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
31670 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
31680 43 72 65 61 74 65 20 74 68 65 20 62 79 74 65 20  Create the byte 
31690 73 65 71 75 65 6e 63 65 20 75 73 65 64 20 74 6f  sequence used to
316a0 20 72 65 70 72 65 73 65 6e 74 20 61 20 63 65 6c   represent a cel
316b0 6c 20 6f 6e 20 70 61 67 65 20 70 50 61 67 65 0a  l on page pPage.
316c0 2a 2a 20 61 6e 64 20 77 72 69 74 65 20 74 68 61  ** and write tha
316d0 74 20 62 79 74 65 20 73 65 71 75 65 6e 63 65 20  t byte sequence 
316e0 69 6e 74 6f 20 70 43 65 6c 6c 5b 5d 2e 20 20 4f  into pCell[].  O
316f0 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61 72  verflow pages ar
31700 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61  e.** allocated a
31710 6e 64 20 66 69 6c 6c 65 64 20 69 6e 20 61 73 20  nd filled in as 
31720 6e 65 63 65 73 73 61 72 79 2e 20 20 54 68 65 20  necessary.  The 
31730 63 61 6c 6c 69 6e 67 20 70 72 6f 63 65 64 75 72  calling procedur
31740 65 0a 2a 2a 20 69 73 20 72 65 73 70 6f 6e 73 69  e.** is responsi
31750 62 6c 65 20 66 6f 72 20 6d 61 6b 69 6e 67 20 73  ble for making s
31760 75 72 65 20 73 75 66 66 69 63 69 65 6e 74 20 73  ure sufficient s
31770 70 61 63 65 20 68 61 73 20 62 65 65 6e 20 61 6c  pace has been al
31780 6c 6f 63 61 74 65 64 0a 2a 2a 20 66 6f 72 20 70  located.** for p
31790 43 65 6c 6c 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 4e 6f  Cell[]..**.** No
317a0 74 65 20 74 68 61 74 20 70 43 65 6c 6c 20 64 6f  te that pCell do
317b0 65 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79  es not necessary
317c0 20 6e 65 65 64 20 74 6f 20 70 6f 69 6e 74 20 74   need to point t
317d0 6f 20 74 68 65 20 70 50 61 67 65 2d 3e 61 44 61  o the pPage->aDa
317e0 74 61 0a 2a 2a 20 61 72 65 61 2e 20 20 70 43 65  ta.** area.  pCe
317f0 6c 6c 20 6d 69 67 68 74 20 70 6f 69 6e 74 20 74  ll might point t
31800 6f 20 73 6f 6d 65 20 74 65 6d 70 6f 72 61 72 79  o some temporary
31810 20 73 74 6f 72 61 67 65 2e 20 20 54 68 65 20 63   storage.  The c
31820 65 6c 6c 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 63  ell will.** be c
31830 6f 6e 73 74 72 75 63 74 65 64 20 69 6e 20 74 68  onstructed in th
31840 69 73 20 74 65 6d 70 6f 72 61 72 79 20 61 72 65  is temporary are
31850 61 20 74 68 65 6e 20 63 6f 70 69 65 64 20 69 6e  a then copied in
31860 74 6f 20 70 50 61 67 65 2d 3e 61 44 61 74 61 0a  to pPage->aData.
31870 2a 2a 20 6c 61 74 65 72 2e 0a 2a 2f 0a 73 74 61  ** later..*/.sta
31880 74 69 63 20 69 6e 74 20 66 69 6c 6c 49 6e 43 65  tic int fillInCe
31890 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  ll(.  MemPage *p
318a0 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 20  Page,           
318b0 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65       /* The page
318c0 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74   that contains t
318d0 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 6e 73  he cell */.  uns
318e0 69 67 6e 65 64 20 63 68 61 72 20 2a 70 43 65 6c  igned char *pCel
318f0 6c 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43  l,          /* C
31900 6f 6d 70 6c 65 74 65 20 74 65 78 74 20 6f 66 20  omplete text of 
31910 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 63 6f  the cell */.  co
31920 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20  nst void *pKey, 
31930 69 36 34 20 6e 4b 65 79 2c 20 20 20 20 2f 2a 20  i64 nKey,    /* 
31940 54 68 65 20 6b 65 79 20 2a 2f 0a 20 20 63 6f 6e  The key */.  con
31950 73 74 20 76 6f 69 64 20 2a 70 44 61 74 61 2c 69  st void *pData,i
31960 6e 74 20 6e 44 61 74 61 2c 20 20 20 2f 2a 20 54  nt nData,   /* T
31970 68 65 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74  he data */.  int
31980 20 6e 5a 65 72 6f 2c 20 20 20 20 20 20 20 20 20   nZero,         
31990 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
319a0 78 74 72 61 20 7a 65 72 6f 20 62 79 74 65 73 20  xtra zero bytes 
319b0 74 6f 20 61 70 70 65 6e 64 20 74 6f 20 70 44 61  to append to pDa
319c0 74 61 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 53  ta */.  int *pnS
319d0 69 7a 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ize             
319e0 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
319f0 63 65 6c 6c 20 73 69 7a 65 20 68 65 72 65 20 2a  cell size here *
31a00 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 50 61 79 6c  /.){.  int nPayl
31a10 6f 61 64 3b 0a 20 20 63 6f 6e 73 74 20 75 38 20  oad;.  const u8 
31a20 2a 70 53 72 63 3b 0a 20 20 69 6e 74 20 6e 53 72  *pSrc;.  int nSr
31a30 63 2c 20 6e 2c 20 72 63 3b 0a 20 20 69 6e 74 20  c, n, rc;.  int 
31a40 73 70 61 63 65 4c 65 66 74 3b 0a 20 20 4d 65 6d  spaceLeft;.  Mem
31a50 50 61 67 65 20 2a 70 4f 76 66 6c 20 3d 20 30 3b  Page *pOvfl = 0;
31a60 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 6f 52  .  MemPage *pToR
31a70 65 6c 65 61 73 65 20 3d 20 30 3b 0a 20 20 75 6e  elease = 0;.  un
31a80 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 50 72  signed char *pPr
31a90 69 6f 72 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  ior;.  unsigned 
31aa0 63 68 61 72 20 2a 70 50 61 79 6c 6f 61 64 3b 0a  char *pPayload;.
31ab0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
31ac0 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20  = pPage->pBt;.  
31ad0 50 67 6e 6f 20 70 67 6e 6f 4f 76 66 6c 20 3d 20  Pgno pgnoOvfl = 
31ae0 30 3b 0a 20 20 69 6e 74 20 6e 48 65 61 64 65 72  0;.  int nHeader
31af0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
31b00 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
31b10 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
31b20 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 70 50 61 67  x) );..  /* pPag
31b30 65 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61  e is not necessa
31b40 72 69 6c 79 20 77 72 69 74 65 61 62 6c 65 20 73  rily writeable s
31b50 69 6e 63 65 20 70 43 65 6c 6c 20 6d 69 67 68 74  ince pCell might
31b60 20 62 65 20 61 75 78 69 6c 69 61 72 79 0a 20 20   be auxiliary.  
31b70 2a 2a 20 62 75 66 66 65 72 20 73 70 61 63 65 20  ** buffer space 
31b80 74 68 61 74 20 69 73 20 73 65 70 61 72 61 74 65  that is separate
31b90 20 66 72 6f 6d 20 74 68 65 20 70 50 61 67 65 20   from the pPage 
31ba0 62 75 66 66 65 72 20 61 72 65 61 20 2a 2f 0a 20  buffer area */. 
31bb0 20 61 73 73 65 72 74 28 20 70 43 65 6c 6c 3c 70   assert( pCell<p
31bc0 50 61 67 65 2d 3e 61 44 61 74 61 20 7c 7c 20 70  Page->aData || p
31bd0 43 65 6c 6c 3e 3d 26 70 50 61 67 65 2d 3e 61 44  Cell>=&pPage->aD
31be0 61 74 61 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a  ata[pBt->pageSiz
31bf0 65 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c  e].            |
31c00 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  | sqlite3PagerIs
31c10 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
31c20 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20  >pDbPage) );..  
31c30 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 68  /* Fill in the h
31c40 65 61 64 65 72 2e 20 2a 2f 0a 20 20 6e 48 65 61  eader. */.  nHea
31c50 64 65 72 20 3d 20 70 50 61 67 65 2d 3e 63 68 69  der = pPage->chi
31c60 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20 6e 50 61  ldPtrSize;.  nPa
31c70 79 6c 6f 61 64 20 3d 20 6e 44 61 74 61 20 2b 20  yload = nData + 
31c80 6e 5a 65 72 6f 3b 0a 20 20 69 66 28 20 70 50 61  nZero;.  if( pPa
31c90 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20 29  ge->intKeyLeaf )
31ca0 7b 0a 20 20 20 20 6e 48 65 61 64 65 72 20 2b 3d  {.    nHeader +=
31cb0 20 70 75 74 56 61 72 69 6e 74 33 32 28 26 70 43   putVarint32(&pC
31cc0 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c 20 6e 50  ell[nHeader], nP
31cd0 61 79 6c 6f 61 64 29 3b 0a 20 20 7d 65 6c 73 65  ayload);.  }else
31ce0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 44  {.    assert( nD
31cf0 61 74 61 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  ata==0 );.    as
31d00 73 65 72 74 28 20 6e 5a 65 72 6f 3d 3d 30 20 29  sert( nZero==0 )
31d10 3b 0a 20 20 7d 0a 20 20 6e 48 65 61 64 65 72 20  ;.  }.  nHeader 
31d20 2b 3d 20 70 75 74 56 61 72 69 6e 74 28 26 70 43  += putVarint(&pC
31d30 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c 20 2a 28  ell[nHeader], *(
31d40 75 36 34 2a 29 26 6e 4b 65 79 29 3b 0a 20 20 0a  u64*)&nKey);.  .
31d50 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65    /* Fill in the
31d60 20 70 61 79 6c 6f 61 64 20 73 69 7a 65 20 2a 2f   payload size */
31d70 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e  .  if( pPage->in
31d80 74 4b 65 79 20 29 7b 0a 20 20 20 20 70 53 72 63  tKey ){.    pSrc
31d90 20 3d 20 70 44 61 74 61 3b 0a 20 20 20 20 6e 53   = pData;.    nS
31da0 72 63 20 3d 20 6e 44 61 74 61 3b 0a 20 20 20 20  rc = nData;.    
31db0 6e 44 61 74 61 20 3d 20 30 3b 0a 20 20 7d 65 6c  nData = 0;.  }el
31dc0 73 65 7b 20 0a 20 20 20 20 69 66 28 20 4e 45 56  se{ .    if( NEV
31dd0 45 52 28 6e 4b 65 79 3e 30 78 37 66 66 66 66 66  ER(nKey>0x7fffff
31de0 66 66 20 7c 7c 20 70 4b 65 79 3d 3d 30 29 20 29  ff || pKey==0) )
31df0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
31e00 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
31e10 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 50  PT;.    }.    nP
31e20 61 79 6c 6f 61 64 20 3d 20 28 69 6e 74 29 6e 4b  ayload = (int)nK
31e30 65 79 3b 0a 20 20 20 20 70 53 72 63 20 3d 20 70  ey;.    pSrc = p
31e40 4b 65 79 3b 0a 20 20 20 20 6e 53 72 63 20 3d 20  Key;.    nSrc = 
31e50 28 69 6e 74 29 6e 4b 65 79 3b 0a 20 20 7d 0a 20  (int)nKey;.  }. 
31e60 20 69 66 28 20 6e 50 61 79 6c 6f 61 64 3c 3d 70   if( nPayload<=p
31e70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29  Page->maxLocal )
31e80 7b 0a 20 20 20 20 6e 20 3d 20 6e 48 65 61 64 65  {.    n = nHeade
31e90 72 20 2b 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20  r + nPayload;.  
31ea0 20 20 74 65 73 74 63 61 73 65 28 20 6e 3d 3d 33    testcase( n==3
31eb0 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
31ec0 28 20 6e 3d 3d 34 20 29 3b 0a 20 20 20 20 69 66  ( n==4 );.    if
31ed0 28 20 6e 3c 34 20 29 20 6e 20 3d 20 34 3b 0a 20  ( n<4 ) n = 4;. 
31ee0 20 20 20 2a 70 6e 53 69 7a 65 20 3d 20 6e 3b 0a     *pnSize = n;.
31ef0 20 20 20 20 73 70 61 63 65 4c 65 66 74 20 3d 20      spaceLeft = 
31f00 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20 70 50  nPayload;.    pP
31f10 72 69 6f 72 20 3d 20 70 43 65 6c 6c 3b 0a 20 20  rior = pCell;.  
31f20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6d  }else{.    int m
31f30 6e 20 3d 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f  n = pPage->minLo
31f40 63 61 6c 3b 0a 20 20 20 20 6e 20 3d 20 6d 6e 20  cal;.    n = mn 
31f50 2b 20 28 6e 50 61 79 6c 6f 61 64 20 2d 20 6d 6e  + (nPayload - mn
31f60 29 20 25 20 28 70 50 61 67 65 2d 3e 70 42 74 2d  ) % (pPage->pBt-
31f70 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 29  >usableSize - 4)
31f80 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
31f90 6e 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  n==pPage->maxLoc
31fa0 61 6c 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  al );.    testca
31fb0 73 65 28 20 6e 3d 3d 70 50 61 67 65 2d 3e 6d 61  se( n==pPage->ma
31fc0 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 20 20  xLocal+1 );.    
31fd0 69 66 28 20 6e 20 3e 20 70 50 61 67 65 2d 3e 6d  if( n > pPage->m
31fe0 61 78 4c 6f 63 61 6c 20 29 20 6e 20 3d 20 6d 6e  axLocal ) n = mn
31ff0 3b 0a 20 20 20 20 73 70 61 63 65 4c 65 66 74 20  ;.    spaceLeft 
32000 3d 20 6e 3b 0a 20 20 20 20 2a 70 6e 53 69 7a 65  = n;.    *pnSize
32010 20 3d 20 6e 20 2b 20 6e 48 65 61 64 65 72 20 2b   = n + nHeader +
32020 20 34 3b 0a 20 20 20 20 70 50 72 69 6f 72 20 3d   4;.    pPrior =
32030 20 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 2b   &pCell[nHeader+
32040 6e 5d 3b 0a 20 20 7d 0a 20 20 70 50 61 79 6c 6f  n];.  }.  pPaylo
32050 61 64 20 3d 20 26 70 43 65 6c 6c 5b 6e 48 65 61  ad = &pCell[nHea
32060 64 65 72 5d 3b 0a 0a 20 20 2f 2a 20 41 74 20 74  der];..  /* At t
32070 68 69 73 20 70 6f 69 6e 74 20 76 61 72 69 61 62  his point variab
32080 6c 65 73 20 73 68 6f 75 6c 64 20 62 65 20 73 65  les should be se
32090 74 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20  t as follows:.  
320a0 2a 2a 0a 20 20 2a 2a 20 20 20 6e 50 61 79 6c 6f  **.  **   nPaylo
320b0 61 64 20 20 20 20 20 20 20 20 20 20 20 54 6f 74  ad           Tot
320c0 61 6c 20 70 61 79 6c 6f 61 64 20 73 69 7a 65 20  al payload size 
320d0 69 6e 20 62 79 74 65 73 0a 20 20 2a 2a 20 20 20  in bytes.  **   
320e0 70 50 61 79 6c 6f 61 64 20 20 20 20 20 20 20 20  pPayload        
320f0 20 20 20 42 65 67 69 6e 20 77 72 69 74 69 6e 67     Begin writing
32100 20 70 61 79 6c 6f 61 64 20 68 65 72 65 0a 20 20   payload here.  
32110 2a 2a 20 20 20 73 70 61 63 65 4c 65 66 74 20 20  **   spaceLeft  
32120 20 20 20 20 20 20 20 20 53 70 61 63 65 20 61 76          Space av
32130 61 69 6c 61 62 6c 65 20 61 74 20 70 50 61 79 6c  ailable at pPayl
32140 6f 61 64 2e 20 20 49 66 20 6e 50 61 79 6c 6f 61  oad.  If nPayloa
32150 64 3e 73 70 61 63 65 4c 65 66 74 2c 0a 20 20 2a  d>spaceLeft,.  *
32160 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
32170 20 20 20 20 20 20 20 74 68 61 74 20 6d 65 61 6e         that mean
32180 73 20 63 6f 6e 74 65 6e 74 20 6d 75 73 74 20 73  s content must s
32190 70 69 6c 6c 20 69 6e 74 6f 20 6f 76 65 72 66 6c  pill into overfl
321a0 6f 77 20 70 61 67 65 73 2e 0a 20 20 2a 2a 20 20  ow pages..  **  
321b0 20 2a 70 6e 53 69 7a 65 20 20 20 20 20 20 20 20   *pnSize        
321c0 20 20 20 20 53 69 7a 65 20 6f 66 20 74 68 65 20      Size of the 
321d0 6c 6f 63 61 6c 20 63 65 6c 6c 20 28 6e 6f 74 20  local cell (not 
321e0 63 6f 75 6e 74 69 6e 67 20 6f 76 65 72 66 6c 6f  counting overflo
321f0 77 20 70 61 67 65 73 29 0a 20 20 2a 2a 20 20 20  w pages).  **   
32200 70 50 72 69 6f 72 20 20 20 20 20 20 20 20 20 20  pPrior          
32210 20 20 20 57 68 65 72 65 20 74 6f 20 77 72 69 74     Where to writ
32220 65 20 74 68 65 20 70 67 6e 6f 20 6f 66 20 74 68  e the pgno of th
32230 65 20 66 69 72 73 74 20 6f 76 65 72 66 6c 6f 77  e first overflow
32240 20 70 61 67 65 0a 20 20 2a 2a 0a 20 20 2a 2a 20   page.  **.  ** 
32250 55 73 65 20 61 20 63 61 6c 6c 20 74 6f 20 62 74  Use a call to bt
32260 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28  reeParseCellPtr(
32270 29 20 74 6f 20 76 65 72 69 66 79 20 74 68 61 74  ) to verify that
32280 20 74 68 65 20 76 61 6c 75 65 73 20 61 62 6f 76   the values abov
32290 65 0a 20 20 2a 2a 20 77 65 72 65 20 63 6f 6d 70  e.  ** were comp
322a0 75 74 65 64 20 63 6f 72 72 65 63 74 6c 79 2e 0a  uted correctly..
322b0 20 20 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f    */.#if SQLITE_
322c0 44 45 42 55 47 0a 20 20 7b 0a 20 20 20 20 43 65  DEBUG.  {.    Ce
322d0 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20  llInfo info;.   
322e0 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50   btreeParseCellP
322f0 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c  tr(pPage, pCell,
32300 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 61 73 73   &info);.    ass
32310 65 72 74 28 20 6e 48 65 61 64 65 72 3d 28 69 6e  ert( nHeader=(in
32320 74 29 28 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64  t)(info.pPayload
32330 20 2d 20 70 43 65 6c 6c 29 20 29 3b 0a 20 20 20   - pCell) );.   
32340 20 61 73 73 65 72 74 28 20 69 6e 66 6f 2e 6e 4b   assert( info.nK
32350 65 79 3d 3d 6e 4b 65 79 20 29 3b 0a 20 20 20 20  ey==nKey );.    
32360 61 73 73 65 72 74 28 20 2a 70 6e 53 69 7a 65 20  assert( *pnSize 
32370 3d 3d 20 69 6e 66 6f 2e 6e 53 69 7a 65 20 29 3b  == info.nSize );
32380 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 70 61  .    assert( spa
32390 63 65 4c 65 66 74 20 3d 3d 20 69 6e 66 6f 2e 6e  ceLeft == info.n
323a0 4c 6f 63 61 6c 20 29 3b 0a 20 20 20 20 61 73 73  Local );.    ass
323b0 65 72 74 28 20 70 50 72 69 6f 72 20 3d 3d 20 26  ert( pPrior == &
323c0 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72  pCell[info.iOver
323d0 66 6c 6f 77 5d 20 29 3b 0a 20 20 7d 0a 23 65 6e  flow] );.  }.#en
323e0 64 69 66 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20  dif..  /* Write 
323f0 74 68 65 20 70 61 79 6c 6f 61 64 20 69 6e 74 6f  the payload into
32400 20 74 68 65 20 6c 6f 63 61 6c 20 43 65 6c 6c 20   the local Cell 
32410 61 6e 64 20 61 6e 79 20 65 78 74 72 61 20 69 6e  and any extra in
32420 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  to overflow page
32430 73 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 6e 50  s */.  while( nP
32440 61 79 6c 6f 61 64 3e 30 20 29 7b 0a 20 20 20 20  ayload>0 ){.    
32450 69 66 28 20 73 70 61 63 65 4c 65 66 74 3d 3d 30  if( spaceLeft==0
32460 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   ){.#ifndef SQLI
32470 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
32480 55 4d 0a 20 20 20 20 20 20 50 67 6e 6f 20 70 67  UM.      Pgno pg
32490 6e 6f 50 74 72 6d 61 70 20 3d 20 70 67 6e 6f 4f  noPtrmap = pgnoO
324a0 76 66 6c 3b 20 2f 2a 20 4f 76 65 72 66 6c 6f 77  vfl; /* Overflow
324b0 20 70 61 67 65 20 70 6f 69 6e 74 65 72 2d 6d 61   page pointer-ma
324c0 70 20 65 6e 74 72 79 20 70 61 67 65 20 2a 2f 0a  p entry page */.
324d0 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61        if( pBt->a
324e0 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20  utoVacuum ){.   
324f0 20 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 20       do{.       
32500 20 20 20 70 67 6e 6f 4f 76 66 6c 2b 2b 3b 0a 20     pgnoOvfl++;. 
32510 20 20 20 20 20 20 20 7d 20 77 68 69 6c 65 28 20         } while( 
32520 0a 20 20 20 20 20 20 20 20 20 20 50 54 52 4d 41  .          PTRMA
32530 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 70 67  P_ISPAGE(pBt, pg
32540 6e 6f 4f 76 66 6c 29 20 7c 7c 20 70 67 6e 6f 4f  noOvfl) || pgnoO
32550 76 66 6c 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54  vfl==PENDING_BYT
32560 45 5f 50 41 47 45 28 70 42 74 29 20 0a 20 20 20  E_PAGE(pBt) .   
32570 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a       );.      }.
32580 23 65 6e 64 69 66 0a 20 20 20 20 20 20 72 63 20  #endif.      rc 
32590 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50  = allocateBtreeP
325a0 61 67 65 28 70 42 74 2c 20 26 70 4f 76 66 6c 2c  age(pBt, &pOvfl,
325b0 20 26 70 67 6e 6f 4f 76 66 6c 2c 20 70 67 6e 6f   &pgnoOvfl, pgno
325c0 4f 76 66 6c 2c 20 30 29 3b 0a 23 69 66 6e 64 65  Ovfl, 0);.#ifnde
325d0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
325e0 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 2f  TOVACUUM.      /
325f0 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73  * If the databas
32600 65 20 73 75 70 70 6f 72 74 73 20 61 75 74 6f 2d  e supports auto-
32610 76 61 63 75 75 6d 2c 20 61 6e 64 20 74 68 65 20  vacuum, and the 
32620 73 65 63 6f 6e 64 20 6f 72 20 73 75 62 73 65 71  second or subseq
32630 75 65 6e 74 0a 20 20 20 20 20 20 2a 2a 20 6f 76  uent.      ** ov
32640 65 72 66 6c 6f 77 20 70 61 67 65 20 69 73 20 62  erflow page is b
32650 65 69 6e 67 20 61 6c 6c 6f 63 61 74 65 64 2c 20  eing allocated, 
32660 61 64 64 20 61 6e 20 65 6e 74 72 79 20 74 6f 20  add an entry to 
32670 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a  the pointer-map.
32680 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 61        ** for tha
32690 74 20 70 61 67 65 20 6e 6f 77 2e 20 0a 20 20 20  t page now. .   
326a0 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49     **.      ** I
326b0 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69  f this is the fi
326c0 72 73 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  rst overflow pag
326d0 65 2c 20 74 68 65 6e 20 77 72 69 74 65 20 61 20  e, then write a 
326e0 70 61 72 74 69 61 6c 20 65 6e 74 72 79 20 0a 20  partial entry . 
326f0 20 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 70       ** to the p
32700 6f 69 6e 74 65 72 2d 6d 61 70 2e 20 49 66 20 77  ointer-map. If w
32710 65 20 77 72 69 74 65 20 6e 6f 74 68 69 6e 67 20  e write nothing 
32720 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 65 72 2d  to this pointer-
32730 6d 61 70 20 73 6c 6f 74 2c 0a 20 20 20 20 20 20  map slot,.      
32740 2a 2a 20 74 68 65 6e 20 74 68 65 20 6f 70 74 69  ** then the opti
32750 6d 69 73 74 69 63 20 6f 76 65 72 66 6c 6f 77 20  mistic overflow 
32760 63 68 61 69 6e 20 70 72 6f 63 65 73 73 69 6e 67  chain processing
32770 20 69 6e 20 63 6c 65 61 72 43 65 6c 6c 28 29 0a   in clearCell().
32780 20 20 20 20 20 20 2a 2a 20 6d 61 79 20 6d 69 73        ** may mis
32790 69 6e 74 65 72 70 72 65 74 20 74 68 65 20 75 6e  interpret the un
327a0 69 6e 69 74 69 61 6c 69 7a 65 64 20 76 61 6c 75  initialized valu
327b0 65 73 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68  es and delete th
327c0 65 0a 20 20 20 20 20 20 2a 2a 20 77 72 6f 6e 67  e.      ** wrong
327d0 20 70 61 67 65 73 20 66 72 6f 6d 20 74 68 65 20   pages from the 
327e0 64 61 74 61 62 61 73 65 2e 0a 20 20 20 20 20 20  database..      
327f0 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 42 74  */.      if( pBt
32800 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 26 26 20  ->autoVacuum && 
32810 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
32820 0a 20 20 20 20 20 20 20 20 75 38 20 65 54 79 70  .        u8 eTyp
32830 65 20 3d 20 28 70 67 6e 6f 50 74 72 6d 61 70 3f  e = (pgnoPtrmap?
32840 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32  PTRMAP_OVERFLOW2
32850 3a 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57  :PTRMAP_OVERFLOW
32860 31 29 3b 0a 20 20 20 20 20 20 20 20 70 74 72 6d  1);.        ptrm
32870 61 70 50 75 74 28 70 42 74 2c 20 70 67 6e 6f 4f  apPut(pBt, pgnoO
32880 76 66 6c 2c 20 65 54 79 70 65 2c 20 70 67 6e 6f  vfl, eType, pgno
32890 50 74 72 6d 61 70 2c 20 26 72 63 29 3b 0a 20 20  Ptrmap, &rc);.  
328a0 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
328b0 20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61 73            releas
328c0 65 50 61 67 65 28 70 4f 76 66 6c 29 3b 0a 20 20  ePage(pOvfl);.  
328d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
328e0 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66 28  #endif.      if(
328f0 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 72   rc ){.        r
32900 65 6c 65 61 73 65 50 61 67 65 28 70 54 6f 52 65  eleasePage(pToRe
32910 6c 65 61 73 65 29 3b 0a 20 20 20 20 20 20 20 20  lease);.        
32920 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
32930 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   }..      /* If 
32940 70 54 6f 52 65 6c 65 61 73 65 20 69 73 20 6e 6f  pToRelease is no
32950 74 20 7a 65 72 6f 20 74 68 61 6e 20 70 50 72 69  t zero than pPri
32960 6f 72 20 70 6f 69 6e 74 73 20 69 6e 74 6f 20 74  or points into t
32970 68 65 20 64 61 74 61 20 61 72 65 61 0a 20 20 20  he data area.   
32980 20 20 20 2a 2a 20 6f 66 20 70 54 6f 52 65 6c 65     ** of pToRele
32990 61 73 65 2e 20 20 4d 61 6b 65 20 73 75 72 65 20  ase.  Make sure 
329a0 70 54 6f 52 65 6c 65 61 73 65 20 69 73 20 73 74  pToRelease is st
329b0 69 6c 6c 20 77 72 69 74 65 61 62 6c 65 2e 20 2a  ill writeable. *
329c0 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
329d0 70 54 6f 52 65 6c 65 61 73 65 3d 3d 30 20 7c 7c  pToRelease==0 ||
329e0 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
329f0 72 69 74 65 61 62 6c 65 28 70 54 6f 52 65 6c 65  riteable(pToRele
32a00 61 73 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  ase->pDbPage) );
32a10 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 70 50  ..      /* If pP
32a20 72 69 6f 72 20 69 73 20 70 61 72 74 20 6f 66 20  rior is part of 
32a30 74 68 65 20 64 61 74 61 20 61 72 65 61 20 6f 66  the data area of
32a40 20 70 50 61 67 65 2c 20 74 68 65 6e 20 6d 61 6b   pPage, then mak
32a50 65 20 73 75 72 65 20 70 50 61 67 65 0a 20 20 20  e sure pPage.   
32a60 20 20 20 2a 2a 20 69 73 20 73 74 69 6c 6c 20 77     ** is still w
32a70 72 69 74 65 61 62 6c 65 20 2a 2f 0a 20 20 20 20  riteable */.    
32a80 20 20 61 73 73 65 72 74 28 20 70 50 72 69 6f 72    assert( pPrior
32a90 3c 70 50 61 67 65 2d 3e 61 44 61 74 61 20 7c 7c  <pPage->aData ||
32aa0 20 70 50 72 69 6f 72 3e 3d 26 70 50 61 67 65 2d   pPrior>=&pPage-
32ab0 3e 61 44 61 74 61 5b 70 42 74 2d 3e 70 61 67 65  >aData[pBt->page
32ac0 53 69 7a 65 5d 0a 20 20 20 20 20 20 20 20 20 20  Size].          
32ad0 20 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65    || sqlite3Page
32ae0 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
32af0 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
32b00 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28  .      put4byte(
32b10 70 50 72 69 6f 72 2c 20 70 67 6e 6f 4f 76 66 6c  pPrior, pgnoOvfl
32b20 29 3b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  );.      release
32b30 50 61 67 65 28 70 54 6f 52 65 6c 65 61 73 65 29  Page(pToRelease)
32b40 3b 0a 20 20 20 20 20 20 70 54 6f 52 65 6c 65 61  ;.      pToRelea
32b50 73 65 20 3d 20 70 4f 76 66 6c 3b 0a 20 20 20 20  se = pOvfl;.    
32b60 20 20 70 50 72 69 6f 72 20 3d 20 70 4f 76 66 6c    pPrior = pOvfl
32b70 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 20 20 70  ->aData;.      p
32b80 75 74 34 62 79 74 65 28 70 50 72 69 6f 72 2c 20  ut4byte(pPrior, 
32b90 30 29 3b 0a 20 20 20 20 20 20 70 50 61 79 6c 6f  0);.      pPaylo
32ba0 61 64 20 3d 20 26 70 4f 76 66 6c 2d 3e 61 44 61  ad = &pOvfl->aDa
32bb0 74 61 5b 34 5d 3b 0a 20 20 20 20 20 20 73 70 61  ta[4];.      spa
32bc0 63 65 4c 65 66 74 20 3d 20 70 42 74 2d 3e 75 73  ceLeft = pBt->us
32bd0 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20  ableSize - 4;.  
32be0 20 20 7d 0a 20 20 20 20 6e 20 3d 20 6e 50 61 79    }.    n = nPay
32bf0 6c 6f 61 64 3b 0a 20 20 20 20 69 66 28 20 6e 3e  load;.    if( n>
32c00 73 70 61 63 65 4c 65 66 74 20 29 20 6e 20 3d 20  spaceLeft ) n = 
32c10 73 70 61 63 65 4c 65 66 74 3b 0a 0a 20 20 20 20  spaceLeft;..    
32c20 2f 2a 20 49 66 20 70 54 6f 52 65 6c 65 61 73 65  /* If pToRelease
32c30 20 69 73 20 6e 6f 74 20 7a 65 72 6f 20 74 68 61   is not zero tha
32c40 6e 20 70 50 61 79 6c 6f 61 64 20 70 6f 69 6e 74  n pPayload point
32c50 73 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 20  s into the data 
32c60 61 72 65 61 0a 20 20 20 20 2a 2a 20 6f 66 20 70  area.    ** of p
32c70 54 6f 52 65 6c 65 61 73 65 2e 20 20 4d 61 6b 65  ToRelease.  Make
32c80 20 73 75 72 65 20 70 54 6f 52 65 6c 65 61 73 65   sure pToRelease
32c90 20 69 73 20 73 74 69 6c 6c 20 77 72 69 74 65 61   is still writea
32ca0 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65  ble. */.    asse
32cb0 72 74 28 20 70 54 6f 52 65 6c 65 61 73 65 3d 3d  rt( pToRelease==
32cc0 30 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65  0 || sqlite3Page
32cd0 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 54 6f  rIswriteable(pTo
32ce0 52 65 6c 65 61 73 65 2d 3e 70 44 62 50 61 67 65  Release->pDbPage
32cf0 29 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  ) );..    /* If 
32d00 70 50 61 79 6c 6f 61 64 20 69 73 20 70 61 72 74  pPayload is part
32d10 20 6f 66 20 74 68 65 20 64 61 74 61 20 61 72 65   of the data are
32d20 61 20 6f 66 20 70 50 61 67 65 2c 20 74 68 65 6e  a of pPage, then
32d30 20 6d 61 6b 65 20 73 75 72 65 20 70 50 61 67 65   make sure pPage
32d40 0a 20 20 20 20 2a 2a 20 69 73 20 73 74 69 6c 6c  .    ** is still
32d50 20 77 72 69 74 65 61 62 6c 65 20 2a 2f 0a 20 20   writeable */.  
32d60 20 20 61 73 73 65 72 74 28 20 70 50 61 79 6c 6f    assert( pPaylo
32d70 61 64 3c 70 50 61 67 65 2d 3e 61 44 61 74 61 20  ad<pPage->aData 
32d80 7c 7c 20 70 50 61 79 6c 6f 61 64 3e 3d 26 70 50  || pPayload>=&pP
32d90 61 67 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e  age->aData[pBt->
32da0 70 61 67 65 53 69 7a 65 5d 0a 20 20 20 20 20 20  pageSize].      
32db0 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33        || sqlite3
32dc0 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
32dd0 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
32de0 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 6e 53 72   );..    if( nSr
32df0 63 3e 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  c>0 ){.      if(
32e00 20 6e 3e 6e 53 72 63 20 29 20 6e 20 3d 20 6e 53   n>nSrc ) n = nS
32e10 72 63 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  rc;.      assert
32e20 28 20 70 53 72 63 20 29 3b 0a 20 20 20 20 20 20  ( pSrc );.      
32e30 6d 65 6d 63 70 79 28 70 50 61 79 6c 6f 61 64 2c  memcpy(pPayload,
32e40 20 70 53 72 63 2c 20 6e 29 3b 0a 20 20 20 20 7d   pSrc, n);.    }
32e50 65 6c 73 65 7b 0a 20 20 20 20 20 20 6d 65 6d 73  else{.      mems
32e60 65 74 28 70 50 61 79 6c 6f 61 64 2c 20 30 2c 20  et(pPayload, 0, 
32e70 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 50  n);.    }.    nP
32e80 61 79 6c 6f 61 64 20 2d 3d 20 6e 3b 0a 20 20 20  ayload -= n;.   
32e90 20 70 50 61 79 6c 6f 61 64 20 2b 3d 20 6e 3b 0a   pPayload += n;.
32ea0 20 20 20 20 70 53 72 63 20 2b 3d 20 6e 3b 0a 20      pSrc += n;. 
32eb0 20 20 20 6e 53 72 63 20 2d 3d 20 6e 3b 0a 20 20     nSrc -= n;.  
32ec0 20 20 73 70 61 63 65 4c 65 66 74 20 2d 3d 20 6e    spaceLeft -= n
32ed0 3b 0a 20 20 20 20 69 66 28 20 6e 53 72 63 3d 3d  ;.    if( nSrc==
32ee0 30 20 29 7b 0a 20 20 20 20 20 20 6e 53 72 63 20  0 ){.      nSrc 
32ef0 3d 20 6e 44 61 74 61 3b 0a 20 20 20 20 20 20 70  = nData;.      p
32f00 53 72 63 20 3d 20 70 44 61 74 61 3b 0a 20 20 20  Src = pData;.   
32f10 20 7d 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65   }.  }.  release
32f20 50 61 67 65 28 70 54 6f 52 65 6c 65 61 73 65 29  Page(pToRelease)
32f30 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
32f40 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  E_OK;.}../*.** R
32f50 65 6d 6f 76 65 20 74 68 65 20 69 2d 74 68 20 63  emove the i-th c
32f60 65 6c 6c 20 66 72 6f 6d 20 70 50 61 67 65 2e 20  ell from pPage. 
32f70 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65 66   This routine ef
32f80 66 65 63 74 73 20 70 50 61 67 65 20 6f 6e 6c 79  fects pPage only
32f90 2e 0a 2a 2a 20 54 68 65 20 63 65 6c 6c 20 63 6f  ..** The cell co
32fa0 6e 74 65 6e 74 20 69 73 20 6e 6f 74 20 66 72 65  ntent is not fre
32fb0 65 64 20 6f 72 20 64 65 61 6c 6c 6f 63 61 74 65  ed or deallocate
32fc0 64 2e 20 20 49 74 20 69 73 20 61 73 73 75 6d 65  d.  It is assume
32fd0 64 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 63 65  d that.** the ce
32fe0 6c 6c 20 63 6f 6e 74 65 6e 74 20 68 61 73 20 62  ll content has b
32ff0 65 65 6e 20 63 6f 70 69 65 64 20 73 6f 6d 65 70  een copied somep
33000 6c 61 63 65 20 65 6c 73 65 2e 20 20 54 68 69 73  lace else.  This
33010 20 72 6f 75 74 69 6e 65 20 6a 75 73 74 0a 2a 2a   routine just.**
33020 20 72 65 6d 6f 76 65 73 20 74 68 65 20 72 65 66   removes the ref
33030 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 63 65  erence to the ce
33040 6c 6c 20 66 72 6f 6d 20 70 50 61 67 65 2e 0a 2a  ll from pPage..*
33050 2a 0a 2a 2a 20 22 73 7a 22 20 6d 75 73 74 20 62  *.** "sz" must b
33060 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  e the number of 
33070 62 79 74 65 73 20 69 6e 20 74 68 65 20 63 65 6c  bytes in the cel
33080 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  l..*/.static voi
33090 64 20 64 72 6f 70 43 65 6c 6c 28 4d 65 6d 50 61  d dropCell(MemPa
330a0 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 69  ge *pPage, int i
330b0 64 78 2c 20 69 6e 74 20 73 7a 2c 20 69 6e 74 20  dx, int sz, int 
330c0 2a 70 52 43 29 7b 0a 20 20 75 33 32 20 70 63 3b  *pRC){.  u32 pc;
330d0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
330e0 65 74 20 74 6f 20 63 65 6c 6c 20 63 6f 6e 74 65  et to cell conte
330f0 6e 74 20 6f 66 20 63 65 6c 6c 20 62 65 69 6e 67  nt of cell being
33100 20 64 65 6c 65 74 65 64 20 2a 2f 0a 20 20 75 38   deleted */.  u8
33110 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 2f 2a   *data;       /*
33120 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 2a 2f   pPage->aData */
33130 0a 20 20 75 38 20 2a 70 74 72 3b 20 20 20 20 20  .  u8 *ptr;     
33140 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 6d 6f     /* Used to mo
33150 76 65 20 62 79 74 65 73 20 61 72 6f 75 6e 64 20  ve bytes around 
33160 77 69 74 68 69 6e 20 64 61 74 61 5b 5d 20 2a 2f  within data[] */
33170 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
33180 20 20 20 2f 2a 20 54 68 65 20 72 65 74 75 72 6e     /* The return
33190 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 68   code */.  int h
331a0 64 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 42 65  dr;        /* Be
331b0 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 68  ginning of the h
331c0 65 61 64 65 72 2e 20 20 30 20 6d 6f 73 74 20 70  eader.  0 most p
331d0 61 67 65 73 2e 20 20 31 30 30 20 70 61 67 65 20  ages.  100 page 
331e0 31 20 2a 2f 0a 0a 20 20 69 66 28 20 2a 70 52 43  1 */..  if( *pRC
331f0 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 61 73   ) return;..  as
33200 73 65 72 74 28 20 69 64 78 3e 3d 30 20 26 26 20  sert( idx>=0 && 
33210 69 64 78 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  idx<pPage->nCell
33220 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43 4f   );.  assert( CO
33230 52 52 55 50 54 5f 44 42 20 7c 7c 20 73 7a 3d 3d  RRUPT_DB || sz==
33240 63 65 6c 6c 53 69 7a 65 28 70 50 61 67 65 2c 20  cellSize(pPage, 
33250 69 64 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  idx) );.  assert
33260 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
33270 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
33280 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61  >pDbPage) );.  a
33290 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
332a0 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
332b0 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
332c0 20 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e    data = pPage->
332d0 61 44 61 74 61 3b 0a 20 20 70 74 72 20 3d 20 26  aData;.  ptr = &
332e0 70 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64 78 5b  pPage->aCellIdx[
332f0 32 2a 69 64 78 5d 3b 0a 20 20 70 63 20 3d 20 67  2*idx];.  pc = g
33300 65 74 32 62 79 74 65 28 70 74 72 29 3b 0a 20 20  et2byte(ptr);.  
33310 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72  hdr = pPage->hdr
33320 4f 66 66 73 65 74 3b 0a 20 20 74 65 73 74 63 61  Offset;.  testca
33330 73 65 28 20 70 63 3d 3d 67 65 74 32 62 79 74 65  se( pc==get2byte
33340 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 20 29  (&data[hdr+5]) )
33350 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 63  ;.  testcase( pc
33360 2b 73 7a 3d 3d 70 50 61 67 65 2d 3e 70 42 74 2d  +sz==pPage->pBt-
33370 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20  >usableSize );. 
33380 20 69 66 28 20 70 63 20 3c 20 28 75 33 32 29 67   if( pc < (u32)g
33390 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  et2byte(&data[hd
333a0 72 2b 35 5d 29 20 7c 7c 20 70 63 2b 73 7a 20 3e  r+5]) || pc+sz >
333b0 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61   pPage->pBt->usa
333c0 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 2a  bleSize ){.    *
333d0 70 52 43 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52  pRC = SQLITE_COR
333e0 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 72  RUPT_BKPT;.    r
333f0 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 72 63 20  eturn;.  }.  rc 
33400 3d 20 66 72 65 65 53 70 61 63 65 28 70 50 61 67  = freeSpace(pPag
33410 65 2c 20 70 63 2c 20 73 7a 29 3b 0a 20 20 69 66  e, pc, sz);.  if
33420 28 20 72 63 20 29 7b 0a 20 20 20 20 2a 70 52 43  ( rc ){.    *pRC
33430 20 3d 20 72 63 3b 0a 20 20 20 20 72 65 74 75 72   = rc;.    retur
33440 6e 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e  n;.  }.  pPage->
33450 6e 43 65 6c 6c 2d 2d 3b 0a 20 20 69 66 28 20 70  nCell--;.  if( p
33460 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29  Page->nCell==0 )
33470 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 64 61  {.    memset(&da
33480 74 61 5b 68 64 72 2b 31 5d 2c 20 30 2c 20 34 29  ta[hdr+1], 0, 4)
33490 3b 0a 20 20 20 20 64 61 74 61 5b 68 64 72 2b 37  ;.    data[hdr+7
334a0 5d 20 3d 20 30 3b 0a 20 20 20 20 70 75 74 32 62  ] = 0;.    put2b
334b0 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
334c0 2c 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  , pPage->pBt->us
334d0 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20 20 20 70  ableSize);.    p
334e0 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20 70 50  Page->nFree = pP
334f0 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
33500 53 69 7a 65 20 2d 20 70 50 61 67 65 2d 3e 68 64  Size - pPage->hd
33510 72 4f 66 66 73 65 74 0a 20 20 20 20 20 20 20 20  rOffset.        
33520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d                 -
33530 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72   pPage->childPtr
33540 53 69 7a 65 20 2d 20 38 3b 0a 20 20 7d 65 6c 73  Size - 8;.  }els
33550 65 7b 0a 20 20 20 20 6d 65 6d 6d 6f 76 65 28 70  e{.    memmove(p
33560 74 72 2c 20 70 74 72 2b 32 2c 20 32 2a 28 70 50  tr, ptr+2, 2*(pP
33570 61 67 65 2d 3e 6e 43 65 6c 6c 20 2d 20 69 64 78  age->nCell - idx
33580 29 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65  ));.    put2byte
33590 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 2c 20 70  (&data[hdr+3], p
335a0 50 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a 20 20  Page->nCell);.  
335b0 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2b    pPage->nFree +
335c0 3d 20 32 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  = 2;.  }.}../*.*
335d0 2a 20 49 6e 73 65 72 74 20 61 20 6e 65 77 20 63  * Insert a new c
335e0 65 6c 6c 20 6f 6e 20 70 50 61 67 65 20 61 74 20  ell on pPage at 
335f0 63 65 6c 6c 20 69 6e 64 65 78 20 22 69 22 2e 20  cell index "i". 
33600 20 70 43 65 6c 6c 20 70 6f 69 6e 74 73 20 74 6f   pCell points to
33610 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20   the.** content 
33620 6f 66 20 74 68 65 20 63 65 6c 6c 2e 0a 2a 2a 0a  of the cell..**.
33630 2a 2a 20 49 66 20 74 68 65 20 63 65 6c 6c 20 63  ** If the cell c
33640 6f 6e 74 65 6e 74 20 77 69 6c 6c 20 66 69 74 20  ontent will fit 
33650 6f 6e 20 74 68 65 20 70 61 67 65 2c 20 74 68 65  on the page, the
33660 6e 20 70 75 74 20 69 74 20 74 68 65 72 65 2e 20  n put it there. 
33670 20 49 66 20 69 74 0a 2a 2a 20 77 69 6c 6c 20 6e   If it.** will n
33680 6f 74 20 66 69 74 2c 20 74 68 65 6e 20 6d 61 6b  ot fit, then mak
33690 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  e a copy of the 
336a0 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 6e 74  cell content int
336b0 6f 20 70 54 65 6d 70 20 69 66 0a 2a 2a 20 70 54  o pTemp if.** pT
336c0 65 6d 70 20 69 73 20 6e 6f 74 20 6e 75 6c 6c 2e  emp is not null.
336d0 20 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20    Regardless of 
336e0 70 54 65 6d 70 2c 20 61 6c 6c 6f 63 61 74 65 20  pTemp, allocate 
336f0 61 20 6e 65 77 20 65 6e 74 72 79 0a 2a 2a 20 69  a new entry.** i
33700 6e 20 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c 5b  n pPage->apOvfl[
33710 5d 20 61 6e 64 20 6d 61 6b 65 20 69 74 20 70 6f  ] and make it po
33720 69 6e 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20  int to the cell 
33730 63 6f 6e 74 65 6e 74 20 28 65 69 74 68 65 72 0a  content (either.
33740 2a 2a 20 69 6e 20 70 54 65 6d 70 20 6f 72 20 74  ** in pTemp or t
33750 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 43 65 6c  he original pCel
33760 6c 29 20 61 6e 64 20 61 6c 73 6f 20 72 65 63 6f  l) and also reco
33770 72 64 20 69 74 73 20 69 6e 64 65 78 2e 20 0a 2a  rd its index. .*
33780 2a 20 41 6c 6c 6f 63 61 74 69 6e 67 20 61 20 6e  * Allocating a n
33790 65 77 20 65 6e 74 72 79 20 69 6e 20 70 50 61 67  ew entry in pPag
337a0 65 2d 3e 61 43 65 6c 6c 5b 5d 20 69 6d 70 6c 69  e->aCell[] impli
337b0 65 73 20 74 68 61 74 20 0a 2a 2a 20 70 50 61 67  es that .** pPag
337c0 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 69 73 20  e->nOverflow is 
337d0 69 6e 63 72 65 6d 65 6e 74 65 64 2e 0a 2a 2f 0a  incremented..*/.
337e0 73 74 61 74 69 63 20 76 6f 69 64 20 69 6e 73 65  static void inse
337f0 72 74 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67  rtCell(.  MemPag
33800 65 20 2a 70 50 61 67 65 2c 20 20 20 2f 2a 20 50  e *pPage,   /* P
33810 61 67 65 20 69 6e 74 6f 20 77 68 69 63 68 20 77  age into which w
33820 65 20 61 72 65 20 63 6f 70 79 69 6e 67 20 2a 2f  e are copying */
33830 0a 20 20 69 6e 74 20 69 2c 20 20 20 20 20 20 20  .  int i,       
33840 20 20 20 20 20 2f 2a 20 4e 65 77 20 63 65 6c 6c       /* New cell
33850 20 62 65 63 6f 6d 65 73 20 74 68 65 20 69 2d 74   becomes the i-t
33860 68 20 63 65 6c 6c 20 6f 66 20 74 68 65 20 70 61  h cell of the pa
33870 67 65 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c  ge */.  u8 *pCel
33880 6c 2c 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e  l,        /* Con
33890 74 65 6e 74 20 6f 66 20 74 68 65 20 6e 65 77 20  tent of the new 
338a0 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 73 7a  cell */.  int sz
338b0 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42  ,           /* B
338c0 79 74 65 73 20 6f 66 20 63 6f 6e 74 65 6e 74 20  ytes of content 
338d0 69 6e 20 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 38  in pCell */.  u8
338e0 20 2a 70 54 65 6d 70 2c 20 20 20 20 20 20 20 20   *pTemp,        
338f0 2f 2a 20 54 65 6d 70 20 73 74 6f 72 61 67 65 20  /* Temp storage 
33900 73 70 61 63 65 20 66 6f 72 20 70 43 65 6c 6c 2c  space for pCell,
33910 20 69 66 20 6e 65 65 64 65 64 20 2a 2f 0a 20 20   if needed */.  
33920 50 67 6e 6f 20 69 43 68 69 6c 64 2c 20 20 20 20  Pgno iChild,    
33930 20 20 2f 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f    /* If non-zero
33940 2c 20 72 65 70 6c 61 63 65 20 66 69 72 73 74 20  , replace first 
33950 34 20 62 79 74 65 73 20 77 69 74 68 20 74 68 69  4 bytes with thi
33960 73 20 76 61 6c 75 65 20 2a 2f 0a 20 20 69 6e 74  s value */.  int
33970 20 2a 70 52 43 20 20 20 20 20 20 20 20 20 20 2f   *pRC          /
33980 2a 20 52 65 61 64 20 61 6e 64 20 77 72 69 74 65  * Read and write
33990 20 72 65 74 75 72 6e 20 63 6f 64 65 20 66 72 6f   return code fro
339a0 6d 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69  m here */.){.  i
339b0 6e 74 20 69 64 78 20 3d 20 30 3b 20 20 20 20 20  nt idx = 0;     
339c0 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 77 72 69   /* Where to wri
339d0 74 65 20 6e 65 77 20 63 65 6c 6c 20 63 6f 6e 74  te new cell cont
339e0 65 6e 74 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f  ent in data[] */
339f0 0a 20 20 69 6e 74 20 6a 3b 20 20 20 20 20 20 20  .  int j;       
33a00 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
33a10 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 65 6e  nter */.  int en
33a20 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  d;          /* F
33a30 69 72 73 74 20 62 79 74 65 20 70 61 73 74 20 74  irst byte past t
33a40 68 65 20 6c 61 73 74 20 63 65 6c 6c 20 70 6f 69  he last cell poi
33a50 6e 74 65 72 20 69 6e 20 64 61 74 61 5b 5d 20 2a  nter in data[] *
33a60 2f 0a 20 20 69 6e 74 20 69 6e 73 3b 20 20 20 20  /.  int ins;    
33a70 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69        /* Index i
33a80 6e 20 64 61 74 61 5b 5d 20 77 68 65 72 65 20 6e  n data[] where n
33a90 65 77 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20  ew cell pointer 
33aa0 69 73 20 69 6e 73 65 72 74 65 64 20 2a 2f 0a 20  is inserted */. 
33ab0 20 69 6e 74 20 63 65 6c 6c 4f 66 66 73 65 74 3b   int cellOffset;
33ac0 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
33ad0 20 66 69 72 73 74 20 63 65 6c 6c 20 70 6f 69 6e   first cell poin
33ae0 74 65 72 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f  ter in data[] */
33af0 0a 20 20 75 38 20 2a 64 61 74 61 3b 20 20 20 20  .  u8 *data;    
33b00 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 74       /* The cont
33b10 65 6e 74 20 6f 66 20 74 68 65 20 77 68 6f 6c 65  ent of the whole
33b20 20 70 61 67 65 20 2a 2f 0a 0a 20 20 69 66 28 20   page */..  if( 
33b30 2a 70 52 43 20 29 20 72 65 74 75 72 6e 3b 0a 0a  *pRC ) return;..
33b40 20 20 61 73 73 65 72 74 28 20 69 3e 3d 30 20 26    assert( i>=0 &
33b50 26 20 69 3c 3d 70 50 61 67 65 2d 3e 6e 43 65 6c  & i<=pPage->nCel
33b60 6c 2b 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  l+pPage->nOverfl
33b70 6f 77 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ow );.  assert( 
33b80 4d 58 5f 43 45 4c 4c 28 70 50 61 67 65 2d 3e 70  MX_CELL(pPage->p
33b90 42 74 29 3c 3d 31 30 39 32 31 20 29 3b 0a 20 20  Bt)<=10921 );.  
33ba0 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
33bb0 43 65 6c 6c 3c 3d 4d 58 5f 43 45 4c 4c 28 70 50  Cell<=MX_CELL(pP
33bc0 61 67 65 2d 3e 70 42 74 29 20 7c 7c 20 43 4f 52  age->pBt) || COR
33bd0 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 61 73 73  RUPT_DB );.  ass
33be0 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65  ert( pPage->nOve
33bf0 72 66 6c 6f 77 3c 3d 41 72 72 61 79 53 69 7a 65  rflow<=ArraySize
33c00 28 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c 29 20  (pPage->apOvfl) 
33c10 29 3b 0a 20 20 61 73 73 65 72 74 28 20 41 72 72  );.  assert( Arr
33c20 61 79 53 69 7a 65 28 70 50 61 67 65 2d 3e 61 70  aySize(pPage->ap
33c30 4f 76 66 6c 29 3d 3d 41 72 72 61 79 53 69 7a 65  Ovfl)==ArraySize
33c40 28 70 50 61 67 65 2d 3e 61 69 4f 76 66 6c 29 20  (pPage->aiOvfl) 
33c50 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
33c60 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
33c70 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
33c80 78 29 20 29 3b 0a 20 20 2f 2a 20 54 68 65 20 63  x) );.  /* The c
33c90 65 6c 6c 20 73 68 6f 75 6c 64 20 6e 6f 72 6d 61  ell should norma
33ca0 6c 6c 79 20 62 65 20 73 69 7a 65 64 20 63 6f 72  lly be sized cor
33cb0 72 65 63 74 6c 79 2e 20 20 48 6f 77 65 76 65 72  rectly.  However
33cc0 2c 20 77 68 65 6e 20 6d 6f 76 69 6e 67 20 61 0a  , when moving a.
33cd0 20 20 2a 2a 20 6d 61 6c 66 6f 72 6d 65 64 20 63    ** malformed c
33ce0 65 6c 6c 20 66 72 6f 6d 20 61 20 6c 65 61 66 20  ell from a leaf 
33cf0 70 61 67 65 20 74 6f 20 61 6e 20 69 6e 74 65 72  page to an inter
33d00 69 6f 72 20 70 61 67 65 2c 20 69 66 20 74 68 65  ior page, if the
33d10 20 63 65 6c 6c 20 73 69 7a 65 0a 20 20 2a 2a 20   cell size.  ** 
33d20 77 61 6e 74 65 64 20 74 6f 20 62 65 20 6c 65 73  wanted to be les
33d30 73 20 74 68 61 6e 20 34 20 62 75 74 20 67 6f 74  s than 4 but got
33d40 20 72 6f 75 6e 64 65 64 20 75 70 20 74 6f 20 34   rounded up to 4
33d50 20 6f 6e 20 74 68 65 20 6c 65 61 66 2c 20 74 68   on the leaf, th
33d60 65 6e 20 73 69 7a 65 0a 20 20 2a 2a 20 6d 69 67  en size.  ** mig
33d70 68 74 20 62 65 20 6c 65 73 73 20 74 68 61 6e 20  ht be less than 
33d80 38 20 28 6c 65 61 66 2d 73 69 7a 65 20 2b 20 70  8 (leaf-size + p
33d90 6f 69 6e 74 65 72 29 20 6f 6e 20 74 68 65 20 69  ointer) on the i
33da0 6e 74 65 72 69 6f 72 20 6e 6f 64 65 2e 20 20 48  nterior node.  H
33db0 65 6e 63 65 0a 20 20 2a 2a 20 74 68 65 20 74 65  ence.  ** the te
33dc0 72 6d 20 61 66 74 65 72 20 74 68 65 20 7c 7c 20  rm after the || 
33dd0 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  in the following
33de0 20 61 73 73 65 72 74 28 29 2e 20 2a 2f 0a 20 20   assert(). */.  
33df0 61 73 73 65 72 74 28 20 73 7a 3d 3d 63 65 6c 6c  assert( sz==cell
33e00 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20 70  SizePtr(pPage, p
33e10 43 65 6c 6c 29 20 7c 7c 20 28 73 7a 3d 3d 38 20  Cell) || (sz==8 
33e20 26 26 20 69 43 68 69 6c 64 3e 30 29 20 29 3b 0a  && iChild>0) );.
33e30 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 4f 76    if( pPage->nOv
33e40 65 72 66 6c 6f 77 20 7c 7c 20 73 7a 2b 32 3e 70  erflow || sz+2>p
33e50 50 61 67 65 2d 3e 6e 46 72 65 65 20 29 7b 0a 20  Page->nFree ){. 
33e60 20 20 20 69 66 28 20 70 54 65 6d 70 20 29 7b 0a     if( pTemp ){.
33e70 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 54 65        memcpy(pTe
33e80 6d 70 2c 20 70 43 65 6c 6c 2c 20 73 7a 29 3b 0a  mp, pCell, sz);.
33e90 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 70 54        pCell = pT
33ea0 65 6d 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  emp;.    }.    i
33eb0 66 28 20 69 43 68 69 6c 64 20 29 7b 0a 20 20 20  f( iChild ){.   
33ec0 20 20 20 70 75 74 34 62 79 74 65 28 70 43 65 6c     put4byte(pCel
33ed0 6c 2c 20 69 43 68 69 6c 64 29 3b 0a 20 20 20 20  l, iChild);.    
33ee0 7d 0a 20 20 20 20 6a 20 3d 20 70 50 61 67 65 2d  }.    j = pPage-
33ef0 3e 6e 4f 76 65 72 66 6c 6f 77 2b 2b 3b 0a 20 20  >nOverflow++;.  
33f00 20 20 61 73 73 65 72 74 28 20 6a 3c 28 69 6e 74    assert( j<(int
33f10 29 28 73 69 7a 65 6f 66 28 70 50 61 67 65 2d 3e  )(sizeof(pPage->
33f20 61 70 4f 76 66 6c 29 2f 73 69 7a 65 6f 66 28 70  apOvfl)/sizeof(p
33f30 50 61 67 65 2d 3e 61 70 4f 76 66 6c 5b 30 5d 29  Page->apOvfl[0])
33f40 29 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  ) );.    pPage->
33f50 61 70 4f 76 66 6c 5b 6a 5d 20 3d 20 70 43 65 6c  apOvfl[j] = pCel
33f60 6c 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 61 69  l;.    pPage->ai
33f70 4f 76 66 6c 5b 6a 5d 20 3d 20 28 75 31 36 29 69  Ovfl[j] = (u16)i
33f80 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
33f90 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  nt rc = sqlite3P
33fa0 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65 2d  agerWrite(pPage-
33fb0 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69  >pDbPage);.    i
33fc0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
33fd0 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 43 20 3d   ){.      *pRC =
33fe0 20 72 63 3b 0a 20 20 20 20 20 20 72 65 74 75 72   rc;.      retur
33ff0 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  n;.    }.    ass
34000 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
34010 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
34020 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
34030 20 20 20 20 64 61 74 61 20 3d 20 70 50 61 67 65      data = pPage
34040 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 63 65 6c  ->aData;.    cel
34050 6c 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65 2d  lOffset = pPage-
34060 3e 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 20  >cellOffset;.   
34070 20 65 6e 64 20 3d 20 63 65 6c 6c 4f 66 66 73 65   end = cellOffse
34080 74 20 2b 20 32 2a 70 50 61 67 65 2d 3e 6e 43 65  t + 2*pPage->nCe
34090 6c 6c 3b 0a 20 20 20 20 69 6e 73 20 3d 20 63 65  ll;.    ins = ce
340a0 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 69 3b 0a  llOffset + 2*i;.
340b0 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74      rc = allocat
340c0 65 53 70 61 63 65 28 70 50 61 67 65 2c 20 73 7a  eSpace(pPage, sz
340d0 2c 20 26 69 64 78 29 3b 0a 20 20 20 20 69 66 28  , &idx);.    if(
340e0 20 72 63 20 29 7b 20 2a 70 52 43 20 3d 20 72 63   rc ){ *pRC = rc
340f0 3b 20 72 65 74 75 72 6e 3b 20 7d 0a 20 20 20 20  ; return; }.    
34100 2f 2a 20 54 68 65 20 61 6c 6c 6f 63 61 74 65 53  /* The allocateS
34110 70 61 63 65 28 29 20 72 6f 75 74 69 6e 65 20 67  pace() routine g
34120 75 61 72 61 6e 74 65 65 73 20 74 68 65 20 66 6f  uarantees the fo
34130 6c 6c 6f 77 69 6e 67 20 74 77 6f 20 70 72 6f 70  llowing two prop
34140 65 72 74 69 65 73 0a 20 20 20 20 2a 2a 20 69 66  erties.    ** if
34150 20 69 74 20 72 65 74 75 72 6e 73 20 73 75 63 63   it returns succ
34160 65 73 73 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  ess */.    asser
34170 74 28 20 69 64 78 20 3e 3d 20 65 6e 64 2b 32 20  t( idx >= end+2 
34180 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  );.    assert( i
34190 64 78 2b 73 7a 20 3c 3d 20 28 69 6e 74 29 70 50  dx+sz <= (int)pP
341a0 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
341b0 53 69 7a 65 20 29 3b 0a 20 20 20 20 70 50 61 67  Size );.    pPag
341c0 65 2d 3e 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20  e->nCell++;.    
341d0 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2d 3d 20  pPage->nFree -= 
341e0 28 75 31 36 29 28 32 20 2b 20 73 7a 29 3b 0a 20  (u16)(2 + sz);. 
341f0 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b     memcpy(&data[
34200 69 64 78 5d 2c 20 70 43 65 6c 6c 2c 20 73 7a 29  idx], pCell, sz)
34210 3b 0a 20 20 20 20 69 66 28 20 69 43 68 69 6c 64  ;.    if( iChild
34220 20 29 7b 0a 20 20 20 20 20 20 70 75 74 34 62 79   ){.      put4by
34230 74 65 28 26 64 61 74 61 5b 69 64 78 5d 2c 20 69  te(&data[idx], i
34240 43 68 69 6c 64 29 3b 0a 20 20 20 20 7d 0a 20 20  Child);.    }.  
34250 20 20 6d 65 6d 6d 6f 76 65 28 26 64 61 74 61 5b    memmove(&data[
34260 69 6e 73 2b 32 5d 2c 20 26 64 61 74 61 5b 69 6e  ins+2], &data[in
34270 73 5d 2c 20 65 6e 64 2d 69 6e 73 29 3b 0a 20 20  s], end-ins);.  
34280 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
34290 5b 69 6e 73 5d 2c 20 69 64 78 29 3b 0a 20 20 20  [ins], idx);.   
342a0 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
342b0 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
342c0 2b 33 5d 2c 20 70 50 61 67 65 2d 3e 6e 43 65 6c  +3], pPage->nCel
342d0 6c 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  l);.#ifndef SQLI
342e0 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
342f0 55 4d 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  UM.    if( pPage
34300 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ->pBt->autoVacuu
34310 6d 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  m ){.      /* Th
34320 65 20 63 65 6c 6c 20 6d 61 79 20 63 6f 6e 74 61  e cell may conta
34330 69 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  in a pointer to 
34340 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
34350 2e 20 49 66 20 73 6f 2c 20 77 72 69 74 65 0a 20  . If so, write. 
34360 20 20 20 20 20 2a 2a 20 74 68 65 20 65 6e 74 72       ** the entr
34370 79 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c  y for the overfl
34380 6f 77 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65  ow page into the
34390 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 20 20   pointer map..  
343a0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 74 72      */.      ptr
343b0 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28 70 50  mapPutOvflPtr(pP
343c0 61 67 65 2c 20 70 43 65 6c 6c 2c 20 70 52 43 29  age, pCell, pRC)
343d0 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
343e0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 72 61   }.}../*.** Arra
343f0 79 20 61 70 43 65 6c 6c 5b 5d 20 63 6f 6e 74 61  y apCell[] conta
34400 69 6e 73 20 70 6f 69 6e 74 65 72 73 20 74 6f 20  ins pointers to 
34410 6e 43 65 6c 6c 20 62 2d 74 72 65 65 20 70 61 67  nCell b-tree pag
34420 65 20 63 65 6c 6c 73 2e 20 54 68 65 20 0a 2a 2a  e cells. The .**
34430 20 73 7a 43 65 6c 6c 5b 5d 20 61 72 72 61 79 20   szCell[] array 
34440 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 73 69 7a  contains the siz
34450 65 20 69 6e 20 62 79 74 65 73 20 6f 66 20 65 61  e in bytes of ea
34460 63 68 20 63 65 6c 6c 2e 20 54 68 69 73 20 66 75  ch cell. This fu
34470 6e 63 74 69 6f 6e 0a 2a 2a 20 72 65 70 6c 61 63  nction.** replac
34480 65 73 20 74 68 65 20 63 75 72 72 65 6e 74 20 63  es the current c
34490 6f 6e 74 65 6e 74 73 20 6f 66 20 70 61 67 65 20  ontents of page 
344a0 70 50 67 20 77 69 74 68 20 74 68 65 20 63 6f 6e  pPg with the con
344b0 74 65 6e 74 73 20 6f 66 20 74 68 65 20 63 65 6c  tents of the cel
344c0 6c 0a 2a 2a 20 61 72 72 61 79 2e 0a 2a 2a 0a 2a  l.** array..**.*
344d0 2a 20 53 6f 6d 65 20 6f 66 20 74 68 65 20 63 65  * Some of the ce
344e0 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20  lls in apCell[] 
344f0 6d 61 79 20 63 75 72 72 65 6e 74 6c 79 20 62 65  may currently be
34500 20 73 74 6f 72 65 64 20 69 6e 20 70 50 67 2e 20   stored in pPg. 
34510 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  This.** function
34520 20 77 6f 72 6b 73 20 61 72 6f 75 6e 64 20 70 72   works around pr
34530 6f 62 6c 65 6d 73 20 63 61 75 73 65 64 20 62 79  oblems caused by
34540 20 74 68 69 73 20 62 79 20 6d 61 6b 69 6e 67 20   this by making 
34550 61 20 63 6f 70 79 20 6f 66 20 61 6e 79 20 0a 2a  a copy of any .*
34560 2a 20 73 75 63 68 20 63 65 6c 6c 73 20 62 65 66  * such cells bef
34570 6f 72 65 20 6f 76 65 72 77 72 69 74 69 6e 67 20  ore overwriting 
34580 74 68 65 20 70 61 67 65 20 64 61 74 61 2e 0a 2a  the page data..*
34590 2a 0a 2a 2a 20 54 68 65 20 4d 65 6d 50 61 67 65  *.** The MemPage
345a0 2e 6e 46 72 65 65 20 66 69 65 6c 64 20 69 73 20  .nFree field is 
345b0 69 6e 76 61 6c 69 64 61 74 65 64 20 62 79 20 74  invalidated by t
345c0 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 49 74  his function. It
345d0 20 69 73 20 74 68 65 20 0a 2a 2a 20 72 65 73 70   is the .** resp
345e0 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68  onsibility of th
345f0 65 20 63 61 6c 6c 65 72 20 74 6f 20 73 65 74 20  e caller to set 
34600 69 74 20 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2f  it correctly..*/
34610 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 62  .static void reb
34620 75 69 6c 64 50 61 67 65 28 0a 20 20 4d 65 6d 50  uildPage(.  MemP
34630 61 67 65 20 2a 70 50 67 2c 20 20 20 20 20 20 20  age *pPg,       
34640 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
34650 64 69 74 20 74 68 69 73 20 70 61 67 65 20 2a 2f  dit this page */
34660 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 2c 20 20 20  .  int nCell,   
34670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34680 20 20 20 2f 2a 20 46 69 6e 61 6c 20 6e 75 6d 62     /* Final numb
34690 65 72 20 6f 66 20 63 65 6c 6c 73 20 6f 6e 20 70  er of cells on p
346a0 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70  age */.  u8 **ap
346b0 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20  Cell,           
346c0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61           /* Arra
346d0 79 20 6f 66 20 63 65 6c 6c 73 20 2a 2f 0a 20 20  y of cells */.  
346e0 75 31 36 20 2a 73 7a 43 65 6c 6c 20 20 20 20 20  u16 *szCell     
346f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34700 2f 2a 20 41 72 72 61 79 20 6f 66 20 63 65 6c 6c  /* Array of cell
34710 20 73 69 7a 65 73 20 2a 2f 0a 29 7b 0a 20 20 63   sizes */.){.  c
34720 6f 6e 73 74 20 69 6e 74 20 68 64 72 20 3d 20 70  onst int hdr = p
34730 50 67 2d 3e 68 64 72 4f 66 66 73 65 74 3b 20 20  Pg->hdrOffset;  
34740 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
34750 74 20 6f 66 20 68 65 61 64 65 72 20 6f 6e 20 70  t of header on p
34760 50 67 20 2a 2f 0a 20 20 75 38 20 2a 20 63 6f 6e  Pg */.  u8 * con
34770 73 74 20 61 44 61 74 61 20 3d 20 70 50 67 2d 3e  st aData = pPg->
34780 61 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 20  aData;          
34790 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 64   /* Pointer to d
347a0 61 74 61 20 66 6f 72 20 70 50 67 20 2a 2f 0a 20  ata for pPg */. 
347b0 20 63 6f 6e 73 74 20 69 6e 74 20 75 73 61 62 6c   const int usabl
347c0 65 53 69 7a 65 20 3d 20 70 50 67 2d 3e 70 42 74  eSize = pPg->pBt
347d0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20  ->usableSize;.  
347e0 75 38 20 2a 20 63 6f 6e 73 74 20 70 45 6e 64 20  u8 * const pEnd 
347f0 3d 20 26 61 44 61 74 61 5b 75 73 61 62 6c 65 53  = &aData[usableS
34800 69 7a 65 5d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  ize];.  int i;. 
34810 20 75 38 20 2a 70 43 65 6c 6c 70 74 72 20 3d 20   u8 *pCellptr = 
34820 70 50 67 2d 3e 61 43 65 6c 6c 49 64 78 3b 0a 20  pPg->aCellIdx;. 
34830 20 75 38 20 2a 70 54 6d 70 20 3d 20 73 71 6c 69   u8 *pTmp = sqli
34840 74 65 33 50 61 67 65 72 54 65 6d 70 53 70 61 63  te3PagerTempSpac
34850 65 28 70 50 67 2d 3e 70 42 74 2d 3e 70 50 61 67  e(pPg->pBt->pPag
34860 65 72 29 3b 0a 20 20 75 38 20 2a 70 44 61 74 61  er);.  u8 *pData
34870 3b 0a 0a 20 20 69 20 3d 20 67 65 74 32 62 79 74  ;..  i = get2byt
34880 65 28 26 61 44 61 74 61 5b 68 64 72 2b 35 5d 29  e(&aData[hdr+5])
34890 3b 0a 20 20 6d 65 6d 63 70 79 28 26 70 54 6d 70  ;.  memcpy(&pTmp
348a0 5b 69 5d 2c 20 26 61 44 61 74 61 5b 69 5d 2c 20  [i], &aData[i], 
348b0 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 69 29 3b  usableSize - i);
348c0 0a 0a 20 20 70 44 61 74 61 20 3d 20 70 45 6e 64  ..  pData = pEnd
348d0 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  ;.  for(i=0; i<n
348e0 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Cell; i++){.    
348f0 75 38 20 2a 70 43 65 6c 6c 20 3d 20 61 70 43 65  u8 *pCell = apCe
34900 6c 6c 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70  ll[i];.    if( p
34910 43 65 6c 6c 3e 61 44 61 74 61 20 26 26 20 70 43  Cell>aData && pC
34920 65 6c 6c 3c 70 45 6e 64 20 29 7b 0a 20 20 20 20  ell<pEnd ){.    
34930 20 20 70 43 65 6c 6c 20 3d 20 26 70 54 6d 70 5b    pCell = &pTmp[
34940 70 43 65 6c 6c 20 2d 20 61 44 61 74 61 5d 3b 0a  pCell - aData];.
34950 20 20 20 20 7d 0a 20 20 20 20 70 44 61 74 61 20      }.    pData 
34960 2d 3d 20 73 7a 43 65 6c 6c 5b 69 5d 3b 0a 20 20  -= szCell[i];.  
34970 20 20 6d 65 6d 63 70 79 28 70 44 61 74 61 2c 20    memcpy(pData, 
34980 70 43 65 6c 6c 2c 20 73 7a 43 65 6c 6c 5b 69 5d  pCell, szCell[i]
34990 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65 28  );.    put2byte(
349a0 70 43 65 6c 6c 70 74 72 2c 20 28 70 44 61 74 61  pCellptr, (pData
349b0 20 2d 20 61 44 61 74 61 29 29 3b 0a 20 20 20 20   - aData));.    
349c0 70 43 65 6c 6c 70 74 72 20 2b 3d 20 32 3b 0a 20  pCellptr += 2;. 
349d0 20 20 20 61 73 73 65 72 74 28 20 73 7a 43 65 6c     assert( szCel
349e0 6c 5b 69 5d 3d 3d 63 65 6c 6c 53 69 7a 65 50 74  l[i]==cellSizePt
349f0 72 28 70 50 67 2c 20 70 43 65 6c 6c 29 20 7c 7c  r(pPg, pCell) ||
34a00 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20   CORRUPT_DB );. 
34a10 20 20 20 74 65 73 74 63 61 73 65 28 20 73 7a 43     testcase( szC
34a20 65 6c 6c 5b 69 5d 3d 3d 63 65 6c 6c 53 69 7a 65  ell[i]==cellSize
34a30 50 74 72 28 70 50 67 2c 70 43 65 6c 6c 29 20 29  Ptr(pPg,pCell) )
34a40 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  ;.  }..  /* The 
34a50 70 50 67 2d 3e 6e 46 72 65 65 20 66 69 65 6c 64  pPg->nFree field
34a60 20 69 73 20 6e 6f 77 20 73 65 74 20 69 6e 63 6f   is now set inco
34a70 72 72 65 63 74 6c 79 2e 20 54 68 65 20 63 61 6c  rrectly. The cal
34a80 6c 65 72 20 77 69 6c 6c 20 66 69 78 20 69 74 2e  ler will fix it.
34a90 20 2a 2f 0a 20 20 70 50 67 2d 3e 6e 43 65 6c 6c   */.  pPg->nCell
34aa0 20 3d 20 6e 43 65 6c 6c 3b 0a 20 20 70 50 67 2d   = nCell;.  pPg-
34ab0 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a  >nOverflow = 0;.
34ac0 0a 20 20 70 75 74 32 62 79 74 65 28 26 61 44 61  .  put2byte(&aDa
34ad0 74 61 5b 68 64 72 2b 31 5d 2c 20 30 29 3b 0a 20  ta[hdr+1], 0);. 
34ae0 20 70 75 74 32 62 79 74 65 28 26 61 44 61 74 61   put2byte(&aData
34af0 5b 68 64 72 2b 33 5d 2c 20 70 50 67 2d 3e 6e 43  [hdr+3], pPg->nC
34b00 65 6c 6c 29 3b 0a 20 20 70 75 74 32 62 79 74 65  ell);.  put2byte
34b10 28 26 61 44 61 74 61 5b 68 64 72 2b 35 5d 2c 20  (&aData[hdr+5], 
34b20 70 44 61 74 61 20 2d 20 61 44 61 74 61 29 3b 0a  pData - aData);.
34b30 20 20 61 44 61 74 61 5b 68 64 72 2b 37 5d 20 3d    aData[hdr+7] =
34b40 20 30 78 30 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   0x00;.}../*.** 
34b50 41 72 72 61 79 20 61 70 43 65 6c 6c 5b 5d 20 63  Array apCell[] c
34b60 6f 6e 74 61 69 6e 73 20 6e 43 65 6c 6c 20 70 6f  ontains nCell po
34b70 69 6e 74 65 72 73 20 74 6f 20 62 2d 74 72 65 65  inters to b-tree
34b80 20 63 65 6c 6c 73 2e 20 41 72 72 61 79 20 73 7a   cells. Array sz
34b90 43 65 6c 6c 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73  Cell.** contains
34ba0 20 74 68 65 20 73 69 7a 65 20 69 6e 20 62 79 74   the size in byt
34bb0 65 73 20 6f 66 20 65 61 63 68 20 73 75 63 68 20  es of each such 
34bc0 63 65 6c 6c 2e 20 54 68 69 73 20 66 75 6e 63 74  cell. This funct
34bd0 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74 6f 20  ion attempts to 
34be0 0a 2a 2a 20 61 64 64 20 74 68 65 20 63 65 6c 6c  .** add the cell
34bf0 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  s stored in the 
34c00 61 72 72 61 79 20 74 6f 20 70 61 67 65 20 70 50  array to page pP
34c10 67 2e 20 49 66 20 69 74 20 63 61 6e 6e 6f 74 20  g. If it cannot 
34c20 28 62 65 63 61 75 73 65 20 0a 2a 2a 20 74 68 65  (because .** the
34c30 20 70 61 67 65 20 6e 65 65 64 73 20 74 6f 20 62   page needs to b
34c40 65 20 64 65 66 72 61 67 6d 65 6e 74 65 64 20 62  e defragmented b
34c50 65 66 6f 72 65 20 74 68 65 20 63 65 6c 6c 73 20  efore the cells 
34c60 77 69 6c 6c 20 66 69 74 29 2c 20 6e 6f 6e 2d 7a  will fit), non-z
34c70 65 72 6f 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e  ero.** is return
34c80 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69  ed. Otherwise, i
34c90 66 20 74 68 65 20 63 65 6c 6c 73 20 61 72 65 20  f the cells are 
34ca0 61 64 64 65 64 20 73 75 63 63 65 73 73 66 75 6c  added successful
34cb0 6c 79 2c 20 7a 65 72 6f 20 69 73 0a 2a 2a 20 72  ly, zero is.** r
34cc0 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 41  eturned..**.** A
34cd0 72 67 75 6d 65 6e 74 20 70 43 65 6c 6c 70 74 72  rgument pCellptr
34ce0 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 66   points to the f
34cf0 69 72 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68  irst entry in th
34d00 65 20 63 65 6c 6c 2d 70 6f 69 6e 74 65 72 20 61  e cell-pointer a
34d10 72 72 61 79 0a 2a 2a 20 28 70 61 72 74 20 6f 66  rray.** (part of
34d20 20 70 61 67 65 20 70 50 67 29 20 74 6f 20 70 6f   page pPg) to po
34d30 70 75 6c 61 74 65 2e 20 41 66 74 65 72 20 63 65  pulate. After ce
34d40 6c 6c 20 61 70 43 65 6c 6c 5b 30 5d 20 69 73 20  ll apCell[0] is 
34d50 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 0a 2a  written to the.*
34d60 2a 20 70 61 67 65 20 62 6f 64 79 2c 20 61 20 31  * page body, a 1
34d70 36 2d 62 69 74 20 6f 66 66 73 65 74 20 69 73 20  6-bit offset is 
34d80 77 72 69 74 74 65 6e 20 74 6f 20 70 43 65 6c 6c  written to pCell
34d90 70 74 72 2e 20 41 6e 64 20 73 6f 20 6f 6e 2c 20  ptr. And so on, 
34da0 66 6f 72 20 65 61 63 68 0a 2a 2a 20 63 65 6c 6c  for each.** cell
34db0 20 69 6e 20 74 68 65 20 61 72 72 61 79 2e 20 49   in the array. I
34dc0 74 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73  t is the respons
34dd0 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63  ibility of the c
34de0 61 6c 6c 65 72 20 74 6f 20 65 6e 73 75 72 65 0a  aller to ensure.
34df0 2a 2a 20 74 68 61 74 20 69 74 20 69 73 20 73 61  ** that it is sa
34e00 66 65 20 74 6f 20 6f 76 65 72 77 72 69 74 65 20  fe to overwrite 
34e10 74 68 69 73 20 70 61 72 74 20 6f 66 20 74 68 65  this part of the
34e20 20 63 65 6c 6c 2d 70 6f 69 6e 74 65 72 20 61 72   cell-pointer ar
34e30 72 61 79 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  ray..**.** When 
34e40 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
34e50 20 63 61 6c 6c 65 64 2c 20 2a 70 70 44 61 74 61   called, *ppData
34e60 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 73   points to the s
34e70 74 61 72 74 20 6f 66 20 74 68 65 20 0a 2a 2a 20  tart of the .** 
34e80 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 6f 6e 20  content area on 
34e90 70 61 67 65 20 70 50 67 2e 20 49 66 20 74 68 65  page pPg. If the
34ea0 20 73 69 7a 65 20 6f 66 20 74 68 65 20 63 6f 6e   size of the con
34eb0 74 65 6e 74 20 61 72 65 61 20 69 73 20 65 78 74  tent area is ext
34ec0 65 6e 64 65 64 2c 0a 2a 2a 20 2a 70 70 44 61 74  ended,.** *ppDat
34ed0 61 20 69 73 20 75 70 64 61 74 65 64 20 74 6f 20  a is updated to 
34ee0 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6e 65 77  point to the new
34ef0 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 63 6f   start of the co
34f00 6e 74 65 6e 74 20 61 72 65 61 0a 2a 2a 20 62 65  ntent area.** be
34f10 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a  fore returning..
34f20 2a 2a 0a 2a 2a 20 46 69 6e 61 6c 6c 79 2c 20 61  **.** Finally, a
34f30 72 67 75 6d 65 6e 74 20 70 42 65 67 69 6e 20 70  rgument pBegin p
34f40 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 62 79 74  oints to the byt
34f50 65 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f  e immediately fo
34f60 6c 6c 6f 77 69 6e 67 20 74 68 65 0a 2a 2a 20 65  llowing the.** e
34f70 6e 64 20 6f 66 20 74 68 65 20 73 70 61 63 65 20  nd of the space 
34f80 72 65 71 75 69 72 65 64 20 62 79 20 74 68 69 73  required by this
34f90 20 70 61 67 65 20 66 6f 72 20 74 68 65 20 63 65   page for the ce
34fa0 6c 6c 2d 70 6f 69 6e 74 65 72 20 61 72 65 61 20  ll-pointer area 
34fb0 28 66 6f 72 0a 2a 2a 20 61 6c 6c 20 63 65 6c 6c  (for.** all cell
34fc0 73 20 2d 20 6e 6f 74 20 6a 75 73 74 20 74 68 6f  s - not just tho
34fd0 73 65 20 69 6e 73 65 72 74 65 64 20 62 79 20 74  se inserted by t
34fe0 68 65 20 63 75 72 72 65 6e 74 20 63 61 6c 6c 29  he current call)
34ff0 2e 20 49 66 20 74 68 65 20 63 6f 6e 74 65 6e 74  . If the content
35000 0a 2a 2a 20 61 72 65 61 20 6d 75 73 74 20 62 65  .** area must be
35010 20 65 78 74 65 6e 64 65 64 20 74 6f 20 62 65 66   extended to bef
35020 6f 72 65 20 74 68 69 73 20 70 6f 69 6e 74 20 69  ore this point i
35030 6e 20 6f 72 64 65 72 20 74 6f 20 61 63 63 6f 6d  n order to accom
35040 6f 64 61 74 65 20 61 6c 6c 0a 2a 2a 20 63 65 6c  odate all.** cel
35050 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 2c 20  ls in apCell[], 
35060 74 68 65 6e 20 74 68 65 20 63 65 6c 6c 73 20 64  then the cells d
35070 6f 20 6e 6f 74 20 66 69 74 20 61 6e 64 20 6e 6f  o not fit and no
35080 6e 2d 7a 65 72 6f 20 69 73 20 72 65 74 75 72 6e  n-zero is return
35090 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
350a0 74 20 70 61 67 65 49 6e 73 65 72 74 41 72 72 61  t pageInsertArra
350b0 79 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  y(.  MemPage *pP
350c0 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g,              
350d0 20 20 20 20 20 2f 2a 20 50 61 67 65 20 74 6f 20       /* Page to 
350e0 61 64 64 20 63 65 6c 6c 73 20 74 6f 20 2a 2f 0a  add cells to */.
350f0 20 20 75 38 20 2a 70 42 65 67 69 6e 2c 20 20 20    u8 *pBegin,   
35100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35110 20 20 2f 2a 20 45 6e 64 20 6f 66 20 63 65 6c 6c    /* End of cell
35120 2d 70 6f 69 6e 74 65 72 20 61 72 72 61 79 20 2a  -pointer array *
35130 2f 0a 20 20 75 38 20 2a 2a 70 70 44 61 74 61 2c  /.  u8 **ppData,
35140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35150 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 50      /* IN/OUT: P
35160 61 67 65 20 63 6f 6e 74 65 6e 74 20 2d 61 72 65  age content -are
35170 61 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 75  a pointer */.  u
35180 38 20 2a 70 43 65 6c 6c 70 74 72 2c 20 20 20 20  8 *pCellptr,    
35190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
351a0 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 63 65 6c  * Pointer to cel
351b0 6c 2d 70 6f 69 6e 74 65 72 20 61 72 65 61 20 2a  l-pointer area *
351c0 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 2c 20 20  /.  int nCell,  
351d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
351e0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
351f0 20 63 65 6c 6c 73 20 74 6f 20 61 64 64 20 74 6f   cells to add to
35200 20 70 50 67 20 2a 2f 0a 20 20 75 38 20 2a 2a 61   pPg */.  u8 **a
35210 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20  pCell,          
35220 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72            /* Arr
35230 61 79 20 6f 66 20 63 65 6c 6c 73 20 2a 2f 0a 20  ay of cells */. 
35240 20 75 31 36 20 2a 73 7a 43 65 6c 6c 20 20 20 20   u16 *szCell    
35250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35260 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 63 65 6c   /* Array of cel
35270 6c 20 73 69 7a 65 73 20 2a 2f 0a 29 7b 0a 20 20  l sizes */.){.  
35280 69 6e 74 20 69 3b 0a 20 20 75 38 20 2a 61 44 61  int i;.  u8 *aDa
35290 74 61 20 3d 20 70 50 67 2d 3e 61 44 61 74 61 3b  ta = pPg->aData;
352a0 0a 20 20 75 38 20 2a 70 44 61 74 61 20 3d 20 2a  .  u8 *pData = *
352b0 70 70 44 61 74 61 3b 0a 20 20 63 6f 6e 73 74 20  ppData;.  const 
352c0 69 6e 74 20 62 46 72 65 65 6c 69 73 74 20 3d 20  int bFreelist = 
352d0 61 44 61 74 61 5b 31 5d 20 7c 7c 20 61 44 61 74  aData[1] || aDat
352e0 61 5b 32 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  a[2];.  assert( 
352f0 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20 70 50  CORRUPT_DB || pP
35300 67 2d 3e 68 64 72 4f 66 66 73 65 74 3d 3d 30 20  g->hdrOffset==0 
35310 29 3b 20 20 20 20 2f 2a 20 4e 65 76 65 72 20 63  );    /* Never c
35320 61 6c 6c 65 64 20 6f 6e 20 70 61 67 65 20 31 20  alled on page 1 
35330 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  */.  for(i=0; i<
35340 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  nCell; i++){.   
35350 20 69 6e 74 20 73 7a 20 3d 20 73 7a 43 65 6c 6c   int sz = szCell
35360 5b 69 5d 3b 0a 20 20 20 20 69 6e 74 20 72 63 3b  [i];.    int rc;
35370 0a 20 20 20 20 75 38 20 2a 70 53 6c 6f 74 3b 0a  .    u8 *pSlot;.
35380 20 20 20 20 69 66 28 20 62 46 72 65 65 6c 69 73      if( bFreelis
35390 74 3d 3d 30 20 7c 7c 20 28 70 53 6c 6f 74 20 3d  t==0 || (pSlot =
353a0 20 70 61 67 65 46 69 6e 64 53 6c 6f 74 28 70 50   pageFindSlot(pP
353b0 67 2c 20 73 7a 2c 20 26 72 63 2c 20 30 29 29 3d  g, sz, &rc, 0))=
353c0 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 44 61 74  =0 ){.      pDat
353d0 61 20 2d 3d 20 73 7a 3b 0a 20 20 20 20 20 20 69  a -= sz;.      i
353e0 66 28 20 70 44 61 74 61 3c 70 42 65 67 69 6e 20  f( pData<pBegin 
353f0 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20  ) return 1;.    
35400 20 20 70 53 6c 6f 74 20 3d 20 70 44 61 74 61 3b    pSlot = pData;
35410 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 63 70  .    }.    memcp
35420 79 28 70 53 6c 6f 74 2c 20 61 70 43 65 6c 6c 5b  y(pSlot, apCell[
35430 69 5d 2c 20 73 7a 29 3b 0a 20 20 20 20 70 75 74  i], sz);.    put
35440 32 62 79 74 65 28 70 43 65 6c 6c 70 74 72 2c 20  2byte(pCellptr, 
35450 28 70 53 6c 6f 74 20 2d 20 61 44 61 74 61 29 29  (pSlot - aData))
35460 3b 0a 20 20 20 20 70 43 65 6c 6c 70 74 72 20 2b  ;.    pCellptr +
35470 3d 20 32 3b 0a 20 20 7d 0a 20 20 2a 70 70 44 61  = 2;.  }.  *ppDa
35480 74 61 20 3d 20 70 44 61 74 61 3b 0a 20 20 72 65  ta = pData;.  re
35490 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
354a0 20 41 72 72 61 79 20 61 70 43 65 6c 6c 5b 5d 20   Array apCell[] 
354b0 63 6f 6e 74 61 69 6e 73 20 6e 43 65 6c 6c 20 70  contains nCell p
354c0 6f 69 6e 74 65 72 73 20 74 6f 20 62 2d 74 72 65  ointers to b-tre
354d0 65 20 63 65 6c 6c 73 2e 20 41 72 72 61 79 20 73  e cells. Array s
354e0 7a 43 65 6c 6c 20 0a 2a 2a 20 63 6f 6e 74 61 69  zCell .** contai
354f0 6e 73 20 74 68 65 20 73 69 7a 65 20 69 6e 20 62  ns the size in b
35500 79 74 65 73 20 6f 66 20 65 61 63 68 20 73 75 63  ytes of each suc
35510 68 20 63 65 6c 6c 2e 20 54 68 69 73 20 66 75 6e  h cell. This fun
35520 63 74 69 6f 6e 20 61 64 64 73 20 74 68 65 0a 2a  ction adds the.*
35530 2a 20 73 70 61 63 65 20 61 73 73 6f 63 69 61 74  * space associat
35540 65 64 20 77 69 74 68 20 65 61 63 68 20 63 65 6c  ed with each cel
35550 6c 20 69 6e 20 74 68 65 20 61 72 72 61 79 20 74  l in the array t
35560 68 61 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79  hat is currently
35570 20 73 74 6f 72 65 64 20 0a 2a 2a 20 77 69 74 68   stored .** with
35580 69 6e 20 74 68 65 20 62 6f 64 79 20 6f 66 20 70  in the body of p
35590 50 67 20 74 6f 20 74 68 65 20 70 50 67 20 66 72  Pg to the pPg fr
355a0 65 65 2d 6c 69 73 74 2e 20 54 68 65 20 63 65 6c  ee-list. The cel
355b0 6c 2d 70 6f 69 6e 74 65 72 73 20 61 6e 64 20 6f  l-pointers and o
355c0 74 68 65 72 0a 2a 2a 20 66 69 65 6c 64 73 20 6f  ther.** fields o
355d0 66 20 74 68 65 20 70 61 67 65 20 61 72 65 20 6e  f the page are n
355e0 6f 74 20 75 70 64 61 74 65 64 2e 0a 2a 2a 0a 2a  ot updated..**.*
355f0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
35600 72 65 74 75 72 6e 73 20 74 68 65 20 74 6f 74 61  returns the tota
35610 6c 20 6e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c  l number of cell
35620 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 66  s added to the f
35630 72 65 65 2d 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61  ree-list..*/.sta
35640 74 69 63 20 69 6e 74 20 70 61 67 65 46 72 65 65  tic int pageFree
35650 41 72 72 61 79 28 0a 20 20 4d 65 6d 50 61 67 65  Array(.  MemPage
35660 20 2a 70 50 67 2c 20 20 20 20 20 20 20 20 20 20   *pPg,          
35670 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
35680 20 74 6f 20 65 64 69 74 20 2a 2f 0a 20 20 69 6e   to edit */.  in
35690 74 20 6e 43 65 6c 6c 2c 20 20 20 20 20 20 20 20  t nCell,        
356a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
356b0 20 43 65 6c 6c 73 20 74 6f 20 64 65 6c 65 74 65   Cells to delete
356c0 20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43 65 6c   */.  u8 **apCel
356d0 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
356e0 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f        /* Array o
356f0 66 20 63 65 6c 6c 73 20 2a 2f 0a 20 20 75 31 36  f cells */.  u16
35700 20 2a 73 7a 43 65 6c 6c 20 20 20 20 20 20 20 20   *szCell        
35710 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
35720 41 72 72 61 79 20 6f 66 20 63 65 6c 6c 20 73 69  Array of cell si
35730 7a 65 73 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a  zes */.){.  u8 *
35740 20 63 6f 6e 73 74 20 61 44 61 74 61 20 3d 20 70   const aData = p
35750 50 67 2d 3e 61 44 61 74 61 3b 0a 20 20 75 38 20  Pg->aData;.  u8 
35760 2a 20 63 6f 6e 73 74 20 70 45 6e 64 20 3d 20 26  * const pEnd = &
35770 61 44 61 74 61 5b 70 50 67 2d 3e 70 42 74 2d 3e  aData[pPg->pBt->
35780 75 73 61 62 6c 65 53 69 7a 65 5d 3b 0a 20 20 75  usableSize];.  u
35790 38 20 2a 20 63 6f 6e 73 74 20 70 53 74 61 72 74  8 * const pStart
357a0 20 3d 20 26 61 44 61 74 61 5b 70 50 67 2d 3e 68   = &aData[pPg->h
357b0 64 72 4f 66 66 73 65 74 20 2b 20 38 20 2b 20 70  drOffset + 8 + p
357c0 50 67 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65  Pg->childPtrSize
357d0 5d 3b 0a 20 20 69 6e 74 20 6e 52 65 74 20 3d 20  ];.  int nRet = 
357e0 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 75 38  0;.  int i;.  u8
357f0 20 2a 70 46 72 65 65 20 3d 20 30 3b 0a 20 20 69   *pFree = 0;.  i
35800 6e 74 20 73 7a 46 72 65 65 20 3d 20 30 3b 0a 0a  nt szFree = 0;..
35810 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65    for(i=0; i<nCe
35820 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38  ll; i++){.    u8
35830 20 2a 70 43 65 6c 6c 20 3d 20 61 70 43 65 6c 6c   *pCell = apCell
35840 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 43 65  [i];.    if( pCe
35850 6c 6c 3e 3d 70 53 74 61 72 74 20 26 26 20 70 43  ll>=pStart && pC
35860 65 6c 6c 3c 70 45 6e 64 20 29 7b 0a 20 20 20 20  ell<pEnd ){.    
35870 20 20 69 6e 74 20 73 7a 20 3d 20 73 7a 43 65 6c    int sz = szCel
35880 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  l[i];.      if( 
35890 70 46 72 65 65 21 3d 28 70 43 65 6c 6c 20 2b 20  pFree!=(pCell + 
358a0 73 7a 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69  sz) ){.        i
358b0 66 28 20 70 46 72 65 65 20 29 7b 0a 20 20 20 20  f( pFree ){.    
358c0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 46        assert( pF
358d0 72 65 65 3e 61 44 61 74 61 20 26 26 20 28 70 46  ree>aData && (pF
358e0 72 65 65 20 2d 20 61 44 61 74 61 29 3c 36 35 35  ree - aData)<655
358f0 33 36 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  36 );.          
35900 66 72 65 65 53 70 61 63 65 28 70 50 67 2c 20 28  freeSpace(pPg, (
35910 75 31 36 29 28 70 46 72 65 65 20 2d 20 61 44 61  u16)(pFree - aDa
35920 74 61 29 2c 20 73 7a 46 72 65 65 29 3b 0a 20 20  ta), szFree);.  
35930 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
35940 70 46 72 65 65 20 3d 20 70 43 65 6c 6c 3b 0a 20  pFree = pCell;. 
35950 20 20 20 20 20 20 20 73 7a 46 72 65 65 20 3d 20         szFree = 
35960 73 7a 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  sz;.        if( 
35970 70 46 72 65 65 2b 73 7a 3e 70 45 6e 64 20 29 20  pFree+sz>pEnd ) 
35980 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
35990 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
359a0 46 72 65 65 20 3d 20 70 43 65 6c 6c 3b 0a 20 20  Free = pCell;.  
359b0 20 20 20 20 20 20 73 7a 46 72 65 65 20 2b 3d 20        szFree += 
359c0 73 7a 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  sz;.      }.    
359d0 20 20 6e 52 65 74 2b 2b 3b 0a 20 20 20 20 7d 0a    nRet++;.    }.
359e0 20 20 7d 0a 20 20 69 66 28 20 70 46 72 65 65 20    }.  if( pFree 
359f0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
35a00 46 72 65 65 3e 61 44 61 74 61 20 26 26 20 28 70  Free>aData && (p
35a10 46 72 65 65 20 2d 20 61 44 61 74 61 29 3c 36 35  Free - aData)<65
35a20 35 33 36 20 29 3b 0a 20 20 20 20 66 72 65 65 53  536 );.    freeS
35a30 70 61 63 65 28 70 50 67 2c 20 28 75 31 36 29 28  pace(pPg, (u16)(
35a40 70 46 72 65 65 20 2d 20 61 44 61 74 61 29 2c 20  pFree - aData), 
35a50 73 7a 46 72 65 65 29 3b 0a 20 20 7d 0a 20 20 72  szFree);.  }.  r
35a60 65 74 75 72 6e 20 6e 52 65 74 3b 0a 7d 0a 0a 2f  eturn nRet;.}../
35a70 2a 0a 2a 2a 20 61 70 43 65 6c 6c 5b 5d 20 61 6e  *.** apCell[] an
35a80 64 20 73 7a 43 65 6c 6c 5b 5d 20 63 6f 6e 74 61  d szCell[] conta
35a90 69 6e 73 20 70 6f 69 6e 74 65 72 73 20 74 6f 20  ins pointers to 
35aa0 61 6e 64 20 73 69 7a 65 73 20 6f 66 20 61 6c 6c  and sizes of all
35ab0 20 63 65 6c 6c 73 20 69 6e 20 74 68 65 0a 2a 2a   cells in the.**
35ac0 20 70 61 67 65 73 20 62 65 69 6e 67 20 62 61 6c   pages being bal
35ad0 61 6e 63 65 64 2e 20 20 54 68 65 20 63 75 72 72  anced.  The curr
35ae0 65 6e 74 20 70 61 67 65 2c 20 70 50 67 2c 20 68  ent page, pPg, h
35af0 61 73 20 70 50 67 2d 3e 6e 43 65 6c 6c 20 63 65  as pPg->nCell ce
35b00 6c 6c 73 20 73 74 61 72 74 69 6e 67 0a 2a 2a 20  lls starting.** 
35b10 77 69 74 68 20 61 70 43 65 6c 6c 5b 69 4f 6c 64  with apCell[iOld
35b20 5d 2e 20 20 41 66 74 65 72 20 62 61 6c 61 6e 63  ].  After balanc
35b30 69 6e 67 2c 20 74 68 69 73 20 70 61 67 65 20 73  ing, this page s
35b40 68 6f 75 6c 64 20 68 6f 6c 64 20 6e 4e 65 77 20  hould hold nNew 
35b50 63 65 6c 6c 73 0a 2a 2a 20 73 74 61 72 74 69 6e  cells.** startin
35b60 67 20 61 74 20 61 70 43 65 6c 6c 5b 69 4e 65 77  g at apCell[iNew
35b70 5d 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  ]..**.** This ro
35b80 75 74 69 6e 65 20 6d 61 6b 65 73 20 74 68 65 20  utine makes the 
35b90 6e 65 63 65 73 73 61 72 79 20 61 64 6a 75 73 74  necessary adjust
35ba0 6d 65 6e 74 73 20 74 6f 20 70 50 67 20 73 6f 20  ments to pPg so 
35bb0 74 68 61 74 20 69 74 20 63 6f 6e 74 61 69 6e 73  that it contains
35bc0 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65 63 74 20  .** the correct 
35bd0 63 65 6c 6c 73 20 61 66 74 65 72 20 62 65 69 6e  cells after bein
35be0 67 20 62 61 6c 61 6e 63 65 64 2e 0a 2a 2a 0a 2a  g balanced..**.*
35bf0 2a 20 54 68 65 20 70 50 67 2d 3e 6e 46 72 65 65  * The pPg->nFree
35c00 20 66 69 65 6c 64 20 69 73 20 69 6e 76 61 6c 69   field is invali
35c10 64 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  d when this func
35c20 74 69 6f 6e 20 72 65 74 75 72 6e 73 2e 20 49 74  tion returns. It
35c30 20 69 73 20 74 68 65 0a 2a 2a 20 72 65 73 70 6f   is the.** respo
35c40 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65  nsibility of the
35c50 20 63 61 6c 6c 65 72 20 74 6f 20 73 65 74 20 69   caller to set i
35c60 74 20 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2f 0a  t correctly..*/.
35c70 73 74 61 74 69 63 20 76 6f 69 64 20 65 64 69 74  static void edit
35c80 50 61 67 65 28 0a 20 20 4d 65 6d 50 61 67 65 20  Page(.  MemPage 
35c90 2a 70 50 67 2c 20 20 20 20 20 20 20 20 20 20 20  *pPg,           
35ca0 20 20 20 20 20 20 20 20 2f 2a 20 45 64 69 74 20          /* Edit 
35cb0 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20 20 69  this page */.  i
35cc0 6e 74 20 69 4f 6c 64 2c 20 20 20 20 20 20 20 20  nt iOld,        
35cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
35ce0 2a 20 49 6e 64 65 78 20 6f 66 20 66 69 72 73 74  * Index of first
35cf0 20 63 65 6c 6c 20 63 75 72 72 65 6e 74 6c 79 20   cell currently 
35d00 6f 6e 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74  on page */.  int
35d10 20 69 4e 65 77 2c 20 20 20 20 20 20 20 20 20 20   iNew,          
35d20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
35d30 49 6e 64 65 78 20 6f 66 20 6e 65 77 20 66 69 72  Index of new fir
35d40 73 74 20 63 65 6c 6c 20 6f 6e 20 70 61 67 65 20  st cell on page 
35d50 2a 2f 0a 20 20 69 6e 74 20 6e 4e 65 77 2c 20 20  */.  int nNew,  
35d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35d70 20 20 20 20 20 2f 2a 20 46 69 6e 61 6c 20 6e 75       /* Final nu
35d80 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 6f 6e  mber of cells on
35d90 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 2a   page */.  u8 **
35da0 61 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20  apCell,         
35db0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72             /* Ar
35dc0 72 61 79 20 6f 66 20 63 65 6c 6c 73 20 2a 2f 0a  ray of cells */.
35dd0 20 20 75 31 36 20 2a 73 7a 43 65 6c 6c 20 20 20    u16 *szCell   
35de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35df0 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 63 65    /* Array of ce
35e00 6c 6c 20 73 69 7a 65 73 20 2a 2f 0a 29 7b 0a 20  ll sizes */.){. 
35e10 20 75 38 20 2a 20 63 6f 6e 73 74 20 61 44 61 74   u8 * const aDat
35e20 61 20 3d 20 70 50 67 2d 3e 61 44 61 74 61 3b 0a  a = pPg->aData;.
35e30 20 20 63 6f 6e 73 74 20 69 6e 74 20 68 64 72 20    const int hdr 
35e40 3d 20 70 50 67 2d 3e 68 64 72 4f 66 66 73 65 74  = pPg->hdrOffset
35e50 3b 0a 20 20 75 38 20 2a 70 42 65 67 69 6e 20 3d  ;.  u8 *pBegin =
35e60 20 26 70 50 67 2d 3e 61 43 65 6c 6c 49 64 78 5b   &pPg->aCellIdx[
35e70 6e 4e 65 77 20 2a 20 32 5d 3b 0a 20 20 69 6e 74  nNew * 2];.  int
35e80 20 6e 43 65 6c 6c 20 3d 20 70 50 67 2d 3e 6e 43   nCell = pPg->nC
35e90 65 6c 6c 3b 20 20 20 20 20 20 20 2f 2a 20 43 65  ell;       /* Ce
35ea0 6c 6c 73 20 73 74 6f 72 65 64 20 6f 6e 20 70 50  lls stored on pP
35eb0 67 20 2a 2f 0a 20 20 75 38 20 2a 70 44 61 74 61  g */.  u8 *pData
35ec0 3b 0a 20 20 75 38 20 2a 70 43 65 6c 6c 70 74 72  ;.  u8 *pCellptr
35ed0 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  ;.  int i;.  int
35ee0 20 69 4f 6c 64 45 6e 64 20 3d 20 69 4f 6c 64 20   iOldEnd = iOld 
35ef0 2b 20 70 50 67 2d 3e 6e 43 65 6c 6c 20 2b 20 70  + pPg->nCell + p
35f00 50 67 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20  Pg->nOverflow;. 
35f10 20 69 6e 74 20 69 4e 65 77 45 6e 64 20 3d 20 69   int iNewEnd = i
35f20 4e 65 77 20 2b 20 6e 4e 65 77 3b 0a 0a 23 69 66  New + nNew;..#if
35f30 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
35f40 0a 20 20 75 38 20 2a 70 54 6d 70 20 3d 20 73 71  .  u8 *pTmp = sq
35f50 6c 69 74 65 33 50 61 67 65 72 54 65 6d 70 53 70  lite3PagerTempSp
35f60 61 63 65 28 70 50 67 2d 3e 70 42 74 2d 3e 70 50  ace(pPg->pBt->pP
35f70 61 67 65 72 29 3b 0a 20 20 6d 65 6d 63 70 79 28  ager);.  memcpy(
35f80 70 54 6d 70 2c 20 61 44 61 74 61 2c 20 70 50 67  pTmp, aData, pPg
35f90 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
35fa0 65 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a  e);.#endif..  /*
35fb0 20 52 65 6d 6f 76 65 20 63 65 6c 6c 73 20 66 72   Remove cells fr
35fc0 6f 6d 20 74 68 65 20 73 74 61 72 74 20 61 6e 64  om the start and
35fd0 20 65 6e 64 20 6f 66 20 74 68 65 20 70 61 67 65   end of the page
35fe0 20 2a 2f 0a 20 20 69 66 28 20 69 4f 6c 64 3c 69   */.  if( iOld<i
35ff0 4e 65 77 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e  New ){.    int n
36000 53 68 69 66 74 20 3d 20 70 61 67 65 46 72 65 65  Shift = pageFree
36010 41 72 72 61 79 28 0a 20 20 20 20 20 20 20 20 70  Array(.        p
36020 50 67 2c 20 69 4e 65 77 2d 69 4f 6c 64 2c 20 26  Pg, iNew-iOld, &
36030 61 70 43 65 6c 6c 5b 69 4f 6c 64 5d 2c 20 26 73  apCell[iOld], &s
36040 7a 43 65 6c 6c 5b 69 4f 6c 64 5d 0a 20 20 20 20  zCell[iOld].    
36050 29 3b 0a 20 20 20 20 6d 65 6d 6d 6f 76 65 28 70  );.    memmove(p
36060 50 67 2d 3e 61 43 65 6c 6c 49 64 78 2c 20 26 70  Pg->aCellIdx, &p
36070 50 67 2d 3e 61 43 65 6c 6c 49 64 78 5b 6e 53 68  Pg->aCellIdx[nSh
36080 69 66 74 2a 32 5d 2c 20 6e 43 65 6c 6c 2a 32 29  ift*2], nCell*2)
36090 3b 0a 20 20 20 20 6e 43 65 6c 6c 20 2d 3d 20 6e  ;.    nCell -= n
360a0 53 68 69 66 74 3b 0a 20 20 7d 0a 20 20 69 66 28  Shift;.  }.  if(
360b0 20 69 4e 65 77 45 6e 64 20 3c 20 69 4f 6c 64 45   iNewEnd < iOldE
360c0 6e 64 20 29 7b 0a 20 20 20 20 6e 43 65 6c 6c 20  nd ){.    nCell 
360d0 2d 3d 20 70 61 67 65 46 72 65 65 41 72 72 61 79  -= pageFreeArray
360e0 28 0a 20 20 20 20 20 20 20 20 70 50 67 2c 20 69  (.        pPg, i
360f0 4f 6c 64 45 6e 64 2d 69 4e 65 77 45 6e 64 2c 20  OldEnd-iNewEnd, 
36100 26 61 70 43 65 6c 6c 5b 69 4e 65 77 45 6e 64 5d  &apCell[iNewEnd]
36110 2c 20 26 73 7a 43 65 6c 6c 5b 69 4e 65 77 45 6e  , &szCell[iNewEn
36120 64 5d 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 0a 20  d].    );.  }.. 
36130 20 70 44 61 74 61 20 3d 20 26 61 44 61 74 61 5b   pData = &aData[
36140 67 65 74 32 62 79 74 65 4e 6f 74 5a 65 72 6f 28  get2byteNotZero(
36150 26 61 44 61 74 61 5b 68 64 72 2b 35 5d 29 5d 3b  &aData[hdr+5])];
36160 0a 20 20 69 66 28 20 70 44 61 74 61 3c 70 42 65  .  if( pData<pBe
36170 67 69 6e 20 29 20 67 6f 74 6f 20 65 64 69 74 70  gin ) goto editp
36180 61 67 65 5f 66 61 69 6c 3b 0a 0a 20 20 2f 2a 20  age_fail;..  /* 
36190 41 64 64 20 63 65 6c 6c 73 20 74 6f 20 74 68 65  Add cells to the
361a0 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 70 61   start of the pa
361b0 67 65 20 2a 2f 0a 20 20 69 66 28 20 69 4e 65 77  ge */.  if( iNew
361c0 3c 69 4f 6c 64 20 29 7b 0a 20 20 20 20 69 6e 74  <iOld ){.    int
361d0 20 6e 41 64 64 20 3d 20 4d 49 4e 28 6e 4e 65 77   nAdd = MIN(nNew
361e0 2c 69 4f 6c 64 2d 69 4e 65 77 29 3b 0a 20 20 20  ,iOld-iNew);.   
361f0 20 61 73 73 65 72 74 28 20 28 69 4f 6c 64 2d 69   assert( (iOld-i
36200 4e 65 77 29 3c 6e 4e 65 77 20 7c 7c 20 6e 43 65  New)<nNew || nCe
36210 6c 6c 3d 3d 30 20 7c 7c 20 43 4f 52 52 55 50 54  ll==0 || CORRUPT
36220 5f 44 42 20 29 3b 0a 20 20 20 20 70 43 65 6c 6c  _DB );.    pCell
36230 70 74 72 20 3d 20 70 50 67 2d 3e 61 43 65 6c 6c  ptr = pPg->aCell
36240 49 64 78 3b 0a 20 20 20 20 6d 65 6d 6d 6f 76 65  Idx;.    memmove
36250 28 26 70 43 65 6c 6c 70 74 72 5b 6e 41 64 64 2a  (&pCellptr[nAdd*
36260 32 5d 2c 20 70 43 65 6c 6c 70 74 72 2c 20 6e 43  2], pCellptr, nC
36270 65 6c 6c 2a 32 29 3b 0a 20 20 20 20 69 66 28 20  ell*2);.    if( 
36280 70 61 67 65 49 6e 73 65 72 74 41 72 72 61 79 28  pageInsertArray(
36290 0a 20 20 20 20 20 20 20 20 20 20 70 50 67 2c 20  .          pPg, 
362a0 70 42 65 67 69 6e 2c 20 26 70 44 61 74 61 2c 20  pBegin, &pData, 
362b0 70 43 65 6c 6c 70 74 72 2c 0a 20 20 20 20 20 20  pCellptr,.      
362c0 20 20 20 20 6e 41 64 64 2c 20 26 61 70 43 65 6c      nAdd, &apCel
362d0 6c 5b 69 4e 65 77 5d 2c 20 26 73 7a 43 65 6c 6c  l[iNew], &szCell
362e0 5b 69 4e 65 77 5d 0a 20 20 20 20 29 20 29 20 67  [iNew].    ) ) g
362f0 6f 74 6f 20 65 64 69 74 70 61 67 65 5f 66 61 69  oto editpage_fai
36300 6c 3b 0a 20 20 20 20 6e 43 65 6c 6c 20 2b 3d 20  l;.    nCell += 
36310 6e 41 64 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  nAdd;.  }..  /* 
36320 41 64 64 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77  Add any overflow
36330 20 63 65 6c 6c 73 20 2a 2f 0a 20 20 66 6f 72 28   cells */.  for(
36340 69 3d 30 3b 20 69 3c 70 50 67 2d 3e 6e 4f 76 65  i=0; i<pPg->nOve
36350 72 66 6c 6f 77 3b 20 69 2b 2b 29 7b 0a 20 20 20  rflow; i++){.   
36360 20 69 6e 74 20 69 43 65 6c 6c 20 3d 20 28 69 4f   int iCell = (iO
36370 6c 64 20 2b 20 70 50 67 2d 3e 61 69 4f 76 66 6c  ld + pPg->aiOvfl
36380 5b 69 5d 29 20 2d 20 69 4e 65 77 3b 0a 20 20 20  [i]) - iNew;.   
36390 20 69 66 28 20 69 43 65 6c 6c 3e 3d 30 20 26 26   if( iCell>=0 &&
363a0 20 69 43 65 6c 6c 3c 6e 4e 65 77 20 29 7b 0a 20   iCell<nNew ){. 
363b0 20 20 20 20 20 70 43 65 6c 6c 70 74 72 20 3d 20       pCellptr = 
363c0 26 70 50 67 2d 3e 61 43 65 6c 6c 49 64 78 5b 69  &pPg->aCellIdx[i
363d0 43 65 6c 6c 20 2a 20 32 5d 3b 0a 20 20 20 20 20  Cell * 2];.     
363e0 20 6d 65 6d 6d 6f 76 65 28 26 70 43 65 6c 6c 70   memmove(&pCellp
363f0 74 72 5b 32 5d 2c 20 70 43 65 6c 6c 70 74 72 2c  tr[2], pCellptr,
36400 20 28 6e 43 65 6c 6c 20 2d 20 69 43 65 6c 6c 29   (nCell - iCell)
36410 20 2a 20 32 29 3b 0a 20 20 20 20 20 20 6e 43 65   * 2);.      nCe
36420 6c 6c 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20  ll++;.      if( 
36430 70 61 67 65 49 6e 73 65 72 74 41 72 72 61 79 28  pageInsertArray(
36440 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 50 67  .            pPg
36450 2c 20 70 42 65 67 69 6e 2c 20 26 70 44 61 74 61  , pBegin, &pData
36460 2c 20 70 43 65 6c 6c 70 74 72 2c 0a 20 20 20 20  , pCellptr,.    
36470 20 20 20 20 20 20 20 20 31 2c 20 26 61 70 43 65          1, &apCe
36480 6c 6c 5b 69 43 65 6c 6c 20 2b 20 69 4e 65 77 5d  ll[iCell + iNew]
36490 2c 20 26 73 7a 43 65 6c 6c 5b 69 43 65 6c 6c 20  , &szCell[iCell 
364a0 2b 20 69 4e 65 77 5d 0a 20 20 20 20 20 20 29 20  + iNew].      ) 
364b0 29 20 67 6f 74 6f 20 65 64 69 74 70 61 67 65 5f  ) goto editpage_
364c0 66 61 69 6c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  fail;.    }.  }.
364d0 0a 20 20 2f 2a 20 41 70 70 65 6e 64 20 63 65 6c  .  /* Append cel
364e0 6c 73 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66  ls to the end of
364f0 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 70   the page */.  p
36500 43 65 6c 6c 70 74 72 20 3d 20 26 70 50 67 2d 3e  Cellptr = &pPg->
36510 61 43 65 6c 6c 49 64 78 5b 6e 43 65 6c 6c 2a 32  aCellIdx[nCell*2
36520 5d 3b 0a 20 20 69 66 28 20 70 61 67 65 49 6e 73  ];.  if( pageIns
36530 65 72 74 41 72 72 61 79 28 0a 20 20 20 20 20 20  ertArray(.      
36540 20 20 70 50 67 2c 20 70 42 65 67 69 6e 2c 20 26    pPg, pBegin, &
36550 70 44 61 74 61 2c 20 70 43 65 6c 6c 70 74 72 2c  pData, pCellptr,
36560 0a 20 20 20 20 20 20 20 20 6e 4e 65 77 2d 6e 43  .        nNew-nC
36570 65 6c 6c 2c 20 26 61 70 43 65 6c 6c 5b 69 4e 65  ell, &apCell[iNe
36580 77 2b 6e 43 65 6c 6c 5d 2c 20 26 73 7a 43 65 6c  w+nCell], &szCel
36590 6c 5b 69 4e 65 77 2b 6e 43 65 6c 6c 5d 0a 20 20  l[iNew+nCell].  
365a0 29 20 29 20 67 6f 74 6f 20 65 64 69 74 70 61 67  ) ) goto editpag
365b0 65 5f 66 61 69 6c 3b 0a 0a 20 20 70 50 67 2d 3e  e_fail;..  pPg->
365c0 6e 43 65 6c 6c 20 3d 20 6e 4e 65 77 3b 0a 20 20  nCell = nNew;.  
365d0 70 50 67 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d  pPg->nOverflow =
365e0 20 30 3b 0a 0a 20 20 70 75 74 32 62 79 74 65 28   0;..  put2byte(
365f0 26 61 44 61 74 61 5b 68 64 72 2b 33 5d 2c 20 70  &aData[hdr+3], p
36600 50 67 2d 3e 6e 43 65 6c 6c 29 3b 0a 20 20 70 75  Pg->nCell);.  pu
36610 74 32 62 79 74 65 28 26 61 44 61 74 61 5b 68 64  t2byte(&aData[hd
36620 72 2b 35 5d 2c 20 70 44 61 74 61 20 2d 20 61 44  r+5], pData - aD
36630 61 74 61 29 3b 0a 0a 23 69 66 64 65 66 20 53 51  ata);..#ifdef SQ
36640 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 66 6f 72  LITE_DEBUG.  for
36650 28 69 3d 30 3b 20 69 3c 6e 4e 65 77 20 26 26 20  (i=0; i<nNew && 
36660 21 43 4f 52 52 55 50 54 5f 44 42 3b 20 69 2b 2b  !CORRUPT_DB; i++
36670 29 7b 0a 20 20 20 20 75 38 20 2a 70 43 65 6c 6c  ){.    u8 *pCell
36680 20 3d 20 61 70 43 65 6c 6c 5b 69 2b 69 4e 65 77   = apCell[i+iNew
36690 5d 3b 0a 20 20 20 20 69 6e 74 20 69 4f 66 66 20  ];.    int iOff 
366a0 3d 20 67 65 74 32 62 79 74 65 28 26 70 50 67 2d  = get2byte(&pPg-
366b0 3e 61 43 65 6c 6c 49 64 78 5b 69 2a 32 5d 29 3b  >aCellIdx[i*2]);
366c0 0a 20 20 20 20 69 66 28 20 70 43 65 6c 6c 3e 3d  .    if( pCell>=
366d0 61 44 61 74 61 20 26 26 20 70 43 65 6c 6c 3c 26  aData && pCell<&
366e0 61 44 61 74 61 5b 70 50 67 2d 3e 70 42 74 2d 3e  aData[pPg->pBt->
366f0 75 73 61 62 6c 65 53 69 7a 65 5d 20 29 7b 0a 20  usableSize] ){. 
36700 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 26 70 54       pCell = &pT
36710 6d 70 5b 70 43 65 6c 6c 20 2d 20 61 44 61 74 61  mp[pCell - aData
36720 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  ];.    }.    ass
36730 65 72 74 28 20 30 3d 3d 6d 65 6d 63 6d 70 28 70  ert( 0==memcmp(p
36740 43 65 6c 6c 2c 20 26 61 44 61 74 61 5b 69 4f 66  Cell, &aData[iOf
36750 66 5d 2c 20 73 7a 43 65 6c 6c 5b 69 2b 69 4e 65  f], szCell[i+iNe
36760 77 5d 29 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  w]) );.  }.#endi
36770 66 0a 0a 20 20 72 65 74 75 72 6e 3b 0a 20 65 64  f..  return;. ed
36780 69 74 70 61 67 65 5f 66 61 69 6c 3a 0a 20 20 2f  itpage_fail:.  /
36790 2a 20 55 6e 61 62 6c 65 20 74 6f 20 65 64 69 74  * Unable to edit
367a0 20 74 68 69 73 20 70 61 67 65 2e 20 52 65 62 75   this page. Rebu
367b0 69 6c 64 20 69 74 20 66 72 6f 6d 20 73 63 72 61  ild it from scra
367c0 74 63 68 20 69 6e 73 74 65 61 64 2e 20 2a 2f 0a  tch instead. */.
367d0 20 20 72 65 62 75 69 6c 64 50 61 67 65 28 70 50    rebuildPage(pP
367e0 67 2c 20 6e 4e 65 77 2c 20 26 61 70 43 65 6c 6c  g, nNew, &apCell
367f0 5b 69 4e 65 77 5d 2c 20 26 73 7a 43 65 6c 6c 5b  [iNew], &szCell[
36800 69 4e 65 77 5d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  iNew]);.}../*.**
36810 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70   The following p
36820 61 72 61 6d 65 74 65 72 73 20 64 65 74 65 72 6d  arameters determ
36830 69 6e 65 20 68 6f 77 20 6d 61 6e 79 20 61 64 6a  ine how many adj
36840 61 63 65 6e 74 20 70 61 67 65 73 20 67 65 74 20  acent pages get 
36850 69 6e 76 6f 6c 76 65 64 0a 2a 2a 20 69 6e 20 61  involved.** in a
36860 20 62 61 6c 61 6e 63 69 6e 67 20 6f 70 65 72 61   balancing opera
36870 74 69 6f 6e 2e 20 20 4e 4e 20 69 73 20 74 68 65  tion.  NN is the
36880 20 6e 75 6d 62 65 72 20 6f 66 20 6e 65 69 67 68   number of neigh
36890 62 6f 72 73 20 6f 6e 20 65 69 74 68 65 72 20 73  bors on either s
368a0 69 64 65 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61  ide.** of the pa
368b0 67 65 20 74 68 61 74 20 70 61 72 74 69 63 69 70  ge that particip
368c0 61 74 65 20 69 6e 20 74 68 65 20 62 61 6c 61 6e  ate in the balan
368d0 63 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 2e 20  cing operation. 
368e0 20 4e 42 20 69 73 20 74 68 65 0a 2a 2a 20 74 6f   NB is the.** to
368f0 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  tal number of pa
36900 67 65 73 20 74 68 61 74 20 70 61 72 74 69 63 69  ges that partici
36910 70 61 74 65 2c 20 69 6e 63 6c 75 64 69 6e 67 20  pate, including 
36920 74 68 65 20 74 61 72 67 65 74 20 70 61 67 65 20  the target page 
36930 61 6e 64 0a 2a 2a 20 4e 4e 20 6e 65 69 67 68 62  and.** NN neighb
36940 6f 72 73 20 6f 6e 20 65 69 74 68 65 72 20 73 69  ors on either si
36950 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 69  de..**.** The mi
36960 6e 69 6d 75 6d 20 76 61 6c 75 65 20 6f 66 20 4e  nimum value of N
36970 4e 20 69 73 20 31 20 28 6f 66 20 63 6f 75 72 73  N is 1 (of cours
36980 65 29 2e 20 20 49 6e 63 72 65 61 73 69 6e 67 20  e).  Increasing 
36990 4e 4e 20 61 62 6f 76 65 20 31 0a 2a 2a 20 28 74  NN above 1.** (t
369a0 6f 20 32 20 6f 72 20 33 29 20 67 69 76 65 73 20  o 2 or 3) gives 
369b0 61 20 6d 6f 64 65 73 74 20 69 6d 70 72 6f 76 65  a modest improve
369c0 6d 65 6e 74 20 69 6e 20 53 45 4c 45 43 54 20 61  ment in SELECT a
369d0 6e 64 20 44 45 4c 45 54 45 20 70 65 72 66 6f 72  nd DELETE perfor
369e0 6d 61 6e 63 65 0a 2a 2a 20 69 6e 20 65 78 63 68  mance.** in exch
369f0 61 6e 67 65 20 66 6f 72 20 61 20 6c 61 72 67 65  ange for a large
36a00 72 20 64 65 67 72 61 64 61 74 69 6f 6e 20 69 6e  r degradation in
36a10 20 49 4e 53 45 52 54 20 61 6e 64 20 55 50 44 41   INSERT and UPDA
36a20 54 45 20 70 65 72 66 6f 72 6d 61 6e 63 65 2e 0a  TE performance..
36a30 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20  ** The value of 
36a40 4e 4e 20 61 70 70 65 61 72 73 20 74 6f 20 67 69  NN appears to gi
36a50 76 65 20 74 68 65 20 62 65 73 74 20 72 65 73 75  ve the best resu
36a60 6c 74 73 20 6f 76 65 72 61 6c 6c 2e 0a 2a 2f 0a  lts overall..*/.
36a70 23 64 65 66 69 6e 65 20 4e 4e 20 31 20 20 20 20  #define NN 1    
36a80 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
36a90 65 72 20 6f 66 20 6e 65 69 67 68 62 6f 72 73 20  er of neighbors 
36aa0 6f 6e 20 65 69 74 68 65 72 20 73 69 64 65 20 6f  on either side o
36ab0 66 20 70 50 61 67 65 20 2a 2f 0a 23 64 65 66 69  f pPage */.#defi
36ac0 6e 65 20 4e 42 20 28 4e 4e 2a 32 2b 31 29 20 20  ne NB (NN*2+1)  
36ad0 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 70 61 67      /* Total pag
36ae0 65 73 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20 74  es involved in t
36af0 68 65 20 62 61 6c 61 6e 63 65 20 2a 2f 0a 0a 0a  he balance */...
36b00 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
36b10 4d 49 54 5f 51 55 49 43 4b 42 41 4c 41 4e 43 45  MIT_QUICKBALANCE
36b20 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 76 65 72 73  ./*.** This vers
36b30 69 6f 6e 20 6f 66 20 62 61 6c 61 6e 63 65 28 29  ion of balance()
36b40 20 68 61 6e 64 6c 65 73 20 74 68 65 20 63 6f 6d   handles the com
36b50 6d 6f 6e 20 73 70 65 63 69 61 6c 20 63 61 73 65  mon special case
36b60 20 77 68 65 72 65 0a 2a 2a 20 61 20 6e 65 77 20   where.** a new 
36b70 65 6e 74 72 79 20 69 73 20 62 65 69 6e 67 20 69  entry is being i
36b80 6e 73 65 72 74 65 64 20 6f 6e 20 74 68 65 20 65  nserted on the e
36b90 78 74 72 65 6d 65 20 72 69 67 68 74 2d 65 6e 64  xtreme right-end
36ba0 20 6f 66 20 74 68 65 0a 2a 2a 20 74 72 65 65 2c   of the.** tree,
36bb0 20 69 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   in other words,
36bc0 20 77 68 65 6e 20 74 68 65 20 6e 65 77 20 65 6e   when the new en
36bd0 74 72 79 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20  try will become 
36be0 74 68 65 20 6c 61 72 67 65 73 74 0a 2a 2a 20 65  the largest.** e
36bf0 6e 74 72 79 20 69 6e 20 74 68 65 20 74 72 65 65  ntry in the tree
36c00 2e 0a 2a 2a 0a 2a 2a 20 49 6e 73 74 65 61 64 20  ..**.** Instead 
36c10 6f 66 20 74 72 79 69 6e 67 20 74 6f 20 62 61 6c  of trying to bal
36c20 61 6e 63 65 20 74 68 65 20 33 20 72 69 67 68 74  ance the 3 right
36c30 2d 6d 6f 73 74 20 6c 65 61 66 20 70 61 67 65 73  -most leaf pages
36c40 2c 20 6a 75 73 74 20 61 64 64 0a 2a 2a 20 61 20  , just add.** a 
36c50 6e 65 77 20 70 61 67 65 20 74 6f 20 74 68 65 20  new page to the 
36c60 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20  right-hand side 
36c70 61 6e 64 20 70 75 74 20 74 68 65 20 6f 6e 65 20  and put the one 
36c80 6e 65 77 20 65 6e 74 72 79 20 69 6e 0a 2a 2a 20  new entry in.** 
36c90 74 68 61 74 20 70 61 67 65 2e 20 20 54 68 69 73  that page.  This
36ca0 20 6c 65 61 76 65 73 20 74 68 65 20 72 69 67 68   leaves the righ
36cb0 74 20 73 69 64 65 20 6f 66 20 74 68 65 20 74 72  t side of the tr
36cc0 65 65 20 73 6f 6d 65 77 68 61 74 0a 2a 2a 20 75  ee somewhat.** u
36cd0 6e 62 61 6c 61 6e 63 65 64 2e 20 20 42 75 74 20  nbalanced.  But 
36ce0 6f 64 64 73 20 61 72 65 20 74 68 61 74 20 77 65  odds are that we
36cf0 20 77 69 6c 6c 20 62 65 20 69 6e 73 65 72 74 69   will be inserti
36d00 6e 67 20 6e 65 77 20 65 6e 74 72 69 65 73 0a 2a  ng new entries.*
36d10 2a 20 61 74 20 74 68 65 20 65 6e 64 20 73 6f 6f  * at the end soo
36d20 6e 20 61 66 74 65 72 77 61 72 64 73 20 73 6f 20  n afterwards so 
36d30 74 68 65 20 6e 65 61 72 6c 79 20 65 6d 70 74 79  the nearly empty
36d40 20 70 61 67 65 20 77 69 6c 6c 20 71 75 69 63 6b   page will quick
36d50 6c 79 0a 2a 2a 20 66 69 6c 6c 20 75 70 2e 20 20  ly.** fill up.  
36d60 4f 6e 20 61 76 65 72 61 67 65 2e 0a 2a 2a 0a 2a  On average..**.*
36d70 2a 20 70 50 61 67 65 20 69 73 20 74 68 65 20 6c  * pPage is the l
36d80 65 61 66 20 70 61 67 65 20 77 68 69 63 68 20 69  eaf page which i
36d90 73 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  s the right-most
36da0 20 70 61 67 65 20 69 6e 20 74 68 65 20 74 72 65   page in the tre
36db0 65 2e 0a 2a 2a 20 70 50 61 72 65 6e 74 20 69 73  e..** pParent is
36dc0 20 69 74 73 20 70 61 72 65 6e 74 2e 20 20 70 50   its parent.  pP
36dd0 61 67 65 20 6d 75 73 74 20 68 61 76 65 20 61 20  age must have a 
36de0 73 69 6e 67 6c 65 20 6f 76 65 72 66 6c 6f 77 20  single overflow 
36df0 65 6e 74 72 79 0a 2a 2a 20 77 68 69 63 68 20 69  entry.** which i
36e00 73 20 61 6c 73 6f 20 74 68 65 20 72 69 67 68 74  s also the right
36e10 2d 6d 6f 73 74 20 65 6e 74 72 79 20 6f 6e 20 74  -most entry on t
36e20 68 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54  he page..**.** T
36e30 68 65 20 70 53 70 61 63 65 20 62 75 66 66 65 72  he pSpace buffer
36e40 20 69 73 20 75 73 65 64 20 74 6f 20 73 74 6f 72   is used to stor
36e50 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20 63 6f  e a temporary co
36e60 70 79 20 6f 66 20 74 68 65 20 64 69 76 69 64 65  py of the divide
36e70 72 0a 2a 2a 20 63 65 6c 6c 20 74 68 61 74 20 77  r.** cell that w
36e80 69 6c 6c 20 62 65 20 69 6e 73 65 72 74 65 64 20  ill be inserted 
36e90 69 6e 74 6f 20 70 50 61 72 65 6e 74 2e 20 53 75  into pParent. Su
36ea0 63 68 20 61 20 63 65 6c 6c 20 63 6f 6e 73 69 73  ch a cell consis
36eb0 74 73 20 6f 66 20 61 20 34 0a 2a 2a 20 62 79 74  ts of a 4.** byt
36ec0 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 66 6f  e page number fo
36ed0 6c 6c 6f 77 65 64 20 62 79 20 61 20 76 61 72 69  llowed by a vari
36ee0 61 62 6c 65 20 6c 65 6e 67 74 68 20 69 6e 74 65  able length inte
36ef0 67 65 72 2e 20 49 6e 20 6f 74 68 65 72 0a 2a 2a  ger. In other.**
36f00 20 77 6f 72 64 73 2c 20 61 74 20 6d 6f 73 74 20   words, at most 
36f10 31 33 20 62 79 74 65 73 2e 20 48 65 6e 63 65 20  13 bytes. Hence 
36f20 74 68 65 20 70 53 70 61 63 65 20 62 75 66 66 65  the pSpace buffe
36f30 72 20 6d 75 73 74 20 62 65 20 61 74 0a 2a 2a 20  r must be at.** 
36f40 6c 65 61 73 74 20 31 33 20 62 79 74 65 73 20 69  least 13 bytes i
36f50 6e 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69  n size..*/.stati
36f60 63 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f 71 75  c int balance_qu
36f70 69 63 6b 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  ick(MemPage *pPa
36f80 72 65 6e 74 2c 20 4d 65 6d 50 61 67 65 20 2a 70  rent, MemPage *p
36f90 50 61 67 65 2c 20 75 38 20 2a 70 53 70 61 63 65  Page, u8 *pSpace
36fa0 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 63  ){.  BtShared *c
36fb0 6f 6e 73 74 20 70 42 74 20 3d 20 70 50 61 67 65  onst pBt = pPage
36fc0 2d 3e 70 42 74 3b 20 20 20 20 2f 2a 20 42 2d 54  ->pBt;    /* B-T
36fd0 72 65 65 20 44 61 74 61 62 61 73 65 20 2a 2f 0a  ree Database */.
36fe0 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 3b    MemPage *pNew;
36ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37000 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 6c 79 20         /* Newly 
37010 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 20 2a  allocated page *
37020 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
37030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37040 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
37050 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 50 67 6e  rn Code */.  Pgn
37060 6f 20 70 67 6e 6f 4e 65 77 3b 20 20 20 20 20 20  o pgnoNew;      
37070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37080 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72    /* Page number
37090 20 6f 66 20 70 4e 65 77 20 2a 2f 0a 0a 20 20 61   of pNew */..  a
370a0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
370b0 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
370c0 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
370d0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
370e0 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
370f0 65 28 70 50 61 72 65 6e 74 2d 3e 70 44 62 50 61  e(pParent->pDbPa
37100 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ge) );.  assert(
37110 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
37120 77 3d 3d 31 20 29 3b 0a 0a 20 20 2f 2a 20 54 68  w==1 );..  /* Th
37130 69 73 20 65 72 72 6f 72 20 63 6f 6e 64 69 74 69  is error conditi
37140 6f 6e 20 69 73 20 6e 6f 77 20 63 61 75 67 68 74  on is now caught
37150 20 70 72 69 6f 72 20 74 6f 20 72 65 61 63 68 69   prior to reachi
37160 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ng this function
37170 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52 28   */.  if( NEVER(
37180 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 29  pPage->nCell==0)
37190 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
371a0 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 0a  _CORRUPT_BKPT;..
371b0 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20    /* Allocate a 
371c0 6e 65 77 20 70 61 67 65 2e 20 54 68 69 73 20 70  new page. This p
371d0 61 67 65 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20  age will become 
371e0 74 68 65 20 72 69 67 68 74 2d 73 69 62 6c 69 6e  the right-siblin
371f0 67 20 6f 66 20 0a 20 20 2a 2a 20 70 50 61 67 65  g of .  ** pPage
37200 2e 20 4d 61 6b 65 20 74 68 65 20 70 61 72 65 6e  . Make the paren
37210 74 20 70 61 67 65 20 77 72 69 74 61 62 6c 65 2c  t page writable,
37220 20 73 6f 20 74 68 61 74 20 74 68 65 20 6e 65 77   so that the new
37230 20 64 69 76 69 64 65 72 20 63 65 6c 6c 0a 20 20   divider cell.  
37240 2a 2a 20 6d 61 79 20 62 65 20 69 6e 73 65 72 74  ** may be insert
37250 65 64 2e 20 49 66 20 62 6f 74 68 20 74 68 65 73  ed. If both thes
37260 65 20 6f 70 65 72 61 74 69 6f 6e 73 20 61 72 65  e operations are
37270 20 73 75 63 63 65 73 73 66 75 6c 2c 20 70 72 6f   successful, pro
37280 63 65 65 64 2e 0a 20 20 2a 2f 0a 20 20 72 63 20  ceed..  */.  rc 
37290 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50  = allocateBtreeP
372a0 61 67 65 28 70 42 74 2c 20 26 70 4e 65 77 2c 20  age(pBt, &pNew, 
372b0 26 70 67 6e 6f 4e 65 77 2c 20 30 2c 20 30 29 3b  &pgnoNew, 0, 0);
372c0 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ..  if( rc==SQLI
372d0 54 45 5f 4f 4b 20 29 7b 0a 0a 20 20 20 20 75 38  TE_OK ){..    u8
372e0 20 2a 70 4f 75 74 20 3d 20 26 70 53 70 61 63 65   *pOut = &pSpace
372f0 5b 34 5d 3b 0a 20 20 20 20 75 38 20 2a 70 43 65  [4];.    u8 *pCe
37300 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 61 70 4f 76  ll = pPage->apOv
37310 66 6c 5b 30 5d 3b 0a 20 20 20 20 75 31 36 20 73  fl[0];.    u16 s
37320 7a 43 65 6c 6c 20 3d 20 63 65 6c 6c 53 69 7a 65  zCell = cellSize
37330 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  Ptr(pPage, pCell
37340 29 3b 0a 20 20 20 20 75 38 20 2a 70 53 74 6f 70  );.    u8 *pStop
37350 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  ;..    assert( s
37360 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
37370 74 65 61 62 6c 65 28 70 4e 65 77 2d 3e 70 44 62  teable(pNew->pDb
37380 50 61 67 65 29 20 29 3b 0a 20 20 20 20 61 73 73  Page) );.    ass
37390 65 72 74 28 20 70 50 61 67 65 2d 3e 61 44 61 74  ert( pPage->aDat
373a0 61 5b 30 5d 3d 3d 28 50 54 46 5f 49 4e 54 4b 45  a[0]==(PTF_INTKE
373b0 59 7c 50 54 46 5f 4c 45 41 46 44 41 54 41 7c 50  Y|PTF_LEAFDATA|P
373c0 54 46 5f 4c 45 41 46 29 20 29 3b 0a 20 20 20 20  TF_LEAF) );.    
373d0 7a 65 72 6f 50 61 67 65 28 70 4e 65 77 2c 20 50  zeroPage(pNew, P
373e0 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45  TF_INTKEY|PTF_LE
373f0 41 46 44 41 54 41 7c 50 54 46 5f 4c 45 41 46 29  AFDATA|PTF_LEAF)
37400 3b 0a 20 20 20 20 72 65 62 75 69 6c 64 50 61 67  ;.    rebuildPag
37410 65 28 70 4e 65 77 2c 20 31 2c 20 26 70 43 65 6c  e(pNew, 1, &pCel
37420 6c 2c 20 26 73 7a 43 65 6c 6c 29 3b 0a 20 20 20  l, &szCell);.   
37430 20 70 4e 65 77 2d 3e 6e 46 72 65 65 20 3d 20 70   pNew->nFree = p
37440 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d  Bt->usableSize -
37450 20 70 4e 65 77 2d 3e 63 65 6c 6c 4f 66 66 73 65   pNew->cellOffse
37460 74 20 2d 20 32 20 2d 20 73 7a 43 65 6c 6c 3b 0a  t - 2 - szCell;.
37470 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20  .    /* If this 
37480 69 73 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75  is an auto-vacuu
37490 6d 20 64 61 74 61 62 61 73 65 2c 20 75 70 64 61  m database, upda
374a0 74 65 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d  te the pointer m
374b0 61 70 0a 20 20 20 20 2a 2a 20 77 69 74 68 20 65  ap.    ** with e
374c0 6e 74 72 69 65 73 20 66 6f 72 20 74 68 65 20 6e  ntries for the n
374d0 65 77 20 70 61 67 65 2c 20 61 6e 64 20 61 6e 79  ew page, and any
374e0 20 70 6f 69 6e 74 65 72 20 66 72 6f 6d 20 74 68   pointer from th
374f0 65 20 0a 20 20 20 20 2a 2a 20 63 65 6c 6c 20 6f  e .    ** cell o
37500 6e 20 74 68 65 20 70 61 67 65 20 74 6f 20 61 6e  n the page to an
37510 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20   overflow page. 
37520 49 66 20 65 69 74 68 65 72 20 6f 66 20 74 68 65  If either of the
37530 73 65 0a 20 20 20 20 2a 2a 20 6f 70 65 72 61 74  se.    ** operat
37540 69 6f 6e 73 20 66 61 69 6c 73 2c 20 74 68 65 20  ions fails, the 
37550 72 65 74 75 72 6e 20 63 6f 64 65 20 69 73 20 73  return code is s
37560 65 74 2c 20 62 75 74 20 74 68 65 20 63 6f 6e 74  et, but the cont
37570 65 6e 74 73 0a 20 20 20 20 2a 2a 20 6f 66 20 74  ents.    ** of t
37580 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 20 61  he parent page a
37590 72 65 20 73 74 69 6c 6c 20 6d 61 6e 69 70 75 6c  re still manipul
375a0 61 74 65 64 20 62 79 20 74 68 68 20 63 6f 64 65  ated by thh code
375b0 20 62 65 6c 6f 77 2e 0a 20 20 20 20 2a 2a 20 54   below..    ** T
375c0 68 61 74 20 69 73 20 4f 6b 2c 20 61 74 20 74 68  hat is Ok, at th
375d0 69 73 20 70 6f 69 6e 74 20 74 68 65 20 70 61 72  is point the par
375e0 65 6e 74 20 70 61 67 65 20 69 73 20 67 75 61 72  ent page is guar
375f0 61 6e 74 65 65 64 20 74 6f 0a 20 20 20 20 2a 2a  anteed to.    **
37600 20 62 65 20 6d 61 72 6b 65 64 20 61 73 20 64 69   be marked as di
37610 72 74 79 2e 20 52 65 74 75 72 6e 69 6e 67 20 61  rty. Returning a
37620 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 77 69 6c  n error code wil
37630 6c 20 63 61 75 73 65 20 61 0a 20 20 20 20 2a 2a  l cause a.    **
37640 20 72 6f 6c 6c 62 61 63 6b 2c 20 75 6e 64 6f 69   rollback, undoi
37650 6e 67 20 61 6e 79 20 63 68 61 6e 67 65 73 20 6d  ng any changes m
37660 61 64 65 20 74 6f 20 74 68 65 20 70 61 72 65 6e  ade to the paren
37670 74 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20  t page..    */. 
37680 20 20 20 69 66 28 20 49 53 41 55 54 4f 56 41 43     if( ISAUTOVAC
37690 55 55 4d 20 29 7b 0a 20 20 20 20 20 20 70 74 72  UUM ){.      ptr
376a0 6d 61 70 50 75 74 28 70 42 74 2c 20 70 67 6e 6f  mapPut(pBt, pgno
376b0 4e 65 77 2c 20 50 54 52 4d 41 50 5f 42 54 52 45  New, PTRMAP_BTRE
376c0 45 2c 20 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f  E, pParent->pgno
376d0 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20 69 66  , &rc);.      if
376e0 28 20 73 7a 43 65 6c 6c 3e 70 4e 65 77 2d 3e 6d  ( szCell>pNew->m
376f0 69 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20  inLocal ){.     
37700 20 20 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c     ptrmapPutOvfl
37710 50 74 72 28 70 4e 65 77 2c 20 70 43 65 6c 6c 2c  Ptr(pNew, pCell,
37720 20 26 72 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20   &rc);.      }. 
37730 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 43     }.  .    /* C
37740 72 65 61 74 65 20 61 20 64 69 76 69 64 65 72 20  reate a divider 
37750 63 65 6c 6c 20 74 6f 20 69 6e 73 65 72 74 20 69  cell to insert i
37760 6e 74 6f 20 70 50 61 72 65 6e 74 2e 20 54 68 65  nto pParent. The
37770 20 64 69 76 69 64 65 72 20 63 65 6c 6c 0a 20 20   divider cell.  
37780 20 20 2a 2a 20 63 6f 6e 73 69 73 74 73 20 6f 66    ** consists of
37790 20 61 20 34 2d 62 79 74 65 20 70 61 67 65 20 6e   a 4-byte page n
377a0 75 6d 62 65 72 20 28 74 68 65 20 70 61 67 65 20  umber (the page 
377b0 6e 75 6d 62 65 72 20 6f 66 20 70 50 61 67 65 29  number of pPage)
377c0 20 61 6e 64 0a 20 20 20 20 2a 2a 20 61 20 76 61   and.    ** a va
377d0 72 69 61 62 6c 65 20 6c 65 6e 67 74 68 20 6b 65  riable length ke
377e0 79 20 76 61 6c 75 65 20 28 77 68 69 63 68 20 6d  y value (which m
377f0 75 73 74 20 62 65 20 74 68 65 20 73 61 6d 65 20  ust be the same 
37800 76 61 6c 75 65 20 61 73 20 74 68 65 0a 20 20 20  value as the.   
37810 20 2a 2a 20 6c 61 72 67 65 73 74 20 6b 65 79 20   ** largest key 
37820 6f 6e 20 70 50 61 67 65 29 2e 0a 20 20 20 20 2a  on pPage)..    *
37830 2a 0a 20 20 20 20 2a 2a 20 54 6f 20 66 69 6e 64  *.    ** To find
37840 20 74 68 65 20 6c 61 72 67 65 73 74 20 6b 65 79   the largest key
37850 20 76 61 6c 75 65 20 6f 6e 20 70 50 61 67 65 2c   value on pPage,
37860 20 66 69 72 73 74 20 66 69 6e 64 20 74 68 65 20   first find the 
37870 72 69 67 68 74 2d 6d 6f 73 74 20 0a 20 20 20 20  right-most .    
37880 2a 2a 20 63 65 6c 6c 20 6f 6e 20 70 50 61 67 65  ** cell on pPage
37890 2e 20 54 68 65 20 66 69 72 73 74 20 74 77 6f 20  . The first two 
378a0 66 69 65 6c 64 73 20 6f 66 20 74 68 69 73 20 63  fields of this c
378b0 65 6c 6c 20 61 72 65 20 74 68 65 20 0a 20 20 20  ell are the .   
378c0 20 2a 2a 20 72 65 63 6f 72 64 2d 6c 65 6e 67 74   ** record-lengt
378d0 68 20 28 61 20 76 61 72 69 61 62 6c 65 20 6c 65  h (a variable le
378e0 6e 67 74 68 20 69 6e 74 65 67 65 72 20 61 74 20  ngth integer at 
378f0 6d 6f 73 74 20 33 32 2d 62 69 74 73 20 69 6e 20  most 32-bits in 
37900 73 69 7a 65 29 0a 20 20 20 20 2a 2a 20 61 6e 64  size).    ** and
37910 20 74 68 65 20 6b 65 79 20 76 61 6c 75 65 20 28   the key value (
37920 61 20 76 61 72 69 61 62 6c 65 20 6c 65 6e 67 74  a variable lengt
37930 68 20 69 6e 74 65 67 65 72 2c 20 6d 61 79 20 68  h integer, may h
37940 61 76 65 20 61 6e 79 20 76 61 6c 75 65 29 2e 0a  ave any value)..
37950 20 20 20 20 2a 2a 20 54 68 65 20 66 69 72 73 74      ** The first
37960 20 6f 66 20 74 68 65 20 77 68 69 6c 65 28 2e 2e   of the while(..
37970 2e 29 20 6c 6f 6f 70 73 20 62 65 6c 6f 77 20 73  .) loops below s
37980 6b 69 70 73 20 6f 76 65 72 20 74 68 65 20 72 65  kips over the re
37990 63 6f 72 64 2d 6c 65 6e 67 74 68 0a 20 20 20 20  cord-length.    
379a0 2a 2a 20 66 69 65 6c 64 2e 20 54 68 65 20 73 65  ** field. The se
379b0 63 6f 6e 64 20 77 68 69 6c 65 28 2e 2e 2e 29 20  cond while(...) 
379c0 6c 6f 6f 70 20 63 6f 70 69 65 73 20 74 68 65 20  loop copies the 
379d0 6b 65 79 20 76 61 6c 75 65 20 66 72 6f 6d 20 74  key value from t
379e0 68 65 0a 20 20 20 20 2a 2a 20 63 65 6c 6c 20 6f  he.    ** cell o
379f0 6e 20 70 50 61 67 65 20 69 6e 74 6f 20 74 68 65  n pPage into the
37a00 20 70 53 70 61 63 65 20 62 75 66 66 65 72 2e 0a   pSpace buffer..
37a10 20 20 20 20 2a 2f 0a 20 20 20 20 70 43 65 6c 6c      */.    pCell
37a20 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67   = findCell(pPag
37a30 65 2c 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d  e, pPage->nCell-
37a40 31 29 3b 0a 20 20 20 20 70 53 74 6f 70 20 3d 20  1);.    pStop = 
37a50 26 70 43 65 6c 6c 5b 39 5d 3b 0a 20 20 20 20 77  &pCell[9];.    w
37a60 68 69 6c 65 28 20 28 2a 28 70 43 65 6c 6c 2b 2b  hile( (*(pCell++
37a70 29 26 30 78 38 30 29 20 26 26 20 70 43 65 6c 6c  )&0x80) && pCell
37a80 3c 70 53 74 6f 70 20 29 3b 0a 20 20 20 20 70 53  <pStop );.    pS
37a90 74 6f 70 20 3d 20 26 70 43 65 6c 6c 5b 39 5d 3b  top = &pCell[9];
37aa0 0a 20 20 20 20 77 68 69 6c 65 28 20 28 28 2a 28  .    while( ((*(
37ab0 70 4f 75 74 2b 2b 29 20 3d 20 2a 28 70 43 65 6c  pOut++) = *(pCel
37ac0 6c 2b 2b 29 29 26 30 78 38 30 29 20 26 26 20 70  l++))&0x80) && p
37ad0 43 65 6c 6c 3c 70 53 74 6f 70 20 29 3b 0a 0a 20  Cell<pStop );.. 
37ae0 20 20 20 2f 2a 20 49 6e 73 65 72 74 20 74 68 65     /* Insert the
37af0 20 6e 65 77 20 64 69 76 69 64 65 72 20 63 65 6c   new divider cel
37b00 6c 20 69 6e 74 6f 20 70 50 61 72 65 6e 74 2e 20  l into pParent. 
37b10 2a 2f 0a 20 20 20 20 69 6e 73 65 72 74 43 65 6c  */.    insertCel
37b20 6c 28 70 50 61 72 65 6e 74 2c 20 70 50 61 72 65  l(pParent, pPare
37b30 6e 74 2d 3e 6e 43 65 6c 6c 2c 20 70 53 70 61 63  nt->nCell, pSpac
37b40 65 2c 20 28 69 6e 74 29 28 70 4f 75 74 2d 70 53  e, (int)(pOut-pS
37b50 70 61 63 65 29 2c 0a 20 20 20 20 20 20 20 20 20  pace),.         
37b60 20 20 20 20 20 20 30 2c 20 70 50 61 67 65 2d 3e        0, pPage->
37b70 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 0a 20 20 20  pgno, &rc);..   
37b80 20 2f 2a 20 53 65 74 20 74 68 65 20 72 69 67 68   /* Set the righ
37b90 74 2d 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 20  t-child pointer 
37ba0 6f 66 20 70 50 61 72 65 6e 74 20 74 6f 20 70 6f  of pParent to po
37bb0 69 6e 74 20 74 6f 20 74 68 65 20 6e 65 77 20 70  int to the new p
37bc0 61 67 65 2e 20 2a 2f 0a 20 20 20 20 70 75 74 34  age. */.    put4
37bd0 62 79 74 65 28 26 70 50 61 72 65 6e 74 2d 3e 61  byte(&pParent->a
37be0 44 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64  Data[pParent->hd
37bf0 72 4f 66 66 73 65 74 2b 38 5d 2c 20 70 67 6e 6f  rOffset+8], pgno
37c00 4e 65 77 29 3b 0a 20 20 0a 20 20 20 20 2f 2a 20  New);.  .    /* 
37c10 52 65 6c 65 61 73 65 20 74 68 65 20 72 65 66 65  Release the refe
37c20 72 65 6e 63 65 20 74 6f 20 74 68 65 20 6e 65 77  rence to the new
37c30 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 72 65   page. */.    re
37c40 6c 65 61 73 65 50 61 67 65 28 70 4e 65 77 29 3b  leasePage(pNew);
37c50 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
37c60 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  c;.}.#endif /* S
37c70 51 4c 49 54 45 5f 4f 4d 49 54 5f 51 55 49 43 4b  QLITE_OMIT_QUICK
37c80 42 41 4c 41 4e 43 45 20 2a 2f 0a 0a 23 69 66 20  BALANCE */..#if 
37c90 30 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  0./*.** This fun
37ca0 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 63  ction does not c
37cb0 6f 6e 74 72 69 62 75 74 65 20 61 6e 79 74 68 69  ontribute anythi
37cc0 6e 67 20 74 6f 20 74 68 65 20 6f 70 65 72 61 74  ng to the operat
37cd0 69 6f 6e 20 6f 66 20 53 51 4c 69 74 65 2e 0a 2a  ion of SQLite..*
37ce0 2a 20 69 74 20 69 73 20 73 6f 6d 65 74 69 6d 65  * it is sometime
37cf0 73 20 61 63 74 69 76 61 74 65 64 20 74 65 6d 70  s activated temp
37d00 6f 72 61 72 69 6c 79 20 77 68 69 6c 65 20 64 65  orarily while de
37d10 62 75 67 67 69 6e 67 20 63 6f 64 65 20 72 65 73  bugging code res
37d20 70 6f 6e 73 69 62 6c 65 20 0a 2a 2a 20 66 6f 72  ponsible .** for
37d30 20 73 65 74 74 69 6e 67 20 70 6f 69 6e 74 65 72   setting pointer
37d40 2d 6d 61 70 20 65 6e 74 72 69 65 73 2e 0a 2a 2f  -map entries..*/
37d50 0a 73 74 61 74 69 63 20 69 6e 74 20 70 74 72 6d  .static int ptrm
37d60 61 70 43 68 65 63 6b 50 61 67 65 73 28 4d 65 6d  apCheckPages(Mem
37d70 50 61 67 65 20 2a 2a 61 70 50 61 67 65 2c 20 69  Page **apPage, i
37d80 6e 74 20 6e 50 61 67 65 29 7b 0a 20 20 69 6e 74  nt nPage){.  int
37d90 20 69 2c 20 6a 3b 0a 20 20 66 6f 72 28 69 3d 30   i, j;.  for(i=0
37da0 3b 20 69 3c 6e 50 61 67 65 3b 20 69 2b 2b 29 7b  ; i<nPage; i++){
37db0 0a 20 20 20 20 50 67 6e 6f 20 6e 3b 0a 20 20 20  .    Pgno n;.   
37dc0 20 75 38 20 65 3b 0a 20 20 20 20 4d 65 6d 50 61   u8 e;.    MemPa
37dd0 67 65 20 2a 70 50 61 67 65 20 3d 20 61 70 50 61  ge *pPage = apPa
37de0 67 65 5b 69 5d 3b 0a 20 20 20 20 42 74 53 68 61  ge[i];.    BtSha
37df0 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65  red *pBt = pPage
37e00 2d 3e 70 42 74 3b 0a 20 20 20 20 61 73 73 65 72  ->pBt;.    asser
37e10 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  t( pPage->isInit
37e20 20 29 3b 0a 0a 20 20 20 20 66 6f 72 28 6a 3d 30   );..    for(j=0
37e30 3b 20 6a 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ; j<pPage->nCell
37e40 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 43 65  ; j++){.      Ce
37e50 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20  llInfo info;.   
37e60 20 20 20 75 38 20 2a 7a 3b 0a 20 20 20 20 20 0a     u8 *z;.     .
37e70 20 20 20 20 20 20 7a 20 3d 20 66 69 6e 64 43 65        z = findCe
37e80 6c 6c 28 70 50 61 67 65 2c 20 6a 29 3b 0a 20 20  ll(pPage, j);.  
37e90 20 20 20 20 62 74 72 65 65 50 61 72 73 65 43 65      btreeParseCe
37ea0 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 7a 2c 20  llPtr(pPage, z, 
37eb0 26 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 69 66  &info);.      if
37ec0 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77  ( info.iOverflow
37ed0 20 29 7b 0a 20 20 20 20 20 20 20 20 50 67 6e 6f   ){.        Pgno
37ee0 20 6f 76 66 6c 20 3d 20 67 65 74 34 62 79 74 65   ovfl = get4byte
37ef0 28 26 7a 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c  (&z[info.iOverfl
37f00 6f 77 5d 29 3b 0a 20 20 20 20 20 20 20 20 70 74  ow]);.        pt
37f10 72 6d 61 70 47 65 74 28 70 42 74 2c 20 6f 76 66  rmapGet(pBt, ovf
37f20 6c 2c 20 26 65 2c 20 26 6e 29 3b 0a 20 20 20 20  l, &e, &n);.    
37f30 20 20 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 70      assert( n==p
37f40 50 61 67 65 2d 3e 70 67 6e 6f 20 26 26 20 65 3d  Page->pgno && e=
37f50 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57  =PTRMAP_OVERFLOW
37f60 31 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  1 );.      }.   
37f70 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c     if( !pPage->l
37f80 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20 50  eaf ){.        P
37f90 67 6e 6f 20 63 68 69 6c 64 20 3d 20 67 65 74 34  gno child = get4
37fa0 62 79 74 65 28 7a 29 3b 0a 20 20 20 20 20 20 20  byte(z);.       
37fb0 20 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20   ptrmapGet(pBt, 
37fc0 63 68 69 6c 64 2c 20 26 65 2c 20 26 6e 29 3b 0a  child, &e, &n);.
37fd0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
37fe0 6e 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20 26  n==pPage->pgno &
37ff0 26 20 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45  & e==PTRMAP_BTRE
38000 45 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  E );.      }.   
38010 20 7d 0a 20 20 20 20 69 66 28 20 21 70 50 61 67   }.    if( !pPag
38020 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20  e->leaf ){.     
38030 20 50 67 6e 6f 20 63 68 69 6c 64 20 3d 20 67 65   Pgno child = ge
38040 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61  t4byte(&pPage->a
38050 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f  Data[pPage->hdrO
38060 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 20  ffset+8]);.     
38070 20 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20   ptrmapGet(pBt, 
38080 63 68 69 6c 64 2c 20 26 65 2c 20 26 6e 29 3b 0a  child, &e, &n);.
38090 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 3d        assert( n=
380a0 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20 26 26 20  =pPage->pgno && 
380b0 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20  e==PTRMAP_BTREE 
380c0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
380d0 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69  eturn 1;.}.#endi
380e0 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  f../*.** This fu
380f0 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74  nction is used t
38100 6f 20 63 6f 70 79 20 74 68 65 20 63 6f 6e 74 65  o copy the conte
38110 6e 74 73 20 6f 66 20 74 68 65 20 62 2d 74 72 65  nts of the b-tre
38120 65 20 6e 6f 64 65 20 73 74 6f 72 65 64 20 0a 2a  e node stored .*
38130 2a 20 6f 6e 20 70 61 67 65 20 70 46 72 6f 6d 20  * on page pFrom 
38140 74 6f 20 70 61 67 65 20 70 54 6f 2e 20 49 66 20  to page pTo. If 
38150 70 61 67 65 20 70 46 72 6f 6d 20 77 61 73 20 6e  page pFrom was n
38160 6f 74 20 61 20 6c 65 61 66 20 70 61 67 65 2c 20  ot a leaf page, 
38170 74 68 65 6e 0a 2a 2a 20 74 68 65 20 70 6f 69 6e  then.** the poin
38180 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 20  ter-map entries 
38190 66 6f 72 20 65 61 63 68 20 63 68 69 6c 64 20 70  for each child p
381a0 61 67 65 20 61 72 65 20 75 70 64 61 74 65 64 20  age are updated 
381b0 73 6f 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 70  so that the.** p
381c0 61 72 65 6e 74 20 70 61 67 65 20 73 74 6f 72 65  arent page store
381d0 64 20 69 6e 20 74 68 65 20 70 6f 69 6e 74 65 72  d in the pointer
381e0 20 6d 61 70 20 69 73 20 70 61 67 65 20 70 54 6f   map is page pTo
381f0 2e 20 49 66 20 70 46 72 6f 6d 20 63 6f 6e 74 61  . If pFrom conta
38200 69 6e 65 64 0a 2a 2a 20 61 6e 79 20 63 65 6c 6c  ined.** any cell
38210 73 20 77 69 74 68 20 6f 76 65 72 66 6c 6f 77 20  s with overflow 
38220 70 61 67 65 20 70 6f 69 6e 74 65 72 73 2c 20 74  page pointers, t
38230 68 65 6e 20 74 68 65 20 63 6f 72 72 65 73 70 6f  hen the correspo
38240 6e 64 69 6e 67 20 70 6f 69 6e 74 65 72 0a 2a 2a  nding pointer.**
38250 20 6d 61 70 20 65 6e 74 72 69 65 73 20 61 72 65   map entries are
38260 20 61 6c 73 6f 20 75 70 64 61 74 65 64 20 73 6f   also updated so
38270 20 74 68 61 74 20 74 68 65 20 70 61 72 65 6e 74   that the parent
38280 20 70 61 67 65 20 69 73 20 70 61 67 65 20 70 54   page is page pT
38290 6f 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 46 72 6f  o..**.** If pFro
382a0 6d 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 63  m is currently c
382b0 61 72 72 79 69 6e 67 20 61 6e 79 20 6f 76 65 72  arrying any over
382c0 66 6c 6f 77 20 63 65 6c 6c 73 20 28 65 6e 74 72  flow cells (entr
382d0 69 65 73 20 69 6e 20 74 68 65 0a 2a 2a 20 4d 65  ies in the.** Me
382e0 6d 50 61 67 65 2e 61 70 4f 76 66 6c 5b 5d 20 61  mPage.apOvfl[] a
382f0 72 72 61 79 29 2c 20 74 68 65 79 20 61 72 65 20  rray), they are 
38300 6e 6f 74 20 63 6f 70 69 65 64 20 74 6f 20 70 54  not copied to pT
38310 6f 2e 20 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65  o. .**.** Before
38320 20 72 65 74 75 72 6e 69 6e 67 2c 20 70 61 67 65   returning, page
38330 20 70 54 6f 20 69 73 20 72 65 69 6e 69 74 69 61   pTo is reinitia
38340 6c 69 7a 65 64 20 75 73 69 6e 67 20 62 74 72 65  lized using btre
38350 65 49 6e 69 74 50 61 67 65 28 29 2e 0a 2a 2a 0a  eInitPage()..**.
38360 2a 2a 20 54 68 65 20 70 65 72 66 6f 72 6d 61 6e  ** The performan
38370 63 65 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74  ce of this funct
38380 69 6f 6e 20 69 73 20 6e 6f 74 20 63 72 69 74 69  ion is not criti
38390 63 61 6c 2e 20 49 74 20 69 73 20 6f 6e 6c 79 20  cal. It is only 
383a0 75 73 65 64 20 62 79 20 0a 2a 2a 20 74 68 65 20  used by .** the 
383b0 62 61 6c 61 6e 63 65 5f 73 68 61 6c 6c 6f 77 65  balance_shallowe
383c0 72 28 29 20 61 6e 64 20 62 61 6c 61 6e 63 65 5f  r() and balance_
383d0 64 65 65 70 65 72 28 29 20 70 72 6f 63 65 64 75  deeper() procedu
383e0 72 65 73 2c 20 6e 65 69 74 68 65 72 20 6f 66 0a  res, neither of.
383f0 2a 2a 20 77 68 69 63 68 20 61 72 65 20 63 61 6c  ** which are cal
38400 6c 65 64 20 6f 66 74 65 6e 20 75 6e 64 65 72 20  led often under 
38410 6e 6f 72 6d 61 6c 20 63 69 72 63 75 6d 73 74 61  normal circumsta
38420 6e 63 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  nces..*/.static 
38430 76 6f 69 64 20 63 6f 70 79 4e 6f 64 65 43 6f 6e  void copyNodeCon
38440 74 65 6e 74 28 4d 65 6d 50 61 67 65 20 2a 70 46  tent(MemPage *pF
38450 72 6f 6d 2c 20 4d 65 6d 50 61 67 65 20 2a 70 54  rom, MemPage *pT
38460 6f 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20  o, int *pRC){.  
38470 69 66 28 20 28 2a 70 52 43 29 3d 3d 53 51 4c 49  if( (*pRC)==SQLI
38480 54 45 5f 4f 4