/ Hex Artifact Content
Login

Artifact 4213df624323614dd79f1e5fda74a885b1955056:


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 23 69 66 20 64 65   enable){.#if de
0b30: 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
0b40: 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
0b50: 49 54 45 5f 54 45 53 54 29 20 26 26 20 21 64 65  ITE_TEST) && !de
0b60: 66 69 6e 65 64 28 54 48 33 5f 43 4f 4d 50 41 54  fined(TH3_COMPAT
0b70: 49 42 49 4c 49 54 59 29 0a 20 20 2f 2a 20 45 6e  IBILITY).  /* En
0b80: 61 62 6c 65 20 67 6c 6f 62 61 6c 20 73 68 61 72  able global shar
0b90: 65 64 20 63 61 63 68 65 20 66 75 6e 63 74 69 6f  ed cache functio
0ba0: 6e 20 66 6f 72 20 64 65 62 75 67 67 69 6e 67 20  n for debugging 
0bb0: 61 6e 64 20 75 6e 69 74 20 74 65 73 74 73 2c 20  and unit tests, 
0bc0: 0a 20 20 2a 2a 20 62 75 74 20 6e 6f 74 20 66 6f  .  ** but not fo
0bd0: 72 20 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20 72  r release */.  r
0be0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53  eturn SQLITE_MIS
0bf0: 55 53 45 3b 0a 23 65 6c 73 65 0a 20 20 73 71 6c  USE;.#else.  sql
0c00: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
0c10: 2e 73 68 61 72 65 64 43 61 63 68 65 45 6e 61 62  .sharedCacheEnab
0c20: 6c 65 64 20 3d 20 65 6e 61 62 6c 65 3b 0a 20 20  led = enable;.  
0c30: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
0c40: 3b 0a 23 65 6e 64 69 66 0a 7d 0a 23 65 6e 64 69  ;.#endif.}.#endi
0c50: 66 0a 0a 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  f....#ifdef SQLI
0c60: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
0c70: 41 43 48 45 0a 20 20 2f 2a 0a 20 20 2a 2a 20 54  ACHE.  /*.  ** T
0c80: 68 65 20 66 75 6e 63 74 69 6f 6e 73 20 71 75 65  he functions que
0c90: 72 79 53 68 61 72 65 64 43 61 63 68 65 54 61 62  rySharedCacheTab
0ca0: 6c 65 4c 6f 63 6b 28 29 2c 20 73 65 74 53 68 61  leLock(), setSha
0cb0: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
0cc0: 6b 28 29 2c 0a 20 20 2a 2a 20 61 6e 64 20 63 6c  k(),.  ** and cl
0cd0: 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63 68  earAllSharedCach
0ce0: 65 54 61 62 6c 65 4c 6f 63 6b 73 28 29 0a 20 20  eTableLocks().  
0cf0: 2a 2a 20 6d 61 6e 69 70 75 6c 61 74 65 20 65 6e  ** manipulate en
0d00: 74 72 69 65 73 20 69 6e 20 74 68 65 20 42 74 53  tries in the BtS
0d10: 68 61 72 65 64 2e 70 4c 6f 63 6b 20 6c 69 6e 6b  hared.pLock link
0d20: 65 64 20 6c 69 73 74 20 75 73 65 64 20 74 6f 20  ed list used to 
0d30: 73 74 6f 72 65 0a 20 20 2a 2a 20 73 68 61 72 65  store.  ** share
0d40: 64 2d 63 61 63 68 65 20 74 61 62 6c 65 20 6c 65  d-cache table le
0d50: 76 65 6c 20 6c 6f 63 6b 73 2e 20 49 66 20 74 68  vel locks. If th
0d60: 65 20 6c 69 62 72 61 72 79 20 69 73 20 63 6f 6d  e library is com
0d70: 70 69 6c 65 64 20 77 69 74 68 20 74 68 65 0a 20  piled with the. 
0d80: 20 2a 2a 20 73 68 61 72 65 64 2d 63 61 63 68 65   ** shared-cache
0d90: 20 66 65 61 74 75 72 65 20 64 69 73 61 62 6c 65   feature disable
0da0: 64 2c 20 74 68 65 6e 20 74 68 65 72 65 20 69 73  d, then there is
0db0: 20 6f 6e 6c 79 20 65 76 65 72 20 6f 6e 65 20 75   only ever one u
0dc0: 73 65 72 0a 20 20 2a 2a 20 6f 66 20 65 61 63 68  ser.  ** of each
0dd0: 20 42 74 53 68 61 72 65 64 20 73 74 72 75 63 74   BtShared struct
0de0: 75 72 65 20 61 6e 64 20 73 6f 20 74 68 69 73 20  ure and so this 
0df0: 6c 6f 63 6b 69 6e 67 20 69 73 20 6e 6f 74 20 6e  locking is not n
0e00: 65 63 65 73 73 61 72 79 2e 20 0a 20 20 2a 2a 20  ecessary. .  ** 
0e10: 53 6f 20 64 65 66 69 6e 65 20 74 68 65 20 6c 6f  So define the lo
0e20: 63 6b 20 72 65 6c 61 74 65 64 20 66 75 6e 63 74  ck related funct
0e30: 69 6f 6e 73 20 61 73 20 6e 6f 2d 6f 70 73 2e 0a  ions as no-ops..
0e40: 20 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20 71    */.  #define q
0e50: 75 65 72 79 53 68 61 72 65 64 43 61 63 68 65 54  uerySharedCacheT
0e60: 61 62 6c 65 4c 6f 63 6b 28 61 2c 62 2c 63 29 20  ableLock(a,b,c) 
0e70: 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 23 64 65 66  SQLITE_OK.  #def
0e80: 69 6e 65 20 73 65 74 53 68 61 72 65 64 43 61 63  ine setSharedCac
0e90: 68 65 54 61 62 6c 65 4c 6f 63 6b 28 61 2c 62 2c  heTableLock(a,b,
0ea0: 63 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 23  c) SQLITE_OK.  #
0eb0: 64 65 66 69 6e 65 20 63 6c 65 61 72 41 6c 6c 53  define clearAllS
0ec0: 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
0ed0: 6f 63 6b 73 28 61 29 0a 20 20 23 64 65 66 69 6e  ocks(a).  #defin
0ee0: 65 20 64 6f 77 6e 67 72 61 64 65 41 6c 6c 53 68  e downgradeAllSh
0ef0: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
0f00: 63 6b 73 28 61 29 0a 20 20 23 64 65 66 69 6e 65  cks(a).  #define
0f10: 20 68 61 73 53 68 61 72 65 64 43 61 63 68 65 54   hasSharedCacheT
0f20: 61 62 6c 65 4c 6f 63 6b 28 61 2c 62 2c 63 2c 64  ableLock(a,b,c,d
0f30: 29 20 31 0a 20 20 23 64 65 66 69 6e 65 20 68 61  ) 1.  #define ha
0f40: 73 52 65 61 64 43 6f 6e 66 6c 69 63 74 73 28 61  sReadConflicts(a
0f50: 2c 20 62 29 20 30 0a 23 65 6e 64 69 66 0a 0a 23  , b) 0.#endif..#
0f60: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
0f70: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a  IT_SHARED_CACHE.
0f80: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
0f90: 45 42 55 47 0a 2f 2a 0a 2a 2a 2a 2a 20 54 68 69  EBUG./*.**** Thi
0fa0: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e  s function is on
0fb0: 6c 79 20 75 73 65 64 20 61 73 20 70 61 72 74 20  ly used as part 
0fc0: 6f 66 20 61 6e 20 61 73 73 65 72 74 28 29 20 73  of an assert() s
0fd0: 74 61 74 65 6d 65 6e 74 2e 20 2a 2a 2a 0a 2a 2a  tatement. ***.**
0fe0: 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65  .** Check to see
0ff0: 20 69 66 20 70 42 74 72 65 65 20 68 6f 6c 64 73   if pBtree holds
1000: 20 74 68 65 20 72 65 71 75 69 72 65 64 20 6c 6f   the required lo
1010: 63 6b 73 20 74 6f 20 72 65 61 64 20 6f 72 20 77  cks to read or w
1020: 72 69 74 65 20 74 6f 20 74 68 65 20 0a 2a 2a 20  rite to the .** 
1030: 74 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 20  table with root 
1040: 70 61 67 65 20 69 52 6f 6f 74 2e 20 20 20 52 65  page iRoot.   Re
1050: 74 75 72 6e 20 31 20 69 66 20 69 74 20 64 6f 65  turn 1 if it doe
1060: 73 20 61 6e 64 20 30 20 69 66 20 6e 6f 74 2e 0a  s and 0 if not..
1070: 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c  **.** For exampl
1080: 65 2c 20 77 68 65 6e 20 77 72 69 74 69 6e 67 20  e, when writing 
1090: 74 6f 20 61 20 74 61 62 6c 65 20 77 69 74 68 20  to a table with 
10a0: 72 6f 6f 74 2d 70 61 67 65 20 69 52 6f 6f 74 20  root-page iRoot 
10b0: 76 69 61 20 0a 2a 2a 20 42 74 72 65 65 20 63 6f  via .** Btree co
10c0: 6e 6e 65 63 74 69 6f 6e 20 70 42 74 72 65 65 3a  nnection pBtree:
10d0: 0a 2a 2a 0a 2a 2a 20 20 20 20 61 73 73 65 72 74  .**.**    assert
10e0: 28 20 68 61 73 53 68 61 72 65 64 43 61 63 68 65  ( hasSharedCache
10f0: 54 61 62 6c 65 4c 6f 63 6b 28 70 42 74 72 65 65  TableLock(pBtree
1100: 2c 20 69 52 6f 6f 74 2c 20 30 2c 20 57 52 49 54  , iRoot, 0, WRIT
1110: 45 5f 4c 4f 43 4b 29 20 29 3b 0a 2a 2a 0a 2a 2a  E_LOCK) );.**.**
1120: 20 57 68 65 6e 20 77 72 69 74 69 6e 67 20 74 6f   When writing to
1130: 20 61 6e 20 69 6e 64 65 78 20 74 68 61 74 20 72   an index that r
1140: 65 73 69 64 65 73 20 69 6e 20 61 20 73 68 61 72  esides in a shar
1150: 61 62 6c 65 20 64 61 74 61 62 61 73 65 2c 20 74  able database, t
1160: 68 65 20 0a 2a 2a 20 63 61 6c 6c 65 72 20 73 68  he .** caller sh
1170: 6f 75 6c 64 20 68 61 76 65 20 66 69 72 73 74 20  ould have first 
1180: 6f 62 74 61 69 6e 65 64 20 61 20 6c 6f 63 6b 20  obtained a lock 
1190: 73 70 65 63 69 66 79 69 6e 67 20 74 68 65 20 72  specifying the r
11a0: 6f 6f 74 20 70 61 67 65 20 6f 66 0a 2a 2a 20 74  oot page of.** t
11b0: 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
11c0: 20 74 61 62 6c 65 2e 20 54 68 69 73 20 6d 61 6b   table. This mak
11d0: 65 73 20 74 68 69 6e 67 73 20 61 20 62 69 74 20  es things a bit 
11e0: 6d 6f 72 65 20 63 6f 6d 70 6c 69 63 61 74 65 64  more complicated
11f0: 2c 0a 2a 2a 20 61 73 20 74 68 69 73 20 6d 6f 64  ,.** as this mod
1200: 75 6c 65 20 74 72 65 61 74 73 20 65 61 63 68 20  ule treats each 
1210: 74 61 62 6c 65 20 61 73 20 61 20 73 65 70 61 72  table as a separ
1220: 61 74 65 20 73 74 72 75 63 74 75 72 65 2e 20 54  ate structure. T
1230: 6f 20 64 65 74 65 72 6d 69 6e 65 0a 2a 2a 20 74  o determine.** t
1240: 68 65 20 74 61 62 6c 65 20 63 6f 72 72 65 73 70  he table corresp
1250: 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 69 6e  onding to the in
1260: 64 65 78 20 62 65 69 6e 67 20 77 72 69 74 74 65  dex being writte
1270: 6e 2c 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74  n, this.** funct
1280: 69 6f 6e 20 68 61 73 20 74 6f 20 73 65 61 72 63  ion has to searc
1290: 68 20 74 68 72 6f 75 67 68 20 74 68 65 20 64 61  h through the da
12a0: 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e 0a 2a  tabase schema..*
12b0: 2a 0a 2a 2a 20 49 6e 73 74 65 61 64 20 6f 66 20  *.** Instead of 
12c0: 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 74 61  a lock on the ta
12d0: 62 6c 65 2f 69 6e 64 65 78 20 72 6f 6f 74 65 64  ble/index rooted
12e0: 20 61 74 20 70 61 67 65 20 69 52 6f 6f 74 2c 20   at page iRoot, 
12f0: 74 68 65 20 63 61 6c 6c 65 72 20 6d 61 79 0a 2a  the caller may.*
1300: 2a 20 68 6f 6c 64 20 61 20 77 72 69 74 65 2d 6c  * hold a write-l
1310: 6f 63 6b 20 6f 6e 20 74 68 65 20 73 63 68 65 6d  ock on the schem
1320: 61 20 74 61 62 6c 65 20 28 72 6f 6f 74 20 70 61  a table (root pa
1330: 67 65 20 31 29 2e 20 54 68 69 73 20 69 73 20 61  ge 1). This is a
1340: 6c 73 6f 0a 2a 2a 20 61 63 63 65 70 74 61 62 6c  lso.** acceptabl
1350: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
1360: 20 68 61 73 53 68 61 72 65 64 43 61 63 68 65 54   hasSharedCacheT
1370: 61 62 6c 65 4c 6f 63 6b 28 0a 20 20 42 74 72 65  ableLock(.  Btre
1380: 65 20 2a 70 42 74 72 65 65 2c 20 20 20 20 20 20  e *pBtree,      
1390: 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 74 68 61     /* Handle tha
13a0: 74 20 6d 75 73 74 20 68 6f 6c 64 20 6c 6f 63 6b  t must hold lock
13b0: 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 52 6f 6f 74   */.  Pgno iRoot
13c0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
13d0: 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 62 2d 74  Root page of b-t
13e0: 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 49  ree */.  int isI
13f0: 6e 64 65 78 2c 20 20 20 20 20 20 20 20 20 20 20  ndex,           
1400: 2f 2a 20 54 72 75 65 20 69 66 20 69 52 6f 6f 74  /* True if iRoot
1410: 20 69 73 20 74 68 65 20 72 6f 6f 74 20 6f 66 20   is the root of 
1420: 61 6e 20 69 6e 64 65 78 20 62 2d 74 72 65 65 20  an index b-tree 
1430: 2a 2f 0a 20 20 69 6e 74 20 65 4c 6f 63 6b 54 79  */.  int eLockTy
1440: 70 65 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  pe          /* R
1450: 65 71 75 69 72 65 64 20 6c 6f 63 6b 20 74 79 70  equired lock typ
1460: 65 20 28 52 45 41 44 5f 4c 4f 43 4b 20 6f 72 20  e (READ_LOCK or 
1470: 57 52 49 54 45 5f 4c 4f 43 4b 29 20 2a 2f 0a 29  WRITE_LOCK) */.)
1480: 7b 0a 20 20 53 63 68 65 6d 61 20 2a 70 53 63 68  {.  Schema *pSch
1490: 65 6d 61 20 3d 20 28 53 63 68 65 6d 61 20 2a 29  ema = (Schema *)
14a0: 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 53 63  pBtree->pBt->pSc
14b0: 68 65 6d 61 3b 0a 20 20 50 67 6e 6f 20 69 54 61  hema;.  Pgno iTa
14c0: 62 20 3d 20 30 3b 0a 20 20 42 74 4c 6f 63 6b 20  b = 0;.  BtLock 
14d0: 2a 70 4c 6f 63 6b 3b 0a 0a 20 20 2f 2a 20 49 66  *pLock;..  /* If
14e0: 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20 69   this database i
14f0: 73 20 6e 6f 74 20 73 68 61 72 65 61 62 6c 65 2c  s not shareable,
1500: 20 6f 72 20 69 66 20 74 68 65 20 63 6c 69 65 6e   or if the clien
1510: 74 20 69 73 20 72 65 61 64 69 6e 67 0a 20 20 2a  t is reading.  *
1520: 2a 20 61 6e 64 20 68 61 73 20 74 68 65 20 72 65  * and has the re
1530: 61 64 2d 75 6e 63 6f 6d 6d 69 74 74 65 64 20 66  ad-uncommitted f
1540: 6c 61 67 20 73 65 74 2c 20 74 68 65 6e 20 6e 6f  lag set, then no
1550: 20 6c 6f 63 6b 20 69 73 20 72 65 71 75 69 72 65   lock is require
1560: 64 2e 20 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20  d. .  ** Return 
1570: 74 72 75 65 20 69 6d 6d 65 64 69 61 74 65 6c 79  true immediately
1580: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 42  ..  */.  if( (pB
1590: 74 72 65 65 2d 3e 73 68 61 72 61 62 6c 65 3d 3d  tree->sharable==
15a0: 30 29 0a 20 20 20 7c 7c 20 28 65 4c 6f 63 6b 54  0).   || (eLockT
15b0: 79 70 65 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 26  ype==READ_LOCK &
15c0: 26 20 28 70 42 74 72 65 65 2d 3e 64 62 2d 3e 66  & (pBtree->db->f
15d0: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 52 65  lags & SQLITE_Re
15e0: 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64 29 29 0a  adUncommitted)).
15f0: 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20    ){.    return 
1600: 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  1;.  }..  /* If 
1610: 74 68 65 20 63 6c 69 65 6e 74 20 69 73 20 72 65  the client is re
1620: 61 64 69 6e 67 20 20 6f 72 20 77 72 69 74 69 6e  ading  or writin
1630: 67 20 61 6e 20 69 6e 64 65 78 20 61 6e 64 20 74  g an index and t
1640: 68 65 20 73 63 68 65 6d 61 20 69 73 0a 20 20 2a  he schema is.  *
1650: 2a 20 6e 6f 74 20 6c 6f 61 64 65 64 2c 20 74 68  * not loaded, th
1660: 65 6e 20 69 74 20 69 73 20 74 6f 6f 20 64 69 66  en it is too dif
1670: 66 69 63 75 6c 74 20 74 6f 20 61 63 74 75 61 6c  ficult to actual
1680: 6c 79 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20  ly check to see 
1690: 69 66 0a 20 20 2a 2a 20 74 68 65 20 63 6f 72 72  if.  ** the corr
16a0: 65 63 74 20 6c 6f 63 6b 73 20 61 72 65 20 68 65  ect locks are he
16b0: 6c 64 2e 20 20 53 6f 20 64 6f 20 6e 6f 74 20 62  ld.  So do not b
16c0: 6f 74 68 65 72 20 2d 20 6a 75 73 74 20 72 65 74  other - just ret
16d0: 75 72 6e 20 74 72 75 65 2e 0a 20 20 2a 2a 20 54  urn true..  ** T
16e0: 68 69 73 20 63 61 73 65 20 64 6f 65 73 20 6e 6f  his case does no
16f0: 74 20 63 6f 6d 65 20 75 70 20 76 65 72 79 20 6f  t come up very o
1700: 66 74 65 6e 20 61 6e 79 68 6f 77 2e 0a 20 20 2a  ften anyhow..  *
1710: 2f 0a 20 20 69 66 28 20 69 73 49 6e 64 65 78 20  /.  if( isIndex 
1720: 26 26 20 28 21 70 53 63 68 65 6d 61 20 7c 7c 20  && (!pSchema || 
1730: 28 70 53 63 68 65 6d 61 2d 3e 73 63 68 65 6d 61  (pSchema->schema
1740: 46 6c 61 67 73 26 44 42 5f 53 63 68 65 6d 61 4c  Flags&DB_SchemaL
1750: 6f 61 64 65 64 29 3d 3d 30 29 20 29 7b 0a 20 20  oaded)==0) ){.  
1760: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
1770: 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74  .  /* Figure out
1780: 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 20 74   the root-page t
1790: 68 61 74 20 74 68 65 20 6c 6f 63 6b 20 73 68 6f  hat the lock sho
17a0: 75 6c 64 20 62 65 20 68 65 6c 64 20 6f 6e 2e 20  uld be held on. 
17b0: 46 6f 72 20 74 61 62 6c 65 0a 20 20 2a 2a 20 62  For table.  ** b
17c0: 2d 74 72 65 65 73 2c 20 74 68 69 73 20 69 73 20  -trees, this is 
17d0: 6a 75 73 74 20 74 68 65 20 72 6f 6f 74 20 70 61  just the root pa
17e0: 67 65 20 6f 66 20 74 68 65 20 62 2d 74 72 65 65  ge of the b-tree
17f0: 20 62 65 69 6e 67 20 72 65 61 64 20 6f 72 0a 20   being read or. 
1800: 20 2a 2a 20 77 72 69 74 74 65 6e 2e 20 46 6f 72   ** written. For
1810: 20 69 6e 64 65 78 20 62 2d 74 72 65 65 73 2c 20   index b-trees, 
1820: 69 74 20 69 73 20 74 68 65 20 72 6f 6f 74 20 70  it is the root p
1830: 61 67 65 20 6f 66 20 74 68 65 20 61 73 73 6f 63  age of the assoc
1840: 69 61 74 65 64 0a 20 20 2a 2a 20 74 61 62 6c 65  iated.  ** table
1850: 2e 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 49 6e  .  */.  if( isIn
1860: 64 65 78 20 29 7b 0a 20 20 20 20 48 61 73 68 45  dex ){.    HashE
1870: 6c 65 6d 20 2a 70 3b 0a 20 20 20 20 66 6f 72 28  lem *p;.    for(
1880: 70 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73  p=sqliteHashFirs
1890: 74 28 26 70 53 63 68 65 6d 61 2d 3e 69 64 78 48  t(&pSchema->idxH
18a0: 61 73 68 29 3b 20 70 3b 20 70 3d 73 71 6c 69 74  ash); p; p=sqlit
18b0: 65 48 61 73 68 4e 65 78 74 28 70 29 29 7b 0a 20  eHashNext(p)){. 
18c0: 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78       Index *pIdx
18d0: 20 3d 20 28 49 6e 64 65 78 20 2a 29 73 71 6c 69   = (Index *)sqli
18e0: 74 65 48 61 73 68 44 61 74 61 28 70 29 3b 0a 20  teHashData(p);. 
18f0: 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 74       if( pIdx->t
1900: 6e 75 6d 3d 3d 28 69 6e 74 29 69 52 6f 6f 74 20  num==(int)iRoot 
1910: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  ){.        if( i
1920: 54 61 62 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Tab ){.         
1930: 20 2f 2a 20 54 77 6f 20 6f 72 20 6d 6f 72 65 20   /* Two or more 
1940: 69 6e 64 65 78 65 73 20 73 68 61 72 65 20 74 68  indexes share th
1950: 65 20 73 61 6d 65 20 72 6f 6f 74 20 70 61 67 65  e same root page
1960: 2e 20 20 54 68 65 72 65 20 6d 75 73 74 0a 20 20  .  There must.  
1970: 20 20 20 20 20 20 20 20 2a 2a 20 62 65 20 69 6d          ** be im
1980: 70 6f 73 74 65 72 20 74 61 62 6c 65 73 2e 20 20  poster tables.  
1990: 53 6f 20 6a 75 73 74 20 72 65 74 75 72 6e 20 74  So just return t
19a0: 72 75 65 2e 20 20 54 68 65 20 61 73 73 65 72 74  rue.  The assert
19b0: 20 69 73 20 6e 6f 74 0a 20 20 20 20 20 20 20 20   is not.        
19c0: 20 20 2a 2a 20 75 73 65 66 75 6c 20 69 6e 20 74    ** useful in t
19d0: 68 61 74 20 63 61 73 65 2e 20 2a 2f 0a 20 20 20  hat case. */.   
19e0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b         return 1;
19f0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1a00: 20 20 20 69 54 61 62 20 3d 20 70 49 64 78 2d 3e     iTab = pIdx->
1a10: 70 54 61 62 6c 65 2d 3e 74 6e 75 6d 3b 0a 20 20  pTable->tnum;.  
1a20: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65      }.    }.  }e
1a30: 6c 73 65 7b 0a 20 20 20 20 69 54 61 62 20 3d 20  lse{.    iTab = 
1a40: 69 52 6f 6f 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  iRoot;.  }..  /*
1a50: 20 53 65 61 72 63 68 20 66 6f 72 20 74 68 65 20   Search for the 
1a60: 72 65 71 75 69 72 65 64 20 6c 6f 63 6b 2e 20 45  required lock. E
1a70: 69 74 68 65 72 20 61 20 77 72 69 74 65 2d 6c 6f  ither a write-lo
1a80: 63 6b 20 6f 6e 20 72 6f 6f 74 2d 70 61 67 65 20  ck on root-page 
1a90: 69 54 61 62 2c 20 61 20 0a 20 20 2a 2a 20 77 72  iTab, a .  ** wr
1aa0: 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ite-lock on the 
1ab0: 73 63 68 65 6d 61 20 74 61 62 6c 65 2c 20 6f 72  schema table, or
1ac0: 20 28 69 66 20 74 68 65 20 63 6c 69 65 6e 74 20   (if the client 
1ad0: 69 73 20 72 65 61 64 69 6e 67 29 20 61 0a 20 20  is reading) a.  
1ae0: 2a 2a 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20  ** read-lock on 
1af0: 69 54 61 62 20 77 69 6c 6c 20 73 75 66 66 69 63  iTab will suffic
1b00: 65 2e 20 52 65 74 75 72 6e 20 31 20 69 66 20 61  e. Return 1 if a
1b10: 6e 79 20 6f 66 20 74 68 65 73 65 20 61 72 65 20  ny of these are 
1b20: 66 6f 75 6e 64 2e 20 20 2a 2f 0a 20 20 66 6f 72  found.  */.  for
1b30: 28 70 4c 6f 63 6b 3d 70 42 74 72 65 65 2d 3e 70  (pLock=pBtree->p
1b40: 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b  Bt->pLock; pLock
1b50: 3b 20 70 4c 6f 63 6b 3d 70 4c 6f 63 6b 2d 3e 70  ; pLock=pLock->p
1b60: 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70  Next){.    if( p
1b70: 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 3d 3d 70 42  Lock->pBtree==pB
1b80: 74 72 65 65 20 0a 20 20 20 20 20 26 26 20 28 70  tree .     && (p
1b90: 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65 3d 3d 69 54  Lock->iTable==iT
1ba0: 61 62 20 7c 7c 20 28 70 4c 6f 63 6b 2d 3e 65 4c  ab || (pLock->eL
1bb0: 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20  ock==WRITE_LOCK 
1bc0: 26 26 20 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65  && pLock->iTable
1bd0: 3d 3d 31 29 29 0a 20 20 20 20 20 26 26 20 70 4c  ==1)).     && pL
1be0: 6f 63 6b 2d 3e 65 4c 6f 63 6b 3e 3d 65 4c 6f 63  ock->eLock>=eLoc
1bf0: 6b 54 79 70 65 20 0a 20 20 20 20 29 7b 0a 20 20  kType .    ){.  
1c00: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
1c10: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 61    }.  }..  /* Fa
1c20: 69 6c 65 64 20 74 6f 20 66 69 6e 64 20 74 68 65  iled to find the
1c30: 20 72 65 71 75 69 72 65 64 20 6c 6f 63 6b 2e 20   required lock. 
1c40: 2a 2f 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  */.  return 0;.}
1c50: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
1c60: 45 5f 44 45 42 55 47 20 2a 2f 0a 0a 23 69 66 64  E_DEBUG */..#ifd
1c70: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
1c80: 2f 2a 0a 2a 2a 2a 2a 20 54 68 69 73 20 66 75 6e  /*.**** This fun
1c90: 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 75 73 65  ction may be use
1ca0: 64 20 61 73 20 70 61 72 74 20 6f 66 20 61 73 73  d as part of ass
1cb0: 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73  ert() statements
1cc0: 20 6f 6e 6c 79 2e 20 2a 2a 2a 2a 0a 2a 2a 0a 2a   only. ****.**.*
1cd0: 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
1ce0: 20 69 74 20 77 6f 75 6c 64 20 62 65 20 69 6c 6c   it would be ill
1cf0: 65 67 61 6c 20 66 6f 72 20 70 42 74 72 65 65 20  egal for pBtree 
1d00: 74 6f 20 77 72 69 74 65 20 69 6e 74 6f 20 74 68  to write into th
1d10: 65 0a 2a 2a 20 74 61 62 6c 65 20 6f 72 20 69 6e  e.** table or in
1d20: 64 65 78 20 72 6f 6f 74 65 64 20 61 74 20 69 52  dex rooted at iR
1d30: 6f 6f 74 20 62 65 63 61 75 73 65 20 6f 74 68 65  oot because othe
1d40: 72 20 73 68 61 72 65 64 20 63 6f 6e 6e 65 63 74  r shared connect
1d50: 69 6f 6e 73 20 61 72 65 0a 2a 2a 20 73 69 6d 75  ions are.** simu
1d60: 6c 74 61 6e 65 6f 75 73 6c 79 20 72 65 61 64 69  ltaneously readi
1d70: 6e 67 20 74 68 61 74 20 73 61 6d 65 20 74 61 62  ng that same tab
1d80: 6c 65 20 6f 72 20 69 6e 64 65 78 2e 0a 2a 2a 0a  le or index..**.
1d90: 2a 2a 20 49 74 20 69 73 20 69 6c 6c 65 67 61 6c  ** It is illegal
1da0: 20 66 6f 72 20 70 42 74 72 65 65 20 74 6f 20 77   for pBtree to w
1db0: 72 69 74 65 20 69 66 20 73 6f 6d 65 20 6f 74 68  rite if some oth
1dc0: 65 72 20 42 74 72 65 65 20 6f 62 6a 65 63 74 20  er Btree object 
1dd0: 74 68 61 74 0a 2a 2a 20 73 68 61 72 65 73 20 74  that.** shares t
1de0: 68 65 20 73 61 6d 65 20 42 74 53 68 61 72 65 64  he same BtShared
1df0: 20 6f 62 6a 65 63 74 20 69 73 20 63 75 72 72 65   object is curre
1e00: 6e 74 6c 79 20 72 65 61 64 69 6e 67 20 6f 72 20  ntly reading or 
1e10: 77 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65 20 69  writing.** the i
1e20: 52 6f 6f 74 20 74 61 62 6c 65 2e 20 20 45 78 63  Root table.  Exc
1e30: 65 70 74 2c 20 69 66 20 74 68 65 20 6f 74 68 65  ept, if the othe
1e40: 72 20 42 74 72 65 65 20 6f 62 6a 65 63 74 20 68  r Btree object h
1e50: 61 73 20 74 68 65 0a 2a 2a 20 72 65 61 64 2d 75  as the.** read-u
1e60: 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67 20  ncommitted flag 
1e70: 73 65 74 2c 20 74 68 65 6e 20 69 74 20 69 73 20  set, then it is 
1e80: 4f 4b 20 66 6f 72 20 74 68 65 20 6f 74 68 65 72  OK for the other
1e90: 20 6f 62 6a 65 63 74 20 74 6f 0a 2a 2a 20 68 61   object to.** ha
1ea0: 76 65 20 61 20 72 65 61 64 20 63 75 72 73 6f 72  ve a read cursor
1eb0: 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d  ..**.** For exam
1ec0: 70 6c 65 2c 20 62 65 66 6f 72 65 20 77 72 69 74  ple, before writ
1ed0: 69 6e 67 20 74 6f 20 61 6e 79 20 70 61 72 74 20  ing to any part 
1ee0: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20  of the table or 
1ef0: 69 6e 64 65 78 0a 2a 2a 20 72 6f 6f 74 65 64 20  index.** rooted 
1f00: 61 74 20 70 61 67 65 20 69 52 6f 6f 74 2c 20 6f  at page iRoot, o
1f10: 6e 65 20 73 68 6f 75 6c 64 20 63 61 6c 6c 3a 0a  ne should call:.
1f20: 2a 2a 0a 2a 2a 20 20 20 20 61 73 73 65 72 74 28  **.**    assert(
1f30: 20 21 68 61 73 52 65 61 64 43 6f 6e 66 6c 69 63   !hasReadConflic
1f40: 74 73 28 70 42 74 72 65 65 2c 20 69 52 6f 6f 74  ts(pBtree, iRoot
1f50: 29 20 29 3b 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ) );.*/.static i
1f60: 6e 74 20 68 61 73 52 65 61 64 43 6f 6e 66 6c 69  nt hasReadConfli
1f70: 63 74 73 28 42 74 72 65 65 20 2a 70 42 74 72 65  cts(Btree *pBtre
1f80: 65 2c 20 50 67 6e 6f 20 69 52 6f 6f 74 29 7b 0a  e, Pgno iRoot){.
1f90: 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20    BtCursor *p;. 
1fa0: 20 66 6f 72 28 70 3d 70 42 74 72 65 65 2d 3e 70   for(p=pBtree->p
1fb0: 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20  Bt->pCursor; p; 
1fc0: 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  p=p->pNext){.   
1fd0: 20 69 66 28 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74   if( p->pgnoRoot
1fe0: 3d 3d 69 52 6f 6f 74 20 0a 20 20 20 20 20 26 26  ==iRoot .     &&
1ff0: 20 70 2d 3e 70 42 74 72 65 65 21 3d 70 42 74 72   p->pBtree!=pBtr
2000: 65 65 0a 20 20 20 20 20 26 26 20 30 3d 3d 28 70  ee.     && 0==(p
2010: 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 66 6c  ->pBtree->db->fl
2020: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 52 65 61  ags & SQLITE_Rea
2030: 64 55 6e 63 6f 6d 6d 69 74 74 65 64 29 0a 20 20  dUncommitted).  
2040: 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72    ){.      retur
2050: 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  n 1;.    }.  }. 
2060: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e   return 0;.}.#en
2070: 64 69 66 20 20 20 20 2f 2a 20 23 69 66 64 65 66  dif    /* #ifdef
2080: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 2a 2f   SQLITE_DEBUG */
2090: 0a 0a 2f 2a 0a 2a 2a 20 51 75 65 72 79 20 74 6f  ../*.** Query to
20a0: 20 73 65 65 20 69 66 20 42 74 72 65 65 20 68 61   see if Btree ha
20b0: 6e 64 6c 65 20 70 20 6d 61 79 20 6f 62 74 61 69  ndle p may obtai
20c0: 6e 20 61 20 6c 6f 63 6b 20 6f 66 20 74 79 70 65  n a lock of type
20d0: 20 65 4c 6f 63 6b 20 0a 2a 2a 20 28 52 45 41 44   eLock .** (READ
20e0: 5f 4c 4f 43 4b 20 6f 72 20 57 52 49 54 45 5f 4c  _LOCK or WRITE_L
20f0: 4f 43 4b 29 20 6f 6e 20 74 68 65 20 74 61 62 6c  OCK) on the tabl
2100: 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65  e with root-page
2110: 20 69 54 61 62 2e 20 52 65 74 75 72 6e 0a 2a 2a   iTab. Return.**
2120: 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 74 68   SQLITE_OK if th
2130: 65 20 6c 6f 63 6b 20 6d 61 79 20 62 65 20 6f 62  e lock may be ob
2140: 74 61 69 6e 65 64 20 28 62 79 20 63 61 6c 6c 69  tained (by calli
2150: 6e 67 0a 2a 2a 20 73 65 74 53 68 61 72 65 64 43  ng.** setSharedC
2160: 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29 29  acheTableLock())
2170: 2c 20 6f 72 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  , or SQLITE_LOCK
2180: 45 44 20 69 66 20 6e 6f 74 2e 0a 2a 2f 0a 73 74  ED if not..*/.st
2190: 61 74 69 63 20 69 6e 74 20 71 75 65 72 79 53 68  atic int querySh
21a0: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
21b0: 63 6b 28 42 74 72 65 65 20 2a 70 2c 20 50 67 6e  ck(Btree *p, Pgn
21c0: 6f 20 69 54 61 62 2c 20 75 38 20 65 4c 6f 63 6b  o iTab, u8 eLock
21d0: 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
21e0: 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42  Bt = p->pBt;.  B
21f0: 74 4c 6f 63 6b 20 2a 70 49 74 65 72 3b 0a 0a 20  tLock *pIter;.. 
2200: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
2210: 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28  BtreeHoldsMutex(
2220: 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  p) );.  assert( 
2230: 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b  eLock==READ_LOCK
2240: 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45   || eLock==WRITE
2250: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72  _LOCK );.  asser
2260: 74 28 20 70 2d 3e 64 62 21 3d 30 20 29 3b 0a 20  t( p->db!=0 );. 
2270: 20 61 73 73 65 72 74 28 20 21 28 70 2d 3e 64 62   assert( !(p->db
2280: 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 52  ->flags&SQLITE_R
2290: 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64 29 7c  eadUncommitted)|
22a0: 7c 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f  |eLock==WRITE_LO
22b0: 43 4b 7c 7c 69 54 61 62 3d 3d 31 20 29 3b 0a 20  CK||iTab==1 );. 
22c0: 20 0a 20 20 2f 2a 20 49 66 20 72 65 71 75 65 73   .  /* If reques
22d0: 74 69 6e 67 20 61 20 77 72 69 74 65 2d 6c 6f 63  ting a write-loc
22e0: 6b 2c 20 74 68 65 6e 20 74 68 65 20 42 74 72 65  k, then the Btre
22f0: 65 20 6d 75 73 74 20 68 61 76 65 20 61 6e 20 6f  e must have an o
2300: 70 65 6e 20 77 72 69 74 65 0a 20 20 2a 2a 20 74  pen write.  ** t
2310: 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68  ransaction on th
2320: 69 73 20 66 69 6c 65 2e 20 41 6e 64 2c 20 6f 62  is file. And, ob
2330: 76 69 6f 75 73 6c 79 2c 20 66 6f 72 20 74 68 69  viously, for thi
2340: 73 20 74 6f 20 62 65 20 73 6f 20 74 68 65 72 65  s to be so there
2350: 20 0a 20 20 2a 2a 20 6d 75 73 74 20 62 65 20 61   .  ** must be a
2360: 6e 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61  n open write tra
2370: 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20  nsaction on the 
2380: 66 69 6c 65 20 69 74 73 65 6c 66 2e 0a 20 20 2a  file itself..  *
2390: 2f 0a 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63  /.  assert( eLoc
23a0: 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20  k==READ_LOCK || 
23b0: 28 70 3d 3d 70 42 74 2d 3e 70 57 72 69 74 65 72  (p==pBt->pWriter
23c0: 20 26 26 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d   && p->inTrans==
23d0: 54 52 41 4e 53 5f 57 52 49 54 45 29 20 29 3b 0a  TRANS_WRITE) );.
23e0: 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d    assert( eLock=
23f0: 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 70 42  =READ_LOCK || pB
2400: 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
2410: 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b  ==TRANS_WRITE );
2420: 0a 20 20 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f  .  .  /* This ro
2430: 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
2440: 20 69 66 20 74 68 65 20 73 68 61 72 65 64 2d 63   if the shared-c
2450: 61 63 68 65 20 69 73 20 6e 6f 74 20 65 6e 61 62  ache is not enab
2460: 6c 65 64 20 2a 2f 0a 20 20 69 66 28 20 21 70 2d  led */.  if( !p-
2470: 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20  >sharable ){.   
2480: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2490: 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  K;.  }..  /* If 
24a0: 73 6f 6d 65 20 6f 74 68 65 72 20 63 6f 6e 6e 65  some other conne
24b0: 63 74 69 6f 6e 20 69 73 20 68 6f 6c 64 69 6e 67  ction is holding
24c0: 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
24d0: 63 6b 2c 20 74 68 65 0a 20 20 2a 2a 20 72 65 71  ck, the.  ** req
24e0: 75 65 73 74 65 64 20 6c 6f 63 6b 20 6d 61 79 20  uested lock may 
24f0: 6e 6f 74 20 62 65 20 6f 62 74 61 69 6e 65 64 2e  not be obtained.
2500: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d  .  */.  if( pBt-
2510: 3e 70 57 72 69 74 65 72 21 3d 70 20 26 26 20 28  >pWriter!=p && (
2520: 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20  pBt->btsFlags & 
2530: 42 54 53 5f 45 58 43 4c 55 53 49 56 45 29 21 3d  BTS_EXCLUSIVE)!=
2540: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
2550: 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63 6b 65  ConnectionBlocke
2560: 64 28 70 2d 3e 64 62 2c 20 70 42 74 2d 3e 70 57  d(p->db, pBt->pW
2570: 72 69 74 65 72 2d 3e 64 62 29 3b 0a 20 20 20 20  riter->db);.    
2580: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f  return SQLITE_LO
2590: 43 4b 45 44 5f 53 48 41 52 45 44 43 41 43 48 45  CKED_SHAREDCACHE
25a0: 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72 28 70 49 74  ;.  }..  for(pIt
25b0: 65 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70  er=pBt->pLock; p
25c0: 49 74 65 72 3b 20 70 49 74 65 72 3d 70 49 74 65  Iter; pIter=pIte
25d0: 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 2f  r->pNext){.    /
25e0: 2a 20 54 68 65 20 63 6f 6e 64 69 74 69 6f 6e 20  * The condition 
25f0: 28 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 21 3d 65  (pIter->eLock!=e
2600: 4c 6f 63 6b 29 20 69 6e 20 74 68 65 20 66 6f 6c  Lock) in the fol
2610: 6c 6f 77 69 6e 67 20 69 66 28 2e 2e 2e 29 20 0a  lowing if(...) .
2620: 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74      ** statement
2630: 20 69 73 20 61 20 73 69 6d 70 6c 69 66 69 63 61   is a simplifica
2640: 74 69 6f 6e 20 6f 66 3a 0a 20 20 20 20 2a 2a 0a  tion of:.    **.
2650: 20 20 20 20 2a 2a 20 20 20 28 65 4c 6f 63 6b 3d      **   (eLock=
2660: 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 7c 7c 20 70  =WRITE_LOCK || p
2670: 49 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 57 52 49  Iter->eLock==WRI
2680: 54 45 5f 4c 4f 43 4b 29 0a 20 20 20 20 2a 2a 0a  TE_LOCK).    **.
2690: 20 20 20 20 2a 2a 20 73 69 6e 63 65 20 77 65 20      ** since we 
26a0: 6b 6e 6f 77 20 74 68 61 74 20 69 66 20 65 4c 6f  know that if eLo
26b0: 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 2c 20  ck==WRITE_LOCK, 
26c0: 74 68 65 6e 20 6e 6f 20 6f 74 68 65 72 20 63 6f  then no other co
26d0: 6e 6e 65 63 74 69 6f 6e 0a 20 20 20 20 2a 2a 20  nnection.    ** 
26e0: 6d 61 79 20 68 6f 6c 64 20 61 20 57 52 49 54 45  may hold a WRITE
26f0: 5f 4c 4f 43 4b 20 6f 6e 20 61 6e 79 20 74 61 62  _LOCK on any tab
2700: 6c 65 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20  le in this file 
2710: 28 73 69 6e 63 65 20 74 68 65 72 65 20 63 61 6e  (since there can
2720: 0a 20 20 20 20 2a 2a 20 6f 6e 6c 79 20 62 65 20  .    ** only be 
2730: 61 20 73 69 6e 67 6c 65 20 77 72 69 74 65 72 29  a single writer)
2740: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
2750: 65 72 74 28 20 70 49 74 65 72 2d 3e 65 4c 6f 63  ert( pIter->eLoc
2760: 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20  k==READ_LOCK || 
2770: 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 57 52  pIter->eLock==WR
2780: 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20  ITE_LOCK );.    
2790: 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52  assert( eLock==R
27a0: 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49 74 65  EAD_LOCK || pIte
27b0: 72 2d 3e 70 42 74 72 65 65 3d 3d 70 20 7c 7c 20  r->pBtree==p || 
27c0: 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 52 45  pIter->eLock==RE
27d0: 41 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66  AD_LOCK);.    if
27e0: 28 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65 21  ( pIter->pBtree!
27f0: 3d 70 20 26 26 20 70 49 74 65 72 2d 3e 69 54 61  =p && pIter->iTa
2800: 62 6c 65 3d 3d 69 54 61 62 20 26 26 20 70 49 74  ble==iTab && pIt
2810: 65 72 2d 3e 65 4c 6f 63 6b 21 3d 65 4c 6f 63 6b  er->eLock!=eLock
2820: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
2830: 33 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63 6b  3ConnectionBlock
2840: 65 64 28 70 2d 3e 64 62 2c 20 70 49 74 65 72 2d  ed(p->db, pIter-
2850: 3e 70 42 74 72 65 65 2d 3e 64 62 29 3b 0a 20 20  >pBtree->db);.  
2860: 20 20 20 20 69 66 28 20 65 4c 6f 63 6b 3d 3d 57      if( eLock==W
2870: 52 49 54 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  RITE_LOCK ){.   
2880: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 3d 3d       assert( p==
2890: 70 42 74 2d 3e 70 57 72 69 74 65 72 20 29 3b 0a  pBt->pWriter );.
28a0: 20 20 20 20 20 20 20 20 70 42 74 2d 3e 62 74 73          pBt->bts
28b0: 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 50 45 4e  Flags |= BTS_PEN
28c0: 44 49 4e 47 3b 0a 20 20 20 20 20 20 7d 0a 20 20  DING;.      }.  
28d0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
28e0: 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44 43  E_LOCKED_SHAREDC
28f0: 41 43 48 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ACHE;.    }.  }.
2900: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2910: 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  OK;.}.#endif /* 
2920: 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41  !SQLITE_OMIT_SHA
2930: 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 23 69  RED_CACHE */..#i
2940: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2950: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 2f  T_SHARED_CACHE./
2960: 2a 0a 2a 2a 20 41 64 64 20 61 20 6c 6f 63 6b 20  *.** Add a lock 
2970: 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 77 69 74  on the table wit
2980: 68 20 72 6f 6f 74 2d 70 61 67 65 20 69 54 61 62  h root-page iTab
2990: 6c 65 20 74 6f 20 74 68 65 20 73 68 61 72 65 64  le to the shared
29a0: 2d 62 74 72 65 65 20 75 73 65 64 0a 2a 2a 20 62  -btree used.** b
29b0: 79 20 42 74 72 65 65 20 68 61 6e 64 6c 65 20 70  y Btree handle p
29c0: 2e 20 50 61 72 61 6d 65 74 65 72 20 65 4c 6f 63  . Parameter eLoc
29d0: 6b 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72  k must be either
29e0: 20 52 45 41 44 5f 4c 4f 43 4b 20 6f 72 20 0a 2a   READ_LOCK or .*
29f0: 2a 20 57 52 49 54 45 5f 4c 4f 43 4b 2e 0a 2a 2a  * WRITE_LOCK..**
2a00: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
2a10: 6e 20 61 73 73 75 6d 65 73 20 74 68 65 20 66 6f  n assumes the fo
2a20: 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20  llowing:.**.**  
2a30: 20 28 61 29 20 54 68 65 20 73 70 65 63 69 66 69   (a) The specifi
2a40: 65 64 20 42 74 72 65 65 20 6f 62 6a 65 63 74 20  ed Btree object 
2a50: 70 20 69 73 20 63 6f 6e 6e 65 63 74 65 64 20 74  p is connected t
2a60: 6f 20 61 20 73 68 61 72 61 62 6c 65 0a 2a 2a 20  o a sharable.** 
2a70: 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20 28        database (
2a80: 6f 6e 65 20 77 69 74 68 20 74 68 65 20 42 74 53  one with the BtS
2a90: 68 61 72 65 64 2e 73 68 61 72 61 62 6c 65 20 66  hared.sharable f
2aa0: 6c 61 67 20 73 65 74 29 2c 20 61 6e 64 0a 2a 2a  lag set), and.**
2ab0: 0a 2a 2a 20 20 20 28 62 29 20 4e 6f 20 6f 74 68  .**   (b) No oth
2ac0: 65 72 20 42 74 72 65 65 20 6f 62 6a 65 63 74 73  er Btree objects
2ad0: 20 68 6f 6c 64 20 61 20 6c 6f 63 6b 20 74 68 61   hold a lock tha
2ae0: 74 20 63 6f 6e 66 6c 69 63 74 73 0a 2a 2a 20 20  t conflicts.**  
2af0: 20 20 20 20 20 77 69 74 68 20 74 68 65 20 72 65       with the re
2b00: 71 75 65 73 74 65 64 20 6c 6f 63 6b 20 28 69 2e  quested lock (i.
2b10: 65 2e 20 71 75 65 72 79 53 68 61 72 65 64 43 61  e. querySharedCa
2b20: 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29 20 68  cheTableLock() h
2b30: 61 73 0a 2a 2a 20 20 20 20 20 20 20 61 6c 72 65  as.**       alre
2b40: 61 64 79 20 62 65 65 6e 20 63 61 6c 6c 65 64 20  ady been called 
2b50: 61 6e 64 20 72 65 74 75 72 6e 65 64 20 53 51 4c  and returned SQL
2b60: 49 54 45 5f 4f 4b 29 2e 0a 2a 2a 0a 2a 2a 20 53  ITE_OK)..**.** S
2b70: 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
2b80: 72 6e 65 64 20 69 66 20 74 68 65 20 6c 6f 63 6b  rned if the lock
2b90: 20 69 73 20 61 64 64 65 64 20 73 75 63 63 65 73   is added succes
2ba0: 73 66 75 6c 6c 79 2e 20 53 51 4c 49 54 45 5f 4e  sfully. SQLITE_N
2bb0: 4f 4d 45 4d 20 0a 2a 2a 20 69 73 20 72 65 74 75  OMEM .** is retu
2bc0: 72 6e 65 64 20 69 66 20 61 20 6d 61 6c 6c 6f 63  rned if a malloc
2bd0: 20 61 74 74 65 6d 70 74 20 66 61 69 6c 73 2e 0a   attempt fails..
2be0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65  */.static int se
2bf0: 74 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  tSharedCacheTabl
2c00: 65 4c 6f 63 6b 28 42 74 72 65 65 20 2a 70 2c 20  eLock(Btree *p, 
2c10: 50 67 6e 6f 20 69 54 61 62 6c 65 2c 20 75 38 20  Pgno iTable, u8 
2c20: 65 4c 6f 63 6b 29 7b 0a 20 20 42 74 53 68 61 72  eLock){.  BtShar
2c30: 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
2c40: 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63  ;.  BtLock *pLoc
2c50: 6b 20 3d 20 30 3b 0a 20 20 42 74 4c 6f 63 6b 20  k = 0;.  BtLock 
2c60: 2a 70 49 74 65 72 3b 0a 0a 20 20 61 73 73 65 72  *pIter;..  asser
2c70: 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48  t( sqlite3BtreeH
2c80: 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a  oldsMutex(p) );.
2c90: 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d    assert( eLock=
2ca0: 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c  =READ_LOCK || eL
2cb0: 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20  ock==WRITE_LOCK 
2cc0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
2cd0: 64 62 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 41  db!=0 );..  /* A
2ce0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68   connection with
2cf0: 20 74 68 65 20 72 65 61 64 2d 75 6e 63 6f 6d 6d   the read-uncomm
2d00: 69 74 74 65 64 20 66 6c 61 67 20 73 65 74 20 77  itted flag set w
2d10: 69 6c 6c 20 6e 65 76 65 72 20 74 72 79 20 74 6f  ill never try to
2d20: 0a 20 20 2a 2a 20 6f 62 74 61 69 6e 20 61 20 72  .  ** obtain a r
2d30: 65 61 64 2d 6c 6f 63 6b 20 75 73 69 6e 67 20 74  ead-lock using t
2d40: 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 54 68  his function. Th
2d50: 65 20 6f 6e 6c 79 20 72 65 61 64 2d 6c 6f 63 6b  e only read-lock
2d60: 20 6f 62 74 61 69 6e 65 64 0a 20 20 2a 2a 20 62   obtained.  ** b
2d70: 79 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69  y a connection i
2d80: 6e 20 72 65 61 64 2d 75 6e 63 6f 6d 6d 69 74 74  n read-uncommitt
2d90: 65 64 20 6d 6f 64 65 20 69 73 20 6f 6e 20 74 68  ed mode is on th
2da0: 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  e sqlite_master 
2db0: 0a 20 20 2a 2a 20 74 61 62 6c 65 2c 20 61 6e 64  .  ** table, and
2dc0: 20 74 68 61 74 20 6c 6f 63 6b 20 69 73 20 6f 62   that lock is ob
2dd0: 74 61 69 6e 65 64 20 69 6e 20 42 74 72 65 65 42  tained in BtreeB
2de0: 65 67 69 6e 54 72 61 6e 73 28 29 2e 20 20 2a 2f  eginTrans().  */
2df0: 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d 28 70  .  assert( 0==(p
2e00: 2d 3e 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49  ->db->flags&SQLI
2e10: 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74  TE_ReadUncommitt
2e20: 65 64 29 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 57 52  ed) || eLock==WR
2e30: 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f  ITE_LOCK );..  /
2e40: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
2e50: 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20 63  should only be c
2e60: 61 6c 6c 65 64 20 6f 6e 20 61 20 73 68 61 72 61  alled on a shara
2e70: 62 6c 65 20 62 2d 74 72 65 65 20 61 66 74 65 72  ble b-tree after
2e80: 20 69 74 20 0a 20 20 2a 2a 20 68 61 73 20 62 65   it .  ** has be
2e90: 65 6e 20 64 65 74 65 72 6d 69 6e 65 64 20 74 68  en determined th
2ea0: 61 74 20 6e 6f 20 6f 74 68 65 72 20 62 2d 74 72  at no other b-tr
2eb0: 65 65 20 68 6f 6c 64 73 20 61 20 63 6f 6e 66 6c  ee holds a confl
2ec0: 69 63 74 69 6e 67 20 6c 6f 63 6b 2e 20 20 2a 2f  icting lock.  */
2ed0: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 73 68  .  assert( p->sh
2ee0: 61 72 61 62 6c 65 20 29 3b 0a 20 20 61 73 73 65  arable );.  asse
2ef0: 72 74 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 71  rt( SQLITE_OK==q
2f00: 75 65 72 79 53 68 61 72 65 64 43 61 63 68 65 54  uerySharedCacheT
2f10: 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 69 54 61 62  ableLock(p, iTab
2f20: 6c 65 2c 20 65 4c 6f 63 6b 29 20 29 3b 0a 0a 20  le, eLock) );.. 
2f30: 20 2f 2a 20 46 69 72 73 74 20 73 65 61 72 63 68   /* First search
2f40: 20 74 68 65 20 6c 69 73 74 20 66 6f 72 20 61 6e   the list for an
2f50: 20 65 78 69 73 74 69 6e 67 20 6c 6f 63 6b 20 6f   existing lock o
2f60: 6e 20 74 68 69 73 20 74 61 62 6c 65 2e 20 2a 2f  n this table. */
2f70: 0a 20 20 66 6f 72 28 70 49 74 65 72 3d 70 42 74  .  for(pIter=pBt
2f80: 2d 3e 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20  ->pLock; pIter; 
2f90: 70 49 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65  pIter=pIter->pNe
2fa0: 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 49 74  xt){.    if( pIt
2fb0: 65 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62  er->iTable==iTab
2fc0: 6c 65 20 26 26 20 70 49 74 65 72 2d 3e 70 42 74  le && pIter->pBt
2fd0: 72 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20  ree==p ){.      
2fe0: 70 4c 6f 63 6b 20 3d 20 70 49 74 65 72 3b 0a 20  pLock = pIter;. 
2ff0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
3000: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  }.  }..  /* If t
3010: 68 65 20 61 62 6f 76 65 20 73 65 61 72 63 68 20  he above search 
3020: 64 69 64 20 6e 6f 74 20 66 69 6e 64 20 61 20 42  did not find a B
3030: 74 4c 6f 63 6b 20 73 74 72 75 63 74 20 61 73 73  tLock struct ass
3040: 6f 63 69 61 74 69 6e 67 20 42 74 72 65 65 20 70  ociating Btree p
3050: 0a 20 20 2a 2a 20 77 69 74 68 20 74 61 62 6c 65  .  ** with table
3060: 20 69 54 61 62 6c 65 2c 20 61 6c 6c 6f 63 61 74   iTable, allocat
3070: 65 20 6f 6e 65 20 61 6e 64 20 6c 69 6e 6b 20 69  e one and link i
3080: 74 20 69 6e 74 6f 20 74 68 65 20 6c 69 73 74 2e  t into the list.
3090: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 4c 6f  .  */.  if( !pLo
30a0: 63 6b 20 29 7b 0a 20 20 20 20 70 4c 6f 63 6b 20  ck ){.    pLock 
30b0: 3d 20 28 42 74 4c 6f 63 6b 20 2a 29 73 71 6c 69  = (BtLock *)sqli
30c0: 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73 69  te3MallocZero(si
30d0: 7a 65 6f 66 28 42 74 4c 6f 63 6b 29 29 3b 0a 20  zeof(BtLock));. 
30e0: 20 20 20 69 66 28 20 21 70 4c 6f 63 6b 20 29 7b     if( !pLock ){
30f0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
3100: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
3110: 7d 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 69 54 61  }.    pLock->iTa
3120: 62 6c 65 20 3d 20 69 54 61 62 6c 65 3b 0a 20 20  ble = iTable;.  
3130: 20 20 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 20    pLock->pBtree 
3140: 3d 20 70 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e  = p;.    pLock->
3150: 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70 4c 6f  pNext = pBt->pLo
3160: 63 6b 3b 0a 20 20 20 20 70 42 74 2d 3e 70 4c 6f  ck;.    pBt->pLo
3170: 63 6b 20 3d 20 70 4c 6f 63 6b 3b 0a 20 20 7d 0a  ck = pLock;.  }.
3180: 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 42 74  .  /* Set the Bt
3190: 4c 6f 63 6b 2e 65 4c 6f 63 6b 20 76 61 72 69 61  Lock.eLock varia
31a0: 62 6c 65 20 74 6f 20 74 68 65 20 6d 61 78 69 6d  ble to the maxim
31b0: 75 6d 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e  um of the curren
31c0: 74 20 6c 6f 63 6b 0a 20 20 2a 2a 20 61 6e 64 20  t lock.  ** and 
31d0: 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f  the requested lo
31e0: 63 6b 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 69  ck. This means i
31f0: 66 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 77  f a write-lock w
3200: 61 73 20 61 6c 72 65 61 64 79 20 68 65 6c 64 0a  as already held.
3210: 20 20 2a 2a 20 61 6e 64 20 61 20 72 65 61 64 2d    ** and a read-
3220: 6c 6f 63 6b 20 72 65 71 75 65 73 74 65 64 2c 20  lock requested, 
3230: 77 65 20 64 6f 6e 27 74 20 69 6e 63 6f 72 72 65  we don't incorre
3240: 63 74 6c 79 20 64 6f 77 6e 67 72 61 64 65 20 74  ctly downgrade t
3250: 68 65 20 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20  he lock..  */.  
3260: 61 73 73 65 72 74 28 20 57 52 49 54 45 5f 4c 4f  assert( WRITE_LO
3270: 43 4b 3e 52 45 41 44 5f 4c 4f 43 4b 20 29 3b 0a  CK>READ_LOCK );.
3280: 20 20 69 66 28 20 65 4c 6f 63 6b 3e 70 4c 6f 63    if( eLock>pLoc
3290: 6b 2d 3e 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20  k->eLock ){.    
32a0: 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 3d 20 65  pLock->eLock = e
32b0: 4c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  Lock;.  }..  ret
32c0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
32d0: 0a 23 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49  .#endif /* !SQLI
32e0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
32f0: 41 43 48 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  ACHE */..#ifndef
3300: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41   SQLITE_OMIT_SHA
3310: 52 45 44 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20  RED_CACHE./*.** 
3320: 52 65 6c 65 61 73 65 20 61 6c 6c 20 74 68 65 20  Release all the 
3330: 74 61 62 6c 65 20 6c 6f 63 6b 73 20 28 6c 6f 63  table locks (loc
3340: 6b 73 20 6f 62 74 61 69 6e 65 64 20 76 69 61 20  ks obtained via 
3350: 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20 74 68 65 20  calls to.** the 
3360: 73 65 74 53 68 61 72 65 64 43 61 63 68 65 54 61  setSharedCacheTa
3370: 62 6c 65 4c 6f 63 6b 28 29 20 70 72 6f 63 65 64  bleLock() proced
3380: 75 72 65 29 20 68 65 6c 64 20 62 79 20 42 74 72  ure) held by Btr
3390: 65 65 20 6f 62 6a 65 63 74 20 70 2e 0a 2a 2a 0a  ee object p..**.
33a0: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
33b0: 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 42 74   assumes that Bt
33c0: 72 65 65 20 70 20 68 61 73 20 61 6e 20 6f 70 65  ree p has an ope
33d0: 6e 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20  n read or write 
33e0: 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  .** transaction.
33f0: 20 49 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 2c   If it does not,
3400: 20 74 68 65 6e 20 74 68 65 20 42 54 53 5f 50 45   then the BTS_PE
3410: 4e 44 49 4e 47 20 66 6c 61 67 0a 2a 2a 20 6d 61  NDING flag.** ma
3420: 79 20 62 65 20 69 6e 63 6f 72 72 65 63 74 6c 79  y be incorrectly
3430: 20 63 6c 65 61 72 65 64 2e 0a 2a 2f 0a 73 74 61   cleared..*/.sta
3440: 74 69 63 20 76 6f 69 64 20 63 6c 65 61 72 41 6c  tic void clearAl
3450: 6c 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  lSharedCacheTabl
3460: 65 4c 6f 63 6b 73 28 42 74 72 65 65 20 2a 70 29  eLocks(Btree *p)
3470: 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
3480: 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74  t = p->pBt;.  Bt
3490: 4c 6f 63 6b 20 2a 2a 70 70 49 74 65 72 20 3d 20  Lock **ppIter = 
34a0: 26 70 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 0a 20 20  &pBt->pLock;..  
34b0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42  assert( sqlite3B
34c0: 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70  treeHoldsMutex(p
34d0: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
34e0: 2d 3e 73 68 61 72 61 62 6c 65 20 7c 7c 20 30 3d  ->sharable || 0=
34f0: 3d 2a 70 70 49 74 65 72 20 29 3b 0a 20 20 61 73  =*ppIter );.  as
3500: 73 65 72 74 28 20 70 2d 3e 69 6e 54 72 61 6e 73  sert( p->inTrans
3510: 3e 30 20 29 3b 0a 0a 20 20 77 68 69 6c 65 28 20  >0 );..  while( 
3520: 2a 70 70 49 74 65 72 20 29 7b 0a 20 20 20 20 42  *ppIter ){.    B
3530: 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 20 3d 20 2a  tLock *pLock = *
3540: 70 70 49 74 65 72 3b 0a 20 20 20 20 61 73 73 65  ppIter;.    asse
3550: 72 74 28 20 28 70 42 74 2d 3e 62 74 73 46 6c 61  rt( (pBt->btsFla
3560: 67 73 20 26 20 42 54 53 5f 45 58 43 4c 55 53 49  gs & BTS_EXCLUSI
3570: 56 45 29 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 70  VE)==0 || pBt->p
3580: 57 72 69 74 65 72 3d 3d 70 4c 6f 63 6b 2d 3e 70  Writer==pLock->p
3590: 42 74 72 65 65 20 29 3b 0a 20 20 20 20 61 73 73  Btree );.    ass
35a0: 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 70 42 74 72  ert( pLock->pBtr
35b0: 65 65 2d 3e 69 6e 54 72 61 6e 73 3e 3d 70 4c 6f  ee->inTrans>=pLo
35c0: 63 6b 2d 3e 65 4c 6f 63 6b 20 29 3b 0a 20 20 20  ck->eLock );.   
35d0: 20 69 66 28 20 70 4c 6f 63 6b 2d 3e 70 42 74 72   if( pLock->pBtr
35e0: 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20 2a  ee==p ){.      *
35f0: 70 70 49 74 65 72 20 3d 20 70 4c 6f 63 6b 2d 3e  ppIter = pLock->
3600: 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 61 73 73  pNext;.      ass
3610: 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 69 54 61 62  ert( pLock->iTab
3620: 6c 65 21 3d 31 20 7c 7c 20 70 4c 6f 63 6b 3d 3d  le!=1 || pLock==
3630: 26 70 2d 3e 6c 6f 63 6b 20 29 3b 0a 20 20 20 20  &p->lock );.    
3640: 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e 69 54 61    if( pLock->iTa
3650: 62 6c 65 21 3d 31 20 29 7b 0a 20 20 20 20 20 20  ble!=1 ){.      
3660: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
3670: 4c 6f 63 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Lock);.      }. 
3680: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
3690: 70 70 49 74 65 72 20 3d 20 26 70 4c 6f 63 6b 2d  ppIter = &pLock-
36a0: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20  >pNext;.    }.  
36b0: 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 28 70 42  }..  assert( (pB
36c0: 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54  t->btsFlags & BT
36d0: 53 5f 50 45 4e 44 49 4e 47 29 3d 3d 30 20 7c 7c  S_PENDING)==0 ||
36e0: 20 70 42 74 2d 3e 70 57 72 69 74 65 72 20 29 3b   pBt->pWriter );
36f0: 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 57 72 69  .  if( pBt->pWri
3700: 74 65 72 3d 3d 70 20 29 7b 0a 20 20 20 20 70 42  ter==p ){.    pB
3710: 74 2d 3e 70 57 72 69 74 65 72 20 3d 20 30 3b 0a  t->pWriter = 0;.
3720: 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67      pBt->btsFlag
3730: 73 20 26 3d 20 7e 28 42 54 53 5f 45 58 43 4c 55  s &= ~(BTS_EXCLU
3740: 53 49 56 45 7c 42 54 53 5f 50 45 4e 44 49 4e 47  SIVE|BTS_PENDING
3750: 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  );.  }else if( p
3760: 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e  Bt->nTransaction
3770: 3d 3d 32 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  ==2 ){.    /* Th
3780: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
3790: 61 6c 6c 65 64 20 77 68 65 6e 20 42 74 72 65 65  alled when Btree
37a0: 20 70 20 69 73 20 63 6f 6e 63 6c 75 64 69 6e 67   p is concluding
37b0: 20 69 74 73 20 0a 20 20 20 20 2a 2a 20 74 72 61   its .    ** tra
37c0: 6e 73 61 63 74 69 6f 6e 2e 20 49 66 20 74 68 65  nsaction. If the
37d0: 72 65 20 63 75 72 72 65 6e 74 6c 79 20 65 78 69  re currently exi
37e0: 73 74 73 20 61 20 77 72 69 74 65 72 2c 20 61 6e  sts a writer, an
37f0: 64 20 70 20 69 73 20 6e 6f 74 0a 20 20 20 20 2a  d p is not.    *
3800: 2a 20 74 68 61 74 20 77 72 69 74 65 72 2c 20 74  * that writer, t
3810: 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  hen the number o
3820: 66 20 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79 20  f locks held by 
3830: 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f 74 68 65  connections othe
3840: 72 0a 20 20 20 20 2a 2a 20 74 68 61 6e 20 74 68  r.    ** than th
3850: 65 20 77 72 69 74 65 72 20 6d 75 73 74 20 62 65  e writer must be
3860: 20 61 62 6f 75 74 20 74 6f 20 64 72 6f 70 20 74   about to drop t
3870: 6f 20 7a 65 72 6f 2e 20 49 6e 20 74 68 69 73 20  o zero. In this 
3880: 63 61 73 65 0a 20 20 20 20 2a 2a 20 73 65 74 20  case.    ** set 
3890: 74 68 65 20 42 54 53 5f 50 45 4e 44 49 4e 47 20  the BTS_PENDING 
38a0: 66 6c 61 67 20 74 6f 20 30 2e 0a 20 20 20 20 2a  flag to 0..    *
38b0: 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65 72  *.    ** If ther
38c0: 65 20 69 73 20 6e 6f 74 20 63 75 72 72 65 6e 74  e is not current
38d0: 6c 79 20 61 20 77 72 69 74 65 72 2c 20 74 68 65  ly a writer, the
38e0: 6e 20 42 54 53 5f 50 45 4e 44 49 4e 47 20 6d 75  n BTS_PENDING mu
38f0: 73 74 0a 20 20 20 20 2a 2a 20 62 65 20 7a 65 72  st.    ** be zer
3900: 6f 20 61 6c 72 65 61 64 79 2e 20 53 6f 20 74 68  o already. So th
3910: 69 73 20 6e 65 78 74 20 6c 69 6e 65 20 69 73 20  is next line is 
3920: 68 61 72 6d 6c 65 73 73 20 69 6e 20 74 68 61 74  harmless in that
3930: 20 63 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   case..    */.  
3940: 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20    pBt->btsFlags 
3950: 26 3d 20 7e 42 54 53 5f 50 45 4e 44 49 4e 47 3b  &= ~BTS_PENDING;
3960: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
3970: 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 68 61 6e  is function chan
3980: 67 65 73 20 61 6c 6c 20 77 72 69 74 65 2d 6c 6f  ges all write-lo
3990: 63 6b 73 20 68 65 6c 64 20 62 79 20 42 74 72 65  cks held by Btre
39a0: 65 20 70 20 69 6e 74 6f 20 72 65 61 64 2d 6c 6f  e p into read-lo
39b0: 63 6b 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  cks..*/.static v
39c0: 6f 69 64 20 64 6f 77 6e 67 72 61 64 65 41 6c 6c  oid downgradeAll
39d0: 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
39e0: 4c 6f 63 6b 73 28 42 74 72 65 65 20 2a 70 29 7b  Locks(Btree *p){
39f0: 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
3a00: 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 66 28   = p->pBt;.  if(
3a10: 20 70 42 74 2d 3e 70 57 72 69 74 65 72 3d 3d 70   pBt->pWriter==p
3a20: 20 29 7b 0a 20 20 20 20 42 74 4c 6f 63 6b 20 2a   ){.    BtLock *
3a30: 70 4c 6f 63 6b 3b 0a 20 20 20 20 70 42 74 2d 3e  pLock;.    pBt->
3a40: 70 57 72 69 74 65 72 20 3d 20 30 3b 0a 20 20 20  pWriter = 0;.   
3a50: 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26   pBt->btsFlags &
3a60: 3d 20 7e 28 42 54 53 5f 45 58 43 4c 55 53 49 56  = ~(BTS_EXCLUSIV
3a70: 45 7c 42 54 53 5f 50 45 4e 44 49 4e 47 29 3b 0a  E|BTS_PENDING);.
3a80: 20 20 20 20 66 6f 72 28 70 4c 6f 63 6b 3d 70 42      for(pLock=pB
3a90: 74 2d 3e 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b 3b  t->pLock; pLock;
3aa0: 20 70 4c 6f 63 6b 3d 70 4c 6f 63 6b 2d 3e 70 4e   pLock=pLock->pN
3ab0: 65 78 74 29 7b 0a 20 20 20 20 20 20 61 73 73 65  ext){.      asse
3ac0: 72 74 28 20 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b  rt( pLock->eLock
3ad0: 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 70  ==READ_LOCK || p
3ae0: 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 3d 3d 70 20  Lock->pBtree==p 
3af0: 29 3b 0a 20 20 20 20 20 20 70 4c 6f 63 6b 2d 3e  );.      pLock->
3b00: 65 4c 6f 63 6b 20 3d 20 52 45 41 44 5f 4c 4f 43  eLock = READ_LOC
3b10: 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  K;.    }.  }.}..
3b20: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
3b30: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
3b40: 48 45 20 2a 2f 0a 0a 73 74 61 74 69 63 20 76 6f  HE */..static vo
3b50: 69 64 20 72 65 6c 65 61 73 65 50 61 67 65 28 4d  id releasePage(M
3b60: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 3b 20  emPage *pPage); 
3b70: 20 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65   /* Forward refe
3b80: 72 65 6e 63 65 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 2a  rence */../*.***
3b90: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
3ba0: 69 73 20 75 73 65 64 20 69 6e 73 69 64 65 20 6f  is used inside o
3bb0: 66 20 61 73 73 65 72 74 28 29 20 6f 6e 6c 79 20  f assert() only 
3bc0: 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 56 65 72 69 66  ****.**.** Verif
3bd0: 79 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f  y that the curso
3be0: 72 20 68 6f 6c 64 73 20 74 68 65 20 6d 75 74 65  r holds the mute
3bf0: 78 20 6f 6e 20 69 74 73 20 42 74 53 68 61 72 65  x on its BtShare
3c00: 64 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  d.*/.#ifdef SQLI
3c10: 54 45 5f 44 45 42 55 47 0a 73 74 61 74 69 63 20  TE_DEBUG.static 
3c20: 69 6e 74 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  int cursorHoldsM
3c30: 75 74 65 78 28 42 74 43 75 72 73 6f 72 20 2a 70  utex(BtCursor *p
3c40: 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  ){.  return sqli
3c50: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
3c60: 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 3b 0a 7d  ->pBt->mutex);.}
3c70: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49  .#endif../*.** I
3c80: 6e 76 61 6c 69 64 61 74 65 20 74 68 65 20 6f 76  nvalidate the ov
3c90: 65 72 66 6c 6f 77 20 63 61 63 68 65 20 6f 66 20  erflow cache of 
3ca0: 74 68 65 20 63 75 72 73 6f 72 20 70 61 73 73 65  the cursor passe
3cb0: 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61  d as the first a
3cc0: 72 67 75 6d 65 6e 74 2e 0a 2a 2a 20 6f 6e 20 74  rgument..** on t
3cd0: 68 65 20 73 68 61 72 65 64 20 62 74 72 65 65 20  he shared btree 
3ce0: 73 74 72 75 63 74 75 72 65 20 70 42 74 2e 0a 2a  structure pBt..*
3cf0: 2f 0a 23 64 65 66 69 6e 65 20 69 6e 76 61 6c 69  /.#define invali
3d00: 64 61 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68  dateOverflowCach
3d10: 65 28 70 43 75 72 29 20 28 70 43 75 72 2d 3e 63  e(pCur) (pCur->c
3d20: 75 72 46 6c 61 67 73 20 26 3d 20 7e 42 54 43 46  urFlags &= ~BTCF
3d30: 5f 56 61 6c 69 64 4f 76 66 6c 29 0a 0a 2f 2a 0a  _ValidOvfl)../*.
3d40: 2a 2a 20 49 6e 76 61 6c 69 64 61 74 65 20 74 68  ** Invalidate th
3d50: 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d  e overflow page-
3d60: 6c 69 73 74 20 63 61 63 68 65 20 66 6f 72 20 61  list cache for a
3d70: 6c 6c 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 65  ll cursors opene
3d80: 64 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 68 61 72  d.** on the shar
3d90: 65 64 20 62 74 72 65 65 20 73 74 72 75 63 74 75  ed btree structu
3da0: 72 65 20 70 42 74 2e 0a 2a 2f 0a 73 74 61 74 69  re pBt..*/.stati
3db0: 63 20 76 6f 69 64 20 69 6e 76 61 6c 69 64 61 74  c void invalidat
3dc0: 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68  eAllOverflowCach
3dd0: 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29  e(BtShared *pBt)
3de0: 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b  {.  BtCursor *p;
3df0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
3e00: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
3e10: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 66  t->mutex) );.  f
3e20: 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75 72 73 6f  or(p=pBt->pCurso
3e30: 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74  r; p; p=p->pNext
3e40: 29 7b 0a 20 20 20 20 69 6e 76 61 6c 69 64 61 74  ){.    invalidat
3e50: 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70  eOverflowCache(p
3e60: 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65  );.  }.}..#ifnde
3e70: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e  f SQLITE_OMIT_IN
3e80: 43 52 42 4c 4f 42 0a 2f 2a 0a 2a 2a 20 54 68 69  CRBLOB./*.** Thi
3e90: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
3ea0: 6c 6c 65 64 20 62 65 66 6f 72 65 20 6d 6f 64 69  lled before modi
3eb0: 66 79 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e  fying the conten
3ec0: 74 73 20 6f 66 20 61 20 74 61 62 6c 65 0a 2a 2a  ts of a table.**
3ed0: 20 74 6f 20 69 6e 76 61 6c 69 64 61 74 65 20 61   to invalidate a
3ee0: 6e 79 20 69 6e 63 72 62 6c 6f 62 20 63 75 72 73  ny incrblob curs
3ef0: 6f 72 73 20 74 68 61 74 20 61 72 65 20 6f 70 65  ors that are ope
3f00: 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 72 6f 77 20  n on the.** row 
3f10: 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 72 6f  or one of the ro
3f20: 77 73 20 62 65 69 6e 67 20 6d 6f 64 69 66 69 65  ws being modifie
3f30: 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 72 67 75  d..**.** If argu
3f40: 6d 65 6e 74 20 69 73 43 6c 65 61 72 54 61 62 6c  ment isClearTabl
3f50: 65 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20  e is true, then 
3f60: 74 68 65 20 65 6e 74 69 72 65 20 63 6f 6e 74 65  the entire conte
3f70: 6e 74 73 20 6f 66 20 74 68 65 0a 2a 2a 20 74 61  nts of the.** ta
3f80: 62 6c 65 20 69 73 20 61 62 6f 75 74 20 74 6f 20  ble is about to 
3f90: 62 65 20 64 65 6c 65 74 65 64 2e 20 49 6e 20 74  be deleted. In t
3fa0: 68 69 73 20 63 61 73 65 20 69 6e 76 61 6c 69 64  his case invalid
3fb0: 61 74 65 20 61 6c 6c 20 69 6e 63 72 62 6c 6f 62  ate all incrblob
3fc0: 0a 2a 2a 20 63 75 72 73 6f 72 73 20 6f 70 65 6e  .** cursors open
3fd0: 20 6f 6e 20 61 6e 79 20 72 6f 77 20 77 69 74 68   on any row with
3fe0: 69 6e 20 74 68 65 20 74 61 62 6c 65 20 77 69 74  in the table wit
3ff0: 68 20 72 6f 6f 74 2d 70 61 67 65 20 70 67 6e 6f  h root-page pgno
4000: 52 6f 6f 74 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65  Root..**.** Othe
4010: 72 77 69 73 65 2c 20 69 66 20 61 72 67 75 6d 65  rwise, if argume
4020: 6e 74 20 69 73 43 6c 65 61 72 54 61 62 6c 65 20  nt isClearTable 
4030: 69 73 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 74  is false, then t
4040: 68 65 20 72 6f 77 20 77 69 74 68 0a 2a 2a 20 72  he row with.** r
4050: 6f 77 69 64 20 69 52 6f 77 20 69 73 20 62 65 69  owid iRow is bei
4060: 6e 67 20 72 65 70 6c 61 63 65 64 20 6f 72 20 64  ng replaced or d
4070: 65 6c 65 74 65 64 2e 20 49 6e 20 74 68 69 73 20  eleted. In this 
4080: 63 61 73 65 20 69 6e 76 61 6c 69 64 61 74 65 0a  case invalidate.
4090: 2a 2a 20 6f 6e 6c 79 20 74 68 6f 73 65 20 69 6e  ** only those in
40a0: 63 72 62 6c 6f 62 20 63 75 72 73 6f 72 73 20 6f  crblob cursors o
40b0: 70 65 6e 20 6f 6e 20 74 68 61 74 20 73 70 65 63  pen on that spec
40c0: 69 66 69 63 20 72 6f 77 2e 0a 2a 2f 0a 73 74 61  ific row..*/.sta
40d0: 74 69 63 20 76 6f 69 64 20 69 6e 76 61 6c 69 64  tic void invalid
40e0: 61 74 65 49 6e 63 72 62 6c 6f 62 43 75 72 73 6f  ateIncrblobCurso
40f0: 72 73 28 0a 20 20 42 74 72 65 65 20 2a 70 42 74  rs(.  Btree *pBt
4100: 72 65 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  ree,          /*
4110: 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66 69   The database fi
4120: 6c 65 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20  le to check */. 
4130: 20 69 36 34 20 69 52 6f 77 2c 20 20 20 20 20 20   i64 iRow,      
4140: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
4150: 72 6f 77 69 64 20 74 68 61 74 20 6d 69 67 68 74  rowid that might
4160: 20 62 65 20 63 68 61 6e 67 69 6e 67 20 2a 2f 0a   be changing */.
4170: 20 20 69 6e 74 20 69 73 43 6c 65 61 72 54 61 62    int isClearTab
4180: 6c 65 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75  le        /* Tru
4190: 65 20 69 66 20 61 6c 6c 20 72 6f 77 73 20 61 72  e if all rows ar
41a0: 65 20 62 65 69 6e 67 20 64 65 6c 65 74 65 64 20  e being deleted 
41b0: 2a 2f 0a 29 7b 0a 20 20 42 74 43 75 72 73 6f 72  */.){.  BtCursor
41c0: 20 2a 70 3b 0a 20 20 69 66 28 20 70 42 74 72 65   *p;.  if( pBtre
41d0: 65 2d 3e 68 61 73 49 6e 63 72 62 6c 6f 62 43 75  e->hasIncrblobCu
41e0: 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  r==0 ) return;. 
41f0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
4200: 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28  BtreeHoldsMutex(
4210: 70 42 74 72 65 65 29 20 29 3b 0a 20 20 70 42 74  pBtree) );.  pBt
4220: 72 65 65 2d 3e 68 61 73 49 6e 63 72 62 6c 6f 62  ree->hasIncrblob
4230: 43 75 72 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70  Cur = 0;.  for(p
4240: 3d 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 43  =pBtree->pBt->pC
4250: 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70  ursor; p; p=p->p
4260: 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 28  Next){.    if( (
4270: 70 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54  p->curFlags & BT
4280: 43 46 5f 49 6e 63 72 62 6c 6f 62 29 21 3d 30 20  CF_Incrblob)!=0 
4290: 29 7b 0a 20 20 20 20 20 20 70 42 74 72 65 65 2d  ){.      pBtree-
42a0: 3e 68 61 73 49 6e 63 72 62 6c 6f 62 43 75 72 20  >hasIncrblobCur 
42b0: 3d 20 31 3b 0a 20 20 20 20 20 20 69 66 28 20 69  = 1;.      if( i
42c0: 73 43 6c 65 61 72 54 61 62 6c 65 20 7c 7c 20 70  sClearTable || p
42d0: 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 69 52 6f  ->info.nKey==iRo
42e0: 77 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e  w ){.        p->
42f0: 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
4300: 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 7d  INVALID;.      }
4310: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 65  .    }.  }.}..#e
4320: 6c 73 65 0a 20 20 2f 2a 20 53 74 75 62 20 66 75  lse.  /* Stub fu
4330: 6e 63 74 69 6f 6e 20 77 68 65 6e 20 49 4e 43 52  nction when INCR
4340: 42 4c 4f 42 20 69 73 20 6f 6d 69 74 74 65 64 20  BLOB is omitted 
4350: 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20 69 6e 76  */.  #define inv
4360: 61 6c 69 64 61 74 65 49 6e 63 72 62 6c 6f 62 43  alidateIncrblobC
4370: 75 72 73 6f 72 73 28 78 2c 79 2c 7a 29 0a 23 65  ursors(x,y,z).#e
4380: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
4390: 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 20 2a 2f 0a  MIT_INCRBLOB */.
43a0: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 62 69 74 20 70  ./*.** Set bit p
43b0: 67 6e 6f 20 6f 66 20 74 68 65 20 42 74 53 68 61  gno of the BtSha
43c0: 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20  red.pHasContent 
43d0: 62 69 74 76 65 63 2e 20 54 68 69 73 20 69 73 20  bitvec. This is 
43e0: 63 61 6c 6c 65 64 20 0a 2a 2a 20 77 68 65 6e 20  called .** when 
43f0: 61 20 70 61 67 65 20 74 68 61 74 20 70 72 65 76  a page that prev
4400: 69 6f 75 73 6c 79 20 63 6f 6e 74 61 69 6e 65 64  iously contained
4410: 20 64 61 74 61 20 62 65 63 6f 6d 65 73 20 61 20   data becomes a 
4420: 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 0a  free-list leaf .
4430: 2a 2a 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54  ** page..**.** T
4440: 68 65 20 42 74 53 68 61 72 65 64 2e 70 48 61 73  he BtShared.pHas
4450: 43 6f 6e 74 65 6e 74 20 62 69 74 76 65 63 20 65  Content bitvec e
4460: 78 69 73 74 73 20 74 6f 20 77 6f 72 6b 20 61 72  xists to work ar
4470: 6f 75 6e 64 20 61 6e 20 6f 62 73 63 75 72 65 0a  ound an obscure.
4480: 2a 2a 20 62 75 67 20 63 61 75 73 65 64 20 62 79  ** bug caused by
4490: 20 74 68 65 20 69 6e 74 65 72 61 63 74 69 6f 6e   the interaction
44a0: 20 6f 66 20 74 77 6f 20 75 73 65 66 75 6c 20 49   of two useful I
44b0: 4f 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20  O optimizations 
44c0: 73 75 72 72 6f 75 6e 64 69 6e 67 0a 2a 2a 20 66  surrounding.** f
44d0: 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61  ree-list leaf pa
44e0: 67 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20  ges:.**.**   1) 
44f0: 57 68 65 6e 20 61 6c 6c 20 64 61 74 61 20 69 73  When all data is
4500: 20 64 65 6c 65 74 65 64 20 66 72 6f 6d 20 61 20   deleted from a 
4510: 70 61 67 65 20 61 6e 64 20 74 68 65 20 70 61 67  page and the pag
4520: 65 20 62 65 63 6f 6d 65 73 0a 2a 2a 20 20 20 20  e becomes.**    
4530: 20 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65    a free-list le
4540: 61 66 20 70 61 67 65 2c 20 74 68 65 20 70 61 67  af page, the pag
4550: 65 20 69 73 20 6e 6f 74 20 77 72 69 74 74 65 6e  e is not written
4560: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
4570: 0a 2a 2a 20 20 20 20 20 20 28 61 73 20 66 72 65  .**      (as fre
4580: 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65  e-list leaf page
4590: 73 20 63 6f 6e 74 61 69 6e 20 6e 6f 20 6d 65 61  s contain no mea
45a0: 6e 69 6e 67 66 75 6c 20 64 61 74 61 29 2e 20 53  ningful data). S
45b0: 6f 6d 65 74 69 6d 65 73 0a 2a 2a 20 20 20 20 20  ometimes.**     
45c0: 20 73 75 63 68 20 61 20 70 61 67 65 20 69 73 20   such a page is 
45d0: 6e 6f 74 20 65 76 65 6e 20 6a 6f 75 72 6e 61 6c  not even journal
45e0: 6c 65 64 20 28 61 73 20 69 74 20 77 69 6c 6c 20  led (as it will 
45f0: 6e 6f 74 20 62 65 20 6d 6f 64 69 66 69 65 64 2c  not be modified,
4600: 0a 2a 2a 20 20 20 20 20 20 77 68 79 20 62 6f 74  .**      why bot
4610: 68 65 72 20 6a 6f 75 72 6e 61 6c 6c 69 6e 67 20  her journalling 
4620: 69 74 3f 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 29  it?)..**.**   2)
4630: 20 57 68 65 6e 20 61 20 66 72 65 65 2d 6c 69 73   When a free-lis
4640: 74 20 6c 65 61 66 20 70 61 67 65 20 69 73 20 72  t leaf page is r
4650: 65 75 73 65 64 2c 20 69 74 73 20 63 6f 6e 74 65  eused, its conte
4660: 6e 74 20 69 73 20 6e 6f 74 20 72 65 61 64 0a 2a  nt is not read.*
4670: 2a 20 20 20 20 20 20 66 72 6f 6d 20 74 68 65 20  *      from the 
4680: 64 61 74 61 62 61 73 65 20 6f 72 20 77 72 69 74  database or writ
4690: 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  ten to the journ
46a0: 61 6c 20 66 69 6c 65 20 28 77 68 79 20 73 68 6f  al file (why sho
46b0: 75 6c 64 20 69 74 0a 2a 2a 20 20 20 20 20 20 62  uld it.**      b
46c0: 65 2c 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20  e, if it is not 
46d0: 61 74 20 61 6c 6c 20 6d 65 61 6e 69 6e 67 66 75  at all meaningfu
46e0: 6c 3f 29 2e 0a 2a 2a 0a 2a 2a 20 42 79 20 74 68  l?)..**.** By th
46f0: 65 6d 73 65 6c 76 65 73 2c 20 74 68 65 73 65 20  emselves, these 
4700: 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 77 6f  optimizations wo
4710: 72 6b 20 66 69 6e 65 20 61 6e 64 20 70 72 6f 76  rk fine and prov
4720: 69 64 65 20 61 20 68 61 6e 64 79 0a 2a 2a 20 70  ide a handy.** p
4730: 65 72 66 6f 72 6d 61 6e 63 65 20 62 6f 6f 73 74  erformance boost
4740: 20 74 6f 20 62 75 6c 6b 20 64 65 6c 65 74 65 20   to bulk delete 
4750: 6f 72 20 69 6e 73 65 72 74 20 6f 70 65 72 61 74  or insert operat
4760: 69 6f 6e 73 2e 20 48 6f 77 65 76 65 72 2c 20 69  ions. However, i
4770: 66 0a 2a 2a 20 61 20 70 61 67 65 20 69 73 20 6d  f.** a page is m
4780: 6f 76 65 64 20 74 6f 20 74 68 65 20 66 72 65 65  oved to the free
4790: 2d 6c 69 73 74 20 61 6e 64 20 74 68 65 6e 20 72  -list and then r
47a0: 65 75 73 65 64 20 77 69 74 68 69 6e 20 74 68 65  eused within the
47b0: 20 73 61 6d 65 0a 2a 2a 20 74 72 61 6e 73 61 63   same.** transac
47c0: 74 69 6f 6e 2c 20 61 20 70 72 6f 62 6c 65 6d 20  tion, a problem 
47d0: 63 6f 6d 65 73 20 75 70 2e 20 49 66 20 74 68 65  comes up. If the
47e0: 20 70 61 67 65 20 69 73 20 6e 6f 74 20 6a 6f 75   page is not jou
47f0: 72 6e 61 6c 6c 65 64 20 77 68 65 6e 0a 2a 2a 20  rnalled when.** 
4800: 69 74 20 69 73 20 6d 6f 76 65 64 20 74 6f 20 74  it is moved to t
4810: 68 65 20 66 72 65 65 2d 6c 69 73 74 20 61 6e 64  he free-list and
4820: 20 69 74 20 69 73 20 61 6c 73 6f 20 6e 6f 74 20   it is also not 
4830: 6a 6f 75 72 6e 61 6c 6c 65 64 20 77 68 65 6e 20  journalled when 
4840: 69 74 0a 2a 2a 20 69 73 20 65 78 74 72 61 63 74  it.** is extract
4850: 65 64 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65  ed from the free
4860: 2d 6c 69 73 74 20 61 6e 64 20 72 65 75 73 65 64  -list and reused
4870: 2c 20 74 68 65 6e 20 74 68 65 20 6f 72 69 67 69  , then the origi
4880: 6e 61 6c 20 64 61 74 61 0a 2a 2a 20 6d 61 79 20  nal data.** may 
4890: 62 65 20 6c 6f 73 74 2e 20 49 6e 20 74 68 65 20  be lost. In the 
48a0: 65 76 65 6e 74 20 6f 66 20 61 20 72 6f 6c 6c 62  event of a rollb
48b0: 61 63 6b 2c 20 69 74 20 6d 61 79 20 6e 6f 74 20  ack, it may not 
48c0: 62 65 20 70 6f 73 73 69 62 6c 65 0a 2a 2a 20 74  be possible.** t
48d0: 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61  o restore the da
48e0: 74 61 62 61 73 65 20 74 6f 20 69 74 73 20 6f 72  tabase to its or
48f0: 69 67 69 6e 61 6c 20 63 6f 6e 66 69 67 75 72 61  iginal configura
4900: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tion..**.** The 
4910: 73 6f 6c 75 74 69 6f 6e 20 69 73 20 74 68 65 20  solution is the 
4920: 42 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e  BtShared.pHasCon
4930: 74 65 6e 74 20 62 69 74 76 65 63 2e 20 57 68 65  tent bitvec. Whe
4940: 6e 65 76 65 72 20 61 20 70 61 67 65 20 69 73 20  never a page is 
4950: 0a 2a 2a 20 6d 6f 76 65 64 20 74 6f 20 62 65 63  .** moved to bec
4960: 6f 6d 65 20 61 20 66 72 65 65 2d 6c 69 73 74 20  ome a free-list 
4970: 6c 65 61 66 20 70 61 67 65 2c 20 74 68 65 20 63  leaf page, the c
4980: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74  orresponding bit
4990: 20 69 73 0a 2a 2a 20 73 65 74 20 69 6e 20 74 68   is.** set in th
49a0: 65 20 62 69 74 76 65 63 2e 20 57 68 65 6e 65 76  e bitvec. Whenev
49b0: 65 72 20 61 20 6c 65 61 66 20 70 61 67 65 20 69  er a leaf page i
49c0: 73 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d  s extracted from
49d0: 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 0a   the free-list,.
49e0: 2a 2a 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  ** optimization 
49f0: 32 20 61 62 6f 76 65 20 69 73 20 6f 6d 69 74 74  2 above is omitt
4a00: 65 64 20 69 66 20 74 68 65 20 63 6f 72 72 65 73  ed if the corres
4a10: 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 20 61  ponding bit is a
4a20: 6c 72 65 61 64 79 0a 2a 2a 20 73 65 74 20 69 6e  lready.** set in
4a30: 20 42 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f   BtShared.pHasCo
4a40: 6e 74 65 6e 74 2e 20 54 68 65 20 63 6f 6e 74 65  ntent. The conte
4a50: 6e 74 73 20 6f 66 20 74 68 65 20 62 69 74 76 65  nts of the bitve
4a60: 63 20 61 72 65 20 63 6c 65 61 72 65 64 0a 2a 2a  c are cleared.**
4a70: 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 65   at the end of e
4a80: 76 65 72 79 20 74 72 61 6e 73 61 63 74 69 6f 6e  very transaction
4a90: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
4aa0: 62 74 72 65 65 53 65 74 48 61 73 43 6f 6e 74 65  btreeSetHasConte
4ab0: 6e 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  nt(BtShared *pBt
4ac0: 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20  , Pgno pgno){.  
4ad0: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
4ae0: 4f 4b 3b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e  OK;.  if( !pBt->
4af0: 70 48 61 73 43 6f 6e 74 65 6e 74 20 29 7b 0a 20  pHasContent ){. 
4b00: 20 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 3c     assert( pgno<
4b10: 3d 70 42 74 2d 3e 6e 50 61 67 65 20 29 3b 0a 20  =pBt->nPage );. 
4b20: 20 20 20 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74     pBt->pHasCont
4b30: 65 6e 74 20 3d 20 73 71 6c 69 74 65 33 42 69 74  ent = sqlite3Bit
4b40: 76 65 63 43 72 65 61 74 65 28 70 42 74 2d 3e 6e  vecCreate(pBt->n
4b50: 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 21  Page);.    if( !
4b60: 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74  pBt->pHasContent
4b70: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
4b80: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
4b90: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d   }.  }.  if( rc=
4ba0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 67  =SQLITE_OK && pg
4bb0: 6e 6f 3c 3d 73 71 6c 69 74 65 33 42 69 74 76 65  no<=sqlite3Bitve
4bc0: 63 53 69 7a 65 28 70 42 74 2d 3e 70 48 61 73 43  cSize(pBt->pHasC
4bd0: 6f 6e 74 65 6e 74 29 20 29 7b 0a 20 20 20 20 72  ontent) ){.    r
4be0: 63 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65  c = sqlite3Bitve
4bf0: 63 53 65 74 28 70 42 74 2d 3e 70 48 61 73 43 6f  cSet(pBt->pHasCo
4c00: 6e 74 65 6e 74 2c 20 70 67 6e 6f 29 3b 0a 20 20  ntent, pgno);.  
4c10: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
4c20: 0a 0a 2f 2a 0a 2a 2a 20 51 75 65 72 79 20 74 68  ../*.** Query th
4c30: 65 20 42 74 53 68 61 72 65 64 2e 70 48 61 73 43  e BtShared.pHasC
4c40: 6f 6e 74 65 6e 74 20 76 65 63 74 6f 72 2e 0a 2a  ontent vector..*
4c50: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
4c60: 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65  on is called whe
4c70: 6e 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65  n a free-list le
4c80: 61 66 20 70 61 67 65 20 69 73 20 72 65 6d 6f 76  af page is remov
4c90: 65 64 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 66  ed from the.** f
4ca0: 72 65 65 2d 6c 69 73 74 20 66 6f 72 20 72 65 75  ree-list for reu
4cb0: 73 65 2e 20 49 74 20 72 65 74 75 72 6e 73 20 66  se. It returns f
4cc0: 61 6c 73 65 20 69 66 20 69 74 20 69 73 20 73 61  alse if it is sa
4cd0: 66 65 20 74 6f 20 72 65 74 72 69 65 76 65 20 74  fe to retrieve t
4ce0: 68 65 0a 2a 2a 20 70 61 67 65 20 66 72 6f 6d 20  he.** page from 
4cf0: 74 68 65 20 70 61 67 65 72 20 6c 61 79 65 72 20  the pager layer 
4d00: 77 69 74 68 20 74 68 65 20 27 6e 6f 2d 63 6f 6e  with the 'no-con
4d10: 74 65 6e 74 27 20 66 6c 61 67 20 73 65 74 2e 20  tent' flag set. 
4d20: 54 72 75 65 20 6f 74 68 65 72 77 69 73 65 2e 0a  True otherwise..
4d30: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74  */.static int bt
4d40: 72 65 65 47 65 74 48 61 73 43 6f 6e 74 65 6e 74  reeGetHasContent
4d50: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
4d60: 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 42 69  Pgno pgno){.  Bi
4d70: 74 76 65 63 20 2a 70 20 3d 20 70 42 74 2d 3e 70  tvec *p = pBt->p
4d80: 48 61 73 43 6f 6e 74 65 6e 74 3b 0a 20 20 72 65  HasContent;.  re
4d90: 74 75 72 6e 20 28 70 20 26 26 20 28 70 67 6e 6f  turn (p && (pgno
4da0: 3e 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 69  >sqlite3BitvecSi
4db0: 7a 65 28 70 29 20 7c 7c 20 73 71 6c 69 74 65 33  ze(p) || sqlite3
4dc0: 42 69 74 76 65 63 54 65 73 74 28 70 2c 20 70 67  BitvecTest(p, pg
4dd0: 6e 6f 29 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  no)));.}../*.** 
4de0: 43 6c 65 61 72 20 28 64 65 73 74 72 6f 79 29 20  Clear (destroy) 
4df0: 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 48 61  the BtShared.pHa
4e00: 73 43 6f 6e 74 65 6e 74 20 62 69 74 76 65 63 2e  sContent bitvec.
4e10: 20 54 68 69 73 20 73 68 6f 75 6c 64 20 62 65 0a   This should be.
4e20: 2a 2a 20 69 6e 76 6f 6b 65 64 20 61 74 20 74 68  ** invoked at th
4e30: 65 20 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66 20  e conclusion of 
4e40: 65 61 63 68 20 77 72 69 74 65 2d 74 72 61 6e 73  each write-trans
4e50: 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  action..*/.stati
4e60: 63 20 76 6f 69 64 20 62 74 72 65 65 43 6c 65 61  c void btreeClea
4e70: 72 48 61 73 43 6f 6e 74 65 6e 74 28 42 74 53 68  rHasContent(BtSh
4e80: 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 73 71  ared *pBt){.  sq
4e90: 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72  lite3BitvecDestr
4ea0: 6f 79 28 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74  oy(pBt->pHasCont
4eb0: 65 6e 74 29 3b 0a 20 20 70 42 74 2d 3e 70 48 61  ent);.  pBt->pHa
4ec0: 73 43 6f 6e 74 65 6e 74 20 3d 20 30 3b 0a 7d 0a  sContent = 0;.}.
4ed0: 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61  ./*.** Release a
4ee0: 6c 6c 20 6f 66 20 74 68 65 20 61 70 50 61 67 65  ll of the apPage
4ef0: 5b 5d 20 70 61 67 65 73 20 66 6f 72 20 61 20 63  [] pages for a c
4f00: 75 72 73 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  ursor..*/.static
4f10: 20 76 6f 69 64 20 62 74 72 65 65 52 65 6c 65 61   void btreeRelea
4f20: 73 65 41 6c 6c 43 75 72 73 6f 72 50 61 67 65 73  seAllCursorPages
4f30: 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
4f40: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  {.  int i;.  for
4f50: 28 69 3d 30 3b 20 69 3c 3d 70 43 75 72 2d 3e 69  (i=0; i<=pCur->i
4f60: 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Page; i++){.    
4f70: 72 65 6c 65 61 73 65 50 61 67 65 28 70 43 75 72  releasePage(pCur
4f80: 2d 3e 61 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20  ->apPage[i]);.  
4f90: 20 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69    pCur->apPage[i
4fa0: 5d 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 43 75  ] = 0;.  }.  pCu
4fb0: 72 2d 3e 69 50 61 67 65 20 3d 20 2d 31 3b 0a 7d  r->iPage = -1;.}
4fc0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 63 75 72 73  ../*.** The curs
4fd0: 6f 72 20 70 61 73 73 65 64 20 61 73 20 74 68 65  or passed as the
4fe0: 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74 20 6d   only argument m
4ff0: 75 73 74 20 70 6f 69 6e 74 20 74 6f 20 61 20 76  ust point to a v
5000: 61 6c 69 64 20 65 6e 74 72 79 0a 2a 2a 20 77 68  alid entry.** wh
5010: 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
5020: 20 69 73 20 63 61 6c 6c 65 64 20 28 69 2e 65 2e   is called (i.e.
5030: 20 68 61 76 65 20 65 53 74 61 74 65 3d 3d 43 55   have eState==CU
5040: 52 53 4f 52 5f 56 41 4c 49 44 29 2e 20 54 68 69  RSOR_VALID). Thi
5050: 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 73 61  s.** function sa
5060: 76 65 73 20 74 68 65 20 63 75 72 72 65 6e 74 20  ves the current 
5070: 63 75 72 73 6f 72 20 6b 65 79 20 69 6e 20 76 61  cursor key in va
5080: 72 69 61 62 6c 65 73 20 70 43 75 72 2d 3e 6e 4b  riables pCur->nK
5090: 65 79 20 61 6e 64 0a 2a 2a 20 70 43 75 72 2d 3e  ey and.** pCur->
50a0: 70 4b 65 79 2e 20 53 51 4c 49 54 45 5f 4f 4b 20  pKey. SQLITE_OK 
50b0: 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 73  is returned if s
50c0: 75 63 63 65 73 73 66 75 6c 20 6f 72 20 61 6e 20  uccessful or an 
50d0: 53 51 4c 69 74 65 20 65 72 72 6f 72 20 0a 2a 2a  SQLite error .**
50e0: 20 63 6f 64 65 20 6f 74 68 65 72 77 69 73 65 2e   code otherwise.
50f0: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 75  .**.** If the cu
5100: 72 73 6f 72 20 69 73 20 6f 70 65 6e 20 6f 6e 20  rsor is open on 
5110: 61 6e 20 69 6e 74 6b 65 79 20 74 61 62 6c 65 2c  an intkey table,
5120: 20 74 68 65 6e 20 74 68 65 20 69 6e 74 65 67 65   then the intege
5130: 72 20 6b 65 79 0a 2a 2a 20 28 74 68 65 20 72 6f  r key.** (the ro
5140: 77 69 64 29 20 69 73 20 73 74 6f 72 65 64 20 69  wid) is stored i
5150: 6e 20 70 43 75 72 2d 3e 6e 4b 65 79 20 61 6e 64  n pCur->nKey and
5160: 20 70 43 75 72 2d 3e 70 4b 65 79 20 69 73 20 6c   pCur->pKey is l
5170: 65 66 74 20 73 65 74 20 74 6f 0a 2a 2a 20 4e 55  eft set to.** NU
5180: 4c 4c 2e 20 49 66 20 74 68 65 20 63 75 72 73 6f  LL. If the curso
5190: 72 20 69 73 20 6f 70 65 6e 20 6f 6e 20 61 20 6e  r is open on a n
51a0: 6f 6e 2d 69 6e 74 6b 65 79 20 74 61 62 6c 65 2c  on-intkey table,
51b0: 20 74 68 65 6e 20 70 43 75 72 2d 3e 70 4b 65 79   then pCur->pKey
51c0: 20 69 73 20 0a 2a 2a 20 73 65 74 20 74 6f 20 70   is .** set to p
51d0: 6f 69 6e 74 20 74 6f 20 61 20 6d 61 6c 6c 6f 63  oint to a malloc
51e0: 65 64 20 62 75 66 66 65 72 20 70 43 75 72 2d 3e  ed buffer pCur->
51f0: 6e 4b 65 79 20 62 79 74 65 73 20 69 6e 20 73 69  nKey bytes in si
5200: 7a 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 0a 2a  ze containing .*
5210: 2a 20 74 68 65 20 6b 65 79 2e 0a 2a 2f 0a 73 74  * the key..*/.st
5220: 61 74 69 63 20 69 6e 74 20 73 61 76 65 43 75 72  atic int saveCur
5230: 73 6f 72 4b 65 79 28 42 74 43 75 72 73 6f 72 20  sorKey(BtCursor 
5240: 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74 20 72 63  *pCur){.  int rc
5250: 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55 52 53  ;.  assert( CURS
5260: 4f 52 5f 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e  OR_VALID==pCur->
5270: 65 53 74 61 74 65 20 29 3b 0a 20 20 61 73 73 65  eState );.  asse
5280: 72 74 28 20 30 3d 3d 70 43 75 72 2d 3e 70 4b 65  rt( 0==pCur->pKe
5290: 79 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63  y );.  assert( c
52a0: 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
52b0: 70 43 75 72 29 20 29 3b 0a 0a 20 20 72 63 20 3d  pCur) );..  rc =
52c0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79   sqlite3BtreeKey
52d0: 53 69 7a 65 28 70 43 75 72 2c 20 26 70 43 75 72  Size(pCur, &pCur
52e0: 2d 3e 6e 4b 65 79 29 3b 0a 20 20 61 73 73 65 72  ->nKey);.  asser
52f0: 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc==SQLITE_OK
5300: 20 29 3b 20 20 2f 2a 20 4b 65 79 53 69 7a 65 28   );  /* KeySize(
5310: 29 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20 2a 2f  ) cannot fail */
5320: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69  ..  /* If this i
5330: 73 20 61 6e 20 69 6e 74 4b 65 79 20 74 61 62 6c  s an intKey tabl
5340: 65 2c 20 74 68 65 6e 20 74 68 65 20 61 62 6f 76  e, then the abov
5350: 65 20 63 61 6c 6c 20 74 6f 20 42 74 72 65 65 4b  e call to BtreeK
5360: 65 79 53 69 7a 65 28 29 0a 20 20 2a 2a 20 73 74  eySize().  ** st
5370: 6f 72 65 73 20 74 68 65 20 69 6e 74 65 67 65 72  ores the integer
5380: 20 6b 65 79 20 69 6e 20 70 43 75 72 2d 3e 6e 4b   key in pCur->nK
5390: 65 79 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ey. In this case
53a0: 20 74 68 69 73 20 76 61 6c 75 65 20 69 73 0a 20   this value is. 
53b0: 20 2a 2a 20 61 6c 6c 20 74 68 61 74 20 69 73 20   ** all that is 
53c0: 72 65 71 75 69 72 65 64 2e 20 4f 74 68 65 72 77  required. Otherw
53d0: 69 73 65 2c 20 69 66 20 70 43 75 72 20 69 73 20  ise, if pCur is 
53e0: 6e 6f 74 20 6f 70 65 6e 20 6f 6e 20 61 6e 20 69  not open on an i
53f0: 6e 74 4b 65 79 0a 20 20 2a 2a 20 74 61 62 6c 65  ntKey.  ** table
5400: 2c 20 74 68 65 6e 20 6d 61 6c 6c 6f 63 20 73 70  , then malloc sp
5410: 61 63 65 20 66 6f 72 20 61 6e 64 20 73 74 6f 72  ace for and stor
5420: 65 20 74 68 65 20 70 43 75 72 2d 3e 6e 4b 65 79  e the pCur->nKey
5430: 20 62 79 74 65 73 20 6f 66 20 6b 65 79 20 0a 20   bytes of key . 
5440: 20 2a 2a 20 64 61 74 61 2e 20 20 2a 2f 0a 20 20   ** data.  */.  
5450: 69 66 28 20 30 3d 3d 70 43 75 72 2d 3e 63 75 72  if( 0==pCur->cur
5460: 49 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 76 6f  IntKey ){.    vo
5470: 69 64 20 2a 70 4b 65 79 20 3d 20 73 71 6c 69 74  id *pKey = sqlit
5480: 65 33 4d 61 6c 6c 6f 63 28 20 70 43 75 72 2d 3e  e3Malloc( pCur->
5490: 6e 4b 65 79 20 29 3b 0a 20 20 20 20 69 66 28 20  nKey );.    if( 
54a0: 70 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 72 63  pKey ){.      rc
54b0: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b   = sqlite3BtreeK
54c0: 65 79 28 70 43 75 72 2c 20 30 2c 20 28 69 6e 74  ey(pCur, 0, (int
54d0: 29 70 43 75 72 2d 3e 6e 4b 65 79 2c 20 70 4b 65  )pCur->nKey, pKe
54e0: 79 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  y);.      if( rc
54f0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
5500: 20 20 20 20 20 20 20 70 43 75 72 2d 3e 70 4b 65         pCur->pKe
5510: 79 20 3d 20 70 4b 65 79 3b 0a 20 20 20 20 20 20  y = pKey;.      
5520: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
5530: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4b 65 79  qlite3_free(pKey
5540: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
5550: 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
5560: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
5570: 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72     }.  }.  asser
5580: 74 28 20 21 70 43 75 72 2d 3e 63 75 72 49 6e 74  t( !pCur->curInt
5590: 4b 65 79 20 7c 7c 20 21 70 43 75 72 2d 3e 70 4b  Key || !pCur->pK
55a0: 65 79 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  ey );.  return r
55b0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 61 76 65  c;.}../*.** Save
55c0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 75 72   the current cur
55d0: 73 6f 72 20 70 6f 73 69 74 69 6f 6e 20 69 6e 20  sor position in 
55e0: 74 68 65 20 76 61 72 69 61 62 6c 65 73 20 42 74  the variables Bt
55f0: 43 75 72 73 6f 72 2e 6e 4b 65 79 20 0a 2a 2a 20  Cursor.nKey .** 
5600: 61 6e 64 20 42 74 43 75 72 73 6f 72 2e 70 4b 65  and BtCursor.pKe
5610: 79 2e 20 54 68 65 20 63 75 72 73 6f 72 27 73 20  y. The cursor's 
5620: 73 74 61 74 65 20 69 73 20 73 65 74 20 74 6f 20  state is set to 
5630: 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45  CURSOR_REQUIRESE
5640: 45 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61  EK..**.** The ca
5650: 6c 6c 65 72 20 6d 75 73 74 20 65 6e 73 75 72 65  ller must ensure
5660: 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72   that the cursor
5670: 20 69 73 20 76 61 6c 69 64 20 28 68 61 73 20 65   is valid (has e
5680: 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
5690: 4c 49 44 29 0a 2a 2a 20 70 72 69 6f 72 20 74 6f  LID).** prior to
56a0: 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f   calling this ro
56b0: 75 74 69 6e 65 2e 20 20 0a 2a 2f 0a 73 74 61 74  utine.  .*/.stat
56c0: 69 63 20 69 6e 74 20 73 61 76 65 43 75 72 73 6f  ic int saveCurso
56d0: 72 50 6f 73 69 74 69 6f 6e 28 42 74 43 75 72 73  rPosition(BtCurs
56e0: 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74  or *pCur){.  int
56f0: 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   rc;..  assert( 
5700: 43 55 52 53 4f 52 5f 56 41 4c 49 44 3d 3d 70 43  CURSOR_VALID==pC
5710: 75 72 2d 3e 65 53 74 61 74 65 20 7c 7c 20 43 55  ur->eState || CU
5720: 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54 3d 3d 70  RSOR_SKIPNEXT==p
5730: 43 75 72 2d 3e 65 53 74 61 74 65 20 29 3b 0a 20  Cur->eState );. 
5740: 20 61 73 73 65 72 74 28 20 30 3d 3d 70 43 75 72   assert( 0==pCur
5750: 2d 3e 70 4b 65 79 20 29 3b 0a 20 20 61 73 73 65  ->pKey );.  asse
5760: 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
5770: 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 0a 20  utex(pCur) );.. 
5780: 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74   if( pCur->eStat
5790: 65 3d 3d 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45  e==CURSOR_SKIPNE
57a0: 58 54 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e  XT ){.    pCur->
57b0: 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
57c0: 56 41 4c 49 44 3b 0a 20 20 7d 65 6c 73 65 7b 0a  VALID;.  }else{.
57d0: 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65      pCur->skipNe
57e0: 78 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 72  xt = 0;.  }..  r
57f0: 63 20 3d 20 73 61 76 65 43 75 72 73 6f 72 4b 65  c = saveCursorKe
5800: 79 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72  y(pCur);.  if( r
5810: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
5820: 20 20 20 20 62 74 72 65 65 52 65 6c 65 61 73 65      btreeRelease
5830: 41 6c 6c 43 75 72 73 6f 72 50 61 67 65 73 28 70  AllCursorPages(p
5840: 43 75 72 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e  Cur);.    pCur->
5850: 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
5860: 52 45 51 55 49 52 45 53 45 45 4b 3b 0a 20 20 7d  REQUIRESEEK;.  }
5870: 0a 0a 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61  ..  pCur->curFla
5880: 67 73 20 26 3d 20 7e 28 42 54 43 46 5f 56 61 6c  gs &= ~(BTCF_Val
5890: 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69  idNKey|BTCF_Vali
58a0: 64 4f 76 66 6c 7c 42 54 43 46 5f 41 74 4c 61 73  dOvfl|BTCF_AtLas
58b0: 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  t);.  return rc;
58c0: 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72  .}../* Forward r
58d0: 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73 74 61 74  eference */.stat
58e0: 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 4e 4f  ic int SQLITE_NO
58f0: 49 4e 4c 49 4e 45 20 73 61 76 65 43 75 72 73 6f  INLINE saveCurso
5900: 72 73 4f 6e 4c 69 73 74 28 42 74 43 75 72 73 6f  rsOnList(BtCurso
5910: 72 2a 2c 50 67 6e 6f 2c 42 74 43 75 72 73 6f 72  r*,Pgno,BtCursor
5920: 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 53 61 76 65 20  *);../*.** Save 
5930: 74 68 65 20 70 6f 73 69 74 69 6f 6e 73 20 6f 66  the positions of
5940: 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 28 65 78   all cursors (ex
5950: 63 65 70 74 20 70 45 78 63 65 70 74 29 20 74 68  cept pExcept) th
5960: 61 74 20 61 72 65 20 6f 70 65 6e 20 6f 6e 0a 2a  at are open on.*
5970: 2a 20 74 68 65 20 74 61 62 6c 65 20 77 69 74 68  * the table with
5980: 20 72 6f 6f 74 2d 70 61 67 65 20 69 52 6f 6f 74   root-page iRoot
5990: 2e 20 20 22 53 61 76 69 6e 67 20 74 68 65 20 63  .  "Saving the c
59a0: 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 22 20  ursor position" 
59b0: 6d 65 61 6e 73 20 74 68 61 74 0a 2a 2a 20 74 68  means that.** th
59c0: 65 20 6c 6f 63 61 74 69 6f 6e 20 69 6e 20 74 68  e location in th
59d0: 65 20 62 74 72 65 65 20 69 73 20 72 65 6d 65 6d  e btree is remem
59e0: 62 65 72 65 64 20 69 6e 20 73 75 63 68 20 61 20  bered in such a 
59f0: 77 61 79 20 74 68 61 74 20 69 74 20 63 61 6e 20  way that it can 
5a00: 62 65 0a 2a 2a 20 6d 6f 76 65 64 20 62 61 63 6b  be.** moved back
5a10: 20 74 6f 20 74 68 65 20 73 61 6d 65 20 73 70 6f   to the same spo
5a20: 74 20 61 66 74 65 72 20 74 68 65 20 62 74 72 65  t after the btre
5a30: 65 20 68 61 73 20 62 65 65 6e 20 6d 6f 64 69 66  e has been modif
5a40: 69 65 64 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f  ied.  This.** ro
5a50: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
5a60: 6a 75 73 74 20 62 65 66 6f 72 65 20 63 75 72 73  just before curs
5a70: 6f 72 20 70 45 78 63 65 70 74 20 69 73 20 75 73  or pExcept is us
5a80: 65 64 20 74 6f 20 6d 6f 64 69 66 79 20 74 68 65  ed to modify the
5a90: 0a 2a 2a 20 74 61 62 6c 65 2c 20 66 6f 72 20 65  .** table, for e
5aa0: 78 61 6d 70 6c 65 20 69 6e 20 42 74 72 65 65 44  xample in BtreeD
5ab0: 65 6c 65 74 65 28 29 20 6f 72 20 42 74 72 65 65  elete() or Btree
5ac0: 49 6e 73 65 72 74 28 29 2e 0a 2a 2a 0a 2a 2a 20  Insert()..**.** 
5ad0: 49 66 20 74 68 65 72 65 20 61 72 65 20 74 77 6f  If there are two
5ae0: 20 6f 72 20 6d 6f 72 65 20 63 75 72 73 6f 72 73   or more cursors
5af0: 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 62 74 72   on the same btr
5b00: 65 65 2c 20 74 68 65 6e 20 61 6c 6c 20 73 75 63  ee, then all suc
5b10: 68 20 0a 2a 2a 20 63 75 72 73 6f 72 73 20 73 68  h .** cursors sh
5b20: 6f 75 6c 64 20 68 61 76 65 20 74 68 65 69 72 20  ould have their 
5b30: 42 54 43 46 5f 4d 75 6c 74 69 70 6c 65 20 66 6c  BTCF_Multiple fl
5b40: 61 67 20 73 65 74 2e 20 20 54 68 65 20 62 74 72  ag set.  The btr
5b50: 65 65 43 75 72 73 6f 72 28 29 0a 2a 2a 20 72 6f  eeCursor().** ro
5b60: 75 74 69 6e 65 20 65 6e 66 6f 72 63 65 73 20 74  utine enforces t
5b70: 68 61 74 20 72 75 6c 65 2e 20 20 54 68 69 73 20  hat rule.  This 
5b80: 72 6f 75 74 69 6e 65 20 6f 6e 6c 79 20 6e 65 65  routine only nee
5b90: 64 73 20 74 6f 20 62 65 20 63 61 6c 6c 65 64 20  ds to be called 
5ba0: 69 6e 0a 2a 2a 20 74 68 65 20 75 6e 63 6f 6d 6d  in.** the uncomm
5bb0: 6f 6e 20 63 61 73 65 20 77 68 65 6e 20 70 45 78  on case when pEx
5bc0: 70 65 63 74 20 68 61 73 20 74 68 65 20 42 54 43  pect has the BTC
5bd0: 46 5f 4d 75 6c 74 69 70 6c 65 20 66 6c 61 67 20  F_Multiple flag 
5be0: 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45  set..**.** If pE
5bf0: 78 70 65 63 74 21 3d 4e 55 4c 4c 20 61 6e 64 20  xpect!=NULL and 
5c00: 69 66 20 6e 6f 20 6f 74 68 65 72 20 63 75 72 73  if no other curs
5c10: 6f 72 73 20 61 72 65 20 66 6f 75 6e 64 20 6f 6e  ors are found on
5c20: 20 74 68 65 20 73 61 6d 65 20 72 6f 6f 74 2d 70   the same root-p
5c30: 61 67 65 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 65  age,.** then the
5c40: 20 42 54 43 46 5f 4d 75 6c 74 69 70 6c 65 20 66   BTCF_Multiple f
5c50: 6c 61 67 20 6f 6e 20 70 45 78 70 65 63 74 20 69  lag on pExpect i
5c60: 73 20 63 6c 65 61 72 65 64 2c 20 74 6f 20 61 76  s cleared, to av
5c70: 6f 69 64 20 61 6e 6f 74 68 65 72 0a 2a 2a 20 70  oid another.** p
5c80: 6f 69 6e 74 6c 65 73 73 20 63 61 6c 6c 20 74 6f  ointless call to
5c90: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a   this routine..*
5ca0: 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74  *.** Implementat
5cb0: 69 6f 6e 20 6e 6f 74 65 3a 20 20 54 68 69 73 20  ion note:  This 
5cc0: 72 6f 75 74 69 6e 65 20 6d 65 72 65 6c 79 20 63  routine merely c
5cd0: 68 65 63 6b 73 20 74 6f 20 73 65 65 20 69 66 20  hecks to see if 
5ce0: 61 6e 79 20 63 75 72 73 6f 72 73 0a 2a 2a 20 6e  any cursors.** n
5cf0: 65 65 64 20 74 6f 20 62 65 20 73 61 76 65 64 2e  eed to be saved.
5d00: 20 20 49 74 20 63 61 6c 6c 73 20 6f 75 74 20 74    It calls out t
5d10: 6f 20 73 61 76 65 43 75 72 73 6f 72 73 4f 6e 4c  o saveCursorsOnL
5d20: 69 73 74 28 29 20 69 6e 20 74 68 65 20 28 75 6e  ist() in the (un
5d30: 75 73 75 61 6c 29 0a 2a 2a 20 65 76 65 6e 74 20  usual).** event 
5d40: 74 68 61 74 20 63 75 72 73 6f 72 73 20 61 72 65  that cursors are
5d50: 20 69 6e 20 6e 65 65 64 20 74 6f 20 62 65 69 6e   in need to bein
5d60: 67 20 73 61 76 65 64 2e 0a 2a 2f 0a 73 74 61 74  g saved..*/.stat
5d70: 69 63 20 69 6e 74 20 73 61 76 65 41 6c 6c 43 75  ic int saveAllCu
5d80: 72 73 6f 72 73 28 42 74 53 68 61 72 65 64 20 2a  rsors(BtShared *
5d90: 70 42 74 2c 20 50 67 6e 6f 20 69 52 6f 6f 74 2c  pBt, Pgno iRoot,
5da0: 20 42 74 43 75 72 73 6f 72 20 2a 70 45 78 63 65   BtCursor *pExce
5db0: 70 74 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20  pt){.  BtCursor 
5dc0: 2a 70 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  *p;.  assert( sq
5dd0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
5de0: 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
5df0: 20 20 61 73 73 65 72 74 28 20 70 45 78 63 65 70    assert( pExcep
5e00: 74 3d 3d 30 20 7c 7c 20 70 45 78 63 65 70 74 2d  t==0 || pExcept-
5e10: 3e 70 42 74 3d 3d 70 42 74 20 29 3b 0a 20 20 66  >pBt==pBt );.  f
5e20: 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75 72 73 6f  or(p=pBt->pCurso
5e30: 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74  r; p; p=p->pNext
5e40: 29 7b 0a 20 20 20 20 69 66 28 20 70 21 3d 70 45  ){.    if( p!=pE
5e50: 78 63 65 70 74 20 26 26 20 28 30 3d 3d 69 52 6f  xcept && (0==iRo
5e60: 6f 74 20 7c 7c 20 70 2d 3e 70 67 6e 6f 52 6f 6f  ot || p->pgnoRoo
5e70: 74 3d 3d 69 52 6f 6f 74 29 20 29 20 62 72 65 61  t==iRoot) ) brea
5e80: 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 20 29  k;.  }.  if( p )
5e90: 20 72 65 74 75 72 6e 20 73 61 76 65 43 75 72 73   return saveCurs
5ea0: 6f 72 73 4f 6e 4c 69 73 74 28 70 2c 20 69 52 6f  orsOnList(p, iRo
5eb0: 6f 74 2c 20 70 45 78 63 65 70 74 29 3b 0a 20 20  ot, pExcept);.  
5ec0: 69 66 28 20 70 45 78 63 65 70 74 20 29 20 70 45  if( pExcept ) pE
5ed0: 78 63 65 70 74 2d 3e 63 75 72 46 6c 61 67 73 20  xcept->curFlags 
5ee0: 26 3d 20 7e 42 54 43 46 5f 4d 75 6c 74 69 70 6c  &= ~BTCF_Multipl
5ef0: 65 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  e;.  return SQLI
5f00: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 54 68 69  TE_OK;.}../* Thi
5f10: 73 20 68 65 6c 70 65 72 20 72 6f 75 74 69 6e 65  s helper routine
5f20: 20 74 6f 20 73 61 76 65 41 6c 6c 43 75 72 73 6f   to saveAllCurso
5f30: 72 73 20 64 6f 65 73 20 74 68 65 20 61 63 74 75  rs does the actu
5f40: 61 6c 20 77 6f 72 6b 20 6f 66 20 73 61 76 69 6e  al work of savin
5f50: 67 0a 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 73  g.** the cursors
5f60: 20 69 66 20 61 6e 64 20 77 68 65 6e 20 61 20 63   if and when a c
5f70: 75 72 73 6f 72 20 69 73 20 66 6f 75 6e 64 20 74  ursor is found t
5f80: 68 61 74 20 61 63 74 75 61 6c 6c 79 20 72 65 71  hat actually req
5f90: 75 69 72 65 73 20 73 61 76 69 6e 67 2e 0a 2a 2a  uires saving..**
5fa0: 20 54 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65   The common case
5fb0: 20 69 73 20 74 68 61 74 20 6e 6f 20 63 75 72 73   is that no curs
5fc0: 6f 72 73 20 6e 65 65 64 20 74 6f 20 62 65 20 73  ors need to be s
5fd0: 61 76 65 64 2c 20 73 6f 20 74 68 69 73 20 72 6f  aved, so this ro
5fe0: 75 74 69 6e 65 20 69 73 0a 2a 2a 20 62 72 6f 6b  utine is.** brok
5ff0: 65 6e 20 6f 75 74 20 66 72 6f 6d 20 69 74 73 20  en out from its 
6000: 63 61 6c 6c 65 72 20 74 6f 20 61 76 6f 69 64 20  caller to avoid 
6010: 75 6e 6e 65 63 65 73 73 61 72 79 20 73 74 61 63  unnecessary stac
6020: 6b 20 70 6f 69 6e 74 65 72 20 6d 6f 76 65 6d 65  k pointer moveme
6030: 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nt..*/.static in
6040: 74 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e  t SQLITE_NOINLIN
6050: 45 20 73 61 76 65 43 75 72 73 6f 72 73 4f 6e 4c  E saveCursorsOnL
6060: 69 73 74 28 0a 20 20 42 74 43 75 72 73 6f 72 20  ist(.  BtCursor 
6070: 2a 70 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54  *p,         /* T
6080: 68 65 20 66 69 72 73 74 20 63 75 72 73 6f 72 20  he first cursor 
6090: 74 68 61 74 20 6e 65 65 64 73 20 73 61 76 69 6e  that needs savin
60a0: 67 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 52 6f 6f  g */.  Pgno iRoo
60b0: 74 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f  t,          /* O
60c0: 6e 6c 79 20 73 61 76 65 20 63 75 72 73 6f 72 20  nly save cursor 
60d0: 77 69 74 68 20 74 68 69 73 20 69 52 6f 6f 74 2e  with this iRoot.
60e0: 20 53 61 76 65 20 61 6c 6c 20 69 66 20 7a 65 72   Save all if zer
60f0: 6f 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72 20  o */.  BtCursor 
6100: 2a 70 45 78 63 65 70 74 20 20 20 20 2f 2a 20 44  *pExcept    /* D
6110: 6f 20 6e 6f 74 20 73 61 76 65 20 74 68 69 73 20  o not save this 
6120: 63 75 72 73 6f 72 20 2a 2f 0a 29 7b 0a 20 20 64  cursor */.){.  d
6130: 6f 7b 0a 20 20 20 20 69 66 28 20 70 21 3d 70 45  o{.    if( p!=pE
6140: 78 63 65 70 74 20 26 26 20 28 30 3d 3d 69 52 6f  xcept && (0==iRo
6150: 6f 74 20 7c 7c 20 70 2d 3e 70 67 6e 6f 52 6f 6f  ot || p->pgnoRoo
6160: 74 3d 3d 69 52 6f 6f 74 29 20 29 7b 0a 20 20 20  t==iRoot) ){.   
6170: 20 20 20 69 66 28 20 70 2d 3e 65 53 74 61 74 65     if( p->eState
6180: 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c  ==CURSOR_VALID |
6190: 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  | p->eState==CUR
61a0: 53 4f 52 5f 53 4b 49 50 4e 45 58 54 20 29 7b 0a  SOR_SKIPNEXT ){.
61b0: 20 20 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d          int rc =
61c0: 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74   saveCursorPosit
61d0: 69 6f 6e 28 70 29 3b 0a 20 20 20 20 20 20 20 20  ion(p);.        
61e0: 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72  if( SQLITE_OK!=r
61f0: 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  c ){.          r
6200: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
6210: 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
6220: 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
6230: 65 28 20 70 2d 3e 69 50 61 67 65 3e 30 20 29 3b  e( p->iPage>0 );
6240: 0a 20 20 20 20 20 20 20 20 62 74 72 65 65 52 65  .        btreeRe
6250: 6c 65 61 73 65 41 6c 6c 43 75 72 73 6f 72 50 61  leaseAllCursorPa
6260: 67 65 73 28 70 29 3b 0a 20 20 20 20 20 20 7d 0a  ges(p);.      }.
6270: 20 20 20 20 7d 0a 20 20 20 20 70 20 3d 20 70 2d      }.    p = p-
6280: 3e 70 4e 65 78 74 3b 0a 20 20 7d 77 68 69 6c 65  >pNext;.  }while
6290: 28 20 70 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  ( p );.  return 
62a0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
62b0: 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65 20 63 75  .** Clear the cu
62c0: 72 72 65 6e 74 20 63 75 72 73 6f 72 20 70 6f 73  rrent cursor pos
62d0: 69 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ition..*/.void s
62e0: 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61 72  qlite3BtreeClear
62f0: 43 75 72 73 6f 72 28 42 74 43 75 72 73 6f 72 20  Cursor(BtCursor 
6300: 2a 70 43 75 72 29 7b 0a 20 20 61 73 73 65 72 74  *pCur){.  assert
6310: 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
6320: 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 73 71  ex(pCur) );.  sq
6330: 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75 72 2d  lite3_free(pCur-
6340: 3e 70 4b 65 79 29 3b 0a 20 20 70 43 75 72 2d 3e  >pKey);.  pCur->
6350: 70 4b 65 79 20 3d 20 30 3b 0a 20 20 70 43 75 72  pKey = 0;.  pCur
6360: 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
6370: 52 5f 49 4e 56 41 4c 49 44 3b 0a 7d 0a 0a 2f 2a  R_INVALID;.}../*
6380: 0a 2a 2a 20 49 6e 20 74 68 69 73 20 76 65 72 73  .** In this vers
6390: 69 6f 6e 20 6f 66 20 42 74 72 65 65 4d 6f 76 65  ion of BtreeMove
63a0: 74 6f 2c 20 70 4b 65 79 20 69 73 20 61 20 70 61  to, pKey is a pa
63b0: 63 6b 65 64 20 69 6e 64 65 78 20 72 65 63 6f 72  cked index recor
63c0: 64 0a 2a 2a 20 73 75 63 68 20 61 73 20 69 73 20  d.** such as is 
63d0: 67 65 6e 65 72 61 74 65 64 20 62 79 20 74 68 65  generated by the
63e0: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f   OP_MakeRecord o
63f0: 70 63 6f 64 65 2e 20 20 55 6e 70 61 63 6b 20 74  pcode.  Unpack t
6400: 68 65 0a 2a 2a 20 72 65 63 6f 72 64 20 61 6e 64  he.** record and
6410: 20 74 68 65 6e 20 63 61 6c 6c 20 42 74 72 65 65   then call Btree
6420: 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 29  MovetoUnpacked()
6430: 20 74 6f 20 64 6f 20 74 68 65 20 77 6f 72 6b 2e   to do the work.
6440: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
6450: 74 72 65 65 4d 6f 76 65 74 6f 28 0a 20 20 42 74  treeMoveto(.  Bt
6460: 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20  Cursor *pCur,   
6470: 20 20 2f 2a 20 43 75 72 73 6f 72 20 6f 70 65 6e    /* Cursor open
6480: 20 6f 6e 20 74 68 65 20 62 74 72 65 65 20 74 6f   on the btree to
6490: 20 62 65 20 73 65 61 72 63 68 65 64 20 2a 2f 0a   be searched */.
64a0: 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b    const void *pK
64b0: 65 79 2c 20 20 20 2f 2a 20 50 61 63 6b 65 64 20  ey,   /* Packed 
64c0: 6b 65 79 20 69 66 20 74 68 65 20 62 74 72 65 65  key if the btree
64d0: 20 69 73 20 61 6e 20 69 6e 64 65 78 20 2a 2f 0a   is an index */.
64e0: 20 20 69 36 34 20 6e 4b 65 79 2c 20 20 20 20 20    i64 nKey,     
64f0: 20 20 20 20 20 20 2f 2a 20 49 6e 74 65 67 65 72        /* Integer
6500: 20 6b 65 79 20 66 6f 72 20 74 61 62 6c 65 73 2e   key for tables.
6510: 20 20 53 69 7a 65 20 6f 66 20 70 4b 65 79 20 66    Size of pKey f
6520: 6f 72 20 69 6e 64 69 63 65 73 20 2a 2f 0a 20 20  or indices */.  
6530: 69 6e 74 20 62 69 61 73 2c 20 20 20 20 20 20 20  int bias,       
6540: 20 20 20 20 2f 2a 20 42 69 61 73 20 73 65 61 72      /* Bias sear
6550: 63 68 20 74 6f 20 74 68 65 20 68 69 67 68 20 65  ch to the high e
6560: 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65  nd */.  int *pRe
6570: 73 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57  s           /* W
6580: 72 69 74 65 20 73 65 61 72 63 68 20 72 65 73 75  rite search resu
6590: 6c 74 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  lts here */.){. 
65a0: 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
65b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
65c0: 74 61 74 75 73 20 63 6f 64 65 20 2a 2f 0a 20 20  tatus code */.  
65d0: 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a  UnpackedRecord *
65e0: 70 49 64 78 4b 65 79 3b 20 20 20 2f 2a 20 55 6e  pIdxKey;   /* Un
65f0: 70 61 63 6b 65 64 20 69 6e 64 65 78 20 6b 65 79  packed index key
6600: 20 2a 2f 0a 20 20 63 68 61 72 20 61 53 70 61 63   */.  char aSpac
6610: 65 5b 32 30 30 5d 3b 20 20 20 20 20 20 20 20 20  e[200];         
6620: 20 2f 2a 20 54 65 6d 70 20 73 70 61 63 65 20 66   /* Temp space f
6630: 6f 72 20 70 49 64 78 4b 65 79 20 2d 20 74 6f 20  or pIdxKey - to 
6640: 61 76 6f 69 64 20 61 20 6d 61 6c 6c 6f 63 20 2a  avoid a malloc *
6650: 2f 0a 20 20 63 68 61 72 20 2a 70 46 72 65 65 20  /.  char *pFree 
6660: 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70 4b 65 79  = 0;..  if( pKey
6670: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
6680: 6e 4b 65 79 3d 3d 28 69 36 34 29 28 69 6e 74 29  nKey==(i64)(int)
6690: 6e 4b 65 79 20 29 3b 0a 20 20 20 20 70 49 64 78  nKey );.    pIdx
66a0: 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Key = sqlite3Vdb
66b0: 65 41 6c 6c 6f 63 55 6e 70 61 63 6b 65 64 52 65  eAllocUnpackedRe
66c0: 63 6f 72 64 28 0a 20 20 20 20 20 20 20 20 70 43  cord(.        pC
66d0: 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 2c 20 61 53  ur->pKeyInfo, aS
66e0: 70 61 63 65 2c 20 73 69 7a 65 6f 66 28 61 53 70  pace, sizeof(aSp
66f0: 61 63 65 29 2c 20 26 70 46 72 65 65 0a 20 20 20  ace), &pFree.   
6700: 20 29 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78   );.    if( pIdx
6710: 4b 65 79 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  Key==0 ) return 
6720: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
6730: 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63    sqlite3VdbeRec
6740: 6f 72 64 55 6e 70 61 63 6b 28 70 43 75 72 2d 3e  ordUnpack(pCur->
6750: 70 4b 65 79 49 6e 66 6f 2c 20 28 69 6e 74 29 6e  pKeyInfo, (int)n
6760: 4b 65 79 2c 20 70 4b 65 79 2c 20 70 49 64 78 4b  Key, pKey, pIdxK
6770: 65 79 29 3b 0a 20 20 20 20 69 66 28 20 70 49 64  ey);.    if( pId
6780: 78 4b 65 79 2d 3e 6e 46 69 65 6c 64 3d 3d 30 20  xKey->nField==0 
6790: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
67a0: 44 62 46 72 65 65 28 70 43 75 72 2d 3e 70 4b 65  DbFree(pCur->pKe
67b0: 79 49 6e 66 6f 2d 3e 64 62 2c 20 70 46 72 65 65  yInfo->db, pFree
67c0: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
67d0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
67e0: 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  KPT;.    }.  }el
67f0: 73 65 7b 0a 20 20 20 20 70 49 64 78 4b 65 79 20  se{.    pIdxKey 
6800: 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  = 0;.  }.  rc = 
6810: 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65  sqlite3BtreeMove
6820: 74 6f 55 6e 70 61 63 6b 65 64 28 70 43 75 72 2c  toUnpacked(pCur,
6830: 20 70 49 64 78 4b 65 79 2c 20 6e 4b 65 79 2c 20   pIdxKey, nKey, 
6840: 62 69 61 73 2c 20 70 52 65 73 29 3b 0a 20 20 69  bias, pRes);.  i
6850: 66 28 20 70 46 72 65 65 20 29 7b 0a 20 20 20 20  f( pFree ){.    
6860: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 43  sqlite3DbFree(pC
6870: 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 64 62  ur->pKeyInfo->db
6880: 2c 20 70 46 72 65 65 29 3b 0a 20 20 7d 0a 20 20  , pFree);.  }.  
6890: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
68a0: 0a 2a 2a 20 52 65 73 74 6f 72 65 20 74 68 65 20  .** Restore the 
68b0: 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 70 6f  cursor to the po
68c0: 73 69 74 69 6f 6e 20 69 74 20 77 61 73 20 69 6e  sition it was in
68d0: 20 28 6f 72 20 61 73 20 63 6c 6f 73 65 20 74 6f   (or as close to
68e0: 20 61 73 20 70 6f 73 73 69 62 6c 65 29 0a 2a 2a   as possible).**
68f0: 20 77 68 65 6e 20 73 61 76 65 43 75 72 73 6f 72   when saveCursor
6900: 50 6f 73 69 74 69 6f 6e 28 29 20 77 61 73 20 63  Position() was c
6910: 61 6c 6c 65 64 2e 20 4e 6f 74 65 20 74 68 61 74  alled. Note that
6920: 20 74 68 69 73 20 63 61 6c 6c 20 64 65 6c 65 74   this call delet
6930: 65 73 20 74 68 65 20 0a 2a 2a 20 73 61 76 65 64  es the .** saved
6940: 20 70 6f 73 69 74 69 6f 6e 20 69 6e 66 6f 20 73   position info s
6950: 74 6f 72 65 64 20 62 79 20 73 61 76 65 43 75 72  tored by saveCur
6960: 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 2c 20 73  sorPosition(), s
6970: 6f 20 74 68 65 72 65 20 63 61 6e 20 62 65 0a 2a  o there can be.*
6980: 2a 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20 65 66  * at most one ef
6990: 66 65 63 74 69 76 65 20 72 65 73 74 6f 72 65 43  fective restoreC
69a0: 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 20  ursorPosition() 
69b0: 63 61 6c 6c 20 61 66 74 65 72 20 65 61 63 68 20  call after each 
69c0: 0a 2a 2a 20 73 61 76 65 43 75 72 73 6f 72 50 6f  .** saveCursorPo
69d0: 73 69 74 69 6f 6e 28 29 2e 0a 2a 2f 0a 73 74 61  sition()..*/.sta
69e0: 74 69 63 20 69 6e 74 20 62 74 72 65 65 52 65 73  tic int btreeRes
69f0: 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69  toreCursorPositi
6a00: 6f 6e 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  on(BtCursor *pCu
6a10: 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  r){.  int rc;.  
6a20: 69 6e 74 20 73 6b 69 70 4e 65 78 74 3b 0a 20 20  int skipNext;.  
6a30: 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
6a40: 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
6a50: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
6a60: 2d 3e 65 53 74 61 74 65 3e 3d 43 55 52 53 4f 52  ->eState>=CURSOR
6a70: 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a  _REQUIRESEEK );.
6a80: 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
6a90: 74 65 3d 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54  te==CURSOR_FAULT
6aa0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70   ){.    return p
6ab0: 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3b 0a 20  Cur->skipNext;. 
6ac0: 20 7d 0a 20 20 70 43 75 72 2d 3e 65 53 74 61 74   }.  pCur->eStat
6ad0: 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  e = CURSOR_INVAL
6ae0: 49 44 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65  ID;.  rc = btree
6af0: 4d 6f 76 65 74 6f 28 70 43 75 72 2c 20 70 43 75  Moveto(pCur, pCu
6b00: 72 2d 3e 70 4b 65 79 2c 20 70 43 75 72 2d 3e 6e  r->pKey, pCur->n
6b10: 4b 65 79 2c 20 30 2c 20 26 73 6b 69 70 4e 65 78  Key, 0, &skipNex
6b20: 74 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  t);.  if( rc==SQ
6b30: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73  LITE_OK ){.    s
6b40: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75 72  qlite3_free(pCur
6b50: 2d 3e 70 4b 65 79 29 3b 0a 20 20 20 20 70 43 75  ->pKey);.    pCu
6b60: 72 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a 20 20 20  r->pKey = 0;.   
6b70: 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
6b80: 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
6b90: 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74  LID || pCur->eSt
6ba0: 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41  ate==CURSOR_INVA
6bb0: 4c 49 44 20 29 3b 0a 20 20 20 20 70 43 75 72 2d  LID );.    pCur-
6bc0: 3e 73 6b 69 70 4e 65 78 74 20 7c 3d 20 73 6b 69  >skipNext |= ski
6bd0: 70 4e 65 78 74 3b 0a 20 20 20 20 69 66 28 20 70  pNext;.    if( p
6be0: 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 26 26  Cur->skipNext &&
6bf0: 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
6c00: 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20  URSOR_VALID ){. 
6c10: 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74       pCur->eStat
6c20: 65 20 3d 20 43 55 52 53 4f 52 5f 53 4b 49 50 4e  e = CURSOR_SKIPN
6c30: 45 58 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  EXT;.    }.  }. 
6c40: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
6c50: 64 65 66 69 6e 65 20 72 65 73 74 6f 72 65 43 75  define restoreCu
6c60: 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29 20  rsorPosition(p) 
6c70: 5c 0a 20 20 28 70 2d 3e 65 53 74 61 74 65 3e 3d  \.  (p->eState>=
6c80: 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45  CURSOR_REQUIRESE
6c90: 45 4b 20 3f 20 5c 0a 20 20 20 20 20 20 20 20 20  EK ? \.         
6ca0: 62 74 72 65 65 52 65 73 74 6f 72 65 43 75 72 73  btreeRestoreCurs
6cb0: 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29 20 3a 20  orPosition(p) : 
6cc0: 5c 0a 20 20 20 20 20 20 20 20 20 53 51 4c 49 54  \.         SQLIT
6cd0: 45 5f 4f 4b 29 0a 0a 2f 2a 0a 2a 2a 20 44 65 74  E_OK)../*.** Det
6ce0: 65 72 6d 69 6e 65 20 77 68 65 74 68 65 72 20 6f  ermine whether o
6cf0: 72 20 6e 6f 74 20 61 20 63 75 72 73 6f 72 20 68  r not a cursor h
6d00: 61 73 20 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68  as moved from th
6d10: 65 20 70 6f 73 69 74 69 6f 6e 20 77 68 65 72 65  e position where
6d20: 0a 2a 2a 20 69 74 20 77 61 73 20 6c 61 73 74 20  .** it was last 
6d30: 70 6c 61 63 65 64 2c 20 6f 72 20 68 61 73 20 62  placed, or has b
6d40: 65 65 6e 20 69 6e 76 61 6c 69 64 61 74 65 64 20  een invalidated 
6d50: 66 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 72 65  for any other re
6d60: 61 73 6f 6e 2e 0a 2a 2a 20 43 75 72 73 6f 72 73  ason..** Cursors
6d70: 20 63 61 6e 20 6d 6f 76 65 20 77 68 65 6e 20 74   can move when t
6d80: 68 65 20 72 6f 77 20 74 68 65 79 20 61 72 65 20  he row they are 
6d90: 70 6f 69 6e 74 69 6e 67 20 61 74 20 69 73 20 64  pointing at is d
6da0: 65 6c 65 74 65 64 20 6f 75 74 0a 2a 2a 20 66 72  eleted out.** fr
6db0: 6f 6d 20 75 6e 64 65 72 20 74 68 65 6d 2c 20 66  om under them, f
6dc0: 6f 72 20 65 78 61 6d 70 6c 65 2e 20 20 43 75 72  or example.  Cur
6dd0: 73 6f 72 20 6d 69 67 68 74 20 61 6c 73 6f 20 6d  sor might also m
6de0: 6f 76 65 20 69 66 20 61 20 62 74 72 65 65 0a 2a  ove if a btree.*
6df0: 2a 20 69 73 20 72 65 62 61 6c 61 6e 63 65 64 2e  * is rebalanced.
6e00: 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 69 6e 67 20 74  .**.** Calling t
6e10: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 74 68  his routine with
6e20: 20 61 20 4e 55 4c 4c 20 63 75 72 73 6f 72 20 70   a NULL cursor p
6e30: 6f 69 6e 74 65 72 20 72 65 74 75 72 6e 73 20 66  ointer returns f
6e40: 61 6c 73 65 2e 0a 2a 2a 0a 2a 2a 20 55 73 65 20  alse..**.** Use 
6e50: 74 68 65 20 73 65 70 61 72 61 74 65 20 73 71 6c  the separate sql
6e60: 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 52  ite3BtreeCursorR
6e70: 65 73 74 6f 72 65 28 29 20 72 6f 75 74 69 6e 65  estore() routine
6e80: 20 74 6f 20 72 65 73 74 6f 72 65 20 61 20 63 75   to restore a cu
6e90: 72 73 6f 72 0a 2a 2a 20 62 61 63 6b 20 74 6f 20  rsor.** back to 
6ea0: 77 68 65 72 65 20 69 74 20 6f 75 67 68 74 20 74  where it ought t
6eb0: 6f 20 62 65 20 69 66 20 74 68 69 73 20 72 6f 75  o be if this rou
6ec0: 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74 72 75  tine returns tru
6ed0: 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
6ee0: 33 42 74 72 65 65 43 75 72 73 6f 72 48 61 73 4d  3BtreeCursorHasM
6ef0: 6f 76 65 64 28 42 74 43 75 72 73 6f 72 20 2a 70  oved(BtCursor *p
6f00: 43 75 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  Cur){.  return p
6f10: 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52  Cur->eState!=CUR
6f20: 53 4f 52 5f 56 41 4c 49 44 3b 0a 7d 0a 0a 2f 2a  SOR_VALID;.}../*
6f30: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
6f40: 20 72 65 73 74 6f 72 65 73 20 61 20 63 75 72 73   restores a curs
6f50: 6f 72 20 62 61 63 6b 20 74 6f 20 69 74 73 20 6f  or back to its o
6f60: 72 69 67 69 6e 61 6c 20 70 6f 73 69 74 69 6f 6e  riginal position
6f70: 20 61 66 74 65 72 20 69 74 0a 2a 2a 20 68 61 73   after it.** has
6f80: 20 62 65 65 6e 20 6d 6f 76 65 64 20 62 79 20 73   been moved by s
6f90: 6f 6d 65 20 6f 75 74 73 69 64 65 20 61 63 74 69  ome outside acti
6fa0: 76 69 74 79 20 28 73 75 63 68 20 61 73 20 61 20  vity (such as a 
6fb0: 62 74 72 65 65 20 72 65 62 61 6c 61 6e 63 65 20  btree rebalance 
6fc0: 6f 72 0a 2a 2a 20 61 20 72 6f 77 20 68 61 76 69  or.** a row havi
6fd0: 6e 67 20 62 65 65 6e 20 64 65 6c 65 74 65 64 20  ng been deleted 
6fe0: 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 74  out from under t
6ff0: 68 65 20 63 75 72 73 6f 72 29 2e 20 20 0a 2a 2a  he cursor).  .**
7000: 0a 2a 2a 20 4f 6e 20 73 75 63 63 65 73 73 2c 20  .** On success, 
7010: 74 68 65 20 2a 70 44 69 66 66 65 72 65 6e 74 52  the *pDifferentR
7020: 6f 77 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  ow parameter is 
7030: 66 61 6c 73 65 20 69 66 20 74 68 65 20 63 75 72  false if the cur
7040: 73 6f 72 20 69 73 20 6c 65 66 74 0a 2a 2a 20 70  sor is left.** p
7050: 6f 69 6e 74 69 6e 67 20 61 74 20 65 78 61 63 74  ointing at exact
7060: 6c 79 20 74 68 65 20 73 61 6d 65 20 72 6f 77 2e  ly the same row.
7070: 20 20 2a 70 44 69 66 66 65 72 6e 74 52 6f 77 20    *pDifferntRow 
7080: 69 73 20 74 68 65 20 72 6f 77 20 74 68 65 20 63  is the row the c
7090: 75 72 73 6f 72 0a 2a 2a 20 77 61 73 20 70 6f 69  ursor.** was poi
70a0: 6e 74 69 6e 67 20 74 6f 20 68 61 73 20 62 65 65  nting to has bee
70b0: 6e 20 64 65 6c 65 74 65 64 2c 20 66 6f 72 63 69  n deleted, forci
70c0: 6e 67 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f  ng the cursor to
70d0: 20 70 6f 69 6e 74 20 74 6f 20 73 6f 6d 65 0a 2a   point to some.*
70e0: 2a 20 6e 65 61 72 62 79 20 72 6f 77 2e 0a 2a 2a  * nearby row..**
70f0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
7100: 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20   should only be 
7110: 63 61 6c 6c 65 64 20 66 6f 72 20 61 20 63 75 72  called for a cur
7120: 73 6f 72 20 74 68 61 74 20 6a 75 73 74 20 72 65  sor that just re
7130: 74 75 72 6e 65 64 0a 2a 2a 20 54 52 55 45 20 66  turned.** TRUE f
7140: 72 6f 6d 20 73 71 6c 69 74 65 33 42 74 72 65 65  rom sqlite3Btree
7150: 43 75 72 73 6f 72 48 61 73 4d 6f 76 65 64 28 29  CursorHasMoved()
7160: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
7170: 42 74 72 65 65 43 75 72 73 6f 72 52 65 73 74 6f  BtreeCursorResto
7180: 72 65 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  re(BtCursor *pCu
7190: 72 2c 20 69 6e 74 20 2a 70 44 69 66 66 65 72 65  r, int *pDiffere
71a0: 6e 74 52 6f 77 29 7b 0a 20 20 69 6e 74 20 72 63  ntRow){.  int rc
71b0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  ;..  assert( pCu
71c0: 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  r!=0 );.  assert
71d0: 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d  ( pCur->eState!=
71e0: 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
71f0: 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75    rc = restoreCu
7200: 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75  rsorPosition(pCu
7210: 72 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a  r);.  if( rc ){.
7220: 20 20 20 20 2a 70 44 69 66 66 65 72 65 6e 74 52      *pDifferentR
7230: 6f 77 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75  ow = 1;.    retu
7240: 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28  rn rc;.  }.  if(
7250: 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43   pCur->eState!=C
7260: 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20  URSOR_VALID ){. 
7270: 20 20 20 2a 70 44 69 66 66 65 72 65 6e 74 52 6f     *pDifferentRo
7280: 77 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a  w = 1;.  }else{.
7290: 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
72a0: 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d 30 20 29 3b  ->skipNext==0 );
72b0: 0a 20 20 20 20 2a 70 44 69 66 66 65 72 65 6e 74  .    *pDifferent
72c0: 52 6f 77 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  Row = 0;.  }.  r
72d0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
72e0: 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
72f0: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
7300: 55 4d 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61  UM./*.** Given a
7310: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
7320: 61 20 72 65 67 75 6c 61 72 20 64 61 74 61 62 61  a regular databa
7330: 73 65 20 70 61 67 65 2c 20 72 65 74 75 72 6e 20  se page, return 
7340: 74 68 65 20 70 61 67 65 0a 2a 2a 20 6e 75 6d 62  the page.** numb
7350: 65 72 20 66 6f 72 20 74 68 65 20 70 6f 69 6e 74  er for the point
7360: 65 72 2d 6d 61 70 20 70 61 67 65 20 74 68 61 74  er-map page that
7370: 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 65 6e   contains the en
7380: 74 72 79 20 66 6f 72 20 74 68 65 0a 2a 2a 20 69  try for the.** i
7390: 6e 70 75 74 20 70 61 67 65 20 6e 75 6d 62 65 72  nput page number
73a0: 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 30  ..**.** Return 0
73b0: 20 28 6e 6f 74 20 61 20 76 61 6c 69 64 20 70 61   (not a valid pa
73c0: 67 65 29 20 66 6f 72 20 70 67 6e 6f 3d 3d 31 20  ge) for pgno==1 
73d0: 73 69 6e 63 65 20 74 68 65 72 65 20 69 73 0a 2a  since there is.*
73e0: 2a 20 6e 6f 20 70 6f 69 6e 74 65 72 20 6d 61 70  * no pointer map
73f0: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
7400: 20 70 61 67 65 20 31 2e 20 20 54 68 65 20 69 6e   page 1.  The in
7410: 74 65 67 72 69 74 79 5f 63 68 65 63 6b 20 6c 6f  tegrity_check lo
7420: 67 69 63 0a 2a 2a 20 72 65 71 75 69 72 65 73 20  gic.** requires 
7430: 74 68 61 74 20 70 74 72 6d 61 70 50 61 67 65 6e  that ptrmapPagen
7440: 6f 28 2a 2c 31 29 21 3d 31 2e 0a 2a 2f 0a 73 74  o(*,1)!=1..*/.st
7450: 61 74 69 63 20 50 67 6e 6f 20 70 74 72 6d 61 70  atic Pgno ptrmap
7460: 50 61 67 65 6e 6f 28 42 74 53 68 61 72 65 64 20  Pageno(BtShared 
7470: 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29  *pBt, Pgno pgno)
7480: 7b 0a 20 20 69 6e 74 20 6e 50 61 67 65 73 50 65  {.  int nPagesPe
7490: 72 4d 61 70 50 61 67 65 3b 0a 20 20 50 67 6e 6f  rMapPage;.  Pgno
74a0: 20 69 50 74 72 4d 61 70 2c 20 72 65 74 3b 0a 20   iPtrMap, ret;. 
74b0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
74c0: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
74d0: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28  >mutex) );.  if(
74e0: 20 70 67 6e 6f 3c 32 20 29 20 72 65 74 75 72 6e   pgno<2 ) return
74f0: 20 30 3b 0a 20 20 6e 50 61 67 65 73 50 65 72 4d   0;.  nPagesPerM
7500: 61 70 50 61 67 65 20 3d 20 28 70 42 74 2d 3e 75  apPage = (pBt->u
7510: 73 61 62 6c 65 53 69 7a 65 2f 35 29 2b 31 3b 0a  sableSize/5)+1;.
7520: 20 20 69 50 74 72 4d 61 70 20 3d 20 28 70 67 6e    iPtrMap = (pgn
7530: 6f 2d 32 29 2f 6e 50 61 67 65 73 50 65 72 4d 61  o-2)/nPagesPerMa
7540: 70 50 61 67 65 3b 0a 20 20 72 65 74 20 3d 20 28  pPage;.  ret = (
7550: 69 50 74 72 4d 61 70 2a 6e 50 61 67 65 73 50 65  iPtrMap*nPagesPe
7560: 72 4d 61 70 50 61 67 65 29 20 2b 20 32 3b 20 0a  rMapPage) + 2; .
7570: 20 20 69 66 28 20 72 65 74 3d 3d 50 45 4e 44 49    if( ret==PENDI
7580: 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
7590: 29 20 29 7b 0a 20 20 20 20 72 65 74 2b 2b 3b 0a  ) ){.    ret++;.
75a0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 65 74    }.  return ret
75b0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  ;.}../*.** Write
75c0: 20 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20 74   an entry into t
75d0: 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e 0a  he pointer map..
75e0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
75f0: 6e 65 20 75 70 64 61 74 65 73 20 74 68 65 20 70  ne updates the p
7600: 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 79  ointer map entry
7610: 20 66 6f 72 20 70 61 67 65 20 6e 75 6d 62 65 72   for page number
7620: 20 27 6b 65 79 27 0a 2a 2a 20 73 6f 20 74 68 61   'key'.** so tha
7630: 74 20 69 74 20 6d 61 70 73 20 74 6f 20 74 79 70  t it maps to typ
7640: 65 20 27 65 54 79 70 65 27 20 61 6e 64 20 70 61  e 'eType' and pa
7650: 72 65 6e 74 20 70 61 67 65 20 6e 75 6d 62 65 72  rent page number
7660: 20 27 70 67 6e 6f 27 2e 0a 2a 2a 0a 2a 2a 20 49   'pgno'..**.** I
7670: 66 20 2a 70 52 43 20 69 73 20 69 6e 69 74 69 61  f *pRC is initia
7680: 6c 6c 79 20 6e 6f 6e 2d 7a 65 72 6f 20 28 6e 6f  lly non-zero (no
7690: 6e 2d 53 51 4c 49 54 45 5f 4f 4b 29 20 74 68 65  n-SQLITE_OK) the
76a0: 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
76b0: 73 0a 2a 2a 20 61 20 6e 6f 2d 6f 70 2e 20 20 49  s.** a no-op.  I
76c0: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
76d0: 73 2c 20 74 68 65 20 61 70 70 72 6f 70 72 69 61  s, the appropria
76e0: 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  te error code is
76f0: 20 77 72 69 74 74 65 6e 0a 2a 2a 20 69 6e 74 6f   written.** into
7700: 20 2a 70 52 43 2e 0a 2a 2f 0a 73 74 61 74 69 63   *pRC..*/.static
7710: 20 76 6f 69 64 20 70 74 72 6d 61 70 50 75 74 28   void ptrmapPut(
7720: 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50  BtShared *pBt, P
7730: 67 6e 6f 20 6b 65 79 2c 20 75 38 20 65 54 79 70  gno key, u8 eTyp
7740: 65 2c 20 50 67 6e 6f 20 70 61 72 65 6e 74 2c 20  e, Pgno parent, 
7750: 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20 44 62 50  int *pRC){.  DbP
7760: 61 67 65 20 2a 70 44 62 50 61 67 65 3b 20 20 2f  age *pDbPage;  /
7770: 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  * The pointer ma
7780: 70 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a  p page */.  u8 *
7790: 70 50 74 72 6d 61 70 3b 20 20 20 20 20 20 2f 2a  pPtrmap;      /*
77a0: 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   The pointer map
77b0: 20 64 61 74 61 20 2a 2f 0a 20 20 50 67 6e 6f 20   data */.  Pgno 
77c0: 69 50 74 72 6d 61 70 3b 20 20 20 20 20 2f 2a 20  iPtrmap;     /* 
77d0: 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  The pointer map 
77e0: 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20  page number */. 
77f0: 20 69 6e 74 20 6f 66 66 73 65 74 3b 20 20 20 20   int offset;    
7800: 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 20     /* Offset in 
7810: 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65  pointer map page
7820: 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
7830: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
7840: 6e 20 63 6f 64 65 20 66 72 6f 6d 20 73 75 62 66  n code from subf
7850: 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 0a 20 20 69  unctions */..  i
7860: 66 28 20 2a 70 52 43 20 29 20 72 65 74 75 72 6e  f( *pRC ) return
7870: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
7880: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
7890: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
78a0: 20 2f 2a 20 54 68 65 20 6d 61 73 74 65 72 2d 6a   /* The master-j
78b0: 6f 75 72 6e 61 6c 20 70 61 67 65 20 6e 75 6d 62  ournal page numb
78c0: 65 72 20 6d 75 73 74 20 6e 65 76 65 72 20 62 65  er must never be
78d0: 20 75 73 65 64 20 61 73 20 61 20 70 6f 69 6e 74   used as a point
78e0: 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20  er map page */. 
78f0: 20 61 73 73 65 72 74 28 20 30 3d 3d 50 54 52 4d   assert( 0==PTRM
7900: 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 50  AP_ISPAGE(pBt, P
7910: 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
7920: 28 70 42 74 29 29 20 29 3b 0a 0a 20 20 61 73 73  (pBt)) );..  ass
7930: 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56 61  ert( pBt->autoVa
7940: 63 75 75 6d 20 29 3b 0a 20 20 69 66 28 20 6b 65  cuum );.  if( ke
7950: 79 3d 3d 30 20 29 7b 0a 20 20 20 20 2a 70 52 43  y==0 ){.    *pRC
7960: 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
7970: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75  T_BKPT;.    retu
7980: 72 6e 3b 0a 20 20 7d 0a 20 20 69 50 74 72 6d 61  rn;.  }.  iPtrma
7990: 70 20 3d 20 50 54 52 4d 41 50 5f 50 41 47 45 4e  p = PTRMAP_PAGEN
79a0: 4f 28 70 42 74 2c 20 6b 65 79 29 3b 0a 20 20 72  O(pBt, key);.  r
79b0: 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
79c0: 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  Get(pBt->pPager,
79d0: 20 69 50 74 72 6d 61 70 2c 20 26 70 44 62 50 61   iPtrmap, &pDbPa
79e0: 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  ge);.  if( rc!=S
79f0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
7a00: 2a 70 52 43 20 3d 20 72 63 3b 0a 20 20 20 20 72  *pRC = rc;.    r
7a10: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 6f 66 66  eturn;.  }.  off
7a20: 73 65 74 20 3d 20 50 54 52 4d 41 50 5f 50 54 52  set = PTRMAP_PTR
7a30: 4f 46 46 53 45 54 28 69 50 74 72 6d 61 70 2c 20  OFFSET(iPtrmap, 
7a40: 6b 65 79 29 3b 0a 20 20 69 66 28 20 6f 66 66 73  key);.  if( offs
7a50: 65 74 3c 30 20 29 7b 0a 20 20 20 20 2a 70 52 43  et<0 ){.    *pRC
7a60: 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
7a70: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 67 6f 74 6f  T_BKPT;.    goto
7a80: 20 70 74 72 6d 61 70 5f 65 78 69 74 3b 0a 20 20   ptrmap_exit;.  
7a90: 7d 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73  }.  assert( offs
7aa0: 65 74 20 3c 3d 20 28 69 6e 74 29 70 42 74 2d 3e  et <= (int)pBt->
7ab0: 75 73 61 62 6c 65 53 69 7a 65 2d 35 20 29 3b 0a  usableSize-5 );.
7ac0: 20 20 70 50 74 72 6d 61 70 20 3d 20 28 75 38 20    pPtrmap = (u8 
7ad0: 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  *)sqlite3PagerGe
7ae0: 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a  tData(pDbPage);.
7af0: 0a 20 20 69 66 28 20 65 54 79 70 65 21 3d 70 50  .  if( eType!=pP
7b00: 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d 20 7c 7c  trmap[offset] ||
7b10: 20 67 65 74 34 62 79 74 65 28 26 70 50 74 72 6d   get4byte(&pPtrm
7b20: 61 70 5b 6f 66 66 73 65 74 2b 31 5d 29 21 3d 70  ap[offset+1])!=p
7b30: 61 72 65 6e 74 20 29 7b 0a 20 20 20 20 54 52 41  arent ){.    TRA
7b40: 43 45 28 28 22 50 54 52 4d 41 50 5f 55 50 44 41  CE(("PTRMAP_UPDA
7b50: 54 45 3a 20 25 64 2d 3e 28 25 64 2c 25 64 29 5c  TE: %d->(%d,%d)\
7b60: 6e 22 2c 20 6b 65 79 2c 20 65 54 79 70 65 2c 20  n", key, eType, 
7b70: 70 61 72 65 6e 74 29 29 3b 0a 20 20 20 20 2a 70  parent));.    *p
7b80: 52 43 3d 20 72 63 20 3d 20 73 71 6c 69 74 65 33  RC= rc = sqlite3
7b90: 50 61 67 65 72 57 72 69 74 65 28 70 44 62 50 61  PagerWrite(pDbPa
7ba0: 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  ge);.    if( rc=
7bb0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
7bc0: 20 20 20 20 70 50 74 72 6d 61 70 5b 6f 66 66 73      pPtrmap[offs
7bd0: 65 74 5d 20 3d 20 65 54 79 70 65 3b 0a 20 20 20  et] = eType;.   
7be0: 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50 74     put4byte(&pPt
7bf0: 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d 2c 20  rmap[offset+1], 
7c00: 70 61 72 65 6e 74 29 3b 0a 20 20 20 20 7d 0a 20  parent);.    }. 
7c10: 20 7d 0a 0a 70 74 72 6d 61 70 5f 65 78 69 74 3a   }..ptrmap_exit:
7c20: 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55  .  sqlite3PagerU
7c30: 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a 7d  nref(pDbPage);.}
7c40: 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 6e 20  ../*.** Read an 
7c50: 65 6e 74 72 79 20 66 72 6f 6d 20 74 68 65 20 70  entry from the p
7c60: 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 2a 2a 0a 2a  ointer map..**.*
7c70: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72  * This routine r
7c80: 65 74 72 69 65 76 65 73 20 74 68 65 20 70 6f 69  etrieves the poi
7c90: 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 79 20 66  nter map entry f
7ca0: 6f 72 20 70 61 67 65 20 27 6b 65 79 27 2c 20 77  or page 'key', w
7cb0: 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65 20 74 79  riting.** the ty
7cc0: 70 65 20 61 6e 64 20 70 61 72 65 6e 74 20 70 61  pe and parent pa
7cd0: 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 2a 70 45  ge number to *pE
7ce0: 54 79 70 65 20 61 6e 64 20 2a 70 50 67 6e 6f 20  Type and *pPgno 
7cf0: 72 65 73 70 65 63 74 69 76 65 6c 79 2e 0a 2a 2a  respectively..**
7d00: 20 41 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   An error code i
7d10: 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 73 6f  s returned if so
7d20: 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f  mething goes wro
7d30: 6e 67 2c 20 6f 74 68 65 72 77 69 73 65 20 53 51  ng, otherwise SQ
7d40: 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74  LITE_OK..*/.stat
7d50: 69 63 20 69 6e 74 20 70 74 72 6d 61 70 47 65 74  ic int ptrmapGet
7d60: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
7d70: 50 67 6e 6f 20 6b 65 79 2c 20 75 38 20 2a 70 45  Pgno key, u8 *pE
7d80: 54 79 70 65 2c 20 50 67 6e 6f 20 2a 70 50 67 6e  Type, Pgno *pPgn
7d90: 6f 29 7b 0a 20 20 44 62 50 61 67 65 20 2a 70 44  o){.  DbPage *pD
7da0: 62 50 61 67 65 3b 20 20 20 2f 2a 20 54 68 65 20  bPage;   /* The 
7db0: 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65  pointer map page
7dc0: 20 2a 2f 0a 20 20 69 6e 74 20 69 50 74 72 6d 61   */.  int iPtrma
7dd0: 70 3b 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e  p;       /* Poin
7de0: 74 65 72 20 6d 61 70 20 70 61 67 65 20 69 6e 64  ter map page ind
7df0: 65 78 20 2a 2f 0a 20 20 75 38 20 2a 70 50 74 72  ex */.  u8 *pPtr
7e00: 6d 61 70 3b 20 20 20 20 20 20 20 2f 2a 20 50 6f  map;       /* Po
7e10: 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 64  inter map page d
7e20: 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 66  ata */.  int off
7e30: 73 65 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 4f  set;        /* O
7e40: 66 66 73 65 74 20 6f 66 20 65 6e 74 72 79 20 69  ffset of entry i
7e50: 6e 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 2a 2f  n pointer map */
7e60: 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73  .  int rc;..  as
7e70: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
7e80: 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
7e90: 74 65 78 29 20 29 3b 0a 0a 20 20 69 50 74 72 6d  tex) );..  iPtrm
7ea0: 61 70 20 3d 20 50 54 52 4d 41 50 5f 50 41 47 45  ap = PTRMAP_PAGE
7eb0: 4e 4f 28 70 42 74 2c 20 6b 65 79 29 3b 0a 20 20  NO(pBt, key);.  
7ec0: 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
7ed0: 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72  rGet(pBt->pPager
7ee0: 2c 20 69 50 74 72 6d 61 70 2c 20 26 70 44 62 50  , iPtrmap, &pDbP
7ef0: 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  age);.  if( rc!=
7f00: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
7f10: 72 63 3b 0a 20 20 7d 0a 20 20 70 50 74 72 6d 61  rc;.  }.  pPtrma
7f20: 70 20 3d 20 28 75 38 20 2a 29 73 71 6c 69 74 65  p = (u8 *)sqlite
7f30: 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70 44  3PagerGetData(pD
7f40: 62 50 61 67 65 29 3b 0a 0a 20 20 6f 66 66 73 65  bPage);..  offse
7f50: 74 20 3d 20 50 54 52 4d 41 50 5f 50 54 52 4f 46  t = PTRMAP_PTROF
7f60: 46 53 45 54 28 69 50 74 72 6d 61 70 2c 20 6b 65  FSET(iPtrmap, ke
7f70: 79 29 3b 0a 20 20 69 66 28 20 6f 66 66 73 65 74  y);.  if( offset
7f80: 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  <0 ){.    sqlite
7f90: 33 50 61 67 65 72 55 6e 72 65 66 28 70 44 62 50  3PagerUnref(pDbP
7fa0: 61 67 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  age);.    return
7fb0: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
7fc0: 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 61 73 73 65  BKPT;.  }.  asse
7fd0: 72 74 28 20 6f 66 66 73 65 74 20 3c 3d 20 28 69  rt( offset <= (i
7fe0: 6e 74 29 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  nt)pBt->usableSi
7ff0: 7a 65 2d 35 20 29 3b 0a 20 20 61 73 73 65 72 74  ze-5 );.  assert
8000: 28 20 70 45 54 79 70 65 21 3d 30 20 29 3b 0a 20  ( pEType!=0 );. 
8010: 20 2a 70 45 54 79 70 65 20 3d 20 70 50 74 72 6d   *pEType = pPtrm
8020: 61 70 5b 6f 66 66 73 65 74 5d 3b 0a 20 20 69 66  ap[offset];.  if
8030: 28 20 70 50 67 6e 6f 20 29 20 2a 70 50 67 6e 6f  ( pPgno ) *pPgno
8040: 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 74   = get4byte(&pPt
8050: 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d 29 3b  rmap[offset+1]);
8060: 0a 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  ..  sqlite3Pager
8070: 55 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a  Unref(pDbPage);.
8080: 20 20 69 66 28 20 2a 70 45 54 79 70 65 3c 31 20    if( *pEType<1 
8090: 7c 7c 20 2a 70 45 54 79 70 65 3e 35 20 29 20 72  || *pEType>5 ) r
80a0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
80b0: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 72 65 74  RUPT_BKPT;.  ret
80c0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
80d0: 0a 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20 64 65  ..#else /* if de
80e0: 66 69 6e 65 64 20 53 51 4c 49 54 45 5f 4f 4d 49  fined SQLITE_OMI
80f0: 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 2a 2f 0a  T_AUTOVACUUM */.
8100: 20 20 23 64 65 66 69 6e 65 20 70 74 72 6d 61 70    #define ptrmap
8110: 50 75 74 28 77 2c 78 2c 79 2c 7a 2c 72 63 29 0a  Put(w,x,y,z,rc).
8120: 20 20 23 64 65 66 69 6e 65 20 70 74 72 6d 61 70    #define ptrmap
8130: 47 65 74 28 77 2c 78 2c 79 2c 7a 29 20 53 51 4c  Get(w,x,y,z) SQL
8140: 49 54 45 5f 4f 4b 0a 20 20 23 64 65 66 69 6e 65  ITE_OK.  #define
8150: 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74   ptrmapPutOvflPt
8160: 72 28 78 2c 20 79 2c 20 72 63 29 0a 23 65 6e 64  r(x, y, rc).#end
8170: 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  if../*.** Given 
8180: 61 20 62 74 72 65 65 20 70 61 67 65 20 61 6e 64  a btree page and
8190: 20 61 20 63 65 6c 6c 20 69 6e 64 65 78 20 28 30   a cell index (0
81a0: 20 6d 65 61 6e 73 20 74 68 65 20 66 69 72 73 74   means the first
81b0: 20 63 65 6c 6c 20 6f 6e 0a 2a 2a 20 74 68 65 20   cell on.** the 
81c0: 70 61 67 65 2c 20 31 20 6d 65 61 6e 73 20 74 68  page, 1 means th
81d0: 65 20 73 65 63 6f 6e 64 20 63 65 6c 6c 2c 20 61  e second cell, a
81e0: 6e 64 20 73 6f 20 66 6f 72 74 68 29 20 72 65 74  nd so forth) ret
81f0: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a  urn a pointer.**
8200: 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e   to the cell con
8210: 74 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 66 69 6e 64  tent..**.** find
8220: 43 65 6c 6c 50 61 73 74 50 74 72 28 29 20 64 6f  CellPastPtr() do
8230: 65 73 20 74 68 65 20 73 61 6d 65 20 65 78 63 65  es the same exce
8240: 70 74 20 69 74 20 73 6b 69 70 73 20 70 61 73 74  pt it skips past
8250: 20 74 68 65 20 69 6e 69 74 69 61 6c 0a 2a 2a 20   the initial.** 
8260: 34 2d 62 79 74 65 20 63 68 69 6c 64 20 70 6f 69  4-byte child poi
8270: 6e 74 65 72 20 66 6f 75 6e 64 20 6f 6e 20 69 6e  nter found on in
8280: 74 65 72 69 6f 72 20 70 61 67 65 73 2c 20 69 66  terior pages, if
8290: 20 74 68 65 72 65 20 69 73 20 6f 6e 65 2e 0a 2a   there is one..*
82a0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
82b0: 65 20 77 6f 72 6b 73 20 6f 6e 6c 79 20 66 6f 72  e works only for
82c0: 20 70 61 67 65 73 20 74 68 61 74 20 64 6f 20 6e   pages that do n
82d0: 6f 74 20 63 6f 6e 74 61 69 6e 20 6f 76 65 72 66  ot contain overf
82e0: 6c 6f 77 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 23 64  low cells..*/.#d
82f0: 65 66 69 6e 65 20 66 69 6e 64 43 65 6c 6c 28 50  efine findCell(P
8300: 2c 49 29 20 5c 0a 20 20 28 28 50 29 2d 3e 61 44  ,I) \.  ((P)->aD
8310: 61 74 61 20 2b 20 28 28 50 29 2d 3e 6d 61 73 6b  ata + ((P)->mask
8320: 50 61 67 65 20 26 20 67 65 74 32 62 79 74 65 41  Page & get2byteA
8330: 6c 69 67 6e 65 64 28 26 28 50 29 2d 3e 61 43 65  ligned(&(P)->aCe
8340: 6c 6c 49 64 78 5b 32 2a 28 49 29 5d 29 29 29 0a  llIdx[2*(I)]))).
8350: 23 64 65 66 69 6e 65 20 66 69 6e 64 43 65 6c 6c  #define findCell
8360: 50 61 73 74 50 74 72 28 50 2c 49 29 20 5c 0a 20  PastPtr(P,I) \. 
8370: 20 28 28 50 29 2d 3e 61 44 61 74 61 4f 66 73 74   ((P)->aDataOfst
8380: 20 2b 20 28 28 50 29 2d 3e 6d 61 73 6b 50 61 67   + ((P)->maskPag
8390: 65 20 26 20 67 65 74 32 62 79 74 65 41 6c 69 67  e & get2byteAlig
83a0: 6e 65 64 28 26 28 50 29 2d 3e 61 43 65 6c 6c 49  ned(&(P)->aCellI
83b0: 64 78 5b 32 2a 28 49 29 5d 29 29 29 0a 0a 0a 2f  dx[2*(I)]))).../
83c0: 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 63 6f 6d  *.** This is com
83d0: 6d 6f 6e 20 74 61 69 6c 20 70 72 6f 63 65 73 73  mon tail process
83e0: 69 6e 67 20 66 6f 72 20 62 74 72 65 65 50 61 72  ing for btreePar
83f0: 73 65 43 65 6c 6c 50 74 72 28 29 20 61 6e 64 0a  seCellPtr() and.
8400: 2a 2a 20 62 74 72 65 65 50 61 72 73 65 43 65 6c  ** btreeParseCel
8410: 6c 50 74 72 49 6e 64 65 78 28 29 20 66 6f 72 20  lPtrIndex() for 
8420: 74 68 65 20 63 61 73 65 20 77 68 65 6e 20 74 68  the case when th
8430: 65 20 63 65 6c 6c 20 64 6f 65 73 20 6e 6f 74 20  e cell does not 
8440: 66 69 74 20 65 6e 74 69 72 65 6c 79 0a 2a 2a 20  fit entirely.** 
8450: 6f 6e 20 61 20 73 69 6e 67 6c 65 20 42 2d 74 72  on a single B-tr
8460: 65 65 20 70 61 67 65 2e 20 20 4d 61 6b 65 20 6e  ee page.  Make n
8470: 65 63 65 73 73 61 72 79 20 61 64 6a 75 73 74 6d  ecessary adjustm
8480: 65 6e 74 73 20 74 6f 20 74 68 65 20 43 65 6c 6c  ents to the Cell
8490: 49 6e 66 6f 0a 2a 2a 20 73 74 72 75 63 74 75 72  Info.** structur
84a0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c  e..*/.static SQL
84b0: 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76 6f 69  ITE_NOINLINE voi
84c0: 64 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c  d btreeParseCell
84d0: 41 64 6a 75 73 74 53 69 7a 65 46 6f 72 4f 76 65  AdjustSizeForOve
84e0: 72 66 6c 6f 77 28 0a 20 20 4d 65 6d 50 61 67 65  rflow(.  MemPage
84f0: 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20 20   *pPage,        
8500: 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e   /* Page contain
8510: 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a  ing the cell */.
8520: 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20    u8 *pCell,    
8530: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
8540: 6e 74 65 72 20 74 6f 20 74 68 65 20 63 65 6c 6c  nter to the cell
8550: 20 74 65 78 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c   text. */.  Cell
8560: 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20  Info *pInfo     
8570: 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74      /* Fill in t
8580: 68 69 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f  his structure */
8590: 0a 29 7b 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  .){.  /* If the 
85a0: 70 61 79 6c 6f 61 64 20 77 69 6c 6c 20 6e 6f 74  payload will not
85b0: 20 66 69 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20   fit completely 
85c0: 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 67  on the local pag
85d0: 65 2c 20 77 65 20 68 61 76 65 0a 20 20 2a 2a 20  e, we have.  ** 
85e0: 74 6f 20 64 65 63 69 64 65 20 68 6f 77 20 6d 75  to decide how mu
85f0: 63 68 20 74 6f 20 73 74 6f 72 65 20 6c 6f 63 61  ch to store loca
8600: 6c 6c 79 20 61 6e 64 20 68 6f 77 20 6d 75 63 68  lly and how much
8610: 20 74 6f 20 73 70 69 6c 6c 20 6f 6e 74 6f 0a 20   to spill onto. 
8620: 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   ** overflow pag
8630: 65 73 2e 20 20 54 68 65 20 73 74 72 61 74 65 67  es.  The strateg
8640: 79 20 69 73 20 74 6f 20 6d 69 6e 69 6d 69 7a 65  y is to minimize
8650: 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 75   the amount of u
8660: 6e 75 73 65 64 0a 20 20 2a 2a 20 73 70 61 63 65  nused.  ** space
8670: 20 6f 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   on overflow pag
8680: 65 73 20 77 68 69 6c 65 20 6b 65 65 70 69 6e 67  es while keeping
8690: 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 6c   the amount of l
86a0: 6f 63 61 6c 20 73 74 6f 72 61 67 65 0a 20 20 2a  ocal storage.  *
86b0: 2a 20 69 6e 20 62 65 74 77 65 65 6e 20 6d 69 6e  * in between min
86c0: 4c 6f 63 61 6c 20 61 6e 64 20 6d 61 78 4c 6f 63  Local and maxLoc
86d0: 61 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 61  al..  **.  ** Wa
86e0: 72 6e 69 6e 67 3a 20 20 63 68 61 6e 67 69 6e 67  rning:  changing
86f0: 20 74 68 65 20 77 61 79 20 6f 76 65 72 66 6c 6f   the way overflo
8700: 77 20 70 61 79 6c 6f 61 64 20 69 73 20 64 69 73  w payload is dis
8710: 74 72 69 62 75 74 65 64 20 69 6e 20 61 6e 79 0a  tributed in any.
8720: 20 20 2a 2a 20 77 61 79 20 77 69 6c 6c 20 72 65    ** way will re
8730: 73 75 6c 74 20 69 6e 20 61 6e 20 69 6e 63 6f 6d  sult in an incom
8740: 70 61 74 69 62 6c 65 20 66 69 6c 65 20 66 6f 72  patible file for
8750: 6d 61 74 2e 0a 20 20 2a 2f 0a 20 20 69 6e 74 20  mat..  */.  int 
8760: 6d 69 6e 4c 6f 63 61 6c 3b 20 20 2f 2a 20 4d 69  minLocal;  /* Mi
8770: 6e 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20  nimum amount of 
8780: 70 61 79 6c 6f 61 64 20 68 65 6c 64 20 6c 6f 63  payload held loc
8790: 61 6c 6c 79 20 2a 2f 0a 20 20 69 6e 74 20 6d 61  ally */.  int ma
87a0: 78 4c 6f 63 61 6c 3b 20 20 2f 2a 20 4d 61 78 69  xLocal;  /* Maxi
87b0: 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70 61  mum amount of pa
87c0: 79 6c 6f 61 64 20 68 65 6c 64 20 6c 6f 63 61 6c  yload held local
87d0: 6c 79 20 2a 2f 0a 20 20 69 6e 74 20 73 75 72 70  ly */.  int surp
87e0: 6c 75 73 3b 20 20 20 2f 2a 20 4f 76 65 72 66 6c  lus;   /* Overfl
87f0: 6f 77 20 70 61 79 6c 6f 61 64 20 61 76 61 69 6c  ow payload avail
8800: 61 62 6c 65 20 66 6f 72 20 6c 6f 63 61 6c 20 73  able for local s
8810: 74 6f 72 61 67 65 20 2a 2f 0a 0a 20 20 6d 69 6e  torage */..  min
8820: 4c 6f 63 61 6c 20 3d 20 70 50 61 67 65 2d 3e 6d  Local = pPage->m
8830: 69 6e 4c 6f 63 61 6c 3b 0a 20 20 6d 61 78 4c 6f  inLocal;.  maxLo
8840: 63 61 6c 20 3d 20 70 50 61 67 65 2d 3e 6d 61 78  cal = pPage->max
8850: 4c 6f 63 61 6c 3b 0a 20 20 73 75 72 70 6c 75 73  Local;.  surplus
8860: 20 3d 20 6d 69 6e 4c 6f 63 61 6c 20 2b 20 28 70   = minLocal + (p
8870: 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20 2d  Info->nPayload -
8880: 20 6d 69 6e 4c 6f 63 61 6c 29 25 28 70 50 61 67   minLocal)%(pPag
8890: 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
88a0: 7a 65 2d 34 29 3b 0a 20 20 74 65 73 74 63 61 73  ze-4);.  testcas
88b0: 65 28 20 73 75 72 70 6c 75 73 3d 3d 6d 61 78 4c  e( surplus==maxL
88c0: 6f 63 61 6c 20 29 3b 0a 20 20 74 65 73 74 63 61  ocal );.  testca
88d0: 73 65 28 20 73 75 72 70 6c 75 73 3d 3d 6d 61 78  se( surplus==max
88e0: 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 69 66 28  Local+1 );.  if(
88f0: 20 73 75 72 70 6c 75 73 20 3c 3d 20 6d 61 78 4c   surplus <= maxL
8900: 6f 63 61 6c 20 29 7b 0a 20 20 20 20 70 49 6e 66  ocal ){.    pInf
8910: 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36  o->nLocal = (u16
8920: 29 73 75 72 70 6c 75 73 3b 0a 20 20 7d 65 6c 73  )surplus;.  }els
8930: 65 7b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c  e{.    pInfo->nL
8940: 6f 63 61 6c 20 3d 20 28 75 31 36 29 6d 69 6e 4c  ocal = (u16)minL
8950: 6f 63 61 6c 3b 0a 20 20 7d 0a 20 20 70 49 6e 66  ocal;.  }.  pInf
8960: 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77 20 3d 20 28  o->iOverflow = (
8970: 75 31 36 29 28 26 70 49 6e 66 6f 2d 3e 70 50 61  u16)(&pInfo->pPa
8980: 79 6c 6f 61 64 5b 70 49 6e 66 6f 2d 3e 6e 4c 6f  yload[pInfo->nLo
8990: 63 61 6c 5d 20 2d 20 70 43 65 6c 6c 29 3b 0a 20  cal] - pCell);. 
89a0: 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20   pInfo->nSize = 
89b0: 70 49 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77  pInfo->iOverflow
89c0: 20 2b 20 34 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54   + 4;.}../*.** T
89d0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75  he following rou
89e0: 74 69 6e 65 73 20 61 72 65 20 69 6d 70 6c 65 6d  tines are implem
89f0: 65 6e 74 61 74 69 6f 6e 73 20 6f 66 20 74 68 65  entations of the
8a00: 20 4d 65 6d 50 61 67 65 2e 78 50 61 72 73 65 43   MemPage.xParseC
8a10: 65 6c 6c 28 29 0a 2a 2a 20 6d 65 74 68 6f 64 2e  ell().** method.
8a20: 0a 2a 2a 0a 2a 2a 20 50 61 72 73 65 20 61 20 63  .**.** Parse a c
8a30: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 62 6c 6f 63  ell content bloc
8a40: 6b 20 61 6e 64 20 66 69 6c 6c 20 69 6e 20 74 68  k and fill in th
8a50: 65 20 43 65 6c 6c 49 6e 66 6f 20 73 74 72 75 63  e CellInfo struc
8a60: 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 62 74 72 65  ture..**.** btre
8a70: 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29 20  eParseCellPtr() 
8a80: 20 20 20 20 20 20 20 3d 3e 20 20 20 74 61 62 6c         =>   tabl
8a90: 65 20 62 74 72 65 65 20 6c 65 61 66 20 6e 6f 64  e btree leaf nod
8aa0: 65 73 0a 2a 2a 20 62 74 72 65 65 50 61 72 73 65  es.** btreeParse
8ab0: 43 65 6c 6c 4e 6f 50 61 79 6c 6f 61 64 28 29 20  CellNoPayload() 
8ac0: 20 3d 3e 20 20 20 74 61 62 6c 65 20 62 74 72 65   =>   table btre
8ad0: 65 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 73  e internal nodes
8ae0: 0a 2a 2a 20 62 74 72 65 65 50 61 72 73 65 43 65  .** btreeParseCe
8af0: 6c 6c 50 74 72 49 6e 64 65 78 28 29 20 20 20 3d  llPtrIndex()   =
8b00: 3e 20 20 20 69 6e 64 65 78 20 62 74 72 65 65 20  >   index btree 
8b10: 6e 6f 64 65 73 0a 2a 2a 0a 2a 2a 20 54 68 65 72  nodes.**.** Ther
8b20: 65 20 69 73 20 61 6c 73 6f 20 61 20 77 72 61 70  e is also a wrap
8b30: 70 65 72 20 66 75 6e 63 74 69 6f 6e 20 62 74 72  per function btr
8b40: 65 65 50 61 72 73 65 43 65 6c 6c 28 29 20 74 68  eeParseCell() th
8b50: 61 74 20 77 6f 72 6b 73 20 66 6f 72 0a 2a 2a 20  at works for.** 
8b60: 61 6c 6c 20 4d 65 6d 50 61 67 65 20 74 79 70 65  all MemPage type
8b70: 73 20 61 6e 64 20 74 68 61 74 20 72 65 66 65 72  s and that refer
8b80: 65 6e 63 65 73 20 74 68 65 20 63 65 6c 6c 20 62  ences the cell b
8b90: 79 20 69 6e 64 65 78 20 72 61 74 68 65 72 20 74  y index rather t
8ba0: 68 61 6e 0a 2a 2a 20 62 79 20 70 6f 69 6e 74 65  han.** by pointe
8bb0: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  r..*/.static voi
8bc0: 64 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c  d btreeParseCell
8bd0: 50 74 72 4e 6f 50 61 79 6c 6f 61 64 28 0a 20 20  PtrNoPayload(.  
8be0: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
8bf0: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
8c00: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63  containing the c
8c10: 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65  ell */.  u8 *pCe
8c20: 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ll,             
8c30: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74   /* Pointer to t
8c40: 68 65 20 63 65 6c 6c 20 74 65 78 74 2e 20 2a 2f  he cell text. */
8c50: 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e  .  CellInfo *pIn
8c60: 66 6f 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69  fo         /* Fi
8c70: 6c 6c 20 69 6e 20 74 68 69 73 20 73 74 72 75 63  ll in this struc
8c80: 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 61 73 73  ture */.){.  ass
8c90: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
8ca0: 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
8cb0: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
8cc0: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6c  assert( pPage->l
8cd0: 65 61 66 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  eaf==0 );.  asse
8ce0: 72 74 28 20 70 50 61 67 65 2d 3e 6e 6f 50 61 79  rt( pPage->noPay
8cf0: 6c 6f 61 64 20 29 3b 0a 20 20 61 73 73 65 72 74  load );.  assert
8d00: 28 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74  ( pPage->childPt
8d10: 72 53 69 7a 65 3d 3d 34 20 29 3b 0a 23 69 66 6e  rSize==4 );.#ifn
8d20: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
8d30: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
8d40: 54 45 52 28 70 50 61 67 65 29 3b 0a 23 65 6e 64  TER(pPage);.#end
8d50: 69 66 0a 20 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a  if.  pInfo->nSiz
8d60: 65 20 3d 20 34 20 2b 20 67 65 74 56 61 72 69 6e  e = 4 + getVarin
8d70: 74 28 26 70 43 65 6c 6c 5b 34 5d 2c 20 28 75 36  t(&pCell[4], (u6
8d80: 34 2a 29 26 70 49 6e 66 6f 2d 3e 6e 4b 65 79 29  4*)&pInfo->nKey)
8d90: 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c  ;.  pInfo->nPayl
8da0: 6f 61 64 20 3d 20 30 3b 0a 20 20 70 49 6e 66 6f  oad = 0;.  pInfo
8db0: 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 30 3b 0a 20 20  ->nLocal = 0;.  
8dc0: 70 49 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77  pInfo->iOverflow
8dd0: 20 3d 20 30 3b 0a 20 20 70 49 6e 66 6f 2d 3e 70   = 0;.  pInfo->p
8de0: 50 61 79 6c 6f 61 64 20 3d 20 30 3b 0a 20 20 72  Payload = 0;.  r
8df0: 65 74 75 72 6e 3b 0a 7d 0a 73 74 61 74 69 63 20  eturn;.}.static 
8e00: 76 6f 69 64 20 62 74 72 65 65 50 61 72 73 65 43  void btreeParseC
8e10: 65 6c 6c 50 74 72 28 0a 20 20 4d 65 6d 50 61 67  ellPtr(.  MemPag
8e20: 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20  e *pPage,       
8e30: 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69    /* Page contai
8e40: 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f  ning the cell */
8e50: 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20  .  u8 *pCell,   
8e60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
8e70: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63 65 6c  inter to the cel
8e80: 6c 20 74 65 78 74 2e 20 2a 2f 0a 20 20 43 65 6c  l text. */.  Cel
8e90: 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20  lInfo *pInfo    
8ea0: 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20       /* Fill in 
8eb0: 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20 2a  this structure *
8ec0: 2f 0a 29 7b 0a 20 20 75 38 20 2a 70 49 74 65 72  /.){.  u8 *pIter
8ed0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
8ee0: 2a 20 46 6f 72 20 73 63 61 6e 6e 69 6e 67 20 74  * For scanning t
8ef0: 68 72 6f 75 67 68 20 70 43 65 6c 6c 20 2a 2f 0a  hrough pCell */.
8f00: 20 20 75 33 32 20 6e 50 61 79 6c 6f 61 64 3b 20    u32 nPayload; 
8f10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
8f20: 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20  ber of bytes of 
8f30: 63 65 6c 6c 20 70 61 79 6c 6f 61 64 20 2a 2f 0a  cell payload */.
8f40: 20 20 75 36 34 20 69 4b 65 79 3b 20 20 20 20 20    u64 iKey;     
8f50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74            /* Ext
8f60: 72 61 63 74 65 64 20 4b 65 79 20 76 61 6c 75 65  racted Key value
8f70: 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73   */..  assert( s
8f80: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
8f90: 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
8fa0: 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
8fb0: 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 30  ( pPage->leaf==0
8fc0: 20 7c 7c 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d   || pPage->leaf=
8fd0: 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =1 );.  assert( 
8fe0: 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61  pPage->intKeyLea
8ff0: 66 20 7c 7c 20 70 50 61 67 65 2d 3e 6e 6f 50 61  f || pPage->noPa
9000: 79 6c 6f 61 64 20 29 3b 0a 20 20 61 73 73 65 72  yload );.  asser
9010: 74 28 20 70 50 61 67 65 2d 3e 6e 6f 50 61 79 6c  t( pPage->noPayl
9020: 6f 61 64 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  oad==0 );.  asse
9030: 72 74 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65  rt( pPage->intKe
9040: 79 4c 65 61 66 20 29 3b 0a 20 20 61 73 73 65 72  yLeaf );.  asser
9050: 74 28 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50  t( pPage->childP
9060: 74 72 53 69 7a 65 3d 3d 30 20 29 3b 0a 20 20 70  trSize==0 );.  p
9070: 49 74 65 72 20 3d 20 70 43 65 6c 6c 3b 0a 0a 20  Iter = pCell;.. 
9080: 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 62 6c 6f   /* The next blo
9090: 63 6b 20 6f 66 20 63 6f 64 65 20 69 73 20 65 71  ck of code is eq
90a0: 75 69 76 61 6c 65 6e 74 20 74 6f 3a 0a 20 20 2a  uivalent to:.  *
90b0: 2a 0a 20 20 2a 2a 20 20 20 20 20 70 49 74 65 72  *.  **     pIter
90c0: 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28   += getVarint32(
90d0: 70 49 74 65 72 2c 20 6e 50 61 79 6c 6f 61 64 29  pIter, nPayload)
90e0: 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  ;.  **.  ** The 
90f0: 63 6f 64 65 20 69 73 20 69 6e 6c 69 6e 65 64 20  code is inlined 
9100: 74 6f 20 61 76 6f 69 64 20 61 20 66 75 6e 63 74  to avoid a funct
9110: 69 6f 6e 20 63 61 6c 6c 2e 0a 20 20 2a 2f 0a 20  ion call..  */. 
9120: 20 6e 50 61 79 6c 6f 61 64 20 3d 20 2a 70 49 74   nPayload = *pIt
9130: 65 72 3b 0a 20 20 69 66 28 20 6e 50 61 79 6c 6f  er;.  if( nPaylo
9140: 61 64 3e 3d 30 78 38 30 20 29 7b 0a 20 20 20 20  ad>=0x80 ){.    
9150: 75 38 20 2a 70 45 6e 64 20 3d 20 26 70 49 74 65  u8 *pEnd = &pIte
9160: 72 5b 38 5d 3b 0a 20 20 20 20 6e 50 61 79 6c 6f  r[8];.    nPaylo
9170: 61 64 20 26 3d 20 30 78 37 66 3b 0a 20 20 20 20  ad &= 0x7f;.    
9180: 64 6f 7b 0a 20 20 20 20 20 20 6e 50 61 79 6c 6f  do{.      nPaylo
9190: 61 64 20 3d 20 28 6e 50 61 79 6c 6f 61 64 3c 3c  ad = (nPayload<<
91a0: 37 29 20 7c 20 28 2a 2b 2b 70 49 74 65 72 20 26  7) | (*++pIter &
91b0: 20 30 78 37 66 29 3b 0a 20 20 20 20 7d 77 68 69   0x7f);.    }whi
91c0: 6c 65 28 20 28 2a 70 49 74 65 72 29 3e 3d 30 78  le( (*pIter)>=0x
91d0: 38 30 20 26 26 20 70 49 74 65 72 3c 70 45 6e 64  80 && pIter<pEnd
91e0: 20 29 3b 0a 20 20 7d 0a 20 20 70 49 74 65 72 2b   );.  }.  pIter+
91f0: 2b 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6e 65 78  +;..  /* The nex
9200: 74 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20  t block of code 
9210: 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f  is equivalent to
9220: 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
9230: 70 49 74 65 72 20 2b 3d 20 67 65 74 56 61 72 69  pIter += getVari
9240: 6e 74 28 70 49 74 65 72 2c 20 28 75 36 34 2a 29  nt(pIter, (u64*)
9250: 26 70 49 6e 66 6f 2d 3e 6e 4b 65 79 29 3b 0a 20  &pInfo->nKey);. 
9260: 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 63 6f 64   **.  ** The cod
9270: 65 20 69 73 20 69 6e 6c 69 6e 65 64 20 74 6f 20  e is inlined to 
9280: 61 76 6f 69 64 20 61 20 66 75 6e 63 74 69 6f 6e  avoid a function
9290: 20 63 61 6c 6c 2e 0a 20 20 2a 2f 0a 20 20 69 4b   call..  */.  iK
92a0: 65 79 20 3d 20 2a 70 49 74 65 72 3b 0a 20 20 69  ey = *pIter;.  i
92b0: 66 28 20 69 4b 65 79 3e 3d 30 78 38 30 20 29 7b  f( iKey>=0x80 ){
92c0: 0a 20 20 20 20 75 38 20 2a 70 45 6e 64 20 3d 20  .    u8 *pEnd = 
92d0: 26 70 49 74 65 72 5b 37 5d 3b 0a 20 20 20 20 69  &pIter[7];.    i
92e0: 4b 65 79 20 26 3d 20 30 78 37 66 3b 0a 20 20 20  Key &= 0x7f;.   
92f0: 20 77 68 69 6c 65 28 31 29 7b 0a 20 20 20 20 20   while(1){.     
9300: 20 69 4b 65 79 20 3d 20 28 69 4b 65 79 3c 3c 37   iKey = (iKey<<7
9310: 29 20 7c 20 28 2a 2b 2b 70 49 74 65 72 20 26 20  ) | (*++pIter & 
9320: 30 78 37 66 29 3b 0a 20 20 20 20 20 20 69 66 28  0x7f);.      if(
9330: 20 28 2a 70 49 74 65 72 29 3c 30 78 38 30 20 29   (*pIter)<0x80 )
9340: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 69 66   break;.      if
9350: 28 20 70 49 74 65 72 3e 3d 70 45 6e 64 20 29 7b  ( pIter>=pEnd ){
9360: 0a 20 20 20 20 20 20 20 20 69 4b 65 79 20 3d 20  .        iKey = 
9370: 28 69 4b 65 79 3c 3c 38 29 20 7c 20 2a 2b 2b 70  (iKey<<8) | *++p
9380: 49 74 65 72 3b 0a 20 20 20 20 20 20 20 20 62 72  Iter;.        br
9390: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
93a0: 20 7d 0a 20 20 7d 0a 20 20 70 49 74 65 72 2b 2b   }.  }.  pIter++
93b0: 3b 0a 0a 20 20 70 49 6e 66 6f 2d 3e 6e 4b 65 79  ;..  pInfo->nKey
93c0: 20 3d 20 2a 28 69 36 34 2a 29 26 69 4b 65 79 3b   = *(i64*)&iKey;
93d0: 0a 20 20 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f  .  pInfo->nPaylo
93e0: 61 64 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20  ad = nPayload;. 
93f0: 20 70 49 6e 66 6f 2d 3e 70 50 61 79 6c 6f 61 64   pInfo->pPayload
9400: 20 3d 20 70 49 74 65 72 3b 0a 20 20 74 65 73 74   = pIter;.  test
9410: 63 61 73 65 28 20 6e 50 61 79 6c 6f 61 64 3d 3d  case( nPayload==
9420: 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20  pPage->maxLocal 
9430: 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e  );.  testcase( n
9440: 50 61 79 6c 6f 61 64 3d 3d 70 50 61 67 65 2d 3e  Payload==pPage->
9450: 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20  maxLocal+1 );.  
9460: 69 66 28 20 6e 50 61 79 6c 6f 61 64 3c 3d 70 50  if( nPayload<=pP
9470: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b  age->maxLocal ){
9480: 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20  .    /* This is 
9490: 74 68 65 20 28 65 61 73 79 29 20 63 6f 6d 6d 6f  the (easy) commo
94a0: 6e 20 63 61 73 65 20 77 68 65 72 65 20 74 68 65  n case where the
94b0: 20 65 6e 74 69 72 65 20 70 61 79 6c 6f 61 64 20   entire payload 
94c0: 66 69 74 73 0a 20 20 20 20 2a 2a 20 6f 6e 20 74  fits.    ** on t
94d0: 68 65 20 6c 6f 63 61 6c 20 70 61 67 65 2e 20 20  he local page.  
94e0: 4e 6f 20 6f 76 65 72 66 6c 6f 77 20 69 73 20 72  No overflow is r
94f0: 65 71 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a  equired..    */.
9500: 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65      pInfo->nSize
9510: 20 3d 20 6e 50 61 79 6c 6f 61 64 20 2b 20 28 75   = nPayload + (u
9520: 31 36 29 28 70 49 74 65 72 20 2d 20 70 43 65 6c  16)(pIter - pCel
9530: 6c 29 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 66  l);.    if( pInf
9540: 6f 2d 3e 6e 53 69 7a 65 3c 34 20 29 20 70 49 6e  o->nSize<4 ) pIn
9550: 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 34 3b 0a 20  fo->nSize = 4;. 
9560: 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c     pInfo->nLocal
9570: 20 3d 20 28 75 31 36 29 6e 50 61 79 6c 6f 61 64   = (u16)nPayload
9580: 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 69 4f 76  ;.    pInfo->iOv
9590: 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 7d 65  erflow = 0;.  }e
95a0: 6c 73 65 7b 0a 20 20 20 20 62 74 72 65 65 50 61  lse{.    btreePa
95b0: 72 73 65 43 65 6c 6c 41 64 6a 75 73 74 53 69 7a  rseCellAdjustSiz
95c0: 65 46 6f 72 4f 76 65 72 66 6c 6f 77 28 70 50 61  eForOverflow(pPa
95d0: 67 65 2c 20 70 43 65 6c 6c 2c 20 70 49 6e 66 6f  ge, pCell, pInfo
95e0: 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20  );.  }.}.static 
95f0: 76 6f 69 64 20 62 74 72 65 65 50 61 72 73 65 43  void btreeParseC
9600: 65 6c 6c 50 74 72 49 6e 64 65 78 28 0a 20 20 4d  ellPtrIndex(.  M
9610: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20  emPage *pPage,  
9620: 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63         /* Page c
9630: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63 65  ontaining the ce
9640: 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c  ll */.  u8 *pCel
9650: 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
9660: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68  /* Pointer to th
9670: 65 20 63 65 6c 6c 20 74 65 78 74 2e 20 2a 2f 0a  e cell text. */.
9680: 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66    CellInfo *pInf
9690: 6f 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c  o         /* Fil
96a0: 6c 20 69 6e 20 74 68 69 73 20 73 74 72 75 63 74  l in this struct
96b0: 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a  ure */.){.  u8 *
96c0: 70 49 74 65 72 3b 20 20 20 20 20 20 20 20 20 20  pIter;          
96d0: 20 20 20 20 2f 2a 20 46 6f 72 20 73 63 61 6e 6e      /* For scann
96e0: 69 6e 67 20 74 68 72 6f 75 67 68 20 70 43 65 6c  ing through pCel
96f0: 6c 20 2a 2f 0a 20 20 75 33 32 20 6e 50 61 79 6c  l */.  u32 nPayl
9700: 6f 61 64 3b 20 20 20 20 20 20 20 20 20 20 20 2f  oad;           /
9710: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
9720: 73 20 6f 66 20 63 65 6c 6c 20 70 61 79 6c 6f 61  s of cell payloa
9730: 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  d */..  assert( 
9740: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
9750: 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
9760: 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
9770: 74 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d  t( pPage->leaf==
9780: 30 20 7c 7c 20 70 50 61 67 65 2d 3e 6c 65 61 66  0 || pPage->leaf
9790: 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==1 );.  assert(
97a0: 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65   pPage->intKeyLe
97b0: 61 66 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  af==0 );.  asser
97c0: 74 28 20 70 50 61 67 65 2d 3e 6e 6f 50 61 79 6c  t( pPage->noPayl
97d0: 6f 61 64 3d 3d 30 20 29 3b 0a 20 20 70 49 74 65  oad==0 );.  pIte
97e0: 72 20 3d 20 70 43 65 6c 6c 20 2b 20 70 50 61 67  r = pCell + pPag
97f0: 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b  e->childPtrSize;
9800: 0a 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20 2a 70  .  nPayload = *p
9810: 49 74 65 72 3b 0a 20 20 69 66 28 20 6e 50 61 79  Iter;.  if( nPay
9820: 6c 6f 61 64 3e 3d 30 78 38 30 20 29 7b 0a 20 20  load>=0x80 ){.  
9830: 20 20 75 38 20 2a 70 45 6e 64 20 3d 20 26 70 49    u8 *pEnd = &pI
9840: 74 65 72 5b 38 5d 3b 0a 20 20 20 20 6e 50 61 79  ter[8];.    nPay
9850: 6c 6f 61 64 20 26 3d 20 30 78 37 66 3b 0a 20 20  load &= 0x7f;.  
9860: 20 20 64 6f 7b 0a 20 20 20 20 20 20 6e 50 61 79    do{.      nPay
9870: 6c 6f 61 64 20 3d 20 28 6e 50 61 79 6c 6f 61 64  load = (nPayload
9880: 3c 3c 37 29 20 7c 20 28 2a 2b 2b 70 49 74 65 72  <<7) | (*++pIter
9890: 20 26 20 30 78 37 66 29 3b 0a 20 20 20 20 7d 77   & 0x7f);.    }w
98a0: 68 69 6c 65 28 20 2a 28 70 49 74 65 72 29 3e 3d  hile( *(pIter)>=
98b0: 30 78 38 30 20 26 26 20 70 49 74 65 72 3c 70 45  0x80 && pIter<pE
98c0: 6e 64 20 29 3b 0a 20 20 7d 0a 20 20 70 49 74 65  nd );.  }.  pIte
98d0: 72 2b 2b 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e 4b  r++;.  pInfo->nK
98e0: 65 79 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20  ey = nPayload;. 
98f0: 20 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64   pInfo->nPayload
9900: 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 70   = nPayload;.  p
9910: 49 6e 66 6f 2d 3e 70 50 61 79 6c 6f 61 64 20 3d  Info->pPayload =
9920: 20 70 49 74 65 72 3b 0a 20 20 74 65 73 74 63 61   pIter;.  testca
9930: 73 65 28 20 6e 50 61 79 6c 6f 61 64 3d 3d 70 50  se( nPayload==pP
9940: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b  age->maxLocal );
9950: 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 50 61  .  testcase( nPa
9960: 79 6c 6f 61 64 3d 3d 70 50 61 67 65 2d 3e 6d 61  yload==pPage->ma
9970: 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 69 66  xLocal+1 );.  if
9980: 28 20 6e 50 61 79 6c 6f 61 64 3c 3d 70 50 61 67  ( nPayload<=pPag
9990: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20  e->maxLocal ){. 
99a0: 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74 68     /* This is th
99b0: 65 20 28 65 61 73 79 29 20 63 6f 6d 6d 6f 6e 20  e (easy) common 
99c0: 63 61 73 65 20 77 68 65 72 65 20 74 68 65 20 65  case where the e
99d0: 6e 74 69 72 65 20 70 61 79 6c 6f 61 64 20 66 69  ntire payload fi
99e0: 74 73 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65  ts.    ** on the
99f0: 20 6c 6f 63 61 6c 20 70 61 67 65 2e 20 20 4e 6f   local page.  No
9a00: 20 6f 76 65 72 66 6c 6f 77 20 69 73 20 72 65 71   overflow is req
9a10: 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  uired..    */.  
9a20: 20 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d    pInfo->nSize =
9a30: 20 6e 50 61 79 6c 6f 61 64 20 2b 20 28 75 31 36   nPayload + (u16
9a40: 29 28 70 49 74 65 72 20 2d 20 70 43 65 6c 6c 29  )(pIter - pCell)
9a50: 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 66 6f 2d  ;.    if( pInfo-
9a60: 3e 6e 53 69 7a 65 3c 34 20 29 20 70 49 6e 66 6f  >nSize<4 ) pInfo
9a70: 2d 3e 6e 53 69 7a 65 20 3d 20 34 3b 0a 20 20 20  ->nSize = 4;.   
9a80: 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d   pInfo->nLocal =
9a90: 20 28 75 31 36 29 6e 50 61 79 6c 6f 61 64 3b 0a   (u16)nPayload;.
9aa0: 20 20 20 20 70 49 6e 66 6f 2d 3e 69 4f 76 65 72      pInfo->iOver
9ab0: 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  flow = 0;.  }els
9ac0: 65 7b 0a 20 20 20 20 62 74 72 65 65 50 61 72 73  e{.    btreePars
9ad0: 65 43 65 6c 6c 41 64 6a 75 73 74 53 69 7a 65 46  eCellAdjustSizeF
9ae0: 6f 72 4f 76 65 72 66 6c 6f 77 28 70 50 61 67 65  orOverflow(pPage
9af0: 2c 20 70 43 65 6c 6c 2c 20 70 49 6e 66 6f 29 3b  , pCell, pInfo);
9b00: 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f  .  }.}.static vo
9b10: 69 64 20 62 74 72 65 65 50 61 72 73 65 43 65 6c  id btreeParseCel
9b20: 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  l(.  MemPage *pP
9b30: 61 67 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  age,         /* 
9b40: 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  Page containing 
9b50: 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e  the cell */.  in
9b60: 74 20 69 43 65 6c 6c 2c 20 20 20 20 20 20 20 20  t iCell,        
9b70: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 65 6c        /* The cel
9b80: 6c 20 69 6e 64 65 78 2e 20 20 46 69 72 73 74 20  l index.  First 
9b90: 63 65 6c 6c 20 69 73 20 30 20 2a 2f 0a 20 20 43  cell is 0 */.  C
9ba0: 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20  ellInfo *pInfo  
9bb0: 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69         /* Fill i
9bc0: 6e 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65  n this structure
9bd0: 20 2a 2f 0a 29 7b 0a 20 20 70 50 61 67 65 2d 3e   */.){.  pPage->
9be0: 78 50 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65  xParseCell(pPage
9bf0: 2c 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  , findCell(pPage
9c00: 2c 20 69 43 65 6c 6c 29 2c 20 70 49 6e 66 6f 29  , iCell), pInfo)
9c10: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  ;.}../*.** The f
9c20: 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65  ollowing routine
9c30: 73 20 61 72 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s are implementa
9c40: 74 69 6f 6e 73 20 6f 66 20 74 68 65 20 4d 65 6d  tions of the Mem
9c50: 50 61 67 65 2e 78 43 65 6c 6c 53 69 7a 65 0a 2a  Page.xCellSize.*
9c60: 2a 20 6d 65 74 68 6f 64 2e 0a 2a 2a 0a 2a 2a 20  * method..**.** 
9c70: 43 6f 6d 70 75 74 65 20 74 68 65 20 74 6f 74 61  Compute the tota
9c80: 6c 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  l number of byte
9c90: 73 20 74 68 61 74 20 61 20 43 65 6c 6c 20 6e 65  s that a Cell ne
9ca0: 65 64 73 20 69 6e 20 74 68 65 20 63 65 6c 6c 0a  eds in the cell.
9cb0: 2a 2a 20 64 61 74 61 20 61 72 65 61 20 6f 66 20  ** data area of 
9cc0: 74 68 65 20 62 74 72 65 65 2d 70 61 67 65 2e 20  the btree-page. 
9cd0: 20 54 68 65 20 72 65 74 75 72 6e 20 6e 75 6d 62   The return numb
9ce0: 65 72 20 69 6e 63 6c 75 64 65 73 20 74 68 65 20  er includes the 
9cf0: 63 65 6c 6c 0a 2a 2a 20 64 61 74 61 20 68 65 61  cell.** data hea
9d00: 64 65 72 20 61 6e 64 20 74 68 65 20 6c 6f 63 61  der and the loca
9d10: 6c 20 70 61 79 6c 6f 61 64 2c 20 62 75 74 20 6e  l payload, but n
9d20: 6f 74 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20  ot any overflow 
9d30: 70 61 67 65 20 6f 72 0a 2a 2a 20 74 68 65 20 73  page or.** the s
9d40: 70 61 63 65 20 75 73 65 64 20 62 79 20 74 68 65  pace used by the
9d50: 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 2e 0a 2a   cell pointer..*
9d60: 2a 0a 2a 2a 20 63 65 6c 6c 53 69 7a 65 50 74 72  *.** cellSizePtr
9d70: 4e 6f 50 61 79 6c 6f 61 64 28 29 20 20 20 20 3d  NoPayload()    =
9d80: 3e 20 20 20 74 61 62 6c 65 20 69 6e 74 65 72 6e  >   table intern
9d90: 61 6c 20 6e 6f 64 65 73 0a 2a 2a 20 63 65 6c 6c  al nodes.** cell
9da0: 53 69 7a 65 50 74 72 28 29 20 20 20 20 20 20 20  SizePtr()       
9db0: 20 20 20 20 20 20 3d 3e 20 20 20 61 6c 6c 20 69        =>   all i
9dc0: 6e 64 65 78 20 6e 6f 64 65 73 20 26 20 74 61 62  ndex nodes & tab
9dd0: 6c 65 20 6c 65 61 66 20 6e 6f 64 65 73 0a 2a 2f  le leaf nodes.*/
9de0: 0a 73 74 61 74 69 63 20 75 31 36 20 63 65 6c 6c  .static u16 cell
9df0: 53 69 7a 65 50 74 72 28 4d 65 6d 50 61 67 65 20  SizePtr(MemPage 
9e00: 2a 70 50 61 67 65 2c 20 75 38 20 2a 70 43 65 6c  *pPage, u8 *pCel
9e10: 6c 29 7b 0a 20 20 75 38 20 2a 70 49 74 65 72 20  l){.  u8 *pIter 
9e20: 3d 20 70 43 65 6c 6c 20 2b 20 70 50 61 67 65 2d  = pCell + pPage-
9e30: 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 20 2f  >childPtrSize; /
9e40: 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76  * For looping ov
9e50: 65 72 20 62 79 74 65 73 20 6f 66 20 70 43 65 6c  er bytes of pCel
9e60: 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 45 6e 64 3b  l */.  u8 *pEnd;
9e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9e90: 2f 2a 20 45 6e 64 20 6d 61 72 6b 20 66 6f 72 20  /* End mark for 
9ea0: 61 20 76 61 72 69 6e 74 20 2a 2f 0a 20 20 75 33  a varint */.  u3
9eb0: 32 20 6e 53 69 7a 65 3b 20 20 20 20 20 20 20 20  2 nSize;        
9ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9ed0: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 76         /* Size v
9ee0: 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20 2a  alue to return *
9ef0: 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  /..#ifdef SQLITE
9f00: 5f 44 45 42 55 47 0a 20 20 2f 2a 20 54 68 65 20  _DEBUG.  /* The 
9f10: 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62  value returned b
9f20: 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  y this function 
9f30: 73 68 6f 75 6c 64 20 61 6c 77 61 79 73 20 62 65  should always be
9f40: 20 74 68 65 20 73 61 6d 65 20 61 73 0a 20 20 2a   the same as.  *
9f50: 2a 20 74 68 65 20 28 43 65 6c 6c 49 6e 66 6f 2e  * the (CellInfo.
9f60: 6e 53 69 7a 65 29 20 76 61 6c 75 65 20 66 6f 75  nSize) value fou
9f70: 6e 64 20 62 79 20 64 6f 69 6e 67 20 61 20 66 75  nd by doing a fu
9f80: 6c 6c 20 70 61 72 73 65 20 6f 66 20 74 68 65 0a  ll parse of the.
9f90: 20 20 2a 2a 20 63 65 6c 6c 2e 20 49 66 20 53 51    ** cell. If SQ
9fa0: 4c 49 54 45 5f 44 45 42 55 47 20 69 73 20 64 65  LITE_DEBUG is de
9fb0: 66 69 6e 65 64 2c 20 61 6e 20 61 73 73 65 72 74  fined, an assert
9fc0: 28 29 20 61 74 20 74 68 65 20 62 6f 74 74 6f 6d  () at the bottom
9fd0: 20 6f 66 0a 20 20 2a 2a 20 74 68 69 73 20 66 75   of.  ** this fu
9fe0: 6e 63 74 69 6f 6e 20 76 65 72 69 66 69 65 73 20  nction verifies 
9ff0: 74 68 61 74 20 74 68 69 73 20 69 6e 76 61 72 69  that this invari
a000: 61 6e 74 20 69 73 20 6e 6f 74 20 76 69 6f 6c 61  ant is not viola
a010: 74 65 64 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e  ted. */.  CellIn
a020: 66 6f 20 64 65 62 75 67 69 6e 66 6f 3b 0a 20 20  fo debuginfo;.  
a030: 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c  pPage->xParseCel
a040: 6c 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20  l(pPage, pCell, 
a050: 26 64 65 62 75 67 69 6e 66 6f 29 3b 0a 23 65 6e  &debuginfo);.#en
a060: 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70  dif..  assert( p
a070: 50 61 67 65 2d 3e 6e 6f 50 61 79 6c 6f 61 64 3d  Page->noPayload=
a080: 3d 30 20 29 3b 0a 20 20 6e 53 69 7a 65 20 3d 20  =0 );.  nSize = 
a090: 2a 70 49 74 65 72 3b 0a 20 20 69 66 28 20 6e 53  *pIter;.  if( nS
a0a0: 69 7a 65 3e 3d 30 78 38 30 20 29 7b 0a 20 20 20  ize>=0x80 ){.   
a0b0: 20 70 45 6e 64 20 3d 20 26 70 49 74 65 72 5b 38   pEnd = &pIter[8
a0c0: 5d 3b 0a 20 20 20 20 6e 53 69 7a 65 20 26 3d 20  ];.    nSize &= 
a0d0: 30 78 37 66 3b 0a 20 20 20 20 64 6f 7b 0a 20 20  0x7f;.    do{.  
a0e0: 20 20 20 20 6e 53 69 7a 65 20 3d 20 28 6e 53 69      nSize = (nSi
a0f0: 7a 65 3c 3c 37 29 20 7c 20 28 2a 2b 2b 70 49 74  ze<<7) | (*++pIt
a100: 65 72 20 26 20 30 78 37 66 29 3b 0a 20 20 20 20  er & 0x7f);.    
a110: 7d 77 68 69 6c 65 28 20 2a 28 70 49 74 65 72 29  }while( *(pIter)
a120: 3e 3d 30 78 38 30 20 26 26 20 70 49 74 65 72 3c  >=0x80 && pIter<
a130: 70 45 6e 64 20 29 3b 0a 20 20 7d 0a 20 20 70 49  pEnd );.  }.  pI
a140: 74 65 72 2b 2b 3b 0a 20 20 69 66 28 20 70 50 61  ter++;.  if( pPa
a150: 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20  ge->intKey ){.  
a160: 20 20 2f 2a 20 70 49 74 65 72 20 6e 6f 77 20 70    /* pIter now p
a170: 6f 69 6e 74 73 20 61 74 20 74 68 65 20 36 34 2d  oints at the 64-
a180: 62 69 74 20 69 6e 74 65 67 65 72 20 6b 65 79 20  bit integer key 
a190: 76 61 6c 75 65 2c 20 61 20 76 61 72 69 61 62 6c  value, a variabl
a1a0: 65 20 6c 65 6e 67 74 68 20 0a 20 20 20 20 2a 2a  e length .    **
a1b0: 20 69 6e 74 65 67 65 72 2e 20 54 68 65 20 66 6f   integer. The fo
a1c0: 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 6d 6f  llowing block mo
a1d0: 76 65 73 20 70 49 74 65 72 20 74 6f 20 70 6f 69  ves pIter to poi
a1e0: 6e 74 20 61 74 20 74 68 65 20 66 69 72 73 74 20  nt at the first 
a1f0: 62 79 74 65 0a 20 20 20 20 2a 2a 20 70 61 73 74  byte.    ** past
a200: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
a210: 6b 65 79 20 76 61 6c 75 65 2e 20 2a 2f 0a 20 20  key value. */.  
a220: 20 20 70 45 6e 64 20 3d 20 26 70 49 74 65 72 5b    pEnd = &pIter[
a230: 39 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28  9];.    while( (
a240: 2a 70 49 74 65 72 2b 2b 29 26 30 78 38 30 20 26  *pIter++)&0x80 &
a250: 26 20 70 49 74 65 72 3c 70 45 6e 64 20 29 3b 0a  & pIter<pEnd );.
a260: 20 20 7d 0a 20 20 74 65 73 74 63 61 73 65 28 20    }.  testcase( 
a270: 6e 53 69 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d 61  nSize==pPage->ma
a280: 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 74 65 73 74  xLocal );.  test
a290: 63 61 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61  case( nSize==pPa
a2a0: 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29  ge->maxLocal+1 )
a2b0: 3b 0a 20 20 69 66 28 20 6e 53 69 7a 65 3c 3d 70  ;.  if( nSize<=p
a2c0: 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29  Page->maxLocal )
a2d0: 7b 0a 20 20 20 20 6e 53 69 7a 65 20 2b 3d 20 28  {.    nSize += (
a2e0: 75 33 32 29 28 70 49 74 65 72 20 2d 20 70 43 65  u32)(pIter - pCe
a2f0: 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20 6e 53 69  ll);.    if( nSi
a300: 7a 65 3c 34 20 29 20 6e 53 69 7a 65 20 3d 20 34  ze<4 ) nSize = 4
a310: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
a320: 6e 74 20 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 50  nt minLocal = pP
a330: 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20  age->minLocal;. 
a340: 20 20 20 6e 53 69 7a 65 20 3d 20 6d 69 6e 4c 6f     nSize = minLo
a350: 63 61 6c 20 2b 20 28 6e 53 69 7a 65 20 2d 20 6d  cal + (nSize - m
a360: 69 6e 4c 6f 63 61 6c 29 20 25 20 28 70 50 61 67  inLocal) % (pPag
a370: 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
a380: 7a 65 20 2d 20 34 29 3b 0a 20 20 20 20 74 65 73  ze - 4);.    tes
a390: 74 63 61 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50  tcase( nSize==pP
a3a0: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b  age->maxLocal );
a3b0: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e  .    testcase( n
a3c0: 53 69 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78  Size==pPage->max
a3d0: 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 20 20 69  Local+1 );.    i
a3e0: 66 28 20 6e 53 69 7a 65 3e 70 50 61 67 65 2d 3e  f( nSize>pPage->
a3f0: 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20  maxLocal ){.    
a400: 20 20 6e 53 69 7a 65 20 3d 20 6d 69 6e 4c 6f 63    nSize = minLoc
a410: 61 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 53  al;.    }.    nS
a420: 69 7a 65 20 2b 3d 20 34 20 2b 20 28 75 31 36 29  ize += 4 + (u16)
a430: 28 70 49 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b  (pIter - pCell);
a440: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e  .  }.  assert( n
a450: 53 69 7a 65 3d 3d 64 65 62 75 67 69 6e 66 6f 2e  Size==debuginfo.
a460: 6e 53 69 7a 65 20 7c 7c 20 43 4f 52 52 55 50 54  nSize || CORRUPT
a470: 5f 44 42 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  _DB );.  return 
a480: 28 75 31 36 29 6e 53 69 7a 65 3b 0a 7d 0a 73 74  (u16)nSize;.}.st
a490: 61 74 69 63 20 75 31 36 20 63 65 6c 6c 53 69 7a  atic u16 cellSiz
a4a0: 65 50 74 72 4e 6f 50 61 79 6c 6f 61 64 28 4d 65  ePtrNoPayload(Me
a4b0: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75 38  mPage *pPage, u8
a4c0: 20 2a 70 43 65 6c 6c 29 7b 0a 20 20 75 38 20 2a   *pCell){.  u8 *
a4d0: 70 49 74 65 72 20 3d 20 70 43 65 6c 6c 20 2b 20  pIter = pCell + 
a4e0: 34 3b 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e  4; /* For loopin
a4f0: 67 20 6f 76 65 72 20 62 79 74 65 73 20 6f 66 20  g over bytes of 
a500: 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70  pCell */.  u8 *p
a510: 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  End;            
a520: 20 20 2f 2a 20 45 6e 64 20 6d 61 72 6b 20 66 6f    /* End mark fo
a530: 72 20 61 20 76 61 72 69 6e 74 20 2a 2f 0a 0a 23  r a varint */..#
a540: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
a550: 55 47 0a 20 20 2f 2a 20 54 68 65 20 76 61 6c 75  UG.  /* The valu
a560: 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68  e returned by th
a570: 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75  is function shou
a580: 6c 64 20 61 6c 77 61 79 73 20 62 65 20 74 68 65  ld always be the
a590: 20 73 61 6d 65 20 61 73 0a 20 20 2a 2a 20 74 68   same as.  ** th
a5a0: 65 20 28 43 65 6c 6c 49 6e 66 6f 2e 6e 53 69 7a  e (CellInfo.nSiz
a5b0: 65 29 20 76 61 6c 75 65 20 66 6f 75 6e 64 20 62  e) value found b
a5c0: 79 20 64 6f 69 6e 67 20 61 20 66 75 6c 6c 20 70  y doing a full p
a5d0: 61 72 73 65 20 6f 66 20 74 68 65 0a 20 20 2a 2a  arse of the.  **
a5e0: 20 63 65 6c 6c 2e 20 49 66 20 53 51 4c 49 54 45   cell. If SQLITE
a5f0: 5f 44 45 42 55 47 20 69 73 20 64 65 66 69 6e 65  _DEBUG is define
a600: 64 2c 20 61 6e 20 61 73 73 65 72 74 28 29 20 61  d, an assert() a
a610: 74 20 74 68 65 20 62 6f 74 74 6f 6d 20 6f 66 0a  t the bottom of.
a620: 20 20 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69    ** this functi
a630: 6f 6e 20 76 65 72 69 66 69 65 73 20 74 68 61 74  on verifies that
a640: 20 74 68 69 73 20 69 6e 76 61 72 69 61 6e 74 20   this invariant 
a650: 69 73 20 6e 6f 74 20 76 69 6f 6c 61 74 65 64 2e  is not violated.
a660: 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 64   */.  CellInfo d
a670: 65 62 75 67 69 6e 66 6f 3b 0a 20 20 70 50 61 67  ebuginfo;.  pPag
a680: 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28 70 50  e->xParseCell(pP
a690: 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 64 65 62  age, pCell, &deb
a6a0: 75 67 69 6e 66 6f 29 3b 0a 23 65 6c 73 65 0a 20  uginfo);.#else. 
a6b0: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
a6c0: 52 28 70 50 61 67 65 29 3b 0a 23 65 6e 64 69 66  R(pPage);.#endif
a6d0: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
a6e0: 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3d  e->childPtrSize=
a6f0: 3d 34 20 29 3b 0a 20 20 70 45 6e 64 20 3d 20 70  =4 );.  pEnd = p
a700: 49 74 65 72 20 2b 20 39 3b 0a 20 20 77 68 69 6c  Iter + 9;.  whil
a710: 65 28 20 28 2a 70 49 74 65 72 2b 2b 29 26 30 78  e( (*pIter++)&0x
a720: 38 30 20 26 26 20 70 49 74 65 72 3c 70 45 6e 64  80 && pIter<pEnd
a730: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64 65   );.  assert( de
a740: 62 75 67 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 28  buginfo.nSize==(
a750: 75 31 36 29 28 70 49 74 65 72 20 2d 20 70 43 65  u16)(pIter - pCe
a760: 6c 6c 29 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44  ll) || CORRUPT_D
a770: 42 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 75  B );.  return (u
a780: 31 36 29 28 70 49 74 65 72 20 2d 20 70 43 65 6c  16)(pIter - pCel
a790: 6c 29 3b 0a 7d 0a 0a 0a 23 69 66 64 65 66 20 53  l);.}...#ifdef S
a7a0: 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 20 54  QLITE_DEBUG./* T
a7b0: 68 69 73 20 76 61 72 69 61 74 69 6f 6e 20 6f 6e  his variation on
a7c0: 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 29 20 69   cellSizePtr() i
a7d0: 73 20 75 73 65 64 20 69 6e 73 69 64 65 20 6f 66  s used inside of
a7e0: 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d   assert() statem
a7f0: 65 6e 74 73 0a 2a 2a 20 6f 6e 6c 79 2e 20 2a 2f  ents.** only. */
a800: 0a 73 74 61 74 69 63 20 75 31 36 20 63 65 6c 6c  .static u16 cell
a810: 53 69 7a 65 28 4d 65 6d 50 61 67 65 20 2a 70 50  Size(MemPage *pP
a820: 61 67 65 2c 20 69 6e 74 20 69 43 65 6c 6c 29 7b  age, int iCell){
a830: 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 2d  .  return pPage-
a840: 3e 78 43 65 6c 6c 53 69 7a 65 28 70 50 61 67 65  >xCellSize(pPage
a850: 2c 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  , findCell(pPage
a860: 2c 20 69 43 65 6c 6c 29 29 3b 0a 7d 0a 23 65 6e  , iCell));.}.#en
a870: 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  dif..#ifndef SQL
a880: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
a890: 55 55 4d 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  UUM./*.** If the
a8a0: 20 63 65 6c 6c 20 70 43 65 6c 6c 2c 20 70 61 72   cell pCell, par
a8b0: 74 20 6f 66 20 70 61 67 65 20 70 50 61 67 65 20  t of page pPage 
a8c0: 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e 74  contains a point
a8d0: 65 72 0a 2a 2a 20 74 6f 20 61 6e 20 6f 76 65 72  er.** to an over
a8e0: 66 6c 6f 77 20 70 61 67 65 2c 20 69 6e 73 65 72  flow page, inser
a8f0: 74 20 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20  t an entry into 
a900: 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a  the pointer-map.
a910: 2a 2a 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66  ** for the overf
a920: 6c 6f 77 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61  low page..*/.sta
a930: 74 69 63 20 76 6f 69 64 20 70 74 72 6d 61 70 50  tic void ptrmapP
a940: 75 74 4f 76 66 6c 50 74 72 28 4d 65 6d 50 61 67  utOvflPtr(MemPag
a950: 65 20 2a 70 50 61 67 65 2c 20 75 38 20 2a 70 43  e *pPage, u8 *pC
a960: 65 6c 6c 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a  ell, int *pRC){.
a970: 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b    CellInfo info;
a980: 0a 20 20 69 66 28 20 2a 70 52 43 20 29 20 72 65  .  if( *pRC ) re
a990: 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20  turn;.  assert( 
a9a0: 70 43 65 6c 6c 21 3d 30 20 29 3b 0a 20 20 70 50  pCell!=0 );.  pP
a9b0: 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28  age->xParseCell(
a9c0: 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69  pPage, pCell, &i
a9d0: 6e 66 6f 29 3b 0a 20 20 69 66 28 20 69 6e 66 6f  nfo);.  if( info
a9e0: 2e 69 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20  .iOverflow ){.  
a9f0: 20 20 50 67 6e 6f 20 6f 76 66 6c 20 3d 20 67 65    Pgno ovfl = ge
aa00: 74 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e  t4byte(&pCell[in
aa10: 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a  fo.iOverflow]);.
aa20: 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 50      ptrmapPut(pP
aa30: 61 67 65 2d 3e 70 42 74 2c 20 6f 76 66 6c 2c 20  age->pBt, ovfl, 
aa40: 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31  PTRMAP_OVERFLOW1
aa50: 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 70  , pPage->pgno, p
aa60: 52 43 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69  RC);.  }.}.#endi
aa70: 66 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 72 61 67  f.../*.** Defrag
aa80: 6d 65 6e 74 20 74 68 65 20 70 61 67 65 20 67 69  ment the page gi
aa90: 76 65 6e 2e 20 20 41 6c 6c 20 43 65 6c 6c 73 20  ven.  All Cells 
aaa0: 61 72 65 20 6d 6f 76 65 64 20 74 6f 20 74 68 65  are moved to the
aab0: 0a 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65 20 70  .** end of the p
aac0: 61 67 65 20 61 6e 64 20 61 6c 6c 20 66 72 65 65  age and all free
aad0: 20 73 70 61 63 65 20 69 73 20 63 6f 6c 6c 65 63   space is collec
aae0: 74 65 64 20 69 6e 74 6f 20 6f 6e 65 0a 2a 2a 20  ted into one.** 
aaf0: 62 69 67 20 46 72 65 65 42 6c 6b 20 74 68 61 74  big FreeBlk that
ab00: 20 6f 63 63 75 72 73 20 69 6e 20 62 65 74 77 65   occurs in betwe
ab10: 65 6e 20 74 68 65 20 68 65 61 64 65 72 20 61 6e  en the header an
ab20: 64 20 63 65 6c 6c 0a 2a 2a 20 70 6f 69 6e 74 65  d cell.** pointe
ab30: 72 20 61 72 72 61 79 20 61 6e 64 20 74 68 65 20  r array and the 
ab40: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65  cell content are
ab50: 61 2e 0a 2a 2a 0a 2a 2a 20 45 56 49 44 45 4e 43  a..**.** EVIDENC
ab60: 45 2d 4f 46 3a 20 52 2d 34 34 35 38 32 2d 36 30  E-OF: R-44582-60
ab70: 31 33 38 20 53 51 4c 69 74 65 20 6d 61 79 20 66  138 SQLite may f
ab80: 72 6f 6d 20 74 69 6d 65 20 74 6f 20 74 69 6d 65  rom time to time
ab90: 20 72 65 6f 72 67 61 6e 69 7a 65 20 61 0a 2a 2a   reorganize a.**
aba0: 20 62 2d 74 72 65 65 20 70 61 67 65 20 73 6f 20   b-tree page so 
abb0: 74 68 61 74 20 74 68 65 72 65 20 61 72 65 20 6e  that there are n
abc0: 6f 20 66 72 65 65 62 6c 6f 63 6b 73 20 6f 72 20  o freeblocks or 
abd0: 66 72 61 67 6d 65 6e 74 20 62 79 74 65 73 2c 20  fragment bytes, 
abe0: 61 6c 6c 0a 2a 2a 20 75 6e 75 73 65 64 20 62 79  all.** unused by
abf0: 74 65 73 20 61 72 65 20 63 6f 6e 74 61 69 6e 65  tes are containe
ac00: 64 20 69 6e 20 74 68 65 20 75 6e 61 6c 6c 6f 63  d in the unalloc
ac10: 61 74 65 64 20 73 70 61 63 65 20 72 65 67 69 6f  ated space regio
ac20: 6e 2c 20 61 6e 64 20 61 6c 6c 0a 2a 2a 20 63 65  n, and all.** ce
ac30: 6c 6c 73 20 61 72 65 20 70 61 63 6b 65 64 20 74  lls are packed t
ac40: 69 67 68 74 6c 79 20 61 74 20 74 68 65 20 65 6e  ightly at the en
ac50: 64 20 6f 66 20 74 68 65 20 70 61 67 65 2e 0a 2a  d of the page..*
ac60: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 65 66  /.static int def
ac70: 72 61 67 6d 65 6e 74 50 61 67 65 28 4d 65 6d 50  ragmentPage(MemP
ac80: 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 69  age *pPage){.  i
ac90: 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
aca0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
acb0: 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69  p counter */.  i
acc0: 6e 74 20 70 63 3b 20 20 20 20 20 20 20 20 20 20  nt pc;          
acd0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
ace0: 72 65 73 73 20 6f 66 20 74 68 65 20 69 2d 74 68  ress of the i-th
acf0: 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 68   cell */.  int h
ad00: 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dr;             
ad10: 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
ad20: 74 6f 20 74 68 65 20 70 61 67 65 20 68 65 61 64  to the page head
ad30: 65 72 20 2a 2f 0a 20 20 69 6e 74 20 73 69 7a 65  er */.  int size
ad40: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
ad50: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 20     /* Size of a 
ad60: 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 75 73  cell */.  int us
ad70: 61 62 6c 65 53 69 7a 65 3b 20 20 20 20 20 20 20  ableSize;       
ad80: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
ad90: 66 20 75 73 61 62 6c 65 20 62 79 74 65 73 20 6f  f usable bytes o
ada0: 6e 20 61 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e  n a page */.  in
adb0: 74 20 63 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20  t cellOffset;   
adc0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
add0: 65 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 70  et to the cell p
ade0: 6f 69 6e 74 65 72 20 61 72 72 61 79 20 2a 2f 0a  ointer array */.
adf0: 20 20 69 6e 74 20 63 62 72 6b 3b 20 20 20 20 20    int cbrk;     
ae00: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ae10: 4f 66 66 73 65 74 20 74 6f 20 74 68 65 20 63 65  Offset to the ce
ae20: 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20  ll content area 
ae30: 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20  */.  int nCell; 
ae40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ae50: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c  /* Number of cel
ae60: 6c 73 20 6f 6e 20 74 68 65 20 70 61 67 65 20 2a  ls on the page *
ae70: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
ae80: 72 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 2f  r *data;       /
ae90: 2a 20 54 68 65 20 70 61 67 65 20 64 61 74 61 20  * The page data 
aea0: 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
aeb0: 61 72 20 2a 74 65 6d 70 3b 20 20 20 20 20 20 20  ar *temp;       
aec0: 2f 2a 20 54 65 6d 70 20 61 72 65 61 20 66 6f 72  /* Temp area for
aed0: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 2a 2f   cell content */
aee0: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
aef0: 20 2a 73 72 63 3b 20 20 20 20 20 20 20 20 2f 2a   *src;        /*
af00: 20 53 6f 75 72 63 65 20 6f 66 20 63 6f 6e 74 65   Source of conte
af10: 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c  nt */.  int iCel
af20: 6c 46 69 72 73 74 3b 20 20 20 20 20 20 20 20 20  lFirst;         
af30: 20 20 20 2f 2a 20 46 69 72 73 74 20 61 6c 6c 6f     /* First allo
af40: 77 61 62 6c 65 20 63 65 6c 6c 20 69 6e 64 65 78  wable cell index
af50: 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c 4c   */.  int iCellL
af60: 61 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ast;            
af70: 20 2f 2a 20 4c 61 73 74 20 70 6f 73 73 69 62 6c   /* Last possibl
af80: 65 20 63 65 6c 6c 20 69 6e 64 65 78 20 2a 2f 0a  e cell index */.
af90: 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
afa0: 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
afb0: 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
afc0: 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ge) );.  assert(
afd0: 20 70 50 61 67 65 2d 3e 70 42 74 21 3d 30 20 29   pPage->pBt!=0 )
afe0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
aff0: 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
b000: 7a 65 20 3c 3d 20 53 51 4c 49 54 45 5f 4d 41 58  ze <= SQLITE_MAX
b010: 5f 50 41 47 45 5f 53 49 5a 45 20 29 3b 0a 20 20  _PAGE_SIZE );.  
b020: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
b030: 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20  Overflow==0 );. 
b040: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
b050: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
b060: 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
b070: 3b 0a 20 20 74 65 6d 70 20 3d 20 30 3b 0a 20 20  ;.  temp = 0;.  
b080: 73 72 63 20 3d 20 64 61 74 61 20 3d 20 70 50 61  src = data = pPa
b090: 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 68 64 72  ge->aData;.  hdr
b0a0: 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66   = pPage->hdrOff
b0b0: 73 65 74 3b 0a 20 20 63 65 6c 6c 4f 66 66 73 65  set;.  cellOffse
b0c0: 74 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f  t = pPage->cellO
b0d0: 66 66 73 65 74 3b 0a 20 20 6e 43 65 6c 6c 20 3d  ffset;.  nCell =
b0e0: 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20   pPage->nCell;. 
b0f0: 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 3d 3d   assert( nCell==
b100: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
b110: 64 72 2b 33 5d 29 20 29 3b 0a 20 20 75 73 61 62  dr+3]) );.  usab
b120: 6c 65 53 69 7a 65 20 3d 20 70 50 61 67 65 2d 3e  leSize = pPage->
b130: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b  pBt->usableSize;
b140: 0a 20 20 63 62 72 6b 20 3d 20 75 73 61 62 6c 65  .  cbrk = usable
b150: 53 69 7a 65 3b 0a 20 20 69 43 65 6c 6c 46 69 72  Size;.  iCellFir
b160: 73 74 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20  st = cellOffset 
b170: 2b 20 32 2a 6e 43 65 6c 6c 3b 0a 20 20 69 43 65  + 2*nCell;.  iCe
b180: 6c 6c 4c 61 73 74 20 3d 20 75 73 61 62 6c 65 53  llLast = usableS
b190: 69 7a 65 20 2d 20 34 3b 0a 20 20 66 6f 72 28 69  ize - 4;.  for(i
b1a0: 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b  =0; i<nCell; i++
b1b0: 29 7b 0a 20 20 20 20 75 38 20 2a 70 41 64 64 72  ){.    u8 *pAddr
b1c0: 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 69 2d 74  ;     /* The i-t
b1d0: 68 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 2a  h cell pointer *
b1e0: 2f 0a 20 20 20 20 70 41 64 64 72 20 3d 20 26 64  /.    pAddr = &d
b1f0: 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74 20 2b  ata[cellOffset +
b200: 20 69 2a 32 5d 3b 0a 20 20 20 20 70 63 20 3d 20   i*2];.    pc = 
b210: 67 65 74 32 62 79 74 65 28 70 41 64 64 72 29 3b  get2byte(pAddr);
b220: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
b230: 63 3d 3d 69 43 65 6c 6c 46 69 72 73 74 20 29 3b  c==iCellFirst );
b240: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
b250: 63 3d 3d 69 43 65 6c 6c 4c 61 73 74 20 29 3b 0a  c==iCellLast );.
b260: 20 20 20 20 2f 2a 20 54 68 65 73 65 20 63 6f 6e      /* These con
b270: 64 69 74 69 6f 6e 73 20 68 61 76 65 20 61 6c 72  ditions have alr
b280: 65 61 64 79 20 62 65 65 6e 20 76 65 72 69 66 69  eady been verifi
b290: 65 64 20 69 6e 20 62 74 72 65 65 49 6e 69 74 50  ed in btreeInitP
b2a0: 61 67 65 28 29 0a 20 20 20 20 2a 2a 20 69 66 20  age().    ** if 
b2b0: 50 52 41 47 4d 41 20 63 65 6c 6c 5f 73 69 7a 65  PRAGMA cell_size
b2c0: 5f 63 68 65 63 6b 3d 4f 4e 2e 0a 20 20 20 20 2a  _check=ON..    *
b2d0: 2f 0a 20 20 20 20 69 66 28 20 70 63 3c 69 43 65  /.    if( pc<iCe
b2e0: 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63 3e 69 43  llFirst || pc>iC
b2f0: 65 6c 6c 4c 61 73 74 20 29 7b 0a 20 20 20 20 20  ellLast ){.     
b300: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
b310: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
b320: 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70   }.    assert( p
b330: 63 3e 3d 69 43 65 6c 6c 46 69 72 73 74 20 26 26  c>=iCellFirst &&
b340: 20 70 63 3c 3d 69 43 65 6c 6c 4c 61 73 74 20 29   pc<=iCellLast )
b350: 3b 0a 20 20 20 20 73 69 7a 65 20 3d 20 70 50 61  ;.    size = pPa
b360: 67 65 2d 3e 78 43 65 6c 6c 53 69 7a 65 28 70 50  ge->xCellSize(pP
b370: 61 67 65 2c 20 26 73 72 63 5b 70 63 5d 29 3b 0a  age, &src[pc]);.
b380: 20 20 20 20 63 62 72 6b 20 2d 3d 20 73 69 7a 65      cbrk -= size
b390: 3b 0a 20 20 20 20 69 66 28 20 63 62 72 6b 3c 69  ;.    if( cbrk<i
b3a0: 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63 2b  CellFirst || pc+
b3b0: 73 69 7a 65 3e 75 73 61 62 6c 65 53 69 7a 65 20  size>usableSize 
b3c0: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
b3d0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
b3e0: 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  KPT;.    }.    a
b3f0: 73 73 65 72 74 28 20 63 62 72 6b 2b 73 69 7a 65  ssert( cbrk+size
b400: 3c 3d 75 73 61 62 6c 65 53 69 7a 65 20 26 26 20  <=usableSize && 
b410: 63 62 72 6b 3e 3d 69 43 65 6c 6c 46 69 72 73 74  cbrk>=iCellFirst
b420: 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
b430: 28 20 63 62 72 6b 2b 73 69 7a 65 3d 3d 75 73 61  ( cbrk+size==usa
b440: 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 74  bleSize );.    t
b450: 65 73 74 63 61 73 65 28 20 70 63 2b 73 69 7a 65  estcase( pc+size
b460: 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a  ==usableSize );.
b470: 20 20 20 20 70 75 74 32 62 79 74 65 28 70 41 64      put2byte(pAd
b480: 64 72 2c 20 63 62 72 6b 29 3b 0a 20 20 20 20 69  dr, cbrk);.    i
b490: 66 28 20 74 65 6d 70 3d 3d 30 20 29 7b 0a 20 20  f( temp==0 ){.  
b4a0: 20 20 20 20 69 6e 74 20 78 3b 0a 20 20 20 20 20      int x;.     
b4b0: 20 69 66 28 20 63 62 72 6b 3d 3d 70 63 20 29 20   if( cbrk==pc ) 
b4c0: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
b4d0: 74 65 6d 70 20 3d 20 73 71 6c 69 74 65 33 50 61  temp = sqlite3Pa
b4e0: 67 65 72 54 65 6d 70 53 70 61 63 65 28 70 50 61  gerTempSpace(pPa
b4f0: 67 65 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 29  ge->pBt->pPager)
b500: 3b 0a 20 20 20 20 20 20 78 20 3d 20 67 65 74 32  ;.      x = get2
b510: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
b520: 5d 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79  ]);.      memcpy
b530: 28 26 74 65 6d 70 5b 78 5d 2c 20 26 64 61 74 61  (&temp[x], &data
b540: 5b 78 5d 2c 20 28 63 62 72 6b 2b 73 69 7a 65 29  [x], (cbrk+size)
b550: 20 2d 20 78 29 3b 0a 20 20 20 20 20 20 73 72 63   - x);.      src
b560: 20 3d 20 74 65 6d 70 3b 0a 20 20 20 20 7d 0a 20   = temp;.    }. 
b570: 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b     memcpy(&data[
b580: 63 62 72 6b 5d 2c 20 26 73 72 63 5b 70 63 5d 2c  cbrk], &src[pc],
b590: 20 73 69 7a 65 29 3b 0a 20 20 7d 0a 20 20 61 73   size);.  }.  as
b5a0: 73 65 72 74 28 20 63 62 72 6b 3e 3d 69 43 65 6c  sert( cbrk>=iCel
b5b0: 6c 46 69 72 73 74 20 29 3b 0a 20 20 70 75 74 32  lFirst );.  put2
b5c0: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
b5d0: 5d 2c 20 63 62 72 6b 29 3b 0a 20 20 64 61 74 61  ], cbrk);.  data
b5e0: 5b 68 64 72 2b 31 5d 20 3d 20 30 3b 0a 20 20 64  [hdr+1] = 0;.  d
b5f0: 61 74 61 5b 68 64 72 2b 32 5d 20 3d 20 30 3b 0a  ata[hdr+2] = 0;.
b600: 20 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20    data[hdr+7] = 
b610: 30 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74  0;.  memset(&dat
b620: 61 5b 69 43 65 6c 6c 46 69 72 73 74 5d 2c 20 30  a[iCellFirst], 0
b630: 2c 20 63 62 72 6b 2d 69 43 65 6c 6c 46 69 72 73  , cbrk-iCellFirs
b640: 74 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  t);.  assert( sq
b650: 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
b660: 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
b670: 50 61 67 65 29 20 29 3b 0a 20 20 69 66 28 20 63  Page) );.  if( c
b680: 62 72 6b 2d 69 43 65 6c 6c 46 69 72 73 74 21 3d  brk-iCellFirst!=
b690: 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 29 7b 0a  pPage->nFree ){.
b6a0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
b6b0: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
b6c0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
b6d0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
b6e0: 20 53 65 61 72 63 68 20 74 68 65 20 66 72 65 65   Search the free
b6f0: 2d 6c 69 73 74 20 6f 6e 20 70 61 67 65 20 70 50  -list on page pP
b700: 67 20 66 6f 72 20 73 70 61 63 65 20 74 6f 20 73  g for space to s
b710: 74 6f 72 65 20 61 20 63 65 6c 6c 20 6e 42 79 74  tore a cell nByt
b720: 65 20 62 79 74 65 73 20 69 6e 0a 2a 2a 20 73 69  e bytes in.** si
b730: 7a 65 2e 20 49 66 20 6f 6e 65 20 63 61 6e 20 62  ze. If one can b
b740: 65 20 66 6f 75 6e 64 2c 20 72 65 74 75 72 6e 20  e found, return 
b750: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
b760: 20 73 70 61 63 65 20 61 6e 64 20 72 65 6d 6f 76   space and remov
b770: 65 20 69 74 0a 2a 2a 20 66 72 6f 6d 20 74 68 65  e it.** from the
b780: 20 66 72 65 65 2d 6c 69 73 74 2e 0a 2a 2a 0a 2a   free-list..**.*
b790: 2a 20 49 66 20 6e 6f 20 73 75 69 74 61 62 6c 65  * If no suitable
b7a0: 20 73 70 61 63 65 20 63 61 6e 20 62 65 20 66 6f   space can be fo
b7b0: 75 6e 64 20 6f 6e 20 74 68 65 20 66 72 65 65 2d  und on the free-
b7c0: 6c 69 73 74 2c 20 72 65 74 75 72 6e 20 4e 55 4c  list, return NUL
b7d0: 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  L..**.** This fu
b7e0: 6e 63 74 69 6f 6e 20 6d 61 79 20 64 65 74 65 63  nction may detec
b7f0: 74 20 63 6f 72 72 75 70 74 69 6f 6e 20 77 69 74  t corruption wit
b800: 68 69 6e 20 70 50 67 2e 20 20 49 66 20 63 6f 72  hin pPg.  If cor
b810: 72 75 70 74 69 6f 6e 20 69 73 0a 2a 2a 20 64 65  ruption is.** de
b820: 74 65 63 74 65 64 20 74 68 65 6e 20 2a 70 52 63  tected then *pRc
b830: 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54   is set to SQLIT
b840: 45 5f 43 4f 52 52 55 50 54 20 61 6e 64 20 4e 55  E_CORRUPT and NU
b850: 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  LL is returned..
b860: 2a 2a 0a 2a 2a 20 53 6c 6f 74 73 20 6f 6e 20 74  **.** Slots on t
b870: 68 65 20 66 72 65 65 20 6c 69 73 74 20 74 68 61  he free list tha
b880: 74 20 61 72 65 20 62 65 74 77 65 65 6e 20 31 20  t are between 1 
b890: 61 6e 64 20 33 20 62 79 74 65 73 20 6c 61 72 67  and 3 bytes larg
b8a0: 65 72 20 74 68 61 6e 20 6e 42 79 74 65 0a 2a 2a  er than nByte.**
b8b0: 20 77 69 6c 6c 20 62 65 20 69 67 6e 6f 72 65 64   will be ignored
b8c0: 20 69 66 20 61 64 64 69 6e 67 20 74 68 65 20 65   if adding the e
b8d0: 78 74 72 61 20 73 70 61 63 65 20 74 6f 20 74 68  xtra space to th
b8e0: 65 20 66 72 61 67 6d 65 6e 74 61 74 69 6f 6e 20  e fragmentation 
b8f0: 63 6f 75 6e 74 0a 2a 2a 20 63 61 75 73 65 73 20  count.** causes 
b900: 74 68 65 20 66 72 61 67 6d 65 6e 74 61 74 69 6f  the fragmentatio
b910: 6e 20 63 6f 75 6e 74 20 74 6f 20 65 78 63 65 65  n count to excee
b920: 64 20 36 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  d 60..*/.static 
b930: 75 38 20 2a 70 61 67 65 46 69 6e 64 53 6c 6f 74  u8 *pageFindSlot
b940: 28 4d 65 6d 50 61 67 65 20 2a 70 50 67 2c 20 69  (MemPage *pPg, i
b950: 6e 74 20 6e 42 79 74 65 2c 20 69 6e 74 20 2a 70  nt nByte, int *p
b960: 52 63 29 7b 0a 20 20 63 6f 6e 73 74 20 69 6e 74  Rc){.  const int
b970: 20 68 64 72 20 3d 20 70 50 67 2d 3e 68 64 72 4f   hdr = pPg->hdrO
b980: 66 66 73 65 74 3b 0a 20 20 75 38 20 2a 20 63 6f  ffset;.  u8 * co
b990: 6e 73 74 20 61 44 61 74 61 20 3d 20 70 50 67 2d  nst aData = pPg-
b9a0: 3e 61 44 61 74 61 3b 0a 20 20 69 6e 74 20 69 41  >aData;.  int iA
b9b0: 64 64 72 20 3d 20 68 64 72 20 2b 20 31 3b 0a 20  ddr = hdr + 1;. 
b9c0: 20 69 6e 74 20 70 63 20 3d 20 67 65 74 32 62 79   int pc = get2by
b9d0: 74 65 28 26 61 44 61 74 61 5b 69 41 64 64 72 5d  te(&aData[iAddr]
b9e0: 29 3b 0a 20 20 69 6e 74 20 78 3b 0a 20 20 69 6e  );.  int x;.  in
b9f0: 74 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70  t usableSize = p
ba00: 50 67 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  Pg->pBt->usableS
ba10: 69 7a 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ize;..  assert( 
ba20: 70 63 3e 30 20 29 3b 0a 20 20 64 6f 7b 0a 20 20  pc>0 );.  do{.  
ba30: 20 20 69 6e 74 20 73 69 7a 65 3b 20 20 20 20 20    int size;     
ba40: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
ba50: 66 20 74 68 65 20 66 72 65 65 20 73 6c 6f 74 20  f the free slot 
ba60: 2a 2f 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  */.    /* EVIDEN
ba70: 43 45 2d 4f 46 3a 20 52 2d 30 36 38 36 36 2d 33  CE-OF: R-06866-3
ba80: 39 31 32 35 20 46 72 65 65 62 6c 6f 63 6b 73 20  9125 Freeblocks 
ba90: 61 72 65 20 61 6c 77 61 79 73 20 63 6f 6e 6e 65  are always conne
baa0: 63 74 65 64 20 69 6e 20 6f 72 64 65 72 20 6f 66  cted in order of
bab0: 0a 20 20 20 20 2a 2a 20 69 6e 63 72 65 61 73 69  .    ** increasi
bac0: 6e 67 20 6f 66 66 73 65 74 2e 20 2a 2f 0a 20 20  ng offset. */.  
bad0: 20 20 69 66 28 20 70 63 3e 75 73 61 62 6c 65 53    if( pc>usableS
bae0: 69 7a 65 2d 34 20 7c 7c 20 70 63 3c 69 41 64 64  ize-4 || pc<iAdd
baf0: 72 2b 34 20 29 7b 0a 20 20 20 20 20 20 2a 70 52  r+4 ){.      *pR
bb00: 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
bb10: 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 72  PT_BKPT;.      r
bb20: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20  eturn 0;.    }. 
bb30: 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
bb40: 46 3a 20 52 2d 32 32 37 31 30 2d 35 33 33 32 38  F: R-22710-53328
bb50: 20 54 68 65 20 74 68 69 72 64 20 61 6e 64 20 66   The third and f
bb60: 6f 75 72 74 68 20 62 79 74 65 73 20 6f 66 20 65  ourth bytes of e
bb70: 61 63 68 0a 20 20 20 20 2a 2a 20 66 72 65 65 62  ach.    ** freeb
bb80: 6c 6f 63 6b 20 66 6f 72 6d 20 61 20 62 69 67 2d  lock form a big-
bb90: 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77  endian integer w
bba0: 68 69 63 68 20 69 73 20 74 68 65 20 73 69 7a 65  hich is the size
bbb0: 20 6f 66 20 74 68 65 20 66 72 65 65 62 6c 6f 63   of the freebloc
bbc0: 6b 0a 20 20 20 20 2a 2a 20 69 6e 20 62 79 74 65  k.    ** in byte
bbd0: 73 2c 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65  s, including the
bbe0: 20 34 2d 62 79 74 65 20 68 65 61 64 65 72 2e 20   4-byte header. 
bbf0: 2a 2f 0a 20 20 20 20 73 69 7a 65 20 3d 20 67 65  */.    size = ge
bc00: 74 32 62 79 74 65 28 26 61 44 61 74 61 5b 70 63  t2byte(&aData[pc
bc10: 2b 32 5d 29 3b 0a 20 20 20 20 69 66 28 20 28 78  +2]);.    if( (x
bc20: 20 3d 20 73 69 7a 65 20 2d 20 6e 42 79 74 65 29   = size - nByte)
bc30: 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 74 65 73  >=0 ){.      tes
bc40: 74 63 61 73 65 28 20 78 3d 3d 34 20 29 3b 0a 20  tcase( x==4 );. 
bc50: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 78       testcase( x
bc60: 3d 3d 33 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ==3 );.      if(
bc70: 20 70 63 20 3c 20 70 50 67 2d 3e 63 65 6c 6c 4f   pc < pPg->cellO
bc80: 66 66 73 65 74 2b 32 2a 70 50 67 2d 3e 6e 43 65  ffset+2*pPg->nCe
bc90: 6c 6c 20 7c 7c 20 73 69 7a 65 2b 70 63 20 3e 20  ll || size+pc > 
bca0: 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20  usableSize ){.  
bcb0: 20 20 20 20 20 20 2a 70 52 63 20 3d 20 53 51 4c        *pRc = SQL
bcc0: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
bcd0: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
bce0: 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20   0;.      }else 
bcf0: 69 66 28 20 78 3c 34 20 29 7b 0a 20 20 20 20 20  if( x<4 ){.     
bd00: 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
bd10: 46 3a 20 52 2d 31 31 34 39 38 2d 35 38 30 32 32  F: R-11498-58022
bd20: 20 49 6e 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65   In a well-forme
bd30: 64 20 62 2d 74 72 65 65 20 70 61 67 65 2c 20 74  d b-tree page, t
bd40: 68 65 20 74 6f 74 61 6c 0a 20 20 20 20 20 20 20  he total.       
bd50: 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 62 79   ** number of by
bd60: 74 65 73 20 69 6e 20 66 72 61 67 6d 65 6e 74 73  tes in fragments
bd70: 20 6d 61 79 20 6e 6f 74 20 65 78 63 65 65 64 20   may not exceed 
bd80: 36 30 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  60. */.        i
bd90: 66 28 20 61 44 61 74 61 5b 68 64 72 2b 37 5d 3e  f( aData[hdr+7]>
bda0: 35 37 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a  57 ) return 0;..
bdb0: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76          /* Remov
bdc0: 65 20 74 68 65 20 73 6c 6f 74 20 66 72 6f 6d 20  e the slot from 
bdd0: 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 20 55  the free-list. U
bde0: 70 64 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72  pdate the number
bdf0: 20 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 66   of.        ** f
be00: 72 61 67 6d 65 6e 74 65 64 20 62 79 74 65 73 20  ragmented bytes 
be10: 77 69 74 68 69 6e 20 74 68 65 20 70 61 67 65 2e  within the page.
be20: 20 2a 2f 0a 20 20 20 20 20 20 20 20 6d 65 6d 63   */.        memc
be30: 70 79 28 26 61 44 61 74 61 5b 69 41 64 64 72 5d  py(&aData[iAddr]
be40: 2c 20 26 61 44 61 74 61 5b 70 63 5d 2c 20 32 29  , &aData[pc], 2)
be50: 3b 0a 20 20 20 20 20 20 20 20 61 44 61 74 61 5b  ;.        aData[
be60: 68 64 72 2b 37 5d 20 2b 3d 20 28 75 38 29 78 3b  hdr+7] += (u8)x;
be70: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
be80: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 6c 6f        /* The slo
be90: 74 20 72 65 6d 61 69 6e 73 20 6f 6e 20 74 68 65  t remains on the
bea0: 20 66 72 65 65 2d 6c 69 73 74 2e 20 52 65 64 75   free-list. Redu
beb0: 63 65 20 69 74 73 20 73 69 7a 65 20 74 6f 20 61  ce its size to a
bec0: 63 63 6f 75 6e 74 0a 20 20 20 20 20 20 20 20 20  ccount.         
bed0: 2a 2a 20 66 6f 72 20 74 68 65 20 70 6f 72 74 69  ** for the porti
bee0: 6f 6e 20 75 73 65 64 20 62 79 20 74 68 65 20 6e  on used by the n
bef0: 65 77 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 2a  ew allocation. *
bf00: 2f 0a 20 20 20 20 20 20 20 20 70 75 74 32 62 79  /.        put2by
bf10: 74 65 28 26 61 44 61 74 61 5b 70 63 2b 32 5d 2c  te(&aData[pc+2],
bf20: 20 78 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   x);.      }.   
bf30: 20 20 20 72 65 74 75 72 6e 20 26 61 44 61 74 61     return &aData
bf40: 5b 70 63 20 2b 20 78 5d 3b 0a 20 20 20 20 7d 0a  [pc + x];.    }.
bf50: 20 20 20 20 69 41 64 64 72 20 3d 20 70 63 3b 0a      iAddr = pc;.
bf60: 20 20 20 20 70 63 20 3d 20 67 65 74 32 62 79 74      pc = get2byt
bf70: 65 28 26 61 44 61 74 61 5b 70 63 5d 29 3b 0a 20  e(&aData[pc]);. 
bf80: 20 7d 77 68 69 6c 65 28 20 70 63 20 29 3b 0a 0a   }while( pc );..
bf90: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
bfa0: 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6e 42  *.** Allocate nB
bfb0: 79 74 65 20 62 79 74 65 73 20 6f 66 20 73 70 61  yte bytes of spa
bfc0: 63 65 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 74  ce from within t
bfd0: 68 65 20 42 2d 54 72 65 65 20 70 61 67 65 20 70  he B-Tree page p
bfe0: 61 73 73 65 64 0a 2a 2a 20 61 73 20 74 68 65 20  assed.** as the 
bff0: 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 20  first argument. 
c000: 57 72 69 74 65 20 69 6e 74 6f 20 2a 70 49 64 78  Write into *pIdx
c010: 20 74 68 65 20 69 6e 64 65 78 20 69 6e 74 6f 20   the index into 
c020: 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 5d 0a 2a  pPage->aData[].*
c030: 2a 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 62  * of the first b
c040: 79 74 65 20 6f 66 20 61 6c 6c 6f 63 61 74 65 64  yte of allocated
c050: 20 73 70 61 63 65 2e 20 52 65 74 75 72 6e 20 65   space. Return e
c060: 69 74 68 65 72 20 53 51 4c 49 54 45 5f 4f 4b 20  ither SQLITE_OK 
c070: 6f 72 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 63  or.** an error c
c080: 6f 64 65 20 28 75 73 75 61 6c 6c 79 20 53 51 4c  ode (usually SQL
c090: 49 54 45 5f 43 4f 52 52 55 50 54 29 2e 0a 2a 2a  ITE_CORRUPT)..**
c0a0: 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 67  .** The caller g
c0b0: 75 61 72 61 6e 74 65 65 73 20 74 68 61 74 20 74  uarantees that t
c0c0: 68 65 72 65 20 69 73 20 73 75 66 66 69 63 69 65  here is sufficie
c0d0: 6e 74 20 73 70 61 63 65 20 74 6f 20 6d 61 6b 65  nt space to make
c0e0: 20 74 68 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69   the.** allocati
c0f0: 6f 6e 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  on.  This routin
c100: 65 20 6d 69 67 68 74 20 6e 65 65 64 20 74 6f 20  e might need to 
c110: 64 65 66 72 61 67 6d 65 6e 74 20 69 6e 20 6f 72  defragment in or
c120: 64 65 72 20 74 6f 20 62 72 69 6e 67 0a 2a 2a 20  der to bring.** 
c130: 61 6c 6c 20 74 68 65 20 73 70 61 63 65 20 74 6f  all the space to
c140: 67 65 74 68 65 72 2c 20 68 6f 77 65 76 65 72 2e  gether, however.
c150: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77    This routine w
c160: 69 6c 6c 20 61 76 6f 69 64 20 75 73 69 6e 67 0a  ill avoid using.
c170: 2a 2a 20 74 68 65 20 66 69 72 73 74 20 74 77 6f  ** the first two
c180: 20 62 79 74 65 73 20 70 61 73 74 20 74 68 65 20   bytes past the 
c190: 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 65  cell pointer are
c1a0: 61 20 73 69 6e 63 65 20 70 72 65 73 75 6d 61 62  a since presumab
c1b0: 6c 79 20 74 68 69 73 0a 2a 2a 20 61 6c 6c 6f 63  ly this.** alloc
c1c0: 61 74 69 6f 6e 20 69 73 20 62 65 69 6e 67 20 6d  ation is being m
c1d0: 61 64 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ade in order to 
c1e0: 69 6e 73 65 72 74 20 61 20 6e 65 77 20 63 65 6c  insert a new cel
c1f0: 6c 2c 20 73 6f 20 77 65 20 77 69 6c 6c 0a 2a 2a  l, so we will.**
c200: 20 61 6c 73 6f 20 65 6e 64 20 75 70 20 6e 65 65   also end up nee
c210: 64 69 6e 67 20 61 20 6e 65 77 20 63 65 6c 6c 20  ding a new cell 
c220: 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74 61 74  pointer..*/.stat
c230: 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 53  ic int allocateS
c240: 70 61 63 65 28 4d 65 6d 50 61 67 65 20 2a 70 50  pace(MemPage *pP
c250: 61 67 65 2c 20 69 6e 74 20 6e 42 79 74 65 2c 20  age, int nByte, 
c260: 69 6e 74 20 2a 70 49 64 78 29 7b 0a 20 20 63 6f  int *pIdx){.  co
c270: 6e 73 74 20 69 6e 74 20 68 64 72 20 3d 20 70 50  nst int hdr = pP
c280: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 20  age->hdrOffset; 
c290: 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68     /* Local cach
c2a0: 65 20 6f 66 20 70 50 61 67 65 2d 3e 68 64 72 4f  e of pPage->hdrO
c2b0: 66 66 73 65 74 20 2a 2f 0a 20 20 75 38 20 2a 20  ffset */.  u8 * 
c2c0: 63 6f 6e 73 74 20 64 61 74 61 20 3d 20 70 50 61  const data = pPa
c2d0: 67 65 2d 3e 61 44 61 74 61 3b 20 20 20 20 20 20  ge->aData;      
c2e0: 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f  /* Local cache o
c2f0: 66 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 2a  f pPage->aData *
c300: 2f 0a 20 20 69 6e 74 20 74 6f 70 3b 20 20 20 20  /.  int top;    
c310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c320: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
c330: 74 20 62 79 74 65 20 6f 66 20 63 65 6c 6c 20 63  t byte of cell c
c340: 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20  ontent area */. 
c350: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
c360: 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
c370: 20 20 20 20 20 20 2f 2a 20 49 6e 74 65 67 65 72        /* Integer
c380: 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   return code */.
c390: 20 20 69 6e 74 20 67 61 70 3b 20 20 20 20 20 20    int gap;      
c3a0: 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20    /* First byte 
c3b0: 6f 66 20 67 61 70 20 62 65 74 77 65 65 6e 20 63  of gap between c
c3c0: 65 6c 6c 20 70 6f 69 6e 74 65 72 73 20 61 6e 64  ell pointers and
c3d0: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 2a 2f   cell content */
c3e0: 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20 73 71  .  .  assert( sq
c3f0: 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
c400: 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
c410: 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72  Page) );.  asser
c420: 74 28 20 70 50 61 67 65 2d 3e 70 42 74 20 29 3b  t( pPage->pBt );
c430: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
c440: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
c450: 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
c460: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 42   );.  assert( nB
c470: 79 74 65 3e 3d 30 20 29 3b 20 20 2f 2a 20 4d 69  yte>=0 );  /* Mi
c480: 6e 69 6d 75 6d 20 63 65 6c 6c 20 73 69 7a 65 20  nimum cell size 
c490: 69 73 20 34 20 2a 2f 0a 20 20 61 73 73 65 72 74  is 4 */.  assert
c4a0: 28 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 3e 3d  ( pPage->nFree>=
c4b0: 6e 42 79 74 65 20 29 3b 0a 20 20 61 73 73 65 72  nByte );.  asser
c4c0: 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  t( pPage->nOverf
c4d0: 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  low==0 );.  asse
c4e0: 72 74 28 20 6e 42 79 74 65 20 3c 20 28 69 6e 74  rt( nByte < (int
c4f0: 29 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  )(pPage->pBt->us
c500: 61 62 6c 65 53 69 7a 65 2d 38 29 20 29 3b 0a 0a  ableSize-8) );..
c510: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
c520: 3e 63 65 6c 6c 4f 66 66 73 65 74 20 3d 3d 20 68  >cellOffset == h
c530: 64 72 20 2b 20 31 32 20 2d 20 34 2a 70 50 61 67  dr + 12 - 4*pPag
c540: 65 2d 3e 6c 65 61 66 20 29 3b 0a 20 20 67 61 70  e->leaf );.  gap
c550: 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66   = pPage->cellOf
c560: 66 73 65 74 20 2b 20 32 2a 70 50 61 67 65 2d 3e  fset + 2*pPage->
c570: 6e 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28  nCell;.  assert(
c580: 20 67 61 70 3c 3d 36 35 35 33 36 20 29 3b 0a 20   gap<=65536 );. 
c590: 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
c5a0: 20 52 2d 32 39 33 35 36 2d 30 32 33 39 31 20 49   R-29356-02391 I
c5b0: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 75  f the database u
c5c0: 73 65 73 20 61 20 36 35 35 33 36 2d 62 79 74 65  ses a 65536-byte
c5d0: 20 70 61 67 65 20 73 69 7a 65 0a 20 20 2a 2a 20   page size.  ** 
c5e0: 61 6e 64 20 74 68 65 20 72 65 73 65 72 76 65 64  and the reserved
c5f0: 20 73 70 61 63 65 20 69 73 20 7a 65 72 6f 20 28   space is zero (
c600: 74 68 65 20 75 73 75 61 6c 20 76 61 6c 75 65 20  the usual value 
c610: 66 6f 72 20 72 65 73 65 72 76 65 64 20 73 70 61  for reserved spa
c620: 63 65 29 0a 20 20 2a 2a 20 74 68 65 6e 20 74 68  ce).  ** then th
c630: 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 6f  e cell content o
c640: 66 66 73 65 74 20 6f 66 20 61 6e 20 65 6d 70 74  ffset of an empt
c650: 79 20 70 61 67 65 20 77 61 6e 74 73 20 74 6f 20  y page wants to 
c660: 62 65 20 36 35 35 33 36 2e 0a 20 20 2a 2a 20 48  be 65536..  ** H
c670: 6f 77 65 76 65 72 2c 20 74 68 61 74 20 69 6e 74  owever, that int
c680: 65 67 65 72 20 69 73 20 74 6f 6f 20 6c 61 72 67  eger is too larg
c690: 65 20 74 6f 20 62 65 20 73 74 6f 72 65 64 20 69  e to be stored i
c6a0: 6e 20 61 20 32 2d 62 79 74 65 20 75 6e 73 69 67  n a 2-byte unsig
c6b0: 6e 65 64 0a 20 20 2a 2a 20 69 6e 74 65 67 65 72  ned.  ** integer
c6c0: 2c 20 73 6f 20 61 20 76 61 6c 75 65 20 6f 66 20  , so a value of 
c6d0: 30 20 69 73 20 75 73 65 64 20 69 6e 20 69 74 73  0 is used in its
c6e0: 20 70 6c 61 63 65 2e 20 2a 2f 0a 20 20 74 6f 70   place. */.  top
c6f0: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
c700: 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 61 73 73  a[hdr+5]);.  ass
c710: 65 72 74 28 20 74 6f 70 3c 3d 28 69 6e 74 29 70  ert( top<=(int)p
c720: 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
c730: 65 53 69 7a 65 20 29 3b 20 2f 2a 20 50 72 65 76  eSize ); /* Prev
c740: 65 6e 74 20 62 79 20 67 65 74 41 6e 64 49 6e 69  ent by getAndIni
c750: 74 50 61 67 65 28 29 20 2a 2f 0a 20 20 69 66 28  tPage() */.  if(
c760: 20 67 61 70 3e 74 6f 70 20 29 7b 0a 20 20 20 20   gap>top ){.    
c770: 69 66 28 20 74 6f 70 3d 3d 30 20 26 26 20 70 50  if( top==0 && pP
c780: 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
c790: 53 69 7a 65 3d 3d 36 35 35 33 36 20 29 7b 0a 20  Size==65536 ){. 
c7a0: 20 20 20 20 20 74 6f 70 20 3d 20 36 35 35 33 36       top = 65536
c7b0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
c7c0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
c7d0: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
c7e0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49     }.  }..  /* I
c7f0: 66 20 74 68 65 72 65 20 69 73 20 65 6e 6f 75 67  f there is enoug
c800: 68 20 73 70 61 63 65 20 62 65 74 77 65 65 6e 20  h space between 
c810: 67 61 70 20 61 6e 64 20 74 6f 70 20 66 6f 72 20  gap and top for 
c820: 6f 6e 65 20 6d 6f 72 65 20 63 65 6c 6c 20 70 6f  one more cell po
c830: 69 6e 74 65 72 0a 20 20 2a 2a 20 61 72 72 61 79  inter.  ** array
c840: 20 65 6e 74 72 79 20 6f 66 66 73 65 74 2c 20 61   entry offset, a
c850: 6e 64 20 69 66 20 74 68 65 20 66 72 65 65 6c 69  nd if the freeli
c860: 73 74 20 69 73 20 6e 6f 74 20 65 6d 70 74 79 2c  st is not empty,
c870: 20 74 68 65 6e 20 73 65 61 72 63 68 20 74 68 65   then search the
c880: 0a 20 20 2a 2a 20 66 72 65 65 6c 69 73 74 20 6c  .  ** freelist l
c890: 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 20 66 72 65  ooking for a fre
c8a0: 65 20 73 6c 6f 74 20 62 69 67 20 65 6e 6f 75 67  e slot big enoug
c8b0: 68 20 74 6f 20 73 61 74 69 73 66 79 20 74 68 65  h to satisfy the
c8c0: 20 72 65 71 75 65 73 74 2e 0a 20 20 2a 2f 0a 20   request..  */. 
c8d0: 20 74 65 73 74 63 61 73 65 28 20 67 61 70 2b 32   testcase( gap+2
c8e0: 3d 3d 74 6f 70 20 29 3b 0a 20 20 74 65 73 74 63  ==top );.  testc
c8f0: 61 73 65 28 20 67 61 70 2b 31 3d 3d 74 6f 70 20  ase( gap+1==top 
c900: 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 67  );.  testcase( g
c910: 61 70 3d 3d 74 6f 70 20 29 3b 0a 20 20 69 66 28  ap==top );.  if(
c920: 20 28 64 61 74 61 5b 68 64 72 2b 32 5d 20 7c 7c   (data[hdr+2] ||
c930: 20 64 61 74 61 5b 68 64 72 2b 31 5d 29 20 26 26   data[hdr+1]) &&
c940: 20 67 61 70 2b 32 3c 3d 74 6f 70 20 29 7b 0a 20   gap+2<=top ){. 
c950: 20 20 20 75 38 20 2a 70 53 70 61 63 65 20 3d 20     u8 *pSpace = 
c960: 70 61 67 65 46 69 6e 64 53 6c 6f 74 28 70 50 61  pageFindSlot(pPa
c970: 67 65 2c 20 6e 42 79 74 65 2c 20 26 72 63 29 3b  ge, nByte, &rc);
c980: 0a 20 20 20 20 69 66 28 20 70 53 70 61 63 65 20  .    if( pSpace 
c990: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
c9a0: 20 70 53 70 61 63 65 3e 3d 64 61 74 61 20 26 26   pSpace>=data &&
c9b0: 20 28 70 53 70 61 63 65 20 2d 20 64 61 74 61 29   (pSpace - data)
c9c0: 3c 36 35 35 33 36 20 29 3b 0a 20 20 20 20 20 20  <65536 );.      
c9d0: 2a 70 49 64 78 20 3d 20 28 69 6e 74 29 28 70 53  *pIdx = (int)(pS
c9e0: 70 61 63 65 20 2d 20 64 61 74 61 29 3b 0a 20 20  pace - data);.  
c9f0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
ca00: 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 20  E_OK;.    }else 
ca10: 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
ca20: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
ca30: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 72  .  }..  /* The r
ca40: 65 71 75 65 73 74 20 63 6f 75 6c 64 20 6e 6f 74  equest could not
ca50: 20 62 65 20 66 75 6c 66 69 6c 6c 65 64 20 75 73   be fulfilled us
ca60: 69 6e 67 20 61 20 66 72 65 65 6c 69 73 74 20 73  ing a freelist s
ca70: 6c 6f 74 2e 20 20 43 68 65 63 6b 0a 20 20 2a 2a  lot.  Check.  **
ca80: 20 74 6f 20 73 65 65 20 69 66 20 64 65 66 72 61   to see if defra
ca90: 67 6d 65 6e 74 61 74 69 6f 6e 20 69 73 20 6e 65  gmentation is ne
caa0: 63 65 73 73 61 72 79 2e 0a 20 20 2a 2f 0a 20 20  cessary..  */.  
cab0: 74 65 73 74 63 61 73 65 28 20 67 61 70 2b 32 2b  testcase( gap+2+
cac0: 6e 42 79 74 65 3d 3d 74 6f 70 20 29 3b 0a 20 20  nByte==top );.  
cad0: 69 66 28 20 67 61 70 2b 32 2b 6e 42 79 74 65 3e  if( gap+2+nByte>
cae0: 74 6f 70 20 29 7b 0a 20 20 20 20 61 73 73 65 72  top ){.    asser
caf0: 74 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e  t( pPage->nCell>
cb00: 30 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20  0 || CORRUPT_DB 
cb10: 29 3b 0a 20 20 20 20 72 63 20 3d 20 64 65 66 72  );.    rc = defr
cb20: 61 67 6d 65 6e 74 50 61 67 65 28 70 50 61 67 65  agmentPage(pPage
cb30: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
cb40: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 74  return rc;.    t
cb50: 6f 70 20 3d 20 67 65 74 32 62 79 74 65 4e 6f 74  op = get2byteNot
cb60: 5a 65 72 6f 28 26 64 61 74 61 5b 68 64 72 2b 35  Zero(&data[hdr+5
cb70: 5d 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ]);.    assert( 
cb80: 67 61 70 2b 6e 42 79 74 65 3c 3d 74 6f 70 20 29  gap+nByte<=top )
cb90: 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 41 6c 6c  ;.  }...  /* All
cba0: 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20 66 72 6f  ocate memory fro
cbb0: 6d 20 74 68 65 20 67 61 70 20 69 6e 20 62 65 74  m the gap in bet
cbc0: 77 65 65 6e 20 74 68 65 20 63 65 6c 6c 20 70 6f  ween the cell po
cbd0: 69 6e 74 65 72 20 61 72 72 61 79 0a 20 20 2a 2a  inter array.  **
cbe0: 20 61 6e 64 20 74 68 65 20 63 65 6c 6c 20 63 6f   and the cell co
cbf0: 6e 74 65 6e 74 20 61 72 65 61 2e 20 20 54 68 65  ntent area.  The
cc00: 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29   btreeInitPage()
cc10: 20 63 61 6c 6c 20 68 61 73 20 61 6c 72 65 61 64   call has alread
cc20: 79 0a 20 20 2a 2a 20 76 61 6c 69 64 61 74 65 64  y.  ** validated
cc30: 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20 20   the freelist.  
cc40: 47 69 76 65 6e 20 74 68 61 74 20 74 68 65 20 66  Given that the f
cc50: 72 65 65 6c 69 73 74 20 69 73 20 76 61 6c 69 64  reelist is valid
cc60: 2c 20 74 68 65 72 65 0a 20 20 2a 2a 20 69 73 20  , there.  ** is 
cc70: 6e 6f 20 77 61 79 20 74 68 61 74 20 74 68 65 20  no way that the 
cc80: 61 6c 6c 6f 63 61 74 69 6f 6e 20 63 61 6e 20 65  allocation can e
cc90: 78 74 65 6e 64 20 6f 66 66 20 74 68 65 20 65 6e  xtend off the en
cca0: 64 20 6f 66 20 74 68 65 20 70 61 67 65 2e 0a 20  d of the page.. 
ccb0: 20 2a 2a 20 54 68 65 20 61 73 73 65 72 74 28 29   ** The assert()
ccc0: 20 62 65 6c 6f 77 20 76 65 72 69 66 69 65 73 20   below verifies 
ccd0: 74 68 65 20 70 72 65 76 69 6f 75 73 20 73 65 6e  the previous sen
cce0: 74 65 6e 63 65 2e 0a 20 20 2a 2f 0a 20 20 74 6f  tence..  */.  to
ccf0: 70 20 2d 3d 20 6e 42 79 74 65 3b 0a 20 20 70 75  p -= nByte;.  pu
cd00: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
cd10: 2b 35 5d 2c 20 74 6f 70 29 3b 0a 20 20 61 73 73  +5], top);.  ass
cd20: 65 72 74 28 20 74 6f 70 2b 6e 42 79 74 65 20 3c  ert( top+nByte <
cd30: 3d 20 28 69 6e 74 29 70 50 61 67 65 2d 3e 70 42  = (int)pPage->pB
cd40: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b  t->usableSize );
cd50: 0a 20 20 2a 70 49 64 78 20 3d 20 74 6f 70 3b 0a  .  *pIdx = top;.
cd60: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
cd70: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  OK;.}../*.** Ret
cd80: 75 72 6e 20 61 20 73 65 63 74 69 6f 6e 20 6f 66  urn a section of
cd90: 20 74 68 65 20 70 50 61 67 65 2d 3e 61 44 61 74   the pPage->aDat
cda0: 61 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73  a to the freelis
cdb0: 74 2e 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20  t..** The first 
cdc0: 62 79 74 65 20 6f 66 20 74 68 65 20 6e 65 77 20  byte of the new 
cdd0: 66 72 65 65 20 62 6c 6f 63 6b 20 69 73 20 70 50  free block is pP
cde0: 61 67 65 2d 3e 61 44 61 74 61 5b 69 53 74 61 72  age->aData[iStar
cdf0: 74 5d 0a 2a 2a 20 61 6e 64 20 74 68 65 20 73 69  t].** and the si
ce00: 7a 65 20 6f 66 20 74 68 65 20 62 6c 6f 63 6b 20  ze of the block 
ce10: 69 73 20 69 53 69 7a 65 20 62 79 74 65 73 2e 0a  is iSize bytes..
ce20: 2a 2a 0a 2a 2a 20 41 64 6a 61 63 65 6e 74 20 66  **.** Adjacent f
ce30: 72 65 65 62 6c 6f 63 6b 73 20 61 72 65 20 63 6f  reeblocks are co
ce40: 61 6c 65 73 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 4e  alesced..**.** N
ce50: 6f 74 65 20 74 68 61 74 20 65 76 65 6e 20 74 68  ote that even th
ce60: 6f 75 67 68 20 74 68 65 20 66 72 65 65 62 6c 6f  ough the freeblo
ce70: 63 6b 20 6c 69 73 74 20 77 61 73 20 63 68 65 63  ck list was chec
ce80: 6b 65 64 20 62 79 20 62 74 72 65 65 49 6e 69 74  ked by btreeInit
ce90: 50 61 67 65 28 29 2c 0a 2a 2a 20 74 68 61 74 20  Page(),.** that 
cea0: 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6e 6f 74  routine will not
ceb0: 20 64 65 74 65 63 74 20 6f 76 65 72 6c 61 70 20   detect overlap 
cec0: 62 65 74 77 65 65 6e 20 63 65 6c 6c 73 20 6f 72  between cells or
ced0: 20 66 72 65 65 62 6c 6f 63 6b 73 2e 20 20 4e 6f   freeblocks.  No
cee0: 72 0a 2a 2a 20 64 6f 65 73 20 69 74 20 64 65 74  r.** does it det
cef0: 65 63 74 20 63 65 6c 6c 73 20 6f 72 20 66 72 65  ect cells or fre
cf00: 65 62 6c 6f 63 6b 73 20 74 68 61 74 20 65 6e 63  eblocks that enc
cf10: 72 6f 75 63 68 20 69 6e 74 6f 20 74 68 65 20 72  rouch into the r
cf20: 65 73 65 72 76 65 64 20 62 79 74 65 73 0a 2a 2a  eserved bytes.**
cf30: 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
cf40: 68 65 20 70 61 67 65 2e 20 20 53 6f 20 64 6f 20  he page.  So do 
cf50: 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f 72 72 75  additional corru
cf60: 70 74 69 6f 6e 20 63 68 65 63 6b 73 20 69 6e 73  ption checks ins
cf70: 69 64 65 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74  ide this.** rout
cf80: 69 6e 65 20 61 6e 64 20 72 65 74 75 72 6e 20 53  ine and return S
cf90: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69 66  QLITE_CORRUPT if
cfa0: 20 61 6e 79 20 70 72 6f 62 6c 65 6d 73 20 61 72   any problems ar
cfb0: 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74  e found..*/.stat
cfc0: 69 63 20 69 6e 74 20 66 72 65 65 53 70 61 63 65  ic int freeSpace
cfd0: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
cfe0: 20 75 31 36 20 69 53 74 61 72 74 2c 20 75 31 36   u16 iStart, u16
cff0: 20 69 53 69 7a 65 29 7b 0a 20 20 75 31 36 20 69   iSize){.  u16 i
d000: 50 74 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  Ptr;            
d010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d020: 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 70   /* Address of p
d030: 74 72 20 74 6f 20 6e 65 78 74 20 66 72 65 65 62  tr to next freeb
d040: 6c 6f 63 6b 20 2a 2f 0a 20 20 75 31 36 20 69 46  lock */.  u16 iF
d050: 72 65 65 42 6c 6b 3b 20 20 20 20 20 20 20 20 20  reeBlk;         
d060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d070: 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68  /* Address of th
d080: 65 20 6e 65 78 74 20 66 72 65 65 62 6c 6f 63 6b  e next freeblock
d090: 20 2a 2f 0a 20 20 75 38 20 68 64 72 3b 20 20 20   */.  u8 hdr;   
d0a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d0b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
d0c0: 61 67 65 20 68 65 61 64 65 72 20 73 69 7a 65 2e  age header size.
d0d0: 20 20 30 20 6f 72 20 31 30 30 20 2a 2f 0a 20 20    0 or 100 */.  
d0e0: 75 38 20 6e 46 72 61 67 20 3d 20 30 3b 20 20 20  u8 nFrag = 0;   
d0f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d100: 20 20 20 20 20 20 2f 2a 20 52 65 64 75 63 74 69        /* Reducti
d110: 6f 6e 20 69 6e 20 66 72 61 67 6d 65 6e 74 61 74  on in fragmentat
d120: 69 6f 6e 20 2a 2f 0a 20 20 75 31 36 20 69 4f 72  ion */.  u16 iOr
d130: 69 67 53 69 7a 65 20 3d 20 69 53 69 7a 65 3b 20  igSize = iSize; 
d140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
d150: 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75 65  * Original value
d160: 20 6f 66 20 69 53 69 7a 65 20 2a 2f 0a 20 20 75   of iSize */.  u
d170: 33 32 20 69 4c 61 73 74 20 3d 20 70 50 61 67 65  32 iLast = pPage
d180: 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
d190: 65 2d 34 3b 20 2f 2a 20 4c 61 72 67 65 73 74 20  e-4; /* Largest 
d1a0: 70 6f 73 73 69 62 6c 65 20 66 72 65 65 62 6c 6f  possible freeblo
d1b0: 63 6b 20 6f 66 66 73 65 74 20 2a 2f 0a 20 20 75  ck offset */.  u
d1c0: 33 32 20 69 45 6e 64 20 3d 20 69 53 74 61 72 74  32 iEnd = iStart
d1d0: 20 2b 20 69 53 69 7a 65 3b 20 20 20 20 20 20 20   + iSize;       
d1e0: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79       /* First by
d1f0: 74 65 20 70 61 73 74 20 74 68 65 20 69 53 74 61  te past the iSta
d200: 72 74 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 75  rt buffer */.  u
d210: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61  nsigned char *da
d220: 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74  ta = pPage->aDat
d230: 61 3b 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e  a;   /* Page con
d240: 74 65 6e 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72  tent */..  asser
d250: 74 28 20 70 50 61 67 65 2d 3e 70 42 74 21 3d 30  t( pPage->pBt!=0
d260: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
d270: 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
d280: 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
d290: 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72  Page) );.  asser
d2a0: 74 28 20 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c  t( CORRUPT_DB ||
d2b0: 20 69 53 74 61 72 74 3e 3d 70 50 61 67 65 2d 3e   iStart>=pPage->
d2c0: 68 64 72 4f 66 66 73 65 74 2b 36 2b 70 50 61 67  hdrOffset+6+pPag
d2d0: 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 20  e->childPtrSize 
d2e0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43 4f 52  );.  assert( COR
d2f0: 52 55 50 54 5f 44 42 20 7c 7c 20 69 45 6e 64 20  RUPT_DB || iEnd 
d300: 3c 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75  <= pPage->pBt->u
d310: 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 61  sableSize );.  a
d320: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
d330: 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
d340: 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
d350: 20 20 61 73 73 65 72 74 28 20 69 53 69 7a 65 3e    assert( iSize>
d360: 3d 34 20 29 3b 20 20 20 2f 2a 20 4d 69 6e 69 6d  =4 );   /* Minim
d370: 75 6d 20 63 65 6c 6c 20 73 69 7a 65 20 69 73 20  um cell size is 
d380: 34 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69  4 */.  assert( i
d390: 53 74 61 72 74 3c 3d 69 4c 61 73 74 20 29 3b 0a  Start<=iLast );.
d3a0: 0a 20 20 2f 2a 20 4f 76 65 72 77 72 69 74 65 20  .  /* Overwrite 
d3b0: 64 65 6c 65 74 65 64 20 69 6e 66 6f 72 6d 61 74  deleted informat
d3c0: 69 6f 6e 20 77 69 74 68 20 7a 65 72 6f 73 20 77  ion with zeros w
d3d0: 68 65 6e 20 74 68 65 20 73 65 63 75 72 65 5f 64  hen the secure_d
d3e0: 65 6c 65 74 65 0a 20 20 2a 2a 20 6f 70 74 69 6f  elete.  ** optio
d3f0: 6e 20 69 73 20 65 6e 61 62 6c 65 64 20 2a 2f 0a  n is enabled */.
d400: 20 20 69 66 28 20 70 50 61 67 65 2d 3e 70 42 74    if( pPage->pBt
d410: 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53  ->btsFlags & BTS
d420: 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 20 29  _SECURE_DELETE )
d430: 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 64 61  {.    memset(&da
d440: 74 61 5b 69 53 74 61 72 74 5d 2c 20 30 2c 20 69  ta[iStart], 0, i
d450: 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Size);.  }..  /*
d460: 20 54 68 65 20 6c 69 73 74 20 6f 66 20 66 72 65   The list of fre
d470: 65 62 6c 6f 63 6b 73 20 6d 75 73 74 20 62 65 20  eblocks must be 
d480: 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64  in ascending ord
d490: 65 72 2e 20 20 46 69 6e 64 20 74 68 65 20 0a 20  er.  Find the . 
d4a0: 20 2a 2a 20 73 70 6f 74 20 6f 6e 20 74 68 65 20   ** spot on the 
d4b0: 6c 69 73 74 20 77 68 65 72 65 20 69 53 74 61 72  list where iStar
d4c0: 74 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 73 65  t should be inse
d4d0: 72 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 68 64 72  rted..  */.  hdr
d4e0: 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66   = pPage->hdrOff
d4f0: 73 65 74 3b 0a 20 20 69 50 74 72 20 3d 20 68 64  set;.  iPtr = hd
d500: 72 20 2b 20 31 3b 0a 20 20 69 66 28 20 64 61 74  r + 1;.  if( dat
d510: 61 5b 69 50 74 72 2b 31 5d 3d 3d 30 20 26 26 20  a[iPtr+1]==0 && 
d520: 64 61 74 61 5b 69 50 74 72 5d 3d 3d 30 20 29 7b  data[iPtr]==0 ){
d530: 0a 20 20 20 20 69 46 72 65 65 42 6c 6b 20 3d 20  .    iFreeBlk = 
d540: 30 3b 20 20 2f 2a 20 53 68 6f 72 74 63 75 74 20  0;  /* Shortcut 
d550: 66 6f 72 20 74 68 65 20 63 61 73 65 20 77 68 65  for the case whe
d560: 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 69  n the freelist i
d570: 73 20 65 6d 70 74 79 20 2a 2f 0a 20 20 7d 65 6c  s empty */.  }el
d580: 73 65 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 28  se{.    while( (
d590: 69 46 72 65 65 42 6c 6b 20 3d 20 67 65 74 32 62  iFreeBlk = get2b
d5a0: 79 74 65 28 26 64 61 74 61 5b 69 50 74 72 5d 29  yte(&data[iPtr])
d5b0: 29 3e 30 20 26 26 20 69 46 72 65 65 42 6c 6b 3c  )>0 && iFreeBlk<
d5c0: 69 53 74 61 72 74 20 29 7b 0a 20 20 20 20 20 20  iStart ){.      
d5d0: 69 66 28 20 69 46 72 65 65 42 6c 6b 3c 69 50 74  if( iFreeBlk<iPt
d5e0: 72 2b 34 20 29 20 72 65 74 75 72 6e 20 53 51 4c  r+4 ) return SQL
d5f0: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
d600: 3b 0a 20 20 20 20 20 20 69 50 74 72 20 3d 20 69  ;.      iPtr = i
d610: 46 72 65 65 42 6c 6b 3b 0a 20 20 20 20 7d 0a 20  FreeBlk;.    }. 
d620: 20 20 20 69 66 28 20 69 46 72 65 65 42 6c 6b 3e     if( iFreeBlk>
d630: 69 4c 61 73 74 20 29 20 72 65 74 75 72 6e 20 53  iLast ) return S
d640: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
d650: 50 54 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  PT;.    assert( 
d660: 69 46 72 65 65 42 6c 6b 3e 69 50 74 72 20 7c 7c  iFreeBlk>iPtr ||
d670: 20 69 46 72 65 65 42 6c 6b 3d 3d 30 20 29 3b 0a   iFreeBlk==0 );.
d680: 20 20 0a 20 20 20 20 2f 2a 20 41 74 20 74 68 69    .    /* At thi
d690: 73 20 70 6f 69 6e 74 3a 0a 20 20 20 20 2a 2a 20  s point:.    ** 
d6a0: 20 20 20 69 46 72 65 65 42 6c 6b 3a 20 20 20 46     iFreeBlk:   F
d6b0: 69 72 73 74 20 66 72 65 65 62 6c 6f 63 6b 20 61  irst freeblock a
d6c0: 66 74 65 72 20 69 53 74 61 72 74 2c 20 6f 72 20  fter iStart, or 
d6d0: 7a 65 72 6f 20 69 66 20 6e 6f 6e 65 0a 20 20 20  zero if none.   
d6e0: 20 2a 2a 20 20 20 20 69 50 74 72 3a 20 20 20 20   **    iPtr:    
d6f0: 20 20 20 54 68 65 20 61 64 64 72 65 73 73 20 6f     The address o
d700: 66 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 69  f a pointer to i
d710: 46 72 65 65 42 6c 6b 0a 20 20 20 20 2a 2a 0a 20  FreeBlk.    **. 
d720: 20 20 20 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73     ** Check to s
d730: 65 65 20 69 66 20 69 46 72 65 65 42 6c 6b 20 73  ee if iFreeBlk s
d740: 68 6f 75 6c 64 20 62 65 20 63 6f 61 6c 65 73 63  hould be coalesc
d750: 65 64 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20  ed onto the end 
d760: 6f 66 20 69 53 74 61 72 74 2e 0a 20 20 20 20 2a  of iStart..    *
d770: 2f 0a 20 20 20 20 69 66 28 20 69 46 72 65 65 42  /.    if( iFreeB
d780: 6c 6b 20 26 26 20 69 45 6e 64 2b 33 3e 3d 69 46  lk && iEnd+3>=iF
d790: 72 65 65 42 6c 6b 20 29 7b 0a 20 20 20 20 20 20  reeBlk ){.      
d7a0: 6e 46 72 61 67 20 3d 20 69 46 72 65 65 42 6c 6b  nFrag = iFreeBlk
d7b0: 20 2d 20 69 45 6e 64 3b 0a 20 20 20 20 20 20 69   - iEnd;.      i
d7c0: 66 28 20 69 45 6e 64 3e 69 46 72 65 65 42 6c 6b  f( iEnd>iFreeBlk
d7d0: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
d7e0: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
d7f0: 20 20 20 20 20 69 45 6e 64 20 3d 20 69 46 72 65       iEnd = iFre
d800: 65 42 6c 6b 20 2b 20 67 65 74 32 62 79 74 65 28  eBlk + get2byte(
d810: 26 64 61 74 61 5b 69 46 72 65 65 42 6c 6b 2b 32  &data[iFreeBlk+2
d820: 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 45  ]);.      if( iE
d830: 6e 64 20 3e 20 70 50 61 67 65 2d 3e 70 42 74 2d  nd > pPage->pBt-
d840: 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 20 72 65  >usableSize ) re
d850: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
d860: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
d870: 69 53 69 7a 65 20 3d 20 69 45 6e 64 20 2d 20 69  iSize = iEnd - i
d880: 53 74 61 72 74 3b 0a 20 20 20 20 20 20 69 46 72  Start;.      iFr
d890: 65 65 42 6c 6b 20 3d 20 67 65 74 32 62 79 74 65  eeBlk = get2byte
d8a0: 28 26 64 61 74 61 5b 69 46 72 65 65 42 6c 6b 5d  (&data[iFreeBlk]
d8b0: 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20  );.    }.  .    
d8c0: 2f 2a 20 49 66 20 69 50 74 72 20 69 73 20 61 6e  /* If iPtr is an
d8d0: 6f 74 68 65 72 20 66 72 65 65 62 6c 6f 63 6b 20  other freeblock 
d8e0: 28 74 68 61 74 20 69 73 2c 20 69 66 20 69 50 74  (that is, if iPt
d8f0: 72 20 69 73 20 6e 6f 74 20 74 68 65 20 66 72 65  r is not the fre
d900: 65 6c 69 73 74 0a 20 20 20 20 2a 2a 20 70 6f 69  elist.    ** poi
d910: 6e 74 65 72 20 69 6e 20 74 68 65 20 70 61 67 65  nter in the page
d920: 20 68 65 61 64 65 72 29 20 74 68 65 6e 20 63 68   header) then ch
d930: 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 69 53  eck to see if iS
d940: 74 61 72 74 20 73 68 6f 75 6c 64 20 62 65 0a 20  tart should be. 
d950: 20 20 20 2a 2a 20 63 6f 61 6c 65 73 63 65 64 20     ** coalesced 
d960: 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  onto the end of 
d970: 69 50 74 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  iPtr..    */.   
d980: 20 69 66 28 20 69 50 74 72 3e 68 64 72 2b 31 20   if( iPtr>hdr+1 
d990: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 50 74  ){.      int iPt
d9a0: 72 45 6e 64 20 3d 20 69 50 74 72 20 2b 20 67 65  rEnd = iPtr + ge
d9b0: 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 50 74  t2byte(&data[iPt
d9c0: 72 2b 32 5d 29 3b 0a 20 20 20 20 20 20 69 66 28  r+2]);.      if(
d9d0: 20 69 50 74 72 45 6e 64 2b 33 3e 3d 69 53 74 61   iPtrEnd+3>=iSta
d9e0: 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  rt ){.        if
d9f0: 28 20 69 50 74 72 45 6e 64 3e 69 53 74 61 72 74  ( iPtrEnd>iStart
da00: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
da10: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
da20: 20 20 20 20 20 20 20 6e 46 72 61 67 20 2b 3d 20         nFrag += 
da30: 69 53 74 61 72 74 20 2d 20 69 50 74 72 45 6e 64  iStart - iPtrEnd
da40: 3b 0a 20 20 20 20 20 20 20 20 69 53 69 7a 65 20  ;.        iSize 
da50: 3d 20 69 45 6e 64 20 2d 20 69 50 74 72 3b 0a 20  = iEnd - iPtr;. 
da60: 20 20 20 20 20 20 20 69 53 74 61 72 74 20 3d 20         iStart = 
da70: 69 50 74 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20  iPtr;.      }.  
da80: 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 46 72 61    }.    if( nFra
da90: 67 3e 64 61 74 61 5b 68 64 72 2b 37 5d 20 29 20  g>data[hdr+7] ) 
daa0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
dab0: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
dac0: 64 61 74 61 5b 68 64 72 2b 37 5d 20 2d 3d 20 6e  data[hdr+7] -= n
dad0: 46 72 61 67 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Frag;.  }.  if( 
dae0: 69 53 74 61 72 74 3d 3d 67 65 74 32 62 79 74 65  iStart==get2byte
daf0: 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 20 29  (&data[hdr+5]) )
db00: 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 77  {.    /* The new
db10: 20 66 72 65 65 62 6c 6f 63 6b 20 69 73 20 61 74   freeblock is at
db20: 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
db30: 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  f the cell conte
db40: 6e 74 20 61 72 65 61 2c 0a 20 20 20 20 2a 2a 20  nt area,.    ** 
db50: 73 6f 20 6a 75 73 74 20 65 78 74 65 6e 64 20 74  so just extend t
db60: 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
db70: 61 72 65 61 20 72 61 74 68 65 72 20 74 68 61 6e  area rather than
db80: 20 63 72 65 61 74 65 20 61 6e 6f 74 68 65 72 0a   create another.
db90: 20 20 20 20 2a 2a 20 66 72 65 65 6c 69 73 74 20      ** freelist 
dba0: 65 6e 74 72 79 20 2a 2f 0a 20 20 20 20 69 66 28  entry */.    if(
dbb0: 20 69 50 74 72 21 3d 68 64 72 2b 31 20 29 20 72   iPtr!=hdr+1 ) r
dbc0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
dbd0: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 70  RUPT_BKPT;.    p
dbe0: 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  ut2byte(&data[hd
dbf0: 72 2b 31 5d 2c 20 69 46 72 65 65 42 6c 6b 29 3b  r+1], iFreeBlk);
dc00: 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64  .    put2byte(&d
dc10: 61 74 61 5b 68 64 72 2b 35 5d 2c 20 69 45 6e 64  ata[hdr+5], iEnd
dc20: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
dc30: 2f 2a 20 49 6e 73 65 72 74 20 74 68 65 20 6e 65  /* Insert the ne
dc40: 77 20 66 72 65 65 62 6c 6f 63 6b 20 69 6e 74 6f  w freeblock into
dc50: 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 2a 2f   the freelist */
dc60: 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64  .    put2byte(&d
dc70: 61 74 61 5b 69 50 74 72 5d 2c 20 69 53 74 61 72  ata[iPtr], iStar
dc80: 74 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65  t);.    put2byte
dc90: 28 26 64 61 74 61 5b 69 53 74 61 72 74 5d 2c 20  (&data[iStart], 
dca0: 69 46 72 65 65 42 6c 6b 29 3b 0a 20 20 20 20 70  iFreeBlk);.    p
dcb0: 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 53  ut2byte(&data[iS
dcc0: 74 61 72 74 2b 32 5d 2c 20 69 53 69 7a 65 29 3b  tart+2], iSize);
dcd0: 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e 6e 46  .  }.  pPage->nF
dce0: 72 65 65 20 2b 3d 20 69 4f 72 69 67 53 69 7a 65  ree += iOrigSize
dcf0: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
dd00: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  E_OK;.}../*.** D
dd10: 65 63 6f 64 65 20 74 68 65 20 66 6c 61 67 73 20  ecode the flags 
dd20: 62 79 74 65 20 28 74 68 65 20 66 69 72 73 74 20  byte (the first 
dd30: 62 79 74 65 20 6f 66 20 74 68 65 20 68 65 61 64  byte of the head
dd40: 65 72 29 20 66 6f 72 20 61 20 70 61 67 65 0a 2a  er) for a page.*
dd50: 2a 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65  * and initialize
dd60: 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 4d   fields of the M
dd70: 65 6d 50 61 67 65 20 73 74 72 75 63 74 75 72 65  emPage structure
dd80: 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 0a 2a 2a   accordingly..**
dd90: 0a 2a 2a 20 4f 6e 6c 79 20 74 68 65 20 66 6f 6c  .** Only the fol
dda0: 6c 6f 77 69 6e 67 20 63 6f 6d 62 69 6e 61 74 69  lowing combinati
ddb0: 6f 6e 73 20 61 72 65 20 73 75 70 70 6f 72 74 65  ons are supporte
ddc0: 64 2e 20 20 41 6e 79 74 68 69 6e 67 20 64 69 66  d.  Anything dif
ddd0: 66 65 72 65 6e 74 0a 2a 2a 20 69 6e 64 69 63 61  ferent.** indica
dde0: 74 65 73 20 61 20 63 6f 72 72 75 70 74 20 64 61  tes a corrupt da
ddf0: 74 61 62 61 73 65 20 66 69 6c 65 73 3a 0a 2a 2a  tabase files:.**
de00: 0a 2a 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f  .**         PTF_
de10: 5a 45 52 4f 44 41 54 41 0a 2a 2a 20 20 20 20 20  ZERODATA.**     
de20: 20 20 20 20 50 54 46 5f 5a 45 52 4f 44 41 54 41      PTF_ZERODATA
de30: 20 7c 20 50 54 46 5f 4c 45 41 46 0a 2a 2a 20 20   | PTF_LEAF.**  
de40: 20 20 20 20 20 20 20 50 54 46 5f 4c 45 41 46 44         PTF_LEAFD
de50: 41 54 41 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59  ATA | PTF_INTKEY
de60: 0a 2a 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f  .**         PTF_
de70: 4c 45 41 46 44 41 54 41 20 7c 20 50 54 46 5f 49  LEAFDATA | PTF_I
de80: 4e 54 4b 45 59 20 7c 20 50 54 46 5f 4c 45 41 46  NTKEY | PTF_LEAF
de90: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64  .*/.static int d
dea0: 65 63 6f 64 65 46 6c 61 67 73 28 4d 65 6d 50 61  ecodeFlags(MemPa
deb0: 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 66  ge *pPage, int f
dec0: 6c 61 67 42 79 74 65 29 7b 0a 20 20 42 74 53 68  lagByte){.  BtSh
ded0: 61 72 65 64 20 2a 70 42 74 3b 20 20 20 20 20 2f  ared *pBt;     /
dee0: 2a 20 41 20 63 6f 70 79 20 6f 66 20 70 50 61 67  * A copy of pPag
def0: 65 2d 3e 70 42 74 20 2a 2f 0a 0a 20 20 61 73 73  e->pBt */..  ass
df00: 65 72 74 28 20 70 50 61 67 65 2d 3e 68 64 72 4f  ert( pPage->hdrO
df10: 66 66 73 65 74 3d 3d 28 70 50 61 67 65 2d 3e 70  ffset==(pPage->p
df20: 67 6e 6f 3d 3d 31 20 3f 20 31 30 30 20 3a 20 30  gno==1 ? 100 : 0
df30: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
df40: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
df50: 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
df60: 74 65 78 29 20 29 3b 0a 20 20 70 50 61 67 65 2d  tex) );.  pPage-
df70: 3e 6c 65 61 66 20 3d 20 28 75 38 29 28 66 6c 61  >leaf = (u8)(fla
df80: 67 42 79 74 65 3e 3e 33 29 3b 20 20 61 73 73 65  gByte>>3);  asse
df90: 72 74 28 20 50 54 46 5f 4c 45 41 46 20 3d 3d 20  rt( PTF_LEAF == 
dfa0: 31 3c 3c 33 20 29 3b 0a 20 20 66 6c 61 67 42 79  1<<3 );.  flagBy
dfb0: 74 65 20 26 3d 20 7e 50 54 46 5f 4c 45 41 46 3b  te &= ~PTF_LEAF;
dfc0: 0a 20 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50  .  pPage->childP
dfd0: 74 72 53 69 7a 65 20 3d 20 34 2d 34 2a 70 50 61  trSize = 4-4*pPa
dfe0: 67 65 2d 3e 6c 65 61 66 3b 0a 20 20 70 50 61 67  ge->leaf;.  pPag
dff0: 65 2d 3e 78 43 65 6c 6c 53 69 7a 65 20 3d 20 63  e->xCellSize = c
e000: 65 6c 6c 53 69 7a 65 50 74 72 3b 0a 20 20 70 42  ellSizePtr;.  pB
e010: 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a  t = pPage->pBt;.
e020: 20 20 69 66 28 20 66 6c 61 67 42 79 74 65 3d 3d    if( flagByte==
e030: 28 50 54 46 5f 4c 45 41 46 44 41 54 41 20 7c 20  (PTF_LEAFDATA | 
e040: 50 54 46 5f 49 4e 54 4b 45 59 29 20 29 7b 0a 20  PTF_INTKEY) ){. 
e050: 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
e060: 46 3a 20 52 2d 30 33 36 34 30 2d 31 33 34 31 35  F: R-03640-13415
e070: 20 41 20 76 61 6c 75 65 20 6f 66 20 35 20 6d 65   A value of 5 me
e080: 61 6e 73 20 74 68 65 20 70 61 67 65 20 69 73 20  ans the page is 
e090: 61 6e 20 69 6e 74 65 72 69 6f 72 0a 20 20 20 20  an interior.    
e0a0: 2a 2a 20 74 61 62 6c 65 20 62 2d 74 72 65 65 20  ** table b-tree 
e0b0: 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73  page. */.    ass
e0c0: 65 72 74 28 20 28 50 54 46 5f 4c 45 41 46 44 41  ert( (PTF_LEAFDA
e0d0: 54 41 7c 50 54 46 5f 49 4e 54 4b 45 59 29 3d 3d  TA|PTF_INTKEY)==
e0e0: 35 20 29 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44  5 );.    /* EVID
e0f0: 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 30 35 30 31  ENCE-OF: R-20501
e100: 2d 36 31 37 39 36 20 41 20 76 61 6c 75 65 20 6f  -61796 A value o
e110: 66 20 31 33 20 6d 65 61 6e 73 20 74 68 65 20 70  f 13 means the p
e120: 61 67 65 20 69 73 20 61 20 6c 65 61 66 0a 20 20  age is a leaf.  
e130: 20 20 2a 2a 20 74 61 62 6c 65 20 62 2d 74 72 65    ** table b-tre
e140: 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 61  e page. */.    a
e150: 73 73 65 72 74 28 20 28 50 54 46 5f 4c 45 41 46  ssert( (PTF_LEAF
e160: 44 41 54 41 7c 50 54 46 5f 49 4e 54 4b 45 59 7c  DATA|PTF_INTKEY|
e170: 50 54 46 5f 4c 45 41 46 29 3d 3d 31 33 20 29 3b  PTF_LEAF)==13 );
e180: 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b  .    pPage->intK
e190: 65 79 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20  ey = 1;.    if( 
e1a0: 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
e1b0: 20 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b       pPage->intK
e1c0: 65 79 4c 65 61 66 20 3d 20 31 3b 0a 20 20 20 20  eyLeaf = 1;.    
e1d0: 20 20 70 50 61 67 65 2d 3e 6e 6f 50 61 79 6c 6f    pPage->noPaylo
e1e0: 61 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50  ad = 0;.      pP
e1f0: 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 20  age->xParseCell 
e200: 3d 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c  = btreeParseCell
e210: 50 74 72 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  Ptr;.    }else{.
e220: 20 20 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74        pPage->int
e230: 4b 65 79 4c 65 61 66 20 3d 20 30 3b 0a 20 20 20  KeyLeaf = 0;.   
e240: 20 20 20 70 50 61 67 65 2d 3e 6e 6f 50 61 79 6c     pPage->noPayl
e250: 6f 61 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 70  oad = 1;.      p
e260: 50 61 67 65 2d 3e 78 43 65 6c 6c 53 69 7a 65 20  Page->xCellSize 
e270: 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 4e 6f 50  = cellSizePtrNoP
e280: 61 79 6c 6f 61 64 3b 0a 20 20 20 20 20 20 70 50  ayload;.      pP
e290: 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 20  age->xParseCell 
e2a0: 3d 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c  = btreeParseCell
e2b0: 50 74 72 4e 6f 50 61 79 6c 6f 61 64 3b 0a 20 20  PtrNoPayload;.  
e2c0: 20 20 7d 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d    }.    pPage->m
e2d0: 61 78 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d  axLocal = pBt->m
e2e0: 61 78 4c 65 61 66 3b 0a 20 20 20 20 70 50 61 67  axLeaf;.    pPag
e2f0: 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 42  e->minLocal = pB
e300: 74 2d 3e 6d 69 6e 4c 65 61 66 3b 0a 20 20 7d 65  t->minLeaf;.  }e
e310: 6c 73 65 20 69 66 28 20 66 6c 61 67 42 79 74 65  lse if( flagByte
e320: 3d 3d 50 54 46 5f 5a 45 52 4f 44 41 54 41 20 29  ==PTF_ZERODATA )
e330: 7b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43  {.    /* EVIDENC
e340: 45 2d 4f 46 3a 20 52 2d 32 37 32 32 35 2d 35 33  E-OF: R-27225-53
e350: 39 33 36 20 41 20 76 61 6c 75 65 20 6f 66 20 32  936 A value of 2
e360: 20 6d 65 61 6e 73 20 74 68 65 20 70 61 67 65 20   means the page 
e370: 69 73 20 61 6e 20 69 6e 74 65 72 69 6f 72 0a 20  is an interior. 
e380: 20 20 20 2a 2a 20 69 6e 64 65 78 20 62 2d 74 72     ** index b-tr
e390: 65 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20  ee page. */.    
e3a0: 61 73 73 65 72 74 28 20 28 50 54 46 5f 5a 45 52  assert( (PTF_ZER
e3b0: 4f 44 41 54 41 29 3d 3d 32 20 29 3b 0a 20 20 20  ODATA)==2 );.   
e3c0: 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
e3d0: 20 52 2d 31 36 35 37 31 2d 31 31 36 31 35 20 41   R-16571-11615 A
e3e0: 20 76 61 6c 75 65 20 6f 66 20 31 30 20 6d 65 61   value of 10 mea
e3f0: 6e 73 20 74 68 65 20 70 61 67 65 20 69 73 20 61  ns the page is a
e400: 20 6c 65 61 66 0a 20 20 20 20 2a 2a 20 69 6e 64   leaf.    ** ind
e410: 65 78 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20  ex b-tree page. 
e420: 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  */.    assert( (
e430: 50 54 46 5f 5a 45 52 4f 44 41 54 41 7c 50 54 46  PTF_ZERODATA|PTF
e440: 5f 4c 45 41 46 29 3d 3d 31 30 20 29 3b 0a 20 20  _LEAF)==10 );.  
e450: 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20    pPage->intKey 
e460: 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  = 0;.    pPage->
e470: 69 6e 74 4b 65 79 4c 65 61 66 20 3d 20 30 3b 0a  intKeyLeaf = 0;.
e480: 20 20 20 20 70 50 61 67 65 2d 3e 6e 6f 50 61 79      pPage->noPay
e490: 6c 6f 61 64 20 3d 20 30 3b 0a 20 20 20 20 70 50  load = 0;.    pP
e4a0: 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 20  age->xParseCell 
e4b0: 3d 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c  = btreeParseCell
e4c0: 50 74 72 49 6e 64 65 78 3b 0a 20 20 20 20 70 50  PtrIndex;.    pP
e4d0: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20  age->maxLocal = 
e4e0: 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20  pBt->maxLocal;. 
e4f0: 20 20 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63     pPage->minLoc
e500: 61 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e 4c 6f 63  al = pBt->minLoc
e510: 61 6c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  al;.  }else{.   
e520: 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
e530: 20 52 2d 34 37 36 30 38 2d 35 36 34 36 39 20 41   R-47608-56469 A
e540: 6e 79 20 6f 74 68 65 72 20 76 61 6c 75 65 20 66  ny other value f
e550: 6f 72 20 74 68 65 20 62 2d 74 72 65 65 20 70 61  or the b-tree pa
e560: 67 65 20 74 79 70 65 20 69 73 0a 20 20 20 20 2a  ge type is.    *
e570: 2a 20 61 6e 20 65 72 72 6f 72 2e 20 2a 2f 0a 20  * an error. */. 
e580: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
e590: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
e5a0: 20 7d 0a 20 20 70 50 61 67 65 2d 3e 6d 61 78 31   }.  pPage->max1
e5b0: 62 79 74 65 50 61 79 6c 6f 61 64 20 3d 20 70 42  bytePayload = pB
e5c0: 74 2d 3e 6d 61 78 31 62 79 74 65 50 61 79 6c 6f  t->max1bytePaylo
e5d0: 61 64 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ad;.  return SQL
e5e0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
e5f0: 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
e600: 61 75 78 69 6c 69 61 72 79 20 69 6e 66 6f 72 6d  auxiliary inform
e610: 61 74 69 6f 6e 20 66 6f 72 20 61 20 64 69 73 6b  ation for a disk
e620: 20 62 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 52 65   block..**.** Re
e630: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
e640: 6e 20 73 75 63 63 65 73 73 2e 20 20 49 66 20 77  n success.  If w
e650: 65 20 73 65 65 20 74 68 61 74 20 74 68 65 20 70  e see that the p
e660: 61 67 65 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20  age does.** not 
e670: 63 6f 6e 74 61 69 6e 20 61 20 77 65 6c 6c 2d 66  contain a well-f
e680: 6f 72 6d 65 64 20 64 61 74 61 62 61 73 65 20 70  ormed database p
e690: 61 67 65 2c 20 74 68 65 6e 20 72 65 74 75 72 6e  age, then return
e6a0: 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 52 52   .** SQLITE_CORR
e6b0: 55 50 54 2e 20 20 4e 6f 74 65 20 74 68 61 74 20  UPT.  Note that 
e6c0: 61 20 72 65 74 75 72 6e 20 6f 66 20 53 51 4c 49  a return of SQLI
e6d0: 54 45 5f 4f 4b 20 64 6f 65 73 20 6e 6f 74 0a 2a  TE_OK does not.*
e6e0: 2a 20 67 75 61 72 61 6e 74 65 65 20 74 68 61 74  * guarantee that
e6f0: 20 74 68 65 20 70 61 67 65 20 69 73 20 77 65 6c   the page is wel
e700: 6c 2d 66 6f 72 6d 65 64 2e 20 20 49 74 20 6f 6e  l-formed.  It on
e710: 6c 79 20 73 68 6f 77 73 20 74 68 61 74 0a 2a 2a  ly shows that.**
e720: 20 77 65 20 66 61 69 6c 65 64 20 74 6f 20 64 65   we failed to de
e730: 74 65 63 74 20 61 6e 79 20 63 6f 72 72 75 70 74  tect any corrupt
e740: 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ion..*/.static i
e750: 6e 74 20 62 74 72 65 65 49 6e 69 74 50 61 67 65  nt btreeInitPage
e760: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29  (MemPage *pPage)
e770: 7b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  {..  assert( pPa
e780: 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20  ge->pBt!=0 );.  
e790: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70  assert( pPage->p
e7a0: 42 74 2d 3e 64 62 21 3d 30 20 29 3b 0a 20 20 61  Bt->db!=0 );.  a
e7b0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
e7c0: 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
e7d0: 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
e7e0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
e7f0: 3e 70 67 6e 6f 3d 3d 73 71 6c 69 74 65 33 50 61  >pgno==sqlite3Pa
e800: 67 65 72 50 61 67 65 6e 75 6d 62 65 72 28 70 50  gerPagenumber(pP
e810: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
e820: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
e830: 20 3d 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72   == sqlite3Pager
e840: 47 65 74 45 78 74 72 61 28 70 50 61 67 65 2d 3e  GetExtra(pPage->
e850: 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73  pDbPage) );.  as
e860: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 61 44 61  sert( pPage->aDa
e870: 74 61 20 3d 3d 20 73 71 6c 69 74 65 33 50 61 67  ta == sqlite3Pag
e880: 65 72 47 65 74 44 61 74 61 28 70 50 61 67 65 2d  erGetData(pPage-
e890: 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20  >pDbPage) );..  
e8a0: 69 66 28 20 21 70 50 61 67 65 2d 3e 69 73 49 6e  if( !pPage->isIn
e8b0: 69 74 20 29 7b 0a 20 20 20 20 75 31 36 20 70 63  it ){.    u16 pc
e8c0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
e8d0: 41 64 64 72 65 73 73 20 6f 66 20 61 20 66 72 65  Address of a fre
e8e0: 65 62 6c 6f 63 6b 20 77 69 74 68 69 6e 20 70 50  eblock within pP
e8f0: 61 67 65 2d 3e 61 44 61 74 61 5b 5d 20 2a 2f 0a  age->aData[] */.
e900: 20 20 20 20 75 38 20 68 64 72 3b 20 20 20 20 20      u8 hdr;     
e910: 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
e920: 20 74 6f 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66   to beginning of
e930: 20 70 61 67 65 20 68 65 61 64 65 72 20 2a 2f 0a   page header */.
e940: 20 20 20 20 75 38 20 2a 64 61 74 61 3b 20 20 20      u8 *data;   
e950: 20 20 20 20 20 20 20 2f 2a 20 45 71 75 61 6c 20         /* Equal 
e960: 74 6f 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20  to pPage->aData 
e970: 2a 2f 0a 20 20 20 20 42 74 53 68 61 72 65 64 20  */.    BtShared 
e980: 2a 70 42 74 3b 20 20 20 20 20 20 20 20 2f 2a 20  *pBt;        /* 
e990: 54 68 65 20 6d 61 69 6e 20 62 74 72 65 65 20 73  The main btree s
e9a0: 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 20 20  tructure */.    
e9b0: 69 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 3b 20  int usableSize; 
e9c0: 20 20 20 2f 2a 20 41 6d 6f 75 6e 74 20 6f 66 20     /* Amount of 
e9d0: 75 73 61 62 6c 65 20 73 70 61 63 65 20 6f 6e 20  usable space on 
e9e0: 65 61 63 68 20 70 61 67 65 20 2a 2f 0a 20 20 20  each page */.   
e9f0: 20 75 31 36 20 63 65 6c 6c 4f 66 66 73 65 74 3b   u16 cellOffset;
ea00: 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 66 72      /* Offset fr
ea10: 6f 6d 20 73 74 61 72 74 20 6f 66 20 70 61 67 65  om start of page
ea20: 20 74 6f 20 66 69 72 73 74 20 63 65 6c 6c 20 70   to first cell p
ea30: 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 20 20 69 6e  ointer */.    in
ea40: 74 20 6e 46 72 65 65 3b 20 20 20 20 20 20 20 20  t nFree;        
ea50: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 6e   /* Number of un
ea60: 75 73 65 64 20 62 79 74 65 73 20 6f 6e 20 74 68  used bytes on th
ea70: 65 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 69 6e  e page */.    in
ea80: 74 20 74 6f 70 3b 20 20 20 20 20 20 20 20 20 20  t top;          
ea90: 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f   /* First byte o
eaa0: 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  f the cell conte
eab0: 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20 20 20 69  nt area */.    i
eac0: 6e 74 20 69 43 65 6c 6c 46 69 72 73 74 3b 20 20  nt iCellFirst;  
ead0: 20 20 2f 2a 20 46 69 72 73 74 20 61 6c 6c 6f 77    /* First allow
eae0: 61 62 6c 65 20 63 65 6c 6c 20 6f 72 20 66 72 65  able cell or fre
eaf0: 65 62 6c 6f 63 6b 20 6f 66 66 73 65 74 20 2a 2f  eblock offset */
eb00: 0a 20 20 20 20 69 6e 74 20 69 43 65 6c 6c 4c 61  .    int iCellLa
eb10: 73 74 3b 20 20 20 20 20 2f 2a 20 4c 61 73 74 20  st;     /* Last 
eb20: 70 6f 73 73 69 62 6c 65 20 63 65 6c 6c 20 6f 72  possible cell or
eb30: 20 66 72 65 65 62 6c 6f 63 6b 20 6f 66 66 73 65   freeblock offse
eb40: 74 20 2a 2f 0a 0a 20 20 20 20 70 42 74 20 3d 20  t */..    pBt = 
eb50: 70 50 61 67 65 2d 3e 70 42 74 3b 0a 0a 20 20 20  pPage->pBt;..   
eb60: 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64   hdr = pPage->hd
eb70: 72 4f 66 66 73 65 74 3b 0a 20 20 20 20 64 61 74  rOffset;.    dat
eb80: 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61  a = pPage->aData
eb90: 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43  ;.    /* EVIDENC
eba0: 45 2d 4f 46 3a 20 52 2d 32 38 35 39 34 2d 30 32  E-OF: R-28594-02
ebb0: 38 39 30 20 54 68 65 20 6f 6e 65 2d 62 79 74 65  890 The one-byte
ebc0: 20 66 6c 61 67 20 61 74 20 6f 66 66 73 65 74 20   flag at offset 
ebd0: 30 20 69 6e 64 69 63 61 74 69 6e 67 0a 20 20 20  0 indicating.   
ebe0: 20 2a 2a 20 74 68 65 20 62 2d 74 72 65 65 20 70   ** the b-tree p
ebf0: 61 67 65 20 74 79 70 65 2e 20 2a 2f 0a 20 20 20  age type. */.   
ec00: 20 69 66 28 20 64 65 63 6f 64 65 46 6c 61 67 73   if( decodeFlags
ec10: 28 70 50 61 67 65 2c 20 64 61 74 61 5b 68 64 72  (pPage, data[hdr
ec20: 5d 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  ]) ) return SQLI
ec30: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
ec40: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74  .    assert( pBt
ec50: 2d 3e 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20  ->pageSize>=512 
ec60: 26 26 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  && pBt->pageSize
ec70: 3c 3d 36 35 35 33 36 20 29 3b 0a 20 20 20 20 70  <=65536 );.    p
ec80: 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65 20 3d  Page->maskPage =
ec90: 20 28 75 31 36 29 28 70 42 74 2d 3e 70 61 67 65   (u16)(pBt->page
eca0: 53 69 7a 65 20 2d 20 31 29 3b 0a 20 20 20 20 70  Size - 1);.    p
ecb0: 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20  Page->nOverflow 
ecc0: 3d 20 30 3b 0a 20 20 20 20 75 73 61 62 6c 65 53  = 0;.    usableS
ecd0: 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c  ize = pBt->usabl
ece0: 65 53 69 7a 65 3b 0a 20 20 20 20 70 50 61 67 65  eSize;.    pPage
ecf0: 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 63  ->cellOffset = c
ed00: 65 6c 6c 4f 66 66 73 65 74 20 3d 20 68 64 72 20  ellOffset = hdr 
ed10: 2b 20 38 20 2b 20 70 50 61 67 65 2d 3e 63 68 69  + 8 + pPage->chi
ed20: 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20 20 20 70  ldPtrSize;.    p
ed30: 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 3d  Page->aDataEnd =
ed40: 20 26 64 61 74 61 5b 75 73 61 62 6c 65 53 69 7a   &data[usableSiz
ed50: 65 5d 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 61  e];.    pPage->a
ed60: 43 65 6c 6c 49 64 78 20 3d 20 26 64 61 74 61 5b  CellIdx = &data[
ed70: 63 65 6c 6c 4f 66 66 73 65 74 5d 3b 0a 20 20 20  cellOffset];.   
ed80: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 4f 66 73   pPage->aDataOfs
ed90: 74 20 3d 20 26 64 61 74 61 5b 70 50 61 67 65 2d  t = &data[pPage-
eda0: 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 5d 3b 0a  >childPtrSize];.
edb0: 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
edc0: 4f 46 3a 20 52 2d 35 38 30 31 35 2d 34 38 31 37  OF: R-58015-4817
edd0: 35 20 54 68 65 20 74 77 6f 2d 62 79 74 65 20 69  5 The two-byte i
ede0: 6e 74 65 67 65 72 20 61 74 20 6f 66 66 73 65 74  nteger at offset
edf0: 20 35 20 64 65 73 69 67 6e 61 74 65 73 0a 20 20   5 designates.  
ee00: 20 20 2a 2a 20 74 68 65 20 73 74 61 72 74 20 6f    ** the start o
ee10: 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  f the cell conte
ee20: 6e 74 20 61 72 65 61 2e 20 41 20 7a 65 72 6f 20  nt area. A zero 
ee30: 76 61 6c 75 65 20 66 6f 72 20 74 68 69 73 20 69  value for this i
ee40: 6e 74 65 67 65 72 20 69 73 0a 20 20 20 20 2a 2a  nteger is.    **
ee50: 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 20   interpreted as 
ee60: 36 35 35 33 36 2e 20 2a 2f 0a 20 20 20 20 74 6f  65536. */.    to
ee70: 70 20 3d 20 67 65 74 32 62 79 74 65 4e 6f 74 5a  p = get2byteNotZ
ee80: 65 72 6f 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  ero(&data[hdr+5]
ee90: 29 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  );.    /* EVIDEN
eea0: 43 45 2d 4f 46 3a 20 52 2d 33 37 30 30 32 2d 33  CE-OF: R-37002-3
eeb0: 32 37 37 34 20 54 68 65 20 74 77 6f 2d 62 79 74  2774 The two-byt
eec0: 65 20 69 6e 74 65 67 65 72 20 61 74 20 6f 66 66  e integer at off
eed0: 73 65 74 20 33 20 67 69 76 65 73 20 74 68 65 0a  set 3 gives the.
eee0: 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66      ** number of
eef0: 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20 70 61   cells on the pa
ef00: 67 65 2e 20 2a 2f 0a 20 20 20 20 70 50 61 67 65  ge. */.    pPage
ef10: 2d 3e 6e 43 65 6c 6c 20 3d 20 67 65 74 32 62 79  ->nCell = get2by
ef20: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 29  te(&data[hdr+3])
ef30: 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d  ;.    if( pPage-
ef40: 3e 6e 43 65 6c 6c 3e 4d 58 5f 43 45 4c 4c 28 70  >nCell>MX_CELL(p
ef50: 42 74 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  Bt) ){.      /* 
ef60: 54 6f 20 6d 61 6e 79 20 63 65 6c 6c 73 20 66 6f  To many cells fo
ef70: 72 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65 2e  r a single page.
ef80: 20 20 54 68 65 20 70 61 67 65 20 6d 75 73 74 20    The page must 
ef90: 62 65 20 63 6f 72 72 75 70 74 20 2a 2f 0a 20 20  be corrupt */.  
efa0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
efb0: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
efc0: 20 20 20 20 7d 0a 20 20 20 20 74 65 73 74 63 61      }.    testca
efd0: 73 65 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  se( pPage->nCell
efe0: 3d 3d 4d 58 5f 43 45 4c 4c 28 70 42 74 29 20 29  ==MX_CELL(pBt) )
eff0: 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43  ;.    /* EVIDENC
f000: 45 2d 4f 46 3a 20 52 2d 32 34 30 38 39 2d 35 37  E-OF: R-24089-57
f010: 39 37 39 20 49 66 20 61 20 70 61 67 65 20 63 6f  979 If a page co
f020: 6e 74 61 69 6e 73 20 6e 6f 20 63 65 6c 6c 73 20  ntains no cells 
f030: 28 77 68 69 63 68 20 69 73 20 6f 6e 6c 79 0a 20  (which is only. 
f040: 20 20 20 2a 2a 20 70 6f 73 73 69 62 6c 65 20 66     ** possible f
f050: 6f 72 20 61 20 72 6f 6f 74 20 70 61 67 65 20 6f  or a root page o
f060: 66 20 61 20 74 61 62 6c 65 20 74 68 61 74 20 63  f a table that c
f070: 6f 6e 74 61 69 6e 73 20 6e 6f 20 72 6f 77 73 29  ontains no rows)
f080: 20 74 68 65 6e 20 74 68 65 0a 20 20 20 20 2a 2a   then the.    **
f090: 20 6f 66 66 73 65 74 20 74 6f 20 74 68 65 20 63   offset to the c
f0a0: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
f0b0: 20 77 69 6c 6c 20 65 71 75 61 6c 20 74 68 65 20   will equal the 
f0c0: 70 61 67 65 20 73 69 7a 65 20 6d 69 6e 75 73 20  page size minus 
f0d0: 74 68 65 0a 20 20 20 20 2a 2a 20 62 79 74 65 73  the.    ** bytes
f0e0: 20 6f 66 20 72 65 73 65 72 76 65 64 20 73 70 61   of reserved spa
f0f0: 63 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  ce. */.    asser
f100: 74 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e  t( pPage->nCell>
f110: 30 20 7c 7c 20 74 6f 70 3d 3d 75 73 61 62 6c 65  0 || top==usable
f120: 53 69 7a 65 20 7c 7c 20 43 4f 52 52 55 50 54 5f  Size || CORRUPT_
f130: 44 42 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 41 20  DB );..    /* A 
f140: 6d 61 6c 66 6f 72 6d 65 64 20 64 61 74 61 62 61  malformed databa
f150: 73 65 20 70 61 67 65 20 6d 69 67 68 74 20 63 61  se page might ca
f160: 75 73 65 20 75 73 20 74 6f 20 72 65 61 64 20 70  use us to read p
f170: 61 73 74 20 74 68 65 20 65 6e 64 0a 20 20 20 20  ast the end.    
f180: 2a 2a 20 6f 66 20 70 61 67 65 20 77 68 65 6e 20  ** of page when 
f190: 70 61 72 73 69 6e 67 20 61 20 63 65 6c 6c 2e 20  parsing a cell. 
f1a0: 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20   .    **.    ** 
f1b0: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c  The following bl
f1c0: 6f 63 6b 20 6f 66 20 63 6f 64 65 20 63 68 65 63  ock of code chec
f1d0: 6b 73 20 65 61 72 6c 79 20 74 6f 20 73 65 65 20  ks early to see 
f1e0: 69 66 20 61 20 63 65 6c 6c 20 65 78 74 65 6e 64  if a cell extend
f1f0: 73 0a 20 20 20 20 2a 2a 20 70 61 73 74 20 74 68  s.    ** past th
f200: 65 20 65 6e 64 20 6f 66 20 61 20 70 61 67 65 20  e end of a page 
f210: 62 6f 75 6e 64 61 72 79 20 61 6e 64 20 63 61 75  boundary and cau
f220: 73 65 73 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  ses SQLITE_CORRU
f230: 50 54 20 74 6f 20 62 65 20 0a 20 20 20 20 2a 2a  PT to be .    **
f240: 20 72 65 74 75 72 6e 65 64 20 69 66 20 69 74 20   returned if it 
f250: 64 6f 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  does..    */.   
f260: 20 69 43 65 6c 6c 46 69 72 73 74 20 3d 20 63 65   iCellFirst = ce
f270: 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70 50 61  llOffset + 2*pPa
f280: 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 20 20 69  ge->nCell;.    i
f290: 43 65 6c 6c 4c 61 73 74 20 3d 20 75 73 61 62 6c  CellLast = usabl
f2a0: 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20 20 20 69  eSize - 4;.    i
f2b0: 66 28 20 70 42 74 2d 3e 64 62 2d 3e 66 6c 61 67  f( pBt->db->flag
f2c0: 73 20 26 20 53 51 4c 49 54 45 5f 43 65 6c 6c 53  s & SQLITE_CellS
f2d0: 69 7a 65 43 6b 20 29 7b 0a 20 20 20 20 20 20 69  izeCk ){.      i
f2e0: 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
f2f0: 20 2f 2a 20 49 6e 64 65 78 20 69 6e 74 6f 20 74   /* Index into t
f300: 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20  he cell pointer 
f310: 61 72 72 61 79 20 2a 2f 0a 20 20 20 20 20 20 69  array */.      i
f320: 6e 74 20 73 7a 3b 20 20 20 20 20 20 20 20 20 20  nt sz;          
f330: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 20 63 65   /* Size of a ce
f340: 6c 6c 20 2a 2f 0a 0a 20 20 20 20 20 20 69 66 28  ll */..      if(
f350: 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 20   !pPage->leaf ) 
f360: 69 43 65 6c 6c 4c 61 73 74 2d 2d 3b 0a 20 20 20  iCellLast--;.   
f370: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50     for(i=0; i<pP
f380: 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 29  age->nCell; i++)
f390: 7b 0a 20 20 20 20 20 20 20 20 70 63 20 3d 20 67  {.        pc = g
f3a0: 65 74 32 62 79 74 65 41 6c 69 67 6e 65 64 28 26  et2byteAligned(&
f3b0: 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74 2b  data[cellOffset+
f3c0: 69 2a 32 5d 29 3b 0a 20 20 20 20 20 20 20 20 74  i*2]);.        t
f3d0: 65 73 74 63 61 73 65 28 20 70 63 3d 3d 69 43 65  estcase( pc==iCe
f3e0: 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20 20 20 20  llFirst );.     
f3f0: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 63 3d     testcase( pc=
f400: 3d 69 43 65 6c 6c 4c 61 73 74 20 29 3b 0a 20 20  =iCellLast );.  
f410: 20 20 20 20 20 20 69 66 28 20 70 63 3c 69 43 65        if( pc<iCe
f420: 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63 3e 69 43  llFirst || pc>iC
f430: 65 6c 6c 4c 61 73 74 20 29 7b 0a 20 20 20 20 20  ellLast ){.     
f440: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
f450: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
f460: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
f470: 20 20 20 73 7a 20 3d 20 70 50 61 67 65 2d 3e 78     sz = pPage->x
f480: 43 65 6c 6c 53 69 7a 65 28 70 50 61 67 65 2c 20  CellSize(pPage, 
f490: 26 64 61 74 61 5b 70 63 5d 29 3b 0a 20 20 20 20  &data[pc]);.    
f4a0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 63      testcase( pc
f4b0: 2b 73 7a 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20  +sz==usableSize 
f4c0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
f4d0: 63 2b 73 7a 3e 75 73 61 62 6c 65 53 69 7a 65 20  c+sz>usableSize 
f4e0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ){.          ret
f4f0: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
f500: 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20  PT_BKPT;.       
f510: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
f520: 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
f530: 66 20 29 20 69 43 65 6c 6c 4c 61 73 74 2b 2b 3b  f ) iCellLast++;
f540: 0a 20 20 20 20 7d 20 20 0a 0a 20 20 20 20 2f 2a  .    }  ..    /*
f550: 20 43 6f 6d 70 75 74 65 20 74 68 65 20 74 6f 74   Compute the tot
f560: 61 6c 20 66 72 65 65 20 73 70 61 63 65 20 6f 6e  al free space on
f570: 20 74 68 65 20 70 61 67 65 0a 20 20 20 20 2a 2a   the page.    **
f580: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
f590: 32 33 35 38 38 2d 33 34 34 35 30 20 54 68 65 20  23588-34450 The 
f5a0: 74 77 6f 2d 62 79 74 65 20 69 6e 74 65 67 65 72  two-byte integer
f5b0: 20 61 74 20 6f 66 66 73 65 74 20 31 20 67 69 76   at offset 1 giv
f5c0: 65 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 73 74  es the.    ** st
f5d0: 61 72 74 20 6f 66 20 74 68 65 20 66 69 72 73 74  art of the first
f5e0: 20 66 72 65 65 62 6c 6f 63 6b 20 6f 6e 20 74 68   freeblock on th
f5f0: 65 20 70 61 67 65 2c 20 6f 72 20 69 73 20 7a 65  e page, or is ze
f600: 72 6f 20 69 66 20 74 68 65 72 65 20 61 72 65 20  ro if there are 
f610: 6e 6f 0a 20 20 20 20 2a 2a 20 66 72 65 65 62 6c  no.    ** freebl
f620: 6f 63 6b 73 2e 20 2a 2f 0a 20 20 20 20 70 63 20  ocks. */.    pc 
f630: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
f640: 5b 68 64 72 2b 31 5d 29 3b 0a 20 20 20 20 6e 46  [hdr+1]);.    nF
f650: 72 65 65 20 3d 20 64 61 74 61 5b 68 64 72 2b 37  ree = data[hdr+7
f660: 5d 20 2b 20 74 6f 70 3b 20 20 2f 2a 20 49 6e 69  ] + top;  /* Ini
f670: 74 20 6e 46 72 65 65 20 74 6f 20 6e 6f 6e 2d 66  t nFree to non-f
f680: 72 65 65 62 6c 6f 63 6b 20 66 72 65 65 20 73 70  reeblock free sp
f690: 61 63 65 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65  ace */.    while
f6a0: 28 20 70 63 3e 30 20 29 7b 0a 20 20 20 20 20 20  ( pc>0 ){.      
f6b0: 75 31 36 20 6e 65 78 74 2c 20 73 69 7a 65 3b 0a  u16 next, size;.
f6c0: 20 20 20 20 20 20 69 66 28 20 70 63 3c 69 43 65        if( pc<iCe
f6d0: 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63 3e 69 43  llFirst || pc>iC
f6e0: 65 6c 6c 4c 61 73 74 20 29 7b 0a 20 20 20 20 20  ellLast ){.     
f6f0: 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
f700: 46 3a 20 52 2d 35 35 35 33 30 2d 35 32 39 33 30  F: R-55530-52930
f710: 20 49 6e 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65   In a well-forme
f720: 64 20 62 2d 74 72 65 65 20 70 61 67 65 2c 20 74  d b-tree page, t
f730: 68 65 72 65 20 77 69 6c 6c 0a 20 20 20 20 20 20  here will.      
f740: 20 20 2a 2a 20 61 6c 77 61 79 73 20 62 65 20 61    ** always be a
f750: 74 20 6c 65 61 73 74 20 6f 6e 65 20 63 65 6c 6c  t least one cell
f760: 20 62 65 66 6f 72 65 20 74 68 65 20 66 69 72 73   before the firs
f770: 74 20 66 72 65 65 62 6c 6f 63 6b 2e 0a 20 20 20  t freeblock..   
f780: 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
f790: 2a 2a 20 4f 72 2c 20 74 68 65 20 66 72 65 65 62  ** Or, the freeb
f7a0: 6c 6f 63 6b 20 69 73 20 6f 66 66 20 74 68 65 20  lock is off the 
f7b0: 65 6e 64 20 6f 66 20 74 68 65 20 70 61 67 65 0a  end of the page.
f7c0: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
f7d0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
f7e0: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a  _CORRUPT_BKPT; .
f7f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 65        }.      ne
f800: 78 74 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  xt = get2byte(&d
f810: 61 74 61 5b 70 63 5d 29 3b 0a 20 20 20 20 20 20  ata[pc]);.      
f820: 73 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28  size = get2byte(
f830: 26 64 61 74 61 5b 70 63 2b 32 5d 29 3b 0a 20 20  &data[pc+2]);.  
f840: 20 20 20 20 69 66 28 20 28 6e 65 78 74 3e 30 20      if( (next>0 
f850: 26 26 20 6e 65 78 74 3c 3d 70 63 2b 73 69 7a 65  && next<=pc+size
f860: 2b 33 29 20 7c 7c 20 70 63 2b 73 69 7a 65 3e 75  +3) || pc+size>u
f870: 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20  sableSize ){.   
f880: 20 20 20 20 20 2f 2a 20 46 72 65 65 20 62 6c 6f       /* Free blo
f890: 63 6b 73 20 6d 75 73 74 20 62 65 20 69 6e 20 61  cks must be in a
f8a0: 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 20  scending order. 
f8b0: 41 6e 64 20 74 68 65 20 6c 61 73 74 20 62 79 74  And the last byt
f8c0: 65 20 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a 20  e of.        ** 
f8d0: 74 68 65 20 66 72 65 65 2d 62 6c 6f 63 6b 20 6d  the free-block m
f8e0: 75 73 74 20 6c 69 65 20 6f 6e 20 74 68 65 20 64  ust lie on the d
f8f0: 61 74 61 62 61 73 65 20 70 61 67 65 2e 20 20 2a  atabase page.  *
f900: 2f 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  /.        return
f910: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
f920: 42 4b 50 54 3b 20 0a 20 20 20 20 20 20 7d 0a 20  BKPT; .      }. 
f930: 20 20 20 20 20 6e 46 72 65 65 20 3d 20 6e 46 72       nFree = nFr
f940: 65 65 20 2b 20 73 69 7a 65 3b 0a 20 20 20 20 20  ee + size;.     
f950: 20 70 63 20 3d 20 6e 65 78 74 3b 0a 20 20 20 20   pc = next;.    
f960: 7d 0a 0a 20 20 20 20 2f 2a 20 41 74 20 74 68 69  }..    /* At thi
f970: 73 20 70 6f 69 6e 74 2c 20 6e 46 72 65 65 20 63  s point, nFree c
f980: 6f 6e 74 61 69 6e 73 20 74 68 65 20 73 75 6d 20  ontains the sum 
f990: 6f 66 20 74 68 65 20 6f 66 66 73 65 74 20 74 6f  of the offset to
f9a0: 20 74 68 65 20 73 74 61 72 74 0a 20 20 20 20 2a   the start.    *
f9b0: 2a 20 6f 66 20 74 68 65 20 63 65 6c 6c 2d 63 6f  * of the cell-co
f9c0: 6e 74 65 6e 74 20 61 72 65 61 20 70 6c 75 73 20  ntent area plus 
f9d0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 72  the number of fr
f9e0: 65 65 20 62 79 74 65 73 20 77 69 74 68 69 6e 0a  ee bytes within.
f9f0: 20 20 20 20 2a 2a 20 74 68 65 20 63 65 6c 6c 2d      ** the cell-
fa00: 63 6f 6e 74 65 6e 74 20 61 72 65 61 2e 20 49 66  content area. If
fa10: 20 74 68 69 73 20 69 73 20 67 72 65 61 74 65 72   this is greater
fa20: 20 74 68 61 6e 20 74 68 65 20 75 73 61 62 6c 65   than the usable
fa30: 2d 73 69 7a 65 0a 20 20 20 20 2a 2a 20 6f 66 20  -size.    ** of 
fa40: 74 68 65 20 70 61 67 65 2c 20 74 68 65 6e 20 74  the page, then t
fa50: 68 65 20 70 61 67 65 20 6d 75 73 74 20 62 65 20  he page must be 
fa60: 63 6f 72 72 75 70 74 65 64 2e 20 54 68 69 73 20  corrupted. This 
fa70: 63 68 65 63 6b 20 61 6c 73 6f 0a 20 20 20 20 2a  check also.    *
fa80: 2a 20 73 65 72 76 65 73 20 74 6f 20 76 65 72 69  * serves to veri
fa90: 66 79 20 74 68 61 74 20 74 68 65 20 6f 66 66 73  fy that the offs
faa0: 65 74 20 74 6f 20 74 68 65 20 73 74 61 72 74 20  et to the start 
fab0: 6f 66 20 74 68 65 20 63 65 6c 6c 2d 63 6f 6e 74  of the cell-cont
fac0: 65 6e 74 0a 20 20 20 20 2a 2a 20 61 72 65 61 2c  ent.    ** area,
fad0: 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68   according to th
fae0: 65 20 70 61 67 65 20 68 65 61 64 65 72 2c 20 6c  e page header, l
faf0: 69 65 73 20 77 69 74 68 69 6e 20 74 68 65 20 70  ies within the p
fb00: 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  age..    */.    
fb10: 69 66 28 20 6e 46 72 65 65 3e 75 73 61 62 6c 65  if( nFree>usable
fb20: 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 72 65  Size ){.      re
fb30: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
fb40: 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20 20 20 7d  UPT_BKPT; .    }
fb50: 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 46 72 65  .    pPage->nFre
fb60: 65 20 3d 20 28 75 31 36 29 28 6e 46 72 65 65 20  e = (u16)(nFree 
fb70: 2d 20 69 43 65 6c 6c 46 69 72 73 74 29 3b 0a 20  - iCellFirst);. 
fb80: 20 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74     pPage->isInit
fb90: 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 1;.  }.  retu
fba0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
fbb0: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 75 70 20 61 20  ./*.** Set up a 
fbc0: 72 61 77 20 70 61 67 65 20 73 6f 20 74 68 61 74  raw page so that
fbd0: 20 69 74 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20 61   it looks like a
fbe0: 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20 68   database page h
fbf0: 6f 6c 64 69 6e 67 0a 2a 2a 20 6e 6f 20 65 6e 74  olding.** no ent
fc00: 72 69 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ries..*/.static 
fc10: 76 6f 69 64 20 7a 65 72 6f 50 61 67 65 28 4d 65  void zeroPage(Me
fc20: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e  mPage *pPage, in
fc30: 74 20 66 6c 61 67 73 29 7b 0a 20 20 75 6e 73 69  t flags){.  unsi
fc40: 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61 20  gned char *data 
fc50: 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a  = pPage->aData;.
fc60: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
fc70: 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20  = pPage->pBt;.  
fc80: 75 38 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e  u8 hdr = pPage->
fc90: 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 75 31 36  hdrOffset;.  u16
fca0: 20 66 69 72 73 74 3b 0a 0a 20 20 61 73 73 65 72   first;..  asser
fcb0: 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 50  t( sqlite3PagerP
fcc0: 61 67 65 6e 75 6d 62 65 72 28 70 50 61 67 65 2d  agenumber(pPage-
fcd0: 3e 70 44 62 50 61 67 65 29 3d 3d 70 50 61 67 65  >pDbPage)==pPage
fce0: 2d 3e 70 67 6e 6f 20 29 3b 0a 20 20 61 73 73 65  ->pgno );.  asse
fcf0: 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
fd00: 47 65 74 45 78 74 72 61 28 70 50 61 67 65 2d 3e  GetExtra(pPage->
fd10: 70 44 62 50 61 67 65 29 20 3d 3d 20 28 76 6f 69  pDbPage) == (voi
fd20: 64 2a 29 70 50 61 67 65 20 29 3b 0a 20 20 61 73  d*)pPage );.  as
fd30: 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
fd40: 65 72 47 65 74 44 61 74 61 28 70 50 61 67 65 2d  erGetData(pPage-
fd50: 3e 70 44 62 50 61 67 65 29 20 3d 3d 20 64 61 74  >pDbPage) == dat
fd60: 61 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  a );.  assert( s
fd70: 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
fd80: 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
fd90: 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65  bPage) );.  asse
fda0: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
fdb0: 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
fdc0: 78 29 20 29 3b 0a 20 20 69 66 28 20 70 42 74 2d  x) );.  if( pBt-
fdd0: 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f  >btsFlags & BTS_
fde0: 53 45 43 55 52 45 5f 44 45 4c 45 54 45 20 29 7b  SECURE_DELETE ){
fdf0: 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 64 61 74  .    memset(&dat
fe00: 61 5b 68 64 72 5d 2c 20 30 2c 20 70 42 74 2d 3e  a[hdr], 0, pBt->
fe10: 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 68 64 72  usableSize - hdr
fe20: 29 3b 0a 20 20 7d 0a 20 20 64 61 74 61 5b 68 64  );.  }.  data[hd
fe30: 72 5d 20 3d 20 28 63 68 61 72 29 66 6c 61 67 73  r] = (char)flags
fe40: 3b 0a 20 20 66 69 72 73 74 20 3d 20 68 64 72 20  ;.  first = hdr 
fe50: 2b 20 28 28 66 6c 61 67 73 26 50 54 46 5f 4c 45  + ((flags&PTF_LE
fe60: 41 46 29 3d 3d 30 20 3f 20 31 32 20 3a 20 38 29  AF)==0 ? 12 : 8)
fe70: 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61  ;.  memset(&data
fe80: 5b 68 64 72 2b 31 5d 2c 20 30 2c 20 34 29 3b 0a  [hdr+1], 0, 4);.
fe90: 20 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20    data[hdr+7] = 
fea0: 30 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64  0;.  put2byte(&d
feb0: 61 74 61 5b 68 64 72 2b 35 5d 2c 20 70 42 74 2d  ata[hdr+5], pBt-
fec0: 3e 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20  >usableSize);.  
fed0: 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20 28  pPage->nFree = (
fee0: 75 31 36 29 28 70 42 74 2d 3e 75 73 61 62 6c 65  u16)(pBt->usable
fef0: 53 69 7a 65 20 2d 20 66 69 72 73 74 29 3b 0a 20  Size - first);. 
ff00: 20 64 65 63 6f 64 65 46 6c 61 67 73 28 70 50 61   decodeFlags(pPa
ff10: 67 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 50  ge, flags);.  pP
ff20: 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20  age->cellOffset 
ff30: 3d 20 66 69 72 73 74 3b 0a 20 20 70 50 61 67 65  = first;.  pPage
ff40: 2d 3e 61 44 61 74 61 45 6e 64 20 3d 20 26 64 61  ->aDataEnd = &da
ff50: 74 61 5b 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  ta[pBt->usableSi
ff60: 7a 65 5d 3b 0a 20 20 70 50 61 67 65 2d 3e 61 43  ze];.  pPage->aC
ff70: 65 6c 6c 49 64 78 20 3d 20 26 64 61 74 61 5b 66  ellIdx = &data[f
ff80: 69 72 73 74 5d 3b 0a 20 20 70 50 61 67 65 2d 3e  irst];.  pPage->
ff90: 61 44 61 74 61 4f 66 73 74 20 3d 20 26 64 61 74  aDataOfst = &dat
ffa0: 61 5b 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74  a[pPage->childPt
ffb0: 72 53 69 7a 65 5d 3b 0a 20 20 70 50 61 67 65 2d  rSize];.  pPage-
ffc0: 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a  >nOverflow = 0;.
ffd0: 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70    assert( pBt->p
ffe0: 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20  ageSize>=512 && 
fff0: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c 3d 36  pBt->pageSize<=6
10000 35 35 33 36 20 29 3b 0a 20 20 70 50 61 67 65 2d  5536 );.  pPage-
10010 3e 6d 61 73 6b 50 61 67 65 20 3d 20 28 75 31 36  >maskPage = (u16
10020 29 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  )(pBt->pageSize 
10030 2d 20 31 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e  - 1);.  pPage->n
10040 43 65 6c 6c 20 3d 20 30 3b 0a 20 20 70 50 61 67  Cell = 0;.  pPag
10050 65 2d 3e 69 73 49 6e 69 74 20 3d 20 31 3b 0a 7d  e->isInit = 1;.}
10060 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74  .../*.** Convert
10070 20 61 20 44 62 50 61 67 65 20 6f 62 74 61 69 6e   a DbPage obtain
10080 65 64 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65  ed from the page
10090 72 20 69 6e 74 6f 20 61 20 4d 65 6d 50 61 67 65  r into a MemPage
100a0 20 75 73 65 64 20 62 79 0a 2a 2a 20 74 68 65 20   used by.** the 
100b0 62 74 72 65 65 20 6c 61 79 65 72 2e 0a 2a 2f 0a  btree layer..*/.
100c0 73 74 61 74 69 63 20 4d 65 6d 50 61 67 65 20 2a  static MemPage *
100d0 62 74 72 65 65 50 61 67 65 46 72 6f 6d 44 62 50  btreePageFromDbP
100e0 61 67 65 28 44 62 50 61 67 65 20 2a 70 44 62 50  age(DbPage *pDbP
100f0 61 67 65 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c 20  age, Pgno pgno, 
10100 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
10110 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
10120 20 3d 20 28 4d 65 6d 50 61 67 65 2a 29 73 71 6c   = (MemPage*)sql
10130 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72  ite3PagerGetExtr
10140 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20 70 50  a(pDbPage);.  pP
10150 61 67 65 2d 3e 61 44 61 74 61 20 3d 20 73 71 6c  age->aData = sql
10160 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
10170 28 70 44 62 50 61 67 65 29 3b 0a 20 20 70 50 61  (pDbPage);.  pPa
10180 67 65 2d 3e 70 44 62 50 61 67 65 20 3d 20 70 44  ge->pDbPage = pD
10190 62 50 61 67 65 3b 0a 20 20 70 50 61 67 65 2d 3e  bPage;.  pPage->
101a0 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 70 50 61  pBt = pBt;.  pPa
101b0 67 65 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b  ge->pgno = pgno;
101c0 0a 20 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  .  pPage->hdrOff
101d0 73 65 74 20 3d 20 70 67 6e 6f 3d 3d 31 20 3f 20  set = pgno==1 ? 
101e0 31 30 30 20 3a 20 30 3b 0a 20 20 72 65 74 75 72  100 : 0;.  retur
101f0 6e 20 70 50 61 67 65 3b 20 0a 7d 0a 0a 2f 2a 0a  n pPage; .}../*.
10200 2a 2a 20 47 65 74 20 61 20 70 61 67 65 20 66 72  ** Get a page fr
10210 6f 6d 20 74 68 65 20 70 61 67 65 72 2e 20 20 49  om the pager.  I
10220 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 4d 65  nitialize the Me
10230 6d 50 61 67 65 2e 70 42 74 20 61 6e 64 0a 2a 2a  mPage.pBt and.**
10240 20 4d 65 6d 50 61 67 65 2e 61 44 61 74 61 20 65   MemPage.aData e
10250 6c 65 6d 65 6e 74 73 20 69 66 20 6e 65 65 64 65  lements if neede
10260 64 2e 20 20 53 65 65 20 61 6c 73 6f 3a 20 62 74  d.  See also: bt
10270 72 65 65 47 65 74 55 6e 75 73 65 64 50 61 67 65  reeGetUnusedPage
10280 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ()..**.** If the
10290 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e   PAGER_GET_NOCON
102a0 54 45 4e 54 20 66 6c 61 67 20 69 73 20 73 65 74  TENT flag is set
102b0 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  , it means that 
102c0 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 0a 2a  we do not care.*
102d0 2a 20 61 62 6f 75 74 20 74 68 65 20 63 6f 6e 74  * about the cont
102e0 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65 20  ent of the page 
102f0 61 74 20 74 68 69 73 20 74 69 6d 65 2e 20 20 53  at this time.  S
10300 6f 20 64 6f 20 6e 6f 74 20 67 6f 20 74 6f 20 74  o do not go to t
10310 68 65 20 64 69 73 6b 0a 2a 2a 20 74 6f 20 66 65  he disk.** to fe
10320 74 63 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 2e  tch the content.
10330 20 20 4a 75 73 74 20 66 69 6c 6c 20 69 6e 20 74    Just fill in t
10340 68 65 20 63 6f 6e 74 65 6e 74 20 77 69 74 68 20  he content with 
10350 7a 65 72 6f 73 20 66 6f 72 20 6e 6f 77 2e 0a 2a  zeros for now..*
10360 2a 20 49 66 20 69 6e 20 74 68 65 20 66 75 74 75  * If in the futu
10370 72 65 20 77 65 20 63 61 6c 6c 20 73 71 6c 69 74  re we call sqlit
10380 65 33 50 61 67 65 72 57 72 69 74 65 28 29 20 6f  e3PagerWrite() o
10390 6e 20 74 68 69 73 20 70 61 67 65 2c 20 74 68 61  n this page, tha
103a0 74 0a 2a 2a 20 6d 65 61 6e 73 20 77 65 20 68 61  t.** means we ha
103b0 76 65 20 73 74 61 72 74 65 64 20 74 6f 20 62 65  ve started to be
103c0 20 63 6f 6e 63 65 72 6e 65 64 20 61 62 6f 75 74   concerned about
103d0 20 63 6f 6e 74 65 6e 74 20 61 6e 64 20 74 68 65   content and the
103e0 20 64 69 73 6b 0a 2a 2a 20 72 65 61 64 20 73 68   disk.** read sh
103f0 6f 75 6c 64 20 6f 63 63 75 72 20 61 74 20 74 68  ould occur at th
10400 61 74 20 70 6f 69 6e 74 2e 0a 2a 2f 0a 73 74 61  at point..*/.sta
10410 74 69 63 20 69 6e 74 20 62 74 72 65 65 47 65 74  tic int btreeGet
10420 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64  Page(.  BtShared
10430 20 2a 70 42 74 2c 20 20 20 20 20 20 20 2f 2a 20   *pBt,       /* 
10440 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 50  The btree */.  P
10450 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20  gno pgno,       
10460 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
10470 20 74 68 65 20 70 61 67 65 20 74 6f 20 66 65 74   the page to fet
10480 63 68 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  ch */.  MemPage 
10490 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 2f 2a 20  **ppPage,    /* 
104a0 52 65 74 75 72 6e 20 74 68 65 20 70 61 67 65 20  Return the page 
104b0 69 6e 20 74 68 69 73 20 70 61 72 61 6d 65 74 65  in this paramete
104c0 72 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73  r */.  int flags
104d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
104e0 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45  AGER_GET_NOCONTE
104f0 4e 54 20 6f 72 20 50 41 47 45 52 5f 47 45 54 5f  NT or PAGER_GET_
10500 52 45 41 44 4f 4e 4c 59 20 2a 2f 0a 29 7b 0a 20  READONLY */.){. 
10510 20 69 6e 74 20 72 63 3b 0a 20 20 44 62 50 61 67   int rc;.  DbPag
10520 65 20 2a 70 44 62 50 61 67 65 3b 0a 0a 20 20 61  e *pDbPage;..  a
10530 73 73 65 72 74 28 20 66 6c 61 67 73 3d 3d 30 20  ssert( flags==0 
10540 7c 7c 20 66 6c 61 67 73 3d 3d 50 41 47 45 52 5f  || flags==PAGER_
10550 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 7c 7c  GET_NOCONTENT ||
10560 20 66 6c 61 67 73 3d 3d 50 41 47 45 52 5f 47 45   flags==PAGER_GE
10570 54 5f 52 45 41 44 4f 4e 4c 59 20 29 3b 0a 20 20  T_READONLY );.  
10580 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
10590 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
105a0 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 63 20 3d  mutex) );.  rc =
105b0 20 73 71 6c 69 74 65 33 50 61 67 65 72 41 63 71   sqlite3PagerAcq
105c0 75 69 72 65 28 70 42 74 2d 3e 70 50 61 67 65 72  uire(pBt->pPager
105d0 2c 20 70 67 6e 6f 2c 20 28 44 62 50 61 67 65 2a  , pgno, (DbPage*
105e0 2a 29 26 70 44 62 50 61 67 65 2c 20 66 6c 61 67  *)&pDbPage, flag
105f0 73 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72  s);.  if( rc ) r
10600 65 74 75 72 6e 20 72 63 3b 0a 20 20 2a 70 70 50  eturn rc;.  *ppP
10610 61 67 65 20 3d 20 62 74 72 65 65 50 61 67 65 46  age = btreePageF
10620 72 6f 6d 44 62 50 61 67 65 28 70 44 62 50 61 67  romDbPage(pDbPag
10630 65 2c 20 70 67 6e 6f 2c 20 70 42 74 29 3b 0a 20  e, pgno, pBt);. 
10640 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
10650 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72  K;.}../*.** Retr
10660 69 65 76 65 20 61 20 70 61 67 65 20 66 72 6f 6d  ieve a page from
10670 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65   the pager cache
10680 2e 20 49 66 20 74 68 65 20 72 65 71 75 65 73 74  . If the request
10690 65 64 20 70 61 67 65 20 69 73 20 6e 6f 74 0a 2a  ed page is not.*
106a0 2a 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65  * already in the
106b0 20 70 61 67 65 72 20 63 61 63 68 65 20 72 65 74   pager cache ret
106c0 75 72 6e 20 4e 55 4c 4c 2e 20 49 6e 69 74 69 61  urn NULL. Initia
106d0 6c 69 7a 65 20 74 68 65 20 4d 65 6d 50 61 67 65  lize the MemPage
106e0 2e 70 42 74 20 61 6e 64 0a 2a 2a 20 4d 65 6d 50  .pBt and.** MemP
106f0 61 67 65 2e 61 44 61 74 61 20 65 6c 65 6d 65 6e  age.aData elemen
10700 74 73 20 69 66 20 6e 65 65 64 65 64 2e 0a 2a 2f  ts if needed..*/
10710 0a 73 74 61 74 69 63 20 4d 65 6d 50 61 67 65 20  .static MemPage 
10720 2a 62 74 72 65 65 50 61 67 65 4c 6f 6f 6b 75 70  *btreePageLookup
10730 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
10740 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 44 62  Pgno pgno){.  Db
10750 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 20  Page *pDbPage;. 
10760 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
10770 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
10780 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70 44 62  >mutex) );.  pDb
10790 50 61 67 65 20 3d 20 73 71 6c 69 74 65 33 50 61  Page = sqlite3Pa
107a0 67 65 72 4c 6f 6f 6b 75 70 28 70 42 74 2d 3e 70  gerLookup(pBt->p
107b0 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20  Pager, pgno);.  
107c0 69 66 28 20 70 44 62 50 61 67 65 20 29 7b 0a 20  if( pDbPage ){. 
107d0 20 20 20 72 65 74 75 72 6e 20 62 74 72 65 65 50     return btreeP
107e0 61 67 65 46 72 6f 6d 44 62 50 61 67 65 28 70 44  ageFromDbPage(pD
107f0 62 50 61 67 65 2c 20 70 67 6e 6f 2c 20 70 42 74  bPage, pgno, pBt
10800 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
10810 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  0;.}../*.** Retu
10820 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  rn the size of t
10830 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
10840 20 69 6e 20 70 61 67 65 73 2e 20 49 66 20 74 68   in pages. If th
10850 65 72 65 20 69 73 20 61 6e 79 20 6b 69 6e 64 20  ere is any kind 
10860 6f 66 0a 2a 2a 20 65 72 72 6f 72 2c 20 72 65 74  of.** error, ret
10870 75 72 6e 20 28 28 75 6e 73 69 67 6e 65 64 20 69  urn ((unsigned i
10880 6e 74 29 2d 31 29 2e 0a 2a 2f 0a 73 74 61 74 69  nt)-1)..*/.stati
10890 63 20 50 67 6e 6f 20 62 74 72 65 65 50 61 67 65  c Pgno btreePage
108a0 63 6f 75 6e 74 28 42 74 53 68 61 72 65 64 20 2a  count(BtShared *
108b0 70 42 74 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  pBt){.  return p
108c0 42 74 2d 3e 6e 50 61 67 65 3b 0a 7d 0a 75 33 32  Bt->nPage;.}.u32
108d0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 61 73   sqlite3BtreeLas
108e0 74 50 61 67 65 28 42 74 72 65 65 20 2a 70 29 7b  tPage(Btree *p){
108f0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
10900 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65  e3BtreeHoldsMute
10910 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74  x(p) );.  assert
10920 28 20 28 28 70 2d 3e 70 42 74 2d 3e 6e 50 61 67  ( ((p->pBt->nPag
10930 65 29 26 30 78 38 30 30 30 30 30 30 29 3d 3d 30  e)&0x8000000)==0
10940 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 62 74 72   );.  return btr
10950 65 65 50 61 67 65 63 6f 75 6e 74 28 70 2d 3e 70  eePagecount(p->p
10960 42 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  Bt);.}../*.** Ge
10970 74 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68  t a page from th
10980 65 20 70 61 67 65 72 20 61 6e 64 20 69 6e 69 74  e pager and init
10990 69 61 6c 69 7a 65 20 69 74 2e 0a 2a 2a 0a 2a 2a  ialize it..**.**
109a0 20 49 66 20 70 43 75 72 21 3d 30 20 74 68 65 6e   If pCur!=0 then
109b0 20 74 68 65 20 70 61 67 65 20 69 73 20 62 65 69   the page is bei
109c0 6e 67 20 66 65 74 63 68 65 64 20 61 73 20 70 61  ng fetched as pa
109d0 72 74 20 6f 66 20 61 20 6d 6f 76 65 54 6f 43 68  rt of a moveToCh
109e0 69 6c 64 28 29 0a 2a 2a 20 63 61 6c 6c 2e 20 20  ild().** call.  
109f0 44 6f 20 61 64 64 69 74 69 6f 6e 61 6c 20 73 61  Do additional sa
10a00 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 6f 6e  nity checking on
10a10 20 74 68 65 20 70 61 67 65 20 69 6e 20 74 68 69   the page in thi
10a20 73 20 63 61 73 65 2e 0a 2a 2a 20 41 6e 64 20 69  s case..** And i
10a30 66 20 74 68 65 20 66 65 74 63 68 20 66 61 69 6c  f the fetch fail
10a40 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  s, this routine 
10a50 6d 75 73 74 20 64 65 63 72 65 6d 65 6e 74 20 70  must decrement p
10a60 43 75 72 2d 3e 69 50 61 67 65 2e 0a 2a 2a 0a 2a  Cur->iPage..**.*
10a70 2a 20 54 68 65 20 70 61 67 65 20 69 73 20 66 65  * The page is fe
10a80 74 63 68 65 64 20 61 73 20 72 65 61 64 2d 77 72  tched as read-wr
10a90 69 74 65 20 75 6e 6c 65 73 73 20 70 43 75 72 20  ite unless pCur 
10aa0 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 61 6e 64 20  is not NULL and 
10ab0 69 73 0a 2a 2a 20 61 20 72 65 61 64 2d 6f 6e 6c  is.** a read-onl
10ac0 79 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20  y cursor..**.** 
10ad0 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
10ae0 72 73 2c 20 74 68 65 6e 20 2a 70 70 50 61 67 65  rs, then *ppPage
10af0 20 69 73 20 75 6e 64 65 66 69 6e 65 64 2e 20 49   is undefined. I
10b00 74 0a 2a 2a 20 6d 61 79 20 72 65 6d 61 69 6e 20  t.** may remain 
10b10 75 6e 63 68 61 6e 67 65 64 2c 20 6f 72 20 69 74  unchanged, or it
10b20 20 6d 61 79 20 62 65 20 73 65 74 20 74 6f 20 61   may be set to a
10b30 6e 20 69 6e 76 61 6c 69 64 20 76 61 6c 75 65 2e  n invalid value.
10b40 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67  .*/.static int g
10b50 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28 0a 20  etAndInitPage(. 
10b60 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20   BtShared *pBt, 
10b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10b80 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
10b90 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20   file */.  Pgno 
10ba0 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20  pgno,           
10bb0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
10bc0 6d 62 65 72 20 6f 66 20 74 68 65 20 70 61 67 65  mber of the page
10bd0 20 74 6f 20 67 65 74 20 2a 2f 0a 20 20 4d 65 6d   to get */.  Mem
10be0 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20  Page **ppPage,  
10bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10c00 57 72 69 74 65 20 74 68 65 20 70 61 67 65 20 70  Write the page p
10c10 6f 69 6e 74 65 72 20 68 65 72 65 20 2a 2f 0a 20  ointer here */. 
10c20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c   BtCursor *pCur,
10c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10c40 20 2f 2a 20 43 75 72 73 6f 72 20 74 6f 20 72 65   /* Cursor to re
10c50 63 65 69 76 65 20 74 68 65 20 70 61 67 65 2c 20  ceive the page, 
10c60 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74  or NULL */.  int
10c70 20 62 52 65 61 64 4f 6e 6c 79 20 20 20 20 20 20   bReadOnly      
10c80 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10c90 54 72 75 65 20 66 6f 72 20 61 20 72 65 61 64 2d  True for a read-
10ca0 6f 6e 6c 79 20 70 61 67 65 20 2a 2f 0a 29 7b 0a  only page */.){.
10cb0 20 20 69 6e 74 20 72 63 3b 0a 20 20 44 62 50 61    int rc;.  DbPa
10cc0 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 20 20 61  ge *pDbPage;.  a
10cd0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
10ce0 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
10cf0 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
10d00 74 28 20 70 43 75 72 3d 3d 30 20 7c 7c 20 70 70  t( pCur==0 || pp
10d10 50 61 67 65 3d 3d 26 70 43 75 72 2d 3e 61 70 50  Page==&pCur->apP
10d20 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
10d30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
10d40 75 72 3d 3d 30 20 7c 7c 20 62 52 65 61 64 4f 6e  ur==0 || bReadOn
10d50 6c 79 3d 3d 70 43 75 72 2d 3e 63 75 72 50 61 67  ly==pCur->curPag
10d60 65 72 46 6c 61 67 73 20 29 3b 0a 20 20 61 73 73  erFlags );.  ass
10d70 65 72 74 28 20 70 43 75 72 3d 3d 30 20 7c 7c 20  ert( pCur==0 || 
10d80 70 43 75 72 2d 3e 69 50 61 67 65 3e 30 20 29 3b  pCur->iPage>0 );
10d90 0a 0a 20 20 69 66 28 20 70 67 6e 6f 3e 62 74 72  ..  if( pgno>btr
10da0 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29  eePagecount(pBt)
10db0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
10dc0 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
10dd0 3b 0a 20 20 20 20 67 6f 74 6f 20 67 65 74 41 6e  ;.    goto getAn
10de0 64 49 6e 69 74 50 61 67 65 5f 65 72 72 6f 72 3b  dInitPage_error;
10df0 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69  .  }.  rc = sqli
10e00 74 65 33 50 61 67 65 72 41 63 71 75 69 72 65 28  te3PagerAcquire(
10e10 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 67 6e  pBt->pPager, pgn
10e20 6f 2c 20 28 44 62 50 61 67 65 2a 2a 29 26 70 44  o, (DbPage**)&pD
10e30 62 50 61 67 65 2c 20 62 52 65 61 64 4f 6e 6c 79  bPage, bReadOnly
10e40 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
10e50 20 20 20 67 6f 74 6f 20 67 65 74 41 6e 64 49 6e     goto getAndIn
10e60 69 74 50 61 67 65 5f 65 72 72 6f 72 3b 0a 20 20  itPage_error;.  
10e70 7d 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 62 74  }.  *ppPage = bt
10e80 72 65 65 50 61 67 65 46 72 6f 6d 44 62 50 61 67  reePageFromDbPag
10e90 65 28 70 44 62 50 61 67 65 2c 20 70 67 6e 6f 2c  e(pDbPage, pgno,
10ea0 20 70 42 74 29 3b 0a 20 20 69 66 28 20 28 2a 70   pBt);.  if( (*p
10eb0 70 50 61 67 65 29 2d 3e 69 73 49 6e 69 74 3d 3d  pPage)->isInit==
10ec0 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 62 74  0 ){.    rc = bt
10ed0 72 65 65 49 6e 69 74 50 61 67 65 28 2a 70 70 50  reeInitPage(*ppP
10ee0 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
10ef0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
10f00 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
10f10 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20 20  (*ppPage);.     
10f20 20 67 6f 74 6f 20 67 65 74 41 6e 64 49 6e 69 74   goto getAndInit
10f30 50 61 67 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20  Page_error;.    
10f40 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 6f  }.  }..  /* If o
10f50 62 74 61 69 6e 69 6e 67 20 61 20 63 68 69 6c 64  btaining a child
10f60 20 70 61 67 65 20 66 6f 72 20 61 20 63 75 72 73   page for a curs
10f70 6f 72 2c 20 77 65 20 6d 75 73 74 20 76 65 72 69  or, we must veri
10f80 66 79 20 74 68 61 74 20 74 68 65 20 70 61 67 65  fy that the page
10f90 20 69 73 0a 20 20 2a 2a 20 63 6f 6d 70 61 74 69   is.  ** compati
10fa0 62 6c 65 20 77 69 74 68 20 74 68 65 20 72 6f 6f  ble with the roo
10fb0 74 20 70 61 67 65 2e 20 2a 2f 0a 20 20 69 66 28  t page. */.  if(
10fc0 20 70 43 75 72 0a 20 20 20 26 26 20 28 28 2a 70   pCur.   && ((*p
10fd0 70 50 61 67 65 29 2d 3e 6e 43 65 6c 6c 3c 31 20  pPage)->nCell<1 
10fe0 7c 7c 20 28 2a 70 70 50 61 67 65 29 2d 3e 69 6e  || (*ppPage)->in
10ff0 74 4b 65 79 21 3d 70 43 75 72 2d 3e 63 75 72 49  tKey!=pCur->curI
11000 6e 74 4b 65 79 29 0a 20 20 29 7b 0a 20 20 20 20  ntKey).  ){.    
11010 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
11020 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65  UPT_BKPT;.    re
11030 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50 61 67  leasePage(*ppPag
11040 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 67 65 74  e);.    goto get
11050 41 6e 64 49 6e 69 74 50 61 67 65 5f 65 72 72 6f  AndInitPage_erro
11060 72 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  r;.  }.  return 
11070 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 67 65 74 41  SQLITE_OK;..getA
11080 6e 64 49 6e 69 74 50 61 67 65 5f 65 72 72 6f 72  ndInitPage_error
11090 3a 0a 20 20 69 66 28 20 70 43 75 72 20 29 20 70  :.  if( pCur ) p
110a0 43 75 72 2d 3e 69 50 61 67 65 2d 2d 3b 0a 20 20  Cur->iPage--;.  
110b0 74 65 73 74 63 61 73 65 28 20 70 67 6e 6f 3d 3d  testcase( pgno==
110c0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
110d0 67 6e 6f 21 3d 30 20 7c 7c 20 72 63 3d 3d 53 51  gno!=0 || rc==SQ
110e0 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 29 3b 0a  LITE_CORRUPT );.
110f0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
11100 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20  /*.** Release a 
11110 4d 65 6d 50 61 67 65 2e 20 20 54 68 69 73 20 73  MemPage.  This s
11120 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65 64 20  hould be called 
11130 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 70 72  once for each pr
11140 69 6f 72 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 62  ior.** call to b
11150 74 72 65 65 47 65 74 50 61 67 65 2e 0a 2a 2f 0a  treeGetPage..*/.
11160 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65  static void rele
11170 61 73 65 50 61 67 65 4e 6f 74 4e 75 6c 6c 28 4d  asePageNotNull(M
11180 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a  emPage *pPage){.
11190 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
111a0 3e 61 44 61 74 61 20 29 3b 0a 20 20 61 73 73 65  >aData );.  asse
111b0 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 20 29  rt( pPage->pBt )
111c0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
111d0 65 2d 3e 70 44 62 50 61 67 65 21 3d 30 20 29 3b  e->pDbPage!=0 );
111e0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
111f0 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28  e3PagerGetExtra(
11200 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
11210 3d 3d 20 28 76 6f 69 64 2a 29 70 50 61 67 65 20  == (void*)pPage 
11220 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
11230 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
11240 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
11250 3d 3d 70 50 61 67 65 2d 3e 61 44 61 74 61 20 29  ==pPage->aData )
11260 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
11270 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
11280 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
11290 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61  ) );.  sqlite3Pa
112a0 67 65 72 55 6e 72 65 66 4e 6f 74 4e 75 6c 6c 28  gerUnrefNotNull(
112b0 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b  pPage->pDbPage);
112c0 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  .}.static void r
112d0 65 6c 65 61 73 65 50 61 67 65 28 4d 65 6d 50 61  eleasePage(MemPa
112e0 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 69 66  ge *pPage){.  if
112f0 28 20 70 50 61 67 65 20 29 20 72 65 6c 65 61 73  ( pPage ) releas
11300 65 50 61 67 65 4e 6f 74 4e 75 6c 6c 28 70 50 61  ePageNotNull(pPa
11310 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  ge);.}../*.** Ge
11320 74 20 61 6e 20 75 6e 75 73 65 64 20 70 61 67 65  t an unused page
11330 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 6f 72  ..**.** This wor
11340 6b 73 20 6a 75 73 74 20 6c 69 6b 65 20 62 74 72  ks just like btr
11350 65 65 47 65 74 50 61 67 65 28 29 20 77 69 74 68  eeGetPage() with
11360 20 74 68 65 20 61 64 64 69 74 69 6f 6e 3a 0a 2a   the addition:.*
11370 2a 0a 2a 2a 20 20 20 2a 20 20 49 66 20 74 68 65  *.**   *  If the
11380 20 70 61 67 65 20 69 73 20 61 6c 72 65 61 64 79   page is already
11390 20 69 6e 20 75 73 65 20 66 6f 72 20 73 6f 6d 65   in use for some
113a0 20 6f 74 68 65 72 20 70 75 72 70 6f 73 65 2c 20   other purpose, 
113b0 69 6d 6d 65 64 69 61 74 65 6c 79 0a 2a 2a 20 20  immediately.**  
113c0 20 20 20 20 72 65 6c 65 61 73 65 20 69 74 20 61      release it a
113d0 6e 64 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c  nd return an SQL
113e0 49 54 45 5f 43 55 52 52 55 50 54 20 65 72 72 6f  ITE_CURRUPT erro
113f0 72 2e 0a 2a 2a 20 20 20 2a 20 20 4d 61 6b 65 20  r..**   *  Make 
11400 73 75 72 65 20 74 68 65 20 69 73 49 6e 69 74 20  sure the isInit 
11410 66 6c 61 67 20 69 73 20 63 6c 65 61 72 0a 2a 2f  flag is clear.*/
11420 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65  .static int btre
11430 65 47 65 74 55 6e 75 73 65 64 50 61 67 65 28 0a  eGetUnusedPage(.
11440 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c    BtShared *pBt,
11450 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74         /* The bt
11460 72 65 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67  ree */.  Pgno pg
11470 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  no,           /*
11480 20 4e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70   Number of the p
11490 61 67 65 20 74 6f 20 66 65 74 63 68 20 2a 2f 0a  age to fetch */.
114a0 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61    MemPage **ppPa
114b0 67 65 2c 20 20 20 20 2f 2a 20 52 65 74 75 72 6e  ge,    /* Return
114c0 20 74 68 65 20 70 61 67 65 20 69 6e 20 74 68 69   the page in thi
114d0 73 20 70 61 72 61 6d 65 74 65 72 20 2a 2f 0a 20  s parameter */. 
114e0 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20   int flags      
114f0 20 20 20 20 20 20 2f 2a 20 50 41 47 45 52 5f 47        /* PAGER_G
11500 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 6f 72 20  ET_NOCONTENT or 
11510 50 41 47 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e  PAGER_GET_READON
11520 4c 59 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  LY */.){.  int r
11530 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65  c = btreeGetPage
11540 28 70 42 74 2c 20 70 67 6e 6f 2c 20 70 70 50 61  (pBt, pgno, ppPa
11550 67 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20 69 66  ge, flags);.  if
11560 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
11570 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  ){.    if( sqlit
11580 65 33 50 61 67 65 72 50 61 67 65 52 65 66 63 6f  e3PagerPageRefco
11590 75 6e 74 28 28 2a 70 70 50 61 67 65 29 2d 3e 70  unt((*ppPage)->p
115a0 44 62 50 61 67 65 29 3e 31 20 29 7b 0a 20 20 20  DbPage)>1 ){.   
115b0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a     releasePage(*
115c0 70 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 2a  ppPage);.      *
115d0 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20  ppPage = 0;.    
115e0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
115f0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
11600 20 20 7d 0a 20 20 20 20 28 2a 70 70 50 61 67 65    }.    (*ppPage
11610 29 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20  )->isInit = 0;. 
11620 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 70 50   }else{.    *ppP
11630 61 67 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  age = 0;.  }.  r
11640 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
11650 0a 2a 2a 20 44 75 72 69 6e 67 20 61 20 72 6f 6c  .** During a rol
11660 6c 62 61 63 6b 2c 20 77 68 65 6e 20 74 68 65 20  lback, when the 
11670 70 61 67 65 72 20 72 65 6c 6f 61 64 73 20 69 6e  pager reloads in
11680 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 74 6f 20 74  formation into t
11690 68 65 20 63 61 63 68 65 0a 2a 2a 20 73 6f 20 74  he cache.** so t
116a0 68 61 74 20 74 68 65 20 63 61 63 68 65 20 69 73  hat the cache is
116b0 20 72 65 73 74 6f 72 65 64 20 74 6f 20 69 74 73   restored to its
116c0 20 6f 72 69 67 69 6e 61 6c 20 73 74 61 74 65 20   original state 
116d0 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 0a  at the start of.
116e0 2a 2a 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  ** the transacti
116f0 6f 6e 2c 20 66 6f 72 20 65 61 63 68 20 70 61 67  on, for each pag
11700 65 20 72 65 73 74 6f 72 65 64 20 74 68 69 73 20  e restored this 
11710 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
11720 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  d..**.** This ro
11730 75 74 69 6e 65 20 6e 65 65 64 73 20 74 6f 20 72  utine needs to r
11740 65 73 65 74 20 74 68 65 20 65 78 74 72 61 20 64  eset the extra d
11750 61 74 61 20 73 65 63 74 69 6f 6e 20 61 74 20 74  ata section at t
11760 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a  he end of the.**
11770 20 70 61 67 65 20 74 6f 20 61 67 72 65 65 20 77   page to agree w
11780 69 74 68 20 74 68 65 20 72 65 73 74 6f 72 65 64  ith the restored
11790 20 64 61 74 61 2e 0a 2a 2f 0a 73 74 61 74 69 63   data..*/.static
117a0 20 76 6f 69 64 20 70 61 67 65 52 65 69 6e 69 74   void pageReinit
117b0 28 44 62 50 61 67 65 20 2a 70 44 61 74 61 29 7b  (DbPage *pData){
117c0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
117d0 65 3b 0a 20 20 70 50 61 67 65 20 3d 20 28 4d 65  e;.  pPage = (Me
117e0 6d 50 61 67 65 20 2a 29 73 71 6c 69 74 65 33 50  mPage *)sqlite3P
117f0 61 67 65 72 47 65 74 45 78 74 72 61 28 70 44 61  agerGetExtra(pDa
11800 74 61 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ta);.  assert( s
11810 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 52  qlite3PagerPageR
11820 65 66 63 6f 75 6e 74 28 70 44 61 74 61 29 3e 30  efcount(pData)>0
11830 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d   );.  if( pPage-
11840 3e 69 73 49 6e 69 74 20 29 7b 0a 20 20 20 20 61  >isInit ){.    a
11850 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
11860 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
11870 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
11880 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69      pPage->isIni
11890 74 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 73  t = 0;.    if( s
118a0 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 52  qlite3PagerPageR
118b0 65 66 63 6f 75 6e 74 28 70 44 61 74 61 29 3e 31  efcount(pData)>1
118c0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 70 50 61   ){.      /* pPa
118d0 67 65 20 6d 69 67 68 74 20 6e 6f 74 20 62 65 20  ge might not be 
118e0 61 20 62 74 72 65 65 20 70 61 67 65 3b 20 20 69  a btree page;  i
118f0 74 20 6d 69 67 68 74 20 62 65 20 61 6e 20 6f 76  t might be an ov
11900 65 72 66 6c 6f 77 20 70 61 67 65 0a 20 20 20 20  erflow page.    
11910 20 20 2a 2a 20 6f 72 20 70 74 72 6d 61 70 20 70    ** or ptrmap p
11920 61 67 65 20 6f 72 20 61 20 66 72 65 65 20 70 61  age or a free pa
11930 67 65 2e 20 20 49 6e 20 74 68 6f 73 65 20 63 61  ge.  In those ca
11940 73 65 73 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69  ses, the followi
11950 6e 67 0a 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c  ng.      ** call
11960 20 74 6f 20 62 74 72 65 65 49 6e 69 74 50 61 67   to btreeInitPag
11970 65 28 29 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 20  e() will likely 
11980 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
11990 52 52 55 50 54 2e 0a 20 20 20 20 20 20 2a 2a 20  RRUPT..      ** 
119a0 42 75 74 20 6e 6f 20 68 61 72 6d 20 69 73 20 64  But no harm is d
119b0 6f 6e 65 20 62 79 20 74 68 69 73 2e 20 20 41 6e  one by this.  An
119c0 64 20 69 74 20 69 73 20 76 65 72 79 20 69 6d 70  d it is very imp
119d0 6f 72 74 61 6e 74 20 74 68 61 74 0a 20 20 20 20  ortant that.    
119e0 20 20 2a 2a 20 62 74 72 65 65 49 6e 69 74 50 61    ** btreeInitPa
119f0 67 65 28 29 20 62 65 20 63 61 6c 6c 65 64 20 6f  ge() be called o
11a00 6e 20 65 76 65 72 79 20 62 74 72 65 65 20 70 61  n every btree pa
11a10 67 65 20 73 6f 20 77 65 20 6d 61 6b 65 0a 20 20  ge so we make.  
11a20 20 20 20 20 2a 2a 20 74 68 65 20 63 61 6c 6c 20      ** the call 
11a30 66 6f 72 20 65 76 65 72 79 20 70 61 67 65 20 74  for every page t
11a40 68 61 74 20 63 6f 6d 65 73 20 69 6e 20 66 6f 72  hat comes in for
11a50 20 72 65 2d 69 6e 69 74 69 6e 67 2e 20 2a 2f 0a   re-initing. */.
11a60 20 20 20 20 20 20 62 74 72 65 65 49 6e 69 74 50        btreeInitP
11a70 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20  age(pPage);.    
11a80 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  }.  }.}../*.** I
11a90 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68  nvoke the busy h
11aa0 61 6e 64 6c 65 72 20 66 6f 72 20 61 20 62 74 72  andler for a btr
11ab0 65 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ee..*/.static in
11ac0 74 20 62 74 72 65 65 49 6e 76 6f 6b 65 42 75 73  t btreeInvokeBus
11ad0 79 48 61 6e 64 6c 65 72 28 76 6f 69 64 20 2a 70  yHandler(void *p
11ae0 41 72 67 29 7b 0a 20 20 42 74 53 68 61 72 65 64  Arg){.  BtShared
11af0 20 2a 70 42 74 20 3d 20 28 42 74 53 68 61 72 65   *pBt = (BtShare
11b00 64 2a 29 70 41 72 67 3b 0a 20 20 61 73 73 65 72  d*)pArg;.  asser
11b10 74 28 20 70 42 74 2d 3e 64 62 20 29 3b 0a 20 20  t( pBt->db );.  
11b20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
11b30 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
11b40 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
11b50 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 49 6e  return sqlite3In
11b60 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 28  vokeBusyHandler(
11b70 26 70 42 74 2d 3e 64 62 2d 3e 62 75 73 79 48 61  &pBt->db->busyHa
11b80 6e 64 6c 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ndler);.}../*.**
11b90 20 4f 70 65 6e 20 61 20 64 61 74 61 62 61 73 65   Open a database
11ba0 20 66 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20 7a 46   file..** .** zF
11bb0 69 6c 65 6e 61 6d 65 20 69 73 20 74 68 65 20 6e  ilename is the n
11bc0 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ame of the datab
11bd0 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20 7a 46  ase file.  If zF
11be0 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55 4c 4c 0a  ilename is NULL.
11bf0 2a 2a 20 74 68 65 6e 20 61 6e 20 65 70 68 65 6d  ** then an ephem
11c00 65 72 61 6c 20 64 61 74 61 62 61 73 65 20 69 73  eral database is
11c10 20 63 72 65 61 74 65 64 2e 20 20 54 68 65 20 65   created.  The e
11c20 70 68 65 6d 65 72 61 6c 20 64 61 74 61 62 61 73  phemeral databas
11c30 65 20 6d 69 67 68 74 0a 2a 2a 20 62 65 20 65 78  e might.** be ex
11c40 63 6c 75 73 69 76 65 6c 79 20 69 6e 20 6d 65 6d  clusively in mem
11c50 6f 72 79 2c 20 6f 72 20 69 74 20 6d 69 67 68 74  ory, or it might
11c60 20 75 73 65 20 61 20 64 69 73 6b 2d 62 61 73 65   use a disk-base
11c70 64 20 6d 65 6d 6f 72 79 20 63 61 63 68 65 2e 0a  d memory cache..
11c80 2a 2a 20 45 69 74 68 65 72 20 77 61 79 2c 20 74  ** Either way, t
11c90 68 65 20 65 70 68 65 6d 65 72 61 6c 20 64 61 74  he ephemeral dat
11ca0 61 62 61 73 65 20 77 69 6c 6c 20 62 65 20 61 75  abase will be au
11cb0 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65  tomatically dele
11cc0 74 65 64 20 0a 2a 2a 20 77 68 65 6e 20 73 71 6c  ted .** when sql
11cd0 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 28 29  ite3BtreeClose()
11ce0 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a   is called..**.*
11cf0 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69  * If zFilename i
11d00 73 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 74 68 65  s ":memory:" the
11d10 6e 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  n an in-memory d
11d20 61 74 61 62 61 73 65 20 69 73 20 63 72 65 61 74  atabase is creat
11d30 65 64 0a 2a 2a 20 74 68 61 74 20 69 73 20 61 75  ed.** that is au
11d40 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 73 74  tomatically dest
11d50 72 6f 79 65 64 20 77 68 65 6e 20 69 74 20 69 73  royed when it is
11d60 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54   closed..**.** T
11d70 68 65 20 22 66 6c 61 67 73 22 20 70 61 72 61 6d  he "flags" param
11d80 65 74 65 72 20 69 73 20 61 20 62 69 74 6d 61 73  eter is a bitmas
11d90 6b 20 74 68 61 74 20 6d 69 67 68 74 20 63 6f 6e  k that might con
11da0 74 61 69 6e 20 62 69 74 73 20 6c 69 6b 65 0a 2a  tain bits like.*
11db0 2a 20 42 54 52 45 45 5f 4f 4d 49 54 5f 4a 4f 55  * BTREE_OMIT_JOU
11dc0 52 4e 41 4c 20 61 6e 64 2f 6f 72 20 42 54 52 45  RNAL and/or BTRE
11dd0 45 5f 4d 45 4d 4f 52 59 2e 0a 2a 2a 0a 2a 2a 20  E_MEMORY..**.** 
11de0 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  If the database 
11df0 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 65  is already opene
11e00 64 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64 61  d in the same da
11e10 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
11e20 6e 0a 2a 2a 20 61 6e 64 20 77 65 20 61 72 65 20  n.** and we are 
11e30 69 6e 20 73 68 61 72 65 64 20 63 61 63 68 65 20  in shared cache 
11e40 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68 65 20 6f  mode, then the o
11e50 70 65 6e 20 77 69 6c 6c 20 66 61 69 6c 20 77 69  pen will fail wi
11e60 74 68 20 61 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f  th an.** SQLITE_
11e70 43 4f 4e 53 54 52 41 49 4e 54 20 65 72 72 6f 72  CONSTRAINT error
11e80 2e 20 20 57 65 20 63 61 6e 6e 6f 74 20 61 6c 6c  .  We cannot all
11e90 6f 77 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 42  ow two or more B
11ea0 74 53 68 61 72 65 64 0a 2a 2a 20 6f 62 6a 65 63  tShared.** objec
11eb0 74 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64  ts in the same d
11ec0 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
11ed0 6f 6e 20 73 69 6e 63 65 20 64 6f 69 6e 67 20 73  on since doing s
11ee0 6f 20 77 69 6c 6c 20 6c 65 61 64 0a 2a 2a 20 74  o will lead.** t
11ef0 6f 20 70 72 6f 62 6c 65 6d 73 20 77 69 74 68 20  o problems with 
11f00 6c 6f 63 6b 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20  locking..*/.int 
11f10 73 71 6c 69 74 65 33 42 74 72 65 65 4f 70 65 6e  sqlite3BtreeOpen
11f20 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  (.  sqlite3_vfs 
11f30 2a 70 56 66 73 2c 20 20 20 20 20 20 2f 2a 20 56  *pVfs,      /* V
11f40 46 53 20 74 6f 20 75 73 65 20 66 6f 72 20 74 68  FS to use for th
11f50 69 73 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20 63  is b-tree */.  c
11f60 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
11f70 6e 61 6d 65 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f  name,  /* Name o
11f80 66 20 74 68 65 20 66 69 6c 65 20 63 6f 6e 74 61  f the file conta
11f90 69 6e 69 6e 67 20 74 68 65 20 42 54 72 65 65 20  ining the BTree 
11fa0 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 73 71  database */.  sq
11fb0 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20  lite3 *db,      
11fc0 20 20 20 20 20 20 2f 2a 20 41 73 73 6f 63 69 61        /* Associa
11fd0 74 65 64 20 64 61 74 61 62 61 73 65 20 68 61 6e  ted database han
11fe0 64 6c 65 20 2a 2f 0a 20 20 42 74 72 65 65 20 2a  dle */.  Btree *
11ff0 2a 70 70 42 74 72 65 65 2c 20 20 20 20 20 20 20  *ppBtree,       
12000 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 6e   /* Pointer to n
12010 65 77 20 42 74 72 65 65 20 6f 62 6a 65 63 74 20  ew Btree object 
12020 77 72 69 74 74 65 6e 20 68 65 72 65 20 2a 2f 0a  written here */.
12030 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20    int flags,    
12040 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 74            /* Opt
12050 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 76 66  ions */.  int vf
12060 73 46 6c 61 67 73 20 20 20 20 20 20 20 20 20 20  sFlags          
12070 20 20 2f 2a 20 46 6c 61 67 73 20 70 61 73 73 65    /* Flags passe
12080 64 20 74 68 72 6f 75 67 68 20 74 6f 20 73 71 6c  d through to sql
12090 69 74 65 33 5f 76 66 73 2e 78 4f 70 65 6e 28 29  ite3_vfs.xOpen()
120a0 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68 61 72 65   */.){.  BtShare
120b0 64 20 2a 70 42 74 20 3d 20 30 3b 20 20 20 20 20  d *pBt = 0;     
120c0 20 20 20 20 20 20 20 20 2f 2a 20 53 68 61 72 65          /* Share
120d0 64 20 70 61 72 74 20 6f 66 20 62 74 72 65 65 20  d part of btree 
120e0 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 42  structure */.  B
120f0 74 72 65 65 20 2a 70 3b 20 20 20 20 20 20 20 20  tree *p;        
12100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
12110 20 48 61 6e 64 6c 65 20 74 6f 20 72 65 74 75 72   Handle to retur
12120 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d  n */.  sqlite3_m
12130 75 74 65 78 20 2a 6d 75 74 65 78 4f 70 65 6e 20  utex *mutexOpen 
12140 3d 20 30 3b 20 20 2f 2a 20 50 72 65 76 65 6e 74  = 0;  /* Prevent
12150 73 20 61 20 72 61 63 65 20 63 6f 6e 64 69 74 69  s a race conditi
12160 6f 6e 2e 20 54 69 63 6b 65 74 20 23 33 35 33 37  on. Ticket #3537
12170 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   */.  int rc = S
12180 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
12190 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63       /* Result c
121a0 6f 64 65 20 66 72 6f 6d 20 74 68 69 73 20 66 75  ode from this fu
121b0 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 75 38 20 6e  nction */.  u8 n
121c0 52 65 73 65 72 76 65 3b 20 20 20 20 20 20 20 20  Reserve;        
121d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79             /* By
121e0 74 65 20 6f 66 20 75 6e 75 73 65 64 20 73 70 61  te of unused spa
121f0 63 65 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20  ce on each page 
12200 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
12210 61 72 20 7a 44 62 48 65 61 64 65 72 5b 31 30 30  ar zDbHeader[100
12220 5d 3b 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20  ];  /* Database 
12230 68 65 61 64 65 72 20 63 6f 6e 74 65 6e 74 20 2a  header content *
12240 2f 0a 0a 20 20 2f 2a 20 54 72 75 65 20 69 66 20  /..  /* True if 
12250 6f 70 65 6e 69 6e 67 20 61 6e 20 65 70 68 65 6d  opening an ephem
12260 65 72 61 6c 2c 20 74 65 6d 70 6f 72 61 72 79 20  eral, temporary 
12270 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 63 6f  database */.  co
12280 6e 73 74 20 69 6e 74 20 69 73 54 65 6d 70 44 62  nst int isTempDb
12290 20 3d 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30 20   = zFilename==0 
122a0 7c 7c 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 3d  || zFilename[0]=
122b0 3d 30 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68  =0;..  /* Set th
122c0 65 20 76 61 72 69 61 62 6c 65 20 69 73 4d 65 6d  e variable isMem
122d0 64 62 20 74 6f 20 74 72 75 65 20 66 6f 72 20 61  db to true for a
122e0 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
122f0 62 61 73 65 2c 20 6f 72 20 0a 20 20 2a 2a 20 66  base, or .  ** f
12300 61 6c 73 65 20 66 6f 72 20 61 20 66 69 6c 65 2d  alse for a file-
12310 62 61 73 65 64 20 64 61 74 61 62 61 73 65 2e 0a  based database..
12320 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49    */.#ifdef SQLI
12330 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42  TE_OMIT_MEMORYDB
12340 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 73 4d  .  const int isM
12350 65 6d 64 62 20 3d 20 30 3b 0a 23 65 6c 73 65 0a  emdb = 0;.#else.
12360 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 73 4d 65    const int isMe
12370 6d 64 62 20 3d 20 28 7a 46 69 6c 65 6e 61 6d 65  mdb = (zFilename
12380 20 26 26 20 73 74 72 63 6d 70 28 7a 46 69 6c 65   && strcmp(zFile
12390 6e 61 6d 65 2c 20 22 3a 6d 65 6d 6f 72 79 3a 22  name, ":memory:"
123a0 29 3d 3d 30 29 0a 20 20 20 20 20 20 20 20 20 20  )==0).          
123b0 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
123c0 28 69 73 54 65 6d 70 44 62 20 26 26 20 73 71 6c  (isTempDb && sql
123d0 69 74 65 33 54 65 6d 70 49 6e 4d 65 6d 6f 72 79  ite3TempInMemory
123e0 28 64 62 29 29 0a 20 20 20 20 20 20 20 20 20 20  (db)).          
123f0 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
12400 28 76 66 73 46 6c 61 67 73 20 26 20 53 51 4c 49  (vfsFlags & SQLI
12410 54 45 5f 4f 50 45 4e 5f 4d 45 4d 4f 52 59 29 21  TE_OPEN_MEMORY)!
12420 3d 30 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73  =0;.#endif..  as
12430 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20  sert( db!=0 );. 
12440 20 61 73 73 65 72 74 28 20 70 56 66 73 21 3d 30   assert( pVfs!=0
12450 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
12460 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
12470 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  (db->mutex) );. 
12480 20 61 73 73 65 72 74 28 20 28 66 6c 61 67 73 26   assert( (flags&
12490 30 78 66 66 29 3d 3d 66 6c 61 67 73 20 29 3b 20  0xff)==flags ); 
124a0 20 20 2f 2a 20 66 6c 61 67 73 20 66 69 74 20 69    /* flags fit i
124b0 6e 20 38 20 62 69 74 73 20 2a 2f 0a 0a 20 20 2f  n 8 bits */..  /
124c0 2a 20 4f 6e 6c 79 20 61 20 42 54 52 45 45 5f 53  * Only a BTREE_S
124d0 49 4e 47 4c 45 20 64 61 74 61 62 61 73 65 20 63  INGLE database c
124e0 61 6e 20 62 65 20 42 54 52 45 45 5f 55 4e 4f 52  an be BTREE_UNOR
124f0 44 45 52 45 44 20 2a 2f 0a 20 20 61 73 73 65 72  DERED */.  asser
12500 74 28 20 28 66 6c 61 67 73 20 26 20 42 54 52 45  t( (flags & BTRE
12510 45 5f 55 4e 4f 52 44 45 52 45 44 29 3d 3d 30 20  E_UNORDERED)==0 
12520 7c 7c 20 28 66 6c 61 67 73 20 26 20 42 54 52 45  || (flags & BTRE
12530 45 5f 53 49 4e 47 4c 45 29 21 3d 30 20 29 3b 0a  E_SINGLE)!=0 );.
12540 0a 20 20 2f 2a 20 41 20 42 54 52 45 45 5f 53 49  .  /* A BTREE_SI
12550 4e 47 4c 45 20 64 61 74 61 62 61 73 65 20 69 73  NGLE database is
12560 20 61 6c 77 61 79 73 20 61 20 74 65 6d 70 6f 72   always a tempor
12570 61 72 79 20 61 6e 64 2f 6f 72 20 65 70 68 65 6d  ary and/or ephem
12580 65 72 61 6c 20 2a 2f 0a 20 20 61 73 73 65 72 74  eral */.  assert
12590 28 20 28 66 6c 61 67 73 20 26 20 42 54 52 45 45  ( (flags & BTREE
125a0 5f 53 49 4e 47 4c 45 29 3d 3d 30 20 7c 7c 20 69  _SINGLE)==0 || i
125b0 73 54 65 6d 70 44 62 20 29 3b 0a 0a 20 20 69 66  sTempDb );..  if
125c0 28 20 69 73 4d 65 6d 64 62 20 29 7b 0a 20 20 20  ( isMemdb ){.   
125d0 20 66 6c 61 67 73 20 7c 3d 20 42 54 52 45 45 5f   flags |= BTREE_
125e0 4d 45 4d 4f 52 59 3b 0a 20 20 7d 0a 20 20 69 66  MEMORY;.  }.  if
125f0 28 20 28 76 66 73 46 6c 61 67 73 20 26 20 53 51  ( (vfsFlags & SQ
12600 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44  LITE_OPEN_MAIN_D
12610 42 29 21 3d 30 20 26 26 20 28 69 73 4d 65 6d 64  B)!=0 && (isMemd
12620 62 20 7c 7c 20 69 73 54 65 6d 70 44 62 29 20 29  b || isTempDb) )
12630 7b 0a 20 20 20 20 76 66 73 46 6c 61 67 73 20 3d  {.    vfsFlags =
12640 20 28 76 66 73 46 6c 61 67 73 20 26 20 7e 53 51   (vfsFlags & ~SQ
12650 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44  LITE_OPEN_MAIN_D
12660 42 29 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  B) | SQLITE_OPEN
12670 5f 54 45 4d 50 5f 44 42 3b 0a 20 20 7d 0a 20 20  _TEMP_DB;.  }.  
12680 70 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  p = sqlite3Mallo
12690 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28 42 74 72  cZero(sizeof(Btr
126a0 65 65 29 29 3b 0a 20 20 69 66 28 20 21 70 20 29  ee));.  if( !p )
126b0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
126c0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20  ITE_NOMEM;.  }. 
126d0 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52   p->inTrans = TR
126e0 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 70 2d 3e 64  ANS_NONE;.  p->d
126f0 62 20 3d 20 64 62 3b 0a 23 69 66 6e 64 65 66 20  b = db;.#ifndef 
12700 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
12710 45 44 5f 43 41 43 48 45 0a 20 20 70 2d 3e 6c 6f  ED_CACHE.  p->lo
12720 63 6b 2e 70 42 74 72 65 65 20 3d 20 70 3b 0a 20  ck.pBtree = p;. 
12730 20 70 2d 3e 6c 6f 63 6b 2e 69 54 61 62 6c 65 20   p->lock.iTable 
12740 3d 20 31 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66  = 1;.#endif..#if
12750 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
12760 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
12770 48 45 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  HE) && !defined(
12780 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b  SQLITE_OMIT_DISK
12790 49 4f 29 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49 66  IO).  /*.  ** If
127a0 20 74 68 69 73 20 42 74 72 65 65 20 69 73 20 61   this Btree is a
127b0 20 63 61 6e 64 69 64 61 74 65 20 66 6f 72 20 73   candidate for s
127c0 68 61 72 65 64 20 63 61 63 68 65 2c 20 74 72 79  hared cache, try
127d0 20 74 6f 20 66 69 6e 64 20 61 6e 0a 20 20 2a 2a   to find an.  **
127e0 20 65 78 69 73 74 69 6e 67 20 42 74 53 68 61 72   existing BtShar
127f0 65 64 20 6f 62 6a 65 63 74 20 74 68 61 74 20 77  ed object that w
12800 65 20 63 61 6e 20 73 68 61 72 65 20 77 69 74 68  e can share with
12810 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 54 65  .  */.  if( isTe
12820 6d 70 44 62 3d 3d 30 20 26 26 20 28 69 73 4d 65  mpDb==0 && (isMe
12830 6d 64 62 3d 3d 30 20 7c 7c 20 28 76 66 73 46 6c  mdb==0 || (vfsFl
12840 61 67 73 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  ags&SQLITE_OPEN_
12850 55 52 49 29 21 3d 30 29 20 29 7b 0a 20 20 20 20  URI)!=0) ){.    
12860 69 66 28 20 76 66 73 46 6c 61 67 73 20 26 20 53  if( vfsFlags & S
12870 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 48 41 52 45  QLITE_OPEN_SHARE
12880 44 43 41 43 48 45 20 29 7b 0a 20 20 20 20 20 20  DCACHE ){.      
12890 69 6e 74 20 6e 46 69 6c 65 6e 61 6d 65 20 3d 20  int nFilename = 
128a0 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
128b0 7a 46 69 6c 65 6e 61 6d 65 29 2b 31 3b 0a 20 20  zFilename)+1;.  
128c0 20 20 20 20 69 6e 74 20 6e 46 75 6c 6c 50 61 74      int nFullPat
128d0 68 6e 61 6d 65 20 3d 20 70 56 66 73 2d 3e 6d 78  hname = pVfs->mx
128e0 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20 20 20  Pathname+1;.    
128f0 20 20 63 68 61 72 20 2a 7a 46 75 6c 6c 50 61 74    char *zFullPat
12900 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d  hname = sqlite3M
12910 61 6c 6c 6f 63 28 4d 41 58 28 6e 46 75 6c 6c 50  alloc(MAX(nFullP
12920 61 74 68 6e 61 6d 65 2c 6e 46 69 6c 65 6e 61 6d  athname,nFilenam
12930 65 29 29 3b 0a 20 20 20 20 20 20 4d 55 54 45 58  e));.      MUTEX
12940 5f 4c 4f 47 49 43 28 20 73 71 6c 69 74 65 33 5f  _LOGIC( sqlite3_
12950 6d 75 74 65 78 20 2a 6d 75 74 65 78 53 68 61 72  mutex *mutexShar
12960 65 64 3b 20 29 0a 0a 20 20 20 20 20 20 70 2d 3e  ed; )..      p->
12970 73 68 61 72 61 62 6c 65 20 3d 20 31 3b 0a 20 20  sharable = 1;.  
12980 20 20 20 20 69 66 28 20 21 7a 46 75 6c 6c 50 61      if( !zFullPa
12990 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20  thname ){.      
129a0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
129b0 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
129c0 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
129d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
129e0 28 20 69 73 4d 65 6d 64 62 20 29 7b 0a 20 20 20  ( isMemdb ){.   
129f0 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 46 75 6c       memcpy(zFul
12a00 6c 50 61 74 68 6e 61 6d 65 2c 20 7a 46 69 6c 65  lPathname, zFile
12a10 6e 61 6d 65 2c 20 6e 46 69 6c 65 6e 61 6d 65 29  name, nFilename)
12a20 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
12a30 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
12a40 74 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d  te3OsFullPathnam
12a50 65 28 70 56 66 73 2c 20 7a 46 69 6c 65 6e 61 6d  e(pVfs, zFilenam
12a60 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
12a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12a80 20 20 20 20 20 20 6e 46 75 6c 6c 50 61 74 68 6e        nFullPathn
12a90 61 6d 65 2c 20 7a 46 75 6c 6c 50 61 74 68 6e 61  ame, zFullPathna
12aa0 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  me);.        if(
12ab0 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20   rc ){.         
12ac0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 46   sqlite3_free(zF
12ad0 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  ullPathname);.  
12ae0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
12af0 66 72 65 65 28 70 29 3b 0a 20 20 20 20 20 20 20  free(p);.       
12b00 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
12b10 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
12b20 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52 45 41  #if SQLITE_THREA
12b30 44 53 41 46 45 0a 20 20 20 20 20 20 6d 75 74 65  DSAFE.      mute
12b40 78 4f 70 65 6e 20 3d 20 73 71 6c 69 74 65 33 4d  xOpen = sqlite3M
12b50 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45  utexAlloc(SQLITE
12b60 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4f 50  _MUTEX_STATIC_OP
12b70 45 4e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  EN);.      sqlit
12b80 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d  e3_mutex_enter(m
12b90 75 74 65 78 4f 70 65 6e 29 3b 0a 20 20 20 20 20  utexOpen);.     
12ba0 20 6d 75 74 65 78 53 68 61 72 65 64 20 3d 20 73   mutexShared = s
12bb0 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63  qlite3MutexAlloc
12bc0 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54  (SQLITE_MUTEX_ST
12bd0 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 0a 20 20  ATIC_MASTER);.  
12be0 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
12bf0 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 53 68 61  x_enter(mutexSha
12c00 72 65 64 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  red);.#endif.   
12c10 20 20 20 66 6f 72 28 70 42 74 3d 47 4c 4f 42 41     for(pBt=GLOBA
12c20 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69  L(BtShared*,sqli
12c30 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69  te3SharedCacheLi
12c40 73 74 29 3b 20 70 42 74 3b 20 70 42 74 3d 70 42  st); pBt; pBt=pB
12c50 74 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  t->pNext){.     
12c60 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e     assert( pBt->
12c70 6e 52 65 66 3e 30 20 29 3b 0a 20 20 20 20 20 20  nRef>0 );.      
12c80 20 20 69 66 28 20 30 3d 3d 73 74 72 63 6d 70 28    if( 0==strcmp(
12c90 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 73  zFullPathname, s
12ca0 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65 6e  qlite3PagerFilen
12cb0 61 6d 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  ame(pBt->pPager,
12cc0 20 30 29 29 0a 20 20 20 20 20 20 20 20 20 20 20   0)).           
12cd0 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33        && sqlite3
12ce0 50 61 67 65 72 56 66 73 28 70 42 74 2d 3e 70 50  PagerVfs(pBt->pP
12cf0 61 67 65 72 29 3d 3d 70 56 66 73 20 29 7b 0a 20  ager)==pVfs ){. 
12d00 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 44 62           int iDb
12d10 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28  ;.          for(
12d20 69 44 62 3d 64 62 2d 3e 6e 44 62 2d 31 3b 20 69  iDb=db->nDb-1; i
12d30 44 62 3e 3d 30 3b 20 69 44 62 2d 2d 29 7b 0a 20  Db>=0; iDb--){. 
12d40 20 20 20 20 20 20 20 20 20 20 20 42 74 72 65 65             Btree
12d50 20 2a 70 45 78 69 73 74 69 6e 67 20 3d 20 64 62   *pExisting = db
12d60 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74 3b 0a  ->aDb[iDb].pBt;.
12d70 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
12d80 70 45 78 69 73 74 69 6e 67 20 26 26 20 70 45 78  pExisting && pEx
12d90 69 73 74 69 6e 67 2d 3e 70 42 74 3d 3d 70 42 74  isting->pBt==pBt
12da0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
12db0 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
12dc0 6c 65 61 76 65 28 6d 75 74 65 78 53 68 61 72 65  leave(mutexShare
12dd0 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  d);.            
12de0 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
12df0 6c 65 61 76 65 28 6d 75 74 65 78 4f 70 65 6e 29  leave(mutexOpen)
12e00 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
12e10 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 46 75  sqlite3_free(zFu
12e20 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20  llPathname);.   
12e30 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
12e40 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20  e3_free(p);.    
12e50 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
12e60 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
12e70 4e 54 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  NT;.            
12e80 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  }.          }.  
12e90 20 20 20 20 20 20 20 20 70 2d 3e 70 42 74 20 3d          p->pBt =
12ea0 20 70 42 74 3b 0a 20 20 20 20 20 20 20 20 20 20   pBt;.          
12eb0 70 42 74 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20  pBt->nRef++;.   
12ec0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
12ed0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
12ee0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
12ef0 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 53  tex_leave(mutexS
12f00 68 61 72 65 64 29 3b 0a 20 20 20 20 20 20 73 71  hared);.      sq
12f10 6c 69 74 65 33 5f 66 72 65 65 28 7a 46 75 6c 6c  lite3_free(zFull
12f20 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 7d  Pathname);.    }
12f30 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
12f40 45 42 55 47 0a 20 20 20 20 65 6c 73 65 7b 0a 20  EBUG.    else{. 
12f50 20 20 20 20 20 2f 2a 20 49 6e 20 64 65 62 75 67       /* In debug
12f60 20 6d 6f 64 65 2c 20 77 65 20 6d 61 72 6b 20 61   mode, we mark a
12f70 6c 6c 20 70 65 72 73 69 73 74 65 6e 74 20 64 61  ll persistent da
12f80 74 61 62 61 73 65 73 20 61 73 20 73 68 61 72 61  tabases as shara
12f90 62 6c 65 0a 20 20 20 20 20 20 2a 2a 20 65 76 65  ble.      ** eve
12fa0 6e 20 77 68 65 6e 20 74 68 65 79 20 61 72 65 20  n when they are 
12fb0 6e 6f 74 2e 20 20 54 68 69 73 20 65 78 65 72 63  not.  This exerc
12fc0 69 73 65 73 20 74 68 65 20 6c 6f 63 6b 69 6e 67  ises the locking
12fd0 20 63 6f 64 65 20 61 6e 64 0a 20 20 20 20 20 20   code and.      
12fe0 2a 2a 20 67 69 76 65 73 20 6d 6f 72 65 20 6f 70  ** gives more op
12ff0 70 6f 72 74 75 6e 69 74 79 20 66 6f 72 20 61 73  portunity for as
13000 73 65 72 74 73 28 73 71 6c 69 74 65 33 5f 6d 75  serts(sqlite3_mu
13010 74 65 78 5f 68 65 6c 64 28 29 29 0a 20 20 20 20  tex_held()).    
13020 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 20    ** statements 
13030 74 6f 20 66 69 6e 64 20 6c 6f 63 6b 69 6e 67 20  to find locking 
13040 70 72 6f 62 6c 65 6d 73 2e 0a 20 20 20 20 20 20  problems..      
13050 2a 2f 0a 20 20 20 20 20 20 70 2d 3e 73 68 61 72  */.      p->shar
13060 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  able = 1;.    }.
13070 23 65 6e 64 69 66 0a 20 20 7d 0a 23 65 6e 64 69  #endif.  }.#endi
13080 66 0a 20 20 69 66 28 20 70 42 74 3d 3d 30 20 29  f.  if( pBt==0 )
13090 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  {.    /*.    ** 
130a0 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73  The following as
130b0 73 65 72 74 73 20 6d 61 6b 65 20 73 75 72 65 20  serts make sure 
130c0 74 68 61 74 20 73 74 72 75 63 74 75 72 65 73 20  that structures 
130d0 75 73 65 64 20 62 79 20 74 68 65 20 62 74 72 65  used by the btre
130e0 65 20 61 72 65 0a 20 20 20 20 2a 2a 20 74 68 65  e are.    ** the
130f0 20 72 69 67 68 74 20 73 69 7a 65 2e 20 20 54 68   right size.  Th
13100 69 73 20 69 73 20 74 6f 20 67 75 61 72 64 20 61  is is to guard a
13110 67 61 69 6e 73 74 20 73 69 7a 65 20 63 68 61 6e  gainst size chan
13120 67 65 73 20 74 68 61 74 20 72 65 73 75 6c 74 0a  ges that result.
13130 20 20 20 20 2a 2a 20 77 68 65 6e 20 63 6f 6d 70      ** when comp
13140 69 6c 69 6e 67 20 6f 6e 20 61 20 64 69 66 66 65  iling on a diffe
13150 72 65 6e 74 20 61 72 63 68 69 74 65 63 74 75 72  rent architectur
13160 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  e..    */.    as
13170 73 65 72 74 28 20 73 69 7a 65 6f 66 28 69 36 34  sert( sizeof(i64
13180 29 3d 3d 38 20 29 3b 0a 20 20 20 20 61 73 73 65  )==8 );.    asse
13190 72 74 28 20 73 69 7a 65 6f 66 28 75 36 34 29 3d  rt( sizeof(u64)=
131a0 3d 38 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =8 );.    assert
131b0 28 20 73 69 7a 65 6f 66 28 75 33 32 29 3d 3d 34  ( sizeof(u32)==4
131c0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
131d0 73 69 7a 65 6f 66 28 75 31 36 29 3d 3d 32 20 29  sizeof(u16)==2 )
131e0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69  ;.    assert( si
131f0 7a 65 6f 66 28 50 67 6e 6f 29 3d 3d 34 20 29 3b  zeof(Pgno)==4 );
13200 0a 20 20 0a 20 20 20 20 70 42 74 20 3d 20 73 71  .  .    pBt = sq
13210 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28  lite3MallocZero(
13220 20 73 69 7a 65 6f 66 28 2a 70 42 74 29 20 29 3b   sizeof(*pBt) );
13230 0a 20 20 20 20 69 66 28 20 70 42 74 3d 3d 30 20  .    if( pBt==0 
13240 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
13250 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
13260 20 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65    goto btree_ope
13270 6e 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20  n_out;.    }.   
13280 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
13290 65 72 4f 70 65 6e 28 70 56 66 73 2c 20 26 70 42  erOpen(pVfs, &pB
132a0 74 2d 3e 70 50 61 67 65 72 2c 20 7a 46 69 6c 65  t->pPager, zFile
132b0 6e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20  name,.          
132c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
132d0 45 58 54 52 41 5f 53 49 5a 45 2c 20 66 6c 61 67  EXTRA_SIZE, flag
132e0 73 2c 20 76 66 73 46 6c 61 67 73 2c 20 70 61 67  s, vfsFlags, pag
132f0 65 52 65 69 6e 69 74 29 3b 0a 20 20 20 20 69 66  eReinit);.    if
13300 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
13310 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
13320 50 61 67 65 72 53 65 74 4d 6d 61 70 4c 69 6d 69  PagerSetMmapLimi
13330 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 64  t(pBt->pPager, d
13340 62 2d 3e 73 7a 4d 6d 61 70 29 3b 0a 20 20 20 20  b->szMmap);.    
13350 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
13360 67 65 72 52 65 61 64 46 69 6c 65 68 65 61 64 65  gerReadFileheade
13370 72 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 73 69  r(pBt->pPager,si
13380 7a 65 6f 66 28 7a 44 62 48 65 61 64 65 72 29 2c  zeof(zDbHeader),
13390 7a 44 62 48 65 61 64 65 72 29 3b 0a 20 20 20 20  zDbHeader);.    
133a0 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  }.    if( rc!=SQ
133b0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
133c0 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e   goto btree_open
133d0 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _out;.    }.    
133e0 70 42 74 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 3d  pBt->openFlags =
133f0 20 28 75 38 29 66 6c 61 67 73 3b 0a 20 20 20 20   (u8)flags;.    
13400 70 42 74 2d 3e 64 62 20 3d 20 64 62 3b 0a 20 20  pBt->db = db;.  
13410 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65    sqlite3PagerSe
13420 74 42 75 73 79 68 61 6e 64 6c 65 72 28 70 42 74  tBusyhandler(pBt
13430 2d 3e 70 50 61 67 65 72 2c 20 62 74 72 65 65 49  ->pPager, btreeI
13440 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72  nvokeBusyHandler
13450 2c 20 70 42 74 29 3b 0a 20 20 20 20 70 2d 3e 70  , pBt);.    p->p
13460 42 74 20 3d 20 70 42 74 3b 0a 20 20 0a 20 20 20  Bt = pBt;.  .   
13470 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20   pBt->pCursor = 
13480 30 3b 0a 20 20 20 20 70 42 74 2d 3e 70 50 61 67  0;.    pBt->pPag
13490 65 31 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  e1 = 0;.    if( 
134a0 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 72 65  sqlite3PagerIsre
134b0 61 64 6f 6e 6c 79 28 70 42 74 2d 3e 70 50 61 67  adonly(pBt->pPag
134c0 65 72 29 20 29 20 70 42 74 2d 3e 62 74 73 46 6c  er) ) pBt->btsFl
134d0 61 67 73 20 7c 3d 20 42 54 53 5f 52 45 41 44 5f  ags |= BTS_READ_
134e0 4f 4e 4c 59 3b 0a 23 69 66 64 65 66 20 53 51 4c  ONLY;.#ifdef SQL
134f0 49 54 45 5f 53 45 43 55 52 45 5f 44 45 4c 45 54  ITE_SECURE_DELET
13500 45 0a 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c  E.    pBt->btsFl
13510 61 67 73 20 7c 3d 20 42 54 53 5f 53 45 43 55 52  ags |= BTS_SECUR
13520 45 5f 44 45 4c 45 54 45 3b 0a 23 65 6e 64 69 66  E_DELETE;.#endif
13530 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45  .    /* EVIDENCE
13540 2d 4f 46 3a 20 52 2d 35 31 38 37 33 2d 33 39 36  -OF: R-51873-396
13550 31 38 20 54 68 65 20 70 61 67 65 20 73 69 7a 65  18 The page size
13560 20 66 6f 72 20 61 20 64 61 74 61 62 61 73 65 20   for a database 
13570 66 69 6c 65 20 69 73 0a 20 20 20 20 2a 2a 20 64  file is.    ** d
13580 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65  etermined by the
13590 20 32 2d 62 79 74 65 20 69 6e 74 65 67 65 72 20   2-byte integer 
135a0 6c 6f 63 61 74 65 64 20 61 74 20 61 6e 20 6f 66  located at an of
135b0 66 73 65 74 20 6f 66 20 31 36 20 62 79 74 65 73  fset of 16 bytes
135c0 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 74 68 65   from.    ** the
135d0 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68   beginning of th
135e0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
135f0 20 2a 2f 0a 20 20 20 20 70 42 74 2d 3e 70 61 67   */.    pBt->pag
13600 65 53 69 7a 65 20 3d 20 28 7a 44 62 48 65 61 64  eSize = (zDbHead
13610 65 72 5b 31 36 5d 3c 3c 38 29 20 7c 20 28 7a 44  er[16]<<8) | (zD
13620 62 48 65 61 64 65 72 5b 31 37 5d 3c 3c 31 36 29  bHeader[17]<<16)
13630 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 70  ;.    if( pBt->p
13640 61 67 65 53 69 7a 65 3c 35 31 32 20 7c 7c 20 70  ageSize<512 || p
13650 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 53 51 4c  Bt->pageSize>SQL
13660 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a  ITE_MAX_PAGE_SIZ
13670 45 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 28 28  E.         || ((
13680 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2d 31 29  pBt->pageSize-1)
13690 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 21  &pBt->pageSize)!
136a0 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d  =0 ){.      pBt-
136b0 3e 70 61 67 65 53 69 7a 65 20 3d 20 30 3b 0a 23  >pageSize = 0;.#
136c0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
136d0 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
136e0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6d 61      /* If the ma
136f0 67 69 63 20 6e 61 6d 65 20 22 3a 6d 65 6d 6f 72  gic name ":memor
13700 79 3a 22 20 77 69 6c 6c 20 63 72 65 61 74 65 20  y:" will create 
13710 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  an in-memory dat
13720 61 62 61 73 65 2c 20 74 68 65 6e 0a 20 20 20 20  abase, then.    
13730 20 20 2a 2a 20 6c 65 61 76 65 20 74 68 65 20 61    ** leave the a
13740 75 74 6f 56 61 63 75 75 6d 20 6d 6f 64 65 20 61  utoVacuum mode a
13750 74 20 30 20 28 64 6f 20 6e 6f 74 20 61 75 74 6f  t 0 (do not auto
13760 2d 76 61 63 75 75 6d 29 2c 20 65 76 65 6e 20 69  -vacuum), even i
13770 66 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54  f.      ** SQLIT
13780 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41  E_DEFAULT_AUTOVA
13790 43 55 55 4d 20 69 73 20 74 72 75 65 2e 20 4f 6e  CUUM is true. On
137a0 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2c   the other hand,
137b0 20 69 66 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c   if.      ** SQL
137c0 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44  ITE_OMIT_MEMORYD
137d0 42 20 68 61 73 20 62 65 65 6e 20 64 65 66 69 6e  B has been defin
137e0 65 64 2c 20 74 68 65 6e 20 22 3a 6d 65 6d 6f 72  ed, then ":memor
137f0 79 3a 22 20 69 73 20 6a 75 73 74 20 61 0a 20 20  y:" is just a.  
13800 20 20 20 20 2a 2a 20 72 65 67 75 6c 61 72 20 66      ** regular f
13810 69 6c 65 2d 6e 61 6d 65 2e 20 49 6e 20 74 68 69  ile-name. In thi
13820 73 20 63 61 73 65 20 74 68 65 20 61 75 74 6f 2d  s case the auto-
13830 76 61 63 75 75 6d 20 61 70 70 6c 69 65 73 20 61  vacuum applies a
13840 73 20 70 65 72 20 6e 6f 72 6d 61 6c 2e 0a 20 20  s per normal..  
13850 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
13860 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 21 69   zFilename && !i
13870 73 4d 65 6d 64 62 20 29 7b 0a 20 20 20 20 20 20  sMemdb ){.      
13880 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75    pBt->autoVacuu
13890 6d 20 3d 20 28 53 51 4c 49 54 45 5f 44 45 46 41  m = (SQLITE_DEFA
138a0 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 3f  ULT_AUTOVACUUM ?
138b0 20 31 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 20   1 : 0);.       
138c0 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d   pBt->incrVacuum
138d0 20 3d 20 28 53 51 4c 49 54 45 5f 44 45 46 41 55   = (SQLITE_DEFAU
138e0 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 3d 3d 32  LT_AUTOVACUUM==2
138f0 20 3f 20 31 20 3a 20 30 29 3b 0a 20 20 20 20 20   ? 1 : 0);.     
13900 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
13910 6e 52 65 73 65 72 76 65 20 3d 20 30 3b 0a 20 20  nReserve = 0;.  
13920 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f    }else{.      /
13930 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
13940 2d 33 37 34 39 37 2d 34 32 34 31 32 20 54 68 65  -37497-42412 The
13950 20 73 69 7a 65 20 6f 66 20 74 68 65 20 72 65 73   size of the res
13960 65 72 76 65 64 20 72 65 67 69 6f 6e 20 69 73 0a  erved region is.
13970 20 20 20 20 20 20 2a 2a 20 64 65 74 65 72 6d 69        ** determi
13980 6e 65 64 20 62 79 20 74 68 65 20 6f 6e 65 2d 62  ned by the one-b
13990 79 74 65 20 75 6e 73 69 67 6e 65 64 20 69 6e 74  yte unsigned int
139a0 65 67 65 72 20 66 6f 75 6e 64 20 61 74 20 61 6e  eger found at an
139b0 20 6f 66 66 73 65 74 20 6f 66 20 32 30 0a 20 20   offset of 20.  
139c0 20 20 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20      ** into the 
139d0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 65  database file he
139e0 61 64 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 6e  ader. */.      n
139f0 52 65 73 65 72 76 65 20 3d 20 7a 44 62 48 65 61  Reserve = zDbHea
13a00 64 65 72 5b 32 30 5d 3b 0a 20 20 20 20 20 20 70  der[20];.      p
13a10 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20  Bt->btsFlags |= 
13a20 42 54 53 5f 50 41 47 45 53 49 5a 45 5f 46 49 58  BTS_PAGESIZE_FIX
13a30 45 44 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  ED;.#ifndef SQLI
13a40 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
13a50 55 4d 0a 20 20 20 20 20 20 70 42 74 2d 3e 61 75  UM.      pBt->au
13a60 74 6f 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34  toVacuum = (get4
13a70 62 79 74 65 28 26 7a 44 62 48 65 61 64 65 72 5b  byte(&zDbHeader[
13a80 33 36 20 2b 20 34 2a 34 5d 29 3f 31 3a 30 29 3b  36 + 4*4])?1:0);
13a90 0a 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 63 72  .      pBt->incr
13aa0 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79  Vacuum = (get4by
13ab0 74 65 28 26 7a 44 62 48 65 61 64 65 72 5b 33 36  te(&zDbHeader[36
13ac0 20 2b 20 37 2a 34 5d 29 3f 31 3a 30 29 3b 0a 23   + 7*4])?1:0);.#
13ad0 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20  endif.    }.    
13ae0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
13af0 72 53 65 74 50 61 67 65 73 69 7a 65 28 70 42 74  rSetPagesize(pBt
13b00 2d 3e 70 50 61 67 65 72 2c 20 26 70 42 74 2d 3e  ->pPager, &pBt->
13b10 70 61 67 65 53 69 7a 65 2c 20 6e 52 65 73 65 72  pageSize, nReser
13b20 76 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  ve);.    if( rc 
13b30 29 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65  ) goto btree_ope
13b40 6e 5f 6f 75 74 3b 0a 20 20 20 20 70 42 74 2d 3e  n_out;.    pBt->
13b50 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74  usableSize = pBt
13b60 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 6e 52 65  ->pageSize - nRe
13b70 73 65 72 76 65 3b 0a 20 20 20 20 61 73 73 65 72  serve;.    asser
13b80 74 28 20 28 70 42 74 2d 3e 70 61 67 65 53 69 7a  t( (pBt->pageSiz
13b90 65 20 26 20 37 29 3d 3d 30 20 29 3b 20 20 2f 2a  e & 7)==0 );  /*
13ba0 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 6d 65 6e   8-byte alignmen
13bb0 74 20 6f 66 20 70 61 67 65 53 69 7a 65 20 2a 2f  t of pageSize */
13bc0 0a 20 20 20 0a 23 69 66 20 21 64 65 66 69 6e 65  .   .#if !define
13bd0 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  d(SQLITE_OMIT_SH
13be0 41 52 45 44 5f 43 41 43 48 45 29 20 26 26 20 21  ARED_CACHE) && !
13bf0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
13c00 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20 20 20  MIT_DISKIO).    
13c10 2f 2a 20 41 64 64 20 74 68 65 20 6e 65 77 20 42  /* Add the new B
13c20 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74 20 74  tShared object t
13c30 6f 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73  o the linked lis
13c40 74 20 73 68 61 72 61 62 6c 65 20 42 74 53 68 61  t sharable BtSha
13c50 72 65 64 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  reds..    */.   
13c60 20 69 66 28 20 70 2d 3e 73 68 61 72 61 62 6c 65   if( p->sharable
13c70 20 29 7b 0a 20 20 20 20 20 20 4d 55 54 45 58 5f   ){.      MUTEX_
13c80 4c 4f 47 49 43 28 20 73 71 6c 69 74 65 33 5f 6d  LOGIC( sqlite3_m
13c90 75 74 65 78 20 2a 6d 75 74 65 78 53 68 61 72 65  utex *mutexShare
13ca0 64 3b 20 29 0a 20 20 20 20 20 20 70 42 74 2d 3e  d; ).      pBt->
13cb0 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 20 20  nRef = 1;.      
13cc0 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20 6d 75 74  MUTEX_LOGIC( mut
13cd0 65 78 53 68 61 72 65 64 20 3d 20 73 71 6c 69 74  exShared = sqlit
13ce0 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c  e3MutexAlloc(SQL
13cf0 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43  ITE_MUTEX_STATIC
13d00 5f 4d 41 53 54 45 52 29 3b 29 0a 20 20 20 20 20  _MASTER);).     
13d10 20 69 66 28 20 53 51 4c 49 54 45 5f 54 48 52 45   if( SQLITE_THRE
13d20 41 44 53 41 46 45 20 26 26 20 73 71 6c 69 74 65  ADSAFE && sqlite
13d30 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43  3GlobalConfig.bC
13d40 6f 72 65 4d 75 74 65 78 20 29 7b 0a 20 20 20 20  oreMutex ){.    
13d50 20 20 20 20 70 42 74 2d 3e 6d 75 74 65 78 20 3d      pBt->mutex =
13d60 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c   sqlite3MutexAll
13d70 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  oc(SQLITE_MUTEX_
13d80 46 41 53 54 29 3b 0a 20 20 20 20 20 20 20 20 69  FAST);.        i
13d90 66 28 20 70 42 74 2d 3e 6d 75 74 65 78 3d 3d 30  f( pBt->mutex==0
13da0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
13db0 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
13dc0 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 6d  .          db->m
13dd0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 30 3b  allocFailed = 0;
13de0 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
13df0 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a  btree_open_out;.
13e00 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
13e10 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  }.      sqlite3_
13e20 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65  mutex_enter(mute
13e30 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20 20  xShared);.      
13e40 70 42 74 2d 3e 70 4e 65 78 74 20 3d 20 47 4c 4f  pBt->pNext = GLO
13e50 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71  BAL(BtShared*,sq
13e60 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65  lite3SharedCache
13e70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 47 4c 4f  List);.      GLO
13e80 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71  BAL(BtShared*,sq
13e90 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65  lite3SharedCache
13ea0 4c 69 73 74 29 20 3d 20 70 42 74 3b 0a 20 20 20  List) = pBt;.   
13eb0 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
13ec0 5f 6c 65 61 76 65 28 6d 75 74 65 78 53 68 61 72  _leave(mutexShar
13ed0 65 64 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  ed);.    }.#endi
13ee0 66 0a 20 20 7d 0a 0a 23 69 66 20 21 64 65 66 69  f.  }..#if !defi
13ef0 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
13f00 53 48 41 52 45 44 5f 43 41 43 48 45 29 20 26 26  SHARED_CACHE) &&
13f10 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
13f20 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20  _OMIT_DISKIO).  
13f30 2f 2a 20 49 66 20 74 68 65 20 6e 65 77 20 42 74  /* If the new Bt
13f40 72 65 65 20 75 73 65 73 20 61 20 73 68 61 72 61  ree uses a shara
13f50 62 6c 65 20 70 42 74 53 68 61 72 65 64 2c 20 74  ble pBtShared, t
13f60 68 65 6e 20 6c 69 6e 6b 20 74 68 65 20 6e 65 77  hen link the new
13f70 0a 20 20 2a 2a 20 42 74 72 65 65 20 69 6e 74 6f  .  ** Btree into
13f80 20 74 68 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c   the list of all
13f90 20 73 68 61 72 61 62 6c 65 20 42 74 72 65 65 73   sharable Btrees
13fa0 20 66 6f 72 20 74 68 65 20 73 61 6d 65 20 63 6f   for the same co
13fb0 6e 6e 65 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 54  nnection..  ** T
13fc0 68 65 20 6c 69 73 74 20 69 73 20 6b 65 70 74 20  he list is kept 
13fd0 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64  in ascending ord
13fe0 65 72 20 62 79 20 70 42 74 20 61 64 64 72 65 73  er by pBt addres
13ff0 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  s..  */.  if( p-
14000 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20  >sharable ){.   
14010 20 69 6e 74 20 69 3b 0a 20 20 20 20 42 74 72 65   int i;.    Btre
14020 65 20 2a 70 53 69 62 3b 0a 20 20 20 20 66 6f 72  e *pSib;.    for
14030 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b  (i=0; i<db->nDb;
14040 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
14050 20 28 70 53 69 62 20 3d 20 64 62 2d 3e 61 44 62   (pSib = db->aDb
14060 5b 69 5d 2e 70 42 74 29 21 3d 30 20 26 26 20 70  [i].pBt)!=0 && p
14070 53 69 62 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b  Sib->sharable ){
14080 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20  .        while( 
14090 70 53 69 62 2d 3e 70 50 72 65 76 20 29 7b 20 70  pSib->pPrev ){ p
140a0 53 69 62 20 3d 20 70 53 69 62 2d 3e 70 50 72 65  Sib = pSib->pPre
140b0 76 3b 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28  v; }.        if(
140c0 20 70 2d 3e 70 42 74 3c 70 53 69 62 2d 3e 70 42   p->pBt<pSib->pB
140d0 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  t ){.          p
140e0 2d 3e 70 4e 65 78 74 20 3d 20 70 53 69 62 3b 0a  ->pNext = pSib;.
140f0 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 50 72            p->pPr
14100 65 76 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ev = 0;.        
14110 20 20 70 53 69 62 2d 3e 70 50 72 65 76 20 3d 20    pSib->pPrev = 
14120 70 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  p;.        }else
14130 7b 0a 20 20 20 20 20 20 20 20 20 20 77 68 69 6c  {.          whil
14140 65 28 20 70 53 69 62 2d 3e 70 4e 65 78 74 20 26  e( pSib->pNext &
14150 26 20 70 53 69 62 2d 3e 70 4e 65 78 74 2d 3e 70  & pSib->pNext->p
14160 42 74 3c 70 2d 3e 70 42 74 20 29 7b 0a 20 20 20  Bt<p->pBt ){.   
14170 20 20 20 20 20 20 20 20 20 70 53 69 62 20 3d 20           pSib = 
14180 70 53 69 62 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  pSib->pNext;.   
14190 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
141a0 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53     p->pNext = pS
141b0 69 62 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  ib->pNext;.     
141c0 20 20 20 20 20 70 2d 3e 70 50 72 65 76 20 3d 20       p->pPrev = 
141d0 70 53 69 62 3b 0a 20 20 20 20 20 20 20 20 20 20  pSib;.          
141e0 69 66 28 20 70 2d 3e 70 4e 65 78 74 20 29 7b 0a  if( p->pNext ){.
141f0 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70              p->p
14200 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 3b  Next->pPrev = p;
14210 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
14220 20 20 20 20 20 20 20 70 53 69 62 2d 3e 70 4e 65         pSib->pNe
14230 78 74 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20  xt = p;.        
14240 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  }.        break;
14250 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
14260 20 7d 0a 23 65 6e 64 69 66 0a 20 20 2a 70 70 42   }.#endif.  *ppB
14270 74 72 65 65 20 3d 20 70 3b 0a 0a 62 74 72 65 65  tree = p;..btree
14280 5f 6f 70 65 6e 5f 6f 75 74 3a 0a 20 20 69 66 28  _open_out:.  if(
14290 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
142a0 7b 0a 20 20 20 20 69 66 28 20 70 42 74 20 26 26  {.    if( pBt &&
142b0 20 70 42 74 2d 3e 70 50 61 67 65 72 20 29 7b 0a   pBt->pPager ){.
142c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
142d0 65 72 43 6c 6f 73 65 28 70 42 74 2d 3e 70 50 61  erClose(pBt->pPa
142e0 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ger);.    }.    
142f0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 42 74  sqlite3_free(pBt
14300 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
14310 72 65 65 28 70 29 3b 0a 20 20 20 20 2a 70 70 42  ree(p);.    *ppB
14320 74 72 65 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  tree = 0;.  }els
14330 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  e{.    /* If the
14340 20 42 2d 54 72 65 65 20 77 61 73 20 73 75 63 63   B-Tree was succ
14350 65 73 73 66 75 6c 6c 79 20 6f 70 65 6e 65 64 2c  essfully opened,
14360 20 73 65 74 20 74 68 65 20 70 61 67 65 72 2d 63   set the pager-c
14370 61 63 68 65 20 73 69 7a 65 20 74 6f 20 74 68 65  ache size to the
14380 0a 20 20 20 20 2a 2a 20 64 65 66 61 75 6c 74 20  .    ** default 
14390 76 61 6c 75 65 2e 20 45 78 63 65 70 74 2c 20 77  value. Except, w
143a0 68 65 6e 20 6f 70 65 6e 69 6e 67 20 6f 6e 20 61  hen opening on a
143b0 6e 20 65 78 69 73 74 69 6e 67 20 73 68 61 72 65  n existing share
143c0 64 20 70 61 67 65 72 2d 63 61 63 68 65 2c 0a 20  d pager-cache,. 
143d0 20 20 20 2a 2a 20 64 6f 20 6e 6f 74 20 63 68 61     ** do not cha
143e0 6e 67 65 20 74 68 65 20 70 61 67 65 72 2d 63 61  nge the pager-ca
143f0 63 68 65 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f  che size..    */
14400 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
14410 42 74 72 65 65 53 63 68 65 6d 61 28 70 2c 20 30  BtreeSchema(p, 0
14420 2c 20 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  , 0)==0 ){.     
14430 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
14440 43 61 63 68 65 73 69 7a 65 28 70 2d 3e 70 42 74  Cachesize(p->pBt
14450 2d 3e 70 50 61 67 65 72 2c 20 53 51 4c 49 54 45  ->pPager, SQLITE
14460 5f 44 45 46 41 55 4c 54 5f 43 41 43 48 45 5f 53  _DEFAULT_CACHE_S
14470 49 5a 45 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  IZE);.    }.  }.
14480 20 20 69 66 28 20 6d 75 74 65 78 4f 70 65 6e 20    if( mutexOpen 
14490 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  ){.    assert( s
144a0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
144b0 64 28 6d 75 74 65 78 4f 70 65 6e 29 20 29 3b 0a  d(mutexOpen) );.
144c0 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
144d0 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 4f 70 65  x_leave(mutexOpe
144e0 6e 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  n);.  }.  return
144f0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65   rc;.}../*.** De
14500 63 72 65 6d 65 6e 74 20 74 68 65 20 42 74 53 68  crement the BtSh
14510 61 72 65 64 2e 6e 52 65 66 20 63 6f 75 6e 74 65  ared.nRef counte
14520 72 2e 20 20 57 68 65 6e 20 69 74 20 72 65 61 63  r.  When it reac
14530 68 65 73 20 7a 65 72 6f 2c 0a 2a 2a 20 72 65 6d  hes zero,.** rem
14540 6f 76 65 20 74 68 65 20 42 74 53 68 61 72 65 64  ove the BtShared
14550 20 73 74 72 75 63 74 75 72 65 20 66 72 6f 6d 20   structure from 
14560 74 68 65 20 73 68 61 72 69 6e 67 20 6c 69 73 74  the sharing list
14570 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74 72 75  .  Return.** tru
14580 65 20 69 66 20 74 68 65 20 42 74 53 68 61 72 65  e if the BtShare
14590 64 2e 6e 52 65 66 20 63 6f 75 6e 74 65 72 20 72  d.nRef counter r
145a0 65 61 63 68 65 73 20 7a 65 72 6f 20 61 6e 64 20  eaches zero and 
145b0 72 65 74 75 72 6e 0a 2a 2a 20 66 61 6c 73 65 20  return.** false 
145c0 69 66 20 69 74 20 69 73 20 73 74 69 6c 6c 20 70  if it is still p
145d0 6f 73 69 74 69 76 65 2e 0a 2a 2f 0a 73 74 61 74  ositive..*/.stat
145e0 69 63 20 69 6e 74 20 72 65 6d 6f 76 65 46 72 6f  ic int removeFro
145f0 6d 53 68 61 72 69 6e 67 4c 69 73 74 28 42 74 53  mSharingList(BtS
14600 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 23 69 66  hared *pBt){.#if
14610 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
14620 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20  _SHARED_CACHE.  
14630 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20 73 71 6c  MUTEX_LOGIC( sql
14640 69 74 65 33 5f 6d 75 74 65 78 20 2a 70 4d 61 73  ite3_mutex *pMas
14650 74 65 72 3b 20 29 0a 20 20 42 74 53 68 61 72 65  ter; ).  BtShare
14660 64 20 2a 70 4c 69 73 74 3b 0a 20 20 69 6e 74 20  d *pList;.  int 
14670 72 65 6d 6f 76 65 64 20 3d 20 30 3b 0a 0a 20 20  removed = 0;..  
14680 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
14690 6d 75 74 65 78 5f 6e 6f 74 68 65 6c 64 28 70 42  mutex_notheld(pB
146a0 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 4d  t->mutex) );.  M
146b0 55 54 45 58 5f 4c 4f 47 49 43 28 20 70 4d 61 73  UTEX_LOGIC( pMas
146c0 74 65 72 20 3d 20 73 71 6c 69 74 65 33 4d 75 74  ter = sqlite3Mut
146d0 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d  exAlloc(SQLITE_M
146e0 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54  UTEX_STATIC_MAST
146f0 45 52 29 3b 20 29 0a 20 20 73 71 6c 69 74 65 33  ER); ).  sqlite3
14700 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 4d 61  _mutex_enter(pMa
14710 73 74 65 72 29 3b 0a 20 20 70 42 74 2d 3e 6e 52  ster);.  pBt->nR
14720 65 66 2d 2d 3b 0a 20 20 69 66 28 20 70 42 74 2d  ef--;.  if( pBt-
14730 3e 6e 52 65 66 3c 3d 30 20 29 7b 0a 20 20 20 20  >nRef<=0 ){.    
14740 69 66 28 20 47 4c 4f 42 41 4c 28 42 74 53 68 61  if( GLOBAL(BtSha
14750 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72  red*,sqlite3Shar
14760 65 64 43 61 63 68 65 4c 69 73 74 29 3d 3d 70 42  edCacheList)==pB
14770 74 20 29 7b 0a 20 20 20 20 20 20 47 4c 4f 42 41  t ){.      GLOBA
14780 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69  L(BtShared*,sqli
14790 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69  te3SharedCacheLi
147a0 73 74 29 20 3d 20 70 42 74 2d 3e 70 4e 65 78 74  st) = pBt->pNext
147b0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
147c0 20 20 20 70 4c 69 73 74 20 3d 20 47 4c 4f 42 41     pList = GLOBA
147d0 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69  L(BtShared*,sqli
147e0 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69  te3SharedCacheLi
147f0 73 74 29 3b 0a 20 20 20 20 20 20 77 68 69 6c 65  st);.      while
14800 28 20 41 4c 57 41 59 53 28 70 4c 69 73 74 29 20  ( ALWAYS(pList) 
14810 26 26 20 70 4c 69 73 74 2d 3e 70 4e 65 78 74 21  && pList->pNext!
14820 3d 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20  =pBt ){.        
14830 70 4c 69 73 74 3d 70 4c 69 73 74 2d 3e 70 4e 65  pList=pList->pNe
14840 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  xt;.      }.    
14850 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 4c 69    if( ALWAYS(pLi
14860 73 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70  st) ){.        p
14870 4c 69 73 74 2d 3e 70 4e 65 78 74 20 3d 20 70 42  List->pNext = pB
14880 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  t->pNext;.      
14890 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
148a0 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46  SQLITE_THREADSAF
148b0 45 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  E ){.      sqlit
148c0 65 33 5f 6d 75 74 65 78 5f 66 72 65 65 28 70 42  e3_mutex_free(pB
148d0 74 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 7d  t->mutex);.    }
148e0 0a 20 20 20 20 72 65 6d 6f 76 65 64 20 3d 20 31  .    removed = 1
148f0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
14900 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 4d 61 73  mutex_leave(pMas
14910 74 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  ter);.  return r
14920 65 6d 6f 76 65 64 3b 0a 23 65 6c 73 65 0a 20 20  emoved;.#else.  
14930 72 65 74 75 72 6e 20 31 3b 0a 23 65 6e 64 69 66  return 1;.#endif
14940 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73  .}../*.** Make s
14950 75 72 65 20 70 42 74 2d 3e 70 54 6d 70 53 70 61  ure pBt->pTmpSpa
14960 63 65 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20  ce points to an 
14970 61 6c 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 0a 2a  allocation of .*
14980 2a 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70  * MX_CELL_SIZE(p
14990 42 74 29 20 62 79 74 65 73 20 77 69 74 68 20 61  Bt) bytes with a
149a0 20 34 2d 62 79 74 65 20 70 72 65 66 69 78 20 66   4-byte prefix f
149b0 6f 72 20 61 20 6c 65 66 74 2d 63 68 69 6c 64 0a  or a left-child.
149c0 2a 2a 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73  ** pointer..*/.s
149d0 74 61 74 69 63 20 76 6f 69 64 20 61 6c 6c 6f 63  tatic void alloc
149e0 61 74 65 54 65 6d 70 53 70 61 63 65 28 42 74 53  ateTempSpace(BtS
149f0 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69  hared *pBt){.  i
14a00 66 28 20 21 70 42 74 2d 3e 70 54 6d 70 53 70 61  f( !pBt->pTmpSpa
14a10 63 65 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e 70  ce ){.    pBt->p
14a20 54 6d 70 53 70 61 63 65 20 3d 20 73 71 6c 69 74  TmpSpace = sqlit
14a30 65 33 50 61 67 65 4d 61 6c 6c 6f 63 28 20 70 42  e3PageMalloc( pB
14a40 74 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a 0a  t->pageSize );..
14a50 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68      /* One of th
14a60 65 20 75 73 65 73 20 6f 66 20 70 42 74 2d 3e 70  e uses of pBt->p
14a70 54 6d 70 53 70 61 63 65 20 69 73 20 74 6f 20 66  TmpSpace is to f
14a80 6f 72 6d 61 74 20 63 65 6c 6c 73 20 62 65 66 6f  ormat cells befo
14a90 72 65 0a 20 20 20 20 2a 2a 20 69 6e 73 65 72 74  re.    ** insert
14aa0 69 6e 67 20 74 68 65 6d 20 69 6e 74 6f 20 61 20  ing them into a 
14ab0 6c 65 61 66 20 70 61 67 65 20 28 66 75 6e 63 74  leaf page (funct
14ac0 69 6f 6e 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 29  ion fillInCell()
14ad0 29 2e 20 49 66 0a 20 20 20 20 2a 2a 20 61 20 63  ). If.    ** a c
14ae0 65 6c 6c 20 69 73 20 6c 65 73 73 20 74 68 61 6e  ell is less than
14af0 20 34 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65   4 bytes in size
14b00 2c 20 69 74 20 69 73 20 72 6f 75 6e 64 65 64 20  , it is rounded 
14b10 75 70 20 74 6f 20 34 20 62 79 74 65 73 0a 20 20  up to 4 bytes.  
14b20 20 20 2a 2a 20 62 79 20 74 68 65 20 76 61 72 69    ** by the vari
14b30 6f 75 73 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ous routines tha
14b40 74 20 6d 61 6e 69 70 75 6c 61 74 65 20 62 69 6e  t manipulate bin
14b50 61 72 79 20 63 65 6c 6c 73 2e 20 57 68 69 63 68  ary cells. Which
14b60 0a 20 20 20 20 2a 2a 20 63 61 6e 20 6d 65 61 6e  .    ** can mean
14b70 20 74 68 61 74 20 66 69 6c 6c 49 6e 43 65 6c 6c   that fillInCell
14b80 28 29 20 6f 6e 6c 79 20 69 6e 69 74 69 61 6c 69  () only initiali
14b90 7a 65 73 20 74 68 65 20 66 69 72 73 74 20 32 20  zes the first 2 
14ba0 6f 72 20 33 0a 20 20 20 20 2a 2a 20 62 79 74 65  or 3.    ** byte
14bb0 73 20 6f 66 20 70 54 6d 70 53 70 61 63 65 2c 20  s of pTmpSpace, 
14bc0 62 75 74 20 74 68 61 74 20 74 68 65 20 66 69 72  but that the fir
14bd0 73 74 20 34 20 62 79 74 65 73 20 61 72 65 20 63  st 4 bytes are c
14be0 6f 70 69 65 64 20 66 72 6f 6d 0a 20 20 20 20 2a  opied from.    *
14bf0 2a 20 69 74 20 69 6e 74 6f 20 61 20 64 61 74 61  * it into a data
14c00 62 61 73 65 20 70 61 67 65 2e 20 54 68 69 73 20  base page. This 
14c10 69 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20  is not actually 
14c20 61 20 70 72 6f 62 6c 65 6d 2c 20 62 75 74 20 69  a problem, but i
14c30 74 0a 20 20 20 20 2a 2a 20 64 6f 65 73 20 63 61  t.    ** does ca
14c40 75 73 65 20 61 20 76 61 6c 67 72 69 6e 64 20 65  use a valgrind e
14c50 72 72 6f 72 20 77 68 65 6e 20 74 68 65 20 31 20  rror when the 1 
14c60 6f 72 20 32 20 62 79 74 65 73 20 6f 66 20 75 6e  or 2 bytes of un
14c70 69 74 69 61 6c 69 7a 65 64 20 0a 20 20 20 20 2a  itialized .    *
14c80 2a 20 64 61 74 61 20 69 73 20 70 61 73 73 65 64  * data is passed
14c90 20 74 6f 20 73 79 73 74 65 6d 20 63 61 6c 6c 20   to system call 
14ca0 77 72 69 74 65 28 29 2e 20 53 6f 20 74 6f 20 61  write(). So to a
14cb0 76 6f 69 64 20 74 68 69 73 20 65 72 72 6f 72 2c  void this error,
14cc0 0a 20 20 20 20 2a 2a 20 7a 65 72 6f 20 74 68 65  .    ** zero the
14cd0 20 66 69 72 73 74 20 34 20 62 79 74 65 73 20 6f   first 4 bytes o
14ce0 66 20 74 65 6d 70 20 73 70 61 63 65 20 68 65 72  f temp space her
14cf0 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  e..    **.    **
14d00 20 41 6c 73 6f 3a 20 20 50 72 6f 76 69 64 65 20   Also:  Provide 
14d10 66 6f 75 72 20 62 79 74 65 73 20 6f 66 20 69 6e  four bytes of in
14d20 69 74 69 61 6c 69 7a 65 64 20 73 70 61 63 65 20  itialized space 
14d30 62 65 66 6f 72 65 20 74 68 65 0a 20 20 20 20 2a  before the.    *
14d40 2a 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 70  * beginning of p
14d50 54 6d 70 53 70 61 63 65 20 61 73 20 61 6e 20 61  TmpSpace as an a
14d60 72 65 61 20 61 76 61 69 6c 61 62 6c 65 20 74 6f  rea available to
14d70 20 70 72 65 70 65 6e 64 20 74 68 65 0a 20 20 20   prepend the.   
14d80 20 2a 2a 20 6c 65 66 74 2d 63 68 69 6c 64 20 70   ** left-child p
14d90 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 62 65  ointer to the be
14da0 67 69 6e 6e 69 6e 67 20 6f 66 20 61 20 63 65 6c  ginning of a cel
14db0 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  l..    */.    if
14dc0 28 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65  ( pBt->pTmpSpace
14dd0 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74   ){.      memset
14de0 28 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 2c  (pBt->pTmpSpace,
14df0 20 30 2c 20 38 29 3b 0a 20 20 20 20 20 20 70 42   0, 8);.      pB
14e00 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 2b 3d 20  t->pTmpSpace += 
14e10 34 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  4;.    }.  }.}..
14e20 2f 2a 0a 2a 2a 20 46 72 65 65 20 74 68 65 20 70  /*.** Free the p
14e30 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 61 6c  Bt->pTmpSpace al
14e40 6c 6f 63 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74  location.*/.stat
14e50 69 63 20 76 6f 69 64 20 66 72 65 65 54 65 6d 70  ic void freeTemp
14e60 53 70 61 63 65 28 42 74 53 68 61 72 65 64 20 2a  Space(BtShared *
14e70 70 42 74 29 7b 0a 20 20 69 66 28 20 70 42 74 2d  pBt){.  if( pBt-
14e80 3e 70 54 6d 70 53 70 61 63 65 20 29 7b 0a 20 20  >pTmpSpace ){.  
14e90 20 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65    pBt->pTmpSpace
14ea0 20 2d 3d 20 34 3b 0a 20 20 20 20 73 71 6c 69 74   -= 4;.    sqlit
14eb0 65 33 50 61 67 65 46 72 65 65 28 70 42 74 2d 3e  e3PageFree(pBt->
14ec0 70 54 6d 70 53 70 61 63 65 29 3b 0a 20 20 20 20  pTmpSpace);.    
14ed0 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d  pBt->pTmpSpace =
14ee0 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   0;.  }.}../*.**
14ef0 20 43 6c 6f 73 65 20 61 6e 20 6f 70 65 6e 20 64   Close an open d
14f00 61 74 61 62 61 73 65 20 61 6e 64 20 69 6e 76 61  atabase and inva
14f10 6c 69 64 61 74 65 20 61 6c 6c 20 63 75 72 73 6f  lidate all curso
14f20 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  rs..*/.int sqlit
14f30 65 33 42 74 72 65 65 43 6c 6f 73 65 28 42 74 72  e3BtreeClose(Btr
14f40 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72  ee *p){.  BtShar
14f50 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
14f60 3b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  ;.  BtCursor *pC
14f70 75 72 3b 0a 0a 20 20 2f 2a 20 43 6c 6f 73 65 20  ur;..  /* Close 
14f80 61 6c 6c 20 63 75 72 73 6f 72 73 20 6f 70 65 6e  all cursors open
14f90 65 64 20 76 69 61 20 74 68 69 73 20 68 61 6e 64  ed via this hand
14fa0 6c 65 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  le.  */.  assert
14fb0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
14fc0 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65  held(p->db->mute
14fd0 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  x) );.  sqlite3B
14fe0 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
14ff0 70 43 75 72 20 3d 20 70 42 74 2d 3e 70 43 75 72  pCur = pBt->pCur
15000 73 6f 72 3b 0a 20 20 77 68 69 6c 65 28 20 70 43  sor;.  while( pC
15010 75 72 20 29 7b 0a 20 20 20 20 42 74 43 75 72 73  ur ){.    BtCurs
15020 6f 72 20 2a 70 54 6d 70 20 3d 20 70 43 75 72 3b  or *pTmp = pCur;
15030 0a 20 20 20 20 70 43 75 72 20 3d 20 70 43 75 72  .    pCur = pCur
15040 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 69 66 28  ->pNext;.    if(
15050 20 70 54 6d 70 2d 3e 70 42 74 72 65 65 3d 3d 70   pTmp->pBtree==p
15060 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
15070 33 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73 6f  3BtreeCloseCurso
15080 72 28 70 54 6d 70 29 3b 0a 20 20 20 20 7d 0a 20  r(pTmp);.    }. 
15090 20 7d 0a 0a 20 20 2f 2a 20 52 6f 6c 6c 62 61 63   }..  /* Rollbac
150a0 6b 20 61 6e 79 20 61 63 74 69 76 65 20 74 72 61  k any active tra
150b0 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 66 72 65  nsaction and fre
150c0 65 20 74 68 65 20 68 61 6e 64 6c 65 20 73 74 72  e the handle str
150d0 75 63 74 75 72 65 2e 0a 20 20 2a 2a 20 54 68 65  ucture..  ** The
150e0 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
150f0 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 29 20  BtreeRollback() 
15100 64 72 6f 70 73 20 61 6e 79 20 74 61 62 6c 65 2d  drops any table-
15110 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79 0a 20 20  locks held by.  
15120 2a 2a 20 74 68 69 73 20 68 61 6e 64 6c 65 2e 0a  ** this handle..
15130 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 42 74    */.  sqlite3Bt
15140 72 65 65 52 6f 6c 6c 62 61 63 6b 28 70 2c 20 53  reeRollback(p, S
15150 51 4c 49 54 45 5f 4f 4b 2c 20 30 29 3b 0a 20 20  QLITE_OK, 0);.  
15160 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
15170 65 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  e(p);..  /* If t
15180 68 65 72 65 20 61 72 65 20 73 74 69 6c 6c 20 6f  here are still o
15190 74 68 65 72 20 6f 75 74 73 74 61 6e 64 69 6e 67  ther outstanding
151a0 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74   references to t
151b0 68 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 0a  he shared-btree.
151c0 20 20 2a 2a 20 73 74 72 75 63 74 75 72 65 2c 20    ** structure, 
151d0 72 65 74 75 72 6e 20 6e 6f 77 2e 20 54 68 65 20  return now. The 
151e0 72 65 6d 61 69 6e 64 65 72 20 6f 66 20 74 68 69  remainder of thi
151f0 73 20 70 72 6f 63 65 64 75 72 65 20 63 6c 65 61  s procedure clea
15200 6e 73 20 0a 20 20 2a 2a 20 75 70 20 74 68 65 20  ns .  ** up the 
15210 73 68 61 72 65 64 2d 62 74 72 65 65 2e 0a 20 20  shared-btree..  
15220 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  */.  assert( p->
15230 77 61 6e 74 54 6f 4c 6f 63 6b 3d 3d 30 20 26 26  wantToLock==0 &&
15240 20 70 2d 3e 6c 6f 63 6b 65 64 3d 3d 30 20 29 3b   p->locked==0 );
15250 0a 20 20 69 66 28 20 21 70 2d 3e 73 68 61 72 61  .  if( !p->shara
15260 62 6c 65 20 7c 7c 20 72 65 6d 6f 76 65 46 72 6f  ble || removeFro
15270 6d 53 68 61 72 69 6e 67 4c 69 73 74 28 70 42 74  mSharingList(pBt
15280 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  ) ){.    /* The 
15290 70 42 74 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72  pBt is no longer
152a0 20 6f 6e 20 74 68 65 20 73 68 61 72 69 6e 67 20   on the sharing 
152b0 6c 69 73 74 2c 20 73 6f 20 77 65 20 63 61 6e 20  list, so we can 
152c0 61 63 63 65 73 73 0a 20 20 20 20 2a 2a 20 69 74  access.    ** it
152d0 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20   without having 
152e0 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 75 74 65  to hold the mute
152f0 78 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  x..    **.    **
15300 20 43 6c 65 61 6e 20 6f 75 74 20 61 6e 64 20 64   Clean out and d
15310 65 6c 65 74 65 20 74 68 65 20 42 74 53 68 61 72  elete the BtShar
15320 65 64 20 6f 62 6a 65 63 74 2e 0a 20 20 20 20 2a  ed object..    *
15330 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70  /.    assert( !p
15340 42 74 2d 3e 70 43 75 72 73 6f 72 20 29 3b 0a 20  Bt->pCursor );. 
15350 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 43     sqlite3PagerC
15360 6c 6f 73 65 28 70 42 74 2d 3e 70 50 61 67 65 72  lose(pBt->pPager
15370 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e  );.    if( pBt->
15380 78 46 72 65 65 53 63 68 65 6d 61 20 26 26 20 70  xFreeSchema && p
15390 42 74 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20  Bt->pSchema ){. 
153a0 20 20 20 20 20 70 42 74 2d 3e 78 46 72 65 65 53       pBt->xFreeS
153b0 63 68 65 6d 61 28 70 42 74 2d 3e 70 53 63 68 65  chema(pBt->pSche
153c0 6d 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  ma);.    }.    s
153d0 71 6c 69 74 65 33 44 62 46 72 65 65 28 30 2c 20  qlite3DbFree(0, 
153e0 70 42 74 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20  pBt->pSchema);. 
153f0 20 20 20 66 72 65 65 54 65 6d 70 53 70 61 63 65     freeTempSpace
15400 28 70 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  (pBt);.    sqlit
15410 65 33 5f 66 72 65 65 28 70 42 74 29 3b 0a 20 20  e3_free(pBt);.  
15420 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
15430 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
15440 43 48 45 0a 20 20 61 73 73 65 72 74 28 20 70 2d  CHE.  assert( p-
15450 3e 77 61 6e 74 54 6f 4c 6f 63 6b 3d 3d 30 20 29  >wantToLock==0 )
15460 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6c  ;.  assert( p->l
15470 6f 63 6b 65 64 3d 3d 30 20 29 3b 0a 20 20 69 66  ocked==0 );.  if
15480 28 20 70 2d 3e 70 50 72 65 76 20 29 20 70 2d 3e  ( p->pPrev ) p->
15490 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70  pPrev->pNext = p
154a0 2d 3e 70 4e 65 78 74 3b 0a 20 20 69 66 28 20 70  ->pNext;.  if( p
154b0 2d 3e 70 4e 65 78 74 20 29 20 70 2d 3e 70 4e 65  ->pNext ) p->pNe
154c0 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 2d 3e 70  xt->pPrev = p->p
154d0 50 72 65 76 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  Prev;.#endif..  
154e0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b  sqlite3_free(p);
154f0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
15500 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  _OK;.}../*.** Ch
15510 61 6e 67 65 20 74 68 65 20 6c 69 6d 69 74 20 6f  ange the limit o
15520 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
15530 70 61 67 65 73 20 61 6c 6c 6f 77 65 64 20 69 6e  pages allowed in
15540 20 74 68 65 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a   the cache..**.*
15550 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75  * The maximum nu
15560 6d 62 65 72 20 6f 66 20 63 61 63 68 65 20 70 61  mber of cache pa
15570 67 65 73 20 69 73 20 73 65 74 20 74 6f 20 74 68  ges is set to th
15580 65 20 61 62 73 6f 6c 75 74 65 0a 2a 2a 20 76 61  e absolute.** va
15590 6c 75 65 20 6f 66 20 6d 78 50 61 67 65 2e 20 20  lue of mxPage.  
155a0 49 66 20 6d 78 50 61 67 65 20 69 73 20 6e 65 67  If mxPage is neg
155b0 61 74 69 76 65 2c 20 74 68 65 20 70 61 67 65 72  ative, the pager
155c0 20 77 69 6c 6c 0a 2a 2a 20 6f 70 65 72 61 74 65   will.** operate
155d0 20 61 73 79 6e 63 68 72 6f 6e 6f 75 73 6c 79 20   asynchronously 
155e0 2d 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20 73 74  - it will not st
155f0 6f 70 20 74 6f 20 64 6f 20 66 73 79 6e 63 28 29  op to do fsync()
15600 73 0a 2a 2a 20 74 6f 20 69 6e 73 75 72 65 20 64  s.** to insure d
15610 61 74 61 20 69 73 20 77 72 69 74 74 65 6e 20 74  ata is written t
15620 6f 20 74 68 65 20 64 69 73 6b 20 73 75 72 66 61  o the disk surfa
15630 63 65 20 62 65 66 6f 72 65 0a 2a 2a 20 63 6f 6e  ce before.** con
15640 74 69 6e 75 69 6e 67 2e 20 20 54 72 61 6e 73 61  tinuing.  Transa
15650 63 74 69 6f 6e 73 20 73 74 69 6c 6c 20 77 6f 72  ctions still wor
15660 6b 20 69 66 20 73 79 6e 63 68 72 6f 6e 6f 75 73  k if synchronous
15670 20 69 73 20 6f 66 66 2c 0a 2a 2a 20 61 6e 64 20   is off,.** and 
15680 74 68 65 20 64 61 74 61 62 61 73 65 20 63 61 6e  the database can
15690 6e 6f 74 20 62 65 20 63 6f 72 72 75 70 74 65 64  not be corrupted
156a0 20 69 66 20 74 68 69 73 20 70 72 6f 67 72 61 6d   if this program
156b0 0a 2a 2a 20 63 72 61 73 68 65 73 2e 20 20 42 75  .** crashes.  Bu
156c0 74 20 69 66 20 74 68 65 20 6f 70 65 72 61 74 69  t if the operati
156d0 6e 67 20 73 79 73 74 65 6d 20 63 72 61 73 68 65  ng system crashe
156e0 73 20 6f 72 20 74 68 65 72 65 20 69 73 0a 2a 2a  s or there is.**
156f0 20 61 6e 20 61 62 72 75 70 74 20 70 6f 77 65 72   an abrupt power
15700 20 66 61 69 6c 75 72 65 20 77 68 65 6e 20 73 79   failure when sy
15710 6e 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f 66 66  nchronous is off
15720 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a  , the database.*
15730 2a 20 63 6f 75 6c 64 20 62 65 20 6c 65 66 74 20  * could be left 
15740 69 6e 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65  in an inconsiste
15750 6e 74 20 61 6e 64 20 75 6e 72 65 63 6f 76 65 72  nt and unrecover
15760 61 62 6c 65 20 73 74 61 74 65 2e 0a 2a 2a 20 53  able state..** S
15770 79 6e 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f 6e  ynchronous is on
15780 20 62 79 20 64 65 66 61 75 6c 74 20 73 6f 20 64   by default so d
15790 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69  atabase corrupti
157a0 6f 6e 20 69 73 20 6e 6f 74 0a 2a 2a 20 6e 6f 72  on is not.** nor
157b0 6d 61 6c 6c 79 20 61 20 77 6f 72 72 79 2e 0a 2a  mally a worry..*
157c0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
157d0 65 65 53 65 74 43 61 63 68 65 53 69 7a 65 28 42  eeSetCacheSize(B
157e0 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6d 78 50  tree *p, int mxP
157f0 61 67 65 29 7b 0a 20 20 42 74 53 68 61 72 65 64  age){.  BtShared
15800 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
15810 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
15820 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e  3_mutex_held(p->
15830 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
15840 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
15850 72 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50  r(p);.  sqlite3P
15860 61 67 65 72 53 65 74 43 61 63 68 65 73 69 7a 65  agerSetCachesize
15870 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6d 78  (pBt->pPager, mx
15880 50 61 67 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  Page);.  sqlite3
15890 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
158a0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
158b0 4b 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45  K;.}..#if SQLITE
158c0 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30  _MAX_MMAP_SIZE>0
158d0 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
158e0 65 20 6c 69 6d 69 74 20 6f 6e 20 74 68 65 20 61  e limit on the a
158f0 6d 6f 75 6e 74 20 6f 66 20 74 68 65 20 64 61 74  mount of the dat
15900 61 62 61 73 65 20 66 69 6c 65 20 74 68 61 74 20  abase file that 
15910 6d 61 79 20 62 65 0a 2a 2a 20 6d 65 6d 6f 72 79  may be.** memory
15920 20 6d 61 70 70 65 64 2e 0a 2a 2f 0a 69 6e 74 20   mapped..*/.int 
15930 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 4d  sqlite3BtreeSetM
15940 6d 61 70 4c 69 6d 69 74 28 42 74 72 65 65 20 2a  mapLimit(Btree *
15950 70 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  p, sqlite3_int64
15960 20 73 7a 4d 6d 61 70 29 7b 0a 20 20 42 74 53 68   szMmap){.  BtSh
15970 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
15980 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  Bt;.  assert( sq
15990 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
159a0 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  (p->db->mutex) )
159b0 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
159c0 45 6e 74 65 72 28 70 29 3b 0a 20 20 73 71 6c 69  Enter(p);.  sqli
159d0 74 65 33 50 61 67 65 72 53 65 74 4d 6d 61 70 4c  te3PagerSetMmapL
159e0 69 6d 69 74 28 70 42 74 2d 3e 70 50 61 67 65 72  imit(pBt->pPager
159f0 2c 20 73 7a 4d 6d 61 70 29 3b 0a 20 20 73 71 6c  , szMmap);.  sql
15a00 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
15a10 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
15a20 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20  TE_OK;.}.#endif 
15a30 2f 2a 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  /* SQLITE_MAX_MM
15a40 41 50 5f 53 49 5a 45 3e 30 20 2a 2f 0a 0a 2f 2a  AP_SIZE>0 */../*
15a50 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 77  .** Change the w
15a60 61 79 20 64 61 74 61 20 69 73 20 73 79 6e 63 65  ay data is synce
15a70 64 20 74 6f 20 64 69 73 6b 20 69 6e 20 6f 72 64  d to disk in ord
15a80 65 72 20 74 6f 20 69 6e 63 72 65 61 73 65 20 6f  er to increase o
15a90 72 20 64 65 63 72 65 61 73 65 0a 2a 2a 20 68 6f  r decrease.** ho
15aa0 77 20 77 65 6c 6c 20 74 68 65 20 64 61 74 61 62  w well the datab
15ab0 61 73 65 20 72 65 73 69 73 74 73 20 64 61 6d 61  ase resists dama
15ac0 67 65 20 64 75 65 20 74 6f 20 4f 53 20 63 72 61  ge due to OS cra
15ad0 73 68 65 73 20 61 6e 64 20 70 6f 77 65 72 0a 2a  shes and power.*
15ae0 2a 20 66 61 69 6c 75 72 65 73 2e 20 20 4c 65 76  * failures.  Lev
15af0 65 6c 20 31 20 69 73 20 74 68 65 20 73 61 6d 65  el 1 is the same
15b00 20 61 73 20 61 73 79 6e 63 68 72 6f 6e 6f 75 73   as asynchronous
15b10 20 28 6e 6f 20 73 79 6e 63 73 28 29 20 6f 63 63   (no syncs() occ
15b20 75 72 20 61 6e 64 0a 2a 2a 20 74 68 65 72 65 20  ur and.** there 
15b30 69 73 20 61 20 68 69 67 68 20 70 72 6f 62 61 62  is a high probab
15b40 69 6c 69 74 79 20 6f 66 20 64 61 6d 61 67 65 29  ility of damage)
15b50 20 20 4c 65 76 65 6c 20 32 20 69 73 20 74 68 65    Level 2 is the
15b60 20 64 65 66 61 75 6c 74 2e 20 20 54 68 65 72 65   default.  There
15b70 0a 2a 2a 20 69 73 20 61 20 76 65 72 79 20 6c 6f  .** is a very lo
15b80 77 20 62 75 74 20 6e 6f 6e 2d 7a 65 72 6f 20 70  w but non-zero p
15b90 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 64 61  robability of da
15ba0 6d 61 67 65 2e 20 20 4c 65 76 65 6c 20 33 20 72  mage.  Level 3 r
15bb0 65 64 75 63 65 73 20 74 68 65 0a 2a 2a 20 70 72  educes the.** pr
15bc0 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 64 61 6d  obability of dam
15bd0 61 67 65 20 74 6f 20 6e 65 61 72 20 7a 65 72 6f  age to near zero
15be0 20 62 75 74 20 77 69 74 68 20 61 20 77 72 69 74   but with a writ
15bf0 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 72 65  e performance re
15c00 64 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e  duction..*/.#ifn
15c10 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
15c20 50 41 47 45 52 5f 50 52 41 47 4d 41 53 0a 69 6e  PAGER_PRAGMAS.in
15c30 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65  t sqlite3BtreeSe
15c40 74 50 61 67 65 72 46 6c 61 67 73 28 0a 20 20 42  tPagerFlags(.  B
15c50 74 72 65 65 20 2a 70 2c 20 20 20 20 20 20 20 20  tree *p,        
15c60 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72        /* The btr
15c70 65 65 20 74 6f 20 73 65 74 20 74 68 65 20 73 61  ee to set the sa
15c80 66 65 74 79 20 6c 65 76 65 6c 20 6f 6e 20 2a 2f  fety level on */
15c90 0a 20 20 75 6e 73 69 67 6e 65 64 20 70 67 46 6c  .  unsigned pgFl
15ca0 61 67 73 20 20 20 20 20 20 20 2f 2a 20 56 61 72  ags       /* Var
15cb0 69 6f 75 73 20 50 41 47 45 52 5f 2a 20 66 6c 61  ious PAGER_* fla
15cc0 67 73 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68 61  gs */.){.  BtSha
15cd0 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
15ce0 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  t;.  assert( sql
15cf0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
15d00 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  p->db->mutex) );
15d10 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
15d20 6e 74 65 72 28 70 29 3b 0a 20 20 73 71 6c 69 74  nter(p);.  sqlit
15d30 65 33 50 61 67 65 72 53 65 74 46 6c 61 67 73 28  e3PagerSetFlags(
15d40 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 67 46  pBt->pPager, pgF
15d50 6c 61 67 73 29 3b 0a 20 20 73 71 6c 69 74 65 33  lags);.  sqlite3
15d60 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
15d70 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
15d80 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  K;.}.#endif../*.
15d90 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
15da0 66 20 74 68 65 20 67 69 76 65 6e 20 62 74 72 65  f the given btre
15db0 65 20 69 73 20 73 65 74 20 74 6f 20 73 61 66 65  e is set to safe
15dc0 74 79 20 6c 65 76 65 6c 20 31 2e 20 20 49 6e 20  ty level 1.  In 
15dd0 6f 74 68 65 72 0a 2a 2a 20 77 6f 72 64 73 2c 20  other.** words, 
15de0 72 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 6e  return TRUE if n
15df0 6f 20 73 79 6e 63 28 29 20 6f 63 63 75 72 73 20  o sync() occurs 
15e00 6f 6e 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65  on the disk file
15e10 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
15e20 33 42 74 72 65 65 53 79 6e 63 44 69 73 61 62 6c  3BtreeSyncDisabl
15e30 65 64 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  ed(Btree *p){.  
15e40 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
15e50 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72 63  p->pBt;.  int rc
15e60 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
15e70 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
15e80 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 20  ->db->mutex) ); 
15e90 20 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65   .  sqlite3Btree
15ea0 45 6e 74 65 72 28 70 29 3b 0a 20 20 61 73 73 65  Enter(p);.  asse
15eb0 72 74 28 20 70 42 74 20 26 26 20 70 42 74 2d 3e  rt( pBt && pBt->
15ec0 70 50 61 67 65 72 20 29 3b 0a 20 20 72 63 20 3d  pPager );.  rc =
15ed0 20 73 71 6c 69 74 65 33 50 61 67 65 72 4e 6f 73   sqlite3PagerNos
15ee0 79 6e 63 28 70 42 74 2d 3e 70 50 61 67 65 72 29  ync(pBt->pPager)
15ef0 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
15f00 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
15f10 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
15f20 43 68 61 6e 67 65 20 74 68 65 20 64 65 66 61 75  Change the defau
15f30 6c 74 20 70 61 67 65 73 20 73 69 7a 65 20 61 6e  lt pages size an
15f40 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  d the number of 
15f50 72 65 73 65 72 76 65 64 20 62 79 74 65 73 20 70  reserved bytes p
15f60 65 72 20 70 61 67 65 2e 0a 2a 2a 20 4f 72 2c 20  er page..** Or, 
15f70 69 66 20 74 68 65 20 70 61 67 65 20 73 69 7a 65  if the page size
15f80 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
15f90 6e 20 66 69 78 65 64 2c 20 72 65 74 75 72 6e 20  n fixed, return 
15fa0 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20  SQLITE_READONLY 
15fb0 0a 2a 2a 20 77 69 74 68 6f 75 74 20 63 68 61 6e  .** without chan
15fc0 67 69 6e 67 20 61 6e 79 74 68 69 6e 67 2e 0a 2a  ging anything..*
15fd0 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 73 69  *.** The page si
15fe0 7a 65 20 6d 75 73 74 20 62 65 20 61 20 70 6f 77  ze must be a pow
15ff0 65 72 20 6f 66 20 32 20 62 65 74 77 65 65 6e 20  er of 2 between 
16000 35 31 32 20 61 6e 64 20 36 35 35 33 36 2e 20 20  512 and 65536.  
16010 49 66 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 73  If the page.** s
16020 69 7a 65 20 73 75 70 70 6c 69 65 64 20 64 6f 65  ize supplied doe
16030 73 20 6e 6f 74 20 6d 65 65 74 20 74 68 69 73 20  s not meet this 
16040 63 6f 6e 73 74 72 61 69 6e 74 20 74 68 65 6e 20  constraint then 
16050 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73  the page size is
16060 20 6e 6f 74 0a 2a 2a 20 63 68 61 6e 67 65 64 2e   not.** changed.
16070 0a 2a 2a 0a 2a 2a 20 50 61 67 65 20 73 69 7a 65  .**.** Page size
16080 73 20 61 72 65 20 63 6f 6e 73 74 72 61 69 6e 65  s are constraine
16090 64 20 74 6f 20 62 65 20 61 20 70 6f 77 65 72 20  d to be a power 
160a0 6f 66 20 74 77 6f 20 73 6f 20 74 68 61 74 20 74  of two so that t
160b0 68 65 20 72 65 67 69 6f 6e 0a 2a 2a 20 6f 66 20  he region.** of 
160c0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
160d0 65 20 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b 69  e used for locki
160e0 6e 67 20 28 62 65 67 69 6e 6e 69 6e 67 20 61 74  ng (beginning at
160f0 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 0a 2a   PENDING_BYTE,.*
16100 2a 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65  * the first byte
16110 20 70 61 73 74 20 74 68 65 20 31 47 42 20 62 6f   past the 1GB bo
16120 75 6e 64 61 72 79 2c 20 30 78 34 30 30 30 30 30  undary, 0x400000
16130 30 30 29 20 6e 65 65 64 73 20 74 6f 20 6f 63 63  00) needs to occ
16140 75 72 0a 2a 2a 20 61 74 20 74 68 65 20 62 65 67  ur.** at the beg
16150 69 6e 6e 69 6e 67 20 6f 66 20 61 20 70 61 67 65  inning of a page
16160 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d  ..**.** If param
16170 65 74 65 72 20 6e 52 65 73 65 72 76 65 20 69 73  eter nReserve is
16180 20 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c   less than zero,
16190 20 74 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72   then the number
161a0 20 6f 66 20 72 65 73 65 72 76 65 64 0a 2a 2a 20   of reserved.** 
161b0 62 79 74 65 73 20 70 65 72 20 70 61 67 65 20 69  bytes per page i
161c0 73 20 6c 65 66 74 20 75 6e 63 68 61 6e 67 65 64  s left unchanged
161d0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69  ..**.** If the i
161e0 46 69 78 21 3d 30 20 74 68 65 6e 20 74 68 65 20  Fix!=0 then the 
161f0 42 54 53 5f 50 41 47 45 53 49 5a 45 5f 46 49 58  BTS_PAGESIZE_FIX
16200 45 44 20 66 6c 61 67 20 69 73 20 73 65 74 20 73  ED flag is set s
16210 6f 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  o that the page 
16220 73 69 7a 65 0a 2a 2a 20 61 6e 64 20 61 75 74 6f  size.** and auto
16230 76 61 63 75 75 6d 20 6d 6f 64 65 20 63 61 6e 20  vacuum mode can 
16240 6e 6f 20 6c 6f 6e 67 65 72 20 62 65 20 63 68 61  no longer be cha
16250 6e 67 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  nged..*/.int sql
16260 69 74 65 33 42 74 72 65 65 53 65 74 50 61 67 65  ite3BtreeSetPage
16270 53 69 7a 65 28 42 74 72 65 65 20 2a 70 2c 20 69  Size(Btree *p, i
16280 6e 74 20 70 61 67 65 53 69 7a 65 2c 20 69 6e 74  nt pageSize, int
16290 20 6e 52 65 73 65 72 76 65 2c 20 69 6e 74 20 69   nReserve, int i
162a0 46 69 78 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  Fix){.  int rc =
162b0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 42 74   SQLITE_OK;.  Bt
162c0 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
162d0 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20  >pBt;.  assert( 
162e0 6e 52 65 73 65 72 76 65 3e 3d 2d 31 20 26 26 20  nReserve>=-1 && 
162f0 6e 52 65 73 65 72 76 65 3c 3d 32 35 35 20 29 3b  nReserve<=255 );
16300 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
16310 6e 74 65 72 28 70 29 3b 0a 23 69 66 20 53 51 4c  nter(p);.#if SQL
16320 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20  ITE_HAS_CODEC.  
16330 69 66 28 20 6e 52 65 73 65 72 76 65 3e 70 42 74  if( nReserve>pBt
16340 2d 3e 6f 70 74 69 6d 61 6c 52 65 73 65 72 76 65  ->optimalReserve
16350 20 29 20 70 42 74 2d 3e 6f 70 74 69 6d 61 6c 52   ) pBt->optimalR
16360 65 73 65 72 76 65 20 3d 20 28 75 38 29 6e 52 65  eserve = (u8)nRe
16370 73 65 72 76 65 3b 0a 23 65 6e 64 69 66 0a 20 20  serve;.#endif.  
16380 69 66 28 20 70 42 74 2d 3e 62 74 73 46 6c 61 67  if( pBt->btsFlag
16390 73 20 26 20 42 54 53 5f 50 41 47 45 53 49 5a 45  s & BTS_PAGESIZE
163a0 5f 46 49 58 45 44 20 29 7b 0a 20 20 20 20 73 71  _FIXED ){.    sq
163b0 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
163c0 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  p);.    return S
163d0 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a  QLITE_READONLY;.
163e0 20 20 7d 0a 20 20 69 66 28 20 6e 52 65 73 65 72    }.  if( nReser
163f0 76 65 3c 30 20 29 7b 0a 20 20 20 20 6e 52 65 73  ve<0 ){.    nRes
16400 65 72 76 65 20 3d 20 70 42 74 2d 3e 70 61 67 65  erve = pBt->page
16410 53 69 7a 65 20 2d 20 70 42 74 2d 3e 75 73 61 62  Size - pBt->usab
16420 6c 65 53 69 7a 65 3b 0a 20 20 7d 0a 20 20 61 73  leSize;.  }.  as
16430 73 65 72 74 28 20 6e 52 65 73 65 72 76 65 3e 3d  sert( nReserve>=
16440 30 20 26 26 20 6e 52 65 73 65 72 76 65 3c 3d 32  0 && nReserve<=2
16450 35 35 20 29 3b 0a 20 20 69 66 28 20 70 61 67 65  55 );.  if( page
16460 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 61 67  Size>=512 && pag
16470 65 53 69 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d 41  eSize<=SQLITE_MA
16480 58 5f 50 41 47 45 5f 53 49 5a 45 20 26 26 0a 20  X_PAGE_SIZE &&. 
16490 20 20 20 20 20 20 20 28 28 70 61 67 65 53 69 7a         ((pageSiz
164a0 65 2d 31 29 26 70 61 67 65 53 69 7a 65 29 3d 3d  e-1)&pageSize)==
164b0 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
164c0 20 28 70 61 67 65 53 69 7a 65 20 26 20 37 29 3d   (pageSize & 7)=
164d0 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
164e0 28 20 21 70 42 74 2d 3e 70 43 75 72 73 6f 72 20  ( !pBt->pCursor 
164f0 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70 61 67 65  );.    pBt->page
16500 53 69 7a 65 20 3d 20 28 75 33 32 29 70 61 67 65  Size = (u32)page
16510 53 69 7a 65 3b 0a 20 20 20 20 66 72 65 65 54 65  Size;.    freeTe
16520 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20  mpSpace(pBt);.  
16530 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  }.  rc = sqlite3
16540 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65  PagerSetPagesize
16550 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70  (pBt->pPager, &p
16560 42 74 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6e 52  Bt->pageSize, nR
16570 65 73 65 72 76 65 29 3b 0a 20 20 70 42 74 2d 3e  eserve);.  pBt->
16580 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74  usableSize = pBt
16590 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 28 75 31  ->pageSize - (u1
165a0 36 29 6e 52 65 73 65 72 76 65 3b 0a 20 20 69 66  6)nReserve;.  if
165b0 28 20 69 46 69 78 20 29 20 70 42 74 2d 3e 62 74  ( iFix ) pBt->bt
165c0 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 50 41  sFlags |= BTS_PA
165d0 47 45 53 49 5a 45 5f 46 49 58 45 44 3b 0a 20 20  GESIZE_FIXED;.  
165e0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
165f0 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
16600 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  c;.}../*.** Retu
16610 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74 6c 79  rn the currently
16620 20 64 65 66 69 6e 65 64 20 70 61 67 65 20 73 69   defined page si
16630 7a 65 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  ze.*/.int sqlite
16640 33 42 74 72 65 65 47 65 74 50 61 67 65 53 69 7a  3BtreeGetPageSiz
16650 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 72  e(Btree *p){.  r
16660 65 74 75 72 6e 20 70 2d 3e 70 42 74 2d 3e 70 61  eturn p->pBt->pa
16670 67 65 53 69 7a 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  geSize;.}../*.**
16680 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
16690 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 73 71 6c  s similar to sql
166a0 69 74 65 33 42 74 72 65 65 47 65 74 52 65 73 65  ite3BtreeGetRese
166b0 72 76 65 28 29 2c 20 65 78 63 65 70 74 20 74 68  rve(), except th
166c0 61 74 20 69 74 0a 2a 2a 20 6d 61 79 20 6f 6e 6c  at it.** may onl
166d0 79 20 62 65 20 63 61 6c 6c 65 64 20 69 66 20 69  y be called if i
166e0 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20  t is guaranteed 
166f0 74 68 61 74 20 74 68 65 20 62 2d 74 72 65 65 20  that the b-tree 
16700 6d 75 74 65 78 20 69 73 20 61 6c 72 65 61 64 79  mutex is already
16710 0a 2a 2a 20 68 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20  .** held..**.** 
16720 54 68 69 73 20 69 73 20 75 73 65 66 75 6c 20 69  This is useful i
16730 6e 20 6f 6e 65 20 73 70 65 63 69 61 6c 20 63 61  n one special ca
16740 73 65 20 69 6e 20 74 68 65 20 62 61 63 6b 75 70  se in the backup
16750 20 41 50 49 20 63 6f 64 65 20 77 68 65 72 65 20   API code where 
16760 69 74 20 69 73 0a 2a 2a 20 6b 6e 6f 77 6e 20 74  it is.** known t
16770 68 61 74 20 74 68 65 20 73 68 61 72 65 64 20 62  hat the shared b
16780 2d 74 72 65 65 20 6d 75 74 65 78 20 69 73 20 68  -tree mutex is h
16790 65 6c 64 2c 20 62 75 74 20 74 68 65 20 6d 75 74  eld, but the mut
167a0 65 78 20 6f 6e 20 74 68 65 20 0a 2a 2a 20 64 61  ex on the .** da
167b0 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 74 68  tabase handle th
167c0 61 74 20 6f 77 6e 73 20 2a 70 20 69 73 20 6e 6f  at owns *p is no
167d0 74 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  t. In this case 
167e0 69 66 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  if sqlite3BtreeE
167f0 6e 74 65 72 28 29 0a 2a 2a 20 77 65 72 65 20 74  nter().** were t
16800 6f 20 62 65 20 63 61 6c 6c 65 64 2c 20 69 74 20  o be called, it 
16810 6d 69 67 68 74 20 63 6f 6c 6c 69 64 65 20 77 69  might collide wi
16820 74 68 20 73 6f 6d 65 20 6f 74 68 65 72 20 6f 70  th some other op
16830 65 72 61 74 69 6f 6e 20 6f 6e 20 74 68 65 0a 2a  eration on the.*
16840 2a 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  * database handl
16850 65 20 74 68 61 74 20 6f 77 6e 73 20 2a 70 2c 20  e that owns *p, 
16860 63 61 75 73 69 6e 67 20 75 6e 64 65 66 69 6e 65  causing undefine
16870 64 20 62 65 68 61 76 69 6f 72 2e 0a 2a 2f 0a 69  d behavior..*/.i
16880 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 47  nt sqlite3BtreeG
16890 65 74 52 65 73 65 72 76 65 4e 6f 4d 75 74 65 78  etReserveNoMutex
168a0 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e  (Btree *p){.  in
168b0 74 20 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 73  t n;.  assert( s
168c0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
168d0 64 28 70 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  d(p->pBt->mutex)
168e0 20 29 3b 0a 20 20 6e 20 3d 20 70 2d 3e 70 42 74   );.  n = p->pBt
168f0 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 2d 3e  ->pageSize - p->
16900 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b  pBt->usableSize;
16910 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a  .  return n;.}..
16920 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
16930 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
16940 20 6f 66 20 73 70 61 63 65 20 61 74 20 74 68 65   of space at the
16950 20 65 6e 64 20 6f 66 20 65 76 65 72 79 20 70 61   end of every pa
16960 67 65 20 74 68 61 74 0a 2a 2a 20 61 72 65 20 69  ge that.** are i
16970 6e 74 65 6e 74 75 61 6c 6c 79 20 6c 65 66 74 20  ntentually left 
16980 75 6e 75 73 65 64 2e 20 20 54 68 69 73 20 69 73  unused.  This is
16990 20 74 68 65 20 22 72 65 73 65 72 76 65 64 22 20   the "reserved" 
169a0 73 70 61 63 65 20 74 68 61 74 20 69 73 0a 2a 2a  space that is.**
169b0 20 73 6f 6d 65 74 69 6d 65 73 20 75 73 65 64 20   sometimes used 
169c0 62 79 20 65 78 74 65 6e 73 69 6f 6e 73 2e 0a 2a  by extensions..*
169d0 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 48  *.** If SQLITE_H
169e0 41 53 5f 4d 55 54 45 58 20 69 73 20 64 65 66 69  AS_MUTEX is defi
169f0 6e 65 64 20 74 68 65 6e 20 74 68 65 20 6e 75 6d  ned then the num
16a00 62 65 72 20 72 65 74 75 72 6e 65 64 20 69 73 20  ber returned is 
16a10 74 68 65 0a 2a 2a 20 67 72 65 61 74 65 72 20 6f  the.** greater o
16a20 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 65  f the current re
16a30 73 65 72 76 65 64 20 73 70 61 63 65 20 61 6e 64  served space and
16a40 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 72 65 71   the maximum req
16a50 75 65 73 74 65 64 0a 2a 2a 20 72 65 73 65 72 76  uested.** reserv
16a60 65 20 73 70 61 63 65 2e 0a 2a 2f 0a 69 6e 74 20  e space..*/.int 
16a70 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 4f  sqlite3BtreeGetO
16a80 70 74 69 6d 61 6c 52 65 73 65 72 76 65 28 42 74  ptimalReserve(Bt
16a90 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e  ree *p){.  int n
16aa0 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
16ab0 45 6e 74 65 72 28 70 29 3b 0a 20 20 6e 20 3d 20  Enter(p);.  n = 
16ac0 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 52  sqlite3BtreeGetR
16ad0 65 73 65 72 76 65 4e 6f 4d 75 74 65 78 28 70 29  eserveNoMutex(p)
16ae0 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
16af0 48 41 53 5f 43 4f 44 45 43 0a 20 20 69 66 28 20  HAS_CODEC.  if( 
16b00 6e 3c 70 2d 3e 70 42 74 2d 3e 6f 70 74 69 6d 61  n<p->pBt->optima
16b10 6c 52 65 73 65 72 76 65 20 29 20 6e 20 3d 20 70  lReserve ) n = p
16b20 2d 3e 70 42 74 2d 3e 6f 70 74 69 6d 61 6c 52 65  ->pBt->optimalRe
16b30 73 65 72 76 65 3b 0a 23 65 6e 64 69 66 0a 20 20  serve;.#endif.  
16b40 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
16b50 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e  e(p);.  return n
16b60 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  ;.}.../*.** Set 
16b70 74 68 65 20 6d 61 78 69 6d 75 6d 20 70 61 67 65  the maximum page
16b80 20 63 6f 75 6e 74 20 66 6f 72 20 61 20 64 61 74   count for a dat
16b90 61 62 61 73 65 20 69 66 20 6d 78 50 61 67 65 20  abase if mxPage 
16ba0 69 73 20 70 6f 73 69 74 69 76 65 2e 0a 2a 2a 20  is positive..** 
16bb0 4e 6f 20 63 68 61 6e 67 65 73 20 61 72 65 20 6d  No changes are m
16bc0 61 64 65 20 69 66 20 6d 78 50 61 67 65 20 69 73  ade if mxPage is
16bd0 20 30 20 6f 72 20 6e 65 67 61 74 69 76 65 2e 0a   0 or negative..
16be0 2a 2a 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66  ** Regardless of
16bf0 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6d 78   the value of mx
16c00 50 61 67 65 2c 20 72 65 74 75 72 6e 20 74 68 65  Page, return the
16c10 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f   maximum page co
16c20 75 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  unt..*/.int sqli
16c30 74 65 33 42 74 72 65 65 4d 61 78 50 61 67 65 43  te3BtreeMaxPageC
16c40 6f 75 6e 74 28 42 74 72 65 65 20 2a 70 2c 20 69  ount(Btree *p, i
16c50 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 69 6e  nt mxPage){.  in
16c60 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  t n;.  sqlite3Bt
16c70 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 6e  reeEnter(p);.  n
16c80 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d   = sqlite3PagerM
16c90 61 78 50 61 67 65 43 6f 75 6e 74 28 70 2d 3e 70  axPageCount(p->p
16ca0 42 74 2d 3e 70 50 61 67 65 72 2c 20 6d 78 50 61  Bt->pPager, mxPa
16cb0 67 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ge);.  sqlite3Bt
16cc0 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
16cd0 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn n;.}../*.*
16ce0 2a 20 53 65 74 20 74 68 65 20 42 54 53 5f 53 45  * Set the BTS_SE
16cf0 43 55 52 45 5f 44 45 4c 45 54 45 20 66 6c 61 67  CURE_DELETE flag
16d00 20 69 66 20 6e 65 77 46 6c 61 67 20 69 73 20 30   if newFlag is 0
16d10 20 6f 72 20 31 2e 20 20 49 66 20 6e 65 77 46 6c   or 1.  If newFl
16d20 61 67 20 69 73 20 2d 31 2c 0a 2a 2a 20 74 68 65  ag is -1,.** the
16d30 6e 20 6d 61 6b 65 20 6e 6f 20 63 68 61 6e 67 65  n make no change
16d40 73 2e 20 20 41 6c 77 61 79 73 20 72 65 74 75 72  s.  Always retur
16d50 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  n the value of t
16d60 68 65 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45  he BTS_SECURE_DE
16d70 4c 45 54 45 0a 2a 2a 20 73 65 74 74 69 6e 67 20  LETE.** setting 
16d80 61 66 74 65 72 20 74 68 65 20 63 68 61 6e 67 65  after the change
16d90 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
16da0 42 74 72 65 65 53 65 63 75 72 65 44 65 6c 65 74  BtreeSecureDelet
16db0 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  e(Btree *p, int 
16dc0 6e 65 77 46 6c 61 67 29 7b 0a 20 20 69 6e 74 20  newFlag){.  int 
16dd0 62 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  b;.  if( p==0 ) 
16de0 72 65 74 75 72 6e 20 30 3b 0a 20 20 73 71 6c 69  return 0;.  sqli
16df0 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
16e00 3b 0a 20 20 69 66 28 20 6e 65 77 46 6c 61 67 3e  ;.  if( newFlag>
16e10 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 70 42 74  =0 ){.    p->pBt
16e20 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d 20 7e 42  ->btsFlags &= ~B
16e30 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45  TS_SECURE_DELETE
16e40 3b 0a 20 20 20 20 69 66 28 20 6e 65 77 46 6c 61  ;.    if( newFla
16e50 67 20 29 20 70 2d 3e 70 42 74 2d 3e 62 74 73 46  g ) p->pBt->btsF
16e60 6c 61 67 73 20 7c 3d 20 42 54 53 5f 53 45 43 55  lags |= BTS_SECU
16e70 52 45 5f 44 45 4c 45 54 45 3b 0a 20 20 7d 20 0a  RE_DELETE;.  } .
16e80 20 20 62 20 3d 20 28 70 2d 3e 70 42 74 2d 3e 62    b = (p->pBt->b
16e90 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 53 45  tsFlags & BTS_SE
16ea0 43 55 52 45 5f 44 45 4c 45 54 45 29 21 3d 30 3b  CURE_DELETE)!=0;
16eb0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
16ec0 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
16ed0 6e 20 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  n b;.}../*.** Ch
16ee0 61 6e 67 65 20 74 68 65 20 27 61 75 74 6f 2d 76  ange the 'auto-v
16ef0 61 63 75 75 6d 27 20 70 72 6f 70 65 72 74 79 20  acuum' property 
16f00 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  of the database.
16f10 20 49 66 20 74 68 65 20 27 61 75 74 6f 56 61 63   If the 'autoVac
16f20 75 75 6d 27 0a 2a 2a 20 70 61 72 61 6d 65 74 65  uum'.** paramete
16f30 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  r is non-zero, t
16f40 68 65 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20  hen auto-vacuum 
16f50 6d 6f 64 65 20 69 73 20 65 6e 61 62 6c 65 64 2e  mode is enabled.
16f60 20 49 66 20 7a 65 72 6f 2c 20 69 74 0a 2a 2a 20   If zero, it.** 
16f70 69 73 20 64 69 73 61 62 6c 65 64 2e 20 54 68 65  is disabled. The
16f80 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20 66   default value f
16f90 6f 72 20 74 68 65 20 61 75 74 6f 2d 76 61 63 75  or the auto-vacu
16fa0 75 6d 20 70 72 6f 70 65 72 74 79 20 69 73 20 0a  um property is .
16fb0 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79  ** determined by
16fc0 20 74 68 65 20 53 51 4c 49 54 45 5f 44 45 46 41   the SQLITE_DEFA
16fd0 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 6d  ULT_AUTOVACUUM m
16fe0 61 63 72 6f 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  acro..*/.int sql
16ff0 69 74 65 33 42 74 72 65 65 53 65 74 41 75 74 6f  ite3BtreeSetAuto
17000 56 61 63 75 75 6d 28 42 74 72 65 65 20 2a 70 2c  Vacuum(Btree *p,
17010 20 69 6e 74 20 61 75 74 6f 56 61 63 75 75 6d 29   int autoVacuum)
17020 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
17030 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
17040 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
17050 52 45 41 44 4f 4e 4c 59 3b 0a 23 65 6c 73 65 0a  READONLY;.#else.
17060 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
17070 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20  = p->pBt;.  int 
17080 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
17090 20 20 75 38 20 61 76 20 3d 20 28 75 38 29 61 75    u8 av = (u8)au
170a0 74 6f 56 61 63 75 75 6d 3b 0a 0a 20 20 73 71 6c  toVacuum;..  sql
170b0 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
170c0 29 3b 0a 20 20 69 66 28 20 28 70 42 74 2d 3e 62  );.  if( (pBt->b
170d0 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 50 41  tsFlags & BTS_PA
170e0 47 45 53 49 5a 45 5f 46 49 58 45 44 29 21 3d 30  GESIZE_FIXED)!=0
170f0 20 26 26 20 28 61 76 20 3f 31 3a 30 29 21 3d 70   && (av ?1:0)!=p
17100 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
17110 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
17120 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d 65  E_READONLY;.  }e
17130 6c 73 65 7b 0a 20 20 20 20 70 42 74 2d 3e 61 75  lse{.    pBt->au
17140 74 6f 56 61 63 75 75 6d 20 3d 20 61 76 20 3f 31  toVacuum = av ?1
17150 3a 30 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e 63  :0;.    pBt->inc
17160 72 56 61 63 75 75 6d 20 3d 20 61 76 3d 3d 32 20  rVacuum = av==2 
17170 3f 31 3a 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  ?1:0;.  }.  sqli
17180 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
17190 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 23  ;.  return rc;.#
171a0 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  endif.}../*.** R
171b0 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20  eturn the value 
171c0 6f 66 20 74 68 65 20 27 61 75 74 6f 2d 76 61 63  of the 'auto-vac
171d0 75 75 6d 27 20 70 72 6f 70 65 72 74 79 2e 20 49  uum' property. I
171e0 66 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 69 73  f auto-vacuum is
171f0 20 0a 2a 2a 20 65 6e 61 62 6c 65 64 20 31 20 69   .** enabled 1 i
17200 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65  s returned. Othe
17210 72 77 69 73 65 20 30 2e 0a 2a 2f 0a 69 6e 74 20  rwise 0..*/.int 
17220 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 41  sqlite3BtreeGetA
17230 75 74 6f 56 61 63 75 75 6d 28 42 74 72 65 65 20  utoVacuum(Btree 
17240 2a 70 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  *p){.#ifdef SQLI
17250 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
17260 55 4d 0a 20 20 72 65 74 75 72 6e 20 42 54 52 45  UM.  return BTRE
17270 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 4e 4f 4e  E_AUTOVACUUM_NON
17280 45 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20 72  E;.#else.  int r
17290 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  c;.  sqlite3Btre
172a0 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 72 63 20  eEnter(p);.  rc 
172b0 3d 20 28 0a 20 20 20 20 28 21 70 2d 3e 70 42 74  = (.    (!p->pBt
172c0 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 3f 42 54  ->autoVacuum)?BT
172d0 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 4e  REE_AUTOVACUUM_N
172e0 4f 4e 45 3a 0a 20 20 20 20 28 21 70 2d 3e 70 42  ONE:.    (!p->pB
172f0 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 29 3f 42  t->incrVacuum)?B
17300 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f  TREE_AUTOVACUUM_
17310 46 55 4c 4c 3a 0a 20 20 20 20 42 54 52 45 45 5f  FULL:.    BTREE_
17320 41 55 54 4f 56 41 43 55 55 4d 5f 49 4e 43 52 0a  AUTOVACUUM_INCR.
17330 20 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74    );.  sqlite3Bt
17340 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
17350 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66  eturn rc;.#endif
17360 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61  .}.../*.** Get a
17370 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 70 50   reference to pP
17380 61 67 65 31 20 6f 66 20 74 68 65 20 64 61 74 61  age1 of the data
17390 62 61 73 65 20 66 69 6c 65 2e 20 20 54 68 69 73  base file.  This
173a0 20 77 69 6c 6c 0a 2a 2a 20 61 6c 73 6f 20 61 63   will.** also ac
173b0 71 75 69 72 65 20 61 20 72 65 61 64 6c 6f 63 6b  quire a readlock
173c0 20 6f 6e 20 74 68 61 74 20 66 69 6c 65 2e 0a 2a   on that file..*
173d0 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69  *.** SQLITE_OK i
173e0 73 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75  s returned on su
173f0 63 63 65 73 73 2e 20 20 49 66 20 74 68 65 20 66  ccess.  If the f
17400 69 6c 65 20 69 73 20 6e 6f 74 20 61 0a 2a 2a 20  ile is not a.** 
17410 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 64 61 74 61  well-formed data
17420 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65 6e 20  base file, then 
17430 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69  SQLITE_CORRUPT i
17440 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 20 53  s returned..** S
17450 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72 65  QLITE_BUSY is re
17460 74 75 72 6e 65 64 20 69 66 20 74 68 65 20 64 61  turned if the da
17470 74 61 62 61 73 65 20 69 73 20 6c 6f 63 6b 65 64  tabase is locked
17480 2e 20 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a  .  SQLITE_NOMEM.
17490 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  ** is returned i
174a0 66 20 77 65 20 72 75 6e 20 6f 75 74 20 6f 66 20  f we run out of 
174b0 6d 65 6d 6f 72 79 2e 20 0a 2a 2f 0a 73 74 61 74  memory. .*/.stat
174c0 69 63 20 69 6e 74 20 6c 6f 63 6b 42 74 72 65 65  ic int lockBtree
174d0 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b  (BtShared *pBt){
174e0 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
174f0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c          /* Resul
17500 74 20 63 6f 64 65 20 66 72 6f 6d 20 73 75 62 66  t code from subf
17510 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 4d 65  unctions */.  Me
17520 6d 50 61 67 65 20 2a 70 50 61 67 65 31 3b 20 20  mPage *pPage1;  
17530 20 20 20 2f 2a 20 50 61 67 65 20 31 20 6f 66 20     /* Page 1 of 
17540 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
17550 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65  e */.  int nPage
17560 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ;           /* N
17570 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
17580 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a  n the database *
17590 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65 46 69 6c  /.  int nPageFil
175a0 65 20 3d 20 30 3b 20 20 20 2f 2a 20 4e 75 6d 62  e = 0;   /* Numb
175b0 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  er of pages in t
175c0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
175d0 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65 48   */.  int nPageH
175e0 65 61 64 65 72 3b 20 20 20 20 20 2f 2a 20 4e 75  eader;     /* Nu
175f0 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
17600 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61 63   the database ac
17610 63 6f 72 64 69 6e 67 20 74 6f 20 68 64 72 20 2a  cording to hdr *
17620 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  /..  assert( sql
17630 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
17640 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
17650 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70 50   assert( pBt->pP
17660 61 67 65 31 3d 3d 30 20 29 3b 0a 20 20 72 63 20  age1==0 );.  rc 
17670 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 68  = sqlite3PagerSh
17680 61 72 65 64 4c 6f 63 6b 28 70 42 74 2d 3e 70 50  aredLock(pBt->pP
17690 61 67 65 72 29 3b 0a 20 20 69 66 28 20 72 63 21  ager);.  if( rc!
176a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
176b0 75 72 6e 20 72 63 3b 0a 20 20 72 63 20 3d 20 62  urn rc;.  rc = b
176c0 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
176d0 20 31 2c 20 26 70 50 61 67 65 31 2c 20 30 29 3b   1, &pPage1, 0);
176e0 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
176f0 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
17700 3b 0a 0a 20 20 2f 2a 20 44 6f 20 73 6f 6d 65 20  ;..  /* Do some 
17710 63 68 65 63 6b 69 6e 67 20 74 6f 20 68 65 6c 70  checking to help
17720 20 69 6e 73 75 72 65 20 74 68 65 20 66 69 6c 65   insure the file
17730 20 77 65 20 6f 70 65 6e 65 64 20 72 65 61 6c 6c   we opened reall
17740 79 20 69 73 0a 20 20 2a 2a 20 61 20 76 61 6c 69  y is.  ** a vali
17750 64 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  d database file.
17760 20 0a 20 20 2a 2f 0a 20 20 6e 50 61 67 65 20 3d   .  */.  nPage =
17770 20 6e 50 61 67 65 48 65 61 64 65 72 20 3d 20 67   nPageHeader = g
17780 65 74 34 62 79 74 65 28 32 38 2b 28 75 38 2a 29  et4byte(28+(u8*)
17790 70 50 61 67 65 31 2d 3e 61 44 61 74 61 29 3b 0a  pPage1->aData);.
177a0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61    sqlite3PagerPa
177b0 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61  gecount(pBt->pPa
177c0 67 65 72 2c 20 26 6e 50 61 67 65 46 69 6c 65 29  ger, &nPageFile)
177d0 3b 0a 20 20 69 66 28 20 6e 50 61 67 65 3d 3d 30  ;.  if( nPage==0
177e0 20 7c 7c 20 6d 65 6d 63 6d 70 28 32 34 2b 28 75   || memcmp(24+(u
177f0 38 2a 29 70 50 61 67 65 31 2d 3e 61 44 61 74 61  8*)pPage1->aData
17800 2c 20 39 32 2b 28 75 38 2a 29 70 50 61 67 65 31  , 92+(u8*)pPage1
17810 2d 3e 61 44 61 74 61 2c 34 29 21 3d 30 20 29 7b  ->aData,4)!=0 ){
17820 0a 20 20 20 20 6e 50 61 67 65 20 3d 20 6e 50 61  .    nPage = nPa
17830 67 65 46 69 6c 65 3b 0a 20 20 7d 0a 20 20 69 66  geFile;.  }.  if
17840 28 20 6e 50 61 67 65 3e 30 20 29 7b 0a 20 20 20  ( nPage>0 ){.   
17850 20 75 33 32 20 70 61 67 65 53 69 7a 65 3b 0a 20   u32 pageSize;. 
17860 20 20 20 75 33 32 20 75 73 61 62 6c 65 53 69 7a     u32 usableSiz
17870 65 3b 0a 20 20 20 20 75 38 20 2a 70 61 67 65 31  e;.    u8 *page1
17880 20 3d 20 70 50 61 67 65 31 2d 3e 61 44 61 74 61   = pPage1->aData
17890 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  ;.    rc = SQLIT
178a0 45 5f 4e 4f 54 41 44 42 3b 0a 20 20 20 20 2f 2a  E_NOTADB;.    /*
178b0 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
178c0 34 33 37 33 37 2d 33 39 39 39 39 20 45 76 65 72  43737-39999 Ever
178d0 79 20 76 61 6c 69 64 20 53 51 4c 69 74 65 20 64  y valid SQLite d
178e0 61 74 61 62 61 73 65 20 66 69 6c 65 20 62 65 67  atabase file beg
178f0 69 6e 73 0a 20 20 20 20 2a 2a 20 77 69 74 68 20  ins.    ** with 
17900 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 31 36  the following 16
17910 20 62 79 74 65 73 20 28 69 6e 20 68 65 78 29 3a   bytes (in hex):
17920 20 35 33 20 35 31 20 34 63 20 36 39 20 37 34 20   53 51 4c 69 74 
17930 36 35 20 32 30 20 36 36 20 36 66 20 37 32 20 36  65 20 66 6f 72 6
17940 64 0a 20 20 20 20 2a 2a 20 36 31 20 37 34 20 32  d.    ** 61 74 2
17950 30 20 33 33 20 30 30 2e 20 2a 2f 0a 20 20 20 20  0 33 00. */.    
17960 69 66 28 20 6d 65 6d 63 6d 70 28 70 61 67 65 31  if( memcmp(page1
17970 2c 20 7a 4d 61 67 69 63 48 65 61 64 65 72 2c 20  , zMagicHeader, 
17980 31 36 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  16)!=0 ){.      
17990 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f  goto page1_init_
179a0 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a 23  failed;.    }..#
179b0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
179c0 54 5f 57 41 4c 0a 20 20 20 20 69 66 28 20 70 61  T_WAL.    if( pa
179d0 67 65 31 5b 31 38 5d 3e 31 20 29 7b 0a 20 20 20  ge1[18]>1 ){.   
179e0 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73     pBt->btsFlags
179f0 20 7c 3d 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c   |= BTS_READ_ONL
17a00 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  Y;.    }.    if(
17a10 20 70 61 67 65 31 5b 31 39 5d 3e 31 20 29 7b 0a   page1[19]>1 ){.
17a20 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31        goto page1
17a30 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20  _init_failed;.  
17a40 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 69 66    }.#else.    if
17a50 28 20 70 61 67 65 31 5b 31 38 5d 3e 32 20 29 7b  ( page1[18]>2 ){
17a60 0a 20 20 20 20 20 20 70 42 74 2d 3e 62 74 73 46  .      pBt->btsF
17a70 6c 61 67 73 20 7c 3d 20 42 54 53 5f 52 45 41 44  lags |= BTS_READ
17a80 5f 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20 20 20  _ONLY;.    }.   
17a90 20 69 66 28 20 70 61 67 65 31 5b 31 39 5d 3e 32   if( page1[19]>2
17aa0 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70   ){.      goto p
17ab0 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64  age1_init_failed
17ac0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
17ad0 49 66 20 74 68 65 20 77 72 69 74 65 20 76 65 72  If the write ver
17ae0 73 69 6f 6e 20 69 73 20 73 65 74 20 74 6f 20 32  sion is set to 2
17af0 2c 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20  , this database 
17b00 73 68 6f 75 6c 64 20 62 65 20 61 63 63 65 73 73  should be access
17b10 65 64 0a 20 20 20 20 2a 2a 20 69 6e 20 57 41 4c  ed.    ** in WAL
17b20 20 6d 6f 64 65 2e 20 49 66 20 74 68 65 20 6c 6f   mode. If the lo
17b30 67 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  g is not already
17b40 20 6f 70 65 6e 2c 20 6f 70 65 6e 20 69 74 20 6e   open, open it n
17b50 6f 77 2e 20 54 68 65 6e 20 0a 20 20 20 20 2a 2a  ow. Then .    **
17b60 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
17b70 4b 20 61 6e 64 20 72 65 74 75 72 6e 20 77 69 74  K and return wit
17b80 68 6f 75 74 20 70 6f 70 75 6c 61 74 69 6e 67 20  hout populating 
17b90 42 74 53 68 61 72 65 64 2e 70 50 61 67 65 31 2e  BtShared.pPage1.
17ba0 0a 20 20 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c  .    ** The call
17bb0 65 72 20 64 65 74 65 63 74 73 20 74 68 69 73 20  er detects this 
17bc0 61 6e 64 20 63 61 6c 6c 73 20 74 68 69 73 20 66  and calls this f
17bd0 75 6e 63 74 69 6f 6e 20 61 67 61 69 6e 2e 20 54  unction again. T
17be0 68 69 73 20 69 73 0a 20 20 20 20 2a 2a 20 72 65  his is.    ** re
17bf0 71 75 69 72 65 64 20 61 73 20 74 68 65 20 76 65  quired as the ve
17c00 72 73 69 6f 6e 20 6f 66 20 70 61 67 65 20 31 20  rsion of page 1 
17c10 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 74 68 65  currently in the
17c20 20 70 61 67 65 31 20 62 75 66 66 65 72 0a 20 20   page1 buffer.  
17c30 20 20 2a 2a 20 6d 61 79 20 6e 6f 74 20 62 65 20    ** may not be 
17c40 74 68 65 20 6c 61 74 65 73 74 20 76 65 72 73 69  the latest versi
17c50 6f 6e 20 2d 20 74 68 65 72 65 20 6d 61 79 20 62  on - there may b
17c60 65 20 61 20 6e 65 77 65 72 20 6f 6e 65 20 69 6e  e a newer one in
17c70 20 74 68 65 20 6c 6f 67 0a 20 20 20 20 2a 2a 20   the log.    ** 
17c80 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  file..    */.   
17c90 20 69 66 28 20 70 61 67 65 31 5b 31 39 5d 3d 3d   if( page1[19]==
17ca0 32 20 26 26 20 28 70 42 74 2d 3e 62 74 73 46 6c  2 && (pBt->btsFl
17cb0 61 67 73 20 26 20 42 54 53 5f 4e 4f 5f 57 41 4c  ags & BTS_NO_WAL
17cc0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e  )==0 ){.      in
17cd0 74 20 69 73 4f 70 65 6e 20 3d 20 30 3b 0a 20 20  t isOpen = 0;.  
17ce0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
17cf0 50 61 67 65 72 4f 70 65 6e 57 61 6c 28 70 42 74  PagerOpenWal(pBt
17d00 2d 3e 70 50 61 67 65 72 2c 20 26 69 73 4f 70 65  ->pPager, &isOpe
17d10 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  n);.      if( rc
17d20 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
17d30 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65         goto page
17d40 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20  1_init_failed;. 
17d50 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69       }else if( i
17d60 73 4f 70 65 6e 3d 3d 30 20 29 7b 0a 23 69 66 64  sOpen==0 ){.#ifd
17d70 65 66 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  ef SQLITE_DEFAUL
17d80 54 5f 57 41 4c 5f 53 41 46 45 54 59 4c 45 56 45  T_WAL_SAFETYLEVE
17d90 4c 0a 20 20 20 20 20 20 20 20 2f 2a 20 44 65 66  L.        /* Def
17da0 61 75 6c 74 20 74 6f 20 73 70 65 63 69 66 69 65  ault to specifie
17db0 64 20 73 61 66 65 74 79 5f 6c 65 76 65 6c 20 66  d safety_level f
17dc0 6f 72 20 57 41 4c 20 6d 6f 64 65 20 2a 2f 0a 20  or WAL mode */. 
17dd0 20 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e         if( pBt->
17de0 64 62 21 3d 30 20 26 26 20 70 42 74 2d 3e 64 62  db!=0 && pBt->db
17df0 2d 3e 61 44 62 21 3d 30 20 29 7b 0a 20 20 20 20  ->aDb!=0 ){.    
17e00 20 20 20 20 20 20 69 6e 74 20 69 44 62 3b 0a 20        int iDb;. 
17e10 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
17e20 20 2a 64 62 20 3d 20 70 42 74 2d 3e 64 62 3b 0a   *db = pBt->db;.
17e30 20 20 20 20 20 20 20 20 20 20 44 62 20 2a 61 44            Db *aD
17e40 62 20 3d 20 64 62 2d 3e 61 44 62 3b 0a 20 20 20  b = db->aDb;.   
17e50 20 20 20 20 20 20 20 75 38 20 6c 65 76 65 6c 20         u8 level 
17e60 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 66  = 0;.          f
17e70 6f 72 28 69 44 62 3d 30 3b 20 69 44 62 3c 64 62  or(iDb=0; iDb<db
17e80 2d 3e 6e 44 62 3b 20 69 44 62 2b 2b 29 7b 0a 20  ->nDb; iDb++){. 
17e90 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 61             if( a
17ea0 44 62 5b 69 44 62 5d 2e 70 42 74 20 26 26 20 61  Db[iDb].pBt && a
17eb0 44 62 5b 69 44 62 5d 2e 70 42 74 2d 3e 70 42 74  Db[iDb].pBt->pBt
17ec0 3d 3d 70 42 74 20 29 20 62 72 65 61 6b 3b 0a 20  ==pBt ) break;. 
17ed0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
17ee0 20 20 20 20 20 61 73 73 65 72 74 28 20 69 44 62       assert( iDb
17ef0 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 20 20  <db->nDb );.    
17f00 20 20 20 20 20 20 6c 65 76 65 6c 20 3d 20 64 62        level = db
17f10 2d 3e 61 44 62 5b 69 44 62 5d 2e 73 61 66 65 74  ->aDb[iDb].safet
17f20 79 5f 6c 65 76 65 6c 3b 0a 20 20 20 20 20 20 20  y_level;.       
17f30 20 20 20 69 66 28 20 21 53 51 4c 49 54 45 5f 44     if( !SQLITE_D
17f40 62 53 61 66 65 74 79 4c 65 76 65 6c 49 73 46 69  bSafetyLevelIsFi
17f50 78 65 64 28 6c 65 76 65 6c 29 20 26 26 20 0a 20  xed(level) && . 
17f60 20 20 20 20 20 20 20 20 20 20 20 20 28 53 51 4c              (SQL
17f70 49 54 45 5f 44 62 53 61 66 65 74 79 4c 65 76 65  ITE_DbSafetyLeve
17f80 6c 56 61 6c 75 65 28 6c 65 76 65 6c 29 20 21 3d  lValue(level) !=
17f90 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
17fa0 57 41 4c 5f 53 41 46 45 54 59 4c 45 56 45 4c 29  WAL_SAFETYLEVEL)
17fb0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
17fc0 61 44 62 5b 69 44 62 5d 2e 73 61 66 65 74 79 5f  aDb[iDb].safety_
17fd0 6c 65 76 65 6c 20 3d 20 53 51 4c 49 54 45 5f 44  level = SQLITE_D
17fe0 45 46 41 55 4c 54 5f 57 41 4c 5f 53 41 46 45 54  EFAULT_WAL_SAFET
17ff0 59 4c 45 56 45 4c 3b 0a 20 20 20 20 20 20 20 20  YLEVEL;.        
18000 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
18010 53 65 74 53 61 66 65 74 79 4c 65 76 65 6c 28 70  SetSafetyLevel(p
18020 42 74 2d 3e 70 50 61 67 65 72 2c 20 53 51 4c 49  Bt->pPager, SQLI
18030 54 45 5f 44 45 46 41 55 4c 54 5f 57 41 4c 5f 53  TE_DEFAULT_WAL_S
18040 41 46 45 54 59 4c 45 56 45 4c 2c 20 0a 20 20 20  AFETYLEVEL, .   
18050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18070 20 20 20 20 28 64 62 2d 3e 66 6c 61 67 73 26 53      (db->flags&S
18080 51 4c 49 54 45 5f 46 75 6c 6c 46 53 79 6e 63 29  QLITE_FullFSync)
18090 21 3d 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  !=0,.           
180a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
180b0 20 20 20 20 20 20 20 20 20 20 20 20 28 64 62 2d              (db-
180c0 3e 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 43 6b  >flags&SQLITE_Ck
180d0 70 74 46 75 6c 6c 46 53 79 6e 63 29 21 3d 30 29  ptFullFSync)!=0)
180e0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
180f0 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
18100 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
18110 67 65 28 70 50 61 67 65 31 29 3b 0a 20 20 20 20  ge(pPage1);.    
18120 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
18130 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  E_OK;.      }.  
18140 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
18150 4e 4f 54 41 44 42 3b 0a 20 20 20 20 7d 0a 23 65  NOTADB;.    }.#e
18160 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 45 56 49  ndif..    /* EVI
18170 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 35 34 36  DENCE-OF: R-1546
18180 35 2d 32 30 38 31 33 20 54 68 65 20 6d 61 78 69  5-20813 The maxi
18190 6d 75 6d 20 61 6e 64 20 6d 69 6e 69 6d 75 6d 20  mum and minimum 
181a0 65 6d 62 65 64 64 65 64 20 70 61 79 6c 6f 61 64  embedded payload
181b0 0a 20 20 20 20 2a 2a 20 66 72 61 63 74 69 6f 6e  .    ** fraction
181c0 73 20 61 6e 64 20 74 68 65 20 6c 65 61 66 20 70  s and the leaf p
181d0 61 79 6c 6f 61 64 20 66 72 61 63 74 69 6f 6e 20  ayload fraction 
181e0 76 61 6c 75 65 73 20 6d 75 73 74 20 62 65 20 36  values must be 6
181f0 34 2c 20 33 32 2c 20 61 6e 64 20 33 32 2e 0a 20  4, 32, and 32.. 
18200 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65     **.    ** The
18210 20 6f 72 69 67 69 6e 61 6c 20 64 65 73 69 67 6e   original design
18220 20 61 6c 6c 6f 77 65 64 20 74 68 65 73 65 20 61   allowed these a
18230 6d 6f 75 6e 74 73 20 74 6f 20 76 61 72 79 2c 20  mounts to vary, 
18240 62 75 74 20 61 73 20 6f 66 0a 20 20 20 20 2a 2a  but as of.    **
18250 20 76 65 72 73 69 6f 6e 20 33 2e 36 2e 30 2c 20   version 3.6.0, 
18260 77 65 20 72 65 71 75 69 72 65 20 74 68 65 6d 20  we require them 
18270 74 6f 20 62 65 20 66 69 78 65 64 2e 0a 20 20 20  to be fixed..   
18280 20 2a 2f 0a 20 20 20 20 69 66 28 20 6d 65 6d 63   */.    if( memc
18290 6d 70 28 26 70 61 67 65 31 5b 32 31 5d 2c 20 22  mp(&page1[21], "
182a0 5c 31 30 30 5c 30 34 30 5c 30 34 30 22 2c 33 29  \100\040\040",3)
182b0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  !=0 ){.      got
182c0 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69  o page1_init_fai
182d0 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f  led;.    }.    /
182e0 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
182f0 2d 35 31 38 37 33 2d 33 39 36 31 38 20 54 68 65  -51873-39618 The
18300 20 70 61 67 65 20 73 69 7a 65 20 66 6f 72 20 61   page size for a
18310 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
18320 73 0a 20 20 20 20 2a 2a 20 64 65 74 65 72 6d 69  s.    ** determi
18330 6e 65 64 20 62 79 20 74 68 65 20 32 2d 62 79 74  ned by the 2-byt
18340 65 20 69 6e 74 65 67 65 72 20 6c 6f 63 61 74 65  e integer locate
18350 64 20 61 74 20 61 6e 20 6f 66 66 73 65 74 20 6f  d at an offset o
18360 66 20 31 36 20 62 79 74 65 73 20 66 72 6f 6d 0a  f 16 bytes from.
18370 20 20 20 20 2a 2a 20 74 68 65 20 62 65 67 69 6e      ** the begin
18380 6e 69 6e 67 20 6f 66 20 74 68 65 20 64 61 74 61  ning of the data
18390 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20  base file. */.  
183a0 20 20 70 61 67 65 53 69 7a 65 20 3d 20 28 70 61    pageSize = (pa
183b0 67 65 31 5b 31 36 5d 3c 3c 38 29 20 7c 20 28 70  ge1[16]<<8) | (p
183c0 61 67 65 31 5b 31 37 5d 3c 3c 31 36 29 3b 0a 20  age1[17]<<16);. 
183d0 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
183e0 46 3a 20 52 2d 32 35 30 30 38 2d 32 31 36 38 38  F: R-25008-21688
183f0 20 54 68 65 20 73 69 7a 65 20 6f 66 20 61 20 70   The size of a p
18400 61 67 65 20 69 73 20 61 20 70 6f 77 65 72 20 6f  age is a power o
18410 66 20 74 77 6f 0a 20 20 20 20 2a 2a 20 62 65 74  f two.    ** bet
18420 77 65 65 6e 20 35 31 32 20 61 6e 64 20 36 35 35  ween 512 and 655
18430 33 36 20 69 6e 63 6c 75 73 69 76 65 2e 20 2a 2f  36 inclusive. */
18440 0a 20 20 20 20 69 66 28 20 28 28 70 61 67 65 53  .    if( ((pageS
18450 69 7a 65 2d 31 29 26 70 61 67 65 53 69 7a 65 29  ize-1)&pageSize)
18460 21 3d 30 0a 20 20 20 20 20 7c 7c 20 70 61 67 65  !=0.     || page
18470 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f  Size>SQLITE_MAX_
18480 50 41 47 45 5f 53 49 5a 45 20 0a 20 20 20 20 20  PAGE_SIZE .     
18490 7c 7c 20 70 61 67 65 53 69 7a 65 3c 3d 32 35 36  || pageSize<=256
184a0 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 67   .    ){.      g
184b0 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66  oto page1_init_f
184c0 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20  ailed;.    }.   
184d0 20 61 73 73 65 72 74 28 20 28 70 61 67 65 53 69   assert( (pageSi
184e0 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 0a 20 20  ze & 7)==0 );.  
184f0 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
18500 3a 20 52 2d 35 39 33 31 30 2d 35 31 32 30 35 20  : R-59310-51205 
18510 54 68 65 20 22 72 65 73 65 72 76 65 64 20 73 70  The "reserved sp
18520 61 63 65 22 20 73 69 7a 65 20 69 6e 20 74 68 65  ace" size in the
18530 20 31 2d 62 79 74 65 0a 20 20 20 20 2a 2a 20 69   1-byte.    ** i
18540 6e 74 65 67 65 72 20 61 74 20 6f 66 66 73 65 74  nteger at offset
18550 20 32 30 20 69 73 20 74 68 65 20 6e 75 6d 62 65   20 is the numbe
18560 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73 70  r of bytes of sp
18570 61 63 65 20 61 74 20 74 68 65 20 65 6e 64 20 6f  ace at the end o
18580 66 0a 20 20 20 20 2a 2a 20 65 61 63 68 20 70 61  f.    ** each pa
18590 67 65 20 74 6f 20 72 65 73 65 72 76 65 20 66 6f  ge to reserve fo
185a0 72 20 65 78 74 65 6e 73 69 6f 6e 73 2e 20 0a 20  r extensions. . 
185b0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 56 49     **.    ** EVI
185c0 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 37 34 39  DENCE-OF: R-3749
185d0 37 2d 34 32 34 31 32 20 54 68 65 20 73 69 7a 65  7-42412 The size
185e0 20 6f 66 20 74 68 65 20 72 65 73 65 72 76 65 64   of the reserved
185f0 20 72 65 67 69 6f 6e 20 69 73 0a 20 20 20 20 2a   region is.    *
18600 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20  * determined by 
18610 74 68 65 20 6f 6e 65 2d 62 79 74 65 20 75 6e 73  the one-byte uns
18620 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 66 6f  igned integer fo
18630 75 6e 64 20 61 74 20 61 6e 20 6f 66 66 73 65 74  und at an offset
18640 20 6f 66 20 32 30 0a 20 20 20 20 2a 2a 20 69 6e   of 20.    ** in
18650 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
18660 66 69 6c 65 20 68 65 61 64 65 72 2e 20 2a 2f 0a  file header. */.
18670 20 20 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d      usableSize =
18680 20 70 61 67 65 53 69 7a 65 20 2d 20 70 61 67 65   pageSize - page
18690 31 5b 32 30 5d 3b 0a 20 20 20 20 69 66 28 20 28  1[20];.    if( (
186a0 75 33 32 29 70 61 67 65 53 69 7a 65 21 3d 70 42  u32)pageSize!=pB
186b0 74 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a 20  t->pageSize ){. 
186c0 20 20 20 20 20 2f 2a 20 41 66 74 65 72 20 72 65       /* After re
186d0 61 64 69 6e 67 20 74 68 65 20 66 69 72 73 74 20  ading the first 
186e0 70 61 67 65 20 6f 66 20 74 68 65 20 64 61 74 61  page of the data
186f0 62 61 73 65 20 61 73 73 75 6d 69 6e 67 20 61 20  base assuming a 
18700 70 61 67 65 20 73 69 7a 65 0a 20 20 20 20 20 20  page size.      
18710 2a 2a 20 6f 66 20 42 74 53 68 61 72 65 64 2e 70  ** of BtShared.p
18720 61 67 65 53 69 7a 65 2c 20 77 65 20 68 61 76 65  ageSize, we have
18730 20 64 69 73 63 6f 76 65 72 65 64 20 74 68 61 74   discovered that
18740 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 69   the page-size i
18750 73 0a 20 20 20 20 20 20 2a 2a 20 61 63 74 75 61  s.      ** actua
18760 6c 6c 79 20 70 61 67 65 53 69 7a 65 2e 20 55 6e  lly pageSize. Un
18770 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61 73  lock the databas
18780 65 2c 20 6c 65 61 76 65 20 70 42 74 2d 3e 70 50  e, leave pBt->pP
18790 61 67 65 31 20 61 74 0a 20 20 20 20 20 20 2a 2a  age1 at.      **
187a0 20 7a 65 72 6f 20 61 6e 64 20 72 65 74 75 72 6e   zero and return
187b0 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 54 68 65 20   SQLITE_OK. The 
187c0 63 61 6c 6c 65 72 20 77 69 6c 6c 20 63 61 6c 6c  caller will call
187d0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 20   this function. 
187e0 20 20 20 20 20 2a 2a 20 61 67 61 69 6e 20 77 69       ** again wi
187f0 74 68 20 74 68 65 20 63 6f 72 72 65 63 74 20 70  th the correct p
18800 61 67 65 2d 73 69 7a 65 2e 0a 20 20 20 20 20 20  age-size..      
18810 2a 2f 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  */.      release
18820 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a 20 20  Page(pPage1);.  
18830 20 20 20 20 70 42 74 2d 3e 75 73 61 62 6c 65 53      pBt->usableS
18840 69 7a 65 20 3d 20 75 73 61 62 6c 65 53 69 7a 65  ize = usableSize
18850 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 61 67  ;.      pBt->pag
18860 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a 65  eSize = pageSize
18870 3b 0a 20 20 20 20 20 20 66 72 65 65 54 65 6d 70  ;.      freeTemp
18880 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20 20 20  Space(pBt);.    
18890 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
188a0 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 70  gerSetPagesize(p
188b0 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70 42 74  Bt->pPager, &pBt
188c0 2d 3e 70 61 67 65 53 69 7a 65 2c 0a 20 20 20 20  ->pageSize,.    
188d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
188e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
188f0 61 67 65 53 69 7a 65 2d 75 73 61 62 6c 65 53 69  ageSize-usableSi
18900 7a 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ze);.      retur
18910 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
18920 69 66 28 20 28 70 42 74 2d 3e 64 62 2d 3e 66 6c  if( (pBt->db->fl
18930 61 67 73 20 26 20 53 51 4c 49 54 45 5f 52 65 63  ags & SQLITE_Rec
18940 6f 76 65 72 79 4d 6f 64 65 29 3d 3d 30 20 26 26  overyMode)==0 &&
18950 20 6e 50 61 67 65 3e 6e 50 61 67 65 46 69 6c 65   nPage>nPageFile
18960 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
18970 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
18980 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70  PT;.      goto p
18990 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64  age1_init_failed
189a0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 45  ;.    }.    /* E
189b0 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 38  VIDENCE-OF: R-28
189c0 33 31 32 2d 36 34 37 30 34 20 48 6f 77 65 76 65  312-64704 Howeve
189d0 72 2c 20 74 68 65 20 75 73 61 62 6c 65 20 73 69  r, the usable si
189e0 7a 65 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65  ze is not allowe
189f0 64 20 74 6f 0a 20 20 20 20 2a 2a 20 62 65 20 6c  d to.    ** be l
18a00 65 73 73 20 74 68 61 6e 20 34 38 30 2e 20 49 6e  ess than 480. In
18a10 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 69 66   other words, if
18a20 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 69   the page size i
18a30 73 20 35 31 32 2c 20 74 68 65 6e 20 74 68 65 0a  s 512, then the.
18a40 20 20 20 20 2a 2a 20 72 65 73 65 72 76 65 64 20      ** reserved 
18a50 73 70 61 63 65 20 73 69 7a 65 20 63 61 6e 6e 6f  space size canno
18a60 74 20 65 78 63 65 65 64 20 33 32 2e 20 2a 2f 0a  t exceed 32. */.
18a70 20 20 20 20 69 66 28 20 75 73 61 62 6c 65 53 69      if( usableSi
18a80 7a 65 3c 34 38 30 20 29 7b 0a 20 20 20 20 20 20  ze<480 ){.      
18a90 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f  goto page1_init_
18aa0 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20  failed;.    }.  
18ab0 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20    pBt->pageSize 
18ac0 3d 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20  = pageSize;.    
18ad0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
18ae0 3d 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 23 69  = usableSize;.#i
18af0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
18b00 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
18b10 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
18b20 20 3d 20 28 67 65 74 34 62 79 74 65 28 26 70 61   = (get4byte(&pa
18b30 67 65 31 5b 33 36 20 2b 20 34 2a 34 5d 29 3f 31  ge1[36 + 4*4])?1
18b40 3a 30 29 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e  :0);.    pBt->in
18b50 63 72 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34  crVacuum = (get4
18b60 62 79 74 65 28 26 70 61 67 65 31 5b 33 36 20 2b  byte(&page1[36 +
18b70 20 37 2a 34 5d 29 3f 31 3a 30 29 3b 0a 23 65 6e   7*4])?1:0);.#en
18b80 64 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20 6d 61  dif.  }..  /* ma
18b90 78 4c 6f 63 61 6c 20 69 73 20 74 68 65 20 6d 61  xLocal is the ma
18ba0 78 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20  ximum amount of 
18bb0 70 61 79 6c 6f 61 64 20 74 6f 20 73 74 6f 72 65  payload to store
18bc0 20 6c 6f 63 61 6c 6c 79 20 66 6f 72 0a 20 20 2a   locally for.  *
18bd0 2a 20 61 20 63 65 6c 6c 2e 20 20 4d 61 6b 65 20  * a cell.  Make 
18be0 73 75 72 65 20 69 74 20 69 73 20 73 6d 61 6c 6c  sure it is small
18bf0 20 65 6e 6f 75 67 68 20 73 6f 20 74 68 61 74 20   enough so that 
18c00 61 74 20 6c 65 61 73 74 20 6d 69 6e 46 61 6e 6f  at least minFano
18c10 75 74 0a 20 20 2a 2a 20 63 65 6c 6c 73 20 63 61  ut.  ** cells ca
18c20 6e 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20 6f 6e  n will fit on on
18c30 65 20 70 61 67 65 2e 20 20 57 65 20 61 73 73 75  e page.  We assu
18c40 6d 65 20 61 20 31 30 2d 62 79 74 65 20 70 61 67  me a 10-byte pag
18c50 65 20 68 65 61 64 65 72 2e 0a 20 20 2a 2a 20 42  e header..  ** B
18c60 65 73 69 64 65 73 20 74 68 65 20 70 61 79 6c 6f  esides the paylo
18c70 61 64 2c 20 74 68 65 20 63 65 6c 6c 20 6d 75 73  ad, the cell mus
18c80 74 20 73 74 6f 72 65 3a 0a 20 20 2a 2a 20 20 20  t store:.  **   
18c90 20 20 32 2d 62 79 74 65 20 70 6f 69 6e 74 65 72    2-byte pointer
18ca0 20 74 6f 20 74 68 65 20 63 65 6c 6c 0a 20 20 2a   to the cell.  *
18cb0 2a 20 20 20 20 20 34 2d 62 79 74 65 20 63 68 69  *     4-byte chi
18cc0 6c 64 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20  ld pointer.  ** 
18cd0 20 20 20 20 39 2d 62 79 74 65 20 6e 4b 65 79 20      9-byte nKey 
18ce0 76 61 6c 75 65 0a 20 20 2a 2a 20 20 20 20 20 34  value.  **     4
18cf0 2d 62 79 74 65 20 6e 44 61 74 61 20 76 61 6c 75  -byte nData valu
18d00 65 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62 79 74  e.  **     4-byt
18d10 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  e overflow page 
18d20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 53 6f 20  pointer.  ** So 
18d30 61 20 63 65 6c 6c 20 63 6f 6e 73 69 73 74 73 20  a cell consists 
18d40 6f 66 20 61 20 32 2d 62 79 74 65 20 70 6f 69 6e  of a 2-byte poin
18d50 74 65 72 2c 20 61 20 68 65 61 64 65 72 20 77 68  ter, a header wh
18d60 69 63 68 20 69 73 20 61 73 20 6d 75 63 68 20 61  ich is as much a
18d70 73 0a 20 20 2a 2a 20 31 37 20 62 79 74 65 73 20  s.  ** 17 bytes 
18d80 6c 6f 6e 67 2c 20 30 20 74 6f 20 4e 20 62 79 74  long, 0 to N byt
18d90 65 73 20 6f 66 20 70 61 79 6c 6f 61 64 2c 20 61  es of payload, a
18da0 6e 64 20 61 6e 20 6f 70 74 69 6f 6e 61 6c 20 34  nd an optional 4
18db0 20 62 79 74 65 20 6f 76 65 72 66 6c 6f 77 0a 20   byte overflow. 
18dc0 20 2a 2a 20 70 61 67 65 20 70 6f 69 6e 74 65 72   ** page pointer
18dd0 2e 0a 20 20 2a 2f 0a 20 20 70 42 74 2d 3e 6d 61  ..  */.  pBt->ma
18de0 78 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 28 28  xLocal = (u16)((
18df0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d  pBt->usableSize-
18e00 31 32 29 2a 36 34 2f 32 35 35 20 2d 20 32 33 29  12)*64/255 - 23)
18e10 3b 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c 6f 63 61  ;.  pBt->minLoca
18e20 6c 20 3d 20 28 75 31 36 29 28 28 70 42 74 2d 3e  l = (u16)((pBt->
18e30 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a 33  usableSize-12)*3
18e40 32 2f 32 35 35 20 2d 20 32 33 29 3b 0a 20 20 70  2/255 - 23);.  p
18e50 42 74 2d 3e 6d 61 78 4c 65 61 66 20 3d 20 28 75  Bt->maxLeaf = (u
18e60 31 36 29 28 70 42 74 2d 3e 75 73 61 62 6c 65 53  16)(pBt->usableS
18e70 69 7a 65 20 2d 20 33 35 29 3b 0a 20 20 70 42 74  ize - 35);.  pBt
18e80 2d 3e 6d 69 6e 4c 65 61 66 20 3d 20 28 75 31 36  ->minLeaf = (u16
18e90 29 28 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  )((pBt->usableSi
18ea0 7a 65 2d 31 32 29 2a 33 32 2f 32 35 35 20 2d 20  ze-12)*32/255 - 
18eb0 32 33 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e  23);.  if( pBt->
18ec0 6d 61 78 4c 6f 63 61 6c 3e 31 32 37 20 29 7b 0a  maxLocal>127 ){.
18ed0 20 20 20 20 70 42 74 2d 3e 6d 61 78 31 62 79 74      pBt->max1byt
18ee0 65 50 61 79 6c 6f 61 64 20 3d 20 31 32 37 3b 0a  ePayload = 127;.
18ef0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 42 74    }else{.    pBt
18f00 2d 3e 6d 61 78 31 62 79 74 65 50 61 79 6c 6f 61  ->max1bytePayloa
18f10 64 20 3d 20 28 75 38 29 70 42 74 2d 3e 6d 61 78  d = (u8)pBt->max
18f20 4c 6f 63 61 6c 3b 0a 20 20 7d 0a 20 20 61 73 73  Local;.  }.  ass
18f30 65 72 74 28 20 70 42 74 2d 3e 6d 61 78 4c 65 61  ert( pBt->maxLea
18f40 66 20 2b 20 32 33 20 3c 3d 20 4d 58 5f 43 45 4c  f + 23 <= MX_CEL
18f50 4c 5f 53 49 5a 45 28 70 42 74 29 20 29 3b 0a 20  L_SIZE(pBt) );. 
18f60 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 70   pBt->pPage1 = p
18f70 50 61 67 65 31 3b 0a 20 20 70 42 74 2d 3e 6e 50  Page1;.  pBt->nP
18f80 61 67 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 72  age = nPage;.  r
18f90 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
18fa0 0a 0a 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69  ..page1_init_fai
18fb0 6c 65 64 3a 0a 20 20 72 65 6c 65 61 73 65 50 61  led:.  releasePa
18fc0 67 65 28 70 50 61 67 65 31 29 3b 0a 20 20 70 42  ge(pPage1);.  pB
18fd0 74 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a 20  t->pPage1 = 0;. 
18fe0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
18ff0 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 2f 2a  ifndef NDEBUG./*
19000 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
19010 75 6d 62 65 72 20 6f 66 20 63 75 72 73 6f 72 73  umber of cursors
19020 20 6f 70 65 6e 20 6f 6e 20 70 42 74 2e 20 54 68   open on pBt. Th
19030 69 73 20 69 73 20 66 6f 72 20 75 73 65 0a 2a 2a  is is for use.**
19040 20 69 6e 20 61 73 73 65 72 74 28 29 20 65 78 70   in assert() exp
19050 72 65 73 73 69 6f 6e 73 2c 20 73 6f 20 69 74 20  ressions, so it 
19060 69 73 20 6f 6e 6c 79 20 63 6f 6d 70 69 6c 65 64  is only compiled
19070 20 69 66 20 4e 44 45 42 55 47 20 69 73 20 6e 6f   if NDEBUG is no
19080 74 0a 2a 2a 20 64 65 66 69 6e 65 64 2e 0a 2a 2a  t.** defined..**
19090 0a 2a 2a 20 4f 6e 6c 79 20 77 72 69 74 65 20 63  .** Only write c
190a0 75 72 73 6f 72 73 20 61 72 65 20 63 6f 75 6e 74  ursors are count
190b0 65 64 20 69 66 20 77 72 4f 6e 6c 79 20 69 73 20  ed if wrOnly is 
190c0 74 72 75 65 2e 20 20 49 66 20 77 72 4f 6e 6c 79  true.  If wrOnly
190d0 20 69 73 0a 2a 2a 20 66 61 6c 73 65 20 74 68 65   is.** false the
190e0 6e 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 61 72  n all cursors ar
190f0 65 20 63 6f 75 6e 74 65 64 2e 0a 2a 2a 0a 2a 2a  e counted..**.**
19100 20 46 6f 72 20 74 68 65 20 70 75 72 70 6f 73 65   For the purpose
19110 73 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e  s of this routin
19120 65 2c 20 61 20 63 75 72 73 6f 72 20 69 73 20 61  e, a cursor is a
19130 6e 79 20 63 75 72 73 6f 72 20 74 68 61 74 0a 2a  ny cursor that.*
19140 2a 20 69 73 20 63 61 70 61 62 6c 65 20 6f 66 20  * is capable of 
19150 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69  reading or writi
19160 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ng to the databa
19170 73 65 2e 20 20 43 75 72 73 6f 72 73 20 74 68 61  se.  Cursors tha
19180 74 0a 2a 2a 20 68 61 76 65 20 62 65 65 6e 20 74  t.** have been t
19190 72 69 70 70 65 64 20 69 6e 74 6f 20 74 68 65 20  ripped into the 
191a0 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 73 74 61  CURSOR_FAULT sta
191b0 74 65 20 61 72 65 20 6e 6f 74 20 63 6f 75 6e 74  te are not count
191c0 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
191d0 74 20 63 6f 75 6e 74 56 61 6c 69 64 43 75 72 73  t countValidCurs
191e0 6f 72 73 28 42 74 53 68 61 72 65 64 20 2a 70 42  ors(BtShared *pB
191f0 74 2c 20 69 6e 74 20 77 72 4f 6e 6c 79 29 7b 0a  t, int wrOnly){.
19200 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72    BtCursor *pCur
19210 3b 0a 20 20 69 6e 74 20 72 20 3d 20 30 3b 0a 20  ;.  int r = 0;. 
19220 20 66 6f 72 28 70 43 75 72 3d 70 42 74 2d 3e 70   for(pCur=pBt->p
19230 43 75 72 73 6f 72 3b 20 70 43 75 72 3b 20 70 43  Cursor; pCur; pC
19240 75 72 3d 70 43 75 72 2d 3e 70 4e 65 78 74 29 7b  ur=pCur->pNext){
19250 0a 20 20 20 20 69 66 28 20 28 77 72 4f 6e 6c 79  .    if( (wrOnly
19260 3d 3d 30 20 7c 7c 20 28 70 43 75 72 2d 3e 63 75  ==0 || (pCur->cu
19270 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 57 72  rFlags & BTCF_Wr
19280 69 74 65 46 6c 61 67 29 21 3d 30 29 0a 20 20 20  iteFlag)!=0).   
19290 20 20 26 26 20 70 43 75 72 2d 3e 65 53 74 61 74    && pCur->eStat
192a0 65 21 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54 20  e!=CURSOR_FAULT 
192b0 29 20 72 2b 2b 3b 20 0a 20 20 7d 0a 20 20 72 65  ) r++; .  }.  re
192c0 74 75 72 6e 20 72 3b 0a 7d 0a 23 65 6e 64 69 66  turn r;.}.#endif
192d0 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65  ../*.** If there
192e0 20 61 72 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64   are no outstand
192f0 69 6e 67 20 63 75 72 73 6f 72 73 20 61 6e 64 20  ing cursors and 
19300 77 65 20 61 72 65 20 6e 6f 74 20 69 6e 20 74 68  we are not in th
19310 65 20 6d 69 64 64 6c 65 0a 2a 2a 20 6f 66 20 61  e middle.** of a
19320 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62 75 74   transaction but
19330 20 74 68 65 72 65 20 69 73 20 61 20 72 65 61 64   there is a read
19340 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
19350 61 62 61 73 65 2c 20 74 68 65 6e 0a 2a 2a 20 74  abase, then.** t
19360 68 69 73 20 72 6f 75 74 69 6e 65 20 75 6e 72 65  his routine unre
19370 66 73 20 74 68 65 20 66 69 72 73 74 20 70 61 67  fs the first pag
19380 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
19390 65 20 66 69 6c 65 20 77 68 69 63 68 20 0a 2a 2a  e file which .**
193a0 20 68 61 73 20 74 68 65 20 65 66 66 65 63 74 20   has the effect 
193b0 6f 66 20 72 65 6c 65 61 73 69 6e 67 20 74 68 65  of releasing the
193c0 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a   read lock..**.*
193d0 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61 20  * If there is a 
193e0 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 70  transaction in p
193f0 72 6f 67 72 65 73 73 2c 20 74 68 69 73 20 72 6f  rogress, this ro
19400 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
19410 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
19420 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e   unlockBtreeIfUn
19430 75 73 65 64 28 42 74 53 68 61 72 65 64 20 2a 70  used(BtShared *p
19440 42 74 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73  Bt){.  assert( s
19450 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
19460 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
19470 0a 20 20 61 73 73 65 72 74 28 20 63 6f 75 6e 74  .  assert( count
19480 56 61 6c 69 64 43 75 72 73 6f 72 73 28 70 42 74  ValidCursors(pBt
19490 2c 30 29 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 69  ,0)==0 || pBt->i
194a0 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3e 54 52 41  nTransaction>TRA
194b0 4e 53 5f 4e 4f 4e 45 20 29 3b 0a 20 20 69 66 28  NS_NONE );.  if(
194c0 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
194d0 69 6f 6e 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20  ion==TRANS_NONE 
194e0 26 26 20 70 42 74 2d 3e 70 50 61 67 65 31 21 3d  && pBt->pPage1!=
194f0 30 20 29 7b 0a 20 20 20 20 4d 65 6d 50 61 67 65  0 ){.    MemPage
19500 20 2a 70 50 61 67 65 31 20 3d 20 70 42 74 2d 3e   *pPage1 = pBt->
19510 70 50 61 67 65 31 3b 0a 20 20 20 20 61 73 73 65  pPage1;.    asse
19520 72 74 28 20 70 50 61 67 65 31 2d 3e 61 44 61 74  rt( pPage1->aDat
19530 61 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  a );.    assert(
19540 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66   sqlite3PagerRef
19550 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65  count(pBt->pPage
19560 72 29 3d 3d 31 20 29 3b 0a 20 20 20 20 70 42 74  r)==1 );.    pBt
19570 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a 20 20  ->pPage1 = 0;.  
19580 20 20 72 65 6c 65 61 73 65 50 61 67 65 4e 6f 74    releasePageNot
19590 4e 75 6c 6c 28 70 50 61 67 65 31 29 3b 0a 20 20  Null(pPage1);.  
195a0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70 42  }.}../*.** If pB
195b0 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20 65  t points to an e
195c0 6d 70 74 79 20 66 69 6c 65 20 74 68 65 6e 20 63  mpty file then c
195d0 6f 6e 76 65 72 74 20 74 68 61 74 20 65 6d 70 74  onvert that empt
195e0 79 20 66 69 6c 65 0a 2a 2a 20 69 6e 74 6f 20 61  y file.** into a
195f0 20 6e 65 77 20 65 6d 70 74 79 20 64 61 74 61 62   new empty datab
19600 61 73 65 20 62 79 20 69 6e 69 74 69 61 6c 69 7a  ase by initializ
19610 69 6e 67 20 74 68 65 20 66 69 72 73 74 20 70 61  ing the first pa
19620 67 65 20 6f 66 0a 2a 2a 20 74 68 65 20 64 61 74  ge of.** the dat
19630 61 62 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  abase..*/.static
19640 20 69 6e 74 20 6e 65 77 44 61 74 61 62 61 73 65   int newDatabase
19650 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b  (BtShared *pBt){
19660 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 31 3b  .  MemPage *pP1;
19670 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
19680 20 2a 64 61 74 61 3b 0a 20 20 69 6e 74 20 72 63   *data;.  int rc
19690 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
196a0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
196b0 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
196c0 20 69 66 28 20 70 42 74 2d 3e 6e 50 61 67 65 3e   if( pBt->nPage>
196d0 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
196e0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
196f0 20 70 50 31 20 3d 20 70 42 74 2d 3e 70 50 61 67   pP1 = pBt->pPag
19700 65 31 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  e1;.  assert( pP
19710 31 21 3d 30 20 29 3b 0a 20 20 64 61 74 61 20 3d  1!=0 );.  data =
19720 20 70 50 31 2d 3e 61 44 61 74 61 3b 0a 20 20 72   pP1->aData;.  r
19730 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
19740 57 72 69 74 65 28 70 50 31 2d 3e 70 44 62 50 61  Write(pP1->pDbPa
19750 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  ge);.  if( rc ) 
19760 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 6d 65 6d  return rc;.  mem
19770 63 70 79 28 64 61 74 61 2c 20 7a 4d 61 67 69 63  cpy(data, zMagic
19780 48 65 61 64 65 72 2c 20 73 69 7a 65 6f 66 28 7a  Header, sizeof(z
19790 4d 61 67 69 63 48 65 61 64 65 72 29 29 3b 0a 20  MagicHeader));. 
197a0 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28   assert( sizeof(
197b0 7a 4d 61 67 69 63 48 65 61 64 65 72 29 3d 3d 31  zMagicHeader)==1
197c0 36 20 29 3b 0a 20 20 64 61 74 61 5b 31 36 5d 20  6 );.  data[16] 
197d0 3d 20 28 75 38 29 28 28 70 42 74 2d 3e 70 61 67  = (u8)((pBt->pag
197e0 65 53 69 7a 65 3e 3e 38 29 26 30 78 66 66 29 3b  eSize>>8)&0xff);
197f0 0a 20 20 64 61 74 61 5b 31 37 5d 20 3d 20 28 75  .  data[17] = (u
19800 38 29 28 28 70 42 74 2d 3e 70 61 67 65 53 69 7a  8)((pBt->pageSiz
19810 65 3e 3e 31 36 29 26 30 78 66 66 29 3b 0a 20 20  e>>16)&0xff);.  
19820 64 61 74 61 5b 31 38 5d 20 3d 20 31 3b 0a 20 20  data[18] = 1;.  
19830 64 61 74 61 5b 31 39 5d 20 3d 20 31 3b 0a 20 20  data[19] = 1;.  
19840 61 73 73 65 72 74 28 20 70 42 74 2d 3e 75 73 61  assert( pBt->usa
19850 62 6c 65 53 69 7a 65 3c 3d 70 42 74 2d 3e 70 61  bleSize<=pBt->pa
19860 67 65 53 69 7a 65 20 26 26 20 70 42 74 2d 3e 75  geSize && pBt->u
19870 73 61 62 6c 65 53 69 7a 65 2b 32 35 35 3e 3d 70  sableSize+255>=p
19880 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  Bt->pageSize);. 
19890 20 64 61 74 61 5b 32 30 5d 20 3d 20 28 75 38 29   data[20] = (u8)
198a0 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d  (pBt->pageSize -
198b0 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
198c0 29 3b 0a 20 20 64 61 74 61 5b 32 31 5d 20 3d 20  );.  data[21] = 
198d0 36 34 3b 0a 20 20 64 61 74 61 5b 32 32 5d 20 3d  64;.  data[22] =
198e0 20 33 32 3b 0a 20 20 64 61 74 61 5b 32 33 5d 20   32;.  data[23] 
198f0 3d 20 33 32 3b 0a 20 20 6d 65 6d 73 65 74 28 26  = 32;.  memset(&
19900 64 61 74 61 5b 32 34 5d 2c 20 30 2c 20 31 30 30  data[24], 0, 100
19910 2d 32 34 29 3b 0a 20 20 7a 65 72 6f 50 61 67 65  -24);.  zeroPage
19920 28 70 50 31 2c 20 50 54 46 5f 49 4e 54 4b 45 59  (pP1, PTF_INTKEY
19930 7c 50 54 46 5f 4c 45 41 46 7c 50 54 46 5f 4c 45  |PTF_LEAF|PTF_LE
19940 41 46 44 41 54 41 20 29 3b 0a 20 20 70 42 74 2d  AFDATA );.  pBt-
19950 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53  >btsFlags |= BTS
19960 5f 50 41 47 45 53 49 5a 45 5f 46 49 58 45 44 3b  _PAGESIZE_FIXED;
19970 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
19980 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
19990 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 61    assert( pBt->a
199a0 75 74 6f 56 61 63 75 75 6d 3d 3d 31 20 7c 7c 20  utoVacuum==1 || 
199b0 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 3d  pBt->autoVacuum=
199c0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
199d0 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 3d  pBt->incrVacuum=
199e0 3d 31 20 7c 7c 20 70 42 74 2d 3e 69 6e 63 72 56  =1 || pBt->incrV
199f0 61 63 75 75 6d 3d 3d 30 20 29 3b 0a 20 20 70 75  acuum==0 );.  pu
19a00 74 34 62 79 74 65 28 26 64 61 74 61 5b 33 36 20  t4byte(&data[36 
19a10 2b 20 34 2a 34 5d 2c 20 70 42 74 2d 3e 61 75 74  + 4*4], pBt->aut
19a20 6f 56 61 63 75 75 6d 29 3b 0a 20 20 70 75 74 34  oVacuum);.  put4
19a30 62 79 74 65 28 26 64 61 74 61 5b 33 36 20 2b 20  byte(&data[36 + 
19a40 37 2a 34 5d 2c 20 70 42 74 2d 3e 69 6e 63 72 56  7*4], pBt->incrV
19a50 61 63 75 75 6d 29 3b 0a 23 65 6e 64 69 66 0a 20  acuum);.#endif. 
19a60 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 31 3b   pBt->nPage = 1;
19a70 0a 20 20 64 61 74 61 5b 33 31 5d 20 3d 20 31 3b  .  data[31] = 1;
19a80 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
19a90 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  _OK;.}../*.** In
19aa0 69 74 69 61 6c 69 7a 65 20 74 68 65 20 66 69 72  itialize the fir
19ab0 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 64  st page of the d
19ac0 61 74 61 62 61 73 65 20 66 69 6c 65 20 28 63 72  atabase file (cr
19ad0 65 61 74 69 6e 67 20 61 20 64 61 74 61 62 61 73  eating a databas
19ae0 65 0a 2a 2a 20 63 6f 6e 73 69 73 74 69 6e 67 20  e.** consisting 
19af0 6f 66 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65  of a single page
19b00 20 61 6e 64 20 6e 6f 20 73 63 68 65 6d 61 20 6f   and no schema o
19b10 62 6a 65 63 74 73 29 2e 20 52 65 74 75 72 6e 20  bjects). Return 
19b20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 66 20  SQLITE_OK.** if 
19b30 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 72 20 61  successful, or a
19b40 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  n SQLite error c
19b50 6f 64 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a  ode otherwise..*
19b60 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
19b70 65 65 4e 65 77 44 62 28 42 74 72 65 65 20 2a 70  eeNewDb(Btree *p
19b80 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73  ){.  int rc;.  s
19b90 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
19ba0 28 70 29 3b 0a 20 20 70 2d 3e 70 42 74 2d 3e 6e  (p);.  p->pBt->n
19bb0 50 61 67 65 20 3d 20 30 3b 0a 20 20 72 63 20 3d  Page = 0;.  rc =
19bc0 20 6e 65 77 44 61 74 61 62 61 73 65 28 70 2d 3e   newDatabase(p->
19bd0 70 42 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  pBt);.  sqlite3B
19be0 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
19bf0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
19c00 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 73  .** Attempt to s
19c10 74 61 72 74 20 61 20 6e 65 77 20 74 72 61 6e 73  tart a new trans
19c20 61 63 74 69 6f 6e 2e 20 41 20 77 72 69 74 65 2d  action. A write-
19c30 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69  transaction.** i
19c40 73 20 73 74 61 72 74 65 64 20 69 66 20 74 68 65  s started if the
19c50 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
19c60 20 69 73 20 6e 6f 6e 7a 65 72 6f 2c 20 6f 74 68   is nonzero, oth
19c70 65 72 77 69 73 65 20 61 20 72 65 61 64 2d 0a 2a  erwise a read-.*
19c80 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20  * transaction.  
19c90 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  If the second ar
19ca0 67 75 6d 65 6e 74 20 69 73 20 32 20 6f 72 20 6d  gument is 2 or m
19cb0 6f 72 65 20 61 6e 64 20 65 78 63 6c 75 73 69 76  ore and exclusiv
19cc0 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e  e.** transaction
19cd0 20 69 73 20 73 74 61 72 74 65 64 2c 20 6d 65 61   is started, mea
19ce0 6e 69 6e 67 20 74 68 61 74 20 6e 6f 20 6f 74 68  ning that no oth
19cf0 65 72 20 70 72 6f 63 65 73 73 20 69 73 20 61 6c  er process is al
19d00 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20 61 63 63 65  lowed.** to acce
19d10 73 73 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  ss the database.
19d20 20 20 41 20 70 72 65 65 78 69 73 74 69 6e 67 20    A preexisting 
19d30 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20  transaction may 
19d40 6e 6f 74 20 62 65 0a 2a 2a 20 75 70 67 72 61 64  not be.** upgrad
19d50 65 64 20 74 6f 20 65 78 63 6c 75 73 69 76 65 20  ed to exclusive 
19d60 62 79 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20  by calling this 
19d70 72 6f 75 74 69 6e 65 20 61 20 73 65 63 6f 6e 64  routine a second
19d80 20 74 69 6d 65 20 2d 20 74 68 65 0a 2a 2a 20 65   time - the.** e
19d90 78 63 6c 75 73 69 76 69 74 79 20 66 6c 61 67 20  xclusivity flag 
19da0 6f 6e 6c 79 20 77 6f 72 6b 73 20 66 6f 72 20 61  only works for a
19db0 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e   new transaction
19dc0 2e 0a 2a 2a 0a 2a 2a 20 41 20 77 72 69 74 65 2d  ..**.** A write-
19dd0 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74  transaction must
19de0 20 62 65 20 73 74 61 72 74 65 64 20 62 65 66 6f   be started befo
19df0 72 65 20 61 74 74 65 6d 70 74 69 6e 67 20 61 6e  re attempting an
19e00 79 20 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f  y .** changes to
19e10 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
19e20 4e 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c  None of the foll
19e30 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 73 20 0a  owing routines .
19e40 2a 2a 20 77 69 6c 6c 20 77 6f 72 6b 20 75 6e 6c  ** will work unl
19e50 65 73 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ess a transactio
19e60 6e 20 69 73 20 73 74 61 72 74 65 64 20 66 69 72  n is started fir
19e70 73 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 73  st:.**.**      s
19e80 71 6c 69 74 65 33 42 74 72 65 65 43 72 65 61 74  qlite3BtreeCreat
19e90 65 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20  eTable().**     
19ea0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 72 65   sqlite3BtreeCre
19eb0 61 74 65 49 6e 64 65 78 28 29 0a 2a 2a 20 20 20  ateIndex().**   
19ec0 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43     sqlite3BtreeC
19ed0 6c 65 61 72 54 61 62 6c 65 28 29 0a 2a 2a 20 20  learTable().**  
19ee0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
19ef0 44 72 6f 70 54 61 62 6c 65 28 29 0a 2a 2a 20 20  DropTable().**  
19f00 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
19f10 49 6e 73 65 72 74 28 29 0a 2a 2a 20 20 20 20 20  Insert().**     
19f20 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 65 6c   sqlite3BtreeDel
19f30 65 74 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71  ete().**      sq
19f40 6c 69 74 65 33 42 74 72 65 65 55 70 64 61 74 65  lite3BtreeUpdate
19f50 4d 65 74 61 28 29 0a 2a 2a 0a 2a 2a 20 49 66 20  Meta().**.** If 
19f60 61 6e 20 69 6e 69 74 69 61 6c 20 61 74 74 65 6d  an initial attem
19f70 70 74 20 74 6f 20 61 63 71 75 69 72 65 20 74 68  pt to acquire th
19f80 65 20 6c 6f 63 6b 20 66 61 69 6c 73 20 62 65 63  e lock fails bec
19f90 61 75 73 65 20 6f 66 20 6c 6f 63 6b 20 63 6f 6e  ause of lock con
19fa0 74 65 6e 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 74  tention.** and t
19fb0 68 65 20 64 61 74 61 62 61 73 65 20 77 61 73 20  he database was 
19fc0 70 72 65 76 69 6f 75 73 6c 79 20 75 6e 6c 6f 63  previously unloc
19fd0 6b 65 64 2c 20 74 68 65 6e 20 69 6e 76 6f 6b 65  ked, then invoke
19fe0 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65   the busy handle
19ff0 72 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 69 73  r.** if there is
1a000 20 6f 6e 65 2e 20 20 42 75 74 20 69 66 20 74 68   one.  But if th
1a010 65 72 65 20 77 61 73 20 70 72 65 76 69 6f 75 73  ere was previous
1a020 6c 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b 2c 20  ly a read-lock, 
1a030 64 6f 20 6e 6f 74 0a 2a 2a 20 69 6e 76 6f 6b 65  do not.** invoke
1a040 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65   the busy handle
1a050 72 20 2d 20 6a 75 73 74 20 72 65 74 75 72 6e 20  r - just return 
1a060 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 20 53 51  SQLITE_BUSY.  SQ
1a070 4c 49 54 45 5f 42 55 53 59 20 69 73 20 0a 2a 2a  LITE_BUSY is .**
1a080 20 72 65 74 75 72 6e 65 64 20 77 68 65 6e 20 74   returned when t
1a090 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20  here is already 
1a0a0 61 20 72 65 61 64 2d 6c 6f 63 6b 20 69 6e 20 6f  a read-lock in o
1a0b0 72 64 65 72 20 74 6f 20 61 76 6f 69 64 20 61 20  rder to avoid a 
1a0c0 64 65 61 64 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20  deadlock..**.** 
1a0d0 53 75 70 70 6f 73 65 20 74 68 65 72 65 20 61 72  Suppose there ar
1a0e0 65 20 74 77 6f 20 70 72 6f 63 65 73 73 65 73 20  e two processes 
1a0f0 41 20 61 6e 64 20 42 2e 20 20 41 20 68 61 73 20  A and B.  A has 
1a100 61 20 72 65 61 64 20 6c 6f 63 6b 20 61 6e 64 20  a read lock and 
1a110 42 20 68 61 73 0a 2a 2a 20 61 20 72 65 73 65 72  B has.** a reser
1a120 76 65 64 20 6c 6f 63 6b 2e 20 20 42 20 74 72 69  ved lock.  B tri
1a130 65 73 20 74 6f 20 70 72 6f 6d 6f 74 65 20 74 6f  es to promote to
1a140 20 65 78 63 6c 75 73 69 76 65 20 62 75 74 20 69   exclusive but i
1a150 73 20 62 6c 6f 63 6b 65 64 20 62 65 63 61 75 73  s blocked becaus
1a160 65 0a 2a 2a 20 6f 66 20 41 27 73 20 72 65 61 64  e.** of A's read
1a170 20 6c 6f 63 6b 2e 20 20 41 20 74 72 69 65 73 20   lock.  A tries 
1a180 74 6f 20 70 72 6f 6d 6f 74 65 20 74 6f 20 72 65  to promote to re
1a190 73 65 72 76 65 64 20 62 75 74 20 69 73 20 62 6c  served but is bl
1a1a0 6f 63 6b 65 64 20 62 79 20 42 2e 0a 2a 2a 20 4f  ocked by B..** O
1a1b0 6e 65 20 6f 72 20 74 68 65 20 6f 74 68 65 72 20  ne or the other 
1a1c0 6f 66 20 74 68 65 20 74 77 6f 20 70 72 6f 63 65  of the two proce
1a1d0 73 73 65 73 20 6d 75 73 74 20 67 69 76 65 20 77  sses must give w
1a1e0 61 79 20 6f 72 20 74 68 65 72 65 20 63 61 6e 20  ay or there can 
1a1f0 62 65 0a 2a 2a 20 6e 6f 20 70 72 6f 67 72 65 73  be.** no progres
1a200 73 2e 20 20 42 79 20 72 65 74 75 72 6e 69 6e 67  s.  By returning
1a210 20 53 51 4c 49 54 45 5f 42 55 53 59 20 61 6e 64   SQLITE_BUSY and
1a220 20 6e 6f 74 20 69 6e 76 6f 6b 69 6e 67 20 74 68   not invoking th
1a230 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 0a  e busy callback.
1a240 2a 2a 20 77 68 65 6e 20 41 20 61 6c 72 65 61 64  ** when A alread
1a250 79 20 68 61 73 20 61 20 72 65 61 64 20 6c 6f 63  y has a read loc
1a260 6b 2c 20 77 65 20 65 6e 63 6f 75 72 61 67 65 20  k, we encourage 
1a270 41 20 74 6f 20 67 69 76 65 20 75 70 20 61 6e 64  A to give up and
1a280 20 6c 65 74 20 42 0a 2a 2a 20 70 72 6f 63 65 65   let B.** procee
1a290 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
1a2a0 33 42 74 72 65 65 42 65 67 69 6e 54 72 61 6e 73  3BtreeBeginTrans
1a2b0 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 77  (Btree *p, int w
1a2c0 72 66 6c 61 67 29 7b 0a 20 20 73 71 6c 69 74 65  rflag){.  sqlite
1a2d0 33 20 2a 70 42 6c 6f 63 6b 20 3d 20 30 3b 0a 20  3 *pBlock = 0;. 
1a2e0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
1a2f0 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72   p->pBt;.  int r
1a300 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
1a310 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
1a320 74 65 72 28 70 29 3b 0a 20 20 62 74 72 65 65 49  ter(p);.  btreeI
1a330 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 0a 20 20  ntegrity(p);..  
1a340 2f 2a 20 49 66 20 74 68 65 20 62 74 72 65 65 20  /* If the btree 
1a350 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 61 20  is already in a 
1a360 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
1a370 6e 2c 20 6f 72 20 69 74 0a 20 20 2a 2a 20 69 73  n, or it.  ** is
1a380 20 61 6c 72 65 61 64 79 20 69 6e 20 61 20 72 65   already in a re
1a390 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 61  ad-transaction a
1a3a0 6e 64 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61  nd a read-transa
1a3b0 63 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 72 65  ction.  ** is re
1a3c0 71 75 65 73 74 65 64 2c 20 74 68 69 73 20 69 73  quested, this is
1a3d0 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20   a no-op..  */. 
1a3e0 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d   if( p->inTrans=
1a3f0 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 7c 7c 20  =TRANS_WRITE || 
1a400 28 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41  (p->inTrans==TRA
1a410 4e 53 5f 52 45 41 44 20 26 26 20 21 77 72 66 6c  NS_READ && !wrfl
1a420 61 67 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  ag) ){.    goto 
1a430 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d  trans_begun;.  }
1a440 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
1a450 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54  inTransaction==T
1a460 52 41 4e 53 5f 57 52 49 54 45 20 7c 7c 20 49 66  RANS_WRITE || If
1a470 4e 6f 74 4f 6d 69 74 41 56 28 70 42 74 2d 3e 62  NotOmitAV(pBt->b
1a480 44 6f 54 72 75 6e 63 61 74 65 29 3d 3d 30 20 29  DoTruncate)==0 )
1a490 3b 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20 74 72  ;..  /* Write tr
1a4a0 61 6e 73 61 63 74 69 6f 6e 73 20 61 72 65 20 6e  ansactions are n
1a4b0 6f 74 20 70 6f 73 73 69 62 6c 65 20 6f 6e 20 61  ot possible on a
1a4c0 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61 74 61 62   read-only datab
1a4d0 61 73 65 20 2a 2f 0a 20 20 69 66 28 20 28 70 42  ase */.  if( (pB
1a4e0 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54  t->btsFlags & BT
1a4f0 53 5f 52 45 41 44 5f 4f 4e 4c 59 29 21 3d 30 20  S_READ_ONLY)!=0 
1a500 26 26 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20  && wrflag ){.   
1a510 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41   rc = SQLITE_REA
1a520 44 4f 4e 4c 59 3b 0a 20 20 20 20 67 6f 74 6f 20  DONLY;.    goto 
1a530 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d  trans_begun;.  }
1a540 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
1a550 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
1a560 48 45 0a 20 20 2f 2a 20 49 66 20 61 6e 6f 74 68  HE.  /* If anoth
1a570 65 72 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  er database hand
1a580 6c 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 6f  le has already o
1a590 70 65 6e 65 64 20 61 20 77 72 69 74 65 20 74 72  pened a write tr
1a5a0 61 6e 73 61 63 74 69 6f 6e 20 0a 20 20 2a 2a 20  ansaction .  ** 
1a5b0 6f 6e 20 74 68 69 73 20 73 68 61 72 65 64 2d 62  on this shared-b
1a5c0 74 72 65 65 20 73 74 72 75 63 74 75 72 65 20 61  tree structure a
1a5d0 6e 64 20 61 20 73 65 63 6f 6e 64 20 77 72 69 74  nd a second writ
1a5e0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e transaction is
1a5f0 0a 20 20 2a 2a 20 72 65 71 75 65 73 74 65 64 2c  .  ** requested,
1a600 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c   return SQLITE_L
1a610 4f 43 4b 45 44 2e 0a 20 20 2a 2f 0a 20 20 69 66  OCKED..  */.  if
1a620 28 20 28 77 72 66 6c 61 67 20 26 26 20 70 42 74  ( (wrflag && pBt
1a630 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d  ->inTransaction=
1a640 3d 54 52 41 4e 53 5f 57 52 49 54 45 29 0a 20 20  =TRANS_WRITE).  
1a650 20 7c 7c 20 28 70 42 74 2d 3e 62 74 73 46 6c 61   || (pBt->btsFla
1a660 67 73 20 26 20 42 54 53 5f 50 45 4e 44 49 4e 47  gs & BTS_PENDING
1a670 29 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20 70 42  )!=0.  ){.    pB
1a680 6c 6f 63 6b 20 3d 20 70 42 74 2d 3e 70 57 72 69  lock = pBt->pWri
1a690 74 65 72 2d 3e 64 62 3b 0a 20 20 7d 65 6c 73 65  ter->db;.  }else
1a6a0 20 69 66 28 20 77 72 66 6c 61 67 3e 31 20 29 7b   if( wrflag>1 ){
1a6b0 0a 20 20 20 20 42 74 4c 6f 63 6b 20 2a 70 49 74  .    BtLock *pIt
1a6c0 65 72 3b 0a 20 20 20 20 66 6f 72 28 70 49 74 65  er;.    for(pIte
1a6d0 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 49  r=pBt->pLock; pI
1a6e0 74 65 72 3b 20 70 49 74 65 72 3d 70 49 74 65 72  ter; pIter=pIter
1a6f0 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20  ->pNext){.      
1a700 69 66 28 20 70 49 74 65 72 2d 3e 70 42 74 72 65  if( pIter->pBtre
1a710 65 21 3d 70 20 29 7b 0a 20 20 20 20 20 20 20 20  e!=p ){.        
1a720 70 42 6c 6f 63 6b 20 3d 20 70 49 74 65 72 2d 3e  pBlock = pIter->
1a730 70 42 74 72 65 65 2d 3e 64 62 3b 0a 20 20 20 20  pBtree->db;.    
1a740 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
1a750 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69   }.    }.  }.  i
1a760 66 28 20 70 42 6c 6f 63 6b 20 29 7b 0a 20 20 20  f( pBlock ){.   
1a770 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69   sqlite3Connecti
1a780 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64 62 2c  onBlocked(p->db,
1a790 20 70 42 6c 6f 63 6b 29 3b 0a 20 20 20 20 72 63   pBlock);.    rc
1a7a0 20 3d 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44   = SQLITE_LOCKED
1a7b0 5f 53 48 41 52 45 44 43 41 43 48 45 3b 0a 20 20  _SHAREDCACHE;.  
1a7c0 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67    goto trans_beg
1a7d0 75 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  un;.  }.#endif..
1a7e0 20 20 2f 2a 20 41 6e 79 20 72 65 61 64 2d 6f 6e    /* Any read-on
1a7f0 6c 79 20 6f 72 20 72 65 61 64 2d 77 72 69 74 65  ly or read-write
1a800 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6d 70   transaction imp
1a810 6c 69 65 73 20 61 20 72 65 61 64 2d 6c 6f 63 6b  lies a read-lock
1a820 20 6f 6e 20 0a 20 20 2a 2a 20 70 61 67 65 20 31   on .  ** page 1
1a830 2e 20 53 6f 20 69 66 20 73 6f 6d 65 20 6f 74 68  . So if some oth
1a840 65 72 20 73 68 61 72 65 64 2d 63 61 63 68 65 20  er shared-cache 
1a850 63 6c 69 65 6e 74 20 61 6c 72 65 61 64 79 20 68  client already h
1a860 61 73 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20  as a write-lock 
1a870 0a 20 20 2a 2a 20 6f 6e 20 70 61 67 65 20 31 2c  .  ** on page 1,
1a880 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
1a890 20 63 61 6e 6e 6f 74 20 62 65 20 6f 70 65 6e 65   cannot be opene
1a8a0 64 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 71 75 65  d. */.  rc = que
1a8b0 72 79 53 68 61 72 65 64 43 61 63 68 65 54 61 62  rySharedCacheTab
1a8c0 6c 65 4c 6f 63 6b 28 70 2c 20 4d 41 53 54 45 52  leLock(p, MASTER
1a8d0 5f 52 4f 4f 54 2c 20 52 45 41 44 5f 4c 4f 43 4b  _ROOT, READ_LOCK
1a8e0 29 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f  );.  if( SQLITE_
1a8f0 4f 4b 21 3d 72 63 20 29 20 67 6f 74 6f 20 74 72  OK!=rc ) goto tr
1a900 61 6e 73 5f 62 65 67 75 6e 3b 0a 0a 20 20 70 42  ans_begun;..  pB
1a910 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d 20 7e  t->btsFlags &= ~
1a920 42 54 53 5f 49 4e 49 54 49 41 4c 4c 59 5f 45 4d  BTS_INITIALLY_EM
1a930 50 54 59 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e  PTY;.  if( pBt->
1a940 6e 50 61 67 65 3d 3d 30 20 29 20 70 42 74 2d 3e  nPage==0 ) pBt->
1a950 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f  btsFlags |= BTS_
1a960 49 4e 49 54 49 41 4c 4c 59 5f 45 4d 50 54 59 3b  INITIALLY_EMPTY;
1a970 0a 20 20 64 6f 20 7b 0a 20 20 20 20 2f 2a 20 43  .  do {.    /* C
1a980 61 6c 6c 20 6c 6f 63 6b 42 74 72 65 65 28 29 20  all lockBtree() 
1a990 75 6e 74 69 6c 20 65 69 74 68 65 72 20 70 42 74  until either pBt
1a9a0 2d 3e 70 50 61 67 65 31 20 69 73 20 70 6f 70 75  ->pPage1 is popu
1a9b0 6c 61 74 65 64 20 6f 72 0a 20 20 20 20 2a 2a 20  lated or.    ** 
1a9c0 6c 6f 63 6b 42 74 72 65 65 28 29 20 72 65 74 75  lockBtree() retu
1a9d0 72 6e 73 20 73 6f 6d 65 74 68 69 6e 67 20 6f 74  rns something ot
1a9e0 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f  her than SQLITE_
1a9f0 4f 4b 2e 20 6c 6f 63 6b 42 74 72 65 65 28 29 0a  OK. lockBtree().
1aa00 20 20 20 20 2a 2a 20 6d 61 79 20 72 65 74 75 72      ** may retur
1aa10 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 62 75 74 20  n SQLITE_OK but 
1aa20 6c 65 61 76 65 20 70 42 74 2d 3e 70 50 61 67 65  leave pBt->pPage
1aa30 31 20 73 65 74 20 74 6f 20 30 20 69 66 20 61 66  1 set to 0 if af
1aa40 74 65 72 0a 20 20 20 20 2a 2a 20 72 65 61 64 69  ter.    ** readi
1aa50 6e 67 20 70 61 67 65 20 31 20 69 74 20 64 69 73  ng page 1 it dis
1aa60 63 6f 76 65 72 73 20 74 68 61 74 20 74 68 65 20  covers that the 
1aa70 70 61 67 65 2d 73 69 7a 65 20 6f 66 20 74 68 65  page-size of the
1aa80 20 64 61 74 61 62 61 73 65 20 0a 20 20 20 20 2a   database .    *
1aa90 2a 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 70 42  * file is not pB
1aaa0 74 2d 3e 70 61 67 65 53 69 7a 65 2e 20 49 6e 20  t->pageSize. In 
1aab0 74 68 69 73 20 63 61 73 65 20 6c 6f 63 6b 42 74  this case lockBt
1aac0 72 65 65 28 29 20 77 69 6c 6c 20 75 70 64 61 74  ree() will updat
1aad0 65 0a 20 20 20 20 2a 2a 20 70 42 74 2d 3e 70 61  e.    ** pBt->pa
1aae0 67 65 53 69 7a 65 20 74 6f 20 74 68 65 20 70 61  geSize to the pa
1aaf0 67 65 2d 73 69 7a 65 20 6f 66 20 74 68 65 20 66  ge-size of the f
1ab00 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 0a 20 20 20  ile on disk..   
1ab10 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65 28 20 70   */.    while( p
1ab20 42 74 2d 3e 70 50 61 67 65 31 3d 3d 30 20 26 26  Bt->pPage1==0 &&
1ab30 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63 20   SQLITE_OK==(rc 
1ab40 3d 20 6c 6f 63 6b 42 74 72 65 65 28 70 42 74 29  = lockBtree(pBt)
1ab50 29 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 72 63  ) );..    if( rc
1ab60 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 77  ==SQLITE_OK && w
1ab70 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 69  rflag ){.      i
1ab80 66 28 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67  f( (pBt->btsFlag
1ab90 73 20 26 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c  s & BTS_READ_ONL
1aba0 59 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  Y)!=0 ){.       
1abb0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41   rc = SQLITE_REA
1abc0 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 7d 65 6c  DONLY;.      }el
1abd0 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  se{.        rc =
1abe0 20 73 71 6c 69 74 65 33 50 61 67 65 72 42 65 67   sqlite3PagerBeg
1abf0 69 6e 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 77  in(pBt->pPager,w
1ac00 72 66 6c 61 67 3e 31 2c 73 71 6c 69 74 65 33 54  rflag>1,sqlite3T
1ac10 65 6d 70 49 6e 4d 65 6d 6f 72 79 28 70 2d 3e 64  empInMemory(p->d
1ac20 62 29 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  b));.        if(
1ac30 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1ac40 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
1ac50 20 6e 65 77 44 61 74 61 62 61 73 65 28 70 42 74   newDatabase(pBt
1ac60 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
1ac70 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20     }.    }.  .  
1ac80 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1ac90 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 75 6e 6c  _OK ){.      unl
1aca0 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64  ockBtreeIfUnused
1acb0 28 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  (pBt);.    }.  }
1acc0 77 68 69 6c 65 28 20 28 72 63 26 30 78 46 46 29  while( (rc&0xFF)
1acd0 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26  ==SQLITE_BUSY &&
1ace0 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
1acf0 69 6f 6e 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20  ion==TRANS_NONE 
1ad00 26 26 0a 20 20 20 20 20 20 20 20 20 20 62 74 72  &&.          btr
1ad10 65 65 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64  eeInvokeBusyHand
1ad20 6c 65 72 28 70 42 74 29 20 29 3b 0a 0a 20 20 69  ler(pBt) );..  i
1ad30 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1ad40 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69   ){.    if( p->i
1ad50 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 4e 4f  nTrans==TRANS_NO
1ad60 4e 45 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d  NE ){.      pBt-
1ad70 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2b 2b 3b  >nTransaction++;
1ad80 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1ad90 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
1ada0 45 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 73  E.      if( p->s
1adb0 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 20  harable ){.     
1adc0 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6c 6f     assert( p->lo
1add0 63 6b 2e 70 42 74 72 65 65 3d 3d 70 20 26 26 20  ck.pBtree==p && 
1ade0 70 2d 3e 6c 6f 63 6b 2e 69 54 61 62 6c 65 3d 3d  p->lock.iTable==
1adf0 31 20 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  1 );.        p->
1ae00 6c 6f 63 6b 2e 65 4c 6f 63 6b 20 3d 20 52 45 41  lock.eLock = REA
1ae10 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20  D_LOCK;.        
1ae20 70 2d 3e 6c 6f 63 6b 2e 70 4e 65 78 74 20 3d 20  p->lock.pNext = 
1ae30 70 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 20 20  pBt->pLock;.    
1ae40 20 20 20 20 70 42 74 2d 3e 70 4c 6f 63 6b 20 3d      pBt->pLock =
1ae50 20 26 70 2d 3e 6c 6f 63 6b 3b 0a 20 20 20 20 20   &p->lock;.     
1ae60 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a   }.#endif.    }.
1ae70 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d      p->inTrans =
1ae80 20 28 77 72 66 6c 61 67 3f 54 52 41 4e 53 5f 57   (wrflag?TRANS_W
1ae90 52 49 54 45 3a 54 52 41 4e 53 5f 52 45 41 44 29  RITE:TRANS_READ)
1aea0 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 6e 54  ;.    if( p->inT
1aeb0 72 61 6e 73 3e 70 42 74 2d 3e 69 6e 54 72 61 6e  rans>pBt->inTran
1aec0 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20  saction ){.     
1aed0 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
1aee0 69 6f 6e 20 3d 20 70 2d 3e 69 6e 54 72 61 6e 73  ion = p->inTrans
1aef0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1af00 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 20 20  wrflag ){.      
1af10 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 20  MemPage *pPage1 
1af20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 23  = pBt->pPage1;.#
1af30 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1af40 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a  IT_SHARED_CACHE.
1af50 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70        assert( !p
1af60 42 74 2d 3e 70 57 72 69 74 65 72 20 29 3b 0a 20  Bt->pWriter );. 
1af70 20 20 20 20 20 70 42 74 2d 3e 70 57 72 69 74 65       pBt->pWrite
1af80 72 20 3d 20 70 3b 0a 20 20 20 20 20 20 70 42 74  r = p;.      pBt
1af90 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d 20 7e 42  ->btsFlags &= ~B
1afa0 54 53 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20 20  TS_EXCLUSIVE;.  
1afb0 20 20 20 20 69 66 28 20 77 72 66 6c 61 67 3e 31      if( wrflag>1
1afc0 20 29 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73   ) pBt->btsFlags
1afd0 20 7c 3d 20 42 54 53 5f 45 58 43 4c 55 53 49 56   |= BTS_EXCLUSIV
1afe0 45 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20  E;.#endif..     
1aff0 20 2f 2a 20 49 66 20 74 68 65 20 64 62 2d 73 69   /* If the db-si
1b000 7a 65 20 68 65 61 64 65 72 20 66 69 65 6c 64 20  ze header field 
1b010 69 73 20 69 6e 63 6f 72 72 65 63 74 20 28 61 73  is incorrect (as
1b020 20 69 74 20 6d 61 79 20 62 65 20 69 66 20 61 6e   it may be if an
1b030 20 6f 6c 64 0a 20 20 20 20 20 20 2a 2a 20 63 6c   old.      ** cl
1b040 69 65 6e 74 20 68 61 73 20 62 65 65 6e 20 77 72  ient has been wr
1b050 69 74 69 6e 67 20 74 68 65 20 64 61 74 61 62 61  iting the databa
1b060 73 65 20 66 69 6c 65 29 2c 20 75 70 64 61 74 65  se file), update
1b070 20 69 74 20 6e 6f 77 2e 20 44 6f 69 6e 67 0a 20   it now. Doing. 
1b080 20 20 20 20 20 2a 2a 20 74 68 69 73 20 73 6f 6f       ** this soo
1b090 6e 65 72 20 72 61 74 68 65 72 20 74 68 61 6e 20  ner rather than 
1b0a0 6c 61 74 65 72 20 6d 65 61 6e 73 20 74 68 65 20  later means the 
1b0b0 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 63 61  database size ca
1b0c0 6e 20 73 61 66 65 6c 79 20 0a 20 20 20 20 20 20  n safely .      
1b0d0 2a 2a 20 72 65 2d 72 65 61 64 20 74 68 65 20 64  ** re-read the d
1b0e0 61 74 61 62 61 73 65 20 73 69 7a 65 20 66 72 6f  atabase size fro
1b0f0 6d 20 70 61 67 65 20 31 20 69 66 20 61 20 73 61  m page 1 if a sa
1b100 76 65 70 6f 69 6e 74 20 6f 72 20 74 72 61 6e 73  vepoint or trans
1b110 61 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20  action.      ** 
1b120 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 20  rollback occurs 
1b130 77 69 74 68 69 6e 20 74 68 65 20 74 72 61 6e 73  within the trans
1b140 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f  action..      */
1b150 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e  .      if( pBt->
1b160 6e 50 61 67 65 21 3d 67 65 74 34 62 79 74 65 28  nPage!=get4byte(
1b170 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 32  &pPage1->aData[2
1b180 38 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72  8]) ){.        r
1b190 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
1b1a0 57 72 69 74 65 28 70 50 61 67 65 31 2d 3e 70 44  Write(pPage1->pD
1b1b0 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
1b1c0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1b1d0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  K ){.          p
1b1e0 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d  ut4byte(&pPage1-
1b1f0 3e 61 44 61 74 61 5b 32 38 5d 2c 20 70 42 74 2d  >aData[28], pBt-
1b200 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  >nPage);.       
1b210 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
1b220 0a 20 20 7d 0a 0a 0a 74 72 61 6e 73 5f 62 65 67  .  }...trans_beg
1b230 75 6e 3a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  un:.  if( rc==SQ
1b240 4c 49 54 45 5f 4f 4b 20 26 26 20 77 72 66 6c 61  LITE_OK && wrfla
1b250 67 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73  g ){.    /* This
1b260 20 63 61 6c 6c 20 6d 61 6b 65 73 20 73 75 72 65   call makes sure
1b270 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72 20   that the pager 
1b280 68 61 73 20 74 68 65 20 63 6f 72 72 65 63 74 20  has the correct 
1b290 6e 75 6d 62 65 72 20 6f 66 0a 20 20 20 20 2a 2a  number of.    **
1b2a0 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73   open savepoints
1b2b0 2e 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20  . If the second 
1b2c0 70 61 72 61 6d 65 74 65 72 20 69 73 20 67 72 65  parameter is gre
1b2d0 61 74 65 72 20 74 68 61 6e 20 30 20 61 6e 64 0a  ater than 0 and.
1b2e0 20 20 20 20 2a 2a 20 74 68 65 20 73 75 62 2d 6a      ** the sub-j
1b2f0 6f 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20 61 6c  ournal is not al
1b300 72 65 61 64 79 20 6f 70 65 6e 2c 20 74 68 65 6e  ready open, then
1b310 20 69 74 20 77 69 6c 6c 20 62 65 20 6f 70 65 6e   it will be open
1b320 65 64 20 68 65 72 65 2e 0a 20 20 20 20 2a 2f 0a  ed here..    */.
1b330 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1b340 50 61 67 65 72 4f 70 65 6e 53 61 76 65 70 6f 69  PagerOpenSavepoi
1b350 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  nt(pBt->pPager, 
1b360 70 2d 3e 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e  p->db->nSavepoin
1b370 74 29 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65  t);.  }..  btree
1b380 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 20 20  Integrity(p);.  
1b390 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
1b3a0 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
1b3b0 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  c;.}..#ifndef SQ
1b3c0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
1b3d0 43 55 55 4d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  CUUM../*.** Set 
1b3e0 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  the pointer-map 
1b3f0 65 6e 74 72 69 65 73 20 66 6f 72 20 61 6c 6c 20  entries for all 
1b400 63 68 69 6c 64 72 65 6e 20 6f 66 20 70 61 67 65  children of page
1b410 20 70 50 61 67 65 2e 20 41 6c 73 6f 2c 20 69 66   pPage. Also, if
1b420 0a 2a 2a 20 70 50 61 67 65 20 63 6f 6e 74 61 69  .** pPage contai
1b430 6e 73 20 63 65 6c 6c 73 20 74 68 61 74 20 70 6f  ns cells that po
1b440 69 6e 74 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20  int to overflow 
1b450 70 61 67 65 73 2c 20 73 65 74 20 74 68 65 20 70  pages, set the p
1b460 6f 69 6e 74 65 72 0a 2a 2a 20 6d 61 70 20 65 6e  ointer.** map en
1b470 74 72 69 65 73 20 66 6f 72 20 74 68 65 20 6f 76  tries for the ov
1b480 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61 73 20  erflow pages as 
1b490 77 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  well..*/.static 
1b4a0 69 6e 74 20 73 65 74 43 68 69 6c 64 50 74 72 6d  int setChildPtrm
1b4b0 61 70 73 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  aps(MemPage *pPa
1b4c0 67 65 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20  ge){.  int i;   
1b4d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b4e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 75            /* Cou
1b4f0 6e 74 65 72 20 76 61 72 69 61 62 6c 65 20 2a 2f  nter variable */
1b500 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 20  .  int nCell;   
1b510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b520 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1b530 6f 66 20 63 65 6c 6c 73 20 69 6e 20 70 61 67 65  of cells in page
1b540 20 70 50 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20   pPage */.  int 
1b550 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
1b560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1b570 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
1b580 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
1b590 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20   = pPage->pBt;. 
1b5a0 20 75 38 20 69 73 49 6e 69 74 4f 72 69 67 20 3d   u8 isInitOrig =
1b5b0 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 3b 0a   pPage->isInit;.
1b5c0 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 50    Pgno pgno = pP
1b5d0 61 67 65 2d 3e 70 67 6e 6f 3b 0a 0a 20 20 61 73  age->pgno;..  as
1b5e0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
1b5f0 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
1b600 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
1b610 20 72 63 20 3d 20 62 74 72 65 65 49 6e 69 74 50   rc = btreeInitP
1b620 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 69 66  age(pPage);.  if
1b630 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1b640 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73 65 74 5f  ){.    goto set_
1b650 63 68 69 6c 64 5f 70 74 72 6d 61 70 73 5f 6f 75  child_ptrmaps_ou
1b660 74 3b 0a 20 20 7d 0a 20 20 6e 43 65 6c 6c 20 3d  t;.  }.  nCell =
1b670 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a   pPage->nCell;..
1b680 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65    for(i=0; i<nCe
1b690 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38  ll; i++){.    u8
1b6a0 20 2a 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65   *pCell = findCe
1b6b0 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a 0a 20  ll(pPage, i);.. 
1b6c0 20 20 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c     ptrmapPutOvfl
1b6d0 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  Ptr(pPage, pCell
1b6e0 2c 20 26 72 63 29 3b 0a 0a 20 20 20 20 69 66 28  , &rc);..    if(
1b6f0 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b   !pPage->leaf ){
1b700 0a 20 20 20 20 20 20 50 67 6e 6f 20 63 68 69 6c  .      Pgno chil
1b710 64 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65  dPgno = get4byte
1b720 28 70 43 65 6c 6c 29 3b 0a 20 20 20 20 20 20 70  (pCell);.      p
1b730 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 63 68  trmapPut(pBt, ch
1b740 69 6c 64 50 67 6e 6f 2c 20 50 54 52 4d 41 50 5f  ildPgno, PTRMAP_
1b750 42 54 52 45 45 2c 20 70 67 6e 6f 2c 20 26 72 63  BTREE, pgno, &rc
1b760 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
1b770 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
1b780 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 63 68 69   ){.    Pgno chi
1b790 6c 64 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74  ldPgno = get4byt
1b7a0 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e(&pPage->aData[
1b7b0 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
1b7c0 2b 38 5d 29 3b 0a 20 20 20 20 70 74 72 6d 61 70  +8]);.    ptrmap
1b7d0 50 75 74 28 70 42 74 2c 20 63 68 69 6c 64 50 67  Put(pBt, childPg
1b7e0 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45  no, PTRMAP_BTREE
1b7f0 2c 20 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20  , pgno, &rc);.  
1b800 7d 0a 0a 73 65 74 5f 63 68 69 6c 64 5f 70 74 72  }..set_child_ptr
1b810 6d 61 70 73 5f 6f 75 74 3a 0a 20 20 70 50 61 67  maps_out:.  pPag
1b820 65 2d 3e 69 73 49 6e 69 74 20 3d 20 69 73 49 6e  e->isInit = isIn
1b830 69 74 4f 72 69 67 3b 0a 20 20 72 65 74 75 72 6e  itOrig;.  return
1b840 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f   rc;.}../*.** So
1b850 6d 65 77 68 65 72 65 20 6f 6e 20 70 50 61 67 65  mewhere on pPage
1b860 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
1b870 20 70 61 67 65 20 69 46 72 6f 6d 2e 20 20 4d 6f   page iFrom.  Mo
1b880 64 69 66 79 20 74 68 69 73 20 70 6f 69 6e 74 65  dify this pointe
1b890 72 20 73 6f 0a 2a 2a 20 74 68 61 74 20 69 74 20  r so.** that it 
1b8a0 70 6f 69 6e 74 73 20 74 6f 20 69 54 6f 2e 20 50  points to iTo. P
1b8b0 61 72 61 6d 65 74 65 72 20 65 54 79 70 65 20 64  arameter eType d
1b8c0 65 73 63 72 69 62 65 73 20 74 68 65 20 74 79 70  escribes the typ
1b8d0 65 20 6f 66 20 70 6f 69 6e 74 65 72 20 74 6f 0a  e of pointer to.
1b8e0 2a 2a 20 62 65 20 6d 6f 64 69 66 69 65 64 2c 20  ** be modified, 
1b8f0 61 73 20 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a  as  follows:.**.
1b900 2a 2a 20 50 54 52 4d 41 50 5f 42 54 52 45 45 3a  ** PTRMAP_BTREE:
1b910 20 20 20 20 20 70 50 61 67 65 20 69 73 20 61 20       pPage is a 
1b920 62 74 72 65 65 2d 70 61 67 65 2e 20 54 68 65 20  btree-page. The 
1b930 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20 61  pointer points a
1b940 74 20 61 20 63 68 69 6c 64 20 0a 2a 2a 20 20 20  t a child .**   
1b950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b960 70 61 67 65 20 6f 66 20 70 50 61 67 65 2e 0a 2a  page of pPage..*
1b970 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f 56 45 52  *.** PTRMAP_OVER
1b980 46 4c 4f 57 31 3a 20 70 50 61 67 65 20 69 73 20  FLOW1: pPage is 
1b990 61 20 62 74 72 65 65 2d 70 61 67 65 2e 20 54 68  a btree-page. Th
1b9a0 65 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73  e pointer points
1b9b0 20 61 74 20 61 6e 20 6f 76 65 72 66 6c 6f 77 0a   at an overflow.
1b9c0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
1b9d0 20 20 20 20 20 70 61 67 65 20 70 6f 69 6e 74 65       page pointe
1b9e0 64 20 74 6f 20 62 79 20 6f 6e 65 20 6f 66 20 74  d to by one of t
1b9f0 68 65 20 63 65 6c 6c 73 20 6f 6e 20 70 50 61 67  he cells on pPag
1ba00 65 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f  e..**.** PTRMAP_
1ba10 4f 56 45 52 46 4c 4f 57 32 3a 20 70 50 61 67 65  OVERFLOW2: pPage
1ba20 20 69 73 20 61 6e 20 6f 76 65 72 66 6c 6f 77 2d   is an overflow-
1ba30 70 61 67 65 2e 20 54 68 65 20 70 6f 69 6e 74 65  page. The pointe
1ba40 72 20 70 6f 69 6e 74 73 20 61 74 20 74 68 65 20  r points at the 
1ba50 6e 65 78 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  next.**         
1ba60 20 20 20 20 20 20 20 20 20 20 6f 76 65 72 66 6c            overfl
1ba70 6f 77 20 70 61 67 65 20 69 6e 20 74 68 65 20 6c  ow page in the l
1ba80 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ist..*/.static i
1ba90 6e 74 20 6d 6f 64 69 66 79 50 61 67 65 50 6f 69  nt modifyPagePoi
1baa0 6e 74 65 72 28 4d 65 6d 50 61 67 65 20 2a 70 50  nter(MemPage *pP
1bab0 61 67 65 2c 20 50 67 6e 6f 20 69 46 72 6f 6d 2c  age, Pgno iFrom,
1bac0 20 50 67 6e 6f 20 69 54 6f 2c 20 75 38 20 65 54   Pgno iTo, u8 eT
1bad0 79 70 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20  ype){.  assert( 
1bae0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
1baf0 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
1bb00 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
1bb10 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
1bb20 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
1bb30 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
1bb40 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41  if( eType==PTRMA
1bb50 50 5f 4f 56 45 52 46 4c 4f 57 32 20 29 7b 0a 20  P_OVERFLOW2 ){. 
1bb60 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65     /* The pointe
1bb70 72 20 69 73 20 61 6c 77 61 79 73 20 74 68 65 20  r is always the 
1bb80 66 69 72 73 74 20 34 20 62 79 74 65 73 20 6f 66  first 4 bytes of
1bb90 20 74 68 65 20 70 61 67 65 20 69 6e 20 74 68 69   the page in thi
1bba0 73 20 63 61 73 65 2e 20 20 2a 2f 0a 20 20 20 20  s case.  */.    
1bbb0 69 66 28 20 67 65 74 34 62 79 74 65 28 70 50 61  if( get4byte(pPa
1bbc0 67 65 2d 3e 61 44 61 74 61 29 21 3d 69 46 72 6f  ge->aData)!=iFro
1bbd0 6d 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  m ){.      retur
1bbe0 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
1bbf0 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20  _BKPT;.    }.   
1bc00 20 70 75 74 34 62 79 74 65 28 70 50 61 67 65 2d   put4byte(pPage-
1bc10 3e 61 44 61 74 61 2c 20 69 54 6f 29 3b 0a 20 20  >aData, iTo);.  
1bc20 7d 65 6c 73 65 7b 0a 20 20 20 20 75 38 20 69 73  }else{.    u8 is
1bc30 49 6e 69 74 4f 72 69 67 20 3d 20 70 50 61 67 65  InitOrig = pPage
1bc40 2d 3e 69 73 49 6e 69 74 3b 0a 20 20 20 20 69 6e  ->isInit;.    in
1bc50 74 20 69 3b 0a 20 20 20 20 69 6e 74 20 6e 43 65  t i;.    int nCe
1bc60 6c 6c 3b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a  ll;.    int rc;.
1bc70 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 49  .    rc = btreeI
1bc80 6e 69 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a  nitPage(pPage);.
1bc90 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
1bca0 75 72 6e 20 72 63 3b 0a 20 20 20 20 6e 43 65 6c  urn rc;.    nCel
1bcb0 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  l = pPage->nCell
1bcc0 3b 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ;..    for(i=0; 
1bcd0 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20  i<nCell; i++){. 
1bce0 20 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d       u8 *pCell =
1bcf0 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c   findCell(pPage,
1bd00 20 69 29 3b 0a 20 20 20 20 20 20 69 66 28 20 65   i);.      if( e
1bd10 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45  Type==PTRMAP_OVE
1bd20 52 46 4c 4f 57 31 20 29 7b 0a 20 20 20 20 20 20  RFLOW1 ){.      
1bd30 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b    CellInfo info;
1bd40 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 2d 3e  .        pPage->
1bd50 78 50 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65  xParseCell(pPage
1bd60 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b  , pCell, &info);
1bd70 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 6e 66  .        if( inf
1bd80 6f 2e 69 4f 76 65 72 66 6c 6f 77 0a 20 20 20 20  o.iOverflow.    
1bd90 20 20 20 20 20 26 26 20 70 43 65 6c 6c 2b 69 6e       && pCell+in
1bda0 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 2b 33 3c 3d  fo.iOverflow+3<=
1bdb0 70 50 61 67 65 2d 3e 61 44 61 74 61 2b 70 50 61  pPage->aData+pPa
1bdc0 67 65 2d 3e 6d 61 73 6b 50 61 67 65 0a 20 20 20  ge->maskPage.   
1bdd0 20 20 20 20 20 20 26 26 20 69 46 72 6f 6d 3d 3d        && iFrom==
1bde0 67 65 74 34 62 79 74 65 28 26 70 43 65 6c 6c 5b  get4byte(&pCell[
1bdf0 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29  info.iOverflow])
1be00 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20  .        ){.    
1be10 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
1be20 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72  pCell[info.iOver
1be30 66 6c 6f 77 5d 2c 20 69 54 6f 29 3b 0a 20 20 20  flow], iTo);.   
1be40 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
1be50 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
1be60 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 66 28  lse{.        if(
1be70 20 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c 29   get4byte(pCell)
1be80 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20  ==iFrom ){.     
1be90 20 20 20 20 20 70 75 74 34 62 79 74 65 28 70 43       put4byte(pC
1bea0 65 6c 6c 2c 20 69 54 6f 29 3b 0a 20 20 20 20 20  ell, iTo);.     
1beb0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1bec0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
1bed0 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28 20 69    }.  .    if( i
1bee0 3d 3d 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20  ==nCell ){.     
1bef0 20 69 66 28 20 65 54 79 70 65 21 3d 50 54 52 4d   if( eType!=PTRM
1bf00 41 50 5f 42 54 52 45 45 20 7c 7c 20 0a 20 20 20  AP_BTREE || .   
1bf10 20 20 20 20 20 20 20 67 65 74 34 62 79 74 65 28         get4byte(
1bf20 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50  &pPage->aData[pP
1bf30 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  age->hdrOffset+8
1bf40 5d 29 21 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20  ])!=iFrom ){.   
1bf50 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
1bf60 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
1bf70 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
1bf80 75 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e  ut4byte(&pPage->
1bf90 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72  aData[pPage->hdr
1bfa0 4f 66 66 73 65 74 2b 38 5d 2c 20 69 54 6f 29 3b  Offset+8], iTo);
1bfb0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 50 61 67  .    }..    pPag
1bfc0 65 2d 3e 69 73 49 6e 69 74 20 3d 20 69 73 49 6e  e->isInit = isIn
1bfd0 69 74 4f 72 69 67 3b 0a 20 20 7d 0a 20 20 72 65  itOrig;.  }.  re
1bfe0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1bff0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74  }.../*.** Move t
1c000 68 65 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65  he open database
1c010 20 70 61 67 65 20 70 44 62 50 61 67 65 20 74 6f   page pDbPage to
1c020 20 6c 6f 63 61 74 69 6f 6e 20 69 46 72 65 65 50   location iFreeP
1c030 61 67 65 20 69 6e 20 74 68 65 20 0a 2a 2a 20 64  age in the .** d
1c040 61 74 61 62 61 73 65 2e 20 54 68 65 20 70 44 62  atabase. The pDb
1c050 50 61 67 65 20 72 65 66 65 72 65 6e 63 65 20 72  Page reference r
1c060 65 6d 61 69 6e 73 20 76 61 6c 69 64 2e 0a 2a 2a  emains valid..**
1c070 0a 2a 2a 20 54 68 65 20 69 73 43 6f 6d 6d 69 74  .** The isCommit
1c080 20 66 6c 61 67 20 69 6e 64 69 63 61 74 65 73 20   flag indicates 
1c090 74 68 61 74 20 74 68 65 72 65 20 69 73 20 6e 6f  that there is no
1c0a0 20 6e 65 65 64 20 74 6f 20 72 65 6d 65 6d 62 65   need to remembe
1c0b0 72 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 6a 6f  r that.** the jo
1c0c0 75 72 6e 61 6c 20 6e 65 65 64 73 20 74 6f 20 62  urnal needs to b
1c0d0 65 20 73 79 6e 63 28 29 65 64 20 62 65 66 6f 72  e sync()ed befor
1c0e0 65 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  e database page 
1c0f0 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f 20 0a 2a  pDbPage->pgno .*
1c100 2a 20 63 61 6e 20 62 65 20 77 72 69 74 74 65 6e  * can be written
1c110 20 74 6f 2e 20 54 68 65 20 63 61 6c 6c 65 72 20   to. The caller 
1c120 68 61 73 20 61 6c 72 65 61 64 79 20 70 72 6f 6d  has already prom
1c130 69 73 65 64 20 6e 6f 74 20 74 6f 20 77 72 69 74  ised not to writ
1c140 65 20 74 6f 20 74 68 61 74 0a 2a 2a 20 70 61 67  e to that.** pag
1c150 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
1c160 20 72 65 6c 6f 63 61 74 65 50 61 67 65 28 0a 20   relocatePage(. 
1c170 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20   BtShared *pBt, 
1c180 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 74 72            /* Btr
1c190 65 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  ee */.  MemPage 
1c1a0 2a 70 44 62 50 61 67 65 2c 20 20 20 20 20 20 20  *pDbPage,       
1c1b0 20 2f 2a 20 4f 70 65 6e 20 70 61 67 65 20 74 6f   /* Open page to
1c1c0 20 6d 6f 76 65 20 2a 2f 0a 20 20 75 38 20 65 54   move */.  u8 eT
1c1d0 79 70 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ype,            
1c1e0 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d      /* Pointer m
1c1f0 61 70 20 27 74 79 70 65 27 20 65 6e 74 72 79 20  ap 'type' entry 
1c200 66 6f 72 20 70 44 62 50 61 67 65 20 2a 2f 0a 20  for pDbPage */. 
1c210 20 50 67 6e 6f 20 69 50 74 72 50 61 67 65 2c 20   Pgno iPtrPage, 
1c220 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
1c230 6e 74 65 72 20 6d 61 70 20 27 70 61 67 65 2d 6e  nter map 'page-n
1c240 6f 27 20 65 6e 74 72 79 20 66 6f 72 20 70 44 62  o' entry for pDb
1c250 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69  Page */.  Pgno i
1c260 46 72 65 65 50 61 67 65 2c 20 20 20 20 20 20 20  FreePage,       
1c270 20 20 20 2f 2a 20 54 68 65 20 6c 6f 63 61 74 69     /* The locati
1c280 6f 6e 20 74 6f 20 6d 6f 76 65 20 70 44 62 50 61  on to move pDbPa
1c290 67 65 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 69  ge to */.  int i
1c2a0 73 43 6f 6d 6d 69 74 20 20 20 20 20 20 20 20 20  sCommit         
1c2b0 20 20 20 20 2f 2a 20 69 73 43 6f 6d 6d 69 74 20      /* isCommit 
1c2c0 66 6c 61 67 20 70 61 73 73 65 64 20 74 6f 20 73  flag passed to s
1c2d0 71 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65 70  qlite3PagerMovep
1c2e0 61 67 65 20 2a 2f 0a 29 7b 0a 20 20 4d 65 6d 50  age */.){.  MemP
1c2f0 61 67 65 20 2a 70 50 74 72 50 61 67 65 3b 20 20  age *pPtrPage;  
1c300 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74 68 61   /* The page tha
1c310 74 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69  t contains a poi
1c320 6e 74 65 72 20 74 6f 20 70 44 62 50 61 67 65 20  nter to pDbPage 
1c330 2a 2f 0a 20 20 50 67 6e 6f 20 69 44 62 50 61 67  */.  Pgno iDbPag
1c340 65 20 3d 20 70 44 62 50 61 67 65 2d 3e 70 67 6e  e = pDbPage->pgn
1c350 6f 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  o;.  Pager *pPag
1c360 65 72 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 72  er = pBt->pPager
1c370 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61  ;.  int rc;..  a
1c380 73 73 65 72 74 28 20 65 54 79 70 65 3d 3d 50 54  ssert( eType==PT
1c390 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20 7c  RMAP_OVERFLOW2 |
1c3a0 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  | eType==PTRMAP_
1c3b0 4f 56 45 52 46 4c 4f 57 31 20 7c 7c 20 0a 20 20  OVERFLOW1 || .  
1c3c0 20 20 20 20 65 54 79 70 65 3d 3d 50 54 52 4d 41      eType==PTRMA
1c3d0 50 5f 42 54 52 45 45 20 7c 7c 20 65 54 79 70 65  P_BTREE || eType
1c3e0 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47  ==PTRMAP_ROOTPAG
1c3f0 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  E );.  assert( s
1c400 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
1c410 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
1c420 0a 20 20 61 73 73 65 72 74 28 20 70 44 62 50 61  .  assert( pDbPa
1c430 67 65 2d 3e 70 42 74 3d 3d 70 42 74 20 29 3b 0a  ge->pBt==pBt );.
1c440 0a 20 20 2f 2a 20 4d 6f 76 65 20 70 61 67 65 20  .  /* Move page 
1c450 69 44 62 50 61 67 65 20 66 72 6f 6d 20 69 74 73  iDbPage from its
1c460 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f   current locatio
1c470 6e 20 74 6f 20 70 61 67 65 20 6e 75 6d 62 65 72  n to page number
1c480 20 69 46 72 65 65 50 61 67 65 20 2a 2f 0a 20 20   iFreePage */.  
1c490 54 52 41 43 45 28 28 22 41 55 54 4f 56 41 43 55  TRACE(("AUTOVACU
1c4a0 55 4d 3a 20 4d 6f 76 69 6e 67 20 25 64 20 74 6f  UM: Moving %d to
1c4b0 20 66 72 65 65 20 70 61 67 65 20 25 64 20 28 70   free page %d (p
1c4c0 74 72 20 70 61 67 65 20 25 64 20 74 79 70 65 20  tr page %d type 
1c4d0 25 64 29 5c 6e 22 2c 20 0a 20 20 20 20 20 20 69  %d)\n", .      i
1c4e0 44 62 50 61 67 65 2c 20 69 46 72 65 65 50 61 67  DbPage, iFreePag
1c4f0 65 2c 20 69 50 74 72 50 61 67 65 2c 20 65 54 79  e, iPtrPage, eTy
1c500 70 65 29 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  pe));.  rc = sql
1c510 69 74 65 33 50 61 67 65 72 4d 6f 76 65 70 61 67  ite3PagerMovepag
1c520 65 28 70 50 61 67 65 72 2c 20 70 44 62 50 61 67  e(pPager, pDbPag
1c530 65 2d 3e 70 44 62 50 61 67 65 2c 20 69 46 72 65  e->pDbPage, iFre
1c540 65 50 61 67 65 2c 20 69 73 43 6f 6d 6d 69 74 29  ePage, isCommit)
1c550 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
1c560 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74  TE_OK ){.    ret
1c570 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 44  urn rc;.  }.  pD
1c580 62 50 61 67 65 2d 3e 70 67 6e 6f 20 3d 20 69 46  bPage->pgno = iF
1c590 72 65 65 50 61 67 65 3b 0a 0a 20 20 2f 2a 20 49  reePage;..  /* I
1c5a0 66 20 70 44 62 50 61 67 65 20 77 61 73 20 61 20  f pDbPage was a 
1c5b0 62 74 72 65 65 2d 70 61 67 65 2c 20 74 68 65 6e  btree-page, then
1c5c0 20 69 74 20 6d 61 79 20 68 61 76 65 20 63 68 69   it may have chi
1c5d0 6c 64 20 70 61 67 65 73 20 61 6e 64 2f 6f 72 20  ld pages and/or 
1c5e0 63 65 6c 6c 73 0a 20 20 2a 2a 20 74 68 61 74 20  cells.  ** that 
1c5f0 70 6f 69 6e 74 20 74 6f 20 6f 76 65 72 66 6c 6f  point to overflo
1c600 77 20 70 61 67 65 73 2e 20 54 68 65 20 70 6f 69  w pages. The poi
1c610 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 69 65 73  nter map entries
1c620 20 66 6f 72 20 61 6c 6c 20 74 68 65 73 65 0a 20   for all these. 
1c630 20 2a 2a 20 70 61 67 65 73 20 6e 65 65 64 20 74   ** pages need t
1c640 6f 20 62 65 20 63 68 61 6e 67 65 64 2e 0a 20 20  o be changed..  
1c650 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 44 62 50 61  **.  ** If pDbPa
1c660 67 65 20 69 73 20 61 6e 20 6f 76 65 72 66 6c 6f  ge is an overflo
1c670 77 20 70 61 67 65 2c 20 74 68 65 6e 20 74 68 65  w page, then the
1c680 20 66 69 72 73 74 20 34 20 62 79 74 65 73 20 6d   first 4 bytes m
1c690 61 79 20 73 74 6f 72 65 20 61 0a 20 20 2a 2a 20  ay store a.  ** 
1c6a0 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 75 62  pointer to a sub
1c6b0 73 65 71 75 65 6e 74 20 6f 76 65 72 66 6c 6f 77  sequent overflow
1c6c0 20 70 61 67 65 2e 20 49 66 20 74 68 69 73 20 69   page. If this i
1c6d0 73 20 74 68 65 20 63 61 73 65 2c 20 74 68 65 6e  s the case, then
1c6e0 0a 20 20 2a 2a 20 74 68 65 20 70 6f 69 6e 74 65  .  ** the pointe
1c6f0 72 20 6d 61 70 20 6e 65 65 64 73 20 74 6f 20 62  r map needs to b
1c700 65 20 75 70 64 61 74 65 64 20 66 6f 72 20 74 68  e updated for th
1c710 65 20 73 75 62 73 65 71 75 65 6e 74 20 6f 76 65  e subsequent ove
1c720 72 66 6c 6f 77 20 70 61 67 65 2e 0a 20 20 2a 2f  rflow page..  */
1c730 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54  .  if( eType==PT
1c740 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20 65 54  RMAP_BTREE || eT
1c750 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54  ype==PTRMAP_ROOT
1c760 50 41 47 45 20 29 7b 0a 20 20 20 20 72 63 20 3d  PAGE ){.    rc =
1c770 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70 73   setChildPtrmaps
1c780 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69  (pDbPage);.    i
1c790 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1c7a0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
1c7b0 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c   rc;.    }.  }el
1c7c0 73 65 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 65 78  se{.    Pgno nex
1c7d0 74 4f 76 66 6c 20 3d 20 67 65 74 34 62 79 74 65  tOvfl = get4byte
1c7e0 28 70 44 62 50 61 67 65 2d 3e 61 44 61 74 61 29  (pDbPage->aData)
1c7f0 3b 0a 20 20 20 20 69 66 28 20 6e 65 78 74 4f 76  ;.    if( nextOv
1c800 66 6c 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  fl!=0 ){.      p
1c810 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 6e 65  trmapPut(pBt, ne
1c820 78 74 4f 76 66 6c 2c 20 50 54 52 4d 41 50 5f 4f  xtOvfl, PTRMAP_O
1c830 56 45 52 46 4c 4f 57 32 2c 20 69 46 72 65 65 50  VERFLOW2, iFreeP
1c840 61 67 65 2c 20 26 72 63 29 3b 0a 20 20 20 20 20  age, &rc);.     
1c850 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1c860 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  OK ){.        re
1c870 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
1c880 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
1c890 20 46 69 78 20 74 68 65 20 64 61 74 61 62 61 73   Fix the databas
1c8a0 65 20 70 6f 69 6e 74 65 72 20 6f 6e 20 70 61 67  e pointer on pag
1c8b0 65 20 69 50 74 72 50 61 67 65 20 74 68 61 74 20  e iPtrPage that 
1c8c0 70 6f 69 6e 74 65 64 20 61 74 20 69 44 62 50 61  pointed at iDbPa
1c8d0 67 65 20 73 6f 0a 20 20 2a 2a 20 74 68 61 74 20  ge so.  ** that 
1c8e0 69 74 20 70 6f 69 6e 74 73 20 61 74 20 69 46 72  it points at iFr
1c8f0 65 65 50 61 67 65 2e 20 41 6c 73 6f 20 66 69 78  eePage. Also fix
1c900 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   the pointer map
1c910 20 65 6e 74 72 79 20 66 6f 72 0a 20 20 2a 2a 20   entry for.  ** 
1c920 69 50 74 72 50 61 67 65 2e 0a 20 20 2a 2f 0a 20  iPtrPage..  */. 
1c930 20 69 66 28 20 65 54 79 70 65 21 3d 50 54 52 4d   if( eType!=PTRM
1c940 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20  AP_ROOTPAGE ){. 
1c950 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74     rc = btreeGet
1c960 50 61 67 65 28 70 42 74 2c 20 69 50 74 72 50 61  Page(pBt, iPtrPa
1c970 67 65 2c 20 26 70 50 74 72 50 61 67 65 2c 20 30  ge, &pPtrPage, 0
1c980 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
1c990 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1c9a0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
1c9b0 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69   }.    rc = sqli
1c9c0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
1c9d0 74 72 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  trPage->pDbPage)
1c9e0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
1c9f0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1ca00 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 74   releasePage(pPt
1ca10 72 50 61 67 65 29 3b 0a 20 20 20 20 20 20 72 65  rPage);.      re
1ca20 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
1ca30 20 20 20 72 63 20 3d 20 6d 6f 64 69 66 79 50 61     rc = modifyPa
1ca40 67 65 50 6f 69 6e 74 65 72 28 70 50 74 72 50 61  gePointer(pPtrPa
1ca50 67 65 2c 20 69 44 62 50 61 67 65 2c 20 69 46 72  ge, iDbPage, iFr
1ca60 65 65 50 61 67 65 2c 20 65 54 79 70 65 29 3b 0a  eePage, eType);.
1ca70 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
1ca80 70 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20 69  pPtrPage);.    i
1ca90 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1caa0 20 29 7b 0a 20 20 20 20 20 20 70 74 72 6d 61 70   ){.      ptrmap
1cab0 50 75 74 28 70 42 74 2c 20 69 46 72 65 65 50 61  Put(pBt, iFreePa
1cac0 67 65 2c 20 65 54 79 70 65 2c 20 69 50 74 72 50  ge, eType, iPtrP
1cad0 61 67 65 2c 20 26 72 63 29 3b 0a 20 20 20 20 7d  age, &rc);.    }
1cae0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
1caf0 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20  ;.}../* Forward 
1cb00 64 65 63 6c 61 72 61 74 69 6f 6e 20 72 65 71 75  declaration requ
1cb10 69 72 65 64 20 62 79 20 69 6e 63 72 56 61 63 75  ired by incrVacu
1cb20 75 6d 53 74 65 70 28 29 2e 20 2a 2f 0a 73 74 61  umStep(). */.sta
1cb30 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65  tic int allocate
1cb40 42 74 72 65 65 50 61 67 65 28 42 74 53 68 61 72  BtreePage(BtShar
1cb50 65 64 20 2a 2c 20 4d 65 6d 50 61 67 65 20 2a 2a  ed *, MemPage **
1cb60 2c 20 50 67 6e 6f 20 2a 2c 20 50 67 6e 6f 2c 20  , Pgno *, Pgno, 
1cb70 75 38 29 3b 0a 0a 2f 2a 0a 2a 2a 20 50 65 72 66  u8);../*.** Perf
1cb80 6f 72 6d 20 61 20 73 69 6e 67 6c 65 20 73 74 65  orm a single ste
1cb90 70 20 6f 66 20 61 6e 20 69 6e 63 72 65 6d 65 6e  p of an incremen
1cba0 74 61 6c 2d 76 61 63 75 75 6d 2e 20 49 66 20 73  tal-vacuum. If s
1cbb0 75 63 63 65 73 73 66 75 6c 2c 20 72 65 74 75 72  uccessful, retur
1cbc0 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 2e 20  n.** SQLITE_OK. 
1cbd0 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 77  If there is no w
1cbe0 6f 72 6b 20 74 6f 20 64 6f 20 28 61 6e 64 20 74  ork to do (and t
1cbf0 68 65 72 65 66 6f 72 65 20 6e 6f 20 70 6f 69 6e  herefore no poin
1cc00 74 20 69 6e 20 0a 2a 2a 20 63 61 6c 6c 69 6e 67  t in .** calling
1cc10 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   this function a
1cc20 67 61 69 6e 29 2c 20 72 65 74 75 72 6e 20 53 51  gain), return SQ
1cc30 4c 49 54 45 5f 44 4f 4e 45 2e 20 4f 72 2c 20 69  LITE_DONE. Or, i
1cc40 66 20 61 6e 20 65 72 72 6f 72 20 0a 2a 2a 20 6f  f an error .** o
1cc50 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20 73 6f  ccurs, return so
1cc60 6d 65 20 6f 74 68 65 72 20 65 72 72 6f 72 20 63  me other error c
1cc70 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 72 65 20  ode..**.** More 
1cc80 73 70 65 63 69 66 69 63 61 6c 6c 79 2c 20 74 68  specifically, th
1cc90 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 74 74 65  is function atte
1cca0 6d 70 74 73 20 74 6f 20 72 65 2d 6f 72 67 61 6e  mpts to re-organ
1ccb0 69 7a 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ize the database
1ccc0 20 73 6f 20 0a 2a 2a 20 74 68 61 74 20 74 68 65   so .** that the
1ccd0 20 6c 61 73 74 20 70 61 67 65 20 6f 66 20 74 68   last page of th
1cce0 65 20 66 69 6c 65 20 63 75 72 72 65 6e 74 6c 79  e file currently
1ccf0 20 69 6e 20 75 73 65 20 69 73 20 6e 6f 20 6c 6f   in use is no lo
1cd00 6e 67 65 72 20 69 6e 20 75 73 65 2e 0a 2a 2a 0a  nger in use..**.
1cd10 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 6e 46 69  ** Parameter nFi
1cd20 6e 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  n is the number 
1cd30 6f 66 20 70 61 67 65 73 20 74 68 61 74 20 74 68  of pages that th
1cd40 69 73 20 64 61 74 61 62 61 73 65 20 77 6f 75 6c  is database woul
1cd50 64 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 77 65 72  d contain.** wer
1cd60 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  e this function 
1cd70 63 61 6c 6c 65 64 20 75 6e 74 69 6c 20 69 74 20  called until it 
1cd80 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 44  returns SQLITE_D
1cd90 4f 4e 45 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ONE..**.** If th
1cda0 65 20 62 43 6f 6d 6d 69 74 20 70 61 72 61 6d 65  e bCommit parame
1cdb0 74 65 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  ter is non-zero,
1cdc0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   this function a
1cdd0 73 73 75 6d 65 73 20 74 68 61 74 20 74 68 65 20  ssumes that the 
1cde0 0a 2a 2a 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20  .** caller will 
1cdf0 6b 65 65 70 20 63 61 6c 6c 69 6e 67 20 69 6e 63  keep calling inc
1ce00 72 56 61 63 75 75 6d 53 74 65 70 28 29 20 75 6e  rVacuumStep() un
1ce10 74 69 6c 20 69 74 20 72 65 74 75 72 6e 73 20 53  til it returns S
1ce20 51 4c 49 54 45 5f 44 4f 4e 45 20 0a 2a 2a 20 6f  QLITE_DONE .** o
1ce30 72 20 61 6e 20 65 72 72 6f 72 2e 20 62 43 6f 6d  r an error. bCom
1ce40 6d 69 74 20 69 73 20 70 61 73 73 65 64 20 74 72  mit is passed tr
1ce50 75 65 20 66 6f 72 20 61 6e 20 61 75 74 6f 2d 76  ue for an auto-v
1ce60 61 63 75 75 6d 2d 6f 6e 2d 63 6f 6d 6d 69 74 20  acuum-on-commit 
1ce70 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 2c 20 6f  .** operation, o
1ce80 72 20 66 61 6c 73 65 20 66 6f 72 20 61 6e 20 69  r false for an i
1ce90 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75  ncremental vacuu
1cea0 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  m..*/.static int
1ceb0 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28   incrVacuumStep(
1cec0 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50  BtShared *pBt, P
1ced0 67 6e 6f 20 6e 46 69 6e 2c 20 50 67 6e 6f 20 69  gno nFin, Pgno i
1cee0 4c 61 73 74 50 67 2c 20 69 6e 74 20 62 43 6f 6d  LastPg, int bCom
1cef0 6d 69 74 29 7b 0a 20 20 50 67 6e 6f 20 6e 46 72  mit){.  Pgno nFr
1cf00 65 65 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20  eeList;         
1cf10 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
1cf20 61 67 65 73 20 73 74 69 6c 6c 20 6f 6e 20 74 68  ages still on th
1cf30 65 20 66 72 65 65 2d 6c 69 73 74 20 2a 2f 0a 20  e free-list */. 
1cf40 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65   int rc;..  asse
1cf50 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
1cf60 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
1cf70 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
1cf80 69 4c 61 73 74 50 67 3e 6e 46 69 6e 20 29 3b 0a  iLastPg>nFin );.
1cf90 0a 20 20 69 66 28 20 21 50 54 52 4d 41 50 5f 49  .  if( !PTRMAP_I
1cfa0 53 50 41 47 45 28 70 42 74 2c 20 69 4c 61 73 74  SPAGE(pBt, iLast
1cfb0 50 67 29 20 26 26 20 69 4c 61 73 74 50 67 21 3d  Pg) && iLastPg!=
1cfc0 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
1cfd0 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 75 38  E(pBt) ){.    u8
1cfe0 20 65 54 79 70 65 3b 0a 20 20 20 20 50 67 6e 6f   eType;.    Pgno
1cff0 20 69 50 74 72 50 61 67 65 3b 0a 0a 20 20 20 20   iPtrPage;..    
1d000 6e 46 72 65 65 4c 69 73 74 20 3d 20 67 65 74 34  nFreeList = get4
1d010 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65  byte(&pBt->pPage
1d020 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20  1->aData[36]);. 
1d030 20 20 20 69 66 28 20 6e 46 72 65 65 4c 69 73 74     if( nFreeList
1d040 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ==0 ){.      ret
1d050 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  urn SQLITE_DONE;
1d060 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 63 20 3d  .    }..    rc =
1d070 20 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20   ptrmapGet(pBt, 
1d080 69 4c 61 73 74 50 67 2c 20 26 65 54 79 70 65 2c  iLastPg, &eType,
1d090 20 26 69 50 74 72 50 61 67 65 29 3b 0a 20 20 20   &iPtrPage);.   
1d0a0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1d0b0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  OK ){.      retu
1d0c0 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
1d0d0 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d   if( eType==PTRM
1d0e0 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20  AP_ROOTPAGE ){. 
1d0f0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
1d100 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
1d110 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
1d120 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52  eType==PTRMAP_FR
1d130 45 45 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20  EEPAGE ){.      
1d140 69 66 28 20 62 43 6f 6d 6d 69 74 3d 3d 30 20 29  if( bCommit==0 )
1d150 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 52 65 6d  {.        /* Rem
1d160 6f 76 65 20 74 68 65 20 70 61 67 65 20 66 72 6f  ove the page fro
1d170 6d 20 74 68 65 20 66 69 6c 65 73 20 66 72 65 65  m the files free
1d180 2d 6c 69 73 74 2e 20 54 68 69 73 20 69 73 20 6e  -list. This is n
1d190 6f 74 20 72 65 71 75 69 72 65 64 0a 20 20 20 20  ot required.    
1d1a0 20 20 20 20 2a 2a 20 69 66 20 62 43 6f 6d 6d 69      ** if bCommi
1d1b0 74 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2e 20 49  t is non-zero. I
1d1c0 6e 20 74 68 61 74 20 63 61 73 65 2c 20 74 68 65  n that case, the
1d1d0 20 66 72 65 65 2d 6c 69 73 74 20 77 69 6c 6c 20   free-list will 
1d1e0 62 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 72  be.        ** tr
1d1f0 75 6e 63 61 74 65 64 20 74 6f 20 7a 65 72 6f 20  uncated to zero 
1d200 61 66 74 65 72 20 74 68 69 73 20 66 75 6e 63 74  after this funct
1d210 69 6f 6e 20 72 65 74 75 72 6e 73 2c 20 73 6f 20  ion returns, so 
1d220 69 74 20 64 6f 65 73 6e 27 74 20 0a 20 20 20 20  it doesn't .    
1d230 20 20 20 20 2a 2a 20 6d 61 74 74 65 72 20 69 66      ** matter if
1d240 20 69 74 20 73 74 69 6c 6c 20 63 6f 6e 74 61 69   it still contai
1d250 6e 73 20 73 6f 6d 65 20 67 61 72 62 61 67 65 20  ns some garbage 
1d260 65 6e 74 72 69 65 73 2e 0a 20 20 20 20 20 20 20  entries..       
1d270 20 2a 2f 0a 20 20 20 20 20 20 20 20 50 67 6e 6f   */.        Pgno
1d280 20 69 46 72 65 65 50 67 3b 0a 20 20 20 20 20 20   iFreePg;.      
1d290 20 20 4d 65 6d 50 61 67 65 20 2a 70 46 72 65 65    MemPage *pFree
1d2a0 50 67 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  Pg;.        rc =
1d2b0 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61   allocateBtreePa
1d2c0 67 65 28 70 42 74 2c 20 26 70 46 72 65 65 50 67  ge(pBt, &pFreePg
1d2d0 2c 20 26 69 46 72 65 65 50 67 2c 20 69 4c 61 73  , &iFreePg, iLas
1d2e0 74 50 67 2c 20 42 54 41 4c 4c 4f 43 5f 45 58 41  tPg, BTALLOC_EXA
1d2f0 43 54 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  CT);.        if(
1d300 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1d310 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
1d320 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  rn rc;.        }
1d330 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
1d340 20 69 46 72 65 65 50 67 3d 3d 69 4c 61 73 74 50   iFreePg==iLastP
1d350 67 20 29 3b 0a 20 20 20 20 20 20 20 20 72 65 6c  g );.        rel
1d360 65 61 73 65 50 61 67 65 28 70 46 72 65 65 50 67  easePage(pFreePg
1d370 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
1d380 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 50 67   else {.      Pg
1d390 6e 6f 20 69 46 72 65 65 50 67 3b 20 20 20 20 20  no iFreePg;     
1d3a0 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
1d3b0 20 6f 66 20 66 72 65 65 20 70 61 67 65 20 74 6f   of free page to
1d3c0 20 6d 6f 76 65 20 70 4c 61 73 74 50 67 20 74 6f   move pLastPg to
1d3d0 20 2a 2f 0a 20 20 20 20 20 20 4d 65 6d 50 61 67   */.      MemPag
1d3e0 65 20 2a 70 4c 61 73 74 50 67 3b 0a 20 20 20 20  e *pLastPg;.    
1d3f0 20 20 75 38 20 65 4d 6f 64 65 20 3d 20 42 54 41    u8 eMode = BTA
1d400 4c 4c 4f 43 5f 41 4e 59 3b 20 20 20 2f 2a 20 4d  LLOC_ANY;   /* M
1d410 6f 64 65 20 70 61 72 61 6d 65 74 65 72 20 66 6f  ode parameter fo
1d420 72 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50  r allocateBtreeP
1d430 61 67 65 28 29 20 2a 2f 0a 20 20 20 20 20 20 50  age() */.      P
1d440 67 6e 6f 20 69 4e 65 61 72 20 3d 20 30 3b 20 20  gno iNear = 0;  
1d450 20 20 20 20 20 20 20 20 20 2f 2a 20 6e 65 61 72           /* near
1d460 62 79 20 70 61 72 61 6d 65 74 65 72 20 66 6f 72  by parameter for
1d470 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61   allocateBtreePa
1d480 67 65 28 29 20 2a 2f 0a 0a 20 20 20 20 20 20 72  ge() */..      r
1d490 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65  c = btreeGetPage
1d4a0 28 70 42 74 2c 20 69 4c 61 73 74 50 67 2c 20 26  (pBt, iLastPg, &
1d4b0 70 4c 61 73 74 50 67 2c 20 30 29 3b 0a 20 20 20  pLastPg, 0);.   
1d4c0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1d4d0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1d4e0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
1d4f0 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   }..      /* If 
1d500 62 43 6f 6d 6d 69 74 20 69 73 20 7a 65 72 6f 2c  bCommit is zero,
1d510 20 74 68 69 73 20 6c 6f 6f 70 20 72 75 6e 73 20   this loop runs 
1d520 65 78 61 63 74 6c 79 20 6f 6e 63 65 20 61 6e 64  exactly once and
1d530 20 70 61 67 65 20 70 4c 61 73 74 50 67 0a 20 20   page pLastPg.  
1d540 20 20 20 20 2a 2a 20 69 73 20 73 77 61 70 70 65      ** is swappe
1d550 64 20 77 69 74 68 20 74 68 65 20 66 69 72 73 74  d with the first
1d560 20 66 72 65 65 20 70 61 67 65 20 70 75 6c 6c 65   free page pulle
1d570 64 20 6f 66 66 20 74 68 65 20 66 72 65 65 20 6c  d off the free l
1d580 69 73 74 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ist..      **.  
1d590 20 20 20 20 2a 2a 20 4f 6e 20 74 68 65 20 6f 74      ** On the ot
1d5a0 68 65 72 20 68 61 6e 64 2c 20 69 66 20 62 43 6f  her hand, if bCo
1d5b0 6d 6d 69 74 20 69 73 20 67 72 65 61 74 65 72 20  mmit is greater 
1d5c0 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20  than zero, then 
1d5d0 6b 65 65 70 0a 20 20 20 20 20 20 2a 2a 20 6c 6f  keep.      ** lo
1d5e0 6f 70 69 6e 67 20 75 6e 74 69 6c 20 61 20 66 72  oping until a fr
1d5f0 65 65 2d 70 61 67 65 20 6c 6f 63 61 74 65 64 20  ee-page located 
1d600 77 69 74 68 69 6e 20 74 68 65 20 66 69 72 73 74  within the first
1d610 20 6e 46 69 6e 20 70 61 67 65 73 0a 20 20 20 20   nFin pages.    
1d620 20 20 2a 2a 20 6f 66 20 74 68 65 20 66 69 6c 65    ** of the file
1d630 20 69 73 20 66 6f 75 6e 64 2e 0a 20 20 20 20 20   is found..     
1d640 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 62 43   */.      if( bC
1d650 6f 6d 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20  ommit==0 ){.    
1d660 20 20 20 20 65 4d 6f 64 65 20 3d 20 42 54 41 4c      eMode = BTAL
1d670 4c 4f 43 5f 4c 45 3b 0a 20 20 20 20 20 20 20 20  LOC_LE;.        
1d680 69 4e 65 61 72 20 3d 20 6e 46 69 6e 3b 0a 20 20  iNear = nFin;.  
1d690 20 20 20 20 7d 0a 20 20 20 20 20 20 64 6f 20 7b      }.      do {
1d6a0 0a 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65  .        MemPage
1d6b0 20 2a 70 46 72 65 65 50 67 3b 0a 20 20 20 20 20   *pFreePg;.     
1d6c0 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65     rc = allocate
1d6d0 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26  BtreePage(pBt, &
1d6e0 70 46 72 65 65 50 67 2c 20 26 69 46 72 65 65 50  pFreePg, &iFreeP
1d6f0 67 2c 20 69 4e 65 61 72 2c 20 65 4d 6f 64 65 29  g, iNear, eMode)
1d700 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
1d710 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1d720 20 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65           release
1d730 50 61 67 65 28 70 4c 61 73 74 50 67 29 3b 0a 20  Page(pLastPg);. 
1d740 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
1d750 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rc;.        }.  
1d760 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
1d770 65 28 70 46 72 65 65 50 67 29 3b 0a 20 20 20 20  e(pFreePg);.    
1d780 20 20 7d 77 68 69 6c 65 28 20 62 43 6f 6d 6d 69    }while( bCommi
1d790 74 20 26 26 20 69 46 72 65 65 50 67 3e 6e 46 69  t && iFreePg>nFi
1d7a0 6e 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  n );.      asser
1d7b0 74 28 20 69 46 72 65 65 50 67 3c 69 4c 61 73 74  t( iFreePg<iLast
1d7c0 50 67 20 29 3b 0a 20 20 20 20 20 20 0a 20 20 20  Pg );.      .   
1d7d0 20 20 20 72 63 20 3d 20 72 65 6c 6f 63 61 74 65     rc = relocate
1d7e0 50 61 67 65 28 70 42 74 2c 20 70 4c 61 73 74 50  Page(pBt, pLastP
1d7f0 67 2c 20 65 54 79 70 65 2c 20 69 50 74 72 50 61  g, eType, iPtrPa
1d800 67 65 2c 20 69 46 72 65 65 50 67 2c 20 62 43 6f  ge, iFreePg, bCo
1d810 6d 6d 69 74 29 3b 0a 20 20 20 20 20 20 72 65 6c  mmit);.      rel
1d820 65 61 73 65 50 61 67 65 28 70 4c 61 73 74 50 67  easePage(pLastPg
1d830 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
1d840 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1d850 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1d860 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1d870 20 7d 0a 0a 20 20 69 66 28 20 62 43 6f 6d 6d 69   }..  if( bCommi
1d880 74 3d 3d 30 20 29 7b 0a 20 20 20 20 64 6f 20 7b  t==0 ){.    do {
1d890 0a 20 20 20 20 20 20 69 4c 61 73 74 50 67 2d 2d  .      iLastPg--
1d8a0 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 69 4c  ;.    }while( iL
1d8b0 61 73 74 50 67 3d 3d 50 45 4e 44 49 4e 47 5f 42  astPg==PENDING_B
1d8c0 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 7c 7c  YTE_PAGE(pBt) ||
1d8d0 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70   PTRMAP_ISPAGE(p
1d8e0 42 74 2c 20 69 4c 61 73 74 50 67 29 20 29 3b 0a  Bt, iLastPg) );.
1d8f0 20 20 20 20 70 42 74 2d 3e 62 44 6f 54 72 75 6e      pBt->bDoTrun
1d900 63 61 74 65 20 3d 20 31 3b 0a 20 20 20 20 70 42  cate = 1;.    pB
1d910 74 2d 3e 6e 50 61 67 65 20 3d 20 69 4c 61 73 74  t->nPage = iLast
1d920 50 67 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  Pg;.  }.  return
1d930 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
1d940 2a 0a 2a 2a 20 54 68 65 20 64 61 74 61 62 61 73  *.** The databas
1d950 65 20 6f 70 65 6e 65 64 20 62 79 20 74 68 65 20  e opened by the 
1d960 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69  first argument i
1d970 73 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d  s an auto-vacuum
1d980 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 6e 4f 72   database.** nOr
1d990 69 67 20 70 61 67 65 73 20 69 6e 20 73 69 7a 65  ig pages in size
1d9a0 20 63 6f 6e 74 61 69 6e 69 6e 67 20 6e 46 72 65   containing nFre
1d9b0 65 20 66 72 65 65 20 70 61 67 65 73 2e 20 52 65  e free pages. Re
1d9c0 74 75 72 6e 20 74 68 65 20 65 78 70 65 63 74 65  turn the expecte
1d9d0 64 20 0a 2a 2a 20 73 69 7a 65 20 6f 66 20 74 68  d .** size of th
1d9e0 65 20 64 61 74 61 62 61 73 65 20 69 6e 20 70 61  e database in pa
1d9f0 67 65 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 6e  ges following an
1da00 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 6f 70 65   auto-vacuum ope
1da10 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  ration..*/.stati
1da20 63 20 50 67 6e 6f 20 66 69 6e 61 6c 44 62 53 69  c Pgno finalDbSi
1da30 7a 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  ze(BtShared *pBt
1da40 2c 20 50 67 6e 6f 20 6e 4f 72 69 67 2c 20 50 67  , Pgno nOrig, Pg
1da50 6e 6f 20 6e 46 72 65 65 29 7b 0a 20 20 69 6e 74  no nFree){.  int
1da60 20 6e 45 6e 74 72 79 3b 20 20 20 20 20 20 20 20   nEntry;        
1da70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1da80 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65  Number of entrie
1da90 73 20 6f 6e 20 6f 6e 65 20 70 74 72 6d 61 70 20  s on one ptrmap 
1daa0 70 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e  page */.  Pgno n
1dab0 50 74 72 6d 61 70 3b 20 20 20 20 20 20 20 20 20  Ptrmap;         
1dac0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
1dad0 62 65 72 20 6f 66 20 50 74 72 4d 61 70 20 70 61  ber of PtrMap pa
1dae0 67 65 73 20 74 6f 20 62 65 20 66 72 65 65 64 20  ges to be freed 
1daf0 2a 2f 0a 20 20 50 67 6e 6f 20 6e 46 69 6e 3b 20  */.  Pgno nFin; 
1db00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1db10 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 76       /* Return v
1db20 61 6c 75 65 20 2a 2f 0a 0a 20 20 6e 45 6e 74 72  alue */..  nEntr
1db30 79 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  y = pBt->usableS
1db40 69 7a 65 2f 35 3b 0a 20 20 6e 50 74 72 6d 61 70  ize/5;.  nPtrmap
1db50 20 3d 20 28 6e 46 72 65 65 2d 6e 4f 72 69 67 2b   = (nFree-nOrig+
1db60 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42  PTRMAP_PAGENO(pB
1db70 74 2c 20 6e 4f 72 69 67 29 2b 6e 45 6e 74 72 79  t, nOrig)+nEntry
1db80 29 2f 6e 45 6e 74 72 79 3b 0a 20 20 6e 46 69 6e  )/nEntry;.  nFin
1db90 20 3d 20 6e 4f 72 69 67 20 2d 20 6e 46 72 65 65   = nOrig - nFree
1dba0 20 2d 20 6e 50 74 72 6d 61 70 3b 0a 20 20 69 66   - nPtrmap;.  if
1dbb0 28 20 6e 4f 72 69 67 3e 50 45 4e 44 49 4e 47 5f  ( nOrig>PENDING_
1dbc0 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 26  BYTE_PAGE(pBt) &
1dbd0 26 20 6e 46 69 6e 3c 50 45 4e 44 49 4e 47 5f 42  & nFin<PENDING_B
1dbe0 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b  YTE_PAGE(pBt) ){
1dbf0 0a 20 20 20 20 6e 46 69 6e 2d 2d 3b 0a 20 20 7d  .    nFin--;.  }
1dc00 0a 20 20 77 68 69 6c 65 28 20 50 54 52 4d 41 50  .  while( PTRMAP
1dc10 5f 49 53 50 41 47 45 28 70 42 74 2c 20 6e 46 69  _ISPAGE(pBt, nFi
1dc20 6e 29 20 7c 7c 20 6e 46 69 6e 3d 3d 50 45 4e 44  n) || nFin==PEND
1dc30 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
1dc40 74 29 20 29 7b 0a 20 20 20 20 6e 46 69 6e 2d 2d  t) ){.    nFin--
1dc50 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
1dc60 6e 46 69 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  nFin;.}../*.** A
1dc70 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
1dc80 6f 6e 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 65  on must be opene
1dc90 64 20 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67  d before calling
1dca0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a   this function..
1dcb0 2a 2a 20 49 74 20 70 65 72 66 6f 72 6d 73 20 61  ** It performs a
1dcc0 20 73 69 6e 67 6c 65 20 75 6e 69 74 20 6f 66 20   single unit of 
1dcd0 77 6f 72 6b 20 74 6f 77 61 72 64 73 20 61 6e 20  work towards an 
1dce0 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75  incremental vacu
1dcf0 75 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  um..**.** If the
1dd00 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63   incremental vac
1dd10 75 75 6d 20 69 73 20 66 69 6e 69 73 68 65 64 20  uum is finished 
1dd20 61 66 74 65 72 20 74 68 69 73 20 66 75 6e 63 74  after this funct
1dd30 69 6f 6e 20 68 61 73 20 72 75 6e 2c 0a 2a 2a 20  ion has run,.** 
1dd40 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73 20 72  SQLITE_DONE is r
1dd50 65 74 75 72 6e 65 64 2e 20 49 66 20 69 74 20 69  eturned. If it i
1dd60 73 20 6e 6f 74 20 66 69 6e 69 73 68 65 64 2c 20  s not finished, 
1dd70 62 75 74 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63  but no error occ
1dd80 75 72 72 65 64 2c 0a 2a 2a 20 53 51 4c 49 54 45  urred,.** SQLITE
1dd90 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
1dda0 20 4f 74 68 65 72 77 69 73 65 20 61 6e 20 53 51   Otherwise an SQ
1ddb0 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e  Lite error code.
1ddc0 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33   .*/.int sqlite3
1ddd0 42 74 72 65 65 49 6e 63 72 56 61 63 75 75 6d 28  BtreeIncrVacuum(
1dde0 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74  Btree *p){.  int
1ddf0 20 72 63 3b 0a 20 20 42 74 53 68 61 72 65 64 20   rc;.  BtShared 
1de00 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a  *pBt = p->pBt;..
1de10 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
1de20 74 65 72 28 70 29 3b 0a 20 20 61 73 73 65 72 74  ter(p);.  assert
1de30 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  ( pBt->inTransac
1de40 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54  tion==TRANS_WRIT
1de50 45 20 26 26 20 70 2d 3e 69 6e 54 72 61 6e 73 3d  E && p->inTrans=
1de60 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a  =TRANS_WRITE );.
1de70 20 20 69 66 28 20 21 70 42 74 2d 3e 61 75 74 6f    if( !pBt->auto
1de80 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 72 63  Vacuum ){.    rc
1de90 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a   = SQLITE_DONE;.
1dea0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 50 67 6e    }else{.    Pgn
1deb0 6f 20 6e 4f 72 69 67 20 3d 20 62 74 72 65 65 50  o nOrig = btreeP
1dec0 61 67 65 63 6f 75 6e 74 28 70 42 74 29 3b 0a 20  agecount(pBt);. 
1ded0 20 20 20 50 67 6e 6f 20 6e 46 72 65 65 20 3d 20     Pgno nFree = 
1dee0 67 65 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70  get4byte(&pBt->p
1def0 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d  Page1->aData[36]
1df00 29 3b 0a 20 20 20 20 50 67 6e 6f 20 6e 46 69 6e  );.    Pgno nFin
1df10 20 3d 20 66 69 6e 61 6c 44 62 53 69 7a 65 28 70   = finalDbSize(p
1df20 42 74 2c 20 6e 4f 72 69 67 2c 20 6e 46 72 65 65  Bt, nOrig, nFree
1df30 29 3b 0a 0a 20 20 20 20 69 66 28 20 6e 4f 72 69  );..    if( nOri
1df40 67 3c 6e 46 69 6e 20 29 7b 0a 20 20 20 20 20 20  g<nFin ){.      
1df50 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
1df60 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 65  UPT_BKPT;.    }e
1df70 6c 73 65 20 69 66 28 20 6e 46 72 65 65 3e 30 20  lse if( nFree>0 
1df80 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 61  ){.      rc = sa
1df90 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74  veAllCursors(pBt
1dfa0 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  , 0, 0);.      i
1dfb0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1dfc0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 76 61   ){.        inva
1dfd0 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f  lidateAllOverflo
1dfe0 77 43 61 63 68 65 28 70 42 74 29 3b 0a 20 20 20  wCache(pBt);.   
1dff0 20 20 20 20 20 72 63 20 3d 20 69 6e 63 72 56 61       rc = incrVa
1e000 63 75 75 6d 53 74 65 70 28 70 42 74 2c 20 6e 46  cuumStep(pBt, nF
1e010 69 6e 2c 20 6e 4f 72 69 67 2c 20 30 29 3b 0a 20  in, nOrig, 0);. 
1e020 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
1e030 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1e040 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
1e050 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
1e060 28 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44  (pBt->pPage1->pD
1e070 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
1e080 70 75 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70  put4byte(&pBt->p
1e090 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 32 38 5d  Page1->aData[28]
1e0a0 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20  , pBt->nPage);. 
1e0b0 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
1e0c0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
1e0d0 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a  ITE_DONE;.    }.
1e0e0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72    }.  sqlite3Btr
1e0f0 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
1e100 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1e110 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
1e120 73 20 63 61 6c 6c 65 64 20 70 72 69 6f 72 20 74  s called prior t
1e130 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f  o sqlite3PagerCo
1e140 6d 6d 69 74 20 77 68 65 6e 20 61 20 74 72 61 6e  mmit when a tran
1e150 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 63 6f  saction.** is co
1e160 6d 6d 69 74 74 65 64 20 66 6f 72 20 61 6e 20 61  mmitted for an a
1e170 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62  uto-vacuum datab
1e180 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51  ase..**.** If SQ
1e190 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
1e1a0 6e 65 64 2c 20 74 68 65 6e 20 2a 70 6e 54 72 75  ned, then *pnTru
1e1b0 6e 63 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  nc is set to the
1e1c0 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
1e1d0 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65  .** the database
1e1e0 20 66 69 6c 65 20 73 68 6f 75 6c 64 20 62 65 20   file should be 
1e1f0 74 72 75 6e 63 61 74 65 64 20 74 6f 20 64 75 72  truncated to dur
1e200 69 6e 67 20 74 68 65 20 63 6f 6d 6d 69 74 20 70  ing the commit p
1e210 72 6f 63 65 73 73 2e 20 0a 2a 2a 20 69 2e 65 2e  rocess. .** i.e.
1e220 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61   the database ha
1e230 73 20 62 65 65 6e 20 72 65 6f 72 67 61 6e 69 7a  s been reorganiz
1e240 65 64 20 73 6f 20 74 68 61 74 20 6f 6e 6c 79 20  ed so that only 
1e250 74 68 65 20 66 69 72 73 74 20 2a 70 6e 54 72 75  the first *pnTru
1e260 6e 63 0a 2a 2a 20 70 61 67 65 73 20 61 72 65 20  nc.** pages are 
1e270 69 6e 20 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69  in use..*/.stati
1e280 63 20 69 6e 74 20 61 75 74 6f 56 61 63 75 75 6d  c int autoVacuum
1e290 43 6f 6d 6d 69 74 28 42 74 53 68 61 72 65 64 20  Commit(BtShared 
1e2a0 2a 70 42 74 29 7b 0a 20 20 69 6e 74 20 72 63 20  *pBt){.  int rc 
1e2b0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50  = SQLITE_OK;.  P
1e2c0 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
1e2d0 42 74 2d 3e 70 50 61 67 65 72 3b 0a 20 20 56 56  Bt->pPager;.  VV
1e2e0 41 5f 4f 4e 4c 59 28 20 69 6e 74 20 6e 52 65 66  A_ONLY( int nRef
1e2f0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 52   = sqlite3PagerR
1e300 65 66 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3b  efcount(pPager);
1e310 20 29 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71   )..  assert( sq
1e320 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
1e330 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
1e340 20 20 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f    invalidateAllO
1e350 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70 42 74  verflowCache(pBt
1e360 29 3b 0a 20 20 61 73 73 65 72 74 28 70 42 74 2d  );.  assert(pBt-
1e370 3e 61 75 74 6f 56 61 63 75 75 6d 29 3b 0a 20 20  >autoVacuum);.  
1e380 69 66 28 20 21 70 42 74 2d 3e 69 6e 63 72 56 61  if( !pBt->incrVa
1e390 63 75 75 6d 20 29 7b 0a 20 20 20 20 50 67 6e 6f  cuum ){.    Pgno
1e3a0 20 6e 46 69 6e 3b 20 20 20 20 20 20 20 20 20 2f   nFin;         /
1e3b0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
1e3c0 73 20 69 6e 20 64 61 74 61 62 61 73 65 20 61 66  s in database af
1e3d0 74 65 72 20 61 75 74 6f 76 61 63 75 75 6d 69 6e  ter autovacuumin
1e3e0 67 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 46  g */.    Pgno nF
1e3f0 72 65 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e  ree;        /* N
1e400 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 6f  umber of pages o
1e410 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 69  n the freelist i
1e420 6e 69 74 69 61 6c 6c 79 20 2a 2f 0a 20 20 20 20  nitially */.    
1e430 50 67 6e 6f 20 69 46 72 65 65 3b 20 20 20 20 20  Pgno iFree;     
1e440 20 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 70     /* The next p
1e450 61 67 65 20 74 6f 20 62 65 20 66 72 65 65 64 20  age to be freed 
1e460 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 4f 72 69  */.    Pgno nOri
1e470 67 3b 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74  g;        /* Dat
1e480 61 62 61 73 65 20 73 69 7a 65 20 62 65 66 6f 72  abase size befor
1e490 65 20 66 72 65 65 69 6e 67 20 2a 2f 0a 0a 20 20  e freeing */..  
1e4a0 20 20 6e 4f 72 69 67 20 3d 20 62 74 72 65 65 50    nOrig = btreeP
1e4b0 61 67 65 63 6f 75 6e 74 28 70 42 74 29 3b 0a 20  agecount(pBt);. 
1e4c0 20 20 20 69 66 28 20 50 54 52 4d 41 50 5f 49 53     if( PTRMAP_IS
1e4d0 50 41 47 45 28 70 42 74 2c 20 6e 4f 72 69 67 29  PAGE(pBt, nOrig)
1e4e0 20 7c 7c 20 6e 4f 72 69 67 3d 3d 50 45 4e 44 49   || nOrig==PENDI
1e4f0 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
1e500 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 74  ) ){.      /* It
1e510 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65   is not possible
1e520 20 74 6f 20 63 72 65 61 74 65 20 61 20 64 61 74   to create a dat
1e530 61 62 61 73 65 20 66 6f 72 20 77 68 69 63 68 20  abase for which 
1e540 74 68 65 20 66 69 6e 61 6c 20 70 61 67 65 0a 20  the final page. 
1e550 20 20 20 20 20 2a 2a 20 69 73 20 65 69 74 68 65       ** is eithe
1e560 72 20 61 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  r a pointer-map 
1e570 70 61 67 65 20 6f 72 20 74 68 65 20 70 65 6e 64  page or the pend
1e580 69 6e 67 2d 62 79 74 65 20 70 61 67 65 2e 20 49  ing-byte page. I
1e590 66 20 6f 6e 65 0a 20 20 20 20 20 20 2a 2a 20 69  f one.      ** i
1e5a0 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 74  s encountered, t
1e5b0 68 69 73 20 69 6e 64 69 63 61 74 65 73 20 63 6f  his indicates co
1e5c0 72 72 75 70 74 69 6f 6e 2e 0a 20 20 20 20 20 20  rruption..      
1e5d0 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  */.      return 
1e5e0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
1e5f0 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  KPT;.    }..    
1e600 6e 46 72 65 65 20 3d 20 67 65 74 34 62 79 74 65  nFree = get4byte
1e610 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  (&pBt->pPage1->a
1e620 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 20 20 6e  Data[36]);.    n
1e630 46 69 6e 20 3d 20 66 69 6e 61 6c 44 62 53 69 7a  Fin = finalDbSiz
1e640 65 28 70 42 74 2c 20 6e 4f 72 69 67 2c 20 6e 46  e(pBt, nOrig, nF
1e650 72 65 65 29 3b 0a 20 20 20 20 69 66 28 20 6e 46  ree);.    if( nF
1e660 69 6e 3e 6e 4f 72 69 67 20 29 20 72 65 74 75 72  in>nOrig ) retur
1e670 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
1e680 5f 42 4b 50 54 3b 0a 20 20 20 20 69 66 28 20 6e  _BKPT;.    if( n
1e690 46 69 6e 3c 6e 4f 72 69 67 20 29 7b 0a 20 20 20  Fin<nOrig ){.   
1e6a0 20 20 20 72 63 20 3d 20 73 61 76 65 41 6c 6c 43     rc = saveAllC
1e6b0 75 72 73 6f 72 73 28 70 42 74 2c 20 30 2c 20 30  ursors(pBt, 0, 0
1e6c0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  );.    }.    for
1e6d0 28 69 46 72 65 65 3d 6e 4f 72 69 67 3b 20 69 46  (iFree=nOrig; iF
1e6e0 72 65 65 3e 6e 46 69 6e 20 26 26 20 72 63 3d 3d  ree>nFin && rc==
1e6f0 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 46 72 65 65  SQLITE_OK; iFree
1e700 2d 2d 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  --){.      rc = 
1e710 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28 70  incrVacuumStep(p
1e720 42 74 2c 20 6e 46 69 6e 2c 20 69 46 72 65 65 2c  Bt, nFin, iFree,
1e730 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69   1);.    }.    i
1e740 66 28 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 44  f( (rc==SQLITE_D
1e750 4f 4e 45 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54  ONE || rc==SQLIT
1e760 45 5f 4f 4b 29 20 26 26 20 6e 46 72 65 65 3e 30  E_OK) && nFree>0
1e770 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
1e780 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
1e790 28 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44  (pBt->pPage1->pD
1e7a0 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 70 75  bPage);.      pu
1e7b0 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61  t4byte(&pBt->pPa
1e7c0 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20  ge1->aData[32], 
1e7d0 30 29 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79  0);.      put4by
1e7e0 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d  te(&pBt->pPage1-
1e7f0 3e 61 44 61 74 61 5b 33 36 5d 2c 20 30 29 3b 0a  >aData[36], 0);.
1e800 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
1e810 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61  pBt->pPage1->aDa
1e820 74 61 5b 32 38 5d 2c 20 6e 46 69 6e 29 3b 0a 20  ta[28], nFin);. 
1e830 20 20 20 20 20 70 42 74 2d 3e 62 44 6f 54 72 75       pBt->bDoTru
1e840 6e 63 61 74 65 20 3d 20 31 3b 0a 20 20 20 20 20  ncate = 1;.     
1e850 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 6e 46   pBt->nPage = nF
1e860 69 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  in;.    }.    if
1e870 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1e880 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
1e890 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70 50  PagerRollback(pP
1e8a0 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ager);.    }.  }
1e8b0 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65 66  ..  assert( nRef
1e8c0 3e 3d 73 71 6c 69 74 65 33 50 61 67 65 72 52 65  >=sqlite3PagerRe
1e8d0 66 63 6f 75 6e 74 28 70 50 61 67 65 72 29 20 29  fcount(pPager) )
1e8e0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
1e8f0 0a 0a 23 65 6c 73 65 20 2f 2a 20 69 66 6e 64 65  ..#else /* ifnde
1e900 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
1e910 54 4f 56 41 43 55 55 4d 20 2a 2f 0a 23 20 64 65  TOVACUUM */.# de
1e920 66 69 6e 65 20 73 65 74 43 68 69 6c 64 50 74 72  fine setChildPtr
1e930 6d 61 70 73 28 78 29 20 53 51 4c 49 54 45 5f 4f  maps(x) SQLITE_O
1e940 4b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  K.#endif../*.** 
1e950 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65  This routine doe
1e960 73 20 74 68 65 20 66 69 72 73 74 20 70 68 61 73  s the first phas
1e970 65 20 6f 66 20 61 20 74 77 6f 2d 70 68 61 73 65  e of a two-phase
1e980 20 63 6f 6d 6d 69 74 2e 20 20 54 68 69 73 20 72   commit.  This r
1e990 6f 75 74 69 6e 65 0a 2a 2a 20 63 61 75 73 65 73  outine.** causes
1e9a0 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72   a rollback jour
1e9b0 6e 61 6c 20 74 6f 20 62 65 20 63 72 65 61 74 65  nal to be create
1e9c0 64 20 28 69 66 20 69 74 20 64 6f 65 73 20 6e 6f  d (if it does no
1e9d0 74 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 29  t already exist)
1e9e0 0a 2a 2a 20 61 6e 64 20 70 6f 70 75 6c 61 74 65  .** and populate
1e9f0 64 20 77 69 74 68 20 65 6e 6f 75 67 68 20 69 6e  d with enough in
1ea00 66 6f 72 6d 61 74 69 6f 6e 20 73 6f 20 74 68 61  formation so tha
1ea10 74 20 69 66 20 61 20 70 6f 77 65 72 20 6c 6f 73  t if a power los
1ea20 73 20 6f 63 63 75 72 73 0a 2a 2a 20 74 68 65 20  s occurs.** the 
1ea30 64 61 74 61 62 61 73 65 20 63 61 6e 20 62 65 20  database can be 
1ea40 72 65 73 74 6f 72 65 64 20 74 6f 20 69 74 73 20  restored to its 
1ea50 6f 72 69 67 69 6e 61 6c 20 73 74 61 74 65 20 62  original state b
1ea60 79 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 0a 2a  y playing back.*
1ea70 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20  * the journal.  
1ea80 54 68 65 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74  Then the content
1ea90 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  s of the journal
1eaa0 20 61 72 65 20 66 6c 75 73 68 65 64 20 6f 75 74   are flushed out
1eab0 20 74 6f 0a 2a 2a 20 74 68 65 20 64 69 73 6b 2e   to.** the disk.
1eac0 20 20 41 66 74 65 72 20 74 68 65 20 6a 6f 75 72    After the jour
1ead0 6e 61 6c 20 69 73 20 73 61 66 65 6c 79 20 6f 6e  nal is safely on
1eae0 20 6f 78 69 64 65 2c 20 74 68 65 20 63 68 61 6e   oxide, the chan
1eaf0 67 65 73 20 74 6f 20 74 68 65 0a 2a 2a 20 64 61  ges to the.** da
1eb00 74 61 62 61 73 65 20 61 72 65 20 77 72 69 74 74  tabase are writt
1eb10 65 6e 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61  en into the data
1eb20 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 66 6c  base file and fl
1eb30 75 73 68 65 64 20 74 6f 20 6f 78 69 64 65 2e 0a  ushed to oxide..
1eb40 2a 2a 20 41 74 20 74 68 65 20 65 6e 64 20 6f 66  ** At the end of
1eb50 20 74 68 69 73 20 63 61 6c 6c 2c 20 74 68 65 20   this call, the 
1eb60 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
1eb70 20 73 74 69 6c 6c 20 65 78 69 73 74 73 20 6f 6e   still exists on
1eb80 20 74 68 65 0a 2a 2a 20 64 69 73 6b 20 61 6e 64   the.** disk and
1eb90 20 77 65 20 61 72 65 20 73 74 69 6c 6c 20 68 6f   we are still ho
1eba0 6c 64 69 6e 67 20 61 6c 6c 20 6c 6f 63 6b 73 2c  lding all locks,
1ebb0 20 73 6f 20 74 68 65 20 74 72 61 6e 73 61 63 74   so the transact
1ebc0 69 6f 6e 20 68 61 73 20 6e 6f 74 0a 2a 2a 20 63  ion has not.** c
1ebd0 6f 6d 6d 69 74 74 65 64 2e 20 20 53 65 65 20 73  ommitted.  See s
1ebe0 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
1ebf0 74 50 68 61 73 65 54 77 6f 28 29 20 66 6f 72 20  tPhaseTwo() for 
1ec00 74 68 65 20 73 65 63 6f 6e 64 20 70 68 61 73 65  the second phase
1ec10 20 6f 66 20 74 68 65 0a 2a 2a 20 63 6f 6d 6d 69   of the.** commi
1ec20 74 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a  t process..**.**
1ec30 20 54 68 69 73 20 63 61 6c 6c 20 69 73 20 61 20   This call is a 
1ec40 6e 6f 2d 6f 70 20 69 66 20 6e 6f 20 77 72 69 74  no-op if no writ
1ec50 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e-transaction is
1ec60 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76   currently activ
1ec70 65 20 6f 6e 20 70 42 74 2e 0a 2a 2a 0a 2a 2a 20  e on pBt..**.** 
1ec80 4f 74 68 65 72 77 69 73 65 2c 20 73 79 6e 63 20  Otherwise, sync 
1ec90 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1eca0 65 20 66 6f 72 20 74 68 65 20 62 74 72 65 65 20  e for the btree 
1ecb0 70 42 74 2e 20 7a 4d 61 73 74 65 72 20 70 6f 69  pBt. zMaster poi
1ecc0 6e 74 73 20 74 6f 0a 2a 2a 20 74 68 65 20 6e 61  nts to.** the na
1ecd0 6d 65 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a  me of a master j
1ece0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 61 74  ournal file that
1ecf0 20 73 68 6f 75 6c 64 20 62 65 20 77 72 69 74 74   should be writt
1ed00 65 6e 20 69 6e 74 6f 20 74 68 65 0a 2a 2a 20 69  en into the.** i
1ed10 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61  ndividual journa
1ed20 6c 20 66 69 6c 65 2c 20 6f 72 20 69 73 20 4e 55  l file, or is NU
1ed30 4c 4c 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 6e  LL, indicating n
1ed40 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  o master journal
1ed50 20 66 69 6c 65 20 0a 2a 2a 20 28 73 69 6e 67 6c   file .** (singl
1ed60 65 20 64 61 74 61 62 61 73 65 20 74 72 61 6e 73  e database trans
1ed70 61 63 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20 57  action)..**.** W
1ed80 68 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c 6c  hen this is call
1ed90 65 64 2c 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ed, the master j
1eda0 6f 75 72 6e 61 6c 20 73 68 6f 75 6c 64 20 61 6c  ournal should al
1edb0 72 65 61 64 79 20 68 61 76 65 20 62 65 65 6e 0a  ready have been.
1edc0 2a 2a 20 63 72 65 61 74 65 64 2c 20 70 6f 70 75  ** created, popu
1edd0 6c 61 74 65 64 20 77 69 74 68 20 74 68 69 73 20  lated with this 
1ede0 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20  journal pointer 
1edf0 61 6e 64 20 73 79 6e 63 65 64 20 74 6f 20 64 69  and synced to di
1ee00 73 6b 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 74  sk..**.** Once t
1ee10 68 69 73 20 69 73 20 72 6f 75 74 69 6e 65 20 68  his is routine h
1ee20 61 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65  as returned, the
1ee30 20 6f 6e 6c 79 20 74 68 69 6e 67 20 72 65 71 75   only thing requ
1ee40 69 72 65 64 20 74 6f 20 63 6f 6d 6d 69 74 0a 2a  ired to commit.*
1ee50 2a 20 74 68 65 20 77 72 69 74 65 2d 74 72 61 6e  * the write-tran
1ee60 73 61 63 74 69 6f 6e 20 66 6f 72 20 74 68 69 73  saction for this
1ee70 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
1ee80 73 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20  s to delete the 
1ee90 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 69 6e 74 20  journal..*/.int 
1eea0 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
1eeb0 69 74 50 68 61 73 65 4f 6e 65 28 42 74 72 65 65  itPhaseOne(Btree
1eec0 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20   *p, const char 
1eed0 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74  *zMaster){.  int
1eee0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1eef0 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e  .  if( p->inTran
1ef00 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29  s==TRANS_WRITE )
1ef10 7b 0a 20 20 20 20 42 74 53 68 61 72 65 64 20 2a  {.    BtShared *
1ef20 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
1ef30 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
1ef40 74 65 72 28 70 29 3b 0a 23 69 66 6e 64 65 66 20  ter(p);.#ifndef 
1ef50 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
1ef60 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70  VACUUM.    if( p
1ef70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
1ef80 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 61 75 74  {.      rc = aut
1ef90 6f 56 61 63 75 75 6d 43 6f 6d 6d 69 74 28 70 42  oVacuumCommit(pB
1efa0 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  t);.      if( rc
1efb0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1efc0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74         sqlite3Bt
1efd0 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20  reeLeave(p);.   
1efe0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
1eff0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1f000 20 20 69 66 28 20 70 42 74 2d 3e 62 44 6f 54 72    if( pBt->bDoTr
1f010 75 6e 63 61 74 65 20 29 7b 0a 20 20 20 20 20 20  uncate ){.      
1f020 73 71 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e  sqlite3PagerTrun
1f030 63 61 74 65 49 6d 61 67 65 28 70 42 74 2d 3e 70  cateImage(pBt->p
1f040 50 61 67 65 72 2c 20 70 42 74 2d 3e 6e 50 61 67  Pager, pBt->nPag
1f050 65 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  e);.    }.#endif
1f060 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
1f070 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73  3PagerCommitPhas
1f080 65 4f 6e 65 28 70 42 74 2d 3e 70 50 61 67 65 72  eOne(pBt->pPager
1f090 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20  , zMaster, 0);. 
1f0a0 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c     sqlite3BtreeL
1f0b0 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a 20 20 72  eave(p);.  }.  r
1f0c0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1f0d0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
1f0e0 20 69 73 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20   is called from 
1f0f0 62 6f 74 68 20 42 74 72 65 65 43 6f 6d 6d 69 74  both BtreeCommit
1f100 50 68 61 73 65 54 77 6f 28 29 20 61 6e 64 20 42  PhaseTwo() and B
1f110 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 29 0a 2a  treeRollback().*
1f120 2a 20 61 74 20 74 68 65 20 63 6f 6e 63 6c 75 73  * at the conclus
1f130 69 6f 6e 20 6f 66 20 61 20 74 72 61 6e 73 61 63  ion of a transac
1f140 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
1f150 76 6f 69 64 20 62 74 72 65 65 45 6e 64 54 72 61  void btreeEndTra
1f160 6e 73 61 63 74 69 6f 6e 28 42 74 72 65 65 20 2a  nsaction(Btree *
1f170 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  p){.  BtShared *
1f180 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
1f190 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d  sqlite3 *db = p-
1f1a0 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 73  >db;.  assert( s
1f1b0 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73  qlite3BtreeHolds
1f1c0 4d 75 74 65 78 28 70 29 20 29 3b 0a 0a 23 69 66  Mutex(p) );..#if
1f1d0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1f1e0 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 70 42  _AUTOVACUUM.  pB
1f1f0 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65 20 3d  t->bDoTruncate =
1f200 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28   0;.#endif.  if(
1f210 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 54 52 41 4e   p->inTrans>TRAN
1f220 53 5f 4e 4f 4e 45 20 26 26 20 64 62 2d 3e 6e 56  S_NONE && db->nV
1f230 64 62 65 52 65 61 64 3e 31 20 29 7b 0a 20 20 20  dbeRead>1 ){.   
1f240 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65   /* If there are
1f250 20 6f 74 68 65 72 20 61 63 74 69 76 65 20 73 74   other active st
1f260 61 74 65 6d 65 6e 74 73 20 74 68 61 74 20 62 65  atements that be
1f270 6c 6f 6e 67 20 74 6f 20 74 68 69 73 20 64 61 74  long to this dat
1f280 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 68 61 6e  abase.    ** han
1f290 64 6c 65 2c 20 64 6f 77 6e 67 72 61 64 65 20 74  dle, downgrade t
1f2a0 6f 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 74 72  o a read-only tr
1f2b0 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 6f  ansaction. The o
1f2c0 74 68 65 72 20 73 74 61 74 65 6d 65 6e 74 73 0a  ther statements.
1f2d0 20 20 20 20 2a 2a 20 6d 61 79 20 73 74 69 6c 6c      ** may still
1f2e0 20 62 65 20 72 65 61 64 69 6e 67 20 66 72 6f 6d   be reading from
1f2f0 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
1f300 2a 2f 0a 20 20 20 20 64 6f 77 6e 67 72 61 64 65  */.    downgrade
1f310 41 6c 6c 53 68 61 72 65 64 43 61 63 68 65 54 61  AllSharedCacheTa
1f320 62 6c 65 4c 6f 63 6b 73 28 70 29 3b 0a 20 20 20  bleLocks(p);.   
1f330 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52   p->inTrans = TR
1f340 41 4e 53 5f 52 45 41 44 3b 0a 20 20 7d 65 6c 73  ANS_READ;.  }els
1f350 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  e{.    /* If the
1f360 20 68 61 6e 64 6c 65 20 68 61 64 20 61 6e 79 20   handle had any 
1f370 6b 69 6e 64 20 6f 66 20 74 72 61 6e 73 61 63 74  kind of transact
1f380 69 6f 6e 20 6f 70 65 6e 2c 20 64 65 63 72 65 6d  ion open, decrem
1f390 65 6e 74 20 74 68 65 20 0a 20 20 20 20 2a 2a 20  ent the .    ** 
1f3a0 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e  transaction coun
1f3b0 74 20 6f 66 20 74 68 65 20 73 68 61 72 65 64 20  t of the shared 
1f3c0 62 74 72 65 65 2e 20 49 66 20 74 68 65 20 74 72  btree. If the tr
1f3d0 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 20  ansaction count 
1f3e0 0a 20 20 20 20 2a 2a 20 72 65 61 63 68 65 73 20  .    ** reaches 
1f3f0 30 2c 20 73 65 74 20 74 68 65 20 73 68 61 72 65  0, set the share
1f400 64 20 73 74 61 74 65 20 74 6f 20 54 52 41 4e 53  d state to TRANS
1f410 5f 4e 4f 4e 45 2e 20 54 68 65 20 75 6e 6c 6f 63  _NONE. The unloc
1f420 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 29  kBtreeIfUnused()
1f430 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 62 65 6c  .    ** call bel
1f440 6f 77 20 77 69 6c 6c 20 75 6e 6c 6f 63 6b 20 74  ow will unlock t
1f450 68 65 20 70 61 67 65 72 2e 20 20 2a 2f 0a 20 20  he pager.  */.  
1f460 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73    if( p->inTrans
1f470 21 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a  !=TRANS_NONE ){.
1f480 20 20 20 20 20 20 63 6c 65 61 72 41 6c 6c 53 68        clearAllSh
1f490 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
1f4a0 63 6b 73 28 70 29 3b 0a 20 20 20 20 20 20 70 42  cks(p);.      pB
1f4b0 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2d  t->nTransaction-
1f4c0 2d 3b 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d  -;.      if( 0==
1f4d0 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f  pBt->nTransactio
1f4e0 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42 74  n ){.        pBt
1f4f0 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20  ->inTransaction 
1f500 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20  = TRANS_NONE;.  
1f510 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
1f520 20 2f 2a 20 53 65 74 20 74 68 65 20 63 75 72 72   /* Set the curr
1f530 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
1f540 73 74 61 74 65 20 74 6f 20 54 52 41 4e 53 5f 4e  state to TRANS_N
1f550 4f 4e 45 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74  ONE and unlock t
1f560 68 65 20 0a 20 20 20 20 2a 2a 20 70 61 67 65 72  he .    ** pager
1f570 20 69 66 20 74 68 69 73 20 63 61 6c 6c 20 63 6c   if this call cl
1f580 6f 73 65 64 20 74 68 65 20 6f 6e 6c 79 20 72 65  osed the only re
1f590 61 64 20 6f 72 20 77 72 69 74 65 20 74 72 61 6e  ad or write tran
1f5a0 73 61 63 74 69 6f 6e 2e 20 20 2a 2f 0a 20 20 20  saction.  */.   
1f5b0 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52   p->inTrans = TR
1f5c0 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20 75 6e  ANS_NONE;.    un
1f5d0 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65  lockBtreeIfUnuse
1f5e0 64 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 20 20 62  d(pBt);.  }..  b
1f5f0 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29  treeIntegrity(p)
1f600 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69  ;.}../*.** Commi
1f610 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  t the transactio
1f620 6e 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 70  n currently in p
1f630 72 6f 67 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54  rogress..**.** T
1f640 68 69 73 20 72 6f 75 74 69 6e 65 20 69 6d 70 6c  his routine impl
1f650 65 6d 65 6e 74 73 20 74 68 65 20 73 65 63 6f 6e  ements the secon
1f660 64 20 70 68 61 73 65 20 6f 66 20 61 20 32 2d 70  d phase of a 2-p
1f670 68 61 73 65 20 63 6f 6d 6d 69 74 2e 20 20 54 68  hase commit.  Th
1f680 65 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65  e.** sqlite3Btre
1f690 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28  eCommitPhaseOne(
1f6a0 29 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 74  ) routine does t
1f6b0 68 65 20 66 69 72 73 74 20 70 68 61 73 65 20 61  he first phase a
1f6c0 6e 64 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20  nd should.** be 
1f6d0 69 6e 76 6f 6b 65 64 20 70 72 69 6f 72 20 74 6f  invoked prior to
1f6e0 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f   calling this ro
1f6f0 75 74 69 6e 65 2e 20 20 54 68 65 20 73 71 6c 69  utine.  The sqli
1f700 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
1f710 61 73 65 4f 6e 65 28 29 0a 2a 2a 20 72 6f 75 74  aseOne().** rout
1f720 69 6e 65 20 64 69 64 20 61 6c 6c 20 74 68 65 20  ine did all the 
1f730 77 6f 72 6b 20 6f 66 20 77 72 69 74 69 6e 67 20  work of writing 
1f740 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 75 74 20  information out 
1f750 74 6f 20 64 69 73 6b 20 61 6e 64 20 66 6c 75 73  to disk and flus
1f760 68 69 6e 67 20 74 68 65 0a 2a 2a 20 63 6f 6e 74  hing the.** cont
1f770 65 6e 74 73 20 73 6f 20 74 68 61 74 20 74 68 65  ents so that the
1f780 79 20 61 72 65 20 77 72 69 74 74 65 6e 20 6f 6e  y are written on
1f790 74 6f 20 74 68 65 20 64 69 73 6b 20 70 6c 61 74  to the disk plat
1f7a0 74 65 72 2e 20 20 41 6c 6c 20 74 68 69 73 0a 2a  ter.  All this.*
1f7b0 2a 20 72 6f 75 74 69 6e 65 20 68 61 73 20 74 6f  * routine has to
1f7c0 20 64 6f 20 69 73 20 64 65 6c 65 74 65 20 6f 72   do is delete or
1f7d0 20 74 72 75 6e 63 61 74 65 20 6f 72 20 7a 65 72   truncate or zer
1f7e0 6f 20 74 68 65 20 68 65 61 64 65 72 20 69 6e 20  o the header in 
1f7f0 74 68 65 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62  the.** the rollb
1f800 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 28 77 68 69  ack journal (whi
1f810 63 68 20 63 61 75 73 65 73 20 74 68 65 20 74 72  ch causes the tr
1f820 61 6e 73 61 63 74 69 6f 6e 20 74 6f 20 63 6f 6d  ansaction to com
1f830 6d 69 74 29 20 61 6e 64 0a 2a 2a 20 64 72 6f 70  mit) and.** drop
1f840 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 4e 6f   locks..**.** No
1f850 72 6d 61 6c 6c 79 2c 20 69 66 20 61 6e 20 65 72  rmally, if an er
1f860 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
1f870 20 74 68 65 20 70 61 67 65 72 20 6c 61 79 65 72   the pager layer
1f880 20 69 73 20 61 74 74 65 6d 70 74 69 6e 67 20 74   is attempting t
1f890 6f 20 0a 2a 2a 20 66 69 6e 61 6c 69 7a 65 20 74  o .** finalize t
1f8a0 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 6a 6f  he underlying jo
1f8b0 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 69 73  urnal file, this
1f8c0 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
1f8d0 73 20 61 6e 20 65 72 72 6f 72 20 61 6e 64 0a 2a  s an error and.*
1f8e0 2a 20 74 68 65 20 75 70 70 65 72 20 6c 61 79 65  * the upper laye
1f8f0 72 20 77 69 6c 6c 20 61 74 74 65 6d 70 74 20 61  r will attempt a
1f900 20 72 6f 6c 6c 62 61 63 6b 2e 20 48 6f 77 65 76   rollback. Howev
1f910 65 72 2c 20 69 66 20 74 68 65 20 73 65 63 6f 6e  er, if the secon
1f920 64 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 69 73  d argument.** is
1f930 20 6e 6f 6e 2d 7a 65 72 6f 20 74 68 65 6e 20 74   non-zero then t
1f940 68 69 73 20 62 2d 74 72 65 65 20 74 72 61 6e 73  his b-tree trans
1f950 61 63 74 69 6f 6e 20 69 73 20 70 61 72 74 20 6f  action is part o
1f960 66 20 61 20 6d 75 6c 74 69 2d 66 69 6c 65 20 0a  f a multi-file .
1f970 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  ** transaction. 
1f980 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 74 68  In this case, th
1f990 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61  e transaction ha
1f9a0 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63  s already been c
1f9b0 6f 6d 6d 69 74 74 65 64 20 0a 2a 2a 20 28 62 79  ommitted .** (by
1f9c0 20 64 65 6c 65 74 69 6e 67 20 61 20 6d 61 73 74   deleting a mast
1f9d0 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 29  er journal file)
1f9e0 20 61 6e 64 20 74 68 65 20 63 61 6c 6c 65 72 20   and the caller 
1f9f0 77 69 6c 6c 20 69 67 6e 6f 72 65 20 74 68 69 73  will ignore this
1fa00 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 73 20 72   .** functions r
1fa10 65 74 75 72 6e 20 63 6f 64 65 2e 20 53 6f 2c 20  eturn code. So, 
1fa20 65 76 65 6e 20 69 66 20 61 6e 20 65 72 72 6f 72  even if an error
1fa30 20 6f 63 63 75 72 73 20 69 6e 20 74 68 65 20 70   occurs in the p
1fa40 61 67 65 72 20 6c 61 79 65 72 2c 0a 2a 2a 20 72  ager layer,.** r
1fa50 65 73 65 74 20 74 68 65 20 62 2d 74 72 65 65 20  eset the b-tree 
1fa60 6f 62 6a 65 63 74 73 20 69 6e 74 65 72 6e 61 6c  objects internal
1fa70 20 73 74 61 74 65 20 74 6f 20 69 6e 64 69 63 61   state to indica
1fa80 74 65 20 74 68 61 74 20 74 68 65 20 77 72 69 74  te that the writ
1fa90 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e  e.** transaction
1faa0 20 68 61 73 20 62 65 65 6e 20 63 6c 6f 73 65 64   has been closed
1fab0 2e 20 54 68 69 73 20 69 73 20 71 75 69 74 65 20  . This is quite 
1fac0 73 61 66 65 2c 20 61 73 20 74 68 65 20 70 61 67  safe, as the pag
1fad0 65 72 20 77 69 6c 6c 20 68 61 76 65 0a 2a 2a 20  er will have.** 
1fae0 74 72 61 6e 73 69 74 69 6f 6e 65 64 20 74 6f 20  transitioned to 
1faf0 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 2e  the error state.
1fb00 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 69 6c 6c  .**.** This will
1fb10 20 72 65 6c 65 61 73 65 20 74 68 65 20 77 72 69   release the wri
1fb20 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  te lock on the d
1fb30 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49  atabase file.  I
1fb40 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e  f there.** are n
1fb50 6f 20 61 63 74 69 76 65 20 63 75 72 73 6f 72 73  o active cursors
1fb60 2c 20 69 74 20 61 6c 73 6f 20 72 65 6c 65 61 73  , it also releas
1fb70 65 73 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b  es the read lock
1fb80 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1fb90 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
1fba0 54 77 6f 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  Two(Btree *p, in
1fbb0 74 20 62 43 6c 65 61 6e 75 70 29 7b 0a 0a 20 20  t bCleanup){..  
1fbc0 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d  if( p->inTrans==
1fbd0 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 20 72 65 74  TRANS_NONE ) ret
1fbe0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1fbf0 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
1fc00 65 72 28 70 29 3b 0a 20 20 62 74 72 65 65 49 6e  er(p);.  btreeIn
1fc10 74 65 67 72 69 74 79 28 70 29 3b 0a 0a 20 20 2f  tegrity(p);..  /
1fc20 2a 20 49 66 20 74 68 65 20 68 61 6e 64 6c 65 20  * If the handle 
1fc30 68 61 73 20 61 20 77 72 69 74 65 2d 74 72 61 6e  has a write-tran
1fc40 73 61 63 74 69 6f 6e 20 6f 70 65 6e 2c 20 63 6f  saction open, co
1fc50 6d 6d 69 74 20 74 68 65 20 73 68 61 72 65 64 2d  mmit the shared-
1fc60 62 74 72 65 65 73 20 0a 20 20 2a 2a 20 74 72 61  btrees .  ** tra
1fc70 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 73 65 74  nsaction and set
1fc80 20 74 68 65 20 73 68 61 72 65 64 20 73 74 61 74   the shared stat
1fc90 65 20 74 6f 20 54 52 41 4e 53 5f 52 45 41 44 2e  e to TRANS_READ.
1fca0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69  .  */.  if( p->i
1fcb0 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52  nTrans==TRANS_WR
1fcc0 49 54 45 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  ITE ){.    int r
1fcd0 63 3b 0a 20 20 20 20 42 74 53 68 61 72 65 64 20  c;.    BtShared 
1fce0 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
1fcf0 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e     assert( pBt->
1fd00 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54  inTransaction==T
1fd10 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20  RANS_WRITE );.  
1fd20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6e    assert( pBt->n
1fd30 54 72 61 6e 73 61 63 74 69 6f 6e 3e 30 20 29 3b  Transaction>0 );
1fd40 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
1fd50 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73  3PagerCommitPhas
1fd60 65 54 77 6f 28 70 42 74 2d 3e 70 50 61 67 65 72  eTwo(pBt->pPager
1fd70 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
1fd80 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 43 6c 65  QLITE_OK && bCle
1fd90 61 6e 75 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20  anup==0 ){.     
1fda0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
1fdb0 76 65 28 70 29 3b 0a 20 20 20 20 20 20 72 65 74  ve(p);.      ret
1fdc0 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
1fdd0 20 20 70 2d 3e 69 44 61 74 61 56 65 72 73 69 6f    p->iDataVersio
1fde0 6e 2d 2d 3b 20 20 2f 2a 20 43 6f 6d 70 65 6e 73  n--;  /* Compens
1fdf0 61 74 65 20 66 6f 72 20 70 50 61 67 65 72 2d 3e  ate for pPager->
1fe00 69 44 61 74 61 56 65 72 73 69 6f 6e 2b 2b 3b 20  iDataVersion++; 
1fe10 2a 2f 0a 20 20 20 20 70 42 74 2d 3e 69 6e 54 72  */.    pBt->inTr
1fe20 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e  ansaction = TRAN
1fe30 53 5f 52 45 41 44 3b 0a 20 20 20 20 62 74 72 65  S_READ;.    btre
1fe40 65 43 6c 65 61 72 48 61 73 43 6f 6e 74 65 6e 74  eClearHasContent
1fe50 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 20 20 62 74  (pBt);.  }..  bt
1fe60 72 65 65 45 6e 64 54 72 61 6e 73 61 63 74 69 6f  reeEndTransactio
1fe70 6e 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  n(p);.  sqlite3B
1fe80 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
1fe90 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1fea0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 62 6f  ;.}../*.** Do bo
1feb0 74 68 20 70 68 61 73 65 73 20 6f 66 20 61 20 63  th phases of a c
1fec0 6f 6d 6d 69 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ommit..*/.int sq
1fed0 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
1fee0 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e  (Btree *p){.  in
1fef0 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42  t rc;.  sqlite3B
1ff00 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
1ff10 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
1ff20 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28  eCommitPhaseOne(
1ff30 70 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 3d  p, 0);.  if( rc=
1ff40 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1ff50 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
1ff60 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77  reeCommitPhaseTw
1ff70 6f 28 70 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 73  o(p, 0);.  }.  s
1ff80 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
1ff90 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
1ffa0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
1ffb0 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68 65  routine sets the
1ffc0 20 73 74 61 74 65 20 74 6f 20 43 55 52 53 4f 52   state to CURSOR
1ffd0 5f 46 41 55 4c 54 20 61 6e 64 20 74 68 65 20 65  _FAULT and the e
1ffe0 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 74 6f 20  rror.** code to 
1fff0 65 72 72 43 6f 64 65 20 66 6f 72 20 65 76 65 72  errCode for ever
20000 79 20 63 75 72 73 6f 72 20 6f 6e 20 61 6e 79 20  y cursor on any 
20010 42 74 53 68 61 72 65 64 20 74 68 61 74 20 70 42  BtShared that pB
20020 74 72 65 65 0a 2a 2a 20 72 65 66 65 72 65 6e 63  tree.** referenc
20030 65 73 2e 20 20 4f 72 20 69 66 20 74 68 65 20 77  es.  Or if the w
20040 72 69 74 65 4f 6e 6c 79 20 66 6c 61 67 20 69 73  riteOnly flag is
20050 20 73 65 74 20 74 6f 20 31 2c 20 74 68 65 6e 20   set to 1, then 
20060 6f 6e 6c 79 0a 2a 2a 20 74 72 69 70 20 77 72 69  only.** trip wri
20070 74 65 20 63 75 72 73 6f 72 73 20 61 6e 64 20 6c  te cursors and l
20080 65 61 76 65 20 72 65 61 64 20 63 75 72 73 6f 72  eave read cursor
20090 73 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a  s unchanged..**.
200a0 2a 2a 20 45 76 65 72 79 20 63 75 72 73 6f 72 20  ** Every cursor 
200b0 69 73 20 61 20 63 61 6e 64 69 64 61 74 65 20 74  is a candidate t
200c0 6f 20 62 65 20 74 72 69 70 70 65 64 2c 20 69 6e  o be tripped, in
200d0 63 6c 75 64 69 6e 67 20 63 75 72 73 6f 72 73 0a  cluding cursors.
200e0 2a 2a 20 74 68 61 74 20 62 65 6c 6f 6e 67 20 74  ** that belong t
200f0 6f 20 6f 74 68 65 72 20 64 61 74 61 62 61 73 65  o other database
20100 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 68 61   connections tha
20110 74 20 68 61 70 70 65 6e 20 74 6f 20 62 65 0a 2a  t happen to be.*
20120 2a 20 73 68 61 72 69 6e 67 20 74 68 65 20 63 61  * sharing the ca
20130 63 68 65 20 77 69 74 68 20 70 42 74 72 65 65 2e  che with pBtree.
20140 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
20150 69 6e 65 20 67 65 74 73 20 63 61 6c 6c 65 64 20  ine gets called 
20160 77 68 65 6e 20 61 20 72 6f 6c 6c 62 61 63 6b 20  when a rollback 
20170 6f 63 63 75 72 73 2e 20 49 66 20 74 68 65 20 77  occurs. If the w
20180 72 69 74 65 4f 6e 6c 79 0a 2a 2a 20 66 6c 61 67  riteOnly.** flag
20190 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 6f   is true, then o
201a0 6e 6c 79 20 77 72 69 74 65 2d 63 75 72 73 6f 72  nly write-cursor
201b0 73 20 6e 65 65 64 20 62 65 20 74 72 69 70 70 65  s need be trippe
201c0 64 20 2d 20 72 65 61 64 2d 6f 6e 6c 79 0a 2a 2a  d - read-only.**
201d0 20 63 75 72 73 6f 72 73 20 73 61 76 65 20 74 68   cursors save th
201e0 65 69 72 20 63 75 72 72 65 6e 74 20 70 6f 73 69  eir current posi
201f0 74 69 6f 6e 73 20 73 6f 20 74 68 61 74 20 74 68  tions so that th
20200 65 79 20 6d 61 79 20 63 6f 6e 74 69 6e 75 65 20  ey may continue 
20210 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68  .** following th
20220 65 20 72 6f 6c 6c 62 61 63 6b 2e 20 4f 72 2c 20  e rollback. Or, 
20230 69 66 20 77 72 69 74 65 4f 6e 6c 79 20 69 73 20  if writeOnly is 
20240 66 61 6c 73 65 2c 20 61 6c 6c 20 63 75 72 73 6f  false, all curso
20250 72 73 20 61 72 65 20 0a 2a 2a 20 74 72 69 70 70  rs are .** tripp
20260 65 64 2e 20 49 6e 20 67 65 6e 65 72 61 6c 2c 20  ed. In general, 
20270 77 72 69 74 65 4f 6e 6c 79 20 69 73 20 66 61 6c  writeOnly is fal
20280 73 65 20 69 66 20 74 68 65 20 74 72 61 6e 73 61  se if the transa
20290 63 74 69 6f 6e 20 62 65 69 6e 67 0a 2a 2a 20 72  ction being.** r
202a0 6f 6c 6c 65 64 20 62 61 63 6b 20 6d 6f 64 69 66  olled back modif
202b0 69 65 64 20 74 68 65 20 64 61 74 61 62 61 73 65  ied the database
202c0 20 73 63 68 65 6d 61 2e 20 49 6e 20 74 68 69 73   schema. In this
202d0 20 63 61 73 65 20 62 2d 74 72 65 65 20 72 6f 6f   case b-tree roo
202e0 74 0a 2a 2a 20 70 61 67 65 73 20 6d 61 79 20 62  t.** pages may b
202f0 65 20 6d 6f 76 65 64 20 6f 72 20 64 65 6c 65 74  e moved or delet
20300 65 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ed from the data
20310 62 61 73 65 20 61 6c 74 6f 67 65 74 68 65 72 2c  base altogether,
20320 20 6d 61 6b 69 6e 67 0a 2a 2a 20 69 74 20 75 6e   making.** it un
20330 73 61 66 65 20 66 6f 72 20 72 65 61 64 20 63 75  safe for read cu
20340 72 73 6f 72 73 20 74 6f 20 63 6f 6e 74 69 6e 75  rsors to continu
20350 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
20360 77 72 69 74 65 4f 6e 6c 79 20 66 6c 61 67 20 69  writeOnly flag i
20370 73 20 74 72 75 65 20 61 6e 64 20 61 6e 20 65 72  s true and an er
20380 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72  ror is encounter
20390 65 64 20 77 68 69 6c 65 20 0a 2a 2a 20 73 61 76  ed while .** sav
203a0 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 20  ing the current 
203b0 70 6f 73 69 74 69 6f 6e 20 6f 66 20 61 20 72 65  position of a re
203c0 61 64 2d 6f 6e 6c 79 20 63 75 72 73 6f 72 2c 20  ad-only cursor, 
203d0 61 6c 6c 20 63 75 72 73 6f 72 73 2c 20 0a 2a 2a  all cursors, .**
203e0 20 69 6e 63 6c 75 64 69 6e 67 20 61 6c 6c 20 72   including all r
203f0 65 61 64 2d 63 75 72 73 6f 72 73 20 61 72 65 20  ead-cursors are 
20400 74 72 69 70 70 65 64 2e 0a 2a 2a 0a 2a 2a 20 53  tripped..**.** S
20410 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
20420 72 6e 65 64 20 69 66 20 73 75 63 63 65 73 73 66  rned if successf
20430 75 6c 2c 20 6f 72 20 69 66 20 61 6e 20 65 72 72  ul, or if an err
20440 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 0a  or occurs while.
20450 2a 2a 20 73 61 76 69 6e 67 20 61 20 63 75 72 73  ** saving a curs
20460 6f 72 20 70 6f 73 69 74 69 6f 6e 2c 20 61 6e 20  or position, an 
20470 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
20480 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
20490 33 42 74 72 65 65 54 72 69 70 41 6c 6c 43 75 72  3BtreeTripAllCur
204a0 73 6f 72 73 28 42 74 72 65 65 20 2a 70 42 74 72  sors(Btree *pBtr
204b0 65 65 2c 20 69 6e 74 20 65 72 72 43 6f 64 65 2c  ee, int errCode,
204c0 20 69 6e 74 20 77 72 69 74 65 4f 6e 6c 79 29 7b   int writeOnly){
204d0 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a  .  BtCursor *p;.
204e0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
204f0 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28  E_OK;..  assert(
20500 20 28 77 72 69 74 65 4f 6e 6c 79 3d 3d 30 20 7c   (writeOnly==0 |
20510 7c 20 77 72 69 74 65 4f 6e 6c 79 3d 3d 31 29 20  | writeOnly==1) 
20520 26 26 20 42 54 43 46 5f 57 72 69 74 65 46 6c 61  && BTCF_WriteFla
20530 67 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20 70 42  g==1 );.  if( pB
20540 74 72 65 65 20 29 7b 0a 20 20 20 20 73 71 6c 69  tree ){.    sqli
20550 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 42  te3BtreeEnter(pB
20560 74 72 65 65 29 3b 0a 20 20 20 20 66 6f 72 28 70  tree);.    for(p
20570 3d 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 43  =pBtree->pBt->pC
20580 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70  ursor; p; p=p->p
20590 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 6e 74  Next){.      int
205a0 20 69 3b 0a 20 20 20 20 20 20 69 66 28 20 77 72   i;.      if( wr
205b0 69 74 65 4f 6e 6c 79 20 26 26 20 28 70 2d 3e 63  iteOnly && (p->c
205c0 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 57  urFlags & BTCF_W
205d0 72 69 74 65 46 6c 61 67 29 3d 3d 30 20 29 7b 0a  riteFlag)==0 ){.
205e0 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 65          if( p->e
205f0 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
20600 4c 49 44 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65  LID || p->eState
20610 3d 3d 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58  ==CURSOR_SKIPNEX
20620 54 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  T ){.          r
20630 63 20 3d 20 73 61 76 65 43 75 72 73 6f 72 50 6f  c = saveCursorPo
20640 73 69 74 69 6f 6e 28 70 29 3b 0a 20 20 20 20 20  sition(p);.     
20650 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
20660 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
20670 20 20 20 20 20 20 28 76 6f 69 64 29 73 71 6c 69        (void)sqli
20680 74 65 33 42 74 72 65 65 54 72 69 70 41 6c 6c 43  te3BtreeTripAllC
20690 75 72 73 6f 72 73 28 70 42 74 72 65 65 2c 20 72  ursors(pBtree, r
206a0 63 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  c, 0);.         
206b0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
206c0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
206d0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
206e0 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
206f0 65 43 6c 65 61 72 43 75 72 73 6f 72 28 70 29 3b  eClearCursor(p);
20700 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61  .        p->eSta
20710 74 65 20 3d 20 43 55 52 53 4f 52 5f 46 41 55 4c  te = CURSOR_FAUL
20720 54 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 73 6b  T;.        p->sk
20730 69 70 4e 65 78 74 20 3d 20 65 72 72 43 6f 64 65  ipNext = errCode
20740 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
20750 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 2d 3e 69  for(i=0; i<=p->i
20760 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Page; i++){.    
20770 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
20780 70 2d 3e 61 70 50 61 67 65 5b 69 5d 29 3b 0a 20  p->apPage[i]);. 
20790 20 20 20 20 20 20 20 70 2d 3e 61 70 50 61 67 65         p->apPage
207a0 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  [i] = 0;.      }
207b0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
207c0 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 42 74  e3BtreeLeave(pBt
207d0 72 65 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ree);.  }.  retu
207e0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
207f0 52 6f 6c 6c 62 61 63 6b 20 74 68 65 20 74 72 61  Rollback the tra
20800 6e 73 61 63 74 69 6f 6e 20 69 6e 20 70 72 6f 67  nsaction in prog
20810 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ress..**.** If t
20820 72 69 70 43 6f 64 65 20 69 73 20 6e 6f 74 20 53  ripCode is not S
20830 51 4c 49 54 45 5f 4f 4b 20 74 68 65 6e 20 63 75  QLITE_OK then cu
20840 72 73 6f 72 73 20 77 69 6c 6c 20 62 65 20 69 6e  rsors will be in
20850 76 61 6c 69 64 61 74 65 64 20 28 74 72 69 70 70  validated (tripp
20860 65 64 29 2e 0a 2a 2a 20 4f 6e 6c 79 20 77 72 69  ed)..** Only wri
20870 74 65 20 63 75 72 73 6f 72 73 20 61 72 65 20 74  te cursors are t
20880 72 69 70 70 65 64 20 69 66 20 77 72 69 74 65 4f  ripped if writeO
20890 6e 6c 79 20 69 73 20 74 72 75 65 20 62 75 74 20  nly is true but 
208a0 61 6c 6c 20 63 75 72 73 6f 72 73 20 61 72 65 0a  all cursors are.
208b0 2a 2a 20 74 72 69 70 70 65 64 20 69 66 20 77 72  ** tripped if wr
208c0 69 74 65 4f 6e 6c 79 20 69 73 20 66 61 6c 73 65  iteOnly is false
208d0 2e 20 20 41 6e 79 20 61 74 74 65 6d 70 74 20 74  .  Any attempt t
208e0 6f 20 75 73 65 0a 2a 2a 20 61 20 74 72 69 70 70  o use.** a tripp
208f0 65 64 20 63 75 72 73 6f 72 20 77 69 6c 6c 20 72  ed cursor will r
20900 65 73 75 6c 74 20 69 6e 20 61 6e 20 65 72 72 6f  esult in an erro
20910 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 69  r..**.** This wi
20920 6c 6c 20 72 65 6c 65 61 73 65 20 74 68 65 20 77  ll release the w
20930 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  rite lock on the
20940 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
20950 20 49 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65   If there.** are
20960 20 6e 6f 20 61 63 74 69 76 65 20 63 75 72 73 6f   no active curso
20970 72 73 2c 20 69 74 20 61 6c 73 6f 20 72 65 6c 65  rs, it also rele
20980 61 73 65 73 20 74 68 65 20 72 65 61 64 20 6c 6f  ases the read lo
20990 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ck..*/.int sqlit
209a0 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28  e3BtreeRollback(
209b0 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 74 72  Btree *p, int tr
209c0 69 70 43 6f 64 65 2c 20 69 6e 74 20 77 72 69 74  ipCode, int writ
209d0 65 4f 6e 6c 79 29 7b 0a 20 20 69 6e 74 20 72 63  eOnly){.  int rc
209e0 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
209f0 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 4d 65  t = p->pBt;.  Me
20a00 6d 50 61 67 65 20 2a 70 50 61 67 65 31 3b 0a 0a  mPage *pPage1;..
20a10 20 20 61 73 73 65 72 74 28 20 77 72 69 74 65 4f    assert( writeO
20a20 6e 6c 79 3d 3d 31 20 7c 7c 20 77 72 69 74 65 4f  nly==1 || writeO
20a30 6e 6c 79 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  nly==0 );.  asse
20a40 72 74 28 20 74 72 69 70 43 6f 64 65 3d 3d 53 51  rt( tripCode==SQ
20a50 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42  LITE_ABORT_ROLLB
20a60 41 43 4b 20 7c 7c 20 74 72 69 70 43 6f 64 65 3d  ACK || tripCode=
20a70 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
20a80 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
20a90 72 28 70 29 3b 0a 20 20 69 66 28 20 74 72 69 70  r(p);.  if( trip
20aa0 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  Code==SQLITE_OK 
20ab0 29 7b 0a 20 20 20 20 72 63 20 3d 20 74 72 69 70  ){.    rc = trip
20ac0 43 6f 64 65 20 3d 20 73 61 76 65 41 6c 6c 43 75  Code = saveAllCu
20ad0 72 73 6f 72 73 28 70 42 74 2c 20 30 2c 20 30 29  rsors(pBt, 0, 0)
20ae0 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 77  ;.    if( rc ) w
20af0 72 69 74 65 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20  riteOnly = 0;.  
20b00 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20  }else{.    rc = 
20b10 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
20b20 20 69 66 28 20 74 72 69 70 43 6f 64 65 20 29 7b   if( tripCode ){
20b30 0a 20 20 20 20 69 6e 74 20 72 63 32 20 3d 20 73  .    int rc2 = s
20b40 71 6c 69 74 65 33 42 74 72 65 65 54 72 69 70 41  qlite3BtreeTripA
20b50 6c 6c 43 75 72 73 6f 72 73 28 70 2c 20 74 72 69  llCursors(p, tri
20b60 70 43 6f 64 65 2c 20 77 72 69 74 65 4f 6e 6c 79  pCode, writeOnly
20b70 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72  );.    assert( r
20b80 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c==SQLITE_OK || 
20b90 28 77 72 69 74 65 4f 6e 6c 79 3d 3d 30 20 26 26  (writeOnly==0 &&
20ba0 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29   rc2==SQLITE_OK)
20bb0 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 32 21   );.    if( rc2!
20bc0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20  =SQLITE_OK ) rc 
20bd0 3d 20 72 63 32 3b 0a 20 20 7d 0a 20 20 62 74 72  = rc2;.  }.  btr
20be0 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a  eeIntegrity(p);.
20bf0 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e  .  if( p->inTran
20c00 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29  s==TRANS_WRITE )
20c10 7b 0a 20 20 20 20 69 6e 74 20 72 63 32 3b 0a 0a  {.    int rc2;..
20c20 20 20 20 20 61 73 73 65 72 74 28 20 54 52 41 4e      assert( TRAN
20c30 53 5f 57 52 49 54 45 3d 3d 70 42 74 2d 3e 69 6e  S_WRITE==pBt->in
20c40 54 72 61 6e 73 61 63 74 69 6f 6e 20 29 3b 0a 20  Transaction );. 
20c50 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33     rc2 = sqlite3
20c60 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70 42  PagerRollback(pB
20c70 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20  t->pPager);.    
20c80 69 66 28 20 72 63 32 21 3d 53 51 4c 49 54 45 5f  if( rc2!=SQLITE_
20c90 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  OK ){.      rc =
20ca0 20 72 63 32 3b 0a 20 20 20 20 7d 0a 0a 20 20 20   rc2;.    }..   
20cb0 20 2f 2a 20 54 68 65 20 72 6f 6c 6c 62 61 63 6b   /* The rollback
20cc0 20 6d 61 79 20 68 61 76 65 20 64 65 73 74 72 6f   may have destro
20cd0 79 65 64 20 74 68 65 20 70 50 61 67 65 31 2d 3e  yed the pPage1->
20ce0 61 44 61 74 61 20 76 61 6c 75 65 2e 20 20 53 6f  aData value.  So
20cf0 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 62 74 72  .    ** call btr
20d00 65 65 47 65 74 50 61 67 65 28 29 20 6f 6e 20 70  eeGetPage() on p
20d10 61 67 65 20 31 20 61 67 61 69 6e 20 74 6f 20 6d  age 1 again to m
20d20 61 6b 65 0a 20 20 20 20 2a 2a 20 73 75 72 65 20  ake.    ** sure 
20d30 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20 69 73  pPage1->aData is
20d40 20 73 65 74 20 63 6f 72 72 65 63 74 6c 79 2e 20   set correctly. 
20d50 2a 2f 0a 20 20 20 20 69 66 28 20 62 74 72 65 65  */.    if( btree
20d60 47 65 74 50 61 67 65 28 70 42 74 2c 20 31 2c 20  GetPage(pBt, 1, 
20d70 26 70 50 61 67 65 31 2c 20 30 29 3d 3d 53 51 4c  &pPage1, 0)==SQL
20d80 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
20d90 69 6e 74 20 6e 50 61 67 65 20 3d 20 67 65 74 34  int nPage = get4
20da0 62 79 74 65 28 32 38 2b 28 75 38 2a 29 70 50 61  byte(28+(u8*)pPa
20db0 67 65 31 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20  ge1->aData);.   
20dc0 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 50 61     testcase( nPa
20dd0 67 65 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69  ge==0 );.      i
20de0 66 28 20 6e 50 61 67 65 3d 3d 30 20 29 20 73 71  f( nPage==0 ) sq
20df0 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f  lite3PagerPageco
20e00 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  unt(pBt->pPager,
20e10 20 26 6e 50 61 67 65 29 3b 0a 20 20 20 20 20 20   &nPage);.      
20e20 74 65 73 74 63 61 73 65 28 20 70 42 74 2d 3e 6e  testcase( pBt->n
20e30 50 61 67 65 21 3d 6e 50 61 67 65 20 29 3b 0a 20  Page!=nPage );. 
20e40 20 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 20       pBt->nPage 
20e50 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20 20 20 72  = nPage;.      r
20e60 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65  eleasePage(pPage
20e70 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  1);.    }.    as
20e80 73 65 72 74 28 20 63 6f 75 6e 74 56 61 6c 69 64  sert( countValid
20e90 43 75 72 73 6f 72 73 28 70 42 74 2c 20 31 29 3d  Cursors(pBt, 1)=
20ea0 3d 30 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 69  =0 );.    pBt->i
20eb0 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54  nTransaction = T
20ec0 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20 20 20 62  RANS_READ;.    b
20ed0 74 72 65 65 43 6c 65 61 72 48 61 73 43 6f 6e 74  treeClearHasCont
20ee0 65 6e 74 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 20  ent(pBt);.  }.. 
20ef0 20 62 74 72 65 65 45 6e 64 54 72 61 6e 73 61 63   btreeEndTransac
20f00 74 69 6f 6e 28 70 29 3b 0a 20 20 73 71 6c 69 74  tion(p);.  sqlit
20f10 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
20f20 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
20f30 0a 2f 2a 0a 2a 2a 20 53 74 61 72 74 20 61 20 73  ./*.** Start a s
20f40 74 61 74 65 6d 65 6e 74 20 73 75 62 74 72 61 6e  tatement subtran
20f50 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 73 75 62  saction. The sub
20f60 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 61 6e 20  transaction can 
20f70 62 65 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63  be rolled.** bac
20f80 6b 20 69 6e 64 65 70 65 6e 64 65 6e 74 6c 79 20  k independently 
20f90 6f 66 20 74 68 65 20 6d 61 69 6e 20 74 72 61 6e  of the main tran
20fa0 73 61 63 74 69 6f 6e 2e 20 59 6f 75 20 6d 75 73  saction. You mus
20fb0 74 20 73 74 61 72 74 20 61 20 74 72 61 6e 73 61  t start a transa
20fc0 63 74 69 6f 6e 20 0a 2a 2a 20 62 65 66 6f 72 65  ction .** before
20fd0 20 73 74 61 72 74 69 6e 67 20 61 20 73 75 62 74   starting a subt
20fe0 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65 20  ransaction. The 
20ff0 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  subtransaction i
21000 73 20 65 6e 64 65 64 20 61 75 74 6f 6d 61 74 69  s ended automati
21010 63 61 6c 6c 79 20 0a 2a 2a 20 69 66 20 74 68 65  cally .** if the
21020 20 6d 61 69 6e 20 74 72 61 6e 73 61 63 74 69 6f   main transactio
21030 6e 20 63 6f 6d 6d 69 74 73 20 6f 72 20 72 6f 6c  n commits or rol
21040 6c 73 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53  ls back..**.** S
21050 74 61 74 65 6d 65 6e 74 20 73 75 62 74 72 61 6e  tatement subtran
21060 73 61 63 74 69 6f 6e 73 20 61 72 65 20 75 73 65  sactions are use
21070 64 20 61 72 6f 75 6e 64 20 69 6e 64 69 76 69 64  d around individ
21080 75 61 6c 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  ual SQL statemen
21090 74 73 0a 2a 2a 20 74 68 61 74 20 61 72 65 20 63  ts.** that are c
210a0 6f 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e 20  ontained within 
210b0 61 20 42 45 47 49 4e 2e 2e 2e 43 4f 4d 4d 49 54  a BEGIN...COMMIT
210c0 20 62 6c 6f 63 6b 2e 20 20 49 66 20 61 20 63 6f   block.  If a co
210d0 6e 73 74 72 61 69 6e 74 0a 2a 2a 20 65 72 72 6f  nstraint.** erro
210e0 72 20 6f 63 63 75 72 73 20 77 69 74 68 69 6e 20  r occurs within 
210f0 74 68 65 20 73 74 61 74 65 6d 65 6e 74 2c 20 74  the statement, t
21100 68 65 20 65 66 66 65 63 74 20 6f 66 20 74 68 61  he effect of tha
21110 74 20 6f 6e 65 20 73 74 61 74 65 6d 65 6e 74 0a  t one statement.
21120 2a 2a 20 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64  ** can be rolled
21130 20 62 61 63 6b 20 77 69 74 68 6f 75 74 20 68 61   back without ha
21140 76 69 6e 67 20 74 6f 20 72 6f 6c 6c 62 61 63 6b  ving to rollback
21150 20 74 68 65 20 65 6e 74 69 72 65 20 74 72 61 6e   the entire tran
21160 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41  saction..**.** A
21170 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62 2d 74   statement sub-t
21180 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 69 6d  ransaction is im
21190 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 61 6e 20  plemented as an 
211a0 61 6e 6f 6e 79 6d 6f 75 73 20 73 61 76 65 70 6f  anonymous savepo
211b0 69 6e 74 2e 20 54 68 65 0a 2a 2a 20 76 61 6c 75  int. The.** valu
211c0 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  e passed as the 
211d0 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65 72  second parameter
211e0 20 69 73 20 74 68 65 20 74 6f 74 61 6c 20 6e 75   is the total nu
211f0 6d 62 65 72 20 6f 66 20 73 61 76 65 70 6f 69 6e  mber of savepoin
21200 74 73 2c 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e 67  ts,.** including
21210 20 74 68 65 20 6e 65 77 20 61 6e 6f 6e 79 6d 6f   the new anonymo
21220 75 73 20 73 61 76 65 70 6f 69 6e 74 2c 20 6f 70  us savepoint, op
21230 65 6e 20 6f 6e 20 74 68 65 20 42 2d 54 72 65 65  en on the B-Tree
21240 2e 20 69 2e 65 2e 20 69 66 20 74 68 65 72 65 0a  . i.e. if there.
21250 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65  ** are no active
21260 20 73 61 76 65 70 6f 69 6e 74 73 20 61 6e 64 20   savepoints and 
21270 6e 6f 20 6f 74 68 65 72 20 73 74 61 74 65 6d 65  no other stateme
21280 6e 74 2d 74 72 61 6e 73 61 63 74 69 6f 6e 73 20  nt-transactions 
21290 6f 70 65 6e 2c 0a 2a 2a 20 69 53 74 61 74 65 6d  open,.** iStatem
212a0 65 6e 74 20 69 73 20 31 2e 20 54 68 69 73 20 61  ent is 1. This a
212b0 6e 6f 6e 79 6d 6f 75 73 20 73 61 76 65 70 6f 69  nonymous savepoi
212c0 6e 74 20 63 61 6e 20 62 65 20 72 65 6c 65 61 73  nt can be releas
212d0 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63  ed or rolled bac
212e0 6b 0a 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 73  k.** using the s
212f0 71 6c 69 74 65 33 42 74 72 65 65 53 61 76 65 70  qlite3BtreeSavep
21300 6f 69 6e 74 28 29 20 66 75 6e 63 74 69 6f 6e 2e  oint() function.
21310 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
21320 74 72 65 65 42 65 67 69 6e 53 74 6d 74 28 42 74  treeBeginStmt(Bt
21330 72 65 65 20 2a 70 2c 20 69 6e 74 20 69 53 74 61  ree *p, int iSta
21340 74 65 6d 65 6e 74 29 7b 0a 20 20 69 6e 74 20 72  tement){.  int r
21350 63 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  c;.  BtShared *p
21360 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 73  Bt = p->pBt;.  s
21370 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
21380 28 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  (p);.  assert( p
21390 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
213a0 5f 57 52 49 54 45 20 29 3b 0a 20 20 61 73 73 65  _WRITE );.  asse
213b0 72 74 28 20 28 70 42 74 2d 3e 62 74 73 46 6c 61  rt( (pBt->btsFla
213c0 67 73 20 26 20 42 54 53 5f 52 45 41 44 5f 4f 4e  gs & BTS_READ_ON
213d0 4c 59 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  LY)==0 );.  asse
213e0 72 74 28 20 69 53 74 61 74 65 6d 65 6e 74 3e 30  rt( iStatement>0
213f0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 53   );.  assert( iS
21400 74 61 74 65 6d 65 6e 74 3e 70 2d 3e 64 62 2d 3e  tatement>p->db->
21410 6e 53 61 76 65 70 6f 69 6e 74 20 29 3b 0a 20 20  nSavepoint );.  
21420 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54  assert( pBt->inT
21430 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e  ransaction==TRAN
21440 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 2f 2a 20  S_WRITE );.  /* 
21450 41 74 20 74 68 65 20 70 61 67 65 72 20 6c 65 76  At the pager lev
21460 65 6c 2c 20 61 20 73 74 61 74 65 6d 65 6e 74 20  el, a statement 
21470 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61  transaction is a
21480 20 73 61 76 65 70 6f 69 6e 74 20 77 69 74 68 0a   savepoint with.
21490 20 20 2a 2a 20 61 6e 20 69 6e 64 65 78 20 67 72    ** an index gr
214a0 65 61 74 65 72 20 74 68 61 6e 20 61 6c 6c 20 73  eater than all s
214b0 61 76 65 70 6f 69 6e 74 73 20 63 72 65 61 74 65  avepoints create
214c0 64 20 65 78 70 6c 69 63 69 74 6c 79 20 75 73 69  d explicitly usi
214d0 6e 67 0a 20 20 2a 2a 20 53 51 4c 20 73 74 61 74  ng.  ** SQL stat
214e0 65 6d 65 6e 74 73 2e 20 49 74 20 69 73 20 69 6c  ements. It is il
214f0 6c 65 67 61 6c 20 74 6f 20 6f 70 65 6e 2c 20 72  legal to open, r
21500 65 6c 65 61 73 65 20 6f 72 20 72 6f 6c 6c 62 61  elease or rollba
21510 63 6b 20 61 6e 79 0a 20 20 2a 2a 20 73 75 63 68  ck any.  ** such
21520 20 73 61 76 65 70 6f 69 6e 74 73 20 77 68 69 6c   savepoints whil
21530 65 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  e the statement 
21540 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 61 76 65  transaction save
21550 70 6f 69 6e 74 20 69 73 20 61 63 74 69 76 65 2e  point is active.
21560 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c  .  */.  rc = sql
21570 69 74 65 33 50 61 67 65 72 4f 70 65 6e 53 61 76  ite3PagerOpenSav
21580 65 70 6f 69 6e 74 28 70 42 74 2d 3e 70 50 61 67  epoint(pBt->pPag
21590 65 72 2c 20 69 53 74 61 74 65 6d 65 6e 74 29 3b  er, iStatement);
215a0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
215b0 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
215c0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
215d0 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
215e0 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  nt to this funct
215f0 69 6f 6e 2c 20 6f 70 2c 20 69 73 20 61 6c 77 61  ion, op, is alwa
21600 79 73 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  ys SAVEPOINT_ROL
21610 4c 42 41 43 4b 0a 2a 2a 20 6f 72 20 53 41 56 45  LBACK.** or SAVE
21620 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2e 20 54  POINT_RELEASE. T
21630 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 65 69 74  his function eit
21640 68 65 72 20 72 65 6c 65 61 73 65 73 20 6f 72 20  her releases or 
21650 72 6f 6c 6c 73 20 62 61 63 6b 20 74 68 65 0a 2a  rolls back the.*
21660 2a 20 73 61 76 65 70 6f 69 6e 74 20 69 64 65 6e  * savepoint iden
21670 74 69 66 69 65 64 20 62 79 20 70 61 72 61 6d 65  tified by parame
21680 74 65 72 20 69 53 61 76 65 70 6f 69 6e 74 2c 20  ter iSavepoint, 
21690 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65  depending on the
216a0 20 76 61 6c 75 65 20 0a 2a 2a 20 6f 66 20 6f 70   value .** of op
216b0 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79  ..**.** Normally
216c0 2c 20 69 53 61 76 65 70 6f 69 6e 74 20 69 73 20  , iSavepoint is 
216d0 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20  greater than or 
216e0 65 71 75 61 6c 20 74 6f 20 7a 65 72 6f 2e 20 48  equal to zero. H
216f0 6f 77 65 76 65 72 2c 20 69 66 20 6f 70 20 69 73  owever, if op is
21700 0a 2a 2a 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f  .** SAVEPOINT_RO
21710 4c 4c 42 41 43 4b 2c 20 74 68 65 6e 20 69 53 61  LLBACK, then iSa
21720 76 65 70 6f 69 6e 74 20 6d 61 79 20 61 6c 73 6f  vepoint may also
21730 20 62 65 20 2d 31 2e 20 49 6e 20 74 68 69 73 20   be -1. In this 
21740 63 61 73 65 20 74 68 65 20 0a 2a 2a 20 63 6f 6e  case the .** con
21750 74 65 6e 74 73 20 6f 66 20 74 68 65 20 65 6e 74  tents of the ent
21760 69 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ire transaction 
21770 61 72 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e  are rolled back.
21780 20 54 68 69 73 20 69 73 20 64 69 66 66 65 72 65   This is differe
21790 6e 74 0a 2a 2a 20 66 72 6f 6d 20 61 20 6e 6f 72  nt.** from a nor
217a0 6d 61 6c 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  mal transaction 
217b0 72 6f 6c 6c 62 61 63 6b 2c 20 61 73 20 6e 6f 20  rollback, as no 
217c0 6c 6f 63 6b 73 20 61 72 65 20 72 65 6c 65 61 73  locks are releas
217d0 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20 74 72  ed and the.** tr
217e0 61 6e 73 61 63 74 69 6f 6e 20 72 65 6d 61 69 6e  ansaction remain
217f0 73 20 6f 70 65 6e 2e 0a 2a 2f 0a 69 6e 74 20 73  s open..*/.int s
21800 71 6c 69 74 65 33 42 74 72 65 65 53 61 76 65 70  qlite3BtreeSavep
21810 6f 69 6e 74 28 42 74 72 65 65 20 2a 70 2c 20 69  oint(Btree *p, i
21820 6e 74 20 6f 70 2c 20 69 6e 74 20 69 53 61 76 65  nt op, int iSave
21830 70 6f 69 6e 74 29 7b 0a 20 20 69 6e 74 20 72 63  point){.  int rc
21840 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
21850 69 66 28 20 70 20 26 26 20 70 2d 3e 69 6e 54 72  if( p && p->inTr
21860 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans==TRANS_WRITE
21870 20 29 7b 0a 20 20 20 20 42 74 53 68 61 72 65 64   ){.    BtShared
21880 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
21890 20 20 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d      assert( op==
218a0 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53  SAVEPOINT_RELEAS
218b0 45 20 7c 7c 20 6f 70 3d 3d 53 41 56 45 50 4f 49  E || op==SAVEPOI
218c0 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 3b 0a 20  NT_ROLLBACK );. 
218d0 20 20 20 61 73 73 65 72 74 28 20 69 53 61 76 65     assert( iSave
218e0 70 6f 69 6e 74 3e 3d 30 20 7c 7c 20 28 69 53 61  point>=0 || (iSa
218f0 76 65 70 6f 69 6e 74 3d 3d 2d 31 20 26 26 20 6f  vepoint==-1 && o
21900 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  p==SAVEPOINT_ROL
21910 4c 42 41 43 4b 29 20 29 3b 0a 20 20 20 20 73 71  LBACK) );.    sq
21920 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
21930 70 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  p);.    rc = sql
21940 69 74 65 33 50 61 67 65 72 53 61 76 65 70 6f 69  ite3PagerSavepoi
21950 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  nt(pBt->pPager, 
21960 6f 70 2c 20 69 53 61 76 65 70 6f 69 6e 74 29 3b  op, iSavepoint);
21970 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
21980 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
21990 69 66 28 20 69 53 61 76 65 70 6f 69 6e 74 3c 30  if( iSavepoint<0
219a0 20 26 26 20 28 70 42 74 2d 3e 62 74 73 46 6c 61   && (pBt->btsFla
219b0 67 73 20 26 20 42 54 53 5f 49 4e 49 54 49 41 4c  gs & BTS_INITIAL
219c0 4c 59 5f 45 4d 50 54 59 29 21 3d 30 20 29 7b 0a  LY_EMPTY)!=0 ){.
219d0 20 20 20 20 20 20 20 20 70 42 74 2d 3e 6e 50 61          pBt->nPa
219e0 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  ge = 0;.      }.
219f0 20 20 20 20 20 20 72 63 20 3d 20 6e 65 77 44 61        rc = newDa
21a00 74 61 62 61 73 65 28 70 42 74 29 3b 0a 20 20 20  tabase(pBt);.   
21a10 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20     pBt->nPage = 
21a20 67 65 74 34 62 79 74 65 28 32 38 20 2b 20 70 42  get4byte(28 + pB
21a30 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61  t->pPage1->aData
21a40 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 65  );..      /* The
21a50 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 77   database size w
21a60 61 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  as written into 
21a70 74 68 65 20 6f 66 66 73 65 74 20 32 38 20 6f 66  the offset 28 of
21a80 20 74 68 65 20 68 65 61 64 65 72 0a 20 20 20 20   the header.    
21a90 20 20 2a 2a 20 77 68 65 6e 20 74 68 65 20 74 72    ** when the tr
21aa0 61 6e 73 61 63 74 69 6f 6e 20 73 74 61 72 74 65  ansaction starte
21ab0 64 2c 20 73 6f 20 77 65 20 6b 6e 6f 77 20 74 68  d, so we know th
21ac0 61 74 20 74 68 65 20 76 61 6c 75 65 20 61 74 20  at the value at 
21ad0 6f 66 66 73 65 74 0a 20 20 20 20 20 20 2a 2a 20  offset.      ** 
21ae0 32 38 20 69 73 20 6e 6f 6e 7a 65 72 6f 2e 20 2a  28 is nonzero. *
21af0 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
21b00 70 42 74 2d 3e 6e 50 61 67 65 3e 30 20 29 3b 0a  pBt->nPage>0 );.
21b10 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
21b20 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
21b30 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
21b40 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  .}../*.** Create
21b50 20 61 20 6e 65 77 20 63 75 72 73 6f 72 20 66 6f   a new cursor fo
21b60 72 20 74 68 65 20 42 54 72 65 65 20 77 68 6f 73  r the BTree whos
21b70 65 20 72 6f 6f 74 20 69 73 20 6f 6e 20 74 68 65  e root is on the
21b80 20 70 61 67 65 0a 2a 2a 20 69 54 61 62 6c 65 2e   page.** iTable.
21b90 20 49 66 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20   If a read-only 
21ba0 63 75 72 73 6f 72 20 69 73 20 72 65 71 75 65 73  cursor is reques
21bb0 74 65 64 2c 20 69 74 20 69 73 20 61 73 73 75 6d  ted, it is assum
21bc0 65 64 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 63  ed that.** the c
21bd0 61 6c 6c 65 72 20 61 6c 72 65 61 64 79 20 68 61  aller already ha
21be0 73 20 61 74 20 6c 65 61 73 74 20 61 20 72 65 61  s at least a rea
21bf0 64 2d 6f 6e 6c 79 20 74 72 61 6e 73 61 63 74 69  d-only transacti
21c00 6f 6e 20 6f 70 65 6e 0a 2a 2a 20 6f 6e 20 74 68  on open.** on th
21c10 65 20 64 61 74 61 62 61 73 65 20 61 6c 72 65 61  e database alrea
21c20 64 79 2e 20 49 66 20 61 20 77 72 69 74 65 2d 63  dy. If a write-c
21c30 75 72 73 6f 72 20 69 73 20 72 65 71 75 65 73 74  ursor is request
21c40 65 64 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20  ed, then.** the 
21c50 63 61 6c 6c 65 72 20 69 73 20 61 73 73 75 6d 65  caller is assume
21c60 64 20 74 6f 20 68 61 76 65 20 61 6e 20 6f 70 65  d to have an ope
21c70 6e 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  n write transact
21c80 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77 72  ion..**.** If wr
21c90 46 6c 61 67 3d 3d 30 2c 20 74 68 65 6e 20 74 68  Flag==0, then th
21ca0 65 20 63 75 72 73 6f 72 20 63 61 6e 20 6f 6e 6c  e cursor can onl
21cb0 79 20 62 65 20 75 73 65 64 20 66 6f 72 20 72 65  y be used for re
21cc0 61 64 69 6e 67 2e 0a 2a 2a 20 49 66 20 77 72 46  ading..** If wrF
21cd0 6c 61 67 3d 3d 31 2c 20 74 68 65 6e 20 74 68 65  lag==1, then the
21ce0 20 63 75 72 73 6f 72 20 63 61 6e 20 62 65 20 75   cursor can be u
21cf0 73 65 64 20 66 6f 72 20 72 65 61 64 69 6e 67 20  sed for reading 
21d00 6f 72 20 66 6f 72 0a 2a 2a 20 77 72 69 74 69 6e  or for.** writin
21d10 67 20 69 66 20 6f 74 68 65 72 20 63 6f 6e 64 69  g if other condi
21d20 74 69 6f 6e 73 20 66 6f 72 20 77 72 69 74 69 6e  tions for writin
21d30 67 20 61 72 65 20 61 6c 73 6f 20 6d 65 74 2e 20  g are also met. 
21d40 20 54 68 65 73 65 0a 2a 2a 20 61 72 65 20 74 68   These.** are th
21d50 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20 74 68 61  e conditions tha
21d60 74 20 6d 75 73 74 20 62 65 20 6d 65 74 20 69 6e  t must be met in
21d70 20 6f 72 64 65 72 20 66 6f 72 20 77 72 69 74 69   order for writi
21d80 6e 67 20 74 6f 0a 2a 2a 20 62 65 20 61 6c 6c 6f  ng to.** be allo
21d90 77 65 64 3a 0a 2a 2a 0a 2a 2a 20 31 3a 20 20 54  wed:.**.** 1:  T
21da0 68 65 20 63 75 72 73 6f 72 20 6d 75 73 74 20 68  he cursor must h
21db0 61 76 65 20 62 65 65 6e 20 6f 70 65 6e 65 64 20  ave been opened 
21dc0 77 69 74 68 20 77 72 46 6c 61 67 3d 3d 31 0a 2a  with wrFlag==1.*
21dd0 2a 0a 2a 2a 20 32 3a 20 20 4f 74 68 65 72 20 64  *.** 2:  Other d
21de0 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
21df0 6f 6e 73 20 74 68 61 74 20 73 68 61 72 65 20 74  ons that share t
21e00 68 65 20 73 61 6d 65 20 70 61 67 65 72 20 63 61  he same pager ca
21e10 63 68 65 0a 2a 2a 20 20 20 20 20 62 75 74 20 77  che.**     but w
21e20 68 69 63 68 20 61 72 65 20 6e 6f 74 20 69 6e 20  hich are not in 
21e30 74 68 65 20 52 45 41 44 5f 55 4e 43 4f 4d 4d 49  the READ_UNCOMMI
21e40 54 54 45 44 20 73 74 61 74 65 20 6d 61 79 20 6e  TTED state may n
21e50 6f 74 20 68 61 76 65 0a 2a 2a 20 20 20 20 20 63  ot have.**     c
21e60 75 72 73 6f 72 73 20 6f 70 65 6e 20 77 69 74 68  ursors open with
21e70 20 77 72 46 6c 61 67 3d 3d 30 20 6f 6e 20 74 68   wrFlag==0 on th
21e80 65 20 73 61 6d 65 20 74 61 62 6c 65 2e 20 20 4f  e same table.  O
21e90 74 68 65 72 77 69 73 65 0a 2a 2a 20 20 20 20 20  therwise.**     
21ea0 74 68 65 20 63 68 61 6e 67 65 73 20 6d 61 64 65  the changes made
21eb0 20 62 79 20 74 68 69 73 20 77 72 69 74 65 20 63   by this write c
21ec0 75 72 73 6f 72 20 77 6f 75 6c 64 20 62 65 20 76  ursor would be v
21ed0 69 73 69 62 6c 65 20 74 6f 0a 2a 2a 20 20 20 20  isible to.**    
21ee0 20 74 68 65 20 72 65 61 64 20 63 75 72 73 6f 72   the read cursor
21ef0 73 20 69 6e 20 74 68 65 20 6f 74 68 65 72 20 64  s in the other d
21f00 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
21f10 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 33 3a 20 20 54 68  on..**.** 3:  Th
21f20 65 20 64 61 74 61 62 61 73 65 20 6d 75 73 74 20  e database must 
21f30 62 65 20 77 72 69 74 61 62 6c 65 20 28 6e 6f 74  be writable (not
21f40 20 6f 6e 20 72 65 61 64 2d 6f 6e 6c 79 20 6d 65   on read-only me
21f50 64 69 61 29 0a 2a 2a 0a 2a 2a 20 34 3a 20 20 54  dia).**.** 4:  T
21f60 68 65 72 65 20 6d 75 73 74 20 62 65 20 61 6e 20  here must be an 
21f70 61 63 74 69 76 65 20 74 72 61 6e 73 61 63 74 69  active transacti
21f80 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 20 63 68 65  on..**.** No che
21f90 63 6b 69 6e 67 20 69 73 20 64 6f 6e 65 20 74 6f  cking is done to
21fa0 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20   make sure that 
21fb0 70 61 67 65 20 69 54 61 62 6c 65 20 72 65 61 6c  page iTable real
21fc0 6c 79 20 69 73 20 74 68 65 0a 2a 2a 20 72 6f 6f  ly is the.** roo
21fd0 74 20 70 61 67 65 20 6f 66 20 61 20 62 2d 74 72  t page of a b-tr
21fe0 65 65 2e 20 20 49 66 20 69 74 20 69 73 20 6e 6f  ee.  If it is no
21ff0 74 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73  t, then the curs
22000 6f 72 20 61 63 71 75 69 72 65 64 0a 2a 2a 20 77  or acquired.** w
22010 69 6c 6c 20 6e 6f 74 20 77 6f 72 6b 20 63 6f 72  ill not work cor
22020 72 65 63 74 6c 79 2e 0a 2a 2a 0a 2a 2a 20 49 74  rectly..**.** It
22030 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74   is assumed that
22040 20 74 68 65 20 73 71 6c 69 74 65 33 42 74 72 65   the sqlite3Btre
22050 65 43 75 72 73 6f 72 5a 65 72 6f 28 29 20 68 61  eCursorZero() ha
22060 73 20 62 65 65 6e 20 63 61 6c 6c 65 64 0a 2a 2a  s been called.**
22070 20 6f 6e 20 70 43 75 72 20 74 6f 20 69 6e 69 74   on pCur to init
22080 69 61 6c 69 7a 65 20 74 68 65 20 6d 65 6d 6f 72  ialize the memor
22090 79 20 73 70 61 63 65 20 70 72 69 6f 72 20 74 6f  y space prior to
220a0 20 69 6e 76 6f 6b 69 6e 67 20 74 68 69 73 20 72   invoking this r
220b0 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 73 74 61 74 69  outine..*/.stati
220c0 63 20 69 6e 74 20 62 74 72 65 65 43 75 72 73 6f  c int btreeCurso
220d0 72 28 0a 20 20 42 74 72 65 65 20 2a 70 2c 20 20  r(.  Btree *p,  
220e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
220f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
22100 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 69 6e  he btree */.  in
22110 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20  t iTable,       
22120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22130 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67       /* Root pag
22140 65 20 6f 66 20 74 61 62 6c 65 20 74 6f 20 6f 70  e of table to op
22150 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 77 72 46 6c  en */.  int wrFl
22160 61 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ag,             
22170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
22180 2a 20 31 20 74 6f 20 77 72 69 74 65 2e 20 30 20  * 1 to write. 0 
22190 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73  read-only */.  s
221a0 74 72 75 63 74 20 4b 65 79 49 6e 66 6f 20 2a 70  truct KeyInfo *p
221b0 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20 20 20 20  KeyInfo,        
221c0 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61        /* First a
221d0 72 67 20 74 6f 20 63 6f 6d 70 61 72 69 73 6f 6e  rg to comparison
221e0 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 42   function */.  B
221f0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 20 20 20  tCursor *pCur   
22200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22210 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20 66        /* Space f
22220 6f 72 20 6e 65 77 20 63 75 72 73 6f 72 20 2a 2f  or new cursor */
22230 0a 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  .){.  BtShared *
22240 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 20 20 20  pBt = p->pBt;   
22250 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
22260 53 68 61 72 65 64 20 62 2d 74 72 65 65 20 68 61  Shared b-tree ha
22270 6e 64 6c 65 20 2a 2f 0a 20 20 42 74 43 75 72 73  ndle */.  BtCurs
22280 6f 72 20 2a 70 58 3b 20 20 20 20 20 20 20 20 20  or *pX;         
22290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
222a0 20 2f 2a 20 4c 6f 6f 70 69 6e 67 20 6f 76 65 72   /* Looping over
222b0 20 6f 74 68 65 72 20 61 6c 6c 20 63 75 72 73 6f   other all curso
222c0 72 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  rs */..  assert(
222d0 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c   sqlite3BtreeHol
222e0 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20  dsMutex(p) );.  
222f0 61 73 73 65 72 74 28 20 77 72 46 6c 61 67 3d 3d  assert( wrFlag==
22300 30 20 0a 20 20 20 20 20 20 20 7c 7c 20 77 72 46  0 .       || wrF
22310 6c 61 67 3d 3d 42 54 52 45 45 5f 57 52 43 53 52  lag==BTREE_WRCSR
22320 20 0a 20 20 20 20 20 20 20 7c 7c 20 77 72 46 6c   .       || wrFl
22330 61 67 3d 3d 28 42 54 52 45 45 5f 57 52 43 53 52  ag==(BTREE_WRCSR
22340 7c 42 54 52 45 45 5f 46 4f 52 44 45 4c 45 54 45  |BTREE_FORDELETE
22350 29 20 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 54 68  ) .  );..  /* Th
22360 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65  e following asse
22370 72 74 20 73 74 61 74 65 6d 65 6e 74 73 20 76 65  rt statements ve
22380 72 69 66 79 20 74 68 61 74 20 69 66 20 74 68 69  rify that if thi
22390 73 20 69 73 20 61 20 73 68 61 72 61 62 6c 65 20  s is a sharable 
223a0 0a 20 20 2a 2a 20 62 2d 74 72 65 65 20 64 61 74  .  ** b-tree dat
223b0 61 62 61 73 65 2c 20 74 68 65 20 63 6f 6e 6e 65  abase, the conne
223c0 63 74 69 6f 6e 20 69 73 20 68 6f 6c 64 69 6e 67  ction is holding
223d0 20 74 68 65 20 72 65 71 75 69 72 65 64 20 74 61   the required ta
223e0 62 6c 65 20 6c 6f 63 6b 73 2c 20 0a 20 20 2a 2a  ble locks, .  **
223f0 20 61 6e 64 20 74 68 61 74 20 6e 6f 20 6f 74 68   and that no oth
22400 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61  er connection ha
22410 73 20 61 6e 79 20 6f 70 65 6e 20 63 75 72 73 6f  s any open curso
22420 72 20 74 68 61 74 20 63 6f 6e 66 6c 69 63 74 73  r that conflicts
22430 20 77 69 74 68 20 0a 20 20 2a 2a 20 74 68 69 73   with .  ** this
22440 20 6c 6f 63 6b 2e 20 20 2a 2f 0a 20 20 61 73 73   lock.  */.  ass
22450 65 72 74 28 20 68 61 73 53 68 61 72 65 64 43 61  ert( hasSharedCa
22460 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20  cheTableLock(p, 
22470 69 54 61 62 6c 65 2c 20 70 4b 65 79 49 6e 66 6f  iTable, pKeyInfo
22480 21 3d 30 2c 20 28 77 72 46 6c 61 67 3f 32 3a 31  !=0, (wrFlag?2:1
22490 29 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  )) );.  assert( 
224a0 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20 21 68 61  wrFlag==0 || !ha
224b0 73 52 65 61 64 43 6f 6e 66 6c 69 63 74 73 28 70  sReadConflicts(p
224c0 2c 20 69 54 61 62 6c 65 29 20 29 3b 0a 0a 20 20  , iTable) );..  
224d0 2f 2a 20 41 73 73 65 72 74 20 74 68 61 74 20 74  /* Assert that t
224e0 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20 6f 70  he caller has op
224f0 65 6e 65 64 20 74 68 65 20 72 65 71 75 69 72 65  ened the require
22500 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 2a  d transaction. *
22510 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69  /.  assert( p->i
22520 6e 54 72 61 6e 73 3e 54 52 41 4e 53 5f 4e 4f 4e  nTrans>TRANS_NON
22530 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 77  E );.  assert( w
22540 72 46 6c 61 67 3d 3d 30 20 7c 7c 20 70 2d 3e 69  rFlag==0 || p->i
22550 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52  nTrans==TRANS_WR
22560 49 54 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ITE );.  assert(
22570 20 70 42 74 2d 3e 70 50 61 67 65 31 20 26 26 20   pBt->pPage1 && 
22580 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61  pBt->pPage1->aDa
22590 74 61 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ta );.  assert( 
225a0 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20 28 70 42  wrFlag==0 || (pB
225b0 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54  t->btsFlags & BT
225c0 53 5f 52 45 41 44 5f 4f 4e 4c 59 29 3d 3d 30 20  S_READ_ONLY)==0 
225d0 29 3b 0a 0a 20 20 69 66 28 20 77 72 46 6c 61 67  );..  if( wrFlag
225e0 20 29 7b 0a 20 20 20 20 61 6c 6c 6f 63 61 74 65   ){.    allocate
225f0 54 65 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a  TempSpace(pBt);.
22600 20 20 20 20 69 66 28 20 70 42 74 2d 3e 70 54 6d      if( pBt->pTm
22610 70 53 70 61 63 65 3d 3d 30 20 29 20 72 65 74 75  pSpace==0 ) retu
22620 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
22630 0a 20 20 7d 0a 20 20 69 66 28 20 69 54 61 62 6c  .  }.  if( iTabl
22640 65 3d 3d 31 20 26 26 20 62 74 72 65 65 50 61 67  e==1 && btreePag
22650 65 63 6f 75 6e 74 28 70 42 74 29 3d 3d 30 20 29  ecount(pBt)==0 )
22660 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 77 72  {.    assert( wr
22670 46 6c 61 67 3d 3d 30 20 29 3b 0a 20 20 20 20 69  Flag==0 );.    i
22680 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a  Table = 0;.  }..
22690 20 20 2f 2a 20 4e 6f 77 20 74 68 61 74 20 6e 6f    /* Now that no
226a0 20 6f 74 68 65 72 20 65 72 72 6f 72 73 20 63 61   other errors ca
226b0 6e 20 6f 63 63 75 72 2c 20 66 69 6e 69 73 68 20  n occur, finish 
226c0 66 69 6c 6c 69 6e 67 20 69 6e 20 74 68 65 20 42  filling in the B
226d0 74 43 75 72 73 6f 72 0a 20 20 2a 2a 20 76 61 72  tCursor.  ** var
226e0 69 61 62 6c 65 73 20 61 6e 64 20 6c 69 6e 6b 20  iables and link 
226f0 74 68 65 20 63 75 72 73 6f 72 20 69 6e 74 6f 20  the cursor into 
22700 74 68 65 20 42 74 53 68 61 72 65 64 20 6c 69 73  the BtShared lis
22710 74 2e 20 20 2a 2f 0a 20 20 70 43 75 72 2d 3e 70  t.  */.  pCur->p
22720 67 6e 6f 52 6f 6f 74 20 3d 20 28 50 67 6e 6f 29  gnoRoot = (Pgno)
22730 69 54 61 62 6c 65 3b 0a 20 20 70 43 75 72 2d 3e  iTable;.  pCur->
22740 69 50 61 67 65 20 3d 20 2d 31 3b 0a 20 20 70 43  iPage = -1;.  pC
22750 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d 20 70  ur->pKeyInfo = p
22760 4b 65 79 49 6e 66 6f 3b 0a 20 20 70 43 75 72 2d  KeyInfo;.  pCur-
22770 3e 70 42 74 72 65 65 20 3d 20 70 3b 0a 20 20 70  >pBtree = p;.  p
22780 43 75 72 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a  Cur->pBt = pBt;.
22790 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73    pCur->curFlags
227a0 20 3d 20 77 72 46 6c 61 67 20 3f 20 42 54 43 46   = wrFlag ? BTCF
227b0 5f 57 72 69 74 65 46 6c 61 67 20 3a 20 30 3b 0a  _WriteFlag : 0;.
227c0 20 20 70 43 75 72 2d 3e 63 75 72 50 61 67 65 72    pCur->curPager
227d0 46 6c 61 67 73 20 3d 20 77 72 46 6c 61 67 20 3f  Flags = wrFlag ?
227e0 20 30 20 3a 20 50 41 47 45 52 5f 47 45 54 5f 52   0 : PAGER_GET_R
227f0 45 41 44 4f 4e 4c 59 3b 0a 20 20 2f 2a 20 49 66  EADONLY;.  /* If
22800 20 74 68 65 72 65 20 61 72 65 20 74 77 6f 20 6f   there are two o
22810 72 20 6d 6f 72 65 20 63 75 72 73 6f 72 73 20 6f  r more cursors o
22820 6e 20 74 68 65 20 73 61 6d 65 20 62 74 72 65 65  n the same btree
22830 2c 20 74 68 65 6e 20 61 6c 6c 20 73 75 63 68 0a  , then all such.
22840 20 20 2a 2a 20 63 75 72 73 6f 72 73 20 2a 6d 75    ** cursors *mu
22850 73 74 2a 20 68 61 76 65 20 74 68 65 20 42 54 43  st* have the BTC
22860 46 5f 4d 75 6c 74 69 70 6c 65 20 66 6c 61 67 20  F_Multiple flag 
22870 73 65 74 2e 20 2a 2f 0a 20 20 66 6f 72 28 70 58  set. */.  for(pX
22880 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70  =pBt->pCursor; p
22890 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29  X; pX=pX->pNext)
228a0 7b 0a 20 20 20 20 69 66 28 20 70 58 2d 3e 70 67  {.    if( pX->pg
228b0 6e 6f 52 6f 6f 74 3d 3d 28 50 67 6e 6f 29 69 54  noRoot==(Pgno)iT
228c0 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 70 58  able ){.      pX
228d0 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20 42 54  ->curFlags |= BT
228e0 43 46 5f 4d 75 6c 74 69 70 6c 65 3b 0a 20 20 20  CF_Multiple;.   
228f0 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67     pCur->curFlag
22900 73 20 7c 3d 20 42 54 43 46 5f 4d 75 6c 74 69 70  s |= BTCF_Multip
22910 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  le;.    }.  }.  
22920 70 43 75 72 2d 3e 70 4e 65 78 74 20 3d 20 70 42  pCur->pNext = pB
22930 74 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 70 42  t->pCursor;.  pB
22940 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20 70 43 75  t->pCursor = pCu
22950 72 3b 0a 20 20 70 43 75 72 2d 3e 65 53 74 61 74  r;.  pCur->eStat
22960 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  e = CURSOR_INVAL
22970 49 44 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ID;.  return SQL
22980 49 54 45 5f 4f 4b 3b 0a 7d 0a 69 6e 74 20 73 71  ITE_OK;.}.int sq
22990 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
229a0 28 0a 20 20 42 74 72 65 65 20 2a 70 2c 20 20 20  (.  Btree *p,   
229b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
229c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
229d0 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a  /* The btree */.
229e0 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20    int iTable,   
229f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22a10 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 61   Root page of ta
22a20 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20  ble to open */. 
22a30 20 69 6e 74 20 77 72 46 6c 61 67 2c 20 20 20 20   int wrFlag,    
22a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22a50 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
22a60 31 20 74 6f 20 77 72 69 74 65 2e 20 30 20 72 65  1 to write. 0 re
22a70 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74 72  ad-only */.  str
22a80 75 63 74 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65  uct KeyInfo *pKe
22a90 79 49 6e 66 6f 2c 20 20 20 20 20 20 20 20 20 20  yInfo,          
22aa0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
22ab0 74 20 61 72 67 20 74 6f 20 78 43 6f 6d 70 61 72  t arg to xCompar
22ac0 65 28 29 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f  e() */.  BtCurso
22ad0 72 20 2a 70 43 75 72 20 20 20 20 20 20 20 20 20  r *pCur         
22ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22af0 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 6e 65       /* Write ne
22b00 77 20 63 75 72 73 6f 72 20 68 65 72 65 20 2a 2f  w cursor here */
22b10 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
22b20 69 66 28 20 69 54 61 62 6c 65 3c 31 20 29 7b 0a  if( iTable<1 ){.
22b30 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
22b40 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
22b50 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
22b60 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
22b70 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 43  .    rc = btreeC
22b80 75 72 73 6f 72 28 70 2c 20 69 54 61 62 6c 65 2c  ursor(p, iTable,
22b90 20 77 72 46 6c 61 67 2c 20 70 4b 65 79 49 6e 66   wrFlag, pKeyInf
22ba0 6f 2c 20 70 43 75 72 29 3b 0a 20 20 20 20 73 71  o, pCur);.    sq
22bb0 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
22bc0 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  p);.  }.  return
22bd0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
22be0 74 75 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66  turn the size of
22bf0 20 61 20 42 74 43 75 72 73 6f 72 20 6f 62 6a 65   a BtCursor obje
22c00 63 74 20 69 6e 20 62 79 74 65 73 2e 0a 2a 2a 0a  ct in bytes..**.
22c10 2a 2a 20 54 68 69 73 20 69 6e 74 65 72 66 61 63  ** This interfac
22c20 65 73 20 69 73 20 6e 65 65 64 65 64 20 73 6f 20  es is needed so 
22c30 74 68 61 74 20 75 73 65 72 73 20 6f 66 20 63 75  that users of cu
22c40 72 73 6f 72 73 20 63 61 6e 20 70 72 65 61 6c 6c  rsors can preall
22c50 6f 63 61 74 65 0a 2a 2a 20 73 75 66 66 69 63 69  ocate.** suffici
22c60 65 6e 74 20 73 74 6f 72 61 67 65 20 74 6f 20 68  ent storage to h
22c70 6f 6c 64 20 61 20 63 75 72 73 6f 72 2e 20 20 54  old a cursor.  T
22c80 68 65 20 42 74 43 75 72 73 6f 72 20 6f 62 6a 65  he BtCursor obje
22c90 63 74 20 69 73 20 6f 70 61 71 75 65 0a 2a 2a 20  ct is opaque.** 
22ca0 74 6f 20 75 73 65 72 73 20 73 6f 20 74 68 65 79  to users so they
22cb0 20 63 61 6e 6e 6f 74 20 64 6f 20 74 68 65 20 73   cannot do the s
22cc0 69 7a 65 6f 66 28 29 20 74 68 65 6d 73 65 6c 76  izeof() themselv
22cd0 65 73 20 2d 20 74 68 65 79 20 6d 75 73 74 20 63  es - they must c
22ce0 61 6c 6c 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74  all.** this rout
22cf0 69 6e 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ine..*/.int sqli
22d00 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 53 69  te3BtreeCursorSi
22d10 7a 65 28 76 6f 69 64 29 7b 0a 20 20 72 65 74 75  ze(void){.  retu
22d20 72 6e 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66  rn ROUND8(sizeof
22d30 28 42 74 43 75 72 73 6f 72 29 29 3b 0a 7d 0a 0a  (BtCursor));.}..
22d40 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65  /*.** Initialize
22d50 20 6d 65 6d 6f 72 79 20 74 68 61 74 20 77 69 6c   memory that wil
22d60 6c 20 62 65 20 63 6f 6e 76 65 72 74 65 64 20 69  l be converted i
22d70 6e 74 6f 20 61 20 42 74 43 75 72 73 6f 72 20 6f  nto a BtCursor o
22d80 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  bject..**.** The
22d90 20 73 69 6d 70 6c 65 20 61 70 70 72 6f 61 63 68   simple approach
22da0 20 68 65 72 65 20 77 6f 75 6c 64 20 62 65 20 74   here would be t
22db0 6f 20 6d 65 6d 73 65 74 28 29 20 74 68 65 20 65  o memset() the e
22dc0 6e 74 69 72 65 20 6f 62 6a 65 63 74 0a 2a 2a 20  ntire object.** 
22dd0 74 6f 20 7a 65 72 6f 2e 20 20 42 75 74 20 69 74  to zero.  But it
22de0 20 74 75 72 6e 73 20 6f 75 74 20 74 68 61 74 20   turns out that 
22df0 74 68 65 20 61 70 50 61 67 65 5b 5d 20 61 6e 64  the apPage[] and
22e00 20 61 69 49 64 78 5b 5d 20 61 72 72 61 79 73 0a   aiIdx[] arrays.
22e10 2a 2a 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74  ** do not need t
22e20 6f 20 62 65 20 7a 65 72 6f 65 64 20 61 6e 64 20  o be zeroed and 
22e30 74 68 65 79 20 61 72 65 20 6c 61 72 67 65 2c 20  they are large, 
22e40 73 6f 20 77 65 20 63 61 6e 20 73 61 76 65 20 61  so we can save a
22e50 20 6c 6f 74 0a 2a 2a 20 6f 66 20 72 75 6e 2d 74   lot.** of run-t
22e60 69 6d 65 20 62 79 20 73 6b 69 70 70 69 6e 67 20  ime by skipping 
22e70 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69  the initializati
22e80 6f 6e 20 6f 66 20 74 68 6f 73 65 20 65 6c 65 6d  on of those elem
22e90 65 6e 74 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ents..*/.void sq
22ea0 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
22eb0 5a 65 72 6f 28 42 74 43 75 72 73 6f 72 20 2a 70  Zero(BtCursor *p
22ec0 29 7b 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20 30  ){.  memset(p, 0
22ed0 2c 20 6f 66 66 73 65 74 6f 66 28 42 74 43 75 72  , offsetof(BtCur
22ee0 73 6f 72 2c 20 69 50 61 67 65 29 29 3b 0a 7d 0a  sor, iPage));.}.
22ef0 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 63  ./*.** Close a c
22f00 75 72 73 6f 72 2e 20 20 54 68 65 20 72 65 61 64  ursor.  The read
22f10 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
22f20 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 72 65  abase file is re
22f30 6c 65 61 73 65 64 0a 2a 2a 20 77 68 65 6e 20 74  leased.** when t
22f40 68 65 20 6c 61 73 74 20 63 75 72 73 6f 72 20 69  he last cursor i
22f50 73 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 69 6e 74  s closed..*/.int
22f60 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f   sqlite3BtreeClo
22f70 73 65 43 75 72 73 6f 72 28 42 74 43 75 72 73 6f  seCursor(BtCurso
22f80 72 20 2a 70 43 75 72 29 7b 0a 20 20 42 74 72 65  r *pCur){.  Btre
22f90 65 20 2a 70 42 74 72 65 65 20 3d 20 70 43 75 72  e *pBtree = pCur
22fa0 2d 3e 70 42 74 72 65 65 3b 0a 20 20 69 66 28 20  ->pBtree;.  if( 
22fb0 70 42 74 72 65 65 20 29 7b 0a 20 20 20 20 69 6e  pBtree ){.    in
22fc0 74 20 69 3b 0a 20 20 20 20 42 74 53 68 61 72 65  t i;.    BtShare
22fd0 64 20 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e 70  d *pBt = pCur->p
22fe0 42 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42  Bt;.    sqlite3B
22ff0 74 72 65 65 45 6e 74 65 72 28 70 42 74 72 65 65  treeEnter(pBtree
23000 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  );.    sqlite3Bt
23010 72 65 65 43 6c 65 61 72 43 75 72 73 6f 72 28 70  reeClearCursor(p
23020 43 75 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74  Cur);.    assert
23030 28 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 21 3d  ( pBt->pCursor!=
23040 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74  0 );.    if( pBt
23050 2d 3e 70 43 75 72 73 6f 72 3d 3d 70 43 75 72 20  ->pCursor==pCur 
23060 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 43  ){.      pBt->pC
23070 75 72 73 6f 72 20 3d 20 70 43 75 72 2d 3e 70 4e  ursor = pCur->pN
23080 65 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ext;.    }else{.
23090 20 20 20 20 20 20 42 74 43 75 72 73 6f 72 20 2a        BtCursor *
230a0 70 50 72 65 76 20 3d 20 70 42 74 2d 3e 70 43 75  pPrev = pBt->pCu
230b0 72 73 6f 72 3b 0a 20 20 20 20 20 20 64 6f 7b 0a  rsor;.      do{.
230c0 20 20 20 20 20 20 20 20 69 66 28 20 70 50 72 65          if( pPre
230d0 76 2d 3e 70 4e 65 78 74 3d 3d 70 43 75 72 20 29  v->pNext==pCur )
230e0 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50 72 65  {.          pPre
230f0 76 2d 3e 70 4e 65 78 74 20 3d 20 70 43 75 72 2d  v->pNext = pCur-
23100 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20  >pNext;.        
23110 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
23120 20 7d 0a 20 20 20 20 20 20 20 20 70 50 72 65 76   }.        pPrev
23130 20 3d 20 70 50 72 65 76 2d 3e 70 4e 65 78 74 3b   = pPrev->pNext;
23140 0a 20 20 20 20 20 20 7d 77 68 69 6c 65 28 20 41  .      }while( A
23150 4c 57 41 59 53 28 70 50 72 65 76 29 20 29 3b 0a  LWAYS(pPrev) );.
23160 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d      }.    for(i=
23170 30 3b 20 69 3c 3d 70 43 75 72 2d 3e 69 50 61 67  0; i<=pCur->iPag
23180 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72  e; i++){.      r
23190 65 6c 65 61 73 65 50 61 67 65 28 70 43 75 72 2d  eleasePage(pCur-
231a0 3e 61 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20 20  >apPage[i]);.   
231b0 20 7d 0a 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72   }.    unlockBtr
231c0 65 65 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b  eeIfUnused(pBt);
231d0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
231e0 65 28 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f  e(pCur->aOverflo
231f0 77 29 3b 0a 20 20 20 20 2f 2a 20 73 71 6c 69 74  w);.    /* sqlit
23200 65 33 5f 66 72 65 65 28 70 43 75 72 29 3b 20 2a  e3_free(pCur); *
23210 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  /.    sqlite3Btr
23220 65 65 4c 65 61 76 65 28 70 42 74 72 65 65 29 3b  eeLeave(pBtree);
23230 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
23240 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
23250 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20  * Make sure the 
23260 42 74 43 75 72 73 6f 72 2a 20 67 69 76 65 6e 20  BtCursor* given 
23270 69 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20  in the argument 
23280 68 61 73 20 61 20 76 61 6c 69 64 0a 2a 2a 20 42  has a valid.** B
23290 74 43 75 72 73 6f 72 2e 69 6e 66 6f 20 73 74 72  tCursor.info str
232a0 75 63 74 75 72 65 2e 20 20 49 66 20 69 74 20 69  ucture.  If it i
232b0 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 76 61  s not already va
232c0 6c 69 64 2c 20 63 61 6c 6c 0a 2a 2a 20 62 74 72  lid, call.** btr
232d0 65 65 50 61 72 73 65 43 65 6c 6c 28 29 20 74 6f  eeParseCell() to
232e0 20 66 69 6c 6c 20 69 74 20 69 6e 2e 0a 2a 2a 0a   fill it in..**.
232f0 2a 2a 20 42 74 43 75 72 73 6f 72 2e 69 6e 66 6f  ** BtCursor.info
23300 20 69 73 20 61 20 63 61 63 68 65 20 6f 66 20 74   is a cache of t
23310 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  he information i
23320 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 65  n the current ce
23330 6c 6c 2e 0a 2a 2a 20 55 73 69 6e 67 20 74 68 69  ll..** Using thi
23340 73 20 63 61 63 68 65 20 72 65 64 75 63 65 73 20  s cache reduces 
23350 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 61  the number of ca
23360 6c 6c 73 20 74 6f 20 62 74 72 65 65 50 61 72 73  lls to btreePars
23370 65 43 65 6c 6c 28 29 2e 0a 2a 2f 0a 23 69 66 6e  eCell()..*/.#ifn
23380 64 65 66 20 4e 44 45 42 55 47 0a 20 20 73 74 61  def NDEBUG.  sta
23390 74 69 63 20 76 6f 69 64 20 61 73 73 65 72 74 43  tic void assertC
233a0 65 6c 6c 49 6e 66 6f 28 42 74 43 75 72 73 6f 72  ellInfo(BtCursor
233b0 20 2a 70 43 75 72 29 7b 0a 20 20 20 20 43 65 6c   *pCur){.    Cel
233c0 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20  lInfo info;.    
233d0 69 6e 74 20 69 50 61 67 65 20 3d 20 70 43 75 72  int iPage = pCur
233e0 2d 3e 69 50 61 67 65 3b 0a 20 20 20 20 6d 65 6d  ->iPage;.    mem
233f0 73 65 74 28 26 69 6e 66 6f 2c 20 30 2c 20 73 69  set(&info, 0, si
23400 7a 65 6f 66 28 69 6e 66 6f 29 29 3b 0a 20 20 20  zeof(info));.   
23410 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28   btreeParseCell(
23420 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 50 61  pCur->apPage[iPa
23430 67 65 5d 2c 20 70 43 75 72 2d 3e 61 69 49 64 78  ge], pCur->aiIdx
23440 5b 69 50 61 67 65 5d 2c 20 26 69 6e 66 6f 29 3b  [iPage], &info);
23450 0a 20 20 20 20 61 73 73 65 72 74 28 20 43 4f 52  .    assert( COR
23460 52 55 50 54 5f 44 42 20 7c 7c 20 6d 65 6d 63 6d  RUPT_DB || memcm
23470 70 28 26 69 6e 66 6f 2c 20 26 70 43 75 72 2d 3e  p(&info, &pCur->
23480 69 6e 66 6f 2c 20 73 69 7a 65 6f 66 28 69 6e 66  info, sizeof(inf
23490 6f 29 29 3d 3d 30 20 29 3b 0a 20 20 7d 0a 23 65  o))==0 );.  }.#e
234a0 6c 73 65 0a 20 20 23 64 65 66 69 6e 65 20 61 73  lse.  #define as
234b0 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28 78 29 0a  sertCellInfo(x).
234c0 23 65 6e 64 69 66 0a 73 74 61 74 69 63 20 53 51  #endif.static SQ
234d0 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76 6f  LITE_NOINLINE vo
234e0 69 64 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 42  id getCellInfo(B
234f0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
23500 20 20 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f    if( pCur->info
23510 2e 6e 53 69 7a 65 3d 3d 30 20 29 7b 0a 20 20 20  .nSize==0 ){.   
23520 20 69 6e 74 20 69 50 61 67 65 20 3d 20 70 43 75   int iPage = pCu
23530 72 2d 3e 69 50 61 67 65 3b 0a 20 20 20 20 70 43  r->iPage;.    pC
23540 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20  ur->curFlags |= 
23550 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 3b 0a  BTCF_ValidNKey;.
23560 20 20 20 20 62 74 72 65 65 50 61 72 73 65 43 65      btreeParseCe
23570 6c 6c 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  ll(pCur->apPage[
23580 69 50 61 67 65 5d 2c 70 43 75 72 2d 3e 61 69 49  iPage],pCur->aiI
23590 64 78 5b 69 50 61 67 65 5d 2c 26 70 43 75 72 2d  dx[iPage],&pCur-
235a0 3e 69 6e 66 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b  >info);.  }else{
235b0 0a 20 20 20 20 61 73 73 65 72 74 43 65 6c 6c 49  .    assertCellI
235c0 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 7d 0a 7d  nfo(pCur);.  }.}
235d0 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  ..#ifndef NDEBUG
235e0 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 72 6f    /* The next ro
235f0 75 74 69 6e 65 20 75 73 65 64 20 6f 6e 6c 79 20  utine used only 
23600 77 69 74 68 69 6e 20 61 73 73 65 72 74 28 29 20  within assert() 
23610 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 2f 2a  statements */./*
23620 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20  .** Return true 
23630 69 66 20 74 68 65 20 67 69 76 65 6e 20 42 74 43  if the given BtC
23640 75 72 73 6f 72 20 69 73 20 76 61 6c 69 64 2e 20  ursor is valid. 
23650 20 41 20 76 61 6c 69 64 20 63 75 72 73 6f 72 20   A valid cursor 
23660 69 73 20 6f 6e 65 0a 2a 2a 20 74 68 61 74 20 69  is one.** that i
23670 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e  s currently poin
23680 74 69 6e 67 20 74 6f 20 61 20 72 6f 77 20 69 6e  ting to a row in
23690 20 61 20 28 6e 6f 6e 2d 65 6d 70 74 79 29 20 74   a (non-empty) t
236a0 61 62 6c 65 2e 0a 2a 2a 20 54 68 69 73 20 69 73  able..** This is
236b0 20 61 20 76 65 72 69 66 69 63 61 74 69 6f 6e 20   a verification 
236c0 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
236d0 6f 6e 6c 79 20 77 69 74 68 69 6e 20 61 73 73 65  only within asse
236e0 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 2e  rt() statements.
236f0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
23700 74 72 65 65 43 75 72 73 6f 72 49 73 56 61 6c 69  treeCursorIsVali
23710 64 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  d(BtCursor *pCur
23720 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 43 75 72  ){.  return pCur
23730 20 26 26 20 70 43 75 72 2d 3e 65 53 74 61 74 65   && pCur->eState
23740 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a  ==CURSOR_VALID;.
23750 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 4e 44 45 42  }.#endif /* NDEB
23760 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  UG */../*.** Set
23770 20 2a 70 53 69 7a 65 20 74 6f 20 74 68 65 20 73   *pSize to the s
23780 69 7a 65 20 6f 66 20 74 68 65 20 62 75 66 66 65  ize of the buffe
23790 72 20 6e 65 65 64 65 64 20 74 6f 20 68 6f 6c 64  r needed to hold
237a0 20 74 68 65 20 76 61 6c 75 65 20 6f 66 0a 2a 2a   the value of.**
237b0 20 74 68 65 20 6b 65 79 20 66 6f 72 20 74 68 65   the key for the
237c0 20 63 75 72 72 65 6e 74 20 65 6e 74 72 79 2e 20   current entry. 
237d0 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 69   If the cursor i
237e0 73 20 6e 6f 74 20 70 6f 69 6e 74 69 6e 67 0a 2a  s not pointing.*
237f0 2a 20 74 6f 20 61 20 76 61 6c 69 64 20 65 6e 74  * to a valid ent
23800 72 79 2c 20 2a 70 53 69 7a 65 20 69 73 20 73 65  ry, *pSize is se
23810 74 20 74 6f 20 30 2e 20 0a 2a 2a 0a 2a 2a 20 46  t to 0. .**.** F
23820 6f 72 20 61 20 74 61 62 6c 65 20 77 69 74 68 20  or a table with 
23830 74 68 65 20 49 4e 54 4b 45 59 20 66 6c 61 67 20  the INTKEY flag 
23840 73 65 74 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  set, this routin
23850 65 20 72 65 74 75 72 6e 73 20 74 68 65 20 6b 65  e returns the ke
23860 79 0a 2a 2a 20 69 74 73 65 6c 66 2c 20 6e 6f 74  y.** itself, not
23870 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
23880 79 74 65 73 20 69 6e 20 74 68 65 20 6b 65 79 2e  ytes in the key.
23890 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65  .**.** The calle
238a0 72 20 6d 75 73 74 20 70 6f 73 69 74 69 6f 6e 20  r must position 
238b0 74 68 65 20 63 75 72 73 6f 72 20 70 72 69 6f 72  the cursor prior
238c0 20 74 6f 20 69 6e 76 6f 6b 69 6e 67 20 74 68 69   to invoking thi
238d0 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 20 0a 2a  s routine..** .*
238e0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
238f0 61 6e 6e 6f 74 20 66 61 69 6c 2e 20 20 49 74 20  annot fail.  It 
23900 61 6c 77 61 79 73 20 72 65 74 75 72 6e 73 20 53  always returns S
23910 51 4c 49 54 45 5f 4f 4b 2e 20 20 0a 2a 2f 0a 69  QLITE_OK.  .*/.i
23920 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b  nt sqlite3BtreeK
23930 65 79 53 69 7a 65 28 42 74 43 75 72 73 6f 72 20  eySize(BtCursor 
23940 2a 70 43 75 72 2c 20 69 36 34 20 2a 70 53 69 7a  *pCur, i64 *pSiz
23950 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75  e){.  assert( cu
23960 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
23970 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
23980 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
23990 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
239a0 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43    getCellInfo(pC
239b0 75 72 29 3b 0a 20 20 2a 70 53 69 7a 65 20 3d 20  ur);.  *pSize = 
239c0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b  pCur->info.nKey;
239d0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
239e0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  _OK;.}../*.** Se
239f0 74 20 2a 70 53 69 7a 65 20 74 6f 20 74 68 65 20  t *pSize to the 
23a00 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
23a10 6f 66 20 64 61 74 61 20 69 6e 20 74 68 65 20 65  of data in the e
23a20 6e 74 72 79 20 74 68 65 0a 2a 2a 20 63 75 72 73  ntry the.** curs
23a30 6f 72 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69  or currently poi
23a40 6e 74 73 20 74 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68  nts to..**.** Th
23a50 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 67 75  e caller must gu
23a60 61 72 61 6e 74 65 65 20 74 68 61 74 20 74 68 65  arantee that the
23a70 20 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74   cursor is point
23a80 69 6e 67 20 74 6f 20 61 20 6e 6f 6e 2d 4e 55 4c  ing to a non-NUL
23a90 4c 0a 2a 2a 20 76 61 6c 69 64 20 65 6e 74 72 79  L.** valid entry
23aa0 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  .  In other word
23ab0 73 2c 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 70  s, the calling p
23ac0 72 6f 63 65 64 75 72 65 20 6d 75 73 74 20 67 75  rocedure must gu
23ad0 61 72 61 6e 74 65 65 0a 2a 2a 20 74 68 61 74 20  arantee.** that 
23ae0 74 68 65 20 63 75 72 73 6f 72 20 68 61 73 20 43  the cursor has C
23af0 75 72 73 6f 72 2e 65 53 74 61 74 65 3d 3d 43 55  ursor.eState==CU
23b00 52 53 4f 52 5f 56 41 4c 49 44 2e 0a 2a 2a 0a 2a  RSOR_VALID..**.*
23b10 2a 20 46 61 69 6c 75 72 65 20 69 73 20 6e 6f 74  * Failure is not
23b20 20 70 6f 73 73 69 62 6c 65 2e 20 20 54 68 69 73   possible.  This
23b30 20 66 75 6e 63 74 69 6f 6e 20 61 6c 77 61 79 73   function always
23b40 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   returns SQLITE_
23b50 4f 4b 2e 0a 2a 2a 20 49 74 20 6d 69 67 68 74 20  OK..** It might 
23b60 6a 75 73 74 20 61 73 20 77 65 6c 6c 20 62 65 20  just as well be 
23b70 61 20 70 72 6f 63 65 64 75 72 65 20 28 72 65 74  a procedure (ret
23b80 75 72 6e 69 6e 67 20 76 6f 69 64 29 20 62 75 74  urning void) but
23b90 20 77 65 20 63 6f 6e 74 69 6e 75 65 0a 2a 2a 20   we continue.** 
23ba0 74 6f 20 72 65 74 75 72 6e 20 61 6e 20 69 6e 74  to return an int
23bb0 65 67 65 72 20 72 65 73 75 6c 74 20 63 6f 64 65  eger result code
23bc0 20 66 6f 72 20 68 69 73 74 6f 72 69 63 61 6c 20   for historical 
23bd0 72 65 61 73 6f 6e 73 2e 0a 2a 2f 0a 69 6e 74 20  reasons..*/.int 
23be0 73 71 6c 69 74 65 33 42 74 72 65 65 44 61 74 61  sqlite3BtreeData
23bf0 53 69 7a 65 28 42 74 43 75 72 73 6f 72 20 2a 70  Size(BtCursor *p
23c00 43 75 72 2c 20 75 33 32 20 2a 70 53 69 7a 65 29  Cur, u32 *pSize)
23c10 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  {.  assert( curs
23c20 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
23c30 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
23c40 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
23c50 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
23c60 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50  assert( pCur->iP
23c70 61 67 65 3e 3d 30 20 29 3b 0a 20 20 61 73 73 65  age>=0 );.  asse
23c80 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3c  rt( pCur->iPage<
23c90 42 54 43 55 52 53 4f 52 5f 4d 41 58 5f 44 45 50  BTCURSOR_MAX_DEP
23ca0 54 48 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  TH );.  assert( 
23cb0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
23cc0 72 2d 3e 69 50 61 67 65 5d 2d 3e 69 6e 74 4b 65  r->iPage]->intKe
23cd0 79 4c 65 61 66 3d 3d 31 20 29 3b 0a 20 20 67 65  yLeaf==1 );.  ge
23ce0 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b  tCellInfo(pCur);
23cf0 0a 20 20 2a 70 53 69 7a 65 20 3d 20 70 43 75 72  .  *pSize = pCur
23d00 2d 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 3b  ->info.nPayload;
23d10 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
23d20 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69  _OK;.}../*.** Gi
23d30 76 65 6e 20 74 68 65 20 70 61 67 65 20 6e 75 6d  ven the page num
23d40 62 65 72 20 6f 66 20 61 6e 20 6f 76 65 72 66 6c  ber of an overfl
23d50 6f 77 20 70 61 67 65 20 69 6e 20 74 68 65 20 64  ow page in the d
23d60 61 74 61 62 61 73 65 20 28 70 61 72 61 6d 65 74  atabase (paramet
23d70 65 72 0a 2a 2a 20 6f 76 66 6c 29 2c 20 74 68 69  er.** ovfl), thi
23d80 73 20 66 75 6e 63 74 69 6f 6e 20 66 69 6e 64 73  s function finds
23d90 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
23da0 20 6f 66 20 74 68 65 20 6e 65 78 74 20 70 61 67   of the next pag
23db0 65 20 69 6e 20 74 68 65 20 0a 2a 2a 20 6c 69 6e  e in the .** lin
23dc0 6b 65 64 20 6c 69 73 74 20 6f 66 20 6f 76 65 72  ked list of over
23dd0 66 6c 6f 77 20 70 61 67 65 73 2e 20 49 66 20 70  flow pages. If p
23de0 6f 73 73 69 62 6c 65 2c 20 69 74 20 75 73 65 73  ossible, it uses
23df0 20 74 68 65 20 61 75 74 6f 2d 76 61 63 75 75 6d   the auto-vacuum
23e00 0a 2a 2a 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  .** pointer-map 
23e10 64 61 74 61 20 69 6e 73 74 65 61 64 20 6f 66 20  data instead of 
23e20 72 65 61 64 69 6e 67 20 74 68 65 20 63 6f 6e 74  reading the cont
23e30 65 6e 74 20 6f 66 20 70 61 67 65 20 6f 76 66 6c  ent of page ovfl
23e40 20 74 6f 20 64 6f 20 73 6f 2e 20 0a 2a 2a 0a 2a   to do so. .**.*
23e50 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
23e60 63 75 72 73 20 61 6e 20 53 51 4c 69 74 65 20 65  curs an SQLite e
23e70 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
23e80 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65  urned. Otherwise
23e90 3a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65  :.**.** The page
23ea0 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e   number of the n
23eb0 65 78 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  ext overflow pag
23ec0 65 20 69 6e 20 74 68 65 20 6c 69 6e 6b 65 64 20  e in the linked 
23ed0 6c 69 73 74 20 69 73 20 0a 2a 2a 20 77 72 69 74  list is .** writ
23ee0 74 65 6e 20 74 6f 20 2a 70 50 67 6e 6f 4e 65 78  ten to *pPgnoNex
23ef0 74 2e 20 49 66 20 70 61 67 65 20 6f 76 66 6c 20  t. If page ovfl 
23f00 69 73 20 74 68 65 20 6c 61 73 74 20 70 61 67 65  is the last page
23f10 20 69 6e 20 69 74 73 20 6c 69 6e 6b 65 64 20 0a   in its linked .
23f20 2a 2a 20 6c 69 73 74 2c 20 2a 70 50 67 6e 6f 4e  ** list, *pPgnoN
23f30 65 78 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65  ext is set to ze
23f40 72 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 70 70  ro. .**.** If pp
23f50 50 61 67 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  Page is not NULL
23f60 2c 20 61 6e 64 20 61 20 72 65 66 65 72 65 6e 63  , and a referenc
23f70 65 20 74 6f 20 74 68 65 20 4d 65 6d 50 61 67 65  e to the MemPage
23f80 20 6f 62 6a 65 63 74 20 63 6f 72 72 65 73 70 6f   object correspo
23f90 6e 64 69 6e 67 0a 2a 2a 20 74 6f 20 70 61 67 65  nding.** to page
23fa0 20 6e 75 6d 62 65 72 20 70 4f 76 66 6c 20 77 61   number pOvfl wa
23fb0 73 20 6f 62 74 61 69 6e 65 64 2c 20 74 68 65 6e  s obtained, then
23fc0 20 2a 70 70 50 61 67 65 20 69 73 20 73 65 74 20   *ppPage is set 
23fd0 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 61 74  to point to that
23fe0 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 2e 20 49  .** reference. I
23ff0 74 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73  t is the respons
24000 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63  ibility of the c
24010 61 6c 6c 65 72 20 74 6f 20 63 61 6c 6c 20 72 65  aller to call re
24020 6c 65 61 73 65 50 61 67 65 28 29 0a 2a 2a 20 6f  leasePage().** o
24030 6e 20 2a 70 70 50 61 67 65 20 74 6f 20 66 72 65  n *ppPage to fre
24040 65 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 2e  e the reference.
24050 20 49 6e 20 6e 6f 20 72 65 66 65 72 65 6e 63 65   In no reference
24060 20 77 61 73 20 6f 62 74 61 69 6e 65 64 20 28 62   was obtained (b
24070 65 63 61 75 73 65 0a 2a 2a 20 74 68 65 20 70 6f  ecause.** the po
24080 69 6e 74 65 72 2d 6d 61 70 20 77 61 73 20 75 73  inter-map was us
24090 65 64 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65  ed to obtain the
240a0 20 76 61 6c 75 65 20 66 6f 72 20 2a 70 50 67 6e   value for *pPgn
240b0 6f 4e 65 78 74 29 2c 20 74 68 65 6e 0a 2a 2a 20  oNext), then.** 
240c0 2a 70 70 50 61 67 65 20 69 73 20 73 65 74 20 74  *ppPage is set t
240d0 6f 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69  o zero..*/.stati
240e0 63 20 69 6e 74 20 67 65 74 4f 76 65 72 66 6c 6f  c int getOverflo
240f0 77 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65  wPage(.  BtShare
24100 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20  d *pBt,         
24110 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74        /* The dat
24120 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
24130 50 67 6e 6f 20 6f 76 66 6c 2c 20 20 20 20 20 20  Pgno ovfl,      
24140 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24150 43 75 72 72 65 6e 74 20 6f 76 65 72 66 6c 6f 77  Current overflow
24160 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a   page number */.
24170 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61    MemPage **ppPa
24180 67 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  ge,            /
24190 2a 20 4f 55 54 3a 20 4d 65 6d 50 61 67 65 20 68  * OUT: MemPage h
241a0 61 6e 64 6c 65 20 28 6d 61 79 20 62 65 20 4e 55  andle (may be NU
241b0 4c 4c 29 20 2a 2f 0a 20 20 50 67 6e 6f 20 2a 70  LL) */.  Pgno *p
241c0 50 67 6e 6f 4e 65 78 74 20 20 20 20 20 20 20 20  PgnoNext        
241d0 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4e 65        /* OUT: Ne
241e0 78 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  xt overflow page
241f0 20 6e 75 6d 62 65 72 20 2a 2f 0a 29 7b 0a 20 20   number */.){.  
24200 50 67 6e 6f 20 6e 65 78 74 20 3d 20 30 3b 0a 20  Pgno next = 0;. 
24210 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20   MemPage *pPage 
24220 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  = 0;.  int rc = 
24230 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73  SQLITE_OK;..  as
24240 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
24250 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
24260 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
24270 28 70 50 67 6e 6f 4e 65 78 74 29 3b 0a 0a 23 69  (pPgnoNext);..#i
24280 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
24290 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 2f  T_AUTOVACUUM.  /
242a0 2a 20 54 72 79 20 74 6f 20 66 69 6e 64 20 74 68  * Try to find th
242b0 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74  e next page in t
242c0 68 65 20 6f 76 65 72 66 6c 6f 77 20 6c 69 73 74  he overflow list
242d0 20 75 73 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20   using the.  ** 
242e0 61 75 74 6f 76 61 63 75 75 6d 20 70 6f 69 6e 74  autovacuum point
242f0 65 72 2d 6d 61 70 20 70 61 67 65 73 2e 20 47 75  er-map pages. Gu
24300 65 73 73 20 74 68 61 74 20 74 68 65 20 6e 65 78  ess that the nex
24310 74 20 70 61 67 65 20 69 6e 20 0a 20 20 2a 2a 20  t page in .  ** 
24320 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 6c 69 73  the overflow lis
24330 74 20 69 73 20 70 61 67 65 20 6e 75 6d 62 65 72  t is page number
24340 20 28 6f 76 66 6c 2b 31 29 2e 20 49 66 20 74 68   (ovfl+1). If th
24350 61 74 20 67 75 65 73 73 20 74 75 72 6e 73 20 0a  at guess turns .
24360 20 20 2a 2a 20 6f 75 74 20 74 6f 20 62 65 20 77    ** out to be w
24370 72 6f 6e 67 2c 20 66 61 6c 6c 20 62 61 63 6b 20  rong, fall back 
24380 74 6f 20 6c 6f 61 64 69 6e 67 20 74 68 65 20 64  to loading the d
24390 61 74 61 20 6f 66 20 70 61 67 65 20 0a 20 20 2a  ata of page .  *
243a0 2a 20 6e 75 6d 62 65 72 20 6f 76 66 6c 20 74 6f  * number ovfl to
243b0 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 6e   determine the n
243c0 65 78 74 20 70 61 67 65 20 6e 75 6d 62 65 72 2e  ext page number.
243d0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d  .  */.  if( pBt-
243e0 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20  >autoVacuum ){. 
243f0 20 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20     Pgno pgno;.  
24400 20 20 50 67 6e 6f 20 69 47 75 65 73 73 20 3d 20    Pgno iGuess = 
24410 6f 76 66 6c 2b 31 3b 0a 20 20 20 20 75 38 20 65  ovfl+1;.    u8 e
24420 54 79 70 65 3b 0a 0a 20 20 20 20 77 68 69 6c 65  Type;..    while
24430 28 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28  ( PTRMAP_ISPAGE(
24440 70 42 74 2c 20 69 47 75 65 73 73 29 20 7c 7c 20  pBt, iGuess) || 
24450 69 47 75 65 73 73 3d 3d 50 45 4e 44 49 4e 47 5f  iGuess==PENDING_
24460 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
24470 7b 0a 20 20 20 20 20 20 69 47 75 65 73 73 2b 2b  {.      iGuess++
24480 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
24490 20 69 47 75 65 73 73 3c 3d 62 74 72 65 65 50 61   iGuess<=btreePa
244a0 67 65 63 6f 75 6e 74 28 70 42 74 29 20 29 7b 0a  gecount(pBt) ){.
244b0 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61        rc = ptrma
244c0 70 47 65 74 28 70 42 74 2c 20 69 47 75 65 73 73  pGet(pBt, iGuess
244d0 2c 20 26 65 54 79 70 65 2c 20 26 70 67 6e 6f 29  , &eType, &pgno)
244e0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
244f0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 65 54 79  SQLITE_OK && eTy
24500 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46  pe==PTRMAP_OVERF
24510 4c 4f 57 32 20 26 26 20 70 67 6e 6f 3d 3d 6f 76  LOW2 && pgno==ov
24520 66 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 65  fl ){.        ne
24530 78 74 20 3d 20 69 47 75 65 73 73 3b 0a 20 20 20  xt = iGuess;.   
24540 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
24550 5f 44 4f 4e 45 3b 0a 20 20 20 20 20 20 7d 0a 20  _DONE;.      }. 
24560 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
24570 0a 20 20 61 73 73 65 72 74 28 20 6e 65 78 74 3d  .  assert( next=
24580 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45  =0 || rc==SQLITE
24590 5f 44 4f 4e 45 20 29 3b 0a 20 20 69 66 28 20 72  _DONE );.  if( r
245a0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
245b0 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65      rc = btreeGe
245c0 74 50 61 67 65 28 70 42 74 2c 20 6f 76 66 6c 2c  tPage(pBt, ovfl,
245d0 20 26 70 50 61 67 65 2c 20 28 70 70 50 61 67 65   &pPage, (ppPage
245e0 3d 3d 30 29 20 3f 20 50 41 47 45 52 5f 47 45 54  ==0) ? PAGER_GET
245f0 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 30 29 3b 0a  _READONLY : 0);.
24600 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d      assert( rc==
24610 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61  SQLITE_OK || pPa
24620 67 65 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  ge==0 );.    if(
24630 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
24640 7b 0a 20 20 20 20 20 20 6e 65 78 74 20 3d 20 67  {.      next = g
24650 65 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61  et4byte(pPage->a
24660 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Data);.    }.  }
24670 0a 0a 20 20 2a 70 50 67 6e 6f 4e 65 78 74 20 3d  ..  *pPgnoNext =
24680 20 6e 65 78 74 3b 0a 20 20 69 66 28 20 70 70 50   next;.  if( ppP
24690 61 67 65 20 29 7b 0a 20 20 20 20 2a 70 70 50 61  age ){.    *ppPa
246a0 67 65 20 3d 20 70 50 61 67 65 3b 0a 20 20 7d 65  ge = pPage;.  }e
246b0 6c 73 65 7b 0a 20 20 20 20 72 65 6c 65 61 73 65  lse{.    release
246c0 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 7d  Page(pPage);.  }
246d0 0a 20 20 72 65 74 75 72 6e 20 28 72 63 3d 3d 53  .  return (rc==S
246e0 51 4c 49 54 45 5f 44 4f 4e 45 20 3f 20 53 51 4c  QLITE_DONE ? SQL
246f0 49 54 45 5f 4f 4b 20 3a 20 72 63 29 3b 0a 7d 0a  ITE_OK : rc);.}.
24700 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20 64 61 74 61  ./*.** Copy data
24710 20 66 72 6f 6d 20 61 20 62 75 66 66 65 72 20 74   from a buffer t
24720 6f 20 61 20 70 61 67 65 2c 20 6f 72 20 66 72 6f  o a page, or fro
24730 6d 20 61 20 70 61 67 65 20 74 6f 20 61 20 62 75  m a page to a bu
24740 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 70 50 61 79  ffer..**.** pPay
24750 6c 6f 61 64 20 69 73 20 61 20 70 6f 69 6e 74 65  load is a pointe
24760 72 20 74 6f 20 64 61 74 61 20 73 74 6f 72 65 64  r to data stored
24770 20 6f 6e 20 64 61 74 61 62 61 73 65 20 70 61 67   on database pag
24780 65 20 70 44 62 50 61 67 65 2e 0a 2a 2a 20 49 66  e pDbPage..** If
24790 20 61 72 67 75 6d 65 6e 74 20 65 4f 70 20 69 73   argument eOp is
247a0 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 6e 42 79   false, then nBy
247b0 74 65 20 62 79 74 65 73 20 6f 66 20 64 61 74 61  te bytes of data
247c0 20 61 72 65 20 63 6f 70 69 65 64 0a 2a 2a 20 66   are copied.** f
247d0 72 6f 6d 20 70 50 61 79 6c 6f 61 64 20 74 6f 20  rom pPayload to 
247e0 74 68 65 20 62 75 66 66 65 72 20 70 6f 69 6e 74  the buffer point
247f0 65 64 20 61 74 20 62 79 20 70 42 75 66 2e 20 49  ed at by pBuf. I
24800 66 20 65 4f 70 20 69 73 20 74 72 75 65 2c 0a 2a  f eOp is true,.*
24810 2a 20 74 68 65 6e 20 73 71 6c 69 74 65 33 50 61  * then sqlite3Pa
24820 67 65 72 57 72 69 74 65 28 29 20 69 73 20 63 61  gerWrite() is ca
24830 6c 6c 65 64 20 6f 6e 20 70 44 62 50 61 67 65 20  lled on pDbPage 
24840 61 6e 64 20 6e 42 79 74 65 20 62 79 74 65 73 0a  and nByte bytes.
24850 2a 2a 20 6f 66 20 64 61 74 61 20 61 72 65 20 63  ** of data are c
24860 6f 70 69 65 64 20 66 72 6f 6d 20 74 68 65 20 62  opied from the b
24870 75 66 66 65 72 20 70 42 75 66 20 74 6f 20 70 50  uffer pBuf to pP
24880 61 79 6c 6f 61 64 2e 0a 2a 2a 0a 2a 2a 20 53 51  ayload..**.** SQ
24890 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
248a0 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73 2c 20  ned on success, 
248b0 6f 74 68 65 72 77 69 73 65 20 61 6e 20 65 72 72  otherwise an err
248c0 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74  or code..*/.stat
248d0 69 63 20 69 6e 74 20 63 6f 70 79 50 61 79 6c 6f  ic int copyPaylo
248e0 61 64 28 0a 20 20 76 6f 69 64 20 2a 70 50 61 79  ad(.  void *pPay
248f0 6c 6f 61 64 2c 20 20 20 20 20 20 20 20 20 20 20  load,           
24900 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 70 61  /* Pointer to pa
24910 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 76 6f 69  ge data */.  voi
24920 64 20 2a 70 42 75 66 2c 20 20 20 20 20 20 20 20  d *pBuf,        
24930 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
24940 72 20 74 6f 20 62 75 66 66 65 72 20 2a 2f 0a 20  r to buffer */. 
24950 20 69 6e 74 20 6e 42 79 74 65 2c 20 20 20 20 20   int nByte,     
24960 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
24970 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f  mber of bytes to
24980 20 63 6f 70 79 20 2a 2f 0a 20 20 69 6e 74 20 65   copy */.  int e
24990 4f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  Op,             
249a0 20 20 20 20 20 2f 2a 20 30 20 2d 3e 20 63 6f 70       /* 0 -> cop
249b0 79 20 66 72 6f 6d 20 70 61 67 65 2c 20 31 20 2d  y from page, 1 -
249c0 3e 20 63 6f 70 79 20 74 6f 20 70 61 67 65 20 2a  > copy to page *
249d0 2f 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62 50  /.  DbPage *pDbP
249e0 61 67 65 20 20 20 20 20 20 20 20 20 20 20 2f 2a  age           /*
249f0 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67   Page containing
24a00 20 70 50 61 79 6c 6f 61 64 20 2a 2f 0a 29 7b 0a   pPayload */.){.
24a10 20 20 69 66 28 20 65 4f 70 20 29 7b 0a 20 20 20    if( eOp ){.   
24a20 20 2f 2a 20 43 6f 70 79 20 64 61 74 61 20 66 72   /* Copy data fr
24a30 6f 6d 20 62 75 66 66 65 72 20 74 6f 20 70 61 67  om buffer to pag
24a40 65 20 28 61 20 77 72 69 74 65 20 6f 70 65 72 61  e (a write opera
24a50 74 69 6f 6e 29 20 2a 2f 0a 20 20 20 20 69 6e 74  tion) */.    int
24a60 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
24a70 65 72 57 72 69 74 65 28 70 44 62 50 61 67 65 29  erWrite(pDbPage)
24a80 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
24a90 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
24aa0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
24ab0 7d 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61  }.    memcpy(pPa
24ac0 79 6c 6f 61 64 2c 20 70 42 75 66 2c 20 6e 42 79  yload, pBuf, nBy
24ad0 74 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  te);.  }else{.  
24ae0 20 20 2f 2a 20 43 6f 70 79 20 64 61 74 61 20 66    /* Copy data f
24af0 72 6f 6d 20 70 61 67 65 20 74 6f 20 62 75 66 66  rom page to buff
24b00 65 72 20 28 61 20 72 65 61 64 20 6f 70 65 72 61  er (a read opera
24b10 74 69 6f 6e 29 20 2a 2f 0a 20 20 20 20 6d 65 6d  tion) */.    mem
24b20 63 70 79 28 70 42 75 66 2c 20 70 50 61 79 6c 6f  cpy(pBuf, pPaylo
24b30 61 64 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d 0a  ad, nByte);.  }.
24b40 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
24b50 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  OK;.}../*.** Thi
24b60 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73  s function is us
24b70 65 64 20 74 6f 20 72 65 61 64 20 6f 72 20 6f 76  ed to read or ov
24b80 65 72 77 72 69 74 65 20 70 61 79 6c 6f 61 64 20  erwrite payload 
24b90 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 66  information.** f
24ba0 6f 72 20 74 68 65 20 65 6e 74 72 79 20 74 68 61  or the entry tha
24bb0 74 20 74 68 65 20 70 43 75 72 20 63 75 72 73 6f  t the pCur curso
24bc0 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f  r is pointing to
24bd0 2e 20 54 68 65 20 65 4f 70 0a 2a 2a 20 61 72 67  . The eOp.** arg
24be0 75 6d 65 6e 74 20 69 73 20 69 6e 74 65 72 70 72  ument is interpr
24bf0 65 74 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  eted as follows:
24c00 0a 2a 2a 0a 2a 2a 20 20 20 30 3a 20 54 68 65 20  .**.**   0: The 
24c10 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 61 20 72  operation is a r
24c20 65 61 64 2e 20 50 6f 70 75 6c 61 74 65 20 74 68  ead. Populate th
24c30 65 20 6f 76 65 72 66 6c 6f 77 20 63 61 63 68 65  e overflow cache
24c40 2e 0a 2a 2a 20 20 20 31 3a 20 54 68 65 20 6f 70  ..**   1: The op
24c50 65 72 61 74 69 6f 6e 20 69 73 20 61 20 77 72 69  eration is a wri
24c60 74 65 2e 20 50 6f 70 75 6c 61 74 65 20 74 68 65  te. Populate the
24c70 20 6f 76 65 72 66 6c 6f 77 20 63 61 63 68 65 2e   overflow cache.
24c80 0a 2a 2a 20 20 20 32 3a 20 54 68 65 20 6f 70 65  .**   2: The ope
24c90 72 61 74 69 6f 6e 20 69 73 20 61 20 72 65 61 64  ration is a read
24ca0 2e 20 44 6f 20 6e 6f 74 20 70 6f 70 75 6c 61 74  . Do not populat
24cb0 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63  e the overflow c
24cc0 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 6f  ache..**.** A to
24cd0 74 61 6c 20 6f 66 20 22 61 6d 74 22 20 62 79 74  tal of "amt" byt
24ce0 65 73 20 61 72 65 20 72 65 61 64 20 6f 72 20 77  es are read or w
24cf0 72 69 74 74 65 6e 20 62 65 67 69 6e 6e 69 6e 67  ritten beginning
24d00 20 61 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a 2a   at "offset"..**
24d10 20 44 61 74 61 20 69 73 20 72 65 61 64 20 74 6f   Data is read to
24d20 20 6f 72 20 66 72 6f 6d 20 74 68 65 20 62 75 66   or from the buf
24d30 66 65 72 20 70 42 75 66 2e 0a 2a 2a 0a 2a 2a 20  fer pBuf..**.** 
24d40 54 68 65 20 63 6f 6e 74 65 6e 74 20 62 65 69 6e  The content bein
24d50 67 20 72 65 61 64 20 6f 72 20 77 72 69 74 74 65  g read or writte
24d60 6e 20 6d 69 67 68 74 20 61 70 70 65 61 72 20 6f  n might appear o
24d70 6e 20 74 68 65 20 6d 61 69 6e 20 70 61 67 65 0a  n the main page.
24d80 2a 2a 20 6f 72 20 62 65 20 73 63 61 74 74 65 72  ** or be scatter
24d90 65 64 20 6f 75 74 20 6f 6e 20 6d 75 6c 74 69 70  ed out on multip
24da0 6c 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  le overflow page
24db0 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  s..**.** If the 
24dc0 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20 65  current cursor e
24dd0 6e 74 72 79 20 75 73 65 73 20 6f 6e 65 20 6f 72  ntry uses one or
24de0 20 6d 6f 72 65 20 6f 76 65 72 66 6c 6f 77 20 70   more overflow p
24df0 61 67 65 73 20 61 6e 64 20 74 68 65 0a 2a 2a 20  ages and the.** 
24e00 65 4f 70 20 61 72 67 75 6d 65 6e 74 20 69 73 20  eOp argument is 
24e10 6e 6f 74 20 32 2c 20 74 68 69 73 20 66 75 6e 63  not 2, this func
24e20 74 69 6f 6e 20 6d 61 79 20 61 6c 6c 6f 63 61 74  tion may allocat
24e30 65 20 73 70 61 63 65 20 66 6f 72 20 61 6e 64 20  e space for and 
24e40 6c 61 7a 69 6c 79 20 0a 2a 2a 20 70 6f 70 75 6c  lazily .** popul
24e50 61 74 65 73 20 74 68 65 20 6f 76 65 72 66 6c 6f  ates the overflo
24e60 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68  w page-list cach
24e70 65 20 61 72 72 61 79 20 28 42 74 43 75 72 73 6f  e array (BtCurso
24e80 72 2e 61 4f 76 65 72 66 6c 6f 77 29 2e 20 0a 2a  r.aOverflow). .*
24e90 2a 20 53 75 62 73 65 71 75 65 6e 74 20 63 61 6c  * Subsequent cal
24ea0 6c 73 20 75 73 65 20 74 68 69 73 20 63 61 63 68  ls use this cach
24eb0 65 20 74 6f 20 6d 61 6b 65 20 73 65 65 6b 69 6e  e to make seekin
24ec0 67 20 74 6f 20 74 68 65 20 73 75 70 70 6c 69 65  g to the supplie
24ed0 64 20 6f 66 66 73 65 74 20 0a 2a 2a 20 6d 6f 72  d offset .** mor
24ee0 65 20 65 66 66 69 63 69 65 6e 74 2e 0a 2a 2a 0a  e efficient..**.
24ef0 2a 2a 20 4f 6e 63 65 20 61 6e 20 6f 76 65 72 66  ** Once an overf
24f00 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61  low page-list ca
24f10 63 68 65 20 68 61 73 20 62 65 65 6e 20 61 6c 6c  che has been all
24f20 6f 63 61 74 65 64 2c 20 69 74 20 6d 61 79 20 62  ocated, it may b
24f30 65 0a 2a 2a 20 69 6e 76 61 6c 69 64 61 74 65 64  e.** invalidated
24f40 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 63   if some other c
24f50 75 72 73 6f 72 20 77 72 69 74 65 73 20 74 6f 20  ursor writes to 
24f60 74 68 65 20 73 61 6d 65 20 74 61 62 6c 65 2c 20  the same table, 
24f70 6f 72 20 69 66 0a 2a 2a 20 74 68 65 20 63 75 72  or if.** the cur
24f80 73 6f 72 20 69 73 20 6d 6f 76 65 64 20 74 6f 20  sor is moved to 
24f90 61 20 64 69 66 66 65 72 65 6e 74 20 72 6f 77 2e  a different row.
24fa0 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 69   Additionally, i
24fb0 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 0a 2a 2a  n auto-vacuum.**
24fc0 20 6d 6f 64 65 2c 20 74 68 65 20 66 6f 6c 6c 6f   mode, the follo
24fd0 77 69 6e 67 20 65 76 65 6e 74 73 20 6d 61 79 20  wing events may 
24fe0 69 6e 76 61 6c 69 64 61 74 65 20 61 6e 20 6f 76  invalidate an ov
24ff0 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74  erflow page-list
25000 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 20 20   cache..**.**   
25010 2a 20 41 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c  * An incremental
25020 20 76 61 63 75 75 6d 2c 0a 2a 2a 20 20 20 2a 20   vacuum,.**   * 
25030 41 20 63 6f 6d 6d 69 74 20 69 6e 20 61 75 74 6f  A commit in auto
25040 5f 76 61 63 75 75 6d 3d 22 66 75 6c 6c 22 20 6d  _vacuum="full" m
25050 6f 64 65 2c 0a 2a 2a 20 20 20 2a 20 43 72 65 61  ode,.**   * Crea
25060 74 69 6e 67 20 61 20 74 61 62 6c 65 20 28 6d 61  ting a table (ma
25070 79 20 72 65 71 75 69 72 65 20 6d 6f 76 69 6e 67  y require moving
25080 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
25090 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  e)..*/.static in
250a0 74 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28  t accessPayload(
250b0 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
250c0 72 2c 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f  r,      /* Curso
250d0 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 65 6e  r pointing to en
250e0 74 72 79 20 74 6f 20 72 65 61 64 20 66 72 6f 6d  try to read from
250f0 20 2a 2f 0a 20 20 75 33 32 20 6f 66 66 73 65 74   */.  u32 offset
25100 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65  ,          /* Be
25110 67 69 6e 20 72 65 61 64 69 6e 67 20 74 68 69 73  gin reading this
25120 20 66 61 72 20 69 6e 74 6f 20 70 61 79 6c 6f 61   far into payloa
25130 64 20 2a 2f 0a 20 20 75 33 32 20 61 6d 74 2c 20  d */.  u32 amt, 
25140 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
25150 65 61 64 20 74 68 69 73 20 6d 61 6e 79 20 62 79  ead this many by
25160 74 65 73 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  tes */.  unsigne
25170 64 20 63 68 61 72 20 2a 70 42 75 66 2c 20 2f 2a  d char *pBuf, /*
25180 20 57 72 69 74 65 20 74 68 65 20 62 79 74 65 73   Write the bytes
25190 20 69 6e 74 6f 20 74 68 69 73 20 62 75 66 66 65   into this buffe
251a0 72 20 2a 2f 20 0a 20 20 69 6e 74 20 65 4f 70 20  r */ .  int eOp 
251b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
251c0 7a 65 72 6f 20 74 6f 20 72 65 61 64 2e 20 6e 6f  zero to read. no
251d0 6e 2d 7a 65 72 6f 20 74 6f 20 77 72 69 74 65 2e  n-zero to write.
251e0 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65   */.){.  unsigne
251f0 64 20 63 68 61 72 20 2a 61 50 61 79 6c 6f 61 64  d char *aPayload
25200 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
25210 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 49  ITE_OK;.  int iI
25220 64 78 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67  dx = 0;.  MemPag
25230 65 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72 2d  e *pPage = pCur-
25240 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
25250 61 67 65 5d 3b 20 2f 2a 20 42 74 72 65 65 20 70  age]; /* Btree p
25260 61 67 65 20 6f 66 20 63 75 72 72 65 6e 74 20 65  age of current e
25270 6e 74 72 79 20 2a 2f 0a 20 20 42 74 53 68 61 72  ntry */.  BtShar
25280 65 64 20 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e  ed *pBt = pCur->
25290 70 42 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  pBt;            
252a0 20 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20 74        /* Btree t
252b0 68 69 73 20 63 75 72 73 6f 72 20 62 65 6c 6f 6e  his cursor belon
252c0 67 73 20 74 6f 20 2a 2f 0a 23 69 66 64 65 66 20  gs to */.#ifdef 
252d0 53 51 4c 49 54 45 5f 44 49 52 45 43 54 5f 4f 56  SQLITE_DIRECT_OV
252e0 45 52 46 4c 4f 57 5f 52 45 41 44 0a 20 20 75 6e  ERFLOW_READ.  un
252f0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 20 63 6f  signed char * co
25300 6e 73 74 20 70 42 75 66 53 74 61 72 74 20 3d 20  nst pBufStart = 
25310 70 42 75 66 3b 0a 20 20 69 6e 74 20 62 45 6e 64  pBuf;.  int bEnd
25320 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
25330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25340 20 20 2f 2a 20 54 72 75 65 20 69 66 20 72 65 61    /* True if rea
25350 64 69 6e 67 20 74 6f 20 65 6e 64 20 6f 66 20 64  ding to end of d
25360 61 74 61 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20  ata */.#endif.. 
25370 20 61 73 73 65 72 74 28 20 70 50 61 67 65 20 29   assert( pPage )
25380 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
25390 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
253a0 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65  _VALID );.  asse
253b0 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  rt( pCur->aiIdx[
253c0 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 50 61  pCur->iPage]<pPa
253d0 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61  ge->nCell );.  a
253e0 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
253f0 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
25400 0a 20 20 61 73 73 65 72 74 28 20 65 4f 70 21 3d  .  assert( eOp!=
25410 32 20 7c 7c 20 6f 66 66 73 65 74 3d 3d 30 20 29  2 || offset==0 )
25420 3b 20 20 20 20 2f 2a 20 41 6c 77 61 79 73 20 73  ;    /* Always s
25430 74 61 72 74 20 66 72 6f 6d 20 62 65 67 69 6e 6e  tart from beginn
25440 69 6e 67 20 66 6f 72 20 65 4f 70 3d 3d 32 20 2a  ing for eOp==2 *
25450 2f 0a 0a 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f  /..  getCellInfo
25460 28 70 43 75 72 29 3b 0a 20 20 61 50 61 79 6c 6f  (pCur);.  aPaylo
25470 61 64 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  ad = pCur->info.
25480 70 50 61 79 6c 6f 61 64 3b 0a 23 69 66 64 65 66  pPayload;.#ifdef
25490 20 53 51 4c 49 54 45 5f 44 49 52 45 43 54 5f 4f   SQLITE_DIRECT_O
254a0 56 45 52 46 4c 4f 57 5f 52 45 41 44 0a 20 20 62  VERFLOW_READ.  b
254b0 45 6e 64 20 3d 20 6f 66 66 73 65 74 2b 61 6d 74  End = offset+amt
254c0 3d 3d 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50 61  ==pCur->info.nPa
254d0 79 6c 6f 61 64 3b 0a 23 65 6e 64 69 66 0a 20 20  yload;.#endif.  
254e0 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 2b 61  assert( offset+a
254f0 6d 74 20 3c 3d 20 70 43 75 72 2d 3e 69 6e 66 6f  mt <= pCur->info
25500 2e 6e 50 61 79 6c 6f 61 64 20 29 3b 0a 0a 20 20  .nPayload );..  
25510 69 66 28 20 26 61 50 61 79 6c 6f 61 64 5b 70 43  if( &aPayload[pC
25520 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d  ur->info.nLocal]
25530 20 3e 20 26 70 50 61 67 65 2d 3e 61 44 61 74 61   > &pPage->aData
25540 5b 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  [pBt->usableSize
25550 5d 20 29 7b 0a 20 20 20 20 2f 2a 20 54 72 79 69  ] ){.    /* Tryi
25560 6e 67 20 74 6f 20 72 65 61 64 20 6f 72 20 77 72  ng to read or wr
25570 69 74 65 20 70 61 73 74 20 74 68 65 20 65 6e 64  ite past the end
25580 20 6f 66 20 74 68 65 20 64 61 74 61 20 69 73 20   of the data is 
25590 61 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20  an error */.    
255a0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
255b0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
255c0 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 64  .  /* Check if d
255d0 61 74 61 20 6d 75 73 74 20 62 65 20 72 65 61 64  ata must be read
255e0 2f 77 72 69 74 74 65 6e 20 74 6f 2f 66 72 6f 6d  /written to/from
255f0 20 74 68 65 20 62 74 72 65 65 20 70 61 67 65 20   the btree page 
25600 69 74 73 65 6c 66 2e 20 2a 2f 0a 20 20 69 66 28  itself. */.  if(
25610 20 6f 66 66 73 65 74 3c 70 43 75 72 2d 3e 69 6e   offset<pCur->in
25620 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20  fo.nLocal ){.   
25630 20 69 6e 74 20 61 20 3d 20 61 6d 74 3b 0a 20 20   int a = amt;.  
25640 20 20 69 66 28 20 61 2b 6f 66 66 73 65 74 3e 70    if( a+offset>p
25650 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  Cur->info.nLocal
25660 20 29 7b 0a 20 20 20 20 20 20 61 20 3d 20 70 43   ){.      a = pC
25670 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20  ur->info.nLocal 
25680 2d 20 6f 66 66 73 65 74 3b 0a 20 20 20 20 7d 0a  - offset;.    }.
25690 20 20 20 20 72 63 20 3d 20 63 6f 70 79 50 61 79      rc = copyPay
256a0 6c 6f 61 64 28 26 61 50 61 79 6c 6f 61 64 5b 6f  load(&aPayload[o
256b0 66 66 73 65 74 5d 2c 20 70 42 75 66 2c 20 61 2c  ffset], pBuf, a,
256c0 20 28 65 4f 70 20 26 20 30 78 30 31 29 2c 20 70   (eOp & 0x01), p
256d0 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Page->pDbPage);.
256e0 20 20 20 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a      offset = 0;.
256f0 20 20 20 20 70 42 75 66 20 2b 3d 20 61 3b 0a 20      pBuf += a;. 
25700 20 20 20 61 6d 74 20 2d 3d 20 61 3b 0a 20 20 7d     amt -= a;.  }
25710 65 6c 73 65 7b 0a 20 20 20 20 6f 66 66 73 65 74  else{.    offset
25720 20 2d 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e   -= pCur->info.n
25730 4c 6f 63 61 6c 3b 0a 20 20 7d 0a 0a 0a 20 20 69  Local;.  }...  i
25740 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
25750 20 26 26 20 61 6d 74 3e 30 20 29 7b 0a 20 20 20   && amt>0 ){.   
25760 20 63 6f 6e 73 74 20 75 33 32 20 6f 76 66 6c 53   const u32 ovflS
25770 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c  ize = pBt->usabl
25780 65 53 69 7a 65 20 2d 20 34 3b 20 20 2f 2a 20 42  eSize - 4;  /* B
25790 79 74 65 73 20 63 6f 6e 74 65 6e 74 20 70 65 72  ytes content per
257a0 20 6f 76 66 6c 20 70 61 67 65 20 2a 2f 0a 20 20   ovfl page */.  
257b0 20 20 50 67 6e 6f 20 6e 65 78 74 50 61 67 65 3b    Pgno nextPage;
257c0 0a 0a 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d  ..    nextPage =
257d0 20 67 65 74 34 62 79 74 65 28 26 61 50 61 79 6c   get4byte(&aPayl
257e0 6f 61 64 5b 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  oad[pCur->info.n
257f0 4c 6f 63 61 6c 5d 29 3b 0a 0a 20 20 20 20 2f 2a  Local]);..    /*
25800 20 49 66 20 74 68 65 20 42 74 43 75 72 73 6f 72   If the BtCursor
25810 2e 61 4f 76 65 72 66 6c 6f 77 5b 5d 20 68 61 73  .aOverflow[] has
25820 20 6e 6f 74 20 62 65 65 6e 20 61 6c 6c 6f 63 61   not been alloca
25830 74 65 64 2c 20 61 6c 6c 6f 63 61 74 65 20 69 74  ted, allocate it
25840 20 6e 6f 77 2e 0a 20 20 20 20 2a 2a 20 45 78 63   now..    ** Exc
25850 65 70 74 2c 20 64 6f 20 6e 6f 74 20 61 6c 6c 6f  ept, do not allo
25860 63 61 74 65 20 61 4f 76 65 72 66 6c 6f 77 5b 5d  cate aOverflow[]
25870 20 66 6f 72 20 65 4f 70 3d 3d 32 2e 0a 20 20 20   for eOp==2..   
25880 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 61   **.    ** The a
25890 4f 76 65 72 66 6c 6f 77 5b 5d 20 61 72 72 61 79  Overflow[] array
258a0 20 69 73 20 73 69 7a 65 64 20 61 74 20 6f 6e 65   is sized at one
258b0 20 65 6e 74 72 79 20 66 6f 72 20 65 61 63 68 20   entry for each 
258c0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 0a 20 20  overflow page.  
258d0 20 20 2a 2a 20 69 6e 20 74 68 65 20 6f 76 65 72    ** in the over
258e0 66 6c 6f 77 20 63 68 61 69 6e 2e 20 54 68 65 20  flow chain. The 
258f0 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  page number of t
25900 68 65 20 66 69 72 73 74 20 6f 76 65 72 66 6c 6f  he first overflo
25910 77 20 70 61 67 65 20 69 73 0a 20 20 20 20 2a 2a  w page is.    **
25920 20 73 74 6f 72 65 64 20 69 6e 20 61 4f 76 65 72   stored in aOver
25930 66 6c 6f 77 5b 30 5d 2c 20 65 74 63 2e 20 41 20  flow[0], etc. A 
25940 76 61 6c 75 65 20 6f 66 20 30 20 69 6e 20 74 68  value of 0 in th
25950 65 20 61 4f 76 65 72 66 6c 6f 77 5b 5d 20 61 72  e aOverflow[] ar
25960 72 61 79 0a 20 20 20 20 2a 2a 20 6d 65 61 6e 73  ray.    ** means
25970 20 22 6e 6f 74 20 79 65 74 20 6b 6e 6f 77 6e 22   "not yet known"
25980 20 28 74 68 65 20 63 61 63 68 65 20 69 73 20 6c   (the cache is l
25990 61 7a 69 6c 79 20 70 6f 70 75 6c 61 74 65 64 29  azily populated)
259a0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
259b0 20 65 4f 70 21 3d 32 20 26 26 20 28 70 43 75 72   eOp!=2 && (pCur
259c0 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43  ->curFlags & BTC
259d0 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3d 3d 30 20  F_ValidOvfl)==0 
259e0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4f 76  ){.      int nOv
259f0 66 6c 20 3d 20 28 70 43 75 72 2d 3e 69 6e 66 6f  fl = (pCur->info
25a00 2e 6e 50 61 79 6c 6f 61 64 2d 70 43 75 72 2d 3e  .nPayload-pCur->
25a10 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 2b 6f 76 66 6c  info.nLocal+ovfl
25a20 53 69 7a 65 2d 31 29 2f 6f 76 66 6c 53 69 7a 65  Size-1)/ovflSize
25a30 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 4f 76 66  ;.      if( nOvf
25a40 6c 3e 70 43 75 72 2d 3e 6e 4f 76 66 6c 41 6c 6c  l>pCur->nOvflAll
25a50 6f 63 20 29 7b 0a 20 20 20 20 20 20 20 20 50 67  oc ){.        Pg
25a60 6e 6f 20 2a 61 4e 65 77 20 3d 20 28 50 67 6e 6f  no *aNew = (Pgno
25a70 2a 29 73 71 6c 69 74 65 33 52 65 61 6c 6c 6f 63  *)sqlite3Realloc
25a80 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 43  (.            pC
25a90 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 2c 20 6e  ur->aOverflow, n
25aa0 4f 76 66 6c 2a 32 2a 73 69 7a 65 6f 66 28 50 67  Ovfl*2*sizeof(Pg
25ab0 6e 6f 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20  no).        );. 
25ac0 20 20 20 20 20 20 20 69 66 28 20 61 4e 65 77 3d         if( aNew=
25ad0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
25ae0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
25af0 4d 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  M;.        }else
25b00 7b 0a 20 20 20 20 20 20 20 20 20 20 70 43 75 72  {.          pCur
25b10 2d 3e 6e 4f 76 66 6c 41 6c 6c 6f 63 20 3d 20 6e  ->nOvflAlloc = n
25b20 4f 76 66 6c 2a 32 3b 0a 20 20 20 20 20 20 20 20  Ovfl*2;.        
25b30 20 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f    pCur->aOverflo
25b40 77 20 3d 20 61 4e 65 77 3b 0a 20 20 20 20 20 20  w = aNew;.      
25b50 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
25b60 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
25b70 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 6d  _OK ){.        m
25b80 65 6d 73 65 74 28 70 43 75 72 2d 3e 61 4f 76 65  emset(pCur->aOve
25b90 72 66 6c 6f 77 2c 20 30 2c 20 6e 4f 76 66 6c 2a  rflow, 0, nOvfl*
25ba0 73 69 7a 65 6f 66 28 50 67 6e 6f 29 29 3b 0a 20  sizeof(Pgno));. 
25bb0 20 20 20 20 20 20 20 70 43 75 72 2d 3e 63 75 72         pCur->cur
25bc0 46 6c 61 67 73 20 7c 3d 20 42 54 43 46 5f 56 61  Flags |= BTCF_Va
25bd0 6c 69 64 4f 76 66 6c 3b 0a 20 20 20 20 20 20 7d  lidOvfl;.      }
25be0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
25bf0 66 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70  f the overflow p
25c00 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 20 68  age-list cache h
25c10 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65  as been allocate
25c20 64 20 61 6e 64 20 74 68 65 0a 20 20 20 20 2a 2a  d and the.    **
25c30 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 66   entry for the f
25c40 69 72 73 74 20 72 65 71 75 69 72 65 64 20 6f 76  irst required ov
25c50 65 72 66 6c 6f 77 20 70 61 67 65 20 69 73 20 76  erflow page is v
25c60 61 6c 69 64 2c 20 73 6b 69 70 0a 20 20 20 20 2a  alid, skip.    *
25c70 2a 20 64 69 72 65 63 74 6c 79 20 74 6f 20 69 74  * directly to it
25c80 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
25c90 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73   (pCur->curFlags
25ca0 20 26 20 42 54 43 46 5f 56 61 6c 69 64 4f 76 66   & BTCF_ValidOvf
25cb0 6c 29 21 3d 30 0a 20 20 20 20 20 26 26 20 70 43  l)!=0.     && pC
25cc0 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 6f 66  ur->aOverflow[of
25cd0 66 73 65 74 2f 6f 76 66 6c 53 69 7a 65 5d 0a 20  fset/ovflSize]. 
25ce0 20 20 20 29 7b 0a 20 20 20 20 20 20 69 49 64 78     ){.      iIdx
25cf0 20 3d 20 28 6f 66 66 73 65 74 2f 6f 76 66 6c 53   = (offset/ovflS
25d00 69 7a 65 29 3b 0a 20 20 20 20 20 20 6e 65 78 74  ize);.      next
25d10 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 4f 76  Page = pCur->aOv
25d20 65 72 66 6c 6f 77 5b 69 49 64 78 5d 3b 0a 20 20  erflow[iIdx];.  
25d30 20 20 20 20 6f 66 66 73 65 74 20 3d 20 28 6f 66      offset = (of
25d40 66 73 65 74 25 6f 76 66 6c 53 69 7a 65 29 3b 0a  fset%ovflSize);.
25d50 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28 20      }..    for( 
25d60 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ; rc==SQLITE_OK 
25d70 26 26 20 61 6d 74 3e 30 20 26 26 20 6e 65 78 74  && amt>0 && next
25d80 50 61 67 65 3b 20 69 49 64 78 2b 2b 29 7b 0a 0a  Page; iIdx++){..
25d90 20 20 20 20 20 20 2f 2a 20 49 66 20 72 65 71 75        /* If requ
25da0 69 72 65 64 2c 20 70 6f 70 75 6c 61 74 65 20 74  ired, populate t
25db0 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  he overflow page
25dc0 2d 6c 69 73 74 20 63 61 63 68 65 2e 20 2a 2f 0a  -list cache. */.
25dd0 20 20 20 20 20 20 69 66 28 20 28 70 43 75 72 2d        if( (pCur-
25de0 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46  >curFlags & BTCF
25df0 5f 56 61 6c 69 64 4f 76 66 6c 29 21 3d 30 20 29  _ValidOvfl)!=0 )
25e00 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
25e10 28 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f  ( pCur->aOverflo
25e20 77 5b 69 49 64 78 5d 3d 3d 30 0a 20 20 20 20 20  w[iIdx]==0.     
25e30 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 43             || pC
25e40 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49  ur->aOverflow[iI
25e50 64 78 5d 3d 3d 6e 65 78 74 50 61 67 65 0a 20 20  dx]==nextPage.  
25e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c                ||
25e70 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20   CORRUPT_DB );. 
25e80 20 20 20 20 20 20 20 70 43 75 72 2d 3e 61 4f 76         pCur->aOv
25e90 65 72 66 6c 6f 77 5b 69 49 64 78 5d 20 3d 20 6e  erflow[iIdx] = n
25ea0 65 78 74 50 61 67 65 3b 0a 20 20 20 20 20 20 7d  extPage;.      }
25eb0 0a 0a 20 20 20 20 20 20 69 66 28 20 6f 66 66 73  ..      if( offs
25ec0 65 74 3e 3d 6f 76 66 6c 53 69 7a 65 20 29 7b 0a  et>=ovflSize ){.
25ed0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f          /* The o
25ee0 6e 6c 79 20 72 65 61 73 6f 6e 20 74 6f 20 72 65  nly reason to re
25ef0 61 64 20 74 68 69 73 20 70 61 67 65 20 69 73 20  ad this page is 
25f00 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 70 61  to obtain the pa
25f10 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 75  ge.        ** nu
25f20 6d 62 65 72 20 66 6f 72 20 74 68 65 20 6e 65 78  mber for the nex
25f30 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 6f 76  t page in the ov
25f40 65 72 66 6c 6f 77 20 63 68 61 69 6e 2e 20 54 68  erflow chain. Th
25f50 65 20 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a  e page.        *
25f60 2a 20 64 61 74 61 20 69 73 20 6e 6f 74 20 72 65  * data is not re
25f70 71 75 69 72 65 64 2e 20 53 6f 20 66 69 72 73 74  quired. So first
25f80 20 74 72 79 20 74 6f 20 6c 6f 6f 6b 75 70 20 74   try to lookup t
25f90 68 65 20 6f 76 65 72 66 6c 6f 77 0a 20 20 20 20  he overflow.    
25fa0 20 20 20 20 2a 2a 20 70 61 67 65 2d 6c 69 73 74      ** page-list
25fb0 20 63 61 63 68 65 2c 20 69 66 20 61 6e 79 2c 20   cache, if any, 
25fc0 74 68 65 6e 20 66 61 6c 6c 20 62 61 63 6b 20 74  then fall back t
25fd0 6f 20 74 68 65 20 67 65 74 4f 76 65 72 66 6c 6f  o the getOverflo
25fe0 77 50 61 67 65 28 29 0a 20 20 20 20 20 20 20 20  wPage().        
25ff0 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 20  ** function..   
26000 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
26010 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65  ** Note that the
26020 20 61 4f 76 65 72 66 6c 6f 77 5b 5d 20 61 72 72   aOverflow[] arr
26030 61 79 20 6d 75 73 74 20 62 65 20 61 6c 6c 6f 63  ay must be alloc
26040 61 74 65 64 20 62 65 63 61 75 73 65 20 65 4f 70  ated because eOp
26050 21 3d 32 0a 20 20 20 20 20 20 20 20 2a 2a 20 68  !=2.        ** h
26060 65 72 65 2e 20 20 49 66 20 65 4f 70 3d 3d 32 2c  ere.  If eOp==2,
26070 20 74 68 65 6e 20 6f 66 66 73 65 74 3d 3d 30 20   then offset==0 
26080 61 6e 64 20 74 68 69 73 20 62 72 61 6e 63 68 20  and this branch 
26090 69 73 20 6e 65 76 65 72 20 74 61 6b 65 6e 2e 0a  is never taken..
260a0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
260b0 20 20 20 61 73 73 65 72 74 28 20 65 4f 70 21 3d     assert( eOp!=
260c0 32 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  2 );.        ass
260d0 65 72 74 28 20 70 43 75 72 2d 3e 63 75 72 46 6c  ert( pCur->curFl
260e0 61 67 73 20 26 20 42 54 43 46 5f 56 61 6c 69 64  ags & BTCF_Valid
260f0 4f 76 66 6c 20 29 3b 0a 20 20 20 20 20 20 20 20  Ovfl );.        
26100 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 42  assert( pCur->pB
26110 74 72 65 65 2d 3e 64 62 3d 3d 70 42 74 2d 3e 64  tree->db==pBt->d
26120 62 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  b );.        if(
26130 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77   pCur->aOverflow
26140 5b 69 49 64 78 2b 31 5d 20 29 7b 0a 20 20 20 20  [iIdx+1] ){.    
26150 20 20 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d        nextPage =
26160 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77   pCur->aOverflow
26170 5b 69 49 64 78 2b 31 5d 3b 0a 20 20 20 20 20 20  [iIdx+1];.      
26180 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
26190 20 20 20 72 63 20 3d 20 67 65 74 4f 76 65 72 66     rc = getOverf
261a0 6c 6f 77 50 61 67 65 28 70 42 74 2c 20 6e 65 78  lowPage(pBt, nex
261b0 74 50 61 67 65 2c 20 30 2c 20 26 6e 65 78 74 50  tPage, 0, &nextP
261c0 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  age);.        }.
261d0 20 20 20 20 20 20 20 20 6f 66 66 73 65 74 20 2d          offset -
261e0 3d 20 6f 76 66 6c 53 69 7a 65 3b 0a 20 20 20 20  = ovflSize;.    
261f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
26200 20 2f 2a 20 4e 65 65 64 20 74 6f 20 72 65 61 64   /* Need to read
26210 20 74 68 69 73 20 70 61 67 65 20 70 72 6f 70 65   this page prope
26220 72 6c 79 2e 20 49 74 20 63 6f 6e 74 61 69 6e 73  rly. It contains
26230 20 73 6f 6d 65 20 6f 66 20 74 68 65 0a 20 20 20   some of the.   
26240 20 20 20 20 20 2a 2a 20 72 61 6e 67 65 20 6f 66       ** range of
26250 20 64 61 74 61 20 74 68 61 74 20 69 73 20 62 65   data that is be
26260 69 6e 67 20 72 65 61 64 20 28 65 4f 70 3d 3d 30  ing read (eOp==0
26270 29 20 6f 72 20 77 72 69 74 74 65 6e 20 28 65 4f  ) or written (eO
26280 70 21 3d 30 29 2e 0a 20 20 20 20 20 20 20 20 2a  p!=0)..        *
26290 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
262a0 44 49 52 45 43 54 5f 4f 56 45 52 46 4c 4f 57 5f  DIRECT_OVERFLOW_
262b0 52 45 41 44 0a 20 20 20 20 20 20 20 20 73 71 6c  READ.        sql
262c0 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 3b 0a 23  ite3_file *fd;.#
262d0 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 69 6e  endif.        in
262e0 74 20 61 20 3d 20 61 6d 74 3b 0a 20 20 20 20 20  t a = amt;.     
262f0 20 20 20 69 66 28 20 61 20 2b 20 6f 66 66 73 65     if( a + offse
26300 74 20 3e 20 6f 76 66 6c 53 69 7a 65 20 29 7b 0a  t > ovflSize ){.
26310 20 20 20 20 20 20 20 20 20 20 61 20 3d 20 6f 76            a = ov
26320 66 6c 53 69 7a 65 20 2d 20 6f 66 66 73 65 74 3b  flSize - offset;
26330 0a 20 20 20 20 20 20 20 20 7d 0a 0a 23 69 66 64  .        }..#ifd
26340 65 66 20 53 51 4c 49 54 45 5f 44 49 52 45 43 54  ef SQLITE_DIRECT
26350 5f 4f 56 45 52 46 4c 4f 57 5f 52 45 41 44 0a 20  _OVERFLOW_READ. 
26360 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61 6c 6c         /* If all
26370 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   the following a
26380 72 65 20 74 72 75 65 3a 0a 20 20 20 20 20 20 20  re true:.       
26390 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20   **.        **  
263a0 20 31 29 20 74 68 69 73 20 69 73 20 61 20 72 65   1) this is a re
263b0 61 64 20 6f 70 65 72 61 74 69 6f 6e 2c 20 61 6e  ad operation, an
263c0 64 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  d .        **   
263d0 32 29 20 64 61 74 61 20 69 73 20 72 65 71 75 69  2) data is requi
263e0 72 65 64 20 66 72 6f 6d 20 74 68 65 20 73 74 61  red from the sta
263f0 72 74 20 6f 66 20 74 68 69 73 20 6f 76 65 72 66  rt of this overf
26400 6c 6f 77 20 70 61 67 65 2c 20 61 6e 64 0a 20 20  low page, and.  
26410 20 20 20 20 20 20 2a 2a 20 20 20 33 29 20 74 68        **   3) th
26420 65 20 64 61 74 61 62 61 73 65 20 69 73 20 66 69  e database is fi
26430 6c 65 2d 62 61 63 6b 65 64 2c 20 61 6e 64 0a 20  le-backed, and. 
26440 20 20 20 20 20 20 20 2a 2a 20 20 20 34 29 20 74         **   4) t
26450 68 65 72 65 20 69 73 20 6e 6f 20 6f 70 65 6e 20  here is no open 
26460 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
26470 6e 2c 20 61 6e 64 0a 20 20 20 20 20 20 20 20 2a  n, and.        *
26480 2a 20 20 20 35 29 20 74 68 65 20 64 61 74 61 62  *   5) the datab
26490 61 73 65 20 69 73 20 6e 6f 74 20 61 20 57 41 4c  ase is not a WAL
264a0 20 64 61 74 61 62 61 73 65 2c 0a 20 20 20 20 20   database,.     
264b0 20 20 20 2a 2a 20 20 20 36 29 20 61 6c 6c 20 64     **   6) all d
264c0 61 74 61 20 66 72 6f 6d 20 74 68 65 20 70 61 67  ata from the pag
264d0 65 20 69 73 20 62 65 69 6e 67 20 72 65 61 64 2e  e is being read.
264e0 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 37 29  .        **   7)
264f0 20 61 74 20 6c 65 61 73 74 20 34 20 62 79 74 65   at least 4 byte
26500 73 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62  s have already b
26510 65 65 6e 20 72 65 61 64 20 69 6e 74 6f 20 74 68  een read into th
26520 65 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 20  e output buffer 
26530 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
26540 20 20 20 20 2a 2a 20 74 68 65 6e 20 64 61 74 61      ** then data
26550 20 63 61 6e 20 62 65 20 72 65 61 64 20 64 69 72   can be read dir
26560 65 63 74 6c 79 20 66 72 6f 6d 20 74 68 65 20 64  ectly from the d
26570 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e 74  atabase file int
26580 6f 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  o the.        **
26590 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 2c 20   output buffer, 
265a0 62 79 70 61 73 73 69 6e 67 20 74 68 65 20 70 61  bypassing the pa
265b0 67 65 2d 63 61 63 68 65 20 61 6c 74 6f 67 65 74  ge-cache altoget
265c0 68 65 72 2e 20 54 68 69 73 20 73 70 65 65 64 73  her. This speeds
265d0 0a 20 20 20 20 20 20 20 20 2a 2a 20 75 70 20 6c  .        ** up l
265e0 6f 61 64 69 6e 67 20 6c 61 72 67 65 20 72 65 63  oading large rec
265f0 6f 72 64 73 20 74 68 61 74 20 73 70 61 6e 20 6d  ords that span m
26600 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  any overflow pag
26610 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  es..        */. 
26620 20 20 20 20 20 20 20 69 66 28 20 28 65 4f 70 26         if( (eOp&
26630 30 78 30 31 29 3d 3d 30 20 20 20 20 20 20 20 20  0x01)==0        
26640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26660 20 28 31 29 20 2a 2f 0a 20 20 20 20 20 20 20 20   (1) */.        
26670 20 26 26 20 6f 66 66 73 65 74 3d 3d 30 20 20 20   && offset==0   
26680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
266a0 20 20 20 20 20 20 20 2f 2a 20 28 32 29 20 2a 2f         /* (2) */
266b0 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 62 45  .         && (bE
266c0 6e 64 20 7c 7c 20 61 3d 3d 6f 76 66 6c 53 69 7a  nd || a==ovflSiz
266d0 65 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e)              
266e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
266f0 2f 2a 20 28 36 29 20 2a 2f 0a 20 20 20 20 20 20  /* (6) */.      
26700 20 20 20 26 26 20 70 42 74 2d 3e 69 6e 54 72 61     && pBt->inTra
26710 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f  nsaction==TRANS_
26720 52 45 41 44 20 20 20 20 20 20 20 20 20 20 20 20  READ            
26730 20 20 20 20 20 20 20 20 20 2f 2a 20 28 34 29 20           /* (4) 
26740 2a 2f 0a 20 20 20 20 20 20 20 20 20 26 26 20 28  */.         && (
26750 66 64 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  fd = sqlite3Page
26760 72 46 69 6c 65 28 70 42 74 2d 3e 70 50 61 67 65  rFile(pBt->pPage
26770 72 29 29 2d 3e 70 4d 65 74 68 6f 64 73 20 20 20  r))->pMethods   
26780 20 20 2f 2a 20 28 33 29 20 2a 2f 0a 20 20 20 20    /* (3) */.    
26790 20 20 20 20 20 26 26 20 70 42 74 2d 3e 70 50 61       && pBt->pPa
267a0 67 65 31 2d 3e 61 44 61 74 61 5b 31 39 5d 3d 3d  ge1->aData[19]==
267b0 30 78 30 31 20 20 20 20 20 20 20 20 20 20 20 20  0x01            
267c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28 35             /* (5
267d0 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 26 26  ) */.         &&
267e0 20 26 70 42 75 66 5b 2d 34 5d 3e 3d 70 42 75 66   &pBuf[-4]>=pBuf
267f0 53 74 61 72 74 20 20 20 20 20 20 20 20 20 20 20  Start           
26800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26810 20 20 20 20 2f 2a 20 28 37 29 20 2a 2f 0a 20 20      /* (7) */.  
26820 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
26830 20 20 20 75 38 20 61 53 61 76 65 5b 34 5d 3b 0a     u8 aSave[4];.
26840 20 20 20 20 20 20 20 20 20 20 75 38 20 2a 61 57            u8 *aW
26850 72 69 74 65 20 3d 20 26 70 42 75 66 5b 2d 34 5d  rite = &pBuf[-4]
26860 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
26870 72 74 28 20 61 57 72 69 74 65 3e 3d 70 42 75 66  rt( aWrite>=pBuf
26880 53 74 61 72 74 20 29 3b 20 20 20 20 20 20 20 20  Start );        
26890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
268a0 20 2f 2a 20 68 65 6e 63 65 20 28 37 29 20 2a 2f   /* hence (7) */
268b0 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70  .          memcp
268c0 79 28 61 53 61 76 65 2c 20 61 57 72 69 74 65 2c  y(aSave, aWrite,
268d0 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72   4);.          r
268e0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
268f0 64 28 66 64 2c 20 61 57 72 69 74 65 2c 20 61 2b  d(fd, aWrite, a+
26900 34 2c 20 28 69 36 34 29 70 42 74 2d 3e 70 61 67  4, (i64)pBt->pag
26910 65 53 69 7a 65 2a 28 6e 65 78 74 50 61 67 65 2d  eSize*(nextPage-
26920 31 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e  1));.          n
26930 65 78 74 50 61 67 65 20 3d 20 67 65 74 34 62 79  extPage = get4by
26940 74 65 28 61 57 72 69 74 65 29 3b 0a 20 20 20 20  te(aWrite);.    
26950 20 20 20 20 20 20 6d 65 6d 63 70 79 28 61 57 72        memcpy(aWr
26960 69 74 65 2c 20 61 53 61 76 65 2c 20 34 29 3b 0a  ite, aSave, 4);.
26970 20 20 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65          }else.#e
26980 6e 64 69 66 0a 0a 20 20 20 20 20 20 20 20 7b 0a  ndif..        {.
26990 20 20 20 20 20 20 20 20 20 20 44 62 50 61 67 65            DbPage
269a0 20 2a 70 44 62 50 61 67 65 3b 0a 20 20 20 20 20   *pDbPage;.     
269b0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
269c0 33 50 61 67 65 72 41 63 71 75 69 72 65 28 70 42  3PagerAcquire(pB
269d0 74 2d 3e 70 50 61 67 65 72 2c 20 6e 65 78 74 50  t->pPager, nextP
269e0 61 67 65 2c 20 26 70 44 62 50 61 67 65 2c 0a 20  age, &pDbPage,. 
269f0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 28 65               ((e
26a00 4f 70 26 30 78 30 31 29 3d 3d 30 20 3f 20 50 41  Op&0x01)==0 ? PA
26a10 47 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59  GER_GET_READONLY
26a20 20 3a 20 30 29 0a 20 20 20 20 20 20 20 20 20 20   : 0).          
26a30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
26a40 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
26a50 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 50  {.            aP
26a60 61 79 6c 6f 61 64 20 3d 20 73 71 6c 69 74 65 33  ayload = sqlite3
26a70 50 61 67 65 72 47 65 74 44 61 74 61 28 70 44 62  PagerGetData(pDb
26a80 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
26a90 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20 67 65     nextPage = ge
26aa0 74 34 62 79 74 65 28 61 50 61 79 6c 6f 61 64 29  t4byte(aPayload)
26ab0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  ;.            rc
26ac0 20 3d 20 63 6f 70 79 50 61 79 6c 6f 61 64 28 26   = copyPayload(&
26ad0 61 50 61 79 6c 6f 61 64 5b 6f 66 66 73 65 74 2b  aPayload[offset+
26ae0 34 5d 2c 20 70 42 75 66 2c 20 61 2c 20 28 65 4f  4], pBuf, a, (eO
26af0 70 26 30 78 30 31 29 2c 20 70 44 62 50 61 67 65  p&0x01), pDbPage
26b00 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  );.            s
26b10 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
26b20 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  (pDbPage);.     
26b30 20 20 20 20 20 20 20 6f 66 66 73 65 74 20 3d 20         offset = 
26b40 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  0;.          }. 
26b50 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
26b60 20 61 6d 74 20 2d 3d 20 61 3b 0a 20 20 20 20 20   amt -= a;.     
26b70 20 20 20 70 42 75 66 20 2b 3d 20 61 3b 0a 20 20     pBuf += a;.  
26b80 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
26b90 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
26ba0 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20 29 7b  E_OK && amt>0 ){
26bb0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
26bc0 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
26bd0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
26be0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  ;.}../*.** Read 
26bf0 70 61 72 74 20 6f 66 20 74 68 65 20 6b 65 79 20  part of the key 
26c00 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
26c10 63 75 72 73 6f 72 20 70 43 75 72 2e 20 20 45 78  cursor pCur.  Ex
26c20 61 63 74 6c 79 0a 2a 2a 20 22 61 6d 74 22 20 62  actly.** "amt" b
26c30 79 74 65 73 20 77 69 6c 6c 20 62 65 20 74 72 61  ytes will be tra
26c40 6e 73 66 65 72 72 65 64 20 69 6e 74 6f 20 70 42  nsferred into pB
26c50 75 66 5b 5d 2e 20 20 54 68 65 20 74 72 61 6e 73  uf[].  The trans
26c60 66 65 72 0a 2a 2a 20 62 65 67 69 6e 73 20 61 74  fer.** begins at
26c70 20 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 0a 2a 2a   "offset"..**.**
26c80 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74   The caller must
26c90 20 65 6e 73 75 72 65 20 74 68 61 74 20 70 43 75   ensure that pCu
26ca0 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f  r is pointing to
26cb0 20 61 20 76 61 6c 69 64 20 72 6f 77 0a 2a 2a 20   a valid row.** 
26cc0 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a  in the table..**
26cd0 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54  .** Return SQLIT
26ce0 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20  E_OK on success 
26cf0 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  or an error code
26d00 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65   if anything goe
26d10 73 0a 2a 2a 20 77 72 6f 6e 67 2e 20 20 41 6e 20  s.** wrong.  An 
26d20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65  error is returne
26d30 64 20 69 66 20 22 6f 66 66 73 65 74 2b 61 6d 74  d if "offset+amt
26d40 22 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e  " is larger than
26d50 0a 2a 2a 20 74 68 65 20 61 76 61 69 6c 61 62 6c  .** the availabl
26d60 65 20 70 61 79 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e  e payload..*/.in
26d70 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65  t sqlite3BtreeKe
26d80 79 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  y(BtCursor *pCur
26d90 2c 20 75 33 32 20 6f 66 66 73 65 74 2c 20 75 33  , u32 offset, u3
26da0 32 20 61 6d 74 2c 20 76 6f 69 64 20 2a 70 42 75  2 amt, void *pBu
26db0 66 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75  f){.  assert( cu
26dc0 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
26dd0 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
26de0 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
26df0 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
26e00 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
26e10 69 50 61 67 65 3e 3d 30 20 26 26 20 70 43 75 72  iPage>=0 && pCur
26e20 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
26e30 50 61 67 65 5d 20 29 3b 0a 20 20 61 73 73 65 72  Page] );.  asser
26e40 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70  t( pCur->aiIdx[p
26e50 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 43 75 72  Cur->iPage]<pCur
26e60 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
26e70 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  Page]->nCell );.
26e80 20 20 72 65 74 75 72 6e 20 61 63 63 65 73 73 50    return accessP
26e90 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 6f 66 66  ayload(pCur, off
26ea0 73 65 74 2c 20 61 6d 74 2c 20 28 75 6e 73 69 67  set, amt, (unsig
26eb0 6e 65 64 20 63 68 61 72 2a 29 70 42 75 66 2c 20  ned char*)pBuf, 
26ec0 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  0);.}../*.** Rea
26ed0 64 20 70 61 72 74 20 6f 66 20 74 68 65 20 64 61  d part of the da
26ee0 74 61 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ta associated wi
26ef0 74 68 20 63 75 72 73 6f 72 20 70 43 75 72 2e 20  th cursor pCur. 
26f00 20 45 78 61 63 74 6c 79 0a 2a 2a 20 22 61 6d 74   Exactly.** "amt
26f10 22 20 62 79 74 65 73 20 77 69 6c 6c 20 62 65 20  " bytes will be 
26f20 74 72 61 6e 73 66 65 72 65 64 20 69 6e 74 6f 20  transfered into 
26f30 70 42 75 66 5b 5d 2e 20 20 54 68 65 20 74 72 61  pBuf[].  The tra
26f40 6e 73 66 65 72 0a 2a 2a 20 62 65 67 69 6e 73 20  nsfer.** begins 
26f50 61 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 0a  at "offset"..**.
26f60 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ** Return SQLITE
26f70 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 6f  _OK on success o
26f80 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  r an error code 
26f90 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73  if anything goes
26fa0 0a 2a 2a 20 77 72 6f 6e 67 2e 20 20 41 6e 20 65  .** wrong.  An e
26fb0 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64  rror is returned
26fc0 20 69 66 20 22 6f 66 66 73 65 74 2b 61 6d 74 22   if "offset+amt"
26fd0 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 0a   is larger than.
26fe0 2a 2a 20 74 68 65 20 61 76 61 69 6c 61 62 6c 65  ** the available
26ff0 20 70 61 79 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e 74   payload..*/.int
27000 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 61 74   sqlite3BtreeDat
27010 61 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  a(BtCursor *pCur
27020 2c 20 75 33 32 20 6f 66 66 73 65 74 2c 20 75 33  , u32 offset, u3
27030 32 20 61 6d 74 2c 20 76 6f 69 64 20 2a 70 42 75  2 amt, void *pBu
27040 66 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 23  f){.  int rc;..#
27050 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
27060 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 69 66  IT_INCRBLOB.  if
27070 20 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d   ( pCur->eState=
27080 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20  =CURSOR_INVALID 
27090 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
270a0 4c 49 54 45 5f 41 42 4f 52 54 3b 0a 20 20 7d 0a  LITE_ABORT;.  }.
270b0 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74  #endif..  assert
270c0 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
270d0 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 72 63  ex(pCur) );.  rc
270e0 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72   = restoreCursor
270f0 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a  Position(pCur);.
27100 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
27110 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72  _OK ){.    asser
27120 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
27130 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
27140 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75  .    assert( pCu
27150 72 2d 3e 69 50 61 67 65 3e 3d 30 20 26 26 20 70  r->iPage>=0 && p
27160 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
27170 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20 20 20  ->iPage] );.    
27180 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69  assert( pCur->ai
27190 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
271a0 3c 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43  <pCur->apPage[pC
271b0 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c  ur->iPage]->nCel
271c0 6c 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 61 63  l );.    rc = ac
271d0 63 65 73 73 50 61 79 6c 6f 61 64 28 70 43 75 72  cessPayload(pCur
271e0 2c 20 6f 66 66 73 65 74 2c 20 61 6d 74 2c 20 70  , offset, amt, p
271f0 42 75 66 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72  Buf, 0);.  }.  r
27200 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
27210 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  ** Return a poin
27220 74 65 72 20 74 6f 20 70 61 79 6c 6f 61 64 20 69  ter to payload i
27230 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20  nformation from 
27240 74 68 65 20 65 6e 74 72 79 20 74 68 61 74 20 74  the entry that t
27250 68 65 20 0a 2a 2a 20 70 43 75 72 20 63 75 72 73  he .** pCur curs
27260 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74  or is pointing t
27270 6f 2e 20 20 54 68 65 20 70 6f 69 6e 74 65 72 20  o.  The pointer 
27280 69 73 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e  is to the beginn
27290 69 6e 67 20 6f 66 0a 2a 2a 20 74 68 65 20 6b 65  ing of.** the ke
272a0 79 20 69 66 20 69 6e 64 65 78 20 62 74 72 65 65  y if index btree
272b0 73 20 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  s (pPage->intKey
272c0 3d 3d 30 29 20 61 6e 64 20 69 73 20 74 68 65 20  ==0) and is the 
272d0 64 61 74 61 20 66 6f 72 0a 2a 2a 20 74 61 62 6c  data for.** tabl
272e0 65 20 62 74 72 65 65 73 20 28 70 50 61 67 65 2d  e btrees (pPage-
272f0 3e 69 6e 74 4b 65 79 3d 3d 31 29 2e 20 54 68 65  >intKey==1). The
27300 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
27310 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a   of available.**
27320 20 6b 65 79 2f 64 61 74 61 20 69 73 20 77 72 69   key/data is wri
27330 74 74 65 6e 20 69 6e 74 6f 20 2a 70 41 6d 74 2e  tten into *pAmt.
27340 20 20 49 66 20 2a 70 41 6d 74 3d 3d 30 2c 20 74    If *pAmt==0, t
27350 68 65 6e 20 74 68 65 20 76 61 6c 75 65 0a 2a 2a  hen the value.**
27360 20 72 65 74 75 72 6e 65 64 20 77 69 6c 6c 20 6e   returned will n
27370 6f 74 20 62 65 20 61 20 76 61 6c 69 64 20 70 6f  ot be a valid po
27380 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  inter..**.** Thi
27390 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 6e 20  s routine is an 
273a0 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 49  optimization.  I
273b0 74 20 69 73 20 63 6f 6d 6d 6f 6e 20 66 6f 72 20  t is common for 
273c0 74 68 65 20 65 6e 74 69 72 65 20 6b 65 79 0a 2a  the entire key.*
273d0 2a 20 61 6e 64 20 64 61 74 61 20 74 6f 20 66 69  * and data to fi
273e0 74 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70  t on the local p
273f0 61 67 65 20 61 6e 64 20 66 6f 72 20 74 68 65 72  age and for ther
27400 65 20 74 6f 20 62 65 20 6e 6f 20 6f 76 65 72 66  e to be no overf
27410 6c 6f 77 0a 2a 2a 20 70 61 67 65 73 2e 20 20 57  low.** pages.  W
27420 68 65 6e 20 74 68 61 74 20 69 73 20 73 6f 2c 20  hen that is so, 
27430 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e  this routine can
27440 20 62 65 20 75 73 65 64 20 74 6f 20 61 63 63 65   be used to acce
27450 73 73 20 74 68 65 0a 2a 2a 20 6b 65 79 20 61 6e  ss the.** key an
27460 64 20 64 61 74 61 20 77 69 74 68 6f 75 74 20 6d  d data without m
27470 61 6b 69 6e 67 20 61 20 63 6f 70 79 2e 20 20 49  aking a copy.  I
27480 66 20 74 68 65 20 6b 65 79 20 61 6e 64 2f 6f 72  f the key and/or
27490 20 64 61 74 61 20 73 70 69 6c 6c 73 0a 2a 2a 20   data spills.** 
274a0 6f 6e 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61  onto overflow pa
274b0 67 65 73 2c 20 74 68 65 6e 20 61 63 63 65 73 73  ges, then access
274c0 50 61 79 6c 6f 61 64 28 29 20 6d 75 73 74 20 62  Payload() must b
274d0 65 20 75 73 65 64 20 74 6f 20 72 65 61 73 73 65  e used to reasse
274e0 6d 62 6c 65 0a 2a 2a 20 74 68 65 20 6b 65 79 2f  mble.** the key/
274f0 64 61 74 61 20 61 6e 64 20 63 6f 70 79 20 69 74  data and copy it
27500 20 69 6e 74 6f 20 61 20 70 72 65 61 6c 6c 6f 63   into a prealloc
27510 61 74 65 64 20 62 75 66 66 65 72 2e 0a 2a 2a 0a  ated buffer..**.
27520 2a 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 72  ** The pointer r
27530 65 74 75 72 6e 65 64 20 62 79 20 74 68 69 73 20  eturned by this 
27540 72 6f 75 74 69 6e 65 20 6c 6f 6f 6b 73 20 64 69  routine looks di
27550 72 65 63 74 6c 79 20 69 6e 74 6f 20 74 68 65 20  rectly into the 
27560 63 61 63 68 65 64 0a 2a 2a 20 70 61 67 65 20 6f  cached.** page o
27570 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  f the database. 
27580 20 54 68 65 20 64 61 74 61 20 6d 69 67 68 74 20   The data might 
27590 63 68 61 6e 67 65 20 6f 72 20 6d 6f 76 65 20 74  change or move t
275a0 68 65 20 6e 65 78 74 20 74 69 6d 65 0a 2a 2a 20  he next time.** 
275b0 61 6e 79 20 62 74 72 65 65 20 72 6f 75 74 69 6e  any btree routin
275c0 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a  e is called..*/.
275d0 73 74 61 74 69 63 20 63 6f 6e 73 74 20 76 6f 69  static const voi
275e0 64 20 2a 66 65 74 63 68 50 61 79 6c 6f 61 64 28  d *fetchPayload(
275f0 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
27600 72 2c 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f  r,      /* Curso
27610 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 65 6e  r pointing to en
27620 74 72 79 20 74 6f 20 72 65 61 64 20 66 72 6f 6d  try to read from
27630 20 2a 2f 0a 20 20 75 33 32 20 2a 70 41 6d 74 20   */.  u32 *pAmt 
27640 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
27650 69 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ite the number o
27660 66 20 61 76 61 69 6c 61 62 6c 65 20 62 79 74 65  f available byte
27670 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 75  s here */.){.  u
27680 33 32 20 61 6d 74 3b 0a 20 20 61 73 73 65 72 74  32 amt;.  assert
27690 28 20 70 43 75 72 21 3d 30 20 26 26 20 70 43 75  ( pCur!=0 && pCu
276a0 72 2d 3e 69 50 61 67 65 3e 3d 30 20 26 26 20 70  r->iPage>=0 && p
276b0 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
276c0 2d 3e 69 50 61 67 65 5d 29 3b 0a 20 20 61 73 73  ->iPage]);.  ass
276d0 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
276e0 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
276f0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
27700 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
27710 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62  pCur->pBtree->db
27720 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
27730 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
27740 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
27750 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
27760 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
27770 65 5d 3c 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  e]<pCur->apPage[
27780 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43  pCur->iPage]->nC
27790 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ell );.  assert(
277a0 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
277b0 65 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  e>0 );.  assert(
277c0 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 50 61 79   pCur->info.pPay
277d0 6c 6f 61 64 3e 70 43 75 72 2d 3e 61 70 50 61 67  load>pCur->apPag
277e0 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e  e[pCur->iPage]->
277f0 61 44 61 74 61 20 7c 7c 20 43 4f 52 52 55 50 54  aData || CORRUPT
27800 5f 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _DB );.  assert(
27810 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 50 61 79   pCur->info.pPay
27820 6c 6f 61 64 3c 70 43 75 72 2d 3e 61 70 50 61 67  load<pCur->apPag
27830 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e  e[pCur->iPage]->
27840 61 44 61 74 61 45 6e 64 20 7c 7c 43 4f 52 52 55  aDataEnd ||CORRU
27850 50 54 5f 44 42 29 3b 0a 20 20 61 6d 74 20 3d 20  PT_DB);.  amt = 
27860 28 69 6e 74 29 28 70 43 75 72 2d 3e 61 70 50 61  (int)(pCur->apPa
27870 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
27880 3e 61 44 61 74 61 45 6e 64 20 2d 20 70 43 75 72  >aDataEnd - pCur
27890 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64 29  ->info.pPayload)
278a0 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 69 6e  ;.  if( pCur->in
278b0 66 6f 2e 6e 4c 6f 63 61 6c 3c 61 6d 74 20 29 20  fo.nLocal<amt ) 
278c0 61 6d 74 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f  amt = pCur->info
278d0 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 2a 70 41 6d 74  .nLocal;.  *pAmt
278e0 20 3d 20 61 6d 74 3b 0a 20 20 72 65 74 75 72 6e   = amt;.  return
278f0 20 28 76 6f 69 64 2a 29 70 43 75 72 2d 3e 69 6e   (void*)pCur->in
27900 66 6f 2e 70 50 61 79 6c 6f 61 64 3b 0a 7d 0a 0a  fo.pPayload;.}..
27910 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 65  ./*.** For the e
27920 6e 74 72 79 20 74 68 61 74 20 63 75 72 73 6f 72  ntry that cursor
27930 20 70 43 75 72 20 69 73 20 70 6f 69 6e 74 20 74   pCur is point t
27940 6f 2c 20 72 65 74 75 72 6e 20 61 73 0a 2a 2a 20  o, return as.** 
27950 6d 61 6e 79 20 62 79 74 65 73 20 6f 66 20 74 68  many bytes of th
27960 65 20 6b 65 79 20 6f 72 20 64 61 74 61 20 61 73  e key or data as
27970 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65 20 6f   are available o
27980 6e 20 74 68 65 20 6c 6f 63 61 6c 0a 2a 2a 20 62  n the local.** b
27990 2d 74 72 65 65 20 70 61 67 65 2e 20 20 57 72 69  -tree page.  Wri
279a0 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  te the number of
279b0 20 61 76 61 69 6c 61 62 6c 65 20 62 79 74 65 73   available bytes
279c0 20 69 6e 74 6f 20 2a 70 41 6d 74 2e 0a 2a 2a 0a   into *pAmt..**.
279d0 2a 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 72  ** The pointer r
279e0 65 74 75 72 6e 65 64 20 69 73 20 65 70 68 65 6d  eturned is ephem
279f0 65 72 61 6c 2e 20 20 54 68 65 20 6b 65 79 2f 64  eral.  The key/d
27a00 61 74 61 20 6d 61 79 20 6d 6f 76 65 0a 2a 2a 20  ata may move.** 
27a10 6f 72 20 62 65 20 64 65 73 74 72 6f 79 65 64 20  or be destroyed 
27a20 6f 6e 20 74 68 65 20 6e 65 78 74 20 63 61 6c 6c  on the next call
27a30 20 74 6f 20 61 6e 79 20 42 74 72 65 65 20 72 6f   to any Btree ro
27a40 75 74 69 6e 65 2c 0a 2a 2a 20 69 6e 63 6c 75 64  utine,.** includ
27a50 69 6e 67 20 63 61 6c 6c 73 20 66 72 6f 6d 20 6f  ing calls from o
27a60 74 68 65 72 20 74 68 72 65 61 64 73 20 61 67 61  ther threads aga
27a70 69 6e 73 74 20 74 68 65 20 73 61 6d 65 20 63 61  inst the same ca
27a80 63 68 65 2e 0a 2a 2a 20 48 65 6e 63 65 2c 20 61  che..** Hence, a
27a90 20 6d 75 74 65 78 20 6f 6e 20 74 68 65 20 42 74   mutex on the Bt
27aa0 53 68 61 72 65 64 20 73 68 6f 75 6c 64 20 62 65  Shared should be
27ab0 20 68 65 6c 64 20 70 72 69 6f 72 20 74 6f 20 63   held prior to c
27ac0 61 6c 6c 69 6e 67 0a 2a 2a 20 74 68 69 73 20 72  alling.** this r
27ad0 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  outine..**.** Th
27ae0 65 73 65 20 72 6f 75 74 69 6e 65 73 20 69 73 20  ese routines is 
27af0 75 73 65 64 20 74 6f 20 67 65 74 20 71 75 69 63  used to get quic
27b00 6b 20 61 63 63 65 73 73 20 74 6f 20 6b 65 79 20  k access to key 
27b10 61 6e 64 20 64 61 74 61 0a 2a 2a 20 69 6e 20 74  and data.** in t
27b20 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77  he common case w
27b30 68 65 72 65 20 6e 6f 20 6f 76 65 72 66 6c 6f 77  here no overflow
27b40 20 70 61 67 65 73 20 61 72 65 20 75 73 65 64 2e   pages are used.
27b50 0a 2a 2f 0a 63 6f 6e 73 74 20 76 6f 69 64 20 2a  .*/.const void *
27b60 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 46  sqlite3BtreeKeyF
27b70 65 74 63 68 28 42 74 43 75 72 73 6f 72 20 2a 70  etch(BtCursor *p
27b80 43 75 72 2c 20 75 33 32 20 2a 70 41 6d 74 29 7b  Cur, u32 *pAmt){
27b90 0a 20 20 72 65 74 75 72 6e 20 66 65 74 63 68 50  .  return fetchP
27ba0 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 70 41 6d  ayload(pCur, pAm
27bb0 74 29 3b 0a 7d 0a 63 6f 6e 73 74 20 76 6f 69 64  t);.}.const void
27bc0 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65 44 61   *sqlite3BtreeDa
27bd0 74 61 46 65 74 63 68 28 42 74 43 75 72 73 6f 72  taFetch(BtCursor
27be0 20 2a 70 43 75 72 2c 20 75 33 32 20 2a 70 41 6d   *pCur, u32 *pAm
27bf0 74 29 7b 0a 20 20 72 65 74 75 72 6e 20 66 65 74  t){.  return fet
27c00 63 68 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20  chPayload(pCur, 
27c10 70 41 6d 74 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  pAmt);.}.../*.**
27c20 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72   Move the cursor
27c30 20 64 6f 77 6e 20 74 6f 20 61 20 6e 65 77 20 63   down to a new c
27c40 68 69 6c 64 20 70 61 67 65 2e 20 20 54 68 65 20  hild page.  The 
27c50 6e 65 77 50 67 6e 6f 20 61 72 67 75 6d 65 6e 74  newPgno argument
27c60 20 69 73 20 74 68 65 0a 2a 2a 20 70 61 67 65 20   is the.** page 
27c70 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 63 68  number of the ch
27c80 69 6c 64 20 70 61 67 65 20 74 6f 20 6d 6f 76 65  ild page to move
27c90 20 74 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20   to..**.** This 
27ca0 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
27cb0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20   SQLITE_CORRUPT 
27cc0 69 66 20 74 68 65 20 70 61 67 65 2d 68 65 61 64  if the page-head
27cd0 65 72 20 66 6c 61 67 73 20 66 69 65 6c 64 20 6f  er flags field o
27ce0 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20 63 68 69  f.** the new chi
27cf0 6c 64 20 70 61 67 65 20 64 6f 65 73 20 6e 6f 74  ld page does not
27d00 20 6d 61 74 63 68 20 74 68 65 20 66 6c 61 67 73   match the flags
27d10 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 70 61   field of the pa
27d20 72 65 6e 74 20 28 69 2e 65 2e 0a 2a 2a 20 69 66  rent (i.e..** if
27d30 20 61 6e 20 69 6e 74 6b 65 79 20 70 61 67 65 20   an intkey page 
27d40 61 70 70 65 61 72 73 20 74 6f 20 62 65 20 74 68  appears to be th
27d50 65 20 70 61 72 65 6e 74 20 6f 66 20 61 20 6e 6f  e parent of a no
27d60 6e 2d 69 6e 74 6b 65 79 20 70 61 67 65 2c 20 6f  n-intkey page, o
27d70 72 0a 2a 2a 20 76 69 63 65 2d 76 65 72 73 61 29  r.** vice-versa)
27d80 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
27d90 6d 6f 76 65 54 6f 43 68 69 6c 64 28 42 74 43 75  moveToChild(BtCu
27da0 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20  rsor *pCur, u32 
27db0 6e 65 77 50 67 6e 6f 29 7b 0a 20 20 42 74 53 68  newPgno){.  BtSh
27dc0 61 72 65 64 20 2a 70 42 74 20 3d 20 70 43 75 72  ared *pBt = pCur
27dd0 2d 3e 70 42 74 3b 0a 0a 20 20 61 73 73 65 72 74  ->pBt;..  assert
27de0 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
27df0 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ex(pCur) );.  as
27e00 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
27e10 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
27e20 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
27e30 75 72 2d 3e 69 50 61 67 65 3c 42 54 43 55 52 53  ur->iPage<BTCURS
27e40 4f 52 5f 4d 41 58 5f 44 45 50 54 48 20 29 3b 0a  OR_MAX_DEPTH );.
27e50 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
27e60 69 50 61 67 65 3e 3d 30 20 29 3b 0a 20 20 69 66  iPage>=0 );.  if
27e70 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 28  ( pCur->iPage>=(
27e80 42 54 43 55 52 53 4f 52 5f 4d 41 58 5f 44 45 50  BTCURSOR_MAX_DEP
27e90 54 48 2d 31 29 20 29 7b 0a 20 20 20 20 72 65 74  TH-1) ){.    ret
27ea0 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
27eb0 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 70  PT_BKPT;.  }.  p
27ec0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20  Cur->info.nSize 
27ed0 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72  = 0;.  pCur->cur
27ee0 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 43 46 5f  Flags &= ~(BTCF_
27ef0 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56  ValidNKey|BTCF_V
27f00 61 6c 69 64 4f 76 66 6c 29 3b 0a 20 20 70 43 75  alidOvfl);.  pCu
27f10 72 2d 3e 69 50 61 67 65 2b 2b 3b 0a 20 20 70 43  r->iPage++;.  pC
27f20 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
27f30 69 50 61 67 65 5d 20 3d 20 30 3b 0a 20 20 72 65  iPage] = 0;.  re
27f40 74 75 72 6e 20 67 65 74 41 6e 64 49 6e 69 74 50  turn getAndInitP
27f50 61 67 65 28 70 42 74 2c 20 6e 65 77 50 67 6e 6f  age(pBt, newPgno
27f60 2c 20 26 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  , &pCur->apPage[
27f70 70 43 75 72 2d 3e 69 50 61 67 65 5d 2c 0a 20 20  pCur->iPage],.  
27f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27f90 20 20 20 20 20 20 70 43 75 72 2c 20 70 43 75 72        pCur, pCur
27fa0 2d 3e 63 75 72 50 61 67 65 72 46 6c 61 67 73 29  ->curPagerFlags)
27fb0 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  ;.}..#if SQLITE_
27fc0 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 50 61 67 65  DEBUG./*.** Page
27fd0 20 70 50 61 72 65 6e 74 20 69 73 20 61 6e 20 69   pParent is an i
27fe0 6e 74 65 72 6e 61 6c 20 28 6e 6f 6e 2d 6c 65 61  nternal (non-lea
27ff0 66 29 20 74 72 65 65 20 70 61 67 65 2e 20 54 68  f) tree page. Th
28000 69 73 20 66 75 6e 63 74 69 6f 6e 20 0a 2a 2a 20  is function .** 
28010 61 73 73 65 72 74 73 20 74 68 61 74 20 70 61 67  asserts that pag
28020 65 20 6e 75 6d 62 65 72 20 69 43 68 69 6c 64 20  e number iChild 
28030 69 73 20 74 68 65 20 6c 65 66 74 2d 63 68 69 6c  is the left-chil
28040 64 20 69 66 20 74 68 65 20 69 49 64 78 27 74 68  d if the iIdx'th
28050 0a 2a 2a 20 63 65 6c 6c 20 69 6e 20 70 61 67 65  .** cell in page
28060 20 70 50 61 72 65 6e 74 2e 20 4f 72 2c 20 69 66   pParent. Or, if
28070 20 69 49 64 78 20 69 73 20 65 71 75 61 6c 20 74   iIdx is equal t
28080 6f 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62  o the total numb
28090 65 72 20 6f 66 0a 2a 2a 20 63 65 6c 6c 73 20 69  er of.** cells i
280a0 6e 20 70 50 61 72 65 6e 74 2c 20 74 68 61 74 20  n pParent, that 
280b0 70 61 67 65 20 6e 75 6d 62 65 72 20 69 43 68 69  page number iChi
280c0 6c 64 20 69 73 20 74 68 65 20 72 69 67 68 74 2d  ld is the right-
280d0 63 68 69 6c 64 20 6f 66 0a 2a 2a 20 74 68 65 20  child of.** the 
280e0 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  page..*/.static 
280f0 76 6f 69 64 20 61 73 73 65 72 74 50 61 72 65 6e  void assertParen
28100 74 49 6e 64 65 78 28 4d 65 6d 50 61 67 65 20 2a  tIndex(MemPage *
28110 70 50 61 72 65 6e 74 2c 20 69 6e 74 20 69 49 64  pParent, int iId
28120 78 2c 20 50 67 6e 6f 20 69 43 68 69 6c 64 29 7b  x, Pgno iChild){
28130 0a 20 20 69 66 28 20 43 4f 52 52 55 50 54 5f 44  .  if( CORRUPT_D
28140 42 20 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20  B ) return;  /* 
28150 54 68 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20 74  The conditions t
28160 65 73 74 65 64 20 62 65 6c 6f 77 20 6d 69 67 68  ested below migh
28170 74 20 6e 6f 74 20 62 65 20 74 72 75 65 0a 20 20  t not be true.  
28180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28190 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 20            ** in 
281a0 61 20 63 6f 72 72 75 70 74 20 64 61 74 61 62 61  a corrupt databa
281b0 73 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  se */.  assert( 
281c0 69 49 64 78 3c 3d 70 50 61 72 65 6e 74 2d 3e 6e  iIdx<=pParent->n
281d0 43 65 6c 6c 20 29 3b 0a 20 20 69 66 28 20 69 49  Cell );.  if( iI
281e0 64 78 3d 3d 70 50 61 72 65 6e 74 2d 3e 6e 43 65  dx==pParent->nCe
281f0 6c 6c 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ll ){.    assert
28200 28 20 67 65 74 34 62 79 74 65 28 26 70 50 61 72  ( get4byte(&pPar
28210 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61 72 65  ent->aData[pPare
28220 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  nt->hdrOffset+8]
28230 29 3d 3d 69 43 68 69 6c 64 20 29 3b 0a 20 20 7d  )==iChild );.  }
28240 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
28250 28 20 67 65 74 34 62 79 74 65 28 66 69 6e 64 43  ( get4byte(findC
28260 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 69 49 64  ell(pParent, iId
28270 78 29 29 3d 3d 69 43 68 69 6c 64 20 29 3b 0a 20  x))==iChild );. 
28280 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 20 64 65   }.}.#else.#  de
28290 66 69 6e 65 20 61 73 73 65 72 74 50 61 72 65 6e  fine assertParen
282a0 74 49 6e 64 65 78 28 78 2c 79 2c 7a 29 20 0a 23  tIndex(x,y,z) .#
282b0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76  endif../*.** Mov
282c0 65 20 74 68 65 20 63 75 72 73 6f 72 20 75 70 20  e the cursor up 
282d0 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20 70 61  to the parent pa
282e0 67 65 2e 0a 2a 2a 0a 2a 2a 20 70 43 75 72 2d 3e  ge..**.** pCur->
282f0 69 64 78 20 69 73 20 73 65 74 20 74 6f 20 74 68  idx is set to th
28300 65 20 63 65 6c 6c 20 69 6e 64 65 78 20 74 68 61  e cell index tha
28310 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 70  t contains the p
28320 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65  ointer.** to the
28330 20 70 61 67 65 20 77 65 20 61 72 65 20 63 6f 6d   page we are com
28340 69 6e 67 20 66 72 6f 6d 2e 20 20 49 66 20 77 65  ing from.  If we
28350 20 61 72 65 20 63 6f 6d 69 6e 67 20 66 72 6f 6d   are coming from
28360 20 74 68 65 0a 2a 2a 20 72 69 67 68 74 2d 6d 6f   the.** right-mo
28370 73 74 20 63 68 69 6c 64 20 70 61 67 65 20 74 68  st child page th
28380 65 6e 20 70 43 75 72 2d 3e 69 64 78 20 69 73 20  en pCur->idx is 
28390 73 65 74 20 74 6f 20 6f 6e 65 20 6d 6f 72 65 20  set to one more 
283a0 74 68 61 6e 0a 2a 2a 20 74 68 65 20 6c 61 72 67  than.** the larg
283b0 65 73 74 20 63 65 6c 6c 20 69 6e 64 65 78 2e 0a  est cell index..
283c0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d  */.static void m
283d0 6f 76 65 54 6f 50 61 72 65 6e 74 28 42 74 43 75  oveToParent(BtCu
283e0 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 61  rsor *pCur){.  a
283f0 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
28400 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
28410 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
28420 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
28430 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72  VALID );.  asser
28440 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 30  t( pCur->iPage>0
28450 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
28460 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
28470 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20 61 73 73  >iPage] );.  ass
28480 65 72 74 50 61 72 65 6e 74 49 6e 64 65 78 28 0a  ertParentIndex(.
28490 20 20 20 20 70 43 75 72 2d 3e 61 70 50 61 67 65      pCur->apPage
284a0 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d 2c  [pCur->iPage-1],
284b0 20 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64   .    pCur->aiId
284c0 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d  x[pCur->iPage-1]
284d0 2c 20 0a 20 20 20 20 70 43 75 72 2d 3e 61 70 50  , .    pCur->apP
284e0 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
284f0 2d 3e 70 67 6e 6f 0a 20 20 29 3b 0a 20 20 74 65  ->pgno.  );.  te
28500 73 74 63 61 73 65 28 20 70 43 75 72 2d 3e 61 69  stcase( pCur->ai
28510 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d  Idx[pCur->iPage-
28520 31 5d 20 3e 20 70 43 75 72 2d 3e 61 70 50 61 67  1] > pCur->apPag
28530 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d  e[pCur->iPage-1]
28540 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 70 43 75  ->nCell );.  pCu
28550 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20  r->info.nSize = 
28560 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72 46 6c  0;.  pCur->curFl
28570 61 67 73 20 26 3d 20 7e 28 42 54 43 46 5f 56 61  ags &= ~(BTCF_Va
28580 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56 61 6c  lidNKey|BTCF_Val
28590 69 64 4f 76 66 6c 29 3b 0a 20 20 72 65 6c 65 61  idOvfl);.  relea
285a0 73 65 50 61 67 65 4e 6f 74 4e 75 6c 6c 28 70 43  sePageNotNull(pC
285b0 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
285c0 3e 69 50 61 67 65 2d 2d 5d 29 3b 0a 7d 0a 0a 2f  >iPage--]);.}../
285d0 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75  *.** Move the cu
285e0 72 73 6f 72 20 74 6f 20 70 6f 69 6e 74 20 74 6f  rsor to point to
285f0 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f   the root page o
28600 66 20 69 74 73 20 62 2d 74 72 65 65 20 73 74 72  f its b-tree str
28610 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  ucture..**.** If
28620 20 74 68 65 20 74 61 62 6c 65 20 68 61 73 20 61   the table has a
28630 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61   virtual root pa
28640 67 65 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72  ge, then the cur
28650 73 6f 72 20 69 73 20 6d 6f 76 65 64 20 74 6f 20  sor is moved to 
28660 70 6f 69 6e 74 0a 2a 2a 20 74 6f 20 74 68 65 20  point.** to the 
28670 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61 67  virtual root pag
28680 65 20 69 6e 73 74 65 61 64 20 6f 66 20 74 68 65  e instead of the
28690 20 61 63 74 75 61 6c 20 72 6f 6f 74 20 70 61 67   actual root pag
286a0 65 2e 20 41 20 74 61 62 6c 65 20 68 61 73 20 61  e. A table has a
286b0 0a 2a 2a 20 76 69 72 74 75 61 6c 20 72 6f 6f 74  .** virtual root
286c0 20 70 61 67 65 20 77 68 65 6e 20 74 68 65 20 61   page when the a
286d0 63 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 20  ctual root page 
286e0 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 63 65 6c 6c  contains no cell
286f0 73 20 61 6e 64 20 61 20 0a 2a 2a 20 73 69 6e 67  s and a .** sing
28700 6c 65 20 63 68 69 6c 64 20 70 61 67 65 2e 20 54  le child page. T
28710 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70  his can only hap
28720 70 65 6e 20 77 69 74 68 20 74 68 65 20 74 61 62  pen with the tab
28730 6c 65 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67  le rooted at pag
28740 65 20 31 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  e 1..**.** If th
28750 65 20 62 2d 74 72 65 65 20 73 74 72 75 63 74 75  e b-tree structu
28760 72 65 20 69 73 20 65 6d 70 74 79 2c 20 74 68 65  re is empty, the
28770 20 63 75 72 73 6f 72 20 73 74 61 74 65 20 69 73   cursor state is
28780 20 73 65 74 20 74 6f 20 0a 2a 2a 20 43 55 52 53   set to .** CURS
28790 4f 52 5f 49 4e 56 41 4c 49 44 2e 20 4f 74 68 65  OR_INVALID. Othe
287a0 72 77 69 73 65 2c 20 74 68 65 20 63 75 72 73 6f  rwise, the curso
287b0 72 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e  r is set to poin
287c0 74 20 74 6f 20 74 68 65 20 66 69 72 73 74 0a 2a  t to the first.*
287d0 2a 20 63 65 6c 6c 20 6c 6f 63 61 74 65 64 20 6f  * cell located o
287e0 6e 20 74 68 65 20 72 6f 6f 74 20 28 6f 72 20 76  n the root (or v
287f0 69 72 74 75 61 6c 20 72 6f 6f 74 29 20 70 61 67  irtual root) pag
28800 65 20 61 6e 64 20 74 68 65 20 63 75 72 73 6f 72  e and the cursor
28810 20 73 74 61 74 65 0a 2a 2a 20 69 73 20 73 65 74   state.** is set
28820 20 74 6f 20 43 55 52 53 4f 52 5f 56 41 4c 49 44   to CURSOR_VALID
28830 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20  ..**.** If this 
28840 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
28850 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 69   successfully, i
28860 74 20 6d 61 79 20 62 65 20 61 73 73 75 6d 65 64  t may be assumed
28870 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 70 61 67   that the.** pag
28880 65 2d 68 65 61 64 65 72 20 66 6c 61 67 73 20 69  e-header flags i
28890 6e 64 69 63 61 74 65 20 74 68 61 74 20 74 68 65  ndicate that the
288a0 20 5b 76 69 72 74 75 61 6c 5d 20 72 6f 6f 74 2d   [virtual] root-
288b0 70 61 67 65 20 69 73 20 74 68 65 20 65 78 70 65  page is the expe
288c0 63 74 65 64 20 0a 2a 2a 20 6b 69 6e 64 20 6f 66  cted .** kind of
288d0 20 62 2d 74 72 65 65 20 70 61 67 65 20 28 69 2e   b-tree page (i.
288e0 65 2e 20 69 66 20 77 68 65 6e 20 6f 70 65 6e 69  e. if when openi
288f0 6e 67 20 74 68 65 20 63 75 72 73 6f 72 20 74 68  ng the cursor th
28900 65 20 63 61 6c 6c 65 72 20 64 69 64 20 6e 6f 74  e caller did not
28910 0a 2a 2a 20 73 70 65 63 69 66 79 20 61 20 4b 65  .** specify a Ke
28920 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  yInfo structure 
28930 74 68 65 20 66 6c 61 67 73 20 62 79 74 65 20 69  the flags byte i
28940 73 20 73 65 74 20 74 6f 20 30 78 30 35 20 6f 72  s set to 0x05 or
28950 20 30 78 30 44 2c 0a 2a 2a 20 69 6e 64 69 63 61   0x0D,.** indica
28960 74 69 6e 67 20 61 20 74 61 62 6c 65 20 62 2d 74  ting a table b-t
28970 72 65 65 2c 20 6f 72 20 69 66 20 74 68 65 20 63  ree, or if the c
28980 61 6c 6c 65 72 20 64 69 64 20 73 70 65 63 69 66  aller did specif
28990 79 20 61 20 4b 65 79 49 6e 66 6f 20 0a 2a 2a 20  y a KeyInfo .** 
289a0 73 74 72 75 63 74 75 72 65 20 74 68 65 20 66 6c  structure the fl
289b0 61 67 73 20 62 79 74 65 20 69 73 20 73 65 74 20  ags byte is set 
289c0 74 6f 20 30 78 30 32 20 6f 72 20 30 78 30 41 2c  to 0x02 or 0x0A,
289d0 20 69 6e 64 69 63 61 74 69 6e 67 20 61 6e 20 69   indicating an i
289e0 6e 64 65 78 0a 2a 2a 20 62 2d 74 72 65 65 29 2e  ndex.** b-tree).
289f0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d  .*/.static int m
28a00 6f 76 65 54 6f 52 6f 6f 74 28 42 74 43 75 72 73  oveToRoot(BtCurs
28a10 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 4d 65 6d  or *pCur){.  Mem
28a20 50 61 67 65 20 2a 70 52 6f 6f 74 3b 0a 20 20 69  Page *pRoot;.  i
28a30 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
28a40 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  K;..  assert( cu
28a50 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
28a60 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
28a70 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  ( CURSOR_INVALID
28a80 20 3c 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52   < CURSOR_REQUIR
28a90 45 53 45 45 4b 20 29 3b 0a 20 20 61 73 73 65 72  ESEEK );.  asser
28aa0 74 28 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  t( CURSOR_VALID 
28ab0 20 20 3c 20 43 55 52 53 4f 52 5f 52 45 51 55 49    < CURSOR_REQUI
28ac0 52 45 53 45 45 4b 20 29 3b 0a 20 20 61 73 73 65  RESEEK );.  asse
28ad0 72 74 28 20 43 55 52 53 4f 52 5f 46 41 55 4c 54  rt( CURSOR_FAULT
28ae0 20 20 20 3e 20 43 55 52 53 4f 52 5f 52 45 51 55     > CURSOR_REQU
28af0 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 69 66 28  IRESEEK );.  if(
28b00 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3e 3d 43   pCur->eState>=C
28b10 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45  URSOR_REQUIRESEE
28b20 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75  K ){.    if( pCu
28b30 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
28b40 52 5f 46 41 55 4c 54 20 29 7b 0a 20 20 20 20 20  R_FAULT ){.     
28b50 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 73   assert( pCur->s
28b60 6b 69 70 4e 65 78 74 21 3d 53 51 4c 49 54 45 5f  kipNext!=SQLITE_
28b70 4f 4b 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75  OK );.      retu
28b80 72 6e 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78  rn pCur->skipNex
28b90 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  t;.    }.    sql
28ba0 69 74 65 33 42 74 72 65 65 43 6c 65 61 72 43 75  ite3BtreeClearCu
28bb0 72 73 6f 72 28 70 43 75 72 29 3b 0a 20 20 7d 0a  rsor(pCur);.  }.
28bc0 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61  .  if( pCur->iPa
28bd0 67 65 3e 3d 30 20 29 7b 0a 20 20 20 20 77 68 69  ge>=0 ){.    whi
28be0 6c 65 28 20 70 43 75 72 2d 3e 69 50 61 67 65 20  le( pCur->iPage 
28bf0 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
28c00 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
28c10 75 72 2d 3e 69 50 61 67 65 5d 21 3d 30 20 29 3b  ur->iPage]!=0 );
28c20 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
28c30 67 65 4e 6f 74 4e 75 6c 6c 28 70 43 75 72 2d 3e  geNotNull(pCur->
28c40 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
28c50 67 65 2d 2d 5d 29 3b 0a 20 20 20 20 7d 0a 20 20  ge--]);.    }.  
28c60 7d 65 6c 73 65 20 69 66 28 20 70 43 75 72 2d 3e  }else if( pCur->
28c70 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 29 7b 0a 20  pgnoRoot==0 ){. 
28c80 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20     pCur->eState 
28c90 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  = CURSOR_INVALID
28ca0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
28cb0 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b  ITE_OK;.  }else{
28cc0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75  .    assert( pCu
28cd0 72 2d 3e 69 50 61 67 65 3d 3d 28 2d 31 29 20 29  r->iPage==(-1) )
28ce0 3b 0a 20 20 20 20 72 63 20 3d 20 67 65 74 41 6e  ;.    rc = getAn
28cf0 64 49 6e 69 74 50 61 67 65 28 70 43 75 72 2d 3e  dInitPage(pCur->
28d00 70 42 74 72 65 65 2d 3e 70 42 74 2c 20 70 43 75  pBtree->pBt, pCu
28d10 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 26 70 43  r->pgnoRoot, &pC
28d20 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2c 0a 20  ur->apPage[0],. 
28d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28d40 20 20 20 20 20 20 20 30 2c 20 70 43 75 72 2d 3e         0, pCur->
28d50 63 75 72 50 61 67 65 72 46 6c 61 67 73 29 3b 0a  curPagerFlags);.
28d60 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
28d70 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70  TE_OK ){.      p
28d80 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
28d90 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20  RSOR_INVALID;.  
28da0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
28db0 20 20 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e 69     }.    pCur->i
28dc0 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 70 43  Page = 0;.    pC
28dd0 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79 20 3d 20  ur->curIntKey = 
28de0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d  pCur->apPage[0]-
28df0 3e 69 6e 74 4b 65 79 3b 0a 20 20 7d 0a 20 20 70  >intKey;.  }.  p
28e00 52 6f 6f 74 20 3d 20 70 43 75 72 2d 3e 61 70 50  Root = pCur->apP
28e10 61 67 65 5b 30 5d 3b 0a 20 20 61 73 73 65 72 74  age[0];.  assert
28e20 28 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f 3d 3d 70  ( pRoot->pgno==p
28e30 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20 29 3b  Cur->pgnoRoot );
28e40 0a 0a 20 20 2f 2a 20 49 66 20 70 43 75 72 2d 3e  ..  /* If pCur->
28e50 70 4b 65 79 49 6e 66 6f 20 69 73 20 6e 6f 74 20  pKeyInfo is not 
28e60 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 65 20 63  NULL, then the c
28e70 61 6c 6c 65 72 20 74 68 61 74 20 6f 70 65 6e 65  aller that opene
28e80 64 20 74 68 69 73 20 63 75 72 73 6f 72 0a 20 20  d this cursor.  
28e90 2a 2a 20 65 78 70 65 63 74 65 64 20 74 6f 20 6f  ** expected to o
28ea0 70 65 6e 20 69 74 20 6f 6e 20 61 6e 20 69 6e 64  pen it on an ind
28eb0 65 78 20 62 2d 74 72 65 65 2e 20 4f 74 68 65 72  ex b-tree. Other
28ec0 77 69 73 65 2c 20 69 66 20 70 4b 65 79 49 6e 66  wise, if pKeyInf
28ed0 6f 20 69 73 0a 20 20 2a 2a 20 4e 55 4c 4c 2c 20  o is.  ** NULL, 
28ee0 74 68 65 20 63 61 6c 6c 65 72 20 65 78 70 65 63  the caller expec
28ef0 74 73 20 61 20 74 61 62 6c 65 20 62 2d 74 72 65  ts a table b-tre
28f00 65 2e 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f  e. If this is no
28f10 74 20 74 68 65 20 63 61 73 65 2c 0a 20 20 2a 2a  t the case,.  **
28f20 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c 49 54   return an SQLIT
28f30 45 5f 43 4f 52 52 55 50 54 20 65 72 72 6f 72 2e  E_CORRUPT error.
28f40 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 61 72 6c   .  **.  ** Earl
28f50 69 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  ier versions of 
28f60 53 51 4c 69 74 65 20 61 73 73 75 6d 65 64 20 74  SQLite assumed t
28f70 68 61 74 20 74 68 69 73 20 74 65 73 74 20 63 6f  hat this test co
28f80 75 6c 64 20 6e 6f 74 20 66 61 69 6c 0a 20 20 2a  uld not fail.  *
28f90 2a 20 69 66 20 74 68 65 20 72 6f 6f 74 20 70 61  * if the root pa
28fa0 67 65 20 77 61 73 20 61 6c 72 65 61 64 79 20 6c  ge was already l
28fb0 6f 61 64 65 64 20 77 68 65 6e 20 74 68 69 73 20  oaded when this 
28fc0 66 75 6e 63 74 69 6f 6e 20 77 61 73 20 63 61 6c  function was cal
28fd0 6c 65 64 20 28 69 2e 65 2e 0a 20 20 2a 2a 20 69  led (i.e..  ** i
28fe0 66 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30  f pCur->iPage>=0
28ff0 29 2e 20 42 75 74 20 74 68 69 73 20 69 73 20 6e  ). But this is n
29000 6f 74 20 73 6f 20 69 66 20 74 68 65 20 64 61 74  ot so if the dat
29010 61 62 61 73 65 20 69 73 20 63 6f 72 72 75 70 74  abase is corrupt
29020 65 64 20 0a 20 20 2a 2a 20 69 6e 20 73 75 63 68  ed .  ** in such
29030 20 61 20 77 61 79 20 74 68 61 74 20 70 61 67 65   a way that page
29040 20 70 52 6f 6f 74 20 69 73 20 6c 69 6e 6b 65 64   pRoot is linked
29050 20 69 6e 74 6f 20 61 20 73 65 63 6f 6e 64 20 62   into a second b
29060 2d 74 72 65 65 20 74 61 62 6c 65 20 0a 20 20 2a  -tree table .  *
29070 2a 20 28 6f 72 20 74 68 65 20 66 72 65 65 6c 69  * (or the freeli
29080 73 74 29 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72  st).  */.  asser
29090 74 28 20 70 52 6f 6f 74 2d 3e 69 6e 74 4b 65 79  t( pRoot->intKey
290a0 3d 3d 31 20 7c 7c 20 70 52 6f 6f 74 2d 3e 69 6e  ==1 || pRoot->in
290b0 74 4b 65 79 3d 3d 30 20 29 3b 0a 20 20 69 66 28  tKey==0 );.  if(
290c0 20 70 52 6f 6f 74 2d 3e 69 73 49 6e 69 74 3d 3d   pRoot->isInit==
290d0 30 20 7c 7c 20 28 70 43 75 72 2d 3e 70 4b 65 79  0 || (pCur->pKey
290e0 49 6e 66 6f 3d 3d 30 29 21 3d 70 52 6f 6f 74 2d  Info==0)!=pRoot-
290f0 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 72  >intKey ){.    r
29100 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
29110 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a  RUPT_BKPT;.  }..
29120 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 30 5d    pCur->aiIdx[0]
29130 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 69 6e   = 0;.  pCur->in
29140 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20  fo.nSize = 0;.  
29150 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26  pCur->curFlags &
29160 3d 20 7e 28 42 54 43 46 5f 41 74 4c 61 73 74 7c  = ~(BTCF_AtLast|
29170 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42  BTCF_ValidNKey|B
29180 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3b 0a  TCF_ValidOvfl);.
29190 0a 20 20 69 66 28 20 70 52 6f 6f 74 2d 3e 6e 43  .  if( pRoot->nC
291a0 65 6c 6c 3e 30 20 29 7b 0a 20 20 20 20 70 43 75  ell>0 ){.    pCu
291b0 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
291c0 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 7d 65 6c 73  OR_VALID;.  }els
291d0 65 20 69 66 28 20 21 70 52 6f 6f 74 2d 3e 6c 65  e if( !pRoot->le
291e0 61 66 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 73  af ){.    Pgno s
291f0 75 62 70 61 67 65 3b 0a 20 20 20 20 69 66 28 20  ubpage;.    if( 
29200 70 52 6f 6f 74 2d 3e 70 67 6e 6f 21 3d 31 20 29  pRoot->pgno!=1 )
29210 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
29220 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
29230 20 73 75 62 70 61 67 65 20 3d 20 67 65 74 34 62   subpage = get4b
29240 79 74 65 28 26 70 52 6f 6f 74 2d 3e 61 44 61 74  yte(&pRoot->aDat
29250 61 5b 70 52 6f 6f 74 2d 3e 68 64 72 4f 66 66 73  a[pRoot->hdrOffs
29260 65 74 2b 38 5d 29 3b 0a 20 20 20 20 70 43 75 72  et+8]);.    pCur
29270 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
29280 52 5f 56 41 4c 49 44 3b 0a 20 20 20 20 72 63 20  R_VALID;.    rc 
29290 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43  = moveToChild(pC
292a0 75 72 2c 20 73 75 62 70 61 67 65 29 3b 0a 20 20  ur, subpage);.  
292b0 7d 65 6c 73 65 7b 0a 20 20 20 20 70 43 75 72 2d  }else{.    pCur-
292c0 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
292d0 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 7d 0a 20 20  _INVALID;.  }.  
292e0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
292f0 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72  .** Move the cur
29300 73 6f 72 20 64 6f 77 6e 20 74 6f 20 74 68 65 20  sor down to the 
29310 6c 65 66 74 2d 6d 6f 73 74 20 6c 65 61 66 20 65  left-most leaf e
29320 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74 68 65  ntry beneath the
29330 0a 2a 2a 20 65 6e 74 72 79 20 74 6f 20 77 68 69  .** entry to whi
29340 63 68 20 69 74 20 69 73 20 63 75 72 72 65 6e 74  ch it is current
29350 6c 79 20 70 6f 69 6e 74 69 6e 67 2e 0a 2a 2a 0a  ly pointing..**.
29360 2a 2a 20 54 68 65 20 6c 65 66 74 2d 6d 6f 73 74  ** The left-most
29370 20 6c 65 61 66 20 69 73 20 74 68 65 20 6f 6e 65   leaf is the one
29380 20 77 69 74 68 20 74 68 65 20 73 6d 61 6c 6c 65   with the smalle
29390 73 74 20 6b 65 79 20 2d 20 74 68 65 20 66 69 72  st key - the fir
293a0 73 74 0a 2a 2a 20 69 6e 20 61 73 63 65 6e 64 69  st.** in ascendi
293b0 6e 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61  ng order..*/.sta
293c0 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 4c 65  tic int moveToLe
293d0 66 74 6d 6f 73 74 28 42 74 43 75 72 73 6f 72 20  ftmost(BtCursor 
293e0 2a 70 43 75 72 29 7b 0a 20 20 50 67 6e 6f 20 70  *pCur){.  Pgno p
293f0 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  gno;.  int rc = 
29400 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 4d 65 6d  SQLITE_OK;.  Mem
29410 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20  Page *pPage;..  
29420 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
29430 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
29440 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
29450 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
29460 5f 56 41 4c 49 44 20 29 3b 0a 20 20 77 68 69 6c  _VALID );.  whil
29470 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc==SQLITE_OK
29480 20 26 26 20 21 28 70 50 61 67 65 20 3d 20 70 43   && !(pPage = pC
29490 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
294a0 3e 69 50 61 67 65 5d 29 2d 3e 6c 65 61 66 20 29  >iPage])->leaf )
294b0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  {.    assert( pC
294c0 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
294d0 69 50 61 67 65 5d 3c 70 50 61 67 65 2d 3e 6e 43  iPage]<pPage->nC
294e0 65 6c 6c 20 29 3b 0a 20 20 20 20 70 67 6e 6f 20  ell );.    pgno 
294f0 3d 20 67 65 74 34 62 79 74 65 28 66 69 6e 64 43  = get4byte(findC
29500 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 75 72 2d  ell(pPage, pCur-
29510 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
29520 67 65 5d 29 29 3b 0a 20 20 20 20 72 63 20 3d 20  ge]));.    rc = 
29530 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72  moveToChild(pCur
29540 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72  , pgno);.  }.  r
29550 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
29560 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73  ** Move the curs
29570 6f 72 20 64 6f 77 6e 20 74 6f 20 74 68 65 20 72  or down to the r
29580 69 67 68 74 2d 6d 6f 73 74 20 6c 65 61 66 20 65  ight-most leaf e
29590 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74 68 65  ntry beneath the
295a0 0a 2a 2a 20 70 61 67 65 20 74 6f 20 77 68 69 63  .** page to whic
295b0 68 20 69 74 20 69 73 20 63 75 72 72 65 6e 74 6c  h it is currentl
295c0 79 20 70 6f 69 6e 74 69 6e 67 2e 20 20 4e 6f 74  y pointing.  Not
295d0 69 63 65 20 74 68 65 20 64 69 66 66 65 72 65 6e  ice the differen
295e0 63 65 0a 2a 2a 20 62 65 74 77 65 65 6e 20 6d 6f  ce.** between mo
295f0 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 29 20 61  veToLeftmost() a
29600 6e 64 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f  nd moveToRightmo
29610 73 74 28 29 2e 20 20 6d 6f 76 65 54 6f 4c 65 66  st().  moveToLef
29620 74 6d 6f 73 74 28 29 0a 2a 2a 20 66 69 6e 64 73  tmost().** finds
29630 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 65   the left-most e
29640 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74 68 65  ntry beneath the
29650 20 2a 65 6e 74 72 79 2a 20 77 68 65 72 65 61 73   *entry* whereas
29660 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74   moveToRightmost
29670 28 29 0a 2a 2a 20 66 69 6e 64 73 20 74 68 65 20  ().** finds the 
29680 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79  right-most entry
29690 20 62 65 6e 65 61 74 68 20 74 68 65 20 2a 70 61   beneath the *pa
296a0 67 65 2a 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72  ge*..**.** The r
296b0 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20  ight-most entry 
296c0 69 73 20 74 68 65 20 6f 6e 65 20 77 69 74 68 20  is the one with 
296d0 74 68 65 20 6c 61 72 67 65 73 74 20 6b 65 79 20  the largest key 
296e0 2d 20 74 68 65 20 6c 61 73 74 0a 2a 2a 20 6b 65  - the last.** ke
296f0 79 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f  y in ascending o
29700 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rder..*/.static 
29710 69 6e 74 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d  int moveToRightm
29720 6f 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ost(BtCursor *pC
29730 75 72 29 7b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  ur){.  Pgno pgno
29740 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
29750 49 54 45 5f 4f 4b 3b 0a 20 20 4d 65 6d 50 61 67  ITE_OK;.  MemPag
29760 65 20 2a 70 50 61 67 65 20 3d 20 30 3b 0a 0a 20  e *pPage = 0;.. 
29770 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
29780 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
29790 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
297a0 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
297b0 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 77 68 69  R_VALID );.  whi
297c0 6c 65 28 20 21 28 70 50 61 67 65 20 3d 20 70 43  le( !(pPage = pC
297d0 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
297e0 3e 69 50 61 67 65 5d 29 2d 3e 6c 65 61 66 20 29  >iPage])->leaf )
297f0 7b 0a 20 20 20 20 70 67 6e 6f 20 3d 20 67 65 74  {.    pgno = get
29800 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44  4byte(&pPage->aD
29810 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66  ata[pPage->hdrOf
29820 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 70 43  fset+8]);.    pC
29830 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
29840 69 50 61 67 65 5d 20 3d 20 70 50 61 67 65 2d 3e  iPage] = pPage->
29850 6e 43 65 6c 6c 3b 0a 20 20 20 20 72 63 20 3d 20  nCell;.    rc = 
29860 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72  moveToChild(pCur
29870 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 69 66 28  , pgno);.    if(
29880 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
29890 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 61 69 49  .  }.  pCur->aiI
298a0 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20  dx[pCur->iPage] 
298b0 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31  = pPage->nCell-1
298c0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
298d0 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20  ->info.nSize==0 
298e0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 43  );.  assert( (pC
298f0 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42  ur->curFlags & B
29900 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 29 3d 3d  TCF_ValidNKey)==
29910 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  0 );.  return SQ
29920 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 4d  LITE_OK;.}../* M
29930 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 74  ove the cursor t
29940 6f 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72  o the first entr
29950 79 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20  y in the table. 
29960 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
29970 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 2e  K.** on success.
29980 20 20 53 65 74 20 2a 70 52 65 73 20 74 6f 20 30    Set *pRes to 0
29990 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 61   if the cursor a
299a0 63 74 75 61 6c 6c 79 20 70 6f 69 6e 74 73 20 74  ctually points t
299b0 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f  o something.** o
299c0 72 20 73 65 74 20 2a 70 52 65 73 20 74 6f 20 31  r set *pRes to 1
299d0 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 69 73   if the table is
299e0 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73   empty..*/.int s
299f0 71 6c 69 74 65 33 42 74 72 65 65 46 69 72 73 74  qlite3BtreeFirst
29a00 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
29a10 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69   int *pRes){.  i
29a20 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74  nt rc;..  assert
29a30 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
29a40 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ex(pCur) );.  as
29a50 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
29a60 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70  tex_held(pCur->p
29a70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78  Btree->db->mutex
29a80 29 20 29 3b 0a 20 20 72 63 20 3d 20 6d 6f 76 65  ) );.  rc = move
29a90 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20  ToRoot(pCur);.  
29aa0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
29ab0 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75  K ){.    if( pCu
29ac0 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
29ad0 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20  R_INVALID ){.   
29ae0 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
29af0 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20  >pgnoRoot==0 || 
29b00 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
29b10 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c  r->iPage]->nCell
29b20 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 2a 70 52  ==0 );.      *pR
29b30 65 73 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73  es = 1;.    }els
29b40 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
29b50 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
29b60 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c  ur->iPage]->nCel
29b70 6c 3e 30 20 29 3b 0a 20 20 20 20 20 20 2a 70 52  l>0 );.      *pR
29b80 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63  es = 0;.      rc
29b90 20 3d 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73   = moveToLeftmos
29ba0 74 28 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20  t(pCur);.    }. 
29bb0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
29bc0 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63  }../* Move the c
29bd0 75 72 73 6f 72 20 74 6f 20 74 68 65 20 6c 61 73  ursor to the las
29be0 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74  t entry in the t
29bf0 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 53 51  able.  Return SQ
29c00 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75  LITE_OK.** on su
29c10 63 63 65 73 73 2e 20 20 53 65 74 20 2a 70 52 65  ccess.  Set *pRe
29c20 73 20 74 6f 20 30 20 69 66 20 74 68 65 20 63 75  s to 0 if the cu
29c30 72 73 6f 72 20 61 63 74 75 61 6c 6c 79 20 70 6f  rsor actually po
29c40 69 6e 74 73 20 74 6f 20 73 6f 6d 65 74 68 69 6e  ints to somethin
29c50 67 0a 2a 2a 20 6f 72 20 73 65 74 20 2a 70 52 65  g.** or set *pRe
29c60 73 20 74 6f 20 31 20 69 66 20 74 68 65 20 74 61  s to 1 if the ta
29c70 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f  ble is empty..*/
29c80 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
29c90 65 4c 61 73 74 28 42 74 43 75 72 73 6f 72 20 2a  eLast(BtCursor *
29ca0 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29  pCur, int *pRes)
29cb0 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 0a 20 20  {.  int rc;. .  
29cc0 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
29cd0 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
29ce0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
29cf0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
29d00 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d  Cur->pBtree->db-
29d10 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a  >mutex) );..  /*
29d20 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 61   If the cursor a
29d30 6c 72 65 61 64 79 20 70 6f 69 6e 74 73 20 74 6f  lready points to
29d40 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 2c   the last entry,
29d50 20 74 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70   this is a no-op
29d60 2e 20 2a 2f 0a 20 20 69 66 28 20 43 55 52 53 4f  . */.  if( CURSO
29d70 52 5f 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65  R_VALID==pCur->e
29d80 53 74 61 74 65 20 26 26 20 28 70 43 75 72 2d 3e  State && (pCur->
29d90 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f  curFlags & BTCF_
29da0 41 74 4c 61 73 74 29 21 3d 30 20 29 7b 0a 23 69  AtLast)!=0 ){.#i
29db0 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
29dc0 47 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 62 6c  G.    /* This bl
29dd0 6f 63 6b 20 73 65 72 76 65 73 20 74 6f 20 61 73  ock serves to as
29de0 73 65 72 74 28 29 20 74 68 61 74 20 74 68 65 20  sert() that the 
29df0 63 75 72 73 6f 72 20 72 65 61 6c 6c 79 20 64 6f  cursor really do
29e00 65 73 20 70 6f 69 6e 74 20 0a 20 20 20 20 2a 2a  es point .    **
29e10 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74   to the last ent
29e20 72 79 20 69 6e 20 74 68 65 20 62 2d 74 72 65 65  ry in the b-tree
29e30 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 69 3b  . */.    int ii;
29e40 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69  .    for(ii=0; i
29e50 69 3c 70 43 75 72 2d 3e 69 50 61 67 65 3b 20 69  i<pCur->iPage; i
29e60 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65  i++){.      asse
29e70 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  rt( pCur->aiIdx[
29e80 69 69 5d 3d 3d 70 43 75 72 2d 3e 61 70 50 61 67  ii]==pCur->apPag
29e90 65 5b 69 69 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  e[ii]->nCell );.
29ea0 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
29eb0 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  ( pCur->aiIdx[pC
29ec0 75 72 2d 3e 69 50 61 67 65 5d 3d 3d 70 43 75 72  ur->iPage]==pCur
29ed0 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
29ee0 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 2d 31 20 29  Page]->nCell-1 )
29ef0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  ;.    assert( pC
29f00 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
29f10 3e 69 50 61 67 65 5d 2d 3e 6c 65 61 66 20 29 3b  >iPage]->leaf );
29f20 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 65 74 75  .#endif.    retu
29f30 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
29f40 7d 0a 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f  }..  rc = moveTo
29f50 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 69 66  Root(pCur);.  if
29f60 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
29f70 29 7b 0a 20 20 20 20 69 66 28 20 43 55 52 53 4f  ){.    if( CURSO
29f80 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d  R_INVALID==pCur-
29f90 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20 20  >eState ){.     
29fa0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70   assert( pCur->p
29fb0 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43  gnoRoot==0 || pC
29fc0 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
29fd0 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d  >iPage]->nCell==
29fe0 30 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73  0 );.      *pRes
29ff0 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 1;.    }else{
2a000 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
2a010 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
2a020 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20  SOR_VALID );.   
2a030 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20     *pRes = 0;.  
2a040 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52      rc = moveToR
2a050 69 67 68 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a  ightmost(pCur);.
2a060 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
2a070 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2a080 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67     pCur->curFlag
2a090 73 20 7c 3d 20 42 54 43 46 5f 41 74 4c 61 73 74  s |= BTCF_AtLast
2a0a0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
2a0b0 20 20 20 20 20 20 20 70 43 75 72 2d 3e 63 75 72         pCur->cur
2a0c0 46 6c 61 67 73 20 26 3d 20 7e 42 54 43 46 5f 41  Flags &= ~BTCF_A
2a0d0 74 4c 61 73 74 3b 0a 20 20 20 20 20 20 7d 0a 20  tLast;.      }. 
2a0e0 20 20 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72    .    }.  }.  r
2a0f0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20  eturn rc;.}../* 
2a100 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20  Move the cursor 
2a110 73 6f 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74  so that it point
2a120 73 20 74 6f 20 61 6e 20 65 6e 74 72 79 20 6e 65  s to an entry ne
2a130 61 72 20 74 68 65 20 6b 65 79 20 0a 2a 2a 20 73  ar the key .** s
2a140 70 65 63 69 66 69 65 64 20 62 79 20 70 49 64 78  pecified by pIdx
2a150 4b 65 79 20 6f 72 20 69 6e 74 4b 65 79 2e 20 20  Key or intKey.  
2a160 20 52 65 74 75 72 6e 20 61 20 73 75 63 63 65 73   Return a succes
2a170 73 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f  s code..**.** Fo
2a180 72 20 49 4e 54 4b 45 59 20 74 61 62 6c 65 73 2c  r INTKEY tables,
2a190 20 74 68 65 20 69 6e 74 4b 65 79 20 70 61 72 61   the intKey para
2a1a0 6d 65 74 65 72 20 69 73 20 75 73 65 64 2e 20 20  meter is used.  
2a1b0 70 49 64 78 4b 65 79 20 0a 2a 2a 20 6d 75 73 74  pIdxKey .** must
2a1c0 20 62 65 20 4e 55 4c 4c 2e 20 20 46 6f 72 20 69   be NULL.  For i
2a1d0 6e 64 65 78 20 74 61 62 6c 65 73 2c 20 70 49 64  ndex tables, pId
2a1e0 78 4b 65 79 20 69 73 20 75 73 65 64 20 61 6e 64  xKey is used and
2a1f0 20 69 6e 74 4b 65 79 0a 2a 2a 20 69 73 20 69 67   intKey.** is ig
2a200 6e 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  nored..**.** If 
2a210 61 6e 20 65 78 61 63 74 20 6d 61 74 63 68 20 69  an exact match i
2a220 73 20 6e 6f 74 20 66 6f 75 6e 64 2c 20 74 68 65  s not found, the
2a230 6e 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  n the cursor is 
2a240 61 6c 77 61 79 73 0a 2a 2a 20 6c 65 66 74 20 70  always.** left p
2a250 6f 69 6e 74 69 6e 67 20 61 74 20 61 20 6c 65 61  ointing at a lea
2a260 66 20 70 61 67 65 20 77 68 69 63 68 20 77 6f 75  f page which wou
2a270 6c 64 20 68 6f 6c 64 20 74 68 65 20 65 6e 74 72  ld hold the entr
2a280 79 20 69 66 20 69 74 0a 2a 2a 20 77 65 72 65 20  y if it.** were 
2a290 70 72 65 73 65 6e 74 2e 20 20 54 68 65 20 63 75  present.  The cu
2a2a0 72 73 6f 72 20 6d 69 67 68 74 20 70 6f 69 6e 74  rsor might point
2a2b0 20 74 6f 20 61 6e 20 65 6e 74 72 79 20 74 68 61   to an entry tha
2a2c0 74 20 63 6f 6d 65 73 0a 2a 2a 20 62 65 66 6f 72  t comes.** befor
2a2d0 65 20 6f 72 20 61 66 74 65 72 20 74 68 65 20 6b  e or after the k
2a2e0 65 79 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 69 6e 74  ey..**.** An int
2a2f0 65 67 65 72 20 69 73 20 77 72 69 74 74 65 6e 20  eger is written 
2a300 69 6e 74 6f 20 2a 70 52 65 73 20 77 68 69 63 68  into *pRes which
2a310 20 69 73 20 74 68 65 20 72 65 73 75 6c 74 20 6f   is the result o
2a320 66 0a 2a 2a 20 63 6f 6d 70 61 72 69 6e 67 20 74  f.** comparing t
2a330 68 65 20 6b 65 79 20 77 69 74 68 20 74 68 65 20  he key with the 
2a340 65 6e 74 72 79 20 74 6f 20 77 68 69 63 68 20 74  entry to which t
2a350 68 65 20 63 75 72 73 6f 72 20 69 73 20 0a 2a 2a  he cursor is .**
2a360 20 70 6f 69 6e 74 69 6e 67 2e 20 20 54 68 65 20   pointing.  The 
2a370 6d 65 61 6e 69 6e 67 20 6f 66 20 74 68 65 20 69  meaning of the i
2a380 6e 74 65 67 65 72 20 77 72 69 74 74 65 6e 20 69  nteger written i
2a390 6e 74 6f 0a 2a 2a 20 2a 70 52 65 73 20 69 73 20  nto.** *pRes is 
2a3a0 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  as follows:.**.*
2a3b0 2a 20 20 20 20 20 2a 70 52 65 73 3c 30 20 20 20  *     *pRes<0   
2a3c0 20 20 20 54 68 65 20 63 75 72 73 6f 72 20 69 73     The cursor is
2a3d0 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61   left pointing a
2a3e0 74 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74 0a  t an entry that.
2a3f0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
2a400 20 20 20 20 69 73 20 73 6d 61 6c 6c 65 72 20 74      is smaller t
2a410 68 61 6e 20 69 6e 74 4b 65 79 2f 70 49 64 78 4b  han intKey/pIdxK
2a420 65 79 20 6f 72 20 69 66 20 74 68 65 20 74 61 62  ey or if the tab
2a430 6c 65 20 69 73 20 65 6d 70 74 79 0a 2a 2a 20 20  le is empty.**  
2a440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a450 61 6e 64 20 74 68 65 20 63 75 72 73 6f 72 20 69  and the cursor i
2a460 73 20 74 68 65 72 65 66 6f 72 65 20 6c 65 66 74  s therefore left
2a470 20 70 6f 69 6e 74 20 74 6f 20 6e 6f 74 68 69 6e   point to nothin
2a480 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52  g..**.**     *pR
2a490 65 73 3d 3d 30 20 20 20 20 20 54 68 65 20 63 75  es==0     The cu
2a4a0 72 73 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69  rsor is left poi
2a4b0 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72  nting at an entr
2a4c0 79 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20  y that.**       
2a4d0 20 20 20 20 20 20 20 20 20 20 20 65 78 61 63 74             exact
2a4e0 6c 79 20 6d 61 74 63 68 65 73 20 69 6e 74 4b 65  ly matches intKe
2a4f0 79 2f 70 49 64 78 4b 65 79 2e 0a 2a 2a 0a 2a 2a  y/pIdxKey..**.**
2a500 20 20 20 20 20 2a 70 52 65 73 3e 30 20 20 20 20       *pRes>0    
2a510 20 20 54 68 65 20 63 75 72 73 6f 72 20 69 73 20    The cursor is 
2a520 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74  left pointing at
2a530 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74 0a 2a   an entry that.*
2a540 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
2a550 20 20 20 69 73 20 6c 61 72 67 65 72 20 74 68 61     is larger tha
2a560 6e 20 69 6e 74 4b 65 79 2f 70 49 64 78 4b 65 79  n intKey/pIdxKey
2a570 2e 0a 2a 2a 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ..**.*/.int sqli
2a580 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e  te3BtreeMovetoUn
2a590 70 61 63 6b 65 64 28 0a 20 20 42 74 43 75 72 73  packed(.  BtCurs
2a5a0 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20 20  or *pCur,       
2a5b0 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72     /* The cursor
2a5c0 20 74 6f 20 62 65 20 6d 6f 76 65 64 20 2a 2f 0a   to be moved */.
2a5d0 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64    UnpackedRecord
2a5e0 20 2a 70 49 64 78 4b 65 79 2c 20 2f 2a 20 55 6e   *pIdxKey, /* Un
2a5f0 70 61 63 6b 65 64 20 69 6e 64 65 78 20 6b 65 79  packed index key
2a600 20 2a 2f 0a 20 20 69 36 34 20 69 6e 74 4b 65 79   */.  i64 intKey
2a610 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
2a620 2a 20 54 68 65 20 74 61 62 6c 65 20 6b 65 79 20  * The table key 
2a630 2a 2f 0a 20 20 69 6e 74 20 62 69 61 73 52 69 67  */.  int biasRig
2a640 68 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ht,           /*
2a650 20 49 66 20 74 72 75 65 2c 20 62 69 61 73 20 74   If true, bias t
2a660 68 65 20 73 65 61 72 63 68 20 74 6f 20 74 68 65  he search to the
2a670 20 68 69 67 68 20 65 6e 64 20 2a 2f 0a 20 20 69   high end */.  i
2a680 6e 74 20 2a 70 52 65 73 20 20 20 20 20 20 20 20  nt *pRes        
2a690 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
2a6a0 20 73 65 61 72 63 68 20 72 65 73 75 6c 74 73 20   search results 
2a6b0 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  here */.){.  int
2a6c0 20 72 63 3b 0a 20 20 52 65 63 6f 72 64 43 6f 6d   rc;.  RecordCom
2a6d0 70 61 72 65 20 78 52 65 63 6f 72 64 43 6f 6d 70  pare xRecordComp
2a6e0 61 72 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  are;..  assert( 
2a6f0 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
2a700 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
2a710 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
2a720 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74  x_held(pCur->pBt
2a730 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  ree->db->mutex) 
2a740 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 52 65  );.  assert( pRe
2a750 73 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  s );.  assert( (
2a760 70 49 64 78 4b 65 79 3d 3d 30 29 3d 3d 28 70 43  pIdxKey==0)==(pC
2a770 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d 30 29  ur->pKeyInfo==0)
2a780 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65   );..  /* If the
2a790 20 63 75 72 73 6f 72 20 69 73 20 61 6c 72 65 61   cursor is alrea
2a7a0 64 79 20 70 6f 73 69 74 69 6f 6e 65 64 20 61 74  dy positioned at
2a7b0 20 74 68 65 20 70 6f 69 6e 74 20 77 65 20 61 72   the point we ar
2a7c0 65 20 74 72 79 69 6e 67 0a 20 20 2a 2a 20 74 6f  e trying.  ** to
2a7d0 20 6d 6f 76 65 20 74 6f 2c 20 74 68 65 6e 20 6a   move to, then j
2a7e0 75 73 74 20 72 65 74 75 72 6e 20 77 69 74 68 6f  ust return witho
2a7f0 75 74 20 64 6f 69 6e 67 20 61 6e 79 20 77 6f 72  ut doing any wor
2a800 6b 20 2a 2f 0a 20 20 69 66 28 20 70 43 75 72 2d  k */.  if( pCur-
2a810 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
2a820 56 41 4c 49 44 20 26 26 20 28 70 43 75 72 2d 3e  VALID && (pCur->
2a830 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f  curFlags & BTCF_
2a840 56 61 6c 69 64 4e 4b 65 79 29 21 3d 30 0a 20 20  ValidNKey)!=0.  
2a850 20 26 26 20 70 43 75 72 2d 3e 63 75 72 49 6e 74   && pCur->curInt
2a860 4b 65 79 20 0a 20 20 29 7b 0a 20 20 20 20 69 66  Key .  ){.    if
2a870 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65  ( pCur->info.nKe
2a880 79 3d 3d 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20  y==intKey ){.   
2a890 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20     *pRes = 0;.  
2a8a0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2a8b0 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  E_OK;.    }.    
2a8c0 69 66 28 20 28 70 43 75 72 2d 3e 63 75 72 46 6c  if( (pCur->curFl
2a8d0 61 67 73 20 26 20 42 54 43 46 5f 41 74 4c 61 73  ags & BTCF_AtLas
2a8e0 74 29 21 3d 30 20 26 26 20 70 43 75 72 2d 3e 69  t)!=0 && pCur->i
2a8f0 6e 66 6f 2e 6e 4b 65 79 3c 69 6e 74 4b 65 79 20  nfo.nKey<intKey 
2a900 29 7b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d  ){.      *pRes =
2a910 20 2d 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72   -1;.      retur
2a920 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
2a930 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 49   }.  }..  if( pI
2a940 64 78 4b 65 79 20 29 7b 0a 20 20 20 20 78 52 65  dxKey ){.    xRe
2a950 63 6f 72 64 43 6f 6d 70 61 72 65 20 3d 20 73 71  cordCompare = sq
2a960 6c 69 74 65 33 56 64 62 65 46 69 6e 64 43 6f 6d  lite3VdbeFindCom
2a970 70 61 72 65 28 70 49 64 78 4b 65 79 29 3b 0a 20  pare(pIdxKey);. 
2a980 20 20 20 70 49 64 78 4b 65 79 2d 3e 65 72 72 43     pIdxKey->errC
2a990 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 61 73 73  ode = 0;.    ass
2a9a0 65 72 74 28 20 70 49 64 78 4b 65 79 2d 3e 64 65  ert( pIdxKey->de
2a9b0 66 61 75 6c 74 5f 72 63 3d 3d 31 20 0a 20 20 20  fault_rc==1 .   
2a9c0 20 20 20 20 20 20 7c 7c 20 70 49 64 78 4b 65 79        || pIdxKey
2a9d0 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3d 3d 30 20  ->default_rc==0 
2a9e0 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 49 64  .         || pId
2a9f0 78 4b 65 79 2d 3e 64 65 66 61 75 6c 74 5f 72 63  xKey->default_rc
2aa00 3d 3d 2d 31 0a 20 20 20 20 29 3b 0a 20 20 7d 65  ==-1.    );.  }e
2aa10 6c 73 65 7b 0a 20 20 20 20 78 52 65 63 6f 72 64  lse{.    xRecord
2aa20 43 6f 6d 70 61 72 65 20 3d 20 30 3b 20 2f 2a 20  Compare = 0; /* 
2aa30 41 6c 6c 20 6b 65 79 73 20 61 72 65 20 69 6e 74  All keys are int
2aa40 65 67 65 72 73 20 2a 2f 0a 20 20 7d 0a 0a 20 20  egers */.  }..  
2aa50 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28  rc = moveToRoot(
2aa60 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 20  pCur);.  if( rc 
2aa70 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
2aa80 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
2aa90 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d  pCur->pgnoRoot==
2aaa0 30 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61 67  0 || pCur->apPag
2aab0 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 29  e[pCur->iPage] )
2aac0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
2aad0 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c  ->pgnoRoot==0 ||
2aae0 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
2aaf0 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 69 73 49 6e  ur->iPage]->isIn
2ab00 69 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  it );.  assert( 
2ab10 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
2ab20 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 7c 7c 20  RSOR_INVALID || 
2ab30 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
2ab40 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c  r->iPage]->nCell
2ab50 3e 30 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72  >0 );.  if( pCur
2ab60 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
2ab70 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20 20  _INVALID ){.    
2ab80 2a 70 52 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20  *pRes = -1;.    
2ab90 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 67  assert( pCur->pg
2aba0 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75  noRoot==0 || pCu
2abb0 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
2abc0 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30  iPage]->nCell==0
2abd0 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   );.    return S
2abe0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
2abf0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70  assert( pCur->ap
2ac00 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 3d  Page[0]->intKey=
2ac10 3d 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79  =pCur->curIntKey
2ac20 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
2ac30 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79 20 7c 7c  ur->curIntKey ||
2ac40 20 70 49 64 78 4b 65 79 20 29 3b 0a 20 20 66 6f   pIdxKey );.  fo
2ac50 72 28 3b 3b 29 7b 0a 20 20 20 20 69 6e 74 20 6c  r(;;){.    int l
2ac60 77 72 2c 20 75 70 72 2c 20 69 64 78 2c 20 63 3b  wr, upr, idx, c;
2ac70 0a 20 20 20 20 50 67 6e 6f 20 63 68 6c 64 50 67  .    Pgno chldPg
2ac80 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70  ;.    MemPage *p
2ac90 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50  Page = pCur->apP
2aca0 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
2acb0 3b 0a 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 3b  ;.    u8 *pCell;
2acc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2acd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
2ace0 6e 74 65 72 20 74 6f 20 63 75 72 72 65 6e 74 20  nter to current 
2acf0 63 65 6c 6c 20 69 6e 20 70 50 61 67 65 20 2a 2f  cell in pPage */
2ad00 0a 0a 20 20 20 20 2f 2a 20 70 50 61 67 65 2d 3e  ..    /* pPage->
2ad10 6e 43 65 6c 6c 20 6d 75 73 74 20 62 65 20 67 72  nCell must be gr
2ad20 65 61 74 65 72 20 74 68 61 6e 20 7a 65 72 6f 2e  eater than zero.
2ad30 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20   If this is the 
2ad40 72 6f 6f 74 2d 70 61 67 65 0a 20 20 20 20 2a 2a  root-page.    **
2ad50 20 74 68 65 20 63 75 72 73 6f 72 20 77 6f 75 6c   the cursor woul
2ad60 64 20 68 61 76 65 20 62 65 65 6e 20 49 4e 56 41  d have been INVA
2ad70 4c 49 44 20 61 62 6f 76 65 20 61 6e 64 20 74 68  LID above and th
2ad80 69 73 20 66 6f 72 28 3b 3b 29 20 6c 6f 6f 70 0a  is for(;;) loop.
2ad90 20 20 20 20 2a 2a 20 6e 6f 74 20 72 75 6e 2e 20      ** not run. 
2ada0 49 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20 74  If this is not t
2adb0 68 65 20 72 6f 6f 74 2d 70 61 67 65 2c 20 74 68  he root-page, th
2adc0 65 6e 20 74 68 65 20 6d 6f 76 65 54 6f 43 68 69  en the moveToChi
2add0 6c 64 28 29 20 72 6f 75 74 69 6e 65 0a 20 20 20  ld() routine.   
2ade0 20 2a 2a 20 77 6f 75 6c 64 20 68 61 76 65 20 61   ** would have a
2adf0 6c 72 65 61 64 79 20 64 65 74 65 63 74 65 64 20  lready detected 
2ae00 64 62 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20 53  db corruption. S
2ae10 69 6d 69 6c 61 72 6c 79 2c 20 70 50 61 67 65 20  imilarly, pPage 
2ae20 6d 75 73 74 0a 20 20 20 20 2a 2a 20 62 65 20 74  must.    ** be t
2ae30 68 65 20 72 69 67 68 74 20 6b 69 6e 64 20 28 69  he right kind (i
2ae40 6e 64 65 78 20 6f 72 20 74 61 62 6c 65 29 20 6f  ndex or table) o
2ae50 66 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20 4f  f b-tree page. O
2ae60 74 68 65 72 77 69 73 65 0a 20 20 20 20 2a 2a 20  therwise.    ** 
2ae70 61 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 29 20  a moveToChild() 
2ae80 6f 72 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 29 20  or moveToRoot() 
2ae90 63 61 6c 6c 20 77 6f 75 6c 64 20 68 61 76 65 20  call would have 
2aea0 64 65 74 65 63 74 65 64 20 63 6f 72 72 75 70 74  detected corrupt
2aeb0 69 6f 6e 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73  ion.  */.    ass
2aec0 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c  ert( pPage->nCel
2aed0 6c 3e 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  l>0 );.    asser
2aee0 74 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  t( pPage->intKey
2aef0 3d 3d 28 70 49 64 78 4b 65 79 3d 3d 30 29 20 29  ==(pIdxKey==0) )
2af00 3b 0a 20 20 20 20 6c 77 72 20 3d 20 30 3b 0a 20  ;.    lwr = 0;. 
2af10 20 20 20 75 70 72 20 3d 20 70 50 61 67 65 2d 3e     upr = pPage->
2af20 6e 43 65 6c 6c 2d 31 3b 0a 20 20 20 20 61 73 73  nCell-1;.    ass
2af30 65 72 74 28 20 62 69 61 73 52 69 67 68 74 3d 3d  ert( biasRight==
2af40 30 20 7c 7c 20 62 69 61 73 52 69 67 68 74 3d 3d  0 || biasRight==
2af50 31 20 29 3b 0a 20 20 20 20 69 64 78 20 3d 20 75  1 );.    idx = u
2af60 70 72 3e 3e 28 31 2d 62 69 61 73 52 69 67 68 74  pr>>(1-biasRight
2af70 29 3b 20 2f 2a 20 69 64 78 20 3d 20 62 69 61 73  ); /* idx = bias
2af80 52 69 67 68 74 20 3f 20 75 70 72 20 3a 20 28 6c  Right ? upr : (l
2af90 77 72 2b 75 70 72 29 2f 32 3b 20 2a 2f 0a 20 20  wr+upr)/2; */.  
2afa0 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43    pCur->aiIdx[pC
2afb0 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75 31  ur->iPage] = (u1
2afc0 36 29 69 64 78 3b 0a 20 20 20 20 69 66 28 20 78  6)idx;.    if( x
2afd0 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 3d 3d 30  RecordCompare==0
2afe0 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 3b 3b   ){.      for(;;
2aff0 29 7b 0a 20 20 20 20 20 20 20 20 69 36 34 20 6e  ){.        i64 n
2b000 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20 20  CellKey;.       
2b010 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c   pCell = findCel
2b020 6c 50 61 73 74 50 74 72 28 70 50 61 67 65 2c 20  lPastPtr(pPage, 
2b030 69 64 78 29 3b 0a 20 20 20 20 20 20 20 20 69 66  idx);.        if
2b040 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c  ( pPage->intKeyL
2b050 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20  eaf ){.         
2b060 20 77 68 69 6c 65 28 20 30 78 38 30 20 3c 3d 20   while( 0x80 <= 
2b070 2a 28 70 43 65 6c 6c 2b 2b 29 20 29 7b 0a 20 20  *(pCell++) ){.  
2b080 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 43            if( pC
2b090 65 6c 6c 3e 3d 70 50 61 67 65 2d 3e 61 44 61 74  ell>=pPage->aDat
2b0a0 61 45 6e 64 20 29 20 72 65 74 75 72 6e 20 53 51  aEnd ) return SQ
2b0b0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
2b0c0 54 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  T;.          }. 
2b0d0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2b0e0 20 67 65 74 56 61 72 69 6e 74 28 70 43 65 6c 6c   getVarint(pCell
2b0f0 2c 20 28 75 36 34 2a 29 26 6e 43 65 6c 6c 4b 65  , (u64*)&nCellKe
2b100 79 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  y);.        if( 
2b110 6e 43 65 6c 6c 4b 65 79 3c 69 6e 74 4b 65 79 20  nCellKey<intKey 
2b120 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6c 77 72  ){.          lwr
2b130 20 3d 20 69 64 78 2b 31 3b 0a 20 20 20 20 20 20   = idx+1;.      
2b140 20 20 20 20 69 66 28 20 6c 77 72 3e 75 70 72 20      if( lwr>upr 
2b150 29 7b 20 63 20 3d 20 2d 31 3b 20 62 72 65 61 6b  ){ c = -1; break
2b160 3b 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ; }.        }els
2b170 65 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3e 69  e if( nCellKey>i
2b180 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20  ntKey ){.       
2b190 20 20 20 75 70 72 20 3d 20 69 64 78 2d 31 3b 0a     upr = idx-1;.
2b1a0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6c 77            if( lw
2b1b0 72 3e 75 70 72 20 29 7b 20 63 20 3d 20 2b 31 3b  r>upr ){ c = +1;
2b1c0 20 62 72 65 61 6b 3b 20 7d 0a 20 20 20 20 20 20   break; }.      
2b1d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2b1e0 20 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c     assert( nCell
2b1f0 4b 65 79 3d 3d 69 6e 74 4b 65 79 20 29 3b 0a 20  Key==intKey );. 
2b200 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 63           pCur->c
2b210 75 72 46 6c 61 67 73 20 7c 3d 20 42 54 43 46 5f  urFlags |= BTCF_
2b220 56 61 6c 69 64 4e 4b 65 79 3b 0a 20 20 20 20 20  ValidNKey;.     
2b230 20 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e       pCur->info.
2b240 6e 4b 65 79 20 3d 20 6e 43 65 6c 6c 4b 65 79 3b  nKey = nCellKey;
2b250 0a 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d  .          pCur-
2b260 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
2b270 67 65 5d 20 3d 20 28 75 31 36 29 69 64 78 3b 0a  ge] = (u16)idx;.
2b280 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21 70            if( !p
2b290 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
2b2a0 20 20 20 20 20 20 20 20 20 20 6c 77 72 20 3d 20            lwr = 
2b2b0 69 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20 20  idx;.           
2b2c0 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 6e 65 78   goto moveto_nex
2b2d0 74 5f 6c 61 79 65 72 3b 0a 20 20 20 20 20 20 20  t_layer;.       
2b2e0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2b2f0 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b        *pRes = 0;
2b300 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
2b310 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
2b320 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f           goto mo
2b330 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20  veto_finish;.   
2b340 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2b350 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72   }.        asser
2b360 74 28 20 6c 77 72 2b 75 70 72 3e 3d 30 20 29 3b  t( lwr+upr>=0 );
2b370 0a 20 20 20 20 20 20 20 20 69 64 78 20 3d 20 28  .        idx = (
2b380 6c 77 72 2b 75 70 72 29 3e 3e 31 3b 20 20 2f 2a  lwr+upr)>>1;  /*
2b390 20 69 64 78 20 3d 20 28 6c 77 72 2b 75 70 72 29   idx = (lwr+upr)
2b3a0 2f 32 3b 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20  /2; */.      }. 
2b3b0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2b3c0 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 20 20 20  for(;;){.       
2b3d0 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 2f 2a 20   int nCell;  /* 
2b3e0 53 69 7a 65 20 6f 66 20 74 68 65 20 70 43 65 6c  Size of the pCel
2b3f0 6c 20 63 65 6c 6c 20 69 6e 20 62 79 74 65 73 20  l cell in bytes 
2b400 2a 2f 0a 20 20 20 20 20 20 20 20 70 43 65 6c 6c  */.        pCell
2b410 20 3d 20 66 69 6e 64 43 65 6c 6c 50 61 73 74 50   = findCellPastP
2b420 74 72 28 70 50 61 67 65 2c 20 69 64 78 29 3b 0a  tr(pPage, idx);.
2b430 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
2b440 6d 61 78 69 6d 75 6d 20 73 75 70 70 6f 72 74 65  maximum supporte
2b450 64 20 70 61 67 65 2d 73 69 7a 65 20 69 73 20 36  d page-size is 6
2b460 35 35 33 36 20 62 79 74 65 73 2e 20 54 68 69 73  5536 bytes. This
2b470 20 6d 65 61 6e 73 20 74 68 61 74 0a 20 20 20 20   means that.    
2b480 20 20 20 20 2a 2a 20 74 68 65 20 6d 61 78 69 6d      ** the maxim
2b490 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 63  um number of rec
2b4a0 6f 72 64 20 62 79 74 65 73 20 73 74 6f 72 65 64  ord bytes stored
2b4b0 20 6f 6e 20 61 6e 20 69 6e 64 65 78 20 42 2d 54   on an index B-T
2b4c0 72 65 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70  ree.        ** p
2b4d0 61 67 65 20 69 73 20 6c 65 73 73 20 74 68 61 6e  age is less than
2b4e0 20 31 36 33 38 34 20 62 79 74 65 73 20 61 6e 64   16384 bytes and
2b4f0 20 6d 61 79 20 62 65 20 73 74 6f 72 65 64 20 61   may be stored a
2b500 73 20 61 20 32 2d 62 79 74 65 0a 20 20 20 20 20  s a 2-byte.     
2b510 20 20 20 2a 2a 20 76 61 72 69 6e 74 2e 20 54 68     ** varint. Th
2b520 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  is information i
2b530 73 20 75 73 65 64 20 74 6f 20 61 74 74 65 6d 70  s used to attemp
2b540 74 20 74 6f 20 61 76 6f 69 64 20 70 61 72 73 69  t to avoid parsi
2b550 6e 67 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ng .        ** t
2b560 68 65 20 65 6e 74 69 72 65 20 63 65 6c 6c 20 62  he entire cell b
2b570 79 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 74  y checking for t
2b580 68 65 20 63 61 73 65 73 20 77 68 65 72 65 20 74  he cases where t
2b590 68 65 20 72 65 63 6f 72 64 20 69 73 20 0a 20 20  he record is .  
2b5a0 20 20 20 20 20 20 2a 2a 20 73 74 6f 72 65 64 20        ** stored 
2b5b0 65 6e 74 69 72 65 6c 79 20 77 69 74 68 69 6e 20  entirely within 
2b5c0 74 68 65 20 62 2d 74 72 65 65 20 70 61 67 65 20  the b-tree page 
2b5d0 62 79 20 69 6e 73 70 65 63 74 69 6e 67 20 74 68  by inspecting th
2b5e0 65 20 66 69 72 73 74 20 0a 20 20 20 20 20 20 20  e first .       
2b5f0 20 2a 2a 20 32 20 62 79 74 65 73 20 6f 66 20 74   ** 2 bytes of t
2b600 68 65 20 63 65 6c 6c 2e 0a 20 20 20 20 20 20 20  he cell..       
2b610 20 2a 2f 0a 20 20 20 20 20 20 20 20 6e 43 65 6c   */.        nCel
2b620 6c 20 3d 20 70 43 65 6c 6c 5b 30 5d 3b 0a 20 20  l = pCell[0];.  
2b630 20 20 20 20 20 20 69 66 28 20 6e 43 65 6c 6c 3c        if( nCell<
2b640 3d 70 50 61 67 65 2d 3e 6d 61 78 31 62 79 74 65  =pPage->max1byte
2b650 50 61 79 6c 6f 61 64 20 29 7b 0a 20 20 20 20 20  Payload ){.     
2b660 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61       /* This bra
2b670 6e 63 68 20 72 75 6e 73 20 69 66 20 74 68 65 20  nch runs if the 
2b680 72 65 63 6f 72 64 2d 73 69 7a 65 20 66 69 65 6c  record-size fiel
2b690 64 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 69 73  d of the cell is
2b6a0 20 61 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20   a.          ** 
2b6b0 73 69 6e 67 6c 65 20 62 79 74 65 20 76 61 72 69  single byte vari
2b6c0 6e 74 20 61 6e 64 20 74 68 65 20 72 65 63 6f 72  nt and the recor
2b6d0 64 20 66 69 74 73 20 65 6e 74 69 72 65 6c 79 20  d fits entirely 
2b6e0 6f 6e 20 74 68 65 20 6d 61 69 6e 0a 20 20 20 20  on the main.    
2b6f0 20 20 20 20 20 20 2a 2a 20 62 2d 74 72 65 65 20        ** b-tree 
2b700 70 61 67 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20  page.  */.      
2b710 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 43      testcase( pC
2b720 65 6c 6c 2b 6e 43 65 6c 6c 2b 31 3d 3d 70 50 61  ell+nCell+1==pPa
2b730 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 29 3b 0a  ge->aDataEnd );.
2b740 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 78 52            c = xR
2b750 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43 65  ecordCompare(nCe
2b760 6c 6c 2c 20 28 76 6f 69 64 2a 29 26 70 43 65 6c  ll, (void*)&pCel
2b770 6c 5b 31 5d 2c 20 70 49 64 78 4b 65 79 29 3b 0a  l[1], pIdxKey);.
2b780 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
2b790 28 20 21 28 70 43 65 6c 6c 5b 31 5d 20 26 20 30  ( !(pCell[1] & 0
2b7a0 78 38 30 29 20 0a 20 20 20 20 20 20 20 20 20 20  x80) .          
2b7b0 26 26 20 28 6e 43 65 6c 6c 20 3d 20 28 28 6e 43  && (nCell = ((nC
2b7c0 65 6c 6c 26 30 78 37 66 29 3c 3c 37 29 20 2b 20  ell&0x7f)<<7) + 
2b7d0 70 43 65 6c 6c 5b 31 5d 29 3c 3d 70 50 61 67 65  pCell[1])<=pPage
2b7e0 2d 3e 6d 61 78 4c 6f 63 61 6c 0a 20 20 20 20 20  ->maxLocal.     
2b7f0 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
2b800 2f 2a 20 54 68 65 20 72 65 63 6f 72 64 2d 73 69  /* The record-si
2b810 7a 65 20 66 69 65 6c 64 20 69 73 20 61 20 32 20  ze field is a 2 
2b820 62 79 74 65 20 76 61 72 69 6e 74 20 61 6e 64 20  byte varint and 
2b830 74 68 65 20 72 65 63 6f 72 64 20 0a 20 20 20 20  the record .    
2b840 20 20 20 20 20 20 2a 2a 20 66 69 74 73 20 65 6e        ** fits en
2b850 74 69 72 65 6c 79 20 6f 6e 20 74 68 65 20 6d 61  tirely on the ma
2b860 69 6e 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20  in b-tree page. 
2b870 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 74 65   */.          te
2b880 73 74 63 61 73 65 28 20 70 43 65 6c 6c 2b 6e 43  stcase( pCell+nC
2b890 65 6c 6c 2b 32 3d 3d 70 50 61 67 65 2d 3e 61 44  ell+2==pPage->aD
2b8a0 61 74 61 45 6e 64 20 29 3b 0a 20 20 20 20 20 20  ataEnd );.      
2b8b0 20 20 20 20 63 20 3d 20 78 52 65 63 6f 72 64 43      c = xRecordC
2b8c0 6f 6d 70 61 72 65 28 6e 43 65 6c 6c 2c 20 28 76  ompare(nCell, (v
2b8d0 6f 69 64 2a 29 26 70 43 65 6c 6c 5b 32 5d 2c 20  oid*)&pCell[2], 
2b8e0 70 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 20 20  pIdxKey);.      
2b8f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2b900 20 20 20 2f 2a 20 54 68 65 20 72 65 63 6f 72 64     /* The record
2b910 20 66 6c 6f 77 73 20 6f 76 65 72 20 6f 6e 74 6f   flows over onto
2b920 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 76 65   one or more ove
2b930 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 49 6e 0a  rflow pages. In.
2b940 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 69            ** thi
2b950 73 20 63 61 73 65 20 74 68 65 20 77 68 6f 6c 65  s case the whole
2b960 20 63 65 6c 6c 20 6e 65 65 64 73 20 74 6f 20 62   cell needs to b
2b970 65 20 70 61 72 73 65 64 2c 20 61 20 62 75 66 66  e parsed, a buff
2b980 65 72 20 61 6c 6c 6f 63 61 74 65 64 0a 20 20 20  er allocated.   
2b990 20 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 61 63         ** and ac
2b9a0 63 65 73 73 50 61 79 6c 6f 61 64 28 29 20 75 73  cessPayload() us
2b9b0 65 64 20 74 6f 20 72 65 74 72 69 65 76 65 20 74  ed to retrieve t
2b9c0 68 65 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 74  he record into t
2b9d0 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  he.          ** 
2b9e0 62 75 66 66 65 72 20 62 65 66 6f 72 65 20 56 64  buffer before Vd
2b9f0 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28  beRecordCompare(
2ba00 29 20 63 61 6e 20 62 65 20 63 61 6c 6c 65 64 2e  ) can be called.
2ba10 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 0a 20   .          **. 
2ba20 20 20 20 20 20 20 20 20 20 2a 2a 20 49 66 20 74           ** If t
2ba30 68 65 20 72 65 63 6f 72 64 20 69 73 20 63 6f 72  he record is cor
2ba40 72 75 70 74 2c 20 74 68 65 20 78 52 65 63 6f 72  rupt, the xRecor
2ba50 64 43 6f 6d 70 61 72 65 20 72 6f 75 74 69 6e 65  dCompare routine
2ba60 20 6d 61 79 20 72 65 61 64 0a 20 20 20 20 20 20   may read.      
2ba70 20 20 20 20 2a 2a 20 75 70 20 74 6f 20 74 77 6f      ** up to two
2ba80 20 76 61 72 69 6e 74 73 20 70 61 73 74 20 74 68   varints past th
2ba90 65 20 65 6e 64 20 6f 66 20 74 68 65 20 62 75 66  e end of the buf
2baa0 66 65 72 2e 20 41 6e 20 65 78 74 72 61 20 31 38  fer. An extra 18
2bab0 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62   .          ** b
2bac0 79 74 65 73 20 6f 66 20 70 61 64 64 69 6e 67 20  ytes of padding 
2bad0 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 74 20  is allocated at 
2bae0 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 62  the end of the b
2baf0 75 66 66 65 72 20 69 6e 0a 20 20 20 20 20 20 20  uffer in.       
2bb00 20 20 20 2a 2a 20 63 61 73 65 20 74 68 69 73 20     ** case this 
2bb10 68 61 70 70 65 6e 73 2e 20 20 2a 2f 0a 20 20 20  happens.  */.   
2bb20 20 20 20 20 20 20 20 76 6f 69 64 20 2a 70 43 65         void *pCe
2bb30 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 20  llKey;.         
2bb40 20 75 38 20 2a 20 63 6f 6e 73 74 20 70 43 65 6c   u8 * const pCel
2bb50 6c 42 6f 64 79 20 3d 20 70 43 65 6c 6c 20 2d 20  lBody = pCell - 
2bb60 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53  pPage->childPtrS
2bb70 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 20 20 70  ize;.          p
2bb80 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c  Page->xParseCell
2bb90 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 42 6f 64  (pPage, pCellBod
2bba0 79 2c 20 26 70 43 75 72 2d 3e 69 6e 66 6f 29 3b  y, &pCur->info);
2bbb0 0a 20 20 20 20 20 20 20 20 20 20 6e 43 65 6c 6c  .          nCell
2bbc0 20 3d 20 28 69 6e 74 29 70 43 75 72 2d 3e 69 6e   = (int)pCur->in
2bbd0 66 6f 2e 6e 4b 65 79 3b 0a 20 20 20 20 20 20 20  fo.nKey;.       
2bbe0 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 43 65     testcase( nCe
2bbf0 6c 6c 3c 30 20 29 3b 20 20 20 2f 2a 20 54 72 75  ll<0 );   /* Tru
2bc00 65 20 69 66 20 6b 65 79 20 73 69 7a 65 20 69 73  e if key size is
2bc10 20 32 5e 33 32 20 6f 72 20 6d 6f 72 65 20 2a 2f   2^32 or more */
2bc20 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63  .          testc
2bc30 61 73 65 28 20 6e 43 65 6c 6c 3d 3d 30 20 29 3b  ase( nCell==0 );
2bc40 20 20 2f 2a 20 49 6e 76 61 6c 69 64 20 6b 65 79    /* Invalid key
2bc50 20 73 69 7a 65 3a 20 20 30 78 38 30 20 30 78 38   size:  0x80 0x8
2bc60 30 20 30 78 30 30 20 2a 2f 0a 20 20 20 20 20 20  0 0x00 */.      
2bc70 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 43      testcase( nC
2bc80 65 6c 6c 3d 3d 31 20 29 3b 20 20 2f 2a 20 49 6e  ell==1 );  /* In
2bc90 76 61 6c 69 64 20 6b 65 79 20 73 69 7a 65 3a 20  valid key size: 
2bca0 20 30 78 38 30 20 30 78 38 30 20 30 78 30 31 20   0x80 0x80 0x01 
2bcb0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 74 65 73  */.          tes
2bcc0 74 63 61 73 65 28 20 6e 43 65 6c 6c 3d 3d 32 20  tcase( nCell==2 
2bcd0 29 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 6c  );  /* Minimum l
2bce0 65 67 61 6c 20 69 6e 64 65 78 20 6b 65 79 20 73  egal index key s
2bcf0 69 7a 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ize */.         
2bd00 20 69 66 28 20 6e 43 65 6c 6c 3c 32 20 29 7b 0a   if( nCell<2 ){.
2bd10 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
2bd20 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
2bd30 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20  BKPT;.          
2bd40 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69    goto moveto_fi
2bd50 6e 69 73 68 3b 0a 20 20 20 20 20 20 20 20 20 20  nish;.          
2bd60 7d 0a 20 20 20 20 20 20 20 20 20 20 70 43 65 6c  }.          pCel
2bd70 6c 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 4d 61  lKey = sqlite3Ma
2bd80 6c 6c 6f 63 28 20 6e 43 65 6c 6c 2b 31 38 20 29  lloc( nCell+18 )
2bd90 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
2bda0 70 43 65 6c 6c 4b 65 79 3d 3d 30 20 29 7b 0a 20  pCellKey==0 ){. 
2bdb0 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
2bdc0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
2bdd0 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d            goto m
2bde0 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20  oveto_finish;.  
2bdf0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2be00 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b      pCur->aiIdx[
2be10 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28  pCur->iPage] = (
2be20 75 31 36 29 69 64 78 3b 0a 20 20 20 20 20 20 20  u16)idx;.       
2be30 20 20 20 72 63 20 3d 20 61 63 63 65 73 73 50 61     rc = accessPa
2be40 79 6c 6f 61 64 28 70 43 75 72 2c 20 30 2c 20 6e  yload(pCur, 0, n
2be50 43 65 6c 6c 2c 20 28 75 6e 73 69 67 6e 65 64 20  Cell, (unsigned 
2be60 63 68 61 72 2a 29 70 43 65 6c 6c 4b 65 79 2c 20  char*)pCellKey, 
2be70 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  2);.          if
2be80 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
2be90 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
2bea0 28 70 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20  (pCellKey);.    
2beb0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76          goto mov
2bec0 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20  eto_finish;.    
2bed0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2bee0 20 20 63 20 3d 20 78 52 65 63 6f 72 64 43 6f 6d    c = xRecordCom
2bef0 70 61 72 65 28 6e 43 65 6c 6c 2c 20 70 43 65 6c  pare(nCell, pCel
2bf00 6c 4b 65 79 2c 20 70 49 64 78 4b 65 79 29 3b 0a  lKey, pIdxKey);.
2bf10 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
2bf20 33 5f 66 72 65 65 28 70 43 65 6c 6c 4b 65 79 29  3_free(pCellKey)
2bf30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2bf40 20 20 20 20 61 73 73 65 72 74 28 20 0a 20 20 20      assert( .   
2bf50 20 20 20 20 20 20 20 20 20 28 70 49 64 78 4b 65           (pIdxKe
2bf60 79 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49  y->errCode!=SQLI
2bf70 54 45 5f 43 4f 52 52 55 50 54 20 7c 7c 20 63 3d  TE_CORRUPT || c=
2bf80 3d 30 29 0a 20 20 20 20 20 20 20 20 20 26 26 20  =0).         && 
2bf90 28 70 49 64 78 4b 65 79 2d 3e 65 72 72 43 6f 64  (pIdxKey->errCod
2bfa0 65 21 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  e!=SQLITE_NOMEM 
2bfb0 7c 7c 20 70 43 75 72 2d 3e 70 42 74 72 65 65 2d  || pCur->pBtree-
2bfc0 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
2bfd0 64 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20  d).        );.  
2bfe0 20 20 20 20 20 20 69 66 28 20 63 3c 30 20 29 7b        if( c<0 ){
2bff0 0a 20 20 20 20 20 20 20 20 20 20 6c 77 72 20 3d  .          lwr =
2c000 20 69 64 78 2b 31 3b 0a 20 20 20 20 20 20 20 20   idx+1;.        
2c010 7d 65 6c 73 65 20 69 66 28 20 63 3e 30 20 29 7b  }else if( c>0 ){
2c020 0a 20 20 20 20 20 20 20 20 20 20 75 70 72 20 3d  .          upr =
2c030 20 69 64 78 2d 31 3b 0a 20 20 20 20 20 20 20 20   idx-1;.        
2c040 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
2c050 20 61 73 73 65 72 74 28 20 63 3d 3d 30 20 29 3b   assert( c==0 );
2c060 0a 20 20 20 20 20 20 20 20 20 20 2a 70 52 65 73  .          *pRes
2c070 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
2c080 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
2c090 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e            pCur->
2c0a0 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
2c0b0 65 5d 20 3d 20 28 75 31 36 29 69 64 78 3b 0a 20  e] = (u16)idx;. 
2c0c0 20 20 20 20 20 20 20 20 20 69 66 28 20 70 49 64           if( pId
2c0d0 78 4b 65 79 2d 3e 65 72 72 43 6f 64 65 20 29 20  xKey->errCode ) 
2c0e0 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
2c0f0 55 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 67  UPT;.          g
2c100 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73  oto moveto_finis
2c110 68 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  h;.        }.   
2c120 20 20 20 20 20 69 66 28 20 6c 77 72 3e 75 70 72       if( lwr>upr
2c130 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
2c140 20 20 61 73 73 65 72 74 28 20 6c 77 72 2b 75 70    assert( lwr+up
2c150 72 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  r>=0 );.        
2c160 69 64 78 20 3d 20 28 6c 77 72 2b 75 70 72 29 3e  idx = (lwr+upr)>
2c170 3e 31 3b 20 20 2f 2a 20 69 64 78 20 3d 20 28 6c  >1;  /* idx = (l
2c180 77 72 2b 75 70 72 29 2f 32 20 2a 2f 0a 20 20 20  wr+upr)/2 */.   
2c190 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61     }.    }.    a
2c1a0 73 73 65 72 74 28 20 6c 77 72 3d 3d 75 70 72 2b  ssert( lwr==upr+
2c1b0 31 20 7c 7c 20 28 70 50 61 67 65 2d 3e 69 6e 74  1 || (pPage->int
2c1c0 4b 65 79 20 26 26 20 21 70 50 61 67 65 2d 3e 6c  Key && !pPage->l
2c1d0 65 61 66 29 20 29 3b 0a 20 20 20 20 61 73 73 65  eaf) );.    asse
2c1e0 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69  rt( pPage->isIni
2c1f0 74 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61  t );.    if( pPa
2c200 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
2c210 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2c220 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
2c230 65 5d 3c 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  e]<pCur->apPage[
2c240 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43  pCur->iPage]->nC
2c250 65 6c 6c 20 29 3b 0a 20 20 20 20 20 20 70 43 75  ell );.      pCu
2c260 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
2c270 50 61 67 65 5d 20 3d 20 28 75 31 36 29 69 64 78  Page] = (u16)idx
2c280 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20  ;.      *pRes = 
2c290 63 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  c;.      rc = SQ
2c2a0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 67  LITE_OK;.      g
2c2b0 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73  oto moveto_finis
2c2c0 68 3b 0a 20 20 20 20 7d 0a 6d 6f 76 65 74 6f 5f  h;.    }.moveto_
2c2d0 6e 65 78 74 5f 6c 61 79 65 72 3a 0a 20 20 20 20  next_layer:.    
2c2e0 69 66 28 20 6c 77 72 3e 3d 70 50 61 67 65 2d 3e  if( lwr>=pPage->
2c2f0 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 63  nCell ){.      c
2c300 68 6c 64 50 67 20 3d 20 67 65 74 34 62 79 74 65  hldPg = get4byte
2c310 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  (&pPage->aData[p
2c320 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
2c330 38 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  8]);.    }else{.
2c340 20 20 20 20 20 20 63 68 6c 64 50 67 20 3d 20 67        chldPg = g
2c350 65 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c  et4byte(findCell
2c360 28 70 50 61 67 65 2c 20 6c 77 72 29 29 3b 0a 20  (pPage, lwr));. 
2c370 20 20 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e 61     }.    pCur->a
2c380 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
2c390 5d 20 3d 20 28 75 31 36 29 6c 77 72 3b 0a 20 20  ] = (u16)lwr;.  
2c3a0 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69    rc = moveToChi
2c3b0 6c 64 28 70 43 75 72 2c 20 63 68 6c 64 50 67 29  ld(pCur, chldPg)
2c3c0 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 62  ;.    if( rc ) b
2c3d0 72 65 61 6b 3b 0a 20 20 7d 0a 6d 6f 76 65 74 6f  reak;.  }.moveto
2c3e0 5f 66 69 6e 69 73 68 3a 0a 20 20 70 43 75 72 2d  _finish:.  pCur-
2c3f0 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b  >info.nSize = 0;
2c400 0a 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67  .  pCur->curFlag
2c410 73 20 26 3d 20 7e 28 42 54 43 46 5f 56 61 6c 69  s &= ~(BTCF_Vali
2c420 64 4e 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69 64  dNKey|BTCF_Valid
2c430 4f 76 66 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20  Ovfl);.  return 
2c440 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65  rc;.}.../*.** Re
2c450 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65  turn TRUE if the
2c460 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 70   cursor is not p
2c470 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e  ointing at an en
2c480 74 72 79 20 6f 66 20 74 68 65 20 74 61 62 6c 65  try of the table
2c490 2e 0a 2a 2a 0a 2a 2a 20 54 52 55 45 20 77 69 6c  ..**.** TRUE wil
2c4a0 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20 61 66  l be returned af
2c4b0 74 65 72 20 61 20 63 61 6c 6c 20 74 6f 20 73 71  ter a call to sq
2c4c0 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 29  lite3BtreeNext()
2c4d0 20 6d 6f 76 65 73 0a 2a 2a 20 70 61 73 74 20 74   moves.** past t
2c4e0 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e  he last entry in
2c4f0 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20 73 71   the table or sq
2c500 6c 69 74 65 33 42 74 72 65 65 50 72 65 76 28 29  lite3BtreePrev()
2c510 20 6d 6f 76 65 73 20 70 61 73 74 0a 2a 2a 20 74   moves past.** t
2c520 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 2e 20  he first entry. 
2c530 20 54 52 55 45 20 69 73 20 61 6c 73 6f 20 72 65   TRUE is also re
2c540 74 75 72 6e 65 64 20 69 66 20 74 68 65 20 74 61  turned if the ta
2c550 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f  ble is empty..*/
2c560 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
2c570 65 45 6f 66 28 42 74 43 75 72 73 6f 72 20 2a 70  eEof(BtCursor *p
2c580 43 75 72 29 7b 0a 20 20 2f 2a 20 54 4f 44 4f 3a  Cur){.  /* TODO:
2c590 20 57 68 61 74 20 69 66 20 74 68 65 20 63 75 72   What if the cur
2c5a0 73 6f 72 20 69 73 20 69 6e 20 43 55 52 53 4f 52  sor is in CURSOR
2c5b0 5f 52 45 51 55 49 52 45 53 45 45 4b 20 62 75 74  _REQUIRESEEK but
2c5c0 20 61 6c 6c 20 74 61 62 6c 65 20 65 6e 74 72 69   all table entri
2c5d0 65 73 0a 20 20 2a 2a 20 68 61 76 65 20 62 65 65  es.  ** have bee
2c5e0 6e 20 64 65 6c 65 74 65 64 3f 20 54 68 69 73 20  n deleted? This 
2c5f0 41 50 49 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f  API will need to
2c600 20 63 68 61 6e 67 65 20 74 6f 20 72 65 74 75 72   change to retur
2c610 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 0a  n an error code.
2c620 20 20 2a 2a 20 61 73 20 77 65 6c 6c 20 61 73 20    ** as well as 
2c630 74 68 65 20 62 6f 6f 6c 65 61 6e 20 72 65 73 75  the boolean resu
2c640 6c 74 20 76 61 6c 75 65 2e 0a 20 20 2a 2f 0a 20  lt value..  */. 
2c650 20 72 65 74 75 72 6e 20 28 43 55 52 53 4f 52 5f   return (CURSOR_
2c660 56 41 4c 49 44 21 3d 70 43 75 72 2d 3e 65 53 74  VALID!=pCur->eSt
2c670 61 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ate);.}../*.** A
2c680 64 76 61 6e 63 65 20 74 68 65 20 63 75 72 73 6f  dvance the curso
2c690 72 20 74 6f 20 74 68 65 20 6e 65 78 74 20 65 6e  r to the next en
2c6a0 74 72 79 20 69 6e 20 74 68 65 20 64 61 74 61 62  try in the datab
2c6b0 61 73 65 2e 20 20 49 66 0a 2a 2a 20 73 75 63 63  ase.  If.** succ
2c6c0 65 73 73 66 75 6c 20 74 68 65 6e 20 73 65 74 20  essful then set 
2c6d0 2a 70 52 65 73 3d 30 2e 20 20 49 66 20 74 68 65  *pRes=0.  If the
2c6e0 20 63 75 72 73 6f 72 0a 2a 2a 20 77 61 73 20 61   cursor.** was a
2c6f0 6c 72 65 61 64 79 20 70 6f 69 6e 74 69 6e 67 20  lready pointing 
2c700 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72  to the last entr
2c710 79 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  y in the databas
2c720 65 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 69 73  e before.** this
2c730 20 72 6f 75 74 69 6e 65 20 77 61 73 20 63 61 6c   routine was cal
2c740 6c 65 64 2c 20 74 68 65 6e 20 73 65 74 20 2a 70  led, then set *p
2c750 52 65 73 3d 31 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  Res=1..**.** The
2c760 20 6d 61 69 6e 20 65 6e 74 72 79 20 70 6f 69 6e   main entry poin
2c770 74 20 69 73 20 73 71 6c 69 74 65 33 42 74 72 65  t is sqlite3Btre
2c780 65 4e 65 78 74 28 29 2e 20 20 54 68 61 74 20 72  eNext().  That r
2c790 6f 75 74 69 6e 65 20 69 73 20 6f 70 74 69 6d 69  outine is optimi
2c7a0 7a 65 64 0a 2a 2a 20 66 6f 72 20 74 68 65 20 63  zed.** for the c
2c7b0 6f 6d 6d 6f 6e 20 63 61 73 65 20 6f 66 20 6d 65  ommon case of me
2c7c0 72 65 6c 79 20 69 6e 63 72 65 6d 65 6e 74 69 6e  rely incrementin
2c7d0 67 20 74 68 65 20 63 65 6c 6c 20 63 6f 75 6e 74  g the cell count
2c7e0 65 72 20 42 74 43 75 72 73 6f 72 2e 61 69 49 64  er BtCursor.aiId
2c7f0 78 0a 2a 2a 20 74 6f 20 74 68 65 20 6e 65 78 74  x.** to the next
2c800 20 63 65 6c 6c 20 6f 6e 20 74 68 65 20 63 75 72   cell on the cur
2c810 72 65 6e 74 20 70 61 67 65 2e 20 20 54 68 65 20  rent page.  The 
2c820 28 73 6c 6f 77 65 72 29 20 62 74 72 65 65 4e 65  (slower) btreeNe
2c830 78 74 28 29 20 68 65 6c 70 65 72 0a 2a 2a 20 72  xt() helper.** r
2c840 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
2c850 20 77 68 65 6e 20 69 74 20 69 73 20 6e 65 63 65   when it is nece
2c860 73 73 61 72 79 20 74 6f 20 6d 6f 76 65 20 74 6f  ssary to move to
2c870 20 61 20 64 69 66 66 65 72 65 6e 74 20 70 61 67   a different pag
2c880 65 20 6f 72 0a 2a 2a 20 74 6f 20 72 65 73 74 6f  e or.** to resto
2c890 72 65 20 74 68 65 20 63 75 72 73 6f 72 2e 0a 2a  re the cursor..*
2c8a0 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 69 6e 67  *.** The calling
2c8b0 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 73   function will s
2c8c0 65 74 20 2a 70 52 65 73 20 74 6f 20 30 20 6f 72  et *pRes to 0 or
2c8d0 20 31 2e 20 20 54 68 65 20 69 6e 69 74 69 61 6c   1.  The initial
2c8e0 20 2a 70 52 65 73 20 76 61 6c 75 65 0a 2a 2a 20   *pRes value.** 
2c8f0 77 69 6c 6c 20 62 65 20 31 20 69 66 20 74 68 65  will be 1 if the
2c900 20 63 75 72 73 6f 72 20 62 65 69 6e 67 20 73 74   cursor being st
2c910 65 70 70 65 64 20 63 6f 72 72 65 73 70 6f 6e 64  epped correspond
2c920 73 20 74 6f 20 61 6e 20 53 51 4c 20 69 6e 64 65  s to an SQL inde
2c930 78 20 61 6e 64 0a 2a 2a 20 69 66 20 74 68 69 73  x and.** if this
2c940 20 72 6f 75 74 69 6e 65 20 63 6f 75 6c 64 20 68   routine could h
2c950 61 76 65 20 62 65 65 6e 20 73 6b 69 70 70 65 64  ave been skipped
2c960 20 69 66 20 74 68 61 74 20 53 51 4c 20 69 6e 64   if that SQL ind
2c970 65 78 20 68 61 64 20 62 65 65 6e 0a 2a 2a 20 61  ex had been.** a
2c980 20 75 6e 69 71 75 65 20 69 6e 64 65 78 2e 20 20   unique index.  
2c990 4f 74 68 65 72 77 69 73 65 20 74 68 65 20 63 61  Otherwise the ca
2c9a0 6c 6c 65 72 20 77 69 6c 6c 20 68 61 76 65 20 73  ller will have s
2c9b0 65 74 20 2a 70 52 65 73 20 74 6f 20 7a 65 72 6f  et *pRes to zero
2c9c0 2e 0a 2a 2a 20 5a 65 72 6f 20 69 73 20 74 68 65  ..** Zero is the
2c9d0 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 2e 20 54 68   common case. Th
2c9e0 65 20 62 74 72 65 65 20 69 6d 70 6c 65 6d 65 6e  e btree implemen
2c9f0 74 61 74 69 6f 6e 20 69 73 20 66 72 65 65 20 74  tation is free t
2ca00 6f 20 75 73 65 20 74 68 65 0a 2a 2a 20 69 6e 69  o use the.** ini
2ca10 74 69 61 6c 20 2a 70 52 65 73 20 76 61 6c 75 65  tial *pRes value
2ca20 20 61 73 20 61 20 68 69 6e 74 20 74 6f 20 69 6d   as a hint to im
2ca30 70 72 6f 76 65 20 70 65 72 66 6f 72 6d 61 6e 63  prove performanc
2ca40 65 2c 20 62 75 74 20 74 68 65 20 63 75 72 72 65  e, but the curre
2ca50 6e 74 0a 2a 2a 20 53 51 4c 69 74 65 20 62 74 72  nt.** SQLite btr
2ca60 65 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ee implementatio
2ca70 6e 20 64 6f 65 73 20 6e 6f 74 2e 20 28 4e 6f 74  n does not. (Not
2ca80 65 20 74 68 61 74 20 74 68 65 20 63 6f 6d 64 62  e that the comdb
2ca90 32 20 62 74 72 65 65 0a 2a 2a 20 69 6d 70 6c 65  2 btree.** imple
2caa0 6d 65 6e 74 61 74 69 6f 6e 20 64 6f 65 73 20 75  mentation does u
2cab0 73 65 20 74 68 69 73 20 68 69 6e 74 2c 20 68 6f  se this hint, ho
2cac0 77 65 76 65 72 2e 29 0a 2a 2f 0a 73 74 61 74 69  wever.).*/.stati
2cad0 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e  c SQLITE_NOINLIN
2cae0 45 20 69 6e 74 20 62 74 72 65 65 4e 65 78 74 28  E int btreeNext(
2caf0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
2cb00 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e  int *pRes){.  in
2cb10 74 20 72 63 3b 0a 20 20 69 6e 74 20 69 64 78 3b  t rc;.  int idx;
2cb20 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
2cb30 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  e;..  assert( cu
2cb40 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
2cb50 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
2cb60 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74  ( pCur->skipNext
2cb70 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74  ==0 || pCur->eSt
2cb80 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate!=CURSOR_VALI
2cb90 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 2a  D );.  assert( *
2cba0 70 52 65 73 3d 3d 30 20 29 3b 0a 20 20 69 66 28  pRes==0 );.  if(
2cbb0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43   pCur->eState!=C
2cbc0 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20  URSOR_VALID ){. 
2cbd0 20 20 20 61 73 73 65 72 74 28 20 28 70 43 75 72     assert( (pCur
2cbe0 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43  ->curFlags & BTC
2cbf0 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3d 3d 30 20  F_ValidOvfl)==0 
2cc00 29 3b 0a 20 20 20 20 72 63 20 3d 20 72 65 73 74  );.    rc = rest
2cc10 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  oreCursorPositio
2cc20 6e 28 70 43 75 72 29 3b 0a 20 20 20 20 69 66 28  n(pCur);.    if(
2cc30 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2cc40 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
2cc50 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  c;.    }.    if(
2cc60 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d   CURSOR_INVALID=
2cc70 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29 7b  =pCur->eState ){
2cc80 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31  .      *pRes = 1
2cc90 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
2cca0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
2ccb0 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 73 6b      if( pCur->sk
2ccc0 69 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20  ipNext ){.      
2ccd0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
2cce0 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
2ccf0 49 44 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61  ID || pCur->eSta
2cd00 74 65 3d 3d 43 55 52 53 4f 52 5f 53 4b 49 50 4e  te==CURSOR_SKIPN
2cd10 45 58 54 20 29 3b 0a 20 20 20 20 20 20 70 43 75  EXT );.      pCu
2cd20 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
2cd30 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 20 20 20 20  OR_VALID;.      
2cd40 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65  if( pCur->skipNe
2cd50 78 74 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  xt>0 ){.        
2cd60 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d  pCur->skipNext =
2cd70 20 30 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75   0;.        retu
2cd80 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
2cd90 20 20 20 20 7d 0a 20 20 20 20 20 20 70 43 75 72      }.      pCur
2cda0 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a  ->skipNext = 0;.
2cdb0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 50 61      }.  }..  pPa
2cdc0 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67  ge = pCur->apPag
2cdd0 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a  e[pCur->iPage];.
2cde0 20 20 69 64 78 20 3d 20 2b 2b 70 43 75 72 2d 3e    idx = ++pCur->
2cdf0 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
2ce00 65 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  e];.  assert( pP
2ce10 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 0a  age->isInit );..
2ce20 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61    /* If the data
2ce30 62 61 73 65 20 66 69 6c 65 20 69 73 20 63 6f 72  base file is cor
2ce40 72 75 70 74 2c 20 69 74 20 69 73 20 70 6f 73 73  rupt, it is poss
2ce50 69 62 6c 65 20 66 6f 72 20 74 68 65 20 76 61 6c  ible for the val
2ce60 75 65 20 6f 66 20 69 64 78 20 0a 20 20 2a 2a 20  ue of idx .  ** 
2ce70 74 6f 20 62 65 20 69 6e 76 61 6c 69 64 20 68 65  to be invalid he
2ce80 72 65 2e 20 54 68 69 73 20 63 61 6e 20 6f 6e 6c  re. This can onl
2ce90 79 20 6f 63 63 75 72 20 69 66 20 61 20 73 65 63  y occur if a sec
2cea0 6f 6e 64 20 63 75 72 73 6f 72 20 6d 6f 64 69 66  ond cursor modif
2ceb0 69 65 73 0a 20 20 2a 2a 20 74 68 65 20 70 61 67  ies.  ** the pag
2cec0 65 20 77 68 69 6c 65 20 63 75 72 73 6f 72 20 70  e while cursor p
2ced0 43 75 72 20 69 73 20 68 6f 6c 64 69 6e 67 20 61  Cur is holding a
2cee0 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 69 74   reference to it
2cef0 2e 20 57 68 69 63 68 20 63 61 6e 0a 20 20 2a 2a  . Which can.  **
2cf00 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 69 66 20   only happen if 
2cf10 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
2cf20 63 6f 72 72 75 70 74 20 69 6e 20 73 75 63 68 20  corrupt in such 
2cf30 61 20 77 61 79 20 61 73 20 74 6f 20 6c 69 6e 6b  a way as to link
2cf40 20 74 68 65 0a 20 20 2a 2a 20 70 61 67 65 20 69   the.  ** page i
2cf50 6e 74 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e  nto more than on
2cf60 65 20 62 2d 74 72 65 65 20 73 74 72 75 63 74 75  e b-tree structu
2cf70 72 65 2e 20 2a 2f 0a 20 20 74 65 73 74 63 61 73  re. */.  testcas
2cf80 65 28 20 69 64 78 3e 70 50 61 67 65 2d 3e 6e 43  e( idx>pPage->nC
2cf90 65 6c 6c 20 29 3b 0a 0a 20 20 69 66 28 20 69 64  ell );..  if( id
2cfa0 78 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  x>=pPage->nCell 
2cfb0 29 7b 0a 20 20 20 20 69 66 28 20 21 70 50 61 67  ){.    if( !pPag
2cfc0 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20  e->leaf ){.     
2cfd0 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c   rc = moveToChil
2cfe0 64 28 70 43 75 72 2c 20 67 65 74 34 62 79 74 65  d(pCur, get4byte
2cff0 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  (&pPage->aData[p
2d000 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
2d010 38 5d 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20  8]));.      if( 
2d020 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
2d030 20 20 20 20 20 20 72 65 74 75 72 6e 20 6d 6f 76        return mov
2d040 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72  eToLeftmost(pCur
2d050 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 6f 7b  );.    }.    do{
2d060 0a 20 20 20 20 20 20 69 66 28 20 70 43 75 72 2d  .      if( pCur-
2d070 3e 69 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20  >iPage==0 ){.   
2d080 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a       *pRes = 1;.
2d090 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53          pCur->eS
2d0a0 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e  tate = CURSOR_IN
2d0b0 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 20 20 72  VALID;.        r
2d0c0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2d0d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d  .      }.      m
2d0e0 6f 76 65 54 6f 50 61 72 65 6e 74 28 70 43 75 72  oveToParent(pCur
2d0f0 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 20 3d  );.      pPage =
2d100 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
2d110 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20  ur->iPage];.    
2d120 7d 77 68 69 6c 65 28 20 70 43 75 72 2d 3e 61 69  }while( pCur->ai
2d130 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
2d140 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29  >=pPage->nCell )
2d150 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d  ;.    if( pPage-
2d160 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20  >intKey ){.     
2d170 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 42   return sqlite3B
2d180 74 72 65 65 4e 65 78 74 28 70 43 75 72 2c 20 70  treeNext(pCur, p
2d190 52 65 73 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Res);.    }else{
2d1a0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
2d1b0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
2d1c0 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e   }.  if( pPage->
2d1d0 6c 65 61 66 20 29 7b 0a 20 20 20 20 72 65 74 75  leaf ){.    retu
2d1e0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
2d1f0 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72  }else{.    retur
2d200 6e 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74  n moveToLeftmost
2d210 28 70 43 75 72 29 3b 0a 20 20 7d 0a 7d 0a 69 6e  (pCur);.  }.}.in
2d220 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65  t sqlite3BtreeNe
2d230 78 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  xt(BtCursor *pCu
2d240 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20  r, int *pRes){. 
2d250 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b   MemPage *pPage;
2d260 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
2d270 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
2d280 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
2d290 52 65 73 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  Res!=0 );.  asse
2d2a0 72 74 28 20 2a 70 52 65 73 3d 3d 30 20 7c 7c 20  rt( *pRes==0 || 
2d2b0 2a 70 52 65 73 3d 3d 31 20 29 3b 0a 20 20 61 73  *pRes==1 );.  as
2d2c0 73 65 72 74 28 20 70 43 75 72 2d 3e 73 6b 69 70  sert( pCur->skip
2d2d0 4e 65 78 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d  Next==0 || pCur-
2d2e0 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f  >eState!=CURSOR_
2d2f0 56 41 4c 49 44 20 29 3b 0a 20 20 70 43 75 72 2d  VALID );.  pCur-
2d300 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b  >info.nSize = 0;
2d310 0a 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67  .  pCur->curFlag
2d320 73 20 26 3d 20 7e 28 42 54 43 46 5f 56 61 6c 69  s &= ~(BTCF_Vali
2d330 64 4e 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69 64  dNKey|BTCF_Valid
2d340 4f 76 66 6c 29 3b 0a 20 20 2a 70 52 65 73 20 3d  Ovfl);.  *pRes =
2d350 20 30 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e   0;.  if( pCur->
2d360 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56  eState!=CURSOR_V
2d370 41 4c 49 44 20 29 20 72 65 74 75 72 6e 20 62 74  ALID ) return bt
2d380 72 65 65 4e 65 78 74 28 70 43 75 72 2c 20 70 52  reeNext(pCur, pR
2d390 65 73 29 3b 0a 20 20 70 50 61 67 65 20 3d 20 70  es);.  pPage = p
2d3a0 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
2d3b0 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 69 66 28 20  ->iPage];.  if( 
2d3c0 28 2b 2b 70 43 75 72 2d 3e 61 69 49 64 78 5b 70  (++pCur->aiIdx[p
2d3d0 43 75 72 2d 3e 69 50 61 67 65 5d 29 3e 3d 70 50  Cur->iPage])>=pP
2d3e0 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20  age->nCell ){.  
2d3f0 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43    pCur->aiIdx[pC
2d400 75 72 2d 3e 69 50 61 67 65 5d 2d 2d 3b 0a 20 20  ur->iPage]--;.  
2d410 20 20 72 65 74 75 72 6e 20 62 74 72 65 65 4e 65    return btreeNe
2d420 78 74 28 70 43 75 72 2c 20 70 52 65 73 29 3b 0a  xt(pCur, pRes);.
2d430 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 2d    }.  if( pPage-
2d440 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 72 65 74  >leaf ){.    ret
2d450 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
2d460 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75   }else{.    retu
2d470 72 6e 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73  rn moveToLeftmos
2d480 74 28 70 43 75 72 29 3b 0a 20 20 7d 0a 7d 0a 0a  t(pCur);.  }.}..
2d490 2f 2a 0a 2a 2a 20 53 74 65 70 20 74 68 65 20 63  /*.** Step the c
2d4a0 75 72 73 6f 72 20 74 6f 20 74 68 65 20 62 61 63  ursor to the bac
2d4b0 6b 20 74 6f 20 74 68 65 20 70 72 65 76 69 6f 75  k to the previou
2d4c0 73 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64  s entry in the d
2d4d0 61 74 61 62 61 73 65 2e 20 20 49 66 0a 2a 2a 20  atabase.  If.** 
2d4e0 73 75 63 63 65 73 73 66 75 6c 20 74 68 65 6e 20  successful then 
2d4f0 73 65 74 20 2a 70 52 65 73 3d 30 2e 20 20 49 66  set *pRes=0.  If
2d500 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 77   the cursor.** w
2d510 61 73 20 61 6c 72 65 61 64 79 20 70 6f 69 6e 74  as already point
2d520 69 6e 67 20 74 6f 20 74 68 65 20 66 69 72 73 74  ing to the first
2d530 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61   entry in the da
2d540 74 61 62 61 73 65 20 62 65 66 6f 72 65 0a 2a 2a  tabase before.**
2d550 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61   this routine wa
2d560 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20 73  s called, then s
2d570 65 74 20 2a 70 52 65 73 3d 31 2e 0a 2a 2a 0a 2a  et *pRes=1..**.*
2d580 2a 20 54 68 65 20 6d 61 69 6e 20 65 6e 74 72 79  * The main entry
2d590 20 70 6f 69 6e 74 20 69 73 20 73 71 6c 69 74 65   point is sqlite
2d5a0 33 42 74 72 65 65 50 72 65 76 69 6f 75 73 28 29  3BtreePrevious()
2d5b0 2e 20 20 54 68 61 74 20 72 6f 75 74 69 6e 65 20  .  That routine 
2d5c0 69 73 20 6f 70 74 69 6d 69 7a 65 64 0a 2a 2a 20  is optimized.** 
2d5d0 66 6f 72 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63  for the common c
2d5e0 61 73 65 20 6f 66 20 6d 65 72 65 6c 79 20 64 65  ase of merely de
2d5f0 63 72 65 6d 65 6e 74 69 6e 67 20 74 68 65 20 63  crementing the c
2d600 65 6c 6c 20 63 6f 75 6e 74 65 72 20 42 74 43 75  ell counter BtCu
2d610 72 73 6f 72 2e 61 69 49 64 78 0a 2a 2a 20 74 6f  rsor.aiIdx.** to
2d620 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 63 65   the previous ce
2d630 6c 6c 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e  ll on the curren
2d640 74 20 70 61 67 65 2e 20 20 54 68 65 20 28 73 6c  t page.  The (sl
2d650 6f 77 65 72 29 20 62 74 72 65 65 50 72 65 76 69  ower) btreePrevi
2d660 6f 75 73 28 29 0a 2a 2a 20 68 65 6c 70 65 72 20  ous().** helper 
2d670 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
2d680 64 20 77 68 65 6e 20 69 74 20 69 73 20 6e 65 63  d when it is nec
2d690 65 73 73 61 72 79 20 74 6f 20 6d 6f 76 65 20 74  essary to move t
2d6a0 6f 20 61 20 64 69 66 66 65 72 65 6e 74 20 70 61  o a different pa
2d6b0 67 65 0a 2a 2a 20 6f 72 20 74 6f 20 72 65 73 74  ge.** or to rest
2d6c0 6f 72 65 20 74 68 65 20 63 75 72 73 6f 72 2e 0a  ore the cursor..
2d6d0 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 69 6e  **.** The callin
2d6e0 67 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20  g function will 
2d6f0 73 65 74 20 2a 70 52 65 73 20 74 6f 20 30 20 6f  set *pRes to 0 o
2d700 72 20 31 2e 20 20 54 68 65 20 69 6e 69 74 69 61  r 1.  The initia
2d710 6c 20 2a 70 52 65 73 20 76 61 6c 75 65 0a 2a 2a  l *pRes value.**
2d720 20 77 69 6c 6c 20 62 65 20 31 20 69 66 20 74 68   will be 1 if th
2d730 65 20 63 75 72 73 6f 72 20 62 65 69 6e 67 20 73  e cursor being s
2d740 74 65 70 70 65 64 20 63 6f 72 72 65 73 70 6f 6e  tepped correspon
2d750 64 73 20 74 6f 20 61 6e 20 53 51 4c 20 69 6e 64  ds to an SQL ind
2d760 65 78 20 61 6e 64 0a 2a 2a 20 69 66 20 74 68 69  ex and.** if thi
2d770 73 20 72 6f 75 74 69 6e 65 20 63 6f 75 6c 64 20  s routine could 
2d780 68 61 76 65 20 62 65 65 6e 20 73 6b 69 70 70 65  have been skippe
2d790 64 20 69 66 20 74 68 61 74 20 53 51 4c 20 69 6e  d if that SQL in
2d7a0 64 65 78 20 68 61 64 20 62 65 65 6e 0a 2a 2a 20  dex had been.** 
2d7b0 61 20 75 6e 69 71 75 65 20 69 6e 64 65 78 2e 20  a unique index. 
2d7c0 20 4f 74 68 65 72 77 69 73 65 20 74 68 65 20 63   Otherwise the c
2d7d0 61 6c 6c 65 72 20 77 69 6c 6c 20 68 61 76 65 20  aller will have 
2d7e0 73 65 74 20 2a 70 52 65 73 20 74 6f 20 7a 65 72  set *pRes to zer
2d7f0 6f 2e 0a 2a 2a 20 5a 65 72 6f 20 69 73 20 74 68  o..** Zero is th
2d800 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 2e 20 54  e common case. T
2d810 68 65 20 62 74 72 65 65 20 69 6d 70 6c 65 6d 65  he btree impleme
2d820 6e 74 61 74 69 6f 6e 20 69 73 20 66 72 65 65 20  ntation is free 
2d830 74 6f 20 75 73 65 20 74 68 65 0a 2a 2a 20 69 6e  to use the.** in
2d840 69 74 69 61 6c 20 2a 70 52 65 73 20 76 61 6c 75  itial *pRes valu
2d850 65 20 61 73 20 61 20 68 69 6e 74 20 74 6f 20 69  e as a hint to i
2d860 6d 70 72 6f 76 65 20 70 65 72 66 6f 72 6d 61 6e  mprove performan
2d870 63 65 2c 20 62 75 74 20 74 68 65 20 63 75 72 72  ce, but the curr
2d880 65 6e 74 0a 2a 2a 20 53 51 4c 69 74 65 20 62 74  ent.** SQLite bt
2d890 72 65 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ree implementati
2d8a0 6f 6e 20 64 6f 65 73 20 6e 6f 74 2e 20 28 4e 6f  on does not. (No
2d8b0 74 65 20 74 68 61 74 20 74 68 65 20 63 6f 6d 64  te that the comd
2d8c0 62 32 20 62 74 72 65 65 0a 2a 2a 20 69 6d 70 6c  b2 btree.** impl
2d8d0 65 6d 65 6e 74 61 74 69 6f 6e 20 64 6f 65 73 20  ementation does 
2d8e0 75 73 65 20 74 68 69 73 20 68 69 6e 74 2c 20 68  use this hint, h
2d8f0 6f 77 65 76 65 72 2e 29 0a 2a 2f 0a 73 74 61 74  owever.).*/.stat
2d900 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49  ic SQLITE_NOINLI
2d910 4e 45 20 69 6e 74 20 62 74 72 65 65 50 72 65 76  NE int btreePrev
2d920 69 6f 75 73 28 42 74 43 75 72 73 6f 72 20 2a 70  ious(BtCursor *p
2d930 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b  Cur, int *pRes){
2d940 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d  .  int rc;.  Mem
2d950 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20  Page *pPage;..  
2d960 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
2d970 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
2d980 3b 0a 20 20 61 73 73 65 72 74 28 20 70 52 65 73  ;.  assert( pRes
2d990 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
2d9a0 20 2a 70 52 65 73 3d 3d 30 20 29 3b 0a 20 20 61   *pRes==0 );.  a
2d9b0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 73 6b 69  ssert( pCur->ski
2d9c0 70 4e 65 78 74 3d 3d 30 20 7c 7c 20 70 43 75 72  pNext==0 || pCur
2d9d0 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52  ->eState!=CURSOR
2d9e0 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65  _VALID );.  asse
2d9f0 72 74 28 20 28 70 43 75 72 2d 3e 63 75 72 46 6c  rt( (pCur->curFl
2da00 61 67 73 20 26 20 28 42 54 43 46 5f 41 74 4c 61  ags & (BTCF_AtLa
2da10 73 74 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66  st|BTCF_ValidOvf
2da20 6c 7c 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79  l|BTCF_ValidNKey
2da30 29 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ))==0 );.  asser
2da40 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53  t( pCur->info.nS
2da50 69 7a 65 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  ize==0 );.  if( 
2da60 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55  pCur->eState!=CU
2da70 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20  RSOR_VALID ){.  
2da80 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75    rc = restoreCu
2da90 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75  rsorPosition(pCu
2daa0 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  r);.    if( rc!=
2dab0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2dac0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
2dad0 20 20 7d 0a 20 20 20 20 69 66 28 20 43 55 52 53    }.    if( CURS
2dae0 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72  OR_INVALID==pCur
2daf0 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20  ->eState ){.    
2db00 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20    *pRes = 1;.   
2db10 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2db20 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  _OK;.    }.    i
2db30 66 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78  f( pCur->skipNex
2db40 74 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  t ){.      asser
2db50 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
2db60 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c  =CURSOR_VALID ||
2db70 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
2db80 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54 20 29  URSOR_SKIPNEXT )
2db90 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53  ;.      pCur->eS
2dba0 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 56 41  tate = CURSOR_VA
2dbb0 4c 49 44 3b 0a 20 20 20 20 20 20 69 66 28 20 70  LID;.      if( p
2dbc0 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3c 30 20  Cur->skipNext<0 
2dbd0 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d  ){.        pCur-
2dbe0 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a 20  >skipNext = 0;. 
2dbf0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
2dc00 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d  LITE_OK;.      }
2dc10 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 73 6b 69  .      pCur->ski
2dc20 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 7d  pNext = 0;.    }
2dc30 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 20 3d 20  .  }..  pPage = 
2dc40 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
2dc50 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 61 73 73  r->iPage];.  ass
2dc60 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e  ert( pPage->isIn
2dc70 69 74 20 29 3b 0a 20 20 69 66 28 20 21 70 50 61  it );.  if( !pPa
2dc80 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
2dc90 69 6e 74 20 69 64 78 20 3d 20 70 43 75 72 2d 3e  int idx = pCur->
2dca0 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
2dcb0 65 5d 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76  e];.    rc = mov
2dcc0 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 67  eToChild(pCur, g
2dcd0 65 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c  et4byte(findCell
2dce0 28 70 50 61 67 65 2c 20 69 64 78 29 29 29 3b 0a  (pPage, idx)));.
2dcf0 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
2dd00 75 72 6e 20 72 63 3b 0a 20 20 20 20 72 63 20 3d  urn rc;.    rc =
2dd10 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74   moveToRightmost
2dd20 28 70 43 75 72 29 3b 0a 20 20 7d 65 6c 73 65 7b  (pCur);.  }else{
2dd30 0a 20 20 20 20 77 68 69 6c 65 28 20 70 43 75 72  .    while( pCur
2dd40 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
2dd50 61 67 65 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20  age]==0 ){.     
2dd60 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65   if( pCur->iPage
2dd70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ==0 ){.        p
2dd80 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
2dd90 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20  RSOR_INVALID;.  
2dda0 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b        *pRes = 1;
2ddb0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
2ddc0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
2ddd0 20 7d 0a 20 20 20 20 20 20 6d 6f 76 65 54 6f 50   }.      moveToP
2dde0 61 72 65 6e 74 28 70 43 75 72 29 3b 0a 20 20 20  arent(pCur);.   
2ddf0 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70   }.    assert( p
2de00 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d  Cur->info.nSize=
2de10 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
2de20 28 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67  ( (pCur->curFlag
2de30 73 20 26 20 28 42 54 43 46 5f 56 61 6c 69 64 4e  s & (BTCF_ValidN
2de40 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76  Key|BTCF_ValidOv
2de50 66 6c 29 29 3d 3d 30 20 29 3b 0a 0a 20 20 20 20  fl))==0 );..    
2de60 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
2de70 2d 3e 69 50 61 67 65 5d 2d 2d 3b 0a 20 20 20 20  ->iPage]--;.    
2de80 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70  pPage = pCur->ap
2de90 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
2dea0 5d 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  ];.    if( pPage
2deb0 2d 3e 69 6e 74 4b 65 79 20 26 26 20 21 70 50 61  ->intKey && !pPa
2dec0 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
2ded0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
2dee0 72 65 65 50 72 65 76 69 6f 75 73 28 70 43 75 72  reePrevious(pCur
2def0 2c 20 70 52 65 73 29 3b 0a 20 20 20 20 7d 65 6c  , pRes);.    }el
2df00 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  se{.      rc = S
2df10 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
2df20 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
2df30 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  .}.int sqlite3Bt
2df40 72 65 65 50 72 65 76 69 6f 75 73 28 42 74 43 75  reePrevious(BtCu
2df50 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20  rsor *pCur, int 
2df60 2a 70 52 65 73 29 7b 0a 20 20 61 73 73 65 72 74  *pRes){.  assert
2df70 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
2df80 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ex(pCur) );.  as
2df90 73 65 72 74 28 20 70 52 65 73 21 3d 30 20 29 3b  sert( pRes!=0 );
2dfa0 0a 20 20 61 73 73 65 72 74 28 20 2a 70 52 65 73  .  assert( *pRes
2dfb0 3d 3d 30 20 7c 7c 20 2a 70 52 65 73 3d 3d 31 20  ==0 || *pRes==1 
2dfc0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
2dfd0 72 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d 30 20 7c  r->skipNext==0 |
2dfe0 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d  | pCur->eState!=
2dff0 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
2e000 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 70    *pRes = 0;.  p
2e010 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d  Cur->curFlags &=
2e020 20 7e 28 42 54 43 46 5f 41 74 4c 61 73 74 7c 42   ~(BTCF_AtLast|B
2e030 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 7c 42 54  TCF_ValidOvfl|BT
2e040 43 46 5f 56 61 6c 69 64 4e 4b 65 79 29 3b 0a 20  CF_ValidNKey);. 
2e050 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
2e060 65 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 43 75  e = 0;.  if( pCu
2e070 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f  r->eState!=CURSO
2e080 52 5f 56 41 4c 49 44 0a 20 20 20 7c 7c 20 70 43  R_VALID.   || pC
2e090 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
2e0a0 69 50 61 67 65 5d 3d 3d 30 0a 20 20 20 7c 7c 20  iPage]==0.   || 
2e0b0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
2e0c0 72 2d 3e 69 50 61 67 65 5d 2d 3e 6c 65 61 66 3d  r->iPage]->leaf=
2e0d0 3d 30 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75  =0.  ){.    retu
2e0e0 72 6e 20 62 74 72 65 65 50 72 65 76 69 6f 75 73  rn btreePrevious
2e0f0 28 70 43 75 72 2c 20 70 52 65 73 29 3b 0a 20 20  (pCur, pRes);.  
2e100 7d 0a 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  }.  pCur->aiIdx[
2e110 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 2d 3b 0a  pCur->iPage]--;.
2e120 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2e130 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c  OK;.}../*.** All
2e140 6f 63 61 74 65 20 61 20 6e 65 77 20 70 61 67 65  ocate a new page
2e150 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
2e160 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54  se file..**.** T
2e170 68 65 20 6e 65 77 20 70 61 67 65 20 69 73 20 6d  he new page is m
2e180 61 72 6b 65 64 20 61 73 20 64 69 72 74 79 2e 20  arked as dirty. 
2e190 20 28 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73   (In other words
2e1a0 2c 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  , sqlite3PagerWr
2e1b0 69 74 65 28 29 0a 2a 2a 20 68 61 73 20 61 6c 72  ite().** has alr
2e1c0 65 61 64 79 20 62 65 65 6e 20 63 61 6c 6c 65 64  eady been called
2e1d0 20 6f 6e 20 74 68 65 20 6e 65 77 20 70 61 67 65   on the new page
2e1e0 2e 29 20 20 54 68 65 20 6e 65 77 20 70 61 67 65  .)  The new page
2e1f0 20 68 61 73 20 61 6c 73 6f 0a 2a 2a 20 62 65 65   has also.** bee
2e200 6e 20 72 65 66 65 72 65 6e 63 65 64 20 61 6e 64  n referenced and
2e210 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 72 6f 75   the calling rou
2e220 74 69 6e 65 20 69 73 20 72 65 73 70 6f 6e 73 69  tine is responsi
2e230 62 6c 65 20 66 6f 72 20 63 61 6c 6c 69 6e 67 0a  ble for calling.
2e240 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 55  ** sqlite3PagerU
2e250 6e 72 65 66 28 29 20 6f 6e 20 74 68 65 20 6e 65  nref() on the ne
2e260 77 20 70 61 67 65 20 77 68 65 6e 20 69 74 20 69  w page when it i
2e270 73 20 64 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 53 51  s done..**.** SQ
2e280 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
2e290 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73 2e 20  ned on success. 
2e2a0 20 41 6e 79 20 6f 74 68 65 72 20 72 65 74 75 72   Any other retur
2e2b0 6e 20 76 61 6c 75 65 20 69 6e 64 69 63 61 74 65  n value indicate
2e2c0 73 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 2e 20 20  s.** an error.  
2e2d0 2a 70 70 50 61 67 65 20 69 73 20 73 65 74 20 74  *ppPage is set t
2e2e0 6f 20 4e 55 4c 4c 20 69 6e 20 74 68 65 20 65 76  o NULL in the ev
2e2f0 65 6e 74 20 6f 66 20 61 6e 20 65 72 72 6f 72 2e  ent of an error.
2e300 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 22 6e  .**.** If the "n
2e310 65 61 72 62 79 22 20 70 61 72 61 6d 65 74 65 72  earby" parameter
2e320 20 69 73 20 6e 6f 74 20 30 2c 20 74 68 65 6e 20   is not 0, then 
2e330 61 6e 20 65 66 66 6f 72 74 20 69 73 20 6d 61 64  an effort is mad
2e340 65 20 74 6f 20 0a 2a 2a 20 6c 6f 63 61 74 65 20  e to .** locate 
2e350 61 20 70 61 67 65 20 63 6c 6f 73 65 20 74 6f 20  a page close to 
2e360 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
2e370 22 6e 65 61 72 62 79 22 2e 20 20 54 68 69 73 20  "nearby".  This 
2e380 63 61 6e 20 62 65 20 75 73 65 64 20 69 6e 20 61  can be used in a
2e390 6e 0a 2a 2a 20 61 74 74 65 6d 70 74 20 74 6f 20  n.** attempt to 
2e3a0 6b 65 65 70 20 72 65 6c 61 74 65 64 20 70 61 67  keep related pag
2e3b0 65 73 20 63 6c 6f 73 65 20 74 6f 20 65 61 63 68  es close to each
2e3c0 20 6f 74 68 65 72 20 69 6e 20 74 68 65 20 64 61   other in the da
2e3d0 74 61 62 61 73 65 20 66 69 6c 65 2c 0a 2a 2a 20  tabase file,.** 
2e3e0 77 68 69 63 68 20 69 6e 20 74 75 72 6e 20 63 61  which in turn ca
2e3f0 6e 20 6d 61 6b 65 20 64 61 74 61 62 61 73 65 20  n make database 
2e400 61 63 63 65 73 73 20 66 61 73 74 65 72 2e 0a 2a  access faster..*
2e410 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 4d 6f 64  *.** If the eMod
2e420 65 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 42  e parameter is B
2e430 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20 61 6e 64  TALLOC_EXACT and
2e440 20 74 68 65 20 6e 65 61 72 62 79 20 70 61 67 65   the nearby page
2e450 20 65 78 69 73 74 73 0a 2a 2a 20 61 6e 79 77 68   exists.** anywh
2e460 65 72 65 20 6f 6e 20 74 68 65 20 66 72 65 65 2d  ere on the free-
2e470 6c 69 73 74 2c 20 74 68 65 6e 20 69 74 20 69 73  list, then it is
2e480 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62   guaranteed to b
2e490 65 20 72 65 74 75 72 6e 65 64 2e 20 20 49 66 0a  e returned.  If.
2e4a0 2a 2a 20 65 4d 6f 64 65 20 69 73 20 42 54 41 4c  ** eMode is BTAL
2e4b0 4c 4f 43 5f 4c 54 20 74 68 65 6e 20 74 68 65 20  LOC_LT then the 
2e4c0 70 61 67 65 20 72 65 74 75 72 6e 65 64 20 77 69  page returned wi
2e4d0 6c 6c 20 62 65 20 6c 65 73 73 20 74 68 61 6e 20  ll be less than 
2e4e0 6f 72 20 65 71 75 61 6c 0a 2a 2a 20 74 6f 20 6e  or equal.** to n
2e4f0 65 61 72 62 79 20 69 66 20 61 6e 79 20 73 75 63  earby if any suc
2e500 68 20 70 61 67 65 20 65 78 69 73 74 73 2e 20 20  h page exists.  
2e510 49 66 20 65 4d 6f 64 65 20 69 73 20 42 54 41 4c  If eMode is BTAL
2e520 4c 4f 43 5f 41 4e 59 20 74 68 65 6e 20 74 68 65  LOC_ANY then the
2e530 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 72 65 73  re.** are no res
2e540 74 72 69 63 74 69 6f 6e 73 20 6f 6e 20 77 68 69  trictions on whi
2e550 63 68 20 70 61 67 65 20 69 73 20 72 65 74 75 72  ch page is retur
2e560 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
2e570 6e 74 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65  nt allocateBtree
2e580 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64  Page(.  BtShared
2e590 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20 2f   *pBt,         /
2e5a0 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20  * The btree */. 
2e5b0 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67   MemPage **ppPag
2e5c0 65 2c 20 20 20 20 20 20 2f 2a 20 53 74 6f 72 65  e,      /* Store
2e5d0 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
2e5e0 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 20 68  allocated page h
2e5f0 65 72 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 2a 70  ere */.  Pgno *p
2e600 50 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20  Pgno,           
2e610 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 70 61 67  /* Store the pag
2e620 65 20 6e 75 6d 62 65 72 20 68 65 72 65 20 2a 2f  e number here */
2e630 0a 20 20 50 67 6e 6f 20 6e 65 61 72 62 79 2c 20  .  Pgno nearby, 
2e640 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 61            /* Sea
2e650 72 63 68 20 66 6f 72 20 61 20 70 61 67 65 20 6e  rch for a page n
2e660 65 61 72 20 74 68 69 73 20 6f 6e 65 20 2a 2f 0a  ear this one */.
2e670 20 20 75 38 20 65 4d 6f 64 65 20 20 20 20 20 20    u8 eMode      
2e680 20 20 20 20 20 20 20 20 20 2f 2a 20 42 54 41 4c           /* BTAL
2e690 4c 4f 43 5f 45 58 41 43 54 2c 20 42 54 41 4c 4c  LOC_EXACT, BTALL
2e6a0 4f 43 5f 4c 54 2c 20 6f 72 20 42 54 41 4c 4c 4f  OC_LT, or BTALLO
2e6b0 43 5f 41 4e 59 20 2a 2f 0a 29 7b 0a 20 20 4d 65  C_ANY */.){.  Me
2e6c0 6d 50 61 67 65 20 2a 70 50 61 67 65 31 3b 0a 20  mPage *pPage1;. 
2e6d0 20 69 6e 74 20 72 63 3b 0a 20 20 75 33 32 20 6e   int rc;.  u32 n
2e6e0 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20  ;     /* Number 
2e6f0 6f 66 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20  of pages on the 
2e700 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20 75 33  freelist */.  u3
2e710 32 20 6b 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62  2 k;     /* Numb
2e720 65 72 20 6f 66 20 6c 65 61 76 65 73 20 6f 6e 20  er of leaves on 
2e730 74 68 65 20 74 72 75 6e 6b 20 6f 66 20 74 68 65  the trunk of the
2e740 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20 4d   freelist */.  M
2e750 65 6d 50 61 67 65 20 2a 70 54 72 75 6e 6b 20 3d  emPage *pTrunk =
2e760 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   0;.  MemPage *p
2e770 50 72 65 76 54 72 75 6e 6b 20 3d 20 30 3b 0a 20  PrevTrunk = 0;. 
2e780 20 50 67 6e 6f 20 6d 78 50 61 67 65 3b 20 20 20   Pgno mxPage;   
2e790 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69 7a 65 20    /* Total size 
2e7a0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
2e7b0 66 69 6c 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72  file */..  asser
2e7c0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
2e7d0 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
2e7e0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65  ) );.  assert( e
2e7f0 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 41 4e  Mode==BTALLOC_AN
2e800 59 20 7c 7c 20 28 6e 65 61 72 62 79 3e 30 20 26  Y || (nearby>0 &
2e810 26 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70 42  & IfNotOmitAV(pB
2e820 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 29 20  t->autoVacuum)) 
2e830 29 3b 0a 20 20 70 50 61 67 65 31 20 3d 20 70 42  );.  pPage1 = pB
2e840 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20 6d 78 50  t->pPage1;.  mxP
2e850 61 67 65 20 3d 20 62 74 72 65 65 50 61 67 65 63  age = btreePagec
2e860 6f 75 6e 74 28 70 42 74 29 3b 0a 20 20 2f 2a 20  ount(pBt);.  /* 
2e870 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30  EVIDENCE-OF: R-0
2e880 35 31 31 39 2d 30 32 36 33 37 20 54 68 65 20 34  5119-02637 The 4
2e890 2d 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e  -byte big-endian
2e8a0 20 69 6e 74 65 67 65 72 20 61 74 20 6f 66 66 73   integer at offs
2e8b0 65 74 20 33 36 0a 20 20 2a 2a 20 73 74 6f 72 65  et 36.  ** store
2e8c0 73 20 73 74 6f 72 65 73 20 74 68 65 20 74 6f 74  s stores the tot
2e8d0 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  al number of pag
2e8e0 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69  es on the freeli
2e8f0 73 74 2e 20 2a 2f 0a 20 20 6e 20 3d 20 67 65 74  st. */.  n = get
2e900 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61  4byte(&pPage1->a
2e910 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 74 65 73  Data[36]);.  tes
2e920 74 63 61 73 65 28 20 6e 3d 3d 6d 78 50 61 67 65  tcase( n==mxPage
2e930 2d 31 20 29 3b 0a 20 20 69 66 28 20 6e 3e 3d 6d  -1 );.  if( n>=m
2e940 78 50 61 67 65 20 29 7b 0a 20 20 20 20 72 65 74  xPage ){.    ret
2e950 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
2e960 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69  PT_BKPT;.  }.  i
2e970 66 28 20 6e 3e 30 20 29 7b 0a 20 20 20 20 2f 2a  f( n>0 ){.    /*
2e980 20 54 68 65 72 65 20 61 72 65 20 70 61 67 65 73   There are pages
2e990 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74   on the freelist
2e9a0 2e 20 20 52 65 75 73 65 20 6f 6e 65 20 6f 66 20  .  Reuse one of 
2e9b0 74 68 6f 73 65 20 70 61 67 65 73 2e 20 2a 2f 0a  those pages. */.
2e9c0 20 20 20 20 50 67 6e 6f 20 69 54 72 75 6e 6b 3b      Pgno iTrunk;
2e9d0 0a 20 20 20 20 75 38 20 73 65 61 72 63 68 4c 69  .    u8 searchLi
2e9e0 73 74 20 3d 20 30 3b 20 2f 2a 20 49 66 20 74 68  st = 0; /* If th
2e9f0 65 20 66 72 65 65 2d 6c 69 73 74 20 6d 75 73 74  e free-list must
2ea00 20 62 65 20 73 65 61 72 63 68 65 64 20 66 6f 72   be searched for
2ea10 20 27 6e 65 61 72 62 79 27 20 2a 2f 0a 20 20 20   'nearby' */.   
2ea20 20 75 33 32 20 6e 53 65 61 72 63 68 20 3d 20 30   u32 nSearch = 0
2ea30 3b 20 20 20 2f 2a 20 43 6f 75 6e 74 20 6f 66 20  ;   /* Count of 
2ea40 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 65  the number of se
2ea50 61 72 63 68 20 61 74 74 65 6d 70 74 73 20 2a 2f  arch attempts */
2ea60 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20 49 66 20  .    .    /* If 
2ea70 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 45  eMode==BTALLOC_E
2ea80 58 41 43 54 20 61 6e 64 20 61 20 71 75 65 72 79  XACT and a query
2ea90 20 6f 66 20 74 68 65 20 70 6f 69 6e 74 65 72 2d   of the pointer-
2eaa0 6d 61 70 0a 20 20 20 20 2a 2a 20 73 68 6f 77 73  map.    ** shows
2eab0 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 27   that the page '
2eac0 6e 65 61 72 62 79 27 20 69 73 20 73 6f 6d 65 77  nearby' is somew
2ead0 68 65 72 65 20 6f 6e 20 74 68 65 20 66 72 65 65  here on the free
2eae0 2d 6c 69 73 74 2c 20 74 68 65 6e 0a 20 20 20 20  -list, then.    
2eaf0 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 2d 6c 69  ** the entire-li
2eb00 73 74 20 77 69 6c 6c 20 62 65 20 73 65 61 72 63  st will be searc
2eb10 68 65 64 20 66 6f 72 20 74 68 61 74 20 70 61 67  hed for that pag
2eb20 65 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65  e..    */.#ifnde
2eb30 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
2eb40 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28  TOVACUUM.    if(
2eb50 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f   eMode==BTALLOC_
2eb60 45 58 41 43 54 20 29 7b 0a 20 20 20 20 20 20 69  EXACT ){.      i
2eb70 66 28 20 6e 65 61 72 62 79 3c 3d 6d 78 50 61 67  f( nearby<=mxPag
2eb80 65 20 29 7b 0a 20 20 20 20 20 20 20 20 75 38 20  e ){.        u8 
2eb90 65 54 79 70 65 3b 0a 20 20 20 20 20 20 20 20 61  eType;.        a
2eba0 73 73 65 72 74 28 20 6e 65 61 72 62 79 3e 30 20  ssert( nearby>0 
2ebb0 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
2ebc0 74 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  t( pBt->autoVacu
2ebd0 75 6d 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63  um );.        rc
2ebe0 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70 42 74   = ptrmapGet(pBt
2ebf0 2c 20 6e 65 61 72 62 79 2c 20 26 65 54 79 70 65  , nearby, &eType
2ec00 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 0);.        if
2ec10 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
2ec20 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 65 54  ;.        if( eT
2ec30 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45  ype==PTRMAP_FREE
2ec40 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20 20 20  PAGE ){.        
2ec50 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20 31    searchList = 1
2ec60 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2ec70 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66    }.    }else if
2ec80 28 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43  ( eMode==BTALLOC
2ec90 5f 4c 45 20 29 7b 0a 20 20 20 20 20 20 73 65 61  _LE ){.      sea
2eca0 72 63 68 4c 69 73 74 20 3d 20 31 3b 0a 20 20 20  rchList = 1;.   
2ecb0 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f   }.#endif..    /
2ecc0 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20  * Decrement the 
2ecd0 66 72 65 65 2d 6c 69 73 74 20 63 6f 75 6e 74 20  free-list count 
2ece0 62 79 20 31 2e 20 53 65 74 20 69 54 72 75 6e 6b  by 1. Set iTrunk
2ecf0 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66   to the index of
2ed00 20 74 68 65 0a 20 20 20 20 2a 2a 20 66 69 72 73   the.    ** firs
2ed10 74 20 66 72 65 65 2d 6c 69 73 74 20 74 72 75 6e  t free-list trun
2ed20 6b 20 70 61 67 65 2e 20 69 50 72 65 76 54 72 75  k page. iPrevTru
2ed30 6e 6b 20 69 73 20 69 6e 69 74 69 61 6c 6c 79 20  nk is initially 
2ed40 31 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  1..    */.    rc
2ed50 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
2ed60 72 69 74 65 28 70 50 61 67 65 31 2d 3e 70 44 62  rite(pPage1->pDb
2ed70 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
2ed80 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
2ed90 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61     put4byte(&pPa
2eda0 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20  ge1->aData[36], 
2edb0 6e 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68  n-1);..    /* Th
2edc0 65 20 63 6f 64 65 20 77 69 74 68 69 6e 20 74 68  e code within th
2edd0 69 73 20 6c 6f 6f 70 20 69 73 20 72 75 6e 20 6f  is loop is run o
2ede0 6e 6c 79 20 6f 6e 63 65 20 69 66 20 74 68 65 20  nly once if the 
2edf0 27 73 65 61 72 63 68 4c 69 73 74 27 20 76 61 72  'searchList' var
2ee00 69 61 62 6c 65 0a 20 20 20 20 2a 2a 20 69 73 20  iable.    ** is 
2ee10 6e 6f 74 20 74 72 75 65 2e 20 4f 74 68 65 72 77  not true. Otherw
2ee20 69 73 65 2c 20 69 74 20 72 75 6e 73 20 6f 6e 63  ise, it runs onc
2ee30 65 20 66 6f 72 20 65 61 63 68 20 74 72 75 6e 6b  e for each trunk
2ee40 2d 70 61 67 65 20 6f 6e 20 74 68 65 0a 20 20 20  -page on the.   
2ee50 20 2a 2a 20 66 72 65 65 2d 6c 69 73 74 20 75 6e   ** free-list un
2ee60 74 69 6c 20 74 68 65 20 70 61 67 65 20 27 6e 65  til the page 'ne
2ee70 61 72 62 79 27 20 69 73 20 6c 6f 63 61 74 65 64  arby' is located
2ee80 20 28 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43   (eMode==BTALLOC
2ee90 5f 45 58 41 43 54 29 0a 20 20 20 20 2a 2a 20 6f  _EXACT).    ** o
2eea0 72 20 75 6e 74 69 6c 20 61 20 70 61 67 65 20 6c  r until a page l
2eeb0 65 73 73 20 74 68 61 6e 20 27 6e 65 61 72 62 79  ess than 'nearby
2eec0 27 20 69 73 20 6c 6f 63 61 74 65 64 20 28 65 4d  ' is located (eM
2eed0 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 54 29  ode==BTALLOC_LT)
2eee0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 6f 20 7b  .    */.    do {
2eef0 0a 20 20 20 20 20 20 70 50 72 65 76 54 72 75 6e  .      pPrevTrun
2ef00 6b 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20  k = pTrunk;.    
2ef10 20 20 69 66 28 20 70 50 72 65 76 54 72 75 6e 6b    if( pPrevTrunk
2ef20 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 45   ){.        /* E
2ef30 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 31  VIDENCE-OF: R-01
2ef40 35 30 36 2d 31 31 30 35 33 20 54 68 65 20 66 69  506-11053 The fi
2ef50 72 73 74 20 69 6e 74 65 67 65 72 20 6f 6e 20 61  rst integer on a
2ef60 20 66 72 65 65 6c 69 73 74 20 74 72 75 6e 6b 20   freelist trunk 
2ef70 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  page.        ** 
2ef80 69 73 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  is the page numb
2ef90 65 72 20 6f 66 20 74 68 65 20 6e 65 78 74 20 66  er of the next f
2efa0 72 65 65 6c 69 73 74 20 74 72 75 6e 6b 20 70 61  reelist trunk pa
2efb0 67 65 20 69 6e 20 74 68 65 20 6c 69 73 74 20 6f  ge in the list o
2efc0 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 7a 65 72  r.        ** zer
2efd0 6f 20 69 66 20 74 68 69 73 20 69 73 20 74 68 65  o if this is the
2efe0 20 6c 61 73 74 20 66 72 65 65 6c 69 73 74 20 74   last freelist t
2eff0 72 75 6e 6b 20 70 61 67 65 2e 20 2a 2f 0a 20 20  runk page. */.  
2f000 20 20 20 20 20 20 69 54 72 75 6e 6b 20 3d 20 67        iTrunk = g
2f010 65 74 34 62 79 74 65 28 26 70 50 72 65 76 54 72  et4byte(&pPrevTr
2f020 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 29 3b 0a  unk->aData[0]);.
2f030 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2f040 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45       /* EVIDENCE
2f050 2d 4f 46 3a 20 52 2d 35 39 38 34 31 2d 31 33 37  -OF: R-59841-137
2f060 39 38 20 54 68 65 20 34 2d 62 79 74 65 20 62 69  98 The 4-byte bi
2f070 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72  g-endian integer
2f080 20 61 74 20 6f 66 66 73 65 74 20 33 32 0a 20 20   at offset 32.  
2f090 20 20 20 20 20 20 2a 2a 20 73 74 6f 72 65 73 20        ** stores 
2f0a0 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
2f0b0 6f 66 20 74 68 65 20 66 69 72 73 74 20 70 61 67  of the first pag
2f0c0 65 20 6f 66 20 74 68 65 20 66 72 65 65 6c 69 73  e of the freelis
2f0d0 74 2c 20 6f 72 20 7a 65 72 6f 20 69 66 0a 20 20  t, or zero if.  
2f0e0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 66 72 65        ** the fre
2f0f0 65 6c 69 73 74 20 69 73 20 65 6d 70 74 79 2e 20  elist is empty. 
2f100 2a 2f 0a 20 20 20 20 20 20 20 20 69 54 72 75 6e  */.        iTrun
2f110 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50  k = get4byte(&pP
2f120 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 29  age1->aData[32])
2f130 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2f140 74 65 73 74 63 61 73 65 28 20 69 54 72 75 6e 6b  testcase( iTrunk
2f150 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20 20 20  ==mxPage );.    
2f160 20 20 69 66 28 20 69 54 72 75 6e 6b 3e 6d 78 50    if( iTrunk>mxP
2f170 61 67 65 20 7c 7c 20 6e 53 65 61 72 63 68 2b 2b  age || nSearch++
2f180 20 3e 20 6e 20 29 7b 0a 20 20 20 20 20 20 20 20   > n ){.        
2f190 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
2f1a0 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
2f1b0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
2f1c0 63 20 3d 20 62 74 72 65 65 47 65 74 55 6e 75 73  c = btreeGetUnus
2f1d0 65 64 50 61 67 65 28 70 42 74 2c 20 69 54 72 75  edPage(pBt, iTru
2f1e0 6e 6b 2c 20 26 70 54 72 75 6e 6b 2c 20 30 29 3b  nk, &pTrunk, 0);
2f1f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
2f200 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
2f210 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20   pTrunk = 0;.   
2f220 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c       goto end_al
2f230 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20  locate_page;.   
2f240 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72     }.      asser
2f250 74 28 20 70 54 72 75 6e 6b 21 3d 30 20 29 3b 0a  t( pTrunk!=0 );.
2f260 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54        assert( pT
2f270 72 75 6e 6b 2d 3e 61 44 61 74 61 21 3d 30 20 29  runk->aData!=0 )
2f280 3b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45  ;.      /* EVIDE
2f290 4e 43 45 2d 4f 46 3a 20 52 2d 31 33 35 32 33 2d  NCE-OF: R-13523-
2f2a0 30 34 33 39 34 20 54 68 65 20 73 65 63 6f 6e 64  04394 The second
2f2b0 20 69 6e 74 65 67 65 72 20 6f 6e 20 61 20 66 72   integer on a fr
2f2c0 65 65 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67  eelist trunk pag
2f2d0 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 74 68  e.      ** is th
2f2e0 65 20 6e 75 6d 62 65 72 20 6f 66 20 6c 65 61 66  e number of leaf
2f2f0 20 70 61 67 65 20 70 6f 69 6e 74 65 72 73 20 74   page pointers t
2f300 6f 20 66 6f 6c 6c 6f 77 2e 20 2a 2f 0a 20 20 20  o follow. */.   
2f310 20 20 20 6b 20 3d 20 67 65 74 34 62 79 74 65 28     k = get4byte(
2f320 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34  &pTrunk->aData[4
2f330 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6b 3d  ]);.      if( k=
2f340 3d 30 20 26 26 20 21 73 65 61 72 63 68 4c 69 73  =0 && !searchLis
2f350 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  t ){.        /* 
2f360 54 68 65 20 74 72 75 6e 6b 20 68 61 73 20 6e 6f  The trunk has no
2f370 20 6c 65 61 76 65 73 20 61 6e 64 20 74 68 65 20   leaves and the 
2f380 6c 69 73 74 20 69 73 20 6e 6f 74 20 62 65 69 6e  list is not bein
2f390 67 20 73 65 61 72 63 68 65 64 2e 20 0a 20 20 20  g searched. .   
2f3a0 20 20 20 20 20 2a 2a 20 53 6f 20 65 78 74 72 61       ** So extra
2f3b0 63 74 20 74 68 65 20 74 72 75 6e 6b 20 70 61 67  ct the trunk pag
2f3c0 65 20 69 74 73 65 6c 66 20 61 6e 64 20 75 73 65  e itself and use
2f3d0 20 69 74 20 61 73 20 74 68 65 20 6e 65 77 6c 79   it as the newly
2f3e0 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 6c   .        ** all
2f3f0 6f 63 61 74 65 64 20 70 61 67 65 20 2a 2f 0a 20  ocated page */. 
2f400 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
2f410 50 72 65 76 54 72 75 6e 6b 3d 3d 30 20 29 3b 0a  PrevTrunk==0 );.
2f420 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
2f430 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
2f440 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b  Trunk->pDbPage);
2f450 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20  .        if( rc 
2f460 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  ){.          got
2f470 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
2f480 61 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  age;.        }. 
2f490 20 20 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20         *pPgno = 
2f4a0 69 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20  iTrunk;.        
2f4b0 6d 65 6d 63 70 79 28 26 70 50 61 67 65 31 2d 3e  memcpy(&pPage1->
2f4c0 61 44 61 74 61 5b 33 32 5d 2c 20 26 70 54 72 75  aData[32], &pTru
2f4d0 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29  nk->aData[0], 4)
2f4e0 3b 0a 20 20 20 20 20 20 20 20 2a 70 70 50 61 67  ;.        *ppPag
2f4f0 65 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20  e = pTrunk;.    
2f500 20 20 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a      pTrunk = 0;.
2f510 20 20 20 20 20 20 20 20 54 52 41 43 45 28 28 22          TRACE(("
2f520 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 74 72 75  ALLOCATE: %d tru
2f530 6e 6b 20 2d 20 25 64 20 66 72 65 65 20 70 61 67  nk - %d free pag
2f540 65 73 20 6c 65 66 74 5c 6e 22 2c 20 2a 70 50 67  es left\n", *pPg
2f550 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20 20 20 20  no, n-1));.     
2f560 20 7d 65 6c 73 65 20 69 66 28 20 6b 3e 28 75 33   }else if( k>(u3
2f570 32 29 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  2)(pBt->usableSi
2f580 7a 65 2f 34 20 2d 20 32 29 20 29 7b 0a 20 20 20  ze/4 - 2) ){.   
2f590 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66       /* Value of
2f5a0 20 6b 20 69 73 20 6f 75 74 20 6f 66 20 72 61 6e   k is out of ran
2f5b0 67 65 2e 20 20 44 61 74 61 62 61 73 65 20 63 6f  ge.  Database co
2f5c0 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  rruption */.    
2f5d0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2f5e0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
2f5f0 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
2f600 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 23 69  llocate_page;.#i
2f610 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2f620 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
2f630 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 65 61     }else if( sea
2f640 72 63 68 4c 69 73 74 20 0a 20 20 20 20 20 20 20  rchList .       
2f650 20 20 20 20 20 26 26 20 28 6e 65 61 72 62 79 3d       && (nearby=
2f660 3d 69 54 72 75 6e 6b 20 7c 7c 20 28 69 54 72 75  =iTrunk || (iTru
2f670 6e 6b 3c 6e 65 61 72 62 79 20 26 26 20 65 4d 6f  nk<nearby && eMo
2f680 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45 29 29  de==BTALLOC_LE))
2f690 20 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20   .      ){.     
2f6a0 20 20 20 2f 2a 20 54 68 65 20 6c 69 73 74 20 69     /* The list i
2f6b0 73 20 62 65 69 6e 67 20 73 65 61 72 63 68 65 64  s being searched
2f6c0 20 61 6e 64 20 74 68 69 73 20 74 72 75 6e 6b 20   and this trunk 
2f6d0 70 61 67 65 20 69 73 20 74 68 65 20 70 61 67 65  page is the page
2f6e0 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 61  .        ** to a
2f6f0 6c 6c 6f 63 61 74 65 2c 20 72 65 67 61 72 64 6c  llocate, regardl
2f700 65 73 73 20 6f 66 20 77 68 65 74 68 65 72 20 69  ess of whether i
2f710 74 20 68 61 73 20 6c 65 61 76 65 73 2e 0a 20 20  t has leaves..  
2f720 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
2f730 20 2a 70 50 67 6e 6f 20 3d 20 69 54 72 75 6e 6b   *pPgno = iTrunk
2f740 3b 0a 20 20 20 20 20 20 20 20 2a 70 70 50 61 67  ;.        *ppPag
2f750 65 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20  e = pTrunk;.    
2f760 20 20 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d      searchList =
2f770 20 30 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   0;.        rc =
2f780 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
2f790 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61  te(pTrunk->pDbPa
2f7a0 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ge);.        if(
2f7b0 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20   rc ){.         
2f7c0 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
2f7d0 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20  te_page;.       
2f7e0 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6b   }.        if( k
2f7f0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
2f800 20 69 66 28 20 21 70 50 72 65 76 54 72 75 6e 6b   if( !pPrevTrunk
2f810 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2f820 6d 65 6d 63 70 79 28 26 70 50 61 67 65 31 2d 3e  memcpy(&pPage1->
2f830 61 44 61 74 61 5b 33 32 5d 2c 20 26 70 54 72 75  aData[32], &pTru
2f840 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29  nk->aData[0], 4)
2f850 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
2f860 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  e{.            r
2f870 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
2f880 57 72 69 74 65 28 70 50 72 65 76 54 72 75 6e 6b  Write(pPrevTrunk
2f890 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
2f8a0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
2f8b0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2f8c0 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20             goto 
2f8d0 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67  end_allocate_pag
2f8e0 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  e;.            }
2f8f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d  .            mem
2f900 63 70 79 28 26 70 50 72 65 76 54 72 75 6e 6b 2d  cpy(&pPrevTrunk-
2f910 3e 61 44 61 74 61 5b 30 5d 2c 20 26 70 54 72 75  >aData[0], &pTru
2f920 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29  nk->aData[0], 4)
2f930 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
2f940 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2f950 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 72         /* The tr
2f960 75 6e 6b 20 70 61 67 65 20 69 73 20 72 65 71 75  unk page is requ
2f970 69 72 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c  ired by the call
2f980 65 72 20 62 75 74 20 69 74 20 63 6f 6e 74 61 69  er but it contai
2f990 6e 73 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ns .          **
2f9a0 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 66 72 65   pointers to fre
2f9b0 65 2d 6c 69 73 74 20 6c 65 61 76 65 73 2e 20 54  e-list leaves. T
2f9c0 68 65 20 66 69 72 73 74 20 6c 65 61 66 20 62 65  he first leaf be
2f9d0 63 6f 6d 65 73 20 61 20 74 72 75 6e 6b 0a 20 20  comes a trunk.  
2f9e0 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20          ** page 
2f9f0 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 20 20  in this case..  
2fa00 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
2fa10 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e       MemPage *pN
2fa20 65 77 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20  ewTrunk;.       
2fa30 20 20 20 50 67 6e 6f 20 69 4e 65 77 54 72 75 6e     Pgno iNewTrun
2fa40 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 54  k = get4byte(&pT
2fa50 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d 29 3b  runk->aData[8]);
2fa60 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
2fa70 4e 65 77 54 72 75 6e 6b 3e 6d 78 50 61 67 65 20  NewTrunk>mxPage 
2fa80 29 7b 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  ){ .            
2fa90 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
2faa0 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
2fab0 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
2fac0 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
2fad0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2fae0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 4e      testcase( iN
2faf0 65 77 54 72 75 6e 6b 3d 3d 6d 78 50 61 67 65 20  ewTrunk==mxPage 
2fb00 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  );.          rc 
2fb10 3d 20 62 74 72 65 65 47 65 74 55 6e 75 73 65 64  = btreeGetUnused
2fb20 50 61 67 65 28 70 42 74 2c 20 69 4e 65 77 54 72  Page(pBt, iNewTr
2fb30 75 6e 6b 2c 20 26 70 4e 65 77 54 72 75 6e 6b 2c  unk, &pNewTrunk,
2fb40 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69   0);.          i
2fb50 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2fb60 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2fb70 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
2fb80 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20  e_page;.        
2fb90 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72 63    }.          rc
2fba0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
2fbb0 72 69 74 65 28 70 4e 65 77 54 72 75 6e 6b 2d 3e  rite(pNewTrunk->
2fbc0 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
2fbd0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
2fbe0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
2fbf0 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
2fc00 28 70 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20  (pNewTrunk);.   
2fc10 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
2fc20 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b  d_allocate_page;
2fc30 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2fc40 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70         memcpy(&p
2fc50 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b  NewTrunk->aData[
2fc60 30 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61  0], &pTrunk->aDa
2fc70 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20  ta[0], 4);.     
2fc80 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
2fc90 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b  NewTrunk->aData[
2fca0 34 5d 2c 20 6b 2d 31 29 3b 0a 20 20 20 20 20 20  4], k-1);.      
2fcb0 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4e 65 77      memcpy(&pNew
2fcc0 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d 2c  Trunk->aData[8],
2fcd0 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b   &pTrunk->aData[
2fce0 31 32 5d 2c 20 28 6b 2d 31 29 2a 34 29 3b 0a 20  12], (k-1)*4);. 
2fcf0 20 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65           release
2fd00 50 61 67 65 28 70 4e 65 77 54 72 75 6e 6b 29 3b  Page(pNewTrunk);
2fd10 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21  .          if( !
2fd20 70 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20  pPrevTrunk ){.  
2fd30 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
2fd40 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
2fd50 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 31  writeable(pPage1
2fd60 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
2fd70 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79            put4by
2fd80 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
2fd90 61 5b 33 32 5d 2c 20 69 4e 65 77 54 72 75 6e 6b  a[32], iNewTrunk
2fda0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  );.          }el
2fdb0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
2fdc0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
2fdd0 72 57 72 69 74 65 28 70 50 72 65 76 54 72 75 6e  rWrite(pPrevTrun
2fde0 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  k->pDbPage);.   
2fdf0 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20           if( rc 
2fe00 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
2fe10 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
2fe20 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20  te_page;.       
2fe30 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2fe40 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50 72     put4byte(&pPr
2fe50 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30  evTrunk->aData[0
2fe60 5d 2c 20 69 4e 65 77 54 72 75 6e 6b 29 3b 0a 20  ], iNewTrunk);. 
2fe70 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2fe80 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 54 72     }.        pTr
2fe90 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  unk = 0;.       
2fea0 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54   TRACE(("ALLOCAT
2feb0 45 3a 20 25 64 20 74 72 75 6e 6b 20 2d 20 25 64  E: %d trunk - %d
2fec0 20 66 72 65 65 20 70 61 67 65 73 20 6c 65 66 74   free pages left
2fed0 5c 6e 22 2c 20 2a 70 50 67 6e 6f 2c 20 6e 2d 31  \n", *pPgno, n-1
2fee0 29 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  ));.#endif.     
2fef0 20 7d 65 6c 73 65 20 69 66 28 20 6b 3e 30 20 29   }else if( k>0 )
2ff00 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74  {.        /* Ext
2ff10 72 61 63 74 20 61 20 6c 65 61 66 20 66 72 6f 6d  ract a leaf from
2ff20 20 74 68 65 20 74 72 75 6e 6b 20 2a 2f 0a 20 20   the trunk */.  
2ff30 20 20 20 20 20 20 75 33 32 20 63 6c 6f 73 65 73        u32 closes
2ff40 74 3b 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20  t;.        Pgno 
2ff50 69 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20 75  iPage;.        u
2ff60 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 44  nsigned char *aD
2ff70 61 74 61 20 3d 20 70 54 72 75 6e 6b 2d 3e 61 44  ata = pTrunk->aD
2ff80 61 74 61 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ata;.        if(
2ff90 20 6e 65 61 72 62 79 3e 30 20 29 7b 0a 20 20 20   nearby>0 ){.   
2ffa0 20 20 20 20 20 20 20 75 33 32 20 69 3b 0a 20 20         u32 i;.  
2ffb0 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20          closest 
2ffc0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 69  = 0;.          i
2ffd0 66 28 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f  f( eMode==BTALLO
2ffe0 43 5f 4c 45 20 29 7b 0a 20 20 20 20 20 20 20 20  C_LE ){.        
2fff0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6b      for(i=0; i<k
30000 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
30010 20 20 20 20 20 20 69 50 61 67 65 20 3d 20 67 65        iPage = ge
30020 74 34 62 79 74 65 28 26 61 44 61 74 61 5b 38 2b  t4byte(&aData[8+
30030 69 2a 34 5d 29 3b 0a 20 20 20 20 20 20 20 20 20  i*4]);.         
30040 20 20 20 20 20 69 66 28 20 69 50 61 67 65 3c 3d       if( iPage<=
30050 6e 65 61 72 62 79 20 29 7b 0a 20 20 20 20 20 20  nearby ){.      
30060 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73            closes
30070 74 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 20  t = i;.         
30080 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
30090 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
300a0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
300b0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
300c0 20 20 20 20 20 20 20 20 20 69 6e 74 20 64 69 73           int dis
300d0 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 64  t;.            d
300e0 69 73 74 20 3d 20 73 71 6c 69 74 65 33 41 62 73  ist = sqlite3Abs
300f0 49 6e 74 33 32 28 67 65 74 34 62 79 74 65 28 26  Int32(get4byte(&
30100 61 44 61 74 61 5b 38 5d 29 20 2d 20 6e 65 61 72  aData[8]) - near
30110 62 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  by);.           
30120 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6b 3b 20 69   for(i=1; i<k; i
30130 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
30140 20 20 20 69 6e 74 20 64 32 20 3d 20 73 71 6c 69     int d2 = sqli
30150 74 65 33 41 62 73 49 6e 74 33 32 28 67 65 74 34  te3AbsInt32(get4
30160 62 79 74 65 28 26 61 44 61 74 61 5b 38 2b 69 2a  byte(&aData[8+i*
30170 34 5d 29 20 2d 20 6e 65 61 72 62 79 29 3b 0a 20  4]) - nearby);. 
30180 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
30190 20 64 32 3c 64 69 73 74 20 29 7b 0a 20 20 20 20   d2<dist ){.    
301a0 20 20 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73              clos
301b0 65 73 74 20 3d 20 69 3b 0a 20 20 20 20 20 20 20  est = i;.       
301c0 20 20 20 20 20 20 20 20 20 64 69 73 74 20 3d 20           dist = 
301d0 64 32 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  d2;.            
301e0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
301f0 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  }.          }.  
30200 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
30210 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d         closest =
30220 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20   0;.        }.. 
30230 20 20 20 20 20 20 20 69 50 61 67 65 20 3d 20 67         iPage = g
30240 65 74 34 62 79 74 65 28 26 61 44 61 74 61 5b 38  et4byte(&aData[8
30250 2b 63 6c 6f 73 65 73 74 2a 34 5d 29 3b 0a 20 20  +closest*4]);.  
30260 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
30270 69 50 61 67 65 3d 3d 6d 78 50 61 67 65 20 29 3b  iPage==mxPage );
30280 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 50 61  .        if( iPa
30290 67 65 3e 6d 78 50 61 67 65 20 29 7b 0a 20 20 20  ge>mxPage ){.   
302a0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
302b0 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
302c0 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
302d0 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67  end_allocate_pag
302e0 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  e;.        }.   
302f0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
30300 50 61 67 65 3d 3d 6d 78 50 61 67 65 20 29 3b 0a  Page==mxPage );.
30310 20 20 20 20 20 20 20 20 69 66 28 20 21 73 65 61          if( !sea
30320 72 63 68 4c 69 73 74 20 0a 20 20 20 20 20 20 20  rchList .       
30330 20 20 7c 7c 20 28 69 50 61 67 65 3d 3d 6e 65 61    || (iPage==nea
30340 72 62 79 20 7c 7c 20 28 69 50 61 67 65 3c 6e 65  rby || (iPage<ne
30350 61 72 62 79 20 26 26 20 65 4d 6f 64 65 3d 3d 42  arby && eMode==B
30360 54 41 4c 4c 4f 43 5f 4c 45 29 29 20 0a 20 20 20  TALLOC_LE)) .   
30370 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
30380 20 20 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74 3b    int noContent;
30390 0a 20 20 20 20 20 20 20 20 20 20 2a 70 50 67 6e  .          *pPgn
303a0 6f 20 3d 20 69 50 61 67 65 3b 0a 20 20 20 20 20  o = iPage;.     
303b0 20 20 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c       TRACE(("ALL
303c0 4f 43 41 54 45 3a 20 25 64 20 77 61 73 20 6c 65  OCATE: %d was le
303d0 61 66 20 25 64 20 6f 66 20 25 64 20 6f 6e 20 74  af %d of %d on t
303e0 72 75 6e 6b 20 25 64 22 0a 20 20 20 20 20 20 20  runk %d".       
303f0 20 20 20 20 20 20 20 20 20 20 22 3a 20 25 64 20            ": %d 
30400 6d 6f 72 65 20 66 72 65 65 20 70 61 67 65 73 5c  more free pages\
30410 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
30420 20 20 20 20 20 2a 70 50 67 6e 6f 2c 20 63 6c 6f       *pPgno, clo
30430 73 65 73 74 2b 31 2c 20 6b 2c 20 70 54 72 75 6e  sest+1, k, pTrun
30440 6b 2d 3e 70 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a  k->pgno, n-1));.
30450 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
30460 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
30470 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65  (pTrunk->pDbPage
30480 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
30490 20 72 63 20 29 20 67 6f 74 6f 20 65 6e 64 5f 61   rc ) goto end_a
304a0 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
304b0 20 20 20 20 20 20 20 20 69 66 28 20 63 6c 6f 73          if( clos
304c0 65 73 74 3c 6b 2d 31 20 29 7b 0a 20 20 20 20 20  est<k-1 ){.     
304d0 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 61         memcpy(&a
304e0 44 61 74 61 5b 38 2b 63 6c 6f 73 65 73 74 2a 34  Data[8+closest*4
304f0 5d 2c 20 26 61 44 61 74 61 5b 34 2b 6b 2a 34 5d  ], &aData[4+k*4]
30500 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 4);.          
30510 7d 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 34  }.          put4
30520 62 79 74 65 28 26 61 44 61 74 61 5b 34 5d 2c 20  byte(&aData[4], 
30530 6b 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20  k-1);.          
30540 6e 6f 43 6f 6e 74 65 6e 74 20 3d 20 21 62 74 72  noContent = !btr
30550 65 65 47 65 74 48 61 73 43 6f 6e 74 65 6e 74 28  eeGetHasContent(
30560 70 42 74 2c 20 2a 70 50 67 6e 6f 29 3f 20 50 41  pBt, *pPgno)? PA
30570 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e  GER_GET_NOCONTEN
30580 54 20 3a 20 30 3b 0a 20 20 20 20 20 20 20 20 20  T : 0;.         
30590 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 55 6e   rc = btreeGetUn
305a0 75 73 65 64 50 61 67 65 28 70 42 74 2c 20 2a 70  usedPage(pBt, *p
305b0 50 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 6e 6f  Pgno, ppPage, no
305c0 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 20 20 20 20  Content);.      
305d0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
305e0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
305f0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
30600 33 50 61 67 65 72 57 72 69 74 65 28 28 2a 70 70  3PagerWrite((*pp
30610 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3b  Page)->pDbPage);
30620 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
30630 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
30640 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
30650 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50  releasePage(*ppP
30660 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
30670 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b      *ppPage = 0;
30680 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
30690 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
306a0 20 20 20 20 20 73 65 61 72 63 68 4c 69 73 74 20       searchList 
306b0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 0;.        }. 
306c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 6c       }.      rel
306d0 65 61 73 65 50 61 67 65 28 70 50 72 65 76 54 72  easePage(pPrevTr
306e0 75 6e 6b 29 3b 0a 20 20 20 20 20 20 70 50 72 65  unk);.      pPre
306f0 76 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20  vTrunk = 0;.    
30700 7d 77 68 69 6c 65 28 20 73 65 61 72 63 68 4c 69  }while( searchLi
30710 73 74 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  st );.  }else{. 
30720 20 20 20 2f 2a 20 54 68 65 72 65 20 61 72 65 20     /* There are 
30730 6e 6f 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20  no pages on the 
30740 66 72 65 65 6c 69 73 74 2c 20 73 6f 20 61 70 70  freelist, so app
30750 65 6e 64 20 61 20 6e 65 77 20 70 61 67 65 20 74  end a new page t
30760 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74  o the.    ** dat
30770 61 62 61 73 65 20 69 6d 61 67 65 2e 0a 20 20 20  abase image..   
30780 20 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f 72 6d 61   **.    ** Norma
30790 6c 6c 79 2c 20 6e 65 77 20 70 61 67 65 73 20 61  lly, new pages a
307a0 6c 6c 6f 63 61 74 65 64 20 62 79 20 74 68 69 73  llocated by this
307b0 20 62 6c 6f 63 6b 20 63 61 6e 20 62 65 20 72 65   block can be re
307c0 71 75 65 73 74 65 64 20 66 72 6f 6d 20 74 68 65  quested from the
307d0 0a 20 20 20 20 2a 2a 20 70 61 67 65 72 20 6c 61  .    ** pager la
307e0 79 65 72 20 77 69 74 68 20 74 68 65 20 27 6e 6f  yer with the 'no
307f0 2d 63 6f 6e 74 65 6e 74 27 20 66 6c 61 67 20 73  -content' flag s
30800 65 74 2e 20 54 68 69 73 20 70 72 65 76 65 6e 74  et. This prevent
30810 73 20 74 68 65 20 70 61 67 65 72 0a 20 20 20 20  s the pager.    
30820 2a 2a 20 66 72 6f 6d 20 74 72 79 69 6e 67 20 74  ** from trying t
30830 6f 20 72 65 61 64 20 74 68 65 20 70 61 67 65 73  o read the pages
30840 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 64 69   content from di
30850 73 6b 2e 20 48 6f 77 65 76 65 72 2c 20 69 66 20  sk. However, if 
30860 74 68 65 0a 20 20 20 20 2a 2a 20 63 75 72 72 65  the.    ** curre
30870 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68  nt transaction h
30880 61 73 20 61 6c 72 65 61 64 79 20 72 75 6e 20 6f  as already run o
30890 6e 65 20 6f 72 20 6d 6f 72 65 20 69 6e 63 72 65  ne or more incre
308a0 6d 65 6e 74 61 6c 2d 76 61 63 75 75 6d 0a 20 20  mental-vacuum.  
308b0 20 20 2a 2a 20 73 74 65 70 73 2c 20 74 68 65 6e    ** steps, then
308c0 20 74 68 65 20 70 61 67 65 20 77 65 20 61 72 65   the page we are
308d0 20 61 62 6f 75 74 20 74 6f 20 61 6c 6c 6f 63 61   about to alloca
308e0 74 65 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 63  te may contain c
308f0 6f 6e 74 65 6e 74 0a 20 20 20 20 2a 2a 20 74 68  ontent.    ** th
30900 61 74 20 69 73 20 72 65 71 75 69 72 65 64 20 69  at is required i
30910 6e 20 74 68 65 20 65 76 65 6e 74 20 6f 66 20 61  n the event of a
30920 20 72 6f 6c 6c 62 61 63 6b 2e 20 49 6e 20 74 68   rollback. In th
30930 69 73 20 63 61 73 65 2c 20 64 6f 0a 20 20 20 20  is case, do.    
30940 2a 2a 20 6e 6f 74 20 73 65 74 20 74 68 65 20 6e  ** not set the n
30950 6f 2d 63 6f 6e 74 65 6e 74 20 66 6c 61 67 2e 20  o-content flag. 
30960 54 68 69 73 20 63 61 75 73 65 73 20 74 68 65 20  This causes the 
30970 70 61 67 65 72 20 74 6f 20 6c 6f 61 64 20 61 6e  pager to load an
30980 64 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a  d journal.    **
30990 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67   the current pag
309a0 65 20 63 6f 6e 74 65 6e 74 20 62 65 66 6f 72 65  e content before
309b0 20 6f 76 65 72 77 72 69 74 69 6e 67 20 69 74 2e   overwriting it.
309c0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4e  .    **.    ** N
309d0 6f 74 65 20 74 68 61 74 20 74 68 65 20 70 61 67  ote that the pag
309e0 65 72 20 77 69 6c 6c 20 6e 6f 74 20 61 63 74 75  er will not actu
309f0 61 6c 6c 79 20 61 74 74 65 6d 70 74 20 74 6f 20  ally attempt to 
30a00 6c 6f 61 64 20 6f 72 20 6a 6f 75 72 6e 61 6c 20  load or journal 
30a10 0a 20 20 20 20 2a 2a 20 63 6f 6e 74 65 6e 74 20  .    ** content 
30a20 66 6f 72 20 61 6e 79 20 70 61 67 65 20 74 68 61  for any page tha
30a30 74 20 72 65 61 6c 6c 79 20 64 6f 65 73 20 6c 69  t really does li
30a40 65 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f  e past the end o
30a50 66 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20  f the database. 
30a60 20 20 20 2a 2a 20 66 69 6c 65 20 6f 6e 20 64 69     ** file on di
30a70 73 6b 2e 20 53 6f 20 74 68 65 20 65 66 66 65 63  sk. So the effec
30a80 74 73 20 6f 66 20 64 69 73 61 62 6c 69 6e 67 20  ts of disabling 
30a90 74 68 65 20 6e 6f 2d 63 6f 6e 74 65 6e 74 20 6f  the no-content o
30aa0 70 74 69 6d 69 7a 61 74 69 6f 6e 0a 20 20 20 20  ptimization.    
30ab0 2a 2a 20 68 65 72 65 20 61 72 65 20 63 6f 6e 66  ** here are conf
30ac0 69 6e 65 64 20 74 6f 20 74 68 6f 73 65 20 70 61  ined to those pa
30ad0 67 65 73 20 74 68 61 74 20 6c 69 65 20 62 65 74  ges that lie bet
30ae0 77 65 65 6e 20 74 68 65 20 65 6e 64 20 6f 66 20  ween the end of 
30af0 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62  the.    ** datab
30b00 61 73 65 20 69 6d 61 67 65 20 61 6e 64 20 74 68  ase image and th
30b10 65 20 65 6e 64 20 6f 66 20 74 68 65 20 64 61 74  e end of the dat
30b20 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20  abase file..    
30b30 2a 2f 0a 20 20 20 20 69 6e 74 20 62 4e 6f 43 6f  */.    int bNoCo
30b40 6e 74 65 6e 74 20 3d 20 28 30 3d 3d 49 66 4e 6f  ntent = (0==IfNo
30b50 74 4f 6d 69 74 41 56 28 70 42 74 2d 3e 62 44 6f  tOmitAV(pBt->bDo
30b60 54 72 75 6e 63 61 74 65 29 29 3f 20 50 41 47 45  Truncate))? PAGE
30b70 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 3a  R_GET_NOCONTENT:
30b80 30 3b 0a 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  0;..    rc = sql
30b90 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
30ba0 42 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62 50  Bt->pPage1->pDbP
30bb0 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
30bc0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
30bd0 20 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 0a    pBt->nPage++;.
30be0 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6e 50 61      if( pBt->nPa
30bf0 67 65 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  ge==PENDING_BYTE
30c00 5f 50 41 47 45 28 70 42 74 29 20 29 20 70 42 74  _PAGE(pBt) ) pBt
30c10 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 0a 23 69 66 6e  ->nPage++;..#ifn
30c20 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
30c30 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69  AUTOVACUUM.    i
30c40 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  f( pBt->autoVacu
30c50 75 6d 20 26 26 20 50 54 52 4d 41 50 5f 49 53 50  um && PTRMAP_ISP
30c60 41 47 45 28 70 42 74 2c 20 70 42 74 2d 3e 6e 50  AGE(pBt, pBt->nP
30c70 61 67 65 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a  age) ){.      /*
30c80 20 49 66 20 2a 70 50 67 6e 6f 20 72 65 66 65 72   If *pPgno refer
30c90 73 20 74 6f 20 61 20 70 6f 69 6e 74 65 72 2d 6d  s to a pointer-m
30ca0 61 70 20 70 61 67 65 2c 20 61 6c 6c 6f 63 61 74  ap page, allocat
30cb0 65 20 74 77 6f 20 6e 65 77 20 70 61 67 65 73 0a  e two new pages.
30cc0 20 20 20 20 20 20 2a 2a 20 61 74 20 74 68 65 20        ** at the 
30cd0 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20  end of the file 
30ce0 69 6e 73 74 65 61 64 20 6f 66 20 6f 6e 65 2e 20  instead of one. 
30cf0 54 68 65 20 66 69 72 73 74 20 61 6c 6c 6f 63 61  The first alloca
30d00 74 65 64 20 70 61 67 65 0a 20 20 20 20 20 20 2a  ted page.      *
30d10 2a 20 62 65 63 6f 6d 65 73 20 61 20 6e 65 77 20  * becomes a new 
30d20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65  pointer-map page
30d30 2c 20 74 68 65 20 73 65 63 6f 6e 64 20 69 73 20  , the second is 
30d40 75 73 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c  used by the call
30d50 65 72 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  er..      */.   
30d60 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 67 20     MemPage *pPg 
30d70 3d 20 30 3b 0a 20 20 20 20 20 20 54 52 41 43 45  = 0;.      TRACE
30d80 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20  (("ALLOCATE: %d 
30d90 66 72 6f 6d 20 65 6e 64 20 6f 66 20 66 69 6c 65  from end of file
30da0 20 28 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61   (pointer-map pa
30db0 67 65 29 5c 6e 22 2c 20 70 42 74 2d 3e 6e 50 61  ge)\n", pBt->nPa
30dc0 67 65 29 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ge));.      asse
30dd0 72 74 28 20 70 42 74 2d 3e 6e 50 61 67 65 21 3d  rt( pBt->nPage!=
30de0 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
30df0 45 28 70 42 74 29 20 29 3b 0a 20 20 20 20 20 20  E(pBt) );.      
30e00 72 63 20 3d 20 62 74 72 65 65 47 65 74 55 6e 75  rc = btreeGetUnu
30e10 73 65 64 50 61 67 65 28 70 42 74 2c 20 70 42 74  sedPage(pBt, pBt
30e20 2d 3e 6e 50 61 67 65 2c 20 26 70 50 67 2c 20 62  ->nPage, &pPg, b
30e30 4e 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 20 20  NoContent);.    
30e40 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
30e50 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
30e60 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
30e70 57 72 69 74 65 28 70 50 67 2d 3e 70 44 62 50 61  Write(pPg->pDbPa
30e80 67 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65 6c  ge);.        rel
30e90 65 61 73 65 50 61 67 65 28 70 50 67 29 3b 0a 20  easePage(pPg);. 
30ea0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
30eb0 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
30ec0 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 50 61 67  .      pBt->nPag
30ed0 65 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70  e++;.      if( p
30ee0 42 74 2d 3e 6e 50 61 67 65 3d 3d 50 45 4e 44 49  Bt->nPage==PENDI
30ef0 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
30f00 29 20 29 7b 20 70 42 74 2d 3e 6e 50 61 67 65 2b  ) ){ pBt->nPage+
30f10 2b 3b 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69  +; }.    }.#endi
30f20 66 0a 20 20 20 20 70 75 74 34 62 79 74 65 28 32  f.    put4byte(2
30f30 38 20 2b 20 28 75 38 2a 29 70 42 74 2d 3e 70 50  8 + (u8*)pBt->pP
30f40 61 67 65 31 2d 3e 61 44 61 74 61 2c 20 70 42 74  age1->aData, pBt
30f50 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20 2a 70  ->nPage);.    *p
30f60 50 67 6e 6f 20 3d 20 70 42 74 2d 3e 6e 50 61 67  Pgno = pBt->nPag
30f70 65 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  e;..    assert( 
30f80 2a 70 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f  *pPgno!=PENDING_
30f90 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
30fa0 3b 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65 65  ;.    rc = btree
30fb0 47 65 74 55 6e 75 73 65 64 50 61 67 65 28 70 42  GetUnusedPage(pB
30fc0 74 2c 20 2a 70 50 67 6e 6f 2c 20 70 70 50 61 67  t, *pPgno, ppPag
30fd0 65 2c 20 62 4e 6f 43 6f 6e 74 65 6e 74 29 3b 0a  e, bNoContent);.
30fe0 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
30ff0 75 72 6e 20 72 63 3b 0a 20 20 20 20 72 63 20 3d  urn rc;.    rc =
31000 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
31010 74 65 28 28 2a 70 70 50 61 67 65 29 2d 3e 70 44  te((*ppPage)->pD
31020 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
31030 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
31040 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
31050 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20  ge(*ppPage);.   
31060 20 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a     *ppPage = 0;.
31070 20 20 20 20 7d 0a 20 20 20 20 54 52 41 43 45 28      }.    TRACE(
31080 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 66  ("ALLOCATE: %d f
31090 72 6f 6d 20 65 6e 64 20 6f 66 20 66 69 6c 65 5c  rom end of file\
310a0 6e 22 2c 20 2a 70 50 67 6e 6f 29 29 3b 0a 20 20  n", *pPgno));.  
310b0 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 2a 70 50  }..  assert( *pP
310c0 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54  gno!=PENDING_BYT
310d0 45 5f 50 41 47 45 28 70 42 74 29 20 29 3b 0a 0a  E_PAGE(pBt) );..
310e0 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67  end_allocate_pag
310f0 65 3a 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65  e:.  releasePage
31100 28 70 54 72 75 6e 6b 29 3b 0a 20 20 72 65 6c 65  (pTrunk);.  rele
31110 61 73 65 50 61 67 65 28 70 50 72 65 76 54 72 75  asePage(pPrevTru
31120 6e 6b 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72  nk);.  assert( r
31130 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
31140 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
31150 52 65 66 63 6f 75 6e 74 28 28 2a 70 70 50 61 67  Refcount((*ppPag
31160 65 29 2d 3e 70 44 62 50 61 67 65 29 3c 3d 31 20  e)->pDbPage)<=1 
31170 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 21  );.  assert( rc!
31180 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 2a  =SQLITE_OK || (*
31190 70 70 50 61 67 65 29 2d 3e 69 73 49 6e 69 74 3d  ppPage)->isInit=
311a0 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  =0 );.  return r
311b0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
311c0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65   function is use
311d0 64 20 74 6f 20 61 64 64 20 70 61 67 65 20 69 50  d to add page iP
311e0 61 67 65 20 74 6f 20 74 68 65 20 64 61 74 61 62  age to the datab
311f0 61 73 65 20 66 69 6c 65 20 66 72 65 65 2d 6c 69  ase file free-li
31200 73 74 2e 20 0a 2a 2a 20 49 74 20 69 73 20 61 73  st. .** It is as
31210 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 20 70  sumed that the p
31220 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61  age is not alrea
31230 64 79 20 61 20 70 61 72 74 20 6f 66 20 74 68 65  dy a part of the
31240 20 66 72 65 65 2d 6c 69 73 74 2e 0a 2a 2a 0a 2a   free-list..**.*
31250 2a 20 54 68 65 20 76 61 6c 75 65 20 70 61 73 73  * The value pass
31260 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
31270 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69   argument to thi
31280 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 70  s function is op
31290 74 69 6f 6e 61 6c 2e 0a 2a 2a 20 49 66 20 74 68  tional..** If th
312a0 65 20 63 61 6c 6c 65 72 20 68 61 70 70 65 6e 73  e caller happens
312b0 20 74 6f 20 68 61 76 65 20 61 20 70 6f 69 6e 74   to have a point
312c0 65 72 20 74 6f 20 74 68 65 20 4d 65 6d 50 61 67  er to the MemPag
312d0 65 20 6f 62 6a 65 63 74 20 0a 2a 2a 20 63 6f 72  e object .** cor
312e0 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 70 61  responding to pa
312f0 67 65 20 69 50 61 67 65 20 68 61 6e 64 79 2c 20  ge iPage handy, 
31300 69 74 20 6d 61 79 20 70 61 73 73 20 69 74 20 61  it may pass it a
31310 73 20 74 68 65 20 73 65 63 6f 6e 64 20 76 61 6c  s the second val
31320 75 65 2e 20 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ue. .** Otherwis
31330 65 2c 20 69 74 20 6d 61 79 20 70 61 73 73 20 4e  e, it may pass N
31340 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  ULL..**.** If a 
31350 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 4d 65 6d  pointer to a Mem
31360 50 61 67 65 20 6f 62 6a 65 63 74 20 69 73 20 70  Page object is p
31370 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
31380 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a  ond argument,.**
31390 20 69 74 73 20 72 65 66 65 72 65 6e 63 65 20 63   its reference c
313a0 6f 75 6e 74 20 69 73 20 6e 6f 74 20 61 6c 74 65  ount is not alte
313b0 72 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63  red by this func
313c0 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
313d0 69 6e 74 20 66 72 65 65 50 61 67 65 32 28 42 74  int freePage2(Bt
313e0 53 68 61 72 65 64 20 2a 70 42 74 2c 20 4d 65 6d  Shared *pBt, Mem
313f0 50 61 67 65 20 2a 70 4d 65 6d 50 61 67 65 2c 20  Page *pMemPage, 
31400 50 67 6e 6f 20 69 50 61 67 65 29 7b 0a 20 20 4d  Pgno iPage){.  M
31410 65 6d 50 61 67 65 20 2a 70 54 72 75 6e 6b 20 3d  emPage *pTrunk =
31420 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
31430 20 20 20 2f 2a 20 46 72 65 65 2d 6c 69 73 74 20     /* Free-list 
31440 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f 0a 20 20  trunk page */.  
31450 50 67 6e 6f 20 69 54 72 75 6e 6b 20 3d 20 30 3b  Pgno iTrunk = 0;
31460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31470 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62      /* Page numb
31480 65 72 20 6f 66 20 66 72 65 65 2d 6c 69 73 74 20  er of free-list 
31490 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f 20 0a 20  trunk page */ . 
314a0 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31   MemPage *pPage1
314b0 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 20   = pBt->pPage1; 
314c0 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 72 65       /* Local re
314d0 66 65 72 65 6e 63 65 20 74 6f 20 70 61 67 65 20  ference to page 
314e0 31 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  1 */.  MemPage *
314f0 70 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20  pPage;          
31500 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
31510 67 65 20 62 65 69 6e 67 20 66 72 65 65 64 2e 20  ge being freed. 
31520 4d 61 79 20 62 65 20 4e 55 4c 4c 2e 20 2a 2f 0a  May be NULL. */.
31530 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
31540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31550 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
31560 43 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 46  Code */.  int nF
31570 72 65 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ree;            
31580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
31590 20 49 6e 69 74 69 61 6c 20 6e 75 6d 62 65 72 20   Initial number 
315a0 6f 66 20 70 61 67 65 73 20 6f 6e 20 66 72 65 65  of pages on free
315b0 2d 6c 69 73 74 20 2a 2f 0a 0a 20 20 61 73 73 65  -list */..  asse
315c0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
315d0 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
315e0 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
315f0 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20 69 50  CORRUPT_DB || iP
31600 61 67 65 3e 31 20 29 3b 0a 20 20 61 73 73 65 72  age>1 );.  asser
31610 74 28 20 21 70 4d 65 6d 50 61 67 65 20 7c 7c 20  t( !pMemPage || 
31620 70 4d 65 6d 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d  pMemPage->pgno==
31630 69 50 61 67 65 20 29 3b 0a 0a 20 20 69 66 28 20  iPage );..  if( 
31640 69 50 61 67 65 3c 32 20 29 20 72 65 74 75 72 6e  iPage<2 ) return
31650 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
31660 42 4b 50 54 3b 0a 20 20 69 66 28 20 70 4d 65 6d  BKPT;.  if( pMem
31670 50 61 67 65 20 29 7b 0a 20 20 20 20 70 50 61 67  Page ){.    pPag
31680 65 20 3d 20 70 4d 65 6d 50 61 67 65 3b 0a 20 20  e = pMemPage;.  
31690 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65    sqlite3PagerRe
316a0 66 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  f(pPage->pDbPage
316b0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
316c0 70 50 61 67 65 20 3d 20 62 74 72 65 65 50 61 67  pPage = btreePag
316d0 65 4c 6f 6f 6b 75 70 28 70 42 74 2c 20 69 50 61  eLookup(pBt, iPa
316e0 67 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  ge);.  }..  /* I
316f0 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 66 72 65  ncrement the fre
31700 65 20 70 61 67 65 20 63 6f 75 6e 74 20 6f 6e 20  e page count on 
31710 70 50 61 67 65 31 20 2a 2f 0a 20 20 72 63 20 3d  pPage1 */.  rc =
31720 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
31730 74 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61  te(pPage1->pDbPa
31740 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  ge);.  if( rc ) 
31750 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75  goto freepage_ou
31760 74 3b 0a 20 20 6e 46 72 65 65 20 3d 20 67 65 74  t;.  nFree = get
31770 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61  4byte(&pPage1->a
31780 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 70 75 74  Data[36]);.  put
31790 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61  4byte(&pPage1->a
317a0 44 61 74 61 5b 33 36 5d 2c 20 6e 46 72 65 65 2b  Data[36], nFree+
317b0 31 29 3b 0a 0a 20 20 69 66 28 20 70 42 74 2d 3e  1);..  if( pBt->
317c0 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 53  btsFlags & BTS_S
317d0 45 43 55 52 45 5f 44 45 4c 45 54 45 20 29 7b 0a  ECURE_DELETE ){.
317e0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73 65      /* If the se
317f0 63 75 72 65 5f 64 65 6c 65 74 65 20 6f 70 74 69  cure_delete opti
31800 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64 2c 20 74  on is enabled, t
31810 68 65 6e 0a 20 20 20 20 2a 2a 20 61 6c 77 61 79  hen.    ** alway
31820 73 20 66 75 6c 6c 79 20 6f 76 65 72 77 72 69 74  s fully overwrit
31830 65 20 64 65 6c 65 74 65 64 20 69 6e 66 6f 72 6d  e deleted inform
31840 61 74 69 6f 6e 20 77 69 74 68 20 7a 65 72 6f 73  ation with zeros
31850 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
31860 20 28 21 70 50 61 67 65 20 26 26 20 28 28 72 63   (!pPage && ((rc
31870 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28   = btreeGetPage(
31880 70 42 74 2c 20 69 50 61 67 65 2c 20 26 70 50 61  pBt, iPage, &pPa
31890 67 65 2c 20 30 29 29 21 3d 30 29 20 29 0a 20 20  ge, 0))!=0) ).  
318a0 20 20 20 7c 7c 20 20 20 20 20 20 20 20 20 20 20     ||           
318b0 20 28 28 72 63 20 3d 20 73 71 6c 69 74 65 33 50   ((rc = sqlite3P
318c0 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65 2d  agerWrite(pPage-
318d0 3e 70 44 62 50 61 67 65 29 29 21 3d 30 29 0a 20  >pDbPage))!=0). 
318e0 20 20 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f     ){.      goto
318f0 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20   freepage_out;. 
31900 20 20 20 7d 0a 20 20 20 20 6d 65 6d 73 65 74 28     }.    memset(
31910 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 30 2c  pPage->aData, 0,
31920 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70 61 67   pPage->pBt->pag
31930 65 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f  eSize);.  }..  /
31940 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73  * If the databas
31950 65 20 73 75 70 70 6f 72 74 73 20 61 75 74 6f 2d  e supports auto-
31960 76 61 63 75 75 6d 2c 20 77 72 69 74 65 20 61 6e  vacuum, write an
31970 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 70 6f   entry in the po
31980 69 6e 74 65 72 2d 6d 61 70 0a 20 20 2a 2a 20 74  inter-map.  ** t
31990 6f 20 69 6e 64 69 63 61 74 65 20 74 68 61 74 20  o indicate that 
319a0 74 68 65 20 70 61 67 65 20 69 73 20 66 72 65 65  the page is free
319b0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 49 53 41  ..  */.  if( ISA
319c0 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20 20  UTOVACUUM ){.   
319d0 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20   ptrmapPut(pBt, 
319e0 69 50 61 67 65 2c 20 50 54 52 4d 41 50 5f 46 52  iPage, PTRMAP_FR
319f0 45 45 50 41 47 45 2c 20 30 2c 20 26 72 63 29 3b  EEPAGE, 0, &rc);
31a00 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f  .    if( rc ) go
31a10 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b  to freepage_out;
31a20 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20 6d  .  }..  /* Now m
31a30 61 6e 69 70 75 6c 61 74 65 20 74 68 65 20 61 63  anipulate the ac
31a40 74 75 61 6c 20 64 61 74 61 62 61 73 65 20 66 72  tual database fr
31a50 65 65 2d 6c 69 73 74 20 73 74 72 75 63 74 75 72  ee-list structur
31a60 65 2e 20 54 68 65 72 65 20 61 72 65 20 74 77 6f  e. There are two
31a70 0a 20 20 2a 2a 20 70 6f 73 73 69 62 69 6c 69 74  .  ** possibilit
31a80 69 65 73 2e 20 49 66 20 74 68 65 20 66 72 65 65  ies. If the free
31a90 2d 6c 69 73 74 20 69 73 20 63 75 72 72 65 6e 74  -list is current
31aa0 6c 79 20 65 6d 70 74 79 2c 20 6f 72 20 69 66 20  ly empty, or if 
31ab0 74 68 65 20 66 69 72 73 74 0a 20 20 2a 2a 20 74  the first.  ** t
31ac0 72 75 6e 6b 20 70 61 67 65 20 69 6e 20 74 68 65  runk page in the
31ad0 20 66 72 65 65 2d 6c 69 73 74 20 69 73 20 66 75   free-list is fu
31ae0 6c 6c 2c 20 74 68 65 6e 20 74 68 69 73 20 70 61  ll, then this pa
31af0 67 65 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 61  ge will become a
31b00 0a 20 20 2a 2a 20 6e 65 77 20 66 72 65 65 2d 6c  .  ** new free-l
31b10 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 2e 20  ist trunk page. 
31b20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 77 69  Otherwise, it wi
31b30 6c 6c 20 62 65 63 6f 6d 65 20 61 20 6c 65 61 66  ll become a leaf
31b40 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 66 69 72   of the.  ** fir
31b50 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20 69 6e  st trunk page in
31b60 20 74 68 65 20 63 75 72 72 65 6e 74 20 66 72 65   the current fre
31b70 65 2d 6c 69 73 74 2e 20 54 68 69 73 20 62 6c 6f  e-list. This blo
31b80 63 6b 20 74 65 73 74 73 20 69 66 20 69 74 0a 20  ck tests if it. 
31b90 20 2a 2a 20 69 73 20 70 6f 73 73 69 62 6c 65 20   ** is possible 
31ba0 74 6f 20 61 64 64 20 74 68 65 20 70 61 67 65 20  to add the page 
31bb0 61 73 20 61 20 6e 65 77 20 66 72 65 65 2d 6c 69  as a new free-li
31bc0 73 74 20 6c 65 61 66 2e 0a 20 20 2a 2f 0a 20 20  st leaf..  */.  
31bd0 69 66 28 20 6e 46 72 65 65 21 3d 30 20 29 7b 0a  if( nFree!=0 ){.
31be0 20 20 20 20 75 33 32 20 6e 4c 65 61 66 3b 20 20      u32 nLeaf;  
31bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
31c00 20 49 6e 69 74 69 61 6c 20 6e 75 6d 62 65 72 20   Initial number 
31c10 6f 66 20 6c 65 61 66 20 63 65 6c 6c 73 20 6f 6e  of leaf cells on
31c20 20 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f 0a 0a   trunk page */..
31c30 20 20 20 20 69 54 72 75 6e 6b 20 3d 20 67 65 74      iTrunk = get
31c40 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61  4byte(&pPage1->a
31c50 44 61 74 61 5b 33 32 5d 29 3b 0a 20 20 20 20 72  Data[32]);.    r
31c60 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65  c = btreeGetPage
31c70 28 70 42 74 2c 20 69 54 72 75 6e 6b 2c 20 26 70  (pBt, iTrunk, &p
31c80 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 69  Trunk, 0);.    i
31c90 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
31ca0 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66   ){.      goto f
31cb0 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20  reepage_out;.   
31cc0 20 7d 0a 0a 20 20 20 20 6e 4c 65 61 66 20 3d 20   }..    nLeaf = 
31cd0 67 65 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b  get4byte(&pTrunk
31ce0 2d 3e 61 44 61 74 61 5b 34 5d 29 3b 0a 20 20 20  ->aData[4]);.   
31cf0 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 75 73   assert( pBt->us
31d00 61 62 6c 65 53 69 7a 65 3e 33 32 20 29 3b 0a 20  ableSize>32 );. 
31d10 20 20 20 69 66 28 20 6e 4c 65 61 66 20 3e 20 28     if( nLeaf > (
31d20 75 33 32 29 70 42 74 2d 3e 75 73 61 62 6c 65 53  u32)pBt->usableS
31d30 69 7a 65 2f 34 20 2d 20 32 20 29 7b 0a 20 20 20  ize/4 - 2 ){.   
31d40 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
31d50 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
31d60 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65     goto freepage
31d70 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _out;.    }.    
31d80 69 66 28 20 6e 4c 65 61 66 20 3c 20 28 75 33 32  if( nLeaf < (u32
31d90 29 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  )pBt->usableSize
31da0 2f 34 20 2d 20 38 20 29 7b 0a 20 20 20 20 20 20  /4 - 8 ){.      
31db0 2f 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  /* In this case 
31dc0 74 68 65 72 65 20 69 73 20 72 6f 6f 6d 20 6f 6e  there is room on
31dd0 20 74 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20   the trunk page 
31de0 74 6f 20 69 6e 73 65 72 74 20 74 68 65 20 70 61  to insert the pa
31df0 67 65 0a 20 20 20 20 20 20 2a 2a 20 62 65 69 6e  ge.      ** bein
31e00 67 20 66 72 65 65 64 20 61 73 20 61 20 6e 65 77  g freed as a new
31e10 20 6c 65 61 66 2e 0a 20 20 20 20 20 20 2a 2a 0a   leaf..      **.
31e20 20 20 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68        ** Note th
31e30 61 74 20 74 68 65 20 74 72 75 6e 6b 20 70 61 67  at the trunk pag
31e40 65 20 69 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20  e is not really 
31e50 66 75 6c 6c 20 75 6e 74 69 6c 20 69 74 20 63 6f  full until it co
31e60 6e 74 61 69 6e 73 0a 20 20 20 20 20 20 2a 2a 20  ntains.      ** 
31e70 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 32  usableSize/4 - 2
31e80 20 65 6e 74 72 69 65 73 2c 20 6e 6f 74 20 75 73   entries, not us
31e90 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20 65  ableSize/4 - 8 e
31ea0 6e 74 72 69 65 73 20 61 73 20 77 65 20 68 61 76  ntries as we hav
31eb0 65 0a 20 20 20 20 20 20 2a 2a 20 63 6f 64 65 64  e.      ** coded
31ec0 2e 20 20 42 75 74 20 64 75 65 20 74 6f 20 61 20  .  But due to a 
31ed0 63 6f 64 69 6e 67 20 65 72 72 6f 72 20 69 6e 20  coding error in 
31ee0 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69  versions of SQLi
31ef0 74 65 20 70 72 69 6f 72 20 74 6f 0a 20 20 20 20  te prior to.    
31f00 20 20 2a 2a 20 33 2e 36 2e 30 2c 20 64 61 74 61    ** 3.6.0, data
31f10 62 61 73 65 73 20 77 69 74 68 20 66 72 65 65 6c  bases with freel
31f20 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 73 20  ist trunk pages 
31f30 68 6f 6c 64 69 6e 67 20 6d 6f 72 65 20 74 68 61  holding more tha
31f40 6e 0a 20 20 20 20 20 20 2a 2a 20 75 73 61 62 6c  n.      ** usabl
31f50 65 53 69 7a 65 2f 34 20 2d 20 38 20 65 6e 74 72  eSize/4 - 8 entr
31f60 69 65 73 20 77 69 6c 6c 20 62 65 20 72 65 70 6f  ies will be repo
31f70 72 74 65 64 20 61 73 20 63 6f 72 72 75 70 74 2e  rted as corrupt.
31f80 20 20 49 6e 20 6f 72 64 65 72 0a 20 20 20 20 20    In order.     
31f90 20 2a 2a 20 74 6f 20 6d 61 69 6e 74 61 69 6e 20   ** to maintain 
31fa0 62 61 63 6b 77 61 72 64 73 20 63 6f 6d 70 61 74  backwards compat
31fb0 69 62 69 6c 69 74 79 20 77 69 74 68 20 6f 6c 64  ibility with old
31fc0 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53  er versions of S
31fd0 51 4c 69 74 65 2c 0a 20 20 20 20 20 20 2a 2a 20  QLite,.      ** 
31fe0 77 65 20 77 69 6c 6c 20 63 6f 6e 74 69 6e 75 65  we will continue
31ff0 20 74 6f 20 72 65 73 74 72 69 63 74 20 74 68 65   to restrict the
32000 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69   number of entri
32010 65 73 20 74 6f 20 75 73 61 62 6c 65 53 69 7a 65  es to usableSize
32020 2f 34 20 2d 20 38 0a 20 20 20 20 20 20 2a 2a 20  /4 - 8.      ** 
32030 66 6f 72 20 6e 6f 77 2e 20 20 41 74 20 73 6f 6d  for now.  At som
32040 65 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 66  e point in the f
32050 75 74 75 72 65 20 28 6f 6e 63 65 20 65 76 65 72  uture (once ever
32060 79 6f 6e 65 20 68 61 73 20 75 70 67 72 61 64 65  yone has upgrade
32070 64 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 33 2e  d.      ** to 3.
32080 36 2e 30 20 6f 72 20 6c 61 74 65 72 29 20 77 65  6.0 or later) we
32090 20 73 68 6f 75 6c 64 20 63 6f 6e 73 69 64 65 72   should consider
320a0 20 66 69 78 69 6e 67 20 74 68 65 20 63 6f 6e 64   fixing the cond
320b0 69 74 69 6f 6e 61 6c 20 61 62 6f 76 65 0a 20 20  itional above.  
320c0 20 20 20 20 2a 2a 20 74 6f 20 72 65 61 64 20 22      ** to read "
320d0 75 73 61 62 6c 65 53 69 7a 65 2f 34 2d 32 22 20  usableSize/4-2" 
320e0 69 6e 73 74 65 61 64 20 6f 66 20 22 75 73 61 62  instead of "usab
320f0 6c 65 53 69 7a 65 2f 34 2d 38 22 2e 0a 20 20 20  leSize/4-8"..   
32100 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 45     **.      ** E
32110 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 39  VIDENCE-OF: R-19
32120 39 32 30 2d 31 31 35 37 36 20 48 6f 77 65 76 65  920-11576 Howeve
32130 72 2c 20 6e 65 77 65 72 20 76 65 72 73 69 6f 6e  r, newer version
32140 73 20 6f 66 20 53 51 4c 69 74 65 20 73 74 69 6c  s of SQLite stil
32150 6c 0a 20 20 20 20 20 20 2a 2a 20 61 76 6f 69 64  l.      ** avoid
32160 20 75 73 69 6e 67 20 74 68 65 20 6c 61 73 74 20   using the last 
32170 73 69 78 20 65 6e 74 72 69 65 73 20 69 6e 20 74  six entries in t
32180 68 65 20 66 72 65 65 6c 69 73 74 20 74 72 75 6e  he freelist trun
32190 6b 20 70 61 67 65 20 61 72 72 61 79 20 69 6e 0a  k page array in.
321a0 20 20 20 20 20 20 2a 2a 20 6f 72 64 65 72 20 74        ** order t
321b0 68 61 74 20 64 61 74 61 62 61 73 65 20 66 69 6c  hat database fil
321c0 65 73 20 63 72 65 61 74 65 64 20 62 79 20 6e 65  es created by ne
321d0 77 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  wer versions of 
321e0 53 51 4c 69 74 65 20 63 61 6e 20 62 65 0a 20 20  SQLite can be.  
321f0 20 20 20 20 2a 2a 20 72 65 61 64 20 62 79 20 6f      ** read by o
32200 6c 64 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66  lder versions of
32210 20 53 51 4c 69 74 65 2e 0a 20 20 20 20 20 20 2a   SQLite..      *
32220 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  /.      rc = sql
32230 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
32240 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b  Trunk->pDbPage);
32250 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
32260 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
32270 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 54      put4byte(&pT
32280 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c 20  runk->aData[4], 
32290 6e 4c 65 61 66 2b 31 29 3b 0a 20 20 20 20 20 20  nLeaf+1);.      
322a0 20 20 70 75 74 34 62 79 74 65 28 26 70 54 72 75    put4byte(&pTru
322b0 6e 6b 2d 3e 61 44 61 74 61 5b 38 2b 6e 4c 65 61  nk->aData[8+nLea
322c0 66 2a 34 5d 2c 20 69 50 61 67 65 29 3b 0a 20 20  f*4], iPage);.  
322d0 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 20        if( pPage 
322e0 26 26 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67  && (pBt->btsFlag
322f0 73 20 26 20 42 54 53 5f 53 45 43 55 52 45 5f 44  s & BTS_SECURE_D
32300 45 4c 45 54 45 29 3d 3d 30 20 29 7b 0a 20 20 20  ELETE)==0 ){.   
32310 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61         sqlite3Pa
32320 67 65 72 44 6f 6e 74 57 72 69 74 65 28 70 50 61  gerDontWrite(pPa
32330 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  ge->pDbPage);.  
32340 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
32350 72 63 20 3d 20 62 74 72 65 65 53 65 74 48 61 73  rc = btreeSetHas
32360 43 6f 6e 74 65 6e 74 28 70 42 74 2c 20 69 50 61  Content(pBt, iPa
32370 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ge);.      }.   
32380 20 20 20 54 52 41 43 45 28 28 22 46 52 45 45 2d     TRACE(("FREE-
32390 50 41 47 45 3a 20 25 64 20 6c 65 61 66 20 6f 6e  PAGE: %d leaf on
323a0 20 74 72 75 6e 6b 20 70 61 67 65 20 25 64 5c 6e   trunk page %d\n
323b0 22 2c 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 70 54  ",pPage->pgno,pT
323c0 72 75 6e 6b 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20  runk->pgno));.  
323d0 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67      goto freepag
323e0 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 7d  e_out;.    }.  }
323f0 0a 0a 20 20 2f 2a 20 49 66 20 63 6f 6e 74 72 6f  ..  /* If contro
32400 6c 20 66 6c 6f 77 73 20 74 6f 20 74 68 69 73 20  l flows to this 
32410 70 6f 69 6e 74 2c 20 74 68 65 6e 20 69 74 20 77  point, then it w
32420 61 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20  as not possible 
32430 74 6f 20 61 64 64 20 74 68 65 0a 20 20 2a 2a 20  to add the.  ** 
32440 74 68 65 20 70 61 67 65 20 62 65 69 6e 67 20 66  the page being f
32450 72 65 65 64 20 61 73 20 61 20 6c 65 61 66 20 70  reed as a leaf p
32460 61 67 65 20 6f 66 20 74 68 65 20 66 69 72 73 74  age of the first
32470 20 74 72 75 6e 6b 20 69 6e 20 74 68 65 20 66 72   trunk in the fr
32480 65 65 2d 6c 69 73 74 2e 0a 20 20 2a 2a 20 50 6f  ee-list..  ** Po
32490 73 73 69 62 6c 79 20 62 65 63 61 75 73 65 20 74  ssibly because t
324a0 68 65 20 66 72 65 65 2d 6c 69 73 74 20 69 73 20  he free-list is 
324b0 65 6d 70 74 79 2c 20 6f 72 20 70 6f 73 73 69 62  empty, or possib
324c0 6c 79 20 62 65 63 61 75 73 65 20 74 68 65 20 0a  ly because the .
324d0 20 20 2a 2a 20 66 69 72 73 74 20 74 72 75 6e 6b    ** first trunk
324e0 20 69 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73   in the free-lis
324f0 74 20 69 73 20 66 75 6c 6c 2e 20 45 69 74 68 65  t is full. Eithe
32500 72 20 77 61 79 2c 20 74 68 65 20 70 61 67 65 20  r way, the page 
32510 62 65 69 6e 67 20 66 72 65 65 64 0a 20 20 2a 2a  being freed.  **
32520 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65   will become the
32530 20 6e 65 77 20 66 69 72 73 74 20 74 72 75 6e 6b   new first trunk
32540 20 70 61 67 65 20 69 6e 20 74 68 65 20 66 72 65   page in the fre
32550 65 2d 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 69  e-list..  */.  i
32560 66 28 20 70 50 61 67 65 3d 3d 30 20 26 26 20 53  f( pPage==0 && S
32570 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20  QLITE_OK!=(rc = 
32580 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  btreeGetPage(pBt
32590 2c 20 69 50 61 67 65 2c 20 26 70 50 61 67 65 2c  , iPage, &pPage,
325a0 20 30 29 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f   0)) ){.    goto
325b0 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20   freepage_out;. 
325c0 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65   }.  rc = sqlite
325d0 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67  3PagerWrite(pPag
325e0 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 69  e->pDbPage);.  i
325f0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
32600 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 66 72 65   ){.    goto fre
32610 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20  epage_out;.  }. 
32620 20 70 75 74 34 62 79 74 65 28 70 50 61 67 65 2d   put4byte(pPage-
32630 3e 61 44 61 74 61 2c 20 69 54 72 75 6e 6b 29 3b  >aData, iTrunk);
32640 0a 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61  .  put4byte(&pPa
32650 67 65 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 30 29  ge->aData[4], 0)
32660 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 70 50  ;.  put4byte(&pP
32670 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c  age1->aData[32],
32680 20 69 50 61 67 65 29 3b 0a 20 20 54 52 41 43 45   iPage);.  TRACE
32690 28 28 22 46 52 45 45 2d 50 41 47 45 3a 20 25 64  (("FREE-PAGE: %d
326a0 20 6e 65 77 20 74 72 75 6e 6b 20 70 61 67 65 20   new trunk page 
326b0 72 65 70 6c 61 63 69 6e 67 20 25 64 5c 6e 22 2c  replacing %d\n",
326c0 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 69 54   pPage->pgno, iT
326d0 72 75 6e 6b 29 29 3b 0a 0a 66 72 65 65 70 61 67  runk));..freepag
326e0 65 5f 6f 75 74 3a 0a 20 20 69 66 28 20 70 50 61  e_out:.  if( pPa
326f0 67 65 20 29 7b 0a 20 20 20 20 70 50 61 67 65 2d  ge ){.    pPage-
32700 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 7d  >isInit = 0;.  }
32710 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70  .  releasePage(p
32720 50 61 67 65 29 3b 0a 20 20 72 65 6c 65 61 73 65  Page);.  release
32730 50 61 67 65 28 70 54 72 75 6e 6b 29 3b 0a 20 20  Page(pTrunk);.  
32740 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 73 74 61  return rc;.}.sta
32750 74 69 63 20 76 6f 69 64 20 66 72 65 65 50 61 67  tic void freePag
32760 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  e(MemPage *pPage
32770 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20 69  , int *pRC){.  i
32780 66 28 20 28 2a 70 52 43 29 3d 3d 53 51 4c 49 54  f( (*pRC)==SQLIT
32790 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52 43  E_OK ){.    *pRC
327a0 20 3d 20 66 72 65 65 50 61 67 65 32 28 70 50 61   = freePage2(pPa
327b0 67 65 2d 3e 70 42 74 2c 20 70 50 61 67 65 2c 20  ge->pBt, pPage, 
327c0 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20  pPage->pgno);.  
327d0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20  }.}../*.** Free 
327e0 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  any overflow pag
327f0 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  es associated wi
32800 74 68 20 74 68 65 20 67 69 76 65 6e 20 43 65 6c  th the given Cel
32810 6c 2e 20 20 57 72 69 74 65 20 74 68 65 0a 2a 2a  l.  Write the.**
32820 20 6c 6f 63 61 6c 20 43 65 6c 6c 20 73 69 7a 65   local Cell size
32830 20 28 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20   (the number of 
32840 62 79 74 65 73 20 6f 6e 20 74 68 65 20 6f 72 69  bytes on the ori
32850 67 69 6e 61 6c 20 70 61 67 65 2c 20 6f 6d 69 74  ginal page, omit
32860 74 69 6e 67 0a 2a 2a 20 6f 76 65 72 66 6c 6f 77  ting.** overflow
32870 29 20 69 6e 74 6f 20 2a 70 6e 53 69 7a 65 2e 0a  ) into *pnSize..
32880 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6c  */.static int cl
32890 65 61 72 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61  earCell(.  MemPa
328a0 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20  ge *pPage,      
328b0 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20      /* The page 
328c0 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68  that contains th
328d0 65 20 43 65 6c 6c 20 2a 2f 0a 20 20 75 6e 73 69  e Cell */.  unsi
328e0 67 6e 65 64 20 63 68 61 72 20 2a 70 43 65 6c 6c  gned char *pCell
328f0 2c 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79  ,    /* First by
32900 74 65 20 6f 66 20 74 68 65 20 43 65 6c 6c 20 2a  te of the Cell *
32910 2f 0a 20 20 75 31 36 20 2a 70 6e 53 69 7a 65 20  /.  u16 *pnSize 
32920 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
32930 57 72 69 74 65 20 74 68 65 20 73 69 7a 65 20 6f  Write the size o
32940 66 20 74 68 65 20 43 65 6c 6c 20 68 65 72 65 20  f the Cell here 
32950 2a 2f 0a 29 7b 0a 20 20 42 74 53 68 61 72 65 64  */.){.  BtShared
32960 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70   *pBt = pPage->p
32970 42 74 3b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69  Bt;.  CellInfo i
32980 6e 66 6f 3b 0a 20 20 50 67 6e 6f 20 6f 76 66 6c  nfo;.  Pgno ovfl
32990 50 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  Pgno;.  int rc;.
329a0 20 20 69 6e 74 20 6e 4f 76 66 6c 3b 0a 20 20 75    int nOvfl;.  u
329b0 33 32 20 6f 76 66 6c 50 61 67 65 53 69 7a 65 3b  32 ovflPageSize;
329c0 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
329d0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
329e0 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
329f0 29 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e 78 50  ) );.  pPage->xP
32a00 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20  arseCell(pPage, 
32a10 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20  pCell, &info);. 
32a20 20 2a 70 6e 53 69 7a 65 20 3d 20 69 6e 66 6f 2e   *pnSize = info.
32a30 6e 53 69 7a 65 3b 0a 20 20 69 66 28 20 69 6e 66  nSize;.  if( inf
32a40 6f 2e 69 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29  o.iOverflow==0 )
32a50 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
32a60 49 54 45 5f 4f 4b 3b 20 20 2f 2a 20 4e 6f 20 6f  ITE_OK;  /* No o
32a70 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 52  verflow pages. R
32a80 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20 64 6f  eturn without do
32a90 69 6e 67 20 61 6e 79 74 68 69 6e 67 20 2a 2f 0a  ing anything */.
32aa0 20 20 7d 0a 20 20 69 66 28 20 70 43 65 6c 6c 2b    }.  if( pCell+
32ab0 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 2b 33  info.iOverflow+3
32ac0 20 3e 20 70 50 61 67 65 2d 3e 61 44 61 74 61 2b   > pPage->aData+
32ad0 70 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65 20  pPage->maskPage 
32ae0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
32af0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
32b00 54 3b 20 20 2f 2a 20 43 65 6c 6c 20 65 78 74 65  T;  /* Cell exte
32b10 6e 64 73 20 70 61 73 74 20 65 6e 64 20 6f 66 20  nds past end of 
32b20 70 61 67 65 20 2a 2f 0a 20 20 7d 0a 20 20 6f 76  page */.  }.  ov
32b30 66 6c 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74  flPgno = get4byt
32b40 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f  e(&pCell[info.iO
32b50 76 65 72 66 6c 6f 77 5d 29 3b 0a 20 20 61 73 73  verflow]);.  ass
32b60 65 72 74 28 20 70 42 74 2d 3e 75 73 61 62 6c 65  ert( pBt->usable
32b70 53 69 7a 65 20 3e 20 34 20 29 3b 0a 20 20 6f 76  Size > 4 );.  ov
32b80 66 6c 50 61 67 65 53 69 7a 65 20 3d 20 70 42 74  flPageSize = pBt
32b90 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34  ->usableSize - 4
32ba0 3b 0a 20 20 6e 4f 76 66 6c 20 3d 20 28 69 6e 66  ;.  nOvfl = (inf
32bb0 6f 2e 6e 50 61 79 6c 6f 61 64 20 2d 20 69 6e 66  o.nPayload - inf
32bc0 6f 2e 6e 4c 6f 63 61 6c 20 2b 20 6f 76 66 6c 50  o.nLocal + ovflP
32bd0 61 67 65 53 69 7a 65 20 2d 20 31 29 2f 6f 76 66  ageSize - 1)/ovf
32be0 6c 50 61 67 65 53 69 7a 65 3b 0a 20 20 61 73 73  lPageSize;.  ass
32bf0 65 72 74 28 20 6e 4f 76 66 6c 3e 30 20 7c 7c 20  ert( nOvfl>0 || 
32c00 0a 20 20 20 20 28 43 4f 52 52 55 50 54 5f 44 42  .    (CORRUPT_DB
32c10 20 26 26 20 28 69 6e 66 6f 2e 6e 50 61 79 6c 6f   && (info.nPaylo
32c20 61 64 20 2b 20 6f 76 66 6c 50 61 67 65 53 69 7a  ad + ovflPageSiz
32c30 65 29 3c 6f 76 66 6c 50 61 67 65 53 69 7a 65 29  e)<ovflPageSize)
32c40 0a 20 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 6e  .  );.  while( n
32c50 4f 76 66 6c 2d 2d 20 29 7b 0a 20 20 20 20 50 67  Ovfl-- ){.    Pg
32c60 6e 6f 20 69 4e 65 78 74 20 3d 20 30 3b 0a 20 20  no iNext = 0;.  
32c70 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f 76 66 6c    MemPage *pOvfl
32c80 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 6f 76   = 0;.    if( ov
32c90 66 6c 50 67 6e 6f 3c 32 20 7c 7c 20 6f 76 66 6c  flPgno<2 || ovfl
32ca0 50 67 6e 6f 3e 62 74 72 65 65 50 61 67 65 63 6f  Pgno>btreePageco
32cb0 75 6e 74 28 70 42 74 29 20 29 7b 0a 20 20 20 20  unt(pBt) ){.    
32cc0 20 20 2f 2a 20 30 20 69 73 20 6e 6f 74 20 61 20    /* 0 is not a 
32cd0 6c 65 67 61 6c 20 70 61 67 65 20 6e 75 6d 62 65  legal page numbe
32ce0 72 20 61 6e 64 20 70 61 67 65 20 31 20 63 61 6e  r and page 1 can
32cf0 6e 6f 74 20 62 65 20 61 6e 20 0a 20 20 20 20 20  not be an .     
32d00 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   ** overflow pag
32d10 65 2e 20 54 68 65 72 65 66 6f 72 65 20 69 66 20  e. Therefore if 
32d20 6f 76 66 6c 50 67 6e 6f 3c 32 20 6f 72 20 70 61  ovflPgno<2 or pa
32d30 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  st the end of th
32d40 65 20 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 65  e .      ** file
32d50 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6d 75   the database mu
32d60 73 74 20 62 65 20 63 6f 72 72 75 70 74 2e 20 2a  st be corrupt. *
32d70 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  /.      return S
32d80 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
32d90 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  PT;.    }.    if
32da0 28 20 6e 4f 76 66 6c 20 29 7b 0a 20 20 20 20 20  ( nOvfl ){.     
32db0 20 72 63 20 3d 20 67 65 74 4f 76 65 72 66 6c 6f   rc = getOverflo
32dc0 77 50 61 67 65 28 70 42 74 2c 20 6f 76 66 6c 50  wPage(pBt, ovflP
32dd0 67 6e 6f 2c 20 26 70 4f 76 66 6c 2c 20 26 69 4e  gno, &pOvfl, &iN
32de0 65 78 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ext);.      if( 
32df0 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
32e00 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 28      }..    if( (
32e10 20 70 4f 76 66 6c 20 7c 7c 20 28 28 70 4f 76 66   pOvfl || ((pOvf
32e20 6c 20 3d 20 62 74 72 65 65 50 61 67 65 4c 6f 6f  l = btreePageLoo
32e30 6b 75 70 28 70 42 74 2c 20 6f 76 66 6c 50 67 6e  kup(pBt, ovflPgn
32e40 6f 29 29 21 3d 30 29 20 29 0a 20 20 20 20 20 26  o))!=0) ).     &
32e50 26 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  & sqlite3PagerPa
32e60 67 65 52 65 66 63 6f 75 6e 74 28 70 4f 76 66 6c  geRefcount(pOvfl
32e70 2d 3e 70 44 62 50 61 67 65 29 21 3d 31 0a 20 20  ->pDbPage)!=1.  
32e80 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68    ){.      /* Th
32e90 65 72 65 20 69 73 20 6e 6f 20 72 65 61 73 6f 6e  ere is no reason
32ea0 20 61 6e 79 20 63 75 72 73 6f 72 20 73 68 6f 75   any cursor shou
32eb0 6c 64 20 68 61 76 65 20 61 6e 20 6f 75 74 73 74  ld have an outst
32ec0 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65  anding reference
32ed0 20 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 61 6e   .      ** to an
32ee0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 62   overflow page b
32ef0 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 61 20 63 65  elonging to a ce
32f00 6c 6c 20 74 68 61 74 20 69 73 20 62 65 69 6e 67  ll that is being
32f10 20 64 65 6c 65 74 65 64 2f 75 70 64 61 74 65 64   deleted/updated
32f20 2e 0a 20 20 20 20 20 20 2a 2a 20 53 6f 20 69 66  ..      ** So if
32f30 20 74 68 65 72 65 20 65 78 69 73 74 73 20 6d 6f   there exists mo
32f40 72 65 20 74 68 61 6e 20 6f 6e 65 20 72 65 66 65  re than one refe
32f50 72 65 6e 63 65 20 74 6f 20 74 68 69 73 20 70 61  rence to this pa
32f60 67 65 2c 20 74 68 65 6e 20 69 74 20 0a 20 20 20  ge, then it .   
32f70 20 20 20 2a 2a 20 6d 75 73 74 20 6e 6f 74 20 72     ** must not r
32f80 65 61 6c 6c 79 20 62 65 20 61 6e 20 6f 76 65 72  eally be an over
32f90 66 6c 6f 77 20 70 61 67 65 20 61 6e 64 20 74 68  flow page and th
32fa0 65 20 64 61 74 61 62 61 73 65 20 6d 75 73 74 20  e database must 
32fb0 62 65 20 63 6f 72 72 75 70 74 2e 20 0a 20 20 20  be corrupt. .   
32fc0 20 20 20 2a 2a 20 49 74 20 69 73 20 68 65 6c 70     ** It is help
32fd0 66 75 6c 20 74 6f 20 64 65 74 65 63 74 20 74 68  ful to detect th
32fe0 69 73 20 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e  is before callin
32ff0 67 20 66 72 65 65 50 61 67 65 32 28 29 2c 20 61  g freePage2(), a
33000 73 20 0a 20 20 20 20 20 20 2a 2a 20 66 72 65 65  s .      ** free
33010 50 61 67 65 32 28 29 20 6d 61 79 20 7a 65 72 6f  Page2() may zero
33020 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e   the page conten
33030 74 73 20 69 66 20 73 65 63 75 72 65 2d 64 65 6c  ts if secure-del
33040 65 74 65 20 6d 6f 64 65 20 69 73 0a 20 20 20 20  ete mode is.    
33050 20 20 2a 2a 20 65 6e 61 62 6c 65 64 2e 20 49 66    ** enabled. If
33060 20 74 68 69 73 20 27 6f 76 65 72 66 6c 6f 77 27   this 'overflow'
33070 20 70 61 67 65 20 68 61 70 70 65 6e 73 20 74 6f   page happens to
33080 20 62 65 20 61 20 70 61 67 65 20 74 68 61 74 20   be a page that 
33090 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 63 61 6c  the.      ** cal
330a0 6c 65 72 20 69 73 20 69 74 65 72 61 74 69 6e 67  ler is iterating
330b0 20 74 68 72 6f 75 67 68 20 6f 72 20 75 73 69 6e   through or usin
330c0 67 20 69 6e 20 73 6f 6d 65 20 6f 74 68 65 72 20  g in some other 
330d0 77 61 79 2c 20 74 68 69 73 0a 20 20 20 20 20 20  way, this.      
330e0 2a 2a 20 63 61 6e 20 62 65 20 70 72 6f 62 6c 65  ** can be proble
330f0 6d 61 74 69 63 2e 0a 20 20 20 20 20 20 2a 2f 0a  matic..      */.
33100 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
33110 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
33120 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
33130 20 72 63 20 3d 20 66 72 65 65 50 61 67 65 32 28   rc = freePage2(
33140 70 42 74 2c 20 70 4f 76 66 6c 2c 20 6f 76 66 6c  pBt, pOvfl, ovfl
33150 50 67 6e 6f 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  Pgno);.    }..  
33160 20 20 69 66 28 20 70 4f 76 66 6c 20 29 7b 0a 20    if( pOvfl ){. 
33170 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
33180 72 55 6e 72 65 66 28 70 4f 76 66 6c 2d 3e 70 44  rUnref(pOvfl->pD
33190 62 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20  bPage);.    }.  
331a0 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
331b0 6e 20 72 63 3b 0a 20 20 20 20 6f 76 66 6c 50 67  n rc;.    ovflPg
331c0 6e 6f 20 3d 20 69 4e 65 78 74 3b 0a 20 20 7d 0a  no = iNext;.  }.
331d0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
331e0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65  OK;.}../*.** Cre
331f0 61 74 65 20 74 68 65 20 62 79 74 65 20 73 65 71  ate the byte seq
33200 75 65 6e 63 65 20 75 73 65 64 20 74 6f 20 72 65  uence used to re
33210 70 72 65 73 65 6e 74 20 61 20 63 65 6c 6c 20 6f  present a cell o
33220 6e 20 70 61 67 65 20 70 50 61 67 65 0a 2a 2a 20  n page pPage.** 
33230 61 6e 64 20 77 72 69 74 65 20 74 68 61 74 20 62  and write that b
33240 79 74 65 20 73 65 71 75 65 6e 63 65 20 69 6e 74  yte sequence int
33250 6f 20 70 43 65 6c 6c 5b 5d 2e 20 20 4f 76 65 72  o pCell[].  Over
33260 66 6c 6f 77 20 70 61 67 65 73 20 61 72 65 0a 2a  flow pages are.*
33270 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20  * allocated and 
33280 66 69 6c 6c 65 64 20 69 6e 20 61 73 20 6e 65 63  filled in as nec
33290 65 73 73 61 72 79 2e 20 20 54 68 65 20 63 61 6c  essary.  The cal
332a0 6c 69 6e 67 20 70 72 6f 63 65 64 75 72 65 0a 2a  ling procedure.*
332b0 2a 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65  * is responsible
332c0 20 66 6f 72 20 6d 61 6b 69 6e 67 20 73 75 72 65   for making sure
332d0 20 73 75 66 66 69 63 69 65 6e 74 20 73 70 61 63   sufficient spac
332e0 65 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63  e has been alloc
332f0 61 74 65 64 0a 2a 2a 20 66 6f 72 20 70 43 65 6c  ated.** for pCel
33300 6c 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20  l[]..**.** Note 
33310 74 68 61 74 20 70 43 65 6c 6c 20 64 6f 65 73 20  that pCell does 
33320 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 20 6e 65  not necessary ne
33330 65 64 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74  ed to point to t
33340 68 65 20 70 50 61 67 65 2d 3e 61 44 61 74 61 0a  he pPage->aData.
33350 2a 2a 20 61 72 65 61 2e 20 20 70 43 65 6c 6c 20  ** area.  pCell 
33360 6d 69 67 68 74 20 70 6f 69 6e 74 20 74 6f 20 73  might point to s
33370 6f 6d 65 20 74 65 6d 70 6f 72 61 72 79 20 73 74  ome temporary st
33380 6f 72 61 67 65 2e 20 20 54 68 65 20 63 65 6c 6c  orage.  The cell
33390 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 63 6f 6e 73   will.** be cons
333a0 74 72 75 63 74 65 64 20 69 6e 20 74 68 69 73 20  tructed in this 
333b0 74 65 6d 70 6f 72 61 72 79 20 61 72 65 61 20 74  temporary area t
333c0 68 65 6e 20 63 6f 70 69 65 64 20 69 6e 74 6f 20  hen copied into 
333d0 70 50 61 67 65 2d 3e 61 44 61 74 61 0a 2a 2a 20  pPage->aData.** 
333e0 6c 61 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  later..*/.static
333f0 20 69 6e 74 20 66 69 6c 6c 49 6e 43 65 6c 6c 28   int fillInCell(
33400 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
33410 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
33420 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74 68    /* The page th
33430 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  at contains the 
33440 63 65 6c 6c 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  cell */.  unsign
33450 65 64 20 63 68 61 72 20 2a 70 43 65 6c 6c 2c 20  ed char *pCell, 
33460 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70           /* Comp
33470 6c 65 74 65 20 74 65 78 74 20 6f 66 20 74 68 65  lete text of the
33480 20 63 65 6c 6c 20 2a 2f 0a 20 20 63 6f 6e 73 74   cell */.  const
33490 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20 69 36 34   void *pKey, i64
334a0 20 6e 4b 65 79 2c 20 20 20 20 2f 2a 20 54 68 65   nKey,    /* The
334b0 20 6b 65 79 20 2a 2f 0a 20 20 63 6f 6e 73 74 20   key */.  const 
334c0 76 6f 69 64 20 2a 70 44 61 74 61 2c 69 6e 74 20  void *pData,int 
334d0 6e 44 61 74 61 2c 20 20 20 2f 2a 20 54 68 65 20  nData,   /* The 
334e0 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 6e 5a  data */.  int nZ
334f0 65 72 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20  ero,            
33500 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72           /* Extr
33510 61 20 7a 65 72 6f 20 62 79 74 65 73 20 74 6f 20  a zero bytes to 
33520 61 70 70 65 6e 64 20 74 6f 20 70 44 61 74 61 20  append to pData 
33530 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 53 69 7a 65  */.  int *pnSize
33540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33550 20 20 20 20 2f 2a 20 57 72 69 74 65 20 63 65 6c      /* Write cel
33560 6c 20 73 69 7a 65 20 68 65 72 65 20 2a 2f 0a 29  l size here */.)
33570 7b 0a 20 20 69 6e 74 20 6e 50 61 79 6c 6f 61 64  {.  int nPayload
33580 3b 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 53  ;.  const u8 *pS
33590 72 63 3b 0a 20 20 69 6e 74 20 6e 53 72 63 2c 20  rc;.  int nSrc, 
335a0 6e 2c 20 72 63 3b 0a 20 20 69 6e 74 20 73 70 61  n, rc;.  int spa
335b0 63 65 4c 65 66 74 3b 0a 20 20 4d 65 6d 50 61 67  ceLeft;.  MemPag
335c0 65 20 2a 70 4f 76 66 6c 20 3d 20 30 3b 0a 20 20  e *pOvfl = 0;.  
335d0 4d 65 6d 50 61 67 65 20 2a 70 54 6f 52 65 6c 65  MemPage *pToRele
335e0 61 73 65 20 3d 20 30 3b 0a 20 20 75 6e 73 69 67  ase = 0;.  unsig
335f0 6e 65 64 20 63 68 61 72 20 2a 70 50 72 69 6f 72  ned char *pPrior
33600 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ;.  unsigned cha
33610 72 20 2a 70 50 61 79 6c 6f 61 64 3b 0a 20 20 42  r *pPayload;.  B
33620 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
33630 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 50 67 6e  Page->pBt;.  Pgn
33640 6f 20 70 67 6e 6f 4f 76 66 6c 20 3d 20 30 3b 0a  o pgnoOvfl = 0;.
33650 20 20 69 6e 74 20 6e 48 65 61 64 65 72 3b 0a 0a    int nHeader;..
33660 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
33670 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
33680 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
33690 29 3b 0a 0a 20 20 2f 2a 20 70 50 61 67 65 20 69  );..  /* pPage i
336a0 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c  s not necessaril
336b0 79 20 77 72 69 74 65 61 62 6c 65 20 73 69 6e 63  y writeable sinc
336c0 65 20 70 43 65 6c 6c 20 6d 69 67 68 74 20 62 65  e pCell might be
336d0 20 61 75 78 69 6c 69 61 72 79 0a 20 20 2a 2a 20   auxiliary.  ** 
336e0 62 75 66 66 65 72 20 73 70 61 63 65 20 74 68 61  buffer space tha
336f0 74 20 69 73 20 73 65 70 61 72 61 74 65 20 66 72  t is separate fr
33700 6f 6d 20 74 68 65 20 70 50 61 67 65 20 62 75 66  om the pPage buf
33710 66 65 72 20 61 72 65 61 20 2a 2f 0a 20 20 61 73  fer area */.  as
33720 73 65 72 74 28 20 70 43 65 6c 6c 3c 70 50 61 67  sert( pCell<pPag
33730 65 2d 3e 61 44 61 74 61 20 7c 7c 20 70 43 65 6c  e->aData || pCel
33740 6c 3e 3d 26 70 50 61 67 65 2d 3e 61 44 61 74 61  l>=&pPage->aData
33750 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d 0a  [pBt->pageSize].
33760 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73              || s
33770 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
33780 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
33790 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 2f 2a 20  bPage) );..  /* 
337a0 46 69 6c 6c 20 69 6e 20 74 68 65 20 68 65 61 64  Fill in the head
337b0 65 72 2e 20 2a 2f 0a 20 20 6e 48 65 61 64 65 72  er. */.  nHeader
337c0 20 3d 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50   = pPage->childP
337d0 74 72 53 69 7a 65 3b 0a 20 20 6e 50 61 79 6c 6f  trSize;.  nPaylo
337e0 61 64 20 3d 20 6e 44 61 74 61 20 2b 20 6e 5a 65  ad = nData + nZe
337f0 72 6f 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d  ro;.  if( pPage-
33800 3e 69 6e 74 4b 65 79 4c 65 61 66 20 29 7b 0a 20  >intKeyLeaf ){. 
33810 20 20 20 6e 48 65 61 64 65 72 20 2b 3d 20 70 75     nHeader += pu
33820 74 56 61 72 69 6e 74 33 32 28 26 70 43 65 6c 6c  tVarint32(&pCell
33830 5b 6e 48 65 61 64 65 72 5d 2c 20 6e 50 61 79 6c  [nHeader], nPayl
33840 6f 61 64 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  oad);.  }else{. 
33850 20 20 20 61 73 73 65 72 74 28 20 6e 44 61 74 61     assert( nData
33860 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==0 );.    asser
33870 74 28 20 6e 5a 65 72 6f 3d 3d 30 20 29 3b 0a 20  t( nZero==0 );. 
33880 20 7d 0a 20 20 6e 48 65 61 64 65 72 20 2b 3d 20   }.  nHeader += 
33890 70 75 74 56 61 72 69 6e 74 28 26 70 43 65 6c 6c  putVarint(&pCell
338a0 5b 6e 48 65 61 64 65 72 5d 2c 20 2a 28 75 36 34  [nHeader], *(u64
338b0 2a 29 26 6e 4b 65 79 29 3b 0a 20 20 0a 20 20 2f  *)&nKey);.  .  /
338c0 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 70 61  * Fill in the pa
338d0 79 6c 6f 61 64 20 73 69 7a 65 20 2a 2f 0a 20 20  yload size */.  
338e0 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65  if( pPage->intKe
338f0 79 20 29 7b 0a 20 20 20 20 70 53 72 63 20 3d 20  y ){.    pSrc = 
33900 70 44 61 74 61 3b 0a 20 20 20 20 6e 53 72 63 20  pData;.    nSrc 
33910 3d 20 6e 44 61 74 61 3b 0a 20 20 20 20 6e 44 61  = nData;.    nDa
33920 74 61 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  ta = 0;.  }else{
33930 20 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 4b   .    assert( nK
33940 65 79 3c 3d 30 78 37 66 66 66 66 66 66 66 20 26  ey<=0x7fffffff &
33950 26 20 70 4b 65 79 21 3d 30 20 29 3b 0a 20 20 20  & pKey!=0 );.   
33960 20 6e 50 61 79 6c 6f 61 64 20 3d 20 28 69 6e 74   nPayload = (int
33970 29 6e 4b 65 79 3b 0a 20 20 20 20 70 53 72 63 20  )nKey;.    pSrc 
33980 3d 20 70 4b 65 79 3b 0a 20 20 20 20 6e 53 72 63  = pKey;.    nSrc
33990 20 3d 20 28 69 6e 74 29 6e 4b 65 79 3b 0a 20 20   = (int)nKey;.  
339a0 7d 0a 20 20 69 66 28 20 6e 50 61 79 6c 6f 61 64  }.  if( nPayload
339b0 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  <=pPage->maxLoca
339c0 6c 20 29 7b 0a 20 20 20 20 6e 20 3d 20 6e 48 65  l ){.    n = nHe
339d0 61 64 65 72 20 2b 20 6e 50 61 79 6c 6f 61 64 3b  ader + nPayload;
339e0 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e  .    testcase( n
339f0 3d 3d 33 20 29 3b 0a 20 20 20 20 74 65 73 74 63  ==3 );.    testc
33a00 61 73 65 28 20 6e 3d 3d 34 20 29 3b 0a 20 20 20  ase( n==4 );.   
33a10 20 69 66 28 20 6e 3c 34 20 29 20 6e 20 3d 20 34   if( n<4 ) n = 4
33a20 3b 0a 20 20 20 20 2a 70 6e 53 69 7a 65 20 3d 20  ;.    *pnSize = 
33a30 6e 3b 0a 20 20 20 20 73 70 61 63 65 4c 65 66 74  n;.    spaceLeft
33a40 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 20   = nPayload;.   
33a50 20 70 50 72 69 6f 72 20 3d 20 70 43 65 6c 6c 3b   pPrior = pCell;
33a60 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
33a70 74 20 6d 6e 20 3d 20 70 50 61 67 65 2d 3e 6d 69  t mn = pPage->mi
33a80 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 6e 20 3d 20  nLocal;.    n = 
33a90 6d 6e 20 2b 20 28 6e 50 61 79 6c 6f 61 64 20 2d  mn + (nPayload -
33aa0 20 6d 6e 29 20 25 20 28 70 50 61 67 65 2d 3e 70   mn) % (pPage->p
33ab0 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d  Bt->usableSize -
33ac0 20 34 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73   4);.    testcas
33ad0 65 28 20 6e 3d 3d 70 50 61 67 65 2d 3e 6d 61 78  e( n==pPage->max
33ae0 4c 6f 63 61 6c 20 29 3b 0a 20 20 20 20 74 65 73  Local );.    tes
33af0 74 63 61 73 65 28 20 6e 3d 3d 70 50 61 67 65 2d  tcase( n==pPage-
33b00 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20  >maxLocal+1 );. 
33b10 20 20 20 69 66 28 20 6e 20 3e 20 70 50 61 67 65     if( n > pPage
33b20 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 20 6e 20 3d  ->maxLocal ) n =
33b30 20 6d 6e 3b 0a 20 20 20 20 73 70 61 63 65 4c 65   mn;.    spaceLe
33b40 66 74 20 3d 20 6e 3b 0a 20 20 20 20 2a 70 6e 53  ft = n;.    *pnS
33b50 69 7a 65 20 3d 20 6e 20 2b 20 6e 48 65 61 64 65  ize = n + nHeade
33b60 72 20 2b 20 34 3b 0a 20 20 20 20 70 50 72 69 6f  r + 4;.    pPrio
33b70 72 20 3d 20 26 70 43 65 6c 6c 5b 6e 48 65 61 64  r = &pCell[nHead
33b80 65 72 2b 6e 5d 3b 0a 20 20 7d 0a 20 20 70 50 61  er+n];.  }.  pPa
33b90 79 6c 6f 61 64 20 3d 20 26 70 43 65 6c 6c 5b 6e  yload = &pCell[n
33ba0 48 65 61 64 65 72 5d 3b 0a 0a 20 20 2f 2a 20 41  Header];..  /* A
33bb0 74 20 74 68 69 73 20 70 6f 69 6e 74 20 76 61 72  t this point var
33bc0 69 61 62 6c 65 73 20 73 68 6f 75 6c 64 20 62 65  iables should be
33bd0 20 73 65 74 20 61 73 20 66 6f 6c 6c 6f 77 73 3a   set as follows:
33be0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 6e 50 61  .  **.  **   nPa
33bf0 79 6c 6f 61 64 20 20 20 20 20 20 20 20 20 20 20  yload           
33c00 54 6f 74 61 6c 20 70 61 79 6c 6f 61 64 20 73 69  Total payload si
33c10 7a 65 20 69 6e 20 62 79 74 65 73 0a 20 20 2a 2a  ze in bytes.  **
33c20 20 20 20 70 50 61 79 6c 6f 61 64 20 20 20 20 20     pPayload     
33c30 20 20 20 20 20 20 42 65 67 69 6e 20 77 72 69 74        Begin writ
33c40 69 6e 67 20 70 61 79 6c 6f 61 64 20 68 65 72 65  ing payload here
33c50 0a 20 20 2a 2a 20 20 20 73 70 61 63 65 4c 65 66  .  **   spaceLef
33c60 74 20 20 20 20 20 20 20 20 20 20 53 70 61 63 65  t          Space
33c70 20 61 76 61 69 6c 61 62 6c 65 20 61 74 20 70 50   available at pP
33c80 61 79 6c 6f 61 64 2e 20 20 49 66 20 6e 50 61 79  ayload.  If nPay
33c90 6c 6f 61 64 3e 73 70 61 63 65 4c 65 66 74 2c 0a  load>spaceLeft,.
33ca0 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20    **            
33cb0 20 20 20 20 20 20 20 20 20 20 74 68 61 74 20 6d            that m
33cc0 65 61 6e 73 20 63 6f 6e 74 65 6e 74 20 6d 75 73  eans content mus
33cd0 74 20 73 70 69 6c 6c 20 69 6e 74 6f 20 6f 76 65  t spill into ove
33ce0 72 66 6c 6f 77 20 70 61 67 65 73 2e 0a 20 20 2a  rflow pages..  *
33cf0 2a 20 20 20 2a 70 6e 53 69 7a 65 20 20 20 20 20  *   *pnSize     
33d00 20 20 20 20 20 20 20 53 69 7a 65 20 6f 66 20 74         Size of t
33d10 68 65 20 6c 6f 63 61 6c 20 63 65 6c 6c 20 28 6e  he local cell (n
33d20 6f 74 20 63 6f 75 6e 74 69 6e 67 20 6f 76 65 72  ot counting over
33d30 66 6c 6f 77 20 70 61 67 65 73 29 0a 20 20 2a 2a  flow pages).  **
33d40 20 20 20 70 50 72 69 6f 72 20 20 20 20 20 20 20     pPrior       
33d50 20 20 20 20 20 20 57 68 65 72 65 20 74 6f 20 77        Where to w
33d60 72 69 74 65 20 74 68 65 20 70 67 6e 6f 20 6f 66  rite the pgno of
33d70 20 74 68 65 20 66 69 72 73 74 20 6f 76 65 72 66   the first overf
33d80 6c 6f 77 20 70 61 67 65 0a 20 20 2a 2a 0a 20 20  low page.  **.  
33d90 2a 2a 20 55 73 65 20 61 20 63 61 6c 6c 20 74 6f  ** Use a call to
33da0 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50   btreeParseCellP
33db0 74 72 28 29 20 74 6f 20 76 65 72 69 66 79 20 74  tr() to verify t
33dc0 68 61 74 20 74 68 65 20 76 61 6c 75 65 73 20 61  hat the values a
33dd0 62 6f 76 65 0a 20 20 2a 2a 20 77 65 72 65 20 63  bove.  ** were c
33de0 6f 6d 70 75 74 65 64 20 63 6f 72 72 65 63 74 6c  omputed correctl
33df0 79 2e 0a 20 20 2a 2f 0a 23 69 66 20 53 51 4c 49  y..  */.#if SQLI
33e00 54 45 5f 44 45 42 55 47 0a 20 20 7b 0a 20 20 20  TE_DEBUG.  {.   
33e10 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a   CellInfo info;.
33e20 20 20 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73      pPage->xPars
33e30 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 65  eCell(pPage, pCe
33e40 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20  ll, &info);.    
33e50 61 73 73 65 72 74 28 20 6e 48 65 61 64 65 72 3d  assert( nHeader=
33e60 28 69 6e 74 29 28 69 6e 66 6f 2e 70 50 61 79 6c  (int)(info.pPayl
33e70 6f 61 64 20 2d 20 70 43 65 6c 6c 29 20 29 3b 0a  oad - pCell) );.
33e80 20 20 20 20 61 73 73 65 72 74 28 20 69 6e 66 6f      assert( info
33e90 2e 6e 4b 65 79 3d 3d 6e 4b 65 79 20 29 3b 0a 20  .nKey==nKey );. 
33ea0 20 20 20 61 73 73 65 72 74 28 20 2a 70 6e 53 69     assert( *pnSi
33eb0 7a 65 20 3d 3d 20 69 6e 66 6f 2e 6e 53 69 7a 65  ze == info.nSize
33ec0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
33ed0 73 70 61 63 65 4c 65 66 74 20 3d 3d 20 69 6e 66  spaceLeft == inf
33ee0 6f 2e 6e 4c 6f 63 61 6c 20 29 3b 0a 20 20 20 20  o.nLocal );.    
33ef0 61 73 73 65 72 74 28 20 70 50 72 69 6f 72 20 3d  assert( pPrior =
33f00 3d 20 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f  = &pCell[info.iO
33f10 76 65 72 66 6c 6f 77 5d 20 29 3b 0a 20 20 7d 0a  verflow] );.  }.
33f20 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 57 72 69  #endif..  /* Wri
33f30 74 65 20 74 68 65 20 70 61 79 6c 6f 61 64 20 69  te the payload i
33f40 6e 74 6f 20 74 68 65 20 6c 6f 63 61 6c 20 43 65  nto the local Ce
33f50 6c 6c 20 61 6e 64 20 61 6e 79 20 65 78 74 72 61  ll and any extra
33f60 20 69 6e 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70   into overflow p
33f70 61 67 65 73 20 2a 2f 0a 20 20 77 68 69 6c 65 28  ages */.  while(
33f80 20 6e 50 61 79 6c 6f 61 64 3e 30 20 29 7b 0a 20   nPayload>0 ){. 
33f90 20 20 20 69 66 28 20 73 70 61 63 65 4c 65 66 74     if( spaceLeft
33fa0 3d 3d 30 20 29 7b 0a 23 69 66 6e 64 65 66 20 53  ==0 ){.#ifndef S
33fb0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
33fc0 41 43 55 55 4d 0a 20 20 20 20 20 20 50 67 6e 6f  ACUUM.      Pgno
33fd0 20 70 67 6e 6f 50 74 72 6d 61 70 20 3d 20 70 67   pgnoPtrmap = pg
33fe0 6e 6f 4f 76 66 6c 3b 20 2f 2a 20 4f 76 65 72 66  noOvfl; /* Overf
33ff0 6c 6f 77 20 70 61 67 65 20 70 6f 69 6e 74 65 72  low page pointer
34000 2d 6d 61 70 20 65 6e 74 72 79 20 70 61 67 65 20  -map entry page 
34010 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 42 74  */.      if( pBt
34020 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a  ->autoVacuum ){.
34030 20 20 20 20 20 20 20 20 64 6f 7b 0a 20 20 20 20          do{.    
34040 20 20 20 20 20 20 70 67 6e 6f 4f 76 66 6c 2b 2b        pgnoOvfl++
34050 3b 0a 20 20 20 20 20 20 20 20 7d 20 77 68 69 6c  ;.        } whil
34060 65 28 20 0a 20 20 20 20 20 20 20 20 20 20 50 54  e( .          PT
34070 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c  RMAP_ISPAGE(pBt,
34080 20 70 67 6e 6f 4f 76 66 6c 29 20 7c 7c 20 70 67   pgnoOvfl) || pg
34090 6e 6f 4f 76 66 6c 3d 3d 50 45 4e 44 49 4e 47 5f  noOvfl==PENDING_
340a0 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 0a  BYTE_PAGE(pBt) .
340b0 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
340c0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
340d0 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72  rc = allocateBtr
340e0 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 4f 76  eePage(pBt, &pOv
340f0 66 6c 2c 20 26 70 67 6e 6f 4f 76 66 6c 2c 20 70  fl, &pgnoOvfl, p
34100 67 6e 6f 4f 76 66 6c 2c 20 30 29 3b 0a 23 69 66  gnoOvfl, 0);.#if
34110 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
34120 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
34130 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61    /* If the data
34140 62 61 73 65 20 73 75 70 70 6f 72 74 73 20 61 75  base supports au
34150 74 6f 2d 76 61 63 75 75 6d 2c 20 61 6e 64 20 74  to-vacuum, and t
34160 68 65 20 73 65 63 6f 6e 64 20 6f 72 20 73 75 62  he second or sub
34170 73 65 71 75 65 6e 74 0a 20 20 20 20 20 20 2a 2a  sequent.      **
34180 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69   overflow page i
34190 73 20 62 65 69 6e 67 20 61 6c 6c 6f 63 61 74 65  s being allocate
341a0 64 2c 20 61 64 64 20 61 6e 20 65 6e 74 72 79 20  d, add an entry 
341b0 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d  to the pointer-m
341c0 61 70 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20  ap.      ** for 
341d0 74 68 61 74 20 70 61 67 65 20 6e 6f 77 2e 20 0a  that page now. .
341e0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
341f0 2a 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65  * If this is the
34200 20 66 69 72 73 74 20 6f 76 65 72 66 6c 6f 77 20   first overflow 
34210 70 61 67 65 2c 20 74 68 65 6e 20 77 72 69 74 65  page, then write
34220 20 61 20 70 61 72 74 69 61 6c 20 65 6e 74 72 79   a partial entry
34230 20 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 74 68   .      ** to th
34240 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 2e 20 49  e pointer-map. I
34250 66 20 77 65 20 77 72 69 74 65 20 6e 6f 74 68 69  f we write nothi
34260 6e 67 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74  ng to this point
34270 65 72 2d 6d 61 70 20 73 6c 6f 74 2c 0a 20 20 20  er-map slot,.   
34280 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 20 6f     ** then the o
34290 70 74 69 6d 69 73 74 69 63 20 6f 76 65 72 66 6c  ptimistic overfl
342a0 6f 77 20 63 68 61 69 6e 20 70 72 6f 63 65 73 73  ow chain process
342b0 69 6e 67 20 69 6e 20 63 6c 65 61 72 43 65 6c 6c  ing in clearCell
342c0 28 29 0a 20 20 20 20 20 20 2a 2a 20 6d 61 79 20  ().      ** may 
342d0 6d 69 73 69 6e 74 65 72 70 72 65 74 20 74 68 65  misinterpret the
342e0 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20 76   uninitialized v
342f0 61 6c 75 65 73 20 61 6e 64 20 64 65 6c 65 74 65  alues and delete
34300 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 77 72   the.      ** wr
34310 6f 6e 67 20 70 61 67 65 73 20 66 72 6f 6d 20 74  ong pages from t
34320 68 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20 20  he database..   
34330 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
34340 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
34350 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
34360 20 29 7b 0a 20 20 20 20 20 20 20 20 75 38 20 65   ){.        u8 e
34370 54 79 70 65 20 3d 20 28 70 67 6e 6f 50 74 72 6d  Type = (pgnoPtrm
34380 61 70 3f 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  ap?PTRMAP_OVERFL
34390 4f 57 32 3a 50 54 52 4d 41 50 5f 4f 56 45 52 46  OW2:PTRMAP_OVERF
343a0 4c 4f 57 31 29 3b 0a 20 20 20 20 20 20 20 20 70  LOW1);.        p
343b0 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 70 67  trmapPut(pBt, pg
343c0 6e 6f 4f 76 66 6c 2c 20 65 54 79 70 65 2c 20 70  noOvfl, eType, p
343d0 67 6e 6f 50 74 72 6d 61 70 2c 20 26 72 63 29 3b  gnoPtrmap, &rc);
343e0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20  .        if( rc 
343f0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 6c  ){.          rel
34400 65 61 73 65 50 61 67 65 28 70 4f 76 66 6c 29 3b  easePage(pOvfl);
34410 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
34420 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
34430 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
34440 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54    releasePage(pT
34450 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 20 20 20  oRelease);.     
34460 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
34470 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
34480 49 66 20 70 54 6f 52 65 6c 65 61 73 65 20 69 73  If pToRelease is
34490 20 6e 6f 74 20 7a 65 72 6f 20 74 68 61 6e 20 70   not zero than p
344a0 50 72 69 6f 72 20 70 6f 69 6e 74 73 20 69 6e 74  Prior points int
344b0 6f 20 74 68 65 20 64 61 74 61 20 61 72 65 61 0a  o the data area.
344c0 20 20 20 20 20 20 2a 2a 20 6f 66 20 70 54 6f 52        ** of pToR
344d0 65 6c 65 61 73 65 2e 20 20 4d 61 6b 65 20 73 75  elease.  Make su
344e0 72 65 20 70 54 6f 52 65 6c 65 61 73 65 20 69 73  re pToRelease is
344f0 20 73 74 69 6c 6c 20 77 72 69 74 65 61 62 6c 65   still writeable
34500 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  . */.      asser
34510 74 28 20 70 54 6f 52 65 6c 65 61 73 65 3d 3d 30  t( pToRelease==0
34520 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72   || sqlite3Pager
34530 49 73 77 72 69 74 65 61 62 6c 65 28 70 54 6f 52  Iswriteable(pToR
34540 65 6c 65 61 73 65 2d 3e 70 44 62 50 61 67 65 29  elease->pDbPage)
34550 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66   );..      /* If
34560 20 70 50 72 69 6f 72 20 69 73 20 70 61 72 74 20   pPrior is part 
34570 6f 66 20 74 68 65 20 64 61 74 61 20 61 72 65 61  of the data area
34580 20 6f 66 20 70 50 61 67 65 2c 20 74 68 65 6e 20   of pPage, then 
34590 6d 61 6b 65 20 73 75 72 65 20 70 50 61 67 65 0a  make sure pPage.
345a0 20 20 20 20 20 20 2a 2a 20 69 73 20 73 74 69 6c        ** is stil
345b0 6c 20 77 72 69 74 65 61 62 6c 65 20 2a 2f 0a 20  l writeable */. 
345c0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 72       assert( pPr
345d0 69 6f 72 3c 70 50 61 67 65 2d 3e 61 44 61 74 61  ior<pPage->aData
345e0 20 7c 7c 20 70 50 72 69 6f 72 3e 3d 26 70 50 61   || pPrior>=&pPa
345f0 67 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e 70  ge->aData[pBt->p
34600 61 67 65 53 69 7a 65 5d 0a 20 20 20 20 20 20 20  ageSize].       
34610 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 50       || sqlite3P
34620 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
34630 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
34640 29 3b 0a 0a 20 20 20 20 20 20 70 75 74 34 62 79  );..      put4by
34650 74 65 28 70 50 72 69 6f 72 2c 20 70 67 6e 6f 4f  te(pPrior, pgnoO
34660 76 66 6c 29 3b 0a 20 20 20 20 20 20 72 65 6c 65  vfl);.      rele
34670 61 73 65 50 61 67 65 28 70 54 6f 52 65 6c 65 61  asePage(pToRelea
34680 73 65 29 3b 0a 20 20 20 20 20 20 70 54 6f 52 65  se);.      pToRe
34690 6c 65 61 73 65 20 3d 20 70 4f 76 66 6c 3b 0a 20  lease = pOvfl;. 
346a0 20 20 20 20 20 70 50 72 69 6f 72 20 3d 20 70 4f       pPrior = pO
346b0 76 66 6c 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20  vfl->aData;.    
346c0 20 20 70 75 74 34 62 79 74 65 28 70 50 72 69 6f    put4byte(pPrio
346d0 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 50 61  r, 0);.      pPa
346e0 79 6c 6f 61 64 20 3d 20 26 70 4f 76 66 6c 2d 3e  yload = &pOvfl->
346f0 61 44 61 74 61 5b 34 5d 3b 0a 20 20 20 20 20 20  aData[4];.      
34700 73 70 61 63 65 4c 65 66 74 20 3d 20 70 42 74 2d  spaceLeft = pBt-
34710 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b  >usableSize - 4;
34720 0a 20 20 20 20 7d 0a 20 20 20 20 6e 20 3d 20 6e  .    }.    n = n
34730 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20 69 66 28  Payload;.    if(
34740 20 6e 3e 73 70 61 63 65 4c 65 66 74 20 29 20 6e   n>spaceLeft ) n
34750 20 3d 20 73 70 61 63 65 4c 65 66 74 3b 0a 0a 20   = spaceLeft;.. 
34760 20 20 20 2f 2a 20 49 66 20 70 54 6f 52 65 6c 65     /* If pToRele
34770 61 73 65 20 69 73 20 6e 6f 74 20 7a 65 72 6f 20  ase is not zero 
34780 74 68 61 6e 20 70 50 61 79 6c 6f 61 64 20 70 6f  than pPayload po
34790 69 6e 74 73 20 69 6e 74 6f 20 74 68 65 20 64 61  ints into the da
347a0 74 61 20 61 72 65 61 0a 20 20 20 20 2a 2a 20 6f  ta area.    ** o
347b0 66 20 70 54 6f 52 65 6c 65 61 73 65 2e 20 20 4d  f pToRelease.  M
347c0 61 6b 65 20 73 75 72 65 20 70 54 6f 52 65 6c 65  ake sure pToRele
347d0 61 73 65 20 69 73 20 73 74 69 6c 6c 20 77 72 69  ase is still wri
347e0 74 65 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 61  teable. */.    a
347f0 73 73 65 72 74 28 20 70 54 6f 52 65 6c 65 61 73  ssert( pToReleas
34800 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 50  e==0 || sqlite3P
34810 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
34820 70 54 6f 52 65 6c 65 61 73 65 2d 3e 70 44 62 50  pToRelease->pDbP
34830 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 2f 2a 20  age) );..    /* 
34840 49 66 20 70 50 61 79 6c 6f 61 64 20 69 73 20 70  If pPayload is p
34850 61 72 74 20 6f 66 20 74 68 65 20 64 61 74 61 20  art of the data 
34860 61 72 65 61 20 6f 66 20 70 50 61 67 65 2c 20 74  area of pPage, t
34870 68 65 6e 20 6d 61 6b 65 20 73 75 72 65 20 70 50  hen make sure pP
34880 61 67 65 0a 20 20 20 20 2a 2a 20 69 73 20 73 74  age.    ** is st
34890 69 6c 6c 20 77 72 69 74 65 61 62 6c 65 20 2a 2f  ill writeable */
348a0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
348b0 79 6c 6f 61 64 3c 70 50 61 67 65 2d 3e 61 44 61  yload<pPage->aDa
348c0 74 61 20 7c 7c 20 70 50 61 79 6c 6f 61 64 3e 3d  ta || pPayload>=
348d0 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 42  &pPage->aData[pB
348e0 74 2d 3e 70 61 67 65 53 69 7a 65 5d 0a 20 20 20  t->pageSize].   
348f0 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69           || sqli
34900 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
34910 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
34920 67 65 29 20 29 3b 0a 0a 20 20 20 20 69 66 28 20  ge) );..    if( 
34930 6e 53 72 63 3e 30 20 29 7b 0a 20 20 20 20 20 20  nSrc>0 ){.      
34940 69 66 28 20 6e 3e 6e 53 72 63 20 29 20 6e 20 3d  if( n>nSrc ) n =
34950 20 6e 53 72 63 3b 0a 20 20 20 20 20 20 61 73 73   nSrc;.      ass
34960 65 72 74 28 20 70 53 72 63 20 29 3b 0a 20 20 20  ert( pSrc );.   
34970 20 20 20 6d 65 6d 63 70 79 28 70 50 61 79 6c 6f     memcpy(pPaylo
34980 61 64 2c 20 70 53 72 63 2c 20 6e 29 3b 0a 20 20  ad, pSrc, n);.  
34990 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6d    }else{.      m
349a0 65 6d 73 65 74 28 70 50 61 79 6c 6f 61 64 2c 20  emset(pPayload, 
349b0 30 2c 20 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20  0, n);.    }.   
349c0 20 6e 50 61 79 6c 6f 61 64 20 2d 3d 20 6e 3b 0a   nPayload -= n;.
349d0 20 20 20 20 70 50 61 79 6c 6f 61 64 20 2b 3d 20      pPayload += 
349e0 6e 3b 0a 20 20 20 20 70 53 72 63 20 2b 3d 20 6e  n;.    pSrc += n
349f0 3b 0a 20 20 20 20 6e 53 72 63 20 2d 3d 20 6e 3b  ;.    nSrc -= n;
34a00 0a 20 20 20 20 73 70 61 63 65 4c 65 66 74 20 2d  .    spaceLeft -
34a10 3d 20 6e 3b 0a 20 20 20 20 69 66 28 20 6e 53 72  = n;.    if( nSr
34a20 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e 53  c==0 ){.      nS
34a30 72 63 20 3d 20 6e 44 61 74 61 3b 0a 20 20 20 20  rc = nData;.    
34a40 20 20 70 53 72 63 20 3d 20 70 44 61 74 61 3b 0a    pSrc = pData;.
34a50 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 6c 65      }.  }.  rele
34a60 61 73 65 50 61 67 65 28 70 54 6f 52 65 6c 65 61  asePage(pToRelea
34a70 73 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  se);.  return SQ
34a80 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
34a90 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 69 2d 74  * Remove the i-t
34aa0 68 20 63 65 6c 6c 20 66 72 6f 6d 20 70 50 61 67  h cell from pPag
34ab0 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  e.  This routine
34ac0 20 65 66 66 65 63 74 73 20 70 50 61 67 65 20 6f   effects pPage o
34ad0 6e 6c 79 2e 0a 2a 2a 20 54 68 65 20 63 65 6c 6c  nly..** The cell
34ae0 20 63 6f 6e 74 65 6e 74 20 69 73 20 6e 6f 74 20   content is not 
34af0 66 72 65 65 64 20 6f 72 20 64 65 61 6c 6c 6f 63  freed or dealloc
34b00 61 74 65 64 2e 20 20 49 74 20 69 73 20 61 73 73  ated.  It is ass
34b10 75 6d 65 64 20 74 68 61 74 0a 2a 2a 20 74 68 65  umed that.** the
34b20 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 68 61   cell content ha
34b30 73 20 62 65 65 6e 20 63 6f 70 69 65 64 20 73 6f  s been copied so
34b40 6d 65 70 6c 61 63 65 20 65 6c 73 65 2e 20 20 54  meplace else.  T
34b50 68 69 73 20 72 6f 75 74 69 6e 65 20 6a 75 73 74  his routine just
34b60 0a 2a 2a 20 72 65 6d 6f 76 65 73 20 74 68 65 20  .** removes the 
34b70 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65  reference to the
34b80 20 63 65 6c 6c 20 66 72 6f 6d 20 70 50 61 67 65   cell from pPage
34b90 2e 0a 2a 2a 0a 2a 2a 20 22 73 7a 22 20 6d 75 73  ..**.** "sz" mus
34ba0 74 20 62 65 20 74 68 65 20 6e 75 6d 62 65 72 20  t be the number 
34bb0 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68 65 20  of bytes in the 
34bc0 63 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  cell..*/.static 
34bd0 76 6f 69 64 20 64 72 6f 70 43 65 6c 6c 28 4d 65  void dropCell(Me
34be0 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e  mPage *pPage, in
34bf0 74 20 69 64 78 2c 20 69 6e 74 20 73 7a 2c 20 69  t idx, int sz, i
34c00 6e 74 20 2a 70 52 43 29 7b 0a 20 20 75 33 32 20  nt *pRC){.  u32 
34c10 70 63 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4f  pc;         /* O
34c20 66 66 73 65 74 20 74 6f 20 63 65 6c 6c 20 63 6f  ffset to cell co
34c30 6e 74 65 6e 74 20 6f 66 20 63 65 6c 6c 20 62 65  ntent of cell be
34c40 69 6e 67 20 64 65 6c 65 74 65 64 20 2a 2f 0a 20  ing deleted */. 
34c50 20 75 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20   u8 *data;      
34c60 20 2f 2a 20 70 50 61 67 65 2d 3e 61 44 61 74 61   /* pPage->aData
34c70 20 2a 2f 0a 20 20 75 38 20 2a 70 74 72 3b 20 20   */.  u8 *ptr;  
34c80 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f        /* Used to
34c90 20 6d 6f 76 65 20 62 79 74 65 73 20 61 72 6f 75   move bytes arou
34ca0 6e 64 20 77 69 74 68 69 6e 20 64 61 74 61 5b 5d  nd within data[]
34cb0 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
34cc0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 74        /* The ret
34cd0 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e  urn code */.  in
34ce0 74 20 68 64 72 3b 20 20 20 20 20 20 20 20 2f 2a  t hdr;        /*
34cf0 20 42 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68   Beginning of th
34d00 65 20 68 65 61 64 65 72 2e 20 20 30 20 6d 6f 73  e header.  0 mos
34d10 74 20 70 61 67 65 73 2e 20 20 31 30 30 20 70 61  t pages.  100 pa
34d20 67 65 20 31 20 2a 2f 0a 0a 20 20 69 66 28 20 2a  ge 1 */..  if( *
34d30 70 52 43 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20  pRC ) return;.. 
34d40 20 61 73 73 65 72 74 28 20 69 64 78 3e 3d 30 20   assert( idx>=0 
34d50 26 26 20 69 64 78 3c 70 50 61 67 65 2d 3e 6e 43  && idx<pPage->nC
34d60 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ell );.  assert(
34d70 20 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20 73   CORRUPT_DB || s
34d80 7a 3d 3d 63 65 6c 6c 53 69 7a 65 28 70 50 61 67  z==cellSize(pPag
34d90 65 2c 20 69 64 78 29 20 29 3b 0a 20 20 61 73 73  e, idx) );.  ass
34da0 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
34db0 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
34dc0 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
34dd0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
34de0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
34df0 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
34e00 29 3b 0a 20 20 64 61 74 61 20 3d 20 70 50 61 67  );.  data = pPag
34e10 65 2d 3e 61 44 61 74 61 3b 0a 20 20 70 74 72 20  e->aData;.  ptr 
34e20 3d 20 26 70 50 61 67 65 2d 3e 61 43 65 6c 6c 49  = &pPage->aCellI
34e30 64 78 5b 32 2a 69 64 78 5d 3b 0a 20 20 70 63 20  dx[2*idx];.  pc 
34e40 3d 20 67 65 74 32 62 79 74 65 28 70 74 72 29 3b  = get2byte(ptr);
34e50 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e  .  hdr = pPage->
34e60 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 74 65 73  hdrOffset;.  tes
34e70 74 63 61 73 65 28 20 70 63 3d 3d 67 65 74 32 62  tcase( pc==get2b
34e80 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
34e90 29 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  ) );.  testcase(
34ea0 20 70 63 2b 73 7a 3d 3d 70 50 61 67 65 2d 3e 70   pc+sz==pPage->p
34eb0 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29  Bt->usableSize )
34ec0 3b 0a 20 20 69 66 28 20 70 63 20 3c 20 28 75 33  ;.  if( pc < (u3
34ed0 32 29 67 65 74 32 62 79 74 65 28 26 64 61 74 61  2)get2byte(&data
34ee0 5b 68 64 72 2b 35 5d 29 20 7c 7c 20 70 63 2b 73  [hdr+5]) || pc+s
34ef0 7a 20 3e 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e  z > pPage->pBt->
34f00 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20  usableSize ){.  
34f10 20 20 2a 70 52 43 20 3d 20 53 51 4c 49 54 45 5f    *pRC = SQLITE_
34f20 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
34f30 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
34f40 72 63 20 3d 20 66 72 65 65 53 70 61 63 65 28 70  rc = freeSpace(p
34f50 50 61 67 65 2c 20 70 63 2c 20 73 7a 29 3b 0a 20  Page, pc, sz);. 
34f60 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 2a   if( rc ){.    *
34f70 70 52 43 20 3d 20 72 63 3b 0a 20 20 20 20 72 65  pRC = rc;.    re
34f80 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 50 61 67  turn;.  }.  pPag
34f90 65 2d 3e 6e 43 65 6c 6c 2d 2d 3b 0a 20 20 69 66  e->nCell--;.  if
34fa0 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d  ( pPage->nCell==
34fb0 30 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28  0 ){.    memset(
34fc0 26 64 61 74 61 5b 68 64 72 2b 31 5d 2c 20 30 2c  &data[hdr+1], 0,
34fd0 20 34 29 3b 0a 20 20 20 20 64 61 74 61 5b 68 64   4);.    data[hd
34fe0 72 2b 37 5d 20 3d 20 30 3b 0a 20 20 20 20 70 75  r+7] = 0;.    pu
34ff0 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
35000 2b 35 5d 2c 20 70 50 61 67 65 2d 3e 70 42 74 2d  +5], pPage->pBt-
35010 3e 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20  >usableSize);.  
35020 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d    pPage->nFree =
35030 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61   pPage->pBt->usa
35040 62 6c 65 53 69 7a 65 20 2d 20 70 50 61 67 65 2d  bleSize - pPage-
35050 3e 68 64 72 4f 66 66 73 65 74 0a 20 20 20 20 20  >hdrOffset.     
35060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35070 20 20 2d 20 70 50 61 67 65 2d 3e 63 68 69 6c 64    - pPage->child
35080 50 74 72 53 69 7a 65 20 2d 20 38 3b 0a 20 20 7d  PtrSize - 8;.  }
35090 65 6c 73 65 7b 0a 20 20 20 20 6d 65 6d 6d 6f 76  else{.    memmov
350a0 65 28 70 74 72 2c 20 70 74 72 2b 32 2c 20 32 2a  e(ptr, ptr+2, 2*
350b0 28 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 2d 20  (pPage->nCell - 
350c0 69 64 78 29 29 3b 0a 20 20 20 20 70 75 74 32 62  idx));.    put2b
350d0 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d  yte(&data[hdr+3]
350e0 2c 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b  , pPage->nCell);
350f0 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 46 72 65  .    pPage->nFre
35100 65 20 2b 3d 20 32 3b 0a 20 20 7d 0a 7d 0a 0a 2f  e += 2;.  }.}../
35110 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 61 20 6e 65  *.** Insert a ne
35120 77 20 63 65 6c 6c 20 6f 6e 20 70 50 61 67 65 20  w cell on pPage 
35130 61 74 20 63 65 6c 6c 20 69 6e 64 65 78 20 22 69  at cell index "i
35140 22 2e 20 20 70 43 65 6c 6c 20 70 6f 69 6e 74 73  ".  pCell points
35150 20 74 6f 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65   to the.** conte
35160 6e 74 20 6f 66 20 74 68 65 20 63 65 6c 6c 2e 0a  nt of the cell..
35170 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 65 6c  **.** If the cel
35180 6c 20 63 6f 6e 74 65 6e 74 20 77 69 6c 6c 20 66  l content will f
35190 69 74 20 6f 6e 20 74 68 65 20 70 61 67 65 2c 20  it on the page, 
351a0 74 68 65 6e 20 70 75 74 20 69 74 20 74 68 65 72  then put it ther
351b0 65 2e 20 20 49 66 20 69 74 0a 2a 2a 20 77 69 6c  e.  If it.** wil
351c0 6c 20 6e 6f 74 20 66 69 74 2c 20 74 68 65 6e 20  l not fit, then 
351d0 6d 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 74  make a copy of t
351e0 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
351f0 69 6e 74 6f 20 70 54 65 6d 70 20 69 66 0a 2a 2a  into pTemp if.**
35200 20 70 54 65 6d 70 20 69 73 20 6e 6f 74 20 6e 75   pTemp is not nu
35210 6c 6c 2e 20 20 52 65 67 61 72 64 6c 65 73 73 20  ll.  Regardless 
35220 6f 66 20 70 54 65 6d 70 2c 20 61 6c 6c 6f 63 61  of pTemp, alloca
35230 74 65 20 61 20 6e 65 77 20 65 6e 74 72 79 0a 2a  te a new entry.*
35240 2a 20 69 6e 20 70 50 61 67 65 2d 3e 61 70 4f 76  * in pPage->apOv
35250 66 6c 5b 5d 20 61 6e 64 20 6d 61 6b 65 20 69 74  fl[] and make it
35260 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 63 65   point to the ce
35270 6c 6c 20 63 6f 6e 74 65 6e 74 20 28 65 69 74 68  ll content (eith
35280 65 72 0a 2a 2a 20 69 6e 20 70 54 65 6d 70 20 6f  er.** in pTemp o
35290 72 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70  r the original p
352a0 43 65 6c 6c 29 20 61 6e 64 20 61 6c 73 6f 20 72  Cell) and also r
352b0 65 63 6f 72 64 20 69 74 73 20 69 6e 64 65 78 2e  ecord its index.
352c0 20 0a 2a 2a 20 41 6c 6c 6f 63 61 74 69 6e 67 20   .** Allocating 
352d0 61 20 6e 65 77 20 65 6e 74 72 79 20 69 6e 20 70  a new entry in p
352e0 50 61 67 65 2d 3e 61 43 65 6c 6c 5b 5d 20 69 6d  Page->aCell[] im
352f0 70 6c 69 65 73 20 74 68 61 74 20 0a 2a 2a 20 70  plies that .** p
35300 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20  Page->nOverflow 
35310 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 2e 0a  is incremented..
35320 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69  */.static void i
35330 6e 73 65 72 74 43 65 6c 6c 28 0a 20 20 4d 65 6d  nsertCell(.  Mem
35340 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 2f  Page *pPage,   /
35350 2a 20 50 61 67 65 20 69 6e 74 6f 20 77 68 69 63  * Page into whic
35360 68 20 77 65 20 61 72 65 20 63 6f 70 79 69 6e 67  h we are copying
35370 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 20 20 20   */.  int i,    
35380 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 63          /* New c
35390 65 6c 6c 20 62 65 63 6f 6d 65 73 20 74 68 65 20  ell becomes the 
353a0 69 2d 74 68 20 63 65 6c 6c 20 6f 66 20 74 68 65  i-th cell of the
353b0 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 70   page */.  u8 *p
353c0 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 2f 2a 20  Cell,        /* 
353d0 43 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 6e  Content of the n
353e0 65 77 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74  ew cell */.  int
353f0 20 73 7a 2c 20 20 20 20 20 20 20 20 20 20 20 2f   sz,           /
35400 2a 20 42 79 74 65 73 20 6f 66 20 63 6f 6e 74 65  * Bytes of conte
35410 6e 74 20 69 6e 20 70 43 65 6c 6c 20 2a 2f 0a 20  nt in pCell */. 
35420 20 75 38 20 2a 70 54 65 6d 70 2c 20 20 20 20 20   u8 *pTemp,     
35430 20 20 20 2f 2a 20 54 65 6d 70 20 73 74 6f 72 61     /* Temp stora
35440 67 65 20 73 70 61 63 65 20 66 6f 72 20 70 43 65  ge space for pCe
35450 6c 6c 2c 20 69 66 20 6e 65 65 64 65 64 20 2a 2f  ll, if needed */
35460 0a 20 20 50 67 6e 6f 20 69 43 68 69 6c 64 2c 20  .  Pgno iChild, 
35470 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 6e 2d 7a       /* If non-z
35480 65 72 6f 2c 20 72 65 70 6c 61 63 65 20 66 69 72  ero, replace fir
35490 73 74 20 34 20 62 79 74 65 73 20 77 69 74 68 20  st 4 bytes with 
354a0 74 68 69 73 20 76 61 6c 75 65 20 2a 2f 0a 20 20  this value */.  
354b0 69 6e 74 20 2a 70 52 43 20 20 20 20 20 20 20 20  int *pRC        
354c0 20 20 2f 2a 20 52 65 61 64 20 61 6e 64 20 77 72    /* Read and wr
354d0 69 74 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20  ite return code 
354e0 66 72 6f 6d 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  from here */.){.
354f0 20 20 69 6e 74 20 69 64 78 20 3d 20 30 3b 20 20    int idx = 0;  
35500 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20      /* Where to 
35510 77 72 69 74 65 20 6e 65 77 20 63 65 6c 6c 20 63  write new cell c
35520 6f 6e 74 65 6e 74 20 69 6e 20 64 61 74 61 5b 5d  ontent in data[]
35530 20 2a 2f 0a 20 20 69 6e 74 20 6a 3b 20 20 20 20   */.  int j;    
35540 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
35550 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75 38 20  counter */.  u8 
35560 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20 20 2f  *data;         /
35570 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  * The content of
35580 20 74 68 65 20 77 68 6f 6c 65 20 70 61 67 65 20   the whole page 
35590 2a 2f 0a 20 20 75 38 20 2a 70 49 6e 73 3b 20 20  */.  u8 *pIns;  
355a0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 6f         /* The po
355b0 69 6e 74 20 69 6e 20 70 50 61 67 65 2d 3e 61 43  int in pPage->aC
355c0 65 6c 6c 49 64 78 5b 5d 20 77 68 65 72 65 20 6e  ellIdx[] where n
355d0 6f 20 63 65 6c 6c 20 69 6e 73 65 72 74 65 64 20  o cell inserted 
355e0 2a 2f 0a 0a 20 20 69 66 28 20 2a 70 52 43 20 29  */..  if( *pRC )
355f0 20 72 65 74 75 72 6e 3b 0a 0a 20 20 61 73 73 65   return;..  asse
35600 72 74 28 20 69 3e 3d 30 20 26 26 20 69 3c 3d 70  rt( i>=0 && i<=p
35610 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b 70 50 61 67  Page->nCell+pPag
35620 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 29 3b 0a  e->nOverflow );.
35630 20 20 61 73 73 65 72 74 28 20 4d 58 5f 43 45 4c    assert( MX_CEL
35640 4c 28 70 50 61 67 65 2d 3e 70 42 74 29 3c 3d 31  L(pPage->pBt)<=1
35650 30 39 32 31 20 29 3b 0a 20 20 61 73 73 65 72 74  0921 );.  assert
35660 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3c 3d  ( pPage->nCell<=
35670 4d 58 5f 43 45 4c 4c 28 70 50 61 67 65 2d 3e 70  MX_CELL(pPage->p
35680 42 74 29 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44  Bt) || CORRUPT_D
35690 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  B );.  assert( p
356a0 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3c  Page->nOverflow<
356b0 3d 41 72 72 61 79 53 69 7a 65 28 70 50 61 67 65  =ArraySize(pPage
356c0 2d 3e 61 70 4f 76 66 6c 29 20 29 3b 0a 20 20 61  ->apOvfl) );.  a
356d0 73 73 65 72 74 28 20 41 72 72 61 79 53 69 7a 65  ssert( ArraySize
356e0 28 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c 29 3d  (pPage->apOvfl)=
356f0 3d 41 72 72 61 79 53 69 7a 65 28 70 50 61 67 65  =ArraySize(pPage
35700 2d 3e 61 69 4f 76 66 6c 29 20 29 3b 0a 20 20 61  ->aiOvfl) );.  a
35710 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
35720 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
35730 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
35740 20 20 2f 2a 20 54 68 65 20 63 65 6c 6c 20 73 68    /* The cell sh
35750 6f 75 6c 64 20 6e 6f 72 6d 61 6c 6c 79 20 62 65  ould normally be
35760 20 73 69 7a 65 64 20 63 6f 72 72 65 63 74 6c 79   sized correctly
35770 2e 20 20 48 6f 77 65 76 65 72 2c 20 77 68 65 6e  .  However, when
35780 20 6d 6f 76 69 6e 67 20 61 0a 20 20 2a 2a 20 6d   moving a.  ** m
35790 61 6c 66 6f 72 6d 65 64 20 63 65 6c 6c 20 66 72  alformed cell fr
357a0 6f 6d 20 61 20 6c 65 61 66 20 70 61 67 65 20 74  om a leaf page t
357b0 6f 20 61 6e 20 69 6e 74 65 72 69 6f 72 20 70 61  o an interior pa
357c0 67 65 2c 20 69 66 20 74 68 65 20 63 65 6c 6c 20  ge, if the cell 
357d0 73 69 7a 65 0a 20 20 2a 2a 20 77 61 6e 74 65 64  size.  ** wanted
357e0 20 74 6f 20 62 65 20 6c 65 73 73 20 74 68 61 6e   to be less than
357f0 20 34 20 62 75 74 20 67 6f 74 20 72 6f 75 6e 64   4 but got round
35800 65 64 20 75 70 20 74 6f 20 34 20 6f 6e 20 74 68  ed up to 4 on th
35810 65 20 6c 65 61 66 2c 20 74 68 65 6e 20 73 69 7a  e leaf, then siz
35820 65 0a 20 20 2a 2a 20 6d 69 67 68 74 20 62 65 20  e.  ** might be 
35830 6c 65 73 73 20 74 68 61 6e 20 38 20 28 6c 65 61  less than 8 (lea
35840 66 2d 73 69 7a 65 20 2b 20 70 6f 69 6e 74 65 72  f-size + pointer
35850 29 20 6f 6e 20 74 68 65 20 69 6e 74 65 72 69 6f  ) on the interio
35860 72 20 6e 6f 64 65 2e 20 20 48 65 6e 63 65 0a 20  r node.  Hence. 
35870 20 2a 2a 20 74 68 65 20 74 65 72 6d 20 61 66 74   ** the term aft
35880 65 72 20 74 68 65 20 7c 7c 20 69 6e 20 74 68 65  er the || in the
35890 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72   following asser
358a0 74 28 29 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74  t(). */.  assert
358b0 28 20 73 7a 3d 3d 70 50 61 67 65 2d 3e 78 43 65  ( sz==pPage->xCe
358c0 6c 6c 53 69 7a 65 28 70 50 61 67 65 2c 20 70 43  llSize(pPage, pC
358d0 65 6c 6c 29 20 7c 7c 20 28 73 7a 3d 3d 38 20 26  ell) || (sz==8 &
358e0 26 20 69 43 68 69 6c 64 3e 30 29 20 29 3b 0a 20  & iChild>0) );. 
358f0 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65   if( pPage->nOve
35900 72 66 6c 6f 77 20 7c 7c 20 73 7a 2b 32 3e 70 50  rflow || sz+2>pP
35910 61 67 65 2d 3e 6e 46 72 65 65 20 29 7b 0a 20 20  age->nFree ){.  
35920 20 20 69 66 28 20 70 54 65 6d 70 20 29 7b 0a 20    if( pTemp ){. 
35930 20 20 20 20 20 6d 65 6d 63 70 79 28 70 54 65 6d       memcpy(pTem
35940 70 2c 20 70 43 65 6c 6c 2c 20 73 7a 29 3b 0a 20  p, pCell, sz);. 
35950 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 70 54 65       pCell = pTe
35960 6d 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  mp;.    }.    if
35970 28 20 69 43 68 69 6c 64 20 29 7b 0a 20 20 20 20  ( iChild ){.    
35980 20 20 70 75 74 34 62 79 74 65 28 70 43 65 6c 6c    put4byte(pCell
35990 2c 20 69 43 68 69 6c 64 29 3b 0a 20 20 20 20 7d  , iChild);.    }
359a0 0a 20 20 20 20 6a 20 3d 20 70 50 61 67 65 2d 3e  .    j = pPage->
359b0 6e 4f 76 65 72 66 6c 6f 77 2b 2b 3b 0a 20 20 20  nOverflow++;.   
359c0 20 61 73 73 65 72 74 28 20 6a 3c 28 69 6e 74 29   assert( j<(int)
359d0 28 73 69 7a 65 6f 66 28 70 50 61 67 65 2d 3e 61  (sizeof(pPage->a
359e0 70 4f 76 66 6c 29 2f 73 69 7a 65 6f 66 28 70 50  pOvfl)/sizeof(pP
359f0 61 67 65 2d 3e 61 70 4f 76 66 6c 5b 30 5d 29 29  age->apOvfl[0]))
35a00 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 61   );.    pPage->a
35a10 70 4f 76 66 6c 5b 6a 5d 20 3d 20 70 43 65 6c 6c  pOvfl[j] = pCell
35a20 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 61 69 4f  ;.    pPage->aiO
35a30 76 66 6c 5b 6a 5d 20 3d 20 28 75 31 36 29 69 3b  vfl[j] = (u16)i;
35a40 0a 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 6d 75  ..    /* When mu
35a50 6c 74 69 70 6c 65 20 6f 76 65 72 66 6c 6f 77 73  ltiple overflows
35a60 20 6f 63 63 75 72 2c 20 74 68 65 79 20 61 72 65   occur, they are
35a70 20 61 6c 77 61 79 73 20 73 65 71 75 65 6e 74 69   always sequenti
35a80 61 6c 20 61 6e 64 20 69 6e 0a 20 20 20 20 2a 2a  al and in.    **
35a90 20 73 6f 72 74 65 64 20 6f 72 64 65 72 2e 20 20   sorted order.  
35aa0 54 68 69 73 20 69 6e 76 61 72 69 61 6e 74 73 20  This invariants 
35ab0 61 72 69 73 65 20 62 65 63 61 75 73 65 20 6d 75  arise because mu
35ac0 6c 74 69 70 6c 65 20 6f 76 65 72 66 6c 6f 77 73  ltiple overflows
35ad0 20 63 61 6e 0a 20 20 20 20 2a 2a 20 6f 6e 6c 79   can.    ** only
35ae0 20 6f 63 63 75 72 20 77 68 65 6e 20 69 6e 73 65   occur when inse
35af0 72 74 69 6e 67 20 64 69 76 69 64 65 72 20 63 65  rting divider ce
35b00 6c 6c 73 20 69 6e 74 6f 20 74 68 65 20 70 61 72  lls into the par
35b10 65 6e 74 20 70 61 67 65 20 64 75 72 69 6e 67 0a  ent page during.
35b20 20 20 20 20 2a 2a 20 62 61 6c 61 6e 63 69 6e 67      ** balancing
35b30 2c 20 61 6e 64 20 74 68 65 20 64 69 76 69 64 65  , and the divide
35b40 72 73 20 61 72 65 20 61 64 6a 61 63 65 6e 74 20  rs are adjacent 
35b50 61 6e 64 20 73 6f 72 74 65 64 2e 0a 20 20 20 20  and sorted..    
35b60 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 6a  */.    assert( j
35b70 3d 3d 30 20 7c 7c 20 70 50 61 67 65 2d 3e 61 69  ==0 || pPage->ai
35b80 4f 76 66 6c 5b 6a 2d 31 5d 3c 28 75 31 36 29 69  Ovfl[j-1]<(u16)i
35b90 20 29 3b 20 2f 2a 20 4f 76 65 72 66 6c 6f 77 73   ); /* Overflows
35ba0 20 69 6e 20 73 6f 72 74 65 64 20 6f 72 64 65 72   in sorted order
35bb0 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
35bc0 6a 3d 3d 30 20 7c 7c 20 69 3d 3d 70 50 61 67 65  j==0 || i==pPage
35bd0 2d 3e 61 69 4f 76 66 6c 5b 6a 2d 31 5d 2b 31 20  ->aiOvfl[j-1]+1 
35be0 29 3b 20 20 20 2f 2a 20 4f 76 65 72 66 6c 6f 77  );   /* Overflow
35bf0 73 20 61 72 65 20 73 65 71 75 65 6e 74 69 61 6c  s are sequential
35c00 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   */.  }else{.   
35c10 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65   int rc = sqlite
35c20 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67  3PagerWrite(pPag
35c30 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  e->pDbPage);.   
35c40 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
35c50 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 43  OK ){.      *pRC
35c60 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 72 65 74   = rc;.      ret
35c70 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  urn;.    }.    a
35c80 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
35c90 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
35ca0 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
35cb0 3b 0a 20 20 20 20 64 61 74 61 20 3d 20 70 50 61  ;.    data = pPa
35cc0 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 61  ge->aData;.    a
35cd0 73 73 65 72 74 28 20 26 64 61 74 61 5b 70 50 61  ssert( &data[pPa
35ce0 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 5d 3d  ge->cellOffset]=
35cf0 3d 70 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64 78  =pPage->aCellIdx
35d00 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 61 6c 6c   );.    rc = all
35d10 6f 63 61 74 65 53 70 61 63 65 28 70 50 61 67 65  ocateSpace(pPage
35d20 2c 20 73 7a 2c 20 26 69 64 78 29 3b 0a 20 20 20  , sz, &idx);.   
35d30 20 69 66 28 20 72 63 20 29 7b 20 2a 70 52 43 20   if( rc ){ *pRC 
35d40 3d 20 72 63 3b 20 72 65 74 75 72 6e 3b 20 7d 0a  = rc; return; }.
35d50 20 20 20 20 2f 2a 20 54 68 65 20 61 6c 6c 6f 63      /* The alloc
35d60 61 74 65 53 70 61 63 65 28 29 20 72 6f 75 74 69  ateSpace() routi
35d70 6e 65 20 67 75 61 72 61 6e 74 65 65 73 20 74 68  ne guarantees th
35d80 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 72 6f 70  e following prop
35d90 65 72 74 69 65 73 0a 20 20 20 20 2a 2a 20 69 66  erties.    ** if
35da0 20 69 74 20 72 65 74 75 72 6e 73 20 73 75 63 63   it returns succ
35db0 65 73 73 66 75 6c 6c 79 20 2a 2f 0a 20 20 20 20  essfully */.    
35dc0 61 73 73 65 72 74 28 20 69 64 78 20 3e 3d 20 30  assert( idx >= 0
35dd0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
35de0 69 64 78 20 3e 3d 20 70 50 61 67 65 2d 3e 63 65  idx >= pPage->ce
35df0 6c 6c 4f 66 66 73 65 74 2b 32 2a 70 50 61 67 65  llOffset+2*pPage
35e00 2d 3e 6e 43 65 6c 6c 2b 32 20 7c 7c 20 43 4f 52  ->nCell+2 || COR
35e10 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 20 20 61  RUPT_DB );.    a
35e20 73 73 65 72 74 28 20 69 64 78 2b 73 7a 20 3c 3d  ssert( idx+sz <=
35e30 20 28 69 6e 74 29 70 50 61 67 65 2d 3e 70 42 74   (int)pPage->pBt
35e40 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a  ->usableSize );.
35e50 20 20 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65      pPage->nFree
35e60 20 2d 3d 20 28 75 31 36 29 28 32 20 2b 20 73 7a   -= (u16)(2 + sz
35e70 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 64  );.    memcpy(&d
35e80 61 74 61 5b 69 64 78 5d 2c 20 70 43 65 6c 6c 2c  ata[idx], pCell,
35e90 20 73 7a 29 3b 0a 20 20 20 20 69 66 28 20 69 43   sz);.    if( iC
35ea0 68 69 6c 64 20 29 7b 0a 20 20 20 20 20 20 70 75  hild ){.      pu
35eb0 74 34 62 79 74 65 28 26 64 61 74 61 5b 69 64 78  t4byte(&data[idx
35ec0 5d 2c 20 69 43 68 69 6c 64 29 3b 0a 20 20 20 20  ], iChild);.    
35ed0 7d 0a 20 20 20 20 70 49 6e 73 20 3d 20 70 50 61  }.    pIns = pPa
35ee0 67 65 2d 3e 61 43 65 6c 6c 49 64 78 20 2b 20 69  ge->aCellIdx + i
35ef0 2a 32 3b 0a 20 20 20 20 6d 65 6d 6d 6f 76 65 28  *2;.    memmove(
35f00 70 49 6e 73 2b 32 2c 20 70 49 6e 73 2c 20 32 2a  pIns+2, pIns, 2*
35f10 28 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 2d 20  (pPage->nCell - 
35f20 69 29 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74  i));.    put2byt
35f30 65 28 70 49 6e 73 2c 20 69 64 78 29 3b 0a 20 20  e(pIns, idx);.  
35f40 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b 2b    pPage->nCell++
35f50 3b 0a 20 20 20 20 2f 2a 20 69 6e 63 72 65 6d 65  ;.    /* increme
35f60 6e 74 20 74 68 65 20 63 65 6c 6c 20 63 6f 75 6e  nt the cell coun
35f70 74 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 2b 2b  t */.    if( (++
35f80 64 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f  data[pPage->hdrO
35f90 66 66 73 65 74 2b 34 5d 29 3d 3d 30 20 29 20 64  ffset+4])==0 ) d
35fa0 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66  ata[pPage->hdrOf
35fb0 66 73 65 74 2b 33 5d 2b 2b 3b 0a 20 20 20 20 61  fset+3]++;.    a
35fc0 73 73 65 72 74 28 20 67 65 74 32 62 79 74 65 28  ssert( get2byte(
35fd0 26 64 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72  &data[pPage->hdr
35fe0 4f 66 66 73 65 74 2b 33 5d 29 3d 3d 70 50 61 67  Offset+3])==pPag
35ff0 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 23 69 66 6e  e->nCell );.#ifn
36000 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
36010 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69  AUTOVACUUM.    i
36020 66 28 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 61  f( pPage->pBt->a
36030 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20  utoVacuum ){.   
36040 20 20 20 2f 2a 20 54 68 65 20 63 65 6c 6c 20 6d     /* The cell m
36050 61 79 20 63 6f 6e 74 61 69 6e 20 61 20 70 6f 69  ay contain a poi
36060 6e 74 65 72 20 74 6f 20 61 6e 20 6f 76 65 72 66  nter to an overf
36070 6c 6f 77 20 70 61 67 65 2e 20 49 66 20 73 6f 2c  low page. If so,
36080 20 77 72 69 74 65 0a 20 20 20 20 20 20 2a 2a 20   write.      ** 
36090 74 68 65 20 65 6e 74 72 79 20 66 6f 72 20 74 68  the entry for th
360a0 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  e overflow page 
360b0 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72  into the pointer
360c0 20 6d 61 70 2e 0a 20 20 20 20 20 20 2a 2f 0a 20   map..      */. 
360d0 20 20 20 20 20 70 74 72 6d 61 70 50 75 74 4f 76       ptrmapPutOv
360e0 66 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65  flPtr(pPage, pCe
360f0 6c 6c 2c 20 70 52 43 29 3b 0a 20 20 20 20 7d 0a  ll, pRC);.    }.
36100 23 65 6e 64 69 66 0a 20 20 7d 0a 7d 0a 0a 2f 2a  #endif.  }.}../*
36110 0a 2a 2a 20 41 20 43 65 6c 6c 41 72 72 61 79 20  .** A CellArray 
36120 6f 62 6a 65 63 74 20 63 6f 6e 74 61 69 6e 73 20  object contains 
36130 61 20 63 61 63 68 65 20 6f 66 20 70 6f 69 6e 74  a cache of point
36140 65 72 73 20 61 6e 64 20 73 69 7a 65 73 20 66 6f  ers and sizes fo
36150 72 20 61 0a 2a 2a 20 63 6f 6e 73 65 63 75 74 69  r a.** consecuti
36160 76 65 20 73 65 71 75 65 6e 63 65 20 6f 66 20 63  ve sequence of c
36170 65 6c 6c 73 20 74 68 61 74 20 6d 69 67 68 74 20  ells that might 
36180 62 65 20 68 65 6c 64 20 6d 75 6c 74 69 70 6c 65  be held multiple
36190 20 70 61 67 65 73 2e 0a 2a 2f 0a 74 79 70 65 64   pages..*/.typed
361a0 65 66 20 73 74 72 75 63 74 20 43 65 6c 6c 41 72  ef struct CellAr
361b0 72 61 79 20 43 65 6c 6c 41 72 72 61 79 3b 0a 73  ray CellArray;.s
361c0 74 72 75 63 74 20 43 65 6c 6c 41 72 72 61 79 20  truct CellArray 
361d0 7b 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20  {.  int nCell;  
361e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
361f0 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 69  umber of cells i
36200 6e 20 61 70 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20  n apCell[] */.  
36210 4d 65 6d 50 61 67 65 20 2a 70 52 65 66 3b 20 20  MemPage *pRef;  
36220 20 20 20 20 20 20 20 20 2f 2a 20 52 65 66 65 72          /* Refer
36230 65 6e 63 65 20 70 61 67 65 20 2a 2f 0a 20 20 75  ence page */.  u
36240 38 20 2a 2a 61 70 43 65 6c 6c 3b 20 20 20 20 20  8 **apCell;     
36250 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 63 65         /* All ce
36260 6c 6c 73 20 62 65 67 69 6e 20 62 61 6c 61 6e 63  lls begin balanc
36270 65 64 20 2a 2f 0a 20 20 75 31 36 20 2a 73 7a 43  ed */.  u16 *szC
36280 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  ell;            
36290 2f 2a 20 4c 6f 63 61 6c 20 73 69 7a 65 20 6f 66  /* Local size of
362a0 20 61 6c 6c 20 63 65 6c 6c 73 20 69 6e 20 61 70   all cells in ap
362b0 43 65 6c 6c 5b 5d 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  Cell[] */.};../*
362c0 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68  .** Make sure th
362d0 65 20 63 65 6c 6c 20 73 69 7a 65 73 20 61 74 20  e cell sizes at 
362e0 69 64 78 2c 20 69 64 78 2b 31 2c 20 2e 2e 2e 2c  idx, idx+1, ...,
362f0 20 69 64 78 2b 4e 2d 31 20 68 61 76 65 20 62 65   idx+N-1 have be
36300 65 6e 0a 2a 2a 20 63 6f 6d 70 75 74 65 64 2e 0a  en.** computed..
36310 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
36320 6f 70 75 6c 61 74 65 43 65 6c 6c 43 61 63 68 65  opulateCellCache
36330 28 43 65 6c 6c 41 72 72 61 79 20 2a 70 2c 20 69  (CellArray *p, i
36340 6e 74 20 69 64 78 2c 20 69 6e 74 20 4e 29 7b 0a  nt idx, int N){.
36350 20 20 61 73 73 65 72 74 28 20 69 64 78 3e 3d 30    assert( idx>=0
36360 20 26 26 20 69 64 78 2b 4e 3c 3d 70 2d 3e 6e 43   && idx+N<=p->nC
36370 65 6c 6c 20 29 3b 0a 20 20 77 68 69 6c 65 28 20  ell );.  while( 
36380 4e 3e 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72  N>0 ){.    asser
36390 74 28 20 70 2d 3e 61 70 43 65 6c 6c 5b 69 64 78  t( p->apCell[idx
363a0 5d 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  ]!=0 );.    if( 
363b0 70 2d 3e 73 7a 43 65 6c 6c 5b 69 64 78 5d 3d 3d  p->szCell[idx]==
363c0 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 73 7a  0 ){.      p->sz
363d0 43 65 6c 6c 5b 69 64 78 5d 20 3d 20 70 2d 3e 70  Cell[idx] = p->p
363e0 52 65 66 2d 3e 78 43 65 6c 6c 53 69 7a 65 28 70  Ref->xCellSize(p
363f0 2d 3e 70 52 65 66 2c 20 70 2d 3e 61 70 43 65 6c  ->pRef, p->apCel
36400 6c 5b 69 64 78 5d 29 3b 0a 20 20 20 20 7d 65 6c  l[idx]);.    }el
36410 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  se{.      assert
36420 28 20 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c 0a  ( CORRUPT_DB ||.
36430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d                p-
36440 3e 73 7a 43 65 6c 6c 5b 69 64 78 5d 3d 3d 70 2d  >szCell[idx]==p-
36450 3e 70 52 65 66 2d 3e 78 43 65 6c 6c 53 69 7a 65  >pRef->xCellSize
36460 28 70 2d 3e 70 52 65 66 2c 20 70 2d 3e 61 70 43  (p->pRef, p->apC
36470 65 6c 6c 5b 69 64 78 5d 29 20 29 3b 0a 20 20 20  ell[idx]) );.   
36480 20 7d 0a 20 20 20 20 69 64 78 2b 2b 3b 0a 20 20   }.    idx++;.  
36490 20 20 4e 2d 2d 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a    N--;.  }.}../*
364a0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73  .** Return the s
364b0 69 7a 65 20 6f 66 20 74 68 65 20 4e 74 68 20 65  ize of the Nth e
364c0 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 63 65  lement of the ce
364d0 6c 6c 20 61 72 72 61 79 0a 2a 2f 0a 73 74 61 74  ll array.*/.stat
364e0 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49  ic SQLITE_NOINLI
364f0 4e 45 20 75 31 36 20 63 6f 6d 70 75 74 65 43 65  NE u16 computeCe
36500 6c 6c 53 69 7a 65 28 43 65 6c 6c 41 72 72 61 79  llSize(CellArray
36510 20 2a 70 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 61   *p, int N){.  a
36520 73 73 65 72 74 28 20 4e 3e 3d 30 20 26 26 20 4e  ssert( N>=0 && N
36530 3c 70 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61  <p->nCell );.  a
36540 73 73 65 72 74 28 20 70 2d 3e 73 7a 43 65 6c 6c  ssert( p->szCell
36550 5b 4e 5d 3d 3d 30 20 29 3b 0a 20 20 70 2d 3e 73  [N]==0 );.  p->s
36560 7a 43 65 6c 6c 5b 4e 5d 20 3d 20 70 2d 3e 70 52  zCell[N] = p->pR
36570 65 66 2d 3e 78 43 65 6c 6c 53 69 7a 65 28 70 2d  ef->xCellSize(p-
36580 3e 70 52 65 66 2c 20 70 2d 3e 61 70 43 65 6c 6c  >pRef, p->apCell
36590 5b 4e 5d 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  [N]);.  return p
365a0 2d 3e 73 7a 43 65 6c 6c 5b 4e 5d 3b 0a 7d 0a 73  ->szCell[N];.}.s
365b0 74 61 74 69 63 20 75 31 36 20 63 61 63 68 65 64  tatic u16 cached
365c0 43 65 6c 6c 53 69 7a 65 28 43 65 6c 6c 41 72 72  CellSize(CellArr
365d0 61 79 20 2a 70 2c 20 69 6e 74 20 4e 29 7b 0a 20  ay *p, int N){. 
365e0 20 61 73 73 65 72 74 28 20 4e 3e 3d 30 20 26 26   assert( N>=0 &&
365f0 20 4e 3c 70 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20   N<p->nCell );. 
36600 20 69 66 28 20 70 2d 3e 73 7a 43 65 6c 6c 5b 4e   if( p->szCell[N
36610 5d 20 29 20 72 65 74 75 72 6e 20 70 2d 3e 73 7a  ] ) return p->sz
36620 43 65 6c 6c 5b 4e 5d 3b 0a 20 20 72 65 74 75 72  Cell[N];.  retur
36630 6e 20 63 6f 6d 70 75 74 65 43 65 6c 6c 53 69 7a  n computeCellSiz
36640 65 28 70 2c 20 4e 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  e(p, N);.}../*.*
36650 2a 20 41 72 72 61 79 20 61 70 43 65 6c 6c 5b 5d  * Array apCell[]
36660 20 63 6f 6e 74 61 69 6e 73 20 70 6f 69 6e 74 65   contains pointe
36670 72 73 20 74 6f 20 6e 43 65 6c 6c 20 62 2d 74 72  rs to nCell b-tr
36680 65 65 20 70 61 67 65 20 63 65 6c 6c 73 2e 20 54  ee page cells. T
36690 68 65 20 0a 2a 2a 20 73 7a 43 65 6c 6c 5b 5d 20  he .** szCell[] 
366a0 61 72 72 61 79 20 63 6f 6e 74 61 69 6e 73 20 74  array contains t
366b0 68 65 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73  he size in bytes
366c0 20 6f 66 20 65 61 63 68 20 63 65 6c 6c 2e 20 54   of each cell. T
366d0 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  his function.** 
366e0 72 65 70 6c 61 63 65 73 20 74 68 65 20 63 75 72  replaces the cur
366f0 72 65 6e 74 20 63 6f 6e 74 65 6e 74 73 20 6f 66  rent contents of
36700 20 70 61 67 65 20 70 50 67 20 77 69 74 68 20 74   page pPg with t
36710 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
36720 68 65 20 63 65 6c 6c 0a 2a 2a 20 61 72 72 61 79  he cell.** array
36730 2e 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 20 6f 66 20  ..**.** Some of 
36740 74 68 65 20 63 65 6c 6c 73 20 69 6e 20 61 70 43  the cells in apC
36750 65 6c 6c 5b 5d 20 6d 61 79 20 63 75 72 72 65 6e  ell[] may curren
36760 74 6c 79 20 62 65 20 73 74 6f 72 65 64 20 69 6e  tly be stored in
36770 20 70 50 67 2e 20 54 68 69 73 0a 2a 2a 20 66 75   pPg. This.** fu
36780 6e 63 74 69 6f 6e 20 77 6f 72 6b 73 20 61 72 6f  nction works aro
36790 75 6e 64 20 70 72 6f 62 6c 65 6d 73 20 63 61 75  und problems cau
367a0 73 65 64 20 62 79 20 74 68 69 73 20 62 79 20 6d  sed by this by m
367b0 61 6b 69 6e 67 20 61 20 63 6f 70 79 20 6f 66 20  aking a copy of 
367c0 61 6e 79 20 0a 2a 2a 20 73 75 63 68 20 63 65 6c  any .** such cel
367d0 6c 73 20 62 65 66 6f 72 65 20 6f 76 65 72 77 72  ls before overwr
367e0 69 74 69 6e 67 20 74 68 65 20 70 61 67 65 20 64  iting the page d
367f0 61 74 61 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 4d  ata..**.** The M
36800 65 6d 50 61 67 65 2e 6e 46 72 65 65 20 66 69 65  emPage.nFree fie
36810 6c 64 20 69 73 20 69 6e 76 61 6c 69 64 61 74 65  ld is invalidate
36820 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69  d by this functi
36830 6f 6e 2e 20 49 74 20 69 73 20 74 68 65 20 0a 2a  on. It is the .*
36840 2a 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79  * responsibility
36850 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74   of the caller t
36860 6f 20 73 65 74 20 69 74 20 63 6f 72 72 65 63 74  o set it correct
36870 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ly..*/.static in
36880 74 20 72 65 62 75 69 6c 64 50 61 67 65 28 0a 20  t rebuildPage(. 
36890 20 4d 65 6d 50 61 67 65 20 2a 70 50 67 2c 20 20   MemPage *pPg,  
368a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
368b0 20 2f 2a 20 45 64 69 74 20 74 68 69 73 20 70 61   /* Edit this pa
368c0 67 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c  ge */.  int nCel
368d0 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
368e0 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 61 6c          /* Final
368f0 20 6e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73   number of cells
36900 20 6f 6e 20 70 61 67 65 20 2a 2f 0a 20 20 75 38   on page */.  u8
36910 20 2a 2a 61 70 43 65 6c 6c 2c 20 20 20 20 20 20   **apCell,      
36920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
36930 20 41 72 72 61 79 20 6f 66 20 63 65 6c 6c 73 20   Array of cells 
36940 2a 2f 0a 20 20 75 31 36 20 2a 73 7a 43 65 6c 6c  */.  u16 *szCell
36950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36960 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66       /* Array of
36970 20 63 65 6c 6c 20 73 69 7a 65 73 20 2a 2f 0a 29   cell sizes */.)
36980 7b 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 68 64  {.  const int hd
36990 72 20 3d 20 70 50 67 2d 3e 68 64 72 4f 66 66 73  r = pPg->hdrOffs
369a0 65 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  et;          /* 
369b0 4f 66 66 73 65 74 20 6f 66 20 68 65 61 64 65 72  Offset of header
369c0 20 6f 6e 20 70 50 67 20 2a 2f 0a 20 20 75 38 20   on pPg */.  u8 
369d0 2a 20 63 6f 6e 73 74 20 61 44 61 74 61 20 3d 20  * const aData = 
369e0 70 50 67 2d 3e 61 44 61 74 61 3b 20 20 20 20 20  pPg->aData;     
369f0 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
36a00 20 74 6f 20 64 61 74 61 20 66 6f 72 20 70 50 67   to data for pPg
36a10 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20   */.  const int 
36a20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 50 67  usableSize = pPg
36a30 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
36a40 65 3b 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74 20  e;.  u8 * const 
36a50 70 45 6e 64 20 3d 20 26 61 44 61 74 61 5b 75 73  pEnd = &aData[us
36a60 61 62 6c 65 53 69 7a 65 5d 3b 0a 20 20 69 6e 74  ableSize];.  int
36a70 20 69 3b 0a 20 20 75 38 20 2a 70 43 65 6c 6c 70   i;.  u8 *pCellp
36a80 74 72 20 3d 20 70 50 67 2d 3e 61 43 65 6c 6c 49  tr = pPg->aCellI
36a90 64 78 3b 0a 20 20 75 38 20 2a 70 54 6d 70 20 3d  dx;.  u8 *pTmp =
36aa0 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 65 6d   sqlite3PagerTem
36ab0 70 53 70 61 63 65 28 70 50 67 2d 3e 70 42 74 2d  pSpace(pPg->pBt-
36ac0 3e 70 50 61 67 65 72 29 3b 0a 20 20 75 38 20 2a  >pPager);.  u8 *
36ad0 70 44 61 74 61 3b 0a 0a 20 20 69 20 3d 20 67 65  pData;..  i = ge
36ae0 74 32 62 79 74 65 28 26 61 44 61 74 61 5b 68 64  t2byte(&aData[hd
36af0 72 2b 35 5d 29 3b 0a 20 20 6d 65 6d 63 70 79 28  r+5]);.  memcpy(
36b00 26 70 54 6d 70 5b 69 5d 2c 20 26 61 44 61 74 61  &pTmp[i], &aData
36b10 5b 69 5d 2c 20 75 73 61 62 6c 65 53 69 7a 65 20  [i], usableSize 
36b20 2d 20 69 29 3b 0a 0a 20 20 70 44 61 74 61 20 3d  - i);..  pData =
36b30 20 70 45 6e 64 3b 0a 20 20 66 6f 72 28 69 3d 30   pEnd;.  for(i=0
36b40 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b  ; i<nCell; i++){
36b50 0a 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d  .    u8 *pCell =
36b60 20 61 70 43 65 6c 6c 5b 69 5d 3b 0a 20 20 20 20   apCell[i];.    
36b70 69 66 28 20 70 43 65 6c 6c 3e 61 44 61 74 61 20  if( pCell>aData 
36b80 26 26 20 70 43 65 6c 6c 3c 70 45 6e 64 20 29 7b  && pCell<pEnd ){
36b90 0a 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 26  .      pCell = &
36ba0 70 54 6d 70 5b 70 43 65 6c 6c 20 2d 20 61 44 61  pTmp[pCell - aDa
36bb0 74 61 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ta];.    }.    p
36bc0 44 61 74 61 20 2d 3d 20 73 7a 43 65 6c 6c 5b 69  Data -= szCell[i
36bd0 5d 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65 28  ];.    put2byte(
36be0 70 43 65 6c 6c 70 74 72 2c 20 28 70 44 61 74 61  pCellptr, (pData
36bf0 20 2d 20 61 44 61 74 61 29 29 3b 0a 20 20 20 20   - aData));.    
36c00 70 43 65 6c 6c 70 74 72 20 2b 3d 20 32 3b 0a 20  pCellptr += 2;. 
36c10 20 20 20 69 66 28 20 70 44 61 74 61 20 3c 20 70     if( pData < p
36c20 43 65 6c 6c 70 74 72 20 29 20 72 65 74 75 72 6e  Cellptr ) return
36c30 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
36c40 42 4b 50 54 3b 0a 20 20 20 20 6d 65 6d 63 70 79  BKPT;.    memcpy
36c50 28 70 44 61 74 61 2c 20 70 43 65 6c 6c 2c 20 73  (pData, pCell, s
36c60 7a 43 65 6c 6c 5b 69 5d 29 3b 0a 20 20 20 20 61  zCell[i]);.    a
36c70 73 73 65 72 74 28 20 73 7a 43 65 6c 6c 5b 69 5d  ssert( szCell[i]
36c80 3d 3d 70 50 67 2d 3e 78 43 65 6c 6c 53 69 7a 65  ==pPg->xCellSize
36c90 28 70 50 67 2c 20 70 43 65 6c 6c 29 20 7c 7c 20  (pPg, pCell) || 
36ca0 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20  CORRUPT_DB );.  
36cb0 20 20 74 65 73 74 63 61 73 65 28 20 73 7a 43 65    testcase( szCe
36cc0 6c 6c 5b 69 5d 21 3d 70 50 67 2d 3e 78 43 65 6c  ll[i]!=pPg->xCel
36cd0 6c 53 69 7a 65 28 70 50 67 2c 70 43 65 6c 6c 29  lSize(pPg,pCell)
36ce0 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68   );.  }..  /* Th
36cf0 65 20 70 50 67 2d 3e 6e 46 72 65 65 20 66 69 65  e pPg->nFree fie
36d00 6c 64 20 69 73 20 6e 6f 77 20 73 65 74 20 69 6e  ld is now set in
36d10 63 6f 72 72 65 63 74 6c 79 2e 20 54 68 65 20 63  correctly. The c
36d20 61 6c 6c 65 72 20 77 69 6c 6c 20 66 69 78 20 69  aller will fix i
36d30 74 2e 20 2a 2f 0a 20 20 70 50 67 2d 3e 6e 43 65  t. */.  pPg->nCe
36d40 6c 6c 20 3d 20 6e 43 65 6c 6c 3b 0a 20 20 70 50  ll = nCell;.  pP
36d50 67 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30  g->nOverflow = 0
36d60 3b 0a 0a 20 20 70 75 74 32 62 79 74 65 28 26 61  ;..  put2byte(&a
36d70 44 61 74 61 5b 68 64 72 2b 31 5d 2c 20 30 29 3b  Data[hdr+1], 0);
36d80 0a 20 20 70 75 74 32 62 79 74 65 28 26 61 44 61  .  put2byte(&aDa
36d90 74 61 5b 68 64 72 2b 33 5d 2c 20 70 50 67 2d 3e  ta[hdr+3], pPg->
36da0 6e 43 65 6c 6c 29 3b 0a 20 20 70 75 74 32 62 79  nCell);.  put2by
36db0 74 65 28 26 61 44 61 74 61 5b 68 64 72 2b 35 5d  te(&aData[hdr+5]
36dc0 2c 20 70 44 61 74 61 20 2d 20 61 44 61 74 61 29  , pData - aData)
36dd0 3b 0a 20 20 61 44 61 74 61 5b 68 64 72 2b 37 5d  ;.  aData[hdr+7]
36de0 20 3d 20 30 78 30 30 3b 0a 20 20 72 65 74 75 72   = 0x00;.  retur
36df0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
36e00 2f 2a 0a 2a 2a 20 41 72 72 61 79 20 61 70 43 65  /*.** Array apCe
36e10 6c 6c 5b 5d 20 63 6f 6e 74 61 69 6e 73 20 6e 43  ll[] contains nC
36e20 65 6c 6c 20 70 6f 69 6e 74 65 72 73 20 74 6f 20  ell pointers to 
36e30 62 2d 74 72 65 65 20 63 65 6c 6c 73 2e 20 41 72  b-tree cells. Ar
36e40 72 61 79 20 73 7a 43 65 6c 6c 0a 2a 2a 20 63 6f  ray szCell.** co
36e50 6e 74 61 69 6e 73 20 74 68 65 20 73 69 7a 65 20  ntains the size 
36e60 69 6e 20 62 79 74 65 73 20 6f 66 20 65 61 63 68  in bytes of each
36e70 20 73 75 63 68 20 63 65 6c 6c 2e 20 54 68 69 73   such cell. This
36e80 20 66 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70   function attemp
36e90 74 73 20 74 6f 20 0a 2a 2a 20 61 64 64 20 74 68  ts to .** add th
36ea0 65 20 63 65 6c 6c 73 20 73 74 6f 72 65 64 20 69  e cells stored i
36eb0 6e 20 74 68 65 20 61 72 72 61 79 20 74 6f 20 70  n the array to p
36ec0 61 67 65 20 70 50 67 2e 20 49 66 20 69 74 20 63  age pPg. If it c
36ed0 61 6e 6e 6f 74 20 28 62 65 63 61 75 73 65 20 0a  annot (because .
36ee0 2a 2a 20 74 68 65 20 70 61 67 65 20 6e 65 65 64  ** the page need
36ef0 73 20 74 6f 20 62 65 20 64 65 66 72 61 67 6d 65  s to be defragme
36f00 6e 74 65 64 20 62 65 66 6f 72 65 20 74 68 65 20  nted before the 
36f10 63 65 6c 6c 73 20 77 69 6c 6c 20 66 69 74 29 2c  cells will fit),
36f20 20 6e 6f 6e 2d 7a 65 72 6f 0a 2a 2a 20 69 73 20   non-zero.** is 
36f30 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77  returned. Otherw
36f40 69 73 65 2c 20 69 66 20 74 68 65 20 63 65 6c 6c  ise, if the cell
36f50 73 20 61 72 65 20 61 64 64 65 64 20 73 75 63 63  s are added succ
36f60 65 73 73 66 75 6c 6c 79 2c 20 7a 65 72 6f 20 69  essfully, zero i
36f70 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e 0a 2a  s.** returned..*
36f80 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 43  *.** Argument pC
36f90 65 6c 6c 70 74 72 20 70 6f 69 6e 74 73 20 74 6f  ellptr points to
36fa0 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79   the first entry
36fb0 20 69 6e 20 74 68 65 20 63 65 6c 6c 2d 70 6f 69   in the cell-poi
36fc0 6e 74 65 72 20 61 72 72 61 79 0a 2a 2a 20 28 70  nter array.** (p
36fd0 61 72 74 20 6f 66 20 70 61 67 65 20 70 50 67 29  art of page pPg)
36fe0 20 74 6f 20 70 6f 70 75 6c 61 74 65 2e 20 41 66   to populate. Af
36ff0 74 65 72 20 63 65 6c 6c 20 61 70 43 65 6c 6c 5b  ter cell apCell[
37000 30 5d 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f  0] is written to
37010 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 62 6f 64   the.** page bod
37020 79 2c 20 61 20 31 36 2d 62 69 74 20 6f 66 66 73  y, a 16-bit offs
37030 65 74 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f  et is written to
37040 20 70 43 65 6c 6c 70 74 72 2e 20 41 6e 64 20 73   pCellptr. And s
37050 6f 20 6f 6e 2c 20 66 6f 72 20 65 61 63 68 0a 2a  o on, for each.*
37060 2a 20 63 65 6c 6c 20 69 6e 20 74 68 65 20 61 72  * cell in the ar
37070 72 61 79 2e 20 49 74 20 69 73 20 74 68 65 20 72  ray. It is the r
37080 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66  esponsibility of
37090 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 65   the caller to e
370a0 6e 73 75 72 65 0a 2a 2a 20 74 68 61 74 20 69 74  nsure.** that it
370b0 20 69 73 20 73 61 66 65 20 74 6f 20 6f 76 65 72   is safe to over
370c0 77 72 69 74 65 20 74 68 69 73 20 70 61 72 74 20  write this part 
370d0 6f 66 20 74 68 65 20 63 65 6c 6c 2d 70 6f 69 6e  of the cell-poin
370e0 74 65 72 20 61 72 72 61 79 2e 0a 2a 2a 0a 2a 2a  ter array..**.**
370f0 20 57 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   When this funct
37100 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 2a  ion is called, *
37110 70 70 44 61 74 61 20 70 6f 69 6e 74 73 20 74 6f  ppData points to
37120 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
37130 65 20 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 61 72  e .** content ar
37140 65 61 20 6f 6e 20 70 61 67 65 20 70 50 67 2e 20  ea on page pPg. 
37150 49 66 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  If the size of t
37160 68 65 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20  he content area 
37170 69 73 20 65 78 74 65 6e 64 65 64 2c 0a 2a 2a 20  is extended,.** 
37180 2a 70 70 44 61 74 61 20 69 73 20 75 70 64 61 74  *ppData is updat
37190 65 64 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74  ed to point to t
371a0 68 65 20 6e 65 77 20 73 74 61 72 74 20 6f 66 20  he new start of 
371b0 74 68 65 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  the content area
371c0 0a 2a 2a 20 62 65 66 6f 72 65 20 72 65 74 75 72  .** before retur
371d0 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 46 69 6e 61  ning..**.** Fina
371e0 6c 6c 79 2c 20 61 72 67 75 6d 65 6e 74 20 70 42  lly, argument pB
371f0 65 67 69 6e 20 70 6f 69 6e 74 73 20 74 6f 20 74  egin points to t
37200 68 65 20 62 79 74 65 20 69 6d 6d 65 64 69 61 74  he byte immediat
37210 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68  ely following th
37220 65 0a 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65 20  e.** end of the 
37230 73 70 61 63 65 20 72 65 71 75 69 72 65 64 20 62  space required b
37240 79 20 74 68 69 73 20 70 61 67 65 20 66 6f 72 20  y this page for 
37250 74 68 65 20 63 65 6c 6c 2d 70 6f 69 6e 74 65 72  the cell-pointer
37260 20 61 72 65 61 20 28 66 6f 72 0a 2a 2a 20 61 6c   area (for.** al
37270 6c 20 63 65 6c 6c 73 20 2d 20 6e 6f 74 20 6a 75  l cells - not ju
37280 73 74 20 74 68 6f 73 65 20 69 6e 73 65 72 74 65  st those inserte
37290 64 20 62 79 20 74 68 65 20 63 75 72 72 65 6e 74  d by the current
372a0 20 63 61 6c 6c 29 2e 20 49 66 20 74 68 65 20 63   call). If the c
372b0 6f 6e 74 65 6e 74 0a 2a 2a 20 61 72 65 61 20 6d  ontent.** area m
372c0 75 73 74 20 62 65 20 65 78 74 65 6e 64 65 64 20  ust be extended 
372d0 74 6f 20 62 65 66 6f 72 65 20 74 68 69 73 20 70  to before this p
372e0 6f 69 6e 74 20 69 6e 20 6f 72 64 65 72 20 74 6f  oint in order to
372f0 20 61 63 63 6f 6d 6f 64 61 74 65 20 61 6c 6c 0a   accomodate all.
37300 2a 2a 20 63 65 6c 6c 73 20 69 6e 20 61 70 43 65  ** cells in apCe
37310 6c 6c 5b 5d 2c 20 74 68 65 6e 20 74 68 65 20 63  ll[], then the c
37320 65 6c 6c 73 20 64 6f 20 6e 6f 74 20 66 69 74 20  ells do not fit 
37330 61 6e 64 20 6e 6f 6e 2d 7a 65 72 6f 20 69 73 20  and non-zero is 
37340 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
37350 74 69 63 20 69 6e 74 20 70 61 67 65 49 6e 73 65  tic int pageInse
37360 72 74 41 72 72 61 79 28 0a 20 20 4d 65 6d 50 61  rtArray(.  MemPa
37370 67 65 20 2a 70 50 67 2c 20 20 20 20 20 20 20 20  ge *pPg,        
37380 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
37390 67 65 20 74 6f 20 61 64 64 20 63 65 6c 6c 73 20  ge to add cells 
373a0 74 6f 20 2a 2f 0a 20 20 75 38 20 2a 70 42 65 67  to */.  u8 *pBeg
373b0 69 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  in,             
373c0 20 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f          /* End o
373d0 66 20 63 65 6c 6c 2d 70 6f 69 6e 74 65 72 20 61  f cell-pointer a
373e0 72 72 61 79 20 2a 2f 0a 20 20 75 38 20 2a 2a 70  rray */.  u8 **p
373f0 70 44 61 74 61 2c 20 20 20 20 20 20 20 20 20 20  pData,          
37400 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f            /* IN/
37410 4f 55 54 3a 20 50 61 67 65 20 63 6f 6e 74 65 6e  OUT: Page conten
37420 74 20 2d 61 72 65 61 20 70 6f 69 6e 74 65 72 20  t -area pointer 
37430 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 70 74  */.  u8 *pCellpt
37440 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r,              
37450 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
37460 74 6f 20 63 65 6c 6c 2d 70 6f 69 6e 74 65 72 20  to cell-pointer 
37470 61 72 65 61 20 2a 2f 0a 20 20 69 6e 74 20 69 46  area */.  int iF
37480 69 72 73 74 2c 20 20 20 20 20 20 20 20 20 20 20  irst,           
37490 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
374a0 65 78 20 6f 66 20 66 69 72 73 74 20 63 65 6c 6c  ex of first cell
374b0 20 74 6f 20 61 64 64 20 2a 2f 0a 20 20 69 6e 74   to add */.  int
374c0 20 6e 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20   nCell,         
374d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
374e0 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20  Number of cells 
374f0 74 6f 20 61 64 64 20 74 6f 20 70 50 67 20 2a 2f  to add to pPg */
37500 0a 20 20 43 65 6c 6c 41 72 72 61 79 20 2a 70 43  .  CellArray *pC
37510 41 72 72 61 79 20 20 20 20 20 20 20 20 20 20 20  Array           
37520 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 63     /* Array of c
37530 65 6c 6c 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ells */.){.  int
37540 20 69 3b 0a 20 20 75 38 20 2a 61 44 61 74 61 20   i;.  u8 *aData 
37550 3d 20 70 50 67 2d 3e 61 44 61 74 61 3b 0a 20 20  = pPg->aData;.  
37560 75 38 20 2a 70 44 61 74 61 20 3d 20 2a 70 70 44  u8 *pData = *ppD
37570 61 74 61 3b 0a 20 20 69 6e 74 20 69 45 6e 64 20  ata;.  int iEnd 
37580 3d 20 69 46 69 72 73 74 20 2b 20 6e 43 65 6c 6c  = iFirst + nCell
37590 3b 0a 20 20 61 73 73 65 72 74 28 20 43 4f 52 52  ;.  assert( CORR
375a0 55 50 54 5f 44 42 20 7c 7c 20 70 50 67 2d 3e 68  UPT_DB || pPg->h
375b0 64 72 4f 66 66 73 65 74 3d 3d 30 20 29 3b 20 20  drOffset==0 );  
375c0 20 20 2f 2a 20 4e 65 76 65 72 20 63 61 6c 6c 65    /* Never calle
375d0 64 20 6f 6e 20 70 61 67 65 20 31 20 2a 2f 0a 20  d on page 1 */. 
375e0 20 66 6f 72 28 69 3d 69 46 69 72 73 74 3b 20 69   for(i=iFirst; i
375f0 3c 69 45 6e 64 3b 20 69 2b 2b 29 7b 0a 20 20 20  <iEnd; i++){.   
37600 20 69 6e 74 20 73 7a 2c 20 72 63 3b 0a 20 20 20   int sz, rc;.   
37610 20 75 38 20 2a 70 53 6c 6f 74 3b 0a 20 20 20 20   u8 *pSlot;.    
37620 73 7a 20 3d 20 63 61 63 68 65 64 43 65 6c 6c 53  sz = cachedCellS
37630 69 7a 65 28 70 43 41 72 72 61 79 2c 20 69 29 3b  ize(pCArray, i);
37640 0a 20 20 20 20 69 66 28 20 28 61 44 61 74 61 5b  .    if( (aData[
37650 31 5d 3d 3d 30 20 26 26 20 61 44 61 74 61 5b 32  1]==0 && aData[2
37660 5d 3d 3d 30 29 20 7c 7c 20 28 70 53 6c 6f 74 20  ]==0) || (pSlot 
37670 3d 20 70 61 67 65 46 69 6e 64 53 6c 6f 74 28 70  = pageFindSlot(p
37680 50 67 2c 73 7a 2c 26 72 63 29 29 3d 3d 30 20 29  Pg,sz,&rc))==0 )
37690 7b 0a 20 20 20 20 20 20 70 44 61 74 61 20 2d 3d  {.      pData -=
376a0 20 73 7a 3b 0a 20 20 20 20 20 20 69 66 28 20 70   sz;.      if( p
376b0 44 61 74 61 3c 70 42 65 67 69 6e 20 29 20 72 65  Data<pBegin ) re
376c0 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 70 53  turn 1;.      pS
376d0 6c 6f 74 20 3d 20 70 44 61 74 61 3b 0a 20 20 20  lot = pData;.   
376e0 20 7d 0a 20 20 20 20 2f 2a 20 70 53 6c 6f 74 20   }.    /* pSlot 
376f0 61 6e 64 20 70 43 41 72 72 61 79 2d 3e 61 70 43  and pCArray->apC
37700 65 6c 6c 5b 69 5d 20 77 69 6c 6c 20 6e 65 76 65  ell[i] will neve
37710 72 20 6f 76 65 72 6c 61 70 20 6f 6e 20 61 20 77  r overlap on a w
37720 65 6c 6c 2d 66 6f 72 6d 65 64 0a 20 20 20 20 2a  ell-formed.    *
37730 2a 20 64 61 74 61 62 61 73 65 2e 20 20 42 75 74  * database.  But
37740 20 74 68 65 79 20 6d 69 67 68 74 20 66 6f 72 20   they might for 
37750 61 20 63 6f 72 72 75 70 74 20 64 61 74 61 62 61  a corrupt databa
37760 73 65 2e 20 20 48 65 6e 63 65 20 75 73 65 20 6d  se.  Hence use m
37770 65 6d 6d 6f 76 65 28 29 0a 20 20 20 20 2a 2a 20  emmove().    ** 
37780 73 69 6e 63 65 20 6d 65 6d 63 70 79 28 29 20 73  since memcpy() s
37790 65 6e 64 73 20 53 49 47 41 42 4f 52 54 20 77 69  ends SIGABORT wi
377a0 74 68 20 6f 76 65 72 6c 61 70 70 69 6e 67 20 62  th overlapping b
377b0 75 66 66 65 72 73 20 6f 6e 20 4f 70 65 6e 42 53  uffers on OpenBS
377c0 44 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  D */.    assert(
377d0 20 28 70 53 6c 6f 74 2b 73 7a 29 3c 3d 70 43 41   (pSlot+sz)<=pCA
377e0 72 72 61 79 2d 3e 61 70 43 65 6c 6c 5b 69 5d 0a  rray->apCell[i].
377f0 20 20 20 20 20 20 20 20 20 7c 7c 20 70 53 6c 6f           || pSlo
37800 74 3e 3d 28 70 43 41 72 72 61 79 2d 3e 61 70 43  t>=(pCArray->apC
37810 65 6c 6c 5b 69 5d 2b 73 7a 29 0a 20 20 20 20 20  ell[i]+sz).     
37820 20 20 20 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44      || CORRUPT_D
37830 42 20 29 3b 0a 20 20 20 20 6d 65 6d 6d 6f 76 65  B );.    memmove
37840 28 70 53 6c 6f 74 2c 20 70 43 41 72 72 61 79 2d  (pSlot, pCArray-
37850 3e 61 70 43 65 6c 6c 5b 69 5d 2c 20 73 7a 29 3b  >apCell[i], sz);
37860 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 70 43  .    put2byte(pC
37870 65 6c 6c 70 74 72 2c 20 28 70 53 6c 6f 74 20 2d  ellptr, (pSlot -
37880 20 61 44 61 74 61 29 29 3b 0a 20 20 20 20 70 43   aData));.    pC
37890 65 6c 6c 70 74 72 20 2b 3d 20 32 3b 0a 20 20 7d  ellptr += 2;.  }
378a0 0a 20 20 2a 70 70 44 61 74 61 20 3d 20 70 44 61  .  *ppData = pDa
378b0 74 61 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a  ta;.  return 0;.
378c0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 72 61 79 20 61  }../*.** Array a
378d0 70 43 65 6c 6c 5b 5d 20 63 6f 6e 74 61 69 6e 73  pCell[] contains
378e0 20 6e 43 65 6c 6c 20 70 6f 69 6e 74 65 72 73 20   nCell pointers 
378f0 74 6f 20 62 2d 74 72 65 65 20 63 65 6c 6c 73 2e  to b-tree cells.
37900 20 41 72 72 61 79 20 73 7a 43 65 6c 6c 20 0a 2a   Array szCell .*
37910 2a 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 73  * contains the s
37920 69 7a 65 20 69 6e 20 62 79 74 65 73 20 6f 66 20  ize in bytes of 
37930 65 61 63 68 20 73 75 63 68 20 63 65 6c 6c 2e 20  each such cell. 
37940 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 64  This function ad
37950 64 73 20 74 68 65 0a 2a 2a 20 73 70 61 63 65 20  ds the.** space 
37960 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
37970 65 61 63 68 20 63 65 6c 6c 20 69 6e 20 74 68 65  each cell in the
37980 20 61 72 72 61 79 20 74 68 61 74 20 69 73 20 63   array that is c
37990 75 72 72 65 6e 74 6c 79 20 73 74 6f 72 65 64 20  urrently stored 
379a0 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20 62  .** within the b
379b0 6f 64 79 20 6f 66 20 70 50 67 20 74 6f 20 74 68  ody of pPg to th
379c0 65 20 70 50 67 20 66 72 65 65 2d 6c 69 73 74 2e  e pPg free-list.
379d0 20 54 68 65 20 63 65 6c 6c 2d 70 6f 69 6e 74 65   The cell-pointe
379e0 72 73 20 61 6e 64 20 6f 74 68 65 72 0a 2a 2a 20  rs and other.** 
379f0 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 70 61  fields of the pa
37a00 67 65 20 61 72 65 20 6e 6f 74 20 75 70 64 61 74  ge are not updat
37a10 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ed..**.** This f
37a20 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
37a30 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72  the total number
37a40 20 6f 66 20 63 65 6c 6c 73 20 61 64 64 65 64 20   of cells added 
37a50 74 6f 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  to the free-list
37a60 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
37a70 70 61 67 65 46 72 65 65 41 72 72 61 79 28 0a 20  pageFreeArray(. 
37a80 20 4d 65 6d 50 61 67 65 20 2a 70 50 67 2c 20 20   MemPage *pPg,  
37a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37aa0 20 2f 2a 20 50 61 67 65 20 74 6f 20 65 64 69 74   /* Page to edit
37ab0 20 2a 2f 0a 20 20 69 6e 74 20 69 46 69 72 73 74   */.  int iFirst
37ac0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
37ad0 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 63        /* First c
37ae0 65 6c 6c 20 74 6f 20 64 65 6c 65 74 65 20 2a 2f  ell to delete */
37af0 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 2c 20 20 20  .  int nCell,   
37b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37b10 20 20 20 2f 2a 20 43 65 6c 6c 73 20 74 6f 20 64     /* Cells to d
37b20 65 6c 65 74 65 20 2a 2f 0a 20 20 43 65 6c 6c 41  elete */.  CellA
37b30 72 72 61 79 20 2a 70 43 41 72 72 61 79 20 20 20  rray *pCArray   
37b40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72             /* Ar
37b50 72 61 79 20 6f 66 20 63 65 6c 6c 73 20 2a 2f 0a  ray of cells */.
37b60 29 7b 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74 20  ){.  u8 * const 
37b70 61 44 61 74 61 20 3d 20 70 50 67 2d 3e 61 44 61  aData = pPg->aDa
37b80 74 61 3b 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74  ta;.  u8 * const
37b90 20 70 45 6e 64 20 3d 20 26 61 44 61 74 61 5b 70   pEnd = &aData[p
37ba0 50 67 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  Pg->pBt->usableS
37bb0 69 7a 65 5d 3b 0a 20 20 75 38 20 2a 20 63 6f 6e  ize];.  u8 * con
37bc0 73 74 20 70 53 74 61 72 74 20 3d 20 26 61 44 61  st pStart = &aDa
37bd0 74 61 5b 70 50 67 2d 3e 68 64 72 4f 66 66 73 65  ta[pPg->hdrOffse
37be0 74 20 2b 20 38 20 2b 20 70 50 67 2d 3e 63 68 69  t + 8 + pPg->chi
37bf0 6c 64 50 74 72 53 69 7a 65 5d 3b 0a 20 20 69 6e  ldPtrSize];.  in
37c00 74 20 6e 52 65 74 20 3d 20 30 3b 0a 20 20 69 6e  t nRet = 0;.  in
37c10 74 20 69 3b 0a 20 20 69 6e 74 20 69 45 6e 64 20  t i;.  int iEnd 
37c20 3d 20 69 46 69 72 73 74 20 2b 20 6e 43 65 6c 6c  = iFirst + nCell
37c30 3b 0a 20 20 75 38 20 2a 70 46 72 65 65 20 3d 20  ;.  u8 *pFree = 
37c40 30 3b 0a 20 20 69 6e 74 20 73 7a 46 72 65 65 20  0;.  int szFree 
37c50 3d 20 30 3b 0a 0a 20 20 66 6f 72 28 69 3d 69 46  = 0;..  for(i=iF
37c60 69 72 73 74 3b 20 69 3c 69 45 6e 64 3b 20 69 2b  irst; i<iEnd; i+
37c70 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70 43 65 6c  +){.    u8 *pCel
37c80 6c 20 3d 20 70 43 41 72 72 61 79 2d 3e 61 70 43  l = pCArray->apC
37c90 65 6c 6c 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20  ell[i];.    if( 
37ca0 70 43 65 6c 6c 3e 3d 70 53 74 61 72 74 20 26 26  pCell>=pStart &&
37cb0 20 70 43 65 6c 6c 3c 70 45 6e 64 20 29 7b 0a 20   pCell<pEnd ){. 
37cc0 20 20 20 20 20 69 6e 74 20 73 7a 3b 0a 20 20 20       int sz;.   
37cd0 20 20 20 2f 2a 20 4e 6f 20 6e 65 65 64 20 74 6f     /* No need to
37ce0 20 75 73 65 20 63 61 63 68 65 64 43 65 6c 6c 53   use cachedCellS
37cf0 69 7a 65 28 29 20 68 65 72 65 2e 20 20 54 68 65  ize() here.  The
37d00 20 73 69 7a 65 73 20 6f 66 20 61 6c 6c 20 63 65   sizes of all ce
37d10 6c 6c 73 20 74 68 61 74 0a 20 20 20 20 20 20 2a  lls that.      *
37d20 2a 20 61 72 65 20 74 6f 20 62 65 20 66 72 65 65  * are to be free
37d30 64 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62  d have already b
37d40 65 65 6e 20 63 6f 6d 70 75 74 69 6e 67 20 77 68  een computing wh
37d50 69 6c 65 20 64 65 63 69 64 69 6e 67 20 77 68 69  ile deciding whi
37d60 63 68 0a 20 20 20 20 20 20 2a 2a 20 63 65 6c 6c  ch.      ** cell
37d70 73 20 6e 65 65 64 20 66 72 65 65 69 6e 67 20 2a  s need freeing *
37d80 2f 0a 20 20 20 20 20 20 73 7a 20 3d 20 70 43 41  /.      sz = pCA
37d90 72 72 61 79 2d 3e 73 7a 43 65 6c 6c 5b 69 5d 3b  rray->szCell[i];
37da0 20 20 61 73 73 65 72 74 28 20 73 7a 3e 30 20 29    assert( sz>0 )
37db0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 46 72 65  ;.      if( pFre
37dc0 65 21 3d 28 70 43 65 6c 6c 20 2b 20 73 7a 29 20  e!=(pCell + sz) 
37dd0 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
37de0 46 72 65 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Free ){.        
37df0 20 20 61 73 73 65 72 74 28 20 70 46 72 65 65 3e    assert( pFree>
37e00 61 44 61 74 61 20 26 26 20 28 70 46 72 65 65 20  aData && (pFree 
37e10 2d 20 61 44 61 74 61 29 3c 36 35 35 33 36 20 29  - aData)<65536 )
37e20 3b 0a 20 20 20 20 20 20 20 20 20 20 66 72 65 65  ;.          free
37e30 53 70 61 63 65 28 70 50 67 2c 20 28 75 31 36 29  Space(pPg, (u16)
37e40 28 70 46 72 65 65 20 2d 20 61 44 61 74 61 29 2c  (pFree - aData),
37e50 20 73 7a 46 72 65 65 29 3b 0a 20 20 20 20 20 20   szFree);.      
37e60 20 20 7d 0a 20 20 20 20 20 20 20 20 70 46 72 65    }.        pFre
37e70 65 20 3d 20 70 43 65 6c 6c 3b 0a 20 20 20 20 20  e = pCell;.     
37e80 20 20 20 73 7a 46 72 65 65 20 3d 20 73 7a 3b 0a     szFree = sz;.
37e90 20 20 20 20 20 20 20 20 69 66 28 20 70 46 72 65          if( pFre
37ea0 65 2b 73 7a 3e 70 45 6e 64 20 29 20 72 65 74 75  e+sz>pEnd ) retu
37eb0 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73  rn 0;.      }els
37ec0 65 7b 0a 20 20 20 20 20 20 20 20 70 46 72 65 65  e{.        pFree
37ed0 20 3d 20 70 43 65 6c 6c 3b 0a 20 20 20 20 20 20   = pCell;.      
37ee0 20 20 73 7a 46 72 65 65 20 2b 3d 20 73 7a 3b 0a    szFree += sz;.
37ef0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 52        }.      nR
37f00 65 74 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  et++;.    }.  }.
37f10 20 20 69 66 28 20 70 46 72 65 65 20 29 7b 0a 20    if( pFree ){. 
37f20 20 20 20 61 73 73 65 72 74 28 20 70 46 72 65 65     assert( pFree
37f30 3e 61 44 61 74 61 20 26 26 20 28 70 46 72 65 65  >aData && (pFree
37f40 20 2d 20 61 44 61 74 61 29 3c 36 35 35 33 36 20   - aData)<65536 
37f50 29 3b 0a 20 20 20 20 66 72 65 65 53 70 61 63 65  );.    freeSpace
37f60 28 70 50 67 2c 20 28 75 31 36 29 28 70 46 72 65  (pPg, (u16)(pFre
37f70 65 20 2d 20 61 44 61 74 61 29 2c 20 73 7a 46 72  e - aData), szFr
37f80 65 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ee);.  }.  retur
37f90 6e 20 6e 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n nRet;.}../*.**
37fa0 20 61 70 43 65 6c 6c 5b 5d 20 61 6e 64 20 73 7a   apCell[] and sz
37fb0 43 65 6c 6c 5b 5d 20 63 6f 6e 74 61 69 6e 73 20  Cell[] contains 
37fc0 70 6f 69 6e 74 65 72 73 20 74 6f 20 61 6e 64 20  pointers to and 
37fd0 73 69 7a 65 73 20 6f 66 20 61 6c 6c 20 63 65 6c  sizes of all cel
37fe0 6c 73 20 69 6e 20 74 68 65 0a 2a 2a 20 70 61 67  ls in the.** pag
37ff0 65 73 20 62 65 69 6e 67 20 62 61 6c 61 6e 63 65  es being balance
38000 64 2e 20 20 54 68 65 20 63 75 72 72 65 6e 74 20  d.  The current 
38010 70 61 67 65 2c 20 70 50 67 2c 20 68 61 73 20 70  page, pPg, has p
38020 50 67 2d 3e 6e 43 65 6c 6c 20 63 65 6c 6c 73 20  Pg->nCell cells 
38030 73 74 61 72 74 69 6e 67 0a 2a 2a 20 77 69 74 68  starting.** with
38040 20 61 70 43 65 6c 6c 5b 69 4f 6c 64 5d 2e 20 20   apCell[iOld].  
38050 41 66 74 65 72 20 62 61 6c 61 6e 63 69 6e 67 2c  After balancing,
38060 20 74 68 69 73 20 70 61 67 65 20 73 68 6f 75 6c   this page shoul
38070 64 20 68 6f 6c 64 20 6e 4e 65 77 20 63 65 6c 6c  d hold nNew cell
38080 73 0a 2a 2a 20 73 74 61 72 74 69 6e 67 20 61 74  s.** starting at
38090 20 61 70 43 65 6c 6c 5b 69 4e 65 77 5d 2e 0a 2a   apCell[iNew]..*
380a0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
380b0 65 20 6d 61 6b 65 73 20 74 68 65 20 6e 65 63 65  e makes the nece
380c0 73 73 61 72 79 20 61 64 6a 75 73 74 6d 65 6e 74  ssary adjustment
380d0 73 20 74 6f 20 70 50 67 20 73 6f 20 74 68 61 74  s to pPg so that
380e0 20 69 74 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20   it contains.** 
380f0 74 68 65 20 63 6f 72 72 65 63 74 20 63 65 6c 6c  the correct cell
38100 73 20 61 66 74 65 72 20 62 65 69 6e 67 20 62 61  s after being ba
38110 6c 61 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  lanced..**.** Th
38120 65 20 70 50 67 2d 3e 6e 46 72 65 65 20 66 69 65  e pPg->nFree fie
38130 6c 64 20 69 73 20 69 6e 76 61 6c 69 64 20 77 68  ld is invalid wh
38140 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
38150 20 72 65 74 75 72 6e 73 2e 20 49 74 20 69 73 20   returns. It is 
38160 74 68 65 0a 2a 2a 20 72 65 73 70 6f 6e 73 69 62  the.** responsib
38170 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c  ility of the cal
38180 6c 65 72 20 74 6f 20 73 65 74 20 69 74 20 63 6f  ler to set it co
38190 72 72 65 63 74 6c 79 2e 0a 2a 2f 0a 73 74 61 74  rrectly..*/.stat
381a0 69 63 20 69 6e 74 20 65 64 69 74 50 61 67 65 28  ic int editPage(
381b0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 67 2c  .  MemPage *pPg,
381c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
381d0 20 20 20 2f 2a 20 45 64 69 74 20 74 68 69 73 20     /* Edit this 
381e0 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4f  page */.  int iO
381f0 6c 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ld,             
38200 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
38210 65 78 20 6f 66 20 66 69 72 73 74 20 63 65 6c 6c  ex of first cell
38220 20 63 75 72 72 65 6e 74 6c 79 20 6f 6e 20 70 61   currently on pa
38230 67 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4e 65 77  ge */.  int iNew
38240 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
38250 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
38260 20 6f 66 20 6e 65 77 20 66 69 72 73 74 20 63 65   of new first ce
38270 6c 6c 20 6f 6e 20 70 61 67 65 20 2a 2f 0a 20 20  ll on page */.  
38280 69 6e 74 20 6e 4e 65 77 2c 20 20 20 20 20 20 20  int nNew,       
38290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
382a0 2f 2a 20 46 69 6e 61 6c 20 6e 75 6d 62 65 72 20  /* Final number 
382b0 6f 66 20 63 65 6c 6c 73 20 6f 6e 20 70 61 67 65  of cells on page
382c0 20 2a 2f 0a 20 20 43 65 6c 6c 41 72 72 61 79 20   */.  CellArray 
382d0 2a 70 43 41 72 72 61 79 20 20 20 20 20 20 20 20  *pCArray        
382e0 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f        /* Array o
382f0 66 20 63 65 6c 6c 73 20 61 6e 64 20 73 69 7a 65  f cells and size
38300 73 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a 20 63  s */.){.  u8 * c
38310 6f 6e 73 74 20 61 44 61 74 61 20 3d 20 70 50 67  onst aData = pPg
38320 2d 3e 61 44 61 74 61 3b 0a 20 20 63 6f 6e 73 74  ->aData;.  const
38330 20 69 6e 74 20 68 64 72 20 3d 20 70 50 67 2d 3e   int hdr = pPg->
38340 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 75 38 20  hdrOffset;.  u8 
38350 2a 70 42 65 67 69 6e 20 3d 20 26 70 50 67 2d 3e  *pBegin = &pPg->
38360 61 43 65 6c 6c 49 64 78 5b 6e 4e 65 77 20 2a 20  aCellIdx[nNew * 
38370 32 5d 3b 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 20  2];.  int nCell 
38380 3d 20 70 50 67 2d 3e 6e 43 65 6c 6c 3b 20 20 20  = pPg->nCell;   
38390 20 20 20 20 2f 2a 20 43 65 6c 6c 73 20 73 74 6f      /* Cells sto
383a0 72 65 64 20 6f 6e 20 70 50 67 20 2a 2f 0a 20 20  red on pPg */.  
383b0 75 38 20 2a 70 44 61 74 61 3b 0a 20 20 75 38 20  u8 *pData;.  u8 
383c0 2a 70 43 65 6c 6c 70 74 72 3b 0a 20 20 69 6e 74  *pCellptr;.  int
383d0 20 69 3b 0a 20 20 69 6e 74 20 69 4f 6c 64 45 6e   i;.  int iOldEn
383e0 64 20 3d 20 69 4f 6c 64 20 2b 20 70 50 67 2d 3e  d = iOld + pPg->
383f0 6e 43 65 6c 6c 20 2b 20 70 50 67 2d 3e 6e 4f 76  nCell + pPg->nOv
38400 65 72 66 6c 6f 77 3b 0a 20 20 69 6e 74 20 69 4e  erflow;.  int iN
38410 65 77 45 6e 64 20 3d 20 69 4e 65 77 20 2b 20 6e  ewEnd = iNew + n
38420 4e 65 77 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  New;..#ifdef SQL
38430 49 54 45 5f 44 45 42 55 47 0a 20 20 75 38 20 2a  ITE_DEBUG.  u8 *
38440 70 54 6d 70 20 3d 20 73