/ Hex Artifact Content
Login
SQLite training in Houston TX on 2019-11-05 (details)
Part of the 2019 Tcl Conference

Artifact 8668d6eea7a12c455a1936fe1dbe9c5bb7fdb134578cddd5d0f77fda8d3bab4e:


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 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20  EM_BKPT;.    }. 
3040: 20 20 20 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65     pLock->iTable
3050: 20 3d 20 69 54 61 62 6c 65 3b 0a 20 20 20 20 70   = iTable;.    p
3060: 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 20 3d 20 70  Lock->pBtree = p
3070: 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 70 4e 65  ;.    pLock->pNe
3080: 78 74 20 3d 20 70 42 74 2d 3e 70 4c 6f 63 6b 3b  xt = pBt->pLock;
3090: 0a 20 20 20 20 70 42 74 2d 3e 70 4c 6f 63 6b 20  .    pBt->pLock 
30a0: 3d 20 70 4c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20  = pLock;.  }..  
30b0: 2f 2a 20 53 65 74 20 74 68 65 20 42 74 4c 6f 63  /* Set the BtLoc
30c0: 6b 2e 65 4c 6f 63 6b 20 76 61 72 69 61 62 6c 65  k.eLock variable
30d0: 20 74 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d 20   to the maximum 
30e0: 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c  of the current l
30f0: 6f 63 6b 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65  ock.  ** and the
3100: 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 2e   requested lock.
3110: 20 54 68 69 73 20 6d 65 61 6e 73 20 69 66 20 61   This means if a
3120: 20 77 72 69 74 65 2d 6c 6f 63 6b 20 77 61 73 20   write-lock was 
3130: 61 6c 72 65 61 64 79 20 68 65 6c 64 0a 20 20 2a  already held.  *
3140: 2a 20 61 6e 64 20 61 20 72 65 61 64 2d 6c 6f 63  * and a read-loc
3150: 6b 20 72 65 71 75 65 73 74 65 64 2c 20 77 65 20  k requested, we 
3160: 64 6f 6e 27 74 20 69 6e 63 6f 72 72 65 63 74 6c  don't incorrectl
3170: 79 20 64 6f 77 6e 67 72 61 64 65 20 74 68 65 20  y downgrade the 
3180: 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  lock..  */.  ass
3190: 65 72 74 28 20 57 52 49 54 45 5f 4c 4f 43 4b 3e  ert( WRITE_LOCK>
31a0: 52 45 41 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69  READ_LOCK );.  i
31b0: 66 28 20 65 4c 6f 63 6b 3e 70 4c 6f 63 6b 2d 3e  f( eLock>pLock->
31c0: 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 70 4c 6f  eLock ){.    pLo
31d0: 63 6b 2d 3e 65 4c 6f 63 6b 20 3d 20 65 4c 6f 63  ck->eLock = eLoc
31e0: 6b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  k;.  }..  return
31f0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65   SQLITE_OK;.}.#e
3200: 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f  ndif /* !SQLITE_
3210: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
3220: 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  E */..#ifndef SQ
3230: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
3240: 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 52 65 6c  _CACHE./*.** Rel
3250: 65 61 73 65 20 61 6c 6c 20 74 68 65 20 74 61 62  ease all the tab
3260: 6c 65 20 6c 6f 63 6b 73 20 28 6c 6f 63 6b 73 20  le locks (locks 
3270: 6f 62 74 61 69 6e 65 64 20 76 69 61 20 63 61 6c  obtained via cal
3280: 6c 73 20 74 6f 0a 2a 2a 20 74 68 65 20 73 65 74  ls to.** the set
3290: 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
32a0: 4c 6f 63 6b 28 29 20 70 72 6f 63 65 64 75 72 65  Lock() procedure
32b0: 29 20 68 65 6c 64 20 62 79 20 42 74 72 65 65 20  ) held by Btree 
32c0: 6f 62 6a 65 63 74 20 70 2e 0a 2a 2a 0a 2a 2a 20  object p..**.** 
32d0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 73  This function as
32e0: 73 75 6d 65 73 20 74 68 61 74 20 42 74 72 65 65  sumes that Btree
32f0: 20 70 20 68 61 73 20 61 6e 20 6f 70 65 6e 20 72   p has an open r
3300: 65 61 64 20 6f 72 20 77 72 69 74 65 20 0a 2a 2a  ead or write .**
3310: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66   transaction. If
3320: 20 69 74 20 64 6f 65 73 20 6e 6f 74 2c 20 74 68   it does not, th
3330: 65 6e 20 74 68 65 20 42 54 53 5f 50 45 4e 44 49  en the BTS_PENDI
3340: 4e 47 20 66 6c 61 67 0a 2a 2a 20 6d 61 79 20 62  NG flag.** may b
3350: 65 20 69 6e 63 6f 72 72 65 63 74 6c 79 20 63 6c  e incorrectly cl
3360: 65 61 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  eared..*/.static
3370: 20 76 6f 69 64 20 63 6c 65 61 72 41 6c 6c 53 68   void clearAllSh
3380: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
3390: 63 6b 73 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  cks(Btree *p){. 
33a0: 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
33b0: 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74 4c 6f 63   p->pBt;.  BtLoc
33c0: 6b 20 2a 2a 70 70 49 74 65 72 20 3d 20 26 70 42  k **ppIter = &pB
33d0: 74 2d 3e 70 4c 6f 63 6b 3b 0a 0a 20 20 61 73 73  t->pLock;..  ass
33e0: 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65  ert( sqlite3Btre
33f0: 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29  eHoldsMutex(p) )
3400: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 73  ;.  assert( p->s
3410: 68 61 72 61 62 6c 65 20 7c 7c 20 30 3d 3d 2a 70  harable || 0==*p
3420: 70 49 74 65 72 20 29 3b 0a 20 20 61 73 73 65 72  pIter );.  asser
3430: 74 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 30 20  t( p->inTrans>0 
3440: 29 3b 0a 0a 20 20 77 68 69 6c 65 28 20 2a 70 70  );..  while( *pp
3450: 49 74 65 72 20 29 7b 0a 20 20 20 20 42 74 4c 6f  Iter ){.    BtLo
3460: 63 6b 20 2a 70 4c 6f 63 6b 20 3d 20 2a 70 70 49  ck *pLock = *ppI
3470: 74 65 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ter;.    assert(
3480: 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20   (pBt->btsFlags 
3490: 26 20 42 54 53 5f 45 58 43 4c 55 53 49 56 45 29  & BTS_EXCLUSIVE)
34a0: 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 70 57 72 69  ==0 || pBt->pWri
34b0: 74 65 72 3d 3d 70 4c 6f 63 6b 2d 3e 70 42 74 72  ter==pLock->pBtr
34c0: 65 65 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ee );.    assert
34d0: 28 20 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 2d  ( pLock->pBtree-
34e0: 3e 69 6e 54 72 61 6e 73 3e 3d 70 4c 6f 63 6b 2d  >inTrans>=pLock-
34f0: 3e 65 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 69 66  >eLock );.    if
3500: 28 20 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 3d  ( pLock->pBtree=
3510: 3d 70 20 29 7b 0a 20 20 20 20 20 20 2a 70 70 49  =p ){.      *ppI
3520: 74 65 72 20 3d 20 70 4c 6f 63 6b 2d 3e 70 4e 65  ter = pLock->pNe
3530: 78 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  xt;.      assert
3540: 28 20 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65 21  ( pLock->iTable!
3550: 3d 31 20 7c 7c 20 70 4c 6f 63 6b 3d 3d 26 70 2d  =1 || pLock==&p-
3560: 3e 6c 6f 63 6b 20 29 3b 0a 20 20 20 20 20 20 69  >lock );.      i
3570: 66 28 20 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65  f( pLock->iTable
3580: 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73  !=1 ){.        s
3590: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4c 6f 63  qlite3_free(pLoc
35a0: 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  k);.      }.    
35b0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 70 49  }else{.      ppI
35c0: 74 65 72 20 3d 20 26 70 4c 6f 63 6b 2d 3e 70 4e  ter = &pLock->pN
35d0: 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ext;.    }.  }..
35e0: 20 20 61 73 73 65 72 74 28 20 28 70 42 74 2d 3e    assert( (pBt->
35f0: 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 50  btsFlags & BTS_P
3600: 45 4e 44 49 4e 47 29 3d 3d 30 20 7c 7c 20 70 42  ENDING)==0 || pB
3610: 74 2d 3e 70 57 72 69 74 65 72 20 29 3b 0a 20 20  t->pWriter );.  
3620: 69 66 28 20 70 42 74 2d 3e 70 57 72 69 74 65 72  if( pBt->pWriter
3630: 3d 3d 70 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e  ==p ){.    pBt->
3640: 70 57 72 69 74 65 72 20 3d 20 30 3b 0a 20 20 20  pWriter = 0;.   
3650: 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26   pBt->btsFlags &
3660: 3d 20 7e 28 42 54 53 5f 45 58 43 4c 55 53 49 56  = ~(BTS_EXCLUSIV
3670: 45 7c 42 54 53 5f 50 45 4e 44 49 4e 47 29 3b 0a  E|BTS_PENDING);.
3680: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 42 74 2d    }else if( pBt-
3690: 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 32  >nTransaction==2
36a0: 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20   ){.    /* This 
36b0: 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
36c0: 65 64 20 77 68 65 6e 20 42 74 72 65 65 20 70 20  ed when Btree p 
36d0: 69 73 20 63 6f 6e 63 6c 75 64 69 6e 67 20 69 74  is concluding it
36e0: 73 20 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61  s .    ** transa
36f0: 63 74 69 6f 6e 2e 20 49 66 20 74 68 65 72 65 20  ction. If there 
3700: 63 75 72 72 65 6e 74 6c 79 20 65 78 69 73 74 73  currently exists
3710: 20 61 20 77 72 69 74 65 72 2c 20 61 6e 64 20 70   a writer, and p
3720: 20 69 73 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 74   is not.    ** t
3730: 68 61 74 20 77 72 69 74 65 72 2c 20 74 68 65 6e  hat writer, then
3740: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6c   the number of l
3750: 6f 63 6b 73 20 68 65 6c 64 20 62 79 20 63 6f 6e  ocks held by con
3760: 6e 65 63 74 69 6f 6e 73 20 6f 74 68 65 72 0a 20  nections other. 
3770: 20 20 20 2a 2a 20 74 68 61 6e 20 74 68 65 20 77     ** than the w
3780: 72 69 74 65 72 20 6d 75 73 74 20 62 65 20 61 62  riter must be ab
3790: 6f 75 74 20 74 6f 20 64 72 6f 70 20 74 6f 20 7a  out to drop to z
37a0: 65 72 6f 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ero. In this cas
37b0: 65 0a 20 20 20 20 2a 2a 20 73 65 74 20 74 68 65  e.    ** set the
37c0: 20 42 54 53 5f 50 45 4e 44 49 4e 47 20 66 6c 61   BTS_PENDING fla
37d0: 67 20 74 6f 20 30 2e 0a 20 20 20 20 2a 2a 0a 20  g to 0..    **. 
37e0: 20 20 20 2a 2a 20 49 66 20 74 68 65 72 65 20 69     ** If there i
37f0: 73 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20  s not currently 
3800: 61 20 77 72 69 74 65 72 2c 20 74 68 65 6e 20 42  a writer, then B
3810: 54 53 5f 50 45 4e 44 49 4e 47 20 6d 75 73 74 0a  TS_PENDING must.
3820: 20 20 20 20 2a 2a 20 62 65 20 7a 65 72 6f 20 61      ** be zero a
3830: 6c 72 65 61 64 79 2e 20 53 6f 20 74 68 69 73 20  lready. So this 
3840: 6e 65 78 74 20 6c 69 6e 65 20 69 73 20 68 61 72  next line is har
3850: 6d 6c 65 73 73 20 69 6e 20 74 68 61 74 20 63 61  mless in that ca
3860: 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  se..    */.    p
3870: 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d 20  Bt->btsFlags &= 
3880: 7e 42 54 53 5f 50 45 4e 44 49 4e 47 3b 0a 20 20  ~BTS_PENDING;.  
3890: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  }.}../*.** This 
38a0: 66 75 6e 63 74 69 6f 6e 20 63 68 61 6e 67 65 73  function changes
38b0: 20 61 6c 6c 20 77 72 69 74 65 2d 6c 6f 63 6b 73   all write-locks
38c0: 20 68 65 6c 64 20 62 79 20 42 74 72 65 65 20 70   held by Btree p
38d0: 20 69 6e 74 6f 20 72 65 61 64 2d 6c 6f 63 6b 73   into read-locks
38e0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
38f0: 20 64 6f 77 6e 67 72 61 64 65 41 6c 6c 53 68 61   downgradeAllSha
3900: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
3910: 6b 73 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  ks(Btree *p){.  
3920: 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
3930: 70 2d 3e 70 42 74 3b 0a 20 20 69 66 28 20 70 42  p->pBt;.  if( pB
3940: 74 2d 3e 70 57 72 69 74 65 72 3d 3d 70 20 29 7b  t->pWriter==p ){
3950: 0a 20 20 20 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f  .    BtLock *pLo
3960: 63 6b 3b 0a 20 20 20 20 70 42 74 2d 3e 70 57 72  ck;.    pBt->pWr
3970: 69 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 70 42  iter = 0;.    pB
3980: 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d 20 7e  t->btsFlags &= ~
3990: 28 42 54 53 5f 45 58 43 4c 55 53 49 56 45 7c 42  (BTS_EXCLUSIVE|B
39a0: 54 53 5f 50 45 4e 44 49 4e 47 29 3b 0a 20 20 20  TS_PENDING);.   
39b0: 20 66 6f 72 28 70 4c 6f 63 6b 3d 70 42 74 2d 3e   for(pLock=pBt->
39c0: 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b 3b 20 70 4c  pLock; pLock; pL
39d0: 6f 63 6b 3d 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74  ock=pLock->pNext
39e0: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
39f0: 20 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 3d 3d 52   pLock->eLock==R
3a00: 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 70 4c 6f 63  EAD_LOCK || pLoc
3a10: 6b 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29 3b 0a  k->pBtree==p );.
3a20: 20 20 20 20 20 20 70 4c 6f 63 6b 2d 3e 65 4c 6f        pLock->eLo
3a30: 63 6b 20 3d 20 52 45 41 44 5f 4c 4f 43 4b 3b 0a  ck = READ_LOCK;.
3a40: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 65 6e      }.  }.}..#en
3a50: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
3a60: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20  IT_SHARED_CACHE 
3a70: 2a 2f 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  */..static void 
3a80: 72 65 6c 65 61 73 65 50 61 67 65 28 4d 65 6d 50  releasePage(MemP
3a90: 61 67 65 20 2a 70 50 61 67 65 29 3b 20 20 2f 2a  age *pPage);  /*
3aa0: 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e   Forward referen
3ab0: 63 65 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 2a 2a 2a 20  ce */../*.***** 
3ac0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
3ad0: 75 73 65 64 20 69 6e 73 69 64 65 20 6f 66 20 61  used inside of a
3ae0: 73 73 65 72 74 28 29 20 6f 6e 6c 79 20 2a 2a 2a  ssert() only ***
3af0: 2a 0a 2a 2a 0a 2a 2a 20 56 65 72 69 66 79 20 74  *.**.** Verify t
3b00: 68 61 74 20 74 68 65 20 63 75 72 73 6f 72 20 68  hat the cursor h
3b10: 6f 6c 64 73 20 74 68 65 20 6d 75 74 65 78 20 6f  olds the mutex o
3b20: 6e 20 69 74 73 20 42 74 53 68 61 72 65 64 0a 2a  n its BtShared.*
3b30: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
3b40: 44 45 42 55 47 0a 73 74 61 74 69 63 20 69 6e 74  DEBUG.static int
3b50: 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
3b60: 78 28 42 74 43 75 72 73 6f 72 20 2a 70 29 7b 0a  x(BtCursor *p){.
3b70: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
3b80: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 70  _mutex_held(p->p
3b90: 42 74 2d 3e 6d 75 74 65 78 29 3b 0a 7d 0a 0a 2f  Bt->mutex);.}../
3ba0: 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68  * Verify that th
3bb0: 65 20 63 75 72 73 6f 72 20 61 6e 64 20 74 68 65  e cursor and the
3bc0: 20 42 74 53 68 61 72 65 64 20 61 67 72 65 65 20   BtShared agree 
3bd0: 61 62 6f 75 74 20 77 68 61 74 20 69 73 20 74 68  about what is th
3be0: 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 64 61 74  e current.** dat
3bf0: 61 62 61 73 65 20 63 6f 6e 6e 65 74 69 6f 6e 2e  abase connetion.
3c00: 20 54 68 69 73 20 69 73 20 69 6d 70 6f 72 74 61   This is importa
3c10: 6e 74 20 69 6e 20 73 68 61 72 65 64 2d 63 61 63  nt in shared-cac
3c20: 68 65 20 6d 6f 64 65 2e 20 49 66 20 74 68 65 20  he mode. If the 
3c30: 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 63 6f 6e  database .** con
3c40: 6e 65 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72 73  nection pointers
3c50: 20 67 65 74 20 6f 75 74 2d 6f 66 2d 73 79 6e 63   get out-of-sync
3c60: 2c 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65  , it is possible
3c70: 20 66 6f 72 20 72 6f 75 74 69 6e 65 73 20 6c 69   for routines li
3c80: 6b 65 0a 2a 2a 20 62 74 72 65 65 49 6e 69 74 50  ke.** btreeInitP
3c90: 61 67 65 28 29 20 74 6f 20 72 65 66 65 72 65 6e  age() to referen
3ca0: 63 65 20 61 6e 20 73 74 61 6c 65 20 63 6f 6e 6e  ce an stale conn
3cb0: 65 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72 20 74  ection pointer t
3cc0: 68 61 74 20 72 65 66 65 72 65 6e 63 65 73 20 61  hat references a
3cd0: 0a 2a 2a 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e  .** a connection
3ce0: 20 74 68 61 74 20 68 61 73 20 61 6c 72 65 61 64   that has alread
3cf0: 79 20 63 6c 6f 73 65 64 2e 20 20 54 68 69 73 20  y closed.  This 
3d00: 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
3d10: 69 6e 73 69 64 65 20 61 73 73 65 72 74 28 29 0a  inside assert().
3d20: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 20 6f 6e  ** statements on
3d30: 6c 79 20 61 6e 64 20 66 6f 72 20 74 68 65 20 70  ly and for the p
3d40: 75 72 70 6f 73 65 20 6f 66 20 64 6f 75 62 6c 65  urpose of double
3d50: 2d 63 68 65 63 6b 69 6e 67 20 74 68 61 74 20 74  -checking that t
3d60: 68 65 20 62 74 72 65 65 20 63 6f 64 65 0a 2a 2a  he btree code.**
3d70: 20 64 6f 65 73 20 6b 65 65 70 20 74 68 65 20 64   does keep the d
3d80: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
3d90: 6f 6e 20 70 6f 69 6e 74 65 72 73 20 75 70 2d 74  on pointers up-t
3da0: 6f 2d 64 61 74 65 2e 0a 2a 2f 0a 73 74 61 74 69  o-date..*/.stati
3db0: 63 20 69 6e 74 20 63 75 72 73 6f 72 4f 77 6e 73  c int cursorOwns
3dc0: 42 74 53 68 61 72 65 64 28 42 74 43 75 72 73 6f  BtShared(BtCurso
3dd0: 72 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28  r *p){.  assert(
3de0: 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
3df0: 78 28 70 29 20 29 3b 0a 20 20 72 65 74 75 72 6e  x(p) );.  return
3e00: 20 28 70 2d 3e 70 42 74 72 65 65 2d 3e 64 62 3d   (p->pBtree->db=
3e10: 3d 70 2d 3e 70 42 74 2d 3e 64 62 29 3b 0a 7d 0a  =p->pBt->db);.}.
3e20: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e  #endif../*.** In
3e30: 76 61 6c 69 64 61 74 65 20 74 68 65 20 6f 76 65  validate the ove
3e40: 72 66 6c 6f 77 20 63 61 63 68 65 20 6f 66 20 74  rflow cache of t
3e50: 68 65 20 63 75 72 73 6f 72 20 70 61 73 73 65 64  he cursor passed
3e60: 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72   as the first ar
3e70: 67 75 6d 65 6e 74 2e 0a 2a 2a 20 6f 6e 20 74 68  gument..** on th
3e80: 65 20 73 68 61 72 65 64 20 62 74 72 65 65 20 73  e shared btree s
3e90: 74 72 75 63 74 75 72 65 20 70 42 74 2e 0a 2a 2f  tructure pBt..*/
3ea0: 0a 23 64 65 66 69 6e 65 20 69 6e 76 61 6c 69 64  .#define invalid
3eb0: 61 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65  ateOverflowCache
3ec0: 28 70 43 75 72 29 20 28 70 43 75 72 2d 3e 63 75  (pCur) (pCur->cu
3ed0: 72 46 6c 61 67 73 20 26 3d 20 7e 42 54 43 46 5f  rFlags &= ~BTCF_
3ee0: 56 61 6c 69 64 4f 76 66 6c 29 0a 0a 2f 2a 0a 2a  ValidOvfl)../*.*
3ef0: 2a 20 49 6e 76 61 6c 69 64 61 74 65 20 74 68 65  * Invalidate the
3f00: 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c   overflow page-l
3f10: 69 73 74 20 63 61 63 68 65 20 66 6f 72 20 61 6c  ist cache for al
3f20: 6c 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 65 64  l cursors opened
3f30: 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 68 61 72 65  .** on the share
3f40: 64 20 62 74 72 65 65 20 73 74 72 75 63 74 75 72  d btree structur
3f50: 65 20 70 42 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  e pBt..*/.static
3f60: 20 76 6f 69 64 20 69 6e 76 61 6c 69 64 61 74 65   void invalidate
3f70: 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68 65  AllOverflowCache
3f80: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b  (BtShared *pBt){
3f90: 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a  .  BtCursor *p;.
3fa0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
3fb0: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
3fc0: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 66 6f  ->mutex) );.  fo
3fd0: 72 28 70 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72  r(p=pBt->pCursor
3fe0: 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29  ; p; p=p->pNext)
3ff0: 7b 0a 20 20 20 20 69 6e 76 61 6c 69 64 61 74 65  {.    invalidate
4000: 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70 29  OverflowCache(p)
4010: 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66  ;.  }.}..#ifndef
4020: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43   SQLITE_OMIT_INC
4030: 52 42 4c 4f 42 0a 2f 2a 0a 2a 2a 20 54 68 69 73  RBLOB./*.** This
4040: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
4050: 6c 65 64 20 62 65 66 6f 72 65 20 6d 6f 64 69 66  led before modif
4060: 79 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74  ying the content
4070: 73 20 6f 66 20 61 20 74 61 62 6c 65 0a 2a 2a 20  s of a table.** 
4080: 74 6f 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6e  to invalidate an
4090: 79 20 69 6e 63 72 62 6c 6f 62 20 63 75 72 73 6f  y incrblob curso
40a0: 72 73 20 74 68 61 74 20 61 72 65 20 6f 70 65 6e  rs that are open
40b0: 20 6f 6e 20 74 68 65 0a 2a 2a 20 72 6f 77 20 6f   on the.** row o
40c0: 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 72 6f 77  r one of the row
40d0: 73 20 62 65 69 6e 67 20 6d 6f 64 69 66 69 65 64  s being modified
40e0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 72 67 75 6d  ..**.** If argum
40f0: 65 6e 74 20 69 73 43 6c 65 61 72 54 61 62 6c 65  ent isClearTable
4100: 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74   is true, then t
4110: 68 65 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e  he entire conten
4120: 74 73 20 6f 66 20 74 68 65 0a 2a 2a 20 74 61 62  ts of the.** tab
4130: 6c 65 20 69 73 20 61 62 6f 75 74 20 74 6f 20 62  le is about to b
4140: 65 20 64 65 6c 65 74 65 64 2e 20 49 6e 20 74 68  e deleted. In th
4150: 69 73 20 63 61 73 65 20 69 6e 76 61 6c 69 64 61  is case invalida
4160: 74 65 20 61 6c 6c 20 69 6e 63 72 62 6c 6f 62 0a  te all incrblob.
4170: 2a 2a 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20  ** cursors open 
4180: 6f 6e 20 61 6e 79 20 72 6f 77 20 77 69 74 68 69  on any row withi
4190: 6e 20 74 68 65 20 74 61 62 6c 65 20 77 69 74 68  n the table with
41a0: 20 72 6f 6f 74 2d 70 61 67 65 20 70 67 6e 6f 52   root-page pgnoR
41b0: 6f 6f 74 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72  oot..**.** Other
41c0: 77 69 73 65 2c 20 69 66 20 61 72 67 75 6d 65 6e  wise, if argumen
41d0: 74 20 69 73 43 6c 65 61 72 54 61 62 6c 65 20 69  t isClearTable i
41e0: 73 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 74 68  s false, then th
41f0: 65 20 72 6f 77 20 77 69 74 68 0a 2a 2a 20 72 6f  e row with.** ro
4200: 77 69 64 20 69 52 6f 77 20 69 73 20 62 65 69 6e  wid iRow is bein
4210: 67 20 72 65 70 6c 61 63 65 64 20 6f 72 20 64 65  g replaced or de
4220: 6c 65 74 65 64 2e 20 49 6e 20 74 68 69 73 20 63  leted. In this c
4230: 61 73 65 20 69 6e 76 61 6c 69 64 61 74 65 0a 2a  ase invalidate.*
4240: 2a 20 6f 6e 6c 79 20 74 68 6f 73 65 20 69 6e 63  * only those inc
4250: 72 62 6c 6f 62 20 63 75 72 73 6f 72 73 20 6f 70  rblob cursors op
4260: 65 6e 20 6f 6e 20 74 68 61 74 20 73 70 65 63 69  en on that speci
4270: 66 69 63 20 72 6f 77 2e 0a 2a 2f 0a 73 74 61 74  fic row..*/.stat
4280: 69 63 20 76 6f 69 64 20 69 6e 76 61 6c 69 64 61  ic void invalida
4290: 74 65 49 6e 63 72 62 6c 6f 62 43 75 72 73 6f 72  teIncrblobCursor
42a0: 73 28 0a 20 20 42 74 72 65 65 20 2a 70 42 74 72  s(.  Btree *pBtr
42b0: 65 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ee,          /* 
42c0: 54 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  The database fil
42d0: 65 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20  e to check */.  
42e0: 69 36 34 20 69 52 6f 77 2c 20 20 20 20 20 20 20  i64 iRow,       
42f0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72          /* The r
4300: 6f 77 69 64 20 74 68 61 74 20 6d 69 67 68 74 20  owid that might 
4310: 62 65 20 63 68 61 6e 67 69 6e 67 20 2a 2f 0a 20  be changing */. 
4320: 20 69 6e 74 20 69 73 43 6c 65 61 72 54 61 62 6c   int isClearTabl
4330: 65 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65  e        /* True
4340: 20 69 66 20 61 6c 6c 20 72 6f 77 73 20 61 72 65   if all rows are
4350: 20 62 65 69 6e 67 20 64 65 6c 65 74 65 64 20 2a   being deleted *
4360: 2f 0a 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20  /.){.  BtCursor 
4370: 2a 70 3b 0a 20 20 69 66 28 20 70 42 74 72 65 65  *p;.  if( pBtree
4380: 2d 3e 68 61 73 49 6e 63 72 62 6c 6f 62 43 75 72  ->hasIncrblobCur
4390: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
43a0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42  assert( sqlite3B
43b0: 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70  treeHoldsMutex(p
43c0: 42 74 72 65 65 29 20 29 3b 0a 20 20 70 42 74 72  Btree) );.  pBtr
43d0: 65 65 2d 3e 68 61 73 49 6e 63 72 62 6c 6f 62 43  ee->hasIncrblobC
43e0: 75 72 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 3d  ur = 0;.  for(p=
43f0: 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 43 75  pBtree->pBt->pCu
4400: 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e  rsor; p; p=p->pN
4410: 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 28 70  ext){.    if( (p
4420: 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43  ->curFlags & BTC
4430: 46 5f 49 6e 63 72 62 6c 6f 62 29 21 3d 30 20 29  F_Incrblob)!=0 )
4440: 7b 0a 20 20 20 20 20 20 70 42 74 72 65 65 2d 3e  {.      pBtree->
4450: 68 61 73 49 6e 63 72 62 6c 6f 62 43 75 72 20 3d  hasIncrblobCur =
4460: 20 31 3b 0a 20 20 20 20 20 20 69 66 28 20 69 73   1;.      if( is
4470: 43 6c 65 61 72 54 61 62 6c 65 20 7c 7c 20 70 2d  ClearTable || p-
4480: 3e 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 69 52 6f 77  >info.nKey==iRow
4490: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 65   ){.        p->e
44a0: 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49  State = CURSOR_I
44b0: 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 7d 0a  NVALID;.      }.
44c0: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 65 6c      }.  }.}..#el
44d0: 73 65 0a 20 20 2f 2a 20 53 74 75 62 20 66 75 6e  se.  /* Stub fun
44e0: 63 74 69 6f 6e 20 77 68 65 6e 20 49 4e 43 52 42  ction when INCRB
44f0: 4c 4f 42 20 69 73 20 6f 6d 69 74 74 65 64 20 2a  LOB is omitted *
4500: 2f 0a 20 20 23 64 65 66 69 6e 65 20 69 6e 76 61  /.  #define inva
4510: 6c 69 64 61 74 65 49 6e 63 72 62 6c 6f 62 43 75  lidateIncrblobCu
4520: 72 73 6f 72 73 28 78 2c 79 2c 7a 29 0a 23 65 6e  rsors(x,y,z).#en
4530: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
4540: 49 54 5f 49 4e 43 52 42 4c 4f 42 20 2a 2f 0a 0a  IT_INCRBLOB */..
4550: 2f 2a 0a 2a 2a 20 53 65 74 20 62 69 74 20 70 67  /*.** Set bit pg
4560: 6e 6f 20 6f 66 20 74 68 65 20 42 74 53 68 61 72  no of the BtShar
4570: 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 62  ed.pHasContent b
4580: 69 74 76 65 63 2e 20 54 68 69 73 20 69 73 20 63  itvec. This is c
4590: 61 6c 6c 65 64 20 0a 2a 2a 20 77 68 65 6e 20 61  alled .** when a
45a0: 20 70 61 67 65 20 74 68 61 74 20 70 72 65 76 69   page that previ
45b0: 6f 75 73 6c 79 20 63 6f 6e 74 61 69 6e 65 64 20  ously contained 
45c0: 64 61 74 61 20 62 65 63 6f 6d 65 73 20 61 20 66  data becomes a f
45d0: 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 0a 2a  ree-list leaf .*
45e0: 2a 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  * page..**.** Th
45f0: 65 20 42 74 53 68 61 72 65 64 2e 70 48 61 73 43  e BtShared.pHasC
4600: 6f 6e 74 65 6e 74 20 62 69 74 76 65 63 20 65 78  ontent bitvec ex
4610: 69 73 74 73 20 74 6f 20 77 6f 72 6b 20 61 72 6f  ists to work aro
4620: 75 6e 64 20 61 6e 20 6f 62 73 63 75 72 65 0a 2a  und an obscure.*
4630: 2a 20 62 75 67 20 63 61 75 73 65 64 20 62 79 20  * bug caused by 
4640: 74 68 65 20 69 6e 74 65 72 61 63 74 69 6f 6e 20  the interaction 
4650: 6f 66 20 74 77 6f 20 75 73 65 66 75 6c 20 49 4f  of two useful IO
4660: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 73   optimizations s
4670: 75 72 72 6f 75 6e 64 69 6e 67 0a 2a 2a 20 66 72  urrounding.** fr
4680: 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67  ee-list leaf pag
4690: 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20 57  es:.**.**   1) W
46a0: 68 65 6e 20 61 6c 6c 20 64 61 74 61 20 69 73 20  hen all data is 
46b0: 64 65 6c 65 74 65 64 20 66 72 6f 6d 20 61 20 70  deleted from a p
46c0: 61 67 65 20 61 6e 64 20 74 68 65 20 70 61 67 65  age and the page
46d0: 20 62 65 63 6f 6d 65 73 0a 2a 2a 20 20 20 20 20   becomes.**     
46e0: 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61   a free-list lea
46f0: 66 20 70 61 67 65 2c 20 74 68 65 20 70 61 67 65  f page, the page
4700: 20 69 73 20 6e 6f 74 20 77 72 69 74 74 65 6e 20   is not written 
4710: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  to the database.
4720: 2a 2a 20 20 20 20 20 20 28 61 73 20 66 72 65 65  **      (as free
4730: 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65 73  -list leaf pages
4740: 20 63 6f 6e 74 61 69 6e 20 6e 6f 20 6d 65 61 6e   contain no mean
4750: 69 6e 67 66 75 6c 20 64 61 74 61 29 2e 20 53 6f  ingful data). So
4760: 6d 65 74 69 6d 65 73 0a 2a 2a 20 20 20 20 20 20  metimes.**      
4770: 73 75 63 68 20 61 20 70 61 67 65 20 69 73 20 6e  such a page is n
4780: 6f 74 20 65 76 65 6e 20 6a 6f 75 72 6e 61 6c 6c  ot even journall
4790: 65 64 20 28 61 73 20 69 74 20 77 69 6c 6c 20 6e  ed (as it will n
47a0: 6f 74 20 62 65 20 6d 6f 64 69 66 69 65 64 2c 0a  ot be modified,.
47b0: 2a 2a 20 20 20 20 20 20 77 68 79 20 62 6f 74 68  **      why both
47c0: 65 72 20 6a 6f 75 72 6e 61 6c 6c 69 6e 67 20 69  er journalling i
47d0: 74 3f 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 29 20  t?)..**.**   2) 
47e0: 57 68 65 6e 20 61 20 66 72 65 65 2d 6c 69 73 74  When a free-list
47f0: 20 6c 65 61 66 20 70 61 67 65 20 69 73 20 72 65   leaf page is re
4800: 75 73 65 64 2c 20 69 74 73 20 63 6f 6e 74 65 6e  used, its conten
4810: 74 20 69 73 20 6e 6f 74 20 72 65 61 64 0a 2a 2a  t is not read.**
4820: 20 20 20 20 20 20 66 72 6f 6d 20 74 68 65 20 64        from the d
4830: 61 74 61 62 61 73 65 20 6f 72 20 77 72 69 74 74  atabase or writt
4840: 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  en to the journa
4850: 6c 20 66 69 6c 65 20 28 77 68 79 20 73 68 6f 75  l file (why shou
4860: 6c 64 20 69 74 0a 2a 2a 20 20 20 20 20 20 62 65  ld it.**      be
4870: 2c 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61  , if it is not a
4880: 74 20 61 6c 6c 20 6d 65 61 6e 69 6e 67 66 75 6c  t all meaningful
4890: 3f 29 2e 0a 2a 2a 0a 2a 2a 20 42 79 20 74 68 65  ?)..**.** By the
48a0: 6d 73 65 6c 76 65 73 2c 20 74 68 65 73 65 20 6f  mselves, these o
48b0: 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 77 6f 72  ptimizations wor
48c0: 6b 20 66 69 6e 65 20 61 6e 64 20 70 72 6f 76 69  k fine and provi
48d0: 64 65 20 61 20 68 61 6e 64 79 0a 2a 2a 20 70 65  de a handy.** pe
48e0: 72 66 6f 72 6d 61 6e 63 65 20 62 6f 6f 73 74 20  rformance boost 
48f0: 74 6f 20 62 75 6c 6b 20 64 65 6c 65 74 65 20 6f  to bulk delete o
4900: 72 20 69 6e 73 65 72 74 20 6f 70 65 72 61 74 69  r insert operati
4910: 6f 6e 73 2e 20 48 6f 77 65 76 65 72 2c 20 69 66  ons. However, if
4920: 0a 2a 2a 20 61 20 70 61 67 65 20 69 73 20 6d 6f  .** a page is mo
4930: 76 65 64 20 74 6f 20 74 68 65 20 66 72 65 65 2d  ved to the free-
4940: 6c 69 73 74 20 61 6e 64 20 74 68 65 6e 20 72 65  list and then re
4950: 75 73 65 64 20 77 69 74 68 69 6e 20 74 68 65 20  used within the 
4960: 73 61 6d 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74  same.** transact
4970: 69 6f 6e 2c 20 61 20 70 72 6f 62 6c 65 6d 20 63  ion, a problem c
4980: 6f 6d 65 73 20 75 70 2e 20 49 66 20 74 68 65 20  omes up. If the 
4990: 70 61 67 65 20 69 73 20 6e 6f 74 20 6a 6f 75 72  page is not jour
49a0: 6e 61 6c 6c 65 64 20 77 68 65 6e 0a 2a 2a 20 69  nalled when.** i
49b0: 74 20 69 73 20 6d 6f 76 65 64 20 74 6f 20 74 68  t is moved to th
49c0: 65 20 66 72 65 65 2d 6c 69 73 74 20 61 6e 64 20  e free-list and 
49d0: 69 74 20 69 73 20 61 6c 73 6f 20 6e 6f 74 20 6a  it is also not j
49e0: 6f 75 72 6e 61 6c 6c 65 64 20 77 68 65 6e 20 69  ournalled when i
49f0: 74 0a 2a 2a 20 69 73 20 65 78 74 72 61 63 74 65  t.** is extracte
4a00: 64 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 2d  d from the free-
4a10: 6c 69 73 74 20 61 6e 64 20 72 65 75 73 65 64 2c  list and reused,
4a20: 20 74 68 65 6e 20 74 68 65 20 6f 72 69 67 69 6e   then the origin
4a30: 61 6c 20 64 61 74 61 0a 2a 2a 20 6d 61 79 20 62  al data.** may b
4a40: 65 20 6c 6f 73 74 2e 20 49 6e 20 74 68 65 20 65  e lost. In the e
4a50: 76 65 6e 74 20 6f 66 20 61 20 72 6f 6c 6c 62 61  vent of a rollba
4a60: 63 6b 2c 20 69 74 20 6d 61 79 20 6e 6f 74 20 62  ck, it may not b
4a70: 65 20 70 6f 73 73 69 62 6c 65 0a 2a 2a 20 74 6f  e possible.** to
4a80: 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74   restore the dat
4a90: 61 62 61 73 65 20 74 6f 20 69 74 73 20 6f 72 69  abase to its ori
4aa0: 67 69 6e 61 6c 20 63 6f 6e 66 69 67 75 72 61 74  ginal configurat
4ab0: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73  ion..**.** The s
4ac0: 6f 6c 75 74 69 6f 6e 20 69 73 20 74 68 65 20 42  olution is the B
4ad0: 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74  tShared.pHasCont
4ae0: 65 6e 74 20 62 69 74 76 65 63 2e 20 57 68 65 6e  ent bitvec. When
4af0: 65 76 65 72 20 61 20 70 61 67 65 20 69 73 20 0a  ever a page is .
4b00: 2a 2a 20 6d 6f 76 65 64 20 74 6f 20 62 65 63 6f  ** moved to beco
4b10: 6d 65 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c  me a free-list l
4b20: 65 61 66 20 70 61 67 65 2c 20 74 68 65 20 63 6f  eaf page, the co
4b30: 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20  rresponding bit 
4b40: 69 73 0a 2a 2a 20 73 65 74 20 69 6e 20 74 68 65  is.** set in the
4b50: 20 62 69 74 76 65 63 2e 20 57 68 65 6e 65 76 65   bitvec. Wheneve
4b60: 72 20 61 20 6c 65 61 66 20 70 61 67 65 20 69 73  r a leaf page is
4b70: 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
4b80: 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 0a 2a  the free-list,.*
4b90: 2a 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 32  * optimization 2
4ba0: 20 61 62 6f 76 65 20 69 73 20 6f 6d 69 74 74 65   above is omitte
4bb0: 64 20 69 66 20 74 68 65 20 63 6f 72 72 65 73 70  d if the corresp
4bc0: 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 20 61 6c  onding bit is al
4bd0: 72 65 61 64 79 0a 2a 2a 20 73 65 74 20 69 6e 20  ready.** set in 
4be0: 42 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e  BtShared.pHasCon
4bf0: 74 65 6e 74 2e 20 54 68 65 20 63 6f 6e 74 65 6e  tent. The conten
4c00: 74 73 20 6f 66 20 74 68 65 20 62 69 74 76 65 63  ts of the bitvec
4c10: 20 61 72 65 20 63 6c 65 61 72 65 64 0a 2a 2a 20   are cleared.** 
4c20: 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 65 76  at the end of ev
4c30: 65 72 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ery transaction.
4c40: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
4c50: 74 72 65 65 53 65 74 48 61 73 43 6f 6e 74 65 6e  treeSetHasConten
4c60: 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c  t(BtShared *pBt,
4c70: 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 69   Pgno pgno){.  i
4c80: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
4c90: 4b 3b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 70  K;.  if( !pBt->p
4ca0: 48 61 73 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20  HasContent ){.  
4cb0: 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 3c 3d    assert( pgno<=
4cc0: 70 42 74 2d 3e 6e 50 61 67 65 20 29 3b 0a 20 20  pBt->nPage );.  
4cd0: 20 20 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65    pBt->pHasConte
4ce0: 6e 74 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76  nt = sqlite3Bitv
4cf0: 65 63 43 72 65 61 74 65 28 70 42 74 2d 3e 6e 50  ecCreate(pBt->nP
4d00: 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 21 70  age);.    if( !p
4d10: 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20  Bt->pHasContent 
4d20: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
4d30: 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
4d40: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
4d50: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
4d60: 26 20 70 67 6e 6f 3c 3d 73 71 6c 69 74 65 33 42  & pgno<=sqlite3B
4d70: 69 74 76 65 63 53 69 7a 65 28 70 42 74 2d 3e 70  itvecSize(pBt->p
4d80: 48 61 73 43 6f 6e 74 65 6e 74 29 20 29 7b 0a 20  HasContent) ){. 
4d90: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
4da0: 69 74 76 65 63 53 65 74 28 70 42 74 2d 3e 70 48  itvecSet(pBt->pH
4db0: 61 73 43 6f 6e 74 65 6e 74 2c 20 70 67 6e 6f 29  asContent, pgno)
4dc0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
4dd0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 51 75 65 72  c;.}../*.** Quer
4de0: 79 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70  y the BtShared.p
4df0: 48 61 73 43 6f 6e 74 65 6e 74 20 76 65 63 74 6f  HasContent vecto
4e00: 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  r..**.** This fu
4e10: 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
4e20: 20 77 68 65 6e 20 61 20 66 72 65 65 2d 6c 69 73   when a free-lis
4e30: 74 20 6c 65 61 66 20 70 61 67 65 20 69 73 20 72  t leaf page is r
4e40: 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 0a  emoved from the.
4e50: 2a 2a 20 66 72 65 65 2d 6c 69 73 74 20 66 6f 72  ** free-list for
4e60: 20 72 65 75 73 65 2e 20 49 74 20 72 65 74 75 72   reuse. It retur
4e70: 6e 73 20 66 61 6c 73 65 20 69 66 20 69 74 20 69  ns false if it i
4e80: 73 20 73 61 66 65 20 74 6f 20 72 65 74 72 69 65  s safe to retrie
4e90: 76 65 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 66  ve the.** page f
4ea0: 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20 6c 61  rom the pager la
4eb0: 79 65 72 20 77 69 74 68 20 74 68 65 20 27 6e 6f  yer with the 'no
4ec0: 2d 63 6f 6e 74 65 6e 74 27 20 66 6c 61 67 20 73  -content' flag s
4ed0: 65 74 2e 20 54 72 75 65 20 6f 74 68 65 72 77 69  et. True otherwi
4ee0: 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  se..*/.static in
4ef0: 74 20 62 74 72 65 65 47 65 74 48 61 73 43 6f 6e  t btreeGetHasCon
4f00: 74 65 6e 74 28 42 74 53 68 61 72 65 64 20 2a 70  tent(BtShared *p
4f10: 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a  Bt, Pgno pgno){.
4f20: 20 20 42 69 74 76 65 63 20 2a 70 20 3d 20 70 42    Bitvec *p = pB
4f30: 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 3b 0a  t->pHasContent;.
4f40: 20 20 72 65 74 75 72 6e 20 28 70 20 26 26 20 28    return (p && (
4f50: 70 67 6e 6f 3e 73 71 6c 69 74 65 33 42 69 74 76  pgno>sqlite3Bitv
4f60: 65 63 53 69 7a 65 28 70 29 20 7c 7c 20 73 71 6c  ecSize(p) || sql
4f70: 69 74 65 33 42 69 74 76 65 63 54 65 73 74 28 70  ite3BitvecTest(p
4f80: 2c 20 70 67 6e 6f 29 29 29 3b 0a 7d 0a 0a 2f 2a  , pgno)));.}../*
4f90: 0a 2a 2a 20 43 6c 65 61 72 20 28 64 65 73 74 72  .** Clear (destr
4fa0: 6f 79 29 20 74 68 65 20 42 74 53 68 61 72 65 64  oy) the BtShared
4fb0: 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 62 69 74  .pHasContent bit
4fc0: 76 65 63 2e 20 54 68 69 73 20 73 68 6f 75 6c 64  vec. This should
4fd0: 20 62 65 0a 2a 2a 20 69 6e 76 6f 6b 65 64 20 61   be.** invoked a
4fe0: 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e  t the conclusion
4ff0: 20 6f 66 20 65 61 63 68 20 77 72 69 74 65 2d 74   of each write-t
5000: 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  ransaction..*/.s
5010: 74 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65  tatic void btree
5020: 43 6c 65 61 72 48 61 73 43 6f 6e 74 65 6e 74 28  ClearHasContent(
5030: 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
5040: 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44    sqlite3BitvecD
5050: 65 73 74 72 6f 79 28 70 42 74 2d 3e 70 48 61 73  estroy(pBt->pHas
5060: 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 70 42 74 2d  Content);.  pBt-
5070: 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20 3d 20 30  >pHasContent = 0
5080: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61  ;.}../*.** Relea
5090: 73 65 20 61 6c 6c 20 6f 66 20 74 68 65 20 61 70  se all of the ap
50a0: 50 61 67 65 5b 5d 20 70 61 67 65 73 20 66 6f 72  Page[] pages for
50b0: 20 61 20 63 75 72 73 6f 72 2e 0a 2a 2f 0a 73 74   a cursor..*/.st
50c0: 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65 52  atic void btreeR
50d0: 65 6c 65 61 73 65 41 6c 6c 43 75 72 73 6f 72 50  eleaseAllCursorP
50e0: 61 67 65 73 28 42 74 43 75 72 73 6f 72 20 2a 70  ages(BtCursor *p
50f0: 43 75 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  Cur){.  int i;. 
5100: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 43 75   for(i=0; i<=pCu
5110: 72 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a  r->iPage; i++){.
5120: 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
5130: 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d 29  pCur->apPage[i])
5140: 3b 0a 20 20 20 20 70 43 75 72 2d 3e 61 70 50 61  ;.    pCur->apPa
5150: 67 65 5b 69 5d 20 3d 20 30 3b 0a 20 20 7d 0a 20  ge[i] = 0;.  }. 
5160: 20 70 43 75 72 2d 3e 69 50 61 67 65 20 3d 20 2d   pCur->iPage = -
5170: 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  1;.}../*.** The 
5180: 63 75 72 73 6f 72 20 70 61 73 73 65 64 20 61 73  cursor passed as
5190: 20 74 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65   the only argume
51a0: 6e 74 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f  nt must point to
51b0: 20 61 20 76 61 6c 69 64 20 65 6e 74 72 79 0a 2a   a valid entry.*
51c0: 2a 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  * when this func
51d0: 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 28  tion is called (
51e0: 69 2e 65 2e 20 68 61 76 65 20 65 53 74 61 74 65  i.e. have eState
51f0: 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 29 2e  ==CURSOR_VALID).
5200: 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f   This.** functio
5210: 6e 20 73 61 76 65 73 20 74 68 65 20 63 75 72 72  n saves the curr
5220: 65 6e 74 20 63 75 72 73 6f 72 20 6b 65 79 20 69  ent cursor key i
5230: 6e 20 76 61 72 69 61 62 6c 65 73 20 70 43 75 72  n variables pCur
5240: 2d 3e 6e 4b 65 79 20 61 6e 64 0a 2a 2a 20 70 43  ->nKey and.** pC
5250: 75 72 2d 3e 70 4b 65 79 2e 20 53 51 4c 49 54 45  ur->pKey. SQLITE
5260: 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20  _OK is returned 
5270: 69 66 20 73 75 63 63 65 73 73 66 75 6c 20 6f 72  if successful or
5280: 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
5290: 20 0a 2a 2a 20 63 6f 64 65 20 6f 74 68 65 72 77   .** code otherw
52a0: 69 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ise..**.** If th
52b0: 65 20 63 75 72 73 6f 72 20 69 73 20 6f 70 65 6e  e cursor is open
52c0: 20 6f 6e 20 61 6e 20 69 6e 74 6b 65 79 20 74 61   on an intkey ta
52d0: 62 6c 65 2c 20 74 68 65 6e 20 74 68 65 20 69 6e  ble, then the in
52e0: 74 65 67 65 72 20 6b 65 79 0a 2a 2a 20 28 74 68  teger key.** (th
52f0: 65 20 72 6f 77 69 64 29 20 69 73 20 73 74 6f 72  e rowid) is stor
5300: 65 64 20 69 6e 20 70 43 75 72 2d 3e 6e 4b 65 79  ed in pCur->nKey
5310: 20 61 6e 64 20 70 43 75 72 2d 3e 70 4b 65 79 20   and pCur->pKey 
5320: 69 73 20 6c 65 66 74 20 73 65 74 20 74 6f 0a 2a  is left set to.*
5330: 2a 20 4e 55 4c 4c 2e 20 49 66 20 74 68 65 20 63  * NULL. If the c
5340: 75 72 73 6f 72 20 69 73 20 6f 70 65 6e 20 6f 6e  ursor is open on
5350: 20 61 20 6e 6f 6e 2d 69 6e 74 6b 65 79 20 74 61   a non-intkey ta
5360: 62 6c 65 2c 20 74 68 65 6e 20 70 43 75 72 2d 3e  ble, then pCur->
5370: 70 4b 65 79 20 69 73 20 0a 2a 2a 20 73 65 74 20  pKey is .** set 
5380: 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20 6d 61  to point to a ma
5390: 6c 6c 6f 63 65 64 20 62 75 66 66 65 72 20 70 43  lloced buffer pC
53a0: 75 72 2d 3e 6e 4b 65 79 20 62 79 74 65 73 20 69  ur->nKey bytes i
53b0: 6e 20 73 69 7a 65 20 63 6f 6e 74 61 69 6e 69 6e  n size containin
53c0: 67 20 0a 2a 2a 20 74 68 65 20 6b 65 79 2e 0a 2a  g .** the key..*
53d0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61 76  /.static int sav
53e0: 65 43 75 72 73 6f 72 4b 65 79 28 42 74 43 75 72  eCursorKey(BtCur
53f0: 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e  sor *pCur){.  in
5400: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
5410: 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55 52 53  ;.  assert( CURS
5420: 4f 52 5f 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e  OR_VALID==pCur->
5430: 65 53 74 61 74 65 20 29 3b 0a 20 20 61 73 73 65  eState );.  asse
5440: 72 74 28 20 30 3d 3d 70 43 75 72 2d 3e 70 4b 65  rt( 0==pCur->pKe
5450: 79 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63  y );.  assert( c
5460: 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
5470: 70 43 75 72 29 20 29 3b 0a 0a 20 20 69 66 28 20  pCur) );..  if( 
5480: 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79 20  pCur->curIntKey 
5490: 29 7b 0a 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 74  ){.    /* Only t
54a0: 68 65 20 72 6f 77 69 64 20 69 73 20 72 65 71 75  he rowid is requ
54b0: 69 72 65 64 20 66 6f 72 20 61 20 74 61 62 6c 65  ired for a table
54c0: 20 62 74 72 65 65 20 2a 2f 0a 20 20 20 20 70 43   btree */.    pC
54d0: 75 72 2d 3e 6e 4b 65 79 20 3d 20 73 71 6c 69 74  ur->nKey = sqlit
54e0: 65 33 42 74 72 65 65 49 6e 74 65 67 65 72 4b 65  e3BtreeIntegerKe
54f0: 79 28 70 43 75 72 29 3b 0a 20 20 7d 65 6c 73 65  y(pCur);.  }else
5500: 7b 0a 20 20 20 20 2f 2a 20 46 6f 72 20 61 6e 20  {.    /* For an 
5510: 69 6e 64 65 78 20 62 74 72 65 65 2c 20 73 61 76  index btree, sav
5520: 65 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 6b  e the complete k
5530: 65 79 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20  ey content */.  
5540: 20 20 76 6f 69 64 20 2a 70 4b 65 79 3b 0a 20 20    void *pKey;.  
5550: 20 20 70 43 75 72 2d 3e 6e 4b 65 79 20 3d 20 73    pCur->nKey = s
5560: 71 6c 69 74 65 33 42 74 72 65 65 50 61 79 6c 6f  qlite3BtreePaylo
5570: 61 64 53 69 7a 65 28 70 43 75 72 29 3b 0a 20 20  adSize(pCur);.  
5580: 20 20 70 4b 65 79 20 3d 20 73 71 6c 69 74 65 33    pKey = sqlite3
5590: 4d 61 6c 6c 6f 63 28 20 70 43 75 72 2d 3e 6e 4b  Malloc( pCur->nK
55a0: 65 79 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4b  ey );.    if( pK
55b0: 65 79 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  ey ){.      rc =
55c0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 79   sqlite3BtreePay
55d0: 6c 6f 61 64 28 70 43 75 72 2c 20 30 2c 20 28 69  load(pCur, 0, (i
55e0: 6e 74 29 70 43 75 72 2d 3e 6e 4b 65 79 2c 20 70  nt)pCur->nKey, p
55f0: 4b 65 79 29 3b 0a 20 20 20 20 20 20 69 66 28 20  Key);.      if( 
5600: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
5610: 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 70  .        pCur->p
5620: 4b 65 79 20 3d 20 70 4b 65 79 3b 0a 20 20 20 20  Key = pKey;.    
5630: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
5640: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4b   sqlite3_free(pK
5650: 65 79 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ey);.      }.   
5660: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
5670: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f   = SQLITE_NOMEM_
5680: 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  BKPT;.    }.  }.
5690: 20 20 61 73 73 65 72 74 28 20 21 70 43 75 72 2d    assert( !pCur-
56a0: 3e 63 75 72 49 6e 74 4b 65 79 20 7c 7c 20 21 70  >curIntKey || !p
56b0: 43 75 72 2d 3e 70 4b 65 79 20 29 3b 0a 20 20 72  Cur->pKey );.  r
56c0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
56d0: 2a 2a 20 53 61 76 65 20 74 68 65 20 63 75 72 72  ** Save the curr
56e0: 65 6e 74 20 63 75 72 73 6f 72 20 70 6f 73 69 74  ent cursor posit
56f0: 69 6f 6e 20 69 6e 20 74 68 65 20 76 61 72 69 61  ion in the varia
5700: 62 6c 65 73 20 42 74 43 75 72 73 6f 72 2e 6e 4b  bles BtCursor.nK
5710: 65 79 20 0a 2a 2a 20 61 6e 64 20 42 74 43 75 72  ey .** and BtCur
5720: 73 6f 72 2e 70 4b 65 79 2e 20 54 68 65 20 63 75  sor.pKey. The cu
5730: 72 73 6f 72 27 73 20 73 74 61 74 65 20 69 73 20  rsor's state is 
5740: 73 65 74 20 74 6f 20 43 55 52 53 4f 52 5f 52 45  set to CURSOR_RE
5750: 51 55 49 52 45 53 45 45 4b 2e 0a 2a 2a 0a 2a 2a  QUIRESEEK..**.**
5760: 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74   The caller must
5770: 20 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65   ensure that the
5780: 20 63 75 72 73 6f 72 20 69 73 20 76 61 6c 69 64   cursor is valid
5790: 20 28 68 61 73 20 65 53 74 61 74 65 3d 3d 43 55   (has eState==CU
57a0: 52 53 4f 52 5f 56 41 4c 49 44 29 0a 2a 2a 20 70  RSOR_VALID).** p
57b0: 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67 20  rior to calling 
57c0: 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20 20 0a  this routine.  .
57d0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61  */.static int sa
57e0: 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  veCursorPosition
57f0: 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
5800: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61  {.  int rc;..  a
5810: 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f 56 41  ssert( CURSOR_VA
5820: 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74  LID==pCur->eStat
5830: 65 20 7c 7c 20 43 55 52 53 4f 52 5f 53 4b 49 50  e || CURSOR_SKIP
5840: 4e 45 58 54 3d 3d 70 43 75 72 2d 3e 65 53 74 61  NEXT==pCur->eSta
5850: 74 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  te );.  assert( 
5860: 30 3d 3d 70 43 75 72 2d 3e 70 4b 65 79 20 29 3b  0==pCur->pKey );
5870: 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
5880: 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
5890: 29 20 29 3b 0a 0a 20 20 69 66 28 20 70 43 75 72  ) );..  if( pCur
58a0: 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
58b0: 5f 53 4b 49 50 4e 45 58 54 20 29 7b 0a 20 20 20  _SKIPNEXT ){.   
58c0: 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
58d0: 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20  CURSOR_VALID;.  
58e0: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 43 75 72 2d  }else{.    pCur-
58f0: 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a 20  >skipNext = 0;. 
5900: 20 7d 0a 0a 20 20 72 63 20 3d 20 73 61 76 65 43   }..  rc = saveC
5910: 75 72 73 6f 72 4b 65 79 28 70 43 75 72 29 3b 0a  ursorKey(pCur);.
5920: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
5930: 5f 4f 4b 20 29 7b 0a 20 20 20 20 62 74 72 65 65  _OK ){.    btree
5940: 52 65 6c 65 61 73 65 41 6c 6c 43 75 72 73 6f 72  ReleaseAllCursor
5950: 50 61 67 65 73 28 70 43 75 72 29 3b 0a 20 20 20  Pages(pCur);.   
5960: 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
5970: 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45  CURSOR_REQUIRESE
5980: 45 4b 3b 0a 20 20 7d 0a 0a 20 20 70 43 75 72 2d  EK;.  }..  pCur-
5990: 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 28 42  >curFlags &= ~(B
59a0: 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54  TCF_ValidNKey|BT
59b0: 43 46 5f 56 61 6c 69 64 4f 76 66 6c 7c 42 54 43  CF_ValidOvfl|BTC
59c0: 46 5f 41 74 4c 61 73 74 29 3b 0a 20 20 72 65 74  F_AtLast);.  ret
59d0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f  urn rc;.}../* Fo
59e0: 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 20  rward reference 
59f0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51  */.static int SQ
5a00: 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 73 61  LITE_NOINLINE sa
5a10: 76 65 43 75 72 73 6f 72 73 4f 6e 4c 69 73 74 28  veCursorsOnList(
5a20: 42 74 43 75 72 73 6f 72 2a 2c 50 67 6e 6f 2c 42  BtCursor*,Pgno,B
5a30: 74 43 75 72 73 6f 72 2a 29 3b 0a 0a 2f 2a 0a 2a  tCursor*);../*.*
5a40: 2a 20 53 61 76 65 20 74 68 65 20 70 6f 73 69 74  * Save the posit
5a50: 69 6f 6e 73 20 6f 66 20 61 6c 6c 20 63 75 72 73  ions of all curs
5a60: 6f 72 73 20 28 65 78 63 65 70 74 20 70 45 78 63  ors (except pExc
5a70: 65 70 74 29 20 74 68 61 74 20 61 72 65 20 6f 70  ept) that are op
5a80: 65 6e 20 6f 6e 0a 2a 2a 20 74 68 65 20 74 61 62  en on.** the tab
5a90: 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67  le with root-pag
5aa0: 65 20 69 52 6f 6f 74 2e 20 20 22 53 61 76 69 6e  e iRoot.  "Savin
5ab0: 67 20 74 68 65 20 63 75 72 73 6f 72 20 70 6f 73  g the cursor pos
5ac0: 69 74 69 6f 6e 22 20 6d 65 61 6e 73 20 74 68 61  ition" means tha
5ad0: 74 0a 2a 2a 20 74 68 65 20 6c 6f 63 61 74 69 6f  t.** the locatio
5ae0: 6e 20 69 6e 20 74 68 65 20 62 74 72 65 65 20 69  n in the btree i
5af0: 73 20 72 65 6d 65 6d 62 65 72 65 64 20 69 6e 20  s remembered in 
5b00: 73 75 63 68 20 61 20 77 61 79 20 74 68 61 74 20  such a way that 
5b10: 69 74 20 63 61 6e 20 62 65 0a 2a 2a 20 6d 6f 76  it can be.** mov
5b20: 65 64 20 62 61 63 6b 20 74 6f 20 74 68 65 20 73  ed back to the s
5b30: 61 6d 65 20 73 70 6f 74 20 61 66 74 65 72 20 74  ame spot after t
5b40: 68 65 20 62 74 72 65 65 20 68 61 73 20 62 65 65  he btree has bee
5b50: 6e 20 6d 6f 64 69 66 69 65 64 2e 20 20 54 68 69  n modified.  Thi
5b60: 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73 20  s.** routine is 
5b70: 63 61 6c 6c 65 64 20 6a 75 73 74 20 62 65 66 6f  called just befo
5b80: 72 65 20 63 75 72 73 6f 72 20 70 45 78 63 65 70  re cursor pExcep
5b90: 74 20 69 73 20 75 73 65 64 20 74 6f 20 6d 6f 64  t is used to mod
5ba0: 69 66 79 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65  ify the.** table
5bb0: 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 20 69 6e  , for example in
5bc0: 20 42 74 72 65 65 44 65 6c 65 74 65 28 29 20 6f   BtreeDelete() o
5bd0: 72 20 42 74 72 65 65 49 6e 73 65 72 74 28 29 2e  r BtreeInsert().
5be0: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20  .**.** If there 
5bf0: 61 72 65 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20  are two or more 
5c00: 63 75 72 73 6f 72 73 20 6f 6e 20 74 68 65 20 73  cursors on the s
5c10: 61 6d 65 20 62 74 72 65 65 2c 20 74 68 65 6e 20  ame btree, then 
5c20: 61 6c 6c 20 73 75 63 68 20 0a 2a 2a 20 63 75 72  all such .** cur
5c30: 73 6f 72 73 20 73 68 6f 75 6c 64 20 68 61 76 65  sors should have
5c40: 20 74 68 65 69 72 20 42 54 43 46 5f 4d 75 6c 74   their BTCF_Mult
5c50: 69 70 6c 65 20 66 6c 61 67 20 73 65 74 2e 20 20  iple flag set.  
5c60: 54 68 65 20 62 74 72 65 65 43 75 72 73 6f 72 28  The btreeCursor(
5c70: 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 65 6e 66  ).** routine enf
5c80: 6f 72 63 65 73 20 74 68 61 74 20 72 75 6c 65 2e  orces that rule.
5c90: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6f    This routine o
5ca0: 6e 6c 79 20 6e 65 65 64 73 20 74 6f 20 62 65 20  nly needs to be 
5cb0: 63 61 6c 6c 65 64 20 69 6e 0a 2a 2a 20 74 68 65  called in.** the
5cc0: 20 75 6e 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77   uncommon case w
5cd0: 68 65 6e 20 70 45 78 70 65 63 74 20 68 61 73 20  hen pExpect has 
5ce0: 74 68 65 20 42 54 43 46 5f 4d 75 6c 74 69 70 6c  the BTCF_Multipl
5cf0: 65 20 66 6c 61 67 20 73 65 74 2e 0a 2a 2a 0a 2a  e flag set..**.*
5d00: 2a 20 49 66 20 70 45 78 70 65 63 74 21 3d 4e 55  * If pExpect!=NU
5d10: 4c 4c 20 61 6e 64 20 69 66 20 6e 6f 20 6f 74 68  LL and if no oth
5d20: 65 72 20 63 75 72 73 6f 72 73 20 61 72 65 20 66  er cursors are f
5d30: 6f 75 6e 64 20 6f 6e 20 74 68 65 20 73 61 6d 65  ound on the same
5d40: 20 72 6f 6f 74 2d 70 61 67 65 2c 0a 2a 2a 20 74   root-page,.** t
5d50: 68 65 6e 20 74 68 65 20 42 54 43 46 5f 4d 75 6c  hen the BTCF_Mul
5d60: 74 69 70 6c 65 20 66 6c 61 67 20 6f 6e 20 70 45  tiple flag on pE
5d70: 78 70 65 63 74 20 69 73 20 63 6c 65 61 72 65 64  xpect is cleared
5d80: 2c 20 74 6f 20 61 76 6f 69 64 20 61 6e 6f 74 68  , to avoid anoth
5d90: 65 72 0a 2a 2a 20 70 6f 69 6e 74 6c 65 73 73 20  er.** pointless 
5da0: 63 61 6c 6c 20 74 6f 20 74 68 69 73 20 72 6f 75  call to this rou
5db0: 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 49 6d 70 6c  tine..**.** Impl
5dc0: 65 6d 65 6e 74 61 74 69 6f 6e 20 6e 6f 74 65 3a  ementation note:
5dd0: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d    This routine m
5de0: 65 72 65 6c 79 20 63 68 65 63 6b 73 20 74 6f 20  erely checks to 
5df0: 73 65 65 20 69 66 20 61 6e 79 20 63 75 72 73 6f  see if any curso
5e00: 72 73 0a 2a 2a 20 6e 65 65 64 20 74 6f 20 62 65  rs.** need to be
5e10: 20 73 61 76 65 64 2e 20 20 49 74 20 63 61 6c 6c   saved.  It call
5e20: 73 20 6f 75 74 20 74 6f 20 73 61 76 65 43 75 72  s out to saveCur
5e30: 73 6f 72 73 4f 6e 4c 69 73 74 28 29 20 69 6e 20  sorsOnList() in 
5e40: 74 68 65 20 28 75 6e 75 73 75 61 6c 29 0a 2a 2a  the (unusual).**
5e50: 20 65 76 65 6e 74 20 74 68 61 74 20 63 75 72 73   event that curs
5e60: 6f 72 73 20 61 72 65 20 69 6e 20 6e 65 65 64 20  ors are in need 
5e70: 74 6f 20 62 65 69 6e 67 20 73 61 76 65 64 2e 0a  to being saved..
5e80: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61  */.static int sa
5e90: 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 42 74 53  veAllCursors(BtS
5ea0: 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f  hared *pBt, Pgno
5eb0: 20 69 52 6f 6f 74 2c 20 42 74 43 75 72 73 6f 72   iRoot, BtCursor
5ec0: 20 2a 70 45 78 63 65 70 74 29 7b 0a 20 20 42 74   *pExcept){.  Bt
5ed0: 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 61 73 73  Cursor *p;.  ass
5ee0: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
5ef0: 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
5f00: 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
5f10: 20 70 45 78 63 65 70 74 3d 3d 30 20 7c 7c 20 70   pExcept==0 || p
5f20: 45 78 63 65 70 74 2d 3e 70 42 74 3d 3d 70 42 74  Except->pBt==pBt
5f30: 20 29 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74 2d   );.  for(p=pBt-
5f40: 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70  >pCursor; p; p=p
5f50: 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66  ->pNext){.    if
5f60: 28 20 70 21 3d 70 45 78 63 65 70 74 20 26 26 20  ( p!=pExcept && 
5f70: 28 30 3d 3d 69 52 6f 6f 74 20 7c 7c 20 70 2d 3e  (0==iRoot || p->
5f80: 70 67 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f 74 29  pgnoRoot==iRoot)
5f90: 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20   ) break;.  }.  
5fa0: 69 66 28 20 70 20 29 20 72 65 74 75 72 6e 20 73  if( p ) return s
5fb0: 61 76 65 43 75 72 73 6f 72 73 4f 6e 4c 69 73 74  aveCursorsOnList
5fc0: 28 70 2c 20 69 52 6f 6f 74 2c 20 70 45 78 63 65  (p, iRoot, pExce
5fd0: 70 74 29 3b 0a 20 20 69 66 28 20 70 45 78 63 65  pt);.  if( pExce
5fe0: 70 74 20 29 20 70 45 78 63 65 70 74 2d 3e 63 75  pt ) pExcept->cu
5ff0: 72 46 6c 61 67 73 20 26 3d 20 7e 42 54 43 46 5f  rFlags &= ~BTCF_
6000: 4d 75 6c 74 69 70 6c 65 3b 0a 20 20 72 65 74 75  Multiple;.  retu
6010: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
6020: 0a 2f 2a 20 54 68 69 73 20 68 65 6c 70 65 72 20  ./* This helper 
6030: 72 6f 75 74 69 6e 65 20 74 6f 20 73 61 76 65 41  routine to saveA
6040: 6c 6c 43 75 72 73 6f 72 73 20 64 6f 65 73 20 74  llCursors does t
6050: 68 65 20 61 63 74 75 61 6c 20 77 6f 72 6b 20 6f  he actual work o
6060: 66 20 73 61 76 69 6e 67 0a 2a 2a 20 74 68 65 20  f saving.** the 
6070: 63 75 72 73 6f 72 73 20 69 66 20 61 6e 64 20 77  cursors if and w
6080: 68 65 6e 20 61 20 63 75 72 73 6f 72 20 69 73 20  hen a cursor is 
6090: 66 6f 75 6e 64 20 74 68 61 74 20 61 63 74 75 61  found that actua
60a0: 6c 6c 79 20 72 65 71 75 69 72 65 73 20 73 61 76  lly requires sav
60b0: 69 6e 67 2e 0a 2a 2a 20 54 68 65 20 63 6f 6d 6d  ing..** The comm
60c0: 6f 6e 20 63 61 73 65 20 69 73 20 74 68 61 74 20  on case is that 
60d0: 6e 6f 20 63 75 72 73 6f 72 73 20 6e 65 65 64 20  no cursors need 
60e0: 74 6f 20 62 65 20 73 61 76 65 64 2c 20 73 6f 20  to be saved, so 
60f0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 0a  this routine is.
6100: 2a 2a 20 62 72 6f 6b 65 6e 20 6f 75 74 20 66 72  ** broken out fr
6110: 6f 6d 20 69 74 73 20 63 61 6c 6c 65 72 20 74 6f  om its caller to
6120: 20 61 76 6f 69 64 20 75 6e 6e 65 63 65 73 73 61   avoid unnecessa
6130: 72 79 20 73 74 61 63 6b 20 70 6f 69 6e 74 65 72  ry stack pointer
6140: 20 6d 6f 76 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74   movement..*/.st
6150: 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f  atic int SQLITE_
6160: 4e 4f 49 4e 4c 49 4e 45 20 73 61 76 65 43 75 72  NOINLINE saveCur
6170: 73 6f 72 73 4f 6e 4c 69 73 74 28 0a 20 20 42 74  sorsOnList(.  Bt
6180: 43 75 72 73 6f 72 20 2a 70 2c 20 20 20 20 20 20  Cursor *p,      
6190: 20 20 20 2f 2a 20 54 68 65 20 66 69 72 73 74 20     /* The first 
61a0: 63 75 72 73 6f 72 20 74 68 61 74 20 6e 65 65 64  cursor that need
61b0: 73 20 73 61 76 69 6e 67 20 2a 2f 0a 20 20 50 67  s saving */.  Pg
61c0: 6e 6f 20 69 52 6f 6f 74 2c 20 20 20 20 20 20 20  no iRoot,       
61d0: 20 20 20 2f 2a 20 4f 6e 6c 79 20 73 61 76 65 20     /* Only save 
61e0: 63 75 72 73 6f 72 20 77 69 74 68 20 74 68 69 73  cursor with this
61f0: 20 69 52 6f 6f 74 2e 20 53 61 76 65 20 61 6c 6c   iRoot. Save all
6200: 20 69 66 20 7a 65 72 6f 20 2a 2f 0a 20 20 42 74   if zero */.  Bt
6210: 43 75 72 73 6f 72 20 2a 70 45 78 63 65 70 74 20  Cursor *pExcept 
6220: 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 73 61 76     /* Do not sav
6230: 65 20 74 68 69 73 20 63 75 72 73 6f 72 20 2a 2f  e this cursor */
6240: 0a 29 7b 0a 20 20 64 6f 7b 0a 20 20 20 20 69 66  .){.  do{.    if
6250: 28 20 70 21 3d 70 45 78 63 65 70 74 20 26 26 20  ( p!=pExcept && 
6260: 28 30 3d 3d 69 52 6f 6f 74 20 7c 7c 20 70 2d 3e  (0==iRoot || p->
6270: 70 67 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f 74 29  pgnoRoot==iRoot)
6280: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d   ){.      if( p-
6290: 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
62a0: 56 41 4c 49 44 20 7c 7c 20 70 2d 3e 65 53 74 61  VALID || p->eSta
62b0: 74 65 3d 3d 43 55 52 53 4f 52 5f 53 4b 49 50 4e  te==CURSOR_SKIPN
62c0: 45 58 54 20 29 7b 0a 20 20 20 20 20 20 20 20 69  EXT ){.        i
62d0: 6e 74 20 72 63 20 3d 20 73 61 76 65 43 75 72 73  nt rc = saveCurs
62e0: 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29 3b 0a 20  orPosition(p);. 
62f0: 20 20 20 20 20 20 20 69 66 28 20 53 51 4c 49 54         if( SQLIT
6300: 45 5f 4f 4b 21 3d 72 63 20 29 7b 0a 20 20 20 20  E_OK!=rc ){.    
6310: 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
6320: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
6330: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
6340: 74 65 73 74 63 61 73 65 28 20 70 2d 3e 69 50 61  testcase( p->iPa
6350: 67 65 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20  ge>0 );.        
6360: 62 74 72 65 65 52 65 6c 65 61 73 65 41 6c 6c 43  btreeReleaseAllC
6370: 75 72 73 6f 72 50 61 67 65 73 28 70 29 3b 0a 20  ursorPages(p);. 
6380: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
6390: 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20   p = p->pNext;. 
63a0: 20 7d 77 68 69 6c 65 28 20 70 20 29 3b 0a 20 20   }while( p );.  
63b0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
63c0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72  ;.}../*.** Clear
63d0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 75 72   the current cur
63e0: 73 6f 72 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2f  sor position..*/
63f0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72  .void sqlite3Btr
6400: 65 65 43 6c 65 61 72 43 75 72 73 6f 72 28 42 74  eeClearCursor(Bt
6410: 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
6420: 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
6430: 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
6440: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
6450: 65 28 70 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 20  e(pCur->pKey);. 
6460: 20 70 43 75 72 2d 3e 70 4b 65 79 20 3d 20 30 3b   pCur->pKey = 0;
6470: 0a 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20  .  pCur->eState 
6480: 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  = CURSOR_INVALID
6490: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 20 74 68  ;.}../*.** In th
64a0: 69 73 20 76 65 72 73 69 6f 6e 20 6f 66 20 42 74  is version of Bt
64b0: 72 65 65 4d 6f 76 65 74 6f 2c 20 70 4b 65 79 20  reeMoveto, pKey 
64c0: 69 73 20 61 20 70 61 63 6b 65 64 20 69 6e 64 65  is a packed inde
64d0: 78 20 72 65 63 6f 72 64 0a 2a 2a 20 73 75 63 68  x record.** such
64e0: 20 61 73 20 69 73 20 67 65 6e 65 72 61 74 65 64   as is generated
64f0: 20 62 79 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52   by the OP_MakeR
6500: 65 63 6f 72 64 20 6f 70 63 6f 64 65 2e 20 20 55  ecord opcode.  U
6510: 6e 70 61 63 6b 20 74 68 65 0a 2a 2a 20 72 65 63  npack the.** rec
6520: 6f 72 64 20 61 6e 64 20 74 68 65 6e 20 63 61 6c  ord and then cal
6530: 6c 20 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70  l BtreeMovetoUnp
6540: 61 63 6b 65 64 28 29 20 74 6f 20 64 6f 20 74 68  acked() to do th
6550: 65 20 77 6f 72 6b 2e 0a 2a 2f 0a 73 74 61 74 69  e work..*/.stati
6560: 63 20 69 6e 74 20 62 74 72 65 65 4d 6f 76 65 74  c int btreeMovet
6570: 6f 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  o(.  BtCursor *p
6580: 43 75 72 2c 20 20 20 20 20 2f 2a 20 43 75 72 73  Cur,     /* Curs
6590: 6f 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 62  or open on the b
65a0: 74 72 65 65 20 74 6f 20 62 65 20 73 65 61 72 63  tree to be searc
65b0: 68 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76  hed */.  const v
65c0: 6f 69 64 20 2a 70 4b 65 79 2c 20 20 20 2f 2a 20  oid *pKey,   /* 
65d0: 50 61 63 6b 65 64 20 6b 65 79 20 69 66 20 74 68  Packed key if th
65e0: 65 20 62 74 72 65 65 20 69 73 20 61 6e 20 69 6e  e btree is an in
65f0: 64 65 78 20 2a 2f 0a 20 20 69 36 34 20 6e 4b 65  dex */.  i64 nKe
6600: 79 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  y,           /* 
6610: 49 6e 74 65 67 65 72 20 6b 65 79 20 66 6f 72 20  Integer key for 
6620: 74 61 62 6c 65 73 2e 20 20 53 69 7a 65 20 6f 66  tables.  Size of
6630: 20 70 4b 65 79 20 66 6f 72 20 69 6e 64 69 63 65   pKey for indice
6640: 73 20 2a 2f 0a 20 20 69 6e 74 20 62 69 61 73 2c  s */.  int bias,
6650: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69             /* Bi
6660: 61 73 20 73 65 61 72 63 68 20 74 6f 20 74 68 65  as search to the
6670: 20 68 69 67 68 20 65 6e 64 20 2a 2f 0a 20 20 69   high end */.  i
6680: 6e 74 20 2a 70 52 65 73 20 20 20 20 20 20 20 20  nt *pRes        
6690: 20 20 20 2f 2a 20 57 72 69 74 65 20 73 65 61 72     /* Write sear
66a0: 63 68 20 72 65 73 75 6c 74 73 20 68 65 72 65 20  ch results here 
66b0: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  */.){.  int rc; 
66c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
66d0: 20 20 20 2f 2a 20 53 74 61 74 75 73 20 63 6f 64     /* Status cod
66e0: 65 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52  e */.  UnpackedR
66f0: 65 63 6f 72 64 20 2a 70 49 64 78 4b 65 79 3b 20  ecord *pIdxKey; 
6700: 20 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20 69 6e    /* Unpacked in
6710: 64 65 78 20 6b 65 79 20 2a 2f 0a 0a 20 20 69 66  dex key */..  if
6720: 28 20 70 4b 65 79 20 29 7b 0a 20 20 20 20 61 73  ( pKey ){.    as
6730: 73 65 72 74 28 20 6e 4b 65 79 3d 3d 28 69 36 34  sert( nKey==(i64
6740: 29 28 69 6e 74 29 6e 4b 65 79 20 29 3b 0a 20 20  )(int)nKey );.  
6750: 20 20 70 49 64 78 4b 65 79 20 3d 20 73 71 6c 69    pIdxKey = sqli
6760: 74 65 33 56 64 62 65 41 6c 6c 6f 63 55 6e 70 61  te3VdbeAllocUnpa
6770: 63 6b 65 64 52 65 63 6f 72 64 28 70 43 75 72 2d  ckedRecord(pCur-
6780: 3e 70 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 20 20  >pKeyInfo);.    
6790: 69 66 28 20 70 49 64 78 4b 65 79 3d 3d 30 20 29  if( pIdxKey==0 )
67a0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
67b0: 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 73  OMEM_BKPT;.    s
67c0: 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64  qlite3VdbeRecord
67d0: 55 6e 70 61 63 6b 28 70 43 75 72 2d 3e 70 4b 65  Unpack(pCur->pKe
67e0: 79 49 6e 66 6f 2c 20 28 69 6e 74 29 6e 4b 65 79  yInfo, (int)nKey
67f0: 2c 20 70 4b 65 79 2c 20 70 49 64 78 4b 65 79 29  , pKey, pIdxKey)
6800: 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78 4b 65  ;.    if( pIdxKe
6810: 79 2d 3e 6e 46 69 65 6c 64 3d 3d 30 20 29 7b 0a  y->nField==0 ){.
6820: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
6830: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
6840: 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74        goto movet
6850: 6f 5f 64 6f 6e 65 3b 0a 20 20 20 20 7d 0a 20 20  o_done;.    }.  
6860: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 64 78 4b  }else{.    pIdxK
6870: 65 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 63  ey = 0;.  }.  rc
6880: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d   = sqlite3BtreeM
6890: 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 70 43  ovetoUnpacked(pC
68a0: 75 72 2c 20 70 49 64 78 4b 65 79 2c 20 6e 4b 65  ur, pIdxKey, nKe
68b0: 79 2c 20 62 69 61 73 2c 20 70 52 65 73 29 3b 0a  y, bias, pRes);.
68c0: 6d 6f 76 65 74 6f 5f 64 6f 6e 65 3a 0a 20 20 69  moveto_done:.  i
68d0: 66 28 20 70 49 64 78 4b 65 79 20 29 7b 0a 20 20  f( pIdxKey ){.  
68e0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
68f0: 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e  pCur->pKeyInfo->
6900: 64 62 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20 20  db, pIdxKey);.  
6910: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
6920: 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 74 6f 72 65 20  ../*.** Restore 
6930: 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68  the cursor to th
6940: 65 20 70 6f 73 69 74 69 6f 6e 20 69 74 20 77 61  e position it wa
6950: 73 20 69 6e 20 28 6f 72 20 61 73 20 63 6c 6f 73  s in (or as clos
6960: 65 20 74 6f 20 61 73 20 70 6f 73 73 69 62 6c 65  e to as possible
6970: 29 0a 2a 2a 20 77 68 65 6e 20 73 61 76 65 43 75  ).** when saveCu
6980: 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 20 77  rsorPosition() w
6990: 61 73 20 63 61 6c 6c 65 64 2e 20 4e 6f 74 65 20  as called. Note 
69a0: 74 68 61 74 20 74 68 69 73 20 63 61 6c 6c 20 64  that this call d
69b0: 65 6c 65 74 65 73 20 74 68 65 20 0a 2a 2a 20 73  eletes the .** s
69c0: 61 76 65 64 20 70 6f 73 69 74 69 6f 6e 20 69 6e  aved position in
69d0: 66 6f 20 73 74 6f 72 65 64 20 62 79 20 73 61 76  fo stored by sav
69e0: 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
69f0: 29 2c 20 73 6f 20 74 68 65 72 65 20 63 61 6e 20  ), so there can 
6a00: 62 65 0a 2a 2a 20 61 74 20 6d 6f 73 74 20 6f 6e  be.** at most on
6a10: 65 20 65 66 66 65 63 74 69 76 65 20 72 65 73 74  e effective rest
6a20: 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  oreCursorPositio
6a30: 6e 28 29 20 63 61 6c 6c 20 61 66 74 65 72 20 65  n() call after e
6a40: 61 63 68 20 0a 2a 2a 20 73 61 76 65 43 75 72 73  ach .** saveCurs
6a50: 6f 72 50 6f 73 69 74 69 6f 6e 28 29 2e 0a 2a 2f  orPosition()..*/
6a60: 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65  .static int btre
6a70: 65 52 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f  eRestoreCursorPo
6a80: 73 69 74 69 6f 6e 28 42 74 43 75 72 73 6f 72 20  sition(BtCursor 
6a90: 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74 20 72 63  *pCur){.  int rc
6aa0: 3b 0a 20 20 69 6e 74 20 73 6b 69 70 4e 65 78 74  ;.  int skipNext
6ab0: 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ;.  assert( curs
6ac0: 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70  orOwnsBtShared(p
6ad0: 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
6ae0: 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3e 3d  ( pCur->eState>=
6af0: 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45  CURSOR_REQUIRESE
6b00: 45 4b 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72  EK );.  if( pCur
6b10: 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
6b20: 5f 46 41 55 4c 54 20 29 7b 0a 20 20 20 20 72 65  _FAULT ){.    re
6b30: 74 75 72 6e 20 70 43 75 72 2d 3e 73 6b 69 70 4e  turn pCur->skipN
6b40: 65 78 74 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d  ext;.  }.  pCur-
6b50: 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
6b60: 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 72 63 20 3d  _INVALID;.  rc =
6b70: 20 62 74 72 65 65 4d 6f 76 65 74 6f 28 70 43 75   btreeMoveto(pCu
6b80: 72 2c 20 70 43 75 72 2d 3e 70 4b 65 79 2c 20 70  r, pCur->pKey, p
6b90: 43 75 72 2d 3e 6e 4b 65 79 2c 20 30 2c 20 26 73  Cur->nKey, 0, &s
6ba0: 6b 69 70 4e 65 78 74 29 3b 0a 20 20 69 66 28 20  kipNext);.  if( 
6bb0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
6bc0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
6bd0: 65 28 70 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 20  e(pCur->pKey);. 
6be0: 20 20 20 70 43 75 72 2d 3e 70 4b 65 79 20 3d 20     pCur->pKey = 
6bf0: 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  0;.    assert( p
6c00: 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
6c10: 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70 43 75  SOR_VALID || pCu
6c20: 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
6c30: 52 5f 49 4e 56 41 4c 49 44 20 29 3b 0a 20 20 20  R_INVALID );.   
6c40: 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20   pCur->skipNext 
6c50: 7c 3d 20 73 6b 69 70 4e 65 78 74 3b 0a 20 20 20  |= skipNext;.   
6c60: 20 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e   if( pCur->skipN
6c70: 65 78 74 20 26 26 20 70 43 75 72 2d 3e 65 53 74  ext && pCur->eSt
6c80: 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
6c90: 44 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d  D ){.      pCur-
6ca0: 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
6cb0: 5f 53 4b 49 50 4e 45 58 54 3b 0a 20 20 20 20 7d  _SKIPNEXT;.    }
6cc0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
6cd0: 3b 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 72 65 73  ;.}..#define res
6ce0: 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69  toreCursorPositi
6cf0: 6f 6e 28 70 29 20 5c 0a 20 20 28 70 2d 3e 65 53  on(p) \.  (p->eS
6d00: 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51  tate>=CURSOR_REQ
6d10: 55 49 52 45 53 45 45 4b 20 3f 20 5c 0a 20 20 20  UIRESEEK ? \.   
6d20: 20 20 20 20 20 20 62 74 72 65 65 52 65 73 74 6f        btreeResto
6d30: 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  reCursorPosition
6d40: 28 70 29 20 3a 20 5c 0a 20 20 20 20 20 20 20 20  (p) : \.        
6d50: 20 53 51 4c 49 54 45 5f 4f 4b 29 0a 0a 2f 2a 0a   SQLITE_OK)../*.
6d60: 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20 77 68 65  ** Determine whe
6d70: 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 20 63 75  ther or not a cu
6d80: 72 73 6f 72 20 68 61 73 20 6d 6f 76 65 64 20 66  rsor has moved f
6d90: 72 6f 6d 20 74 68 65 20 70 6f 73 69 74 69 6f 6e  rom the position
6da0: 20 77 68 65 72 65 0a 2a 2a 20 69 74 20 77 61 73   where.** it was
6db0: 20 6c 61 73 74 20 70 6c 61 63 65 64 2c 20 6f 72   last placed, or
6dc0: 20 68 61 73 20 62 65 65 6e 20 69 6e 76 61 6c 69   has been invali
6dd0: 64 61 74 65 64 20 66 6f 72 20 61 6e 79 20 6f 74  dated for any ot
6de0: 68 65 72 20 72 65 61 73 6f 6e 2e 0a 2a 2a 20 43  her reason..** C
6df0: 75 72 73 6f 72 73 20 63 61 6e 20 6d 6f 76 65 20  ursors can move 
6e00: 77 68 65 6e 20 74 68 65 20 72 6f 77 20 74 68 65  when the row the
6e10: 79 20 61 72 65 20 70 6f 69 6e 74 69 6e 67 20 61  y are pointing a
6e20: 74 20 69 73 20 64 65 6c 65 74 65 64 20 6f 75 74  t is deleted out
6e30: 0a 2a 2a 20 66 72 6f 6d 20 75 6e 64 65 72 20 74  .** from under t
6e40: 68 65 6d 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65  hem, for example
6e50: 2e 20 20 43 75 72 73 6f 72 20 6d 69 67 68 74 20  .  Cursor might 
6e60: 61 6c 73 6f 20 6d 6f 76 65 20 69 66 20 61 20 62  also move if a b
6e70: 74 72 65 65 0a 2a 2a 20 69 73 20 72 65 62 61 6c  tree.** is rebal
6e80: 61 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c  anced..**.** Cal
6e90: 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e  ling this routin
6ea0: 65 20 77 69 74 68 20 61 20 4e 55 4c 4c 20 63 75  e with a NULL cu
6eb0: 72 73 6f 72 20 70 6f 69 6e 74 65 72 20 72 65 74  rsor pointer ret
6ec0: 75 72 6e 73 20 66 61 6c 73 65 2e 0a 2a 2a 0a 2a  urns false..**.*
6ed0: 2a 20 55 73 65 20 74 68 65 20 73 65 70 61 72 61  * Use the separa
6ee0: 74 65 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  te sqlite3BtreeC
6ef0: 75 72 73 6f 72 52 65 73 74 6f 72 65 28 29 20 72  ursorRestore() r
6f00: 6f 75 74 69 6e 65 20 74 6f 20 72 65 73 74 6f 72  outine to restor
6f10: 65 20 61 20 63 75 72 73 6f 72 0a 2a 2a 20 62 61  e a cursor.** ba
6f20: 63 6b 20 74 6f 20 77 68 65 72 65 20 69 74 20 6f  ck to where it o
6f30: 75 67 68 74 20 74 6f 20 62 65 20 69 66 20 74 68  ught to be if th
6f40: 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
6f50: 6e 73 20 74 72 75 65 2e 0a 2a 2f 0a 69 6e 74 20  ns true..*/.int 
6f60: 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
6f70: 6f 72 48 61 73 4d 6f 76 65 64 28 42 74 43 75 72  orHasMoved(BtCur
6f80: 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 72 65  sor *pCur){.  re
6f90: 74 75 72 6e 20 70 43 75 72 2d 3e 65 53 74 61 74  turn pCur->eStat
6fa0: 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b  e!=CURSOR_VALID;
6fb0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
6fc0: 6f 75 74 69 6e 65 20 72 65 73 74 6f 72 65 73 20  outine restores 
6fd0: 61 20 63 75 72 73 6f 72 20 62 61 63 6b 20 74 6f  a cursor back to
6fe0: 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 70 6f   its original po
6ff0: 73 69 74 69 6f 6e 20 61 66 74 65 72 20 69 74 0a  sition after it.
7000: 2a 2a 20 68 61 73 20 62 65 65 6e 20 6d 6f 76 65  ** has been move
7010: 64 20 62 79 20 73 6f 6d 65 20 6f 75 74 73 69 64  d by some outsid
7020: 65 20 61 63 74 69 76 69 74 79 20 28 73 75 63 68  e activity (such
7030: 20 61 73 20 61 20 62 74 72 65 65 20 72 65 62 61   as a btree reba
7040: 6c 61 6e 63 65 20 6f 72 0a 2a 2a 20 61 20 72 6f  lance or.** a ro
7050: 77 20 68 61 76 69 6e 67 20 62 65 65 6e 20 64 65  w having been de
7060: 6c 65 74 65 64 20 6f 75 74 20 66 72 6f 6d 20 75  leted out from u
7070: 6e 64 65 72 20 74 68 65 20 63 75 72 73 6f 72 29  nder the cursor)
7080: 2e 20 20 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 75 63  .  .**.** On suc
7090: 63 65 73 73 2c 20 74 68 65 20 2a 70 44 69 66 66  cess, the *pDiff
70a0: 65 72 65 6e 74 52 6f 77 20 70 61 72 61 6d 65 74  erentRow paramet
70b0: 65 72 20 69 73 20 66 61 6c 73 65 20 69 66 20 74  er is false if t
70c0: 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66  he cursor is lef
70d0: 74 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 20 61 74  t.** pointing at
70e0: 20 65 78 61 63 74 6c 79 20 74 68 65 20 73 61 6d   exactly the sam
70f0: 65 20 72 6f 77 2e 20 20 2a 70 44 69 66 66 65 72  e row.  *pDiffer
7100: 6e 74 52 6f 77 20 69 73 20 74 68 65 20 72 6f 77  ntRow is the row
7110: 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 77   the cursor.** w
7120: 61 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 68  as pointing to h
7130: 61 73 20 62 65 65 6e 20 64 65 6c 65 74 65 64 2c  as been deleted,
7140: 20 66 6f 72 63 69 6e 67 20 74 68 65 20 63 75 72   forcing the cur
7150: 73 6f 72 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  sor to point to 
7160: 73 6f 6d 65 0a 2a 2a 20 6e 65 61 72 62 79 20 72  some.** nearby r
7170: 6f 77 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ow..**.** This r
7180: 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 6f 6e  outine should on
7190: 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 66 6f 72  ly be called for
71a0: 20 61 20 63 75 72 73 6f 72 20 74 68 61 74 20 6a   a cursor that j
71b0: 75 73 74 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20  ust returned.** 
71c0: 54 52 55 45 20 66 72 6f 6d 20 73 71 6c 69 74 65  TRUE from sqlite
71d0: 33 42 74 72 65 65 43 75 72 73 6f 72 48 61 73 4d  3BtreeCursorHasM
71e0: 6f 76 65 64 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73  oved()..*/.int s
71f0: 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
7200: 72 52 65 73 74 6f 72 65 28 42 74 43 75 72 73 6f  rRestore(BtCurso
7210: 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 44  r *pCur, int *pD
7220: 69 66 66 65 72 65 6e 74 52 6f 77 29 7b 0a 20 20  ifferentRow){.  
7230: 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72  int rc;..  asser
7240: 74 28 20 70 43 75 72 21 3d 30 20 29 3b 0a 20 20  t( pCur!=0 );.  
7250: 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
7260: 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c  tate!=CURSOR_VAL
7270: 49 44 20 29 3b 0a 20 20 72 63 20 3d 20 72 65 73  ID );.  rc = res
7280: 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69  toreCursorPositi
7290: 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20  on(pCur);.  if( 
72a0: 72 63 20 29 7b 0a 20 20 20 20 2a 70 44 69 66 66  rc ){.    *pDiff
72b0: 65 72 65 6e 74 52 6f 77 20 3d 20 31 3b 0a 20 20  erentRow = 1;.  
72c0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
72d0: 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74  .  if( pCur->eSt
72e0: 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate!=CURSOR_VALI
72f0: 44 20 29 7b 0a 20 20 20 20 2a 70 44 69 66 66 65  D ){.    *pDiffe
7300: 72 65 6e 74 52 6f 77 20 3d 20 31 3b 0a 20 20 7d  rentRow = 1;.  }
7310: 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
7320: 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74  ( pCur->skipNext
7330: 3d 3d 30 20 29 3b 0a 20 20 20 20 2a 70 44 69 66  ==0 );.    *pDif
7340: 66 65 72 65 6e 74 52 6f 77 20 3d 20 30 3b 0a 20  ferentRow = 0;. 
7350: 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
7360: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 64 65 66  TE_OK;.}..#ifdef
7370: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43   SQLITE_ENABLE_C
7380: 55 52 53 4f 52 5f 48 49 4e 54 53 0a 2f 2a 0a 2a  URSOR_HINTS./*.*
7390: 2a 20 50 72 6f 76 69 64 65 20 68 69 6e 74 73 20  * Provide hints 
73a0: 74 6f 20 74 68 65 20 63 75 72 73 6f 72 2e 20 20  to the cursor.  
73b0: 54 68 65 20 70 61 72 74 69 63 75 6c 61 72 20 68  The particular h
73c0: 69 6e 74 20 67 69 76 65 6e 20 28 61 6e 64 20 74  int given (and t
73d0: 68 65 20 74 79 70 65 0a 2a 2a 20 61 6e 64 20 6e  he type.** and n
73e0: 75 6d 62 65 72 20 6f 66 20 74 68 65 20 76 61 72  umber of the var
73f0: 61 72 67 73 20 70 61 72 61 6d 65 74 65 72 73 29  args parameters)
7400: 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20 62   is determined b
7410: 79 20 74 68 65 20 65 48 69 6e 74 54 79 70 65 0a  y the eHintType.
7420: 2a 2a 20 70 61 72 61 6d 65 74 65 72 2e 20 20 53  ** parameter.  S
7430: 65 65 20 74 68 65 20 64 65 66 69 6e 69 74 69 6f  ee the definitio
7440: 6e 73 20 6f 66 20 74 68 65 20 42 54 52 45 45 5f  ns of the BTREE_
7450: 48 49 4e 54 5f 2a 20 6d 61 63 72 6f 73 20 66 6f  HINT_* macros fo
7460: 72 20 64 65 74 61 69 6c 73 2e 0a 2a 2f 0a 76 6f  r details..*/.vo
7470: 69 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  id sqlite3BtreeC
7480: 75 72 73 6f 72 48 69 6e 74 28 42 74 43 75 72 73  ursorHint(BtCurs
7490: 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 65 48  or *pCur, int eH
74a0: 69 6e 74 54 79 70 65 2c 20 2e 2e 2e 29 7b 0a 20  intType, ...){. 
74b0: 20 2f 2a 20 55 73 65 64 20 6f 6e 6c 79 20 62 79   /* Used only by
74c0: 20 73 79 73 74 65 6d 20 74 68 61 74 20 73 75 62   system that sub
74d0: 73 74 69 74 75 74 65 20 74 68 65 69 72 20 6f 77  stitute their ow
74e0: 6e 20 73 74 6f 72 61 67 65 20 65 6e 67 69 6e 65  n storage engine
74f0: 20 2a 2f 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a   */.}.#endif../*
7500: 0a 2a 2a 20 50 72 6f 76 69 64 65 20 66 6c 61 67  .** Provide flag
7510: 20 68 69 6e 74 73 20 74 6f 20 74 68 65 20 63 75   hints to the cu
7520: 72 73 6f 72 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  rsor..*/.void sq
7530: 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
7540: 48 69 6e 74 46 6c 61 67 73 28 42 74 43 75 72 73  HintFlags(BtCurs
7550: 6f 72 20 2a 70 43 75 72 2c 20 75 6e 73 69 67 6e  or *pCur, unsign
7560: 65 64 20 78 29 7b 0a 20 20 61 73 73 65 72 74 28  ed x){.  assert(
7570: 20 78 3d 3d 42 54 52 45 45 5f 53 45 45 4b 5f 45   x==BTREE_SEEK_E
7580: 51 20 7c 7c 20 78 3d 3d 42 54 52 45 45 5f 42 55  Q || x==BTREE_BU
7590: 4c 4b 4c 4f 41 44 20 7c 7c 20 78 3d 3d 30 20 29  LKLOAD || x==0 )
75a0: 3b 0a 20 20 70 43 75 72 2d 3e 68 69 6e 74 73 20  ;.  pCur->hints 
75b0: 3d 20 78 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66  = x;.}...#ifndef
75c0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
75d0: 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 47 69  OVACUUM./*.** Gi
75e0: 76 65 6e 20 61 20 70 61 67 65 20 6e 75 6d 62 65  ven a page numbe
75f0: 72 20 6f 66 20 61 20 72 65 67 75 6c 61 72 20 64  r of a regular d
7600: 61 74 61 62 61 73 65 20 70 61 67 65 2c 20 72 65  atabase page, re
7610: 74 75 72 6e 20 74 68 65 20 70 61 67 65 0a 2a 2a  turn the page.**
7620: 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20   number for the 
7630: 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65  pointer-map page
7640: 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74   that contains t
7650: 68 65 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65  he entry for the
7660: 0a 2a 2a 20 69 6e 70 75 74 20 70 61 67 65 20 6e  .** input page n
7670: 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  umber..**.** Ret
7680: 75 72 6e 20 30 20 28 6e 6f 74 20 61 20 76 61 6c  urn 0 (not a val
7690: 69 64 20 70 61 67 65 29 20 66 6f 72 20 70 67 6e  id page) for pgn
76a0: 6f 3d 3d 31 20 73 69 6e 63 65 20 74 68 65 72 65  o==1 since there
76b0: 20 69 73 0a 2a 2a 20 6e 6f 20 70 6f 69 6e 74 65   is.** no pointe
76c0: 72 20 6d 61 70 20 61 73 73 6f 63 69 61 74 65 64  r map associated
76d0: 20 77 69 74 68 20 70 61 67 65 20 31 2e 20 20 54   with page 1.  T
76e0: 68 65 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65  he integrity_che
76f0: 63 6b 20 6c 6f 67 69 63 0a 2a 2a 20 72 65 71 75  ck logic.** requ
7700: 69 72 65 73 20 74 68 61 74 20 70 74 72 6d 61 70  ires that ptrmap
7710: 50 61 67 65 6e 6f 28 2a 2c 31 29 21 3d 31 2e 0a  Pageno(*,1)!=1..
7720: 2a 2f 0a 73 74 61 74 69 63 20 50 67 6e 6f 20 70  */.static Pgno p
7730: 74 72 6d 61 70 50 61 67 65 6e 6f 28 42 74 53 68  trmapPageno(BtSh
7740: 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20  ared *pBt, Pgno 
7750: 70 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 6e 50 61  pgno){.  int nPa
7760: 67 65 73 50 65 72 4d 61 70 50 61 67 65 3b 0a 20  gesPerMapPage;. 
7770: 20 50 67 6e 6f 20 69 50 74 72 4d 61 70 2c 20 72   Pgno iPtrMap, r
7780: 65 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  et;.  assert( sq
7790: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
77a0: 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
77b0: 20 20 69 66 28 20 70 67 6e 6f 3c 32 20 29 20 72    if( pgno<2 ) r
77c0: 65 74 75 72 6e 20 30 3b 0a 20 20 6e 50 61 67 65  eturn 0;.  nPage
77d0: 73 50 65 72 4d 61 70 50 61 67 65 20 3d 20 28 70  sPerMapPage = (p
77e0: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 35  Bt->usableSize/5
77f0: 29 2b 31 3b 0a 20 20 69 50 74 72 4d 61 70 20 3d  )+1;.  iPtrMap =
7800: 20 28 70 67 6e 6f 2d 32 29 2f 6e 50 61 67 65 73   (pgno-2)/nPages
7810: 50 65 72 4d 61 70 50 61 67 65 3b 0a 20 20 72 65  PerMapPage;.  re
7820: 74 20 3d 20 28 69 50 74 72 4d 61 70 2a 6e 50 61  t = (iPtrMap*nPa
7830: 67 65 73 50 65 72 4d 61 70 50 61 67 65 29 20 2b  gesPerMapPage) +
7840: 20 32 3b 20 0a 20 20 69 66 28 20 72 65 74 3d 3d   2; .  if( ret==
7850: 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
7860: 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 72 65  E(pBt) ){.    re
7870: 74 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  t++;.  }.  retur
7880: 6e 20 72 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n ret;.}../*.** 
7890: 57 72 69 74 65 20 61 6e 20 65 6e 74 72 79 20 69  Write an entry i
78a0: 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 20  nto the pointer 
78b0: 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  map..**.** This 
78c0: 72 6f 75 74 69 6e 65 20 75 70 64 61 74 65 73 20  routine updates 
78d0: 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  the pointer map 
78e0: 65 6e 74 72 79 20 66 6f 72 20 70 61 67 65 20 6e  entry for page n
78f0: 75 6d 62 65 72 20 27 6b 65 79 27 0a 2a 2a 20 73  umber 'key'.** s
7900: 6f 20 74 68 61 74 20 69 74 20 6d 61 70 73 20 74  o that it maps t
7910: 6f 20 74 79 70 65 20 27 65 54 79 70 65 27 20 61  o type 'eType' a
7920: 6e 64 20 70 61 72 65 6e 74 20 70 61 67 65 20 6e  nd parent page n
7930: 75 6d 62 65 72 20 27 70 67 6e 6f 27 2e 0a 2a 2a  umber 'pgno'..**
7940: 0a 2a 2a 20 49 66 20 2a 70 52 43 20 69 73 20 69  .** If *pRC is i
7950: 6e 69 74 69 61 6c 6c 79 20 6e 6f 6e 2d 7a 65 72  nitially non-zer
7960: 6f 20 28 6e 6f 6e 2d 53 51 4c 49 54 45 5f 4f 4b  o (non-SQLITE_OK
7970: 29 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74  ) then this rout
7980: 69 6e 65 20 69 73 0a 2a 2a 20 61 20 6e 6f 2d 6f  ine is.** a no-o
7990: 70 2e 20 20 49 66 20 61 6e 20 65 72 72 6f 72 20  p.  If an error 
79a0: 6f 63 63 75 72 73 2c 20 74 68 65 20 61 70 70 72  occurs, the appr
79b0: 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20 63 6f  opriate error co
79c0: 64 65 20 69 73 20 77 72 69 74 74 65 6e 0a 2a 2a  de is written.**
79d0: 20 69 6e 74 6f 20 2a 70 52 43 2e 0a 2a 2f 0a 73   into *pRC..*/.s
79e0: 74 61 74 69 63 20 76 6f 69 64 20 70 74 72 6d 61  tatic void ptrma
79f0: 70 50 75 74 28 42 74 53 68 61 72 65 64 20 2a 70  pPut(BtShared *p
7a00: 42 74 2c 20 50 67 6e 6f 20 6b 65 79 2c 20 75 38  Bt, Pgno key, u8
7a10: 20 65 54 79 70 65 2c 20 50 67 6e 6f 20 70 61 72   eType, Pgno par
7a20: 65 6e 74 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a  ent, int *pRC){.
7a30: 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67    DbPage *pDbPag
7a40: 65 3b 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74  e;  /* The point
7a50: 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20  er map page */. 
7a60: 20 75 38 20 2a 70 50 74 72 6d 61 70 3b 20 20 20   u8 *pPtrmap;   
7a70: 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65     /* The pointe
7a80: 72 20 6d 61 70 20 64 61 74 61 20 2a 2f 0a 20 20  r map data */.  
7a90: 50 67 6e 6f 20 69 50 74 72 6d 61 70 3b 20 20 20  Pgno iPtrmap;   
7aa0: 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72    /* The pointer
7ab0: 20 6d 61 70 20 70 61 67 65 20 6e 75 6d 62 65 72   map page number
7ac0: 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 66 73 65 74   */.  int offset
7ad0: 3b 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65  ;       /* Offse
7ae0: 74 20 69 6e 20 70 6f 69 6e 74 65 72 20 6d 61 70  t in pointer map
7af0: 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 72   page */.  int r
7b00: 63 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  c;           /* 
7b10: 52 65 74 75 72 6e 20 63 6f 64 65 20 66 72 6f 6d  Return code from
7b20: 20 73 75 62 66 75 6e 63 74 69 6f 6e 73 20 2a 2f   subfunctions */
7b30: 0a 0a 20 20 69 66 28 20 2a 70 52 43 20 29 20 72  ..  if( *pRC ) r
7b40: 65 74 75 72 6e 3b 0a 0a 20 20 61 73 73 65 72 74  eturn;..  assert
7b50: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
7b60: 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
7b70: 20 29 3b 0a 20 20 2f 2a 20 54 68 65 20 6d 61 73   );.  /* The mas
7b80: 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 61 67 65  ter-journal page
7b90: 20 6e 75 6d 62 65 72 20 6d 75 73 74 20 6e 65 76   number must nev
7ba0: 65 72 20 62 65 20 75 73 65 64 20 61 73 20 61 20  er be used as a 
7bb0: 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65  pointer map page
7bc0: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 30 3d   */.  assert( 0=
7bd0: 3d 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70  =PTRMAP_ISPAGE(p
7be0: 42 74 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45  Bt, PENDING_BYTE
7bf0: 5f 50 41 47 45 28 70 42 74 29 29 20 29 3b 0a 0a  _PAGE(pBt)) );..
7c00: 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 61    assert( pBt->a
7c10: 75 74 6f 56 61 63 75 75 6d 20 29 3b 0a 20 20 69  utoVacuum );.  i
7c20: 66 28 20 6b 65 79 3d 3d 30 20 29 7b 0a 20 20 20  f( key==0 ){.   
7c30: 20 2a 70 52 43 20 3d 20 53 51 4c 49 54 45 5f 43   *pRC = SQLITE_C
7c40: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
7c50: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69   return;.  }.  i
7c60: 50 74 72 6d 61 70 20 3d 20 50 54 52 4d 41 50 5f  Ptrmap = PTRMAP_
7c70: 50 41 47 45 4e 4f 28 70 42 74 2c 20 6b 65 79 29  PAGENO(pBt, key)
7c80: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
7c90: 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e 70 50  PagerGet(pBt->pP
7ca0: 61 67 65 72 2c 20 69 50 74 72 6d 61 70 2c 20 26  ager, iPtrmap, &
7cb0: 70 44 62 50 61 67 65 2c 20 30 29 3b 0a 20 20 69  pDbPage, 0);.  i
7cc0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
7cd0: 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 72   ){.    *pRC = r
7ce0: 63 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  c;.    return;. 
7cf0: 20 7d 0a 20 20 6f 66 66 73 65 74 20 3d 20 50 54   }.  offset = PT
7d00: 52 4d 41 50 5f 50 54 52 4f 46 46 53 45 54 28 69  RMAP_PTROFFSET(i
7d10: 50 74 72 6d 61 70 2c 20 6b 65 79 29 3b 0a 20 20  Ptrmap, key);.  
7d20: 69 66 28 20 6f 66 66 73 65 74 3c 30 20 29 7b 0a  if( offset<0 ){.
7d30: 20 20 20 20 2a 70 52 43 20 3d 20 53 51 4c 49 54      *pRC = SQLIT
7d40: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
7d50: 20 20 20 20 67 6f 74 6f 20 70 74 72 6d 61 70 5f      goto ptrmap_
7d60: 65 78 69 74 3b 0a 20 20 7d 0a 20 20 61 73 73 65  exit;.  }.  asse
7d70: 72 74 28 20 6f 66 66 73 65 74 20 3c 3d 20 28 69  rt( offset <= (i
7d80: 6e 74 29 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  nt)pBt->usableSi
7d90: 7a 65 2d 35 20 29 3b 0a 20 20 70 50 74 72 6d 61  ze-5 );.  pPtrma
7da0: 70 20 3d 20 28 75 38 20 2a 29 73 71 6c 69 74 65  p = (u8 *)sqlite
7db0: 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70 44  3PagerGetData(pD
7dc0: 62 50 61 67 65 29 3b 0a 0a 20 20 69 66 28 20 65  bPage);..  if( e
7dd0: 54 79 70 65 21 3d 70 50 74 72 6d 61 70 5b 6f 66  Type!=pPtrmap[of
7de0: 66 73 65 74 5d 20 7c 7c 20 67 65 74 34 62 79 74  fset] || get4byt
7df0: 65 28 26 70 50 74 72 6d 61 70 5b 6f 66 66 73 65  e(&pPtrmap[offse
7e00: 74 2b 31 5d 29 21 3d 70 61 72 65 6e 74 20 29 7b  t+1])!=parent ){
7e10: 0a 20 20 20 20 54 52 41 43 45 28 28 22 50 54 52  .    TRACE(("PTR
7e20: 4d 41 50 5f 55 50 44 41 54 45 3a 20 25 64 2d 3e  MAP_UPDATE: %d->
7e30: 28 25 64 2c 25 64 29 5c 6e 22 2c 20 6b 65 79 2c  (%d,%d)\n", key,
7e40: 20 65 54 79 70 65 2c 20 70 61 72 65 6e 74 29 29   eType, parent))
7e50: 3b 0a 20 20 20 20 2a 70 52 43 3d 20 72 63 20 3d  ;.    *pRC= rc =
7e60: 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
7e70: 74 65 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20  te(pDbPage);.   
7e80: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
7e90: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 74 72  OK ){.      pPtr
7ea0: 6d 61 70 5b 6f 66 66 73 65 74 5d 20 3d 20 65 54  map[offset] = eT
7eb0: 79 70 65 3b 0a 20 20 20 20 20 20 70 75 74 34 62  ype;.      put4b
7ec0: 79 74 65 28 26 70 50 74 72 6d 61 70 5b 6f 66 66  yte(&pPtrmap[off
7ed0: 73 65 74 2b 31 5d 2c 20 70 61 72 65 6e 74 29 3b  set+1], parent);
7ee0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 70 74 72 6d  .    }.  }..ptrm
7ef0: 61 70 5f 65 78 69 74 3a 0a 20 20 73 71 6c 69 74  ap_exit:.  sqlit
7f00: 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 44 62  e3PagerUnref(pDb
7f10: 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Page);.}../*.** 
7f20: 52 65 61 64 20 61 6e 20 65 6e 74 72 79 20 66 72  Read an entry fr
7f30: 6f 6d 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d  om the pointer m
7f40: 61 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ap..**.** This r
7f50: 6f 75 74 69 6e 65 20 72 65 74 72 69 65 76 65 73  outine retrieves
7f60: 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   the pointer map
7f70: 20 65 6e 74 72 79 20 66 6f 72 20 70 61 67 65 20   entry for page 
7f80: 27 6b 65 79 27 2c 20 77 72 69 74 69 6e 67 0a 2a  'key', writing.*
7f90: 2a 20 74 68 65 20 74 79 70 65 20 61 6e 64 20 70  * the type and p
7fa0: 61 72 65 6e 74 20 70 61 67 65 20 6e 75 6d 62 65  arent page numbe
7fb0: 72 20 74 6f 20 2a 70 45 54 79 70 65 20 61 6e 64  r to *pEType and
7fc0: 20 2a 70 50 67 6e 6f 20 72 65 73 70 65 63 74 69   *pPgno respecti
7fd0: 76 65 6c 79 2e 0a 2a 2a 20 41 6e 20 65 72 72 6f  vely..** An erro
7fe0: 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
7ff0: 65 64 20 69 66 20 73 6f 6d 65 74 68 69 6e 67 20  ed if something 
8000: 67 6f 65 73 20 77 72 6f 6e 67 2c 20 6f 74 68 65  goes wrong, othe
8010: 72 77 69 73 65 20 53 51 4c 49 54 45 5f 4f 4b 2e  rwise SQLITE_OK.
8020: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
8030: 74 72 6d 61 70 47 65 74 28 42 74 53 68 61 72 65  trmapGet(BtShare
8040: 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6b 65 79  d *pBt, Pgno key
8050: 2c 20 75 38 20 2a 70 45 54 79 70 65 2c 20 50 67  , u8 *pEType, Pg
8060: 6e 6f 20 2a 70 50 67 6e 6f 29 7b 0a 20 20 44 62  no *pPgno){.  Db
8070: 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 20 20  Page *pDbPage;  
8080: 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20   /* The pointer 
8090: 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e  map page */.  in
80a0: 74 20 69 50 74 72 6d 61 70 3b 20 20 20 20 20 20  t iPtrmap;      
80b0: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20   /* Pointer map 
80c0: 70 61 67 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20  page index */.  
80d0: 75 38 20 2a 70 50 74 72 6d 61 70 3b 20 20 20 20  u8 *pPtrmap;    
80e0: 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61     /* Pointer ma
80f0: 70 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a 20  p page data */. 
8100: 20 69 6e 74 20 6f 66 66 73 65 74 3b 20 20 20 20   int offset;    
8110: 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66      /* Offset of
8120: 20 65 6e 74 72 79 20 69 6e 20 70 6f 69 6e 74 65   entry in pointe
8130: 72 20 6d 61 70 20 2a 2f 0a 20 20 69 6e 74 20 72  r map */.  int r
8140: 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  c;..  assert( sq
8150: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
8160: 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
8170: 0a 20 20 69 50 74 72 6d 61 70 20 3d 20 50 54 52  .  iPtrmap = PTR
8180: 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20  MAP_PAGENO(pBt, 
8190: 6b 65 79 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  key);.  rc = sql
81a0: 69 74 65 33 50 61 67 65 72 47 65 74 28 70 42 74  ite3PagerGet(pBt
81b0: 2d 3e 70 50 61 67 65 72 2c 20 69 50 74 72 6d 61  ->pPager, iPtrma
81c0: 70 2c 20 26 70 44 62 50 61 67 65 2c 20 30 29 3b  p, &pDbPage, 0);
81d0: 0a 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a  .  if( rc!=0 ){.
81e0: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
81f0: 20 7d 0a 20 20 70 50 74 72 6d 61 70 20 3d 20 28   }.  pPtrmap = (
8200: 75 38 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65  u8 *)sqlite3Page
8210: 72 47 65 74 44 61 74 61 28 70 44 62 50 61 67 65  rGetData(pDbPage
8220: 29 3b 0a 0a 20 20 6f 66 66 73 65 74 20 3d 20 50  );..  offset = P
8230: 54 52 4d 41 50 5f 50 54 52 4f 46 46 53 45 54 28  TRMAP_PTROFFSET(
8240: 69 50 74 72 6d 61 70 2c 20 6b 65 79 29 3b 0a 20  iPtrmap, key);. 
8250: 20 69 66 28 20 6f 66 66 73 65 74 3c 30 20 29 7b   if( offset<0 ){
8260: 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
8270: 72 55 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b  rUnref(pDbPage);
8280: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
8290: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
82a0: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6f  .  }.  assert( o
82b0: 66 66 73 65 74 20 3c 3d 20 28 69 6e 74 29 70 42  ffset <= (int)pB
82c0: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 35 20  t->usableSize-5 
82d0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 54  );.  assert( pET
82e0: 79 70 65 21 3d 30 20 29 3b 0a 20 20 2a 70 45 54  ype!=0 );.  *pET
82f0: 79 70 65 20 3d 20 70 50 74 72 6d 61 70 5b 6f 66  ype = pPtrmap[of
8300: 66 73 65 74 5d 3b 0a 20 20 69 66 28 20 70 50 67  fset];.  if( pPg
8310: 6e 6f 20 29 20 2a 70 50 67 6e 6f 20 3d 20 67 65  no ) *pPgno = ge
8320: 74 34 62 79 74 65 28 26 70 50 74 72 6d 61 70 5b  t4byte(&pPtrmap[
8330: 6f 66 66 73 65 74 2b 31 5d 29 3b 0a 0a 20 20 73  offset+1]);..  s
8340: 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
8350: 28 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28  (pDbPage);.  if(
8360: 20 2a 70 45 54 79 70 65 3c 31 20 7c 7c 20 2a 70   *pEType<1 || *p
8370: 45 54 79 70 65 3e 35 20 29 20 72 65 74 75 72 6e  EType>5 ) return
8380: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
8390: 42 4b 50 54 3b 0a 20 20 72 65 74 75 72 6e 20 53  BKPT;.  return S
83a0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6c  QLITE_OK;.}..#el
83b0: 73 65 20 2f 2a 20 69 66 20 64 65 66 69 6e 65 64  se /* if defined
83c0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
83d0: 4f 56 41 43 55 55 4d 20 2a 2f 0a 20 20 23 64 65  OVACUUM */.  #de
83e0: 66 69 6e 65 20 70 74 72 6d 61 70 50 75 74 28 77  fine ptrmapPut(w
83f0: 2c 78 2c 79 2c 7a 2c 72 63 29 0a 20 20 23 64 65  ,x,y,z,rc).  #de
8400: 66 69 6e 65 20 70 74 72 6d 61 70 47 65 74 28 77  fine ptrmapGet(w
8410: 2c 78 2c 79 2c 7a 29 20 53 51 4c 49 54 45 5f 4f  ,x,y,z) SQLITE_O
8420: 4b 0a 20 20 23 64 65 66 69 6e 65 20 70 74 72 6d  K.  #define ptrm
8430: 61 70 50 75 74 4f 76 66 6c 50 74 72 28 78 2c 20  apPutOvflPtr(x, 
8440: 79 2c 20 72 63 29 0a 23 65 6e 64 69 66 0a 0a 2f  y, rc).#endif../
8450: 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 62 74 72  *.** Given a btr
8460: 65 65 20 70 61 67 65 20 61 6e 64 20 61 20 63 65  ee page and a ce
8470: 6c 6c 20 69 6e 64 65 78 20 28 30 20 6d 65 61 6e  ll index (0 mean
8480: 73 20 74 68 65 20 66 69 72 73 74 20 63 65 6c 6c  s the first cell
8490: 20 6f 6e 0a 2a 2a 20 74 68 65 20 70 61 67 65 2c   on.** the page,
84a0: 20 31 20 6d 65 61 6e 73 20 74 68 65 20 73 65 63   1 means the sec
84b0: 6f 6e 64 20 63 65 6c 6c 2c 20 61 6e 64 20 73 6f  ond cell, and so
84c0: 20 66 6f 72 74 68 29 20 72 65 74 75 72 6e 20 61   forth) return a
84d0: 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74   pointer.** to t
84e0: 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 2e  he cell content.
84f0: 0a 2a 2a 0a 2a 2a 20 66 69 6e 64 43 65 6c 6c 50  .**.** findCellP
8500: 61 73 74 50 74 72 28 29 20 64 6f 65 73 20 74 68  astPtr() does th
8510: 65 20 73 61 6d 65 20 65 78 63 65 70 74 20 69 74  e same except it
8520: 20 73 6b 69 70 73 20 70 61 73 74 20 74 68 65 20   skips past the 
8530: 69 6e 69 74 69 61 6c 0a 2a 2a 20 34 2d 62 79 74  initial.** 4-byt
8540: 65 20 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 20  e child pointer 
8550: 66 6f 75 6e 64 20 6f 6e 20 69 6e 74 65 72 69 6f  found on interio
8560: 72 20 70 61 67 65 73 2c 20 69 66 20 74 68 65 72  r pages, if ther
8570: 65 20 69 73 20 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20  e is one..**.** 
8580: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 6f 72  This routine wor
8590: 6b 73 20 6f 6e 6c 79 20 66 6f 72 20 70 61 67 65  ks only for page
85a0: 73 20 74 68 61 74 20 64 6f 20 6e 6f 74 20 63 6f  s that do not co
85b0: 6e 74 61 69 6e 20 6f 76 65 72 66 6c 6f 77 20 63  ntain overflow c
85c0: 65 6c 6c 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  ells..*/.#define
85d0: 20 66 69 6e 64 43 65 6c 6c 28 50 2c 49 29 20 5c   findCell(P,I) \
85e0: 0a 20 20 28 28 50 29 2d 3e 61 44 61 74 61 20 2b  .  ((P)->aData +
85f0: 20 28 28 50 29 2d 3e 6d 61 73 6b 50 61 67 65 20   ((P)->maskPage 
8600: 26 20 67 65 74 32 62 79 74 65 41 6c 69 67 6e 65  & get2byteAligne
8610: 64 28 26 28 50 29 2d 3e 61 43 65 6c 6c 49 64 78  d(&(P)->aCellIdx
8620: 5b 32 2a 28 49 29 5d 29 29 29 0a 23 64 65 66 69  [2*(I)]))).#defi
8630: 6e 65 20 66 69 6e 64 43 65 6c 6c 50 61 73 74 50  ne findCellPastP
8640: 74 72 28 50 2c 49 29 20 5c 0a 20 20 28 28 50 29  tr(P,I) \.  ((P)
8650: 2d 3e 61 44 61 74 61 4f 66 73 74 20 2b 20 28 28  ->aDataOfst + ((
8660: 50 29 2d 3e 6d 61 73 6b 50 61 67 65 20 26 20 67  P)->maskPage & g
8670: 65 74 32 62 79 74 65 41 6c 69 67 6e 65 64 28 26  et2byteAligned(&
8680: 28 50 29 2d 3e 61 43 65 6c 6c 49 64 78 5b 32 2a  (P)->aCellIdx[2*
8690: 28 49 29 5d 29 29 29 0a 0a 0a 2f 2a 0a 2a 2a 20  (I)]))).../*.** 
86a0: 54 68 69 73 20 69 73 20 63 6f 6d 6d 6f 6e 20 74  This is common t
86b0: 61 69 6c 20 70 72 6f 63 65 73 73 69 6e 67 20 66  ail processing f
86c0: 6f 72 20 62 74 72 65 65 50 61 72 73 65 43 65 6c  or btreeParseCel
86d0: 6c 50 74 72 28 29 20 61 6e 64 0a 2a 2a 20 62 74  lPtr() and.** bt
86e0: 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 49  reeParseCellPtrI
86f0: 6e 64 65 78 28 29 20 66 6f 72 20 74 68 65 20 63  ndex() for the c
8700: 61 73 65 20 77 68 65 6e 20 74 68 65 20 63 65 6c  ase when the cel
8710: 6c 20 64 6f 65 73 20 6e 6f 74 20 66 69 74 20 65  l does not fit e
8720: 6e 74 69 72 65 6c 79 0a 2a 2a 20 6f 6e 20 61 20  ntirely.** on a 
8730: 73 69 6e 67 6c 65 20 42 2d 74 72 65 65 20 70 61  single B-tree pa
8740: 67 65 2e 20 20 4d 61 6b 65 20 6e 65 63 65 73 73  ge.  Make necess
8750: 61 72 79 20 61 64 6a 75 73 74 6d 65 6e 74 73 20  ary adjustments 
8760: 74 6f 20 74 68 65 20 43 65 6c 6c 49 6e 66 6f 0a  to the CellInfo.
8770: 2a 2a 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f  ** structure..*/
8780: 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e  .static SQLITE_N
8790: 4f 49 4e 4c 49 4e 45 20 76 6f 69 64 20 62 74 72  OINLINE void btr
87a0: 65 65 50 61 72 73 65 43 65 6c 6c 41 64 6a 75 73  eeParseCellAdjus
87b0: 74 53 69 7a 65 46 6f 72 4f 76 65 72 66 6c 6f 77  tSizeForOverflow
87c0: 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  (.  MemPage *pPa
87d0: 67 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50  ge,         /* P
87e0: 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  age containing t
87f0: 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 38 20  he cell */.  u8 
8800: 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20  *pCell,         
8810: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
8820: 74 6f 20 74 68 65 20 63 65 6c 6c 20 74 65 78 74  to the cell text
8830: 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20  . */.  CellInfo 
8840: 2a 70 49 6e 66 6f 20 20 20 20 20 20 20 20 20 2f  *pInfo         /
8850: 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69 73 20 73  * Fill in this s
8860: 74 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20  tructure */.){. 
8870: 20 2f 2a 20 49 66 20 74 68 65 20 70 61 79 6c 6f   /* If the paylo
8880: 61 64 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74 20  ad will not fit 
8890: 63 6f 6d 70 6c 65 74 65 6c 79 20 6f 6e 20 74 68  completely on th
88a0: 65 20 6c 6f 63 61 6c 20 70 61 67 65 2c 20 77 65  e local page, we
88b0: 20 68 61 76 65 0a 20 20 2a 2a 20 74 6f 20 64 65   have.  ** to de
88c0: 63 69 64 65 20 68 6f 77 20 6d 75 63 68 20 74 6f  cide how much to
88d0: 20 73 74 6f 72 65 20 6c 6f 63 61 6c 6c 79 20 61   store locally a
88e0: 6e 64 20 68 6f 77 20 6d 75 63 68 20 74 6f 20 73  nd how much to s
88f0: 70 69 6c 6c 20 6f 6e 74 6f 0a 20 20 2a 2a 20 6f  pill onto.  ** o
8900: 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 20  verflow pages.  
8910: 54 68 65 20 73 74 72 61 74 65 67 79 20 69 73 20  The strategy is 
8920: 74 6f 20 6d 69 6e 69 6d 69 7a 65 20 74 68 65 20  to minimize the 
8930: 61 6d 6f 75 6e 74 20 6f 66 20 75 6e 75 73 65 64  amount of unused
8940: 0a 20 20 2a 2a 20 73 70 61 63 65 20 6f 6e 20 6f  .  ** space on o
8950: 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 77 68  verflow pages wh
8960: 69 6c 65 20 6b 65 65 70 69 6e 67 20 74 68 65 20  ile keeping the 
8970: 61 6d 6f 75 6e 74 20 6f 66 20 6c 6f 63 61 6c 20  amount of local 
8980: 73 74 6f 72 61 67 65 0a 20 20 2a 2a 20 69 6e 20  storage.  ** in 
8990: 62 65 74 77 65 65 6e 20 6d 69 6e 4c 6f 63 61 6c  between minLocal
89a0: 20 61 6e 64 20 6d 61 78 4c 6f 63 61 6c 2e 0a 20   and maxLocal.. 
89b0: 20 2a 2a 0a 20 20 2a 2a 20 57 61 72 6e 69 6e 67   **.  ** Warning
89c0: 3a 20 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20  :  changing the 
89d0: 77 61 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 79  way overflow pay
89e0: 6c 6f 61 64 20 69 73 20 64 69 73 74 72 69 62 75  load is distribu
89f0: 74 65 64 20 69 6e 20 61 6e 79 0a 20 20 2a 2a 20  ted in any.  ** 
8a00: 77 61 79 20 77 69 6c 6c 20 72 65 73 75 6c 74 20  way will result 
8a10: 69 6e 20 61 6e 20 69 6e 63 6f 6d 70 61 74 69 62  in an incompatib
8a20: 6c 65 20 66 69 6c 65 20 66 6f 72 6d 61 74 2e 0a  le file format..
8a30: 20 20 2a 2f 0a 20 20 69 6e 74 20 6d 69 6e 4c 6f    */.  int minLo
8a40: 63 61 6c 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d  cal;  /* Minimum
8a50: 20 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f   amount of paylo
8a60: 61 64 20 68 65 6c 64 20 6c 6f 63 61 6c 6c 79 20  ad held locally 
8a70: 2a 2f 0a 20 20 69 6e 74 20 6d 61 78 4c 6f 63 61  */.  int maxLoca
8a80: 6c 3b 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 61  l;  /* Maximum a
8a90: 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64  mount of payload
8aa0: 20 68 65 6c 64 20 6c 6f 63 61 6c 6c 79 20 2a 2f   held locally */
8ab0: 0a 20 20 69 6e 74 20 73 75 72 70 6c 75 73 3b 20  .  int surplus; 
8ac0: 20 20 2f 2a 20 4f 76 65 72 66 6c 6f 77 20 70 61    /* Overflow pa
8ad0: 79 6c 6f 61 64 20 61 76 61 69 6c 61 62 6c 65 20  yload available 
8ae0: 66 6f 72 20 6c 6f 63 61 6c 20 73 74 6f 72 61 67  for local storag
8af0: 65 20 2a 2f 0a 0a 20 20 6d 69 6e 4c 6f 63 61 6c  e */..  minLocal
8b00: 20 3d 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63   = pPage->minLoc
8b10: 61 6c 3b 0a 20 20 6d 61 78 4c 6f 63 61 6c 20 3d  al;.  maxLocal =
8b20: 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c   pPage->maxLocal
8b30: 3b 0a 20 20 73 75 72 70 6c 75 73 20 3d 20 6d 69  ;.  surplus = mi
8b40: 6e 4c 6f 63 61 6c 20 2b 20 28 70 49 6e 66 6f 2d  nLocal + (pInfo-
8b50: 3e 6e 50 61 79 6c 6f 61 64 20 2d 20 6d 69 6e 4c  >nPayload - minL
8b60: 6f 63 61 6c 29 25 28 70 50 61 67 65 2d 3e 70 42  ocal)%(pPage->pB
8b70: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34 29  t->usableSize-4)
8b80: 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 73 75  ;.  testcase( su
8b90: 72 70 6c 75 73 3d 3d 6d 61 78 4c 6f 63 61 6c 20  rplus==maxLocal 
8ba0: 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 73  );.  testcase( s
8bb0: 75 72 70 6c 75 73 3d 3d 6d 61 78 4c 6f 63 61 6c  urplus==maxLocal
8bc0: 2b 31 20 29 3b 0a 20 20 69 66 28 20 73 75 72 70  +1 );.  if( surp
8bd0: 6c 75 73 20 3c 3d 20 6d 61 78 4c 6f 63 61 6c 20  lus <= maxLocal 
8be0: 29 7b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c  ){.    pInfo->nL
8bf0: 6f 63 61 6c 20 3d 20 28 75 31 36 29 73 75 72 70  ocal = (u16)surp
8c00: 6c 75 73 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  lus;.  }else{.  
8c10: 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20    pInfo->nLocal 
8c20: 3d 20 28 75 31 36 29 6d 69 6e 4c 6f 63 61 6c 3b  = (u16)minLocal;
8c30: 0a 20 20 7d 0a 20 20 70 49 6e 66 6f 2d 3e 6e 53  .  }.  pInfo->nS
8c40: 69 7a 65 20 3d 20 28 75 31 36 29 28 26 70 49 6e  ize = (u16)(&pIn
8c50: 66 6f 2d 3e 70 50 61 79 6c 6f 61 64 5b 70 49 6e  fo->pPayload[pIn
8c60: 66 6f 2d 3e 6e 4c 6f 63 61 6c 5d 20 2d 20 70 43  fo->nLocal] - pC
8c70: 65 6c 6c 29 20 2b 20 34 3b 0a 7d 0a 0a 2f 2a 0a  ell) + 4;.}../*.
8c80: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
8c90: 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 69 6d   routines are im
8ca0: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 6f 66  plementations of
8cb0: 20 74 68 65 20 4d 65 6d 50 61 67 65 2e 78 50 61   the MemPage.xPa
8cc0: 72 73 65 43 65 6c 6c 28 29 0a 2a 2a 20 6d 65 74  rseCell().** met
8cd0: 68 6f 64 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 73 65  hod..**.** Parse
8ce0: 20 61 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20   a cell content 
8cf0: 62 6c 6f 63 6b 20 61 6e 64 20 66 69 6c 6c 20 69  block and fill i
8d00: 6e 20 74 68 65 20 43 65 6c 6c 49 6e 66 6f 20 73  n the CellInfo s
8d10: 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20  tructure..**.** 
8d20: 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  btreeParseCellPt
8d30: 72 28 29 20 20 20 20 20 20 20 20 3d 3e 20 20 20  r()        =>   
8d40: 74 61 62 6c 65 20 62 74 72 65 65 20 6c 65 61 66  table btree leaf
8d50: 20 6e 6f 64 65 73 0a 2a 2a 20 62 74 72 65 65 50   nodes.** btreeP
8d60: 61 72 73 65 43 65 6c 6c 4e 6f 50 61 79 6c 6f 61  arseCellNoPayloa
8d70: 64 28 29 20 20 3d 3e 20 20 20 74 61 62 6c 65 20  d()  =>   table 
8d80: 62 74 72 65 65 20 69 6e 74 65 72 6e 61 6c 20 6e  btree internal n
8d90: 6f 64 65 73 0a 2a 2a 20 62 74 72 65 65 50 61 72  odes.** btreePar
8da0: 73 65 43 65 6c 6c 50 74 72 49 6e 64 65 78 28 29  seCellPtrIndex()
8db0: 20 20 20 3d 3e 20 20 20 69 6e 64 65 78 20 62 74     =>   index bt
8dc0: 72 65 65 20 6e 6f 64 65 73 0a 2a 2a 0a 2a 2a 20  ree nodes.**.** 
8dd0: 54 68 65 72 65 20 69 73 20 61 6c 73 6f 20 61 20  There is also a 
8de0: 77 72 61 70 70 65 72 20 66 75 6e 63 74 69 6f 6e  wrapper function
8df0: 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28   btreeParseCell(
8e00: 29 20 74 68 61 74 20 77 6f 72 6b 73 20 66 6f 72  ) that works for
8e10: 0a 2a 2a 20 61 6c 6c 20 4d 65 6d 50 61 67 65 20  .** all MemPage 
8e20: 74 79 70 65 73 20 61 6e 64 20 74 68 61 74 20 72  types and that r
8e30: 65 66 65 72 65 6e 63 65 73 20 74 68 65 20 63 65  eferences the ce
8e40: 6c 6c 20 62 79 20 69 6e 64 65 78 20 72 61 74 68  ll by index rath
8e50: 65 72 20 74 68 61 6e 0a 2a 2a 20 62 79 20 70 6f  er than.** by po
8e60: 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  inter..*/.static
8e70: 20 76 6f 69 64 20 62 74 72 65 65 50 61 72 73 65   void btreeParse
8e80: 43 65 6c 6c 50 74 72 4e 6f 50 61 79 6c 6f 61 64  CellPtrNoPayload
8e90: 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  (.  MemPage *pPa
8ea0: 67 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50  ge,         /* P
8eb0: 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  age containing t
8ec0: 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 38 20  he cell */.  u8 
8ed0: 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20  *pCell,         
8ee0: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
8ef0: 74 6f 20 74 68 65 20 63 65 6c 6c 20 74 65 78 74  to the cell text
8f00: 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20  . */.  CellInfo 
8f10: 2a 70 49 6e 66 6f 20 20 20 20 20 20 20 20 20 2f  *pInfo         /
8f20: 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69 73 20 73  * Fill in this s
8f30: 74 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20  tructure */.){. 
8f40: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
8f50: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
8f60: 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
8f70: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
8f80: 65 2d 3e 6c 65 61 66 3d 3d 30 20 29 3b 0a 20 20  e->leaf==0 );.  
8f90: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 63  assert( pPage->c
8fa0: 68 69 6c 64 50 74 72 53 69 7a 65 3d 3d 34 20 29  hildPtrSize==4 )
8fb0: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
8fc0: 5f 44 45 42 55 47 0a 20 20 55 4e 55 53 45 44 5f  _DEBUG.  UNUSED_
8fd0: 50 41 52 41 4d 45 54 45 52 28 70 50 61 67 65 29  PARAMETER(pPage)
8fe0: 3b 0a 23 65 6e 64 69 66 0a 20 20 70 49 6e 66 6f  ;.#endif.  pInfo
8ff0: 2d 3e 6e 53 69 7a 65 20 3d 20 34 20 2b 20 67 65  ->nSize = 4 + ge
9000: 74 56 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b 34  tVarint(&pCell[4
9010: 5d 2c 20 28 75 36 34 2a 29 26 70 49 6e 66 6f 2d  ], (u64*)&pInfo-
9020: 3e 6e 4b 65 79 29 3b 0a 20 20 70 49 6e 66 6f 2d  >nKey);.  pInfo-
9030: 3e 6e 50 61 79 6c 6f 61 64 20 3d 20 30 3b 0a 20  >nPayload = 0;. 
9040: 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d   pInfo->nLocal =
9050: 20 30 3b 0a 20 20 70 49 6e 66 6f 2d 3e 70 50 61   0;.  pInfo->pPa
9060: 79 6c 6f 61 64 20 3d 20 30 3b 0a 20 20 72 65 74  yload = 0;.  ret
9070: 75 72 6e 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f  urn;.}.static vo
9080: 69 64 20 62 74 72 65 65 50 61 72 73 65 43 65 6c  id btreeParseCel
9090: 6c 50 74 72 28 0a 20 20 4d 65 6d 50 61 67 65 20  lPtr(.  MemPage 
90a0: 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20  *pPage,         
90b0: 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69  /* Page containi
90c0: 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20  ng the cell */. 
90d0: 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20   u8 *pCell,     
90e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
90f0: 74 65 72 20 74 6f 20 74 68 65 20 63 65 6c 6c 20  ter to the cell 
9100: 74 65 78 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49  text. */.  CellI
9110: 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20 20  nfo *pInfo      
9120: 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68     /* Fill in th
9130: 69 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  is structure */.
9140: 29 7b 0a 20 20 75 38 20 2a 70 49 74 65 72 3b 20  ){.  u8 *pIter; 
9150: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9160: 46 6f 72 20 73 63 61 6e 6e 69 6e 67 20 74 68 72  For scanning thr
9170: 6f 75 67 68 20 70 43 65 6c 6c 20 2a 2f 0a 20 20  ough pCell */.  
9180: 75 33 32 20 6e 50 61 79 6c 6f 61 64 3b 20 20 20  u32 nPayload;   
9190: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
91a0: 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 63 65  r of bytes of ce
91b0: 6c 6c 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 20 20  ll payload */.  
91c0: 75 36 34 20 69 4b 65 79 3b 20 20 20 20 20 20 20  u64 iKey;       
91d0: 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61          /* Extra
91e0: 63 74 65 64 20 4b 65 79 20 76 61 6c 75 65 20 2a  cted Key value *
91f0: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  /..  assert( sql
9200: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
9210: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
9220: 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
9230: 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 30 20 7c  pPage->leaf==0 |
9240: 7c 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 31  | pPage->leaf==1
9250: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
9260: 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20  age->intKeyLeaf 
9270: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
9280: 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65  ge->childPtrSize
9290: 3d 3d 30 20 29 3b 0a 20 20 70 49 74 65 72 20 3d  ==0 );.  pIter =
92a0: 20 70 43 65 6c 6c 3b 0a 0a 20 20 2f 2a 20 54 68   pCell;..  /* Th
92b0: 65 20 6e 65 78 74 20 62 6c 6f 63 6b 20 6f 66 20  e next block of 
92c0: 63 6f 64 65 20 69 73 20 65 71 75 69 76 61 6c 65  code is equivale
92d0: 6e 74 20 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  nt to:.  **.  **
92e0: 20 20 20 20 20 70 49 74 65 72 20 2b 3d 20 67 65       pIter += ge
92f0: 74 56 61 72 69 6e 74 33 32 28 70 49 74 65 72 2c  tVarint32(pIter,
9300: 20 6e 50 61 79 6c 6f 61 64 29 3b 0a 20 20 2a 2a   nPayload);.  **
9310: 0a 20 20 2a 2a 20 54 68 65 20 63 6f 64 65 20 69  .  ** The code i
9320: 73 20 69 6e 6c 69 6e 65 64 20 74 6f 20 61 76 6f  s inlined to avo
9330: 69 64 20 61 20 66 75 6e 63 74 69 6f 6e 20 63 61  id a function ca
9340: 6c 6c 2e 0a 20 20 2a 2f 0a 20 20 6e 50 61 79 6c  ll..  */.  nPayl
9350: 6f 61 64 20 3d 20 2a 70 49 74 65 72 3b 0a 20 20  oad = *pIter;.  
9360: 69 66 28 20 6e 50 61 79 6c 6f 61 64 3e 3d 30 78  if( nPayload>=0x
9370: 38 30 20 29 7b 0a 20 20 20 20 75 38 20 2a 70 45  80 ){.    u8 *pE
9380: 6e 64 20 3d 20 26 70 49 74 65 72 5b 38 5d 3b 0a  nd = &pIter[8];.
9390: 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 26 3d 20      nPayload &= 
93a0: 30 78 37 66 3b 0a 20 20 20 20 64 6f 7b 0a 20 20  0x7f;.    do{.  
93b0: 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20 28      nPayload = (
93c0: 6e 50 61 79 6c 6f 61 64 3c 3c 37 29 20 7c 20 28  nPayload<<7) | (
93d0: 2a 2b 2b 70 49 74 65 72 20 26 20 30 78 37 66 29  *++pIter & 0x7f)
93e0: 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 28 2a  ;.    }while( (*
93f0: 70 49 74 65 72 29 3e 3d 30 78 38 30 20 26 26 20  pIter)>=0x80 && 
9400: 70 49 74 65 72 3c 70 45 6e 64 20 29 3b 0a 20 20  pIter<pEnd );.  
9410: 7d 0a 20 20 70 49 74 65 72 2b 2b 3b 0a 0a 20 20  }.  pIter++;..  
9420: 2f 2a 20 54 68 65 20 6e 65 78 74 20 62 6c 6f 63  /* The next bloc
9430: 6b 20 6f 66 20 63 6f 64 65 20 69 73 20 65 71 75  k of code is equ
9440: 69 76 61 6c 65 6e 74 20 74 6f 3a 0a 20 20 2a 2a  ivalent to:.  **
9450: 0a 20 20 2a 2a 20 20 20 20 20 70 49 74 65 72 20  .  **     pIter 
9460: 2b 3d 20 67 65 74 56 61 72 69 6e 74 28 70 49 74  += getVarint(pIt
9470: 65 72 2c 20 28 75 36 34 2a 29 26 70 49 6e 66 6f  er, (u64*)&pInfo
9480: 2d 3e 6e 4b 65 79 29 3b 0a 20 20 2a 2a 0a 20 20  ->nKey);.  **.  
9490: 2a 2a 20 54 68 65 20 63 6f 64 65 20 69 73 20 69  ** The code is i
94a0: 6e 6c 69 6e 65 64 20 74 6f 20 61 76 6f 69 64 20  nlined to avoid 
94b0: 61 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 2e  a function call.
94c0: 0a 20 20 2a 2f 0a 20 20 69 4b 65 79 20 3d 20 2a  .  */.  iKey = *
94d0: 70 49 74 65 72 3b 0a 20 20 69 66 28 20 69 4b 65  pIter;.  if( iKe
94e0: 79 3e 3d 30 78 38 30 20 29 7b 0a 20 20 20 20 75  y>=0x80 ){.    u
94f0: 38 20 2a 70 45 6e 64 20 3d 20 26 70 49 74 65 72  8 *pEnd = &pIter
9500: 5b 37 5d 3b 0a 20 20 20 20 69 4b 65 79 20 26 3d  [7];.    iKey &=
9510: 20 30 78 37 66 3b 0a 20 20 20 20 77 68 69 6c 65   0x7f;.    while
9520: 28 31 29 7b 0a 20 20 20 20 20 20 69 4b 65 79 20  (1){.      iKey 
9530: 3d 20 28 69 4b 65 79 3c 3c 37 29 20 7c 20 28 2a  = (iKey<<7) | (*
9540: 2b 2b 70 49 74 65 72 20 26 20 30 78 37 66 29 3b  ++pIter & 0x7f);
9550: 0a 20 20 20 20 20 20 69 66 28 20 28 2a 70 49 74  .      if( (*pIt
9560: 65 72 29 3c 30 78 38 30 20 29 20 62 72 65 61 6b  er)<0x80 ) break
9570: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65  ;.      if( pIte
9580: 72 3e 3d 70 45 6e 64 20 29 7b 0a 20 20 20 20 20  r>=pEnd ){.     
9590: 20 20 20 69 4b 65 79 20 3d 20 28 69 4b 65 79 3c     iKey = (iKey<
95a0: 3c 38 29 20 7c 20 2a 2b 2b 70 49 74 65 72 3b 0a  <8) | *++pIter;.
95b0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
95c0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
95d0: 0a 20 20 70 49 74 65 72 2b 2b 3b 0a 0a 20 20 70  .  pIter++;..  p
95e0: 49 6e 66 6f 2d 3e 6e 4b 65 79 20 3d 20 2a 28 69  Info->nKey = *(i
95f0: 36 34 2a 29 26 69 4b 65 79 3b 0a 20 20 70 49 6e  64*)&iKey;.  pIn
9600: 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20 3d 20 6e  fo->nPayload = n
9610: 50 61 79 6c 6f 61 64 3b 0a 20 20 70 49 6e 66 6f  Payload;.  pInfo
9620: 2d 3e 70 50 61 79 6c 6f 61 64 20 3d 20 70 49 74  ->pPayload = pIt
9630: 65 72 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20  er;.  testcase( 
9640: 6e 50 61 79 6c 6f 61 64 3d 3d 70 50 61 67 65 2d  nPayload==pPage-
9650: 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 74  >maxLocal );.  t
9660: 65 73 74 63 61 73 65 28 20 6e 50 61 79 6c 6f 61  estcase( nPayloa
9670: 64 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  d==pPage->maxLoc
9680: 61 6c 2b 31 20 29 3b 0a 20 20 69 66 28 20 6e 50  al+1 );.  if( nP
9690: 61 79 6c 6f 61 64 3c 3d 70 50 61 67 65 2d 3e 6d  ayload<=pPage->m
96a0: 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 2f  axLocal ){.    /
96b0: 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 28 65  * This is the (e
96c0: 61 73 79 29 20 63 6f 6d 6d 6f 6e 20 63 61 73 65  asy) common case
96d0: 20 77 68 65 72 65 20 74 68 65 20 65 6e 74 69 72   where the entir
96e0: 65 20 70 61 79 6c 6f 61 64 20 66 69 74 73 0a 20  e payload fits. 
96f0: 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6c 6f 63     ** on the loc
9700: 61 6c 20 70 61 67 65 2e 20 20 4e 6f 20 6f 76 65  al page.  No ove
9710: 72 66 6c 6f 77 20 69 73 20 72 65 71 75 69 72 65  rflow is require
9720: 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 49  d..    */.    pI
9730: 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 6e 50 61  nfo->nSize = nPa
9740: 79 6c 6f 61 64 20 2b 20 28 75 31 36 29 28 70 49  yload + (u16)(pI
9750: 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b 0a 20 20  ter - pCell);.  
9760: 20 20 69 66 28 20 70 49 6e 66 6f 2d 3e 6e 53 69    if( pInfo->nSi
9770: 7a 65 3c 34 20 29 20 70 49 6e 66 6f 2d 3e 6e 53  ze<4 ) pInfo->nS
9780: 69 7a 65 20 3d 20 34 3b 0a 20 20 20 20 70 49 6e  ize = 4;.    pIn
9790: 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75 31  fo->nLocal = (u1
97a0: 36 29 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 7d 65  6)nPayload;.  }e
97b0: 6c 73 65 7b 0a 20 20 20 20 62 74 72 65 65 50 61  lse{.    btreePa
97c0: 72 73 65 43 65 6c 6c 41 64 6a 75 73 74 53 69 7a  rseCellAdjustSiz
97d0: 65 46 6f 72 4f 76 65 72 66 6c 6f 77 28 70 50 61  eForOverflow(pPa
97e0: 67 65 2c 20 70 43 65 6c 6c 2c 20 70 49 6e 66 6f  ge, pCell, pInfo
97f0: 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20  );.  }.}.static 
9800: 76 6f 69 64 20 62 74 72 65 65 50 61 72 73 65 43  void btreeParseC
9810: 65 6c 6c 50 74 72 49 6e 64 65 78 28 0a 20 20 4d  ellPtrIndex(.  M
9820: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20  emPage *pPage,  
9830: 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63         /* Page c
9840: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63 65  ontaining the ce
9850: 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c  ll */.  u8 *pCel
9860: 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
9870: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68  /* Pointer to th
9880: 65 20 63 65 6c 6c 20 74 65 78 74 2e 20 2a 2f 0a  e cell text. */.
9890: 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66    CellInfo *pInf
98a0: 6f 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c  o         /* Fil
98b0: 6c 20 69 6e 20 74 68 69 73 20 73 74 72 75 63 74  l in this struct
98c0: 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a  ure */.){.  u8 *
98d0: 70 49 74 65 72 3b 20 20 20 20 20 20 20 20 20 20  pIter;          
98e0: 20 20 20 20 2f 2a 20 46 6f 72 20 73 63 61 6e 6e      /* For scann
98f0: 69 6e 67 20 74 68 72 6f 75 67 68 20 70 43 65 6c  ing through pCel
9900: 6c 20 2a 2f 0a 20 20 75 33 32 20 6e 50 61 79 6c  l */.  u32 nPayl
9910: 6f 61 64 3b 20 20 20 20 20 20 20 20 20 20 20 2f  oad;           /
9920: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
9930: 73 20 6f 66 20 63 65 6c 6c 20 70 61 79 6c 6f 61  s of cell payloa
9940: 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  d */..  assert( 
9950: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
9960: 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
9970: 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
9980: 74 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d  t( pPage->leaf==
9990: 30 20 7c 7c 20 70 50 61 67 65 2d 3e 6c 65 61 66  0 || pPage->leaf
99a0: 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==1 );.  assert(
99b0: 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65   pPage->intKeyLe
99c0: 61 66 3d 3d 30 20 29 3b 0a 20 20 70 49 74 65 72  af==0 );.  pIter
99d0: 20 3d 20 70 43 65 6c 6c 20 2b 20 70 50 61 67 65   = pCell + pPage
99e0: 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a  ->childPtrSize;.
99f0: 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20 2a 70 49    nPayload = *pI
9a00: 74 65 72 3b 0a 20 20 69 66 28 20 6e 50 61 79 6c  ter;.  if( nPayl
9a10: 6f 61 64 3e 3d 30 78 38 30 20 29 7b 0a 20 20 20  oad>=0x80 ){.   
9a20: 20 75 38 20 2a 70 45 6e 64 20 3d 20 26 70 49 74   u8 *pEnd = &pIt
9a30: 65 72 5b 38 5d 3b 0a 20 20 20 20 6e 50 61 79 6c  er[8];.    nPayl
9a40: 6f 61 64 20 26 3d 20 30 78 37 66 3b 0a 20 20 20  oad &= 0x7f;.   
9a50: 20 64 6f 7b 0a 20 20 20 20 20 20 6e 50 61 79 6c   do{.      nPayl
9a60: 6f 61 64 20 3d 20 28 6e 50 61 79 6c 6f 61 64 3c  oad = (nPayload<
9a70: 3c 37 29 20 7c 20 28 2a 2b 2b 70 49 74 65 72 20  <7) | (*++pIter 
9a80: 26 20 30 78 37 66 29 3b 0a 20 20 20 20 7d 77 68  & 0x7f);.    }wh
9a90: 69 6c 65 28 20 2a 28 70 49 74 65 72 29 3e 3d 30  ile( *(pIter)>=0
9aa0: 78 38 30 20 26 26 20 70 49 74 65 72 3c 70 45 6e  x80 && pIter<pEn
9ab0: 64 20 29 3b 0a 20 20 7d 0a 20 20 70 49 74 65 72  d );.  }.  pIter
9ac0: 2b 2b 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e 4b 65  ++;.  pInfo->nKe
9ad0: 79 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20  y = nPayload;.  
9ae0: 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20  pInfo->nPayload 
9af0: 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 70 49  = nPayload;.  pI
9b00: 6e 66 6f 2d 3e 70 50 61 79 6c 6f 61 64 20 3d 20  nfo->pPayload = 
9b10: 70 49 74 65 72 3b 0a 20 20 74 65 73 74 63 61 73  pIter;.  testcas
9b20: 65 28 20 6e 50 61 79 6c 6f 61 64 3d 3d 70 50 61  e( nPayload==pPa
9b30: 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a  ge->maxLocal );.
9b40: 20 20 74 65 73 74 63 61 73 65 28 20 6e 50 61 79    testcase( nPay
9b50: 6c 6f 61 64 3d 3d 70 50 61 67 65 2d 3e 6d 61 78  load==pPage->max
9b60: 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 69 66 28  Local+1 );.  if(
9b70: 20 6e 50 61 79 6c 6f 61 64 3c 3d 70 50 61 67 65   nPayload<=pPage
9b80: 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20  ->maxLocal ){.  
9b90: 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74 68 65    /* This is the
9ba0: 20 28 65 61 73 79 29 20 63 6f 6d 6d 6f 6e 20 63   (easy) common c
9bb0: 61 73 65 20 77 68 65 72 65 20 74 68 65 20 65 6e  ase where the en
9bc0: 74 69 72 65 20 70 61 79 6c 6f 61 64 20 66 69 74  tire payload fit
9bd0: 73 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20  s.    ** on the 
9be0: 6c 6f 63 61 6c 20 70 61 67 65 2e 20 20 4e 6f 20  local page.  No 
9bf0: 6f 76 65 72 66 6c 6f 77 20 69 73 20 72 65 71 75  overflow is requ
9c00: 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ired..    */.   
9c10: 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20   pInfo->nSize = 
9c20: 6e 50 61 79 6c 6f 61 64 20 2b 20 28 75 31 36 29  nPayload + (u16)
9c30: 28 70 49 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b  (pIter - pCell);
9c40: 0a 20 20 20 20 69 66 28 20 70 49 6e 66 6f 2d 3e  .    if( pInfo->
9c50: 6e 53 69 7a 65 3c 34 20 29 20 70 49 6e 66 6f 2d  nSize<4 ) pInfo-
9c60: 3e 6e 53 69 7a 65 20 3d 20 34 3b 0a 20 20 20 20  >nSize = 4;.    
9c70: 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20  pInfo->nLocal = 
9c80: 28 75 31 36 29 6e 50 61 79 6c 6f 61 64 3b 0a 20  (u16)nPayload;. 
9c90: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 62 74 72 65   }else{.    btre
9ca0: 65 50 61 72 73 65 43 65 6c 6c 41 64 6a 75 73 74  eParseCellAdjust
9cb0: 53 69 7a 65 46 6f 72 4f 76 65 72 66 6c 6f 77 28  SizeForOverflow(
9cc0: 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 70 49  pPage, pCell, pI
9cd0: 6e 66 6f 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74  nfo);.  }.}.stat
9ce0: 69 63 20 76 6f 69 64 20 62 74 72 65 65 50 61 72  ic void btreePar
9cf0: 73 65 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67  seCell(.  MemPag
9d00: 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20  e *pPage,       
9d10: 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69    /* Page contai
9d20: 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f  ning the cell */
9d30: 0a 20 20 69 6e 74 20 69 43 65 6c 6c 2c 20 20 20  .  int iCell,   
9d40: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
9d50: 65 20 63 65 6c 6c 20 69 6e 64 65 78 2e 20 20 46  e cell index.  F
9d60: 69 72 73 74 20 63 65 6c 6c 20 69 73 20 30 20 2a  irst cell is 0 *
9d70: 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49  /.  CellInfo *pI
9d80: 6e 66 6f 20 20 20 20 20 20 20 20 20 2f 2a 20 46  nfo         /* F
9d90: 69 6c 6c 20 69 6e 20 74 68 69 73 20 73 74 72 75  ill in this stru
9da0: 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 70 50  cture */.){.  pP
9db0: 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28  age->xParseCell(
9dc0: 70 50 61 67 65 2c 20 66 69 6e 64 43 65 6c 6c 28  pPage, findCell(
9dd0: 70 50 61 67 65 2c 20 69 43 65 6c 6c 29 2c 20 70  pPage, iCell), p
9de0: 49 6e 66 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Info);.}../*.** 
9df0: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f  The following ro
9e00: 75 74 69 6e 65 73 20 61 72 65 20 69 6d 70 6c 65  utines are imple
9e10: 6d 65 6e 74 61 74 69 6f 6e 73 20 6f 66 20 74 68  mentations of th
9e20: 65 20 4d 65 6d 50 61 67 65 2e 78 43 65 6c 6c 53  e MemPage.xCellS
9e30: 69 7a 65 0a 2a 2a 20 6d 65 74 68 6f 64 2e 0a 2a  ize.** method..*
9e40: 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68 65  *.** Compute the
9e50: 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   total number of
9e60: 20 62 79 74 65 73 20 74 68 61 74 20 61 20 43 65   bytes that a Ce
9e70: 6c 6c 20 6e 65 65 64 73 20 69 6e 20 74 68 65 20  ll needs in the 
9e80: 63 65 6c 6c 0a 2a 2a 20 64 61 74 61 20 61 72 65  cell.** data are
9e90: 61 20 6f 66 20 74 68 65 20 62 74 72 65 65 2d 70  a of the btree-p
9ea0: 61 67 65 2e 20 20 54 68 65 20 72 65 74 75 72 6e  age.  The return
9eb0: 20 6e 75 6d 62 65 72 20 69 6e 63 6c 75 64 65 73   number includes
9ec0: 20 74 68 65 20 63 65 6c 6c 0a 2a 2a 20 64 61 74   the cell.** dat
9ed0: 61 20 68 65 61 64 65 72 20 61 6e 64 20 74 68 65  a header and the
9ee0: 20 6c 6f 63 61 6c 20 70 61 79 6c 6f 61 64 2c 20   local payload, 
9ef0: 62 75 74 20 6e 6f 74 20 61 6e 79 20 6f 76 65 72  but not any over
9f00: 66 6c 6f 77 20 70 61 67 65 20 6f 72 0a 2a 2a 20  flow page or.** 
9f10: 74 68 65 20 73 70 61 63 65 20 75 73 65 64 20 62  the space used b
9f20: 79 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74  y the cell point
9f30: 65 72 2e 0a 2a 2a 0a 2a 2a 20 63 65 6c 6c 53 69  er..**.** cellSi
9f40: 7a 65 50 74 72 4e 6f 50 61 79 6c 6f 61 64 28 29  zePtrNoPayload()
9f50: 20 20 20 20 3d 3e 20 20 20 74 61 62 6c 65 20 69      =>   table i
9f60: 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 73 0a 2a 2a  nternal nodes.**
9f70: 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 29 20 20   cellSizePtr()  
9f80: 20 20 20 20 20 20 20 20 20 20 20 3d 3e 20 20 20             =>   
9f90: 61 6c 6c 20 69 6e 64 65 78 20 6e 6f 64 65 73 20  all index nodes 
9fa0: 26 20 74 61 62 6c 65 20 6c 65 61 66 20 6e 6f 64  & table leaf nod
9fb0: 65 73 0a 2a 2f 0a 73 74 61 74 69 63 20 75 31 36  es.*/.static u16
9fc0: 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 4d 65 6d   cellSizePtr(Mem
9fd0: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75 38 20  Page *pPage, u8 
9fe0: 2a 70 43 65 6c 6c 29 7b 0a 20 20 75 38 20 2a 70  *pCell){.  u8 *p
9ff0: 49 74 65 72 20 3d 20 70 43 65 6c 6c 20 2b 20 70  Iter = pCell + p
a000: 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69  Page->childPtrSi
a010: 7a 65 3b 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69  ze; /* For loopi
a020: 6e 67 20 6f 76 65 72 20 62 79 74 65 73 20 6f 66  ng over bytes of
a030: 20 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a   pCell */.  u8 *
a040: 70 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20 20  pEnd;           
a050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a060: 20 20 20 20 20 2f 2a 20 45 6e 64 20 6d 61 72 6b       /* End mark
a070: 20 66 6f 72 20 61 20 76 61 72 69 6e 74 20 2a 2f   for a varint */
a080: 0a 20 20 75 33 32 20 6e 53 69 7a 65 3b 20 20 20  .  u32 nSize;   
a090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a0a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
a0b0: 69 7a 65 20 76 61 6c 75 65 20 74 6f 20 72 65 74  ize value to ret
a0c0: 75 72 6e 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53  urn */..#ifdef S
a0d0: 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a  QLITE_DEBUG.  /*
a0e0: 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   The value retur
a0f0: 6e 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63  ned by this func
a100: 74 69 6f 6e 20 73 68 6f 75 6c 64 20 61 6c 77 61  tion should alwa
a110: 79 73 20 62 65 20 74 68 65 20 73 61 6d 65 20 61  ys be the same a
a120: 73 0a 20 20 2a 2a 20 74 68 65 20 28 43 65 6c 6c  s.  ** the (Cell
a130: 49 6e 66 6f 2e 6e 53 69 7a 65 29 20 76 61 6c 75  Info.nSize) valu
a140: 65 20 66 6f 75 6e 64 20 62 79 20 64 6f 69 6e 67  e found by doing
a150: 20 61 20 66 75 6c 6c 20 70 61 72 73 65 20 6f 66   a full parse of
a160: 20 74 68 65 0a 20 20 2a 2a 20 63 65 6c 6c 2e 20   the.  ** cell. 
a170: 49 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20  If SQLITE_DEBUG 
a180: 69 73 20 64 65 66 69 6e 65 64 2c 20 61 6e 20 61  is defined, an a
a190: 73 73 65 72 74 28 29 20 61 74 20 74 68 65 20 62  ssert() at the b
a1a0: 6f 74 74 6f 6d 20 6f 66 0a 20 20 2a 2a 20 74 68  ottom of.  ** th
a1b0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 76 65 72 69  is function veri
a1c0: 66 69 65 73 20 74 68 61 74 20 74 68 69 73 20 69  fies that this i
a1d0: 6e 76 61 72 69 61 6e 74 20 69 73 20 6e 6f 74 20  nvariant is not 
a1e0: 76 69 6f 6c 61 74 65 64 2e 20 2a 2f 0a 20 20 43  violated. */.  C
a1f0: 65 6c 6c 49 6e 66 6f 20 64 65 62 75 67 69 6e 66  ellInfo debuginf
a200: 6f 3b 0a 20 20 70 50 61 67 65 2d 3e 78 50 61 72  o;.  pPage->xPar
a210: 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43  seCell(pPage, pC
a220: 65 6c 6c 2c 20 26 64 65 62 75 67 69 6e 66 6f 29  ell, &debuginfo)
a230: 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 6e 53 69 7a  ;.#endif..  nSiz
a240: 65 20 3d 20 2a 70 49 74 65 72 3b 0a 20 20 69 66  e = *pIter;.  if
a250: 28 20 6e 53 69 7a 65 3e 3d 30 78 38 30 20 29 7b  ( nSize>=0x80 ){
a260: 0a 20 20 20 20 70 45 6e 64 20 3d 20 26 70 49 74  .    pEnd = &pIt
a270: 65 72 5b 38 5d 3b 0a 20 20 20 20 6e 53 69 7a 65  er[8];.    nSize
a280: 20 26 3d 20 30 78 37 66 3b 0a 20 20 20 20 64 6f   &= 0x7f;.    do
a290: 7b 0a 20 20 20 20 20 20 6e 53 69 7a 65 20 3d 20  {.      nSize = 
a2a0: 28 6e 53 69 7a 65 3c 3c 37 29 20 7c 20 28 2a 2b  (nSize<<7) | (*+
a2b0: 2b 70 49 74 65 72 20 26 20 30 78 37 66 29 3b 0a  +pIter & 0x7f);.
a2c0: 20 20 20 20 7d 77 68 69 6c 65 28 20 2a 28 70 49      }while( *(pI
a2d0: 74 65 72 29 3e 3d 30 78 38 30 20 26 26 20 70 49  ter)>=0x80 && pI
a2e0: 74 65 72 3c 70 45 6e 64 20 29 3b 0a 20 20 7d 0a  ter<pEnd );.  }.
a2f0: 20 20 70 49 74 65 72 2b 2b 3b 0a 20 20 69 66 28    pIter++;.  if(
a300: 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29   pPage->intKey )
a310: 7b 0a 20 20 20 20 2f 2a 20 70 49 74 65 72 20 6e  {.    /* pIter n
a320: 6f 77 20 70 6f 69 6e 74 73 20 61 74 20 74 68 65  ow points at the
a330: 20 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72 20   64-bit integer 
a340: 6b 65 79 20 76 61 6c 75 65 2c 20 61 20 76 61 72  key value, a var
a350: 69 61 62 6c 65 20 6c 65 6e 67 74 68 20 0a 20 20  iable length .  
a360: 20 20 2a 2a 20 69 6e 74 65 67 65 72 2e 20 54 68    ** integer. Th
a370: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63  e following bloc
a380: 6b 20 6d 6f 76 65 73 20 70 49 74 65 72 20 74 6f  k moves pIter to
a390: 20 70 6f 69 6e 74 20 61 74 20 74 68 65 20 66 69   point at the fi
a3a0: 72 73 74 20 62 79 74 65 0a 20 20 20 20 2a 2a 20  rst byte.    ** 
a3b0: 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20  past the end of 
a3c0: 74 68 65 20 6b 65 79 20 76 61 6c 75 65 2e 20 2a  the key value. *
a3d0: 2f 0a 20 20 20 20 70 45 6e 64 20 3d 20 26 70 49  /.    pEnd = &pI
a3e0: 74 65 72 5b 39 5d 3b 0a 20 20 20 20 77 68 69 6c  ter[9];.    whil
a3f0: 65 28 20 28 2a 70 49 74 65 72 2b 2b 29 26 30 78  e( (*pIter++)&0x
a400: 38 30 20 26 26 20 70 49 74 65 72 3c 70 45 6e 64  80 && pIter<pEnd
a410: 20 29 3b 0a 20 20 7d 0a 20 20 74 65 73 74 63 61   );.  }.  testca
a420: 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65  se( nSize==pPage
a430: 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20  ->maxLocal );.  
a440: 74 65 73 74 63 61 73 65 28 20 6e 53 69 7a 65 3d  testcase( nSize=
a450: 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c  =pPage->maxLocal
a460: 2b 31 20 29 3b 0a 20 20 69 66 28 20 6e 53 69 7a  +1 );.  if( nSiz
a470: 65 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  e<=pPage->maxLoc
a480: 61 6c 20 29 7b 0a 20 20 20 20 6e 53 69 7a 65 20  al ){.    nSize 
a490: 2b 3d 20 28 75 33 32 29 28 70 49 74 65 72 20 2d  += (u32)(pIter -
a4a0: 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20 69 66 28   pCell);.    if(
a4b0: 20 6e 53 69 7a 65 3c 34 20 29 20 6e 53 69 7a 65   nSize<4 ) nSize
a4c0: 20 3d 20 34 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 4;.  }else{. 
a4d0: 20 20 20 69 6e 74 20 6d 69 6e 4c 6f 63 61 6c 20     int minLocal 
a4e0: 3d 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61  = pPage->minLoca
a4f0: 6c 3b 0a 20 20 20 20 6e 53 69 7a 65 20 3d 20 6d  l;.    nSize = m
a500: 69 6e 4c 6f 63 61 6c 20 2b 20 28 6e 53 69 7a 65  inLocal + (nSize
a510: 20 2d 20 6d 69 6e 4c 6f 63 61 6c 29 20 25 20 28   - minLocal) % (
a520: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
a530: 6c 65 53 69 7a 65 20 2d 20 34 29 3b 0a 20 20 20  leSize - 4);.   
a540: 20 74 65 73 74 63 61 73 65 28 20 6e 53 69 7a 65   testcase( nSize
a550: 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  ==pPage->maxLoca
a560: 6c 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  l );.    testcas
a570: 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65 2d  e( nSize==pPage-
a580: 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20  >maxLocal+1 );. 
a590: 20 20 20 69 66 28 20 6e 53 69 7a 65 3e 70 50 61     if( nSize>pPa
a5a0: 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a  ge->maxLocal ){.
a5b0: 20 20 20 20 20 20 6e 53 69 7a 65 20 3d 20 6d 69        nSize = mi
a5c0: 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 7d 0a 20 20  nLocal;.    }.  
a5d0: 20 20 6e 53 69 7a 65 20 2b 3d 20 34 20 2b 20 28    nSize += 4 + (
a5e0: 75 31 36 29 28 70 49 74 65 72 20 2d 20 70 43 65  u16)(pIter - pCe
a5f0: 6c 6c 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  ll);.  }.  asser
a600: 74 28 20 6e 53 69 7a 65 3d 3d 64 65 62 75 67 69  t( nSize==debugi
a610: 6e 66 6f 2e 6e 53 69 7a 65 20 7c 7c 20 43 4f 52  nfo.nSize || COR
a620: 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 72 65 74  RUPT_DB );.  ret
a630: 75 72 6e 20 28 75 31 36 29 6e 53 69 7a 65 3b 0a  urn (u16)nSize;.
a640: 7d 0a 73 74 61 74 69 63 20 75 31 36 20 63 65 6c  }.static u16 cel
a650: 6c 53 69 7a 65 50 74 72 4e 6f 50 61 79 6c 6f 61  lSizePtrNoPayloa
a660: 64 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  d(MemPage *pPage
a670: 2c 20 75 38 20 2a 70 43 65 6c 6c 29 7b 0a 20 20  , u8 *pCell){.  
a680: 75 38 20 2a 70 49 74 65 72 20 3d 20 70 43 65 6c  u8 *pIter = pCel
a690: 6c 20 2b 20 34 3b 20 2f 2a 20 46 6f 72 20 6c 6f  l + 4; /* For lo
a6a0: 6f 70 69 6e 67 20 6f 76 65 72 20 62 79 74 65 73  oping over bytes
a6b0: 20 6f 66 20 70 43 65 6c 6c 20 2a 2f 0a 20 20 75   of pCell */.  u
a6c0: 38 20 2a 70 45 6e 64 3b 20 20 20 20 20 20 20 20  8 *pEnd;        
a6d0: 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6d 61 72        /* End mar
a6e0: 6b 20 66 6f 72 20 61 20 76 61 72 69 6e 74 20 2a  k for a varint *
a6f0: 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  /..#ifdef SQLITE
a700: 5f 44 45 42 55 47 0a 20 20 2f 2a 20 54 68 65 20  _DEBUG.  /* The 
a710: 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62  value returned b
a720: 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  y this function 
a730: 73 68 6f 75 6c 64 20 61 6c 77 61 79 73 20 62 65  should always be
a740: 20 74 68 65 20 73 61 6d 65 20 61 73 0a 20 20 2a   the same as.  *
a750: 2a 20 74 68 65 20 28 43 65 6c 6c 49 6e 66 6f 2e  * the (CellInfo.
a760: 6e 53 69 7a 65 29 20 76 61 6c 75 65 20 66 6f 75  nSize) value fou
a770: 6e 64 20 62 79 20 64 6f 69 6e 67 20 61 20 66 75  nd by doing a fu
a780: 6c 6c 20 70 61 72 73 65 20 6f 66 20 74 68 65 0a  ll parse of the.
a790: 20 20 2a 2a 20 63 65 6c 6c 2e 20 49 66 20 53 51    ** cell. If SQ
a7a0: 4c 49 54 45 5f 44 45 42 55 47 20 69 73 20 64 65  LITE_DEBUG is de
a7b0: 66 69 6e 65 64 2c 20 61 6e 20 61 73 73 65 72 74  fined, an assert
a7c0: 28 29 20 61 74 20 74 68 65 20 62 6f 74 74 6f 6d  () at the bottom
a7d0: 20 6f 66 0a 20 20 2a 2a 20 74 68 69 73 20 66 75   of.  ** this fu
a7e0: 6e 63 74 69 6f 6e 20 76 65 72 69 66 69 65 73 20  nction verifies 
a7f0: 74 68 61 74 20 74 68 69 73 20 69 6e 76 61 72 69  that this invari
a800: 61 6e 74 20 69 73 20 6e 6f 74 20 76 69 6f 6c 61  ant is not viola
a810: 74 65 64 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e  ted. */.  CellIn
a820: 66 6f 20 64 65 62 75 67 69 6e 66 6f 3b 0a 20 20  fo debuginfo;.  
a830: 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c  pPage->xParseCel
a840: 6c 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20  l(pPage, pCell, 
a850: 26 64 65 62 75 67 69 6e 66 6f 29 3b 0a 23 65 6c  &debuginfo);.#el
a860: 73 65 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  se.  UNUSED_PARA
a870: 4d 45 54 45 52 28 70 50 61 67 65 29 3b 0a 23 65  METER(pPage);.#e
a880: 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20  ndif..  assert( 
a890: 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53  pPage->childPtrS
a8a0: 69 7a 65 3d 3d 34 20 29 3b 0a 20 20 70 45 6e 64  ize==4 );.  pEnd
a8b0: 20 3d 20 70 49 74 65 72 20 2b 20 39 3b 0a 20 20   = pIter + 9;.  
a8c0: 77 68 69 6c 65 28 20 28 2a 70 49 74 65 72 2b 2b  while( (*pIter++
a8d0: 29 26 30 78 38 30 20 26 26 20 70 49 74 65 72 3c  )&0x80 && pIter<
a8e0: 70 45 6e 64 20 29 3b 0a 20 20 61 73 73 65 72 74  pEnd );.  assert
a8f0: 28 20 64 65 62 75 67 69 6e 66 6f 2e 6e 53 69 7a  ( debuginfo.nSiz
a900: 65 3d 3d 28 75 31 36 29 28 70 49 74 65 72 20 2d  e==(u16)(pIter -
a910: 20 70 43 65 6c 6c 29 20 7c 7c 20 43 4f 52 52 55   pCell) || CORRU
a920: 50 54 5f 44 42 20 29 3b 0a 20 20 72 65 74 75 72  PT_DB );.  retur
a930: 6e 20 28 75 31 36 29 28 70 49 74 65 72 20 2d 20  n (u16)(pIter - 
a940: 70 43 65 6c 6c 29 3b 0a 7d 0a 0a 0a 23 69 66 64  pCell);.}...#ifd
a950: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
a960: 2f 2a 20 54 68 69 73 20 76 61 72 69 61 74 69 6f  /* This variatio
a970: 6e 20 6f 6e 20 63 65 6c 6c 53 69 7a 65 50 74 72  n on cellSizePtr
a980: 28 29 20 69 73 20 75 73 65 64 20 69 6e 73 69 64  () is used insid
a990: 65 20 6f 66 20 61 73 73 65 72 74 28 29 20 73 74  e of assert() st
a9a0: 61 74 65 6d 65 6e 74 73 0a 2a 2a 20 6f 6e 6c 79  atements.** only
a9b0: 2e 20 2a 2f 0a 73 74 61 74 69 63 20 75 31 36 20  . */.static u16 
a9c0: 63 65 6c 6c 53 69 7a 65 28 4d 65 6d 50 61 67 65  cellSize(MemPage
a9d0: 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 69 43 65   *pPage, int iCe
a9e0: 6c 6c 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50  ll){.  return pP
a9f0: 61 67 65 2d 3e 78 43 65 6c 6c 53 69 7a 65 28 70  age->xCellSize(p
aa00: 50 61 67 65 2c 20 66 69 6e 64 43 65 6c 6c 28 70  Page, findCell(p
aa10: 50 61 67 65 2c 20 69 43 65 6c 6c 29 29 3b 0a 7d  Page, iCell));.}
aa20: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66  .#endif..#ifndef
aa30: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
aa40: 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 49 66  OVACUUM./*.** If
aa50: 20 74 68 65 20 63 65 6c 6c 20 70 43 65 6c 6c 2c   the cell pCell,
aa60: 20 70 61 72 74 20 6f 66 20 70 61 67 65 20 70 50   part of page pP
aa70: 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 70  age contains a p
aa80: 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 61 6e 20  ointer.** to an 
aa90: 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 69  overflow page, i
aaa0: 6e 73 65 72 74 20 61 6e 20 65 6e 74 72 79 20 69  nsert an entry i
aab0: 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 2d  nto the pointer-
aac0: 6d 61 70 0a 2a 2a 20 66 6f 72 20 74 68 65 20 6f  map.** for the o
aad0: 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 0a 2a 2f  verflow page..*/
aae0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 74 72  .static void ptr
aaf0: 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28 4d 65  mapPutOvflPtr(Me
ab00: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75 38  mPage *pPage, u8
ab10: 20 2a 70 43 65 6c 6c 2c 20 69 6e 74 20 2a 70 52   *pCell, int *pR
ab20: 43 29 7b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69  C){.  CellInfo i
ab30: 6e 66 6f 3b 0a 20 20 69 66 28 20 2a 70 52 43 20  nfo;.  if( *pRC 
ab40: 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65  ) return;.  asse
ab50: 72 74 28 20 70 43 65 6c 6c 21 3d 30 20 29 3b 0a  rt( pCell!=0 );.
ab60: 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43    pPage->xParseC
ab70: 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  ell(pPage, pCell
ab80: 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 69 66 28 20  , &info);.  if( 
ab90: 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3c 69 6e 66 6f  info.nLocal<info
aba0: 2e 6e 50 61 79 6c 6f 61 64 20 29 7b 0a 20 20 20  .nPayload ){.   
abb0: 20 50 67 6e 6f 20 6f 76 66 6c 20 3d 20 67 65 74   Pgno ovfl = get
abc0: 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66  4byte(&pCell[inf
abd0: 6f 2e 6e 53 69 7a 65 2d 34 5d 29 3b 0a 20 20 20  o.nSize-4]);.   
abe0: 20 70 74 72 6d 61 70 50 75 74 28 70 50 61 67 65   ptrmapPut(pPage
abf0: 2d 3e 70 42 74 2c 20 6f 76 66 6c 2c 20 50 54 52  ->pBt, ovfl, PTR
ac00: 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 2c 20 70  MAP_OVERFLOW1, p
ac10: 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 70 52 43 29  Page->pgno, pRC)
ac20: 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a  ;.  }.}.#endif..
ac30: 0a 2f 2a 0a 2a 2a 20 44 65 66 72 61 67 6d 65 6e  ./*.** Defragmen
ac40: 74 20 74 68 65 20 70 61 67 65 20 67 69 76 65 6e  t the page given
ac50: 2e 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72  . This routine r
ac60: 65 6f 72 67 61 6e 69 7a 65 73 20 63 65 6c 6c 73  eorganizes cells
ac70: 20 77 69 74 68 69 6e 20 74 68 65 0a 2a 2a 20 70   within the.** p
ac80: 61 67 65 20 73 6f 20 74 68 61 74 20 74 68 65 72  age so that ther
ac90: 65 20 61 72 65 20 6e 6f 20 66 72 65 65 2d 62 6c  e are no free-bl
aca0: 6f 63 6b 73 20 6f 6e 20 74 68 65 20 66 72 65 65  ocks on the free
acb0: 2d 62 6c 6f 63 6b 20 6c 69 73 74 2e 0a 2a 2a 0a  -block list..**.
acc0: 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 6e 4d 61  ** Parameter nMa
acd0: 78 46 72 61 67 20 69 73 20 74 68 65 20 6d 61 78  xFrag is the max
ace0: 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 66  imum amount of f
acf0: 72 61 67 6d 65 6e 74 65 64 20 73 70 61 63 65 20  ragmented space 
ad00: 74 68 61 74 20 6d 61 79 20 62 65 0a 2a 2a 20 70  that may be.** p
ad10: 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20 70 61  resent in the pa
ad20: 67 65 20 61 66 74 65 72 20 74 68 69 73 20 72 6f  ge after this ro
ad30: 75 74 69 6e 65 20 72 65 74 75 72 6e 73 2e 0a 2a  utine returns..*
ad40: 2a 0a 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46  *.** EVIDENCE-OF
ad50: 3a 20 52 2d 34 34 35 38 32 2d 36 30 31 33 38 20  : R-44582-60138 
ad60: 53 51 4c 69 74 65 20 6d 61 79 20 66 72 6f 6d 20  SQLite may from 
ad70: 74 69 6d 65 20 74 6f 20 74 69 6d 65 20 72 65 6f  time to time reo
ad80: 72 67 61 6e 69 7a 65 20 61 0a 2a 2a 20 62 2d 74  rganize a.** b-t
ad90: 72 65 65 20 70 61 67 65 20 73 6f 20 74 68 61 74  ree page so that
ada0: 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 66 72   there are no fr
adb0: 65 65 62 6c 6f 63 6b 73 20 6f 72 20 66 72 61 67  eeblocks or frag
adc0: 6d 65 6e 74 20 62 79 74 65 73 2c 20 61 6c 6c 0a  ment bytes, all.
add0: 2a 2a 20 75 6e 75 73 65 64 20 62 79 74 65 73 20  ** unused bytes 
ade0: 61 72 65 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e  are contained in
adf0: 20 74 68 65 20 75 6e 61 6c 6c 6f 63 61 74 65 64   the unallocated
ae00: 20 73 70 61 63 65 20 72 65 67 69 6f 6e 2c 20 61   space region, a
ae10: 6e 64 20 61 6c 6c 0a 2a 2a 20 63 65 6c 6c 73 20  nd all.** cells 
ae20: 61 72 65 20 70 61 63 6b 65 64 20 74 69 67 68 74  are packed tight
ae30: 6c 79 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  ly at the end of
ae40: 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 73 74   the page..*/.st
ae50: 61 74 69 63 20 69 6e 74 20 64 65 66 72 61 67 6d  atic int defragm
ae60: 65 6e 74 50 61 67 65 28 4d 65 6d 50 61 67 65 20  entPage(MemPage 
ae70: 2a 70 50 61 67 65 2c 20 69 6e 74 20 6e 4d 61 78  *pPage, int nMax
ae80: 46 72 61 67 29 7b 0a 20 20 69 6e 74 20 69 3b 20  Frag){.  int i; 
ae90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aea0: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
aeb0: 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 70 63 3b  ter */.  int pc;
aec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aed0: 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
aee0: 66 20 74 68 65 20 69 2d 74 68 20 63 65 6c 6c 20  f the i-th cell 
aef0: 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20 20 20  */.  int hdr;   
af00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
af10: 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 74 68 65  /* Offset to the
af20: 20 70 61 67 65 20 68 65 61 64 65 72 20 2a 2f 0a   page header */.
af30: 20 20 69 6e 74 20 73 69 7a 65 3b 20 20 20 20 20    int size;     
af40: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
af50: 53 69 7a 65 20 6f 66 20 61 20 63 65 6c 6c 20 2a  Size of a cell *
af60: 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c 65 53 69  /.  int usableSi
af70: 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ze;            /
af80: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 73 61 62  * Number of usab
af90: 6c 65 20 62 79 74 65 73 20 6f 6e 20 61 20 70 61  le bytes on a pa
afa0: 67 65 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c  ge */.  int cell
afb0: 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 20  Offset;         
afc0: 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20     /* Offset to 
afd0: 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  the cell pointer
afe0: 20 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20   array */.  int 
aff0: 63 62 72 6b 3b 20 20 20 20 20 20 20 20 20 20 20  cbrk;           
b000: 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
b010: 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e   to the cell con
b020: 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20 69  tent area */.  i
b030: 6e 74 20 6e 43 65 6c 6c 3b 20 20 20 20 20 20 20  nt nCell;       
b040: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
b050: 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 6f 6e 20  ber of cells on 
b060: 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 75 6e  the page */.  un
b070: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74  signed char *dat
b080: 61 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  a;       /* The 
b090: 70 61 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 75  page data */.  u
b0a0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 74 65  nsigned char *te
b0b0: 6d 70 3b 20 20 20 20 20 20 20 2f 2a 20 54 65 6d  mp;       /* Tem
b0c0: 70 20 61 72 65 61 20 66 6f 72 20 63 65 6c 6c 20  p area for cell 
b0d0: 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 75 6e 73  content */.  uns
b0e0: 69 67 6e 65 64 20 63 68 61 72 20 2a 73 72 63 3b  igned char *src;
b0f0: 20 20 20 20 20 20 20 20 2f 2a 20 53 6f 75 72 63          /* Sourc
b100: 65 20 6f 66 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a  e of content */.
b110: 20 20 69 6e 74 20 69 43 65 6c 6c 46 69 72 73 74    int iCellFirst
b120: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
b130: 46 69 72 73 74 20 61 6c 6c 6f 77 61 62 6c 65 20  First allowable 
b140: 63 65 6c 6c 20 69 6e 64 65 78 20 2a 2f 0a 20 20  cell index */.  
b150: 69 6e 74 20 69 43 65 6c 6c 4c 61 73 74 3b 20 20  int iCellLast;  
b160: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61             /* La
b170: 73 74 20 70 6f 73 73 69 62 6c 65 20 63 65 6c 6c  st possible cell
b180: 20 69 6e 64 65 78 20 2a 2f 0a 0a 20 20 61 73 73   index */..  ass
b190: 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
b1a0: 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
b1b0: 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
b1c0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
b1d0: 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20 61 73 73  >pBt!=0 );.  ass
b1e0: 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 2d  ert( pPage->pBt-
b1f0: 3e 75 73 61 62 6c 65 53 69 7a 65 20 3c 3d 20 53  >usableSize <= S
b200: 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53  QLITE_MAX_PAGE_S
b210: 49 5a 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  IZE );.  assert(
b220: 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
b230: 77 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  w==0 );.  assert
b240: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
b250: 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
b260: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 74 65 6d  >mutex) );.  tem
b270: 70 20 3d 20 30 3b 0a 20 20 73 72 63 20 3d 20 64  p = 0;.  src = d
b280: 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61  ata = pPage->aDa
b290: 74 61 3b 0a 20 20 68 64 72 20 3d 20 70 50 61 67  ta;.  hdr = pPag
b2a0: 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20  e->hdrOffset;.  
b2b0: 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 70 50 61  cellOffset = pPa
b2c0: 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 3b 0a  ge->cellOffset;.
b2d0: 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d    nCell = pPage-
b2e0: 3e 6e 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72 74  >nCell;.  assert
b2f0: 28 20 6e 43 65 6c 6c 3d 3d 67 65 74 32 62 79 74  ( nCell==get2byt
b300: 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 29 20  e(&data[hdr+3]) 
b310: 29 3b 0a 20 20 69 43 65 6c 6c 46 69 72 73 74 20  );.  iCellFirst 
b320: 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32  = cellOffset + 2
b330: 2a 6e 43 65 6c 6c 3b 0a 20 20 75 73 61 62 6c 65  *nCell;.  usable
b340: 53 69 7a 65 20 3d 20 70 50 61 67 65 2d 3e 70 42  Size = pPage->pB
b350: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 0a  t->usableSize;..
b360: 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20    /* This block 
b370: 68 61 6e 64 6c 65 73 20 70 61 67 65 73 20 77 69  handles pages wi
b380: 74 68 20 74 77 6f 20 6f 72 20 66 65 77 65 72 20  th two or fewer 
b390: 66 72 65 65 20 62 6c 6f 63 6b 73 20 61 6e 64 20  free blocks and 
b3a0: 6e 4d 61 78 46 72 61 67 0a 20 20 2a 2a 20 6f 72  nMaxFrag.  ** or
b3b0: 20 66 65 77 65 72 20 66 72 61 67 6d 65 6e 74 65   fewer fragmente
b3c0: 64 20 62 79 74 65 73 2e 20 49 6e 20 74 68 69 73  d bytes. In this
b3d0: 20 63 61 73 65 20 69 74 20 69 73 20 66 61 73 74   case it is fast
b3e0: 65 72 20 74 6f 20 6d 6f 76 65 20 74 68 65 0a 20  er to move the. 
b3f0: 20 2a 2a 20 74 77 6f 20 28 6f 72 20 6f 6e 65 29   ** two (or one)
b400: 20 62 6c 6f 63 6b 73 20 6f 66 20 63 65 6c 6c 73   blocks of cells
b410: 20 75 73 69 6e 67 20 6d 65 6d 6d 6f 76 65 28 29   using memmove()
b420: 20 61 6e 64 20 61 64 64 20 74 68 65 20 72 65 71   and add the req
b430: 75 69 72 65 64 0a 20 20 2a 2a 20 6f 66 66 73 65  uired.  ** offse
b440: 74 73 20 74 6f 20 65 61 63 68 20 70 6f 69 6e 74  ts to each point
b450: 65 72 20 69 6e 20 74 68 65 20 63 65 6c 6c 2d 70  er in the cell-p
b460: 6f 69 6e 74 65 72 20 61 72 72 61 79 20 74 68 61  ointer array tha
b470: 6e 20 69 74 20 69 73 20 74 6f 20 0a 20 20 2a 2a  n it is to .  **
b480: 20 72 65 63 6f 6e 73 74 72 75 63 74 20 74 68 65   reconstruct the
b490: 20 65 6e 74 69 72 65 20 70 61 67 65 2e 20 20 2a   entire page.  *
b4a0: 2f 0a 20 20 69 66 28 20 28 69 6e 74 29 64 61 74  /.  if( (int)dat
b4b0: 61 5b 68 64 72 2b 37 5d 3c 3d 6e 4d 61 78 46 72  a[hdr+7]<=nMaxFr
b4c0: 61 67 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 46  ag ){.    int iF
b4d0: 72 65 65 20 3d 20 67 65 74 32 62 79 74 65 28 26  ree = get2byte(&
b4e0: 64 61 74 61 5b 68 64 72 2b 31 5d 29 3b 0a 20 20  data[hdr+1]);.  
b4f0: 20 20 69 66 28 20 69 46 72 65 65 20 29 7b 0a 20    if( iFree ){. 
b500: 20 20 20 20 20 69 6e 74 20 69 46 72 65 65 32 20       int iFree2 
b510: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
b520: 5b 69 46 72 65 65 5d 29 3b 0a 0a 20 20 20 20 20  [iFree]);..     
b530: 20 2f 2a 20 70 61 67 65 46 69 6e 64 53 6c 6f 74   /* pageFindSlot
b540: 28 29 20 68 61 73 20 61 6c 72 65 61 64 79 20 76  () has already v
b550: 65 72 69 66 69 65 64 20 74 68 61 74 20 66 72 65  erified that fre
b560: 65 20 62 6c 6f 63 6b 73 20 61 72 65 20 73 6f 72  e blocks are sor
b570: 74 65 64 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20  ted.      ** in 
b580: 6f 72 64 65 72 20 6f 66 20 6f 66 66 73 65 74 20  order of offset 
b590: 77 69 74 68 69 6e 20 74 68 65 20 70 61 67 65 2c  within the page,
b5a0: 20 61 6e 64 20 74 68 61 74 20 6e 6f 20 62 6c 6f   and that no blo
b5b0: 63 6b 20 65 78 74 65 6e 64 73 0a 20 20 20 20 20  ck extends.     
b5c0: 20 2a 2a 20 70 61 73 74 20 74 68 65 20 65 6e 64   ** past the end
b5d0: 20 6f 66 20 74 68 65 20 70 61 67 65 2e 20 50 72   of the page. Pr
b5e0: 6f 76 69 64 65 64 20 74 68 65 20 74 77 6f 20 66  ovided the two f
b5f0: 72 65 65 20 73 6c 6f 74 73 20 64 6f 20 6e 6f 74  ree slots do not
b600: 20 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65 72 6c   .      ** overl
b610: 61 70 2c 20 74 68 69 73 20 67 75 61 72 61 6e 74  ap, this guarant
b620: 65 65 73 20 74 68 61 74 20 74 68 65 20 6d 65 6d  ees that the mem
b630: 6d 6f 76 65 28 29 20 63 61 6c 6c 73 20 62 65 6c  move() calls bel
b640: 6f 77 20 77 69 6c 6c 20 6e 6f 74 0a 20 20 20 20  ow will not.    
b650: 20 20 2a 2a 20 6f 76 65 72 77 72 69 74 65 20 74    ** overwrite t
b660: 68 65 20 75 73 61 62 6c 65 53 69 7a 65 20 62 79  he usableSize by
b670: 74 65 20 62 75 66 66 65 72 2c 20 65 76 65 6e 20  te buffer, even 
b680: 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  if the database 
b690: 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 69 73  page.      ** is
b6a0: 20 63 6f 72 72 75 70 74 2e 20 20 2a 2f 0a 20 20   corrupt.  */.  
b6b0: 20 20 20 20 61 73 73 65 72 74 28 20 69 46 72 65      assert( iFre
b6c0: 65 32 3d 3d 30 20 7c 7c 20 69 46 72 65 65 32 3e  e2==0 || iFree2>
b6d0: 69 46 72 65 65 20 29 3b 0a 20 20 20 20 20 20 61  iFree );.      a
b6e0: 73 73 65 72 74 28 20 69 46 72 65 65 2b 67 65 74  ssert( iFree+get
b6f0: 32 62 79 74 65 28 26 64 61 74 61 5b 69 46 72 65  2byte(&data[iFre
b700: 65 2b 32 5d 29 20 3c 3d 20 75 73 61 62 6c 65 53  e+2]) <= usableS
b710: 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ize );.      ass
b720: 65 72 74 28 20 69 46 72 65 65 32 3d 3d 30 20 7c  ert( iFree2==0 |
b730: 7c 20 69 46 72 65 65 32 2b 67 65 74 32 62 79 74  | iFree2+get2byt
b740: 65 28 26 64 61 74 61 5b 69 46 72 65 65 32 2b 32  e(&data[iFree2+2
b750: 5d 29 20 3c 3d 20 75 73 61 62 6c 65 53 69 7a 65  ]) <= usableSize
b760: 20 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 30   );..      if( 0
b770: 3d 3d 69 46 72 65 65 32 20 7c 7c 20 28 64 61 74  ==iFree2 || (dat
b780: 61 5b 69 46 72 65 65 32 5d 3d 3d 30 20 26 26 20  a[iFree2]==0 && 
b790: 64 61 74 61 5b 69 46 72 65 65 32 2b 31 5d 3d 3d  data[iFree2+1]==
b7a0: 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 75 38  0) ){.        u8
b7b0: 20 2a 70 45 6e 64 20 3d 20 26 64 61 74 61 5b 63   *pEnd = &data[c
b7c0: 65 6c 6c 4f 66 66 73 65 74 20 2b 20 6e 43 65 6c  ellOffset + nCel
b7d0: 6c 2a 32 5d 3b 0a 20 20 20 20 20 20 20 20 75 38  l*2];.        u8
b7e0: 20 2a 70 41 64 64 72 3b 0a 20 20 20 20 20 20 20   *pAddr;.       
b7f0: 20 69 6e 74 20 73 7a 32 20 3d 20 30 3b 0a 20 20   int sz2 = 0;.  
b800: 20 20 20 20 20 20 69 6e 74 20 73 7a 20 3d 20 67        int sz = g
b810: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 46  et2byte(&data[iF
b820: 72 65 65 2b 32 5d 29 3b 0a 20 20 20 20 20 20 20  ree+2]);.       
b830: 20 69 6e 74 20 74 6f 70 20 3d 20 67 65 74 32 62   int top = get2b
b840: 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
b850: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  );.        if( i
b860: 46 72 65 65 32 20 29 7b 0a 20 20 20 20 20 20 20  Free2 ){.       
b870: 20 20 20 69 66 28 20 69 46 72 65 65 2b 73 7a 3e     if( iFree+sz>
b880: 69 46 72 65 65 32 20 29 20 72 65 74 75 72 6e 20  iFree2 ) return 
b890: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
b8a0: 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 73  KPT;.          s
b8b0: 7a 32 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  z2 = get2byte(&d
b8c0: 61 74 61 5b 69 46 72 65 65 32 2b 32 5d 29 3b 0a  ata[iFree2+2]);.
b8d0: 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
b8e0: 28 20 69 46 72 65 65 2b 73 7a 2b 73 7a 32 2b 69  ( iFree+sz+sz2+i
b8f0: 46 72 65 65 32 2d 28 69 46 72 65 65 2b 73 7a 29  Free2-(iFree+sz)
b900: 20 3c 3d 20 75 73 61 62 6c 65 53 69 7a 65 20 29   <= usableSize )
b910: 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 6d  ;.          memm
b920: 6f 76 65 28 26 64 61 74 61 5b 69 46 72 65 65 2b  ove(&data[iFree+
b930: 73 7a 2b 73 7a 32 5d 2c 20 26 64 61 74 61 5b 69  sz+sz2], &data[i
b940: 46 72 65 65 2b 73 7a 5d 2c 20 69 46 72 65 65 32  Free+sz], iFree2
b950: 2d 28 69 46 72 65 65 2b 73 7a 29 29 3b 0a 20 20  -(iFree+sz));.  
b960: 20 20 20 20 20 20 20 20 73 7a 20 2b 3d 20 73 7a          sz += sz
b970: 32 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  2;.        }.   
b980: 20 20 20 20 20 63 62 72 6b 20 3d 20 74 6f 70 2b       cbrk = top+
b990: 73 7a 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  sz;.        asse
b9a0: 72 74 28 20 63 62 72 6b 2b 28 69 46 72 65 65 2d  rt( cbrk+(iFree-
b9b0: 74 6f 70 29 20 3c 3d 20 75 73 61 62 6c 65 53 69  top) <= usableSi
b9c0: 7a 65 20 29 3b 0a 20 20 20 20 20 20 20 20 6d 65  ze );.        me
b9d0: 6d 6d 6f 76 65 28 26 64 61 74 61 5b 63 62 72 6b  mmove(&data[cbrk
b9e0: 5d 2c 20 26 64 61 74 61 5b 74 6f 70 5d 2c 20 69  ], &data[top], i
b9f0: 46 72 65 65 2d 74 6f 70 29 3b 0a 20 20 20 20 20  Free-top);.     
ba00: 20 20 20 66 6f 72 28 70 41 64 64 72 3d 26 64 61     for(pAddr=&da
ba10: 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74 5d 3b 20  ta[cellOffset]; 
ba20: 70 41 64 64 72 3c 70 45 6e 64 3b 20 70 41 64 64  pAddr<pEnd; pAdd
ba30: 72 2b 3d 32 29 7b 0a 20 20 20 20 20 20 20 20 20  r+=2){.         
ba40: 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 28 70   pc = get2byte(p
ba50: 41 64 64 72 29 3b 0a 20 20 20 20 20 20 20 20 20  Addr);.         
ba60: 20 69 66 28 20 70 63 3c 69 46 72 65 65 20 29 7b   if( pc<iFree ){
ba70: 20 70 75 74 32 62 79 74 65 28 70 41 64 64 72 2c   put2byte(pAddr,
ba80: 20 70 63 2b 73 7a 29 3b 20 7d 0a 20 20 20 20 20   pc+sz); }.     
ba90: 20 20 20 20 20 65 6c 73 65 20 69 66 28 20 70 63       else if( pc
baa0: 3c 69 46 72 65 65 32 20 29 7b 20 70 75 74 32 62  <iFree2 ){ put2b
bab0: 79 74 65 28 70 41 64 64 72 2c 20 70 63 2b 73 7a  yte(pAddr, pc+sz
bac0: 32 29 3b 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a  2); }.        }.
bad0: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65 66          goto def
bae0: 72 61 67 6d 65 6e 74 5f 6f 75 74 3b 0a 20 20 20  ragment_out;.   
baf0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
bb00: 20 20 63 62 72 6b 20 3d 20 75 73 61 62 6c 65 53    cbrk = usableS
bb10: 69 7a 65 3b 0a 20 20 69 43 65 6c 6c 4c 61 73 74  ize;.  iCellLast
bb20: 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 20 2d 20   = usableSize - 
bb30: 34 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  4;.  for(i=0; i<
bb40: 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  nCell; i++){.   
bb50: 20 75 38 20 2a 70 41 64 64 72 3b 20 20 20 20 20   u8 *pAddr;     
bb60: 2f 2a 20 54 68 65 20 69 2d 74 68 20 63 65 6c 6c  /* The i-th cell
bb70: 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 20 20   pointer */.    
bb80: 70 41 64 64 72 20 3d 20 26 64 61 74 61 5b 63 65  pAddr = &data[ce
bb90: 6c 6c 4f 66 66 73 65 74 20 2b 20 69 2a 32 5d 3b  llOffset + i*2];
bba0: 0a 20 20 20 20 70 63 20 3d 20 67 65 74 32 62 79  .    pc = get2by
bbb0: 74 65 28 70 41 64 64 72 29 3b 0a 20 20 20 20 74  te(pAddr);.    t
bbc0: 65 73 74 63 61 73 65 28 20 70 63 3d 3d 69 43 65  estcase( pc==iCe
bbd0: 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20 20 20 74  llFirst );.    t
bbe0: 65 73 74 63 61 73 65 28 20 70 63 3d 3d 69 43 65  estcase( pc==iCe
bbf0: 6c 6c 4c 61 73 74 20 29 3b 0a 20 20 20 20 2f 2a  llLast );.    /*
bc00: 20 54 68 65 73 65 20 63 6f 6e 64 69 74 69 6f 6e   These condition
bc10: 73 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62  s have already b
bc20: 65 65 6e 20 76 65 72 69 66 69 65 64 20 69 6e 20  een verified in 
bc30: 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 0a  btreeInitPage().
bc40: 20 20 20 20 2a 2a 20 69 66 20 50 52 41 47 4d 41      ** if PRAGMA
bc50: 20 63 65 6c 6c 5f 73 69 7a 65 5f 63 68 65 63 6b   cell_size_check
bc60: 3d 4f 4e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  =ON..    */.    
bc70: 69 66 28 20 70 63 3c 69 43 65 6c 6c 46 69 72 73  if( pc<iCellFirs
bc80: 74 20 7c 7c 20 70 63 3e 69 43 65 6c 6c 4c 61 73  t || pc>iCellLas
bc90: 74 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  t ){.      retur
bca0: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
bcb0: 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20  _BKPT;.    }.   
bcc0: 20 61 73 73 65 72 74 28 20 70 63 3e 3d 69 43 65   assert( pc>=iCe
bcd0: 6c 6c 46 69 72 73 74 20 26 26 20 70 63 3c 3d 69  llFirst && pc<=i
bce0: 43 65 6c 6c 4c 61 73 74 20 29 3b 0a 20 20 20 20  CellLast );.    
bcf0: 73 69 7a 65 20 3d 20 70 50 61 67 65 2d 3e 78 43  size = pPage->xC
bd00: 65 6c 6c 53 69 7a 65 28 70 50 61 67 65 2c 20 26  ellSize(pPage, &
bd10: 73 72 63 5b 70 63 5d 29 3b 0a 20 20 20 20 63 62  src[pc]);.    cb
bd20: 72 6b 20 2d 3d 20 73 69 7a 65 3b 0a 20 20 20 20  rk -= size;.    
bd30: 69 66 28 20 63 62 72 6b 3c 69 43 65 6c 6c 46 69  if( cbrk<iCellFi
bd40: 72 73 74 20 7c 7c 20 70 63 2b 73 69 7a 65 3e 75  rst || pc+size>u
bd50: 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20  sableSize ){.   
bd60: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
bd70: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
bd80: 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
bd90: 20 63 62 72 6b 2b 73 69 7a 65 3c 3d 75 73 61 62   cbrk+size<=usab
bda0: 6c 65 53 69 7a 65 20 26 26 20 63 62 72 6b 3e 3d  leSize && cbrk>=
bdb0: 69 43 65 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20  iCellFirst );.  
bdc0: 20 20 74 65 73 74 63 61 73 65 28 20 63 62 72 6b    testcase( cbrk
bdd0: 2b 73 69 7a 65 3d 3d 75 73 61 62 6c 65 53 69 7a  +size==usableSiz
bde0: 65 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  e );.    testcas
bdf0: 65 28 20 70 63 2b 73 69 7a 65 3d 3d 75 73 61 62  e( pc+size==usab
be00: 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 70 75  leSize );.    pu
be10: 74 32 62 79 74 65 28 70 41 64 64 72 2c 20 63 62  t2byte(pAddr, cb
be20: 72 6b 29 3b 0a 20 20 20 20 69 66 28 20 74 65 6d  rk);.    if( tem
be30: 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e  p==0 ){.      in
be40: 74 20 78 3b 0a 20 20 20 20 20 20 69 66 28 20 63  t x;.      if( c
be50: 62 72 6b 3d 3d 70 63 20 29 20 63 6f 6e 74 69 6e  brk==pc ) contin
be60: 75 65 3b 0a 20 20 20 20 20 20 74 65 6d 70 20 3d  ue;.      temp =
be70: 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 65 6d   sqlite3PagerTem
be80: 70 53 70 61 63 65 28 70 50 61 67 65 2d 3e 70 42  pSpace(pPage->pB
be90: 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20  t->pPager);.    
bea0: 20 20 78 20 3d 20 67 65 74 32 62 79 74 65 28 26    x = get2byte(&
beb0: 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20  data[hdr+5]);.  
bec0: 20 20 20 20 6d 65 6d 63 70 79 28 26 74 65 6d 70      memcpy(&temp
bed0: 5b 78 5d 2c 20 26 64 61 74 61 5b 78 5d 2c 20 28  [x], &data[x], (
bee0: 63 62 72 6b 2b 73 69 7a 65 29 20 2d 20 78 29 3b  cbrk+size) - x);
bef0: 0a 20 20 20 20 20 20 73 72 63 20 3d 20 74 65 6d  .      src = tem
bf00: 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d  p;.    }.    mem
bf10: 63 70 79 28 26 64 61 74 61 5b 63 62 72 6b 5d 2c  cpy(&data[cbrk],
bf20: 20 26 73 72 63 5b 70 63 5d 2c 20 73 69 7a 65 29   &src[pc], size)
bf30: 3b 0a 20 20 7d 0a 20 20 64 61 74 61 5b 68 64 72  ;.  }.  data[hdr
bf40: 2b 37 5d 20 3d 20 30 3b 0a 0a 20 64 65 66 72 61  +7] = 0;.. defra
bf50: 67 6d 65 6e 74 5f 6f 75 74 3a 0a 20 20 69 66 28  gment_out:.  if(
bf60: 20 64 61 74 61 5b 68 64 72 2b 37 5d 2b 63 62 72   data[hdr+7]+cbr
bf70: 6b 2d 69 43 65 6c 6c 46 69 72 73 74 21 3d 70 50  k-iCellFirst!=pP
bf80: 61 67 65 2d 3e 6e 46 72 65 65 20 29 7b 0a 20 20  age->nFree ){.  
bf90: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
bfa0: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
bfb0: 7d 0a 20 20 61 73 73 65 72 74 28 20 63 62 72 6b  }.  assert( cbrk
bfc0: 3e 3d 69 43 65 6c 6c 46 69 72 73 74 20 29 3b 0a  >=iCellFirst );.
bfd0: 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
bfe0: 5b 68 64 72 2b 35 5d 2c 20 63 62 72 6b 29 3b 0a  [hdr+5], cbrk);.
bff0: 20 20 64 61 74 61 5b 68 64 72 2b 31 5d 20 3d 20    data[hdr+1] = 
c000: 30 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b 32 5d  0;.  data[hdr+2]
c010: 20 3d 20 30 3b 0a 20 20 6d 65 6d 73 65 74 28 26   = 0;.  memset(&
c020: 64 61 74 61 5b 69 43 65 6c 6c 46 69 72 73 74 5d  data[iCellFirst]
c030: 2c 20 30 2c 20 63 62 72 6b 2d 69 43 65 6c 6c 46  , 0, cbrk-iCellF
c040: 69 72 73 74 29 3b 0a 20 20 61 73 73 65 72 74 28  irst);.  assert(
c050: 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
c060: 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
c070: 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 72 65  pDbPage) );.  re
c080: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
c090: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63 68 20  }../*.** Search 
c0a0: 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 6f 6e  the free-list on
c0b0: 20 70 61 67 65 20 70 50 67 20 66 6f 72 20 73 70   page pPg for sp
c0c0: 61 63 65 20 74 6f 20 73 74 6f 72 65 20 61 20 63  ace to store a c
c0d0: 65 6c 6c 20 6e 42 79 74 65 20 62 79 74 65 73 20  ell nByte bytes 
c0e0: 69 6e 0a 2a 2a 20 73 69 7a 65 2e 20 49 66 20 6f  in.** size. If o
c0f0: 6e 65 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 2c  ne can be found,
c100: 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   return a pointe
c110: 72 20 74 6f 20 74 68 65 20 73 70 61 63 65 20 61  r to the space a
c120: 6e 64 20 72 65 6d 6f 76 65 20 69 74 0a 2a 2a 20  nd remove it.** 
c130: 66 72 6f 6d 20 74 68 65 20 66 72 65 65 2d 6c 69  from the free-li
c140: 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20  st..**.** If no 
c150: 73 75 69 74 61 62 6c 65 20 73 70 61 63 65 20 63  suitable space c
c160: 61 6e 20 62 65 20 66 6f 75 6e 64 20 6f 6e 20 74  an be found on t
c170: 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 20 72 65  he free-list, re
c180: 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a  turn NULL..**.**
c190: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d   This function m
c1a0: 61 79 20 64 65 74 65 63 74 20 63 6f 72 72 75 70  ay detect corrup
c1b0: 74 69 6f 6e 20 77 69 74 68 69 6e 20 70 50 67 2e  tion within pPg.
c1c0: 20 20 49 66 20 63 6f 72 72 75 70 74 69 6f 6e 20    If corruption 
c1d0: 69 73 0a 2a 2a 20 64 65 74 65 63 74 65 64 20 74  is.** detected t
c1e0: 68 65 6e 20 2a 70 52 63 20 69 73 20 73 65 74 20  hen *pRc is set 
c1f0: 74 6f 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  to SQLITE_CORRUP
c200: 54 20 61 6e 64 20 4e 55 4c 4c 20 69 73 20 72 65  T and NULL is re
c210: 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 6c  turned..**.** Sl
c220: 6f 74 73 20 6f 6e 20 74 68 65 20 66 72 65 65 20  ots on the free 
c230: 6c 69 73 74 20 74 68 61 74 20 61 72 65 20 62 65  list that are be
c240: 74 77 65 65 6e 20 31 20 61 6e 64 20 33 20 62 79  tween 1 and 3 by
c250: 74 65 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20  tes larger than 
c260: 6e 42 79 74 65 0a 2a 2a 20 77 69 6c 6c 20 62 65  nByte.** will be
c270: 20 69 67 6e 6f 72 65 64 20 69 66 20 61 64 64 69   ignored if addi
c280: 6e 67 20 74 68 65 20 65 78 74 72 61 20 73 70 61  ng the extra spa
c290: 63 65 20 74 6f 20 74 68 65 20 66 72 61 67 6d 65  ce to the fragme
c2a0: 6e 74 61 74 69 6f 6e 20 63 6f 75 6e 74 0a 2a 2a  ntation count.**
c2b0: 20 63 61 75 73 65 73 20 74 68 65 20 66 72 61 67   causes the frag
c2c0: 6d 65 6e 74 61 74 69 6f 6e 20 63 6f 75 6e 74 20  mentation count 
c2d0: 74 6f 20 65 78 63 65 65 64 20 36 30 2e 0a 2a 2f  to exceed 60..*/
c2e0: 0a 73 74 61 74 69 63 20 75 38 20 2a 70 61 67 65  .static u8 *page
c2f0: 46 69 6e 64 53 6c 6f 74 28 4d 65 6d 50 61 67 65  FindSlot(MemPage
c300: 20 2a 70 50 67 2c 20 69 6e 74 20 6e 42 79 74 65   *pPg, int nByte
c310: 2c 20 69 6e 74 20 2a 70 52 63 29 7b 0a 20 20 63  , int *pRc){.  c
c320: 6f 6e 73 74 20 69 6e 74 20 68 64 72 20 3d 20 70  onst int hdr = p
c330: 50 67 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20  Pg->hdrOffset;. 
c340: 20 75 38 20 2a 20 63 6f 6e 73 74 20 61 44 61 74   u8 * const aDat
c350: 61 20 3d 20 70 50 67 2d 3e 61 44 61 74 61 3b 0a  a = pPg->aData;.
c360: 20 20 69 6e 74 20 69 41 64 64 72 20 3d 20 68 64    int iAddr = hd
c370: 72 20 2b 20 31 3b 0a 20 20 69 6e 74 20 70 63 20  r + 1;.  int pc 
c380: 3d 20 67 65 74 32 62 79 74 65 28 26 61 44 61 74  = get2byte(&aDat
c390: 61 5b 69 41 64 64 72 5d 29 3b 0a 20 20 69 6e 74  a[iAddr]);.  int
c3a0: 20 78 3b 0a 20 20 69 6e 74 20 75 73 61 62 6c 65   x;.  int usable
c3b0: 53 69 7a 65 20 3d 20 70 50 67 2d 3e 70 42 74 2d  Size = pPg->pBt-
c3c0: 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 0a 20 20  >usableSize;..  
c3d0: 61 73 73 65 72 74 28 20 70 63 3e 30 20 29 3b 0a  assert( pc>0 );.
c3e0: 20 20 64 6f 7b 0a 20 20 20 20 69 6e 74 20 73 69    do{.    int si
c3f0: 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ze;            /
c400: 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 66 72  * Size of the fr
c410: 65 65 20 73 6c 6f 74 20 2a 2f 0a 20 20 20 20 2f  ee slot */.    /
c420: 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
c430: 2d 30 36 38 36 36 2d 33 39 31 32 35 20 46 72 65  -06866-39125 Fre
c440: 65 62 6c 6f 63 6b 73 20 61 72 65 20 61 6c 77 61  eblocks are alwa
c450: 79 73 20 63 6f 6e 6e 65 63 74 65 64 20 69 6e 20  ys connected in 
c460: 6f 72 64 65 72 20 6f 66 0a 20 20 20 20 2a 2a 20  order of.    ** 
c470: 69 6e 63 72 65 61 73 69 6e 67 20 6f 66 66 73 65  increasing offse
c480: 74 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 63  t. */.    if( pc
c490: 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34 20 7c 7c  >usableSize-4 ||
c4a0: 20 70 63 3c 69 41 64 64 72 2b 34 20 29 7b 0a 20   pc<iAddr+4 ){. 
c4b0: 20 20 20 20 20 2a 70 52 63 20 3d 20 53 51 4c 49       *pRc = SQLI
c4c0: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
c4d0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
c4e0: 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 45 56  .    }.    /* EV
c4f0: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 32 37  IDENCE-OF: R-227
c500: 31 30 2d 35 33 33 32 38 20 54 68 65 20 74 68 69  10-53328 The thi
c510: 72 64 20 61 6e 64 20 66 6f 75 72 74 68 20 62 79  rd and fourth by
c520: 74 65 73 20 6f 66 20 65 61 63 68 0a 20 20 20 20  tes of each.    
c530: 2a 2a 20 66 72 65 65 62 6c 6f 63 6b 20 66 6f 72  ** freeblock for
c540: 6d 20 61 20 62 69 67 2d 65 6e 64 69 61 6e 20 69  m a big-endian i
c550: 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20  nteger which is 
c560: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
c570: 66 72 65 65 62 6c 6f 63 6b 0a 20 20 20 20 2a 2a  freeblock.    **
c580: 20 69 6e 20 62 79 74 65 73 2c 20 69 6e 63 6c 75   in bytes, inclu
c590: 64 69 6e 67 20 74 68 65 20 34 2d 62 79 74 65 20  ding the 4-byte 
c5a0: 68 65 61 64 65 72 2e 20 2a 2f 0a 20 20 20 20 73  header. */.    s
c5b0: 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28 26  ize = get2byte(&
c5c0: 61 44 61 74 61 5b 70 63 2b 32 5d 29 3b 0a 20 20  aData[pc+2]);.  
c5d0: 20 20 69 66 28 20 28 78 20 3d 20 73 69 7a 65 20    if( (x = size 
c5e0: 2d 20 6e 42 79 74 65 29 3e 3d 30 20 29 7b 0a 20  - nByte)>=0 ){. 
c5f0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 78       testcase( x
c600: 3d 3d 34 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ==4 );.      tes
c610: 74 63 61 73 65 28 20 78 3d 3d 33 20 29 3b 0a 20  tcase( x==3 );. 
c620: 20 20 20 20 20 69 66 28 20 70 63 20 3c 20 70 50       if( pc < pP
c630: 67 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 2b 32 2a  g->cellOffset+2*
c640: 70 50 67 2d 3e 6e 43 65 6c 6c 20 7c 7c 20 73 69  pPg->nCell || si
c650: 7a 65 2b 70 63 20 3e 20 75 73 61 62 6c 65 53 69  ze+pc > usableSi
c660: 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70  ze ){.        *p
c670: 52 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  Rc = SQLITE_CORR
c680: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
c690: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
c6a0: 20 20 7d 65 6c 73 65 20 69 66 28 20 78 3c 34 20    }else if( x<4 
c6b0: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 56  ){.        /* EV
c6c0: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 31 34  IDENCE-OF: R-114
c6d0: 39 38 2d 35 38 30 32 32 20 49 6e 20 61 20 77 65  98-58022 In a we
c6e0: 6c 6c 2d 66 6f 72 6d 65 64 20 62 2d 74 72 65 65  ll-formed b-tree
c6f0: 20 70 61 67 65 2c 20 74 68 65 20 74 6f 74 61 6c   page, the total
c700: 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62  .        ** numb
c710: 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 66  er of bytes in f
c720: 72 61 67 6d 65 6e 74 73 20 6d 61 79 20 6e 6f 74  ragments may not
c730: 20 65 78 63 65 65 64 20 36 30 2e 20 2a 2f 0a 20   exceed 60. */. 
c740: 20 20 20 20 20 20 20 69 66 28 20 61 44 61 74 61         if( aData
c750: 5b 68 64 72 2b 37 5d 3e 35 37 20 29 20 72 65 74  [hdr+7]>57 ) ret
c760: 75 72 6e 20 30 3b 0a 0a 20 20 20 20 20 20 20 20  urn 0;..        
c770: 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 73 6c  /* Remove the sl
c780: 6f 74 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65  ot from the free
c790: 2d 6c 69 73 74 2e 20 55 70 64 61 74 65 20 74 68  -list. Update th
c7a0: 65 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 20 20  e number of.    
c7b0: 20 20 20 20 2a 2a 20 66 72 61 67 6d 65 6e 74 65      ** fragmente
c7c0: 64 20 62 79 74 65 73 20 77 69 74 68 69 6e 20 74  d bytes within t
c7d0: 68 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20  he page. */.    
c7e0: 20 20 20 20 6d 65 6d 63 70 79 28 26 61 44 61 74      memcpy(&aDat
c7f0: 61 5b 69 41 64 64 72 5d 2c 20 26 61 44 61 74 61  a[iAddr], &aData
c800: 5b 70 63 5d 2c 20 32 29 3b 0a 20 20 20 20 20 20  [pc], 2);.      
c810: 20 20 61 44 61 74 61 5b 68 64 72 2b 37 5d 20 2b    aData[hdr+7] +
c820: 3d 20 28 75 38 29 78 3b 0a 20 20 20 20 20 20 7d  = (u8)x;.      }
c830: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
c840: 20 54 68 65 20 73 6c 6f 74 20 72 65 6d 61 69 6e   The slot remain
c850: 73 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69  s on the free-li
c860: 73 74 2e 20 52 65 64 75 63 65 20 69 74 73 20 73  st. Reduce its s
c870: 69 7a 65 20 74 6f 20 61 63 63 6f 75 6e 74 0a 20  ize to account. 
c880: 20 20 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 74          ** for t
c890: 68 65 20 70 6f 72 74 69 6f 6e 20 75 73 65 64 20  he portion used 
c8a0: 62 79 20 74 68 65 20 6e 65 77 20 61 6c 6c 6f 63  by the new alloc
c8b0: 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20 20  ation. */.      
c8c0: 20 20 70 75 74 32 62 79 74 65 28 26 61 44 61 74    put2byte(&aDat
c8d0: 61 5b 70 63 2b 32 5d 2c 20 78 29 3b 0a 20 20 20  a[pc+2], x);.   
c8e0: 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72     }.      retur
c8f0: 6e 20 26 61 44 61 74 61 5b 70 63 20 2b 20 78 5d  n &aData[pc + x]
c900: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 41 64 64  ;.    }.    iAdd
c910: 72 20 3d 20 70 63 3b 0a 20 20 20 20 70 63 20 3d  r = pc;.    pc =
c920: 20 67 65 74 32 62 79 74 65 28 26 61 44 61 74 61   get2byte(&aData
c930: 5b 70 63 5d 29 3b 0a 20 20 7d 77 68 69 6c 65 28  [pc]);.  }while(
c940: 20 70 63 20 29 3b 0a 0a 20 20 72 65 74 75 72 6e   pc );..  return
c950: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c   0;.}../*.** All
c960: 6f 63 61 74 65 20 6e 42 79 74 65 20 62 79 74 65  ocate nByte byte
c970: 73 20 6f 66 20 73 70 61 63 65 20 66 72 6f 6d 20  s of space from 
c980: 77 69 74 68 69 6e 20 74 68 65 20 42 2d 54 72 65  within the B-Tre
c990: 65 20 70 61 67 65 20 70 61 73 73 65 64 0a 2a 2a  e page passed.**
c9a0: 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72   as the first ar
c9b0: 67 75 6d 65 6e 74 2e 20 57 72 69 74 65 20 69 6e  gument. Write in
c9c0: 74 6f 20 2a 70 49 64 78 20 74 68 65 20 69 6e 64  to *pIdx the ind
c9d0: 65 78 20 69 6e 74 6f 20 70 50 61 67 65 2d 3e 61  ex into pPage->a
c9e0: 44 61 74 61 5b 5d 0a 2a 2a 20 6f 66 20 74 68 65  Data[].** of the
c9f0: 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 61   first byte of a
ca00: 6c 6c 6f 63 61 74 65 64 20 73 70 61 63 65 2e 20  llocated space. 
ca10: 52 65 74 75 72 6e 20 65 69 74 68 65 72 20 53 51  Return either SQ
ca20: 4c 49 54 45 5f 4f 4b 20 6f 72 0a 2a 2a 20 61 6e  LITE_OK or.** an
ca30: 20 65 72 72 6f 72 20 63 6f 64 65 20 28 75 73 75   error code (usu
ca40: 61 6c 6c 79 20 53 51 4c 49 54 45 5f 43 4f 52 52  ally SQLITE_CORR
ca50: 55 50 54 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  UPT)..**.** The 
ca60: 63 61 6c 6c 65 72 20 67 75 61 72 61 6e 74 65 65  caller guarantee
ca70: 73 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20  s that there is 
ca80: 73 75 66 66 69 63 69 65 6e 74 20 73 70 61 63 65  sufficient space
ca90: 20 74 6f 20 6d 61 6b 65 20 74 68 65 0a 2a 2a 20   to make the.** 
caa0: 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 20 54 68 69  allocation.  Thi
cab0: 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20  s routine might 
cac0: 6e 65 65 64 20 74 6f 20 64 65 66 72 61 67 6d 65  need to defragme
cad0: 6e 74 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 62  nt in order to b
cae0: 72 69 6e 67 0a 2a 2a 20 61 6c 6c 20 74 68 65 20  ring.** all the 
caf0: 73 70 61 63 65 20 74 6f 67 65 74 68 65 72 2c 20  space together, 
cb00: 68 6f 77 65 76 65 72 2e 20 20 54 68 69 73 20 72  however.  This r
cb10: 6f 75 74 69 6e 65 20 77 69 6c 6c 20 61 76 6f 69  outine will avoi
cb20: 64 20 75 73 69 6e 67 0a 2a 2a 20 74 68 65 20 66  d using.** the f
cb30: 69 72 73 74 20 74 77 6f 20 62 79 74 65 73 20 70  irst two bytes p
cb40: 61 73 74 20 74 68 65 20 63 65 6c 6c 20 70 6f 69  ast the cell poi
cb50: 6e 74 65 72 20 61 72 65 61 20 73 69 6e 63 65 20  nter area since 
cb60: 70 72 65 73 75 6d 61 62 6c 79 20 74 68 69 73 0a  presumably this.
cb70: 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73  ** allocation is
cb80: 20 62 65 69 6e 67 20 6d 61 64 65 20 69 6e 20 6f   being made in o
cb90: 72 64 65 72 20 74 6f 20 69 6e 73 65 72 74 20 61  rder to insert a
cba0: 20 6e 65 77 20 63 65 6c 6c 2c 20 73 6f 20 77 65   new cell, so we
cbb0: 20 77 69 6c 6c 0a 2a 2a 20 61 6c 73 6f 20 65 6e   will.** also en
cbc0: 64 20 75 70 20 6e 65 65 64 69 6e 67 20 61 20 6e  d up needing a n
cbd0: 65 77 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 2e  ew cell pointer.
cbe0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
cbf0: 6c 6c 6f 63 61 74 65 53 70 61 63 65 28 4d 65 6d  llocateSpace(Mem
cc00: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74  Page *pPage, int
cc10: 20 6e 42 79 74 65 2c 20 69 6e 74 20 2a 70 49 64   nByte, int *pId
cc20: 78 29 7b 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20  x){.  const int 
cc30: 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72  hdr = pPage->hdr
cc40: 4f 66 66 73 65 74 3b 20 20 20 20 2f 2a 20 4c 6f  Offset;    /* Lo
cc50: 63 61 6c 20 63 61 63 68 65 20 6f 66 20 70 50 61  cal cache of pPa
cc60: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 20 2a 2f  ge->hdrOffset */
cc70: 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 64 61  .  u8 * const da
cc80: 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74  ta = pPage->aDat
cc90: 61 3b 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c  a;      /* Local
cca0: 20 63 61 63 68 65 20 6f 66 20 70 50 61 67 65 2d   cache of pPage-
ccb0: 3e 61 44 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20  >aData */.  int 
ccc0: 74 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  top;            
ccd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cce0: 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f   /* First byte o
ccf0: 66 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61  f cell content a
cd00: 72 65 61 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  rea */.  int rc 
cd10: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
cd20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
cd30: 20 49 6e 74 65 67 65 72 20 72 65 74 75 72 6e 20   Integer return 
cd40: 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 67 61  code */.  int ga
cd50: 70 3b 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72  p;        /* Fir
cd60: 73 74 20 62 79 74 65 20 6f 66 20 67 61 70 20 62  st byte of gap b
cd70: 65 74 77 65 65 6e 20 63 65 6c 6c 20 70 6f 69 6e  etween cell poin
cd80: 74 65 72 73 20 61 6e 64 20 63 65 6c 6c 20 63 6f  ters and cell co
cd90: 6e 74 65 6e 74 20 2a 2f 0a 20 20 0a 20 20 61 73  ntent */.  .  as
cda0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
cdb0: 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
cdc0: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
cdd0: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
cde0: 2d 3e 70 42 74 20 29 3b 0a 20 20 61 73 73 65 72  ->pBt );.  asser
cdf0: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
ce00: 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
ce10: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
ce20: 73 65 72 74 28 20 6e 42 79 74 65 3e 3d 30 20 29  sert( nByte>=0 )
ce30: 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63 65  ;  /* Minimum ce
ce40: 6c 6c 20 73 69 7a 65 20 69 73 20 34 20 2a 2f 0a  ll size is 4 */.
ce50: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
ce60: 3e 6e 46 72 65 65 3e 3d 6e 42 79 74 65 20 29 3b  >nFree>=nByte );
ce70: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
ce80: 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29  ->nOverflow==0 )
ce90: 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 42 79 74  ;.  assert( nByt
cea0: 65 20 3c 20 28 69 6e 74 29 28 70 50 61 67 65 2d  e < (int)(pPage-
ceb0: 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
cec0: 2d 38 29 20 29 3b 0a 0a 20 20 61 73 73 65 72 74  -8) );..  assert
ced0: 28 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66  ( pPage->cellOff
cee0: 73 65 74 20 3d 3d 20 68 64 72 20 2b 20 31 32 20  set == hdr + 12 
cef0: 2d 20 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66 20  - 4*pPage->leaf 
cf00: 29 3b 0a 20 20 67 61 70 20 3d 20 70 50 61 67 65  );.  gap = pPage
cf10: 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32  ->cellOffset + 2
cf20: 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20  *pPage->nCell;. 
cf30: 20 61 73 73 65 72 74 28 20 67 61 70 3c 3d 36 35   assert( gap<=65
cf40: 35 33 36 20 29 3b 0a 20 20 2f 2a 20 45 56 49 44  536 );.  /* EVID
cf50: 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 39 33 35 36  ENCE-OF: R-29356
cf60: 2d 30 32 33 39 31 20 49 66 20 74 68 65 20 64 61  -02391 If the da
cf70: 74 61 62 61 73 65 20 75 73 65 73 20 61 20 36 35  tabase uses a 65
cf80: 35 33 36 2d 62 79 74 65 20 70 61 67 65 20 73 69  536-byte page si
cf90: 7a 65 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20  ze.  ** and the 
cfa0: 72 65 73 65 72 76 65 64 20 73 70 61 63 65 20 69  reserved space i
cfb0: 73 20 7a 65 72 6f 20 28 74 68 65 20 75 73 75 61  s zero (the usua
cfc0: 6c 20 76 61 6c 75 65 20 66 6f 72 20 72 65 73 65  l value for rese
cfd0: 72 76 65 64 20 73 70 61 63 65 29 0a 20 20 2a 2a  rved space).  **
cfe0: 20 74 68 65 6e 20 74 68 65 20 63 65 6c 6c 20 63   then the cell c
cff0: 6f 6e 74 65 6e 74 20 6f 66 66 73 65 74 20 6f 66  ontent offset of
d000: 20 61 6e 20 65 6d 70 74 79 20 70 61 67 65 20 77   an empty page w
d010: 61 6e 74 73 20 74 6f 20 62 65 20 36 35 35 33 36  ants to be 65536
d020: 2e 0a 20 20 2a 2a 20 48 6f 77 65 76 65 72 2c 20  ..  ** However, 
d030: 74 68 61 74 20 69 6e 74 65 67 65 72 20 69 73 20  that integer is 
d040: 74 6f 6f 20 6c 61 72 67 65 20 74 6f 20 62 65 20  too large to be 
d050: 73 74 6f 72 65 64 20 69 6e 20 61 20 32 2d 62 79  stored in a 2-by
d060: 74 65 20 75 6e 73 69 67 6e 65 64 0a 20 20 2a 2a  te unsigned.  **
d070: 20 69 6e 74 65 67 65 72 2c 20 73 6f 20 61 20 76   integer, so a v
d080: 61 6c 75 65 20 6f 66 20 30 20 69 73 20 75 73 65  alue of 0 is use
d090: 64 20 69 6e 20 69 74 73 20 70 6c 61 63 65 2e 20  d in its place. 
d0a0: 2a 2f 0a 20 20 74 6f 70 20 3d 20 67 65 74 32 62  */.  top = get2b
d0b0: 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
d0c0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 74 6f 70  );.  assert( top
d0d0: 3c 3d 28 69 6e 74 29 70 50 61 67 65 2d 3e 70 42  <=(int)pPage->pB
d0e0: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b  t->usableSize );
d0f0: 20 2f 2a 20 50 72 65 76 65 6e 74 20 62 79 20 67   /* Prevent by g
d100: 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28 29 20  etAndInitPage() 
d110: 2a 2f 0a 20 20 69 66 28 20 67 61 70 3e 74 6f 70  */.  if( gap>top
d120: 20 29 7b 0a 20 20 20 20 69 66 28 20 74 6f 70 3d   ){.    if( top=
d130: 3d 30 20 26 26 20 70 50 61 67 65 2d 3e 70 42 74  =0 && pPage->pBt
d140: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3d 3d 36 35  ->usableSize==65
d150: 35 33 36 20 29 7b 0a 20 20 20 20 20 20 74 6f 70  536 ){.      top
d160: 20 3d 20 36 35 35 33 36 3b 0a 20 20 20 20 7d 65   = 65536;.    }e
d170: 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 74 75 72  lse{.      retur
d180: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
d190: 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 7d  _BKPT;.    }.  }
d1a0: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20  ..  /* If there 
d1b0: 69 73 20 65 6e 6f 75 67 68 20 73 70 61 63 65 20  is enough space 
d1c0: 62 65 74 77 65 65 6e 20 67 61 70 20 61 6e 64 20  between gap and 
d1d0: 74 6f 70 20 66 6f 72 20 6f 6e 65 20 6d 6f 72 65  top for one more
d1e0: 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 0a 20 20   cell pointer.  
d1f0: 2a 2a 20 61 72 72 61 79 20 65 6e 74 72 79 20 6f  ** array entry o
d200: 66 66 73 65 74 2c 20 61 6e 64 20 69 66 20 74 68  ffset, and if th
d210: 65 20 66 72 65 65 6c 69 73 74 20 69 73 20 6e 6f  e freelist is no
d220: 74 20 65 6d 70 74 79 2c 20 74 68 65 6e 20 73 65  t empty, then se
d230: 61 72 63 68 20 74 68 65 0a 20 20 2a 2a 20 66 72  arch the.  ** fr
d240: 65 65 6c 69 73 74 20 6c 6f 6f 6b 69 6e 67 20 66  eelist looking f
d250: 6f 72 20 61 20 66 72 65 65 20 73 6c 6f 74 20 62  or a free slot b
d260: 69 67 20 65 6e 6f 75 67 68 20 74 6f 20 73 61 74  ig enough to sat
d270: 69 73 66 79 20 74 68 65 20 72 65 71 75 65 73 74  isfy the request
d280: 2e 0a 20 20 2a 2f 0a 20 20 74 65 73 74 63 61 73  ..  */.  testcas
d290: 65 28 20 67 61 70 2b 32 3d 3d 74 6f 70 20 29 3b  e( gap+2==top );
d2a0: 0a 20 20 74 65 73 74 63 61 73 65 28 20 67 61 70  .  testcase( gap
d2b0: 2b 31 3d 3d 74 6f 70 20 29 3b 0a 20 20 74 65 73  +1==top );.  tes
d2c0: 74 63 61 73 65 28 20 67 61 70 3d 3d 74 6f 70 20  tcase( gap==top 
d2d0: 29 3b 0a 20 20 69 66 28 20 28 64 61 74 61 5b 68  );.  if( (data[h
d2e0: 64 72 2b 32 5d 20 7c 7c 20 64 61 74 61 5b 68 64  dr+2] || data[hd
d2f0: 72 2b 31 5d 29 20 26 26 20 67 61 70 2b 32 3c 3d  r+1]) && gap+2<=
d300: 74 6f 70 20 29 7b 0a 20 20 20 20 75 38 20 2a 70  top ){.    u8 *p
d310: 53 70 61 63 65 20 3d 20 70 61 67 65 46 69 6e 64  Space = pageFind
d320: 53 6c 6f 74 28 70 50 61 67 65 2c 20 6e 42 79 74  Slot(pPage, nByt
d330: 65 2c 20 26 72 63 29 3b 0a 20 20 20 20 69 66 28  e, &rc);.    if(
d340: 20 70 53 70 61 63 65 20 29 7b 0a 20 20 20 20 20   pSpace ){.     
d350: 20 61 73 73 65 72 74 28 20 70 53 70 61 63 65 3e   assert( pSpace>
d360: 3d 64 61 74 61 20 26 26 20 28 70 53 70 61 63 65  =data && (pSpace
d370: 20 2d 20 64 61 74 61 29 3c 36 35 35 33 36 20 29   - data)<65536 )
d380: 3b 0a 20 20 20 20 20 20 2a 70 49 64 78 20 3d 20  ;.      *pIdx = 
d390: 28 69 6e 74 29 28 70 53 70 61 63 65 20 2d 20 64  (int)(pSpace - d
d3a0: 61 74 61 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ata);.      retu
d3b0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
d3c0: 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 20 29    }else if( rc )
d3d0: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
d3e0: 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  c;.    }.  }..  
d3f0: 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74 20 63  /* The request c
d400: 6f 75 6c 64 20 6e 6f 74 20 62 65 20 66 75 6c 66  ould not be fulf
d410: 69 6c 6c 65 64 20 75 73 69 6e 67 20 61 20 66 72  illed using a fr
d420: 65 65 6c 69 73 74 20 73 6c 6f 74 2e 20 20 43 68  eelist slot.  Ch
d430: 65 63 6b 0a 20 20 2a 2a 20 74 6f 20 73 65 65 20  eck.  ** to see 
d440: 69 66 20 64 65 66 72 61 67 6d 65 6e 74 61 74 69  if defragmentati
d450: 6f 6e 20 69 73 20 6e 65 63 65 73 73 61 72 79 2e  on is necessary.
d460: 0a 20 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65  .  */.  testcase
d470: 28 20 67 61 70 2b 32 2b 6e 42 79 74 65 3d 3d 74  ( gap+2+nByte==t
d480: 6f 70 20 29 3b 0a 20 20 69 66 28 20 67 61 70 2b  op );.  if( gap+
d490: 32 2b 6e 42 79 74 65 3e 74 6f 70 20 29 7b 0a 20  2+nByte>top ){. 
d4a0: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
d4b0: 2d 3e 6e 43 65 6c 6c 3e 30 20 7c 7c 20 43 4f 52  ->nCell>0 || COR
d4c0: 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 20 20 72  RUPT_DB );.    r
d4d0: 63 20 3d 20 64 65 66 72 61 67 6d 65 6e 74 50 61  c = defragmentPa
d4e0: 67 65 28 70 50 61 67 65 2c 20 4d 49 4e 28 34 2c  ge(pPage, MIN(4,
d4f0: 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2d 20   pPage->nFree - 
d500: 28 32 2b 6e 42 79 74 65 29 29 29 3b 0a 20 20 20  (2+nByte)));.   
d510: 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
d520: 20 72 63 3b 0a 20 20 20 20 74 6f 70 20 3d 20 67   rc;.    top = g
d530: 65 74 32 62 79 74 65 4e 6f 74 5a 65 72 6f 28 26  et2byteNotZero(&
d540: 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20  data[hdr+5]);.  
d550: 20 20 61 73 73 65 72 74 28 20 67 61 70 2b 32 2b    assert( gap+2+
d560: 6e 42 79 74 65 3c 3d 74 6f 70 20 29 3b 0a 20 20  nByte<=top );.  
d570: 7d 0a 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  }...  /* Allocat
d580: 65 20 6d 65 6d 6f 72 79 20 66 72 6f 6d 20 74 68  e memory from th
d590: 65 20 67 61 70 20 69 6e 20 62 65 74 77 65 65 6e  e gap in between
d5a0: 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65   the cell pointe
d5b0: 72 20 61 72 72 61 79 0a 20 20 2a 2a 20 61 6e 64  r array.  ** and
d5c0: 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
d5d0: 74 20 61 72 65 61 2e 20 20 54 68 65 20 62 74 72  t area.  The btr
d5e0: 65 65 49 6e 69 74 50 61 67 65 28 29 20 63 61 6c  eeInitPage() cal
d5f0: 6c 20 68 61 73 20 61 6c 72 65 61 64 79 0a 20 20  l has already.  
d600: 2a 2a 20 76 61 6c 69 64 61 74 65 64 20 74 68 65  ** validated the
d610: 20 66 72 65 65 6c 69 73 74 2e 20 20 47 69 76 65   freelist.  Give
d620: 6e 20 74 68 61 74 20 74 68 65 20 66 72 65 65 6c  n that the freel
d630: 69 73 74 20 69 73 20 76 61 6c 69 64 2c 20 74 68  ist is valid, th
d640: 65 72 65 0a 20 20 2a 2a 20 69 73 20 6e 6f 20 77  ere.  ** is no w
d650: 61 79 20 74 68 61 74 20 74 68 65 20 61 6c 6c 6f  ay that the allo
d660: 63 61 74 69 6f 6e 20 63 61 6e 20 65 78 74 65 6e  cation can exten
d670: 64 20 6f 66 66 20 74 68 65 20 65 6e 64 20 6f 66  d off the end of
d680: 20 74 68 65 20 70 61 67 65 2e 0a 20 20 2a 2a 20   the page..  ** 
d690: 54 68 65 20 61 73 73 65 72 74 28 29 20 62 65 6c  The assert() bel
d6a0: 6f 77 20 76 65 72 69 66 69 65 73 20 74 68 65 20  ow verifies the 
d6b0: 70 72 65 76 69 6f 75 73 20 73 65 6e 74 65 6e 63  previous sentenc
d6c0: 65 2e 0a 20 20 2a 2f 0a 20 20 74 6f 70 20 2d 3d  e..  */.  top -=
d6d0: 20 6e 42 79 74 65 3b 0a 20 20 70 75 74 32 62 79   nByte;.  put2by
d6e0: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c  te(&data[hdr+5],
d6f0: 20 74 6f 70 29 3b 0a 20 20 61 73 73 65 72 74 28   top);.  assert(
d700: 20 74 6f 70 2b 6e 42 79 74 65 20 3c 3d 20 28 69   top+nByte <= (i
d710: 6e 74 29 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75  nt)pPage->pBt->u
d720: 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 2a  sableSize );.  *
d730: 70 49 64 78 20 3d 20 74 6f 70 3b 0a 20 20 72 65  pIdx = top;.  re
d740: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
d750: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
d760: 61 20 73 65 63 74 69 6f 6e 20 6f 66 20 74 68 65  a section of the
d770: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 74 6f   pPage->aData to
d780: 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 0a 2a   the freelist..*
d790: 2a 20 54 68 65 20 66 69 72 73 74 20 62 79 74 65  * The first byte
d7a0: 20 6f 66 20 74 68 65 20 6e 65 77 20 66 72 65 65   of the new free
d7b0: 20 62 6c 6f 63 6b 20 69 73 20 70 50 61 67 65 2d   block is pPage-
d7c0: 3e 61 44 61 74 61 5b 69 53 74 61 72 74 5d 0a 2a  >aData[iStart].*
d7d0: 2a 20 61 6e 64 20 74 68 65 20 73 69 7a 65 20 6f  * and the size o
d7e0: 66 20 74 68 65 20 62 6c 6f 63 6b 20 69 73 20 69  f the block is i
d7f0: 53 69 7a 65 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a  Size bytes..**.*
d800: 2a 20 41 64 6a 61 63 65 6e 74 20 66 72 65 65 62  * Adjacent freeb
d810: 6c 6f 63 6b 73 20 61 72 65 20 63 6f 61 6c 65 73  locks are coales
d820: 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20  ced..**.** Note 
d830: 74 68 61 74 20 65 76 65 6e 20 74 68 6f 75 67 68  that even though
d840: 20 74 68 65 20 66 72 65 65 62 6c 6f 63 6b 20 6c   the freeblock l
d850: 69 73 74 20 77 61 73 20 63 68 65 63 6b 65 64 20  ist was checked 
d860: 62 79 20 62 74 72 65 65 49 6e 69 74 50 61 67 65  by btreeInitPage
d870: 28 29 2c 0a 2a 2a 20 74 68 61 74 20 72 6f 75 74  (),.** that rout
d880: 69 6e 65 20 77 69 6c 6c 20 6e 6f 74 20 64 65 74  ine will not det
d890: 65 63 74 20 6f 76 65 72 6c 61 70 20 62 65 74 77  ect overlap betw
d8a0: 65 65 6e 20 63 65 6c 6c 73 20 6f 72 20 66 72 65  een cells or fre
d8b0: 65 62 6c 6f 63 6b 73 2e 20 20 4e 6f 72 0a 2a 2a  eblocks.  Nor.**
d8c0: 20 64 6f 65 73 20 69 74 20 64 65 74 65 63 74 20   does it detect 
d8d0: 63 65 6c 6c 73 20 6f 72 20 66 72 65 65 62 6c 6f  cells or freeblo
d8e0: 63 6b 73 20 74 68 61 74 20 65 6e 63 72 6f 75 63  cks that encrouc
d8f0: 68 20 69 6e 74 6f 20 74 68 65 20 72 65 73 65 72  h into the reser
d900: 76 65 64 20 62 79 74 65 73 0a 2a 2a 20 61 74 20  ved bytes.** at 
d910: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70  the end of the p
d920: 61 67 65 2e 20 20 53 6f 20 64 6f 20 61 64 64 69  age.  So do addi
d930: 74 69 6f 6e 61 6c 20 63 6f 72 72 75 70 74 69 6f  tional corruptio
d940: 6e 20 63 68 65 63 6b 73 20 69 6e 73 69 64 65 20  n checks inside 
d950: 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  this.** routine 
d960: 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54  and return SQLIT
d970: 45 5f 43 4f 52 52 55 50 54 20 69 66 20 61 6e 79  E_CORRUPT if any
d980: 20 70 72 6f 62 6c 65 6d 73 20 61 72 65 20 66 6f   problems are fo
d990: 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  und..*/.static i
d9a0: 6e 74 20 66 72 65 65 53 70 61 63 65 28 4d 65 6d  nt freeSpace(Mem
d9b0: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75 31 36  Page *pPage, u16
d9c0: 20 69 53 74 61 72 74 2c 20 75 31 36 20 69 53 69   iStart, u16 iSi
d9d0: 7a 65 29 7b 0a 20 20 75 31 36 20 69 50 74 72 3b  ze){.  u16 iPtr;
d9e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d9f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
da00: 41 64 64 72 65 73 73 20 6f 66 20 70 74 72 20 74  Address of ptr t
da10: 6f 20 6e 65 78 74 20 66 72 65 65 62 6c 6f 63 6b  o next freeblock
da20: 20 2a 2f 0a 20 20 75 31 36 20 69 46 72 65 65 42   */.  u16 iFreeB
da30: 6c 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  lk;             
da40: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
da50: 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 6e 65  ddress of the ne
da60: 78 74 20 66 72 65 65 62 6c 6f 63 6b 20 2a 2f 0a  xt freeblock */.
da70: 20 20 75 38 20 68 64 72 3b 20 20 20 20 20 20 20    u8 hdr;       
da80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
da90: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
daa0: 68 65 61 64 65 72 20 73 69 7a 65 2e 20 20 30 20  header size.  0 
dab0: 6f 72 20 31 30 30 20 2a 2f 0a 20 20 75 38 20 6e  or 100 */.  u8 n
dac0: 46 72 61 67 20 3d 20 30 3b 20 20 20 20 20 20 20  Frag = 0;       
dad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dae0: 20 20 2f 2a 20 52 65 64 75 63 74 69 6f 6e 20 69    /* Reduction i
daf0: 6e 20 66 72 61 67 6d 65 6e 74 61 74 69 6f 6e 20  n fragmentation 
db00: 2a 2f 0a 20 20 75 31 36 20 69 4f 72 69 67 53 69  */.  u16 iOrigSi
db10: 7a 65 20 3d 20 69 53 69 7a 65 3b 20 20 20 20 20  ze = iSize;     
db20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72             /* Or
db30: 69 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20  iginal value of 
db40: 69 53 69 7a 65 20 2a 2f 0a 20 20 75 33 32 20 69  iSize */.  u32 i
db50: 4c 61 73 74 20 3d 20 70 50 61 67 65 2d 3e 70 42  Last = pPage->pB
db60: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34 3b  t->usableSize-4;
db70: 20 2f 2a 20 4c 61 72 67 65 73 74 20 70 6f 73 73   /* Largest poss
db80: 69 62 6c 65 20 66 72 65 65 62 6c 6f 63 6b 20 6f  ible freeblock o
db90: 66 66 73 65 74 20 2a 2f 0a 20 20 75 33 32 20 69  ffset */.  u32 i
dba0: 45 6e 64 20 3d 20 69 53 74 61 72 74 20 2b 20 69  End = iStart + i
dbb0: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
dbc0: 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 70   /* First byte p
dbd0: 61 73 74 20 74 68 65 20 69 53 74 61 72 74 20 62  ast the iStart b
dbe0: 75 66 66 65 72 20 2a 2f 0a 20 20 75 6e 73 69 67  uffer */.  unsig
dbf0: 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61 20 3d  ned char *data =
dc00: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 20 20   pPage->aData;  
dc10: 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 65 6e 74   /* Page content
dc20: 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
dc30: 50 61 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a  Page->pBt!=0 );.
dc40: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
dc50: 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
dc60: 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
dc70: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43  ) );.  assert( C
dc80: 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20 69 53 74  ORRUPT_DB || iSt
dc90: 61 72 74 3e 3d 70 50 61 67 65 2d 3e 68 64 72 4f  art>=pPage->hdrO
dca0: 66 66 73 65 74 2b 36 2b 70 50 61 67 65 2d 3e 63  ffset+6+pPage->c
dcb0: 68 69 6c 64 50 74 72 53 69 7a 65 20 29 3b 0a 20  hildPtrSize );. 
dcc0: 20 61 73 73 65 72 74 28 20 43 4f 52 52 55 50 54   assert( CORRUPT
dcd0: 5f 44 42 20 7c 7c 20 69 45 6e 64 20 3c 3d 20 70  _DB || iEnd <= p
dce0: 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
dcf0: 65 53 69 7a 65 20 29 3b 0a 20 20 61 73 73 65 72  eSize );.  asser
dd00: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
dd10: 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
dd20: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
dd30: 73 65 72 74 28 20 69 53 69 7a 65 3e 3d 34 20 29  sert( iSize>=4 )
dd40: 3b 20 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63  ;   /* Minimum c
dd50: 65 6c 6c 20 73 69 7a 65 20 69 73 20 34 20 2a 2f  ell size is 4 */
dd60: 0a 20 20 61 73 73 65 72 74 28 20 69 53 74 61 72  .  assert( iStar
dd70: 74 3c 3d 69 4c 61 73 74 20 29 3b 0a 0a 20 20 2f  t<=iLast );..  /
dd80: 2a 20 4f 76 65 72 77 72 69 74 65 20 64 65 6c 65  * Overwrite dele
dd90: 74 65 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ted information 
dda0: 77 69 74 68 20 7a 65 72 6f 73 20 77 68 65 6e 20  with zeros when 
ddb0: 74 68 65 20 73 65 63 75 72 65 5f 64 65 6c 65 74  the secure_delet
ddc0: 65 0a 20 20 2a 2a 20 6f 70 74 69 6f 6e 20 69 73  e.  ** option is
ddd0: 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 20 20 69 66   enabled */.  if
dde0: 28 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 62 74  ( pPage->pBt->bt
ddf0: 73 46 6c 61 67 73 20 26 20 42 54 53 5f 53 45 43  sFlags & BTS_SEC
de00: 55 52 45 5f 44 45 4c 45 54 45 20 29 7b 0a 20 20  URE_DELETE ){.  
de10: 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 69    memset(&data[i
de20: 53 74 61 72 74 5d 2c 20 30 2c 20 69 53 69 7a 65  Start], 0, iSize
de30: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65  );.  }..  /* The
de40: 20 6c 69 73 74 20 6f 66 20 66 72 65 65 62 6c 6f   list of freeblo
de50: 63 6b 73 20 6d 75 73 74 20 62 65 20 69 6e 20 61  cks must be in a
de60: 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 20  scending order. 
de70: 20 46 69 6e 64 20 74 68 65 20 0a 20 20 2a 2a 20   Find the .  ** 
de80: 73 70 6f 74 20 6f 6e 20 74 68 65 20 6c 69 73 74  spot on the list
de90: 20 77 68 65 72 65 20 69 53 74 61 72 74 20 73 68   where iStart sh
dea0: 6f 75 6c 64 20 62 65 20 69 6e 73 65 72 74 65 64  ould be inserted
deb0: 2e 0a 20 20 2a 2f 0a 20 20 68 64 72 20 3d 20 70  ..  */.  hdr = p
dec0: 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b  Page->hdrOffset;
ded0: 0a 20 20 69 50 74 72 20 3d 20 68 64 72 20 2b 20  .  iPtr = hdr + 
dee0: 31 3b 0a 20 20 69 66 28 20 64 61 74 61 5b 69 50  1;.  if( data[iP
def0: 74 72 2b 31 5d 3d 3d 30 20 26 26 20 64 61 74 61  tr+1]==0 && data
df00: 5b 69 50 74 72 5d 3d 3d 30 20 29 7b 0a 20 20 20  [iPtr]==0 ){.   
df10: 20 69 46 72 65 65 42 6c 6b 20 3d 20 30 3b 20 20   iFreeBlk = 0;  
df20: 2f 2a 20 53 68 6f 72 74 63 75 74 20 66 6f 72 20  /* Shortcut for 
df30: 74 68 65 20 63 61 73 65 20 77 68 65 6e 20 74 68  the case when th
df40: 65 20 66 72 65 65 6c 69 73 74 20 69 73 20 65 6d  e freelist is em
df50: 70 74 79 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a  pty */.  }else{.
df60: 20 20 20 20 77 68 69 6c 65 28 20 28 69 46 72 65      while( (iFre
df70: 65 42 6c 6b 20 3d 20 67 65 74 32 62 79 74 65 28  eBlk = get2byte(
df80: 26 64 61 74 61 5b 69 50 74 72 5d 29 29 3c 69 53  &data[iPtr]))<iS
df90: 74 61 72 74 20 29 7b 0a 20 20 20 20 20 20 69 66  tart ){.      if
dfa0: 28 20 69 46 72 65 65 42 6c 6b 3c 69 50 74 72 2b  ( iFreeBlk<iPtr+
dfb0: 34 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  4 ){.        if(
dfc0: 20 69 46 72 65 65 42 6c 6b 3d 3d 30 20 29 20 62   iFreeBlk==0 ) b
dfd0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 72 65  reak;.        re
dfe0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
dff0: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
e000: 7d 0a 20 20 20 20 20 20 69 50 74 72 20 3d 20 69  }.      iPtr = i
e010: 46 72 65 65 42 6c 6b 3b 0a 20 20 20 20 7d 0a 20  FreeBlk;.    }. 
e020: 20 20 20 69 66 28 20 69 46 72 65 65 42 6c 6b 3e     if( iFreeBlk>
e030: 69 4c 61 73 74 20 29 20 72 65 74 75 72 6e 20 53  iLast ) return S
e040: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
e050: 50 54 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  PT;.    assert( 
e060: 69 46 72 65 65 42 6c 6b 3e 69 50 74 72 20 7c 7c  iFreeBlk>iPtr ||
e070: 20 69 46 72 65 65 42 6c 6b 3d 3d 30 20 29 3b 0a   iFreeBlk==0 );.
e080: 20 20 0a 20 20 20 20 2f 2a 20 41 74 20 74 68 69    .    /* At thi
e090: 73 20 70 6f 69 6e 74 3a 0a 20 20 20 20 2a 2a 20  s point:.    ** 
e0a0: 20 20 20 69 46 72 65 65 42 6c 6b 3a 20 20 20 46     iFreeBlk:   F
e0b0: 69 72 73 74 20 66 72 65 65 62 6c 6f 63 6b 20 61  irst freeblock a
e0c0: 66 74 65 72 20 69 53 74 61 72 74 2c 20 6f 72 20  fter iStart, or 
e0d0: 7a 65 72 6f 20 69 66 20 6e 6f 6e 65 0a 20 20 20  zero if none.   
e0e0: 20 2a 2a 20 20 20 20 69 50 74 72 3a 20 20 20 20   **    iPtr:    
e0f0: 20 20 20 54 68 65 20 61 64 64 72 65 73 73 20 6f     The address o
e100: 66 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 69  f a pointer to i
e110: 46 72 65 65 42 6c 6b 0a 20 20 20 20 2a 2a 0a 20  FreeBlk.    **. 
e120: 20 20 20 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73     ** Check to s
e130: 65 65 20 69 66 20 69 46 72 65 65 42 6c 6b 20 73  ee if iFreeBlk s
e140: 68 6f 75 6c 64 20 62 65 20 63 6f 61 6c 65 73 63  hould be coalesc
e150: 65 64 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20  ed onto the end 
e160: 6f 66 20 69 53 74 61 72 74 2e 0a 20 20 20 20 2a  of iStart..    *
e170: 2f 0a 20 20 20 20 69 66 28 20 69 46 72 65 65 42  /.    if( iFreeB
e180: 6c 6b 20 26 26 20 69 45 6e 64 2b 33 3e 3d 69 46  lk && iEnd+3>=iF
e190: 72 65 65 42 6c 6b 20 29 7b 0a 20 20 20 20 20 20  reeBlk ){.      
e1a0: 6e 46 72 61 67 20 3d 20 69 46 72 65 65 42 6c 6b  nFrag = iFreeBlk
e1b0: 20 2d 20 69 45 6e 64 3b 0a 20 20 20 20 20 20 69   - iEnd;.      i
e1c0: 66 28 20 69 45 6e 64 3e 69 46 72 65 65 42 6c 6b  f( iEnd>iFreeBlk
e1d0: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
e1e0: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
e1f0: 20 20 20 20 20 69 45 6e 64 20 3d 20 69 46 72 65       iEnd = iFre
e200: 65 42 6c 6b 20 2b 20 67 65 74 32 62 79 74 65 28  eBlk + get2byte(
e210: 26 64 61 74 61 5b 69 46 72 65 65 42 6c 6b 2b 32  &data[iFreeBlk+2
e220: 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 45  ]);.      if( iE
e230: 6e 64 20 3e 20 70 50 61 67 65 2d 3e 70 42 74 2d  nd > pPage->pBt-
e240: 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 20 72 65  >usableSize ) re
e250: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
e260: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
e270: 69 53 69 7a 65 20 3d 20 69 45 6e 64 20 2d 20 69  iSize = iEnd - i
e280: 53 74 61 72 74 3b 0a 20 20 20 20 20 20 69 46 72  Start;.      iFr
e290: 65 65 42 6c 6b 20 3d 20 67 65 74 32 62 79 74 65  eeBlk = get2byte
e2a0: 28 26 64 61 74 61 5b 69 46 72 65 65 42 6c 6b 5d  (&data[iFreeBlk]
e2b0: 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20  );.    }.  .    
e2c0: 2f 2a 20 49 66 20 69 50 74 72 20 69 73 20 61 6e  /* If iPtr is an
e2d0: 6f 74 68 65 72 20 66 72 65 65 62 6c 6f 63 6b 20  other freeblock 
e2e0: 28 74 68 61 74 20 69 73 2c 20 69 66 20 69 50 74  (that is, if iPt
e2f0: 72 20 69 73 20 6e 6f 74 20 74 68 65 20 66 72 65  r is not the fre
e300: 65 6c 69 73 74 0a 20 20 20 20 2a 2a 20 70 6f 69  elist.    ** poi
e310: 6e 74 65 72 20 69 6e 20 74 68 65 20 70 61 67 65  nter in the page
e320: 20 68 65 61 64 65 72 29 20 74 68 65 6e 20 63 68   header) then ch
e330: 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 69 53  eck to see if iS
e340: 74 61 72 74 20 73 68 6f 75 6c 64 20 62 65 0a 20  tart should be. 
e350: 20 20 20 2a 2a 20 63 6f 61 6c 65 73 63 65 64 20     ** coalesced 
e360: 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  onto the end of 
e370: 69 50 74 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  iPtr..    */.   
e380: 20 69 66 28 20 69 50 74 72 3e 68 64 72 2b 31 20   if( iPtr>hdr+1 
e390: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 50 74  ){.      int iPt
e3a0: 72 45 6e 64 20 3d 20 69 50 74 72 20 2b 20 67 65  rEnd = iPtr + ge
e3b0: 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 50 74  t2byte(&data[iPt
e3c0: 72 2b 32 5d 29 3b 0a 20 20 20 20 20 20 69 66 28  r+2]);.      if(
e3d0: 20 69 50 74 72 45 6e 64 2b 33 3e 3d 69 53 74 61   iPtrEnd+3>=iSta
e3e0: 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  rt ){.        if
e3f0: 28 20 69 50 74 72 45 6e 64 3e 69 53 74 61 72 74  ( iPtrEnd>iStart
e400: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
e410: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
e420: 20 20 20 20 20 20 20 6e 46 72 61 67 20 2b 3d 20         nFrag += 
e430: 69 53 74 61 72 74 20 2d 20 69 50 74 72 45 6e 64  iStart - iPtrEnd
e440: 3b 0a 20 20 20 20 20 20 20 20 69 53 69 7a 65 20  ;.        iSize 
e450: 3d 20 69 45 6e 64 20 2d 20 69 50 74 72 3b 0a 20  = iEnd - iPtr;. 
e460: 20 20 20 20 20 20 20 69 53 74 61 72 74 20 3d 20         iStart = 
e470: 69 50 74 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20  iPtr;.      }.  
e480: 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 46 72 61    }.    if( nFra
e490: 67 3e 64 61 74 61 5b 68 64 72 2b 37 5d 20 29 20  g>data[hdr+7] ) 
e4a0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
e4b0: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
e4c0: 64 61 74 61 5b 68 64 72 2b 37 5d 20 2d 3d 20 6e  data[hdr+7] -= n
e4d0: 46 72 61 67 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Frag;.  }.  if( 
e4e0: 69 53 74 61 72 74 3d 3d 67 65 74 32 62 79 74 65  iStart==get2byte
e4f0: 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 20 29  (&data[hdr+5]) )
e500: 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 77  {.    /* The new
e510: 20 66 72 65 65 62 6c 6f 63 6b 20 69 73 20 61 74   freeblock is at
e520: 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
e530: 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  f the cell conte
e540: 6e 74 20 61 72 65 61 2c 0a 20 20 20 20 2a 2a 20  nt area,.    ** 
e550: 73 6f 20 6a 75 73 74 20 65 78 74 65 6e 64 20 74  so just extend t
e560: 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
e570: 61 72 65 61 20 72 61 74 68 65 72 20 74 68 61 6e  area rather than
e580: 20 63 72 65 61 74 65 20 61 6e 6f 74 68 65 72 0a   create another.
e590: 20 20 20 20 2a 2a 20 66 72 65 65 6c 69 73 74 20      ** freelist 
e5a0: 65 6e 74 72 79 20 2a 2f 0a 20 20 20 20 69 66 28  entry */.    if(
e5b0: 20 69 50 74 72 21 3d 68 64 72 2b 31 20 29 20 72   iPtr!=hdr+1 ) r
e5c0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
e5d0: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 70  RUPT_BKPT;.    p
e5e0: 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  ut2byte(&data[hd
e5f0: 72 2b 31 5d 2c 20 69 46 72 65 65 42 6c 6b 29 3b  r+1], iFreeBlk);
e600: 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64  .    put2byte(&d
e610: 61 74 61 5b 68 64 72 2b 35 5d 2c 20 69 45 6e 64  ata[hdr+5], iEnd
e620: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
e630: 2f 2a 20 49 6e 73 65 72 74 20 74 68 65 20 6e 65  /* Insert the ne
e640: 77 20 66 72 65 65 62 6c 6f 63 6b 20 69 6e 74 6f  w freeblock into
e650: 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 2a 2f   the freelist */
e660: 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64  .    put2byte(&d
e670: 61 74 61 5b 69 50 74 72 5d 2c 20 69 53 74 61 72  ata[iPtr], iStar
e680: 74 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65  t);.    put2byte
e690: 28 26 64 61 74 61 5b 69 53 74 61 72 74 5d 2c 20  (&data[iStart], 
e6a0: 69 46 72 65 65 42 6c 6b 29 3b 0a 20 20 20 20 70  iFreeBlk);.    p
e6b0: 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 53  ut2byte(&data[iS
e6c0: 74 61 72 74 2b 32 5d 2c 20 69 53 69 7a 65 29 3b  tart+2], iSize);
e6d0: 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e 6e 46  .  }.  pPage->nF
e6e0: 72 65 65 20 2b 3d 20 69 4f 72 69 67 53 69 7a 65  ree += iOrigSize
e6f0: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
e700: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  E_OK;.}../*.** D
e710: 65 63 6f 64 65 20 74 68 65 20 66 6c 61 67 73 20  ecode the flags 
e720: 62 79 74 65 20 28 74 68 65 20 66 69 72 73 74 20  byte (the first 
e730: 62 79 74 65 20 6f 66 20 74 68 65 20 68 65 61 64  byte of the head
e740: 65 72 29 20 66 6f 72 20 61 20 70 61 67 65 0a 2a  er) for a page.*
e750: 2a 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65  * and initialize
e760: 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 4d   fields of the M
e770: 65 6d 50 61 67 65 20 73 74 72 75 63 74 75 72 65  emPage structure
e780: 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 0a 2a 2a   accordingly..**
e790: 0a 2a 2a 20 4f 6e 6c 79 20 74 68 65 20 66 6f 6c  .** Only the fol
e7a0: 6c 6f 77 69 6e 67 20 63 6f 6d 62 69 6e 61 74 69  lowing combinati
e7b0: 6f 6e 73 20 61 72 65 20 73 75 70 70 6f 72 74 65  ons are supporte
e7c0: 64 2e 20 20 41 6e 79 74 68 69 6e 67 20 64 69 66  d.  Anything dif
e7d0: 66 65 72 65 6e 74 0a 2a 2a 20 69 6e 64 69 63 61  ferent.** indica
e7e0: 74 65 73 20 61 20 63 6f 72 72 75 70 74 20 64 61  tes a corrupt da
e7f0: 74 61 62 61 73 65 20 66 69 6c 65 73 3a 0a 2a 2a  tabase files:.**
e800: 0a 2a 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f  .**         PTF_
e810: 5a 45 52 4f 44 41 54 41 0a 2a 2a 20 20 20 20 20  ZERODATA.**     
e820: 20 20 20 20 50 54 46 5f 5a 45 52 4f 44 41 54 41      PTF_ZERODATA
e830: 20 7c 20 50 54 46 5f 4c 45 41 46 0a 2a 2a 20 20   | PTF_LEAF.**  
e840: 20 20 20 20 20 20 20 50 54 46 5f 4c 45 41 46 44         PTF_LEAFD
e850: 41 54 41 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59  ATA | PTF_INTKEY
e860: 0a 2a 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f  .**         PTF_
e870: 4c 45 41 46 44 41 54 41 20 7c 20 50 54 46 5f 49  LEAFDATA | PTF_I
e880: 4e 54 4b 45 59 20 7c 20 50 54 46 5f 4c 45 41 46  NTKEY | PTF_LEAF
e890: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64  .*/.static int d
e8a0: 65 63 6f 64 65 46 6c 61 67 73 28 4d 65 6d 50 61  ecodeFlags(MemPa
e8b0: 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 66  ge *pPage, int f
e8c0: 6c 61 67 42 79 74 65 29 7b 0a 20 20 42 74 53 68  lagByte){.  BtSh
e8d0: 61 72 65 64 20 2a 70 42 74 3b 20 20 20 20 20 2f  ared *pBt;     /
e8e0: 2a 20 41 20 63 6f 70 79 20 6f 66 20 70 50 61 67  * A copy of pPag
e8f0: 65 2d 3e 70 42 74 20 2a 2f 0a 0a 20 20 61 73 73  e->pBt */..  ass
e900: 65 72 74 28 20 70 50 61 67 65 2d 3e 68 64 72 4f  ert( pPage->hdrO
e910: 66 66 73 65 74 3d 3d 28 70 50 61 67 65 2d 3e 70  ffset==(pPage->p
e920: 67 6e 6f 3d 3d 31 20 3f 20 31 30 30 20 3a 20 30  gno==1 ? 100 : 0
e930: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
e940: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
e950: 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
e960: 74 65 78 29 20 29 3b 0a 20 20 70 50 61 67 65 2d  tex) );.  pPage-
e970: 3e 6c 65 61 66 20 3d 20 28 75 38 29 28 66 6c 61  >leaf = (u8)(fla
e980: 67 42 79 74 65 3e 3e 33 29 3b 20 20 61 73 73 65  gByte>>3);  asse
e990: 72 74 28 20 50 54 46 5f 4c 45 41 46 20 3d 3d 20  rt( PTF_LEAF == 
e9a0: 31 3c 3c 33 20 29 3b 0a 20 20 66 6c 61 67 42 79  1<<3 );.  flagBy
e9b0: 74 65 20 26 3d 20 7e 50 54 46 5f 4c 45 41 46 3b  te &= ~PTF_LEAF;
e9c0: 0a 20 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50  .  pPage->childP
e9d0: 74 72 53 69 7a 65 20 3d 20 34 2d 34 2a 70 50 61  trSize = 4-4*pPa
e9e0: 67 65 2d 3e 6c 65 61 66 3b 0a 20 20 70 50 61 67  ge->leaf;.  pPag
e9f0: 65 2d 3e 78 43 65 6c 6c 53 69 7a 65 20 3d 20 63  e->xCellSize = c
ea00: 65 6c 6c 53 69 7a 65 50 74 72 3b 0a 20 20 70 42  ellSizePtr;.  pB
ea10: 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a  t = pPage->pBt;.
ea20: 20 20 69 66 28 20 66 6c 61 67 42 79 74 65 3d 3d    if( flagByte==
ea30: 28 50 54 46 5f 4c 45 41 46 44 41 54 41 20 7c 20  (PTF_LEAFDATA | 
ea40: 50 54 46 5f 49 4e 54 4b 45 59 29 20 29 7b 0a 20  PTF_INTKEY) ){. 
ea50: 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
ea60: 46 3a 20 52 2d 30 37 32 39 31 2d 33 35 33 32 38  F: R-07291-35328
ea70: 20 41 20 76 61 6c 75 65 20 6f 66 20 35 20 28 30   A value of 5 (0
ea80: 78 30 35 29 20 6d 65 61 6e 73 20 74 68 65 20 70  x05) means the p
ea90: 61 67 65 20 69 73 20 61 6e 0a 20 20 20 20 2a 2a  age is an.    **
eaa0: 20 69 6e 74 65 72 69 6f 72 20 74 61 62 6c 65 20   interior table 
eab0: 62 2d 74 72 65 65 20 70 61 67 65 2e 20 2a 2f 0a  b-tree page. */.
eac0: 20 20 20 20 61 73 73 65 72 74 28 20 28 50 54 46      assert( (PTF
ead0: 5f 4c 45 41 46 44 41 54 41 7c 50 54 46 5f 49 4e  _LEAFDATA|PTF_IN
eae0: 54 4b 45 59 29 3d 3d 35 20 29 3b 0a 20 20 20 20  TKEY)==5 );.    
eaf0: 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
eb00: 52 2d 32 36 39 30 30 2d 30 39 31 37 36 20 41 20  R-26900-09176 A 
eb10: 76 61 6c 75 65 20 6f 66 20 31 33 20 28 30 78 30  value of 13 (0x0
eb20: 64 29 20 6d 65 61 6e 73 20 74 68 65 20 70 61 67  d) means the pag
eb30: 65 20 69 73 20 61 0a 20 20 20 20 2a 2a 20 6c 65  e is a.    ** le
eb40: 61 66 20 74 61 62 6c 65 20 62 2d 74 72 65 65 20  af table b-tree 
eb50: 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73  page. */.    ass
eb60: 65 72 74 28 20 28 50 54 46 5f 4c 45 41 46 44 41  ert( (PTF_LEAFDA
eb70: 54 41 7c 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54  TA|PTF_INTKEY|PT
eb80: 46 5f 4c 45 41 46 29 3d 3d 31 33 20 29 3b 0a 20  F_LEAF)==13 );. 
eb90: 20 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79     pPage->intKey
eba0: 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 70 50   = 1;.    if( pP
ebb0: 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
ebc0: 20 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79     pPage->intKey
ebd0: 4c 65 61 66 20 3d 20 31 3b 0a 20 20 20 20 20 20  Leaf = 1;.      
ebe0: 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c  pPage->xParseCel
ebf0: 6c 20 3d 20 62 74 72 65 65 50 61 72 73 65 43 65  l = btreeParseCe
ec00: 6c 6c 50 74 72 3b 0a 20 20 20 20 7d 65 6c 73 65  llPtr;.    }else
ec10: 7b 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e 69  {.      pPage->i
ec20: 6e 74 4b 65 79 4c 65 61 66 20 3d 20 30 3b 0a 20  ntKeyLeaf = 0;. 
ec30: 20 20 20 20 20 70 50 61 67 65 2d 3e 78 43 65 6c       pPage->xCel
ec40: 6c 53 69 7a 65 20 3d 20 63 65 6c 6c 53 69 7a 65  lSize = cellSize
ec50: 50 74 72 4e 6f 50 61 79 6c 6f 61 64 3b 0a 20 20  PtrNoPayload;.  
ec60: 20 20 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73      pPage->xPars
ec70: 65 43 65 6c 6c 20 3d 20 62 74 72 65 65 50 61 72  eCell = btreePar
ec80: 73 65 43 65 6c 6c 50 74 72 4e 6f 50 61 79 6c 6f  seCellPtrNoPaylo
ec90: 61 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50  ad;.    }.    pP
eca0: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20  age->maxLocal = 
ecb0: 70 42 74 2d 3e 6d 61 78 4c 65 61 66 3b 0a 20 20  pBt->maxLeaf;.  
ecc0: 20 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61    pPage->minLoca
ecd0: 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e 4c 65 61 66  l = pBt->minLeaf
ece0: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c  ;.  }else if( fl
ecf0: 61 67 42 79 74 65 3d 3d 50 54 46 5f 5a 45 52 4f  agByte==PTF_ZERO
ed00: 44 41 54 41 20 29 7b 0a 20 20 20 20 2f 2a 20 45  DATA ){.    /* E
ed10: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 33  VIDENCE-OF: R-43
ed20: 33 31 36 2d 33 37 33 30 38 20 41 20 76 61 6c 75  316-37308 A valu
ed30: 65 20 6f 66 20 32 20 28 30 78 30 32 29 20 6d 65  e of 2 (0x02) me
ed40: 61 6e 73 20 74 68 65 20 70 61 67 65 20 69 73 20  ans the page is 
ed50: 61 6e 0a 20 20 20 20 2a 2a 20 69 6e 74 65 72 69  an.    ** interi
ed60: 6f 72 20 69 6e 64 65 78 20 62 2d 74 72 65 65 20  or index b-tree 
ed70: 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73  page. */.    ass
ed80: 65 72 74 28 20 28 50 54 46 5f 5a 45 52 4f 44 41  ert( (PTF_ZERODA
ed90: 54 41 29 3d 3d 32 20 29 3b 0a 20 20 20 20 2f 2a  TA)==2 );.    /*
eda0: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
edb0: 35 39 36 31 35 2d 34 32 38 32 38 20 41 20 76 61  59615-42828 A va
edc0: 6c 75 65 20 6f 66 20 31 30 20 28 30 78 30 61 29  lue of 10 (0x0a)
edd0: 20 6d 65 61 6e 73 20 74 68 65 20 70 61 67 65 20   means the page 
ede0: 69 73 20 61 0a 20 20 20 20 2a 2a 20 6c 65 61 66  is a.    ** leaf
edf0: 20 69 6e 64 65 78 20 62 2d 74 72 65 65 20 70 61   index b-tree pa
ee00: 67 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  ge. */.    asser
ee10: 74 28 20 28 50 54 46 5f 5a 45 52 4f 44 41 54 41  t( (PTF_ZERODATA
ee20: 7c 50 54 46 5f 4c 45 41 46 29 3d 3d 31 30 20 29  |PTF_LEAF)==10 )
ee30: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74  ;.    pPage->int
ee40: 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20 70 50 61  Key = 0;.    pPa
ee50: 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20 3d  ge->intKeyLeaf =
ee60: 20 30 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 78   0;.    pPage->x
ee70: 50 61 72 73 65 43 65 6c 6c 20 3d 20 62 74 72 65  ParseCell = btre
ee80: 65 50 61 72 73 65 43 65 6c 6c 50 74 72 49 6e 64  eParseCellPtrInd
ee90: 65 78 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d  ex;.    pPage->m
eea0: 61 78 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d  axLocal = pBt->m
eeb0: 61 78 4c 6f 63 61 6c 3b 0a 20 20 20 20 70 50 61  axLocal;.    pPa
eec0: 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70  ge->minLocal = p
eed0: 42 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20  Bt->minLocal;.  
eee0: 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 45 56  }else{.    /* EV
eef0: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 37 36  IDENCE-OF: R-476
ef00: 30 38 2d 35 36 34 36 39 20 41 6e 79 20 6f 74 68  08-56469 Any oth
ef10: 65 72 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65  er value for the
ef20: 20 62 2d 74 72 65 65 20 70 61 67 65 20 74 79 70   b-tree page typ
ef30: 65 20 69 73 0a 20 20 20 20 2a 2a 20 61 6e 20 65  e is.    ** an e
ef40: 72 72 6f 72 2e 20 2a 2f 0a 20 20 20 20 72 65 74  rror. */.    ret
ef50: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
ef60: 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 70  PT_BKPT;.  }.  p
ef70: 50 61 67 65 2d 3e 6d 61 78 31 62 79 74 65 50 61  Page->max1bytePa
ef80: 79 6c 6f 61 64 20 3d 20 70 42 74 2d 3e 6d 61 78  yload = pBt->max
ef90: 31 62 79 74 65 50 61 79 6c 6f 61 64 3b 0a 20 20  1bytePayload;.  
efa0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
efb0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69  ;.}../*.** Initi
efc0: 61 6c 69 7a 65 20 74 68 65 20 61 75 78 69 6c 69  alize the auxili
efd0: 61 72 79 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ary information 
efe0: 66 6f 72 20 61 20 64 69 73 6b 20 62 6c 6f 63 6b  for a disk block
eff0: 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53  ..**.** Return S
f000: 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63  QLITE_OK on succ
f010: 65 73 73 2e 20 20 49 66 20 77 65 20 73 65 65 20  ess.  If we see 
f020: 74 68 61 74 20 74 68 65 20 70 61 67 65 20 64 6f  that the page do
f030: 65 73 0a 2a 2a 20 6e 6f 74 20 63 6f 6e 74 61 69  es.** not contai
f040: 6e 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20  n a well-formed 
f050: 64 61 74 61 62 61 73 65 20 70 61 67 65 2c 20 74  database page, t
f060: 68 65 6e 20 72 65 74 75 72 6e 20 0a 2a 2a 20 53  hen return .** S
f070: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2e 20 20  QLITE_CORRUPT.  
f080: 4e 6f 74 65 20 74 68 61 74 20 61 20 72 65 74 75  Note that a retu
f090: 72 6e 20 6f 66 20 53 51 4c 49 54 45 5f 4f 4b 20  rn of SQLITE_OK 
f0a0: 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 67 75 61 72  does not.** guar
f0b0: 61 6e 74 65 65 20 74 68 61 74 20 74 68 65 20 70  antee that the p
f0c0: 61 67 65 20 69 73 20 77 65 6c 6c 2d 66 6f 72 6d  age is well-form
f0d0: 65 64 2e 20 20 49 74 20 6f 6e 6c 79 20 73 68 6f  ed.  It only sho
f0e0: 77 73 20 74 68 61 74 0a 2a 2a 20 77 65 20 66 61  ws that.** we fa
f0f0: 69 6c 65 64 20 74 6f 20 64 65 74 65 63 74 20 61  iled to detect a
f100: 6e 79 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a  ny corruption..*
f110: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72  /.static int btr
f120: 65 65 49 6e 69 74 50 61 67 65 28 4d 65 6d 50 61  eeInitPage(MemPa
f130: 67 65 20 2a 70 50 61 67 65 29 7b 0a 0a 20 20 61  ge *pPage){..  a
f140: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42  ssert( pPage->pB
f150: 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  t!=0 );.  assert
f160: 28 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 64 62  ( pPage->pBt->db
f170: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
f180: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
f190: 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
f1a0: 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
f1b0: 72 74 28 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3d  rt( pPage->pgno=
f1c0: 3d 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67  =sqlite3PagerPag
f1d0: 65 6e 75 6d 62 65 72 28 70 50 61 67 65 2d 3e 70  enumber(pPage->p
f1e0: 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73  DbPage) );.  ass
f1f0: 65 72 74 28 20 70 50 61 67 65 20 3d 3d 20 73 71  ert( pPage == sq
f200: 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74  lite3PagerGetExt
f210: 72 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  ra(pPage->pDbPag
f220: 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  e) );.  assert( 
f230: 70 50 61 67 65 2d 3e 61 44 61 74 61 20 3d 3d 20  pPage->aData == 
f240: 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44  sqlite3PagerGetD
f250: 61 74 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ata(pPage->pDbPa
f260: 67 65 29 20 29 3b 0a 0a 20 20 69 66 28 20 21 70  ge) );..  if( !p
f270: 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 7b 0a  Page->isInit ){.
f280: 20 20 20 20 69 6e 74 20 70 63 3b 20 20 20 20 20      int pc;     
f290: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
f2a0: 73 20 6f 66 20 61 20 66 72 65 65 62 6c 6f 63 6b  s of a freeblock
f2b0: 20 77 69 74 68 69 6e 20 70 50 61 67 65 2d 3e 61   within pPage->a
f2c0: 44 61 74 61 5b 5d 20 2a 2f 0a 20 20 20 20 75 38  Data[] */.    u8
f2d0: 20 68 64 72 3b 20 20 20 20 20 20 20 20 20 20 20   hdr;           
f2e0: 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 62 65   /* Offset to be
f2f0: 67 69 6e 6e 69 6e 67 20 6f 66 20 70 61 67 65 20  ginning of page 
f300: 68 65 61 64 65 72 20 2a 2f 0a 20 20 20 20 75 38  header */.    u8
f310: 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20 20   *data;         
f320: 20 2f 2a 20 45 71 75 61 6c 20 74 6f 20 70 50 61   /* Equal to pPa
f330: 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20 20  ge->aData */.   
f340: 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20   BtShared *pBt; 
f350: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61         /* The ma
f360: 69 6e 20 62 74 72 65 65 20 73 74 72 75 63 74 75  in btree structu
f370: 72 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 75 73  re */.    int us
f380: 61 62 6c 65 53 69 7a 65 3b 20 20 20 20 2f 2a 20  ableSize;    /* 
f390: 41 6d 6f 75 6e 74 20 6f 66 20 75 73 61 62 6c 65  Amount of usable
f3a0: 20 73 70 61 63 65 20 6f 6e 20 65 61 63 68 20 70   space on each p
f3b0: 61 67 65 20 2a 2f 0a 20 20 20 20 75 31 36 20 63  age */.    u16 c
f3c0: 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20 20 2f 2a  ellOffset;    /*
f3d0: 20 4f 66 66 73 65 74 20 66 72 6f 6d 20 73 74 61   Offset from sta
f3e0: 72 74 20 6f 66 20 70 61 67 65 20 74 6f 20 66 69  rt of page to fi
f3f0: 72 73 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  rst cell pointer
f400: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 46 72 65   */.    int nFre
f410: 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  e;         /* Nu
f420: 6d 62 65 72 20 6f 66 20 75 6e 75 73 65 64 20 62  mber of unused b
f430: 79 74 65 73 20 6f 6e 20 74 68 65 20 70 61 67 65  ytes on the page
f440: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 74 6f 70 3b   */.    int top;
f450: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
f460: 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20  rst byte of the 
f470: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65  cell content are
f480: 61 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43 65  a */.    int iCe
f490: 6c 6c 46 69 72 73 74 3b 20 20 20 20 2f 2a 20 46  llFirst;    /* F
f4a0: 69 72 73 74 20 61 6c 6c 6f 77 61 62 6c 65 20 63  irst allowable c
f4b0: 65 6c 6c 20 6f 72 20 66 72 65 65 62 6c 6f 63 6b  ell or freeblock
f4c0: 20 6f 66 66 73 65 74 20 2a 2f 0a 20 20 20 20 69   offset */.    i
f4d0: 6e 74 20 69 43 65 6c 6c 4c 61 73 74 3b 20 20 20  nt iCellLast;   
f4e0: 20 20 2f 2a 20 4c 61 73 74 20 70 6f 73 73 69 62    /* Last possib
f4f0: 6c 65 20 63 65 6c 6c 20 6f 72 20 66 72 65 65 62  le cell or freeb
f500: 6c 6f 63 6b 20 6f 66 66 73 65 74 20 2a 2f 0a 0a  lock offset */..
f510: 20 20 20 20 70 42 74 20 3d 20 70 50 61 67 65 2d      pBt = pPage-
f520: 3e 70 42 74 3b 0a 0a 20 20 20 20 68 64 72 20 3d  >pBt;..    hdr =
f530: 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65   pPage->hdrOffse
f540: 74 3b 0a 20 20 20 20 64 61 74 61 20 3d 20 70 50  t;.    data = pP
f550: 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20  age->aData;.    
f560: 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
f570: 52 2d 32 38 35 39 34 2d 30 32 38 39 30 20 54 68  R-28594-02890 Th
f580: 65 20 6f 6e 65 2d 62 79 74 65 20 66 6c 61 67 20  e one-byte flag 
f590: 61 74 20 6f 66 66 73 65 74 20 30 20 69 6e 64 69  at offset 0 indi
f5a0: 63 61 74 69 6e 67 0a 20 20 20 20 2a 2a 20 74 68  cating.    ** th
f5b0: 65 20 62 2d 74 72 65 65 20 70 61 67 65 20 74 79  e b-tree page ty
f5c0: 70 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 64  pe. */.    if( d
f5d0: 65 63 6f 64 65 46 6c 61 67 73 28 70 50 61 67 65  ecodeFlags(pPage
f5e0: 2c 20 64 61 74 61 5b 68 64 72 5d 29 20 29 20 72  , data[hdr]) ) r
f5f0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
f600: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 61  RUPT_BKPT;.    a
f610: 73 73 65 72 74 28 20 70 42 74 2d 3e 70 61 67 65  ssert( pBt->page
f620: 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 42 74  Size>=512 && pBt
f630: 2d 3e 70 61 67 65 53 69 7a 65 3c 3d 36 35 35 33  ->pageSize<=6553
f640: 36 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  6 );.    pPage->
f650: 6d 61 73 6b 50 61 67 65 20 3d 20 28 75 31 36 29  maskPage = (u16)
f660: 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d  (pBt->pageSize -
f670: 20 31 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e   1);.    pPage->
f680: 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20  nOverflow = 0;. 
f690: 20 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20     usableSize = 
f6a0: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b  pBt->usableSize;
f6b0: 0a 20 20 20 20 70 50 61 67 65 2d 3e 63 65 6c 6c  .    pPage->cell
f6c0: 4f 66 66 73 65 74 20 3d 20 63 65 6c 6c 4f 66 66  Offset = cellOff
f6d0: 73 65 74 20 3d 20 68 64 72 20 2b 20 38 20 2b 20  set = hdr + 8 + 
f6e0: 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53  pPage->childPtrS
f6f0: 69 7a 65 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  ize;.    pPage->
f700: 61 44 61 74 61 45 6e 64 20 3d 20 26 64 61 74 61  aDataEnd = &data
f710: 5b 75 73 61 62 6c 65 53 69 7a 65 5d 3b 0a 20 20  [usableSize];.  
f720: 20 20 70 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64    pPage->aCellId
f730: 78 20 3d 20 26 64 61 74 61 5b 63 65 6c 6c 4f 66  x = &data[cellOf
f740: 66 73 65 74 5d 3b 0a 20 20 20 20 70 50 61 67 65  fset];.    pPage
f750: 2d 3e 61 44 61 74 61 4f 66 73 74 20 3d 20 26 64  ->aDataOfst = &d
f760: 61 74 61 5b 70 50 61 67 65 2d 3e 63 68 69 6c 64  ata[pPage->child
f770: 50 74 72 53 69 7a 65 5d 3b 0a 20 20 20 20 2f 2a  PtrSize];.    /*
f780: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
f790: 35 38 30 31 35 2d 34 38 31 37 35 20 54 68 65 20  58015-48175 The 
f7a0: 74 77 6f 2d 62 79 74 65 20 69 6e 74 65 67 65 72  two-byte integer
f7b0: 20 61 74 20 6f 66 66 73 65 74 20 35 20 64 65 73   at offset 5 des
f7c0: 69 67 6e 61 74 65 73 0a 20 20 20 20 2a 2a 20 74  ignates.    ** t
f7d0: 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
f7e0: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65  cell content are
f7f0: 61 2e 20 41 20 7a 65 72 6f 20 76 61 6c 75 65 20  a. A zero value 
f800: 66 6f 72 20 74 68 69 73 20 69 6e 74 65 67 65 72  for this integer
f810: 20 69 73 0a 20 20 20 20 2a 2a 20 69 6e 74 65 72   is.    ** inter
f820: 70 72 65 74 65 64 20 61 73 20 36 35 35 33 36 2e  preted as 65536.
f830: 20 2a 2f 0a 20 20 20 20 74 6f 70 20 3d 20 67 65   */.    top = ge
f840: 74 32 62 79 74 65 4e 6f 74 5a 65 72 6f 28 26 64  t2byteNotZero(&d
f850: 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20  ata[hdr+5]);.   
f860: 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
f870: 20 52 2d 33 37 30 30 32 2d 33 32 37 37 34 20 54   R-37002-32774 T
f880: 68 65 20 74 77 6f 2d 62 79 74 65 20 69 6e 74 65  he two-byte inte
f890: 67 65 72 20 61 74 20 6f 66 66 73 65 74 20 33 20  ger at offset 3 
f8a0: 67 69 76 65 73 20 74 68 65 0a 20 20 20 20 2a 2a  gives the.    **
f8b0: 20 6e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73   number of cells
f8c0: 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 20 2a 2f   on the page. */
f8d0: 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c  .    pPage->nCel
f8e0: 6c 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  l = get2byte(&da
f8f0: 74 61 5b 68 64 72 2b 33 5d 29 3b 0a 20 20 20 20  ta[hdr+3]);.    
f900: 69 66 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  if( pPage->nCell
f910: 3e 4d 58 5f 43 45 4c 4c 28 70 42 74 29 20 29 7b  >MX_CELL(pBt) ){
f920: 0a 20 20 20 20 20 20 2f 2a 20 54 6f 20 6d 61 6e  .      /* To man
f930: 79 20 63 65 6c 6c 73 20 66 6f 72 20 61 20 73 69  y cells for a si
f940: 6e 67 6c 65 20 70 61 67 65 2e 20 20 54 68 65 20  ngle page.  The 
f950: 70 61 67 65 20 6d 75 73 74 20 62 65 20 63 6f 72  page must be cor
f960: 72 75 70 74 20 2a 2f 0a 20 20 20 20 20 20 72 65  rupt */.      re
f970: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
f980: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
f990: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 50      testcase( pP
f9a0: 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 4d 58 5f 43  age->nCell==MX_C
f9b0: 45 4c 4c 28 70 42 74 29 20 29 3b 0a 20 20 20 20  ELL(pBt) );.    
f9c0: 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
f9d0: 52 2d 32 34 30 38 39 2d 35 37 39 37 39 20 49 66  R-24089-57979 If
f9e0: 20 61 20 70 61 67 65 20 63 6f 6e 74 61 69 6e 73   a page contains
f9f0: 20 6e 6f 20 63 65 6c 6c 73 20 28 77 68 69 63 68   no cells (which
fa00: 20 69 73 20 6f 6e 6c 79 0a 20 20 20 20 2a 2a 20   is only.    ** 
fa10: 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 61 20 72  possible for a r
fa20: 6f 6f 74 20 70 61 67 65 20 6f 66 20 61 20 74 61  oot page of a ta
fa30: 62 6c 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  ble that contain
fa40: 73 20 6e 6f 20 72 6f 77 73 29 20 74 68 65 6e 20  s no rows) then 
fa50: 74 68 65 0a 20 20 20 20 2a 2a 20 6f 66 66 73 65  the.    ** offse
fa60: 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f  t to the cell co
fa70: 6e 74 65 6e 74 20 61 72 65 61 20 77 69 6c 6c 20  ntent area will 
fa80: 65 71 75 61 6c 20 74 68 65 20 70 61 67 65 20 73  equal the page s
fa90: 69 7a 65 20 6d 69 6e 75 73 20 74 68 65 0a 20 20  ize minus the.  
faa0: 20 20 2a 2a 20 62 79 74 65 73 20 6f 66 20 72 65    ** bytes of re
fab0: 73 65 72 76 65 64 20 73 70 61 63 65 2e 20 2a 2f  served space. */
fac0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
fad0: 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 7c 7c 20 74  ge->nCell>0 || t
fae0: 6f 70 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20 7c  op==usableSize |
faf0: 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a  | CORRUPT_DB );.
fb00: 0a 20 20 20 20 2f 2a 20 41 20 6d 61 6c 66 6f 72  .    /* A malfor
fb10: 6d 65 64 20 64 61 74 61 62 61 73 65 20 70 61 67  med database pag
fb20: 65 20 6d 69 67 68 74 20 63 61 75 73 65 20 75 73  e might cause us
fb30: 20 74 6f 20 72 65 61 64 20 70 61 73 74 20 74 68   to read past th
fb40: 65 20 65 6e 64 0a 20 20 20 20 2a 2a 20 6f 66 20  e end.    ** of 
fb50: 70 61 67 65 20 77 68 65 6e 20 70 61 72 73 69 6e  page when parsin
fb60: 67 20 61 20 63 65 6c 6c 2e 20 20 0a 20 20 20 20  g a cell.  .    
fb70: 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 66 6f  **.    ** The fo
fb80: 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 6f 66  llowing block of
fb90: 20 63 6f 64 65 20 63 68 65 63 6b 73 20 65 61 72   code checks ear
fba0: 6c 79 20 74 6f 20 73 65 65 20 69 66 20 61 20 63  ly to see if a c
fbb0: 65 6c 6c 20 65 78 74 65 6e 64 73 0a 20 20 20 20  ell extends.    
fbc0: 2a 2a 20 70 61 73 74 20 74 68 65 20 65 6e 64 20  ** past the end 
fbd0: 6f 66 20 61 20 70 61 67 65 20 62 6f 75 6e 64 61  of a page bounda
fbe0: 72 79 20 61 6e 64 20 63 61 75 73 65 73 20 53 51  ry and causes SQ
fbf0: 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 74 6f 20  LITE_CORRUPT to 
fc00: 62 65 20 0a 20 20 20 20 2a 2a 20 72 65 74 75 72  be .    ** retur
fc10: 6e 65 64 20 69 66 20 69 74 20 64 6f 65 73 2e 0a  ned if it does..
fc20: 20 20 20 20 2a 2f 0a 20 20 20 20 69 43 65 6c 6c      */.    iCell
fc30: 46 69 72 73 74 20 3d 20 63 65 6c 6c 4f 66 66 73  First = cellOffs
fc40: 65 74 20 2b 20 32 2a 70 50 61 67 65 2d 3e 6e 43  et + 2*pPage->nC
fc50: 65 6c 6c 3b 0a 20 20 20 20 69 43 65 6c 6c 4c 61  ell;.    iCellLa
fc60: 73 74 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 20  st = usableSize 
fc70: 2d 20 34 3b 0a 20 20 20 20 69 66 28 20 70 42 74  - 4;.    if( pBt
fc80: 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51  ->db->flags & SQ
fc90: 4c 49 54 45 5f 43 65 6c 6c 53 69 7a 65 43 6b 20  LITE_CellSizeCk 
fca0: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 20  ){.      int i; 
fcb0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
fcc0: 64 65 78 20 69 6e 74 6f 20 74 68 65 20 63 65 6c  dex into the cel
fcd0: 6c 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79 20  l pointer array 
fce0: 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 73 7a 3b  */.      int sz;
fcf0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
fd00: 7a 65 20 6f 66 20 61 20 63 65 6c 6c 20 2a 2f 0a  ze of a cell */.
fd10: 0a 20 20 20 20 20 20 69 66 28 20 21 70 50 61 67  .      if( !pPag
fd20: 65 2d 3e 6c 65 61 66 20 29 20 69 43 65 6c 6c 4c  e->leaf ) iCellL
fd30: 61 73 74 2d 2d 3b 0a 20 20 20 20 20 20 66 6f 72  ast--;.      for
fd40: 28 69 3d 30 3b 20 69 3c 70 50 61 67 65 2d 3e 6e  (i=0; i<pPage->n
fd50: 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Cell; i++){.    
fd60: 20 20 20 20 70 63 20 3d 20 67 65 74 32 62 79 74      pc = get2byt
fd70: 65 41 6c 69 67 6e 65 64 28 26 64 61 74 61 5b 63  eAligned(&data[c
fd80: 65 6c 6c 4f 66 66 73 65 74 2b 69 2a 32 5d 29 3b  ellOffset+i*2]);
fd90: 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
fda0: 65 28 20 70 63 3d 3d 69 43 65 6c 6c 46 69 72 73  e( pc==iCellFirs
fdb0: 74 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  t );.        tes
fdc0: 74 63 61 73 65 28 20 70 63 3d 3d 69 43 65 6c 6c  tcase( pc==iCell
fdd0: 4c 61 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20  Last );.        
fde0: 69 66 28 20 70 63 3c 69 43 65 6c 6c 46 69 72 73  if( pc<iCellFirs
fdf0: 74 20 7c 7c 20 70 63 3e 69 43 65 6c 6c 4c 61 73  t || pc>iCellLas
fe00: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  t ){.          r
fe10: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
fe20: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
fe30: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 7a 20     }.        sz 
fe40: 3d 20 70 50 61 67 65 2d 3e 78 43 65 6c 6c 53 69  = pPage->xCellSi
fe50: 7a 65 28 70 50 61 67 65 2c 20 26 64 61 74 61 5b  ze(pPage, &data[
fe60: 70 63 5d 29 3b 0a 20 20 20 20 20 20 20 20 74 65  pc]);.        te
fe70: 73 74 63 61 73 65 28 20 70 63 2b 73 7a 3d 3d 75  stcase( pc+sz==u
fe80: 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20  sableSize );.   
fe90: 20 20 20 20 20 69 66 28 20 70 63 2b 73 7a 3e 75       if( pc+sz>u
fea0: 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20  sableSize ){.   
feb0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
fec0: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
fed0: 54 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  T;.        }.   
fee0: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21     }.      if( !
fef0: 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 20 69 43  pPage->leaf ) iC
ff00: 65 6c 6c 4c 61 73 74 2b 2b 3b 0a 20 20 20 20 7d  ellLast++;.    }
ff10: 20 20 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 75    ..    /* Compu
ff20: 74 65 20 74 68 65 20 74 6f 74 61 6c 20 66 72 65  te the total fre
ff30: 65 20 73 70 61 63 65 20 6f 6e 20 74 68 65 20 70  e space on the p
ff40: 61 67 65 0a 20 20 20 20 2a 2a 20 45 56 49 44 45  age.    ** EVIDE
ff50: 4e 43 45 2d 4f 46 3a 20 52 2d 32 33 35 38 38 2d  NCE-OF: R-23588-
ff60: 33 34 34 35 30 20 54 68 65 20 74 77 6f 2d 62 79  34450 The two-by
ff70: 74 65 20 69 6e 74 65 67 65 72 20 61 74 20 6f 66  te integer at of
ff80: 66 73 65 74 20 31 20 67 69 76 65 73 20 74 68 65  fset 1 gives the
ff90: 0a 20 20 20 20 2a 2a 20 73 74 61 72 74 20 6f 66  .    ** start of
ffa0: 20 74 68 65 20 66 69 72 73 74 20 66 72 65 65 62   the first freeb
ffb0: 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 70 61 67 65  lock on the page
ffc0: 2c 20 6f 72 20 69 73 20 7a 65 72 6f 20 69 66 20  , or is zero if 
ffd0: 74 68 65 72 65 20 61 72 65 20 6e 6f 0a 20 20 20  there are no.   
ffe0: 20 2a 2a 20 66 72 65 65 62 6c 6f 63 6b 73 2e 20   ** freeblocks. 
fff0: 2a 2f 0a 20 20 20 20 70 63 20 3d 20 67 65 74 32  */.    pc = get2
10000 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 31  byte(&data[hdr+1
10010 5d 29 3b 0a 20 20 20 20 6e 46 72 65 65 20 3d 20  ]);.    nFree = 
10020 64 61 74 61 5b 68 64 72 2b 37 5d 20 2b 20 74 6f  data[hdr+7] + to
10030 70 3b 20 20 2f 2a 20 49 6e 69 74 20 6e 46 72 65  p;  /* Init nFre
10040 65 20 74 6f 20 6e 6f 6e 2d 66 72 65 65 62 6c 6f  e to non-freeblo
10050 63 6b 20 66 72 65 65 20 73 70 61 63 65 20 2a 2f  ck free space */
10060 0a 20 20 20 20 69 66 28 20 70 63 3e 30 20 29 7b  .    if( pc>0 ){
10070 0a 20 20 20 20 20 20 75 33 32 20 6e 65 78 74 2c  .      u32 next,
10080 20 73 69 7a 65 3b 0a 20 20 20 20 20 20 69 66 28   size;.      if(
10090 20 70 63 3c 69 43 65 6c 6c 46 69 72 73 74 20 29   pc<iCellFirst )
100a0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 56 49  {.        /* EVI
100b0 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 35 35 33  DENCE-OF: R-5553
100c0 30 2d 35 32 39 33 30 20 49 6e 20 61 20 77 65 6c  0-52930 In a wel
100d0 6c 2d 66 6f 72 6d 65 64 20 62 2d 74 72 65 65 20  l-formed b-tree 
100e0 70 61 67 65 2c 20 74 68 65 72 65 20 77 69 6c 6c  page, there will
100f0 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 77 61  .        ** alwa
10100 79 73 20 62 65 20 61 74 20 6c 65 61 73 74 20 6f  ys be at least o
10110 6e 65 20 63 65 6c 6c 20 62 65 66 6f 72 65 20 74  ne cell before t
10120 68 65 20 66 69 72 73 74 20 66 72 65 65 62 6c 6f  he first freeblo
10130 63 6b 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ck..        */. 
10140 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
10150 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
10160 54 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  T; .      }.    
10170 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20    while( 1 ){.  
10180 20 20 20 20 20 20 69 66 28 20 70 63 3e 69 43 65        if( pc>iCe
10190 6c 6c 4c 61 73 74 20 29 7b 0a 20 20 20 20 20 20  llLast ){.      
101a0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
101b0 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20  E_CORRUPT_BKPT; 
101c0 2f 2a 20 46 72 65 65 62 6c 6f 63 6b 20 6f 66 66  /* Freeblock off
101d0 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
101e0 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  page */.        
101f0 7d 0a 20 20 20 20 20 20 20 20 6e 65 78 74 20 3d  }.        next =
10200 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
10210 70 63 5d 29 3b 0a 20 20 20 20 20 20 20 20 73 69  pc]);.        si
10220 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  ze = get2byte(&d
10230 61 74 61 5b 70 63 2b 32 5d 29 3b 0a 20 20 20 20  ata[pc+2]);.    
10240 20 20 20 20 6e 46 72 65 65 20 3d 20 6e 46 72 65      nFree = nFre
10250 65 20 2b 20 73 69 7a 65 3b 0a 20 20 20 20 20 20  e + size;.      
10260 20 20 69 66 28 20 6e 65 78 74 3c 3d 70 63 2b 73    if( next<=pc+s
10270 69 7a 65 2b 33 20 29 20 62 72 65 61 6b 3b 0a 20  ize+3 ) break;. 
10280 20 20 20 20 20 20 20 70 63 20 3d 20 6e 65 78 74         pc = next
10290 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
102a0 69 66 28 20 6e 65 78 74 3e 30 20 29 7b 0a 20 20  if( next>0 ){.  
102b0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
102c0 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
102d0 3b 20 20 2f 2a 20 46 72 65 65 62 6c 6f 63 6b 20  ;  /* Freeblock 
102e0 6e 6f 74 20 69 6e 20 61 73 63 65 6e 64 69 6e 67  not in ascending
102f0 20 6f 72 64 65 72 20 2a 2f 0a 20 20 20 20 20 20   order */.      
10300 7d 0a 20 20 20 20 20 20 69 66 28 20 70 63 2b 73  }.      if( pc+s
10310 69 7a 65 3e 28 75 6e 73 69 67 6e 65 64 20 69 6e  ize>(unsigned in
10320 74 29 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a  t)usableSize ){.
10330 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
10340 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
10350 50 54 3b 20 20 2f 2a 20 4c 61 73 74 20 66 72 65  PT;  /* Last fre
10360 65 62 6c 6f 63 6b 20 65 78 74 65 6e 64 73 20 70  eblock extends p
10370 61 73 74 20 70 61 67 65 20 65 6e 64 20 2a 2f 0a  ast page end */.
10380 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
10390 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f     /* At this po
103a0 69 6e 74 2c 20 6e 46 72 65 65 20 63 6f 6e 74 61  int, nFree conta
103b0 69 6e 73 20 74 68 65 20 73 75 6d 20 6f 66 20 74  ins the sum of t
103c0 68 65 20 6f 66 66 73 65 74 20 74 6f 20 74 68 65  he offset to the
103d0 20 73 74 61 72 74 0a 20 20 20 20 2a 2a 20 6f 66   start.    ** of
103e0 20 74 68 65 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e   the cell-conten
103f0 74 20 61 72 65 61 20 70 6c 75 73 20 74 68 65 20  t area plus the 
10400 6e 75 6d 62 65 72 20 6f 66 20 66 72 65 65 20 62  number of free b
10410 79 74 65 73 20 77 69 74 68 69 6e 0a 20 20 20 20  ytes within.    
10420 2a 2a 20 74 68 65 20 63 65 6c 6c 2d 63 6f 6e 74  ** the cell-cont
10430 65 6e 74 20 61 72 65 61 2e 20 49 66 20 74 68 69  ent area. If thi
10440 73 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  s is greater tha
10450 6e 20 74 68 65 20 75 73 61 62 6c 65 2d 73 69 7a  n the usable-siz
10460 65 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20  e.    ** of the 
10470 70 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20 70  page, then the p
10480 61 67 65 20 6d 75 73 74 20 62 65 20 63 6f 72 72  age must be corr
10490 75 70 74 65 64 2e 20 54 68 69 73 20 63 68 65 63  upted. This chec
104a0 6b 20 61 6c 73 6f 0a 20 20 20 20 2a 2a 20 73 65  k also.    ** se
104b0 72 76 65 73 20 74 6f 20 76 65 72 69 66 79 20 74  rves to verify t
104c0 68 61 74 20 74 68 65 20 6f 66 66 73 65 74 20 74  hat the offset t
104d0 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  o the start of t
104e0 68 65 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 0a  he cell-content.
104f0 20 20 20 20 2a 2a 20 61 72 65 61 2c 20 61 63 63      ** area, acc
10500 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20 70 61  ording to the pa
10510 67 65 20 68 65 61 64 65 72 2c 20 6c 69 65 73 20  ge header, lies 
10520 77 69 74 68 69 6e 20 74 68 65 20 70 61 67 65 2e  within the page.
10530 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
10540 6e 46 72 65 65 3e 75 73 61 62 6c 65 53 69 7a 65  nFree>usableSize
10550 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
10560 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
10570 42 4b 50 54 3b 20 0a 20 20 20 20 7d 0a 20 20 20  BKPT; .    }.   
10580 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20   pPage->nFree = 
10590 28 75 31 36 29 28 6e 46 72 65 65 20 2d 20 69 43  (u16)(nFree - iC
105a0 65 6c 6c 46 69 72 73 74 29 3b 0a 20 20 20 20 70  ellFirst);.    p
105b0 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 31  Page->isInit = 1
105c0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
105d0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
105e0 2a 2a 20 53 65 74 20 75 70 20 61 20 72 61 77 20  ** Set up a raw 
105f0 70 61 67 65 20 73 6f 20 74 68 61 74 20 69 74 20  page so that it 
10600 6c 6f 6f 6b 73 20 6c 69 6b 65 20 61 20 64 61 74  looks like a dat
10610 61 62 61 73 65 20 70 61 67 65 20 68 6f 6c 64 69  abase page holdi
10620 6e 67 0a 2a 2a 20 6e 6f 20 65 6e 74 72 69 65 73  ng.** no entries
10630 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
10640 20 7a 65 72 6f 50 61 67 65 28 4d 65 6d 50 61 67   zeroPage(MemPag
10650 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 66 6c  e *pPage, int fl
10660 61 67 73 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64  ags){.  unsigned
10670 20 63 68 61 72 20 2a 64 61 74 61 20 3d 20 70 50   char *data = pP
10680 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 42 74  age->aData;.  Bt
10690 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50  Shared *pBt = pP
106a0 61 67 65 2d 3e 70 42 74 3b 0a 20 20 75 38 20 68  age->pBt;.  u8 h
106b0 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f  dr = pPage->hdrO
106c0 66 66 73 65 74 3b 0a 20 20 75 31 36 20 66 69 72  ffset;.  u16 fir
106d0 73 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  st;..  assert( s
106e0 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 6e  qlite3PagerPagen
106f0 75 6d 62 65 72 28 70 50 61 67 65 2d 3e 70 44 62  umber(pPage->pDb
10700 50 61 67 65 29 3d 3d 70 50 61 67 65 2d 3e 70 67  Page)==pPage->pg
10710 6e 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  no );.  assert( 
10720 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45  sqlite3PagerGetE
10730 78 74 72 61 28 70 50 61 67 65 2d 3e 70 44 62 50  xtra(pPage->pDbP
10740 61 67 65 29 20 3d 3d 20 28 76 6f 69 64 2a 29 70  age) == (void*)p
10750 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74  Page );.  assert
10760 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  ( sqlite3PagerGe
10770 74 44 61 74 61 28 70 50 61 67 65 2d 3e 70 44 62  tData(pPage->pDb
10780 50 61 67 65 29 20 3d 3d 20 64 61 74 61 20 29 3b  Page) == data );
10790 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
107a0 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
107b0 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
107c0 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  e) );.  assert( 
107d0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
107e0 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
107f0 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 62 74 73  ;.  if( pBt->bts
10800 46 6c 61 67 73 20 26 20 42 54 53 5f 53 45 43 55  Flags & BTS_SECU
10810 52 45 5f 44 45 4c 45 54 45 20 29 7b 0a 20 20 20  RE_DELETE ){.   
10820 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 68 64   memset(&data[hd
10830 72 5d 2c 20 30 2c 20 70 42 74 2d 3e 75 73 61 62  r], 0, pBt->usab
10840 6c 65 53 69 7a 65 20 2d 20 68 64 72 29 3b 0a 20  leSize - hdr);. 
10850 20 7d 0a 20 20 64 61 74 61 5b 68 64 72 5d 20 3d   }.  data[hdr] =
10860 20 28 63 68 61 72 29 66 6c 61 67 73 3b 0a 20 20   (char)flags;.  
10870 66 69 72 73 74 20 3d 20 68 64 72 20 2b 20 28 28  first = hdr + ((
10880 66 6c 61 67 73 26 50 54 46 5f 4c 45 41 46 29 3d  flags&PTF_LEAF)=
10890 3d 30 20 3f 20 31 32 20 3a 20 38 29 3b 0a 20 20  =0 ? 12 : 8);.  
108a0 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 68 64 72  memset(&data[hdr
108b0 2b 31 5d 2c 20 30 2c 20 34 29 3b 0a 20 20 64 61  +1], 0, 4);.  da
108c0 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a 20  ta[hdr+7] = 0;. 
108d0 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
108e0 68 64 72 2b 35 5d 2c 20 70 42 74 2d 3e 75 73 61  hdr+5], pBt->usa
108f0 62 6c 65 53 69 7a 65 29 3b 0a 20 20 70 50 61 67  bleSize);.  pPag
10900 65 2d 3e 6e 46 72 65 65 20 3d 20 28 75 31 36 29  e->nFree = (u16)
10910 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  (pBt->usableSize
10920 20 2d 20 66 69 72 73 74 29 3b 0a 20 20 64 65 63   - first);.  dec
10930 6f 64 65 46 6c 61 67 73 28 70 50 61 67 65 2c 20  odeFlags(pPage, 
10940 66 6c 61 67 73 29 3b 0a 20 20 70 50 61 67 65 2d  flags);.  pPage-
10950 3e 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 66 69  >cellOffset = fi
10960 72 73 74 3b 0a 20 20 70 50 61 67 65 2d 3e 61 44  rst;.  pPage->aD
10970 61 74 61 45 6e 64 20 3d 20 26 64 61 74 61 5b 70  ataEnd = &data[p
10980 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 5d 3b  Bt->usableSize];
10990 0a 20 20 70 50 61 67 65 2d 3e 61 43 65 6c 6c 49  .  pPage->aCellI
109a0 64 78 20 3d 20 26 64 61 74 61 5b 66 69 72 73 74  dx = &data[first
109b0 5d 3b 0a 20 20 70 50 61 67 65 2d 3e 61 44 61 74  ];.  pPage->aDat
109c0 61 4f 66 73 74 20 3d 20 26 64 61 74 61 5b 70 50  aOfst = &data[pP
109d0 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a  age->childPtrSiz
109e0 65 5d 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 4f 76  e];.  pPage->nOv
109f0 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 61 73  erflow = 0;.  as
10a00 73 65 72 74 28 20 70 42 74 2d 3e 70 61 67 65 53  sert( pBt->pageS
10a10 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 42 74 2d  ize>=512 && pBt-
10a20 3e 70 61 67 65 53 69 7a 65 3c 3d 36 35 35 33 36  >pageSize<=65536
10a30 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6d 61 73   );.  pPage->mas
10a40 6b 50 61 67 65 20 3d 20 28 75 31 36 29 28 70 42  kPage = (u16)(pB
10a50 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 31 29  t->pageSize - 1)
10a60 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ;.  pPage->nCell
10a70 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 2d 3e 69   = 0;.  pPage->i
10a80 73 49 6e 69 74 20 3d 20 31 3b 0a 7d 0a 0a 0a 2f  sInit = 1;.}.../
10a90 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20 44  *.** Convert a D
10aa0 62 50 61 67 65 20 6f 62 74 61 69 6e 65 64 20 66  bPage obtained f
10ab0 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20 69 6e  rom the pager in
10ac0 74 6f 20 61 20 4d 65 6d 50 61 67 65 20 75 73 65  to a MemPage use
10ad0 64 20 62 79 0a 2a 2a 20 74 68 65 20 62 74 72 65  d by.** the btre
10ae0 65 20 6c 61 79 65 72 2e 0a 2a 2f 0a 73 74 61 74  e layer..*/.stat
10af0 69 63 20 4d 65 6d 50 61 67 65 20 2a 62 74 72 65  ic MemPage *btre
10b00 65 50 61 67 65 46 72 6f 6d 44 62 50 61 67 65 28  ePageFromDbPage(
10b10 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 2c  DbPage *pDbPage,
10b20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 42 74 53 68   Pgno pgno, BtSh
10b30 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 4d 65  ared *pBt){.  Me
10b40 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 28  mPage *pPage = (
10b50 4d 65 6d 50 61 67 65 2a 29 73 71 6c 69 74 65 33  MemPage*)sqlite3
10b60 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70 44  PagerGetExtra(pD
10b70 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 70 67  bPage);.  if( pg
10b80 6e 6f 21 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20  no!=pPage->pgno 
10b90 29 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e 61 44  ){.    pPage->aD
10ba0 61 74 61 20 3d 20 73 71 6c 69 74 65 33 50 61 67  ata = sqlite3Pag
10bb0 65 72 47 65 74 44 61 74 61 28 70 44 62 50 61 67  erGetData(pDbPag
10bc0 65 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 70  e);.    pPage->p
10bd0 44 62 50 61 67 65 20 3d 20 70 44 62 50 61 67 65  DbPage = pDbPage
10be0 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 70 42 74  ;.    pPage->pBt
10bf0 20 3d 20 70 42 74 3b 0a 20 20 20 20 70 50 61 67   = pBt;.    pPag
10c00 65 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a  e->pgno = pgno;.
10c10 20 20 20 20 70 50 61 67 65 2d 3e 68 64 72 4f 66      pPage->hdrOf
10c20 66 73 65 74 20 3d 20 70 67 6e 6f 3d 3d 31 20 3f  fset = pgno==1 ?
10c30 20 31 30 30 20 3a 20 30 3b 0a 20 20 7d 0a 20 20   100 : 0;.  }.  
10c40 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 61  assert( pPage->a
10c50 44 61 74 61 3d 3d 73 71 6c 69 74 65 33 50 61 67  Data==sqlite3Pag
10c60 65 72 47 65 74 44 61 74 61 28 70 44 62 50 61 67  erGetData(pDbPag
10c70 65 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  e) );.  return p
10c80 50 61 67 65 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Page; .}../*.** 
10c90 47 65 74 20 61 20 70 61 67 65 20 66 72 6f 6d 20  Get a page from 
10ca0 74 68 65 20 70 61 67 65 72 2e 20 20 49 6e 69 74  the pager.  Init
10cb0 69 61 6c 69 7a 65 20 74 68 65 20 4d 65 6d 50 61  ialize the MemPa
10cc0 67 65 2e 70 42 74 20 61 6e 64 0a 2a 2a 20 4d 65  ge.pBt and.** Me
10cd0 6d 50 61 67 65 2e 61 44 61 74 61 20 65 6c 65 6d  mPage.aData elem
10ce0 65 6e 74 73 20 69 66 20 6e 65 65 64 65 64 2e 20  ents if needed. 
10cf0 20 53 65 65 20 61 6c 73 6f 3a 20 62 74 72 65 65   See also: btree
10d00 47 65 74 55 6e 75 73 65 64 50 61 67 65 28 29 2e  GetUnusedPage().
10d10 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50 41  .**.** If the PA
10d20 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e  GER_GET_NOCONTEN
10d30 54 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 69  T flag is set, i
10d40 74 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20  t means that we 
10d50 64 6f 20 6e 6f 74 20 63 61 72 65 0a 2a 2a 20 61  do not care.** a
10d60 62 6f 75 74 20 74 68 65 20 63 6f 6e 74 65 6e 74  bout the content
10d70 20 6f 66 20 74 68 65 20 70 61 67 65 20 61 74 20   of the page at 
10d80 74 68 69 73 20 74 69 6d 65 2e 20 20 53 6f 20 64  this time.  So d
10d90 6f 20 6e 6f 74 20 67 6f 20 74 6f 20 74 68 65 20  o not go to the 
10da0 64 69 73 6b 0a 2a 2a 20 74 6f 20 66 65 74 63 68  disk.** to fetch
10db0 20 74 68 65 20 63 6f 6e 74 65 6e 74 2e 20 20 4a   the content.  J
10dc0 75 73 74 20 66 69 6c 6c 20 69 6e 20 74 68 65 20  ust fill in the 
10dd0 63 6f 6e 74 65 6e 74 20 77 69 74 68 20 7a 65 72  content with zer
10de0 6f 73 20 66 6f 72 20 6e 6f 77 2e 0a 2a 2a 20 49  os for now..** I
10df0 66 20 69 6e 20 74 68 65 20 66 75 74 75 72 65 20  f in the future 
10e00 77 65 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 50  we call sqlite3P
10e10 61 67 65 72 57 72 69 74 65 28 29 20 6f 6e 20 74  agerWrite() on t
10e20 68 69 73 20 70 61 67 65 2c 20 74 68 61 74 0a 2a  his page, that.*
10e30 2a 20 6d 65 61 6e 73 20 77 65 20 68 61 76 65 20  * means we have 
10e40 73 74 61 72 74 65 64 20 74 6f 20 62 65 20 63 6f  started to be co
10e50 6e 63 65 72 6e 65 64 20 61 62 6f 75 74 20 63 6f  ncerned about co
10e60 6e 74 65 6e 74 20 61 6e 64 20 74 68 65 20 64 69  ntent and the di
10e70 73 6b 0a 2a 2a 20 72 65 61 64 20 73 68 6f 75 6c  sk.** read shoul
10e80 64 20 6f 63 63 75 72 20 61 74 20 74 68 61 74 20  d occur at that 
10e90 70 6f 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  point..*/.static
10ea0 20 69 6e 74 20 62 74 72 65 65 47 65 74 50 61 67   int btreeGetPag
10eb0 65 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  e(.  BtShared *p
10ec0 42 74 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65  Bt,       /* The
10ed0 20 62 74 72 65 65 20 2a 2f 0a 20 20 50 67 6e 6f   btree */.  Pgno
10ee0 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20   pgno,          
10ef0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 68   /* Number of th
10f00 65 20 70 61 67 65 20 74 6f 20 66 65 74 63 68 20  e page to fetch 
10f10 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70  */.  MemPage **p
10f20 70 50 61 67 65 2c 20 20 20 20 2f 2a 20 52 65 74  pPage,    /* Ret
10f30 75 72 6e 20 74 68 65 20 70 61 67 65 20 69 6e 20  urn the page in 
10f40 74 68 69 73 20 70 61 72 61 6d 65 74 65 72 20 2a  this parameter *
10f50 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20  /.  int flags   
10f60 20 20 20 20 20 20 20 20 20 2f 2a 20 50 41 47 45           /* PAGE
10f70 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20  R_GET_NOCONTENT 
10f80 6f 72 20 50 41 47 45 52 5f 47 45 54 5f 52 45 41  or PAGER_GET_REA
10f90 44 4f 4e 4c 59 20 2a 2f 0a 29 7b 0a 20 20 69 6e  DONLY */.){.  in
10fa0 74 20 72 63 3b 0a 20 20 44 62 50 61 67 65 20 2a  t rc;.  DbPage *
10fb0 70 44 62 50 61 67 65 3b 0a 0a 20 20 61 73 73 65  pDbPage;..  asse
10fc0 72 74 28 20 66 6c 61 67 73 3d 3d 30 20 7c 7c 20  rt( flags==0 || 
10fd0 66 6c 61 67 73 3d 3d 50 41 47 45 52 5f 47 45 54  flags==PAGER_GET
10fe0 5f 4e 4f 43 4f 4e 54 45 4e 54 20 7c 7c 20 66 6c  _NOCONTENT || fl
10ff0 61 67 73 3d 3d 50 41 47 45 52 5f 47 45 54 5f 52  ags==PAGER_GET_R
11000 45 41 44 4f 4e 4c 59 20 29 3b 0a 20 20 61 73 73  EADONLY );.  ass
11010 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
11020 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
11030 65 78 29 20 29 3b 0a 20 20 72 63 20 3d 20 73 71  ex) );.  rc = sq
11040 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70 42  lite3PagerGet(pB
11050 74 2d 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c  t->pPager, pgno,
11060 20 28 44 62 50 61 67 65 2a 2a 29 26 70 44 62 50   (DbPage**)&pDbP
11070 61 67 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20 69  age, flags);.  i
11080 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
11090 63 3b 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 62  c;.  *ppPage = b
110a0 74 72 65 65 50 61 67 65 46 72 6f 6d 44 62 50 61  treePageFromDbPa
110b0 67 65 28 70 44 62 50 61 67 65 2c 20 70 67 6e 6f  ge(pDbPage, pgno
110c0 2c 20 70 42 74 29 3b 0a 20 20 72 65 74 75 72 6e  , pBt);.  return
110d0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
110e0 2a 0a 2a 2a 20 52 65 74 72 69 65 76 65 20 61 20  *.** Retrieve a 
110f0 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 70 61  page from the pa
11100 67 65 72 20 63 61 63 68 65 2e 20 49 66 20 74 68  ger cache. If th
11110 65 20 72 65 71 75 65 73 74 65 64 20 70 61 67 65  e requested page
11120 20 69 73 20 6e 6f 74 0a 2a 2a 20 61 6c 72 65 61   is not.** alrea
11130 64 79 20 69 6e 20 74 68 65 20 70 61 67 65 72 20  dy in the pager 
11140 63 61 63 68 65 20 72 65 74 75 72 6e 20 4e 55 4c  cache return NUL
11150 4c 2e 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  L. Initialize th
11160 65 20 4d 65 6d 50 61 67 65 2e 70 42 74 20 61 6e  e MemPage.pBt an
11170 64 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e 61 44 61  d.** MemPage.aDa
11180 74 61 20 65 6c 65 6d 65 6e 74 73 20 69 66 20 6e  ta elements if n
11190 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  eeded..*/.static
111a0 20 4d 65 6d 50 61 67 65 20 2a 62 74 72 65 65 50   MemPage *btreeP
111b0 61 67 65 4c 6f 6f 6b 75 70 28 42 74 53 68 61 72  ageLookup(BtShar
111c0 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67  ed *pBt, Pgno pg
111d0 6e 6f 29 7b 0a 20 20 44 62 50 61 67 65 20 2a 70  no){.  DbPage *p
111e0 44 62 50 61 67 65 3b 0a 20 20 61 73 73 65 72 74  DbPage;.  assert
111f0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
11200 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
11210 20 29 3b 0a 20 20 70 44 62 50 61 67 65 20 3d 20   );.  pDbPage = 
11220 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b  sqlite3PagerLook
11230 75 70 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  up(pBt->pPager, 
11240 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70 44 62  pgno);.  if( pDb
11250 50 61 67 65 20 29 7b 0a 20 20 20 20 72 65 74 75  Page ){.    retu
11260 72 6e 20 62 74 72 65 65 50 61 67 65 46 72 6f 6d  rn btreePageFrom
11270 44 62 50 61 67 65 28 70 44 62 50 61 67 65 2c 20  DbPage(pDbPage, 
11280 70 67 6e 6f 2c 20 70 42 74 29 3b 0a 20 20 7d 0a  pgno, pBt);.  }.
11290 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
112a0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
112b0 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
112c0 62 61 73 65 20 66 69 6c 65 20 69 6e 20 70 61 67  base file in pag
112d0 65 73 2e 20 49 66 20 74 68 65 72 65 20 69 73 20  es. If there is 
112e0 61 6e 79 20 6b 69 6e 64 20 6f 66 0a 2a 2a 20 65  any kind of.** e
112f0 72 72 6f 72 2c 20 72 65 74 75 72 6e 20 28 28 75  rror, return ((u
11300 6e 73 69 67 6e 65 64 20 69 6e 74 29 2d 31 29 2e  nsigned int)-1).
11310 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 6e 6f 20  .*/.static Pgno 
11320 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 42  btreePagecount(B
11330 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20  tShared *pBt){. 
11340 20 72 65 74 75 72 6e 20 70 42 74 2d 3e 6e 50 61   return pBt->nPa
11350 67 65 3b 0a 7d 0a 75 33 32 20 73 71 6c 69 74 65  ge;.}.u32 sqlite
11360 33 42 74 72 65 65 4c 61 73 74 50 61 67 65 28 42  3BtreeLastPage(B
11370 74 72 65 65 20 2a 70 29 7b 0a 20 20 61 73 73 65  tree *p){.  asse
11380 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  rt( sqlite3Btree
11390 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b  HoldsMutex(p) );
113a0 0a 20 20 61 73 73 65 72 74 28 20 28 28 70 2d 3e  .  assert( ((p->
113b0 70 42 74 2d 3e 6e 50 61 67 65 29 26 30 78 38 30  pBt->nPage)&0x80
113c0 30 30 30 30 30 29 3d 3d 30 20 29 3b 0a 20 20 72  00000)==0 );.  r
113d0 65 74 75 72 6e 20 62 74 72 65 65 50 61 67 65 63  eturn btreePagec
113e0 6f 75 6e 74 28 70 2d 3e 70 42 74 29 3b 0a 7d 0a  ount(p->pBt);.}.
113f0 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 70 61 67  ./*.** Get a pag
11400 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72  e from the pager
11410 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20   and initialize 
11420 69 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 43 75  it..**.** If pCu
11430 72 21 3d 30 20 74 68 65 6e 20 74 68 65 20 70 61  r!=0 then the pa
11440 67 65 20 69 73 20 62 65 69 6e 67 20 66 65 74 63  ge is being fetc
11450 68 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 61  hed as part of a
11460 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 29 0a 2a   moveToChild().*
11470 2a 20 63 61 6c 6c 2e 20 20 44 6f 20 61 64 64 69  * call.  Do addi
11480 74 69 6f 6e 61 6c 20 73 61 6e 69 74 79 20 63 68  tional sanity ch
11490 65 63 6b 69 6e 67 20 6f 6e 20 74 68 65 20 70 61  ecking on the pa
114a0 67 65 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  ge in this case.
114b0 0a 2a 2a 20 41 6e 64 20 69 66 20 74 68 65 20 66  .** And if the f
114c0 65 74 63 68 20 66 61 69 6c 73 2c 20 74 68 69 73  etch fails, this
114d0 20 72 6f 75 74 69 6e 65 20 6d 75 73 74 20 64 65   routine must de
114e0 63 72 65 6d 65 6e 74 20 70 43 75 72 2d 3e 69 50  crement pCur->iP
114f0 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  age..**.** The p
11500 61 67 65 20 69 73 20 66 65 74 63 68 65 64 20 61  age is fetched a
11510 73 20 72 65 61 64 2d 77 72 69 74 65 20 75 6e 6c  s read-write unl
11520 65 73 73 20 70 43 75 72 20 69 73 20 6e 6f 74 20  ess pCur is not 
11530 4e 55 4c 4c 20 61 6e 64 20 69 73 0a 2a 2a 20 61  NULL and is.** a
11540 20 72 65 61 64 2d 6f 6e 6c 79 20 63 75 72 73 6f   read-only curso
11550 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  r..**.** If an e
11560 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65  rror occurs, the
11570 6e 20 2a 70 70 50 61 67 65 20 69 73 20 75 6e 64  n *ppPage is und
11580 65 66 69 6e 65 64 2e 20 49 74 0a 2a 2a 20 6d 61  efined. It.** ma
11590 79 20 72 65 6d 61 69 6e 20 75 6e 63 68 61 6e 67  y remain unchang
115a0 65 64 2c 20 6f 72 20 69 74 20 6d 61 79 20 62 65  ed, or it may be
115b0 20 73 65 74 20 74 6f 20 61 6e 20 69 6e 76 61 6c   set to an inval
115c0 69 64 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61  id value..*/.sta
115d0 74 69 63 20 69 6e 74 20 67 65 74 41 6e 64 49 6e  tic int getAndIn
115e0 69 74 50 61 67 65 28 0a 20 20 42 74 53 68 61 72  itPage(.  BtShar
115f0 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20  ed *pBt,        
11600 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
11610 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
11620 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20  /.  Pgno pgno,  
11630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11640 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
11650 20 74 68 65 20 70 61 67 65 20 74 6f 20 67 65 74   the page to get
11660 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a   */.  MemPage **
11670 70 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20  ppPage,         
11680 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74        /* Write t
11690 68 65 20 70 61 67 65 20 70 6f 69 6e 74 65 72 20  he page pointer 
116a0 68 65 72 65 20 2a 2f 0a 20 20 42 74 43 75 72 73  here */.  BtCurs
116b0 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20 20  or *pCur,       
116c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
116d0 73 6f 72 20 74 6f 20 72 65 63 65 69 76 65 20 74  sor to receive t
116e0 68 65 20 70 61 67 65 2c 20 6f 72 20 4e 55 4c 4c  he page, or NULL
116f0 20 2a 2f 0a 20 20 69 6e 74 20 62 52 65 61 64 4f   */.  int bReadO
11700 6e 6c 79 20 20 20 20 20 20 20 20 20 20 20 20 20  nly             
11710 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f        /* True fo
11720 72 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 70 61  r a read-only pa
11730 67 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  ge */.){.  int r
11740 63 3b 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62  c;.  DbPage *pDb
11750 50 61 67 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Page;.  assert( 
11760 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
11770 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
11780 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
11790 3d 3d 30 20 7c 7c 20 70 70 50 61 67 65 3d 3d 26  ==0 || ppPage==&
117a0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
117b0 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20 61  r->iPage] );.  a
117c0 73 73 65 72 74 28 20 70 43 75 72 3d 3d 30 20 7c  ssert( pCur==0 |
117d0 7c 20 62 52 65 61 64 4f 6e 6c 79 3d 3d 70 43 75  | bReadOnly==pCu
117e0 72 2d 3e 63 75 72 50 61 67 65 72 46 6c 61 67 73  r->curPagerFlags
117f0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
11800 75 72 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 69  ur==0 || pCur->i
11810 50 61 67 65 3e 30 20 29 3b 0a 0a 20 20 69 66 28  Page>0 );..  if(
11820 20 70 67 6e 6f 3e 62 74 72 65 65 50 61 67 65 63   pgno>btreePagec
11830 6f 75 6e 74 28 70 42 74 29 20 29 7b 0a 20 20 20  ount(pBt) ){.   
11840 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
11850 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 67  RUPT_BKPT;.    g
11860 6f 74 6f 20 67 65 74 41 6e 64 49 6e 69 74 50 61  oto getAndInitPa
11870 67 65 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20  ge_error;.  }.  
11880 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
11890 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72  rGet(pBt->pPager
118a0 2c 20 70 67 6e 6f 2c 20 28 44 62 50 61 67 65 2a  , pgno, (DbPage*
118b0 2a 29 26 70 44 62 50 61 67 65 2c 20 62 52 65 61  *)&pDbPage, bRea
118c0 64 4f 6e 6c 79 29 3b 0a 20 20 69 66 28 20 72 63  dOnly);.  if( rc
118d0 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 67 65 74   ){.    goto get
118e0 41 6e 64 49 6e 69 74 50 61 67 65 5f 65 72 72 6f  AndInitPage_erro
118f0 72 3b 0a 20 20 7d 0a 20 20 2a 70 70 50 61 67 65  r;.  }.  *ppPage
11900 20 3d 20 28 4d 65 6d 50 61 67 65 2a 29 73 71 6c   = (MemPage*)sql
11910 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72  ite3PagerGetExtr
11920 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66  a(pDbPage);.  if
11930 28 20 28 2a 70 70 50 61 67 65 29 2d 3e 69 73 49  ( (*ppPage)->isI
11940 6e 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 62 74  nit==0 ){.    bt
11950 72 65 65 50 61 67 65 46 72 6f 6d 44 62 50 61 67  reePageFromDbPag
11960 65 28 70 44 62 50 61 67 65 2c 20 70 67 6e 6f 2c  e(pDbPage, pgno,
11970 20 70 42 74 29 3b 0a 20 20 20 20 72 63 20 3d 20   pBt);.    rc = 
11980 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 2a 70  btreeInitPage(*p
11990 70 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  pPage);.    if( 
119a0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
119b0 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
119c0 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20  ge(*ppPage);.   
119d0 20 20 20 67 6f 74 6f 20 67 65 74 41 6e 64 49 6e     goto getAndIn
119e0 69 74 50 61 67 65 5f 65 72 72 6f 72 3b 0a 20 20  itPage_error;.  
119f0 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74    }.  }.  assert
11a00 28 20 28 2a 70 70 50 61 67 65 29 2d 3e 70 67 6e  ( (*ppPage)->pgn
11a10 6f 3d 3d 70 67 6e 6f 20 29 3b 0a 20 20 61 73 73  o==pgno );.  ass
11a20 65 72 74 28 20 28 2a 70 70 50 61 67 65 29 2d 3e  ert( (*ppPage)->
11a30 61 44 61 74 61 3d 3d 73 71 6c 69 74 65 33 50 61  aData==sqlite3Pa
11a40 67 65 72 47 65 74 44 61 74 61 28 70 44 62 50 61  gerGetData(pDbPa
11a50 67 65 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  ge) );..  /* If 
11a60 6f 62 74 61 69 6e 69 6e 67 20 61 20 63 68 69 6c  obtaining a chil
11a70 64 20 70 61 67 65 20 66 6f 72 20 61 20 63 75 72  d page for a cur
11a80 73 6f 72 2c 20 77 65 20 6d 75 73 74 20 76 65 72  sor, we must ver
11a90 69 66 79 20 74 68 61 74 20 74 68 65 20 70 61 67  ify that the pag
11aa0 65 20 69 73 0a 20 20 2a 2a 20 63 6f 6d 70 61 74  e is.  ** compat
11ab0 69 62 6c 65 20 77 69 74 68 20 74 68 65 20 72 6f  ible with the ro
11ac0 6f 74 20 70 61 67 65 2e 20 2a 2f 0a 20 20 69 66  ot page. */.  if
11ad0 28 20 70 43 75 72 20 26 26 20 28 28 2a 70 70 50  ( pCur && ((*ppP
11ae0 61 67 65 29 2d 3e 6e 43 65 6c 6c 3c 31 20 7c 7c  age)->nCell<1 ||
11af0 20 28 2a 70 70 50 61 67 65 29 2d 3e 69 6e 74 4b   (*ppPage)->intK
11b00 65 79 21 3d 70 43 75 72 2d 3e 63 75 72 49 6e 74  ey!=pCur->curInt
11b10 4b 65 79 29 20 29 7b 0a 20 20 20 20 72 63 20 3d  Key) ){.    rc =
11b20 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
11b30 42 4b 50 54 3b 0a 20 20 20 20 72 65 6c 65 61 73  BKPT;.    releas
11b40 65 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a  ePage(*ppPage);.
11b50 20 20 20 20 67 6f 74 6f 20 67 65 74 41 6e 64 49      goto getAndI
11b60 6e 69 74 50 61 67 65 5f 65 72 72 6f 72 3b 0a 20  nitPage_error;. 
11b70 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
11b80 54 45 5f 4f 4b 3b 0a 0a 67 65 74 41 6e 64 49 6e  TE_OK;..getAndIn
11b90 69 74 50 61 67 65 5f 65 72 72 6f 72 3a 0a 20 20  itPage_error:.  
11ba0 69 66 28 20 70 43 75 72 20 29 20 70 43 75 72 2d  if( pCur ) pCur-
11bb0 3e 69 50 61 67 65 2d 2d 3b 0a 20 20 74 65 73 74  >iPage--;.  test
11bc0 63 61 73 65 28 20 70 67 6e 6f 3d 3d 30 20 29 3b  case( pgno==0 );
11bd0 0a 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 21  .  assert( pgno!
11be0 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45  =0 || rc==SQLITE
11bf0 5f 43 4f 52 52 55 50 54 20 29 3b 0a 20 20 72 65  _CORRUPT );.  re
11c00 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
11c10 2a 20 52 65 6c 65 61 73 65 20 61 20 4d 65 6d 50  * Release a MemP
11c20 61 67 65 2e 20 20 54 68 69 73 20 73 68 6f 75 6c  age.  This shoul
11c30 64 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 63 65  d be called once
11c40 20 66 6f 72 20 65 61 63 68 20 70 72 69 6f 72 0a   for each prior.
11c50 2a 2a 20 63 61 6c 6c 20 74 6f 20 62 74 72 65 65  ** call to btree
11c60 47 65 74 50 61 67 65 2e 0a 2a 2f 0a 73 74 61 74  GetPage..*/.stat
11c70 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65 50  ic void releaseP
11c80 61 67 65 4e 6f 74 4e 75 6c 6c 28 4d 65 6d 50 61  ageNotNull(MemPa
11c90 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 61 73  ge *pPage){.  as
11ca0 73 65 72 74 28 20 70 50 61 67 65 2d 3e 61 44 61  sert( pPage->aDa
11cb0 74 61 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ta );.  assert( 
11cc0 70 50 61 67 65 2d 3e 70 42 74 20 29 3b 0a 20 20  pPage->pBt );.  
11cd0 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70  assert( pPage->p
11ce0 44 62 50 61 67 65 21 3d 30 20 29 3b 0a 20 20 61  DbPage!=0 );.  a
11cf0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
11d00 67 65 72 47 65 74 45 78 74 72 61 28 70 50 61 67  gerGetExtra(pPag
11d10 65 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d 20 28  e->pDbPage) == (
11d20 76 6f 69 64 2a 29 70 50 61 67 65 20 29 3b 0a 20  void*)pPage );. 
11d30 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
11d40 50 61 67 65 72 47 65 74 44 61 74 61 28 70 50 61  PagerGetData(pPa
11d50 67 65 2d 3e 70 44 62 50 61 67 65 29 3d 3d 70 50  ge->pDbPage)==pP
11d60 61 67 65 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20  age->aData );.  
11d70 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
11d80 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
11d90 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
11da0 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55  .  sqlite3PagerU
11db0 6e 72 65 66 4e 6f 74 4e 75 6c 6c 28 70 50 61 67  nrefNotNull(pPag
11dc0 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 7d 0a 73  e->pDbPage);.}.s
11dd0 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61  tatic void relea
11de0 73 65 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a  sePage(MemPage *
11df0 70 50 61 67 65 29 7b 0a 20 20 69 66 28 20 70 50  pPage){.  if( pP
11e00 61 67 65 20 29 20 72 65 6c 65 61 73 65 50 61 67  age ) releasePag
11e10 65 4e 6f 74 4e 75 6c 6c 28 70 50 61 67 65 29 3b  eNotNull(pPage);
11e20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 6e  .}../*.** Get an
11e30 20 75 6e 75 73 65 64 20 70 61 67 65 2e 0a 2a 2a   unused page..**
11e40 0a 2a 2a 20 54 68 69 73 20 77 6f 72 6b 73 20 6a  .** This works j
11e50 75 73 74 20 6c 69 6b 65 20 62 74 72 65 65 47 65  ust like btreeGe
11e60 74 50 61 67 65 28 29 20 77 69 74 68 20 74 68 65  tPage() with the
11e70 20 61 64 64 69 74 69 6f 6e 3a 0a 2a 2a 0a 2a 2a   addition:.**.**
11e80 20 20 20 2a 20 20 49 66 20 74 68 65 20 70 61 67     *  If the pag
11e90 65 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20  e is already in 
11ea0 75 73 65 20 66 6f 72 20 73 6f 6d 65 20 6f 74 68  use for some oth
11eb0 65 72 20 70 75 72 70 6f 73 65 2c 20 69 6d 6d 65  er purpose, imme
11ec0 64 69 61 74 65 6c 79 0a 2a 2a 20 20 20 20 20 20  diately.**      
11ed0 72 65 6c 65 61 73 65 20 69 74 20 61 6e 64 20 72  release it and r
11ee0 65 74 75 72 6e 20 61 6e 20 53 51 4c 49 54 45 5f  eturn an SQLITE_
11ef0 43 55 52 52 55 50 54 20 65 72 72 6f 72 2e 0a 2a  CURRUPT error..*
11f00 2a 20 20 20 2a 20 20 4d 61 6b 65 20 73 75 72 65  *   *  Make sure
11f10 20 74 68 65 20 69 73 49 6e 69 74 20 66 6c 61 67   the isInit flag
11f20 20 69 73 20 63 6c 65 61 72 0a 2a 2f 0a 73 74 61   is clear.*/.sta
11f30 74 69 63 20 69 6e 74 20 62 74 72 65 65 47 65 74  tic int btreeGet
11f40 55 6e 75 73 65 64 50 61 67 65 28 0a 20 20 42 74  UnusedPage(.  Bt
11f50 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20  Shared *pBt,    
11f60 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20     /* The btree 
11f70 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20  */.  Pgno pgno, 
11f80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
11f90 62 65 72 20 6f 66 20 74 68 65 20 70 61 67 65 20  ber of the page 
11fa0 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20 20 4d 65  to fetch */.  Me
11fb0 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20  mPage **ppPage, 
11fc0 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65     /* Return the
11fd0 20 70 61 67 65 20 69 6e 20 74 68 69 73 20 70 61   page in this pa
11fe0 72 61 6d 65 74 65 72 20 2a 2f 0a 20 20 69 6e 74  rameter */.  int
11ff0 20 66 6c 61 67 73 20 20 20 20 20 20 20 20 20 20   flags          
12000 20 20 2f 2a 20 50 41 47 45 52 5f 47 45 54 5f 4e    /* PAGER_GET_N
12010 4f 43 4f 4e 54 45 4e 54 20 6f 72 20 50 41 47 45  OCONTENT or PAGE
12020 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20 2a  R_GET_READONLY *
12030 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  /.){.  int rc = 
12040 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  btreeGetPage(pBt
12050 2c 20 70 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20  , pgno, ppPage, 
12060 66 6c 61 67 73 29 3b 0a 20 20 69 66 28 20 72 63  flags);.  if( rc
12070 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
12080 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 50 61     if( sqlite3Pa
12090 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28  gerPageRefcount(
120a0 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61  (*ppPage)->pDbPa
120b0 67 65 29 3e 31 20 29 7b 0a 20 20 20 20 20 20 72  ge)>1 ){.      r
120c0 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50 61  eleasePage(*ppPa
120d0 67 65 29 3b 0a 20 20 20 20 20 20 2a 70 70 50 61  ge);.      *ppPa
120e0 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65  ge = 0;.      re
120f0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
12100 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
12110 20 20 20 20 28 2a 70 70 50 61 67 65 29 2d 3e 69      (*ppPage)->i
12120 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 7d 65 6c  sInit = 0;.  }el
12130 73 65 7b 0a 20 20 20 20 2a 70 70 50 61 67 65 20  se{.    *ppPage 
12140 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
12150 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
12160 44 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63  During a rollbac
12170 6b 2c 20 77 68 65 6e 20 74 68 65 20 70 61 67 65  k, when the page
12180 72 20 72 65 6c 6f 61 64 73 20 69 6e 66 6f 72 6d  r reloads inform
12190 61 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65 20 63  ation into the c
121a0 61 63 68 65 0a 2a 2a 20 73 6f 20 74 68 61 74 20  ache.** so that 
121b0 74 68 65 20 63 61 63 68 65 20 69 73 20 72 65 73  the cache is res
121c0 74 6f 72 65 64 20 74 6f 20 69 74 73 20 6f 72 69  tored to its ori
121d0 67 69 6e 61 6c 20 73 74 61 74 65 20 61 74 20 74  ginal state at t
121e0 68 65 20 73 74 61 72 74 20 6f 66 0a 2a 2a 20 74  he start of.** t
121f0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  he transaction, 
12200 66 6f 72 20 65 61 63 68 20 70 61 67 65 20 72 65  for each page re
12210 73 74 6f 72 65 64 20 74 68 69 73 20 72 6f 75 74  stored this rout
12220 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  ine is called..*
12230 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
12240 65 20 6e 65 65 64 73 20 74 6f 20 72 65 73 65 74  e needs to reset
12250 20 74 68 65 20 65 78 74 72 61 20 64 61 74 61 20   the extra data 
12260 73 65 63 74 69 6f 6e 20 61 74 20 74 68 65 20 65  section at the e
12270 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20 70 61 67  nd of the.** pag
12280 65 20 74 6f 20 61 67 72 65 65 20 77 69 74 68 20  e to agree with 
12290 74 68 65 20 72 65 73 74 6f 72 65 64 20 64 61 74  the restored dat
122a0 61 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  a..*/.static voi
122b0 64 20 70 61 67 65 52 65 69 6e 69 74 28 44 62 50  d pageReinit(DbP
122c0 61 67 65 20 2a 70 44 61 74 61 29 7b 0a 20 20 4d  age *pData){.  M
122d0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20  emPage *pPage;. 
122e0 20 70 50 61 67 65 20 3d 20 28 4d 65 6d 50 61 67   pPage = (MemPag
122f0 65 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72  e *)sqlite3Pager
12300 47 65 74 45 78 74 72 61 28 70 44 61 74 61 29 3b  GetExtra(pData);
12310 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
12320 65 33 50 61 67 65 72 50 61 67 65 52 65 66 63 6f  e3PagerPageRefco
12330 75 6e 74 28 70 44 61 74 61 29 3e 30 20 29 3b 0a  unt(pData)>0 );.
12340 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 73 49    if( pPage->isI
12350 6e 69 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72  nit ){.    asser
12360 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
12370 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
12380 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 20 20  ->mutex) );.    
12390 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20  pPage->isInit = 
123a0 30 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  0;.    if( sqlit
123b0 65 33 50 61 67 65 72 50 61 67 65 52 65 66 63 6f  e3PagerPageRefco
123c0 75 6e 74 28 70 44 61 74 61 29 3e 31 20 29 7b 0a  unt(pData)>1 ){.
123d0 20 20 20 20 20 20 2f 2a 20 70 50 61 67 65 20 6d        /* pPage m
123e0 69 67 68 74 20 6e 6f 74 20 62 65 20 61 20 62 74  ight not be a bt
123f0 72 65 65 20 70 61 67 65 3b 20 20 69 74 20 6d 69  ree page;  it mi
12400 67 68 74 20 62 65 20 61 6e 20 6f 76 65 72 66 6c  ght be an overfl
12410 6f 77 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a  ow page.      **
12420 20 6f 72 20 70 74 72 6d 61 70 20 70 61 67 65 20   or ptrmap page 
12430 6f 72 20 61 20 66 72 65 65 20 70 61 67 65 2e 20  or a free page. 
12440 20 49 6e 20 74 68 6f 73 65 20 63 61 73 65 73 2c   In those cases,
12450 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20   the following. 
12460 20 20 20 20 20 2a 2a 20 63 61 6c 6c 20 74 6f 20       ** call to 
12470 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 20  btreeInitPage() 
12480 77 69 6c 6c 20 6c 69 6b 65 6c 79 20 72 65 74 75  will likely retu
12490 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
124a0 54 2e 0a 20 20 20 20 20 20 2a 2a 20 42 75 74 20  T..      ** But 
124b0 6e 6f 20 68 61 72 6d 20 69 73 20 64 6f 6e 65 20  no harm is done 
124c0 62 79 20 74 68 69 73 2e 20 20 41 6e 64 20 69 74  by this.  And it
124d0 20 69 73 20 76 65 72 79 20 69 6d 70 6f 72 74 61   is very importa
124e0 6e 74 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a  nt that.      **
124f0 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29   btreeInitPage()
12500 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 20 65 76   be called on ev
12510 65 72 79 20 62 74 72 65 65 20 70 61 67 65 20 73  ery btree page s
12520 6f 20 77 65 20 6d 61 6b 65 0a 20 20 20 20 20 20  o we make.      
12530 2a 2a 20 74 68 65 20 63 61 6c 6c 20 66 6f 72 20  ** the call for 
12540 65 76 65 72 79 20 70 61 67 65 20 74 68 61 74 20  every page that 
12550 63 6f 6d 65 73 20 69 6e 20 66 6f 72 20 72 65 2d  comes in for re-
12560 69 6e 69 74 69 6e 67 2e 20 2a 2f 0a 20 20 20 20  initing. */.    
12570 20 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28    btreeInitPage(
12580 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20  pPage);.    }.  
12590 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b  }.}../*.** Invok
125a0 65 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c  e the busy handl
125b0 65 72 20 66 6f 72 20 61 20 62 74 72 65 65 2e 0a  er for a btree..
125c0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74  */.static int bt
125d0 72 65 65 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e  reeInvokeBusyHan
125e0 64 6c 65 72 28 76 6f 69 64 20 2a 70 41 72 67 29  dler(void *pArg)
125f0 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
12600 74 20 3d 20 28 42 74 53 68 61 72 65 64 2a 29 70  t = (BtShared*)p
12610 41 72 67 3b 0a 20 20 61 73 73 65 72 74 28 20 70  Arg;.  assert( p
12620 42 74 2d 3e 64 62 20 29 3b 0a 20 20 61 73 73 65  Bt->db );.  asse
12630 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
12640 78 5f 68 65 6c 64 28 70 42 74 2d 3e 64 62 2d 3e  x_held(pBt->db->
12650 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 65 74 75  mutex) );.  retu
12660 72 6e 20 73 71 6c 69 74 65 33 49 6e 76 6f 6b 65  rn sqlite3Invoke
12670 42 75 73 79 48 61 6e 64 6c 65 72 28 26 70 42 74  BusyHandler(&pBt
12680 2d 3e 64 62 2d 3e 62 75 73 79 48 61 6e 64 6c 65  ->db->busyHandle
12690 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65  r);.}../*.** Ope
126a0 6e 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c  n a database fil
126b0 65 2e 0a 2a 2a 20 0a 2a 2a 20 7a 46 69 6c 65 6e  e..** .** zFilen
126c0 61 6d 65 20 69 73 20 74 68 65 20 6e 61 6d 65 20  ame is the name 
126d0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
126e0 66 69 6c 65 2e 20 20 49 66 20 7a 46 69 6c 65 6e  file.  If zFilen
126f0 61 6d 65 20 69 73 20 4e 55 4c 4c 0a 2a 2a 20 74  ame is NULL.** t
12700 68 65 6e 20 61 6e 20 65 70 68 65 6d 65 72 61 6c  hen an ephemeral
12710 20 64 61 74 61 62 61 73 65 20 69 73 20 63 72 65   database is cre
12720 61 74 65 64 2e 20 20 54 68 65 20 65 70 68 65 6d  ated.  The ephem
12730 65 72 61 6c 20 64 61 74 61 62 61 73 65 20 6d 69  eral database mi
12740 67 68 74 0a 2a 2a 20 62 65 20 65 78 63 6c 75 73  ght.** be exclus
12750 69 76 65 6c 79 20 69 6e 20 6d 65 6d 6f 72 79 2c  ively in memory,
12760 20 6f 72 20 69 74 20 6d 69 67 68 74 20 75 73 65   or it might use
12770 20 61 20 64 69 73 6b 2d 62 61 73 65 64 20 6d 65   a disk-based me
12780 6d 6f 72 79 20 63 61 63 68 65 2e 0a 2a 2a 20 45  mory cache..** E
12790 69 74 68 65 72 20 77 61 79 2c 20 74 68 65 20 65  ither way, the e
127a0 70 68 65 6d 65 72 61 6c 20 64 61 74 61 62 61 73  phemeral databas
127b0 65 20 77 69 6c 6c 20 62 65 20 61 75 74 6f 6d 61  e will be automa
127c0 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 64 20  tically deleted 
127d0 0a 2a 2a 20 77 68 65 6e 20 73 71 6c 69 74 65 33  .** when sqlite3
127e0 42 74 72 65 65 43 6c 6f 73 65 28 29 20 69 73 20  BtreeClose() is 
127f0 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  called..**.** If
12800 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 22 3a   zFilename is ":
12810 6d 65 6d 6f 72 79 3a 22 20 74 68 65 6e 20 61 6e  memory:" then an
12820 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
12830 61 73 65 20 69 73 20 63 72 65 61 74 65 64 0a 2a  ase is created.*
12840 2a 20 74 68 61 74 20 69 73 20 61 75 74 6f 6d 61  * that is automa
12850 74 69 63 61 6c 6c 79 20 64 65 73 74 72 6f 79 65  tically destroye
12860 64 20 77 68 65 6e 20 69 74 20 69 73 20 63 6c 6f  d when it is clo
12870 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 22  sed..**.** The "
12880 66 6c 61 67 73 22 20 70 61 72 61 6d 65 74 65 72  flags" parameter
12890 20 69 73 20 61 20 62 69 74 6d 61 73 6b 20 74 68   is a bitmask th
128a0 61 74 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e  at might contain
128b0 20 62 69 74 73 20 6c 69 6b 65 0a 2a 2a 20 42 54   bits like.** BT
128c0 52 45 45 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c  REE_OMIT_JOURNAL
128d0 20 61 6e 64 2f 6f 72 20 42 54 52 45 45 5f 4d 45   and/or BTREE_ME
128e0 4d 4f 52 59 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  MORY..**.** If t
128f0 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 61  he database is a
12900 6c 72 65 61 64 79 20 6f 70 65 6e 65 64 20 69 6e  lready opened in
12910 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62 61   the same databa
12920 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a  se connection.**
12930 20 61 6e 64 20 77 65 20 61 72 65 20 69 6e 20 73   and we are in s
12940 68 61 72 65 64 20 63 61 63 68 65 20 6d 6f 64 65  hared cache mode
12950 2c 20 74 68 65 6e 20 74 68 65 20 6f 70 65 6e 20  , then the open 
12960 77 69 6c 6c 20 66 61 69 6c 20 77 69 74 68 20 61  will fail with a
12970 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 4e 53  n.** SQLITE_CONS
12980 54 52 41 49 4e 54 20 65 72 72 6f 72 2e 20 20 57  TRAINT error.  W
12990 65 20 63 61 6e 6e 6f 74 20 61 6c 6c 6f 77 20 74  e cannot allow t
129a0 77 6f 20 6f 72 20 6d 6f 72 65 20 42 74 53 68 61  wo or more BtSha
129b0 72 65 64 0a 2a 2a 20 6f 62 6a 65 63 74 73 20 69  red.** objects i
129c0 6e 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  n the same datab
129d0 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73  ase connection s
129e0 69 6e 63 65 20 64 6f 69 6e 67 20 73 6f 20 77 69  ince doing so wi
129f0 6c 6c 20 6c 65 61 64 0a 2a 2a 20 74 6f 20 70 72  ll lead.** to pr
12a00 6f 62 6c 65 6d 73 20 77 69 74 68 20 6c 6f 63 6b  oblems with lock
12a10 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ing..*/.int sqli
12a20 74 65 33 42 74 72 65 65 4f 70 65 6e 28 0a 20 20  te3BtreeOpen(.  
12a30 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
12a40 73 2c 20 20 20 20 20 20 2f 2a 20 56 46 53 20 74  s,      /* VFS t
12a50 6f 20 75 73 65 20 66 6f 72 20 74 68 69 73 20 62  o use for this b
12a60 2d 74 72 65 65 20 2a 2f 0a 20 20 63 6f 6e 73 74  -tree */.  const
12a70 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
12a80 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68  ,  /* Name of th
12a90 65 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 69 6e  e file containin
12aa0 67 20 74 68 65 20 42 54 72 65 65 20 64 61 74 61  g the BTree data
12ab0 62 61 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  base */.  sqlite
12ac0 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20  3 *db,          
12ad0 20 20 2f 2a 20 41 73 73 6f 63 69 61 74 65 64 20    /* Associated 
12ae0 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
12af0 2a 2f 0a 20 20 42 74 72 65 65 20 2a 2a 70 70 42  */.  Btree **ppB
12b00 74 72 65 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  tree,        /* 
12b10 50 6f 69 6e 74 65 72 20 74 6f 20 6e 65 77 20 42  Pointer to new B
12b20 74 72 65 65 20 6f 62 6a 65 63 74 20 77 72 69 74  tree object writ
12b30 74 65 6e 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e  ten here */.  in
12b40 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20  t flags,        
12b50 20 20 20 20 20 20 2f 2a 20 4f 70 74 69 6f 6e 73        /* Options
12b60 20 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c 61   */.  int vfsFla
12b70 67 73 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  gs            /*
12b80 20 46 6c 61 67 73 20 70 61 73 73 65 64 20 74 68   Flags passed th
12b90 72 6f 75 67 68 20 74 6f 20 73 71 6c 69 74 65 33  rough to sqlite3
12ba0 5f 76 66 73 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a  _vfs.xOpen() */.
12bb0 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
12bc0 42 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  Bt = 0;         
12bd0 20 20 20 20 2f 2a 20 53 68 61 72 65 64 20 70 61      /* Shared pa
12be0 72 74 20 6f 66 20 62 74 72 65 65 20 73 74 72 75  rt of btree stru
12bf0 63 74 75 72 65 20 2a 2f 0a 20 20 42 74 72 65 65  cture */.  Btree
12c00 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20   *p;            
12c10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e            /* Han
12c20 64 6c 65 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f  dle to return */
12c30 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
12c40 20 2a 6d 75 74 65 78 4f 70 65 6e 20 3d 20 30 3b   *mutexOpen = 0;
12c50 20 20 2f 2a 20 50 72 65 76 65 6e 74 73 20 61 20    /* Prevents a 
12c60 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 2e 20  race condition. 
12c70 54 69 63 6b 65 74 20 23 33 35 33 37 20 2a 2f 0a  Ticket #3537 */.
12c80 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
12c90 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
12ca0 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20   /* Result code 
12cb0 66 72 6f 6d 20 74 68 69 73 20 66 75 6e 63 74 69  from this functi
12cc0 6f 6e 20 2a 2f 0a 20 20 75 38 20 6e 52 65 73 65  on */.  u8 nRese
12cd0 72 76 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  rve;            
12ce0 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 20 6f         /* Byte o
12cf0 66 20 75 6e 75 73 65 64 20 73 70 61 63 65 20 6f  f unused space o
12d00 6e 20 65 61 63 68 20 70 61 67 65 20 2a 2f 0a 20  n each page */. 
12d10 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 7a   unsigned char z
12d20 44 62 48 65 61 64 65 72 5b 31 30 30 5d 3b 20 20  DbHeader[100];  
12d30 2f 2a 20 44 61 74 61 62 61 73 65 20 68 65 61 64  /* Database head
12d40 65 72 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 0a 20  er content */.. 
12d50 20 2f 2a 20 54 72 75 65 20 69 66 20 6f 70 65 6e   /* True if open
12d60 69 6e 67 20 61 6e 20 65 70 68 65 6d 65 72 61 6c  ing an ephemeral
12d70 2c 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61  , temporary data
12d80 62 61 73 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  base */.  const 
12d90 69 6e 74 20 69 73 54 65 6d 70 44 62 20 3d 20 7a  int isTempDb = z
12da0 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 7c 7c 20 7a  Filename==0 || z
12db0 46 69 6c 65 6e 61 6d 65 5b 30 5d 3d 3d 30 3b 0a  Filename[0]==0;.
12dc0 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 76 61  .  /* Set the va
12dd0 72 69 61 62 6c 65 20 69 73 4d 65 6d 64 62 20 74  riable isMemdb t
12de0 6f 20 74 72 75 65 20 66 6f 72 20 61 6e 20 69 6e  o true for an in
12df0 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
12e00 2c 20 6f 72 20 0a 20 20 2a 2a 20 66 61 6c 73 65  , or .  ** false
12e10 20 66 6f 72 20 61 20 66 69 6c 65 2d 62 61 73 65   for a file-base
12e20 64 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f  d database..  */
12e30 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
12e40 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 20 20 63  MIT_MEMORYDB.  c
12e50 6f 6e 73 74 20 69 6e 74 20 69 73 4d 65 6d 64 62  onst int isMemdb
12e60 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 20 20 63 6f   = 0;.#else.  co
12e70 6e 73 74 20 69 6e 74 20 69 73 4d 65 6d 64 62 20  nst int isMemdb 
12e80 3d 20 28 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20  = (zFilename && 
12e90 73 74 72 63 6d 70 28 7a 46 69 6c 65 6e 61 6d 65  strcmp(zFilename
12ea0 2c 20 22 3a 6d 65 6d 6f 72 79 3a 22 29 3d 3d 30  , ":memory:")==0
12eb0 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
12ec0 20 20 20 20 20 20 20 20 20 7c 7c 20 28 69 73 54           || (isT
12ed0 65 6d 70 44 62 20 26 26 20 73 71 6c 69 74 65 33  empDb && sqlite3
12ee0 54 65 6d 70 49 6e 4d 65 6d 6f 72 79 28 64 62 29  TempInMemory(db)
12ef0 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
12f00 20 20 20 20 20 20 20 20 20 7c 7c 20 28 76 66 73           || (vfs
12f10 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  Flags & SQLITE_O
12f20 50 45 4e 5f 4d 45 4d 4f 52 59 29 21 3d 30 3b 0a  PEN_MEMORY)!=0;.
12f30 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74  #endif..  assert
12f40 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 61 73 73  ( db!=0 );.  ass
12f50 65 72 74 28 20 70 56 66 73 21 3d 30 20 29 3b 0a  ert( pVfs!=0 );.
12f60 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
12f70 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d  3_mutex_held(db-
12f80 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
12f90 65 72 74 28 20 28 66 6c 61 67 73 26 30 78 66 66  ert( (flags&0xff
12fa0 29 3d 3d 66 6c 61 67 73 20 29 3b 20 20 20 2f 2a  )==flags );   /*
12fb0 20 66 6c 61 67 73 20 66 69 74 20 69 6e 20 38 20   flags fit in 8 
12fc0 62 69 74 73 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 6e  bits */..  /* On
12fd0 6c 79 20 61 20 42 54 52 45 45 5f 53 49 4e 47 4c  ly a BTREE_SINGL
12fe0 45 20 64 61 74 61 62 61 73 65 20 63 61 6e 20 62  E database can b
12ff0 65 20 42 54 52 45 45 5f 55 4e 4f 52 44 45 52 45  e BTREE_UNORDERE
13000 44 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28  D */.  assert( (
13010 66 6c 61 67 73 20 26 20 42 54 52 45 45 5f 55 4e  flags & BTREE_UN
13020 4f 52 44 45 52 45 44 29 3d 3d 30 20 7c 7c 20 28  ORDERED)==0 || (
13030 66 6c 61 67 73 20 26 20 42 54 52 45 45 5f 53 49  flags & BTREE_SI
13040 4e 47 4c 45 29 21 3d 30 20 29 3b 0a 0a 20 20 2f  NGLE)!=0 );..  /
13050 2a 20 41 20 42 54 52 45 45 5f 53 49 4e 47 4c 45  * A BTREE_SINGLE
13060 20 64 61 74 61 62 61 73 65 20 69 73 20 61 6c 77   database is alw
13070 61 79 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20  ays a temporary 
13080 61 6e 64 2f 6f 72 20 65 70 68 65 6d 65 72 61 6c  and/or ephemeral
13090 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 66   */.  assert( (f
130a0 6c 61 67 73 20 26 20 42 54 52 45 45 5f 53 49 4e  lags & BTREE_SIN
130b0 47 4c 45 29 3d 3d 30 20 7c 7c 20 69 73 54 65 6d  GLE)==0 || isTem
130c0 70 44 62 20 29 3b 0a 0a 20 20 69 66 28 20 69 73  pDb );..  if( is
130d0 4d 65 6d 64 62 20 29 7b 0a 20 20 20 20 66 6c 61  Memdb ){.    fla
130e0 67 73 20 7c 3d 20 42 54 52 45 45 5f 4d 45 4d 4f  gs |= BTREE_MEMO
130f0 52 59 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 76  RY;.  }.  if( (v
13100 66 73 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45  fsFlags & SQLITE
13110 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 29 21 3d  _OPEN_MAIN_DB)!=
13120 30 20 26 26 20 28 69 73 4d 65 6d 64 62 20 7c 7c  0 && (isMemdb ||
13130 20 69 73 54 65 6d 70 44 62 29 20 29 7b 0a 20 20   isTempDb) ){.  
13140 20 20 76 66 73 46 6c 61 67 73 20 3d 20 28 76 66    vfsFlags = (vf
13150 73 46 6c 61 67 73 20 26 20 7e 53 51 4c 49 54 45  sFlags & ~SQLITE
13160 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 29 20 7c  _OPEN_MAIN_DB) |
13170 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d   SQLITE_OPEN_TEM
13180 50 5f 44 42 3b 0a 20 20 7d 0a 20 20 70 20 3d 20  P_DB;.  }.  p = 
13190 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72  sqlite3MallocZer
131a0 6f 28 73 69 7a 65 6f 66 28 42 74 72 65 65 29 29  o(sizeof(Btree))
131b0 3b 0a 20 20 69 66 28 20 21 70 20 29 7b 0a 20 20  ;.  if( !p ){.  
131c0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
131d0 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a  NOMEM_BKPT;.  }.
131e0 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54    p->inTrans = T
131f0 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 70 2d 3e  RANS_NONE;.  p->
13200 64 62 20 3d 20 64 62 3b 0a 23 69 66 6e 64 65 66  db = db;.#ifndef
13210 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41   SQLITE_OMIT_SHA
13220 52 45 44 5f 43 41 43 48 45 0a 20 20 70 2d 3e 6c  RED_CACHE.  p->l
13230 6f 63 6b 2e 70 42 74 72 65 65 20 3d 20 70 3b 0a  ock.pBtree = p;.
13240 20 20 70 2d 3e 6c 6f 63 6b 2e 69 54 61 62 6c 65    p->lock.iTable
13250 20 3d 20 31 3b 0a 23 65 6e 64 69 66 0a 0a 23 69   = 1;.#endif..#i
13260 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
13270 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
13280 43 48 45 29 20 26 26 20 21 64 65 66 69 6e 65 64  CHE) && !defined
13290 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53  (SQLITE_OMIT_DIS
132a0 4b 49 4f 29 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49  KIO).  /*.  ** I
132b0 66 20 74 68 69 73 20 42 74 72 65 65 20 69 73 20  f this Btree is 
132c0 61 20 63 61 6e 64 69 64 61 74 65 20 66 6f 72 20  a candidate for 
132d0 73 68 61 72 65 64 20 63 61 63 68 65 2c 20 74 72  shared cache, tr
132e0 79 20 74 6f 20 66 69 6e 64 20 61 6e 0a 20 20 2a  y to find an.  *
132f0 2a 20 65 78 69 73 74 69 6e 67 20 42 74 53 68 61  * existing BtSha
13300 72 65 64 20 6f 62 6a 65 63 74 20 74 68 61 74 20  red object that 
13310 77 65 20 63 61 6e 20 73 68 61 72 65 20 77 69 74  we can share wit
13320 68 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 54  h.  */.  if( isT
13330 65 6d 70 44 62 3d 3d 30 20 26 26 20 28 69 73 4d  empDb==0 && (isM
13340 65 6d 64 62 3d 3d 30 20 7c 7c 20 28 76 66 73 46  emdb==0 || (vfsF
13350 6c 61 67 73 26 53 51 4c 49 54 45 5f 4f 50 45 4e  lags&SQLITE_OPEN
13360 5f 55 52 49 29 21 3d 30 29 20 29 7b 0a 20 20 20  _URI)!=0) ){.   
13370 20 69 66 28 20 76 66 73 46 6c 61 67 73 20 26 20   if( vfsFlags & 
13380 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 48 41 52  SQLITE_OPEN_SHAR
13390 45 44 43 41 43 48 45 20 29 7b 0a 20 20 20 20 20  EDCACHE ){.     
133a0 20 69 6e 74 20 6e 46 69 6c 65 6e 61 6d 65 20 3d   int nFilename =
133b0 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
133c0 28 7a 46 69 6c 65 6e 61 6d 65 29 2b 31 3b 0a 20  (zFilename)+1;. 
133d0 20 20 20 20 20 69 6e 74 20 6e 46 75 6c 6c 50 61       int nFullPa
133e0 74 68 6e 61 6d 65 20 3d 20 70 56 66 73 2d 3e 6d  thname = pVfs->m
133f0 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20 20  xPathname+1;.   
13400 20 20 20 63 68 61 72 20 2a 7a 46 75 6c 6c 50 61     char *zFullPa
13410 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  thname = sqlite3
13420 4d 61 6c 6c 6f 63 28 4d 41 58 28 6e 46 75 6c 6c  Malloc(MAX(nFull
13430 50 61 74 68 6e 61 6d 65 2c 6e 46 69 6c 65 6e 61  Pathname,nFilena
13440 6d 65 29 29 3b 0a 20 20 20 20 20 20 4d 55 54 45  me));.      MUTE
13450 58 5f 4c 4f 47 49 43 28 20 73 71 6c 69 74 65 33  X_LOGIC( sqlite3
13460 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 53 68 61  _mutex *mutexSha
13470 72 65 64 3b 20 29 0a 0a 20 20 20 20 20 20 70 2d  red; )..      p-
13480 3e 73 68 61 72 61 62 6c 65 20 3d 20 31 3b 0a 20  >sharable = 1;. 
13490 20 20 20 20 20 69 66 28 20 21 7a 46 75 6c 6c 50       if( !zFullP
134a0 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20  athname ){.     
134b0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
134c0 70 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  p);.        retu
134d0 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f  rn SQLITE_NOMEM_
134e0 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20  BKPT;.      }.  
134f0 20 20 20 20 69 66 28 20 69 73 4d 65 6d 64 62 20      if( isMemdb 
13500 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  ){.        memcp
13510 79 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c  y(zFullPathname,
13520 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 46 69 6c   zFilename, nFil
13530 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 65  ename);.      }e
13540 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20  lse{.        rc 
13550 3d 20 73 71 6c 69 74 65 33 4f 73 46 75 6c 6c 50  = sqlite3OsFullP
13560 61 74 68 6e 61 6d 65 28 70 56 66 73 2c 20 7a 46  athname(pVfs, zF
13570 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 20 20 20 20  ilename,.       
13580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13590 20 20 20 20 20 20 20 20 20 20 20 20 6e 46 75 6c              nFul
135a0 6c 50 61 74 68 6e 61 6d 65 2c 20 7a 46 75 6c 6c  lPathname, zFull
135b0 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20  Pathname);.     
135c0 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
135d0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
135e0 72 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  ree(zFullPathnam
135f0 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  e);.          sq
13600 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20  lite3_free(p);. 
13610 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
13620 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rc;.        }.  
13630 20 20 20 20 7d 0a 23 69 66 20 53 51 4c 49 54 45      }.#if SQLITE
13640 5f 54 48 52 45 41 44 53 41 46 45 0a 20 20 20 20  _THREADSAFE.    
13650 20 20 6d 75 74 65 78 4f 70 65 6e 20 3d 20 73 71    mutexOpen = sq
13660 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28  lite3MutexAlloc(
13670 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41  SQLITE_MUTEX_STA
13680 54 49 43 5f 4f 50 45 4e 29 3b 0a 20 20 20 20 20  TIC_OPEN);.     
13690 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
136a0 6e 74 65 72 28 6d 75 74 65 78 4f 70 65 6e 29 3b  nter(mutexOpen);
136b0 0a 20 20 20 20 20 20 6d 75 74 65 78 53 68 61 72  .      mutexShar
136c0 65 64 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65  ed = sqlite3Mute
136d0 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55  xAlloc(SQLITE_MU
136e0 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45  TEX_STATIC_MASTE
136f0 52 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  R);.      sqlite
13700 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 75  3_mutex_enter(mu
13710 74 65 78 53 68 61 72 65 64 29 3b 0a 23 65 6e 64  texShared);.#end
13720 69 66 0a 20 20 20 20 20 20 66 6f 72 28 70 42 74  if.      for(pBt
13730 3d 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64  =GLOBAL(BtShared
13740 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64 43  *,sqlite3SharedC
13750 61 63 68 65 4c 69 73 74 29 3b 20 70 42 74 3b 20  acheList); pBt; 
13760 70 42 74 3d 70 42 74 2d 3e 70 4e 65 78 74 29 7b  pBt=pBt->pNext){
13770 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
13780 20 70 42 74 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a   pBt->nRef>0 );.
13790 20 20 20 20 20 20 20 20 69 66 28 20 30 3d 3d 73          if( 0==s
137a0 74 72 63 6d 70 28 7a 46 75 6c 6c 50 61 74 68 6e  trcmp(zFullPathn
137b0 61 6d 65 2c 20 73 71 6c 69 74 65 33 50 61 67 65  ame, sqlite3Page
137c0 72 46 69 6c 65 6e 61 6d 65 28 70 42 74 2d 3e 70  rFilename(pBt->p
137d0 50 61 67 65 72 2c 20 30 29 29 0a 20 20 20 20 20  Pager, 0)).     
137e0 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 73              && s
137f0 71 6c 69 74 65 33 50 61 67 65 72 56 66 73 28 70  qlite3PagerVfs(p
13800 42 74 2d 3e 70 50 61 67 65 72 29 3d 3d 70 56 66  Bt->pPager)==pVf
13810 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  s ){.          i
13820 6e 74 20 69 44 62 3b 0a 20 20 20 20 20 20 20 20  nt iDb;.        
13830 20 20 66 6f 72 28 69 44 62 3d 64 62 2d 3e 6e 44    for(iDb=db->nD
13840 62 2d 31 3b 20 69 44 62 3e 3d 30 3b 20 69 44 62  b-1; iDb>=0; iDb
13850 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  --){.           
13860 20 42 74 72 65 65 20 2a 70 45 78 69 73 74 69 6e   Btree *pExistin
13870 67 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  g = db->aDb[iDb]
13880 2e 70 42 74 3b 0a 20 20 20 20 20 20 20 20 20 20  .pBt;.          
13890 20 20 69 66 28 20 70 45 78 69 73 74 69 6e 67 20    if( pExisting 
138a0 26 26 20 70 45 78 69 73 74 69 6e 67 2d 3e 70 42  && pExisting->pB
138b0 74 3d 3d 70 42 74 20 29 7b 0a 20 20 20 20 20 20  t==pBt ){.      
138c0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
138d0 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65  mutex_leave(mute
138e0 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20 20  xShared);.      
138f0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
13900 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65  mutex_leave(mute
13910 78 4f 70 65 6e 29 3b 0a 20 20 20 20 20 20 20 20  xOpen);.        
13920 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
13930 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  ee(zFullPathname
13940 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
13950 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29   sqlite3_free(p)
13960 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
13970 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
13980 4e 53 54 52 41 49 4e 54 3b 0a 20 20 20 20 20 20  NSTRAINT;.      
13990 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
139a0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 2d    }.          p-
139b0 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 20 20  >pBt = pBt;.    
139c0 20 20 20 20 20 20 70 42 74 2d 3e 6e 52 65 66 2b        pBt->nRef+
139d0 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  +;.          bre
139e0 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
139f0 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
13a00 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
13a10 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20  mutexShared);.  
13a20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
13a30 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b  (zFullPathname);
13a40 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51  .    }.#ifdef SQ
13a50 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 65  LITE_DEBUG.    e
13a60 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e  lse{.      /* In
13a70 20 64 65 62 75 67 20 6d 6f 64 65 2c 20 77 65 20   debug mode, we 
13a80 6d 61 72 6b 20 61 6c 6c 20 70 65 72 73 69 73 74  mark all persist
13a90 65 6e 74 20 64 61 74 61 62 61 73 65 73 20 61 73  ent databases as
13aa0 20 73 68 61 72 61 62 6c 65 0a 20 20 20 20 20 20   sharable.      
13ab0 2a 2a 20 65 76 65 6e 20 77 68 65 6e 20 74 68 65  ** even when the
13ac0 79 20 61 72 65 20 6e 6f 74 2e 20 20 54 68 69 73  y are not.  This
13ad0 20 65 78 65 72 63 69 73 65 73 20 74 68 65 20 6c   exercises the l
13ae0 6f 63 6b 69 6e 67 20 63 6f 64 65 20 61 6e 64 0a  ocking code and.
13af0 20 20 20 20 20 20 2a 2a 20 67 69 76 65 73 20 6d        ** gives m
13b00 6f 72 65 20 6f 70 70 6f 72 74 75 6e 69 74 79 20  ore opportunity 
13b10 66 6f 72 20 61 73 73 65 72 74 73 28 73 71 6c 69  for asserts(sqli
13b20 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 29  te3_mutex_held()
13b30 29 0a 20 20 20 20 20 20 2a 2a 20 73 74 61 74 65  ).      ** state
13b40 6d 65 6e 74 73 20 74 6f 20 66 69 6e 64 20 6c 6f  ments to find lo
13b50 63 6b 69 6e 67 20 70 72 6f 62 6c 65 6d 73 2e 0a  cking problems..
13b60 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70        */.      p
13b70 2d 3e 73 68 61 72 61 62 6c 65 20 3d 20 31 3b 0a  ->sharable = 1;.
13b80 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
13b90 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 42  .#endif.  if( pB
13ba0 74 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 0a 20  t==0 ){.    /*. 
13bb0 20 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77     ** The follow
13bc0 69 6e 67 20 61 73 73 65 72 74 73 20 6d 61 6b 65  ing asserts make
13bd0 20 73 75 72 65 20 74 68 61 74 20 73 74 72 75 63   sure that struc
13be0 74 75 72 65 73 20 75 73 65 64 20 62 79 20 74 68  tures used by th
13bf0 65 20 62 74 72 65 65 20 61 72 65 0a 20 20 20 20  e btree are.    
13c00 2a 2a 20 74 68 65 20 72 69 67 68 74 20 73 69 7a  ** the right siz
13c10 65 2e 20 20 54 68 69 73 20 69 73 20 74 6f 20 67  e.  This is to g
13c20 75 61 72 64 20 61 67 61 69 6e 73 74 20 73 69 7a  uard against siz
13c30 65 20 63 68 61 6e 67 65 73 20 74 68 61 74 20 72  e changes that r
13c40 65 73 75 6c 74 0a 20 20 20 20 2a 2a 20 77 68 65  esult.    ** whe
13c50 6e 20 63 6f 6d 70 69 6c 69 6e 67 20 6f 6e 20 61  n compiling on a
13c60 20 64 69 66 66 65 72 65 6e 74 20 61 72 63 68 69   different archi
13c70 74 65 63 74 75 72 65 2e 0a 20 20 20 20 2a 2f 0a  tecture..    */.
13c80 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65      assert( size
13c90 6f 66 28 69 36 34 29 3d 3d 38 20 29 3b 0a 20 20  of(i64)==8 );.  
13ca0 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66    assert( sizeof
13cb0 28 75 36 34 29 3d 3d 38 20 29 3b 0a 20 20 20 20  (u64)==8 );.    
13cc0 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 75  assert( sizeof(u
13cd0 33 32 29 3d 3d 34 20 29 3b 0a 20 20 20 20 61 73  32)==4 );.    as
13ce0 73 65 72 74 28 20 73 69 7a 65 6f 66 28 75 31 36  sert( sizeof(u16
13cf0 29 3d 3d 32 20 29 3b 0a 20 20 20 20 61 73 73 65  )==2 );.    asse
13d00 72 74 28 20 73 69 7a 65 6f 66 28 50 67 6e 6f 29  rt( sizeof(Pgno)
13d10 3d 3d 34 20 29 3b 0a 20 20 0a 20 20 20 20 70 42  ==4 );.  .    pB
13d20 74 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  t = sqlite3Mallo
13d30 63 5a 65 72 6f 28 20 73 69 7a 65 6f 66 28 2a 70  cZero( sizeof(*p
13d40 42 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70  Bt) );.    if( p
13d50 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  Bt==0 ){.      r
13d60 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
13d70 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74  _BKPT;.      got
13d80 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74  o btree_open_out
13d90 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
13da0 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65   sqlite3PagerOpe
13db0 6e 28 70 56 66 73 2c 20 26 70 42 74 2d 3e 70 50  n(pVfs, &pBt->pP
13dc0 61 67 65 72 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c  ager, zFilename,
13dd0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
13de0 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f             sizeo
13df0 66 28 4d 65 6d 50 61 67 65 29 2c 20 66 6c 61 67  f(MemPage), flag
13e00 73 2c 20 76 66 73 46 6c 61 67 73 2c 20 70 61 67  s, vfsFlags, pag
13e10 65 52 65 69 6e 69 74 29 3b 0a 20 20 20 20 69 66  eReinit);.    if
13e20 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
13e30 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
13e40 50 61 67 65 72 53 65 74 4d 6d 61 70 4c 69 6d 69  PagerSetMmapLimi
13e50 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 64  t(pBt->pPager, d
13e60 62 2d 3e 73 7a 4d 6d 61 70 29 3b 0a 20 20 20 20  b->szMmap);.    
13e70 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
13e80 67 65 72 52 65 61 64 46 69 6c 65 68 65 61 64 65  gerReadFileheade
13e90 72 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 73 69  r(pBt->pPager,si
13ea0 7a 65 6f 66 28 7a 44 62 48 65 61 64 65 72 29 2c  zeof(zDbHeader),
13eb0 7a 44 62 48 65 61 64 65 72 29 3b 0a 20 20 20 20  zDbHeader);.    
13ec0 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  }.    if( rc!=SQ
13ed0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
13ee0 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e   goto btree_open
13ef0 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _out;.    }.    
13f00 70 42 74 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 3d  pBt->openFlags =
13f10 20 28 75 38 29 66 6c 61 67 73 3b 0a 20 20 20 20   (u8)flags;.    
13f20 70 42 74 2d 3e 64 62 20 3d 20 64 62 3b 0a 20 20  pBt->db = db;.  
13f30 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65    sqlite3PagerSe
13f40 74 42 75 73 79 68 61 6e 64 6c 65 72 28 70 42 74  tBusyhandler(pBt
13f50 2d 3e 70 50 61 67 65 72 2c 20 62 74 72 65 65 49  ->pPager, btreeI
13f60 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72  nvokeBusyHandler
13f70 2c 20 70 42 74 29 3b 0a 20 20 20 20 70 2d 3e 70  , pBt);.    p->p
13f80 42 74 20 3d 20 70 42 74 3b 0a 20 20 0a 20 20 20  Bt = pBt;.  .   
13f90 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20   pBt->pCursor = 
13fa0 30 3b 0a 20 20 20 20 70 42 74 2d 3e 70 50 61 67  0;.    pBt->pPag
13fb0 65 31 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  e1 = 0;.    if( 
13fc0 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 72 65  sqlite3PagerIsre
13fd0 61 64 6f 6e 6c 79 28 70 42 74 2d 3e 70 50 61 67  adonly(pBt->pPag
13fe0 65 72 29 20 29 20 70 42 74 2d 3e 62 74 73 46 6c  er) ) pBt->btsFl
13ff0 61 67 73 20 7c 3d 20 42 54 53 5f 52 45 41 44 5f  ags |= BTS_READ_
14000 4f 4e 4c 59 3b 0a 23 69 66 64 65 66 20 53 51 4c  ONLY;.#ifdef SQL
14010 49 54 45 5f 53 45 43 55 52 45 5f 44 45 4c 45 54  ITE_SECURE_DELET
14020 45 0a 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c  E.    pBt->btsFl
14030 61 67 73 20 7c 3d 20 42 54 53 5f 53 45 43 55 52  ags |= BTS_SECUR
14040 45 5f 44 45 4c 45 54 45 3b 0a 23 65 6e 64 69 66  E_DELETE;.#endif
14050 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45  .    /* EVIDENCE
14060 2d 4f 46 3a 20 52 2d 35 31 38 37 33 2d 33 39 36  -OF: R-51873-396
14070 31 38 20 54 68 65 20 70 61 67 65 20 73 69 7a 65  18 The page size
14080 20 66 6f 72 20 61 20 64 61 74 61 62 61 73 65 20   for a database 
14090 66 69 6c 65 20 69 73 0a 20 20 20 20 2a 2a 20 64  file is.    ** d
140a0 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65  etermined by the
140b0 20 32 2d 62 79 74 65 20 69 6e 74 65 67 65 72 20   2-byte integer 
140c0 6c 6f 63 61 74 65 64 20 61 74 20 61 6e 20 6f 66  located at an of
140d0 66 73 65 74 20 6f 66 20 31 36 20 62 79 74 65 73  fset of 16 bytes
140e0 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 74 68 65   from.    ** the
140f0 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68   beginning of th
14100 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
14110 20 2a 2f 0a 20 20 20 20 70 42 74 2d 3e 70 61 67   */.    pBt->pag
14120 65 53 69 7a 65 20 3d 20 28 7a 44 62 48 65 61 64  eSize = (zDbHead
14130 65 72 5b 31 36 5d 3c 3c 38 29 20 7c 20 28 7a 44  er[16]<<8) | (zD
14140 62 48 65 61 64 65 72 5b 31 37 5d 3c 3c 31 36 29  bHeader[17]<<16)
14150 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 70  ;.    if( pBt->p
14160 61 67 65 53 69 7a 65 3c 35 31 32 20 7c 7c 20 70  ageSize<512 || p
14170 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 53 51 4c  Bt->pageSize>SQL
14180 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a  ITE_MAX_PAGE_SIZ
14190 45 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 28 28  E.         || ((
141a0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2d 31 29  pBt->pageSize-1)
141b0 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 21  &pBt->pageSize)!
141c0 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d  =0 ){.      pBt-
141d0 3e 70 61 67 65 53 69 7a 65 20 3d 20 30 3b 0a 23  >pageSize = 0;.#
141e0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
141f0 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
14200 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6d 61      /* If the ma
14210 67 69 63 20 6e 61 6d 65 20 22 3a 6d 65 6d 6f 72  gic name ":memor
14220 79 3a 22 20 77 69 6c 6c 20 63 72 65 61 74 65 20  y:" will create 
14230 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  an in-memory dat
14240 61 62 61 73 65 2c 20 74 68 65 6e 0a 20 20 20 20  abase, then.    
14250 20 20 2a 2a 20 6c 65 61 76 65 20 74 68 65 20 61    ** leave the a
14260 75 74 6f 56 61 63 75 75 6d 20 6d 6f 64 65 20 61  utoVacuum mode a
14270 74 20 30 20 28 64 6f 20 6e 6f 74 20 61 75 74 6f  t 0 (do not auto
14280 2d 76 61 63 75 75 6d 29 2c 20 65 76 65 6e 20 69  -vacuum), even i
14290 66 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54  f.      ** SQLIT
142a0 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41  E_DEFAULT_AUTOVA
142b0 43 55 55 4d 20 69 73 20 74 72 75 65 2e 20 4f 6e  CUUM is true. On
142c0 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2c   the other hand,
142d0 20 69 66 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c   if.      ** SQL
142e0 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44  ITE_OMIT_MEMORYD
142f0 42 20 68 61 73 20 62 65 65 6e 20 64 65 66 69 6e  B has been defin
14300 65 64 2c 20 74 68 65 6e 20 22 3a 6d 65 6d 6f 72  ed, then ":memor
14310 79 3a 22 20 69 73 20 6a 75 73 74 20 61 0a 20 20  y:" is just a.  
14320 20 20 20 20 2a 2a 20 72 65 67 75 6c 61 72 20 66      ** regular f
14330 69 6c 65 2d 6e 61 6d 65 2e 20 49 6e 20 74 68 69  ile-name. In thi
14340 73 20 63 61 73 65 20 74 68 65 20 61 75 74 6f 2d  s case the auto-
14350 76 61 63 75 75 6d 20 61 70 70 6c 69 65 73 20 61  vacuum applies a
14360 73 20 70 65 72 20 6e 6f 72 6d 61 6c 2e 0a 20 20  s per normal..  
14370 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
14380 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 21 69   zFilename && !i
14390 73 4d 65 6d 64 62 20 29 7b 0a 20 20 20 20 20 20  sMemdb ){.      
143a0 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75    pBt->autoVacuu
143b0 6d 20 3d 20 28 53 51 4c 49 54 45 5f 44 45 46 41  m = (SQLITE_DEFA
143c0 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 3f  ULT_AUTOVACUUM ?
143d0 20 31 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 20   1 : 0);.       
143e0 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d   pBt->incrVacuum
143f0 20 3d 20 28 53 51 4c 49 54 45 5f 44 45 46 41 55   = (SQLITE_DEFAU
14400 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 3d 3d 32  LT_AUTOVACUUM==2
14410 20 3f 20 31 20 3a 20 30 29 3b 0a 20 20 20 20 20   ? 1 : 0);.     
14420 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
14430 6e 52 65 73 65 72 76 65 20 3d 20 30 3b 0a 20 20  nReserve = 0;.  
14440 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f    }else{.      /
14450 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
14460 2d 33 37 34 39 37 2d 34 32 34 31 32 20 54 68 65  -37497-42412 The
14470 20 73 69 7a 65 20 6f 66 20 74 68 65 20 72 65 73   size of the res
14480 65 72 76 65 64 20 72 65 67 69 6f 6e 20 69 73 0a  erved region is.
14490 20 20 20 20 20 20 2a 2a 20 64 65 74 65 72 6d 69        ** determi
144a0 6e 65 64 20 62 79 20 74 68 65 20 6f 6e 65 2d 62  ned by the one-b
144b0 79 74 65 20 75 6e 73 69 67 6e 65 64 20 69 6e 74  yte unsigned int
144c0 65 67 65 72 20 66 6f 75 6e 64 20 61 74 20 61 6e  eger found at an
144d0 20 6f 66 66 73 65 74 20 6f 66 20 32 30 0a 20 20   offset of 20.  
144e0 20 20 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20      ** into the 
144f0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 65  database file he
14500 61 64 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 6e  ader. */.      n
14510 52 65 73 65 72 76 65 20 3d 20 7a 44 62 48 65 61  Reserve = zDbHea
14520 64 65 72 5b 32 30 5d 3b 0a 20 20 20 20 20 20 70  der[20];.      p
14530 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20  Bt->btsFlags |= 
14540 42 54 53 5f 50 41 47 45 53 49 5a 45 5f 46 49 58  BTS_PAGESIZE_FIX
14550 45 44 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  ED;.#ifndef SQLI
14560 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
14570 55 4d 0a 20 20 20 20 20 20 70 42 74 2d 3e 61 75  UM.      pBt->au
14580 74 6f 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34  toVacuum = (get4
14590 62 79 74 65 28 26 7a 44 62 48 65 61 64 65 72 5b  byte(&zDbHeader[
145a0 33 36 20 2b 20 34 2a 34 5d 29 3f 31 3a 30 29 3b  36 + 4*4])?1:0);
145b0 0a 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 63 72  .      pBt->incr
145c0 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79  Vacuum = (get4by
145d0 74 65 28 26 7a 44 62 48 65 61 64 65 72 5b 33 36  te(&zDbHeader[36
145e0 20 2b 20 37 2a 34 5d 29 3f 31 3a 30 29 3b 0a 23   + 7*4])?1:0);.#
145f0 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20  endif.    }.    
14600 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
14610 72 53 65 74 50 61 67 65 73 69 7a 65 28 70 42 74  rSetPagesize(pBt
14620 2d 3e 70 50 61 67 65 72 2c 20 26 70 42 74 2d 3e  ->pPager, &pBt->
14630 70 61 67 65 53 69 7a 65 2c 20 6e 52 65 73 65 72  pageSize, nReser
14640 76 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  ve);.    if( rc 
14650 29 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65  ) goto btree_ope
14660 6e 5f 6f 75 74 3b 0a 20 20 20 20 70 42 74 2d 3e  n_out;.    pBt->
14670 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74  usableSize = pBt
14680 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 6e 52 65  ->pageSize - nRe
14690 73 65 72 76 65 3b 0a 20 20 20 20 61 73 73 65 72  serve;.    asser
146a0 74 28 20 28 70 42 74 2d 3e 70 61 67 65 53 69 7a  t( (pBt->pageSiz
146b0 65 20 26 20 37 29 3d 3d 30 20 29 3b 20 20 2f 2a  e & 7)==0 );  /*
146c0 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 6d 65 6e   8-byte alignmen
146d0 74 20 6f 66 20 70 61 67 65 53 69 7a 65 20 2a 2f  t of pageSize */
146e0 0a 20 20 20 0a 23 69 66 20 21 64 65 66 69 6e 65  .   .#if !define
146f0 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  d(SQLITE_OMIT_SH
14700 41 52 45 44 5f 43 41 43 48 45 29 20 26 26 20 21  ARED_CACHE) && !
14710 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
14720 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20 20 20  MIT_DISKIO).    
14730 2f 2a 20 41 64 64 20 74 68 65 20 6e 65 77 20 42  /* Add the new B
14740 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74 20 74  tShared object t
14750 6f 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73  o the linked lis
14760 74 20 73 68 61 72 61 62 6c 65 20 42 74 53 68 61  t sharable BtSha
14770 72 65 64 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  reds..    */.   
14780 20 70 42 74 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a   pBt->nRef = 1;.
14790 20 20 20 20 69 66 28 20 70 2d 3e 73 68 61 72 61      if( p->shara
147a0 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 4d 55 54  ble ){.      MUT
147b0 45 58 5f 4c 4f 47 49 43 28 20 73 71 6c 69 74 65  EX_LOGIC( sqlite
147c0 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 53 68  3_mutex *mutexSh
147d0 61 72 65 64 3b 20 29 0a 20 20 20 20 20 20 4d 55  ared; ).      MU
147e0 54 45 58 5f 4c 4f 47 49 43 28 20 6d 75 74 65 78  TEX_LOGIC( mutex
147f0 53 68 61 72 65 64 20 3d 20 73 71 6c 69 74 65 33  Shared = sqlite3
14800 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54  MutexAlloc(SQLIT
14810 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d  E_MUTEX_STATIC_M
14820 41 53 54 45 52 29 3b 29 0a 20 20 20 20 20 20 69  ASTER);).      i
14830 66 28 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44  f( SQLITE_THREAD
14840 53 41 46 45 20 26 26 20 73 71 6c 69 74 65 33 47  SAFE && sqlite3G
14850 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72  lobalConfig.bCor
14860 65 4d 75 74 65 78 20 29 7b 0a 20 20 20 20 20 20  eMutex ){.      
14870 20 20 70 42 74 2d 3e 6d 75 74 65 78 20 3d 20 73    pBt->mutex = s
14880 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63  qlite3MutexAlloc
14890 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 46 41  (SQLITE_MUTEX_FA
148a0 53 54 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ST);.        if(
148b0 20 70 42 74 2d 3e 6d 75 74 65 78 3d 3d 30 20 29   pBt->mutex==0 )
148c0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
148d0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
148e0 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f  PT;.          go
148f0 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75  to btree_open_ou
14900 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  t;.        }.   
14910 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
14920 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d  e3_mutex_enter(m
14930 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20  utexShared);.   
14940 20 20 20 70 42 74 2d 3e 70 4e 65 78 74 20 3d 20     pBt->pNext = 
14950 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a  GLOBAL(BtShared*
14960 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61  ,sqlite3SharedCa
14970 63 68 65 4c 69 73 74 29 3b 0a 20 20 20 20 20 20  cheList);.      
14980 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a  GLOBAL(BtShared*
14990 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61  ,sqlite3SharedCa
149a0 63 68 65 4c 69 73 74 29 20 3d 20 70 42 74 3b 0a  cheList) = pBt;.
149b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
149c0 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 53  tex_leave(mutexS
149d0 68 61 72 65 64 29 3b 0a 20 20 20 20 7d 0a 23 65  hared);.    }.#e
149e0 6e 64 69 66 0a 20 20 7d 0a 0a 23 69 66 20 21 64  ndif.  }..#if !d
149f0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
14a00 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29  IT_SHARED_CACHE)
14a10 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
14a20 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29  ITE_OMIT_DISKIO)
14a30 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 6e 65 77  .  /* If the new
14a40 20 42 74 72 65 65 20 75 73 65 73 20 61 20 73 68   Btree uses a sh
14a50 61 72 61 62 6c 65 20 70 42 74 53 68 61 72 65 64  arable pBtShared
14a60 2c 20 74 68 65 6e 20 6c 69 6e 6b 20 74 68 65 20  , then link the 
14a70 6e 65 77 0a 20 20 2a 2a 20 42 74 72 65 65 20 69  new.  ** Btree i
14a80 6e 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20  nto the list of 
14a90 61 6c 6c 20 73 68 61 72 61 62 6c 65 20 42 74 72  all sharable Btr
14aa0 65 65 73 20 66 6f 72 20 74 68 65 20 73 61 6d 65  ees for the same
14ab0 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 20 20 2a   connection..  *
14ac0 2a 20 54 68 65 20 6c 69 73 74 20 69 73 20 6b 65  * The list is ke
14ad0 70 74 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20  pt in ascending 
14ae0 6f 72 64 65 72 20 62 79 20 70 42 74 20 61 64 64  order by pBt add
14af0 72 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ress..  */.  if(
14b00 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a   p->sharable ){.
14b10 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 42      int i;.    B
14b20 74 72 65 65 20 2a 70 53 69 62 3b 0a 20 20 20 20  tree *pSib;.    
14b30 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e  for(i=0; i<db->n
14b40 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  Db; i++){.      
14b50 69 66 28 20 28 70 53 69 62 20 3d 20 64 62 2d 3e  if( (pSib = db->
14b60 61 44 62 5b 69 5d 2e 70 42 74 29 21 3d 30 20 26  aDb[i].pBt)!=0 &
14b70 26 20 70 53 69 62 2d 3e 73 68 61 72 61 62 6c 65  & pSib->sharable
14b80 20 29 7b 0a 20 20 20 20 20 20 20 20 77 68 69 6c   ){.        whil
14b90 65 28 20 70 53 69 62 2d 3e 70 50 72 65 76 20 29  e( pSib->pPrev )
14ba0 7b 20 70 53 69 62 20 3d 20 70 53 69 62 2d 3e 70  { pSib = pSib->p
14bb0 50 72 65 76 3b 20 7d 0a 20 20 20 20 20 20 20 20  Prev; }.        
14bc0 69 66 28 20 28 75 70 74 72 29 70 2d 3e 70 42 74  if( (uptr)p->pBt
14bd0 3c 28 75 70 74 72 29 70 53 69 62 2d 3e 70 42 74  <(uptr)pSib->pBt
14be0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d   ){.          p-
14bf0 3e 70 4e 65 78 74 20 3d 20 70 53 69 62 3b 0a 20  >pNext = pSib;. 
14c00 20 20 20 20 20 20 20 20 20 70 2d 3e 70 50 72 65           p->pPre
14c10 76 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  v = 0;.         
14c20 20 70 53 69 62 2d 3e 70 50 72 65 76 20 3d 20 70   pSib->pPrev = p
14c30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
14c40 0a 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65  .          while
14c50 28 20 70 53 69 62 2d 3e 70 4e 65 78 74 20 26 26  ( pSib->pNext &&
14c60 20 28 75 70 74 72 29 70 53 69 62 2d 3e 70 4e 65   (uptr)pSib->pNe
14c70 78 74 2d 3e 70 42 74 3c 28 75 70 74 72 29 70 2d  xt->pBt<(uptr)p-
14c80 3e 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20  >pBt ){.        
14c90 20 20 20 20 70 53 69 62 20 3d 20 70 53 69 62 2d      pSib = pSib-
14ca0 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20  >pNext;.        
14cb0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 2d    }.          p-
14cc0 3e 70 4e 65 78 74 20 3d 20 70 53 69 62 2d 3e 70  >pNext = pSib->p
14cd0 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20  Next;.          
14ce0 70 2d 3e 70 50 72 65 76 20 3d 20 70 53 69 62 3b  p->pPrev = pSib;
14cf0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
14d00 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20  ->pNext ){.     
14d10 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 2d         p->pNext-
14d20 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20 20 20 20  >pPrev = p;.    
14d30 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
14d40 20 20 70 53 69 62 2d 3e 70 4e 65 78 74 20 3d 20    pSib->pNext = 
14d50 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  p;.        }.   
14d60 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
14d70 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65    }.    }.  }.#e
14d80 6e 64 69 66 0a 20 20 2a 70 70 42 74 72 65 65 20  ndif.  *ppBtree 
14d90 3d 20 70 3b 0a 0a 62 74 72 65 65 5f 6f 70 65 6e  = p;..btree_open
14da0 5f 6f 75 74 3a 0a 20 20 69 66 28 20 72 63 21 3d  _out:.  if( rc!=
14db0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
14dc0 20 69 66 28 20 70 42 74 20 26 26 20 70 42 74 2d   if( pBt && pBt-
14dd0 3e 70 50 61 67 65 72 20 29 7b 0a 20 20 20 20 20  >pPager ){.     
14de0 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f   sqlite3PagerClo
14df0 73 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  se(pBt->pPager, 
14e00 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  0);.    }.    sq
14e10 6c 69 74 65 33 5f 66 72 65 65 28 70 42 74 29 3b  lite3_free(pBt);
14e20 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
14e30 65 28 70 29 3b 0a 20 20 20 20 2a 70 70 42 74 72  e(p);.    *ppBtr
14e40 65 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  ee = 0;.  }else{
14e50 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  .    sqlite3_fil
14e60 65 20 2a 70 46 69 6c 65 3b 0a 0a 20 20 20 20 2f  e *pFile;..    /
14e70 2a 20 49 66 20 74 68 65 20 42 2d 54 72 65 65 20  * If the B-Tree 
14e80 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79  was successfully
14e90 20 6f 70 65 6e 65 64 2c 20 73 65 74 20 74 68 65   opened, set the
14ea0 20 70 61 67 65 72 2d 63 61 63 68 65 20 73 69 7a   pager-cache siz
14eb0 65 20 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20  e to the.    ** 
14ec0 64 65 66 61 75 6c 74 20 76 61 6c 75 65 2e 20 45  default value. E
14ed0 78 63 65 70 74 2c 20 77 68 65 6e 20 6f 70 65 6e  xcept, when open
14ee0 69 6e 67 20 6f 6e 20 61 6e 20 65 78 69 73 74 69  ing on an existi
14ef0 6e 67 20 73 68 61 72 65 64 20 70 61 67 65 72 2d  ng shared pager-
14f00 63 61 63 68 65 2c 0a 20 20 20 20 2a 2a 20 64 6f  cache,.    ** do
14f10 20 6e 6f 74 20 63 68 61 6e 67 65 20 74 68 65 20   not change the 
14f20 70 61 67 65 72 2d 63 61 63 68 65 20 73 69 7a 65  pager-cache size
14f30 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
14f40 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 63 68   sqlite3BtreeSch
14f50 65 6d 61 28 70 2c 20 30 2c 20 30 29 3d 3d 30 20  ema(p, 0, 0)==0 
14f60 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
14f70 50 61 67 65 72 53 65 74 43 61 63 68 65 73 69 7a  PagerSetCachesiz
14f80 65 28 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72  e(p->pBt->pPager
14f90 2c 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  , SQLITE_DEFAULT
14fa0 5f 43 41 43 48 45 5f 53 49 5a 45 29 3b 0a 20 20  _CACHE_SIZE);.  
14fb0 20 20 7d 0a 0a 20 20 20 20 70 46 69 6c 65 20 3d    }..    pFile =
14fc0 20 73 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c   sqlite3PagerFil
14fd0 65 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a  e(pBt->pPager);.
14fe0 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 70      if( pFile->p
14ff0 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 20  Methods ){.     
15000 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f   sqlite3OsFileCo
15010 6e 74 72 6f 6c 48 69 6e 74 28 70 46 69 6c 65 2c  ntrolHint(pFile,
15020 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 44   SQLITE_FCNTL_PD
15030 42 2c 20 28 76 6f 69 64 2a 29 26 70 42 74 2d 3e  B, (void*)&pBt->
15040 64 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  db);.    }.  }. 
15050 20 69 66 28 20 6d 75 74 65 78 4f 70 65 6e 20 29   if( mutexOpen )
15060 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  {.    assert( sq
15070 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
15080 28 6d 75 74 65 78 4f 70 65 6e 29 20 29 3b 0a 20  (mutexOpen) );. 
15090 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
150a0 5f 6c 65 61 76 65 28 6d 75 74 65 78 4f 70 65 6e  _leave(mutexOpen
150b0 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  );.  }.  assert(
150c0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
150d0 7c 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  | sqlite3BtreeCo
150e0 6e 6e 65 63 74 69 6f 6e 43 6f 75 6e 74 28 2a 70  nnectionCount(*p
150f0 70 42 74 72 65 65 29 3e 30 20 29 3b 0a 20 20 72  pBtree)>0 );.  r
15100 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
15110 2a 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65  ** Decrement the
15120 20 42 74 53 68 61 72 65 64 2e 6e 52 65 66 20 63   BtShared.nRef c
15130 6f 75 6e 74 65 72 2e 20 20 57 68 65 6e 20 69 74  ounter.  When it
15140 20 72 65 61 63 68 65 73 20 7a 65 72 6f 2c 0a 2a   reaches zero,.*
15150 2a 20 72 65 6d 6f 76 65 20 74 68 65 20 42 74 53  * remove the BtS
15160 68 61 72 65 64 20 73 74 72 75 63 74 75 72 65 20  hared structure 
15170 66 72 6f 6d 20 74 68 65 20 73 68 61 72 69 6e 67  from the sharing
15180 20 6c 69 73 74 2e 20 20 52 65 74 75 72 6e 0a 2a   list.  Return.*
15190 2a 20 74 72 75 65 20 69 66 20 74 68 65 20 42 74  * true if the Bt
151a0 53 68 61 72 65 64 2e 6e 52 65 66 20 63 6f 75 6e  Shared.nRef coun
151b0 74 65 72 20 72 65 61 63 68 65 73 20 7a 65 72 6f  ter reaches zero
151c0 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20 66   and return.** f
151d0 61 6c 73 65 20 69 66 20 69 74 20 69 73 20 73 74  alse if it is st
151e0 69 6c 6c 20 70 6f 73 69 74 69 76 65 2e 0a 2a 2f  ill positive..*/
151f0 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 6d 6f  .static int remo
15200 76 65 46 72 6f 6d 53 68 61 72 69 6e 67 4c 69 73  veFromSharingLis
15210 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29  t(BtShared *pBt)
15220 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
15230 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
15240 48 45 0a 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43  HE.  MUTEX_LOGIC
15250 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20  ( sqlite3_mutex 
15260 2a 70 4d 61 73 74 65 72 3b 20 29 0a 20 20 42 74  *pMaster; ).  Bt
15270 53 68 61 72 65 64 20 2a 70 4c 69 73 74 3b 0a 20  Shared *pList;. 
15280 20 69 6e 74 20 72 65 6d 6f 76 65 64 20 3d 20 30   int removed = 0
15290 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
152a0 69 74 65 33 5f 6d 75 74 65 78 5f 6e 6f 74 68 65  ite3_mutex_nothe
152b0 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
152c0 3b 0a 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28  ;.  MUTEX_LOGIC(
152d0 20 70 4d 61 73 74 65 72 20 3d 20 73 71 6c 69 74   pMaster = sqlit
152e0 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c  e3MutexAlloc(SQL
152f0 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43  ITE_MUTEX_STATIC
15300 5f 4d 41 53 54 45 52 29 3b 20 29 0a 20 20 73 71  _MASTER); ).  sq
15310 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
15320 72 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 70 42  r(pMaster);.  pB
15330 74 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28  t->nRef--;.  if(
15340 20 70 42 74 2d 3e 6e 52 65 66 3c 3d 30 20 29 7b   pBt->nRef<=0 ){
15350 0a 20 20 20 20 69 66 28 20 47 4c 4f 42 41 4c 28  .    if( GLOBAL(
15360 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65  BtShared*,sqlite
15370 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74  3SharedCacheList
15380 29 3d 3d 70 42 74 20 29 7b 0a 20 20 20 20 20 20  )==pBt ){.      
15390 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a  GLOBAL(BtShared*
153a0 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61  ,sqlite3SharedCa
153b0 63 68 65 4c 69 73 74 29 20 3d 20 70 42 74 2d 3e  cheList) = pBt->
153c0 70 4e 65 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65  pNext;.    }else
153d0 7b 0a 20 20 20 20 20 20 70 4c 69 73 74 20 3d 20  {.      pList = 
153e0 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a  GLOBAL(BtShared*
153f0 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61  ,sqlite3SharedCa
15400 63 68 65 4c 69 73 74 29 3b 0a 20 20 20 20 20 20  cheList);.      
15410 77 68 69 6c 65 28 20 41 4c 57 41 59 53 28 70 4c  while( ALWAYS(pL
15420 69 73 74 29 20 26 26 20 70 4c 69 73 74 2d 3e 70  ist) && pList->p
15430 4e 65 78 74 21 3d 70 42 74 20 29 7b 0a 20 20 20  Next!=pBt ){.   
15440 20 20 20 20 20 70 4c 69 73 74 3d 70 4c 69 73 74       pList=pList
15450 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d  ->pNext;.      }
15460 0a 20 20 20 20 20 20 69 66 28 20 41 4c 57 41 59  .      if( ALWAY
15470 53 28 70 4c 69 73 74 29 20 29 7b 0a 20 20 20 20  S(pList) ){.    
15480 20 20 20 20 70 4c 69 73 74 2d 3e 70 4e 65 78 74      pList->pNext
15490 20 3d 20 70 42 74 2d 3e 70 4e 65 78 74 3b 0a 20   = pBt->pNext;. 
154a0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
154b0 20 69 66 28 20 53 51 4c 49 54 45 5f 54 48 52 45   if( SQLITE_THRE
154c0 41 44 53 41 46 45 20 29 7b 0a 20 20 20 20 20 20  ADSAFE ){.      
154d0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66 72  sqlite3_mutex_fr
154e0 65 65 28 70 42 74 2d 3e 6d 75 74 65 78 29 3b 0a  ee(pBt->mutex);.
154f0 20 20 20 20 7d 0a 20 20 20 20 72 65 6d 6f 76 65      }.    remove
15500 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 73 71 6c  d = 1;.  }.  sql
15510 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
15520 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 72 65 74  (pMaster);.  ret
15530 75 72 6e 20 72 65 6d 6f 76 65 64 3b 0a 23 65 6c  urn removed;.#el
15540 73 65 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 23  se.  return 1;.#
15550 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  endif.}../*.** M
15560 61 6b 65 20 73 75 72 65 20 70 42 74 2d 3e 70 54  ake sure pBt->pT
15570 6d 70 53 70 61 63 65 20 70 6f 69 6e 74 73 20 74  mpSpace points t
15580 6f 20 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  o an allocation 
15590 6f 66 20 0a 2a 2a 20 4d 58 5f 43 45 4c 4c 5f 53  of .** MX_CELL_S
155a0 49 5a 45 28 70 42 74 29 20 62 79 74 65 73 20 77  IZE(pBt) bytes w
155b0 69 74 68 20 61 20 34 2d 62 79 74 65 20 70 72 65  ith a 4-byte pre
155c0 66 69 78 20 66 6f 72 20 61 20 6c 65 66 74 2d 63  fix for a left-c
155d0 68 69 6c 64 0a 2a 2a 20 70 6f 69 6e 74 65 72 2e  hild.** pointer.
155e0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
155f0 61 6c 6c 6f 63 61 74 65 54 65 6d 70 53 70 61 63  allocateTempSpac
15600 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29  e(BtShared *pBt)
15610 7b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 70 54  {.  if( !pBt->pT
15620 6d 70 53 70 61 63 65 20 29 7b 0a 20 20 20 20 70  mpSpace ){.    p
15630 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d 20  Bt->pTmpSpace = 
15640 73 71 6c 69 74 65 33 50 61 67 65 4d 61 6c 6c 6f  sqlite3PageMallo
15650 63 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  c( pBt->pageSize
15660 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 4f 6e 65 20   );..    /* One 
15670 6f 66 20 74 68 65 20 75 73 65 73 20 6f 66 20 70  of the uses of p
15680 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 69 73  Bt->pTmpSpace is
15690 20 74 6f 20 66 6f 72 6d 61 74 20 63 65 6c 6c 73   to format cells
156a0 20 62 65 66 6f 72 65 0a 20 20 20 20 2a 2a 20 69   before.    ** i
156b0 6e 73 65 72 74 69 6e 67 20 74 68 65 6d 20 69 6e  nserting them in
156c0 74 6f 20 61 20 6c 65 61 66 20 70 61 67 65 20 28  to a leaf page (
156d0 66 75 6e 63 74 69 6f 6e 20 66 69 6c 6c 49 6e 43  function fillInC
156e0 65 6c 6c 28 29 29 2e 20 49 66 0a 20 20 20 20 2a  ell()). If.    *
156f0 2a 20 61 20 63 65 6c 6c 20 69 73 20 6c 65 73 73  * a cell is less
15700 20 74 68 61 6e 20 34 20 62 79 74 65 73 20 69 6e   than 4 bytes in
15710 20 73 69 7a 65 2c 20 69 74 20 69 73 20 72 6f 75   size, it is rou
15720 6e 64 65 64 20 75 70 20 74 6f 20 34 20 62 79 74  nded up to 4 byt
15730 65 73 0a 20 20 20 20 2a 2a 20 62 79 20 74 68 65  es.    ** by the
15740 20 76 61 72 69 6f 75 73 20 72 6f 75 74 69 6e 65   various routine
15750 73 20 74 68 61 74 20 6d 61 6e 69 70 75 6c 61 74  s that manipulat
15760 65 20 62 69 6e 61 72 79 20 63 65 6c 6c 73 2e 20  e binary cells. 
15770 57 68 69 63 68 0a 20 20 20 20 2a 2a 20 63 61 6e  Which.    ** can
15780 20 6d 65 61 6e 20 74 68 61 74 20 66 69 6c 6c 49   mean that fillI
15790 6e 43 65 6c 6c 28 29 20 6f 6e 6c 79 20 69 6e 69  nCell() only ini
157a0 74 69 61 6c 69 7a 65 73 20 74 68 65 20 66 69 72  tializes the fir
157b0 73 74 20 32 20 6f 72 20 33 0a 20 20 20 20 2a 2a  st 2 or 3.    **
157c0 20 62 79 74 65 73 20 6f 66 20 70 54 6d 70 53 70   bytes of pTmpSp
157d0 61 63 65 2c 20 62 75 74 20 74 68 61 74 20 74 68  ace, but that th
157e0 65 20 66 69 72 73 74 20 34 20 62 79 74 65 73 20  e first 4 bytes 
157f0 61 72 65 20 63 6f 70 69 65 64 20 66 72 6f 6d 0a  are copied from.
15800 20 20 20 20 2a 2a 20 69 74 20 69 6e 74 6f 20 61      ** it into a
15810 20 64 61 74 61 62 61 73 65 20 70 61 67 65 2e 20   database page. 
15820 54 68 69 73 20 69 73 20 6e 6f 74 20 61 63 74 75  This is not actu
15830 61 6c 6c 79 20 61 20 70 72 6f 62 6c 65 6d 2c 20  ally a problem, 
15840 62 75 74 20 69 74 0a 20 20 20 20 2a 2a 20 64 6f  but it.    ** do
15850 65 73 20 63 61 75 73 65 20 61 20 76 61 6c 67 72  es cause a valgr
15860 69 6e 64 20 65 72 72 6f 72 20 77 68 65 6e 20 74  ind error when t
15870 68 65 20 31 20 6f 72 20 32 20 62 79 74 65 73 20  he 1 or 2 bytes 
15880 6f 66 20 75 6e 69 74 69 61 6c 69 7a 65 64 20 0a  of unitialized .
15890 20 20 20 20 2a 2a 20 64 61 74 61 20 69 73 20 70      ** data is p
158a0 61 73 73 65 64 20 74 6f 20 73 79 73 74 65 6d 20  assed to system 
158b0 63 61 6c 6c 20 77 72 69 74 65 28 29 2e 20 53 6f  call write(). So
158c0 20 74 6f 20 61 76 6f 69 64 20 74 68 69 73 20 65   to avoid this e
158d0 72 72 6f 72 2c 0a 20 20 20 20 2a 2a 20 7a 65 72  rror,.    ** zer
158e0 6f 20 74 68 65 20 66 69 72 73 74 20 34 20 62 79  o the first 4 by
158f0 74 65 73 20 6f 66 20 74 65 6d 70 20 73 70 61 63  tes of temp spac
15900 65 20 68 65 72 65 2e 0a 20 20 20 20 2a 2a 0a 20  e here..    **. 
15910 20 20 20 2a 2a 20 41 6c 73 6f 3a 20 20 50 72 6f     ** Also:  Pro
15920 76 69 64 65 20 66 6f 75 72 20 62 79 74 65 73 20  vide four bytes 
15930 6f 66 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 73  of initialized s
15940 70 61 63 65 20 62 65 66 6f 72 65 20 74 68 65 0a  pace before the.
15950 20 20 20 20 2a 2a 20 62 65 67 69 6e 6e 69 6e 67      ** beginning
15960 20 6f 66 20 70 54 6d 70 53 70 61 63 65 20 61 73   of pTmpSpace as
15970 20 61 6e 20 61 72 65 61 20 61 76 61 69 6c 61 62   an area availab
15980 6c 65 20 74 6f 20 70 72 65 70 65 6e 64 20 74 68  le to prepend th
15990 65 0a 20 20 20 20 2a 2a 20 6c 65 66 74 2d 63 68  e.    ** left-ch
159a0 69 6c 64 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  ild pointer to t
159b0 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  he beginning of 
159c0 61 20 63 65 6c 6c 2e 0a 20 20 20 20 2a 2f 0a 20  a cell..    */. 
159d0 20 20 20 69 66 28 20 70 42 74 2d 3e 70 54 6d 70     if( pBt->pTmp
159e0 53 70 61 63 65 20 29 7b 0a 20 20 20 20 20 20 6d  Space ){.      m
159f0 65 6d 73 65 74 28 70 42 74 2d 3e 70 54 6d 70 53  emset(pBt->pTmpS
15a00 70 61 63 65 2c 20 30 2c 20 38 29 3b 0a 20 20 20  pace, 0, 8);.   
15a10 20 20 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63     pBt->pTmpSpac
15a20 65 20 2b 3d 20 34 3b 0a 20 20 20 20 7d 0a 20 20  e += 4;.    }.  
15a30 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20  }.}../*.** Free 
15a40 74 68 65 20 70 42 74 2d 3e 70 54 6d 70 53 70 61  the pBt->pTmpSpa
15a50 63 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2f  ce allocation.*/
15a60 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 72 65  .static void fre
15a70 65 54 65 6d 70 53 70 61 63 65 28 42 74 53 68 61  eTempSpace(BtSha
15a80 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 66 28  red *pBt){.  if(
15a90 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20   pBt->pTmpSpace 
15aa0 29 7b 0a 20 20 20 20 70 42 74 2d 3e 70 54 6d 70  ){.    pBt->pTmp
15ab0 53 70 61 63 65 20 2d 3d 20 34 3b 0a 20 20 20 20  Space -= 4;.    
15ac0 73 71 6c 69 74 65 33 50 61 67 65 46 72 65 65 28  sqlite3PageFree(
15ad0 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b  pBt->pTmpSpace);
15ae0 0a 20 20 20 20 70 42 74 2d 3e 70 54 6d 70 53 70  .    pBt->pTmpSp
15af0 61 63 65 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a  ace = 0;.  }.}..
15b00 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e 20 6f  /*.** Close an o
15b10 70 65 6e 20 64 61 74 61 62 61 73 65 20 61 6e 64  pen database and
15b20 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c 20   invalidate all 
15b30 63 75 72 73 6f 72 73 2e 0a 2a 2f 0a 69 6e 74 20  cursors..*/.int 
15b40 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73  sqlite3BtreeClos
15b50 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42  e(Btree *p){.  B
15b60 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
15b70 2d 3e 70 42 74 3b 0a 20 20 42 74 43 75 72 73 6f  ->pBt;.  BtCurso
15b80 72 20 2a 70 43 75 72 3b 0a 0a 20 20 2f 2a 20 43  r *pCur;..  /* C
15b90 6c 6f 73 65 20 61 6c 6c 20 63 75 72 73 6f 72 73  lose all cursors
15ba0 20 6f 70 65 6e 65 64 20 76 69 61 20 74 68 69 73   opened via this
15bb0 20 68 61 6e 64 6c 65 2e 20 20 2a 2f 0a 20 20 61   handle.  */.  a
15bc0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
15bd0 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d  utex_held(p->db-
15be0 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c  >mutex) );.  sql
15bf0 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
15c00 29 3b 0a 20 20 70 43 75 72 20 3d 20 70 42 74 2d  );.  pCur = pBt-
15c10 3e 70 43 75 72 73 6f 72 3b 0a 20 20 77 68 69 6c  >pCursor;.  whil
15c20 65 28 20 70 43 75 72 20 29 7b 0a 20 20 20 20 42  e( pCur ){.    B
15c30 74 43 75 72 73 6f 72 20 2a 70 54 6d 70 20 3d 20  tCursor *pTmp = 
15c40 70 43 75 72 3b 0a 20 20 20 20 70 43 75 72 20 3d  pCur;.    pCur =
15c50 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20   pCur->pNext;.  
15c60 20 20 69 66 28 20 70 54 6d 70 2d 3e 70 42 74 72    if( pTmp->pBtr
15c70 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20 73  ee==p ){.      s
15c80 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65  qlite3BtreeClose
15c90 43 75 72 73 6f 72 28 70 54 6d 70 29 3b 0a 20 20  Cursor(pTmp);.  
15ca0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 6f    }.  }..  /* Ro
15cb0 6c 6c 62 61 63 6b 20 61 6e 79 20 61 63 74 69 76  llback any activ
15cc0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e  e transaction an
15cd0 64 20 66 72 65 65 20 74 68 65 20 68 61 6e 64 6c  d free the handl
15ce0 65 20 73 74 72 75 63 74 75 72 65 2e 0a 20 20 2a  e structure..  *
15cf0 2a 20 54 68 65 20 63 61 6c 6c 20 74 6f 20 73 71  * The call to sq
15d00 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61  lite3BtreeRollba
15d10 63 6b 28 29 20 64 72 6f 70 73 20 61 6e 79 20 74  ck() drops any t
15d20 61 62 6c 65 2d 6c 6f 63 6b 73 20 68 65 6c 64 20  able-locks held 
15d30 62 79 0a 20 20 2a 2a 20 74 68 69 73 20 68 61 6e  by.  ** this han
15d40 64 6c 65 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  dle..  */.  sqli
15d50 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b  te3BtreeRollback
15d60 28 70 2c 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 30  (p, SQLITE_OK, 0
15d70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
15d80 65 4c 65 61 76 65 28 70 29 3b 0a 0a 20 20 2f 2a  eLeave(p);..  /*
15d90 20 49 66 20 74 68 65 72 65 20 61 72 65 20 73 74   If there are st
15da0 69 6c 6c 20 6f 74 68 65 72 20 6f 75 74 73 74 61  ill other outsta
15db0 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73  nding references
15dc0 20 74 6f 20 74 68 65 20 73 68 61 72 65 64 2d 62   to the shared-b
15dd0 74 72 65 65 0a 20 20 2a 2a 20 73 74 72 75 63 74  tree.  ** struct
15de0 75 72 65 2c 20 72 65 74 75 72 6e 20 6e 6f 77 2e  ure, return now.
15df0 20 54 68 65 20 72 65 6d 61 69 6e 64 65 72 20 6f   The remainder o
15e00 66 20 74 68 69 73 20 70 72 6f 63 65 64 75 72 65  f this procedure
15e10 20 63 6c 65 61 6e 73 20 0a 20 20 2a 2a 20 75 70   cleans .  ** up
15e20 20 74 68 65 20 73 68 61 72 65 64 2d 62 74 72 65   the shared-btre
15e30 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  e..  */.  assert
15e40 28 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f 63 6b 3d  ( p->wantToLock=
15e50 3d 30 20 26 26 20 70 2d 3e 6c 6f 63 6b 65 64 3d  =0 && p->locked=
15e60 3d 30 20 29 3b 0a 20 20 69 66 28 20 21 70 2d 3e  =0 );.  if( !p->
15e70 73 68 61 72 61 62 6c 65 20 7c 7c 20 72 65 6d 6f  sharable || remo
15e80 76 65 46 72 6f 6d 53 68 61 72 69 6e 67 4c 69 73  veFromSharingLis
15e90 74 28 70 42 74 29 20 29 7b 0a 20 20 20 20 2f 2a  t(pBt) ){.    /*
15ea0 20 54 68 65 20 70 42 74 20 69 73 20 6e 6f 20 6c   The pBt is no l
15eb0 6f 6e 67 65 72 20 6f 6e 20 74 68 65 20 73 68 61  onger on the sha
15ec0 72 69 6e 67 20 6c 69 73 74 2c 20 73 6f 20 77 65  ring list, so we
15ed0 20 63 61 6e 20 61 63 63 65 73 73 0a 20 20 20 20   can access.    
15ee0 2a 2a 20 69 74 20 77 69 74 68 6f 75 74 20 68 61  ** it without ha
15ef0 76 69 6e 67 20 74 6f 20 68 6f 6c 64 20 74 68 65  ving to hold the
15f00 20 6d 75 74 65 78 2e 0a 20 20 20 20 2a 2a 0a 20   mutex..    **. 
15f10 20 20 20 2a 2a 20 43 6c 65 61 6e 20 6f 75 74 20     ** Clean out 
15f20 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65 20 42  and delete the B
15f30 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74 2e 0a  tShared object..
15f40 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
15f50 74 28 20 21 70 42 74 2d 3e 70 43 75 72 73 6f 72  t( !pBt->pCursor
15f60 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50   );.    sqlite3P
15f70 61 67 65 72 43 6c 6f 73 65 28 70 42 74 2d 3e 70  agerClose(pBt->p
15f80 50 61 67 65 72 2c 20 70 2d 3e 64 62 29 3b 0a 20  Pager, p->db);. 
15f90 20 20 20 69 66 28 20 70 42 74 2d 3e 78 46 72 65     if( pBt->xFre
15fa0 65 53 63 68 65 6d 61 20 26 26 20 70 42 74 2d 3e  eSchema && pBt->
15fb0 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20  pSchema ){.     
15fc0 20 70 42 74 2d 3e 78 46 72 65 65 53 63 68 65 6d   pBt->xFreeSchem
15fd0 61 28 70 42 74 2d 3e 70 53 63 68 65 6d 61 29 3b  a(pBt->pSchema);
15fe0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
15ff0 65 33 44 62 46 72 65 65 28 30 2c 20 70 42 74 2d  e3DbFree(0, pBt-
16000 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 66  >pSchema);.    f
16010 72 65 65 54 65 6d 70 53 70 61 63 65 28 70 42 74  reeTempSpace(pBt
16020 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
16030 72 65 65 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 23  ree(pBt);.  }..#
16040 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
16050 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a  IT_SHARED_CACHE.
16060 20 20 61 73 73 65 72 74 28 20 70 2d 3e 77 61 6e    assert( p->wan
16070 74 54 6f 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20  tToLock==0 );.  
16080 61 73 73 65 72 74 28 20 70 2d 3e 6c 6f 63 6b 65  assert( p->locke
16090 64 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d  d==0 );.  if( p-
160a0 3e 70 50 72 65 76 20 29 20 70 2d 3e 70 50 72 65  >pPrev ) p->pPre
160b0 76 2d 3e 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e  v->pNext = p->pN
160c0 65 78 74 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4e  ext;.  if( p->pN
160d0 65 78 74 20 29 20 70 2d 3e 70 4e 65 78 74 2d 3e  ext ) p->pNext->
160e0 70 50 72 65 76 20 3d 20 70 2d 3e 70 50 72 65 76  pPrev = p->pPrev
160f0 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69  ;.#endif..  sqli
16100 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 72  te3_free(p);.  r
16110 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
16120 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
16130 20 74 68 65 20 22 73 6f 66 74 22 20 6c 69 6d 69   the "soft" limi
16140 74 20 6f 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  t on the number 
16150 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
16160 63 61 63 68 65 2e 0a 2a 2a 20 55 6e 75 73 65 64  cache..** Unused
16170 20 61 6e 64 20 75 6e 6d 6f 64 69 66 69 65 64 20   and unmodified 
16180 70 61 67 65 73 20 77 69 6c 6c 20 62 65 20 72 65  pages will be re
16190 63 79 63 6c 65 64 20 77 68 65 6e 20 74 68 65 20  cycled when the 
161a0 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 70 61 67  number of.** pag
161b0 65 73 20 69 6e 20 74 68 65 20 63 61 63 68 65 20  es in the cache 
161c0 65 78 63 65 65 64 73 20 74 68 69 73 20 73 6f 66  exceeds this sof
161d0 74 20 6c 69 6d 69 74 2e 20 20 42 75 74 20 74 68  t limit.  But th
161e0 65 20 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a  e size of the.**
161f0 20 63 61 63 68 65 20 69 73 20 61 6c 6c 6f 77 65   cache is allowe
16200 64 20 74 6f 20 67 72 6f 77 20 6c 61 72 67 65 72  d to grow larger
16210 20 74 68 61 6e 20 74 68 69 73 20 6c 69 6d 69 74   than this limit
16220 20 69 66 20 69 74 20 63 6f 6e 74 61 69 6e 73 0a   if it contains.
16230 2a 2a 20 64 69 72 74 79 20 70 61 67 65 73 20 6f  ** dirty pages o
16240 72 20 70 61 67 65 73 20 73 74 69 6c 6c 20 69 6e  r pages still in
16250 20 61 63 74 69 76 65 20 75 73 65 2e 0a 2a 2f 0a   active use..*/.
16260 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
16270 53 65 74 43 61 63 68 65 53 69 7a 65 28 42 74 72  SetCacheSize(Btr
16280 65 65 20 2a 70 2c 20 69 6e 74 20 6d 78 50 61 67  ee *p, int mxPag
16290 65 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  e){.  BtShared *
162a0 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
162b0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
162c0 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62  mutex_held(p->db
162d0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71  ->mutex) );.  sq
162e0 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
162f0 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67  p);.  sqlite3Pag
16300 65 72 53 65 74 43 61 63 68 65 73 69 7a 65 28 70  erSetCachesize(p
16310 42 74 2d 3e 70 50 61 67 65 72 2c 20 6d 78 50 61  Bt->pPager, mxPa
16320 67 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ge);.  sqlite3Bt
16330 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
16340 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
16350 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
16360 20 74 68 65 20 22 73 70 69 6c 6c 22 20 6c 69 6d   the "spill" lim
16370 69 74 20 6f 6e 20 74 68 65 20 6e 75 6d 62 65 72  it on the number
16380 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
16390 20 63 61 63 68 65 2e 0a 2a 2a 20 49 66 20 74 68   cache..** If th
163a0 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
163b0 73 20 65 78 63 65 65 64 73 20 74 68 69 73 20 6c  s exceeds this l
163c0 69 6d 69 74 20 64 75 72 69 6e 67 20 61 20 77 72  imit during a wr
163d0 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  ite transaction,
163e0 0a 2a 2a 20 74 68 65 20 70 61 67 65 72 20 6d 69  .** the pager mi
163f0 67 68 74 20 61 74 74 65 6d 70 74 20 74 6f 20 22  ght attempt to "
16400 73 70 69 6c 6c 22 20 70 61 67 65 73 20 74 6f 20  spill" pages to 
16410 74 68 65 20 6a 6f 75 72 6e 61 6c 20 65 61 72 6c  the journal earl
16420 79 20 69 6e 0a 2a 2a 20 6f 72 64 65 72 20 74 6f  y in.** order to
16430 20 66 72 65 65 20 75 70 20 6d 65 6d 6f 72 79 2e   free up memory.
16440 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65  .**.** The value
16450 20 72 65 74 75 72 6e 65 64 20 69 73 20 74 68 65   returned is the
16460 20 63 75 72 72 65 6e 74 20 73 70 69 6c 6c 20 73   current spill s
16470 69 7a 65 2e 20 20 49 66 20 7a 65 72 6f 20 69 73  ize.  If zero is
16480 20 70 61 73 73 65 64 0a 2a 2a 20 61 73 20 61 6e   passed.** as an
16490 20 61 72 67 75 6d 65 6e 74 2c 20 6e 6f 20 63 68   argument, no ch
164a0 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20 74  anges are made t
164b0 6f 20 74 68 65 20 73 70 69 6c 6c 20 73 69 7a 65  o the spill size
164c0 20 73 65 74 74 69 6e 67 2c 20 73 6f 0a 2a 2a 20   setting, so.** 
164d0 75 73 69 6e 67 20 6d 78 50 61 67 65 20 6f 66 20  using mxPage of 
164e0 30 20 69 73 20 61 20 77 61 79 20 74 6f 20 71 75  0 is a way to qu
164f0 65 72 79 20 74 68 65 20 63 75 72 72 65 6e 74 20  ery the current 
16500 73 70 69 6c 6c 20 73 69 7a 65 2e 0a 2a 2f 0a 69  spill size..*/.i
16510 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53  nt sqlite3BtreeS
16520 65 74 53 70 69 6c 6c 53 69 7a 65 28 42 74 72 65  etSpillSize(Btre
16530 65 20 2a 70 2c 20 69 6e 74 20 6d 78 50 61 67 65  e *p, int mxPage
16540 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
16550 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69  Bt = p->pBt;.  i
16560 6e 74 20 72 65 73 3b 0a 20 20 61 73 73 65 72 74  nt res;.  assert
16570 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
16580 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65  held(p->db->mute
16590 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  x) );.  sqlite3B
165a0 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
165b0 72 65 73 20 3d 20 73 71 6c 69 74 65 33 50 61 67  res = sqlite3Pag
165c0 65 72 53 65 74 53 70 69 6c 6c 73 69 7a 65 28 70  erSetSpillsize(p
165d0 42 74 2d 3e 70 50 61 67 65 72 2c 20 6d 78 50 61  Bt->pPager, mxPa
165e0 67 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ge);.  sqlite3Bt
165f0 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
16600 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 23 69  eturn res;.}..#i
16610 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  f SQLITE_MAX_MMA
16620 50 5f 53 49 5a 45 3e 30 0a 2f 2a 0a 2a 2a 20 43  P_SIZE>0./*.** C
16630 68 61 6e 67 65 20 74 68 65 20 6c 69 6d 69 74 20  hange the limit 
16640 6f 6e 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66  on the amount of
16650 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
16660 6c 65 20 74 68 61 74 20 6d 61 79 20 62 65 0a 2a  le that may be.*
16670 2a 20 6d 65 6d 6f 72 79 20 6d 61 70 70 65 64 2e  * memory mapped.
16680 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
16690 74 72 65 65 53 65 74 4d 6d 61 70 4c 69 6d 69 74  treeSetMmapLimit
166a0 28 42 74 72 65 65 20 2a 70 2c 20 73 71 6c 69 74  (Btree *p, sqlit
166b0 65 33 5f 69 6e 74 36 34 20 73 7a 4d 6d 61 70 29  e3_int64 szMmap)
166c0 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
166d0 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73  t = p->pBt;.  as
166e0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
166f0 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e  tex_held(p->db->
16700 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69  mutex) );.  sqli
16710 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
16720 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  ;.  sqlite3Pager
16730 53 65 74 4d 6d 61 70 4c 69 6d 69 74 28 70 42 74  SetMmapLimit(pBt
16740 2d 3e 70 50 61 67 65 72 2c 20 73 7a 4d 6d 61 70  ->pPager, szMmap
16750 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
16760 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
16770 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
16780 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
16790 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e  E_MAX_MMAP_SIZE>
167a0 30 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  0 */../*.** Chan
167b0 67 65 20 74 68 65 20 77 61 79 20 64 61 74 61 20  ge the way data 
167c0 69 73 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73  is synced to dis
167d0 6b 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 69 6e  k in order to in
167e0 63 72 65 61 73 65 20 6f 72 20 64 65 63 72 65 61  crease or decrea
167f0 73 65 0a 2a 2a 20 68 6f 77 20 77 65 6c 6c 20 74  se.** how well t
16800 68 65 20 64 61 74 61 62 61 73 65 20 72 65 73 69  he database resi
16810 73 74 73 20 64 61 6d 61 67 65 20 64 75 65 20 74  sts damage due t
16820 6f 20 4f 53 20 63 72 61 73 68 65 73 20 61 6e 64  o OS crashes and
16830 20 70 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72   power.** failur
16840 65 73 2e 20 20 4c 65 76 65 6c 20 31 20 69 73 20  es.  Level 1 is 
16850 74 68 65 20 73 61 6d 65 20 61 73 20 61 73 79 6e  the same as asyn
16860 63 68 72 6f 6e 6f 75 73 20 28 6e 6f 20 73 79 6e  chronous (no syn
16870 63 73 28 29 20 6f 63 63 75 72 20 61 6e 64 0a 2a  cs() occur and.*
16880 2a 20 74 68 65 72 65 20 69 73 20 61 20 68 69 67  * there is a hig
16890 68 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66  h probability of
168a0 20 64 61 6d 61 67 65 29 20 20 4c 65 76 65 6c 20   damage)  Level 
168b0 32 20 69 73 20 74 68 65 20 64 65 66 61 75 6c 74  2 is the default
168c0 2e 20 20 54 68 65 72 65 0a 2a 2a 20 69 73 20 61  .  There.** is a
168d0 20 76 65 72 79 20 6c 6f 77 20 62 75 74 20 6e 6f   very low but no
168e0 6e 2d 7a 65 72 6f 20 70 72 6f 62 61 62 69 6c 69  n-zero probabili
168f0 74 79 20 6f 66 20 64 61 6d 61 67 65 2e 20 20 4c  ty of damage.  L
16900 65 76 65 6c 20 33 20 72 65 64 75 63 65 73 20 74  evel 3 reduces t
16910 68 65 0a 2a 2a 20 70 72 6f 62 61 62 69 6c 69 74  he.** probabilit
16920 79 20 6f 66 20 64 61 6d 61 67 65 20 74 6f 20 6e  y of damage to n
16930 65 61 72 20 7a 65 72 6f 20 62 75 74 20 77 69 74  ear zero but wit
16940 68 20 61 20 77 72 69 74 65 20 70 65 72 66 6f 72  h a write perfor
16950 6d 61 6e 63 65 20 72 65 64 75 63 74 69 6f 6e 2e  mance reduction.
16960 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
16970 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52  TE_OMIT_PAGER_PR
16980 41 47 4d 41 53 0a 69 6e 74 20 73 71 6c 69 74 65  AGMAS.int sqlite
16990 33 42 74 72 65 65 53 65 74 50 61 67 65 72 46 6c  3BtreeSetPagerFl
169a0 61 67 73 28 0a 20 20 42 74 72 65 65 20 2a 70 2c  ags(.  Btree *p,
169b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
169c0 20 54 68 65 20 62 74 72 65 65 20 74 6f 20 73 65   The btree to se
169d0 74 20 74 68 65 20 73 61 66 65 74 79 20 6c 65 76  t the safety lev
169e0 65 6c 20 6f 6e 20 2a 2f 0a 20 20 75 6e 73 69 67  el on */.  unsig
169f0 6e 65 64 20 70 67 46 6c 61 67 73 20 20 20 20 20  ned pgFlags     
16a00 20 20 2f 2a 20 56 61 72 69 6f 75 73 20 50 41 47    /* Various PAG
16a10 45 52 5f 2a 20 66 6c 61 67 73 20 2a 2f 0a 29 7b  ER_* flags */.){
16a20 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
16a30 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73   = p->pBt;.  ass
16a40 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
16a50 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d  ex_held(p->db->m
16a60 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74  utex) );.  sqlit
16a70 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
16a80 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  .  sqlite3PagerS
16a90 65 74 46 6c 61 67 73 28 70 42 74 2d 3e 70 50 61  etFlags(pBt->pPa
16aa0 67 65 72 2c 20 70 67 46 6c 61 67 73 29 3b 0a 20  ger, pgFlags);. 
16ab0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
16ac0 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
16ad0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e  SQLITE_OK;.}.#en
16ae0 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  dif../*.** Chang
16af0 65 20 74 68 65 20 64 65 66 61 75 6c 74 20 70 61  e the default pa
16b00 67 65 73 20 73 69 7a 65 20 61 6e 64 20 74 68 65  ges size and the
16b10 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 65 72   number of reser
16b20 76 65 64 20 62 79 74 65 73 20 70 65 72 20 70 61  ved bytes per pa
16b30 67 65 2e 0a 2a 2a 20 4f 72 2c 20 69 66 20 74 68  ge..** Or, if th
16b40 65 20 70 61 67 65 20 73 69 7a 65 20 68 61 73 20  e page size has 
16b50 61 6c 72 65 61 64 79 20 62 65 65 6e 20 66 69 78  already been fix
16b60 65 64 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ed, return SQLIT
16b70 45 5f 52 45 41 44 4f 4e 4c 59 20 0a 2a 2a 20 77  E_READONLY .** w
16b80 69 74 68 6f 75 74 20 63 68 61 6e 67 69 6e 67 20  ithout changing 
16b90 61 6e 79 74 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  anything..**.** 
16ba0 54 68 65 20 70 61 67 65 20 73 69 7a 65 20 6d 75  The page size mu
16bb0 73 74 20 62 65 20 61 20 70 6f 77 65 72 20 6f 66  st be a power of
16bc0 20 32 20 62 65 74 77 65 65 6e 20 35 31 32 20 61   2 between 512 a
16bd0 6e 64 20 36 35 35 33 36 2e 20 20 49 66 20 74 68  nd 65536.  If th
16be0 65 20 70 61 67 65 0a 2a 2a 20 73 69 7a 65 20 73  e page.** size s
16bf0 75 70 70 6c 69 65 64 20 64 6f 65 73 20 6e 6f 74  upplied does not
16c00 20 6d 65 65 74 20 74 68 69 73 20 63 6f 6e 73 74   meet this const
16c10 72 61 69 6e 74 20 74 68 65 6e 20 74 68 65 20 70  raint then the p
16c20 61 67 65 20 73 69 7a 65 20 69 73 20 6e 6f 74 0a  age size is not.
16c30 2a 2a 20 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a  ** changed..**.*
16c40 2a 20 50 61 67 65 20 73 69 7a 65 73 20 61 72 65  * Page sizes are
16c50 20 63 6f 6e 73 74 72 61 69 6e 65 64 20 74 6f 20   constrained to 
16c60 62 65 20 61 20 70 6f 77 65 72 20 6f 66 20 74 77  be a power of tw
16c70 6f 20 73 6f 20 74 68 61 74 20 74 68 65 20 72 65  o so that the re
16c80 67 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 64  gion.** of the d
16c90 61 74 61 62 61 73 65 20 66 69 6c 65 20 75 73 65  atabase file use
16ca0 64 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 20 28 62  d for locking (b
16cb0 65 67 69 6e 6e 69 6e 67 20 61 74 20 50 45 4e 44  eginning at PEND
16cc0 49 4e 47 5f 42 59 54 45 2c 0a 2a 2a 20 74 68 65  ING_BYTE,.** the
16cd0 20 66 69 72 73 74 20 62 79 74 65 20 70 61 73 74   first byte past
16ce0 20 74 68 65 20 31 47 42 20 62 6f 75 6e 64 61 72   the 1GB boundar
16cf0 79 2c 20 30 78 34 30 30 30 30 30 30 30 29 20 6e  y, 0x40000000) n
16d00 65 65 64 73 20 74 6f 20 6f 63 63 75 72 0a 2a 2a  eeds to occur.**
16d10 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e   at the beginnin
16d20 67 20 6f 66 20 61 20 70 61 67 65 2e 0a 2a 2a 0a  g of a page..**.
16d30 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72 20  ** If parameter 
16d40 6e 52 65 73 65 72 76 65 20 69 73 20 6c 65 73 73  nReserve is less
16d50 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e   than zero, then
16d60 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
16d70 65 73 65 72 76 65 64 0a 2a 2a 20 62 79 74 65 73  eserved.** bytes
16d80 20 70 65 72 20 70 61 67 65 20 69 73 20 6c 65 66   per page is lef
16d90 74 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a  t unchanged..**.
16da0 2a 2a 20 49 66 20 74 68 65 20 69 46 69 78 21 3d  ** If the iFix!=
16db0 30 20 74 68 65 6e 20 74 68 65 20 42 54 53 5f 50  0 then the BTS_P
16dc0 41 47 45 53 49 5a 45 5f 46 49 58 45 44 20 66 6c  AGESIZE_FIXED fl
16dd0 61 67 20 69 73 20 73 65 74 20 73 6f 20 74 68 61  ag is set so tha
16de0 74 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 0a  t the page size.
16df0 2a 2a 20 61 6e 64 20 61 75 74 6f 76 61 63 75 75  ** and autovacuu
16e00 6d 20 6d 6f 64 65 20 63 61 6e 20 6e 6f 20 6c 6f  m mode can no lo
16e10 6e 67 65 72 20 62 65 20 63 68 61 6e 67 65 64 2e  nger be changed.
16e20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
16e30 74 72 65 65 53 65 74 50 61 67 65 53 69 7a 65 28  treeSetPageSize(
16e40 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 70 61  Btree *p, int pa
16e50 67 65 53 69 7a 65 2c 20 69 6e 74 20 6e 52 65 73  geSize, int nRes
16e60 65 72 76 65 2c 20 69 6e 74 20 69 46 69 78 29 7b  erve, int iFix){
16e70 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
16e80 54 45 5f 4f 4b 3b 0a 20 20 42 74 53 68 61 72 65  TE_OK;.  BtShare
16e90 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
16ea0 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65 73 65  .  assert( nRese
16eb0 72 76 65 3e 3d 2d 31 20 26 26 20 6e 52 65 73 65  rve>=-1 && nRese
16ec0 72 76 65 3c 3d 32 35 35 20 29 3b 0a 20 20 73 71  rve<=255 );.  sq
16ed0 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
16ee0 70 29 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 48  p);.#if SQLITE_H
16ef0 41 53 5f 43 4f 44 45 43 0a 20 20 69 66 28 20 6e  AS_CODEC.  if( n
16f00 52 65 73 65 72 76 65 3e 70 42 74 2d 3e 6f 70 74  Reserve>pBt->opt
16f10 69 6d 61 6c 52 65 73 65 72 76 65 20 29 20 70 42  imalReserve ) pB
16f20 74 2d 3e 6f 70 74 69 6d 61 6c 52 65 73 65 72 76  t->optimalReserv
16f30 65 20 3d 20 28 75 38 29 6e 52 65 73 65 72 76 65  e = (u8)nReserve
16f40 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70  ;.#endif.  if( p
16f50 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42  Bt->btsFlags & B
16f60 54 53 5f 50 41 47 45 53 49 5a 45 5f 46 49 58 45  TS_PAGESIZE_FIXE
16f70 44 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  D ){.    sqlite3
16f80 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
16f90 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
16fa0 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d 0a 20  _READONLY;.  }. 
16fb0 20 69 66 28 20 6e 52 65 73 65 72 76 65 3c 30 20   if( nReserve<0 
16fc0 29 7b 0a 20 20 20 20 6e 52 65 73 65 72 76 65 20  ){.    nReserve 
16fd0 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  = pBt->pageSize 
16fe0 2d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  - pBt->usableSiz
16ff0 65 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  e;.  }.  assert(
17000 20 6e 52 65 73 65 72 76 65 3e 3d 30 20 26 26 20   nReserve>=0 && 
17010 6e 52 65 73 65 72 76 65 3c 3d 32 35 35 20 29 3b  nReserve<=255 );
17020 0a 20 20 69 66 28 20 70 61 67 65 53 69 7a 65 3e  .  if( pageSize>
17030 3d 35 31 32 20 26 26 20 70 61 67 65 53 69 7a 65  =512 && pageSize
17040 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47  <=SQLITE_MAX_PAG
17050 45 5f 53 49 5a 45 20 26 26 0a 20 20 20 20 20 20  E_SIZE &&.      
17060 20 20 28 28 70 61 67 65 53 69 7a 65 2d 31 29 26    ((pageSize-1)&
17070 70 61 67 65 53 69 7a 65 29 3d 3d 30 20 29 7b 0a  pageSize)==0 ){.
17080 20 20 20 20 61 73 73 65 72 74 28 20 28 70 61 67      assert( (pag
17090 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b  eSize & 7)==0 );
170a0 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70 42  .    assert( !pB
170b0 74 2d 3e 70 43 75 72 73 6f 72 20 29 3b 0a 20 20  t->pCursor );.  
170c0 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20    pBt->pageSize 
170d0 3d 20 28 75 33 32 29 70 61 67 65 53 69 7a 65 3b  = (u32)pageSize;
170e0 0a 20 20 20 20 66 72 65 65 54 65 6d 70 53 70 61  .    freeTempSpa
170f0 63 65 28 70 42 74 29 3b 0a 20 20 7d 0a 20 20 72  ce(pBt);.  }.  r
17100 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
17110 53 65 74 50 61 67 65 73 69 7a 65 28 70 42 74 2d  SetPagesize(pBt-
17120 3e 70 50 61 67 65 72 2c 20 26 70 42 74 2d 3e 70  >pPager, &pBt->p
17130 61 67 65 53 69 7a 65 2c 20 6e 52 65 73 65 72 76  ageSize, nReserv
17140 65 29 3b 0a 20 20 70 42 74 2d 3e 75 73 61 62 6c  e);.  pBt->usabl
17150 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 70 61 67  eSize = pBt->pag
17160 65 53 69 7a 65 20 2d 20 28 75 31 36 29 6e 52 65  eSize - (u16)nRe
17170 73 65 72 76 65 3b 0a 20 20 69 66 28 20 69 46 69  serve;.  if( iFi
17180 78 20 29 20 70 42 74 2d 3e 62 74 73 46 6c 61 67  x ) pBt->btsFlag
17190 73 20 7c 3d 20 42 54 53 5f 50 41 47 45 53 49 5a  s |= BTS_PAGESIZ
171a0 45 5f 46 49 58 45 44 3b 0a 20 20 73 71 6c 69 74  E_FIXED;.  sqlit
171b0 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
171c0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
171d0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
171e0 65 20 63 75 72 72 65 6e 74 6c 79 20 64 65 66 69  e currently defi
171f0 6e 65 64 20 70 61 67 65 20 73 69 7a 65 0a 2a 2f  ned page size.*/
17200 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
17210 65 47 65 74 50 61 67 65 53 69 7a 65 28 42 74 72  eGetPageSize(Btr
17220 65 65 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e  ee *p){.  return
17230 20 70 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a   p->pBt->pageSiz
17240 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  e;.}../*.** This
17250 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 73 69 6d   function is sim
17260 69 6c 61 72 20 74 6f 20 73 71 6c 69 74 65 33 42  ilar to sqlite3B
17270 74 72 65 65 47 65 74 52 65 73 65 72 76 65 28 29  treeGetReserve()
17280 2c 20 65 78 63 65 70 74 20 74 68 61 74 20 69 74  , except that it
17290 0a 2a 2a 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20  .** may only be 
172a0 63 61 6c 6c 65 64 20 69 66 20 69 74 20 69 73 20  called if it is 
172b0 67 75 61 72 61 6e 74 65 65 64 20 74 68 61 74 20  guaranteed that 
172c0 74 68 65 20 62 2d 74 72 65 65 20 6d 75 74 65 78  the b-tree mutex
172d0 20 69 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20 68   is already.** h
172e0 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  eld..**.** This 
172f0 69 73 20 75 73 65 66 75 6c 20 69 6e 20 6f 6e 65  is useful in one
17300 20 73 70 65 63 69 61 6c 20 63 61 73 65 20 69 6e   special case in
17310 20 74 68 65 20 62 61 63 6b 75 70 20 41 50 49 20   the backup API 
17320 63 6f 64 65 20 77 68 65 72 65 20 69 74 20 69 73  code where it is
17330 0a 2a 2a 20 6b 6e 6f 77 6e 20 74 68 61 74 20 74  .** known that t
17340 68 65 20 73 68 61 72 65 64 20 62 2d 74 72 65 65  he shared b-tree
17350 20 6d 75 74 65 78 20 69 73 20 68 65 6c 64 2c 20   mutex is held, 
17360 62 75 74 20 74 68 65 20 6d 75 74 65 78 20 6f 6e  but the mutex on
17370 20 74 68 65 20 0a 2a 2a 20 64 61 74 61 62 61 73   the .** databas
17380 65 20 68 61 6e 64 6c 65 20 74 68 61 74 20 6f 77  e handle that ow
17390 6e 73 20 2a 70 20 69 73 20 6e 6f 74 2e 20 49 6e  ns *p is not. In
173a0 20 74 68 69 73 20 63 61 73 65 20 69 66 20 73 71   this case if sq
173b0 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
173c0 29 0a 2a 2a 20 77 65 72 65 20 74 6f 20 62 65 20  ).** were to be 
173d0 63 61 6c 6c 65 64 2c 20 69 74 20 6d 69 67 68 74  called, it might
173e0 20 63 6f 6c 6c 69 64 65 20 77 69 74 68 20 73 6f   collide with so
173f0 6d 65 20 6f 74 68 65 72 20 6f 70 65 72 61 74 69  me other operati
17400 6f 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 64 61 74  on on the.** dat
17410 61 62 61 73 65 20 68 61 6e 64 6c 65 20 74 68 61  abase handle tha
17420 74 20 6f 77 6e 73 20 2a 70 2c 20 63 61 75 73 69  t owns *p, causi
17430 6e 67 20 75 6e 64 65 66 69 6e 65 64 20 62 65 68  ng undefined beh
17440 61 76 69 6f 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71  avior..*/.int sq
17450 6c 69 74 65 33 42 74 72 65 65 47 65 74 52 65 73  lite3BtreeGetRes
17460 65 72 76 65 4e 6f 4d 75 74 65 78 28 42 74 72 65  erveNoMutex(Btre
17470 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a  e *p){.  int n;.
17480 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
17490 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e  3_mutex_held(p->
174a0 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
174b0 20 6e 20 3d 20 70 2d 3e 70 42 74 2d 3e 70 61 67   n = p->pBt->pag
174c0 65 53 69 7a 65 20 2d 20 70 2d 3e 70 42 74 2d 3e  eSize - p->pBt->
174d0 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 72 65  usableSize;.  re
174e0 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn n;.}../*.**
174f0 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
17500 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73  er of bytes of s
17510 70 61 63 65 20 61 74 20 74 68 65 20 65 6e 64 20  pace at the end 
17520 6f 66 20 65 76 65 72 79 20 70 61 67 65 20 74 68  of every page th
17530 61 74 0a 2a 2a 20 61 72 65 20 69 6e 74 65 6e 74  at.** are intent
17540 75 61 6c 6c 79 20 6c 65 66 74 20 75 6e 75 73 65  ually left unuse
17550 64 2e 20 20 54 68 69 73 20 69 73 20 74 68 65 20  d.  This is the 
17560 22 72 65 73 65 72 76 65 64 22 20 73 70 61 63 65  "reserved" space
17570 20 74 68 61 74 20 69 73 0a 2a 2a 20 73 6f 6d 65   that is.** some
17580 74 69 6d 65 73 20 75 73 65 64 20 62 79 20 65 78  times used by ex
17590 74 65 6e 73 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20  tensions..**.** 
175a0 49 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 4d 55  If SQLITE_HAS_MU
175b0 54 45 58 20 69 73 20 64 65 66 69 6e 65 64 20 74  TEX is defined t
175c0 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 72  hen the number r
175d0 65 74 75 72 6e 65 64 20 69 73 20 74 68 65 0a 2a  eturned is the.*
175e0 2a 20 67 72 65 61 74 65 72 20 6f 66 20 74 68 65  * greater of the
175f0 20 63 75 72 72 65 6e 74 20 72 65 73 65 72 76 65   current reserve
17600 64 20 73 70 61 63 65 20 61 6e 64 20 74 68 65 20  d space and the 
17610 6d 61 78 69 6d 75 6d 20 72 65 71 75 65 73 74 65  maximum requeste
17620 64 0a 2a 2a 20 72 65 73 65 72 76 65 20 73 70 61  d.** reserve spa
17630 63 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ce..*/.int sqlit
17640 65 33 42 74 72 65 65 47 65 74 4f 70 74 69 6d 61  e3BtreeGetOptima
17650 6c 52 65 73 65 72 76 65 28 42 74 72 65 65 20 2a  lReserve(Btree *
17660 70 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73  p){.  int n;.  s
17670 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
17680 28 70 29 3b 0a 20 20 6e 20 3d 20 73 71 6c 69 74  (p);.  n = sqlit
17690 65 33 42 74 72 65 65 47 65 74 52 65 73 65 72 76  e3BtreeGetReserv
176a0 65 4e 6f 4d 75 74 65 78 28 70 29 3b 0a 23 69 66  eNoMutex(p);.#if
176b0 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43  def SQLITE_HAS_C
176c0 4f 44 45 43 0a 20 20 69 66 28 20 6e 3c 70 2d 3e  ODEC.  if( n<p->
176d0 70 42 74 2d 3e 6f 70 74 69 6d 61 6c 52 65 73 65  pBt->optimalRese
176e0 72 76 65 20 29 20 6e 20 3d 20 70 2d 3e 70 42 74  rve ) n = p->pBt
176f0 2d 3e 6f 70 74 69 6d 61 6c 52 65 73 65 72 76 65  ->optimalReserve
17700 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74  ;.#endif.  sqlit
17710 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
17720 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a  .  return n;.}..
17730 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 6d  ./*.** Set the m
17740 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e  aximum page coun
17750 74 20 66 6f 72 20 61 20 64 61 74 61 62 61 73 65  t for a database
17760 20 69 66 20 6d 78 50 61 67 65 20 69 73 20 70 6f   if mxPage is po
17770 73 69 74 69 76 65 2e 0a 2a 2a 20 4e 6f 20 63 68  sitive..** No ch
17780 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20 69  anges are made i
17790 66 20 6d 78 50 61 67 65 20 69 73 20 30 20 6f 72  f mxPage is 0 or
177a0 20 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 20 52 65   negative..** Re
177b0 67 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20  gardless of the 
177c0 76 61 6c 75 65 20 6f 66 20 6d 78 50 61 67 65 2c  value of mxPage,
177d0 20 72 65 74 75 72 6e 20 74 68 65 20 6d 61 78 69   return the maxi
177e0 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a  mum page count..
177f0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
17800 72 65 65 4d 61 78 50 61 67 65 43 6f 75 6e 74 28  reeMaxPageCount(
17810 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6d 78  Btree *p, int mx
17820 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a  Page){.  int n;.
17830 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
17840 74 65 72 28 70 29 3b 0a 20 20 6e 20 3d 20 73 71  ter(p);.  n = sq
17850 6c 69 74 65 33 50 61 67 65 72 4d 61 78 50 61 67  lite3PagerMaxPag
17860 65 43 6f 75 6e 74 28 70 2d 3e 70 42 74 2d 3e 70  eCount(p->pBt->p
17870 50 61 67 65 72 2c 20 6d 78 50 61 67 65 29 3b 0a  Pager, mxPage);.
17880 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
17890 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
178a0 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74   n;.}../*.** Set
178b0 20 74 68 65 20 42 54 53 5f 53 45 43 55 52 45 5f   the BTS_SECURE_
178c0 44 45 4c 45 54 45 20 66 6c 61 67 20 69 66 20 6e  DELETE flag if n
178d0 65 77 46 6c 61 67 20 69 73 20 30 20 6f 72 20 31  ewFlag is 0 or 1
178e0 2e 20 20 49 66 20 6e 65 77 46 6c 61 67 20 69 73  .  If newFlag is
178f0 20 2d 31 2c 0a 2a 2a 20 74 68 65 6e 20 6d 61 6b   -1,.** then mak
17900 65 20 6e 6f 20 63 68 61 6e 67 65 73 2e 20 20 41  e no changes.  A
17910 6c 77 61 79 73 20 72 65 74 75 72 6e 20 74 68 65  lways return the
17920 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 42 54   value of the BT
17930 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 0a  S_SECURE_DELETE.
17940 2a 2a 20 73 65 74 74 69 6e 67 20 61 66 74 65 72  ** setting after
17950 20 74 68 65 20 63 68 61 6e 67 65 2e 0a 2a 2f 0a   the change..*/.
17960 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
17970 53 65 63 75 72 65 44 65 6c 65 74 65 28 42 74 72  SecureDelete(Btr
17980 65 65 20 2a 70 2c 20 69 6e 74 20 6e 65 77 46 6c  ee *p, int newFl
17990 61 67 29 7b 0a 20 20 69 6e 74 20 62 3b 0a 20 20  ag){.  int b;.  
179a0 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
179b0 6e 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  n 0;.  sqlite3Bt
179c0 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 69  reeEnter(p);.  i
179d0 66 28 20 6e 65 77 46 6c 61 67 3e 3d 30 20 29 7b  f( newFlag>=0 ){
179e0 0a 20 20 20 20 70 2d 3e 70 42 74 2d 3e 62 74 73  .    p->pBt->bts
179f0 46 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f 53 45  Flags &= ~BTS_SE
17a00 43 55 52 45 5f 44 45 4c 45 54 45 3b 0a 20 20 20  CURE_DELETE;.   
17a10 20 69 66 28 20 6e 65 77 46 6c 61 67 20 29 20 70   if( newFlag ) p
17a20 2d 3e 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20  ->pBt->btsFlags 
17a30 7c 3d 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45  |= BTS_SECURE_DE
17a40 4c 45 54 45 3b 0a 20 20 7d 20 0a 20 20 62 20 3d  LETE;.  } .  b =
17a50 20 28 70 2d 3e 70 42 74 2d 3e 62 74 73 46 6c 61   (p->pBt->btsFla
17a60 67 73 20 26 20 42 54 53 5f 53 45 43 55 52 45 5f  gs & BTS_SECURE_
17a70 44 45 4c 45 54 45 29 21 3d 30 3b 0a 20 20 73 71  DELETE)!=0;.  sq
17a80 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
17a90 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 62 3b 0a  p);.  return b;.
17aa0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  }../*.** Change 
17ab0 74 68 65 20 27 61 75 74 6f 2d 76 61 63 75 75 6d  the 'auto-vacuum
17ac0 27 20 70 72 6f 70 65 72 74 79 20 6f 66 20 74 68  ' property of th
17ad0 65 20 64 61 74 61 62 61 73 65 2e 20 49 66 20 74  e database. If t
17ae0 68 65 20 27 61 75 74 6f 56 61 63 75 75 6d 27 0a  he 'autoVacuum'.
17af0 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  ** parameter is 
17b00 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61  non-zero, then a
17b10 75 74 6f 2d 76 61 63 75 75 6d 20 6d 6f 64 65 20  uto-vacuum mode 
17b20 69 73 20 65 6e 61 62 6c 65 64 2e 20 49 66 20 7a  is enabled. If z
17b30 65 72 6f 2c 20 69 74 0a 2a 2a 20 69 73 20 64 69  ero, it.** is di
17b40 73 61 62 6c 65 64 2e 20 54 68 65 20 64 65 66 61  sabled. The defa
17b50 75 6c 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68  ult value for th
17b60 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 70 72  e auto-vacuum pr
17b70 6f 70 65 72 74 79 20 69 73 20 0a 2a 2a 20 64 65  operty is .** de
17b80 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20  termined by the 
17b90 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41  SQLITE_DEFAULT_A
17ba0 55 54 4f 56 41 43 55 55 4d 20 6d 61 63 72 6f 2e  UTOVACUUM macro.
17bb0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
17bc0 74 72 65 65 53 65 74 41 75 74 6f 56 61 63 75 75  treeSetAutoVacuu
17bd0 6d 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  m(Btree *p, int 
17be0 61 75 74 6f 56 61 63 75 75 6d 29 7b 0a 23 69 66  autoVacuum){.#if
17bf0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
17c00 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 72 65 74  AUTOVACUUM.  ret
17c10 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  urn SQLITE_READO
17c20 4e 4c 59 3b 0a 23 65 6c 73 65 0a 20 20 42 74 53  NLY;.#else.  BtS
17c30 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
17c40 70 42 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  pBt;.  int rc = 
17c50 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 38 20  SQLITE_OK;.  u8 
17c60 61 76 20 3d 20 28 75 38 29 61 75 74 6f 56 61 63  av = (u8)autoVac
17c70 75 75 6d 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42  uum;..  sqlite3B
17c80 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
17c90 69 66 28 20 28 70 42 74 2d 3e 62 74 73 46 6c 61  if( (pBt->btsFla
17ca0 67 73 20 26 20 42 54 53 5f 50 41 47 45 53 49 5a  gs & BTS_PAGESIZ
17cb0 45 5f 46 49 58 45 44 29 21 3d 30 20 26 26 20 28  E_FIXED)!=0 && (
17cc0 61 76 20 3f 31 3a 30 29 21 3d 70 42 74 2d 3e 61  av ?1:0)!=pBt->a
17cd0 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20  utoVacuum ){.   
17ce0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41   rc = SQLITE_REA
17cf0 44 4f 4e 4c 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a  DONLY;.  }else{.
17d00 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63      pBt->autoVac
17d10 75 75 6d 20 3d 20 61 76 20 3f 31 3a 30 3b 0a 20  uum = av ?1:0;. 
17d20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75     pBt->incrVacu
17d30 75 6d 20 3d 20 61 76 3d 3d 32 20 3f 31 3a 30 3b  um = av==2 ?1:0;
17d40 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74  .  }.  sqlite3Bt
17d50 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
17d60 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66  eturn rc;.#endif
17d70 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
17d80 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
17d90 65 20 27 61 75 74 6f 2d 76 61 63 75 75 6d 27 20  e 'auto-vacuum' 
17da0 70 72 6f 70 65 72 74 79 2e 20 49 66 20 61 75 74  property. If aut
17db0 6f 2d 76 61 63 75 75 6d 20 69 73 20 0a 2a 2a 20  o-vacuum is .** 
17dc0 65 6e 61 62 6c 65 64 20 31 20 69 73 20 72 65 74  enabled 1 is ret
17dd0 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65  urned. Otherwise
17de0 20 30 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74   0..*/.int sqlit
17df0 65 33 42 74 72 65 65 47 65 74 41 75 74 6f 56 61  e3BtreeGetAutoVa
17e00 63 75 75 6d 28 42 74 72 65 65 20 2a 70 29 7b 0a  cuum(Btree *p){.
17e10 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
17e20 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
17e30 72 65 74 75 72 6e 20 42 54 52 45 45 5f 41 55 54  return BTREE_AUT
17e40 4f 56 41 43 55 55 4d 5f 4e 4f 4e 45 3b 0a 23 65  OVACUUM_NONE;.#e
17e50 6c 73 65 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  lse.  int rc;.  
17e60 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
17e70 72 28 70 29 3b 0a 20 20 72 63 20 3d 20 28 0a 20  r(p);.  rc = (. 
17e80 20 20 20 28 21 70 2d 3e 70 42 74 2d 3e 61 75 74     (!p->pBt->aut
17e90 6f 56 61 63 75 75 6d 29 3f 42 54 52 45 45 5f 41  oVacuum)?BTREE_A
17ea0 55 54 4f 56 41 43 55 55 4d 5f 4e 4f 4e 45 3a 0a  UTOVACUUM_NONE:.
17eb0 20 20 20 20 28 21 70 2d 3e 70 42 74 2d 3e 69 6e      (!p->pBt->in
17ec0 63 72 56 61 63 75 75 6d 29 3f 42 54 52 45 45 5f  crVacuum)?BTREE_
17ed0 41 55 54 4f 56 41 43 55 55 4d 5f 46 55 4c 4c 3a  AUTOVACUUM_FULL:
17ee0 0a 20 20 20 20 42 54 52 45 45 5f 41 55 54 4f 56  .    BTREE_AUTOV
17ef0 41 43 55 55 4d 5f 49 4e 43 52 0a 20 20 29 3b 0a  ACUUM_INCR.  );.
17f00 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
17f10 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
17f20 20 72 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f   rc;.#endif.}../
17f30 2a 0a 2a 2a 20 49 66 20 74 68 65 20 75 73 65 72  *.** If the user
17f40 20 68 61 73 20 6e 6f 74 20 73 65 74 20 74 68 65   has not set the
17f50 20 73 61 66 65 74 79 2d 6c 65 76 65 6c 20 66 6f   safety-level fo
17f60 72 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20  r this database 
17f70 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 75 73  connection.** us
17f80 69 6e 67 20 22 50 52 41 47 4d 41 20 73 79 6e 63  ing "PRAGMA sync
17f90 68 72 6f 6e 6f 75 73 22 2c 20 61 6e 64 20 69 66  hronous", and if
17fa0 20 74 68 65 20 73 61 66 65 74 79 2d 6c 65 76 65   the safety-leve
17fb0 6c 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  l is not already
17fc0 0a 2a 2a 20 73 65 74 20 74 6f 20 74 68 65 20 76  .** set to the v
17fd0 61 6c 75 65 20 70 61 73 73 65 64 20 74 6f 20 74  alue passed to t
17fe0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 73 20  his function as 
17ff0 74 68 65 20 73 65 63 6f 6e 64 20 70 61 72 61 6d  the second param
18000 65 74 65 72 2c 0a 2a 2a 20 73 65 74 20 69 74 20  eter,.** set it 
18010 73 6f 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54  so..*/.#if SQLIT
18020 45 5f 44 45 46 41 55 4c 54 5f 53 59 4e 43 48 52  E_DEFAULT_SYNCHR
18030 4f 4e 4f 55 53 21 3d 53 51 4c 49 54 45 5f 44 45  ONOUS!=SQLITE_DE
18040 46 41 55 4c 54 5f 57 41 4c 5f 53 59 4e 43 48 52  FAULT_WAL_SYNCHR
18050 4f 4e 4f 55 53 0a 73 74 61 74 69 63 20 76 6f 69  ONOUS.static voi
18060 64 20 73 65 74 44 65 66 61 75 6c 74 53 79 6e 63  d setDefaultSync
18070 46 6c 61 67 28 42 74 53 68 61 72 65 64 20 2a 70  Flag(BtShared *p
18080 42 74 2c 20 75 38 20 73 61 66 65 74 79 5f 6c 65  Bt, u8 safety_le
18090 76 65 6c 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  vel){.  sqlite3 
180a0 2a 64 62 3b 0a 20 20 44 62 20 2a 70 44 62 3b 0a  *db;.  Db *pDb;.
180b0 20 20 69 66 28 20 28 64 62 3d 70 42 74 2d 3e 64    if( (db=pBt->d
180c0 62 29 21 3d 30 20 26 26 20 28 70 44 62 3d 64 62  b)!=0 && (pDb=db
180d0 2d 3e 61 44 62 29 21 3d 30 20 29 7b 0a 20 20 20  ->aDb)!=0 ){.   
180e0 20 77 68 69 6c 65 28 20 70 44 62 2d 3e 70 42 74   while( pDb->pBt
180f0 3d 3d 30 20 7c 7c 20 70 44 62 2d 3e 70 42 74 2d  ==0 || pDb->pBt-
18100 3e 70 42 74 21 3d 70 42 74 20 29 7b 20 70 44 62  >pBt!=pBt ){ pDb
18110 2b 2b 3b 20 7d 0a 20 20 20 20 69 66 28 20 70 44  ++; }.    if( pD
18120 62 2d 3e 62 53 79 6e 63 53 65 74 3d 3d 30 20 0a  b->bSyncSet==0 .
18130 20 20 20 20 20 26 26 20 70 44 62 2d 3e 73 61 66       && pDb->saf
18140 65 74 79 5f 6c 65 76 65 6c 21 3d 73 61 66 65 74  ety_level!=safet
18150 79 5f 6c 65 76 65 6c 20 0a 20 20 20 20 20 26 26  y_level .     &&
18160 20 70 44 62 21 3d 26 64 62 2d 3e 61 44 62 5b 31   pDb!=&db->aDb[1
18170 5d 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  ] .    ){.      
18180 70 44 62 2d 3e 73 61 66 65 74 79 5f 6c 65 76 65  pDb->safety_leve
18190 6c 20 3d 20 73 61 66 65 74 79 5f 6c 65 76 65 6c  l = safety_level
181a0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  ;.      sqlite3P
181b0 61 67 65 72 53 65 74 46 6c 61 67 73 28 70 42 74  agerSetFlags(pBt
181c0 2d 3e 70 50 61 67 65 72 2c 0a 20 20 20 20 20 20  ->pPager,.      
181d0 20 20 20 20 70 44 62 2d 3e 73 61 66 65 74 79 5f      pDb->safety_
181e0 6c 65 76 65 6c 20 7c 20 28 64 62 2d 3e 66 6c 61  level | (db->fla
181f0 67 73 20 26 20 50 41 47 45 52 5f 46 4c 41 47 53  gs & PAGER_FLAGS
18200 5f 4d 41 53 4b 29 29 3b 0a 20 20 20 20 7d 0a 20  _MASK));.    }. 
18210 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66   }.}.#else.# def
18220 69 6e 65 20 73 65 74 44 65 66 61 75 6c 74 53 79  ine setDefaultSy
18230 6e 63 46 6c 61 67 28 70 42 74 2c 73 61 66 65 74  ncFlag(pBt,safet
18240 79 5f 6c 65 76 65 6c 29 0a 23 65 6e 64 69 66 0a  y_level).#endif.
18250 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 72 65 66  ./*.** Get a ref
18260 65 72 65 6e 63 65 20 74 6f 20 70 50 61 67 65 31  erence to pPage1
18270 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
18280 20 66 69 6c 65 2e 20 20 54 68 69 73 20 77 69 6c   file.  This wil
18290 6c 0a 2a 2a 20 61 6c 73 6f 20 61 63 71 75 69 72  l.** also acquir
182a0 65 20 61 20 72 65 61 64 6c 6f 63 6b 20 6f 6e 20  e a readlock on 
182b0 74 68 61 74 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  that file..**.**
182c0 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
182d0 74 75 72 6e 65 64 20 6f 6e 20 73 75 63 63 65 73  turned on succes
182e0 73 2e 20 20 49 66 20 74 68 65 20 66 69 6c 65 20  s.  If the file 
182f0 69 73 20 6e 6f 74 20 61 0a 2a 2a 20 77 65 6c 6c  is not a.** well
18300 2d 66 6f 72 6d 65 64 20 64 61 74 61 62 61 73 65  -formed database
18310 20 66 69 6c 65 2c 20 74 68 65 6e 20 53 51 4c 49   file, then SQLI
18320 54 45 5f 43 4f 52 52 55 50 54 20 69 73 20 72 65  TE_CORRUPT is re
18330 74 75 72 6e 65 64 2e 0a 2a 2a 20 53 51 4c 49 54  turned..** SQLIT
18340 45 5f 42 55 53 59 20 69 73 20 72 65 74 75 72 6e  E_BUSY is return
18350 65 64 20 69 66 20 74 68 65 20 64 61 74 61 62 61  ed if the databa
18360 73 65 20 69 73 20 6c 6f 63 6b 65 64 2e 20 20 53  se is locked.  S
18370 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 69  QLITE_NOMEM.** i
18380 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 77 65  s returned if we
18390 20 72 75 6e 20 6f 75 74 20 6f 66 20 6d 65 6d 6f   run out of memo
183a0 72 79 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ry. .*/.static i
183b0 6e 74 20 6c 6f 63 6b 42 74 72 65 65 28 42 74 53  nt lockBtree(BtS
183c0 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69  hared *pBt){.  i
183d0 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
183e0 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f      /* Result co
183f0 64 65 20 66 72 6f 6d 20 73 75 62 66 75 6e 63 74  de from subfunct
18400 69 6f 6e 73 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  ions */.  MemPag
18410 65 20 2a 70 50 61 67 65 31 3b 20 20 20 20 20 2f  e *pPage1;     /
18420 2a 20 50 61 67 65 20 31 20 6f 66 20 74 68 65 20  * Page 1 of the 
18430 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
18440 0a 20 20 69 6e 74 20 6e 50 61 67 65 3b 20 20 20  .  int nPage;   
18450 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
18460 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  r of pages in th
18470 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  e database */.  
18480 69 6e 74 20 6e 50 61 67 65 46 69 6c 65 20 3d 20  int nPageFile = 
18490 30 3b 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f  0;   /* Number o
184a0 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64  f pages in the d
184b0 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
184c0 20 20 69 6e 74 20 6e 50 61 67 65 48 65 61 64 65    int nPageHeade
184d0 72 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72  r;     /* Number
184e0 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
184f0 20 64 61 74 61 62 61 73 65 20 61 63 63 6f 72 64   database accord
18500 69 6e 67 20 74 6f 20 68 64 72 20 2a 2f 0a 0a 20  ing to hdr */.. 
18510 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
18520 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
18530 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
18540 65 72 74 28 20 70 42 74 2d 3e 70 50 61 67 65 31  ert( pBt->pPage1
18550 3d 3d 30 20 29 3b 0a 20 20 72 63 20 3d 20 73 71  ==0 );.  rc = sq
18560 6c 69 74 65 33 50 61 67 65 72 53 68 61 72 65 64  lite3PagerShared
18570 4c 6f 63 6b 28 70 42 74 2d 3e 70 50 61 67 65 72  Lock(pBt->pPager
18580 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
18590 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
185a0 72 63 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65  rc;.  rc = btree
185b0 47 65 74 50 61 67 65 28 70 42 74 2c 20 31 2c 20  GetPage(pBt, 1, 
185c0 26 70 50 61 67 65 31 2c 20 30 29 3b 0a 20 20 69  &pPage1, 0);.  i
185d0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
185e0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
185f0 20 2f 2a 20 44 6f 20 73 6f 6d 65 20 63 68 65 63   /* Do some chec
18600 6b 69 6e 67 20 74 6f 20 68 65 6c 70 20 69 6e 73  king to help ins
18610 75 72 65 20 74 68 65 20 66 69 6c 65 20 77 65 20  ure the file we 
18620 6f 70 65 6e 65 64 20 72 65 61 6c 6c 79 20 69 73  opened really is
18630 0a 20 20 2a 2a 20 61 20 76 61 6c 69 64 20 64 61  .  ** a valid da
18640 74 61 62 61 73 65 20 66 69 6c 65 2e 20 0a 20 20  tabase file. .  
18650 2a 2f 0a 20 20 6e 50 61 67 65 20 3d 20 6e 50 61  */.  nPage = nPa
18660 67 65 48 65 61 64 65 72 20 3d 20 67 65 74 34 62  geHeader = get4b
18670 79 74 65 28 32 38 2b 28 75 38 2a 29 70 50 61 67  yte(28+(u8*)pPag
18680 65 31 2d 3e 61 44 61 74 61 29 3b 0a 20 20 73 71  e1->aData);.  sq
18690 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f  lite3PagerPageco
186a0 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  unt(pBt->pPager,
186b0 20 26 6e 50 61 67 65 46 69 6c 65 29 3b 0a 20 20   &nPageFile);.  
186c0 69 66 28 20 6e 50 61 67 65 3d 3d 30 20 7c 7c 20  if( nPage==0 || 
186d0 6d 65 6d 63 6d 70 28 32 34 2b 28 75 38 2a 29 70  memcmp(24+(u8*)p
186e0 50 61 67 65 31 2d 3e 61 44 61 74 61 2c 20 39 32  Page1->aData, 92
186f0 2b 28 75 38 2a 29 70 50 61 67 65 31 2d 3e 61 44  +(u8*)pPage1->aD
18700 61 74 61 2c 34 29 21 3d 30 20 29 7b 0a 20 20 20  ata,4)!=0 ){.   
18710 20 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 46 69   nPage = nPageFi
18720 6c 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 50  le;.  }.  if( nP
18730 61 67 65 3e 30 20 29 7b 0a 20 20 20 20 75 33 32  age>0 ){.    u32
18740 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 75   pageSize;.    u
18750 33 32 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20  32 usableSize;. 
18760 20 20 20 75 38 20 2a 70 61 67 65 31 20 3d 20 70     u8 *page1 = p
18770 50 61 67 65 31 2d 3e 61 44 61 74 61 3b 0a 20 20  Page1->aData;.  
18780 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
18790 54 41 44 42 3b 0a 20 20 20 20 2f 2a 20 45 56 49  TADB;.    /* EVI
187a0 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 33 37 33  DENCE-OF: R-4373
187b0 37 2d 33 39 39 39 39 20 45 76 65 72 79 20 76 61  7-39999 Every va
187c0 6c 69 64 20 53 51 4c 69 74 65 20 64 61 74 61 62  lid SQLite datab
187d0 61 73 65 20 66 69 6c 65 20 62 65 67 69 6e 73 0a  ase file begins.
187e0 20 20 20 20 2a 2a 20 77 69 74 68 20 74 68 65 20      ** with the 
187f0 66 6f 6c 6c 6f 77 69 6e 67 20 31 36 20 62 79 74  following 16 byt
18800 65 73 20 28 69 6e 20 68 65 78 29 3a 20 35 33 20  es (in hex): 53 
18810 35 31 20 34 63 20 36 39 20 37 34 20 36 35 20 32  51 4c 69 74 65 2
18820 30 20 36 36 20 36 66 20 37 32 20 36 64 0a 20 20  0 66 6f 72 6d.  
18830 20 20 2a 2a 20 36 31 20 37 34 20 32 30 20 33 33    ** 61 74 20 33
18840 20 30 30 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20   00. */.    if( 
18850 6d 65 6d 63 6d 70 28 70 61 67 65 31 2c 20 7a 4d  memcmp(page1, zM
18860 61 67 69 63 48 65 61 64 65 72 2c 20 31 36 29 21  agicHeader, 16)!
18870 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  =0 ){.      goto
18880 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c   page1_init_fail
18890 65 64 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65  ed;.    }..#ifde
188a0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  f SQLITE_OMIT_WA
188b0 4c 0a 20 20 20 20 69 66 28 20 70 61 67 65 31 5b  L.    if( page1[
188c0 31 38 5d 3e 31 20 29 7b 0a 20 20 20 20 20 20 70  18]>1 ){.      p
188d0 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20  Bt->btsFlags |= 
188e0 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 3b 0a 20  BTS_READ_ONLY;. 
188f0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 61 67     }.    if( pag
18900 65 31 5b 31 39 5d 3e 31 20 29 7b 0a 20 20 20 20  e1[19]>1 ){.    
18910 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69    goto page1_ini
18920 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a  t_failed;.    }.
18930 23 65 6c 73 65 0a 20 20 20 20 69 66 28 20 70 61  #else.    if( pa
18940 67 65 31 5b 31 38 5d 3e 32 20 29 7b 0a 20 20 20  ge1[18]>2 ){.   
18950 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73     pBt->btsFlags
18960 20 7c 3d 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c   |= BTS_READ_ONL
18970 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  Y;.    }.    if(
18980 20 70 61 67 65 31 5b 31 39 5d 3e 32 20 29 7b 0a   page1[19]>2 ){.
18990 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31        goto page1
189a0 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20  _init_failed;.  
189b0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74    }..    /* If t
189c0 68 65 20 77 72 69 74 65 20 76 65 72 73 69 6f 6e  he write version
189d0 20 69 73 20 73 65 74 20 74 6f 20 32 2c 20 74 68   is set to 2, th
189e0 69 73 20 64 61 74 61 62 61 73 65 20 73 68 6f 75  is database shou
189f0 6c 64 20 62 65 20 61 63 63 65 73 73 65 64 0a 20  ld be accessed. 
18a00 20 20 20 2a 2a 20 69 6e 20 57 41 4c 20 6d 6f 64     ** in WAL mod
18a10 65 2e 20 49 66 20 74 68 65 20 6c 6f 67 20 69 73  e. If the log is
18a20 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f 70 65   not already ope
18a30 6e 2c 20 6f 70 65 6e 20 69 74 20 6e 6f 77 2e 20  n, open it now. 
18a40 54 68 65 6e 20 0a 20 20 20 20 2a 2a 20 72 65 74  Then .    ** ret
18a50 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 61 6e  urn SQLITE_OK an
18a60 64 20 72 65 74 75 72 6e 20 77 69 74 68 6f 75 74  d return without
18a70 20 70 6f 70 75 6c 61 74 69 6e 67 20 42 74 53 68   populating BtSh
18a80 61 72 65 64 2e 70 50 61 67 65 31 2e 0a 20 20 20  ared.pPage1..   
18a90 20 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 64   ** The caller d
18aa0 65 74 65 63 74 73 20 74 68 69 73 20 61 6e 64 20  etects this and 
18ab0 63 61 6c 6c 73 20 74 68 69 73 20 66 75 6e 63 74  calls this funct
18ac0 69 6f 6e 20 61 67 61 69 6e 2e 20 54 68 69 73 20  ion again. This 
18ad0 69 73 0a 20 20 20 20 2a 2a 20 72 65 71 75 69 72  is.    ** requir
18ae0 65 64 20 61 73 20 74 68 65 20 76 65 72 73 69 6f  ed as the versio
18af0 6e 20 6f 66 20 70 61 67 65 20 31 20 63 75 72 72  n of page 1 curr
18b00 65 6e 74 6c 79 20 69 6e 20 74 68 65 20 70 61 67  ently in the pag
18b10 65 31 20 62 75 66 66 65 72 0a 20 20 20 20 2a 2a  e1 buffer.    **
18b20 20 6d 61 79 20 6e 6f 74 20 62 65 20 74 68 65 20   may not be the 
18b30 6c 61 74 65 73 74 20 76 65 72 73 69 6f 6e 20 2d  latest version -
18b40 20 74 68 65 72 65 20 6d 61 79 20 62 65 20 61 20   there may be a 
18b50 6e 65 77 65 72 20 6f 6e 65 20 69 6e 20 74 68 65  newer one in the
18b60 20 6c 6f 67 0a 20 20 20 20 2a 2a 20 66 69 6c 65   log.    ** file
18b70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
18b80 20 70 61 67 65 31 5b 31 39 5d 3d 3d 32 20 26 26   page1[19]==2 &&
18b90 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20   (pBt->btsFlags 
18ba0 26 20 42 54 53 5f 4e 4f 5f 57 41 4c 29 3d 3d 30  & BTS_NO_WAL)==0
18bb0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 73   ){.      int is
18bc0 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20  Open = 0;.      
18bd0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
18be0 72 4f 70 65 6e 57 61 6c 28 70 42 74 2d 3e 70 50  rOpenWal(pBt->pP
18bf0 61 67 65 72 2c 20 26 69 73 4f 70 65 6e 29 3b 0a  ager, &isOpen);.
18c00 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
18c10 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
18c20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e     goto page1_in
18c30 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 20  it_failed;.     
18c40 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
18c50 73 65 74 44 65 66 61 75 6c 74 53 79 6e 63 46 6c  setDefaultSyncFl
18c60 61 67 28 70 42 74 2c 20 53 51 4c 49 54 45 5f 44  ag(pBt, SQLITE_D
18c70 45 46 41 55 4c 54 5f 57 41 4c 5f 53 59 4e 43 48  EFAULT_WAL_SYNCH
18c80 52 4f 4e 4f 55 53 2b 31 29 3b 0a 20 20 20 20 20  RONOUS+1);.     
18c90 20 20 20 69 66 28 20 69 73 4f 70 65 6e 3d 3d 30     if( isOpen==0
18ca0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
18cb0 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65 31  leasePage(pPage1
18cc0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  );.          ret
18cd0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
18ce0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
18cf0 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
18d00 54 45 5f 4e 4f 54 41 44 42 3b 0a 20 20 20 20 7d  TE_NOTADB;.    }
18d10 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 65 74 44  else{.      setD
18d20 65 66 61 75 6c 74 53 79 6e 63 46 6c 61 67 28 70  efaultSyncFlag(p
18d30 42 74 2c 20 53 51 4c 49 54 45 5f 44 45 46 41 55  Bt, SQLITE_DEFAU
18d40 4c 54 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 2b 31  LT_SYNCHRONOUS+1
18d50 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
18d60 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45  .    /* EVIDENCE
18d70 2d 4f 46 3a 20 52 2d 31 35 34 36 35 2d 32 30 38  -OF: R-15465-208
18d80 31 33 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 61  13 The maximum a
18d90 6e 64 20 6d 69 6e 69 6d 75 6d 20 65 6d 62 65 64  nd minimum embed
18da0 64 65 64 20 70 61 79 6c 6f 61 64 0a 20 20 20 20  ded payload.    
18db0 2a 2a 20 66 72 61 63 74 69 6f 6e 73 20 61 6e 64  ** fractions and
18dc0 20 74 68 65 20 6c 65 61 66 20 70 61 79 6c 6f 61   the leaf payloa
18dd0 64 20 66 72 61 63 74 69 6f 6e 20 76 61 6c 75 65  d fraction value
18de0 73 20 6d 75 73 74 20 62 65 20 36 34 2c 20 33 32  s must be 64, 32
18df0 2c 20 61 6e 64 20 33 32 2e 0a 20 20 20 20 2a 2a  , and 32..    **
18e00 0a 20 20 20 20 2a 2a 20 54 68 65 20 6f 72 69 67  .    ** The orig
18e10 69 6e 61 6c 20 64 65 73 69 67 6e 20 61 6c 6c 6f  inal design allo
18e20 77 65 64 20 74 68 65 73 65 20 61 6d 6f 75 6e 74  wed these amount
18e30 73 20 74 6f 20 76 61 72 79 2c 20 62 75 74 20 61  s to vary, but a
18e40 73 20 6f 66 0a 20 20 20 20 2a 2a 20 76 65 72 73  s of.    ** vers
18e50 69 6f 6e 20 33 2e 36 2e 30 2c 20 77 65 20 72 65  ion 3.6.0, we re
18e60 71 75 69 72 65 20 74 68 65 6d 20 74 6f 20 62 65  quire them to be
18e70 20 66 69 78 65 64 2e 0a 20 20 20 20 2a 2f 0a 20   fixed..    */. 
18e80 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 26 70     if( memcmp(&p
18e90 61 67 65 31 5b 32 31 5d 2c 20 22 5c 31 30 30 5c  age1[21], "\100\
18ea0 30 34 30 5c 30 34 30 22 2c 33 29 21 3d 30 20 29  040\040",3)!=0 )
18eb0 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67  {.      goto pag
18ec0 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a  e1_init_failed;.
18ed0 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 45 56 49      }.    /* EVI
18ee0 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 31 38 37  DENCE-OF: R-5187
18ef0 33 2d 33 39 36 31 38 20 54 68 65 20 70 61 67 65  3-39618 The page
18f00 20 73 69 7a 65 20 66 6f 72 20 61 20 64 61 74 61   size for a data
18f10 62 61 73 65 20 66 69 6c 65 20 69 73 0a 20 20 20  base file is.   
18f20 20 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 62   ** determined b
18f30 79 20 74 68 65 20 32 2d 62 79 74 65 20 69 6e 74  y the 2-byte int
18f40 65 67 65 72 20 6c 6f 63 61 74 65 64 20 61 74 20  eger located at 
18f50 61 6e 20 6f 66 66 73 65 74 20 6f 66 20 31 36 20  an offset of 16 
18f60 62 79 74 65 73 20 66 72 6f 6d 0a 20 20 20 20 2a  bytes from.    *
18f70 2a 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  * the beginning 
18f80 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
18f90 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 70 61 67  file. */.    pag
18fa0 65 53 69 7a 65 20 3d 20 28 70 61 67 65 31 5b 31  eSize = (page1[1
18fb0 36 5d 3c 3c 38 29 20 7c 20 28 70 61 67 65 31 5b  6]<<8) | (page1[
18fc0 31 37 5d 3c 3c 31 36 29 3b 0a 20 20 20 20 2f 2a  17]<<16);.    /*
18fd0 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
18fe0 32 35 30 30 38 2d 32 31 36 38 38 20 54 68 65 20  25008-21688 The 
18ff0 73 69 7a 65 20 6f 66 20 61 20 70 61 67 65 20 69  size of a page i
19000 73 20 61 20 70 6f 77 65 72 20 6f 66 20 74 77 6f  s a power of two
19010 0a 20 20 20 20 2a 2a 20 62 65 74 77 65 65 6e 20  .    ** between 
19020 35 31 32 20 61 6e 64 20 36 35 35 33 36 20 69 6e  512 and 65536 in
19030 63 6c 75 73 69 76 65 2e 20 2a 2f 0a 20 20 20 20  clusive. */.    
19040 69 66 28 20 28 28 70 61 67 65 53 69 7a 65 2d 31  if( ((pageSize-1
19050 29 26 70 61 67 65 53 69 7a 65 29 21 3d 30 0a 20  )&pageSize)!=0. 
19060 20 20 20 20 7c 7c 20 70 61 67 65 53 69 7a 65 3e      || pageSize>
19070 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f  SQLITE_MAX_PAGE_
19080 53 49 5a 45 20 0a 20 20 20 20 20 7c 7c 20 70 61  SIZE .     || pa
19090 67 65 53 69 7a 65 3c 3d 32 35 36 20 0a 20 20 20  geSize<=256 .   
190a0 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70   ){.      goto p
190b0 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64  age1_init_failed
190c0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
190d0 72 74 28 20 28 70 61 67 65 53 69 7a 65 20 26 20  rt( (pageSize & 
190e0 37 29 3d 3d 30 20 29 3b 0a 20 20 20 20 2f 2a 20  7)==0 );.    /* 
190f0 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35  EVIDENCE-OF: R-5
19100 39 33 31 30 2d 35 31 32 30 35 20 54 68 65 20 22  9310-51205 The "
19110 72 65 73 65 72 76 65 64 20 73 70 61 63 65 22 20  reserved space" 
19120 73 69 7a 65 20 69 6e 20 74 68 65 20 31 2d 62 79  size in the 1-by
19130 74 65 0a 20 20 20 20 2a 2a 20 69 6e 74 65 67 65  te.    ** intege
19140 72 20 61 74 20 6f 66 66 73 65 74 20 32 30 20 69  r at offset 20 i
19150 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
19160 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 61  bytes of space a
19170 74 20 74 68 65 20 65 6e 64 20 6f 66 0a 20 20 20  t the end of.   
19180 20 2a 2a 20 65 61 63 68 20 70 61 67 65 20 74 6f   ** each page to
19190 20 72 65 73 65 72 76 65 20 66 6f 72 20 65 78 74   reserve for ext
191a0 65 6e 73 69 6f 6e 73 2e 20 0a 20 20 20 20 2a 2a  ensions. .    **
191b0 0a 20 20 20 20 2a 2a 20 45 56 49 44 45 4e 43 45  .    ** EVIDENCE
191c0 2d 4f 46 3a 20 52 2d 33 37 34 39 37 2d 34 32 34  -OF: R-37497-424
191d0 31 32 20 54 68 65 20 73 69 7a 65 20 6f 66 20 74  12 The size of t
191e0 68 65 20 72 65 73 65 72 76 65 64 20 72 65 67 69  he reserved regi
191f0 6f 6e 20 69 73 0a 20 20 20 20 2a 2a 20 64 65 74  on is.    ** det
19200 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20 6f  ermined by the o
19210 6e 65 2d 62 79 74 65 20 75 6e 73 69 67 6e 65 64  ne-byte unsigned
19220 20 69 6e 74 65 67 65 72 20 66 6f 75 6e 64 20 61   integer found a
19230 74 20 61 6e 20 6f 66 66 73 65 74 20 6f 66 20 32  t an offset of 2
19240 30 0a 20 20 20 20 2a 2a 20 69 6e 74 6f 20 74 68  0.    ** into th
19250 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
19260 68 65 61 64 65 72 2e 20 2a 2f 0a 20 20 20 20 75  header. */.    u
19270 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 61 67 65  sableSize = page
19280 53 69 7a 65 20 2d 20 70 61 67 65 31 5b 32 30 5d  Size - page1[20]
19290 3b 0a 20 20 20 20 69 66 28 20 28 75 33 32 29 70  ;.    if( (u32)p
192a0 61 67 65 53 69 7a 65 21 3d 70 42 74 2d 3e 70 61  ageSize!=pBt->pa
192b0 67 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  geSize ){.      
192c0 2f 2a 20 41 66 74 65 72 20 72 65 61 64 69 6e 67  /* After reading
192d0 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20   the first page 
192e0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
192f0 61 73 73 75 6d 69 6e 67 20 61 20 70 61 67 65 20  assuming a page 
19300 73 69 7a 65 0a 20 20 20 20 20 20 2a 2a 20 6f 66  size.      ** of
19310 20 42 74 53 68 61 72 65 64 2e 70 61 67 65 53 69   BtShared.pageSi
19320 7a 65 2c 20 77 65 20 68 61 76 65 20 64 69 73 63  ze, we have disc
19330 6f 76 65 72 65 64 20 74 68 61 74 20 74 68 65 20  overed that the 
19340 70 61 67 65 2d 73 69 7a 65 20 69 73 0a 20 20 20  page-size is.   
19350 20 20 20 2a 2a 20 61 63 74 75 61 6c 6c 79 20 70     ** actually p
19360 61 67 65 53 69 7a 65 2e 20 55 6e 6c 6f 63 6b 20  ageSize. Unlock 
19370 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 6c 65  the database, le
19380 61 76 65 20 70 42 74 2d 3e 70 50 61 67 65 31 20  ave pBt->pPage1 
19390 61 74 0a 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f  at.      ** zero
193a0 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49   and return SQLI
193b0 54 45 5f 4f 4b 2e 20 54 68 65 20 63 61 6c 6c 65  TE_OK. The calle
193c0 72 20 77 69 6c 6c 20 63 61 6c 6c 20 74 68 69 73  r will call this
193d0 20 66 75 6e 63 74 69 6f 6e 0a 20 20 20 20 20 20   function.      
193e0 2a 2a 20 61 67 61 69 6e 20 77 69 74 68 20 74 68  ** again with th
193f0 65 20 63 6f 72 72 65 63 74 20 70 61 67 65 2d 73  e correct page-s
19400 69 7a 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ize..      */.  
19410 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
19420 70 50 61 67 65 31 29 3b 0a 20 20 20 20 20 20 70  pPage1);.      p
19430 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d  Bt->usableSize =
19440 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 20   usableSize;.   
19450 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65     pBt->pageSize
19460 20 3d 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20   = pageSize;.   
19470 20 20 20 66 72 65 65 54 65 6d 70 53 70 61 63 65     freeTempSpace
19480 28 70 42 74 29 3b 0a 20 20 20 20 20 20 72 63 20  (pBt);.      rc 
19490 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65  = sqlite3PagerSe
194a0 74 50 61 67 65 73 69 7a 65 28 70 42 74 2d 3e 70  tPagesize(pBt->p
194b0 50 61 67 65 72 2c 20 26 70 42 74 2d 3e 70 61 67  Pager, &pBt->pag
194c0 65 53 69 7a 65 2c 0a 20 20 20 20 20 20 20 20 20  eSize,.         
194d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
194e0 20 20 20 20 20 20 20 20 20 20 70 61 67 65 53 69            pageSi
194f0 7a 65 2d 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a  ze-usableSize);.
19500 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
19510 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28  .    }.    if( (
19520 70 42 74 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26  pBt->db->flags &
19530 20 53 51 4c 49 54 45 5f 52 65 63 6f 76 65 72 79   SQLITE_Recovery
19540 4d 6f 64 65 29 3d 3d 30 20 26 26 20 6e 50 61 67  Mode)==0 && nPag
19550 65 3e 6e 50 61 67 65 46 69 6c 65 20 29 7b 0a 20  e>nPageFile ){. 
19560 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
19570 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
19580 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f       goto page1_
19590 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20  init_failed;.   
195a0 20 7d 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e   }.    /* EVIDEN
195b0 43 45 2d 4f 46 3a 20 52 2d 32 38 33 31 32 2d 36  CE-OF: R-28312-6
195c0 34 37 30 34 20 48 6f 77 65 76 65 72 2c 20 74 68  4704 However, th
195d0 65 20 75 73 61 62 6c 65 20 73 69 7a 65 20 69 73  e usable size is
195e0 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 74 6f 0a   not allowed to.
195f0 20 20 20 20 2a 2a 20 62 65 20 6c 65 73 73 20 74      ** be less t
19600 68 61 6e 20 34 38 30 2e 20 49 6e 20 6f 74 68 65  han 480. In othe
19610 72 20 77 6f 72 64 73 2c 20 69 66 20 74 68 65 20  r words, if the 
19620 70 61 67 65 20 73 69 7a 65 20 69 73 20 35 31 32  page size is 512
19630 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 20 20 2a  , then the.    *
19640 2a 20 72 65 73 65 72 76 65 64 20 73 70 61 63 65  * reserved space
19650 20 73 69 7a 65 20 63 61 6e 6e 6f 74 20 65 78 63   size cannot exc
19660 65 65 64 20 33 32 2e 20 2a 2f 0a 20 20 20 20 69  eed 32. */.    i
19670 66 28 20 75 73 61 62 6c 65 53 69 7a 65 3c 34 38  f( usableSize<48
19680 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  0 ){.      goto 
19690 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65  page1_init_faile
196a0 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 74  d;.    }.    pBt
196b0 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 70 61 67  ->pageSize = pag
196c0 65 53 69 7a 65 3b 0a 20 20 20 20 70 42 74 2d 3e  eSize;.    pBt->
196d0 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 75 73 61  usableSize = usa
196e0 62 6c 65 53 69 7a 65 3b 0a 23 69 66 6e 64 65 66  bleSize;.#ifndef
196f0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
19700 4f 56 41 43 55 55 4d 0a 20 20 20 20 70 42 74 2d  OVACUUM.    pBt-
19710 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 28 67  >autoVacuum = (g
19720 65 74 34 62 79 74 65 28 26 70 61 67 65 31 5b 33  et4byte(&page1[3
19730 36 20 2b 20 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a  6 + 4*4])?1:0);.
19740 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63      pBt->incrVac
19750 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28  uum = (get4byte(
19760 26 70 61 67 65 31 5b 33 36 20 2b 20 37 2a 34 5d  &page1[36 + 7*4]
19770 29 3f 31 3a 30 29 3b 0a 23 65 6e 64 69 66 0a 20  )?1:0);.#endif. 
19780 20 7d 0a 0a 20 20 2f 2a 20 6d 61 78 4c 6f 63 61   }..  /* maxLoca
19790 6c 20 69 73 20 74 68 65 20 6d 61 78 69 6d 75 6d  l is the maximum
197a0 20 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f   amount of paylo
197b0 61 64 20 74 6f 20 73 74 6f 72 65 20 6c 6f 63 61  ad to store loca
197c0 6c 6c 79 20 66 6f 72 0a 20 20 2a 2a 20 61 20 63  lly for.  ** a c
197d0 65 6c 6c 2e 20 20 4d 61 6b 65 20 73 75 72 65 20  ell.  Make sure 
197e0 69 74 20 69 73 20 73 6d 61 6c 6c 20 65 6e 6f 75  it is small enou
197f0 67 68 20 73 6f 20 74 68 61 74 20 61 74 20 6c 65  gh so that at le
19800 61 73 74 20 6d 69 6e 46 61 6e 6f 75 74 0a 20 20  ast minFanout.  
19810 2a 2a 20 63 65 6c 6c 73 20 63 61 6e 20 77 69 6c  ** cells can wil
19820 6c 20 66 69 74 20 6f 6e 20 6f 6e 65 20 70 61 67  l fit on one pag
19830 65 2e 20 20 57 65 20 61 73 73 75 6d 65 20 61 20  e.  We assume a 
19840 31 30 2d 62 79 74 65 20 70 61 67 65 20 68 65 61  10-byte page hea
19850 64 65 72 2e 0a 20 20 2a 2a 20 42 65 73 69 64 65  der..  ** Beside
19860 73 20 74 68 65 20 70 61 79 6c 6f 61 64 2c 20 74  s the payload, t
19870 68 65 20 63 65 6c 6c 20 6d 75 73 74 20 73 74 6f  he cell must sto
19880 72 65 3a 0a 20 20 2a 2a 20 20 20 20 20 32 2d 62  re:.  **     2-b
19890 79 74 65 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  yte pointer to t
198a0 68 65 20 63 65 6c 6c 0a 20 20 2a 2a 20 20 20 20  he cell.  **    
198b0 20 34 2d 62 79 74 65 20 63 68 69 6c 64 20 70 6f   4-byte child po
198c0 69 6e 74 65 72 0a 20 20 2a 2a 20 20 20 20 20 39  inter.  **     9
198d0 2d 62 79 74 65 20 6e 4b 65 79 20 76 61 6c 75 65  -byte nKey value
198e0 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62 79 74 65  .  **     4-byte
198f0 20 6e 44 61 74 61 20 76 61 6c 75 65 0a 20 20 2a   nData value.  *
19900 2a 20 20 20 20 20 34 2d 62 79 74 65 20 6f 76 65  *     4-byte ove
19910 72 66 6c 6f 77 20 70 61 67 65 20 70 6f 69 6e 74  rflow page point
19920 65 72 0a 20 20 2a 2a 20 53 6f 20 61 20 63 65 6c  er.  ** So a cel
19930 6c 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20  l consists of a 
19940 32 2d 62 79 74 65 20 70 6f 69 6e 74 65 72 2c 20  2-byte pointer, 
19950 61 20 68 65 61 64 65 72 20 77 68 69 63 68 20 69  a header which i
19960 73 20 61 73 20 6d 75 63 68 20 61 73 0a 20 20 2a  s as much as.  *
19970 2a 20 31 37 20 62 79 74 65 73 20 6c 6f 6e 67 2c  * 17 bytes long,
19980 20 30 20 74 6f 20 4e 20 62 79 74 65 73 20 6f 66   0 to N bytes of
19990 20 70 61 79 6c 6f 61 64 2c 20 61 6e 64 20 61 6e   payload, and an
199a0 20 6f 70 74 69 6f 6e 61 6c 20 34 20 62 79 74 65   optional 4 byte
199b0 20 6f 76 65 72 66 6c 6f 77 0a 20 20 2a 2a 20 70   overflow.  ** p
199c0 61 67 65 20 70 6f 69 6e 74 65 72 2e 0a 20 20 2a  age pointer..  *
199d0 2f 0a 20 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61  /.  pBt->maxLoca
199e0 6c 20 3d 20 28 75 31 36 29 28 28 70 42 74 2d 3e  l = (u16)((pBt->
199f0 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a 36  usableSize-12)*6
19a00 34 2f 32 35 35 20 2d 20 32 33 29 3b 0a 20 20 70  4/255 - 23);.  p
19a10 42 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 28  Bt->minLocal = (
19a20 75 31 36 29 28 28 70 42 74 2d 3e 75 73 61 62 6c  u16)((pBt->usabl
19a30 65 53 69 7a 65 2d 31 32 29 2a 33 32 2f 32 35 35  eSize-12)*32/255
19a40 20 2d 20 32 33 29 3b 0a 20 20 70 42 74 2d 3e 6d   - 23);.  pBt->m
19a50 61 78 4c 65 61 66 20 3d 20 28 75 31 36 29 28 70  axLeaf = (u16)(p
19a60 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d  Bt->usableSize -
19a70 20 33 35 29 3b 0a 20 20 70 42 74 2d 3e 6d 69 6e   35);.  pBt->min
19a80 4c 65 61 66 20 3d 20 28 75 31 36 29 28 28 70 42  Leaf = (u16)((pB
19a90 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31 32  t->usableSize-12
19aa0 29 2a 33 32 2f 32 35 35 20 2d 20 32 33 29 3b 0a  )*32/255 - 23);.
19ab0 20 20 69 66 28 20 70 42 74 2d 3e 6d 61 78 4c 6f    if( pBt->maxLo
19ac0 63 61 6c 3e 31 32 37 20 29 7b 0a 20 20 20 20 70  cal>127 ){.    p
19ad0 42 74 2d 3e 6d 61 78 31 62 79 74 65 50 61 79 6c  Bt->max1bytePayl
19ae0 6f 61 64 20 3d 20 31 32 37 3b 0a 20 20 7d 65 6c  oad = 127;.  }el
19af0 73 65 7b 0a 20 20 20 20 70 42 74 2d 3e 6d 61 78  se{.    pBt->max
19b00 31 62 79 74 65 50 61 79 6c 6f 61 64 20 3d 20 28  1bytePayload = (
19b10 75 38 29 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c  u8)pBt->maxLocal
19b20 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
19b30 70 42 74 2d 3e 6d 61 78 4c 65 61 66 20 2b 20 32  pBt->maxLeaf + 2
19b40 33 20 3c 3d 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a  3 <= MX_CELL_SIZ
19b50 45 28 70 42 74 29 20 29 3b 0a 20 20 70 42 74 2d  E(pBt) );.  pBt-
19b60 3e 70 50 61 67 65 31 20 3d 20 70 50 61 67 65 31  >pPage1 = pPage1
19b70 3b 0a 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d  ;.  pBt->nPage =
19b80 20 6e 50 61 67 65 3b 0a 20 20 72 65 74 75 72 6e   nPage;.  return
19b90 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 70 61 67   SQLITE_OK;..pag
19ba0 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3a 0a  e1_init_failed:.
19bb0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
19bc0 61 67 65 31 29 3b 0a 20 20 70 42 74 2d 3e 70 50  age1);.  pBt->pP
19bd0 61 67 65 31 20 3d 20 30 3b 0a 20 20 72 65 74 75  age1 = 0;.  retu
19be0 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65  rn rc;.}..#ifnde
19bf0 66 20 4e 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 52  f NDEBUG./*.** R
19c00 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
19c10 20 6f 66 20 63 75 72 73 6f 72 73 20 6f 70 65 6e   of cursors open
19c20 20 6f 6e 20 70 42 74 2e 20 54 68 69 73 20 69 73   on pBt. This is
19c30 20 66 6f 72 20 75 73 65 0a 2a 2a 20 69 6e 20 61   for use.** in a
19c40 73 73 65 72 74 28 29 20 65 78 70 72 65 73 73 69  ssert() expressi
19c50 6f 6e 73 2c 20 73 6f 20 69 74 20 69 73 20 6f 6e  ons, so it is on
19c60 6c 79 20 63 6f 6d 70 69 6c 65 64 20 69 66 20 4e  ly compiled if N
19c70 44 45 42 55 47 20 69 73 20 6e 6f 74 0a 2a 2a 20  DEBUG is not.** 
19c80 64 65 66 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f  defined..**.** O
19c90 6e 6c 79 20 77 72 69 74 65 20 63 75 72 73 6f 72  nly write cursor
19ca0 73 20 61 72 65 20 63 6f 75 6e 74 65 64 20 69 66  s are counted if
19cb0 20 77 72 4f 6e 6c 79 20 69 73 20 74 72 75 65 2e   wrOnly is true.
19cc0 20 20 49 66 20 77 72 4f 6e 6c 79 20 69 73 0a 2a    If wrOnly is.*
19cd0 2a 20 66 61 6c 73 65 20 74 68 65 6e 20 61 6c 6c  * false then all
19ce0 20 63 75 72 73 6f 72 73 20 61 72 65 20 63 6f 75   cursors are cou
19cf0 6e 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  nted..**.** For 
19d00 74 68 65 20 70 75 72 70 6f 73 65 73 20 6f 66 20  the purposes of 
19d10 74 68 69 73 20 72 6f 75 74 69 6e 65 2c 20 61 20  this routine, a 
19d20 63 75 72 73 6f 72 20 69 73 20 61 6e 79 20 63 75  cursor is any cu
19d30 72 73 6f 72 20 74 68 61 74 0a 2a 2a 20 69 73 20  rsor that.** is 
19d40 63 61 70 61 62 6c 65 20 6f 66 20 72 65 61 64 69  capable of readi
19d50 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20 74 6f  ng or writing to
19d60 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
19d70 43 75 72 73 6f 72 73 20 74 68 61 74 0a 2a 2a 20  Cursors that.** 
19d80 68 61 76 65 20 62 65 65 6e 20 74 72 69 70 70 65  have been trippe
19d90 64 20 69 6e 74 6f 20 74 68 65 20 43 55 52 53 4f  d into the CURSO
19da0 52 5f 46 41 55 4c 54 20 73 74 61 74 65 20 61 72  R_FAULT state ar
19db0 65 20 6e 6f 74 20 63 6f 75 6e 74 65 64 2e 0a 2a  e not counted..*
19dc0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 75  /.static int cou
19dd0 6e 74 56 61 6c 69 64 43 75 72 73 6f 72 73 28 42  ntValidCursors(B
19de0 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 69 6e  tShared *pBt, in
19df0 74 20 77 72 4f 6e 6c 79 29 7b 0a 20 20 42 74 43  t wrOnly){.  BtC
19e00 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a 20 20 69  ursor *pCur;.  i
19e10 6e 74 20 72 20 3d 20 30 3b 0a 20 20 66 6f 72 28  nt r = 0;.  for(
19e20 70 43 75 72 3d 70 42 74 2d 3e 70 43 75 72 73 6f  pCur=pBt->pCurso
19e30 72 3b 20 70 43 75 72 3b 20 70 43 75 72 3d 70 43  r; pCur; pCur=pC
19e40 75 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  ur->pNext){.    
19e50 69 66 28 20 28 77 72 4f 6e 6c 79 3d 3d 30 20 7c  if( (wrOnly==0 |
19e60 7c 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67  | (pCur->curFlag
19e70 73 20 26 20 42 54 43 46 5f 57 72 69 74 65 46 6c  s & BTCF_WriteFl
19e80 61 67 29 21 3d 30 29 0a 20 20 20 20 20 26 26 20  ag)!=0).     && 
19e90 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55  pCur->eState!=CU
19ea0 52 53 4f 52 5f 46 41 55 4c 54 20 29 20 72 2b 2b  RSOR_FAULT ) r++
19eb0 3b 20 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  ; .  }.  return 
19ec0 72 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  r;.}.#endif../*.
19ed0 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  ** If there are 
19ee0 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 63  no outstanding c
19ef0 75 72 73 6f 72 73 20 61 6e 64 20 77 65 20 61 72  ursors and we ar
19f00 65 20 6e 6f 74 20 69 6e 20 74 68 65 20 6d 69 64  e not in the mid
19f10 64 6c 65 0a 2a 2a 20 6f 66 20 61 20 74 72 61 6e  dle.** of a tran
19f20 73 61 63 74 69 6f 6e 20 62 75 74 20 74 68 65 72  saction but ther
19f30 65 20 69 73 20 61 20 72 65 61 64 20 6c 6f 63 6b  e is a read lock
19f40 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
19f50 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 69 73 20 72  , then.** this r
19f60 6f 75 74 69 6e 65 20 75 6e 72 65 66 73 20 74 68  outine unrefs th
19f70 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 20  e first page of 
19f80 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
19f90 65 20 77 68 69 63 68 20 0a 2a 2a 20 68 61 73 20  e which .** has 
19fa0 74 68 65 20 65 66 66 65 63 74 20 6f 66 20 72 65  the effect of re
19fb0 6c 65 61 73 69 6e 67 20 74 68 65 20 72 65 61 64  leasing the read
19fc0 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   lock..**.** If 
19fd0 74 68 65 72 65 20 69 73 20 61 20 74 72 61 6e 73  there is a trans
19fe0 61 63 74 69 6f 6e 20 69 6e 20 70 72 6f 67 72 65  action in progre
19ff0 73 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ss, this routine
1a000 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   is a no-op..*/.
1a010 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 6c 6f  static void unlo
1a020 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28  ckBtreeIfUnused(
1a030 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
1a040 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
1a050 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
1a060 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
1a070 73 65 72 74 28 20 63 6f 75 6e 74 56 61 6c 69 64  sert( countValid
1a080 43 75 72 73 6f 72 73 28 70 42 74 2c 30 29 3d 3d  Cursors(pBt,0)==
1a090 30 20 7c 7c 20 70 42 74 2d 3e 69 6e 54 72 61 6e  0 || pBt->inTran
1a0a0 73 61 63 74 69 6f 6e 3e 54 52 41 4e 53 5f 4e 4f  saction>TRANS_NO
1a0b0 4e 45 20 29 3b 0a 20 20 69 66 28 20 70 42 74 2d  NE );.  if( pBt-
1a0c0 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d  >inTransaction==
1a0d0 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 20 70 42  TRANS_NONE && pB
1a0e0 74 2d 3e 70 50 61 67 65 31 21 3d 30 20 29 7b 0a  t->pPage1!=0 ){.
1a0f0 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61      MemPage *pPa
1a100 67 65 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65  ge1 = pBt->pPage
1a110 31 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  1;.    assert( p
1a120 50 61 67 65 31 2d 3e 61 44 61 74 61 20 29 3b 0a  Page1->aData );.
1a130 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
1a140 74 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74  te3PagerRefcount
1a150 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3d 3d 31  (pBt->pPager)==1
1a160 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70 50 61   );.    pBt->pPa
1a170 67 65 31 20 3d 20 30 3b 0a 20 20 20 20 72 65 6c  ge1 = 0;.    rel
1a180 65 61 73 65 50 61 67 65 4e 6f 74 4e 75 6c 6c 28  easePageNotNull(
1a190 70 50 61 67 65 31 29 3b 0a 20 20 7d 0a 7d 0a 0a  pPage1);.  }.}..
1a1a0 2f 2a 0a 2a 2a 20 49 66 20 70 42 74 20 70 6f 69  /*.** If pBt poi
1a1b0 6e 74 73 20 74 6f 20 61 6e 20 65 6d 70 74 79 20  nts to an empty 
1a1c0 66 69 6c 65 20 74 68 65 6e 20 63 6f 6e 76 65 72  file then conver
1a1d0 74 20 74 68 61 74 20 65 6d 70 74 79 20 66 69 6c  t that empty fil
1a1e0 65 0a 2a 2a 20 69 6e 74 6f 20 61 20 6e 65 77 20  e.** into a new 
1a1f0 65 6d 70 74 79 20 64 61 74 61 62 61 73 65 20 62  empty database b
1a200 79 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74  y initializing t
1a210 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66  he first page of
1a220 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65  .** the database
1a230 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1a240 6e 65 77 44 61 74 61 62 61 73 65 28 42 74 53 68  newDatabase(BtSh
1a250 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 4d 65  ared *pBt){.  Me
1a260 6d 50 61 67 65 20 2a 70 50 31 3b 0a 20 20 75 6e  mPage *pP1;.  un
1a270 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74  signed char *dat
1a280 61 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  a;.  int rc;..  
1a290 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
1a2a0 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
1a2b0 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20  mutex) );.  if( 
1a2c0 70 42 74 2d 3e 6e 50 61 67 65 3e 30 20 29 7b 0a  pBt->nPage>0 ){.
1a2d0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1a2e0 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 50 31 20  E_OK;.  }.  pP1 
1a2f0 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20  = pBt->pPage1;. 
1a300 20 61 73 73 65 72 74 28 20 70 50 31 21 3d 30 20   assert( pP1!=0 
1a310 29 3b 0a 20 20 64 61 74 61 20 3d 20 70 50 31 2d  );.  data = pP1-
1a320 3e 61 44 61 74 61 3b 0a 20 20 72 63 20 3d 20 73  >aData;.  rc = s
1a330 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
1a340 28 70 50 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a  (pP1->pDbPage);.
1a350 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
1a360 6e 20 72 63 3b 0a 20 20 6d 65 6d 63 70 79 28 64  n rc;.  memcpy(d
1a370 61 74 61 2c 20 7a 4d 61 67 69 63 48 65 61 64 65  ata, zMagicHeade
1a380 72 2c 20 73 69 7a 65 6f 66 28 7a 4d 61 67 69 63  r, sizeof(zMagic
1a390 48 65 61 64 65 72 29 29 3b 0a 20 20 61 73 73 65  Header));.  asse
1a3a0 72 74 28 20 73 69 7a 65 6f 66 28 7a 4d 61 67 69  rt( sizeof(zMagi
1a3b0 63 48 65 61 64 65 72 29 3d 3d 31 36 20 29 3b 0a  cHeader)==16 );.
1a3c0 20 20 64 61 74 61 5b 31 36 5d 20 3d 20 28 75 38    data[16] = (u8
1a3d0 29 28 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  )((pBt->pageSize
1a3e0 3e 3e 38 29 26 30 78 66 66 29 3b 0a 20 20 64 61  >>8)&0xff);.  da
1a3f0 74 61 5b 31 37 5d 20 3d 20 28 75 38 29 28 28 70  ta[17] = (u8)((p
1a400 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3e 31 36  Bt->pageSize>>16
1a410 29 26 30 78 66 66 29 3b 0a 20 20 64 61 74 61 5b  )&0xff);.  data[
1a420 31 38 5d 20 3d 20 31 3b 0a 20 20 64 61 74 61 5b  18] = 1;.  data[
1a430 31 39 5d 20 3d 20 31 3b 0a 20 20 61 73 73 65 72  19] = 1;.  asser
1a440 74 28 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  t( pBt->usableSi
1a450 7a 65 3c 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a  ze<=pBt->pageSiz
1a460 65 20 26 26 20 70 42 74 2d 3e 75 73 61 62 6c 65  e && pBt->usable
1a470 53 69 7a 65 2b 32 35 35 3e 3d 70 42 74 2d 3e 70  Size+255>=pBt->p
1a480 61 67 65 53 69 7a 65 29 3b 0a 20 20 64 61 74 61  ageSize);.  data
1a490 5b 32 30 5d 20 3d 20 28 75 38 29 28 70 42 74 2d  [20] = (u8)(pBt-
1a4a0 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 42 74 2d  >pageSize - pBt-
1a4b0 3e 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20  >usableSize);.  
1a4c0 64 61 74 61 5b 32 31 5d 20 3d 20 36 34 3b 0a 20  data[21] = 64;. 
1a4d0 20 64 61 74 61 5b 32 32 5d 20 3d 20 33 32 3b 0a   data[22] = 32;.
1a4e0 20 20 64 61 74 61 5b 32 33 5d 20 3d 20 33 32 3b    data[23] = 32;
1a4f0 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b  .  memset(&data[
1a500 32 34 5d 2c 20 30 2c 20 31 30 30 2d 32 34 29 3b  24], 0, 100-24);
1a510 0a 20 20 7a 65 72 6f 50 61 67 65 28 70 50 31 2c  .  zeroPage(pP1,
1a520 20 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f   PTF_INTKEY|PTF_
1a530 4c 45 41 46 7c 50 54 46 5f 4c 45 41 46 44 41 54  LEAF|PTF_LEAFDAT
1a540 41 20 29 3b 0a 20 20 70 42 74 2d 3e 62 74 73 46  A );.  pBt->btsF
1a550 6c 61 67 73 20 7c 3d 20 42 54 53 5f 50 41 47 45  lags |= BTS_PAGE
1a560 53 49 5a 45 5f 46 49 58 45 44 3b 0a 23 69 66 6e  SIZE_FIXED;.#ifn
1a570 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1a580 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 61 73 73  AUTOVACUUM.  ass
1a590 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56 61  ert( pBt->autoVa
1a5a0 63 75 75 6d 3d 3d 31 20 7c 7c 20 70 42 74 2d 3e  cuum==1 || pBt->
1a5b0 61 75 74 6f 56 61 63 75 75 6d 3d 3d 30 20 29 3b  autoVacuum==0 );
1a5c0 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
1a5d0 69 6e 63 72 56 61 63 75 75 6d 3d 3d 31 20 7c 7c  incrVacuum==1 ||
1a5e0 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d   pBt->incrVacuum
1a5f0 3d 3d 30 20 29 3b 0a 20 20 70 75 74 34 62 79 74  ==0 );.  put4byt
1a600 65 28 26 64 61 74 61 5b 33 36 20 2b 20 34 2a 34  e(&data[36 + 4*4
1a610 5d 2c 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  ], pBt->autoVacu
1a620 75 6d 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28  um);.  put4byte(
1a630 26 64 61 74 61 5b 33 36 20 2b 20 37 2a 34 5d 2c  &data[36 + 7*4],
1a640 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d   pBt->incrVacuum
1a650 29 3b 0a 23 65 6e 64 69 66 0a 20 20 70 42 74 2d  );.#endif.  pBt-
1a660 3e 6e 50 61 67 65 20 3d 20 31 3b 0a 20 20 64 61  >nPage = 1;.  da
1a670 74 61 5b 33 31 5d 20 3d 20 31 3b 0a 20 20 72 65  ta[31] = 1;.  re
1a680 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1a690 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c  }../*.** Initial
1a6a0 69 7a 65 20 74 68 65 20 66 69 72 73 74 20 70 61  ize the first pa
1a6b0 67 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ge of the databa
1a6c0 73 65 20 66 69 6c 65 20 28 63 72 65 61 74 69 6e  se file (creatin
1a6d0 67 20 61 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  g a database.** 
1a6e0 63 6f 6e 73 69 73 74 69 6e 67 20 6f 66 20 61 20  consisting of a 
1a6f0 73 69 6e 67 6c 65 20 70 61 67 65 20 61 6e 64 20  single page and 
1a700 6e 6f 20 73 63 68 65 6d 61 20 6f 62 6a 65 63 74  no schema object
1a710 73 29 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54  s). Return SQLIT
1a720 45 5f 4f 4b 0a 2a 2a 20 69 66 20 73 75 63 63 65  E_OK.** if succe
1a730 73 73 66 75 6c 2c 20 6f 72 20 61 6e 20 53 51 4c  ssful, or an SQL
1a740 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 6f  ite error code o
1a750 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 69 6e 74  therwise..*/.int
1a760 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 77   sqlite3BtreeNew
1a770 44 62 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  Db(Btree *p){.  
1a780 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65  int rc;.  sqlite
1a790 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
1a7a0 20 20 70 2d 3e 70 42 74 2d 3e 6e 50 61 67 65 20    p->pBt->nPage 
1a7b0 3d 20 30 3b 0a 20 20 72 63 20 3d 20 6e 65 77 44  = 0;.  rc = newD
1a7c0 61 74 61 62 61 73 65 28 70 2d 3e 70 42 74 29 3b  atabase(p->pBt);
1a7d0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
1a7e0 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
1a7f0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  n rc;.}../*.** A
1a800 74 74 65 6d 70 74 20 74 6f 20 73 74 61 72 74 20  ttempt to start 
1a810 61 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69 6f  a new transactio
1a820 6e 2e 20 41 20 77 72 69 74 65 2d 74 72 61 6e 73  n. A write-trans
1a830 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 73 74 61  action.** is sta
1a840 72 74 65 64 20 69 66 20 74 68 65 20 73 65 63 6f  rted if the seco
1a850 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e  nd argument is n
1a860 6f 6e 7a 65 72 6f 2c 20 6f 74 68 65 72 77 69 73  onzero, otherwis
1a870 65 20 61 20 72 65 61 64 2d 0a 2a 2a 20 74 72 61  e a read-.** tra
1a880 6e 73 61 63 74 69 6f 6e 2e 20 20 49 66 20 74 68  nsaction.  If th
1a890 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
1a8a0 74 20 69 73 20 32 20 6f 72 20 6d 6f 72 65 20 61  t is 2 or more a
1a8b0 6e 64 20 65 78 63 6c 75 73 69 76 65 0a 2a 2a 20  nd exclusive.** 
1a8c0 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 73  transaction is s
1a8d0 74 61 72 74 65 64 2c 20 6d 65 61 6e 69 6e 67 20  tarted, meaning 
1a8e0 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 70 72  that no other pr
1a8f0 6f 63 65 73 73 20 69 73 20 61 6c 6c 6f 77 65 64  ocess is allowed
1a900 0a 2a 2a 20 74 6f 20 61 63 63 65 73 73 20 74 68  .** to access th
1a910 65 20 64 61 74 61 62 61 73 65 2e 20 20 41 20 70  e database.  A p
1a920 72 65 65 78 69 73 74 69 6e 67 20 74 72 61 6e 73  reexisting trans
1a930 61 63 74 69 6f 6e 20 6d 61 79 20 6e 6f 74 20 62  action may not b
1a940 65 0a 2a 2a 20 75 70 67 72 61 64 65 64 20 74 6f  e.** upgraded to
1a950 20 65 78 63 6c 75 73 69 76 65 20 62 79 20 63 61   exclusive by ca
1a960 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69  lling this routi
1a970 6e 65 20 61 20 73 65 63 6f 6e 64 20 74 69 6d 65  ne a second time
1a980 20 2d 20 74 68 65 0a 2a 2a 20 65 78 63 6c 75 73   - the.** exclus
1a990 69 76 69 74 79 20 66 6c 61 67 20 6f 6e 6c 79 20  ivity flag only 
1a9a0 77 6f 72 6b 73 20 66 6f 72 20 61 20 6e 65 77 20  works for a new 
1a9b0 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a  transaction..**.
1a9c0 2a 2a 20 41 20 77 72 69 74 65 2d 74 72 61 6e 73  ** A write-trans
1a9d0 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 73  action must be s
1a9e0 74 61 72 74 65 64 20 62 65 66 6f 72 65 20 61 74  tarted before at
1a9f0 74 65 6d 70 74 69 6e 67 20 61 6e 79 20 0a 2a 2a  tempting any .**
1aa00 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20   changes to the 
1aa10 64 61 74 61 62 61 73 65 2e 20 20 4e 6f 6e 65 20  database.  None 
1aa20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
1aa30 20 72 6f 75 74 69 6e 65 73 20 0a 2a 2a 20 77 69   routines .** wi
1aa40 6c 6c 20 77 6f 72 6b 20 75 6e 6c 65 73 73 20 61  ll work unless a
1aa50 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
1aa60 73 74 61 72 74 65 64 20 66 69 72 73 74 3a 0a 2a  started first:.*
1aa70 2a 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65  *.**      sqlite
1aa80 33 42 74 72 65 65 43 72 65 61 74 65 54 61 62 6c  3BtreeCreateTabl
1aa90 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69  e().**      sqli
1aaa0 74 65 33 42 74 72 65 65 43 72 65 61 74 65 49 6e  te3BtreeCreateIn
1aab0 64 65 78 28 29 0a 2a 2a 20 20 20 20 20 20 73 71  dex().**      sq
1aac0 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61 72 54  lite3BtreeClearT
1aad0 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20 73  able().**      s
1aae0 71 6c 69 74 65 33 42 74 72 65 65 44 72 6f 70 54  qlite3BtreeDropT
1aaf0 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20 73  able().**      s
1ab00 71 6c 69 74 65 33 42 74 72 65 65 49 6e 73 65 72  qlite3BtreeInser
1ab10 74 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69  t().**      sqli
1ab20 74 65 33 42 74 72 65 65 44 65 6c 65 74 65 28 29  te3BtreeDelete()
1ab30 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33  .**      sqlite3
1ab40 42 74 72 65 65 55 70 64 61 74 65 4d 65 74 61 28  BtreeUpdateMeta(
1ab50 29 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 69 6e  ).**.** If an in
1ab60 69 74 69 61 6c 20 61 74 74 65 6d 70 74 20 74 6f  itial attempt to
1ab70 20 61 63 71 75 69 72 65 20 74 68 65 20 6c 6f 63   acquire the loc
1ab80 6b 20 66 61 69 6c 73 20 62 65 63 61 75 73 65 20  k fails because 
1ab90 6f 66 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74 69  of lock contenti
1aba0 6f 6e 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64 61  on.** and the da
1abb0 74 61 62 61 73 65 20 77 61 73 20 70 72 65 76 69  tabase was previ
1abc0 6f 75 73 6c 79 20 75 6e 6c 6f 63 6b 65 64 2c 20  ously unlocked, 
1abd0 74 68 65 6e 20 69 6e 76 6f 6b 65 20 74 68 65 20  then invoke the 
1abe0 62 75 73 79 20 68 61 6e 64 6c 65 72 0a 2a 2a 20  busy handler.** 
1abf0 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e 65 2e  if there is one.
1ac00 20 20 42 75 74 20 69 66 20 74 68 65 72 65 20 77    But if there w
1ac10 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 61 20  as previously a 
1ac20 72 65 61 64 2d 6c 6f 63 6b 2c 20 64 6f 20 6e 6f  read-lock, do no
1ac30 74 0a 2a 2a 20 69 6e 76 6f 6b 65 20 74 68 65 20  t.** invoke the 
1ac40 62 75 73 79 20 68 61 6e 64 6c 65 72 20 2d 20 6a  busy handler - j
1ac50 75 73 74 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ust return SQLIT
1ac60 45 5f 42 55 53 59 2e 20 20 53 51 4c 49 54 45 5f  E_BUSY.  SQLITE_
1ac70 42 55 53 59 20 69 73 20 0a 2a 2a 20 72 65 74 75  BUSY is .** retu
1ac80 72 6e 65 64 20 77 68 65 6e 20 74 68 65 72 65 20  rned when there 
1ac90 69 73 20 61 6c 72 65 61 64 79 20 61 20 72 65 61  is already a rea
1aca0 64 2d 6c 6f 63 6b 20 69 6e 20 6f 72 64 65 72 20  d-lock in order 
1acb0 74 6f 20 61 76 6f 69 64 20 61 20 64 65 61 64 6c  to avoid a deadl
1acc0 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 75 70 70 6f  ock..**.** Suppo
1acd0 73 65 20 74 68 65 72 65 20 61 72 65 20 74 77 6f  se there are two
1ace0 20 70 72 6f 63 65 73 73 65 73 20 41 20 61 6e 64   processes A and
1acf0 20 42 2e 20 20 41 20 68 61 73 20 61 20 72 65 61   B.  A has a rea
1ad00 64 20 6c 6f 63 6b 20 61 6e 64 20 42 20 68 61 73  d lock and B has
1ad10 0a 2a 2a 20 61 20 72 65 73 65 72 76 65 64 20 6c  .** a reserved l
1ad20 6f 63 6b 2e 20 20 42 20 74 72 69 65 73 20 74 6f  ock.  B tries to
1ad30 20 70 72 6f 6d 6f 74 65 20 74 6f 20 65 78 63 6c   promote to excl
1ad40 75 73 69 76 65 20 62 75 74 20 69 73 20 62 6c 6f  usive but is blo
1ad50 63 6b 65 64 20 62 65 63 61 75 73 65 0a 2a 2a 20  cked because.** 
1ad60 6f 66 20 41 27 73 20 72 65 61 64 20 6c 6f 63 6b  of A's read lock
1ad70 2e 20 20 41 20 74 72 69 65 73 20 74 6f 20 70 72  .  A tries to pr
1ad80 6f 6d 6f 74 65 20 74 6f 20 72 65 73 65 72 76 65  omote to reserve
1ad90 64 20 62 75 74 20 69 73 20 62 6c 6f 63 6b 65 64  d but is blocked
1ada0 20 62 79 20 42 2e 0a 2a 2a 20 4f 6e 65 20 6f 72   by B..** One or
1adb0 20 74 68 65 20 6f 74 68 65 72 20 6f 66 20 74 68   the other of th
1adc0 65 20 74 77 6f 20 70 72 6f 63 65 73 73 65 73 20  e two processes 
1add0 6d 75 73 74 20 67 69 76 65 20 77 61 79 20 6f 72  must give way or
1ade0 20 74 68 65 72 65 20 63 61 6e 20 62 65 0a 2a 2a   there can be.**
1adf0 20 6e 6f 20 70 72 6f 67 72 65 73 73 2e 20 20 42   no progress.  B
1ae00 79 20 72 65 74 75 72 6e 69 6e 67 20 53 51 4c 49  y returning SQLI
1ae10 54 45 5f 42 55 53 59 20 61 6e 64 20 6e 6f 74 20  TE_BUSY and not 
1ae20 69 6e 76 6f 6b 69 6e 67 20 74 68 65 20 62 75 73  invoking the bus
1ae30 79 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a 20 77 68  y callback.** wh
1ae40 65 6e 20 41 20 61 6c 72 65 61 64 79 20 68 61 73  en A already has
1ae50 20 61 20 72 65 61 64 20 6c 6f 63 6b 2c 20 77 65   a read lock, we
1ae60 20 65 6e 63 6f 75 72 61 67 65 20 41 20 74 6f 20   encourage A to 
1ae70 67 69 76 65 20 75 70 20 61 6e 64 20 6c 65 74 20  give up and let 
1ae80 42 0a 2a 2a 20 70 72 6f 63 65 65 64 2e 0a 2a 2f  B.** proceed..*/
1ae90 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
1aea0 65 42 65 67 69 6e 54 72 61 6e 73 28 42 74 72 65  eBeginTrans(Btre
1aeb0 65 20 2a 70 2c 20 69 6e 74 20 77 72 66 6c 61 67  e *p, int wrflag
1aec0 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
1aed0 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69  Bt = p->pBt;.  i
1aee0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
1aef0 4b 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72  K;..  sqlite3Btr
1af00 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 62 74  eeEnter(p);.  bt
1af10 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b  reeIntegrity(p);
1af20 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 62 74  ..  /* If the bt
1af30 72 65 65 20 69 73 20 61 6c 72 65 61 64 79 20 69  ree is already i
1af40 6e 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61  n a write-transa
1af50 63 74 69 6f 6e 2c 20 6f 72 20 69 74 0a 20 20 2a  ction, or it.  *
1af60 2a 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20  * is already in 
1af70 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69  a read-transacti
1af80 6f 6e 20 61 6e 64 20 61 20 72 65 61 64 2d 74 72  on and a read-tr
1af90 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 69  ansaction.  ** i
1afa0 73 20 72 65 71 75 65 73 74 65 64 2c 20 74 68 69  s requested, thi
1afb0 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20  s is a no-op..  
1afc0 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72  */.  if( p->inTr
1afd0 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans==TRANS_WRITE
1afe0 20 7c 7c 20 28 70 2d 3e 69 6e 54 72 61 6e 73 3d   || (p->inTrans=
1aff0 3d 54 52 41 4e 53 5f 52 45 41 44 20 26 26 20 21  =TRANS_READ && !
1b000 77 72 66 6c 61 67 29 20 29 7b 0a 20 20 20 20 67  wrflag) ){.    g
1b010 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b  oto trans_begun;
1b020 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
1b030 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
1b040 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 7c  n==TRANS_WRITE |
1b050 7c 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70 42  | IfNotOmitAV(pB
1b060 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65 29 3d  t->bDoTruncate)=
1b070 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 57 72 69 74  =0 );..  /* Writ
1b080 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61  e transactions a
1b090 72 65 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20  re not possible 
1b0a0 6f 6e 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64  on a read-only d
1b0b0 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 66 28  atabase */.  if(
1b0c0 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20   (pBt->btsFlags 
1b0d0 26 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 29  & BTS_READ_ONLY)
1b0e0 21 3d 30 20 26 26 20 77 72 66 6c 61 67 20 29 7b  !=0 && wrflag ){
1b0f0 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
1b100 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 67  _READONLY;.    g
1b110 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b  oto trans_begun;
1b120 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  .  }..#ifndef SQ
1b130 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
1b140 5f 43 41 43 48 45 0a 20 20 7b 0a 20 20 20 20 73  _CACHE.  {.    s
1b150 71 6c 69 74 65 33 20 2a 70 42 6c 6f 63 6b 20 3d  qlite3 *pBlock =
1b160 20 30 3b 0a 20 20 20 20 2f 2a 20 49 66 20 61 6e   0;.    /* If an
1b170 6f 74 68 65 72 20 64 61 74 61 62 61 73 65 20 68  other database h
1b180 61 6e 64 6c 65 20 68 61 73 20 61 6c 72 65 61 64  andle has alread
1b190 79 20 6f 70 65 6e 65 64 20 61 20 77 72 69 74 65  y opened a write
1b1a0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 20 20   transaction .  
1b1b0 20 20 2a 2a 20 6f 6e 20 74 68 69 73 20 73 68 61    ** on this sha
1b1c0 72 65 64 2d 62 74 72 65 65 20 73 74 72 75 63 74  red-btree struct
1b1d0 75 72 65 20 61 6e 64 20 61 20 73 65 63 6f 6e 64  ure and a second
1b1e0 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
1b1f0 6f 6e 20 69 73 0a 20 20 20 20 2a 2a 20 72 65 71  on is.    ** req
1b200 75 65 73 74 65 64 2c 20 72 65 74 75 72 6e 20 53  uested, return S
1b210 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 2e 0a 20 20  QLITE_LOCKED..  
1b220 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 77 72    */.    if( (wr
1b230 66 6c 61 67 20 26 26 20 70 42 74 2d 3e 69 6e 54  flag && pBt->inT
1b240 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e  ransaction==TRAN
1b250 53 5f 57 52 49 54 45 29 0a 20 20 20 20 20 7c 7c  S_WRITE).     ||
1b260 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20   (pBt->btsFlags 
1b270 26 20 42 54 53 5f 50 45 4e 44 49 4e 47 29 21 3d  & BTS_PENDING)!=
1b280 30 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 70  0.    ){.      p
1b290 42 6c 6f 63 6b 20 3d 20 70 42 74 2d 3e 70 57 72  Block = pBt->pWr
1b2a0 69 74 65 72 2d 3e 64 62 3b 0a 20 20 20 20 7d 65  iter->db;.    }e
1b2b0 6c 73 65 20 69 66 28 20 77 72 66 6c 61 67 3e 31  lse if( wrflag>1
1b2c0 20 29 7b 0a 20 20 20 20 20 20 42 74 4c 6f 63 6b   ){.      BtLock
1b2d0 20 2a 70 49 74 65 72 3b 0a 20 20 20 20 20 20 66   *pIter;.      f
1b2e0 6f 72 28 70 49 74 65 72 3d 70 42 74 2d 3e 70 4c  or(pIter=pBt->pL
1b2f0 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70 49 74 65  ock; pIter; pIte
1b300 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78 74 29 7b  r=pIter->pNext){
1b310 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49 74  .        if( pIt
1b320 65 72 2d 3e 70 42 74 72 65 65 21 3d 70 20 29 7b  er->pBtree!=p ){
1b330 0a 20 20 20 20 20 20 20 20 20 20 70 42 6c 6f 63  .          pBloc
1b340 6b 20 3d 20 70 49 74 65 72 2d 3e 70 42 74 72 65  k = pIter->pBtre
1b350 65 2d 3e 64 62 3b 0a 20 20 20 20 20 20 20 20 20  e->db;.         
1b360 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
1b370 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
1b380 20 20 20 20 69 66 28 20 70 42 6c 6f 63 6b 20 29      if( pBlock )
1b390 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 43  {.      sqlite3C
1b3a0 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63 6b 65 64  onnectionBlocked
1b3b0 28 70 2d 3e 64 62 2c 20 70 42 6c 6f 63 6b 29 3b  (p->db, pBlock);
1b3c0 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
1b3d0 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44  TE_LOCKED_SHARED
1b3e0 43 41 43 48 45 3b 0a 20 20 20 20 20 20 67 6f 74  CACHE;.      got
1b3f0 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20  o trans_begun;. 
1b400 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
1b410 0a 20 20 2f 2a 20 41 6e 79 20 72 65 61 64 2d 6f  .  /* Any read-o
1b420 6e 6c 79 20 6f 72 20 72 65 61 64 2d 77 72 69 74  nly or read-writ
1b430 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6d  e transaction im
1b440 70 6c 69 65 73 20 61 20 72 65 61 64 2d 6c 6f 63  plies a read-loc
1b450 6b 20 6f 6e 20 0a 20 20 2a 2a 20 70 61 67 65 20  k on .  ** page 
1b460 31 2e 20 53 6f 20 69 66 20 73 6f 6d 65 20 6f 74  1. So if some ot
1b470 68 65 72 20 73 68 61 72 65 64 2d 63 61 63 68 65  her shared-cache
1b480 20 63 6c 69 65 6e 74 20 61 6c 72 65 61 64 79 20   client already 
1b490 68 61 73 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b  has a write-lock
1b4a0 20 0a 20 20 2a 2a 20 6f 6e 20 70 61 67 65 20 31   .  ** on page 1
1b4b0 2c 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  , the transactio
1b4c0 6e 20 63 61 6e 6e 6f 74 20 62 65 20 6f 70 65 6e  n cannot be open
1b4d0 65 64 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 71 75  ed. */.  rc = qu
1b4e0 65 72 79 53 68 61 72 65 64 43 61 63 68 65 54 61  erySharedCacheTa
1b4f0 62 6c 65 4c 6f 63 6b 28 70 2c 20 4d 41 53 54 45  bleLock(p, MASTE
1b500 52 5f 52 4f 4f 54 2c 20 52 45 41 44 5f 4c 4f 43  R_ROOT, READ_LOC
1b510 4b 29 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45  K);.  if( SQLITE
1b520 5f 4f 4b 21 3d 72 63 20 29 20 67 6f 74 6f 20 74  _OK!=rc ) goto t
1b530 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 0a 20 20 70  rans_begun;..  p
1b540 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d 20  Bt->btsFlags &= 
1b550 7e 42 54 53 5f 49 4e 49 54 49 41 4c 4c 59 5f 45  ~BTS_INITIALLY_E
1b560 4d 50 54 59 3b 0a 20 20 69 66 28 20 70 42 74 2d  MPTY;.  if( pBt-
1b570 3e 6e 50 61 67 65 3d 3d 30 20 29 20 70 42 74 2d  >nPage==0 ) pBt-
1b580 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53  >btsFlags |= BTS
1b590 5f 49 4e 49 54 49 41 4c 4c 59 5f 45 4d 50 54 59  _INITIALLY_EMPTY
1b5a0 3b 0a 20 20 64 6f 20 7b 0a 20 20 20 20 2f 2a 20  ;.  do {.    /* 
1b5b0 43 61 6c 6c 20 6c 6f 63 6b 42 74 72 65 65 28 29  Call lockBtree()
1b5c0 20 75 6e 74 69 6c 20 65 69 74 68 65 72 20 70 42   until either pB
1b5d0 74 2d 3e 70 50 61 67 65 31 20 69 73 20 70 6f 70  t->pPage1 is pop
1b5e0 75 6c 61 74 65 64 20 6f 72 0a 20 20 20 20 2a 2a  ulated or.    **
1b5f0 20 6c 6f 63 6b 42 74 72 65 65 28 29 20 72 65 74   lockBtree() ret
1b600 75 72 6e 73 20 73 6f 6d 65 74 68 69 6e 67 20 6f  urns something o
1b610 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45  ther than SQLITE
1b620 5f 4f 4b 2e 20 6c 6f 63 6b 42 74 72 65 65 28 29  _OK. lockBtree()
1b630 0a 20 20 20 20 2a 2a 20 6d 61 79 20 72 65 74 75  .    ** may retu
1b640 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 62 75 74  rn SQLITE_OK but
1b650 20 6c 65 61 76 65 20 70 42 74 2d 3e 70 50 61 67   leave pBt->pPag
1b660 65 31 20 73 65 74 20 74 6f 20 30 20 69 66 20 61  e1 set to 0 if a
1b670 66 74 65 72 0a 20 20 20 20 2a 2a 20 72 65 61 64  fter.    ** read
1b680 69 6e 67 20 70 61 67 65 20 31 20 69 74 20 64 69  ing page 1 it di
1b690 73 63 6f 76 65 72 73 20 74 68 61 74 20 74 68 65  scovers that the
1b6a0 20 70 61 67 65 2d 73 69 7a 65 20 6f 66 20 74 68   page-size of th
1b6b0 65 20 64 61 74 61 62 61 73 65 20 0a 20 20 20 20  e database .    
1b6c0 2a 2a 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 70  ** file is not p
1b6d0 42 74 2d 3e 70 61 67 65 53 69 7a 65 2e 20 49 6e  Bt->pageSize. In
1b6e0 20 74 68 69 73 20 63 61 73 65 20 6c 6f 63 6b 42   this case lockB
1b6f0 74 72 65 65 28 29 20 77 69 6c 6c 20 75 70 64 61  tree() will upda
1b700 74 65 0a 20 20 20 20 2a 2a 20 70 42 74 2d 3e 70  te.    ** pBt->p
1b710 61 67 65 53 69 7a 65 20 74 6f 20 74 68 65 20 70  ageSize to the p
1b720 61 67 65 2d 73 69 7a 65 20 6f 66 20 74 68 65 20  age-size of the 
1b730 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 0a 20 20  file on disk..  
1b740 20 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65 28 20    */.    while( 
1b750 70 42 74 2d 3e 70 50 61 67 65 31 3d 3d 30 20 26  pBt->pPage1==0 &
1b760 26 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63  & SQLITE_OK==(rc
1b770 20 3d 20 6c 6f 63 6b 42 74 72 65 65 28 70 42 74   = lockBtree(pBt
1b780 29 29 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 72  )) );..    if( r
1b790 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
1b7a0 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 20 20  wrflag ){.      
1b7b0 69 66 28 20 28 70 42 74 2d 3e 62 74 73 46 6c 61  if( (pBt->btsFla
1b7c0 67 73 20 26 20 42 54 53 5f 52 45 41 44 5f 4f 4e  gs & BTS_READ_ON
1b7d0 4c 59 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  LY)!=0 ){.      
1b7e0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45    rc = SQLITE_RE
1b7f0 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 7d 65  ADONLY;.      }e
1b800 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20  lse{.        rc 
1b810 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 42 65  = sqlite3PagerBe
1b820 67 69 6e 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  gin(pBt->pPager,
1b830 77 72 66 6c 61 67 3e 31 2c 73 71 6c 69 74 65 33  wrflag>1,sqlite3
1b840 54 65 6d 70 49 6e 4d 65 6d 6f 72 79 28 70 2d 3e  TempInMemory(p->
1b850 64 62 29 29 3b 0a 20 20 20 20 20 20 20 20 69 66  db));.        if
1b860 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1b870 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
1b880 3d 20 6e 65 77 44 61 74 61 62 61 73 65 28 70 42  = newDatabase(pB
1b890 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  t);.        }.  
1b8a0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20      }.    }.  . 
1b8b0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1b8c0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 75 6e  E_OK ){.      un
1b8d0 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65  lockBtreeIfUnuse
1b8e0 64 28 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20  d(pBt);.    }.  
1b8f0 7d 77 68 69 6c 65 28 20 28 72 63 26 30 78 46 46  }while( (rc&0xFF
1b900 29 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26  )==SQLITE_BUSY &
1b910 26 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  & pBt->inTransac
1b920 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45  tion==TRANS_NONE
1b930 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 62 74   &&.          bt
1b940 72 65 65 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e  reeInvokeBusyHan
1b950 64 6c 65 72 28 70 42 74 29 20 29 3b 0a 0a 20 20  dler(pBt) );..  
1b960 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1b970 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  K ){.    if( p->
1b980 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 4e  inTrans==TRANS_N
1b990 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 70 42 74  ONE ){.      pBt
1b9a0 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2b 2b  ->nTransaction++
1b9b0 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
1b9c0 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
1b9d0 48 45 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  HE.      if( p->
1b9e0 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20  sharable ){.    
1b9f0 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6c      assert( p->l
1ba00 6f 63 6b 2e 70 42 74 72 65 65 3d 3d 70 20 26 26  ock.pBtree==p &&
1ba10 20 70 2d 3e 6c 6f 63 6b 2e 69 54 61 62 6c 65 3d   p->lock.iTable=
1ba20 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 70 2d  =1 );.        p-
1ba30 3e 6c 6f 63 6b 2e 65 4c 6f 63 6b 20 3d 20 52 45  >lock.eLock = RE
1ba40 41 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20  AD_LOCK;.       
1ba50 20 70 2d 3e 6c 6f 63 6b 2e 70 4e 65 78 74 20 3d   p->lock.pNext =
1ba60 20 70 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 20   pBt->pLock;.   
1ba70 20 20 20 20 20 70 42 74 2d 3e 70 4c 6f 63 6b 20       pBt->pLock 
1ba80 3d 20 26 70 2d 3e 6c 6f 63 6b 3b 0a 20 20 20 20  = &p->lock;.    
1ba90 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d    }.#endif.    }
1baa0 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20  .    p->inTrans 
1bab0 3d 20 28 77 72 66 6c 61 67 3f 54 52 41 4e 53 5f  = (wrflag?TRANS_
1bac0 57 52 49 54 45 3a 54 52 41 4e 53 5f 52 45 41 44  WRITE:TRANS_READ
1bad0 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 6e  );.    if( p->in
1bae0 54 72 61 6e 73 3e 70 42 74 2d 3e 69 6e 54 72 61  Trans>pBt->inTra
1baf0 6e 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20  nsaction ){.    
1bb00 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63    pBt->inTransac
1bb10 74 69 6f 6e 20 3d 20 70 2d 3e 69 6e 54 72 61 6e  tion = p->inTran
1bb20 73 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  s;.    }.    if(
1bb30 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 20   wrflag ){.     
1bb40 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31   MemPage *pPage1
1bb50 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a   = pBt->pPage1;.
1bb60 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1bb70 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
1bb80 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
1bb90 70 42 74 2d 3e 70 57 72 69 74 65 72 20 29 3b 0a  pBt->pWriter );.
1bba0 20 20 20 20 20 20 70 42 74 2d 3e 70 57 72 69 74        pBt->pWrit
1bbb0 65 72 20 3d 20 70 3b 0a 20 20 20 20 20 20 70 42  er = p;.      pB
1bbc0 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d 20 7e  t->btsFlags &= ~
1bbd0 42 54 53 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20  BTS_EXCLUSIVE;. 
1bbe0 20 20 20 20 20 69 66 28 20 77 72 66 6c 61 67 3e       if( wrflag>
1bbf0 31 20 29 20 70 42 74 2d 3e 62 74 73 46 6c 61 67  1 ) pBt->btsFlag
1bc00 73 20 7c 3d 20 42 54 53 5f 45 58 43 4c 55 53 49  s |= BTS_EXCLUSI
1bc10 56 45 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20  VE;.#endif..    
1bc20 20 20 2f 2a 20 49 66 20 74 68 65 20 64 62 2d 73    /* If the db-s
1bc30 69 7a 65 20 68 65 61 64 65 72 20 66 69 65 6c 64  ize header field
1bc40 20 69 73 20 69 6e 63 6f 72 72 65 63 74 20 28 61   is incorrect (a
1bc50 73 20 69 74 20 6d 61 79 20 62 65 20 69 66 20 61  s it may be if a
1bc60 6e 20 6f 6c 64 0a 20 20 20 20 20 20 2a 2a 20 63  n old.      ** c
1bc70 6c 69 65 6e 74 20 68 61 73 20 62 65 65 6e 20 77  lient has been w
1bc80 72 69 74 69 6e 67 20 74 68 65 20 64 61 74 61 62  riting the datab
1bc90 61 73 65 20 66 69 6c 65 29 2c 20 75 70 64 61 74  ase file), updat
1bca0 65 20 69 74 20 6e 6f 77 2e 20 44 6f 69 6e 67 0a  e it now. Doing.
1bcb0 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 73 6f        ** this so
1bcc0 6f 6e 65 72 20 72 61 74 68 65 72 20 74 68 61 6e  oner rather than
1bcd0 20 6c 61 74 65 72 20 6d 65 61 6e 73 20 74 68 65   later means the
1bce0 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 63   database size c
1bcf0 61 6e 20 73 61 66 65 6c 79 20 0a 20 20 20 20 20  an safely .     
1bd00 20 2a 2a 20 72 65 2d 72 65 61 64 20 74 68 65 20   ** re-read the 
1bd10 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 66 72  database size fr
1bd20 6f 6d 20 70 61 67 65 20 31 20 69 66 20 61 20 73  om page 1 if a s
1bd30 61 76 65 70 6f 69 6e 74 20 6f 72 20 74 72 61 6e  avepoint or tran
1bd40 73 61 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a  saction.      **
1bd50 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73   rollback occurs
1bd60 20 77 69 74 68 69 6e 20 74 68 65 20 74 72 61 6e   within the tran
1bd70 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a  saction..      *
1bd80 2f 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 2d  /.      if( pBt-
1bd90 3e 6e 50 61 67 65 21 3d 67 65 74 34 62 79 74 65  >nPage!=get4byte
1bda0 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
1bdb0 32 38 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20  28]) ){.        
1bdc0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
1bdd0 72 57 72 69 74 65 28 70 50 61 67 65 31 2d 3e 70  rWrite(pPage1->p
1bde0 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
1bdf0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1be00 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
1be10 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31  put4byte(&pPage1
1be20 2d 3e 61 44 61 74 61 5b 32 38 5d 2c 20 70 42 74  ->aData[28], pBt
1be30 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20 20 20  ->nPage);.      
1be40 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
1be50 7d 0a 20 20 7d 0a 0a 0a 74 72 61 6e 73 5f 62 65  }.  }...trans_be
1be60 67 75 6e 3a 0a 20 20 69 66 28 20 72 63 3d 3d 53  gun:.  if( rc==S
1be70 51 4c 49 54 45 5f 4f 4b 20 26 26 20 77 72 66 6c  QLITE_OK && wrfl
1be80 61 67 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69  ag ){.    /* Thi
1be90 73 20 63 61 6c 6c 20 6d 61 6b 65 73 20 73 75 72  s call makes sur
1bea0 65 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72  e that the pager
1beb0 20 68 61 73 20 74 68 65 20 63 6f 72 72 65 63 74   has the correct
1bec0 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 20 20 2a   number of.    *
1bed0 2a 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74  * open savepoint
1bee0 73 2e 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64  s. If the second
1bef0 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 67 72   parameter is gr
1bf00 65 61 74 65 72 20 74 68 61 6e 20 30 20 61 6e 64  eater than 0 and
1bf10 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 75 62 2d  .    ** the sub-
1bf20 6a 6f 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20 61  journal is not a
1bf30 6c 72 65 61 64 79 20 6f 70 65 6e 2c 20 74 68 65  lready open, the
1bf40 6e 20 69 74 20 77 69 6c 6c 20 62 65 20 6f 70 65  n it will be ope
1bf50 6e 65 64 20 68 65 72 65 2e 0a 20 20 20 20 2a 2f  ned here..    */
1bf60 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
1bf70 33 50 61 67 65 72 4f 70 65 6e 53 61 76 65 70 6f  3PagerOpenSavepo
1bf80 69 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  int(pBt->pPager,
1bf90 20 70 2d 3e 64 62 2d 3e 6e 53 61 76 65 70 6f 69   p->db->nSavepoi
1bfa0 6e 74 29 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65  nt);.  }..  btre
1bfb0 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 20  eIntegrity(p);. 
1bfc0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
1bfd0 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
1bfe0 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  rc;.}..#ifndef S
1bff0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
1c000 41 43 55 55 4d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  ACUUM../*.** Set
1c010 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70   the pointer-map
1c020 20 65 6e 74 72 69 65 73 20 66 6f 72 20 61 6c 6c   entries for all
1c030 20 63 68 69 6c 64 72 65 6e 20 6f 66 20 70 61 67   children of pag
1c040 65 20 70 50 61 67 65 2e 20 41 6c 73 6f 2c 20 69  e pPage. Also, i
1c050 66 0a 2a 2a 20 70 50 61 67 65 20 63 6f 6e 74 61  f.** pPage conta
1c060 69 6e 73 20 63 65 6c 6c 73 20 74 68 61 74 20 70  ins cells that p
1c070 6f 69 6e 74 20 74 6f 20 6f 76 65 72 66 6c 6f 77  oint to overflow
1c080 20 70 61 67 65 73 2c 20 73 65 74 20 74 68 65 20   pages, set the 
1c090 70 6f 69 6e 74 65 72 0a 2a 2a 20 6d 61 70 20 65  pointer.** map e
1c0a0 6e 74 72 69 65 73 20 66 6f 72 20 74 68 65 20 6f  ntries for the o
1c0b0 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61 73  verflow pages as
1c0c0 20 77 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63   well..*/.static
1c0d0 20 69 6e 74 20 73 65 74 43 68 69 6c 64 50 74 72   int setChildPtr
1c0e0 6d 61 70 73 28 4d 65 6d 50 61 67 65 20 2a 70 50  maps(MemPage *pP
1c0f0 61 67 65 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20  age){.  int i;  
1c100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c110 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
1c120 75 6e 74 65 72 20 76 61 72 69 61 62 6c 65 20 2a  unter variable *
1c130 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20  /.  int nCell;  
1c140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c150 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1c160 20 6f 66 20 63 65 6c 6c 73 20 69 6e 20 70 61 67   of cells in pag
1c170 65 20 70 50 61 67 65 20 2a 2f 0a 20 20 69 6e 74  e pPage */.  int
1c180 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
1c190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c1a0 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
1c1b0 2f 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  /.  BtShared *pB
1c1c0 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a  t = pPage->pBt;.
1c1d0 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 50    Pgno pgno = pP
1c1e0 61 67 65 2d 3e 70 67 6e 6f 3b 0a 0a 20 20 61 73  age->pgno;..  as
1c1f0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
1c200 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
1c210 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
1c220 20 72 63 20 3d 20 62 74 72 65 65 49 6e 69 74 50   rc = btreeInitP
1c230 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 69 66  age(pPage);.  if
1c240 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1c250 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 6e  ) return rc;.  n
1c260 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43  Cell = pPage->nC
1c270 65 6c 6c 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b  ell;..  for(i=0;
1c280 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a   i<nCell; i++){.
1c290 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20      u8 *pCell = 
1c2a0 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20  findCell(pPage, 
1c2b0 69 29 3b 0a 0a 20 20 20 20 70 74 72 6d 61 70 50  i);..    ptrmapP
1c2c0 75 74 4f 76 66 6c 50 74 72 28 70 50 61 67 65 2c  utOvflPtr(pPage,
1c2d0 20 70 43 65 6c 6c 2c 20 26 72 63 29 3b 0a 0a 20   pCell, &rc);.. 
1c2e0 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c     if( !pPage->l
1c2f0 65 61 66 20 29 7b 0a 20 20 20 20 20 20 50 67 6e  eaf ){.      Pgn
1c300 6f 20 63 68 69 6c 64 50 67 6e 6f 20 3d 20 67 65  o childPgno = ge
1c310 74 34 62 79 74 65 28 70 43 65 6c 6c 29 3b 0a 20  t4byte(pCell);. 
1c320 20 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70       ptrmapPut(p
1c330 42 74 2c 20 63 68 69 6c 64 50 67 6e 6f 2c 20 50  Bt, childPgno, P
1c340 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 67 6e  TRMAP_BTREE, pgn
1c350 6f 2c 20 26 72 63 29 3b 0a 20 20 20 20 7d 0a 20  o, &rc);.    }. 
1c360 20 7d 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65   }..  if( !pPage
1c370 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 50 67  ->leaf ){.    Pg
1c380 6e 6f 20 63 68 69 6c 64 50 67 6e 6f 20 3d 20 67  no childPgno = g
1c390 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e  et4byte(&pPage->
1c3a0 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72  aData[pPage->hdr
1c3b0 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20  Offset+8]);.    
1c3c0 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 63  ptrmapPut(pBt, c
1c3d0 68 69 6c 64 50 67 6e 6f 2c 20 50 54 52 4d 41 50  hildPgno, PTRMAP
1c3e0 5f 42 54 52 45 45 2c 20 70 67 6e 6f 2c 20 26 72  _BTREE, pgno, &r
1c3f0 63 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  c);.  }..  retur
1c400 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  n rc;.}../*.** S
1c410 6f 6d 65 77 68 65 72 65 20 6f 6e 20 70 50 61 67  omewhere on pPag
1c420 65 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  e is a pointer t
1c430 6f 20 70 61 67 65 20 69 46 72 6f 6d 2e 20 20 4d  o page iFrom.  M
1c440 6f 64 69 66 79 20 74 68 69 73 20 70 6f 69 6e 74  odify this point
1c450 65 72 20 73 6f 0a 2a 2a 20 74 68 61 74 20 69 74  er so.** that it
1c460 20 70 6f 69 6e 74 73 20 74 6f 20 69 54 6f 2e 20   points to iTo. 
1c470 50 61 72 61 6d 65 74 65 72 20 65 54 79 70 65 20  Parameter eType 
1c480 64 65 73 63 72 69 62 65 73 20 74 68 65 20 74 79  describes the ty
1c490 70 65 20 6f 66 20 70 6f 69 6e 74 65 72 20 74 6f  pe of pointer to
1c4a0 0a 2a 2a 20 62 65 20 6d 6f 64 69 66 69 65 64 2c  .** be modified,
1c4b0 20 61 73 20 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a   as  follows:.**
1c4c0 0a 2a 2a 20 50 54 52 4d 41 50 5f 42 54 52 45 45  .** PTRMAP_BTREE
1c4d0 3a 20 20 20 20 20 70 50 61 67 65 20 69 73 20 61  :     pPage is a
1c4e0 20 62 74 72 65 65 2d 70 61 67 65 2e 20 54 68 65   btree-page. The
1c4f0 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20   pointer points 
1c500 61 74 20 61 20 63 68 69 6c 64 20 0a 2a 2a 20 20  at a child .**  
1c510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c520 20 70 61 67 65 20 6f 66 20 70 50 61 67 65 2e 0a   page of pPage..
1c530 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f 56 45  **.** PTRMAP_OVE
1c540 52 46 4c 4f 57 31 3a 20 70 50 61 67 65 20 69 73  RFLOW1: pPage is
1c550 20 61 20 62 74 72 65 65 2d 70 61 67 65 2e 20 54   a btree-page. T
1c560 68 65 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74  he pointer point
1c570 73 20 61 74 20 61 6e 20 6f 76 65 72 66 6c 6f 77  s at an overflow
1c580 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1c590 20 20 20 20 20 20 70 61 67 65 20 70 6f 69 6e 74        page point
1c5a0 65 64 20 74 6f 20 62 79 20 6f 6e 65 20 6f 66 20  ed to by one of 
1c5b0 74 68 65 20 63 65 6c 6c 73 20 6f 6e 20 70 50 61  the cells on pPa
1c5c0 67 65 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50  ge..**.** PTRMAP
1c5d0 5f 4f 56 45 52 46 4c 4f 57 32 3a 20 70 50 61 67  _OVERFLOW2: pPag
1c5e0 65 20 69 73 20 61 6e 20 6f 76 65 72 66 6c 6f 77  e is an overflow
1c5f0 2d 70 61 67 65 2e 20 54 68 65 20 70 6f 69 6e 74  -page. The point
1c600 65 72 20 70 6f 69 6e 74 73 20 61 74 20 74 68 65  er points at the
1c610 20 6e 65 78 74 0a 2a 2a 20 20 20 20 20 20 20 20   next.**        
1c620 20 20 20 20 20 20 20 20 20 20 20 6f 76 65 72 66             overf
1c630 6c 6f 77 20 70 61 67 65 20 69 6e 20 74 68 65 20  low page in the 
1c640 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  list..*/.static 
1c650 69 6e 74 20 6d 6f 64 69 66 79 50 61 67 65 50 6f  int modifyPagePo
1c660 69 6e 74 65 72 28 4d 65 6d 50 61 67 65 20 2a 70  inter(MemPage *p
1c670 50 61 67 65 2c 20 50 67 6e 6f 20 69 46 72 6f 6d  Page, Pgno iFrom
1c680 2c 20 50 67 6e 6f 20 69 54 6f 2c 20 75 38 20 65  , Pgno iTo, u8 e
1c690 54 79 70 65 29 7b 0a 20 20 61 73 73 65 72 74 28  Type){.  assert(
1c6a0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
1c6b0 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
1c6c0 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
1c6d0 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
1c6e0 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
1c6f0 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
1c700 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d   if( eType==PTRM
1c710 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20 29 7b 0a  AP_OVERFLOW2 ){.
1c720 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74      /* The point
1c730 65 72 20 69 73 20 61 6c 77 61 79 73 20 74 68 65  er is always the
1c740 20 66 69 72 73 74 20 34 20 62 79 74 65 73 20 6f   first 4 bytes o
1c750 66 20 74 68 65 20 70 61 67 65 20 69 6e 20 74 68  f the page in th
1c760 69 73 20 63 61 73 65 2e 20 20 2a 2f 0a 20 20 20  is case.  */.   
1c770 20 69 66 28 20 67 65 74 34 62 79 74 65 28 70 50   if( get4byte(pP
1c780 61 67 65 2d 3e 61 44 61 74 61 29 21 3d 69 46 72  age->aData)!=iFr
1c790 6f 6d 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  om ){.      retu
1c7a0 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
1c7b0 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20  T_BKPT;.    }.  
1c7c0 20 20 70 75 74 34 62 79 74 65 28 70 50 61 67 65    put4byte(pPage
1c7d0 2d 3e 61 44 61 74 61 2c 20 69 54 6f 29 3b 0a 20  ->aData, iTo);. 
1c7e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
1c7f0 69 3b 0a 20 20 20 20 69 6e 74 20 6e 43 65 6c 6c  i;.    int nCell
1c800 3b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 0a 20  ;.    int rc;.. 
1c810 20 20 20 72 63 20 3d 20 62 74 72 65 65 49 6e 69     rc = btreeIni
1c820 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  tPage(pPage);.  
1c830 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
1c840 6e 20 72 63 3b 0a 20 20 20 20 6e 43 65 6c 6c 20  n rc;.    nCell 
1c850 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a  = pPage->nCell;.
1c860 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
1c870 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  nCell; i++){.   
1c880 20 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20 66     u8 *pCell = f
1c890 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69  indCell(pPage, i
1c8a0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 65 54 79  );.      if( eTy
1c8b0 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46  pe==PTRMAP_OVERF
1c8c0 4c 4f 57 31 20 29 7b 0a 20 20 20 20 20 20 20 20  LOW1 ){.        
1c8d0 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20  CellInfo info;. 
1c8e0 20 20 20 20 20 20 20 70 50 61 67 65 2d 3e 78 50         pPage->xP
1c8f0 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20  arseCell(pPage, 
1c900 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20  pCell, &info);. 
1c910 20 20 20 20 20 20 20 69 66 28 20 69 6e 66 6f 2e         if( info.
1c920 6e 4c 6f 63 61 6c 3c 69 6e 66 6f 2e 6e 50 61 79  nLocal<info.nPay
1c930 6c 6f 61 64 20 29 7b 0a 20 20 20 20 20 20 20 20  load ){.        
1c940 20 20 69 66 28 20 70 43 65 6c 6c 2b 69 6e 66 6f    if( pCell+info
1c950 2e 6e 53 69 7a 65 20 3e 20 70 50 61 67 65 2d 3e  .nSize > pPage->
1c960 61 44 61 74 61 2b 70 50 61 67 65 2d 3e 70 42 74  aData+pPage->pBt
1c970 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a  ->usableSize ){.
1c980 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
1c990 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
1c9a0 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20  T_BKPT;.        
1c9b0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66    }.          if
1c9c0 28 20 69 46 72 6f 6d 3d 3d 67 65 74 34 62 79 74  ( iFrom==get4byt
1c9d0 65 28 70 43 65 6c 6c 2b 69 6e 66 6f 2e 6e 53 69  e(pCell+info.nSi
1c9e0 7a 65 2d 34 29 20 29 7b 0a 20 20 20 20 20 20 20  ze-4) ){.       
1c9f0 20 20 20 20 20 70 75 74 34 62 79 74 65 28 70 43       put4byte(pC
1ca00 65 6c 6c 2b 69 6e 66 6f 2e 6e 53 69 7a 65 2d 34  ell+info.nSize-4
1ca10 2c 20 69 54 6f 29 3b 0a 20 20 20 20 20 20 20 20  , iTo);.        
1ca20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
1ca30 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
1ca40 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1ca50 20 20 20 20 20 20 69 66 28 20 67 65 74 34 62 79        if( get4by
1ca60 74 65 28 70 43 65 6c 6c 29 3d 3d 69 46 72 6f 6d  te(pCell)==iFrom
1ca70 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 75   ){.          pu
1ca80 74 34 62 79 74 65 28 70 43 65 6c 6c 2c 20 69 54  t4byte(pCell, iT
1ca90 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  o);.          br
1caa0 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
1cab0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a       }.    }.  .
1cac0 20 20 20 20 69 66 28 20 69 3d 3d 6e 43 65 6c 6c      if( i==nCell
1cad0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 65 54   ){.      if( eT
1cae0 79 70 65 21 3d 50 54 52 4d 41 50 5f 42 54 52 45  ype!=PTRMAP_BTRE
1caf0 45 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20  E || .          
1cb00 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d  get4byte(&pPage-
1cb10 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64  >aData[pPage->hd
1cb20 72 4f 66 66 73 65 74 2b 38 5d 29 21 3d 69 46 72  rOffset+8])!=iFr
1cb30 6f 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  om ){.        re
1cb40 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
1cb50 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
1cb60 7d 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65  }.      put4byte
1cb70 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  (&pPage->aData[p
1cb80 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
1cb90 38 5d 2c 20 69 54 6f 29 3b 0a 20 20 20 20 7d 0a  8], iTo);.    }.
1cba0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
1cbb0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  ITE_OK;.}.../*.*
1cbc0 2a 20 4d 6f 76 65 20 74 68 65 20 6f 70 65 6e 20  * Move the open 
1cbd0 64 61 74 61 62 61 73 65 20 70 61 67 65 20 70 44  database page pD
1cbe0 62 50 61 67 65 20 74 6f 20 6c 6f 63 61 74 69 6f  bPage to locatio
1cbf0 6e 20 69 46 72 65 65 50 61 67 65 20 69 6e 20 74  n iFreePage in t
1cc00 68 65 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 2e  he .** database.
1cc10 20 54 68 65 20 70 44 62 50 61 67 65 20 72 65 66   The pDbPage ref
1cc20 65 72 65 6e 63 65 20 72 65 6d 61 69 6e 73 20 76  erence remains v
1cc30 61 6c 69 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  alid..**.** The 
1cc40 69 73 43 6f 6d 6d 69 74 20 66 6c 61 67 20 69 6e  isCommit flag in
1cc50 64 69 63 61 74 65 73 20 74 68 61 74 20 74 68 65  dicates that the
1cc60 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f  re is no need to
1cc70 20 72 65 6d 65 6d 62 65 72 20 74 68 61 74 0a 2a   remember that.*
1cc80 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6e 65  * the journal ne
1cc90 65 64 73 20 74 6f 20 62 65 20 73 79 6e 63 28 29  eds to be sync()
1cca0 65 64 20 62 65 66 6f 72 65 20 64 61 74 61 62 61  ed before databa
1ccb0 73 65 20 70 61 67 65 20 70 44 62 50 61 67 65 2d  se page pDbPage-
1ccc0 3e 70 67 6e 6f 20 0a 2a 2a 20 63 61 6e 20 62 65  >pgno .** can be
1ccd0 20 77 72 69 74 74 65 6e 20 74 6f 2e 20 54 68 65   written to. The
1cce0 20 63 61 6c 6c 65 72 20 68 61 73 20 61 6c 72 65   caller has alre
1ccf0 61 64 79 20 70 72 6f 6d 69 73 65 64 20 6e 6f 74  ady promised not
1cd00 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68 61   to write to tha
1cd10 74 0a 2a 2a 20 70 61 67 65 2e 0a 2a 2f 0a 73 74  t.** page..*/.st
1cd20 61 74 69 63 20 69 6e 74 20 72 65 6c 6f 63 61 74  atic int relocat
1cd30 65 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65  ePage(.  BtShare
1cd40 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20  d *pBt,         
1cd50 20 20 2f 2a 20 42 74 72 65 65 20 2a 2f 0a 20 20    /* Btree */.  
1cd60 4d 65 6d 50 61 67 65 20 2a 70 44 62 50 61 67 65  MemPage *pDbPage
1cd70 2c 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e  ,        /* Open
1cd80 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20 2a 2f   page to move */
1cd90 0a 20 20 75 38 20 65 54 79 70 65 2c 20 20 20 20  .  u8 eType,    
1cda0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
1cdb0 6f 69 6e 74 65 72 20 6d 61 70 20 27 74 79 70 65  ointer map 'type
1cdc0 27 20 65 6e 74 72 79 20 66 6f 72 20 70 44 62 50  ' entry for pDbP
1cdd0 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 50  age */.  Pgno iP
1cde0 74 72 50 61 67 65 2c 20 20 20 20 20 20 20 20 20  trPage,         
1cdf0 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70    /* Pointer map
1ce00 20 27 70 61 67 65 2d 6e 6f 27 20 65 6e 74 72 79   'page-no' entry
1ce10 20 66 6f 72 20 70 44 62 50 61 67 65 20 2a 2f 0a   for pDbPage */.
1ce20 20 20 50 67 6e 6f 20 69 46 72 65 65 50 61 67 65    Pgno iFreePage
1ce30 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ,          /* Th
1ce40 65 20 6c 6f 63 61 74 69 6f 6e 20 74 6f 20 6d 6f  e location to mo
1ce50 76 65 20 70 44 62 50 61 67 65 20 74 6f 20 2a 2f  ve pDbPage to */
1ce60 0a 20 20 69 6e 74 20 69 73 43 6f 6d 6d 69 74 20  .  int isCommit 
1ce70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69              /* i
1ce80 73 43 6f 6d 6d 69 74 20 66 6c 61 67 20 70 61 73  sCommit flag pas
1ce90 73 65 64 20 74 6f 20 73 71 6c 69 74 65 33 50 61  sed to sqlite3Pa
1cea0 67 65 72 4d 6f 76 65 70 61 67 65 20 2a 2f 0a 29  gerMovepage */.)
1ceb0 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 74  {.  MemPage *pPt
1cec0 72 50 61 67 65 3b 20 20 20 2f 2a 20 54 68 65 20  rPage;   /* The 
1ced0 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69  page that contai
1cee0 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ns a pointer to 
1cef0 70 44 62 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e  pDbPage */.  Pgn
1cf00 6f 20 69 44 62 50 61 67 65 20 3d 20 70 44 62 50  o iDbPage = pDbP
1cf10 61 67 65 2d 3e 70 67 6e 6f 3b 0a 20 20 50 61 67  age->pgno;.  Pag
1cf20 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 42 74  er *pPager = pBt
1cf30 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20  ->pPager;.  int 
1cf40 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 65  rc;..  assert( e
1cf50 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45  Type==PTRMAP_OVE
1cf60 52 46 4c 4f 57 32 20 7c 7c 20 65 54 79 70 65 3d  RFLOW2 || eType=
1cf70 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57  =PTRMAP_OVERFLOW
1cf80 31 20 7c 7c 20 0a 20 20 20 20 20 20 65 54 79 70  1 || .      eTyp
1cf90 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20  e==PTRMAP_BTREE 
1cfa0 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  || eType==PTRMAP
1cfb0 5f 52 4f 4f 54 50 41 47 45 20 29 3b 0a 20 20 61  _ROOTPAGE );.  a
1cfc0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
1cfd0 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
1cfe0 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
1cff0 74 28 20 70 44 62 50 61 67 65 2d 3e 70 42 74 3d  t( pDbPage->pBt=
1d000 3d 70 42 74 20 29 3b 0a 0a 20 20 2f 2a 20 4d 6f  =pBt );..  /* Mo
1d010 76 65 20 70 61 67 65 20 69 44 62 50 61 67 65 20  ve page iDbPage 
1d020 66 72 6f 6d 20 69 74 73 20 63 75 72 72 65 6e 74  from its current
1d030 20 6c 6f 63 61 74 69 6f 6e 20 74 6f 20 70 61 67   location to pag
1d040 65 20 6e 75 6d 62 65 72 20 69 46 72 65 65 50 61  e number iFreePa
1d050 67 65 20 2a 2f 0a 20 20 54 52 41 43 45 28 28 22  ge */.  TRACE(("
1d060 41 55 54 4f 56 41 43 55 55 4d 3a 20 4d 6f 76 69  AUTOVACUUM: Movi
1d070 6e 67 20 25 64 20 74 6f 20 66 72 65 65 20 70 61  ng %d to free pa
1d080 67 65 20 25 64 20 28 70 74 72 20 70 61 67 65 20  ge %d (ptr page 
1d090 25 64 20 74 79 70 65 20 25 64 29 5c 6e 22 2c 20  %d type %d)\n", 
1d0a0 0a 20 20 20 20 20 20 69 44 62 50 61 67 65 2c 20  .      iDbPage, 
1d0b0 69 46 72 65 65 50 61 67 65 2c 20 69 50 74 72 50  iFreePage, iPtrP
1d0c0 61 67 65 2c 20 65 54 79 70 65 29 29 3b 0a 20 20  age, eType));.  
1d0d0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
1d0e0 72 4d 6f 76 65 70 61 67 65 28 70 50 61 67 65 72  rMovepage(pPager
1d0f0 2c 20 70 44 62 50 61 67 65 2d 3e 70 44 62 50 61  , pDbPage->pDbPa
1d100 67 65 2c 20 69 46 72 65 65 50 61 67 65 2c 20 69  ge, iFreePage, i
1d110 73 43 6f 6d 6d 69 74 29 3b 0a 20 20 69 66 28 20  sCommit);.  if( 
1d120 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1d130 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
1d140 20 20 7d 0a 20 20 70 44 62 50 61 67 65 2d 3e 70    }.  pDbPage->p
1d150 67 6e 6f 20 3d 20 69 46 72 65 65 50 61 67 65 3b  gno = iFreePage;
1d160 0a 0a 20 20 2f 2a 20 49 66 20 70 44 62 50 61 67  ..  /* If pDbPag
1d170 65 20 77 61 73 20 61 20 62 74 72 65 65 2d 70 61  e was a btree-pa
1d180 67 65 2c 20 74 68 65 6e 20 69 74 20 6d 61 79 20  ge, then it may 
1d190 68 61 76 65 20 63 68 69 6c 64 20 70 61 67 65 73  have child pages
1d1a0 20 61 6e 64 2f 6f 72 20 63 65 6c 6c 73 0a 20 20   and/or cells.  
1d1b0 2a 2a 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f  ** that point to
1d1c0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e   overflow pages.
1d1d0 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   The pointer map
1d1e0 20 65 6e 74 72 69 65 73 20 66 6f 72 20 61 6c 6c   entries for all
1d1f0 20 74 68 65 73 65 0a 20 20 2a 2a 20 70 61 67 65   these.  ** page
1d200 73 20 6e 65 65 64 20 74 6f 20 62 65 20 63 68 61  s need to be cha
1d210 6e 67 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  nged..  **.  ** 
1d220 49 66 20 70 44 62 50 61 67 65 20 69 73 20 61 6e  If pDbPage is an
1d230 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20   overflow page, 
1d240 74 68 65 6e 20 74 68 65 20 66 69 72 73 74 20 34  then the first 4
1d250 20 62 79 74 65 73 20 6d 61 79 20 73 74 6f 72 65   bytes may store
1d260 20 61 0a 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20   a.  ** pointer 
1d270 74 6f 20 61 20 73 75 62 73 65 71 75 65 6e 74 20  to a subsequent 
1d280 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20 49  overflow page. I
1d290 66 20 74 68 69 73 20 69 73 20 74 68 65 20 63 61  f this is the ca
1d2a0 73 65 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 74 68  se, then.  ** th
1d2b0 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 6e 65  e pointer map ne
1d2c0 65 64 73 20 74 6f 20 62 65 20 75 70 64 61 74 65  eds to be update
1d2d0 64 20 66 6f 72 20 74 68 65 20 73 75 62 73 65 71  d for the subseq
1d2e0 75 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70 61  uent overflow pa
1d2f0 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65  ge..  */.  if( e
1d300 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52  Type==PTRMAP_BTR
1d310 45 45 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52  EE || eType==PTR
1d320 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a  MAP_ROOTPAGE ){.
1d330 20 20 20 20 72 63 20 3d 20 73 65 74 43 68 69 6c      rc = setChil
1d340 64 50 74 72 6d 61 70 73 28 70 44 62 50 61 67 65  dPtrmaps(pDbPage
1d350 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
1d360 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1d370 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
1d380 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
1d390 50 67 6e 6f 20 6e 65 78 74 4f 76 66 6c 20 3d 20  Pgno nextOvfl = 
1d3a0 67 65 74 34 62 79 74 65 28 70 44 62 50 61 67 65  get4byte(pDbPage
1d3b0 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 69 66  ->aData);.    if
1d3c0 28 20 6e 65 78 74 4f 76 66 6c 21 3d 30 20 29 7b  ( nextOvfl!=0 ){
1d3d0 0a 20 20 20 20 20 20 70 74 72 6d 61 70 50 75 74  .      ptrmapPut
1d3e0 28 70 42 74 2c 20 6e 65 78 74 4f 76 66 6c 2c 20  (pBt, nextOvfl, 
1d3f0 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32  PTRMAP_OVERFLOW2
1d400 2c 20 69 46 72 65 65 50 61 67 65 2c 20 26 72 63  , iFreePage, &rc
1d410 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
1d420 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1d430 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1d440 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1d450 20 7d 0a 0a 20 20 2f 2a 20 46 69 78 20 74 68 65   }..  /* Fix the
1d460 20 64 61 74 61 62 61 73 65 20 70 6f 69 6e 74 65   database pointe
1d470 72 20 6f 6e 20 70 61 67 65 20 69 50 74 72 50 61  r on page iPtrPa
1d480 67 65 20 74 68 61 74 20 70 6f 69 6e 74 65 64 20  ge that pointed 
1d490 61 74 20 69 44 62 50 61 67 65 20 73 6f 0a 20 20  at iDbPage so.  
1d4a0 2a 2a 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74  ** that it point
1d4b0 73 20 61 74 20 69 46 72 65 65 50 61 67 65 2e 20  s at iFreePage. 
1d4c0 41 6c 73 6f 20 66 69 78 20 74 68 65 20 70 6f 69  Also fix the poi
1d4d0 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 79 20 66  nter map entry f
1d4e0 6f 72 0a 20 20 2a 2a 20 69 50 74 72 50 61 67 65  or.  ** iPtrPage
1d4f0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 54 79  ..  */.  if( eTy
1d500 70 65 21 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50  pe!=PTRMAP_ROOTP
1d510 41 47 45 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  AGE ){.    rc = 
1d520 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  btreeGetPage(pBt
1d530 2c 20 69 50 74 72 50 61 67 65 2c 20 26 70 50 74  , iPtrPage, &pPt
1d540 72 50 61 67 65 2c 20 30 29 3b 0a 20 20 20 20 69  rPage, 0);.    i
1d550 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1d560 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
1d570 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72   rc;.    }.    r
1d580 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
1d590 57 72 69 74 65 28 70 50 74 72 50 61 67 65 2d 3e  Write(pPtrPage->
1d5a0 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66  pDbPage);.    if
1d5b0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1d5c0 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  ){.      release
1d5d0 50 61 67 65 28 70 50 74 72 50 61 67 65 29 3b 0a  Page(pPtrPage);.
1d5e0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1d5f0 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
1d600 6d 6f 64 69 66 79 50 61 67 65 50 6f 69 6e 74 65  modifyPagePointe
1d610 72 28 70 50 74 72 50 61 67 65 2c 20 69 44 62 50  r(pPtrPage, iDbP
1d620 61 67 65 2c 20 69 46 72 65 65 50 61 67 65 2c 20  age, iFreePage, 
1d630 65 54 79 70 65 29 3b 0a 20 20 20 20 72 65 6c 65  eType);.    rele
1d640 61 73 65 50 61 67 65 28 70 50 74 72 50 61 67 65  asePage(pPtrPage
1d650 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
1d660 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1d670 20 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c    ptrmapPut(pBt,
1d680 20 69 46 72 65 65 50 61 67 65 2c 20 65 54 79 70   iFreePage, eTyp
1d690 65 2c 20 69 50 74 72 50 61 67 65 2c 20 26 72 63  e, iPtrPage, &rc
1d6a0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
1d6b0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20  eturn rc;.}../* 
1d6c0 46 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61 74  Forward declarat
1d6d0 69 6f 6e 20 72 65 71 75 69 72 65 64 20 62 79 20  ion required by 
1d6e0 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28 29  incrVacuumStep()
1d6f0 2e 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  . */.static int 
1d700 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67  allocateBtreePag
1d710 65 28 42 74 53 68 61 72 65 64 20 2a 2c 20 4d 65  e(BtShared *, Me
1d720 6d 50 61 67 65 20 2a 2a 2c 20 50 67 6e 6f 20 2a  mPage **, Pgno *
1d730 2c 20 50 67 6e 6f 2c 20 75 38 29 3b 0a 0a 2f 2a  , Pgno, u8);../*
1d740 0a 2a 2a 20 50 65 72 66 6f 72 6d 20 61 20 73 69  .** Perform a si
1d750 6e 67 6c 65 20 73 74 65 70 20 6f 66 20 61 6e 20  ngle step of an 
1d760 69 6e 63 72 65 6d 65 6e 74 61 6c 2d 76 61 63 75  incremental-vacu
1d770 75 6d 2e 20 49 66 20 73 75 63 63 65 73 73 66 75  um. If successfu
1d780 6c 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 53 51 4c  l, return.** SQL
1d790 49 54 45 5f 4f 4b 2e 20 49 66 20 74 68 65 72 65  ITE_OK. If there
1d7a0 20 69 73 20 6e 6f 20 77 6f 72 6b 20 74 6f 20 64   is no work to d
1d7b0 6f 20 28 61 6e 64 20 74 68 65 72 65 66 6f 72 65  o (and therefore
1d7c0 20 6e 6f 20 70 6f 69 6e 74 20 69 6e 20 0a 2a 2a   no point in .**
1d7d0 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 66 75   calling this fu
1d7e0 6e 63 74 69 6f 6e 20 61 67 61 69 6e 29 2c 20 72  nction again), r
1d7f0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e  eturn SQLITE_DON
1d800 45 2e 20 4f 72 2c 20 69 66 20 61 6e 20 65 72 72  E. Or, if an err
1d810 6f 72 20 0a 2a 2a 20 6f 63 63 75 72 73 2c 20 72  or .** occurs, r
1d820 65 74 75 72 6e 20 73 6f 6d 65 20 6f 74 68 65 72  eturn some other
1d830 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 0a   error code..**.
1d840 2a 2a 20 4d 6f 72 65 20 73 70 65 63 69 66 69 63  ** More specific
1d850 61 6c 6c 79 2c 20 74 68 69 73 20 66 75 6e 63 74  ally, this funct
1d860 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74 6f 20  ion attempts to 
1d870 72 65 2d 6f 72 67 61 6e 69 7a 65 20 74 68 65 20  re-organize the 
1d880 64 61 74 61 62 61 73 65 20 73 6f 20 0a 2a 2a 20  database so .** 
1d890 74 68 61 74 20 74 68 65 20 6c 61 73 74 20 70 61  that the last pa
1d8a0 67 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 63  ge of the file c
1d8b0 75 72 72 65 6e 74 6c 79 20 69 6e 20 75 73 65 20  urrently in use 
1d8c0 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 69 6e 20  is no longer in 
1d8d0 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d  use..**.** Param
1d8e0 65 74 65 72 20 6e 46 69 6e 20 69 73 20 74 68 65  eter nFin is the
1d8f0 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
1d900 20 74 68 61 74 20 74 68 69 73 20 64 61 74 61 62   that this datab
1d910 61 73 65 20 77 6f 75 6c 64 20 63 6f 6e 74 61 69  ase would contai
1d920 6e 0a 2a 2a 20 77 65 72 65 20 74 68 69 73 20 66  n.** were this f
1d930 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64 20 75  unction called u
1d940 6e 74 69 6c 20 69 74 20 72 65 74 75 72 6e 73 20  ntil it returns 
1d950 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a 2a 2a 0a  SQLITE_DONE..**.
1d960 2a 2a 20 49 66 20 74 68 65 20 62 43 6f 6d 6d 69  ** If the bCommi
1d970 74 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e  t parameter is n
1d980 6f 6e 2d 7a 65 72 6f 2c 20 74 68 69 73 20 66 75  on-zero, this fu
1d990 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65 73 20 74  nction assumes t
1d9a0 68 61 74 20 74 68 65 20 0a 2a 2a 20 63 61 6c 6c  hat the .** call
1d9b0 65 72 20 77 69 6c 6c 20 6b 65 65 70 20 63 61 6c  er will keep cal
1d9c0 6c 69 6e 67 20 69 6e 63 72 56 61 63 75 75 6d 53  ling incrVacuumS
1d9d0 74 65 70 28 29 20 75 6e 74 69 6c 20 69 74 20 72  tep() until it r
1d9e0 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 44 4f  eturns SQLITE_DO
1d9f0 4e 45 20 0a 2a 2a 20 6f 72 20 61 6e 20 65 72 72  NE .** or an err
1da00 6f 72 2e 20 62 43 6f 6d 6d 69 74 20 69 73 20 70  or. bCommit is p
1da10 61 73 73 65 64 20 74 72 75 65 20 66 6f 72 20 61  assed true for a
1da20 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 2d 6f 6e  n auto-vacuum-on
1da30 2d 63 6f 6d 6d 69 74 20 0a 2a 2a 20 6f 70 65 72  -commit .** oper
1da40 61 74 69 6f 6e 2c 20 6f 72 20 66 61 6c 73 65 20  ation, or false 
1da50 66 6f 72 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74  for an increment
1da60 61 6c 20 76 61 63 75 75 6d 2e 0a 2a 2f 0a 73 74  al vacuum..*/.st
1da70 61 74 69 63 20 69 6e 74 20 69 6e 63 72 56 61 63  atic int incrVac
1da80 75 75 6d 53 74 65 70 28 42 74 53 68 61 72 65 64  uumStep(BtShared
1da90 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6e 46 69 6e   *pBt, Pgno nFin
1daa0 2c 20 50 67 6e 6f 20 69 4c 61 73 74 50 67 2c 20  , Pgno iLastPg, 
1dab0 69 6e 74 20 62 43 6f 6d 6d 69 74 29 7b 0a 20 20  int bCommit){.  
1dac0 50 67 6e 6f 20 6e 46 72 65 65 4c 69 73 74 3b 20  Pgno nFreeList; 
1dad0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
1dae0 62 65 72 20 6f 66 20 70 61 67 65 73 20 73 74 69  ber of pages sti
1daf0 6c 6c 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c  ll on the free-l
1db00 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  ist */.  int rc;
1db10 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
1db20 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
1db30 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
1db40 61 73 73 65 72 74 28 20 69 4c 61 73 74 50 67 3e  assert( iLastPg>
1db50 6e 46 69 6e 20 29 3b 0a 0a 20 20 69 66 28 20 21  nFin );..  if( !
1db60 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42  PTRMAP_ISPAGE(pB
1db70 74 2c 20 69 4c 61 73 74 50 67 29 20 26 26 20 69  t, iLastPg) && i
1db80 4c 61 73 74 50 67 21 3d 50 45 4e 44 49 4e 47 5f  LastPg!=PENDING_
1db90 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
1dba0 7b 0a 20 20 20 20 75 38 20 65 54 79 70 65 3b 0a  {.    u8 eType;.
1dbb0 20 20 20 20 50 67 6e 6f 20 69 50 74 72 50 61 67      Pgno iPtrPag
1dbc0 65 3b 0a 0a 20 20 20 20 6e 46 72 65 65 4c 69 73  e;..    nFreeLis
1dbd0 74 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 42  t = get4byte(&pB
1dbe0 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61  t->pPage1->aData
1dbf0 5b 33 36 5d 29 3b 0a 20 20 20 20 69 66 28 20 6e  [36]);.    if( n
1dc00 46 72 65 65 4c 69 73 74 3d 3d 30 20 29 7b 0a 20  FreeList==0 ){. 
1dc10 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
1dc20 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 0a  TE_DONE;.    }..
1dc30 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47      rc = ptrmapG
1dc40 65 74 28 70 42 74 2c 20 69 4c 61 73 74 50 67 2c  et(pBt, iLastPg,
1dc50 20 26 65 54 79 70 65 2c 20 26 69 50 74 72 50 61   &eType, &iPtrPa
1dc60 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  ge);.    if( rc!
1dc70 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1dc80 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1dc90 20 20 20 7d 0a 20 20 20 20 69 66 28 20 65 54 79     }.    if( eTy
1dca0 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50  pe==PTRMAP_ROOTP
1dcb0 41 47 45 20 29 7b 0a 20 20 20 20 20 20 72 65 74  AGE ){.      ret
1dcc0 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
1dcd0 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a  PT_BKPT;.    }..
1dce0 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50      if( eType==P
1dcf0 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45 20 29  TRMAP_FREEPAGE )
1dd00 7b 0a 20 20 20 20 20 20 69 66 28 20 62 43 6f 6d  {.      if( bCom
1dd10 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  mit==0 ){.      
1dd20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20    /* Remove the 
1dd30 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 66 69  page from the fi
1dd40 6c 65 73 20 66 72 65 65 2d 6c 69 73 74 2e 20 54  les free-list. T
1dd50 68 69 73 20 69 73 20 6e 6f 74 20 72 65 71 75 69  his is not requi
1dd60 72 65 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  red.        ** i
1dd70 66 20 62 43 6f 6d 6d 69 74 20 69 73 20 6e 6f 6e  f bCommit is non
1dd80 2d 7a 65 72 6f 2e 20 49 6e 20 74 68 61 74 20 63  -zero. In that c
1dd90 61 73 65 2c 20 74 68 65 20 66 72 65 65 2d 6c 69  ase, the free-li
1dda0 73 74 20 77 69 6c 6c 20 62 65 0a 20 20 20 20 20  st will be.     
1ddb0 20 20 20 2a 2a 20 74 72 75 6e 63 61 74 65 64 20     ** truncated 
1ddc0 74 6f 20 7a 65 72 6f 20 61 66 74 65 72 20 74 68  to zero after th
1ddd0 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
1dde0 72 6e 73 2c 20 73 6f 20 69 74 20 64 6f 65 73 6e  rns, so it doesn
1ddf0 27 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d  't .        ** m
1de00 61 74 74 65 72 20 69 66 20 69 74 20 73 74 69 6c  atter if it stil
1de10 6c 20 63 6f 6e 74 61 69 6e 73 20 73 6f 6d 65 20  l contains some 
1de20 67 61 72 62 61 67 65 20 65 6e 74 72 69 65 73 2e  garbage entries.
1de30 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
1de40 20 20 20 20 50 67 6e 6f 20 69 46 72 65 65 50 67      Pgno iFreePg
1de50 3b 0a 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67  ;.        MemPag
1de60 65 20 2a 70 46 72 65 65 50 67 3b 0a 20 20 20 20  e *pFreePg;.    
1de70 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74      rc = allocat
1de80 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20  eBtreePage(pBt, 
1de90 26 70 46 72 65 65 50 67 2c 20 26 69 46 72 65 65  &pFreePg, &iFree
1dea0 50 67 2c 20 69 4c 61 73 74 50 67 2c 20 42 54 41  Pg, iLastPg, BTA
1deb0 4c 4c 4f 43 5f 45 58 41 43 54 29 3b 0a 20 20 20  LLOC_EXACT);.   
1dec0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
1ded0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1dee0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1def0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1df00 20 61 73 73 65 72 74 28 20 69 46 72 65 65 50 67   assert( iFreePg
1df10 3d 3d 69 4c 61 73 74 50 67 20 29 3b 0a 20 20 20  ==iLastPg );.   
1df20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
1df30 28 70 46 72 65 65 50 67 29 3b 0a 20 20 20 20 20  (pFreePg);.     
1df40 20 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a   }.    } else {.
1df50 20 20 20 20 20 20 50 67 6e 6f 20 69 46 72 65 65        Pgno iFree
1df60 50 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Pg;             
1df70 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66 72 65 65  /* Index of free
1df80 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20 70 4c   page to move pL
1df90 61 73 74 50 67 20 74 6f 20 2a 2f 0a 20 20 20 20  astPg to */.    
1dfa0 20 20 4d 65 6d 50 61 67 65 20 2a 70 4c 61 73 74    MemPage *pLast
1dfb0 50 67 3b 0a 20 20 20 20 20 20 75 38 20 65 4d 6f  Pg;.      u8 eMo
1dfc0 64 65 20 3d 20 42 54 41 4c 4c 4f 43 5f 41 4e 59  de = BTALLOC_ANY
1dfd0 3b 20 20 20 2f 2a 20 4d 6f 64 65 20 70 61 72 61  ;   /* Mode para
1dfe0 6d 65 74 65 72 20 66 6f 72 20 61 6c 6c 6f 63 61  meter for alloca
1dff0 74 65 42 74 72 65 65 50 61 67 65 28 29 20 2a 2f  teBtreePage() */
1e000 0a 20 20 20 20 20 20 50 67 6e 6f 20 69 4e 65 61  .      Pgno iNea
1e010 72 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  r = 0;          
1e020 20 2f 2a 20 6e 65 61 72 62 79 20 70 61 72 61 6d   /* nearby param
1e030 65 74 65 72 20 66 6f 72 20 61 6c 6c 6f 63 61 74  eter for allocat
1e040 65 42 74 72 65 65 50 61 67 65 28 29 20 2a 2f 0a  eBtreePage() */.
1e050 0a 20 20 20 20 20 20 72 63 20 3d 20 62 74 72 65  .      rc = btre
1e060 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 4c  eGetPage(pBt, iL
1e070 61 73 74 50 67 2c 20 26 70 4c 61 73 74 50 67 2c  astPg, &pLastPg,
1e080 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72   0);.      if( r
1e090 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1e0a0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
1e0b0 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  c;.      }..    
1e0c0 20 20 2f 2a 20 49 66 20 62 43 6f 6d 6d 69 74 20    /* If bCommit 
1e0d0 69 73 20 7a 65 72 6f 2c 20 74 68 69 73 20 6c 6f  is zero, this lo
1e0e0 6f 70 20 72 75 6e 73 20 65 78 61 63 74 6c 79 20  op runs exactly 
1e0f0 6f 6e 63 65 20 61 6e 64 20 70 61 67 65 20 70 4c  once and page pL
1e100 61 73 74 50 67 0a 20 20 20 20 20 20 2a 2a 20 69  astPg.      ** i
1e110 73 20 73 77 61 70 70 65 64 20 77 69 74 68 20 74  s swapped with t
1e120 68 65 20 66 69 72 73 74 20 66 72 65 65 20 70 61  he first free pa
1e130 67 65 20 70 75 6c 6c 65 64 20 6f 66 66 20 74 68  ge pulled off th
1e140 65 20 66 72 65 65 20 6c 69 73 74 2e 0a 20 20 20  e free list..   
1e150 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4f     **.      ** O
1e160 6e 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64  n the other hand
1e170 2c 20 69 66 20 62 43 6f 6d 6d 69 74 20 69 73 20  , if bCommit is 
1e180 67 72 65 61 74 65 72 20 74 68 61 6e 20 7a 65 72  greater than zer
1e190 6f 2c 20 74 68 65 6e 20 6b 65 65 70 0a 20 20 20  o, then keep.   
1e1a0 20 20 20 2a 2a 20 6c 6f 6f 70 69 6e 67 20 75 6e     ** looping un
1e1b0 74 69 6c 20 61 20 66 72 65 65 2d 70 61 67 65 20  til a free-page 
1e1c0 6c 6f 63 61 74 65 64 20 77 69 74 68 69 6e 20 74  located within t
1e1d0 68 65 20 66 69 72 73 74 20 6e 46 69 6e 20 70 61  he first nFin pa
1e1e0 67 65 73 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20  ges.      ** of 
1e1f0 74 68 65 20 66 69 6c 65 20 69 73 20 66 6f 75 6e  the file is foun
1e200 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  d..      */.    
1e210 20 20 69 66 28 20 62 43 6f 6d 6d 69 74 3d 3d 30    if( bCommit==0
1e220 20 29 7b 0a 20 20 20 20 20 20 20 20 65 4d 6f 64   ){.        eMod
1e230 65 20 3d 20 42 54 41 4c 4c 4f 43 5f 4c 45 3b 0a  e = BTALLOC_LE;.
1e240 20 20 20 20 20 20 20 20 69 4e 65 61 72 20 3d 20          iNear = 
1e250 6e 46 69 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20  nFin;.      }.  
1e260 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 20      do {.       
1e270 20 4d 65 6d 50 61 67 65 20 2a 70 46 72 65 65 50   MemPage *pFreeP
1e280 67 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  g;.        rc = 
1e290 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67  allocateBtreePag
1e2a0 65 28 70 42 74 2c 20 26 70 46 72 65 65 50 67 2c  e(pBt, &pFreePg,
1e2b0 20 26 69 46 72 65 65 50 67 2c 20 69 4e 65 61 72   &iFreePg, iNear
1e2c0 2c 20 65 4d 6f 64 65 29 3b 0a 20 20 20 20 20 20  , eMode);.      
1e2d0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1e2e0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
1e2f0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4c 61   releasePage(pLa
1e300 73 74 50 67 29 3b 0a 20 20 20 20 20 20 20 20 20  stPg);.         
1e310 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1e320 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65      }.        re
1e330 6c 65 61 73 65 50 61 67 65 28 70 46 72 65 65 50  leasePage(pFreeP
1e340 67 29 3b 0a 20 20 20 20 20 20 7d 77 68 69 6c 65  g);.      }while
1e350 28 20 62 43 6f 6d 6d 69 74 20 26 26 20 69 46 72  ( bCommit && iFr
1e360 65 65 50 67 3e 6e 46 69 6e 20 29 3b 0a 20 20 20  eePg>nFin );.   
1e370 20 20 20 61 73 73 65 72 74 28 20 69 46 72 65 65     assert( iFree
1e380 50 67 3c 69 4c 61 73 74 50 67 20 29 3b 0a 20 20  Pg<iLastPg );.  
1e390 20 20 20 20 0a 20 20 20 20 20 20 72 63 20 3d 20      .      rc = 
1e3a0 72 65 6c 6f 63 61 74 65 50 61 67 65 28 70 42 74  relocatePage(pBt
1e3b0 2c 20 70 4c 61 73 74 50 67 2c 20 65 54 79 70 65  , pLastPg, eType
1e3c0 2c 20 69 50 74 72 50 61 67 65 2c 20 69 46 72 65  , iPtrPage, iFre
1e3d0 65 50 67 2c 20 62 43 6f 6d 6d 69 74 29 3b 0a 20  ePg, bCommit);. 
1e3e0 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
1e3f0 28 70 4c 61 73 74 50 67 29 3b 0a 20 20 20 20 20  (pLastPg);.     
1e400 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1e410 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  OK ){.        re
1e420 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
1e430 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
1e440 28 20 62 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b 0a  ( bCommit==0 ){.
1e450 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 69      do {.      i
1e460 4c 61 73 74 50 67 2d 2d 3b 0a 20 20 20 20 7d 77  LastPg--;.    }w
1e470 68 69 6c 65 28 20 69 4c 61 73 74 50 67 3d 3d 50  hile( iLastPg==P
1e480 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
1e490 28 70 42 74 29 20 7c 7c 20 50 54 52 4d 41 50 5f  (pBt) || PTRMAP_
1e4a0 49 53 50 41 47 45 28 70 42 74 2c 20 69 4c 61 73  ISPAGE(pBt, iLas
1e4b0 74 50 67 29 20 29 3b 0a 20 20 20 20 70 42 74 2d  tPg) );.    pBt-
1e4c0 3e 62 44 6f 54 72 75 6e 63 61 74 65 20 3d 20 31  >bDoTruncate = 1
1e4d0 3b 0a 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65  ;.    pBt->nPage
1e4e0 20 3d 20 69 4c 61 73 74 50 67 3b 0a 20 20 7d 0a   = iLastPg;.  }.
1e4f0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1e500 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  OK;.}../*.** The
1e510 20 64 61 74 61 62 61 73 65 20 6f 70 65 6e 65 64   database opened
1e520 20 62 79 20 74 68 65 20 66 69 72 73 74 20 61 72   by the first ar
1e530 67 75 6d 65 6e 74 20 69 73 20 61 6e 20 61 75 74  gument is an aut
1e540 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73  o-vacuum databas
1e550 65 0a 2a 2a 20 6e 4f 72 69 67 20 70 61 67 65 73  e.** nOrig pages
1e560 20 69 6e 20 73 69 7a 65 20 63 6f 6e 74 61 69 6e   in size contain
1e570 69 6e 67 20 6e 46 72 65 65 20 66 72 65 65 20 70  ing nFree free p
1e580 61 67 65 73 2e 20 52 65 74 75 72 6e 20 74 68 65  ages. Return the
1e590 20 65 78 70 65 63 74 65 64 20 0a 2a 2a 20 73 69   expected .** si
1e5a0 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
1e5b0 73 65 20 69 6e 20 70 61 67 65 73 20 66 6f 6c 6c  se in pages foll
1e5c0 6f 77 69 6e 67 20 61 6e 20 61 75 74 6f 2d 76 61  owing an auto-va
1e5d0 63 75 75 6d 20 6f 70 65 72 61 74 69 6f 6e 2e 0a  cuum operation..
1e5e0 2a 2f 0a 73 74 61 74 69 63 20 50 67 6e 6f 20 66  */.static Pgno f
1e5f0 69 6e 61 6c 44 62 53 69 7a 65 28 42 74 53 68 61  inalDbSize(BtSha
1e600 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6e  red *pBt, Pgno n
1e610 4f 72 69 67 2c 20 50 67 6e 6f 20 6e 46 72 65 65  Orig, Pgno nFree
1e620 29 7b 0a 20 20 69 6e 74 20 6e 45 6e 74 72 79 3b  ){.  int nEntry;
1e630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e640 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1e650 66 20 65 6e 74 72 69 65 73 20 6f 6e 20 6f 6e 65  f entries on one
1e660 20 70 74 72 6d 61 70 20 70 61 67 65 20 2a 2f 0a   ptrmap page */.
1e670 20 20 50 67 6e 6f 20 6e 50 74 72 6d 61 70 3b 20    Pgno nPtrmap; 
1e680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e690 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 50    /* Number of P
1e6a0 74 72 4d 61 70 20 70 61 67 65 73 20 74 6f 20 62  trMap pages to b
1e6b0 65 20 66 72 65 65 64 20 2a 2f 0a 20 20 50 67 6e  e freed */.  Pgn
1e6c0 6f 20 6e 46 69 6e 3b 20 20 20 20 20 20 20 20 20  o nFin;         
1e6d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1e6e0 52 65 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a  Return value */.
1e6f0 0a 20 20 6e 45 6e 74 72 79 20 3d 20 70 42 74 2d  .  nEntry = pBt-
1e700 3e 75 73 61 62 6c 65 53 69 7a 65 2f 35 3b 0a 20  >usableSize/5;. 
1e710 20 6e 50 74 72 6d 61 70 20 3d 20 28 6e 46 72 65   nPtrmap = (nFre
1e720 65 2d 6e 4f 72 69 67 2b 50 54 52 4d 41 50 5f 50  e-nOrig+PTRMAP_P
1e730 41 47 45 4e 4f 28 70 42 74 2c 20 6e 4f 72 69 67  AGENO(pBt, nOrig
1e740 29 2b 6e 45 6e 74 72 79 29 2f 6e 45 6e 74 72 79  )+nEntry)/nEntry
1e750 3b 0a 20 20 6e 46 69 6e 20 3d 20 6e 4f 72 69 67  ;.  nFin = nOrig
1e760 20 2d 20 6e 46 72 65 65 20 2d 20 6e 50 74 72 6d   - nFree - nPtrm
1e770 61 70 3b 0a 20 20 69 66 28 20 6e 4f 72 69 67 3e  ap;.  if( nOrig>
1e780 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
1e790 45 28 70 42 74 29 20 26 26 20 6e 46 69 6e 3c 50  E(pBt) && nFin<P
1e7a0 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
1e7b0 28 70 42 74 29 20 29 7b 0a 20 20 20 20 6e 46 69  (pBt) ){.    nFi
1e7c0 6e 2d 2d 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65  n--;.  }.  while
1e7d0 28 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28  ( PTRMAP_ISPAGE(
1e7e0 70 42 74 2c 20 6e 46 69 6e 29 20 7c 7c 20 6e 46  pBt, nFin) || nF
1e7f0 69 6e 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  in==PENDING_BYTE
1e800 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20  _PAGE(pBt) ){.  
1e810 20 20 6e 46 69 6e 2d 2d 3b 0a 20 20 7d 0a 0a 20    nFin--;.  }.. 
1e820 20 72 65 74 75 72 6e 20 6e 46 69 6e 3b 0a 7d 0a   return nFin;.}.
1e830 0a 2f 2a 0a 2a 2a 20 41 20 77 72 69 74 65 2d 74  ./*.** A write-t
1e840 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20  ransaction must 
1e850 62 65 20 6f 70 65 6e 65 64 20 62 65 66 6f 72 65  be opened before
1e860 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 66 75   calling this fu
1e870 6e 63 74 69 6f 6e 2e 0a 2a 2a 20 49 74 20 70 65  nction..** It pe
1e880 72 66 6f 72 6d 73 20 61 20 73 69 6e 67 6c 65 20  rforms a single 
1e890 75 6e 69 74 20 6f 66 20 77 6f 72 6b 20 74 6f 77  unit of work tow
1e8a0 61 72 64 73 20 61 6e 20 69 6e 63 72 65 6d 65 6e  ards an incremen
1e8b0 74 61 6c 20 76 61 63 75 75 6d 2e 0a 2a 2a 0a 2a  tal vacuum..**.*
1e8c0 2a 20 49 66 20 74 68 65 20 69 6e 63 72 65 6d 65  * If the increme
1e8d0 6e 74 61 6c 20 76 61 63 75 75 6d 20 69 73 20 66  ntal vacuum is f
1e8e0 69 6e 69 73 68 65 64 20 61 66 74 65 72 20 74 68  inished after th
1e8f0 69 73 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20  is function has 
1e900 72 75 6e 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 44  run,.** SQLITE_D
1e910 4f 4e 45 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ONE is returned.
1e920 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20 66 69   If it is not fi
1e930 6e 69 73 68 65 64 2c 20 62 75 74 20 6e 6f 20 65  nished, but no e
1e940 72 72 6f 72 20 6f 63 63 75 72 72 65 64 2c 0a 2a  rror occurred,.*
1e950 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  * SQLITE_OK is r
1e960 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69  eturned. Otherwi
1e970 73 65 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  se an SQLite err
1e980 6f 72 20 63 6f 64 65 2e 20 0a 2a 2f 0a 69 6e 74  or code. .*/.int
1e990 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 63   sqlite3BtreeInc
1e9a0 72 56 61 63 75 75 6d 28 42 74 72 65 65 20 2a 70  rVacuum(Btree *p
1e9b0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42  ){.  int rc;.  B
1e9c0 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
1e9d0 2d 3e 70 42 74 3b 0a 0a 20 20 73 71 6c 69 74 65  ->pBt;..  sqlite
1e9e0 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
1e9f0 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69    assert( pBt->i
1ea00 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52  nTransaction==TR
1ea10 41 4e 53 5f 57 52 49 54 45 20 26 26 20 70 2d 3e  ANS_WRITE && p->
1ea20 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57  inTrans==TRANS_W
1ea30 52 49 54 45 20 29 3b 0a 20 20 69 66 28 20 21 70  RITE );.  if( !p
1ea40 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
1ea50 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
1ea60 45 5f 44 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65 7b  E_DONE;.  }else{
1ea70 0a 20 20 20 20 50 67 6e 6f 20 6e 4f 72 69 67 20  .    Pgno nOrig 
1ea80 3d 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74  = btreePagecount
1ea90 28 70 42 74 29 3b 0a 20 20 20 20 50 67 6e 6f 20  (pBt);.    Pgno 
1eaa0 6e 46 72 65 65 20 3d 20 67 65 74 34 62 79 74 65  nFree = get4byte
1eab0 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  (&pBt->pPage1->a
1eac0 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 20 20 50  Data[36]);.    P
1ead0 67 6e 6f 20 6e 46 69 6e 20 3d 20 66 69 6e 61 6c  gno nFin = final
1eae0 44 62 53 69 7a 65 28 70 42 74 2c 20 6e 4f 72 69  DbSize(pBt, nOri
1eaf0 67 2c 20 6e 46 72 65 65 29 3b 0a 0a 20 20 20 20  g, nFree);..    
1eb00 69 66 28 20 6e 4f 72 69 67 3c 6e 46 69 6e 20 29  if( nOrig<nFin )
1eb10 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
1eb20 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
1eb30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
1eb40 6e 46 72 65 65 3e 30 20 29 7b 0a 20 20 20 20 20  nFree>0 ){.     
1eb50 20 72 63 20 3d 20 73 61 76 65 41 6c 6c 43 75 72   rc = saveAllCur
1eb60 73 6f 72 73 28 70 42 74 2c 20 30 2c 20 30 29 3b  sors(pBt, 0, 0);
1eb70 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
1eb80 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1eb90 20 20 20 20 69 6e 76 61 6c 69 64 61 74 65 41 6c      invalidateAl
1eba0 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70  lOverflowCache(p
1ebb0 42 74 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  Bt);.        rc 
1ebc0 3d 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70  = incrVacuumStep
1ebd0 28 70 42 74 2c 20 6e 46 69 6e 2c 20 6e 4f 72 69  (pBt, nFin, nOri
1ebe0 67 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  g, 0);.      }. 
1ebf0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
1ec00 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1ec10 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1ec20 67 65 72 57 72 69 74 65 28 70 42 74 2d 3e 70 50  gerWrite(pBt->pP
1ec30 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a  age1->pDbPage);.
1ec40 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
1ec50 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  (&pBt->pPage1->a
1ec60 44 61 74 61 5b 32 38 5d 2c 20 70 42 74 2d 3e 6e  Data[28], pBt->n
1ec70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Page);.      }. 
1ec80 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1ec90 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45  rc = SQLITE_DONE
1eca0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  ;.    }.  }.  sq
1ecb0 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
1ecc0 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
1ecd0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
1ece0 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
1ecf0 20 70 72 69 6f 72 20 74 6f 20 73 71 6c 69 74 65   prior to sqlite
1ed00 33 50 61 67 65 72 43 6f 6d 6d 69 74 20 77 68 65  3PagerCommit whe
1ed10 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a  n a transaction.
1ed20 2a 2a 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 20  ** is committed 
1ed30 66 6f 72 20 61 6e 20 61 75 74 6f 2d 76 61 63 75  for an auto-vacu
1ed40 75 6d 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a  um database..**.
1ed50 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 4f 4b 20  ** If SQLITE_OK 
1ed60 69 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65  is returned, the
1ed70 6e 20 2a 70 6e 54 72 75 6e 63 20 69 73 20 73 65  n *pnTrunc is se
1ed80 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20  t to the number 
1ed90 6f 66 20 70 61 67 65 73 0a 2a 2a 20 74 68 65 20  of pages.** the 
1eda0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 73 68  database file sh
1edb0 6f 75 6c 64 20 62 65 20 74 72 75 6e 63 61 74 65  ould be truncate
1edc0 64 20 74 6f 20 64 75 72 69 6e 67 20 74 68 65 20  d to during the 
1edd0 63 6f 6d 6d 69 74 20 70 72 6f 63 65 73 73 2e 20  commit process. 
1ede0 0a 2a 2a 20 69 2e 65 2e 20 74 68 65 20 64 61 74  .** i.e. the dat
1edf0 61 62 61 73 65 20 68 61 73 20 62 65 65 6e 20 72  abase has been r
1ee00 65 6f 72 67 61 6e 69 7a 65 64 20 73 6f 20 74 68  eorganized so th
1ee10 61 74 20 6f 6e 6c 79 20 74 68 65 20 66 69 72 73  at only the firs
1ee20 74 20 2a 70 6e 54 72 75 6e 63 0a 2a 2a 20 70 61  t *pnTrunc.** pa
1ee30 67 65 73 20 61 72 65 20 69 6e 20 75 73 65 2e 0a  ges are in use..
1ee40 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 75  */.static int au
1ee50 74 6f 56 61 63 75 75 6d 43 6f 6d 6d 69 74 28 42  toVacuumCommit(B
1ee60 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20  tShared *pBt){. 
1ee70 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
1ee80 5f 4f 4b 3b 0a 20 20 50 61 67 65 72 20 2a 70 50  _OK;.  Pager *pP
1ee90 61 67 65 72 20 3d 20 70 42 74 2d 3e 70 50 61 67  ager = pBt->pPag
1eea0 65 72 3b 0a 20 20 56 56 41 5f 4f 4e 4c 59 28 20  er;.  VVA_ONLY( 
1eeb0 69 6e 74 20 6e 52 65 66 20 3d 20 73 71 6c 69 74  int nRef = sqlit
1eec0 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28  e3PagerRefcount(
1eed0 70 50 61 67 65 72 29 3b 20 29 0a 0a 20 20 61 73  pPager); )..  as
1eee0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
1eef0 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
1ef00 74 65 78 29 20 29 3b 0a 20 20 69 6e 76 61 6c 69  tex) );.  invali
1ef10 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43  dateAllOverflowC
1ef20 61 63 68 65 28 70 42 74 29 3b 0a 20 20 61 73 73  ache(pBt);.  ass
1ef30 65 72 74 28 70 42 74 2d 3e 61 75 74 6f 56 61 63  ert(pBt->autoVac
1ef40 75 75 6d 29 3b 0a 20 20 69 66 28 20 21 70 42 74  uum);.  if( !pBt
1ef50 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 29 7b 0a  ->incrVacuum ){.
1ef60 20 20 20 20 50 67 6e 6f 20 6e 46 69 6e 3b 20 20      Pgno nFin;  
1ef70 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1ef80 20 6f 66 20 70 61 67 65 73 20 69 6e 20 64 61 74   of pages in dat
1ef90 61 62 61 73 65 20 61 66 74 65 72 20 61 75 74 6f  abase after auto
1efa0 76 61 63 75 75 6d 69 6e 67 20 2a 2f 0a 20 20 20  vacuuming */.   
1efb0 20 50 67 6e 6f 20 6e 46 72 65 65 3b 20 20 20 20   Pgno nFree;    
1efc0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1efd0 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72   pages on the fr
1efe0 65 65 6c 69 73 74 20 69 6e 69 74 69 61 6c 6c 79  eelist initially
1eff0 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 69 46 72   */.    Pgno iFr
1f000 65 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ee;        /* Th
1f010 65 20 6e 65 78 74 20 70 61 67 65 20 74 6f 20 62  e next page to b
1f020 65 20 66 72 65 65 64 20 2a 2f 0a 20 20 20 20 50  e freed */.    P
1f030 67 6e 6f 20 6e 4f 72 69 67 3b 20 20 20 20 20 20  gno nOrig;      
1f040 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 73 69    /* Database si
1f050 7a 65 20 62 65 66 6f 72 65 20 66 72 65 65 69 6e  ze before freein
1f060 67 20 2a 2f 0a 0a 20 20 20 20 6e 4f 72 69 67 20  g */..    nOrig 
1f070 3d 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74  = btreePagecount
1f080 28 70 42 74 29 3b 0a 20 20 20 20 69 66 28 20 50  (pBt);.    if( P
1f090 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74  TRMAP_ISPAGE(pBt
1f0a0 2c 20 6e 4f 72 69 67 29 20 7c 7c 20 6e 4f 72 69  , nOrig) || nOri
1f0b0 67 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  g==PENDING_BYTE_
1f0c0 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20  PAGE(pBt) ){.   
1f0d0 20 20 20 2f 2a 20 49 74 20 69 73 20 6e 6f 74 20     /* It is not 
1f0e0 70 6f 73 73 69 62 6c 65 20 74 6f 20 63 72 65 61  possible to crea
1f0f0 74 65 20 61 20 64 61 74 61 62 61 73 65 20 66 6f  te a database fo
1f100 72 20 77 68 69 63 68 20 74 68 65 20 66 69 6e 61  r which the fina
1f110 6c 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20  l page.      ** 
1f120 69 73 20 65 69 74 68 65 72 20 61 20 70 6f 69 6e  is either a poin
1f130 74 65 72 2d 6d 61 70 20 70 61 67 65 20 6f 72 20  ter-map page or 
1f140 74 68 65 20 70 65 6e 64 69 6e 67 2d 62 79 74 65  the pending-byte
1f150 20 70 61 67 65 2e 20 49 66 20 6f 6e 65 0a 20 20   page. If one.  
1f160 20 20 20 20 2a 2a 20 69 73 20 65 6e 63 6f 75 6e      ** is encoun
1f170 74 65 72 65 64 2c 20 74 68 69 73 20 69 6e 64 69  tered, this indi
1f180 63 61 74 65 73 20 63 6f 72 72 75 70 74 69 6f 6e  cates corruption
1f190 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
1f1a0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
1f1b0 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
1f1c0 20 7d 0a 0a 20 20 20 20 6e 46 72 65 65 20 3d 20   }..    nFree = 
1f1d0 67 65 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70  get4byte(&pBt->p
1f1e0 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d  Page1->aData[36]
1f1f0 29 3b 0a 20 20 20 20 6e 46 69 6e 20 3d 20 66 69  );.    nFin = fi
1f200 6e 61 6c 44 62 53 69 7a 65 28 70 42 74 2c 20 6e  nalDbSize(pBt, n
1f210 4f 72 69 67 2c 20 6e 46 72 65 65 29 3b 0a 20 20  Orig, nFree);.  
1f220 20 20 69 66 28 20 6e 46 69 6e 3e 6e 4f 72 69 67    if( nFin>nOrig
1f230 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
1f240 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
1f250 20 20 20 69 66 28 20 6e 46 69 6e 3c 6e 4f 72 69     if( nFin<nOri
1f260 67 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  g ){.      rc = 
1f270 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 70  saveAllCursors(p
1f280 42 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d  Bt, 0, 0);.    }
1f290 0a 20 20 20 20 66 6f 72 28 69 46 72 65 65 3d 6e  .    for(iFree=n
1f2a0 4f 72 69 67 3b 20 69 46 72 65 65 3e 6e 46 69 6e  Orig; iFree>nFin
1f2b0 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
1f2c0 4b 3b 20 69 46 72 65 65 2d 2d 29 7b 0a 20 20 20  K; iFree--){.   
1f2d0 20 20 20 72 63 20 3d 20 69 6e 63 72 56 61 63 75     rc = incrVacu
1f2e0 75 6d 53 74 65 70 28 70 42 74 2c 20 6e 46 69 6e  umStep(pBt, nFin
1f2f0 2c 20 69 46 72 65 65 2c 20 31 29 3b 0a 20 20 20  , iFree, 1);.   
1f300 20 7d 0a 20 20 20 20 69 66 28 20 28 72 63 3d 3d   }.    if( (rc==
1f310 53 51 4c 49 54 45 5f 44 4f 4e 45 20 7c 7c 20 72  SQLITE_DONE || r
1f320 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 26 26  c==SQLITE_OK) &&
1f330 20 6e 46 72 65 65 3e 30 20 29 7b 0a 20 20 20 20   nFree>0 ){.    
1f340 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1f350 67 65 72 57 72 69 74 65 28 70 42 74 2d 3e 70 50  gerWrite(pBt->pP
1f360 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a  age1->pDbPage);.
1f370 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
1f380 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61  pBt->pPage1->aDa
1f390 74 61 5b 33 32 5d 2c 20 30 29 3b 0a 20 20 20 20  ta[32], 0);.    
1f3a0 20 20 70 75 74 34 62 79 74 65 28 26 70 42 74 2d    put4byte(&pBt-
1f3b0 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  >pPage1->aData[3
1f3c0 36 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 75  6], 0);.      pu
1f3d0 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61  t4byte(&pBt->pPa
1f3e0 67 65 31 2d 3e 61 44 61 74 61 5b 32 38 5d 2c 20  ge1->aData[28], 
1f3f0 6e 46 69 6e 29 3b 0a 20 20 20 20 20 20 70 42 74  nFin);.      pBt
1f400 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65 20 3d 20  ->bDoTruncate = 
1f410 31 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 50  1;.      pBt->nP
1f420 61 67 65 20 3d 20 6e 46 69 6e 3b 0a 20 20 20 20  age = nFin;.    
1f430 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  }.    if( rc!=SQ
1f440 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1f450 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c   sqlite3PagerRol
1f460 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  lback(pPager);. 
1f470 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65     }.  }..  asse
1f480 72 74 28 20 6e 52 65 66 3e 3d 73 71 6c 69 74 65  rt( nRef>=sqlite
1f490 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70  3PagerRefcount(p
1f4a0 50 61 67 65 72 29 20 29 3b 0a 20 20 72 65 74 75  Pager) );.  retu
1f4b0 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6c 73 65 20  rn rc;.}..#else 
1f4c0 2f 2a 20 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /* ifndef SQLITE
1f4d0 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
1f4e0 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 73 65 74   */.# define set
1f4f0 43 68 69 6c 64 50 74 72 6d 61 70 73 28 78 29 20  ChildPtrmaps(x) 
1f500 53 51 4c 49 54 45 5f 4f 4b 0a 23 65 6e 64 69 66  SQLITE_OK.#endif
1f510 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
1f520 74 69 6e 65 20 64 6f 65 73 20 74 68 65 20 66 69  tine does the fi
1f530 72 73 74 20 70 68 61 73 65 20 6f 66 20 61 20 74  rst phase of a t
1f540 77 6f 2d 70 68 61 73 65 20 63 6f 6d 6d 69 74 2e  wo-phase commit.
1f550 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a    This routine.*
1f560 2a 20 63 61 75 73 65 73 20 61 20 72 6f 6c 6c 62  * causes a rollb
1f570 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 62  ack journal to b
1f580 65 20 63 72 65 61 74 65 64 20 28 69 66 20 69 74  e created (if it
1f590 20 64 6f 65 73 20 6e 6f 74 20 61 6c 72 65 61 64   does not alread
1f5a0 79 20 65 78 69 73 74 29 0a 2a 2a 20 61 6e 64 20  y exist).** and 
1f5b0 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 65  populated with e
1f5c0 6e 6f 75 67 68 20 69 6e 66 6f 72 6d 61 74 69 6f  nough informatio
1f5d0 6e 20 73 6f 20 74 68 61 74 20 69 66 20 61 20 70  n so that if a p
1f5e0 6f 77 65 72 20 6c 6f 73 73 20 6f 63 63 75 72 73  ower loss occurs
1f5f0 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65  .** the database
1f600 20 63 61 6e 20 62 65 20 72 65 73 74 6f 72 65 64   can be restored
1f610 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c   to its original
1f620 20 73 74 61 74 65 20 62 79 20 70 6c 61 79 69 6e   state by playin
1f630 67 20 62 61 63 6b 0a 2a 2a 20 74 68 65 20 6a 6f  g back.** the jo
1f640 75 72 6e 61 6c 2e 20 20 54 68 65 6e 20 74 68 65  urnal.  Then the
1f650 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
1f660 20 6a 6f 75 72 6e 61 6c 20 61 72 65 20 66 6c 75   journal are flu
1f670 73 68 65 64 20 6f 75 74 20 74 6f 0a 2a 2a 20 74  shed out to.** t
1f680 68 65 20 64 69 73 6b 2e 20 20 41 66 74 65 72 20  he disk.  After 
1f690 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73  the journal is s
1f6a0 61 66 65 6c 79 20 6f 6e 20 6f 78 69 64 65 2c 20  afely on oxide, 
1f6b0 74 68 65 20 63 68 61 6e 67 65 73 20 74 6f 20 74  the changes to t
1f6c0 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 61  he.** database a
1f6d0 72 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  re written into 
1f6e0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1f6f0 65 20 61 6e 64 20 66 6c 75 73 68 65 64 20 74 6f  e and flushed to
1f700 20 6f 78 69 64 65 2e 0a 2a 2a 20 41 74 20 74 68   oxide..** At th
1f710 65 20 65 6e 64 20 6f 66 20 74 68 69 73 20 63 61  e end of this ca
1f720 6c 6c 2c 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  ll, the rollback
1f730 20 6a 6f 75 72 6e 61 6c 20 73 74 69 6c 6c 20 65   journal still e
1f740 78 69 73 74 73 20 6f 6e 20 74 68 65 0a 2a 2a 20  xists on the.** 
1f750 64 69 73 6b 20 61 6e 64 20 77 65 20 61 72 65 20  disk and we are 
1f760 73 74 69 6c 6c 20 68 6f 6c 64 69 6e 67 20 61 6c  still holding al
1f770 6c 20 6c 6f 63 6b 73 2c 20 73 6f 20 74 68 65 20  l locks, so the 
1f780 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20  transaction has 
1f790 6e 6f 74 0a 2a 2a 20 63 6f 6d 6d 69 74 74 65 64  not.** committed
1f7a0 2e 20 20 53 65 65 20 73 71 6c 69 74 65 33 42 74  .  See sqlite3Bt
1f7b0 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77  reeCommitPhaseTw
1f7c0 6f 28 29 20 66 6f 72 20 74 68 65 20 73 65 63 6f  o() for the seco
1f7d0 6e 64 20 70 68 61 73 65 20 6f 66 20 74 68 65 0a  nd phase of the.
1f7e0 2a 2a 20 63 6f 6d 6d 69 74 20 70 72 6f 63 65 73  ** commit proces
1f7f0 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 61  s..**.** This ca
1f800 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66  ll is a no-op if
1f810 20 6e 6f 20 77 72 69 74 65 2d 74 72 61 6e 73 61   no write-transa
1f820 63 74 69 6f 6e 20 69 73 20 63 75 72 72 65 6e 74  ction is current
1f830 6c 79 20 61 63 74 69 76 65 20 6f 6e 20 70 42 74  ly active on pBt
1f840 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ..**.** Otherwis
1f850 65 2c 20 73 79 6e 63 20 74 68 65 20 64 61 74 61  e, sync the data
1f860 62 61 73 65 20 66 69 6c 65 20 66 6f 72 20 74 68  base file for th
1f870 65 20 62 74 72 65 65 20 70 42 74 2e 20 7a 4d 61  e btree pBt. zMa
1f880 73 74 65 72 20 70 6f 69 6e 74 73 20 74 6f 0a 2a  ster points to.*
1f890 2a 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20  * the name of a 
1f8a0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
1f8b0 69 6c 65 20 74 68 61 74 20 73 68 6f 75 6c 64 20  ile that should 
1f8c0 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  be written into 
1f8d0 74 68 65 0a 2a 2a 20 69 6e 64 69 76 69 64 75 61  the.** individua
1f8e0 6c 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20  l journal file, 
1f8f0 6f 72 20 69 73 20 4e 55 4c 4c 2c 20 69 6e 64 69  or is NULL, indi
1f900 63 61 74 69 6e 67 20 6e 6f 20 6d 61 73 74 65 72  cating no master
1f910 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 0a 2a   journal file .*
1f920 2a 20 28 73 69 6e 67 6c 65 20 64 61 74 61 62 61  * (single databa
1f930 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e  se transaction).
1f940 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73  .**.** When this
1f950 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20   is called, the 
1f960 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 73  master journal s
1f970 68 6f 75 6c 64 20 61 6c 72 65 61 64 79 20 68 61  hould already ha
1f980 76 65 20 62 65 65 6e 0a 2a 2a 20 63 72 65 61 74  ve been.** creat
1f990 65 64 2c 20 70 6f 70 75 6c 61 74 65 64 20 77 69  ed, populated wi
1f9a0 74 68 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20  th this journal 
1f9b0 70 6f 69 6e 74 65 72 20 61 6e 64 20 73 79 6e 63  pointer and sync
1f9c0 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a  ed to disk..**.*
1f9d0 2a 20 4f 6e 63 65 20 74 68 69 73 20 69 73 20 72  * Once this is r
1f9e0 6f 75 74 69 6e 65 20 68 61 73 20 72 65 74 75 72  outine has retur
1f9f0 6e 65 64 2c 20 74 68 65 20 6f 6e 6c 79 20 74 68  ned, the only th
1fa00 69 6e 67 20 72 65 71 75 69 72 65 64 20 74 6f 20  ing required to 
1fa10 63 6f 6d 6d 69 74 0a 2a 2a 20 74 68 65 20 77 72  commit.** the wr
1fa20 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
1fa30 66 6f 72 20 74 68 69 73 20 64 61 74 61 62 61 73  for this databas
1fa40 65 20 66 69 6c 65 20 69 73 20 74 6f 20 64 65 6c  e file is to del
1fa50 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e  ete the journal.
1fa60 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
1fa70 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f  treeCommitPhaseO
1fa80 6e 65 28 42 74 72 65 65 20 2a 70 2c 20 63 6f 6e  ne(Btree *p, con
1fa90 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72  st char *zMaster
1faa0 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
1fab0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70  LITE_OK;.  if( p
1fac0 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
1fad0 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 42 74  _WRITE ){.    Bt
1fae0 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
1faf0 3e 70 42 74 3b 0a 20 20 20 20 73 71 6c 69 74 65  >pBt;.    sqlite
1fb00 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
1fb10 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1fb20 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
1fb30 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f     if( pBt->auto
1fb40 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20  Vacuum ){.      
1fb50 72 63 20 3d 20 61 75 74 6f 56 61 63 75 75 6d 43  rc = autoVacuumC
1fb60 6f 6d 6d 69 74 28 70 42 74 29 3b 0a 20 20 20 20  ommit(pBt);.    
1fb70 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1fb80 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73  _OK ){.        s
1fb90 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
1fba0 28 70 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  (p);.        ret
1fbb0 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
1fbc0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 42      }.    if( pB
1fbd0 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65 20 29  t->bDoTruncate )
1fbe0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  {.      sqlite3P
1fbf0 61 67 65 72 54 72 75 6e 63 61 74 65 49 6d 61 67  agerTruncateImag
1fc00 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70  e(pBt->pPager, p
1fc10 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20  Bt->nPage);.    
1fc20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 63 20  }.#endif.    rc 
1fc30 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f  = sqlite3PagerCo
1fc40 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 42 74  mmitPhaseOne(pBt
1fc50 2d 3e 70 50 61 67 65 72 2c 20 7a 4d 61 73 74 65  ->pPager, zMaste
1fc60 72 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  r, 0);.    sqlit
1fc70 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
1fc80 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
1fc90 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
1fca0 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
1fcb0 65 64 20 66 72 6f 6d 20 62 6f 74 68 20 42 74 72  ed from both Btr
1fcc0 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f  eeCommitPhaseTwo
1fcd0 28 29 20 61 6e 64 20 42 74 72 65 65 52 6f 6c 6c  () and BtreeRoll
1fce0 62 61 63 6b 28 29 0a 2a 2a 20 61 74 20 74 68 65  back().** at the
1fcf0 20 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66 20 61   conclusion of a
1fd00 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f   transaction..*/
1fd10 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 74 72  .static void btr
1fd20 65 65 45 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e  eeEndTransaction
1fd30 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74  (Btree *p){.  Bt
1fd40 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
1fd50 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74 65 33 20  >pBt;.  sqlite3 
1fd60 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61  *db = p->db;.  a
1fd70 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74  ssert( sqlite3Bt
1fd80 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29  reeHoldsMutex(p)
1fd90 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   );..#ifndef SQL
1fda0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
1fdb0 55 55 4d 0a 20 20 70 42 74 2d 3e 62 44 6f 54 72  UUM.  pBt->bDoTr
1fdc0 75 6e 63 61 74 65 20 3d 20 30 3b 0a 23 65 6e 64  uncate = 0;.#end
1fdd0 69 66 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72  if.  if( p->inTr
1fde0 61 6e 73 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20 26  ans>TRANS_NONE &
1fdf0 26 20 64 62 2d 3e 6e 56 64 62 65 52 65 61 64 3e  & db->nVdbeRead>
1fe00 31 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74  1 ){.    /* If t
1fe10 68 65 72 65 20 61 72 65 20 6f 74 68 65 72 20 61  here are other a
1fe20 63 74 69 76 65 20 73 74 61 74 65 6d 65 6e 74 73  ctive statements
1fe30 20 74 68 61 74 20 62 65 6c 6f 6e 67 20 74 6f 20   that belong to 
1fe40 74 68 69 73 20 64 61 74 61 62 61 73 65 0a 20 20  this database.  
1fe50 20 20 2a 2a 20 68 61 6e 64 6c 65 2c 20 64 6f 77    ** handle, dow
1fe60 6e 67 72 61 64 65 20 74 6f 20 61 20 72 65 61 64  ngrade to a read
1fe70 2d 6f 6e 6c 79 20 74 72 61 6e 73 61 63 74 69 6f  -only transactio
1fe80 6e 2e 20 54 68 65 20 6f 74 68 65 72 20 73 74 61  n. The other sta
1fe90 74 65 6d 65 6e 74 73 0a 20 20 20 20 2a 2a 20 6d  tements.    ** m
1fea0 61 79 20 73 74 69 6c 6c 20 62 65 20 72 65 61 64  ay still be read
1feb0 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 64 61 74  ing from the dat
1fec0 61 62 61 73 65 2e 20 20 2a 2f 0a 20 20 20 20 64  abase.  */.    d
1fed0 6f 77 6e 67 72 61 64 65 41 6c 6c 53 68 61 72 65  owngradeAllShare
1fee0 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73  dCacheTableLocks
1fef0 28 70 29 3b 0a 20 20 20 20 70 2d 3e 69 6e 54 72  (p);.    p->inTr
1ff00 61 6e 73 20 3d 20 54 52 41 4e 53 5f 52 45 41 44  ans = TRANS_READ
1ff10 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
1ff20 2a 20 49 66 20 74 68 65 20 68 61 6e 64 6c 65 20  * If the handle 
1ff30 68 61 64 20 61 6e 79 20 6b 69 6e 64 20 6f 66 20  had any kind of 
1ff40 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e  transaction open
1ff50 2c 20 64 65 63 72 65 6d 65 6e 74 20 74 68 65 20  , decrement the 
1ff60 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74  .    ** transact
1ff70 69 6f 6e 20 63 6f 75 6e 74 20 6f 66 20 74 68 65  ion count of the
1ff80 20 73 68 61 72 65 64 20 62 74 72 65 65 2e 20 49   shared btree. I
1ff90 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  f the transactio
1ffa0 6e 20 63 6f 75 6e 74 20 0a 20 20 20 20 2a 2a 20  n count .    ** 
1ffb0 72 65 61 63 68 65 73 20 30 2c 20 73 65 74 20 74  reaches 0, set t
1ffc0 68 65 20 73 68 61 72 65 64 20 73 74 61 74 65 20  he shared state 
1ffd0 74 6f 20 54 52 41 4e 53 5f 4e 4f 4e 45 2e 20 54  to TRANS_NONE. T
1ffe0 68 65 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66  he unlockBtreeIf
1fff0 55 6e 75 73 65 64 28 29 0a 20 20 20 20 2a 2a 20  Unused().    ** 
20000 63 61 6c 6c 20 62 65 6c 6f 77 20 77 69 6c 6c 20  call below will 
20010 75 6e 6c 6f 63 6b 20 74 68 65 20 70 61 67 65 72  unlock the pager
20020 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d  .  */.    if( p-
20030 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f  >inTrans!=TRANS_
20040 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 63 6c  NONE ){.      cl
20050 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63 68  earAllSharedCach
20060 65 54 61 62 6c 65 4c 6f 63 6b 73 28 70 29 3b 0a  eTableLocks(p);.
20070 20 20 20 20 20 20 70 42 74 2d 3e 6e 54 72 61 6e        pBt->nTran
20080 73 61 63 74 69 6f 6e 2d 2d 3b 0a 20 20 20 20 20  saction--;.     
20090 20 69 66 28 20 30 3d 3d 70 42 74 2d 3e 6e 54 72   if( 0==pBt->nTr
200a0 61 6e 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20  ansaction ){.   
200b0 20 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e       pBt->inTran
200c0 73 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f  saction = TRANS_
200d0 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20  NONE;.      }.  
200e0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20    }..    /* Set 
200f0 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e  the current tran
20100 73 61 63 74 69 6f 6e 20 73 74 61 74 65 20 74 6f  saction state to
20110 20 54 52 41 4e 53 5f 4e 4f 4e 45 20 61 6e 64 20   TRANS_NONE and 
20120 75 6e 6c 6f 63 6b 20 74 68 65 20 0a 20 20 20 20  unlock the .    
20130 2a 2a 20 70 61 67 65 72 20 69 66 20 74 68 69 73  ** pager if this
20140 20 63 61 6c 6c 20 63 6c 6f 73 65 64 20 74 68 65   call closed the
20150 20 6f 6e 6c 79 20 72 65 61 64 20 6f 72 20 77 72   only read or wr
20160 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ite transaction.
20170 20 20 2a 2f 0a 20 20 20 20 70 2d 3e 69 6e 54 72    */.    p->inTr
20180 61 6e 73 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45  ans = TRANS_NONE
20190 3b 0a 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65  ;.    unlockBtre
201a0 65 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a  eIfUnused(pBt);.
201b0 20 20 7d 0a 0a 20 20 62 74 72 65 65 49 6e 74 65    }..  btreeInte
201c0 67 72 69 74 79 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a  grity(p);.}../*.
201d0 2a 2a 20 43 6f 6d 6d 69 74 20 74 68 65 20 74 72  ** Commit the tr
201e0 61 6e 73 61 63 74 69 6f 6e 20 63 75 72 72 65 6e  ansaction curren
201f0 74 6c 79 20 69 6e 20 70 72 6f 67 72 65 73 73 2e  tly in progress.
20200 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
20210 69 6e 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74  ine implements t
20220 68 65 20 73 65 63 6f 6e 64 20 70 68 61 73 65 20  he second phase 
20230 6f 66 20 61 20 32 2d 70 68 61 73 65 20 63 6f 6d  of a 2-phase com
20240 6d 69 74 2e 20 20 54 68 65 0a 2a 2a 20 73 71 6c  mit.  The.** sql
20250 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
20260 68 61 73 65 4f 6e 65 28 29 20 72 6f 75 74 69 6e  haseOne() routin
20270 65 20 64 6f 65 73 20 74 68 65 20 66 69 72 73 74  e does the first
20280 20 70 68 61 73 65 20 61 6e 64 20 73 68 6f 75 6c   phase and shoul
20290 64 0a 2a 2a 20 62 65 20 69 6e 76 6f 6b 65 64 20  d.** be invoked 
202a0 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67  prior to calling
202b0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20 20   this routine.  
202c0 54 68 65 20 73 71 6c 69 74 65 33 42 74 72 65 65  The sqlite3Btree
202d0 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29  CommitPhaseOne()
202e0 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 64 69 64 20  .** routine did 
202f0 61 6c 6c 20 74 68 65 20 77 6f 72 6b 20 6f 66 20  all the work of 
20300 77 72 69 74 69 6e 67 20 69 6e 66 6f 72 6d 61 74  writing informat
20310 69 6f 6e 20 6f 75 74 20 74 6f 20 64 69 73 6b 20  ion out to disk 
20320 61 6e 64 20 66 6c 75 73 68 69 6e 67 20 74 68 65  and flushing the
20330 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 73 6f 20  .** contents so 
20340 74 68 61 74 20 74 68 65 79 20 61 72 65 20 77 72  that they are wr
20350 69 74 74 65 6e 20 6f 6e 74 6f 20 74 68 65 20 64  itten onto the d
20360 69 73 6b 20 70 6c 61 74 74 65 72 2e 20 20 41 6c  isk platter.  Al
20370 6c 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e  l this.** routin
20380 65 20 68 61 73 20 74 6f 20 64 6f 20 69 73 20 64  e has to do is d
20390 65 6c 65 74 65 20 6f 72 20 74 72 75 6e 63 61 74  elete or truncat
203a0 65 20 6f 72 20 7a 65 72 6f 20 74 68 65 20 68 65  e or zero the he
203b0 61 64 65 72 20 69 6e 20 74 68 65 0a 2a 2a 20 74  ader in the.** t
203c0 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  he rollback jour
203d0 6e 61 6c 20 28 77 68 69 63 68 20 63 61 75 73 65  nal (which cause
203e0 73 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  s the transactio
203f0 6e 20 74 6f 20 63 6f 6d 6d 69 74 29 20 61 6e 64  n to commit) and
20400 0a 2a 2a 20 64 72 6f 70 20 6c 6f 63 6b 73 2e 0a  .** drop locks..
20410 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20  **.** Normally, 
20420 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  if an error occu
20430 72 73 20 77 68 69 6c 65 20 74 68 65 20 70 61 67  rs while the pag
20440 65 72 20 6c 61 79 65 72 20 69 73 20 61 74 74 65  er layer is atte
20450 6d 70 74 69 6e 67 20 74 6f 20 0a 2a 2a 20 66 69  mpting to .** fi
20460 6e 61 6c 69 7a 65 20 74 68 65 20 75 6e 64 65 72  nalize the under
20470 6c 79 69 6e 67 20 6a 6f 75 72 6e 61 6c 20 66 69  lying journal fi
20480 6c 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  le, this functio
20490 6e 20 72 65 74 75 72 6e 73 20 61 6e 20 65 72 72  n returns an err
204a0 6f 72 20 61 6e 64 0a 2a 2a 20 74 68 65 20 75 70  or and.** the up
204b0 70 65 72 20 6c 61 79 65 72 20 77 69 6c 6c 20 61  per layer will a
204c0 74 74 65 6d 70 74 20 61 20 72 6f 6c 6c 62 61 63  ttempt a rollbac
204d0 6b 2e 20 48 6f 77 65 76 65 72 2c 20 69 66 20 74  k. However, if t
204e0 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
204f0 6e 74 0a 2a 2a 20 69 73 20 6e 6f 6e 2d 7a 65 72  nt.** is non-zer
20500 6f 20 74 68 65 6e 20 74 68 69 73 20 62 2d 74 72  o then this b-tr
20510 65 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ee transaction i
20520 73 20 70 61 72 74 20 6f 66 20 61 20 6d 75 6c 74  s part of a mult
20530 69 2d 66 69 6c 65 20 0a 2a 2a 20 74 72 61 6e 73  i-file .** trans
20540 61 63 74 69 6f 6e 2e 20 49 6e 20 74 68 69 73 20  action. In this 
20550 63 61 73 65 2c 20 74 68 65 20 74 72 61 6e 73 61  case, the transa
20560 63 74 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64  ction has alread
20570 79 20 62 65 65 6e 20 63 6f 6d 6d 69 74 74 65 64  y been committed
20580 20 0a 2a 2a 20 28 62 79 20 64 65 6c 65 74 69 6e   .** (by deletin
20590 67 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  g a master journ
205a0 61 6c 20 66 69 6c 65 29 20 61 6e 64 20 74 68 65  al file) and the
205b0 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 69 67 6e   caller will ign
205c0 6f 72 65 20 74 68 69 73 20 0a 2a 2a 20 66 75 6e  ore this .** fun
205d0 63 74 69 6f 6e 73 20 72 65 74 75 72 6e 20 63 6f  ctions return co
205e0 64 65 2e 20 53 6f 2c 20 65 76 65 6e 20 69 66 20  de. So, even if 
205f0 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
20600 69 6e 20 74 68 65 20 70 61 67 65 72 20 6c 61 79  in the pager lay
20610 65 72 2c 0a 2a 2a 20 72 65 73 65 74 20 74 68 65  er,.** reset the
20620 20 62 2d 74 72 65 65 20 6f 62 6a 65 63 74 73 20   b-tree objects 
20630 69 6e 74 65 72 6e 61 6c 20 73 74 61 74 65 20 74  internal state t
20640 6f 20 69 6e 64 69 63 61 74 65 20 74 68 61 74 20  o indicate that 
20650 74 68 65 20 77 72 69 74 65 0a 2a 2a 20 74 72 61  the write.** tra
20660 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 62 65 65  nsaction has bee
20670 6e 20 63 6c 6f 73 65 64 2e 20 54 68 69 73 20 69  n closed. This i
20680 73 20 71 75 69 74 65 20 73 61 66 65 2c 20 61 73  s quite safe, as
20690 20 74 68 65 20 70 61 67 65 72 20 77 69 6c 6c 20   the pager will 
206a0 68 61 76 65 0a 2a 2a 20 74 72 61 6e 73 69 74 69  have.** transiti
206b0 6f 6e 65 64 20 74 6f 20 74 68 65 20 65 72 72 6f  oned to the erro
206c0 72 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 54  r state..**.** T
206d0 68 69 73 20 77 69 6c 6c 20 72 65 6c 65 61 73 65  his will release
206e0 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20   the write lock 
206f0 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
20700 66 69 6c 65 2e 20 20 49 66 20 74 68 65 72 65 0a  file.  If there.
20710 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65  ** are no active
20720 20 63 75 72 73 6f 72 73 2c 20 69 74 20 61 6c 73   cursors, it als
20730 6f 20 72 65 6c 65 61 73 65 73 20 74 68 65 20 72  o releases the r
20740 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74  ead lock..*/.int
20750 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
20760 6d 69 74 50 68 61 73 65 54 77 6f 28 42 74 72 65  mitPhaseTwo(Btre
20770 65 20 2a 70 2c 20 69 6e 74 20 62 43 6c 65 61 6e  e *p, int bClean
20780 75 70 29 7b 0a 0a 20 20 69 66 28 20 70 2d 3e 69  up){..  if( p->i
20790 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 4e 4f  nTrans==TRANS_NO
207a0 4e 45 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  NE ) return SQLI
207b0 54 45 5f 4f 4b 3b 0a 20 20 73 71 6c 69 74 65 33  TE_OK;.  sqlite3
207c0 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
207d0 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28   btreeIntegrity(
207e0 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  p);..  /* If the
207f0 20 68 61 6e 64 6c 65 20 68 61 73 20 61 20 77 72   handle has a wr
20800 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
20810 6f 70 65 6e 2c 20 63 6f 6d 6d 69 74 20 74 68 65  open, commit the
20820 20 73 68 61 72 65 64 2d 62 74 72 65 65 73 20 0a   shared-btrees .
20830 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
20840 20 61 6e 64 20 73 65 74 20 74 68 65 20 73 68 61   and set the sha
20850 72 65 64 20 73 74 61 74 65 20 74 6f 20 54 52 41  red state to TRA
20860 4e 53 5f 52 45 41 44 2e 0a 20 20 2a 2f 0a 20 20  NS_READ..  */.  
20870 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d  if( p->inTrans==
20880 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20  TRANS_WRITE ){. 
20890 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 42     int rc;.    B
208a0 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
208b0 2d 3e 70 42 74 3b 0a 20 20 20 20 61 73 73 65 72  ->pBt;.    asser
208c0 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  t( pBt->inTransa
208d0 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49  ction==TRANS_WRI
208e0 54 45 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  TE );.    assert
208f0 28 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74  ( pBt->nTransact
20900 69 6f 6e 3e 30 20 29 3b 0a 20 20 20 20 72 63 20  ion>0 );.    rc 
20910 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f  = sqlite3PagerCo
20920 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70 42 74  mmitPhaseTwo(pBt
20930 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69  ->pPager);.    i
20940 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
20950 20 26 26 20 62 43 6c 65 61 6e 75 70 3d 3d 30 20   && bCleanup==0 
20960 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
20970 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
20980 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
20990 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 69 44 61      }.    p->iDa
209a0 74 61 56 65 72 73 69 6f 6e 2d 2d 3b 20 20 2f 2a  taVersion--;  /*
209b0 20 43 6f 6d 70 65 6e 73 61 74 65 20 66 6f 72 20   Compensate for 
209c0 70 50 61 67 65 72 2d 3e 69 44 61 74 61 56 65 72  pPager->iDataVer
209d0 73 69 6f 6e 2b 2b 3b 20 2a 2f 0a 20 20 20 20 70  sion++; */.    p
209e0 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
209f0 6e 20 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a  n = TRANS_READ;.
20a00 20 20 20 20 62 74 72 65 65 43 6c 65 61 72 48 61      btreeClearHa
20a10 73 43 6f 6e 74 65 6e 74 28 70 42 74 29 3b 0a 20  sContent(pBt);. 
20a20 20 7d 0a 0a 20 20 62 74 72 65 65 45 6e 64 54 72   }..  btreeEndTr
20a30 61 6e 73 61 63 74 69 6f 6e 28 70 29 3b 0a 20 20  ansaction(p);.  
20a40 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
20a50 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  e(p);.  return S
20a60 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
20a70 2a 2a 20 44 6f 20 62 6f 74 68 20 70 68 61 73 65  ** Do both phase
20a80 73 20 6f 66 20 61 20 63 6f 6d 6d 69 74 2e 0a 2a  s of a commit..*
20a90 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
20aa0 65 65 43 6f 6d 6d 69 74 28 42 74 72 65 65 20 2a  eeCommit(Btree *
20ab0 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  p){.  int rc;.  
20ac0 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
20ad0 72 28 70 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  r(p);.  rc = sql
20ae0 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
20af0 68 61 73 65 4f 6e 65 28 70 2c 20 30 29 3b 0a 20  haseOne(p, 0);. 
20b00 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
20b10 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  OK ){.    rc = s
20b20 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
20b30 74 50 68 61 73 65 54 77 6f 28 70 2c 20 30 29 3b  tPhaseTwo(p, 0);
20b40 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74  .  }.  sqlite3Bt
20b50 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
20b60 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
20b70 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
20b80 73 65 74 73 20 74 68 65 20 73 74 61 74 65 20 74  sets the state t
20b90 6f 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 61  o CURSOR_FAULT a
20ba0 6e 64 20 74 68 65 20 65 72 72 6f 72 0a 2a 2a 20  nd the error.** 
20bb0 63 6f 64 65 20 74 6f 20 65 72 72 43 6f 64 65 20  code to errCode 
20bc0 66 6f 72 20 65 76 65 72 79 20 63 75 72 73 6f 72  for every cursor
20bd0 20 6f 6e 20 61 6e 79 20 42 74 53 68 61 72 65 64   on any BtShared
20be0 20 74 68 61 74 20 70 42 74 72 65 65 0a 2a 2a 20   that pBtree.** 
20bf0 72 65 66 65 72 65 6e 63 65 73 2e 20 20 4f 72 20  references.  Or 
20c00 69 66 20 74 68 65 20 77 72 69 74 65 4f 6e 6c 79  if the writeOnly
20c10 20 66 6c 61 67 20 69 73 20 73 65 74 20 74 6f 20   flag is set to 
20c20 31 2c 20 74 68 65 6e 20 6f 6e 6c 79 0a 2a 2a 20  1, then only.** 
20c30 74 72 69 70 20 77 72 69 74 65 20 63 75 72 73 6f  trip write curso
20c40 72 73 20 61 6e 64 20 6c 65 61 76 65 20 72 65 61  rs and leave rea
20c50 64 20 63 75 72 73 6f 72 73 20 75 6e 63 68 61 6e  d cursors unchan
20c60 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 45 76 65 72 79  ged..**.** Every
20c70 20 63 75 72 73 6f 72 20 69 73 20 61 20 63 61 6e   cursor is a can
20c80 64 69 64 61 74 65 20 74 6f 20 62 65 20 74 72 69  didate to be tri
20c90 70 70 65 64 2c 20 69 6e 63 6c 75 64 69 6e 67 20  pped, including 
20ca0 63 75 72 73 6f 72 73 0a 2a 2a 20 74 68 61 74 20  cursors.** that 
20cb0 62 65 6c 6f 6e 67 20 74 6f 20 6f 74 68 65 72 20  belong to other 
20cc0 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
20cd0 69 6f 6e 73 20 74 68 61 74 20 68 61 70 70 65 6e  ions that happen
20ce0 20 74 6f 20 62 65 0a 2a 2a 20 73 68 61 72 69 6e   to be.** sharin
20cf0 67 20 74 68 65 20 63 61 63 68 65 20 77 69 74 68  g the cache with
20d00 20 70 42 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 54   pBtree..**.** T
20d10 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65 74 73  his routine gets
20d20 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 72   called when a r
20d30 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 2e 20  ollback occurs. 
20d40 49 66 20 74 68 65 20 77 72 69 74 65 4f 6e 6c 79  If the writeOnly
20d50 0a 2a 2a 20 66 6c 61 67 20 69 73 20 74 72 75 65  .** flag is true
20d60 2c 20 74 68 65 6e 20 6f 6e 6c 79 20 77 72 69 74  , then only writ
20d70 65 2d 63 75 72 73 6f 72 73 20 6e 65 65 64 20 62  e-cursors need b
20d80 65 20 74 72 69 70 70 65 64 20 2d 20 72 65 61 64  e tripped - read
20d90 2d 6f 6e 6c 79 0a 2a 2a 20 63 75 72 73 6f 72 73  -only.** cursors
20da0 20 73 61 76 65 20 74 68 65 69 72 20 63 75 72 72   save their curr
20db0 65 6e 74 20 70 6f 73 69 74 69 6f 6e 73 20 73 6f  ent positions so
20dc0 20 74 68 61 74 20 74 68 65 79 20 6d 61 79 20 63   that they may c
20dd0 6f 6e 74 69 6e 75 65 20 0a 2a 2a 20 66 6f 6c 6c  ontinue .** foll
20de0 6f 77 69 6e 67 20 74 68 65 20 72 6f 6c 6c 62 61  owing the rollba
20df0 63 6b 2e 20 4f 72 2c 20 69 66 20 77 72 69 74 65  ck. Or, if write
20e00 4f 6e 6c 79 20 69 73 20 66 61 6c 73 65 2c 20 61  Only is false, a
20e10 6c 6c 20 63 75 72 73 6f 72 73 20 61 72 65 20 0a  ll cursors are .
20e20 2a 2a 20 74 72 69 70 70 65 64 2e 20 49 6e 20 67  ** tripped. In g
20e30 65 6e 65 72 61 6c 2c 20 77 72 69 74 65 4f 6e 6c  eneral, writeOnl
20e40 79 20 69 73 20 66 61 6c 73 65 20 69 66 20 74 68  y is false if th
20e50 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62 65  e transaction be
20e60 69 6e 67 0a 2a 2a 20 72 6f 6c 6c 65 64 20 62 61  ing.** rolled ba
20e70 63 6b 20 6d 6f 64 69 66 69 65 64 20 74 68 65 20  ck modified the 
20e80 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e  database schema.
20e90 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 62 2d   In this case b-
20ea0 74 72 65 65 20 72 6f 6f 74 0a 2a 2a 20 70 61 67  tree root.** pag
20eb0 65 73 20 6d 61 79 20 62 65 20 6d 6f 76 65 64 20  es may be moved 
20ec0 6f 72 20 64 65 6c 65 74 65 64 20 66 72 6f 6d 20  or deleted from 
20ed0 74 68 65 20 64 61 74 61 62 61 73 65 20 61 6c 74  the database alt
20ee0 6f 67 65 74 68 65 72 2c 20 6d 61 6b 69 6e 67 0a  ogether, making.
20ef0 2a 2a 20 69 74 20 75 6e 73 61 66 65 20 66 6f 72  ** it unsafe for
20f00 20 72 65 61 64 20 63 75 72 73 6f 72 73 20 74 6f   read cursors to
20f10 20 63 6f 6e 74 69 6e 75 65 2e 0a 2a 2a 0a 2a 2a   continue..**.**
20f20 20 49 66 20 74 68 65 20 77 72 69 74 65 4f 6e 6c   If the writeOnl
20f30 79 20 66 6c 61 67 20 69 73 20 74 72 75 65 20 61  y flag is true a
20f40 6e 64 20 61 6e 20 65 72 72 6f 72 20 69 73 20 65  nd an error is e
20f50 6e 63 6f 75 6e 74 65 72 65 64 20 77 68 69 6c 65  ncountered while
20f60 20 0a 2a 2a 20 73 61 76 69 6e 67 20 74 68 65 20   .** saving the 
20f70 63 75 72 72 65 6e 74 20 70 6f 73 69 74 69 6f 6e  current position
20f80 20 6f 66 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20   of a read-only 
20f90 63 75 72 73 6f 72 2c 20 61 6c 6c 20 63 75 72 73  cursor, all curs
20fa0 6f 72 73 2c 20 0a 2a 2a 20 69 6e 63 6c 75 64 69  ors, .** includi
20fb0 6e 67 20 61 6c 6c 20 72 65 61 64 2d 63 75 72 73  ng all read-curs
20fc0 6f 72 73 20 61 72 65 20 74 72 69 70 70 65 64 2e  ors are tripped.
20fd0 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  .**.** SQLITE_OK
20fe0 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
20ff0 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 72 20 69  successful, or i
21000 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
21010 73 20 77 68 69 6c 65 0a 2a 2a 20 73 61 76 69 6e  s while.** savin
21020 67 20 61 20 63 75 72 73 6f 72 20 70 6f 73 69 74  g a cursor posit
21030 69 6f 6e 2c 20 61 6e 20 53 51 4c 69 74 65 20 65  ion, an SQLite e
21040 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 69 6e  rror code..*/.in
21050 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 54 72  t sqlite3BtreeTr
21060 69 70 41 6c 6c 43 75 72 73 6f 72 73 28 42 74 72  ipAllCursors(Btr
21070 65 65 20 2a 70 42 74 72 65 65 2c 20 69 6e 74 20  ee *pBtree, int 
21080 65 72 72 43 6f 64 65 2c 20 69 6e 74 20 77 72 69  errCode, int wri
21090 74 65 4f 6e 6c 79 29 7b 0a 20 20 42 74 43 75 72  teOnly){.  BtCur
210a0 73 6f 72 20 2a 70 3b 0a 20 20 69 6e 74 20 72 63  sor *p;.  int rc
210b0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
210c0 20 61 73 73 65 72 74 28 20 28 77 72 69 74 65 4f   assert( (writeO
210d0 6e 6c 79 3d 3d 30 20 7c 7c 20 77 72 69 74 65 4f  nly==0 || writeO
210e0 6e 6c 79 3d 3d 31 29 20 26 26 20 42 54 43 46 5f  nly==1) && BTCF_
210f0 57 72 69 74 65 46 6c 61 67 3d 3d 31 20 29 3b 0a  WriteFlag==1 );.
21100 20 20 69 66 28 20 70 42 74 72 65 65 20 29 7b 0a    if( pBtree ){.
21110 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
21120 45 6e 74 65 72 28 70 42 74 72 65 65 29 3b 0a 20  Enter(pBtree);. 
21130 20 20 20 66 6f 72 28 70 3d 70 42 74 72 65 65 2d     for(p=pBtree-
21140 3e 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70  >pBt->pCursor; p
21150 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20  ; p=p->pNext){. 
21160 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
21170 20 20 69 66 28 20 77 72 69 74 65 4f 6e 6c 79 20    if( writeOnly 
21180 26 26 20 28 70 2d 3e 63 75 72 46 6c 61 67 73 20  && (p->curFlags 
21190 26 20 42 54 43 46 5f 57 72 69 74 65 46 6c 61 67  & BTCF_WriteFlag
211a0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
211b0 69 66 28 20 70 2d 3e 65 53 74 61 74 65 3d 3d 43  if( p->eState==C
211c0 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70  URSOR_VALID || p
211d0 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
211e0 5f 53 4b 49 50 4e 45 58 54 20 29 7b 0a 20 20 20  _SKIPNEXT ){.   
211f0 20 20 20 20 20 20 20 72 63 20 3d 20 73 61 76 65         rc = save
21200 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70  CursorPosition(p
21210 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
21220 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
21230 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 76  {.            (v
21240 6f 69 64 29 73 71 6c 69 74 65 33 42 74 72 65 65  oid)sqlite3Btree
21250 54 72 69 70 41 6c 6c 43 75 72 73 6f 72 73 28 70  TripAllCursors(p
21260 42 74 72 65 65 2c 20 72 63 2c 20 30 29 3b 0a 20  Btree, rc, 0);. 
21270 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
21280 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
21290 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
212a0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
212b0 69 74 65 33 42 74 72 65 65 43 6c 65 61 72 43 75  ite3BtreeClearCu
212c0 72 73 6f 72 28 70 29 3b 0a 20 20 20 20 20 20 20  rsor(p);.       
212d0 20 70 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52   p->eState = CUR
212e0 53 4f 52 5f 46 41 55 4c 54 3b 0a 20 20 20 20 20  SOR_FAULT;.     
212f0 20 20 20 70 2d 3e 73 6b 69 70 4e 65 78 74 20 3d     p->skipNext =
21300 20 65 72 72 43 6f 64 65 3b 0a 20 20 20 20 20 20   errCode;.      
21310 7d 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  }.      for(i=0;
21320 20 69 3c 3d 70 2d 3e 69 50 61 67 65 3b 20 69 2b   i<=p->iPage; i+
21330 2b 29 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65  +){.        rele
21340 61 73 65 50 61 67 65 28 70 2d 3e 61 70 50 61 67  asePage(p->apPag
21350 65 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 70  e[i]);.        p
21360 2d 3e 61 70 50 61 67 65 5b 69 5d 20 3d 20 30 3b  ->apPage[i] = 0;
21370 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
21380 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c     sqlite3BtreeL
21390 65 61 76 65 28 70 42 74 72 65 65 29 3b 0a 20 20  eave(pBtree);.  
213a0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
213b0 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b  ../*.** Rollback
213c0 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
213d0 20 69 6e 20 70 72 6f 67 72 65 73 73 2e 0a 2a 2a   in progress..**
213e0 0a 2a 2a 20 49 66 20 74 72 69 70 43 6f 64 65 20  .** If tripCode 
213f0 69 73 20 6e 6f 74 20 53 51 4c 49 54 45 5f 4f 4b  is not SQLITE_OK
21400 20 74 68 65 6e 20 63 75 72 73 6f 72 73 20 77 69   then cursors wi
21410 6c 6c 20 62 65 20 69 6e 76 61 6c 69 64 61 74 65  ll be invalidate
21420 64 20 28 74 72 69 70 70 65 64 29 2e 0a 2a 2a 20  d (tripped)..** 
21430 4f 6e 6c 79 20 77 72 69 74 65 20 63 75 72 73 6f  Only write curso
21440 72 73 20 61 72 65 20 74 72 69 70 70 65 64 20 69  rs are tripped i
21450 66 20 77 72 69 74 65 4f 6e 6c 79 20 69 73 20 74  f writeOnly is t
21460 72 75 65 20 62 75 74 20 61 6c 6c 20 63 75 72 73  rue but all curs
21470 6f 72 73 20 61 72 65 0a 2a 2a 20 74 72 69 70 70  ors are.** tripp
21480 65 64 20 69 66 20 77 72 69 74 65 4f 6e 6c 79 20  ed if writeOnly 
21490 69 73 20 66 61 6c 73 65 2e 20 20 41 6e 79 20 61  is false.  Any a
214a0 74 74 65 6d 70 74 20 74 6f 20 75 73 65 0a 2a 2a  ttempt to use.**
214b0 20 61 20 74 72 69 70 70 65 64 20 63 75 72 73 6f   a tripped curso
214c0 72 20 77 69 6c 6c 20 72 65 73 75 6c 74 20 69 6e  r will result in
214d0 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a   an error..**.**
214e0 20 54 68 69 73 20 77 69 6c 6c 20 72 65 6c 65 61   This will relea
214f0 73 65 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63  se the write loc
21500 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
21510 65 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65 72  e file.  If ther
21520 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74 69  e.** are no acti
21530 76 65 20 63 75 72 73 6f 72 73 2c 20 69 74 20 61  ve cursors, it a
21540 6c 73 6f 20 72 65 6c 65 61 73 65 73 20 74 68 65  lso releases the
21550 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69   read lock..*/.i
21560 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 52  nt sqlite3BtreeR
21570 6f 6c 6c 62 61 63 6b 28 42 74 72 65 65 20 2a 70  ollback(Btree *p
21580 2c 20 69 6e 74 20 74 72 69 70 43 6f 64 65 2c 20  , int tripCode, 
21590 69 6e 74 20 77 72 69 74 65 4f 6e 6c 79 29 7b 0a  int writeOnly){.
215a0 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68    int rc;.  BtSh
215b0 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
215c0 42 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  Bt;.  MemPage *p
215d0 50 61 67 65 31 3b 0a 0a 20 20 61 73 73 65 72 74  Page1;..  assert
215e0 28 20 77 72 69 74 65 4f 6e 6c 79 3d 3d 31 20 7c  ( writeOnly==1 |
215f0 7c 20 77 72 69 74 65 4f 6e 6c 79 3d 3d 30 20 29  | writeOnly==0 )
21600 3b 0a 20 20 61 73 73 65 72 74 28 20 74 72 69 70  ;.  assert( trip
21610 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 41 42 4f  Code==SQLITE_ABO
21620 52 54 5f 52 4f 4c 4c 42 41 43 4b 20 7c 7c 20 74  RT_ROLLBACK || t
21630 72 69 70 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f  ripCode==SQLITE_
21640 4f 4b 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  OK );.  sqlite3B
21650 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
21660 69 66 28 20 74 72 69 70 43 6f 64 65 3d 3d 53 51  if( tripCode==SQ
21670 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
21680 63 20 3d 20 74 72 69 70 43 6f 64 65 20 3d 20 73  c = tripCode = s
21690 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 42  aveAllCursors(pB
216a0 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66  t, 0, 0);.    if
216b0 28 20 72 63 20 29 20 77 72 69 74 65 4f 6e 6c 79  ( rc ) writeOnly
216c0 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
216d0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
216e0 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 74 72 69  K;.  }.  if( tri
216f0 70 43 6f 64 65 20 29 7b 0a 20 20 20 20 69 6e 74  pCode ){.    int
21700 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33 42 74   rc2 = sqlite3Bt
21710 72 65 65 54 72 69 70 41 6c 6c 43 75 72 73 6f 72  reeTripAllCursor
21720 73 28 70 2c 20 74 72 69 70 43 6f 64 65 2c 20 77  s(p, tripCode, w
21730 72 69 74 65 4f 6e 6c 79 29 3b 0a 20 20 20 20 61  riteOnly);.    a
21740 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
21750 45 5f 4f 4b 20 7c 7c 20 28 77 72 69 74 65 4f 6e  E_OK || (writeOn
21760 6c 79 3d 3d 30 20 26 26 20 72 63 32 3d 3d 53 51  ly==0 && rc2==SQ
21770 4c 49 54 45 5f 4f 4b 29 20 29 3b 0a 20 20 20 20  LITE_OK) );.    
21780 69 66 28 20 72 63 32 21 3d 53 51 4c 49 54 45 5f  if( rc2!=SQLITE_
21790 4f 4b 20 29 20 72 63 20 3d 20 72 63 32 3b 0a 20  OK ) rc = rc2;. 
217a0 20 7d 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72   }.  btreeIntegr
217b0 69 74 79 28 70 29 3b 0a 0a 20 20 69 66 28 20 70  ity(p);..  if( p
217c0 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
217d0 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 69 6e  _WRITE ){.    in
217e0 74 20 72 63 32 3b 0a 0a 20 20 20 20 61 73 73 65  t rc2;..    asse
217f0 72 74 28 20 54 52 41 4e 53 5f 57 52 49 54 45 3d  rt( TRANS_WRITE=
21800 3d 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74  =pBt->inTransact
21810 69 6f 6e 20 29 3b 0a 20 20 20 20 72 63 32 20 3d  ion );.    rc2 =
21820 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c   sqlite3PagerRol
21830 6c 62 61 63 6b 28 70 42 74 2d 3e 70 50 61 67 65  lback(pBt->pPage
21840 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 32 21  r);.    if( rc2!
21850 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
21860 20 20 20 20 72 63 20 3d 20 72 63 32 3b 0a 20 20      rc = rc2;.  
21870 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20    }..    /* The 
21880 72 6f 6c 6c 62 61 63 6b 20 6d 61 79 20 68 61 76  rollback may hav
21890 65 20 64 65 73 74 72 6f 79 65 64 20 74 68 65 20  e destroyed the 
218a0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20 76 61  pPage1->aData va
218b0 6c 75 65 2e 20 20 53 6f 0a 20 20 20 20 2a 2a 20  lue.  So.    ** 
218c0 63 61 6c 6c 20 62 74 72 65 65 47 65 74 50 61 67  call btreeGetPag
218d0 65 28 29 20 6f 6e 20 70 61 67 65 20 31 20 61 67  e() on page 1 ag
218e0 61 69 6e 20 74 6f 20 6d 61 6b 65 0a 20 20 20 20  ain to make.    
218f0 2a 2a 20 73 75 72 65 20 70 50 61 67 65 31 2d 3e  ** sure pPage1->
21900 61 44 61 74 61 20 69 73 20 73 65 74 20 63 6f 72  aData is set cor
21910 72 65 63 74 6c 79 2e 20 2a 2f 0a 20 20 20 20 69  rectly. */.    i
21920 66 28 20 62 74 72 65 65 47 65 74 50 61 67 65 28  f( btreeGetPage(
21930 70 42 74 2c 20 31 2c 20 26 70 50 61 67 65 31 2c  pBt, 1, &pPage1,
21940 20 30 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   0)==SQLITE_OK )
21950 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 50 61 67  {.      int nPag
21960 65 20 3d 20 67 65 74 34 62 79 74 65 28 32 38 2b  e = get4byte(28+
21970 28 75 38 2a 29 70 50 61 67 65 31 2d 3e 61 44 61  (u8*)pPage1->aDa
21980 74 61 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  ta);.      testc
21990 61 73 65 28 20 6e 50 61 67 65 3d 3d 30 20 29 3b  ase( nPage==0 );
219a0 0a 20 20 20 20 20 20 69 66 28 20 6e 50 61 67 65  .      if( nPage
219b0 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 50 61 67  ==0 ) sqlite3Pag
219c0 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d  erPagecount(pBt-
219d0 3e 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29  >pPager, &nPage)
219e0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
219f0 28 20 70 42 74 2d 3e 6e 50 61 67 65 21 3d 6e 50  ( pBt->nPage!=nP
21a00 61 67 65 20 29 3b 0a 20 20 20 20 20 20 70 42 74  age );.      pBt
21a10 2d 3e 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 3b  ->nPage = nPage;
21a20 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
21a30 67 65 28 70 50 61 67 65 31 29 3b 0a 20 20 20 20  ge(pPage1);.    
21a40 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 63 6f  }.    assert( co
21a50 75 6e 74 56 61 6c 69 64 43 75 72 73 6f 72 73 28  untValidCursors(
21a60 70 42 74 2c 20 31 29 3d 3d 30 20 29 3b 0a 20 20  pBt, 1)==0 );.  
21a70 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63    pBt->inTransac
21a80 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 52 45 41  tion = TRANS_REA
21a90 44 3b 0a 20 20 20 20 62 74 72 65 65 43 6c 65 61  D;.    btreeClea
21aa0 72 48 61 73 43 6f 6e 74 65 6e 74 28 70 42 74 29  rHasContent(pBt)
21ab0 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65 45 6e  ;.  }..  btreeEn
21ac0 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 29 3b  dTransaction(p);
21ad0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
21ae0 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
21af0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  n rc;.}../*.** S
21b00 74 61 72 74 20 61 20 73 74 61 74 65 6d 65 6e 74  tart a statement
21b10 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 2e   subtransaction.
21b20 20 54 68 65 20 73 75 62 74 72 61 6e 73 61 63 74   The subtransact
21b30 69 6f 6e 20 63 61 6e 20 62 65 20 72 6f 6c 6c 65  ion can be rolle
21b40 64 0a 2a 2a 20 62 61 63 6b 20 69 6e 64 65 70 65  d.** back indepe
21b50 6e 64 65 6e 74 6c 79 20 6f 66 20 74 68 65 20 6d  ndently of the m
21b60 61 69 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ain transaction.
21b70 20 59 6f 75 20 6d 75 73 74 20 73 74 61 72 74 20   You must start 
21b80 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 2a  a transaction .*
21b90 2a 20 62 65 66 6f 72 65 20 73 74 61 72 74 69 6e  * before startin
21ba0 67 20 61 20 73 75 62 74 72 61 6e 73 61 63 74 69  g a subtransacti
21bb0 6f 6e 2e 20 54 68 65 20 73 75 62 74 72 61 6e 73  on. The subtrans
21bc0 61 63 74 69 6f 6e 20 69 73 20 65 6e 64 65 64 20  action is ended 
21bd0 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 0a 2a  automatically .*
21be0 2a 20 69 66 20 74 68 65 20 6d 61 69 6e 20 74 72  * if the main tr
21bf0 61 6e 73 61 63 74 69 6f 6e 20 63 6f 6d 6d 69 74  ansaction commit
21c00 73 20 6f 72 20 72 6f 6c 6c 73 20 62 61 63 6b 2e  s or rolls back.
21c10 0a 2a 2a 0a 2a 2a 20 53 74 61 74 65 6d 65 6e 74  .**.** Statement
21c20 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 73   subtransactions
21c30 20 61 72 65 20 75 73 65 64 20 61 72 6f 75 6e 64   are used around
21c40 20 69 6e 64 69 76 69 64 75 61 6c 20 53 51 4c 20   individual SQL 
21c50 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2a 20 74 68  statements.** th
21c60 61 74 20 61 72 65 20 63 6f 6e 74 61 69 6e 65 64  at are contained
21c70 20 77 69 74 68 69 6e 20 61 20 42 45 47 49 4e 2e   within a BEGIN.
21c80 2e 2e 43 4f 4d 4d 49 54 20 62 6c 6f 63 6b 2e 20  ..COMMIT block. 
21c90 20 49 66 20 61 20 63 6f 6e 73 74 72 61 69 6e 74   If a constraint
21ca0 0a 2a 2a 20 65 72 72 6f 72 20 6f 63 63 75 72 73  .** error occurs
21cb0 20 77 69 74 68 69 6e 20 74 68 65 20 73 74 61 74   within the stat
21cc0 65 6d 65 6e 74 2c 20 74 68 65 20 65 66 66 65 63  ement, the effec
21cd0 74 20 6f 66 20 74 68 61 74 20 6f 6e 65 20 73 74  t of that one st
21ce0 61 74 65 6d 65 6e 74 0a 2a 2a 20 63 61 6e 20 62  atement.** can b
21cf0 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 77 69  e rolled back wi
21d00 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20  thout having to 
21d10 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 65 6e 74  rollback the ent
21d20 69 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ire transaction.
21d30 0a 2a 2a 0a 2a 2a 20 41 20 73 74 61 74 65 6d 65  .**.** A stateme
21d40 6e 74 20 73 75 62 2d 74 72 61 6e 73 61 63 74 69  nt sub-transacti
21d50 6f 6e 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65  on is implemente
21d60 64 20 61 73 20 61 6e 20 61 6e 6f 6e 79 6d 6f 75  d as an anonymou
21d70 73 20 73 61 76 65 70 6f 69 6e 74 2e 20 54 68 65  s savepoint. The
21d80 0a 2a 2a 20 76 61 6c 75 65 20 70 61 73 73 65 64  .** value passed
21d90 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70   as the second p
21da0 61 72 61 6d 65 74 65 72 20 69 73 20 74 68 65 20  arameter is the 
21db0 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  total number of 
21dc0 73 61 76 65 70 6f 69 6e 74 73 2c 0a 2a 2a 20 69  savepoints,.** i
21dd0 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 6e 65 77  ncluding the new
21de0 20 61 6e 6f 6e 79 6d 6f 75 73 20 73 61 76 65 70   anonymous savep
21df0 6f 69 6e 74 2c 20 6f 70 65 6e 20 6f 6e 20 74 68  oint, open on th
21e00 65 20 42 2d 54 72 65 65 2e 20 69 2e 65 2e 20 69  e B-Tree. i.e. i
21e10 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e  f there.** are n
21e20 6f 20 61 63 74 69 76 65 20 73 61 76 65 70 6f 69  o active savepoi
21e30 6e 74 73 20 61 6e 64 20 6e 6f 20 6f 74 68 65 72  nts and no other
21e40 20 73 74 61 74 65 6d 65 6e 74 2d 74 72 61 6e 73   statement-trans
21e50 61 63 74 69 6f 6e 73 20 6f 70 65 6e 2c 0a 2a 2a  actions open,.**
21e60 20 69 53 74 61 74 65 6d 65 6e 74 20 69 73 20 31   iStatement is 1
21e70 2e 20 54 68 69 73 20 61 6e 6f 6e 79 6d 6f 75 73  . This anonymous
21e80 20 73 61 76 65 70 6f 69 6e 74 20 63 61 6e 20 62   savepoint can b
21e90 65 20 72 65 6c 65 61 73 65 64 20 6f 72 20 72 6f  e released or ro
21ea0 6c 6c 65 64 20 62 61 63 6b 0a 2a 2a 20 75 73 69  lled back.** usi
21eb0 6e 67 20 74 68 65 20 73 71 6c 69 74 65 33 42 74  ng the sqlite3Bt
21ec0 72 65 65 53 61 76 65 70 6f 69 6e 74 28 29 20 66  reeSavepoint() f
21ed0 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20  unction..*/.int 
21ee0 73 71 6c 69 74 65 33 42 74 72 65 65 42 65 67 69  sqlite3BtreeBegi
21ef0 6e 53 74 6d 74 28 42 74 72 65 65 20 2a 70 2c 20  nStmt(Btree *p, 
21f00 69 6e 74 20 69 53 74 61 74 65 6d 65 6e 74 29 7b  int iStatement){
21f10 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53  .  int rc;.  BtS
21f20 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
21f30 70 42 74 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  pBt;.  sqlite3Bt
21f40 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 61  reeEnter(p);.  a
21f50 73 73 65 72 74 28 20 70 2d 3e 69 6e 54 72 61 6e  ssert( p->inTran
21f60 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29  s==TRANS_WRITE )
21f70 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 42 74  ;.  assert( (pBt
21f80 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53  ->btsFlags & BTS
21f90 5f 52 45 41 44 5f 4f 4e 4c 59 29 3d 3d 30 20 29  _READ_ONLY)==0 )
21fa0 3b 0a 20 20 61 73 73 65 72 74 28 20 69 53 74 61  ;.  assert( iSta
21fb0 74 65 6d 65 6e 74 3e 30 20 29 3b 0a 20 20 61 73  tement>0 );.  as
21fc0 73 65 72 74 28 20 69 53 74 61 74 65 6d 65 6e 74  sert( iStatement
21fd0 3e 70 2d 3e 64 62 2d 3e 6e 53 61 76 65 70 6f 69  >p->db->nSavepoi
21fe0 6e 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  nt );.  assert( 
21ff0 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
22000 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  on==TRANS_WRITE 
22010 29 3b 0a 20 20 2f 2a 20 41 74 20 74 68 65 20 70  );.  /* At the p
22020 61 67 65 72 20 6c 65 76 65 6c 2c 20 61 20 73 74  ager level, a st
22030 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74  atement transact
22040 69 6f 6e 20 69 73 20 61 20 73 61 76 65 70 6f 69  ion is a savepoi
22050 6e 74 20 77 69 74 68 0a 20 20 2a 2a 20 61 6e 20  nt with.  ** an 
22060 69 6e 64 65 78 20 67 72 65 61 74 65 72 20 74 68  index greater th
22070 61 6e 20 61 6c 6c 20 73 61 76 65 70 6f 69 6e 74  an all savepoint
22080 73 20 63 72 65 61 74 65 64 20 65 78 70 6c 69 63  s created explic
22090 69 74 6c 79 20 75 73 69 6e 67 0a 20 20 2a 2a 20  itly using.  ** 
220a0 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 2e 20  SQL statements. 
220b0 49 74 20 69 73 20 69 6c 6c 65 67 61 6c 20 74 6f  It is illegal to
220c0 20 6f 70 65 6e 2c 20 72 65 6c 65 61 73 65 20 6f   open, release o
220d0 72 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 79 0a 20  r rollback any. 
220e0 20 2a 2a 20 73 75 63 68 20 73 61 76 65 70 6f 69   ** such savepoi
220f0 6e 74 73 20 77 68 69 6c 65 20 74 68 65 20 73 74  nts while the st
22100 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74  atement transact
22110 69 6f 6e 20 73 61 76 65 70 6f 69 6e 74 20 69 73  ion savepoint is
22120 20 61 63 74 69 76 65 2e 0a 20 20 2a 2f 0a 20 20   active..  */.  
22130 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
22140 72 4f 70 65 6e 53 61 76 65 70 6f 69 6e 74 28 70  rOpenSavepoint(p
22150 42 74 2d 3e 70 50 61 67 65 72 2c 20 69 53 74 61  Bt->pPager, iSta
22160 74 65 6d 65 6e 74 29 3b 0a 20 20 73 71 6c 69 74  tement);.  sqlit
22170 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
22180 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
22190 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e  ./*.** The secon
221a0 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68  d argument to th
221b0 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 6f 70 2c  is function, op,
221c0 20 69 73 20 61 6c 77 61 79 73 20 53 41 56 45 50   is always SAVEP
221d0 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 0a 2a 2a  OINT_ROLLBACK.**
221e0 20 6f 72 20 53 41 56 45 50 4f 49 4e 54 5f 52 45   or SAVEPOINT_RE
221f0 4c 45 41 53 45 2e 20 54 68 69 73 20 66 75 6e 63  LEASE. This func
22200 74 69 6f 6e 20 65 69 74 68 65 72 20 72 65 6c 65  tion either rele
22210 61 73 65 73 20 6f 72 20 72 6f 6c 6c 73 20 62 61  ases or rolls ba
22220 63 6b 20 74 68 65 0a 2a 2a 20 73 61 76 65 70 6f  ck the.** savepo
22230 69 6e 74 20 69 64 65 6e 74 69 66 69 65 64 20 62  int identified b
22240 79 20 70 61 72 61 6d 65 74 65 72 20 69 53 61 76  y parameter iSav
22250 65 70 6f 69 6e 74 2c 20 64 65 70 65 6e 64 69 6e  epoint, dependin
22260 67 20 6f 6e 20 74 68 65 20 76 61 6c 75 65 20 0a  g on the value .
22270 2a 2a 20 6f 66 20 6f 70 2e 0a 2a 2a 0a 2a 2a 20  ** of op..**.** 
22280 4e 6f 72 6d 61 6c 6c 79 2c 20 69 53 61 76 65 70  Normally, iSavep
22290 6f 69 6e 74 20 69 73 20 67 72 65 61 74 65 72 20  oint is greater 
222a0 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f  than or equal to
222b0 20 7a 65 72 6f 2e 20 48 6f 77 65 76 65 72 2c 20   zero. However, 
222c0 69 66 20 6f 70 20 69 73 0a 2a 2a 20 53 41 56 45  if op is.** SAVE
222d0 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20  POINT_ROLLBACK, 
222e0 74 68 65 6e 20 69 53 61 76 65 70 6f 69 6e 74 20  then iSavepoint 
222f0 6d 61 79 20 61 6c 73 6f 20 62 65 20 2d 31 2e 20  may also be -1. 
22300 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
22310 20 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66   .** contents of
22320 20 74 68 65 20 65 6e 74 69 72 65 20 74 72 61 6e   the entire tran
22330 73 61 63 74 69 6f 6e 20 61 72 65 20 72 6f 6c 6c  saction are roll
22340 65 64 20 62 61 63 6b 2e 20 54 68 69 73 20 69 73  ed back. This is
22350 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 66 72   different.** fr
22360 6f 6d 20 61 20 6e 6f 72 6d 61 6c 20 74 72 61 6e  om a normal tran
22370 73 61 63 74 69 6f 6e 20 72 6f 6c 6c 62 61 63 6b  saction rollback
22380 2c 20 61 73 20 6e 6f 20 6c 6f 63 6b 73 20 61 72  , as no locks ar
22390 65 20 72 65 6c 65 61 73 65 64 20 61 6e 64 20 74  e released and t
223a0 68 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  he.** transactio
223b0 6e 20 72 65 6d 61 69 6e 73 20 6f 70 65 6e 2e 0a  n remains open..
223c0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
223d0 72 65 65 53 61 76 65 70 6f 69 6e 74 28 42 74 72  reeSavepoint(Btr
223e0 65 65 20 2a 70 2c 20 69 6e 74 20 6f 70 2c 20 69  ee *p, int op, i
223f0 6e 74 20 69 53 61 76 65 70 6f 69 6e 74 29 7b 0a  nt iSavepoint){.
22400 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
22410 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 20 26 26  E_OK;.  if( p &&
22420 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41   p->inTrans==TRA
22430 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20  NS_WRITE ){.    
22440 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
22450 70 2d 3e 70 42 74 3b 0a 20 20 20 20 61 73 73 65  p->pBt;.    asse
22460 72 74 28 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e  rt( op==SAVEPOIN
22470 54 5f 52 45 4c 45 41 53 45 20 7c 7c 20 6f 70 3d  T_RELEASE || op=
22480 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42  =SAVEPOINT_ROLLB
22490 41 43 4b 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ACK );.    asser
224a0 74 28 20 69 53 61 76 65 70 6f 69 6e 74 3e 3d 30  t( iSavepoint>=0
224b0 20 7c 7c 20 28 69 53 61 76 65 70 6f 69 6e 74 3d   || (iSavepoint=
224c0 3d 2d 31 20 26 26 20 6f 70 3d 3d 53 41 56 45 50  =-1 && op==SAVEP
224d0 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 29 20 29  OINT_ROLLBACK) )
224e0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  ;.    sqlite3Btr
224f0 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 20 20  eeEnter(p);.    
22500 69 66 28 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e  if( op==SAVEPOIN
22510 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20  T_ROLLBACK ){.  
22520 20 20 20 20 72 63 20 3d 20 73 61 76 65 41 6c 6c      rc = saveAll
22530 43 75 72 73 6f 72 73 28 70 42 74 2c 20 30 2c 20  Cursors(pBt, 0, 
22540 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  0);.    }.    if
22550 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
22560 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
22570 6c 69 74 65 33 50 61 67 65 72 53 61 76 65 70 6f  lite3PagerSavepo
22580 69 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  int(pBt->pPager,
22590 20 6f 70 2c 20 69 53 61 76 65 70 6f 69 6e 74 29   op, iSavepoint)
225a0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
225b0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
225c0 0a 20 20 20 20 20 20 69 66 28 20 69 53 61 76 65  .      if( iSave
225d0 70 6f 69 6e 74 3c 30 20 26 26 20 28 70 42 74 2d  point<0 && (pBt-
225e0 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f  >btsFlags & BTS_
225f0 49 4e 49 54 49 41 4c 4c 59 5f 45 4d 50 54 59 29  INITIALLY_EMPTY)
22600 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  !=0 ){.        p
22610 42 74 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 0a 20  Bt->nPage = 0;. 
22620 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20       }.      rc 
22630 3d 20 6e 65 77 44 61 74 61 62 61 73 65 28 70 42  = newDatabase(pB
22640 74 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e  t);.      pBt->n
22650 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28  Page = get4byte(
22660 32 38 20 2b 20 70 42 74 2d 3e 70 50 61 67 65 31  28 + pBt->pPage1
22670 2d 3e 61 44 61 74 61 29 3b 0a 0a 20 20 20 20 20  ->aData);..     
22680 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
22690 20 73 69 7a 65 20 77 61 73 20 77 72 69 74 74 65   size was writte
226a0 6e 20 69 6e 74 6f 20 74 68 65 20 6f 66 66 73 65  n into the offse
226b0 74 20 32 38 20 6f 66 20 74 68 65 20 68 65 61 64  t 28 of the head
226c0 65 72 0a 20 20 20 20 20 20 2a 2a 20 77 68 65 6e  er.      ** when
226d0 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
226e0 20 73 74 61 72 74 65 64 2c 20 73 6f 20 77 65 20   started, so we 
226f0 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20 76 61  know that the va
22700 6c 75 65 20 61 74 20 6f 66 66 73 65 74 0a 20 20  lue at offset.  
22710 20 20 20 20 2a 2a 20 32 38 20 69 73 20 6e 6f 6e      ** 28 is non
22720 7a 65 72 6f 2e 20 2a 2f 0a 20 20 20 20 20 20 61  zero. */.      a
22730 73 73 65 72 74 28 20 70 42 74 2d 3e 6e 50 61 67  ssert( pBt->nPag
22740 65 3e 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20  e>0 );.    }.   
22750 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
22760 76 65 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74  ve(p);.  }.  ret
22770 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
22780 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 63 75   Create a new cu
22790 72 73 6f 72 20 66 6f 72 20 74 68 65 20 42 54 72  rsor for the BTr
227a0 65 65 20 77 68 6f 73 65 20 72 6f 6f 74 20 69 73  ee whose root is
227b0 20 6f 6e 20 74 68 65 20 70 61 67 65 0a 2a 2a 20   on the page.** 
227c0 69 54 61 62 6c 65 2e 20 49 66 20 61 20 72 65 61  iTable. If a rea
227d0 64 2d 6f 6e 6c 79 20 63 75 72 73 6f 72 20 69 73  d-only cursor is
227e0 20 72 65 71 75 65 73 74 65 64 2c 20 69 74 20 69   requested, it i
227f0 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 0a 2a  s assumed that.*
22800 2a 20 74 68 65 20 63 61 6c 6c 65 72 20 61 6c 72  * the caller alr
22810 65 61 64 79 20 68 61 73 20 61 74 20 6c 65 61 73  eady has at leas
22820 74 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 74 72  t a read-only tr
22830 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 0a 2a  ansaction open.*
22840 2a 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  * on the databas
22850 65 20 61 6c 72 65 61 64 79 2e 20 49 66 20 61 20  e already. If a 
22860 77 72 69 74 65 2d 63 75 72 73 6f 72 20 69 73 20  write-cursor is 
22870 72 65 71 75 65 73 74 65 64 2c 20 74 68 65 6e 0a  requested, then.
22880 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73  ** the caller is
22890 20 61 73 73 75 6d 65 64 20 74 6f 20 68 61 76 65   assumed to have
228a0 20 61 6e 20 6f 70 65 6e 20 77 72 69 74 65 20 74   an open write t
228b0 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  ransaction..**.*
228c0 2a 20 49 66 20 74 68 65 20 42 54 52 45 45 5f 57  * If the BTREE_W
228d0 52 43 53 52 20 62 69 74 20 6f 66 20 77 72 46 6c  RCSR bit of wrFl
228e0 61 67 20 69 73 20 63 6c 65 61 72 2c 20 74 68 65  ag is clear, the
228f0 6e 20 74 68 65 20 63 75 72 73 6f 72 20 63 61 6e  n the cursor can
22900 20 6f 6e 6c 79 0a 2a 2a 20 62 65 20 75 73 65 64   only.** be used
22910 20 66 6f 72 20 72 65 61 64 69 6e 67 2e 20 20 49   for reading.  I
22920 66 20 74 68 65 20 42 54 52 45 45 5f 57 52 43 53  f the BTREE_WRCS
22930 52 20 62 69 74 20 69 73 20 73 65 74 2c 20 74 68  R bit is set, th
22940 65 6e 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a  en the cursor.**
22950 20 63 61 6e 20 62 65 20 75 73 65 64 20 66 6f 72   can be used for
22960 20 72 65 61 64 69 6e 67 20 6f 72 20 66 6f 72 20   reading or for 
22970 77 72 69 74 69 6e 67 20 69 66 20 6f 74 68 65 72  writing if other
22980 20 63 6f 6e 64 69 74 69 6f 6e 73 20 66 6f 72 20   conditions for 
22990 77 72 69 74 69 6e 67 0a 2a 2a 20 61 72 65 20 61  writing.** are a
229a0 6c 73 6f 20 6d 65 74 2e 20 20 54 68 65 73 65 20  lso met.  These 
229b0 61 72 65 20 74 68 65 20 63 6f 6e 64 69 74 69 6f  are the conditio
229c0 6e 73 20 74 68 61 74 20 6d 75 73 74 20 62 65 20  ns that must be 
229d0 6d 65 74 20 69 6e 20 6f 72 64 65 72 0a 2a 2a 20  met in order.** 
229e0 66 6f 72 20 77 72 69 74 69 6e 67 20 74 6f 20 62  for writing to b
229f0 65 20 61 6c 6c 6f 77 65 64 3a 0a 2a 2a 0a 2a 2a  e allowed:.**.**
22a00 20 31 3a 20 20 54 68 65 20 63 75 72 73 6f 72 20   1:  The cursor 
22a10 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e 20 6f  must have been o
22a20 70 65 6e 65 64 20 77 69 74 68 20 77 72 46 6c 61  pened with wrFla
22a30 67 20 63 6f 6e 74 61 69 6e 69 6e 67 20 42 54 52  g containing BTR
22a40 45 45 5f 57 52 43 53 52 0a 2a 2a 0a 2a 2a 20 32  EE_WRCSR.**.** 2
22a50 3a 20 20 4f 74 68 65 72 20 64 61 74 61 62 61 73  :  Other databas
22a60 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 68  e connections th
22a70 61 74 20 73 68 61 72 65 20 74 68 65 20 73 61 6d  at share the sam
22a80 65 20 70 61 67 65 72 20 63 61 63 68 65 0a 2a 2a  e pager cache.**
22a90 20 20 20 20 20 62 75 74 20 77 68 69 63 68 20 61       but which a
22aa0 72 65 20 6e 6f 74 20 69 6e 20 74 68 65 20 52 45  re not in the RE
22ab0 41 44 5f 55 4e 43 4f 4d 4d 49 54 54 45 44 20 73  AD_UNCOMMITTED s
22ac0 74 61 74 65 20 6d 61 79 20 6e 6f 74 20 68 61 76  tate may not hav
22ad0 65 0a 2a 2a 20 20 20 20 20 63 75 72 73 6f 72 73  e.**     cursors
22ae0 20 6f 70 65 6e 20 77 69 74 68 20 77 72 46 6c 61   open with wrFla
22af0 67 3d 3d 30 20 6f 6e 20 74 68 65 20 73 61 6d 65  g==0 on the same
22b00 20 74 61 62 6c 65 2e 20 20 4f 74 68 65 72 77 69   table.  Otherwi
22b10 73 65 0a 2a 2a 20 20 20 20 20 74 68 65 20 63 68  se.**     the ch
22b20 61 6e 67 65 73 20 6d 61 64 65 20 62 79 20 74 68  anges made by th
22b30 69 73 20 77 72 69 74 65 20 63 75 72 73 6f 72 20  is write cursor 
22b40 77 6f 75 6c 64 20 62 65 20 76 69 73 69 62 6c 65  would be visible
22b50 20 74 6f 0a 2a 2a 20 20 20 20 20 74 68 65 20 72   to.**     the r
22b60 65 61 64 20 63 75 72 73 6f 72 73 20 69 6e 20 74  ead cursors in t
22b70 68 65 20 6f 74 68 65 72 20 64 61 74 61 62 61 73  he other databas
22b80 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a  e connection..**
22b90 0a 2a 2a 20 33 3a 20 20 54 68 65 20 64 61 74 61  .** 3:  The data
22ba0 62 61 73 65 20 6d 75 73 74 20 62 65 20 77 72 69  base must be wri
22bb0 74 61 62 6c 65 20 28 6e 6f 74 20 6f 6e 20 72 65  table (not on re
22bc0 61 64 2d 6f 6e 6c 79 20 6d 65 64 69 61 29 0a 2a  ad-only media).*
22bd0 2a 0a 2a 2a 20 34 3a 20 20 54 68 65 72 65 20 6d  *.** 4:  There m
22be0 75 73 74 20 62 65 20 61 6e 20 61 63 74 69 76 65  ust be an active
22bf0 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
22c00 0a 2a 2a 20 54 68 65 20 42 54 52 45 45 5f 46 4f  .** The BTREE_FO
22c10 52 44 45 4c 45 54 45 20 62 69 74 20 6f 66 20 77  RDELETE bit of w
22c20 72 46 6c 61 67 20 6d 61 79 20 6f 70 74 69 6f 6e  rFlag may option
22c30 61 6c 6c 79 20 62 65 20 73 65 74 20 69 66 20 42  ally be set if B
22c40 54 52 45 45 5f 57 52 43 53 52 0a 2a 2a 20 69 73  TREE_WRCSR.** is
22c50 20 73 65 74 2e 20 20 49 66 20 46 4f 52 44 45 4c   set.  If FORDEL
22c60 45 54 45 20 69 73 20 73 65 74 2c 20 74 68 61 74  ETE is set, that
22c70 20 69 73 20 61 20 68 69 6e 74 20 74 6f 20 74 68   is a hint to th
22c80 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
22c90 20 74 68 61 74 0a 2a 2a 20 74 68 69 73 20 63 75   that.** this cu
22ca0 72 73 6f 72 20 77 69 6c 6c 20 6f 6e 6c 79 20 62  rsor will only b
22cb0 65 20 75 73 65 64 20 74 6f 20 73 65 65 6b 20 74  e used to seek t
22cc0 6f 20 61 6e 64 20 64 65 6c 65 74 65 20 65 6e 74  o and delete ent
22cd0 72 69 65 73 20 6f 66 20 61 6e 20 69 6e 64 65 78  ries of an index
22ce0 0a 2a 2a 20 61 73 20 70 61 72 74 20 6f 66 20 61  .** as part of a
22cf0 20 6c 61 72 67 65 72 20 44 45 4c 45 54 45 20 73   larger DELETE s
22d00 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 65 20 46  tatement.  The F
22d10 4f 52 44 45 4c 45 54 45 20 68 69 6e 74 20 69 73  ORDELETE hint is
22d20 20 6e 6f 74 20 75 73 65 64 20 62 79 0a 2a 2a 20   not used by.** 
22d30 74 68 69 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74  this implementat
22d40 69 6f 6e 2e 20 20 42 75 74 20 69 6e 20 61 20 68  ion.  But in a h
22d50 79 70 6f 74 68 65 74 69 63 61 6c 20 61 6c 74 65  ypothetical alte
22d60 72 6e 61 74 69 76 65 20 73 74 6f 72 61 67 65 20  rnative storage 
22d70 65 6e 67 69 6e 65 20 0a 2a 2a 20 69 6e 20 77 68  engine .** in wh
22d80 69 63 68 20 69 6e 64 65 78 20 65 6e 74 72 69 65  ich index entrie
22d90 73 20 61 72 65 20 61 75 74 6f 6d 61 74 69 63 61  s are automatica
22da0 6c 6c 79 20 64 65 6c 65 74 65 64 20 77 68 65 6e  lly deleted when
22db0 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
22dc0 61 62 6c 65 0a 2a 2a 20 72 6f 77 73 20 61 72 65  able.** rows are
22dd0 20 64 65 6c 65 74 65 64 2c 20 74 68 65 20 46 4f   deleted, the FO
22de0 52 44 45 4c 45 54 45 20 66 6c 61 67 20 69 73 20  RDELETE flag is 
22df0 61 20 68 69 6e 74 20 74 68 61 74 20 61 6c 6c 20  a hint that all 
22e00 53 45 45 4b 20 61 6e 64 20 44 45 4c 45 54 45 0a  SEEK and DELETE.
22e10 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 73 20 6f 6e  ** operations on
22e20 20 74 68 69 73 20 63 75 72 73 6f 72 20 63 61 6e   this cursor can
22e30 20 62 65 20 6e 6f 2d 6f 70 73 20 61 6e 64 20 61   be no-ops and a
22e40 6c 6c 20 52 45 41 44 20 6f 70 65 72 61 74 69 6f  ll READ operatio
22e50 6e 73 20 63 61 6e 20 0a 2a 2a 20 72 65 74 75 72  ns can .** retur
22e60 6e 20 61 20 6e 75 6c 6c 20 72 6f 77 20 28 32 2d  n a null row (2-
22e70 62 79 74 65 73 3a 20 30 78 30 31 20 30 78 30 30  bytes: 0x01 0x00
22e80 29 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 20 63 68 65 63  )..**.** No chec
22e90 6b 69 6e 67 20 69 73 20 64 6f 6e 65 20 74 6f 20  king is done to 
22ea0 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 70  make sure that p
22eb0 61 67 65 20 69 54 61 62 6c 65 20 72 65 61 6c 6c  age iTable reall
22ec0 79 20 69 73 20 74 68 65 0a 2a 2a 20 72 6f 6f 74  y is the.** root
22ed0 20 70 61 67 65 20 6f 66 20 61 20 62 2d 74 72 65   page of a b-tre
22ee0 65 2e 20 20 49 66 20 69 74 20 69 73 20 6e 6f 74  e.  If it is not
22ef0 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f  , then the curso
22f00 72 20 61 63 71 75 69 72 65 64 0a 2a 2a 20 77 69  r acquired.** wi
22f10 6c 6c 20 6e 6f 74 20 77 6f 72 6b 20 63 6f 72 72  ll not work corr
22f20 65 63 74 6c 79 2e 0a 2a 2a 0a 2a 2a 20 49 74 20  ectly..**.** It 
22f30 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 20  is assumed that 
22f40 74 68 65 20 73 71 6c 69 74 65 33 42 74 72 65 65  the sqlite3Btree
22f50 43 75 72 73 6f 72 5a 65 72 6f 28 29 20 68 61 73  CursorZero() has
22f60 20 62 65 65 6e 20 63 61 6c 6c 65 64 0a 2a 2a 20   been called.** 
22f70 6f 6e 20 70 43 75 72 20 74 6f 20 69 6e 69 74 69  on pCur to initi
22f80 61 6c 69 7a 65 20 74 68 65 20 6d 65 6d 6f 72 79  alize the memory
22f90 20 73 70 61 63 65 20 70 72 69 6f 72 20 74 6f 20   space prior to 
22fa0 69 6e 76 6f 6b 69 6e 67 20 74 68 69 73 20 72 6f  invoking this ro
22fb0 75 74 69 6e 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  utine..*/.static
22fc0 20 69 6e 74 20 62 74 72 65 65 43 75 72 73 6f 72   int btreeCursor
22fd0 28 0a 20 20 42 74 72 65 65 20 2a 70 2c 20 20 20  (.  Btree *p,   
22fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22ff0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
23000 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74  e btree */.  int
23010 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20   iTable,        
23020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23030 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65      /* Root page
23040 20 6f 66 20 74 61 62 6c 65 20 74 6f 20 6f 70 65   of table to ope
23050 6e 20 2a 2f 0a 20 20 69 6e 74 20 77 72 46 6c 61  n */.  int wrFla
23060 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g,              
23070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
23080 20 31 20 74 6f 20 77 72 69 74 65 2e 20 30 20 72   1 to write. 0 r
23090 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74  ead-only */.  st
230a0 72 75 63 74 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  ruct KeyInfo *pK
230b0 65 79 49 6e 66 6f 2c 20 20 20 20 20 20 20 20 20  eyInfo,         
230c0 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72       /* First ar
230d0 67 20 74 6f 20 63 6f 6d 70 61 72 69 73 6f 6e 20  g to comparison 
230e0 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 42 74  function */.  Bt
230f0 43 75 72 73 6f 72 20 2a 70 43 75 72 20 20 20 20  Cursor *pCur    
23100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23110 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20 66 6f       /* Space fo
23120 72 20 6e 65 77 20 63 75 72 73 6f 72 20 2a 2f 0a  r new cursor */.
23130 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
23140 42 74 20 3d 20 70 2d 3e 70 42 74 3b 20 20 20 20  Bt = p->pBt;    
23150 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
23160 68 61 72 65 64 20 62 2d 74 72 65 65 20 68 61 6e  hared b-tree han
23170 64 6c 65 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f  dle */.  BtCurso
23180 72 20 2a 70 58 3b 20 20 20 20 20 20 20 20 20 20  r *pX;          
23190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
231a0 2f 2a 20 4c 6f 6f 70 69 6e 67 20 6f 76 65 72 20  /* Looping over 
231b0 6f 74 68 65 72 20 61 6c 6c 20 63 75 72 73 6f 72  other all cursor
231c0 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  s */..  assert( 
231d0 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64  sqlite3BtreeHold
231e0 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61  sMutex(p) );.  a
231f0 73 73 65 72 74 28 20 77 72 46 6c 61 67 3d 3d 30  ssert( wrFlag==0
23200 20 0a 20 20 20 20 20 20 20 7c 7c 20 77 72 46 6c   .       || wrFl
23210 61 67 3d 3d 42 54 52 45 45 5f 57 52 43 53 52 20  ag==BTREE_WRCSR 
23220 0a 20 20 20 20 20 20 20 7c 7c 20 77 72 46 6c 61  .       || wrFla
23230 67 3d 3d 28 42 54 52 45 45 5f 57 52 43 53 52 7c  g==(BTREE_WRCSR|
23240 42 54 52 45 45 5f 46 4f 52 44 45 4c 45 54 45 29  BTREE_FORDELETE)
23250 20 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65   .  );..  /* The
23260 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72   following asser
23270 74 20 73 74 61 74 65 6d 65 6e 74 73 20 76 65 72  t statements ver
23280 69 66 79 20 74 68 61 74 20 69 66 20 74 68 69 73  ify that if this
23290 20 69 73 20 61 20 73 68 61 72 61 62 6c 65 20 0a   is a sharable .
232a0 20 20 2a 2a 20 62 2d 74 72 65 65 20 64 61 74 61    ** b-tree data
232b0 62 61 73 65 2c 20 74 68 65 20 63 6f 6e 6e 65 63  base, the connec
232c0 74 69 6f 6e 20 69 73 20 68 6f 6c 64 69 6e 67 20  tion is holding 
232d0 74 68 65 20 72 65 71 75 69 72 65 64 20 74 61 62  the required tab
232e0 6c 65 20 6c 6f 63 6b 73 2c 20 0a 20 20 2a 2a 20  le locks, .  ** 
232f0 61 6e 64 20 74 68 61 74 20 6e 6f 20 6f 74 68 65  and that no othe
23300 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 73  r connection has
23310 20 61 6e 79 20 6f 70 65 6e 20 63 75 72 73 6f 72   any open cursor
23320 20 74 68 61 74 20 63 6f 6e 66 6c 69 63 74 73 20   that conflicts 
23330 77 69 74 68 20 0a 20 20 2a 2a 20 74 68 69 73 20  with .  ** this 
23340 6c 6f 63 6b 2e 20 20 2a 2f 0a 20 20 61 73 73 65  lock.  */.  asse
23350 72 74 28 20 68 61 73 53 68 61 72 65 64 43 61 63  rt( hasSharedCac
23360 68 65 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 69  heTableLock(p, i
23370 54 61 62 6c 65 2c 20 70 4b 65 79 49 6e 66 6f 21  Table, pKeyInfo!
23380 3d 30 2c 20 28 77 72 46 6c 61 67 3f 32 3a 31 29  =0, (wrFlag?2:1)
23390 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 77  ) );.  assert( w
233a0 72 46 6c 61 67 3d 3d 30 20 7c 7c 20 21 68 61 73  rFlag==0 || !has
233b0 52 65 61 64 43 6f 6e 66 6c 69 63 74 73 28 70 2c  ReadConflicts(p,
233c0 20 69 54 61 62 6c 65 29 20 29 3b 0a 0a 20 20 2f   iTable) );..  /
233d0 2a 20 41 73 73 65 72 74 20 74 68 61 74 20 74 68  * Assert that th
233e0 65 20 63 61 6c 6c 65 72 20 68 61 73 20 6f 70 65  e caller has ope
233f0 6e 65 64 20 74 68 65 20 72 65 71 75 69 72 65 64  ned the required
23400 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 2a 2f   transaction. */
23410 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 6e  .  assert( p->in
23420 54 72 61 6e 73 3e 54 52 41 4e 53 5f 4e 4f 4e 45  Trans>TRANS_NONE
23430 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 77 72   );.  assert( wr
23440 46 6c 61 67 3d 3d 30 20 7c 7c 20 70 2d 3e 69 6e  Flag==0 || p->in
23450 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49  Trans==TRANS_WRI
23460 54 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  TE );.  assert( 
23470 70 42 74 2d 3e 70 50 61 67 65 31 20 26 26 20 70  pBt->pPage1 && p
23480 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74  Bt->pPage1->aDat
23490 61 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 77  a );.  assert( w
234a0 72 46 6c 61 67 3d 3d 30 20 7c 7c 20 28 70 42 74  rFlag==0 || (pBt
234b0 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53  ->btsFlags & BTS
234c0 5f 52 45 41 44 5f 4f 4e 4c 59 29 3d 3d 30 20 29  _READ_ONLY)==0 )
234d0 3b 0a 0a 20 20 69 66 28 20 77 72 46 6c 61 67 20  ;..  if( wrFlag 
234e0 29 7b 0a 20 20 20 20 61 6c 6c 6f 63 61 74 65 54  ){.    allocateT
234f0 65 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20  empSpace(pBt);. 
23500 20 20 20 69 66 28 20 70 42 74 2d 3e 70 54 6d 70     if( pBt->pTmp
23510 53 70 61 63 65 3d 3d 30 20 29 20 72 65 74 75 72  Space==0 ) retur
23520 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  n SQLITE_NOMEM_B
23530 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69  KPT;.  }.  if( i
23540 54 61 62 6c 65 3d 3d 31 20 26 26 20 62 74 72 65  Table==1 && btre
23550 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 3d  ePagecount(pBt)=
23560 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  =0 ){.    assert
23570 28 20 77 72 46 6c 61 67 3d 3d 30 20 29 3b 0a 20  ( wrFlag==0 );. 
23580 20 20 20 69 54 61 62 6c 65 20 3d 20 30 3b 0a 20     iTable = 0;. 
23590 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20 74 68 61   }..  /* Now tha
235a0 74 20 6e 6f 20 6f 74 68 65 72 20 65 72 72 6f 72  t no other error
235b0 73 20 63 61 6e 20 6f 63 63 75 72 2c 20 66 69 6e  s can occur, fin
235c0 69 73 68 20 66 69 6c 6c 69 6e 67 20 69 6e 20 74  ish filling in t
235d0 68 65 20 42 74 43 75 72 73 6f 72 0a 20 20 2a 2a  he BtCursor.  **
235e0 20 76 61 72 69 61 62 6c 65 73 20 61 6e 64 20 6c   variables and l
235f0 69 6e 6b 20 74 68 65 20 63 75 72 73 6f 72 20 69  ink the cursor i
23600 6e 74 6f 20 74 68 65 20 42 74 53 68 61 72 65 64  nto the BtShared
23610 20 6c 69 73 74 2e 20 20 2a 2f 0a 20 20 70 43 75   list.  */.  pCu
23620 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20 3d 20 28 50  r->pgnoRoot = (P
23630 67 6e 6f 29 69 54 61 62 6c 65 3b 0a 20 20 70 43  gno)iTable;.  pC
23640 75 72 2d 3e 69 50 61 67 65 20 3d 20 2d 31 3b 0a  ur->iPage = -1;.
23650 20 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f    pCur->pKeyInfo
23660 20 3d 20 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 70   = pKeyInfo;.  p
23670 43 75 72 2d 3e 70 42 74 72 65 65 20 3d 20 70 3b  Cur->pBtree = p;
23680 0a 20 20 70 43 75 72 2d 3e 70 42 74 20 3d 20 70  .  pCur->pBt = p
23690 42 74 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72 46  Bt;.  pCur->curF
236a0 6c 61 67 73 20 3d 20 77 72 46 6c 61 67 20 3f 20  lags = wrFlag ? 
236b0 42 54 43 46 5f 57 72 69 74 65 46 6c 61 67 20 3a  BTCF_WriteFlag :
236c0 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72 50   0;.  pCur->curP
236d0 61 67 65 72 46 6c 61 67 73 20 3d 20 77 72 46 6c  agerFlags = wrFl
236e0 61 67 20 3f 20 30 20 3a 20 50 41 47 45 52 5f 47  ag ? 0 : PAGER_G
236f0 45 54 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 2f  ET_READONLY;.  /
23700 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 74  * If there are t
23710 77 6f 20 6f 72 20 6d 6f 72 65 20 63 75 72 73 6f  wo or more curso
23720 72 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 62  rs on the same b
23730 74 72 65 65 2c 20 74 68 65 6e 20 61 6c 6c 20 73  tree, then all s
23740 75 63 68 0a 20 20 2a 2a 20 63 75 72 73 6f 72 73  uch.  ** cursors
23750 20 2a 6d 75 73 74 2a 20 68 61 76 65 20 74 68 65   *must* have the
23760 20 42 54 43 46 5f 4d 75 6c 74 69 70 6c 65 20 66   BTCF_Multiple f
23770 6c 61 67 20 73 65 74 2e 20 2a 2f 0a 20 20 66 6f  lag set. */.  fo
23780 72 28 70 58 3d 70 42 74 2d 3e 70 43 75 72 73 6f  r(pX=pBt->pCurso
23790 72 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70 4e  r; pX; pX=pX->pN
237a0 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 58  ext){.    if( pX
237b0 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 28 50 67 6e  ->pgnoRoot==(Pgn
237c0 6f 29 69 54 61 62 6c 65 20 29 7b 0a 20 20 20 20  o)iTable ){.    
237d0 20 20 70 58 2d 3e 63 75 72 46 6c 61 67 73 20 7c    pX->curFlags |
237e0 3d 20 42 54 43 46 5f 4d 75 6c 74 69 70 6c 65 3b  = BTCF_Multiple;
237f0 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 63 75 72  .      pCur->cur
23800 46 6c 61 67 73 20 7c 3d 20 42 54 43 46 5f 4d 75  Flags |= BTCF_Mu
23810 6c 74 69 70 6c 65 3b 0a 20 20 20 20 7d 0a 20 20  ltiple;.    }.  
23820 7d 0a 20 20 70 43 75 72 2d 3e 70 4e 65 78 74 20  }.  pCur->pNext 
23830 3d 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 0a  = pBt->pCursor;.
23840 20 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d    pBt->pCursor =
23850 20 70 43 75 72 3b 0a 20 20 70 43 75 72 2d 3e 65   pCur;.  pCur->e
23860 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49  State = CURSOR_I
23870 4e 56 41 4c 49 44 3b 0a 20 20 72 65 74 75 72 6e  NVALID;.  return
23880 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 69 6e   SQLITE_OK;.}.in
23890 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  t sqlite3BtreeCu
238a0 72 73 6f 72 28 0a 20 20 42 74 72 65 65 20 2a 70  rsor(.  Btree *p
238b0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
238c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
238d0 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65      /* The btree
238e0 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65   */.  int iTable
238f0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
23900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23910 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f    /* Root page o
23920 66 20 74 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20  f table to open 
23930 2a 2f 0a 20 20 69 6e 74 20 77 72 46 6c 61 67 2c  */.  int wrFlag,
23940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23960 20 2f 2a 20 31 20 74 6f 20 77 72 69 74 65 2e 20   /* 1 to write. 
23970 30 20 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20  0 read-only */. 
23980 20 73 74 72 75 63 74 20 4b 65 79 49 6e 66 6f 20   struct KeyInfo 
23990 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20 20  *pKeyInfo,      
239a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
239b0 46 69 72 73 74 20 61 72 67 20 74 6f 20 78 43 6f  First arg to xCo
239c0 6d 70 61 72 65 28 29 20 2a 2f 0a 20 20 42 74 43  mpare() */.  BtC
239d0 75 72 73 6f 72 20 2a 70 43 75 72 20 20 20 20 20  ursor *pCur     
239e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
239f0 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
23a00 65 20 6e 65 77 20 63 75 72 73 6f 72 20 68 65 72  e new cursor her
23a10 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  e */.){.  int rc
23a20 3b 0a 20 20 69 66 28 20 69 54 61 62 6c 65 3c 31  ;.  if( iTable<1
23a30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
23a40 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
23a50 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
23a60 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
23a70 28 70 29 3b 0a 20 20 20 20 72 63 20 3d 20 62 74  (p);.    rc = bt
23a80 72 65 65 43 75 72 73 6f 72 28 70 2c 20 69 54 61  reeCursor(p, iTa
23a90 62 6c 65 2c 20 77 72 46 6c 61 67 2c 20 70 4b 65  ble, wrFlag, pKe
23aa0 79 49 6e 66 6f 2c 20 70 43 75 72 29 3b 0a 20 20  yInfo, pCur);.  
23ab0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
23ac0 61 76 65 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65  ave(p);.  }.  re
23ad0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
23ae0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73 69 7a  * Return the siz
23af0 65 20 6f 66 20 61 20 42 74 43 75 72 73 6f 72 20  e of a BtCursor 
23b00 6f 62 6a 65 63 74 20 69 6e 20 62 79 74 65 73 2e  object in bytes.
23b10 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 6e 74 65  .**.** This inte
23b20 72 66 61 63 65 73 20 69 73 20 6e 65 65 64 65 64  rfaces is needed
23b30 20 73 6f 20 74 68 61 74 20 75 73 65 72 73 20 6f   so that users o
23b40 66 20 63 75 72 73 6f 72 73 20 63 61 6e 20 70 72  f cursors can pr
23b50 65 61 6c 6c 6f 63 61 74 65 0a 2a 2a 20 73 75 66  eallocate.** suf
23b60 66 69 63 69 65 6e 74 20 73 74 6f 72 61 67 65 20  ficient storage 
23b70 74 6f 20 68 6f 6c 64 20 61 20 63 75 72 73 6f 72  to hold a cursor
23b80 2e 20 20 54 68 65 20 42 74 43 75 72 73 6f 72 20  .  The BtCursor 
23b90 6f 62 6a 65 63 74 20 69 73 20 6f 70 61 71 75 65  object is opaque
23ba0 0a 2a 2a 20 74 6f 20 75 73 65 72 73 20 73 6f 20  .** to users so 
23bb0 74 68 65 79 20 63 61 6e 6e 6f 74 20 64 6f 20 74  they cannot do t
23bc0 68 65 20 73 69 7a 65 6f 66 28 29 20 74 68 65 6d  he sizeof() them
23bd0 73 65 6c 76 65 73 20 2d 20 74 68 65 79 20 6d 75  selves - they mu
23be0 73 74 20 63 61 6c 6c 0a 2a 2a 20 74 68 69 73 20  st call.** this 
23bf0 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 69 6e 74 20  routine..*/.int 
23c00 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
23c10 6f 72 53 69 7a 65 28 76 6f 69 64 29 7b 0a 20 20  orSize(void){.  
23c20 72 65 74 75 72 6e 20 52 4f 55 4e 44 38 28 73 69  return ROUND8(si
23c30 7a 65 6f 66 28 42 74 43 75 72 73 6f 72 29 29 3b  zeof(BtCursor));
23c40 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61  .}../*.** Initia
23c50 6c 69 7a 65 20 6d 65 6d 6f 72 79 20 74 68 61 74  lize memory that
23c60 20 77 69 6c 6c 20 62 65 20 63 6f 6e 76 65 72 74   will be convert
23c70 65 64 20 69 6e 74 6f 20 61 20 42 74 43 75 72 73  ed into a BtCurs
23c80 6f 72 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a  or object..**.**
23c90 20 54 68 65 20 73 69 6d 70 6c 65 20 61 70 70 72   The simple appr
23ca0 6f 61 63 68 20 68 65 72 65 20 77 6f 75 6c 64 20  oach here would 
23cb0 62 65 20 74 6f 20 6d 65 6d 73 65 74 28 29 20 74  be to memset() t
23cc0 68 65 20 65 6e 74 69 72 65 20 6f 62 6a 65 63 74  he entire object
23cd0 0a 2a 2a 20 74 6f 20 7a 65 72 6f 2e 20 20 42 75  .** to zero.  Bu
23ce0 74 20 69 74 20 74 75 72 6e 73 20 6f 75 74 20 74  t it turns out t
23cf0 68 61 74 20 74 68 65 20 61 70 50 61 67 65 5b 5d  hat the apPage[]
23d00 20 61 6e 64 20 61 69 49 64 78 5b 5d 20 61 72 72   and aiIdx[] arr
23d10 61 79 73 0a 2a 2a 20 64 6f 20 6e 6f 74 20 6e 65  ays.** do not ne
23d20 65 64 20 74 6f 20 62 65 20 7a 65 72 6f 65 64 20  ed to be zeroed 
23d30 61 6e 64 20 74 68 65 79 20 61 72 65 20 6c 61 72  and they are lar
23d40 67 65 2c 20 73 6f 20 77 65 20 63 61 6e 20 73 61  ge, so we can sa
23d50 76 65 20 61 20 6c 6f 74 0a 2a 2a 20 6f 66 20 72  ve a lot.** of r
23d60 75 6e 2d 74 69 6d 65 20 62 79 20 73 6b 69 70 70  un-time by skipp
23d70 69 6e 67 20 74 68 65 20 69 6e 69 74 69 61 6c 69  ing the initiali
23d80 7a 61 74 69 6f 6e 20 6f 66 20 74 68 6f 73 65 20  zation of those 
23d90 65 6c 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 76 6f 69  elements..*/.voi
23da0 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  d sqlite3BtreeCu
23db0 72 73 6f 72 5a 65 72 6f 28 42 74 43 75 72 73 6f  rsorZero(BtCurso
23dc0 72 20 2a 70 29 7b 0a 20 20 6d 65 6d 73 65 74 28  r *p){.  memset(
23dd0 70 2c 20 30 2c 20 6f 66 66 73 65 74 6f 66 28 42  p, 0, offsetof(B
23de0 74 43 75 72 73 6f 72 2c 20 69 50 61 67 65 29 29  tCursor, iPage))
23df0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  ;.}../*.** Close
23e00 20 61 20 63 75 72 73 6f 72 2e 20 20 54 68 65 20   a cursor.  The 
23e10 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  read lock on the
23e20 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
23e30 73 20 72 65 6c 65 61 73 65 64 0a 2a 2a 20 77 68  s released.** wh
23e40 65 6e 20 74 68 65 20 6c 61 73 74 20 63 75 72 73  en the last curs
23e50 6f 72 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2f  or is closed..*/
23e60 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
23e70 65 43 6c 6f 73 65 43 75 72 73 6f 72 28 42 74 43  eCloseCursor(BtC
23e80 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
23e90 42 74 72 65 65 20 2a 70 42 74 72 65 65 20 3d 20  Btree *pBtree = 
23ea0 70 43 75 72 2d 3e 70 42 74 72 65 65 3b 0a 20 20  pCur->pBtree;.  
23eb0 69 66 28 20 70 42 74 72 65 65 20 29 7b 0a 20 20  if( pBtree ){.  
23ec0 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 42 74 53    int i;.    BtS
23ed0 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 43 75  hared *pBt = pCu
23ee0 72 2d 3e 70 42 74 3b 0a 20 20 20 20 73 71 6c 69  r->pBt;.    sqli
23ef0 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 42  te3BtreeEnter(pB
23f00 74 72 65 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  tree);.    sqlit
23f10 65 33 42 74 72 65 65 43 6c 65 61 72 43 75 72 73  e3BtreeClearCurs
23f20 6f 72 28 70 43 75 72 29 3b 0a 20 20 20 20 61 73  or(pCur);.    as
23f30 73 65 72 74 28 20 70 42 74 2d 3e 70 43 75 72 73  sert( pBt->pCurs
23f40 6f 72 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  or!=0 );.    if(
23f50 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 3d 3d 70   pBt->pCursor==p
23f60 43 75 72 20 29 7b 0a 20 20 20 20 20 20 70 42 74  Cur ){.      pBt
23f70 2d 3e 70 43 75 72 73 6f 72 20 3d 20 70 43 75 72  ->pCursor = pCur
23f80 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 65 6c  ->pNext;.    }el
23f90 73 65 7b 0a 20 20 20 20 20 20 42 74 43 75 72 73  se{.      BtCurs
23fa0 6f 72 20 2a 70 50 72 65 76 20 3d 20 70 42 74 2d  or *pPrev = pBt-
23fb0 3e 70 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20  >pCursor;.      
23fc0 64 6f 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  do{.        if( 
23fd0 70 50 72 65 76 2d 3e 70 4e 65 78 74 3d 3d 70 43  pPrev->pNext==pC
23fe0 75 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ur ){.          
23ff0 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70  pPrev->pNext = p
24000 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  Cur->pNext;.    
24010 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
24020 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70       }.        p
24030 50 72 65 76 20 3d 20 70 50 72 65 76 2d 3e 70 4e  Prev = pPrev->pN
24040 65 78 74 3b 0a 20 20 20 20 20 20 7d 77 68 69 6c  ext;.      }whil
24050 65 28 20 41 4c 57 41 59 53 28 70 50 72 65 76 29  e( ALWAYS(pPrev)
24060 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f   );.    }.    fo
24070 72 28 69 3d 30 3b 20 69 3c 3d 70 43 75 72 2d 3e  r(i=0; i<=pCur->
24080 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20  iPage; i++){.   
24090 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
240a0 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d 29 3b  Cur->apPage[i]);
240b0 0a 20 20 20 20 7d 0a 20 20 20 20 75 6e 6c 6f 63  .    }.    unloc
240c0 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 70  kBtreeIfUnused(p
240d0 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Bt);.    sqlite3
240e0 5f 66 72 65 65 28 70 43 75 72 2d 3e 61 4f 76 65  _free(pCur->aOve
240f0 72 66 6c 6f 77 29 3b 0a 20 20 20 20 2f 2a 20 73  rflow);.    /* s
24100 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75 72  qlite3_free(pCur
24110 29 3b 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  ); */.    sqlite
24120 33 42 74 72 65 65 4c 65 61 76 65 28 70 42 74 72  3BtreeLeave(pBtr
24130 65 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ee);.  }.  retur
24140 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
24150 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20  /*.** Make sure 
24160 74 68 65 20 42 74 43 75 72 73 6f 72 2a 20 67 69  the BtCursor* gi
24170 76 65 6e 20 69 6e 20 74 68 65 20 61 72 67 75 6d  ven in the argum
24180 65 6e 74 20 68 61 73 20 61 20 76 61 6c 69 64 0a  ent has a valid.
24190 2a 2a 20 42 74 43 75 72 73 6f 72 2e 69 6e 66 6f  ** BtCursor.info
241a0 20 73 74 72 75 63 74 75 72 65 2e 20 20 49 66 20   structure.  If 
241b0 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  it is not alread
241c0 79 20 76 61 6c 69 64 2c 20 63 61 6c 6c 0a 2a 2a  y valid, call.**
241d0 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28   btreeParseCell(
241e0 29 20 74 6f 20 66 69 6c 6c 20 69 74 20 69 6e 2e  ) to fill it in.
241f0 0a 2a 2a 0a 2a 2a 20 42 74 43 75 72 73 6f 72 2e  .**.** BtCursor.
24200 69 6e 66 6f 20 69 73 20 61 20 63 61 63 68 65 20  info is a cache 
24210 6f 66 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69  of the informati
24220 6f 6e 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e  on in the curren
24230 74 20 63 65 6c 6c 2e 0a 2a 2a 20 55 73 69 6e 67  t cell..** Using
24240 20 74 68 69 73 20 63 61 63 68 65 20 72 65 64 75   this cache redu
24250 63 65 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ces the number o
24260 66 20 63 61 6c 6c 73 20 74 6f 20 62 74 72 65 65  f calls to btree
24270 50 61 72 73 65 43 65 6c 6c 28 29 2e 0a 2a 2f 0a  ParseCell()..*/.
24280 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20  #ifndef NDEBUG. 
24290 20 73 74 61 74 69 63 20 76 6f 69 64 20 61 73 73   static void ass
242a0 65 72 74 43 65 6c 6c 49 6e 66 6f 28 42 74 43 75  ertCellInfo(BtCu
242b0 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 20  rsor *pCur){.   
242c0 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a   CellInfo info;.
242d0 20 20 20 20 69 6e 74 20 69 50 61 67 65 20 3d 20      int iPage = 
242e0 70 43 75 72 2d 3e 69 50 61 67 65 3b 0a 20 20 20  pCur->iPage;.   
242f0 20 6d 65 6d 73 65 74 28 26 69 6e 66 6f 2c 20 30   memset(&info, 0
24300 2c 20 73 69 7a 65 6f 66 28 69 6e 66 6f 29 29 3b  , sizeof(info));
24310 0a 20 20 20 20 62 74 72 65 65 50 61 72 73 65 43  .    btreeParseC
24320 65 6c 6c 28 70 43 75 72 2d 3e 61 70 50 61 67 65  ell(pCur->apPage
24330 5b 69 50 61 67 65 5d 2c 20 70 43 75 72 2d 3e 61  [iPage], pCur->a
24340 69 49 64 78 5b 69 50 61 67 65 5d 2c 20 26 69 6e  iIdx[iPage], &in
24350 66 6f 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  fo);.    assert(
24360 20 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20 6d   CORRUPT_DB || m
24370 65 6d 63 6d 70 28 26 69 6e 66 6f 2c 20 26 70 43  emcmp(&info, &pC
24380 75 72 2d 3e 69 6e 66 6f 2c 20 73 69 7a 65 6f 66  ur->info, sizeof
24390 28 69 6e 66 6f 29 29 3d 3d 30 20 29 3b 0a 20 20  (info))==0 );.  
243a0 7d 0a 23 65 6c 73 65 0a 20 20 23 64 65 66 69 6e  }.#else.  #defin
243b0 65 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f  e assertCellInfo
243c0 28 78 29 0a 23 65 6e 64 69 66 0a 73 74 61 74 69  (x).#endif.stati
243d0 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e  c SQLITE_NOINLIN
243e0 45 20 76 6f 69 64 20 67 65 74 43 65 6c 6c 49 6e  E void getCellIn
243f0 66 6f 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  fo(BtCursor *pCu
24400 72 29 7b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e  r){.  if( pCur->
24410 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 7b  info.nSize==0 ){
24420 0a 20 20 20 20 69 6e 74 20 69 50 61 67 65 20 3d  .    int iPage =
24430 20 70 43 75 72 2d 3e 69 50 61 67 65 3b 0a 20 20   pCur->iPage;.  
24440 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73    pCur->curFlags
24450 20 7c 3d 20 42 54 43 46 5f 56 61 6c 69 64 4e 4b   |= BTCF_ValidNK
24460 65 79 3b 0a 20 20 20 20 62 74 72 65 65 50 61 72  ey;.    btreePar
24470 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e 61 70 50  seCell(pCur->apP
24480 61 67 65 5b 69 50 61 67 65 5d 2c 70 43 75 72 2d  age[iPage],pCur-
24490 3e 61 69 49 64 78 5b 69 50 61 67 65 5d 2c 26 70  >aiIdx[iPage],&p
244a0 43 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20 20 7d 65  Cur->info);.  }e
244b0 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 43  lse{.    assertC
244c0 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20  ellInfo(pCur);. 
244d0 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 4e 44   }.}..#ifndef ND
244e0 45 42 55 47 20 20 2f 2a 20 54 68 65 20 6e 65 78  EBUG  /* The nex
244f0 74 20 72 6f 75 74 69 6e 65 20 75 73 65 64 20 6f  t routine used o
24500 6e 6c 79 20 77 69 74 68 69 6e 20 61 73 73 65 72  nly within asser
24510 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20 2a  t() statements *
24520 2f 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  /./*.** Return t
24530 72 75 65 20 69 66 20 74 68 65 20 67 69 76 65 6e  rue if the given
24540 20 42 74 43 75 72 73 6f 72 20 69 73 20 76 61 6c   BtCursor is val
24550 69 64 2e 20 20 41 20 76 61 6c 69 64 20 63 75 72  id.  A valid cur
24560 73 6f 72 20 69 73 20 6f 6e 65 0a 2a 2a 20 74 68  sor is one.** th
24570 61 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  at is currently 
24580 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20 72 6f  pointing to a ro
24590 77 20 69 6e 20 61 20 28 6e 6f 6e 2d 65 6d 70 74  w in a (non-empt
245a0 79 29 20 74 61 62 6c 65 2e 0a 2a 2a 20 54 68 69  y) table..** Thi
245b0 73 20 69 73 20 61 20 76 65 72 69 66 69 63 61 74  s is a verificat
245c0 69 6f 6e 20 72 6f 75 74 69 6e 65 20 69 73 20 75  ion routine is u
245d0 73 65 64 20 6f 6e 6c 79 20 77 69 74 68 69 6e 20  sed only within 
245e0 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65  assert() stateme
245f0 6e 74 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  nts..*/.int sqli
24600 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 49 73  te3BtreeCursorIs
24610 56 61 6c 69 64 28 42 74 43 75 72 73 6f 72 20 2a  Valid(BtCursor *
24620 70 43 75 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  pCur){.  return 
24630 70 43 75 72 20 26 26 20 70 43 75 72 2d 3e 65 53  pCur && pCur->eS
24640 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
24650 49 44 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ID;.}.#endif /* 
24660 4e 44 45 42 55 47 20 2a 2f 0a 69 6e 74 20 73 71  NDEBUG */.int sq
24670 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
24680 49 73 56 61 6c 69 64 4e 4e 28 42 74 43 75 72 73  IsValidNN(BtCurs
24690 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73 73  or *pCur){.  ass
246a0 65 72 74 28 20 70 43 75 72 21 3d 30 20 29 3b 0a  ert( pCur!=0 );.
246b0 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 65    return pCur->e
246c0 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
246d0 4c 49 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  LID;.}../*.** Re
246e0 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20 6f  turn the value o
246f0 66 20 74 68 65 20 69 6e 74 65 67 65 72 20 6b 65  f the integer ke
24700 79 20 6f 72 20 22 72 6f 77 69 64 22 20 66 6f 72  y or "rowid" for
24710 20 61 20 74 61 62 6c 65 20 62 74 72 65 65 2e 0a   a table btree..
24720 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
24730 69 73 20 6f 6e 6c 79 20 76 61 6c 69 64 20 66 6f  is only valid fo
24740 72 20 61 20 63 75 72 73 6f 72 20 74 68 61 74 20  r a cursor that 
24750 69 73 20 70 6f 69 6e 74 69 6e 67 20 69 6e 74 6f  is pointing into
24760 20 61 0a 2a 2a 20 6f 72 64 69 6e 61 72 79 20 74   a.** ordinary t
24770 61 62 6c 65 20 62 74 72 65 65 2e 20 20 49 66 20  able btree.  If 
24780 74 68 65 20 63 75 72 73 6f 72 20 70 6f 69 6e 74  the cursor point
24790 73 20 74 6f 20 61 6e 20 69 6e 64 65 78 20 62 74  s to an index bt
247a0 72 65 65 20 6f 72 0a 2a 2a 20 69 73 20 69 6e 76  ree or.** is inv
247b0 61 6c 69 64 2c 20 74 68 65 20 72 65 73 75 6c 74  alid, the result
247c0 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65   of this routine
247d0 20 69 73 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a   is undefined..*
247e0 2f 0a 69 36 34 20 73 71 6c 69 74 65 33 42 74 72  /.i64 sqlite3Btr
247f0 65 65 49 6e 74 65 67 65 72 4b 65 79 28 42 74 43  eeIntegerKey(BtC
24800 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
24810 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
24820 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
24830 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
24840 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
24850 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65  _VALID );.  asse
24860 72 74 28 20 70 43 75 72 2d 3e 63 75 72 49 6e 74  rt( pCur->curInt
24870 4b 65 79 20 29 3b 0a 20 20 67 65 74 43 65 6c 6c  Key );.  getCell
24880 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 72 65  Info(pCur);.  re
24890 74 75 72 6e 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  turn pCur->info.
248a0 6e 4b 65 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  nKey;.}../*.** R
248b0 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
248c0 20 6f 66 20 62 79 74 65 73 20 6f 66 20 70 61 79   of bytes of pay
248d0 6c 6f 61 64 20 66 6f 72 20 74 68 65 20 65 6e 74  load for the ent
248e0 72 79 20 74 68 61 74 20 70 43 75 72 20 69 73 0a  ry that pCur is.
248f0 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69  ** currently poi
24900 6e 74 69 6e 67 20 74 6f 2e 20 20 46 6f 72 20 74  nting to.  For t
24910 61 62 6c 65 20 62 74 72 65 65 73 2c 20 74 68 69  able btrees, thi
24920 73 20 77 69 6c 6c 20 62 65 20 74 68 65 20 61 6d  s will be the am
24930 6f 75 6e 74 0a 2a 2a 20 6f 66 20 64 61 74 61 2e  ount.** of data.
24940 20 20 46 6f 72 20 69 6e 64 65 78 20 62 74 72 65    For index btre
24950 65 73 2c 20 74 68 69 73 20 77 69 6c 6c 20 62 65  es, this will be
24960 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
24970 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20   key..**.** The 
24980 63 61 6c 6c 65 72 20 6d 75 73 74 20 67 75 61 72  caller must guar
24990 61 6e 74 65 65 20 74 68 61 74 20 74 68 65 20 63  antee that the c
249a0 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e  ursor is pointin
249b0 67 20 74 6f 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 0a  g to a non-NULL.
249c0 2a 2a 20 76 61 6c 69 64 20 65 6e 74 72 79 2e 20  ** valid entry. 
249d0 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
249e0 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 70 72 6f   the calling pro
249f0 63 65 64 75 72 65 20 6d 75 73 74 20 67 75 61 72  cedure must guar
24a00 61 6e 74 65 65 0a 2a 2a 20 74 68 61 74 20 74 68  antee.** that th
24a10 65 20 63 75 72 73 6f 72 20 68 61 73 20 43 75 72  e cursor has Cur
24a20 73 6f 72 2e 65 53 74 61 74 65 3d 3d 43 55 52 53  sor.eState==CURS
24a30 4f 52 5f 56 41 4c 49 44 2e 0a 2a 2f 0a 75 33 32  OR_VALID..*/.u32
24a40 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 79   sqlite3BtreePay
24a50 6c 6f 61 64 53 69 7a 65 28 42 74 43 75 72 73 6f  loadSize(BtCurso
24a60 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73 73 65  r *pCur){.  asse
24a70 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
24a80 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
24a90 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
24aa0 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
24ab0 49 44 20 29 3b 0a 20 20 67 65 74 43 65 6c 6c 49  ID );.  getCellI
24ac0 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 72 65 74  nfo(pCur);.  ret
24ad0 75 72 6e 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  urn pCur->info.n
24ae0 50 61 79 6c 6f 61 64 3b 0a 7d 0a 0a 2f 2a 0a 2a  Payload;.}../*.*
24af0 2a 20 47 69 76 65 6e 20 74 68 65 20 70 61 67 65  * Given the page
24b00 20 6e 75 6d 62 65 72 20 6f 66 20 61 6e 20 6f 76   number of an ov
24b10 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 20 74  erflow page in t
24b20 68 65 20 64 61 74 61 62 61 73 65 20 28 70 61 72  he database (par
24b30 61 6d 65 74 65 72 0a 2a 2a 20 6f 76 66 6c 29 2c  ameter.** ovfl),
24b40 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 66   this function f
24b50 69 6e 64 73 20 74 68 65 20 70 61 67 65 20 6e 75  inds the page nu
24b60 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65 78 74  mber of the next
24b70 20 70 61 67 65 20 69 6e 20 74 68 65 20 0a 2a 2a   page in the .**
24b80 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20   linked list of 
24b90 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20  overflow pages. 
24ba0 49 66 20 70 6f 73 73 69 62 6c 65 2c 20 69 74 20  If possible, it 
24bb0 75 73 65 73 20 74 68 65 20 61 75 74 6f 2d 76 61  uses the auto-va
24bc0 63 75 75 6d 0a 2a 2a 20 70 6f 69 6e 74 65 72 2d  cuum.** pointer-
24bd0 6d 61 70 20 64 61 74 61 20 69 6e 73 74 65 61 64  map data instead
24be0 20 6f 66 20 72 65 61 64 69 6e 67 20 74 68 65 20   of reading the 
24bf0 63 6f 6e 74 65 6e 74 20 6f 66 20 70 61 67 65 20  content of page 
24c00 6f 76 66 6c 20 74 6f 20 64 6f 20 73 6f 2e 20 0a  ovfl to do so. .
24c10 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
24c20 72 20 6f 63 63 75 72 73 20 61 6e 20 53 51 4c 69  r occurs an SQLi
24c30 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  te error code is
24c40 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72   returned. Other
24c50 77 69 73 65 3a 0a 2a 2a 0a 2a 2a 20 54 68 65 20  wise:.**.** The 
24c60 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  page number of t
24c70 68 65 20 6e 65 78 74 20 6f 76 65 72 66 6c 6f 77  he next overflow
24c80 20 70 61 67 65 20 69 6e 20 74 68 65 20 6c 69 6e   page in the lin
24c90 6b 65 64 20 6c 69 73 74 20 69 73 20 0a 2a 2a 20  ked list is .** 
24ca0 77 72 69 74 74 65 6e 20 74 6f 20 2a 70 50 67 6e  written to *pPgn
24cb0 6f 4e 65 78 74 2e 20 49 66 20 70 61 67 65 20 6f  oNext. If page o
24cc0 76 66 6c 20 69 73 20 74 68 65 20 6c 61 73 74 20  vfl is the last 
24cd0 70 61 67 65 20 69 6e 20 69 74 73 20 6c 69 6e 6b  page in its link
24ce0 65 64 20 0a 2a 2a 20 6c 69 73 74 2c 20 2a 70 50  ed .** list, *pP
24cf0 67 6e 6f 4e 65 78 74 20 69 73 20 73 65 74 20 74  gnoNext is set t
24d00 6f 20 7a 65 72 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49  o zero. .**.** I
24d10 66 20 70 70 50 61 67 65 20 69 73 20 6e 6f 74 20  f ppPage is not 
24d20 4e 55 4c 4c 2c 20 61 6e 64 20 61 20 72 65 66 65  NULL, and a refe
24d30 72 65 6e 63 65 20 74 6f 20 74 68 65 20 4d 65 6d  rence to the Mem
24d40 50 61 67 65 20 6f 62 6a 65 63 74 20 63 6f 72 72  Page object corr
24d50 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 74 6f 20  esponding.** to 
24d60 70 61 67 65 20 6e 75 6d 62 65 72 20 70 4f 76 66  page number pOvf
24d70 6c 20 77 61 73 20 6f 62 74 61 69 6e 65 64 2c 20  l was obtained, 
24d80 74 68 65 6e 20 2a 70 70 50 61 67 65 20 69 73 20  then *ppPage is 
24d90 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  set to point to 
24da0 74 68 61 74 0a 2a 2a 20 72 65 66 65 72 65 6e 63  that.** referenc
24db0 65 2e 20 49 74 20 69 73 20 74 68 65 20 72 65 73  e. It is the res
24dc0 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74  ponsibility of t
24dd0 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 63 61 6c  he caller to cal
24de0 6c 20 72 65 6c 65 61 73 65 50 61 67 65 28 29 0a  l releasePage().
24df0 2a 2a 20 6f 6e 20 2a 70 70 50 61 67 65 20 74 6f  ** on *ppPage to
24e00 20 66 72 65 65 20 74 68 65 20 72 65 66 65 72 65   free the refere
24e10 6e 63 65 2e 20 49 6e 20 6e 6f 20 72 65 66 65 72  nce. In no refer
24e20 65 6e 63 65 20 77 61 73 20 6f 62 74 61 69 6e 65  ence was obtaine
24e30 64 20 28 62 65 63 61 75 73 65 0a 2a 2a 20 74 68  d (because.** th
24e40 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 77 61  e pointer-map wa
24e50 73 20 75 73 65 64 20 74 6f 20 6f 62 74 61 69 6e  s used to obtain
24e60 20 74 68 65 20 76 61 6c 75 65 20 66 6f 72 20 2a   the value for *
24e70 70 50 67 6e 6f 4e 65 78 74 29 2c 20 74 68 65 6e  pPgnoNext), then
24e80 0a 2a 2a 20 2a 70 70 50 61 67 65 20 69 73 20 73  .** *ppPage is s
24e90 65 74 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2f 0a 73  et to zero..*/.s
24ea0 74 61 74 69 63 20 69 6e 74 20 67 65 74 4f 76 65  tatic int getOve
24eb0 72 66 6c 6f 77 50 61 67 65 28 0a 20 20 42 74 53  rflowPage(.  BtS
24ec0 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20  hared *pBt,     
24ed0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
24ee0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
24ef0 2f 0a 20 20 50 67 6e 6f 20 6f 76 66 6c 2c 20 20  /.  Pgno ovfl,  
24f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24f10 20 2f 2a 20 43 75 72 72 65 6e 74 20 6f 76 65 72   /* Current over
24f20 66 6c 6f 77 20 70 61 67 65 20 6e 75 6d 62 65 72  flow page number
24f30 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a   */.  MemPage **
24f40 70 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20  ppPage,         
24f50 20 20 20 2f 2a 20 4f 55 54 3a 20 4d 65 6d 50 61     /* OUT: MemPa
24f60 67 65 20 68 61 6e 64 6c 65 20 28 6d 61 79 20 62  ge handle (may b
24f70 65 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20 50 67 6e  e NULL) */.  Pgn
24f80 6f 20 2a 70 50 67 6e 6f 4e 65 78 74 20 20 20 20  o *pPgnoNext    
24f90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
24fa0 3a 20 4e 65 78 74 20 6f 76 65 72 66 6c 6f 77 20  : Next overflow 
24fb0 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 29  page number */.)
24fc0 7b 0a 20 20 50 67 6e 6f 20 6e 65 78 74 20 3d 20  {.  Pgno next = 
24fd0 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  0;.  MemPage *pP
24fe0 61 67 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72  age = 0;.  int r
24ff0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
25000 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
25010 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
25020 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
25030 73 65 72 74 28 70 50 67 6e 6f 4e 65 78 74 29 3b  sert(pPgnoNext);
25040 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
25050 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
25060 0a 20 20 2f 2a 20 54 72 79 20 74 6f 20 66 69 6e  .  /* Try to fin
25070 64 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20  d the next page 
25080 69 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  in the overflow 
25090 6c 69 73 74 20 75 73 69 6e 67 20 74 68 65 0a 20  list using the. 
250a0 20 2a 2a 20 61 75 74 6f 76 61 63 75 75 6d 20 70   ** autovacuum p
250b0 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 73  ointer-map pages
250c0 2e 20 47 75 65 73 73 20 74 68 61 74 20 74 68 65  . Guess that the
250d0 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20 0a 20   next page in . 
250e0 20 2a 2a 20 74 68 65 20 6f 76 65 72 66 6c 6f 77   ** the overflow
250f0 20 6c 69 73 74 20 69 73 20 70 61 67 65 20 6e 75   list is page nu
25100 6d 62 65 72 20 28 6f 76 66 6c 2b 31 29 2e 20 49  mber (ovfl+1). I
25110 66 20 74 68 61 74 20 67 75 65 73 73 20 74 75 72  f that guess tur
25120 6e 73 20 0a 20 20 2a 2a 20 6f 75 74 20 74 6f 20  ns .  ** out to 
25130 62 65 20 77 72 6f 6e 67 2c 20 66 61 6c 6c 20 62  be wrong, fall b
25140 61 63 6b 20 74 6f 20 6c 6f 61 64 69 6e 67 20 74  ack to loading t
25150 68 65 20 64 61 74 61 20 6f 66 20 70 61 67 65 20  he data of page 
25160 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 76 66  .  ** number ovf
25170 6c 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74  l to determine t
25180 68 65 20 6e 65 78 74 20 70 61 67 65 20 6e 75 6d  he next page num
25190 62 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ber..  */.  if( 
251a0 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
251b0 29 7b 0a 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f  ){.    Pgno pgno
251c0 3b 0a 20 20 20 20 50 67 6e 6f 20 69 47 75 65 73  ;.    Pgno iGues
251d0 73 20 3d 20 6f 76 66 6c 2b 31 3b 0a 20 20 20 20  s = ovfl+1;.    
251e0 75 38 20 65 54 79 70 65 3b 0a 0a 20 20 20 20 77  u8 eType;..    w
251f0 68 69 6c 65 28 20 50 54 52 4d 41 50 5f 49 53 50  hile( PTRMAP_ISP
25200 41 47 45 28 70 42 74 2c 20 69 47 75 65 73 73 29  AGE(pBt, iGuess)
25210 20 7c 7c 20 69 47 75 65 73 73 3d 3d 50 45 4e 44   || iGuess==PEND
25220 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
25230 74 29 20 29 7b 0a 20 20 20 20 20 20 69 47 75 65  t) ){.      iGue
25240 73 73 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  ss++;.    }..   
25250 20 69 66 28 20 69 47 75 65 73 73 3c 3d 62 74 72   if( iGuess<=btr
25260 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29  eePagecount(pBt)
25270 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70   ){.      rc = p
25280 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20 69 47  trmapGet(pBt, iG
25290 75 65 73 73 2c 20 26 65 54 79 70 65 2c 20 26 70  uess, &eType, &p
252a0 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20  gno);.      if( 
252b0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
252c0 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f   eType==PTRMAP_O
252d0 56 45 52 46 4c 4f 57 32 20 26 26 20 70 67 6e 6f  VERFLOW2 && pgno
252e0 3d 3d 6f 76 66 6c 20 29 7b 0a 20 20 20 20 20 20  ==ovfl ){.      
252f0 20 20 6e 65 78 74 20 3d 20 69 47 75 65 73 73 3b    next = iGuess;
25300 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
25310 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 20  LITE_DONE;.     
25320 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e   }.    }.  }.#en
25330 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 6e  dif..  assert( n
25340 65 78 74 3d 3d 30 20 7c 7c 20 72 63 3d 3d 53 51  ext==0 || rc==SQ
25350 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 69  LITE_DONE );.  i
25360 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
25370 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 62 74 72   ){.    rc = btr
25380 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 6f  eeGetPage(pBt, o
25390 76 66 6c 2c 20 26 70 50 61 67 65 2c 20 28 70 70  vfl, &pPage, (pp
253a0 50 61 67 65 3d 3d 30 29 20 3f 20 50 41 47 45 52  Page==0) ? PAGER
253b0 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20 3a 20  _GET_READONLY : 
253c0 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  0);.    assert( 
253d0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc==SQLITE_OK ||
253e0 20 70 50 61 67 65 3d 3d 30 20 29 3b 0a 20 20 20   pPage==0 );.   
253f0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
25400 4f 4b 20 29 7b 0a 20 20 20 20 20 20 6e 65 78 74  OK ){.      next
25410 20 3d 20 67 65 74 34 62 79 74 65 28 70 50 61 67   = get4byte(pPag
25420 65 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 7d  e->aData);.    }
25430 0a 20 20 7d 0a 0a 20 20 2a 70 50 67 6e 6f 4e 65  .  }..  *pPgnoNe
25440 78 74 20 3d 20 6e 65 78 74 3b 0a 20 20 69 66 28  xt = next;.  if(
25450 20 70 70 50 61 67 65 20 29 7b 0a 20 20 20 20 2a   ppPage ){.    *
25460 70 70 50 61 67 65 20 3d 20 70 50 61 67 65 3b 0a  ppPage = pPage;.
25470 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 6c    }else{.    rel
25480 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b  easePage(pPage);
25490 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28 72  .  }.  return (r
254a0 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 3f  c==SQLITE_DONE ?
254b0 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 72 63 29   SQLITE_OK : rc)
254c0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20  ;.}../*.** Copy 
254d0 64 61 74 61 20 66 72 6f 6d 20 61 20 62 75 66 66  data from a buff
254e0 65 72 20 74 6f 20 61 20 70 61 67 65 2c 20 6f 72  er to a page, or
254f0 20 66 72 6f 6d 20 61 20 70 61 67 65 20 74 6f 20   from a page to 
25500 61 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20  a buffer..**.** 
25510 70 50 61 79 6c 6f 61 64 20 69 73 20 61 20 70 6f  pPayload is a po
25520 69 6e 74 65 72 20 74 6f 20 64 61 74 61 20 73 74  inter to data st
25530 6f 72 65 64 20 6f 6e 20 64 61 74 61 62 61 73 65  ored on database
25540 20 70 61 67 65 20 70 44 62 50 61 67 65 2e 0a 2a   page pDbPage..*
25550 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20 65 4f  * If argument eO
25560 70 20 69 73 20 66 61 6c 73 65 2c 20 74 68 65 6e  p is false, then
25570 20 6e 42 79 74 65 20 62 79 74 65 73 20 6f 66 20   nByte bytes of 
25580 64 61 74 61 20 61 72 65 20 63 6f 70 69 65 64 0a  data are copied.
25590 2a 2a 20 66 72 6f 6d 20 70 50 61 79 6c 6f 61 64  ** from pPayload
255a0 20 74 6f 20 74 68 65 20 62 75 66 66 65 72 20 70   to the buffer p
255b0 6f 69 6e 74 65 64 20 61 74 20 62 79 20 70 42 75  ointed at by pBu
255c0 66 2e 20 49 66 20 65 4f 70 20 69 73 20 74 72 75  f. If eOp is tru
255d0 65 2c 0a 2a 2a 20 74 68 65 6e 20 73 71 6c 69 74  e,.** then sqlit
255e0 65 33 50 61 67 65 72 57 72 69 74 65 28 29 20 69  e3PagerWrite() i
255f0 73 20 63 61 6c 6c 65 64 20 6f 6e 20 70 44 62 50  s called on pDbP
25600 61 67 65 20 61 6e 64 20 6e 42 79 74 65 20 62 79  age and nByte by
25610 74 65 73 0a 2a 2a 20 6f 66 20 64 61 74 61 20 61  tes.** of data a
25620 72 65 20 63 6f 70 69 65 64 20 66 72 6f 6d 20 74  re copied from t
25630 68 65 20 62 75 66 66 65 72 20 70 42 75 66 20 74  he buffer pBuf t
25640 6f 20 70 50 61 79 6c 6f 61 64 2e 0a 2a 2a 0a 2a  o pPayload..**.*
25650 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  * SQLITE_OK is r
25660 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63 63 65  eturned on succe
25670 73 73 2c 20 6f 74 68 65 72 77 69 73 65 20 61 6e  ss, otherwise an
25680 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a   error code..*/.
25690 73 74 61 74 69 63 20 69 6e 74 20 63 6f 70 79 50  static int copyP
256a0 61 79 6c 6f 61 64 28 0a 20 20 76 6f 69 64 20 2a  ayload(.  void *
256b0 70 50 61 79 6c 6f 61 64 2c 20 20 20 20 20 20 20  pPayload,       
256c0 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
256d0 6f 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a 20  o page data */. 
256e0 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 20 20 20   void *pBuf,    
256f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
25700 69 6e 74 65 72 20 74 6f 20 62 75 66 66 65 72 20  inter to buffer 
25710 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 2c 20  */.  int nByte, 
25720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
25730 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
25740 73 20 74 6f 20 63 6f 70 79 20 2a 2f 0a 20 20 69  s to copy */.  i
25750 6e 74 20 65 4f 70 2c 20 20 20 20 20 20 20 20 20  nt eOp,         
25760 20 20 20 20 20 20 20 20 20 2f 2a 20 30 20 2d 3e           /* 0 ->
25770 20 63 6f 70 79 20 66 72 6f 6d 20 70 61 67 65 2c   copy from page,
25780 20 31 20 2d 3e 20 63 6f 70 79 20 74 6f 20 70 61   1 -> copy to pa
25790 67 65 20 2a 2f 0a 20 20 44 62 50 61 67 65 20 2a  ge */.  DbPage *
257a0 70 44 62 50 61 67 65 20 20 20 20 20 20 20 20 20  pDbPage         
257b0 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69    /* Page contai
257c0 6e 69 6e 67 20 70 50 61 79 6c 6f 61 64 20 2a 2f  ning pPayload */
257d0 0a 29 7b 0a 20 20 69 66 28 20 65 4f 70 20 29 7b  .){.  if( eOp ){
257e0 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 64 61 74  .    /* Copy dat
257f0 61 20 66 72 6f 6d 20 62 75 66 66 65 72 20 74 6f  a from buffer to
25800 20 70 61 67 65 20 28 61 20 77 72 69 74 65 20 6f   page (a write o
25810 70 65 72 61 74 69 6f 6e 29 20 2a 2f 0a 20 20 20  peration) */.   
25820 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65   int rc = sqlite
25830 33 50 61 67 65 72 57 72 69 74 65 28 70 44 62 50  3PagerWrite(pDbP
25840 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
25850 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
25860 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
25870 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 63 70 79      }.    memcpy
25880 28 70 50 61 79 6c 6f 61 64 2c 20 70 42 75 66 2c  (pPayload, pBuf,
25890 20 6e 42 79 74 65 29 3b 0a 20 20 7d 65 6c 73 65   nByte);.  }else
258a0 7b 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 64 61  {.    /* Copy da
258b0 74 61 20 66 72 6f 6d 20 70 61 67 65 20 74 6f 20  ta from page to 
258c0 62 75 66 66 65 72 20 28 61 20 72 65 61 64 20 6f  buffer (a read o
258d0 70 65 72 61 74 69 6f 6e 29 20 2a 2f 0a 20 20 20  peration) */.   
258e0 20 6d 65 6d 63 70 79 28 70 42 75 66 2c 20 70 50   memcpy(pBuf, pP
258f0 61 79 6c 6f 61 64 2c 20 6e 42 79 74 65 29 3b 0a  ayload, nByte);.
25900 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
25910 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
25920 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
25930 73 20 75 73 65 64 20 74 6f 20 72 65 61 64 20 6f  s used to read o
25940 72 20 6f 76 65 72 77 72 69 74 65 20 70 61 79 6c  r overwrite payl
25950 6f 61 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a  oad information.
25960 2a 2a 20 66 6f 72 20 74 68 65 20 65 6e 74 72 79  ** for the entry
25970 20 74 68 61 74 20 74 68 65 20 70 43 75 72 20 63   that the pCur c
25980 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e  ursor is pointin
25990 67 20 74 6f 2e 20 54 68 65 20 65 4f 70 0a 2a 2a  g to. The eOp.**
259a0 20 61 72 67 75 6d 65 6e 74 20 69 73 20 69 6e 74   argument is int
259b0 65 72 70 72 65 74 65 64 20 61 73 20 66 6f 6c 6c  erpreted as foll
259c0 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 30 3a 20  ows:.**.**   0: 
259d0 54 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 69 73  The operation is
259e0 20 61 20 72 65 61 64 2e 20 50 6f 70 75 6c 61 74   a read. Populat
259f0 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63  e the overflow c
25a00 61 63 68 65 2e 0a 2a 2a 20 20 20 31 3a 20 54 68  ache..**   1: Th
25a10 65 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 61  e operation is a
25a20 20 77 72 69 74 65 2e 20 50 6f 70 75 6c 61 74 65   write. Populate
25a30 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 61   the overflow ca
25a40 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 6f 74  che..**.** A tot
25a50 61 6c 20 6f 66 20 22 61 6d 74 22 20 62 79 74 65  al of "amt" byte
25a60 73 20 61 72 65 20 72 65 61 64 20 6f 72 20 77 72  s are read or wr
25a70 69 74 74 65 6e 20 62 65 67 69 6e 6e 69 6e 67 20  itten beginning 
25a80 61 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 20  at "offset"..** 
25a90 44 61 74 61 20 69 73 20 72 65 61 64 20 74 6f 20  Data is read to 
25aa0 6f 72 20 66 72 6f 6d 20 74 68 65 20 62 75 66 66  or from the buff
25ab0 65 72 20 70 42 75 66 2e 0a 2a 2a 0a 2a 2a 20 54  er pBuf..**.** T
25ac0 68 65 20 63 6f 6e 74 65 6e 74 20 62 65 69 6e 67  he content being
25ad0 20 72 65 61 64 20 6f 72 20 77 72 69 74 74 65 6e   read or written
25ae0 20 6d 69 67 68 74 20 61 70 70 65 61 72 20 6f 6e   might appear on
25af0 20 74 68 65 20 6d 61 69 6e 20 70 61 67 65 0a 2a   the main page.*
25b00 2a 20 6f 72 20 62 65 20 73 63 61 74 74 65 72 65  * or be scattere
25b10 64 20 6f 75 74 20 6f 6e 20 6d 75 6c 74 69 70 6c  d out on multipl
25b20 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  e overflow pages
25b30 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63  ..**.** If the c
25b40 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20 65 6e  urrent cursor en
25b50 74 72 79 20 75 73 65 73 20 6f 6e 65 20 6f 72 20  try uses one or 
25b60 6d 6f 72 65 20 6f 76 65 72 66 6c 6f 77 20 70 61  more overflow pa
25b70 67 65 73 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63  ges.** this func
25b80 74 69 6f 6e 20 6d 61 79 20 61 6c 6c 6f 63 61 74  tion may allocat
25b90 65 20 73 70 61 63 65 20 66 6f 72 20 61 6e 64 20  e space for and 
25ba0 6c 61 7a 69 6c 79 20 70 6f 70 75 6c 61 74 65 0a  lazily populate.
25bb0 2a 2a 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  ** the overflow 
25bc0 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 20  page-list cache 
25bd0 61 72 72 61 79 20 28 42 74 43 75 72 73 6f 72 2e  array (BtCursor.
25be0 61 4f 76 65 72 66 6c 6f 77 29 2e 20 0a 2a 2a 20  aOverflow). .** 
25bf0 53 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73  Subsequent calls
25c00 20 75 73 65 20 74 68 69 73 20 63 61 63 68 65 20   use this cache 
25c10 74 6f 20 6d 61 6b 65 20 73 65 65 6b 69 6e 67 20  to make seeking 
25c20 74 6f 20 74 68 65 20 73 75 70 70 6c 69 65 64 20  to the supplied 
25c30 6f 66 66 73 65 74 20 0a 2a 2a 20 6d 6f 72 65 20  offset .** more 
25c40 65 66 66 69 63 69 65 6e 74 2e 0a 2a 2a 0a 2a 2a  efficient..**.**
25c50 20 4f 6e 63 65 20 61 6e 20 6f 76 65 72 66 6c 6f   Once an overflo
25c60 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68  w page-list cach
25c70 65 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63  e has been alloc
25c80 61 74 65 64 2c 20 69 74 20 6d 75 73 74 20 62 65  ated, it must be
25c90 0a 2a 2a 20 69 6e 76 61 6c 69 64 61 74 65 64 20  .** invalidated 
25ca0 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 63 75  if some other cu
25cb0 72 73 6f 72 20 77 72 69 74 65 73 20 74 6f 20 74  rsor writes to t
25cc0 68 65 20 73 61 6d 65 20 74 61 62 6c 65 2c 20 6f  he same table, o
25cd0 72 20 69 66 0a 2a 2a 20 74 68 65 20 63 75 72 73  r if.** the curs
25ce0 6f 72 20 69 73 20 6d 6f 76 65 64 20 74 6f 20 61  or is moved to a
25cf0 20 64 69 66 66 65 72 65 6e 74 20 72 6f 77 2e 20   different row. 
25d00 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 69 6e  Additionally, in
25d10 20 61 75 74 6f 2d 76 61 63 75 75 6d 0a 2a 2a 20   auto-vacuum.** 
25d20 6d 6f 64 65 2c 20 74 68 65 20 66 6f 6c 6c 6f 77  mode, the follow
25d30 69 6e 67 20 65 76 65 6e 74 73 20 6d 61 79 20 69  ing events may i
25d40 6e 76 61 6c 69 64 61 74 65 20 61 6e 20 6f 76 65  nvalidate an ove
25d50 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20  rflow page-list 
25d60 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a  cache..**.**   *
25d70 20 41 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20   An incremental 
25d80 76 61 63 75 75 6d 2c 0a 2a 2a 20 20 20 2a 20 41  vacuum,.**   * A
25d90 20 63 6f 6d 6d 69 74 20 69 6e 20 61 75 74 6f 5f   commit in auto_
25da0 76 61 63 75 75 6d 3d 22 66 75 6c 6c 22 20 6d 6f  vacuum="full" mo
25db0 64 65 2c 0a 2a 2a 20 20 20 2a 20 43 72 65 61 74  de,.**   * Creat
25dc0 69 6e 67 20 61 20 74 61 62 6c 65 20 28 6d 61 79  ing a table (may
25dd0 20 72 65 71 75 69 72 65 20 6d 6f 76 69 6e 67 20   require moving 
25de0 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
25df0 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
25e00 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 0a   accessPayload(.
25e10 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72    BtCursor *pCur
25e20 2c 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72  ,      /* Cursor
25e30 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 65 6e 74   pointing to ent
25e40 72 79 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20  ry to read from 
25e50 2a 2f 0a 20 20 75 33 32 20 6f 66 66 73 65 74 2c  */.  u32 offset,
25e60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65 67            /* Beg
25e70 69 6e 20 72 65 61 64 69 6e 67 20 74 68 69 73 20  in reading this 
25e80 66 61 72 20 69 6e 74 6f 20 70 61 79 6c 6f 61 64  far into payload
25e90 20 2a 2f 0a 20 20 75 33 32 20 61 6d 74 2c 20 20   */.  u32 amt,  
25ea0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
25eb0 61 64 20 74 68 69 73 20 6d 61 6e 79 20 62 79 74  ad this many byt
25ec0 65 73 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  es */.  unsigned
25ed0 20 63 68 61 72 20 2a 70 42 75 66 2c 20 2f 2a 20   char *pBuf, /* 
25ee0 57 72 69 74 65 20 74 68 65 20 62 79 74 65 73 20  Write the bytes 
25ef0 69 6e 74 6f 20 74 68 69 73 20 62 75 66 66 65 72  into this buffer
25f00 20 2a 2f 20 0a 20 20 69 6e 74 20 65 4f 70 20 20   */ .  int eOp  
25f10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a              /* z
25f20 65 72 6f 20 74 6f 20 72 65 61 64 2e 20 6e 6f 6e  ero to read. non
25f30 2d 7a 65 72 6f 20 74 6f 20 77 72 69 74 65 2e 20  -zero to write. 
25f40 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64  */.){.  unsigned
25f50 20 63 68 61 72 20 2a 61 50 61 79 6c 6f 61 64 3b   char *aPayload;
25f60 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
25f70 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 49 64  TE_OK;.  int iId
25f80 78 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65  x = 0;.  MemPage
25f90 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e   *pPage = pCur->
25fa0 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
25fb0 67 65 5d 3b 20 2f 2a 20 42 74 72 65 65 20 70 61  ge]; /* Btree pa
25fc0 67 65 20 6f 66 20 63 75 72 72 65 6e 74 20 65 6e  ge of current en
25fd0 74 72 79 20 2a 2f 0a 20 20 42 74 53 68 61 72 65  try */.  BtShare
25fe0 64 20 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e 70  d *pBt = pCur->p
25ff0 42 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Bt;             
26000 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20 74 68       /* Btree th
26010 69 73 20 63 75 72 73 6f 72 20 62 65 6c 6f 6e 67  is cursor belong
26020 73 20 74 6f 20 2a 2f 0a 23 69 66 64 65 66 20 53  s to */.#ifdef S
26030 51 4c 49 54 45 5f 44 49 52 45 43 54 5f 4f 56 45  QLITE_DIRECT_OVE
26040 52 46 4c 4f 57 5f 52 45 41 44 0a 20 20 75 6e 73  RFLOW_READ.  uns
26050 69 67 6e 65 64 20 63 68 61 72 20 2a 20 63 6f 6e  igned char * con
26060 73 74 20 70 42 75 66 53 74 61 72 74 20 3d 20 70  st pBufStart = p
26070 42 75 66 3b 20 20 20 20 20 2f 2a 20 53 74 61 72  Buf;     /* Star
26080 74 20 6f 66 20 6f 72 69 67 69 6e 61 6c 20 6f 75  t of original ou
26090 74 20 62 75 66 66 65 72 20 2a 2f 0a 23 65 6e 64  t buffer */.#end
260a0 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  if..  assert( pP
260b0 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  age );.  assert(
260c0 20 65 4f 70 3d 3d 30 20 7c 7c 20 65 4f 70 3d 3d   eOp==0 || eOp==
260d0 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  1 );.  assert( p
260e0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
260f0 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61  SOR_VALID );.  a
26100 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49  ssert( pCur->aiI
26110 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c  dx[pCur->iPage]<
26120 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  pPage->nCell );.
26130 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
26140 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
26150 20 29 3b 0a 0a 20 20 67 65 74 43 65 6c 6c 49 6e   );..  getCellIn
26160 66 6f 28 70 43 75 72 29 3b 0a 20 20 61 50 61 79  fo(pCur);.  aPay
26170 6c 6f 61 64 20 3d 20 70 43 75 72 2d 3e 69 6e 66  load = pCur->inf
26180 6f 2e 70 50 61 79 6c 6f 61 64 3b 0a 20 20 61 73  o.pPayload;.  as
26190 73 65 72 74 28 20 6f 66 66 73 65 74 2b 61 6d 74  sert( offset+amt
261a0 20 3c 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e   <= pCur->info.n
261b0 50 61 79 6c 6f 61 64 20 29 3b 0a 0a 20 20 61 73  Payload );..  as
261c0 73 65 72 74 28 20 61 50 61 79 6c 6f 61 64 20 3e  sert( aPayload >
261d0 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 29 3b   pPage->aData );
261e0 0a 20 20 69 66 28 20 28 75 70 74 72 29 28 61 50  .  if( (uptr)(aP
261f0 61 79 6c 6f 61 64 20 2d 20 70 50 61 67 65 2d 3e  ayload - pPage->
26200 61 44 61 74 61 29 20 3e 20 28 70 42 74 2d 3e 75  aData) > (pBt->u
26210 73 61 62 6c 65 53 69 7a 65 20 2d 20 70 43 75 72  sableSize - pCur
26220 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 29 20 29  ->info.nLocal) )
26230 7b 0a 20 20 20 20 2f 2a 20 54 72 79 69 6e 67 20  {.    /* Trying 
26240 74 6f 20 72 65 61 64 20 6f 72 20 77 72 69 74 65  to read or write
26250 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66   past the end of
26260 20 74 68 65 20 64 61 74 61 20 69 73 20 61 6e 20   the data is an 
26270 65 72 72 6f 72 2e 20 20 54 68 65 0a 20 20 20 20  error.  The.    
26280 2a 2a 20 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 61  ** conditional a
26290 62 6f 76 65 20 69 73 20 72 65 61 6c 6c 79 3a 0a  bove is really:.
262a0 20 20 20 20 2a 2a 20 20 20 20 26 61 50 61 79 6c      **    &aPayl
262b0 6f 61 64 5b 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  oad[pCur->info.n
262c0 4c 6f 63 61 6c 5d 20 3e 20 26 70 50 61 67 65 2d  Local] > &pPage-
262d0 3e 61 44 61 74 61 5b 70 42 74 2d 3e 75 73 61 62  >aData[pBt->usab
262e0 6c 65 53 69 7a 65 5d 0a 20 20 20 20 2a 2a 20 62  leSize].    ** b
262f0 75 74 20 69 73 20 72 65 63 61 73 74 20 69 6e 74  ut is recast int
26300 6f 20 69 74 73 20 63 75 72 72 65 6e 74 20 66 6f  o its current fo
26310 72 6d 20 74 6f 20 61 76 6f 69 64 20 69 6e 74 65  rm to avoid inte
26320 67 65 72 20 6f 76 65 72 66 6c 6f 77 20 70 72 6f  ger overflow pro
26330 62 6c 65 6d 73 0a 20 20 20 20 2a 2f 0a 20 20 20  blems.    */.   
26340 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
26350 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d  ORRUPT_BKPT;.  }
26360 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20  ..  /* Check if 
26370 64 61 74 61 20 6d 75 73 74 20 62 65 20 72 65 61  data must be rea
26380 64 2f 77 72 69 74 74 65 6e 20 74 6f 2f 66 72 6f  d/written to/fro
26390 6d 20 74 68 65 20 62 74 72 65 65 20 70 61 67 65  m the btree page
263a0 20 69 74 73 65 6c 66 2e 20 2a 2f 0a 20 20 69 66   itself. */.  if
263b0 28 20 6f 66 66 73 65 74 3c 70 43 75 72 2d 3e 69  ( offset<pCur->i
263c0 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20  nfo.nLocal ){.  
263d0 20 20 69 6e 74 20 61 20 3d 20 61 6d 74 3b 0a 20    int a = amt;. 
263e0 20 20 20 69 66 28 20 61 2b 6f 66 66 73 65 74 3e     if( a+offset>
263f0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61  pCur->info.nLoca
26400 6c 20 29 7b 0a 20 20 20 20 20 20 61 20 3d 20 70  l ){.      a = p
26410 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  Cur->info.nLocal
26420 20 2d 20 6f 66 66 73 65 74 3b 0a 20 20 20 20 7d   - offset;.    }
26430 0a 20 20 20 20 72 63 20 3d 20 63 6f 70 79 50 61  .    rc = copyPa
26440 79 6c 6f 61 64 28 26 61 50 61 79 6c 6f 61 64 5b  yload(&aPayload[
26450 6f 66 66 73 65 74 5d 2c 20 70 42 75 66 2c 20 61  offset], pBuf, a
26460 2c 20 65 4f 70 2c 20 70 50 61 67 65 2d 3e 70 44  , eOp, pPage->pD
26470 62 50 61 67 65 29 3b 0a 20 20 20 20 6f 66 66 73  bPage);.    offs
26480 65 74 20 3d 20 30 3b 0a 20 20 20 20 70 42 75 66  et = 0;.    pBuf
26490 20 2b 3d 20 61 3b 0a 20 20 20 20 61 6d 74 20 2d   += a;.    amt -
264a0 3d 20 61 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = a;.  }else{.  
264b0 20 20 6f 66 66 73 65 74 20 2d 3d 20 70 43 75 72    offset -= pCur
264c0 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20  ->info.nLocal;. 
264d0 20 7d 0a 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53   }...  if( rc==S
264e0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e  QLITE_OK && amt>
264f0 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 75  0 ){.    const u
26500 33 32 20 6f 76 66 6c 53 69 7a 65 20 3d 20 70 42  32 ovflSize = pB
26510 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20  t->usableSize - 
26520 34 3b 20 20 2f 2a 20 42 79 74 65 73 20 63 6f 6e  4;  /* Bytes con
26530 74 65 6e 74 20 70 65 72 20 6f 76 66 6c 20 70 61  tent per ovfl pa
26540 67 65 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e  ge */.    Pgno n
26550 65 78 74 50 61 67 65 3b 0a 0a 20 20 20 20 6e 65  extPage;..    ne
26560 78 74 50 61 67 65 20 3d 20 67 65 74 34 62 79 74  xtPage = get4byt
26570 65 28 26 61 50 61 79 6c 6f 61 64 5b 70 43 75 72  e(&aPayload[pCur
26580 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d 29 3b  ->info.nLocal]);
26590 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  ..    /* If the 
265a0 42 74 43 75 72 73 6f 72 2e 61 4f 76 65 72 66 6c  BtCursor.aOverfl
265b0 6f 77 5b 5d 20 68 61 73 20 6e 6f 74 20 62 65 65  ow[] has not bee
265c0 6e 20 61 6c 6c 6f 63 61 74 65 64 2c 20 61 6c 6c  n allocated, all
265d0 6f 63 61 74 65 20 69 74 20 6e 6f 77 2e 0a 20 20  ocate it now..  
265e0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    **.    ** The 
265f0 61 4f 76 65 72 66 6c 6f 77 5b 5d 20 61 72 72 61  aOverflow[] arra
26600 79 20 69 73 20 73 69 7a 65 64 20 61 74 20 6f 6e  y is sized at on
26610 65 20 65 6e 74 72 79 20 66 6f 72 20 65 61 63 68  e entry for each
26620 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 0a 20   overflow page. 
26630 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 6f 76 65     ** in the ove
26640 72 66 6c 6f 77 20 63 68 61 69 6e 2e 20 54 68 65  rflow chain. The
26650 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
26660 74 68 65 20 66 69 72 73 74 20 6f 76 65 72 66 6c  the first overfl
26670 6f 77 20 70 61 67 65 20 69 73 0a 20 20 20 20 2a  ow page is.    *
26680 2a 20 73 74 6f 72 65 64 20 69 6e 20 61 4f 76 65  * stored in aOve
26690 72 66 6c 6f 77 5b 30 5d 2c 20 65 74 63 2e 20 41  rflow[0], etc. A
266a0 20 76 61 6c 75 65 20 6f 66 20 30 20 69 6e 20 74   value of 0 in t
266b0 68 65 20 61 4f 76 65 72 66 6c 6f 77 5b 5d 20 61  he aOverflow[] a
266c0 72 72 61 79 0a 20 20 20 20 2a 2a 20 6d 65 61 6e  rray.    ** mean
266d0 73 20 22 6e 6f 74 20 79 65 74 20 6b 6e 6f 77 6e  s "not yet known
266e0 22 20 28 74 68 65 20 63 61 63 68 65 20 69 73 20  " (the cache is 
266f0 6c 61 7a 69 6c 79 20 70 6f 70 75 6c 61 74 65 64  lazily populated
26700 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  )..    */.    if
26710 28 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67  ( (pCur->curFlag
26720 73 20 26 20 42 54 43 46 5f 56 61 6c 69 64 4f 76  s & BTCF_ValidOv
26730 66 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  fl)==0 ){.      
26740 69 6e 74 20 6e 4f 76 66 6c 20 3d 20 28 70 43 75  int nOvfl = (pCu
26750 72 2d 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64  r->info.nPayload
26760 2d 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63  -pCur->info.nLoc
26770 61 6c 2b 6f 76 66 6c 53 69 7a 65 2d 31 29 2f 6f  al+ovflSize-1)/o
26780 76 66 6c 53 69 7a 65 3b 0a 20 20 20 20 20 20 69  vflSize;.      i
26790 66 28 20 6e 4f 76 66 6c 3e 70 43 75 72 2d 3e 6e  f( nOvfl>pCur->n
267a0 4f 76 66 6c 41 6c 6c 6f 63 20 29 7b 0a 20 20 20  OvflAlloc ){.   
267b0 20 20 20 20 20 50 67 6e 6f 20 2a 61 4e 65 77 20       Pgno *aNew 
267c0 3d 20 28 50 67 6e 6f 2a 29 73 71 6c 69 74 65 33  = (Pgno*)sqlite3
267d0 52 65 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20 20  Realloc(.       
267e0 20 20 20 20 20 70 43 75 72 2d 3e 61 4f 76 65 72       pCur->aOver
267f0 66 6c 6f 77 2c 20 6e 4f 76 66 6c 2a 32 2a 73 69  flow, nOvfl*2*si
26800 7a 65 6f 66 28 50 67 6e 6f 29 0a 20 20 20 20 20  zeof(Pgno).     
26810 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66     );.        if
26820 28 20 61 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20  ( aNew==0 ){.   
26830 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
26840 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
26850 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
26860 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e            pCur->
26870 6e 4f 76 66 6c 41 6c 6c 6f 63 20 3d 20 6e 4f 76  nOvflAlloc = nOv
26880 66 6c 2a 32 3b 0a 20 20 20 20 20 20 20 20 20 20  fl*2;.          
26890 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20  pCur->aOverflow 
268a0 3d 20 61 4e 65 77 3b 0a 20 20 20 20 20 20 20 20  = aNew;.        
268b0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
268c0 6d 65 6d 73 65 74 28 70 43 75 72 2d 3e 61 4f 76  memset(pCur->aOv
268d0 65 72 66 6c 6f 77 2c 20 30 2c 20 6e 4f 76 66 6c  erflow, 0, nOvfl
268e0 2a 73 69 7a 65 6f 66 28 50 67 6e 6f 29 29 3b 0a  *sizeof(Pgno));.
268f0 20 20 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46        pCur->curF
26900 6c 61 67 73 20 7c 3d 20 42 54 43 46 5f 56 61 6c  lags |= BTCF_Val
26910 69 64 4f 76 66 6c 3b 0a 20 20 20 20 7d 65 6c 73  idOvfl;.    }els
26920 65 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  e{.      /* If t
26930 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  he overflow page
26940 2d 6c 69 73 74 20 63 61 63 68 65 20 68 61 73 20  -list cache has 
26950 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 61  been allocated a
26960 6e 64 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  nd the.      ** 
26970 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 66 69  entry for the fi
26980 72 73 74 20 72 65 71 75 69 72 65 64 20 6f 76 65  rst required ove
26990 72 66 6c 6f 77 20 70 61 67 65 20 69 73 20 76 61  rflow page is va
269a0 6c 69 64 2c 20 73 6b 69 70 0a 20 20 20 20 20 20  lid, skip.      
269b0 2a 2a 20 64 69 72 65 63 74 6c 79 20 74 6f 20 69  ** directly to i
269c0 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  t..      */.    
269d0 20 20 69 66 28 20 70 43 75 72 2d 3e 61 4f 76 65    if( pCur->aOve
269e0 72 66 6c 6f 77 5b 6f 66 66 73 65 74 2f 6f 76 66  rflow[offset/ovf
269f0 6c 53 69 7a 65 5d 20 29 7b 0a 20 20 20 20 20 20  lSize] ){.      
26a00 20 20 69 49 64 78 20 3d 20 28 6f 66 66 73 65 74    iIdx = (offset
26a10 2f 6f 76 66 6c 53 69 7a 65 29 3b 0a 20 20 20 20  /ovflSize);.    
26a20 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20 70      nextPage = p
26a30 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69  Cur->aOverflow[i
26a40 49 64 78 5d 3b 0a 20 20 20 20 20 20 20 20 6f 66  Idx];.        of
26a50 66 73 65 74 20 3d 20 28 6f 66 66 73 65 74 25 6f  fset = (offset%o
26a60 76 66 6c 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  vflSize);.      
26a70 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61 73 73  }.    }..    ass
26a80 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
26a90 4f 4b 20 26 26 20 61 6d 74 3e 30 20 29 3b 0a 20  OK && amt>0 );. 
26aa0 20 20 20 77 68 69 6c 65 28 20 6e 65 78 74 50 61     while( nextPa
26ab0 67 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  ge ){.      /* I
26ac0 66 20 72 65 71 75 69 72 65 64 2c 20 70 6f 70 75  f required, popu
26ad0 6c 61 74 65 20 74 68 65 20 6f 76 65 72 66 6c 6f  late the overflo
26ae0 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68  w page-list cach
26af0 65 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65  e. */.      asse
26b00 72 74 28 20 70 43 75 72 2d 3e 61 4f 76 65 72 66  rt( pCur->aOverf
26b10 6c 6f 77 5b 69 49 64 78 5d 3d 3d 30 0a 20 20 20  low[iIdx]==0.   
26b20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 43             || pC
26b30 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49  ur->aOverflow[iI
26b40 64 78 5d 3d 3d 6e 65 78 74 50 61 67 65 0a 20 20  dx]==nextPage.  
26b50 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 43              || C
26b60 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 20  ORRUPT_DB );.   
26b70 20 20 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c     pCur->aOverfl
26b80 6f 77 5b 69 49 64 78 5d 20 3d 20 6e 65 78 74 50  ow[iIdx] = nextP
26b90 61 67 65 3b 0a 0a 20 20 20 20 20 20 69 66 28 20  age;..      if( 
26ba0 6f 66 66 73 65 74 3e 3d 6f 76 66 6c 53 69 7a 65  offset>=ovflSize
26bb0 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   ){.        /* T
26bc0 68 65 20 6f 6e 6c 79 20 72 65 61 73 6f 6e 20 74  he only reason t
26bd0 6f 20 72 65 61 64 20 74 68 69 73 20 70 61 67 65  o read this page
26be0 20 69 73 20 74 6f 20 6f 62 74 61 69 6e 20 74 68   is to obtain th
26bf0 65 20 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a  e page.        *
26c00 2a 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65  * number for the
26c10 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74 68   next page in th
26c20 65 20 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e  e overflow chain
26c30 2e 20 54 68 65 20 70 61 67 65 0a 20 20 20 20 20  . The page.     
26c40 20 20 20 2a 2a 20 64 61 74 61 20 69 73 20 6e 6f     ** data is no
26c50 74 20 72 65 71 75 69 72 65 64 2e 20 53 6f 20 66  t required. So f
26c60 69 72 73 74 20 74 72 79 20 74 6f 20 6c 6f 6f 6b  irst try to look
26c70 75 70 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 0a  up the overflow.
26c80 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65 2d          ** page-
26c90 6c 69 73 74 20 63 61 63 68 65 2c 20 69 66 20 61  list cache, if a
26ca0 6e 79 2c 20 74 68 65 6e 20 66 61 6c 6c 20 62 61  ny, then fall ba
26cb0 63 6b 20 74 6f 20 74 68 65 20 67 65 74 4f 76 65  ck to the getOve
26cc0 72 66 6c 6f 77 50 61 67 65 28 29 0a 20 20 20 20  rflowPage().    
26cd0 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e      ** function.
26ce0 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
26cf0 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
26d00 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43  ->curFlags & BTC
26d10 46 5f 56 61 6c 69 64 4f 76 66 6c 20 29 3b 0a 20  F_ValidOvfl );. 
26d20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
26d30 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 3d  Cur->pBtree->db=
26d40 3d 70 42 74 2d 3e 64 62 20 29 3b 0a 20 20 20 20  =pBt->db );.    
26d50 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 61 4f      if( pCur->aO
26d60 76 65 72 66 6c 6f 77 5b 69 49 64 78 2b 31 5d 20  verflow[iIdx+1] 
26d70 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 65 78  ){.          nex
26d80 74 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 4f  tPage = pCur->aO
26d90 76 65 72 66 6c 6f 77 5b 69 49 64 78 2b 31 5d 3b  verflow[iIdx+1];
26da0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
26db0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 67            rc = g
26dc0 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 70  etOverflowPage(p
26dd0 42 74 2c 20 6e 65 78 74 50 61 67 65 2c 20 30 2c  Bt, nextPage, 0,
26de0 20 26 6e 65 78 74 50 61 67 65 29 3b 0a 20 20 20   &nextPage);.   
26df0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6f       }.        o
26e00 66 66 73 65 74 20 2d 3d 20 6f 76 66 6c 53 69 7a  ffset -= ovflSiz
26e10 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  e;.      }else{.
26e20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 65 64 20          /* Need 
26e30 74 6f 20 72 65 61 64 20 74 68 69 73 20 70 61 67  to read this pag
26e40 65 20 70 72 6f 70 65 72 6c 79 2e 20 49 74 20 63  e properly. It c
26e50 6f 6e 74 61 69 6e 73 20 73 6f 6d 65 20 6f 66 20  ontains some of 
26e60 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 72  the.        ** r
26e70 61 6e 67 65 20 6f 66 20 64 61 74 61 20 74 68 61  ange of data tha
26e80 74 20 69 73 20 62 65 69 6e 67 20 72 65 61 64 20  t is being read 
26e90 28 65 4f 70 3d 3d 30 29 20 6f 72 20 77 72 69 74  (eOp==0) or writ
26ea0 74 65 6e 20 28 65 4f 70 21 3d 30 29 2e 0a 20 20  ten (eOp!=0)..  
26eb0 20 20 20 20 20 20 2a 2f 0a 23 69 66 64 65 66 20        */.#ifdef 
26ec0 53 51 4c 49 54 45 5f 44 49 52 45 43 54 5f 4f 56  SQLITE_DIRECT_OV
26ed0 45 52 46 4c 4f 57 5f 52 45 41 44 0a 20 20 20 20  ERFLOW_READ.    
26ee0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65      sqlite3_file
26ef0 20 2a 66 64 3b 20 20 20 20 20 20 2f 2a 20 46 69   *fd;      /* Fi
26f00 6c 65 20 66 72 6f 6d 20 77 68 69 63 68 20 74 6f  le from which to
26f10 20 64 6f 20 64 69 72 65 63 74 20 6f 76 65 72 66   do direct overf
26f20 6c 6f 77 20 72 65 61 64 20 2a 2f 0a 23 65 6e 64  low read */.#end
26f30 69 66 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61  if.        int a
26f40 20 3d 20 61 6d 74 3b 0a 20 20 20 20 20 20 20 20   = amt;.        
26f50 69 66 28 20 61 20 2b 20 6f 66 66 73 65 74 20 3e  if( a + offset >
26f60 20 6f 76 66 6c 53 69 7a 65 20 29 7b 0a 20 20 20   ovflSize ){.   
26f70 20 20 20 20 20 20 20 61 20 3d 20 6f 76 66 6c 53         a = ovflS
26f80 69 7a 65 20 2d 20 6f 66 66 73 65 74 3b 0a 20 20  ize - offset;.  
26f90 20 20 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20        }..#ifdef 
26fa0 53 51 4c 49 54 45 5f 44 49 52 45 43 54 5f 4f 56  SQLITE_DIRECT_OV
26fb0 45 52 46 4c 4f 57 5f 52 45 41 44 0a 20 20 20 20  ERFLOW_READ.    
26fc0 20 20 20 20 2f 2a 20 49 66 20 61 6c 6c 20 74 68      /* If all th
26fd0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20  e following are 
26fe0 74 72 75 65 3a 0a 20 20 20 20 20 20 20 20 2a 2a  true:.        **
26ff0 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 31 29  .        **   1)
27000 20 74 68 69 73 20 69 73 20 61 20 72 65 61 64 20   this is a read 
27010 6f 70 65 72 61 74 69 6f 6e 2c 20 61 6e 64 20 0a  operation, and .
27020 20 20 20 20 20 20 20 20 2a 2a 20 20 20 32 29 20          **   2) 
27030 64 61 74 61 20 69 73 20 72 65 71 75 69 72 65 64  data is required
27040 20 66 72 6f 6d 20 74 68 65 20 73 74 61 72 74 20   from the start 
27050 6f 66 20 74 68 69 73 20 6f 76 65 72 66 6c 6f 77  of this overflow
27060 20 70 61 67 65 2c 20 61 6e 64 0a 20 20 20 20 20   page, and.     
27070 20 20 20 2a 2a 20 20 20 33 29 20 74 68 65 72 65     **   3) there
27080 20 69 73 20 6e 6f 20 6f 70 65 6e 20 77 72 69 74   is no open writ
27090 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 61  e-transaction, a
270a0 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  nd.        **   
270b0 34 29 20 74 68 65 20 64 61 74 61 62 61 73 65 20  4) the database 
270c0 69 73 20 66 69 6c 65 2d 62 61 63 6b 65 64 2c 20  is file-backed, 
270d0 61 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 20  and.        **  
270e0 20 35 29 20 74 68 65 20 70 61 67 65 20 69 73 20   5) the page is 
270f0 6e 6f 74 20 69 6e 20 74 68 65 20 57 41 4c 20 66  not in the WAL f
27100 69 6c 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 20  ile.        **  
27110 20 36 29 20 61 74 20 6c 65 61 73 74 20 34 20 62   6) at least 4 b
27120 79 74 65 73 20 68 61 76 65 20 61 6c 72 65 61 64  ytes have alread
27130 79 20 62 65 65 6e 20 72 65 61 64 20 69 6e 74 6f  y been read into
27140 20 74 68 65 20 6f 75 74 70 75 74 20 62 75 66 66   the output buff
27150 65 72 20 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  er .        **. 
27160 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 64         ** then d
27170 61 74 61 20 63 61 6e 20 62 65 20 72 65 61 64 20  ata can be read 
27180 64 69 72 65 63 74 6c 79 20 66 72 6f 6d 20 74 68  directly from th
27190 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
271a0 69 6e 74 6f 20 74 68 65 0a 20 20 20 20 20 20 20  into the.       
271b0 20 2a 2a 20 6f 75 74 70 75 74 20 62 75 66 66 65   ** output buffe
271c0 72 2c 20 62 79 70 61 73 73 69 6e 67 20 74 68 65  r, bypassing the
271d0 20 70 61 67 65 2d 63 61 63 68 65 20 61 6c 74 6f   page-cache alto
271e0 67 65 74 68 65 72 2e 20 54 68 69 73 20 73 70 65  gether. This spe
271f0 65 64 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 75  eds.        ** u
27200 70 20 6c 6f 61 64 69 6e 67 20 6c 61 72 67 65 20  p loading large 
27210 72 65 63 6f 72 64 73 20 74 68 61 74 20 73 70 61  records that spa
27220 6e 20 6d 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20  n many overflow 
27230 70 61 67 65 73 2e 0a 20 20 20 20 20 20 20 20 2a  pages..        *
27240 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 65 4f  /.        if( eO
27250 70 3d 3d 30 20 20 20 20 20 20 20 20 20 20 20 20  p==0            
27260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27280 20 2f 2a 20 28 31 29 20 2a 2f 0a 20 20 20 20 20   /* (1) */.     
27290 20 20 20 20 26 26 20 6f 66 66 73 65 74 3d 3d 30      && offset==0
272a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
272b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
272c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28 32 29            /* (2)
272d0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 26 26 20   */.         && 
272e0 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
272f0 6f 6e 3d 3d 54 52 41 4e 53 5f 52 45 41 44 20 20  on==TRANS_READ  
27300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27310 20 20 20 2f 2a 20 28 33 29 20 2a 2f 0a 20 20 20     /* (3) */.   
27320 20 20 20 20 20 20 26 26 20 28 66 64 20 3d 20 73        && (fd = s
27330 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65 28  qlite3PagerFile(
27340 70 42 74 2d 3e 70 50 61 67 65 72 29 29 2d 3e 70  pBt->pPager))->p
27350 4d 65 74 68 6f 64 73 20 20 20 20 20 2f 2a 20 28  Methods     /* (
27360 34 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 26  4) */.         &
27370 26 20 30 3d 3d 73 71 6c 69 74 65 33 50 61 67 65  & 0==sqlite3Page
27380 72 55 73 65 57 61 6c 28 70 42 74 2d 3e 70 50 61  rUseWal(pBt->pPa
27390 67 65 72 2c 20 6e 65 78 74 50 61 67 65 29 20 20  ger, nextPage)  
273a0 20 20 20 20 20 2f 2a 20 28 35 29 20 2a 2f 0a 20       /* (5) */. 
273b0 20 20 20 20 20 20 20 20 26 26 20 26 70 42 75 66          && &pBuf
273c0 5b 2d 34 5d 3e 3d 70 42 75 66 53 74 61 72 74 20  [-4]>=pBufStart 
273d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
273e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
273f0 20 28 36 29 20 2a 2f 0a 20 20 20 20 20 20 20 20   (6) */.        
27400 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 38 20  ){.          u8 
27410 61 53 61 76 65 5b 34 5d 3b 0a 20 20 20 20 20 20  aSave[4];.      
27420 20 20 20 20 75 38 20 2a 61 57 72 69 74 65 20 3d      u8 *aWrite =
27430 20 26 70 42 75 66 5b 2d 34 5d 3b 0a 20 20 20 20   &pBuf[-4];.    
27440 20 20 20 20 20 20 61 73 73 65 72 74 28 20 61 57        assert( aW
27450 72 69 74 65 3e 3d 70 42 75 66 53 74 61 72 74 20  rite>=pBufStart 
27460 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  );              
27470 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 64 75             /* du
27480 65 20 74 6f 20 28 36 29 20 2a 2f 0a 20 20 20 20  e to (6) */.    
27490 20 20 20 20 20 20 6d 65 6d 63 70 79 28 61 53 61        memcpy(aSa
274a0 76 65 2c 20 61 57 72 69 74 65 2c 20 34 29 3b 0a  ve, aWrite, 4);.
274b0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
274c0 71 6c 69 74 65 33 4f 73 52 65 61 64 28 66 64 2c  qlite3OsRead(fd,
274d0 20 61 57 72 69 74 65 2c 20 61 2b 34 2c 20 28 69   aWrite, a+4, (i
274e0 36 34 29 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  64)pBt->pageSize
274f0 2a 28 6e 65 78 74 50 61 67 65 2d 31 29 29 3b 0a  *(nextPage-1));.
27500 20 20 20 20 20 20 20 20 20 20 6e 65 78 74 50 61            nextPa
27510 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 61 57  ge = get4byte(aW
27520 72 69 74 65 29 3b 0a 20 20 20 20 20 20 20 20 20  rite);.         
27530 20 6d 65 6d 63 70 79 28 61 57 72 69 74 65 2c 20   memcpy(aWrite, 
27540 61 53 61 76 65 2c 20 34 29 3b 0a 20 20 20 20 20  aSave, 4);.     
27550 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a     }else.#endif.
27560 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20  .        {.     
27570 20 20 20 20 20 44 62 50 61 67 65 20 2a 70 44 62       DbPage *pDb
27580 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Page;.          
27590 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
275a0 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72  rGet(pBt->pPager
275b0 2c 20 6e 65 78 74 50 61 67 65 2c 20 26 70 44 62  , nextPage, &pDb
275c0 50 61 67 65 2c 0a 20 20 20 20 20 20 20 20 20 20  Page,.          
275d0 20 20 20 20 28 65 4f 70 3d 3d 30 20 3f 20 50 41      (eOp==0 ? PA
275e0 47 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59  GER_GET_READONLY
275f0 20 3a 20 30 29 0a 20 20 20 20 20 20 20 20 20 20   : 0).          
27600 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
27610 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
27620 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 50  {.            aP
27630 61 79 6c 6f 61 64 20 3d 20 73 71 6c 69 74 65 33  ayload = sqlite3
27640 50 61 67 65 72 47 65 74 44 61 74 61 28 70 44 62  PagerGetData(pDb
27650 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
27660 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20 67 65     nextPage = ge
27670 74 34 62 79 74 65 28 61 50 61 79 6c 6f 61 64 29  t4byte(aPayload)
27680 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  ;.            rc
27690 20 3d 20 63 6f 70 79 50 61 79 6c 6f 61 64 28 26   = copyPayload(&
276a0 61 50 61 79 6c 6f 61 64 5b 6f 66 66 73 65 74 2b  aPayload[offset+
276b0 34 5d 2c 20 70 42 75 66 2c 20 61 2c 20 65 4f 70  4], pBuf, a, eOp
276c0 2c 20 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  , pDbPage);.    
276d0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50          sqlite3P
276e0 61 67 65 72 55 6e 72 65 66 28 70 44 62 50 61 67  agerUnref(pDbPag
276f0 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
27700 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20  offset = 0;.    
27710 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
27720 7d 0a 20 20 20 20 20 20 20 20 61 6d 74 20 2d 3d  }.        amt -=
27730 20 61 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   a;.        if( 
27740 61 6d 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  amt==0 ) return 
27750 72 63 3b 0a 20 20 20 20 20 20 20 20 70 42 75 66  rc;.        pBuf
27760 20 2b 3d 20 61 3b 0a 20 20 20 20 20 20 7d 0a 20   += a;.      }. 
27770 20 20 20 20 20 69 66 28 20 72 63 20 29 20 62 72       if( rc ) br
27780 65 61 6b 3b 0a 20 20 20 20 20 20 69 49 64 78 2b  eak;.      iIdx+
27790 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  +;.    }.  }..  
277a0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
277b0 4b 20 26 26 20 61 6d 74 3e 30 20 29 7b 0a 20 20  K && amt>0 ){.  
277c0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
277d0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 2f 2a  CORRUPT_BKPT; /*
277e0 20 4f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 20   Overflow chain 
277f0 65 6e 64 73 20 70 72 65 6d 61 74 75 72 65 6c 79  ends prematurely
27800 20 2a 2f 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   */.  }.  return
27810 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
27820 61 64 20 70 61 72 74 20 6f 66 20 74 68 65 20 70  ad part of the p
27830 61 79 6c 6f 61 64 20 66 6f 72 20 74 68 65 20 72  ayload for the r
27840 6f 77 20 61 74 20 77 68 69 63 68 20 74 68 61 74  ow at which that
27850 20 63 75 72 73 6f 72 20 70 43 75 72 20 69 73 20   cursor pCur is 
27860 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 70 6f 69  currently.** poi
27870 6e 74 69 6e 67 2e 20 20 22 61 6d 74 22 20 62 79  nting.  "amt" by
27880 74 65 73 20 77 69 6c 6c 20 62 65 20 74 72 61 6e  tes will be tran
27890 73 66 65 72 72 65 64 20 69 6e 74 6f 20 70 42 75  sferred into pBu
278a0 66 5b 5d 2e 20 20 54 68 65 20 74 72 61 6e 73 66  f[].  The transf
278b0 65 72 0a 2a 2a 20 62 65 67 69 6e 73 20 61 74 20  er.** begins at 
278c0 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 0a 2a 2a 20  "offset"..**.** 
278d0 70 43 75 72 20 63 61 6e 20 62 65 20 70 6f 69 6e  pCur can be poin
278e0 74 69 6e 67 20 74 6f 20 65 69 74 68 65 72 20 61  ting to either a
278f0 20 74 61 62 6c 65 20 6f 72 20 61 6e 20 69 6e 64   table or an ind
27900 65 78 20 62 2d 74 72 65 65 2e 0a 2a 2a 20 49 66  ex b-tree..** If
27910 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20 74   pointing to a t
27920 61 62 6c 65 20 62 74 72 65 65 2c 20 74 68 65 6e  able btree, then
27930 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 73 65 63   the content sec
27940 74 69 6f 6e 20 69 73 20 72 65 61 64 2e 20 20 49  tion is read.  I
27950 66 0a 2a 2a 20 70 43 75 72 20 69 73 20 70 6f 69  f.** pCur is poi
27960 6e 74 69 6e 67 20 74 6f 20 61 6e 20 69 6e 64 65  nting to an inde
27970 78 20 62 2d 74 72 65 65 20 74 68 65 6e 20 74 68  x b-tree then th
27980 65 20 6b 65 79 20 73 65 63 74 69 6f 6e 20 69 73  e key section is
27990 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72   read..**.** For
279a0 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 79   sqlite3BtreePay
279b0 6c 6f 61 64 28 29 2c 20 74 68 65 20 63 61 6c 6c  load(), the call
279c0 65 72 20 6d 75 73 74 20 65 6e 73 75 72 65 20 74  er must ensure t
279d0 68 61 74 20 70 43 75 72 20 69 73 20 70 6f 69 6e  hat pCur is poin
279e0 74 69 6e 67 0a 2a 2a 20 74 6f 20 61 20 76 61 6c  ting.** to a val
279f0 69 64 20 72 6f 77 20 69 6e 20 74 68 65 20 74 61  id row in the ta
27a00 62 6c 65 2e 20 20 46 6f 72 20 73 71 6c 69 74 65  ble.  For sqlite
27a10 33 42 74 72 65 65 50 61 79 6c 6f 61 64 43 68 65  3BtreePayloadChe
27a20 63 6b 65 64 28 29 2c 20 74 68 65 0a 2a 2a 20 63  cked(), the.** c
27a30 75 72 73 6f 72 20 6d 69 67 68 74 20 62 65 20 69  ursor might be i
27a40 6e 76 61 6c 69 64 20 6f 72 20 6d 69 67 68 74 20  nvalid or might 
27a50 6e 65 65 64 20 74 6f 20 62 65 20 72 65 73 74 6f  need to be resto
27a60 72 65 64 20 62 65 66 6f 72 65 20 62 65 69 6e 67  red before being
27a70 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74   read..**.** Ret
27a80 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e  urn SQLITE_OK on
27a90 20 73 75 63 63 65 73 73 20 6f 72 20 61 6e 20 65   success or an e
27aa0 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 79  rror code if any
27ab0 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72  thing goes.** wr
27ac0 6f 6e 67 2e 20 20 41 6e 20 65 72 72 6f 72 20 69  ong.  An error i
27ad0 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 22 6f  s returned if "o
27ae0 66 66 73 65 74 2b 61 6d 74 22 20 69 73 20 6c 61  ffset+amt" is la
27af0 72 67 65 72 20 74 68 61 6e 0a 2a 2a 20 74 68 65  rger than.** the
27b00 20 61 76 61 69 6c 61 62 6c 65 20 70 61 79 6c 6f   available paylo
27b10 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ad..*/.int sqlit
27b20 65 33 42 74 72 65 65 50 61 79 6c 6f 61 64 28 42  e3BtreePayload(B
27b30 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75  tCursor *pCur, u
27b40 33 32 20 6f 66 66 73 65 74 2c 20 75 33 32 20 61  32 offset, u32 a
27b50 6d 74 2c 20 76 6f 69 64 20 2a 70 42 75 66 29 7b  mt, void *pBuf){
27b60 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
27b70 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
27b80 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
27b90 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
27ba0 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61  SOR_VALID );.  a
27bb0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61  ssert( pCur->iPa
27bc0 67 65 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 61  ge>=0 && pCur->a
27bd0 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
27be0 65 5d 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  e] );.  assert( 
27bf0 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
27c00 2d 3e 69 50 61 67 65 5d 3c 70 43 75 72 2d 3e 61  ->iPage]<pCur->a
27c10 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
27c20 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 72  e]->nCell );.  r
27c30 65 74 75 72 6e 20 61 63 63 65 73 73 50 61 79 6c  eturn accessPayl
27c40 6f 61 64 28 70 43 75 72 2c 20 6f 66 66 73 65 74  oad(pCur, offset
27c50 2c 20 61 6d 74 2c 20 28 75 6e 73 69 67 6e 65 64  , amt, (unsigned
27c60 20 63 68 61 72 2a 29 70 42 75 66 2c 20 30 29 3b   char*)pBuf, 0);
27c70 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 76  .}../*.** This v
27c80 61 72 69 61 6e 74 20 6f 66 20 73 71 6c 69 74 65  ariant of sqlite
27c90 33 42 74 72 65 65 50 61 79 6c 6f 61 64 28 29 20  3BtreePayload() 
27ca0 77 6f 72 6b 73 20 65 76 65 6e 20 69 66 20 74 68  works even if th
27cb0 65 20 63 75 72 73 6f 72 20 68 61 73 20 6e 6f 74  e cursor has not
27cc0 0a 2a 2a 20 69 6e 20 74 68 65 20 43 55 52 53 4f  .** in the CURSO
27cd0 52 5f 56 41 4c 49 44 20 73 74 61 74 65 2e 20 20  R_VALID state.  
27ce0 49 74 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20  It is only used 
27cf0 62 79 20 74 68 65 20 73 71 6c 69 74 65 33 5f 62  by the sqlite3_b
27d00 6c 6f 62 5f 72 65 61 64 28 29 0a 2a 2a 20 69 6e  lob_read().** in
27d10 74 65 72 66 61 63 65 2e 0a 2a 2f 0a 23 69 66 6e  terface..*/.#ifn
27d20 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
27d30 49 4e 43 52 42 4c 4f 42 0a 73 74 61 74 69 63 20  INCRBLOB.static 
27d40 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20  SQLITE_NOINLINE 
27d50 69 6e 74 20 61 63 63 65 73 73 50 61 79 6c 6f 61  int accessPayloa
27d60 64 43 68 65 63 6b 65 64 28 0a 20 20 42 74 43 75  dChecked(.  BtCu
27d70 72 73 6f 72 20 2a 70 43 75 72 2c 0a 20 20 75 33  rsor *pCur,.  u3
27d80 32 20 6f 66 66 73 65 74 2c 0a 20 20 75 33 32 20  2 offset,.  u32 
27d90 61 6d 74 2c 0a 20 20 76 6f 69 64 20 2a 70 42 75  amt,.  void *pBu
27da0 66 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  f.){.  int rc;. 
27db0 20 69 66 20 28 20 70 43 75 72 2d 3e 65 53 74 61   if ( pCur->eSta
27dc0 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c  te==CURSOR_INVAL
27dd0 49 44 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ID ){.    return
27de0 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 3b 0a 20   SQLITE_ABORT;. 
27df0 20 7d 0a 20 20 61 73 73 65 72 74 28 20 63 75 72   }.  assert( cur
27e00 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28  sorOwnsBtShared(
27e10 70 43 75 72 29 20 29 3b 0a 20 20 72 63 20 3d 20  pCur) );.  rc = 
27e20 62 74 72 65 65 52 65 73 74 6f 72 65 43 75 72 73  btreeRestoreCurs
27e30 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29  orPosition(pCur)
27e40 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 20 3f 20  ;.  return rc ? 
27e50 72 63 20 3a 20 61 63 63 65 73 73 50 61 79 6c 6f  rc : accessPaylo
27e60 61 64 28 70 43 75 72 2c 20 6f 66 66 73 65 74 2c  ad(pCur, offset,
27e70 20 61 6d 74 2c 20 70 42 75 66 2c 20 30 29 3b 0a   amt, pBuf, 0);.
27e80 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  }.int sqlite3Btr
27e90 65 65 50 61 79 6c 6f 61 64 43 68 65 63 6b 65 64  eePayloadChecked
27ea0 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
27eb0 20 75 33 32 20 6f 66 66 73 65 74 2c 20 75 33 32   u32 offset, u32
27ec0 20 61 6d 74 2c 20 76 6f 69 64 20 2a 70 42 75 66   amt, void *pBuf
27ed0 29 7b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65  ){.  if( pCur->e
27ee0 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
27ef0 4c 49 44 20 29 7b 0a 20 20 20 20 61 73 73 65 72  LID ){.    asser
27f00 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53  t( cursorOwnsBtS
27f10 68 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20  hared(pCur) );. 
27f20 20 20 20 72 65 74 75 72 6e 20 61 63 63 65 73 73     return access
27f30 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 6f 66  Payload(pCur, of
27f40 66 73 65 74 2c 20 61 6d 74 2c 20 70 42 75 66 2c  fset, amt, pBuf,
27f50 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20   0);.  }else{.  
27f60 20 20 72 65 74 75 72 6e 20 61 63 63 65 73 73 50    return accessP
27f70 61 79 6c 6f 61 64 43 68 65 63 6b 65 64 28 70 43  ayloadChecked(pC
27f80 75 72 2c 20 6f 66 66 73 65 74 2c 20 61 6d 74 2c  ur, offset, amt,
27f90 20 70 42 75 66 29 3b 0a 20 20 7d 0a 7d 0a 23 65   pBuf);.  }.}.#e
27fa0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
27fb0 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 20 2a 2f 0a  MIT_INCRBLOB */.
27fc0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
27fd0 70 6f 69 6e 74 65 72 20 74 6f 20 70 61 79 6c 6f  pointer to paylo
27fe0 61 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  ad information f
27ff0 72 6f 6d 20 74 68 65 20 65 6e 74 72 79 20 74 68  rom the entry th
28000 61 74 20 74 68 65 20 0a 2a 2a 20 70 43 75 72 20  at the .** pCur 
28010 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69  cursor is pointi
28020 6e 67 20 74 6f 2e 20 20 54 68 65 20 70 6f 69 6e  ng to.  The poin
28030 74 65 72 20 69 73 20 74 6f 20 74 68 65 20 62 65  ter is to the be
28040 67 69 6e 6e 69 6e 67 20 6f 66 0a 2a 2a 20 74 68  ginning of.** th
28050 65 20 6b 65 79 20 69 66 20 69 6e 64 65 78 20 62  e key if index b
28060 74 72 65 65 73 20 28 70 50 61 67 65 2d 3e 69 6e  trees (pPage->in
28070 74 4b 65 79 3d 3d 30 29 20 61 6e 64 20 69 73 20  tKey==0) and is 
28080 74 68 65 20 64 61 74 61 20 66 6f 72 0a 2a 2a 20  the data for.** 
28090 74 61 62 6c 65 20 62 74 72 65 65 73 20 28 70 50  table btrees (pP
280a0 61 67 65 2d 3e 69 6e 74 4b 65 79 3d 3d 31 29 2e  age->intKey==1).
280b0 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   The number of b
280c0 79 74 65 73 20 6f 66 20 61 76 61 69 6c 61 62 6c  ytes of availabl
280d0 65 0a 2a 2a 20 6b 65 79 2f 64 61 74 61 20 69 73  e.** key/data is
280e0 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 2a 70   written into *p
280f0 41 6d 74 2e 20 20 49 66 20 2a 70 41 6d 74 3d 3d  Amt.  If *pAmt==
28100 30 2c 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75  0, then the valu
28110 65 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 77 69  e.** returned wi
28120 6c 6c 20 6e 6f 74 20 62 65 20 61 20 76 61 6c 69  ll not be a vali
28130 64 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a  d pointer..**.**
28140 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
28150 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e   an optimization
28160 2e 20 20 49 74 20 69 73 20 63 6f 6d 6d 6f 6e 20  .  It is common 
28170 66 6f 72 20 74 68 65 20 65 6e 74 69 72 65 20 6b  for the entire k
28180 65 79 0a 2a 2a 20 61 6e 64 20 64 61 74 61 20 74  ey.** and data t
28190 6f 20 66 69 74 20 6f 6e 20 74 68 65 20 6c 6f 63  o fit on the loc
281a0 61 6c 20 70 61 67 65 20 61 6e 64 20 66 6f 72 20  al page and for 
281b0 74 68 65 72 65 20 74 6f 20 62 65 20 6e 6f 20 6f  there to be no o
281c0 76 65 72 66 6c 6f 77 0a 2a 2a 20 70 61 67 65 73  verflow.** pages
281d0 2e 20 20 57 68 65 6e 20 74 68 61 74 20 69 73 20  .  When that is 
281e0 73 6f 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  so, this routine
281f0 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20   can be used to 
28200 61 63 63 65 73 73 20 74 68 65 0a 2a 2a 20 6b 65  access the.** ke
28210 79 20 61 6e 64 20 64 61 74 61 20 77 69 74 68 6f  y and data witho
28220 75 74 20 6d 61 6b 69 6e 67 20 61 20 63 6f 70 79  ut making a copy
28230 2e 20 20 49 66 20 74 68 65 20 6b 65 79 20 61 6e  .  If the key an
28240 64 2f 6f 72 20 64 61 74 61 20 73 70 69 6c 6c 73  d/or data spills
28250 0a 2a 2a 20 6f 6e 74 6f 20 6f 76 65 72 66 6c 6f  .** onto overflo
28260 77 20 70 61 67 65 73 2c 20 74 68 65 6e 20 61 63  w pages, then ac
28270 63 65 73 73 50 61 79 6c 6f 61 64 28 29 20 6d 75  cessPayload() mu
28280 73 74 20 62 65 20 75 73 65 64 20 74 6f 20 72 65  st be used to re
28290 61 73 73 65 6d 62 6c 65 0a 2a 2a 20 74 68 65 20  assemble.** the 
282a0 6b 65 79 2f 64 61 74 61 20 61 6e 64 20 63 6f 70  key/data and cop
282b0 79 20 69 74 20 69 6e 74 6f 20 61 20 70 72 65 61  y it into a prea
282c0 6c 6c 6f 63 61 74 65 64 20 62 75 66 66 65 72 2e  llocated buffer.
282d0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f 69 6e 74  .**.** The point
282e0 65 72 20 72 65 74 75 72 6e 65 64 20 62 79 20 74  er returned by t
282f0 68 69 73 20 72 6f 75 74 69 6e 65 20 6c 6f 6f 6b  his routine look
28300 73 20 64 69 72 65 63 74 6c 79 20 69 6e 74 6f 20  s directly into 
28310 74 68 65 20 63 61 63 68 65 64 0a 2a 2a 20 70 61  the cached.** pa
28320 67 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ge of the databa
28330 73 65 2e 20 20 54 68 65 20 64 61 74 61 20 6d 69  se.  The data mi
28340 67 68 74 20 63 68 61 6e 67 65 20 6f 72 20 6d 6f  ght change or mo
28350 76 65 20 74 68 65 20 6e 65 78 74 20 74 69 6d 65  ve the next time
28360 0a 2a 2a 20 61 6e 79 20 62 74 72 65 65 20 72 6f  .** any btree ro
28370 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e  utine is called.
28380 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .*/.static const
28390 20 76 6f 69 64 20 2a 66 65 74 63 68 50 61 79 6c   void *fetchPayl
283a0 6f 61 64 28 0a 20 20 42 74 43 75 72 73 6f 72 20  oad(.  BtCursor 
283b0 2a 70 43 75 72 2c 20 20 20 20 20 20 2f 2a 20 43  *pCur,      /* C
283c0 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74  ursor pointing t
283d0 6f 20 65 6e 74 72 79 20 74 6f 20 72 65 61 64 20  o entry to read 
283e0 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32 20 2a 70  from */.  u32 *p
283f0 41 6d 74 20 20 20 20 20 20 20 20 20 20 20 20 2f  Amt            /
28400 2a 20 57 72 69 74 65 20 74 68 65 20 6e 75 6d 62  * Write the numb
28410 65 72 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20  er of available 
28420 62 79 74 65 73 20 68 65 72 65 20 2a 2f 0a 29 7b  bytes here */.){
28430 0a 20 20 75 33 32 20 61 6d 74 3b 0a 20 20 61 73  .  u32 amt;.  as
28440 73 65 72 74 28 20 70 43 75 72 21 3d 30 20 26 26  sert( pCur!=0 &&
28450 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20   pCur->iPage>=0 
28460 26 26 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  && pCur->apPage[
28470 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 3b 0a 20  pCur->iPage]);. 
28480 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
28490 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
284a0 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28  LID );.  assert(
284b0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
284c0 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65  eld(pCur->pBtree
284d0 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  ->db->mutex) );.
284e0 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
284f0 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70 43 75  OwnsBtShared(pCu
28500 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
28510 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
28520 2d 3e 69 50 61 67 65 5d 3c 70 43 75 72 2d 3e 61  ->iPage]<pCur->a
28530 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
28540 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61  e]->nCell );.  a
28550 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 6e 66  ssert( pCur->inf
28560 6f 2e 6e 53 69 7a 65 3e 30 20 29 3b 0a 20 20 61  o.nSize>0 );.  a
28570 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 6e 66  ssert( pCur->inf
28580 6f 2e 70 50 61 79 6c 6f 61 64 3e 70 43 75 72 2d  o.pPayload>pCur-
28590 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
285a0 61 67 65 5d 2d 3e 61 44 61 74 61 20 7c 7c 20 43  age]->aData || C
285b0 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 61  ORRUPT_DB );.  a
285c0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 6e 66  ssert( pCur->inf
285d0 6f 2e 70 50 61 79 6c 6f 61 64 3c 70 43 75 72 2d  o.pPayload<pCur-
285e0 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
285f0 61 67 65 5d 2d 3e 61 44 61 74 61 45 6e 64 20 7c  age]->aDataEnd |
28600 7c 43 4f 52 52 55 50 54 5f 44 42 29 3b 0a 20 20  |CORRUPT_DB);.  
28610 61 6d 74 20 3d 20 28 69 6e 74 29 28 70 43 75 72  amt = (int)(pCur
28620 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
28630 50 61 67 65 5d 2d 3e 61 44 61 74 61 45 6e 64 20  Page]->aDataEnd 
28640 2d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 50 61  - pCur->info.pPa
28650 79 6c 6f 61 64 29 3b 0a 20 20 69 66 28 20 70 43  yload);.  if( pC
28660 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3c  ur->info.nLocal<
28670 61 6d 74 20 29 20 61 6d 74 20 3d 20 70 43 75 72  amt ) amt = pCur
28680 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20  ->info.nLocal;. 
28690 20 2a 70 41 6d 74 20 3d 20 61 6d 74 3b 0a 20 20   *pAmt = amt;.  
286a0 72 65 74 75 72 6e 20 28 76 6f 69 64 2a 29 70 43  return (void*)pC
286b0 75 72 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f 61  ur->info.pPayloa
286c0 64 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72  d;.}.../*.** For
286d0 20 74 68 65 20 65 6e 74 72 79 20 74 68 61 74 20   the entry that 
286e0 63 75 72 73 6f 72 20 70 43 75 72 20 69 73 20 70  cursor pCur is p
286f0 6f 69 6e 74 20 74 6f 2c 20 72 65 74 75 72 6e 20  oint to, return 
28700 61 73 0a 2a 2a 20 6d 61 6e 79 20 62 79 74 65 73  as.** many bytes
28710 20 6f 66 20 74 68 65 20 6b 65 79 20 6f 72 20 64   of the key or d
28720 61 74 61 20 61 73 20 61 72 65 20 61 76 61 69 6c  ata as are avail
28730 61 62 6c 65 20 6f 6e 20 74 68 65 20 6c 6f 63 61  able on the loca
28740 6c 0a 2a 2a 20 62 2d 74 72 65 65 20 70 61 67 65  l.** b-tree page
28750 2e 20 20 57 72 69 74 65 20 74 68 65 20 6e 75 6d  .  Write the num
28760 62 65 72 20 6f 66 20 61 76 61 69 6c 61 62 6c 65  ber of available
28770 20 62 79 74 65 73 20 69 6e 74 6f 20 2a 70 41 6d   bytes into *pAm
28780 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f 69  t..**.** The poi
28790 6e 74 65 72 20 72 65 74 75 72 6e 65 64 20 69 73  nter returned is
287a0 20 65 70 68 65 6d 65 72 61 6c 2e 20 20 54 68 65   ephemeral.  The
287b0 20 6b 65 79 2f 64 61 74 61 20 6d 61 79 20 6d 6f   key/data may mo
287c0 76 65 0a 2a 2a 20 6f 72 20 62 65 20 64 65 73 74  ve.** or be dest
287d0 72 6f 79 65 64 20 6f 6e 20 74 68 65 20 6e 65 78  royed on the nex
287e0 74 20 63 61 6c 6c 20 74 6f 20 61 6e 79 20 42 74  t call to any Bt
287f0 72 65 65 20 72 6f 75 74 69 6e 65 2c 0a 2a 2a 20  ree routine,.** 
28800 69 6e 63 6c 75 64 69 6e 67 20 63 61 6c 6c 73 20  including calls 
28810 66 72 6f 6d 20 6f 74 68 65 72 20 74 68 72 65 61  from other threa
28820 64 73 20 61 67 61 69 6e 73 74 20 74 68 65 20 73  ds against the s
28830 61 6d 65 20 63 61 63 68 65 2e 0a 2a 2a 20 48 65  ame cache..** He
28840 6e 63 65 2c 20 61 20 6d 75 74 65 78 20 6f 6e 20  nce, a mutex on 
28850 74 68 65 20 42 74 53 68 61 72 65 64 20 73 68 6f  the BtShared sho
28860 75 6c 64 20 62 65 20 68 65 6c 64 20 70 72 69 6f  uld be held prio
28870 72 20 74 6f 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20  r to calling.** 
28880 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a  this routine..**
28890 0a 2a 2a 20 54 68 65 73 65 20 72 6f 75 74 69 6e  .** These routin
288a0 65 73 20 69 73 20 75 73 65 64 20 74 6f 20 67 65  es is used to ge
288b0 74 20 71 75 69 63 6b 20 61 63 63 65 73 73 20 74  t quick access t
288c0 6f 20 6b 65 79 20 61 6e 64 20 64 61 74 61 0a 2a  o key and data.*
288d0 2a 20 69 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e 20  * in the common 
288e0 63 61 73 65 20 77 68 65 72 65 20 6e 6f 20 6f 76  case where no ov
288f0 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61 72 65  erflow pages are
28900 20 75 73 65 64 2e 0a 2a 2f 0a 63 6f 6e 73 74 20   used..*/.const 
28910 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 42 74 72  void *sqlite3Btr
28920 65 65 50 61 79 6c 6f 61 64 46 65 74 63 68 28 42  eePayloadFetch(B
28930 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75  tCursor *pCur, u
28940 33 32 20 2a 70 41 6d 74 29 7b 0a 20 20 72 65 74  32 *pAmt){.  ret
28950 75 72 6e 20 66 65 74 63 68 50 61 79 6c 6f 61 64  urn fetchPayload
28960 28 70 43 75 72 2c 20 70 41 6d 74 29 3b 0a 7d 0a  (pCur, pAmt);.}.
28970 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65  ../*.** Move the
28980 20 63 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20   cursor down to 
28990 61 20 6e 65 77 20 63 68 69 6c 64 20 70 61 67 65  a new child page
289a0 2e 20 20 54 68 65 20 6e 65 77 50 67 6e 6f 20 61  .  The newPgno a
289b0 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 0a 2a  rgument is the.*
289c0 2a 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  * page number of
289d0 20 74 68 65 20 63 68 69 6c 64 20 70 61 67 65 20   the child page 
289e0 74 6f 20 6d 6f 76 65 20 74 6f 2e 0a 2a 2a 0a 2a  to move to..**.*
289f0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
28a00 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 43  returns SQLITE_C
28a10 4f 52 52 55 50 54 20 69 66 20 74 68 65 20 70 61  ORRUPT if the pa
28a20 67 65 2d 68 65 61 64 65 72 20 66 6c 61 67 73 20  ge-header flags 
28a30 66 69 65 6c 64 20 6f 66 0a 2a 2a 20 74 68 65 20  field of.** the 
28a40 6e 65 77 20 63 68 69 6c 64 20 70 61 67 65 20 64  new child page d
28a50 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 74 68  oes not match th
28a60 65 20 66 6c 61 67 73 20 66 69 65 6c 64 20 6f 66  e flags field of
28a70 20 74 68 65 20 70 61 72 65 6e 74 20 28 69 2e 65   the parent (i.e
28a80 2e 0a 2a 2a 20 69 66 20 61 6e 20 69 6e 74 6b 65  ..** if an intke
28a90 79 20 70 61 67 65 20 61 70 70 65 61 72 73 20 74  y page appears t
28aa0 6f 20 62 65 20 74 68 65 20 70 61 72 65 6e 74 20  o be the parent 
28ab0 6f 66 20 61 20 6e 6f 6e 2d 69 6e 74 6b 65 79 20  of a non-intkey 
28ac0 70 61 67 65 2c 20 6f 72 0a 2a 2a 20 76 69 63 65  page, or.** vice
28ad0 2d 76 65 72 73 61 29 2e 0a 2a 2f 0a 73 74 61 74  -versa)..*/.stat
28ae0 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 43 68 69  ic int moveToChi
28af0 6c 64 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  ld(BtCursor *pCu
28b00 72 2c 20 75 33 32 20 6e 65 77 50 67 6e 6f 29 7b  r, u32 newPgno){
28b10 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
28b20 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b 0a 0a 20   = pCur->pBt;.. 
28b30 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f   assert( cursorO
28b40 77 6e 73 42 74 53 68 61 72 65 64 28 70 43 75 72  wnsBtShared(pCur
28b50 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
28b60 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
28b70 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61  SOR_VALID );.  a
28b80 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61  ssert( pCur->iPa
28b90 67 65 3c 42 54 43 55 52 53 4f 52 5f 4d 41 58 5f  ge<BTCURSOR_MAX_
28ba0 44 45 50 54 48 20 29 3b 0a 20 20 61 73 73 65 72  DEPTH );.  asser
28bb0 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d  t( pCur->iPage>=
28bc0 30 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d  0 );.  if( pCur-
28bd0 3e 69 50 61 67 65 3e 3d 28 42 54 43 55 52 53 4f  >iPage>=(BTCURSO
28be0 52 5f 4d 41 58 5f 44 45 50 54 48 2d 31 29 20 29  R_MAX_DEPTH-1) )
28bf0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
28c00 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
28c10 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 69 6e  ;.  }.  pCur->in
28c20 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20  fo.nSize = 0;.  
28c30 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26  pCur->curFlags &
28c40 3d 20 7e 28 42 54 43 46 5f 56 61 6c 69 64 4e 4b  = ~(BTCF_ValidNK
28c50 65 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66  ey|BTCF_ValidOvf
28c60 6c 29 3b 0a 20 20 70 43 75 72 2d 3e 69 50 61 67  l);.  pCur->iPag
28c70 65 2b 2b 3b 0a 20 20 70 43 75 72 2d 3e 61 69 49  e++;.  pCur->aiI
28c80 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20  dx[pCur->iPage] 
28c90 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 67 65  = 0;.  return ge
28ca0 74 41 6e 64 49 6e 69 74 50 61 67 65 28 70 42 74  tAndInitPage(pBt
28cb0 2c 20 6e 65 77 50 67 6e 6f 2c 20 26 70 43 75 72  , newPgno, &pCur
28cc0 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
28cd0 50 61 67 65 5d 2c 0a 20 20 20 20 20 20 20 20 20  Page],.         
28ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
28cf0 43 75 72 2c 20 70 43 75 72 2d 3e 63 75 72 50 61  Cur, pCur->curPa
28d00 67 65 72 46 6c 61 67 73 29 3b 0a 7d 0a 0a 23 69  gerFlags);.}..#i
28d10 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
28d20 47 0a 2f 2a 0a 2a 2a 20 50 61 67 65 20 70 50 61  G./*.** Page pPa
28d30 72 65 6e 74 20 69 73 20 61 6e 20 69 6e 74 65 72  rent is an inter
28d40 6e 61 6c 20 28 6e 6f 6e 2d 6c 65 61 66 29 20 74  nal (non-leaf) t
28d50 72 65 65 20 70 61 67 65 2e 20 54 68 69 73 20 66  ree page. This f
28d60 75 6e 63 74 69 6f 6e 20 0a 2a 2a 20 61 73 73 65  unction .** asse
28d70 72 74 73 20 74 68 61 74 20 70 61 67 65 20 6e 75  rts that page nu
28d80 6d 62 65 72 20 69 43 68 69 6c 64 20 69 73 20 74  mber iChild is t
28d90 68 65 20 6c 65 66 74 2d 63 68 69 6c 64 20 69 66  he left-child if
28da0 20 74 68 65 20 69 49 64 78 27 74 68 0a 2a 2a 20   the iIdx'th.** 
28db0 63 65 6c 6c 20 69 6e 20 70 61 67 65 20 70 50 61  cell in page pPa
28dc0 72 65 6e 74 2e 20 4f 72 2c 20 69 66 20 69 49 64  rent. Or, if iId
28dd0 78 20 69 73 20 65 71 75 61 6c 20 74 6f 20 74 68  x is equal to th
28de0 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  e total number o
28df0 66 0a 2a 2a 20 63 65 6c 6c 73 20 69 6e 20 70 50  f.** cells in pP
28e00 61 72 65 6e 74 2c 20 74 68 61 74 20 70 61 67 65  arent, that page
28e10 20 6e 75 6d 62 65 72 20 69 43 68 69 6c 64 20 69   number iChild i
28e20 73 20 74 68 65 20 72 69 67 68 74 2d 63 68 69 6c  s the right-chil
28e30 64 20 6f 66 0a 2a 2a 20 74 68 65 20 70 61 67 65  d of.** the page
28e40 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
28e50 20 61 73 73 65 72 74 50 61 72 65 6e 74 49 6e 64   assertParentInd
28e60 65 78 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 72  ex(MemPage *pPar
28e70 65 6e 74 2c 20 69 6e 74 20 69 49 64 78 2c 20 50  ent, int iIdx, P
28e80 67 6e 6f 20 69 43 68 69 6c 64 29 7b 0a 20 20 69  gno iChild){.  i
28e90 66 28 20 43 4f 52 52 55 50 54 5f 44 42 20 29 20  f( CORRUPT_DB ) 
28ea0 72 65 74 75 72 6e 3b 20 20 2f 2a 20 54 68 65 20  return;  /* The 
28eb0 63 6f 6e 64 69 74 69 6f 6e 73 20 74 65 73 74 65  conditions teste
28ec0 64 20 62 65 6c 6f 77 20 6d 69 67 68 74 20 6e 6f  d below might no
28ed0 74 20 62 65 20 74 72 75 65 0a 20 20 20 20 20 20  t be true.      
28ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28ef0 20 20 20 20 20 20 2a 2a 20 69 6e 20 61 20 63 6f        ** in a co
28f00 72 72 75 70 74 20 64 61 74 61 62 61 73 65 20 2a  rrupt database *
28f10 2f 0a 20 20 61 73 73 65 72 74 28 20 69 49 64 78  /.  assert( iIdx
28f20 3c 3d 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c  <=pParent->nCell
28f30 20 29 3b 0a 20 20 69 66 28 20 69 49 64 78 3d 3d   );.  if( iIdx==
28f40 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29  pParent->nCell )
28f50 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 67 65  {.    assert( ge
28f60 74 34 62 79 74 65 28 26 70 50 61 72 65 6e 74 2d  t4byte(&pParent-
28f70 3e 61 44 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e  >aData[pParent->
28f80 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3d 3d 69  hdrOffset+8])==i
28f90 43 68 69 6c 64 20 29 3b 0a 20 20 7d 65 6c 73 65  Child );.  }else
28fa0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 67 65  {.    assert( ge
28fb0 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28  t4byte(findCell(
28fc0 70 50 61 72 65 6e 74 2c 20 69 49 64 78 29 29 3d  pParent, iIdx))=
28fd0 3d 69 43 68 69 6c 64 20 29 3b 0a 20 20 7d 0a 7d  =iChild );.  }.}
28fe0 0a 23 65 6c 73 65 0a 23 20 20 64 65 66 69 6e 65  .#else.#  define
28ff0 20 61 73 73 65 72 74 50 61 72 65 6e 74 49 6e 64   assertParentInd
29000 65 78 28 78 2c 79 2c 7a 29 20 0a 23 65 6e 64 69  ex(x,y,z) .#endi
29010 66 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68  f../*.** Move th
29020 65 20 63 75 72 73 6f 72 20 75 70 20 74 6f 20 74  e cursor up to t
29030 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 2e 0a  he parent page..
29040 2a 2a 0a 2a 2a 20 70 43 75 72 2d 3e 69 64 78 20  **.** pCur->idx 
29050 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 63 65  is set to the ce
29060 6c 6c 20 69 6e 64 65 78 20 74 68 61 74 20 63 6f  ll index that co
29070 6e 74 61 69 6e 73 20 74 68 65 20 70 6f 69 6e 74  ntains the point
29080 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 70 61 67  er.** to the pag
29090 65 20 77 65 20 61 72 65 20 63 6f 6d 69 6e 67 20  e we are coming 
290a0 66 72 6f 6d 2e 20 20 49 66 20 77 65 20 61 72 65  from.  If we are
290b0 20 63 6f 6d 69 6e 67 20 66 72 6f 6d 20 74 68 65   coming from the
290c0 0a 2a 2a 20 72 69 67 68 74 2d 6d 6f 73 74 20 63  .** right-most c
290d0 68 69 6c 64 20 70 61 67 65 20 74 68 65 6e 20 70  hild page then p
290e0 43 75 72 2d 3e 69 64 78 20 69 73 20 73 65 74 20  Cur->idx is set 
290f0 74 6f 20 6f 6e 65 20 6d 6f 72 65 20 74 68 61 6e  to one more than
29100 0a 2a 2a 20 74 68 65 20 6c 61 72 67 65 73 74 20  .** the largest 
29110 63 65 6c 6c 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73  cell index..*/.s
29120 74 61 74 69 63 20 76 6f 69 64 20 6d 6f 76 65 54  tatic void moveT
29130 6f 50 61 72 65 6e 74 28 42 74 43 75 72 73 6f 72  oParent(BtCursor
29140 20 2a 70 43 75 72 29 7b 0a 20 20 61 73 73 65 72   *pCur){.  asser
29150 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53  t( cursorOwnsBtS
29160 68 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20  hared(pCur) );. 
29170 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
29180 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
29190 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28  LID );.  assert(
291a0 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 30 20 29   pCur->iPage>0 )
291b0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
291c0 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
291d0 50 61 67 65 5d 20 29 3b 0a 20 20 61 73 73 65 72  Page] );.  asser
291e0 74 50 61 72 65 6e 74 49 6e 64 65 78 28 0a 20 20  tParentIndex(.  
291f0 20 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70    pCur->apPage[p
29200 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d 2c 20 0a  Cur->iPage-1], .
29210 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b      pCur->aiIdx[
29220 70 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d 2c 20  pCur->iPage-1], 
29230 0a 20 20 20 20 70 43 75 72 2d 3e 61 70 50 61 67  .    pCur->apPag
29240 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e  e[pCur->iPage]->
29250 70 67 6e 6f 0a 20 20 29 3b 0a 20 20 74 65 73 74  pgno.  );.  test
29260 63 61 73 65 28 20 70 43 75 72 2d 3e 61 69 49 64  case( pCur->aiId
29270 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d  x[pCur->iPage-1]
29280 20 3e 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b   > pCur->apPage[
29290 70 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d 2d 3e  pCur->iPage-1]->
292a0 6e 43 65 6c 6c 20 29 3b 0a 20 20 70 43 75 72 2d  nCell );.  pCur-
292b0 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b  >info.nSize = 0;
292c0 0a 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67  .  pCur->curFlag
292d0 73 20 26 3d 20 7e 28 42 54 43 46 5f 56 61 6c 69  s &= ~(BTCF_Vali
292e0 64 4e 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69 64  dNKey|BTCF_Valid
292f0 4f 76 66 6c 29 3b 0a 20 20 72 65 6c 65 61 73 65  Ovfl);.  release
29300 50 61 67 65 4e 6f 74 4e 75 6c 6c 28 70 43 75 72  PageNotNull(pCur
29310 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
29320 50 61 67 65 2d 2d 5d 29 3b 0a 7d 0a 0a 2f 2a 0a  Page--]);.}../*.
29330 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73  ** Move the curs
29340 6f 72 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74  or to point to t
29350 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20  he root page of 
29360 69 74 73 20 62 2d 74 72 65 65 20 73 74 72 75 63  its b-tree struc
29370 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ture..**.** If t
29380 68 65 20 74 61 62 6c 65 20 68 61 73 20 61 20 76  he table has a v
29390 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65  irtual root page
293a0 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f  , then the curso
293b0 72 20 69 73 20 6d 6f 76 65 64 20 74 6f 20 70 6f  r is moved to po
293c0 69 6e 74 0a 2a 2a 20 74 6f 20 74 68 65 20 76 69  int.** to the vi
293d0 72 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 20  rtual root page 
293e0 69 6e 73 74 65 61 64 20 6f 66 20 74 68 65 20 61  instead of the a
293f0 63 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 2e  ctual root page.
29400 20 41 20 74 61 62 6c 65 20 68 61 73 20 61 0a 2a   A table has a.*
29410 2a 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70  * virtual root p
29420 61 67 65 20 77 68 65 6e 20 74 68 65 20 61 63 74  age when the act
29430 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 20 63 6f  ual root page co
29440 6e 74 61 69 6e 73 20 6e 6f 20 63 65 6c 6c 73 20  ntains no cells 
29450 61 6e 64 20 61 20 0a 2a 2a 20 73 69 6e 67 6c 65  and a .** single
29460 20 63 68 69 6c 64 20 70 61 67 65 2e 20 54 68 69   child page. Thi
29470 73 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65  s can only happe
29480 6e 20 77 69 74 68 20 74 68 65 20 74 61 62 6c 65  n with the table
29490 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67 65 20   rooted at page 
294a0 31 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  1..**.** If the 
294b0 62 2d 74 72 65 65 20 73 74 72 75 63 74 75 72 65  b-tree structure
294c0 20 69 73 20 65 6d 70 74 79 2c 20 74 68 65 20 63   is empty, the c
294d0 75 72 73 6f 72 20 73 74 61 74 65 20 69 73 20 73  ursor state is s
294e0 65 74 20 74 6f 20 0a 2a 2a 20 43 55 52 53 4f 52  et to .** CURSOR
294f0 5f 49 4e 56 41 4c 49 44 2e 20 4f 74 68 65 72 77  _INVALID. Otherw
29500 69 73 65 2c 20 74 68 65 20 63 75 72 73 6f 72 20  ise, the cursor 
29510 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20  is set to point 
29520 74 6f 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20  to the first.** 
29530 63 65 6c 6c 20 6c 6f 63 61 74 65 64 20 6f 6e 20  cell located on 
29540 74 68 65 20 72 6f 6f 74 20 28 6f 72 20 76 69 72  the root (or vir
29550 74 75 61 6c 20 72 6f 6f 74 29 20 70 61 67 65 20  tual root) page 
29560 61 6e 64 20 74 68 65 20 63 75 72 73 6f 72 20 73  and the cursor s
29570 74 61 74 65 0a 2a 2a 20 69 73 20 73 65 74 20 74  tate.** is set t
29580 6f 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 2e 0a  o CURSOR_VALID..
29590 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 66 75  **.** If this fu
295a0 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 73  nction returns s
295b0 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 69 74 20  uccessfully, it 
295c0 6d 61 79 20 62 65 20 61 73 73 75 6d 65 64 20 74  may be assumed t
295d0 68 61 74 20 74 68 65 0a 2a 2a 20 70 61 67 65 2d  hat the.** page-
295e0 68 65 61 64 65 72 20 66 6c 61 67 73 20 69 6e 64  header flags ind
295f0 69 63 61 74 65 20 74 68 61 74 20 74 68 65 20 5b  icate that the [
29600 76 69 72 74 75 61 6c 5d 20 72 6f 6f 74 2d 70 61  virtual] root-pa
29610 67 65 20 69 73 20 74 68 65 20 65 78 70 65 63 74  ge is the expect
29620 65 64 20 0a 2a 2a 20 6b 69 6e 64 20 6f 66 20 62  ed .** kind of b
29630 2d 74 72 65 65 20 70 61 67 65 20 28 69 2e 65 2e  -tree page (i.e.
29640 20 69 66 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67   if when opening
29650 20 74 68 65 20 63 75 72 73 6f 72 20 74 68 65 20   the cursor the 
29660 63 61 6c 6c 65 72 20 64 69 64 20 6e 6f 74 0a 2a  caller did not.*
29670 2a 20 73 70 65 63 69 66 79 20 61 20 4b 65 79 49  * specify a KeyI
29680 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 74 68  nfo structure th
29690 65 20 66 6c 61 67 73 20 62 79 74 65 20 69 73 20  e flags byte is 
296a0 73 65 74 20 74 6f 20 30 78 30 35 20 6f 72 20 30  set to 0x05 or 0
296b0 78 30 44 2c 0a 2a 2a 20 69 6e 64 69 63 61 74 69  x0D,.** indicati
296c0 6e 67 20 61 20 74 61 62 6c 65 20 62 2d 74 72 65  ng a table b-tre
296d0 65 2c 20 6f 72 20 69 66 20 74 68 65 20 63 61 6c  e, or if the cal
296e0 6c 65 72 20 64 69 64 20 73 70 65 63 69 66 79 20  ler did specify 
296f0 61 20 4b 65 79 49 6e 66 6f 20 0a 2a 2a 20 73 74  a KeyInfo .** st
29700 72 75 63 74 75 72 65 20 74 68 65 20 66 6c 61 67  ructure the flag
29710 73 20 62 79 74 65 20 69 73 20 73 65 74 20 74 6f  s byte is set to
29720 20 30 78 30 32 20 6f 72 20 30 78 30 41 2c 20 69   0x02 or 0x0A, i
29730 6e 64 69 63 61 74 69 6e 67 20 61 6e 20 69 6e 64  ndicating an ind
29740 65 78 0a 2a 2a 20 62 2d 74 72 65 65 29 2e 0a 2a  ex.** b-tree)..*
29750 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76  /.static int mov
29760 65 54 6f 52 6f 6f 74 28 42 74 43 75 72 73 6f 72  eToRoot(BtCursor
29770 20 2a 70 43 75 72 29 7b 0a 20 20 4d 65 6d 50 61   *pCur){.  MemPa
29780 67 65 20 2a 70 52 6f 6f 74 3b 0a 20 20 69 6e 74  ge *pRoot;.  int
29790 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
297a0 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
297b0 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70  orOwnsBtShared(p
297c0 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
297d0 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  ( CURSOR_INVALID
297e0 20 3c 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52   < CURSOR_REQUIR
297f0 45 53 45 45 4b 20 29 3b 0a 20 20 61 73 73 65 72  ESEEK );.  asser
29800 74 28 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  t( CURSOR_VALID 
29810 20 20 3c 20 43 55 52 53 4f 52 5f 52 45 51 55 49    < CURSOR_REQUI
29820 52 45 53 45 45 4b 20 29 3b 0a 20 20 61 73 73 65  RESEEK );.  asse
29830 72 74 28 20 43 55 52 53 4f 52 5f 46 41 55 4c 54  rt( CURSOR_FAULT
29840 20 20 20 3e 20 43 55 52 53 4f 52 5f 52 45 51 55     > CURSOR_REQU
29850 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 69 66 28  IRESEEK );.  if(
29860 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3e 3d 43   pCur->eState>=C
29870 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45  URSOR_REQUIRESEE
29880 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75  K ){.    if( pCu
29890 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
298a0 52 5f 46 41 55 4c 54 20 29 7b 0a 20 20 20 20 20  R_FAULT ){.     
298b0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 73   assert( pCur->s
298c0 6b 69 70 4e 65 78 74 21 3d 53 51 4c 49 54 45 5f  kipNext!=SQLITE_
298d0 4f 4b 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75  OK );.      retu
298e0 72 6e 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78  rn pCur->skipNex
298f0 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  t;.    }.    sql
29900 69 74 65 33 42 74 72 65 65 43 6c 65 61 72 43 75  ite3BtreeClearCu
29910 72 73 6f 72 28 70 43 75 72 29 3b 0a 20 20 7d 0a  rsor(pCur);.  }.
29920 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61  .  if( pCur->iPa
29930 67 65 3e 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  ge>=0 ){.    if(
29940 20 70 43 75 72 2d 3e 69 50 61 67 65 20 29 7b 0a   pCur->iPage ){.
29950 20 20 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20        do{.      
29960 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
29970 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
29980 67 65 5d 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  ge]!=0 );.      
29990 20 20 72 65 6c 65 61 73 65 50 61 67 65 4e 6f 74    releasePageNot
299a0 4e 75 6c 6c 28 70 43 75 72 2d 3e 61 70 50 61 67  Null(pCur->apPag
299b0 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 2d 5d  e[pCur->iPage--]
299c0 29 3b 0a 20 20 20 20 20 20 7d 77 68 69 6c 65 28  );.      }while(
299d0 20 70 43 75 72 2d 3e 69 50 61 67 65 29 3b 0a 20   pCur->iPage);. 
299e0 20 20 20 20 20 67 6f 74 6f 20 73 6b 69 70 5f 69       goto skip_i
299f0 6e 69 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  nit;.    }.  }el
29a00 73 65 20 69 66 28 20 70 43 75 72 2d 3e 70 67 6e  se if( pCur->pgn
29a10 6f 52 6f 6f 74 3d 3d 30 20 29 7b 0a 20 20 20 20  oRoot==0 ){.    
29a20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
29a30 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20  URSOR_INVALID;. 
29a40 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
29a50 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  _OK;.  }else{.  
29a60 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
29a70 69 50 61 67 65 3d 3d 28 2d 31 29 20 29 3b 0a 20  iPage==(-1) );. 
29a80 20 20 20 72 63 20 3d 20 67 65 74 41 6e 64 49 6e     rc = getAndIn
29a90 69 74 50 61 67 65 28 70 43 75 72 2d 3e 70 42 74  itPage(pCur->pBt
29aa0 72 65 65 2d 3e 70 42 74 2c 20 70 43 75 72 2d 3e  ree->pBt, pCur->
29ab0 70 67 6e 6f 52 6f 6f 74 2c 20 26 70 43 75 72 2d  pgnoRoot, &pCur-
29ac0 3e 61 70 50 61 67 65 5b 30 5d 2c 0a 20 20 20 20  >apPage[0],.    
29ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29ae0 20 20 20 20 30 2c 20 70 43 75 72 2d 3e 63 75 72      0, pCur->cur
29af0 50 61 67 65 72 46 6c 61 67 73 29 3b 0a 20 20 20  PagerFlags);.   
29b00 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
29b10 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72  OK ){.      pCur
29b20 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
29b30 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20  R_INVALID;.     
29b40 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
29b50 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e 69 50 61   }.    pCur->iPa
29b60 67 65 20 3d 20 30 3b 0a 20 20 20 20 70 43 75 72  ge = 0;.    pCur
29b70 2d 3e 63 75 72 49 6e 74 4b 65 79 20 3d 20 70 43  ->curIntKey = pC
29b80 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69  ur->apPage[0]->i
29b90 6e 74 4b 65 79 3b 0a 20 20 7d 0a 20 20 70 52 6f  ntKey;.  }.  pRo
29ba0 6f 74 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67  ot = pCur->apPag
29bb0 65 5b 30 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  e[0];.  assert( 
29bc0 70 52 6f 6f 74 2d 3e 70 67 6e 6f 3d 3d 70 43 75  pRoot->pgno==pCu
29bd0 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20 29 3b 0a 0a  r->pgnoRoot );..
29be0 20 20 2f 2a 20 49 66 20 70 43 75 72 2d 3e 70 4b    /* If pCur->pK
29bf0 65 79 49 6e 66 6f 20 69 73 20 6e 6f 74 20 4e 55  eyInfo is not NU
29c00 4c 4c 2c 20 74 68 65 6e 20 74 68 65 20 63 61 6c  LL, then the cal
29c10 6c 65 72 20 74 68 61 74 20 6f 70 65 6e 65 64 20  ler that opened 
29c20 74 68 69 73 20 63 75 72 73 6f 72 0a 20 20 2a 2a  this cursor.  **
29c30 20 65 78 70 65 63 74 65 64 20 74 6f 20 6f 70 65   expected to ope
29c40 6e 20 69 74 20 6f 6e 20 61 6e 20 69 6e 64 65 78  n it on an index
29c50 20 62 2d 74 72 65 65 2e 20 4f 74 68 65 72 77 69   b-tree. Otherwi
29c60 73 65 2c 20 69 66 20 70 4b 65 79 49 6e 66 6f 20  se, if pKeyInfo 
29c70 69 73 0a 20 20 2a 2a 20 4e 55 4c 4c 2c 20 74 68  is.  ** NULL, th
29c80 65 20 63 61 6c 6c 65 72 20 65 78 70 65 63 74 73  e caller expects
29c90 20 61 20 74 61 62 6c 65 20 62 2d 74 72 65 65 2e   a table b-tree.
29ca0 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20   If this is not 
29cb0 74 68 65 20 63 61 73 65 2c 0a 20 20 2a 2a 20 72  the case,.  ** r
29cc0 65 74 75 72 6e 20 61 6e 20 53 51 4c 49 54 45 5f  eturn an SQLITE_
29cd0 43 4f 52 52 55 50 54 20 65 72 72 6f 72 2e 20 0a  CORRUPT error. .
29ce0 20 20 2a 2a 0a 20 20 2a 2a 20 45 61 72 6c 69 65    **.  ** Earlie
29cf0 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51  r versions of SQ
29d00 4c 69 74 65 20 61 73 73 75 6d 65 64 20 74 68 61  Lite assumed tha
29d10 74 20 74 68 69 73 20 74 65 73 74 20 63 6f 75 6c  t this test coul
29d20 64 20 6e 6f 74 20 66 61 69 6c 0a 20 20 2a 2a 20  d not fail.  ** 
29d30 69 66 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  if the root page
29d40 20 77 61 73 20 61 6c 72 65 61 64 79 20 6c 6f 61   was already loa
29d50 64 65 64 20 77 68 65 6e 20 74 68 69 73 20 66 75  ded when this fu
29d60 6e 63 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65  nction was calle
29d70 64 20 28 69 2e 65 2e 0a 20 20 2a 2a 20 69 66 20  d (i.e..  ** if 
29d80 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 29 2e  pCur->iPage>=0).
29d90 20 42 75 74 20 74 68 69 73 20 69 73 20 6e 6f 74   But this is not
29da0 20 73 6f 20 69 66 20 74 68 65 20 64 61 74 61 62   so if the datab
29db0 61 73 65 20 69 73 20 63 6f 72 72 75 70 74 65 64  ase is corrupted
29dc0 20 0a 20 20 2a 2a 20 69 6e 20 73 75 63 68 20 61   .  ** in such a
29dd0 20 77 61 79 20 74 68 61 74 20 70 61 67 65 20 70   way that page p
29de0 52 6f 6f 74 20 69 73 20 6c 69 6e 6b 65 64 20 69  Root is linked i
29df0 6e 74 6f 20 61 20 73 65 63 6f 6e 64 20 62 2d 74  nto a second b-t
29e00 72 65 65 20 74 61 62 6c 65 20 0a 20 20 2a 2a 20  ree table .  ** 
29e10 28 6f 72 20 74 68 65 20 66 72 65 65 6c 69 73 74  (or the freelist
29e20 29 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ).  */.  assert(
29e30 20 70 52 6f 6f 74 2d 3e 69 6e 74 4b 65 79 3d 3d   pRoot->intKey==
29e40 31 20 7c 7c 20 70 52 6f 6f 74 2d 3e 69 6e 74 4b  1 || pRoot->intK
29e50 65 79 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  ey==0 );.  if( p
29e60 52 6f 6f 74 2d 3e 69 73 49 6e 69 74 3d 3d 30 20  Root->isInit==0 
29e70 7c 7c 20 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e  || (pCur->pKeyIn
29e80 66 6f 3d 3d 30 29 21 3d 70 52 6f 6f 74 2d 3e 69  fo==0)!=pRoot->i
29e90 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 72 65 74  ntKey ){.    ret
29ea0 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
29eb0 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 73 6b  PT_BKPT;.  }..sk
29ec0 69 70 5f 69 6e 69 74 3a 20 20 0a 20 20 70 43 75  ip_init:  .  pCu
29ed0 72 2d 3e 61 69 49 64 78 5b 30 5d 20 3d 20 30 3b  r->aiIdx[0] = 0;
29ee0 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53  .  pCur->info.nS
29ef0 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d  ize = 0;.  pCur-
29f00 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 28 42  >curFlags &= ~(B
29f10 54 43 46 5f 41 74 4c 61 73 74 7c 42 54 43 46 5f  TCF_AtLast|BTCF_
29f20 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56  ValidNKey|BTCF_V
29f30 61 6c 69 64 4f 76 66 6c 29 3b 0a 0a 20 20 70 52  alidOvfl);..  pR
29f40 6f 6f 74 20 3d 20 70 43 75 72 2d 3e 61 70 50 61  oot = pCur->apPa
29f50 67 65 5b 30 5d 3b 0a 20 20 69 66 28 20 70 52 6f  ge[0];.  if( pRo
29f60 6f 74 2d 3e 6e 43 65 6c 6c 3e 30 20 29 7b 0a 20  ot->nCell>0 ){. 
29f70 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20     pCur->eState 
29f80 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a  = CURSOR_VALID;.
29f90 20 20 7d 65 6c 73 65 20 69 66 28 20 21 70 52 6f    }else if( !pRo
29fa0 6f 74 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ot->leaf ){.    
29fb0 50 67 6e 6f 20 73 75 62 70 61 67 65 3b 0a 20 20  Pgno subpage;.  
29fc0 20 20 69 66 28 20 70 52 6f 6f 74 2d 3e 70 67 6e    if( pRoot->pgn
29fd0 6f 21 3d 31 20 29 20 72 65 74 75 72 6e 20 53 51  o!=1 ) return SQ
29fe0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
29ff0 54 3b 0a 20 20 20 20 73 75 62 70 61 67 65 20 3d  T;.    subpage =
2a000 20 67 65 74 34 62 79 74 65 28 26 70 52 6f 6f 74   get4byte(&pRoot
2a010 2d 3e 61 44 61 74 61 5b 70 52 6f 6f 74 2d 3e 68  ->aData[pRoot->h
2a020 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20  drOffset+8]);.  
2a030 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
2a040 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20   CURSOR_VALID;. 
2a050 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68     rc = moveToCh
2a060 69 6c 64 28 70 43 75 72 2c 20 73 75 62 70 61 67  ild(pCur, subpag
2a070 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  e);.  }else{.   
2a080 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
2a090 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a  CURSOR_INVALID;.
2a0a0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
2a0b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74  .}../*.** Move t
2a0c0 68 65 20 63 75 72 73 6f 72 20 64 6f 77 6e 20 74  he cursor down t
2a0d0 6f 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20  o the left-most 
2a0e0 6c 65 61 66 20 65 6e 74 72 79 20 62 65 6e 65 61  leaf entry benea
2a0f0 74 68 20 74 68 65 0a 2a 2a 20 65 6e 74 72 79 20  th the.** entry 
2a100 74 6f 20 77 68 69 63 68 20 69 74 20 69 73 20 63  to which it is c
2a110 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e  urrently pointin
2a120 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c 65 66  g..**.** The lef
2a130 74 2d 6d 6f 73 74 20 6c 65 61 66 20 69 73 20 74  t-most leaf is t
2a140 68 65 20 6f 6e 65 20 77 69 74 68 20 74 68 65 20  he one with the 
2a150 73 6d 61 6c 6c 65 73 74 20 6b 65 79 20 2d 20 74  smallest key - t
2a160 68 65 20 66 69 72 73 74 0a 2a 2a 20 69 6e 20 61  he first.** in a
2a170 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 0a  scending order..
2a180 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f  */.static int mo
2a190 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 42 74 43  veToLeftmost(BtC
2a1a0 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
2a1b0 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e 74  Pgno pgno;.  int
2a1c0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2a1d0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
2a1e0 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  e;..  assert( cu
2a1f0 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64  rsorOwnsBtShared
2a200 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
2a210 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
2a220 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
2a230 3b 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53  ;.  while( rc==S
2a240 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 28 70 50  QLITE_OK && !(pP
2a250 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61  age = pCur->apPa
2a260 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29  ge[pCur->iPage])
2a270 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 61 73  ->leaf ){.    as
2a280 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64  sert( pCur->aiId
2a290 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70  x[pCur->iPage]<p
2a2a0 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  Page->nCell );. 
2a2b0 20 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79     pgno = get4by
2a2c0 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 67  te(findCell(pPag
2a2d0 65 2c 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70  e, pCur->aiIdx[p
2a2e0 43 75 72 2d 3e 69 50 61 67 65 5d 29 29 3b 0a 20  Cur->iPage]));. 
2a2f0 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68     rc = moveToCh
2a300 69 6c 64 28 70 43 75 72 2c 20 70 67 6e 6f 29 3b  ild(pCur, pgno);
2a310 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
2a320 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20  ;.}../*.** Move 
2a330 74 68 65 20 63 75 72 73 6f 72 20 64 6f 77 6e 20  the cursor down 
2a340 74 6f 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73  to the right-mos
2a350 74 20 6c 65 61 66 20 65 6e 74 72 79 20 62 65 6e  t leaf entry ben
2a360 65 61 74 68 20 74 68 65 0a 2a 2a 20 70 61 67 65  eath the.** page
2a370 20 74 6f 20 77 68 69 63 68 20 69 74 20 69 73 20   to which it is 
2a380 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69  currently pointi
2a390 6e 67 2e 20 20 4e 6f 74 69 63 65 20 74 68 65 20  ng.  Notice the 
2a3a0 64 69 66 66 65 72 65 6e 63 65 0a 2a 2a 20 62 65  difference.** be
2a3b0 74 77 65 65 6e 20 6d 6f 76 65 54 6f 4c 65 66 74  tween moveToLeft
2a3c0 6d 6f 73 74 28 29 20 61 6e 64 20 6d 6f 76 65 54  most() and moveT
2a3d0 6f 52 69 67 68 74 6d 6f 73 74 28 29 2e 20 20 6d  oRightmost().  m
2a3e0 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 29 0a  oveToLeftmost().
2a3f0 2a 2a 20 66 69 6e 64 73 20 74 68 65 20 6c 65 66  ** finds the lef
2a400 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 62 65 6e  t-most entry ben
2a410 65 61 74 68 20 74 68 65 20 2a 65 6e 74 72 79 2a  eath the *entry*
2a420 20 77 68 65 72 65 61 73 20 6d 6f 76 65 54 6f 52   whereas moveToR
2a430 69 67 68 74 6d 6f 73 74 28 29 0a 2a 2a 20 66 69  ightmost().** fi
2a440 6e 64 73 20 74 68 65 20 72 69 67 68 74 2d 6d 6f  nds the right-mo
2a450 73 74 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68  st entry beneath
2a460 20 74 68 65 20 2a 70 61 67 65 2a 2e 0a 2a 2a 0a   the *page*..**.
2a470 2a 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73  ** The right-mos
2a480 74 20 65 6e 74 72 79 20 69 73 20 74 68 65 20 6f  t entry is the o
2a490 6e 65 20 77 69 74 68 20 74 68 65 20 6c 61 72 67  ne with the larg
2a4a0 65 73 74 20 6b 65 79 20 2d 20 74 68 65 20 6c 61  est key - the la
2a4b0 73 74 0a 2a 2a 20 6b 65 79 20 69 6e 20 61 73 63  st.** key in asc
2a4c0 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 0a 2a 2f  ending order..*/
2a4d0 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65  .static int move
2a4e0 54 6f 52 69 67 68 74 6d 6f 73 74 28 42 74 43 75  ToRightmost(BtCu
2a4f0 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 50  rsor *pCur){.  P
2a500 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e 74 20  gno pgno;.  int 
2a510 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
2a520 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
2a530 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28   = 0;..  assert(
2a540 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61   cursorOwnsBtSha
2a550 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61  red(pCur) );.  a
2a560 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
2a570 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
2a580 44 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 21 28  D );.  while( !(
2a590 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70  pPage = pCur->ap
2a5a0 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
2a5b0 5d 29 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ])->leaf ){.    
2a5c0 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28  pgno = get4byte(
2a5d0 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50  &pPage->aData[pP
2a5e0 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  age->hdrOffset+8
2a5f0 5d 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 61 69  ]);.    pCur->ai
2a600 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
2a610 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b   = pPage->nCell;
2a620 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f  .    rc = moveTo
2a630 43 68 69 6c 64 28 70 43 75 72 2c 20 70 67 6e 6f  Child(pCur, pgno
2a640 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
2a650 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
2a660 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
2a670 72 2d 3e 69 50 61 67 65 5d 20 3d 20 70 50 61 67  r->iPage] = pPag
2a680 65 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a 20 20 61 73  e->nCell-1;.  as
2a690 73 65 72 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f  sert( pCur->info
2a6a0 2e 6e 53 69 7a 65 3d 3d 30 20 29 3b 0a 20 20 61  .nSize==0 );.  a
2a6b0 73 73 65 72 74 28 20 28 70 43 75 72 2d 3e 63 75  ssert( (pCur->cu
2a6c0 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 56 61  rFlags & BTCF_Va
2a6d0 6c 69 64 4e 4b 65 79 29 3d 3d 30 20 29 3b 0a 20  lidNKey)==0 );. 
2a6e0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2a6f0 4b 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68  K;.}../* Move th
2a700 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20  e cursor to the 
2a710 66 69 72 73 74 20 65 6e 74 72 79 20 69 6e 20 74  first entry in t
2a720 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72  he table.  Retur
2a730 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f  n SQLITE_OK.** o
2a740 6e 20 73 75 63 63 65 73 73 2e 20 20 53 65 74 20  n success.  Set 
2a750 2a 70 52 65 73 20 74 6f 20 30 20 69 66 20 74 68  *pRes to 0 if th
2a760 65 20 63 75 72 73 6f 72 20 61 63 74 75 61 6c 6c  e cursor actuall
2a770 79 20 70 6f 69 6e 74 73 20 74 6f 20 73 6f 6d 65  y points to some
2a780 74 68 69 6e 67 0a 2a 2a 20 6f 72 20 73 65 74 20  thing.** or set 
2a790 2a 70 52 65 73 20 74 6f 20 31 20 69 66 20 74 68  *pRes to 1 if th
2a7a0 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79  e table is empty
2a7b0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
2a7c0 42 74 72 65 65 46 69 72 73 74 28 42 74 43 75 72  BtreeFirst(BtCur
2a7d0 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a  sor *pCur, int *
2a7e0 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b  pRes){.  int rc;
2a7f0 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
2a800 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70  orOwnsBtShared(p
2a810 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
2a820 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
2a830 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65  held(pCur->pBtre
2a840 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  e->db->mutex) );
2a850 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f  .  rc = moveToRo
2a860 6f 74 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20  ot(pCur);.  if( 
2a870 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2a880 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 65  .    if( pCur->e
2a890 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e  State==CURSOR_IN
2a8a0 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 20 20 61  VALID ){.      a
2a8b0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 67 6e  ssert( pCur->pgn
2a8c0 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75 72  oRoot==0 || pCur
2a8d0 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
2a8e0 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20  Page]->nCell==0 
2a8f0 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d  );.      *pRes =
2a900 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   1;.    }else{. 
2a910 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75       assert( pCu
2a920 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
2a930 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3e 30 20  iPage]->nCell>0 
2a940 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d  );.      *pRes =
2a950 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 6d   0;.      rc = m
2a960 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43  oveToLeftmost(pC
2a970 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ur);.    }.  }. 
2a980 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
2a990 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f  * Move the curso
2a9a0 72 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e  r to the last en
2a9b0 74 72 79 20 69 6e 20 74 68 65 20 74 61 62 6c 65  try in the table
2a9c0 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
2a9d0 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73  _OK.** on succes
2a9e0 73 2e 20 20 53 65 74 20 2a 70 52 65 73 20 74 6f  s.  Set *pRes to
2a9f0 20 30 20 69 66 20 74 68 65 20 63 75 72 73 6f 72   0 if the cursor
2aa00 20 61 63 74 75 61 6c 6c 79 20 70 6f 69 6e 74 73   actually points
2aa10 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a   to something.**
2aa20 20 6f 72 20 73 65 74 20 2a 70 52 65 73 20 74 6f   or set *pRes to
2aa30 20 31 20 69 66 20 74 68 65 20 74 61 62 6c 65 20   1 if the table 
2aa40 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74  is empty..*/.int
2aa50 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 61 73   sqlite3BtreeLas
2aa60 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  t(BtCursor *pCur
2aa70 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20  , int *pRes){.  
2aa80 69 6e 74 20 72 63 3b 0a 20 0a 20 20 61 73 73 65  int rc;. .  asse
2aa90 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74  rt( cursorOwnsBt
2aaa0 53 68 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a  Shared(pCur) );.
2aab0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
2aac0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75  3_mutex_held(pCu
2aad0 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d  r->pBtree->db->m
2aae0 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 49  utex) );..  /* I
2aaf0 66 20 74 68 65 20 63 75 72 73 6f 72 20 61 6c 72  f the cursor alr
2ab00 65 61 64 79 20 70 6f 69 6e 74 73 20 74 6f 20 74  eady points to t
2ab10 68 65 20 6c 61 73 74 20 65 6e 74 72 79 2c 20 74  he last entry, t
2ab20 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20  his is a no-op. 
2ab30 2a 2f 0a 20 20 69 66 28 20 43 55 52 53 4f 52 5f  */.  if( CURSOR_
2ab40 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74  VALID==pCur->eSt
2ab50 61 74 65 20 26 26 20 28 70 43 75 72 2d 3e 63 75  ate && (pCur->cu
2ab60 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 41 74  rFlags & BTCF_At
2ab70 4c 61 73 74 29 21 3d 30 20 29 7b 0a 23 69 66 64  Last)!=0 ){.#ifd
2ab80 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
2ab90 20 20 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63      /* This bloc
2aba0 6b 20 73 65 72 76 65 73 20 74 6f 20 61 73 73 65  k serves to asse
2abb0 72 74 28 29 20 74 68 61 74 20 74 68 65 20 63 75  rt() that the cu
2abc0 72 73 6f 72 20 72 65 61 6c 6c 79 20 64 6f 65 73  rsor really does
2abd0 20 70 6f 69 6e 74 20 0a 20 20 20 20 2a 2a 20 74   point .    ** t
2abe0 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79  o the last entry
2abf0 20 69 6e 20 74 68 65 20 62 2d 74 72 65 65 2e 20   in the b-tree. 
2ac00 2a 2f 0a 20 20 20 20 69 6e 74 20 69 69 3b 0a 20  */.    int ii;. 
2ac10 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c     for(ii=0; ii<
2ac20 70 43 75 72 2d 3e 69 50 61 67 65 3b 20 69 69 2b  pCur->iPage; ii+
2ac30 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  +){.      assert
2ac40 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 69 69  ( pCur->aiIdx[ii
2ac50 5d 3d 3d 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  ]==pCur->apPage[
2ac60 69 69 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20  ii]->nCell );.  
2ac70 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
2ac80 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
2ac90 2d 3e 69 50 61 67 65 5d 3d 3d 70 43 75 72 2d 3e  ->iPage]==pCur->
2aca0 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
2acb0 67 65 5d 2d 3e 6e 43 65 6c 6c 2d 31 20 29 3b 0a  ge]->nCell-1 );.
2acc0 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
2acd0 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
2ace0 50 61 67 65 5d 2d 3e 6c 65 61 66 20 29 3b 0a 23  Page]->leaf );.#
2acf0 65 6e 64 69 66 0a 20 20 20 20 72 65 74 75 72 6e  endif.    return
2ad00 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
2ad10 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f  .  rc = moveToRo
2ad20 6f 74 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20  ot(pCur);.  if( 
2ad30 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2ad40 0a 20 20 20 20 69 66 28 20 43 55 52 53 4f 52 5f  .    if( CURSOR_
2ad50 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65  INVALID==pCur->e
2ad60 53 74 61 74 65 20 29 7b 0a 20 20 20 20 20 20 61  State ){.      a
2ad70 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 67 6e  ssert( pCur->pgn
2ad80 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75 72  oRoot==0 || pCur
2ad90 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
2ada0 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20  Page]->nCell==0 
2adb0 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d  );.      *pRes =
2adc0 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   1;.    }else{. 
2add0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75       assert( pCu
2ade0 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
2adf0 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20 20 20  R_VALID );.     
2ae00 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20   *pRes = 0;.    
2ae10 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 69 67    rc = moveToRig
2ae20 68 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20  htmost(pCur);.  
2ae30 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2ae40 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
2ae50 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20   pCur->curFlags 
2ae60 7c 3d 20 42 54 43 46 5f 41 74 4c 61 73 74 3b 0a  |= BTCF_AtLast;.
2ae70 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2ae80 20 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c       pCur->curFl
2ae90 61 67 73 20 26 3d 20 7e 42 54 43 46 5f 41 74 4c  ags &= ~BTCF_AtL
2aea0 61 73 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ast;.      }.   
2aeb0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
2aec0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f  urn rc;.}../* Mo
2aed0 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 73 6f  ve the cursor so
2aee0 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20   that it points 
2aef0 74 6f 20 61 6e 20 65 6e 74 72 79 20 6e 65 61 72  to an entry near
2af00 20 74 68 65 20 6b 65 79 20 0a 2a 2a 20 73 70 65   the key .** spe
2af10 63 69 66 69 65 64 20 62 79 20 70 49 64 78 4b 65  cified by pIdxKe
2af20 79 20 6f 72 20 69 6e 74 4b 65 79 2e 20 20 20 52  y or intKey.   R
2af30 65 74 75 72 6e 20 61 20 73 75 63 63 65 73 73 20  eturn a success 
2af40 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  code..**.** For 
2af50 49 4e 54 4b 45 59 20 74 61 62 6c 65 73 2c 20 74  INTKEY tables, t
2af60 68 65 20 69 6e 74 4b 65 79 20 70 61 72 61 6d 65  he intKey parame
2af70 74 65 72 20 69 73 20 75 73 65 64 2e 20 20 70 49  ter is used.  pI
2af80 64 78 4b 65 79 20 0a 2a 2a 20 6d 75 73 74 20 62  dxKey .** must b
2af90 65 20 4e 55 4c 4c 2e 20 20 46 6f 72 20 69 6e 64  e NULL.  For ind
2afa0 65 78 20 74 61 62 6c 65 73 2c 20 70 49 64 78 4b  ex tables, pIdxK
2afb0 65 79 20 69 73 20 75 73 65 64 20 61 6e 64 20 69  ey is used and i
2afc0 6e 74 4b 65 79 0a 2a 2a 20 69 73 20 69 67 6e 6f  ntKey.** is igno
2afd0 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  red..**.** If an
2afe0 20 65 78 61 63 74 20 6d 61 74 63 68 20 69 73 20   exact match is 
2aff0 6e 6f 74 20 66 6f 75 6e 64 2c 20 74 68 65 6e 20  not found, then 
2b000 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 61 6c  the cursor is al
2b010 77 61 79 73 0a 2a 2a 20 6c 65 66 74 20 70 6f 69  ways.** left poi
2b020 6e 74 69 6e 67 20 61 74 20 61 20 6c 65 61 66 20  nting at a leaf 
2b030 70 61 67 65 20 77 68 69 63 68 20 77 6f 75 6c 64  page which would
2b040 20 68 6f 6c 64 20 74 68 65 20 65 6e 74 72 79 20   hold the entry 
2b050 69 66 20 69 74 0a 2a 2a 20 77 65 72 65 20 70 72  if it.** were pr
2b060 65 73 65 6e 74 2e 20 20 54 68 65 20 63 75 72 73  esent.  The curs
2b070 6f 72 20 6d 69 67 68 74 20 70 6f 69 6e 74 20 74  or might point t
2b080 6f 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74 20  o an entry that 
2b090 63 6f 6d 65 73 0a 2a 2a 20 62 65 66 6f 72 65 20  comes.** before 
2b0a0 6f 72 20 61 66 74 65 72 20 74 68 65 20 6b 65 79  or after the key
2b0b0 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 69 6e 74 65 67  ..**.** An integ
2b0c0 65 72 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e  er is written in
2b0d0 74 6f 20 2a 70 52 65 73 20 77 68 69 63 68 20 69  to *pRes which i
2b0e0 73 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 0a  s the result of.
2b0f0 2a 2a 20 63 6f 6d 70 61 72 69 6e 67 20 74 68 65  ** comparing the
2b100 20 6b 65 79 20 77 69 74 68 20 74 68 65 20 65 6e   key with the en
2b110 74 72 79 20 74 6f 20 77 68 69 63 68 20 74 68 65  try to which the
2b120 20 63 75 72 73 6f 72 20 69 73 20 0a 2a 2a 20 70   cursor is .** p
2b130 6f 69 6e 74 69 6e 67 2e 20 20 54 68 65 20 6d 65  ointing.  The me
2b140 61 6e 69 6e 67 20 6f 66 20 74 68 65 20 69 6e 74  aning of the int
2b150 65 67 65 72 20 77 72 69 74 74 65 6e 20 69 6e 74  eger written int
2b160 6f 0a 2a 2a 20 2a 70 52 65 73 20 69 73 20 61 73  o.** *pRes is as
2b170 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
2b180 20 20 20 20 2a 70 52 65 73 3c 30 20 20 20 20 20      *pRes<0     
2b190 20 54 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c   The cursor is l
2b1a0 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20  eft pointing at 
2b1b0 61 6e 20 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a  an entry that.**
2b1c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b1d0 20 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61    is smaller tha
2b1e0 6e 20 69 6e 74 4b 65 79 2f 70 49 64 78 4b 65 79  n intKey/pIdxKey
2b1f0 20 6f 72 20 69 66 20 74 68 65 20 74 61 62 6c 65   or if the table
2b200 20 69 73 20 65 6d 70 74 79 0a 2a 2a 20 20 20 20   is empty.**    
2b210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 6e                an
2b220 64 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  d the cursor is 
2b230 74 68 65 72 65 66 6f 72 65 20 6c 65 66 74 20 70  therefore left p
2b240 6f 69 6e 74 20 74 6f 20 6e 6f 74 68 69 6e 67 2e  oint to nothing.
2b250 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73  .**.**     *pRes
2b260 3d 3d 30 20 20 20 20 20 54 68 65 20 63 75 72 73  ==0     The curs
2b270 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74  or is left point
2b280 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20  ing at an entry 
2b290 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  that.**         
2b2a0 20 20 20 20 20 20 20 20 20 65 78 61 63 74 6c 79           exactly
2b2b0 20 6d 61 74 63 68 65 73 20 69 6e 74 4b 65 79 2f   matches intKey/
2b2c0 70 49 64 78 4b 65 79 2e 0a 2a 2a 0a 2a 2a 20 20  pIdxKey..**.**  
2b2d0 20 20 20 2a 70 52 65 73 3e 30 20 20 20 20 20 20     *pRes>0      
2b2e0 54 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65  The cursor is le
2b2f0 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61  ft pointing at a
2b300 6e 20 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20  n entry that.** 
2b310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b320 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20   is larger than 
2b330 69 6e 74 4b 65 79 2f 70 49 64 78 4b 65 79 2e 0a  intKey/pIdxKey..
2b340 2a 2a 0a 2a 2a 20 46 6f 72 20 69 6e 64 65 78 20  **.** For index 
2b350 74 61 62 6c 65 73 2c 20 74 68 65 20 70 49 64 78  tables, the pIdx
2b360 4b 65 79 2d 3e 65 71 53 65 65 6e 20 66 69 65 6c  Key->eqSeen fiel
2b370 64 20 69 73 20 73 65 74 20 74 6f 20 31 20 69 66  d is set to 1 if
2b380 20 74 68 65 72 65 0a 2a 2a 20 65 78 69 73 74 73   there.** exists
2b390 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 74 68 65   an entry in the
2b3a0 20 74 61 62 6c 65 20 74 68 61 74 20 65 78 61 63   table that exac
2b3b0 74 6c 79 20 6d 61 74 63 68 65 73 20 70 49 64 78  tly matches pIdx
2b3c0 4b 65 79 2e 20 20 0a 2a 2f 0a 69 6e 74 20 73 71  Key.  .*/.int sq
2b3d0 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f  lite3BtreeMoveto
2b3e0 55 6e 70 61 63 6b 65 64 28 0a 20 20 42 74 43 75  Unpacked(.  BtCu
2b3f0 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20  rsor *pCur,     
2b400 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73       /* The curs
2b410 6f 72 20 74 6f 20 62 65 20 6d 6f 76 65 64 20 2a  or to be moved *
2b420 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f  /.  UnpackedReco
2b430 72 64 20 2a 70 49 64 78 4b 65 79 2c 20 2f 2a 20  rd *pIdxKey, /* 
2b440 55 6e 70 61 63 6b 65 64 20 69 6e 64 65 78 20 6b  Unpacked index k
2b450 65 79 20 2a 2f 0a 20 20 69 36 34 20 69 6e 74 4b  ey */.  i64 intK
2b460 65 79 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ey,             
2b470 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 6b 65   /* The table ke
2b480 79 20 2a 2f 0a 20 20 69 6e 74 20 62 69 61 73 52  y */.  int biasR
2b490 69 67 68 74 2c 20 20 20 20 20 20 20 20 20 20 20  ight,           
2b4a0 2f 2a 20 49 66 20 74 72 75 65 2c 20 62 69 61 73  /* If true, bias
2b4b0 20 74 68 65 20 73 65 61 72 63 68 20 74 6f 20 74   the search to t
2b4c0 68 65 20 68 69 67 68 20 65 6e 64 20 2a 2f 0a 20  he high end */. 
2b4d0 20 69 6e 74 20 2a 70 52 65 73 20 20 20 20 20 20   int *pRes      
2b4e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
2b4f0 74 65 20 73 65 61 72 63 68 20 72 65 73 75 6c 74  te search result
2b500 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69  s here */.){.  i
2b510 6e 74 20 72 63 3b 0a 20 20 52 65 63 6f 72 64 43  nt rc;.  RecordC
2b520 6f 6d 70 61 72 65 20 78 52 65 63 6f 72 64 43 6f  ompare xRecordCo
2b530 6d 70 61 72 65 3b 0a 0a 20 20 61 73 73 65 72 74  mpare;..  assert
2b540 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68  ( cursorOwnsBtSh
2b550 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20  ared(pCur) );.  
2b560 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
2b570 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d  mutex_held(pCur-
2b580 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74  >pBtree->db->mut
2b590 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
2b5a0 20 70 52 65 73 20 29 3b 0a 20 20 61 73 73 65 72   pRes );.  asser
2b5b0 74 28 20 28 70 49 64 78 4b 65 79 3d 3d 30 29 3d  t( (pIdxKey==0)=
2b5c0 3d 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f  =(pCur->pKeyInfo
2b5d0 3d 3d 30 29 20 29 3b 0a 20 20 61 73 73 65 72 74  ==0) );.  assert
2b5e0 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d  ( pCur->eState!=
2b5f0 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20  CURSOR_VALID || 
2b600 28 70 49 64 78 4b 65 79 3d 3d 30 29 3d 3d 28 70  (pIdxKey==0)==(p
2b610 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79 21 3d  Cur->curIntKey!=
2b620 30 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  0) );..  /* If t
2b630 68 65 20 63 75 72 73 6f 72 20 69 73 20 61 6c 72  he cursor is alr
2b640 65 61 64 79 20 70 6f 73 69 74 69 6f 6e 65 64 20  eady positioned 
2b650 61 74 20 74 68 65 20 70 6f 69 6e 74 20 77 65 20  at the point we 
2b660 61 72 65 20 74 72 79 69 6e 67 0a 20 20 2a 2a 20  are trying.  ** 
2b670 74 6f 20 6d 6f 76 65 20 74 6f 2c 20 74 68 65 6e  to move to, then
2b680 20 6a 75 73 74 20 72 65 74 75 72 6e 20 77 69 74   just return wit
2b690 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79 20 77  hout doing any w
2b6a0 6f 72 6b 20 2a 2f 0a 20 20 69 66 28 20 70 49 64  ork */.  if( pId
2b6b0 78 4b 65 79 3d 3d 30 0a 20 20 20 26 26 20 70 43  xKey==0.   && pC
2b6c0 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
2b6d0 4f 52 5f 56 41 4c 49 44 20 26 26 20 28 70 43 75  OR_VALID && (pCu
2b6e0 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54  r->curFlags & BT
2b6f0 43 46 5f 56 61 6c 69 64 4e 4b 65 79 29 21 3d 30  CF_ValidNKey)!=0
2b700 0a 20 20 29 7b 0a 20 20 20 20 69 66 28 20 70 43  .  ){.    if( pC
2b710 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 69  ur->info.nKey==i
2b720 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 2a  ntKey ){.      *
2b730 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20  pRes = 0;.      
2b740 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2b750 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
2b760 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3c  pCur->info.nKey<
2b770 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20  intKey ){.      
2b780 69 66 28 20 28 70 43 75 72 2d 3e 63 75 72 46 6c  if( (pCur->curFl
2b790 61 67 73 20 26 20 42 54 43 46 5f 41 74 4c 61 73  ags & BTCF_AtLas
2b7a0 74 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  t)!=0 ){.       
2b7b0 20 2a 70 52 65 73 20 3d 20 2d 31 3b 0a 20 20 20   *pRes = -1;.   
2b7c0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
2b7d0 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20  TE_OK;.      }. 
2b7e0 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 72       /* If the r
2b7f0 65 71 75 65 73 74 65 64 20 6b 65 79 20 69 73 20  equested key is 
2b800 6f 6e 65 20 6d 6f 72 65 20 74 68 61 6e 20 74 68  one more than th
2b810 65 20 70 72 65 76 69 6f 75 73 20 6b 65 79 2c 20  e previous key, 
2b820 74 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20 74 72  then.      ** tr
2b830 79 20 74 6f 20 67 65 74 20 74 68 65 72 65 20 75  y to get there u
2b840 73 69 6e 67 20 73 71 6c 69 74 65 33 42 74 72 65  sing sqlite3Btre
2b850 65 4e 65 78 74 28 29 20 72 61 74 68 65 72 20 74  eNext() rather t
2b860 68 61 6e 20 61 20 66 75 6c 6c 0a 20 20 20 20 20  han a full.     
2b870 20 2a 2a 20 62 69 6e 61 72 79 20 73 65 61 72 63   ** binary searc
2b880 68 2e 20 20 54 68 69 73 20 69 73 20 61 6e 20 6f  h.  This is an o
2b890 70 74 69 6d 69 7a 61 74 69 6f 6e 20 6f 6e 6c 79  ptimization only
2b8a0 2e 20 20 54 68 65 20 63 6f 72 72 65 63 74 20 61  .  The correct a
2b8b0 6e 73 77 65 72 0a 20 20 20 20 20 20 2a 2a 20 69  nswer.      ** i
2b8c0 73 20 73 74 69 6c 6c 20 6f 62 74 61 69 6e 65 64  s still obtained
2b8d0 20 77 69 74 68 6f 75 74 20 74 68 69 73 20 61 73   without this as
2b8e0 65 2c 20 6f 6e 6c 79 20 61 20 6c 69 74 74 6c 65  e, only a little
2b8f0 20 6d 6f 72 65 20 73 6c 6f 77 65 6c 79 20 2a 2f   more slowely */
2b900 0a 20 20 20 20 20 20 69 66 28 20 70 43 75 72 2d  .      if( pCur-
2b910 3e 69 6e 66 6f 2e 6e 4b 65 79 2b 31 3d 3d 69 6e  >info.nKey+1==in
2b920 74 4b 65 79 20 26 26 20 21 70 43 75 72 2d 3e 73  tKey && !pCur->s
2b930 6b 69 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20  kipNext ){.     
2b940 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20     *pRes = 0;.  
2b950 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
2b960 65 33 42 74 72 65 65 4e 65 78 74 28 70 43 75 72  e3BtreeNext(pCur
2b970 2c 20 70 52 65 73 29 3b 0a 20 20 20 20 20 20 20  , pRes);.       
2b980 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
2b990 20 72 63 3b 0a 20 20 20 20 20 20 20 20 69 66 28   rc;.        if(
2b9a0 20 2a 70 52 65 73 3d 3d 30 20 29 7b 0a 20 20 20   *pRes==0 ){.   
2b9b0 20 20 20 20 20 20 20 67 65 74 43 65 6c 6c 49 6e         getCellIn
2b9c0 66 6f 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20  fo(pCur);.      
2b9d0 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69 6e      if( pCur->in
2b9e0 66 6f 2e 6e 4b 65 79 3d 3d 69 6e 74 4b 65 79 20  fo.nKey==intKey 
2b9f0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ){.            r
2ba00 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2ba10 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2ba20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
2ba30 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
2ba40 70 49 64 78 4b 65 79 20 29 7b 0a 20 20 20 20 78  pIdxKey ){.    x
2ba50 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 20 3d 20  RecordCompare = 
2ba60 73 71 6c 69 74 65 33 56 64 62 65 46 69 6e 64 43  sqlite3VdbeFindC
2ba70 6f 6d 70 61 72 65 28 70 49 64 78 4b 65 79 29 3b  ompare(pIdxKey);
2ba80 0a 20 20 20 20 70 49 64 78 4b 65 79 2d 3e 65 72  .    pIdxKey->er
2ba90 72 43 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 61  rCode = 0;.    a
2baa0 73 73 65 72 74 28 20 70 49 64 78 4b 65 79 2d 3e  ssert( pIdxKey->
2bab0 64 65 66 61 75 6c 74 5f 72 63 3d 3d 31 20 0a 20  default_rc==1 . 
2bac0 20 20 20 20 20 20 20 20 7c 7c 20 70 49 64 78 4b          || pIdxK
2bad0 65 79 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3d 3d  ey->default_rc==
2bae0 30 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70  0 .         || p
2baf0 49 64 78 4b 65 79 2d 3e 64 65 66 61 75 6c 74 5f  IdxKey->default_
2bb00 72 63 3d 3d 2d 31 0a 20 20 20 20 29 3b 0a 20 20  rc==-1.    );.  
2bb10 7d 65 6c 73 65 7b 0a 20 20 20 20 78 52 65 63 6f  }else{.    xReco
2bb20 72 64 43 6f 6d 70 61 72 65 20 3d 20 30 3b 20 2f  rdCompare = 0; /
2bb30 2a 20 41 6c 6c 20 6b 65 79 73 20 61 72 65 20 69  * All keys are i
2bb40 6e 74 65 67 65 72 73 20 2a 2f 0a 20 20 7d 0a 0a  ntegers */.  }..
2bb50 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f    rc = moveToRoo
2bb60 74 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72  t(pCur);.  if( r
2bb70 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  c ){.    return 
2bb80 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  rc;.  }.  assert
2bb90 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74  ( pCur->pgnoRoot
2bba0 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50  ==0 || pCur->apP
2bbb0 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
2bbc0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
2bbd0 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20  ur->pgnoRoot==0 
2bbe0 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  || pCur->apPage[
2bbf0 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 69 73  pCur->iPage]->is
2bc00 49 6e 69 74 20 29 3b 0a 20 20 61 73 73 65 72 74  Init );.  assert
2bc10 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
2bc20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 7c  CURSOR_INVALID |
2bc30 7c 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  | pCur->apPage[p
2bc40 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65  Cur->iPage]->nCe
2bc50 6c 6c 3e 30 20 29 3b 0a 20 20 69 66 28 20 70 43  ll>0 );.  if( pC
2bc60 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
2bc70 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20  OR_INVALID ){.  
2bc80 20 20 2a 70 52 65 73 20 3d 20 2d 31 3b 0a 20 20    *pRes = -1;.  
2bc90 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2bca0 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70  pgnoRoot==0 || p
2bcb0 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
2bcc0 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d  ->iPage]->nCell=
2bcd0 3d 30 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  =0 );.    return
2bce0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
2bcf0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2bd00 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65  apPage[0]->intKe
2bd10 79 3d 3d 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b  y==pCur->curIntK
2bd20 65 79 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ey );.  assert( 
2bd30 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79 20  pCur->curIntKey 
2bd40 7c 7c 20 70 49 64 78 4b 65 79 20 29 3b 0a 20 20  || pIdxKey );.  
2bd50 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 69 6e 74  for(;;){.    int
2bd60 20 6c 77 72 2c 20 75 70 72 2c 20 69 64 78 2c 20   lwr, upr, idx, 
2bd70 63 3b 0a 20 20 20 20 50 67 6e 6f 20 63 68 6c 64  c;.    Pgno chld
2bd80 50 67 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20  Pg;.    MemPage 
2bd90 2a 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61  *pPage = pCur->a
2bda0 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
2bdb0 65 5d 3b 0a 20 20 20 20 75 38 20 2a 70 43 65 6c  e];.    u8 *pCel
2bdc0 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
2bdd0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
2bde0 6f 69 6e 74 65 72 20 74 6f 20 63 75 72 72 65 6e  ointer to curren
2bdf0 74 20 63 65 6c 6c 20 69 6e 20 70 50 61 67 65 20  t cell in pPage 
2be00 2a 2f 0a 0a 20 20 20 20 2f 2a 20 70 50 61 67 65  */..    /* pPage
2be10 2d 3e 6e 43 65 6c 6c 20 6d 75 73 74 20 62 65 20  ->nCell must be 
2be20 67 72 65 61 74 65 72 20 74 68 61 6e 20 7a 65 72  greater than zer
2be30 6f 2e 20 49 66 20 74 68 69 73 20 69 73 20 74 68  o. If this is th
2be40 65 20 72 6f 6f 74 2d 70 61 67 65 0a 20 20 20 20  e root-page.    
2be50 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 20 77 6f  ** the cursor wo
2be60 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20 49 4e  uld have been IN
2be70 56 41 4c 49 44 20 61 62 6f 76 65 20 61 6e 64 20  VALID above and 
2be80 74 68 69 73 20 66 6f 72 28 3b 3b 29 20 6c 6f 6f  this for(;;) loo
2be90 70 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 72 75 6e  p.    ** not run
2bea0 2e 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f 74  . If this is not
2beb0 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 2c 20   the root-page, 
2bec0 74 68 65 6e 20 74 68 65 20 6d 6f 76 65 54 6f 43  then the moveToC
2bed0 68 69 6c 64 28 29 20 72 6f 75 74 69 6e 65 0a 20  hild() routine. 
2bee0 20 20 20 2a 2a 20 77 6f 75 6c 64 20 68 61 76 65     ** would have
2bef0 20 61 6c 72 65 61 64 79 20 64 65 74 65 63 74 65   already detecte
2bf00 64 20 64 62 20 63 6f 72 72 75 70 74 69 6f 6e 2e  d db corruption.
2bf10 20 53 69 6d 69 6c 61 72 6c 79 2c 20 70 50 61 67   Similarly, pPag
2bf20 65 20 6d 75 73 74 0a 20 20 20 20 2a 2a 20 62 65  e must.    ** be
2bf30 20 74 68 65 20 72 69 67 68 74 20 6b 69 6e 64 20   the right kind 
2bf40 28 69 6e 64 65 78 20 6f 72 20 74 61 62 6c 65 29  (index or table)
2bf50 20 6f 66 20 62 2d 74 72 65 65 20 70 61 67 65 2e   of b-tree page.
2bf60 20 4f 74 68 65 72 77 69 73 65 0a 20 20 20 20 2a   Otherwise.    *
2bf70 2a 20 61 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28  * a moveToChild(
2bf80 29 20 6f 72 20 6d 6f 76 65 54 6f 52 6f 6f 74 28  ) or moveToRoot(
2bf90 29 20 63 61 6c 6c 20 77 6f 75 6c 64 20 68 61 76  ) call would hav
2bfa0 65 20 64 65 74 65 63 74 65 64 20 63 6f 72 72 75  e detected corru
2bfb0 70 74 69 6f 6e 2e 20 20 2a 2f 0a 20 20 20 20 61  ption.  */.    a
2bfc0 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43  ssert( pPage->nC
2bfd0 65 6c 6c 3e 30 20 29 3b 0a 20 20 20 20 61 73 73  ell>0 );.    ass
2bfe0 65 72 74 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b  ert( pPage->intK
2bff0 65 79 3d 3d 28 70 49 64 78 4b 65 79 3d 3d 30 29  ey==(pIdxKey==0)
2c000 20 29 3b 0a 20 20 20 20 6c 77 72 20 3d 20 30 3b   );.    lwr = 0;
2c010 0a 20 20 20 20 75 70 72 20 3d 20 70 50 61 67 65  .    upr = pPage
2c020 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a 20 20 20 20 61  ->nCell-1;.    a
2c030 73 73 65 72 74 28 20 62 69 61 73 52 69 67 68 74  ssert( biasRight
2c040 3d 3d 30 20 7c 7c 20 62 69 61 73 52 69 67 68 74  ==0 || biasRight
2c050 3d 3d 31 20 29 3b 0a 20 20 20 20 69 64 78 20 3d  ==1 );.    idx =
2c060 20 75 70 72 3e 3e 28 31 2d 62 69 61 73 52 69 67   upr>>(1-biasRig
2c070 68 74 29 3b 20 2f 2a 20 69 64 78 20 3d 20 62 69  ht); /* idx = bi
2c080 61 73 52 69 67 68 74 20 3f 20 75 70 72 20 3a 20  asRight ? upr : 
2c090 28 6c 77 72 2b 75 70 72 29 2f 32 3b 20 2a 2f 0a  (lwr+upr)/2; */.
2c0a0 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b      pCur->aiIdx[
2c0b0 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28  pCur->iPage] = (
2c0c0 75 31 36 29 69 64 78 3b 0a 20 20 20 20 69 66 28  u16)idx;.    if(
2c0d0 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 3d   xRecordCompare=
2c0e0 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28  =0 ){.      for(
2c0f0 3b 3b 29 7b 0a 20 20 20 20 20 20 20 20 69 36 34  ;;){.        i64
2c100 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20   nCellKey;.     
2c110 20 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43     pCell = findC
2c120 65 6c 6c 50 61 73 74 50 74 72 28 70 50 61 67 65  ellPastPtr(pPage
2c130 2c 20 69 64 78 29 3b 0a 20 20 20 20 20 20 20 20  , idx);.        
2c140 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65  if( pPage->intKe
2c150 79 4c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20  yLeaf ){.       
2c160 20 20 20 77 68 69 6c 65 28 20 30 78 38 30 20 3c     while( 0x80 <
2c170 3d 20 2a 28 70 43 65 6c 6c 2b 2b 29 20 29 7b 0a  = *(pCell++) ){.
2c180 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
2c190 70 43 65 6c 6c 3e 3d 70 50 61 67 65 2d 3e 61 44  pCell>=pPage->aD
2c1a0 61 74 61 45 6e 64 20 29 20 72 65 74 75 72 6e 20  ataEnd ) return 
2c1b0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
2c1c0 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  KPT;.          }
2c1d0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2c1e0 20 20 20 67 65 74 56 61 72 69 6e 74 28 70 43 65     getVarint(pCe
2c1f0 6c 6c 2c 20 28 75 36 34 2a 29 26 6e 43 65 6c 6c  ll, (u64*)&nCell
2c200 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 69 66  Key);.        if
2c210 28 20 6e 43 65 6c 6c 4b 65 79 3c 69 6e 74 4b 65  ( nCellKey<intKe
2c220 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6c  y ){.          l
2c230 77 72 20 3d 20 69 64 78 2b 31 3b 0a 20 20 20 20  wr = idx+1;.    
2c240 20 20 20 20 20 20 69 66 28 20 6c 77 72 3e 75 70        if( lwr>up
2c250 72 20 29 7b 20 63 20 3d 20 2d 31 3b 20 62 72 65  r ){ c = -1; bre
2c260 61 6b 3b 20 7d 0a 20 20 20 20 20 20 20 20 7d 65  ak; }.        }e
2c270 6c 73 65 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79  lse if( nCellKey
2c280 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20  >intKey ){.     
2c290 20 20 20 20 20 75 70 72 20 3d 20 69 64 78 2d 31       upr = idx-1
2c2a0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
2c2b0 6c 77 72 3e 75 70 72 20 29 7b 20 63 20 3d 20 2b  lwr>upr ){ c = +
2c2c0 31 3b 20 62 72 65 61 6b 3b 20 7d 0a 20 20 20 20  1; break; }.    
2c2d0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2c2e0 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 65       assert( nCe
2c2f0 6c 6c 4b 65 79 3d 3d 69 6e 74 4b 65 79 20 29 3b  llKey==intKey );
2c300 0a 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d  .          pCur-
2c310 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
2c320 67 65 5d 20 3d 20 28 75 31 36 29 69 64 78 3b 0a  ge] = (u16)idx;.
2c330 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21 70            if( !p
2c340 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
2c350 20 20 20 20 20 20 20 20 20 20 6c 77 72 20 3d 20            lwr = 
2c360 69 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20 20  idx;.           
2c370 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 6e 65 78   goto moveto_nex
2c380 74 5f 6c 61 79 65 72 3b 0a 20 20 20 20 20 20 20  t_layer;.       
2c390 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2c3a0 20 20 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46        pCur->curF
2c3b0 6c 61 67 73 20 7c 3d 20 42 54 43 46 5f 56 61 6c  lags |= BTCF_Val
2c3c0 69 64 4e 4b 65 79 3b 0a 20 20 20 20 20 20 20 20  idNKey;.        
2c3d0 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e      pCur->info.n
2c3e0 4b 65 79 20 3d 20 6e 43 65 6c 6c 4b 65 79 3b 0a  Key = nCellKey;.
2c3f0 20 20 20 20 20 20 20 20 20 20 20 20 70 43 75 72              pCur
2c400 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30  ->info.nSize = 0
2c410 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 70  ;.            *p
2c420 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Res = 0;.       
2c430 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
2c440 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20  TE_OK;.         
2c450 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
2c460 20 20 20 20 20 61 73 73 65 72 74 28 20 6c 77 72       assert( lwr
2c470 2b 75 70 72 3e 3d 30 20 29 3b 0a 20 20 20 20 20  +upr>=0 );.     
2c480 20 20 20 69 64 78 20 3d 20 28 6c 77 72 2b 75 70     idx = (lwr+up
2c490 72 29 3e 3e 31 3b 20 20 2f 2a 20 69 64 78 20 3d  r)>>1;  /* idx =
2c4a0 20 28 6c 77 72 2b 75 70 72 29 2f 32 3b 20 2a 2f   (lwr+upr)/2; */
2c4b0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
2c4c0 73 65 7b 0a 20 20 20 20 20 20 66 6f 72 28 3b 3b  se{.      for(;;
2c4d0 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e  ){.        int n
2c4e0 43 65 6c 6c 3b 20 20 2f 2a 20 53 69 7a 65 20 6f  Cell;  /* Size o
2c4f0 66 20 74 68 65 20 70 43 65 6c 6c 20 63 65 6c 6c  f the pCell cell
2c500 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 20   in bytes */.   
2c510 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e       pCell = fin
2c520 64 43 65 6c 6c 50 61 73 74 50 74 72 28 70 50 61  dCellPastPtr(pPa
2c530 67 65 2c 20 69 64 78 29 3b 0a 0a 20 20 20 20 20  ge, idx);..     
2c540 20 20 20 2f 2a 20 54 68 65 20 6d 61 78 69 6d 75     /* The maximu
2c550 6d 20 73 75 70 70 6f 72 74 65 64 20 70 61 67 65  m supported page
2c560 2d 73 69 7a 65 20 69 73 20 36 35 35 33 36 20 62  -size is 65536 b
2c570 79 74 65 73 2e 20 54 68 69 73 20 6d 65 61 6e 73  ytes. This means
2c580 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a   that.        **
2c590 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d   the maximum num
2c5a0 62 65 72 20 6f 66 20 72 65 63 6f 72 64 20 62 79  ber of record by
2c5b0 74 65 73 20 73 74 6f 72 65 64 20 6f 6e 20 61 6e  tes stored on an
2c5c0 20 69 6e 64 65 78 20 42 2d 54 72 65 65 0a 20 20   index B-Tree.  
2c5d0 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20 69 73        ** page is
2c5e0 20 6c 65 73 73 20 74 68 61 6e 20 31 36 33 38 34   less than 16384
2c5f0 20 62 79 74 65 73 20 61 6e 64 20 6d 61 79 20 62   bytes and may b
2c600 65 20 73 74 6f 72 65 64 20 61 73 20 61 20 32 2d  e stored as a 2-
2c610 62 79 74 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  byte.        ** 
2c620 76 61 72 69 6e 74 2e 20 54 68 69 73 20 69 6e 66  varint. This inf
2c630 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75 73 65 64  ormation is used
2c640 20 74 6f 20 61 74 74 65 6d 70 74 20 74 6f 20 61   to attempt to a
2c650 76 6f 69 64 20 70 61 72 73 69 6e 67 20 0a 20 20  void parsing .  
2c660 20 20 20 20 20 20 2a 2a 20 74 68 65 20 65 6e 74        ** the ent
2c670 69 72 65 20 63 65 6c 6c 20 62 79 20 63 68 65 63  ire cell by chec
2c680 6b 69 6e 67 20 66 6f 72 20 74 68 65 20 63 61 73  king for the cas
2c690 65 73 20 77 68 65 72 65 20 74 68 65 20 72 65 63  es where the rec
2c6a0 6f 72 64 20 69 73 20 0a 20 20 20 20 20 20 20 20  ord is .        
2c6b0 2a 2a 20 73 74 6f 72 65 64 20 65 6e 74 69 72 65  ** stored entire
2c6c0 6c 79 20 77 69 74 68 69 6e 20 74 68 65 20 62 2d  ly within the b-
2c6d0 74 72 65 65 20 70 61 67 65 20 62 79 20 69 6e 73  tree page by ins
2c6e0 70 65 63 74 69 6e 67 20 74 68 65 20 66 69 72 73  pecting the firs
2c6f0 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 32 20  t .        ** 2 
2c700 62 79 74 65 73 20 6f 66 20 74 68 65 20 63 65 6c  bytes of the cel
2c710 6c 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  l..        */.  
2c720 20 20 20 20 20 20 6e 43 65 6c 6c 20 3d 20 70 43        nCell = pC
2c730 65 6c 6c 5b 30 5d 3b 0a 20 20 20 20 20 20 20 20  ell[0];.        
2c740 69 66 28 20 6e 43 65 6c 6c 3c 3d 70 50 61 67 65  if( nCell<=pPage
2c750 2d 3e 6d 61 78 31 62 79 74 65 50 61 79 6c 6f 61  ->max1bytePayloa
2c760 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  d ){.          /
2c770 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20 72 75  * This branch ru
2c780 6e 73 20 69 66 20 74 68 65 20 72 65 63 6f 72 64  ns if the record
2c790 2d 73 69 7a 65 20 66 69 65 6c 64 20 6f 66 20 74  -size field of t
2c7a0 68 65 20 63 65 6c 6c 20 69 73 20 61 0a 20 20 20  he cell is a.   
2c7b0 20 20 20 20 20 20 20 2a 2a 20 73 69 6e 67 6c 65         ** single
2c7c0 20 62 79 74 65 20 76 61 72 69 6e 74 20 61 6e 64   byte varint and
2c7d0 20 74 68 65 20 72 65 63 6f 72 64 20 66 69 74 73   the record fits
2c7e0 20 65 6e 74 69 72 65 6c 79 20 6f 6e 20 74 68 65   entirely on the
2c7f0 20 6d 61 69 6e 0a 20 20 20 20 20 20 20 20 20 20   main.          
2c800 2a 2a 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20  ** b-tree page. 
2c810 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 74 65   */.          te
2c820 73 74 63 61 73 65 28 20 70 43 65 6c 6c 2b 6e 43  stcase( pCell+nC
2c830 65 6c 6c 2b 31 3d 3d 70 50 61 67 65 2d 3e 61 44  ell+1==pPage->aD
2c840 61 74 61 45 6e 64 20 29 3b 0a 20 20 20 20 20 20  ataEnd );.      
2c850 20 20 20 20 63 20 3d 20 78 52 65 63 6f 72 64 43      c = xRecordC
2c860 6f 6d 70 61 72 65 28 6e 43 65 6c 6c 2c 20 28 76  ompare(nCell, (v
2c870 6f 69 64 2a 29 26 70 43 65 6c 6c 5b 31 5d 2c 20  oid*)&pCell[1], 
2c880 70 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 20 20  pIdxKey);.      
2c890 20 20 7d 65 6c 73 65 20 69 66 28 20 21 28 70 43    }else if( !(pC
2c8a0 65 6c 6c 5b 31 5d 20 26 20 30 78 38 30 29 20 0a  ell[1] & 0x80) .
2c8b0 20 20 20 20 20 20 20 20 20 20 26 26 20 28 6e 43            && (nC
2c8c0 65 6c 6c 20 3d 20 28 28 6e 43 65 6c 6c 26 30 78  ell = ((nCell&0x
2c8d0 37 66 29 3c 3c 37 29 20 2b 20 70 43 65 6c 6c 5b  7f)<<7) + pCell[
2c8e0 31 5d 29 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c  1])<=pPage->maxL
2c8f0 6f 63 61 6c 0a 20 20 20 20 20 20 20 20 29 7b 0a  ocal.        ){.
2c900 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
2c910 20 72 65 63 6f 72 64 2d 73 69 7a 65 20 66 69 65   record-size fie
2c920 6c 64 20 69 73 20 61 20 32 20 62 79 74 65 20 76  ld is a 2 byte v
2c930 61 72 69 6e 74 20 61 6e 64 20 74 68 65 20 72 65  arint and the re
2c940 63 6f 72 64 20 0a 20 20 20 20 20 20 20 20 20 20  cord .          
2c950 2a 2a 20 66 69 74 73 20 65 6e 74 69 72 65 6c 79  ** fits entirely
2c960 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20 62 2d 74   on the main b-t
2c970 72 65 65 20 70 61 67 65 2e 20 20 2a 2f 0a 20 20  ree page.  */.  
2c980 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
2c990 28 20 70 43 65 6c 6c 2b 6e 43 65 6c 6c 2b 32 3d  ( pCell+nCell+2=
2c9a0 3d 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64  =pPage->aDataEnd
2c9b0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63 20   );.          c 
2c9c0 3d 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  = xRecordCompare
2c9d0 28 6e 43 65 6c 6c 2c 20 28 76 6f 69 64 2a 29 26  (nCell, (void*)&
2c9e0 70 43 65 6c 6c 5b 32 5d 2c 20 70 49 64 78 4b 65  pCell[2], pIdxKe
2c9f0 79 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  y);.        }els
2ca00 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e{.          /* 
2ca10 54 68 65 20 72 65 63 6f 72 64 20 66 6c 6f 77 73  The record flows
2ca20 20 6f 76 65 72 20 6f 6e 74 6f 20 6f 6e 65 20 6f   over onto one o
2ca30 72 20 6d 6f 72 65 20 6f 76 65 72 66 6c 6f 77 20  r more overflow 
2ca40 70 61 67 65 73 2e 20 49 6e 0a 20 20 20 20 20 20  pages. In.      
2ca50 20 20 20 20 2a 2a 20 74 68 69 73 20 63 61 73 65      ** this case
2ca60 20 74 68 65 20 77 68 6f 6c 65 20 63 65 6c 6c 20   the whole cell 
2ca70 6e 65 65 64 73 20 74 6f 20 62 65 20 70 61 72 73  needs to be pars
2ca80 65 64 2c 20 61 20 62 75 66 66 65 72 20 61 6c 6c  ed, a buffer all
2ca90 6f 63 61 74 65 64 0a 20 20 20 20 20 20 20 20 20  ocated.         
2caa0 20 2a 2a 20 61 6e 64 20 61 63 63 65 73 73 50 61   ** and accessPa
2cab0 79 6c 6f 61 64 28 29 20 75 73 65 64 20 74 6f 20  yload() used to 
2cac0 72 65 74 72 69 65 76 65 20 74 68 65 20 72 65 63  retrieve the rec
2cad0 6f 72 64 20 69 6e 74 6f 20 74 68 65 0a 20 20 20  ord into the.   
2cae0 20 20 20 20 20 20 20 2a 2a 20 62 75 66 66 65 72         ** buffer
2caf0 20 62 65 66 6f 72 65 20 56 64 62 65 52 65 63 6f   before VdbeReco
2cb00 72 64 43 6f 6d 70 61 72 65 28 29 20 63 61 6e 20  rdCompare() can 
2cb10 62 65 20 63 61 6c 6c 65 64 2e 20 0a 20 20 20 20  be called. .    
2cb20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
2cb30 20 20 20 2a 2a 20 49 66 20 74 68 65 20 72 65 63     ** If the rec
2cb40 6f 72 64 20 69 73 20 63 6f 72 72 75 70 74 2c 20  ord is corrupt, 
2cb50 74 68 65 20 78 52 65 63 6f 72 64 43 6f 6d 70 61  the xRecordCompa
2cb60 72 65 20 72 6f 75 74 69 6e 65 20 6d 61 79 20 72  re routine may r
2cb70 65 61 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ead.          **
2cb80 20 75 70 20 74 6f 20 74 77 6f 20 76 61 72 69 6e   up to two varin
2cb90 74 73 20 70 61 73 74 20 74 68 65 20 65 6e 64 20  ts past the end 
2cba0 6f 66 20 74 68 65 20 62 75 66 66 65 72 2e 20 41  of the buffer. A
2cbb0 6e 20 65 78 74 72 61 20 31 38 20 0a 20 20 20 20  n extra 18 .    
2cbc0 20 20 20 20 20 20 2a 2a 20 62 79 74 65 73 20 6f        ** bytes o
2cbd0 66 20 70 61 64 64 69 6e 67 20 69 73 20 61 6c 6c  f padding is all
2cbe0 6f 63 61 74 65 64 20 61 74 20 74 68 65 20 65 6e  ocated at the en
2cbf0 64 20 6f 66 20 74 68 65 20 62 75 66 66 65 72 20  d of the buffer 
2cc00 69 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  in.          ** 
2cc10 63 61 73 65 20 74 68 69 73 20 68 61 70 70 65 6e  case this happen
2cc20 73 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  s.  */.         
2cc30 20 76 6f 69 64 20 2a 70 43 65 6c 6c 4b 65 79 3b   void *pCellKey;
2cc40 0a 20 20 20 20 20 20 20 20 20 20 75 38 20 2a 20  .          u8 * 
2cc50 63 6f 6e 73 74 20 70 43 65 6c 6c 42 6f 64 79 20  const pCellBody 
2cc60 3d 20 70 43 65 6c 6c 20 2d 20 70 50 61 67 65 2d  = pCell - pPage-
2cc70 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20  >childPtrSize;. 
2cc80 20 20 20 20 20 20 20 20 20 70 50 61 67 65 2d 3e           pPage->
2cc90 78 50 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65  xParseCell(pPage
2cca0 2c 20 70 43 65 6c 6c 42 6f 64 79 2c 20 26 70 43  , pCellBody, &pC
2ccb0 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20 20 20 20 20  ur->info);.     
2ccc0 20 20 20 20 20 6e 43 65 6c 6c 20 3d 20 28 69 6e       nCell = (in
2ccd0 74 29 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65  t)pCur->info.nKe
2cce0 79 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 73  y;.          tes
2ccf0 74 63 61 73 65 28 20 6e 43 65 6c 6c 3c 30 20 29  tcase( nCell<0 )
2cd00 3b 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6b  ;   /* True if k
2cd10 65 79 20 73 69 7a 65 20 69 73 20 32 5e 33 32 20  ey size is 2^32 
2cd20 6f 72 20 6d 6f 72 65 20 2a 2f 0a 20 20 20 20 20  or more */.     
2cd30 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e       testcase( n
2cd40 43 65 6c 6c 3d 3d 30 20 29 3b 20 20 2f 2a 20 49  Cell==0 );  /* I
2cd50 6e 76 61 6c 69 64 20 6b 65 79 20 73 69 7a 65 3a  nvalid key size:
2cd60 20 20 30 78 38 30 20 30 78 38 30 20 30 78 30 30    0x80 0x80 0x00
2cd70 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 74 65   */.          te
2cd80 73 74 63 61 73 65 28 20 6e 43 65 6c 6c 3d 3d 31  stcase( nCell==1
2cd90 20 29 3b 20 20 2f 2a 20 49 6e 76 61 6c 69 64 20   );  /* Invalid 
2cda0 6b 65 79 20 73 69 7a 65 3a 20 20 30 78 38 30 20  key size:  0x80 
2cdb0 30 78 38 30 20 30 78 30 31 20 2a 2f 0a 20 20 20  0x80 0x01 */.   
2cdc0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
2cdd0 20 6e 43 65 6c 6c 3d 3d 32 20 29 3b 20 20 2f 2a   nCell==2 );  /*
2cde0 20 4d 69 6e 69 6d 75 6d 20 6c 65 67 61 6c 20 69   Minimum legal i
2cdf0 6e 64 65 78 20 6b 65 79 20 73 69 7a 65 20 2a 2f  ndex key size */
2ce00 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e  .          if( n
2ce10 43 65 6c 6c 3c 32 20 29 7b 0a 20 20 20 20 20 20  Cell<2 ){.      
2ce20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
2ce30 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
2ce40 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f              goto
2ce50 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a   moveto_finish;.
2ce60 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2ce70 20 20 20 20 20 20 70 43 65 6c 6c 4b 65 79 20 3d        pCellKey =
2ce80 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 20   sqlite3Malloc( 
2ce90 6e 43 65 6c 6c 2b 31 38 20 29 3b 0a 20 20 20 20  nCell+18 );.    
2cea0 20 20 20 20 20 20 69 66 28 20 70 43 65 6c 6c 4b        if( pCellK
2ceb0 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ey==0 ){.       
2cec0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
2ced0 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20  _NOMEM_BKPT;.   
2cee0 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f           goto mo
2cef0 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20  veto_finish;.   
2cf00 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2cf10 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70     pCur->aiIdx[p
2cf20 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75  Cur->iPage] = (u
2cf30 31 36 29 69 64 78 3b 0a 20 20 20 20 20 20 20 20  16)idx;.        
2cf40 20 20 72 63 20 3d 20 61 63 63 65 73 73 50 61 79    rc = accessPay
2cf50 6c 6f 61 64 28 70 43 75 72 2c 20 30 2c 20 6e 43  load(pCur, 0, nC
2cf60 65 6c 6c 2c 20 28 75 6e 73 69 67 6e 65 64 20 63  ell, (unsigned c
2cf70 68 61 72 2a 29 70 43 65 6c 6c 4b 65 79 2c 20 30  har*)pCellKey, 0
2cf80 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 43 75  );.          pCu
2cf90 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e  r->curFlags &= ~
2cfa0 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 3b 0a  BTCF_ValidOvfl;.
2cfb0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
2cfc0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2cfd0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 65  sqlite3_free(pCe
2cfe0 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20  llKey);.        
2cff0 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f      goto moveto_
2d000 66 69 6e 69 73 68 3b 0a 20 20 20 20 20 20 20 20  finish;.        
2d010 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 63 20    }.          c 
2d020 3d 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  = xRecordCompare
2d030 28 6e 43 65 6c 6c 2c 20 70 43 65 6c 6c 4b 65 79  (nCell, pCellKey
2d040 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20 20 20 20  , pIdxKey);.    
2d050 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
2d060 65 65 28 70 43 65 6c 6c 4b 65 79 29 3b 0a 20 20  ee(pCellKey);.  
2d070 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2d080 61 73 73 65 72 74 28 20 0a 20 20 20 20 20 20 20  assert( .       
2d090 20 20 20 20 20 28 70 49 64 78 4b 65 79 2d 3e 65       (pIdxKey->e
2d0a0 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 43  rrCode!=SQLITE_C
2d0b0 4f 52 52 55 50 54 20 7c 7c 20 63 3d 3d 30 29 0a  ORRUPT || c==0).
2d0c0 20 20 20 20 20 20 20 20 20 26 26 20 28 70 49 64           && (pId
2d0d0 78 4b 65 79 2d 3e 65 72 72 43 6f 64 65 21 3d 53  xKey->errCode!=S
2d0e0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 70  QLITE_NOMEM || p
2d0f0 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d  Cur->pBtree->db-
2d100 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 29 0a 20  >mallocFailed). 
2d110 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
2d120 20 20 69 66 28 20 63 3c 30 20 29 7b 0a 20 20 20    if( c<0 ){.   
2d130 20 20 20 20 20 20 20 6c 77 72 20 3d 20 69 64 78         lwr = idx
2d140 2b 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  +1;.        }els
2d150 65 20 69 66 28 20 63 3e 30 20 29 7b 0a 20 20 20  e if( c>0 ){.   
2d160 20 20 20 20 20 20 20 75 70 72 20 3d 20 69 64 78         upr = idx
2d170 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  -1;.        }els
2d180 65 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  e{.          ass
2d190 65 72 74 28 20 63 3d 3d 30 20 29 3b 0a 20 20 20  ert( c==0 );.   
2d1a0 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30         *pRes = 0
2d1b0 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
2d1c0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
2d1d0 20 20 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64        pCur->aiId
2d1e0 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d  x[pCur->iPage] =
2d1f0 20 28 75 31 36 29 69 64 78 3b 0a 20 20 20 20 20   (u16)idx;.     
2d200 20 20 20 20 20 69 66 28 20 70 49 64 78 4b 65 79       if( pIdxKey
2d210 2d 3e 65 72 72 43 6f 64 65 20 29 20 72 63 20 3d  ->errCode ) rc =
2d220 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b   SQLITE_CORRUPT;
2d230 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
2d240 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20  moveto_finish;. 
2d250 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2d260 20 69 66 28 20 6c 77 72 3e 75 70 72 20 29 20 62   if( lwr>upr ) b
2d270 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 61 73  reak;.        as
2d280 73 65 72 74 28 20 6c 77 72 2b 75 70 72 3e 3d 30  sert( lwr+upr>=0
2d290 20 29 3b 0a 20 20 20 20 20 20 20 20 69 64 78 20   );.        idx 
2d2a0 3d 20 28 6c 77 72 2b 75 70 72 29 3e 3e 31 3b 20  = (lwr+upr)>>1; 
2d2b0 20 2f 2a 20 69 64 78 20 3d 20 28 6c 77 72 2b 75   /* idx = (lwr+u
2d2c0 70 72 29 2f 32 20 2a 2f 0a 20 20 20 20 20 20 7d  pr)/2 */.      }
2d2d0 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
2d2e0 74 28 20 6c 77 72 3d 3d 75 70 72 2b 31 20 7c 7c  t( lwr==upr+1 ||
2d2f0 20 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20   (pPage->intKey 
2d300 26 26 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 29  && !pPage->leaf)
2d310 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
2d320 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b  pPage->isInit );
2d330 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e  .    if( pPage->
2d340 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 61 73  leaf ){.      as
2d350 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64  sert( pCur->aiId
2d360 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70  x[pCur->iPage]<p
2d370 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
2d380 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20  ->iPage]->nCell 
2d390 29 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 61  );.      pCur->a
2d3a0 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
2d3b0 5d 20 3d 20 28 75 31 36 29 69 64 78 3b 0a 20 20  ] = (u16)idx;.  
2d3c0 20 20 20 20 2a 70 52 65 73 20 3d 20 63 3b 0a 20      *pRes = c;. 
2d3d0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
2d3e0 5f 4f 4b 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  _OK;.      goto 
2d3f0 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20  moveto_finish;. 
2d400 20 20 20 7d 0a 6d 6f 76 65 74 6f 5f 6e 65 78 74     }.moveto_next
2d410 5f 6c 61 79 65 72 3a 0a 20 20 20 20 69 66 28 20  _layer:.    if( 
2d420 6c 77 72 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c  lwr>=pPage->nCel
2d430 6c 20 29 7b 0a 20 20 20 20 20 20 63 68 6c 64 50  l ){.      chldP
2d440 67 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50  g = get4byte(&pP
2d450 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65  age->aData[pPage
2d460 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b  ->hdrOffset+8]);
2d470 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2d480 20 20 63 68 6c 64 50 67 20 3d 20 67 65 74 34 62    chldPg = get4b
2d490 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61  yte(findCell(pPa
2d4a0 67 65 2c 20 6c 77 72 29 29 3b 0a 20 20 20 20 7d  ge, lwr));.    }
2d4b0 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78  .    pCur->aiIdx
2d4c0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20  [pCur->iPage] = 
2d4d0 28 75 31 36 29 6c 77 72 3b 0a 20 20 20 20 72 63  (u16)lwr;.    rc
2d4e0 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70   = moveToChild(p
2d4f0 43 75 72 2c 20 63 68 6c 64 50 67 29 3b 0a 20 20  Cur, chldPg);.  
2d500 20 20 69 66 28 20 72 63 20 29 20 62 72 65 61 6b    if( rc ) break
2d510 3b 0a 20 20 7d 0a 6d 6f 76 65 74 6f 5f 66 69 6e  ;.  }.moveto_fin
2d520 69 73 68 3a 0a 20 20 70 43 75 72 2d 3e 69 6e 66  ish:.  pCur->inf
2d530 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 61  o.nSize = 0;.  a
2d540 73 73 65 72 74 28 20 28 70 43 75 72 2d 3e 63 75  ssert( (pCur->cu
2d550 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 56 61  rFlags & BTCF_Va
2d560 6c 69 64 4f 76 66 6c 29 3d 3d 30 20 29 3b 0a 20  lidOvfl)==0 );. 
2d570 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
2d580 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  /*.** Return TRU
2d590 45 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20  E if the cursor 
2d5a0 69 73 20 6e 6f 74 20 70 6f 69 6e 74 69 6e 67 20  is not pointing 
2d5b0 61 74 20 61 6e 20 65 6e 74 72 79 20 6f 66 20 74  at an entry of t
2d5c0 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  he table..**.** 
2d5d0 54 52 55 45 20 77 69 6c 6c 20 62 65 20 72 65 74  TRUE will be ret
2d5e0 75 72 6e 65 64 20 61 66 74 65 72 20 61 20 63 61  urned after a ca
2d5f0 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72  ll to sqlite3Btr
2d600 65 65 4e 65 78 74 28 29 20 6d 6f 76 65 73 0a 2a  eeNext() moves.*
2d610 2a 20 70 61 73 74 20 74 68 65 20 6c 61 73 74 20  * past the last 
2d620 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61 62  entry in the tab
2d630 6c 65 20 6f 72 20 73 71 6c 69 74 65 33 42 74 72  le or sqlite3Btr
2d640 65 65 50 72 65 76 28 29 20 6d 6f 76 65 73 20 70  eePrev() moves p
2d650 61 73 74 0a 2a 2a 20 74 68 65 20 66 69 72 73 74  ast.** the first
2d660 20 65 6e 74 72 79 2e 20 20 54 52 55 45 20 69 73   entry.  TRUE is
2d670 20 61 6c 73 6f 20 72 65 74 75 72 6e 65 64 20 69   also returned i
2d680 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 65  f the table is e
2d690 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  mpty..*/.int sql
2d6a0 69 74 65 33 42 74 72 65 65 45 6f 66 28 42 74 43  ite3BtreeEof(BtC
2d6b0 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
2d6c0 2f 2a 20 54 4f 44 4f 3a 20 57 68 61 74 20 69 66  /* TODO: What if
2d6d0 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 69   the cursor is i
2d6e0 6e 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45  n CURSOR_REQUIRE
2d6f0 53 45 45 4b 20 62 75 74 20 61 6c 6c 20 74 61 62  SEEK but all tab
2d700 6c 65 20 65 6e 74 72 69 65 73 0a 20 20 2a 2a 20  le entries.  ** 
2d710 68 61 76 65 20 62 65 65 6e 20 64 65 6c 65 74 65  have been delete
2d720 64 3f 20 54 68 69 73 20 41 50 49 20 77 69 6c 6c  d? This API will
2d730 20 6e 65 65 64 20 74 6f 20 63 68 61 6e 67 65 20   need to change 
2d740 74 6f 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72  to return an err
2d750 6f 72 20 63 6f 64 65 0a 20 20 2a 2a 20 61 73 20  or code.  ** as 
2d760 77 65 6c 6c 20 61 73 20 74 68 65 20 62 6f 6f 6c  well as the bool
2d770 65 61 6e 20 72 65 73 75 6c 74 20 76 61 6c 75 65  ean result value
2d780 2e 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  ..  */.  return 
2d790 28 43 55 52 53 4f 52 5f 56 41 4c 49 44 21 3d 70  (CURSOR_VALID!=p
2d7a0 43 75 72 2d 3e 65 53 74 61 74 65 29 3b 0a 7d 0a  Cur->eState);.}.
2d7b0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 6e  ./*.** Return an
2d7c0 20 65 73 74 69 6d 61 74 65 20 66 6f 72 20 74 68   estimate for th
2d7d0 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  e number of rows
2d7e0 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 74 68   in the table th
2d7f0 61 74 20 70 43 75 72 20 69 73 0a 2a 2a 20 70 6f  at pCur is.** po
2d800 69 6e 74 69 6e 67 20 74 6f 2e 20 20 52 65 74 75  inting to.  Retu
2d810 72 6e 20 61 20 6e 65 67 61 74 69 76 65 20 6e 75  rn a negative nu
2d820 6d 62 65 72 20 69 66 20 6e 6f 20 65 73 74 69 6d  mber if no estim
2d830 61 74 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79  ate is currently
2d840 20 0a 2a 2a 20 61 76 61 69 6c 61 62 6c 65 2e 0a   .** available..
2d850 2a 2f 0a 69 36 34 20 73 71 6c 69 74 65 33 42 74  */.i64 sqlite3Bt
2d860 72 65 65 52 6f 77 43 6f 75 6e 74 45 73 74 28 42  reeRowCountEst(B
2d870 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
2d880 20 20 69 36 34 20 6e 3b 0a 20 20 75 38 20 69 3b    i64 n;.  u8 i;
2d890 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
2d8a0 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70  orOwnsBtShared(p
2d8b0 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
2d8c0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
2d8d0 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65  held(pCur->pBtre
2d8e0 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  e->db->mutex) );
2d8f0 0a 0a 20 20 2f 2a 20 43 75 72 72 65 6e 74 6c 79  ..  /* Currently
2d900 20 74 68 69 73 20 69 6e 74 65 72 66 61 63 65 20   this interface 
2d910 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 62  is only called b
2d920 79 20 74 68 65 20 4f 50 5f 49 66 53 6d 61 6c 6c  y the OP_IfSmall
2d930 65 72 0a 20 20 2a 2a 20 6f 70 63 6f 64 65 2c 20  er.  ** opcode, 
2d940 61 6e 64 20 69 74 20 74 68 61 74 20 63 61 73 65  and it that case
2d950 20 74 68 65 20 63 75 72 73 6f 72 20 77 69 6c 6c   the cursor will
2d960 20 61 6c 77 61 79 73 20 62 65 20 76 61 6c 69 64   always be valid
2d970 20 61 6e 64 0a 20 20 2a 2a 20 77 69 6c 6c 20 61   and.  ** will a
2d980 6c 77 61 79 73 20 70 6f 69 6e 74 20 74 6f 20 61  lways point to a
2d990 20 6c 65 61 66 20 6e 6f 64 65 2e 20 2a 2f 0a 20   leaf node. */. 
2d9a0 20 69 66 28 20 4e 45 56 45 52 28 70 43 75 72 2d   if( NEVER(pCur-
2d9b0 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f  >eState!=CURSOR_
2d9c0 56 41 4c 49 44 29 20 29 20 72 65 74 75 72 6e 20  VALID) ) return 
2d9d0 2d 31 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28  -1;.  if( NEVER(
2d9e0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
2d9f0 72 2d 3e 69 50 61 67 65 5d 2d 3e 6c 65 61 66 3d  r->iPage]->leaf=
2da00 3d 30 29 20 29 20 72 65 74 75 72 6e 20 2d 31 3b  =0) ) return -1;
2da10 0a 0a 20 20 66 6f 72 28 6e 3d 31 2c 20 69 3d 30  ..  for(n=1, i=0
2da20 3b 20 69 3c 3d 70 43 75 72 2d 3e 69 50 61 67 65  ; i<=pCur->iPage
2da30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 6e 20 2a 3d  ; i++){.    n *=
2da40 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d   pCur->apPage[i]
2da50 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 7d 0a 20 20 72  ->nCell;.  }.  r
2da60 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn n;.}../*.*
2da70 2a 20 41 64 76 61 6e 63 65 20 74 68 65 20 63 75  * Advance the cu
2da80 72 73 6f 72 20 74 6f 20 74 68 65 20 6e 65 78 74  rsor to the next
2da90 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61   entry in the da
2daa0 74 61 62 61 73 65 2e 20 20 49 66 0a 2a 2a 20 73  tabase.  If.** s
2dab0 75 63 63 65 73 73 66 75 6c 20 74 68 65 6e 20 73  uccessful then s
2dac0 65 74 20 2a 70 52 65 73 3d 30 2e 20 20 49 66 20  et *pRes=0.  If 
2dad0 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 77 61  the cursor.** wa
2dae0 73 20 61 6c 72 65 61 64 79 20 70 6f 69 6e 74 69  s already pointi
2daf0 6e 67 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65  ng to the last e
2db00 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61 74 61  ntry in the data
2db10 62 61 73 65 20 62 65 66 6f 72 65 0a 2a 2a 20 74  base before.** t
2db20 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61 73 20  his routine was 
2db30 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20 73 65 74  called, then set
2db40 20 2a 70 52 65 73 3d 31 2e 0a 2a 2a 0a 2a 2a 20   *pRes=1..**.** 
2db50 54 68 65 20 6d 61 69 6e 20 65 6e 74 72 79 20 70  The main entry p
2db60 6f 69 6e 74 20 69 73 20 73 71 6c 69 74 65 33 42  oint is sqlite3B
2db70 74 72 65 65 4e 65 78 74 28 29 2e 20 20 54 68 61  treeNext().  Tha
2db80 74 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 70 74  t routine is opt
2db90 69 6d 69 7a 65 64 0a 2a 2a 20 66 6f 72 20 74 68  imized.** for th
2dba0 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 6f 66  e common case of
2dbb0 20 6d 65 72 65 6c 79 20 69 6e 63 72 65 6d 65 6e   merely incremen
2dbc0 74 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 63 6f  ting the cell co
2dbd0 75 6e 74 65 72 20 42 74 43 75 72 73 6f 72 2e 61  unter BtCursor.a
2dbe0 69 49 64 78 0a 2a 2a 20 74 6f 20 74 68 65 20 6e  iIdx.** to the n
2dbf0 65 78 74 20 63 65 6c 6c 20 6f 6e 20 74 68 65 20  ext cell on the 
2dc00 63 75 72 72 65 6e 74 20 70 61 67 65 2e 20 20 54  current page.  T
2dc10 68 65 20 28 73 6c 6f 77 65 72 29 20 62 74 72 65  he (slower) btre
2dc20 65 4e 65 78 74 28 29 20 68 65 6c 70 65 72 0a 2a  eNext() helper.*
2dc30 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  * routine is cal
2dc40 6c 65 64 20 77 68 65 6e 20 69 74 20 69 73 20 6e  led when it is n
2dc50 65 63 65 73 73 61 72 79 20 74 6f 20 6d 6f 76 65  ecessary to move
2dc60 20 74 6f 20 61 20 64 69 66 66 65 72 65 6e 74 20   to a different 
2dc70 70 61 67 65 20 6f 72 0a 2a 2a 20 74 6f 20 72 65  page or.** to re
2dc80 73 74 6f 72 65 20 74 68 65 20 63 75 72 73 6f 72  store the cursor
2dc90 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c  ..**.** The call
2dca0 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c  ing function wil
2dcb0 6c 20 73 65 74 20 2a 70 52 65 73 20 74 6f 20 30  l set *pRes to 0
2dcc0 20 6f 72 20 31 2e 20 20 54 68 65 20 69 6e 69 74   or 1.  The init
2dcd0 69 61 6c 20 2a 70 52 65 73 20 76 61 6c 75 65 0a  ial *pRes value.
2dce0 2a 2a 20 77 69 6c 6c 20 62 65 20 31 20 69 66 20  ** will be 1 if 
2dcf0 74 68 65 20 63 75 72 73 6f 72 20 62 65 69 6e 67  the cursor being
2dd00 20 73 74 65 70 70 65 64 20 63 6f 72 72 65 73 70   stepped corresp
2dd10 6f 6e 64 73 20 74 6f 20 61 6e 20 53 51 4c 20 69  onds to an SQL i
2dd20 6e 64 65 78 20 61 6e 64 0a 2a 2a 20 69 66 20 74  ndex and.** if t
2dd30 68 69 73 20 72 6f 75 74 69 6e 65 20 63 6f 75 6c  his routine coul
2dd40 64 20 68 61 76 65 20 62 65 65 6e 20 73 6b 69 70  d have been skip
2dd50 70 65 64 20 69 66 20 74 68 61 74 20 53 51 4c 20  ped if that SQL 
2dd60 69 6e 64 65 78 20 68 61 64 20 62 65 65 6e 0a 2a  index had been.*
2dd70 2a 20 61 20 75 6e 69 71 75 65 20 69 6e 64 65 78  * a unique index
2dd80 2e 20 20 4f 74 68 65 72 77 69 73 65 20 74 68 65  .  Otherwise the
2dd90 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 68 61 76   caller will hav
2dda0 65 20 73 65 74 20 2a 70 52 65 73 20 74 6f 20 7a  e set *pRes to z
2ddb0 65 72 6f 2e 0a 2a 2a 20 5a 65 72 6f 20 69 73 20  ero..** Zero is 
2ddc0 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 2e  the common case.
2ddd0 20 54 68 65 20 62 74 72 65 65 20 69 6d 70 6c 65   The btree imple
2dde0 6d 65 6e 74 61 74 69 6f 6e 20 69 73 20 66 72 65  mentation is fre
2ddf0 65 20 74 6f 20 75 73 65 20 74 68 65 0a 2a 2a 20  e to use the.** 
2de00 69 6e 69 74 69 61 6c 20 2a 70 52 65 73 20 76 61  initial *pRes va
2de10 6c 75 65 20 61 73 20 61 20 68 69 6e 74 20 74 6f  lue as a hint to
2de20 20 69 6d 70 72 6f 76 65 20 70 65 72 66 6f 72 6d   improve perform
2de30 61 6e 63 65 2c 20 62 75 74 20 74 68 65 20 63 75  ance, but the cu
2de40 72 72 65 6e 74 0a 2a 2a 20 53 51 4c 69 74 65 20  rrent.** SQLite 
2de50 62 74 72 65 65 20 69 6d 70 6c 65 6d 65 6e 74 61  btree implementa
2de60 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 2e 20 28  tion does not. (
2de70 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 63 6f  Note that the co
2de80 6d 64 62 32 20 62 74 72 65 65 0a 2a 2a 20 69 6d  mdb2 btree.** im
2de90 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 64 6f 65  plementation doe
2dea0 73 20 75 73 65 20 74 68 69 73 20 68 69 6e 74 2c  s use this hint,
2deb0 20 68 6f 77 65 76 65 72 2e 29 0a 2a 2f 0a 73 74   however.).*/.st
2dec0 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e  atic SQLITE_NOIN
2ded0 4c 49 4e 45 20 69 6e 74 20 62 74 72 65 65 4e 65  LINE int btreeNe
2dee0 78 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  xt(BtCursor *pCu
2def0 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20  r, int *pRes){. 
2df00 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 69   int rc;.  int i
2df10 64 78 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  dx;.  MemPage *p
2df20 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28  Page;..  assert(
2df30 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61   cursorOwnsBtSha
2df40 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61  red(pCur) );.  a
2df50 73 73 65 72 74 28 20 70 43 75 72 2d 3e 73 6b 69  ssert( pCur->ski
2df60 70 4e 65 78 74 3d 3d 30 20 7c 7c 20 70 43 75 72  pNext==0 || pCur
2df70 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52  ->eState!=CURSOR
2df80 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65  _VALID );.  asse
2df90 72 74 28 20 2a 70 52 65 73 3d 3d 30 20 29 3b 0a  rt( *pRes==0 );.
2dfa0 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
2dfb0 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te!=CURSOR_VALID
2dfc0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
2dfd0 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20  (pCur->curFlags 
2dfe0 26 20 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c  & BTCF_ValidOvfl
2dff0 29 3d 3d 30 20 29 3b 0a 20 20 20 20 72 63 20 3d  )==0 );.    rc =
2e000 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f   restoreCursorPo
2e010 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20  sition(pCur);.  
2e020 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2e030 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74  _OK ){.      ret
2e040 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
2e050 20 20 69 66 28 20 43 55 52 53 4f 52 5f 49 4e 56    if( CURSOR_INV
2e060 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61  ALID==pCur->eSta
2e070 74 65 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 65  te ){.      *pRe
2e080 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 72 65 74  s = 1;.      ret
2e090 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
2e0a0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 43 75     }.    if( pCu
2e0b0 72 2d 3e 73 6b 69 70 4e 65 78 74 20 29 7b 0a 20  r->skipNext ){. 
2e0c0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75       assert( pCu
2e0d0 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
2e0e0 52 5f 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d  R_VALID || pCur-
2e0f0 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
2e100 53 4b 49 50 4e 45 58 54 20 29 3b 0a 20 20 20 20  SKIPNEXT );.    
2e110 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
2e120 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20   CURSOR_VALID;. 
2e130 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 73       if( pCur->s
2e140 6b 69 70 4e 65 78 74 3e 30 20 29 7b 0a 20 20 20  kipNext>0 ){.   
2e150 20 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e       pCur->skipN
2e160 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ext = 0;.       
2e170 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2e180 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  K;.      }.     
2e190 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20   pCur->skipNext 
2e1a0 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  = 0;.    }.  }..
2e1b0 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e    pPage = pCur->
2e1c0 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
2e1d0 67 65 5d 3b 0a 20 20 69 64 78 20 3d 20 2b 2b 70  ge];.  idx = ++p
2e1e0 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
2e1f0 3e 69 50 61 67 65 5d 3b 0a 20 20 61 73 73 65 72  >iPage];.  asser
2e200 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  t( pPage->isInit
2e210 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65   );..  /* If the
2e220 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
2e230 73 20 63 6f 72 72 75 70 74 2c 20 69 74 20 69 73  s corrupt, it is
2e240 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 74 68   possible for th
2e250 65 20 76 61 6c 75 65 20 6f 66 20 69 64 78 20 0a  e value of idx .
2e260 20 20 2a 2a 20 74 6f 20 62 65 20 69 6e 76 61 6c    ** to be inval
2e270 69 64 20 68 65 72 65 2e 20 54 68 69 73 20 63 61  id here. This ca
2e280 6e 20 6f 6e 6c 79 20 6f 63 63 75 72 20 69 66 20  n only occur if 
2e290 61 20 73 65 63 6f 6e 64 20 63 75 72 73 6f 72 20  a second cursor 
2e2a0 6d 6f 64 69 66 69 65 73 0a 20 20 2a 2a 20 74 68  modifies.  ** th
2e2b0 65 20 70 61 67 65 20 77 68 69 6c 65 20 63 75 72  e page while cur
2e2c0 73 6f 72 20 70 43 75 72 20 69 73 20 68 6f 6c 64  sor pCur is hold
2e2d0 69 6e 67 20 61 20 72 65 66 65 72 65 6e 63 65 20  ing a reference 
2e2e0 74 6f 20 69 74 2e 20 57 68 69 63 68 20 63 61 6e  to it. Which can
2e2f0 0a 20 20 2a 2a 20 6f 6e 6c 79 20 68 61 70 70 65  .  ** only happe
2e300 6e 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73  n if the databas
2e310 65 20 69 73 20 63 6f 72 72 75 70 74 20 69 6e 20  e is corrupt in 
2e320 73 75 63 68 20 61 20 77 61 79 20 61 73 20 74 6f  such a way as to
2e330 20 6c 69 6e 6b 20 74 68 65 0a 20 20 2a 2a 20 70   link the.  ** p
2e340 61 67 65 20 69 6e 74 6f 20 6d 6f 72 65 20 74 68  age into more th
2e350 61 6e 20 6f 6e 65 20 62 2d 74 72 65 65 20 73 74  an one b-tree st
2e360 72 75 63 74 75 72 65 2e 20 2a 2f 0a 20 20 74 65  ructure. */.  te
2e370 73 74 63 61 73 65 28 20 69 64 78 3e 70 50 61 67  stcase( idx>pPag
2e380 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 0a 20 20 69  e->nCell );..  i
2e390 66 28 20 69 64 78 3e 3d 70 50 61 67 65 2d 3e 6e  f( idx>=pPage->n
2e3a0 43 65 6c 6c 20 29 7b 0a 20 20 20 20 69 66 28 20  Cell ){.    if( 
2e3b0 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a  !pPage->leaf ){.
2e3c0 20 20 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54        rc = moveT
2e3d0 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 67 65 74  oChild(pCur, get
2e3e0 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44  4byte(&pPage->aD
2e3f0 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66  ata[pPage->hdrOf
2e400 66 73 65 74 2b 38 5d 29 29 3b 0a 20 20 20 20 20  fset+8]));.     
2e410 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
2e420 20 72 63 3b 0a 20 20 20 20 20 20 72 65 74 75 72   rc;.      retur
2e430 6e 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74  n moveToLeftmost
2e440 28 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20  (pCur);.    }.  
2e450 20 20 64 6f 7b 0a 20 20 20 20 20 20 69 66 28 20    do{.      if( 
2e460 70 43 75 72 2d 3e 69 50 61 67 65 3d 3d 30 20 29  pCur->iPage==0 )
2e470 7b 0a 20 20 20 20 20 20 20 20 2a 70 52 65 73 20  {.        *pRes 
2e480 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 43 75  = 1;.        pCu
2e490 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
2e4a0 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20  OR_INVALID;.    
2e4b0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2e4c0 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  E_OK;.      }.  
2e4d0 20 20 20 20 6d 6f 76 65 54 6f 50 61 72 65 6e 74      moveToParent
2e4e0 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20 70 50  (pCur);.      pP
2e4f0 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61  age = pCur->apPa
2e500 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b  ge[pCur->iPage];
2e510 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 70 43 75  .    }while( pCu
2e520 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
2e530 50 61 67 65 5d 3e 3d 70 50 61 67 65 2d 3e 6e 43  Page]>=pPage->nC
2e540 65 6c 6c 20 29 3b 0a 20 20 20 20 69 66 28 20 70  ell );.    if( p
2e550 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a  Page->intKey ){.
2e560 20 20 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c        return sql
2e570 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 70 43  ite3BtreeNext(pC
2e580 75 72 2c 20 70 52 65 73 29 3b 0a 20 20 20 20 7d  ur, pRes);.    }
2e590 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 74 75  else{.      retu
2e5a0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
2e5b0 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 50    }.  }.  if( pP
2e5c0 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
2e5d0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2e5e0 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  K;.  }else{.    
2e5f0 72 65 74 75 72 6e 20 6d 6f 76 65 54 6f 4c 65 66  return moveToLef
2e600 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 7d  tmost(pCur);.  }
2e610 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  .}.int sqlite3Bt
2e620 72 65 65 4e 65 78 74 28 42 74 43 75 72 73 6f 72  reeNext(BtCursor
2e630 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65   *pCur, int *pRe
2e640 73 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  s){.  MemPage *p
2e650 50 61 67 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Page;.  assert( 
2e660 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72  cursorOwnsBtShar
2e670 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ed(pCur) );.  as
2e680 73 65 72 74 28 20 70 52 65 73 21 3d 30 20 29 3b  sert( pRes!=0 );
2e690 0a 20 20 61 73 73 65 72 74 28 20 2a 70 52 65 73  .  assert( *pRes
2e6a0 3d 3d 30 20 7c 7c 20 2a 70 52 65 73 3d 3d 31 20  ==0 || *pRes==1 
2e6b0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
2e6c0 72 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d 30 20 7c  r->skipNext==0 |
2e6d0 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d  | pCur->eState!=
2e6e0 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
2e6f0 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69    pCur->info.nSi
2e700 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e  ze = 0;.  pCur->
2e710 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 28 42 54  curFlags &= ~(BT
2e720 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43  CF_ValidNKey|BTC
2e730 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3b 0a 20 20  F_ValidOvfl);.  
2e740 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 69 66 28  *pRes = 0;.  if(
2e750 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43   pCur->eState!=C
2e760 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 20 72 65  URSOR_VALID ) re
2e770 74 75 72 6e 20 62 74 72 65 65 4e 65 78 74 28 70  turn btreeNext(p
2e780 43 75 72 2c 20 70 52 65 73 29 3b 0a 20 20 70 50  Cur, pRes);.  pP
2e790 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61  age = pCur->apPa
2e7a0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b  ge[pCur->iPage];
2e7b0 0a 20 20 69 66 28 20 28 2b 2b 70 43 75 72 2d 3e  .  if( (++pCur->
2e7c0 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
2e7d0 65 5d 29 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c  e])>=pPage->nCel
2e7e0 6c 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 61  l ){.    pCur->a
2e7f0 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
2e800 5d 2d 2d 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ]--;.    return 
2e810 62 74 72 65 65 4e 65 78 74 28 70 43 75 72 2c 20  btreeNext(pCur, 
2e820 70 52 65 73 29 3b 0a 20 20 7d 0a 20 20 69 66 28  pRes);.  }.  if(
2e830 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a   pPage->leaf ){.
2e840 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2e850 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  E_OK;.  }else{. 
2e860 20 20 20 72 65 74 75 72 6e 20 6d 6f 76 65 54 6f     return moveTo
2e870 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a  Leftmost(pCur);.
2e880 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 65    }.}../*.** Ste
2e890 70 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20  p the cursor to 
2e8a0 74 68 65 20 62 61 63 6b 20 74 6f 20 74 68 65 20  the back to the 
2e8b0 70 72 65 76 69 6f 75 73 20 65 6e 74 72 79 20 69  previous entry i
2e8c0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  n the database. 
2e8d0 20 49 66 0a 2a 2a 20 73 75 63 63 65 73 73 66 75   If.** successfu
2e8e0 6c 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73  l then set *pRes
2e8f0 3d 30 2e 20 20 49 66 20 74 68 65 20 63 75 72 73  =0.  If the curs
2e900 6f 72 0a 2a 2a 20 77 61 73 20 61 6c 72 65 61 64  or.** was alread
2e910 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68  y pointing to th
2e920 65 20 66 69 72 73 74 20 65 6e 74 72 79 20 69 6e  e first entry in
2e930 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62 65   the database be
2e940 66 6f 72 65 0a 2a 2a 20 74 68 69 73 20 72 6f 75  fore.** this rou
2e950 74 69 6e 65 20 77 61 73 20 63 61 6c 6c 65 64 2c  tine was called,
2e960 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d   then set *pRes=
2e970 31 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 69  1..**.** The mai
2e980 6e 20 65 6e 74 72 79 20 70 6f 69 6e 74 20 69 73  n entry point is
2e990 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 72 65   sqlite3BtreePre
2e9a0 76 69 6f 75 73 28 29 2e 20 20 54 68 61 74 20 72  vious().  That r
2e9b0 6f 75 74 69 6e 65 20 69 73 20 6f 70 74 69 6d 69  outine is optimi
2e9c0 7a 65 64 0a 2a 2a 20 66 6f 72 20 74 68 65 20 63  zed.** for the c
2e9d0 6f 6d 6d 6f 6e 20 63 61 73 65 20 6f 66 20 6d 65  ommon case of me
2e9e0 72 65 6c 79 20 64 65 63 72 65 6d 65 6e 74 69 6e  rely decrementin
2e9f0 67 20 74 68 65 20 63 65 6c 6c 20 63 6f 75 6e 74  g the cell count
2ea00 65 72 20 42 74 43 75 72 73 6f 72 2e 61 69 49 64  er BtCursor.aiId
2ea10 78 0a 2a 2a 20 74 6f 20 74 68 65 20 70 72 65 76  x.** to the prev
2ea20 69 6f 75 73 20 63 65 6c 6c 20 6f 6e 20 74 68 65  ious cell on the
2ea30 20 63 75 72 72 65 6e 74 20 70 61 67 65 2e 20 20   current page.  
2ea40 54 68 65 20 28 73 6c 6f 77 65 72 29 20 62 74 72  The (slower) btr
2ea50 65 65 50 72 65 76 69 6f 75 73 28 29 0a 2a 2a 20  eePrevious().** 
2ea60 68 65 6c 70 65 72 20 72 6f 75 74 69 6e 65 20 69  helper routine i
2ea70 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 69 74  s called when it
2ea80 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 74 6f   is necessary to
2ea90 20 6d 6f 76 65 20 74 6f 20 61 20 64 69 66 66 65   move to a diffe
2eaa0 72 65 6e 74 20 70 61 67 65 0a 2a 2a 20 6f 72 20  rent page.** or 
2eab0 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 63  to restore the c
2eac0 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ursor..**.** The
2ead0 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f   calling functio
2eae0 6e 20 77 69 6c 6c 20 73 65 74 20 2a 70 52 65 73  n will set *pRes
2eaf0 20 74 6f 20 30 20 6f 72 20 31 2e 20 20 54 68 65   to 0 or 1.  The
2eb00 20 69 6e 69 74 69 61 6c 20 2a 70 52 65 73 20 76   initial *pRes v
2eb10 61 6c 75 65 0a 2a 2a 20 77 69 6c 6c 20 62 65 20  alue.** will be 
2eb20 31 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20  1 if the cursor 
2eb30 62 65 69 6e 67 20 73 74 65 70 70 65 64 20 63 6f  being stepped co
2eb40 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 61 6e 20  rresponds to an 
2eb50 53 51 4c 20 69 6e 64 65 78 20 61 6e 64 0a 2a 2a  SQL index and.**
2eb60 20 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65   if this routine
2eb70 20 63 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e   could have been
2eb80 20 73 6b 69 70 70 65 64 20 69 66 20 74 68 61 74   skipped if that
2eb90 20 53 51 4c 20 69 6e 64 65 78 20 68 61 64 20 62   SQL index had b
2eba0 65 65 6e 0a 2a 2a 20 61 20 75 6e 69 71 75 65 20  een.** a unique 
2ebb0 69 6e 64 65 78 2e 20 20 4f 74 68 65 72 77 69 73  index.  Otherwis
2ebc0 65 20 74 68 65 20 63 61 6c 6c 65 72 20 77 69 6c  e the caller wil
2ebd0 6c 20 68 61 76 65 20 73 65 74 20 2a 70 52 65 73  l have set *pRes
2ebe0 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2a 20 5a 65 72   to zero..** Zer
2ebf0 6f 20 69 73 20 74 68 65 20 63 6f 6d 6d 6f 6e 20  o is the common 
2ec00 63 61 73 65 2e 20 54 68 65 20 62 74 72 65 65 20  case. The btree 
2ec10 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69  implementation i
2ec20 73 20 66 72 65 65 20 74 6f 20 75 73 65 20 74 68  s free to use th
2ec30 65 0a 2a 2a 20 69 6e 69 74 69 61 6c 20 2a 70 52  e.** initial *pR
2ec40 65 73 20 76 61 6c 75 65 20 61 73 20 61 20 68 69  es value as a hi
2ec50 6e 74 20 74 6f 20 69 6d 70 72 6f 76 65 20 70 65  nt to improve pe
2ec60 72 66 6f 72 6d 61 6e 63 65 2c 20 62 75 74 20 74  rformance, but t
2ec70 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 53 51  he current.** SQ
2ec80 4c 69 74 65 20 62 74 72 65 65 20 69 6d 70 6c 65  Lite btree imple
2ec90 6d 65 6e 74 61 74 69 6f 6e 20 64 6f 65 73 20 6e  mentation does n
2eca0 6f 74 2e 20 28 4e 6f 74 65 20 74 68 61 74 20 74  ot. (Note that t
2ecb0 68 65 20 63 6f 6d 64 62 32 20 62 74 72 65 65 0a  he comdb2 btree.
2ecc0 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ** implementatio
2ecd0 6e 20 64 6f 65 73 20 75 73 65 20 74 68 69 73 20  n does use this 
2ece0 68 69 6e 74 2c 20 68 6f 77 65 76 65 72 2e 29 0a  hint, however.).
2ecf0 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45  */.static SQLITE
2ed00 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74 20 62 74  _NOINLINE int bt
2ed10 72 65 65 50 72 65 76 69 6f 75 73 28 42 74 43 75  reePrevious(BtCu
2ed20 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20  rsor *pCur, int 
2ed30 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63  *pRes){.  int rc
2ed40 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
2ed50 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63  ge;..  assert( c
2ed60 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65  ursorOwnsBtShare
2ed70 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  d(pCur) );.  ass
2ed80 65 72 74 28 20 70 52 65 73 21 3d 30 20 29 3b 0a  ert( pRes!=0 );.
2ed90 20 20 61 73 73 65 72 74 28 20 2a 70 52 65 73 3d    assert( *pRes=
2eda0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
2edb0 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d  pCur->skipNext==
2edc0 30 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74  0 || pCur->eStat
2edd0 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e!=CURSOR_VALID 
2ede0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 43  );.  assert( (pC
2edf0 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 28  ur->curFlags & (
2ee00 42 54 43 46 5f 41 74 4c 61 73 74 7c 42 54 43 46  BTCF_AtLast|BTCF
2ee10 5f 56 61 6c 69 64 4f 76 66 6c 7c 42 54 43 46 5f  _ValidOvfl|BTCF_
2ee20 56 61 6c 69 64 4e 4b 65 79 29 29 3d 3d 30 20 29  ValidNKey))==0 )
2ee30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
2ee40 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20  ->info.nSize==0 
2ee50 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65  );.  if( pCur->e
2ee60 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41  State!=CURSOR_VA
2ee70 4c 49 44 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  LID ){.    rc = 
2ee80 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73  restoreCursorPos
2ee90 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 20  ition(pCur);.   
2eea0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2eeb0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  OK ){.      retu
2eec0 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
2eed0 20 69 66 28 20 43 55 52 53 4f 52 5f 49 4e 56 41   if( CURSOR_INVA
2eee0 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74  LID==pCur->eStat
2eef0 65 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 65 73  e ){.      *pRes
2ef00 20 3d 20 31 3b 0a 20 20 20 20 20 20 72 65 74 75   = 1;.      retu
2ef10 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
2ef20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 43 75 72    }.    if( pCur
2ef30 2d 3e 73 6b 69 70 4e 65 78 74 20 29 7b 0a 20 20  ->skipNext ){.  
2ef40 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
2ef50 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
2ef60 5f 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e  _VALID || pCur->
2ef70 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 53  eState==CURSOR_S
2ef80 4b 49 50 4e 45 58 54 20 29 3b 0a 20 20 20 20 20  KIPNEXT );.     
2ef90 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
2efa0 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20  CURSOR_VALID;.  
2efb0 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 73 6b      if( pCur->sk
2efc0 69 70 4e 65 78 74 3c 30 20 29 7b 0a 20 20 20 20  ipNext<0 ){.    
2efd0 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65      pCur->skipNe
2efe0 78 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  xt = 0;.        
2eff0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2f000 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2f010 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d  pCur->skipNext =
2f020 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20   0;.    }.  }.. 
2f030 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61   pPage = pCur->a
2f040 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
2f050 65 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  e];.  assert( pP
2f060 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20  age->isInit );. 
2f070 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
2f080 66 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 64 78  f ){.    int idx
2f090 20 3d 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70   = pCur->aiIdx[p
2f0a0 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20  Cur->iPage];.   
2f0b0 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c   rc = moveToChil
2f0c0 64 28 70 43 75 72 2c 20 67 65 74 34 62 79 74 65  d(pCur, get4byte
2f0d0 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c  (findCell(pPage,
2f0e0 20 69 64 78 29 29 29 3b 0a 20 20 20 20 69 66 28   idx)));.    if(
2f0f0 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
2f100 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f  .    rc = moveTo
2f110 52 69 67 68 74 6d 6f 73 74 28 70 43 75 72 29 3b  Rightmost(pCur);
2f120 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68  .  }else{.    wh
2f130 69 6c 65 28 20 70 43 75 72 2d 3e 61 69 49 64 78  ile( pCur->aiIdx
2f140 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3d 3d 30  [pCur->iPage]==0
2f150 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 43   ){.      if( pC
2f160 75 72 2d 3e 69 50 61 67 65 3d 3d 30 20 29 7b 0a  ur->iPage==0 ){.
2f170 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53          pCur->eS
2f180 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e  tate = CURSOR_IN
2f190 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 20 20 2a  VALID;.        *
2f1a0 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 20 20  pRes = 1;.      
2f1b0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2f1c0 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OK;.      }.    
2f1d0 20 20 6d 6f 76 65 54 6f 50 61 72 65 6e 74 28 70    moveToParent(p
2f1e0 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Cur);.    }.    
2f1f0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 6e  assert( pCur->in
2f200 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 3b 0a 20  fo.nSize==0 );. 
2f210 20 20 20 61 73 73 65 72 74 28 20 28 70 43 75 72     assert( (pCur
2f220 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 28 42 54  ->curFlags & (BT
2f230 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 29 3d 3d  CF_ValidOvfl))==
2f240 30 20 29 3b 0a 0a 20 20 20 20 70 43 75 72 2d 3e  0 );..    pCur->
2f250 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
2f260 65 5d 2d 2d 3b 0a 20 20 20 20 70 50 61 67 65 20  e]--;.    pPage 
2f270 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  = pCur->apPage[p
2f280 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20  Cur->iPage];.   
2f290 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b   if( pPage->intK
2f2a0 65 79 20 26 26 20 21 70 50 61 67 65 2d 3e 6c 65  ey && !pPage->le
2f2b0 61 66 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  af ){.      rc =
2f2c0 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 72 65   sqlite3BtreePre
2f2d0 76 69 6f 75 73 28 70 43 75 72 2c 20 70 52 65 73  vious(pCur, pRes
2f2e0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
2f2f0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2f300 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  OK;.    }.  }.  
2f310 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 69 6e 74  return rc;.}.int
2f320 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 72 65   sqlite3BtreePre
2f330 76 69 6f 75 73 28 42 74 43 75 72 73 6f 72 20 2a  vious(BtCursor *
2f340 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29  pCur, int *pRes)
2f350 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  {.  assert( curs
2f360 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70  orOwnsBtShared(p
2f370 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
2f380 28 20 70 52 65 73 21 3d 30 20 29 3b 0a 20 20 61  ( pRes!=0 );.  a
2f390 73 73 65 72 74 28 20 2a 70 52 65 73 3d 3d 30 20  ssert( *pRes==0 
2f3a0 7c 7c 20 2a 70 52 65 73 3d 3d 31 20 29 3b 0a 20  || *pRes==1 );. 
2f3b0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 73   assert( pCur->s
2f3c0 6b 69 70 4e 65 78 74 3d 3d 30 20 7c 7c 20 70 43  kipNext==0 || pC
2f3d0 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53  ur->eState!=CURS
2f3e0 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 2a 70  OR_VALID );.  *p
2f3f0 52 65 73 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d  Res = 0;.  pCur-
2f400 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 28 42  >curFlags &= ~(B
2f410 54 43 46 5f 41 74 4c 61 73 74 7c 42 54 43 46 5f  TCF_AtLast|BTCF_
2f420 56 61 6c 69 64 4f 76 66 6c 7c 42 54 43 46 5f 56  ValidOvfl|BTCF_V
2f430 61 6c 69 64 4e 4b 65 79 29 3b 0a 20 20 70 43 75  alidNKey);.  pCu
2f440 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20  r->info.nSize = 
2f450 30 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65  0;.  if( pCur->e
2f460 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41  State!=CURSOR_VA
2f470 4c 49 44 0a 20 20 20 7c 7c 20 70 43 75 72 2d 3e  LID.   || pCur->
2f480 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
2f490 65 5d 3d 3d 30 0a 20 20 20 7c 7c 20 70 43 75 72  e]==0.   || pCur
2f4a0 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
2f4b0 50 61 67 65 5d 2d 3e 6c 65 61 66 3d 3d 30 0a 20  Page]->leaf==0. 
2f4c0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 62   ){.    return b
2f4d0 74 72 65 65 50 72 65 76 69 6f 75 73 28 70 43 75  treePrevious(pCu
2f4e0 72 2c 20 70 52 65 73 29 3b 0a 20 20 7d 0a 20 20  r, pRes);.  }.  
2f4f0 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
2f500 2d 3e 69 50 61 67 65 5d 2d 2d 3b 0a 20 20 72 65  ->iPage]--;.  re
2f510 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2f520 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74  }../*.** Allocat
2f530 65 20 61 20 6e 65 77 20 70 61 67 65 20 66 72 6f  e a new page fro
2f540 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  m the database f
2f550 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e  ile..**.** The n
2f560 65 77 20 70 61 67 65 20 69 73 20 6d 61 72 6b 65  ew page is marke
2f570 64 20 61 73 20 64 69 72 74 79 2e 20 20 28 49 6e  d as dirty.  (In
2f580 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 73 71   other words, sq
2f590 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
2f5a0 29 0a 2a 2a 20 68 61 73 20 61 6c 72 65 61 64 79  ).** has already
2f5b0 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 6f 6e 20   been called on 
2f5c0 74 68 65 20 6e 65 77 20 70 61 67 65 2e 29 20 20  the new page.)  
2f5d0 54 68 65 20 6e 65 77 20 70 61 67 65 20 68 61 73  The new page has
2f5e0 20 61 6c 73 6f 0a 2a 2a 20 62 65 65 6e 20 72 65   also.** been re
2f5f0 66 65 72 65 6e 63 65 64 20 61 6e 64 20 74 68 65  ferenced and the
2f600 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65   calling routine
2f610 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20   is responsible 
2f620 66 6f 72 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73  for calling.** s
2f630 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
2f640 28 29 20 6f 6e 20 74 68 65 20 6e 65 77 20 70 61  () on the new pa
2f650 67 65 20 77 68 65 6e 20 69 74 20 69 73 20 64 6f  ge when it is do
2f660 6e 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45  ne..**.** SQLITE
2f670 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20  _OK is returned 
2f680 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 41 6e 79  on success.  Any
2f690 20 6f 74 68 65 72 20 72 65 74 75 72 6e 20 76 61   other return va
2f6a0 6c 75 65 20 69 6e 64 69 63 61 74 65 73 0a 2a 2a  lue indicates.**
2f6b0 20 61 6e 20 65 72 72 6f 72 2e 20 20 2a 70 70 50   an error.  *ppP
2f6c0 61 67 65 20 69 73 20 73 65 74 20 74 6f 20 4e 55  age is set to NU
2f6d0 4c 4c 20 69 6e 20 74 68 65 20 65 76 65 6e 74 20  LL in the event 
2f6e0 6f 66 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a  of an error..**.
2f6f0 2a 2a 20 49 66 20 74 68 65 20 22 6e 65 61 72 62  ** If the "nearb
2f700 79 22 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  y" parameter is 
2f710 6e 6f 74 20 30 2c 20 74 68 65 6e 20 61 6e 20 65  not 0, then an e
2f720 66 66 6f 72 74 20 69 73 20 6d 61 64 65 20 74 6f  ffort is made to
2f730 20 0a 2a 2a 20 6c 6f 63 61 74 65 20 61 20 70 61   .** locate a pa
2f740 67 65 20 63 6c 6f 73 65 20 74 6f 20 74 68 65 20  ge close to the 
2f750 70 61 67 65 20 6e 75 6d 62 65 72 20 22 6e 65 61  page number "nea
2f760 72 62 79 22 2e 20 20 54 68 69 73 20 63 61 6e 20  rby".  This can 
2f770 62 65 20 75 73 65 64 20 69 6e 20 61 6e 0a 2a 2a  be used in an.**
2f780 20 61 74 74 65 6d 70 74 20 74 6f 20 6b 65 65 70   attempt to keep
2f790 20 72 65 6c 61 74 65 64 20 70 61 67 65 73 20 63   related pages c
2f7a0 6c 6f 73 65 20 74 6f 20 65 61 63 68 20 6f 74 68  lose to each oth
2f7b0 65 72 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  er in the databa
2f7c0 73 65 20 66 69 6c 65 2c 0a 2a 2a 20 77 68 69 63  se file,.** whic
2f7d0 68 20 69 6e 20 74 75 72 6e 20 63 61 6e 20 6d 61  h in turn can ma
2f7e0 6b 65 20 64 61 74 61 62 61 73 65 20 61 63 63 65  ke database acce
2f7f0 73 73 20 66 61 73 74 65 72 2e 0a 2a 2a 0a 2a 2a  ss faster..**.**
2f800 20 49 66 20 74 68 65 20 65 4d 6f 64 65 20 70 61   If the eMode pa
2f810 72 61 6d 65 74 65 72 20 69 73 20 42 54 41 4c 4c  rameter is BTALL
2f820 4f 43 5f 45 58 41 43 54 20 61 6e 64 20 74 68 65  OC_EXACT and the
2f830 20 6e 65 61 72 62 79 20 70 61 67 65 20 65 78 69   nearby page exi
2f840 73 74 73 0a 2a 2a 20 61 6e 79 77 68 65 72 65 20  sts.** anywhere 
2f850 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  on the free-list
2f860 2c 20 74 68 65 6e 20 69 74 20 69 73 20 67 75 61  , then it is gua
2f870 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 72 65  ranteed to be re
2f880 74 75 72 6e 65 64 2e 20 20 49 66 0a 2a 2a 20 65  turned.  If.** e
2f890 4d 6f 64 65 20 69 73 20 42 54 41 4c 4c 4f 43 5f  Mode is BTALLOC_
2f8a0 4c 54 20 74 68 65 6e 20 74 68 65 20 70 61 67 65  LT then the page
2f8b0 20 72 65 74 75 72 6e 65 64 20 77 69 6c 6c 20 62   returned will b
2f8c0 65 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65  e less than or e
2f8d0 71 75 61 6c 0a 2a 2a 20 74 6f 20 6e 65 61 72 62  qual.** to nearb
2f8e0 79 20 69 66 20 61 6e 79 20 73 75 63 68 20 70 61  y if any such pa
2f8f0 67 65 20 65 78 69 73 74 73 2e 20 20 49 66 20 65  ge exists.  If e
2f900 4d 6f 64 65 20 69 73 20 42 54 41 4c 4c 4f 43 5f  Mode is BTALLOC_
2f910 41 4e 59 20 74 68 65 6e 20 74 68 65 72 65 0a 2a  ANY then there.*
2f920 2a 20 61 72 65 20 6e 6f 20 72 65 73 74 72 69 63  * are no restric
2f930 74 69 6f 6e 73 20 6f 6e 20 77 68 69 63 68 20 70  tions on which p
2f940 61 67 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  age is returned.
2f950 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
2f960 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65  llocateBtreePage
2f970 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  (.  BtShared *pB
2f980 74 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  t,         /* Th
2f990 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 4d 65 6d  e btree */.  Mem
2f9a0 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20  Page **ppPage,  
2f9b0 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 70 6f 69      /* Store poi
2f9c0 6e 74 65 72 20 74 6f 20 74 68 65 20 61 6c 6c 6f  nter to the allo
2f9d0 63 61 74 65 64 20 70 61 67 65 20 68 65 72 65 20  cated page here 
2f9e0 2a 2f 0a 20 20 50 67 6e 6f 20 2a 70 50 67 6e 6f  */.  Pgno *pPgno
2f9f0 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  ,           /* S
2fa00 74 6f 72 65 20 74 68 65 20 70 61 67 65 20 6e 75  tore the page nu
2fa10 6d 62 65 72 20 68 65 72 65 20 2a 2f 0a 20 20 50  mber here */.  P
2fa20 67 6e 6f 20 6e 65 61 72 62 79 2c 20 20 20 20 20  gno nearby,     
2fa30 20 20 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20        /* Search 
2fa40 66 6f 72 20 61 20 70 61 67 65 20 6e 65 61 72 20  for a page near 
2fa50 74 68 69 73 20 6f 6e 65 20 2a 2f 0a 20 20 75 38  this one */.  u8
2fa60 20 65 4d 6f 64 65 20 20 20 20 20 20 20 20 20 20   eMode          
2fa70 20 20 20 20 20 2f 2a 20 42 54 41 4c 4c 4f 43 5f       /* BTALLOC_
2fa80 45 58 41 43 54 2c 20 42 54 41 4c 4c 4f 43 5f 4c  EXACT, BTALLOC_L
2fa90 54 2c 20 6f 72 20 42 54 41 4c 4c 4f 43 5f 41 4e  T, or BTALLOC_AN
2faa0 59 20 2a 2f 0a 29 7b 0a 20 20 4d 65 6d 50 61 67  Y */.){.  MemPag
2fab0 65 20 2a 70 50 61 67 65 31 3b 0a 20 20 69 6e 74  e *pPage1;.  int
2fac0 20 72 63 3b 0a 20 20 75 33 32 20 6e 3b 20 20 20   rc;.  u32 n;   
2fad0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
2fae0 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65  ages on the free
2faf0 6c 69 73 74 20 2a 2f 0a 20 20 75 33 32 20 6b 3b  list */.  u32 k;
2fb00 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
2fb10 66 20 6c 65 61 76 65 73 20 6f 6e 20 74 68 65 20  f leaves on the 
2fb20 74 72 75 6e 6b 20 6f 66 20 74 68 65 20 66 72 65  trunk of the fre
2fb30 65 6c 69 73 74 20 2a 2f 0a 20 20 4d 65 6d 50 61  elist */.  MemPa
2fb40 67 65 20 2a 70 54 72 75 6e 6b 20 3d 20 30 3b 0a  ge *pTrunk = 0;.
2fb50 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 72 65 76    MemPage *pPrev
2fb60 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 50 67 6e  Trunk = 0;.  Pgn
2fb70 6f 20 6d 78 50 61 67 65 3b 20 20 20 20 20 2f 2a  o mxPage;     /*
2fb80 20 54 6f 74 61 6c 20 73 69 7a 65 20 6f 66 20 74   Total size of t
2fb90 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2fba0 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73   */..  assert( s
2fbb0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
2fbc0 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
2fbd0 0a 20 20 61 73 73 65 72 74 28 20 65 4d 6f 64 65  .  assert( eMode
2fbe0 3d 3d 42 54 41 4c 4c 4f 43 5f 41 4e 59 20 7c 7c  ==BTALLOC_ANY ||
2fbf0 20 28 6e 65 61 72 62 79 3e 30 20 26 26 20 49 66   (nearby>0 && If
2fc00 4e 6f 74 4f 6d 69 74 41 56 28 70 42 74 2d 3e 61  NotOmitAV(pBt->a
2fc10 75 74 6f 56 61 63 75 75 6d 29 29 20 29 3b 0a 20  utoVacuum)) );. 
2fc20 20 70 50 61 67 65 31 20 3d 20 70 42 74 2d 3e 70   pPage1 = pBt->p
2fc30 50 61 67 65 31 3b 0a 20 20 6d 78 50 61 67 65 20  Page1;.  mxPage 
2fc40 3d 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74  = btreePagecount
2fc50 28 70 42 74 29 3b 0a 20 20 2f 2a 20 45 56 49 44  (pBt);.  /* EVID
2fc60 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 35 31 31 39  ENCE-OF: R-05119
2fc70 2d 30 32 36 33 37 20 54 68 65 20 34 2d 62 79 74  -02637 The 4-byt
2fc80 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74  e big-endian int
2fc90 65 67 65 72 20 61 74 20 6f 66 66 73 65 74 20 33  eger at offset 3
2fca0 36 0a 20 20 2a 2a 20 73 74 6f 72 65 73 20 73 74  6.  ** stores st
2fcb0 6f 72 65 73 20 74 68 65 20 74 6f 74 61 6c 20 6e  ores the total n
2fcc0 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 6f  umber of pages o
2fcd0 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20  n the freelist. 
2fce0 2a 2f 0a 20 20 6e 20 3d 20 67 65 74 34 62 79 74  */.  n = get4byt
2fcf0 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  e(&pPage1->aData
2fd00 5b 33 36 5d 29 3b 0a 20 20 74 65 73 74 63 61 73  [36]);.  testcas
2fd10 65 28 20 6e 3d 3d 6d 78 50 61 67 65 2d 31 20 29  e( n==mxPage-1 )
2fd20 3b 0a 20 20 69 66 28 20 6e 3e 3d 6d 78 50 61 67  ;.  if( n>=mxPag
2fd30 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
2fd40 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
2fd50 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e  KPT;.  }.  if( n
2fd60 3e 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  >0 ){.    /* The
2fd70 72 65 20 61 72 65 20 70 61 67 65 73 20 6f 6e 20  re are pages on 
2fd80 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20 20 52  the freelist.  R
2fd90 65 75 73 65 20 6f 6e 65 20 6f 66 20 74 68 6f 73  euse one of thos
2fda0 65 20 70 61 67 65 73 2e 20 2a 2f 0a 20 20 20 20  e pages. */.    
2fdb0 50 67 6e 6f 20 69 54 72 75 6e 6b 3b 0a 20 20 20  Pgno iTrunk;.   
2fdc0 20 75 38 20 73 65 61 72 63 68 4c 69 73 74 20 3d   u8 searchList =
2fdd0 20 30 3b 20 2f 2a 20 49 66 20 74 68 65 20 66 72   0; /* If the fr
2fde0 65 65 2d 6c 69 73 74 20 6d 75 73 74 20 62 65 20  ee-list must be 
2fdf0 73 65 61 72 63 68 65 64 20 66 6f 72 20 27 6e 65  searched for 'ne
2fe00 61 72 62 79 27 20 2a 2f 0a 20 20 20 20 75 33 32  arby' */.    u32
2fe10 20 6e 53 65 61 72 63 68 20 3d 20 30 3b 20 20 20   nSearch = 0;   
2fe20 2f 2a 20 43 6f 75 6e 74 20 6f 66 20 74 68 65 20  /* Count of the 
2fe30 6e 75 6d 62 65 72 20 6f 66 20 73 65 61 72 63 68  number of search
2fe40 20 61 74 74 65 6d 70 74 73 20 2a 2f 0a 20 20 20   attempts */.   
2fe50 20 0a 20 20 20 20 2f 2a 20 49 66 20 65 4d 6f 64   .    /* If eMod
2fe60 65 3d 3d 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54  e==BTALLOC_EXACT
2fe70 20 61 6e 64 20 61 20 71 75 65 72 79 20 6f 66 20   and a query of 
2fe80 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a  the pointer-map.
2fe90 20 20 20 20 2a 2a 20 73 68 6f 77 73 20 74 68 61      ** shows tha
2fea0 74 20 74 68 65 20 70 61 67 65 20 27 6e 65 61 72  t the page 'near
2feb0 62 79 27 20 69 73 20 73 6f 6d 65 77 68 65 72 65  by' is somewhere
2fec0 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73   on the free-lis
2fed0 74 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 74  t, then.    ** t
2fee0 68 65 20 65 6e 74 69 72 65 2d 6c 69 73 74 20 77  he entire-list w
2fef0 69 6c 6c 20 62 65 20 73 65 61 72 63 68 65 64 20  ill be searched 
2ff00 66 6f 72 20 74 68 61 74 20 70 61 67 65 2e 0a 20  for that page.. 
2ff10 20 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51     */.#ifndef SQ
2ff20 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
2ff30 43 55 55 4d 0a 20 20 20 20 69 66 28 20 65 4d 6f  CUUM.    if( eMo
2ff40 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 45 58 41 43  de==BTALLOC_EXAC
2ff50 54 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e  T ){.      if( n
2ff60 65 61 72 62 79 3c 3d 6d 78 50 61 67 65 20 29 7b  earby<=mxPage ){
2ff70 0a 20 20 20 20 20 20 20 20 75 38 20 65 54 79 70  .        u8 eTyp
2ff80 65 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  e;.        asser
2ff90 74 28 20 6e 65 61 72 62 79 3e 30 20 29 3b 0a 20  t( nearby>0 );. 
2ffa0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
2ffb0 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
2ffc0 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70  ;.        rc = p
2ffd0 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20 6e 65  trmapGet(pBt, ne
2ffe0 61 72 62 79 2c 20 26 65 54 79 70 65 2c 20 30 29  arby, &eType, 0)
2fff0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
30000 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
30010 20 20 20 20 20 20 69 66 28 20 65 54 79 70 65 3d        if( eType=
30020 3d 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45  =PTRMAP_FREEPAGE
30030 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 65   ){.          se
30040 61 72 63 68 4c 69 73 74 20 3d 20 31 3b 0a 20 20  archList = 1;.  
30050 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
30060 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65 4d      }else if( eM
30070 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45 20  ode==BTALLOC_LE 
30080 29 7b 0a 20 20 20 20 20 20 73 65 61 72 63 68 4c  ){.      searchL
30090 69 73 74 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 23  ist = 1;.    }.#
300a0 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 44 65  endif..    /* De
300b0 63 72 65 6d 65 6e 74 20 74 68 65 20 66 72 65 65  crement the free
300c0 2d 6c 69 73 74 20 63 6f 75 6e 74 20 62 79 20 31  -list count by 1
300d0 2e 20 53 65 74 20 69 54 72 75 6e 6b 20 74 6f 20  . Set iTrunk to 
300e0 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65  the index of the
300f0 0a 20 20 20 20 2a 2a 20 66 69 72 73 74 20 66 72  .    ** first fr
30100 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70 61  ee-list trunk pa
30110 67 65 2e 20 69 50 72 65 76 54 72 75 6e 6b 20 69  ge. iPrevTrunk i
30120 73 20 69 6e 69 74 69 61 6c 6c 79 20 31 2e 0a 20  s initially 1.. 
30130 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73     */.    rc = s
30140 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
30150 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65  (pPage1->pDbPage
30160 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
30170 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70  return rc;.    p
30180 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d  ut4byte(&pPage1-
30190 3e 61 44 61 74 61 5b 33 36 5d 2c 20 6e 2d 31 29  >aData[36], n-1)
301a0 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 63 6f  ;..    /* The co
301b0 64 65 20 77 69 74 68 69 6e 20 74 68 69 73 20 6c  de within this l
301c0 6f 6f 70 20 69 73 20 72 75 6e 20 6f 6e 6c 79 20  oop is run only 
301d0 6f 6e 63 65 20 69 66 20 74 68 65 20 27 73 65 61  once if the 'sea
301e0 72 63 68 4c 69 73 74 27 20 76 61 72 69 61 62 6c  rchList' variabl
301f0 65 0a 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20  e.    ** is not 
30200 74 72 75 65 2e 20 4f 74 68 65 72 77 69 73 65 2c  true. Otherwise,
30210 20 69 74 20 72 75 6e 73 20 6f 6e 63 65 20 66 6f   it runs once fo
30220 72 20 65 61 63 68 20 74 72 75 6e 6b 2d 70 61 67  r each trunk-pag
30230 65 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20  e on the.    ** 
30240 66 72 65 65 2d 6c 69 73 74 20 75 6e 74 69 6c 20  free-list until 
30250 74 68 65 20 70 61 67 65 20 27 6e 65 61 72 62 79  the page 'nearby
30260 27 20 69 73 20 6c 6f 63 61 74 65 64 20 28 65 4d  ' is located (eM
30270 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 45 58 41  ode==BTALLOC_EXA
30280 43 54 29 0a 20 20 20 20 2a 2a 20 6f 72 20 75 6e  CT).    ** or un
30290 74 69 6c 20 61 20 70 61 67 65 20 6c 65 73 73 20  til a page less 
302a0 74 68 61 6e 20 27 6e 65 61 72 62 79 27 20 69 73  than 'nearby' is
302b0 20 6c 6f 63 61 74 65 64 20 28 65 4d 6f 64 65 3d   located (eMode=
302c0 3d 42 54 41 4c 4c 4f 43 5f 4c 54 29 0a 20 20 20  =BTALLOC_LT).   
302d0 20 2a 2f 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20   */.    do {.   
302e0 20 20 20 70 50 72 65 76 54 72 75 6e 6b 20 3d 20     pPrevTrunk = 
302f0 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 69 66  pTrunk;.      if
30300 28 20 70 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a  ( pPrevTrunk ){.
30310 20 20 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45          /* EVIDE
30320 4e 43 45 2d 4f 46 3a 20 52 2d 30 31 35 30 36 2d  NCE-OF: R-01506-
30330 31 31 30 35 33 20 54 68 65 20 66 69 72 73 74 20  11053 The first 
30340 69 6e 74 65 67 65 72 20 6f 6e 20 61 20 66 72 65  integer on a fre
30350 65 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65  elist trunk page
30360 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20 74  .        ** is t
30370 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  he page number o
30380 66 20 74 68 65 20 6e 65 78 74 20 66 72 65 65 6c  f the next freel
30390 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20 69  ist trunk page i
303a0 6e 20 74 68 65 20 6c 69 73 74 20 6f 72 0a 20 20  n the list or.  
303b0 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f 20 69 66        ** zero if
303c0 20 74 68 69 73 20 69 73 20 74 68 65 20 6c 61 73   this is the las
303d0 74 20 66 72 65 65 6c 69 73 74 20 74 72 75 6e 6b  t freelist trunk
303e0 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 20 20   page. */.      
303f0 20 20 69 54 72 75 6e 6b 20 3d 20 67 65 74 34 62    iTrunk = get4b
30400 79 74 65 28 26 70 50 72 65 76 54 72 75 6e 6b 2d  yte(&pPrevTrunk-
30410 3e 61 44 61 74 61 5b 30 5d 29 3b 0a 20 20 20 20  >aData[0]);.    
30420 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
30430 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
30440 20 52 2d 35 39 38 34 31 2d 31 33 37 39 38 20 54   R-59841-13798 T
30450 68 65 20 34 2d 62 79 74 65 20 62 69 67 2d 65 6e  he 4-byte big-en
30460 64 69 61 6e 20 69 6e 74 65 67 65 72 20 61 74 20  dian integer at 
30470 6f 66 66 73 65 74 20 33 32 0a 20 20 20 20 20 20  offset 32.      
30480 20 20 2a 2a 20 73 74 6f 72 65 73 20 74 68 65 20    ** stores the 
30490 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  page number of t
304a0 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66  he first page of
304b0 20 74 68 65 20 66 72 65 65 6c 69 73 74 2c 20 6f   the freelist, o
304c0 72 20 7a 65 72 6f 20 69 66 0a 20 20 20 20 20 20  r zero if.      
304d0 20 20 2a 2a 20 74 68 65 20 66 72 65 65 6c 69 73    ** the freelis
304e0 74 20 69 73 20 65 6d 70 74 79 2e 20 2a 2f 0a 20  t is empty. */. 
304f0 20 20 20 20 20 20 20 69 54 72 75 6e 6b 20 3d 20         iTrunk = 
30500 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 31  get4byte(&pPage1
30510 2d 3e 61 44 61 74 61 5b 33 32 5d 29 3b 0a 20 20  ->aData[32]);.  
30520 20 20 20 20 7d 0a 20 20 20 20 20 20 74 65 73 74      }.      test
30530 63 61 73 65 28 20 69 54 72 75 6e 6b 3d 3d 6d 78  case( iTrunk==mx
30540 50 61 67 65 20 29 3b 0a 20 20 20 20 20 20 69 66  Page );.      if
30550 28 20 69 54 72 75 6e 6b 3e 6d 78 50 61 67 65 20  ( iTrunk>mxPage 
30560 7c 7c 20 6e 53 65 61 72 63 68 2b 2b 20 3e 20 6e  || nSearch++ > n
30570 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
30580 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
30590 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d 65 6c 73  BKPT;.      }els
305a0 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  e{.        rc = 
305b0 62 74 72 65 65 47 65 74 55 6e 75 73 65 64 50 61  btreeGetUnusedPa
305c0 67 65 28 70 42 74 2c 20 69 54 72 75 6e 6b 2c 20  ge(pBt, iTrunk, 
305d0 26 70 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20  &pTrunk, 0);.   
305e0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
305f0 63 20 29 7b 0a 20 20 20 20 20 20 20 20 70 54 72  c ){.        pTr
30600 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  unk = 0;.       
30610 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
30620 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 7d  te_page;.      }
30630 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
30640 54 72 75 6e 6b 21 3d 30 20 29 3b 0a 20 20 20 20  Trunk!=0 );.    
30650 20 20 61 73 73 65 72 74 28 20 70 54 72 75 6e 6b    assert( pTrunk
30660 2d 3e 61 44 61 74 61 21 3d 30 20 29 3b 0a 20 20  ->aData!=0 );.  
30670 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
30680 4f 46 3a 20 52 2d 31 33 35 32 33 2d 30 34 33 39  OF: R-13523-0439
30690 34 20 54 68 65 20 73 65 63 6f 6e 64 20 69 6e 74  4 The second int
306a0 65 67 65 72 20 6f 6e 20 61 20 66 72 65 65 6c 69  eger on a freeli
306b0 73 74 20 74 72 75 6e 6b 20 70 61 67 65 0a 20 20  st trunk page.  
306c0 20 20 20 20 2a 2a 20 69 73 20 74 68 65 20 6e 75      ** is the nu
306d0 6d 62 65 72 20 6f 66 20 6c 65 61 66 20 70 61 67  mber of leaf pag
306e0 65 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 66 6f  e pointers to fo
306f0 6c 6c 6f 77 2e 20 2a 2f 0a 20 20 20 20 20 20 6b  llow. */.      k
30700 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 54 72   = get4byte(&pTr
30710 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 29 3b 0a  unk->aData[4]);.
30720 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 30 20 26        if( k==0 &
30730 26 20 21 73 65 61 72 63 68 4c 69 73 74 20 29 7b  & !searchList ){
30740 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
30750 74 72 75 6e 6b 20 68 61 73 20 6e 6f 20 6c 65 61  trunk has no lea
30760 76 65 73 20 61 6e 64 20 74 68 65 20 6c 69 73 74  ves and the list
30770 20 69 73 20 6e 6f 74 20 62 65 69 6e 67 20 73 65   is not being se
30780 61 72 63 68 65 64 2e 20 0a 20 20 20 20 20 20 20  arched. .       
30790 20 2a 2a 20 53 6f 20 65 78 74 72 61 63 74 20 74   ** So extract t
307a0 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20 69 74  he trunk page it
307b0 73 65 6c 66 20 61 6e 64 20 75 73 65 20 69 74 20  self and use it 
307c0 61 73 20 74 68 65 20 6e 65 77 6c 79 20 0a 20 20  as the newly .  
307d0 20 20 20 20 20 20 2a 2a 20 61 6c 6c 6f 63 61 74        ** allocat
307e0 65 64 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20  ed page */.     
307f0 20 20 20 61 73 73 65 72 74 28 20 70 50 72 65 76     assert( pPrev
30800 54 72 75 6e 6b 3d 3d 30 20 29 3b 0a 20 20 20 20  Trunk==0 );.    
30810 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
30820 50 61 67 65 72 57 72 69 74 65 28 70 54 72 75 6e  PagerWrite(pTrun
30830 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  k->pDbPage);.   
30840 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
30850 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
30860 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b  d_allocate_page;
30870 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
30880 20 20 20 2a 70 50 67 6e 6f 20 3d 20 69 54 72 75     *pPgno = iTru
30890 6e 6b 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63  nk;.        memc
308a0 70 79 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  py(&pPage1->aDat
308b0 61 5b 33 32 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e  a[32], &pTrunk->
308c0 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20  aData[0], 4);.  
308d0 20 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20        *ppPage = 
308e0 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20  pTrunk;.        
308f0 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20  pTrunk = 0;.    
30900 20 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f      TRACE(("ALLO
30910 43 41 54 45 3a 20 25 64 20 74 72 75 6e 6b 20 2d  CATE: %d trunk -
30920 20 25 64 20 66 72 65 65 20 70 61 67 65 73 20 6c   %d free pages l
30930 65 66 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f 2c 20  eft\n", *pPgno, 
30940 6e 2d 31 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c  n-1));.      }el
30950 73 65 20 69 66 28 20 6b 3e 28 75 33 32 29 28 70  se if( k>(u32)(p
30960 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34  Bt->usableSize/4
30970 20 2d 20 32 29 20 29 7b 0a 20 20 20 20 20 20 20   - 2) ){.       
30980 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20 6b 20 69   /* Value of k i
30990 73 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 20  s out of range. 
309a0 20 44 61 74 61 62 61 73 65 20 63 6f 72 72 75 70   Database corrup
309b0 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20  tion */.        
309c0 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
309d0 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
309e0 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63    goto end_alloc
309f0 61 74 65 5f 70 61 67 65 3b 0a 23 69 66 6e 64 65  ate_page;.#ifnde
30a00 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
30a10 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 7d  TOVACUUM.      }
30a20 65 6c 73 65 20 69 66 28 20 73 65 61 72 63 68 4c  else if( searchL
30a30 69 73 74 20 0a 20 20 20 20 20 20 20 20 20 20 20  ist .           
30a40 20 26 26 20 28 6e 65 61 72 62 79 3d 3d 69 54 72   && (nearby==iTr
30a50 75 6e 6b 20 7c 7c 20 28 69 54 72 75 6e 6b 3c 6e  unk || (iTrunk<n
30a60 65 61 72 62 79 20 26 26 20 65 4d 6f 64 65 3d 3d  earby && eMode==
30a70 42 54 41 4c 4c 4f 43 5f 4c 45 29 29 20 0a 20 20  BTALLOC_LE)) .  
30a80 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 2f      ){.        /
30a90 2a 20 54 68 65 20 6c 69 73 74 20 69 73 20 62 65  * The list is be
30aa0 69 6e 67 20 73 65 61 72 63 68 65 64 20 61 6e 64  ing searched and
30ab0 20 74 68 69 73 20 74 72 75 6e 6b 20 70 61 67 65   this trunk page
30ac0 20 69 73 20 74 68 65 20 70 61 67 65 0a 20 20 20   is the page.   
30ad0 20 20 20 20 20 2a 2a 20 74 6f 20 61 6c 6c 6f 63       ** to alloc
30ae0 61 74 65 2c 20 72 65 67 61 72 64 6c 65 73 73 20  ate, regardless 
30af0 6f 66 20 77 68 65 74 68 65 72 20 69 74 20 68 61  of whether it ha
30b00 73 20 6c 65 61 76 65 73 2e 0a 20 20 20 20 20 20  s leaves..      
30b10 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 2a 70 50    */.        *pP
30b20 67 6e 6f 20 3d 20 69 54 72 75 6e 6b 3b 0a 20 20  gno = iTrunk;.  
30b30 20 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20        *ppPage = 
30b40 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20  pTrunk;.        
30b50 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b 0a  searchList = 0;.
30b60 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
30b70 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
30b80 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b  Trunk->pDbPage);
30b90 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20  .        if( rc 
30ba0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  ){.          got
30bb0 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
30bc0 61 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  age;.        }. 
30bd0 20 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 30 20         if( k==0 
30be0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
30bf0 20 21 70 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a   !pPrevTrunk ){.
30c00 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63              memc
30c10 70 79 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  py(&pPage1->aDat
30c20 61 5b 33 32 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e  a[32], &pTrunk->
30c30 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20  aData[0], 4);.  
30c40 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
30c50 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
30c60 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
30c70 65 28 70 50 72 65 76 54 72 75 6e 6b 2d 3e 70 44  e(pPrevTrunk->pD
30c80 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
30c90 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
30ca0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
30cb0 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
30cc0 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20  allocate_page;. 
30cd0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
30ce0 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
30cf0 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61  &pPrevTrunk->aDa
30d00 74 61 5b 30 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e  ta[0], &pTrunk->
30d10 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20  aData[0], 4);.  
30d20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
30d30 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
30d40 20 20 20 2f 2a 20 54 68 65 20 74 72 75 6e 6b 20     /* The trunk 
30d50 70 61 67 65 20 69 73 20 72 65 71 75 69 72 65 64  page is required
30d60 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20 62   by the caller b
30d70 75 74 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 0a  ut it contains .
30d80 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 6f 69            ** poi
30d90 6e 74 65 72 73 20 74 6f 20 66 72 65 65 2d 6c 69  nters to free-li
30da0 73 74 20 6c 65 61 76 65 73 2e 20 54 68 65 20 66  st leaves. The f
30db0 69 72 73 74 20 6c 65 61 66 20 62 65 63 6f 6d 65  irst leaf become
30dc0 73 20 61 20 74 72 75 6e 6b 0a 20 20 20 20 20 20  s a trunk.      
30dd0 20 20 20 20 2a 2a 20 70 61 67 65 20 69 6e 20 74      ** page in t
30de0 68 69 73 20 63 61 73 65 2e 0a 20 20 20 20 20 20  his case..      
30df0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
30e00 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 54 72   MemPage *pNewTr
30e10 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 50  unk;.          P
30e20 67 6e 6f 20 69 4e 65 77 54 72 75 6e 6b 20 3d 20  gno iNewTrunk = 
30e30 67 65 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b  get4byte(&pTrunk
30e40 2d 3e 61 44 61 74 61 5b 38 5d 29 3b 0a 20 20 20  ->aData[8]);.   
30e50 20 20 20 20 20 20 20 69 66 28 20 69 4e 65 77 54         if( iNewT
30e60 72 75 6e 6b 3e 6d 78 50 61 67 65 20 29 7b 20 0a  runk>mxPage ){ .
30e70 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
30e80 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
30e90 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20  BKPT;.          
30ea0 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63    goto end_alloc
30eb0 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20  ate_page;.      
30ec0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
30ed0 74 65 73 74 63 61 73 65 28 20 69 4e 65 77 54 72  testcase( iNewTr
30ee0 75 6e 6b 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20  unk==mxPage );. 
30ef0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 62 74           rc = bt
30f00 72 65 65 47 65 74 55 6e 75 73 65 64 50 61 67 65  reeGetUnusedPage
30f10 28 70 42 74 2c 20 69 4e 65 77 54 72 75 6e 6b 2c  (pBt, iNewTrunk,
30f20 20 26 70 4e 65 77 54 72 75 6e 6b 2c 20 30 29 3b   &pNewTrunk, 0);
30f30 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
30f40 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
30f50 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f              goto
30f60 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
30f70 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ge;.          }.
30f80 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
30f90 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
30fa0 28 70 4e 65 77 54 72 75 6e 6b 2d 3e 70 44 62 50  (pNewTrunk->pDbP
30fb0 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
30fc0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
30fd0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
30fe0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4e 65   releasePage(pNe
30ff0 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20  wTrunk);.       
31000 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c       goto end_al
31010 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20  locate_page;.   
31020 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
31030 20 20 20 6d 65 6d 63 70 79 28 26 70 4e 65 77 54     memcpy(&pNewT
31040 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20  runk->aData[0], 
31050 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30  &pTrunk->aData[0
31060 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20  ], 4);.         
31070 20 70 75 74 34 62 79 74 65 28 26 70 4e 65 77 54   put4byte(&pNewT
31080 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c 20  runk->aData[4], 
31090 6b 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20  k-1);.          
310a0 6d 65 6d 63 70 79 28 26 70 4e 65 77 54 72 75 6e  memcpy(&pNewTrun
310b0 6b 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 26 70 54  k->aData[8], &pT
310c0 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 31 32 5d 2c  runk->aData[12],
310d0 20 28 6b 2d 31 29 2a 34 29 3b 0a 20 20 20 20 20   (k-1)*4);.     
310e0 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
310f0 28 70 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20  (pNewTrunk);.   
31100 20 20 20 20 20 20 20 69 66 28 20 21 70 50 72 65         if( !pPre
31110 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20  vTrunk ){.      
31120 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71        assert( sq
31130 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
31140 65 61 62 6c 65 28 70 50 61 67 65 31 2d 3e 70 44  eable(pPage1->pD
31150 62 50 61 67 65 29 20 29 3b 0a 20 20 20 20 20 20  bPage) );.      
31160 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
31170 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32  pPage1->aData[32
31180 5d 2c 20 69 4e 65 77 54 72 75 6e 6b 29 3b 0a 20  ], iNewTrunk);. 
31190 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
311a0 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
311b0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
311c0 74 65 28 70 50 72 65 76 54 72 75 6e 6b 2d 3e 70  te(pPrevTrunk->p
311d0 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
311e0 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
311f0 20 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74               got
31200 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
31210 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  age;.           
31220 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70   }.            p
31230 75 74 34 62 79 74 65 28 26 70 50 72 65 76 54 72  ut4byte(&pPrevTr
31240 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 69  unk->aData[0], i
31250 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20  NewTrunk);.     
31260 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
31270 0a 20 20 20 20 20 20 20 20 70 54 72 75 6e 6b 20  .        pTrunk 
31280 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 54 52 41  = 0;.        TRA
31290 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25  CE(("ALLOCATE: %
312a0 64 20 74 72 75 6e 6b 20 2d 20 25 64 20 66 72 65  d trunk - %d fre
312b0 65 20 70 61 67 65 73 20 6c 65 66 74 5c 6e 22 2c  e pages left\n",
312c0 20 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a   *pPgno, n-1));.
312d0 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 65 6c  #endif.      }el
312e0 73 65 20 69 66 28 20 6b 3e 30 20 29 7b 0a 20 20  se if( k>0 ){.  
312f0 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 63 74        /* Extract
31300 20 61 20 6c 65 61 66 20 66 72 6f 6d 20 74 68 65   a leaf from the
31310 20 74 72 75 6e 6b 20 2a 2f 0a 20 20 20 20 20 20   trunk */.      
31320 20 20 75 33 32 20 63 6c 6f 73 65 73 74 3b 0a 20    u32 closest;. 
31330 20 20 20 20 20 20 20 50 67 6e 6f 20 69 50 61 67         Pgno iPag
31340 65 3b 0a 20 20 20 20 20 20 20 20 75 6e 73 69 67  e;.        unsig
31350 6e 65 64 20 63 68 61 72 20 2a 61 44 61 74 61 20  ned char *aData 
31360 3d 20 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 3b  = pTrunk->aData;
31370 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 65 61  .        if( nea
31380 72 62 79 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  rby>0 ){.       
31390 20 20 20 75 33 32 20 69 3b 0a 20 20 20 20 20 20     u32 i;.      
313a0 20 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 30 3b      closest = 0;
313b0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 65  .          if( e
313c0 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45  Mode==BTALLOC_LE
313d0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
313e0 66 6f 72 28 69 3d 30 3b 20 69 3c 6b 3b 20 69 2b  for(i=0; i<k; i+
313f0 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
31400 20 20 69 50 61 67 65 20 3d 20 67 65 74 34 62 79    iPage = get4by
31410 74 65 28 26 61 44 61 74 61 5b 38 2b 69 2a 34 5d  te(&aData[8+i*4]
31420 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
31430 20 69 66 28 20 69 50 61 67 65 3c 3d 6e 65 61 72   if( iPage<=near
31440 62 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  by ){.          
31450 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d 20        closest = 
31460 69 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  i;.             
31470 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
31480 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
31490 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
314a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
314b0 20 20 20 20 20 69 6e 74 20 64 69 73 74 3b 0a 20       int dist;. 
314c0 20 20 20 20 20 20 20 20 20 20 20 64 69 73 74 20             dist 
314d0 3d 20 73 71 6c 69 74 65 33 41 62 73 49 6e 74 33  = sqlite3AbsInt3
314e0 32 28 67 65 74 34 62 79 74 65 28 26 61 44 61 74  2(get4byte(&aDat
314f0 61 5b 38 5d 29 20 2d 20 6e 65 61 72 62 79 29 3b  a[8]) - nearby);
31500 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72  .            for
31510 28 69 3d 31 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b  (i=1; i<k; i++){
31520 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
31530 6e 74 20 64 32 20 3d 20 73 71 6c 69 74 65 33 41  nt d2 = sqlite3A
31540 62 73 49 6e 74 33 32 28 67 65 74 34 62 79 74 65  bsInt32(get4byte
31550 28 26 61 44 61 74 61 5b 38 2b 69 2a 34 5d 29 20  (&aData[8+i*4]) 
31560 2d 20 6e 65 61 72 62 79 29 3b 0a 20 20 20 20 20  - nearby);.     
31570 20 20 20 20 20 20 20 20 20 69 66 28 20 64 32 3c           if( d2<
31580 64 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20  dist ){.        
31590 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20          closest 
315a0 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = i;.           
315b0 20 20 20 20 20 64 69 73 74 20 3d 20 64 32 3b 0a       dist = d2;.
315c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
315d0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
315e0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
315f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
31600 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 30 3b 0a     closest = 0;.
31610 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
31620 20 20 20 69 50 61 67 65 20 3d 20 67 65 74 34 62     iPage = get4b
31630 79 74 65 28 26 61 44 61 74 61 5b 38 2b 63 6c 6f  yte(&aData[8+clo
31640 73 65 73 74 2a 34 5d 29 3b 0a 20 20 20 20 20 20  sest*4]);.      
31650 20 20 74 65 73 74 63 61 73 65 28 20 69 50 61 67    testcase( iPag
31660 65 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20 20  e==mxPage );.   
31670 20 20 20 20 20 69 66 28 20 69 50 61 67 65 3e 6d       if( iPage>m
31680 78 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20  xPage ){.       
31690 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
316a0 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
316b0 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
316c0 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20  allocate_page;. 
316d0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
316e0 20 74 65 73 74 63 61 73 65 28 20 69 50 61 67 65   testcase( iPage
316f0 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20 20 20  ==mxPage );.    
31700 20 20 20 20 69 66 28 20 21 73 65 61 72 63 68 4c      if( !searchL
31710 69 73 74 20 0a 20 20 20 20 20 20 20 20 20 7c 7c  ist .         ||
31720 20 28 69 50 61 67 65 3d 3d 6e 65 61 72 62 79 20   (iPage==nearby 
31730 7c 7c 20 28 69 50 61 67 65 3c 6e 65 61 72 62 79  || (iPage<nearby
31740 20 26 26 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c   && eMode==BTALL
31750 4f 43 5f 4c 45 29 29 20 0a 20 20 20 20 20 20 20  OC_LE)) .       
31760 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   ){.          in
31770 74 20 6e 6f 43 6f 6e 74 65 6e 74 3b 0a 20 20 20  t noContent;.   
31780 20 20 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20         *pPgno = 
31790 69 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20  iPage;.         
317a0 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54   TRACE(("ALLOCAT
317b0 45 3a 20 25 64 20 77 61 73 20 6c 65 61 66 20 25  E: %d was leaf %
317c0 64 20 6f 66 20 25 64 20 6f 6e 20 74 72 75 6e 6b  d of %d on trunk
317d0 20 25 64 22 0a 20 20 20 20 20 20 20 20 20 20 20   %d".           
317e0 20 20 20 20 20 20 22 3a 20 25 64 20 6d 6f 72 65        ": %d more
317f0 20 66 72 65 65 20 70 61 67 65 73 5c 6e 22 2c 0a   free pages\n",.
31800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31810 20 2a 70 50 67 6e 6f 2c 20 63 6c 6f 73 65 73 74   *pPgno, closest
31820 2b 31 2c 20 6b 2c 20 70 54 72 75 6e 6b 2d 3e 70  +1, k, pTrunk->p
31830 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20 20 20  gno, n-1));.    
31840 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
31850 65 33 50 61 67 65 72 57 72 69 74 65 28 70 54 72  e3PagerWrite(pTr
31860 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  unk->pDbPage);. 
31870 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20           if( rc 
31880 29 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63  ) goto end_alloc
31890 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20  ate_page;.      
318a0 20 20 20 20 69 66 28 20 63 6c 6f 73 65 73 74 3c      if( closest<
318b0 6b 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20  k-1 ){.         
318c0 20 20 20 6d 65 6d 63 70 79 28 26 61 44 61 74 61     memcpy(&aData
318d0 5b 38 2b 63 6c 6f 73 65 73 74 2a 34 5d 2c 20 26  [8+closest*4], &
318e0 61 44 61 74 61 5b 34 2b 6b 2a 34 5d 2c 20 34 29  aData[4+k*4], 4)
318f0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
31900 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
31910 28 26 61 44 61 74 61 5b 34 5d 2c 20 6b 2d 31 29  (&aData[4], k-1)
31920 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 6f 43 6f  ;.          noCo
31930 6e 74 65 6e 74 20 3d 20 21 62 74 72 65 65 47 65  ntent = !btreeGe
31940 74 48 61 73 43 6f 6e 74 65 6e 74 28 70 42 74 2c  tHasContent(pBt,
31950 20 2a 70 50 67 6e 6f 29 3f 20 50 41 47 45 52 5f   *pPgno)? PAGER_
31960 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 3a 20  GET_NOCONTENT : 
31970 30 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  0;.          rc 
31980 3d 20 62 74 72 65 65 47 65 74 55 6e 75 73 65 64  = btreeGetUnused
31990 50 61 67 65 28 70 42 74 2c 20 2a 70 50 67 6e 6f  Page(pBt, *pPgno
319a0 2c 20 70 70 50 61 67 65 2c 20 6e 6f 43 6f 6e 74  , ppPage, noCont
319b0 65 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ent);.          
319c0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
319d0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
319e0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
319f0 65 72 57 72 69 74 65 28 28 2a 70 70 50 61 67 65  erWrite((*ppPage
31a00 29 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  )->pDbPage);.   
31a10 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
31a20 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
31a30 20 20 20 20 20 20 20 20 20 20 20 20 72 65 6c 65              rele
31a40 61 73 65 50 61 67 65 28 2a 70 70 50 61 67 65 29  asePage(*ppPage)
31a50 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
31a60 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 20  *ppPage = 0;.   
31a70 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
31a80 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
31a90 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b   searchList = 0;
31aa0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
31ab0 20 7d 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65   }.      release
31ac0 50 61 67 65 28 70 50 72 65 76 54 72 75 6e 6b 29  Page(pPrevTrunk)
31ad0 3b 0a 20 20 20 20 20 20 70 50 72 65 76 54 72 75  ;.      pPrevTru
31ae0 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 7d 77 68 69  nk = 0;.    }whi
31af0 6c 65 28 20 73 65 61 72 63 68 4c 69 73 74 20 29  le( searchList )
31b00 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
31b10 2a 20 54 68 65 72 65 20 61 72 65 20 6e 6f 20 70  * There are no p
31b20 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65  ages on the free
31b30 6c 69 73 74 2c 20 73 6f 20 61 70 70 65 6e 64 20  list, so append 
31b40 61 20 6e 65 77 20 70 61 67 65 20 74 6f 20 74 68  a new page to th
31b50 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73  e.    ** databas
31b60 65 20 69 6d 61 67 65 2e 0a 20 20 20 20 2a 2a 0a  e image..    **.
31b70 20 20 20 20 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c      ** Normally,
31b80 20 6e 65 77 20 70 61 67 65 73 20 61 6c 6c 6f 63   new pages alloc
31b90 61 74 65 64 20 62 79 20 74 68 69 73 20 62 6c 6f  ated by this blo
31ba0 63 6b 20 63 61 6e 20 62 65 20 72 65 71 75 65 73  ck can be reques
31bb0 74 65 64 20 66 72 6f 6d 20 74 68 65 0a 20 20 20  ted from the.   
31bc0 20 2a 2a 20 70 61 67 65 72 20 6c 61 79 65 72 20   ** pager layer 
31bd0 77 69 74 68 20 74 68 65 20 27 6e 6f 2d 63 6f 6e  with the 'no-con
31be0 74 65 6e 74 27 20 66 6c 61 67 20 73 65 74 2e 20  tent' flag set. 
31bf0 54 68 69 73 20 70 72 65 76 65 6e 74 73 20 74 68  This prevents th
31c00 65 20 70 61 67 65 72 0a 20 20 20 20 2a 2a 20 66  e pager.    ** f
31c10 72 6f 6d 20 74 72 79 69 6e 67 20 74 6f 20 72 65  rom trying to re
31c20 61 64 20 74 68 65 20 70 61 67 65 73 20 63 6f 6e  ad the pages con
31c30 74 65 6e 74 20 66 72 6f 6d 20 64 69 73 6b 2e 20  tent from disk. 
31c40 48 6f 77 65 76 65 72 2c 20 69 66 20 74 68 65 0a  However, if the.
31c50 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 74      ** current t
31c60 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 61  ransaction has a
31c70 6c 72 65 61 64 79 20 72 75 6e 20 6f 6e 65 20 6f  lready run one o
31c80 72 20 6d 6f 72 65 20 69 6e 63 72 65 6d 65 6e 74  r more increment
31c90 61 6c 2d 76 61 63 75 75 6d 0a 20 20 20 20 2a 2a  al-vacuum.    **
31ca0 20 73 74 65 70 73 2c 20 74 68 65 6e 20 74 68 65   steps, then the
31cb0 20 70 61 67 65 20 77 65 20 61 72 65 20 61 62 6f   page we are abo
31cc0 75 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d  ut to allocate m
31cd0 61 79 20 63 6f 6e 74 61 69 6e 20 63 6f 6e 74 65  ay contain conte
31ce0 6e 74 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 69  nt.    ** that i
31cf0 73 20 72 65 71 75 69 72 65 64 20 69 6e 20 74 68  s required in th
31d00 65 20 65 76 65 6e 74 20 6f 66 20 61 20 72 6f 6c  e event of a rol
31d10 6c 62 61 63 6b 2e 20 49 6e 20 74 68 69 73 20 63  lback. In this c
31d20 61 73 65 2c 20 64 6f 0a 20 20 20 20 2a 2a 20 6e  ase, do.    ** n
31d30 6f 74 20 73 65 74 20 74 68 65 20 6e 6f 2d 63 6f  ot set the no-co
31d40 6e 74 65 6e 74 20 66 6c 61 67 2e 20 54 68 69 73  ntent flag. This
31d50 20 63 61 75 73 65 73 20 74 68 65 20 70 61 67 65   causes the page
31d60 72 20 74 6f 20 6c 6f 61 64 20 61 6e 64 20 6a 6f  r to load and jo
31d70 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 74 68 65  urnal.    ** the
31d80 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 63 6f   current page co
31d90 6e 74 65 6e 74 20 62 65 66 6f 72 65 20 6f 76 65  ntent before ove
31da0 72 77 72 69 74 69 6e 67 20 69 74 2e 0a 20 20 20  rwriting it..   
31db0 20 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f 74 65 20   **.    ** Note 
31dc0 74 68 61 74 20 74 68 65 20 70 61 67 65 72 20 77  that the pager w
31dd0 69 6c 6c 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79  ill not actually
31de0 20 61 74 74 65 6d 70 74 20 74 6f 20 6c 6f 61 64   attempt to load
31df0 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 20   or journal .   
31e00 20 2a 2a 20 63 6f 6e 74 65 6e 74 20 66 6f 72 20   ** content for 
31e10 61 6e 79 20 70 61 67 65 20 74 68 61 74 20 72 65  any page that re
31e20 61 6c 6c 79 20 64 6f 65 73 20 6c 69 65 20 70 61  ally does lie pa
31e30 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  st the end of th
31e40 65 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a  e database.    *
31e50 2a 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 20  * file on disk. 
31e60 53 6f 20 74 68 65 20 65 66 66 65 63 74 73 20 6f  So the effects o
31e70 66 20 64 69 73 61 62 6c 69 6e 67 20 74 68 65 20  f disabling the 
31e80 6e 6f 2d 63 6f 6e 74 65 6e 74 20 6f 70 74 69 6d  no-content optim
31e90 69 7a 61 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 68  ization.    ** h
31ea0 65 72 65 20 61 72 65 20 63 6f 6e 66 69 6e 65 64  ere are confined
31eb0 20 74 6f 20 74 68 6f 73 65 20 70 61 67 65 73 20   to those pages 
31ec0 74 68 61 74 20 6c 69 65 20 62 65 74 77 65 65 6e  that lie between
31ed0 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a   the end of the.
31ee0 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
31ef0 69 6d 61 67 65 20 61 6e 64 20 74 68 65 20 65 6e  image and the en
31f00 64 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  d of the databas
31f10 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20  e file..    */. 
31f20 20 20 20 69 6e 74 20 62 4e 6f 43 6f 6e 74 65 6e     int bNoConten
31f30 74 20 3d 20 28 30 3d 3d 49 66 4e 6f 74 4f 6d 69  t = (0==IfNotOmi
31f40 74 41 56 28 70 42 74 2d 3e 62 44 6f 54 72 75 6e  tAV(pBt->bDoTrun
31f50 63 61 74 65 29 29 3f 20 50 41 47 45 52 5f 47 45  cate))? PAGER_GE
31f60 54 5f 4e 4f 43 4f 4e 54 45 4e 54 3a 30 3b 0a 0a  T_NOCONTENT:0;..
31f70 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
31f80 50 61 67 65 72 57 72 69 74 65 28 70 42 74 2d 3e  PagerWrite(pBt->
31f90 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29  pPage1->pDbPage)
31fa0 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  ;.    if( rc ) r
31fb0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 42  eturn rc;.    pB
31fc0 74 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 20 20 20 20  t->nPage++;.    
31fd0 69 66 28 20 70 42 74 2d 3e 6e 50 61 67 65 3d 3d  if( pBt->nPage==
31fe0 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
31ff0 45 28 70 42 74 29 20 29 20 70 42 74 2d 3e 6e 50  E(pBt) ) pBt->nP
32000 61 67 65 2b 2b 3b 0a 0a 23 69 66 6e 64 65 66 20  age++;..#ifndef 
32010 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
32020 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70  VACUUM.    if( p
32030 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 26  Bt->autoVacuum &
32040 26 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28  & PTRMAP_ISPAGE(
32050 70 42 74 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29  pBt, pBt->nPage)
32060 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   ){.      /* If 
32070 2a 70 50 67 6e 6f 20 72 65 66 65 72 73 20 74 6f  *pPgno refers to
32080 20 61 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70   a pointer-map p
32090 61 67 65 2c 20 61 6c 6c 6f 63 61 74 65 20 74 77  age, allocate tw
320a0 6f 20 6e 65 77 20 70 61 67 65 73 0a 20 20 20 20  o new pages.    
320b0 20 20 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20    ** at the end 
320c0 6f 66 20 74 68 65 20 66 69 6c 65 20 69 6e 73 74  of the file inst
320d0 65 61 64 20 6f 66 20 6f 6e 65 2e 20 54 68 65 20  ead of one. The 
320e0 66 69 72 73 74 20 61 6c 6c 6f 63 61 74 65 64 20  first allocated 
320f0 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 62 65  page.      ** be
32100 63 6f 6d 65 73 20 61 20 6e 65 77 20 70 6f 69 6e  comes a new poin
32110 74 65 72 2d 6d 61 70 20 70 61 67 65 2c 20 74 68  ter-map page, th
32120 65 20 73 65 63 6f 6e 64 20 69 73 20 75 73 65 64  e second is used
32130 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a   by the caller..
32140 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 4d        */.      M
32150 65 6d 50 61 67 65 20 2a 70 50 67 20 3d 20 30 3b  emPage *pPg = 0;
32160 0a 20 20 20 20 20 20 54 52 41 43 45 28 28 22 41  .      TRACE(("A
32170 4c 4c 4f 43 41 54 45 3a 20 25 64 20 66 72 6f 6d  LLOCATE: %d from
32180 20 65 6e 64 20 6f 66 20 66 69 6c 65 20 28 70 6f   end of file (po
32190 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 29 5c  inter-map page)\
321a0 6e 22 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 29  n", pBt->nPage))
321b0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
321c0 70 42 74 2d 3e 6e 50 61 67 65 21 3d 50 45 4e 44  pBt->nPage!=PEND
321d0 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
321e0 74 29 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  t) );.      rc =
321f0 20 62 74 72 65 65 47 65 74 55 6e 75 73 65 64 50   btreeGetUnusedP
32200 61 67 65 28 70 42 74 2c 20 70 42 74 2d 3e 6e 50  age(pBt, pBt->nP
32210 61 67 65 2c 20 26 70 50 67 2c 20 62 4e 6f 43 6f  age, &pPg, bNoCo
32220 6e 74 65 6e 74 29 3b 0a 20 20 20 20 20 20 69 66  ntent);.      if
32230 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
32240 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
32250 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
32260 65 28 70 50 67 2d 3e 70 44 62 50 61 67 65 29 3b  e(pPg->pDbPage);
32270 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65  .        release
32280 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20 20  Page(pPg);.     
32290 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 20   }.      if( rc 
322a0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
322b0 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b     pBt->nPage++;
322c0 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e  .      if( pBt->
322d0 6e 50 61 67 65 3d 3d 50 45 4e 44 49 4e 47 5f 42  nPage==PENDING_B
322e0 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b  YTE_PAGE(pBt) ){
322f0 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 20 7d   pBt->nPage++; }
32300 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
32310 20 20 70 75 74 34 62 79 74 65 28 32 38 20 2b 20    put4byte(28 + 
32320 28 75 38 2a 29 70 42 74 2d 3e 70 50 61 67 65 31  (u8*)pBt->pPage1
32330 2d 3e 61 44 61 74 61 2c 20 70 42 74 2d 3e 6e 50  ->aData, pBt->nP
32340 61 67 65 29 3b 0a 20 20 20 20 2a 70 50 67 6e 6f  age);.    *pPgno
32350 20 3d 20 70 42 74 2d 3e 6e 50 61 67 65 3b 0a 0a   = pBt->nPage;..
32360 20 20 20 20 61 73 73 65 72 74 28 20 2a 70 50 67      assert( *pPg
32370 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  no!=PENDING_BYTE
32380 5f 50 41 47 45 28 70 42 74 29 20 29 3b 0a 20 20  _PAGE(pBt) );.  
32390 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 55    rc = btreeGetU
323a0 6e 75 73 65 64 50 61 67 65 28 70 42 74 2c 20 2a  nusedPage(pBt, *
323b0 70 50 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 62  pPgno, ppPage, b
323c0 4e 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 20 20  NoContent);.    
323d0 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
323e0 72 63 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  rc;.    rc = sql
323f0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 28  ite3PagerWrite((
32400 2a 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61 67  *ppPage)->pDbPag
32410 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  e);.    if( rc!=
32420 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
32430 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a     releasePage(*
32440 70 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 2a  ppPage);.      *
32450 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20  ppPage = 0;.    
32460 7d 0a 20 20 20 20 54 52 41 43 45 28 28 22 41 4c  }.    TRACE(("AL
32470 4c 4f 43 41 54 45 3a 20 25 64 20 66 72 6f 6d 20  LOCATE: %d from 
32480 65 6e 64 20 6f 66 20 66 69 6c 65 5c 6e 22 2c 20  end of file\n", 
32490 2a 70 50 67 6e 6f 29 29 3b 0a 20 20 7d 0a 0a 20  *pPgno));.  }.. 
324a0 20 61 73 73 65 72 74 28 20 2a 70 50 67 6e 6f 21   assert( *pPgno!
324b0 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
324c0 47 45 28 70 42 74 29 20 29 3b 0a 0a 65 6e 64 5f  GE(pBt) );..end_
324d0 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3a 0a 20  allocate_page:. 
324e0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 72   releasePage(pTr
324f0 75 6e 6b 29 3b 0a 20 20 72 65 6c 65 61 73 65 50  unk);.  releaseP
32500 61 67 65 28 70 50 72 65 76 54 72 75 6e 6b 29 3b  age(pPrevTrunk);
32510 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53  .  assert( rc!=S
32520 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 71 6c 69  QLITE_OK || sqli
32530 74 65 33 50 61 67 65 72 50 61 67 65 52 65 66 63  te3PagerPageRefc
32540 6f 75 6e 74 28 28 2a 70 70 50 61 67 65 29 2d 3e  ount((*ppPage)->
32550 70 44 62 50 61 67 65 29 3c 3d 31 20 29 3b 0a 20  pDbPage)<=1 );. 
32560 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
32570 49 54 45 5f 4f 4b 20 7c 7c 20 28 2a 70 70 50 61  ITE_OK || (*ppPa
32580 67 65 29 2d 3e 69 73 49 6e 69 74 3d 3d 30 20 29  ge)->isInit==0 )
32590 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
325a0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
325b0 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f  ction is used to
325c0 20 61 64 64 20 70 61 67 65 20 69 50 61 67 65 20   add page iPage 
325d0 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
325e0 66 69 6c 65 20 66 72 65 65 2d 6c 69 73 74 2e 20  file free-list. 
325f0 0a 2a 2a 20 49 74 20 69 73 20 61 73 73 75 6d 65  .** It is assume
32600 64 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  d that the page 
32610 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 61  is not already a
32620 20 70 61 72 74 20 6f 66 20 74 68 65 20 66 72 65   part of the fre
32630 65 2d 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  e-list..**.** Th
32640 65 20 76 61 6c 75 65 20 70 61 73 73 65 64 20 61  e value passed a
32650 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  s the second arg
32660 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75  ument to this fu
32670 6e 63 74 69 6f 6e 20 69 73 20 6f 70 74 69 6f 6e  nction is option
32680 61 6c 2e 0a 2a 2a 20 49 66 20 74 68 65 20 63 61  al..** If the ca
32690 6c 6c 65 72 20 68 61 70 70 65 6e 73 20 74 6f 20  ller happens to 
326a0 68 61 76 65 20 61 20 70 6f 69 6e 74 65 72 20 74  have a pointer t
326b0 6f 20 74 68 65 20 4d 65 6d 50 61 67 65 20 6f 62  o the MemPage ob
326c0 6a 65 63 74 20 0a 2a 2a 20 63 6f 72 72 65 73 70  ject .** corresp
326d0 6f 6e 64 69 6e 67 20 74 6f 20 70 61 67 65 20 69  onding to page i
326e0 50 61 67 65 20 68 61 6e 64 79 2c 20 69 74 20 6d  Page handy, it m
326f0 61 79 20 70 61 73 73 20 69 74 20 61 73 20 74 68  ay pass it as th
32700 65 20 73 65 63 6f 6e 64 20 76 61 6c 75 65 2e 20  e second value. 
32710 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69  .** Otherwise, i
32720 74 20 6d 61 79 20 70 61 73 73 20 4e 55 4c 4c 2e  t may pass NULL.
32730 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 70 6f 69 6e  .**.** If a poin
32740 74 65 72 20 74 6f 20 61 20 4d 65 6d 50 61 67 65  ter to a MemPage
32750 20 6f 62 6a 65 63 74 20 69 73 20 70 61 73 73 65   object is passe
32760 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  d as the second 
32770 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20 69 74 73  argument,.** its
32780 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
32790 20 69 73 20 6e 6f 74 20 61 6c 74 65 72 65 64 20   is not altered 
327a0 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
327b0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
327c0 66 72 65 65 50 61 67 65 32 28 42 74 53 68 61 72  freePage2(BtShar
327d0 65 64 20 2a 70 42 74 2c 20 4d 65 6d 50 61 67 65  ed *pBt, MemPage
327e0 20 2a 70 4d 65 6d 50 61 67 65 2c 20 50 67 6e 6f   *pMemPage, Pgno
327f0 20 69 50 61 67 65 29 7b 0a 20 20 4d 65 6d 50 61   iPage){.  MemPa
32800 67 65 20 2a 70 54 72 75 6e 6b 20 3d 20 30 3b 20  ge *pTrunk = 0; 
32810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
32820 2a 20 46 72 65 65 2d 6c 69 73 74 20 74 72 75 6e  * Free-list trun
32830 6b 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f  k page */.  Pgno
32840 20 69 54 72 75 6e 6b 20 3d 20 30 3b 20 20 20 20   iTrunk = 0;    
32850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32860 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 6f  /* Page number o
32870 66 20 66 72 65 65 2d 6c 69 73 74 20 74 72 75 6e  f free-list trun
32880 6b 20 70 61 67 65 20 2a 2f 20 0a 20 20 4d 65 6d  k page */ .  Mem
32890 50 61 67 65 20 2a 70 50 61 67 65 31 20 3d 20 70  Page *pPage1 = p
328a0 42 74 2d 3e 70 50 61 67 65 31 3b 20 20 20 20 20  Bt->pPage1;     
328b0 20 2f 2a 20 4c 6f 63 61 6c 20 72 65 66 65 72 65   /* Local refere
328c0 6e 63 65 20 74 6f 20 70 61 67 65 20 31 20 2a 2f  nce to page 1 */
328d0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
328e0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
328f0 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 62         /* Page b
32900 65 69 6e 67 20 66 72 65 65 64 2e 20 4d 61 79 20  eing freed. May 
32910 62 65 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69 6e  be NULL. */.  in
32920 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
32930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32940 20 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 65    /* Return Code
32950 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 72 65 65 3b   */.  int nFree;
32960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32970 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 69            /* Ini
32980 74 69 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70  tial number of p
32990 61 67 65 73 20 6f 6e 20 66 72 65 65 2d 6c 69 73  ages on free-lis
329a0 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  t */..  assert( 
329b0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
329c0 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
329d0 3b 0a 20 20 61 73 73 65 72 74 28 20 43 4f 52 52  ;.  assert( CORR
329e0 55 50 54 5f 44 42 20 7c 7c 20 69 50 61 67 65 3e  UPT_DB || iPage>
329f0 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21  1 );.  assert( !
32a00 70 4d 65 6d 50 61 67 65 20 7c 7c 20 70 4d 65 6d  pMemPage || pMem
32a10 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 69 50 61 67  Page->pgno==iPag
32a20 65 20 29 3b 0a 0a 20 20 69 66 28 20 69 50 61 67  e );..  if( iPag
32a30 65 3c 32 20 29 20 72 65 74 75 72 6e 20 53 51 4c  e<2 ) return SQL
32a40 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
32a50 3b 0a 20 20 69 66 28 20 70 4d 65 6d 50 61 67 65  ;.  if( pMemPage
32a60 20 29 7b 0a 20 20 20 20 70 50 61 67 65 20 3d 20   ){.    pPage = 
32a70 70 4d 65 6d 50 61 67 65 3b 0a 20 20 20 20 73 71  pMemPage;.    sq
32a80 6c 69 74 65 33 50 61 67 65 72 52 65 66 28 70 50  lite3PagerRef(pP
32a90 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  age->pDbPage);. 
32aa0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67   }else{.    pPag
32ab0 65 20 3d 20 62 74 72 65 65 50 61 67 65 4c 6f 6f  e = btreePageLoo
32ac0 6b 75 70 28 70 42 74 2c 20 69 50 61 67 65 29 3b  kup(pBt, iPage);
32ad0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 63 72 65  .  }..  /* Incre
32ae0 6d 65 6e 74 20 74 68 65 20 66 72 65 65 20 70 61  ment the free pa
32af0 67 65 20 63 6f 75 6e 74 20 6f 6e 20 70 50 61 67  ge count on pPag
32b00 65 31 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c  e1 */.  rc = sql
32b10 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
32b20 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b  Page1->pDbPage);
32b30 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f  .  if( rc ) goto
32b40 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20   freepage_out;. 
32b50 20 6e 46 72 65 65 20 3d 20 67 65 74 34 62 79 74   nFree = get4byt
32b60 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  e(&pPage1->aData
32b70 5b 33 36 5d 29 3b 0a 20 20 70 75 74 34 62 79 74  [36]);.  put4byt
32b80 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  e(&pPage1->aData
32b90 5b 33 36 5d 2c 20 6e 46 72 65 65 2b 31 29 3b 0a  [36], nFree+1);.
32ba0 0a 20 20 69 66 28 20 70 42 74 2d 3e 62 74 73 46  .  if( pBt->btsF
32bb0 6c 61 67 73 20 26 20 42 54 53 5f 53 45 43 55 52  lags & BTS_SECUR
32bc0 45 5f 44 45 4c 45 54 45 20 29 7b 0a 20 20 20 20  E_DELETE ){.    
32bd0 2f 2a 20 49 66 20 74 68 65 20 73 65 63 75 72 65  /* If the secure
32be0 5f 64 65 6c 65 74 65 20 6f 70 74 69 6f 6e 20 69  _delete option i
32bf0 73 20 65 6e 61 62 6c 65 64 2c 20 74 68 65 6e 0a  s enabled, then.
32c00 20 20 20 20 2a 2a 20 61 6c 77 61 79 73 20 66 75      ** always fu
32c10 6c 6c 79 20 6f 76 65 72 77 72 69 74 65 20 64 65  lly overwrite de
32c20 6c 65 74 65 64 20 69 6e 66 6f 72 6d 61 74 69 6f  leted informatio
32c30 6e 20 77 69 74 68 20 7a 65 72 6f 73 2e 0a 20 20  n with zeros..  
32c40 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 21 70    */.    if( (!p
32c50 50 61 67 65 20 26 26 20 28 28 72 63 20 3d 20 62  Page && ((rc = b
32c60 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
32c70 20 69 50 61 67 65 2c 20 26 70 50 61 67 65 2c 20   iPage, &pPage, 
32c80 30 29 29 21 3d 30 29 20 29 0a 20 20 20 20 20 7c  0))!=0) ).     |
32c90 7c 20 20 20 20 20 20 20 20 20 20 20 20 28 28 72  |            ((r
32ca0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
32cb0 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62  Write(pPage->pDb
32cc0 50 61 67 65 29 29 21 3d 30 29 0a 20 20 20 20 29  Page))!=0).    )
32cd0 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 72 65  {.      goto fre
32ce0 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d  epage_out;.    }
32cf0 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 50 61 67  .    memset(pPag
32d00 65 2d 3e 61 44 61 74 61 2c 20 30 2c 20 70 50 61  e->aData, 0, pPa
32d10 67 65 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a  ge->pBt->pageSiz
32d20 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  e);.  }..  /* If
32d30 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 75   the database su
32d40 70 70 6f 72 74 73 20 61 75 74 6f 2d 76 61 63 75  pports auto-vacu
32d50 75 6d 2c 20 77 72 69 74 65 20 61 6e 20 65 6e 74  um, write an ent
32d60 72 79 20 69 6e 20 74 68 65 20 70 6f 69 6e 74 65  ry in the pointe
32d70 72 2d 6d 61 70 0a 20 20 2a 2a 20 74 6f 20 69 6e  r-map.  ** to in
32d80 64 69 63 61 74 65 20 74 68 61 74 20 74 68 65 20  dicate that the 
32d90 70 61 67 65 20 69 73 20 66 72 65 65 2e 0a 20 20  page is free..  
32da0 2a 2f 0a 20 20 69 66 28 20 49 53 41 55 54 4f 56  */.  if( ISAUTOV
32db0 41 43 55 55 4d 20 29 7b 0a 20 20 20 20 70 74 72  ACUUM ){.    ptr
32dc0 6d 61 70 50 75 74 28 70 42 74 2c 20 69 50 61 67  mapPut(pBt, iPag
32dd0 65 2c 20 50 54 52 4d 41 50 5f 46 52 45 45 50 41  e, PTRMAP_FREEPA
32de0 47 45 2c 20 30 2c 20 26 72 63 29 3b 0a 20 20 20  GE, 0, &rc);.   
32df0 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 66   if( rc ) goto f
32e00 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d  reepage_out;.  }
32e10 0a 0a 20 20 2f 2a 20 4e 6f 77 20 6d 61 6e 69 70  ..  /* Now manip
32e20 75 6c 61 74 65 20 74 68 65 20 61 63 74 75 61 6c  ulate the actual
32e30 20 64 61 74 61 62 61 73 65 20 66 72 65 65 2d 6c   database free-l
32e40 69 73 74 20 73 74 72 75 63 74 75 72 65 2e 20 54  ist structure. T
32e50 68 65 72 65 20 61 72 65 20 74 77 6f 0a 20 20 2a  here are two.  *
32e60 2a 20 70 6f 73 73 69 62 69 6c 69 74 69 65 73 2e  * possibilities.
32e70 20 49 66 20 74 68 65 20 66 72 65 65 2d 6c 69 73   If the free-lis
32e80 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 65  t is currently e
32e90 6d 70 74 79 2c 20 6f 72 20 69 66 20 74 68 65 20  mpty, or if the 
32ea0 66 69 72 73 74 0a 20 20 2a 2a 20 74 72 75 6e 6b  first.  ** trunk
32eb0 20 70 61 67 65 20 69 6e 20 74 68 65 20 66 72 65   page in the fre
32ec0 65 2d 6c 69 73 74 20 69 73 20 66 75 6c 6c 2c 20  e-list is full, 
32ed0 74 68 65 6e 20 74 68 69 73 20 70 61 67 65 20 77  then this page w
32ee0 69 6c 6c 20 62 65 63 6f 6d 65 20 61 0a 20 20 2a  ill become a.  *
32ef0 2a 20 6e 65 77 20 66 72 65 65 2d 6c 69 73 74 20  * new free-list 
32f00 74 72 75 6e 6b 20 70 61 67 65 2e 20 4f 74 68 65  trunk page. Othe
32f10 72 77 69 73 65 2c 20 69 74 20 77 69 6c 6c 20 62  rwise, it will b
32f20 65 63 6f 6d 65 20 61 20 6c 65 61 66 20 6f 66 20  ecome a leaf of 
32f30 74 68 65 0a 20 20 2a 2a 20 66 69 72 73 74 20 74  the.  ** first t
32f40 72 75 6e 6b 20 70 61 67 65 20 69 6e 20 74 68 65  runk page in the
32f50 20 63 75 72 72 65 6e 74 20 66 72 65 65 2d 6c 69   current free-li
32f60 73 74 2e 20 54 68 69 73 20 62 6c 6f 63 6b 20 74  st. This block t
32f70 65 73 74 73 20 69 66 20 69 74 0a 20 20 2a 2a 20  ests if it.  ** 
32f80 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 61  is possible to a
32f90 64 64 20 74 68 65 20 70 61 67 65 20 61 73 20 61  dd the page as a
32fa0 20 6e 65 77 20 66 72 65 65 2d 6c 69 73 74 20 6c   new free-list l
32fb0 65 61 66 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  eaf..  */.  if( 
32fc0 6e 46 72 65 65 21 3d 30 20 29 7b 0a 20 20 20 20  nFree!=0 ){.    
32fd0 75 33 32 20 6e 4c 65 61 66 3b 20 20 20 20 20 20  u32 nLeaf;      
32fe0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 69            /* Ini
32ff0 74 69 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 6c  tial number of l
33000 65 61 66 20 63 65 6c 6c 73 20 6f 6e 20 74 72 75  eaf cells on tru
33010 6e 6b 20 70 61 67 65 20 2a 2f 0a 0a 20 20 20 20  nk page */..    
33020 69 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74  iTrunk = get4byt
33030 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  e(&pPage1->aData
33040 5b 33 32 5d 29 3b 0a 20 20 20 20 72 63 20 3d 20  [32]);.    rc = 
33050 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  btreeGetPage(pBt
33060 2c 20 69 54 72 75 6e 6b 2c 20 26 70 54 72 75 6e  , iTrunk, &pTrun
33070 6b 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  k, 0);.    if( r
33080 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
33090 20 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70        goto freep
330a0 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 0a  age_out;.    }..
330b0 20 20 20 20 6e 4c 65 61 66 20 3d 20 67 65 74 34      nLeaf = get4
330c0 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44  byte(&pTrunk->aD
330d0 61 74 61 5b 34 5d 29 3b 0a 20 20 20 20 61 73 73  ata[4]);.    ass
330e0 65 72 74 28 20 70 42 74 2d 3e 75 73 61 62 6c 65  ert( pBt->usable
330f0 53 69 7a 65 3e 33 32 20 29 3b 0a 20 20 20 20 69  Size>32 );.    i
33100 66 28 20 6e 4c 65 61 66 20 3e 20 28 75 33 32 29  f( nLeaf > (u32)
33110 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f  pBt->usableSize/
33120 34 20 2d 20 32 20 29 7b 0a 20 20 20 20 20 20 72  4 - 2 ){.      r
33130 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
33140 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67  PT_BKPT;.      g
33150 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74  oto freepage_out
33160 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
33170 6e 4c 65 61 66 20 3c 20 28 75 33 32 29 70 42 74  nLeaf < (u32)pBt
33180 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d  ->usableSize/4 -
33190 20 38 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49   8 ){.      /* I
331a0 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65 72  n this case ther
331b0 65 20 69 73 20 72 6f 6f 6d 20 6f 6e 20 74 68 65  e is room on the
331c0 20 74 72 75 6e 6b 20 70 61 67 65 20 74 6f 20 69   trunk page to i
331d0 6e 73 65 72 74 20 74 68 65 20 70 61 67 65 0a 20  nsert the page. 
331e0 20 20 20 20 20 2a 2a 20 62 65 69 6e 67 20 66 72       ** being fr
331f0 65 65 64 20 61 73 20 61 20 6e 65 77 20 6c 65 61  eed as a new lea
33200 66 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  f..      **.    
33210 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74    ** Note that t
33220 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20 69 73  he trunk page is
33230 20 6e 6f 74 20 72 65 61 6c 6c 79 20 66 75 6c 6c   not really full
33240 20 75 6e 74 69 6c 20 69 74 20 63 6f 6e 74 61 69   until it contai
33250 6e 73 0a 20 20 20 20 20 20 2a 2a 20 75 73 61 62  ns.      ** usab
33260 6c 65 53 69 7a 65 2f 34 20 2d 20 32 20 65 6e 74  leSize/4 - 2 ent
33270 72 69 65 73 2c 20 6e 6f 74 20 75 73 61 62 6c 65  ries, not usable
33280 53 69 7a 65 2f 34 20 2d 20 38 20 65 6e 74 72 69  Size/4 - 8 entri
33290 65 73 20 61 73 20 77 65 20 68 61 76 65 0a 20 20  es as we have.  
332a0 20 20 20 20 2a 2a 20 63 6f 64 65 64 2e 20 20 42      ** coded.  B
332b0 75 74 20 64 75 65 20 74 6f 20 61 20 63 6f 64 69  ut due to a codi
332c0 6e 67 20 65 72 72 6f 72 20 69 6e 20 76 65 72 73  ng error in vers
332d0 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 70  ions of SQLite p
332e0 72 69 6f 72 20 74 6f 0a 20 20 20 20 20 20 2a 2a  rior to.      **
332f0 20 33 2e 36 2e 30 2c 20 64 61 74 61 62 61 73 65   3.6.0, database
33300 73 20 77 69 74 68 20 66 72 65 65 6c 69 73 74 20  s with freelist 
33310 74 72 75 6e 6b 20 70 61 67 65 73 20 68 6f 6c 64  trunk pages hold
33320 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 0a 20 20  ing more than.  
33330 20 20 20 20 2a 2a 20 75 73 61 62 6c 65 53 69 7a      ** usableSiz
33340 65 2f 34 20 2d 20 38 20 65 6e 74 72 69 65 73 20  e/4 - 8 entries 
33350 77 69 6c 6c 20 62 65 20 72 65 70 6f 72 74 65 64  will be reported
33360 20 61 73 20 63 6f 72 72 75 70 74 2e 20 20 49 6e   as corrupt.  In
33370 20 6f 72 64 65 72 0a 20 20 20 20 20 20 2a 2a 20   order.      ** 
33380 74 6f 20 6d 61 69 6e 74 61 69 6e 20 62 61 63 6b  to maintain back
33390 77 61 72 64 73 20 63 6f 6d 70 61 74 69 62 69 6c  wards compatibil
333a0 69 74 79 20 77 69 74 68 20 6f 6c 64 65 72 20 76  ity with older v
333b0 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74  ersions of SQLit
333c0 65 2c 0a 20 20 20 20 20 20 2a 2a 20 77 65 20 77  e,.      ** we w
333d0 69 6c 6c 20 63 6f 6e 74 69 6e 75 65 20 74 6f 20  ill continue to 
333e0 72 65 73 74 72 69 63 74 20 74 68 65 20 6e 75 6d  restrict the num
333f0 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 74  ber of entries t
33400 6f 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d  o usableSize/4 -
33410 20 38 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20   8.      ** for 
33420 6e 6f 77 2e 20 20 41 74 20 73 6f 6d 65 20 70 6f  now.  At some po
33430 69 6e 74 20 69 6e 20 74 68 65 20 66 75 74 75 72  int in the futur
33440 65 20 28 6f 6e 63 65 20 65 76 65 72 79 6f 6e 65  e (once everyone
33450 20 68 61 73 20 75 70 67 72 61 64 65 64 0a 20 20   has upgraded.  
33460 20 20 20 20 2a 2a 20 74 6f 20 33 2e 36 2e 30 20      ** to 3.6.0 
33470 6f 72 20 6c 61 74 65 72 29 20 77 65 20 73 68 6f  or later) we sho
33480 75 6c 64 20 63 6f 6e 73 69 64 65 72 20 66 69 78  uld consider fix
33490 69 6e 67 20 74 68 65 20 63 6f 6e 64 69 74 69 6f  ing the conditio
334a0 6e 61 6c 20 61 62 6f 76 65 0a 20 20 20 20 20 20  nal above.      
334b0 2a 2a 20 74 6f 20 72 65 61 64 20 22 75 73 61 62  ** to read "usab
334c0 6c 65 53 69 7a 65 2f 34 2d 32 22 20 69 6e 73 74  leSize/4-2" inst
334d0 65 61 64 20 6f 66 20 22 75 73 61 62 6c 65 53 69  ead of "usableSi
334e0 7a 65 2f 34 2d 38 22 2e 0a 20 20 20 20 20 20 2a  ze/4-8"..      *
334f0 2a 0a 20 20 20 20 20 20 2a 2a 20 45 56 49 44 45  *.      ** EVIDE
33500 4e 43 45 2d 4f 46 3a 20 52 2d 31 39 39 32 30 2d  NCE-OF: R-19920-
33510 31 31 35 37 36 20 48 6f 77 65 76 65 72 2c 20 6e  11576 However, n
33520 65 77 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66  ewer versions of
33530 20 53 51 4c 69 74 65 20 73 74 69 6c 6c 0a 20 20   SQLite still.  
33540 20 20 20 20 2a 2a 20 61 76 6f 69 64 20 75 73 69      ** avoid usi
33550 6e 67 20 74 68 65 20 6c 61 73 74 20 73 69 78 20  ng the last six 
33560 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 66  entries in the f
33570 72 65 65 6c 69 73 74 20 74 72 75 6e 6b 20 70 61  reelist trunk pa
33580 67 65 20 61 72 72 61 79 20 69 6e 0a 20 20 20 20  ge array in.    
33590 20 20 2a 2a 20 6f 72 64 65 72 20 74 68 61 74 20    ** order that 
335a0 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 20 63  database files c
335b0 72 65 61 74 65 64 20 62 79 20 6e 65 77 65 72 20  reated by newer 
335c0 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69  versions of SQLi
335d0 74 65 20 63 61 6e 20 62 65 0a 20 20 20 20 20 20  te can be.      
335e0 2a 2a 20 72 65 61 64 20 62 79 20 6f 6c 64 65 72  ** read by older
335f0 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c   versions of SQL
33600 69 74 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ite..      */.  
33610 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
33620 50 61 67 65 72 57 72 69 74 65 28 70 54 72 75 6e  PagerWrite(pTrun
33630 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  k->pDbPage);.   
33640 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
33650 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
33660 70 75 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b  put4byte(&pTrunk
33670 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 6e 4c 65 61  ->aData[4], nLea
33680 66 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 70 75  f+1);.        pu
33690 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e  t4byte(&pTrunk->
336a0 61 44 61 74 61 5b 38 2b 6e 4c 65 61 66 2a 34 5d  aData[8+nLeaf*4]
336b0 2c 20 69 50 61 67 65 29 3b 0a 20 20 20 20 20 20  , iPage);.      
336c0 20 20 69 66 28 20 70 50 61 67 65 20 26 26 20 28    if( pPage && (
336d0 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20  pBt->btsFlags & 
336e0 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54  BTS_SECURE_DELET
336f0 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  E)==0 ){.       
33700 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 44     sqlite3PagerD
33710 6f 6e 74 57 72 69 74 65 28 70 50 61 67 65 2d 3e  ontWrite(pPage->
33720 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
33730 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20 3d    }.        rc =
33740 20 62 74 72 65 65 53 65 74 48 61 73 43 6f 6e 74   btreeSetHasCont
33750 65 6e 74 28 70 42 74 2c 20 69 50 61 67 65 29 3b  ent(pBt, iPage);
33760 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 54  .      }.      T
33770 52 41 43 45 28 28 22 46 52 45 45 2d 50 41 47 45  RACE(("FREE-PAGE
33780 3a 20 25 64 20 6c 65 61 66 20 6f 6e 20 74 72 75  : %d leaf on tru
33790 6e 6b 20 70 61 67 65 20 25 64 5c 6e 22 2c 70 50  nk page %d\n",pP
337a0 61 67 65 2d 3e 70 67 6e 6f 2c 70 54 72 75 6e 6b  age->pgno,pTrunk
337b0 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20  ->pgno));.      
337c0 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75  goto freepage_ou
337d0 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  t;.    }.  }..  
337e0 2f 2a 20 49 66 20 63 6f 6e 74 72 6f 6c 20 66 6c  /* If control fl
337f0 6f 77 73 20 74 6f 20 74 68 69 73 20 70 6f 69 6e  ows to this poin
33800 74 2c 20 74 68 65 6e 20 69 74 20 77 61 73 20 6e  t, then it was n
33810 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 61  ot possible to a
33820 64 64 20 74 68 65 0a 20 20 2a 2a 20 74 68 65 20  dd the.  ** the 
33830 70 61 67 65 20 62 65 69 6e 67 20 66 72 65 65 64  page being freed
33840 20 61 73 20 61 20 6c 65 61 66 20 70 61 67 65 20   as a leaf page 
33850 6f 66 20 74 68 65 20 66 69 72 73 74 20 74 72 75  of the first tru
33860 6e 6b 20 69 6e 20 74 68 65 20 66 72 65 65 2d 6c  nk in the free-l
33870 69 73 74 2e 0a 20 20 2a 2a 20 50 6f 73 73 69 62  ist..  ** Possib
33880 6c 79 20 62 65 63 61 75 73 65 20 74 68 65 20 66  ly because the f
33890 72 65 65 2d 6c 69 73 74 20 69 73 20 65 6d 70 74  ree-list is empt
338a0 79 2c 20 6f 72 20 70 6f 73 73 69 62 6c 79 20 62  y, or possibly b
338b0 65 63 61 75 73 65 20 74 68 65 20 0a 20 20 2a 2a  ecause the .  **
338c0 20 66 69 72 73 74 20 74 72 75 6e 6b 20 69 6e 20   first trunk in 
338d0 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 69 73  the free-list is
338e0 20 66 75 6c 6c 2e 20 45 69 74 68 65 72 20 77 61   full. Either wa
338f0 79 2c 20 74 68 65 20 70 61 67 65 20 62 65 69 6e  y, the page bein
33900 67 20 66 72 65 65 64 0a 20 20 2a 2a 20 77 69 6c  g freed.  ** wil
33910 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 6e 65 77  l become the new
33920 20 66 69 72 73 74 20 74 72 75 6e 6b 20 70 61 67   first trunk pag
33930 65 20 69 6e 20 74 68 65 20 66 72 65 65 2d 6c 69  e in the free-li
33940 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  st..  */.  if( p
33950 50 61 67 65 3d 3d 30 20 26 26 20 53 51 4c 49 54  Page==0 && SQLIT
33960 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 62 74 72 65  E_OK!=(rc = btre
33970 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 50  eGetPage(pBt, iP
33980 61 67 65 2c 20 26 70 50 61 67 65 2c 20 30 29 29  age, &pPage, 0))
33990 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 66 72 65   ){.    goto fre
339a0 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20  epage_out;.  }. 
339b0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
339c0 65 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70  erWrite(pPage->p
339d0 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72  DbPage);.  if( r
339e0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
339f0 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67      goto freepag
33a00 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 70 75 74  e_out;.  }.  put
33a10 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61  4byte(pPage->aDa
33a20 74 61 2c 20 69 54 72 75 6e 6b 29 3b 0a 20 20 70  ta, iTrunk);.  p
33a30 75 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e  ut4byte(&pPage->
33a40 61 44 61 74 61 5b 34 5d 2c 20 30 29 3b 0a 20 20  aData[4], 0);.  
33a50 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31  put4byte(&pPage1
33a60 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 69 50 61  ->aData[32], iPa
33a70 67 65 29 3b 0a 20 20 54 52 41 43 45 28 28 22 46  ge);.  TRACE(("F
33a80 52 45 45 2d 50 41 47 45 3a 20 25 64 20 6e 65 77  REE-PAGE: %d new
33a90 20 74 72 75 6e 6b 20 70 61 67 65 20 72 65 70 6c   trunk page repl
33aa0 61 63 69 6e 67 20 25 64 5c 6e 22 2c 20 70 50 61  acing %d\n", pPa
33ab0 67 65 2d 3e 70 67 6e 6f 2c 20 69 54 72 75 6e 6b  ge->pgno, iTrunk
33ac0 29 29 3b 0a 0a 66 72 65 65 70 61 67 65 5f 6f 75  ));..freepage_ou
33ad0 74 3a 0a 20 20 69 66 28 20 70 50 61 67 65 20 29  t:.  if( pPage )
33ae0 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49  {.    pPage->isI
33af0 6e 69 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  nit = 0;.  }.  r
33b00 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65  eleasePage(pPage
33b10 29 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65  );.  releasePage
33b20 28 70 54 72 75 6e 6b 29 3b 0a 20 20 72 65 74 75  (pTrunk);.  retu
33b30 72 6e 20 72 63 3b 0a 7d 0a 73 74 61 74 69 63 20  rn rc;.}.static 
33b40 76 6f 69 64 20 66 72 65 65 50 61 67 65 28 4d 65  void freePage(Me
33b50 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e  mPage *pPage, in
33b60 74 20 2a 70 52 43 29 7b 0a 20 20 69 66 28 20 28  t *pRC){.  if( (
33b70 2a 70 52 43 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b  *pRC)==SQLITE_OK
33b80 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 66   ){.    *pRC = f
33b90 72 65 65 50 61 67 65 32 28 70 50 61 67 65 2d 3e  reePage2(pPage->
33ba0 70 42 74 2c 20 70 50 61 67 65 2c 20 70 50 61 67  pBt, pPage, pPag
33bb0 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a 7d 0a  e->pgno);.  }.}.
33bc0 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6e 79 20  ./*.** Free any 
33bd0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61  overflow pages a
33be0 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
33bf0 68 65 20 67 69 76 65 6e 20 43 65 6c 6c 2e 20 20  he given Cell.  
33c00 57 72 69 74 65 20 74 68 65 0a 2a 2a 20 6c 6f 63  Write the.** loc
33c10 61 6c 20 43 65 6c 6c 20 73 69 7a 65 20 28 74 68  al Cell size (th
33c20 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
33c30 73 20 6f 6e 20 74 68 65 20 6f 72 69 67 69 6e 61  s on the origina
33c40 6c 20 70 61 67 65 2c 20 6f 6d 69 74 74 69 6e 67  l page, omitting
33c50 0a 2a 2a 20 6f 76 65 72 66 6c 6f 77 29 20 69 6e  .** overflow) in
33c60 74 6f 20 2a 70 6e 53 69 7a 65 2e 0a 2a 2f 0a 73  to *pnSize..*/.s
33c70 74 61 74 69 63 20 69 6e 74 20 63 6c 65 61 72 43  tatic int clearC
33c80 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a  ell(.  MemPage *
33c90 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20  pPage,          
33ca0 2f 2a 20 54 68 65 20 70 61 67 65 20 74 68 61 74  /* The page that
33cb0 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 43 65   contains the Ce
33cc0 6c 6c 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  ll */.  unsigned
33cd0 20 63 68 61 72 20 2a 70 43 65 6c 6c 2c 20 20 20   char *pCell,   
33ce0 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f   /* First byte o
33cf0 66 20 74 68 65 20 43 65 6c 6c 20 2a 2f 0a 20 20  f the Cell */.  
33d00 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20  CellInfo *pInfo 
33d10 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
33d20 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f   information abo
33d30 75 74 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 29  ut the cell */.)
33d40 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
33d50 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a  t = pPage->pBt;.
33d60 20 20 50 67 6e 6f 20 6f 76 66 6c 50 67 6e 6f 3b    Pgno ovflPgno;
33d70 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74  .  int rc;.  int
33d80 20 6e 4f 76 66 6c 3b 0a 20 20 75 33 32 20 6f 76   nOvfl;.  u32 ov
33d90 66 6c 50 61 67 65 53 69 7a 65 3b 0a 0a 20 20 61  flPageSize;..  a
33da0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
33db0 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
33dc0 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
33dd0 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43    pPage->xParseC
33de0 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  ell(pPage, pCell
33df0 2c 20 70 49 6e 66 6f 29 3b 0a 20 20 69 66 28 20  , pInfo);.  if( 
33e00 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 3d 3d 70  pInfo->nLocal==p
33e10 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20 29  Info->nPayload )
33e20 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
33e30 49 54 45 5f 4f 4b 3b 20 20 2f 2a 20 4e 6f 20 6f  ITE_OK;  /* No o
33e40 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 52  verflow pages. R
33e50 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20 64 6f  eturn without do
33e60 69 6e 67 20 61 6e 79 74 68 69 6e 67 20 2a 2f 0a  ing anything */.
33e70 20 20 7d 0a 20 20 69 66 28 20 70 43 65 6c 6c 2b    }.  if( pCell+
33e80 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 2d 31 20 3e  pInfo->nSize-1 >
33e90 20 70 50 61 67 65 2d 3e 61 44 61 74 61 2b 70 50   pPage->aData+pP
33ea0 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65 20 29 7b  age->maskPage ){
33eb0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
33ec0 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
33ed0 20 20 2f 2a 20 43 65 6c 6c 20 65 78 74 65 6e 64    /* Cell extend
33ee0 73 20 70 61 73 74 20 65 6e 64 20 6f 66 20 70 61  s past end of pa
33ef0 67 65 20 2a 2f 0a 20 20 7d 0a 20 20 6f 76 66 6c  ge */.  }.  ovfl
33f00 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28  Pgno = get4byte(
33f10 70 43 65 6c 6c 20 2b 20 70 49 6e 66 6f 2d 3e 6e  pCell + pInfo->n
33f20 53 69 7a 65 20 2d 20 34 29 3b 0a 20 20 61 73 73  Size - 4);.  ass
33f30 65 72 74 28 20 70 42 74 2d 3e 75 73 61 62 6c 65  ert( pBt->usable
33f40 53 69 7a 65 20 3e 20 34 20 29 3b 0a 20 20 6f 76  Size > 4 );.  ov
33f50 66 6c 50 61 67 65 53 69 7a 65 20 3d 20 70 42 74  flPageSize = pBt
33f60 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34  ->usableSize - 4
33f70 3b 0a 20 20 6e 4f 76 66 6c 20 3d 20 28 70 49 6e  ;.  nOvfl = (pIn
33f80 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20 2d 20 70  fo->nPayload - p
33f90 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 2b 20 6f  Info->nLocal + o
33fa0 76 66 6c 50 61 67 65 53 69 7a 65 20 2d 20 31 29  vflPageSize - 1)
33fb0 2f 6f 76 66 6c 50 61 67 65 53 69 7a 65 3b 0a 20  /ovflPageSize;. 
33fc0 20 61 73 73 65 72 74 28 20 6e 4f 76 66 6c 3e 30   assert( nOvfl>0
33fd0 20 7c 7c 20 0a 20 20 20 20 28 43 4f 52 52 55 50   || .    (CORRUP
33fe0 54 5f 44 42 20 26 26 20 28 70 49 6e 66 6f 2d 3e  T_DB && (pInfo->
33ff0 6e 50 61 79 6c 6f 61 64 20 2b 20 6f 76 66 6c 50  nPayload + ovflP
34000 61 67 65 53 69 7a 65 29 3c 6f 76 66 6c 50 61 67  ageSize)<ovflPag
34010 65 53 69 7a 65 29 0a 20 20 29 3b 0a 20 20 77 68  eSize).  );.  wh
34020 69 6c 65 28 20 6e 4f 76 66 6c 2d 2d 20 29 7b 0a  ile( nOvfl-- ){.
34030 20 20 20 20 50 67 6e 6f 20 69 4e 65 78 74 20 3d      Pgno iNext =
34040 20 30 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20   0;.    MemPage 
34050 2a 70 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 20 20  *pOvfl = 0;.    
34060 69 66 28 20 6f 76 66 6c 50 67 6e 6f 3c 32 20 7c  if( ovflPgno<2 |
34070 7c 20 6f 76 66 6c 50 67 6e 6f 3e 62 74 72 65 65  | ovflPgno>btree
34080 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 20 29  Pagecount(pBt) )
34090 7b 0a 20 20 20 20 20 20 2f 2a 20 30 20 69 73 20  {.      /* 0 is 
340a0 6e 6f 74 20 61 20 6c 65 67 61 6c 20 70 61 67 65  not a legal page
340b0 20 6e 75 6d 62 65 72 20 61 6e 64 20 70 61 67 65   number and page
340c0 20 31 20 63 61 6e 6e 6f 74 20 62 65 20 61 6e 20   1 cannot be an 
340d0 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c  .      ** overfl
340e0 6f 77 20 70 61 67 65 2e 20 54 68 65 72 65 66 6f  ow page. Therefo
340f0 72 65 20 69 66 20 6f 76 66 6c 50 67 6e 6f 3c 32  re if ovflPgno<2
34100 20 6f 72 20 70 61 73 74 20 74 68 65 20 65 6e 64   or past the end
34110 20 6f 66 20 74 68 65 20 0a 20 20 20 20 20 20 2a   of the .      *
34120 2a 20 66 69 6c 65 20 74 68 65 20 64 61 74 61 62  * file the datab
34130 61 73 65 20 6d 75 73 74 20 62 65 20 63 6f 72 72  ase must be corr
34140 75 70 74 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65  upt. */.      re
34150 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
34160 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
34170 20 20 20 20 69 66 28 20 6e 4f 76 66 6c 20 29 7b      if( nOvfl ){
34180 0a 20 20 20 20 20 20 72 63 20 3d 20 67 65 74 4f  .      rc = getO
34190 76 65 72 66 6c 6f 77 50 61 67 65 28 70 42 74 2c  verflowPage(pBt,
341a0 20 6f 76 66 6c 50 67 6e 6f 2c 20 26 70 4f 76 66   ovflPgno, &pOvf
341b0 6c 2c 20 26 69 4e 65 78 74 29 3b 0a 20 20 20 20  l, &iNext);.    
341c0 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
341d0 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  n rc;.    }..   
341e0 20 69 66 28 20 28 20 70 4f 76 66 6c 20 7c 7c 20   if( ( pOvfl || 
341f0 28 28 70 4f 76 66 6c 20 3d 20 62 74 72 65 65 50  ((pOvfl = btreeP
34200 61 67 65 4c 6f 6f 6b 75 70 28 70 42 74 2c 20 6f  ageLookup(pBt, o
34210 76 66 6c 50 67 6e 6f 29 29 21 3d 30 29 20 29 0a  vflPgno))!=0) ).
34220 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 50       && sqlite3P
34230 61 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74  agerPageRefcount
34240 28 70 4f 76 66 6c 2d 3e 70 44 62 50 61 67 65 29  (pOvfl->pDbPage)
34250 21 3d 31 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  !=1.    ){.     
34260 20 2f 2a 20 54 68 65 72 65 20 69 73 20 6e 6f 20   /* There is no 
34270 72 65 61 73 6f 6e 20 61 6e 79 20 63 75 72 73 6f  reason any curso
34280 72 20 73 68 6f 75 6c 64 20 68 61 76 65 20 61 6e  r should have an
34290 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66   outstanding ref
342a0 65 72 65 6e 63 65 20 0a 20 20 20 20 20 20 2a 2a  erence .      **
342b0 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20   to an overflow 
342c0 70 61 67 65 20 62 65 6c 6f 6e 67 69 6e 67 20 74  page belonging t
342d0 6f 20 61 20 63 65 6c 6c 20 74 68 61 74 20 69 73  o a cell that is
342e0 20 62 65 69 6e 67 20 64 65 6c 65 74 65 64 2f 75   being deleted/u
342f0 70 64 61 74 65 64 2e 0a 20 20 20 20 20 20 2a 2a  pdated..      **
34300 20 53 6f 20 69 66 20 74 68 65 72 65 20 65 78 69   So if there exi
34310 73 74 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e  sts more than on
34320 65 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74  e reference to t
34330 68 69 73 20 70 61 67 65 2c 20 74 68 65 6e 20 69  his page, then i
34340 74 20 0a 20 20 20 20 20 20 2a 2a 20 6d 75 73 74  t .      ** must
34350 20 6e 6f 74 20 72 65 61 6c 6c 79 20 62 65 20 61   not really be a
34360 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  n overflow page 
34370 61 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65  and the database
34380 20 6d 75 73 74 20 62 65 20 63 6f 72 72 75 70 74   must be corrupt
34390 2e 20 0a 20 20 20 20 20 20 2a 2a 20 49 74 20 69  . .      ** It i
343a0 73 20 68 65 6c 70 66 75 6c 20 74 6f 20 64 65 74  s helpful to det
343b0 65 63 74 20 74 68 69 73 20 62 65 66 6f 72 65 20  ect this before 
343c0 63 61 6c 6c 69 6e 67 20 66 72 65 65 50 61 67 65  calling freePage
343d0 32 28 29 2c 20 61 73 20 0a 20 20 20 20 20 20 2a  2(), as .      *
343e0 2a 20 66 72 65 65 50 61 67 65 32 28 29 20 6d 61  * freePage2() ma
343f0 79 20 7a 65 72 6f 20 74 68 65 20 70 61 67 65 20  y zero the page 
34400 63 6f 6e 74 65 6e 74 73 20 69 66 20 73 65 63 75  contents if secu
34410 72 65 2d 64 65 6c 65 74 65 20 6d 6f 64 65 20 69  re-delete mode i
34420 73 0a 20 20 20 20 20 20 2a 2a 20 65 6e 61 62 6c  s.      ** enabl
34430 65 64 2e 20 49 66 20 74 68 69 73 20 27 6f 76 65  ed. If this 'ove
34440 72 66 6c 6f 77 27 20 70 61 67 65 20 68 61 70 70  rflow' page happ
34450 65 6e 73 20 74 6f 20 62 65 20 61 20 70 61 67 65  ens to be a page
34460 20 74 68 61 74 20 74 68 65 0a 20 20 20 20 20 20   that the.      
34470 2a 2a 20 63 61 6c 6c 65 72 20 69 73 20 69 74 65  ** caller is ite
34480 72 61 74 69 6e 67 20 74 68 72 6f 75 67 68 20 6f  rating through o
34490 72 20 75 73 69 6e 67 20 69 6e 20 73 6f 6d 65 20  r using in some 
344a0 6f 74 68 65 72 20 77 61 79 2c 20 74 68 69 73 0a  other way, this.
344b0 20 20 20 20 20 20 2a 2a 20 63 61 6e 20 62 65 20        ** can be 
344c0 70 72 6f 62 6c 65 6d 61 74 69 63 2e 0a 20 20 20  problematic..   
344d0 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d     */.      rc =
344e0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
344f0 42 4b 50 54 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  BKPT;.    }else{
34500 0a 20 20 20 20 20 20 72 63 20 3d 20 66 72 65 65  .      rc = free
34510 50 61 67 65 32 28 70 42 74 2c 20 70 4f 76 66 6c  Page2(pBt, pOvfl
34520 2c 20 6f 76 66 6c 50 67 6e 6f 29 3b 0a 20 20 20  , ovflPgno);.   
34530 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 4f 76 66   }..    if( pOvf
34540 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  l ){.      sqlit
34550 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 4f 76  e3PagerUnref(pOv
34560 66 6c 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  fl->pDbPage);.  
34570 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 20 29    }.    if( rc )
34580 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
34590 6f 76 66 6c 50 67 6e 6f 20 3d 20 69 4e 65 78 74  ovflPgno = iNext
345a0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
345b0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
345c0 2a 2a 20 43 72 65 61 74 65 20 74 68 65 20 62 79  ** Create the by
345d0 74 65 20 73 65 71 75 65 6e 63 65 20 75 73 65 64  te sequence used
345e0 20 74 6f 20 72 65 70 72 65 73 65 6e 74 20 61 20   to represent a 
345f0 63 65 6c 6c 20 6f 6e 20 70 61 67 65 20 70 50 61  cell on page pPa
34600 67 65 0a 2a 2a 20 61 6e 64 20 77 72 69 74 65 20  ge.** and write 
34610 74 68 61 74 20 62 79 74 65 20 73 65 71 75 65 6e  that byte sequen
34620 63 65 20 69 6e 74 6f 20 70 43 65 6c 6c 5b 5d 2e  ce into pCell[].
34630 20 20 4f 76 65 72 66 6c 6f 77 20 70 61 67 65 73    Overflow pages
34640 20 61 72 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65   are.** allocate
34650 64 20 61 6e 64 20 66 69 6c 6c 65 64 20 69 6e 20  d and filled in 
34660 61 73 20 6e 65 63 65 73 73 61 72 79 2e 20 20 54  as necessary.  T
34670 68 65 20 63 61 6c 6c 69 6e 67 20 70 72 6f 63 65  he calling proce
34680 64 75 72 65 0a 2a 2a 20 69 73 20 72 65 73 70 6f  dure.** is respo
34690 6e 73 69 62 6c 65 20 66 6f 72 20 6d 61 6b 69 6e  nsible for makin
346a0 67 20 73 75 72 65 20 73 75 66 66 69 63 69 65 6e  g sure sufficien
346b0 74 20 73 70 61 63 65 20 68 61 73 20 62 65 65 6e  t space has been
346c0 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 66 6f   allocated.** fo
346d0 72 20 70 43 65 6c 6c 5b 5d 2e 0a 2a 2a 0a 2a 2a  r pCell[]..**.**
346e0 20 4e 6f 74 65 20 74 68 61 74 20 70 43 65 6c 6c   Note that pCell
346f0 20 64 6f 65 73 20 6e 6f 74 20 6e 65 63 65 73 73   does not necess
34700 61 72 79 20 6e 65 65 64 20 74 6f 20 70 6f 69 6e  ary need to poin
34710 74 20 74 6f 20 74 68 65 20 70 50 61 67 65 2d 3e  t to the pPage->
34720 61 44 61 74 61 0a 2a 2a 20 61 72 65 61 2e 20 20  aData.** area.  
34730 70 43 65 6c 6c 20 6d 69 67 68 74 20 70 6f 69 6e  pCell might poin
34740 74 20 74 6f 20 73 6f 6d 65 20 74 65 6d 70 6f 72  t to some tempor
34750 61 72 79 20 73 74 6f 72 61 67 65 2e 20 20 54 68  ary storage.  Th
34760 65 20 63 65 6c 6c 20 77 69 6c 6c 0a 2a 2a 20 62  e cell will.** b
34770 65 20 63 6f 6e 73 74 72 75 63 74 65 64 20 69 6e  e constructed in
34780 20 74 68 69 73 20 74 65 6d 70 6f 72 61 72 79 20   this temporary 
34790 61 72 65 61 20 74 68 65 6e 20 63 6f 70 69 65 64  area then copied
347a0 20 69 6e 74 6f 20 70 50 61 67 65 2d 3e 61 44 61   into pPage->aDa
347b0 74 61 0a 2a 2a 20 6c 61 74 65 72 2e 0a 2a 2f 0a  ta.** later..*/.
347c0 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c 6c 49  static int fillI
347d0 6e 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65  nCell(.  MemPage
347e0 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20 20   *pPage,        
347f0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
34800 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  age that contain
34810 73 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20  s the cell */.  
34820 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
34830 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 2f  Cell,          /
34840 2a 20 43 6f 6d 70 6c 65 74 65 20 74 65 78 74 20  * Complete text 
34850 6f 66 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20  of the cell */. 
34860 20 63 6f 6e 73 74 20 42 74 72 65 65 50 61 79 6c   const BtreePayl
34870 6f 61 64 20 2a 70 58 2c 20 20 20 20 20 20 20 20  oad *pX,        
34880 2f 2a 20 50 61 79 6c 6f 61 64 20 77 69 74 68 20  /* Payload with 
34890 77 68 69 63 68 20 74 6f 20 63 6f 6e 73 74 72 75  which to constru
348a0 63 74 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20  ct the cell */. 
348b0 20 69 6e 74 20 2a 70 6e 53 69 7a 65 20 20 20 20   int *pnSize    
348c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
348d0 2f 2a 20 57 72 69 74 65 20 63 65 6c 6c 20 73 69  /* Write cell si
348e0 7a 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  ze here */.){.  
348f0 69 6e 74 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20  int nPayload;.  
34900 63 6f 6e 73 74 20 75 38 20 2a 70 53 72 63 3b 0a  const u8 *pSrc;.
34910 20 20 69 6e 74 20 6e 53 72 63 2c 20 6e 2c 20 72    int nSrc, n, r
34920 63 3b 0a 20 20 69 6e 74 20 73 70 61 63 65 4c 65  c;.  int spaceLe
34930 66 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  ft;.  MemPage *p
34940 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 4d 65 6d 50  Ovfl = 0;.  MemP
34950 61 67 65 20 2a 70 54 6f 52 65 6c 65 61 73 65 20  age *pToRelease 
34960 3d 20 30 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  = 0;.  unsigned 
34970 63 68 61 72 20 2a 70 50 72 69 6f 72 3b 0a 20 20  char *pPrior;.  
34980 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
34990 50 61 79 6c 6f 61 64 3b 0a 20 20 42 74 53 68 61  Payload;.  BtSha
349a0 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65  red *pBt = pPage
349b0 2d 3e 70 42 74 3b 0a 20 20 50 67 6e 6f 20 70 67  ->pBt;.  Pgno pg
349c0 6e 6f 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 69 6e  noOvfl = 0;.  in
349d0 74 20 6e 48 65 61 64 65 72 3b 0a 0a 20 20 61 73  t nHeader;..  as
349e0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
349f0 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
34a00 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a  pBt->mutex) );..
34a10 20 20 2f 2a 20 70 50 61 67 65 20 69 73 20 6e 6f    /* pPage is no
34a20 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20 77 72  t necessarily wr
34a30 69 74 65 61 62 6c 65 20 73 69 6e 63 65 20 70 43  iteable since pC
34a40 65 6c 6c 20 6d 69 67 68 74 20 62 65 20 61 75 78  ell might be aux
34a50 69 6c 69 61 72 79 0a 20 20 2a 2a 20 62 75 66 66  iliary.  ** buff
34a60 65 72 20 73 70 61 63 65 20 74 68 61 74 20 69 73  er space that is
34a70 20 73 65 70 61 72 61 74 65 20 66 72 6f 6d 20 74   separate from t
34a80 68 65 20 70 50 61 67 65 20 62 75 66 66 65 72 20  he pPage buffer 
34a90 61 72 65 61 20 2a 2f 0a 20 20 61 73 73 65 72 74  area */.  assert
34aa0 28 20 70 43 65 6c 6c 3c 70 50 61 67 65 2d 3e 61  ( pCell<pPage->a
34ab0 44 61 74 61 20 7c 7c 20 70 43 65 6c 6c 3e 3d 26  Data || pCell>=&
34ac0 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 42 74  pPage->aData[pBt
34ad0 2d 3e 70 61 67 65 53 69 7a 65 5d 0a 20 20 20 20  ->pageSize].    
34ae0 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74          || sqlit
34af0 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
34b00 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
34b10 65 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c  e) );..  /* Fill
34b20 20 69 6e 20 74 68 65 20 68 65 61 64 65 72 2e 20   in the header. 
34b30 2a 2f 0a 20 20 6e 48 65 61 64 65 72 20 3d 20 70  */.  nHeader = p
34b40 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69  Page->childPtrSi
34b50 7a 65 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d  ze;.  if( pPage-
34b60 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 6e  >intKey ){.    n
34b70 50 61 79 6c 6f 61 64 20 3d 20 70 58 2d 3e 6e 44  Payload = pX->nD
34b80 61 74 61 20 2b 20 70 58 2d 3e 6e 5a 65 72 6f 3b  ata + pX->nZero;
34b90 0a 20 20 20 20 70 53 72 63 20 3d 20 70 58 2d 3e  .    pSrc = pX->
34ba0 70 44 61 74 61 3b 0a 20 20 20 20 6e 53 72 63 20  pData;.    nSrc 
34bb0 3d 20 70 58 2d 3e 6e 44 61 74 61 3b 0a 20 20 20  = pX->nData;.   
34bc0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
34bd0 69 6e 74 4b 65 79 4c 65 61 66 20 29 3b 20 2f 2a  intKeyLeaf ); /*
34be0 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 29 20 6f 6e   fillInCell() on
34bf0 6c 79 20 63 61 6c 6c 65 64 20 66 6f 72 20 6c 65  ly called for le
34c00 61 76 65 73 20 2a 2f 0a 20 20 20 20 6e 48 65 61  aves */.    nHea
34c10 64 65 72 20 2b 3d 20 70 75 74 56 61 72 69 6e 74  der += putVarint
34c20 33 32 28 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65  32(&pCell[nHeade
34c30 72 5d 2c 20 6e 50 61 79 6c 6f 61 64 29 3b 0a 20  r], nPayload);. 
34c40 20 20 20 6e 48 65 61 64 65 72 20 2b 3d 20 70 75     nHeader += pu
34c50 74 56 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b 6e  tVarint(&pCell[n
34c60 48 65 61 64 65 72 5d 2c 20 2a 28 75 36 34 2a 29  Header], *(u64*)
34c70 26 70 58 2d 3e 6e 4b 65 79 29 3b 0a 20 20 7d 65  &pX->nKey);.  }e
34c80 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
34c90 20 70 58 2d 3e 6e 4b 65 79 3c 3d 30 78 37 66 66   pX->nKey<=0x7ff
34ca0 66 66 66 66 66 20 26 26 20 70 58 2d 3e 70 4b 65  fffff && pX->pKe
34cb0 79 21 3d 30 20 29 3b 0a 20 20 20 20 6e 53 72 63  y!=0 );.    nSrc
34cc0 20 3d 20 6e 50 61 79 6c 6f 61 64 20 3d 20 28 69   = nPayload = (i
34cd0 6e 74 29 70 58 2d 3e 6e 4b 65 79 3b 0a 20 20 20  nt)pX->nKey;.   
34ce0 20 70 53 72 63 20 3d 20 70 58 2d 3e 70 4b 65 79   pSrc = pX->pKey
34cf0 3b 0a 20 20 20 20 6e 48 65 61 64 65 72 20 2b 3d  ;.    nHeader +=
34d00 20 70 75 74 56 61 72 69 6e 74 33 32 28 26 70 43   putVarint32(&pC
34d10 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c 20 6e 50  ell[nHeader], nP
34d20 61 79 6c 6f 61 64 29 3b 0a 20 20 7d 0a 20 20 0a  ayload);.  }.  .
34d30 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65    /* Fill in the
34d40 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 20 20 69 66   payload */.  if
34d50 28 20 6e 50 61 79 6c 6f 61 64 3c 3d 70 50 61 67  ( nPayload<=pPag
34d60 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20  e->maxLocal ){. 
34d70 20 20 20 6e 20 3d 20 6e 48 65 61 64 65 72 20 2b     n = nHeader +
34d80 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20 74   nPayload;.    t
34d90 65 73 74 63 61 73 65 28 20 6e 3d 3d 33 20 29 3b  estcase( n==3 );
34da0 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e  .    testcase( n
34db0 3d 3d 34 20 29 3b 0a 20 20 20 20 69 66 28 20 6e  ==4 );.    if( n
34dc0 3c 34 20 29 20 6e 20 3d 20 34 3b 0a 20 20 20 20  <4 ) n = 4;.    
34dd0 2a 70 6e 53 69 7a 65 20 3d 20 6e 3b 0a 20 20 20  *pnSize = n;.   
34de0 20 73 70 61 63 65 4c 65 66 74 20 3d 20 6e 50 61   spaceLeft = nPa
34df0 79 6c 6f 61 64 3b 0a 20 20 20 20 70 50 72 69 6f  yload;.    pPrio
34e00 72 20 3d 20 70 43 65 6c 6c 3b 0a 20 20 7d 65 6c  r = pCell;.  }el
34e10 73 65 7b 0a 20 20 20 20 69 6e 74 20 6d 6e 20 3d  se{.    int mn =
34e20 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c   pPage->minLocal
34e30 3b 0a 20 20 20 20 6e 20 3d 20 6d 6e 20 2b 20 28  ;.    n = mn + (
34e40 6e 50 61 79 6c 6f 61 64 20 2d 20 6d 6e 29 20 25  nPayload - mn) %
34e50 20 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73   (pPage->pBt->us
34e60 61 62 6c 65 53 69 7a 65 20 2d 20 34 29 3b 0a 20  ableSize - 4);. 
34e70 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 3d 3d     testcase( n==
34e80 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20  pPage->maxLocal 
34e90 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
34ea0 20 6e 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f   n==pPage->maxLo
34eb0 63 61 6c 2b 31 20 29 3b 0a 20 20 20 20 69 66 28  cal+1 );.    if(
34ec0 20 6e 20 3e 20 70 50 61 67 65 2d 3e 6d 61 78 4c   n > pPage->maxL
34ed0 6f 63 61 6c 20 29 20 6e 20 3d 20 6d 6e 3b 0a 20  ocal ) n = mn;. 
34ee0 20 20 20 73 70 61 63 65 4c 65 66 74 20 3d 20 6e     spaceLeft = n
34ef0 3b 0a 20 20 20 20 2a 70 6e 53 69 7a 65 20 3d 20  ;.    *pnSize = 
34f00 6e 20 2b 20 6e 48 65 61 64 65 72 20 2b 20 34 3b  n + nHeader + 4;
34f10 0a 20 20 20 20 70 50 72 69 6f 72 20 3d 20 26 70  .    pPrior = &p
34f20 43 65 6c 6c 5b 6e 48 65 61 64 65 72 2b 6e 5d 3b  Cell[nHeader+n];
34f30 0a 20 20 7d 0a 20 20 70 50 61 79 6c 6f 61 64 20  .  }.  pPayload 
34f40 3d 20 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72  = &pCell[nHeader
34f50 5d 3b 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69 73  ];..  /* At this
34f60 20 70 6f 69 6e 74 20 76 61 72 69 61 62 6c 65 73   point variables
34f70 20 73 68 6f 75 6c 64 20 62 65 20 73 65 74 20 61   should be set a
34f80 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 2a 2a 0a  s follows:.  **.
34f90 20 20 2a 2a 20 20 20 6e 50 61 79 6c 6f 61 64 20    **   nPayload 
34fa0 20 20 20 20 20 20 20 20 20 20 54 6f 74 61 6c 20            Total 
34fb0 70 61 79 6c 6f 61 64 20 73 69 7a 65 20 69 6e 20  payload size in 
34fc0 62 79 74 65 73 0a 20 20 2a 2a 20 20 20 70 50 61  bytes.  **   pPa
34fd0 79 6c 6f 61 64 20 20 20 20 20 20 20 20 20 20 20  yload           
34fe0 42 65 67 69 6e 20 77 72 69 74 69 6e 67 20 70 61  Begin writing pa
34ff0 79 6c 6f 61 64 20 68 65 72 65 0a 20 20 2a 2a 20  yload here.  ** 
35000 20 20 73 70 61 63 65 4c 65 66 74 20 20 20 20 20    spaceLeft     
35010 20 20 20 20 20 53 70 61 63 65 20 61 76 61 69 6c       Space avail
35020 61 62 6c 65 20 61 74 20 70 50 61 79 6c 6f 61 64  able at pPayload
35030 2e 20 20 49 66 20 6e 50 61 79 6c 6f 61 64 3e 73  .  If nPayload>s
35040 70 61 63 65 4c 65 66 74 2c 0a 20 20 2a 2a 20 20  paceLeft,.  **  
35050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35060 20 20 20 20 74 68 61 74 20 6d 65 61 6e 73 20 63      that means c
35070 6f 6e 74 65 6e 74 20 6d 75 73 74 20 73 70 69 6c  ontent must spil
35080 6c 20 69 6e 74 6f 20 6f 76 65 72 66 6c 6f 77 20  l into overflow 
35090 70 61 67 65 73 2e 0a 20 20 2a 2a 20 20 20 2a 70  pages..  **   *p
350a0 6e 53 69 7a 65 20 20 20 20 20 20 20 20 20 20 20  nSize           
350b0 20 53 69 7a 65 20 6f 66 20 74 68 65 20 6c 6f 63   Size of the loc
350c0 61 6c 20 63 65 6c 6c 20 28 6e 6f 74 20 63 6f 75  al cell (not cou
350d0 6e 74 69 6e 67 20 6f 76 65 72 66 6c 6f 77 20 70  nting overflow p
350e0 61 67 65 73 29 0a 20 20 2a 2a 20 20 20 70 50 72  ages).  **   pPr
350f0 69 6f 72 20 20 20 20 20 20 20 20 20 20 20 20 20  ior             
35100 57 68 65 72 65 20 74 6f 20 77 72 69 74 65 20 74  Where to write t
35110 68 65 20 70 67 6e 6f 20 6f 66 20 74 68 65 20 66  he pgno of the f
35120 69 72 73 74 20 6f 76 65 72 66 6c 6f 77 20 70 61  irst overflow pa
35130 67 65 0a 20 20 2a 2a 0a 20 20 2a 2a 20 55 73 65  ge.  **.  ** Use
35140 20 61 20 63 61 6c 6c 20 74 6f 20 62 74 72 65 65   a call to btree
35150 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29 20 74  ParseCellPtr() t
35160 6f 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68  o verify that th
35170 65 20 76 61 6c 75 65 73 20 61 62 6f 76 65 0a 20  e values above. 
35180 20 2a 2a 20 77 65 72 65 20 63 6f 6d 70 75 74 65   ** were compute
35190 64 20 63 6f 72 72 65 63 74 6c 79 2e 0a 20 20 2a  d correctly..  *
351a0 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
351b0 44 45 42 55 47 0a 20 20 7b 0a 20 20 20 20 43 65  DEBUG.  {.    Ce
351c0 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20  llInfo info;.   
351d0 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65   pPage->xParseCe
351e0 6c 6c 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c  ll(pPage, pCell,
351f0 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 61 73 73   &info);.    ass
35200 65 72 74 28 20 6e 48 65 61 64 65 72 3d 3d 28 69  ert( nHeader==(i
35210 6e 74 29 28 69 6e 66 6f 2e 70 50 61 79 6c 6f 61  nt)(info.pPayloa
35220 64 20 2d 20 70 43 65 6c 6c 29 20 29 3b 0a 20 20  d - pCell) );.  
35230 20 20 61 73 73 65 72 74 28 20 69 6e 66 6f 2e 6e    assert( info.n
35240 4b 65 79 3d 3d 70 58 2d 3e 6e 4b 65 79 20 29 3b  Key==pX->nKey );
35250 0a 20 20 20 20 61 73 73 65 72 74 28 20 2a 70 6e  .    assert( *pn
35260 53 69 7a 65 20 3d 3d 20 69 6e 66 6f 2e 6e 53 69  Size == info.nSi
35270 7a 65 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ze );.    assert
35280 28 20 73 70 61 63 65 4c 65 66 74 20 3d 3d 20 69  ( spaceLeft == i
35290 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 3b 0a 20 20  nfo.nLocal );.  
352a0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 57  }.#endif..  /* W
352b0 72 69 74 65 20 74 68 65 20 70 61 79 6c 6f 61 64  rite the payload
352c0 20 69 6e 74 6f 20 74 68 65 20 6c 6f 63 61 6c 20   into the local 
352d0 43 65 6c 6c 20 61 6e 64 20 61 6e 79 20 65 78 74  Cell and any ext
352e0 72 61 20 69 6e 74 6f 20 6f 76 65 72 66 6c 6f 77  ra into overflow
352f0 20 70 61 67 65 73 20 2a 2f 0a 20 20 77 68 69 6c   pages */.  whil
35300 65 28 20 6e 50 61 79 6c 6f 61 64 3e 30 20 29 7b  e( nPayload>0 ){
35310 0a 20 20 20 20 69 66 28 20 73 70 61 63 65 4c 65  .    if( spaceLe
35320 66 74 3d 3d 30 20 29 7b 0a 23 69 66 6e 64 65 66  ft==0 ){.#ifndef
35330 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
35340 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 50 67  OVACUUM.      Pg
35350 6e 6f 20 70 67 6e 6f 50 74 72 6d 61 70 20 3d 20  no pgnoPtrmap = 
35360 70 67 6e 6f 4f 76 66 6c 3b 20 2f 2a 20 4f 76 65  pgnoOvfl; /* Ove
35370 72 66 6c 6f 77 20 70 61 67 65 20 70 6f 69 6e 74  rflow page point
35380 65 72 2d 6d 61 70 20 65 6e 74 72 79 20 70 61 67  er-map entry pag
35390 65 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70  e */.      if( p
353a0 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
353b0 7b 0a 20 20 20 20 20 20 20 20 64 6f 7b 0a 20 20  {.        do{.  
353c0 20 20 20 20 20 20 20 20 70 67 6e 6f 4f 76 66 6c          pgnoOvfl
353d0 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 20 77 68  ++;.        } wh
353e0 69 6c 65 28 20 0a 20 20 20 20 20 20 20 20 20 20  ile( .          
353f0 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42  PTRMAP_ISPAGE(pB
35400 74 2c 20 70 67 6e 6f 4f 76 66 6c 29 20 7c 7c 20  t, pgnoOvfl) || 
35410 70 67 6e 6f 4f 76 66 6c 3d 3d 50 45 4e 44 49 4e  pgnoOvfl==PENDIN
35420 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
35430 20 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20   .        );.   
35440 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
35450 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42    rc = allocateB
35460 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70  treePage(pBt, &p
35470 4f 76 66 6c 2c 20 26 70 67 6e 6f 4f 76 66 6c 2c  Ovfl, &pgnoOvfl,
35480 20 70 67 6e 6f 4f 76 66 6c 2c 20 30 29 3b 0a 23   pgnoOvfl, 0);.#
35490 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
354a0 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
354b0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61      /* If the da
354c0 74 61 62 61 73 65 20 73 75 70 70 6f 72 74 73 20  tabase supports 
354d0 61 75 74 6f 2d 76 61 63 75 75 6d 2c 20 61 6e 64  auto-vacuum, and
354e0 20 74 68 65 20 73 65 63 6f 6e 64 20 6f 72 20 73   the second or s
354f0 75 62 73 65 71 75 65 6e 74 0a 20 20 20 20 20 20  ubsequent.      
35500 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  ** overflow page
35510 20 69 73 20 62 65 69 6e 67 20 61 6c 6c 6f 63 61   is being alloca
35520 74 65 64 2c 20 61 64 64 20 61 6e 20 65 6e 74 72  ted, add an entr
35530 79 20 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72  y to the pointer
35540 2d 6d 61 70 0a 20 20 20 20 20 20 2a 2a 20 66 6f  -map.      ** fo
35550 72 20 74 68 61 74 20 70 61 67 65 20 6e 6f 77 2e  r that page now.
35560 20 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20   .      **.     
35570 20 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20 74   ** If this is t
35580 68 65 20 66 69 72 73 74 20 6f 76 65 72 66 6c 6f  he first overflo
35590 77 20 70 61 67 65 2c 20 74 68 65 6e 20 77 72 69  w page, then wri
355a0 74 65 20 61 20 70 61 72 74 69 61 6c 20 65 6e 74  te a partial ent
355b0 72 79 20 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20  ry .      ** to 
355c0 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 2e  the pointer-map.
355d0 20 49 66 20 77 65 20 77 72 69 74 65 20 6e 6f 74   If we write not
355e0 68 69 6e 67 20 74 6f 20 74 68 69 73 20 70 6f 69  hing to this poi
355f0 6e 74 65 72 2d 6d 61 70 20 73 6c 6f 74 2c 0a 20  nter-map slot,. 
35600 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65       ** then the
35610 20 6f 70 74 69 6d 69 73 74 69 63 20 6f 76 65 72   optimistic over
35620 66 6c 6f 77 20 63 68 61 69 6e 20 70 72 6f 63 65  flow chain proce
35630 73 73 69 6e 67 20 69 6e 20 63 6c 65 61 72 43 65  ssing in clearCe
35640 6c 6c 28 29 0a 20 20 20 20 20 20 2a 2a 20 6d 61  ll().      ** ma
35650 79 20 6d 69 73 69 6e 74 65 72 70 72 65 74 20 74  y misinterpret t
35660 68 65 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64  he uninitialized
35670 20 76 61 6c 75 65 73 20 61 6e 64 20 64 65 6c 65   values and dele
35680 74 65 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  te the.      ** 
35690 77 72 6f 6e 67 20 70 61 67 65 73 20 66 72 6f 6d  wrong pages from
356a0 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 20   the database.. 
356b0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
356c0 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
356d0 6d 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  m && rc==SQLITE_
356e0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 75 38  OK ){.        u8
356f0 20 65 54 79 70 65 20 3d 20 28 70 67 6e 6f 50 74   eType = (pgnoPt
35700 72 6d 61 70 3f 50 54 52 4d 41 50 5f 4f 56 45 52  rmap?PTRMAP_OVER
35710 46 4c 4f 57 32 3a 50 54 52 4d 41 50 5f 4f 56 45  FLOW2:PTRMAP_OVE
35720 52 46 4c 4f 57 31 29 3b 0a 20 20 20 20 20 20 20  RFLOW1);.       
35730 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20   ptrmapPut(pBt, 
35740 70 67 6e 6f 4f 76 66 6c 2c 20 65 54 79 70 65 2c  pgnoOvfl, eType,
35750 20 70 67 6e 6f 50 74 72 6d 61 70 2c 20 26 72 63   pgnoPtrmap, &rc
35760 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
35770 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  c ){.          r
35780 65 6c 65 61 73 65 50 61 67 65 28 70 4f 76 66 6c  eleasePage(pOvfl
35790 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
357a0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
357b0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
357c0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
357d0 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 20  pToRelease);.   
357e0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
357f0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
35800 2a 20 49 66 20 70 54 6f 52 65 6c 65 61 73 65 20  * If pToRelease 
35810 69 73 20 6e 6f 74 20 7a 65 72 6f 20 74 68 61 6e  is not zero than
35820 20 70 50 72 69 6f 72 20 70 6f 69 6e 74 73 20 69   pPrior points i
35830 6e 74 6f 20 74 68 65 20 64 61 74 61 20 61 72 65  nto the data are
35840 61 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 70 54  a.      ** of pT
35850 6f 52 65 6c 65 61 73 65 2e 20 20 4d 61 6b 65 20  oRelease.  Make 
35860 73 75 72 65 20 70 54 6f 52 65 6c 65 61 73 65 20  sure pToRelease 
35870 69 73 20 73 74 69 6c 6c 20 77 72 69 74 65 61 62  is still writeab
35880 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73  le. */.      ass
35890 65 72 74 28 20 70 54 6f 52 65 6c 65 61 73 65 3d  ert( pToRelease=
358a0 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67  =0 || sqlite3Pag
358b0 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 54  erIswriteable(pT
358c0 6f 52 65 6c 65 61 73 65 2d 3e 70 44 62 50 61 67  oRelease->pDbPag
358d0 65 29 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  e) );..      /* 
358e0 49 66 20 70 50 72 69 6f 72 20 69 73 20 70 61 72  If pPrior is par
358f0 74 20 6f 66 20 74 68 65 20 64 61 74 61 20 61 72  t of the data ar
35900 65 61 20 6f 66 20 70 50 61 67 65 2c 20 74 68 65  ea of pPage, the
35910 6e 20 6d 61 6b 65 20 73 75 72 65 20 70 50 61 67  n make sure pPag
35920 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 73 74  e.      ** is st
35930 69 6c 6c 20 77 72 69 74 65 61 62 6c 65 20 2a 2f  ill writeable */
35940 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
35950 50 72 69 6f 72 3c 70 50 61 67 65 2d 3e 61 44 61  Prior<pPage->aDa
35960 74 61 20 7c 7c 20 70 50 72 69 6f 72 3e 3d 26 70  ta || pPrior>=&p
35970 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d  Page->aData[pBt-
35980 3e 70 61 67 65 53 69 7a 65 5d 0a 20 20 20 20 20  >pageSize].     
35990 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65         || sqlite
359a0 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
359b0 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
359c0 29 20 29 3b 0a 0a 20 20 20 20 20 20 70 75 74 34  ) );..      put4
359d0 62 79 74 65 28 70 50 72 69 6f 72 2c 20 70 67 6e  byte(pPrior, pgn
359e0 6f 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20 72 65  oOvfl);.      re
359f0 6c 65 61 73 65 50 61 67 65 28 70 54 6f 52 65 6c  leasePage(pToRel
35a00 65 61 73 65 29 3b 0a 20 20 20 20 20 20 70 54 6f  ease);.      pTo
35a10 52 65 6c 65 61 73 65 20 3d 20 70 4f 76 66 6c 3b  Release = pOvfl;
35a20 0a 20 20 20 20 20 20 70 50 72 69 6f 72 20 3d 20  .      pPrior = 
35a30 70 4f 76 66 6c 2d 3e 61 44 61 74 61 3b 0a 20 20  pOvfl->aData;.  
35a40 20 20 20 20 70 75 74 34 62 79 74 65 28 70 50 72      put4byte(pPr
35a50 69 6f 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 70  ior, 0);.      p
35a60 50 61 79 6c 6f 61 64 20 3d 20 26 70 4f 76 66 6c  Payload = &pOvfl
35a70 2d 3e 61 44 61 74 61 5b 34 5d 3b 0a 20 20 20 20  ->aData[4];.    
35a80 20 20 73 70 61 63 65 4c 65 66 74 20 3d 20 70 42    spaceLeft = pB
35a90 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20  t->usableSize - 
35aa0 34 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 20 3d  4;.    }.    n =
35ab0 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20 69   nPayload;.    i
35ac0 66 28 20 6e 3e 73 70 61 63 65 4c 65 66 74 20 29  f( n>spaceLeft )
35ad0 20 6e 20 3d 20 73 70 61 63 65 4c 65 66 74 3b 0a   n = spaceLeft;.
35ae0 0a 20 20 20 20 2f 2a 20 49 66 20 70 54 6f 52 65  .    /* If pToRe
35af0 6c 65 61 73 65 20 69 73 20 6e 6f 74 20 7a 65 72  lease is not zer
35b00 6f 20 74 68 61 6e 20 70 50 61 79 6c 6f 61 64 20  o than pPayload 
35b10 70 6f 69 6e 74 73 20 69 6e 74 6f 20 74 68 65 20  points into the 
35b20 64 61 74 61 20 61 72 65 61 0a 20 20 20 20 2a 2a  data area.    **
35b30 20 6f 66 20 70 54 6f 52 65 6c 65 61 73 65 2e 20   of pToRelease. 
35b40 20 4d 61 6b 65 20 73 75 72 65 20 70 54 6f 52 65   Make sure pToRe
35b50 6c 65 61 73 65 20 69 73 20 73 74 69 6c 6c 20 77  lease is still w
35b60 72 69 74 65 61 62 6c 65 2e 20 2a 2f 0a 20 20 20  riteable. */.   
35b70 20 61 73 73 65 72 74 28 20 70 54 6f 52 65 6c 65   assert( pToRele
35b80 61 73 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65  ase==0 || sqlite
35b90 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
35ba0 65 28 70 54 6f 52 65 6c 65 61 73 65 2d 3e 70 44  e(pToRelease->pD
35bb0 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 2f  bPage) );..    /
35bc0 2a 20 49 66 20 70 50 61 79 6c 6f 61 64 20 69 73  * If pPayload is
35bd0 20 70 61 72 74 20 6f 66 20 74 68 65 20 64 61 74   part of the dat
35be0 61 20 61 72 65 61 20 6f 66 20 70 50 61 67 65 2c  a area of pPage,
35bf0 20 74 68 65 6e 20 6d 61 6b 65 20 73 75 72 65 20   then make sure 
35c00 70 50 61 67 65 0a 20 20 20 20 2a 2a 20 69 73 20  pPage.    ** is 
35c10 73 74 69 6c 6c 20 77 72 69 74 65 61 62 6c 65 20  still writeable 
35c20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
35c30 50 61 79 6c 6f 61 64 3c 70 50 61 67 65 2d 3e 61  Payload<pPage->a
35c40 44 61 74 61 20 7c 7c 20 70 50 61 79 6c 6f 61 64  Data || pPayload
35c50 3e 3d 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  >=&pPage->aData[
35c60 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d 0a 20  pBt->pageSize]. 
35c70 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71             || sq
35c80 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
35c90 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
35ca0 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 69 66  Page) );..    if
35cb0 28 20 6e 53 72 63 3e 30 20 29 7b 0a 20 20 20 20  ( nSrc>0 ){.    
35cc0 20 20 69 66 28 20 6e 3e 6e 53 72 63 20 29 20 6e    if( n>nSrc ) n
35cd0 20 3d 20 6e 53 72 63 3b 0a 20 20 20 20 20 20 61   = nSrc;.      a
35ce0 73 73 65 72 74 28 20 70 53 72 63 20 29 3b 0a 20  ssert( pSrc );. 
35cf0 20 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61 79       memcpy(pPay
35d00 6c 6f 61 64 2c 20 70 53 72 63 2c 20 6e 29 3b 0a  load, pSrc, n);.
35d10 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
35d20 20 6d 65 6d 73 65 74 28 70 50 61 79 6c 6f 61 64   memset(pPayload
35d30 2c 20 30 2c 20 6e 29 3b 0a 20 20 20 20 7d 0a 20  , 0, n);.    }. 
35d40 20 20 20 6e 50 61 79 6c 6f 61 64 20 2d 3d 20 6e     nPayload -= n
35d50 3b 0a 20 20 20 20 70 50 61 79 6c 6f 61 64 20 2b  ;.    pPayload +
35d60 3d 20 6e 3b 0a 20 20 20 20 70 53 72 63 20 2b 3d  = n;.    pSrc +=
35d70 20 6e 3b 0a 20 20 20 20 6e 53 72 63 20 2d 3d 20   n;.    nSrc -= 
35d80 6e 3b 0a 20 20 20 20 73 70 61 63 65 4c 65 66 74  n;.    spaceLeft
35d90 20 2d 3d 20 6e 3b 0a 20 20 7d 0a 20 20 72 65 6c   -= n;.  }.  rel
35da0 65 61 73 65 50 61 67 65 28 70 54 6f 52 65 6c 65  easePage(pToRele
35db0 61 73 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  ase);.  return S
35dc0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
35dd0 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 69 2d  ** Remove the i-
35de0 74 68 20 63 65 6c 6c 20 66 72 6f 6d 20 70 50 61  th cell from pPa
35df0 67 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  ge.  This routin
35e00 65 20 65 66 66 65 63 74 73 20 70 50 61 67 65 20  e effects pPage 
35e10 6f 6e 6c 79 2e 0a 2a 2a 20 54 68 65 20 63 65 6c  only..** The cel
35e20 6c 20 63 6f 6e 74 65 6e 74 20 69 73 20 6e 6f 74  l content is not
35e30 20 66 72 65 65 64 20 6f 72 20 64 65 61 6c 6c 6f   freed or deallo
35e40 63 61 74 65 64 2e 20 20 49 74 20 69 73 20 61 73  cated.  It is as
35e50 73 75 6d 65 64 20 74 68 61 74 0a 2a 2a 20 74 68  sumed that.** th
35e60 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 68  e cell content h
35e70 61 73 20 62 65 65 6e 20 63 6f 70 69 65 64 20 73  as been copied s
35e80 6f 6d 65 70 6c 61 63 65 20 65 6c 73 65 2e 20 20  omeplace else.  
35e90 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6a 75 73  This routine jus
35ea0 74 0a 2a 2a 20 72 65 6d 6f 76 65 73 20 74 68 65  t.** removes the
35eb0 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68   reference to th
35ec0 65 20 63 65 6c 6c 20 66 72 6f 6d 20 70 50 61 67  e cell from pPag
35ed0 65 2e 0a 2a 2a 0a 2a 2a 20 22 73 7a 22 20 6d 75  e..**.** "sz" mu
35ee0 73 74 20 62 65 20 74 68 65 20 6e 75 6d 62 65 72  st be the number
35ef0 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68 65   of bytes in the
35f00 20 63 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63   cell..*/.static
35f10 20 76 6f 69 64 20 64 72 6f 70 43 65 6c 6c 28 4d   void dropCell(M
35f20 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69  emPage *pPage, i
35f30 6e 74 20 69 64 78 2c 20 69 6e 74 20 73 7a 2c 20  nt idx, int sz, 
35f40 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20 75 33 32  int *pRC){.  u32
35f50 20 70 63 3b 20 20 20 20 20 20 20 20 20 2f 2a 20   pc;         /* 
35f60 4f 66 66 73 65 74 20 74 6f 20 63 65 6c 6c 20 63  Offset to cell c
35f70 6f 6e 74 65 6e 74 20 6f 66 20 63 65 6c 6c 20 62  ontent of cell b
35f80 65 69 6e 67 20 64 65 6c 65 74 65 64 20 2a 2f 0a  eing deleted */.
35f90 20 20 75 38 20 2a 64 61 74 61 3b 20 20 20 20 20    u8 *data;     
35fa0 20 20 2f 2a 20 70 50 61 67 65 2d 3e 61 44 61 74    /* pPage->aDat
35fb0 61 20 2a 2f 0a 20 20 75 38 20 2a 70 74 72 3b 20  a */.  u8 *ptr; 
35fc0 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74         /* Used t
35fd0 6f 20 6d 6f 76 65 20 62 79 74 65 73 20 61 72 6f  o move bytes aro
35fe0 75 6e 64 20 77 69 74 68 69 6e 20 64 61 74 61 5b  und within data[
35ff0 5d 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  ] */.  int rc;  
36000 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65         /* The re
36010 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69  turn code */.  i
36020 6e 74 20 68 64 72 3b 20 20 20 20 20 20 20 20 2f  nt hdr;        /
36030 2a 20 42 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  * Beginning of t
36040 68 65 20 68 65 61 64 65 72 2e 20 20 30 20 6d 6f  he header.  0 mo
36050 73 74 20 70 61 67 65 73 2e 20 20 31 30 30 20 70  st pages.  100 p
36060 61 67 65 20 31 20 2a 2f 0a 0a 20 20 69 66 28 20  age 1 */..  if( 
36070 2a 70 52 43 20 29 20 72 65 74 75 72 6e 3b 0a 20  *pRC ) return;. 
36080 20 61 73 73 65 72 74 28 20 69 64 78 3e 3d 30 20   assert( idx>=0 
36090 26 26 20 69 64 78 3c 70 50 61 67 65 2d 3e 6e 43  && idx<pPage->nC
360a0 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ell );.  assert(
360b0 20 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20 73   CORRUPT_DB || s
360c0 7a 3d 3d 63 65 6c 6c 53 69 7a 65 28 70 50 61 67  z==cellSize(pPag
360d0 65 2c 20 69 64 78 29 20 29 3b 0a 20 20 61 73 73  e, idx) );.  ass
360e0 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
360f0 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
36100 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
36110 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
36120 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
36130 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
36140 29 3b 0a 20 20 64 61 74 61 20 3d 20 70 50 61 67  );.  data = pPag
36150 65 2d 3e 61 44 61 74 61 3b 0a 20 20 70 74 72 20  e->aData;.  ptr 
36160 3d 20 26 70 50 61 67 65 2d 3e 61 43 65 6c 6c 49  = &pPage->aCellI
36170 64 78 5b 32 2a 69 64 78 5d 3b 0a 20 20 70 63 20  dx[2*idx];.  pc 
36180 3d 20 67 65 74 32 62 79 74 65 28 70 74 72 29 3b  = get2byte(ptr);
36190 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e  .  hdr = pPage->
361a0 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 74 65 73  hdrOffset;.  tes
361b0 74 63 61 73 65 28 20 70 63 3d 3d 67 65 74 32 62  tcase( pc==get2b
361c0 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
361d0 29 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  ) );.  testcase(
361e0 20 70 63 2b 73 7a 3d 3d 70 50 61 67 65 2d 3e 70   pc+sz==pPage->p
361f0 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29  Bt->usableSize )
36200 3b 0a 20 20 69 66 28 20 70 63 20 3c 20 28 75 33  ;.  if( pc < (u3
36210 32 29 67 65 74 32 62 79 74 65 28 26 64 61 74 61  2)get2byte(&data
36220 5b 68 64 72 2b 35 5d 29 20 7c 7c 20 70 63 2b 73  [hdr+5]) || pc+s
36230 7a 20 3e 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e  z > pPage->pBt->
36240 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20  usableSize ){.  
36250 20 20 2a 70 52 43 20 3d 20 53 51 4c 49 54 45 5f    *pRC = SQLITE_
36260 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
36270 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
36280 72 63 20 3d 20 66 72 65 65 53 70 61 63 65 28 70  rc = freeSpace(p
36290 50 61 67 65 2c 20 70 63 2c 20 73 7a 29 3b 0a 20  Page, pc, sz);. 
362a0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 2a   if( rc ){.    *
362b0 70 52 43 20 3d 20 72 63 3b 0a 20 20 20 20 72 65  pRC = rc;.    re
362c0 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 50 61 67  turn;.  }.  pPag
362d0 65 2d 3e 6e 43 65 6c 6c 2d 2d 3b 0a 20 20 69 66  e->nCell--;.  if
362e0 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d  ( pPage->nCell==
362f0 30 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28  0 ){.    memset(
36300 26 64 61 74 61 5b 68 64 72 2b 31 5d 2c 20 30 2c  &data[hdr+1], 0,
36310 20 34 29 3b 0a 20 20 20 20 64 61 74 61 5b 68 64   4);.    data[hd
36320 72 2b 37 5d 20 3d 20 30 3b 0a 20 20 20 20 70 75  r+7] = 0;.    pu
36330 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
36340 2b 35 5d 2c 20 70 50 61 67 65 2d 3e 70 42 74 2d  +5], pPage->pBt-
36350 3e 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20  >usableSize);.  
36360 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d    pPage->nFree =
36370 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61   pPage->pBt->usa
36380 62 6c 65 53 69 7a 65 20 2d 20 70 50 61 67 65 2d  bleSize - pPage-
36390 3e 68 64 72 4f 66 66 73 65 74 0a 20 20 20 20 20  >hdrOffset.     
363a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
363b0 20 20 2d 20 70 50 61 67 65 2d 3e 63 68 69 6c 64    - pPage->child
363c0 50 74 72 53 69 7a 65 20 2d 20 38 3b 0a 20 20 7d  PtrSize - 8;.  }
363d0 65 6c 73 65 7b 0a 20 20 20 20 6d 65 6d 6d 6f 76  else{.    memmov
363e0 65 28 70 74 72 2c 20 70 74 72 2b 32 2c 20 32 2a  e(ptr, ptr+2, 2*
363f0 28 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 2d 20  (pPage->nCell - 
36400 69 64 78 29 29 3b 0a 20 20 20 20 70 75 74 32 62  idx));.    put2b
36410 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d  yte(&data[hdr+3]
36420 2c 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b  , pPage->nCell);
36430 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 46 72 65  .    pPage->nFre
36440 65 20 2b 3d 20 32 3b 0a 20 20 7d 0a 7d 0a 0a 2f  e += 2;.  }.}../
36450 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 61 20 6e 65  *.** Insert a ne
36460 77 20 63 65 6c 6c 20 6f 6e 20 70 50 61 67 65 20  w cell on pPage 
36470 61 74 20 63 65 6c 6c 20 69 6e 64 65 78 20 22 69  at cell index "i
36480 22 2e 20 20 70 43 65 6c 6c 20 70 6f 69 6e 74 73  ".  pCell points
36490 20 74 6f 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65   to the.** conte
364a0 6e 74 20 6f 66 20 74 68 65 20 63 65 6c 6c 2e 0a  nt of the cell..
364b0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 65 6c  **.** If the cel
364c0 6c 20 63 6f 6e 74 65 6e 74 20 77 69 6c 6c 20 66  l content will f
364d0 69 74 20 6f 6e 20 74 68 65 20 70 61 67 65 2c 20  it on the page, 
364e0 74 68 65 6e 20 70 75 74 20 69 74 20 74 68 65 72  then put it ther
364f0 65 2e 20 20 49 66 20 69 74 0a 2a 2a 20 77 69 6c  e.  If it.** wil
36500 6c 20 6e 6f 74 20 66 69 74 2c 20 74 68 65 6e 20  l not fit, then 
36510 6d 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 74  make a copy of t
36520 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
36530 69 6e 74 6f 20 70 54 65 6d 70 20 69 66 0a 2a 2a  into pTemp if.**
36540 20 70 54 65 6d 70 20 69 73 20 6e 6f 74 20 6e 75   pTemp is not nu
36550 6c 6c 2e 20 20 52 65 67 61 72 64 6c 65 73 73 20  ll.  Regardless 
36560 6f 66 20 70 54 65 6d 70 2c 20 61 6c 6c 6f 63 61  of pTemp, alloca
36570 74 65 20 61 20 6e 65 77 20 65 6e 74 72 79 0a 2a  te a new entry.*
36580 2a 20 69 6e 20 70 50 61 67 65 2d 3e 61 70 4f 76  * in pPage->apOv
36590 66 6c 5b 5d 20 61 6e 64 20 6d 61 6b 65 20 69 74  fl[] and make it
365a0 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 63 65   point to the ce
365b0 6c 6c 20 63 6f 6e 74 65 6e 74 20 28 65 69 74 68  ll content (eith
365c0 65 72 0a 2a 2a 20 69 6e 20 70 54 65 6d 70 20 6f  er.** in pTemp o
365d0 72 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70  r the original p
365e0 43 65 6c 6c 29 20 61 6e 64 20 61 6c 73 6f 20 72  Cell) and also r
365f0 65 63 6f 72 64 20 69 74 73 20 69 6e 64 65 78 2e  ecord its index.
36600 20 0a 2a 2a 20 41 6c 6c 6f 63 61 74 69 6e 67 20   .** Allocating 
36610 61 20 6e 65 77 20 65 6e 74 72 79 20 69 6e 20 70  a new entry in p
36620 50 61 67 65 2d 3e 61 43 65 6c 6c 5b 5d 20 69 6d  Page->aCell[] im
36630 70 6c 69 65 73 20 74 68 61 74 20 0a 2a 2a 20 70  plies that .** p
36640 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20  Page->nOverflow 
36650 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 2e 0a  is incremented..
36660 2a 2a 0a 2a 2a 20 2a 70 52 43 20 6d 75 73 74 20  **.** *pRC must 
36670 62 65 20 53 51 4c 49 54 45 5f 4f 4b 20 77 68 65  be SQLITE_OK whe
36680 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
36690 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61  s called..*/.sta
366a0 74 69 63 20 76 6f 69 64 20 69 6e 73 65 72 74 43  tic void insertC
366b0 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a  ell(.  MemPage *
366c0 70 50 61 67 65 2c 20 20 20 2f 2a 20 50 61 67 65  pPage,   /* Page
366d0 20 69 6e 74 6f 20 77 68 69 63 68 20 77 65 20 61   into which we a
366e0 72 65 20 63 6f 70 79 69 6e 67 20 2a 2f 0a 20 20  re copying */.  
366f0 69 6e 74 20 69 2c 20 20 20 20 20 20 20 20 20 20  int i,          
36700 20 20 2f 2a 20 4e 65 77 20 63 65 6c 6c 20 62 65    /* New cell be
36710 63 6f 6d 65 73 20 74 68 65 20 69 2d 74 68 20 63  comes the i-th c
36720 65 6c 6c 20 6f 66 20 74 68 65 20 70 61 67 65 20  ell of the page 
36730 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20  */.  u8 *pCell, 
36740 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 6e         /* Conten
36750 74 20 6f 66 20 74 68 65 20 6e 65 77 20 63 65 6c  t of the new cel
36760 6c 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 2c 20 20  l */.  int sz,  
36770 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65           /* Byte
36780 73 20 6f 66 20 63 6f 6e 74 65 6e 74 20 69 6e 20  s of content in 
36790 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70  pCell */.  u8 *p
367a0 54 65 6d 70 2c 20 20 20 20 20 20 20 20 2f 2a 20  Temp,        /* 
367b0 54 65 6d 70 20 73 74 6f 72 61 67 65 20 73 70 61  Temp storage spa
367c0 63 65 20 66 6f 72 20 70 43 65 6c 6c 2c 20 69 66  ce for pCell, if
367d0 20 6e 65 65 64 65 64 20 2a 2f 0a 20 20 50 67 6e   needed */.  Pgn
367e0 6f 20 69 43 68 69 6c 64 2c 20 20 20 20 20 20 2f  o iChild,      /
367f0 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 72  * If non-zero, r
36800 65 70 6c 61 63 65 20 66 69 72 73 74 20 34 20 62  eplace first 4 b
36810 79 74 65 73 20 77 69 74 68 20 74 68 69 73 20 76  ytes with this v
36820 61 6c 75 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  alue */.  int *p
36830 52 43 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  RC          /* R
36840 65 61 64 20 61 6e 64 20 77 72 69 74 65 20 72 65  ead and write re
36850 74 75 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20 68  turn code from h
36860 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ere */.){.  int 
36870 69 64 78 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a  idx = 0;      /*
36880 20 57 68 65 72 65 20 74 6f 20 77 72 69 74 65 20   Where to write 
36890 6e 65 77 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  new cell content
368a0 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20   in data[] */.  
368b0 69 6e 74 20 6a 3b 20 20 20 20 20 20 20 20 20 20  int j;          
368c0 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
368d0 72 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b  r */.  u8 *data;
368e0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
368f0 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 77  content of the w
36900 68 6f 6c 65 20 70 61 67 65 20 2a 2f 0a 20 20 75  hole page */.  u
36910 38 20 2a 70 49 6e 73 3b 20 20 20 20 20 20 20 20  8 *pIns;        
36920 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 20 69 6e   /* The point in
36930 20 70 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64 78   pPage->aCellIdx
36940 5b 5d 20 77 68 65 72 65 20 6e 6f 20 63 65 6c 6c  [] where no cell
36950 20 69 6e 73 65 72 74 65 64 20 2a 2f 0a 0a 20 20   inserted */..  
36960 61 73 73 65 72 74 28 20 2a 70 52 43 3d 3d 53 51  assert( *pRC==SQ
36970 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 61 73 73  LITE_OK );.  ass
36980 65 72 74 28 20 69 3e 3d 30 20 26 26 20 69 3c 3d  ert( i>=0 && i<=
36990 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b 70 50 61  pPage->nCell+pPa
369a0 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 29 3b  ge->nOverflow );
369b0 0a 20 20 61 73 73 65 72 74 28 20 4d 58 5f 43 45  .  assert( MX_CE
369c0 4c 4c 28 70 50 61 67 65 2d 3e 70 42 74 29 3c 3d  LL(pPage->pBt)<=
369d0 31 30 39 32 31 20 29 3b 0a 20 20 61 73 73 65 72  10921 );.  asser
369e0 74 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3c  t( pPage->nCell<
369f0 3d 4d 58 5f 43 45 4c 4c 28 70 50 61 67 65 2d 3e  =MX_CELL(pPage->
36a00 70 42 74 29 20 7c 7c 20 43 4f 52 52 55 50 54 5f  pBt) || CORRUPT_
36a10 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  DB );.  assert( 
36a20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
36a30 3c 3d 41 72 72 61 79 53 69 7a 65 28 70 50 61 67  <=ArraySize(pPag
36a40 65 2d 3e 61 70 4f 76 66 6c 29 20 29 3b 0a 20 20  e->apOvfl) );.  
36a50 61 73 73 65 72 74 28 20 41 72 72 61 79 53 69 7a  assert( ArraySiz
36a60 65 28 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c 29  e(pPage->apOvfl)
36a70 3d 3d 41 72 72 61 79 53 69 7a 65 28 70 50 61 67  ==ArraySize(pPag
36a80 65 2d 3e 61 69 4f 76 66 6c 29 20 29 3b 0a 20 20  e->aiOvfl) );.  
36a90 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
36aa0 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
36ab0 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
36ac0 0a 20 20 2f 2a 20 54 68 65 20 63 65 6c 6c 20 73  .  /* The cell s
36ad0 68 6f 75 6c 64 20 6e 6f 72 6d 61 6c 6c 79 20 62  hould normally b
36ae0 65 20 73 69 7a 65 64 20 63 6f 72 72 65 63 74 6c  e sized correctl
36af0 79 2e 20 20 48 6f 77 65 76 65 72 2c 20 77 68 65  y.  However, whe
36b00 6e 20 6d 6f 76 69 6e 67 20 61 0a 20 20 2a 2a 20  n moving a.  ** 
36b10 6d 61 6c 66 6f 72 6d 65 64 20 63 65 6c 6c 20 66  malformed cell f
36b20 72 6f 6d 20 61 20 6c 65 61 66 20 70 61 67 65 20  rom a leaf page 
36b30 74 6f 20 61 6e 20 69 6e 74 65 72 69 6f 72 20 70  to an interior p
36b40 61 67 65 2c 20 69 66 20 74 68 65 20 63 65 6c 6c  age, if the cell
36b50 20 73 69 7a 65 0a 20 20 2a 2a 20 77 61 6e 74 65   size.  ** wante
36b60 64 20 74 6f 20 62 65 20 6c 65 73 73 20 74 68 61  d to be less tha
36b70 6e 20 34 20 62 75 74 20 67 6f 74 20 72 6f 75 6e  n 4 but got roun
36b80 64 65 64 20 75 70 20 74 6f 20 34 20 6f 6e 20 74  ded up to 4 on t
36b90 68 65 20 6c 65 61 66 2c 20 74 68 65 6e 20 73 69  he leaf, then si
36ba0 7a 65 0a 20 20 2a 2a 20 6d 69 67 68 74 20 62 65  ze.  ** might be
36bb0 20 6c 65 73 73 20 74 68 61 6e 20 38 20 28 6c 65   less than 8 (le
36bc0 61 66 2d 73 69 7a 65 20 2b 20 70 6f 69 6e 74 65  af-size + pointe
36bd0 72 29 20 6f 6e 20 74 68 65 20 69 6e 74 65 72 69  r) on the interi
36be0 6f 72 20 6e 6f 64 65 2e 20 20 48 65 6e 63 65 0a  or node.  Hence.
36bf0 20 20 2a 2a 20 74 68 65 20 74 65 72 6d 20 61 66    ** the term af
36c00 74 65 72 20 74 68 65 20 7c 7c 20 69 6e 20 74 68  ter the || in th
36c10 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65  e following asse
36c20 72 74 28 29 2e 20 2a 2f 0a 20 20 61 73 73 65 72  rt(). */.  asser
36c30 74 28 20 73 7a 3d 3d 70 50 61 67 65 2d 3e 78 43  t( sz==pPage->xC
36c40 65 6c 6c 53 69 7a 65 28 70 50 61 67 65 2c 20 70  ellSize(pPage, p
36c50 43 65 6c 6c 29 20 7c 7c 20 28 73 7a 3d 3d 38 20  Cell) || (sz==8 
36c60 26 26 20 69 43 68 69 6c 64 3e 30 29 20 29 3b 0a  && iChild>0) );.
36c70 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 4f 76    if( pPage->nOv
36c80 65 72 66 6c 6f 77 20 7c 7c 20 73 7a 2b 32 3e 70  erflow || sz+2>p
36c90 50 61 67 65 2d 3e 6e 46 72 65 65 20 29 7b 0a 20  Page->nFree ){. 
36ca0 20 20 20 69 66 28 20 70 54 65 6d 70 20 29 7b 0a     if( pTemp ){.
36cb0 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 54 65        memcpy(pTe
36cc0 6d 70 2c 20 70 43 65 6c 6c 2c 20 73 7a 29 3b 0a  mp, pCell, sz);.
36cd0 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 70 54        pCell = pT
36ce0 65 6d 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  emp;.    }.    i
36cf0 66 28 20 69 43 68 69 6c 64 20 29 7b 0a 20 20 20  f( iChild ){.   
36d00 20 20 20 70 75 74 34 62 79 74 65 28 70 43 65 6c     put4byte(pCel
36d10 6c 2c 20 69 43 68 69 6c 64 29 3b 0a 20 20 20 20  l, iChild);.    
36d20 7d 0a 20 20 20 20 6a 20 3d 20 70 50 61 67 65 2d  }.    j = pPage-
36d30 3e 6e 4f 76 65 72 66 6c 6f 77 2b 2b 3b 0a 20 20  >nOverflow++;.  
36d40 20 20 2f 2a 20 43 6f 6d 70 61 72 69 73 6f 6e 20    /* Comparison 
36d50 61 67 61 69 6e 73 74 20 41 72 72 61 79 53 69 7a  against ArraySiz
36d60 65 2d 31 20 73 69 6e 63 65 20 77 65 20 68 6f 6c  e-1 since we hol
36d70 64 20 62 61 63 6b 20 6f 6e 65 20 65 78 74 72 61  d back one extra
36d80 20 73 6c 6f 74 0a 20 20 20 20 2a 2a 20 61 73 20   slot.    ** as 
36d90 61 20 63 6f 6e 74 69 6e 67 65 6e 63 79 2e 20 20  a contingency.  
36da0 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
36db0 6e 65 76 65 72 20 6e 65 65 64 20 6d 6f 72 65 20  never need more 
36dc0 74 68 61 6e 20 33 20 6f 76 65 72 66 6c 6f 77 0a  than 3 overflow.
36dd0 20 20 20 20 2a 2a 20 73 6c 6f 74 73 20 62 75 74      ** slots but
36de0 20 34 20 61 72 65 20 61 6c 6c 6f 63 61 74 65 64   4 are allocated
36df0 2c 20 6a 75 73 74 20 74 6f 20 62 65 20 73 61 66  , just to be saf
36e00 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  e. */.    assert
36e10 28 20 6a 20 3c 20 41 72 72 61 79 53 69 7a 65 28  ( j < ArraySize(
36e20 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c 29 2d 31  pPage->apOvfl)-1
36e30 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 61   );.    pPage->a
36e40 70 4f 76 66 6c 5b 6a 5d 20 3d 20 70 43 65 6c 6c  pOvfl[j] = pCell
36e50 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 61 69 4f  ;.    pPage->aiO
36e60 76 66 6c 5b 6a 5d 20 3d 20 28 75 31 36 29 69 3b  vfl[j] = (u16)i;
36e70 0a 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 6d 75  ..    /* When mu
36e80 6c 74 69 70 6c 65 20 6f 76 65 72 66 6c 6f 77 73  ltiple overflows
36e90 20 6f 63 63 75 72 2c 20 74 68 65 79 20 61 72 65   occur, they are
36ea0 20 61 6c 77 61 79 73 20 73 65 71 75 65 6e 74 69   always sequenti
36eb0 61 6c 20 61 6e 64 20 69 6e 0a 20 20 20 20 2a 2a  al and in.    **
36ec0 20 73 6f 72 74 65 64 20 6f 72 64 65 72 2e 20 20   sorted order.  
36ed0 54 68 69 73 20 69 6e 76 61 72 69 61 6e 74 73 20  This invariants 
36ee0 61 72 69 73 65 20 62 65 63 61 75 73 65 20 6d 75  arise because mu
36ef0 6c 74 69 70 6c 65 20 6f 76 65 72 66 6c 6f 77 73  ltiple overflows
36f00 20 63 61 6e 0a 20 20 20 20 2a 2a 20 6f 6e 6c 79   can.    ** only
36f10 20 6f 63 63 75 72 20 77 68 65 6e 20 69 6e 73 65   occur when inse
36f20 72 74 69 6e 67 20 64 69 76 69 64 65 72 20 63 65  rting divider ce
36f30 6c 6c 73 20 69 6e 74 6f 20 74 68 65 20 70 61 72  lls into the par
36f40 65 6e 74 20 70 61 67 65 20 64 75 72 69 6e 67 0a  ent page during.
36f50 20 20 20 20 2a 2a 20 62 61 6c 61 6e 63 69 6e 67      ** balancing
36f60 2c 20 61 6e 64 20 74 68 65 20 64 69 76 69 64 65  , and the divide
36f70 72 73 20 61 72 65 20 61 64 6a 61 63 65 6e 74 20  rs are adjacent 
36f80 61 6e 64 20 73 6f 72 74 65 64 2e 0a 20 20 20 20  and sorted..    
36f90 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 6a  */.    assert( j
36fa0 3d 3d 30 20 7c 7c 20 70 50 61 67 65 2d 3e 61 69  ==0 || pPage->ai
36fb0 4f 76 66 6c 5b 6a 2d 31 5d 3c 28 75 31 36 29 69  Ovfl[j-1]<(u16)i
36fc0 20 29 3b 20 2f 2a 20 4f 76 65 72 66 6c 6f 77 73   ); /* Overflows
36fd0 20 69 6e 20 73 6f 72 74 65 64 20 6f 72 64 65 72   in sorted order
36fe0 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
36ff0 6a 3d 3d 30 20 7c 7c 20 69 3d 3d 70 50 61 67 65  j==0 || i==pPage
37000 2d 3e 61 69 4f 76 66 6c 5b 6a 2d 31 5d 2b 31 20  ->aiOvfl[j-1]+1 
37010 29 3b 20 20 20 2f 2a 20 4f 76 65 72 66 6c 6f 77  );   /* Overflow
37020 73 20 61 72 65 20 73 65 71 75 65 6e 74 69 61 6c  s are sequential
37030 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   */.  }else{.   
37040 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65   int rc = sqlite
37050 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67  3PagerWrite(pPag
37060 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  e->pDbPage);.   
37070 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
37080 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 43  OK ){.      *pRC
37090 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 72 65 74   = rc;.      ret
370a0 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  urn;.    }.    a
370b0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
370c0 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
370d0 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
370e0 3b 0a 20 20 20 20 64 61 74 61 20 3d 20 70 50 61  ;.    data = pPa
370f0 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 61  ge->aData;.    a
37100 73 73 65 72 74 28 20 26 64 61 74 61 5b 70 50 61  ssert( &data[pPa
37110 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 5d 3d  ge->cellOffset]=
37120 3d 70 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64 78  =pPage->aCellIdx
37130 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 61 6c 6c   );.    rc = all
37140 6f 63 61 74 65 53 70 61 63 65 28 70 50 61 67 65  ocateSpace(pPage
37150 2c 20 73 7a 2c 20 26 69 64 78 29 3b 0a 20 20 20  , sz, &idx);.   
37160 20 69 66 28 20 72 63 20 29 7b 20 2a 70 52 43 20   if( rc ){ *pRC 
37170 3d 20 72 63 3b 20 72 65 74 75 72 6e 3b 20 7d 0a  = rc; return; }.
37180 20 20 20 20 2f 2a 20 54 68 65 20 61 6c 6c 6f 63      /* The alloc
37190 61 74 65 53 70 61 63 65 28 29 20 72 6f 75 74 69  ateSpace() routi
371a0 6e 65 20 67 75 61 72 61 6e 74 65 65 73 20 74 68  ne guarantees th
371b0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 72 6f 70  e following prop
371c0 65 72 74 69 65 73 0a 20 20 20 20 2a 2a 20 69 66  erties.    ** if
371d0 20 69 74 20 72 65 74 75 72 6e 73 20 73 75 63 63   it returns succ
371e0 65 73 73 66 75 6c 6c 79 20 2a 2f 0a 20 20 20 20  essfully */.    
371f0 61 73 73 65 72 74 28 20 69 64 78 20 3e 3d 20 30  assert( idx >= 0
37200 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
37210 69 64 78 20 3e 3d 20 70 50 61 67 65 2d 3e 63 65  idx >= pPage->ce
37220 6c 6c 4f 66 66 73 65 74 2b 32 2a 70 50 61 67 65  llOffset+2*pPage
37230 2d 3e 6e 43 65 6c 6c 2b 32 20 7c 7c 20 43 4f 52  ->nCell+2 || COR
37240 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 20 20 61  RUPT_DB );.    a
37250 73 73 65 72 74 28 20 69 64 78 2b 73 7a 20 3c 3d  ssert( idx+sz <=
37260 20 28 69 6e 74 29 70 50 61 67 65 2d 3e 70 42 74   (int)pPage->pBt
37270 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a  ->usableSize );.
37280 20 20 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65      pPage->nFree
37290 20 2d 3d 20 28 75 31 36 29 28 32 20 2b 20 73 7a   -= (u16)(2 + sz
372a0 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 64  );.    memcpy(&d
372b0 61 74 61 5b 69 64 78 5d 2c 20 70 43 65 6c 6c 2c  ata[idx], pCell,
372c0 20 73 7a 29 3b 0a 20 20 20 20 69 66 28 20 69 43   sz);.    if( iC
372d0 68 69 6c 64 20 29 7b 0a 20 20 20 20 20 20 70 75  hild ){.      pu
372e0 74 34 62 79 74 65 28 26 64 61 74 61 5b 69 64 78  t4byte(&data[idx
372f0 5d 2c 20 69 43 68 69 6c 64 29 3b 0a 20 20 20 20  ], iChild);.    
37300 7d 0a 20 20 20 20 70 49 6e 73 20 3d 20 70 50 61  }.    pIns = pPa
37310 67 65 2d 3e 61 43 65 6c 6c 49 64 78 20 2b 20 69  ge->aCellIdx + i
37320 2a 32 3b 0a 20 20 20 20 6d 65 6d 6d 6f 76 65 28  *2;.    memmove(
37330 70 49 6e 73 2b 32 2c 20 70 49 6e 73 2c 20 32 2a  pIns+2, pIns, 2*
37340 28 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 2d 20  (pPage->nCell - 
37350 69 29 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74  i));.    put2byt
37360 65 28 70 49 6e 73 2c 20 69 64 78 29 3b 0a 20 20  e(pIns, idx);.  
37370 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b 2b    pPage->nCell++
37380 3b 0a 20 20 20 20 2f 2a 20 69 6e 63 72 65 6d 65  ;.    /* increme
37390 6e 74 20 74 68 65 20 63 65 6c 6c 20 63 6f 75 6e  nt the cell coun
373a0 74 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 2b 2b  t */.    if( (++
373b0 64 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f  data[pPage->hdrO
373c0 66 66 73 65 74 2b 34 5d 29 3d 3d 30 20 29 20 64  ffset+4])==0 ) d
373d0 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66  ata[pPage->hdrOf
373e0 66 73 65 74 2b 33 5d 2b 2b 3b 0a 20 20 20 20 61  fset+3]++;.    a
373f0 73 73 65 72 74 28 20 67 65 74 32 62 79 74 65 28  ssert( get2byte(
37400 26 64 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72  &data[pPage->hdr
37410 4f 66 66 73 65 74 2b 33 5d 29 3d 3d 70 50 61 67  Offset+3])==pPag
37420 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 23 69 66 6e  e->nCell );.#ifn
37430 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
37440 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69  AUTOVACUUM.    i
37450 66 28 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 61  f( pPage->pBt->a
37460 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20  utoVacuum ){.   
37470 20 20 20 2f 2a 20 54 68 65 20 63 65 6c 6c 20 6d     /* The cell m
37480 61 79 20 63 6f 6e 74 61 69 6e 20 61 20 70 6f 69  ay contain a poi
37490 6e 74 65 72 20 74 6f 20 61 6e 20 6f 76 65 72 66  nter to an overf
374a0 6c 6f 77 20 70 61 67 65 2e 20 49 66 20 73 6f 2c  low page. If so,
374b0 20 77 72 69 74 65 0a 20 20 20 20 20 20 2a 2a 20   write.      ** 
374c0 74 68 65 20 65 6e 74 72 79 20 66 6f 72 20 74 68  the entry for th
374d0 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  e overflow page 
374e0 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72  into the pointer
374f0 20 6d 61 70 2e 0a 20 20 20 20 20 20 2a 2f 0a 20   map..      */. 
37500 20 20 20 20 20 70 74 72 6d 61 70 50 75 74 4f 76       ptrmapPutOv
37510 66 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65  flPtr(pPage, pCe
37520 6c 6c 2c 20 70 52 43 29 3b 0a 20 20 20 20 7d 0a  ll, pRC);.    }.
37530 23 65 6e 64 69 66 0a 20 20 7d 0a 7d 0a 0a 2f 2a  #endif.  }.}../*
37540 0a 2a 2a 20 41 20 43 65 6c 6c 41 72 72 61 79 20  .** A CellArray 
37550 6f 62 6a 65 63 74 20 63 6f 6e 74 61 69 6e 73 20  object contains 
37560 61 20 63 61 63 68 65 20 6f 66 20 70 6f 69 6e 74  a cache of point
37570 65 72 73 20 61 6e 64 20 73 69 7a 65 73 20 66 6f  ers and sizes fo
37580 72 20 61 0a 2a 2a 20 63 6f 6e 73 65 63 75 74 69  r a.** consecuti
37590 76 65 20 73 65 71 75 65 6e 63 65 20 6f 66 20 63  ve sequence of c
375a0 65 6c 6c 73 20 74 68 61 74 20 6d 69 67 68 74 20  ells that might 
375b0 62 65 20 68 65 6c 64 20 6f 6e 20 6d 75 6c 74 69  be held on multi
375c0 70 6c 65 20 70 61 67 65 73 2e 0a 2a 2f 0a 74 79  ple pages..*/.ty
375d0 70 65 64 65 66 20 73 74 72 75 63 74 20 43 65 6c  pedef struct Cel
375e0 6c 41 72 72 61 79 20 43 65 6c 6c 41 72 72 61 79  lArray CellArray
375f0 3b 0a 73 74 72 75 63 74 20 43 65 6c 6c 41 72 72  ;.struct CellArr
37600 61 79 20 7b 0a 20 20 69 6e 74 20 6e 43 65 6c 6c  ay {.  int nCell
37610 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
37620 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c  * Number of cell
37630 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 2a 2f  s in apCell[] */
37640 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 52 65 66  .  MemPage *pRef
37650 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65  ;          /* Re
37660 66 65 72 65 6e 63 65 20 70 61 67 65 20 2a 2f 0a  ference page */.
37670 20 20 75 38 20 2a 2a 61 70 43 65 6c 6c 3b 20 20    u8 **apCell;  
37680 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c            /* All
37690 20 63 65 6c 6c 73 20 62 65 67 69 6e 20 62 61 6c   cells begin bal
376a0 61 6e 63 65 64 20 2a 2f 0a 20 20 75 31 36 20 2a  anced */.  u16 *
376b0 73 7a 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20  szCell;         
376c0 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 73 69 7a 65     /* Local size
376d0 20 6f 66 20 61 6c 6c 20 63 65 6c 6c 73 20 69 6e   of all cells in
376e0 20 61 70 43 65 6c 6c 5b 5d 20 2a 2f 0a 7d 3b 0a   apCell[] */.};.
376f0 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65  ./*.** Make sure
37700 20 74 68 65 20 63 65 6c 6c 20 73 69 7a 65 73 20   the cell sizes 
37710 61 74 20 69 64 78 2c 20 69 64 78 2b 31 2c 20 2e  at idx, idx+1, .
37720 2e 2e 2c 20 69 64 78 2b 4e 2d 31 20 68 61 76 65  .., idx+N-1 have
37730 20 62 65 65 6e 0a 2a 2a 20 63 6f 6d 70 75 74 65   been.** compute
37740 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
37750 64 20 70 6f 70 75 6c 61 74 65 43 65 6c 6c 43 61  d populateCellCa
37760 63 68 65 28 43 65 6c 6c 41 72 72 61 79 20 2a 70  che(CellArray *p
37770 2c 20 69 6e 74 20 69 64 78 2c 20 69 6e 74 20 4e  , int idx, int N
37780 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 64 78  ){.  assert( idx
37790 3e 3d 30 20 26 26 20 69 64 78 2b 4e 3c 3d 70 2d  >=0 && idx+N<=p-
377a0 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 77 68 69 6c  >nCell );.  whil
377b0 65 28 20 4e 3e 30 20 29 7b 0a 20 20 20 20 61 73  e( N>0 ){.    as
377c0 73 65 72 74 28 20 70 2d 3e 61 70 43 65 6c 6c 5b  sert( p->apCell[
377d0 69 64 78 5d 21 3d 30 20 29 3b 0a 20 20 20 20 69  idx]!=0 );.    i
377e0 66 28 20 70 2d 3e 73 7a 43 65 6c 6c 5b 69 64 78  f( p->szCell[idx
377f0 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d  ]==0 ){.      p-
37800 3e 73 7a 43 65 6c 6c 5b 69 64 78 5d 20 3d 20 70  >szCell[idx] = p
37810 2d 3e 70 52 65 66 2d 3e 78 43 65 6c 6c 53 69 7a  ->pRef->xCellSiz
37820 65 28 70 2d 3e 70 52 65 66 2c 20 70 2d 3e 61 70  e(p->pRef, p->ap
37830 43 65 6c 6c 5b 69 64 78 5d 29 3b 0a 20 20 20 20  Cell[idx]);.    
37840 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73  }else{.      ass
37850 65 72 74 28 20 43 4f 52 52 55 50 54 5f 44 42 20  ert( CORRUPT_DB 
37860 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ||.             
37870 20 70 2d 3e 73 7a 43 65 6c 6c 5b 69 64 78 5d 3d   p->szCell[idx]=
37880 3d 70 2d 3e 70 52 65 66 2d 3e 78 43 65 6c 6c 53  =p->pRef->xCellS
37890 69 7a 65 28 70 2d 3e 70 52 65 66 2c 20 70 2d 3e  ize(p->pRef, p->
378a0 61 70 43 65 6c 6c 5b 69 64 78 5d 29 20 29 3b 0a  apCell[idx]) );.
378b0 20 20 20 20 7d 0a 20 20 20 20 69 64 78 2b 2b 3b      }.    idx++;
378c0 0a 20 20 20 20 4e 2d 2d 3b 0a 20 20 7d 0a 7d 0a  .    N--;.  }.}.
378d0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
378e0 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 4e 74  e size of the Nt
378f0 68 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65  h element of the
37900 20 63 65 6c 6c 20 61 72 72 61 79 0a 2a 2f 0a 73   cell array.*/.s
37910 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49  tatic SQLITE_NOI
37920 4e 4c 49 4e 45 20 75 31 36 20 63 6f 6d 70 75 74  NLINE u16 comput
37930 65 43 65 6c 6c 53 69 7a 65 28 43 65 6c 6c 41 72  eCellSize(CellAr
37940 72 61 79 20 2a 70 2c 20 69 6e 74 20 4e 29 7b 0a  ray *p, int N){.
37950 20 20 61 73 73 65 72 74 28 20 4e 3e 3d 30 20 26    assert( N>=0 &
37960 26 20 4e 3c 70 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  & N<p->nCell );.
37970 20 20 61 73 73 65 72 74 28 20 70 2d 3e 73 7a 43    assert( p->szC
37980 65 6c 6c 5b 4e 5d 3d 3d 30 20 29 3b 0a 20 20 70  ell[N]==0 );.  p
37990 2d 3e 73 7a 43 65 6c 6c 5b 4e 5d 20 3d 20 70 2d  ->szCell[N] = p-
379a0 3e 70 52 65 66 2d 3e 78 43 65 6c 6c 53 69 7a 65  >pRef->xCellSize
379b0 28 70 2d 3e 70 52 65 66 2c 20 70 2d 3e 61 70 43  (p->pRef, p->apC
379c0 65 6c 6c 5b 4e 5d 29 3b 0a 20 20 72 65 74 75 72  ell[N]);.  retur
379d0 6e 20 70 2d 3e 73 7a 43 65 6c 6c 5b 4e 5d 3b 0a  n p->szCell[N];.
379e0 7d 0a 73 74 61 74 69 63 20 75 31 36 20 63 61 63  }.static u16 cac
379f0 68 65 64 43 65 6c 6c 53 69 7a 65 28 43 65 6c 6c  hedCellSize(Cell
37a00 41 72 72 61 79 20 2a 70 2c 20 69 6e 74 20 4e 29  Array *p, int N)
37a10 7b 0a 20 20 61 73 73 65 72 74 28 20 4e 3e 3d 30  {.  assert( N>=0
37a20 20 26 26 20 4e 3c 70 2d 3e 6e 43 65 6c 6c 20 29   && N<p->nCell )
37a30 3b 0a 20 20 69 66 28 20 70 2d 3e 73 7a 43 65 6c  ;.  if( p->szCel
37a40 6c 5b 4e 5d 20 29 20 72 65 74 75 72 6e 20 70 2d  l[N] ) return p-
37a50 3e 73 7a 43 65 6c 6c 5b 4e 5d 3b 0a 20 20 72 65  >szCell[N];.  re
37a60 74 75 72 6e 20 63 6f 6d 70 75 74 65 43 65 6c 6c  turn computeCell
37a70 53 69 7a 65 28 70 2c 20 4e 29 3b 0a 7d 0a 0a 2f  Size(p, N);.}../
37a80 2a 0a 2a 2a 20 41 72 72 61 79 20 61 70 43 65 6c  *.** Array apCel
37a90 6c 5b 5d 20 63 6f 6e 74 61 69 6e 73 20 70 6f 69  l[] contains poi
37aa0 6e 74 65 72 73 20 74 6f 20 6e 43 65 6c 6c 20 62  nters to nCell b
37ab0 2d 74 72 65 65 20 70 61 67 65 20 63 65 6c 6c 73  -tree page cells
37ac0 2e 20 54 68 65 20 0a 2a 2a 20 73 7a 43 65 6c 6c  . The .** szCell
37ad0 5b 5d 20 61 72 72 61 79 20 63 6f 6e 74 61 69 6e  [] array contain
37ae0 73 20 74 68 65 20 73 69 7a 65 20 69 6e 20 62 79  s the size in by
37af0 74 65 73 20 6f 66 20 65 61 63 68 20 63 65 6c 6c  tes of each cell
37b00 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a  . This function.
37b10 2a 2a 20 72 65 70 6c 61 63 65 73 20 74 68 65 20  ** replaces the 
37b20 63 75 72 72 65 6e 74 20 63 6f 6e 74 65 6e 74 73  current contents
37b30 20 6f 66 20 70 61 67 65 20 70 50 67 20 77 69 74   of page pPg wit
37b40 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  h the contents o
37b50 66 20 74 68 65 20 63 65 6c 6c 0a 2a 2a 20 61 72  f the cell.** ar
37b60 72 61 79 2e 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 20  ray..**.** Some 
37b70 6f 66 20 74 68 65 20 63 65 6c 6c 73 20 69 6e 20  of the cells in 
37b80 61 70 43 65 6c 6c 5b 5d 20 6d 61 79 20 63 75 72  apCell[] may cur
37b90 72 65 6e 74 6c 79 20 62 65 20 73 74 6f 72 65 64  rently be stored
37ba0 20 69 6e 20 70 50 67 2e 20 54 68 69 73 0a 2a 2a   in pPg. This.**
37bb0 20 66 75 6e 63 74 69 6f 6e 20 77 6f 72 6b 73 20   function works 
37bc0 61 72 6f 75 6e 64 20 70 72 6f 62 6c 65 6d 73 20  around problems 
37bd0 63 61 75 73 65 64 20 62 79 20 74 68 69 73 20 62  caused by this b
37be0 79 20 6d 61 6b 69 6e 67 20 61 20 63 6f 70 79 20  y making a copy 
37bf0 6f 66 20 61 6e 79 20 0a 2a 2a 20 73 75 63 68 20  of any .** such 
37c00 63 65 6c 6c 73 20 62 65 66 6f 72 65 20 6f 76 65  cells before ove
37c10 72 77 72 69 74 69 6e 67 20 74 68 65 20 70 61 67  rwriting the pag
37c20 65 20 64 61 74 61 2e 0a 2a 2a 0a 2a 2a 20 54 68  e data..**.** Th
37c30 65 20 4d 65 6d 50 61 67 65 2e 6e 46 72 65 65 20  e MemPage.nFree 
37c40 66 69 65 6c 64 20 69 73 20 69 6e 76 61 6c 69 64  field is invalid
37c50 61 74 65 64 20 62 79 20 74 68 69 73 20 66 75 6e  ated by this fun
37c60 63 74 69 6f 6e 2e 20 49 74 20 69 73 20 74 68 65  ction. It is the
37c70 20 0a 2a 2a 20 72 65 73 70 6f 6e 73 69 62 69 6c   .** responsibil
37c80 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65  ity of the calle
37c90 72 20 74 6f 20 73 65 74 20 69 74 20 63 6f 72 72  r to set it corr
37ca0 65 63 74 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  ectly..*/.static
37cb0 20 69 6e 74 20 72 65 62 75 69 6c 64 50 61 67 65   int rebuildPage
37cc0 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 67  (.  MemPage *pPg
37cd0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
37ce0 20 20 20 20 2f 2a 20 45 64 69 74 20 74 68 69 73      /* Edit this
37cf0 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 6e   page */.  int n
37d00 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20  Cell,           
37d10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
37d20 6e 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 63 65  nal number of ce
37d30 6c 6c 73 20 6f 6e 20 70 61 67 65 20 2a 2f 0a 20  lls on page */. 
37d40 20 75 38 20 2a 2a 61 70 43 65 6c 6c 2c 20 20 20   u8 **apCell,   
37d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37d60 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 63 65 6c   /* Array of cel
37d70 6c 73 20 2a 2f 0a 20 20 75 31 36 20 2a 73 7a 43  ls */.  u16 *szC
37d80 65 6c 6c 20 20 20 20 20 20 20 20 20 20 20 20 20  ell             
37d90 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79          /* Array
37da0 20 6f 66 20 63 65 6c 6c 20 73 69 7a 65 73 20 2a   of cell sizes *
37db0 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 69 6e 74  /.){.  const int
37dc0 20 68 64 72 20 3d 20 70 50 67 2d 3e 68 64 72 4f   hdr = pPg->hdrO
37dd0 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 20 20  ffset;          
37de0 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 68 65 61  /* Offset of hea
37df0 64 65 72 20 6f 6e 20 70 50 67 20 2a 2f 0a 20 20  der on pPg */.  
37e00 75 38 20 2a 20 63 6f 6e 73 74 20 61 44 61 74 61  u8 * const aData
37e10 20 3d 20 70 50 67 2d 3e 61 44 61 74 61 3b 20 20   = pPg->aData;  
37e20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
37e30 74 65 72 20 74 6f 20 64 61 74 61 20 66 6f 72 20  ter to data for 
37e40 70 50 67 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 69  pPg */.  const i
37e50 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20  nt usableSize = 
37e60 70 50 67 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  pPg->pBt->usable
37e70 53 69 7a 65 3b 0a 20 20 75 38 20 2a 20 63 6f 6e  Size;.  u8 * con
37e80 73 74 20 70 45 6e 64 20 3d 20 26 61 44 61 74 61  st pEnd = &aData
37e90 5b 75 73 61 62 6c 65 53 69 7a 65 5d 3b 0a 20 20  [usableSize];.  
37ea0 69 6e 74 20 69 3b 0a 20 20 75 38 20 2a 70 43 65  int i;.  u8 *pCe
37eb0 6c 6c 70 74 72 20 3d 20 70 50 67 2d 3e 61 43 65  llptr = pPg->aCe
37ec0 6c 6c 49 64 78 3b 0a 20 20 75 38 20 2a 70 54 6d  llIdx;.  u8 *pTm
37ed0 70 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  p = sqlite3Pager
37ee0 54 65 6d 70 53 70 61 63 65 28 70 50 67 2d 3e 70  TempSpace(pPg->p
37ef0 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 75  Bt->pPager);.  u
37f00 38 20 2a 70 44 61 74 61 3b 0a 0a 20 20 69 20 3d  8 *pData;..  i =
37f10 20 67 65 74 32 62 79 74 65 28 26 61 44 61 74 61   get2byte(&aData
37f20 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 6d 65 6d 63  [hdr+5]);.  memc
37f30 70 79 28 26 70 54 6d 70 5b 69 5d 2c 20 26 61 44  py(&pTmp[i], &aD
37f40 61 74 61 5b 69 5d 2c 20 75 73 61 62 6c 65 53 69  ata[i], usableSi
37f50 7a 65 20 2d 20 69 29 3b 0a 0a 20 20 70 44 61 74  ze - i);..  pDat
37f60 61 20 3d 20 70 45 6e 64 3b 0a 20 20 66 6f 72 28  a = pEnd;.  for(
37f70 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b  i=0; i<nCell; i+
37f80 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70 43 65 6c  +){.    u8 *pCel
37f90 6c 20 3d 20 61 70 43 65 6c 6c 5b 69 5d 3b 0a 20  l = apCell[i];. 
37fa0 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 57 49     if( SQLITE_WI
37fb0 54 48 49 4e 28 70 43 65 6c 6c 2c 61 44 61 74 61  THIN(pCell,aData
37fc0 2c 70 45 6e 64 29 20 29 7b 0a 20 20 20 20 20 20  ,pEnd) ){.      
37fd0 70 43 65 6c 6c 20 3d 20 26 70 54 6d 70 5b 70 43  pCell = &pTmp[pC
37fe0 65 6c 6c 20 2d 20 61 44 61 74 61 5d 3b 0a 20 20  ell - aData];.  
37ff0 20 20 7d 0a 20 20 20 20 70 44 61 74 61 20 2d 3d    }.    pData -=
38000 20 73 7a 43 65 6c 6c 5b 69 5d 3b 0a 20 20 20 20   szCell[i];.    
38010 70 75 74 32 62 79 74 65 28 70 43 65 6c 6c 70 74  put2byte(pCellpt
38020 72 2c 20 28 70 44 61 74 61 20 2d 20 61 44 61 74  r, (pData - aDat
38030 61 29 29 3b 0a 20 20 20 20 70 43 65 6c 6c 70 74  a));.    pCellpt
38040 72 20 2b 3d 20 32 3b 0a 20 20 20 20 69 66 28 20  r += 2;.    if( 
38050 70 44 61 74 61 20 3c 20 70 43 65 6c 6c 70 74 72  pData < pCellptr
38060 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
38070 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
38080 20 20 20 6d 65 6d 63 70 79 28 70 44 61 74 61 2c     memcpy(pData,
38090 20 70 43 65 6c 6c 2c 20 73 7a 43 65 6c 6c 5b 69   pCell, szCell[i
380a0 5d 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ]);.    assert( 
380b0 73 7a 43 65 6c 6c 5b 69 5d 3d 3d 70 50 67 2d 3e  szCell[i]==pPg->
380c0 78 43 65 6c 6c 53 69 7a 65 28 70 50 67 2c 20 70  xCellSize(pPg, p
380d0 43 65 6c 6c 29 20 7c 7c 20 43 4f 52 52 55 50 54  Cell) || CORRUPT
380e0 5f 44 42 20 29 3b 0a 20 20 20 20 74 65 73 74 63  _DB );.    testc
380f0 61 73 65 28 20 73 7a 43 65 6c 6c 5b 69 5d 21 3d  ase( szCell[i]!=
38100 70 50 67 2d 3e 78 43 65 6c 6c 53 69 7a 65 28 70  pPg->xCellSize(p
38110 50 67 2c 70 43 65 6c 6c 29 20 29 3b 0a 20 20 7d  Pg,pCell) );.  }
38120 0a 0a 20 20 2f 2a 20 54 68 65 20 70 50 67 2d 3e  ..  /* The pPg->
38130 6e 46 72 65 65 20 66 69 65 6c 64 20 69 73 20 6e  nFree field is n
38140 6f 77 20 73 65 74 20 69 6e 63 6f 72 72 65 63 74  ow set incorrect
38150 6c 79 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 77  ly. The caller w
38160 69 6c 6c 20 66 69 78 20 69 74 2e 20 2a 2f 0a 20  ill fix it. */. 
38170 20 70 50 67 2d 3e 6e 43 65 6c 6c 20 3d 20 6e 43   pPg->nCell = nC
38180 65 6c 6c 3b 0a 20 20 70 50 67 2d 3e 6e 4f 76 65  ell;.  pPg->nOve
38190 72 66 6c 6f 77 20 3d 20 30 3b 0a 0a 20 20 70 75  rflow = 0;..  pu
381a0 74 32 62 79 74 65 28 26 61 44 61 74 61 5b 68 64  t2byte(&aData[hd
381b0 72 2b 31 5d 2c 20 30 29 3b 0a 20 20 70 75 74 32  r+1], 0);.  put2
381c0 62 79 74 65 28 26 61 44 61 74 61 5b 68 64 72 2b  byte(&aData[hdr+
381d0 33 5d 2c 20 70 50 67 2d 3e 6e 43 65 6c 6c 29 3b  3], pPg->nCell);
381e0 0a 20 20 70 75 74 32 62 79 74 65 28 26 61 44 61  .  put2byte(&aDa
381f0 74 61 5b 68 64 72 2b 35 5d 2c 20 70 44 61 74 61  ta[hdr+5], pData
38200 20 2d 20 61 44 61 74 61 29 3b 0a 20 20 61 44 61   - aData);.  aDa
38210 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30 78 30 30  ta[hdr+7] = 0x00
38220 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
38230 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  E_OK;.}../*.** A
38240 72 72 61 79 20 61 70 43 65 6c 6c 5b 5d 20 63 6f  rray apCell[] co
38250 6e 74 61 69 6e 73 20 6e 43 65 6c 6c 20 70 6f 69  ntains nCell poi
38260 6e 74 65 72 73 20 74 6f 20 62 2d 74 72 65 65 20  nters to b-tree 
38270 63 65 6c 6c 73 2e 20 41 72 72 61 79 20 73 7a 43  cells. Array szC
38280 65 6c 6c 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73 20  ell.** contains 
38290 74 68 65 20 73 69 7a 65 20 69 6e 20 62 79 74 65  the size in byte
382a0 73 20 6f 66 20 65 61 63 68 20 73 75 63 68 20 63  s of each such c
382b0 65 6c 6c 2e 20 54 68 69 73 20 66 75 6e 63 74 69  ell. This functi
382c0 6f 6e 20 61 74 74 65 6d 70 74 73 20 74 6f 20 0a  on attempts to .
382d0 2a 2a 20 61 64 64 20 74 68 65 20 63 65 6c 6c 73  ** add the cells
382e0 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 61   stored in the a
382f0 72 72 61 79 20 74 6f 20 70 61 67 65 20 70 50 67  rray to page pPg
38300 2e 20 49 66 20 69 74 20 63 61 6e 6e 6f 74 20 28  . If it cannot (
38310 62 65 63 61 75 73 65 20 0a 2a 2a 20 74 68 65 20  because .** the 
38320 70 61 67 65 20 6e 65 65 64 73 20 74 6f 20 62 65  page needs to be
38330 20 64 65 66 72 61 67 6d 65 6e 74 65 64 20 62 65   defragmented be
38340 66 6f 72 65 20 74 68 65 20 63 65 6c 6c 73 20 77  fore the cells w
38350 69 6c 6c 20 66 69 74 29 2c 20 6e 6f 6e 2d 7a 65  ill fit), non-ze
38360 72 6f 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65  ro.** is returne
38370 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  d. Otherwise, if
38380 20 74 68 65 20 63 65 6c 6c 73 20 61 72 65 20 61   the cells are a
38390 64 64 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c  dded successfull
383a0 79 2c 20 7a 65 72 6f 20 69 73 0a 2a 2a 20 72 65  y, zero is.** re
383b0 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 72  turned..**.** Ar
383c0 67 75 6d 65 6e 74 20 70 43 65 6c 6c 70 74 72 20  gument pCellptr 
383d0 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 66 69  points to the fi
383e0 72 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65