/ Hex Artifact Content
Login

Artifact 66bb78f5a2d38e27b933848e70a97483ebbbe796:


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 42 74 53 68 61 72 65 64 20   *p;.  BtShared 
41d0: 2a 70 42 74 20 3d 20 70 42 74 72 65 65 2d 3e 70  *pBt = pBtree->p
41e0: 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  Bt;.  assert( sq
41f0: 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d  lite3BtreeHoldsM
4200: 75 74 65 78 28 70 42 74 72 65 65 29 20 29 3b 0a  utex(pBtree) );.
4210: 20 20 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75    for(p=pBt->pCu
4220: 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e  rsor; p; p=p->pN
4230: 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 28 70  ext){.    if( (p
4240: 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43  ->curFlags & BTC
4250: 46 5f 49 6e 63 72 62 6c 6f 62 29 21 3d 30 0a 20  F_Incrblob)!=0. 
4260: 20 20 20 20 26 26 20 28 69 73 43 6c 65 61 72 54      && (isClearT
4270: 61 62 6c 65 20 7c 7c 20 70 2d 3e 69 6e 66 6f 2e  able || p->info.
4280: 6e 4b 65 79 3d 3d 69 52 6f 77 29 0a 20 20 20 20  nKey==iRow).    
4290: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 65 53 74 61  ){.      p->eSta
42a0: 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41  te = CURSOR_INVA
42b0: 4c 49 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  LID;.    }.  }.}
42c0: 0a 0a 23 65 6c 73 65 0a 20 20 2f 2a 20 53 74 75  ..#else.  /* Stu
42d0: 62 20 66 75 6e 63 74 69 6f 6e 20 77 68 65 6e 20  b function when 
42e0: 49 4e 43 52 42 4c 4f 42 20 69 73 20 6f 6d 69 74  INCRBLOB is omit
42f0: 74 65 64 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65  ted */.  #define
4300: 20 69 6e 76 61 6c 69 64 61 74 65 49 6e 63 72 62   invalidateIncrb
4310: 6c 6f 62 43 75 72 73 6f 72 73 28 78 2c 79 2c 7a  lobCursors(x,y,z
4320: 29 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ).#endif /* SQLI
4330: 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42  TE_OMIT_INCRBLOB
4340: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 62   */../*.** Set b
4350: 69 74 20 70 67 6e 6f 20 6f 66 20 74 68 65 20 42  it pgno of the B
4360: 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74  tShared.pHasCont
4370: 65 6e 74 20 62 69 74 76 65 63 2e 20 54 68 69 73  ent bitvec. This
4380: 20 69 73 20 63 61 6c 6c 65 64 20 0a 2a 2a 20 77   is called .** w
4390: 68 65 6e 20 61 20 70 61 67 65 20 74 68 61 74 20  hen a page that 
43a0: 70 72 65 76 69 6f 75 73 6c 79 20 63 6f 6e 74 61  previously conta
43b0: 69 6e 65 64 20 64 61 74 61 20 62 65 63 6f 6d 65  ined data become
43c0: 73 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65  s a free-list le
43d0: 61 66 20 0a 2a 2a 20 70 61 67 65 2e 0a 2a 2a 0a  af .** page..**.
43e0: 2a 2a 20 54 68 65 20 42 74 53 68 61 72 65 64 2e  ** The BtShared.
43f0: 70 48 61 73 43 6f 6e 74 65 6e 74 20 62 69 74 76  pHasContent bitv
4400: 65 63 20 65 78 69 73 74 73 20 74 6f 20 77 6f 72  ec exists to wor
4410: 6b 20 61 72 6f 75 6e 64 20 61 6e 20 6f 62 73 63  k around an obsc
4420: 75 72 65 0a 2a 2a 20 62 75 67 20 63 61 75 73 65  ure.** bug cause
4430: 64 20 62 79 20 74 68 65 20 69 6e 74 65 72 61 63  d by the interac
4440: 74 69 6f 6e 20 6f 66 20 74 77 6f 20 75 73 65 66  tion of two usef
4450: 75 6c 20 49 4f 20 6f 70 74 69 6d 69 7a 61 74 69  ul IO optimizati
4460: 6f 6e 73 20 73 75 72 72 6f 75 6e 64 69 6e 67 0a  ons surrounding.
4470: 2a 2a 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61  ** free-list lea
4480: 66 20 70 61 67 65 73 3a 0a 2a 2a 0a 2a 2a 20 20  f pages:.**.**  
4490: 20 31 29 20 57 68 65 6e 20 61 6c 6c 20 64 61 74   1) When all dat
44a0: 61 20 69 73 20 64 65 6c 65 74 65 64 20 66 72 6f  a is deleted fro
44b0: 6d 20 61 20 70 61 67 65 20 61 6e 64 20 74 68 65  m a page and the
44c0: 20 70 61 67 65 20 62 65 63 6f 6d 65 73 0a 2a 2a   page becomes.**
44d0: 20 20 20 20 20 20 61 20 66 72 65 65 2d 6c 69 73        a free-lis
44e0: 74 20 6c 65 61 66 20 70 61 67 65 2c 20 74 68 65  t leaf page, the
44f0: 20 70 61 67 65 20 69 73 20 6e 6f 74 20 77 72 69   page is not wri
4500: 74 74 65 6e 20 74 6f 20 74 68 65 20 64 61 74 61  tten to the data
4510: 62 61 73 65 0a 2a 2a 20 20 20 20 20 20 28 61 73  base.**      (as
4520: 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20   free-list leaf 
4530: 70 61 67 65 73 20 63 6f 6e 74 61 69 6e 20 6e 6f  pages contain no
4540: 20 6d 65 61 6e 69 6e 67 66 75 6c 20 64 61 74 61   meaningful data
4550: 29 2e 20 53 6f 6d 65 74 69 6d 65 73 0a 2a 2a 20  ). Sometimes.** 
4560: 20 20 20 20 20 73 75 63 68 20 61 20 70 61 67 65       such a page
4570: 20 69 73 20 6e 6f 74 20 65 76 65 6e 20 6a 6f 75   is not even jou
4580: 72 6e 61 6c 6c 65 64 20 28 61 73 20 69 74 20 77  rnalled (as it w
4590: 69 6c 6c 20 6e 6f 74 20 62 65 20 6d 6f 64 69 66  ill not be modif
45a0: 69 65 64 2c 0a 2a 2a 20 20 20 20 20 20 77 68 79  ied,.**      why
45b0: 20 62 6f 74 68 65 72 20 6a 6f 75 72 6e 61 6c 6c   bother journall
45c0: 69 6e 67 20 69 74 3f 29 2e 0a 2a 2a 0a 2a 2a 20  ing it?)..**.** 
45d0: 20 20 32 29 20 57 68 65 6e 20 61 20 66 72 65 65    2) When a free
45e0: 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65 20  -list leaf page 
45f0: 69 73 20 72 65 75 73 65 64 2c 20 69 74 73 20 63  is reused, its c
4600: 6f 6e 74 65 6e 74 20 69 73 20 6e 6f 74 20 72 65  ontent is not re
4610: 61 64 0a 2a 2a 20 20 20 20 20 20 66 72 6f 6d 20  ad.**      from 
4620: 74 68 65 20 64 61 74 61 62 61 73 65 20 6f 72 20  the database or 
4630: 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a  written to the j
4640: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 77 68 79  ournal file (why
4650: 20 73 68 6f 75 6c 64 20 69 74 0a 2a 2a 20 20 20   should it.**   
4660: 20 20 20 62 65 2c 20 69 66 20 69 74 20 69 73 20     be, if it is 
4670: 6e 6f 74 20 61 74 20 61 6c 6c 20 6d 65 61 6e 69  not at all meani
4680: 6e 67 66 75 6c 3f 29 2e 0a 2a 2a 0a 2a 2a 20 42  ngful?)..**.** B
4690: 79 20 74 68 65 6d 73 65 6c 76 65 73 2c 20 74 68  y themselves, th
46a0: 65 73 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  ese optimization
46b0: 73 20 77 6f 72 6b 20 66 69 6e 65 20 61 6e 64 20  s work fine and 
46c0: 70 72 6f 76 69 64 65 20 61 20 68 61 6e 64 79 0a  provide a handy.
46d0: 2a 2a 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 62  ** performance b
46e0: 6f 6f 73 74 20 74 6f 20 62 75 6c 6b 20 64 65 6c  oost to bulk del
46f0: 65 74 65 20 6f 72 20 69 6e 73 65 72 74 20 6f 70  ete or insert op
4700: 65 72 61 74 69 6f 6e 73 2e 20 48 6f 77 65 76 65  erations. Howeve
4710: 72 2c 20 69 66 0a 2a 2a 20 61 20 70 61 67 65 20  r, if.** a page 
4720: 69 73 20 6d 6f 76 65 64 20 74 6f 20 74 68 65 20  is moved to the 
4730: 66 72 65 65 2d 6c 69 73 74 20 61 6e 64 20 74 68  free-list and th
4740: 65 6e 20 72 65 75 73 65 64 20 77 69 74 68 69 6e  en reused within
4750: 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20 74 72 61   the same.** tra
4760: 6e 73 61 63 74 69 6f 6e 2c 20 61 20 70 72 6f 62  nsaction, a prob
4770: 6c 65 6d 20 63 6f 6d 65 73 20 75 70 2e 20 49 66  lem comes up. If
4780: 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
4790: 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 77 68 65 6e   journalled when
47a0: 0a 2a 2a 20 69 74 20 69 73 20 6d 6f 76 65 64 20  .** it is moved 
47b0: 74 6f 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  to the free-list
47c0: 20 61 6e 64 20 69 74 20 69 73 20 61 6c 73 6f 20   and it is also 
47d0: 6e 6f 74 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 77  not journalled w
47e0: 68 65 6e 20 69 74 0a 2a 2a 20 69 73 20 65 78 74  hen it.** is ext
47f0: 72 61 63 74 65 64 20 66 72 6f 6d 20 74 68 65 20  racted from the 
4800: 66 72 65 65 2d 6c 69 73 74 20 61 6e 64 20 72 65  free-list and re
4810: 75 73 65 64 2c 20 74 68 65 6e 20 74 68 65 20 6f  used, then the o
4820: 72 69 67 69 6e 61 6c 20 64 61 74 61 0a 2a 2a 20  riginal data.** 
4830: 6d 61 79 20 62 65 20 6c 6f 73 74 2e 20 49 6e 20  may be lost. In 
4840: 74 68 65 20 65 76 65 6e 74 20 6f 66 20 61 20 72  the event of a r
4850: 6f 6c 6c 62 61 63 6b 2c 20 69 74 20 6d 61 79 20  ollback, it may 
4860: 6e 6f 74 20 62 65 20 70 6f 73 73 69 62 6c 65 0a  not be possible.
4870: 2a 2a 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68  ** to restore th
4880: 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 69 74  e database to it
4890: 73 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 66 69  s original confi
48a0: 67 75 72 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  guration..**.** 
48b0: 54 68 65 20 73 6f 6c 75 74 69 6f 6e 20 69 73 20  The solution is 
48c0: 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 48 61  the BtShared.pHa
48d0: 73 43 6f 6e 74 65 6e 74 20 62 69 74 76 65 63 2e  sContent bitvec.
48e0: 20 57 68 65 6e 65 76 65 72 20 61 20 70 61 67 65   Whenever a page
48f0: 20 69 73 20 0a 2a 2a 20 6d 6f 76 65 64 20 74 6f   is .** moved to
4900: 20 62 65 63 6f 6d 65 20 61 20 66 72 65 65 2d 6c   become a free-l
4910: 69 73 74 20 6c 65 61 66 20 70 61 67 65 2c 20 74  ist leaf page, t
4920: 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
4930: 20 62 69 74 20 69 73 0a 2a 2a 20 73 65 74 20 69   bit is.** set i
4940: 6e 20 74 68 65 20 62 69 74 76 65 63 2e 20 57 68  n the bitvec. Wh
4950: 65 6e 65 76 65 72 20 61 20 6c 65 61 66 20 70 61  enever a leaf pa
4960: 67 65 20 69 73 20 65 78 74 72 61 63 74 65 64 20  ge is extracted 
4970: 66 72 6f 6d 20 74 68 65 20 66 72 65 65 2d 6c 69  from the free-li
4980: 73 74 2c 0a 2a 2a 20 6f 70 74 69 6d 69 7a 61 74  st,.** optimizat
4990: 69 6f 6e 20 32 20 61 62 6f 76 65 20 69 73 20 6f  ion 2 above is o
49a0: 6d 69 74 74 65 64 20 69 66 20 74 68 65 20 63 6f  mitted if the co
49b0: 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20  rresponding bit 
49c0: 69 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20 73 65  is already.** se
49d0: 74 20 69 6e 20 42 74 53 68 61 72 65 64 2e 70 48  t in BtShared.pH
49e0: 61 73 43 6f 6e 74 65 6e 74 2e 20 54 68 65 20 63  asContent. The c
49f0: 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 62  ontents of the b
4a00: 69 74 76 65 63 20 61 72 65 20 63 6c 65 61 72 65  itvec are cleare
4a10: 64 0a 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20  d.** at the end 
4a20: 6f 66 20 65 76 65 72 79 20 74 72 61 6e 73 61 63  of every transac
4a30: 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
4a40: 69 6e 74 20 62 74 72 65 65 53 65 74 48 61 73 43  int btreeSetHasC
4a50: 6f 6e 74 65 6e 74 28 42 74 53 68 61 72 65 64 20  ontent(BtShared 
4a60: 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29  *pBt, Pgno pgno)
4a70: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
4a80: 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 21 70  ITE_OK;.  if( !p
4a90: 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20  Bt->pHasContent 
4aa0: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
4ab0: 67 6e 6f 3c 3d 70 42 74 2d 3e 6e 50 61 67 65 20  gno<=pBt->nPage 
4ac0: 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70 48 61 73  );.    pBt->pHas
4ad0: 43 6f 6e 74 65 6e 74 20 3d 20 73 71 6c 69 74 65  Content = sqlite
4ae0: 33 42 69 74 76 65 63 43 72 65 61 74 65 28 70 42  3BitvecCreate(pB
4af0: 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20 69  t->nPage);.    i
4b00: 66 28 20 21 70 42 74 2d 3e 70 48 61 73 43 6f 6e  f( !pBt->pHasCon
4b10: 74 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 72 63  tent ){.      rc
4b20: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
4b30: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
4b40: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
4b50: 26 20 70 67 6e 6f 3c 3d 73 71 6c 69 74 65 33 42  & pgno<=sqlite3B
4b60: 69 74 76 65 63 53 69 7a 65 28 70 42 74 2d 3e 70  itvecSize(pBt->p
4b70: 48 61 73 43 6f 6e 74 65 6e 74 29 20 29 7b 0a 20  HasContent) ){. 
4b80: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
4b90: 69 74 76 65 63 53 65 74 28 70 42 74 2d 3e 70 48  itvecSet(pBt->pH
4ba0: 61 73 43 6f 6e 74 65 6e 74 2c 20 70 67 6e 6f 29  asContent, pgno)
4bb0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
4bc0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 51 75 65 72  c;.}../*.** Quer
4bd0: 79 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70  y the BtShared.p
4be0: 48 61 73 43 6f 6e 74 65 6e 74 20 76 65 63 74 6f  HasContent vecto
4bf0: 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  r..**.** This fu
4c00: 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
4c10: 20 77 68 65 6e 20 61 20 66 72 65 65 2d 6c 69 73   when a free-lis
4c20: 74 20 6c 65 61 66 20 70 61 67 65 20 69 73 20 72  t leaf page is r
4c30: 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 0a  emoved from the.
4c40: 2a 2a 20 66 72 65 65 2d 6c 69 73 74 20 66 6f 72  ** free-list for
4c50: 20 72 65 75 73 65 2e 20 49 74 20 72 65 74 75 72   reuse. It retur
4c60: 6e 73 20 66 61 6c 73 65 20 69 66 20 69 74 20 69  ns false if it i
4c70: 73 20 73 61 66 65 20 74 6f 20 72 65 74 72 69 65  s safe to retrie
4c80: 76 65 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 66  ve the.** page f
4c90: 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20 6c 61  rom the pager la
4ca0: 79 65 72 20 77 69 74 68 20 74 68 65 20 27 6e 6f  yer with the 'no
4cb0: 2d 63 6f 6e 74 65 6e 74 27 20 66 6c 61 67 20 73  -content' flag s
4cc0: 65 74 2e 20 54 72 75 65 20 6f 74 68 65 72 77 69  et. True otherwi
4cd0: 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  se..*/.static in
4ce0: 74 20 62 74 72 65 65 47 65 74 48 61 73 43 6f 6e  t btreeGetHasCon
4cf0: 74 65 6e 74 28 42 74 53 68 61 72 65 64 20 2a 70  tent(BtShared *p
4d00: 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a  Bt, Pgno pgno){.
4d10: 20 20 42 69 74 76 65 63 20 2a 70 20 3d 20 70 42    Bitvec *p = pB
4d20: 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 3b 0a  t->pHasContent;.
4d30: 20 20 72 65 74 75 72 6e 20 28 70 20 26 26 20 28    return (p && (
4d40: 70 67 6e 6f 3e 73 71 6c 69 74 65 33 42 69 74 76  pgno>sqlite3Bitv
4d50: 65 63 53 69 7a 65 28 70 29 20 7c 7c 20 73 71 6c  ecSize(p) || sql
4d60: 69 74 65 33 42 69 74 76 65 63 54 65 73 74 28 70  ite3BitvecTest(p
4d70: 2c 20 70 67 6e 6f 29 29 29 3b 0a 7d 0a 0a 2f 2a  , pgno)));.}../*
4d80: 0a 2a 2a 20 43 6c 65 61 72 20 28 64 65 73 74 72  .** Clear (destr
4d90: 6f 79 29 20 74 68 65 20 42 74 53 68 61 72 65 64  oy) the BtShared
4da0: 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 62 69 74  .pHasContent bit
4db0: 76 65 63 2e 20 54 68 69 73 20 73 68 6f 75 6c 64  vec. This should
4dc0: 20 62 65 0a 2a 2a 20 69 6e 76 6f 6b 65 64 20 61   be.** invoked a
4dd0: 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e  t the conclusion
4de0: 20 6f 66 20 65 61 63 68 20 77 72 69 74 65 2d 74   of each write-t
4df0: 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  ransaction..*/.s
4e00: 74 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65  tatic void btree
4e10: 43 6c 65 61 72 48 61 73 43 6f 6e 74 65 6e 74 28  ClearHasContent(
4e20: 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
4e30: 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44    sqlite3BitvecD
4e40: 65 73 74 72 6f 79 28 70 42 74 2d 3e 70 48 61 73  estroy(pBt->pHas
4e50: 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 70 42 74 2d  Content);.  pBt-
4e60: 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20 3d 20 30  >pHasContent = 0
4e70: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61  ;.}../*.** Relea
4e80: 73 65 20 61 6c 6c 20 6f 66 20 74 68 65 20 61 70  se all of the ap
4e90: 50 61 67 65 5b 5d 20 70 61 67 65 73 20 66 6f 72  Page[] pages for
4ea0: 20 61 20 63 75 72 73 6f 72 2e 0a 2a 2f 0a 73 74   a cursor..*/.st
4eb0: 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65 52  atic void btreeR
4ec0: 65 6c 65 61 73 65 41 6c 6c 43 75 72 73 6f 72 50  eleaseAllCursorP
4ed0: 61 67 65 73 28 42 74 43 75 72 73 6f 72 20 2a 70  ages(BtCursor *p
4ee0: 43 75 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  Cur){.  int i;. 
4ef0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 43 75   for(i=0; i<=pCu
4f00: 72 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a  r->iPage; i++){.
4f10: 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
4f20: 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d 29  pCur->apPage[i])
4f30: 3b 0a 20 20 20 20 70 43 75 72 2d 3e 61 70 50 61  ;.    pCur->apPa
4f40: 67 65 5b 69 5d 20 3d 20 30 3b 0a 20 20 7d 0a 20  ge[i] = 0;.  }. 
4f50: 20 70 43 75 72 2d 3e 69 50 61 67 65 20 3d 20 2d   pCur->iPage = -
4f60: 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 61 76  1;.}.../*.** Sav
4f70: 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 75  e the current cu
4f80: 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 20 69 6e  rsor position in
4f90: 20 74 68 65 20 76 61 72 69 61 62 6c 65 73 20 42   the variables B
4fa0: 74 43 75 72 73 6f 72 2e 6e 4b 65 79 20 0a 2a 2a  tCursor.nKey .**
4fb0: 20 61 6e 64 20 42 74 43 75 72 73 6f 72 2e 70 4b   and BtCursor.pK
4fc0: 65 79 2e 20 54 68 65 20 63 75 72 73 6f 72 27 73  ey. The cursor's
4fd0: 20 73 74 61 74 65 20 69 73 20 73 65 74 20 74 6f   state is set to
4fe0: 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53   CURSOR_REQUIRES
4ff0: 45 45 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  EEK..**.** The c
5000: 61 6c 6c 65 72 20 6d 75 73 74 20 65 6e 73 75 72  aller must ensur
5010: 65 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f  e that the curso
5020: 72 20 69 73 20 76 61 6c 69 64 20 28 68 61 73 20  r is valid (has 
5030: 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
5040: 41 4c 49 44 29 0a 2a 2a 20 70 72 69 6f 72 20 74  ALID).** prior t
5050: 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72  o calling this r
5060: 6f 75 74 69 6e 65 2e 20 20 0a 2a 2f 0a 73 74 61  outine.  .*/.sta
5070: 74 69 63 20 69 6e 74 20 73 61 76 65 43 75 72 73  tic int saveCurs
5080: 6f 72 50 6f 73 69 74 69 6f 6e 28 42 74 43 75 72  orPosition(BtCur
5090: 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e  sor *pCur){.  in
50a0: 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  t rc;..  assert(
50b0: 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3d 3d 70   CURSOR_VALID==p
50c0: 43 75 72 2d 3e 65 53 74 61 74 65 20 7c 7c 20 43  Cur->eState || C
50d0: 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54 3d 3d  URSOR_SKIPNEXT==
50e0: 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29 3b 0a  pCur->eState );.
50f0: 20 20 61 73 73 65 72 74 28 20 30 3d 3d 70 43 75    assert( 0==pCu
5100: 72 2d 3e 70 4b 65 79 20 29 3b 0a 20 20 61 73 73  r->pKey );.  ass
5110: 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
5120: 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 0a  Mutex(pCur) );..
5130: 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
5140: 74 65 3d 3d 43 55 52 53 4f 52 5f 53 4b 49 50 4e  te==CURSOR_SKIPN
5150: 45 58 54 20 29 7b 0a 20 20 20 20 70 43 75 72 2d  EXT ){.    pCur-
5160: 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
5170: 5f 56 41 4c 49 44 3b 0a 20 20 7d 65 6c 73 65 7b  _VALID;.  }else{
5180: 0a 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e  .    pCur->skipN
5190: 65 78 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  ext = 0;.  }.  r
51a0: 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
51b0: 4b 65 79 53 69 7a 65 28 70 43 75 72 2c 20 26 70  KeySize(pCur, &p
51c0: 43 75 72 2d 3e 6e 4b 65 79 29 3b 0a 20 20 61 73  Cur->nKey);.  as
51d0: 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
51e0: 5f 4f 4b 20 29 3b 20 20 2f 2a 20 4b 65 79 53 69  _OK );  /* KeySi
51f0: 7a 65 28 29 20 63 61 6e 6e 6f 74 20 66 61 69 6c  ze() cannot fail
5200: 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69   */..  /* If thi
5210: 73 20 69 73 20 61 6e 20 69 6e 74 4b 65 79 20 74  s is an intKey t
5220: 61 62 6c 65 2c 20 74 68 65 6e 20 74 68 65 20 61  able, then the a
5230: 62 6f 76 65 20 63 61 6c 6c 20 74 6f 20 42 74 72  bove call to Btr
5240: 65 65 4b 65 79 53 69 7a 65 28 29 0a 20 20 2a 2a  eeKeySize().  **
5250: 20 73 74 6f 72 65 73 20 74 68 65 20 69 6e 74 65   stores the inte
5260: 67 65 72 20 6b 65 79 20 69 6e 20 70 43 75 72 2d  ger key in pCur-
5270: 3e 6e 4b 65 79 2e 20 49 6e 20 74 68 69 73 20 63  >nKey. In this c
5280: 61 73 65 20 74 68 69 73 20 76 61 6c 75 65 20 69  ase this value i
5290: 73 0a 20 20 2a 2a 20 61 6c 6c 20 74 68 61 74 20  s.  ** all that 
52a0: 69 73 20 72 65 71 75 69 72 65 64 2e 20 4f 74 68  is required. Oth
52b0: 65 72 77 69 73 65 2c 20 69 66 20 70 43 75 72 20  erwise, if pCur 
52c0: 69 73 20 6e 6f 74 20 6f 70 65 6e 20 6f 6e 20 61  is not open on a
52d0: 6e 20 69 6e 74 4b 65 79 0a 20 20 2a 2a 20 74 61  n intKey.  ** ta
52e0: 62 6c 65 2c 20 74 68 65 6e 20 6d 61 6c 6c 6f 63  ble, then malloc
52f0: 20 73 70 61 63 65 20 66 6f 72 20 61 6e 64 20 73   space for and s
5300: 74 6f 72 65 20 74 68 65 20 70 43 75 72 2d 3e 6e  tore the pCur->n
5310: 4b 65 79 20 62 79 74 65 73 20 6f 66 20 6b 65 79  Key bytes of key
5320: 20 0a 20 20 2a 2a 20 64 61 74 61 2e 0a 20 20 2a   .  ** data..  *
5330: 2f 0a 20 20 69 66 28 20 30 3d 3d 70 43 75 72 2d  /.  if( 0==pCur-
5340: 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b  >apPage[0]->intK
5350: 65 79 20 29 7b 0a 20 20 20 20 76 6f 69 64 20 2a  ey ){.    void *
5360: 70 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 4d 61  pKey = sqlite3Ma
5370: 6c 6c 6f 63 28 20 70 43 75 72 2d 3e 6e 4b 65 79  lloc( pCur->nKey
5380: 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4b 65 79   );.    if( pKey
5390: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
53a0: 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 28 70  qlite3BtreeKey(p
53b0: 43 75 72 2c 20 30 2c 20 28 69 6e 74 29 70 43 75  Cur, 0, (int)pCu
53c0: 72 2d 3e 6e 4b 65 79 2c 20 70 4b 65 79 29 3b 0a  r->nKey, pKey);.
53d0: 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
53e0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
53f0: 20 20 20 70 43 75 72 2d 3e 70 4b 65 79 20 3d 20     pCur->pKey = 
5400: 70 4b 65 79 3b 0a 20 20 20 20 20 20 7d 65 6c 73  pKey;.      }els
5410: 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
5420: 65 33 5f 66 72 65 65 28 70 4b 65 79 29 3b 0a 20  e3_free(pKey);. 
5430: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
5440: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
5450: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ITE_NOMEM;.    }
5460: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 21  .  }.  assert( !
5470: 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d  pCur->apPage[0]-
5480: 3e 69 6e 74 4b 65 79 20 7c 7c 20 21 70 43 75 72  >intKey || !pCur
5490: 2d 3e 70 4b 65 79 20 29 3b 0a 0a 20 20 69 66 28  ->pKey );..  if(
54a0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
54b0: 7b 0a 20 20 20 20 62 74 72 65 65 52 65 6c 65 61  {.    btreeRelea
54c0: 73 65 41 6c 6c 43 75 72 73 6f 72 50 61 67 65 73  seAllCursorPages
54d0: 28 70 43 75 72 29 3b 0a 20 20 20 20 70 43 75 72  (pCur);.    pCur
54e0: 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
54f0: 52 5f 52 45 51 55 49 52 45 53 45 45 4b 3b 0a 20  R_REQUIRESEEK;. 
5500: 20 7d 0a 0a 20 20 69 6e 76 61 6c 69 64 61 74 65   }..  invalidate
5510: 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70 43  OverflowCache(pC
5520: 75 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ur);.  return rc
5530: 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20  ;.}../* Forward 
5540: 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73 74 61  reference */.sta
5550: 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 4e  tic int SQLITE_N
5560: 4f 49 4e 4c 49 4e 45 20 73 61 76 65 43 75 72 73  OINLINE saveCurs
5570: 6f 72 73 4f 6e 4c 69 73 74 28 42 74 43 75 72 73  orsOnList(BtCurs
5580: 6f 72 2a 2c 50 67 6e 6f 2c 42 74 43 75 72 73 6f  or*,Pgno,BtCurso
5590: 72 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 53 61 76 65  r*);../*.** Save
55a0: 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 73 20 6f   the positions o
55b0: 66 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 28 65  f all cursors (e
55c0: 78 63 65 70 74 20 70 45 78 63 65 70 74 29 20 74  xcept pExcept) t
55d0: 68 61 74 20 61 72 65 20 6f 70 65 6e 20 6f 6e 0a  hat are open on.
55e0: 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 77 69 74  ** the table wit
55f0: 68 20 72 6f 6f 74 2d 70 61 67 65 20 69 52 6f 6f  h root-page iRoo
5600: 74 2e 20 20 22 53 61 76 69 6e 67 20 74 68 65 20  t.  "Saving the 
5610: 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 22  cursor position"
5620: 20 6d 65 61 6e 73 20 74 68 61 74 0a 2a 2a 20 74   means that.** t
5630: 68 65 20 6c 6f 63 61 74 69 6f 6e 20 69 6e 20 74  he location in t
5640: 68 65 20 62 74 72 65 65 20 69 73 20 72 65 6d 65  he btree is reme
5650: 6d 62 65 72 65 64 20 69 6e 20 73 75 63 68 20 61  mbered in such a
5660: 20 77 61 79 20 74 68 61 74 20 69 74 20 63 61 6e   way that it can
5670: 20 62 65 0a 2a 2a 20 6d 6f 76 65 64 20 62 61 63   be.** moved bac
5680: 6b 20 74 6f 20 74 68 65 20 73 61 6d 65 20 73 70  k to the same sp
5690: 6f 74 20 61 66 74 65 72 20 74 68 65 20 62 74 72  ot after the btr
56a0: 65 65 20 68 61 73 20 62 65 65 6e 20 6d 6f 64 69  ee has been modi
56b0: 66 69 65 64 2e 20 20 54 68 69 73 0a 2a 2a 20 72  fied.  This.** r
56c0: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
56d0: 20 6a 75 73 74 20 62 65 66 6f 72 65 20 63 75 72   just before cur
56e0: 73 6f 72 20 70 45 78 63 65 70 74 20 69 73 20 75  sor pExcept is u
56f0: 73 65 64 20 74 6f 20 6d 6f 64 69 66 79 20 74 68  sed to modify th
5700: 65 0a 2a 2a 20 74 61 62 6c 65 2c 20 66 6f 72 20  e.** table, for 
5710: 65 78 61 6d 70 6c 65 20 69 6e 20 42 74 72 65 65  example in Btree
5720: 44 65 6c 65 74 65 28 29 20 6f 72 20 42 74 72 65  Delete() or Btre
5730: 65 49 6e 73 65 72 74 28 29 2e 0a 2a 2a 0a 2a 2a  eInsert()..**.**
5740: 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   Implementation 
5750: 6e 6f 74 65 3a 20 20 54 68 69 73 20 72 6f 75 74  note:  This rout
5760: 69 6e 65 20 6d 65 72 65 6c 79 20 63 68 65 63 6b  ine merely check
5770: 73 20 74 6f 20 73 65 65 20 69 66 20 61 6e 79 20  s to see if any 
5780: 63 75 72 73 6f 72 73 0a 2a 2a 20 6e 65 65 64 20  cursors.** need 
5790: 74 6f 20 62 65 20 73 61 76 65 64 2e 20 20 49 74  to be saved.  It
57a0: 20 63 61 6c 6c 73 20 6f 75 74 20 74 6f 20 73 61   calls out to sa
57b0: 76 65 43 75 72 73 6f 72 73 4f 6e 4c 69 73 74 28  veCursorsOnList(
57c0: 29 20 69 6e 20 74 68 65 20 28 75 6e 75 73 75 61  ) in the (unusua
57d0: 6c 29 0a 2a 2a 20 65 76 65 6e 74 20 74 68 61 74  l).** event that
57e0: 20 63 75 72 73 6f 72 73 20 61 72 65 20 69 6e 20   cursors are in 
57f0: 6e 65 65 64 20 74 6f 20 62 65 69 6e 67 20 73 61  need to being sa
5800: 76 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ved..*/.static i
5810: 6e 74 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72  nt saveAllCursor
5820: 73 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c  s(BtShared *pBt,
5830: 20 50 67 6e 6f 20 69 52 6f 6f 74 2c 20 42 74 43   Pgno iRoot, BtC
5840: 75 72 73 6f 72 20 2a 70 45 78 63 65 70 74 29 7b  ursor *pExcept){
5850: 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a  .  BtCursor *p;.
5860: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
5870: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
5880: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
5890: 73 65 72 74 28 20 70 45 78 63 65 70 74 3d 3d 30  sert( pExcept==0
58a0: 20 7c 7c 20 70 45 78 63 65 70 74 2d 3e 70 42 74   || pExcept->pBt
58b0: 3d 3d 70 42 74 20 29 3b 0a 20 20 66 6f 72 28 70  ==pBt );.  for(p
58c0: 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70  =pBt->pCursor; p
58d0: 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20  ; p=p->pNext){. 
58e0: 20 20 20 69 66 28 20 70 21 3d 70 45 78 63 65 70     if( p!=pExcep
58f0: 74 20 26 26 20 28 30 3d 3d 69 52 6f 6f 74 20 7c  t && (0==iRoot |
5900: 7c 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 69  | p->pgnoRoot==i
5910: 52 6f 6f 74 29 20 29 20 62 72 65 61 6b 3b 0a 20  Root) ) break;. 
5920: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 20 3f 20   }.  return p ? 
5930: 73 61 76 65 43 75 72 73 6f 72 73 4f 6e 4c 69 73  saveCursorsOnLis
5940: 74 28 70 2c 20 69 52 6f 6f 74 2c 20 70 45 78 63  t(p, iRoot, pExc
5950: 65 70 74 29 20 3a 20 53 51 4c 49 54 45 5f 4f 4b  ept) : SQLITE_OK
5960: 3b 0a 7d 0a 0a 2f 2a 20 54 68 69 73 20 68 65 6c  ;.}../* This hel
5970: 70 65 72 20 72 6f 75 74 69 6e 65 20 74 6f 20 73  per routine to s
5980: 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 20 64 6f  aveAllCursors do
5990: 65 73 20 74 68 65 20 61 63 74 75 61 6c 20 77 6f  es the actual wo
59a0: 72 6b 20 6f 66 20 73 61 76 69 6e 67 0a 2a 2a 20  rk of saving.** 
59b0: 74 68 65 20 63 75 72 73 6f 72 73 20 69 66 20 61  the cursors if a
59c0: 6e 64 20 77 68 65 6e 20 61 20 63 75 72 73 6f 72  nd when a cursor
59d0: 20 69 73 20 66 6f 75 6e 64 20 74 68 61 74 20 61   is found that a
59e0: 63 74 75 61 6c 6c 79 20 72 65 71 75 69 72 65 73  ctually requires
59f0: 20 73 61 76 69 6e 67 2e 0a 2a 2a 20 54 68 65 20   saving..** The 
5a00: 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 69 73 20 74  common case is t
5a10: 68 61 74 20 6e 6f 20 63 75 72 73 6f 72 73 20 6e  hat no cursors n
5a20: 65 65 64 20 74 6f 20 62 65 20 73 61 76 65 64 2c  eed to be saved,
5a30: 20 73 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65   so this routine
5a40: 20 69 73 0a 2a 2a 20 62 72 6f 6b 65 6e 20 6f 75   is.** broken ou
5a50: 74 20 66 72 6f 6d 20 69 74 73 20 63 61 6c 6c 65  t from its calle
5a60: 72 20 74 6f 20 61 76 6f 69 64 20 75 6e 6e 65 63  r to avoid unnec
5a70: 65 73 73 61 72 79 20 73 74 61 63 6b 20 70 6f 69  essary stack poi
5a80: 6e 74 65 72 20 6d 6f 76 65 6d 65 6e 74 2e 0a 2a  nter movement..*
5a90: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c  /.static int SQL
5aa0: 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 73 61 76  ITE_NOINLINE sav
5ab0: 65 43 75 72 73 6f 72 73 4f 6e 4c 69 73 74 28 0a  eCursorsOnList(.
5ac0: 20 20 42 74 43 75 72 73 6f 72 20 2a 70 2c 20 20    BtCursor *p,  
5ad0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 69         /* The fi
5ae0: 72 73 74 20 63 75 72 73 6f 72 20 74 68 61 74 20  rst cursor that 
5af0: 6e 65 65 64 73 20 73 61 76 69 6e 67 20 2a 2f 0a  needs saving */.
5b00: 20 20 50 67 6e 6f 20 69 52 6f 6f 74 2c 20 20 20    Pgno iRoot,   
5b10: 20 20 20 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 73         /* Only s
5b20: 61 76 65 20 63 75 72 73 6f 72 20 77 69 74 68 20  ave cursor with 
5b30: 74 68 69 73 20 69 52 6f 6f 74 2e 20 53 61 76 65  this iRoot. Save
5b40: 20 61 6c 6c 20 69 66 20 7a 65 72 6f 20 2a 2f 0a   all if zero */.
5b50: 20 20 42 74 43 75 72 73 6f 72 20 2a 70 45 78 63    BtCursor *pExc
5b60: 65 70 74 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74  ept    /* Do not
5b70: 20 73 61 76 65 20 74 68 69 73 20 63 75 72 73 6f   save this curso
5b80: 72 20 2a 2f 0a 29 7b 0a 20 20 64 6f 7b 0a 20 20  r */.){.  do{.  
5b90: 20 20 69 66 28 20 70 21 3d 70 45 78 63 65 70 74    if( p!=pExcept
5ba0: 20 26 26 20 28 30 3d 3d 69 52 6f 6f 74 20 7c 7c   && (0==iRoot ||
5bb0: 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 69 52   p->pgnoRoot==iR
5bc0: 6f 6f 74 29 20 29 7b 0a 20 20 20 20 20 20 69 66  oot) ){.      if
5bd0: 28 20 70 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  ( p->eState==CUR
5be0: 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70 2d 3e  SOR_VALID || p->
5bf0: 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 53  eState==CURSOR_S
5c00: 4b 49 50 4e 45 58 54 20 29 7b 0a 20 20 20 20 20  KIPNEXT ){.     
5c10: 20 20 20 69 6e 74 20 72 63 20 3d 20 73 61 76 65     int rc = save
5c20: 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70  CursorPosition(p
5c30: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 53  );.        if( S
5c40: 51 4c 49 54 45 5f 4f 4b 21 3d 72 63 20 29 7b 0a  QLITE_OK!=rc ){.
5c50: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
5c60: 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   rc;.        }. 
5c70: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
5c80: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 2d      testcase( p-
5c90: 3e 69 50 61 67 65 3e 30 20 29 3b 0a 20 20 20 20  >iPage>0 );.    
5ca0: 20 20 20 20 62 74 72 65 65 52 65 6c 65 61 73 65      btreeRelease
5cb0: 41 6c 6c 43 75 72 73 6f 72 50 61 67 65 73 28 70  AllCursorPages(p
5cc0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
5cd0: 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 4e 65 78  .    p = p->pNex
5ce0: 74 3b 0a 20 20 7d 77 68 69 6c 65 28 20 70 20 29  t;.  }while( p )
5cf0: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
5d00: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  E_OK;.}../*.** C
5d10: 6c 65 61 72 20 74 68 65 20 63 75 72 72 65 6e 74  lear the current
5d20: 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e   cursor position
5d30: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
5d40: 33 42 74 72 65 65 43 6c 65 61 72 43 75 72 73 6f  3BtreeClearCurso
5d50: 72 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  r(BtCursor *pCur
5d60: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ){.  assert( cur
5d70: 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
5d80: 75 72 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  ur) );.  sqlite3
5d90: 5f 66 72 65 65 28 70 43 75 72 2d 3e 70 4b 65 79  _free(pCur->pKey
5da0: 29 3b 0a 20 20 70 43 75 72 2d 3e 70 4b 65 79 20  );.  pCur->pKey 
5db0: 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 65 53 74  = 0;.  pCur->eSt
5dc0: 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56  ate = CURSOR_INV
5dd0: 41 4c 49 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  ALID;.}../*.** I
5de0: 6e 20 74 68 69 73 20 76 65 72 73 69 6f 6e 20 6f  n this version o
5df0: 66 20 42 74 72 65 65 4d 6f 76 65 74 6f 2c 20 70  f BtreeMoveto, p
5e00: 4b 65 79 20 69 73 20 61 20 70 61 63 6b 65 64 20  Key is a packed 
5e10: 69 6e 64 65 78 20 72 65 63 6f 72 64 0a 2a 2a 20  index record.** 
5e20: 73 75 63 68 20 61 73 20 69 73 20 67 65 6e 65 72  such as is gener
5e30: 61 74 65 64 20 62 79 20 74 68 65 20 4f 50 5f 4d  ated by the OP_M
5e40: 61 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f 64 65  akeRecord opcode
5e50: 2e 20 20 55 6e 70 61 63 6b 20 74 68 65 0a 2a 2a  .  Unpack the.**
5e60: 20 72 65 63 6f 72 64 20 61 6e 64 20 74 68 65 6e   record and then
5e70: 20 63 61 6c 6c 20 42 74 72 65 65 4d 6f 76 65 74   call BtreeMovet
5e80: 6f 55 6e 70 61 63 6b 65 64 28 29 20 74 6f 20 64  oUnpacked() to d
5e90: 6f 20 74 68 65 20 77 6f 72 6b 2e 0a 2a 2f 0a 73  o the work..*/.s
5ea0: 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 4d  tatic int btreeM
5eb0: 6f 76 65 74 6f 28 0a 20 20 42 74 43 75 72 73 6f  oveto(.  BtCurso
5ec0: 72 20 2a 70 43 75 72 2c 20 20 20 20 20 2f 2a 20  r *pCur,     /* 
5ed0: 43 75 72 73 6f 72 20 6f 70 65 6e 20 6f 6e 20 74  Cursor open on t
5ee0: 68 65 20 62 74 72 65 65 20 74 6f 20 62 65 20 73  he btree to be s
5ef0: 65 61 72 63 68 65 64 20 2a 2f 0a 20 20 63 6f 6e  earched */.  con
5f00: 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20 20  st void *pKey,  
5f10: 20 2f 2a 20 50 61 63 6b 65 64 20 6b 65 79 20 69   /* Packed key i
5f20: 66 20 74 68 65 20 62 74 72 65 65 20 69 73 20 61  f the btree is a
5f30: 6e 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 36 34  n index */.  i64
5f40: 20 6e 4b 65 79 2c 20 20 20 20 20 20 20 20 20 20   nKey,          
5f50: 20 2f 2a 20 49 6e 74 65 67 65 72 20 6b 65 79 20   /* Integer key 
5f60: 66 6f 72 20 74 61 62 6c 65 73 2e 20 20 53 69 7a  for tables.  Siz
5f70: 65 20 6f 66 20 70 4b 65 79 20 66 6f 72 20 69 6e  e of pKey for in
5f80: 64 69 63 65 73 20 2a 2f 0a 20 20 69 6e 74 20 62  dices */.  int b
5f90: 69 61 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f  ias,           /
5fa0: 2a 20 42 69 61 73 20 73 65 61 72 63 68 20 74 6f  * Bias search to
5fb0: 20 74 68 65 20 68 69 67 68 20 65 6e 64 20 2a 2f   the high end */
5fc0: 0a 20 20 69 6e 74 20 2a 70 52 65 73 20 20 20 20  .  int *pRes    
5fd0: 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
5fe0: 73 65 61 72 63 68 20 72 65 73 75 6c 74 73 20 68  search results h
5ff0: 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ere */.){.  int 
6000: 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
6010: 20 20 20 20 20 20 20 2f 2a 20 53 74 61 74 75 73         /* Status
6020: 20 63 6f 64 65 20 2a 2f 0a 20 20 55 6e 70 61 63   code */.  Unpac
6030: 6b 65 64 52 65 63 6f 72 64 20 2a 70 49 64 78 4b  kedRecord *pIdxK
6040: 65 79 3b 20 20 20 2f 2a 20 55 6e 70 61 63 6b 65  ey;   /* Unpacke
6050: 64 20 69 6e 64 65 78 20 6b 65 79 20 2a 2f 0a 20  d index key */. 
6060: 20 63 68 61 72 20 61 53 70 61 63 65 5b 32 30 30   char aSpace[200
6070: 5d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ];          /* T
6080: 65 6d 70 20 73 70 61 63 65 20 66 6f 72 20 70 49  emp space for pI
6090: 64 78 4b 65 79 20 2d 20 74 6f 20 61 76 6f 69 64  dxKey - to avoid
60a0: 20 61 20 6d 61 6c 6c 6f 63 20 2a 2f 0a 20 20 63   a malloc */.  c
60b0: 68 61 72 20 2a 70 46 72 65 65 20 3d 20 30 3b 0a  har *pFree = 0;.
60c0: 0a 20 20 69 66 28 20 70 4b 65 79 20 29 7b 0a 20  .  if( pKey ){. 
60d0: 20 20 20 61 73 73 65 72 74 28 20 6e 4b 65 79 3d     assert( nKey=
60e0: 3d 28 69 36 34 29 28 69 6e 74 29 6e 4b 65 79 20  =(i64)(int)nKey 
60f0: 29 3b 0a 20 20 20 20 70 49 64 78 4b 65 79 20 3d  );.    pIdxKey =
6100: 20 73 71 6c 69 74 65 33 56 64 62 65 41 6c 6c 6f   sqlite3VdbeAllo
6110: 63 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 28  cUnpackedRecord(
6120: 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 70  .        pCur->p
6130: 4b 65 79 49 6e 66 6f 2c 20 61 53 70 61 63 65 2c  KeyInfo, aSpace,
6140: 20 73 69 7a 65 6f 66 28 61 53 70 61 63 65 29 2c   sizeof(aSpace),
6150: 20 26 70 46 72 65 65 0a 20 20 20 20 29 3b 0a 20   &pFree.    );. 
6160: 20 20 20 69 66 28 20 70 49 64 78 4b 65 79 3d 3d     if( pIdxKey==
6170: 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
6180: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 73 71 6c  E_NOMEM;.    sql
6190: 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 55 6e  ite3VdbeRecordUn
61a0: 70 61 63 6b 28 70 43 75 72 2d 3e 70 4b 65 79 49  pack(pCur->pKeyI
61b0: 6e 66 6f 2c 20 28 69 6e 74 29 6e 4b 65 79 2c 20  nfo, (int)nKey, 
61c0: 70 4b 65 79 2c 20 70 49 64 78 4b 65 79 29 3b 0a  pKey, pIdxKey);.
61d0: 20 20 20 20 69 66 28 20 70 49 64 78 4b 65 79 2d      if( pIdxKey-
61e0: 3e 6e 46 69 65 6c 64 3d 3d 30 20 29 7b 0a 20 20  >nField==0 ){.  
61f0: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
6200: 65 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f  e(pCur->pKeyInfo
6210: 2d 3e 64 62 2c 20 70 46 72 65 65 29 3b 0a 20 20  ->db, pFree);.  
6220: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
6230: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
6240: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
6250: 20 20 20 70 49 64 78 4b 65 79 20 3d 20 30 3b 0a     pIdxKey = 0;.
6260: 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74    }.  rc = sqlit
6270: 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70  e3BtreeMovetoUnp
6280: 61 63 6b 65 64 28 70 43 75 72 2c 20 70 49 64 78  acked(pCur, pIdx
6290: 4b 65 79 2c 20 6e 4b 65 79 2c 20 62 69 61 73 2c  Key, nKey, bias,
62a0: 20 70 52 65 73 29 3b 0a 20 20 69 66 28 20 70 46   pRes);.  if( pF
62b0: 72 65 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ree ){.    sqlit
62c0: 65 33 44 62 46 72 65 65 28 70 43 75 72 2d 3e 70  e3DbFree(pCur->p
62d0: 4b 65 79 49 6e 66 6f 2d 3e 64 62 2c 20 70 46 72  KeyInfo->db, pFr
62e0: 65 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ee);.  }.  retur
62f0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
6300: 65 73 74 6f 72 65 20 74 68 65 20 63 75 72 73 6f  estore the curso
6310: 72 20 74 6f 20 74 68 65 20 70 6f 73 69 74 69 6f  r to the positio
6320: 6e 20 69 74 20 77 61 73 20 69 6e 20 28 6f 72 20  n it was in (or 
6330: 61 73 20 63 6c 6f 73 65 20 74 6f 20 61 73 20 70  as close to as p
6340: 6f 73 73 69 62 6c 65 29 0a 2a 2a 20 77 68 65 6e  ossible).** when
6350: 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74   saveCursorPosit
6360: 69 6f 6e 28 29 20 77 61 73 20 63 61 6c 6c 65 64  ion() was called
6370: 2e 20 4e 6f 74 65 20 74 68 61 74 20 74 68 69 73  . Note that this
6380: 20 63 61 6c 6c 20 64 65 6c 65 74 65 73 20 74 68   call deletes th
6390: 65 20 0a 2a 2a 20 73 61 76 65 64 20 70 6f 73 69  e .** saved posi
63a0: 74 69 6f 6e 20 69 6e 66 6f 20 73 74 6f 72 65 64  tion info stored
63b0: 20 62 79 20 73 61 76 65 43 75 72 73 6f 72 50 6f   by saveCursorPo
63c0: 73 69 74 69 6f 6e 28 29 2c 20 73 6f 20 74 68 65  sition(), so the
63d0: 72 65 20 63 61 6e 20 62 65 0a 2a 2a 20 61 74 20  re can be.** at 
63e0: 6d 6f 73 74 20 6f 6e 65 20 65 66 66 65 63 74 69  most one effecti
63f0: 76 65 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72  ve restoreCursor
6400: 50 6f 73 69 74 69 6f 6e 28 29 20 63 61 6c 6c 20  Position() call 
6410: 61 66 74 65 72 20 65 61 63 68 20 0a 2a 2a 20 73  after each .** s
6420: 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  aveCursorPositio
6430: 6e 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  n()..*/.static i
6440: 6e 74 20 62 74 72 65 65 52 65 73 74 6f 72 65 43  nt btreeRestoreC
6450: 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 42 74  ursorPosition(Bt
6460: 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
6470: 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 73   int rc;.  int s
6480: 6b 69 70 4e 65 78 74 3b 0a 20 20 61 73 73 65 72  kipNext;.  asser
6490: 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
64a0: 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61  tex(pCur) );.  a
64b0: 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
64c0: 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55  ate>=CURSOR_REQU
64d0: 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 69 66 28  IRESEEK );.  if(
64e0: 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
64f0: 55 52 53 4f 52 5f 46 41 55 4c 54 20 29 7b 0a 20  URSOR_FAULT ){. 
6500: 20 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e     return pCur->
6510: 73 6b 69 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20  skipNext;.  }.  
6520: 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
6530: 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20  URSOR_INVALID;. 
6540: 20 72 63 20 3d 20 62 74 72 65 65 4d 6f 76 65 74   rc = btreeMovet
6550: 6f 28 70 43 75 72 2c 20 70 43 75 72 2d 3e 70 4b  o(pCur, pCur->pK
6560: 65 79 2c 20 70 43 75 72 2d 3e 6e 4b 65 79 2c 20  ey, pCur->nKey, 
6570: 30 2c 20 26 73 6b 69 70 4e 65 78 74 29 3b 0a 20  0, &skipNext);. 
6580: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
6590: 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  OK ){.    sqlite
65a0: 33 5f 66 72 65 65 28 70 43 75 72 2d 3e 70 4b 65  3_free(pCur->pKe
65b0: 79 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 70 4b  y);.    pCur->pK
65c0: 65 79 20 3d 20 30 3b 0a 20 20 20 20 61 73 73 65  ey = 0;.    asse
65d0: 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
65e0: 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c  ==CURSOR_VALID |
65f0: 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  | pCur->eState==
6600: 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29  CURSOR_INVALID )
6610: 3b 0a 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70  ;.    pCur->skip
6620: 4e 65 78 74 20 7c 3d 20 73 6b 69 70 4e 65 78 74  Next |= skipNext
6630: 3b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e  ;.    if( pCur->
6640: 73 6b 69 70 4e 65 78 74 20 26 26 20 70 43 75 72  skipNext && pCur
6650: 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
6660: 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 20 20  _VALID ){.      
6670: 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
6680: 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54 3b 0a  URSOR_SKIPNEXT;.
6690: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
66a0: 72 6e 20 72 63 3b 0a 7d 0a 0a 23 64 65 66 69 6e  rn rc;.}..#defin
66b0: 65 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50  e restoreCursorP
66c0: 6f 73 69 74 69 6f 6e 28 70 29 20 5c 0a 20 20 28  osition(p) \.  (
66d0: 70 2d 3e 65 53 74 61 74 65 3e 3d 43 55 52 53 4f  p->eState>=CURSO
66e0: 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 3f 20  R_REQUIRESEEK ? 
66f0: 5c 0a 20 20 20 20 20 20 20 20 20 62 74 72 65 65  \.         btree
6700: 52 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73  RestoreCursorPos
6710: 69 74 69 6f 6e 28 70 29 20 3a 20 5c 0a 20 20 20  ition(p) : \.   
6720: 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 4b 29        SQLITE_OK)
6730: 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d 69 6e  ../*.** Determin
6740: 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  e whether or not
6750: 20 61 20 63 75 72 73 6f 72 20 68 61 73 20 6d 6f   a cursor has mo
6760: 76 65 64 20 66 72 6f 6d 20 74 68 65 20 70 6f 73  ved from the pos
6770: 69 74 69 6f 6e 20 77 68 65 72 65 0a 2a 2a 20 69  ition where.** i
6780: 74 20 77 61 73 20 6c 61 73 74 20 70 6c 61 63 65  t was last place
6790: 64 2c 20 6f 72 20 68 61 73 20 62 65 65 6e 20 69  d, or has been i
67a0: 6e 76 61 6c 69 64 61 74 65 64 20 66 6f 72 20 61  nvalidated for a
67b0: 6e 79 20 6f 74 68 65 72 20 72 65 61 73 6f 6e 2e  ny other reason.
67c0: 0a 2a 2a 20 43 75 72 73 6f 72 73 20 63 61 6e 20  .** Cursors can 
67d0: 6d 6f 76 65 20 77 68 65 6e 20 74 68 65 20 72 6f  move when the ro
67e0: 77 20 74 68 65 79 20 61 72 65 20 70 6f 69 6e 74  w they are point
67f0: 69 6e 67 20 61 74 20 69 73 20 64 65 6c 65 74 65  ing at is delete
6800: 64 20 6f 75 74 0a 2a 2a 20 66 72 6f 6d 20 75 6e  d out.** from un
6810: 64 65 72 20 74 68 65 6d 2c 20 66 6f 72 20 65 78  der them, for ex
6820: 61 6d 70 6c 65 2e 20 20 43 75 72 73 6f 72 20 6d  ample.  Cursor m
6830: 69 67 68 74 20 61 6c 73 6f 20 6d 6f 76 65 20 69  ight also move i
6840: 66 20 61 20 62 74 72 65 65 0a 2a 2a 20 69 73 20  f a btree.** is 
6850: 72 65 62 61 6c 61 6e 63 65 64 2e 0a 2a 2a 0a 2a  rebalanced..**.*
6860: 2a 20 43 61 6c 6c 69 6e 67 20 74 68 69 73 20 72  * Calling this r
6870: 6f 75 74 69 6e 65 20 77 69 74 68 20 61 20 4e 55  outine with a NU
6880: 4c 4c 20 63 75 72 73 6f 72 20 70 6f 69 6e 74 65  LL cursor pointe
6890: 72 20 72 65 74 75 72 6e 73 20 66 61 6c 73 65 2e  r returns false.
68a0: 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 65 20 73  .**.** Use the s
68b0: 65 70 61 72 61 74 65 20 73 71 6c 69 74 65 33 42  eparate sqlite3B
68c0: 74 72 65 65 43 75 72 73 6f 72 52 65 73 74 6f 72  treeCursorRestor
68d0: 65 28 29 20 72 6f 75 74 69 6e 65 20 74 6f 20 72  e() routine to r
68e0: 65 73 74 6f 72 65 20 61 20 63 75 72 73 6f 72 0a  estore a cursor.
68f0: 2a 2a 20 62 61 63 6b 20 74 6f 20 77 68 65 72 65  ** back to where
6900: 20 69 74 20 6f 75 67 68 74 20 74 6f 20 62 65 20   it ought to be 
6910: 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  if this routine 
6920: 72 65 74 75 72 6e 73 20 74 72 75 65 2e 0a 2a 2f  returns true..*/
6930: 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
6940: 65 43 75 72 73 6f 72 48 61 73 4d 6f 76 65 64 28  eCursorHasMoved(
6950: 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
6960: 0a 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e  .  return pCur->
6970: 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56  eState!=CURSOR_V
6980: 41 4c 49 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ALID;.}../*.** T
6990: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 73 74  his routine rest
69a0: 6f 72 65 73 20 61 20 63 75 72 73 6f 72 20 62 61  ores a cursor ba
69b0: 63 6b 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e  ck to its origin
69c0: 61 6c 20 70 6f 73 69 74 69 6f 6e 20 61 66 74 65  al position afte
69d0: 72 20 69 74 0a 2a 2a 20 68 61 73 20 62 65 65 6e  r it.** has been
69e0: 20 6d 6f 76 65 64 20 62 79 20 73 6f 6d 65 20 6f   moved by some o
69f0: 75 74 73 69 64 65 20 61 63 74 69 76 69 74 79 20  utside activity 
6a00: 28 73 75 63 68 20 61 73 20 61 20 62 74 72 65 65  (such as a btree
6a10: 20 72 65 62 61 6c 61 6e 63 65 20 6f 72 0a 2a 2a   rebalance or.**
6a20: 20 61 20 72 6f 77 20 68 61 76 69 6e 67 20 62 65   a row having be
6a30: 65 6e 20 64 65 6c 65 74 65 64 20 6f 75 74 20 66  en deleted out f
6a40: 72 6f 6d 20 75 6e 64 65 72 20 74 68 65 20 63 75  rom under the cu
6a50: 72 73 6f 72 29 2e 20 20 0a 2a 2a 0a 2a 2a 20 4f  rsor).  .**.** O
6a60: 6e 20 73 75 63 63 65 73 73 2c 20 74 68 65 20 2a  n success, the *
6a70: 70 44 69 66 66 65 72 65 6e 74 52 6f 77 20 70 61  pDifferentRow pa
6a80: 72 61 6d 65 74 65 72 20 69 73 20 66 61 6c 73 65  rameter is false
6a90: 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 69   if the cursor i
6aa0: 73 20 6c 65 66 74 0a 2a 2a 20 70 6f 69 6e 74 69  s left.** pointi
6ab0: 6e 67 20 61 74 20 65 78 61 63 74 6c 79 20 74 68  ng at exactly th
6ac0: 65 20 73 61 6d 65 20 72 6f 77 2e 20 20 2a 70 44  e same row.  *pD
6ad0: 69 66 66 65 72 6e 74 52 6f 77 20 69 73 20 74 68  ifferntRow is th
6ae0: 65 20 72 6f 77 20 74 68 65 20 63 75 72 73 6f 72  e row the cursor
6af0: 0a 2a 2a 20 77 61 73 20 70 6f 69 6e 74 69 6e 67  .** was pointing
6b00: 20 74 6f 20 68 61 73 20 62 65 65 6e 20 64 65 6c   to has been del
6b10: 65 74 65 64 2c 20 66 6f 72 63 69 6e 67 20 74 68  eted, forcing th
6b20: 65 20 63 75 72 73 6f 72 20 74 6f 20 70 6f 69 6e  e cursor to poin
6b30: 74 20 74 6f 20 73 6f 6d 65 0a 2a 2a 20 6e 65 61  t to some.** nea
6b40: 72 62 79 20 72 6f 77 2e 0a 2a 2a 0a 2a 2a 20 54  rby row..**.** T
6b50: 68 69 73 20 72 6f 75 74 69 6e 65 20 73 68 6f 75  his routine shou
6b60: 6c 64 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65  ld only be calle
6b70: 64 20 66 6f 72 20 61 20 63 75 72 73 6f 72 20 74  d for a cursor t
6b80: 68 61 74 20 6a 75 73 74 20 72 65 74 75 72 6e 65  hat just returne
6b90: 64 0a 2a 2a 20 54 52 55 45 20 66 72 6f 6d 20 73  d.** TRUE from s
6ba0: 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
6bb0: 72 48 61 73 4d 6f 76 65 64 28 29 2e 0a 2a 2f 0a  rHasMoved()..*/.
6bc0: 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
6bd0: 43 75 72 73 6f 72 52 65 73 74 6f 72 65 28 42 74  CursorRestore(Bt
6be0: 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e  Cursor *pCur, in
6bf0: 74 20 2a 70 44 69 66 66 65 72 65 6e 74 52 6f 77  t *pDifferentRow
6c00: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  ){.  int rc;..  
6c10: 61 73 73 65 72 74 28 20 70 43 75 72 21 3d 30 20  assert( pCur!=0 
6c20: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
6c30: 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f  r->eState!=CURSO
6c40: 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 72 63 20  R_VALID );.  rc 
6c50: 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50  = restoreCursorP
6c60: 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20  osition(pCur);. 
6c70: 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 2a   if( rc ){.    *
6c80: 70 44 69 66 66 65 72 65 6e 74 52 6f 77 20 3d 20  pDifferentRow = 
6c90: 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  1;.    return rc
6ca0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 75 72  ;.  }.  if( pCur
6cb0: 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52  ->eState!=CURSOR
6cc0: 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 2a 70  _VALID ){.    *p
6cd0: 44 69 66 66 65 72 65 6e 74 52 6f 77 20 3d 20 31  DifferentRow = 1
6ce0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
6cf0: 73 73 65 72 74 28 20 70 43 75 72 2d 3e 73 6b 69  ssert( pCur->ski
6d00: 70 4e 65 78 74 3d 3d 30 20 29 3b 0a 20 20 20 20  pNext==0 );.    
6d10: 2a 70 44 69 66 66 65 72 65 6e 74 52 6f 77 20 3d  *pDifferentRow =
6d20: 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
6d30: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23   SQLITE_OK;.}..#
6d40: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
6d50: 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a  IT_AUTOVACUUM./*
6d60: 0a 2a 2a 20 47 69 76 65 6e 20 61 20 70 61 67 65  .** Given a page
6d70: 20 6e 75 6d 62 65 72 20 6f 66 20 61 20 72 65 67   number of a reg
6d80: 75 6c 61 72 20 64 61 74 61 62 61 73 65 20 70 61  ular database pa
6d90: 67 65 2c 20 72 65 74 75 72 6e 20 74 68 65 20 70  ge, return the p
6da0: 61 67 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 66 6f  age.** number fo
6db0: 72 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61  r the pointer-ma
6dc0: 70 20 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74  p page that cont
6dd0: 61 69 6e 73 20 74 68 65 20 65 6e 74 72 79 20 66  ains the entry f
6de0: 6f 72 20 74 68 65 0a 2a 2a 20 69 6e 70 75 74 20  or the.** input 
6df0: 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 0a  page number..**.
6e00: 2a 2a 20 52 65 74 75 72 6e 20 30 20 28 6e 6f 74  ** Return 0 (not
6e10: 20 61 20 76 61 6c 69 64 20 70 61 67 65 29 20 66   a valid page) f
6e20: 6f 72 20 70 67 6e 6f 3d 3d 31 20 73 69 6e 63 65  or pgno==1 since
6e30: 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 6e 6f 20   there is.** no 
6e40: 70 6f 69 6e 74 65 72 20 6d 61 70 20 61 73 73 6f  pointer map asso
6e50: 63 69 61 74 65 64 20 77 69 74 68 20 70 61 67 65  ciated with page
6e60: 20 31 2e 20 20 54 68 65 20 69 6e 74 65 67 72 69   1.  The integri
6e70: 74 79 5f 63 68 65 63 6b 20 6c 6f 67 69 63 0a 2a  ty_check logic.*
6e80: 2a 20 72 65 71 75 69 72 65 73 20 74 68 61 74 20  * requires that 
6e90: 70 74 72 6d 61 70 50 61 67 65 6e 6f 28 2a 2c 31  ptrmapPageno(*,1
6ea0: 29 21 3d 31 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  )!=1..*/.static 
6eb0: 50 67 6e 6f 20 70 74 72 6d 61 70 50 61 67 65 6e  Pgno ptrmapPagen
6ec0: 6f 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c  o(BtShared *pBt,
6ed0: 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 69   Pgno pgno){.  i
6ee0: 6e 74 20 6e 50 61 67 65 73 50 65 72 4d 61 70 50  nt nPagesPerMapP
6ef0: 61 67 65 3b 0a 20 20 50 67 6e 6f 20 69 50 74 72  age;.  Pgno iPtr
6f00: 4d 61 70 2c 20 72 65 74 3b 0a 20 20 61 73 73 65  Map, ret;.  asse
6f10: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
6f20: 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
6f30: 78 29 20 29 3b 0a 20 20 69 66 28 20 70 67 6e 6f  x) );.  if( pgno
6f40: 3c 32 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  <2 ) return 0;. 
6f50: 20 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61 67   nPagesPerMapPag
6f60: 65 20 3d 20 28 70 42 74 2d 3e 75 73 61 62 6c 65  e = (pBt->usable
6f70: 53 69 7a 65 2f 35 29 2b 31 3b 0a 20 20 69 50 74  Size/5)+1;.  iPt
6f80: 72 4d 61 70 20 3d 20 28 70 67 6e 6f 2d 32 29 2f  rMap = (pgno-2)/
6f90: 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61 67 65  nPagesPerMapPage
6fa0: 3b 0a 20 20 72 65 74 20 3d 20 28 69 50 74 72 4d  ;.  ret = (iPtrM
6fb0: 61 70 2a 6e 50 61 67 65 73 50 65 72 4d 61 70 50  ap*nPagesPerMapP
6fc0: 61 67 65 29 20 2b 20 32 3b 20 0a 20 20 69 66 28  age) + 2; .  if(
6fd0: 20 72 65 74 3d 3d 50 45 4e 44 49 4e 47 5f 42 59   ret==PENDING_BY
6fe0: 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a  TE_PAGE(pBt) ){.
6ff0: 20 20 20 20 72 65 74 2b 2b 3b 0a 20 20 7d 0a 20      ret++;.  }. 
7000: 20 72 65 74 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a   return ret;.}..
7010: 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 6e 20 65  /*.** Write an e
7020: 6e 74 72 79 20 69 6e 74 6f 20 74 68 65 20 70 6f  ntry into the po
7030: 69 6e 74 65 72 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a  inter map..**.**
7040: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 75 70   This routine up
7050: 64 61 74 65 73 20 74 68 65 20 70 6f 69 6e 74 65  dates the pointe
7060: 72 20 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 20  r map entry for 
7070: 70 61 67 65 20 6e 75 6d 62 65 72 20 27 6b 65 79  page number 'key
7080: 27 0a 2a 2a 20 73 6f 20 74 68 61 74 20 69 74 20  '.** so that it 
7090: 6d 61 70 73 20 74 6f 20 74 79 70 65 20 27 65 54  maps to type 'eT
70a0: 79 70 65 27 20 61 6e 64 20 70 61 72 65 6e 74 20  ype' and parent 
70b0: 70 61 67 65 20 6e 75 6d 62 65 72 20 27 70 67 6e  page number 'pgn
70c0: 6f 27 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 2a 70 52  o'..**.** If *pR
70d0: 43 20 69 73 20 69 6e 69 74 69 61 6c 6c 79 20 6e  C is initially n
70e0: 6f 6e 2d 7a 65 72 6f 20 28 6e 6f 6e 2d 53 51 4c  on-zero (non-SQL
70f0: 49 54 45 5f 4f 4b 29 20 74 68 65 6e 20 74 68 69  ITE_OK) then thi
7100: 73 20 72 6f 75 74 69 6e 65 20 69 73 0a 2a 2a 20  s routine is.** 
7110: 61 20 6e 6f 2d 6f 70 2e 20 20 49 66 20 61 6e 20  a no-op.  If an 
7120: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68  error occurs, th
7130: 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 72  e appropriate er
7140: 72 6f 72 20 63 6f 64 65 20 69 73 20 77 72 69 74  ror code is writ
7150: 74 65 6e 0a 2a 2a 20 69 6e 74 6f 20 2a 70 52 43  ten.** into *pRC
7160: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
7170: 20 70 74 72 6d 61 70 50 75 74 28 42 74 53 68 61   ptrmapPut(BtSha
7180: 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6b  red *pBt, Pgno k
7190: 65 79 2c 20 75 38 20 65 54 79 70 65 2c 20 50 67  ey, u8 eType, Pg
71a0: 6e 6f 20 70 61 72 65 6e 74 2c 20 69 6e 74 20 2a  no parent, int *
71b0: 70 52 43 29 7b 0a 20 20 44 62 50 61 67 65 20 2a  pRC){.  DbPage *
71c0: 70 44 62 50 61 67 65 3b 20 20 2f 2a 20 54 68 65  pDbPage;  /* The
71d0: 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67   pointer map pag
71e0: 65 20 2a 2f 0a 20 20 75 38 20 2a 70 50 74 72 6d  e */.  u8 *pPtrm
71f0: 61 70 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ap;      /* The 
7200: 70 6f 69 6e 74 65 72 20 6d 61 70 20 64 61 74 61  pointer map data
7210: 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 50 74 72 6d   */.  Pgno iPtrm
7220: 61 70 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 70  ap;     /* The p
7230: 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20  ointer map page 
7240: 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 74 20  number */.  int 
7250: 6f 66 66 73 65 74 3b 20 20 20 20 20 20 20 2f 2a  offset;       /*
7260: 20 4f 66 66 73 65 74 20 69 6e 20 70 6f 69 6e 74   Offset in point
7270: 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20  er map page */. 
7280: 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
7290: 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
72a0: 65 20 66 72 6f 6d 20 73 75 62 66 75 6e 63 74 69  e from subfuncti
72b0: 6f 6e 73 20 2a 2f 0a 0a 20 20 69 66 28 20 2a 70  ons */..  if( *p
72c0: 52 43 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20  RC ) return;..  
72d0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
72e0: 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
72f0: 6d 75 74 65 78 29 20 29 3b 0a 20 20 2f 2a 20 54  mutex) );.  /* T
7300: 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61  he master-journa
7310: 6c 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6d 75  l page number mu
7320: 73 74 20 6e 65 76 65 72 20 62 65 20 75 73 65 64  st never be used
7330: 20 61 73 20 61 20 70 6f 69 6e 74 65 72 20 6d 61   as a pointer ma
7340: 70 20 70 61 67 65 20 2a 2f 0a 20 20 61 73 73 65  p page */.  asse
7350: 72 74 28 20 30 3d 3d 50 54 52 4d 41 50 5f 49 53  rt( 0==PTRMAP_IS
7360: 50 41 47 45 28 70 42 74 2c 20 50 45 4e 44 49 4e  PAGE(pBt, PENDIN
7370: 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
7380: 29 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ) );..  assert( 
7390: 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
73a0: 29 3b 0a 20 20 69 66 28 20 6b 65 79 3d 3d 30 20  );.  if( key==0 
73b0: 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 53 51  ){.    *pRC = SQ
73c0: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
73d0: 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  T;.    return;. 
73e0: 20 7d 0a 20 20 69 50 74 72 6d 61 70 20 3d 20 50   }.  iPtrmap = P
73f0: 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74  TRMAP_PAGENO(pBt
7400: 2c 20 6b 65 79 29 3b 0a 20 20 72 63 20 3d 20 73  , key);.  rc = s
7410: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70  qlite3PagerGet(p
7420: 42 74 2d 3e 70 50 61 67 65 72 2c 20 69 50 74 72  Bt->pPager, iPtr
7430: 6d 61 70 2c 20 26 70 44 62 50 61 67 65 29 3b 0a  map, &pDbPage);.
7440: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
7450: 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52 43 20  _OK ){.    *pRC 
7460: 3d 20 72 63 3b 0a 20 20 20 20 72 65 74 75 72 6e  = rc;.    return
7470: 3b 0a 20 20 7d 0a 20 20 6f 66 66 73 65 74 20 3d  ;.  }.  offset =
7480: 20 50 54 52 4d 41 50 5f 50 54 52 4f 46 46 53 45   PTRMAP_PTROFFSE
7490: 54 28 69 50 74 72 6d 61 70 2c 20 6b 65 79 29 3b  T(iPtrmap, key);
74a0: 0a 20 20 69 66 28 20 6f 66 66 73 65 74 3c 30 20  .  if( offset<0 
74b0: 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 53 51  ){.    *pRC = SQ
74c0: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
74d0: 54 3b 0a 20 20 20 20 67 6f 74 6f 20 70 74 72 6d  T;.    goto ptrm
74e0: 61 70 5f 65 78 69 74 3b 0a 20 20 7d 0a 20 20 61  ap_exit;.  }.  a
74f0: 73 73 65 72 74 28 20 6f 66 66 73 65 74 20 3c 3d  ssert( offset <=
7500: 20 28 69 6e 74 29 70 42 74 2d 3e 75 73 61 62 6c   (int)pBt->usabl
7510: 65 53 69 7a 65 2d 35 20 29 3b 0a 20 20 70 50 74  eSize-5 );.  pPt
7520: 72 6d 61 70 20 3d 20 28 75 38 20 2a 29 73 71 6c  rmap = (u8 *)sql
7530: 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
7540: 28 70 44 62 50 61 67 65 29 3b 0a 0a 20 20 69 66  (pDbPage);..  if
7550: 28 20 65 54 79 70 65 21 3d 70 50 74 72 6d 61 70  ( eType!=pPtrmap
7560: 5b 6f 66 66 73 65 74 5d 20 7c 7c 20 67 65 74 34  [offset] || get4
7570: 62 79 74 65 28 26 70 50 74 72 6d 61 70 5b 6f 66  byte(&pPtrmap[of
7580: 66 73 65 74 2b 31 5d 29 21 3d 70 61 72 65 6e 74  fset+1])!=parent
7590: 20 29 7b 0a 20 20 20 20 54 52 41 43 45 28 28 22   ){.    TRACE(("
75a0: 50 54 52 4d 41 50 5f 55 50 44 41 54 45 3a 20 25  PTRMAP_UPDATE: %
75b0: 64 2d 3e 28 25 64 2c 25 64 29 5c 6e 22 2c 20 6b  d->(%d,%d)\n", k
75c0: 65 79 2c 20 65 54 79 70 65 2c 20 70 61 72 65 6e  ey, eType, paren
75d0: 74 29 29 3b 0a 20 20 20 20 2a 70 52 43 3d 20 72  t));.    *pRC= r
75e0: 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
75f0: 57 72 69 74 65 28 70 44 62 50 61 67 65 29 3b 0a  Write(pDbPage);.
7600: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
7610: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70  TE_OK ){.      p
7620: 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d 20 3d  Ptrmap[offset] =
7630: 20 65 54 79 70 65 3b 0a 20 20 20 20 20 20 70 75   eType;.      pu
7640: 74 34 62 79 74 65 28 26 70 50 74 72 6d 61 70 5b  t4byte(&pPtrmap[
7650: 6f 66 66 73 65 74 2b 31 5d 2c 20 70 61 72 65 6e  offset+1], paren
7660: 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 70  t);.    }.  }..p
7670: 74 72 6d 61 70 5f 65 78 69 74 3a 0a 20 20 73 71  trmap_exit:.  sq
7680: 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
7690: 70 44 62 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a  pDbPage);.}../*.
76a0: 2a 2a 20 52 65 61 64 20 61 6e 20 65 6e 74 72 79  ** Read an entry
76b0: 20 66 72 6f 6d 20 74 68 65 20 70 6f 69 6e 74 65   from the pointe
76c0: 72 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  r map..**.** Thi
76d0: 73 20 72 6f 75 74 69 6e 65 20 72 65 74 72 69 65  s routine retrie
76e0: 76 65 73 20 74 68 65 20 70 6f 69 6e 74 65 72 20  ves the pointer 
76f0: 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 20 70 61  map entry for pa
7700: 67 65 20 27 6b 65 79 27 2c 20 77 72 69 74 69 6e  ge 'key', writin
7710: 67 0a 2a 2a 20 74 68 65 20 74 79 70 65 20 61 6e  g.** the type an
7720: 64 20 70 61 72 65 6e 74 20 70 61 67 65 20 6e 75  d parent page nu
7730: 6d 62 65 72 20 74 6f 20 2a 70 45 54 79 70 65 20  mber to *pEType 
7740: 61 6e 64 20 2a 70 50 67 6e 6f 20 72 65 73 70 65  and *pPgno respe
7750: 63 74 69 76 65 6c 79 2e 0a 2a 2a 20 41 6e 20 65  ctively..** An e
7760: 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
7770: 75 72 6e 65 64 20 69 66 20 73 6f 6d 65 74 68 69  urned if somethi
7780: 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2c 20 6f  ng goes wrong, o
7790: 74 68 65 72 77 69 73 65 20 53 51 4c 49 54 45 5f  therwise SQLITE_
77a0: 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  OK..*/.static in
77b0: 74 20 70 74 72 6d 61 70 47 65 74 28 42 74 53 68  t ptrmapGet(BtSh
77c0: 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20  ared *pBt, Pgno 
77d0: 6b 65 79 2c 20 75 38 20 2a 70 45 54 79 70 65 2c  key, u8 *pEType,
77e0: 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 29 7b 0a 20   Pgno *pPgno){. 
77f0: 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65   DbPage *pDbPage
7800: 3b 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74  ;   /* The point
7810: 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20  er map page */. 
7820: 20 69 6e 74 20 69 50 74 72 6d 61 70 3b 20 20 20   int iPtrmap;   
7830: 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d      /* Pointer m
7840: 61 70 20 70 61 67 65 20 69 6e 64 65 78 20 2a 2f  ap page index */
7850: 0a 20 20 75 38 20 2a 70 50 74 72 6d 61 70 3b 20  .  u8 *pPtrmap; 
7860: 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
7870: 20 6d 61 70 20 70 61 67 65 20 64 61 74 61 20 2a   map page data *
7880: 2f 0a 20 20 69 6e 74 20 6f 66 66 73 65 74 3b 20  /.  int offset; 
7890: 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
78a0: 20 6f 66 20 65 6e 74 72 79 20 69 6e 20 70 6f 69   of entry in poi
78b0: 6e 74 65 72 20 6d 61 70 20 2a 2f 0a 20 20 69 6e  nter map */.  in
78c0: 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  t rc;..  assert(
78d0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
78e0: 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
78f0: 29 3b 0a 0a 20 20 69 50 74 72 6d 61 70 20 3d 20  );..  iPtrmap = 
7900: 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42  PTRMAP_PAGENO(pB
7910: 74 2c 20 6b 65 79 29 3b 0a 20 20 72 63 20 3d 20  t, key);.  rc = 
7920: 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
7930: 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 69 50 74  pBt->pPager, iPt
7940: 72 6d 61 70 2c 20 26 70 44 62 50 61 67 65 29 3b  rmap, &pDbPage);
7950: 0a 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a  .  if( rc!=0 ){.
7960: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
7970: 20 7d 0a 20 20 70 50 74 72 6d 61 70 20 3d 20 28   }.  pPtrmap = (
7980: 75 38 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65  u8 *)sqlite3Page
7990: 72 47 65 74 44 61 74 61 28 70 44 62 50 61 67 65  rGetData(pDbPage
79a0: 29 3b 0a 0a 20 20 6f 66 66 73 65 74 20 3d 20 50  );..  offset = P
79b0: 54 52 4d 41 50 5f 50 54 52 4f 46 46 53 45 54 28  TRMAP_PTROFFSET(
79c0: 69 50 74 72 6d 61 70 2c 20 6b 65 79 29 3b 0a 20  iPtrmap, key);. 
79d0: 20 69 66 28 20 6f 66 66 73 65 74 3c 30 20 29 7b   if( offset<0 ){
79e0: 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
79f0: 72 55 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b  rUnref(pDbPage);
7a00: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
7a10: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
7a20: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6f  .  }.  assert( o
7a30: 66 66 73 65 74 20 3c 3d 20 28 69 6e 74 29 70 42  ffset <= (int)pB
7a40: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 35 20  t->usableSize-5 
7a50: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 54  );.  assert( pET
7a60: 79 70 65 21 3d 30 20 29 3b 0a 20 20 2a 70 45 54  ype!=0 );.  *pET
7a70: 79 70 65 20 3d 20 70 50 74 72 6d 61 70 5b 6f 66  ype = pPtrmap[of
7a80: 66 73 65 74 5d 3b 0a 20 20 69 66 28 20 70 50 67  fset];.  if( pPg
7a90: 6e 6f 20 29 20 2a 70 50 67 6e 6f 20 3d 20 67 65  no ) *pPgno = ge
7aa0: 74 34 62 79 74 65 28 26 70 50 74 72 6d 61 70 5b  t4byte(&pPtrmap[
7ab0: 6f 66 66 73 65 74 2b 31 5d 29 3b 0a 0a 20 20 73  offset+1]);..  s
7ac0: 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
7ad0: 28 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28  (pDbPage);.  if(
7ae0: 20 2a 70 45 54 79 70 65 3c 31 20 7c 7c 20 2a 70   *pEType<1 || *p
7af0: 45 54 79 70 65 3e 35 20 29 20 72 65 74 75 72 6e  EType>5 ) return
7b00: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
7b10: 42 4b 50 54 3b 0a 20 20 72 65 74 75 72 6e 20 53  BKPT;.  return S
7b20: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6c  QLITE_OK;.}..#el
7b30: 73 65 20 2f 2a 20 69 66 20 64 65 66 69 6e 65 64  se /* if defined
7b40: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
7b50: 4f 56 41 43 55 55 4d 20 2a 2f 0a 20 20 23 64 65  OVACUUM */.  #de
7b60: 66 69 6e 65 20 70 74 72 6d 61 70 50 75 74 28 77  fine ptrmapPut(w
7b70: 2c 78 2c 79 2c 7a 2c 72 63 29 0a 20 20 23 64 65  ,x,y,z,rc).  #de
7b80: 66 69 6e 65 20 70 74 72 6d 61 70 47 65 74 28 77  fine ptrmapGet(w
7b90: 2c 78 2c 79 2c 7a 29 20 53 51 4c 49 54 45 5f 4f  ,x,y,z) SQLITE_O
7ba0: 4b 0a 20 20 23 64 65 66 69 6e 65 20 70 74 72 6d  K.  #define ptrm
7bb0: 61 70 50 75 74 4f 76 66 6c 50 74 72 28 78 2c 20  apPutOvflPtr(x, 
7bc0: 79 2c 20 72 63 29 0a 23 65 6e 64 69 66 0a 0a 2f  y, rc).#endif../
7bd0: 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 62 74 72  *.** Given a btr
7be0: 65 65 20 70 61 67 65 20 61 6e 64 20 61 20 63 65  ee page and a ce
7bf0: 6c 6c 20 69 6e 64 65 78 20 28 30 20 6d 65 61 6e  ll index (0 mean
7c00: 73 20 74 68 65 20 66 69 72 73 74 20 63 65 6c 6c  s the first cell
7c10: 20 6f 6e 0a 2a 2a 20 74 68 65 20 70 61 67 65 2c   on.** the page,
7c20: 20 31 20 6d 65 61 6e 73 20 74 68 65 20 73 65 63   1 means the sec
7c30: 6f 6e 64 20 63 65 6c 6c 2c 20 61 6e 64 20 73 6f  ond cell, and so
7c40: 20 66 6f 72 74 68 29 20 72 65 74 75 72 6e 20 61   forth) return a
7c50: 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74   pointer.** to t
7c60: 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 2e  he cell content.
7c70: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
7c80: 69 6e 65 20 77 6f 72 6b 73 20 6f 6e 6c 79 20 66  ine works only f
7c90: 6f 72 20 70 61 67 65 73 20 74 68 61 74 20 64 6f  or pages that do
7ca0: 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 6f 76 65   not contain ove
7cb0: 72 66 6c 6f 77 20 63 65 6c 6c 73 2e 0a 2a 2f 0a  rflow cells..*/.
7cc0: 23 64 65 66 69 6e 65 20 66 69 6e 64 43 65 6c 6c  #define findCell
7cd0: 28 50 2c 49 29 20 5c 0a 20 20 28 28 50 29 2d 3e  (P,I) \.  ((P)->
7ce0: 61 44 61 74 61 20 2b 20 28 28 50 29 2d 3e 6d 61  aData + ((P)->ma
7cf0: 73 6b 50 61 67 65 20 26 20 67 65 74 32 62 79 74  skPage & get2byt
7d00: 65 28 26 28 50 29 2d 3e 61 43 65 6c 6c 49 64 78  e(&(P)->aCellIdx
7d10: 5b 32 2a 28 49 29 5d 29 29 29 0a 23 64 65 66 69  [2*(I)]))).#defi
7d20: 6e 65 20 66 69 6e 64 43 65 6c 6c 76 32 28 44 2c  ne findCellv2(D,
7d30: 4d 2c 4f 2c 49 29 20 28 44 2b 28 4d 26 67 65 74  M,O,I) (D+(M&get
7d40: 32 62 79 74 65 28 44 2b 28 4f 2b 32 2a 28 49 29  2byte(D+(O+2*(I)
7d50: 29 29 29 29 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  )))).../*.** Thi
7d60: 73 20 61 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78  s a more complex
7d70: 20 76 65 72 73 69 6f 6e 20 6f 66 20 66 69 6e 64   version of find
7d80: 43 65 6c 6c 28 29 20 74 68 61 74 20 77 6f 72 6b  Cell() that work
7d90: 73 20 66 6f 72 0a 2a 2a 20 70 61 67 65 73 20 74  s for.** pages t
7da0: 68 61 74 20 64 6f 20 63 6f 6e 74 61 69 6e 20 6f  hat do contain o
7db0: 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73 2e 0a 2a  verflow cells..*
7dc0: 2f 0a 73 74 61 74 69 63 20 75 38 20 2a 66 69 6e  /.static u8 *fin
7dd0: 64 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28 4d 65  dOverflowCell(Me
7de0: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e  mPage *pPage, in
7df0: 74 20 69 43 65 6c 6c 29 7b 0a 20 20 69 6e 74 20  t iCell){.  int 
7e00: 69 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  i;.  assert( sql
7e10: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
7e20: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
7e30: 78 29 20 29 3b 0a 20 20 66 6f 72 28 69 3d 70 50  x) );.  for(i=pP
7e40: 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2d 31  age->nOverflow-1
7e50: 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20  ; i>=0; i--){.  
7e60: 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20 6b 20 3d    int k;.    k =
7e70: 20 70 50 61 67 65 2d 3e 61 69 4f 76 66 6c 5b 69   pPage->aiOvfl[i
7e80: 5d 3b 0a 20 20 20 20 69 66 28 20 6b 3c 3d 69 43  ];.    if( k<=iC
7e90: 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ell ){.      if(
7ea0: 20 6b 3d 3d 69 43 65 6c 6c 20 29 7b 0a 20 20 20   k==iCell ){.   
7eb0: 20 20 20 20 20 72 65 74 75 72 6e 20 70 50 61 67       return pPag
7ec0: 65 2d 3e 61 70 4f 76 66 6c 5b 69 5d 3b 0a 20 20  e->apOvfl[i];.  
7ed0: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 43 65 6c      }.      iCel
7ee0: 6c 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  l--;.    }.  }. 
7ef0: 20 72 65 74 75 72 6e 20 66 69 6e 64 43 65 6c 6c   return findCell
7f00: 28 70 50 61 67 65 2c 20 69 43 65 6c 6c 29 3b 0a  (pPage, iCell);.
7f10: 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 73 65 20 61  }../*.** Parse a
7f20: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 62 6c   cell content bl
7f30: 6f 63 6b 20 61 6e 64 20 66 69 6c 6c 20 69 6e 20  ock and fill in 
7f40: 74 68 65 20 43 65 6c 6c 49 6e 66 6f 20 73 74 72  the CellInfo str
7f50: 75 63 74 75 72 65 2e 20 20 54 68 65 72 65 0a 2a  ucture.  There.*
7f60: 2a 20 61 72 65 20 74 77 6f 20 76 65 72 73 69 6f  * are two versio
7f70: 6e 73 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74  ns of this funct
7f80: 69 6f 6e 2e 20 20 62 74 72 65 65 50 61 72 73 65  ion.  btreeParse
7f90: 43 65 6c 6c 28 29 20 74 61 6b 65 73 20 61 20 0a  Cell() takes a .
7fa0: 2a 2a 20 63 65 6c 6c 20 69 6e 64 65 78 20 61 73  ** cell index as
7fb0: 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
7fc0: 6d 65 6e 74 20 61 6e 64 20 62 74 72 65 65 50 61  ment and btreePa
7fd0: 72 73 65 43 65 6c 6c 50 74 72 28 29 20 0a 2a 2a  rseCellPtr() .**
7fe0: 20 74 61 6b 65 73 20 61 20 70 6f 69 6e 74 65 72   takes a pointer
7ff0: 20 74 6f 20 74 68 65 20 62 6f 64 79 20 6f 66 20   to the body of 
8000: 74 68 65 20 63 65 6c 6c 20 61 73 20 69 74 73 20  the cell as its 
8010: 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e  second argument.
8020: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
8030: 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  btreeParseCellPt
8040: 72 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  r(.  MemPage *pP
8050: 61 67 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  age,         /* 
8060: 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  Page containing 
8070: 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 38  the cell */.  u8
8080: 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20   *pCell,        
8090: 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
80a0: 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 74 65 78   to the cell tex
80b0: 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f  t. */.  CellInfo
80c0: 20 2a 70 49 6e 66 6f 20 20 20 20 20 20 20 20 20   *pInfo         
80d0: 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69 73 20  /* Fill in this 
80e0: 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a  structure */.){.
80f0: 20 20 75 38 20 2a 70 49 74 65 72 3b 20 20 20 20    u8 *pIter;    
8100: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72            /* For
8110: 20 73 63 61 6e 6e 69 6e 67 20 74 68 72 6f 75 67   scanning throug
8120: 68 20 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 33 32  h pCell */.  u32
8130: 20 6e 50 61 79 6c 6f 61 64 3b 20 20 20 20 20 20   nPayload;      
8140: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
8150: 66 20 62 79 74 65 73 20 6f 66 20 63 65 6c 6c 20  f bytes of cell 
8160: 70 61 79 6c 6f 61 64 20 2a 2f 0a 0a 20 20 61 73  payload */..  as
8170: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
8180: 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
8190: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
81a0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
81b0: 6c 65 61 66 3d 3d 30 20 7c 7c 20 70 50 61 67 65  leaf==0 || pPage
81c0: 2d 3e 6c 65 61 66 3d 3d 31 20 29 3b 0a 20 20 69  ->leaf==1 );.  i
81d0: 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  f( pPage->intKey
81e0: 4c 65 61 66 20 29 7b 0a 20 20 20 20 61 73 73 65  Leaf ){.    asse
81f0: 72 74 28 20 70 50 61 67 65 2d 3e 63 68 69 6c 64  rt( pPage->child
8200: 50 74 72 53 69 7a 65 3d 3d 30 20 29 3b 0a 20 20  PtrSize==0 );.  
8210: 20 20 70 49 74 65 72 20 3d 20 70 43 65 6c 6c 20    pIter = pCell 
8220: 2b 20 67 65 74 56 61 72 69 6e 74 33 32 28 70 43  + getVarint32(pC
8230: 65 6c 6c 2c 20 6e 50 61 79 6c 6f 61 64 29 3b 0a  ell, nPayload);.
8240: 20 20 20 20 70 49 74 65 72 20 2b 3d 20 67 65 74      pIter += get
8250: 56 61 72 69 6e 74 28 70 49 74 65 72 2c 20 28 75  Varint(pIter, (u
8260: 36 34 2a 29 26 70 49 6e 66 6f 2d 3e 6e 4b 65 79  64*)&pInfo->nKey
8270: 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  );.  }else if( p
8280: 50 61 67 65 2d 3e 6e 6f 50 61 79 6c 6f 61 64 20  Page->noPayload 
8290: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
82a0: 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69  Page->childPtrSi
82b0: 7a 65 3d 3d 34 20 29 3b 0a 20 20 20 20 70 49 6e  ze==4 );.    pIn
82c0: 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 34 20 2b 20  fo->nSize = 4 + 
82d0: 67 65 74 56 61 72 69 6e 74 28 26 70 43 65 6c 6c  getVarint(&pCell
82e0: 5b 34 5d 2c 20 28 75 36 34 2a 29 26 70 49 6e 66  [4], (u64*)&pInf
82f0: 6f 2d 3e 6e 4b 65 79 29 3b 0a 20 20 20 20 70 49  o->nKey);.    pI
8300: 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20 3d 20  nfo->nPayload = 
8310: 30 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c  0;.    pInfo->nL
8320: 6f 63 61 6c 20 3d 20 30 3b 0a 20 20 20 20 70 49  ocal = 0;.    pI
8330: 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77 20 3d  nfo->iOverflow =
8340: 20 30 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 70   0;.    pInfo->p
8350: 50 61 79 6c 6f 61 64 20 3d 20 30 3b 0a 20 20 20  Payload = 0;.   
8360: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 65 6c 73 65   return;.  }else
8370: 7b 0a 20 20 20 20 70 49 74 65 72 20 3d 20 70 43  {.    pIter = pC
8380: 65 6c 6c 20 2b 20 70 50 61 67 65 2d 3e 63 68 69  ell + pPage->chi
8390: 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20 20 20 70  ldPtrSize;.    p
83a0: 49 74 65 72 20 2b 3d 20 67 65 74 56 61 72 69 6e  Iter += getVarin
83b0: 74 33 32 28 70 49 74 65 72 2c 20 6e 50 61 79 6c  t32(pIter, nPayl
83c0: 6f 61 64 29 3b 0a 20 20 20 20 70 49 6e 66 6f 2d  oad);.    pInfo-
83d0: 3e 6e 4b 65 79 20 3d 20 6e 50 61 79 6c 6f 61 64  >nKey = nPayload
83e0: 3b 0a 20 20 7d 0a 20 20 70 49 6e 66 6f 2d 3e 6e  ;.  }.  pInfo->n
83f0: 50 61 79 6c 6f 61 64 20 3d 20 6e 50 61 79 6c 6f  Payload = nPaylo
8400: 61 64 3b 0a 20 20 70 49 6e 66 6f 2d 3e 70 50 61  ad;.  pInfo->pPa
8410: 79 6c 6f 61 64 20 3d 20 70 49 74 65 72 3b 0a 20  yload = pIter;. 
8420: 20 74 65 73 74 63 61 73 65 28 20 6e 50 61 79 6c   testcase( nPayl
8430: 6f 61 64 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c  oad==pPage->maxL
8440: 6f 63 61 6c 20 29 3b 0a 20 20 74 65 73 74 63 61  ocal );.  testca
8450: 73 65 28 20 6e 50 61 79 6c 6f 61 64 3d 3d 70 50  se( nPayload==pP
8460: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20  age->maxLocal+1 
8470: 29 3b 0a 20 20 69 66 28 20 6e 50 61 79 6c 6f 61  );.  if( nPayloa
8480: 64 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  d<=pPage->maxLoc
8490: 61 6c 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69  al ){.    /* Thi
84a0: 73 20 69 73 20 74 68 65 20 28 65 61 73 79 29 20  s is the (easy) 
84b0: 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 72  common case wher
84c0: 65 20 74 68 65 20 65 6e 74 69 72 65 20 70 61 79  e the entire pay
84d0: 6c 6f 61 64 20 66 69 74 73 0a 20 20 20 20 2a 2a  load fits.    **
84e0: 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70 61   on the local pa
84f0: 67 65 2e 20 20 4e 6f 20 6f 76 65 72 66 6c 6f 77  ge.  No overflow
8500: 20 69 73 20 72 65 71 75 69 72 65 64 2e 0a 20 20   is required..  
8510: 20 20 2a 2f 0a 20 20 20 20 70 49 6e 66 6f 2d 3e    */.    pInfo->
8520: 6e 53 69 7a 65 20 3d 20 6e 50 61 79 6c 6f 61 64  nSize = nPayload
8530: 20 2b 20 28 75 31 36 29 28 70 49 74 65 72 20 2d   + (u16)(pIter -
8540: 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20 69 66 28   pCell);.    if(
8550: 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 3c 34 20   pInfo->nSize<4 
8560: 29 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d  ) pInfo->nSize =
8570: 20 34 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e   4;.    pInfo->n
8580: 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 6e 50 61  Local = (u16)nPa
8590: 79 6c 6f 61 64 3b 0a 20 20 20 20 70 49 6e 66 6f  yload;.    pInfo
85a0: 2d 3e 69 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b  ->iOverflow = 0;
85b0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
85c0: 20 49 66 20 74 68 65 20 70 61 79 6c 6f 61 64 20   If the payload 
85d0: 77 69 6c 6c 20 6e 6f 74 20 66 69 74 20 63 6f 6d  will not fit com
85e0: 70 6c 65 74 65 6c 79 20 6f 6e 20 74 68 65 20 6c  pletely on the l
85f0: 6f 63 61 6c 20 70 61 67 65 2c 20 77 65 20 68 61  ocal page, we ha
8600: 76 65 0a 20 20 20 20 2a 2a 20 74 6f 20 64 65 63  ve.    ** to dec
8610: 69 64 65 20 68 6f 77 20 6d 75 63 68 20 74 6f 20  ide how much to 
8620: 73 74 6f 72 65 20 6c 6f 63 61 6c 6c 79 20 61 6e  store locally an
8630: 64 20 68 6f 77 20 6d 75 63 68 20 74 6f 20 73 70  d how much to sp
8640: 69 6c 6c 20 6f 6e 74 6f 0a 20 20 20 20 2a 2a 20  ill onto.    ** 
8650: 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20  overflow pages. 
8660: 20 54 68 65 20 73 74 72 61 74 65 67 79 20 69 73   The strategy is
8670: 20 74 6f 20 6d 69 6e 69 6d 69 7a 65 20 74 68 65   to minimize the
8680: 20 61 6d 6f 75 6e 74 20 6f 66 20 75 6e 75 73 65   amount of unuse
8690: 64 0a 20 20 20 20 2a 2a 20 73 70 61 63 65 20 6f  d.    ** space o
86a0: 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  n overflow pages
86b0: 20 77 68 69 6c 65 20 6b 65 65 70 69 6e 67 20 74   while keeping t
86c0: 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 6c 6f 63  he amount of loc
86d0: 61 6c 20 73 74 6f 72 61 67 65 0a 20 20 20 20 2a  al storage.    *
86e0: 2a 20 69 6e 20 62 65 74 77 65 65 6e 20 6d 69 6e  * in between min
86f0: 4c 6f 63 61 6c 20 61 6e 64 20 6d 61 78 4c 6f 63  Local and maxLoc
8700: 61 6c 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  al..    **.    *
8710: 2a 20 57 61 72 6e 69 6e 67 3a 20 20 63 68 61 6e  * Warning:  chan
8720: 67 69 6e 67 20 74 68 65 20 77 61 79 20 6f 76 65  ging the way ove
8730: 72 66 6c 6f 77 20 70 61 79 6c 6f 61 64 20 69 73  rflow payload is
8740: 20 64 69 73 74 72 69 62 75 74 65 64 20 69 6e 20   distributed in 
8750: 61 6e 79 0a 20 20 20 20 2a 2a 20 77 61 79 20 77  any.    ** way w
8760: 69 6c 6c 20 72 65 73 75 6c 74 20 69 6e 20 61 6e  ill result in an
8770: 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65 20 66 69   incompatible fi
8780: 6c 65 20 66 6f 72 6d 61 74 2e 0a 20 20 20 20 2a  le format..    *
8790: 2f 0a 20 20 20 20 69 6e 74 20 6d 69 6e 4c 6f 63  /.    int minLoc
87a0: 61 6c 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20  al;  /* Minimum 
87b0: 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61  amount of payloa
87c0: 64 20 68 65 6c 64 20 6c 6f 63 61 6c 6c 79 20 2a  d held locally *
87d0: 2f 0a 20 20 20 20 69 6e 74 20 6d 61 78 4c 6f 63  /.    int maxLoc
87e0: 61 6c 3b 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20  al;  /* Maximum 
87f0: 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61  amount of payloa
8800: 64 20 68 65 6c 64 20 6c 6f 63 61 6c 6c 79 20 2a  d held locally *
8810: 2f 0a 20 20 20 20 69 6e 74 20 73 75 72 70 6c 75  /.    int surplu
8820: 73 3b 20 20 20 2f 2a 20 4f 76 65 72 66 6c 6f 77  s;   /* Overflow
8830: 20 70 61 79 6c 6f 61 64 20 61 76 61 69 6c 61 62   payload availab
8840: 6c 65 20 66 6f 72 20 6c 6f 63 61 6c 20 73 74 6f  le for local sto
8850: 72 61 67 65 20 2a 2f 0a 0a 20 20 20 20 6d 69 6e  rage */..    min
8860: 4c 6f 63 61 6c 20 3d 20 70 50 61 67 65 2d 3e 6d  Local = pPage->m
8870: 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 6d 61 78  inLocal;.    max
8880: 4c 6f 63 61 6c 20 3d 20 70 50 61 67 65 2d 3e 6d  Local = pPage->m
8890: 61 78 4c 6f 63 61 6c 3b 0a 20 20 20 20 73 75 72  axLocal;.    sur
88a0: 70 6c 75 73 20 3d 20 6d 69 6e 4c 6f 63 61 6c 20  plus = minLocal 
88b0: 2b 20 28 6e 50 61 79 6c 6f 61 64 20 2d 20 6d 69  + (nPayload - mi
88c0: 6e 4c 6f 63 61 6c 29 25 28 70 50 61 67 65 2d 3e  nLocal)%(pPage->
88d0: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
88e0: 2d 20 34 29 3b 0a 20 20 20 20 74 65 73 74 63 61  - 4);.    testca
88f0: 73 65 28 20 73 75 72 70 6c 75 73 3d 3d 6d 61 78  se( surplus==max
8900: 4c 6f 63 61 6c 20 29 3b 0a 20 20 20 20 74 65 73  Local );.    tes
8910: 74 63 61 73 65 28 20 73 75 72 70 6c 75 73 3d 3d  tcase( surplus==
8920: 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20  maxLocal+1 );.  
8930: 20 20 69 66 28 20 73 75 72 70 6c 75 73 20 3c 3d    if( surplus <=
8940: 20 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20   maxLocal ){.   
8950: 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c     pInfo->nLocal
8960: 20 3d 20 28 75 31 36 29 73 75 72 70 6c 75 73 3b   = (u16)surplus;
8970: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
8980: 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20    pInfo->nLocal 
8990: 3d 20 28 75 31 36 29 6d 69 6e 4c 6f 63 61 6c 3b  = (u16)minLocal;
89a0: 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 6e 66 6f  .    }.    pInfo
89b0: 2d 3e 69 4f 76 65 72 66 6c 6f 77 20 3d 20 28 75  ->iOverflow = (u
89c0: 31 36 29 28 26 70 49 6e 66 6f 2d 3e 70 50 61 79  16)(&pInfo->pPay
89d0: 6c 6f 61 64 5b 70 49 6e 66 6f 2d 3e 6e 4c 6f 63  load[pInfo->nLoc
89e0: 61 6c 5d 20 2d 20 70 43 65 6c 6c 29 3b 0a 20 20  al] - pCell);.  
89f0: 20 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d    pInfo->nSize =
8a00: 20 70 49 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f   pInfo->iOverflo
8a10: 77 20 2b 20 34 3b 0a 20 20 7d 0a 7d 0a 73 74 61  w + 4;.  }.}.sta
8a20: 74 69 63 20 76 6f 69 64 20 62 74 72 65 65 50 61  tic void btreePa
8a30: 72 73 65 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61  rseCell(.  MemPa
8a40: 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20  ge *pPage,      
8a50: 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61     /* Page conta
8a60: 69 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a  ining the cell *
8a70: 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c 2c 20 20  /.  int iCell,  
8a80: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
8a90: 68 65 20 63 65 6c 6c 20 69 6e 64 65 78 2e 20 20  he cell index.  
8aa0: 46 69 72 73 74 20 63 65 6c 6c 20 69 73 20 30 20  First cell is 0 
8ab0: 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70  */.  CellInfo *p
8ac0: 49 6e 66 6f 20 20 20 20 20 20 20 20 20 2f 2a 20  Info         /* 
8ad0: 46 69 6c 6c 20 69 6e 20 74 68 69 73 20 73 74 72  Fill in this str
8ae0: 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 62  ucture */.){.  b
8af0: 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
8b00: 28 70 50 61 67 65 2c 20 66 69 6e 64 43 65 6c 6c  (pPage, findCell
8b10: 28 70 50 61 67 65 2c 20 69 43 65 6c 6c 29 2c 20  (pPage, iCell), 
8b20: 70 49 6e 66 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pInfo);.}../*.**
8b30: 20 43 6f 6d 70 75 74 65 20 74 68 65 20 74 6f 74   Compute the tot
8b40: 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  al number of byt
8b50: 65 73 20 74 68 61 74 20 61 20 43 65 6c 6c 20 6e  es that a Cell n
8b60: 65 65 64 73 20 69 6e 20 74 68 65 20 63 65 6c 6c  eeds in the cell
8b70: 0a 2a 2a 20 64 61 74 61 20 61 72 65 61 20 6f 66  .** data area of
8b80: 20 74 68 65 20 62 74 72 65 65 2d 70 61 67 65 2e   the btree-page.
8b90: 20 20 54 68 65 20 72 65 74 75 72 6e 20 6e 75 6d    The return num
8ba0: 62 65 72 20 69 6e 63 6c 75 64 65 73 20 74 68 65  ber includes the
8bb0: 20 63 65 6c 6c 0a 2a 2a 20 64 61 74 61 20 68 65   cell.** data he
8bc0: 61 64 65 72 20 61 6e 64 20 74 68 65 20 6c 6f 63  ader and the loc
8bd0: 61 6c 20 70 61 79 6c 6f 61 64 2c 20 62 75 74 20  al payload, but 
8be0: 6e 6f 74 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77  not any overflow
8bf0: 20 70 61 67 65 20 6f 72 0a 2a 2a 20 74 68 65 20   page or.** the 
8c00: 73 70 61 63 65 20 75 73 65 64 20 62 79 20 74 68  space used by th
8c10: 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 2e 0a  e cell pointer..
8c20: 2a 2f 0a 73 74 61 74 69 63 20 75 31 36 20 63 65  */.static u16 ce
8c30: 6c 6c 53 69 7a 65 50 74 72 28 4d 65 6d 50 61 67  llSizePtr(MemPag
8c40: 65 20 2a 70 50 61 67 65 2c 20 75 38 20 2a 70 43  e *pPage, u8 *pC
8c50: 65 6c 6c 29 7b 0a 20 20 75 38 20 2a 70 49 74 65  ell){.  u8 *pIte
8c60: 72 20 3d 20 70 43 65 6c 6c 20 2b 20 70 50 61 67  r = pCell + pPag
8c70: 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b  e->childPtrSize;
8c80: 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20   /* For looping 
8c90: 6f 76 65 72 20 62 79 74 65 73 20 6f 66 20 70 43  over bytes of pC
8ca0: 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 45 6e  ell */.  u8 *pEn
8cb0: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
8cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8cd0: 20 20 2f 2a 20 45 6e 64 20 6d 61 72 6b 20 66 6f    /* End mark fo
8ce0: 72 20 61 20 76 61 72 69 6e 74 20 2a 2f 0a 20 20  r a varint */.  
8cf0: 75 33 32 20 6e 53 69 7a 65 3b 20 20 20 20 20 20  u32 nSize;      
8d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8d10: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
8d20: 20 76 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e   value to return
8d30: 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   */..#ifdef SQLI
8d40: 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 54 68  TE_DEBUG.  /* Th
8d50: 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64  e value returned
8d60: 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
8d70: 6e 20 73 68 6f 75 6c 64 20 61 6c 77 61 79 73 20  n should always 
8d80: 62 65 20 74 68 65 20 73 61 6d 65 20 61 73 0a 20  be the same as. 
8d90: 20 2a 2a 20 74 68 65 20 28 43 65 6c 6c 49 6e 66   ** the (CellInf
8da0: 6f 2e 6e 53 69 7a 65 29 20 76 61 6c 75 65 20 66  o.nSize) value f
8db0: 6f 75 6e 64 20 62 79 20 64 6f 69 6e 67 20 61 20  ound by doing a 
8dc0: 66 75 6c 6c 20 70 61 72 73 65 20 6f 66 20 74 68  full parse of th
8dd0: 65 0a 20 20 2a 2a 20 63 65 6c 6c 2e 20 49 66 20  e.  ** cell. If 
8de0: 53 51 4c 49 54 45 5f 44 45 42 55 47 20 69 73 20  SQLITE_DEBUG is 
8df0: 64 65 66 69 6e 65 64 2c 20 61 6e 20 61 73 73 65  defined, an asse
8e00: 72 74 28 29 20 61 74 20 74 68 65 20 62 6f 74 74  rt() at the bott
8e10: 6f 6d 20 6f 66 0a 20 20 2a 2a 20 74 68 69 73 20  om of.  ** this 
8e20: 66 75 6e 63 74 69 6f 6e 20 76 65 72 69 66 69 65  function verifie
8e30: 73 20 74 68 61 74 20 74 68 69 73 20 69 6e 76 61  s that this inva
8e40: 72 69 61 6e 74 20 69 73 20 6e 6f 74 20 76 69 6f  riant is not vio
8e50: 6c 61 74 65 64 2e 20 2a 2f 0a 20 20 43 65 6c 6c  lated. */.  Cell
8e60: 49 6e 66 6f 20 64 65 62 75 67 69 6e 66 6f 3b 0a  Info debuginfo;.
8e70: 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c    btreeParseCell
8e80: 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  Ptr(pPage, pCell
8e90: 2c 20 26 64 65 62 75 67 69 6e 66 6f 29 3b 0a 23  , &debuginfo);.#
8ea0: 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 70 50 61  endif..  if( pPa
8eb0: 67 65 2d 3e 6e 6f 50 61 79 6c 6f 61 64 20 29 7b  ge->noPayload ){
8ec0: 0a 20 20 20 20 70 45 6e 64 20 3d 20 26 70 49 74  .    pEnd = &pIt
8ed0: 65 72 5b 39 5d 3b 0a 20 20 20 20 77 68 69 6c 65  er[9];.    while
8ee0: 28 20 28 2a 70 49 74 65 72 2b 2b 29 26 30 78 38  ( (*pIter++)&0x8
8ef0: 30 20 26 26 20 70 49 74 65 72 3c 70 45 6e 64 20  0 && pIter<pEnd 
8f00: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
8f10: 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69  Page->childPtrSi
8f20: 7a 65 3d 3d 34 20 29 3b 0a 20 20 20 20 72 65 74  ze==4 );.    ret
8f30: 75 72 6e 20 28 75 31 36 29 28 70 49 74 65 72 20  urn (u16)(pIter 
8f40: 2d 20 70 43 65 6c 6c 29 3b 0a 20 20 7d 0a 20 20  - pCell);.  }.  
8f50: 6e 53 69 7a 65 20 3d 20 2a 70 49 74 65 72 3b 0a  nSize = *pIter;.
8f60: 20 20 69 66 28 20 6e 53 69 7a 65 3e 3d 30 78 38    if( nSize>=0x8
8f70: 30 20 29 7b 0a 20 20 20 20 70 45 6e 64 20 3d 20  0 ){.    pEnd = 
8f80: 26 70 49 74 65 72 5b 39 5d 3b 0a 20 20 20 20 6e  &pIter[9];.    n
8f90: 53 69 7a 65 20 26 3d 20 30 78 37 66 3b 0a 20 20  Size &= 0x7f;.  
8fa0: 20 20 64 6f 7b 0a 20 20 20 20 20 20 6e 53 69 7a    do{.      nSiz
8fb0: 65 20 3d 20 28 6e 53 69 7a 65 3c 3c 37 29 20 7c  e = (nSize<<7) |
8fc0: 20 28 2a 2b 2b 70 49 74 65 72 20 26 20 30 78 37   (*++pIter & 0x7
8fd0: 66 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20  f);.    }while( 
8fe0: 2a 28 70 49 74 65 72 29 3e 3d 30 78 38 30 20 26  *(pIter)>=0x80 &
8ff0: 26 20 70 49 74 65 72 3c 70 45 6e 64 20 29 3b 0a  & pIter<pEnd );.
9000: 20 20 7d 0a 20 20 70 49 74 65 72 2b 2b 3b 0a 20    }.  pIter++;. 
9010: 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b   if( pPage->intK
9020: 65 79 20 29 7b 0a 20 20 20 20 2f 2a 20 70 49 74  ey ){.    /* pIt
9030: 65 72 20 6e 6f 77 20 70 6f 69 6e 74 73 20 61 74  er now points at
9040: 20 74 68 65 20 36 34 2d 62 69 74 20 69 6e 74 65   the 64-bit inte
9050: 67 65 72 20 6b 65 79 20 76 61 6c 75 65 2c 20 61  ger key value, a
9060: 20 76 61 72 69 61 62 6c 65 20 6c 65 6e 67 74 68   variable length
9070: 20 0a 20 20 20 20 2a 2a 20 69 6e 74 65 67 65 72   .    ** integer
9080: 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  . The following 
9090: 62 6c 6f 63 6b 20 6d 6f 76 65 73 20 70 49 74 65  block moves pIte
90a0: 72 20 74 6f 20 70 6f 69 6e 74 20 61 74 20 74 68  r to point at th
90b0: 65 20 66 69 72 73 74 20 62 79 74 65 0a 20 20 20  e first byte.   
90c0: 20 2a 2a 20 70 61 73 74 20 74 68 65 20 65 6e 64   ** past the end
90d0: 20 6f 66 20 74 68 65 20 6b 65 79 20 76 61 6c 75   of the key valu
90e0: 65 2e 20 2a 2f 0a 20 20 20 20 70 45 6e 64 20 3d  e. */.    pEnd =
90f0: 20 26 70 49 74 65 72 5b 39 5d 3b 0a 20 20 20 20   &pIter[9];.    
9100: 77 68 69 6c 65 28 20 28 2a 70 49 74 65 72 2b 2b  while( (*pIter++
9110: 29 26 30 78 38 30 20 26 26 20 70 49 74 65 72 3c  )&0x80 && pIter<
9120: 70 45 6e 64 20 29 3b 0a 20 20 7d 0a 20 20 74 65  pEnd );.  }.  te
9130: 73 74 63 61 73 65 28 20 6e 53 69 7a 65 3d 3d 70  stcase( nSize==p
9140: 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29  Page->maxLocal )
9150: 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 53  ;.  testcase( nS
9160: 69 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c  ize==pPage->maxL
9170: 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 69 66 28 20  ocal+1 );.  if( 
9180: 6e 53 69 7a 65 3c 3d 70 50 61 67 65 2d 3e 6d 61  nSize<=pPage->ma
9190: 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 6e 53  xLocal ){.    nS
91a0: 69 7a 65 20 2b 3d 20 28 75 33 32 29 28 70 49 74  ize += (u32)(pIt
91b0: 65 72 20 2d 20 70 43 65 6c 6c 29 3b 0a 20 20 20  er - pCell);.   
91c0: 20 69 66 28 20 6e 53 69 7a 65 3c 34 20 29 20 6e   if( nSize<4 ) n
91d0: 53 69 7a 65 20 3d 20 34 3b 0a 20 20 7d 65 6c 73  Size = 4;.  }els
91e0: 65 7b 0a 20 20 20 20 69 6e 74 20 6d 69 6e 4c 6f  e{.    int minLo
91f0: 63 61 6c 20 3d 20 70 50 61 67 65 2d 3e 6d 69 6e  cal = pPage->min
9200: 4c 6f 63 61 6c 3b 0a 20 20 20 20 6e 53 69 7a 65  Local;.    nSize
9210: 20 3d 20 6d 69 6e 4c 6f 63 61 6c 20 2b 20 28 6e   = minLocal + (n
9220: 53 69 7a 65 20 2d 20 6d 69 6e 4c 6f 63 61 6c 29  Size - minLocal)
9230: 20 25 20 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e   % (pPage->pBt->
9240: 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 29 3b  usableSize - 4);
9250: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e  .    testcase( n
9260: 53 69 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78  Size==pPage->max
9270: 4c 6f 63 61 6c 20 29 3b 0a 20 20 20 20 74 65 73  Local );.    tes
9280: 74 63 61 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50  tcase( nSize==pP
9290: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20  age->maxLocal+1 
92a0: 29 3b 0a 20 20 20 20 69 66 28 20 6e 53 69 7a 65  );.    if( nSize
92b0: 3e 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c  >pPage->maxLocal
92c0: 20 29 7b 0a 20 20 20 20 20 20 6e 53 69 7a 65 20   ){.      nSize 
92d0: 3d 20 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20  = minLocal;.    
92e0: 7d 0a 20 20 20 20 6e 53 69 7a 65 20 2b 3d 20 34  }.    nSize += 4
92f0: 20 2b 20 28 75 31 36 29 28 70 49 74 65 72 20 2d   + (u16)(pIter -
9300: 20 70 43 65 6c 6c 29 3b 0a 20 20 7d 0a 20 20 61   pCell);.  }.  a
9310: 73 73 65 72 74 28 20 6e 53 69 7a 65 3d 3d 64 65  ssert( nSize==de
9320: 62 75 67 69 6e 66 6f 2e 6e 53 69 7a 65 20 7c 7c  buginfo.nSize ||
9330: 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20   CORRUPT_DB );. 
9340: 20 72 65 74 75 72 6e 20 28 75 31 36 29 6e 53 69   return (u16)nSi
9350: 7a 65 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51  ze;.}..#ifdef SQ
9360: 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 20 54 68  LITE_DEBUG./* Th
9370: 69 73 20 76 61 72 69 61 74 69 6f 6e 20 6f 6e 20  is variation on 
9380: 63 65 6c 6c 53 69 7a 65 50 74 72 28 29 20 69 73  cellSizePtr() is
9390: 20 75 73 65 64 20 69 6e 73 69 64 65 20 6f 66 20   used inside of 
93a0: 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65  assert() stateme
93b0: 6e 74 73 0a 2a 2a 20 6f 6e 6c 79 2e 20 2a 2f 0a  nts.** only. */.
93c0: 73 74 61 74 69 63 20 75 31 36 20 63 65 6c 6c 53  static u16 cellS
93d0: 69 7a 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  ize(MemPage *pPa
93e0: 67 65 2c 20 69 6e 74 20 69 43 65 6c 6c 29 7b 0a  ge, int iCell){.
93f0: 20 20 72 65 74 75 72 6e 20 63 65 6c 6c 53 69 7a    return cellSiz
9400: 65 50 74 72 28 70 50 61 67 65 2c 20 66 69 6e 64  ePtr(pPage, find
9410: 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65 6c  Cell(pPage, iCel
9420: 6c 29 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23  l));.}.#endif..#
9430: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
9440: 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a  IT_AUTOVACUUM./*
9450: 0a 2a 2a 20 49 66 20 74 68 65 20 63 65 6c 6c 20  .** If the cell 
9460: 70 43 65 6c 6c 2c 20 70 61 72 74 20 6f 66 20 70  pCell, part of p
9470: 61 67 65 20 70 50 61 67 65 20 63 6f 6e 74 61 69  age pPage contai
9480: 6e 73 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20  ns a pointer.** 
9490: 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70  to an overflow p
94a0: 61 67 65 2c 20 69 6e 73 65 72 74 20 61 6e 20 65  age, insert an e
94b0: 6e 74 72 79 20 69 6e 74 6f 20 74 68 65 20 70 6f  ntry into the po
94c0: 69 6e 74 65 72 2d 6d 61 70 0a 2a 2a 20 66 6f 72  inter-map.** for
94d0: 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61   the overflow pa
94e0: 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ge..*/.static vo
94f0: 69 64 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c  id ptrmapPutOvfl
9500: 50 74 72 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  Ptr(MemPage *pPa
9510: 67 65 2c 20 75 38 20 2a 70 43 65 6c 6c 2c 20 69  ge, u8 *pCell, i
9520: 6e 74 20 2a 70 52 43 29 7b 0a 20 20 43 65 6c 6c  nt *pRC){.  Cell
9530: 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 69 66 28  Info info;.  if(
9540: 20 2a 70 52 43 20 29 20 72 65 74 75 72 6e 3b 0a   *pRC ) return;.
9550: 20 20 61 73 73 65 72 74 28 20 70 43 65 6c 6c 21    assert( pCell!
9560: 3d 30 20 29 3b 0a 20 20 62 74 72 65 65 50 61 72  =0 );.  btreePar
9570: 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c  seCellPtr(pPage,
9580: 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a   pCell, &info);.
9590: 20 20 69 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72    if( info.iOver
95a0: 66 6c 6f 77 20 29 7b 0a 20 20 20 20 50 67 6e 6f  flow ){.    Pgno
95b0: 20 6f 76 66 6c 20 3d 20 67 65 74 34 62 79 74 65   ovfl = get4byte
95c0: 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76  (&pCell[info.iOv
95d0: 65 72 66 6c 6f 77 5d 29 3b 0a 20 20 20 20 70 74  erflow]);.    pt
95e0: 72 6d 61 70 50 75 74 28 70 50 61 67 65 2d 3e 70  rmapPut(pPage->p
95f0: 42 74 2c 20 6f 76 66 6c 2c 20 50 54 52 4d 41 50  Bt, ovfl, PTRMAP
9600: 5f 4f 56 45 52 46 4c 4f 57 31 2c 20 70 50 61 67  _OVERFLOW1, pPag
9610: 65 2d 3e 70 67 6e 6f 2c 20 70 52 43 29 3b 0a 20  e->pgno, pRC);. 
9620: 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a   }.}.#endif.../*
9630: 0a 2a 2a 20 44 65 66 72 61 67 6d 65 6e 74 20 74  .** Defragment t
9640: 68 65 20 70 61 67 65 20 67 69 76 65 6e 2e 20 20  he page given.  
9650: 41 6c 6c 20 43 65 6c 6c 73 20 61 72 65 20 6d 6f  All Cells are mo
9660: 76 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20 65 6e  ved to the.** en
9670: 64 20 6f 66 20 74 68 65 20 70 61 67 65 20 61 6e  d of the page an
9680: 64 20 61 6c 6c 20 66 72 65 65 20 73 70 61 63 65  d all free space
9690: 20 69 73 20 63 6f 6c 6c 65 63 74 65 64 20 69 6e   is collected in
96a0: 74 6f 20 6f 6e 65 0a 2a 2a 20 62 69 67 20 46 72  to one.** big Fr
96b0: 65 65 42 6c 6b 20 74 68 61 74 20 6f 63 63 75 72  eeBlk that occur
96c0: 73 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68 65  s in between the
96d0: 20 68 65 61 64 65 72 20 61 6e 64 20 63 65 6c 6c   header and cell
96e0: 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 61 72 72 61  .** pointer arra
96f0: 79 20 61 6e 64 20 74 68 65 20 63 65 6c 6c 20 63  y and the cell c
9700: 6f 6e 74 65 6e 74 20 61 72 65 61 2e 0a 2a 2a 0a  ontent area..**.
9710: 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  ** EVIDENCE-OF: 
9720: 52 2d 34 34 35 38 32 2d 36 30 31 33 38 20 53 51  R-44582-60138 SQ
9730: 4c 69 74 65 20 6d 61 79 20 66 72 6f 6d 20 74 69  Lite may from ti
9740: 6d 65 20 74 6f 20 74 69 6d 65 20 72 65 6f 72 67  me to time reorg
9750: 61 6e 69 7a 65 20 61 0a 2a 2a 20 62 2d 74 72 65  anize a.** b-tre
9760: 65 20 70 61 67 65 20 73 6f 20 74 68 61 74 20 74  e page so that t
9770: 68 65 72 65 20 61 72 65 20 6e 6f 20 66 72 65 65  here are no free
9780: 62 6c 6f 63 6b 73 20 6f 72 20 66 72 61 67 6d 65  blocks or fragme
9790: 6e 74 20 62 79 74 65 73 2c 20 61 6c 6c 0a 2a 2a  nt bytes, all.**
97a0: 20 75 6e 75 73 65 64 20 62 79 74 65 73 20 61 72   unused bytes ar
97b0: 65 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74  e contained in t
97c0: 68 65 20 75 6e 61 6c 6c 6f 63 61 74 65 64 20 73  he unallocated s
97d0: 70 61 63 65 20 72 65 67 69 6f 6e 2c 20 61 6e 64  pace region, and
97e0: 20 61 6c 6c 0a 2a 2a 20 63 65 6c 6c 73 20 61 72   all.** cells ar
97f0: 65 20 70 61 63 6b 65 64 20 74 69 67 68 74 6c 79  e packed tightly
9800: 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
9810: 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74  he page..*/.stat
9820: 69 63 20 69 6e 74 20 64 65 66 72 61 67 6d 65 6e  ic int defragmen
9830: 74 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70  tPage(MemPage *p
9840: 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 69 3b 20  Page){.  int i; 
9850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9860: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
9870: 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 70 63 3b  ter */.  int pc;
9880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9890: 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
98a0: 66 20 74 68 65 20 69 2d 74 68 20 63 65 6c 6c 20  f the i-th cell 
98b0: 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20 20 20  */.  int hdr;   
98c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
98d0: 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 74 68 65  /* Offset to the
98e0: 20 70 61 67 65 20 68 65 61 64 65 72 20 2a 2f 0a   page header */.
98f0: 20 20 69 6e 74 20 73 69 7a 65 3b 20 20 20 20 20    int size;     
9900: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9910: 53 69 7a 65 20 6f 66 20 61 20 63 65 6c 6c 20 2a  Size of a cell *
9920: 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c 65 53 69  /.  int usableSi
9930: 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ze;            /
9940: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 73 61 62  * Number of usab
9950: 6c 65 20 62 79 74 65 73 20 6f 6e 20 61 20 70 61  le bytes on a pa
9960: 67 65 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c  ge */.  int cell
9970: 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 20  Offset;         
9980: 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20     /* Offset to 
9990: 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  the cell pointer
99a0: 20 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20   array */.  int 
99b0: 63 62 72 6b 3b 20 20 20 20 20 20 20 20 20 20 20  cbrk;           
99c0: 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
99d0: 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e   to the cell con
99e0: 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20 69  tent area */.  i
99f0: 6e 74 20 6e 43 65 6c 6c 3b 20 20 20 20 20 20 20  nt nCell;       
9a00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
9a10: 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 6f 6e 20  ber of cells on 
9a20: 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 75 6e  the page */.  un
9a30: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74  signed char *dat
9a40: 61 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  a;       /* The 
9a50: 70 61 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 75  page data */.  u
9a60: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 74 65  nsigned char *te
9a70: 6d 70 3b 20 20 20 20 20 20 20 2f 2a 20 54 65 6d  mp;       /* Tem
9a80: 70 20 61 72 65 61 20 66 6f 72 20 63 65 6c 6c 20  p area for cell 
9a90: 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 75 6e 73  content */.  uns
9aa0: 69 67 6e 65 64 20 63 68 61 72 20 2a 73 72 63 3b  igned char *src;
9ab0: 20 20 20 20 20 20 20 20 2f 2a 20 53 6f 75 72 63          /* Sourc
9ac0: 65 20 6f 66 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a  e of content */.
9ad0: 20 20 69 6e 74 20 69 43 65 6c 6c 46 69 72 73 74    int iCellFirst
9ae0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
9af0: 46 69 72 73 74 20 61 6c 6c 6f 77 61 62 6c 65 20  First allowable 
9b00: 63 65 6c 6c 20 69 6e 64 65 78 20 2a 2f 0a 20 20  cell index */.  
9b10: 69 6e 74 20 69 43 65 6c 6c 4c 61 73 74 3b 20 20  int iCellLast;  
9b20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61             /* La
9b30: 73 74 20 70 6f 73 73 69 62 6c 65 20 63 65 6c 6c  st possible cell
9b40: 20 69 6e 64 65 78 20 2a 2f 0a 0a 0a 20 20 61 73   index */...  as
9b50: 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
9b60: 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
9b70: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
9b80: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
9b90: 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20 61 73  ->pBt!=0 );.  as
9ba0: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74  sert( pPage->pBt
9bb0: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3c 3d 20  ->usableSize <= 
9bc0: 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f  SQLITE_MAX_PAGE_
9bd0: 53 49 5a 45 20 29 3b 0a 20 20 61 73 73 65 72 74  SIZE );.  assert
9be0: 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  ( pPage->nOverfl
9bf0: 6f 77 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ow==0 );.  asser
9c00: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
9c10: 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
9c20: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 74 65  ->mutex) );.  te
9c30: 6d 70 20 3d 20 30 3b 0a 20 20 73 72 63 20 3d 20  mp = 0;.  src = 
9c40: 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44  data = pPage->aD
9c50: 61 74 61 3b 0a 20 20 68 64 72 20 3d 20 70 50 61  ata;.  hdr = pPa
9c60: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20  ge->hdrOffset;. 
9c70: 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 70 50   cellOffset = pP
9c80: 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 3b  age->cellOffset;
9c90: 0a 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65  .  nCell = pPage
9ca0: 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72  ->nCell;.  asser
9cb0: 74 28 20 6e 43 65 6c 6c 3d 3d 67 65 74 32 62 79  t( nCell==get2by
9cc0: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 29  te(&data[hdr+3])
9cd0: 20 29 3b 0a 20 20 75 73 61 62 6c 65 53 69 7a 65   );.  usableSize
9ce0: 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75   = pPage->pBt->u
9cf0: 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 63 62 72  sableSize;.  cbr
9d00: 6b 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a  k = usableSize;.
9d10: 20 20 69 43 65 6c 6c 46 69 72 73 74 20 3d 20 63    iCellFirst = c
9d20: 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 6e 43  ellOffset + 2*nC
9d30: 65 6c 6c 3b 0a 20 20 69 43 65 6c 6c 4c 61 73 74  ell;.  iCellLast
9d40: 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 20 2d 20   = usableSize - 
9d50: 34 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  4;.  for(i=0; i<
9d60: 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  nCell; i++){.   
9d70: 20 75 38 20 2a 70 41 64 64 72 3b 20 20 20 20 20   u8 *pAddr;     
9d80: 2f 2a 20 54 68 65 20 69 2d 74 68 20 63 65 6c 6c  /* The i-th cell
9d90: 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 20 20   pointer */.    
9da0: 70 41 64 64 72 20 3d 20 26 64 61 74 61 5b 63 65  pAddr = &data[ce
9db0: 6c 6c 4f 66 66 73 65 74 20 2b 20 69 2a 32 5d 3b  llOffset + i*2];
9dc0: 0a 20 20 20 20 70 63 20 3d 20 67 65 74 32 62 79  .    pc = get2by
9dd0: 74 65 28 70 41 64 64 72 29 3b 0a 20 20 20 20 74  te(pAddr);.    t
9de0: 65 73 74 63 61 73 65 28 20 70 63 3d 3d 69 43 65  estcase( pc==iCe
9df0: 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20 20 20 74  llFirst );.    t
9e00: 65 73 74 63 61 73 65 28 20 70 63 3d 3d 69 43 65  estcase( pc==iCe
9e10: 6c 6c 4c 61 73 74 20 29 3b 0a 23 69 66 20 21 64  llLast );.#if !d
9e20: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
9e30: 41 42 4c 45 5f 4f 56 45 52 53 49 5a 45 5f 43 45  ABLE_OVERSIZE_CE
9e40: 4c 4c 5f 43 48 45 43 4b 29 0a 20 20 20 20 2f 2a  LL_CHECK).    /*
9e50: 20 54 68 65 73 65 20 63 6f 6e 64 69 74 69 6f 6e   These condition
9e60: 73 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62  s have already b
9e70: 65 65 6e 20 76 65 72 69 66 69 65 64 20 69 6e 20  een verified in 
9e80: 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 0a  btreeInitPage().
9e90: 20 20 20 20 2a 2a 20 69 66 20 53 51 4c 49 54 45      ** if SQLITE
9ea0: 5f 45 4e 41 42 4c 45 5f 4f 56 45 52 53 49 5a 45  _ENABLE_OVERSIZE
9eb0: 5f 43 45 4c 4c 5f 43 48 45 43 4b 20 69 73 20 64  _CELL_CHECK is d
9ec0: 65 66 69 6e 65 64 20 0a 20 20 20 20 2a 2f 0a 20  efined .    */. 
9ed0: 20 20 20 69 66 28 20 70 63 3c 69 43 65 6c 6c 46     if( pc<iCellF
9ee0: 69 72 73 74 20 7c 7c 20 70 63 3e 69 43 65 6c 6c  irst || pc>iCell
9ef0: 4c 61 73 74 20 29 7b 0a 20 20 20 20 20 20 72 65  Last ){.      re
9f00: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
9f10: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
9f20: 23 65 6e 64 69 66 0a 20 20 20 20 61 73 73 65 72  #endif.    asser
9f30: 74 28 20 70 63 3e 3d 69 43 65 6c 6c 46 69 72 73  t( pc>=iCellFirs
9f40: 74 20 26 26 20 70 63 3c 3d 69 43 65 6c 6c 4c 61  t && pc<=iCellLa
9f50: 73 74 20 29 3b 0a 20 20 20 20 73 69 7a 65 20 3d  st );.    size =
9f60: 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61   cellSizePtr(pPa
9f70: 67 65 2c 20 26 73 72 63 5b 70 63 5d 29 3b 0a 20  ge, &src[pc]);. 
9f80: 20 20 20 63 62 72 6b 20 2d 3d 20 73 69 7a 65 3b     cbrk -= size;
9f90: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
9fa0: 49 54 45 5f 45 4e 41 42 4c 45 5f 4f 56 45 52 53  ITE_ENABLE_OVERS
9fb0: 49 5a 45 5f 43 45 4c 4c 5f 43 48 45 43 4b 29 0a  IZE_CELL_CHECK).
9fc0: 20 20 20 20 69 66 28 20 63 62 72 6b 3c 69 43 65      if( cbrk<iCe
9fd0: 6c 6c 46 69 72 73 74 20 29 7b 0a 20 20 20 20 20  llFirst ){.     
9fe0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
9ff0: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
a000: 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 69 66 28   }.#else.    if(
a010: 20 63 62 72 6b 3c 69 43 65 6c 6c 46 69 72 73 74   cbrk<iCellFirst
a020: 20 7c 7c 20 70 63 2b 73 69 7a 65 3e 75 73 61 62   || pc+size>usab
a030: 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  leSize ){.      
a040: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
a050: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
a060: 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 61 73 73  }.#endif.    ass
a070: 65 72 74 28 20 63 62 72 6b 2b 73 69 7a 65 3c 3d  ert( cbrk+size<=
a080: 75 73 61 62 6c 65 53 69 7a 65 20 26 26 20 63 62  usableSize && cb
a090: 72 6b 3e 3d 69 43 65 6c 6c 46 69 72 73 74 20 29  rk>=iCellFirst )
a0a0: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
a0b0: 63 62 72 6b 2b 73 69 7a 65 3d 3d 75 73 61 62 6c  cbrk+size==usabl
a0c0: 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 74 65 73  eSize );.    tes
a0d0: 74 63 61 73 65 28 20 70 63 2b 73 69 7a 65 3d 3d  tcase( pc+size==
a0e0: 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20  usableSize );.  
a0f0: 20 20 70 75 74 32 62 79 74 65 28 70 41 64 64 72    put2byte(pAddr
a100: 2c 20 63 62 72 6b 29 3b 0a 20 20 20 20 69 66 28  , cbrk);.    if(
a110: 20 74 65 6d 70 3d 3d 30 20 29 7b 0a 20 20 20 20   temp==0 ){.    
a120: 20 20 69 6e 74 20 78 3b 0a 20 20 20 20 20 20 69    int x;.      i
a130: 66 28 20 63 62 72 6b 3d 3d 70 63 20 29 20 63 6f  f( cbrk==pc ) co
a140: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 74 65  ntinue;.      te
a150: 6d 70 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  mp = sqlite3Page
a160: 72 54 65 6d 70 53 70 61 63 65 28 70 50 61 67 65  rTempSpace(pPage
a170: 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a  ->pBt->pPager);.
a180: 20 20 20 20 20 20 78 20 3d 20 67 65 74 32 62 79        x = get2by
a190: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29  te(&data[hdr+5])
a1a0: 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26  ;.      memcpy(&
a1b0: 74 65 6d 70 5b 78 5d 2c 20 26 64 61 74 61 5b 78  temp[x], &data[x
a1c0: 5d 2c 20 28 63 62 72 6b 2b 73 69 7a 65 29 20 2d  ], (cbrk+size) -
a1d0: 20 78 29 3b 0a 20 20 20 20 20 20 73 72 63 20 3d   x);.      src =
a1e0: 20 74 65 6d 70 3b 0a 20 20 20 20 7d 0a 20 20 20   temp;.    }.   
a1f0: 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b 63 62   memcpy(&data[cb
a200: 72 6b 5d 2c 20 26 73 72 63 5b 70 63 5d 2c 20 73  rk], &src[pc], s
a210: 69 7a 65 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65  ize);.  }.  asse
a220: 72 74 28 20 63 62 72 6b 3e 3d 69 43 65 6c 6c 46  rt( cbrk>=iCellF
a230: 69 72 73 74 20 29 3b 0a 20 20 70 75 74 32 62 79  irst );.  put2by
a240: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c  te(&data[hdr+5],
a250: 20 63 62 72 6b 29 3b 0a 20 20 64 61 74 61 5b 68   cbrk);.  data[h
a260: 64 72 2b 31 5d 20 3d 20 30 3b 0a 20 20 64 61 74  dr+1] = 0;.  dat
a270: 61 5b 68 64 72 2b 32 5d 20 3d 20 30 3b 0a 20 20  a[hdr+2] = 0;.  
a280: 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b  data[hdr+7] = 0;
a290: 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b  .  memset(&data[
a2a0: 69 43 65 6c 6c 46 69 72 73 74 5d 2c 20 30 2c 20  iCellFirst], 0, 
a2b0: 63 62 72 6b 2d 69 43 65 6c 6c 46 69 72 73 74 29  cbrk-iCellFirst)
a2c0: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
a2d0: 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
a2e0: 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
a2f0: 67 65 29 20 29 3b 0a 20 20 69 66 28 20 63 62 72  ge) );.  if( cbr
a300: 6b 2d 69 43 65 6c 6c 46 69 72 73 74 21 3d 70 50  k-iCellFirst!=pP
a310: 61 67 65 2d 3e 6e 46 72 65 65 20 29 7b 0a 20 20  age->nFree ){.  
a320: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
a330: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
a340: 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
a350: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  E_OK;.}../*.** S
a360: 65 61 72 63 68 20 74 68 65 20 66 72 65 65 2d 6c  earch the free-l
a370: 69 73 74 20 6f 6e 20 70 61 67 65 20 70 50 67 20  ist on page pPg 
a380: 66 6f 72 20 73 70 61 63 65 20 74 6f 20 73 74 6f  for space to sto
a390: 72 65 20 61 20 63 65 6c 6c 20 6e 42 79 74 65 20  re a cell nByte 
a3a0: 62 79 74 65 73 20 69 6e 0a 2a 2a 20 73 69 7a 65  bytes in.** size
a3b0: 2e 20 49 66 20 6f 6e 65 20 63 61 6e 20 62 65 20  . If one can be 
a3c0: 66 6f 75 6e 64 2c 20 72 65 74 75 72 6e 20 61 20  found, return a 
a3d0: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 73  pointer to the s
a3e0: 70 61 63 65 20 61 6e 64 20 72 65 6d 6f 76 65 20  pace and remove 
a3f0: 69 74 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 66  it.** from the f
a400: 72 65 65 2d 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20  ree-list..**.** 
a410: 49 66 20 6e 6f 20 73 75 69 74 61 62 6c 65 20 73  If no suitable s
a420: 70 61 63 65 20 63 61 6e 20 62 65 20 66 6f 75 6e  pace can be foun
a430: 64 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69  d on the free-li
a440: 73 74 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e  st, return NULL.
a450: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
a460: 74 69 6f 6e 20 6d 61 79 20 64 65 74 65 63 74 20  tion may detect 
a470: 63 6f 72 72 75 70 74 69 6f 6e 20 77 69 74 68 69  corruption withi
a480: 6e 20 70 50 67 2e 20 20 49 66 20 63 6f 72 72 75  n pPg.  If corru
a490: 70 74 69 6f 6e 20 69 73 0a 2a 2a 20 64 65 74 65  ption is.** dete
a4a0: 63 74 65 64 20 74 68 65 6e 20 2a 70 52 63 20 69  cted then *pRc i
a4b0: 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f  s set to SQLITE_
a4c0: 43 4f 52 52 55 50 54 20 61 6e 64 20 4e 55 4c 4c  CORRUPT and NULL
a4d0: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a   is returned..**
a4e0: 0a 2a 2a 20 49 66 20 61 20 73 6c 6f 74 20 6f 66  .** If a slot of
a4f0: 20 61 74 20 6c 65 61 73 74 20 6e 42 79 74 65 20   at least nByte 
a500: 62 79 74 65 73 20 69 73 20 66 6f 75 6e 64 20 62  bytes is found b
a510: 75 74 20 63 61 6e 6e 6f 74 20 62 65 20 75 73 65  ut cannot be use
a520: 64 20 62 65 63 61 75 73 65 20 0a 2a 2a 20 74 68  d because .** th
a530: 65 72 65 20 61 72 65 20 61 6c 72 65 61 64 79 20  ere are already 
a540: 61 74 20 6c 65 61 73 74 20 36 30 20 66 72 61 67  at least 60 frag
a550: 6d 65 6e 74 65 64 20 62 79 74 65 73 20 6f 6e 20  mented bytes on 
a560: 74 68 65 20 70 61 67 65 2c 20 72 65 74 75 72 6e  the page, return
a570: 20 4e 55 4c 4c 2e 0a 2a 2a 20 49 6e 20 74 68 69   NULL..** In thi
a580: 73 20 63 61 73 65 2c 20 69 66 20 70 62 44 65 66  s case, if pbDef
a590: 72 61 67 20 70 61 72 61 6d 65 74 65 72 20 69 73  rag parameter is
a5a0: 20 6e 6f 74 20 4e 55 4c 4c 2c 20 73 65 74 20 2a   not NULL, set *
a5b0: 70 62 44 65 66 72 61 67 20 74 6f 20 74 72 75 65  pbDefrag to true
a5c0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 38 20 2a  ..*/.static u8 *
a5d0: 70 61 67 65 46 69 6e 64 53 6c 6f 74 28 4d 65 6d  pageFindSlot(Mem
a5e0: 50 61 67 65 20 2a 70 50 67 2c 20 69 6e 74 20 6e  Page *pPg, int n
a5f0: 42 79 74 65 2c 20 69 6e 74 20 2a 70 52 63 2c 20  Byte, int *pRc, 
a600: 69 6e 74 20 2a 70 62 44 65 66 72 61 67 29 7b 0a  int *pbDefrag){.
a610: 20 20 63 6f 6e 73 74 20 69 6e 74 20 68 64 72 20    const int hdr 
a620: 3d 20 70 50 67 2d 3e 68 64 72 4f 66 66 73 65 74  = pPg->hdrOffset
a630: 3b 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 61  ;.  u8 * const a
a640: 44 61 74 61 20 3d 20 70 50 67 2d 3e 61 44 61 74  Data = pPg->aDat
a650: 61 3b 0a 20 20 69 6e 74 20 69 41 64 64 72 3b 0a  a;.  int iAddr;.
a660: 20 20 69 6e 74 20 70 63 3b 0a 20 20 69 6e 74 20    int pc;.  int 
a670: 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 50 67  usableSize = pPg
a680: 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
a690: 65 3b 0a 0a 20 20 66 6f 72 28 69 41 64 64 72 3d  e;..  for(iAddr=
a6a0: 68 64 72 2b 31 3b 20 28 70 63 20 3d 20 67 65 74  hdr+1; (pc = get
a6b0: 32 62 79 74 65 28 26 61 44 61 74 61 5b 69 41 64  2byte(&aData[iAd
a6c0: 64 72 5d 29 29 3e 30 3b 20 69 41 64 64 72 3d 70  dr]))>0; iAddr=p
a6d0: 63 29 7b 0a 20 20 20 20 69 6e 74 20 73 69 7a 65  c){.    int size
a6e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
a6f0: 53 69 7a 65 20 6f 66 20 74 68 65 20 66 72 65 65  Size of the free
a700: 20 73 6c 6f 74 20 2a 2f 0a 20 20 20 20 2f 2a 20   slot */.    /* 
a710: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30  EVIDENCE-OF: R-0
a720: 36 38 36 36 2d 33 39 31 32 35 20 46 72 65 65 62  6866-39125 Freeb
a730: 6c 6f 63 6b 73 20 61 72 65 20 61 6c 77 61 79 73  locks are always
a740: 20 63 6f 6e 6e 65 63 74 65 64 20 69 6e 20 6f 72   connected in or
a750: 64 65 72 20 6f 66 0a 20 20 20 20 2a 2a 20 69 6e  der of.    ** in
a760: 63 72 65 61 73 69 6e 67 20 6f 66 66 73 65 74 2e  creasing offset.
a770: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 63 3e 75   */.    if( pc>u
a780: 73 61 62 6c 65 53 69 7a 65 2d 34 20 7c 7c 20 70  sableSize-4 || p
a790: 63 3c 69 41 64 64 72 2b 34 20 29 7b 0a 20 20 20  c<iAddr+4 ){.   
a7a0: 20 20 20 2a 70 52 63 20 3d 20 53 51 4c 49 54 45     *pRc = SQLITE
a7b0: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
a7c0: 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
a7d0: 20 20 20 7d 0a 20 20 20 20 2f 2a 20 45 56 49 44     }.    /* EVID
a7e0: 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 32 37 31 30  ENCE-OF: R-22710
a7f0: 2d 35 33 33 32 38 20 54 68 65 20 74 68 69 72 64  -53328 The third
a800: 20 61 6e 64 20 66 6f 75 72 74 68 20 62 79 74 65   and fourth byte
a810: 73 20 6f 66 20 65 61 63 68 0a 20 20 20 20 2a 2a  s of each.    **
a820: 20 66 72 65 65 62 6c 6f 63 6b 20 66 6f 72 6d 20   freeblock form 
a830: 61 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74  a big-endian int
a840: 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68  eger which is th
a850: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66 72  e size of the fr
a860: 65 65 62 6c 6f 63 6b 0a 20 20 20 20 2a 2a 20 69  eeblock.    ** i
a870: 6e 20 62 79 74 65 73 2c 20 69 6e 63 6c 75 64 69  n bytes, includi
a880: 6e 67 20 74 68 65 20 34 2d 62 79 74 65 20 68 65  ng the 4-byte he
a890: 61 64 65 72 2e 20 2a 2f 0a 20 20 20 20 73 69 7a  ader. */.    siz
a8a0: 65 20 3d 20 67 65 74 32 62 79 74 65 28 26 61 44  e = get2byte(&aD
a8b0: 61 74 61 5b 70 63 2b 32 5d 29 3b 0a 20 20 20 20  ata[pc+2]);.    
a8c0: 69 66 28 20 73 69 7a 65 3e 3d 6e 42 79 74 65 20  if( size>=nByte 
a8d0: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 78 20 3d  ){.      int x =
a8e0: 20 73 69 7a 65 20 2d 20 6e 42 79 74 65 3b 0a 20   size - nByte;. 
a8f0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 78       testcase( x
a900: 3d 3d 34 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ==4 );.      tes
a910: 74 63 61 73 65 28 20 78 3d 3d 33 20 29 3b 0a 20  tcase( x==3 );. 
a920: 20 20 20 20 20 69 66 28 20 78 3c 34 20 29 7b 0a       if( x<4 ){.
a930: 20 20 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45          /* EVIDE
a940: 4e 43 45 2d 4f 46 3a 20 52 2d 31 31 34 39 38 2d  NCE-OF: R-11498-
a950: 35 38 30 32 32 20 49 6e 20 61 20 77 65 6c 6c 2d  58022 In a well-
a960: 66 6f 72 6d 65 64 20 62 2d 74 72 65 65 20 70 61  formed b-tree pa
a970: 67 65 2c 20 74 68 65 20 74 6f 74 61 6c 0a 20 20  ge, the total.  
a980: 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20        ** number 
a990: 6f 66 20 62 79 74 65 73 20 69 6e 20 66 72 61 67  of bytes in frag
a9a0: 6d 65 6e 74 73 20 6d 61 79 20 6e 6f 74 20 65 78  ments may not ex
a9b0: 63 65 65 64 20 36 30 2e 20 2a 2f 0a 20 20 20 20  ceed 60. */.    
a9c0: 20 20 20 20 69 66 28 20 61 44 61 74 61 5b 68 64      if( aData[hd
a9d0: 72 2b 37 5d 3e 3d 36 30 20 29 7b 0a 20 20 20 20  r+7]>=60 ){.    
a9e0: 20 20 20 20 20 20 69 66 28 20 70 62 44 65 66 72        if( pbDefr
a9f0: 61 67 20 29 20 2a 70 62 44 65 66 72 61 67 20 3d  ag ) *pbDefrag =
aa00: 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65   1;.          re
aa10: 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 20 20  turn 0;.        
aa20: 7d 0a 20 20 20 20 20 20 20 20 2f 2a 20 52 65 6d  }.        /* Rem
aa30: 6f 76 65 20 74 68 65 20 73 6c 6f 74 20 66 72 6f  ove the slot fro
aa40: 6d 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e  m the free-list.
aa50: 20 55 70 64 61 74 65 20 74 68 65 20 6e 75 6d 62   Update the numb
aa60: 65 72 20 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a  er of.        **
aa70: 20 66 72 61 67 6d 65 6e 74 65 64 20 62 79 74 65   fragmented byte
aa80: 73 20 77 69 74 68 69 6e 20 74 68 65 20 70 61 67  s within the pag
aa90: 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 6d 65  e. */.        me
aaa0: 6d 63 70 79 28 26 61 44 61 74 61 5b 69 41 64 64  mcpy(&aData[iAdd
aab0: 72 5d 2c 20 26 61 44 61 74 61 5b 70 63 5d 2c 20  r], &aData[pc], 
aac0: 32 29 3b 0a 20 20 20 20 20 20 20 20 61 44 61 74  2);.        aDat
aad0: 61 5b 68 64 72 2b 37 5d 20 2b 3d 20 28 75 38 29  a[hdr+7] += (u8)
aae0: 78 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  x;.      }else i
aaf0: 66 28 20 73 69 7a 65 2b 70 63 20 3e 20 75 73 61  f( size+pc > usa
ab00: 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  bleSize ){.     
ab10: 20 20 20 2a 70 52 63 20 3d 20 53 51 4c 49 54 45     *pRc = SQLITE
ab20: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
ab30: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b         return 0;
ab40: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
ab50: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 6c 6f        /* The slo
ab60: 74 20 72 65 6d 61 69 6e 73 20 6f 6e 20 74 68 65  t remains on the
ab70: 20 66 72 65 65 2d 6c 69 73 74 2e 20 52 65 64 75   free-list. Redu
ab80: 63 65 20 69 74 73 20 73 69 7a 65 20 74 6f 20 61  ce its size to a
ab90: 63 63 6f 75 6e 74 0a 20 20 20 20 20 20 20 20 20  ccount.         
aba0: 2a 2a 20 66 6f 72 20 74 68 65 20 70 6f 72 74 69  ** for the porti
abb0: 6f 6e 20 75 73 65 64 20 62 79 20 74 68 65 20 6e  on used by the n
abc0: 65 77 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 2a  ew allocation. *
abd0: 2f 0a 20 20 20 20 20 20 20 20 70 75 74 32 62 79  /.        put2by
abe0: 74 65 28 26 61 44 61 74 61 5b 70 63 2b 32 5d 2c  te(&aData[pc+2],
abf0: 20 78 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   x);.      }.   
ac00: 20 20 20 72 65 74 75 72 6e 20 26 61 44 61 74 61     return &aData
ac10: 5b 70 63 20 2b 20 78 5d 3b 0a 20 20 20 20 7d 0a  [pc + x];.    }.
ac20: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 30 3b    }..  return 0;
ac30: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61  .}../*.** Alloca
ac40: 74 65 20 6e 42 79 74 65 20 62 79 74 65 73 20 6f  te nByte bytes o
ac50: 66 20 73 70 61 63 65 20 66 72 6f 6d 20 77 69 74  f space from wit
ac60: 68 69 6e 20 74 68 65 20 42 2d 54 72 65 65 20 70  hin the B-Tree p
ac70: 61 67 65 20 70 61 73 73 65 64 0a 2a 2a 20 61 73  age passed.** as
ac80: 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
ac90: 65 6e 74 2e 20 57 72 69 74 65 20 69 6e 74 6f 20  ent. Write into 
aca0: 2a 70 49 64 78 20 74 68 65 20 69 6e 64 65 78 20  *pIdx the index 
acb0: 69 6e 74 6f 20 70 50 61 67 65 2d 3e 61 44 61 74  into pPage->aDat
acc0: 61 5b 5d 0a 2a 2a 20 6f 66 20 74 68 65 20 66 69  a[].** of the fi
acd0: 72 73 74 20 62 79 74 65 20 6f 66 20 61 6c 6c 6f  rst byte of allo
ace0: 63 61 74 65 64 20 73 70 61 63 65 2e 20 52 65 74  cated space. Ret
acf0: 75 72 6e 20 65 69 74 68 65 72 20 53 51 4c 49 54  urn either SQLIT
ad00: 45 5f 4f 4b 20 6f 72 0a 2a 2a 20 61 6e 20 65 72  E_OK or.** an er
ad10: 72 6f 72 20 63 6f 64 65 20 28 75 73 75 61 6c 6c  ror code (usuall
ad20: 79 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  y SQLITE_CORRUPT
ad30: 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c  )..**.** The cal
ad40: 6c 65 72 20 67 75 61 72 61 6e 74 65 65 73 20 74  ler guarantees t
ad50: 68 61 74 20 74 68 65 72 65 20 69 73 20 73 75 66  hat there is suf
ad60: 66 69 63 69 65 6e 74 20 73 70 61 63 65 20 74 6f  ficient space to
ad70: 20 6d 61 6b 65 20 74 68 65 0a 2a 2a 20 61 6c 6c   make the.** all
ad80: 6f 63 61 74 69 6f 6e 2e 20 20 54 68 69 73 20 72  ocation.  This r
ad90: 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 6e 65 65  outine might nee
ada0: 64 20 74 6f 20 64 65 66 72 61 67 6d 65 6e 74 20  d to defragment 
adb0: 69 6e 20 6f 72 64 65 72 20 74 6f 20 62 72 69 6e  in order to brin
adc0: 67 0a 2a 2a 20 61 6c 6c 20 74 68 65 20 73 70 61  g.** all the spa
add0: 63 65 20 74 6f 67 65 74 68 65 72 2c 20 68 6f 77  ce together, how
ade0: 65 76 65 72 2e 20 20 54 68 69 73 20 72 6f 75 74  ever.  This rout
adf0: 69 6e 65 20 77 69 6c 6c 20 61 76 6f 69 64 20 75  ine will avoid u
ae00: 73 69 6e 67 0a 2a 2a 20 74 68 65 20 66 69 72 73  sing.** the firs
ae10: 74 20 74 77 6f 20 62 79 74 65 73 20 70 61 73 74  t two bytes past
ae20: 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65   the cell pointe
ae30: 72 20 61 72 65 61 20 73 69 6e 63 65 20 70 72 65  r area since pre
ae40: 73 75 6d 61 62 6c 79 20 74 68 69 73 0a 2a 2a 20  sumably this.** 
ae50: 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 62 65  allocation is be
ae60: 69 6e 67 20 6d 61 64 65 20 69 6e 20 6f 72 64 65  ing made in orde
ae70: 72 20 74 6f 20 69 6e 73 65 72 74 20 61 20 6e 65  r to insert a ne
ae80: 77 20 63 65 6c 6c 2c 20 73 6f 20 77 65 20 77 69  w cell, so we wi
ae90: 6c 6c 0a 2a 2a 20 61 6c 73 6f 20 65 6e 64 20 75  ll.** also end u
aea0: 70 20 6e 65 65 64 69 6e 67 20 61 20 6e 65 77 20  p needing a new 
aeb0: 63 65 6c 6c 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f  cell pointer..*/
aec0: 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f  .static int allo
aed0: 63 61 74 65 53 70 61 63 65 28 4d 65 6d 50 61 67  cateSpace(MemPag
aee0: 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 6e 42  e *pPage, int nB
aef0: 79 74 65 2c 20 69 6e 74 20 2a 70 49 64 78 29 7b  yte, int *pIdx){
af00: 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 68 64 72  .  const int hdr
af10: 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66   = pPage->hdrOff
af20: 73 65 74 3b 20 20 20 20 2f 2a 20 4c 6f 63 61 6c  set;    /* Local
af30: 20 63 61 63 68 65 20 6f 66 20 70 50 61 67 65 2d   cache of pPage-
af40: 3e 68 64 72 4f 66 66 73 65 74 20 2a 2f 0a 20 20  >hdrOffset */.  
af50: 75 38 20 2a 20 63 6f 6e 73 74 20 64 61 74 61 20  u8 * const data 
af60: 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 20  = pPage->aData; 
af70: 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63 61       /* Local ca
af80: 63 68 65 20 6f 66 20 70 50 61 67 65 2d 3e 61 44  che of pPage->aD
af90: 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 74 6f 70  ata */.  int top
afa0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
afb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
afc0: 20 46 69 72 73 74 20 62 79 74 65 20 6f 66 20 63   First byte of c
afd0: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
afe0: 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   */.  int rc = S
aff0: 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
b000: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
b010: 74 65 67 65 72 20 72 65 74 75 72 6e 20 63 6f 64  teger return cod
b020: 65 20 2a 2f 0a 20 20 69 6e 74 20 67 61 70 3b 20  e */.  int gap; 
b030: 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
b040: 62 79 74 65 20 6f 66 20 67 61 70 20 62 65 74 77  byte of gap betw
b050: 65 65 6e 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  een cell pointer
b060: 73 20 61 6e 64 20 63 65 6c 6c 20 63 6f 6e 74 65  s and cell conte
b070: 6e 74 20 2a 2f 0a 20 20 0a 20 20 61 73 73 65 72  nt */.  .  asser
b080: 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
b090: 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
b0a0: 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
b0b0: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70  assert( pPage->p
b0c0: 42 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Bt );.  assert( 
b0d0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
b0e0: 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
b0f0: 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
b100: 74 28 20 6e 42 79 74 65 3e 3d 30 20 29 3b 20 20  t( nByte>=0 );  
b110: 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c 20  /* Minimum cell 
b120: 73 69 7a 65 20 69 73 20 34 20 2a 2f 0a 20 20 61  size is 4 */.  a
b130: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 46  ssert( pPage->nF
b140: 72 65 65 3e 3d 6e 42 79 74 65 20 29 3b 0a 20 20  ree>=nByte );.  
b150: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
b160: 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20  Overflow==0 );. 
b170: 20 61 73 73 65 72 74 28 20 6e 42 79 74 65 20 3c   assert( nByte <
b180: 20 28 69 6e 74 29 28 70 50 61 67 65 2d 3e 70 42   (int)(pPage->pB
b190: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 38 29  t->usableSize-8)
b1a0: 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70   );..  assert( p
b1b0: 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74  Page->cellOffset
b1c0: 20 3d 3d 20 68 64 72 20 2b 20 31 32 20 2d 20 34   == hdr + 12 - 4
b1d0: 2a 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 3b 0a  *pPage->leaf );.
b1e0: 20 20 67 61 70 20 3d 20 70 50 61 67 65 2d 3e 63    gap = pPage->c
b1f0: 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70 50  ellOffset + 2*pP
b200: 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 61 73  age->nCell;.  as
b210: 73 65 72 74 28 20 67 61 70 3c 3d 36 35 35 33 36  sert( gap<=65536
b220: 20 29 3b 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43   );.  /* EVIDENC
b230: 45 2d 4f 46 3a 20 52 2d 32 39 33 35 36 2d 30 32  E-OF: R-29356-02
b240: 33 39 31 20 49 66 20 74 68 65 20 64 61 74 61 62  391 If the datab
b250: 61 73 65 20 75 73 65 73 20 61 20 36 35 35 33 36  ase uses a 65536
b260: 2d 62 79 74 65 20 70 61 67 65 20 73 69 7a 65 0a  -byte page size.
b270: 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 72 65 73    ** and the res
b280: 65 72 76 65 64 20 73 70 61 63 65 20 69 73 20 7a  erved space is z
b290: 65 72 6f 20 28 74 68 65 20 75 73 75 61 6c 20 76  ero (the usual v
b2a0: 61 6c 75 65 20 66 6f 72 20 72 65 73 65 72 76 65  alue for reserve
b2b0: 64 20 73 70 61 63 65 29 0a 20 20 2a 2a 20 74 68  d space).  ** th
b2c0: 65 6e 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  en the cell cont
b2d0: 65 6e 74 20 6f 66 66 73 65 74 20 6f 66 20 61 6e  ent offset of an
b2e0: 20 65 6d 70 74 79 20 70 61 67 65 20 77 61 6e 74   empty page want
b2f0: 73 20 74 6f 20 62 65 20 36 35 35 33 36 2e 0a 20  s to be 65536.. 
b300: 20 2a 2a 20 48 6f 77 65 76 65 72 2c 20 74 68 61   ** However, tha
b310: 74 20 69 6e 74 65 67 65 72 20 69 73 20 74 6f 6f  t integer is too
b320: 20 6c 61 72 67 65 20 74 6f 20 62 65 20 73 74 6f   large to be sto
b330: 72 65 64 20 69 6e 20 61 20 32 2d 62 79 74 65 20  red in a 2-byte 
b340: 75 6e 73 69 67 6e 65 64 0a 20 20 2a 2a 20 69 6e  unsigned.  ** in
b350: 74 65 67 65 72 2c 20 73 6f 20 61 20 76 61 6c 75  teger, so a valu
b360: 65 20 6f 66 20 30 20 69 73 20 75 73 65 64 20 69  e of 0 is used i
b370: 6e 20 69 74 73 20 70 6c 61 63 65 2e 20 2a 2f 0a  n its place. */.
b380: 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65    top = get2byte
b390: 4e 6f 74 5a 65 72 6f 28 26 64 61 74 61 5b 68 64  NotZero(&data[hd
b3a0: 72 2b 35 5d 29 3b 0a 20 20 69 66 28 20 67 61 70  r+5]);.  if( gap
b3b0: 3e 74 6f 70 20 29 20 72 65 74 75 72 6e 20 53 51  >top ) return SQ
b3c0: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
b3d0: 54 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72  T;..  /* If ther
b3e0: 65 20 69 73 20 65 6e 6f 75 67 68 20 73 70 61 63  e is enough spac
b3f0: 65 20 62 65 74 77 65 65 6e 20 67 61 70 20 61 6e  e between gap an
b400: 64 20 74 6f 70 20 66 6f 72 20 6f 6e 65 20 6d 6f  d top for one mo
b410: 72 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 0a  re cell pointer.
b420: 20 20 2a 2a 20 61 72 72 61 79 20 65 6e 74 72 79    ** array entry
b430: 20 6f 66 66 73 65 74 2c 20 61 6e 64 20 69 66 20   offset, and if 
b440: 74 68 65 20 66 72 65 65 6c 69 73 74 20 69 73 20  the freelist is 
b450: 6e 6f 74 20 65 6d 70 74 79 2c 20 74 68 65 6e 20  not empty, then 
b460: 73 65 61 72 63 68 20 74 68 65 0a 20 20 2a 2a 20  search the.  ** 
b470: 66 72 65 65 6c 69 73 74 20 6c 6f 6f 6b 69 6e 67  freelist looking
b480: 20 66 6f 72 20 61 20 66 72 65 65 20 73 6c 6f 74   for a free slot
b490: 20 62 69 67 20 65 6e 6f 75 67 68 20 74 6f 20 73   big enough to s
b4a0: 61 74 69 73 66 79 20 74 68 65 20 72 65 71 75 65  atisfy the reque
b4b0: 73 74 2e 0a 20 20 2a 2f 0a 20 20 74 65 73 74 63  st..  */.  testc
b4c0: 61 73 65 28 20 67 61 70 2b 32 3d 3d 74 6f 70 20  ase( gap+2==top 
b4d0: 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 67  );.  testcase( g
b4e0: 61 70 2b 31 3d 3d 74 6f 70 20 29 3b 0a 20 20 74  ap+1==top );.  t
b4f0: 65 73 74 63 61 73 65 28 20 67 61 70 3d 3d 74 6f  estcase( gap==to
b500: 70 20 29 3b 0a 20 20 69 66 28 20 67 61 70 2b 32  p );.  if( gap+2
b510: 3c 3d 74 6f 70 20 26 26 20 28 64 61 74 61 5b 68  <=top && (data[h
b520: 64 72 2b 31 5d 20 7c 7c 20 64 61 74 61 5b 68 64  dr+1] || data[hd
b530: 72 2b 32 5d 29 20 29 7b 0a 20 20 20 20 69 6e 74  r+2]) ){.    int
b540: 20 62 44 65 66 72 61 67 20 3d 20 30 3b 0a 20 20   bDefrag = 0;.  
b550: 20 20 75 38 20 2a 70 53 70 61 63 65 20 3d 20 70    u8 *pSpace = p
b560: 61 67 65 46 69 6e 64 53 6c 6f 74 28 70 50 61 67  ageFindSlot(pPag
b570: 65 2c 20 6e 42 79 74 65 2c 20 26 72 63 2c 20 26  e, nByte, &rc, &
b580: 62 44 65 66 72 61 67 29 3b 0a 20 20 20 20 69 66  bDefrag);.    if
b590: 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
b5a0: 3b 0a 20 20 20 20 69 66 28 20 62 44 65 66 72 61  ;.    if( bDefra
b5b0: 67 20 29 20 67 6f 74 6f 20 64 65 66 72 61 67 6d  g ) goto defragm
b5c0: 65 6e 74 5f 70 61 67 65 3b 0a 20 20 20 20 69 66  ent_page;.    if
b5d0: 28 20 70 53 70 61 63 65 20 29 7b 0a 20 20 20 20  ( pSpace ){.    
b5e0: 20 20 61 73 73 65 72 74 28 20 70 53 70 61 63 65    assert( pSpace
b5f0: 3e 3d 64 61 74 61 20 26 26 20 28 70 53 70 61 63  >=data && (pSpac
b600: 65 20 2d 20 64 61 74 61 29 3c 36 35 35 33 36 20  e - data)<65536 
b610: 29 3b 0a 20 20 20 20 20 20 2a 70 49 64 78 20 3d  );.      *pIdx =
b620: 20 28 69 6e 74 29 28 70 53 70 61 63 65 20 2d 20   (int)(pSpace - 
b630: 64 61 74 61 29 3b 0a 20 20 20 20 20 20 72 65 74  data);.      ret
b640: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
b650: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54     }.  }..  /* T
b660: 68 65 20 72 65 71 75 65 73 74 20 63 6f 75 6c 64  he request could
b670: 20 6e 6f 74 20 62 65 20 66 75 6c 66 69 6c 6c 65   not be fulfille
b680: 64 20 75 73 69 6e 67 20 61 20 66 72 65 65 6c 69  d using a freeli
b690: 73 74 20 73 6c 6f 74 2e 20 20 43 68 65 63 6b 0a  st slot.  Check.
b6a0: 20 20 2a 2a 20 74 6f 20 73 65 65 20 69 66 20 64    ** to see if d
b6b0: 65 66 72 61 67 6d 65 6e 74 61 74 69 6f 6e 20 69  efragmentation i
b6c0: 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 20 20 2a  s necessary..  *
b6d0: 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20 67 61  /.  testcase( ga
b6e0: 70 2b 32 2b 6e 42 79 74 65 3d 3d 74 6f 70 20 29  p+2+nByte==top )
b6f0: 3b 0a 20 20 69 66 28 20 67 61 70 2b 32 2b 6e 42  ;.  if( gap+2+nB
b700: 79 74 65 3e 74 6f 70 20 29 7b 0a 20 64 65 66 72  yte>top ){. defr
b710: 61 67 6d 65 6e 74 5f 70 61 67 65 3a 0a 20 20 20  agment_page:.   
b720: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
b730: 6e 43 65 6c 6c 3e 30 20 7c 7c 20 43 4f 52 52 55  nCell>0 || CORRU
b740: 50 54 5f 44 42 20 29 3b 0a 20 20 20 20 72 63 20  PT_DB );.    rc 
b750: 3d 20 64 65 66 72 61 67 6d 65 6e 74 50 61 67 65  = defragmentPage
b760: 28 70 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  (pPage);.    if(
b770: 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
b780: 0a 20 20 20 20 74 6f 70 20 3d 20 67 65 74 32 62  .    top = get2b
b790: 79 74 65 4e 6f 74 5a 65 72 6f 28 26 64 61 74 61  yteNotZero(&data
b7a0: 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20 61 73  [hdr+5]);.    as
b7b0: 73 65 72 74 28 20 67 61 70 2b 6e 42 79 74 65 3c  sert( gap+nByte<
b7c0: 3d 74 6f 70 20 29 3b 0a 20 20 7d 0a 0a 0a 20 20  =top );.  }...  
b7d0: 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f  /* Allocate memo
b7e0: 72 79 20 66 72 6f 6d 20 74 68 65 20 67 61 70 20  ry from the gap 
b7f0: 69 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20 63  in between the c
b800: 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 72 61  ell pointer arra
b810: 79 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 63  y.  ** and the c
b820: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
b830: 2e 20 20 54 68 65 20 62 74 72 65 65 49 6e 69 74  .  The btreeInit
b840: 50 61 67 65 28 29 20 63 61 6c 6c 20 68 61 73 20  Page() call has 
b850: 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20 76 61 6c  already.  ** val
b860: 69 64 61 74 65 64 20 74 68 65 20 66 72 65 65 6c  idated the freel
b870: 69 73 74 2e 20 20 47 69 76 65 6e 20 74 68 61 74  ist.  Given that
b880: 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 69 73   the freelist is
b890: 20 76 61 6c 69 64 2c 20 74 68 65 72 65 0a 20 20   valid, there.  
b8a0: 2a 2a 20 69 73 20 6e 6f 20 77 61 79 20 74 68 61  ** is no way tha
b8b0: 74 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e  t the allocation
b8c0: 20 63 61 6e 20 65 78 74 65 6e 64 20 6f 66 66 20   can extend off 
b8d0: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70  the end of the p
b8e0: 61 67 65 2e 0a 20 20 2a 2a 20 54 68 65 20 61 73  age..  ** The as
b8f0: 73 65 72 74 28 29 20 62 65 6c 6f 77 20 76 65 72  sert() below ver
b900: 69 66 69 65 73 20 74 68 65 20 70 72 65 76 69 6f  ifies the previo
b910: 75 73 20 73 65 6e 74 65 6e 63 65 2e 0a 20 20 2a  us sentence..  *
b920: 2f 0a 20 20 74 6f 70 20 2d 3d 20 6e 42 79 74 65  /.  top -= nByte
b930: 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61  ;.  put2byte(&da
b940: 74 61 5b 68 64 72 2b 35 5d 2c 20 74 6f 70 29 3b  ta[hdr+5], top);
b950: 0a 20 20 61 73 73 65 72 74 28 20 74 6f 70 2b 6e  .  assert( top+n
b960: 42 79 74 65 20 3c 3d 20 28 69 6e 74 29 70 50 61  Byte <= (int)pPa
b970: 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
b980: 69 7a 65 20 29 3b 0a 20 20 2a 70 49 64 78 20 3d  ize );.  *pIdx =
b990: 20 74 6f 70 3b 0a 20 20 72 65 74 75 72 6e 20 53   top;.  return S
b9a0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
b9b0: 2a 2a 20 52 65 74 75 72 6e 20 61 20 73 65 63 74  ** Return a sect
b9c0: 69 6f 6e 20 6f 66 20 74 68 65 20 70 50 61 67 65  ion of the pPage
b9d0: 2d 3e 61 44 61 74 61 20 74 6f 20 74 68 65 20 66  ->aData to the f
b9e0: 72 65 65 6c 69 73 74 2e 0a 2a 2a 20 54 68 65 20  reelist..** The 
b9f0: 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68  first byte of th
ba00: 65 20 6e 65 77 20 66 72 65 65 20 62 6c 6f 63 6b  e new free block
ba10: 20 69 73 20 70 50 61 67 65 2d 3e 61 44 61 74 61   is pPage->aData
ba20: 5b 69 53 74 61 72 74 5d 0a 2a 2a 20 61 6e 64 20  [iStart].** and 
ba30: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
ba40: 62 6c 6f 63 6b 20 69 73 20 69 53 69 7a 65 20 62  block is iSize b
ba50: 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 64 6a 61  ytes..**.** Adja
ba60: 63 65 6e 74 20 66 72 65 65 62 6c 6f 63 6b 73 20  cent freeblocks 
ba70: 61 72 65 20 63 6f 61 6c 65 73 63 65 64 2e 0a 2a  are coalesced..*
ba80: 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 65  *.** Note that e
ba90: 76 65 6e 20 74 68 6f 75 67 68 20 74 68 65 20 66  ven though the f
baa0: 72 65 65 62 6c 6f 63 6b 20 6c 69 73 74 20 77 61  reeblock list wa
bab0: 73 20 63 68 65 63 6b 65 64 20 62 79 20 62 74 72  s checked by btr
bac0: 65 65 49 6e 69 74 50 61 67 65 28 29 2c 0a 2a 2a  eeInitPage(),.**
bad0: 20 74 68 61 74 20 72 6f 75 74 69 6e 65 20 77 69   that routine wi
bae0: 6c 6c 20 6e 6f 74 20 64 65 74 65 63 74 20 6f 76  ll not detect ov
baf0: 65 72 6c 61 70 20 62 65 74 77 65 65 6e 20 63 65  erlap between ce
bb00: 6c 6c 73 20 6f 72 20 66 72 65 65 62 6c 6f 63 6b  lls or freeblock
bb10: 73 2e 20 20 4e 6f 72 0a 2a 2a 20 64 6f 65 73 20  s.  Nor.** does 
bb20: 69 74 20 64 65 74 65 63 74 20 63 65 6c 6c 73 20  it detect cells 
bb30: 6f 72 20 66 72 65 65 62 6c 6f 63 6b 73 20 74 68  or freeblocks th
bb40: 61 74 20 65 6e 63 72 6f 75 63 68 20 69 6e 74 6f  at encrouch into
bb50: 20 74 68 65 20 72 65 73 65 72 76 65 64 20 62 79   the reserved by
bb60: 74 65 73 0a 2a 2a 20 61 74 20 74 68 65 20 65 6e  tes.** at the en
bb70: 64 20 6f 66 20 74 68 65 20 70 61 67 65 2e 20 20  d of the page.  
bb80: 53 6f 20 64 6f 20 61 64 64 69 74 69 6f 6e 61 6c  So do additional
bb90: 20 63 6f 72 72 75 70 74 69 6f 6e 20 63 68 65 63   corruption chec
bba0: 6b 73 20 69 6e 73 69 64 65 20 74 68 69 73 0a 2a  ks inside this.*
bbb0: 2a 20 72 6f 75 74 69 6e 65 20 61 6e 64 20 72 65  * routine and re
bbc0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
bbd0: 55 50 54 20 69 66 20 61 6e 79 20 70 72 6f 62 6c  UPT if any probl
bbe0: 65 6d 73 20 61 72 65 20 66 6f 75 6e 64 2e 0a 2a  ems are found..*
bbf0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 72 65  /.static int fre
bc00: 65 53 70 61 63 65 28 4d 65 6d 50 61 67 65 20 2a  eSpace(MemPage *
bc10: 70 50 61 67 65 2c 20 75 31 36 20 69 53 74 61 72  pPage, u16 iStar
bc20: 74 2c 20 75 31 36 20 69 53 69 7a 65 29 7b 0a 20  t, u16 iSize){. 
bc30: 20 75 31 36 20 69 50 74 72 3b 20 20 20 20 20 20   u16 iPtr;      
bc40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bc50: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
bc60: 73 20 6f 66 20 70 74 72 20 74 6f 20 6e 65 78 74  s of ptr to next
bc70: 20 66 72 65 65 62 6c 6f 63 6b 20 2a 2f 0a 20 20   freeblock */.  
bc80: 75 31 36 20 69 46 72 65 65 42 6c 6b 3b 20 20 20  u16 iFreeBlk;   
bc90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bca0: 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
bcb0: 20 6f 66 20 74 68 65 20 6e 65 78 74 20 66 72 65   of the next fre
bcc0: 65 62 6c 6f 63 6b 20 2a 2f 0a 20 20 75 38 20 68  eblock */.  u8 h
bcd0: 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dr;             
bce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bcf0: 20 20 2f 2a 20 50 61 67 65 20 68 65 61 64 65 72    /* Page header
bd00: 20 73 69 7a 65 2e 20 20 30 20 6f 72 20 31 30 30   size.  0 or 100
bd10: 20 2a 2f 0a 20 20 75 38 20 6e 46 72 61 67 20 3d   */.  u8 nFrag =
bd20: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
bd30: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
bd40: 65 64 75 63 74 69 6f 6e 20 69 6e 20 66 72 61 67  eduction in frag
bd50: 6d 65 6e 74 61 74 69 6f 6e 20 2a 2f 0a 20 20 75  mentation */.  u
bd60: 31 36 20 69 4f 72 69 67 53 69 7a 65 20 3d 20 69  16 iOrigSize = i
bd70: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
bd80: 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c       /* Original
bd90: 20 76 61 6c 75 65 20 6f 66 20 69 53 69 7a 65 20   value of iSize 
bda0: 2a 2f 0a 20 20 75 33 32 20 69 4c 61 73 74 20 3d  */.  u32 iLast =
bdb0: 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61   pPage->pBt->usa
bdc0: 62 6c 65 53 69 7a 65 2d 34 3b 20 2f 2a 20 4c 61  bleSize-4; /* La
bdd0: 72 67 65 73 74 20 70 6f 73 73 69 62 6c 65 20 66  rgest possible f
bde0: 72 65 65 62 6c 6f 63 6b 20 6f 66 66 73 65 74 20  reeblock offset 
bdf0: 2a 2f 0a 20 20 75 33 32 20 69 45 6e 64 20 3d 20  */.  u32 iEnd = 
be00: 69 53 74 61 72 74 20 2b 20 69 53 69 7a 65 3b 20  iStart + iSize; 
be10: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
be20: 72 73 74 20 62 79 74 65 20 70 61 73 74 20 74 68  rst byte past th
be30: 65 20 69 53 74 61 72 74 20 62 75 66 66 65 72 20  e iStart buffer 
be40: 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
be50: 61 72 20 2a 64 61 74 61 20 3d 20 70 50 61 67 65  ar *data = pPage
be60: 2d 3e 61 44 61 74 61 3b 20 20 20 2f 2a 20 50 61  ->aData;   /* Pa
be70: 67 65 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 0a 20  ge content */.. 
be80: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
be90: 70 42 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  pBt!=0 );.  asse
bea0: 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
beb0: 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
bec0: 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
bed0: 20 61 73 73 65 72 74 28 20 69 53 74 61 72 74 3e   assert( iStart>
bee0: 3d 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  =pPage->hdrOffse
bef0: 74 2b 36 2b 70 50 61 67 65 2d 3e 63 68 69 6c 64  t+6+pPage->child
bf00: 50 74 72 53 69 7a 65 20 29 3b 0a 20 20 61 73 73  PtrSize );.  ass
bf10: 65 72 74 28 20 43 4f 52 52 55 50 54 5f 44 42 20  ert( CORRUPT_DB 
bf20: 7c 7c 20 69 45 6e 64 20 3c 3d 20 70 50 61 67 65  || iEnd <= pPage
bf30: 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
bf40: 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  e );.  assert( s
bf50: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
bf60: 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
bf70: 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
bf80: 28 20 69 53 69 7a 65 3e 3d 34 20 29 3b 20 20 20  ( iSize>=4 );   
bf90: 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c 20  /* Minimum cell 
bfa0: 73 69 7a 65 20 69 73 20 34 20 2a 2f 0a 20 20 61  size is 4 */.  a
bfb0: 73 73 65 72 74 28 20 69 53 74 61 72 74 3c 3d 69  ssert( iStart<=i
bfc0: 4c 61 73 74 20 29 3b 0a 0a 20 20 2f 2a 20 4f 76  Last );..  /* Ov
bfd0: 65 72 77 72 69 74 65 20 64 65 6c 65 74 65 64 20  erwrite deleted 
bfe0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 69 74 68  information with
bff0: 20 7a 65 72 6f 73 20 77 68 65 6e 20 74 68 65 20   zeros when the 
c000: 73 65 63 75 72 65 5f 64 65 6c 65 74 65 0a 20 20  secure_delete.  
c010: 2a 2a 20 6f 70 74 69 6f 6e 20 69 73 20 65 6e 61  ** option is ena
c020: 62 6c 65 64 20 2a 2f 0a 20 20 69 66 28 20 70 50  bled */.  if( pP
c030: 61 67 65 2d 3e 70 42 74 2d 3e 62 74 73 46 6c 61  age->pBt->btsFla
c040: 67 73 20 26 20 42 54 53 5f 53 45 43 55 52 45 5f  gs & BTS_SECURE_
c050: 44 45 4c 45 54 45 20 29 7b 0a 20 20 20 20 6d 65  DELETE ){.    me
c060: 6d 73 65 74 28 26 64 61 74 61 5b 69 53 74 61 72  mset(&data[iStar
c070: 74 5d 2c 20 30 2c 20 69 53 69 7a 65 29 3b 0a 20  t], 0, iSize);. 
c080: 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 6c 69 73   }..  /* The lis
c090: 74 20 6f 66 20 66 72 65 65 62 6c 6f 63 6b 73 20  t of freeblocks 
c0a0: 6d 75 73 74 20 62 65 20 69 6e 20 61 73 63 65 6e  must be in ascen
c0b0: 64 69 6e 67 20 6f 72 64 65 72 2e 20 20 46 69 6e  ding order.  Fin
c0c0: 64 20 74 68 65 20 0a 20 20 2a 2a 20 73 70 6f 74  d the .  ** spot
c0d0: 20 6f 6e 20 74 68 65 20 6c 69 73 74 20 77 68 65   on the list whe
c0e0: 72 65 20 69 53 74 61 72 74 20 73 68 6f 75 6c 64  re iStart should
c0f0: 20 62 65 20 69 6e 73 65 72 74 65 64 2e 0a 20 20   be inserted..  
c100: 2a 2f 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65  */.  hdr = pPage
c110: 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 69  ->hdrOffset;.  i
c120: 50 74 72 20 3d 20 68 64 72 20 2b 20 31 3b 0a 20  Ptr = hdr + 1;. 
c130: 20 69 66 28 20 64 61 74 61 5b 69 50 74 72 2b 31   if( data[iPtr+1
c140: 5d 3d 3d 30 20 26 26 20 64 61 74 61 5b 69 50 74  ]==0 && data[iPt
c150: 72 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 69 46 72  r]==0 ){.    iFr
c160: 65 65 42 6c 6b 20 3d 20 30 3b 20 20 2f 2a 20 53  eeBlk = 0;  /* S
c170: 68 6f 72 74 63 75 74 20 66 6f 72 20 74 68 65 20  hortcut for the 
c180: 63 61 73 65 20 77 68 65 6e 20 74 68 65 20 66 72  case when the fr
c190: 65 65 6c 69 73 74 20 69 73 20 65 6d 70 74 79 20  eelist is empty 
c1a0: 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  */.  }else{.    
c1b0: 77 68 69 6c 65 28 20 28 69 46 72 65 65 42 6c 6b  while( (iFreeBlk
c1c0: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
c1d0: 61 5b 69 50 74 72 5d 29 29 3e 30 20 26 26 20 69  a[iPtr]))>0 && i
c1e0: 46 72 65 65 42 6c 6b 3c 69 53 74 61 72 74 20 29  FreeBlk<iStart )
c1f0: 7b 0a 20 20 20 20 20 20 69 66 28 20 69 46 72 65  {.      if( iFre
c200: 65 42 6c 6b 3c 69 50 74 72 2b 34 20 29 20 72 65  eBlk<iPtr+4 ) re
c210: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
c220: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
c230: 69 50 74 72 20 3d 20 69 46 72 65 65 42 6c 6b 3b  iPtr = iFreeBlk;
c240: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
c250: 46 72 65 65 42 6c 6b 3e 69 4c 61 73 74 20 29 20  FreeBlk>iLast ) 
c260: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
c270: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
c280: 61 73 73 65 72 74 28 20 69 46 72 65 65 42 6c 6b  assert( iFreeBlk
c290: 3e 69 50 74 72 20 7c 7c 20 69 46 72 65 65 42 6c  >iPtr || iFreeBl
c2a0: 6b 3d 3d 30 20 29 3b 0a 20 20 0a 20 20 20 20 2f  k==0 );.  .    /
c2b0: 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 3a  * At this point:
c2c0: 0a 20 20 20 20 2a 2a 20 20 20 20 69 46 72 65 65  .    **    iFree
c2d0: 42 6c 6b 3a 20 20 20 46 69 72 73 74 20 66 72 65  Blk:   First fre
c2e0: 65 62 6c 6f 63 6b 20 61 66 74 65 72 20 69 53 74  eblock after iSt
c2f0: 61 72 74 2c 20 6f 72 20 7a 65 72 6f 20 69 66 20  art, or zero if 
c300: 6e 6f 6e 65 0a 20 20 20 20 2a 2a 20 20 20 20 69  none.    **    i
c310: 50 74 72 3a 20 20 20 20 20 20 20 54 68 65 20 61  Ptr:       The a
c320: 64 64 72 65 73 73 20 6f 66 20 61 20 70 6f 69 6e  ddress of a poin
c330: 74 65 72 20 69 46 72 65 65 42 6c 6b 0a 20 20 20  ter iFreeBlk.   
c340: 20 2a 2a 0a 20 20 20 20 2a 2a 20 43 68 65 63 6b   **.    ** Check
c350: 20 74 6f 20 73 65 65 20 69 66 20 69 46 72 65 65   to see if iFree
c360: 42 6c 6b 20 73 68 6f 75 6c 64 20 62 65 20 63 6f  Blk should be co
c370: 61 6c 65 73 63 65 64 20 6f 6e 74 6f 20 74 68 65  alesced onto the
c380: 20 65 6e 64 20 6f 66 20 69 53 74 61 72 74 2e 0a   end of iStart..
c390: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69      */.    if( i
c3a0: 46 72 65 65 42 6c 6b 20 26 26 20 69 45 6e 64 2b  FreeBlk && iEnd+
c3b0: 33 3e 3d 69 46 72 65 65 42 6c 6b 20 29 7b 0a 20  3>=iFreeBlk ){. 
c3c0: 20 20 20 20 20 6e 46 72 61 67 20 3d 20 69 46 72       nFrag = iFr
c3d0: 65 65 42 6c 6b 20 2d 20 69 45 6e 64 3b 0a 20 20  eeBlk - iEnd;.  
c3e0: 20 20 20 20 69 66 28 20 69 45 6e 64 3e 69 46 72      if( iEnd>iFr
c3f0: 65 65 42 6c 6b 20 29 20 72 65 74 75 72 6e 20 53  eeBlk ) return S
c400: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
c410: 50 54 3b 0a 20 20 20 20 20 20 69 45 6e 64 20 3d  PT;.      iEnd =
c420: 20 69 46 72 65 65 42 6c 6b 20 2b 20 67 65 74 32   iFreeBlk + get2
c430: 62 79 74 65 28 26 64 61 74 61 5b 69 46 72 65 65  byte(&data[iFree
c440: 42 6c 6b 2b 32 5d 29 3b 0a 20 20 20 20 20 20 69  Blk+2]);.      i
c450: 53 69 7a 65 20 3d 20 69 45 6e 64 20 2d 20 69 53  Size = iEnd - iS
c460: 74 61 72 74 3b 0a 20 20 20 20 20 20 69 46 72 65  tart;.      iFre
c470: 65 42 6c 6b 20 3d 20 67 65 74 32 62 79 74 65 28  eBlk = get2byte(
c480: 26 64 61 74 61 5b 69 46 72 65 65 42 6c 6b 5d 29  &data[iFreeBlk])
c490: 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f  ;.    }.  .    /
c4a0: 2a 20 49 66 20 69 50 74 72 20 69 73 20 61 6e 6f  * If iPtr is ano
c4b0: 74 68 65 72 20 66 72 65 65 62 6c 6f 63 6b 20 28  ther freeblock (
c4c0: 74 68 61 74 20 69 73 2c 20 69 66 20 69 50 74 72  that is, if iPtr
c4d0: 20 69 73 20 6e 6f 74 20 74 68 65 20 66 72 65 65   is not the free
c4e0: 6c 69 73 74 0a 20 20 20 20 2a 2a 20 70 6f 69 6e  list.    ** poin
c4f0: 74 65 72 20 69 6e 20 74 68 65 20 70 61 67 65 20  ter in the page 
c500: 68 65 61 64 65 72 29 20 74 68 65 6e 20 63 68 65  header) then che
c510: 63 6b 20 74 6f 20 73 65 65 20 69 66 20 69 53 74  ck to see if iSt
c520: 61 72 74 20 73 68 6f 75 6c 64 20 62 65 0a 20 20  art should be.  
c530: 20 20 2a 2a 20 63 6f 61 6c 65 73 63 65 64 20 6f    ** coalesced o
c540: 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 69  nto the end of i
c550: 50 74 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  Ptr..    */.    
c560: 69 66 28 20 69 50 74 72 3e 68 64 72 2b 31 20 29  if( iPtr>hdr+1 )
c570: 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 50 74 72  {.      int iPtr
c580: 45 6e 64 20 3d 20 69 50 74 72 20 2b 20 67 65 74  End = iPtr + get
c590: 32 62 79 74 65 28 26 64 61 74 61 5b 69 50 74 72  2byte(&data[iPtr
c5a0: 2b 32 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20  +2]);.      if( 
c5b0: 69 50 74 72 45 6e 64 2b 33 3e 3d 69 53 74 61 72  iPtrEnd+3>=iStar
c5c0: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  t ){.        if(
c5d0: 20 69 50 74 72 45 6e 64 3e 69 53 74 61 72 74 20   iPtrEnd>iStart 
c5e0: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
c5f0: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
c600: 20 20 20 20 20 20 6e 46 72 61 67 20 2b 3d 20 69        nFrag += i
c610: 53 74 61 72 74 20 2d 20 69 50 74 72 45 6e 64 3b  Start - iPtrEnd;
c620: 0a 20 20 20 20 20 20 20 20 69 53 69 7a 65 20 3d  .        iSize =
c630: 20 69 45 6e 64 20 2d 20 69 50 74 72 3b 0a 20 20   iEnd - iPtr;.  
c640: 20 20 20 20 20 20 69 53 74 61 72 74 20 3d 20 69        iStart = i
c650: 50 74 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  Ptr;.      }.   
c660: 20 7d 0a 20 20 20 20 69 66 28 20 6e 46 72 61 67   }.    if( nFrag
c670: 3e 64 61 74 61 5b 68 64 72 2b 37 5d 20 29 20 72  >data[hdr+7] ) r
c680: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
c690: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 64  RUPT_BKPT;.    d
c6a0: 61 74 61 5b 68 64 72 2b 37 5d 20 2d 3d 20 6e 46  ata[hdr+7] -= nF
c6b0: 72 61 67 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69  rag;.  }.  if( i
c6c0: 53 74 61 72 74 3d 3d 67 65 74 32 62 79 74 65 28  Start==get2byte(
c6d0: 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 20 29 7b  &data[hdr+5]) ){
c6e0: 0a 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 77 20  .    /* The new 
c6f0: 66 72 65 65 62 6c 6f 63 6b 20 69 73 20 61 74 20  freeblock is at 
c700: 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
c710: 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
c720: 74 20 61 72 65 61 2c 0a 20 20 20 20 2a 2a 20 73  t area,.    ** s
c730: 6f 20 6a 75 73 74 20 65 78 74 65 6e 64 20 74 68  o just extend th
c740: 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61  e cell content a
c750: 72 65 61 20 72 61 74 68 65 72 20 74 68 61 6e 20  rea rather than 
c760: 63 72 65 61 74 65 20 61 6e 6f 74 68 65 72 0a 20  create another. 
c770: 20 20 20 2a 2a 20 66 72 65 65 6c 69 73 74 20 65     ** freelist e
c780: 6e 74 72 79 20 2a 2f 0a 20 20 20 20 69 66 28 20  ntry */.    if( 
c790: 69 50 74 72 21 3d 68 64 72 2b 31 20 29 20 72 65  iPtr!=hdr+1 ) re
c7a0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
c7b0: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 70 75  UPT_BKPT;.    pu
c7c0: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
c7d0: 2b 31 5d 2c 20 69 46 72 65 65 42 6c 6b 29 3b 0a  +1], iFreeBlk);.
c7e0: 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61      put2byte(&da
c7f0: 74 61 5b 68 64 72 2b 35 5d 2c 20 69 45 6e 64 29  ta[hdr+5], iEnd)
c800: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
c810: 2a 20 49 6e 73 65 72 74 20 74 68 65 20 6e 65 77  * Insert the new
c820: 20 66 72 65 65 62 6c 6f 63 6b 20 69 6e 74 6f 20   freeblock into 
c830: 74 68 65 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a  the freelist */.
c840: 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61      put2byte(&da
c850: 74 61 5b 69 50 74 72 5d 2c 20 69 53 74 61 72 74  ta[iPtr], iStart
c860: 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65 28  );.    put2byte(
c870: 26 64 61 74 61 5b 69 53 74 61 72 74 5d 2c 20 69  &data[iStart], i
c880: 46 72 65 65 42 6c 6b 29 3b 0a 20 20 20 20 70 75  FreeBlk);.    pu
c890: 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 53 74  t2byte(&data[iSt
c8a0: 61 72 74 2b 32 5d 2c 20 69 53 69 7a 65 29 3b 0a  art+2], iSize);.
c8b0: 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72    }.  pPage->nFr
c8c0: 65 65 20 2b 3d 20 69 4f 72 69 67 53 69 7a 65 3b  ee += iOrigSize;
c8d0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
c8e0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  _OK;.}../*.** De
c8f0: 63 6f 64 65 20 74 68 65 20 66 6c 61 67 73 20 62  code the flags b
c900: 79 74 65 20 28 74 68 65 20 66 69 72 73 74 20 62  yte (the first b
c910: 79 74 65 20 6f 66 20 74 68 65 20 68 65 61 64 65  yte of the heade
c920: 72 29 20 66 6f 72 20 61 20 70 61 67 65 0a 2a 2a  r) for a page.**
c930: 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20   and initialize 
c940: 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 4d 65  fields of the Me
c950: 6d 50 61 67 65 20 73 74 72 75 63 74 75 72 65 20  mPage structure 
c960: 61 63 63 6f 72 64 69 6e 67 6c 79 2e 0a 2a 2a 0a  accordingly..**.
c970: 2a 2a 20 4f 6e 6c 79 20 74 68 65 20 66 6f 6c 6c  ** Only the foll
c980: 6f 77 69 6e 67 20 63 6f 6d 62 69 6e 61 74 69 6f  owing combinatio
c990: 6e 73 20 61 72 65 20 73 75 70 70 6f 72 74 65 64  ns are supported
c9a0: 2e 20 20 41 6e 79 74 68 69 6e 67 20 64 69 66 66  .  Anything diff
c9b0: 65 72 65 6e 74 0a 2a 2a 20 69 6e 64 69 63 61 74  erent.** indicat
c9c0: 65 73 20 61 20 63 6f 72 72 75 70 74 20 64 61 74  es a corrupt dat
c9d0: 61 62 61 73 65 20 66 69 6c 65 73 3a 0a 2a 2a 0a  abase files:.**.
c9e0: 2a 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f 5a  **         PTF_Z
c9f0: 45 52 4f 44 41 54 41 0a 2a 2a 20 20 20 20 20 20  ERODATA.**      
ca00: 20 20 20 50 54 46 5f 5a 45 52 4f 44 41 54 41 20     PTF_ZERODATA 
ca10: 7c 20 50 54 46 5f 4c 45 41 46 0a 2a 2a 20 20 20  | PTF_LEAF.**   
ca20: 20 20 20 20 20 20 50 54 46 5f 4c 45 41 46 44 41        PTF_LEAFDA
ca30: 54 41 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59 0a  TA | PTF_INTKEY.
ca40: 2a 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f 4c  **         PTF_L
ca50: 45 41 46 44 41 54 41 20 7c 20 50 54 46 5f 49 4e  EAFDATA | PTF_IN
ca60: 54 4b 45 59 20 7c 20 50 54 46 5f 4c 45 41 46 0a  TKEY | PTF_LEAF.
ca70: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 65  */.static int de
ca80: 63 6f 64 65 46 6c 61 67 73 28 4d 65 6d 50 61 67  codeFlags(MemPag
ca90: 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 66 6c  e *pPage, int fl
caa0: 61 67 42 79 74 65 29 7b 0a 20 20 42 74 53 68 61  agByte){.  BtSha
cab0: 72 65 64 20 2a 70 42 74 3b 20 20 20 20 20 2f 2a  red *pBt;     /*
cac0: 20 41 20 63 6f 70 79 20 6f 66 20 70 50 61 67 65   A copy of pPage
cad0: 2d 3e 70 42 74 20 2a 2f 0a 0a 20 20 61 73 73 65  ->pBt */..  asse
cae0: 72 74 28 20 70 50 61 67 65 2d 3e 68 64 72 4f 66  rt( pPage->hdrOf
caf0: 66 73 65 74 3d 3d 28 70 50 61 67 65 2d 3e 70 67  fset==(pPage->pg
cb00: 6e 6f 3d 3d 31 20 3f 20 31 30 30 20 3a 20 30 29  no==1 ? 100 : 0)
cb10: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
cb20: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
cb30: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
cb40: 65 78 29 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e  ex) );.  pPage->
cb50: 6c 65 61 66 20 3d 20 28 75 38 29 28 66 6c 61 67  leaf = (u8)(flag
cb60: 42 79 74 65 3e 3e 33 29 3b 20 20 61 73 73 65 72  Byte>>3);  asser
cb70: 74 28 20 50 54 46 5f 4c 45 41 46 20 3d 3d 20 31  t( PTF_LEAF == 1
cb80: 3c 3c 33 20 29 3b 0a 20 20 66 6c 61 67 42 79 74  <<3 );.  flagByt
cb90: 65 20 26 3d 20 7e 50 54 46 5f 4c 45 41 46 3b 0a  e &= ~PTF_LEAF;.
cba0: 20 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74    pPage->childPt
cbb0: 72 53 69 7a 65 20 3d 20 34 2d 34 2a 70 50 61 67  rSize = 4-4*pPag
cbc0: 65 2d 3e 6c 65 61 66 3b 0a 20 20 70 42 74 20 3d  e->leaf;.  pBt =
cbd0: 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 69   pPage->pBt;.  i
cbe0: 66 28 20 66 6c 61 67 42 79 74 65 3d 3d 28 50 54  f( flagByte==(PT
cbf0: 46 5f 4c 45 41 46 44 41 54 41 20 7c 20 50 54 46  F_LEAFDATA | PTF
cc00: 5f 49 4e 54 4b 45 59 29 20 29 7b 0a 20 20 20 20  _INTKEY) ){.    
cc10: 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
cc20: 52 2d 30 33 36 34 30 2d 31 33 34 31 35 20 41 20  R-03640-13415 A 
cc30: 76 61 6c 75 65 20 6f 66 20 35 20 6d 65 61 6e 73  value of 5 means
cc40: 20 74 68 65 20 70 61 67 65 20 69 73 20 61 6e 20   the page is an 
cc50: 69 6e 74 65 72 69 6f 72 0a 20 20 20 20 2a 2a 20  interior.    ** 
cc60: 74 61 62 6c 65 20 62 2d 74 72 65 65 20 70 61 67  table b-tree pag
cc70: 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  e. */.    assert
cc80: 28 20 28 50 54 46 5f 4c 45 41 46 44 41 54 41 7c  ( (PTF_LEAFDATA|
cc90: 50 54 46 5f 49 4e 54 4b 45 59 29 3d 3d 35 20 29  PTF_INTKEY)==5 )
cca0: 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43  ;.    /* EVIDENC
ccb0: 45 2d 4f 46 3a 20 52 2d 32 30 35 30 31 2d 36 31  E-OF: R-20501-61
ccc0: 37 39 36 20 41 20 76 61 6c 75 65 20 6f 66 20 31  796 A value of 1
ccd0: 33 20 6d 65 61 6e 73 20 74 68 65 20 70 61 67 65  3 means the page
cce0: 20 69 73 20 61 20 6c 65 61 66 0a 20 20 20 20 2a   is a leaf.    *
ccf0: 2a 20 74 61 62 6c 65 20 62 2d 74 72 65 65 20 70  * table b-tree p
cd00: 61 67 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65  age. */.    asse
cd10: 72 74 28 20 28 50 54 46 5f 4c 45 41 46 44 41 54  rt( (PTF_LEAFDAT
cd20: 41 7c 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46  A|PTF_INTKEY|PTF
cd30: 5f 4c 45 41 46 29 3d 3d 31 33 20 29 3b 0a 20 20  _LEAF)==13 );.  
cd40: 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20    pPage->intKey 
cd50: 3d 20 31 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  = 1;.    pPage->
cd60: 69 6e 74 4b 65 79 4c 65 61 66 20 3d 20 70 50 61  intKeyLeaf = pPa
cd70: 67 65 2d 3e 6c 65 61 66 3b 0a 20 20 20 20 70 50  ge->leaf;.    pP
cd80: 61 67 65 2d 3e 6e 6f 50 61 79 6c 6f 61 64 20 3d  age->noPayload =
cd90: 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 3b 0a 20   !pPage->leaf;. 
cda0: 20 20 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63     pPage->maxLoc
cdb0: 61 6c 20 3d 20 70 42 74 2d 3e 6d 61 78 4c 65 61  al = pBt->maxLea
cdc0: 66 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 69  f;.    pPage->mi
cdd0: 6e 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 69  nLocal = pBt->mi
cde0: 6e 4c 65 61 66 3b 0a 20 20 7d 65 6c 73 65 20 69  nLeaf;.  }else i
cdf0: 66 28 20 66 6c 61 67 42 79 74 65 3d 3d 50 54 46  f( flagByte==PTF
ce00: 5f 5a 45 52 4f 44 41 54 41 20 29 7b 0a 20 20 20  _ZERODATA ){.   
ce10: 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
ce20: 20 52 2d 32 37 32 32 35 2d 35 33 39 33 36 20 41   R-27225-53936 A
ce30: 20 76 61 6c 75 65 20 6f 66 20 32 20 6d 65 61 6e   value of 2 mean
ce40: 73 20 74 68 65 20 70 61 67 65 20 69 73 20 61 6e  s the page is an
ce50: 20 69 6e 74 65 72 69 6f 72 0a 20 20 20 20 2a 2a   interior.    **
ce60: 20 69 6e 64 65 78 20 62 2d 74 72 65 65 20 70 61   index b-tree pa
ce70: 67 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  ge. */.    asser
ce80: 74 28 20 28 50 54 46 5f 5a 45 52 4f 44 41 54 41  t( (PTF_ZERODATA
ce90: 29 3d 3d 32 20 29 3b 0a 20 20 20 20 2f 2a 20 45  )==2 );.    /* E
cea0: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 36  VIDENCE-OF: R-16
ceb0: 35 37 31 2d 31 31 36 31 35 20 41 20 76 61 6c 75  571-11615 A valu
cec0: 65 20 6f 66 20 31 30 20 6d 65 61 6e 73 20 74 68  e of 10 means th
ced0: 65 20 70 61 67 65 20 69 73 20 61 20 6c 65 61 66  e page is a leaf
cee0: 0a 20 20 20 20 2a 2a 20 69 6e 64 65 78 20 62 2d  .    ** index b-
cef0: 74 72 65 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20  tree page. */.  
cf00: 20 20 61 73 73 65 72 74 28 20 28 50 54 46 5f 5a    assert( (PTF_Z
cf10: 45 52 4f 44 41 54 41 7c 50 54 46 5f 4c 45 41 46  ERODATA|PTF_LEAF
cf20: 29 3d 3d 31 30 20 29 3b 0a 20 20 20 20 70 50 61  )==10 );.    pPa
cf30: 67 65 2d 3e 69 6e 74 4b 65 79 20 3d 20 30 3b 0a  ge->intKey = 0;.
cf40: 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65      pPage->intKe
cf50: 79 4c 65 61 66 20 3d 20 30 3b 0a 20 20 20 20 70  yLeaf = 0;.    p
cf60: 50 61 67 65 2d 3e 6e 6f 50 61 79 6c 6f 61 64 20  Page->noPayload 
cf70: 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  = 0;.    pPage->
cf80: 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e  maxLocal = pBt->
cf90: 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20 20 20 70 50  maxLocal;.    pP
cfa0: 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20  age->minLocal = 
cfb0: 70 42 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20  pBt->minLocal;. 
cfc0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 45   }else{.    /* E
cfd0: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 37  VIDENCE-OF: R-47
cfe0: 36 30 38 2d 35 36 34 36 39 20 41 6e 79 20 6f 74  608-56469 Any ot
cff0: 68 65 72 20 76 61 6c 75 65 20 66 6f 72 20 74 68  her value for th
d000: 65 20 62 2d 74 72 65 65 20 70 61 67 65 20 74 79  e b-tree page ty
d010: 70 65 20 69 73 0a 20 20 20 20 2a 2a 20 61 6e 20  pe is.    ** an 
d020: 65 72 72 6f 72 2e 20 2a 2f 0a 20 20 20 20 72 65  error. */.    re
d030: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
d040: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  UPT_BKPT;.  }.  
d050: 70 50 61 67 65 2d 3e 6d 61 78 31 62 79 74 65 50  pPage->max1byteP
d060: 61 79 6c 6f 61 64 20 3d 20 70 42 74 2d 3e 6d 61  ayload = pBt->ma
d070: 78 31 62 79 74 65 50 61 79 6c 6f 61 64 3b 0a 20  x1bytePayload;. 
d080: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
d090: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74  K;.}../*.** Init
d0a0: 69 61 6c 69 7a 65 20 74 68 65 20 61 75 78 69 6c  ialize the auxil
d0b0: 69 61 72 79 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  iary information
d0c0: 20 66 6f 72 20 61 20 64 69 73 6b 20 62 6c 6f 63   for a disk bloc
d0d0: 6b 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  k..**.** Return 
d0e0: 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63  SQLITE_OK on suc
d0f0: 63 65 73 73 2e 20 20 49 66 20 77 65 20 73 65 65  cess.  If we see
d100: 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 64   that the page d
d110: 6f 65 73 0a 2a 2a 20 6e 6f 74 20 63 6f 6e 74 61  oes.** not conta
d120: 69 6e 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64  in a well-formed
d130: 20 64 61 74 61 62 61 73 65 20 70 61 67 65 2c 20   database page, 
d140: 74 68 65 6e 20 72 65 74 75 72 6e 20 0a 2a 2a 20  then return .** 
d150: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2e 20  SQLITE_CORRUPT. 
d160: 20 4e 6f 74 65 20 74 68 61 74 20 61 20 72 65 74   Note that a ret
d170: 75 72 6e 20 6f 66 20 53 51 4c 49 54 45 5f 4f 4b  urn of SQLITE_OK
d180: 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 67 75 61   does not.** gua
d190: 72 61 6e 74 65 65 20 74 68 61 74 20 74 68 65 20  rantee that the 
d1a0: 70 61 67 65 20 69 73 20 77 65 6c 6c 2d 66 6f 72  page is well-for
d1b0: 6d 65 64 2e 20 20 49 74 20 6f 6e 6c 79 20 73 68  med.  It only sh
d1c0: 6f 77 73 20 74 68 61 74 0a 2a 2a 20 77 65 20 66  ows that.** we f
d1d0: 61 69 6c 65 64 20 74 6f 20 64 65 74 65 63 74 20  ailed to detect 
d1e0: 61 6e 79 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a  any corruption..
d1f0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74  */.static int bt
d200: 72 65 65 49 6e 69 74 50 61 67 65 28 4d 65 6d 50  reeInitPage(MemP
d210: 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 0a 20 20  age *pPage){..  
d220: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70  assert( pPage->p
d230: 42 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  Bt!=0 );.  asser
d240: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
d250: 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
d260: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
d270: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 67 6e  sert( pPage->pgn
d280: 6f 3d 3d 73 71 6c 69 74 65 33 50 61 67 65 72 50  o==sqlite3PagerP
d290: 61 67 65 6e 75 6d 62 65 72 28 70 50 61 67 65 2d  agenumber(pPage-
d2a0: 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61  >pDbPage) );.  a
d2b0: 73 73 65 72 74 28 20 70 50 61 67 65 20 3d 3d 20  ssert( pPage == 
d2c0: 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45  sqlite3PagerGetE
d2d0: 78 74 72 61 28 70 50 61 67 65 2d 3e 70 44 62 50  xtra(pPage->pDbP
d2e0: 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74  age) );.  assert
d2f0: 28 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 3d  ( pPage->aData =
d300: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  = sqlite3PagerGe
d310: 74 44 61 74 61 28 70 50 61 67 65 2d 3e 70 44 62  tData(pPage->pDb
d320: 50 61 67 65 29 20 29 3b 0a 0a 20 20 69 66 28 20  Page) );..  if( 
d330: 21 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29  !pPage->isInit )
d340: 7b 0a 20 20 20 20 75 31 36 20 70 63 3b 20 20 20  {.    u16 pc;   
d350: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
d360: 65 73 73 20 6f 66 20 61 20 66 72 65 65 62 6c 6f  ess of a freeblo
d370: 63 6b 20 77 69 74 68 69 6e 20 70 50 61 67 65 2d  ck within pPage-
d380: 3e 61 44 61 74 61 5b 5d 20 2a 2f 0a 20 20 20 20  >aData[] */.    
d390: 75 38 20 68 64 72 3b 20 20 20 20 20 20 20 20 20  u8 hdr;         
d3a0: 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20     /* Offset to 
d3b0: 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 70 61 67  beginning of pag
d3c0: 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 20 20  e header */.    
d3d0: 75 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20  u8 *data;       
d3e0: 20 20 20 2f 2a 20 45 71 75 61 6c 20 74 6f 20 70     /* Equal to p
d3f0: 50 61 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20  Page->aData */. 
d400: 20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74     BtShared *pBt
d410: 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ;        /* The 
d420: 6d 61 69 6e 20 62 74 72 65 65 20 73 74 72 75 63  main btree struc
d430: 74 75 72 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ture */.    int 
d440: 75 73 61 62 6c 65 53 69 7a 65 3b 20 20 20 20 2f  usableSize;    /
d450: 2a 20 41 6d 6f 75 6e 74 20 6f 66 20 75 73 61 62  * Amount of usab
d460: 6c 65 20 73 70 61 63 65 20 6f 6e 20 65 61 63 68  le space on each
d470: 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 75 31 36   page */.    u16
d480: 20 63 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20 20   cellOffset;    
d490: 2f 2a 20 4f 66 66 73 65 74 20 66 72 6f 6d 20 73  /* Offset from s
d4a0: 74 61 72 74 20 6f 66 20 70 61 67 65 20 74 6f 20  tart of page to 
d4b0: 66 69 72 73 74 20 63 65 6c 6c 20 70 6f 69 6e 74  first cell point
d4c0: 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 46  er */.    int nF
d4d0: 72 65 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ree;         /* 
d4e0: 4e 75 6d 62 65 72 20 6f 66 20 75 6e 75 73 65 64  Number of unused
d4f0: 20 62 79 74 65 73 20 6f 6e 20 74 68 65 20 70 61   bytes on the pa
d500: 67 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 74 6f  ge */.    int to
d510: 70 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  p;           /* 
d520: 46 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68  First byte of th
d530: 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61  e cell content a
d540: 72 65 61 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  rea */.    int i
d550: 43 65 6c 6c 46 69 72 73 74 3b 20 20 20 20 2f 2a  CellFirst;    /*
d560: 20 46 69 72 73 74 20 61 6c 6c 6f 77 61 62 6c 65   First allowable
d570: 20 63 65 6c 6c 20 6f 72 20 66 72 65 65 62 6c 6f   cell or freeblo
d580: 63 6b 20 6f 66 66 73 65 74 20 2a 2f 0a 20 20 20  ck offset */.   
d590: 20 69 6e 74 20 69 43 65 6c 6c 4c 61 73 74 3b 20   int iCellLast; 
d5a0: 20 20 20 20 2f 2a 20 4c 61 73 74 20 70 6f 73 73      /* Last poss
d5b0: 69 62 6c 65 20 63 65 6c 6c 20 6f 72 20 66 72 65  ible cell or fre
d5c0: 65 62 6c 6f 63 6b 20 6f 66 66 73 65 74 20 2a 2f  eblock offset */
d5d0: 0a 0a 20 20 20 20 70 42 74 20 3d 20 70 50 61 67  ..    pBt = pPag
d5e0: 65 2d 3e 70 42 74 3b 0a 0a 20 20 20 20 68 64 72  e->pBt;..    hdr
d5f0: 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66   = pPage->hdrOff
d600: 73 65 74 3b 0a 20 20 20 20 64 61 74 61 20 3d 20  set;.    data = 
d610: 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20  pPage->aData;.  
d620: 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
d630: 3a 20 52 2d 32 38 35 39 34 2d 30 32 38 39 30 20  : R-28594-02890 
d640: 54 68 65 20 6f 6e 65 2d 62 79 74 65 20 66 6c 61  The one-byte fla
d650: 67 20 61 74 20 6f 66 66 73 65 74 20 30 20 69 6e  g at offset 0 in
d660: 64 69 63 61 74 69 6e 67 0a 20 20 20 20 2a 2a 20  dicating.    ** 
d670: 74 68 65 20 62 2d 74 72 65 65 20 70 61 67 65 20  the b-tree page 
d680: 74 79 70 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28  type. */.    if(
d690: 20 64 65 63 6f 64 65 46 6c 61 67 73 28 70 50 61   decodeFlags(pPa
d6a0: 67 65 2c 20 64 61 74 61 5b 68 64 72 5d 29 20 29  ge, data[hdr]) )
d6b0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
d6c0: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
d6d0: 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70 61   assert( pBt->pa
d6e0: 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70  geSize>=512 && p
d6f0: 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c 3d 36 35  Bt->pageSize<=65
d700: 35 33 36 20 29 3b 0a 20 20 20 20 70 50 61 67 65  536 );.    pPage
d710: 2d 3e 6d 61 73 6b 50 61 67 65 20 3d 20 28 75 31  ->maskPage = (u1
d720: 36 29 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  6)(pBt->pageSize
d730: 20 2d 20 31 29 3b 0a 20 20 20 20 70 50 61 67 65   - 1);.    pPage
d740: 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b  ->nOverflow = 0;
d750: 0a 20 20 20 20 75 73 61 62 6c 65 53 69 7a 65 20  .    usableSize 
d760: 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  = pBt->usableSiz
d770: 65 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 63 65  e;.    pPage->ce
d780: 6c 6c 4f 66 66 73 65 74 20 3d 20 63 65 6c 6c 4f  llOffset = cellO
d790: 66 66 73 65 74 20 3d 20 68 64 72 20 2b 20 38 20  ffset = hdr + 8 
d7a0: 2b 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74  + pPage->childPt
d7b0: 72 53 69 7a 65 3b 0a 20 20 20 20 70 50 61 67 65  rSize;.    pPage
d7c0: 2d 3e 61 44 61 74 61 45 6e 64 20 3d 20 26 64 61  ->aDataEnd = &da
d7d0: 74 61 5b 75 73 61 62 6c 65 53 69 7a 65 5d 3b 0a  ta[usableSize];.
d7e0: 20 20 20 20 70 50 61 67 65 2d 3e 61 43 65 6c 6c      pPage->aCell
d7f0: 49 64 78 20 3d 20 26 64 61 74 61 5b 63 65 6c 6c  Idx = &data[cell
d800: 4f 66 66 73 65 74 5d 3b 0a 20 20 20 20 2f 2a 20  Offset];.    /* 
d810: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35  EVIDENCE-OF: R-5
d820: 38 30 31 35 2d 34 38 31 37 35 20 54 68 65 20 74  8015-48175 The t
d830: 77 6f 2d 62 79 74 65 20 69 6e 74 65 67 65 72 20  wo-byte integer 
d840: 61 74 20 6f 66 66 73 65 74 20 35 20 64 65 73 69  at offset 5 desi
d850: 67 6e 61 74 65 73 0a 20 20 20 20 2a 2a 20 74 68  gnates.    ** th
d860: 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 63  e start of the c
d870: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
d880: 2e 20 41 20 7a 65 72 6f 20 76 61 6c 75 65 20 66  . A zero value f
d890: 6f 72 20 74 68 69 73 20 69 6e 74 65 67 65 72 20  or this integer 
d8a0: 69 73 0a 20 20 20 20 2a 2a 20 69 6e 74 65 72 70  is.    ** interp
d8b0: 72 65 74 65 64 20 61 73 20 36 35 35 33 36 2e 20  reted as 65536. 
d8c0: 2a 2f 0a 20 20 20 20 74 6f 70 20 3d 20 67 65 74  */.    top = get
d8d0: 32 62 79 74 65 4e 6f 74 5a 65 72 6f 28 26 64 61  2byteNotZero(&da
d8e0: 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20  ta[hdr+5]);.    
d8f0: 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
d900: 52 2d 33 37 30 30 32 2d 33 32 37 37 34 20 54 68  R-37002-32774 Th
d910: 65 20 74 77 6f 2d 62 79 74 65 20 69 6e 74 65 67  e two-byte integ
d920: 65 72 20 61 74 20 6f 66 66 73 65 74 20 33 20 67  er at offset 3 g
d930: 69 76 65 73 20 74 68 65 0a 20 20 20 20 2a 2a 20  ives the.    ** 
d940: 6e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20  number of cells 
d950: 6f 6e 20 74 68 65 20 70 61 67 65 2e 20 2a 2f 0a  on the page. */.
d960: 20 20 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c      pPage->nCell
d970: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
d980: 61 5b 68 64 72 2b 33 5d 29 3b 0a 20 20 20 20 69  a[hdr+3]);.    i
d990: 66 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e  f( pPage->nCell>
d9a0: 4d 58 5f 43 45 4c 4c 28 70 42 74 29 20 29 7b 0a  MX_CELL(pBt) ){.
d9b0: 20 20 20 20 20 20 2f 2a 20 54 6f 20 6d 61 6e 79        /* To many
d9c0: 20 63 65 6c 6c 73 20 66 6f 72 20 61 20 73 69 6e   cells for a sin
d9d0: 67 6c 65 20 70 61 67 65 2e 20 20 54 68 65 20 70  gle page.  The p
d9e0: 61 67 65 20 6d 75 73 74 20 62 65 20 63 6f 72 72  age must be corr
d9f0: 75 70 74 20 2a 2f 0a 20 20 20 20 20 20 72 65 74  upt */.      ret
da00: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
da10: 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20  PT_BKPT;.    }. 
da20: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 50 61     testcase( pPa
da30: 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 4d 58 5f 43 45  ge->nCell==MX_CE
da40: 4c 4c 28 70 42 74 29 20 29 3b 0a 20 20 20 20 2f  LL(pBt) );.    /
da50: 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
da60: 2d 32 34 30 38 39 2d 35 37 39 37 39 20 49 66 20  -24089-57979 If 
da70: 61 20 70 61 67 65 20 63 6f 6e 74 61 69 6e 73 20  a page contains 
da80: 6e 6f 20 63 65 6c 6c 73 20 28 77 68 69 63 68 20  no cells (which 
da90: 69 73 20 6f 6e 6c 79 0a 20 20 20 20 2a 2a 20 70  is only.    ** p
daa0: 6f 73 73 69 62 6c 65 20 66 6f 72 20 61 20 72 6f  ossible for a ro
dab0: 6f 74 20 70 61 67 65 20 6f 66 20 61 20 74 61 62  ot page of a tab
dac0: 6c 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  le that contains
dad0: 20 6e 6f 20 72 6f 77 73 29 20 74 68 65 6e 20 74   no rows) then t
dae0: 68 65 0a 20 20 20 20 2a 2a 20 6f 66 66 73 65 74  he.    ** offset
daf0: 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e   to the cell con
db00: 74 65 6e 74 20 61 72 65 61 20 77 69 6c 6c 20 65  tent area will e
db10: 71 75 61 6c 20 74 68 65 20 70 61 67 65 20 73 69  qual the page si
db20: 7a 65 20 6d 69 6e 75 73 20 74 68 65 0a 20 20 20  ze minus the.   
db30: 20 2a 2a 20 62 79 74 65 73 20 6f 66 20 72 65 73   ** bytes of res
db40: 65 72 76 65 64 20 73 70 61 63 65 2e 20 2a 2f 0a  erved space. */.
db50: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
db60: 65 2d 3e 6e 43 65 6c 6c 3e 30 20 7c 7c 20 74 6f  e->nCell>0 || to
db70: 70 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20 7c 7c  p==usableSize ||
db80: 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 0a   CORRUPT_DB );..
db90: 20 20 20 20 2f 2a 20 41 20 6d 61 6c 66 6f 72 6d      /* A malform
dba0: 65 64 20 64 61 74 61 62 61 73 65 20 70 61 67 65  ed database page
dbb0: 20 6d 69 67 68 74 20 63 61 75 73 65 20 75 73 20   might cause us 
dbc0: 74 6f 20 72 65 61 64 20 70 61 73 74 20 74 68 65  to read past the
dbd0: 20 65 6e 64 0a 20 20 20 20 2a 2a 20 6f 66 20 70   end.    ** of p
dbe0: 61 67 65 20 77 68 65 6e 20 70 61 72 73 69 6e 67  age when parsing
dbf0: 20 61 20 63 65 6c 6c 2e 20 20 0a 20 20 20 20 2a   a cell.  .    *
dc00: 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 66 6f 6c  *.    ** The fol
dc10: 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 6f 66 20  lowing block of 
dc20: 63 6f 64 65 20 63 68 65 63 6b 73 20 65 61 72 6c  code checks earl
dc30: 79 20 74 6f 20 73 65 65 20 69 66 20 61 20 63 65  y to see if a ce
dc40: 6c 6c 20 65 78 74 65 6e 64 73 0a 20 20 20 20 2a  ll extends.    *
dc50: 2a 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f  * past the end o
dc60: 66 20 61 20 70 61 67 65 20 62 6f 75 6e 64 61 72  f a page boundar
dc70: 79 20 61 6e 64 20 63 61 75 73 65 73 20 53 51 4c  y and causes SQL
dc80: 49 54 45 5f 43 4f 52 52 55 50 54 20 74 6f 20 62  ITE_CORRUPT to b
dc90: 65 20 0a 20 20 20 20 2a 2a 20 72 65 74 75 72 6e  e .    ** return
dca0: 65 64 20 69 66 20 69 74 20 64 6f 65 73 2e 0a 20  ed if it does.. 
dcb0: 20 20 20 2a 2f 0a 20 20 20 20 69 43 65 6c 6c 46     */.    iCellF
dcc0: 69 72 73 74 20 3d 20 63 65 6c 6c 4f 66 66 73 65  irst = cellOffse
dcd0: 74 20 2b 20 32 2a 70 50 61 67 65 2d 3e 6e 43 65  t + 2*pPage->nCe
dce0: 6c 6c 3b 0a 20 20 20 20 69 43 65 6c 6c 4c 61 73  ll;.    iCellLas
dcf0: 74 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 20 2d  t = usableSize -
dd00: 20 34 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28   4;.#if defined(
dd10: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4f 56  SQLITE_ENABLE_OV
dd20: 45 52 53 49 5a 45 5f 43 45 4c 4c 5f 43 48 45 43  ERSIZE_CELL_CHEC
dd30: 4b 29 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 69  K).    {.      i
dd40: 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
dd50: 20 2f 2a 20 49 6e 64 65 78 20 69 6e 74 6f 20 74   /* Index into t
dd60: 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20  he cell pointer 
dd70: 61 72 72 61 79 20 2a 2f 0a 20 20 20 20 20 20 69  array */.      i
dd80: 6e 74 20 73 7a 3b 20 20 20 20 20 20 20 20 20 20  nt sz;          
dd90: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 20 63 65   /* Size of a ce
dda0: 6c 6c 20 2a 2f 0a 0a 20 20 20 20 20 20 69 66 28  ll */..      if(
ddb0: 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 20   !pPage->leaf ) 
ddc0: 69 43 65 6c 6c 4c 61 73 74 2d 2d 3b 0a 20 20 20  iCellLast--;.   
ddd0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50     for(i=0; i<pP
dde0: 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 29  age->nCell; i++)
ddf0: 7b 0a 20 20 20 20 20 20 20 20 70 63 20 3d 20 67  {.        pc = g
de00: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 63 65  et2byte(&data[ce
de10: 6c 6c 4f 66 66 73 65 74 2b 69 2a 32 5d 29 3b 0a  llOffset+i*2]);.
de20: 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
de30: 28 20 70 63 3d 3d 69 43 65 6c 6c 46 69 72 73 74  ( pc==iCellFirst
de40: 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74   );.        test
de50: 63 61 73 65 28 20 70 63 3d 3d 69 43 65 6c 6c 4c  case( pc==iCellL
de60: 61 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20 69  ast );.        i
de70: 66 28 20 70 63 3c 69 43 65 6c 6c 46 69 72 73 74  f( pc<iCellFirst
de80: 20 7c 7c 20 70 63 3e 69 43 65 6c 6c 4c 61 73 74   || pc>iCellLast
de90: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
dea0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
deb0: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
dec0: 20 20 7d 0a 20 20 20 20 20 20 20 20 73 7a 20 3d    }.        sz =
ded0: 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61   cellSizePtr(pPa
dee0: 67 65 2c 20 26 64 61 74 61 5b 70 63 5d 29 3b 0a  ge, &data[pc]);.
def0: 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
df00: 28 20 70 63 2b 73 7a 3d 3d 75 73 61 62 6c 65 53  ( pc+sz==usableS
df10: 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 20 20 69  ize );.        i
df20: 66 28 20 70 63 2b 73 7a 3e 75 73 61 62 6c 65 53  f( pc+sz>usableS
df30: 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ize ){.         
df40: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
df50: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
df60: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
df70: 20 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d       if( !pPage-
df80: 3e 6c 65 61 66 20 29 20 69 43 65 6c 6c 4c 61 73  >leaf ) iCellLas
df90: 74 2b 2b 3b 0a 20 20 20 20 7d 20 20 0a 23 65 6e  t++;.    }  .#en
dfa0: 64 69 66 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70  dif..    /* Comp
dfb0: 75 74 65 20 74 68 65 20 74 6f 74 61 6c 20 66 72  ute the total fr
dfc0: 65 65 20 73 70 61 63 65 20 6f 6e 20 74 68 65 20  ee space on the 
dfd0: 70 61 67 65 0a 20 20 20 20 2a 2a 20 45 56 49 44  page.    ** EVID
dfe0: 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 33 35 38 38  ENCE-OF: R-23588
dff0: 2d 33 34 34 35 30 20 54 68 65 20 74 77 6f 2d 62  -34450 The two-b
e000: 79 74 65 20 69 6e 74 65 67 65 72 20 61 74 20 6f  yte integer at o
e010: 66 66 73 65 74 20 31 20 67 69 76 65 73 20 74 68  ffset 1 gives th
e020: 65 0a 20 20 20 20 2a 2a 20 73 74 61 72 74 20 6f  e.    ** start o
e030: 66 20 74 68 65 20 66 69 72 73 74 20 66 72 65 65  f the first free
e040: 62 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 70 61 67  block on the pag
e050: 65 2c 20 6f 72 20 69 73 20 7a 65 72 6f 20 69 66  e, or is zero if
e060: 20 74 68 65 72 65 20 61 72 65 20 6e 6f 0a 20 20   there are no.  
e070: 20 20 2a 2a 20 66 72 65 65 62 6c 6f 63 6b 73 2e    ** freeblocks.
e080: 20 2a 2f 0a 20 20 20 20 70 63 20 3d 20 67 65 74   */.    pc = get
e090: 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
e0a0: 31 5d 29 3b 0a 20 20 20 20 6e 46 72 65 65 20 3d  1]);.    nFree =
e0b0: 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 2b 20 74   data[hdr+7] + t
e0c0: 6f 70 3b 20 20 2f 2a 20 49 6e 69 74 20 6e 46 72  op;  /* Init nFr
e0d0: 65 65 20 74 6f 20 6e 6f 6e 2d 66 72 65 65 62 6c  ee to non-freebl
e0e0: 6f 63 6b 20 66 72 65 65 20 73 70 61 63 65 20 2a  ock free space *
e0f0: 2f 0a 20 20 20 20 77 68 69 6c 65 28 20 70 63 3e  /.    while( pc>
e100: 30 20 29 7b 0a 20 20 20 20 20 20 75 31 36 20 6e  0 ){.      u16 n
e110: 65 78 74 2c 20 73 69 7a 65 3b 0a 20 20 20 20 20  ext, size;.     
e120: 20 69 66 28 20 70 63 3c 69 43 65 6c 6c 46 69 72   if( pc<iCellFir
e130: 73 74 20 7c 7c 20 70 63 3e 69 43 65 6c 6c 4c 61  st || pc>iCellLa
e140: 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  st ){.        /*
e150: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
e160: 35 35 35 33 30 2d 35 32 39 33 30 20 49 6e 20 61  55530-52930 In a
e170: 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 62 2d 74   well-formed b-t
e180: 72 65 65 20 70 61 67 65 2c 20 74 68 65 72 65 20  ree page, there 
e190: 77 69 6c 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20  will.        ** 
e1a0: 61 6c 77 61 79 73 20 62 65 20 61 74 20 6c 65 61  always be at lea
e1b0: 73 74 20 6f 6e 65 20 63 65 6c 6c 20 62 65 66 6f  st one cell befo
e1c0: 72 65 20 74 68 65 20 66 69 72 73 74 20 66 72 65  re the first fre
e1d0: 65 62 6c 6f 63 6b 2e 0a 20 20 20 20 20 20 20 20  eblock..        
e1e0: 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f 72  **.        ** Or
e1f0: 2c 20 74 68 65 20 66 72 65 65 62 6c 6f 63 6b 20  , the freeblock 
e200: 69 73 20 6f 66 66 20 74 68 65 20 65 6e 64 20 6f  is off the end o
e210: 66 20 74 68 65 20 70 61 67 65 0a 20 20 20 20 20  f the page.     
e220: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65     */.        re
e230: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
e240: 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20 20 20 20  UPT_BKPT; .     
e250: 20 7d 0a 20 20 20 20 20 20 6e 65 78 74 20 3d 20   }.      next = 
e260: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70  get2byte(&data[p
e270: 63 5d 29 3b 0a 20 20 20 20 20 20 73 69 7a 65 20  c]);.      size 
e280: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
e290: 5b 70 63 2b 32 5d 29 3b 0a 20 20 20 20 20 20 69  [pc+2]);.      i
e2a0: 66 28 20 28 6e 65 78 74 3e 30 20 26 26 20 6e 65  f( (next>0 && ne
e2b0: 78 74 3c 3d 70 63 2b 73 69 7a 65 2b 33 29 20 7c  xt<=pc+size+3) |
e2c0: 7c 20 70 63 2b 73 69 7a 65 3e 75 73 61 62 6c 65  | pc+size>usable
e2d0: 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Size ){.        
e2e0: 2f 2a 20 46 72 65 65 20 62 6c 6f 63 6b 73 20 6d  /* Free blocks m
e2f0: 75 73 74 20 62 65 20 69 6e 20 61 73 63 65 6e 64  ust be in ascend
e300: 69 6e 67 20 6f 72 64 65 72 2e 20 41 6e 64 20 74  ing order. And t
e310: 68 65 20 6c 61 73 74 20 62 79 74 65 20 6f 66 0a  he last byte of.
e320: 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 66          ** the f
e330: 72 65 65 2d 62 6c 6f 63 6b 20 6d 75 73 74 20 6c  ree-block must l
e340: 69 65 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ie on the databa
e350: 73 65 20 70 61 67 65 2e 20 20 2a 2f 0a 20 20 20  se page.  */.   
e360: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
e370: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
e380: 20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20   .      }.      
e390: 6e 46 72 65 65 20 3d 20 6e 46 72 65 65 20 2b 20  nFree = nFree + 
e3a0: 73 69 7a 65 3b 0a 20 20 20 20 20 20 70 63 20 3d  size;.      pc =
e3b0: 20 6e 65 78 74 3b 0a 20 20 20 20 7d 0a 0a 20 20   next;.    }..  
e3c0: 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69    /* At this poi
e3d0: 6e 74 2c 20 6e 46 72 65 65 20 63 6f 6e 74 61 69  nt, nFree contai
e3e0: 6e 73 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68  ns the sum of th
e3f0: 65 20 6f 66 66 73 65 74 20 74 6f 20 74 68 65 20  e offset to the 
e400: 73 74 61 72 74 0a 20 20 20 20 2a 2a 20 6f 66 20  start.    ** of 
e410: 74 68 65 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74  the cell-content
e420: 20 61 72 65 61 20 70 6c 75 73 20 74 68 65 20 6e   area plus the n
e430: 75 6d 62 65 72 20 6f 66 20 66 72 65 65 20 62 79  umber of free by
e440: 74 65 73 20 77 69 74 68 69 6e 0a 20 20 20 20 2a  tes within.    *
e450: 2a 20 74 68 65 20 63 65 6c 6c 2d 63 6f 6e 74 65  * the cell-conte
e460: 6e 74 20 61 72 65 61 2e 20 49 66 20 74 68 69 73  nt area. If this
e470: 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
e480: 20 74 68 65 20 75 73 61 62 6c 65 2d 73 69 7a 65   the usable-size
e490: 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 70  .    ** of the p
e4a0: 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20 70 61  age, then the pa
e4b0: 67 65 20 6d 75 73 74 20 62 65 20 63 6f 72 72 75  ge must be corru
e4c0: 70 74 65 64 2e 20 54 68 69 73 20 63 68 65 63 6b  pted. This check
e4d0: 20 61 6c 73 6f 0a 20 20 20 20 2a 2a 20 73 65 72   also.    ** ser
e4e0: 76 65 73 20 74 6f 20 76 65 72 69 66 79 20 74 68  ves to verify th
e4f0: 61 74 20 74 68 65 20 6f 66 66 73 65 74 20 74 6f  at the offset to
e500: 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
e510: 65 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 0a 20  e cell-content. 
e520: 20 20 20 2a 2a 20 61 72 65 61 2c 20 61 63 63 6f     ** area, acco
e530: 72 64 69 6e 67 20 74 6f 20 74 68 65 20 70 61 67  rding to the pag
e540: 65 20 68 65 61 64 65 72 2c 20 6c 69 65 73 20 77  e header, lies w
e550: 69 74 68 69 6e 20 74 68 65 20 70 61 67 65 2e 0a  ithin the page..
e560: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e      */.    if( n
e570: 46 72 65 65 3e 75 73 61 62 6c 65 53 69 7a 65 20  Free>usableSize 
e580: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
e590: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
e5a0: 4b 50 54 3b 20 0a 20 20 20 20 7d 0a 20 20 20 20  KPT; .    }.    
e5b0: 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20 28  pPage->nFree = (
e5c0: 75 31 36 29 28 6e 46 72 65 65 20 2d 20 69 43 65  u16)(nFree - iCe
e5d0: 6c 6c 46 69 72 73 74 29 3b 0a 20 20 20 20 70 50  llFirst);.    pP
e5e0: 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 31 3b  age->isInit = 1;
e5f0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
e600: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
e610: 2a 20 53 65 74 20 75 70 20 61 20 72 61 77 20 70  * Set up a raw p
e620: 61 67 65 20 73 6f 20 74 68 61 74 20 69 74 20 6c  age so that it l
e630: 6f 6f 6b 73 20 6c 69 6b 65 20 61 20 64 61 74 61  ooks like a data
e640: 62 61 73 65 20 70 61 67 65 20 68 6f 6c 64 69 6e  base page holdin
e650: 67 0a 2a 2a 20 6e 6f 20 65 6e 74 72 69 65 73 2e  g.** no entries.
e660: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
e670: 7a 65 72 6f 50 61 67 65 28 4d 65 6d 50 61 67 65  zeroPage(MemPage
e680: 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 66 6c 61   *pPage, int fla
e690: 67 73 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20  gs){.  unsigned 
e6a0: 63 68 61 72 20 2a 64 61 74 61 20 3d 20 70 50 61  char *data = pPa
e6b0: 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 42 74 53  ge->aData;.  BtS
e6c0: 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61  hared *pBt = pPa
e6d0: 67 65 2d 3e 70 42 74 3b 0a 20 20 75 38 20 68 64  ge->pBt;.  u8 hd
e6e0: 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66  r = pPage->hdrOf
e6f0: 66 73 65 74 3b 0a 20 20 75 31 36 20 66 69 72 73  fset;.  u16 firs
e700: 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  t;..  assert( sq
e710: 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 6e 75  lite3PagerPagenu
e720: 6d 62 65 72 28 70 50 61 67 65 2d 3e 70 44 62 50  mber(pPage->pDbP
e730: 61 67 65 29 3d 3d 70 50 61 67 65 2d 3e 70 67 6e  age)==pPage->pgn
e740: 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  o );.  assert( s
e750: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78  qlite3PagerGetEx
e760: 74 72 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61  tra(pPage->pDbPa
e770: 67 65 29 20 3d 3d 20 28 76 6f 69 64 2a 29 70 50  ge) == (void*)pP
e780: 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  age );.  assert(
e790: 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
e7a0: 44 61 74 61 28 70 50 61 67 65 2d 3e 70 44 62 50  Data(pPage->pDbP
e7b0: 61 67 65 29 20 3d 3d 20 64 61 74 61 20 29 3b 0a  age) == data );.
e7c0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
e7d0: 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
e7e0: 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
e7f0: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
e800: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
e810: 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
e820: 0a 20 20 69 66 28 20 70 42 74 2d 3e 62 74 73 46  .  if( pBt->btsF
e830: 6c 61 67 73 20 26 20 42 54 53 5f 53 45 43 55 52  lags & BTS_SECUR
e840: 45 5f 44 45 4c 45 54 45 20 29 7b 0a 20 20 20 20  E_DELETE ){.    
e850: 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 68 64 72  memset(&data[hdr
e860: 5d 2c 20 30 2c 20 70 42 74 2d 3e 75 73 61 62 6c  ], 0, pBt->usabl
e870: 65 53 69 7a 65 20 2d 20 68 64 72 29 3b 0a 20 20  eSize - hdr);.  
e880: 7d 0a 20 20 64 61 74 61 5b 68 64 72 5d 20 3d 20  }.  data[hdr] = 
e890: 28 63 68 61 72 29 66 6c 61 67 73 3b 0a 20 20 66  (char)flags;.  f
e8a0: 69 72 73 74 20 3d 20 68 64 72 20 2b 20 28 28 66  irst = hdr + ((f
e8b0: 6c 61 67 73 26 50 54 46 5f 4c 45 41 46 29 3d 3d  lags&PTF_LEAF)==
e8c0: 30 20 3f 20 31 32 20 3a 20 38 29 3b 0a 20 20 6d  0 ? 12 : 8);.  m
e8d0: 65 6d 73 65 74 28 26 64 61 74 61 5b 68 64 72 2b  emset(&data[hdr+
e8e0: 31 5d 2c 20 30 2c 20 34 29 3b 0a 20 20 64 61 74  1], 0, 4);.  dat
e8f0: 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a 20 20  a[hdr+7] = 0;.  
e900: 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  put2byte(&data[h
e910: 64 72 2b 35 5d 2c 20 70 42 74 2d 3e 75 73 61 62  dr+5], pBt->usab
e920: 6c 65 53 69 7a 65 29 3b 0a 20 20 70 50 61 67 65  leSize);.  pPage
e930: 2d 3e 6e 46 72 65 65 20 3d 20 28 75 31 36 29 28  ->nFree = (u16)(
e940: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
e950: 2d 20 66 69 72 73 74 29 3b 0a 20 20 64 65 63 6f  - first);.  deco
e960: 64 65 46 6c 61 67 73 28 70 50 61 67 65 2c 20 66  deFlags(pPage, f
e970: 6c 61 67 73 29 3b 0a 20 20 70 50 61 67 65 2d 3e  lags);.  pPage->
e980: 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 66 69 72  cellOffset = fir
e990: 73 74 3b 0a 20 20 70 50 61 67 65 2d 3e 61 44 61  st;.  pPage->aDa
e9a0: 74 61 45 6e 64 20 3d 20 26 64 61 74 61 5b 70 42  taEnd = &data[pB
e9b0: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 5d 3b 0a  t->usableSize];.
e9c0: 20 20 70 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64    pPage->aCellId
e9d0: 78 20 3d 20 26 64 61 74 61 5b 66 69 72 73 74 5d  x = &data[first]
e9e0: 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72  ;.  pPage->nOver
e9f0: 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 61 73 73 65  flow = 0;.  asse
ea00: 72 74 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  rt( pBt->pageSiz
ea10: 65 3e 3d 35 31 32 20 26 26 20 70 42 74 2d 3e 70  e>=512 && pBt->p
ea20: 61 67 65 53 69 7a 65 3c 3d 36 35 35 33 36 20 29  ageSize<=65536 )
ea30: 3b 0a 20 20 70 50 61 67 65 2d 3e 6d 61 73 6b 50  ;.  pPage->maskP
ea40: 61 67 65 20 3d 20 28 75 31 36 29 28 70 42 74 2d  age = (u16)(pBt-
ea50: 3e 70 61 67 65 53 69 7a 65 20 2d 20 31 29 3b 0a  >pageSize - 1);.
ea60: 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d    pPage->nCell =
ea70: 20 30 3b 0a 20 20 70 50 61 67 65 2d 3e 69 73 49   0;.  pPage->isI
ea80: 6e 69 74 20 3d 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a  nit = 1;.}.../*.
ea90: 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20 44 62 50  ** Convert a DbP
eaa0: 61 67 65 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  age obtained fro
eab0: 6d 20 74 68 65 20 70 61 67 65 72 20 69 6e 74 6f  m the pager into
eac0: 20 61 20 4d 65 6d 50 61 67 65 20 75 73 65 64 20   a MemPage used 
ead0: 62 79 0a 2a 2a 20 74 68 65 20 62 74 72 65 65 20  by.** the btree 
eae0: 6c 61 79 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  layer..*/.static
eaf0: 20 4d 65 6d 50 61 67 65 20 2a 62 74 72 65 65 50   MemPage *btreeP
eb00: 61 67 65 46 72 6f 6d 44 62 50 61 67 65 28 44 62  ageFromDbPage(Db
eb10: 50 61 67 65 20 2a 70 44 62 50 61 67 65 2c 20 50  Page *pDbPage, P
eb20: 67 6e 6f 20 70 67 6e 6f 2c 20 42 74 53 68 61 72  gno pgno, BtShar
eb30: 65 64 20 2a 70 42 74 29 7b 0a 20 20 4d 65 6d 50  ed *pBt){.  MemP
eb40: 61 67 65 20 2a 70 50 61 67 65 20 3d 20 28 4d 65  age *pPage = (Me
eb50: 6d 50 61 67 65 2a 29 73 71 6c 69 74 65 33 50 61  mPage*)sqlite3Pa
eb60: 67 65 72 47 65 74 45 78 74 72 61 28 70 44 62 50  gerGetExtra(pDbP
eb70: 61 67 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e 61  age);.  pPage->a
eb80: 44 61 74 61 20 3d 20 73 71 6c 69 74 65 33 50 61  Data = sqlite3Pa
eb90: 67 65 72 47 65 74 44 61 74 61 28 70 44 62 50 61  gerGetData(pDbPa
eba0: 67 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e 70 44  ge);.  pPage->pD
ebb0: 62 50 61 67 65 20 3d 20 70 44 62 50 61 67 65 3b  bPage = pDbPage;
ebc0: 0a 20 20 70 50 61 67 65 2d 3e 70 42 74 20 3d 20  .  pPage->pBt = 
ebd0: 70 42 74 3b 0a 20 20 70 50 61 67 65 2d 3e 70 67  pBt;.  pPage->pg
ebe0: 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20 70 50 61  no = pgno;.  pPa
ebf0: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 20 3d 20  ge->hdrOffset = 
ec00: 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 31 20 3f  pPage->pgno==1 ?
ec10: 20 31 30 30 20 3a 20 30 3b 0a 20 20 72 65 74 75   100 : 0;.  retu
ec20: 72 6e 20 70 50 61 67 65 3b 20 0a 7d 0a 0a 2f 2a  rn pPage; .}../*
ec30: 0a 2a 2a 20 47 65 74 20 61 20 70 61 67 65 20 66  .** Get a page f
ec40: 72 6f 6d 20 74 68 65 20 70 61 67 65 72 2e 20 20  rom the pager.  
ec50: 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 4d  Initialize the M
ec60: 65 6d 50 61 67 65 2e 70 42 74 20 61 6e 64 0a 2a  emPage.pBt and.*
ec70: 2a 20 4d 65 6d 50 61 67 65 2e 61 44 61 74 61 20  * MemPage.aData 
ec80: 65 6c 65 6d 65 6e 74 73 20 69 66 20 6e 65 65 64  elements if need
ec90: 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ed..**.** If the
eca0: 20 6e 6f 43 6f 6e 74 65 6e 74 20 66 6c 61 67 20   noContent flag 
ecb0: 69 73 20 73 65 74 2c 20 69 74 20 6d 65 61 6e 73  is set, it means
ecc0: 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 20   that we do not 
ecd0: 63 61 72 65 20 61 62 6f 75 74 0a 2a 2a 20 74 68  care about.** th
ece0: 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65  e content of the
ecf0: 20 70 61 67 65 20 61 74 20 74 68 69 73 20 74 69   page at this ti
ed00: 6d 65 2e 20 20 53 6f 20 64 6f 20 6e 6f 74 20 67  me.  So do not g
ed10: 6f 20 74 6f 20 74 68 65 20 64 69 73 6b 0a 2a 2a  o to the disk.**
ed20: 20 74 6f 20 66 65 74 63 68 20 74 68 65 20 63 6f   to fetch the co
ed30: 6e 74 65 6e 74 2e 20 20 4a 75 73 74 20 66 69 6c  ntent.  Just fil
ed40: 6c 20 69 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74  l in the content
ed50: 20 77 69 74 68 20 7a 65 72 6f 73 20 66 6f 72 20   with zeros for 
ed60: 6e 6f 77 2e 0a 2a 2a 20 49 66 20 69 6e 20 74 68  now..** If in th
ed70: 65 20 66 75 74 75 72 65 20 77 65 20 63 61 6c 6c  e future we call
ed80: 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
ed90: 74 65 28 29 20 6f 6e 20 74 68 69 73 20 70 61 67  te() on this pag
eda0: 65 2c 20 74 68 61 74 0a 2a 2a 20 6d 65 61 6e 73  e, that.** means
edb0: 20 77 65 20 68 61 76 65 20 73 74 61 72 74 65 64   we have started
edc0: 20 74 6f 20 62 65 20 63 6f 6e 63 65 72 6e 65 64   to be concerned
edd0: 20 61 62 6f 75 74 20 63 6f 6e 74 65 6e 74 20 61   about content a
ede0: 6e 64 20 74 68 65 20 64 69 73 6b 0a 2a 2a 20 72  nd the disk.** r
edf0: 65 61 64 20 73 68 6f 75 6c 64 20 6f 63 63 75 72  ead should occur
ee00: 20 61 74 20 74 68 61 74 20 70 6f 69 6e 74 2e 0a   at that point..
ee10: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74  */.static int bt
ee20: 72 65 65 47 65 74 50 61 67 65 28 0a 20 20 42 74  reeGetPage(.  Bt
ee30: 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20  Shared *pBt,    
ee40: 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20     /* The btree 
ee50: 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20  */.  Pgno pgno, 
ee60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
ee70: 62 65 72 20 6f 66 20 74 68 65 20 70 61 67 65 20  ber of the page 
ee80: 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20 20 4d 65  to fetch */.  Me
ee90: 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20  mPage **ppPage, 
eea0: 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65     /* Return the
eeb0: 20 70 61 67 65 20 69 6e 20 74 68 69 73 20 70 61   page in this pa
eec0: 72 61 6d 65 74 65 72 20 2a 2f 0a 20 20 69 6e 74  rameter */.  int
eed0: 20 66 6c 61 67 73 20 20 20 20 20 20 20 20 20 20   flags          
eee0: 20 20 2f 2a 20 50 41 47 45 52 5f 47 45 54 5f 4e    /* PAGER_GET_N
eef0: 4f 43 4f 4e 54 45 4e 54 20 6f 72 20 50 41 47 45  OCONTENT or PAGE
ef00: 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20 2a  R_GET_READONLY *
ef10: 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  /.){.  int rc;. 
ef20: 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65   DbPage *pDbPage
ef30: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 66 6c 61  ;..  assert( fla
ef40: 67 73 3d 3d 30 20 7c 7c 20 66 6c 61 67 73 3d 3d  gs==0 || flags==
ef50: 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54  PAGER_GET_NOCONT
ef60: 45 4e 54 20 7c 7c 20 66 6c 61 67 73 3d 3d 50 41  ENT || flags==PA
ef70: 47 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59  GER_GET_READONLY
ef80: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
ef90: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
efa0: 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
efb0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
efc0: 67 65 72 41 63 71 75 69 72 65 28 70 42 74 2d 3e  gerAcquire(pBt->
efd0: 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20 28 44  pPager, pgno, (D
efe0: 62 50 61 67 65 2a 2a 29 26 70 44 62 50 61 67 65  bPage**)&pDbPage
eff0: 2c 20 66 6c 61 67 73 29 3b 0a 20 20 69 66 28 20  , flags);.  if( 
f000: 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
f010: 20 20 2a 70 70 50 61 67 65 20 3d 20 62 74 72 65    *ppPage = btre
f020: 65 50 61 67 65 46 72 6f 6d 44 62 50 61 67 65 28  ePageFromDbPage(
f030: 70 44 62 50 61 67 65 2c 20 70 67 6e 6f 2c 20 70  pDbPage, pgno, p
f040: 42 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  Bt);.  return SQ
f050: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
f060: 2a 20 52 65 74 72 69 65 76 65 20 61 20 70 61 67  * Retrieve a pag
f070: 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72  e from the pager
f080: 20 63 61 63 68 65 2e 20 49 66 20 74 68 65 20 72   cache. If the r
f090: 65 71 75 65 73 74 65 64 20 70 61 67 65 20 69 73  equested page is
f0a0: 20 6e 6f 74 0a 2a 2a 20 61 6c 72 65 61 64 79 20   not.** already 
f0b0: 69 6e 20 74 68 65 20 70 61 67 65 72 20 63 61 63  in the pager cac
f0c0: 68 65 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 20  he return NULL. 
f0d0: 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 4d  Initialize the M
f0e0: 65 6d 50 61 67 65 2e 70 42 74 20 61 6e 64 0a 2a  emPage.pBt and.*
f0f0: 2a 20 4d 65 6d 50 61 67 65 2e 61 44 61 74 61 20  * MemPage.aData 
f100: 65 6c 65 6d 65 6e 74 73 20 69 66 20 6e 65 65 64  elements if need
f110: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4d 65  ed..*/.static Me
f120: 6d 50 61 67 65 20 2a 62 74 72 65 65 50 61 67 65  mPage *btreePage
f130: 4c 6f 6f 6b 75 70 28 42 74 53 68 61 72 65 64 20  Lookup(BtShared 
f140: 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29  *pBt, Pgno pgno)
f150: 7b 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62 50  {.  DbPage *pDbP
f160: 61 67 65 3b 0a 20 20 61 73 73 65 72 74 28 20 73  age;.  assert( s
f170: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
f180: 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
f190: 0a 20 20 70 44 62 50 61 67 65 20 3d 20 73 71 6c  .  pDbPage = sql
f1a0: 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28  ite3PagerLookup(
f1b0: 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 67 6e  pBt->pPager, pgn
f1c0: 6f 29 3b 0a 20 20 69 66 28 20 70 44 62 50 61 67  o);.  if( pDbPag
f1d0: 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
f1e0: 62 74 72 65 65 50 61 67 65 46 72 6f 6d 44 62 50  btreePageFromDbP
f1f0: 61 67 65 28 70 44 62 50 61 67 65 2c 20 70 67 6e  age(pDbPage, pgn
f200: 6f 2c 20 70 42 74 29 3b 0a 20 20 7d 0a 20 20 72  o, pBt);.  }.  r
f210: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
f220: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73 69 7a  * Return the siz
f230: 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
f240: 65 20 66 69 6c 65 20 69 6e 20 70 61 67 65 73 2e  e file in pages.
f250: 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6e 79   If there is any
f260: 20 6b 69 6e 64 20 6f 66 0a 2a 2a 20 65 72 72 6f   kind of.** erro
f270: 72 2c 20 72 65 74 75 72 6e 20 28 28 75 6e 73 69  r, return ((unsi
f280: 67 6e 65 64 20 69 6e 74 29 2d 31 29 2e 0a 2a 2f  gned int)-1)..*/
f290: 0a 73 74 61 74 69 63 20 50 67 6e 6f 20 62 74 72  .static Pgno btr
f2a0: 65 65 50 61 67 65 63 6f 75 6e 74 28 42 74 53 68  eePagecount(BtSh
f2b0: 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 72 65  ared *pBt){.  re
f2c0: 74 75 72 6e 20 70 42 74 2d 3e 6e 50 61 67 65 3b  turn pBt->nPage;
f2d0: 0a 7d 0a 75 33 32 20 73 71 6c 69 74 65 33 42 74  .}.u32 sqlite3Bt
f2e0: 72 65 65 4c 61 73 74 50 61 67 65 28 42 74 72 65  reeLastPage(Btre
f2f0: 65 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28  e *p){.  assert(
f300: 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c   sqlite3BtreeHol
f310: 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20  dsMutex(p) );.  
f320: 61 73 73 65 72 74 28 20 28 28 70 2d 3e 70 42 74  assert( ((p->pBt
f330: 2d 3e 6e 50 61 67 65 29 26 30 78 38 30 30 30 30  ->nPage)&0x80000
f340: 30 30 29 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75  00)==0 );.  retu
f350: 72 6e 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e  rn btreePagecoun
f360: 74 28 70 2d 3e 70 42 74 29 3b 0a 7d 0a 0a 2f 2a  t(p->pBt);.}../*
f370: 0a 2a 2a 20 47 65 74 20 61 20 70 61 67 65 20 66  .** Get a page f
f380: 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20 61 6e  rom the pager an
f390: 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 69 74 2e  d initialize it.
f3a0: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69    This routine i
f3b0: 73 20 6a 75 73 74 20 61 0a 2a 2a 20 63 6f 6e 76  s just a.** conv
f3c0: 65 6e 69 65 6e 63 65 20 77 72 61 70 70 65 72 20  enience wrapper 
f3d0: 61 72 6f 75 6e 64 20 73 65 70 61 72 61 74 65 20  around separate 
f3e0: 63 61 6c 6c 73 20 74 6f 20 62 74 72 65 65 47 65  calls to btreeGe
f3f0: 74 50 61 67 65 28 29 20 61 6e 64 20 0a 2a 2a 20  tPage() and .** 
f400: 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 2e  btreeInitPage().
f410: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
f420: 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 6e 20  or occurs, then 
f430: 74 68 65 20 76 61 6c 75 65 20 2a 70 70 50 61 67  the value *ppPag
f440: 65 20 69 73 20 73 65 74 20 74 6f 20 69 73 20 75  e is set to is u
f450: 6e 64 65 66 69 6e 65 64 2e 20 49 74 0a 2a 2a 20  ndefined. It.** 
f460: 6d 61 79 20 72 65 6d 61 69 6e 20 75 6e 63 68 61  may remain uncha
f470: 6e 67 65 64 2c 20 6f 72 20 69 74 20 6d 61 79 20  nged, or it may 
f480: 62 65 20 73 65 74 20 74 6f 20 61 6e 20 69 6e 76  be set to an inv
f490: 61 6c 69 64 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73  alid value..*/.s
f4a0: 74 61 74 69 63 20 69 6e 74 20 67 65 74 41 6e 64  tatic int getAnd
f4b0: 49 6e 69 74 50 61 67 65 28 0a 20 20 42 74 53 68  InitPage(.  BtSh
f4c0: 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20  ared *pBt,      
f4d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
f4e0: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
f4f0: 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c   */.  Pgno pgno,
f500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f510: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
f520: 6f 66 20 74 68 65 20 70 61 67 65 20 74 6f 20 67  of the page to g
f530: 65 74 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  et */.  MemPage 
f540: 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 20 20 20  **ppPage,       
f550: 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
f560: 20 74 68 65 20 70 61 67 65 20 70 6f 69 6e 74 65   the page pointe
f570: 72 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20  r here */.  int 
f580: 62 52 65 61 64 6f 6e 6c 79 20 20 20 20 20 20 20  bReadonly       
f590: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
f5a0: 41 47 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c  AGER_GET_READONL
f5b0: 59 20 6f 72 20 30 20 2a 2f 0a 29 7b 0a 20 20 69  Y or 0 */.){.  i
f5c0: 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28  nt rc;.  assert(
f5d0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
f5e0: 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
f5f0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 62 52 65  );.  assert( bRe
f600: 61 64 6f 6e 6c 79 3d 3d 50 41 47 45 52 5f 47 45  adonly==PAGER_GE
f610: 54 5f 52 45 41 44 4f 4e 4c 59 20 7c 7c 20 62 52  T_READONLY || bR
f620: 65 61 64 6f 6e 6c 79 3d 3d 30 20 29 3b 0a 0a 20  eadonly==0 );.. 
f630: 20 69 66 28 20 70 67 6e 6f 3e 62 74 72 65 65 50   if( pgno>btreeP
f640: 61 67 65 63 6f 75 6e 74 28 70 42 74 29 20 29 7b  agecount(pBt) ){
f650: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
f660: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
f670: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
f680: 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42   btreeGetPage(pB
f690: 74 2c 20 70 67 6e 6f 2c 20 70 70 50 61 67 65 2c  t, pgno, ppPage,
f6a0: 20 62 52 65 61 64 6f 6e 6c 79 29 3b 0a 20 20 20   bReadonly);.   
f6b0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
f6c0: 4f 4b 20 26 26 20 28 2a 70 70 50 61 67 65 29 2d  OK && (*ppPage)-
f6d0: 3e 69 73 49 6e 69 74 3d 3d 30 20 29 7b 0a 20 20  >isInit==0 ){.  
f6e0: 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 49 6e      rc = btreeIn
f6f0: 69 74 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b  itPage(*ppPage);
f700: 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
f710: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
f720: 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
f730: 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20  *ppPage);.      
f740: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 74  }.    }.  }..  t
f750: 65 73 74 63 61 73 65 28 20 70 67 6e 6f 3d 3d 30  estcase( pgno==0
f760: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 67   );.  assert( pg
f770: 6e 6f 21 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c  no!=0 || rc==SQL
f780: 49 54 45 5f 43 4f 52 52 55 50 54 20 29 3b 0a 20  ITE_CORRUPT );. 
f790: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
f7a0: 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 4d  *.** Release a M
f7b0: 65 6d 50 61 67 65 2e 20 20 54 68 69 73 20 73 68  emPage.  This sh
f7c0: 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65 64 20 6f  ould be called o
f7d0: 6e 63 65 20 66 6f 72 20 65 61 63 68 20 70 72 69  nce for each pri
f7e0: 6f 72 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 62 74  or.** call to bt
f7f0: 72 65 65 47 65 74 50 61 67 65 2e 0a 2a 2f 0a 73  reeGetPage..*/.s
f800: 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61  tatic void relea
f810: 73 65 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a  sePage(MemPage *
f820: 70 50 61 67 65 29 7b 0a 20 20 69 66 28 20 70 50  pPage){.  if( pP
f830: 61 67 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72  age ){.    asser
f840: 74 28 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20  t( pPage->aData 
f850: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
f860: 50 61 67 65 2d 3e 70 42 74 20 29 3b 0a 20 20 20  Page->pBt );.   
f870: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
f880: 70 44 62 50 61 67 65 21 3d 30 20 29 3b 0a 20 20  pDbPage!=0 );.  
f890: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
f8a0: 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70  3PagerGetExtra(p
f8b0: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 3d  Page->pDbPage) =
f8c0: 3d 20 28 76 6f 69 64 2a 29 70 50 61 67 65 20 29  = (void*)pPage )
f8d0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  ;.    assert( sq
f8e0: 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74  lite3PagerGetDat
f8f0: 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  a(pPage->pDbPage
f900: 29 3d 3d 70 50 61 67 65 2d 3e 61 44 61 74 61 20  )==pPage->aData 
f910: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  );.    assert( s
f920: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
f930: 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
f940: 74 65 78 29 20 29 3b 0a 20 20 20 20 73 71 6c 69  tex) );.    sqli
f950: 74 65 33 50 61 67 65 72 55 6e 72 65 66 4e 6f 74  te3PagerUnrefNot
f960: 4e 75 6c 6c 28 70 50 61 67 65 2d 3e 70 44 62 50  Null(pPage->pDbP
f970: 61 67 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  age);.  }.}../*.
f980: 2a 2a 20 44 75 72 69 6e 67 20 61 20 72 6f 6c 6c  ** During a roll
f990: 62 61 63 6b 2c 20 77 68 65 6e 20 74 68 65 20 70  back, when the p
f9a0: 61 67 65 72 20 72 65 6c 6f 61 64 73 20 69 6e 66  ager reloads inf
f9b0: 6f 72 6d 61 74 69 6f 6e 20 69 6e 74 6f 20 74 68  ormation into th
f9c0: 65 20 63 61 63 68 65 0a 2a 2a 20 73 6f 20 74 68  e cache.** so th
f9d0: 61 74 20 74 68 65 20 63 61 63 68 65 20 69 73 20  at the cache is 
f9e0: 72 65 73 74 6f 72 65 64 20 74 6f 20 69 74 73 20  restored to its 
f9f0: 6f 72 69 67 69 6e 61 6c 20 73 74 61 74 65 20 61  original state a
fa00: 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 0a 2a  t the start of.*
fa10: 2a 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  * the transactio
fa20: 6e 2c 20 66 6f 72 20 65 61 63 68 20 70 61 67 65  n, for each page
fa30: 20 72 65 73 74 6f 72 65 64 20 74 68 69 73 20 72   restored this r
fa40: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
fa50: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
fa60: 74 69 6e 65 20 6e 65 65 64 73 20 74 6f 20 72 65  tine needs to re
fa70: 73 65 74 20 74 68 65 20 65 78 74 72 61 20 64 61  set the extra da
fa80: 74 61 20 73 65 63 74 69 6f 6e 20 61 74 20 74 68  ta section at th
fa90: 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20  e end of the.** 
faa0: 70 61 67 65 20 74 6f 20 61 67 72 65 65 20 77 69  page to agree wi
fab0: 74 68 20 74 68 65 20 72 65 73 74 6f 72 65 64 20  th the restored 
fac0: 64 61 74 61 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  data..*/.static 
fad0: 76 6f 69 64 20 70 61 67 65 52 65 69 6e 69 74 28  void pageReinit(
fae0: 44 62 50 61 67 65 20 2a 70 44 61 74 61 29 7b 0a  DbPage *pData){.
faf0: 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
fb00: 3b 0a 20 20 70 50 61 67 65 20 3d 20 28 4d 65 6d  ;.  pPage = (Mem
fb10: 50 61 67 65 20 2a 29 73 71 6c 69 74 65 33 50 61  Page *)sqlite3Pa
fb20: 67 65 72 47 65 74 45 78 74 72 61 28 70 44 61 74  gerGetExtra(pDat
fb30: 61 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  a);.  assert( sq
fb40: 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 52 65  lite3PagerPageRe
fb50: 66 63 6f 75 6e 74 28 70 44 61 74 61 29 3e 30 20  fcount(pData)>0 
fb60: 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e  );.  if( pPage->
fb70: 69 73 49 6e 69 74 20 29 7b 0a 20 20 20 20 61 73  isInit ){.    as
fb80: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
fb90: 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
fba0: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
fbb0: 20 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74     pPage->isInit
fbc0: 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 73 71   = 0;.    if( sq
fbd0: 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 52 65  lite3PagerPageRe
fbe0: 66 63 6f 75 6e 74 28 70 44 61 74 61 29 3e 31 20  fcount(pData)>1 
fbf0: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 70 50 61 67  ){.      /* pPag
fc00: 65 20 6d 69 67 68 74 20 6e 6f 74 20 62 65 20 61  e might not be a
fc10: 20 62 74 72 65 65 20 70 61 67 65 3b 20 20 69 74   btree page;  it
fc20: 20 6d 69 67 68 74 20 62 65 20 61 6e 20 6f 76 65   might be an ove
fc30: 72 66 6c 6f 77 20 70 61 67 65 0a 20 20 20 20 20  rflow page.     
fc40: 20 2a 2a 20 6f 72 20 70 74 72 6d 61 70 20 70 61   ** or ptrmap pa
fc50: 67 65 20 6f 72 20 61 20 66 72 65 65 20 70 61 67  ge or a free pag
fc60: 65 2e 20 20 49 6e 20 74 68 6f 73 65 20 63 61 73  e.  In those cas
fc70: 65 73 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  es, the followin
fc80: 67 0a 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c 20  g.      ** call 
fc90: 74 6f 20 62 74 72 65 65 49 6e 69 74 50 61 67 65  to btreeInitPage
fca0: 28 29 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 20 72  () will likely r
fcb0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
fcc0: 52 55 50 54 2e 0a 20 20 20 20 20 20 2a 2a 20 42  RUPT..      ** B
fcd0: 75 74 20 6e 6f 20 68 61 72 6d 20 69 73 20 64 6f  ut no harm is do
fce0: 6e 65 20 62 79 20 74 68 69 73 2e 20 20 41 6e 64  ne by this.  And
fcf0: 20 69 74 20 69 73 20 76 65 72 79 20 69 6d 70 6f   it is very impo
fd00: 72 74 61 6e 74 20 74 68 61 74 0a 20 20 20 20 20  rtant that.     
fd10: 20 2a 2a 20 62 74 72 65 65 49 6e 69 74 50 61 67   ** btreeInitPag
fd20: 65 28 29 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e  e() be called on
fd30: 20 65 76 65 72 79 20 62 74 72 65 65 20 70 61 67   every btree pag
fd40: 65 20 73 6f 20 77 65 20 6d 61 6b 65 0a 20 20 20  e so we make.   
fd50: 20 20 20 2a 2a 20 74 68 65 20 63 61 6c 6c 20 66     ** the call f
fd60: 6f 72 20 65 76 65 72 79 20 70 61 67 65 20 74 68  or every page th
fd70: 61 74 20 63 6f 6d 65 73 20 69 6e 20 66 6f 72 20  at comes in for 
fd80: 72 65 2d 69 6e 69 74 69 6e 67 2e 20 2a 2f 0a 20  re-initing. */. 
fd90: 20 20 20 20 20 62 74 72 65 65 49 6e 69 74 50 61       btreeInitPa
fda0: 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 7d  ge(pPage);.    }
fdb0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  .  }.}../*.** In
fdc0: 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68 61  voke the busy ha
fdd0: 6e 64 6c 65 72 20 66 6f 72 20 61 20 62 74 72 65  ndler for a btre
fde0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
fdf0: 20 62 74 72 65 65 49 6e 76 6f 6b 65 42 75 73 79   btreeInvokeBusy
fe00: 48 61 6e 64 6c 65 72 28 76 6f 69 64 20 2a 70 41  Handler(void *pA
fe10: 72 67 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  rg){.  BtShared 
fe20: 2a 70 42 74 20 3d 20 28 42 74 53 68 61 72 65 64  *pBt = (BtShared
fe30: 2a 29 70 41 72 67 3b 0a 20 20 61 73 73 65 72 74  *)pArg;.  assert
fe40: 28 20 70 42 74 2d 3e 64 62 20 29 3b 0a 20 20 61  ( pBt->db );.  a
fe50: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
fe60: 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 64  utex_held(pBt->d
fe70: 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72  b->mutex) );.  r
fe80: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 49 6e 76  eturn sqlite3Inv
fe90: 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 28 26  okeBusyHandler(&
fea0: 70 42 74 2d 3e 64 62 2d 3e 62 75 73 79 48 61 6e  pBt->db->busyHan
feb0: 64 6c 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  dler);.}../*.** 
fec0: 4f 70 65 6e 20 61 20 64 61 74 61 62 61 73 65 20  Open a database 
fed0: 66 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20 7a 46 69  file..** .** zFi
fee0: 6c 65 6e 61 6d 65 20 69 73 20 74 68 65 20 6e 61  lename is the na
fef0: 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  me of the databa
ff00: 73 65 20 66 69 6c 65 2e 20 20 49 66 20 7a 46 69  se file.  If zFi
ff10: 6c 65 6e 61 6d 65 20 69 73 20 4e 55 4c 4c 0a 2a  lename is NULL.*
ff20: 2a 20 74 68 65 6e 20 61 6e 20 65 70 68 65 6d 65  * then an epheme
ff30: 72 61 6c 20 64 61 74 61 62 61 73 65 20 69 73 20  ral database is 
ff40: 63 72 65 61 74 65 64 2e 20 20 54 68 65 20 65 70  created.  The ep
ff50: 68 65 6d 65 72 61 6c 20 64 61 74 61 62 61 73 65  hemeral database
ff60: 20 6d 69 67 68 74 0a 2a 2a 20 62 65 20 65 78 63   might.** be exc
ff70: 6c 75 73 69 76 65 6c 79 20 69 6e 20 6d 65 6d 6f  lusively in memo
ff80: 72 79 2c 20 6f 72 20 69 74 20 6d 69 67 68 74 20  ry, or it might 
ff90: 75 73 65 20 61 20 64 69 73 6b 2d 62 61 73 65 64  use a disk-based
ffa0: 20 6d 65 6d 6f 72 79 20 63 61 63 68 65 2e 0a 2a   memory cache..*
ffb0: 2a 20 45 69 74 68 65 72 20 77 61 79 2c 20 74 68  * Either way, th
ffc0: 65 20 65 70 68 65 6d 65 72 61 6c 20 64 61 74 61  e ephemeral data
ffd0: 62 61 73 65 20 77 69 6c 6c 20 62 65 20 61 75 74  base will be aut
ffe0: 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74  omatically delet
fff0: 65 64 20 0a 2a 2a 20 77 68 65 6e 20 73 71 6c 69  ed .** when sqli
10000 74 65 33 42 74 72 65 65 43 6c 6f 73 65 28 29 20  te3BtreeClose() 
10010 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a  is called..**.**
10020 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73   If zFilename is
10030 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 74 68 65 6e   ":memory:" then
10040 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61   an in-memory da
10050 74 61 62 61 73 65 20 69 73 20 63 72 65 61 74 65  tabase is create
10060 64 0a 2a 2a 20 74 68 61 74 20 69 73 20 61 75 74  d.** that is aut
10070 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 73 74 72  omatically destr
10080 6f 79 65 64 20 77 68 65 6e 20 69 74 20 69 73 20  oyed when it is 
10090 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  closed..**.** Th
100a0 65 20 22 66 6c 61 67 73 22 20 70 61 72 61 6d 65  e "flags" parame
100b0 74 65 72 20 69 73 20 61 20 62 69 74 6d 61 73 6b  ter is a bitmask
100c0 20 74 68 61 74 20 6d 69 67 68 74 20 63 6f 6e 74   that might cont
100d0 61 69 6e 20 62 69 74 73 20 6c 69 6b 65 0a 2a 2a  ain bits like.**
100e0 20 42 54 52 45 45 5f 4f 4d 49 54 5f 4a 4f 55 52   BTREE_OMIT_JOUR
100f0 4e 41 4c 20 61 6e 64 2f 6f 72 20 42 54 52 45 45  NAL and/or BTREE
10100 5f 4d 45 4d 4f 52 59 2e 0a 2a 2a 0a 2a 2a 20 49  _MEMORY..**.** I
10110 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  f the database i
10120 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 65 64  s already opened
10130 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64 61 74   in the same dat
10140 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
10150 0a 2a 2a 20 61 6e 64 20 77 65 20 61 72 65 20 69  .** and we are i
10160 6e 20 73 68 61 72 65 64 20 63 61 63 68 65 20 6d  n shared cache m
10170 6f 64 65 2c 20 74 68 65 6e 20 74 68 65 20 6f 70  ode, then the op
10180 65 6e 20 77 69 6c 6c 20 66 61 69 6c 20 77 69 74  en will fail wit
10190 68 20 61 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 43  h an.** SQLITE_C
101a0 4f 4e 53 54 52 41 49 4e 54 20 65 72 72 6f 72 2e  ONSTRAINT error.
101b0 20 20 57 65 20 63 61 6e 6e 6f 74 20 61 6c 6c 6f    We cannot allo
101c0 77 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 42 74  w two or more Bt
101d0 53 68 61 72 65 64 0a 2a 2a 20 6f 62 6a 65 63 74  Shared.** object
101e0 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64 61  s in the same da
101f0 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
10200 6e 20 73 69 6e 63 65 20 64 6f 69 6e 67 20 73 6f  n since doing so
10210 20 77 69 6c 6c 20 6c 65 61 64 0a 2a 2a 20 74 6f   will lead.** to
10220 20 70 72 6f 62 6c 65 6d 73 20 77 69 74 68 20 6c   problems with l
10230 6f 63 6b 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73  ocking..*/.int s
10240 71 6c 69 74 65 33 42 74 72 65 65 4f 70 65 6e 28  qlite3BtreeOpen(
10250 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
10260 70 56 66 73 2c 20 20 20 20 20 20 2f 2a 20 56 46  pVfs,      /* VF
10270 53 20 74 6f 20 75 73 65 20 66 6f 72 20 74 68 69  S to use for thi
10280 73 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20 63 6f  s b-tree */.  co
10290 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
102a0 61 6d 65 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  ame,  /* Name of
102b0 20 74 68 65 20 66 69 6c 65 20 63 6f 6e 74 61 69   the file contai
102c0 6e 69 6e 67 20 74 68 65 20 42 54 72 65 65 20 64  ning the BTree d
102d0 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 73 71 6c  atabase */.  sql
102e0 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20  ite3 *db,       
102f0 20 20 20 20 20 2f 2a 20 41 73 73 6f 63 69 61 74       /* Associat
10300 65 64 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  ed database hand
10310 6c 65 20 2a 2f 0a 20 20 42 74 72 65 65 20 2a 2a  le */.  Btree **
10320 70 70 42 74 72 65 65 2c 20 20 20 20 20 20 20 20  ppBtree,        
10330 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 6e 65  /* Pointer to ne
10340 77 20 42 74 72 65 65 20 6f 62 6a 65 63 74 20 77  w Btree object w
10350 72 69 74 74 65 6e 20 68 65 72 65 20 2a 2f 0a 20  ritten here */. 
10360 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20   int flags,     
10370 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 74 69           /* Opti
10380 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 76 66 73  ons */.  int vfs
10390 46 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20  Flags           
103a0 20 2f 2a 20 46 6c 61 67 73 20 70 61 73 73 65 64   /* Flags passed
103b0 20 74 68 72 6f 75 67 68 20 74 6f 20 73 71 6c 69   through to sqli
103c0 74 65 33 5f 76 66 73 2e 78 4f 70 65 6e 28 29 20  te3_vfs.xOpen() 
103d0 2a 2f 0a 29 7b 0a 20 20 42 74 53 68 61 72 65 64  */.){.  BtShared
103e0 20 2a 70 42 74 20 3d 20 30 3b 20 20 20 20 20 20   *pBt = 0;      
103f0 20 20 20 20 20 20 20 2f 2a 20 53 68 61 72 65 64         /* Shared
10400 20 70 61 72 74 20 6f 66 20 62 74 72 65 65 20 73   part of btree s
10410 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 42 74  tructure */.  Bt
10420 72 65 65 20 2a 70 3b 20 20 20 20 20 20 20 20 20  ree *p;         
10430 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10440 48 61 6e 64 6c 65 20 74 6f 20 72 65 74 75 72 6e  Handle to return
10450 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75   */.  sqlite3_mu
10460 74 65 78 20 2a 6d 75 74 65 78 4f 70 65 6e 20 3d  tex *mutexOpen =
10470 20 30 3b 20 20 2f 2a 20 50 72 65 76 65 6e 74 73   0;  /* Prevents
10480 20 61 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f   a race conditio
10490 6e 2e 20 54 69 63 6b 65 74 20 23 33 35 33 37 20  n. Ticket #3537 
104a0 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  */.  int rc = SQ
104b0 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
104c0 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f      /* Result co
104d0 64 65 20 66 72 6f 6d 20 74 68 69 73 20 66 75 6e  de from this fun
104e0 63 74 69 6f 6e 20 2a 2f 0a 20 20 75 38 20 6e 52  ction */.  u8 nR
104f0 65 73 65 72 76 65 3b 20 20 20 20 20 20 20 20 20  eserve;         
10500 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74            /* Byt
10510 65 20 6f 66 20 75 6e 75 73 65 64 20 73 70 61 63  e of unused spac
10520 65 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20 2a  e on each page *
10530 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
10540 72 20 7a 44 62 48 65 61 64 65 72 5b 31 30 30 5d  r zDbHeader[100]
10550 3b 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68  ;  /* Database h
10560 65 61 64 65 72 20 63 6f 6e 74 65 6e 74 20 2a 2f  eader content */
10570 0a 0a 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6f  ..  /* True if o
10580 70 65 6e 69 6e 67 20 61 6e 20 65 70 68 65 6d 65  pening an epheme
10590 72 61 6c 2c 20 74 65 6d 70 6f 72 61 72 79 20 64  ral, temporary d
105a0 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 63 6f 6e  atabase */.  con
105b0 73 74 20 69 6e 74 20 69 73 54 65 6d 70 44 62 20  st int isTempDb 
105c0 3d 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 7c  = zFilename==0 |
105d0 7c 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 3d 3d  | zFilename[0]==
105e0 30 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65  0;..  /* Set the
105f0 20 76 61 72 69 61 62 6c 65 20 69 73 4d 65 6d 64   variable isMemd
10600 62 20 74 6f 20 74 72 75 65 20 66 6f 72 20 61 6e  b to true for an
10610 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
10620 61 73 65 2c 20 6f 72 20 0a 20 20 2a 2a 20 66 61  ase, or .  ** fa
10630 6c 73 65 20 66 6f 72 20 61 20 66 69 6c 65 2d 62  lse for a file-b
10640 61 73 65 64 20 64 61 74 61 62 61 73 65 2e 0a 20  ased database.. 
10650 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
10660 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a  E_OMIT_MEMORYDB.
10670 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 73 4d 65    const int isMe
10680 6d 64 62 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 20  mdb = 0;.#else. 
10690 20 63 6f 6e 73 74 20 69 6e 74 20 69 73 4d 65 6d   const int isMem
106a0 64 62 20 3d 20 28 7a 46 69 6c 65 6e 61 6d 65 20  db = (zFilename 
106b0 26 26 20 73 74 72 63 6d 70 28 7a 46 69 6c 65 6e  && strcmp(zFilen
106c0 61 6d 65 2c 20 22 3a 6d 65 6d 6f 72 79 3a 22 29  ame, ":memory:")
106d0 3d 3d 30 29 0a 20 20 20 20 20 20 20 20 20 20 20  ==0).           
106e0 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28              || (
106f0 69 73 54 65 6d 70 44 62 20 26 26 20 73 71 6c 69  isTempDb && sqli
10700 74 65 33 54 65 6d 70 49 6e 4d 65 6d 6f 72 79 28  te3TempInMemory(
10710 64 62 29 29 0a 20 20 20 20 20 20 20 20 20 20 20  db)).           
10720 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28              || (
10730 76 66 73 46 6c 61 67 73 20 26 20 53 51 4c 49 54  vfsFlags & SQLIT
10740 45 5f 4f 50 45 4e 5f 4d 45 4d 4f 52 59 29 21 3d  E_OPEN_MEMORY)!=
10750 30 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73  0;.#endif..  ass
10760 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20  ert( db!=0 );.  
10770 61 73 73 65 72 74 28 20 70 56 66 73 21 3d 30 20  assert( pVfs!=0 
10780 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
10790 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
107a0 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
107b0 61 73 73 65 72 74 28 20 28 66 6c 61 67 73 26 30  assert( (flags&0
107c0 78 66 66 29 3d 3d 66 6c 61 67 73 20 29 3b 20 20  xff)==flags );  
107d0 20 2f 2a 20 66 6c 61 67 73 20 66 69 74 20 69 6e   /* flags fit in
107e0 20 38 20 62 69 74 73 20 2a 2f 0a 0a 20 20 2f 2a   8 bits */..  /*
107f0 20 4f 6e 6c 79 20 61 20 42 54 52 45 45 5f 53 49   Only a BTREE_SI
10800 4e 47 4c 45 20 64 61 74 61 62 61 73 65 20 63 61  NGLE database ca
10810 6e 20 62 65 20 42 54 52 45 45 5f 55 4e 4f 52 44  n be BTREE_UNORD
10820 45 52 45 44 20 2a 2f 0a 20 20 61 73 73 65 72 74  ERED */.  assert
10830 28 20 28 66 6c 61 67 73 20 26 20 42 54 52 45 45  ( (flags & BTREE
10840 5f 55 4e 4f 52 44 45 52 45 44 29 3d 3d 30 20 7c  _UNORDERED)==0 |
10850 7c 20 28 66 6c 61 67 73 20 26 20 42 54 52 45 45  | (flags & BTREE
10860 5f 53 49 4e 47 4c 45 29 21 3d 30 20 29 3b 0a 0a  _SINGLE)!=0 );..
10870 20 20 2f 2a 20 41 20 42 54 52 45 45 5f 53 49 4e    /* A BTREE_SIN
10880 47 4c 45 20 64 61 74 61 62 61 73 65 20 69 73 20  GLE database is 
10890 61 6c 77 61 79 73 20 61 20 74 65 6d 70 6f 72 61  always a tempora
108a0 72 79 20 61 6e 64 2f 6f 72 20 65 70 68 65 6d 65  ry and/or epheme
108b0 72 61 6c 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ral */.  assert(
108c0 20 28 66 6c 61 67 73 20 26 20 42 54 52 45 45 5f   (flags & BTREE_
108d0 53 49 4e 47 4c 45 29 3d 3d 30 20 7c 7c 20 69 73  SINGLE)==0 || is
108e0 54 65 6d 70 44 62 20 29 3b 0a 0a 20 20 69 66 28  TempDb );..  if(
108f0 20 69 73 4d 65 6d 64 62 20 29 7b 0a 20 20 20 20   isMemdb ){.    
10900 66 6c 61 67 73 20 7c 3d 20 42 54 52 45 45 5f 4d  flags |= BTREE_M
10910 45 4d 4f 52 59 3b 0a 20 20 7d 0a 20 20 69 66 28  EMORY;.  }.  if(
10920 20 28 76 66 73 46 6c 61 67 73 20 26 20 53 51 4c   (vfsFlags & SQL
10930 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42  ITE_OPEN_MAIN_DB
10940 29 21 3d 30 20 26 26 20 28 69 73 4d 65 6d 64 62  )!=0 && (isMemdb
10950 20 7c 7c 20 69 73 54 65 6d 70 44 62 29 20 29 7b   || isTempDb) ){
10960 0a 20 20 20 20 76 66 73 46 6c 61 67 73 20 3d 20  .    vfsFlags = 
10970 28 76 66 73 46 6c 61 67 73 20 26 20 7e 53 51 4c  (vfsFlags & ~SQL
10980 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42  ITE_OPEN_MAIN_DB
10990 29 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  ) | SQLITE_OPEN_
109a0 54 45 4d 50 5f 44 42 3b 0a 20 20 7d 0a 20 20 70  TEMP_DB;.  }.  p
109b0 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
109c0 5a 65 72 6f 28 73 69 7a 65 6f 66 28 42 74 72 65  Zero(sizeof(Btre
109d0 65 29 29 3b 0a 20 20 69 66 28 20 21 70 20 29 7b  e));.  if( !p ){
109e0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
109f0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20  TE_NOMEM;.  }.  
10a00 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52 41  p->inTrans = TRA
10a10 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 70 2d 3e 64 62  NS_NONE;.  p->db
10a20 20 3d 20 64 62 3b 0a 23 69 66 6e 64 65 66 20 53   = db;.#ifndef S
10a30 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
10a40 44 5f 43 41 43 48 45 0a 20 20 70 2d 3e 6c 6f 63  D_CACHE.  p->loc
10a50 6b 2e 70 42 74 72 65 65 20 3d 20 70 3b 0a 20 20  k.pBtree = p;.  
10a60 70 2d 3e 6c 6f 63 6b 2e 69 54 61 62 6c 65 20 3d  p->lock.iTable =
10a70 20 31 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20   1;.#endif..#if 
10a80 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
10a90 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
10aa0 45 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53  E) && !defined(S
10ab0 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49  QLITE_OMIT_DISKI
10ac0 4f 29 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49 66 20  O).  /*.  ** If 
10ad0 74 68 69 73 20 42 74 72 65 65 20 69 73 20 61 20  this Btree is a 
10ae0 63 61 6e 64 69 64 61 74 65 20 66 6f 72 20 73 68  candidate for sh
10af0 61 72 65 64 20 63 61 63 68 65 2c 20 74 72 79 20  ared cache, try 
10b00 74 6f 20 66 69 6e 64 20 61 6e 0a 20 20 2a 2a 20  to find an.  ** 
10b10 65 78 69 73 74 69 6e 67 20 42 74 53 68 61 72 65  existing BtShare
10b20 64 20 6f 62 6a 65 63 74 20 74 68 61 74 20 77 65  d object that we
10b30 20 63 61 6e 20 73 68 61 72 65 20 77 69 74 68 0a   can share with.
10b40 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 54 65 6d    */.  if( isTem
10b50 70 44 62 3d 3d 30 20 26 26 20 28 69 73 4d 65 6d  pDb==0 && (isMem
10b60 64 62 3d 3d 30 20 7c 7c 20 28 76 66 73 46 6c 61  db==0 || (vfsFla
10b70 67 73 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55  gs&SQLITE_OPEN_U
10b80 52 49 29 21 3d 30 29 20 29 7b 0a 20 20 20 20 69  RI)!=0) ){.    i
10b90 66 28 20 76 66 73 46 6c 61 67 73 20 26 20 53 51  f( vfsFlags & SQ
10ba0 4c 49 54 45 5f 4f 50 45 4e 5f 53 48 41 52 45 44  LITE_OPEN_SHARED
10bb0 43 41 43 48 45 20 29 7b 0a 20 20 20 20 20 20 69  CACHE ){.      i
10bc0 6e 74 20 6e 46 69 6c 65 6e 61 6d 65 20 3d 20 73  nt nFilename = s
10bd0 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
10be0 46 69 6c 65 6e 61 6d 65 29 2b 31 3b 0a 20 20 20  Filename)+1;.   
10bf0 20 20 20 69 6e 74 20 6e 46 75 6c 6c 50 61 74 68     int nFullPath
10c00 6e 61 6d 65 20 3d 20 70 56 66 73 2d 3e 6d 78 50  name = pVfs->mxP
10c10 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20 20 20 20  athname+1;.     
10c20 20 63 68 61 72 20 2a 7a 46 75 6c 6c 50 61 74 68   char *zFullPath
10c30 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 61  name = sqlite3Ma
10c40 6c 6c 6f 63 28 4d 41 58 28 6e 46 75 6c 6c 50 61  lloc(MAX(nFullPa
10c50 74 68 6e 61 6d 65 2c 6e 46 69 6c 65 6e 61 6d 65  thname,nFilename
10c60 29 29 3b 0a 20 20 20 20 20 20 4d 55 54 45 58 5f  ));.      MUTEX_
10c70 4c 4f 47 49 43 28 20 73 71 6c 69 74 65 33 5f 6d  LOGIC( sqlite3_m
10c80 75 74 65 78 20 2a 6d 75 74 65 78 53 68 61 72 65  utex *mutexShare
10c90 64 3b 20 29 0a 0a 20 20 20 20 20 20 70 2d 3e 73  d; )..      p->s
10ca0 68 61 72 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20  harable = 1;.   
10cb0 20 20 20 69 66 28 20 21 7a 46 75 6c 6c 50 61 74     if( !zFullPat
10cc0 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20  hname ){.       
10cd0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29   sqlite3_free(p)
10ce0 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
10cf0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
10d00 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
10d10 20 69 73 4d 65 6d 64 62 20 29 7b 0a 20 20 20 20   isMemdb ){.    
10d20 20 20 20 20 6d 65 6d 63 70 79 28 7a 46 75 6c 6c      memcpy(zFull
10d30 50 61 74 68 6e 61 6d 65 2c 20 7a 46 69 6c 65 6e  Pathname, zFilen
10d40 61 6d 65 2c 20 6e 46 69 6c 65 6e 61 6d 65 29 3b  ame, nFilename);
10d50 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
10d60 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
10d70 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65  e3OsFullPathname
10d80 28 70 56 66 73 2c 20 7a 46 69 6c 65 6e 61 6d 65  (pVfs, zFilename
10d90 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
10da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10db0 20 20 20 20 20 6e 46 75 6c 6c 50 61 74 68 6e 61       nFullPathna
10dc0 6d 65 2c 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  me, zFullPathnam
10dd0 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  e);.        if( 
10de0 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rc ){.          
10df0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 46 75  sqlite3_free(zFu
10e00 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20  llPathname);.   
10e10 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
10e20 72 65 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20  ree(p);.        
10e30 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
10e40 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23       }.      }.#
10e50 69 66 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44  if SQLITE_THREAD
10e60 53 41 46 45 0a 20 20 20 20 20 20 6d 75 74 65 78  SAFE.      mutex
10e70 4f 70 65 6e 20 3d 20 73 71 6c 69 74 65 33 4d 75  Open = sqlite3Mu
10e80 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f  texAlloc(SQLITE_
10e90 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4f 50 45  MUTEX_STATIC_OPE
10ea0 4e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  N);.      sqlite
10eb0 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 75  3_mutex_enter(mu
10ec0 74 65 78 4f 70 65 6e 29 3b 0a 20 20 20 20 20 20  texOpen);.      
10ed0 6d 75 74 65 78 53 68 61 72 65 64 20 3d 20 73 71  mutexShared = sq
10ee0 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28  lite3MutexAlloc(
10ef0 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41  SQLITE_MUTEX_STA
10f00 54 49 43 5f 4d 41 53 54 45 52 29 3b 0a 20 20 20  TIC_MASTER);.   
10f10 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
10f20 5f 65 6e 74 65 72 28 6d 75 74 65 78 53 68 61 72  _enter(mutexShar
10f30 65 64 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  ed);.#endif.    
10f40 20 20 66 6f 72 28 70 42 74 3d 47 4c 4f 42 41 4c    for(pBt=GLOBAL
10f50 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74  (BtShared*,sqlit
10f60 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73  e3SharedCacheLis
10f70 74 29 3b 20 70 42 74 3b 20 70 42 74 3d 70 42 74  t); pBt; pBt=pBt
10f80 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20  ->pNext){.      
10f90 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6e    assert( pBt->n
10fa0 52 65 66 3e 30 20 29 3b 0a 20 20 20 20 20 20 20  Ref>0 );.       
10fb0 20 69 66 28 20 30 3d 3d 73 74 72 63 6d 70 28 7a   if( 0==strcmp(z
10fc0 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 73 71  FullPathname, sq
10fd0 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65 6e 61  lite3PagerFilena
10fe0 6d 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  me(pBt->pPager, 
10ff0 30 29 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  0)).            
11000 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 50       && sqlite3P
11010 61 67 65 72 56 66 73 28 70 42 74 2d 3e 70 50 61  agerVfs(pBt->pPa
11020 67 65 72 29 3d 3d 70 56 66 73 20 29 7b 0a 20 20  ger)==pVfs ){.  
11030 20 20 20 20 20 20 20 20 69 6e 74 20 69 44 62 3b          int iDb;
11040 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69  .          for(i
11050 44 62 3d 64 62 2d 3e 6e 44 62 2d 31 3b 20 69 44  Db=db->nDb-1; iD
11060 62 3e 3d 30 3b 20 69 44 62 2d 2d 29 7b 0a 20 20  b>=0; iDb--){.  
11070 20 20 20 20 20 20 20 20 20 20 42 74 72 65 65 20            Btree 
11080 2a 70 45 78 69 73 74 69 6e 67 20 3d 20 64 62 2d  *pExisting = db-
11090 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74 3b 0a 20  >aDb[iDb].pBt;. 
110a0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
110b0 45 78 69 73 74 69 6e 67 20 26 26 20 70 45 78 69  Existing && pExi
110c0 73 74 69 6e 67 2d 3e 70 42 74 3d 3d 70 42 74 20  sting->pBt==pBt 
110d0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
110e0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
110f0 65 61 76 65 28 6d 75 74 65 78 53 68 61 72 65 64  eave(mutexShared
11100 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
11110 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
11120 65 61 76 65 28 6d 75 74 65 78 4f 70 65 6e 29 3b  eave(mutexOpen);
11130 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
11140 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 46 75 6c  qlite3_free(zFul
11150 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  lPathname);.    
11160 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
11170 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20 20  3_free(p);.     
11180 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
11190 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
111a0 54 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  T;.            }
111b0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
111c0 20 20 20 20 20 20 20 70 2d 3e 70 42 74 20 3d 20         p->pBt = 
111d0 70 42 74 3b 0a 20 20 20 20 20 20 20 20 20 20 70  pBt;.          p
111e0 42 74 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20  Bt->nRef++;.    
111f0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
11200 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
11210 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74       sqlite3_mut
11220 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 53 68  ex_leave(mutexSh
11230 61 72 65 64 29 3b 0a 20 20 20 20 20 20 73 71 6c  ared);.      sql
11240 69 74 65 33 5f 66 72 65 65 28 7a 46 75 6c 6c 50  ite3_free(zFullP
11250 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a  athname);.    }.
11260 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
11270 42 55 47 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20  BUG.    else{.  
11280 20 20 20 20 2f 2a 20 49 6e 20 64 65 62 75 67 20      /* In debug 
11290 6d 6f 64 65 2c 20 77 65 20 6d 61 72 6b 20 61 6c  mode, we mark al
112a0 6c 20 70 65 72 73 69 73 74 65 6e 74 20 64 61 74  l persistent dat
112b0 61 62 61 73 65 73 20 61 73 20 73 68 61 72 61 62  abases as sharab
112c0 6c 65 0a 20 20 20 20 20 20 2a 2a 20 65 76 65 6e  le.      ** even
112d0 20 77 68 65 6e 20 74 68 65 79 20 61 72 65 20 6e   when they are n
112e0 6f 74 2e 20 20 54 68 69 73 20 65 78 65 72 63 69  ot.  This exerci
112f0 73 65 73 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20  ses the locking 
11300 63 6f 64 65 20 61 6e 64 0a 20 20 20 20 20 20 2a  code and.      *
11310 2a 20 67 69 76 65 73 20 6d 6f 72 65 20 6f 70 70  * gives more opp
11320 6f 72 74 75 6e 69 74 79 20 66 6f 72 20 61 73 73  ortunity for ass
11330 65 72 74 73 28 73 71 6c 69 74 65 33 5f 6d 75 74  erts(sqlite3_mut
11340 65 78 5f 68 65 6c 64 28 29 29 0a 20 20 20 20 20  ex_held()).     
11350 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 20 74   ** statements t
11360 6f 20 66 69 6e 64 20 6c 6f 63 6b 69 6e 67 20 70  o find locking p
11370 72 6f 62 6c 65 6d 73 2e 0a 20 20 20 20 20 20 2a  roblems..      *
11380 2f 0a 20 20 20 20 20 20 70 2d 3e 73 68 61 72 61  /.      p->shara
11390 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 23  ble = 1;.    }.#
113a0 65 6e 64 69 66 0a 20 20 7d 0a 23 65 6e 64 69 66  endif.  }.#endif
113b0 0a 20 20 69 66 28 20 70 42 74 3d 3d 30 20 29 7b  .  if( pBt==0 ){
113c0 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 54  .    /*.    ** T
113d0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73  he following ass
113e0 65 72 74 73 20 6d 61 6b 65 20 73 75 72 65 20 74  erts make sure t
113f0 68 61 74 20 73 74 72 75 63 74 75 72 65 73 20 75  hat structures u
11400 73 65 64 20 62 79 20 74 68 65 20 62 74 72 65 65  sed by the btree
11410 20 61 72 65 0a 20 20 20 20 2a 2a 20 74 68 65 20   are.    ** the 
11420 72 69 67 68 74 20 73 69 7a 65 2e 20 20 54 68 69  right size.  Thi
11430 73 20 69 73 20 74 6f 20 67 75 61 72 64 20 61 67  s is to guard ag
11440 61 69 6e 73 74 20 73 69 7a 65 20 63 68 61 6e 67  ainst size chang
11450 65 73 20 74 68 61 74 20 72 65 73 75 6c 74 0a 20  es that result. 
11460 20 20 20 2a 2a 20 77 68 65 6e 20 63 6f 6d 70 69     ** when compi
11470 6c 69 6e 67 20 6f 6e 20 61 20 64 69 66 66 65 72  ling on a differ
11480 65 6e 74 20 61 72 63 68 69 74 65 63 74 75 72 65  ent architecture
11490 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
114a0 65 72 74 28 20 73 69 7a 65 6f 66 28 69 36 34 29  ert( sizeof(i64)
114b0 3d 3d 38 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==8 );.    asser
114c0 74 28 20 73 69 7a 65 6f 66 28 75 36 34 29 3d 3d  t( sizeof(u64)==
114d0 38 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  8 );.    assert(
114e0 20 73 69 7a 65 6f 66 28 75 33 32 29 3d 3d 34 20   sizeof(u32)==4 
114f0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  );.    assert( s
11500 69 7a 65 6f 66 28 75 31 36 29 3d 3d 32 20 29 3b  izeof(u16)==2 );
11510 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a  .    assert( siz
11520 65 6f 66 28 50 67 6e 6f 29 3d 3d 34 20 29 3b 0a  eof(Pgno)==4 );.
11530 20 20 0a 20 20 20 20 70 42 74 20 3d 20 73 71 6c    .    pBt = sql
11540 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20  ite3MallocZero( 
11550 73 69 7a 65 6f 66 28 2a 70 42 74 29 20 29 3b 0a  sizeof(*pBt) );.
11560 20 20 20 20 69 66 28 20 70 42 74 3d 3d 30 20 29      if( pBt==0 )
11570 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
11580 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
11590 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e   goto btree_open
115a0 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _out;.    }.    
115b0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
115c0 72 4f 70 65 6e 28 70 56 66 73 2c 20 26 70 42 74  rOpen(pVfs, &pBt
115d0 2d 3e 70 50 61 67 65 72 2c 20 7a 46 69 6c 65 6e  ->pPager, zFilen
115e0 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ame,.           
115f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 45                 E
11600 58 54 52 41 5f 53 49 5a 45 2c 20 66 6c 61 67 73  XTRA_SIZE, flags
11610 2c 20 76 66 73 46 6c 61 67 73 2c 20 70 61 67 65  , vfsFlags, page
11620 52 65 69 6e 69 74 29 3b 0a 20 20 20 20 69 66 28  Reinit);.    if(
11630 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
11640 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  {.      sqlite3P
11650 61 67 65 72 53 65 74 4d 6d 61 70 4c 69 6d 69 74  agerSetMmapLimit
11660 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 64 62  (pBt->pPager, db
11670 2d 3e 73 7a 4d 6d 61 70 29 3b 0a 20 20 20 20 20  ->szMmap);.     
11680 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
11690 65 72 52 65 61 64 46 69 6c 65 68 65 61 64 65 72  erReadFileheader
116a0 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 73 69 7a  (pBt->pPager,siz
116b0 65 6f 66 28 7a 44 62 48 65 61 64 65 72 29 2c 7a  eof(zDbHeader),z
116c0 44 62 48 65 61 64 65 72 29 3b 0a 20 20 20 20 7d  DbHeader);.    }
116d0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
116e0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
116f0 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f  goto btree_open_
11700 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  out;.    }.    p
11710 42 74 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 3d 20  Bt->openFlags = 
11720 28 75 38 29 66 6c 61 67 73 3b 0a 20 20 20 20 70  (u8)flags;.    p
11730 42 74 2d 3e 64 62 20 3d 20 64 62 3b 0a 20 20 20  Bt->db = db;.   
11740 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
11750 42 75 73 79 68 61 6e 64 6c 65 72 28 70 42 74 2d  Busyhandler(pBt-
11760 3e 70 50 61 67 65 72 2c 20 62 74 72 65 65 49 6e  >pPager, btreeIn
11770 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 2c  vokeBusyHandler,
11780 20 70 42 74 29 3b 0a 20 20 20 20 70 2d 3e 70 42   pBt);.    p->pB
11790 74 20 3d 20 70 42 74 3b 0a 20 20 0a 20 20 20 20  t = pBt;.  .    
117a0 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20 30  pBt->pCursor = 0
117b0 3b 0a 20 20 20 20 70 42 74 2d 3e 70 50 61 67 65  ;.    pBt->pPage
117c0 31 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 73  1 = 0;.    if( s
117d0 71 6c 69 74 65 33 50 61 67 65 72 49 73 72 65 61  qlite3PagerIsrea
117e0 64 6f 6e 6c 79 28 70 42 74 2d 3e 70 50 61 67 65  donly(pBt->pPage
117f0 72 29 20 29 20 70 42 74 2d 3e 62 74 73 46 6c 61  r) ) pBt->btsFla
11800 67 73 20 7c 3d 20 42 54 53 5f 52 45 41 44 5f 4f  gs |= BTS_READ_O
11810 4e 4c 59 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  NLY;.#ifdef SQLI
11820 54 45 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45  TE_SECURE_DELETE
11830 0a 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61  .    pBt->btsFla
11840 67 73 20 7c 3d 20 42 54 53 5f 53 45 43 55 52 45  gs |= BTS_SECURE
11850 5f 44 45 4c 45 54 45 3b 0a 23 65 6e 64 69 66 0a  _DELETE;.#endif.
11860 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
11870 4f 46 3a 20 52 2d 35 31 38 37 33 2d 33 39 36 31  OF: R-51873-3961
11880 38 20 54 68 65 20 70 61 67 65 20 73 69 7a 65 20  8 The page size 
11890 66 6f 72 20 61 20 64 61 74 61 62 61 73 65 20 66  for a database f
118a0 69 6c 65 20 69 73 0a 20 20 20 20 2a 2a 20 64 65  ile is.    ** de
118b0 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20  termined by the 
118c0 32 2d 62 79 74 65 20 69 6e 74 65 67 65 72 20 6c  2-byte integer l
118d0 6f 63 61 74 65 64 20 61 74 20 61 6e 20 6f 66 66  ocated at an off
118e0 73 65 74 20 6f 66 20 31 36 20 62 79 74 65 73 20  set of 16 bytes 
118f0 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 74 68 65 20  from.    ** the 
11900 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65  beginning of the
11910 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
11920 2a 2f 0a 20 20 20 20 70 42 74 2d 3e 70 61 67 65  */.    pBt->page
11930 53 69 7a 65 20 3d 20 28 7a 44 62 48 65 61 64 65  Size = (zDbHeade
11940 72 5b 31 36 5d 3c 3c 38 29 20 7c 20 28 7a 44 62  r[16]<<8) | (zDb
11950 48 65 61 64 65 72 5b 31 37 5d 3c 3c 31 36 29 3b  Header[17]<<16);
11960 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 70 61  .    if( pBt->pa
11970 67 65 53 69 7a 65 3c 35 31 32 20 7c 7c 20 70 42  geSize<512 || pB
11980 74 2d 3e 70 61 67 65 53 69 7a 65 3e 53 51 4c 49  t->pageSize>SQLI
11990 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45  TE_MAX_PAGE_SIZE
119a0 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 28 28 70  .         || ((p
119b0 42 74 2d 3e 70 61 67 65 53 69 7a 65 2d 31 29 26  Bt->pageSize-1)&
119c0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 21 3d  pBt->pageSize)!=
119d0 30 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e  0 ){.      pBt->
119e0 70 61 67 65 53 69 7a 65 20 3d 20 30 3b 0a 23 69  pageSize = 0;.#i
119f0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
11a00 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
11a10 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6d 61 67     /* If the mag
11a20 69 63 20 6e 61 6d 65 20 22 3a 6d 65 6d 6f 72 79  ic name ":memory
11a30 3a 22 20 77 69 6c 6c 20 63 72 65 61 74 65 20 61  :" will create a
11a40 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
11a50 62 61 73 65 2c 20 74 68 65 6e 0a 20 20 20 20 20  base, then.     
11a60 20 2a 2a 20 6c 65 61 76 65 20 74 68 65 20 61 75   ** leave the au
11a70 74 6f 56 61 63 75 75 6d 20 6d 6f 64 65 20 61 74  toVacuum mode at
11a80 20 30 20 28 64 6f 20 6e 6f 74 20 61 75 74 6f 2d   0 (do not auto-
11a90 76 61 63 75 75 6d 29 2c 20 65 76 65 6e 20 69 66  vacuum), even if
11aa0 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45  .      ** SQLITE
11ab0 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43  _DEFAULT_AUTOVAC
11ac0 55 55 4d 20 69 73 20 74 72 75 65 2e 20 4f 6e 20  UUM is true. On 
11ad0 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20  the other hand, 
11ae0 69 66 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c 49  if.      ** SQLI
11af0 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42  TE_OMIT_MEMORYDB
11b00 20 68 61 73 20 62 65 65 6e 20 64 65 66 69 6e 65   has been define
11b10 64 2c 20 74 68 65 6e 20 22 3a 6d 65 6d 6f 72 79  d, then ":memory
11b20 3a 22 20 69 73 20 6a 75 73 74 20 61 0a 20 20 20  :" is just a.   
11b30 20 20 20 2a 2a 20 72 65 67 75 6c 61 72 20 66 69     ** regular fi
11b40 6c 65 2d 6e 61 6d 65 2e 20 49 6e 20 74 68 69 73  le-name. In this
11b50 20 63 61 73 65 20 74 68 65 20 61 75 74 6f 2d 76   case the auto-v
11b60 61 63 75 75 6d 20 61 70 70 6c 69 65 73 20 61 73  acuum applies as
11b70 20 70 65 72 20 6e 6f 72 6d 61 6c 2e 0a 20 20 20   per normal..   
11b80 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
11b90 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 21 69 73  zFilename && !is
11ba0 4d 65 6d 64 62 20 29 7b 0a 20 20 20 20 20 20 20  Memdb ){.       
11bb0 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
11bc0 20 3d 20 28 53 51 4c 49 54 45 5f 44 45 46 41 55   = (SQLITE_DEFAU
11bd0 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 3f 20  LT_AUTOVACUUM ? 
11be0 31 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 20 20  1 : 0);.        
11bf0 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20  pBt->incrVacuum 
11c00 3d 20 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  = (SQLITE_DEFAUL
11c10 54 5f 41 55 54 4f 56 41 43 55 55 4d 3d 3d 32 20  T_AUTOVACUUM==2 
11c20 3f 20 31 20 3a 20 30 29 3b 0a 20 20 20 20 20 20  ? 1 : 0);.      
11c30 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 6e  }.#endif.      n
11c40 52 65 73 65 72 76 65 20 3d 20 30 3b 0a 20 20 20  Reserve = 0;.   
11c50 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
11c60 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
11c70 33 37 34 39 37 2d 34 32 34 31 32 20 54 68 65 20  37497-42412 The 
11c80 73 69 7a 65 20 6f 66 20 74 68 65 20 72 65 73 65  size of the rese
11c90 72 76 65 64 20 72 65 67 69 6f 6e 20 69 73 0a 20  rved region is. 
11ca0 20 20 20 20 20 2a 2a 20 64 65 74 65 72 6d 69 6e       ** determin
11cb0 65 64 20 62 79 20 74 68 65 20 6f 6e 65 2d 62 79  ed by the one-by
11cc0 74 65 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 65  te unsigned inte
11cd0 67 65 72 20 66 6f 75 6e 64 20 61 74 20 61 6e 20  ger found at an 
11ce0 6f 66 66 73 65 74 20 6f 66 20 32 30 0a 20 20 20  offset of 20.   
11cf0 20 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20 64     ** into the d
11d00 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 65 61  atabase file hea
11d10 64 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 6e 52  der. */.      nR
11d20 65 73 65 72 76 65 20 3d 20 7a 44 62 48 65 61 64  eserve = zDbHead
11d30 65 72 5b 32 30 5d 3b 0a 20 20 20 20 20 20 70 42  er[20];.      pB
11d40 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42  t->btsFlags |= B
11d50 54 53 5f 50 41 47 45 53 49 5a 45 5f 46 49 58 45  TS_PAGESIZE_FIXE
11d60 44 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  D;.#ifndef SQLIT
11d70 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
11d80 4d 0a 20 20 20 20 20 20 70 42 74 2d 3e 61 75 74  M.      pBt->aut
11d90 6f 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62  oVacuum = (get4b
11da0 79 74 65 28 26 7a 44 62 48 65 61 64 65 72 5b 33  yte(&zDbHeader[3
11db0 36 20 2b 20 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a  6 + 4*4])?1:0);.
11dc0 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56        pBt->incrV
11dd0 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74  acuum = (get4byt
11de0 65 28 26 7a 44 62 48 65 61 64 65 72 5b 33 36 20  e(&zDbHeader[36 
11df0 2b 20 37 2a 34 5d 29 3f 31 3a 30 29 3b 0a 23 65  + 7*4])?1:0);.#e
11e00 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 72  ndif.    }.    r
11e10 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
11e20 53 65 74 50 61 67 65 73 69 7a 65 28 70 42 74 2d  SetPagesize(pBt-
11e30 3e 70 50 61 67 65 72 2c 20 26 70 42 74 2d 3e 70  >pPager, &pBt->p
11e40 61 67 65 53 69 7a 65 2c 20 6e 52 65 73 65 72 76  ageSize, nReserv
11e50 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  e);.    if( rc )
11e60 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e   goto btree_open
11e70 5f 6f 75 74 3b 0a 20 20 20 20 70 42 74 2d 3e 75  _out;.    pBt->u
11e80 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d  sableSize = pBt-
11e90 3e 70 61 67 65 53 69 7a 65 20 2d 20 6e 52 65 73  >pageSize - nRes
11ea0 65 72 76 65 3b 0a 20 20 20 20 61 73 73 65 72 74  erve;.    assert
11eb0 28 20 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  ( (pBt->pageSize
11ec0 20 26 20 37 29 3d 3d 30 20 29 3b 20 20 2f 2a 20   & 7)==0 );  /* 
11ed0 38 2d 62 79 74 65 20 61 6c 69 67 6e 6d 65 6e 74  8-byte alignment
11ee0 20 6f 66 20 70 61 67 65 53 69 7a 65 20 2a 2f 0a   of pageSize */.
11ef0 20 20 20 0a 23 69 66 20 21 64 65 66 69 6e 65 64     .#if !defined
11f00 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41  (SQLITE_OMIT_SHA
11f10 52 45 44 5f 43 41 43 48 45 29 20 26 26 20 21 64  RED_CACHE) && !d
11f20 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
11f30 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20 20 20 2f  IT_DISKIO).    /
11f40 2a 20 41 64 64 20 74 68 65 20 6e 65 77 20 42 74  * Add the new Bt
11f50 53 68 61 72 65 64 20 6f 62 6a 65 63 74 20 74 6f  Shared object to
11f60 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74   the linked list
11f70 20 73 68 61 72 61 62 6c 65 20 42 74 53 68 61 72   sharable BtShar
11f80 65 64 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  eds..    */.    
11f90 69 66 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20  if( p->sharable 
11fa0 29 7b 0a 20 20 20 20 20 20 4d 55 54 45 58 5f 4c  ){.      MUTEX_L
11fb0 4f 47 49 43 28 20 73 71 6c 69 74 65 33 5f 6d 75  OGIC( sqlite3_mu
11fc0 74 65 78 20 2a 6d 75 74 65 78 53 68 61 72 65 64  tex *mutexShared
11fd0 3b 20 29 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e  ; ).      pBt->n
11fe0 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 20 20 4d  Ref = 1;.      M
11ff0 55 54 45 58 5f 4c 4f 47 49 43 28 20 6d 75 74 65  UTEX_LOGIC( mute
12000 78 53 68 61 72 65 64 20 3d 20 73 71 6c 69 74 65  xShared = sqlite
12010 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49  3MutexAlloc(SQLI
12020 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
12030 4d 41 53 54 45 52 29 3b 29 0a 20 20 20 20 20 20  MASTER);).      
12040 69 66 28 20 53 51 4c 49 54 45 5f 54 48 52 45 41  if( SQLITE_THREA
12050 44 53 41 46 45 20 26 26 20 73 71 6c 69 74 65 33  DSAFE && sqlite3
12060 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f  GlobalConfig.bCo
12070 72 65 4d 75 74 65 78 20 29 7b 0a 20 20 20 20 20  reMutex ){.     
12080 20 20 20 70 42 74 2d 3e 6d 75 74 65 78 20 3d 20     pBt->mutex = 
12090 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f  sqlite3MutexAllo
120a0 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 46  c(SQLITE_MUTEX_F
120b0 41 53 54 29 3b 0a 20 20 20 20 20 20 20 20 69 66  AST);.        if
120c0 28 20 70 42 74 2d 3e 6d 75 74 65 78 3d 3d 30 20  ( pBt->mutex==0 
120d0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
120e0 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
120f0 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 6d 61            db->ma
12100 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 30 3b 0a  llocFailed = 0;.
12110 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 62            goto b
12120 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20  tree_open_out;. 
12130 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
12140 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  .      sqlite3_m
12150 75 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78  utex_enter(mutex
12160 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20 20 70  Shared);.      p
12170 42 74 2d 3e 70 4e 65 78 74 20 3d 20 47 4c 4f 42  Bt->pNext = GLOB
12180 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c  AL(BtShared*,sql
12190 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c  ite3SharedCacheL
121a0 69 73 74 29 3b 0a 20 20 20 20 20 20 47 4c 4f 42  ist);.      GLOB
121b0 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c  AL(BtShared*,sql
121c0 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c  ite3SharedCacheL
121d0 69 73 74 29 20 3d 20 70 42 74 3b 0a 20 20 20 20  ist) = pBt;.    
121e0 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
121f0 6c 65 61 76 65 28 6d 75 74 65 78 53 68 61 72 65  leave(mutexShare
12200 64 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  d);.    }.#endif
12210 0a 20 20 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e  .  }..#if !defin
12220 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ed(SQLITE_OMIT_S
12230 48 41 52 45 44 5f 43 41 43 48 45 29 20 26 26 20  HARED_CACHE) && 
12240 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
12250 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20 2f  OMIT_DISKIO).  /
12260 2a 20 49 66 20 74 68 65 20 6e 65 77 20 42 74 72  * If the new Btr
12270 65 65 20 75 73 65 73 20 61 20 73 68 61 72 61 62  ee uses a sharab
12280 6c 65 20 70 42 74 53 68 61 72 65 64 2c 20 74 68  le pBtShared, th
12290 65 6e 20 6c 69 6e 6b 20 74 68 65 20 6e 65 77 0a  en link the new.
122a0 20 20 2a 2a 20 42 74 72 65 65 20 69 6e 74 6f 20    ** Btree into 
122b0 74 68 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20  the list of all 
122c0 73 68 61 72 61 62 6c 65 20 42 74 72 65 65 73 20  sharable Btrees 
122d0 66 6f 72 20 74 68 65 20 73 61 6d 65 20 63 6f 6e  for the same con
122e0 6e 65 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68  nection..  ** Th
122f0 65 20 6c 69 73 74 20 69 73 20 6b 65 70 74 20 69  e list is kept i
12300 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65  n ascending orde
12310 72 20 62 79 20 70 42 74 20 61 64 64 72 65 73 73  r by pBt address
12320 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
12330 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20  sharable ){.    
12340 69 6e 74 20 69 3b 0a 20 20 20 20 42 74 72 65 65  int i;.    Btree
12350 20 2a 70 53 69 62 3b 0a 20 20 20 20 66 6f 72 28   *pSib;.    for(
12360 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  i=0; i<db->nDb; 
12370 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
12380 28 70 53 69 62 20 3d 20 64 62 2d 3e 61 44 62 5b  (pSib = db->aDb[
12390 69 5d 2e 70 42 74 29 21 3d 30 20 26 26 20 70 53  i].pBt)!=0 && pS
123a0 69 62 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a  ib->sharable ){.
123b0 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 70          while( p
123c0 53 69 62 2d 3e 70 50 72 65 76 20 29 7b 20 70 53  Sib->pPrev ){ pS
123d0 69 62 20 3d 20 70 53 69 62 2d 3e 70 50 72 65 76  ib = pSib->pPrev
123e0 3b 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20  ; }.        if( 
123f0 70 2d 3e 70 42 74 3c 70 53 69 62 2d 3e 70 42 74  p->pBt<pSib->pBt
12400 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d   ){.          p-
12410 3e 70 4e 65 78 74 20 3d 20 70 53 69 62 3b 0a 20  >pNext = pSib;. 
12420 20 20 20 20 20 20 20 20 20 70 2d 3e 70 50 72 65           p->pPre
12430 76 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  v = 0;.         
12440 20 70 53 69 62 2d 3e 70 50 72 65 76 20 3d 20 70   pSib->pPrev = p
12450 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
12460 0a 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65  .          while
12470 28 20 70 53 69 62 2d 3e 70 4e 65 78 74 20 26 26  ( pSib->pNext &&
12480 20 70 53 69 62 2d 3e 70 4e 65 78 74 2d 3e 70 42   pSib->pNext->pB
12490 74 3c 70 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20  t<p->pBt ){.    
124a0 20 20 20 20 20 20 20 20 70 53 69 62 20 3d 20 70          pSib = p
124b0 53 69 62 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  Sib->pNext;.    
124c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
124d0 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53 69    p->pNext = pSi
124e0 62 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  b->pNext;.      
124f0 20 20 20 20 70 2d 3e 70 50 72 65 76 20 3d 20 70      p->pPrev = p
12500 53 69 62 3b 0a 20 20 20 20 20 20 20 20 20 20 69  Sib;.          i
12510 66 28 20 70 2d 3e 70 4e 65 78 74 20 29 7b 0a 20  f( p->pNext ){. 
12520 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 4e             p->pN
12530 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 3b 0a  ext->pPrev = p;.
12540 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
12550 20 20 20 20 20 20 70 53 69 62 2d 3e 70 4e 65 78        pSib->pNex
12560 74 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 7d  t = p;.        }
12570 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
12580 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
12590 7d 0a 23 65 6e 64 69 66 0a 20 20 2a 70 70 42 74  }.#endif.  *ppBt
125a0 72 65 65 20 3d 20 70 3b 0a 0a 62 74 72 65 65 5f  ree = p;..btree_
125b0 6f 70 65 6e 5f 6f 75 74 3a 0a 20 20 69 66 28 20  open_out:.  if( 
125c0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
125d0 0a 20 20 20 20 69 66 28 20 70 42 74 20 26 26 20  .    if( pBt && 
125e0 70 42 74 2d 3e 70 50 61 67 65 72 20 29 7b 0a 20  pBt->pPager ){. 
125f0 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
12600 72 43 6c 6f 73 65 28 70 42 74 2d 3e 70 50 61 67  rClose(pBt->pPag
12610 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  er);.    }.    s
12620 71 6c 69 74 65 33 5f 66 72 65 65 28 70 42 74 29  qlite3_free(pBt)
12630 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
12640 65 65 28 70 29 3b 0a 20 20 20 20 2a 70 70 42 74  ee(p);.    *ppBt
12650 72 65 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  ree = 0;.  }else
12660 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  {.    /* If the 
12670 42 2d 54 72 65 65 20 77 61 73 20 73 75 63 63 65  B-Tree was succe
12680 73 73 66 75 6c 6c 79 20 6f 70 65 6e 65 64 2c 20  ssfully opened, 
12690 73 65 74 20 74 68 65 20 70 61 67 65 72 2d 63 61  set the pager-ca
126a0 63 68 65 20 73 69 7a 65 20 74 6f 20 74 68 65 0a  che size to the.
126b0 20 20 20 20 2a 2a 20 64 65 66 61 75 6c 74 20 76      ** default v
126c0 61 6c 75 65 2e 20 45 78 63 65 70 74 2c 20 77 68  alue. Except, wh
126d0 65 6e 20 6f 70 65 6e 69 6e 67 20 6f 6e 20 61 6e  en opening on an
126e0 20 65 78 69 73 74 69 6e 67 20 73 68 61 72 65 64   existing shared
126f0 20 70 61 67 65 72 2d 63 61 63 68 65 2c 0a 20 20   pager-cache,.  
12700 20 20 2a 2a 20 64 6f 20 6e 6f 74 20 63 68 61 6e    ** do not chan
12710 67 65 20 74 68 65 20 70 61 67 65 72 2d 63 61 63  ge the pager-cac
12720 68 65 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a  he size..    */.
12730 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 42      if( sqlite3B
12740 74 72 65 65 53 63 68 65 6d 61 28 70 2c 20 30 2c  treeSchema(p, 0,
12750 20 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20   0)==0 ){.      
12760 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 43  sqlite3PagerSetC
12770 61 63 68 65 73 69 7a 65 28 70 2d 3e 70 42 74 2d  achesize(p->pBt-
12780 3e 70 50 61 67 65 72 2c 20 53 51 4c 49 54 45 5f  >pPager, SQLITE_
12790 44 45 46 41 55 4c 54 5f 43 41 43 48 45 5f 53 49  DEFAULT_CACHE_SI
127a0 5a 45 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ZE);.    }.  }. 
127b0 20 69 66 28 20 6d 75 74 65 78 4f 70 65 6e 20 29   if( mutexOpen )
127c0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  {.    assert( sq
127d0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
127e0 28 6d 75 74 65 78 4f 70 65 6e 29 20 29 3b 0a 20  (mutexOpen) );. 
127f0 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
12800 5f 6c 65 61 76 65 28 6d 75 74 65 78 4f 70 65 6e  _leave(mutexOpen
12810 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
12820 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63  rc;.}../*.** Dec
12830 72 65 6d 65 6e 74 20 74 68 65 20 42 74 53 68 61  rement the BtSha
12840 72 65 64 2e 6e 52 65 66 20 63 6f 75 6e 74 65 72  red.nRef counter
12850 2e 20 20 57 68 65 6e 20 69 74 20 72 65 61 63 68  .  When it reach
12860 65 73 20 7a 65 72 6f 2c 0a 2a 2a 20 72 65 6d 6f  es zero,.** remo
12870 76 65 20 74 68 65 20 42 74 53 68 61 72 65 64 20  ve the BtShared 
12880 73 74 72 75 63 74 75 72 65 20 66 72 6f 6d 20 74  structure from t
12890 68 65 20 73 68 61 72 69 6e 67 20 6c 69 73 74 2e  he sharing list.
128a0 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74 72 75 65    Return.** true
128b0 20 69 66 20 74 68 65 20 42 74 53 68 61 72 65 64   if the BtShared
128c0 2e 6e 52 65 66 20 63 6f 75 6e 74 65 72 20 72 65  .nRef counter re
128d0 61 63 68 65 73 20 7a 65 72 6f 20 61 6e 64 20 72  aches zero and r
128e0 65 74 75 72 6e 0a 2a 2a 20 66 61 6c 73 65 20 69  eturn.** false i
128f0 66 20 69 74 20 69 73 20 73 74 69 6c 6c 20 70 6f  f it is still po
12900 73 69 74 69 76 65 2e 0a 2a 2f 0a 73 74 61 74 69  sitive..*/.stati
12910 63 20 69 6e 74 20 72 65 6d 6f 76 65 46 72 6f 6d  c int removeFrom
12920 53 68 61 72 69 6e 67 4c 69 73 74 28 42 74 53 68  SharingList(BtSh
12930 61 72 65 64 20 2a 70 42 74 29 7b 0a 23 69 66 6e  ared *pBt){.#ifn
12940 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
12950 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 4d  SHARED_CACHE.  M
12960 55 54 45 58 5f 4c 4f 47 49 43 28 20 73 71 6c 69  UTEX_LOGIC( sqli
12970 74 65 33 5f 6d 75 74 65 78 20 2a 70 4d 61 73 74  te3_mutex *pMast
12980 65 72 3b 20 29 0a 20 20 42 74 53 68 61 72 65 64  er; ).  BtShared
12990 20 2a 70 4c 69 73 74 3b 0a 20 20 69 6e 74 20 72   *pList;.  int r
129a0 65 6d 6f 76 65 64 20 3d 20 30 3b 0a 0a 20 20 61  emoved = 0;..  a
129b0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
129c0 75 74 65 78 5f 6e 6f 74 68 65 6c 64 28 70 42 74  utex_notheld(pBt
129d0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 4d 55  ->mutex) );.  MU
129e0 54 45 58 5f 4c 4f 47 49 43 28 20 70 4d 61 73 74  TEX_LOGIC( pMast
129f0 65 72 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65  er = sqlite3Mute
12a00 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55  xAlloc(SQLITE_MU
12a10 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45  TEX_STATIC_MASTE
12a20 52 29 3b 20 29 0a 20 20 73 71 6c 69 74 65 33 5f  R); ).  sqlite3_
12a30 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 4d 61 73  mutex_enter(pMas
12a40 74 65 72 29 3b 0a 20 20 70 42 74 2d 3e 6e 52 65  ter);.  pBt->nRe
12a50 66 2d 2d 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e  f--;.  if( pBt->
12a60 6e 52 65 66 3c 3d 30 20 29 7b 0a 20 20 20 20 69  nRef<=0 ){.    i
12a70 66 28 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72  f( GLOBAL(BtShar
12a80 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65  ed*,sqlite3Share
12a90 64 43 61 63 68 65 4c 69 73 74 29 3d 3d 70 42 74  dCacheList)==pBt
12aa0 20 29 7b 0a 20 20 20 20 20 20 47 4c 4f 42 41 4c   ){.      GLOBAL
12ab0 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74  (BtShared*,sqlit
12ac0 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73  e3SharedCacheLis
12ad0 74 29 20 3d 20 70 42 74 2d 3e 70 4e 65 78 74 3b  t) = pBt->pNext;
12ae0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
12af0 20 20 70 4c 69 73 74 20 3d 20 47 4c 4f 42 41 4c    pList = GLOBAL
12b00 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74  (BtShared*,sqlit
12b10 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73  e3SharedCacheLis
12b20 74 29 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28  t);.      while(
12b30 20 41 4c 57 41 59 53 28 70 4c 69 73 74 29 20 26   ALWAYS(pList) &
12b40 26 20 70 4c 69 73 74 2d 3e 70 4e 65 78 74 21 3d  & pList->pNext!=
12b50 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70  pBt ){.        p
12b60 4c 69 73 74 3d 70 4c 69 73 74 2d 3e 70 4e 65 78  List=pList->pNex
12b70 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  t;.      }.     
12b80 20 69 66 28 20 41 4c 57 41 59 53 28 70 4c 69 73   if( ALWAYS(pLis
12b90 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4c  t) ){.        pL
12ba0 69 73 74 2d 3e 70 4e 65 78 74 20 3d 20 70 42 74  ist->pNext = pBt
12bb0 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d  ->pNext;.      }
12bc0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 53  .    }.    if( S
12bd0 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45  QLITE_THREADSAFE
12be0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
12bf0 33 5f 6d 75 74 65 78 5f 66 72 65 65 28 70 42 74  3_mutex_free(pBt
12c00 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 7d 0a  ->mutex);.    }.
12c10 20 20 20 20 72 65 6d 6f 76 65 64 20 3d 20 31 3b      removed = 1;
12c20 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d  .  }.  sqlite3_m
12c30 75 74 65 78 5f 6c 65 61 76 65 28 70 4d 61 73 74  utex_leave(pMast
12c40 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65  er);.  return re
12c50 6d 6f 76 65 64 3b 0a 23 65 6c 73 65 0a 20 20 72  moved;.#else.  r
12c60 65 74 75 72 6e 20 31 3b 0a 23 65 6e 64 69 66 0a  eturn 1;.#endif.
12c70 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75  }../*.** Make su
12c80 72 65 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63  re pBt->pTmpSpac
12c90 65 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20 61  e points to an a
12ca0 6c 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 0a 2a 2a  llocation of .**
12cb0 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42   MX_CELL_SIZE(pB
12cc0 74 29 20 62 79 74 65 73 20 77 69 74 68 20 61 20  t) bytes with a 
12cd0 34 2d 62 79 74 65 20 70 72 65 66 69 78 20 66 6f  4-byte prefix fo
12ce0 72 20 61 20 6c 65 66 74 2d 63 68 69 6c 64 0a 2a  r a left-child.*
12cf0 2a 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74  * pointer..*/.st
12d00 61 74 69 63 20 76 6f 69 64 20 61 6c 6c 6f 63 61  atic void alloca
12d10 74 65 54 65 6d 70 53 70 61 63 65 28 42 74 53 68  teTempSpace(BtSh
12d20 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 66  ared *pBt){.  if
12d30 28 20 21 70 42 74 2d 3e 70 54 6d 70 53 70 61 63  ( !pBt->pTmpSpac
12d40 65 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e 70 54  e ){.    pBt->pT
12d50 6d 70 53 70 61 63 65 20 3d 20 73 71 6c 69 74 65  mpSpace = sqlite
12d60 33 50 61 67 65 4d 61 6c 6c 6f 63 28 20 70 42 74  3PageMalloc( pBt
12d70 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a 0a 20  ->pageSize );.. 
12d80 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65     /* One of the
12d90 20 75 73 65 73 20 6f 66 20 70 42 74 2d 3e 70 54   uses of pBt->pT
12da0 6d 70 53 70 61 63 65 20 69 73 20 74 6f 20 66 6f  mpSpace is to fo
12db0 72 6d 61 74 20 63 65 6c 6c 73 20 62 65 66 6f 72  rmat cells befor
12dc0 65 0a 20 20 20 20 2a 2a 20 69 6e 73 65 72 74 69  e.    ** inserti
12dd0 6e 67 20 74 68 65 6d 20 69 6e 74 6f 20 61 20 6c  ng them into a l
12de0 65 61 66 20 70 61 67 65 20 28 66 75 6e 63 74 69  eaf page (functi
12df0 6f 6e 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 29 29  on fillInCell())
12e00 2e 20 49 66 0a 20 20 20 20 2a 2a 20 61 20 63 65  . If.    ** a ce
12e10 6c 6c 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  ll is less than 
12e20 34 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c  4 bytes in size,
12e30 20 69 74 20 69 73 20 72 6f 75 6e 64 65 64 20 75   it is rounded u
12e40 70 20 74 6f 20 34 20 62 79 74 65 73 0a 20 20 20  p to 4 bytes.   
12e50 20 2a 2a 20 62 79 20 74 68 65 20 76 61 72 69 6f   ** by the vario
12e60 75 73 20 72 6f 75 74 69 6e 65 73 20 74 68 61 74  us routines that
12e70 20 6d 61 6e 69 70 75 6c 61 74 65 20 62 69 6e 61   manipulate bina
12e80 72 79 20 63 65 6c 6c 73 2e 20 57 68 69 63 68 0a  ry cells. Which.
12e90 20 20 20 20 2a 2a 20 63 61 6e 20 6d 65 61 6e 20      ** can mean 
12ea0 74 68 61 74 20 66 69 6c 6c 49 6e 43 65 6c 6c 28  that fillInCell(
12eb0 29 20 6f 6e 6c 79 20 69 6e 69 74 69 61 6c 69 7a  ) only initializ
12ec0 65 73 20 74 68 65 20 66 69 72 73 74 20 32 20 6f  es the first 2 o
12ed0 72 20 33 0a 20 20 20 20 2a 2a 20 62 79 74 65 73  r 3.    ** bytes
12ee0 20 6f 66 20 70 54 6d 70 53 70 61 63 65 2c 20 62   of pTmpSpace, b
12ef0 75 74 20 74 68 61 74 20 74 68 65 20 66 69 72 73  ut that the firs
12f00 74 20 34 20 62 79 74 65 73 20 61 72 65 20 63 6f  t 4 bytes are co
12f10 70 69 65 64 20 66 72 6f 6d 0a 20 20 20 20 2a 2a  pied from.    **
12f20 20 69 74 20 69 6e 74 6f 20 61 20 64 61 74 61 62   it into a datab
12f30 61 73 65 20 70 61 67 65 2e 20 54 68 69 73 20 69  ase page. This i
12f40 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 61  s not actually a
12f50 20 70 72 6f 62 6c 65 6d 2c 20 62 75 74 20 69 74   problem, but it
12f60 0a 20 20 20 20 2a 2a 20 64 6f 65 73 20 63 61 75  .    ** does cau
12f70 73 65 20 61 20 76 61 6c 67 72 69 6e 64 20 65 72  se a valgrind er
12f80 72 6f 72 20 77 68 65 6e 20 74 68 65 20 31 20 6f  ror when the 1 o
12f90 72 20 32 20 62 79 74 65 73 20 6f 66 20 75 6e 69  r 2 bytes of uni
12fa0 74 69 61 6c 69 7a 65 64 20 0a 20 20 20 20 2a 2a  tialized .    **
12fb0 20 64 61 74 61 20 69 73 20 70 61 73 73 65 64 20   data is passed 
12fc0 74 6f 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 77  to system call w
12fd0 72 69 74 65 28 29 2e 20 53 6f 20 74 6f 20 61 76  rite(). So to av
12fe0 6f 69 64 20 74 68 69 73 20 65 72 72 6f 72 2c 0a  oid this error,.
12ff0 20 20 20 20 2a 2a 20 7a 65 72 6f 20 74 68 65 20      ** zero the 
13000 66 69 72 73 74 20 34 20 62 79 74 65 73 20 6f 66  first 4 bytes of
13010 20 74 65 6d 70 20 73 70 61 63 65 20 68 65 72 65   temp space here
13020 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
13030 41 6c 73 6f 3a 20 20 50 72 6f 76 69 64 65 20 66  Also:  Provide f
13040 6f 75 72 20 62 79 74 65 73 20 6f 66 20 69 6e 69  our bytes of ini
13050 74 69 61 6c 69 7a 65 64 20 73 70 61 63 65 20 62  tialized space b
13060 65 66 6f 72 65 20 74 68 65 0a 20 20 20 20 2a 2a  efore the.    **
13070 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 70 54   beginning of pT
13080 6d 70 53 70 61 63 65 20 61 73 20 61 6e 20 61 72  mpSpace as an ar
13090 65 61 20 61 76 61 69 6c 61 62 6c 65 20 74 6f 20  ea available to 
130a0 70 72 65 70 65 6e 64 20 74 68 65 0a 20 20 20 20  prepend the.    
130b0 2a 2a 20 6c 65 66 74 2d 63 68 69 6c 64 20 70 6f  ** left-child po
130c0 69 6e 74 65 72 20 74 6f 20 74 68 65 20 62 65 67  inter to the beg
130d0 69 6e 6e 69 6e 67 20 6f 66 20 61 20 63 65 6c 6c  inning of a cell
130e0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
130f0 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20   pBt->pTmpSpace 
13100 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28  ){.      memset(
13110 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 2c 20  pBt->pTmpSpace, 
13120 30 2c 20 38 29 3b 0a 20 20 20 20 20 20 70 42 74  0, 8);.      pBt
13130 2d 3e 70 54 6d 70 53 70 61 63 65 20 2b 3d 20 34  ->pTmpSpace += 4
13140 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
13150 2a 0a 2a 2a 20 46 72 65 65 20 74 68 65 20 70 42  *.** Free the pB
13160 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 61 6c 6c  t->pTmpSpace all
13170 6f 63 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69  ocation.*/.stati
13180 63 20 76 6f 69 64 20 66 72 65 65 54 65 6d 70 53  c void freeTempS
13190 70 61 63 65 28 42 74 53 68 61 72 65 64 20 2a 70  pace(BtShared *p
131a0 42 74 29 7b 0a 20 20 69 66 28 20 70 42 74 2d 3e  Bt){.  if( pBt->
131b0 70 54 6d 70 53 70 61 63 65 20 29 7b 0a 20 20 20  pTmpSpace ){.   
131c0 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20   pBt->pTmpSpace 
131d0 2d 3d 20 34 3b 0a 20 20 20 20 73 71 6c 69 74 65  -= 4;.    sqlite
131e0 33 50 61 67 65 46 72 65 65 28 70 42 74 2d 3e 70  3PageFree(pBt->p
131f0 54 6d 70 53 70 61 63 65 29 3b 0a 20 20 20 20 70  TmpSpace);.    p
13200 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d 20  Bt->pTmpSpace = 
13210 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  0;.  }.}../*.** 
13220 43 6c 6f 73 65 20 61 6e 20 6f 70 65 6e 20 64 61  Close an open da
13230 74 61 62 61 73 65 20 61 6e 64 20 69 6e 76 61 6c  tabase and inval
13240 69 64 61 74 65 20 61 6c 6c 20 63 75 72 73 6f 72  idate all cursor
13250 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
13260 33 42 74 72 65 65 43 6c 6f 73 65 28 42 74 72 65  3BtreeClose(Btre
13270 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65  e *p){.  BtShare
13280 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
13290 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
132a0 72 3b 0a 0a 20 20 2f 2a 20 43 6c 6f 73 65 20 61  r;..  /* Close a
132b0 6c 6c 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 65  ll cursors opene
132c0 64 20 76 69 61 20 74 68 69 73 20 68 61 6e 64 6c  d via this handl
132d0 65 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  e.  */.  assert(
132e0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
132f0 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78  eld(p->db->mutex
13300 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ) );.  sqlite3Bt
13310 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 70  reeEnter(p);.  p
13320 43 75 72 20 3d 20 70 42 74 2d 3e 70 43 75 72 73  Cur = pBt->pCurs
13330 6f 72 3b 0a 20 20 77 68 69 6c 65 28 20 70 43 75  or;.  while( pCu
13340 72 20 29 7b 0a 20 20 20 20 42 74 43 75 72 73 6f  r ){.    BtCurso
13350 72 20 2a 70 54 6d 70 20 3d 20 70 43 75 72 3b 0a  r *pTmp = pCur;.
13360 20 20 20 20 70 43 75 72 20 3d 20 70 43 75 72 2d      pCur = pCur-
13370 3e 70 4e 65 78 74 3b 0a 20 20 20 20 69 66 28 20  >pNext;.    if( 
13380 70 54 6d 70 2d 3e 70 42 74 72 65 65 3d 3d 70 20  pTmp->pBtree==p 
13390 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
133a0 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73 6f 72  BtreeCloseCursor
133b0 28 70 54 6d 70 29 3b 0a 20 20 20 20 7d 0a 20 20  (pTmp);.    }.  
133c0 7d 0a 0a 20 20 2f 2a 20 52 6f 6c 6c 62 61 63 6b  }..  /* Rollback
133d0 20 61 6e 79 20 61 63 74 69 76 65 20 74 72 61 6e   any active tran
133e0 73 61 63 74 69 6f 6e 20 61 6e 64 20 66 72 65 65  saction and free
133f0 20 74 68 65 20 68 61 6e 64 6c 65 20 73 74 72 75   the handle stru
13400 63 74 75 72 65 2e 0a 20 20 2a 2a 20 54 68 65 20  cture..  ** The 
13410 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 42  call to sqlite3B
13420 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 29 20 64  treeRollback() d
13430 72 6f 70 73 20 61 6e 79 20 74 61 62 6c 65 2d 6c  rops any table-l
13440 6f 63 6b 73 20 68 65 6c 64 20 62 79 0a 20 20 2a  ocks held by.  *
13450 2a 20 74 68 69 73 20 68 61 6e 64 6c 65 2e 0a 20  * this handle.. 
13460 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 42 74 72   */.  sqlite3Btr
13470 65 65 52 6f 6c 6c 62 61 63 6b 28 70 2c 20 53 51  eeRollback(p, SQ
13480 4c 49 54 45 5f 4f 4b 2c 20 30 29 3b 0a 20 20 73  LITE_OK, 0);.  s
13490 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
134a0 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  (p);..  /* If th
134b0 65 72 65 20 61 72 65 20 73 74 69 6c 6c 20 6f 74  ere are still ot
134c0 68 65 72 20 6f 75 74 73 74 61 6e 64 69 6e 67 20  her outstanding 
134d0 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68  references to th
134e0 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 0a 20  e shared-btree. 
134f0 20 2a 2a 20 73 74 72 75 63 74 75 72 65 2c 20 72   ** structure, r
13500 65 74 75 72 6e 20 6e 6f 77 2e 20 54 68 65 20 72  eturn now. The r
13510 65 6d 61 69 6e 64 65 72 20 6f 66 20 74 68 69 73  emainder of this
13520 20 70 72 6f 63 65 64 75 72 65 20 63 6c 65 61 6e   procedure clean
13530 73 20 0a 20 20 2a 2a 20 75 70 20 74 68 65 20 73  s .  ** up the s
13540 68 61 72 65 64 2d 62 74 72 65 65 2e 0a 20 20 2a  hared-btree..  *
13550 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 77  /.  assert( p->w
13560 61 6e 74 54 6f 4c 6f 63 6b 3d 3d 30 20 26 26 20  antToLock==0 && 
13570 70 2d 3e 6c 6f 63 6b 65 64 3d 3d 30 20 29 3b 0a  p->locked==0 );.
13580 20 20 69 66 28 20 21 70 2d 3e 73 68 61 72 61 62    if( !p->sharab
13590 6c 65 20 7c 7c 20 72 65 6d 6f 76 65 46 72 6f 6d  le || removeFrom
135a0 53 68 61 72 69 6e 67 4c 69 73 74 28 70 42 74 29  SharingList(pBt)
135b0 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70   ){.    /* The p
135c0 42 74 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20  Bt is no longer 
135d0 6f 6e 20 74 68 65 20 73 68 61 72 69 6e 67 20 6c  on the sharing l
135e0 69 73 74 2c 20 73 6f 20 77 65 20 63 61 6e 20 61  ist, so we can a
135f0 63 63 65 73 73 0a 20 20 20 20 2a 2a 20 69 74 20  ccess.    ** it 
13600 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74  without having t
13610 6f 20 68 6f 6c 64 20 74 68 65 20 6d 75 74 65 78  o hold the mutex
13620 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
13630 43 6c 65 61 6e 20 6f 75 74 20 61 6e 64 20 64 65  Clean out and de
13640 6c 65 74 65 20 74 68 65 20 42 74 53 68 61 72 65  lete the BtShare
13650 64 20 6f 62 6a 65 63 74 2e 0a 20 20 20 20 2a 2f  d object..    */
13660 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70 42  .    assert( !pB
13670 74 2d 3e 70 43 75 72 73 6f 72 20 29 3b 0a 20 20  t->pCursor );.  
13680 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c    sqlite3PagerCl
13690 6f 73 65 28 70 42 74 2d 3e 70 50 61 67 65 72 29  ose(pBt->pPager)
136a0 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 78  ;.    if( pBt->x
136b0 46 72 65 65 53 63 68 65 6d 61 20 26 26 20 70 42  FreeSchema && pB
136c0 74 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20  t->pSchema ){.  
136d0 20 20 20 20 70 42 74 2d 3e 78 46 72 65 65 53 63      pBt->xFreeSc
136e0 68 65 6d 61 28 70 42 74 2d 3e 70 53 63 68 65 6d  hema(pBt->pSchem
136f0 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  a);.    }.    sq
13700 6c 69 74 65 33 44 62 46 72 65 65 28 30 2c 20 70  lite3DbFree(0, p
13710 42 74 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20  Bt->pSchema);.  
13720 20 20 66 72 65 65 54 65 6d 70 53 70 61 63 65 28    freeTempSpace(
13730 70 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  pBt);.    sqlite
13740 33 5f 66 72 65 65 28 70 42 74 29 3b 0a 20 20 7d  3_free(pBt);.  }
13750 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
13760 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
13770 48 45 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  HE.  assert( p->
13780 77 61 6e 74 54 6f 4c 6f 63 6b 3d 3d 30 20 29 3b  wantToLock==0 );
13790 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6c 6f  .  assert( p->lo
137a0 63 6b 65 64 3d 3d 30 20 29 3b 0a 20 20 69 66 28  cked==0 );.  if(
137b0 20 70 2d 3e 70 50 72 65 76 20 29 20 70 2d 3e 70   p->pPrev ) p->p
137c0 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 2d  Prev->pNext = p-
137d0 3e 70 4e 65 78 74 3b 0a 20 20 69 66 28 20 70 2d  >pNext;.  if( p-
137e0 3e 70 4e 65 78 74 20 29 20 70 2d 3e 70 4e 65 78  >pNext ) p->pNex
137f0 74 2d 3e 70 50 72 65 76 20 3d 20 70 2d 3e 70 50  t->pPrev = p->pP
13800 72 65 76 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 73  rev;.#endif..  s
13810 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
13820 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
13830 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61  OK;.}../*.** Cha
13840 6e 67 65 20 74 68 65 20 6c 69 6d 69 74 20 6f 6e  nge the limit on
13850 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
13860 61 67 65 73 20 61 6c 6c 6f 77 65 64 20 69 6e 20  ages allowed in 
13870 74 68 65 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a  the cache..**.**
13880 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d   The maximum num
13890 62 65 72 20 6f 66 20 63 61 63 68 65 20 70 61 67  ber of cache pag
138a0 65 73 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  es is set to the
138b0 20 61 62 73 6f 6c 75 74 65 0a 2a 2a 20 76 61 6c   absolute.** val
138c0 75 65 20 6f 66 20 6d 78 50 61 67 65 2e 20 20 49  ue of mxPage.  I
138d0 66 20 6d 78 50 61 67 65 20 69 73 20 6e 65 67 61  f mxPage is nega
138e0 74 69 76 65 2c 20 74 68 65 20 70 61 67 65 72 20  tive, the pager 
138f0 77 69 6c 6c 0a 2a 2a 20 6f 70 65 72 61 74 65 20  will.** operate 
13900 61 73 79 6e 63 68 72 6f 6e 6f 75 73 6c 79 20 2d  asynchronously -
13910 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20 73 74 6f   it will not sto
13920 70 20 74 6f 20 64 6f 20 66 73 79 6e 63 28 29 73  p to do fsync()s
13930 0a 2a 2a 20 74 6f 20 69 6e 73 75 72 65 20 64 61  .** to insure da
13940 74 61 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f  ta is written to
13950 20 74 68 65 20 64 69 73 6b 20 73 75 72 66 61 63   the disk surfac
13960 65 20 62 65 66 6f 72 65 0a 2a 2a 20 63 6f 6e 74  e before.** cont
13970 69 6e 75 69 6e 67 2e 20 20 54 72 61 6e 73 61 63  inuing.  Transac
13980 74 69 6f 6e 73 20 73 74 69 6c 6c 20 77 6f 72 6b  tions still work
13990 20 69 66 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20   if synchronous 
139a0 69 73 20 6f 66 66 2c 0a 2a 2a 20 61 6e 64 20 74  is off,.** and t
139b0 68 65 20 64 61 74 61 62 61 73 65 20 63 61 6e 6e  he database cann
139c0 6f 74 20 62 65 20 63 6f 72 72 75 70 74 65 64 20  ot be corrupted 
139d0 69 66 20 74 68 69 73 20 70 72 6f 67 72 61 6d 0a  if this program.
139e0 2a 2a 20 63 72 61 73 68 65 73 2e 20 20 42 75 74  ** crashes.  But
139f0 20 69 66 20 74 68 65 20 6f 70 65 72 61 74 69 6e   if the operatin
13a00 67 20 73 79 73 74 65 6d 20 63 72 61 73 68 65 73  g system crashes
13a10 20 6f 72 20 74 68 65 72 65 20 69 73 0a 2a 2a 20   or there is.** 
13a20 61 6e 20 61 62 72 75 70 74 20 70 6f 77 65 72 20  an abrupt power 
13a30 66 61 69 6c 75 72 65 20 77 68 65 6e 20 73 79 6e  failure when syn
13a40 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f 66 66 2c  chronous is off,
13a50 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a   the database.**
13a60 20 63 6f 75 6c 64 20 62 65 20 6c 65 66 74 20 69   could be left i
13a70 6e 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e  n an inconsisten
13a80 74 20 61 6e 64 20 75 6e 72 65 63 6f 76 65 72 61  t and unrecovera
13a90 62 6c 65 20 73 74 61 74 65 2e 0a 2a 2a 20 53 79  ble state..** Sy
13aa0 6e 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f 6e 20  nchronous is on 
13ab0 62 79 20 64 65 66 61 75 6c 74 20 73 6f 20 64 61  by default so da
13ac0 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f  tabase corruptio
13ad0 6e 20 69 73 20 6e 6f 74 0a 2a 2a 20 6e 6f 72 6d  n is not.** norm
13ae0 61 6c 6c 79 20 61 20 77 6f 72 72 79 2e 0a 2a 2f  ally a worry..*/
13af0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
13b00 65 53 65 74 43 61 63 68 65 53 69 7a 65 28 42 74  eSetCacheSize(Bt
13b10 72 65 65 20 2a 70 2c 20 69 6e 74 20 6d 78 50 61  ree *p, int mxPa
13b20 67 65 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  ge){.  BtShared 
13b30 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
13b40 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
13b50 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64  _mutex_held(p->d
13b60 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73  b->mutex) );.  s
13b70 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
13b80 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61  (p);.  sqlite3Pa
13b90 67 65 72 53 65 74 43 61 63 68 65 73 69 7a 65 28  gerSetCachesize(
13ba0 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6d 78 50  pBt->pPager, mxP
13bb0 61 67 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  age);.  sqlite3B
13bc0 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
13bd0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
13be0 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  ;.}..#if SQLITE_
13bf0 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a  MAX_MMAP_SIZE>0.
13c00 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
13c10 20 6c 69 6d 69 74 20 6f 6e 20 74 68 65 20 61 6d   limit on the am
13c20 6f 75 6e 74 20 6f 66 20 74 68 65 20 64 61 74 61  ount of the data
13c30 62 61 73 65 20 66 69 6c 65 20 74 68 61 74 20 6d  base file that m
13c40 61 79 20 62 65 0a 2a 2a 20 6d 65 6d 6f 72 79 20  ay be.** memory 
13c50 6d 61 70 70 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  mapped..*/.int s
13c60 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 4d 6d  qlite3BtreeSetMm
13c70 61 70 4c 69 6d 69 74 28 42 74 72 65 65 20 2a 70  apLimit(Btree *p
13c80 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20  , sqlite3_int64 
13c90 73 7a 4d 6d 61 70 29 7b 0a 20 20 42 74 53 68 61  szMmap){.  BtSha
13ca0 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
13cb0 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  t;.  assert( sql
13cc0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
13cd0 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  p->db->mutex) );
13ce0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
13cf0 6e 74 65 72 28 70 29 3b 0a 20 20 73 71 6c 69 74  nter(p);.  sqlit
13d00 65 33 50 61 67 65 72 53 65 74 4d 6d 61 70 4c 69  e3PagerSetMmapLi
13d10 6d 69 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  mit(pBt->pPager,
13d20 20 73 7a 4d 6d 61 70 29 3b 0a 20 20 73 71 6c 69   szMmap);.  sqli
13d30 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
13d40 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
13d50 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  E_OK;.}.#endif /
13d60 2a 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  * SQLITE_MAX_MMA
13d70 50 5f 53 49 5a 45 3e 30 20 2a 2f 0a 0a 2f 2a 0a  P_SIZE>0 */../*.
13d80 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 77 61  ** Change the wa
13d90 79 20 64 61 74 61 20 69 73 20 73 79 6e 63 65 64  y data is synced
13da0 20 74 6f 20 64 69 73 6b 20 69 6e 20 6f 72 64 65   to disk in orde
13db0 72 20 74 6f 20 69 6e 63 72 65 61 73 65 20 6f 72  r to increase or
13dc0 20 64 65 63 72 65 61 73 65 0a 2a 2a 20 68 6f 77   decrease.** how
13dd0 20 77 65 6c 6c 20 74 68 65 20 64 61 74 61 62 61   well the databa
13de0 73 65 20 72 65 73 69 73 74 73 20 64 61 6d 61 67  se resists damag
13df0 65 20 64 75 65 20 74 6f 20 4f 53 20 63 72 61 73  e due to OS cras
13e00 68 65 73 20 61 6e 64 20 70 6f 77 65 72 0a 2a 2a  hes and power.**
13e10 20 66 61 69 6c 75 72 65 73 2e 20 20 4c 65 76 65   failures.  Leve
13e20 6c 20 31 20 69 73 20 74 68 65 20 73 61 6d 65 20  l 1 is the same 
13e30 61 73 20 61 73 79 6e 63 68 72 6f 6e 6f 75 73 20  as asynchronous 
13e40 28 6e 6f 20 73 79 6e 63 73 28 29 20 6f 63 63 75  (no syncs() occu
13e50 72 20 61 6e 64 0a 2a 2a 20 74 68 65 72 65 20 69  r and.** there i
13e60 73 20 61 20 68 69 67 68 20 70 72 6f 62 61 62 69  s a high probabi
13e70 6c 69 74 79 20 6f 66 20 64 61 6d 61 67 65 29 20  lity of damage) 
13e80 20 4c 65 76 65 6c 20 32 20 69 73 20 74 68 65 20   Level 2 is the 
13e90 64 65 66 61 75 6c 74 2e 20 20 54 68 65 72 65 0a  default.  There.
13ea0 2a 2a 20 69 73 20 61 20 76 65 72 79 20 6c 6f 77  ** is a very low
13eb0 20 62 75 74 20 6e 6f 6e 2d 7a 65 72 6f 20 70 72   but non-zero pr
13ec0 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 64 61 6d  obability of dam
13ed0 61 67 65 2e 20 20 4c 65 76 65 6c 20 33 20 72 65  age.  Level 3 re
13ee0 64 75 63 65 73 20 74 68 65 0a 2a 2a 20 70 72 6f  duces the.** pro
13ef0 62 61 62 69 6c 69 74 79 20 6f 66 20 64 61 6d 61  bability of dama
13f00 67 65 20 74 6f 20 6e 65 61 72 20 7a 65 72 6f 20  ge to near zero 
13f10 62 75 74 20 77 69 74 68 20 61 20 77 72 69 74 65  but with a write
13f20 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 72 65 64   performance red
13f30 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e 64  uction..*/.#ifnd
13f40 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50  ef SQLITE_OMIT_P
13f50 41 47 45 52 5f 50 52 41 47 4d 41 53 0a 69 6e 74  AGER_PRAGMAS.int
13f60 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74   sqlite3BtreeSet
13f70 50 61 67 65 72 46 6c 61 67 73 28 0a 20 20 42 74  PagerFlags(.  Bt
13f80 72 65 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ree *p,         
13f90 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65       /* The btre
13fa0 65 20 74 6f 20 73 65 74 20 74 68 65 20 73 61 66  e to set the saf
13fb0 65 74 79 20 6c 65 76 65 6c 20 6f 6e 20 2a 2f 0a  ety level on */.
13fc0 20 20 75 6e 73 69 67 6e 65 64 20 70 67 46 6c 61    unsigned pgFla
13fd0 67 73 20 20 20 20 20 20 20 2f 2a 20 56 61 72 69  gs       /* Vari
13fe0 6f 75 73 20 50 41 47 45 52 5f 2a 20 66 6c 61 67  ous PAGER_* flag
13ff0 73 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68 61 72  s */.){.  BtShar
14000 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
14010 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
14020 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
14030 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  ->db->mutex) );.
14040 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
14050 74 65 72 28 70 29 3b 0a 20 20 73 71 6c 69 74 65  ter(p);.  sqlite
14060 33 50 61 67 65 72 53 65 74 46 6c 61 67 73 28 70  3PagerSetFlags(p
14070 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 67 46 6c  Bt->pPager, pgFl
14080 61 67 73 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  ags);.  sqlite3B
14090 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
140a0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
140b0 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
140c0 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
140d0 20 74 68 65 20 67 69 76 65 6e 20 62 74 72 65 65   the given btree
140e0 20 69 73 20 73 65 74 20 74 6f 20 73 61 66 65 74   is set to safet
140f0 79 20 6c 65 76 65 6c 20 31 2e 20 20 49 6e 20 6f  y level 1.  In o
14100 74 68 65 72 0a 2a 2a 20 77 6f 72 64 73 2c 20 72  ther.** words, r
14110 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 6e 6f  eturn TRUE if no
14120 20 73 79 6e 63 28 29 20 6f 63 63 75 72 73 20 6f   sync() occurs o
14130 6e 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65 73  n the disk files
14140 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
14150 42 74 72 65 65 53 79 6e 63 44 69 73 61 62 6c 65  BtreeSyncDisable
14160 64 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42  d(Btree *p){.  B
14170 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
14180 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72 63 3b  ->pBt;.  int rc;
14190 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
141a0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d  e3_mutex_held(p-
141b0 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 20 20  >db->mutex) );  
141c0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
141d0 6e 74 65 72 28 70 29 3b 0a 20 20 61 73 73 65 72  nter(p);.  asser
141e0 74 28 20 70 42 74 20 26 26 20 70 42 74 2d 3e 70  t( pBt && pBt->p
141f0 50 61 67 65 72 20 29 3b 0a 20 20 72 63 20 3d 20  Pager );.  rc = 
14200 73 71 6c 69 74 65 33 50 61 67 65 72 4e 6f 73 79  sqlite3PagerNosy
14210 6e 63 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b  nc(pBt->pPager);
14220 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
14230 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
14240 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  n rc;.}../*.** C
14250 68 61 6e 67 65 20 74 68 65 20 64 65 66 61 75 6c  hange the defaul
14260 74 20 70 61 67 65 73 20 73 69 7a 65 20 61 6e 64  t pages size and
14270 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
14280 65 73 65 72 76 65 64 20 62 79 74 65 73 20 70 65  eserved bytes pe
14290 72 20 70 61 67 65 2e 0a 2a 2a 20 4f 72 2c 20 69  r page..** Or, i
142a0 66 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20  f the page size 
142b0 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
142c0 20 66 69 78 65 64 2c 20 72 65 74 75 72 6e 20 53   fixed, return S
142d0 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20 0a  QLITE_READONLY .
142e0 2a 2a 20 77 69 74 68 6f 75 74 20 63 68 61 6e 67  ** without chang
142f0 69 6e 67 20 61 6e 79 74 68 69 6e 67 2e 0a 2a 2a  ing anything..**
14300 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 73 69 7a  .** The page siz
14310 65 20 6d 75 73 74 20 62 65 20 61 20 70 6f 77 65  e must be a powe
14320 72 20 6f 66 20 32 20 62 65 74 77 65 65 6e 20 35  r of 2 between 5
14330 31 32 20 61 6e 64 20 36 35 35 33 36 2e 20 20 49  12 and 65536.  I
14340 66 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 73 69  f the page.** si
14350 7a 65 20 73 75 70 70 6c 69 65 64 20 64 6f 65 73  ze supplied does
14360 20 6e 6f 74 20 6d 65 65 74 20 74 68 69 73 20 63   not meet this c
14370 6f 6e 73 74 72 61 69 6e 74 20 74 68 65 6e 20 74  onstraint then t
14380 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73 20  he page size is 
14390 6e 6f 74 0a 2a 2a 20 63 68 61 6e 67 65 64 2e 0a  not.** changed..
143a0 2a 2a 0a 2a 2a 20 50 61 67 65 20 73 69 7a 65 73  **.** Page sizes
143b0 20 61 72 65 20 63 6f 6e 73 74 72 61 69 6e 65 64   are constrained
143c0 20 74 6f 20 62 65 20 61 20 70 6f 77 65 72 20 6f   to be a power o
143d0 66 20 74 77 6f 20 73 6f 20 74 68 61 74 20 74 68  f two so that th
143e0 65 20 72 65 67 69 6f 6e 0a 2a 2a 20 6f 66 20 74  e region.** of t
143f0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
14400 20 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b 69 6e   used for lockin
14410 67 20 28 62 65 67 69 6e 6e 69 6e 67 20 61 74 20  g (beginning at 
14420 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 0a 2a 2a  PENDING_BYTE,.**
14430 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20   the first byte 
14440 70 61 73 74 20 74 68 65 20 31 47 42 20 62 6f 75  past the 1GB bou
14450 6e 64 61 72 79 2c 20 30 78 34 30 30 30 30 30 30  ndary, 0x4000000
14460 30 29 20 6e 65 65 64 73 20 74 6f 20 6f 63 63 75  0) needs to occu
14470 72 0a 2a 2a 20 61 74 20 74 68 65 20 62 65 67 69  r.** at the begi
14480 6e 6e 69 6e 67 20 6f 66 20 61 20 70 61 67 65 2e  nning of a page.
14490 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65  .**.** If parame
144a0 74 65 72 20 6e 52 65 73 65 72 76 65 20 69 73 20  ter nReserve is 
144b0 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20  less than zero, 
144c0 74 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  then the number 
144d0 6f 66 20 72 65 73 65 72 76 65 64 0a 2a 2a 20 62  of reserved.** b
144e0 79 74 65 73 20 70 65 72 20 70 61 67 65 20 69 73  ytes per page is
144f0 20 6c 65 66 74 20 75 6e 63 68 61 6e 67 65 64 2e   left unchanged.
14500 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 46  .**.** If the iF
14510 69 78 21 3d 30 20 74 68 65 6e 20 74 68 65 20 42  ix!=0 then the B
14520 54 53 5f 50 41 47 45 53 49 5a 45 5f 46 49 58 45  TS_PAGESIZE_FIXE
14530 44 20 66 6c 61 67 20 69 73 20 73 65 74 20 73 6f  D flag is set so
14540 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 73   that the page s
14550 69 7a 65 0a 2a 2a 20 61 6e 64 20 61 75 74 6f 76  ize.** and autov
14560 61 63 75 75 6d 20 6d 6f 64 65 20 63 61 6e 20 6e  acuum mode can n
14570 6f 20 6c 6f 6e 67 65 72 20 62 65 20 63 68 61 6e  o longer be chan
14580 67 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ged..*/.int sqli
14590 74 65 33 42 74 72 65 65 53 65 74 50 61 67 65 53  te3BtreeSetPageS
145a0 69 7a 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  ize(Btree *p, in
145b0 74 20 70 61 67 65 53 69 7a 65 2c 20 69 6e 74 20  t pageSize, int 
145c0 6e 52 65 73 65 72 76 65 2c 20 69 6e 74 20 69 46  nReserve, int iF
145d0 69 78 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ix){.  int rc = 
145e0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 42 74 53  SQLITE_OK;.  BtS
145f0 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
14600 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  pBt;.  assert( n
14610 52 65 73 65 72 76 65 3e 3d 2d 31 20 26 26 20 6e  Reserve>=-1 && n
14620 52 65 73 65 72 76 65 3c 3d 32 35 35 20 29 3b 0a  Reserve<=255 );.
14630 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
14640 74 65 72 28 70 29 3b 0a 23 69 66 20 53 51 4c 49  ter(p);.#if SQLI
14650 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 69  TE_HAS_CODEC.  i
14660 66 28 20 6e 52 65 73 65 72 76 65 3e 70 42 74 2d  f( nReserve>pBt-
14670 3e 6f 70 74 69 6d 61 6c 52 65 73 65 72 76 65 20  >optimalReserve 
14680 29 20 70 42 74 2d 3e 6f 70 74 69 6d 61 6c 52 65  ) pBt->optimalRe
14690 73 65 72 76 65 20 3d 20 28 75 38 29 6e 52 65 73  serve = (u8)nRes
146a0 65 72 76 65 3b 0a 23 65 6e 64 69 66 0a 20 20 69  erve;.#endif.  i
146b0 66 28 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  f( pBt->btsFlags
146c0 20 26 20 42 54 53 5f 50 41 47 45 53 49 5a 45 5f   & BTS_PAGESIZE_
146d0 46 49 58 45 44 20 29 7b 0a 20 20 20 20 73 71 6c  FIXED ){.    sql
146e0 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
146f0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
14700 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20  LITE_READONLY;. 
14710 20 7d 0a 20 20 69 66 28 20 6e 52 65 73 65 72 76   }.  if( nReserv
14720 65 3c 30 20 29 7b 0a 20 20 20 20 6e 52 65 73 65  e<0 ){.    nRese
14730 72 76 65 20 3d 20 70 42 74 2d 3e 70 61 67 65 53  rve = pBt->pageS
14740 69 7a 65 20 2d 20 70 42 74 2d 3e 75 73 61 62 6c  ize - pBt->usabl
14750 65 53 69 7a 65 3b 0a 20 20 7d 0a 20 20 61 73 73  eSize;.  }.  ass
14760 65 72 74 28 20 6e 52 65 73 65 72 76 65 3e 3d 30  ert( nReserve>=0
14770 20 26 26 20 6e 52 65 73 65 72 76 65 3c 3d 32 35   && nReserve<=25
14780 35 20 29 3b 0a 20 20 69 66 28 20 70 61 67 65 53  5 );.  if( pageS
14790 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 61 67 65  ize>=512 && page
147a0 53 69 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d 41 58  Size<=SQLITE_MAX
147b0 5f 50 41 47 45 5f 53 49 5a 45 20 26 26 0a 20 20  _PAGE_SIZE &&.  
147c0 20 20 20 20 20 20 28 28 70 61 67 65 53 69 7a 65        ((pageSize
147d0 2d 31 29 26 70 61 67 65 53 69 7a 65 29 3d 3d 30  -1)&pageSize)==0
147e0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
147f0 28 70 61 67 65 53 69 7a 65 20 26 20 37 29 3d 3d  (pageSize & 7)==
14800 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
14810 20 21 70 42 74 2d 3e 70 50 61 67 65 31 20 26 26   !pBt->pPage1 &&
14820 20 21 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 29   !pBt->pCursor )
14830 3b 0a 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53  ;.    pBt->pageS
14840 69 7a 65 20 3d 20 28 75 33 32 29 70 61 67 65 53  ize = (u32)pageS
14850 69 7a 65 3b 0a 20 20 20 20 66 72 65 65 54 65 6d  ize;.    freeTem
14860 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20 7d  pSpace(pBt);.  }
14870 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
14880 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28  agerSetPagesize(
14890 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70 42  pBt->pPager, &pB
148a0 74 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6e 52 65  t->pageSize, nRe
148b0 73 65 72 76 65 29 3b 0a 20 20 70 42 74 2d 3e 75  serve);.  pBt->u
148c0 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d  sableSize = pBt-
148d0 3e 70 61 67 65 53 69 7a 65 20 2d 20 28 75 31 36  >pageSize - (u16
148e0 29 6e 52 65 73 65 72 76 65 3b 0a 20 20 69 66 28  )nReserve;.  if(
148f0 20 69 46 69 78 20 29 20 70 42 74 2d 3e 62 74 73   iFix ) pBt->bts
14900 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 50 41 47  Flags |= BTS_PAG
14910 45 53 49 5a 45 5f 46 49 58 45 44 3b 0a 20 20 73  ESIZE_FIXED;.  s
14920 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
14930 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
14940 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
14950 6e 20 74 68 65 20 63 75 72 72 65 6e 74 6c 79 20  n the currently 
14960 64 65 66 69 6e 65 64 20 70 61 67 65 20 73 69 7a  defined page siz
14970 65 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  e.*/.int sqlite3
14980 42 74 72 65 65 47 65 74 50 61 67 65 53 69 7a 65  BtreeGetPageSize
14990 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 72 65  (Btree *p){.  re
149a0 74 75 72 6e 20 70 2d 3e 70 42 74 2d 3e 70 61 67  turn p->pBt->pag
149b0 65 53 69 7a 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  eSize;.}../*.** 
149c0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
149d0 20 73 69 6d 69 6c 61 72 20 74 6f 20 73 71 6c 69   similar to sqli
149e0 74 65 33 42 74 72 65 65 47 65 74 52 65 73 65 72  te3BtreeGetReser
149f0 76 65 28 29 2c 20 65 78 63 65 70 74 20 74 68 61  ve(), except tha
14a00 74 20 69 74 0a 2a 2a 20 6d 61 79 20 6f 6e 6c 79  t it.** may only
14a10 20 62 65 20 63 61 6c 6c 65 64 20 69 66 20 69 74   be called if it
14a20 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
14a30 68 61 74 20 74 68 65 20 62 2d 74 72 65 65 20 6d  hat the b-tree m
14a40 75 74 65 78 20 69 73 20 61 6c 72 65 61 64 79 0a  utex is already.
14a50 2a 2a 20 68 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20 54  ** held..**.** T
14a60 68 69 73 20 69 73 20 75 73 65 66 75 6c 20 69 6e  his is useful in
14a70 20 6f 6e 65 20 73 70 65 63 69 61 6c 20 63 61 73   one special cas
14a80 65 20 69 6e 20 74 68 65 20 62 61 63 6b 75 70 20  e in the backup 
14a90 41 50 49 20 63 6f 64 65 20 77 68 65 72 65 20 69  API code where i
14aa0 74 20 69 73 0a 2a 2a 20 6b 6e 6f 77 6e 20 74 68  t is.** known th
14ab0 61 74 20 74 68 65 20 73 68 61 72 65 64 20 62 2d  at the shared b-
14ac0 74 72 65 65 20 6d 75 74 65 78 20 69 73 20 68 65  tree mutex is he
14ad0 6c 64 2c 20 62 75 74 20 74 68 65 20 6d 75 74 65  ld, but the mute
14ae0 78 20 6f 6e 20 74 68 65 20 0a 2a 2a 20 64 61 74  x on the .** dat
14af0 61 62 61 73 65 20 68 61 6e 64 6c 65 20 74 68 61  abase handle tha
14b00 74 20 6f 77 6e 73 20 2a 70 20 69 73 20 6e 6f 74  t owns *p is not
14b10 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 69  . In this case i
14b20 66 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e  f sqlite3BtreeEn
14b30 74 65 72 28 29 0a 2a 2a 20 77 65 72 65 20 74 6f  ter().** were to
14b40 20 62 65 20 63 61 6c 6c 65 64 2c 20 69 74 20 6d   be called, it m
14b50 69 67 68 74 20 63 6f 6c 6c 69 64 65 20 77 69 74  ight collide wit
14b60 68 20 73 6f 6d 65 20 6f 74 68 65 72 20 6f 70 65  h some other ope
14b70 72 61 74 69 6f 6e 20 6f 6e 20 74 68 65 0a 2a 2a  ration on the.**
14b80 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
14b90 20 74 68 61 74 20 6f 77 6e 73 20 2a 70 2c 20 63   that owns *p, c
14ba0 61 75 73 69 6e 67 20 75 6e 64 65 66 69 6e 65 64  ausing undefined
14bb0 20 62 65 68 61 76 69 6f 72 2e 0a 2a 2f 0a 69 6e   behavior..*/.in
14bc0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  t sqlite3BtreeGe
14bd0 74 52 65 73 65 72 76 65 4e 6f 4d 75 74 65 78 28  tReserveNoMutex(
14be0 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74  Btree *p){.  int
14bf0 20 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   n;.  assert( sq
14c00 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
14c10 28 70 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  (p->pBt->mutex) 
14c20 29 3b 0a 20 20 6e 20 3d 20 70 2d 3e 70 42 74 2d  );.  n = p->pBt-
14c30 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 2d 3e 70  >pageSize - p->p
14c40 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a  Bt->usableSize;.
14c50 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f    return n;.}../
14c60 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
14c70 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
14c80 6f 66 20 73 70 61 63 65 20 61 74 20 74 68 65 20  of space at the 
14c90 65 6e 64 20 6f 66 20 65 76 65 72 79 20 70 61 67  end of every pag
14ca0 65 20 74 68 61 74 0a 2a 2a 20 61 72 65 20 69 6e  e that.** are in
14cb0 74 65 6e 74 75 61 6c 6c 79 20 6c 65 66 74 20 75  tentually left u
14cc0 6e 75 73 65 64 2e 20 20 54 68 69 73 20 69 73 20  nused.  This is 
14cd0 74 68 65 20 22 72 65 73 65 72 76 65 64 22 20 73  the "reserved" s
14ce0 70 61 63 65 20 74 68 61 74 20 69 73 0a 2a 2a 20  pace that is.** 
14cf0 73 6f 6d 65 74 69 6d 65 73 20 75 73 65 64 20 62  sometimes used b
14d00 79 20 65 78 74 65 6e 73 69 6f 6e 73 2e 0a 2a 2a  y extensions..**
14d10 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 48 41  .** If SQLITE_HA
14d20 53 5f 4d 55 54 45 58 20 69 73 20 64 65 66 69 6e  S_MUTEX is defin
14d30 65 64 20 74 68 65 6e 20 74 68 65 20 6e 75 6d 62  ed then the numb
14d40 65 72 20 72 65 74 75 72 6e 65 64 20 69 73 20 74  er returned is t
14d50 68 65 0a 2a 2a 20 67 72 65 61 74 65 72 20 6f 66  he.** greater of
14d60 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 65 73   the current res
14d70 65 72 76 65 64 20 73 70 61 63 65 20 61 6e 64 20  erved space and 
14d80 74 68 65 20 6d 61 78 69 6d 75 6d 20 72 65 71 75  the maximum requ
14d90 65 73 74 65 64 0a 2a 2a 20 72 65 73 65 72 76 65  ested.** reserve
14da0 20 73 70 61 63 65 2e 0a 2a 2f 0a 69 6e 74 20 73   space..*/.int s
14db0 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 4f 70  qlite3BtreeGetOp
14dc0 74 69 6d 61 6c 52 65 73 65 72 76 65 28 42 74 72  timalReserve(Btr
14dd0 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 3b  ee *p){.  int n;
14de0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
14df0 6e 74 65 72 28 70 29 3b 0a 20 20 6e 20 3d 20 73  nter(p);.  n = s
14e00 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 52 65  qlite3BtreeGetRe
14e10 73 65 72 76 65 4e 6f 4d 75 74 65 78 28 70 29 3b  serveNoMutex(p);
14e20 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48  .#ifdef SQLITE_H
14e30 41 53 5f 43 4f 44 45 43 0a 20 20 69 66 28 20 6e  AS_CODEC.  if( n
14e40 3c 70 2d 3e 70 42 74 2d 3e 6f 70 74 69 6d 61 6c  <p->pBt->optimal
14e50 52 65 73 65 72 76 65 20 29 20 6e 20 3d 20 70 2d  Reserve ) n = p-
14e60 3e 70 42 74 2d 3e 6f 70 74 69 6d 61 6c 52 65 73  >pBt->optimalRes
14e70 65 72 76 65 3b 0a 23 65 6e 64 69 66 0a 20 20 73  erve;.#endif.  s
14e80 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
14e90 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e 3b  (p);.  return n;
14ea0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  .}.../*.** Set t
14eb0 68 65 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20  he maximum page 
14ec0 63 6f 75 6e 74 20 66 6f 72 20 61 20 64 61 74 61  count for a data
14ed0 62 61 73 65 20 69 66 20 6d 78 50 61 67 65 20 69  base if mxPage i
14ee0 73 20 70 6f 73 69 74 69 76 65 2e 0a 2a 2a 20 4e  s positive..** N
14ef0 6f 20 63 68 61 6e 67 65 73 20 61 72 65 20 6d 61  o changes are ma
14f00 64 65 20 69 66 20 6d 78 50 61 67 65 20 69 73 20  de if mxPage is 
14f10 30 20 6f 72 20 6e 65 67 61 74 69 76 65 2e 0a 2a  0 or negative..*
14f20 2a 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20  * Regardless of 
14f30 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6d 78 50  the value of mxP
14f40 61 67 65 2c 20 72 65 74 75 72 6e 20 74 68 65 20  age, return the 
14f50 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75  maximum page cou
14f60 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  nt..*/.int sqlit
14f70 65 33 42 74 72 65 65 4d 61 78 50 61 67 65 43 6f  e3BtreeMaxPageCo
14f80 75 6e 74 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  unt(Btree *p, in
14f90 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 69 6e 74  t mxPage){.  int
14fa0 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72   n;.  sqlite3Btr
14fb0 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 6e 20  eeEnter(p);.  n 
14fc0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 61  = sqlite3PagerMa
14fd0 78 50 61 67 65 43 6f 75 6e 74 28 70 2d 3e 70 42  xPageCount(p->pB
14fe0 74 2d 3e 70 50 61 67 65 72 2c 20 6d 78 50 61 67  t->pPager, mxPag
14ff0 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  e);.  sqlite3Btr
15000 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
15010 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn n;.}../*.**
15020 20 53 65 74 20 74 68 65 20 42 54 53 5f 53 45 43   Set the BTS_SEC
15030 55 52 45 5f 44 45 4c 45 54 45 20 66 6c 61 67 20  URE_DELETE flag 
15040 69 66 20 6e 65 77 46 6c 61 67 20 69 73 20 30 20  if newFlag is 0 
15050 6f 72 20 31 2e 20 20 49 66 20 6e 65 77 46 6c 61  or 1.  If newFla
15060 67 20 69 73 20 2d 31 2c 0a 2a 2a 20 74 68 65 6e  g is -1,.** then
15070 20 6d 61 6b 65 20 6e 6f 20 63 68 61 6e 67 65 73   make no changes
15080 2e 20 20 41 6c 77 61 79 73 20 72 65 74 75 72 6e  .  Always return
15090 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
150a0 65 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c  e BTS_SECURE_DEL
150b0 45 54 45 0a 2a 2a 20 73 65 74 74 69 6e 67 20 61  ETE.** setting a
150c0 66 74 65 72 20 74 68 65 20 63 68 61 6e 67 65 2e  fter the change.
150d0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
150e0 74 72 65 65 53 65 63 75 72 65 44 65 6c 65 74 65  treeSecureDelete
150f0 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6e  (Btree *p, int n
15100 65 77 46 6c 61 67 29 7b 0a 20 20 69 6e 74 20 62  ewFlag){.  int b
15110 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72  ;.  if( p==0 ) r
15120 65 74 75 72 6e 20 30 3b 0a 20 20 73 71 6c 69 74  eturn 0;.  sqlit
15130 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
15140 0a 20 20 69 66 28 20 6e 65 77 46 6c 61 67 3e 3d  .  if( newFlag>=
15150 30 20 29 7b 0a 20 20 20 20 70 2d 3e 70 42 74 2d  0 ){.    p->pBt-
15160 3e 62 74 73 46 6c 61 67 73 20 26 3d 20 7e 42 54  >btsFlags &= ~BT
15170 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 3b  S_SECURE_DELETE;
15180 0a 20 20 20 20 69 66 28 20 6e 65 77 46 6c 61 67  .    if( newFlag
15190 20 29 20 70 2d 3e 70 42 74 2d 3e 62 74 73 46 6c   ) p->pBt->btsFl
151a0 61 67 73 20 7c 3d 20 42 54 53 5f 53 45 43 55 52  ags |= BTS_SECUR
151b0 45 5f 44 45 4c 45 54 45 3b 0a 20 20 7d 20 0a 20  E_DELETE;.  } . 
151c0 20 62 20 3d 20 28 70 2d 3e 70 42 74 2d 3e 62 74   b = (p->pBt->bt
151d0 73 46 6c 61 67 73 20 26 20 42 54 53 5f 53 45 43  sFlags & BTS_SEC
151e0 55 52 45 5f 44 45 4c 45 54 45 29 21 3d 30 3b 0a  URE_DELETE)!=0;.
151f0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
15200 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
15210 20 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61   b;.}../*.** Cha
15220 6e 67 65 20 74 68 65 20 27 61 75 74 6f 2d 76 61  nge the 'auto-va
15230 63 75 75 6d 27 20 70 72 6f 70 65 72 74 79 20 6f  cuum' property o
15240 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  f the database. 
15250 49 66 20 74 68 65 20 27 61 75 74 6f 56 61 63 75  If the 'autoVacu
15260 75 6d 27 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72  um'.** parameter
15270 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68   is non-zero, th
15280 65 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 6d  en auto-vacuum m
15290 6f 64 65 20 69 73 20 65 6e 61 62 6c 65 64 2e 20  ode is enabled. 
152a0 49 66 20 7a 65 72 6f 2c 20 69 74 0a 2a 2a 20 69  If zero, it.** i
152b0 73 20 64 69 73 61 62 6c 65 64 2e 20 54 68 65 20  s disabled. The 
152c0 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20 66 6f  default value fo
152d0 72 20 74 68 65 20 61 75 74 6f 2d 76 61 63 75 75  r the auto-vacuu
152e0 6d 20 70 72 6f 70 65 72 74 79 20 69 73 20 0a 2a  m property is .*
152f0 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20  * determined by 
15300 74 68 65 20 53 51 4c 49 54 45 5f 44 45 46 41 55  the SQLITE_DEFAU
15310 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 6d 61  LT_AUTOVACUUM ma
15320 63 72 6f 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  cro..*/.int sqli
15330 74 65 33 42 74 72 65 65 53 65 74 41 75 74 6f 56  te3BtreeSetAutoV
15340 61 63 75 75 6d 28 42 74 72 65 65 20 2a 70 2c 20  acuum(Btree *p, 
15350 69 6e 74 20 61 75 74 6f 56 61 63 75 75 6d 29 7b  int autoVacuum){
15360 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
15370 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
15380 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52   return SQLITE_R
15390 45 41 44 4f 4e 4c 59 3b 0a 23 65 6c 73 65 0a 20  EADONLY;.#else. 
153a0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
153b0 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72   p->pBt;.  int r
153c0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
153d0 20 75 38 20 61 76 20 3d 20 28 75 38 29 61 75 74   u8 av = (u8)aut
153e0 6f 56 61 63 75 75 6d 3b 0a 0a 20 20 73 71 6c 69  oVacuum;..  sqli
153f0 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
15400 3b 0a 20 20 69 66 28 20 28 70 42 74 2d 3e 62 74  ;.  if( (pBt->bt
15410 73 46 6c 61 67 73 20 26 20 42 54 53 5f 50 41 47  sFlags & BTS_PAG
15420 45 53 49 5a 45 5f 46 49 58 45 44 29 21 3d 30 20  ESIZE_FIXED)!=0 
15430 26 26 20 28 61 76 20 3f 31 3a 30 29 21 3d 70 42  && (av ?1:0)!=pB
15440 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b  t->autoVacuum ){
15450 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
15460 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d 65 6c  _READONLY;.  }el
15470 73 65 7b 0a 20 20 20 20 70 42 74 2d 3e 61 75 74  se{.    pBt->aut
15480 6f 56 61 63 75 75 6d 20 3d 20 61 76 20 3f 31 3a  oVacuum = av ?1:
15490 30 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e 63 72  0;.    pBt->incr
154a0 56 61 63 75 75 6d 20 3d 20 61 76 3d 3d 32 20 3f  Vacuum = av==2 ?
154b0 31 3a 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  1:0;.  }.  sqlit
154c0 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
154d0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65  .  return rc;.#e
154e0 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ndif.}../*.** Re
154f0 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20 6f  turn the value o
15500 66 20 74 68 65 20 27 61 75 74 6f 2d 76 61 63 75  f the 'auto-vacu
15510 75 6d 27 20 70 72 6f 70 65 72 74 79 2e 20 49 66  um' property. If
15520 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 69 73 20   auto-vacuum is 
15530 0a 2a 2a 20 65 6e 61 62 6c 65 64 20 31 20 69 73  .** enabled 1 is
15540 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72   returned. Other
15550 77 69 73 65 20 30 2e 0a 2a 2f 0a 69 6e 74 20 73  wise 0..*/.int s
15560 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 41 75  qlite3BtreeGetAu
15570 74 6f 56 61 63 75 75 6d 28 42 74 72 65 65 20 2a  toVacuum(Btree *
15580 70 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  p){.#ifdef SQLIT
15590 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
155a0 4d 0a 20 20 72 65 74 75 72 6e 20 42 54 52 45 45  M.  return BTREE
155b0 5f 41 55 54 4f 56 41 43 55 55 4d 5f 4e 4f 4e 45  _AUTOVACUUM_NONE
155c0 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20 72 63  ;.#else.  int rc
155d0 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
155e0 45 6e 74 65 72 28 70 29 3b 0a 20 20 72 63 20 3d  Enter(p);.  rc =
155f0 20 28 0a 20 20 20 20 28 21 70 2d 3e 70 42 74 2d   (.    (!p->pBt-
15600 3e 61 75 74 6f 56 61 63 75 75 6d 29 3f 42 54 52  >autoVacuum)?BTR
15610 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 4e 4f  EE_AUTOVACUUM_NO
15620 4e 45 3a 0a 20 20 20 20 28 21 70 2d 3e 70 42 74  NE:.    (!p->pBt
15630 2d 3e 69 6e 63 72 56 61 63 75 75 6d 29 3f 42 54  ->incrVacuum)?BT
15640 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 46  REE_AUTOVACUUM_F
15650 55 4c 4c 3a 0a 20 20 20 20 42 54 52 45 45 5f 41  ULL:.    BTREE_A
15660 55 54 4f 56 41 43 55 55 4d 5f 49 4e 43 52 0a 20  UTOVACUUM_INCR. 
15670 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72   );.  sqlite3Btr
15680 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
15690 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a  turn rc;.#endif.
156a0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20  }.../*.** Get a 
156b0 72 65 66 65 72 65 6e 63 65 20 74 6f 20 70 50 61  reference to pPa
156c0 67 65 31 20 6f 66 20 74 68 65 20 64 61 74 61 62  ge1 of the datab
156d0 61 73 65 20 66 69 6c 65 2e 20 20 54 68 69 73 20  ase file.  This 
156e0 77 69 6c 6c 0a 2a 2a 20 61 6c 73 6f 20 61 63 71  will.** also acq
156f0 75 69 72 65 20 61 20 72 65 61 64 6c 6f 63 6b 20  uire a readlock 
15700 6f 6e 20 74 68 61 74 20 66 69 6c 65 2e 0a 2a 2a  on that file..**
15710 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  .** SQLITE_OK is
15720 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63   returned on suc
15730 63 65 73 73 2e 20 20 49 66 20 74 68 65 20 66 69  cess.  If the fi
15740 6c 65 20 69 73 20 6e 6f 74 20 61 0a 2a 2a 20 77  le is not a.** w
15750 65 6c 6c 2d 66 6f 72 6d 65 64 20 64 61 74 61 62  ell-formed datab
15760 61 73 65 20 66 69 6c 65 2c 20 74 68 65 6e 20 53  ase file, then S
15770 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69 73  QLITE_CORRUPT is
15780 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 20 53 51   returned..** SQ
15790 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72 65 74  LITE_BUSY is ret
157a0 75 72 6e 65 64 20 69 66 20 74 68 65 20 64 61 74  urned if the dat
157b0 61 62 61 73 65 20 69 73 20 6c 6f 63 6b 65 64 2e  abase is locked.
157c0 20 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 2a    SQLITE_NOMEM.*
157d0 2a 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  * is returned if
157e0 20 77 65 20 72 75 6e 20 6f 75 74 20 6f 66 20 6d   we run out of m
157f0 65 6d 6f 72 79 2e 20 0a 2a 2f 0a 73 74 61 74 69  emory. .*/.stati
15800 63 20 69 6e 74 20 6c 6f 63 6b 42 74 72 65 65 28  c int lockBtree(
15810 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
15820 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
15830 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
15840 20 63 6f 64 65 20 66 72 6f 6d 20 73 75 62 66 75   code from subfu
15850 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 4d 65 6d  nctions */.  Mem
15860 50 61 67 65 20 2a 70 50 61 67 65 31 3b 20 20 20  Page *pPage1;   
15870 20 20 2f 2a 20 50 61 67 65 20 31 20 6f 66 20 74    /* Page 1 of t
15880 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
15890 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65 3b   */.  int nPage;
158a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
158b0 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
158c0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f   the database */
158d0 0a 20 20 69 6e 74 20 6e 50 61 67 65 46 69 6c 65  .  int nPageFile
158e0 20 3d 20 30 3b 20 20 20 2f 2a 20 4e 75 6d 62 65   = 0;   /* Numbe
158f0 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  r of pages in th
15900 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
15910 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65 48 65  */.  int nPageHe
15920 61 64 65 72 3b 20 20 20 20 20 2f 2a 20 4e 75 6d  ader;     /* Num
15930 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
15940 74 68 65 20 64 61 74 61 62 61 73 65 20 61 63 63  the database acc
15950 6f 72 64 69 6e 67 20 74 6f 20 68 64 72 20 2a 2f  ording to hdr */
15960 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
15970 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
15980 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
15990 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70 50 61  assert( pBt->pPa
159a0 67 65 31 3d 3d 30 20 29 3b 0a 20 20 72 63 20 3d  ge1==0 );.  rc =
159b0 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 68 61   sqlite3PagerSha
159c0 72 65 64 4c 6f 63 6b 28 70 42 74 2d 3e 70 50 61  redLock(pBt->pPa
159d0 67 65 72 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  ger);.  if( rc!=
159e0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
159f0 72 6e 20 72 63 3b 0a 20 20 72 63 20 3d 20 62 74  rn rc;.  rc = bt
15a00 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
15a10 31 2c 20 26 70 50 61 67 65 31 2c 20 30 29 3b 0a  1, &pPage1, 0);.
15a20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
15a30 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
15a40 0a 0a 20 20 2f 2a 20 44 6f 20 73 6f 6d 65 20 63  ..  /* Do some c
15a50 68 65 63 6b 69 6e 67 20 74 6f 20 68 65 6c 70 20  hecking to help 
15a60 69 6e 73 75 72 65 20 74 68 65 20 66 69 6c 65 20  insure the file 
15a70 77 65 20 6f 70 65 6e 65 64 20 72 65 61 6c 6c 79  we opened really
15a80 20 69 73 0a 20 20 2a 2a 20 61 20 76 61 6c 69 64   is.  ** a valid
15a90 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
15aa0 0a 20 20 2a 2f 0a 20 20 6e 50 61 67 65 20 3d 20  .  */.  nPage = 
15ab0 6e 50 61 67 65 48 65 61 64 65 72 20 3d 20 67 65  nPageHeader = ge
15ac0 74 34 62 79 74 65 28 32 38 2b 28 75 38 2a 29 70  t4byte(28+(u8*)p
15ad0 50 61 67 65 31 2d 3e 61 44 61 74 61 29 3b 0a 20  Page1->aData);. 
15ae0 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
15af0 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67  ecount(pBt->pPag
15b00 65 72 2c 20 26 6e 50 61 67 65 46 69 6c 65 29 3b  er, &nPageFile);
15b10 0a 20 20 69 66 28 20 6e 50 61 67 65 3d 3d 30 20  .  if( nPage==0 
15b20 7c 7c 20 6d 65 6d 63 6d 70 28 32 34 2b 28 75 38  || memcmp(24+(u8
15b30 2a 29 70 50 61 67 65 31 2d 3e 61 44 61 74 61 2c  *)pPage1->aData,
15b40 20 39 32 2b 28 75 38 2a 29 70 50 61 67 65 31 2d   92+(u8*)pPage1-
15b50 3e 61 44 61 74 61 2c 34 29 21 3d 30 20 29 7b 0a  >aData,4)!=0 ){.
15b60 20 20 20 20 6e 50 61 67 65 20 3d 20 6e 50 61 67      nPage = nPag
15b70 65 46 69 6c 65 3b 0a 20 20 7d 0a 20 20 69 66 28  eFile;.  }.  if(
15b80 20 6e 50 61 67 65 3e 30 20 29 7b 0a 20 20 20 20   nPage>0 ){.    
15b90 75 33 32 20 70 61 67 65 53 69 7a 65 3b 0a 20 20  u32 pageSize;.  
15ba0 20 20 75 33 32 20 75 73 61 62 6c 65 53 69 7a 65    u32 usableSize
15bb0 3b 0a 20 20 20 20 75 38 20 2a 70 61 67 65 31 20  ;.    u8 *page1 
15bc0 3d 20 70 50 61 67 65 31 2d 3e 61 44 61 74 61 3b  = pPage1->aData;
15bd0 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
15be0 5f 4e 4f 54 41 44 42 3b 0a 20 20 20 20 2f 2a 20  _NOTADB;.    /* 
15bf0 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34  EVIDENCE-OF: R-4
15c00 33 37 33 37 2d 33 39 39 39 39 20 45 76 65 72 79  3737-39999 Every
15c10 20 76 61 6c 69 64 20 53 51 4c 69 74 65 20 64 61   valid SQLite da
15c20 74 61 62 61 73 65 20 66 69 6c 65 20 62 65 67 69  tabase file begi
15c30 6e 73 0a 20 20 20 20 2a 2a 20 77 69 74 68 20 74  ns.    ** with t
15c40 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 31 36 20  he following 16 
15c50 62 79 74 65 73 20 28 69 6e 20 68 65 78 29 3a 20  bytes (in hex): 
15c60 35 33 20 35 31 20 34 63 20 36 39 20 37 34 20 36  53 51 4c 69 74 6
15c70 35 20 32 30 20 36 36 20 36 66 20 37 32 20 36 64  5 20 66 6f 72 6d
15c80 0a 20 20 20 20 2a 2a 20 36 31 20 37 34 20 32 30  .    ** 61 74 20
15c90 20 33 33 20 30 30 2e 20 2a 2f 0a 20 20 20 20 69   33 00. */.    i
15ca0 66 28 20 6d 65 6d 63 6d 70 28 70 61 67 65 31 2c  f( memcmp(page1,
15cb0 20 7a 4d 61 67 69 63 48 65 61 64 65 72 2c 20 31   zMagicHeader, 1
15cc0 36 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 67  6)!=0 ){.      g
15cd0 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66  oto page1_init_f
15ce0 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a 23 69  ailed;.    }..#i
15cf0 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  fdef SQLITE_OMIT
15d00 5f 57 41 4c 0a 20 20 20 20 69 66 28 20 70 61 67  _WAL.    if( pag
15d10 65 31 5b 31 38 5d 3e 31 20 29 7b 0a 20 20 20 20  e1[18]>1 ){.    
15d20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20    pBt->btsFlags 
15d30 7c 3d 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59  |= BTS_READ_ONLY
15d40 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
15d50 70 61 67 65 31 5b 31 39 5d 3e 31 20 29 7b 0a 20  page1[19]>1 ){. 
15d60 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f       goto page1_
15d70 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20  init_failed;.   
15d80 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 69 66 28   }.#else.    if(
15d90 20 70 61 67 65 31 5b 31 38 5d 3e 32 20 29 7b 0a   page1[18]>2 ){.
15da0 20 20 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c        pBt->btsFl
15db0 61 67 73 20 7c 3d 20 42 54 53 5f 52 45 41 44 5f  ags |= BTS_READ_
15dc0 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ONLY;.    }.    
15dd0 69 66 28 20 70 61 67 65 31 5b 31 39 5d 3e 32 20  if( page1[19]>2 
15de0 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61  ){.      goto pa
15df0 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b  ge1_init_failed;
15e00 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
15e10 66 20 74 68 65 20 77 72 69 74 65 20 76 65 72 73  f the write vers
15e20 69 6f 6e 20 69 73 20 73 65 74 20 74 6f 20 32 2c  ion is set to 2,
15e30 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20 73   this database s
15e40 68 6f 75 6c 64 20 62 65 20 61 63 63 65 73 73 65  hould be accesse
15e50 64 0a 20 20 20 20 2a 2a 20 69 6e 20 57 41 4c 20  d.    ** in WAL 
15e60 6d 6f 64 65 2e 20 49 66 20 74 68 65 20 6c 6f 67  mode. If the log
15e70 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
15e80 6f 70 65 6e 2c 20 6f 70 65 6e 20 69 74 20 6e 6f  open, open it no
15e90 77 2e 20 54 68 65 6e 20 0a 20 20 20 20 2a 2a 20  w. Then .    ** 
15ea0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
15eb0 20 61 6e 64 20 72 65 74 75 72 6e 20 77 69 74 68   and return with
15ec0 6f 75 74 20 70 6f 70 75 6c 61 74 69 6e 67 20 42  out populating B
15ed0 74 53 68 61 72 65 64 2e 70 50 61 67 65 31 2e 0a  tShared.pPage1..
15ee0 20 20 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c 65      ** The calle
15ef0 72 20 64 65 74 65 63 74 73 20 74 68 69 73 20 61  r detects this a
15f00 6e 64 20 63 61 6c 6c 73 20 74 68 69 73 20 66 75  nd calls this fu
15f10 6e 63 74 69 6f 6e 20 61 67 61 69 6e 2e 20 54 68  nction again. Th
15f20 69 73 20 69 73 0a 20 20 20 20 2a 2a 20 72 65 71  is is.    ** req
15f30 75 69 72 65 64 20 61 73 20 74 68 65 20 76 65 72  uired as the ver
15f40 73 69 6f 6e 20 6f 66 20 70 61 67 65 20 31 20 63  sion of page 1 c
15f50 75 72 72 65 6e 74 6c 79 20 69 6e 20 74 68 65 20  urrently in the 
15f60 70 61 67 65 31 20 62 75 66 66 65 72 0a 20 20 20  page1 buffer.   
15f70 20 2a 2a 20 6d 61 79 20 6e 6f 74 20 62 65 20 74   ** may not be t
15f80 68 65 20 6c 61 74 65 73 74 20 76 65 72 73 69 6f  he latest versio
15f90 6e 20 2d 20 74 68 65 72 65 20 6d 61 79 20 62 65  n - there may be
15fa0 20 61 20 6e 65 77 65 72 20 6f 6e 65 20 69 6e 20   a newer one in 
15fb0 74 68 65 20 6c 6f 67 0a 20 20 20 20 2a 2a 20 66  the log.    ** f
15fc0 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ile..    */.    
15fd0 69 66 28 20 70 61 67 65 31 5b 31 39 5d 3d 3d 32  if( page1[19]==2
15fe0 20 26 26 20 28 70 42 74 2d 3e 62 74 73 46 6c 61   && (pBt->btsFla
15ff0 67 73 20 26 20 42 54 53 5f 4e 4f 5f 57 41 4c 29  gs & BTS_NO_WAL)
16000 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ==0 ){.      int
16010 20 69 73 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 20   isOpen = 0;.   
16020 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
16030 61 67 65 72 4f 70 65 6e 57 61 6c 28 70 42 74 2d  agerOpenWal(pBt-
16040 3e 70 50 61 67 65 72 2c 20 26 69 73 4f 70 65 6e  >pPager, &isOpen
16050 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
16060 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
16070 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31        goto page1
16080 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20  _init_failed;.  
16090 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69 73      }else if( is
160a0 4f 70 65 6e 3d 3d 30 20 29 7b 0a 23 69 66 64 65  Open==0 ){.#ifde
160b0 66 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  f SQLITE_DEFAULT
160c0 5f 57 41 4c 5f 53 41 46 45 54 59 4c 45 56 45 4c  _WAL_SAFETYLEVEL
160d0 0a 20 20 20 20 20 20 20 20 2f 2a 20 44 65 66 61  .        /* Defa
160e0 75 6c 74 20 74 6f 20 73 70 65 63 69 66 69 65 64  ult to specified
160f0 20 73 61 66 65 74 79 5f 6c 65 76 65 6c 20 66 6f   safety_level fo
16100 72 20 57 41 4c 20 6d 6f 64 65 20 2a 2f 0a 20 20  r WAL mode */.  
16110 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 64        if( pBt->d
16120 62 21 3d 30 20 26 26 20 70 42 74 2d 3e 64 62 2d  b!=0 && pBt->db-
16130 3e 61 44 62 21 3d 30 20 29 7b 0a 20 20 20 20 20  >aDb!=0 ){.     
16140 20 20 20 20 20 69 6e 74 20 69 44 62 3b 0a 20 20       int iDb;.  
16150 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 20          sqlite3 
16160 2a 64 62 20 3d 20 70 42 74 2d 3e 64 62 3b 0a 20  *db = pBt->db;. 
16170 20 20 20 20 20 20 20 20 20 44 62 20 2a 61 44 62           Db *aDb
16180 20 3d 20 64 62 2d 3e 61 44 62 3b 0a 20 20 20 20   = db->aDb;.    
16190 20 20 20 20 20 20 75 38 20 6c 65 76 65 6c 20 3d        u8 level =
161a0 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f   0;.          fo
161b0 72 28 69 44 62 3d 30 3b 20 69 44 62 3c 64 62 2d  r(iDb=0; iDb<db-
161c0 3e 6e 44 62 3b 20 69 44 62 2b 2b 29 7b 0a 20 20  >nDb; iDb++){.  
161d0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 61 44            if( aD
161e0 62 5b 69 44 62 5d 2e 70 42 74 20 26 26 20 61 44  b[iDb].pBt && aD
161f0 62 5b 69 44 62 5d 2e 70 42 74 2d 3e 70 42 74 3d  b[iDb].pBt->pBt=
16200 3d 70 42 74 20 29 20 62 72 65 61 6b 3b 0a 20 20  =pBt ) break;.  
16210 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
16220 20 20 20 20 61 73 73 65 72 74 28 20 69 44 62 3c      assert( iDb<
16230 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 20 20 20  db->nDb );.     
16240 20 20 20 20 20 6c 65 76 65 6c 20 3d 20 64 62 2d       level = db-
16250 3e 61 44 62 5b 69 44 62 5d 2e 73 61 66 65 74 79  >aDb[iDb].safety
16260 5f 6c 65 76 65 6c 3b 0a 20 20 20 20 20 20 20 20  _level;.        
16270 20 20 69 66 28 20 21 53 51 4c 49 54 45 5f 44 62    if( !SQLITE_Db
16280 53 61 66 65 74 79 4c 65 76 65 6c 49 73 46 69 78  SafetyLevelIsFix
16290 65 64 28 6c 65 76 65 6c 29 20 26 26 20 0a 20 20  ed(level) && .  
162a0 20 20 20 20 20 20 20 20 20 20 20 28 53 51 4c 49             (SQLI
162b0 54 45 5f 44 62 53 61 66 65 74 79 4c 65 76 65 6c  TE_DbSafetyLevel
162c0 56 61 6c 75 65 28 6c 65 76 65 6c 29 20 21 3d 20  Value(level) != 
162d0 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 57  SQLITE_DEFAULT_W
162e0 41 4c 5f 53 41 46 45 54 59 4c 45 56 45 4c 29 20  AL_SAFETYLEVEL) 
162f0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  ){.            a
16300 44 62 5b 69 44 62 5d 2e 73 61 66 65 74 79 5f 6c  Db[iDb].safety_l
16310 65 76 65 6c 20 3d 20 53 51 4c 49 54 45 5f 44 45  evel = SQLITE_DE
16320 46 41 55 4c 54 5f 57 41 4c 5f 53 41 46 45 54 59  FAULT_WAL_SAFETY
16330 4c 45 56 45 4c 3b 0a 20 20 20 20 20 20 20 20 20  LEVEL;.         
16340 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53     sqlite3PagerS
16350 65 74 53 61 66 65 74 79 4c 65 76 65 6c 28 70 42  etSafetyLevel(pB
16360 74 2d 3e 70 50 61 67 65 72 2c 20 53 51 4c 49 54  t->pPager, SQLIT
16370 45 5f 44 45 46 41 55 4c 54 5f 57 41 4c 5f 53 41  E_DEFAULT_WAL_SA
16380 46 45 54 59 4c 45 56 45 4c 2c 20 0a 20 20 20 20  FETYLEVEL, .    
16390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
163a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
163b0 20 20 20 28 64 62 2d 3e 66 6c 61 67 73 26 53 51     (db->flags&SQ
163c0 4c 49 54 45 5f 46 75 6c 6c 46 53 79 6e 63 29 21  LITE_FullFSync)!
163d0 3d 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  =0,.            
163e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
163f0 20 20 20 20 20 20 20 20 20 20 20 28 64 62 2d 3e             (db->
16400 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 43 6b 70  flags&SQLITE_Ckp
16410 74 46 75 6c 6c 46 53 79 6e 63 29 21 3d 30 29 3b  tFullFSync)!=0);
16420 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
16430 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
16440 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
16450 65 28 70 50 61 67 65 31 29 3b 0a 20 20 20 20 20  e(pPage1);.     
16460 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
16470 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  _OK;.      }.   
16480 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
16490 4f 54 41 44 42 3b 0a 20 20 20 20 7d 0a 23 65 6e  OTADB;.    }.#en
164a0 64 69 66 0a 0a 20 20 20 20 2f 2a 20 45 56 49 44  dif..    /* EVID
164b0 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 35 34 36 35  ENCE-OF: R-15465
164c0 2d 32 30 38 31 33 20 54 68 65 20 6d 61 78 69 6d  -20813 The maxim
164d0 75 6d 20 61 6e 64 20 6d 69 6e 69 6d 75 6d 20 65  um and minimum e
164e0 6d 62 65 64 64 65 64 20 70 61 79 6c 6f 61 64 0a  mbedded payload.
164f0 20 20 20 20 2a 2a 20 66 72 61 63 74 69 6f 6e 73      ** fractions
16500 20 61 6e 64 20 74 68 65 20 6c 65 61 66 20 70 61   and the leaf pa
16510 79 6c 6f 61 64 20 66 72 61 63 74 69 6f 6e 20 76  yload fraction v
16520 61 6c 75 65 73 20 6d 75 73 74 20 62 65 20 36 34  alues must be 64
16530 2c 20 33 32 2c 20 61 6e 64 20 33 32 2e 0a 20 20  , 32, and 32..  
16540 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    **.    ** The 
16550 6f 72 69 67 69 6e 61 6c 20 64 65 73 69 67 6e 20  original design 
16560 61 6c 6c 6f 77 65 64 20 74 68 65 73 65 20 61 6d  allowed these am
16570 6f 75 6e 74 73 20 74 6f 20 76 61 72 79 2c 20 62  ounts to vary, b
16580 75 74 20 61 73 20 6f 66 0a 20 20 20 20 2a 2a 20  ut as of.    ** 
16590 76 65 72 73 69 6f 6e 20 33 2e 36 2e 30 2c 20 77  version 3.6.0, w
165a0 65 20 72 65 71 75 69 72 65 20 74 68 65 6d 20 74  e require them t
165b0 6f 20 62 65 20 66 69 78 65 64 2e 0a 20 20 20 20  o be fixed..    
165c0 2a 2f 0a 20 20 20 20 69 66 28 20 6d 65 6d 63 6d  */.    if( memcm
165d0 70 28 26 70 61 67 65 31 5b 32 31 5d 2c 20 22 5c  p(&page1[21], "\
165e0 31 30 30 5c 30 34 30 5c 30 34 30 22 2c 33 29 21  100\040\040",3)!
165f0 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  =0 ){.      goto
16600 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c   page1_init_fail
16610 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a  ed;.    }.    /*
16620 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
16630 35 31 38 37 33 2d 33 39 36 31 38 20 54 68 65 20  51873-39618 The 
16640 70 61 67 65 20 73 69 7a 65 20 66 6f 72 20 61 20  page size for a 
16650 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
16660 0a 20 20 20 20 2a 2a 20 64 65 74 65 72 6d 69 6e  .    ** determin
16670 65 64 20 62 79 20 74 68 65 20 32 2d 62 79 74 65  ed by the 2-byte
16680 20 69 6e 74 65 67 65 72 20 6c 6f 63 61 74 65 64   integer located
16690 20 61 74 20 61 6e 20 6f 66 66 73 65 74 20 6f 66   at an offset of
166a0 20 31 36 20 62 79 74 65 73 20 66 72 6f 6d 0a 20   16 bytes from. 
166b0 20 20 20 2a 2a 20 74 68 65 20 62 65 67 69 6e 6e     ** the beginn
166c0 69 6e 67 20 6f 66 20 74 68 65 20 64 61 74 61 62  ing of the datab
166d0 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20  ase file. */.   
166e0 20 70 61 67 65 53 69 7a 65 20 3d 20 28 70 61 67   pageSize = (pag
166f0 65 31 5b 31 36 5d 3c 3c 38 29 20 7c 20 28 70 61  e1[16]<<8) | (pa
16700 67 65 31 5b 31 37 5d 3c 3c 31 36 29 3b 0a 20 20  ge1[17]<<16);.  
16710 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
16720 3a 20 52 2d 32 35 30 30 38 2d 32 31 36 38 38 20  : R-25008-21688 
16730 54 68 65 20 73 69 7a 65 20 6f 66 20 61 20 70 61  The size of a pa
16740 67 65 20 69 73 20 61 20 70 6f 77 65 72 20 6f 66  ge is a power of
16750 20 74 77 6f 0a 20 20 20 20 2a 2a 20 62 65 74 77   two.    ** betw
16760 65 65 6e 20 35 31 32 20 61 6e 64 20 36 35 35 33  een 512 and 6553
16770 36 20 69 6e 63 6c 75 73 69 76 65 2e 20 2a 2f 0a  6 inclusive. */.
16780 20 20 20 20 69 66 28 20 28 28 70 61 67 65 53 69      if( ((pageSi
16790 7a 65 2d 31 29 26 70 61 67 65 53 69 7a 65 29 21  ze-1)&pageSize)!
167a0 3d 30 0a 20 20 20 20 20 7c 7c 20 70 61 67 65 53  =0.     || pageS
167b0 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 50  ize>SQLITE_MAX_P
167c0 41 47 45 5f 53 49 5a 45 20 0a 20 20 20 20 20 7c  AGE_SIZE .     |
167d0 7c 20 70 61 67 65 53 69 7a 65 3c 3d 32 35 36 20  | pageSize<=256 
167e0 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 67 6f  .    ){.      go
167f0 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61  to page1_init_fa
16800 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20  iled;.    }.    
16810 61 73 73 65 72 74 28 20 28 70 61 67 65 53 69 7a  assert( (pageSiz
16820 65 20 26 20 37 29 3d 3d 30 20 29 3b 0a 20 20 20  e & 7)==0 );.   
16830 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
16840 20 52 2d 35 39 33 31 30 2d 35 31 32 30 35 20 54   R-59310-51205 T
16850 68 65 20 22 72 65 73 65 72 76 65 64 20 73 70 61  he "reserved spa
16860 63 65 22 20 73 69 7a 65 20 69 6e 20 74 68 65 20  ce" size in the 
16870 31 2d 62 79 74 65 0a 20 20 20 20 2a 2a 20 69 6e  1-byte.    ** in
16880 74 65 67 65 72 20 61 74 20 6f 66 66 73 65 74 20  teger at offset 
16890 32 30 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  20 is the number
168a0 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73 70 61   of bytes of spa
168b0 63 65 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  ce at the end of
168c0 0a 20 20 20 20 2a 2a 20 65 61 63 68 20 70 61 67  .    ** each pag
168d0 65 20 74 6f 20 72 65 73 65 72 76 65 20 66 6f 72  e to reserve for
168e0 20 65 78 74 65 6e 73 69 6f 6e 73 2e 20 0a 20 20   extensions. .  
168f0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 56 49 44    **.    ** EVID
16900 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 37 34 39 37  ENCE-OF: R-37497
16910 2d 34 32 34 31 32 20 54 68 65 20 73 69 7a 65 20  -42412 The size 
16920 6f 66 20 74 68 65 20 72 65 73 65 72 76 65 64 20  of the reserved 
16930 72 65 67 69 6f 6e 20 69 73 0a 20 20 20 20 2a 2a  region is.    **
16940 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74   determined by t
16950 68 65 20 6f 6e 65 2d 62 79 74 65 20 75 6e 73 69  he one-byte unsi
16960 67 6e 65 64 20 69 6e 74 65 67 65 72 20 66 6f 75  gned integer fou
16970 6e 64 20 61 74 20 61 6e 20 6f 66 66 73 65 74 20  nd at an offset 
16980 6f 66 20 32 30 0a 20 20 20 20 2a 2a 20 69 6e 74  of 20.    ** int
16990 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
169a0 69 6c 65 20 68 65 61 64 65 72 2e 20 2a 2f 0a 20  ile header. */. 
169b0 20 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20     usableSize = 
169c0 70 61 67 65 53 69 7a 65 20 2d 20 70 61 67 65 31  pageSize - page1
169d0 5b 32 30 5d 3b 0a 20 20 20 20 69 66 28 20 28 75  [20];.    if( (u
169e0 33 32 29 70 61 67 65 53 69 7a 65 21 3d 70 42 74  32)pageSize!=pBt
169f0 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a 20 20  ->pageSize ){.  
16a00 20 20 20 20 2f 2a 20 41 66 74 65 72 20 72 65 61      /* After rea
16a10 64 69 6e 67 20 74 68 65 20 66 69 72 73 74 20 70  ding the first p
16a20 61 67 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  age of the datab
16a30 61 73 65 20 61 73 73 75 6d 69 6e 67 20 61 20 70  ase assuming a p
16a40 61 67 65 20 73 69 7a 65 0a 20 20 20 20 20 20 2a  age size.      *
16a50 2a 20 6f 66 20 42 74 53 68 61 72 65 64 2e 70 61  * of BtShared.pa
16a60 67 65 53 69 7a 65 2c 20 77 65 20 68 61 76 65 20  geSize, we have 
16a70 64 69 73 63 6f 76 65 72 65 64 20 74 68 61 74 20  discovered that 
16a80 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 69 73  the page-size is
16a90 0a 20 20 20 20 20 20 2a 2a 20 61 63 74 75 61 6c  .      ** actual
16aa0 6c 79 20 70 61 67 65 53 69 7a 65 2e 20 55 6e 6c  ly pageSize. Unl
16ab0 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61 73 65  ock the database
16ac0 2c 20 6c 65 61 76 65 20 70 42 74 2d 3e 70 50 61  , leave pBt->pPa
16ad0 67 65 31 20 61 74 0a 20 20 20 20 20 20 2a 2a 20  ge1 at.      ** 
16ae0 7a 65 72 6f 20 61 6e 64 20 72 65 74 75 72 6e 20  zero and return 
16af0 53 51 4c 49 54 45 5f 4f 4b 2e 20 54 68 65 20 63  SQLITE_OK. The c
16b00 61 6c 6c 65 72 20 77 69 6c 6c 20 63 61 6c 6c 20  aller will call 
16b10 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 20 20  this function.  
16b20 20 20 20 20 2a 2a 20 61 67 61 69 6e 20 77 69 74      ** again wit
16b30 68 20 74 68 65 20 63 6f 72 72 65 63 74 20 70 61  h the correct pa
16b40 67 65 2d 73 69 7a 65 2e 0a 20 20 20 20 20 20 2a  ge-size..      *
16b50 2f 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  /.      releaseP
16b60 61 67 65 28 70 50 61 67 65 31 29 3b 0a 20 20 20  age(pPage1);.   
16b70 20 20 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69     pBt->usableSi
16b80 7a 65 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 3b  ze = usableSize;
16b90 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 61 67 65  .      pBt->page
16ba0 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a 65 3b  Size = pageSize;
16bb0 0a 20 20 20 20 20 20 66 72 65 65 54 65 6d 70 53  .      freeTempS
16bc0 70 61 63 65 28 70 42 74 29 3b 0a 20 20 20 20 20  pace(pBt);.     
16bd0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
16be0 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 70 42  erSetPagesize(pB
16bf0 74 2d 3e 70 50 61 67 65 72 2c 20 26 70 42 74 2d  t->pPager, &pBt-
16c00 3e 70 61 67 65 53 69 7a 65 2c 0a 20 20 20 20 20  >pageSize,.     
16c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 61                pa
16c30 67 65 53 69 7a 65 2d 75 73 61 62 6c 65 53 69 7a  geSize-usableSiz
16c40 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  e);.      return
16c50 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69   rc;.    }.    i
16c60 66 28 20 28 70 42 74 2d 3e 64 62 2d 3e 66 6c 61  f( (pBt->db->fla
16c70 67 73 20 26 20 53 51 4c 49 54 45 5f 52 65 63 6f  gs & SQLITE_Reco
16c80 76 65 72 79 4d 6f 64 65 29 3d 3d 30 20 26 26 20  veryMode)==0 && 
16c90 6e 50 61 67 65 3e 6e 50 61 67 65 46 69 6c 65 20  nPage>nPageFile 
16ca0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
16cb0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
16cc0 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61  T;.      goto pa
16cd0 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b  ge1_init_failed;
16ce0 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 45 56  .    }.    /* EV
16cf0 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 38 33  IDENCE-OF: R-283
16d00 31 32 2d 36 34 37 30 34 20 48 6f 77 65 76 65 72  12-64704 However
16d10 2c 20 74 68 65 20 75 73 61 62 6c 65 20 73 69 7a  , the usable siz
16d20 65 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64  e is not allowed
16d30 20 74 6f 0a 20 20 20 20 2a 2a 20 62 65 20 6c 65   to.    ** be le
16d40 73 73 20 74 68 61 6e 20 34 38 30 2e 20 49 6e 20  ss than 480. In 
16d50 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 69 66 20  other words, if 
16d60 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73  the page size is
16d70 20 35 31 32 2c 20 74 68 65 6e 20 74 68 65 0a 20   512, then the. 
16d80 20 20 20 2a 2a 20 72 65 73 65 72 76 65 64 20 73     ** reserved s
16d90 70 61 63 65 20 73 69 7a 65 20 63 61 6e 6e 6f 74  pace size cannot
16da0 20 65 78 63 65 65 64 20 33 32 2e 20 2a 2f 0a 20   exceed 32. */. 
16db0 20 20 20 69 66 28 20 75 73 61 62 6c 65 53 69 7a     if( usableSiz
16dc0 65 3c 34 38 30 20 29 7b 0a 20 20 20 20 20 20 67  e<480 ){.      g
16dd0 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66  oto page1_init_f
16de0 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20  ailed;.    }.   
16df0 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d   pBt->pageSize =
16e00 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 70   pageSize;.    p
16e10 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d  Bt->usableSize =
16e20 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 23 69 66   usableSize;.#if
16e30 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
16e40 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
16e50 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
16e60 3d 20 28 67 65 74 34 62 79 74 65 28 26 70 61 67  = (get4byte(&pag
16e70 65 31 5b 33 36 20 2b 20 34 2a 34 5d 29 3f 31 3a  e1[36 + 4*4])?1:
16e80 30 29 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e 63  0);.    pBt->inc
16e90 72 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62  rVacuum = (get4b
16ea0 79 74 65 28 26 70 61 67 65 31 5b 33 36 20 2b 20  yte(&page1[36 + 
16eb0 37 2a 34 5d 29 3f 31 3a 30 29 3b 0a 23 65 6e 64  7*4])?1:0);.#end
16ec0 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20 6d 61 78  if.  }..  /* max
16ed0 4c 6f 63 61 6c 20 69 73 20 74 68 65 20 6d 61 78  Local is the max
16ee0 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70  imum amount of p
16ef0 61 79 6c 6f 61 64 20 74 6f 20 73 74 6f 72 65 20  ayload to store 
16f00 6c 6f 63 61 6c 6c 79 20 66 6f 72 0a 20 20 2a 2a  locally for.  **
16f10 20 61 20 63 65 6c 6c 2e 20 20 4d 61 6b 65 20 73   a cell.  Make s
16f20 75 72 65 20 69 74 20 69 73 20 73 6d 61 6c 6c 20  ure it is small 
16f30 65 6e 6f 75 67 68 20 73 6f 20 74 68 61 74 20 61  enough so that a
16f40 74 20 6c 65 61 73 74 20 6d 69 6e 46 61 6e 6f 75  t least minFanou
16f50 74 0a 20 20 2a 2a 20 63 65 6c 6c 73 20 63 61 6e  t.  ** cells can
16f60 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20 6f 6e 65   will fit on one
16f70 20 70 61 67 65 2e 20 20 57 65 20 61 73 73 75 6d   page.  We assum
16f80 65 20 61 20 31 30 2d 62 79 74 65 20 70 61 67 65  e a 10-byte page
16f90 20 68 65 61 64 65 72 2e 0a 20 20 2a 2a 20 42 65   header..  ** Be
16fa0 73 69 64 65 73 20 74 68 65 20 70 61 79 6c 6f 61  sides the payloa
16fb0 64 2c 20 74 68 65 20 63 65 6c 6c 20 6d 75 73 74  d, the cell must
16fc0 20 73 74 6f 72 65 3a 0a 20 20 2a 2a 20 20 20 20   store:.  **    
16fd0 20 32 2d 62 79 74 65 20 70 6f 69 6e 74 65 72 20   2-byte pointer 
16fe0 74 6f 20 74 68 65 20 63 65 6c 6c 0a 20 20 2a 2a  to the cell.  **
16ff0 20 20 20 20 20 34 2d 62 79 74 65 20 63 68 69 6c       4-byte chil
17000 64 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 20  d pointer.  **  
17010 20 20 20 39 2d 62 79 74 65 20 6e 4b 65 79 20 76     9-byte nKey v
17020 61 6c 75 65 0a 20 20 2a 2a 20 20 20 20 20 34 2d  alue.  **     4-
17030 62 79 74 65 20 6e 44 61 74 61 20 76 61 6c 75 65  byte nData value
17040 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62 79 74 65  .  **     4-byte
17050 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 70   overflow page p
17060 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 53 6f 20 61  ointer.  ** So a
17070 20 63 65 6c 6c 20 63 6f 6e 73 69 73 74 73 20 6f   cell consists o
17080 66 20 61 20 32 2d 62 79 74 65 20 70 6f 69 6e 74  f a 2-byte point
17090 65 72 2c 20 61 20 68 65 61 64 65 72 20 77 68 69  er, a header whi
170a0 63 68 20 69 73 20 61 73 20 6d 75 63 68 20 61 73  ch is as much as
170b0 0a 20 20 2a 2a 20 31 37 20 62 79 74 65 73 20 6c  .  ** 17 bytes l
170c0 6f 6e 67 2c 20 30 20 74 6f 20 4e 20 62 79 74 65  ong, 0 to N byte
170d0 73 20 6f 66 20 70 61 79 6c 6f 61 64 2c 20 61 6e  s of payload, an
170e0 64 20 61 6e 20 6f 70 74 69 6f 6e 61 6c 20 34 20  d an optional 4 
170f0 62 79 74 65 20 6f 76 65 72 66 6c 6f 77 0a 20 20  byte overflow.  
17100 2a 2a 20 70 61 67 65 20 70 6f 69 6e 74 65 72 2e  ** page pointer.
17110 0a 20 20 2a 2f 0a 20 20 70 42 74 2d 3e 6d 61 78  .  */.  pBt->max
17120 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 28 28 70  Local = (u16)((p
17130 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31  Bt->usableSize-1
17140 32 29 2a 36 34 2f 32 35 35 20 2d 20 32 33 29 3b  2)*64/255 - 23);
17150 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c 6f 63 61 6c  .  pBt->minLocal
17160 20 3d 20 28 75 31 36 29 28 28 70 42 74 2d 3e 75   = (u16)((pBt->u
17170 73 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a 33 32  sableSize-12)*32
17180 2f 32 35 35 20 2d 20 32 33 29 3b 0a 20 20 70 42  /255 - 23);.  pB
17190 74 2d 3e 6d 61 78 4c 65 61 66 20 3d 20 28 75 31  t->maxLeaf = (u1
171a0 36 29 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  6)(pBt->usableSi
171b0 7a 65 20 2d 20 33 35 29 3b 0a 20 20 70 42 74 2d  ze - 35);.  pBt-
171c0 3e 6d 69 6e 4c 65 61 66 20 3d 20 28 75 31 36 29  >minLeaf = (u16)
171d0 28 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ((pBt->usableSiz
171e0 65 2d 31 32 29 2a 33 32 2f 32 35 35 20 2d 20 32  e-12)*32/255 - 2
171f0 33 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 6d  3);.  if( pBt->m
17200 61 78 4c 6f 63 61 6c 3e 31 32 37 20 29 7b 0a 20  axLocal>127 ){. 
17210 20 20 20 70 42 74 2d 3e 6d 61 78 31 62 79 74 65     pBt->max1byte
17220 50 61 79 6c 6f 61 64 20 3d 20 31 32 37 3b 0a 20  Payload = 127;. 
17230 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 42 74 2d   }else{.    pBt-
17240 3e 6d 61 78 31 62 79 74 65 50 61 79 6c 6f 61 64  >max1bytePayload
17250 20 3d 20 28 75 38 29 70 42 74 2d 3e 6d 61 78 4c   = (u8)pBt->maxL
17260 6f 63 61 6c 3b 0a 20 20 7d 0a 20 20 61 73 73 65  ocal;.  }.  asse
17270 72 74 28 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66  rt( pBt->maxLeaf
17280 20 2b 20 32 33 20 3c 3d 20 4d 58 5f 43 45 4c 4c   + 23 <= MX_CELL
17290 5f 53 49 5a 45 28 70 42 74 29 20 29 3b 0a 20 20  _SIZE(pBt) );.  
172a0 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 70 50  pBt->pPage1 = pP
172b0 61 67 65 31 3b 0a 20 20 70 42 74 2d 3e 6e 50 61  age1;.  pBt->nPa
172c0 67 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 72 65  ge = nPage;.  re
172d0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
172e0 0a 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c  .page1_init_fail
172f0 65 64 3a 0a 20 20 72 65 6c 65 61 73 65 50 61 67  ed:.  releasePag
17300 65 28 70 50 61 67 65 31 29 3b 0a 20 20 70 42 74  e(pPage1);.  pBt
17310 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a 20 20  ->pPage1 = 0;.  
17320 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69  return rc;.}..#i
17330 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 2f 2a 0a  fndef NDEBUG./*.
17340 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
17350 6d 62 65 72 20 6f 66 20 63 75 72 73 6f 72 73 20  mber of cursors 
17360 6f 70 65 6e 20 6f 6e 20 70 42 74 2e 20 54 68 69  open on pBt. Thi
17370 73 20 69 73 20 66 6f 72 20 75 73 65 0a 2a 2a 20  s is for use.** 
17380 69 6e 20 61 73 73 65 72 74 28 29 20 65 78 70 72  in assert() expr
17390 65 73 73 69 6f 6e 73 2c 20 73 6f 20 69 74 20 69  essions, so it i
173a0 73 20 6f 6e 6c 79 20 63 6f 6d 70 69 6c 65 64 20  s only compiled 
173b0 69 66 20 4e 44 45 42 55 47 20 69 73 20 6e 6f 74  if NDEBUG is not
173c0 0a 2a 2a 20 64 65 66 69 6e 65 64 2e 0a 2a 2a 0a  .** defined..**.
173d0 2a 2a 20 4f 6e 6c 79 20 77 72 69 74 65 20 63 75  ** Only write cu
173e0 72 73 6f 72 73 20 61 72 65 20 63 6f 75 6e 74 65  rsors are counte
173f0 64 20 69 66 20 77 72 4f 6e 6c 79 20 69 73 20 74  d if wrOnly is t
17400 72 75 65 2e 20 20 49 66 20 77 72 4f 6e 6c 79 20  rue.  If wrOnly 
17410 69 73 0a 2a 2a 20 66 61 6c 73 65 20 74 68 65 6e  is.** false then
17420 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 61 72 65   all cursors are
17430 20 63 6f 75 6e 74 65 64 2e 0a 2a 2a 0a 2a 2a 20   counted..**.** 
17440 46 6f 72 20 74 68 65 20 70 75 72 70 6f 73 65 73  For the purposes
17450 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65   of this routine
17460 2c 20 61 20 63 75 72 73 6f 72 20 69 73 20 61 6e  , a cursor is an
17470 79 20 63 75 72 73 6f 72 20 74 68 61 74 0a 2a 2a  y cursor that.**
17480 20 69 73 20 63 61 70 61 62 6c 65 20 6f 66 20 72   is capable of r
17490 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e  eading or writin
174a0 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  g to the databas
174b0 65 2e 20 20 43 75 72 73 6f 72 73 20 74 68 61 74  e.  Cursors that
174c0 0a 2a 2a 20 68 61 76 65 20 62 65 65 6e 20 74 72  .** have been tr
174d0 69 70 70 65 64 20 69 6e 74 6f 20 74 68 65 20 43  ipped into the C
174e0 55 52 53 4f 52 5f 46 41 55 4c 54 20 73 74 61 74  URSOR_FAULT stat
174f0 65 20 61 72 65 20 6e 6f 74 20 63 6f 75 6e 74 65  e are not counte
17500 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
17510 20 63 6f 75 6e 74 56 61 6c 69 64 43 75 72 73 6f   countValidCurso
17520 72 73 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  rs(BtShared *pBt
17530 2c 20 69 6e 74 20 77 72 4f 6e 6c 79 29 7b 0a 20  , int wrOnly){. 
17540 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 3b   BtCursor *pCur;
17550 0a 20 20 69 6e 74 20 72 20 3d 20 30 3b 0a 20 20  .  int r = 0;.  
17560 66 6f 72 28 70 43 75 72 3d 70 42 74 2d 3e 70 43  for(pCur=pBt->pC
17570 75 72 73 6f 72 3b 20 70 43 75 72 3b 20 70 43 75  ursor; pCur; pCu
17580 72 3d 70 43 75 72 2d 3e 70 4e 65 78 74 29 7b 0a  r=pCur->pNext){.
17590 20 20 20 20 69 66 28 20 28 77 72 4f 6e 6c 79 3d      if( (wrOnly=
175a0 3d 30 20 7c 7c 20 28 70 43 75 72 2d 3e 63 75 72  =0 || (pCur->cur
175b0 46 6c 61 67 73 20 26 20 42 54 43 46 5f 57 72 69  Flags & BTCF_Wri
175c0 74 65 46 6c 61 67 29 21 3d 30 29 0a 20 20 20 20  teFlag)!=0).    
175d0 20 26 26 20 70 43 75 72 2d 3e 65 53 74 61 74 65   && pCur->eState
175e0 21 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 29  !=CURSOR_FAULT )
175f0 20 72 2b 2b 3b 20 0a 20 20 7d 0a 20 20 72 65 74   r++; .  }.  ret
17600 75 72 6e 20 72 3b 0a 7d 0a 23 65 6e 64 69 66 0a  urn r;.}.#endif.
17610 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20  ./*.** If there 
17620 61 72 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69  are no outstandi
17630 6e 67 20 63 75 72 73 6f 72 73 20 61 6e 64 20 77  ng cursors and w
17640 65 20 61 72 65 20 6e 6f 74 20 69 6e 20 74 68 65  e are not in the
17650 20 6d 69 64 64 6c 65 0a 2a 2a 20 6f 66 20 61 20   middle.** of a 
17660 74 72 61 6e 73 61 63 74 69 6f 6e 20 62 75 74 20  transaction but 
17670 74 68 65 72 65 20 69 73 20 61 20 72 65 61 64 20  there is a read 
17680 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
17690 62 61 73 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68  base, then.** th
176a0 69 73 20 72 6f 75 74 69 6e 65 20 75 6e 72 65 66  is routine unref
176b0 73 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65  s the first page
176c0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
176d0 20 66 69 6c 65 20 77 68 69 63 68 20 0a 2a 2a 20   file which .** 
176e0 68 61 73 20 74 68 65 20 65 66 66 65 63 74 20 6f  has the effect o
176f0 66 20 72 65 6c 65 61 73 69 6e 67 20 74 68 65 20  f releasing the 
17700 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a  read lock..**.**
17710 20 49 66 20 74 68 65 72 65 20 69 73 20 61 20 74   If there is a t
17720 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 70 72  ransaction in pr
17730 6f 67 72 65 73 73 2c 20 74 68 69 73 20 72 6f 75  ogress, this rou
17740 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tine is a no-op.
17750 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
17760 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75  unlockBtreeIfUnu
17770 73 65 64 28 42 74 53 68 61 72 65 64 20 2a 70 42  sed(BtShared *pB
17780 74 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71  t){.  assert( sq
17790 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
177a0 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
177b0 20 20 61 73 73 65 72 74 28 20 63 6f 75 6e 74 56    assert( countV
177c0 61 6c 69 64 43 75 72 73 6f 72 73 28 70 42 74 2c  alidCursors(pBt,
177d0 30 29 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 69 6e  0)==0 || pBt->in
177e0 54 72 61 6e 73 61 63 74 69 6f 6e 3e 54 52 41 4e  Transaction>TRAN
177f0 53 5f 4e 4f 4e 45 20 29 3b 0a 20 20 69 66 28 20  S_NONE );.  if( 
17800 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
17810 6f 6e 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 26  on==TRANS_NONE &
17820 26 20 70 42 74 2d 3e 70 50 61 67 65 31 21 3d 30  & pBt->pPage1!=0
17830 20 29 7b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20   ){.    MemPage 
17840 2a 70 50 61 67 65 31 20 3d 20 70 42 74 2d 3e 70  *pPage1 = pBt->p
17850 50 61 67 65 31 3b 0a 20 20 20 20 61 73 73 65 72  Page1;.    asser
17860 74 28 20 70 50 61 67 65 31 2d 3e 61 44 61 74 61  t( pPage1->aData
17870 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
17880 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 63  sqlite3PagerRefc
17890 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72  ount(pBt->pPager
178a0 29 3d 3d 31 20 29 3b 0a 20 20 20 20 70 42 74 2d  )==1 );.    pBt-
178b0 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a 20 20 20  >pPage1 = 0;.   
178c0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61   releasePage(pPa
178d0 67 65 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  ge1);.  }.}../*.
178e0 2a 2a 20 49 66 20 70 42 74 20 70 6f 69 6e 74 73  ** If pBt points
178f0 20 74 6f 20 61 6e 20 65 6d 70 74 79 20 66 69 6c   to an empty fil
17900 65 20 74 68 65 6e 20 63 6f 6e 76 65 72 74 20 74  e then convert t
17910 68 61 74 20 65 6d 70 74 79 20 66 69 6c 65 0a 2a  hat empty file.*
17920 2a 20 69 6e 74 6f 20 61 20 6e 65 77 20 65 6d 70  * into a new emp
17930 74 79 20 64 61 74 61 62 61 73 65 20 62 79 20 69  ty database by i
17940 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20  nitializing the 
17950 66 69 72 73 74 20 70 61 67 65 20 6f 66 0a 2a 2a  first page of.**
17960 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a   the database..*
17970 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 65 77  /.static int new
17980 44 61 74 61 62 61 73 65 28 42 74 53 68 61 72 65  Database(BtShare
17990 64 20 2a 70 42 74 29 7b 0a 20 20 4d 65 6d 50 61  d *pBt){.  MemPa
179a0 67 65 20 2a 70 50 31 3b 0a 20 20 75 6e 73 69 67  ge *pP1;.  unsig
179b0 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61 3b 0a  ned char *data;.
179c0 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73    int rc;..  ass
179d0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
179e0 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
179f0 65 78 29 20 29 3b 0a 20 20 69 66 28 20 70 42 74  ex) );.  if( pBt
17a00 2d 3e 6e 50 61 67 65 3e 30 20 29 7b 0a 20 20 20  ->nPage>0 ){.   
17a10 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
17a20 4b 3b 0a 20 20 7d 0a 20 20 70 50 31 20 3d 20 70  K;.  }.  pP1 = p
17a30 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20 61 73  Bt->pPage1;.  as
17a40 73 65 72 74 28 20 70 50 31 21 3d 30 20 29 3b 0a  sert( pP1!=0 );.
17a50 20 20 64 61 74 61 20 3d 20 70 50 31 2d 3e 61 44    data = pP1->aD
17a60 61 74 61 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ata;.  rc = sqli
17a70 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
17a80 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 69  1->pDbPage);.  i
17a90 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
17aa0 63 3b 0a 20 20 6d 65 6d 63 70 79 28 64 61 74 61  c;.  memcpy(data
17ab0 2c 20 7a 4d 61 67 69 63 48 65 61 64 65 72 2c 20  , zMagicHeader, 
17ac0 73 69 7a 65 6f 66 28 7a 4d 61 67 69 63 48 65 61  sizeof(zMagicHea
17ad0 64 65 72 29 29 3b 0a 20 20 61 73 73 65 72 74 28  der));.  assert(
17ae0 20 73 69 7a 65 6f 66 28 7a 4d 61 67 69 63 48 65   sizeof(zMagicHe
17af0 61 64 65 72 29 3d 3d 31 36 20 29 3b 0a 20 20 64  ader)==16 );.  d
17b00 61 74 61 5b 31 36 5d 20 3d 20 28 75 38 29 28 28  ata[16] = (u8)((
17b10 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3e 38  pBt->pageSize>>8
17b20 29 26 30 78 66 66 29 3b 0a 20 20 64 61 74 61 5b  )&0xff);.  data[
17b30 31 37 5d 20 3d 20 28 75 38 29 28 28 70 42 74 2d  17] = (u8)((pBt-
17b40 3e 70 61 67 65 53 69 7a 65 3e 3e 31 36 29 26 30  >pageSize>>16)&0
17b50 78 66 66 29 3b 0a 20 20 64 61 74 61 5b 31 38 5d  xff);.  data[18]
17b60 20 3d 20 31 3b 0a 20 20 64 61 74 61 5b 31 39 5d   = 1;.  data[19]
17b70 20 3d 20 31 3b 0a 20 20 61 73 73 65 72 74 28 20   = 1;.  assert( 
17b80 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3c  pBt->usableSize<
17b90 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 26  =pBt->pageSize &
17ba0 26 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  & pBt->usableSiz
17bb0 65 2b 32 35 35 3e 3d 70 42 74 2d 3e 70 61 67 65  e+255>=pBt->page
17bc0 53 69 7a 65 29 3b 0a 20 20 64 61 74 61 5b 32 30  Size);.  data[20
17bd0 5d 20 3d 20 28 75 38 29 28 70 42 74 2d 3e 70 61  ] = (u8)(pBt->pa
17be0 67 65 53 69 7a 65 20 2d 20 70 42 74 2d 3e 75 73  geSize - pBt->us
17bf0 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20 64 61 74  ableSize);.  dat
17c00 61 5b 32 31 5d 20 3d 20 36 34 3b 0a 20 20 64 61  a[21] = 64;.  da
17c10 74 61 5b 32 32 5d 20 3d 20 33 32 3b 0a 20 20 64  ta[22] = 32;.  d
17c20 61 74 61 5b 32 33 5d 20 3d 20 33 32 3b 0a 20 20  ata[23] = 32;.  
17c30 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 32 34 5d  memset(&data[24]
17c40 2c 20 30 2c 20 31 30 30 2d 32 34 29 3b 0a 20 20  , 0, 100-24);.  
17c50 7a 65 72 6f 50 61 67 65 28 70 50 31 2c 20 50 54  zeroPage(pP1, PT
17c60 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41  F_INTKEY|PTF_LEA
17c70 46 7c 50 54 46 5f 4c 45 41 46 44 41 54 41 20 29  F|PTF_LEAFDATA )
17c80 3b 0a 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67  ;.  pBt->btsFlag
17c90 73 20 7c 3d 20 42 54 53 5f 50 41 47 45 53 49 5a  s |= BTS_PAGESIZ
17ca0 45 5f 46 49 58 45 44 3b 0a 23 69 66 6e 64 65 66  E_FIXED;.#ifndef
17cb0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
17cc0 4f 56 41 43 55 55 4d 0a 20 20 61 73 73 65 72 74  OVACUUM.  assert
17cd0 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
17ce0 6d 3d 3d 31 20 7c 7c 20 70 42 74 2d 3e 61 75 74  m==1 || pBt->aut
17cf0 6f 56 61 63 75 75 6d 3d 3d 30 20 29 3b 0a 20 20  oVacuum==0 );.  
17d00 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 63  assert( pBt->inc
17d10 72 56 61 63 75 75 6d 3d 3d 31 20 7c 7c 20 70 42  rVacuum==1 || pB
17d20 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 3d 3d 30  t->incrVacuum==0
17d30 20 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26   );.  put4byte(&
17d40 64 61 74 61 5b 33 36 20 2b 20 34 2a 34 5d 2c 20  data[36 + 4*4], 
17d50 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29  pBt->autoVacuum)
17d60 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 64 61  ;.  put4byte(&da
17d70 74 61 5b 33 36 20 2b 20 37 2a 34 5d 2c 20 70 42  ta[36 + 7*4], pB
17d80 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 29 3b 0a  t->incrVacuum);.
17d90 23 65 6e 64 69 66 0a 20 20 70 42 74 2d 3e 6e 50  #endif.  pBt->nP
17da0 61 67 65 20 3d 20 31 3b 0a 20 20 64 61 74 61 5b  age = 1;.  data[
17db0 33 31 5d 20 3d 20 31 3b 0a 20 20 72 65 74 75 72  31] = 1;.  retur
17dc0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
17dd0 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65  /*.** Initialize
17de0 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20   the first page 
17df0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
17e00 66 69 6c 65 20 28 63 72 65 61 74 69 6e 67 20 61  file (creating a
17e10 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f 6e   database.** con
17e20 73 69 73 74 69 6e 67 20 6f 66 20 61 20 73 69 6e  sisting of a sin
17e30 67 6c 65 20 70 61 67 65 20 61 6e 64 20 6e 6f 20  gle page and no 
17e40 73 63 68 65 6d 61 20 6f 62 6a 65 63 74 73 29 2e  schema objects).
17e50 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
17e60 4b 0a 2a 2a 20 69 66 20 73 75 63 63 65 73 73 66  K.** if successf
17e70 75 6c 2c 20 6f 72 20 61 6e 20 53 51 4c 69 74 65  ul, or an SQLite
17e80 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 74 68 65   error code othe
17e90 72 77 69 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  rwise..*/.int sq
17ea0 6c 69 74 65 33 42 74 72 65 65 4e 65 77 44 62 28  lite3BtreeNewDb(
17eb0 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74  Btree *p){.  int
17ec0 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74   rc;.  sqlite3Bt
17ed0 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 70  reeEnter(p);.  p
17ee0 2d 3e 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 30  ->pBt->nPage = 0
17ef0 3b 0a 20 20 72 63 20 3d 20 6e 65 77 44 61 74 61  ;.  rc = newData
17f00 62 61 73 65 28 70 2d 3e 70 42 74 29 3b 0a 20 20  base(p->pBt);.  
17f10 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
17f20 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
17f30 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65  c;.}../*.** Atte
17f40 6d 70 74 20 74 6f 20 73 74 61 72 74 20 61 20 6e  mpt to start a n
17f50 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  ew transaction. 
17f60 41 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  A write-transact
17f70 69 6f 6e 0a 2a 2a 20 69 73 20 73 74 61 72 74 65  ion.** is starte
17f80 64 20 69 66 20 74 68 65 20 73 65 63 6f 6e 64 20  d if the second 
17f90 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 6e 7a  argument is nonz
17fa0 65 72 6f 2c 20 6f 74 68 65 72 77 69 73 65 20 61  ero, otherwise a
17fb0 20 72 65 61 64 2d 0a 2a 2a 20 74 72 61 6e 73 61   read-.** transa
17fc0 63 74 69 6f 6e 2e 20 20 49 66 20 74 68 65 20 73  ction.  If the s
17fd0 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69  econd argument i
17fe0 73 20 32 20 6f 72 20 6d 6f 72 65 20 61 6e 64 20  s 2 or more and 
17ff0 65 78 63 6c 75 73 69 76 65 0a 2a 2a 20 74 72 61  exclusive.** tra
18000 6e 73 61 63 74 69 6f 6e 20 69 73 20 73 74 61 72  nsaction is star
18010 74 65 64 2c 20 6d 65 61 6e 69 6e 67 20 74 68 61  ted, meaning tha
18020 74 20 6e 6f 20 6f 74 68 65 72 20 70 72 6f 63 65  t no other proce
18030 73 73 20 69 73 20 61 6c 6c 6f 77 65 64 0a 2a 2a  ss is allowed.**
18040 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 64   to access the d
18050 61 74 61 62 61 73 65 2e 20 20 41 20 70 72 65 65  atabase.  A pree
18060 78 69 73 74 69 6e 67 20 74 72 61 6e 73 61 63 74  xisting transact
18070 69 6f 6e 20 6d 61 79 20 6e 6f 74 20 62 65 0a 2a  ion may not be.*
18080 2a 20 75 70 67 72 61 64 65 64 20 74 6f 20 65 78  * upgraded to ex
18090 63 6c 75 73 69 76 65 20 62 79 20 63 61 6c 6c 69  clusive by calli
180a0 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ng this routine 
180b0 61 20 73 65 63 6f 6e 64 20 74 69 6d 65 20 2d 20  a second time - 
180c0 74 68 65 0a 2a 2a 20 65 78 63 6c 75 73 69 76 69  the.** exclusivi
180d0 74 79 20 66 6c 61 67 20 6f 6e 6c 79 20 77 6f 72  ty flag only wor
180e0 6b 73 20 66 6f 72 20 61 20 6e 65 77 20 74 72 61  ks for a new tra
180f0 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  nsaction..**.** 
18100 41 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  A write-transact
18110 69 6f 6e 20 6d 75 73 74 20 62 65 20 73 74 61 72  ion must be star
18120 74 65 64 20 62 65 66 6f 72 65 20 61 74 74 65 6d  ted before attem
18130 70 74 69 6e 67 20 61 6e 79 20 0a 2a 2a 20 63 68  pting any .** ch
18140 61 6e 67 65 73 20 74 6f 20 74 68 65 20 64 61 74  anges to the dat
18150 61 62 61 73 65 2e 20 20 4e 6f 6e 65 20 6f 66 20  abase.  None of 
18160 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f  the following ro
18170 75 74 69 6e 65 73 20 0a 2a 2a 20 77 69 6c 6c 20  utines .** will 
18180 77 6f 72 6b 20 75 6e 6c 65 73 73 20 61 20 74 72  work unless a tr
18190 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 73 74 61  ansaction is sta
181a0 72 74 65 64 20 66 69 72 73 74 3a 0a 2a 2a 0a 2a  rted first:.**.*
181b0 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  *      sqlite3Bt
181c0 72 65 65 43 72 65 61 74 65 54 61 62 6c 65 28 29  reeCreateTable()
181d0 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33  .**      sqlite3
181e0 42 74 72 65 65 43 72 65 61 74 65 49 6e 64 65 78  BtreeCreateIndex
181f0 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74  ().**      sqlit
18200 65 33 42 74 72 65 65 43 6c 65 61 72 54 61 62 6c  e3BtreeClearTabl
18210 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69  e().**      sqli
18220 74 65 33 42 74 72 65 65 44 72 6f 70 54 61 62 6c  te3BtreeDropTabl
18230 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69  e().**      sqli
18240 74 65 33 42 74 72 65 65 49 6e 73 65 72 74 28 29  te3BtreeInsert()
18250 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33  .**      sqlite3
18260 42 74 72 65 65 44 65 6c 65 74 65 28 29 0a 2a 2a  BtreeDelete().**
18270 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
18280 65 65 55 70 64 61 74 65 4d 65 74 61 28 29 0a 2a  eeUpdateMeta().*
18290 2a 0a 2a 2a 20 49 66 20 61 6e 20 69 6e 69 74 69  *.** If an initi
182a0 61 6c 20 61 74 74 65 6d 70 74 20 74 6f 20 61 63  al attempt to ac
182b0 71 75 69 72 65 20 74 68 65 20 6c 6f 63 6b 20 66  quire the lock f
182c0 61 69 6c 73 20 62 65 63 61 75 73 65 20 6f 66 20  ails because of 
182d0 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74 69 6f 6e 0a  lock contention.
182e0 2a 2a 20 61 6e 64 20 74 68 65 20 64 61 74 61 62  ** and the datab
182f0 61 73 65 20 77 61 73 20 70 72 65 76 69 6f 75 73  ase was previous
18300 6c 79 20 75 6e 6c 6f 63 6b 65 64 2c 20 74 68 65  ly unlocked, the
18310 6e 20 69 6e 76 6f 6b 65 20 74 68 65 20 62 75 73  n invoke the bus
18320 79 20 68 61 6e 64 6c 65 72 0a 2a 2a 20 69 66 20  y handler.** if 
18330 74 68 65 72 65 20 69 73 20 6f 6e 65 2e 20 20 42  there is one.  B
18340 75 74 20 69 66 20 74 68 65 72 65 20 77 61 73 20  ut if there was 
18350 70 72 65 76 69 6f 75 73 6c 79 20 61 20 72 65 61  previously a rea
18360 64 2d 6c 6f 63 6b 2c 20 64 6f 20 6e 6f 74 0a 2a  d-lock, do not.*
18370 2a 20 69 6e 76 6f 6b 65 20 74 68 65 20 62 75 73  * invoke the bus
18380 79 20 68 61 6e 64 6c 65 72 20 2d 20 6a 75 73 74  y handler - just
18390 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42   return SQLITE_B
183a0 55 53 59 2e 20 20 53 51 4c 49 54 45 5f 42 55 53  USY.  SQLITE_BUS
183b0 59 20 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65  Y is .** returne
183c0 64 20 77 68 65 6e 20 74 68 65 72 65 20 69 73 20  d when there is 
183d0 61 6c 72 65 61 64 79 20 61 20 72 65 61 64 2d 6c  already a read-l
183e0 6f 63 6b 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ock in order to 
183f0 61 76 6f 69 64 20 61 20 64 65 61 64 6c 6f 63 6b  avoid a deadlock
18400 2e 0a 2a 2a 0a 2a 2a 20 53 75 70 70 6f 73 65 20  ..**.** Suppose 
18410 74 68 65 72 65 20 61 72 65 20 74 77 6f 20 70 72  there are two pr
18420 6f 63 65 73 73 65 73 20 41 20 61 6e 64 20 42 2e  ocesses A and B.
18430 20 20 41 20 68 61 73 20 61 20 72 65 61 64 20 6c    A has a read l
18440 6f 63 6b 20 61 6e 64 20 42 20 68 61 73 0a 2a 2a  ock and B has.**
18450 20 61 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b   a reserved lock
18460 2e 20 20 42 20 74 72 69 65 73 20 74 6f 20 70 72  .  B tries to pr
18470 6f 6d 6f 74 65 20 74 6f 20 65 78 63 6c 75 73 69  omote to exclusi
18480 76 65 20 62 75 74 20 69 73 20 62 6c 6f 63 6b 65  ve but is blocke
18490 64 20 62 65 63 61 75 73 65 0a 2a 2a 20 6f 66 20  d because.** of 
184a0 41 27 73 20 72 65 61 64 20 6c 6f 63 6b 2e 20 20  A's read lock.  
184b0 41 20 74 72 69 65 73 20 74 6f 20 70 72 6f 6d 6f  A tries to promo
184c0 74 65 20 74 6f 20 72 65 73 65 72 76 65 64 20 62  te to reserved b
184d0 75 74 20 69 73 20 62 6c 6f 63 6b 65 64 20 62 79  ut is blocked by
184e0 20 42 2e 0a 2a 2a 20 4f 6e 65 20 6f 72 20 74 68   B..** One or th
184f0 65 20 6f 74 68 65 72 20 6f 66 20 74 68 65 20 74  e other of the t
18500 77 6f 20 70 72 6f 63 65 73 73 65 73 20 6d 75 73  wo processes mus
18510 74 20 67 69 76 65 20 77 61 79 20 6f 72 20 74 68  t give way or th
18520 65 72 65 20 63 61 6e 20 62 65 0a 2a 2a 20 6e 6f  ere can be.** no
18530 20 70 72 6f 67 72 65 73 73 2e 20 20 42 79 20 72   progress.  By r
18540 65 74 75 72 6e 69 6e 67 20 53 51 4c 49 54 45 5f  eturning SQLITE_
18550 42 55 53 59 20 61 6e 64 20 6e 6f 74 20 69 6e 76  BUSY and not inv
18560 6f 6b 69 6e 67 20 74 68 65 20 62 75 73 79 20 63  oking the busy c
18570 61 6c 6c 62 61 63 6b 0a 2a 2a 20 77 68 65 6e 20  allback.** when 
18580 41 20 61 6c 72 65 61 64 79 20 68 61 73 20 61 20  A already has a 
18590 72 65 61 64 20 6c 6f 63 6b 2c 20 77 65 20 65 6e  read lock, we en
185a0 63 6f 75 72 61 67 65 20 41 20 74 6f 20 67 69 76  courage A to giv
185b0 65 20 75 70 20 61 6e 64 20 6c 65 74 20 42 0a 2a  e up and let B.*
185c0 2a 20 70 72 6f 63 65 65 64 2e 0a 2a 2f 0a 69 6e  * proceed..*/.in
185d0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 42 65  t sqlite3BtreeBe
185e0 67 69 6e 54 72 61 6e 73 28 42 74 72 65 65 20 2a  ginTrans(Btree *
185f0 70 2c 20 69 6e 74 20 77 72 66 6c 61 67 29 7b 0a  p, int wrflag){.
18600 20 20 73 71 6c 69 74 65 33 20 2a 70 42 6c 6f 63    sqlite3 *pBloc
18610 6b 20 3d 20 30 3b 0a 20 20 42 74 53 68 61 72 65  k = 0;.  BtShare
18620 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
18630 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
18640 54 45 5f 4f 4b 3b 0a 0a 20 20 73 71 6c 69 74 65  TE_OK;..  sqlite
18650 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
18660 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79    btreeIntegrity
18670 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  (p);..  /* If th
18680 65 20 62 74 72 65 65 20 69 73 20 61 6c 72 65 61  e btree is alrea
18690 64 79 20 69 6e 20 61 20 77 72 69 74 65 2d 74 72  dy in a write-tr
186a0 61 6e 73 61 63 74 69 6f 6e 2c 20 6f 72 20 69 74  ansaction, or it
186b0 0a 20 20 2a 2a 20 69 73 20 61 6c 72 65 61 64 79  .  ** is already
186c0 20 69 6e 20 61 20 72 65 61 64 2d 74 72 61 6e 73   in a read-trans
186d0 61 63 74 69 6f 6e 20 61 6e 64 20 61 20 72 65 61  action and a rea
186e0 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20  d-transaction.  
186f0 2a 2a 20 69 73 20 72 65 71 75 65 73 74 65 64 2c  ** is requested,
18700 20 74 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70   this is a no-op
18710 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
18720 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57  inTrans==TRANS_W
18730 52 49 54 45 20 7c 7c 20 28 70 2d 3e 69 6e 54 72  RITE || (p->inTr
18740 61 6e 73 3d 3d 54 52 41 4e 53 5f 52 45 41 44 20  ans==TRANS_READ 
18750 26 26 20 21 77 72 66 6c 61 67 29 20 29 7b 0a 20  && !wrflag) ){. 
18760 20 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65     goto trans_be
18770 67 75 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  gun;.  }.  asser
18780 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  t( pBt->inTransa
18790 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49  ction==TRANS_WRI
187a0 54 45 20 7c 7c 20 49 66 4e 6f 74 4f 6d 69 74 41  TE || IfNotOmitA
187b0 56 28 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61  V(pBt->bDoTrunca
187c0 74 65 29 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20  te)==0 );..  /* 
187d0 57 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  Write transactio
187e0 6e 73 20 61 72 65 20 6e 6f 74 20 70 6f 73 73 69  ns are not possi
187f0 62 6c 65 20 6f 6e 20 61 20 72 65 61 64 2d 6f 6e  ble on a read-on
18800 6c 79 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  ly database */. 
18810 20 69 66 28 20 28 70 42 74 2d 3e 62 74 73 46 6c   if( (pBt->btsFl
18820 61 67 73 20 26 20 42 54 53 5f 52 45 41 44 5f 4f  ags & BTS_READ_O
18830 4e 4c 59 29 21 3d 30 20 26 26 20 77 72 66 6c 61  NLY)!=0 && wrfla
18840 67 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  g ){.    rc = SQ
18850 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20  LITE_READONLY;. 
18860 20 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65     goto trans_be
18870 67 75 6e 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65  gun;.  }..#ifnde
18880 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  f SQLITE_OMIT_SH
18890 41 52 45 44 5f 43 41 43 48 45 0a 20 20 2f 2a 20  ARED_CACHE.  /* 
188a0 49 66 20 61 6e 6f 74 68 65 72 20 64 61 74 61 62  If another datab
188b0 61 73 65 20 68 61 6e 64 6c 65 20 68 61 73 20 61  ase handle has a
188c0 6c 72 65 61 64 79 20 6f 70 65 6e 65 64 20 61 20  lready opened a 
188d0 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
188e0 6e 20 0a 20 20 2a 2a 20 6f 6e 20 74 68 69 73 20  n .  ** on this 
188f0 73 68 61 72 65 64 2d 62 74 72 65 65 20 73 74 72  shared-btree str
18900 75 63 74 75 72 65 20 61 6e 64 20 61 20 73 65 63  ucture and a sec
18910 6f 6e 64 20 77 72 69 74 65 20 74 72 61 6e 73 61  ond write transa
18920 63 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 72 65  ction is.  ** re
18930 71 75 65 73 74 65 64 2c 20 72 65 74 75 72 6e 20  quested, return 
18940 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 2e 0a 20  SQLITE_LOCKED.. 
18950 20 2a 2f 0a 20 20 69 66 28 20 28 77 72 66 6c 61   */.  if( (wrfla
18960 67 20 26 26 20 70 42 74 2d 3e 69 6e 54 72 61 6e  g && pBt->inTran
18970 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57  saction==TRANS_W
18980 52 49 54 45 29 0a 20 20 20 7c 7c 20 28 70 42 74  RITE).   || (pBt
18990 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53  ->btsFlags & BTS
189a0 5f 50 45 4e 44 49 4e 47 29 21 3d 30 0a 20 20 29  _PENDING)!=0.  )
189b0 7b 0a 20 20 20 20 70 42 6c 6f 63 6b 20 3d 20 70  {.    pBlock = p
189c0 42 74 2d 3e 70 57 72 69 74 65 72 2d 3e 64 62 3b  Bt->pWriter->db;
189d0 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 77 72 66  .  }else if( wrf
189e0 6c 61 67 3e 31 20 29 7b 0a 20 20 20 20 42 74 4c  lag>1 ){.    BtL
189f0 6f 63 6b 20 2a 70 49 74 65 72 3b 0a 20 20 20 20  ock *pIter;.    
18a00 66 6f 72 28 70 49 74 65 72 3d 70 42 74 2d 3e 70  for(pIter=pBt->p
18a10 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70 49 74  Lock; pIter; pIt
18a20 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78 74 29  er=pIter->pNext)
18a30 7b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65  {.      if( pIte
18a40 72 2d 3e 70 42 74 72 65 65 21 3d 70 20 29 7b 0a  r->pBtree!=p ){.
18a50 20 20 20 20 20 20 20 20 70 42 6c 6f 63 6b 20 3d          pBlock =
18a60 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65 2d 3e   pIter->pBtree->
18a70 64 62 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  db;.        brea
18a80 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
18a90 0a 20 20 7d 0a 20 20 69 66 28 20 70 42 6c 6f 63  .  }.  if( pBloc
18aa0 6b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  k ){.    sqlite3
18ab0 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63 6b 65  ConnectionBlocke
18ac0 64 28 70 2d 3e 64 62 2c 20 70 42 6c 6f 63 6b 29  d(p->db, pBlock)
18ad0 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  ;.    rc = SQLIT
18ae0 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44 43  E_LOCKED_SHAREDC
18af0 41 43 48 45 3b 0a 20 20 20 20 67 6f 74 6f 20 74  ACHE;.    goto t
18b00 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a  rans_begun;.  }.
18b10 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 41 6e 79  #endif..  /* Any
18b20 20 72 65 61 64 2d 6f 6e 6c 79 20 6f 72 20 72 65   read-only or re
18b30 61 64 2d 77 72 69 74 65 20 74 72 61 6e 73 61 63  ad-write transac
18b40 74 69 6f 6e 20 69 6d 70 6c 69 65 73 20 61 20 72  tion implies a r
18b50 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 0a 20 20 2a  ead-lock on .  *
18b60 2a 20 70 61 67 65 20 31 2e 20 53 6f 20 69 66 20  * page 1. So if 
18b70 73 6f 6d 65 20 6f 74 68 65 72 20 73 68 61 72 65  some other share
18b80 64 2d 63 61 63 68 65 20 63 6c 69 65 6e 74 20 61  d-cache client a
18b90 6c 72 65 61 64 79 20 68 61 73 20 61 20 77 72 69  lready has a wri
18ba0 74 65 2d 6c 6f 63 6b 20 0a 20 20 2a 2a 20 6f 6e  te-lock .  ** on
18bb0 20 70 61 67 65 20 31 2c 20 74 68 65 20 74 72 61   page 1, the tra
18bc0 6e 73 61 63 74 69 6f 6e 20 63 61 6e 6e 6f 74 20  nsaction cannot 
18bd0 62 65 20 6f 70 65 6e 65 64 2e 20 2a 2f 0a 20 20  be opened. */.  
18be0 72 63 20 3d 20 71 75 65 72 79 53 68 61 72 65 64  rc = queryShared
18bf0 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 70  CacheTableLock(p
18c00 2c 20 4d 41 53 54 45 52 5f 52 4f 4f 54 2c 20 52  , MASTER_ROOT, R
18c10 45 41 44 5f 4c 4f 43 4b 29 3b 0a 20 20 69 66 28  EAD_LOCK);.  if(
18c20 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63 20 29   SQLITE_OK!=rc )
18c30 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67 75   goto trans_begu
18c40 6e 3b 0a 0a 20 20 70 42 74 2d 3e 62 74 73 46 6c  n;..  pBt->btsFl
18c50 61 67 73 20 26 3d 20 7e 42 54 53 5f 49 4e 49 54  ags &= ~BTS_INIT
18c60 49 41 4c 4c 59 5f 45 4d 50 54 59 3b 0a 20 20 69  IALLY_EMPTY;.  i
18c70 66 28 20 70 42 74 2d 3e 6e 50 61 67 65 3d 3d 30  f( pBt->nPage==0
18c80 20 29 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73   ) pBt->btsFlags
18c90 20 7c 3d 20 42 54 53 5f 49 4e 49 54 49 41 4c 4c   |= BTS_INITIALL
18ca0 59 5f 45 4d 50 54 59 3b 0a 20 20 64 6f 20 7b 0a  Y_EMPTY;.  do {.
18cb0 20 20 20 20 2f 2a 20 43 61 6c 6c 20 6c 6f 63 6b      /* Call lock
18cc0 42 74 72 65 65 28 29 20 75 6e 74 69 6c 20 65 69  Btree() until ei
18cd0 74 68 65 72 20 70 42 74 2d 3e 70 50 61 67 65 31  ther pBt->pPage1
18ce0 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20 6f 72   is populated or
18cf0 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b 42 74 72 65  .    ** lockBtre
18d00 65 28 29 20 72 65 74 75 72 6e 73 20 73 6f 6d 65  e() returns some
18d10 74 68 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e  thing other than
18d20 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 6c 6f 63 6b   SQLITE_OK. lock
18d30 42 74 72 65 65 28 29 0a 20 20 20 20 2a 2a 20 6d  Btree().    ** m
18d40 61 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ay return SQLITE
18d50 5f 4f 4b 20 62 75 74 20 6c 65 61 76 65 20 70 42  _OK but leave pB
18d60 74 2d 3e 70 50 61 67 65 31 20 73 65 74 20 74 6f  t->pPage1 set to
18d70 20 30 20 69 66 20 61 66 74 65 72 0a 20 20 20 20   0 if after.    
18d80 2a 2a 20 72 65 61 64 69 6e 67 20 70 61 67 65 20  ** reading page 
18d90 31 20 69 74 20 64 69 73 63 6f 76 65 72 73 20 74  1 it discovers t
18da0 68 61 74 20 74 68 65 20 70 61 67 65 2d 73 69 7a  hat the page-siz
18db0 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
18dc0 65 20 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 69  e .    ** file i
18dd0 73 20 6e 6f 74 20 70 42 74 2d 3e 70 61 67 65 53  s not pBt->pageS
18de0 69 7a 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ize. In this cas
18df0 65 20 6c 6f 63 6b 42 74 72 65 65 28 29 20 77 69  e lockBtree() wi
18e00 6c 6c 20 75 70 64 61 74 65 0a 20 20 20 20 2a 2a  ll update.    **
18e10 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 74   pBt->pageSize t
18e20 6f 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20  o the page-size 
18e30 6f 66 20 74 68 65 20 66 69 6c 65 20 6f 6e 20 64  of the file on d
18e40 69 73 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  isk..    */.    
18e50 77 68 69 6c 65 28 20 70 42 74 2d 3e 70 50 61 67  while( pBt->pPag
18e60 65 31 3d 3d 30 20 26 26 20 53 51 4c 49 54 45 5f  e1==0 && SQLITE_
18e70 4f 4b 3d 3d 28 72 63 20 3d 20 6c 6f 63 6b 42 74  OK==(rc = lockBt
18e80 72 65 65 28 70 42 74 29 29 20 29 3b 0a 0a 20 20  ree(pBt)) );..  
18e90 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
18ea0 5f 4f 4b 20 26 26 20 77 72 66 6c 61 67 20 29 7b  _OK && wrflag ){
18eb0 0a 20 20 20 20 20 20 69 66 28 20 28 70 42 74 2d  .      if( (pBt-
18ec0 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f  >btsFlags & BTS_
18ed0 52 45 41 44 5f 4f 4e 4c 59 29 21 3d 30 20 29 7b  READ_ONLY)!=0 ){
18ee0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
18ef0 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20  LITE_READONLY;. 
18f00 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
18f10 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
18f20 50 61 67 65 72 42 65 67 69 6e 28 70 42 74 2d 3e  PagerBegin(pBt->
18f30 70 50 61 67 65 72 2c 77 72 66 6c 61 67 3e 31 2c  pPager,wrflag>1,
18f40 73 71 6c 69 74 65 33 54 65 6d 70 49 6e 4d 65 6d  sqlite3TempInMem
18f50 6f 72 79 28 70 2d 3e 64 62 29 29 3b 0a 20 20 20  ory(p->db));.   
18f60 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
18f70 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
18f80 20 20 20 20 72 63 20 3d 20 6e 65 77 44 61 74 61      rc = newData
18f90 62 61 73 65 28 70 42 74 29 3b 0a 20 20 20 20 20  base(pBt);.     
18fa0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
18fb0 20 7d 0a 20 20 0a 20 20 20 20 69 66 28 20 72 63   }.  .    if( rc
18fc0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
18fd0 20 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65       unlockBtree
18fe0 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20  IfUnused(pBt);. 
18ff0 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20 28     }.  }while( (
19000 72 63 26 30 78 46 46 29 3d 3d 53 51 4c 49 54 45  rc&0xFF)==SQLITE
19010 5f 42 55 53 59 20 26 26 20 70 42 74 2d 3e 69 6e  _BUSY && pBt->in
19020 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41  Transaction==TRA
19030 4e 53 5f 4e 4f 4e 45 20 26 26 0a 20 20 20 20 20  NS_NONE &&.     
19040 20 20 20 20 20 62 74 72 65 65 49 6e 76 6f 6b 65       btreeInvoke
19050 42 75 73 79 48 61 6e 64 6c 65 72 28 70 42 74 29  BusyHandler(pBt)
19060 20 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53   );..  if( rc==S
19070 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
19080 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d  if( p->inTrans==
19090 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20  TRANS_NONE ){.  
190a0 20 20 20 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61      pBt->nTransa
190b0 63 74 69 6f 6e 2b 2b 3b 0a 23 69 66 6e 64 65 66  ction++;.#ifndef
190c0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41   SQLITE_OMIT_SHA
190d0 52 45 44 5f 43 41 43 48 45 0a 20 20 20 20 20 20  RED_CACHE.      
190e0 69 66 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20  if( p->sharable 
190f0 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
19100 74 28 20 70 2d 3e 6c 6f 63 6b 2e 70 42 74 72 65  t( p->lock.pBtre
19110 65 3d 3d 70 20 26 26 20 70 2d 3e 6c 6f 63 6b 2e  e==p && p->lock.
19120 69 54 61 62 6c 65 3d 3d 31 20 29 3b 0a 20 20 20  iTable==1 );.   
19130 20 20 20 20 20 70 2d 3e 6c 6f 63 6b 2e 65 4c 6f       p->lock.eLo
19140 63 6b 20 3d 20 52 45 41 44 5f 4c 4f 43 4b 3b 0a  ck = READ_LOCK;.
19150 20 20 20 20 20 20 20 20 70 2d 3e 6c 6f 63 6b 2e          p->lock.
19160 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70 4c 6f  pNext = pBt->pLo
19170 63 6b 3b 0a 20 20 20 20 20 20 20 20 70 42 74 2d  ck;.        pBt-
19180 3e 70 4c 6f 63 6b 20 3d 20 26 70 2d 3e 6c 6f 63  >pLock = &p->loc
19190 6b 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  k;.      }.#endi
191a0 66 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 69  f.    }.    p->i
191b0 6e 54 72 61 6e 73 20 3d 20 28 77 72 66 6c 61 67  nTrans = (wrflag
191c0 3f 54 52 41 4e 53 5f 57 52 49 54 45 3a 54 52 41  ?TRANS_WRITE:TRA
191d0 4e 53 5f 52 45 41 44 29 3b 0a 20 20 20 20 69 66  NS_READ);.    if
191e0 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 70 42 74  ( p->inTrans>pBt
191f0 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20  ->inTransaction 
19200 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 69 6e  ){.      pBt->in
19210 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 70 2d  Transaction = p-
19220 3e 69 6e 54 72 61 6e 73 3b 0a 20 20 20 20 7d 0a  >inTrans;.    }.
19230 20 20 20 20 69 66 28 20 77 72 66 6c 61 67 20 29      if( wrflag )
19240 7b 0a 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20  {.      MemPage 
19250 2a 70 50 61 67 65 31 20 3d 20 70 42 74 2d 3e 70  *pPage1 = pBt->p
19260 50 61 67 65 31 3b 0a 23 69 66 6e 64 65 66 20 53  Page1;.#ifndef S
19270 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
19280 44 5f 43 41 43 48 45 0a 20 20 20 20 20 20 61 73  D_CACHE.      as
19290 73 65 72 74 28 20 21 70 42 74 2d 3e 70 57 72 69  sert( !pBt->pWri
192a0 74 65 72 20 29 3b 0a 20 20 20 20 20 20 70 42 74  ter );.      pBt
192b0 2d 3e 70 57 72 69 74 65 72 20 3d 20 70 3b 0a 20  ->pWriter = p;. 
192c0 20 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61       pBt->btsFla
192d0 67 73 20 26 3d 20 7e 42 54 53 5f 45 58 43 4c 55  gs &= ~BTS_EXCLU
192e0 53 49 56 45 3b 0a 20 20 20 20 20 20 69 66 28 20  SIVE;.      if( 
192f0 77 72 66 6c 61 67 3e 31 20 29 20 70 42 74 2d 3e  wrflag>1 ) pBt->
19300 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f  btsFlags |= BTS_
19310 45 58 43 4c 55 53 49 56 45 3b 0a 23 65 6e 64 69  EXCLUSIVE;.#endi
19320 66 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  f..      /* If t
19330 68 65 20 64 62 2d 73 69 7a 65 20 68 65 61 64 65  he db-size heade
19340 72 20 66 69 65 6c 64 20 69 73 20 69 6e 63 6f 72  r field is incor
19350 72 65 63 74 20 28 61 73 20 69 74 20 6d 61 79 20  rect (as it may 
19360 62 65 20 69 66 20 61 6e 20 6f 6c 64 0a 20 20 20  be if an old.   
19370 20 20 20 2a 2a 20 63 6c 69 65 6e 74 20 68 61 73     ** client has
19380 20 62 65 65 6e 20 77 72 69 74 69 6e 67 20 74 68   been writing th
19390 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 29  e database file)
193a0 2c 20 75 70 64 61 74 65 20 69 74 20 6e 6f 77 2e  , update it now.
193b0 20 44 6f 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20   Doing.      ** 
193c0 74 68 69 73 20 73 6f 6f 6e 65 72 20 72 61 74 68  this sooner rath
193d0 65 72 20 74 68 61 6e 20 6c 61 74 65 72 20 6d 65  er than later me
193e0 61 6e 73 20 74 68 65 20 64 61 74 61 62 61 73 65  ans the database
193f0 20 73 69 7a 65 20 63 61 6e 20 73 61 66 65 6c 79   size can safely
19400 20 0a 20 20 20 20 20 20 2a 2a 20 72 65 2d 72 65   .      ** re-re
19410 61 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ad the database 
19420 73 69 7a 65 20 66 72 6f 6d 20 70 61 67 65 20 31  size from page 1
19430 20 69 66 20 61 20 73 61 76 65 70 6f 69 6e 74 20   if a savepoint 
19440 6f 72 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20  or transaction. 
19450 20 20 20 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b       ** rollback
19460 20 6f 63 63 75 72 73 20 77 69 74 68 69 6e 20 74   occurs within t
19470 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  he transaction..
19480 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
19490 66 28 20 70 42 74 2d 3e 6e 50 61 67 65 21 3d 67  f( pBt->nPage!=g
194a0 65 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d  et4byte(&pPage1-
194b0 3e 61 44 61 74 61 5b 32 38 5d 29 20 29 7b 0a 20  >aData[28]) ){. 
194c0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
194d0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
194e0 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a  age1->pDbPage);.
194f0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
19500 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
19510 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
19520 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 32  &pPage1->aData[2
19530 38 5d 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 3b  8], pBt->nPage);
19540 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
19550 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a 74   }.    }.  }...t
19560 72 61 6e 73 5f 62 65 67 75 6e 3a 0a 20 20 69 66  rans_begun:.  if
19570 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
19580 26 26 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20  && wrflag ){.   
19590 20 2f 2a 20 54 68 69 73 20 63 61 6c 6c 20 6d 61   /* This call ma
195a0 6b 65 73 20 73 75 72 65 20 74 68 61 74 20 74 68  kes sure that th
195b0 65 20 70 61 67 65 72 20 68 61 73 20 74 68 65 20  e pager has the 
195c0 63 6f 72 72 65 63 74 20 6e 75 6d 62 65 72 20 6f  correct number o
195d0 66 0a 20 20 20 20 2a 2a 20 6f 70 65 6e 20 73 61  f.    ** open sa
195e0 76 65 70 6f 69 6e 74 73 2e 20 49 66 20 74 68 65  vepoints. If the
195f0 20 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65   second paramete
19600 72 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  r is greater tha
19610 6e 20 30 20 61 6e 64 0a 20 20 20 20 2a 2a 20 74  n 0 and.    ** t
19620 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69  he sub-journal i
19630 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f 70  s not already op
19640 65 6e 2c 20 74 68 65 6e 20 69 74 20 77 69 6c 6c  en, then it will
19650 20 62 65 20 6f 70 65 6e 65 64 20 68 65 72 65 2e   be opened here.
19660 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d  .    */.    rc =
19670 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65   sqlite3PagerOpe
19680 6e 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2d 3e  nSavepoint(pBt->
19690 70 50 61 67 65 72 2c 20 70 2d 3e 64 62 2d 3e 6e  pPager, p->db->n
196a0 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 7d 0a  Savepoint);.  }.
196b0 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74  .  btreeIntegrit
196c0 79 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  y(p);.  sqlite3B
196d0 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
196e0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69  return rc;.}..#i
196f0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
19700 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 0a 2f 2a  T_AUTOVACUUM../*
19710 0a 2a 2a 20 53 65 74 20 74 68 65 20 70 6f 69 6e  .** Set the poin
19720 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 20  ter-map entries 
19730 66 6f 72 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e  for all children
19740 20 6f 66 20 70 61 67 65 20 70 50 61 67 65 2e 20   of page pPage. 
19750 41 6c 73 6f 2c 20 69 66 0a 2a 2a 20 70 50 61 67  Also, if.** pPag
19760 65 20 63 6f 6e 74 61 69 6e 73 20 63 65 6c 6c 73  e contains cells
19770 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f   that point to o
19780 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2c 20 73  verflow pages, s
19790 65 74 20 74 68 65 20 70 6f 69 6e 74 65 72 0a 2a  et the pointer.*
197a0 2a 20 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f  * map entries fo
197b0 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70  r the overflow p
197c0 61 67 65 73 20 61 73 20 77 65 6c 6c 2e 0a 2a 2f  ages as well..*/
197d0 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 74 43  .static int setC
197e0 68 69 6c 64 50 74 72 6d 61 70 73 28 4d 65 6d 50  hildPtrmaps(MemP
197f0 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 69  age *pPage){.  i
19800 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
19810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19820 20 20 2f 2a 20 43 6f 75 6e 74 65 72 20 76 61 72    /* Counter var
19830 69 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  iable */.  int n
19840 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  Cell;           
19850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
19860 20 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73   Number of cells
19870 20 69 6e 20 70 61 67 65 20 70 50 61 67 65 20 2a   in page pPage *
19880 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
19890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
198a0 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
198b0 20 63 6f 64 65 20 2a 2f 0a 20 20 42 74 53 68 61   code */.  BtSha
198c0 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65  red *pBt = pPage
198d0 2d 3e 70 42 74 3b 0a 20 20 75 38 20 69 73 49 6e  ->pBt;.  u8 isIn
198e0 69 74 4f 72 69 67 20 3d 20 70 50 61 67 65 2d 3e  itOrig = pPage->
198f0 69 73 49 6e 69 74 3b 0a 20 20 50 67 6e 6f 20 70  isInit;.  Pgno p
19900 67 6e 6f 20 3d 20 70 50 61 67 65 2d 3e 70 67 6e  gno = pPage->pgn
19910 6f 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  o;..  assert( sq
19920 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
19930 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
19940 65 78 29 20 29 3b 0a 20 20 72 63 20 3d 20 62 74  ex) );.  rc = bt
19950 72 65 65 49 6e 69 74 50 61 67 65 28 70 50 61 67  reeInitPage(pPag
19960 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  e);.  if( rc!=SQ
19970 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67  LITE_OK ){.    g
19980 6f 74 6f 20 73 65 74 5f 63 68 69 6c 64 5f 70 74  oto set_child_pt
19990 72 6d 61 70 73 5f 6f 75 74 3b 0a 20 20 7d 0a 20  rmaps_out;.  }. 
199a0 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e   nCell = pPage->
199b0 6e 43 65 6c 6c 3b 0a 0a 20 20 66 6f 72 28 69 3d  nCell;..  for(i=
199c0 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29  0; i<nCell; i++)
199d0 7b 0a 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 20  {.    u8 *pCell 
199e0 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  = findCell(pPage
199f0 2c 20 69 29 3b 0a 0a 20 20 20 20 70 74 72 6d 61  , i);..    ptrma
19a00 70 50 75 74 4f 76 66 6c 50 74 72 28 70 50 61 67  pPutOvflPtr(pPag
19a10 65 2c 20 70 43 65 6c 6c 2c 20 26 72 63 29 3b 0a  e, pCell, &rc);.
19a20 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d  .    if( !pPage-
19a30 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 50  >leaf ){.      P
19a40 67 6e 6f 20 63 68 69 6c 64 50 67 6e 6f 20 3d 20  gno childPgno = 
19a50 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c 29 3b  get4byte(pCell);
19a60 0a 20 20 20 20 20 20 70 74 72 6d 61 70 50 75 74  .      ptrmapPut
19a70 28 70 42 74 2c 20 63 68 69 6c 64 50 67 6e 6f 2c  (pBt, childPgno,
19a80 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70   PTRMAP_BTREE, p
19a90 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 20 20 7d  gno, &rc);.    }
19aa0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 70 50 61  .  }..  if( !pPa
19ab0 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
19ac0 50 67 6e 6f 20 63 68 69 6c 64 50 67 6e 6f 20 3d  Pgno childPgno =
19ad0 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
19ae0 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68  ->aData[pPage->h
19af0 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20  drOffset+8]);.  
19b00 20 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c    ptrmapPut(pBt,
19b10 20 63 68 69 6c 64 50 67 6e 6f 2c 20 50 54 52 4d   childPgno, PTRM
19b20 41 50 5f 42 54 52 45 45 2c 20 70 67 6e 6f 2c 20  AP_BTREE, pgno, 
19b30 26 72 63 29 3b 0a 20 20 7d 0a 0a 73 65 74 5f 63  &rc);.  }..set_c
19b40 68 69 6c 64 5f 70 74 72 6d 61 70 73 5f 6f 75 74  hild_ptrmaps_out
19b50 3a 0a 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69  :.  pPage->isIni
19b60 74 20 3d 20 69 73 49 6e 69 74 4f 72 69 67 3b 0a  t = isInitOrig;.
19b70 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
19b80 2f 2a 0a 2a 2a 20 53 6f 6d 65 77 68 65 72 65 20  /*.** Somewhere 
19b90 6f 6e 20 70 50 61 67 65 20 69 73 20 61 20 70 6f  on pPage is a po
19ba0 69 6e 74 65 72 20 74 6f 20 70 61 67 65 20 69 46  inter to page iF
19bb0 72 6f 6d 2e 20 20 4d 6f 64 69 66 79 20 74 68 69  rom.  Modify thi
19bc0 73 20 70 6f 69 6e 74 65 72 20 73 6f 0a 2a 2a 20  s pointer so.** 
19bd0 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74  that it points t
19be0 6f 20 69 54 6f 2e 20 50 61 72 61 6d 65 74 65 72  o iTo. Parameter
19bf0 20 65 54 79 70 65 20 64 65 73 63 72 69 62 65 73   eType describes
19c00 20 74 68 65 20 74 79 70 65 20 6f 66 20 70 6f 69   the type of poi
19c10 6e 74 65 72 20 74 6f 0a 2a 2a 20 62 65 20 6d 6f  nter to.** be mo
19c20 64 69 66 69 65 64 2c 20 61 73 20 20 66 6f 6c 6c  dified, as  foll
19c30 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41  ows:.**.** PTRMA
19c40 50 5f 42 54 52 45 45 3a 20 20 20 20 20 70 50 61  P_BTREE:     pPa
19c50 67 65 20 69 73 20 61 20 62 74 72 65 65 2d 70 61  ge is a btree-pa
19c60 67 65 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20  ge. The pointer 
19c70 70 6f 69 6e 74 73 20 61 74 20 61 20 63 68 69 6c  points at a chil
19c80 64 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  d .**           
19c90 20 20 20 20 20 20 20 20 70 61 67 65 20 6f 66 20          page of 
19ca0 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50 54 52  pPage..**.** PTR
19cb0 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 3a 20 70  MAP_OVERFLOW1: p
19cc0 50 61 67 65 20 69 73 20 61 20 62 74 72 65 65 2d  Page is a btree-
19cd0 70 61 67 65 2e 20 54 68 65 20 70 6f 69 6e 74 65  page. The pointe
19ce0 72 20 70 6f 69 6e 74 73 20 61 74 20 61 6e 20 6f  r points at an o
19cf0 76 65 72 66 6c 6f 77 0a 2a 2a 20 20 20 20 20 20  verflow.**      
19d00 20 20 20 20 20 20 20 20 20 20 20 20 20 70 61 67               pag
19d10 65 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20  e pointed to by 
19d20 6f 6e 65 20 6f 66 20 74 68 65 20 63 65 6c 6c 73  one of the cells
19d30 20 6f 6e 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a   on pPage..**.**
19d40 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57   PTRMAP_OVERFLOW
19d50 32 3a 20 70 50 61 67 65 20 69 73 20 61 6e 20 6f  2: pPage is an o
19d60 76 65 72 66 6c 6f 77 2d 70 61 67 65 2e 20 54 68  verflow-page. Th
19d70 65 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73  e pointer points
19d80 20 61 74 20 74 68 65 20 6e 65 78 74 0a 2a 2a 20   at the next.** 
19d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19da0 20 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20    overflow page 
19db0 69 6e 20 74 68 65 20 6c 69 73 74 2e 0a 2a 2f 0a  in the list..*/.
19dc0 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 64 69 66  static int modif
19dd0 79 50 61 67 65 50 6f 69 6e 74 65 72 28 4d 65 6d  yPagePointer(Mem
19de0 50 61 67 65 20 2a 70 50 61 67 65 2c 20 50 67 6e  Page *pPage, Pgn
19df0 6f 20 69 46 72 6f 6d 2c 20 50 67 6e 6f 20 69 54  o iFrom, Pgno iT
19e00 6f 2c 20 75 38 20 65 54 79 70 65 29 7b 0a 20 20  o, u8 eType){.  
19e10 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
19e20 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
19e30 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
19e40 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
19e50 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
19e60 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
19e70 65 29 20 29 3b 0a 20 20 69 66 28 20 65 54 79 70  e) );.  if( eTyp
19e80 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  e==PTRMAP_OVERFL
19e90 4f 57 32 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  OW2 ){.    /* Th
19ea0 65 20 70 6f 69 6e 74 65 72 20 69 73 20 61 6c 77  e pointer is alw
19eb0 61 79 73 20 74 68 65 20 66 69 72 73 74 20 34 20  ays the first 4 
19ec0 62 79 74 65 73 20 6f 66 20 74 68 65 20 70 61 67  bytes of the pag
19ed0 65 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20  e in this case. 
19ee0 20 2a 2f 0a 20 20 20 20 69 66 28 20 67 65 74 34   */.    if( get4
19ef0 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74  byte(pPage->aDat
19f00 61 29 21 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20  a)!=iFrom ){.   
19f10 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
19f20 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
19f30 20 20 20 7d 0a 20 20 20 20 70 75 74 34 62 79 74     }.    put4byt
19f40 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20  e(pPage->aData, 
19f50 69 54 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  iTo);.  }else{. 
19f60 20 20 20 75 38 20 69 73 49 6e 69 74 4f 72 69 67     u8 isInitOrig
19f70 20 3d 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74   = pPage->isInit
19f80 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  ;.    int i;.   
19f90 20 69 6e 74 20 6e 43 65 6c 6c 3b 0a 0a 20 20 20   int nCell;..   
19fa0 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 70   btreeInitPage(p
19fb0 50 61 67 65 29 3b 0a 20 20 20 20 6e 43 65 6c 6c  Page);.    nCell
19fc0 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b   = pPage->nCell;
19fd0 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ..    for(i=0; i
19fe0 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20  <nCell; i++){.  
19ff0 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20      u8 *pCell = 
1a000 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20  findCell(pPage, 
1a010 69 29 3b 0a 20 20 20 20 20 20 69 66 28 20 65 54  i);.      if( eT
1a020 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52  ype==PTRMAP_OVER
1a030 46 4c 4f 57 31 20 29 7b 0a 20 20 20 20 20 20 20  FLOW1 ){.       
1a040 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a   CellInfo info;.
1a050 20 20 20 20 20 20 20 20 62 74 72 65 65 50 61 72          btreePar
1a060 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c  seCellPtr(pPage,
1a070 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a   pCell, &info);.
1a080 20 20 20 20 20 20 20 20 69 66 28 20 69 6e 66 6f          if( info
1a090 2e 69 4f 76 65 72 66 6c 6f 77 0a 20 20 20 20 20  .iOverflow.     
1a0a0 20 20 20 20 26 26 20 70 43 65 6c 6c 2b 69 6e 66      && pCell+inf
1a0b0 6f 2e 69 4f 76 65 72 66 6c 6f 77 2b 33 3c 3d 70  o.iOverflow+3<=p
1a0c0 50 61 67 65 2d 3e 61 44 61 74 61 2b 70 50 61 67  Page->aData+pPag
1a0d0 65 2d 3e 6d 61 73 6b 50 61 67 65 0a 20 20 20 20  e->maskPage.    
1a0e0 20 20 20 20 20 26 26 20 69 46 72 6f 6d 3d 3d 67       && iFrom==g
1a0f0 65 74 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69  et4byte(&pCell[i
1a100 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 0a  nfo.iOverflow]).
1a110 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
1a120 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
1a130 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66  Cell[info.iOverf
1a140 6c 6f 77 5d 2c 20 69 54 6f 29 3b 0a 20 20 20 20  low], iTo);.    
1a150 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1a160 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
1a170 73 65 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  se{.        if( 
1a180 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c 29 3d  get4byte(pCell)=
1a190 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20  =iFrom ){.      
1a1a0 20 20 20 20 70 75 74 34 62 79 74 65 28 70 43 65      put4byte(pCe
1a1b0 6c 6c 2c 20 69 54 6f 29 3b 0a 20 20 20 20 20 20  ll, iTo);.      
1a1c0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
1a1d0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
1a1e0 20 7d 0a 20 20 0a 20 20 20 20 69 66 28 20 69 3d   }.  .    if( i=
1a1f0 3d 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20  =nCell ){.      
1a200 69 66 28 20 65 54 79 70 65 21 3d 50 54 52 4d 41  if( eType!=PTRMA
1a210 50 5f 42 54 52 45 45 20 7c 7c 20 0a 20 20 20 20  P_BTREE || .    
1a220 20 20 20 20 20 20 67 65 74 34 62 79 74 65 28 26        get4byte(&
1a230 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61  pPage->aData[pPa
1a240 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  ge->hdrOffset+8]
1a250 29 21 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20  )!=iFrom ){.    
1a260 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1a270 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
1a280 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 75        }.      pu
1a290 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61  t4byte(&pPage->a
1a2a0 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f  Data[pPage->hdrO
1a2b0 66 66 73 65 74 2b 38 5d 2c 20 69 54 6f 29 3b 0a  ffset+8], iTo);.
1a2c0 20 20 20 20 7d 0a 0a 20 20 20 20 70 50 61 67 65      }..    pPage
1a2d0 2d 3e 69 73 49 6e 69 74 20 3d 20 69 73 49 6e 69  ->isInit = isIni
1a2e0 74 4f 72 69 67 3b 0a 20 20 7d 0a 20 20 72 65 74  tOrig;.  }.  ret
1a2f0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
1a300 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68  .../*.** Move th
1a310 65 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20  e open database 
1a320 70 61 67 65 20 70 44 62 50 61 67 65 20 74 6f 20  page pDbPage to 
1a330 6c 6f 63 61 74 69 6f 6e 20 69 46 72 65 65 50 61  location iFreePa
1a340 67 65 20 69 6e 20 74 68 65 20 0a 2a 2a 20 64 61  ge in the .** da
1a350 74 61 62 61 73 65 2e 20 54 68 65 20 70 44 62 50  tabase. The pDbP
1a360 61 67 65 20 72 65 66 65 72 65 6e 63 65 20 72 65  age reference re
1a370 6d 61 69 6e 73 20 76 61 6c 69 64 2e 0a 2a 2a 0a  mains valid..**.
1a380 2a 2a 20 54 68 65 20 69 73 43 6f 6d 6d 69 74 20  ** The isCommit 
1a390 66 6c 61 67 20 69 6e 64 69 63 61 74 65 73 20 74  flag indicates t
1a3a0 68 61 74 20 74 68 65 72 65 20 69 73 20 6e 6f 20  hat there is no 
1a3b0 6e 65 65 64 20 74 6f 20 72 65 6d 65 6d 62 65 72  need to remember
1a3c0 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 6a 6f 75   that.** the jou
1a3d0 72 6e 61 6c 20 6e 65 65 64 73 20 74 6f 20 62 65  rnal needs to be
1a3e0 20 73 79 6e 63 28 29 65 64 20 62 65 66 6f 72 65   sync()ed before
1a3f0 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20 70   database page p
1a400 44 62 50 61 67 65 2d 3e 70 67 6e 6f 20 0a 2a 2a  DbPage->pgno .**
1a410 20 63 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20   can be written 
1a420 74 6f 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 68  to. The caller h
1a430 61 73 20 61 6c 72 65 61 64 79 20 70 72 6f 6d 69  as already promi
1a440 73 65 64 20 6e 6f 74 20 74 6f 20 77 72 69 74 65  sed not to write
1a450 20 74 6f 20 74 68 61 74 0a 2a 2a 20 70 61 67 65   to that.** page
1a460 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1a470 72 65 6c 6f 63 61 74 65 50 61 67 65 28 0a 20 20  relocatePage(.  
1a480 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20  BtShared *pBt,  
1a490 20 20 20 20 20 20 20 20 20 2f 2a 20 42 74 72 65           /* Btre
1a4a0 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  e */.  MemPage *
1a4b0 70 44 62 50 61 67 65 2c 20 20 20 20 20 20 20 20  pDbPage,        
1a4c0 2f 2a 20 4f 70 65 6e 20 70 61 67 65 20 74 6f 20  /* Open page to 
1a4d0 6d 6f 76 65 20 2a 2f 0a 20 20 75 38 20 65 54 79  move */.  u8 eTy
1a4e0 70 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  pe,             
1a4f0 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61     /* Pointer ma
1a500 70 20 27 74 79 70 65 27 20 65 6e 74 72 79 20 66  p 'type' entry f
1a510 6f 72 20 70 44 62 50 61 67 65 20 2a 2f 0a 20 20  or pDbPage */.  
1a520 50 67 6e 6f 20 69 50 74 72 50 61 67 65 2c 20 20  Pgno iPtrPage,  
1a530 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
1a540 74 65 72 20 6d 61 70 20 27 70 61 67 65 2d 6e 6f  ter map 'page-no
1a550 27 20 65 6e 74 72 79 20 66 6f 72 20 70 44 62 50  ' entry for pDbP
1a560 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 46  age */.  Pgno iF
1a570 72 65 65 50 61 67 65 2c 20 20 20 20 20 20 20 20  reePage,        
1a580 20 20 2f 2a 20 54 68 65 20 6c 6f 63 61 74 69 6f    /* The locatio
1a590 6e 20 74 6f 20 6d 6f 76 65 20 70 44 62 50 61 67  n to move pDbPag
1a5a0 65 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 69 73  e to */.  int is
1a5b0 43 6f 6d 6d 69 74 20 20 20 20 20 20 20 20 20 20  Commit          
1a5c0 20 20 20 2f 2a 20 69 73 43 6f 6d 6d 69 74 20 66     /* isCommit f
1a5d0 6c 61 67 20 70 61 73 73 65 64 20 74 6f 20 73 71  lag passed to sq
1a5e0 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65 70 61  lite3PagerMovepa
1a5f0 67 65 20 2a 2f 0a 29 7b 0a 20 20 4d 65 6d 50 61  ge */.){.  MemPa
1a600 67 65 20 2a 70 50 74 72 50 61 67 65 3b 20 20 20  ge *pPtrPage;   
1a610 2f 2a 20 54 68 65 20 70 61 67 65 20 74 68 61 74  /* The page that
1a620 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e   contains a poin
1a630 74 65 72 20 74 6f 20 70 44 62 50 61 67 65 20 2a  ter to pDbPage *
1a640 2f 0a 20 20 50 67 6e 6f 20 69 44 62 50 61 67 65  /.  Pgno iDbPage
1a650 20 3d 20 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f   = pDbPage->pgno
1a660 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  ;.  Pager *pPage
1a670 72 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 72 3b  r = pBt->pPager;
1a680 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73  .  int rc;..  as
1a690 73 65 72 74 28 20 65 54 79 70 65 3d 3d 50 54 52  sert( eType==PTR
1a6a0 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20 7c 7c  MAP_OVERFLOW2 ||
1a6b0 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f   eType==PTRMAP_O
1a6c0 56 45 52 46 4c 4f 57 31 20 7c 7c 20 0a 20 20 20  VERFLOW1 || .   
1a6d0 20 20 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50     eType==PTRMAP
1a6e0 5f 42 54 52 45 45 20 7c 7c 20 65 54 79 70 65 3d  _BTREE || eType=
1a6f0 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45  =PTRMAP_ROOTPAGE
1a700 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
1a710 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
1a720 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
1a730 20 20 61 73 73 65 72 74 28 20 70 44 62 50 61 67    assert( pDbPag
1a740 65 2d 3e 70 42 74 3d 3d 70 42 74 20 29 3b 0a 0a  e->pBt==pBt );..
1a750 20 20 2f 2a 20 4d 6f 76 65 20 70 61 67 65 20 69    /* Move page i
1a760 44 62 50 61 67 65 20 66 72 6f 6d 20 69 74 73 20  DbPage from its 
1a770 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e  current location
1a780 20 74 6f 20 70 61 67 65 20 6e 75 6d 62 65 72 20   to page number 
1a790 69 46 72 65 65 50 61 67 65 20 2a 2f 0a 20 20 54  iFreePage */.  T
1a7a0 52 41 43 45 28 28 22 41 55 54 4f 56 41 43 55 55  RACE(("AUTOVACUU
1a7b0 4d 3a 20 4d 6f 76 69 6e 67 20 25 64 20 74 6f 20  M: Moving %d to 
1a7c0 66 72 65 65 20 70 61 67 65 20 25 64 20 28 70 74  free page %d (pt
1a7d0 72 20 70 61 67 65 20 25 64 20 74 79 70 65 20 25  r page %d type %
1a7e0 64 29 5c 6e 22 2c 20 0a 20 20 20 20 20 20 69 44  d)\n", .      iD
1a7f0 62 50 61 67 65 2c 20 69 46 72 65 65 50 61 67 65  bPage, iFreePage
1a800 2c 20 69 50 74 72 50 61 67 65 2c 20 65 54 79 70  , iPtrPage, eTyp
1a810 65 29 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  e));.  rc = sqli
1a820 74 65 33 50 61 67 65 72 4d 6f 76 65 70 61 67 65  te3PagerMovepage
1a830 28 70 50 61 67 65 72 2c 20 70 44 62 50 61 67 65  (pPager, pDbPage
1a840 2d 3e 70 44 62 50 61 67 65 2c 20 69 46 72 65 65  ->pDbPage, iFree
1a850 50 61 67 65 2c 20 69 73 43 6f 6d 6d 69 74 29 3b  Page, isCommit);
1a860 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
1a870 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75  E_OK ){.    retu
1a880 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 44 62  rn rc;.  }.  pDb
1a890 50 61 67 65 2d 3e 70 67 6e 6f 20 3d 20 69 46 72  Page->pgno = iFr
1a8a0 65 65 50 61 67 65 3b 0a 0a 20 20 2f 2a 20 49 66  eePage;..  /* If
1a8b0 20 70 44 62 50 61 67 65 20 77 61 73 20 61 20 62   pDbPage was a b
1a8c0 74 72 65 65 2d 70 61 67 65 2c 20 74 68 65 6e 20  tree-page, then 
1a8d0 69 74 20 6d 61 79 20 68 61 76 65 20 63 68 69 6c  it may have chil
1a8e0 64 20 70 61 67 65 73 20 61 6e 64 2f 6f 72 20 63  d pages and/or c
1a8f0 65 6c 6c 73 0a 20 20 2a 2a 20 74 68 61 74 20 70  ells.  ** that p
1a900 6f 69 6e 74 20 74 6f 20 6f 76 65 72 66 6c 6f 77  oint to overflow
1a910 20 70 61 67 65 73 2e 20 54 68 65 20 70 6f 69 6e   pages. The poin
1a920 74 65 72 20 6d 61 70 20 65 6e 74 72 69 65 73 20  ter map entries 
1a930 66 6f 72 20 61 6c 6c 20 74 68 65 73 65 0a 20 20  for all these.  
1a940 2a 2a 20 70 61 67 65 73 20 6e 65 65 64 20 74 6f  ** pages need to
1a950 20 62 65 20 63 68 61 6e 67 65 64 2e 0a 20 20 2a   be changed..  *
1a960 2a 0a 20 20 2a 2a 20 49 66 20 70 44 62 50 61 67  *.  ** If pDbPag
1a970 65 20 69 73 20 61 6e 20 6f 76 65 72 66 6c 6f 77  e is an overflow
1a980 20 70 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20   page, then the 
1a990 66 69 72 73 74 20 34 20 62 79 74 65 73 20 6d 61  first 4 bytes ma
1a9a0 79 20 73 74 6f 72 65 20 61 0a 20 20 2a 2a 20 70  y store a.  ** p
1a9b0 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 75 62 73  ointer to a subs
1a9c0 65 71 75 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20  equent overflow 
1a9d0 70 61 67 65 2e 20 49 66 20 74 68 69 73 20 69 73  page. If this is
1a9e0 20 74 68 65 20 63 61 73 65 2c 20 74 68 65 6e 0a   the case, then.
1a9f0 20 20 2a 2a 20 74 68 65 20 70 6f 69 6e 74 65 72    ** the pointer
1aa00 20 6d 61 70 20 6e 65 65 64 73 20 74 6f 20 62 65   map needs to be
1aa10 20 75 70 64 61 74 65 64 20 66 6f 72 20 74 68 65   updated for the
1aa20 20 73 75 62 73 65 71 75 65 6e 74 20 6f 76 65 72   subsequent over
1aa30 66 6c 6f 77 20 70 61 67 65 2e 0a 20 20 2a 2f 0a  flow page..  */.
1aa40 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52    if( eType==PTR
1aa50 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20 65 54 79  MAP_BTREE || eTy
1aa60 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50  pe==PTRMAP_ROOTP
1aa70 41 47 45 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  AGE ){.    rc = 
1aa80 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70 73 28  setChildPtrmaps(
1aa90 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66  pDbPage);.    if
1aaa0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1aab0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
1aac0 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  rc;.    }.  }els
1aad0 65 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 65 78 74  e{.    Pgno next
1aae0 4f 76 66 6c 20 3d 20 67 65 74 34 62 79 74 65 28  Ovfl = get4byte(
1aaf0 70 44 62 50 61 67 65 2d 3e 61 44 61 74 61 29 3b  pDbPage->aData);
1ab00 0a 20 20 20 20 69 66 28 20 6e 65 78 74 4f 76 66  .    if( nextOvf
1ab10 6c 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 74  l!=0 ){.      pt
1ab20 72 6d 61 70 50 75 74 28 70 42 74 2c 20 6e 65 78  rmapPut(pBt, nex
1ab30 74 4f 76 66 6c 2c 20 50 54 52 4d 41 50 5f 4f 56  tOvfl, PTRMAP_OV
1ab40 45 52 46 4c 4f 57 32 2c 20 69 46 72 65 65 50 61  ERFLOW2, iFreePa
1ab50 67 65 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20  ge, &rc);.      
1ab60 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1ab70 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  K ){.        ret
1ab80 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
1ab90 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
1aba0 46 69 78 20 74 68 65 20 64 61 74 61 62 61 73 65  Fix the database
1abb0 20 70 6f 69 6e 74 65 72 20 6f 6e 20 70 61 67 65   pointer on page
1abc0 20 69 50 74 72 50 61 67 65 20 74 68 61 74 20 70   iPtrPage that p
1abd0 6f 69 6e 74 65 64 20 61 74 20 69 44 62 50 61 67  ointed at iDbPag
1abe0 65 20 73 6f 0a 20 20 2a 2a 20 74 68 61 74 20 69  e so.  ** that i
1abf0 74 20 70 6f 69 6e 74 73 20 61 74 20 69 46 72 65  t points at iFre
1ac00 65 50 61 67 65 2e 20 41 6c 73 6f 20 66 69 78 20  ePage. Also fix 
1ac10 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  the pointer map 
1ac20 65 6e 74 72 79 20 66 6f 72 0a 20 20 2a 2a 20 69  entry for.  ** i
1ac30 50 74 72 50 61 67 65 2e 0a 20 20 2a 2f 0a 20 20  PtrPage..  */.  
1ac40 69 66 28 20 65 54 79 70 65 21 3d 50 54 52 4d 41  if( eType!=PTRMA
1ac50 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20  P_ROOTPAGE ){.  
1ac60 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50    rc = btreeGetP
1ac70 61 67 65 28 70 42 74 2c 20 69 50 74 72 50 61 67  age(pBt, iPtrPag
1ac80 65 2c 20 26 70 50 74 72 50 61 67 65 2c 20 30 29  e, &pPtrPage, 0)
1ac90 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
1aca0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1acb0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1acc0 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  }.    rc = sqlit
1acd0 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 74  e3PagerWrite(pPt
1ace0 72 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b  rPage->pDbPage);
1acf0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
1ad00 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1ad10 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 74 72  releasePage(pPtr
1ad20 50 61 67 65 29 3b 0a 20 20 20 20 20 20 72 65 74  Page);.      ret
1ad30 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
1ad40 20 20 72 63 20 3d 20 6d 6f 64 69 66 79 50 61 67    rc = modifyPag
1ad50 65 50 6f 69 6e 74 65 72 28 70 50 74 72 50 61 67  ePointer(pPtrPag
1ad60 65 2c 20 69 44 62 50 61 67 65 2c 20 69 46 72 65  e, iDbPage, iFre
1ad70 65 50 61 67 65 2c 20 65 54 79 70 65 29 3b 0a 20  ePage, eType);. 
1ad80 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
1ad90 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20 69 66  PtrPage);.    if
1ada0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1adb0 29 7b 0a 20 20 20 20 20 20 70 74 72 6d 61 70 50  ){.      ptrmapP
1adc0 75 74 28 70 42 74 2c 20 69 46 72 65 65 50 61 67  ut(pBt, iFreePag
1add0 65 2c 20 65 54 79 70 65 2c 20 69 50 74 72 50 61  e, eType, iPtrPa
1ade0 67 65 2c 20 26 72 63 29 3b 0a 20 20 20 20 7d 0a  ge, &rc);.    }.
1adf0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
1ae00 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 64  .}../* Forward d
1ae10 65 63 6c 61 72 61 74 69 6f 6e 20 72 65 71 75 69  eclaration requi
1ae20 72 65 64 20 62 79 20 69 6e 63 72 56 61 63 75 75  red by incrVacuu
1ae30 6d 53 74 65 70 28 29 2e 20 2a 2f 0a 73 74 61 74  mStep(). */.stat
1ae40 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 42  ic int allocateB
1ae50 74 72 65 65 50 61 67 65 28 42 74 53 68 61 72 65  treePage(BtShare
1ae60 64 20 2a 2c 20 4d 65 6d 50 61 67 65 20 2a 2a 2c  d *, MemPage **,
1ae70 20 50 67 6e 6f 20 2a 2c 20 50 67 6e 6f 2c 20 75   Pgno *, Pgno, u
1ae80 38 29 3b 0a 0a 2f 2a 0a 2a 2a 20 50 65 72 66 6f  8);../*.** Perfo
1ae90 72 6d 20 61 20 73 69 6e 67 6c 65 20 73 74 65 70  rm a single step
1aea0 20 6f 66 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74   of an increment
1aeb0 61 6c 2d 76 61 63 75 75 6d 2e 20 49 66 20 73 75  al-vacuum. If su
1aec0 63 63 65 73 73 66 75 6c 2c 20 72 65 74 75 72 6e  ccessful, return
1aed0 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49  .** SQLITE_OK. I
1aee0 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 77 6f  f there is no wo
1aef0 72 6b 20 74 6f 20 64 6f 20 28 61 6e 64 20 74 68  rk to do (and th
1af00 65 72 65 66 6f 72 65 20 6e 6f 20 70 6f 69 6e 74  erefore no point
1af10 20 69 6e 20 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20   in .** calling 
1af20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 67  this function ag
1af30 61 69 6e 29 2c 20 72 65 74 75 72 6e 20 53 51 4c  ain), return SQL
1af40 49 54 45 5f 44 4f 4e 45 2e 20 4f 72 2c 20 69 66  ITE_DONE. Or, if
1af50 20 61 6e 20 65 72 72 6f 72 20 0a 2a 2a 20 6f 63   an error .** oc
1af60 63 75 72 73 2c 20 72 65 74 75 72 6e 20 73 6f 6d  curs, return som
1af70 65 20 6f 74 68 65 72 20 65 72 72 6f 72 20 63 6f  e other error co
1af80 64 65 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 72 65 20 73  de..**.** More s
1af90 70 65 63 69 66 69 63 61 6c 6c 79 2c 20 74 68 69  pecifically, thi
1afa0 73 20 66 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d  s function attem
1afb0 70 74 73 20 74 6f 20 72 65 2d 6f 72 67 61 6e 69  pts to re-organi
1afc0 7a 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ze the database 
1afd0 73 6f 20 0a 2a 2a 20 74 68 61 74 20 74 68 65 20  so .** that the 
1afe0 6c 61 73 74 20 70 61 67 65 20 6f 66 20 74 68 65  last page of the
1aff0 20 66 69 6c 65 20 63 75 72 72 65 6e 74 6c 79 20   file currently 
1b000 69 6e 20 75 73 65 20 69 73 20 6e 6f 20 6c 6f 6e  in use is no lon
1b010 67 65 72 20 69 6e 20 75 73 65 2e 0a 2a 2a 0a 2a  ger in use..**.*
1b020 2a 20 50 61 72 61 6d 65 74 65 72 20 6e 46 69 6e  * Parameter nFin
1b030 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
1b040 66 20 70 61 67 65 73 20 74 68 61 74 20 74 68 69  f pages that thi
1b050 73 20 64 61 74 61 62 61 73 65 20 77 6f 75 6c 64  s database would
1b060 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 77 65 72 65   contain.** were
1b070 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63   this function c
1b080 61 6c 6c 65 64 20 75 6e 74 69 6c 20 69 74 20 72  alled until it r
1b090 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 44 4f  eturns SQLITE_DO
1b0a0 4e 45 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  NE..**.** If the
1b0b0 20 62 43 6f 6d 6d 69 74 20 70 61 72 61 6d 65 74   bCommit paramet
1b0c0 65 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  er is non-zero, 
1b0d0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 73  this function as
1b0e0 73 75 6d 65 73 20 74 68 61 74 20 74 68 65 20 0a  sumes that the .
1b0f0 2a 2a 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 6b  ** caller will k
1b100 65 65 70 20 63 61 6c 6c 69 6e 67 20 69 6e 63 72  eep calling incr
1b110 56 61 63 75 75 6d 53 74 65 70 28 29 20 75 6e 74  VacuumStep() unt
1b120 69 6c 20 69 74 20 72 65 74 75 72 6e 73 20 53 51  il it returns SQ
1b130 4c 49 54 45 5f 44 4f 4e 45 20 0a 2a 2a 20 6f 72  LITE_DONE .** or
1b140 20 61 6e 20 65 72 72 6f 72 2e 20 62 43 6f 6d 6d   an error. bComm
1b150 69 74 20 69 73 20 70 61 73 73 65 64 20 74 72 75  it is passed tru
1b160 65 20 66 6f 72 20 61 6e 20 61 75 74 6f 2d 76 61  e for an auto-va
1b170 63 75 75 6d 2d 6f 6e 2d 63 6f 6d 6d 69 74 20 0a  cuum-on-commit .
1b180 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 2c 20 6f 72  ** operation, or
1b190 20 66 61 6c 73 65 20 66 6f 72 20 61 6e 20 69 6e   false for an in
1b1a0 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d  cremental vacuum
1b1b0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1b1c0 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28 42  incrVacuumStep(B
1b1d0 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67  tShared *pBt, Pg
1b1e0 6e 6f 20 6e 46 69 6e 2c 20 50 67 6e 6f 20 69 4c  no nFin, Pgno iL
1b1f0 61 73 74 50 67 2c 20 69 6e 74 20 62 43 6f 6d 6d  astPg, int bComm
1b200 69 74 29 7b 0a 20 20 50 67 6e 6f 20 6e 46 72 65  it){.  Pgno nFre
1b210 65 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20 20  eList;          
1b220 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
1b230 67 65 73 20 73 74 69 6c 6c 20 6f 6e 20 74 68 65  ges still on the
1b240 20 66 72 65 65 2d 6c 69 73 74 20 2a 2f 0a 20 20   free-list */.  
1b250 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72  int rc;..  asser
1b260 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
1b270 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
1b280 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  ) );.  assert( i
1b290 4c 61 73 74 50 67 3e 6e 46 69 6e 20 29 3b 0a 0a  LastPg>nFin );..
1b2a0 20 20 69 66 28 20 21 50 54 52 4d 41 50 5f 49 53    if( !PTRMAP_IS
1b2b0 50 41 47 45 28 70 42 74 2c 20 69 4c 61 73 74 50  PAGE(pBt, iLastP
1b2c0 67 29 20 26 26 20 69 4c 61 73 74 50 67 21 3d 50  g) && iLastPg!=P
1b2d0 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
1b2e0 28 70 42 74 29 20 29 7b 0a 20 20 20 20 75 38 20  (pBt) ){.    u8 
1b2f0 65 54 79 70 65 3b 0a 20 20 20 20 50 67 6e 6f 20  eType;.    Pgno 
1b300 69 50 74 72 50 61 67 65 3b 0a 0a 20 20 20 20 6e  iPtrPage;..    n
1b310 46 72 65 65 4c 69 73 74 20 3d 20 67 65 74 34 62  FreeList = get4b
1b320 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31  yte(&pBt->pPage1
1b330 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20  ->aData[36]);.  
1b340 20 20 69 66 28 20 6e 46 72 65 65 4c 69 73 74 3d    if( nFreeList=
1b350 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  =0 ){.      retu
1b360 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a  rn SQLITE_DONE;.
1b370 20 20 20 20 7d 0a 0a 20 20 20 20 72 63 20 3d 20      }..    rc = 
1b380 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20 69  ptrmapGet(pBt, i
1b390 4c 61 73 74 50 67 2c 20 26 65 54 79 70 65 2c 20  LastPg, &eType, 
1b3a0 26 69 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20  &iPtrPage);.    
1b3b0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1b3c0 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  K ){.      retur
1b3d0 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
1b3e0 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41  if( eType==PTRMA
1b3f0 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20  P_ROOTPAGE ){.  
1b400 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1b410 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
1b420 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 65      }..    if( e
1b430 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45  Type==PTRMAP_FRE
1b440 45 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20 69  EPAGE ){.      i
1b450 66 28 20 62 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b  f( bCommit==0 ){
1b460 0a 20 20 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f  .        /* Remo
1b470 76 65 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d  ve the page from
1b480 20 74 68 65 20 66 69 6c 65 73 20 66 72 65 65 2d   the files free-
1b490 6c 69 73 74 2e 20 54 68 69 73 20 69 73 20 6e 6f  list. This is no
1b4a0 74 20 72 65 71 75 69 72 65 64 0a 20 20 20 20 20  t required.     
1b4b0 20 20 20 2a 2a 20 69 66 20 62 43 6f 6d 6d 69 74     ** if bCommit
1b4c0 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2e 20 49 6e   is non-zero. In
1b4d0 20 74 68 61 74 20 63 61 73 65 2c 20 74 68 65 20   that case, the 
1b4e0 66 72 65 65 2d 6c 69 73 74 20 77 69 6c 6c 20 62  free-list will b
1b4f0 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 72 75  e.        ** tru
1b500 6e 63 61 74 65 64 20 74 6f 20 7a 65 72 6f 20 61  ncated to zero a
1b510 66 74 65 72 20 74 68 69 73 20 66 75 6e 63 74 69  fter this functi
1b520 6f 6e 20 72 65 74 75 72 6e 73 2c 20 73 6f 20 69  on returns, so i
1b530 74 20 64 6f 65 73 6e 27 74 20 0a 20 20 20 20 20  t doesn't .     
1b540 20 20 20 2a 2a 20 6d 61 74 74 65 72 20 69 66 20     ** matter if 
1b550 69 74 20 73 74 69 6c 6c 20 63 6f 6e 74 61 69 6e  it still contain
1b560 73 20 73 6f 6d 65 20 67 61 72 62 61 67 65 20 65  s some garbage e
1b570 6e 74 72 69 65 73 2e 0a 20 20 20 20 20 20 20 20  ntries..        
1b580 2a 2f 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20  */.        Pgno 
1b590 69 46 72 65 65 50 67 3b 0a 20 20 20 20 20 20 20  iFreePg;.       
1b5a0 20 4d 65 6d 50 61 67 65 20 2a 70 46 72 65 65 50   MemPage *pFreeP
1b5b0 67 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  g;.        rc = 
1b5c0 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67  allocateBtreePag
1b5d0 65 28 70 42 74 2c 20 26 70 46 72 65 65 50 67 2c  e(pBt, &pFreePg,
1b5e0 20 26 69 46 72 65 65 50 67 2c 20 69 4c 61 73 74   &iFreePg, iLast
1b5f0 50 67 2c 20 42 54 41 4c 4c 4f 43 5f 45 58 41 43  Pg, BTALLOC_EXAC
1b600 54 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  T);.        if( 
1b610 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1b620 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
1b630 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a  n rc;.        }.
1b640 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
1b650 69 46 72 65 65 50 67 3d 3d 69 4c 61 73 74 50 67  iFreePg==iLastPg
1b660 20 29 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65   );.        rele
1b670 61 73 65 50 61 67 65 28 70 46 72 65 65 50 67 29  asePage(pFreePg)
1b680 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20  ;.      }.    } 
1b690 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 50 67 6e  else {.      Pgn
1b6a0 6f 20 69 46 72 65 65 50 67 3b 20 20 20 20 20 20  o iFreePg;      
1b6b0 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
1b6c0 6f 66 20 66 72 65 65 20 70 61 67 65 20 74 6f 20  of free page to 
1b6d0 6d 6f 76 65 20 70 4c 61 73 74 50 67 20 74 6f 20  move pLastPg to 
1b6e0 2a 2f 0a 20 20 20 20 20 20 4d 65 6d 50 61 67 65  */.      MemPage
1b6f0 20 2a 70 4c 61 73 74 50 67 3b 0a 20 20 20 20 20   *pLastPg;.     
1b700 20 75 38 20 65 4d 6f 64 65 20 3d 20 42 54 41 4c   u8 eMode = BTAL
1b710 4c 4f 43 5f 41 4e 59 3b 20 20 20 2f 2a 20 4d 6f  LOC_ANY;   /* Mo
1b720 64 65 20 70 61 72 61 6d 65 74 65 72 20 66 6f 72  de parameter for
1b730 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61   allocateBtreePa
1b740 67 65 28 29 20 2a 2f 0a 20 20 20 20 20 20 50 67  ge() */.      Pg
1b750 6e 6f 20 69 4e 65 61 72 20 3d 20 30 3b 20 20 20  no iNear = 0;   
1b760 20 20 20 20 20 20 20 20 2f 2a 20 6e 65 61 72 62          /* nearb
1b770 79 20 70 61 72 61 6d 65 74 65 72 20 66 6f 72 20  y parameter for 
1b780 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67  allocateBtreePag
1b790 65 28 29 20 2a 2f 0a 0a 20 20 20 20 20 20 72 63  e() */..      rc
1b7a0 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28   = btreeGetPage(
1b7b0 70 42 74 2c 20 69 4c 61 73 74 50 67 2c 20 26 70  pBt, iLastPg, &p
1b7c0 4c 61 73 74 50 67 2c 20 30 29 3b 0a 20 20 20 20  LastPg, 0);.    
1b7d0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1b7e0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
1b7f0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
1b800 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 62  }..      /* If b
1b810 43 6f 6d 6d 69 74 20 69 73 20 7a 65 72 6f 2c 20  Commit is zero, 
1b820 74 68 69 73 20 6c 6f 6f 70 20 72 75 6e 73 20 65  this loop runs e
1b830 78 61 63 74 6c 79 20 6f 6e 63 65 20 61 6e 64 20  xactly once and 
1b840 70 61 67 65 20 70 4c 61 73 74 50 67 0a 20 20 20  page pLastPg.   
1b850 20 20 20 2a 2a 20 69 73 20 73 77 61 70 70 65 64     ** is swapped
1b860 20 77 69 74 68 20 74 68 65 20 66 69 72 73 74 20   with the first 
1b870 66 72 65 65 20 70 61 67 65 20 70 75 6c 6c 65 64  free page pulled
1b880 20 6f 66 66 20 74 68 65 20 66 72 65 65 20 6c 69   off the free li
1b890 73 74 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  st..      **.   
1b8a0 20 20 20 2a 2a 20 4f 6e 20 74 68 65 20 6f 74 68     ** On the oth
1b8b0 65 72 20 68 61 6e 64 2c 20 69 66 20 62 43 6f 6d  er hand, if bCom
1b8c0 6d 69 74 20 69 73 20 67 72 65 61 74 65 72 20 74  mit is greater t
1b8d0 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 6b  han zero, then k
1b8e0 65 65 70 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 6f  eep.      ** loo
1b8f0 70 69 6e 67 20 75 6e 74 69 6c 20 61 20 66 72 65  ping until a fre
1b900 65 2d 70 61 67 65 20 6c 6f 63 61 74 65 64 20 77  e-page located w
1b910 69 74 68 69 6e 20 74 68 65 20 66 69 72 73 74 20  ithin the first 
1b920 6e 46 69 6e 20 70 61 67 65 73 0a 20 20 20 20 20  nFin pages.     
1b930 20 2a 2a 20 6f 66 20 74 68 65 20 66 69 6c 65 20   ** of the file 
1b940 69 73 20 66 6f 75 6e 64 2e 0a 20 20 20 20 20 20  is found..      
1b950 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 62 43 6f  */.      if( bCo
1b960 6d 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  mmit==0 ){.     
1b970 20 20 20 65 4d 6f 64 65 20 3d 20 42 54 41 4c 4c     eMode = BTALL
1b980 4f 43 5f 4c 45 3b 0a 20 20 20 20 20 20 20 20 69  OC_LE;.        i
1b990 4e 65 61 72 20 3d 20 6e 46 69 6e 3b 0a 20 20 20  Near = nFin;.   
1b9a0 20 20 20 7d 0a 20 20 20 20 20 20 64 6f 20 7b 0a     }.      do {.
1b9b0 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20          MemPage 
1b9c0 2a 70 46 72 65 65 50 67 3b 0a 20 20 20 20 20 20  *pFreePg;.      
1b9d0 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42    rc = allocateB
1b9e0 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70  treePage(pBt, &p
1b9f0 46 72 65 65 50 67 2c 20 26 69 46 72 65 65 50 67  FreePg, &iFreePg
1ba00 2c 20 69 4e 65 61 72 2c 20 65 4d 6f 64 65 29 3b  , iNear, eMode);
1ba10 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
1ba20 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1ba30 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
1ba40 61 67 65 28 70 4c 61 73 74 50 67 29 3b 0a 20 20  age(pLastPg);.  
1ba50 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
1ba60 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  c;.        }.   
1ba70 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
1ba80 28 70 46 72 65 65 50 67 29 3b 0a 20 20 20 20 20  (pFreePg);.     
1ba90 20 7d 77 68 69 6c 65 28 20 62 43 6f 6d 6d 69 74   }while( bCommit
1baa0 20 26 26 20 69 46 72 65 65 50 67 3e 6e 46 69 6e   && iFreePg>nFin
1bab0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
1bac0 28 20 69 46 72 65 65 50 67 3c 69 4c 61 73 74 50  ( iFreePg<iLastP
1bad0 67 20 29 3b 0a 20 20 20 20 20 20 0a 20 20 20 20  g );.      .    
1bae0 20 20 72 63 20 3d 20 72 65 6c 6f 63 61 74 65 50    rc = relocateP
1baf0 61 67 65 28 70 42 74 2c 20 70 4c 61 73 74 50 67  age(pBt, pLastPg
1bb00 2c 20 65 54 79 70 65 2c 20 69 50 74 72 50 61 67  , eType, iPtrPag
1bb10 65 2c 20 69 46 72 65 65 50 67 2c 20 62 43 6f 6d  e, iFreePg, bCom
1bb20 6d 69 74 29 3b 0a 20 20 20 20 20 20 72 65 6c 65  mit);.      rele
1bb30 61 73 65 50 61 67 65 28 70 4c 61 73 74 50 67 29  asePage(pLastPg)
1bb40 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
1bb50 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1bb60 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
1bb70 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1bb80 7d 0a 0a 20 20 69 66 28 20 62 43 6f 6d 6d 69 74  }..  if( bCommit
1bb90 3d 3d 30 20 29 7b 0a 20 20 20 20 64 6f 20 7b 0a  ==0 ){.    do {.
1bba0 20 20 20 20 20 20 69 4c 61 73 74 50 67 2d 2d 3b        iLastPg--;
1bbb0 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 69 4c 61  .    }while( iLa
1bbc0 73 74 50 67 3d 3d 50 45 4e 44 49 4e 47 5f 42 59  stPg==PENDING_BY
1bbd0 54 45 5f 50 41 47 45 28 70 42 74 29 20 7c 7c 20  TE_PAGE(pBt) || 
1bbe0 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42  PTRMAP_ISPAGE(pB
1bbf0 74 2c 20 69 4c 61 73 74 50 67 29 20 29 3b 0a 20  t, iLastPg) );. 
1bc00 20 20 20 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63     pBt->bDoTrunc
1bc10 61 74 65 20 3d 20 31 3b 0a 20 20 20 20 70 42 74  ate = 1;.    pBt
1bc20 2d 3e 6e 50 61 67 65 20 3d 20 69 4c 61 73 74 50  ->nPage = iLastP
1bc30 67 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  g;.  }.  return 
1bc40 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
1bc50 0a 2a 2a 20 54 68 65 20 64 61 74 61 62 61 73 65  .** The database
1bc60 20 6f 70 65 6e 65 64 20 62 79 20 74 68 65 20 66   opened by the f
1bc70 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73  irst argument is
1bc80 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   an auto-vacuum 
1bc90 64 61 74 61 62 61 73 65 0a 2a 2a 20 6e 4f 72 69  database.** nOri
1bca0 67 20 70 61 67 65 73 20 69 6e 20 73 69 7a 65 20  g pages in size 
1bcb0 63 6f 6e 74 61 69 6e 69 6e 67 20 6e 46 72 65 65  containing nFree
1bcc0 20 66 72 65 65 20 70 61 67 65 73 2e 20 52 65 74   free pages. Ret
1bcd0 75 72 6e 20 74 68 65 20 65 78 70 65 63 74 65 64  urn the expected
1bce0 20 0a 2a 2a 20 73 69 7a 65 20 6f 66 20 74 68 65   .** size of the
1bcf0 20 64 61 74 61 62 61 73 65 20 69 6e 20 70 61 67   database in pag
1bd00 65 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 6e 20  es following an 
1bd10 61 75 74 6f 2d 76 61 63 75 75 6d 20 6f 70 65 72  auto-vacuum oper
1bd20 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ation..*/.static
1bd30 20 50 67 6e 6f 20 66 69 6e 61 6c 44 62 53 69 7a   Pgno finalDbSiz
1bd40 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c  e(BtShared *pBt,
1bd50 20 50 67 6e 6f 20 6e 4f 72 69 67 2c 20 50 67 6e   Pgno nOrig, Pgn
1bd60 6f 20 6e 46 72 65 65 29 7b 0a 20 20 69 6e 74 20  o nFree){.  int 
1bd70 6e 45 6e 74 72 79 3b 20 20 20 20 20 20 20 20 20  nEntry;         
1bd80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1bd90 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73  umber of entries
1bda0 20 6f 6e 20 6f 6e 65 20 70 74 72 6d 61 70 20 70   on one ptrmap p
1bdb0 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 50  age */.  Pgno nP
1bdc0 74 72 6d 61 70 3b 20 20 20 20 20 20 20 20 20 20  trmap;          
1bdd0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1bde0 65 72 20 6f 66 20 50 74 72 4d 61 70 20 70 61 67  er of PtrMap pag
1bdf0 65 73 20 74 6f 20 62 65 20 66 72 65 65 64 20 2a  es to be freed *
1be00 2f 0a 20 20 50 67 6e 6f 20 6e 46 69 6e 3b 20 20  /.  Pgno nFin;  
1be10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1be20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 76 61      /* Return va
1be30 6c 75 65 20 2a 2f 0a 0a 20 20 6e 45 6e 74 72 79  lue */..  nEntry
1be40 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69   = pBt->usableSi
1be50 7a 65 2f 35 3b 0a 20 20 6e 50 74 72 6d 61 70 20  ze/5;.  nPtrmap 
1be60 3d 20 28 6e 46 72 65 65 2d 6e 4f 72 69 67 2b 50  = (nFree-nOrig+P
1be70 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74  TRMAP_PAGENO(pBt
1be80 2c 20 6e 4f 72 69 67 29 2b 6e 45 6e 74 72 79 29  , nOrig)+nEntry)
1be90 2f 6e 45 6e 74 72 79 3b 0a 20 20 6e 46 69 6e 20  /nEntry;.  nFin 
1bea0 3d 20 6e 4f 72 69 67 20 2d 20 6e 46 72 65 65 20  = nOrig - nFree 
1beb0 2d 20 6e 50 74 72 6d 61 70 3b 0a 20 20 69 66 28  - nPtrmap;.  if(
1bec0 20 6e 4f 72 69 67 3e 50 45 4e 44 49 4e 47 5f 42   nOrig>PENDING_B
1bed0 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 26 26  YTE_PAGE(pBt) &&
1bee0 20 6e 46 69 6e 3c 50 45 4e 44 49 4e 47 5f 42 59   nFin<PENDING_BY
1bef0 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a  TE_PAGE(pBt) ){.
1bf00 20 20 20 20 6e 46 69 6e 2d 2d 3b 0a 20 20 7d 0a      nFin--;.  }.
1bf10 20 20 77 68 69 6c 65 28 20 50 54 52 4d 41 50 5f    while( PTRMAP_
1bf20 49 53 50 41 47 45 28 70 42 74 2c 20 6e 46 69 6e  ISPAGE(pBt, nFin
1bf30 29 20 7c 7c 20 6e 46 69 6e 3d 3d 50 45 4e 44 49  ) || nFin==PENDI
1bf40 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
1bf50 29 20 29 7b 0a 20 20 20 20 6e 46 69 6e 2d 2d 3b  ) ){.    nFin--;
1bf60 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 6e  .  }..  return n
1bf70 46 69 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20  Fin;.}../*.** A 
1bf80 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
1bf90 6e 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 65 64  n must be opened
1bfa0 20 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20   before calling 
1bfb0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  this function..*
1bfc0 2a 20 49 74 20 70 65 72 66 6f 72 6d 73 20 61 20  * It performs a 
1bfd0 73 69 6e 67 6c 65 20 75 6e 69 74 20 6f 66 20 77  single unit of w
1bfe0 6f 72 6b 20 74 6f 77 61 72 64 73 20 61 6e 20 69  ork towards an i
1bff0 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75  ncremental vacuu
1c000 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  m..**.** If the 
1c010 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75  incremental vacu
1c020 75 6d 20 69 73 20 66 69 6e 69 73 68 65 64 20 61  um is finished a
1c030 66 74 65 72 20 74 68 69 73 20 66 75 6e 63 74 69  fter this functi
1c040 6f 6e 20 68 61 73 20 72 75 6e 2c 0a 2a 2a 20 53  on has run,.** S
1c050 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73 20 72 65  QLITE_DONE is re
1c060 74 75 72 6e 65 64 2e 20 49 66 20 69 74 20 69 73  turned. If it is
1c070 20 6e 6f 74 20 66 69 6e 69 73 68 65 64 2c 20 62   not finished, b
1c080 75 74 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75  ut no error occu
1c090 72 72 65 64 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f  rred,.** SQLITE_
1c0a0 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  OK is returned. 
1c0b0 4f 74 68 65 72 77 69 73 65 20 61 6e 20 53 51 4c  Otherwise an SQL
1c0c0 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20  ite error code. 
1c0d0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
1c0e0 74 72 65 65 49 6e 63 72 56 61 63 75 75 6d 28 42  treeIncrVacuum(B
1c0f0 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  tree *p){.  int 
1c100 72 63 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  rc;.  BtShared *
1c110 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20  pBt = p->pBt;.. 
1c120 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
1c130 65 72 28 70 29 3b 0a 20 20 61 73 73 65 72 74 28  er(p);.  assert(
1c140 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
1c150 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ion==TRANS_WRITE
1c160 20 26 26 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d   && p->inTrans==
1c170 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20  TRANS_WRITE );. 
1c180 20 69 66 28 20 21 70 42 74 2d 3e 61 75 74 6f 56   if( !pBt->autoV
1c190 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 72 63 20  acuum ){.    rc 
1c1a0 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  = SQLITE_DONE;. 
1c1b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 50 67 6e 6f   }else{.    Pgno
1c1c0 20 6e 4f 72 69 67 20 3d 20 62 74 72 65 65 50 61   nOrig = btreePa
1c1d0 67 65 63 6f 75 6e 74 28 70 42 74 29 3b 0a 20 20  gecount(pBt);.  
1c1e0 20 20 50 67 6e 6f 20 6e 46 72 65 65 20 3d 20 67    Pgno nFree = g
1c1f0 65 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50  et4byte(&pBt->pP
1c200 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29  age1->aData[36])
1c210 3b 0a 20 20 20 20 50 67 6e 6f 20 6e 46 69 6e 20  ;.    Pgno nFin 
1c220 3d 20 66 69 6e 61 6c 44 62 53 69 7a 65 28 70 42  = finalDbSize(pB
1c230 74 2c 20 6e 4f 72 69 67 2c 20 6e 46 72 65 65 29  t, nOrig, nFree)
1c240 3b 0a 0a 20 20 20 20 69 66 28 20 6e 4f 72 69 67  ;..    if( nOrig
1c250 3c 6e 46 69 6e 20 29 7b 0a 20 20 20 20 20 20 72  <nFin ){.      r
1c260 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
1c270 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 65 6c  PT_BKPT;.    }el
1c280 73 65 20 69 66 28 20 6e 46 72 65 65 3e 30 20 29  se if( nFree>0 )
1c290 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 61 76  {.      rc = sav
1c2a0 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 2c  eAllCursors(pBt,
1c2b0 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66   0, 0);.      if
1c2c0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1c2d0 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 76 61 6c  ){.        inval
1c2e0 69 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77  idateAllOverflow
1c2f0 43 61 63 68 65 28 70 42 74 29 3b 0a 20 20 20 20  Cache(pBt);.    
1c300 20 20 20 20 72 63 20 3d 20 69 6e 63 72 56 61 63      rc = incrVac
1c310 75 75 6d 53 74 65 70 28 70 42 74 2c 20 6e 46 69  uumStep(pBt, nFi
1c320 6e 2c 20 6e 4f 72 69 67 2c 20 30 29 3b 0a 20 20  n, nOrig, 0);.  
1c330 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
1c340 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1c350 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
1c360 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
1c370 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62  pBt->pPage1->pDb
1c380 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 70  Page);.        p
1c390 75 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50  ut4byte(&pBt->pP
1c3a0 61 67 65 31 2d 3e 61 44 61 74 61 5b 32 38 5d 2c  age1->aData[28],
1c3b0 20 70 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20   pBt->nPage);.  
1c3c0 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
1c3d0 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
1c3e0 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20  TE_DONE;.    }. 
1c3f0 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65   }.  sqlite3Btre
1c400 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
1c410 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1c420 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
1c430 20 63 61 6c 6c 65 64 20 70 72 69 6f 72 20 74 6f   called prior to
1c440 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d   sqlite3PagerCom
1c450 6d 69 74 20 77 68 65 6e 20 61 20 74 72 61 6e 73  mit when a trans
1c460 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 63 6f 6d  action.** is com
1c470 6d 69 74 74 65 64 20 66 6f 72 20 61 6e 20 61 75  mitted for an au
1c480 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61  to-vacuum databa
1c490 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c  se..**.** If SQL
1c4a0 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
1c4b0 65 64 2c 20 74 68 65 6e 20 2a 70 6e 54 72 75 6e  ed, then *pnTrun
1c4c0 63 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  c is set to the 
1c4d0 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 0a  number of pages.
1c4e0 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
1c4f0 66 69 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 74  file should be t
1c500 72 75 6e 63 61 74 65 64 20 74 6f 20 64 75 72 69  runcated to duri
1c510 6e 67 20 74 68 65 20 63 6f 6d 6d 69 74 20 70 72  ng the commit pr
1c520 6f 63 65 73 73 2e 20 0a 2a 2a 20 69 2e 65 2e 20  ocess. .** i.e. 
1c530 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61 73  the database has
1c540 20 62 65 65 6e 20 72 65 6f 72 67 61 6e 69 7a 65   been reorganize
1c550 64 20 73 6f 20 74 68 61 74 20 6f 6e 6c 79 20 74  d so that only t
1c560 68 65 20 66 69 72 73 74 20 2a 70 6e 54 72 75 6e  he first *pnTrun
1c570 63 0a 2a 2a 20 70 61 67 65 73 20 61 72 65 20 69  c.** pages are i
1c580 6e 20 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  n use..*/.static
1c590 20 69 6e 74 20 61 75 74 6f 56 61 63 75 75 6d 43   int autoVacuumC
1c5a0 6f 6d 6d 69 74 28 42 74 53 68 61 72 65 64 20 2a  ommit(BtShared *
1c5b0 70 42 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  pBt){.  int rc =
1c5c0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 61   SQLITE_OK;.  Pa
1c5d0 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 42  ger *pPager = pB
1c5e0 74 2d 3e 70 50 61 67 65 72 3b 0a 20 20 56 56 41  t->pPager;.  VVA
1c5f0 5f 4f 4e 4c 59 28 20 69 6e 74 20 6e 52 65 66 20  _ONLY( int nRef 
1c600 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65  = sqlite3PagerRe
1c610 66 63 6f 75 6e 74 28 70 50 61 67 65 72 29 20 29  fcount(pPager) )
1c620 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
1c630 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
1c640 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
1c650 20 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76   invalidateAllOv
1c660 65 72 66 6c 6f 77 43 61 63 68 65 28 70 42 74 29  erflowCache(pBt)
1c670 3b 0a 20 20 61 73 73 65 72 74 28 70 42 74 2d 3e  ;.  assert(pBt->
1c680 61 75 74 6f 56 61 63 75 75 6d 29 3b 0a 20 20 69  autoVacuum);.  i
1c690 66 28 20 21 70 42 74 2d 3e 69 6e 63 72 56 61 63  f( !pBt->incrVac
1c6a0 75 75 6d 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20  uum ){.    Pgno 
1c6b0 6e 46 69 6e 3b 20 20 20 20 20 20 20 20 20 2f 2a  nFin;         /*
1c6c0 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
1c6d0 20 69 6e 20 64 61 74 61 62 61 73 65 20 61 66 74   in database aft
1c6e0 65 72 20 61 75 74 6f 76 61 63 75 75 6d 69 6e 67  er autovacuuming
1c6f0 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 46 72   */.    Pgno nFr
1c700 65 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  ee;        /* Nu
1c710 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 6f 6e  mber of pages on
1c720 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 69 6e   the freelist in
1c730 69 74 69 61 6c 6c 79 20 2a 2f 0a 20 20 20 20 50  itially */.    P
1c740 67 6e 6f 20 69 46 72 65 65 3b 20 20 20 20 20 20  gno iFree;      
1c750 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 70 61    /* The next pa
1c760 67 65 20 74 6f 20 62 65 20 66 72 65 65 64 20 2a  ge to be freed *
1c770 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 4f 72 69 67  /.    Pgno nOrig
1c780 3b 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61  ;        /* Data
1c790 62 61 73 65 20 73 69 7a 65 20 62 65 66 6f 72 65  base size before
1c7a0 20 66 72 65 65 69 6e 67 20 2a 2f 0a 0a 20 20 20   freeing */..   
1c7b0 20 6e 4f 72 69 67 20 3d 20 62 74 72 65 65 50 61   nOrig = btreePa
1c7c0 67 65 63 6f 75 6e 74 28 70 42 74 29 3b 0a 20 20  gecount(pBt);.  
1c7d0 20 20 69 66 28 20 50 54 52 4d 41 50 5f 49 53 50    if( PTRMAP_ISP
1c7e0 41 47 45 28 70 42 74 2c 20 6e 4f 72 69 67 29 20  AGE(pBt, nOrig) 
1c7f0 7c 7c 20 6e 4f 72 69 67 3d 3d 50 45 4e 44 49 4e  || nOrig==PENDIN
1c800 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
1c810 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 74 20   ){.      /* It 
1c820 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20  is not possible 
1c830 74 6f 20 63 72 65 61 74 65 20 61 20 64 61 74 61  to create a data
1c840 62 61 73 65 20 66 6f 72 20 77 68 69 63 68 20 74  base for which t
1c850 68 65 20 66 69 6e 61 6c 20 70 61 67 65 0a 20 20  he final page.  
1c860 20 20 20 20 2a 2a 20 69 73 20 65 69 74 68 65 72      ** is either
1c870 20 61 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70   a pointer-map p
1c880 61 67 65 20 6f 72 20 74 68 65 20 70 65 6e 64 69  age or the pendi
1c890 6e 67 2d 62 79 74 65 20 70 61 67 65 2e 20 49 66  ng-byte page. If
1c8a0 20 6f 6e 65 0a 20 20 20 20 20 20 2a 2a 20 69 73   one.      ** is
1c8b0 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 74 68   encountered, th
1c8c0 69 73 20 69 6e 64 69 63 61 74 65 73 20 63 6f 72  is indicates cor
1c8d0 72 75 70 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a  ruption..      *
1c8e0 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  /.      return S
1c8f0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
1c900 50 54 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6e  PT;.    }..    n
1c910 46 72 65 65 20 3d 20 67 65 74 34 62 79 74 65 28  Free = get4byte(
1c920 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44  &pBt->pPage1->aD
1c930 61 74 61 5b 33 36 5d 29 3b 0a 20 20 20 20 6e 46  ata[36]);.    nF
1c940 69 6e 20 3d 20 66 69 6e 61 6c 44 62 53 69 7a 65  in = finalDbSize
1c950 28 70 42 74 2c 20 6e 4f 72 69 67 2c 20 6e 46 72  (pBt, nOrig, nFr
1c960 65 65 29 3b 0a 20 20 20 20 69 66 28 20 6e 46 69  ee);.    if( nFi
1c970 6e 3e 6e 4f 72 69 67 20 29 20 72 65 74 75 72 6e  n>nOrig ) return
1c980 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
1c990 42 4b 50 54 3b 0a 20 20 20 20 69 66 28 20 6e 46  BKPT;.    if( nF
1c9a0 69 6e 3c 6e 4f 72 69 67 20 29 7b 0a 20 20 20 20  in<nOrig ){.    
1c9b0 20 20 72 63 20 3d 20 73 61 76 65 41 6c 6c 43 75    rc = saveAllCu
1c9c0 72 73 6f 72 73 28 70 42 74 2c 20 30 2c 20 30 29  rsors(pBt, 0, 0)
1c9d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
1c9e0 69 46 72 65 65 3d 6e 4f 72 69 67 3b 20 69 46 72  iFree=nOrig; iFr
1c9f0 65 65 3e 6e 46 69 6e 20 26 26 20 72 63 3d 3d 53  ee>nFin && rc==S
1ca00 51 4c 49 54 45 5f 4f 4b 3b 20 69 46 72 65 65 2d  QLITE_OK; iFree-
1ca10 2d 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 69  -){.      rc = i
1ca20 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28 70 42  ncrVacuumStep(pB
1ca30 74 2c 20 6e 46 69 6e 2c 20 69 46 72 65 65 2c 20  t, nFin, iFree, 
1ca40 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  1);.    }.    if
1ca50 28 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f  ( (rc==SQLITE_DO
1ca60 4e 45 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45  NE || rc==SQLITE
1ca70 5f 4f 4b 29 20 26 26 20 6e 46 72 65 65 3e 30 20  _OK) && nFree>0 
1ca80 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
1ca90 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
1caa0 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62  pBt->pPage1->pDb
1cab0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 70 75 74  Page);.      put
1cac0 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67  4byte(&pBt->pPag
1cad0 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 30  e1->aData[32], 0
1cae0 29 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74  );.      put4byt
1caf0 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  e(&pBt->pPage1->
1cb00 61 44 61 74 61 5b 33 36 5d 2c 20 30 29 3b 0a 20  aData[36], 0);. 
1cb10 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
1cb20 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74  Bt->pPage1->aDat
1cb30 61 5b 32 38 5d 2c 20 6e 46 69 6e 29 3b 0a 20 20  a[28], nFin);.  
1cb40 20 20 20 20 70 42 74 2d 3e 62 44 6f 54 72 75 6e      pBt->bDoTrun
1cb50 63 61 74 65 20 3d 20 31 3b 0a 20 20 20 20 20 20  cate = 1;.      
1cb60 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 6e 46 69  pBt->nPage = nFi
1cb70 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  n;.    }.    if(
1cb80 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1cb90 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  {.      sqlite3P
1cba0 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70 50 61  agerRollback(pPa
1cbb0 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ger);.    }.  }.
1cbc0 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65 66 3e  .  assert( nRef>
1cbd0 3d 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66  =sqlite3PagerRef
1cbe0 63 6f 75 6e 74 28 70 50 61 67 65 72 29 20 29 3b  count(pPager) );
1cbf0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1cc00 0a 23 65 6c 73 65 20 2f 2a 20 69 66 6e 64 65 66  .#else /* ifndef
1cc10 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
1cc20 4f 56 41 43 55 55 4d 20 2a 2f 0a 23 20 64 65 66  OVACUUM */.# def
1cc30 69 6e 65 20 73 65 74 43 68 69 6c 64 50 74 72 6d  ine setChildPtrm
1cc40 61 70 73 28 78 29 20 53 51 4c 49 54 45 5f 4f 4b  aps(x) SQLITE_OK
1cc50 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
1cc60 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73  his routine does
1cc70 20 74 68 65 20 66 69 72 73 74 20 70 68 61 73 65   the first phase
1cc80 20 6f 66 20 61 20 74 77 6f 2d 70 68 61 73 65 20   of a two-phase 
1cc90 63 6f 6d 6d 69 74 2e 20 20 54 68 69 73 20 72 6f  commit.  This ro
1cca0 75 74 69 6e 65 0a 2a 2a 20 63 61 75 73 65 73 20  utine.** causes 
1ccb0 61 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  a rollback journ
1ccc0 61 6c 20 74 6f 20 62 65 20 63 72 65 61 74 65 64  al to be created
1ccd0 20 28 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74   (if it does not
1cce0 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 29 0a   already exist).
1ccf0 2a 2a 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 64  ** and populated
1cd00 20 77 69 74 68 20 65 6e 6f 75 67 68 20 69 6e 66   with enough inf
1cd10 6f 72 6d 61 74 69 6f 6e 20 73 6f 20 74 68 61 74  ormation so that
1cd20 20 69 66 20 61 20 70 6f 77 65 72 20 6c 6f 73 73   if a power loss
1cd30 20 6f 63 63 75 72 73 0a 2a 2a 20 74 68 65 20 64   occurs.** the d
1cd40 61 74 61 62 61 73 65 20 63 61 6e 20 62 65 20 72  atabase can be r
1cd50 65 73 74 6f 72 65 64 20 74 6f 20 69 74 73 20 6f  estored to its o
1cd60 72 69 67 69 6e 61 6c 20 73 74 61 74 65 20 62 79  riginal state by
1cd70 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 0a 2a 2a   playing back.**
1cd80 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 54   the journal.  T
1cd90 68 65 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  hen the contents
1cda0 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
1cdb0 61 72 65 20 66 6c 75 73 68 65 64 20 6f 75 74 20  are flushed out 
1cdc0 74 6f 0a 2a 2a 20 74 68 65 20 64 69 73 6b 2e 20  to.** the disk. 
1cdd0 20 41 66 74 65 72 20 74 68 65 20 6a 6f 75 72 6e   After the journ
1cde0 61 6c 20 69 73 20 73 61 66 65 6c 79 20 6f 6e 20  al is safely on 
1cdf0 6f 78 69 64 65 2c 20 74 68 65 20 63 68 61 6e 67  oxide, the chang
1ce00 65 73 20 74 6f 20 74 68 65 0a 2a 2a 20 64 61 74  es to the.** dat
1ce10 61 62 61 73 65 20 61 72 65 20 77 72 69 74 74 65  abase are writte
1ce20 6e 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62  n into the datab
1ce30 61 73 65 20 66 69 6c 65 20 61 6e 64 20 66 6c 75  ase file and flu
1ce40 73 68 65 64 20 74 6f 20 6f 78 69 64 65 2e 0a 2a  shed to oxide..*
1ce50 2a 20 41 74 20 74 68 65 20 65 6e 64 20 6f 66 20  * At the end of 
1ce60 74 68 69 73 20 63 61 6c 6c 2c 20 74 68 65 20 72  this call, the r
1ce70 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20  ollback journal 
1ce80 73 74 69 6c 6c 20 65 78 69 73 74 73 20 6f 6e 20  still exists on 
1ce90 74 68 65 0a 2a 2a 20 64 69 73 6b 20 61 6e 64 20  the.** disk and 
1cea0 77 65 20 61 72 65 20 73 74 69 6c 6c 20 68 6f 6c  we are still hol
1ceb0 64 69 6e 67 20 61 6c 6c 20 6c 6f 63 6b 73 2c 20  ding all locks, 
1cec0 73 6f 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  so the transacti
1ced0 6f 6e 20 68 61 73 20 6e 6f 74 0a 2a 2a 20 63 6f  on has not.** co
1cee0 6d 6d 69 74 74 65 64 2e 20 20 53 65 65 20 73 71  mmitted.  See sq
1cef0 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
1cf00 50 68 61 73 65 54 77 6f 28 29 20 66 6f 72 20 74  PhaseTwo() for t
1cf10 68 65 20 73 65 63 6f 6e 64 20 70 68 61 73 65 20  he second phase 
1cf20 6f 66 20 74 68 65 0a 2a 2a 20 63 6f 6d 6d 69 74  of the.** commit
1cf30 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20   process..**.** 
1cf40 54 68 69 73 20 63 61 6c 6c 20 69 73 20 61 20 6e  This call is a n
1cf50 6f 2d 6f 70 20 69 66 20 6e 6f 20 77 72 69 74 65  o-op if no write
1cf60 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20  -transaction is 
1cf70 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65  currently active
1cf80 20 6f 6e 20 70 42 74 2e 0a 2a 2a 0a 2a 2a 20 4f   on pBt..**.** O
1cf90 74 68 65 72 77 69 73 65 2c 20 73 79 6e 63 20 74  therwise, sync t
1cfa0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1cfb0 20 66 6f 72 20 74 68 65 20 62 74 72 65 65 20 70   for the btree p
1cfc0 42 74 2e 20 7a 4d 61 73 74 65 72 20 70 6f 69 6e  Bt. zMaster poin
1cfd0 74 73 20 74 6f 0a 2a 2a 20 74 68 65 20 6e 61 6d  ts to.** the nam
1cfe0 65 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f  e of a master jo
1cff0 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 61 74 20  urnal file that 
1d000 73 68 6f 75 6c 64 20 62 65 20 77 72 69 74 74 65  should be writte
1d010 6e 20 69 6e 74 6f 20 74 68 65 0a 2a 2a 20 69 6e  n into the.** in
1d020 64 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c  dividual journal
1d030 20 66 69 6c 65 2c 20 6f 72 20 69 73 20 4e 55 4c   file, or is NUL
1d040 4c 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 6e 6f  L, indicating no
1d050 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
1d060 66 69 6c 65 20 0a 2a 2a 20 28 73 69 6e 67 6c 65  file .** (single
1d070 20 64 61 74 61 62 61 73 65 20 74 72 61 6e 73 61   database transa
1d080 63 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20 57 68  ction)..**.** Wh
1d090 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65  en this is calle
1d0a0 64 2c 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  d, the master jo
1d0b0 75 72 6e 61 6c 20 73 68 6f 75 6c 64 20 61 6c 72  urnal should alr
1d0c0 65 61 64 79 20 68 61 76 65 20 62 65 65 6e 0a 2a  eady have been.*
1d0d0 2a 20 63 72 65 61 74 65 64 2c 20 70 6f 70 75 6c  * created, popul
1d0e0 61 74 65 64 20 77 69 74 68 20 74 68 69 73 20 6a  ated with this j
1d0f0 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20 61  ournal pointer a
1d100 6e 64 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73  nd synced to dis
1d110 6b 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 74 68  k..**.** Once th
1d120 69 73 20 69 73 20 72 6f 75 74 69 6e 65 20 68 61  is is routine ha
1d130 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65 20  s returned, the 
1d140 6f 6e 6c 79 20 74 68 69 6e 67 20 72 65 71 75 69  only thing requi
1d150 72 65 64 20 74 6f 20 63 6f 6d 6d 69 74 0a 2a 2a  red to commit.**
1d160 20 74 68 65 20 77 72 69 74 65 2d 74 72 61 6e 73   the write-trans
1d170 61 63 74 69 6f 6e 20 66 6f 72 20 74 68 69 73 20  action for this 
1d180 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
1d190 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6a   to delete the j
1d1a0 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 69 6e 74 20 73  ournal..*/.int s
1d1b0 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
1d1c0 74 50 68 61 73 65 4f 6e 65 28 42 74 72 65 65 20  tPhaseOne(Btree 
1d1d0 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  *p, const char *
1d1e0 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20  zMaster){.  int 
1d1f0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1d200 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73    if( p->inTrans
1d210 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b  ==TRANS_WRITE ){
1d220 0a 20 20 20 20 42 74 53 68 61 72 65 64 20 2a 70  .    BtShared *p
1d230 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 20  Bt = p->pBt;.   
1d240 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
1d250 65 72 28 70 29 3b 0a 23 69 66 6e 64 65 66 20 53  er(p);.#ifndef S
1d260 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
1d270 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70 42  ACUUM.    if( pB
1d280 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b  t->autoVacuum ){
1d290 0a 20 20 20 20 20 20 72 63 20 3d 20 61 75 74 6f  .      rc = auto
1d2a0 56 61 63 75 75 6d 43 6f 6d 6d 69 74 28 70 42 74  VacuumCommit(pBt
1d2b0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
1d2c0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1d2d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
1d2e0 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20  eeLeave(p);.    
1d2f0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1d300 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
1d310 20 69 66 28 20 70 42 74 2d 3e 62 44 6f 54 72 75   if( pBt->bDoTru
1d320 6e 63 61 74 65 20 29 7b 0a 20 20 20 20 20 20 73  ncate ){.      s
1d330 71 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e 63  qlite3PagerTrunc
1d340 61 74 65 49 6d 61 67 65 28 70 42 74 2d 3e 70 50  ateImage(pBt->pP
1d350 61 67 65 72 2c 20 70 42 74 2d 3e 6e 50 61 67 65  ager, pBt->nPage
1d360 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
1d370 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1d380 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65  PagerCommitPhase
1d390 4f 6e 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  One(pBt->pPager,
1d3a0 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20 20   zMaster, 0);.  
1d3b0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
1d3c0 61 76 65 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65  ave(p);.  }.  re
1d3d0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1d3e0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
1d3f0 69 73 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 62  is called from b
1d400 6f 74 68 20 42 74 72 65 65 43 6f 6d 6d 69 74 50  oth BtreeCommitP
1d410 68 61 73 65 54 77 6f 28 29 20 61 6e 64 20 42 74  haseTwo() and Bt
1d420 72 65 65 52 6f 6c 6c 62 61 63 6b 28 29 0a 2a 2a  reeRollback().**
1d430 20 61 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69   at the conclusi
1d440 6f 6e 20 6f 66 20 61 20 74 72 61 6e 73 61 63 74  on of a transact
1d450 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ion..*/.static v
1d460 6f 69 64 20 62 74 72 65 65 45 6e 64 54 72 61 6e  oid btreeEndTran
1d470 73 61 63 74 69 6f 6e 28 42 74 72 65 65 20 2a 70  saction(Btree *p
1d480 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
1d490 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 73  Bt = p->pBt;.  s
1d4a0 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e  qlite3 *db = p->
1d4b0 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  db;.  assert( sq
1d4c0 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d  lite3BtreeHoldsM
1d4d0 75 74 65 78 28 70 29 20 29 3b 0a 0a 23 69 66 6e  utex(p) );..#ifn
1d4e0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1d4f0 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 70 42 74  AUTOVACUUM.  pBt
1d500 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65 20 3d 20  ->bDoTruncate = 
1d510 30 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20  0;.#endif.  if( 
1d520 70 2d 3e 69 6e 54 72 61 6e 73 3e 54 52 41 4e 53  p->inTrans>TRANS
1d530 5f 4e 4f 4e 45 20 26 26 20 64 62 2d 3e 6e 56 64  _NONE && db->nVd
1d540 62 65 52 65 61 64 3e 31 20 29 7b 0a 20 20 20 20  beRead>1 ){.    
1d550 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  /* If there are 
1d560 6f 74 68 65 72 20 61 63 74 69 76 65 20 73 74 61  other active sta
1d570 74 65 6d 65 6e 74 73 20 74 68 61 74 20 62 65 6c  tements that bel
1d580 6f 6e 67 20 74 6f 20 74 68 69 73 20 64 61 74 61  ong to this data
1d590 62 61 73 65 0a 20 20 20 20 2a 2a 20 68 61 6e 64  base.    ** hand
1d5a0 6c 65 2c 20 64 6f 77 6e 67 72 61 64 65 20 74 6f  le, downgrade to
1d5b0 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 74 72 61   a read-only tra
1d5c0 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 6f 74  nsaction. The ot
1d5d0 68 65 72 20 73 74 61 74 65 6d 65 6e 74 73 0a 20  her statements. 
1d5e0 20 20 20 2a 2a 20 6d 61 79 20 73 74 69 6c 6c 20     ** may still 
1d5f0 62 65 20 72 65 61 64 69 6e 67 20 66 72 6f 6d 20  be reading from 
1d600 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 2a  the database.  *
1d610 2f 0a 20 20 20 20 64 6f 77 6e 67 72 61 64 65 41  /.    downgradeA
1d620 6c 6c 53 68 61 72 65 64 43 61 63 68 65 54 61 62  llSharedCacheTab
1d630 6c 65 4c 6f 63 6b 73 28 70 29 3b 0a 20 20 20 20  leLocks(p);.    
1d640 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52 41  p->inTrans = TRA
1d650 4e 53 5f 52 45 41 44 3b 0a 20 20 7d 65 6c 73 65  NS_READ;.  }else
1d660 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  {.    /* If the 
1d670 68 61 6e 64 6c 65 20 68 61 64 20 61 6e 79 20 6b  handle had any k
1d680 69 6e 64 20 6f 66 20 74 72 61 6e 73 61 63 74 69  ind of transacti
1d690 6f 6e 20 6f 70 65 6e 2c 20 64 65 63 72 65 6d 65  on open, decreme
1d6a0 6e 74 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 74  nt the .    ** t
1d6b0 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74  ransaction count
1d6c0 20 6f 66 20 74 68 65 20 73 68 61 72 65 64 20 62   of the shared b
1d6d0 74 72 65 65 2e 20 49 66 20 74 68 65 20 74 72 61  tree. If the tra
1d6e0 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 20 0a  nsaction count .
1d6f0 20 20 20 20 2a 2a 20 72 65 61 63 68 65 73 20 30      ** reaches 0
1d700 2c 20 73 65 74 20 74 68 65 20 73 68 61 72 65 64  , set the shared
1d710 20 73 74 61 74 65 20 74 6f 20 54 52 41 4e 53 5f   state to TRANS_
1d720 4e 4f 4e 45 2e 20 54 68 65 20 75 6e 6c 6f 63 6b  NONE. The unlock
1d730 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 29 0a  BtreeIfUnused().
1d740 20 20 20 20 2a 2a 20 63 61 6c 6c 20 62 65 6c 6f      ** call belo
1d750 77 20 77 69 6c 6c 20 75 6e 6c 6f 63 6b 20 74 68  w will unlock th
1d760 65 20 70 61 67 65 72 2e 20 20 2a 2f 0a 20 20 20  e pager.  */.   
1d770 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 21   if( p->inTrans!
1d780 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20  =TRANS_NONE ){. 
1d790 20 20 20 20 20 63 6c 65 61 72 41 6c 6c 53 68 61       clearAllSha
1d7a0 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
1d7b0 6b 73 28 70 29 3b 0a 20 20 20 20 20 20 70 42 74  ks(p);.      pBt
1d7c0 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2d 2d  ->nTransaction--
1d7d0 3b 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 70  ;.      if( 0==p
1d7e0 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e  Bt->nTransaction
1d7f0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42 74 2d   ){.        pBt-
1d800 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d  >inTransaction =
1d810 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20   TRANS_NONE;.   
1d820 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
1d830 2f 2a 20 53 65 74 20 74 68 65 20 63 75 72 72 65  /* Set the curre
1d840 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73  nt transaction s
1d850 74 61 74 65 20 74 6f 20 54 52 41 4e 53 5f 4e 4f  tate to TRANS_NO
1d860 4e 45 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74 68  NE and unlock th
1d870 65 20 0a 20 20 20 20 2a 2a 20 70 61 67 65 72 20  e .    ** pager 
1d880 69 66 20 74 68 69 73 20 63 61 6c 6c 20 63 6c 6f  if this call clo
1d890 73 65 64 20 74 68 65 20 6f 6e 6c 79 20 72 65 61  sed the only rea
1d8a0 64 20 6f 72 20 77 72 69 74 65 20 74 72 61 6e 73  d or write trans
1d8b0 61 63 74 69 6f 6e 2e 20 20 2a 2f 0a 20 20 20 20  action.  */.    
1d8c0 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52 41  p->inTrans = TRA
1d8d0 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20 75 6e 6c  NS_NONE;.    unl
1d8e0 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64  ockBtreeIfUnused
1d8f0 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 20 20 62 74  (pBt);.  }..  bt
1d900 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b  reeIntegrity(p);
1d910 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74  .}../*.** Commit
1d920 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
1d930 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 70 72   currently in pr
1d940 6f 67 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  ogress..**.** Th
1d950 69 73 20 72 6f 75 74 69 6e 65 20 69 6d 70 6c 65  is routine imple
1d960 6d 65 6e 74 73 20 74 68 65 20 73 65 63 6f 6e 64  ments the second
1d970 20 70 68 61 73 65 20 6f 66 20 61 20 32 2d 70 68   phase of a 2-ph
1d980 61 73 65 20 63 6f 6d 6d 69 74 2e 20 20 54 68 65  ase commit.  The
1d990 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65  .** sqlite3Btree
1d9a0 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29  CommitPhaseOne()
1d9b0 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 74 68   routine does th
1d9c0 65 20 66 69 72 73 74 20 70 68 61 73 65 20 61 6e  e first phase an
1d9d0 64 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 69  d should.** be i
1d9e0 6e 76 6f 6b 65 64 20 70 72 69 6f 72 20 74 6f 20  nvoked prior to 
1d9f0 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75  calling this rou
1da00 74 69 6e 65 2e 20 20 54 68 65 20 73 71 6c 69 74  tine.  The sqlit
1da10 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
1da20 73 65 4f 6e 65 28 29 0a 2a 2a 20 72 6f 75 74 69  seOne().** routi
1da30 6e 65 20 64 69 64 20 61 6c 6c 20 74 68 65 20 77  ne did all the w
1da40 6f 72 6b 20 6f 66 20 77 72 69 74 69 6e 67 20 69  ork of writing i
1da50 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 75 74 20 74  nformation out t
1da60 6f 20 64 69 73 6b 20 61 6e 64 20 66 6c 75 73 68  o disk and flush
1da70 69 6e 67 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65  ing the.** conte
1da80 6e 74 73 20 73 6f 20 74 68 61 74 20 74 68 65 79  nts so that they
1da90 20 61 72 65 20 77 72 69 74 74 65 6e 20 6f 6e 74   are written ont
1daa0 6f 20 74 68 65 20 64 69 73 6b 20 70 6c 61 74 74  o the disk platt
1dab0 65 72 2e 20 20 41 6c 6c 20 74 68 69 73 0a 2a 2a  er.  All this.**
1dac0 20 72 6f 75 74 69 6e 65 20 68 61 73 20 74 6f 20   routine has to 
1dad0 64 6f 20 69 73 20 64 65 6c 65 74 65 20 6f 72 20  do is delete or 
1dae0 74 72 75 6e 63 61 74 65 20 6f 72 20 7a 65 72 6f  truncate or zero
1daf0 20 74 68 65 20 68 65 61 64 65 72 20 69 6e 20 74   the header in t
1db00 68 65 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61  he.** the rollba
1db10 63 6b 20 6a 6f 75 72 6e 61 6c 20 28 77 68 69 63  ck journal (whic
1db20 68 20 63 61 75 73 65 73 20 74 68 65 20 74 72 61  h causes the tra
1db30 6e 73 61 63 74 69 6f 6e 20 74 6f 20 63 6f 6d 6d  nsaction to comm
1db40 69 74 29 20 61 6e 64 0a 2a 2a 20 64 72 6f 70 20  it) and.** drop 
1db50 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72  locks..**.** Nor
1db60 6d 61 6c 6c 79 2c 20 69 66 20 61 6e 20 65 72 72  mally, if an err
1db70 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
1db80 74 68 65 20 70 61 67 65 72 20 6c 61 79 65 72 20  the pager layer 
1db90 69 73 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f  is attempting to
1dba0 20 0a 2a 2a 20 66 69 6e 61 6c 69 7a 65 20 74 68   .** finalize th
1dbb0 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 6a 6f 75  e underlying jou
1dbc0 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 69 73 20  rnal file, this 
1dbd0 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
1dbe0 20 61 6e 20 65 72 72 6f 72 20 61 6e 64 0a 2a 2a   an error and.**
1dbf0 20 74 68 65 20 75 70 70 65 72 20 6c 61 79 65 72   the upper layer
1dc00 20 77 69 6c 6c 20 61 74 74 65 6d 70 74 20 61 20   will attempt a 
1dc10 72 6f 6c 6c 62 61 63 6b 2e 20 48 6f 77 65 76 65  rollback. Howeve
1dc20 72 2c 20 69 66 20 74 68 65 20 73 65 63 6f 6e 64  r, if the second
1dc30 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 69 73 20   argument.** is 
1dc40 6e 6f 6e 2d 7a 65 72 6f 20 74 68 65 6e 20 74 68  non-zero then th
1dc50 69 73 20 62 2d 74 72 65 65 20 74 72 61 6e 73 61  is b-tree transa
1dc60 63 74 69 6f 6e 20 69 73 20 70 61 72 74 20 6f 66  ction is part of
1dc70 20 61 20 6d 75 6c 74 69 2d 66 69 6c 65 20 0a 2a   a multi-file .*
1dc80 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49  * transaction. I
1dc90 6e 20 74 68 69 73 20 63 61 73 65 2c 20 74 68 65  n this case, the
1dca0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73   transaction has
1dcb0 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63 6f   already been co
1dcc0 6d 6d 69 74 74 65 64 20 0a 2a 2a 20 28 62 79 20  mmitted .** (by 
1dcd0 64 65 6c 65 74 69 6e 67 20 61 20 6d 61 73 74 65  deleting a maste
1dce0 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20  r journal file) 
1dcf0 61 6e 64 20 74 68 65 20 63 61 6c 6c 65 72 20 77  and the caller w
1dd00 69 6c 6c 20 69 67 6e 6f 72 65 20 74 68 69 73 20  ill ignore this 
1dd10 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 73 20 72 65  .** functions re
1dd20 74 75 72 6e 20 63 6f 64 65 2e 20 53 6f 2c 20 65  turn code. So, e
1dd30 76 65 6e 20 69 66 20 61 6e 20 65 72 72 6f 72 20  ven if an error 
1dd40 6f 63 63 75 72 73 20 69 6e 20 74 68 65 20 70 61  occurs in the pa
1dd50 67 65 72 20 6c 61 79 65 72 2c 0a 2a 2a 20 72 65  ger layer,.** re
1dd60 73 65 74 20 74 68 65 20 62 2d 74 72 65 65 20 6f  set the b-tree o
1dd70 62 6a 65 63 74 73 20 69 6e 74 65 72 6e 61 6c 20  bjects internal 
1dd80 73 74 61 74 65 20 74 6f 20 69 6e 64 69 63 61 74  state to indicat
1dd90 65 20 74 68 61 74 20 74 68 65 20 77 72 69 74 65  e that the write
1dda0 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  .** transaction 
1ddb0 68 61 73 20 62 65 65 6e 20 63 6c 6f 73 65 64 2e  has been closed.
1ddc0 20 54 68 69 73 20 69 73 20 71 75 69 74 65 20 73   This is quite s
1ddd0 61 66 65 2c 20 61 73 20 74 68 65 20 70 61 67 65  afe, as the page
1dde0 72 20 77 69 6c 6c 20 68 61 76 65 0a 2a 2a 20 74  r will have.** t
1ddf0 72 61 6e 73 69 74 69 6f 6e 65 64 20 74 6f 20 74  ransitioned to t
1de00 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 2e 0a  he error state..
1de10 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20  **.** This will 
1de20 72 65 6c 65 61 73 65 20 74 68 65 20 77 72 69 74  release the writ
1de30 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  e lock on the da
1de40 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66  tabase file.  If
1de50 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f   there.** are no
1de60 20 61 63 74 69 76 65 20 63 75 72 73 6f 72 73 2c   active cursors,
1de70 20 69 74 20 61 6c 73 6f 20 72 65 6c 65 61 73 65   it also release
1de80 73 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e  s the read lock.
1de90 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
1dea0 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54  treeCommitPhaseT
1deb0 77 6f 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  wo(Btree *p, int
1dec0 20 62 43 6c 65 61 6e 75 70 29 7b 0a 0a 20 20 69   bCleanup){..  i
1ded0 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  f( p->inTrans==T
1dee0 52 41 4e 53 5f 4e 4f 4e 45 20 29 20 72 65 74 75  RANS_NONE ) retu
1def0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
1df00 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
1df10 72 28 70 29 3b 0a 20 20 62 74 72 65 65 49 6e 74  r(p);.  btreeInt
1df20 65 67 72 69 74 79 28 70 29 3b 0a 0a 20 20 2f 2a  egrity(p);..  /*
1df30 20 49 66 20 74 68 65 20 68 61 6e 64 6c 65 20 68   If the handle h
1df40 61 73 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73  as a write-trans
1df50 61 63 74 69 6f 6e 20 6f 70 65 6e 2c 20 63 6f 6d  action open, com
1df60 6d 69 74 20 74 68 65 20 73 68 61 72 65 64 2d 62  mit the shared-b
1df70 74 72 65 65 73 20 0a 20 20 2a 2a 20 74 72 61 6e  trees .  ** tran
1df80 73 61 63 74 69 6f 6e 20 61 6e 64 20 73 65 74 20  saction and set 
1df90 74 68 65 20 73 68 61 72 65 64 20 73 74 61 74 65  the shared state
1dfa0 20 74 6f 20 54 52 41 4e 53 5f 52 45 41 44 2e 0a   to TRANS_READ..
1dfb0 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 6e    */.  if( p->in
1dfc0 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49  Trans==TRANS_WRI
1dfd0 54 45 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63  TE ){.    int rc
1dfe0 3b 0a 20 20 20 20 42 74 53 68 61 72 65 64 20 2a  ;.    BtShared *
1dff0 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
1e000 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69    assert( pBt->i
1e010 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52  nTransaction==TR
1e020 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 20  ANS_WRITE );.   
1e030 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6e 54   assert( pBt->nT
1e040 72 61 6e 73 61 63 74 69 6f 6e 3e 30 20 29 3b 0a  ransaction>0 );.
1e050 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1e060 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65  PagerCommitPhase
1e070 54 77 6f 28 70 42 74 2d 3e 70 50 61 67 65 72 29  Two(pBt->pPager)
1e080 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
1e090 4c 49 54 45 5f 4f 4b 20 26 26 20 62 43 6c 65 61  LITE_OK && bClea
1e0a0 6e 75 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  nup==0 ){.      
1e0b0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
1e0c0 65 28 70 29 3b 0a 20 20 20 20 20 20 72 65 74 75  e(p);.      retu
1e0d0 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
1e0e0 20 70 2d 3e 69 44 61 74 61 56 65 72 73 69 6f 6e   p->iDataVersion
1e0f0 2d 2d 3b 20 20 2f 2a 20 43 6f 6d 70 65 6e 73 61  --;  /* Compensa
1e100 74 65 20 66 6f 72 20 70 50 61 67 65 72 2d 3e 69  te for pPager->i
1e110 44 61 74 61 56 65 72 73 69 6f 6e 2b 2b 3b 20 2a  DataVersion++; *
1e120 2f 0a 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61  /.    pBt->inTra
1e130 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53  nsaction = TRANS
1e140 5f 52 45 41 44 3b 0a 20 20 20 20 62 74 72 65 65  _READ;.    btree
1e150 43 6c 65 61 72 48 61 73 43 6f 6e 74 65 6e 74 28  ClearHasContent(
1e160 70 42 74 29 3b 0a 20 20 7d 0a 0a 20 20 62 74 72  pBt);.  }..  btr
1e170 65 65 45 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e  eeEndTransaction
1e180 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  (p);.  sqlite3Bt
1e190 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
1e1a0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1e1b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 62 6f 74  .}../*.** Do bot
1e1c0 68 20 70 68 61 73 65 73 20 6f 66 20 61 20 63 6f  h phases of a co
1e1d0 6d 6d 69 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  mmit..*/.int sql
1e1e0 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 28  ite3BtreeCommit(
1e1f0 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74  Btree *p){.  int
1e200 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74   rc;.  sqlite3Bt
1e210 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 72  reeEnter(p);.  r
1e220 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
1e230 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70  CommitPhaseOne(p
1e240 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  , 0);.  if( rc==
1e250 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1e260 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
1e270 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f  eeCommitPhaseTwo
1e280 28 70 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 73 71  (p, 0);.  }.  sq
1e290 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
1e2a0 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
1e2b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
1e2c0 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68 65 20  outine sets the 
1e2d0 73 74 61 74 65 20 74 6f 20 43 55 52 53 4f 52 5f  state to CURSOR_
1e2e0 46 41 55 4c 54 20 61 6e 64 20 74 68 65 20 65 72  FAULT and the er
1e2f0 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 74 6f 20 65  ror.** code to e
1e300 72 72 43 6f 64 65 20 66 6f 72 20 65 76 65 72 79  rrCode for every
1e310 20 63 75 72 73 6f 72 20 6f 6e 20 61 6e 79 20 42   cursor on any B
1e320 74 53 68 61 72 65 64 20 74 68 61 74 20 70 42 74  tShared that pBt
1e330 72 65 65 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65  ree.** reference
1e340 73 2e 20 20 4f 72 20 69 66 20 74 68 65 20 77 72  s.  Or if the wr
1e350 69 74 65 4f 6e 6c 79 20 66 6c 61 67 20 69 73 20  iteOnly flag is 
1e360 73 65 74 20 74 6f 20 31 2c 20 74 68 65 6e 20 6f  set to 1, then o
1e370 6e 6c 79 0a 2a 2a 20 74 72 69 70 20 77 72 69 74  nly.** trip writ
1e380 65 20 63 75 72 73 6f 72 73 20 61 6e 64 20 6c 65  e cursors and le
1e390 61 76 65 20 72 65 61 64 20 63 75 72 73 6f 72 73  ave read cursors
1e3a0 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a   unchanged..**.*
1e3b0 2a 20 45 76 65 72 79 20 63 75 72 73 6f 72 20 69  * Every cursor i
1e3c0 73 20 61 20 63 61 6e 64 69 64 61 74 65 20 74 6f  s a candidate to
1e3d0 20 62 65 20 74 72 69 70 70 65 64 2c 20 69 6e 63   be tripped, inc
1e3e0 6c 75 64 69 6e 67 20 63 75 72 73 6f 72 73 0a 2a  luding cursors.*
1e3f0 2a 20 74 68 61 74 20 62 65 6c 6f 6e 67 20 74 6f  * that belong to
1e400 20 6f 74 68 65 72 20 64 61 74 61 62 61 73 65 20   other database 
1e410 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 68 61 74  connections that
1e420 20 68 61 70 70 65 6e 20 74 6f 20 62 65 0a 2a 2a   happen to be.**
1e430 20 73 68 61 72 69 6e 67 20 74 68 65 20 63 61 63   sharing the cac
1e440 68 65 20 77 69 74 68 20 70 42 74 72 65 65 2e 0a  he with pBtree..
1e450 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
1e460 6e 65 20 67 65 74 73 20 63 61 6c 6c 65 64 20 77  ne gets called w
1e470 68 65 6e 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f  hen a rollback o
1e480 63 63 75 72 73 2e 20 49 66 20 74 68 65 20 77 72  ccurs. If the wr
1e490 69 74 65 4f 6e 6c 79 0a 2a 2a 20 66 6c 61 67 20  iteOnly.** flag 
1e4a0 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 6f 6e  is true, then on
1e4b0 6c 79 20 77 72 69 74 65 2d 63 75 72 73 6f 72 73  ly write-cursors
1e4c0 20 6e 65 65 64 20 62 65 20 74 72 69 70 70 65 64   need be tripped
1e4d0 20 2d 20 72 65 61 64 2d 6f 6e 6c 79 0a 2a 2a 20   - read-only.** 
1e4e0 63 75 72 73 6f 72 73 20 73 61 76 65 20 74 68 65  cursors save the
1e4f0 69 72 20 63 75 72 72 65 6e 74 20 70 6f 73 69 74  ir current posit
1e500 69 6f 6e 73 20 73 6f 20 74 68 61 74 20 74 68 65  ions so that the
1e510 79 20 6d 61 79 20 63 6f 6e 74 69 6e 75 65 20 0a  y may continue .
1e520 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65  ** following the
1e530 20 72 6f 6c 6c 62 61 63 6b 2e 20 4f 72 2c 20 69   rollback. Or, i
1e540 66 20 77 72 69 74 65 4f 6e 6c 79 20 69 73 20 66  f writeOnly is f
1e550 61 6c 73 65 2c 20 61 6c 6c 20 63 75 72 73 6f 72  alse, all cursor
1e560 73 20 61 72 65 20 0a 2a 2a 20 74 72 69 70 70 65  s are .** trippe
1e570 64 2e 20 49 6e 20 67 65 6e 65 72 61 6c 2c 20 77  d. In general, w
1e580 72 69 74 65 4f 6e 6c 79 20 69 73 20 66 61 6c 73  riteOnly is fals
1e590 65 20 69 66 20 74 68 65 20 74 72 61 6e 73 61 63  e if the transac
1e5a0 74 69 6f 6e 20 62 65 69 6e 67 0a 2a 2a 20 72 6f  tion being.** ro
1e5b0 6c 6c 65 64 20 62 61 63 6b 20 6d 6f 64 69 66 69  lled back modifi
1e5c0 65 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ed the database 
1e5d0 73 63 68 65 6d 61 2e 20 49 6e 20 74 68 69 73 20  schema. In this 
1e5e0 63 61 73 65 20 62 2d 74 72 65 65 20 72 6f 6f 74  case b-tree root
1e5f0 0a 2a 2a 20 70 61 67 65 73 20 6d 61 79 20 62 65  .** pages may be
1e600 20 6d 6f 76 65 64 20 6f 72 20 64 65 6c 65 74 65   moved or delete
1e610 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  d from the datab
1e620 61 73 65 20 61 6c 74 6f 67 65 74 68 65 72 2c 20  ase altogether, 
1e630 6d 61 6b 69 6e 67 0a 2a 2a 20 69 74 20 75 6e 73  making.** it uns
1e640 61 66 65 20 66 6f 72 20 72 65 61 64 20 63 75 72  afe for read cur
1e650 73 6f 72 73 20 74 6f 20 63 6f 6e 74 69 6e 75 65  sors to continue
1e660 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 77  ..**.** If the w
1e670 72 69 74 65 4f 6e 6c 79 20 66 6c 61 67 20 69 73  riteOnly flag is
1e680 20 74 72 75 65 20 61 6e 64 20 61 6e 20 65 72 72   true and an err
1e690 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65  or is encountere
1e6a0 64 20 77 68 69 6c 65 20 0a 2a 2a 20 73 61 76 69  d while .** savi
1e6b0 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  ng the current p
1e6c0 6f 73 69 74 69 6f 6e 20 6f 66 20 61 20 72 65 61  osition of a rea
1e6d0 64 2d 6f 6e 6c 79 20 63 75 72 73 6f 72 2c 20 61  d-only cursor, a
1e6e0 6c 6c 20 63 75 72 73 6f 72 73 2c 20 0a 2a 2a 20  ll cursors, .** 
1e6f0 69 6e 63 6c 75 64 69 6e 67 20 61 6c 6c 20 72 65  including all re
1e700 61 64 2d 63 75 72 73 6f 72 73 20 61 72 65 20 74  ad-cursors are t
1e710 72 69 70 70 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 51  ripped..**.** SQ
1e720 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
1e730 6e 65 64 20 69 66 20 73 75 63 63 65 73 73 66 75  ned if successfu
1e740 6c 2c 20 6f 72 20 69 66 20 61 6e 20 65 72 72 6f  l, or if an erro
1e750 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 0a 2a  r occurs while.*
1e760 2a 20 73 61 76 69 6e 67 20 61 20 63 75 72 73 6f  * saving a curso
1e770 72 20 70 6f 73 69 74 69 6f 6e 2c 20 61 6e 20 53  r position, an S
1e780 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
1e790 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1e7a0 42 74 72 65 65 54 72 69 70 41 6c 6c 43 75 72 73  BtreeTripAllCurs
1e7b0 6f 72 73 28 42 74 72 65 65 20 2a 70 42 74 72 65  ors(Btree *pBtre
1e7c0 65 2c 20 69 6e 74 20 65 72 72 43 6f 64 65 2c 20  e, int errCode, 
1e7d0 69 6e 74 20 77 72 69 74 65 4f 6e 6c 79 29 7b 0a  int writeOnly){.
1e7e0 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20    BtCursor *p;. 
1e7f0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
1e800 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  _OK;..  assert( 
1e810 28 77 72 69 74 65 4f 6e 6c 79 3d 3d 30 20 7c 7c  (writeOnly==0 ||
1e820 20 77 72 69 74 65 4f 6e 6c 79 3d 3d 31 29 20 26   writeOnly==1) &
1e830 26 20 42 54 43 46 5f 57 72 69 74 65 46 6c 61 67  & BTCF_WriteFlag
1e840 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20 70 42 74  ==1 );.  if( pBt
1e850 72 65 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ree ){.    sqlit
1e860 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 42 74  e3BtreeEnter(pBt
1e870 72 65 65 29 3b 0a 20 20 20 20 66 6f 72 28 70 3d  ree);.    for(p=
1e880 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 43 75  pBtree->pBt->pCu
1e890 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e  rsor; p; p=p->pN
1e8a0 65 78 74 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  ext){.      int 
1e8b0 69 3b 0a 20 20 20 20 20 20 69 66 28 20 77 72 69  i;.      if( wri
1e8c0 74 65 4f 6e 6c 79 20 26 26 20 28 70 2d 3e 63 75  teOnly && (p->cu
1e8d0 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 57 72  rFlags & BTCF_Wr
1e8e0 69 74 65 46 6c 61 67 29 3d 3d 30 20 29 7b 0a 20  iteFlag)==0 ){. 
1e8f0 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 65 53         if( p->eS
1e900 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
1e910 49 44 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d  ID || p->eState=
1e920 3d 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54  =CURSOR_SKIPNEXT
1e930 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
1e940 20 3d 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73   = saveCursorPos
1e950 69 74 69 6f 6e 28 70 29 3b 0a 20 20 20 20 20 20  ition(p);.      
1e960 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1e970 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1e980 20 20 20 20 20 28 76 6f 69 64 29 73 71 6c 69 74       (void)sqlit
1e990 65 33 42 74 72 65 65 54 72 69 70 41 6c 6c 43 75  e3BtreeTripAllCu
1e9a0 72 73 6f 72 73 28 70 42 74 72 65 65 2c 20 72 63  rsors(pBtree, rc
1e9b0 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
1e9c0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
1e9d0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
1e9e0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1e9f0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
1ea00 43 6c 65 61 72 43 75 72 73 6f 72 28 70 29 3b 0a  ClearCursor(p);.
1ea10 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74          p->eStat
1ea20 65 20 3d 20 43 55 52 53 4f 52 5f 46 41 55 4c 54  e = CURSOR_FAULT
1ea30 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 73 6b 69  ;.        p->ski
1ea40 70 4e 65 78 74 20 3d 20 65 72 72 43 6f 64 65 3b  pNext = errCode;
1ea50 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66  .      }.      f
1ea60 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 2d 3e 69 50  or(i=0; i<=p->iP
1ea70 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  age; i++){.     
1ea80 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
1ea90 2d 3e 61 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20  ->apPage[i]);.  
1eaa0 20 20 20 20 20 20 70 2d 3e 61 70 50 61 67 65 5b        p->apPage[
1eab0 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  i] = 0;.      }.
1eac0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
1ead0 33 42 74 72 65 65 4c 65 61 76 65 28 70 42 74 72  3BtreeLeave(pBtr
1eae0 65 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ee);.  }.  retur
1eaf0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
1eb00 6f 6c 6c 62 61 63 6b 20 74 68 65 20 74 72 61 6e  ollback the tran
1eb10 73 61 63 74 69 6f 6e 20 69 6e 20 70 72 6f 67 72  saction in progr
1eb20 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 72  ess..**.** If tr
1eb30 69 70 43 6f 64 65 20 69 73 20 6e 6f 74 20 53 51  ipCode is not SQ
1eb40 4c 49 54 45 5f 4f 4b 20 74 68 65 6e 20 63 75 72  LITE_OK then cur
1eb50 73 6f 72 73 20 77 69 6c 6c 20 62 65 20 69 6e 76  sors will be inv
1eb60 61 6c 69 64 61 74 65 64 20 28 74 72 69 70 70 65  alidated (trippe
1eb70 64 29 2e 0a 2a 2a 20 4f 6e 6c 79 20 77 72 69 74  d)..** Only writ
1eb80 65 20 63 75 72 73 6f 72 73 20 61 72 65 20 74 72  e cursors are tr
1eb90 69 70 70 65 64 20 69 66 20 77 72 69 74 65 4f 6e  ipped if writeOn
1eba0 6c 79 20 69 73 20 74 72 75 65 20 62 75 74 20 61  ly is true but a
1ebb0 6c 6c 20 63 75 72 73 6f 72 73 20 61 72 65 0a 2a  ll cursors are.*
1ebc0 2a 20 74 72 69 70 70 65 64 20 69 66 20 77 72 69  * tripped if wri
1ebd0 74 65 4f 6e 6c 79 20 69 73 20 66 61 6c 73 65 2e  teOnly is false.
1ebe0 20 20 41 6e 79 20 61 74 74 65 6d 70 74 20 74 6f    Any attempt to
1ebf0 20 75 73 65 0a 2a 2a 20 61 20 74 72 69 70 70 65   use.** a trippe
1ec00 64 20 63 75 72 73 6f 72 20 77 69 6c 6c 20 72 65  d cursor will re
1ec10 73 75 6c 74 20 69 6e 20 61 6e 20 65 72 72 6f 72  sult in an error
1ec20 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 69 6c  ..**.** This wil
1ec30 6c 20 72 65 6c 65 61 73 65 20 74 68 65 20 77 72  l release the wr
1ec40 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ite lock on the 
1ec50 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
1ec60 49 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20  If there.** are 
1ec70 6e 6f 20 61 63 74 69 76 65 20 63 75 72 73 6f 72  no active cursor
1ec80 73 2c 20 69 74 20 61 6c 73 6f 20 72 65 6c 65 61  s, it also relea
1ec90 73 65 73 20 74 68 65 20 72 65 61 64 20 6c 6f 63  ses the read loc
1eca0 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  k..*/.int sqlite
1ecb0 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 42  3BtreeRollback(B
1ecc0 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 74 72 69  tree *p, int tri
1ecd0 70 43 6f 64 65 2c 20 69 6e 74 20 77 72 69 74 65  pCode, int write
1ece0 4f 6e 6c 79 29 7b 0a 20 20 69 6e 74 20 72 63 3b  Only){.  int rc;
1ecf0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
1ed00 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 4d 65 6d   = p->pBt;.  Mem
1ed10 50 61 67 65 20 2a 70 50 61 67 65 31 3b 0a 0a 20  Page *pPage1;.. 
1ed20 20 61 73 73 65 72 74 28 20 77 72 69 74 65 4f 6e   assert( writeOn
1ed30 6c 79 3d 3d 31 20 7c 7c 20 77 72 69 74 65 4f 6e  ly==1 || writeOn
1ed40 6c 79 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ly==0 );.  asser
1ed50 74 28 20 74 72 69 70 43 6f 64 65 3d 3d 53 51 4c  t( tripCode==SQL
1ed60 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41  ITE_ABORT_ROLLBA
1ed70 43 4b 20 7c 7c 20 74 72 69 70 43 6f 64 65 3d 3d  CK || tripCode==
1ed80 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 73  SQLITE_OK );.  s
1ed90 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
1eda0 28 70 29 3b 0a 20 20 69 66 28 20 74 72 69 70 43  (p);.  if( tripC
1edb0 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  ode==SQLITE_OK )
1edc0 7b 0a 20 20 20 20 72 63 20 3d 20 74 72 69 70 43  {.    rc = tripC
1edd0 6f 64 65 20 3d 20 73 61 76 65 41 6c 6c 43 75 72  ode = saveAllCur
1ede0 73 6f 72 73 28 70 42 74 2c 20 30 2c 20 30 29 3b  sors(pBt, 0, 0);
1edf0 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 77 72  .    if( rc ) wr
1ee00 69 74 65 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20 7d  iteOnly = 0;.  }
1ee10 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 53  else{.    rc = S
1ee20 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
1ee30 69 66 28 20 74 72 69 70 43 6f 64 65 20 29 7b 0a  if( tripCode ){.
1ee40 20 20 20 20 69 6e 74 20 72 63 32 20 3d 20 73 71      int rc2 = sq
1ee50 6c 69 74 65 33 42 74 72 65 65 54 72 69 70 41 6c  lite3BtreeTripAl
1ee60 6c 43 75 72 73 6f 72 73 28 70 2c 20 74 72 69 70  lCursors(p, trip
1ee70 43 6f 64 65 2c 20 77 72 69 74 65 4f 6e 6c 79 29  Code, writeOnly)
1ee80 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63  ;.    assert( rc
1ee90 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28  ==SQLITE_OK || (
1eea0 77 72 69 74 65 4f 6e 6c 79 3d 3d 30 20 26 26 20  writeOnly==0 && 
1eeb0 72 63 32 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 20  rc2==SQLITE_OK) 
1eec0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 32 21 3d  );.    if( rc2!=
1eed0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d  SQLITE_OK ) rc =
1eee0 20 72 63 32 3b 0a 20 20 7d 0a 20 20 62 74 72 65   rc2;.  }.  btre
1eef0 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 0a  eIntegrity(p);..
1ef00 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73    if( p->inTrans
1ef10 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b  ==TRANS_WRITE ){
1ef20 0a 20 20 20 20 69 6e 74 20 72 63 32 3b 0a 0a 20  .    int rc2;.. 
1ef30 20 20 20 61 73 73 65 72 74 28 20 54 52 41 4e 53     assert( TRANS
1ef40 5f 57 52 49 54 45 3d 3d 70 42 74 2d 3e 69 6e 54  _WRITE==pBt->inT
1ef50 72 61 6e 73 61 63 74 69 6f 6e 20 29 3b 0a 20 20  ransaction );.  
1ef60 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33 50    rc2 = sqlite3P
1ef70 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70 42 74  agerRollback(pBt
1ef80 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69  ->pPager);.    i
1ef90 66 28 20 72 63 32 21 3d 53 51 4c 49 54 45 5f 4f  f( rc2!=SQLITE_O
1efa0 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
1efb0 72 63 32 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  rc2;.    }..    
1efc0 2f 2a 20 54 68 65 20 72 6f 6c 6c 62 61 63 6b 20  /* The rollback 
1efd0 6d 61 79 20 68 61 76 65 20 64 65 73 74 72 6f 79  may have destroy
1efe0 65 64 20 74 68 65 20 70 50 61 67 65 31 2d 3e 61  ed the pPage1->a
1eff0 44 61 74 61 20 76 61 6c 75 65 2e 20 20 53 6f 0a  Data value.  So.
1f000 20 20 20 20 2a 2a 20 63 61 6c 6c 20 62 74 72 65      ** call btre
1f010 65 47 65 74 50 61 67 65 28 29 20 6f 6e 20 70 61  eGetPage() on pa
1f020 67 65 20 31 20 61 67 61 69 6e 20 74 6f 20 6d 61  ge 1 again to ma
1f030 6b 65 0a 20 20 20 20 2a 2a 20 73 75 72 65 20 70  ke.    ** sure p
1f040 50 61 67 65 31 2d 3e 61 44 61 74 61 20 69 73 20  Page1->aData is 
1f050 73 65 74 20 63 6f 72 72 65 63 74 6c 79 2e 20 2a  set correctly. *
1f060 2f 0a 20 20 20 20 69 66 28 20 62 74 72 65 65 47  /.    if( btreeG
1f070 65 74 50 61 67 65 28 70 42 74 2c 20 31 2c 20 26  etPage(pBt, 1, &
1f080 70 50 61 67 65 31 2c 20 30 29 3d 3d 53 51 4c 49  pPage1, 0)==SQLI
1f090 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69  TE_OK ){.      i
1f0a0 6e 74 20 6e 50 61 67 65 20 3d 20 67 65 74 34 62  nt nPage = get4b
1f0b0 79 74 65 28 32 38 2b 28 75 38 2a 29 70 50 61 67  yte(28+(u8*)pPag
1f0c0 65 31 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20  e1->aData);.    
1f0d0 20 20 74 65 73 74 63 61 73 65 28 20 6e 50 61 67    testcase( nPag
1f0e0 65 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66  e==0 );.      if
1f0f0 28 20 6e 50 61 67 65 3d 3d 30 20 29 20 73 71 6c  ( nPage==0 ) sql
1f100 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75  ite3PagerPagecou
1f110 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  nt(pBt->pPager, 
1f120 26 6e 50 61 67 65 29 3b 0a 20 20 20 20 20 20 74  &nPage);.      t
1f130 65 73 74 63 61 73 65 28 20 70 42 74 2d 3e 6e 50  estcase( pBt->nP
1f140 61 67 65 21 3d 6e 50 61 67 65 20 29 3b 0a 20 20  age!=nPage );.  
1f150 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d      pBt->nPage =
1f160 20 6e 50 61 67 65 3b 0a 20 20 20 20 20 20 72 65   nPage;.      re
1f170 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65 31  leasePage(pPage1
1f180 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  );.    }.    ass
1f190 65 72 74 28 20 63 6f 75 6e 74 56 61 6c 69 64 43  ert( countValidC
1f1a0 75 72 73 6f 72 73 28 70 42 74 2c 20 31 29 3d 3d  ursors(pBt, 1)==
1f1b0 30 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e  0 );.    pBt->in
1f1c0 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52  Transaction = TR
1f1d0 41 4e 53 5f 52 45 41 44 3b 0a 20 20 20 20 62 74  ANS_READ;.    bt
1f1e0 72 65 65 43 6c 65 61 72 48 61 73 43 6f 6e 74 65  reeClearHasConte
1f1f0 6e 74 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 20 20  nt(pBt);.  }..  
1f200 62 74 72 65 65 45 6e 64 54 72 61 6e 73 61 63 74  btreeEndTransact
1f210 69 6f 6e 28 70 29 3b 0a 20 20 73 71 6c 69 74 65  ion(p);.  sqlite
1f220 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
1f230 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1f240 2f 2a 0a 2a 2a 20 53 74 61 72 74 20 61 20 73 74  /*.** Start a st
1f250 61 74 65 6d 65 6e 74 20 73 75 62 74 72 61 6e 73  atement subtrans
1f260 61 63 74 69 6f 6e 2e 20 54 68 65 20 73 75 62 74  action. The subt
1f270 72 61 6e 73 61 63 74 69 6f 6e 20 63 61 6e 20 62  ransaction can b
1f280 65 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b  e rolled.** back
1f290 20 69 6e 64 65 70 65 6e 64 65 6e 74 6c 79 20 6f   independently o
1f2a0 66 20 74 68 65 20 6d 61 69 6e 20 74 72 61 6e 73  f the main trans
1f2b0 61 63 74 69 6f 6e 2e 20 59 6f 75 20 6d 75 73 74  action. You must
1f2c0 20 73 74 61 72 74 20 61 20 74 72 61 6e 73 61 63   start a transac
1f2d0 74 69 6f 6e 20 0a 2a 2a 20 62 65 66 6f 72 65 20  tion .** before 
1f2e0 73 74 61 72 74 69 6e 67 20 61 20 73 75 62 74 72  starting a subtr
1f2f0 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 73  ansaction. The s
1f300 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  ubtransaction is
1f310 20 65 6e 64 65 64 20 61 75 74 6f 6d 61 74 69 63   ended automatic
1f320 61 6c 6c 79 20 0a 2a 2a 20 69 66 20 74 68 65 20  ally .** if the 
1f330 6d 61 69 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e  main transaction
1f340 20 63 6f 6d 6d 69 74 73 20 6f 72 20 72 6f 6c 6c   commits or roll
1f350 73 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 74  s back..**.** St
1f360 61 74 65 6d 65 6e 74 20 73 75 62 74 72 61 6e 73  atement subtrans
1f370 61 63 74 69 6f 6e 73 20 61 72 65 20 75 73 65 64  actions are used
1f380 20 61 72 6f 75 6e 64 20 69 6e 64 69 76 69 64 75   around individu
1f390 61 6c 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  al SQL statement
1f3a0 73 0a 2a 2a 20 74 68 61 74 20 61 72 65 20 63 6f  s.** that are co
1f3b0 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e 20 61  ntained within a
1f3c0 20 42 45 47 49 4e 2e 2e 2e 43 4f 4d 4d 49 54 20   BEGIN...COMMIT 
1f3d0 62 6c 6f 63 6b 2e 20 20 49 66 20 61 20 63 6f 6e  block.  If a con
1f3e0 73 74 72 61 69 6e 74 0a 2a 2a 20 65 72 72 6f 72  straint.** error
1f3f0 20 6f 63 63 75 72 73 20 77 69 74 68 69 6e 20 74   occurs within t
1f400 68 65 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68  he statement, th
1f410 65 20 65 66 66 65 63 74 20 6f 66 20 74 68 61 74  e effect of that
1f420 20 6f 6e 65 20 73 74 61 74 65 6d 65 6e 74 0a 2a   one statement.*
1f430 2a 20 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64 20  * can be rolled 
1f440 62 61 63 6b 20 77 69 74 68 6f 75 74 20 68 61 76  back without hav
1f450 69 6e 67 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20  ing to rollback 
1f460 74 68 65 20 65 6e 74 69 72 65 20 74 72 61 6e 73  the entire trans
1f470 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20  action..**.** A 
1f480 73 74 61 74 65 6d 65 6e 74 20 73 75 62 2d 74 72  statement sub-tr
1f490 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 69 6d 70  ansaction is imp
1f4a0 6c 65 6d 65 6e 74 65 64 20 61 73 20 61 6e 20 61  lemented as an a
1f4b0 6e 6f 6e 79 6d 6f 75 73 20 73 61 76 65 70 6f 69  nonymous savepoi
1f4c0 6e 74 2e 20 54 68 65 0a 2a 2a 20 76 61 6c 75 65  nt. The.** value
1f4d0 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73   passed as the s
1f4e0 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65 72 20  econd parameter 
1f4f0 69 73 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d  is the total num
1f500 62 65 72 20 6f 66 20 73 61 76 65 70 6f 69 6e 74  ber of savepoint
1f510 73 2c 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20  s,.** including 
1f520 74 68 65 20 6e 65 77 20 61 6e 6f 6e 79 6d 6f 75  the new anonymou
1f530 73 20 73 61 76 65 70 6f 69 6e 74 2c 20 6f 70 65  s savepoint, ope
1f540 6e 20 6f 6e 20 74 68 65 20 42 2d 54 72 65 65 2e  n on the B-Tree.
1f550 20 69 2e 65 2e 20 69 66 20 74 68 65 72 65 0a 2a   i.e. if there.*
1f560 2a 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20  * are no active 
1f570 73 61 76 65 70 6f 69 6e 74 73 20 61 6e 64 20 6e  savepoints and n
1f580 6f 20 6f 74 68 65 72 20 73 74 61 74 65 6d 65 6e  o other statemen
1f590 74 2d 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 6f  t-transactions o
1f5a0 70 65 6e 2c 0a 2a 2a 20 69 53 74 61 74 65 6d 65  pen,.** iStateme
1f5b0 6e 74 20 69 73 20 31 2e 20 54 68 69 73 20 61 6e  nt is 1. This an
1f5c0 6f 6e 79 6d 6f 75 73 20 73 61 76 65 70 6f 69 6e  onymous savepoin
1f5d0 74 20 63 61 6e 20 62 65 20 72 65 6c 65 61 73 65  t can be release
1f5e0 64 20 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63 6b  d or rolled back
1f5f0 0a 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 73 71  .** using the sq
1f600 6c 69 74 65 33 42 74 72 65 65 53 61 76 65 70 6f  lite3BtreeSavepo
1f610 69 6e 74 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a  int() function..
1f620 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
1f630 72 65 65 42 65 67 69 6e 53 74 6d 74 28 42 74 72  reeBeginStmt(Btr
1f640 65 65 20 2a 70 2c 20 69 6e 74 20 69 53 74 61 74  ee *p, int iStat
1f650 65 6d 65 6e 74 29 7b 0a 20 20 69 6e 74 20 72 63  ement){.  int rc
1f660 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
1f670 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 73 71  t = p->pBt;.  sq
1f680 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
1f690 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d  p);.  assert( p-
1f6a0 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
1f6b0 57 52 49 54 45 20 29 3b 0a 20 20 61 73 73 65 72  WRITE );.  asser
1f6c0 74 28 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67  t( (pBt->btsFlag
1f6d0 73 20 26 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c  s & BTS_READ_ONL
1f6e0 59 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  Y)==0 );.  asser
1f6f0 74 28 20 69 53 74 61 74 65 6d 65 6e 74 3e 30 20  t( iStatement>0 
1f700 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 53 74  );.  assert( iSt
1f710 61 74 65 6d 65 6e 74 3e 70 2d 3e 64 62 2d 3e 6e  atement>p->db->n
1f720 53 61 76 65 70 6f 69 6e 74 20 29 3b 0a 20 20 61  Savepoint );.  a
1f730 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72  ssert( pBt->inTr
1f740 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53  ansaction==TRANS
1f750 5f 57 52 49 54 45 20 29 3b 0a 20 20 2f 2a 20 41  _WRITE );.  /* A
1f760 74 20 74 68 65 20 70 61 67 65 72 20 6c 65 76 65  t the pager leve
1f770 6c 2c 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74  l, a statement t
1f780 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 20  ransaction is a 
1f790 73 61 76 65 70 6f 69 6e 74 20 77 69 74 68 0a 20  savepoint with. 
1f7a0 20 2a 2a 20 61 6e 20 69 6e 64 65 78 20 67 72 65   ** an index gre
1f7b0 61 74 65 72 20 74 68 61 6e 20 61 6c 6c 20 73 61  ater than all sa
1f7c0 76 65 70 6f 69 6e 74 73 20 63 72 65 61 74 65 64  vepoints created
1f7d0 20 65 78 70 6c 69 63 69 74 6c 79 20 75 73 69 6e   explicitly usin
1f7e0 67 0a 20 20 2a 2a 20 53 51 4c 20 73 74 61 74 65  g.  ** SQL state
1f7f0 6d 65 6e 74 73 2e 20 49 74 20 69 73 20 69 6c 6c  ments. It is ill
1f800 65 67 61 6c 20 74 6f 20 6f 70 65 6e 2c 20 72 65  egal to open, re
1f810 6c 65 61 73 65 20 6f 72 20 72 6f 6c 6c 62 61 63  lease or rollbac
1f820 6b 20 61 6e 79 0a 20 20 2a 2a 20 73 75 63 68 20  k any.  ** such 
1f830 73 61 76 65 70 6f 69 6e 74 73 20 77 68 69 6c 65  savepoints while
1f840 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74   the statement t
1f850 72 61 6e 73 61 63 74 69 6f 6e 20 73 61 76 65 70  ransaction savep
1f860 6f 69 6e 74 20 69 73 20 61 63 74 69 76 65 2e 0a  oint is active..
1f870 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69    */.  rc = sqli
1f880 74 65 33 50 61 67 65 72 4f 70 65 6e 53 61 76 65  te3PagerOpenSave
1f890 70 6f 69 6e 74 28 70 42 74 2d 3e 70 50 61 67 65  point(pBt->pPage
1f8a0 72 2c 20 69 53 74 61 74 65 6d 65 6e 74 29 3b 0a  r, iStatement);.
1f8b0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
1f8c0 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
1f8d0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
1f8e0 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
1f8f0 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69  t to this functi
1f900 6f 6e 2c 20 6f 70 2c 20 69 73 20 61 6c 77 61 79  on, op, is alway
1f910 73 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  s SAVEPOINT_ROLL
1f920 42 41 43 4b 0a 2a 2a 20 6f 72 20 53 41 56 45 50  BACK.** or SAVEP
1f930 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2e 20 54 68  OINT_RELEASE. Th
1f940 69 73 20 66 75 6e 63 74 69 6f 6e 20 65 69 74 68  is function eith
1f950 65 72 20 72 65 6c 65 61 73 65 73 20 6f 72 20 72  er releases or r
1f960 6f 6c 6c 73 20 62 61 63 6b 20 74 68 65 0a 2a 2a  olls back the.**
1f970 20 73 61 76 65 70 6f 69 6e 74 20 69 64 65 6e 74   savepoint ident
1f980 69 66 69 65 64 20 62 79 20 70 61 72 61 6d 65 74  ified by paramet
1f990 65 72 20 69 53 61 76 65 70 6f 69 6e 74 2c 20 64  er iSavepoint, d
1f9a0 65 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20  epending on the 
1f9b0 76 61 6c 75 65 20 0a 2a 2a 20 6f 66 20 6f 70 2e  value .** of op.
1f9c0 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c  .**.** Normally,
1f9d0 20 69 53 61 76 65 70 6f 69 6e 74 20 69 73 20 67   iSavepoint is g
1f9e0 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65  reater than or e
1f9f0 71 75 61 6c 20 74 6f 20 7a 65 72 6f 2e 20 48 6f  qual to zero. Ho
1fa00 77 65 76 65 72 2c 20 69 66 20 6f 70 20 69 73 0a  wever, if op is.
1fa10 2a 2a 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  ** SAVEPOINT_ROL
1fa20 4c 42 41 43 4b 2c 20 74 68 65 6e 20 69 53 61 76  LBACK, then iSav
1fa30 65 70 6f 69 6e 74 20 6d 61 79 20 61 6c 73 6f 20  epoint may also 
1fa40 62 65 20 2d 31 2e 20 49 6e 20 74 68 69 73 20 63  be -1. In this c
1fa50 61 73 65 20 74 68 65 20 0a 2a 2a 20 63 6f 6e 74  ase the .** cont
1fa60 65 6e 74 73 20 6f 66 20 74 68 65 20 65 6e 74 69  ents of the enti
1fa70 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61  re transaction a
1fa80 72 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20  re rolled back. 
1fa90 54 68 69 73 20 69 73 20 64 69 66 66 65 72 65 6e  This is differen
1faa0 74 0a 2a 2a 20 66 72 6f 6d 20 61 20 6e 6f 72 6d  t.** from a norm
1fab0 61 6c 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 72  al transaction r
1fac0 6f 6c 6c 62 61 63 6b 2c 20 61 73 20 6e 6f 20 6c  ollback, as no l
1fad0 6f 63 6b 73 20 61 72 65 20 72 65 6c 65 61 73 65  ocks are release
1fae0 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20 74 72 61  d and the.** tra
1faf0 6e 73 61 63 74 69 6f 6e 20 72 65 6d 61 69 6e 73  nsaction remains
1fb00 20 6f 70 65 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71   open..*/.int sq
1fb10 6c 69 74 65 33 42 74 72 65 65 53 61 76 65 70 6f  lite3BtreeSavepo
1fb20 69 6e 74 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  int(Btree *p, in
1fb30 74 20 6f 70 2c 20 69 6e 74 20 69 53 61 76 65 70  t op, int iSavep
1fb40 6f 69 6e 74 29 7b 0a 20 20 69 6e 74 20 72 63 20  oint){.  int rc 
1fb50 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
1fb60 66 28 20 70 20 26 26 20 70 2d 3e 69 6e 54 72 61  f( p && p->inTra
1fb70 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  ns==TRANS_WRITE 
1fb80 29 7b 0a 20 20 20 20 42 74 53 68 61 72 65 64 20  ){.    BtShared 
1fb90 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
1fba0 20 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 53     assert( op==S
1fbb0 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45  AVEPOINT_RELEASE
1fbc0 20 7c 7c 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e   || op==SAVEPOIN
1fbd0 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 3b 0a 20 20  T_ROLLBACK );.  
1fbe0 20 20 61 73 73 65 72 74 28 20 69 53 61 76 65 70    assert( iSavep
1fbf0 6f 69 6e 74 3e 3d 30 20 7c 7c 20 28 69 53 61 76  oint>=0 || (iSav
1fc00 65 70 6f 69 6e 74 3d 3d 2d 31 20 26 26 20 6f 70  epoint==-1 && op
1fc10 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  ==SAVEPOINT_ROLL
1fc20 42 41 43 4b 29 20 29 3b 0a 20 20 20 20 73 71 6c  BACK) );.    sql
1fc30 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
1fc40 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
1fc50 74 65 33 50 61 67 65 72 53 61 76 65 70 6f 69 6e  te3PagerSavepoin
1fc60 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6f  t(pBt->pPager, o
1fc70 70 2c 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a  p, iSavepoint);.
1fc80 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1fc90 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69  TE_OK ){.      i
1fca0 66 28 20 69 53 61 76 65 70 6f 69 6e 74 3c 30 20  f( iSavepoint<0 
1fcb0 26 26 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67  && (pBt->btsFlag
1fcc0 73 20 26 20 42 54 53 5f 49 4e 49 54 49 41 4c 4c  s & BTS_INITIALL
1fcd0 59 5f 45 4d 50 54 59 29 21 3d 30 20 29 7b 0a 20  Y_EMPTY)!=0 ){. 
1fce0 20 20 20 20 20 20 20 70 42 74 2d 3e 6e 50 61 67         pBt->nPag
1fcf0 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  e = 0;.      }. 
1fd00 20 20 20 20 20 72 63 20 3d 20 6e 65 77 44 61 74       rc = newDat
1fd10 61 62 61 73 65 28 70 42 74 29 3b 0a 20 20 20 20  abase(pBt);.    
1fd20 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 67    pBt->nPage = g
1fd30 65 74 34 62 79 74 65 28 32 38 20 2b 20 70 42 74  et4byte(28 + pBt
1fd40 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 29  ->pPage1->aData)
1fd50 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ;..      /* The 
1fd60 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 77 61  database size wa
1fd70 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74  s written into t
1fd80 68 65 20 6f 66 66 73 65 74 20 32 38 20 6f 66 20  he offset 28 of 
1fd90 74 68 65 20 68 65 61 64 65 72 0a 20 20 20 20 20  the header.     
1fda0 20 2a 2a 20 77 68 65 6e 20 74 68 65 20 74 72 61   ** when the tra
1fdb0 6e 73 61 63 74 69 6f 6e 20 73 74 61 72 74 65 64  nsaction started
1fdc0 2c 20 73 6f 20 77 65 20 6b 6e 6f 77 20 74 68 61  , so we know tha
1fdd0 74 20 74 68 65 20 76 61 6c 75 65 20 61 74 20 6f  t the value at o
1fde0 66 66 73 65 74 0a 20 20 20 20 20 20 2a 2a 20 32  ffset.      ** 2
1fdf0 38 20 69 73 20 6e 6f 6e 7a 65 72 6f 2e 20 2a 2f  8 is nonzero. */
1fe00 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1fe10 42 74 2d 3e 6e 50 61 67 65 3e 30 20 29 3b 0a 20  Bt->nPage>0 );. 
1fe20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
1fe30 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
1fe40 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
1fe50 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20  }../*.** Create 
1fe60 61 20 6e 65 77 20 63 75 72 73 6f 72 20 66 6f 72  a new cursor for
1fe70 20 74 68 65 20 42 54 72 65 65 20 77 68 6f 73 65   the BTree whose
1fe80 20 72 6f 6f 74 20 69 73 20 6f 6e 20 74 68 65 20   root is on the 
1fe90 70 61 67 65 0a 2a 2a 20 69 54 61 62 6c 65 2e 20  page.** iTable. 
1fea0 49 66 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 63  If a read-only c
1feb0 75 72 73 6f 72 20 69 73 20 72 65 71 75 65 73 74  ursor is request
1fec0 65 64 2c 20 69 74 20 69 73 20 61 73 73 75 6d 65  ed, it is assume
1fed0 64 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 63 61  d that.** the ca
1fee0 6c 6c 65 72 20 61 6c 72 65 61 64 79 20 68 61 73  ller already has
1fef0 20 61 74 20 6c 65 61 73 74 20 61 20 72 65 61 64   at least a read
1ff00 2d 6f 6e 6c 79 20 74 72 61 6e 73 61 63 74 69 6f  -only transactio
1ff10 6e 20 6f 70 65 6e 0a 2a 2a 20 6f 6e 20 74 68 65  n open.** on the
1ff20 20 64 61 74 61 62 61 73 65 20 61 6c 72 65 61 64   database alread
1ff30 79 2e 20 49 66 20 61 20 77 72 69 74 65 2d 63 75  y. If a write-cu
1ff40 72 73 6f 72 20 69 73 20 72 65 71 75 65 73 74 65  rsor is requeste
1ff50 64 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 63  d, then.** the c
1ff60 61 6c 6c 65 72 20 69 73 20 61 73 73 75 6d 65 64  aller is assumed
1ff70 20 74 6f 20 68 61 76 65 20 61 6e 20 6f 70 65 6e   to have an open
1ff80 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
1ff90 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77 72 46  on..**.** If wrF
1ffa0 6c 61 67 3d 3d 30 2c 20 74 68 65 6e 20 74 68 65  lag==0, then the
1ffb0 20 63 75 72 73 6f 72 20 63 61 6e 20 6f 6e 6c 79   cursor can only
1ffc0 20 62 65 20 75 73 65 64 20 66 6f 72 20 72 65 61   be used for rea
1ffd0 64 69 6e 67 2e 0a 2a 2a 20 49 66 20 77 72 46 6c  ding..** If wrFl
1ffe0 61 67 3d 3d 31 2c 20 74 68 65 6e 20 74 68 65 20  ag==1, then the 
1fff0 63 75 72 73 6f 72 20 63 61 6e 20 62 65 20 75 73  cursor can be us
20000 65 64 20 66 6f 72 20 72 65 61 64 69 6e 67 20 6f  ed for reading o
20010 72 20 66 6f 72 0a 2a 2a 20 77 72 69 74 69 6e 67  r for.** writing
20020 20 69 66 20 6f 74 68 65 72 20 63 6f 6e 64 69 74   if other condit
20030 69 6f 6e 73 20 66 6f 72 20 77 72 69 74 69 6e 67  ions for writing
20040 20 61 72 65 20 61 6c 73 6f 20 6d 65 74 2e 20 20   are also met.  
20050 54 68 65 73 65 0a 2a 2a 20 61 72 65 20 74 68 65  These.** are the
20060 20 63 6f 6e 64 69 74 69 6f 6e 73 20 74 68 61 74   conditions that
20070 20 6d 75 73 74 20 62 65 20 6d 65 74 20 69 6e 20   must be met in 
20080 6f 72 64 65 72 20 66 6f 72 20 77 72 69 74 69 6e  order for writin
20090 67 20 74 6f 0a 2a 2a 20 62 65 20 61 6c 6c 6f 77  g to.** be allow
200a0 65 64 3a 0a 2a 2a 0a 2a 2a 20 31 3a 20 20 54 68  ed:.**.** 1:  Th
200b0 65 20 63 75 72 73 6f 72 20 6d 75 73 74 20 68 61  e cursor must ha
200c0 76 65 20 62 65 65 6e 20 6f 70 65 6e 65 64 20 77  ve been opened w
200d0 69 74 68 20 77 72 46 6c 61 67 3d 3d 31 0a 2a 2a  ith wrFlag==1.**
200e0 0a 2a 2a 20 32 3a 20 20 4f 74 68 65 72 20 64 61  .** 2:  Other da
200f0 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
20100 6e 73 20 74 68 61 74 20 73 68 61 72 65 20 74 68  ns that share th
20110 65 20 73 61 6d 65 20 70 61 67 65 72 20 63 61 63  e same pager cac
20120 68 65 0a 2a 2a 20 20 20 20 20 62 75 74 20 77 68  he.**     but wh
20130 69 63 68 20 61 72 65 20 6e 6f 74 20 69 6e 20 74  ich are not in t
20140 68 65 20 52 45 41 44 5f 55 4e 43 4f 4d 4d 49 54  he READ_UNCOMMIT
20150 54 45 44 20 73 74 61 74 65 20 6d 61 79 20 6e 6f  TED state may no
20160 74 20 68 61 76 65 0a 2a 2a 20 20 20 20 20 63 75  t have.**     cu
20170 72 73 6f 72 73 20 6f 70 65 6e 20 77 69 74 68 20  rsors open with 
20180 77 72 46 6c 61 67 3d 3d 30 20 6f 6e 20 74 68 65  wrFlag==0 on the
20190 20 73 61 6d 65 20 74 61 62 6c 65 2e 20 20 4f 74   same table.  Ot
201a0 68 65 72 77 69 73 65 0a 2a 2a 20 20 20 20 20 74  herwise.**     t
201b0 68 65 20 63 68 61 6e 67 65 73 20 6d 61 64 65 20  he changes made 
201c0 62 79 20 74 68 69 73 20 77 72 69 74 65 20 63 75  by this write cu
201d0 72 73 6f 72 20 77 6f 75 6c 64 20 62 65 20 76 69  rsor would be vi
201e0 73 69 62 6c 65 20 74 6f 0a 2a 2a 20 20 20 20 20  sible to.**     
201f0 74 68 65 20 72 65 61 64 20 63 75 72 73 6f 72 73  the read cursors
20200 20 69 6e 20 74 68 65 20 6f 74 68 65 72 20 64 61   in the other da
20210 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
20220 6e 2e 0a 2a 2a 0a 2a 2a 20 33 3a 20 20 54 68 65  n..**.** 3:  The
20230 20 64 61 74 61 62 61 73 65 20 6d 75 73 74 20 62   database must b
20240 65 20 77 72 69 74 61 62 6c 65 20 28 6e 6f 74 20  e writable (not 
20250 6f 6e 20 72 65 61 64 2d 6f 6e 6c 79 20 6d 65 64  on read-only med
20260 69 61 29 0a 2a 2a 0a 2a 2a 20 34 3a 20 20 54 68  ia).**.** 4:  Th
20270 65 72 65 20 6d 75 73 74 20 62 65 20 61 6e 20 61  ere must be an a
20280 63 74 69 76 65 20 74 72 61 6e 73 61 63 74 69 6f  ctive transactio
20290 6e 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 20 63 68 65 63  n..**.** No chec
202a0 6b 69 6e 67 20 69 73 20 64 6f 6e 65 20 74 6f 20  king is done to 
202b0 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 70  make sure that p
202c0 61 67 65 20 69 54 61 62 6c 65 20 72 65 61 6c 6c  age iTable reall
202d0 79 20 69 73 20 74 68 65 0a 2a 2a 20 72 6f 6f 74  y is the.** root
202e0 20 70 61 67 65 20 6f 66 20 61 20 62 2d 74 72 65   page of a b-tre
202f0 65 2e 20 20 49 66 20 69 74 20 69 73 20 6e 6f 74  e.  If it is not
20300 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f  , then the curso
20310 72 20 61 63 71 75 69 72 65 64 0a 2a 2a 20 77 69  r acquired.** wi
20320 6c 6c 20 6e 6f 74 20 77 6f 72 6b 20 63 6f 72 72  ll not work corr
20330 65 63 74 6c 79 2e 0a 2a 2a 0a 2a 2a 20 49 74 20  ectly..**.** It 
20340 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 20  is assumed that 
20350 74 68 65 20 73 71 6c 69 74 65 33 42 74 72 65 65  the sqlite3Btree
20360 43 75 72 73 6f 72 5a 65 72 6f 28 29 20 68 61 73  CursorZero() has
20370 20 62 65 65 6e 20 63 61 6c 6c 65 64 0a 2a 2a 20   been called.** 
20380 6f 6e 20 70 43 75 72 20 74 6f 20 69 6e 69 74 69  on pCur to initi
20390 61 6c 69 7a 65 20 74 68 65 20 6d 65 6d 6f 72 79  alize the memory
203a0 20 73 70 61 63 65 20 70 72 69 6f 72 20 74 6f 20   space prior to 
203b0 69 6e 76 6f 6b 69 6e 67 20 74 68 69 73 20 72 6f  invoking this ro
203c0 75 74 69 6e 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  utine..*/.static
203d0 20 69 6e 74 20 62 74 72 65 65 43 75 72 73 6f 72   int btreeCursor
203e0 28 0a 20 20 42 74 72 65 65 20 2a 70 2c 20 20 20  (.  Btree *p,   
203f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20400 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
20410 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74  e btree */.  int
20420 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20   iTable,        
20430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20440 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65      /* Root page
20450 20 6f 66 20 74 61 62 6c 65 20 74 6f 20 6f 70 65   of table to ope
20460 6e 20 2a 2f 0a 20 20 69 6e 74 20 77 72 46 6c 61  n */.  int wrFla
20470 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g,              
20480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
20490 20 31 20 74 6f 20 77 72 69 74 65 2e 20 30 20 72   1 to write. 0 r
204a0 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74  ead-only */.  st
204b0 72 75 63 74 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  ruct KeyInfo *pK
204c0 65 79 49 6e 66 6f 2c 20 20 20 20 20 20 20 20 20  eyInfo,         
204d0 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72       /* First ar
204e0 67 20 74 6f 20 63 6f 6d 70 61 72 69 73 6f 6e 20  g to comparison 
204f0 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 42 74  function */.  Bt
20500 43 75 72 73 6f 72 20 2a 70 43 75 72 20 20 20 20  Cursor *pCur    
20510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20520 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20 66 6f       /* Space fo
20530 72 20 6e 65 77 20 63 75 72 73 6f 72 20 2a 2f 0a  r new cursor */.
20540 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
20550 42 74 20 3d 20 70 2d 3e 70 42 74 3b 20 20 20 20  Bt = p->pBt;    
20560 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
20570 68 61 72 65 64 20 62 2d 74 72 65 65 20 68 61 6e  hared b-tree han
20580 64 6c 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  dle */..  assert
20590 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f  ( sqlite3BtreeHo
205a0 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20  ldsMutex(p) );. 
205b0 20 61 73 73 65 72 74 28 20 77 72 46 6c 61 67 3d   assert( wrFlag=
205c0 3d 30 20 7c 7c 20 77 72 46 6c 61 67 3d 3d 31 20  =0 || wrFlag==1 
205d0 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c  );..  /* The fol
205e0 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 20 73 74  lowing assert st
205f0 61 74 65 6d 65 6e 74 73 20 76 65 72 69 66 79 20  atements verify 
20600 74 68 61 74 20 69 66 20 74 68 69 73 20 69 73 20  that if this is 
20610 61 20 73 68 61 72 61 62 6c 65 20 0a 20 20 2a 2a  a sharable .  **
20620 20 62 2d 74 72 65 65 20 64 61 74 61 62 61 73 65   b-tree database
20630 2c 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  , the connection
20640 20 69 73 20 68 6f 6c 64 69 6e 67 20 74 68 65 20   is holding the 
20650 72 65 71 75 69 72 65 64 20 74 61 62 6c 65 20 6c  required table l
20660 6f 63 6b 73 2c 20 0a 20 20 2a 2a 20 61 6e 64 20  ocks, .  ** and 
20670 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 63 6f  that no other co
20680 6e 6e 65 63 74 69 6f 6e 20 68 61 73 20 61 6e 79  nnection has any
20690 20 6f 70 65 6e 20 63 75 72 73 6f 72 20 74 68 61   open cursor tha
206a0 74 20 63 6f 6e 66 6c 69 63 74 73 20 77 69 74 68  t conflicts with
206b0 20 0a 20 20 2a 2a 20 74 68 69 73 20 6c 6f 63 6b   .  ** this lock
206c0 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
206d0 68 61 73 53 68 61 72 65 64 43 61 63 68 65 54 61  hasSharedCacheTa
206e0 62 6c 65 4c 6f 63 6b 28 70 2c 20 69 54 61 62 6c  bleLock(p, iTabl
206f0 65 2c 20 70 4b 65 79 49 6e 66 6f 21 3d 30 2c 20  e, pKeyInfo!=0, 
20700 77 72 46 6c 61 67 2b 31 29 20 29 3b 0a 20 20 61  wrFlag+1) );.  a
20710 73 73 65 72 74 28 20 77 72 46 6c 61 67 3d 3d 30  ssert( wrFlag==0
20720 20 7c 7c 20 21 68 61 73 52 65 61 64 43 6f 6e 66   || !hasReadConf
20730 6c 69 63 74 73 28 70 2c 20 69 54 61 62 6c 65 29  licts(p, iTable)
20740 20 29 3b 0a 0a 20 20 2f 2a 20 41 73 73 65 72 74   );..  /* Assert
20750 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72   that the caller
20760 20 68 61 73 20 6f 70 65 6e 65 64 20 74 68 65 20   has opened the 
20770 72 65 71 75 69 72 65 64 20 74 72 61 6e 73 61 63  required transac
20780 74 69 6f 6e 2e 20 2a 2f 0a 20 20 61 73 73 65 72  tion. */.  asser
20790 74 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 54 52  t( p->inTrans>TR
207a0 41 4e 53 5f 4e 4f 4e 45 20 29 3b 0a 20 20 61 73  ANS_NONE );.  as
207b0 73 65 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20  sert( wrFlag==0 
207c0 7c 7c 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  || p->inTrans==T
207d0 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20  RANS_WRITE );.  
207e0 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70 50 61  assert( pBt->pPa
207f0 67 65 31 20 26 26 20 70 42 74 2d 3e 70 50 61 67  ge1 && pBt->pPag
20800 65 31 2d 3e 61 44 61 74 61 20 29 3b 0a 0a 20 20  e1->aData );..  
20810 69 66 28 20 4e 45 56 45 52 28 77 72 46 6c 61 67  if( NEVER(wrFlag
20820 20 26 26 20 28 70 42 74 2d 3e 62 74 73 46 6c 61   && (pBt->btsFla
20830 67 73 20 26 20 42 54 53 5f 52 45 41 44 5f 4f 4e  gs & BTS_READ_ON
20840 4c 59 29 21 3d 30 29 20 29 7b 0a 20 20 20 20 72  LY)!=0) ){.    r
20850 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41  eturn SQLITE_REA
20860 44 4f 4e 4c 59 3b 0a 20 20 7d 0a 20 20 69 66 28  DONLY;.  }.  if(
20870 20 77 72 46 6c 61 67 20 29 7b 0a 20 20 20 20 61   wrFlag ){.    a
20880 6c 6c 6f 63 61 74 65 54 65 6d 70 53 70 61 63 65  llocateTempSpace
20890 28 70 42 74 29 3b 0a 20 20 20 20 69 66 28 20 70  (pBt);.    if( p
208a0 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 3d 3d 30  Bt->pTmpSpace==0
208b0 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
208c0 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 69 66  _NOMEM;.  }.  if
208d0 28 20 69 54 61 62 6c 65 3d 3d 31 20 26 26 20 62  ( iTable==1 && b
208e0 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42  treePagecount(pB
208f0 74 29 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73  t)==0 ){.    ass
20900 65 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 29  ert( wrFlag==0 )
20910 3b 0a 20 20 20 20 69 54 61 62 6c 65 20 3d 20 30  ;.    iTable = 0
20920 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20  ;.  }..  /* Now 
20930 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 65 72  that no other er
20940 72 6f 72 73 20 63 61 6e 20 6f 63 63 75 72 2c 20  rors can occur, 
20950 66 69 6e 69 73 68 20 66 69 6c 6c 69 6e 67 20 69  finish filling i
20960 6e 20 74 68 65 20 42 74 43 75 72 73 6f 72 0a 20  n the BtCursor. 
20970 20 2a 2a 20 76 61 72 69 61 62 6c 65 73 20 61 6e   ** variables an
20980 64 20 6c 69 6e 6b 20 74 68 65 20 63 75 72 73 6f  d link the curso
20990 72 20 69 6e 74 6f 20 74 68 65 20 42 74 53 68 61  r into the BtSha
209a0 72 65 64 20 6c 69 73 74 2e 20 20 2a 2f 0a 20 20  red list.  */.  
209b0 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20 3d  pCur->pgnoRoot =
209c0 20 28 50 67 6e 6f 29 69 54 61 62 6c 65 3b 0a 20   (Pgno)iTable;. 
209d0 20 70 43 75 72 2d 3e 69 50 61 67 65 20 3d 20 2d   pCur->iPage = -
209e0 31 3b 0a 20 20 70 43 75 72 2d 3e 70 4b 65 79 49  1;.  pCur->pKeyI
209f0 6e 66 6f 20 3d 20 70 4b 65 79 49 6e 66 6f 3b 0a  nfo = pKeyInfo;.
20a00 20 20 70 43 75 72 2d 3e 70 42 74 72 65 65 20 3d    pCur->pBtree =
20a10 20 70 3b 0a 20 20 70 43 75 72 2d 3e 70 42 74 20   p;.  pCur->pBt 
20a20 3d 20 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28  = pBt;.  assert(
20a30 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20 77 72   wrFlag==0 || wr
20a40 46 6c 61 67 3d 3d 42 54 43 46 5f 57 72 69 74 65  Flag==BTCF_Write
20a50 46 6c 61 67 20 29 3b 0a 20 20 70 43 75 72 2d 3e  Flag );.  pCur->
20a60 63 75 72 46 6c 61 67 73 20 3d 20 77 72 46 6c 61  curFlags = wrFla
20a70 67 3b 0a 20 20 70 43 75 72 2d 3e 70 4e 65 78 74  g;.  pCur->pNext
20a80 20 3d 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b   = pBt->pCursor;
20a90 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 70 4e 65  .  if( pCur->pNe
20aa0 78 74 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e  xt ){.    pCur->
20ab0 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70  pNext->pPrev = p
20ac0 43 75 72 3b 0a 20 20 7d 0a 20 20 70 42 74 2d 3e  Cur;.  }.  pBt->
20ad0 70 43 75 72 73 6f 72 20 3d 20 70 43 75 72 3b 0a  pCursor = pCur;.
20ae0 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
20af0 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b   CURSOR_INVALID;
20b00 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
20b10 5f 4f 4b 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74  _OK;.}.int sqlit
20b20 65 33 42 74 72 65 65 43 75 72 73 6f 72 28 0a 20  e3BtreeCursor(. 
20b30 20 42 74 72 65 65 20 2a 70 2c 20 20 20 20 20 20   Btree *p,      
20b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20b50 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20b60 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 69  The btree */.  i
20b70 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20  nt iTable,      
20b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20b90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f             /* Ro
20ba0 6f 74 20 70 61 67 65 20 6f 66 20 74 61 62 6c 65  ot page of table
20bb0 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e   to open */.  in
20bc0 74 20 77 72 46 6c 61 67 2c 20 20 20 20 20 20 20  t wrFlag,       
20bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20be0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20 74            /* 1 t
20bf0 6f 20 77 72 69 74 65 2e 20 30 20 72 65 61 64 2d  o write. 0 read-
20c00 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74 72 75 63 74  only */.  struct
20c10 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
20c20 66 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  fo,             
20c30 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61        /* First a
20c40 72 67 20 74 6f 20 78 43 6f 6d 70 61 72 65 28 29  rg to xCompare()
20c50 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72 20 2a   */.  BtCursor *
20c60 70 43 75 72 20 20 20 20 20 20 20 20 20 20 20 20  pCur            
20c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20c80 20 20 2f 2a 20 57 72 69 74 65 20 6e 65 77 20 63    /* Write new c
20c90 75 72 73 6f 72 20 68 65 72 65 20 2a 2f 0a 29 7b  ursor here */.){
20ca0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c  .  int rc;.  sql
20cb0 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
20cc0 29 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65 43  );.  rc = btreeC
20cd0 75 72 73 6f 72 28 70 2c 20 69 54 61 62 6c 65 2c  ursor(p, iTable,
20ce0 20 77 72 46 6c 61 67 2c 20 70 4b 65 79 49 6e 66   wrFlag, pKeyInf
20cf0 6f 2c 20 70 43 75 72 29 3b 0a 20 20 73 71 6c 69  o, pCur);.  sqli
20d00 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
20d10 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
20d20 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
20d30 68 65 20 73 69 7a 65 20 6f 66 20 61 20 42 74 43  he size of a BtC
20d40 75 72 73 6f 72 20 6f 62 6a 65 63 74 20 69 6e 20  ursor object in 
20d50 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  bytes..**.** Thi
20d60 73 20 69 6e 74 65 72 66 61 63 65 73 20 69 73 20  s interfaces is 
20d70 6e 65 65 64 65 64 20 73 6f 20 74 68 61 74 20 75  needed so that u
20d80 73 65 72 73 20 6f 66 20 63 75 72 73 6f 72 73 20  sers of cursors 
20d90 63 61 6e 20 70 72 65 61 6c 6c 6f 63 61 74 65 0a  can preallocate.
20da0 2a 2a 20 73 75 66 66 69 63 69 65 6e 74 20 73 74  ** sufficient st
20db0 6f 72 61 67 65 20 74 6f 20 68 6f 6c 64 20 61 20  orage to hold a 
20dc0 63 75 72 73 6f 72 2e 20 20 54 68 65 20 42 74 43  cursor.  The BtC
20dd0 75 72 73 6f 72 20 6f 62 6a 65 63 74 20 69 73 20  ursor object is 
20de0 6f 70 61 71 75 65 0a 2a 2a 20 74 6f 20 75 73 65  opaque.** to use
20df0 72 73 20 73 6f 20 74 68 65 79 20 63 61 6e 6e 6f  rs so they canno
20e00 74 20 64 6f 20 74 68 65 20 73 69 7a 65 6f 66 28  t do the sizeof(
20e10 29 20 74 68 65 6d 73 65 6c 76 65 73 20 2d 20 74  ) themselves - t
20e20 68 65 79 20 6d 75 73 74 20 63 61 6c 6c 0a 2a 2a  hey must call.**
20e30 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a   this routine..*
20e40 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
20e50 65 65 43 75 72 73 6f 72 53 69 7a 65 28 76 6f 69  eeCursorSize(voi
20e60 64 29 7b 0a 20 20 72 65 74 75 72 6e 20 52 4f 55  d){.  return ROU
20e70 4e 44 38 28 73 69 7a 65 6f 66 28 42 74 43 75 72  ND8(sizeof(BtCur
20e80 73 6f 72 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  sor));.}../*.** 
20e90 49 6e 69 74 69 61 6c 69 7a 65 20 6d 65 6d 6f 72  Initialize memor
20ea0 79 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 63  y that will be c
20eb0 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 61 20  onverted into a 
20ec0 42 74 43 75 72 73 6f 72 20 6f 62 6a 65 63 74 2e  BtCursor object.
20ed0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 69 6d 70 6c  .**.** The simpl
20ee0 65 20 61 70 70 72 6f 61 63 68 20 68 65 72 65 20  e approach here 
20ef0 77 6f 75 6c 64 20 62 65 20 74 6f 20 6d 65 6d 73  would be to mems
20f00 65 74 28 29 20 74 68 65 20 65 6e 74 69 72 65 20  et() the entire 
20f10 6f 62 6a 65 63 74 0a 2a 2a 20 74 6f 20 7a 65 72  object.** to zer
20f20 6f 2e 20 20 42 75 74 20 69 74 20 74 75 72 6e 73  o.  But it turns
20f30 20 6f 75 74 20 74 68 61 74 20 74 68 65 20 61 70   out that the ap
20f40 50 61 67 65 5b 5d 20 61 6e 64 20 61 69 49 64 78  Page[] and aiIdx
20f50 5b 5d 20 61 72 72 61 79 73 0a 2a 2a 20 64 6f 20  [] arrays.** do 
20f60 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 7a  not need to be z
20f70 65 72 6f 65 64 20 61 6e 64 20 74 68 65 79 20 61  eroed and they a
20f80 72 65 20 6c 61 72 67 65 2c 20 73 6f 20 77 65 20  re large, so we 
20f90 63 61 6e 20 73 61 76 65 20 61 20 6c 6f 74 0a 2a  can save a lot.*
20fa0 2a 20 6f 66 20 72 75 6e 2d 74 69 6d 65 20 62 79  * of run-time by
20fb0 20 73 6b 69 70 70 69 6e 67 20 74 68 65 20 69 6e   skipping the in
20fc0 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 6f 66 20  itialization of 
20fd0 74 68 6f 73 65 20 65 6c 65 6d 65 6e 74 73 2e 0a  those elements..
20fe0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42  */.void sqlite3B
20ff0 74 72 65 65 43 75 72 73 6f 72 5a 65 72 6f 28 42  treeCursorZero(B
21000 74 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 6d  tCursor *p){.  m
21010 65 6d 73 65 74 28 70 2c 20 30 2c 20 6f 66 66 73  emset(p, 0, offs
21020 65 74 6f 66 28 42 74 43 75 72 73 6f 72 2c 20 69  etof(BtCursor, i
21030 50 61 67 65 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Page));.}../*.**
21040 20 43 6c 6f 73 65 20 61 20 63 75 72 73 6f 72 2e   Close a cursor.
21050 20 20 54 68 65 20 72 65 61 64 20 6c 6f 63 6b 20    The read lock 
21060 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
21070 66 69 6c 65 20 69 73 20 72 65 6c 65 61 73 65 64  file is released
21080 0a 2a 2a 20 77 68 65 6e 20 74 68 65 20 6c 61 73  .** when the las
21090 74 20 63 75 72 73 6f 72 20 69 73 20 63 6c 6f 73  t cursor is clos
210a0 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
210b0 65 33 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73  e3BtreeCloseCurs
210c0 6f 72 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  or(BtCursor *pCu
210d0 72 29 7b 0a 20 20 42 74 72 65 65 20 2a 70 42 74  r){.  Btree *pBt
210e0 72 65 65 20 3d 20 70 43 75 72 2d 3e 70 42 74 72  ree = pCur->pBtr
210f0 65 65 3b 0a 20 20 69 66 28 20 70 42 74 72 65 65  ee;.  if( pBtree
21100 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
21110 20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74     BtShared *pBt
21120 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b 0a 20 20   = pCur->pBt;.  
21130 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
21140 74 65 72 28 70 42 74 72 65 65 29 3b 0a 20 20 20  ter(pBtree);.   
21150 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65   sqlite3BtreeCle
21160 61 72 43 75 72 73 6f 72 28 70 43 75 72 29 3b 0a  arCursor(pCur);.
21170 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 70 50      if( pCur->pP
21180 72 65 76 20 29 7b 0a 20 20 20 20 20 20 70 43 75  rev ){.      pCu
21190 72 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 20  r->pPrev->pNext 
211a0 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20  = pCur->pNext;. 
211b0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
211c0 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20 70  pBt->pCursor = p
211d0 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  Cur->pNext;.    
211e0 7d 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e  }.    if( pCur->
211f0 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20 70  pNext ){.      p
21200 43 75 72 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65  Cur->pNext->pPre
21210 76 20 3d 20 70 43 75 72 2d 3e 70 50 72 65 76 3b  v = pCur->pPrev;
21220 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69  .    }.    for(i
21230 3d 30 3b 20 69 3c 3d 70 43 75 72 2d 3e 69 50 61  =0; i<=pCur->iPa
21240 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ge; i++){.      
21250 72 65 6c 65 61 73 65 50 61 67 65 28 70 43 75 72  releasePage(pCur
21260 2d 3e 61 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20  ->apPage[i]);.  
21270 20 20 7d 0a 20 20 20 20 75 6e 6c 6f 63 6b 42 74    }.    unlockBt
21280 72 65 65 49 66 55 6e 75 73 65 64 28 70 42 74 29  reeIfUnused(pBt)
21290 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
212a0 65 65 28 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c  ee(pCur->aOverfl
212b0 6f 77 29 3b 0a 20 20 20 20 2f 2a 20 73 71 6c 69  ow);.    /* sqli
212c0 74 65 33 5f 66 72 65 65 28 70 43 75 72 29 3b 20  te3_free(pCur); 
212d0 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  */.    sqlite3Bt
212e0 72 65 65 4c 65 61 76 65 28 70 42 74 72 65 65 29  reeLeave(pBtree)
212f0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
21300 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
21310 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  ** Make sure the
21320 20 42 74 43 75 72 73 6f 72 2a 20 67 69 76 65 6e   BtCursor* given
21330 20 69 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74   in the argument
21340 20 68 61 73 20 61 20 76 61 6c 69 64 0a 2a 2a 20   has a valid.** 
21350 42 74 43 75 72 73 6f 72 2e 69 6e 66 6f 20 73 74  BtCursor.info st
21360 72 75 63 74 75 72 65 2e 20 20 49 66 20 69 74 20  ructure.  If it 
21370 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 76  is not already v
21380 61 6c 69 64 2c 20 63 61 6c 6c 0a 2a 2a 20 62 74  alid, call.** bt
21390 72 65 65 50 61 72 73 65 43 65 6c 6c 28 29 20 74  reeParseCell() t
213a0 6f 20 66 69 6c 6c 20 69 74 20 69 6e 2e 0a 2a 2a  o fill it in..**
213b0 0a 2a 2a 20 42 74 43 75 72 73 6f 72 2e 69 6e 66  .** BtCursor.inf
213c0 6f 20 69 73 20 61 20 63 61 63 68 65 20 6f 66 20  o is a cache of 
213d0 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  the information 
213e0 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 63  in the current c
213f0 65 6c 6c 2e 0a 2a 2a 20 55 73 69 6e 67 20 74 68  ell..** Using th
21400 69 73 20 63 61 63 68 65 20 72 65 64 75 63 65 73  is cache reduces
21410 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   the number of c
21420 61 6c 6c 73 20 74 6f 20 62 74 72 65 65 50 61 72  alls to btreePar
21430 73 65 43 65 6c 6c 28 29 2e 0a 2a 2a 0a 2a 2a 20  seCell()..**.** 
21440 32 30 30 37 2d 30 36 2d 32 35 3a 20 20 54 68 65  2007-06-25:  The
21450 72 65 20 69 73 20 61 20 62 75 67 20 69 6e 20 73  re is a bug in s
21460 6f 6d 65 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  ome versions of 
21470 4d 53 56 43 20 74 68 61 74 20 63 61 75 73 65 20  MSVC that cause 
21480 74 68 65 0a 2a 2a 20 63 6f 6d 70 69 6c 65 72 20  the.** compiler 
21490 74 6f 20 63 72 61 73 68 20 77 68 65 6e 20 67 65  to crash when ge
214a0 74 43 65 6c 6c 49 6e 66 6f 28 29 20 69 73 20 69  tCellInfo() is i
214b0 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 61 20  mplemented as a 
214c0 6d 61 63 72 6f 2e 0a 2a 2a 20 42 75 74 20 74 68  macro..** But th
214d0 65 72 65 20 69 73 20 61 20 6d 65 61 73 75 72 65  ere is a measure
214e0 61 62 6c 65 20 73 70 65 65 64 20 61 64 76 61 6e  able speed advan
214f0 74 61 67 65 20 74 6f 20 75 73 69 6e 67 20 74 68  tage to using th
21500 65 20 6d 61 63 72 6f 20 6f 6e 20 67 63 63 0a 2a  e macro on gcc.*
21510 2a 20 28 77 68 65 6e 20 6c 65 73 73 20 63 6f 6d  * (when less com
21520 70 69 6c 65 72 20 6f 70 74 69 6d 69 7a 61 74 69  piler optimizati
21530 6f 6e 73 20 6c 69 6b 65 20 2d 4f 73 20 6f 72 20  ons like -Os or 
21540 2d 4f 30 20 61 72 65 20 75 73 65 64 20 61 6e 64  -O0 are used and
21550 20 74 68 65 0a 2a 2a 20 63 6f 6d 70 69 6c 65 72   the.** compiler
21560 20 69 73 20 6e 6f 74 20 64 6f 69 6e 67 20 61 67   is not doing ag
21570 67 72 65 73 73 69 76 65 20 69 6e 6c 69 6e 69 6e  gressive inlinin
21580 67 2e 29 20 20 53 6f 20 77 65 20 75 73 65 20 61  g.)  So we use a
21590 20 72 65 61 6c 20 66 75 6e 63 74 69 6f 6e 0a 2a   real function.*
215a0 2a 20 66 6f 72 20 4d 53 56 43 20 61 6e 64 20 61  * for MSVC and a
215b0 20 6d 61 63 72 6f 20 66 6f 72 20 65 76 65 72 79   macro for every
215c0 74 68 69 6e 67 20 65 6c 73 65 2e 20 20 54 69 63  thing else.  Tic
215d0 6b 65 74 20 23 32 34 35 37 2e 0a 2a 2f 0a 23 69  ket #2457..*/.#i
215e0 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 73  fndef NDEBUG.  s
215f0 74 61 74 69 63 20 76 6f 69 64 20 61 73 73 65 72  tatic void asser
21600 74 43 65 6c 6c 49 6e 66 6f 28 42 74 43 75 72 73  tCellInfo(BtCurs
21610 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 20 20 43  or *pCur){.    C
21620 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20  ellInfo info;.  
21630 20 20 69 6e 74 20 69 50 61 67 65 20 3d 20 70 43    int iPage = pC
21640 75 72 2d 3e 69 50 61 67 65 3b 0a 20 20 20 20 6d  ur->iPage;.    m
21650 65 6d 73 65 74 28 26 69 6e 66 6f 2c 20 30 2c 20  emset(&info, 0, 
21660 73 69 7a 65 6f 66 28 69 6e 66 6f 29 29 3b 0a 20  sizeof(info));. 
21670 20 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c     btreeParseCel
21680 6c 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69  l(pCur->apPage[i
21690 50 61 67 65 5d 2c 20 70 43 75 72 2d 3e 61 69 49  Page], pCur->aiI
216a0 64 78 5b 69 50 61 67 65 5d 2c 20 26 69 6e 66 6f  dx[iPage], &info
216b0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 43  );.    assert( C
216c0 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20 6d 65 6d  ORRUPT_DB || mem
216d0 63 6d 70 28 26 69 6e 66 6f 2c 20 26 70 43 75 72  cmp(&info, &pCur
216e0 2d 3e 69 6e 66 6f 2c 20 73 69 7a 65 6f 66 28 69  ->info, sizeof(i
216f0 6e 66 6f 29 29 3d 3d 30 20 29 3b 0a 20 20 7d 0a  nfo))==0 );.  }.
21700 23 65 6c 73 65 0a 20 20 23 64 65 66 69 6e 65 20  #else.  #define 
21710 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28 78  assertCellInfo(x
21720 29 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20  ).#endif.#ifdef 
21730 5f 4d 53 43 5f 56 45 52 0a 20 20 2f 2a 20 55 73  _MSC_VER.  /* Us
21740 65 20 61 20 72 65 61 6c 20 66 75 6e 63 74 69 6f  e a real functio
21750 6e 20 69 6e 20 4d 53 56 43 20 74 6f 20 77 6f 72  n in MSVC to wor
21760 6b 20 61 72 6f 75 6e 64 20 62 75 67 73 20 69 6e  k around bugs in
21770 20 74 68 61 74 20 63 6f 6d 70 69 6c 65 72 2e 20   that compiler. 
21780 2a 2f 0a 20 20 73 74 61 74 69 63 20 76 6f 69 64  */.  static void
21790 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 42 74 43   getCellInfo(BtC
217a0 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
217b0 20 20 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f    if( pCur->info
217c0 2e 6e 53 69 7a 65 3d 3d 30 20 29 7b 0a 20 20 20  .nSize==0 ){.   
217d0 20 20 20 69 6e 74 20 69 50 61 67 65 20 3d 20 70     int iPage = p
217e0 43 75 72 2d 3e 69 50 61 67 65 3b 0a 20 20 20 20  Cur->iPage;.    
217f0 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c    btreeParseCell
21800 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 50  (pCur->apPage[iP
21810 61 67 65 5d 2c 70 43 75 72 2d 3e 61 69 49 64 78  age],pCur->aiIdx
21820 5b 69 50 61 67 65 5d 2c 26 70 43 75 72 2d 3e 69  [iPage],&pCur->i
21830 6e 66 6f 29 3b 0a 20 20 20 20 20 20 70 43 75 72  nfo);.      pCur
21840 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20 42 54  ->curFlags |= BT
21850 43 46 5f 56 61 6c 69 64 4e 4b 65 79 3b 0a 20 20  CF_ValidNKey;.  
21860 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
21870 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28 70 43  ssertCellInfo(pC
21880 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  ur);.    }.  }.#
21890 65 6c 73 65 20 2f 2a 20 69 66 20 6e 6f 74 20 5f  else /* if not _
218a0 4d 53 43 5f 56 45 52 20 2a 2f 0a 20 20 2f 2a 20  MSC_VER */.  /* 
218b0 55 73 65 20 61 20 6d 61 63 72 6f 20 69 6e 20 61  Use a macro in a
218c0 6c 6c 20 6f 74 68 65 72 20 63 6f 6d 70 69 6c 65  ll other compile
218d0 72 73 20 73 6f 20 74 68 61 74 20 74 68 65 20 66  rs so that the f
218e0 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e 6c 69 6e  unction is inlin
218f0 65 64 20 2a 2f 0a 23 64 65 66 69 6e 65 20 67 65  ed */.#define ge
21900 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 20  tCellInfo(pCur) 
21910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21940 20 20 20 20 20 5c 0a 20 20 69 66 28 20 70 43 75       \.  if( pCu
21950 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30  r->info.nSize==0
21960 20 29 7b 20 20 20 20 20 20 20 20 20 20 20 20 20   ){             
21970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21990 20 20 20 20 20 20 5c 0a 20 20 20 20 69 6e 74 20        \.    int 
219a0 69 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 69 50  iPage = pCur->iP
219b0 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  age;            
219c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
219d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
219e0 20 20 20 20 20 20 20 5c 0a 20 20 20 20 62 74 72         \.    btr
219f0 65 65 50 61 72 73 65 43 65 6c 6c 28 70 43 75 72  eeParseCell(pCur
21a00 2d 3e 61 70 50 61 67 65 5b 69 50 61 67 65 5d 2c  ->apPage[iPage],
21a10 70 43 75 72 2d 3e 61 69 49 64 78 5b 69 50 61 67  pCur->aiIdx[iPag
21a20 65 5d 2c 26 70 43 75 72 2d 3e 69 6e 66 6f 29 3b  e],&pCur->info);
21a30 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 70 43          \.    pC
21a40 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20  ur->curFlags |= 
21a50 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 3b 20  BTCF_ValidNKey; 
21a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21a80 20 20 20 20 20 20 20 20 20 5c 0a 20 20 7d 65 6c           \.  }el
21a90 73 65 7b 20 20 20 20 20 20 20 20 20 20 20 20 20  se{             
21aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21ad0 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20            \.    
21ae0 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28 70  assertCellInfo(p
21af0 43 75 72 29 3b 20 20 20 20 20 20 20 20 20 20 20  Cur);           
21b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21b20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 7d             \.  }
21b30 0a 23 65 6e 64 69 66 20 2f 2a 20 5f 4d 53 43 5f  .#endif /* _MSC_
21b40 56 45 52 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20  VER */..#ifndef 
21b50 4e 44 45 42 55 47 20 20 2f 2a 20 54 68 65 20 6e  NDEBUG  /* The n
21b60 65 78 74 20 72 6f 75 74 69 6e 65 20 75 73 65 64  ext routine used
21b70 20 6f 6e 6c 79 20 77 69 74 68 69 6e 20 61 73 73   only within ass
21b80 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73  ert() statements
21b90 20 2a 2f 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e   */./*.** Return
21ba0 20 74 72 75 65 20 69 66 20 74 68 65 20 67 69 76   true if the giv
21bb0 65 6e 20 42 74 43 75 72 73 6f 72 20 69 73 20 76  en BtCursor is v
21bc0 61 6c 69 64 2e 20 20 41 20 76 61 6c 69 64 20 63  alid.  A valid c
21bd0 75 72 73 6f 72 20 69 73 20 6f 6e 65 0a 2a 2a 20  ursor is one.** 
21be0 74 68 61 74 20 69 73 20 63 75 72 72 65 6e 74 6c  that is currentl
21bf0 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20  y pointing to a 
21c00 72 6f 77 20 69 6e 20 61 20 28 6e 6f 6e 2d 65 6d  row in a (non-em
21c10 70 74 79 29 20 74 61 62 6c 65 2e 0a 2a 2a 20 54  pty) table..** T
21c20 68 69 73 20 69 73 20 61 20 76 65 72 69 66 69 63  his is a verific
21c30 61 74 69 6f 6e 20 72 6f 75 74 69 6e 65 20 69 73  ation routine is
21c40 20 75 73 65 64 20 6f 6e 6c 79 20 77 69 74 68 69   used only withi
21c50 6e 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65  n assert() state
21c60 6d 65 6e 74 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ments..*/.int sq
21c70 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
21c80 49 73 56 61 6c 69 64 28 42 74 43 75 72 73 6f 72  IsValid(BtCursor
21c90 20 2a 70 43 75 72 29 7b 0a 20 20 72 65 74 75 72   *pCur){.  retur
21ca0 6e 20 70 43 75 72 20 26 26 20 70 43 75 72 2d 3e  n pCur && pCur->
21cb0 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
21cc0 41 4c 49 44 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  ALID;.}.#endif /
21cd0 2a 20 4e 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a  * NDEBUG */../*.
21ce0 2a 2a 20 53 65 74 20 2a 70 53 69 7a 65 20 74 6f  ** Set *pSize to
21cf0 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
21d00 20 62 75 66 66 65 72 20 6e 65 65 64 65 64 20 74   buffer needed t
21d10 6f 20 68 6f 6c 64 20 74 68 65 20 76 61 6c 75 65  o hold the value
21d20 20 6f 66 0a 2a 2a 20 74 68 65 20 6b 65 79 20 66   of.** the key f
21d30 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 65  or the current e
21d40 6e 74 72 79 2e 20 20 49 66 20 74 68 65 20 63 75  ntry.  If the cu
21d50 72 73 6f 72 20 69 73 20 6e 6f 74 20 70 6f 69 6e  rsor is not poin
21d60 74 69 6e 67 0a 2a 2a 20 74 6f 20 61 20 76 61 6c  ting.** to a val
21d70 69 64 20 65 6e 74 72 79 2c 20 2a 70 53 69 7a 65  id entry, *pSize
21d80 20 69 73 20 73 65 74 20 74 6f 20 30 2e 20 0a 2a   is set to 0. .*
21d90 2a 0a 2a 2a 20 46 6f 72 20 61 20 74 61 62 6c 65  *.** For a table
21da0 20 77 69 74 68 20 74 68 65 20 49 4e 54 4b 45 59   with the INTKEY
21db0 20 66 6c 61 67 20 73 65 74 2c 20 74 68 69 73 20   flag set, this 
21dc0 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
21dd0 74 68 65 20 6b 65 79 0a 2a 2a 20 69 74 73 65 6c  the key.** itsel
21de0 66 2c 20 6e 6f 74 20 74 68 65 20 6e 75 6d 62 65  f, not the numbe
21df0 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68  r of bytes in th
21e00 65 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  e key..**.** The
21e10 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 70 6f 73   caller must pos
21e20 69 74 69 6f 6e 20 74 68 65 20 63 75 72 73 6f 72  ition the cursor
21e30 20 70 72 69 6f 72 20 74 6f 20 69 6e 76 6f 6b 69   prior to invoki
21e40 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e  ng this routine.
21e50 0a 2a 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75  .** .** This rou
21e60 74 69 6e 65 20 63 61 6e 6e 6f 74 20 66 61 69 6c  tine cannot fail
21e70 2e 20 20 49 74 20 61 6c 77 61 79 73 20 72 65 74  .  It always ret
21e80 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 20  urns SQLITE_OK. 
21e90 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33   .*/.int sqlite3
21ea0 42 74 72 65 65 4b 65 79 53 69 7a 65 28 42 74 43  BtreeKeySize(BtC
21eb0 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 36 34  ursor *pCur, i64
21ec0 20 2a 70 53 69 7a 65 29 7b 0a 20 20 61 73 73 65   *pSize){.  asse
21ed0 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
21ee0 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
21ef0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
21f00 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
21f10 49 44 20 29 3b 0a 20 20 67 65 74 43 65 6c 6c 49  ID );.  getCellI
21f20 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 2a 70 53  nfo(pCur);.  *pS
21f30 69 7a 65 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f  ize = pCur->info
21f40 2e 6e 4b 65 79 3b 0a 20 20 72 65 74 75 72 6e 20  .nKey;.  return 
21f50 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
21f60 0a 2a 2a 20 53 65 74 20 2a 70 53 69 7a 65 20 74  .** Set *pSize t
21f70 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  o the number of 
21f80 62 79 74 65 73 20 6f 66 20 64 61 74 61 20 69 6e  bytes of data in
21f90 20 74 68 65 20 65 6e 74 72 79 20 74 68 65 0a 2a   the entry the.*
21fa0 2a 20 63 75 72 73 6f 72 20 63 75 72 72 65 6e 74  * cursor current
21fb0 6c 79 20 70 6f 69 6e 74 73 20 74 6f 2e 0a 2a 2a  ly points to..**
21fc0 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 6d  .** The caller m
21fd0 75 73 74 20 67 75 61 72 61 6e 74 65 65 20 74 68  ust guarantee th
21fe0 61 74 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  at the cursor is
21ff0 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20 6e   pointing to a n
22000 6f 6e 2d 4e 55 4c 4c 0a 2a 2a 20 76 61 6c 69 64  on-NULL.** valid
22010 20 65 6e 74 72 79 2e 20 20 49 6e 20 6f 74 68 65   entry.  In othe
22020 72 20 77 6f 72 64 73 2c 20 74 68 65 20 63 61 6c  r words, the cal
22030 6c 69 6e 67 20 70 72 6f 63 65 64 75 72 65 20 6d  ling procedure m
22040 75 73 74 20 67 75 61 72 61 6e 74 65 65 0a 2a 2a  ust guarantee.**
22050 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72   that the cursor
22060 20 68 61 73 20 43 75 72 73 6f 72 2e 65 53 74 61   has Cursor.eSta
22070 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
22080 2e 0a 2a 2a 0a 2a 2a 20 46 61 69 6c 75 72 65 20  ..**.** Failure 
22090 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 2e  is not possible.
220a0 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20    This function 
220b0 61 6c 77 61 79 73 20 72 65 74 75 72 6e 73 20 53  always returns S
220c0 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 49 74 20  QLITE_OK..** It 
220d0 6d 69 67 68 74 20 6a 75 73 74 20 61 73 20 77 65  might just as we
220e0 6c 6c 20 62 65 20 61 20 70 72 6f 63 65 64 75 72  ll be a procedur
220f0 65 20 28 72 65 74 75 72 6e 69 6e 67 20 76 6f 69  e (returning voi
22100 64 29 20 62 75 74 20 77 65 20 63 6f 6e 74 69 6e  d) but we contin
22110 75 65 0a 2a 2a 20 74 6f 20 72 65 74 75 72 6e 20  ue.** to return 
22120 61 6e 20 69 6e 74 65 67 65 72 20 72 65 73 75 6c  an integer resul
22130 74 20 63 6f 64 65 20 66 6f 72 20 68 69 73 74 6f  t code for histo
22140 72 69 63 61 6c 20 72 65 61 73 6f 6e 73 2e 0a 2a  rical reasons..*
22150 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
22160 65 65 44 61 74 61 53 69 7a 65 28 42 74 43 75 72  eeDataSize(BtCur
22170 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20 2a  sor *pCur, u32 *
22180 70 53 69 7a 65 29 7b 0a 20 20 61 73 73 65 72 74  pSize){.  assert
22190 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
221a0 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ex(pCur) );.  as
221b0 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
221c0 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
221d0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
221e0 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 29 3b 0a  ur->iPage>=0 );.
221f0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
22200 69 50 61 67 65 3c 42 54 43 55 52 53 4f 52 5f 4d  iPage<BTCURSOR_M
22210 41 58 5f 44 45 50 54 48 20 29 3b 0a 20 20 61 73  AX_DEPTH );.  as
22220 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61  sert( pCur->apPa
22230 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
22240 3e 69 6e 74 4b 65 79 4c 65 61 66 3d 3d 31 20 29  >intKeyLeaf==1 )
22250 3b 0a 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28  ;.  getCellInfo(
22260 70 43 75 72 29 3b 0a 20 20 2a 70 53 69 7a 65 20  pCur);.  *pSize 
22270 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50 61  = pCur->info.nPa
22280 79 6c 6f 61 64 3b 0a 20 20 72 65 74 75 72 6e 20  yload;.  return 
22290 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
222a0 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65 20 70 61  .** Given the pa
222b0 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 6e 20  ge number of an 
222c0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e  overflow page in
222d0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 28 70   the database (p
222e0 61 72 61 6d 65 74 65 72 0a 2a 2a 20 6f 76 66 6c  arameter.** ovfl
222f0 29 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ), this function
22300 20 66 69 6e 64 73 20 74 68 65 20 70 61 67 65 20   finds the page 
22310 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65  number of the ne
22320 78 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 0a  xt page in the .
22330 2a 2a 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f  ** linked list o
22340 66 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  f overflow pages
22350 2e 20 49 66 20 70 6f 73 73 69 62 6c 65 2c 20 69  . If possible, i
22360 74 20 75 73 65 73 20 74 68 65 20 61 75 74 6f 2d  t uses the auto-
22370 76 61 63 75 75 6d 0a 2a 2a 20 70 6f 69 6e 74 65  vacuum.** pointe
22380 72 2d 6d 61 70 20 64 61 74 61 20 69 6e 73 74 65  r-map data inste
22390 61 64 20 6f 66 20 72 65 61 64 69 6e 67 20 74 68  ad of reading th
223a0 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 70 61 67  e content of pag
223b0 65 20 6f 76 66 6c 20 74 6f 20 64 6f 20 73 6f 2e  e ovfl to do so.
223c0 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72   .**.** If an er
223d0 72 6f 72 20 6f 63 63 75 72 73 20 61 6e 20 53 51  ror occurs an SQ
223e0 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  Lite error code 
223f0 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68  is returned. Oth
22400 65 72 77 69 73 65 3a 0a 2a 2a 0a 2a 2a 20 54 68  erwise:.**.** Th
22410 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  e page number of
22420 20 74 68 65 20 6e 65 78 74 20 6f 76 65 72 66 6c   the next overfl
22430 6f 77 20 70 61 67 65 20 69 6e 20 74 68 65 20 6c  ow page in the l
22440 69 6e 6b 65 64 20 6c 69 73 74 20 69 73 20 0a 2a  inked list is .*
22450 2a 20 77 72 69 74 74 65 6e 20 74 6f 20 2a 70 50  * written to *pP
22460 67 6e 6f 4e 65 78 74 2e 20 49 66 20 70 61 67 65  gnoNext. If page
22470 20 6f 76 66 6c 20 69 73 20 74 68 65 20 6c 61 73   ovfl is the las
22480 74 20 70 61 67 65 20 69 6e 20 69 74 73 20 6c 69  t page in its li
22490 6e 6b 65 64 20 0a 2a 2a 20 6c 69 73 74 2c 20 2a  nked .** list, *
224a0 70 50 67 6e 6f 4e 65 78 74 20 69 73 20 73 65 74  pPgnoNext is set
224b0 20 74 6f 20 7a 65 72 6f 2e 20 0a 2a 2a 0a 2a 2a   to zero. .**.**
224c0 20 49 66 20 70 70 50 61 67 65 20 69 73 20 6e 6f   If ppPage is no
224d0 74 20 4e 55 4c 4c 2c 20 61 6e 64 20 61 20 72 65  t NULL, and a re
224e0 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 4d  ference to the M
224f0 65 6d 50 61 67 65 20 6f 62 6a 65 63 74 20 63 6f  emPage object co
22500 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 74  rresponding.** t
22510 6f 20 70 61 67 65 20 6e 75 6d 62 65 72 20 70 4f  o page number pO
22520 76 66 6c 20 77 61 73 20 6f 62 74 61 69 6e 65 64  vfl was obtained
22530 2c 20 74 68 65 6e 20 2a 70 70 50 61 67 65 20 69  , then *ppPage i
22540 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74  s set to point t
22550 6f 20 74 68 61 74 0a 2a 2a 20 72 65 66 65 72 65  o that.** refere
22560 6e 63 65 2e 20 49 74 20 69 73 20 74 68 65 20 72  nce. It is the r
22570 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66  esponsibility of
22580 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 63   the caller to c
22590 61 6c 6c 20 72 65 6c 65 61 73 65 50 61 67 65 28  all releasePage(
225a0 29 0a 2a 2a 20 6f 6e 20 2a 70 70 50 61 67 65 20  ).** on *ppPage 
225b0 74 6f 20 66 72 65 65 20 74 68 65 20 72 65 66 65  to free the refe
225c0 72 65 6e 63 65 2e 20 49 6e 20 6e 6f 20 72 65 66  rence. In no ref
225d0 65 72 65 6e 63 65 20 77 61 73 20 6f 62 74 61 69  erence was obtai
225e0 6e 65 64 20 28 62 65 63 61 75 73 65 0a 2a 2a 20  ned (because.** 
225f0 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  the pointer-map 
22600 77 61 73 20 75 73 65 64 20 74 6f 20 6f 62 74 61  was used to obta
22610 69 6e 20 74 68 65 20 76 61 6c 75 65 20 66 6f 72  in the value for
22620 20 2a 70 50 67 6e 6f 4e 65 78 74 29 2c 20 74 68   *pPgnoNext), th
22630 65 6e 0a 2a 2a 20 2a 70 70 50 61 67 65 20 69 73  en.** *ppPage is
22640 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2f   set to zero..*/
22650 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 74 4f  .static int getO
22660 76 65 72 66 6c 6f 77 50 61 67 65 28 0a 20 20 42  verflowPage(.  B
22670 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20  tShared *pBt,   
22680 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
22690 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
226a0 20 2a 2f 0a 20 20 50 67 6e 6f 20 6f 76 66 6c 2c   */.  Pgno ovfl,
226b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
226c0 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6f 76     /* Current ov
226d0 65 72 66 6c 6f 77 20 70 61 67 65 20 6e 75 6d 62  erflow page numb
226e0 65 72 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  er */.  MemPage 
226f0 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 20 20 20  **ppPage,       
22700 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4d 65 6d       /* OUT: Mem
22710 50 61 67 65 20 68 61 6e 64 6c 65 20 28 6d 61 79  Page handle (may
22720 20 62 65 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20 50   be NULL) */.  P
22730 67 6e 6f 20 2a 70 50 67 6e 6f 4e 65 78 74 20 20  gno *pPgnoNext  
22740 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
22750 55 54 3a 20 4e 65 78 74 20 6f 76 65 72 66 6c 6f  UT: Next overflo
22760 77 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f  w page number */
22770 0a 29 7b 0a 20 20 50 67 6e 6f 20 6e 65 78 74 20  .){.  Pgno next 
22780 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  = 0;.  MemPage *
22790 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 69 6e 74  pPage = 0;.  int
227a0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
227b0 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
227c0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
227d0 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
227e0 61 73 73 65 72 74 28 70 50 67 6e 6f 4e 65 78 74  assert(pPgnoNext
227f0 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  );..#ifndef SQLI
22800 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
22810 55 4d 0a 20 20 2f 2a 20 54 72 79 20 74 6f 20 66  UM.  /* Try to f
22820 69 6e 64 20 74 68 65 20 6e 65 78 74 20 70 61 67  ind the next pag
22830 65 20 69 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f  e in the overflo
22840 77 20 6c 69 73 74 20 75 73 69 6e 67 20 74 68 65  w list using the
22850 0a 20 20 2a 2a 20 61 75 74 6f 76 61 63 75 75 6d  .  ** autovacuum
22860 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67   pointer-map pag
22870 65 73 2e 20 47 75 65 73 73 20 74 68 61 74 20 74  es. Guess that t
22880 68 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20  he next page in 
22890 0a 20 20 2a 2a 20 74 68 65 20 6f 76 65 72 66 6c  .  ** the overfl
228a0 6f 77 20 6c 69 73 74 20 69 73 20 70 61 67 65 20  ow list is page 
228b0 6e 75 6d 62 65 72 20 28 6f 76 66 6c 2b 31 29 2e  number (ovfl+1).
228c0 20 49 66 20 74 68 61 74 20 67 75 65 73 73 20 74   If that guess t
228d0 75 72 6e 73 20 0a 20 20 2a 2a 20 6f 75 74 20 74  urns .  ** out t
228e0 6f 20 62 65 20 77 72 6f 6e 67 2c 20 66 61 6c 6c  o be wrong, fall
228f0 20 62 61 63 6b 20 74 6f 20 6c 6f 61 64 69 6e 67   back to loading
22900 20 74 68 65 20 64 61 74 61 20 6f 66 20 70 61 67   the data of pag
22910 65 20 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f  e .  ** number o
22920 76 66 6c 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  vfl to determine
22930 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 6e   the next page n
22940 75 6d 62 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66  umber..  */.  if
22950 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
22960 6d 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 70 67  m ){.    Pgno pg
22970 6e 6f 3b 0a 20 20 20 20 50 67 6e 6f 20 69 47 75  no;.    Pgno iGu
22980 65 73 73 20 3d 20 6f 76 66 6c 2b 31 3b 0a 20 20  ess = ovfl+1;.  
22990 20 20 75 38 20 65 54 79 70 65 3b 0a 0a 20 20 20    u8 eType;..   
229a0 20 77 68 69 6c 65 28 20 50 54 52 4d 41 50 5f 49   while( PTRMAP_I
229b0 53 50 41 47 45 28 70 42 74 2c 20 69 47 75 65 73  SPAGE(pBt, iGues
229c0 73 29 20 7c 7c 20 69 47 75 65 73 73 3d 3d 50 45  s) || iGuess==PE
229d0 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
229e0 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 69 47  pBt) ){.      iG
229f0 75 65 73 73 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20  uess++;.    }.. 
22a00 20 20 20 69 66 28 20 69 47 75 65 73 73 3c 3d 62     if( iGuess<=b
22a10 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42  treePagecount(pB
22a20 74 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  t) ){.      rc =
22a30 20 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20   ptrmapGet(pBt, 
22a40 69 47 75 65 73 73 2c 20 26 65 54 79 70 65 2c 20  iGuess, &eType, 
22a50 26 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66  &pgno);.      if
22a60 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
22a70 26 26 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  && eType==PTRMAP
22a80 5f 4f 56 45 52 46 4c 4f 57 32 20 26 26 20 70 67  _OVERFLOW2 && pg
22a90 6e 6f 3d 3d 6f 76 66 6c 20 29 7b 0a 20 20 20 20  no==ovfl ){.    
22aa0 20 20 20 20 6e 65 78 74 20 3d 20 69 47 75 65 73      next = iGues
22ab0 73 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  s;.        rc = 
22ac0 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20  SQLITE_DONE;.   
22ad0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23     }.    }.  }.#
22ae0 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28  endif..  assert(
22af0 20 6e 65 78 74 3d 3d 30 20 7c 7c 20 72 63 3d 3d   next==0 || rc==
22b00 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20  SQLITE_DONE );. 
22b10 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
22b20 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 62  OK ){.    rc = b
22b30 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
22b40 20 6f 76 66 6c 2c 20 26 70 50 61 67 65 2c 20 28   ovfl, &pPage, (
22b50 70 70 50 61 67 65 3d 3d 30 29 20 3f 20 50 41 47  ppPage==0) ? PAG
22b60 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20  ER_GET_READONLY 
22b70 3a 20 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74  : 0);.    assert
22b80 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
22b90 7c 7c 20 70 50 61 67 65 3d 3d 30 20 29 3b 0a 20  || pPage==0 );. 
22ba0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
22bb0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 6e 65  E_OK ){.      ne
22bc0 78 74 20 3d 20 67 65 74 34 62 79 74 65 28 70 50  xt = get4byte(pP
22bd0 61 67 65 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20  age->aData);.   
22be0 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70 50 67 6e 6f   }.  }..  *pPgno
22bf0 4e 65 78 74 20 3d 20 6e 65 78 74 3b 0a 20 20 69  Next = next;.  i
22c00 66 28 20 70 70 50 61 67 65 20 29 7b 0a 20 20 20  f( ppPage ){.   
22c10 20 2a 70 70 50 61 67 65 20 3d 20 70 50 61 67 65   *ppPage = pPage
22c20 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
22c30 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65  eleasePage(pPage
22c40 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
22c50 28 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45  (rc==SQLITE_DONE
22c60 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 72   ? SQLITE_OK : r
22c70 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70  c);.}../*.** Cop
22c80 79 20 64 61 74 61 20 66 72 6f 6d 20 61 20 62 75  y data from a bu
22c90 66 66 65 72 20 74 6f 20 61 20 70 61 67 65 2c 20  ffer to a page, 
22ca0 6f 72 20 66 72 6f 6d 20 61 20 70 61 67 65 20 74  or from a page t
22cb0 6f 20 61 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a  o a buffer..**.*
22cc0 2a 20 70 50 61 79 6c 6f 61 64 20 69 73 20 61 20  * pPayload is a 
22cd0 70 6f 69 6e 74 65 72 20 74 6f 20 64 61 74 61 20  pointer to data 
22ce0 73 74 6f 72 65 64 20 6f 6e 20 64 61 74 61 62 61  stored on databa
22cf0 73 65 20 70 61 67 65 20 70 44 62 50 61 67 65 2e  se page pDbPage.
22d00 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20  .** If argument 
22d10 65 4f 70 20 69 73 20 66 61 6c 73 65 2c 20 74 68  eOp is false, th
22d20 65 6e 20 6e 42 79 74 65 20 62 79 74 65 73 20 6f  en nByte bytes o
22d30 66 20 64 61 74 61 20 61 72 65 20 63 6f 70 69 65  f data are copie
22d40 64 0a 2a 2a 20 66 72 6f 6d 20 70 50 61 79 6c 6f  d.** from pPaylo
22d50 61 64 20 74 6f 20 74 68 65 20 62 75 66 66 65 72  ad to the buffer
22d60 20 70 6f 69 6e 74 65 64 20 61 74 20 62 79 20 70   pointed at by p
22d70 42 75 66 2e 20 49 66 20 65 4f 70 20 69 73 20 74  Buf. If eOp is t
22d80 72 75 65 2c 0a 2a 2a 20 74 68 65 6e 20 73 71 6c  rue,.** then sql
22d90 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29  ite3PagerWrite()
22da0 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 70 44   is called on pD
22db0 62 50 61 67 65 20 61 6e 64 20 6e 42 79 74 65 20  bPage and nByte 
22dc0 62 79 74 65 73 0a 2a 2a 20 6f 66 20 64 61 74 61  bytes.** of data
22dd0 20 61 72 65 20 63 6f 70 69 65 64 20 66 72 6f 6d   are copied from
22de0 20 74 68 65 20 62 75 66 66 65 72 20 70 42 75 66   the buffer pBuf
22df0 20 74 6f 20 70 50 61 79 6c 6f 61 64 2e 0a 2a 2a   to pPayload..**
22e00 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  .** SQLITE_OK is
22e10 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63   returned on suc
22e20 63 65 73 73 2c 20 6f 74 68 65 72 77 69 73 65 20  cess, otherwise 
22e30 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a  an error code..*
22e40 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 70  /.static int cop
22e50 79 50 61 79 6c 6f 61 64 28 0a 20 20 76 6f 69 64  yPayload(.  void
22e60 20 2a 70 50 61 79 6c 6f 61 64 2c 20 20 20 20 20   *pPayload,     
22e70 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
22e80 20 74 6f 20 70 61 67 65 20 64 61 74 61 20 2a 2f   to page data */
22e90 0a 20 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 20  .  void *pBuf,  
22ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
22eb0 50 6f 69 6e 74 65 72 20 74 6f 20 62 75 66 66 65  Pointer to buffe
22ec0 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65  r */.  int nByte
22ed0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
22ee0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
22ef0 74 65 73 20 74 6f 20 63 6f 70 79 20 2a 2f 0a 20  tes to copy */. 
22f00 20 69 6e 74 20 65 4f 70 2c 20 20 20 20 20 20 20   int eOp,       
22f10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 30 20             /* 0 
22f20 2d 3e 20 63 6f 70 79 20 66 72 6f 6d 20 70 61 67  -> copy from pag
22f30 65 2c 20 31 20 2d 3e 20 63 6f 70 79 20 74 6f 20  e, 1 -> copy to 
22f40 70 61 67 65 20 2a 2f 0a 20 20 44 62 50 61 67 65  page */.  DbPage
22f50 20 2a 70 44 62 50 61 67 65 20 20 20 20 20 20 20   *pDbPage       
22f60 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74      /* Page cont
22f70 61 69 6e 69 6e 67 20 70 50 61 79 6c 6f 61 64 20  aining pPayload 
22f80 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 65 4f 70 20  */.){.  if( eOp 
22f90 29 7b 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 64  ){.    /* Copy d
22fa0 61 74 61 20 66 72 6f 6d 20 62 75 66 66 65 72 20  ata from buffer 
22fb0 74 6f 20 70 61 67 65 20 28 61 20 77 72 69 74 65  to page (a write
22fc0 20 6f 70 65 72 61 74 69 6f 6e 29 20 2a 2f 0a 20   operation) */. 
22fd0 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69     int rc = sqli
22fe0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 44  te3PagerWrite(pD
22ff0 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
23000 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
23010 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
23020 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 63  ;.    }.    memc
23030 70 79 28 70 50 61 79 6c 6f 61 64 2c 20 70 42 75  py(pPayload, pBu
23040 66 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d 65 6c  f, nByte);.  }el
23050 73 65 7b 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20  se{.    /* Copy 
23060 64 61 74 61 20 66 72 6f 6d 20 70 61 67 65 20 74  data from page t
23070 6f 20 62 75 66 66 65 72 20 28 61 20 72 65 61 64  o buffer (a read
23080 20 6f 70 65 72 61 74 69 6f 6e 29 20 2a 2f 0a 20   operation) */. 
23090 20 20 20 6d 65 6d 63 70 79 28 70 42 75 66 2c 20     memcpy(pBuf, 
230a0 70 50 61 79 6c 6f 61 64 2c 20 6e 42 79 74 65 29  pPayload, nByte)
230b0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
230c0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
230d0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
230e0 20 69 73 20 75 73 65 64 20 74 6f 20 72 65 61 64   is used to read
230f0 20 6f 72 20 6f 76 65 72 77 72 69 74 65 20 70 61   or overwrite pa
23100 79 6c 6f 61 64 20 69 6e 66 6f 72 6d 61 74 69 6f  yload informatio
23110 6e 0a 2a 2a 20 66 6f 72 20 74 68 65 20 65 6e 74  n.** for the ent
23120 72 79 20 74 68 61 74 20 74 68 65 20 70 43 75 72  ry that the pCur
23130 20 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74   cursor is point
23140 69 6e 67 20 74 6f 2e 20 54 68 65 20 65 4f 70 0a  ing to. The eOp.
23150 2a 2a 20 61 72 67 75 6d 65 6e 74 20 69 73 20 69  ** argument is i
23160 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 66 6f  nterpreted as fo
23170 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 30  llows:.**.**   0
23180 3a 20 54 68 65 20 6f 70 65 72 61 74 69 6f 6e 20  : The operation 
23190 69 73 20 61 20 72 65 61 64 2e 20 50 6f 70 75 6c  is a read. Popul
231a0 61 74 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  ate the overflow
231b0 20 63 61 63 68 65 2e 0a 2a 2a 20 20 20 31 3a 20   cache..**   1: 
231c0 54 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 69 73  The operation is
231d0 20 61 20 77 72 69 74 65 2e 20 50 6f 70 75 6c 61   a write. Popula
231e0 74 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  te the overflow 
231f0 63 61 63 68 65 2e 0a 2a 2a 20 20 20 32 3a 20 54  cache..**   2: T
23200 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20  he operation is 
23210 61 20 72 65 61 64 2e 20 44 6f 20 6e 6f 74 20 70  a read. Do not p
23220 6f 70 75 6c 61 74 65 20 74 68 65 20 6f 76 65 72  opulate the over
23230 66 6c 6f 77 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a  flow cache..**.*
23240 2a 20 41 20 74 6f 74 61 6c 20 6f 66 20 22 61 6d  * A total of "am
23250 74 22 20 62 79 74 65 73 20 61 72 65 20 72 65 61  t" bytes are rea
23260 64 20 6f 72 20 77 72 69 74 74 65 6e 20 62 65 67  d or written beg
23270 69 6e 6e 69 6e 67 20 61 74 20 22 6f 66 66 73 65  inning at "offse
23280 74 22 2e 0a 2a 2a 20 44 61 74 61 20 69 73 20 72  t"..** Data is r
23290 65 61 64 20 74 6f 20 6f 72 20 66 72 6f 6d 20 74  ead to or from t
232a0 68 65 20 62 75 66 66 65 72 20 70 42 75 66 2e 0a  he buffer pBuf..
232b0 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6e 74 65 6e  **.** The conten
232c0 74 20 62 65 69 6e 67 20 72 65 61 64 20 6f 72 20  t being read or 
232d0 77 72 69 74 74 65 6e 20 6d 69 67 68 74 20 61 70  written might ap
232e0 70 65 61 72 20 6f 6e 20 74 68 65 20 6d 61 69 6e  pear on the main
232f0 20 70 61 67 65 0a 2a 2a 20 6f 72 20 62 65 20 73   page.** or be s
23300 63 61 74 74 65 72 65 64 20 6f 75 74 20 6f 6e 20  cattered out on 
23310 6d 75 6c 74 69 70 6c 65 20 6f 76 65 72 66 6c 6f  multiple overflo
23320 77 20 70 61 67 65 73 2e 0a 2a 2a 0a 2a 2a 20 49  w pages..**.** I
23330 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 75  f the current cu
23340 72 73 6f 72 20 65 6e 74 72 79 20 75 73 65 73 20  rsor entry uses 
23350 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 76 65 72  one or more over
23360 66 6c 6f 77 20 70 61 67 65 73 20 61 6e 64 20 74  flow pages and t
23370 68 65 0a 2a 2a 20 65 4f 70 20 61 72 67 75 6d 65  he.** eOp argume
23380 6e 74 20 69 73 20 6e 6f 74 20 32 2c 20 74 68 69  nt is not 2, thi
23390 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 61  s function may a
233a0 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f  llocate space fo
233b0 72 20 61 6e 64 20 6c 61 7a 69 6c 79 20 0a 2a 2a  r and lazily .**
233c0 20 70 6f 70 75 6c 61 74 65 73 20 74 68 65 20 6f   populates the o
233d0 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73  verflow page-lis
233e0 74 20 63 61 63 68 65 20 61 72 72 61 79 20 28 42  t cache array (B
233f0 74 43 75 72 73 6f 72 2e 61 4f 76 65 72 66 6c 6f  tCursor.aOverflo
23400 77 29 2e 20 0a 2a 2a 20 53 75 62 73 65 71 75 65  w). .** Subseque
23410 6e 74 20 63 61 6c 6c 73 20 75 73 65 20 74 68 69  nt calls use thi
23420 73 20 63 61 63 68 65 20 74 6f 20 6d 61 6b 65 20  s cache to make 
23430 73 65 65 6b 69 6e 67 20 74 6f 20 74 68 65 20 73  seeking to the s
23440 75 70 70 6c 69 65 64 20 6f 66 66 73 65 74 20 0a  upplied offset .
23450 2a 2a 20 6d 6f 72 65 20 65 66 66 69 63 69 65 6e  ** more efficien
23460 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 61 6e  t..**.** Once an
23470 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c   overflow page-l
23480 69 73 74 20 63 61 63 68 65 20 68 61 73 20 62 65  ist cache has be
23490 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c 20 69 74  en allocated, it
234a0 20 6d 61 79 20 62 65 0a 2a 2a 20 69 6e 76 61 6c   may be.** inval
234b0 69 64 61 74 65 64 20 69 66 20 73 6f 6d 65 20 6f  idated if some o
234c0 74 68 65 72 20 63 75 72 73 6f 72 20 77 72 69 74  ther cursor writ
234d0 65 73 20 74 6f 20 74 68 65 20 73 61 6d 65 20 74  es to the same t
234e0 61 62 6c 65 2c 20 6f 72 20 69 66 0a 2a 2a 20 74  able, or if.** t
234f0 68 65 20 63 75 72 73 6f 72 20 69 73 20 6d 6f 76  he cursor is mov
23500 65 64 20 74 6f 20 61 20 64 69 66 66 65 72 65 6e  ed to a differen
23510 74 20 72 6f 77 2e 20 41 64 64 69 74 69 6f 6e 61  t row. Additiona
23520 6c 6c 79 2c 20 69 6e 20 61 75 74 6f 2d 76 61 63  lly, in auto-vac
23530 75 75 6d 0a 2a 2a 20 6d 6f 64 65 2c 20 74 68 65  uum.** mode, the
23540 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 76 65 6e 74   following event
23550 73 20 6d 61 79 20 69 6e 76 61 6c 69 64 61 74 65  s may invalidate
23560 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
23570 65 2d 6c 69 73 74 20 63 61 63 68 65 2e 0a 2a 2a  e-list cache..**
23580 0a 2a 2a 20 20 20 2a 20 41 6e 20 69 6e 63 72 65  .**   * An incre
23590 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 2c 0a 2a  mental vacuum,.*
235a0 2a 20 20 20 2a 20 41 20 63 6f 6d 6d 69 74 20 69  *   * A commit i
235b0 6e 20 61 75 74 6f 5f 76 61 63 75 75 6d 3d 22 66  n auto_vacuum="f
235c0 75 6c 6c 22 20 6d 6f 64 65 2c 0a 2a 2a 20 20 20  ull" mode,.**   
235d0 2a 20 43 72 65 61 74 69 6e 67 20 61 20 74 61 62  * Creating a tab
235e0 6c 65 20 28 6d 61 79 20 72 65 71 75 69 72 65 20  le (may require 
235f0 6d 6f 76 69 6e 67 20 61 6e 20 6f 76 65 72 66 6c  moving an overfl
23600 6f 77 20 70 61 67 65 29 2e 0a 2a 2f 0a 73 74 61  ow page)..*/.sta
23610 74 69 63 20 69 6e 74 20 61 63 63 65 73 73 50 61  tic int accessPa
23620 79 6c 6f 61 64 28 0a 20 20 42 74 43 75 72 73 6f  yload(.  BtCurso
23630 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20 2f 2a  r *pCur,      /*
23640 20 43 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67   Cursor pointing
23650 20 74 6f 20 65 6e 74 72 79 20 74 6f 20 72 65 61   to entry to rea
23660 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32 20  d from */.  u32 
23670 6f 66 66 73 65 74 2c 20 20 20 20 20 20 20 20 20  offset,         
23680 20 2f 2a 20 42 65 67 69 6e 20 72 65 61 64 69 6e   /* Begin readin
23690 67 20 74 68 69 73 20 66 61 72 20 69 6e 74 6f 20  g this far into 
236a0 70 61 79 6c 6f 61 64 20 2a 2f 0a 20 20 75 33 32  payload */.  u32
236b0 20 61 6d 74 2c 20 20 20 20 20 20 20 20 20 20 20   amt,           
236c0 20 20 2f 2a 20 52 65 61 64 20 74 68 69 73 20 6d    /* Read this m
236d0 61 6e 79 20 62 79 74 65 73 20 2a 2f 0a 20 20 75  any bytes */.  u
236e0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 42  nsigned char *pB
236f0 75 66 2c 20 2f 2a 20 57 72 69 74 65 20 74 68 65  uf, /* Write the
23700 20 62 79 74 65 73 20 69 6e 74 6f 20 74 68 69 73   bytes into this
23710 20 62 75 66 66 65 72 20 2a 2f 20 0a 20 20 69 6e   buffer */ .  in
23720 74 20 65 4f 70 20 20 20 20 20 20 20 20 20 20 20  t eOp           
23730 20 20 20 2f 2a 20 7a 65 72 6f 20 74 6f 20 72 65     /* zero to re
23740 61 64 2e 20 6e 6f 6e 2d 7a 65 72 6f 20 74 6f 20  ad. non-zero to 
23750 77 72 69 74 65 2e 20 2a 2f 0a 29 7b 0a 20 20 75  write. */.){.  u
23760 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 50  nsigned char *aP
23770 61 79 6c 6f 61 64 3b 0a 20 20 69 6e 74 20 72 63  ayload;.  int rc
23780 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
23790 69 6e 74 20 69 49 64 78 20 3d 20 30 3b 0a 20 20  int iIdx = 0;.  
237a0 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d  MemPage *pPage =
237b0 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
237c0 75 72 2d 3e 69 50 61 67 65 5d 3b 20 2f 2a 20 42  ur->iPage]; /* B
237d0 74 72 65 65 20 70 61 67 65 20 6f 66 20 63 75 72  tree page of cur
237e0 72 65 6e 74 20 65 6e 74 72 79 20 2a 2f 0a 20 20  rent entry */.  
237f0 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
23800 70 43 75 72 2d 3e 70 42 74 3b 20 20 20 20 20 20  pCur->pBt;      
23810 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
23820 74 72 65 65 20 74 68 69 73 20 63 75 72 73 6f 72  tree this cursor
23830 20 62 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a 23   belongs to */.#
23840 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 49 52  ifdef SQLITE_DIR
23850 45 43 54 5f 4f 56 45 52 46 4c 4f 57 5f 52 45 41  ECT_OVERFLOW_REA
23860 44 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  D.  unsigned cha
23870 72 20 2a 20 63 6f 6e 73 74 20 70 42 75 66 53 74  r * const pBufSt
23880 61 72 74 20 3d 20 70 42 75 66 3b 0a 20 20 69 6e  art = pBuf;.  in
23890 74 20 62 45 6e 64 3b 20 20 20 20 20 20 20 20 20  t bEnd;         
238a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
238b0 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
238c0 69 66 20 72 65 61 64 69 6e 67 20 74 6f 20 65 6e  if reading to en
238d0 64 20 6f 66 20 64 61 74 61 20 2a 2f 0a 23 65 6e  d of data */.#en
238e0 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70  dif..  assert( p
238f0 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74  Page );.  assert
23900 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
23910 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
23920 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
23930 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
23940 65 5d 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  e]<pPage->nCell 
23950 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  );.  assert( cur
23960 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
23970 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
23980 20 65 4f 70 21 3d 32 20 7c 7c 20 6f 66 66 73 65   eOp!=2 || offse
23990 74 3d 3d 30 20 29 3b 20 20 20 20 2f 2a 20 41 6c  t==0 );    /* Al
239a0 77 61 79 73 20 73 74 61 72 74 20 66 72 6f 6d 20  ways start from 
239b0 62 65 67 69 6e 6e 69 6e 67 20 66 6f 72 20 65 4f  beginning for eO
239c0 70 3d 3d 32 20 2a 2f 0a 0a 20 20 67 65 74 43 65  p==2 */..  getCe
239d0 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20  llInfo(pCur);.  
239e0 61 50 61 79 6c 6f 61 64 20 3d 20 70 43 75 72 2d  aPayload = pCur-
239f0 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64 3b 0a  >info.pPayload;.
23a00 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 49  #ifdef SQLITE_DI
23a10 52 45 43 54 5f 4f 56 45 52 46 4c 4f 57 5f 52 45  RECT_OVERFLOW_RE
23a20 41 44 0a 20 20 62 45 6e 64 20 3d 20 6f 66 66 73  AD.  bEnd = offs
23a30 65 74 2b 61 6d 74 3d 3d 70 43 75 72 2d 3e 69 6e  et+amt==pCur->in
23a40 66 6f 2e 6e 50 61 79 6c 6f 61 64 3b 0a 23 65 6e  fo.nPayload;.#en
23a50 64 69 66 0a 20 20 61 73 73 65 72 74 28 20 6f 66  dif.  assert( of
23a60 66 73 65 74 2b 61 6d 74 20 3c 3d 20 70 43 75 72  fset+amt <= pCur
23a70 2d 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20  ->info.nPayload 
23a80 29 3b 0a 0a 20 20 69 66 28 20 26 61 50 61 79 6c  );..  if( &aPayl
23a90 6f 61 64 5b 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  oad[pCur->info.n
23aa0 4c 6f 63 61 6c 5d 20 3e 20 26 70 50 61 67 65 2d  Local] > &pPage-
23ab0 3e 61 44 61 74 61 5b 70 42 74 2d 3e 75 73 61 62  >aData[pBt->usab
23ac0 6c 65 53 69 7a 65 5d 20 29 7b 0a 20 20 20 20 2f  leSize] ){.    /
23ad0 2a 20 54 72 79 69 6e 67 20 74 6f 20 72 65 61 64  * Trying to read
23ae0 20 6f 72 20 77 72 69 74 65 20 70 61 73 74 20 74   or write past t
23af0 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 64 61  he end of the da
23b00 74 61 20 69 73 20 61 6e 20 65 72 72 6f 72 20 2a  ta is an error *
23b10 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  /.    return SQL
23b20 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
23b30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63  ;.  }..  /* Chec
23b40 6b 20 69 66 20 64 61 74 61 20 6d 75 73 74 20 62  k if data must b
23b50 65 20 72 65 61 64 2f 77 72 69 74 74 65 6e 20 74  e read/written t
23b60 6f 2f 66 72 6f 6d 20 74 68 65 20 62 74 72 65 65  o/from the btree
23b70 20 70 61 67 65 20 69 74 73 65 6c 66 2e 20 2a 2f   page itself. */
23b80 0a 20 20 69 66 28 20 6f 66 66 73 65 74 3c 70 43  .  if( offset<pC
23b90 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20  ur->info.nLocal 
23ba0 29 7b 0a 20 20 20 20 69 6e 74 20 61 20 3d 20 61  ){.    int a = a
23bb0 6d 74 3b 0a 20 20 20 20 69 66 28 20 61 2b 6f 66  mt;.    if( a+of
23bc0 66 73 65 74 3e 70 43 75 72 2d 3e 69 6e 66 6f 2e  fset>pCur->info.
23bd0 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20  nLocal ){.      
23be0 61 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  a = pCur->info.n
23bf0 4c 6f 63 61 6c 20 2d 20 6f 66 66 73 65 74 3b 0a  Local - offset;.
23c00 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 63      }.    rc = c
23c10 6f 70 79 50 61 79 6c 6f 61 64 28 26 61 50 61 79  opyPayload(&aPay
23c20 6c 6f 61 64 5b 6f 66 66 73 65 74 5d 2c 20 70 42  load[offset], pB
23c30 75 66 2c 20 61 2c 20 28 65 4f 70 20 26 20 30 78  uf, a, (eOp & 0x
23c40 30 31 29 2c 20 70 50 61 67 65 2d 3e 70 44 62 50  01), pPage->pDbP
23c50 61 67 65 29 3b 0a 20 20 20 20 6f 66 66 73 65 74  age);.    offset
23c60 20 3d 20 30 3b 0a 20 20 20 20 70 42 75 66 20 2b   = 0;.    pBuf +
23c70 3d 20 61 3b 0a 20 20 20 20 61 6d 74 20 2d 3d 20  = a;.    amt -= 
23c80 61 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  a;.  }else{.    
23c90 6f 66 66 73 65 74 20 2d 3d 20 70 43 75 72 2d 3e  offset -= pCur->
23ca0 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 7d  info.nLocal;.  }
23cb0 0a 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  ...  if( rc==SQL
23cc0 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20  ITE_OK && amt>0 
23cd0 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 75 33 32  ){.    const u32
23ce0 20 6f 76 66 6c 53 69 7a 65 20 3d 20 70 42 74 2d   ovflSize = pBt-
23cf0 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b  >usableSize - 4;
23d00 20 20 2f 2a 20 42 79 74 65 73 20 63 6f 6e 74 65    /* Bytes conte
23d10 6e 74 20 70 65 72 20 6f 76 66 6c 20 70 61 67 65  nt per ovfl page
23d20 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 65 78   */.    Pgno nex
23d30 74 50 61 67 65 3b 0a 0a 20 20 20 20 6e 65 78 74  tPage;..    next
23d40 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28  Page = get4byte(
23d50 26 61 50 61 79 6c 6f 61 64 5b 70 43 75 72 2d 3e  &aPayload[pCur->
23d60 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d 29 3b 0a 0a  info.nLocal]);..
23d70 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 42 74      /* If the Bt
23d80 43 75 72 73 6f 72 2e 61 4f 76 65 72 66 6c 6f 77  Cursor.aOverflow
23d90 5b 5d 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20  [] has not been 
23da0 61 6c 6c 6f 63 61 74 65 64 2c 20 61 6c 6c 6f 63  allocated, alloc
23db0 61 74 65 20 69 74 20 6e 6f 77 2e 0a 20 20 20 20  ate it now..    
23dc0 2a 2a 20 45 78 63 65 70 74 2c 20 64 6f 20 6e 6f  ** Except, do no
23dd0 74 20 61 6c 6c 6f 63 61 74 65 20 61 4f 76 65 72  t allocate aOver
23de0 66 6c 6f 77 5b 5d 20 66 6f 72 20 65 4f 70 3d 3d  flow[] for eOp==
23df0 32 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  2..    **.    **
23e00 20 54 68 65 20 61 4f 76 65 72 66 6c 6f 77 5b 5d   The aOverflow[]
23e10 20 61 72 72 61 79 20 69 73 20 73 69 7a 65 64 20   array is sized 
23e20 61 74 20 6f 6e 65 20 65 6e 74 72 79 20 66 6f 72  at one entry for
23e30 20 65 61 63 68 20 6f 76 65 72 66 6c 6f 77 20 70   each overflow p
23e40 61 67 65 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68  age.    ** in th
23e50 65 20 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e  e overflow chain
23e60 2e 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65  . The page numbe
23e70 72 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 6f  r of the first o
23e80 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 73 0a  verflow page is.
23e90 20 20 20 20 2a 2a 20 73 74 6f 72 65 64 20 69 6e      ** stored in
23ea0 20 61 4f 76 65 72 66 6c 6f 77 5b 30 5d 2c 20 65   aOverflow[0], e
23eb0 74 63 2e 20 41 20 76 61 6c 75 65 20 6f 66 20 30  tc. A value of 0
23ec0 20 69 6e 20 74 68 65 20 61 4f 76 65 72 66 6c 6f   in the aOverflo
23ed0 77 5b 5d 20 61 72 72 61 79 0a 20 20 20 20 2a 2a  w[] array.    **
23ee0 20 6d 65 61 6e 73 20 22 6e 6f 74 20 79 65 74 20   means "not yet 
23ef0 6b 6e 6f 77 6e 22 20 28 74 68 65 20 63 61 63 68  known" (the cach
23f00 65 20 69 73 20 6c 61 7a 69 6c 79 20 70 6f 70 75  e is lazily popu
23f10 6c 61 74 65 64 29 2e 0a 20 20 20 20 2a 2f 0a 20  lated)..    */. 
23f20 20 20 20 69 66 28 20 65 4f 70 21 3d 32 20 26 26     if( eOp!=2 &&
23f30 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73   (pCur->curFlags
23f40 20 26 20 42 54 43 46 5f 56 61 6c 69 64 4f 76 66   & BTCF_ValidOvf
23f50 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  l)==0 ){.      i
23f60 6e 74 20 6e 4f 76 66 6c 20 3d 20 28 70 43 75 72  nt nOvfl = (pCur
23f70 2d 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 2d  ->info.nPayload-
23f80 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61  pCur->info.nLoca
23f90 6c 2b 6f 76 66 6c 53 69 7a 65 2d 31 29 2f 6f 76  l+ovflSize-1)/ov
23fa0 66 6c 53 69 7a 65 3b 0a 20 20 20 20 20 20 69 66  flSize;.      if
23fb0 28 20 6e 4f 76 66 6c 3e 70 43 75 72 2d 3e 6e 4f  ( nOvfl>pCur->nO
23fc0 76 66 6c 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20  vflAlloc ){.    
23fd0 20 20 20 20 50 67 6e 6f 20 2a 61 4e 65 77 20 3d      Pgno *aNew =
23fe0 20 28 50 67 6e 6f 2a 29 73 71 6c 69 74 65 33 52   (Pgno*)sqlite3R
23ff0 65 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20 20 20  ealloc(.        
24000 20 20 20 20 70 43 75 72 2d 3e 61 4f 76 65 72 66      pCur->aOverf
24010 6c 6f 77 2c 20 6e 4f 76 66 6c 2a 32 2a 73 69 7a  low, nOvfl*2*siz
24020 65 6f 66 28 50 67 6e 6f 29 0a 20 20 20 20 20 20  eof(Pgno).      
24030 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28    );.        if(
24040 20 61 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20   aNew==0 ){.    
24050 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
24060 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20  E_NOMEM;.       
24070 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
24080 20 20 70 43 75 72 2d 3e 6e 4f 76 66 6c 41 6c 6c    pCur->nOvflAll
24090 6f 63 20 3d 20 6e 4f 76 66 6c 2a 32 3b 0a 20 20  oc = nOvfl*2;.  
240a0 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 61 4f          pCur->aO
240b0 76 65 72 66 6c 6f 77 20 3d 20 61 4e 65 77 3b 0a  verflow = aNew;.
240c0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
240d0 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  }.      if( rc==
240e0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
240f0 20 20 20 20 20 6d 65 6d 73 65 74 28 70 43 75 72       memset(pCur
24100 2d 3e 61 4f 76 65 72 66 6c 6f 77 2c 20 30 2c 20  ->aOverflow, 0, 
24110 6e 4f 76 66 6c 2a 73 69 7a 65 6f 66 28 50 67 6e  nOvfl*sizeof(Pgn
24120 6f 29 29 3b 0a 20 20 20 20 20 20 20 20 70 43 75  o));.        pCu
24130 72 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20 42  r->curFlags |= B
24140 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 3b 0a 20  TCF_ValidOvfl;. 
24150 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
24160 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 76 65 72    /* If the over
24170 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63  flow page-list c
24180 61 63 68 65 20 68 61 73 20 62 65 65 6e 20 61 6c  ache has been al
24190 6c 6f 63 61 74 65 64 20 61 6e 64 20 74 68 65 0a  located and the.
241a0 20 20 20 20 2a 2a 20 65 6e 74 72 79 20 66 6f 72      ** entry for
241b0 20 74 68 65 20 66 69 72 73 74 20 72 65 71 75 69   the first requi
241c0 72 65 64 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  red overflow pag
241d0 65 20 69 73 20 76 61 6c 69 64 2c 20 73 6b 69 70  e is valid, skip
241e0 0a 20 20 20 20 2a 2a 20 64 69 72 65 63 74 6c 79  .    ** directly
241f0 20 74 6f 20 69 74 2e 0a 20 20 20 20 2a 2f 0a 20   to it..    */. 
24200 20 20 20 69 66 28 20 28 70 43 75 72 2d 3e 63 75     if( (pCur->cu
24210 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 56 61  rFlags & BTCF_Va
24220 6c 69 64 4f 76 66 6c 29 21 3d 30 0a 20 20 20 20  lidOvfl)!=0.    
24230 20 26 26 20 70 43 75 72 2d 3e 61 4f 76 65 72 66   && pCur->aOverf
24240 6c 6f 77 5b 6f 66 66 73 65 74 2f 6f 76 66 6c 53  low[offset/ovflS
24250 69 7a 65 5d 0a 20 20 20 20 29 7b 0a 20 20 20 20  ize].    ){.    
24260 20 20 69 49 64 78 20 3d 20 28 6f 66 66 73 65 74    iIdx = (offset
24270 2f 6f 76 66 6c 53 69 7a 65 29 3b 0a 20 20 20 20  /ovflSize);.    
24280 20 20 6e 65 78 74 50 61 67 65 20 3d 20 70 43 75    nextPage = pCu
24290 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64  r->aOverflow[iId
242a0 78 5d 3b 0a 20 20 20 20 20 20 6f 66 66 73 65 74  x];.      offset
242b0 20 3d 20 28 6f 66 66 73 65 74 25 6f 76 66 6c 53   = (offset%ovflS
242c0 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  ize);.    }..   
242d0 20 66 6f 72 28 20 3b 20 72 63 3d 3d 53 51 4c 49   for( ; rc==SQLI
242e0 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20 26  TE_OK && amt>0 &
242f0 26 20 6e 65 78 74 50 61 67 65 3b 20 69 49 64 78  & nextPage; iIdx
24300 2b 2b 29 7b 0a 0a 20 20 20 20 20 20 2f 2a 20 49  ++){..      /* I
24310 66 20 72 65 71 75 69 72 65 64 2c 20 70 6f 70 75  f required, popu
24320 6c 61 74 65 20 74 68 65 20 6f 76 65 72 66 6c 6f  late the overflo
24330 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68  w page-list cach
24340 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  e. */.      if( 
24350 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20  (pCur->curFlags 
24360 26 20 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c  & BTCF_ValidOvfl
24370 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
24380 61 73 73 65 72 74 28 21 70 43 75 72 2d 3e 61 4f  assert(!pCur->aO
24390 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 20 7c 7c  verflow[iIdx] ||
243a0 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77   pCur->aOverflow
243b0 5b 69 49 64 78 5d 3d 3d 6e 65 78 74 50 61 67 65  [iIdx]==nextPage
243c0 29 3b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d  );.        pCur-
243d0 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d  >aOverflow[iIdx]
243e0 20 3d 20 6e 65 78 74 50 61 67 65 3b 0a 20 20 20   = nextPage;.   
243f0 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20     }..      if( 
24400 6f 66 66 73 65 74 3e 3d 6f 76 66 6c 53 69 7a 65  offset>=ovflSize
24410 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   ){.        /* T
24420 68 65 20 6f 6e 6c 79 20 72 65 61 73 6f 6e 20 74  he only reason t
24430 6f 20 72 65 61 64 20 74 68 69 73 20 70 61 67 65  o read this page
24440 20 69 73 20 74 6f 20 6f 62 74 61 69 6e 20 74 68   is to obtain th
24450 65 20 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a  e page.        *
24460 2a 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65  * number for the
24470 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74 68   next page in th
24480 65 20 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e  e overflow chain
24490 2e 20 54 68 65 20 70 61 67 65 0a 20 20 20 20 20  . The page.     
244a0 20 20 20 2a 2a 20 64 61 74 61 20 69 73 20 6e 6f     ** data is no
244b0 74 20 72 65 71 75 69 72 65 64 2e 20 53 6f 20 66  t required. So f
244c0 69 72 73 74 20 74 72 79 20 74 6f 20 6c 6f 6f 6b  irst try to look
244d0 75 70 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 0a  up the overflow.
244e0 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65 2d          ** page-
244f0 6c 69 73 74 20 63 61 63 68 65 2c 20 69 66 20 61  list cache, if a
24500 6e 79 2c 20 74 68 65 6e 20 66 61 6c 6c 20 62 61  ny, then fall ba
24510 63 6b 20 74 6f 20 74 68 65 20 67 65 74 4f 76 65  ck to the getOve
24520 72 66 6c 6f 77 50 61 67 65 28 29 0a 20 20 20 20  rflowPage().    
24530 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e      ** function.
24540 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
24550 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74      ** Note that
24560 20 74 68 65 20 61 4f 76 65 72 66 6c 6f 77 5b 5d   the aOverflow[]
24570 20 61 72 72 61 79 20 6d 75 73 74 20 62 65 20 61   array must be a
24580 6c 6c 6f 63 61 74 65 64 20 62 65 63 61 75 73 65  llocated because
24590 20 65 4f 70 21 3d 32 0a 20 20 20 20 20 20 20 20   eOp!=2.        
245a0 2a 2a 20 68 65 72 65 2e 20 20 49 66 20 65 4f 70  ** here.  If eOp
245b0 3d 3d 32 2c 20 74 68 65 6e 20 6f 66 66 73 65 74  ==2, then offset
245c0 3d 3d 30 20 61 6e 64 20 74 68 69 73 20 62 72 61  ==0 and this bra
245d0 6e 63 68 20 69 73 20 6e 65 76 65 72 20 74 61 6b  nch is never tak
245e0 65 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  en..        */. 
245f0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 65         assert( e
24600 4f 70 21 3d 32 20 29 3b 0a 20 20 20 20 20 20 20  Op!=2 );.       
24610 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 63   assert( pCur->c
24620 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 56  urFlags & BTCF_V
24630 61 6c 69 64 4f 76 66 6c 20 29 3b 0a 20 20 20 20  alidOvfl );.    
24640 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
24650 2d 3e 70 42 74 72 65 65 2d 3e 64 62 3d 3d 70 42  ->pBtree->db==pB
24660 74 2d 3e 64 62 20 29 3b 0a 20 20 20 20 20 20 20  t->db );.       
24670 20 69 66 28 20 70 43 75 72 2d 3e 61 4f 76 65 72   if( pCur->aOver
24680 66 6c 6f 77 5b 69 49 64 78 2b 31 5d 20 29 7b 0a  flow[iIdx+1] ){.
24690 20 20 20 20 20 20 20 20 20 20 6e 65 78 74 50 61            nextPa
246a0 67 65 20 3d 20 70 43 75 72 2d 3e 61 4f 76 65 72  ge = pCur->aOver
246b0 66 6c 6f 77 5b 69 49 64 78 2b 31 5d 3b 0a 20 20  flow[iIdx+1];.  
246c0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
246d0 20 20 20 20 20 20 20 72 63 20 3d 20 67 65 74 4f         rc = getO
246e0 76 65 72 66 6c 6f 77 50 61 67 65 28 70 42 74 2c  verflowPage(pBt,
246f0 20 6e 65 78 74 50 61 67 65 2c 20 30 2c 20 26 6e   nextPage, 0, &n
24700 65 78 74 50 61 67 65 29 3b 0a 20 20 20 20 20 20  extPage);.      
24710 20 20 7d 0a 20 20 20 20 20 20 20 20 6f 66 66 73    }.        offs
24720 65 74 20 2d 3d 20 6f 76 66 6c 53 69 7a 65 3b 0a  et -= ovflSize;.
24730 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
24740 20 20 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20       /* Need to 
24750 72 65 61 64 20 74 68 69 73 20 70 61 67 65 20 70  read this page p
24760 72 6f 70 65 72 6c 79 2e 20 49 74 20 63 6f 6e 74  roperly. It cont
24770 61 69 6e 73 20 73 6f 6d 65 20 6f 66 20 74 68 65  ains some of the
24780 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 61 6e 67  .        ** rang
24790 65 20 6f 66 20 64 61 74 61 20 74 68 61 74 20 69  e of data that i
247a0 73 20 62 65 69 6e 67 20 72 65 61 64 20 28 65 4f  s being read (eO
247b0 70 3d 3d 30 29 20 6f 72 20 77 72 69 74 74 65 6e  p==0) or written
247c0 20 28 65 4f 70 21 3d 30 29 2e 0a 20 20 20 20 20   (eOp!=0)..     
247d0 20 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c     */.#ifdef SQL
247e0 49 54 45 5f 44 49 52 45 43 54 5f 4f 56 45 52 46  ITE_DIRECT_OVERF
247f0 4c 4f 57 5f 52 45 41 44 0a 20 20 20 20 20 20 20  LOW_READ.       
24800 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66   sqlite3_file *f
24810 64 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  d;.#endif.      
24820 20 20 69 6e 74 20 61 20 3d 20 61 6d 74 3b 0a 20    int a = amt;. 
24830 20 20 20 20 20 20 20 69 66 28 20 61 20 2b 20 6f         if( a + o
24840 66 66 73 65 74 20 3e 20 6f 76 66 6c 53 69 7a 65  ffset > ovflSize
24850 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 20   ){.          a 
24860 3d 20 6f 76 66 6c 53 69 7a 65 20 2d 20 6f 66 66  = ovflSize - off
24870 73 65 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a  set;.        }..
24880 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 49  #ifdef SQLITE_DI
24890 52 45 43 54 5f 4f 56 45 52 46 4c 4f 57 5f 52 45  RECT_OVERFLOW_RE
248a0 41 44 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66  AD.        /* If
248b0 20 61 6c 6c 20 74 68 65 20 66 6f 6c 6c 6f 77 69   all the followi
248c0 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 20 20 20  ng are true:.   
248d0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
248e0 2a 2a 20 20 20 31 29 20 74 68 69 73 20 69 73 20  **   1) this is 
248f0 61 20 72 65 61 64 20 6f 70 65 72 61 74 69 6f 6e  a read operation
24900 2c 20 61 6e 64 20 0a 20 20 20 20 20 20 20 20 2a  , and .        *
24910 2a 20 20 20 32 29 20 64 61 74 61 20 69 73 20 72  *   2) data is r
24920 65 71 75 69 72 65 64 20 66 72 6f 6d 20 74 68 65  equired from the
24930 20 73 74 61 72 74 20 6f 66 20 74 68 69 73 20 6f   start of this o
24940 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 61 6e  verflow page, an
24950 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 33  d.        **   3
24960 29 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  ) the database i
24970 73 20 66 69 6c 65 2d 62 61 63 6b 65 64 2c 20 61  s file-backed, a
24980 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  nd.        **   
24990 34 29 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6f  4) there is no o
249a0 70 65 6e 20 77 72 69 74 65 2d 74 72 61 6e 73 61  pen write-transa
249b0 63 74 69 6f 6e 2c 20 61 6e 64 0a 20 20 20 20 20  ction, and.     
249c0 20 20 20 2a 2a 20 20 20 35 29 20 74 68 65 20 64     **   5) the d
249d0 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20 61  atabase is not a
249e0 20 57 41 4c 20 64 61 74 61 62 61 73 65 2c 0a 20   WAL database,. 
249f0 20 20 20 20 20 20 20 2a 2a 20 20 20 36 29 20 61         **   6) a
24a00 6c 6c 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65  ll data from the
24a10 20 70 61 67 65 20 69 73 20 62 65 69 6e 67 20 72   page is being r
24a20 65 61 64 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20  ead..        ** 
24a30 20 20 37 29 20 61 74 20 6c 65 61 73 74 20 34 20    7) at least 4 
24a40 62 79 74 65 73 20 68 61 76 65 20 61 6c 72 65 61  bytes have alrea
24a50 64 79 20 62 65 65 6e 20 72 65 61 64 20 69 6e 74  dy been read int
24a60 6f 20 74 68 65 20 6f 75 74 70 75 74 20 62 75 66  o the output buf
24a70 66 65 72 20 0a 20 20 20 20 20 20 20 20 2a 2a 0a  fer .        **.
24a80 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20          ** then 
24a90 64 61 74 61 20 63 61 6e 20 62 65 20 72 65 61 64  data can be read
24aa0 20 64 69 72 65 63 74 6c 79 20 66 72 6f 6d 20 74   directly from t
24ab0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
24ac0 20 69 6e 74 6f 20 74 68 65 0a 20 20 20 20 20 20   into the.      
24ad0 20 20 2a 2a 20 6f 75 74 70 75 74 20 62 75 66 66    ** output buff
24ae0 65 72 2c 20 62 79 70 61 73 73 69 6e 67 20 74 68  er, bypassing th
24af0 65 20 70 61 67 65 2d 63 61 63 68 65 20 61 6c 74  e page-cache alt
24b00 6f 67 65 74 68 65 72 2e 20 54 68 69 73 20 73 70  ogether. This sp
24b10 65 65 64 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  eeds.        ** 
24b20 75 70 20 6c 6f 61 64 69 6e 67 20 6c 61 72 67 65  up loading large
24b30 20 72 65 63 6f 72 64 73 20 74 68 61 74 20 73 70   records that sp
24b40 61 6e 20 6d 61 6e 79 20 6f 76 65 72 66 6c 6f 77  an many overflow
24b50 20 70 61 67 65 73 2e 0a 20 20 20 20 20 20 20 20   pages..        
24b60 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 28  */.        if( (
24b70 65 4f 70 26 30 78 30 31 29 3d 3d 30 20 20 20 20  eOp&0x01)==0    
24b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24ba0 20 20 2f 2a 20 28 31 29 20 2a 2f 0a 20 20 20 20    /* (1) */.    
24bb0 20 20 20 20 20 26 26 20 6f 66 66 73 65 74 3d 3d       && offset==
24bc0 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
24bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24be0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28 32             /* (2
24bf0 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 26 26  ) */.         &&
24c00 20 28 62 45 6e 64 20 7c 7c 20 61 3d 3d 6f 76 66   (bEnd || a==ovf
24c10 6c 53 69 7a 65 29 20 20 20 20 20 20 20 20 20 20  lSize)          
24c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24c30 20 20 20 20 2f 2a 20 28 36 29 20 2a 2f 0a 20 20      /* (6) */.  
24c40 20 20 20 20 20 20 20 26 26 20 70 42 74 2d 3e 69         && pBt->i
24c50 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52  nTransaction==TR
24c60 41 4e 53 5f 52 45 41 44 20 20 20 20 20 20 20 20  ANS_READ        
24c70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24c80 28 34 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  (4) */.         
24c90 26 26 20 28 66 64 20 3d 20 73 71 6c 69 74 65 33  && (fd = sqlite3
24ca0 50 61 67 65 72 46 69 6c 65 28 70 42 74 2d 3e 70  PagerFile(pBt->p
24cb0 50 61 67 65 72 29 29 2d 3e 70 4d 65 74 68 6f 64  Pager))->pMethod
24cc0 73 20 20 20 20 20 2f 2a 20 28 33 29 20 2a 2f 0a  s     /* (3) */.
24cd0 20 20 20 20 20 20 20 20 20 26 26 20 70 42 74 2d           && pBt-
24ce0 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 31  >pPage1->aData[1
24cf0 39 5d 3d 3d 30 78 30 31 20 20 20 20 20 20 20 20  9]==0x01        
24d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
24d10 2a 20 28 35 29 20 2a 2f 0a 20 20 20 20 20 20 20  * (5) */.       
24d20 20 20 26 26 20 26 70 42 75 66 5b 2d 34 5d 3e 3d    && &pBuf[-4]>=
24d30 70 42 75 66 53 74 61 72 74 20 20 20 20 20 20 20  pBufStart       
24d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24d50 20 20 20 20 20 20 20 20 2f 2a 20 28 37 29 20 2a          /* (7) *
24d60 2f 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20  /.        ){.   
24d70 20 20 20 20 20 20 20 75 38 20 61 53 61 76 65 5b         u8 aSave[
24d80 34 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 75 38  4];.          u8
24d90 20 2a 61 57 72 69 74 65 20 3d 20 26 70 42 75 66   *aWrite = &pBuf
24da0 5b 2d 34 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  [-4];.          
24db0 61 73 73 65 72 74 28 20 61 57 72 69 74 65 3e 3d  assert( aWrite>=
24dc0 70 42 75 66 53 74 61 72 74 20 29 3b 20 20 20 20  pBufStart );    
24dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24de0 20 20 20 20 20 2f 2a 20 68 65 6e 63 65 20 28 37       /* hence (7
24df0 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 6d  ) */.          m
24e00 65 6d 63 70 79 28 61 53 61 76 65 2c 20 61 57 72  emcpy(aSave, aWr
24e10 69 74 65 2c 20 34 29 3b 0a 20 20 20 20 20 20 20  ite, 4);.       
24e20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
24e30 73 52 65 61 64 28 66 64 2c 20 61 57 72 69 74 65  sRead(fd, aWrite
24e40 2c 20 61 2b 34 2c 20 28 69 36 34 29 70 42 74 2d  , a+4, (i64)pBt-
24e50 3e 70 61 67 65 53 69 7a 65 2a 28 6e 65 78 74 50  >pageSize*(nextP
24e60 61 67 65 2d 31 29 29 3b 0a 20 20 20 20 20 20 20  age-1));.       
24e70 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20 67 65     nextPage = ge
24e80 74 34 62 79 74 65 28 61 57 72 69 74 65 29 3b 0a  t4byte(aWrite);.
24e90 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
24ea0 28 61 57 72 69 74 65 2c 20 61 53 61 76 65 2c 20  (aWrite, aSave, 
24eb0 34 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  4);.        }els
24ec0 65 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20 20  e.#endif..      
24ed0 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20 44 62    {.          Db
24ee0 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 20  Page *pDbPage;. 
24ef0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
24f00 6c 69 74 65 33 50 61 67 65 72 41 63 71 75 69 72  lite3PagerAcquir
24f10 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6e  e(pBt->pPager, n
24f20 65 78 74 50 61 67 65 2c 20 26 70 44 62 50 61 67  extPage, &pDbPag
24f30 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
24f40 20 28 28 65 4f 70 26 30 78 30 31 29 3d 3d 30 20   ((eOp&0x01)==0 
24f50 3f 20 50 41 47 45 52 5f 47 45 54 5f 52 45 41 44  ? PAGER_GET_READ
24f60 4f 4e 4c 59 20 3a 20 30 29 0a 20 20 20 20 20 20  ONLY : 0).      
24f70 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 20      );.         
24f80 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
24f90 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
24fa0 20 20 61 50 61 79 6c 6f 61 64 20 3d 20 73 71 6c    aPayload = sql
24fb0 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
24fc0 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  (pDbPage);.     
24fd0 20 20 20 20 20 20 20 6e 65 78 74 50 61 67 65 20         nextPage 
24fe0 3d 20 67 65 74 34 62 79 74 65 28 61 50 61 79 6c  = get4byte(aPayl
24ff0 6f 61 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20  oad);.          
25000 20 20 72 63 20 3d 20 63 6f 70 79 50 61 79 6c 6f    rc = copyPaylo
25010 61 64 28 26 61 50 61 79 6c 6f 61 64 5b 6f 66 66  ad(&aPayload[off
25020 73 65 74 2b 34 5d 2c 20 70 42 75 66 2c 20 61 2c  set+4], pBuf, a,
25030 20 28 65 4f 70 26 30 78 30 31 29 2c 20 70 44 62   (eOp&0x01), pDb
25040 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
25050 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
25060 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20  nref(pDbPage);. 
25070 20 20 20 20 20 20 20 20 20 20 20 6f 66 66 73 65             offse
25080 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  t = 0;.         
25090 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
250a0 20 20 20 20 20 61 6d 74 20 2d 3d 20 61 3b 0a 20       amt -= a;. 
250b0 20 20 20 20 20 20 20 70 42 75 66 20 2b 3d 20 61         pBuf += a
250c0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
250d0 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53    }..  if( rc==S
250e0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e  QLITE_OK && amt>
250f0 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
25100 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
25110 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  KPT;.  }.  retur
25120 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
25130 65 61 64 20 70 61 72 74 20 6f 66 20 74 68 65 20  ead part of the 
25140 6b 65 79 20 61 73 73 6f 63 69 61 74 65 64 20 77  key associated w
25150 69 74 68 20 63 75 72 73 6f 72 20 70 43 75 72 2e  ith cursor pCur.
25160 20 20 45 78 61 63 74 6c 79 0a 2a 2a 20 22 61 6d    Exactly.** "am
25170 74 22 20 62 79 74 65 73 20 77 69 6c 6c 20 62 65  t" bytes will be
25180 20 74 72 61 6e 73 66 65 72 72 65 64 20 69 6e 74   transferred int
25190 6f 20 70 42 75 66 5b 5d 2e 20 20 54 68 65 20 74  o pBuf[].  The t
251a0 72 61 6e 73 66 65 72 0a 2a 2a 20 62 65 67 69 6e  ransfer.** begin
251b0 73 20 61 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a  s at "offset"..*
251c0 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20  *.** The caller 
251d0 6d 75 73 74 20 65 6e 73 75 72 65 20 74 68 61 74  must ensure that
251e0 20 70 43 75 72 20 69 73 20 70 6f 69 6e 74 69 6e   pCur is pointin
251f0 67 20 74 6f 20 61 20 76 61 6c 69 64 20 72 6f 77  g to a valid row
25200 0a 2a 2a 20 69 6e 20 74 68 65 20 74 61 62 6c 65  .** in the table
25210 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53  ..**.** Return S
25220 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63  QLITE_OK on succ
25230 65 73 73 20 6f 72 20 61 6e 20 65 72 72 6f 72 20  ess or an error 
25240 63 6f 64 65 20 69 66 20 61 6e 79 74 68 69 6e 67  code if anything
25250 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 20   goes.** wrong. 
25260 20 41 6e 20 65 72 72 6f 72 20 69 73 20 72 65 74   An error is ret
25270 75 72 6e 65 64 20 69 66 20 22 6f 66 66 73 65 74  urned if "offset
25280 2b 61 6d 74 22 20 69 73 20 6c 61 72 67 65 72 20  +amt" is larger 
25290 74 68 61 6e 0a 2a 2a 20 74 68 65 20 61 76 61 69  than.** the avai
252a0 6c 61 62 6c 65 20 70 61 79 6c 6f 61 64 2e 0a 2a  lable payload..*
252b0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
252c0 65 65 4b 65 79 28 42 74 43 75 72 73 6f 72 20 2a  eeKey(BtCursor *
252d0 70 43 75 72 2c 20 75 33 32 20 6f 66 66 73 65 74  pCur, u32 offset
252e0 2c 20 75 33 32 20 61 6d 74 2c 20 76 6f 69 64 20  , u32 amt, void 
252f0 2a 70 42 75 66 29 7b 0a 20 20 61 73 73 65 72 74  *pBuf){.  assert
25300 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
25310 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ex(pCur) );.  as
25320 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
25330 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
25340 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
25350 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 26 26 20  ur->iPage>=0 && 
25360 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
25370 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20 61  r->iPage] );.  a
25380 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49  ssert( pCur->aiI
25390 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c  dx[pCur->iPage]<
253a0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
253b0 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c  r->iPage]->nCell
253c0 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 61 63 63   );.  return acc
253d0 65 73 73 50 61 79 6c 6f 61 64 28 70 43 75 72 2c  essPayload(pCur,
253e0 20 6f 66 66 73 65 74 2c 20 61 6d 74 2c 20 28 75   offset, amt, (u
253f0 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 70 42  nsigned char*)pB
25400 75 66 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  uf, 0);.}../*.**
25410 20 52 65 61 64 20 70 61 72 74 20 6f 66 20 74 68   Read part of th
25420 65 20 64 61 74 61 20 61 73 73 6f 63 69 61 74 65  e data associate
25430 64 20 77 69 74 68 20 63 75 72 73 6f 72 20 70 43  d with cursor pC
25440 75 72 2e 20 20 45 78 61 63 74 6c 79 0a 2a 2a 20  ur.  Exactly.** 
25450 22 61 6d 74 22 20 62 79 74 65 73 20 77 69 6c 6c  "amt" bytes will
25460 20 62 65 20 74 72 61 6e 73 66 65 72 65 64 20 69   be transfered i
25470 6e 74 6f 20 70 42 75 66 5b 5d 2e 20 20 54 68 65  nto pBuf[].  The
25480 20 74 72 61 6e 73 66 65 72 0a 2a 2a 20 62 65 67   transfer.** beg
25490 69 6e 73 20 61 74 20 22 6f 66 66 73 65 74 22 2e  ins at "offset".
254a0 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51  .**.** Return SQ
254b0 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65  LITE_OK on succe
254c0 73 73 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63  ss or an error c
254d0 6f 64 65 20 69 66 20 61 6e 79 74 68 69 6e 67 20  ode if anything 
254e0 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 20 20  goes.** wrong.  
254f0 41 6e 20 65 72 72 6f 72 20 69 73 20 72 65 74 75  An error is retu
25500 72 6e 65 64 20 69 66 20 22 6f 66 66 73 65 74 2b  rned if "offset+
25510 61 6d 74 22 20 69 73 20 6c 61 72 67 65 72 20 74  amt" is larger t
25520 68 61 6e 0a 2a 2a 20 74 68 65 20 61 76 61 69 6c  han.** the avail
25530 61 62 6c 65 20 70 61 79 6c 6f 61 64 2e 0a 2a 2f  able payload..*/
25540 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
25550 65 44 61 74 61 28 42 74 43 75 72 73 6f 72 20 2a  eData(BtCursor *
25560 70 43 75 72 2c 20 75 33 32 20 6f 66 66 73 65 74  pCur, u32 offset
25570 2c 20 75 33 32 20 61 6d 74 2c 20 76 6f 69 64 20  , u32 amt, void 
25580 2a 70 42 75 66 29 7b 0a 20 20 69 6e 74 20 72 63  *pBuf){.  int rc
25590 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
255a0 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a  E_OMIT_INCRBLOB.
255b0 20 20 69 66 20 28 20 70 43 75 72 2d 3e 65 53 74    if ( pCur->eSt
255c0 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41  ate==CURSOR_INVA
255d0 4c 49 44 20 29 7b 0a 20 20 20 20 72 65 74 75 72  LID ){.    retur
255e0 6e 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 3b 0a  n SQLITE_ABORT;.
255f0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73    }.#endif..  as
25600 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
25610 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
25620 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75    rc = restoreCu
25630 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75  rsorPosition(pCu
25640 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  r);.  if( rc==SQ
25650 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61  LITE_OK ){.    a
25660 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
25670 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
25680 44 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  D );.    assert(
25690 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20   pCur->iPage>=0 
256a0 26 26 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  && pCur->apPage[
256b0 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a  pCur->iPage] );.
256c0 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
256d0 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
256e0 61 67 65 5d 3c 70 43 75 72 2d 3e 61 70 50 61 67  age]<pCur->apPag
256f0 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e  e[pCur->iPage]->
25700 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 72 63 20  nCell );.    rc 
25710 3d 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28  = accessPayload(
25720 70 43 75 72 2c 20 6f 66 66 73 65 74 2c 20 61 6d  pCur, offset, am
25730 74 2c 20 70 42 75 66 2c 20 30 29 3b 0a 20 20 7d  t, pBuf, 0);.  }
25740 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
25750 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
25760 70 6f 69 6e 74 65 72 20 74 6f 20 70 61 79 6c 6f  pointer to paylo
25770 61 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  ad information f
25780 72 6f 6d 20 74 68 65 20 65 6e 74 72 79 20 74 68  rom the entry th
25790 61 74 20 74 68 65 20 0a 2a 2a 20 70 43 75 72 20  at the .** pCur 
257a0 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69  cursor is pointi
257b0 6e 67 20 74 6f 2e 20 20 54 68 65 20 70 6f 69 6e  ng to.  The poin
257c0 74 65 72 20 69 73 20 74 6f 20 74 68 65 20 62 65  ter is to the be
257d0 67 69 6e 6e 69 6e 67 20 6f 66 0a 2a 2a 20 74 68  ginning of.** th
257e0 65 20 6b 65 79 20 69 66 20 69 6e 64 65 78 20 62  e key if index b
257f0 74 72 65 65 73 20 28 70 50 61 67 65 2d 3e 69 6e  trees (pPage->in
25800 74 4b 65 79 3d 3d 30 29 20 61 6e 64 20 69 73 20  tKey==0) and is 
25810 74 68 65 20 64 61 74 61 20 66 6f 72 0a 2a 2a 20  the data for.** 
25820 74 61 62 6c 65 20 62 74 72 65 65 73 20 28 70 50  table btrees (pP
25830 61 67 65 2d 3e 69 6e 74 4b 65 79 3d 3d 31 29 2e  age->intKey==1).
25840 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   The number of b
25850 79 74 65 73 20 6f 66 20 61 76 61 69 6c 61 62 6c  ytes of availabl
25860 65 0a 2a 2a 20 6b 65 79 2f 64 61 74 61 20 69 73  e.** key/data is
25870 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 2a 70   written into *p
25880 41 6d 74 2e 20 20 49 66 20 2a 70 41 6d 74 3d 3d  Amt.  If *pAmt==
25890 30 2c 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75  0, then the valu
258a0 65 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 77 69  e.** returned wi
258b0 6c 6c 20 6e 6f 74 20 62 65 20 61 20 76 61 6c 69  ll not be a vali
258c0 64 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a  d pointer..**.**
258d0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
258e0 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e   an optimization
258f0 2e 20 20 49 74 20 69 73 20 63 6f 6d 6d 6f 6e 20  .  It is common 
25900 66 6f 72 20 74 68 65 20 65 6e 74 69 72 65 20 6b  for the entire k
25910 65 79 0a 2a 2a 20 61 6e 64 20 64 61 74 61 20 74  ey.** and data t
25920 6f 20 66 69 74 20 6f 6e 20 74 68 65 20 6c 6f 63  o fit on the loc
25930 61 6c 20 70 61 67 65 20 61 6e 64 20 66 6f 72 20  al page and for 
25940 74 68 65 72 65 20 74 6f 20 62 65 20 6e 6f 20 6f  there to be no o
25950 76 65 72 66 6c 6f 77 0a 2a 2a 20 70 61 67 65 73  verflow.** pages
25960 2e 20 20 57 68 65 6e 20 74 68 61 74 20 69 73 20  .  When that is 
25970 73 6f 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  so, this routine
25980 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20   can be used to 
25990 61 63 63 65 73 73 20 74 68 65 0a 2a 2a 20 6b 65  access the.** ke
259a0 79 20 61 6e 64 20 64 61 74 61 20 77 69 74 68 6f  y and data witho
259b0 75 74 20 6d 61 6b 69 6e 67 20 61 20 63 6f 70 79  ut making a copy
259c0 2e 20 20 49 66 20 74 68 65 20 6b 65 79 20 61 6e  .  If the key an
259d0 64 2f 6f 72 20 64 61 74 61 20 73 70 69 6c 6c 73  d/or data spills
259e0 0a 2a 2a 20 6f 6e 74 6f 20 6f 76 65 72 66 6c 6f  .** onto overflo
259f0 77 20 70 61 67 65 73 2c 20 74 68 65 6e 20 61 63  w pages, then ac
25a00 63 65 73 73 50 61 79 6c 6f 61 64 28 29 20 6d 75  cessPayload() mu
25a10 73 74 20 62 65 20 75 73 65 64 20 74 6f 20 72 65  st be used to re
25a20 61 73 73 65 6d 62 6c 65 0a 2a 2a 20 74 68 65 20  assemble.** the 
25a30 6b 65 79 2f 64 61 74 61 20 61 6e 64 20 63 6f 70  key/data and cop
25a40 79 20 69 74 20 69 6e 74 6f 20 61 20 70 72 65 61  y it into a prea
25a50 6c 6c 6f 63 61 74 65 64 20 62 75 66 66 65 72 2e  llocated buffer.
25a60 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f 69 6e 74  .**.** The point
25a70 65 72 20 72 65 74 75 72 6e 65 64 20 62 79 20 74  er returned by t
25a80 68 69 73 20 72 6f 75 74 69 6e 65 20 6c 6f 6f 6b  his routine look
25a90 73 20 64 69 72 65 63 74 6c 79 20 69 6e 74 6f 20  s directly into 
25aa0 74 68 65 20 63 61 63 68 65 64 0a 2a 2a 20 70 61  the cached.** pa
25ab0 67 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ge of the databa
25ac0 73 65 2e 20 20 54 68 65 20 64 61 74 61 20 6d 69  se.  The data mi
25ad0 67 68 74 20 63 68 61 6e 67 65 20 6f 72 20 6d 6f  ght change or mo
25ae0 76 65 20 74 68 65 20 6e 65 78 74 20 74 69 6d 65  ve the next time
25af0 0a 2a 2a 20 61 6e 79 20 62 74 72 65 65 20 72 6f  .** any btree ro
25b00 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e  utine is called.
25b10 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .*/.static const
25b20 20 76 6f 69 64 20 2a 66 65 74 63 68 50 61 79 6c   void *fetchPayl
25b30 6f 61 64 28 0a 20 20 42 74 43 75 72 73 6f 72 20  oad(.  BtCursor 
25b40 2a 70 43 75 72 2c 20 20 20 20 20 20 2f 2a 20 43  *pCur,      /* C
25b50 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74  ursor pointing t
25b60 6f 20 65 6e 74 72 79 20 74 6f 20 72 65 61 64 20  o entry to read 
25b70 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32 20 2a 70  from */.  u32 *p
25b80 41 6d 74 20 20 20 20 20 20 20 20 20 20 20 20 2f  Amt            /
25b90 2a 20 57 72 69 74 65 20 74 68 65 20 6e 75 6d 62  * Write the numb
25ba0 65 72 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20  er of available 
25bb0 62 79 74 65 73 20 68 65 72 65 20 2a 2f 0a 29 7b  bytes here */.){
25bc0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 21  .  assert( pCur!
25bd0 3d 30 20 26 26 20 70 43 75 72 2d 3e 69 50 61 67  =0 && pCur->iPag
25be0 65 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 61 70  e>=0 && pCur->ap
25bf0 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
25c00 5d 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43  ]);.  assert( pC
25c10 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
25c20 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73  OR_VALID );.  as
25c30 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
25c40 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70  tex_held(pCur->p
25c50 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78  Btree->db->mutex
25c60 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63  ) );.  assert( c
25c70 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
25c80 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
25c90 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70  t( pCur->aiIdx[p
25ca0 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 43 75 72  Cur->iPage]<pCur
25cb0 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
25cc0 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  Page]->nCell );.
25cd0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
25ce0 69 6e 66 6f 2e 6e 53 69 7a 65 3e 30 20 29 3b 0a  info.nSize>0 );.
25cf0 20 20 2a 70 41 6d 74 20 3d 20 70 43 75 72 2d 3e    *pAmt = pCur->
25d00 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 72  info.nLocal;.  r
25d10 65 74 75 72 6e 20 28 76 6f 69 64 2a 29 70 43 75  eturn (void*)pCu
25d20 72 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64  r->info.pPayload
25d30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20  ;.}.../*.** For 
25d40 74 68 65 20 65 6e 74 72 79 20 74 68 61 74 20 63  the entry that c
25d50 75 72 73 6f 72 20 70 43 75 72 20 69 73 20 70 6f  ursor pCur is po
25d60 69 6e 74 20 74 6f 2c 20 72 65 74 75 72 6e 20 61  int to, return a
25d70 73 0a 2a 2a 20 6d 61 6e 79 20 62 79 74 65 73 20  s.** many bytes 
25d80 6f 66 20 74 68 65 20 6b 65 79 20 6f 72 20 64 61  of the key or da
25d90 74 61 20 61 73 20 61 72 65 20 61 76 61 69 6c 61  ta as are availa
25da0 62 6c 65 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c  ble on the local
25db0 0a 2a 2a 20 62 2d 74 72 65 65 20 70 61 67 65 2e  .** b-tree page.
25dc0 20 20 57 72 69 74 65 20 74 68 65 20 6e 75 6d 62    Write the numb
25dd0 65 72 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20  er of available 
25de0 62 79 74 65 73 20 69 6e 74 6f 20 2a 70 41 6d 74  bytes into *pAmt
25df0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f 69 6e  ..**.** The poin
25e00 74 65 72 20 72 65 74 75 72 6e 65 64 20 69 73 20  ter returned is 
25e10 65 70 68 65 6d 65 72 61 6c 2e 20 20 54 68 65 20  ephemeral.  The 
25e20 6b 65 79 2f 64 61 74 61 20 6d 61 79 20 6d 6f 76  key/data may mov
25e30 65 0a 2a 2a 20 6f 72 20 62 65 20 64 65 73 74 72  e.** or be destr
25e40 6f 79 65 64 20 6f 6e 20 74 68 65 20 6e 65 78 74  oyed on the next
25e50 20 63 61 6c 6c 20 74 6f 20 61 6e 79 20 42 74 72   call to any Btr
25e60 65 65 20 72 6f 75 74 69 6e 65 2c 0a 2a 2a 20 69  ee routine,.** i
25e70 6e 63 6c 75 64 69 6e 67 20 63 61 6c 6c 73 20 66  ncluding calls f
25e80 72 6f 6d 20 6f 74 68 65 72 20 74 68 72 65 61 64  rom other thread
25e90 73 20 61 67 61 69 6e 73 74 20 74 68 65 20 73 61  s against the sa
25ea0 6d 65 20 63 61 63 68 65 2e 0a 2a 2a 20 48 65 6e  me cache..** Hen
25eb0 63 65 2c 20 61 20 6d 75 74 65 78 20 6f 6e 20 74  ce, a mutex on t
25ec0 68 65 20 42 74 53 68 61 72 65 64 20 73 68 6f 75  he BtShared shou
25ed0 6c 64 20 62 65 20 68 65 6c 64 20 70 72 69 6f 72  ld be held prior
25ee0 20 74 6f 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 74   to calling.** t
25ef0 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a  his routine..**.
25f00 2a 2a 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65  ** These routine
25f10 73 20 69 73 20 75 73 65 64 20 74 6f 20 67 65 74  s is used to get
25f20 20 71 75 69 63 6b 20 61 63 63 65 73 73 20 74 6f   quick access to
25f30 20 6b 65 79 20 61 6e 64 20 64 61 74 61 0a 2a 2a   key and data.**
25f40 20 69 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63   in the common c
25f50 61 73 65 20 77 68 65 72 65 20 6e 6f 20 6f 76 65  ase where no ove
25f60 72 66 6c 6f 77 20 70 61 67 65 73 20 61 72 65 20  rflow pages are 
25f70 75 73 65 64 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 76  used..*/.const v
25f80 6f 69 64 20 2a 73 71 6c 69 74 65 33 42 74 72 65  oid *sqlite3Btre
25f90 65 4b 65 79 46 65 74 63 68 28 42 74 43 75 72 73  eKeyFetch(BtCurs
25fa0 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20 2a 70  or *pCur, u32 *p
25fb0 41 6d 74 29 7b 0a 20 20 72 65 74 75 72 6e 20 66  Amt){.  return f
25fc0 65 74 63 68 50 61 79 6c 6f 61 64 28 70 43 75 72  etchPayload(pCur
25fd0 2c 20 70 41 6d 74 29 3b 0a 7d 0a 63 6f 6e 73 74  , pAmt);.}.const
25fe0 20 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 42 74   void *sqlite3Bt
25ff0 72 65 65 44 61 74 61 46 65 74 63 68 28 42 74 43  reeDataFetch(BtC
26000 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32  ursor *pCur, u32
26010 20 2a 70 41 6d 74 29 7b 0a 20 20 72 65 74 75 72   *pAmt){.  retur
26020 6e 20 66 65 74 63 68 50 61 79 6c 6f 61 64 28 70  n fetchPayload(p
26030 43 75 72 2c 20 70 41 6d 74 29 3b 0a 7d 0a 0a 0a  Cur, pAmt);.}...
26040 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63  /*.** Move the c
26050 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20 61 20  ursor down to a 
26060 6e 65 77 20 63 68 69 6c 64 20 70 61 67 65 2e 20  new child page. 
26070 20 54 68 65 20 6e 65 77 50 67 6e 6f 20 61 72 67   The newPgno arg
26080 75 6d 65 6e 74 20 69 73 20 74 68 65 0a 2a 2a 20  ument is the.** 
26090 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  page number of t
260a0 68 65 20 63 68 69 6c 64 20 70 61 67 65 20 74 6f  he child page to
260b0 20 6d 6f 76 65 20 74 6f 2e 0a 2a 2a 0a 2a 2a 20   move to..**.** 
260c0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  This function re
260d0 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 43 4f 52  turns SQLITE_COR
260e0 52 55 50 54 20 69 66 20 74 68 65 20 70 61 67 65  RUPT if the page
260f0 2d 68 65 61 64 65 72 20 66 6c 61 67 73 20 66 69  -header flags fi
26100 65 6c 64 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65  eld of.** the ne
26110 77 20 63 68 69 6c 64 20 70 61 67 65 20 64 6f 65  w child page doe
26120 73 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 20  s not match the 
26130 66 6c 61 67 73 20 66 69 65 6c 64 20 6f 66 20 74  flags field of t
26140 68 65 20 70 61 72 65 6e 74 20 28 69 2e 65 2e 0a  he parent (i.e..
26150 2a 2a 20 69 66 20 61 6e 20 69 6e 74 6b 65 79 20  ** if an intkey 
26160 70 61 67 65 20 61 70 70 65 61 72 73 20 74 6f 20  page appears to 
26170 62 65 20 74 68 65 20 70 61 72 65 6e 74 20 6f 66  be the parent of
26180 20 61 20 6e 6f 6e 2d 69 6e 74 6b 65 79 20 70 61   a non-intkey pa
26190 67 65 2c 20 6f 72 0a 2a 2a 20 76 69 63 65 2d 76  ge, or.** vice-v
261a0 65 72 73 61 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  ersa)..*/.static
261b0 20 69 6e 74 20 6d 6f 76 65 54 6f 43 68 69 6c 64   int moveToChild
261c0 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
261d0 20 75 33 32 20 6e 65 77 50 67 6e 6f 29 7b 0a 20   u32 newPgno){. 
261e0 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 69   int rc;.  int i
261f0 20 3d 20 70 43 75 72 2d 3e 69 50 61 67 65 3b 0a   = pCur->iPage;.
26200 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 50    MemPage *pNewP
26210 61 67 65 3b 0a 20 20 42 74 53 68 61 72 65 64 20  age;.  BtShared 
26220 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74  *pBt = pCur->pBt
26230 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ;..  assert( cur
26240 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
26250 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
26260 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
26270 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
26280 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
26290 50 61 67 65 3c 42 54 43 55 52 53 4f 52 5f 4d 41  Page<BTCURSOR_MA
262a0 58 5f 44 45 50 54 48 20 29 3b 0a 20 20 61 73 73  X_DEPTH );.  ass
262b0 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65  ert( pCur->iPage
262c0 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 43 75  >=0 );.  if( pCu
262d0 72 2d 3e 69 50 61 67 65 3e 3d 28 42 54 43 55 52  r->iPage>=(BTCUR
262e0 53 4f 52 5f 4d 41 58 5f 44 45 50 54 48 2d 31 29  SOR_MAX_DEPTH-1)
262f0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
26300 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
26310 50 54 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 67  PT;.  }.  rc = g
26320 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28 70 42  etAndInitPage(pB
26330 74 2c 20 6e 65 77 50 67 6e 6f 2c 20 26 70 4e 65  t, newPgno, &pNe
26340 77 50 61 67 65 2c 0a 20 20 20 20 20 20 20 20 20  wPage,.         
26350 20 20 20 20 20 20 28 70 43 75 72 2d 3e 63 75 72        (pCur->cur
26360 46 6c 61 67 73 20 26 20 42 54 43 46 5f 57 72 69  Flags & BTCF_Wri
26370 74 65 46 6c 61 67 29 3d 3d 30 20 3f 20 50 41 47  teFlag)==0 ? PAG
26380 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20  ER_GET_READONLY 
26390 3a 20 30 29 3b 0a 20 20 69 66 28 20 72 63 20 29  : 0);.  if( rc )
263a0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 70 43   return rc;.  pC
263b0 75 72 2d 3e 61 70 50 61 67 65 5b 69 2b 31 5d 20  ur->apPage[i+1] 
263c0 3d 20 70 4e 65 77 50 61 67 65 3b 0a 20 20 70 43  = pNewPage;.  pC
263d0 75 72 2d 3e 61 69 49 64 78 5b 69 2b 31 5d 20 3d  ur->aiIdx[i+1] =
263e0 20 30 3b 0a 20 20 70 43 75 72 2d 3e 69 50 61 67   0;.  pCur->iPag
263f0 65 2b 2b 3b 0a 0a 20 20 70 43 75 72 2d 3e 69 6e  e++;..  pCur->in
26400 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20  fo.nSize = 0;.  
26410 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26  pCur->curFlags &
26420 3d 20 7e 28 42 54 43 46 5f 56 61 6c 69 64 4e 4b  = ~(BTCF_ValidNK
26430 65 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66  ey|BTCF_ValidOvf
26440 6c 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 50 61  l);.  if( pNewPa
26450 67 65 2d 3e 6e 43 65 6c 6c 3c 31 20 7c 7c 20 70  ge->nCell<1 || p
26460 4e 65 77 50 61 67 65 2d 3e 69 6e 74 4b 65 79 21  NewPage->intKey!
26470 3d 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d  =pCur->apPage[i]
26480 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20  ->intKey ){.    
26490 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
264a0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
264b0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
264c0 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54  OK;.}..#if SQLIT
264d0 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 50 61  E_DEBUG./*.** Pa
264e0 67 65 20 70 50 61 72 65 6e 74 20 69 73 20 61 6e  ge pParent is an
264f0 20 69 6e 74 65 72 6e 61 6c 20 28 6e 6f 6e 2d 6c   internal (non-l
26500 65 61 66 29 20 74 72 65 65 20 70 61 67 65 2e 20  eaf) tree page. 
26510 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 0a 2a  This function .*
26520 2a 20 61 73 73 65 72 74 73 20 74 68 61 74 20 70  * asserts that p
26530 61 67 65 20 6e 75 6d 62 65 72 20 69 43 68 69 6c  age number iChil
26540 64 20 69 73 20 74 68 65 20 6c 65 66 74 2d 63 68  d is the left-ch
26550 69 6c 64 20 69 66 20 74 68 65 20 69 49 64 78 27  ild if the iIdx'
26560 74 68 0a 2a 2a 20 63 65 6c 6c 20 69 6e 20 70 61  th.** cell in pa
26570 67 65 20 70 50 61 72 65 6e 74 2e 20 4f 72 2c 20  ge pParent. Or, 
26580 69 66 20 69 49 64 78 20 69 73 20 65 71 75 61 6c  if iIdx is equal
26590 20 74 6f 20 74 68 65 20 74 6f 74 61 6c 20 6e 75   to the total nu
265a0 6d 62 65 72 20 6f 66 0a 2a 2a 20 63 65 6c 6c 73  mber of.** cells
265b0 20 69 6e 20 70 50 61 72 65 6e 74 2c 20 74 68 61   in pParent, tha
265c0 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 43  t page number iC
265d0 68 69 6c 64 20 69 73 20 74 68 65 20 72 69 67 68  hild is the righ
265e0 74 2d 63 68 69 6c 64 20 6f 66 0a 2a 2a 20 74 68  t-child of.** th
265f0 65 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69  e page..*/.stati
26600 63 20 76 6f 69 64 20 61 73 73 65 72 74 50 61 72  c void assertPar
26610 65 6e 74 49 6e 64 65 78 28 4d 65 6d 50 61 67 65  entIndex(MemPage
26620 20 2a 70 50 61 72 65 6e 74 2c 20 69 6e 74 20 69   *pParent, int i
26630 49 64 78 2c 20 50 67 6e 6f 20 69 43 68 69 6c 64  Idx, Pgno iChild
26640 29 7b 0a 20 20 69 66 28 20 43 4f 52 52 55 50 54  ){.  if( CORRUPT
26650 5f 44 42 20 29 20 72 65 74 75 72 6e 3b 20 20 2f  _DB ) return;  /
26660 2a 20 54 68 65 20 63 6f 6e 64 69 74 69 6f 6e 73  * The conditions
26670 20 74 65 73 74 65 64 20 62 65 6c 6f 77 20 6d 69   tested below mi
26680 67 68 74 20 6e 6f 74 20 62 65 20 74 72 75 65 0a  ght not be true.
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 20 20 20 20 20 2a 2a 20 69              ** i
266b0 6e 20 61 20 63 6f 72 72 75 70 74 20 64 61 74 61  n a corrupt data
266c0 62 61 73 65 20 2a 2f 0a 20 20 61 73 73 65 72 74  base */.  assert
266d0 28 20 69 49 64 78 3c 3d 70 50 61 72 65 6e 74 2d  ( iIdx<=pParent-
266e0 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 69 66 28 20  >nCell );.  if( 
266f0 69 49 64 78 3d 3d 70 50 61 72 65 6e 74 2d 3e 6e  iIdx==pParent->n
26700 43 65 6c 6c 20 29 7b 0a 20 20 20 20 61 73 73 65  Cell ){.    asse
26710 72 74 28 20 67 65 74 34 62 79 74 65 28 26 70 50  rt( get4byte(&pP
26720 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61  arent->aData[pPa
26730 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b  rent->hdrOffset+
26740 38 5d 29 3d 3d 69 43 68 69 6c 64 20 29 3b 0a 20  8])==iChild );. 
26750 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
26760 72 74 28 20 67 65 74 34 62 79 74 65 28 66 69 6e  rt( get4byte(fin
26770 64 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 69  dCell(pParent, i
26780 49 64 78 29 29 3d 3d 69 43 68 69 6c 64 20 29 3b  Idx))==iChild );
26790 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 20  .  }.}.#else.#  
267a0 64 65 66 69 6e 65 20 61 73 73 65 72 74 50 61 72  define assertPar
267b0 65 6e 74 49 6e 64 65 78 28 78 2c 79 2c 7a 29 20  entIndex(x,y,z) 
267c0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d  .#endif../*.** M
267d0 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 75  ove the cursor u
267e0 70 20 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20  p to the parent 
267f0 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 70 43 75 72  page..**.** pCur
26800 2d 3e 69 64 78 20 69 73 20 73 65 74 20 74 6f 20  ->idx is set to 
26810 74 68 65 20 63 65 6c 6c 20 69 6e 64 65 78 20 74  the cell index t
26820 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  hat contains the
26830 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74   pointer.** to t
26840 68 65 20 70 61 67 65 20 77 65 20 61 72 65 20 63  he page we are c
26850 6f 6d 69 6e 67 20 66 72 6f 6d 2e 20 20 49 66 20  oming from.  If 
26860 77 65 20 61 72 65 20 63 6f 6d 69 6e 67 20 66 72  we are coming fr
26870 6f 6d 20 74 68 65 0a 2a 2a 20 72 69 67 68 74 2d  om the.** right-
26880 6d 6f 73 74 20 63 68 69 6c 64 20 70 61 67 65 20  most child page 
26890 74 68 65 6e 20 70 43 75 72 2d 3e 69 64 78 20 69  then pCur->idx i
268a0 73 20 73 65 74 20 74 6f 20 6f 6e 65 20 6d 6f 72  s set to one mor
268b0 65 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20 6c 61  e than.** the la
268c0 72 67 65 73 74 20 63 65 6c 6c 20 69 6e 64 65 78  rgest cell index
268d0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
268e0 20 6d 6f 76 65 54 6f 50 61 72 65 6e 74 28 42 74   moveToParent(Bt
268f0 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
26900 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
26910 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
26920 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
26930 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
26940 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73  R_VALID );.  ass
26950 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65  ert( pCur->iPage
26960 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >0 );.  assert( 
26970 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
26980 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20 61  r->iPage] );.  a
26990 73 73 65 72 74 50 61 72 65 6e 74 49 6e 64 65 78  ssertParentIndex
269a0 28 0a 20 20 20 20 70 43 75 72 2d 3e 61 70 50 61  (.    pCur->apPa
269b0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 31  ge[pCur->iPage-1
269c0 5d 2c 20 0a 20 20 20 20 70 43 75 72 2d 3e 61 69  ], .    pCur->ai
269d0 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d  Idx[pCur->iPage-
269e0 31 5d 2c 20 0a 20 20 20 20 70 43 75 72 2d 3e 61  1], .    pCur->a
269f0 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
26a00 65 5d 2d 3e 70 67 6e 6f 0a 20 20 29 3b 0a 20 20  e]->pgno.  );.  
26a10 74 65 73 74 63 61 73 65 28 20 70 43 75 72 2d 3e  testcase( pCur->
26a20 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
26a30 65 2d 31 5d 20 3e 20 70 43 75 72 2d 3e 61 70 50  e-1] > pCur->apP
26a40 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d  age[pCur->iPage-
26a50 31 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 0a 20 20  1]->nCell );..  
26a60 72 65 6c 65 61 73 65 50 61 67 65 28 70 43 75 72  releasePage(pCur
26a70 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
26a80 50 61 67 65 5d 29 3b 0a 20 20 70 43 75 72 2d 3e  Page]);.  pCur->
26a90 69 50 61 67 65 2d 2d 3b 0a 20 20 70 43 75 72 2d  iPage--;.  pCur-
26aa0 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b  >info.nSize = 0;
26ab0 0a 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67  .  pCur->curFlag
26ac0 73 20 26 3d 20 7e 28 42 54 43 46 5f 56 61 6c 69  s &= ~(BTCF_Vali
26ad0 64 4e 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69 64  dNKey|BTCF_Valid
26ae0 4f 76 66 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Ovfl);.}../*.** 
26af0 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20  Move the cursor 
26b00 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  to point to the 
26b10 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 69 74 73  root page of its
26b20 20 62 2d 74 72 65 65 20 73 74 72 75 63 74 75 72   b-tree structur
26b30 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
26b40 74 61 62 6c 65 20 68 61 73 20 61 20 76 69 72 74  table has a virt
26b50 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 2c 20 74  ual root page, t
26b60 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20 69  hen the cursor i
26b70 73 20 6d 6f 76 65 64 20 74 6f 20 70 6f 69 6e 74  s moved to point
26b80 0a 2a 2a 20 74 6f 20 74 68 65 20 76 69 72 74 75  .** to the virtu
26b90 61 6c 20 72 6f 6f 74 20 70 61 67 65 20 69 6e 73  al root page ins
26ba0 74 65 61 64 20 6f 66 20 74 68 65 20 61 63 74 75  tead of the actu
26bb0 61 6c 20 72 6f 6f 74 20 70 61 67 65 2e 20 41 20  al root page. A 
26bc0 74 61 62 6c 65 20 68 61 73 20 61 0a 2a 2a 20 76  table has a.** v
26bd0 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65  irtual root page
26be0 20 77 68 65 6e 20 74 68 65 20 61 63 74 75 61 6c   when the actual
26bf0 20 72 6f 6f 74 20 70 61 67 65 20 63 6f 6e 74 61   root page conta
26c00 69 6e 73 20 6e 6f 20 63 65 6c 6c 73 20 61 6e 64  ins no cells and
26c10 20 61 20 0a 2a 2a 20 73 69 6e 67 6c 65 20 63 68   a .** single ch
26c20 69 6c 64 20 70 61 67 65 2e 20 54 68 69 73 20 63  ild page. This c
26c30 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 77  an only happen w
26c40 69 74 68 20 74 68 65 20 74 61 62 6c 65 20 72 6f  ith the table ro
26c50 6f 74 65 64 20 61 74 20 70 61 67 65 20 31 2e 0a  oted at page 1..
26c60 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 62 2d 74  **.** If the b-t
26c70 72 65 65 20 73 74 72 75 63 74 75 72 65 20 69 73  ree structure is
26c80 20 65 6d 70 74 79 2c 20 74 68 65 20 63 75 72 73   empty, the curs
26c90 6f 72 20 73 74 61 74 65 20 69 73 20 73 65 74 20  or state is set 
26ca0 74 6f 20 0a 2a 2a 20 43 55 52 53 4f 52 5f 49 4e  to .** CURSOR_IN
26cb0 56 41 4c 49 44 2e 20 4f 74 68 65 72 77 69 73 65  VALID. Otherwise
26cc0 2c 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  , the cursor is 
26cd0 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  set to point to 
26ce0 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 63 65 6c  the first.** cel
26cf0 6c 20 6c 6f 63 61 74 65 64 20 6f 6e 20 74 68 65  l located on the
26d00 20 72 6f 6f 74 20 28 6f 72 20 76 69 72 74 75 61   root (or virtua
26d10 6c 20 72 6f 6f 74 29 20 70 61 67 65 20 61 6e 64  l root) page and
26d20 20 74 68 65 20 63 75 72 73 6f 72 20 73 74 61 74   the cursor stat
26d30 65 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 43  e.** is set to C
26d40 55 52 53 4f 52 5f 56 41 4c 49 44 2e 0a 2a 2a 0a  URSOR_VALID..**.
26d50 2a 2a 20 49 66 20 74 68 69 73 20 66 75 6e 63 74  ** If this funct
26d60 69 6f 6e 20 72 65 74 75 72 6e 73 20 73 75 63 63  ion returns succ
26d70 65 73 73 66 75 6c 6c 79 2c 20 69 74 20 6d 61 79  essfully, it may
26d80 20 62 65 20 61 73 73 75 6d 65 64 20 74 68 61 74   be assumed that
26d90 20 74 68 65 0a 2a 2a 20 70 61 67 65 2d 68 65 61   the.** page-hea
26da0 64 65 72 20 66 6c 61 67 73 20 69 6e 64 69 63 61  der flags indica
26db0 74 65 20 74 68 61 74 20 74 68 65 20 5b 76 69 72  te that the [vir
26dc0 74 75 61 6c 5d 20 72 6f 6f 74 2d 70 61 67 65 20  tual] root-page 
26dd0 69 73 20 74 68 65 20 65 78 70 65 63 74 65 64 20  is the expected 
26de0 0a 2a 2a 20 6b 69 6e 64 20 6f 66 20 62 2d 74 72  .** kind of b-tr
26df0 65 65 20 70 61 67 65 20 28 69 2e 65 2e 20 69 66  ee page (i.e. if
26e00 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20 74 68   when opening th
26e10 65 20 63 75 72 73 6f 72 20 74 68 65 20 63 61 6c  e cursor the cal
26e20 6c 65 72 20 64 69 64 20 6e 6f 74 0a 2a 2a 20 73  ler did not.** s
26e30 70 65 63 69 66 79 20 61 20 4b 65 79 49 6e 66 6f  pecify a KeyInfo
26e40 20 73 74 72 75 63 74 75 72 65 20 74 68 65 20 66   structure the f
26e50 6c 61 67 73 20 62 79 74 65 20 69 73 20 73 65 74  lags byte is set
26e60 20 74 6f 20 30 78 30 35 20 6f 72 20 30 78 30 44   to 0x05 or 0x0D
26e70 2c 0a 2a 2a 20 69 6e 64 69 63 61 74 69 6e 67 20  ,.** indicating 
26e80 61 20 74 61 62 6c 65 20 62 2d 74 72 65 65 2c 20  a table b-tree, 
26e90 6f 72 20 69 66 20 74 68 65 20 63 61 6c 6c 65 72  or if the caller
26ea0 20 64 69 64 20 73 70 65 63 69 66 79 20 61 20 4b   did specify a K
26eb0 65 79 49 6e 66 6f 20 0a 2a 2a 20 73 74 72 75 63  eyInfo .** struc
26ec0 74 75 72 65 20 74 68 65 20 66 6c 61 67 73 20 62  ture the flags b
26ed0 79 74 65 20 69 73 20 73 65 74 20 74 6f 20 30 78  yte is set to 0x
26ee0 30 32 20 6f 72 20 30 78 30 41 2c 20 69 6e 64 69  02 or 0x0A, indi
26ef0 63 61 74 69 6e 67 20 61 6e 20 69 6e 64 65 78 0a  cating an index.
26f00 2a 2a 20 62 2d 74 72 65 65 29 2e 0a 2a 2f 0a 73  ** b-tree)..*/.s
26f10 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f  tatic int moveTo
26f20 52 6f 6f 74 28 42 74 43 75 72 73 6f 72 20 2a 70  Root(BtCursor *p
26f30 43 75 72 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20  Cur){.  MemPage 
26f40 2a 70 52 6f 6f 74 3b 0a 20 20 69 6e 74 20 72 63  *pRoot;.  int rc
26f50 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
26f60 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
26f70 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
26f80 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55 52  );.  assert( CUR
26f90 53 4f 52 5f 49 4e 56 41 4c 49 44 20 3c 20 43 55  SOR_INVALID < CU
26fa0 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b  RSOR_REQUIRESEEK
26fb0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55   );.  assert( CU
26fc0 52 53 4f 52 5f 56 41 4c 49 44 20 20 20 3c 20 43  RSOR_VALID   < C
26fd0 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45  URSOR_REQUIRESEE
26fe0 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43  K );.  assert( C
26ff0 55 52 53 4f 52 5f 46 41 55 4c 54 20 20 20 3e 20  URSOR_FAULT   > 
27000 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45  CURSOR_REQUIRESE
27010 45 4b 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72  EK );.  if( pCur
27020 2d 3e 65 53 74 61 74 65 3e 3d 43 55 52 53 4f 52  ->eState>=CURSOR
27030 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29 7b 0a  _REQUIRESEEK ){.
27040 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53      if( pCur->eS
27050 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 46 41 55  tate==CURSOR_FAU
27060 4c 54 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  LT ){.      asse
27070 72 74 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65  rt( pCur->skipNe
27080 78 74 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  xt!=SQLITE_OK );
27090 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 43  .      return pC
270a0 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3b 0a 20 20  ur->skipNext;.  
270b0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 42    }.    sqlite3B
270c0 74 72 65 65 43 6c 65 61 72 43 75 72 73 6f 72 28  treeClearCursor(
270d0 70 43 75 72 29 3b 0a 20 20 7d 0a 0a 20 20 69 66  pCur);.  }..  if
270e0 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30  ( pCur->iPage>=0
270f0 20 29 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 70   ){.    while( p
27100 43 75 72 2d 3e 69 50 61 67 65 20 29 20 72 65 6c  Cur->iPage ) rel
27110 65 61 73 65 50 61 67 65 28 70 43 75 72 2d 3e 61  easePage(pCur->a
27120 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
27130 65 2d 2d 5d 29 3b 0a 20 20 7d 65 6c 73 65 20 69  e--]);.  }else i
27140 66 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f  f( pCur->pgnoRoo
27150 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 43 75 72  t==0 ){.    pCur
27160 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
27170 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 72  R_INVALID;.    r
27180 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
27190 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
271a0 20 3d 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67   = getAndInitPag
271b0 65 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e  e(pCur->pBtree->
271c0 70 42 74 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52  pBt, pCur->pgnoR
271d0 6f 6f 74 2c 20 26 70 43 75 72 2d 3e 61 70 50 61  oot, &pCur->apPa
271e0 67 65 5b 30 5d 2c 0a 20 20 20 20 20 20 20 20 20  ge[0],.         
271f0 20 20 20 20 20 20 20 20 28 70 43 75 72 2d 3e 63          (pCur->c
27200 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 57  urFlags & BTCF_W
27210 72 69 74 65 46 6c 61 67 29 3d 3d 30 20 3f 20 50  riteFlag)==0 ? P
27220 41 47 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c  AGER_GET_READONL
27230 59 20 3a 20 30 29 3b 0a 20 20 20 20 69 66 28 20  Y : 0);.    if( 
27240 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
27250 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74  .      pCur->eSt
27260 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56  ate = CURSOR_INV
27270 41 4c 49 44 3b 0a 20 20 20 20 20 20 72 65 74 75  ALID;.      retu
27280 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
27290 20 70 43 75 72 2d 3e 69 50 61 67 65 20 3d 20 30   pCur->iPage = 0
272a0 3b 0a 20 20 7d 0a 20 20 70 52 6f 6f 74 20 3d 20  ;.  }.  pRoot = 
272b0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 3b  pCur->apPage[0];
272c0 0a 20 20 61 73 73 65 72 74 28 20 70 52 6f 6f 74  .  assert( pRoot
272d0 2d 3e 70 67 6e 6f 3d 3d 70 43 75 72 2d 3e 70 67  ->pgno==pCur->pg
272e0 6e 6f 52 6f 6f 74 20 29 3b 0a 0a 20 20 2f 2a 20  noRoot );..  /* 
272f0 49 66 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66  If pCur->pKeyInf
27300 6f 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74  o is not NULL, t
27310 68 65 6e 20 74 68 65 20 63 61 6c 6c 65 72 20 74  hen the caller t
27320 68 61 74 20 6f 70 65 6e 65 64 20 74 68 69 73 20  hat opened this 
27330 63 75 72 73 6f 72 0a 20 20 2a 2a 20 65 78 70 65  cursor.  ** expe
27340 63 74 65 64 20 74 6f 20 6f 70 65 6e 20 69 74 20  cted to open it 
27350 6f 6e 20 61 6e 20 69 6e 64 65 78 20 62 2d 74 72  on an index b-tr
27360 65 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69  ee. Otherwise, i
27370 66 20 70 4b 65 79 49 6e 66 6f 20 69 73 0a 20 20  f pKeyInfo is.  
27380 2a 2a 20 4e 55 4c 4c 2c 20 74 68 65 20 63 61 6c  ** NULL, the cal
27390 6c 65 72 20 65 78 70 65 63 74 73 20 61 20 74 61  ler expects a ta
273a0 62 6c 65 20 62 2d 74 72 65 65 2e 20 49 66 20 74  ble b-tree. If t
273b0 68 69 73 20 69 73 20 6e 6f 74 20 74 68 65 20 63  his is not the c
273c0 61 73 65 2c 0a 20 20 2a 2a 20 72 65 74 75 72 6e  ase,.  ** return
273d0 20 61 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55   an SQLITE_CORRU
273e0 50 54 20 65 72 72 6f 72 2e 20 0a 20 20 2a 2a 0a  PT error. .  **.
273f0 20 20 2a 2a 20 45 61 72 6c 69 65 72 20 76 65 72    ** Earlier ver
27400 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20  sions of SQLite 
27410 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 69  assumed that thi
27420 73 20 74 65 73 74 20 63 6f 75 6c 64 20 6e 6f 74  s test could not
27430 20 66 61 69 6c 0a 20 20 2a 2a 20 69 66 20 74 68   fail.  ** if th
27440 65 20 72 6f 6f 74 20 70 61 67 65 20 77 61 73 20  e root page was 
27450 61 6c 72 65 61 64 79 20 6c 6f 61 64 65 64 20 77  already loaded w
27460 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
27470 6e 20 77 61 73 20 63 61 6c 6c 65 64 20 28 69 2e  n was called (i.
27480 65 2e 0a 20 20 2a 2a 20 69 66 20 70 43 75 72 2d  e..  ** if pCur-
27490 3e 69 50 61 67 65 3e 3d 30 29 2e 20 42 75 74 20  >iPage>=0). But 
274a0 74 68 69 73 20 69 73 20 6e 6f 74 20 73 6f 20 69  this is not so i
274b0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  f the database i
274c0 73 20 63 6f 72 72 75 70 74 65 64 20 0a 20 20 2a  s corrupted .  *
274d0 2a 20 69 6e 20 73 75 63 68 20 61 20 77 61 79 20  * in such a way 
274e0 74 68 61 74 20 70 61 67 65 20 70 52 6f 6f 74 20  that page pRoot 
274f0 69 73 20 6c 69 6e 6b 65 64 20 69 6e 74 6f 20 61  is linked into a
27500 20 73 65 63 6f 6e 64 20 62 2d 74 72 65 65 20 74   second b-tree t
27510 61 62 6c 65 20 0a 20 20 2a 2a 20 28 6f 72 20 74  able .  ** (or t
27520 68 65 20 66 72 65 65 6c 69 73 74 29 2e 20 20 2a  he freelist).  *
27530 2f 0a 20 20 61 73 73 65 72 74 28 20 70 52 6f 6f  /.  assert( pRoo
27540 74 2d 3e 69 6e 74 4b 65 79 3d 3d 31 20 7c 7c 20  t->intKey==1 || 
27550 70 52 6f 6f 74 2d 3e 69 6e 74 4b 65 79 3d 3d 30  pRoot->intKey==0
27560 20 29 3b 0a 20 20 69 66 28 20 70 52 6f 6f 74 2d   );.  if( pRoot-
27570 3e 69 73 49 6e 69 74 3d 3d 30 20 7c 7c 20 28 70  >isInit==0 || (p
27580 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d 30  Cur->pKeyInfo==0
27590 29 21 3d 70 52 6f 6f 74 2d 3e 69 6e 74 4b 65 79  )!=pRoot->intKey
275a0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
275b0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
275c0 50 54 3b 0a 20 20 7d 0a 0a 20 20 70 43 75 72 2d  PT;.  }..  pCur-
275d0 3e 61 69 49 64 78 5b 30 5d 20 3d 20 30 3b 0a 20  >aiIdx[0] = 0;. 
275e0 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
275f0 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63  e = 0;.  pCur->c
27600 75 72 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 43  urFlags &= ~(BTC
27610 46 5f 41 74 4c 61 73 74 7c 42 54 43 46 5f 56 61  F_AtLast|BTCF_Va
27620 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56 61 6c  lidNKey|BTCF_Val
27630 69 64 4f 76 66 6c 29 3b 0a 0a 20 20 69 66 28 20  idOvfl);..  if( 
27640 70 52 6f 6f 74 2d 3e 6e 43 65 6c 6c 3e 30 20 29  pRoot->nCell>0 )
27650 7b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61  {.    pCur->eSta
27660 74 65 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49  te = CURSOR_VALI
27670 44 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21  D;.  }else if( !
27680 70 52 6f 6f 74 2d 3e 6c 65 61 66 20 29 7b 0a 20  pRoot->leaf ){. 
27690 20 20 20 50 67 6e 6f 20 73 75 62 70 61 67 65 3b     Pgno subpage;
276a0 0a 20 20 20 20 69 66 28 20 70 52 6f 6f 74 2d 3e  .    if( pRoot->
276b0 70 67 6e 6f 21 3d 31 20 29 20 72 65 74 75 72 6e  pgno!=1 ) return
276c0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
276d0 42 4b 50 54 3b 0a 20 20 20 20 73 75 62 70 61 67  BKPT;.    subpag
276e0 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 52  e = get4byte(&pR
276f0 6f 6f 74 2d 3e 61 44 61 74 61 5b 70 52 6f 6f 74  oot->aData[pRoot
27700 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b  ->hdrOffset+8]);
27710 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74  .    pCur->eStat
27720 65 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49 44  e = CURSOR_VALID
27730 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54  ;.    rc = moveT
27740 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 73 75 62  oChild(pCur, sub
27750 70 61 67 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  page);.  }else{.
27760 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65      pCur->eState
27770 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49   = CURSOR_INVALI
27780 44 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  D;.  }.  return 
27790 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76  rc;.}../*.** Mov
277a0 65 20 74 68 65 20 63 75 72 73 6f 72 20 64 6f 77  e the cursor dow
277b0 6e 20 74 6f 20 74 68 65 20 6c 65 66 74 2d 6d 6f  n to the left-mo
277c0 73 74 20 6c 65 61 66 20 65 6e 74 72 79 20 62 65  st leaf entry be
277d0 6e 65 61 74 68 20 74 68 65 0a 2a 2a 20 65 6e 74  neath the.** ent
277e0 72 79 20 74 6f 20 77 68 69 63 68 20 69 74 20 69  ry to which it i
277f0 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e  s currently poin
27800 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ting..**.** The 
27810 6c 65 66 74 2d 6d 6f 73 74 20 6c 65 61 66 20 69  left-most leaf i
27820 73 20 74 68 65 20 6f 6e 65 20 77 69 74 68 20 74  s the one with t
27830 68 65 20 73 6d 61 6c 6c 65 73 74 20 6b 65 79 20  he smallest key 
27840 2d 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 69  - the first.** i
27850 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65  n ascending orde
27860 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
27870 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28   moveToLeftmost(
27880 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
27890 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20  .  Pgno pgno;.  
278a0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
278b0 4f 4b 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  OK;.  MemPage *p
278c0 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28  Page;..  assert(
278d0 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
278e0 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  x(pCur) );.  ass
278f0 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
27900 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
27910 29 3b 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d  );.  while( rc==
27920 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 28 70  SQLITE_OK && !(p
27930 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50  Page = pCur->apP
27940 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
27950 29 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 61  )->leaf ){.    a
27960 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49  ssert( pCur->aiI
27970 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c  dx[pCur->iPage]<
27980 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  pPage->nCell );.
27990 20 20 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62      pgno = get4b
279a0 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61  yte(findCell(pPa
279b0 67 65 2c 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  ge, pCur->aiIdx[
279c0 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 29 3b 0a  pCur->iPage]));.
279d0 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43      rc = moveToC
279e0 68 69 6c 64 28 70 43 75 72 2c 20 70 67 6e 6f 29  hild(pCur, pgno)
279f0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
27a00 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65  c;.}../*.** Move
27a10 20 74 68 65 20 63 75 72 73 6f 72 20 64 6f 77 6e   the cursor down
27a20 20 74 6f 20 74 68 65 20 72 69 67 68 74 2d 6d 6f   to the right-mo
27a30 73 74 20 6c 65 61 66 20 65 6e 74 72 79 20 62 65  st leaf entry be
27a40 6e 65 61 74 68 20 74 68 65 0a 2a 2a 20 70 61 67  neath the.** pag
27a50 65 20 74 6f 20 77 68 69 63 68 20 69 74 20 69 73  e to which it is
27a60 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74   currently point
27a70 69 6e 67 2e 20 20 4e 6f 74 69 63 65 20 74 68 65  ing.  Notice the
27a80 20 64 69 66 66 65 72 65 6e 63 65 0a 2a 2a 20 62   difference.** b
27a90 65 74 77 65 65 6e 20 6d 6f 76 65 54 6f 4c 65 66  etween moveToLef
27aa0 74 6d 6f 73 74 28 29 20 61 6e 64 20 6d 6f 76 65  tmost() and move
27ab0 54 6f 52 69 67 68 74 6d 6f 73 74 28 29 2e 20 20  ToRightmost().  
27ac0 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 29  moveToLeftmost()
27ad0 0a 2a 2a 20 66 69 6e 64 73 20 74 68 65 20 6c 65  .** finds the le
27ae0 66 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 62 65  ft-most entry be
27af0 6e 65 61 74 68 20 74 68 65 20 2a 65 6e 74 72 79  neath the *entry
27b00 2a 20 77 68 65 72 65 61 73 20 6d 6f 76 65 54 6f  * whereas moveTo
27b10 52 69 67 68 74 6d 6f 73 74 28 29 0a 2a 2a 20 66  Rightmost().** f
27b20 69 6e 64 73 20 74 68 65 20 72 69 67 68 74 2d 6d  inds the right-m
27b30 6f 73 74 20 65 6e 74 72 79 20 62 65 6e 65 61 74  ost entry beneat
27b40 68 20 74 68 65 20 2a 70 61 67 65 2a 2e 0a 2a 2a  h the *page*..**
27b50 0a 2a 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f  .** The right-mo
27b60 73 74 20 65 6e 74 72 79 20 69 73 20 74 68 65 20  st entry is the 
27b70 6f 6e 65 20 77 69 74 68 20 74 68 65 20 6c 61 72  one with the lar
27b80 67 65 73 74 20 6b 65 79 20 2d 20 74 68 65 20 6c  gest key - the l
27b90 61 73 74 0a 2a 2a 20 6b 65 79 20 69 6e 20 61 73  ast.** key in as
27ba0 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 0a 2a  cending order..*
27bb0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76  /.static int mov
27bc0 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 42 74 43  eToRightmost(BtC
27bd0 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
27be0 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e 74  Pgno pgno;.  int
27bf0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
27c00 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
27c10 65 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74  e = 0;..  assert
27c20 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
27c30 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ex(pCur) );.  as
27c40 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
27c50 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
27c60 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 21 28 70   );.  while( !(p
27c70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50  Page = pCur->apP
27c80 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
27c90 29 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 70  )->leaf ){.    p
27ca0 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26  gno = get4byte(&
27cb0 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61  pPage->aData[pPa
27cc0 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  ge->hdrOffset+8]
27cd0 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49  );.    pCur->aiI
27ce0 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20  dx[pCur->iPage] 
27cf0 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a  = pPage->nCell;.
27d00 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43      rc = moveToC
27d10 68 69 6c 64 28 70 43 75 72 2c 20 70 67 6e 6f 29  hild(pCur, pgno)
27d20 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  ;.    if( rc ) r
27d30 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
27d40 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
27d50 2d 3e 69 50 61 67 65 5d 20 3d 20 70 50 61 67 65  ->iPage] = pPage
27d60 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a 20 20 61 73 73  ->nCell-1;.  ass
27d70 65 72 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  ert( pCur->info.
27d80 6e 53 69 7a 65 3d 3d 30 20 29 3b 0a 20 20 61 73  nSize==0 );.  as
27d90 73 65 72 74 28 20 28 70 43 75 72 2d 3e 63 75 72  sert( (pCur->cur
27da0 46 6c 61 67 73 20 26 20 42 54 43 46 5f 56 61 6c  Flags & BTCF_Val
27db0 69 64 4e 4b 65 79 29 3d 3d 30 20 29 3b 0a 20 20  idNKey)==0 );.  
27dc0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
27dd0 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65  ;.}../* Move the
27de0 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 66   cursor to the f
27df0 69 72 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68  irst entry in th
27e00 65 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e  e table.  Return
27e10 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e   SQLITE_OK.** on
27e20 20 73 75 63 63 65 73 73 2e 20 20 53 65 74 20 2a   success.  Set *
27e30 70 52 65 73 20 74 6f 20 30 20 69 66 20 74 68 65  pRes to 0 if the
27e40 20 63 75 72 73 6f 72 20 61 63 74 75 61 6c 6c 79   cursor actually
27e50 20 70 6f 69 6e 74 73 20 74 6f 20 73 6f 6d 65 74   points to somet
27e60 68 69 6e 67 0a 2a 2a 20 6f 72 20 73 65 74 20 2a  hing.** or set *
27e70 70 52 65 73 20 74 6f 20 31 20 69 66 20 74 68 65  pRes to 1 if the
27e80 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e   table is empty.
27e90 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
27ea0 74 72 65 65 46 69 72 73 74 28 42 74 43 75 72 73  treeFirst(BtCurs
27eb0 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70  or *pCur, int *p
27ec0 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  Res){.  int rc;.
27ed0 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
27ee0 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
27ef0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
27f00 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
27f10 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e  d(pCur->pBtree->
27f20 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
27f30 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28  rc = moveToRoot(
27f40 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d  pCur);.  if( rc=
27f50 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
27f60 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
27f70 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c  te==CURSOR_INVAL
27f80 49 44 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  ID ){.      asse
27f90 72 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f  rt( pCur->pgnoRo
27fa0 6f 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 61  ot==0 || pCur->a
27fb0 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
27fc0 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a  e]->nCell==0 );.
27fd0 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b        *pRes = 1;
27fe0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
27ff0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
28000 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
28010 67 65 5d 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a  ge]->nCell>0 );.
28020 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b        *pRes = 0;
28030 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 6f 76 65  .      rc = move
28040 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29  ToLeftmost(pCur)
28050 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
28060 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d  turn rc;.}../* M
28070 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 74  ove the cursor t
28080 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79  o the last entry
28090 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20   in the table.  
280a0 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
280b0 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 2e 20  .** on success. 
280c0 20 53 65 74 20 2a 70 52 65 73 20 74 6f 20 30 20   Set *pRes to 0 
280d0 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 61 63  if the cursor ac
280e0 74 75 61 6c 6c 79 20 70 6f 69 6e 74 73 20 74 6f  tually points to
280f0 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f 72   something.** or
28100 20 73 65 74 20 2a 70 52 65 73 20 74 6f 20 31 20   set *pRes to 1 
28110 69 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20  if the table is 
28120 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71  empty..*/.int sq
28130 6c 69 74 65 33 42 74 72 65 65 4c 61 73 74 28 42  lite3BtreeLast(B
28140 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69  tCursor *pCur, i
28150 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74  nt *pRes){.  int
28160 20 72 63 3b 0a 20 0a 20 20 61 73 73 65 72 74 28   rc;. .  assert(
28170 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
28180 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  x(pCur) );.  ass
28190 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
281a0 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42  ex_held(pCur->pB
281b0 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29  tree->db->mutex)
281c0 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65   );..  /* If the
281d0 20 63 75 72 73 6f 72 20 61 6c 72 65 61 64 79 20   cursor already 
281e0 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 6c 61  points to the la
281f0 73 74 20 65 6e 74 72 79 2c 20 74 68 69 73 20 69  st entry, this i
28200 73 20 61 20 6e 6f 2d 6f 70 2e 20 2a 2f 0a 20 20  s a no-op. */.  
28210 69 66 28 20 43 55 52 53 4f 52 5f 56 41 4c 49 44  if( CURSOR_VALID
28220 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 26  ==pCur->eState &
28230 26 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67  & (pCur->curFlag
28240 73 20 26 20 42 54 43 46 5f 41 74 4c 61 73 74 29  s & BTCF_AtLast)
28250 21 3d 30 20 29 7b 0a 23 69 66 64 65 66 20 53 51  !=0 ){.#ifdef SQ
28260 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 2f  LITE_DEBUG.    /
28270 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20 73 65 72  * This block ser
28280 76 65 73 20 74 6f 20 61 73 73 65 72 74 28 29 20  ves to assert() 
28290 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72 20  that the cursor 
282a0 72 65 61 6c 6c 79 20 64 6f 65 73 20 70 6f 69 6e  really does poin
282b0 74 20 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68 65  t .    ** to the
282c0 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74   last entry in t
282d0 68 65 20 62 2d 74 72 65 65 2e 20 2a 2f 0a 20 20  he b-tree. */.  
282e0 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 66 6f    int ii;.    fo
282f0 72 28 69 69 3d 30 3b 20 69 69 3c 70 43 75 72 2d  r(ii=0; ii<pCur-
28300 3e 69 50 61 67 65 3b 20 69 69 2b 2b 29 7b 0a 20  >iPage; ii++){. 
28310 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75       assert( pCu
28320 72 2d 3e 61 69 49 64 78 5b 69 69 5d 3d 3d 70 43  r->aiIdx[ii]==pC
28330 75 72 2d 3e 61 70 50 61 67 65 5b 69 69 5d 2d 3e  ur->apPage[ii]->
28340 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 7d 0a 20  nCell );.    }. 
28350 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
28360 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
28370 67 65 5d 3d 3d 70 43 75 72 2d 3e 61 70 50 61 67  ge]==pCur->apPag
28380 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e  e[pCur->iPage]->
28390 6e 43 65 6c 6c 2d 31 20 29 3b 0a 20 20 20 20 61  nCell-1 );.    a
283a0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50  ssert( pCur->apP
283b0 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
283c0 2d 3e 6c 65 61 66 20 29 3b 0a 23 65 6e 64 69 66  ->leaf );.#endif
283d0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
283e0 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 72 63  TE_OK;.  }..  rc
283f0 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43   = moveToRoot(pC
28400 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  ur);.  if( rc==S
28410 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
28420 69 66 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  if( CURSOR_INVAL
28430 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65  ID==pCur->eState
28440 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
28450 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74  ( pCur->pgnoRoot
28460 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50  ==0 || pCur->apP
28470 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
28480 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20  ->nCell==0 );.  
28490 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20      *pRes = 1;. 
284a0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
284b0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
284c0 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
284d0 49 44 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65  ID );.      *pRe
284e0 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20  s = 0;.      rc 
284f0 3d 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73  = moveToRightmos
28500 74 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20 69  t(pCur);.      i
28510 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
28520 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72   ){.        pCur
28530 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20 42 54  ->curFlags |= BT
28540 43 46 5f 41 74 4c 61 73 74 3b 0a 20 20 20 20 20  CF_AtLast;.     
28550 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
28560 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26  pCur->curFlags &
28570 3d 20 7e 42 54 43 46 5f 41 74 4c 61 73 74 3b 0a  = ~BTCF_AtLast;.
28580 20 20 20 20 20 20 7d 0a 20 20 20 0a 20 20 20 20        }.   .    
28590 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
285a0 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68  c;.}../* Move th
285b0 65 20 63 75 72 73 6f 72 20 73 6f 20 74 68 61 74  e cursor so that
285c0 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e   it points to an
285d0 20 65 6e 74 72 79 20 6e 65 61 72 20 74 68 65 20   entry near the 
285e0 6b 65 79 20 0a 2a 2a 20 73 70 65 63 69 66 69 65  key .** specifie
285f0 64 20 62 79 20 70 49 64 78 4b 65 79 20 6f 72 20  d by pIdxKey or 
28600 69 6e 74 4b 65 79 2e 20 20 20 52 65 74 75 72 6e  intKey.   Return
28610 20 61 20 73 75 63 63 65 73 73 20 63 6f 64 65 2e   a success code.
28620 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 49 4e 54 4b 45  .**.** For INTKE
28630 59 20 74 61 62 6c 65 73 2c 20 74 68 65 20 69 6e  Y tables, the in
28640 74 4b 65 79 20 70 61 72 61 6d 65 74 65 72 20 69  tKey parameter i
28650 73 20 75 73 65 64 2e 20 20 70 49 64 78 4b 65 79  s used.  pIdxKey
28660 20 0a 2a 2a 20 6d 75 73 74 20 62 65 20 4e 55 4c   .** must be NUL
28670 4c 2e 20 20 46 6f 72 20 69 6e 64 65 78 20 74 61  L.  For index ta
28680 62 6c 65 73 2c 20 70 49 64 78 4b 65 79 20 69 73  bles, pIdxKey is
28690 20 75 73 65 64 20 61 6e 64 20 69 6e 74 4b 65 79   used and intKey
286a0 0a 2a 2a 20 69 73 20 69 67 6e 6f 72 65 64 2e 0a  .** is ignored..
286b0 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 78 61 63  **.** If an exac
286c0 74 20 6d 61 74 63 68 20 69 73 20 6e 6f 74 20 66  t match is not f
286d0 6f 75 6e 64 2c 20 74 68 65 6e 20 74 68 65 20 63  ound, then the c
286e0 75 72 73 6f 72 20 69 73 20 61 6c 77 61 79 73 0a  ursor is always.
286f0 2a 2a 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67  ** left pointing
28700 20 61 74 20 61 20 6c 65 61 66 20 70 61 67 65 20   at a leaf page 
28710 77 68 69 63 68 20 77 6f 75 6c 64 20 68 6f 6c 64  which would hold
28720 20 74 68 65 20 65 6e 74 72 79 20 69 66 20 69 74   the entry if it
28730 0a 2a 2a 20 77 65 72 65 20 70 72 65 73 65 6e 74  .** were present
28740 2e 20 20 54 68 65 20 63 75 72 73 6f 72 20 6d 69  .  The cursor mi
28750 67 68 74 20 70 6f 69 6e 74 20 74 6f 20 61 6e 20  ght point to an 
28760 65 6e 74 72 79 20 74 68 61 74 20 63 6f 6d 65 73  entry that comes
28770 0a 2a 2a 20 62 65 66 6f 72 65 20 6f 72 20 61 66  .** before or af
28780 74 65 72 20 74 68 65 20 6b 65 79 2e 0a 2a 2a 0a  ter the key..**.
28790 2a 2a 20 41 6e 20 69 6e 74 65 67 65 72 20 69 73  ** An integer is
287a0 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 2a 70   written into *p
287b0 52 65 73 20 77 68 69 63 68 20 69 73 20 74 68 65  Res which is the
287c0 20 72 65 73 75 6c 74 20 6f 66 0a 2a 2a 20 63 6f   result of.** co
287d0 6d 70 61 72 69 6e 67 20 74 68 65 20 6b 65 79 20  mparing the key 
287e0 77 69 74 68 20 74 68 65 20 65 6e 74 72 79 20 74  with the entry t
287f0 6f 20 77 68 69 63 68 20 74 68 65 20 63 75 72 73  o which the curs
28800 6f 72 20 69 73 20 0a 2a 2a 20 70 6f 69 6e 74 69  or is .** pointi
28810 6e 67 2e 20 20 54 68 65 20 6d 65 61 6e 69 6e 67  ng.  The meaning
28820 20 6f 66 20 74 68 65 20 69 6e 74 65 67 65 72 20   of the integer 
28830 77 72 69 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20  written into.** 
28840 2a 70 52 65 73 20 69 73 20 61 73 20 66 6f 6c 6c  *pRes is as foll
28850 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a  ows:.**.**     *
28860 70 52 65 73 3c 30 20 20 20 20 20 20 54 68 65 20  pRes<0      The 
28870 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20 70  cursor is left p
28880 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e  ointing at an en
28890 74 72 79 20 74 68 61 74 0a 2a 2a 20 20 20 20 20  try that.**     
288a0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73 20               is 
288b0 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 69 6e 74  smaller than int
288c0 4b 65 79 2f 70 49 64 78 4b 65 79 20 6f 72 20 69  Key/pIdxKey or i
288d0 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 65  f the table is e
288e0 6d 70 74 79 0a 2a 2a 20 20 20 20 20 20 20 20 20  mpty.**         
288f0 20 20 20 20 20 20 20 20 20 61 6e 64 20 74 68 65           and the
28900 20 63 75 72 73 6f 72 20 69 73 20 74 68 65 72 65   cursor is there
28910 66 6f 72 65 20 6c 65 66 74 20 70 6f 69 6e 74 20  fore left point 
28920 74 6f 20 6e 6f 74 68 69 6e 67 2e 0a 2a 2a 0a 2a  to nothing..**.*
28930 2a 20 20 20 20 20 2a 70 52 65 73 3d 3d 30 20 20  *     *pRes==0  
28940 20 20 20 54 68 65 20 63 75 72 73 6f 72 20 69 73     The cursor is
28950 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61   left pointing a
28960 74 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74 0a  t an entry that.
28970 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
28980 20 20 20 20 65 78 61 63 74 6c 79 20 6d 61 74 63      exactly matc
28990 68 65 73 20 69 6e 74 4b 65 79 2f 70 49 64 78 4b  hes intKey/pIdxK
289a0 65 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70  ey..**.**     *p
289b0 52 65 73 3e 30 20 20 20 20 20 20 54 68 65 20 63  Res>0      The c
289c0 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20 70 6f  ursor is left po
289d0 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74  inting at an ent
289e0 72 79 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20  ry that.**      
289f0 20 20 20 20 20 20 20 20 20 20 20 20 69 73 20 6c              is l
28a00 61 72 67 65 72 20 74 68 61 6e 20 69 6e 74 4b 65  arger than intKe
28a10 79 2f 70 49 64 78 4b 65 79 2e 0a 2a 2a 0a 2a 2f  y/pIdxKey..**.*/
28a20 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
28a30 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28  eMovetoUnpacked(
28a40 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
28a50 72 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  r,          /* T
28a60 68 65 20 63 75 72 73 6f 72 20 74 6f 20 62 65 20  he cursor to be 
28a70 6d 6f 76 65 64 20 2a 2f 0a 20 20 55 6e 70 61 63  moved */.  Unpac
28a80 6b 65 64 52 65 63 6f 72 64 20 2a 70 49 64 78 4b  kedRecord *pIdxK
28a90 65 79 2c 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20  ey, /* Unpacked 
28aa0 69 6e 64 65 78 20 6b 65 79 20 2a 2f 0a 20 20 69  index key */.  i
28ab0 36 34 20 69 6e 74 4b 65 79 2c 20 20 20 20 20 20  64 intKey,      
28ac0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74          /* The t
28ad0 61 62 6c 65 20 6b 65 79 20 2a 2f 0a 20 20 69 6e  able key */.  in
28ae0 74 20 62 69 61 73 52 69 67 68 74 2c 20 20 20 20  t biasRight,    
28af0 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 72 75         /* If tru
28b00 65 2c 20 62 69 61 73 20 74 68 65 20 73 65 61 72  e, bias the sear
28b10 63 68 20 74 6f 20 74 68 65 20 68 69 67 68 20 65  ch to the high e
28b20 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65  nd */.  int *pRe
28b30 73 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s               
28b40 20 2f 2a 20 57 72 69 74 65 20 73 65 61 72 63 68   /* Write search
28b50 20 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f   results here */
28b60 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
28b70 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 20 78 52  RecordCompare xR
28b80 65 63 6f 72 64 43 6f 6d 70 61 72 65 3b 0a 0a 20  ecordCompare;.. 
28b90 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
28ba0 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
28bb0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
28bc0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
28bd0 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62  pCur->pBtree->db
28be0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
28bf0 73 65 72 74 28 20 70 52 65 73 20 29 3b 0a 20 20  sert( pRes );.  
28c00 61 73 73 65 72 74 28 20 28 70 49 64 78 4b 65 79  assert( (pIdxKey
28c10 3d 3d 30 29 3d 3d 28 70 43 75 72 2d 3e 70 4b 65  ==0)==(pCur->pKe
28c20 79 49 6e 66 6f 3d 3d 30 29 20 29 3b 0a 0a 20 20  yInfo==0) );..  
28c30 2f 2a 20 49 66 20 74 68 65 20 63 75 72 73 6f 72  /* If the cursor
28c40 20 69 73 20 61 6c 72 65 61 64 79 20 70 6f 73 69   is already posi
28c50 74 69 6f 6e 65 64 20 61 74 20 74 68 65 20 70 6f  tioned at the po
28c60 69 6e 74 20 77 65 20 61 72 65 20 74 72 79 69 6e  int we are tryin
28c70 67 0a 20 20 2a 2a 20 74 6f 20 6d 6f 76 65 20 74  g.  ** to move t
28c80 6f 2c 20 74 68 65 6e 20 6a 75 73 74 20 72 65 74  o, then just ret
28c90 75 72 6e 20 77 69 74 68 6f 75 74 20 64 6f 69 6e  urn without doin
28ca0 67 20 61 6e 79 20 77 6f 72 6b 20 2a 2f 0a 20 20  g any work */.  
28cb0 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  if( pCur->eState
28cc0 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 26  ==CURSOR_VALID &
28cd0 26 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67  & (pCur->curFlag
28ce0 73 20 26 20 42 54 43 46 5f 56 61 6c 69 64 4e 4b  s & BTCF_ValidNK
28cf0 65 79 29 21 3d 30 0a 20 20 20 26 26 20 70 43 75  ey)!=0.   && pCu
28d00 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e  r->apPage[0]->in
28d10 74 4b 65 79 20 0a 20 20 29 7b 0a 20 20 20 20 69  tKey .  ){.    i
28d20 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b  f( pCur->info.nK
28d30 65 79 3d 3d 69 6e 74 4b 65 79 20 29 7b 0a 20 20  ey==intKey ){.  
28d40 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20      *pRes = 0;. 
28d50 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
28d60 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20  TE_OK;.    }.   
28d70 20 69 66 28 20 28 70 43 75 72 2d 3e 63 75 72 46   if( (pCur->curF
28d80 6c 61 67 73 20 26 20 42 54 43 46 5f 41 74 4c 61  lags & BTCF_AtLa
28d90 73 74 29 21 3d 30 20 26 26 20 70 43 75 72 2d 3e  st)!=0 && pCur->
28da0 69 6e 66 6f 2e 6e 4b 65 79 3c 69 6e 74 4b 65 79  info.nKey<intKey
28db0 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 65 73 20   ){.      *pRes 
28dc0 3d 20 2d 31 3b 0a 20 20 20 20 20 20 72 65 74 75  = -1;.      retu
28dd0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
28de0 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70    }.  }..  if( p
28df0 49 64 78 4b 65 79 20 29 7b 0a 20 20 20 20 78 52  IdxKey ){.    xR
28e00 65 63 6f 72 64 43 6f 6d 70 61 72 65 20 3d 20 73  ecordCompare = s
28e10 71 6c 69 74 65 33 56 64 62 65 46 69 6e 64 43 6f  qlite3VdbeFindCo
28e20 6d 70 61 72 65 28 70 49 64 78 4b 65 79 29 3b 0a  mpare(pIdxKey);.
28e30 20 20 20 20 70 49 64 78 4b 65 79 2d 3e 65 72 72      pIdxKey->err
28e40 43 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 61 73  Code = 0;.    as
28e50 73 65 72 74 28 20 70 49 64 78 4b 65 79 2d 3e 64  sert( pIdxKey->d
28e60 65 66 61 75 6c 74 5f 72 63 3d 3d 31 20 0a 20 20  efault_rc==1 .  
28e70 20 20 20 20 20 20 20 7c 7c 20 70 49 64 78 4b 65         || pIdxKe
28e80 79 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3d 3d 30  y->default_rc==0
28e90 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 49   .         || pI
28ea0 64 78 4b 65 79 2d 3e 64 65 66 61 75 6c 74 5f 72  dxKey->default_r
28eb0 63 3d 3d 2d 31 0a 20 20 20 20 29 3b 0a 20 20 7d  c==-1.    );.  }
28ec0 65 6c 73 65 7b 0a 20 20 20 20 78 52 65 63 6f 72  else{.    xRecor
28ed0 64 43 6f 6d 70 61 72 65 20 3d 20 30 3b 20 2f 2a  dCompare = 0; /*
28ee0 20 41 6c 6c 20 6b 65 79 73 20 61 72 65 20 69 6e   All keys are in
28ef0 74 65 67 65 72 73 20 2a 2f 0a 20 20 7d 0a 0a 20  tegers */.  }.. 
28f00 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74   rc = moveToRoot
28f10 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63  (pCur);.  if( rc
28f20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
28f30 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  c;.  }.  assert(
28f40 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d   pCur->pgnoRoot=
28f50 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61  =0 || pCur->apPa
28f60 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20  ge[pCur->iPage] 
28f70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
28f80 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c  r->pgnoRoot==0 |
28f90 7c 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  | pCur->apPage[p
28fa0 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 69 73 49  Cur->iPage]->isI
28fb0 6e 69 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28  nit );.  assert(
28fc0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
28fd0 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 7c 7c  URSOR_INVALID ||
28fe0 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
28ff0 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c  ur->iPage]->nCel
29000 6c 3e 30 20 29 3b 0a 20 20 69 66 28 20 70 43 75  l>0 );.  if( pCu
29010 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
29020 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20  R_INVALID ){.   
29030 20 2a 70 52 65 73 20 3d 20 2d 31 3b 0a 20 20 20   *pRes = -1;.   
29040 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70   assert( pCur->p
29050 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43  gnoRoot==0 || pC
29060 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
29070 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d  >iPage]->nCell==
29080 30 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 );.    return 
29090 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
290a0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61   assert( pCur->a
290b0 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79  pPage[0]->intKey
290c0 20 7c 7c 20 70 49 64 78 4b 65 79 20 29 3b 0a 20   || pIdxKey );. 
290d0 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 69 6e   for(;;){.    in
290e0 74 20 6c 77 72 2c 20 75 70 72 2c 20 69 64 78 2c  t lwr, upr, idx,
290f0 20 63 3b 0a 20 20 20 20 50 67 6e 6f 20 63 68 6c   c;.    Pgno chl
29100 64 50 67 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65  dPg;.    MemPage
29110 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e   *pPage = pCur->
29120 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
29130 67 65 5d 3b 0a 20 20 20 20 75 38 20 2a 70 43 65  ge];.    u8 *pCe
29140 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
29150 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29160 50 6f 69 6e 74 65 72 20 74 6f 20 63 75 72 72 65  Pointer to curre
29170 6e 74 20 63 65 6c 6c 20 69 6e 20 70 50 61 67 65  nt cell in pPage
29180 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 70 50 61 67   */..    /* pPag
29190 65 2d 3e 6e 43 65 6c 6c 20 6d 75 73 74 20 62 65  e->nCell must be
291a0 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 7a 65   greater than ze
291b0 72 6f 2e 20 49 66 20 74 68 69 73 20 69 73 20 74  ro. If this is t
291c0 68 65 20 72 6f 6f 74 2d 70 61 67 65 0a 20 20 20  he root-page.   
291d0 20 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 20 77   ** the cursor w
291e0 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20 49  ould have been I
291f0 4e 56 41 4c 49 44 20 61 62 6f 76 65 20 61 6e 64  NVALID above and
29200 20 74 68 69 73 20 66 6f 72 28 3b 3b 29 20 6c 6f   this for(;;) lo
29210 6f 70 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 72 75  op.    ** not ru
29220 6e 2e 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f  n. If this is no
29230 74 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 2c  t the root-page,
29240 20 74 68 65 6e 20 74 68 65 20 6d 6f 76 65 54 6f   then the moveTo
29250 43 68 69 6c 64 28 29 20 72 6f 75 74 69 6e 65 0a  Child() routine.
29260 20 20 20 20 2a 2a 20 77 6f 75 6c 64 20 68 61 76      ** would hav
29270 65 20 61 6c 72 65 61 64 79 20 64 65 74 65 63 74  e already detect
29280 65 64 20 64 62 20 63 6f 72 72 75 70 74 69 6f 6e  ed db corruption
29290 2e 20 53 69 6d 69 6c 61 72 6c 79 2c 20 70 50 61  . Similarly, pPa
292a0 67 65 20 6d 75 73 74 0a 20 20 20 20 2a 2a 20 62  ge must.    ** b
292b0 65 20 74 68 65 20 72 69 67 68 74 20 6b 69 6e 64  e the right kind
292c0 20 28 69 6e 64 65 78 20 6f 72 20 74 61 62 6c 65   (index or table
292d0 29 20 6f 66 20 62 2d 74 72 65 65 20 70 61 67 65  ) of b-tree page
292e0 2e 20 4f 74 68 65 72 77 69 73 65 0a 20 20 20 20  . Otherwise.    
292f0 2a 2a 20 61 20 6d 6f 76 65 54 6f 43 68 69 6c 64  ** a moveToChild
29300 28 29 20 6f 72 20 6d 6f 76 65 54 6f 52 6f 6f 74  () or moveToRoot
29310 28 29 20 63 61 6c 6c 20 77 6f 75 6c 64 20 68 61  () call would ha
29320 76 65 20 64 65 74 65 63 74 65 64 20 63 6f 72 72  ve detected corr
29330 75 70 74 69 6f 6e 2e 20 20 2a 2f 0a 20 20 20 20  uption.  */.    
29340 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
29350 43 65 6c 6c 3e 30 20 29 3b 0a 20 20 20 20 61 73  Cell>0 );.    as
29360 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 6e 74  sert( pPage->int
29370 4b 65 79 3d 3d 28 70 49 64 78 4b 65 79 3d 3d 30  Key==(pIdxKey==0
29380 29 20 29 3b 0a 20 20 20 20 6c 77 72 20 3d 20 30  ) );.    lwr = 0
29390 3b 0a 20 20 20 20 75 70 72 20 3d 20 70 50 61 67  ;.    upr = pPag
293a0 65 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a 20 20 20 20  e->nCell-1;.    
293b0 61 73 73 65 72 74 28 20 62 69 61 73 52 69 67 68  assert( biasRigh
293c0 74 3d 3d 30 20 7c 7c 20 62 69 61 73 52 69 67 68  t==0 || biasRigh
293d0 74 3d 3d 31 20 29 3b 0a 20 20 20 20 69 64 78 20  t==1 );.    idx 
293e0 3d 20 75 70 72 3e 3e 28 31 2d 62 69 61 73 52 69  = upr>>(1-biasRi
293f0 67 68 74 29 3b 20 2f 2a 20 69 64 78 20 3d 20 62  ght); /* idx = b
29400 69 61 73 52 69 67 68 74 20 3f 20 75 70 72 20 3a  iasRight ? upr :
29410 20 28 6c 77 72 2b 75 70 72 29 2f 32 3b 20 2a 2f   (lwr+upr)/2; */
29420 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78  .    pCur->aiIdx
29430 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20  [pCur->iPage] = 
29440 28 75 31 36 29 69 64 78 3b 0a 20 20 20 20 69 66  (u16)idx;.    if
29450 28 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  ( xRecordCompare
29460 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 6f 72  ==0 ){.      for
29470 28 3b 3b 29 7b 0a 20 20 20 20 20 20 20 20 69 36  (;;){.        i6
29480 34 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20  4 nCellKey;.    
29490 20 20 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64      pCell = find
294a0 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 64 78 29  Cell(pPage, idx)
294b0 20 2b 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50   + pPage->childP
294c0 74 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20  trSize;.        
294d0 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65  if( pPage->intKe
294e0 79 4c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20  yLeaf ){.       
294f0 20 20 20 77 68 69 6c 65 28 20 30 78 38 30 20 3c     while( 0x80 <
29500 3d 20 2a 28 70 43 65 6c 6c 2b 2b 29 20 29 7b 0a  = *(pCell++) ){.
29510 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
29520 70 43 65 6c 6c 3e 3d 70 50 61 67 65 2d 3e 61 44  pCell>=pPage->aD
29530 61 74 61 45 6e 64 20 29 20 72 65 74 75 72 6e 20  ataEnd ) return 
29540 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
29550 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  KPT;.          }
29560 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
29570 20 20 20 67 65 74 56 61 72 69 6e 74 28 70 43 65     getVarint(pCe
29580 6c 6c 2c 20 28 75 36 34 2a 29 26 6e 43 65 6c 6c  ll, (u64*)&nCell
29590 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 69 66  Key);.        if
295a0 28 20 6e 43 65 6c 6c 4b 65 79 3c 69 6e 74 4b 65  ( nCellKey<intKe
295b0 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6c  y ){.          l
295c0 77 72 20 3d 20 69 64 78 2b 31 3b 0a 20 20 20 20  wr = idx+1;.    
295d0 20 20 20 20 20 20 69 66 28 20 6c 77 72 3e 75 70        if( lwr>up
295e0 72 20 29 7b 20 63 20 3d 20 2d 31 3b 20 62 72 65  r ){ c = -1; bre
295f0 61 6b 3b 20 7d 0a 20 20 20 20 20 20 20 20 7d 65  ak; }.        }e
29600 6c 73 65 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79  lse if( nCellKey
29610 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20  >intKey ){.     
29620 20 20 20 20 20 75 70 72 20 3d 20 69 64 78 2d 31       upr = idx-1
29630 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
29640 6c 77 72 3e 75 70 72 20 29 7b 20 63 20 3d 20 2b  lwr>upr ){ c = +
29650 31 3b 20 62 72 65 61 6b 3b 20 7d 0a 20 20 20 20  1; break; }.    
29660 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
29670 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 65       assert( nCe
29680 6c 6c 4b 65 79 3d 3d 69 6e 74 4b 65 79 20 29 3b  llKey==intKey );
29690 0a 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d  .          pCur-
296a0 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20 42 54 43  >curFlags |= BTC
296b0 46 5f 56 61 6c 69 64 4e 4b 65 79 3b 0a 20 20 20  F_ValidNKey;.   
296c0 20 20 20 20 20 20 20 70 43 75 72 2d 3e 69 6e 66         pCur->inf
296d0 6f 2e 6e 4b 65 79 20 3d 20 6e 43 65 6c 6c 4b 65  o.nKey = nCellKe
296e0 79 3b 0a 20 20 20 20 20 20 20 20 20 20 70 43 75  y;.          pCu
296f0 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
29700 50 61 67 65 5d 20 3d 20 28 75 31 36 29 69 64 78  Page] = (u16)idx
29710 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
29720 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a  !pPage->leaf ){.
29730 20 20 20 20 20 20 20 20 20 20 20 20 6c 77 72 20              lwr 
29740 3d 20 69 64 78 3b 0a 20 20 20 20 20 20 20 20 20  = idx;.         
29750 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 6e     goto moveto_n
29760 65 78 74 5f 6c 61 79 65 72 3b 0a 20 20 20 20 20  ext_layer;.     
29770 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
29780 20 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20          *pRes = 
29790 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  0;.            r
297a0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
297b0 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20             goto 
297c0 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20  moveto_finish;. 
297d0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
297e0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73     }.        ass
297f0 65 72 74 28 20 6c 77 72 2b 75 70 72 3e 3d 30 20  ert( lwr+upr>=0 
29800 29 3b 0a 20 20 20 20 20 20 20 20 69 64 78 20 3d  );.        idx =
29810 20 28 6c 77 72 2b 75 70 72 29 3e 3e 31 3b 20 20   (lwr+upr)>>1;  
29820 2f 2a 20 69 64 78 20 3d 20 28 6c 77 72 2b 75 70  /* idx = (lwr+up
29830 72 29 2f 32 3b 20 2a 2f 0a 20 20 20 20 20 20 7d  r)/2; */.      }
29840 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
29850 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 20    for(;;){.     
29860 20 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 0a 20 20     int nCell;.  
29870 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 66 69        pCell = fi
29880 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 64  ndCell(pPage, id
29890 78 29 20 2b 20 70 50 61 67 65 2d 3e 63 68 69 6c  x) + pPage->chil
298a0 64 50 74 72 53 69 7a 65 3b 0a 0a 20 20 20 20 20  dPtrSize;..     
298b0 20 20 20 2f 2a 20 54 68 65 20 6d 61 78 69 6d 75     /* The maximu
298c0 6d 20 73 75 70 70 6f 72 74 65 64 20 70 61 67 65  m supported page
298d0 2d 73 69 7a 65 20 69 73 20 36 35 35 33 36 20 62  -size is 65536 b
298e0 79 74 65 73 2e 20 54 68 69 73 20 6d 65 61 6e 73  ytes. This means
298f0 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a   that.        **
29900 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d   the maximum num
29910 62 65 72 20 6f 66 20 72 65 63 6f 72 64 20 62 79  ber of record by
29920 74 65 73 20 73 74 6f 72 65 64 20 6f 6e 20 61 6e  tes stored on an
29930 20 69 6e 64 65 78 20 42 2d 54 72 65 65 0a 20 20   index B-Tree.  
29940 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20 69 73        ** page is
29950 20 6c 65 73 73 20 74 68 61 6e 20 31 36 33 38 34   less than 16384
29960 20 62 79 74 65 73 20 61 6e 64 20 6d 61 79 20 62   bytes and may b
29970 65 20 73 74 6f 72 65 64 20 61 73 20 61 20 32 2d  e stored as a 2-
29980 62 79 74 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  byte.        ** 
29990 76 61 72 69 6e 74 2e 20 54 68 69 73 20 69 6e 66  varint. This inf
299a0 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75 73 65 64  ormation is used
299b0 20 74 6f 20 61 74 74 65 6d 70 74 20 74 6f 20 61   to attempt to a
299c0 76 6f 69 64 20 70 61 72 73 69 6e 67 20 0a 20 20  void parsing .  
299d0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 65 6e 74        ** the ent
299e0 69 72 65 20 63 65 6c 6c 20 62 79 20 63 68 65 63  ire cell by chec
299f0 6b 69 6e 67 20 66 6f 72 20 74 68 65 20 63 61 73  king for the cas
29a00 65 73 20 77 68 65 72 65 20 74 68 65 20 72 65 63  es where the rec
29a10 6f 72 64 20 69 73 20 0a 20 20 20 20 20 20 20 20  ord is .        
29a20 2a 2a 20 73 74 6f 72 65 64 20 65 6e 74 69 72 65  ** stored entire
29a30 6c 79 20 77 69 74 68 69 6e 20 74 68 65 20 62 2d  ly within the b-
29a40 74 72 65 65 20 70 61 67 65 20 62 79 20 69 6e 73  tree page by ins
29a50 70 65 63 74 69 6e 67 20 74 68 65 20 66 69 72 73  pecting the firs
29a60 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 32 20  t .        ** 2 
29a70 62 79 74 65 73 20 6f 66 20 74 68 65 20 63 65 6c  bytes of the cel
29a80 6c 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  l..        */.  
29a90 20 20 20 20 20 20 6e 43 65 6c 6c 20 3d 20 70 43        nCell = pC
29aa0 65 6c 6c 5b 30 5d 3b 0a 20 20 20 20 20 20 20 20  ell[0];.        
29ab0 69 66 28 20 6e 43 65 6c 6c 3c 3d 70 50 61 67 65  if( nCell<=pPage
29ac0 2d 3e 6d 61 78 31 62 79 74 65 50 61 79 6c 6f 61  ->max1bytePayloa
29ad0 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  d ){.          /
29ae0 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20 72 75  * This branch ru
29af0 6e 73 20 69 66 20 74 68 65 20 72 65 63 6f 72 64  ns if the record
29b00 2d 73 69 7a 65 20 66 69 65 6c 64 20 6f 66 20 74  -size field of t
29b10 68 65 20 63 65 6c 6c 20 69 73 20 61 0a 20 20 20  he cell is a.   
29b20 20 20 20 20 20 20 20 2a 2a 20 73 69 6e 67 6c 65         ** single
29b30 20 62 79 74 65 20 76 61 72 69 6e 74 20 61 6e 64   byte varint and
29b40 20 74 68 65 20 72 65 63 6f 72 64 20 66 69 74 73   the record fits
29b50 20 65 6e 74 69 72 65 6c 79 20 6f 6e 20 74 68 65   entirely on the
29b60 20 6d 61 69 6e 0a 20 20 20 20 20 20 20 20 20 20   main.          
29b70 2a 2a 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20  ** b-tree page. 
29b80 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 74 65   */.          te
29b90 73 74 63 61 73 65 28 20 70 43 65 6c 6c 2b 6e 43  stcase( pCell+nC
29ba0 65 6c 6c 2b 31 3d 3d 70 50 61 67 65 2d 3e 61 44  ell+1==pPage->aD
29bb0 61 74 61 45 6e 64 20 29 3b 0a 20 20 20 20 20 20  ataEnd );.      
29bc0 20 20 20 20 63 20 3d 20 78 52 65 63 6f 72 64 43      c = xRecordC
29bd0 6f 6d 70 61 72 65 28 6e 43 65 6c 6c 2c 20 28 76  ompare(nCell, (v
29be0 6f 69 64 2a 29 26 70 43 65 6c 6c 5b 31 5d 2c 20  oid*)&pCell[1], 
29bf0 70 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 20 20  pIdxKey);.      
29c00 20 20 7d 65 6c 73 65 20 69 66 28 20 21 28 70 43    }else if( !(pC
29c10 65 6c 6c 5b 31 5d 20 26 20 30 78 38 30 29 20 0a  ell[1] & 0x80) .
29c20 20 20 20 20 20 20 20 20 20 20 26 26 20 28 6e 43            && (nC
29c30 65 6c 6c 20 3d 20 28 28 6e 43 65 6c 6c 26 30 78  ell = ((nCell&0x
29c40 37 66 29 3c 3c 37 29 20 2b 20 70 43 65 6c 6c 5b  7f)<<7) + pCell[
29c50 31 5d 29 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c  1])<=pPage->maxL
29c60 6f 63 61 6c 0a 20 20 20 20 20 20 20 20 29 7b 0a  ocal.        ){.
29c70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
29c80 20 72 65 63 6f 72 64 2d 73 69 7a 65 20 66 69 65   record-size fie
29c90 6c 64 20 69 73 20 61 20 32 20 62 79 74 65 20 76  ld is a 2 byte v
29ca0 61 72 69 6e 74 20 61 6e 64 20 74 68 65 20 72 65  arint and the re
29cb0 63 6f 72 64 20 0a 20 20 20 20 20 20 20 20 20 20  cord .          
29cc0 2a 2a 20 66 69 74 73 20 65 6e 74 69 72 65 6c 79  ** fits entirely
29cd0 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20 62 2d 74   on the main b-t
29ce0 72 65 65 20 70 61 67 65 2e 20 20 2a 2f 0a 20 20  ree page.  */.  
29cf0 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
29d00 28 20 70 43 65 6c 6c 2b 6e 43 65 6c 6c 2b 32 3d  ( pCell+nCell+2=
29d10 3d 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64  =pPage->aDataEnd
29d20 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63 20   );.          c 
29d30 3d 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  = xRecordCompare
29d40 28 6e 43 65 6c 6c 2c 20 28 76 6f 69 64 2a 29 26  (nCell, (void*)&
29d50 70 43 65 6c 6c 5b 32 5d 2c 20 70 49 64 78 4b 65  pCell[2], pIdxKe
29d60 79 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  y);.        }els
29d70 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e{.          /* 
29d80 54 68 65 20 72 65 63 6f 72 64 20 66 6c 6f 77 73  The record flows
29d90 20 6f 76 65 72 20 6f 6e 74 6f 20 6f 6e 65 20 6f   over onto one o
29da0 72 20 6d 6f 72 65 20 6f 76 65 72 66 6c 6f 77 20  r more overflow 
29db0 70 61 67 65 73 2e 20 49 6e 0a 20 20 20 20 20 20  pages. In.      
29dc0 20 20 20 20 2a 2a 20 74 68 69 73 20 63 61 73 65      ** this case
29dd0 20 74 68 65 20 77 68 6f 6c 65 20 63 65 6c 6c 20   the whole cell 
29de0 6e 65 65 64 73 20 74 6f 20 62 65 20 70 61 72 73  needs to be pars
29df0 65 64 2c 20 61 20 62 75 66 66 65 72 20 61 6c 6c  ed, a buffer all
29e00 6f 63 61 74 65 64 0a 20 20 20 20 20 20 20 20 20  ocated.         
29e10 20 2a 2a 20 61 6e 64 20 61 63 63 65 73 73 50 61   ** and accessPa
29e20 79 6c 6f 61 64 28 29 20 75 73 65 64 20 74 6f 20  yload() used to 
29e30 72 65 74 72 69 65 76 65 20 74 68 65 20 72 65 63  retrieve the rec
29e40 6f 72 64 20 69 6e 74 6f 20 74 68 65 0a 20 20 20  ord into the.   
29e50 20 20 20 20 20 20 20 2a 2a 20 62 75 66 66 65 72         ** buffer
29e60 20 62 65 66 6f 72 65 20 56 64 62 65 52 65 63 6f   before VdbeReco
29e70 72 64 43 6f 6d 70 61 72 65 28 29 20 63 61 6e 20  rdCompare() can 
29e80 62 65 20 63 61 6c 6c 65 64 2e 20 2a 2f 0a 20 20  be called. */.  
29e90 20 20 20 20 20 20 20 20 76 6f 69 64 20 2a 70 43          void *pC
29ea0 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20 20 20  ellKey;.        
29eb0 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 70 43 65    u8 * const pCe
29ec0 6c 6c 42 6f 64 79 20 3d 20 70 43 65 6c 6c 20 2d  llBody = pCell -
29ed0 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72   pPage->childPtr
29ee0 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Size;.          
29ef0 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  btreeParseCellPt
29f00 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 42 6f  r(pPage, pCellBo
29f10 64 79 2c 20 26 70 43 75 72 2d 3e 69 6e 66 6f 29  dy, &pCur->info)
29f20 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 43 65 6c  ;.          nCel
29f30 6c 20 3d 20 28 69 6e 74 29 70 43 75 72 2d 3e 69  l = (int)pCur->i
29f40 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 20 20 20 20  nfo.nKey;.      
29f50 20 20 20 20 70 43 65 6c 6c 4b 65 79 20 3d 20 73      pCellKey = s
29f60 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 20 6e 43  qlite3Malloc( nC
29f70 65 6c 6c 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ell );.         
29f80 20 69 66 28 20 70 43 65 6c 6c 4b 65 79 3d 3d 30   if( pCellKey==0
29f90 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
29fa0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
29fb0 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67  M;.            g
29fc0 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73  oto moveto_finis
29fd0 68 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  h;.          }. 
29fe0 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 61           pCur->a
29ff0 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
2a000 5d 20 3d 20 28 75 31 36 29 69 64 78 3b 0a 20 20  ] = (u16)idx;.  
2a010 20 20 20 20 20 20 20 20 72 63 20 3d 20 61 63 63          rc = acc
2a020 65 73 73 50 61 79 6c 6f 61 64 28 70 43 75 72 2c  essPayload(pCur,
2a030 20 30 2c 20 6e 43 65 6c 6c 2c 20 28 75 6e 73 69   0, nCell, (unsi
2a040 67 6e 65 64 20 63 68 61 72 2a 29 70 43 65 6c 6c  gned char*)pCell
2a050 4b 65 79 2c 20 32 29 3b 0a 20 20 20 20 20 20 20  Key, 2);.       
2a060 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
2a070 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
2a080 5f 66 72 65 65 28 70 43 65 6c 6c 4b 65 79 29 3b  _free(pCellKey);
2a090 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74  .            got
2a0a0 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b  o moveto_finish;
2a0b0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2a0c0 20 20 20 20 20 20 20 63 20 3d 20 78 52 65 63 6f         c = xReco
2a0d0 72 64 43 6f 6d 70 61 72 65 28 6e 43 65 6c 6c 2c  rdCompare(nCell,
2a0e0 20 70 43 65 6c 6c 4b 65 79 2c 20 70 49 64 78 4b   pCellKey, pIdxK
2a0f0 65 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  ey);.          s
2a100 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 65 6c  qlite3_free(pCel
2a110 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 7d  lKey);.        }
2a120 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
2a130 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 70   .            (p
2a140 49 64 78 4b 65 79 2d 3e 65 72 72 43 6f 64 65 21  IdxKey->errCode!
2a150 3d 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20  =SQLITE_CORRUPT 
2a160 7c 7c 20 63 3d 3d 30 29 0a 20 20 20 20 20 20 20  || c==0).       
2a170 20 20 26 26 20 28 70 49 64 78 4b 65 79 2d 3e 65    && (pIdxKey->e
2a180 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 4e  rrCode!=SQLITE_N
2a190 4f 4d 45 4d 20 7c 7c 20 70 43 75 72 2d 3e 70 42  OMEM || pCur->pB
2a1a0 74 72 65 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  tree->db->malloc
2a1b0 46 61 69 6c 65 64 29 0a 20 20 20 20 20 20 20 20  Failed).        
2a1c0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63  );.        if( c
2a1d0 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  <0 ){.          
2a1e0 6c 77 72 20 3d 20 69 64 78 2b 31 3b 0a 20 20 20  lwr = idx+1;.   
2a1f0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63       }else if( c
2a200 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  >0 ){.          
2a210 75 70 72 20 3d 20 69 64 78 2d 31 3b 0a 20 20 20  upr = idx-1;.   
2a220 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2a230 20 20 20 20 20 20 61 73 73 65 72 74 28 20 63 3d        assert( c=
2a240 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  =0 );.          
2a250 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20  *pRes = 0;.     
2a260 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
2a270 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 70  _OK;.          p
2a280 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
2a290 3e 69 50 61 67 65 5d 20 3d 20 28 75 31 36 29 69  >iPage] = (u16)i
2a2a0 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  dx;.          if
2a2b0 28 20 70 49 64 78 4b 65 79 2d 3e 65 72 72 43 6f  ( pIdxKey->errCo
2a2c0 64 65 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45  de ) rc = SQLITE
2a2d0 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20  _CORRUPT;.      
2a2e0 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f      goto moveto_
2a2f0 66 69 6e 69 73 68 3b 0a 20 20 20 20 20 20 20 20  finish;.        
2a300 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6c 77  }.        if( lw
2a310 72 3e 75 70 72 20 29 20 62 72 65 61 6b 3b 0a 20  r>upr ) break;. 
2a320 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6c         assert( l
2a330 77 72 2b 75 70 72 3e 3d 30 20 29 3b 0a 20 20 20  wr+upr>=0 );.   
2a340 20 20 20 20 20 69 64 78 20 3d 20 28 6c 77 72 2b       idx = (lwr+
2a350 75 70 72 29 3e 3e 31 3b 20 20 2f 2a 20 69 64 78  upr)>>1;  /* idx
2a360 20 3d 20 28 6c 77 72 2b 75 70 72 29 2f 32 20 2a   = (lwr+upr)/2 *
2a370 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  /.      }.    }.
2a380 20 20 20 20 61 73 73 65 72 74 28 20 6c 77 72 3d      assert( lwr=
2a390 3d 75 70 72 2b 31 20 7c 7c 20 28 70 50 61 67 65  =upr+1 || (pPage
2a3a0 2d 3e 69 6e 74 4b 65 79 20 26 26 20 21 70 50 61  ->intKey && !pPa
2a3b0 67 65 2d 3e 6c 65 61 66 29 20 29 3b 0a 20 20 20  ge->leaf) );.   
2a3c0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
2a3d0 69 73 49 6e 69 74 20 29 3b 0a 20 20 20 20 69 66  isInit );.    if
2a3e0 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b  ( pPage->leaf ){
2a3f0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
2a400 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
2a410 3e 69 50 61 67 65 5d 3c 70 43 75 72 2d 3e 61 70  >iPage]<pCur->ap
2a420 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
2a430 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20  ]->nCell );.    
2a440 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43    pCur->aiIdx[pC
2a450 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75 31  ur->iPage] = (u1
2a460 36 29 69 64 78 3b 0a 20 20 20 20 20 20 2a 70 52  6)idx;.      *pR
2a470 65 73 20 3d 20 63 3b 0a 20 20 20 20 20 20 72 63  es = c;.      rc
2a480 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
2a490 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f      goto moveto_
2a4a0 66 69 6e 69 73 68 3b 0a 20 20 20 20 7d 0a 6d 6f  finish;.    }.mo
2a4b0 76 65 74 6f 5f 6e 65 78 74 5f 6c 61 79 65 72 3a  veto_next_layer:
2a4c0 0a 20 20 20 20 69 66 28 20 6c 77 72 3e 3d 70 50  .    if( lwr>=pP
2a4d0 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20  age->nCell ){.  
2a4e0 20 20 20 20 63 68 6c 64 50 67 20 3d 20 67 65 74      chldPg = get
2a4f0 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44  4byte(&pPage->aD
2a500 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66  ata[pPage->hdrOf
2a510 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 7d 65  fset+8]);.    }e
2a520 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 6c 64 50  lse{.      chldP
2a530 67 20 3d 20 67 65 74 34 62 79 74 65 28 66 69 6e  g = get4byte(fin
2a540 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 6c 77 72  dCell(pPage, lwr
2a550 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43  ));.    }.    pC
2a560 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
2a570 69 50 61 67 65 5d 20 3d 20 28 75 31 36 29 6c 77  iPage] = (u16)lw
2a580 72 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65  r;.    rc = move
2a590 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 63 68  ToChild(pCur, ch
2a5a0 6c 64 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72  ldPg);.    if( r
2a5b0 63 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 6d  c ) break;.  }.m
2a5c0 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3a 0a 20 20  oveto_finish:.  
2a5d0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
2a5e0 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75   = 0;.  pCur->cu
2a5f0 72 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 43 46  rFlags &= ~(BTCF
2a600 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f  _ValidNKey|BTCF_
2a610 56 61 6c 69 64 4f 76 66 6c 29 3b 0a 20 20 72 65  ValidOvfl);.  re
2a620 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a  turn rc;.}.../*.
2a630 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
2a640 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  f the cursor is 
2a650 6e 6f 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20  not pointing at 
2a660 61 6e 20 65 6e 74 72 79 20 6f 66 20 74 68 65 20  an entry of the 
2a670 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 52 55  table..**.** TRU
2a680 45 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e  E will be return
2a690 65 64 20 61 66 74 65 72 20 61 20 63 61 6c 6c 20  ed after a call 
2a6a0 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e  to sqlite3BtreeN
2a6b0 65 78 74 28 29 20 6d 6f 76 65 73 0a 2a 2a 20 70  ext() moves.** p
2a6c0 61 73 74 20 74 68 65 20 6c 61 73 74 20 65 6e 74  ast the last ent
2a6d0 72 79 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20  ry in the table 
2a6e0 6f 72 20 73 71 6c 69 74 65 33 42 74 72 65 65 50  or sqlite3BtreeP
2a6f0 72 65 76 28 29 20 6d 6f 76 65 73 20 70 61 73 74  rev() moves past
2a700 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 65 6e  .** the first en
2a710 74 72 79 2e 20 20 54 52 55 45 20 69 73 20 61 6c  try.  TRUE is al
2a720 73 6f 20 72 65 74 75 72 6e 65 64 20 69 66 20 74  so returned if t
2a730 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74  he table is empt
2a740 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  y..*/.int sqlite
2a750 33 42 74 72 65 65 45 6f 66 28 42 74 43 75 72 73  3BtreeEof(BtCurs
2a760 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 2f 2a 20  or *pCur){.  /* 
2a770 54 4f 44 4f 3a 20 57 68 61 74 20 69 66 20 74 68  TODO: What if th
2a780 65 20 63 75 72 73 6f 72 20 69 73 20 69 6e 20 43  e cursor is in C
2a790 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45  URSOR_REQUIRESEE
2a7a0 4b 20 62 75 74 20 61 6c 6c 20 74 61 62 6c 65 20  K but all table 
2a7b0 65 6e 74 72 69 65 73 0a 20 20 2a 2a 20 68 61 76  entries.  ** hav
2a7c0 65 20 62 65 65 6e 20 64 65 6c 65 74 65 64 3f 20  e been deleted? 
2a7d0 54 68 69 73 20 41 50 49 20 77 69 6c 6c 20 6e 65  This API will ne
2a7e0 65 64 20 74 6f 20 63 68 61 6e 67 65 20 74 6f 20  ed to change to 
2a7f0 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20  return an error 
2a800 63 6f 64 65 0a 20 20 2a 2a 20 61 73 20 77 65 6c  code.  ** as wel
2a810 6c 20 61 73 20 74 68 65 20 62 6f 6f 6c 65 61 6e  l as the boolean
2a820 20 72 65 73 75 6c 74 20 76 61 6c 75 65 2e 0a 20   result value.. 
2a830 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 28 43 55   */.  return (CU
2a840 52 53 4f 52 5f 56 41 4c 49 44 21 3d 70 43 75 72  RSOR_VALID!=pCur
2a850 2d 3e 65 53 74 61 74 65 29 3b 0a 7d 0a 0a 2f 2a  ->eState);.}../*
2a860 0a 2a 2a 20 41 64 76 61 6e 63 65 20 74 68 65 20  .** Advance the 
2a870 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 6e 65  cursor to the ne
2a880 78 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  xt entry in the 
2a890 64 61 74 61 62 61 73 65 2e 20 20 49 66 0a 2a 2a  database.  If.**
2a8a0 20 73 75 63 63 65 73 73 66 75 6c 20 74 68 65 6e   successful then
2a8b0 20 73 65 74 20 2a 70 52 65 73 3d 30 2e 20 20 49   set *pRes=0.  I
2a8c0 66 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20  f the cursor.** 
2a8d0 77 61 73 20 61 6c 72 65 61 64 79 20 70 6f 69 6e  was already poin
2a8e0 74 69 6e 67 20 74 6f 20 74 68 65 20 6c 61 73 74  ting to the last
2a8f0 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61   entry in the da
2a900 74 61 62 61 73 65 20 62 65 66 6f 72 65 0a 2a 2a  tabase before.**
2a910 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61   this routine wa
2a920 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20 73  s called, then s
2a930 65 74 20 2a 70 52 65 73 3d 31 2e 0a 2a 2a 0a 2a  et *pRes=1..**.*
2a940 2a 20 54 68 65 20 6d 61 69 6e 20 65 6e 74 72 79  * The main entry
2a950 20 70 6f 69 6e 74 20 69 73 20 73 71 6c 69 74 65   point is sqlite
2a960 33 42 74 72 65 65 4e 65 78 74 28 29 2e 20 20 54  3BtreeNext().  T
2a970 68 61 74 20 72 6f 75 74 69 6e 65 20 69 73 20 6f  hat routine is o
2a980 70 74 69 6d 69 7a 65 64 0a 2a 2a 20 66 6f 72 20  ptimized.** for 
2a990 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20  the common case 
2a9a0 6f 66 20 6d 65 72 65 6c 79 20 69 6e 63 72 65 6d  of merely increm
2a9b0 65 6e 74 69 6e 67 20 74 68 65 20 63 65 6c 6c 20  enting the cell 
2a9c0 63 6f 75 6e 74 65 72 20 42 74 43 75 72 73 6f 72  counter BtCursor
2a9d0 2e 61 69 49 64 78 0a 2a 2a 20 74 6f 20 74 68 65  .aiIdx.** to the
2a9e0 20 6e 65 78 74 20 63 65 6c 6c 20 6f 6e 20 74 68   next cell on th
2a9f0 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 2e 20  e current page. 
2aa00 20 54 68 65 20 28 73 6c 6f 77 65 72 29 20 62 74   The (slower) bt
2aa10 72 65 65 4e 65 78 74 28 29 20 68 65 6c 70 65 72  reeNext() helper
2aa20 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 63  .** routine is c
2aa30 61 6c 6c 65 64 20 77 68 65 6e 20 69 74 20 69 73  alled when it is
2aa40 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 6d 6f   necessary to mo
2aa50 76 65 20 74 6f 20 61 20 64 69 66 66 65 72 65 6e  ve to a differen
2aa60 74 20 70 61 67 65 20 6f 72 0a 2a 2a 20 74 6f 20  t page or.** to 
2aa70 72 65 73 74 6f 72 65 20 74 68 65 20 63 75 72 73  restore the curs
2aa80 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61  or..**.** The ca
2aa90 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 77  lling function w
2aaa0 69 6c 6c 20 73 65 74 20 2a 70 52 65 73 20 74 6f  ill set *pRes to
2aab0 20 30 20 6f 72 20 31 2e 20 20 54 68 65 20 69 6e   0 or 1.  The in
2aac0 69 74 69 61 6c 20 2a 70 52 65 73 20 76 61 6c 75  itial *pRes valu
2aad0 65 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 31 20 69  e.** will be 1 i
2aae0 66 20 74 68 65 20 63 75 72 73 6f 72 20 62 65 69  f the cursor bei
2aaf0 6e 67 20 73 74 65 70 70 65 64 20 63 6f 72 72 65  ng stepped corre
2ab00 73 70 6f 6e 64 73 20 74 6f 20 61 6e 20 53 51 4c  sponds to an SQL
2ab10 20 69 6e 64 65 78 20 61 6e 64 0a 2a 2a 20 69 66   index and.** if
2ab20 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63 6f   this routine co
2ab30 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20 73 6b  uld have been sk
2ab40 69 70 70 65 64 20 69 66 20 74 68 61 74 20 53 51  ipped if that SQ
2ab50 4c 20 69 6e 64 65 78 20 68 61 64 20 62 65 65 6e  L index had been
2ab60 0a 2a 2a 20 61 20 75 6e 69 71 75 65 20 69 6e 64  .** a unique ind
2ab70 65 78 2e 20 20 4f 74 68 65 72 77 69 73 65 20 74  ex.  Otherwise t
2ab80 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 68  he caller will h
2ab90 61 76 65 20 73 65 74 20 2a 70 52 65 73 20 74 6f  ave set *pRes to
2aba0 20 7a 65 72 6f 2e 0a 2a 2a 20 5a 65 72 6f 20 69   zero..** Zero i
2abb0 73 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73  s the common cas
2abc0 65 2e 20 54 68 65 20 62 74 72 65 65 20 69 6d 70  e. The btree imp
2abd0 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69 73 20 66  lementation is f
2abe0 72 65 65 20 74 6f 20 75 73 65 20 74 68 65 0a 2a  ree to use the.*
2abf0 2a 20 69 6e 69 74 69 61 6c 20 2a 70 52 65 73 20  * initial *pRes 
2ac00 76 61 6c 75 65 20 61 73 20 61 20 68 69 6e 74 20  value as a hint 
2ac10 74 6f 20 69 6d 70 72 6f 76 65 20 70 65 72 66 6f  to improve perfo
2ac20 72 6d 61 6e 63 65 2c 20 62 75 74 20 74 68 65 20  rmance, but the 
2ac30 63 75 72 72 65 6e 74 0a 2a 2a 20 53 51 4c 69 74  current.** SQLit
2ac40 65 20 62 74 72 65 65 20 69 6d 70 6c 65 6d 65 6e  e btree implemen
2ac50 74 61 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 2e  tation does not.
2ac60 20 28 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20   (Note that the 
2ac70 63 6f 6d 64 62 32 20 62 74 72 65 65 0a 2a 2a 20  comdb2 btree.** 
2ac80 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 64  implementation d
2ac90 6f 65 73 20 75 73 65 20 74 68 69 73 20 68 69 6e  oes use this hin
2aca0 74 2c 20 68 6f 77 65 76 65 72 2e 29 0a 2a 2f 0a  t, however.).*/.
2acb0 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f  static SQLITE_NO
2acc0 49 4e 4c 49 4e 45 20 69 6e 74 20 62 74 72 65 65  INLINE int btree
2acd0 4e 65 78 74 28 42 74 43 75 72 73 6f 72 20 2a 70  Next(BtCursor *p
2ace0 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b  Cur, int *pRes){
2acf0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74  .  int rc;.  int
2ad00 20 69 64 78 3b 0a 20 20 4d 65 6d 50 61 67 65 20   idx;.  MemPage 
2ad10 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72  *pPage;..  asser
2ad20 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
2ad30 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61  tex(pCur) );.  a
2ad40 73 73 65 72 74 28 20 70 43 75 72 2d 3e 73 6b 69  ssert( pCur->ski
2ad50 70 4e 65 78 74 3d 3d 30 20 7c 7c 20 70 43 75 72  pNext==0 || pCur
2ad60 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52  ->eState!=CURSOR
2ad70 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65  _VALID );.  asse
2ad80 72 74 28 20 2a 70 52 65 73 3d 3d 30 20 29 3b 0a  rt( *pRes==0 );.
2ad90 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
2ada0 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te!=CURSOR_VALID
2adb0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
2adc0 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20  (pCur->curFlags 
2add0 26 20 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c  & BTCF_ValidOvfl
2ade0 29 3d 3d 30 20 29 3b 0a 20 20 20 20 72 63 20 3d  )==0 );.    rc =
2adf0 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f   restoreCursorPo
2ae00 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20  sition(pCur);.  
2ae10 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2ae20 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74  _OK ){.      ret
2ae30 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
2ae40 20 20 69 66 28 20 43 55 52 53 4f 52 5f 49 4e 56    if( CURSOR_INV
2ae50 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61  ALID==pCur->eSta
2ae60 74 65 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 65  te ){.      *pRe
2ae70 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 72 65 74  s = 1;.      ret
2ae80 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
2ae90 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 43 75     }.    if( pCu
2aea0 72 2d 3e 73 6b 69 70 4e 65 78 74 20 29 7b 0a 20  r->skipNext ){. 
2aeb0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75       assert( pCu
2aec0 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
2aed0 52 5f 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d  R_VALID || pCur-
2aee0 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
2aef0 53 4b 49 50 4e 45 58 54 20 29 3b 0a 20 20 20 20  SKIPNEXT );.    
2af00 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
2af10 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20   CURSOR_VALID;. 
2af20 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 73       if( pCur->s
2af30 6b 69 70 4e 65 78 74 3e 30 20 29 7b 0a 20 20 20  kipNext>0 ){.   
2af40 20 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e       pCur->skipN
2af50 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ext = 0;.       
2af60 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2af70 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  K;.      }.     
2af80 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20   pCur->skipNext 
2af90 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  = 0;.    }.  }..
2afa0 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e    pPage = pCur->
2afb0 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
2afc0 67 65 5d 3b 0a 20 20 69 64 78 20 3d 20 2b 2b 70  ge];.  idx = ++p
2afd0 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
2afe0 3e 69 50 61 67 65 5d 3b 0a 20 20 61 73 73 65 72  >iPage];.  asser
2aff0 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  t( pPage->isInit
2b000 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65   );..  /* If the
2b010 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
2b020 73 20 63 6f 72 72 75 70 74 2c 20 69 74 20 69 73  s corrupt, it is
2b030 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 74 68   possible for th
2b040 65 20 76 61 6c 75 65 20 6f 66 20 69 64 78 20 0a  e value of idx .
2b050 20 20 2a 2a 20 74 6f 20 62 65 20 69 6e 76 61 6c    ** to be inval
2b060 69 64 20 68 65 72 65 2e 20 54 68 69 73 20 63 61  id here. This ca
2b070 6e 20 6f 6e 6c 79 20 6f 63 63 75 72 20 69 66 20  n only occur if 
2b080 61 20 73 65 63 6f 6e 64 20 63 75 72 73 6f 72 20  a second cursor 
2b090 6d 6f 64 69 66 69 65 73 0a 20 20 2a 2a 20 74 68  modifies.  ** th
2b0a0 65 20 70 61 67 65 20 77 68 69 6c 65 20 63 75 72  e page while cur
2b0b0 73 6f 72 20 70 43 75 72 20 69 73 20 68 6f 6c 64  sor pCur is hold
2b0c0 69 6e 67 20 61 20 72 65 66 65 72 65 6e 63 65 20  ing a reference 
2b0d0 74 6f 20 69 74 2e 20 57 68 69 63 68 20 63 61 6e  to it. Which can
2b0e0 0a 20 20 2a 2a 20 6f 6e 6c 79 20 68 61 70 70 65  .  ** only happe
2b0f0 6e 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73  n if the databas
2b100 65 20 69 73 20 63 6f 72 72 75 70 74 20 69 6e 20  e is corrupt in 
2b110 73 75 63 68 20 61 20 77 61 79 20 61 73 20 74 6f  such a way as to
2b120 20 6c 69 6e 6b 20 74 68 65 0a 20 20 2a 2a 20 70   link the.  ** p
2b130 61 67 65 20 69 6e 74 6f 20 6d 6f 72 65 20 74 68  age into more th
2b140 61 6e 20 6f 6e 65 20 62 2d 74 72 65 65 20 73 74  an one b-tree st
2b150 72 75 63 74 75 72 65 2e 20 2a 2f 0a 20 20 74 65  ructure. */.  te
2b160 73 74 63 61 73 65 28 20 69 64 78 3e 70 50 61 67  stcase( idx>pPag
2b170 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 0a 20 20 69  e->nCell );..  i
2b180 66 28 20 69 64 78 3e 3d 70 50 61 67 65 2d 3e 6e  f( idx>=pPage->n
2b190 43 65 6c 6c 20 29 7b 0a 20 20 20 20 69 66 28 20  Cell ){.    if( 
2b1a0 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a  !pPage->leaf ){.
2b1b0 20 20 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54        rc = moveT
2b1c0 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 67 65 74  oChild(pCur, get
2b1d0 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44  4byte(&pPage->aD
2b1e0 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66  ata[pPage->hdrOf
2b1f0 66 73 65 74 2b 38 5d 29 29 3b 0a 20 20 20 20 20  fset+8]));.     
2b200 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
2b210 20 72 63 3b 0a 20 20 20 20 20 20 72 65 74 75 72   rc;.      retur
2b220 6e 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74  n moveToLeftmost
2b230 28 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20  (pCur);.    }.  
2b240 20 20 64 6f 7b 0a 20 20 20 20 20 20 69 66 28 20    do{.      if( 
2b250 70 43 75 72 2d 3e 69 50 61 67 65 3d 3d 30 20 29  pCur->iPage==0 )
2b260 7b 0a 20 20 20 20 20 20 20 20 2a 70 52 65 73 20  {.        *pRes 
2b270 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 43 75  = 1;.        pCu
2b280 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
2b290 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20  OR_INVALID;.    
2b2a0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2b2b0 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  E_OK;.      }.  
2b2c0 20 20 20 20 6d 6f 76 65 54 6f 50 61 72 65 6e 74      moveToParent
2b2d0 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20 70 50  (pCur);.      pP
2b2e0 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61  age = pCur->apPa
2b2f0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b  ge[pCur->iPage];
2b300 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 70 43 75  .    }while( pCu
2b310 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
2b320 50 61 67 65 5d 3e 3d 70 50 61 67 65 2d 3e 6e 43  Page]>=pPage->nC
2b330 65 6c 6c 20 29 3b 0a 20 20 20 20 69 66 28 20 70  ell );.    if( p
2b340 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a  Page->intKey ){.
2b350 20 20 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c        return sql
2b360 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 70 43  ite3BtreeNext(pC
2b370 75 72 2c 20 70 52 65 73 29 3b 0a 20 20 20 20 7d  ur, pRes);.    }
2b380 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 74 75  else{.      retu
2b390 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
2b3a0 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 50    }.  }.  if( pP
2b3b0 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
2b3c0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2b3d0 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  K;.  }else{.    
2b3e0 72 65 74 75 72 6e 20 6d 6f 76 65 54 6f 4c 65 66  return moveToLef
2b3f0 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 7d  tmost(pCur);.  }
2b400 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  .}.int sqlite3Bt
2b410 72 65 65 4e 65 78 74 28 42 74 43 75 72 73 6f 72  reeNext(BtCursor
2b420 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65   *pCur, int *pRe
2b430 73 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  s){.  MemPage *p
2b440 50 61 67 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Page;.  assert( 
2b450 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
2b460 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
2b470 72 74 28 20 70 52 65 73 21 3d 30 20 29 3b 0a 20  rt( pRes!=0 );. 
2b480 20 61 73 73 65 72 74 28 20 2a 70 52 65 73 3d 3d   assert( *pRes==
2b490 30 20 7c 7c 20 2a 70 52 65 73 3d 3d 31 20 29 3b  0 || *pRes==1 );
2b4a0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
2b4b0 3e 73 6b 69 70 4e 65 78 74 3d 3d 30 20 7c 7c 20  >skipNext==0 || 
2b4c0 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55  pCur->eState!=CU
2b4d0 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
2b4e0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
2b4f0 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75   = 0;.  pCur->cu
2b500 72 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 43 46  rFlags &= ~(BTCF
2b510 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f  _ValidNKey|BTCF_
2b520 56 61 6c 69 64 4f 76 66 6c 29 3b 0a 20 20 2a 70  ValidOvfl);.  *p
2b530 52 65 73 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  Res = 0;.  if( p
2b540 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52  Cur->eState!=CUR
2b550 53 4f 52 5f 56 41 4c 49 44 20 29 20 72 65 74 75  SOR_VALID ) retu
2b560 72 6e 20 62 74 72 65 65 4e 65 78 74 28 70 43 75  rn btreeNext(pCu
2b570 72 2c 20 70 52 65 73 29 3b 0a 20 20 70 50 61 67  r, pRes);.  pPag
2b580 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65  e = pCur->apPage
2b590 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20  [pCur->iPage];. 
2b5a0 20 69 66 28 20 28 2b 2b 70 43 75 72 2d 3e 61 69   if( (++pCur->ai
2b5b0 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
2b5c0 29 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  )>=pPage->nCell 
2b5d0 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49  ){.    pCur->aiI
2b5e0 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  dx[pCur->iPage]-
2b5f0 2d 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 62 74  -;.    return bt
2b600 72 65 65 4e 65 78 74 28 70 43 75 72 2c 20 70 52  reeNext(pCur, pR
2b610 65 73 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  es);.  }.  if( p
2b620 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
2b630 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2b640 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  OK;.  }else{.   
2b650 20 72 65 74 75 72 6e 20 6d 6f 76 65 54 6f 4c 65   return moveToLe
2b660 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20  ftmost(pCur);.  
2b670 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 65 70 20  }.}../*.** Step 
2b680 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68  the cursor to th
2b690 65 20 62 61 63 6b 20 74 6f 20 74 68 65 20 70 72  e back to the pr
2b6a0 65 76 69 6f 75 73 20 65 6e 74 72 79 20 69 6e 20  evious entry in 
2b6b0 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 49  the database.  I
2b6c0 66 0a 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20  f.** successful 
2b6d0 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 30  then set *pRes=0
2b6e0 2e 20 20 49 66 20 74 68 65 20 63 75 72 73 6f 72  .  If the cursor
2b6f0 0a 2a 2a 20 77 61 73 20 61 6c 72 65 61 64 79 20  .** was already 
2b700 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20  pointing to the 
2b710 66 69 72 73 74 20 65 6e 74 72 79 20 69 6e 20 74  first entry in t
2b720 68 65 20 64 61 74 61 62 61 73 65 20 62 65 66 6f  he database befo
2b730 72 65 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69  re.** this routi
2b740 6e 65 20 77 61 73 20 63 61 6c 6c 65 64 2c 20 74  ne was called, t
2b750 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 31 2e  hen set *pRes=1.
2b760 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 69 6e 20  .**.** The main 
2b770 65 6e 74 72 79 20 70 6f 69 6e 74 20 69 73 20 73  entry point is s
2b780 71 6c 69 74 65 33 42 74 72 65 65 50 72 65 76 69  qlite3BtreePrevi
2b790 6f 75 73 28 29 2e 20 20 54 68 61 74 20 72 6f 75  ous().  That rou
2b7a0 74 69 6e 65 20 69 73 20 6f 70 74 69 6d 69 7a 65  tine is optimize
2b7b0 64 0a 2a 2a 20 66 6f 72 20 74 68 65 20 63 6f 6d  d.** for the com
2b7c0 6d 6f 6e 20 63 61 73 65 20 6f 66 20 6d 65 72 65  mon case of mere
2b7d0 6c 79 20 64 65 63 72 65 6d 65 6e 74 69 6e 67 20  ly decrementing 
2b7e0 74 68 65 20 63 65 6c 6c 20 63 6f 75 6e 74 65 72  the cell counter
2b7f0 20 42 74 43 75 72 73 6f 72 2e 61 69 49 64 78 0a   BtCursor.aiIdx.
2b800 2a 2a 20 74 6f 20 74 68 65 20 70 72 65 76 69 6f  ** to the previo
2b810 75 73 20 63 65 6c 6c 20 6f 6e 20 74 68 65 20 63  us cell on the c
2b820 75 72 72 65 6e 74 20 70 61 67 65 2e 20 20 54 68  urrent page.  Th
2b830 65 20 28 73 6c 6f 77 65 72 29 20 62 74 72 65 65  e (slower) btree
2b840 50 72 65 76 69 6f 75 73 28 29 0a 2a 2a 20 68 65  Previous().** he
2b850 6c 70 65 72 20 72 6f 75 74 69 6e 65 20 69 73 20  lper routine is 
2b860 63 61 6c 6c 65 64 20 77 68 65 6e 20 69 74 20 69  called when it i
2b870 73 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 6d  s necessary to m
2b880 6f 76 65 20 74 6f 20 61 20 64 69 66 66 65 72 65  ove to a differe
2b890 6e 74 20 70 61 67 65 0a 2a 2a 20 6f 72 20 74 6f  nt page.** or to
2b8a0 20 72 65 73 74 6f 72 65 20 74 68 65 20 63 75 72   restore the cur
2b8b0 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  sor..**.** The c
2b8c0 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20  alling function 
2b8d0 77 69 6c 6c 20 73 65 74 20 2a 70 52 65 73 20 74  will set *pRes t
2b8e0 6f 20 30 20 6f 72 20 31 2e 20 20 54 68 65 20 69  o 0 or 1.  The i
2b8f0 6e 69 74 69 61 6c 20 2a 70 52 65 73 20 76 61 6c  nitial *pRes val
2b900 75 65 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 31 20  ue.** will be 1 
2b910 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 62 65  if the cursor be
2b920 69 6e 67 20 73 74 65 70 70 65 64 20 63 6f 72 72  ing stepped corr
2b930 65 73 70 6f 6e 64 73 20 74 6f 20 61 6e 20 53 51  esponds to an SQ
2b940 4c 20 69 6e 64 65 78 20 61 6e 64 0a 2a 2a 20 69  L index and.** i
2b950 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63  f this routine c
2b960 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20 73  ould have been s
2b970 6b 69 70 70 65 64 20 69 66 20 74 68 61 74 20 53  kipped if that S
2b980 51 4c 20 69 6e 64 65 78 20 68 61 64 20 62 65 65  QL index had bee
2b990 6e 0a 2a 2a 20 61 20 75 6e 69 71 75 65 20 69 6e  n.** a unique in
2b9a0 64 65 78 2e 20 20 4f 74 68 65 72 77 69 73 65 20  dex.  Otherwise 
2b9b0 74 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20  the caller will 
2b9c0 68 61 76 65 20 73 65 74 20 2a 70 52 65 73 20 74  have set *pRes t
2b9d0 6f 20 7a 65 72 6f 2e 0a 2a 2a 20 5a 65 72 6f 20  o zero..** Zero 
2b9e0 69 73 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61  is the common ca
2b9f0 73 65 2e 20 54 68 65 20 62 74 72 65 65 20 69 6d  se. The btree im
2ba00 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69 73 20  plementation is 
2ba10 66 72 65 65 20 74 6f 20 75 73 65 20 74 68 65 0a  free to use the.
2ba20 2a 2a 20 69 6e 69 74 69 61 6c 20 2a 70 52 65 73  ** initial *pRes
2ba30 20 76 61 6c 75 65 20 61 73 20 61 20 68 69 6e 74   value as a hint
2ba40 20 74 6f 20 69 6d 70 72 6f 76 65 20 70 65 72 66   to improve perf
2ba50 6f 72 6d 61 6e 63 65 2c 20 62 75 74 20 74 68 65  ormance, but the
2ba60 20 63 75 72 72 65 6e 74 0a 2a 2a 20 53 51 4c 69   current.** SQLi
2ba70 74 65 20 62 74 72 65 65 20 69 6d 70 6c 65 6d 65  te btree impleme
2ba80 6e 74 61 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74  ntation does not
2ba90 2e 20 28 4e 6f 74 65 20 74 68 61 74 20 74 68 65  . (Note that the
2baa0 20 63 6f 6d 64 62 32 20 62 74 72 65 65 0a 2a 2a   comdb2 btree.**
2bab0 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
2bac0 64 6f 65 73 20 75 73 65 20 74 68 69 73 20 68 69  does use this hi
2bad0 6e 74 2c 20 68 6f 77 65 76 65 72 2e 29 0a 2a 2f  nt, however.).*/
2bae0 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e  .static SQLITE_N
2baf0 4f 49 4e 4c 49 4e 45 20 69 6e 74 20 62 74 72 65  OINLINE int btre
2bb00 65 50 72 65 76 69 6f 75 73 28 42 74 43 75 72 73  ePrevious(BtCurs
2bb10 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70  or *pCur, int *p
2bb20 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  Res){.  int rc;.
2bb30 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
2bb40 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ;..  assert( cur
2bb50 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
2bb60 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
2bb70 20 70 52 65 73 21 3d 30 20 29 3b 0a 20 20 61 73   pRes!=0 );.  as
2bb80 73 65 72 74 28 20 2a 70 52 65 73 3d 3d 30 20 29  sert( *pRes==0 )
2bb90 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
2bba0 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d 30 20 7c 7c  ->skipNext==0 ||
2bbb0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43   pCur->eState!=C
2bbc0 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
2bbd0 20 61 73 73 65 72 74 28 20 28 70 43 75 72 2d 3e   assert( (pCur->
2bbe0 63 75 72 46 6c 61 67 73 20 26 20 28 42 54 43 46  curFlags & (BTCF
2bbf0 5f 41 74 4c 61 73 74 7c 42 54 43 46 5f 56 61 6c  _AtLast|BTCF_Val
2bc00 69 64 4f 76 66 6c 7c 42 54 43 46 5f 56 61 6c 69  idOvfl|BTCF_Vali
2bc10 64 4e 4b 65 79 29 29 3d 3d 30 20 29 3b 0a 20 20  dNKey))==0 );.  
2bc20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 6e  assert( pCur->in
2bc30 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 3b 0a 20  fo.nSize==0 );. 
2bc40 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74   if( pCur->eStat
2bc50 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e!=CURSOR_VALID 
2bc60 29 7b 0a 20 20 20 20 72 63 20 3d 20 72 65 73 74  ){.    rc = rest
2bc70 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  oreCursorPositio
2bc80 6e 28 70 43 75 72 29 3b 0a 20 20 20 20 69 66 28  n(pCur);.    if(
2bc90 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2bca0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
2bcb0 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  c;.    }.    if(
2bcc0 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d   CURSOR_INVALID=
2bcd0 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29 7b  =pCur->eState ){
2bce0 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31  .      *pRes = 1
2bcf0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
2bd00 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
2bd10 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 73 6b      if( pCur->sk
2bd20 69 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20  ipNext ){.      
2bd30 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
2bd40 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
2bd50 49 44 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61  ID || pCur->eSta
2bd60 74 65 3d 3d 43 55 52 53 4f 52 5f 53 4b 49 50 4e  te==CURSOR_SKIPN
2bd70 45 58 54 20 29 3b 0a 20 20 20 20 20 20 70 43 75  EXT );.      pCu
2bd80 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
2bd90 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 20 20 20 20  OR_VALID;.      
2bda0 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65  if( pCur->skipNe
2bdb0 78 74 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20  xt<0 ){.        
2bdc0 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d  pCur->skipNext =
2bdd0 20 30 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75   0;.        retu
2bde0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
2bdf0 20 20 20 20 7d 0a 20 20 20 20 20 20 70 43 75 72      }.      pCur
2be00 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a  ->skipNext = 0;.
2be10 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 50 61      }.  }..  pPa
2be20 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67  ge = pCur->apPag
2be30 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a  e[pCur->iPage];.
2be40 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
2be50 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 69 66 28  >isInit );.  if(
2be60 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b   !pPage->leaf ){
2be70 0a 20 20 20 20 69 6e 74 20 69 64 78 20 3d 20 70  .    int idx = p
2be80 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
2be90 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20 72 63 20  >iPage];.    rc 
2bea0 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43  = moveToChild(pC
2beb0 75 72 2c 20 67 65 74 34 62 79 74 65 28 66 69 6e  ur, get4byte(fin
2bec0 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 64 78  dCell(pPage, idx
2bed0 29 29 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  )));.    if( rc 
2bee0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
2bef0 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 69 67 68   rc = moveToRigh
2bf00 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 7d  tmost(pCur);.  }
2bf10 65 6c 73 65 7b 0a 20 20 20 20 77 68 69 6c 65 28  else{.    while(
2bf20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
2bf30 72 2d 3e 69 50 61 67 65 5d 3d 3d 30 20 29 7b 0a  r->iPage]==0 ){.
2bf40 20 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e        if( pCur->
2bf50 69 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20  iPage==0 ){.    
2bf60 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65      pCur->eState
2bf70 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49   = CURSOR_INVALI
2bf80 44 3b 0a 20 20 20 20 20 20 20 20 2a 70 52 65 73  D;.        *pRes
2bf90 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 72 65   = 1;.        re
2bfa0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2bfb0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 6f        }.      mo
2bfc0 76 65 54 6f 50 61 72 65 6e 74 28 70 43 75 72 29  veToParent(pCur)
2bfd0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
2bfe0 72 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  rt( pCur->info.n
2bff0 53 69 7a 65 3d 3d 30 20 29 3b 0a 20 20 20 20 61  Size==0 );.    a
2c000 73 73 65 72 74 28 20 28 70 43 75 72 2d 3e 63 75  ssert( (pCur->cu
2c010 72 46 6c 61 67 73 20 26 20 28 42 54 43 46 5f 56  rFlags & (BTCF_V
2c020 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56 61  alidNKey|BTCF_Va
2c030 6c 69 64 4f 76 66 6c 29 29 3d 3d 30 20 29 3b 0a  lidOvfl))==0 );.
2c040 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78  .    pCur->aiIdx
2c050 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 2d 3b  [pCur->iPage]--;
2c060 0a 20 20 20 20 70 50 61 67 65 20 3d 20 70 43 75  .    pPage = pCu
2c070 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
2c080 69 50 61 67 65 5d 3b 0a 20 20 20 20 69 66 28 20  iPage];.    if( 
2c090 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 26 26  pPage->intKey &&
2c0a0 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b   !pPage->leaf ){
2c0b0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
2c0c0 74 65 33 42 74 72 65 65 50 72 65 76 69 6f 75 73  te3BtreePrevious
2c0d0 28 70 43 75 72 2c 20 70 52 65 73 29 3b 0a 20 20  (pCur, pRes);.  
2c0e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
2c0f0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
2c100 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
2c110 6e 20 72 63 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69  n rc;.}.int sqli
2c120 74 65 33 42 74 72 65 65 50 72 65 76 69 6f 75 73  te3BtreePrevious
2c130 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
2c140 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 61   int *pRes){.  a
2c150 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
2c160 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
2c170 0a 20 20 61 73 73 65 72 74 28 20 70 52 65 73 21  .  assert( pRes!
2c180 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
2c190 2a 70 52 65 73 3d 3d 30 20 7c 7c 20 2a 70 52 65  *pRes==0 || *pRe
2c1a0 73 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74  s==1 );.  assert
2c1b0 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74  ( pCur->skipNext
2c1c0 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74  ==0 || pCur->eSt
2c1d0 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate!=CURSOR_VALI
2c1e0 44 20 29 3b 0a 20 20 2a 70 52 65 73 20 3d 20 30  D );.  *pRes = 0
2c1f0 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61  ;.  pCur->curFla
2c200 67 73 20 26 3d 20 7e 28 42 54 43 46 5f 41 74 4c  gs &= ~(BTCF_AtL
2c210 61 73 74 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76  ast|BTCF_ValidOv
2c220 66 6c 7c 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65  fl|BTCF_ValidNKe
2c230 79 29 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f  y);.  pCur->info
2c240 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 69 66  .nSize = 0;.  if
2c250 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d  ( pCur->eState!=
2c260 43 55 52 53 4f 52 5f 56 41 4c 49 44 0a 20 20 20  CURSOR_VALID.   
2c270 7c 7c 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70  || pCur->aiIdx[p
2c280 43 75 72 2d 3e 69 50 61 67 65 5d 3d 3d 30 0a 20  Cur->iPage]==0. 
2c290 20 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61 67    || pCur->apPag
2c2a0 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e  e[pCur->iPage]->
2c2b0 6c 65 61 66 3d 3d 30 0a 20 20 29 7b 0a 20 20 20  leaf==0.  ){.   
2c2c0 20 72 65 74 75 72 6e 20 62 74 72 65 65 50 72 65   return btreePre
2c2d0 76 69 6f 75 73 28 70 43 75 72 2c 20 70 52 65 73  vious(pCur, pRes
2c2e0 29 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 61  );.  }.  pCur->a
2c2f0 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
2c300 5d 2d 2d 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ]--;.  return SQ
2c310 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
2c320 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77  * Allocate a new
2c330 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 64   page from the d
2c340 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
2c350 0a 2a 2a 20 54 68 65 20 6e 65 77 20 70 61 67 65  .** The new page
2c360 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20 64 69   is marked as di
2c370 72 74 79 2e 20 20 28 49 6e 20 6f 74 68 65 72 20  rty.  (In other 
2c380 77 6f 72 64 73 2c 20 73 71 6c 69 74 65 33 50 61  words, sqlite3Pa
2c390 67 65 72 57 72 69 74 65 28 29 0a 2a 2a 20 68 61  gerWrite().** ha
2c3a0 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63  s already been c
2c3b0 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 6e 65 77  alled on the new
2c3c0 20 70 61 67 65 2e 29 20 20 54 68 65 20 6e 65 77   page.)  The new
2c3d0 20 70 61 67 65 20 68 61 73 20 61 6c 73 6f 0a 2a   page has also.*
2c3e0 2a 20 62 65 65 6e 20 72 65 66 65 72 65 6e 63 65  * been reference
2c3f0 64 20 61 6e 64 20 74 68 65 20 63 61 6c 6c 69 6e  d and the callin
2c400 67 20 72 6f 75 74 69 6e 65 20 69 73 20 72 65 73  g routine is res
2c410 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 63 61 6c  ponsible for cal
2c420 6c 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33 50  ling.** sqlite3P
2c430 61 67 65 72 55 6e 72 65 66 28 29 20 6f 6e 20 74  agerUnref() on t
2c440 68 65 20 6e 65 77 20 70 61 67 65 20 77 68 65 6e  he new page when
2c450 20 69 74 20 69 73 20 64 6f 6e 65 2e 0a 2a 2a 0a   it is done..**.
2c460 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  ** SQLITE_OK is 
2c470 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63 63  returned on succ
2c480 65 73 73 2e 20 20 41 6e 79 20 6f 74 68 65 72 20  ess.  Any other 
2c490 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 6e 64  return value ind
2c4a0 69 63 61 74 65 73 0a 2a 2a 20 61 6e 20 65 72 72  icates.** an err
2c4b0 6f 72 2e 20 20 2a 70 70 50 61 67 65 20 61 6e 64  or.  *ppPage and
2c4c0 20 2a 70 50 67 6e 6f 20 61 72 65 20 75 6e 64 65   *pPgno are unde
2c4d0 66 69 6e 65 64 20 69 6e 20 74 68 65 20 65 76 65  fined in the eve
2c4e0 6e 74 20 6f 66 20 61 6e 20 65 72 72 6f 72 2e 0a  nt of an error..
2c4f0 2a 2a 20 44 6f 20 6e 6f 74 20 69 6e 76 6f 6b 65  ** Do not invoke
2c500 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
2c510 65 66 28 29 20 6f 6e 20 2a 70 70 50 61 67 65 20  ef() on *ppPage 
2c520 69 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20 72  if an error is r
2c530 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  eturned..**.** I
2c540 66 20 74 68 65 20 22 6e 65 61 72 62 79 22 20 70  f the "nearby" p
2c550 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 74 20  arameter is not 
2c560 30 2c 20 74 68 65 6e 20 61 6e 20 65 66 66 6f 72  0, then an effor
2c570 74 20 69 73 20 6d 61 64 65 20 74 6f 20 0a 2a 2a  t is made to .**
2c580 20 6c 6f 63 61 74 65 20 61 20 70 61 67 65 20 63   locate a page c
2c590 6c 6f 73 65 20 74 6f 20 74 68 65 20 70 61 67 65  lose to the page
2c5a0 20 6e 75 6d 62 65 72 20 22 6e 65 61 72 62 79 22   number "nearby"
2c5b0 2e 20 20 54 68 69 73 20 63 61 6e 20 62 65 20 75  .  This can be u
2c5c0 73 65 64 20 69 6e 20 61 6e 0a 2a 2a 20 61 74 74  sed in an.** att
2c5d0 65 6d 70 74 20 74 6f 20 6b 65 65 70 20 72 65 6c  empt to keep rel
2c5e0 61 74 65 64 20 70 61 67 65 73 20 63 6c 6f 73 65  ated pages close
2c5f0 20 74 6f 20 65 61 63 68 20 6f 74 68 65 72 20 69   to each other i
2c600 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
2c610 69 6c 65 2c 0a 2a 2a 20 77 68 69 63 68 20 69 6e  ile,.** which in
2c620 20 74 75 72 6e 20 63 61 6e 20 6d 61 6b 65 20 64   turn can make d
2c630 61 74 61 62 61 73 65 20 61 63 63 65 73 73 20 66  atabase access f
2c640 61 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  aster..**.** If 
2c650 74 68 65 20 65 4d 6f 64 65 20 70 61 72 61 6d 65  the eMode parame
2c660 74 65 72 20 69 73 20 42 54 41 4c 4c 4f 43 5f 45  ter is BTALLOC_E
2c670 58 41 43 54 20 61 6e 64 20 74 68 65 20 6e 65 61  XACT and the nea
2c680 72 62 79 20 70 61 67 65 20 65 78 69 73 74 73 0a  rby page exists.
2c690 2a 2a 20 61 6e 79 77 68 65 72 65 20 6f 6e 20 74  ** anywhere on t
2c6a0 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 20 74 68  he free-list, th
2c6b0 65 6e 20 69 74 20 69 73 20 67 75 61 72 61 6e 74  en it is guarant
2c6c0 65 65 64 20 74 6f 20 62 65 20 72 65 74 75 72 6e  eed to be return
2c6d0 65 64 2e 20 20 49 66 0a 2a 2a 20 65 4d 6f 64 65  ed.  If.** eMode
2c6e0 20 69 73 20 42 54 41 4c 4c 4f 43 5f 4c 54 20 74   is BTALLOC_LT t
2c6f0 68 65 6e 20 74 68 65 20 70 61 67 65 20 72 65 74  hen the page ret
2c700 75 72 6e 65 64 20 77 69 6c 6c 20 62 65 20 6c 65  urned will be le
2c710 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  ss than or equal
2c720 0a 2a 2a 20 74 6f 20 6e 65 61 72 62 79 20 69 66  .** to nearby if
2c730 20 61 6e 79 20 73 75 63 68 20 70 61 67 65 20 65   any such page e
2c740 78 69 73 74 73 2e 20 20 49 66 20 65 4d 6f 64 65  xists.  If eMode
2c750 20 69 73 20 42 54 41 4c 4c 4f 43 5f 41 4e 59 20   is BTALLOC_ANY 
2c760 74 68 65 6e 20 74 68 65 72 65 0a 2a 2a 20 61 72  then there.** ar
2c770 65 20 6e 6f 20 72 65 73 74 72 69 63 74 69 6f 6e  e no restriction
2c780 73 20 6f 6e 20 77 68 69 63 68 20 70 61 67 65 20  s on which page 
2c790 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
2c7a0 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63  static int alloc
2c7b0 61 74 65 42 74 72 65 65 50 61 67 65 28 0a 20 20  ateBtreePage(.  
2c7c0 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20  BtShared *pBt,  
2c7d0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74         /* The bt
2c7e0 72 65 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  ree */.  MemPage
2c7f0 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 20 20   **ppPage,      
2c800 2f 2a 20 53 74 6f 72 65 20 70 6f 69 6e 74 65 72  /* Store pointer
2c810 20 74 6f 20 74 68 65 20 61 6c 6c 6f 63 61 74 65   to the allocate
2c820 64 20 70 61 67 65 20 68 65 72 65 20 2a 2f 0a 20  d page here */. 
2c830 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 2c 20 20 20   Pgno *pPgno,   
2c840 20 20 20 20 20 20 20 20 2f 2a 20 53 74 6f 72 65          /* Store
2c850 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
2c860 20 68 65 72 65 20 2a 2f 0a 20 20 50 67 6e 6f 20   here */.  Pgno 
2c870 6e 65 61 72 62 79 2c 20 20 20 20 20 20 20 20 20  nearby,         
2c880 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20    /* Search for 
2c890 61 20 70 61 67 65 20 6e 65 61 72 20 74 68 69 73  a page near this
2c8a0 20 6f 6e 65 20 2a 2f 0a 20 20 75 38 20 65 4d 6f   one */.  u8 eMo
2c8b0 64 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  de              
2c8c0 20 2f 2a 20 42 54 41 4c 4c 4f 43 5f 45 58 41 43   /* BTALLOC_EXAC
2c8d0 54 2c 20 42 54 41 4c 4c 4f 43 5f 4c 54 2c 20 6f  T, BTALLOC_LT, o
2c8e0 72 20 42 54 41 4c 4c 4f 43 5f 41 4e 59 20 2a 2f  r BTALLOC_ANY */
2c8f0 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  .){.  MemPage *p
2c900 50 61 67 65 31 3b 0a 20 20 69 6e 74 20 72 63 3b  Page1;.  int rc;
2c910 0a 20 20 75 33 32 20 6e 3b 20 20 20 20 20 2f 2a  .  u32 n;     /*
2c920 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
2c930 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74   on the freelist
2c940 20 2a 2f 0a 20 20 75 33 32 20 6b 3b 20 20 20 20   */.  u32 k;    
2c950 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65   /* Number of le
2c960 61 76 65 73 20 6f 6e 20 74 68 65 20 74 72 75 6e  aves on the trun
2c970 6b 20 6f 66 20 74 68 65 20 66 72 65 65 6c 69 73  k of the freelis
2c980 74 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  t */.  MemPage *
2c990 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 4d 65  pTrunk = 0;.  Me
2c9a0 6d 50 61 67 65 20 2a 70 50 72 65 76 54 72 75 6e  mPage *pPrevTrun
2c9b0 6b 20 3d 20 30 3b 0a 20 20 50 67 6e 6f 20 6d 78  k = 0;.  Pgno mx
2c9c0 50 61 67 65 3b 20 20 20 20 20 2f 2a 20 54 6f 74  Page;     /* Tot
2c9d0 61 6c 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64  al size of the d
2c9e0 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
2c9f0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
2ca00 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
2ca10 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
2ca20 73 73 65 72 74 28 20 65 4d 6f 64 65 3d 3d 42 54  ssert( eMode==BT
2ca30 41 4c 4c 4f 43 5f 41 4e 59 20 7c 7c 20 28 6e 65  ALLOC_ANY || (ne
2ca40 61 72 62 79 3e 30 20 26 26 20 49 66 4e 6f 74 4f  arby>0 && IfNotO
2ca50 6d 69 74 41 56 28 70 42 74 2d 3e 61 75 74 6f 56  mitAV(pBt->autoV
2ca60 61 63 75 75 6d 29 29 20 29 3b 0a 20 20 70 50 61  acuum)) );.  pPa
2ca70 67 65 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65  ge1 = pBt->pPage
2ca80 31 3b 0a 20 20 6d 78 50 61 67 65 20 3d 20 62 74  1;.  mxPage = bt
2ca90 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74  reePagecount(pBt
2caa0 29 3b 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43 45  );.  /* EVIDENCE
2cab0 2d 4f 46 3a 20 52 2d 30 35 31 31 39 2d 30 32 36  -OF: R-05119-026
2cac0 33 37 20 54 68 65 20 34 2d 62 79 74 65 20 62 69  37 The 4-byte bi
2cad0 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72  g-endian integer
2cae0 20 61 74 20 6f 66 66 73 65 74 20 33 36 0a 20 20   at offset 36.  
2caf0 2a 2a 20 73 74 6f 72 65 73 20 73 74 6f 72 65 73  ** stores stores
2cb00 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65   the total numbe
2cb10 72 20 6f 66 20 70 61 67 65 73 20 6f 6e 20 74 68  r of pages on th
2cb20 65 20 66 72 65 65 6c 69 73 74 2e 20 2a 2f 0a 20  e freelist. */. 
2cb30 20 6e 20 3d 20 67 65 74 34 62 79 74 65 28 26 70   n = get4byte(&p
2cb40 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d  Page1->aData[36]
2cb50 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e  );.  testcase( n
2cb60 3d 3d 6d 78 50 61 67 65 2d 31 20 29 3b 0a 20 20  ==mxPage-1 );.  
2cb70 69 66 28 20 6e 3e 3d 6d 78 50 61 67 65 20 29 7b  if( n>=mxPage ){
2cb80 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
2cb90 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
2cba0 0a 20 20 7d 0a 20 20 69 66 28 20 6e 3e 30 20 29  .  }.  if( n>0 )
2cbb0 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72 65 20 61  {.    /* There a
2cbc0 72 65 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20  re pages on the 
2cbd0 66 72 65 65 6c 69 73 74 2e 20 20 52 65 75 73 65  freelist.  Reuse
2cbe0 20 6f 6e 65 20 6f 66 20 74 68 6f 73 65 20 70 61   one of those pa
2cbf0 67 65 73 2e 20 2a 2f 0a 20 20 20 20 50 67 6e 6f  ges. */.    Pgno
2cc00 20 69 54 72 75 6e 6b 3b 0a 20 20 20 20 75 38 20   iTrunk;.    u8 
2cc10 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b 20  searchList = 0; 
2cc20 2f 2a 20 49 66 20 74 68 65 20 66 72 65 65 2d 6c  /* If the free-l
2cc30 69 73 74 20 6d 75 73 74 20 62 65 20 73 65 61 72  ist must be sear
2cc40 63 68 65 64 20 66 6f 72 20 27 6e 65 61 72 62 79  ched for 'nearby
2cc50 27 20 2a 2f 0a 20 20 20 20 0a 20 20 20 20 2f 2a  ' */.    .    /*
2cc60 20 49 66 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c   If eMode==BTALL
2cc70 4f 43 5f 45 58 41 43 54 20 61 6e 64 20 61 20 71  OC_EXACT and a q
2cc80 75 65 72 79 20 6f 66 20 74 68 65 20 70 6f 69 6e  uery of the poin
2cc90 74 65 72 2d 6d 61 70 0a 20 20 20 20 2a 2a 20 73  ter-map.    ** s
2cca0 68 6f 77 73 20 74 68 61 74 20 74 68 65 20 70 61  hows that the pa
2ccb0 67 65 20 27 6e 65 61 72 62 79 27 20 69 73 20 73  ge 'nearby' is s
2ccc0 6f 6d 65 77 68 65 72 65 20 6f 6e 20 74 68 65 20  omewhere on the 
2ccd0 66 72 65 65 2d 6c 69 73 74 2c 20 74 68 65 6e 0a  free-list, then.
2cce0 20 20 20 20 2a 2a 20 74 68 65 20 65 6e 74 69 72      ** the entir
2ccf0 65 2d 6c 69 73 74 20 77 69 6c 6c 20 62 65 20 73  e-list will be s
2cd00 65 61 72 63 68 65 64 20 66 6f 72 20 74 68 61 74  earched for that
2cd10 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 23 69   page..    */.#i
2cd20 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2cd30 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
2cd40 20 69 66 28 20 65 4d 6f 64 65 3d 3d 42 54 41 4c   if( eMode==BTAL
2cd50 4c 4f 43 5f 45 58 41 43 54 20 29 7b 0a 20 20 20  LOC_EXACT ){.   
2cd60 20 20 20 69 66 28 20 6e 65 61 72 62 79 3c 3d 6d     if( nearby<=m
2cd70 78 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20  xPage ){.       
2cd80 20 75 38 20 65 54 79 70 65 3b 0a 20 20 20 20 20   u8 eType;.     
2cd90 20 20 20 61 73 73 65 72 74 28 20 6e 65 61 72 62     assert( nearb
2cda0 79 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 61  y>0 );.        a
2cdb0 73 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f  ssert( pBt->auto
2cdc0 56 61 63 75 75 6d 20 29 3b 0a 20 20 20 20 20 20  Vacuum );.      
2cdd0 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74    rc = ptrmapGet
2cde0 28 70 42 74 2c 20 6e 65 61 72 62 79 2c 20 26 65  (pBt, nearby, &e
2cdf0 54 79 70 65 2c 20 30 29 3b 0a 20 20 20 20 20 20  Type, 0);.      
2ce00 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
2ce10 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 69 66  n rc;.        if
2ce20 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  ( eType==PTRMAP_
2ce30 46 52 45 45 50 41 47 45 20 29 7b 0a 20 20 20 20  FREEPAGE ){.    
2ce40 20 20 20 20 20 20 73 65 61 72 63 68 4c 69 73 74        searchList
2ce50 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 1;.        }.
2ce60 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
2ce70 65 20 69 66 28 20 65 4d 6f 64 65 3d 3d 42 54 41  e if( eMode==BTA
2ce80 4c 4c 4f 43 5f 4c 45 20 29 7b 0a 20 20 20 20 20  LLOC_LE ){.     
2ce90 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20 31 3b   searchList = 1;
2cea0 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  .    }.#endif.. 
2ceb0 20 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20     /* Decrement 
2cec0 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 63 6f  the free-list co
2ced0 75 6e 74 20 62 79 20 31 2e 20 53 65 74 20 69 54  unt by 1. Set iT
2cee0 72 75 6e 6b 20 74 6f 20 74 68 65 20 69 6e 64 65  runk to the inde
2cef0 78 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20  x of the.    ** 
2cf00 66 69 72 73 74 20 66 72 65 65 2d 6c 69 73 74 20  first free-list 
2cf10 74 72 75 6e 6b 20 70 61 67 65 2e 20 69 50 72 65  trunk page. iPre
2cf20 76 54 72 75 6e 6b 20 69 73 20 69 6e 69 74 69 61  vTrunk is initia
2cf30 6c 6c 79 20 31 2e 0a 20 20 20 20 2a 2f 0a 20 20  lly 1..    */.  
2cf40 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
2cf50 67 65 72 57 72 69 74 65 28 70 50 61 67 65 31 2d  gerWrite(pPage1-
2cf60 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69  >pDbPage);.    i
2cf70 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
2cf80 63 3b 0a 20 20 20 20 70 75 74 34 62 79 74 65 28  c;.    put4byte(
2cf90 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
2cfa0 36 5d 2c 20 6e 2d 31 29 3b 0a 0a 20 20 20 20 2f  6], n-1);..    /
2cfb0 2a 20 54 68 65 20 63 6f 64 65 20 77 69 74 68 69  * The code withi
2cfc0 6e 20 74 68 69 73 20 6c 6f 6f 70 20 69 73 20 72  n this loop is r
2cfd0 75 6e 20 6f 6e 6c 79 20 6f 6e 63 65 20 69 66 20  un only once if 
2cfe0 74 68 65 20 27 73 65 61 72 63 68 4c 69 73 74 27  the 'searchList'
2cff0 20 76 61 72 69 61 62 6c 65 0a 20 20 20 20 2a 2a   variable.    **
2d000 20 69 73 20 6e 6f 74 20 74 72 75 65 2e 20 4f 74   is not true. Ot
2d010 68 65 72 77 69 73 65 2c 20 69 74 20 72 75 6e 73  herwise, it runs
2d020 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 74   once for each t
2d030 72 75 6e 6b 2d 70 61 67 65 20 6f 6e 20 74 68 65  runk-page on the
2d040 0a 20 20 20 20 2a 2a 20 66 72 65 65 2d 6c 69 73  .    ** free-lis
2d050 74 20 75 6e 74 69 6c 20 74 68 65 20 70 61 67 65  t until the page
2d060 20 27 6e 65 61 72 62 79 27 20 69 73 20 6c 6f 63   'nearby' is loc
2d070 61 74 65 64 20 28 65 4d 6f 64 65 3d 3d 42 54 41  ated (eMode==BTA
2d080 4c 4c 4f 43 5f 45 58 41 43 54 29 0a 20 20 20 20  LLOC_EXACT).    
2d090 2a 2a 20 6f 72 20 75 6e 74 69 6c 20 61 20 70 61  ** or until a pa
2d0a0 67 65 20 6c 65 73 73 20 74 68 61 6e 20 27 6e 65  ge less than 'ne
2d0b0 61 72 62 79 27 20 69 73 20 6c 6f 63 61 74 65 64  arby' is located
2d0c0 20 28 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43   (eMode==BTALLOC
2d0d0 5f 4c 54 29 0a 20 20 20 20 2a 2f 0a 20 20 20 20  _LT).    */.    
2d0e0 64 6f 20 7b 0a 20 20 20 20 20 20 70 50 72 65 76  do {.      pPrev
2d0f0 54 72 75 6e 6b 20 3d 20 70 54 72 75 6e 6b 3b 0a  Trunk = pTrunk;.
2d100 20 20 20 20 20 20 69 66 28 20 70 50 72 65 76 54        if( pPrevT
2d110 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20  runk ){.        
2d120 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
2d130 52 2d 30 31 35 30 36 2d 31 31 30 35 33 20 54 68  R-01506-11053 Th
2d140 65 20 66 69 72 73 74 20 69 6e 74 65 67 65 72 20  e first integer 
2d150 6f 6e 20 61 20 66 72 65 65 6c 69 73 74 20 74 72  on a freelist tr
2d160 75 6e 6b 20 70 61 67 65 0a 20 20 20 20 20 20 20  unk page.       
2d170 20 2a 2a 20 69 73 20 74 68 65 20 70 61 67 65 20   ** is the page 
2d180 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65  number of the ne
2d190 78 74 20 66 72 65 65 6c 69 73 74 20 74 72 75 6e  xt freelist trun
2d1a0 6b 20 70 61 67 65 20 69 6e 20 74 68 65 20 6c 69  k page in the li
2d1b0 73 74 20 6f 72 0a 20 20 20 20 20 20 20 20 2a 2a  st or.        **
2d1c0 20 7a 65 72 6f 20 69 66 20 74 68 69 73 20 69 73   zero if this is
2d1d0 20 74 68 65 20 6c 61 73 74 20 66 72 65 65 6c 69   the last freeli
2d1e0 73 74 20 74 72 75 6e 6b 20 70 61 67 65 2e 20 2a  st trunk page. *
2d1f0 2f 0a 20 20 20 20 20 20 20 20 69 54 72 75 6e 6b  /.        iTrunk
2d200 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 72   = get4byte(&pPr
2d210 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30  evTrunk->aData[0
2d220 5d 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ]);.      }else{
2d230 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 56 49 44  .        /* EVID
2d240 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 39 38 34 31  ENCE-OF: R-59841
2d250 2d 31 33 37 39 38 20 54 68 65 20 34 2d 62 79 74  -13798 The 4-byt
2d260 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74  e big-endian int
2d270 65 67 65 72 20 61 74 20 6f 66 66 73 65 74 20 33  eger at offset 3
2d280 32 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 74 6f  2.        ** sto
2d290 72 65 73 20 74 68 65 20 70 61 67 65 20 6e 75 6d  res the page num
2d2a0 62 65 72 20 6f 66 20 74 68 65 20 66 69 72 73 74  ber of the first
2d2b0 20 70 61 67 65 20 6f 66 20 74 68 65 20 66 72 65   page of the fre
2d2c0 65 6c 69 73 74 2c 20 6f 72 20 7a 65 72 6f 20 69  elist, or zero i
2d2d0 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  f.        ** the
2d2e0 20 66 72 65 65 6c 69 73 74 20 69 73 20 65 6d 70   freelist is emp
2d2f0 74 79 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  ty. */.        i
2d300 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65  Trunk = get4byte
2d310 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
2d320 33 32 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  32]);.      }.  
2d330 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 54      testcase( iT
2d340 72 75 6e 6b 3d 3d 6d 78 50 61 67 65 20 29 3b 0a  runk==mxPage );.
2d350 20 20 20 20 20 20 69 66 28 20 69 54 72 75 6e 6b        if( iTrunk
2d360 3e 6d 78 50 61 67 65 20 29 7b 0a 20 20 20 20 20  >mxPage ){.     
2d370 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
2d380 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
2d390 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2d3a0 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50    rc = btreeGetP
2d3b0 61 67 65 28 70 42 74 2c 20 69 54 72 75 6e 6b 2c  age(pBt, iTrunk,
2d3c0 20 26 70 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20   &pTrunk, 0);.  
2d3d0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
2d3e0 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 70 54  rc ){.        pT
2d3f0 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20  runk = 0;.      
2d400 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63    goto end_alloc
2d410 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20  ate_page;.      
2d420 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
2d430 70 54 72 75 6e 6b 21 3d 30 20 29 3b 0a 20 20 20  pTrunk!=0 );.   
2d440 20 20 20 61 73 73 65 72 74 28 20 70 54 72 75 6e     assert( pTrun
2d450 6b 2d 3e 61 44 61 74 61 21 3d 30 20 29 3b 0a 20  k->aData!=0 );. 
2d460 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45       /* EVIDENCE
2d470 2d 4f 46 3a 20 52 2d 31 33 35 32 33 2d 30 34 33  -OF: R-13523-043
2d480 39 34 20 54 68 65 20 73 65 63 6f 6e 64 20 69 6e  94 The second in
2d490 74 65 67 65 72 20 6f 6e 20 61 20 66 72 65 65 6c  teger on a freel
2d4a0 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 0a 20  ist trunk page. 
2d4b0 20 20 20 20 20 2a 2a 20 69 73 20 74 68 65 20 6e       ** is the n
2d4c0 75 6d 62 65 72 20 6f 66 20 6c 65 61 66 20 70 61  umber of leaf pa
2d4d0 67 65 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 66  ge pointers to f
2d4e0 6f 6c 6c 6f 77 2e 20 2a 2f 0a 20 20 20 20 20 20  ollow. */.      
2d4f0 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 54  k = get4byte(&pT
2d500 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 29 3b  runk->aData[4]);
2d510 0a 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 30 20  .      if( k==0 
2d520 26 26 20 21 73 65 61 72 63 68 4c 69 73 74 20 29  && !searchList )
2d530 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  {.        /* The
2d540 20 74 72 75 6e 6b 20 68 61 73 20 6e 6f 20 6c 65   trunk has no le
2d550 61 76 65 73 20 61 6e 64 20 74 68 65 20 6c 69 73  aves and the lis
2d560 74 20 69 73 20 6e 6f 74 20 62 65 69 6e 67 20 73  t is not being s
2d570 65 61 72 63 68 65 64 2e 20 0a 20 20 20 20 20 20  earched. .      
2d580 20 20 2a 2a 20 53 6f 20 65 78 74 72 61 63 74 20    ** So extract 
2d590 74 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20 69  the trunk page i
2d5a0 74 73 65 6c 66 20 61 6e 64 20 75 73 65 20 69 74  tself and use it
2d5b0 20 61 73 20 74 68 65 20 6e 65 77 6c 79 20 0a 20   as the newly . 
2d5c0 20 20 20 20 20 20 20 2a 2a 20 61 6c 6c 6f 63 61         ** alloca
2d5d0 74 65 64 20 70 61 67 65 20 2a 2f 0a 20 20 20 20  ted page */.    
2d5e0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 72 65      assert( pPre
2d5f0 76 54 72 75 6e 6b 3d 3d 30 20 29 3b 0a 20 20 20  vTrunk==0 );.   
2d600 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
2d610 33 50 61 67 65 72 57 72 69 74 65 28 70 54 72 75  3PagerWrite(pTru
2d620 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  nk->pDbPage);.  
2d630 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
2d640 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
2d650 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65  nd_allocate_page
2d660 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2d670 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 69 54 72      *pPgno = iTr
2d680 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d  unk;.        mem
2d690 63 70 79 28 26 70 50 61 67 65 31 2d 3e 61 44 61  cpy(&pPage1->aDa
2d6a0 74 61 5b 33 32 5d 2c 20 26 70 54 72 75 6e 6b 2d  ta[32], &pTrunk-
2d6b0 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20  >aData[0], 4);. 
2d6c0 20 20 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d         *ppPage =
2d6d0 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20   pTrunk;.       
2d6e0 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20   pTrunk = 0;.   
2d6f0 20 20 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c       TRACE(("ALL
2d700 4f 43 41 54 45 3a 20 25 64 20 74 72 75 6e 6b 20  OCATE: %d trunk 
2d710 2d 20 25 64 20 66 72 65 65 20 70 61 67 65 73 20  - %d free pages 
2d720 6c 65 66 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f 2c  left\n", *pPgno,
2d730 20 6e 2d 31 29 29 3b 0a 20 20 20 20 20 20 7d 65   n-1));.      }e
2d740 6c 73 65 20 69 66 28 20 6b 3e 28 75 33 32 29 28  lse if( k>(u32)(
2d750 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f  pBt->usableSize/
2d760 34 20 2d 20 32 29 20 29 7b 0a 20 20 20 20 20 20  4 - 2) ){.      
2d770 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20 6b 20    /* Value of k 
2d780 69 73 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e  is out of range.
2d790 20 20 44 61 74 61 62 61 73 65 20 63 6f 72 72 75    Database corru
2d7a0 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20  ption */.       
2d7b0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
2d7c0 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
2d7d0 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f     goto end_allo
2d7e0 63 61 74 65 5f 70 61 67 65 3b 0a 23 69 66 6e 64  cate_page;.#ifnd
2d7f0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
2d800 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20  UTOVACUUM.      
2d810 7d 65 6c 73 65 20 69 66 28 20 73 65 61 72 63 68  }else if( search
2d820 4c 69 73 74 20 0a 20 20 20 20 20 20 20 20 20 20  List .          
2d830 20 20 26 26 20 28 6e 65 61 72 62 79 3d 3d 69 54    && (nearby==iT
2d840 72 75 6e 6b 20 7c 7c 20 28 69 54 72 75 6e 6b 3c  runk || (iTrunk<
2d850 6e 65 61 72 62 79 20 26 26 20 65 4d 6f 64 65 3d  nearby && eMode=
2d860 3d 42 54 41 4c 4c 4f 43 5f 4c 45 29 29 20 0a 20  =BTALLOC_LE)) . 
2d870 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
2d880 2f 2a 20 54 68 65 20 6c 69 73 74 20 69 73 20 62  /* The list is b
2d890 65 69 6e 67 20 73 65 61 72 63 68 65 64 20 61 6e  eing searched an
2d8a0 64 20 74 68 69 73 20 74 72 75 6e 6b 20 70 61 67  d this trunk pag
2d8b0 65 20 69 73 20 74 68 65 20 70 61 67 65 0a 20 20  e is the page.  
2d8c0 20 20 20 20 20 20 2a 2a 20 74 6f 20 61 6c 6c 6f        ** to allo
2d8d0 63 61 74 65 2c 20 72 65 67 61 72 64 6c 65 73 73  cate, regardless
2d8e0 20 6f 66 20 77 68 65 74 68 65 72 20 69 74 20 68   of whether it h
2d8f0 61 73 20 6c 65 61 76 65 73 2e 0a 20 20 20 20 20  as leaves..     
2d900 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 2a 70     */.        *p
2d910 50 67 6e 6f 20 3d 20 69 54 72 75 6e 6b 3b 0a 20  Pgno = iTrunk;. 
2d920 20 20 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d         *ppPage =
2d930 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20   pTrunk;.       
2d940 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b   searchList = 0;
2d950 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
2d960 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
2d970 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29  pTrunk->pDbPage)
2d980 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
2d990 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f   ){.          go
2d9a0 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
2d9b0 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  page;.        }.
2d9c0 20 20 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 30          if( k==0
2d9d0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
2d9e0 28 20 21 70 50 72 65 76 54 72 75 6e 6b 20 29 7b  ( !pPrevTrunk ){
2d9f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d  .            mem
2da00 63 70 79 28 26 70 50 61 67 65 31 2d 3e 61 44 61  cpy(&pPage1->aDa
2da10 74 61 5b 33 32 5d 2c 20 26 70 54 72 75 6e 6b 2d  ta[32], &pTrunk-
2da20 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20  >aData[0], 4);. 
2da30 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
2da40 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
2da50 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
2da60 74 65 28 70 50 72 65 76 54 72 75 6e 6b 2d 3e 70  te(pPrevTrunk->p
2da70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
2da80 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
2da90 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2daa0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
2dab0 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
2dac0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
2dad0 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
2dae0 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44  (&pPrevTrunk->aD
2daf0 61 74 61 5b 30 5d 2c 20 26 70 54 72 75 6e 6b 2d  ata[0], &pTrunk-
2db00 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20  >aData[0], 4);. 
2db10 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2db20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2db30 20 20 20 20 2f 2a 20 54 68 65 20 74 72 75 6e 6b      /* The trunk
2db40 20 70 61 67 65 20 69 73 20 72 65 71 75 69 72 65   page is require
2db50 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20  d by the caller 
2db60 62 75 74 20 69 74 20 63 6f 6e 74 61 69 6e 73 20  but it contains 
2db70 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 6f  .          ** po
2db80 69 6e 74 65 72 73 20 74 6f 20 66 72 65 65 2d 6c  inters to free-l
2db90 69 73 74 20 6c 65 61 76 65 73 2e 20 54 68 65 20  ist leaves. The 
2dba0 66 69 72 73 74 20 6c 65 61 66 20 62 65 63 6f 6d  first leaf becom
2dbb0 65 73 20 61 20 74 72 75 6e 6b 0a 20 20 20 20 20  es a trunk.     
2dbc0 20 20 20 20 20 2a 2a 20 70 61 67 65 20 69 6e 20       ** page in 
2dbd0 74 68 69 73 20 63 61 73 65 2e 0a 20 20 20 20 20  this case..     
2dbe0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
2dbf0 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 54    MemPage *pNewT
2dc00 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  runk;.          
2dc10 50 67 6e 6f 20 69 4e 65 77 54 72 75 6e 6b 20 3d  Pgno iNewTrunk =
2dc20 20 67 65 74 34 62 79 74 65 28 26 70 54 72 75 6e   get4byte(&pTrun
2dc30 6b 2d 3e 61 44 61 74 61 5b 38 5d 29 3b 0a 20 20  k->aData[8]);.  
2dc40 20 20 20 20 20 20 20 20 69 66 28 20 69 4e 65 77          if( iNew
2dc50 54 72 75 6e 6b 3e 6d 78 50 61 67 65 20 29 7b 20  Trunk>mxPage ){ 
2dc60 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
2dc70 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
2dc80 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20  _BKPT;.         
2dc90 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f     goto end_allo
2dca0 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20  cate_page;.     
2dcb0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2dcc0 20 74 65 73 74 63 61 73 65 28 20 69 4e 65 77 54   testcase( iNewT
2dcd0 72 75 6e 6b 3d 3d 6d 78 50 61 67 65 20 29 3b 0a  runk==mxPage );.
2dce0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 62            rc = b
2dcf0 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
2dd00 20 69 4e 65 77 54 72 75 6e 6b 2c 20 26 70 4e 65   iNewTrunk, &pNe
2dd10 77 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20  wTrunk, 0);.    
2dd20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
2dd30 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2dd40 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
2dd50 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20  allocate_page;. 
2dd60 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2dd70 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
2dd80 33 50 61 67 65 72 57 72 69 74 65 28 70 4e 65 77  3PagerWrite(pNew
2dd90 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b  Trunk->pDbPage);
2dda0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
2ddb0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2ddc0 20 20 20 20 20 20 20 20 20 20 20 20 72 65 6c 65              rele
2ddd0 61 73 65 50 61 67 65 28 70 4e 65 77 54 72 75 6e  asePage(pNewTrun
2dde0 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  k);.            
2ddf0 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
2de00 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20  e_page;.        
2de10 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 6d 65    }.          me
2de20 6d 63 70 79 28 26 70 4e 65 77 54 72 75 6e 6b 2d  mcpy(&pNewTrunk-
2de30 3e 61 44 61 74 61 5b 30 5d 2c 20 26 70 54 72 75  >aData[0], &pTru
2de40 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29  nk->aData[0], 4)
2de50 3b 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 34  ;.          put4
2de60 62 79 74 65 28 26 70 4e 65 77 54 72 75 6e 6b 2d  byte(&pNewTrunk-
2de70 3e 61 44 61 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b  >aData[4], k-1);
2de80 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70  .          memcp
2de90 79 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44  y(&pNewTrunk->aD
2dea0 61 74 61 5b 38 5d 2c 20 26 70 54 72 75 6e 6b 2d  ata[8], &pTrunk-
2deb0 3e 61 44 61 74 61 5b 31 32 5d 2c 20 28 6b 2d 31  >aData[12], (k-1
2dec0 29 2a 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20  )*4);.          
2ded0 72 65 6c 65 61 73 65 50 61 67 65 28 70 4e 65 77  releasePage(pNew
2dee0 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20  Trunk);.        
2def0 20 20 69 66 28 20 21 70 50 72 65 76 54 72 75 6e    if( !pPrevTrun
2df00 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  k ){.           
2df10 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
2df20 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
2df30 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65  (pPage1->pDbPage
2df40 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ) );.           
2df50 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65   put4byte(&pPage
2df60 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 69 4e  1->aData[32], iN
2df70 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20  ewTrunk);.      
2df80 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2df90 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
2dfa0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
2dfb0 72 65 76 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67  revTrunk->pDbPag
2dfc0 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
2dfd0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
2dfe0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
2dff0 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
2e000 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
2e010 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79            put4by
2e020 74 65 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e  te(&pPrevTrunk->
2e030 61 44 61 74 61 5b 30 5d 2c 20 69 4e 65 77 54 72  aData[0], iNewTr
2e040 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20  unk);.          
2e050 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
2e060 20 20 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a      pTrunk = 0;.
2e070 20 20 20 20 20 20 20 20 54 52 41 43 45 28 28 22          TRACE(("
2e080 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 74 72 75  ALLOCATE: %d tru
2e090 6e 6b 20 2d 20 25 64 20 66 72 65 65 20 70 61 67  nk - %d free pag
2e0a0 65 73 20 6c 65 66 74 5c 6e 22 2c 20 2a 70 50 67  es left\n", *pPg
2e0b0 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 23 65 6e 64 69  no, n-1));.#endi
2e0c0 66 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  f.      }else if
2e0d0 28 20 6b 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  ( k>0 ){.       
2e0e0 20 2f 2a 20 45 78 74 72 61 63 74 20 61 20 6c 65   /* Extract a le
2e0f0 61 66 20 66 72 6f 6d 20 74 68 65 20 74 72 75 6e  af from the trun
2e100 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20 75 33 32  k */.        u32
2e110 20 63 6c 6f 73 65 73 74 3b 0a 20 20 20 20 20 20   closest;.      
2e120 20 20 50 67 6e 6f 20 69 50 61 67 65 3b 0a 20 20    Pgno iPage;.  
2e130 20 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63        unsigned c
2e140 68 61 72 20 2a 61 44 61 74 61 20 3d 20 70 54 72  har *aData = pTr
2e150 75 6e 6b 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20  unk->aData;.    
2e160 20 20 20 20 69 66 28 20 6e 65 61 72 62 79 3e 30      if( nearby>0
2e170 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 33   ){.          u3
2e180 32 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20 63  2 i;.          c
2e190 6c 6f 73 65 73 74 20 3d 20 30 3b 0a 20 20 20 20  losest = 0;.    
2e1a0 20 20 20 20 20 20 69 66 28 20 65 4d 6f 64 65 3d        if( eMode=
2e1b0 3d 42 54 41 4c 4c 4f 43 5f 4c 45 20 29 7b 0a 20  =BTALLOC_LE ){. 
2e1c0 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69             for(i
2e1d0 3d 30 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20  =0; i<k; i++){. 
2e1e0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 50 61               iPa
2e1f0 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 61  ge = get4byte(&a
2e200 44 61 74 61 5b 38 2b 69 2a 34 5d 29 3b 0a 20 20  Data[8+i*4]);.  
2e210 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
2e220 69 50 61 67 65 3c 3d 6e 65 61 72 62 79 20 29 7b  iPage<=nearby ){
2e230 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2e240 20 63 6c 6f 73 65 73 74 20 3d 20 69 3b 0a 20 20   closest = i;.  
2e250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72                br
2e260 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  eak;.           
2e270 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
2e280 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c   }.          }el
2e290 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
2e2a0 69 6e 74 20 64 69 73 74 3b 0a 20 20 20 20 20 20  int dist;.      
2e2b0 20 20 20 20 20 20 64 69 73 74 20 3d 20 73 71 6c        dist = sql
2e2c0 69 74 65 33 41 62 73 49 6e 74 33 32 28 67 65 74  ite3AbsInt32(get
2e2d0 34 62 79 74 65 28 26 61 44 61 74 61 5b 38 5d 29  4byte(&aData[8])
2e2e0 20 2d 20 6e 65 61 72 62 79 29 3b 0a 20 20 20 20   - nearby);.    
2e2f0 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 31 3b          for(i=1;
2e300 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20   i<k; i++){.    
2e310 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 64 32            int d2
2e320 20 3d 20 73 71 6c 69 74 65 33 41 62 73 49 6e 74   = sqlite3AbsInt
2e330 33 32 28 67 65 74 34 62 79 74 65 28 26 61 44 61  32(get4byte(&aDa
2e340 74 61 5b 38 2b 69 2a 34 5d 29 20 2d 20 6e 65 61  ta[8+i*4]) - nea
2e350 72 62 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20  rby);.          
2e360 20 20 20 20 69 66 28 20 64 32 3c 64 69 73 74 20      if( d2<dist 
2e370 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
2e380 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 69 3b 0a     closest = i;.
2e390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e3a0 64 69 73 74 20 3d 20 64 32 3b 0a 20 20 20 20 20  dist = d2;.     
2e3b0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2e3c0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2e3d0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c     }.        }el
2e3e0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6c  se{.          cl
2e3f0 6f 73 65 73 74 20 3d 20 30 3b 0a 20 20 20 20 20  osest = 0;.     
2e400 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 69 50     }..        iP
2e410 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 26  age = get4byte(&
2e420 61 44 61 74 61 5b 38 2b 63 6c 6f 73 65 73 74 2a  aData[8+closest*
2e430 34 5d 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  4]);.        tes
2e440 74 63 61 73 65 28 20 69 50 61 67 65 3d 3d 6d 78  tcase( iPage==mx
2e450 50 61 67 65 20 29 3b 0a 20 20 20 20 20 20 20 20  Page );.        
2e460 69 66 28 20 69 50 61 67 65 3e 6d 78 50 61 67 65  if( iPage>mxPage
2e470 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
2e480 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
2e490 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20  T_BKPT;.        
2e4a0 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63    goto end_alloc
2e4b0 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20  ate_page;.      
2e4c0 20 20 7d 0a 20 20 20 20 20 20 20 20 74 65 73 74    }.        test
2e4d0 63 61 73 65 28 20 69 50 61 67 65 3d 3d 6d 78 50  case( iPage==mxP
2e4e0 61 67 65 20 29 3b 0a 20 20 20 20 20 20 20 20 69  age );.        i
2e4f0 66 28 20 21 73 65 61 72 63 68 4c 69 73 74 20 0a  f( !searchList .
2e500 20 20 20 20 20 20 20 20 20 7c 7c 20 28 69 50 61           || (iPa
2e510 67 65 3d 3d 6e 65 61 72 62 79 20 7c 7c 20 28 69  ge==nearby || (i
2e520 50 61 67 65 3c 6e 65 61 72 62 79 20 26 26 20 65  Page<nearby && e
2e530 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45  Mode==BTALLOC_LE
2e540 29 29 20 0a 20 20 20 20 20 20 20 20 29 7b 0a 20  )) .        ){. 
2e550 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e 6f 43           int noC
2e560 6f 6e 74 65 6e 74 3b 0a 20 20 20 20 20 20 20 20  ontent;.        
2e570 20 20 2a 70 50 67 6e 6f 20 3d 20 69 50 61 67 65    *pPgno = iPage
2e580 3b 0a 20 20 20 20 20 20 20 20 20 20 54 52 41 43  ;.          TRAC
2e590 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64  E(("ALLOCATE: %d
2e5a0 20 77 61 73 20 6c 65 61 66 20 25 64 20 6f 66 20   was leaf %d of 
2e5b0 25 64 20 6f 6e 20 74 72 75 6e 6b 20 25 64 22 0a  %d on trunk %d".
2e5c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e5d0 20 22 3a 20 25 64 20 6d 6f 72 65 20 66 72 65 65   ": %d more free
2e5e0 20 70 61 67 65 73 5c 6e 22 2c 0a 20 20 20 20 20   pages\n",.     
2e5f0 20 20 20 20 20 20 20 20 20 20 20 20 2a 70 50 67              *pPg
2e600 6e 6f 2c 20 63 6c 6f 73 65 73 74 2b 31 2c 20 6b  no, closest+1, k
2e610 2c 20 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 2c 20  , pTrunk->pgno, 
2e620 6e 2d 31 29 29 3b 0a 20 20 20 20 20 20 20 20 20  n-1));.         
2e630 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
2e640 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e  erWrite(pTrunk->
2e650 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
2e660 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
2e670 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
2e680 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 69  age;.          i
2e690 66 28 20 63 6c 6f 73 65 73 74 3c 6b 2d 31 20 29  f( closest<k-1 )
2e6a0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 65  {.            me
2e6b0 6d 63 70 79 28 26 61 44 61 74 61 5b 38 2b 63 6c  mcpy(&aData[8+cl
2e6c0 6f 73 65 73 74 2a 34 5d 2c 20 26 61 44 61 74 61  osest*4], &aData
2e6d0 5b 34 2b 6b 2a 34 5d 2c 20 34 29 3b 0a 20 20 20  [4+k*4], 4);.   
2e6e0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2e6f0 20 20 20 70 75 74 34 62 79 74 65 28 26 61 44 61     put4byte(&aDa
2e700 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b 0a 20 20 20  ta[4], k-1);.   
2e710 20 20 20 20 20 20 20 6e 6f 43 6f 6e 74 65 6e 74         noContent
2e720 20 3d 20 21 62 74 72 65 65 47 65 74 48 61 73 43   = !btreeGetHasC
2e730 6f 6e 74 65 6e 74 28 70 42 74 2c 20 2a 70 50 67  ontent(pBt, *pPg
2e740 6e 6f 29 3f 20 50 41 47 45 52 5f 47 45 54 5f 4e  no)? PAGER_GET_N
2e750 4f 43 4f 4e 54 45 4e 54 20 3a 20 30 3b 0a 20 20  OCONTENT : 0;.  
2e760 20 20 20 20 20 20 20 20 72 63 20 3d 20 62 74 72          rc = btr
2e770 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 2a  eeGetPage(pBt, *
2e780 70 50 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 6e  pPgno, ppPage, n
2e790 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 20 20 20  oContent);.     
2e7a0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
2e7b0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2e7c0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
2e7d0 65 33 50 61 67 65 72 57 72 69 74 65 28 28 2a 70  e3PagerWrite((*p
2e7e0 70 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29  pPage)->pDbPage)
2e7f0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
2e800 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2e810 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
2e820 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70   releasePage(*pp
2e830 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
2e840 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
2e850 0a 20 20 20 20 20 20 20 20 20 20 73 65 61 72 63  .          searc
2e860 68 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 20  hList = 0;.     
2e870 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
2e880 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
2e890 50 72 65 76 54 72 75 6e 6b 29 3b 0a 20 20 20 20  PrevTrunk);.    
2e8a0 20 20 70 50 72 65 76 54 72 75 6e 6b 20 3d 20 30    pPrevTrunk = 0
2e8b0 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 73 65  ;.    }while( se
2e8c0 61 72 63 68 4c 69 73 74 20 29 3b 0a 20 20 7d 65  archList );.  }e
2e8d0 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72  lse{.    /* Ther
2e8e0 65 20 61 72 65 20 6e 6f 20 70 61 67 65 73 20 6f  e are no pages o
2e8f0 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 2c 20  n the freelist, 
2e900 73 6f 20 61 70 70 65 6e 64 20 61 20 6e 65 77 20  so append a new 
2e910 70 61 67 65 20 74 6f 20 74 68 65 0a 20 20 20 20  page to the.    
2e920 2a 2a 20 64 61 74 61 62 61 73 65 20 69 6d 61 67  ** database imag
2e930 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  e..    **.    **
2e940 20 4e 6f 72 6d 61 6c 6c 79 2c 20 6e 65 77 20 70   Normally, new p
2e950 61 67 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 62  ages allocated b
2e960 79 20 74 68 69 73 20 62 6c 6f 63 6b 20 63 61 6e  y this block can
2e970 20 62 65 20 72 65 71 75 65 73 74 65 64 20 66 72   be requested fr
2e980 6f 6d 20 74 68 65 0a 20 20 20 20 2a 2a 20 70 61  om the.    ** pa
2e990 67 65 72 20 6c 61 79 65 72 20 77 69 74 68 20 74  ger layer with t
2e9a0 68 65 20 27 6e 6f 2d 63 6f 6e 74 65 6e 74 27 20  he 'no-content' 
2e9b0 66 6c 61 67 20 73 65 74 2e 20 54 68 69 73 20 70  flag set. This p
2e9c0 72 65 76 65 6e 74 73 20 74 68 65 20 70 61 67 65  revents the page
2e9d0 72 0a 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74 72  r.    ** from tr
2e9e0 79 69 6e 67 20 74 6f 20 72 65 61 64 20 74 68 65  ying to read the
2e9f0 20 70 61 67 65 73 20 63 6f 6e 74 65 6e 74 20 66   pages content f
2ea00 72 6f 6d 20 64 69 73 6b 2e 20 48 6f 77 65 76 65  rom disk. Howeve
2ea10 72 2c 20 69 66 20 74 68 65 0a 20 20 20 20 2a 2a  r, if the.    **
2ea20 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63   current transac
2ea30 74 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79  tion has already
2ea40 20 72 75 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72 65   run one or more
2ea50 20 69 6e 63 72 65 6d 65 6e 74 61 6c 2d 76 61 63   incremental-vac
2ea60 75 75 6d 0a 20 20 20 20 2a 2a 20 73 74 65 70 73  uum.    ** steps
2ea70 2c 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20  , then the page 
2ea80 77 65 20 61 72 65 20 61 62 6f 75 74 20 74 6f 20  we are about to 
2ea90 61 6c 6c 6f 63 61 74 65 20 6d 61 79 20 63 6f 6e  allocate may con
2eaa0 74 61 69 6e 20 63 6f 6e 74 65 6e 74 0a 20 20 20  tain content.   
2eab0 20 2a 2a 20 74 68 61 74 20 69 73 20 72 65 71 75   ** that is requ
2eac0 69 72 65 64 20 69 6e 20 74 68 65 20 65 76 65 6e  ired in the even
2ead0 74 20 6f 66 20 61 20 72 6f 6c 6c 62 61 63 6b 2e  t of a rollback.
2eae0 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 64   In this case, d
2eaf0 6f 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 73 65 74  o.    ** not set
2eb00 20 74 68 65 20 6e 6f 2d 63 6f 6e 74 65 6e 74 20   the no-content 
2eb10 66 6c 61 67 2e 20 54 68 69 73 20 63 61 75 73 65  flag. This cause
2eb20 73 20 74 68 65 20 70 61 67 65 72 20 74 6f 20 6c  s the pager to l
2eb30 6f 61 64 20 61 6e 64 20 6a 6f 75 72 6e 61 6c 0a  oad and journal.
2eb40 20 20 20 20 2a 2a 20 74 68 65 20 63 75 72 72 65      ** the curre
2eb50 6e 74 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20  nt page content 
2eb60 62 65 66 6f 72 65 20 6f 76 65 72 77 72 69 74 69  before overwriti
2eb70 6e 67 20 69 74 2e 0a 20 20 20 20 2a 2a 0a 20 20  ng it..    **.  
2eb80 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74    ** Note that t
2eb90 68 65 20 70 61 67 65 72 20 77 69 6c 6c 20 6e 6f  he pager will no
2eba0 74 20 61 63 74 75 61 6c 6c 79 20 61 74 74 65 6d  t actually attem
2ebb0 70 74 20 74 6f 20 6c 6f 61 64 20 6f 72 20 6a 6f  pt to load or jo
2ebc0 75 72 6e 61 6c 20 0a 20 20 20 20 2a 2a 20 63 6f  urnal .    ** co
2ebd0 6e 74 65 6e 74 20 66 6f 72 20 61 6e 79 20 70 61  ntent for any pa
2ebe0 67 65 20 74 68 61 74 20 72 65 61 6c 6c 79 20 64  ge that really d
2ebf0 6f 65 73 20 6c 69 65 20 70 61 73 74 20 74 68 65  oes lie past the
2ec00 20 65 6e 64 20 6f 66 20 74 68 65 20 64 61 74 61   end of the data
2ec10 62 61 73 65 0a 20 20 20 20 2a 2a 20 66 69 6c 65  base.    ** file
2ec20 20 6f 6e 20 64 69 73 6b 2e 20 53 6f 20 74 68 65   on disk. So the
2ec30 20 65 66 66 65 63 74 73 20 6f 66 20 64 69 73 61   effects of disa
2ec40 62 6c 69 6e 67 20 74 68 65 20 6e 6f 2d 63 6f 6e  bling the no-con
2ec50 74 65 6e 74 20 6f 70 74 69 6d 69 7a 61 74 69 6f  tent optimizatio
2ec60 6e 0a 20 20 20 20 2a 2a 20 68 65 72 65 20 61 72  n.    ** here ar
2ec70 65 20 63 6f 6e 66 69 6e 65 64 20 74 6f 20 74 68  e confined to th
2ec80 6f 73 65 20 70 61 67 65 73 20 74 68 61 74 20 6c  ose pages that l
2ec90 69 65 20 62 65 74 77 65 65 6e 20 74 68 65 20 65  ie between the e
2eca0 6e 64 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a  nd of the.    **
2ecb0 20 64 61 74 61 62 61 73 65 20 69 6d 61 67 65 20   database image 
2ecc0 61 6e 64 20 74 68 65 20 65 6e 64 20 6f 66 20 74  and the end of t
2ecd0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2ece0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74  ..    */.    int
2ecf0 20 62 4e 6f 43 6f 6e 74 65 6e 74 20 3d 20 28 30   bNoContent = (0
2ed00 3d 3d 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70 42  ==IfNotOmitAV(pB
2ed10 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65 29 29  t->bDoTruncate))
2ed20 3f 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f  ? PAGER_GET_NOCO
2ed30 4e 54 45 4e 54 3a 30 3b 0a 0a 20 20 20 20 72 63  NTENT:0;..    rc
2ed40 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
2ed50 72 69 74 65 28 70 42 74 2d 3e 70 50 61 67 65 31  rite(pBt->pPage1
2ed60 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
2ed70 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
2ed80 72 63 3b 0a 20 20 20 20 70 42 74 2d 3e 6e 50 61  rc;.    pBt->nPa
2ed90 67 65 2b 2b 3b 0a 20 20 20 20 69 66 28 20 70 42  ge++;.    if( pB
2eda0 74 2d 3e 6e 50 61 67 65 3d 3d 50 45 4e 44 49 4e  t->nPage==PENDIN
2edb0 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
2edc0 20 29 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b   ) pBt->nPage++;
2edd0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
2ede0 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
2edf0 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75  .    if( pBt->au
2ee00 74 6f 56 61 63 75 75 6d 20 26 26 20 50 54 52 4d  toVacuum && PTRM
2ee10 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 70  AP_ISPAGE(pBt, p
2ee20 42 74 2d 3e 6e 50 61 67 65 29 20 29 7b 0a 20 20  Bt->nPage) ){.  
2ee30 20 20 20 20 2f 2a 20 49 66 20 2a 70 50 67 6e 6f      /* If *pPgno
2ee40 20 72 65 66 65 72 73 20 74 6f 20 61 20 70 6f 69   refers to a poi
2ee50 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 2c 20 61  nter-map page, a
2ee60 6c 6c 6f 63 61 74 65 20 74 77 6f 20 6e 65 77 20  llocate two new 
2ee70 70 61 67 65 73 0a 20 20 20 20 20 20 2a 2a 20 61  pages.      ** a
2ee80 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
2ee90 20 66 69 6c 65 20 69 6e 73 74 65 61 64 20 6f 66   file instead of
2eea0 20 6f 6e 65 2e 20 54 68 65 20 66 69 72 73 74 20   one. The first 
2eeb0 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 0a 20  allocated page. 
2eec0 20 20 20 20 20 2a 2a 20 62 65 63 6f 6d 65 73 20       ** becomes 
2eed0 61 20 6e 65 77 20 70 6f 69 6e 74 65 72 2d 6d 61  a new pointer-ma
2eee0 70 20 70 61 67 65 2c 20 74 68 65 20 73 65 63 6f  p page, the seco
2eef0 6e 64 20 69 73 20 75 73 65 64 20 62 79 20 74 68  nd is used by th
2ef00 65 20 63 61 6c 6c 65 72 2e 0a 20 20 20 20 20 20  e caller..      
2ef10 2a 2f 0a 20 20 20 20 20 20 4d 65 6d 50 61 67 65  */.      MemPage
2ef20 20 2a 70 50 67 20 3d 20 30 3b 0a 20 20 20 20 20   *pPg = 0;.     
2ef30 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54   TRACE(("ALLOCAT
2ef40 45 3a 20 25 64 20 66 72 6f 6d 20 65 6e 64 20 6f  E: %d from end o
2ef50 66 20 66 69 6c 65 20 28 70 6f 69 6e 74 65 72 2d  f file (pointer-
2ef60 6d 61 70 20 70 61 67 65 29 5c 6e 22 2c 20 70 42  map page)\n", pB
2ef70 74 2d 3e 6e 50 61 67 65 29 29 3b 0a 20 20 20 20  t->nPage));.    
2ef80 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6e    assert( pBt->n
2ef90 50 61 67 65 21 3d 50 45 4e 44 49 4e 47 5f 42 59  Page!=PENDING_BY
2efa0 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 3b 0a  TE_PAGE(pBt) );.
2efb0 20 20 20 20 20 20 72 63 20 3d 20 62 74 72 65 65        rc = btree
2efc0 47 65 74 50 61 67 65 28 70 42 74 2c 20 70 42 74  GetPage(pBt, pBt
2efd0 2d 3e 6e 50 61 67 65 2c 20 26 70 50 67 2c 20 62  ->nPage, &pPg, b
2efe0 4e 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 20 20  NoContent);.    
2eff0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2f000 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
2f010 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
2f020 57 72 69 74 65 28 70 50 67 2d 3e 70 44 62 50 61  Write(pPg->pDbPa
2f030 67 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65 6c  ge);.        rel
2f040 65 61 73 65 50 61 67 65 28 70 50 67 29 3b 0a 20  easePage(pPg);. 
2f050 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
2f060 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
2f070 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 50 61 67  .      pBt->nPag
2f080 65 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70  e++;.      if( p
2f090 42 74 2d 3e 6e 50 61 67 65 3d 3d 50 45 4e 44 49  Bt->nPage==PENDI
2f0a0 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
2f0b0 29 20 29 7b 20 70 42 74 2d 3e 6e 50 61 67 65 2b  ) ){ pBt->nPage+
2f0c0 2b 3b 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69  +; }.    }.#endi
2f0d0 66 0a 20 20 20 20 70 75 74 34 62 79 74 65 28 32  f.    put4byte(2
2f0e0 38 20 2b 20 28 75 38 2a 29 70 42 74 2d 3e 70 50  8 + (u8*)pBt->pP
2f0f0 61 67 65 31 2d 3e 61 44 61 74 61 2c 20 70 42 74  age1->aData, pBt
2f100 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20 2a 70  ->nPage);.    *p
2f110 50 67 6e 6f 20 3d 20 70 42 74 2d 3e 6e 50 61 67  Pgno = pBt->nPag
2f120 65 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  e;..    assert( 
2f130 2a 70 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f  *pPgno!=PENDING_
2f140 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
2f150 3b 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65 65  ;.    rc = btree
2f160 47 65 74 50 61 67 65 28 70 42 74 2c 20 2a 70 50  GetPage(pBt, *pP
2f170 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 62 4e 6f  gno, ppPage, bNo
2f180 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 20 20 69 66  Content);.    if
2f190 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
2f1a0 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
2f1b0 65 33 50 61 67 65 72 57 72 69 74 65 28 28 2a 70  e3PagerWrite((*p
2f1c0 70 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29  pPage)->pDbPage)
2f1d0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
2f1e0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2f1f0 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70   releasePage(*pp
2f200 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Page);.    }.   
2f210 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54   TRACE(("ALLOCAT
2f220 45 3a 20 25 64 20 66 72 6f 6d 20 65 6e 64 20 6f  E: %d from end o
2f230 66 20 66 69 6c 65 5c 6e 22 2c 20 2a 70 50 67 6e  f file\n", *pPgn
2f240 6f 29 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65  o));.  }..  asse
2f250 72 74 28 20 2a 70 50 67 6e 6f 21 3d 50 45 4e 44  rt( *pPgno!=PEND
2f260 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
2f270 74 29 20 29 3b 0a 0a 65 6e 64 5f 61 6c 6c 6f 63  t) );..end_alloc
2f280 61 74 65 5f 70 61 67 65 3a 0a 20 20 72 65 6c 65  ate_page:.  rele
2f290 61 73 65 50 61 67 65 28 70 54 72 75 6e 6b 29 3b  asePage(pTrunk);
2f2a0 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70  .  releasePage(p
2f2b0 50 72 65 76 54 72 75 6e 6b 29 3b 0a 20 20 69 66  PrevTrunk);.  if
2f2c0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2f2d0 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  ){.    if( sqlit
2f2e0 65 33 50 61 67 65 72 50 61 67 65 52 65 66 63 6f  e3PagerPageRefco
2f2f0 75 6e 74 28 28 2a 70 70 50 61 67 65 29 2d 3e 70  unt((*ppPage)->p
2f300 44 62 50 61 67 65 29 3e 31 20 29 7b 0a 20 20 20  DbPage)>1 ){.   
2f310 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a     releasePage(*
2f320 70 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 2a  ppPage);.      *
2f330 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20  ppPage = 0;.    
2f340 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2f350 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
2f360 20 20 7d 0a 20 20 20 20 28 2a 70 70 50 61 67 65    }.    (*ppPage
2f370 29 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20  )->isInit = 0;. 
2f380 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 70 50   }else{.    *ppP
2f390 61 67 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 61  age = 0;.  }.  a
2f3a0 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
2f3b0 45 5f 4f 4b 20 7c 7c 20 73 71 6c 69 74 65 33 50  E_OK || sqlite3P
2f3c0 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
2f3d0 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61  (*ppPage)->pDbPa
2f3e0 67 65 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  ge) );.  return 
2f3f0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
2f400 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73  s function is us
2f410 65 64 20 74 6f 20 61 64 64 20 70 61 67 65 20 69  ed to add page i
2f420 50 61 67 65 20 74 6f 20 74 68 65 20 64 61 74 61  Page to the data
2f430 62 61 73 65 20 66 69 6c 65 20 66 72 65 65 2d 6c  base file free-l
2f440 69 73 74 2e 20 0a 2a 2a 20 49 74 20 69 73 20 61  ist. .** It is a
2f450 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 20  ssumed that the 
2f460 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65  page is not alre
2f470 61 64 79 20 61 20 70 61 72 74 20 6f 66 20 74 68  ady a part of th
2f480 65 20 66 72 65 65 2d 6c 69 73 74 2e 0a 2a 2a 0a  e free-list..**.
2f490 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 70 61 73  ** The value pas
2f4a0 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  sed as the secon
2f4b0 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68  d argument to th
2f4c0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f  is function is o
2f4d0 70 74 69 6f 6e 61 6c 2e 0a 2a 2a 20 49 66 20 74  ptional..** If t
2f4e0 68 65 20 63 61 6c 6c 65 72 20 68 61 70 70 65 6e  he caller happen
2f4f0 73 20 74 6f 20 68 61 76 65 20 61 20 70 6f 69 6e  s to have a poin
2f500 74 65 72 20 74 6f 20 74 68 65 20 4d 65 6d 50 61  ter to the MemPa
2f510 67 65 20 6f 62 6a 65 63 74 20 0a 2a 2a 20 63 6f  ge object .** co
2f520 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 70  rresponding to p
2f530 61 67 65 20 69 50 61 67 65 20 68 61 6e 64 79 2c  age iPage handy,
2f540 20 69 74 20 6d 61 79 20 70 61 73 73 20 69 74 20   it may pass it 
2f550 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 76 61  as the second va
2f560 6c 75 65 2e 20 0a 2a 2a 20 4f 74 68 65 72 77 69  lue. .** Otherwi
2f570 73 65 2c 20 69 74 20 6d 61 79 20 70 61 73 73 20  se, it may pass 
2f580 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  NULL..**.** If a
2f590 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 4d 65   pointer to a Me
2f5a0 6d 50 61 67 65 20 6f 62 6a 65 63 74 20 69 73 20  mPage object is 
2f5b0 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65  passed as the se
2f5c0 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c 0a 2a  cond argument,.*
2f5d0 2a 20 69 74 73 20 72 65 66 65 72 65 6e 63 65 20  * its reference 
2f5e0 63 6f 75 6e 74 20 69 73 20 6e 6f 74 20 61 6c 74  count is not alt
2f5f0 65 72 65 64 20 62 79 20 74 68 69 73 20 66 75 6e  ered by this fun
2f600 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ction..*/.static
2f610 20 69 6e 74 20 66 72 65 65 50 61 67 65 32 28 42   int freePage2(B
2f620 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 4d 65  tShared *pBt, Me
2f630 6d 50 61 67 65 20 2a 70 4d 65 6d 50 61 67 65 2c  mPage *pMemPage,
2f640 20 50 67 6e 6f 20 69 50 61 67 65 29 7b 0a 20 20   Pgno iPage){.  
2f650 4d 65 6d 50 61 67 65 20 2a 70 54 72 75 6e 6b 20  MemPage *pTrunk 
2f660 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
2f670 20 20 20 20 2f 2a 20 46 72 65 65 2d 6c 69 73 74      /* Free-list
2f680 20 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f 0a 20   trunk page */. 
2f690 20 50 67 6e 6f 20 69 54 72 75 6e 6b 20 3d 20 30   Pgno iTrunk = 0
2f6a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2f6b0 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d       /* Page num
2f6c0 62 65 72 20 6f 66 20 66 72 65 65 2d 6c 69 73 74  ber of free-list
2f6d0 20 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f 20 0a   trunk page */ .
2f6e0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
2f6f0 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b  1 = pBt->pPage1;
2f700 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 72        /* Local r
2f710 65 66 65 72 65 6e 63 65 20 74 6f 20 70 61 67 65  eference to page
2f720 20 31 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20   1 */.  MemPage 
2f730 2a 70 50 61 67 65 3b 20 20 20 20 20 20 20 20 20  *pPage;         
2f740 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
2f750 61 67 65 20 62 65 69 6e 67 20 66 72 65 65 64 2e  age being freed.
2f760 20 4d 61 79 20 62 65 20 4e 55 4c 4c 2e 20 2a 2f   May be NULL. */
2f770 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
2f780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f790 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
2f7a0 20 43 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e   Code */.  int n
2f7b0 46 72 65 65 3b 20 20 20 20 20 20 20 20 20 20 20  Free;           
2f7c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2f7d0 2a 20 49 6e 69 74 69 61 6c 20 6e 75 6d 62 65 72  * Initial number
2f7e0 20 6f 66 20 70 61 67 65 73 20 6f 6e 20 66 72 65   of pages on fre
2f7f0 65 2d 6c 69 73 74 20 2a 2f 0a 0a 20 20 61 73 73  e-list */..  ass
2f800 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
2f810 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
2f820 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
2f830 20 69 50 61 67 65 3e 31 20 29 3b 0a 20 20 61 73   iPage>1 );.  as
2f840 73 65 72 74 28 20 21 70 4d 65 6d 50 61 67 65 20  sert( !pMemPage 
2f850 7c 7c 20 70 4d 65 6d 50 61 67 65 2d 3e 70 67 6e  || pMemPage->pgn
2f860 6f 3d 3d 69 50 61 67 65 20 29 3b 0a 0a 20 20 69  o==iPage );..  i
2f870 66 28 20 70 4d 65 6d 50 61 67 65 20 29 7b 0a 20  f( pMemPage ){. 
2f880 20 20 20 70 50 61 67 65 20 3d 20 70 4d 65 6d 50     pPage = pMemP
2f890 61 67 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  age;.    sqlite3
2f8a0 50 61 67 65 72 52 65 66 28 70 50 61 67 65 2d 3e  PagerRef(pPage->
2f8b0 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 65 6c 73  pDbPage);.  }els
2f8c0 65 7b 0a 20 20 20 20 70 50 61 67 65 20 3d 20 62  e{.    pPage = b
2f8d0 74 72 65 65 50 61 67 65 4c 6f 6f 6b 75 70 28 70  treePageLookup(p
2f8e0 42 74 2c 20 69 50 61 67 65 29 3b 0a 20 20 7d 0a  Bt, iPage);.  }.
2f8f0 0a 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20  .  /* Increment 
2f900 74 68 65 20 66 72 65 65 20 70 61 67 65 20 63 6f  the free page co
2f910 75 6e 74 20 6f 6e 20 70 50 61 67 65 31 20 2a 2f  unt on pPage1 */
2f920 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
2f930 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65 31  agerWrite(pPage1
2f940 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66  ->pDbPage);.  if
2f950 28 20 72 63 20 29 20 67 6f 74 6f 20 66 72 65 65  ( rc ) goto free
2f960 70 61 67 65 5f 6f 75 74 3b 0a 20 20 6e 46 72 65  page_out;.  nFre
2f970 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50  e = get4byte(&pP
2f980 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29  age1->aData[36])
2f990 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 70 50  ;.  put4byte(&pP
2f9a0 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c  age1->aData[36],
2f9b0 20 6e 46 72 65 65 2b 31 29 3b 0a 0a 20 20 69 66   nFree+1);..  if
2f9c0 28 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20  ( pBt->btsFlags 
2f9d0 26 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c  & BTS_SECURE_DEL
2f9e0 45 54 45 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  ETE ){.    /* If
2f9f0 20 74 68 65 20 73 65 63 75 72 65 5f 64 65 6c 65   the secure_dele
2fa00 74 65 20 6f 70 74 69 6f 6e 20 69 73 20 65 6e 61  te option is ena
2fa10 62 6c 65 64 2c 20 74 68 65 6e 0a 20 20 20 20 2a  bled, then.    *
2fa20 2a 20 61 6c 77 61 79 73 20 66 75 6c 6c 79 20 6f  * always fully o
2fa30 76 65 72 77 72 69 74 65 20 64 65 6c 65 74 65 64  verwrite deleted
2fa40 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 69 74   information wit
2fa50 68 20 7a 65 72 6f 73 2e 0a 20 20 20 20 2a 2f 0a  h zeros..    */.
2fa60 20 20 20 20 69 66 28 20 28 21 70 50 61 67 65 20      if( (!pPage 
2fa70 26 26 20 28 28 72 63 20 3d 20 62 74 72 65 65 47  && ((rc = btreeG
2fa80 65 74 50 61 67 65 28 70 42 74 2c 20 69 50 61 67  etPage(pBt, iPag
2fa90 65 2c 20 26 70 50 61 67 65 2c 20 30 29 29 21 3d  e, &pPage, 0))!=
2faa0 30 29 20 29 0a 20 20 20 20 20 7c 7c 20 20 20 20  0) ).     ||    
2fab0 20 20 20 20 20 20 20 20 28 28 72 63 20 3d 20 73          ((rc = s
2fac0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
2fad0 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
2fae0 29 21 3d 30 29 0a 20 20 20 20 29 7b 0a 20 20 20  )!=0).    ){.   
2faf0 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65     goto freepage
2fb00 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _out;.    }.    
2fb10 6d 65 6d 73 65 74 28 70 50 61 67 65 2d 3e 61 44  memset(pPage->aD
2fb20 61 74 61 2c 20 30 2c 20 70 50 61 67 65 2d 3e 70  ata, 0, pPage->p
2fb30 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  Bt->pageSize);. 
2fb40 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20   }..  /* If the 
2fb50 64 61 74 61 62 61 73 65 20 73 75 70 70 6f 72 74  database support
2fb60 73 20 61 75 74 6f 2d 76 61 63 75 75 6d 2c 20 77  s auto-vacuum, w
2fb70 72 69 74 65 20 61 6e 20 65 6e 74 72 79 20 69 6e  rite an entry in
2fb80 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70   the pointer-map
2fb90 0a 20 20 2a 2a 20 74 6f 20 69 6e 64 69 63 61 74  .  ** to indicat
2fba0 65 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  e that the page 
2fbb0 69 73 20 66 72 65 65 2e 0a 20 20 2a 2f 0a 20 20  is free..  */.  
2fbc0 69 66 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d  if( ISAUTOVACUUM
2fbd0 20 29 7b 0a 20 20 20 20 70 74 72 6d 61 70 50 75   ){.    ptrmapPu
2fbe0 74 28 70 42 74 2c 20 69 50 61 67 65 2c 20 50 54  t(pBt, iPage, PT
2fbf0 52 4d 41 50 5f 46 52 45 45 50 41 47 45 2c 20 30  RMAP_FREEPAGE, 0
2fc00 2c 20 26 72 63 29 3b 0a 20 20 20 20 69 66 28 20  , &rc);.    if( 
2fc10 72 63 20 29 20 67 6f 74 6f 20 66 72 65 65 70 61  rc ) goto freepa
2fc20 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f  ge_out;.  }..  /
2fc30 2a 20 4e 6f 77 20 6d 61 6e 69 70 75 6c 61 74 65  * Now manipulate
2fc40 20 74 68 65 20 61 63 74 75 61 6c 20 64 61 74 61   the actual data
2fc50 62 61 73 65 20 66 72 65 65 2d 6c 69 73 74 20 73  base free-list s
2fc60 74 72 75 63 74 75 72 65 2e 20 54 68 65 72 65 20  tructure. There 
2fc70 61 72 65 20 74 77 6f 0a 20 20 2a 2a 20 70 6f 73  are two.  ** pos
2fc80 73 69 62 69 6c 69 74 69 65 73 2e 20 49 66 20 74  sibilities. If t
2fc90 68 65 20 66 72 65 65 2d 6c 69 73 74 20 69 73 20  he free-list is 
2fca0 63 75 72 72 65 6e 74 6c 79 20 65 6d 70 74 79 2c  currently empty,
2fcb0 20 6f 72 20 69 66 20 74 68 65 20 66 69 72 73 74   or if the first
2fcc0 0a 20 20 2a 2a 20 74 72 75 6e 6b 20 70 61 67 65  .  ** trunk page
2fcd0 20 69 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73   in the free-lis
2fce0 74 20 69 73 20 66 75 6c 6c 2c 20 74 68 65 6e 20  t is full, then 
2fcf0 74 68 69 73 20 70 61 67 65 20 77 69 6c 6c 20 62  this page will b
2fd00 65 63 6f 6d 65 20 61 0a 20 20 2a 2a 20 6e 65 77  ecome a.  ** new
2fd10 20 66 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b   free-list trunk
2fd20 20 70 61 67 65 2e 20 4f 74 68 65 72 77 69 73 65   page. Otherwise
2fd30 2c 20 69 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65  , it will become
2fd40 20 61 20 6c 65 61 66 20 6f 66 20 74 68 65 0a 20   a leaf of the. 
2fd50 20 2a 2a 20 66 69 72 73 74 20 74 72 75 6e 6b 20   ** first trunk 
2fd60 70 61 67 65 20 69 6e 20 74 68 65 20 63 75 72 72  page in the curr
2fd70 65 6e 74 20 66 72 65 65 2d 6c 69 73 74 2e 20 54  ent free-list. T
2fd80 68 69 73 20 62 6c 6f 63 6b 20 74 65 73 74 73 20  his block tests 
2fd90 69 66 20 69 74 0a 20 20 2a 2a 20 69 73 20 70 6f  if it.  ** is po
2fda0 73 73 69 62 6c 65 20 74 6f 20 61 64 64 20 74 68  ssible to add th
2fdb0 65 20 70 61 67 65 20 61 73 20 61 20 6e 65 77 20  e page as a new 
2fdc0 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 2e 0a  free-list leaf..
2fdd0 20 20 2a 2f 0a 20 20 69 66 28 20 6e 46 72 65 65    */.  if( nFree
2fde0 21 3d 30 20 29 7b 0a 20 20 20 20 75 33 32 20 6e  !=0 ){.    u32 n
2fdf0 4c 65 61 66 3b 20 20 20 20 20 20 20 20 20 20 20  Leaf;           
2fe00 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20       /* Initial 
2fe10 6e 75 6d 62 65 72 20 6f 66 20 6c 65 61 66 20 63  number of leaf c
2fe20 65 6c 6c 73 20 6f 6e 20 74 72 75 6e 6b 20 70 61  ells on trunk pa
2fe30 67 65 20 2a 2f 0a 0a 20 20 20 20 69 54 72 75 6e  ge */..    iTrun
2fe40 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50  k = get4byte(&pP
2fe50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 29  age1->aData[32])
2fe60 3b 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65 65  ;.    rc = btree
2fe70 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 54 72  GetPage(pBt, iTr
2fe80 75 6e 6b 2c 20 26 70 54 72 75 6e 6b 2c 20 30 29  unk, &pTrunk, 0)
2fe90 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
2fea0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2feb0 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f   goto freepage_o
2fec0 75 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6e  ut;.    }..    n
2fed0 4c 65 61 66 20 3d 20 67 65 74 34 62 79 74 65 28  Leaf = get4byte(
2fee0 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34  &pTrunk->aData[4
2fef0 5d 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ]);.    assert( 
2ff00 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3e  pBt->usableSize>
2ff10 33 32 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 4c  32 );.    if( nL
2ff20 65 61 66 20 3e 20 28 75 33 32 29 70 42 74 2d 3e  eaf > (u32)pBt->
2ff30 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 32  usableSize/4 - 2
2ff40 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
2ff50 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
2ff60 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66  PT;.      goto f
2ff70 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20  reepage_out;.   
2ff80 20 7d 0a 20 20 20 20 69 66 28 20 6e 4c 65 61 66   }.    if( nLeaf
2ff90 20 3c 20 28 75 33 32 29 70 42 74 2d 3e 75 73 61   < (u32)pBt->usa
2ffa0 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20 29 7b  bleSize/4 - 8 ){
2ffb0 0a 20 20 20 20 20 20 2f 2a 20 49 6e 20 74 68 69  .      /* In thi
2ffc0 73 20 63 61 73 65 20 74 68 65 72 65 20 69 73 20  s case there is 
2ffd0 72 6f 6f 6d 20 6f 6e 20 74 68 65 20 74 72 75 6e  room on the trun
2ffe0 6b 20 70 61 67 65 20 74 6f 20 69 6e 73 65 72 74  k page to insert
2fff0 20 74 68 65 20 70 61 67 65 0a 20 20 20 20 20 20   the page.      
30000 2a 2a 20 62 65 69 6e 67 20 66 72 65 65 64 20 61  ** being freed a
30010 73 20 61 20 6e 65 77 20 6c 65 61 66 2e 0a 20 20  s a new leaf..  
30020 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
30030 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 74 72  Note that the tr
30040 75 6e 6b 20 70 61 67 65 20 69 73 20 6e 6f 74 20  unk page is not 
30050 72 65 61 6c 6c 79 20 66 75 6c 6c 20 75 6e 74 69  really full unti
30060 6c 20 69 74 20 63 6f 6e 74 61 69 6e 73 0a 20 20  l it contains.  
30070 20 20 20 20 2a 2a 20 75 73 61 62 6c 65 53 69 7a      ** usableSiz
30080 65 2f 34 20 2d 20 32 20 65 6e 74 72 69 65 73 2c  e/4 - 2 entries,
30090 20 6e 6f 74 20 75 73 61 62 6c 65 53 69 7a 65 2f   not usableSize/
300a0 34 20 2d 20 38 20 65 6e 74 72 69 65 73 20 61 73  4 - 8 entries as
300b0 20 77 65 20 68 61 76 65 0a 20 20 20 20 20 20 2a   we have.      *
300c0 2a 20 63 6f 64 65 64 2e 20 20 42 75 74 20 64 75  * coded.  But du
300d0 65 20 74 6f 20 61 20 63 6f 64 69 6e 67 20 65 72  e to a coding er
300e0 72 6f 72 20 69 6e 20 76 65 72 73 69 6f 6e 73 20  ror in versions 
300f0 6f 66 20 53 51 4c 69 74 65 20 70 72 69 6f 72 20  of SQLite prior 
30100 74 6f 0a 20 20 20 20 20 20 2a 2a 20 33 2e 36 2e  to.      ** 3.6.
30110 30 2c 20 64 61 74 61 62 61 73 65 73 20 77 69 74  0, databases wit
30120 68 20 66 72 65 65 6c 69 73 74 20 74 72 75 6e 6b  h freelist trunk
30130 20 70 61 67 65 73 20 68 6f 6c 64 69 6e 67 20 6d   pages holding m
30140 6f 72 65 20 74 68 61 6e 0a 20 20 20 20 20 20 2a  ore than.      *
30150 2a 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d  * usableSize/4 -
30160 20 38 20 65 6e 74 72 69 65 73 20 77 69 6c 6c 20   8 entries will 
30170 62 65 20 72 65 70 6f 72 74 65 64 20 61 73 20 63  be reported as c
30180 6f 72 72 75 70 74 2e 20 20 49 6e 20 6f 72 64 65  orrupt.  In orde
30190 72 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 6d 61  r.      ** to ma
301a0 69 6e 74 61 69 6e 20 62 61 63 6b 77 61 72 64 73  intain backwards
301b0 20 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 20 77   compatibility w
301c0 69 74 68 20 6f 6c 64 65 72 20 76 65 72 73 69 6f  ith older versio
301d0 6e 73 20 6f 66 20 53 51 4c 69 74 65 2c 0a 20 20  ns of SQLite,.  
301e0 20 20 20 20 2a 2a 20 77 65 20 77 69 6c 6c 20 63      ** we will c
301f0 6f 6e 74 69 6e 75 65 20 74 6f 20 72 65 73 74 72  ontinue to restr
30200 69 63 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ict the number o
30210 66 20 65 6e 74 72 69 65 73 20 74 6f 20 75 73 61  f entries to usa
30220 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 0a 20 20  bleSize/4 - 8.  
30230 20 20 20 20 2a 2a 20 66 6f 72 20 6e 6f 77 2e 20      ** for now. 
30240 20 41 74 20 73 6f 6d 65 20 70 6f 69 6e 74 20 69   At some point i
30250 6e 20 74 68 65 20 66 75 74 75 72 65 20 28 6f 6e  n the future (on
30260 63 65 20 65 76 65 72 79 6f 6e 65 20 68 61 73 20  ce everyone has 
30270 75 70 67 72 61 64 65 64 0a 20 20 20 20 20 20 2a  upgraded.      *
30280 2a 20 74 6f 20 33 2e 36 2e 30 20 6f 72 20 6c 61  * to 3.6.0 or la
30290 74 65 72 29 20 77 65 20 73 68 6f 75 6c 64 20 63  ter) we should c
302a0 6f 6e 73 69 64 65 72 20 66 69 78 69 6e 67 20 74  onsider fixing t
302b0 68 65 20 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 61  he conditional a
302c0 62 6f 76 65 0a 20 20 20 20 20 20 2a 2a 20 74 6f  bove.      ** to
302d0 20 72 65 61 64 20 22 75 73 61 62 6c 65 53 69 7a   read "usableSiz
302e0 65 2f 34 2d 32 22 20 69 6e 73 74 65 61 64 20 6f  e/4-2" instead o
302f0 66 20 22 75 73 61 62 6c 65 53 69 7a 65 2f 34 2d  f "usableSize/4-
30300 38 22 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  8"..      **.   
30310 20 20 20 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f     ** EVIDENCE-O
30320 46 3a 20 52 2d 31 39 39 32 30 2d 31 31 35 37 36  F: R-19920-11576
30330 20 48 6f 77 65 76 65 72 2c 20 6e 65 77 65 72 20   However, newer 
30340 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69  versions of SQLi
30350 74 65 20 73 74 69 6c 6c 0a 20 20 20 20 20 20 2a  te still.      *
30360 2a 20 61 76 6f 69 64 20 75 73 69 6e 67 20 74 68  * avoid using th
30370 65 20 6c 61 73 74 20 73 69 78 20 65 6e 74 72 69  e last six entri
30380 65 73 20 69 6e 20 74 68 65 20 66 72 65 65 6c 69  es in the freeli
30390 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20 61 72  st trunk page ar
303a0 72 61 79 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20  ray in.      ** 
303b0 6f 72 64 65 72 20 74 68 61 74 20 64 61 74 61 62  order that datab
303c0 61 73 65 20 66 69 6c 65 73 20 63 72 65 61 74 65  ase files create
303d0 64 20 62 79 20 6e 65 77 65 72 20 76 65 72 73 69  d by newer versi
303e0 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 63 61  ons of SQLite ca
303f0 6e 20 62 65 0a 20 20 20 20 20 20 2a 2a 20 72 65  n be.      ** re
30400 61 64 20 62 79 20 6f 6c 64 65 72 20 76 65 72 73  ad by older vers
30410 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 2e 0a  ions of SQLite..
30420 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72        */.      r
30430 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
30440 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44  Write(pTrunk->pD
30450 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66  bPage);.      if
30460 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
30470 29 7b 0a 20 20 20 20 20 20 20 20 70 75 74 34 62  ){.        put4b
30480 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61  yte(&pTrunk->aDa
30490 74 61 5b 34 5d 2c 20 6e 4c 65 61 66 2b 31 29 3b  ta[4], nLeaf+1);
304a0 0a 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74  .        put4byt
304b0 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  e(&pTrunk->aData
304c0 5b 38 2b 6e 4c 65 61 66 2a 34 5d 2c 20 69 50 61  [8+nLeaf*4], iPa
304d0 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ge);.        if(
304e0 20 70 50 61 67 65 20 26 26 20 28 70 42 74 2d 3e   pPage && (pBt->
304f0 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 53  btsFlags & BTS_S
30500 45 43 55 52 45 5f 44 45 4c 45 54 45 29 3d 3d 30  ECURE_DELETE)==0
30510 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
30520 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74 57 72  lite3PagerDontWr
30530 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ite(pPage->pDbPa
30540 67 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ge);.        }. 
30550 20 20 20 20 20 20 20 72 63 20 3d 20 62 74 72 65         rc = btre
30560 65 53 65 74 48 61 73 43 6f 6e 74 65 6e 74 28 70  eSetHasContent(p
30570 42 74 2c 20 69 50 61 67 65 29 3b 0a 20 20 20 20  Bt, iPage);.    
30580 20 20 7d 0a 20 20 20 20 20 20 54 52 41 43 45 28    }.      TRACE(
30590 28 22 46 52 45 45 2d 50 41 47 45 3a 20 25 64 20  ("FREE-PAGE: %d 
305a0 6c 65 61 66 20 6f 6e 20 74 72 75 6e 6b 20 70 61  leaf on trunk pa
305b0 67 65 20 25 64 5c 6e 22 2c 70 50 61 67 65 2d 3e  ge %d\n",pPage->
305c0 70 67 6e 6f 2c 70 54 72 75 6e 6b 2d 3e 70 67 6e  pgno,pTrunk->pgn
305d0 6f 29 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  o));.      goto 
305e0 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20  freepage_out;.  
305f0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66    }.  }..  /* If
30600 20 63 6f 6e 74 72 6f 6c 20 66 6c 6f 77 73 20 74   control flows t
30610 6f 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68  o this point, th
30620 65 6e 20 69 74 20 77 61 73 20 6e 6f 74 20 70 6f  en it was not po
30630 73 73 69 62 6c 65 20 74 6f 20 61 64 64 20 74 68  ssible to add th
30640 65 0a 20 20 2a 2a 20 74 68 65 20 70 61 67 65 20  e.  ** the page 
30650 62 65 69 6e 67 20 66 72 65 65 64 20 61 73 20 61  being freed as a
30660 20 6c 65 61 66 20 70 61 67 65 20 6f 66 20 74 68   leaf page of th
30670 65 20 66 69 72 73 74 20 74 72 75 6e 6b 20 69 6e  e first trunk in
30680 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 0a   the free-list..
30690 20 20 2a 2a 20 50 6f 73 73 69 62 6c 79 20 62 65    ** Possibly be
306a0 63 61 75 73 65 20 74 68 65 20 66 72 65 65 2d 6c  cause the free-l
306b0 69 73 74 20 69 73 20 65 6d 70 74 79 2c 20 6f 72  ist is empty, or
306c0 20 70 6f 73 73 69 62 6c 79 20 62 65 63 61 75 73   possibly becaus
306d0 65 20 74 68 65 20 0a 20 20 2a 2a 20 66 69 72 73  e the .  ** firs
306e0 74 20 74 72 75 6e 6b 20 69 6e 20 74 68 65 20 66  t trunk in the f
306f0 72 65 65 2d 6c 69 73 74 20 69 73 20 66 75 6c 6c  ree-list is full
30700 2e 20 45 69 74 68 65 72 20 77 61 79 2c 20 74 68  . Either way, th
30710 65 20 70 61 67 65 20 62 65 69 6e 67 20 66 72 65  e page being fre
30720 65 64 0a 20 20 2a 2a 20 77 69 6c 6c 20 62 65 63  ed.  ** will bec
30730 6f 6d 65 20 74 68 65 20 6e 65 77 20 66 69 72 73  ome the new firs
30740 74 20 74 72 75 6e 6b 20 70 61 67 65 20 69 6e 20  t trunk page in 
30750 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 0a 20  the free-list.. 
30760 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 3d   */.  if( pPage=
30770 3d 30 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b 21  =0 && SQLITE_OK!
30780 3d 28 72 63 20 3d 20 62 74 72 65 65 47 65 74 50  =(rc = btreeGetP
30790 61 67 65 28 70 42 74 2c 20 69 50 61 67 65 2c 20  age(pBt, iPage, 
307a0 26 70 50 61 67 65 2c 20 30 29 29 20 29 7b 0a 20  &pPage, 0)) ){. 
307b0 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65     goto freepage
307c0 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  _out;.  }.  rc =
307d0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
307e0 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  te(pPage->pDbPag
307f0 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  e);.  if( rc!=SQ
30800 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67  LITE_OK ){.    g
30810 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74  oto freepage_out
30820 3b 0a 20 20 7d 0a 20 20 70 75 74 34 62 79 74 65  ;.  }.  put4byte
30830 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 69  (pPage->aData, i
30840 54 72 75 6e 6b 29 3b 0a 20 20 70 75 74 34 62 79  Trunk);.  put4by
30850 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61  te(&pPage->aData
30860 5b 34 5d 2c 20 30 29 3b 0a 20 20 70 75 74 34 62  [4], 0);.  put4b
30870 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61  yte(&pPage1->aDa
30880 74 61 5b 33 32 5d 2c 20 69 50 61 67 65 29 3b 0a  ta[32], iPage);.
30890 20 20 54 52 41 43 45 28 28 22 46 52 45 45 2d 50    TRACE(("FREE-P
308a0 41 47 45 3a 20 25 64 20 6e 65 77 20 74 72 75 6e  AGE: %d new trun
308b0 6b 20 70 61 67 65 20 72 65 70 6c 61 63 69 6e 67  k page replacing
308c0 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 2d 3e 70   %d\n", pPage->p
308d0 67 6e 6f 2c 20 69 54 72 75 6e 6b 29 29 3b 0a 0a  gno, iTrunk));..
308e0 66 72 65 65 70 61 67 65 5f 6f 75 74 3a 0a 20 20  freepage_out:.  
308f0 69 66 28 20 70 50 61 67 65 20 29 7b 0a 20 20 20  if( pPage ){.   
30900 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d   pPage->isInit =
30910 20 30 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73   0;.  }.  releas
30920 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  ePage(pPage);.  
30930 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 72 75  releasePage(pTru
30940 6e 6b 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  nk);.  return rc
30950 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  ;.}.static void 
30960 66 72 65 65 50 61 67 65 28 4d 65 6d 50 61 67 65  freePage(MemPage
30970 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 2a 70 52   *pPage, int *pR
30980 43 29 7b 0a 20 20 69 66 28 20 28 2a 70 52 43 29  C){.  if( (*pRC)
30990 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
309a0 20 20 20 2a 70 52 43 20 3d 20 66 72 65 65 50 61     *pRC = freePa
309b0 67 65 32 28 70 50 61 67 65 2d 3e 70 42 74 2c 20  ge2(pPage->pBt, 
309c0 70 50 61 67 65 2c 20 70 50 61 67 65 2d 3e 70 67  pPage, pPage->pg
309d0 6e 6f 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  no);.  }.}../*.*
309e0 2a 20 46 72 65 65 20 61 6e 79 20 6f 76 65 72 66  * Free any overf
309f0 6c 6f 77 20 70 61 67 65 73 20 61 73 73 6f 63 69  low pages associ
30a00 61 74 65 64 20 77 69 74 68 20 74 68 65 20 67 69  ated with the gi
30a10 76 65 6e 20 43 65 6c 6c 2e 20 20 57 72 69 74 65  ven Cell.  Write
30a20 20 74 68 65 0a 2a 2a 20 6c 6f 63 61 6c 20 43 65   the.** local Ce
30a30 6c 6c 20 73 69 7a 65 20 28 74 68 65 20 6e 75 6d  ll size (the num
30a40 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 6e 20  ber of bytes on 
30a50 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61 67  the original pag
30a60 65 2c 20 6f 6d 69 74 74 69 6e 67 0a 2a 2a 20 6f  e, omitting.** o
30a70 76 65 72 66 6c 6f 77 29 20 69 6e 74 6f 20 2a 70  verflow) into *p
30a80 6e 53 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  nSize..*/.static
30a90 20 69 6e 74 20 63 6c 65 61 72 43 65 6c 6c 28 0a   int clearCell(.
30aa0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
30ab0 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ,          /* Th
30ac0 65 20 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74  e page that cont
30ad0 61 69 6e 73 20 74 68 65 20 43 65 6c 6c 20 2a 2f  ains the Cell */
30ae0 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
30af0 20 2a 70 43 65 6c 6c 2c 20 20 20 20 2f 2a 20 46   *pCell,    /* F
30b00 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65  irst byte of the
30b10 20 43 65 6c 6c 20 2a 2f 0a 20 20 75 31 36 20 2a   Cell */.  u16 *
30b20 70 6e 53 69 7a 65 20 20 20 20 20 20 20 20 20 20  pnSize          
30b30 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
30b40 20 73 69 7a 65 20 6f 66 20 74 68 65 20 43 65 6c   size of the Cel
30b50 6c 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 42  l here */.){.  B
30b60 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
30b70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 43 65 6c  Page->pBt;.  Cel
30b80 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 50 67  lInfo info;.  Pg
30b90 6e 6f 20 6f 76 66 6c 50 67 6e 6f 3b 0a 20 20 69  no ovflPgno;.  i
30ba0 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 6e 4f 76  nt rc;.  int nOv
30bb0 66 6c 3b 0a 20 20 75 33 32 20 6f 76 66 6c 50 61  fl;.  u32 ovflPa
30bc0 67 65 53 69 7a 65 3b 0a 0a 20 20 61 73 73 65 72  geSize;..  asser
30bd0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
30be0 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
30bf0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 62 74  ->mutex) );.  bt
30c00 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28  reeParseCellPtr(
30c10 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69  pPage, pCell, &i
30c20 6e 66 6f 29 3b 0a 20 20 2a 70 6e 53 69 7a 65 20  nfo);.  *pnSize 
30c30 3d 20 69 6e 66 6f 2e 6e 53 69 7a 65 3b 0a 20 20  = info.nSize;.  
30c40 69 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c  if( info.iOverfl
30c50 6f 77 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  ow==0 ){.    ret
30c60 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  urn SQLITE_OK;  
30c70 2f 2a 20 4e 6f 20 6f 76 65 72 66 6c 6f 77 20 70  /* No overflow p
30c80 61 67 65 73 2e 20 52 65 74 75 72 6e 20 77 69 74  ages. Return wit
30c90 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79 74 68  hout doing anyth
30ca0 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28  ing */.  }.  if(
30cb0 20 70 43 65 6c 6c 2b 69 6e 66 6f 2e 69 4f 76 65   pCell+info.iOve
30cc0 72 66 6c 6f 77 2b 33 20 3e 20 70 50 61 67 65 2d  rflow+3 > pPage-
30cd0 3e 61 44 61 74 61 2b 70 50 61 67 65 2d 3e 6d 61  >aData+pPage->ma
30ce0 73 6b 50 61 67 65 20 29 7b 0a 20 20 20 20 72 65  skPage ){.    re
30cf0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
30d00 55 50 54 5f 42 4b 50 54 3b 20 20 2f 2a 20 43 65  UPT_BKPT;  /* Ce
30d10 6c 6c 20 65 78 74 65 6e 64 73 20 70 61 73 74 20  ll extends past 
30d20 65 6e 64 20 6f 66 20 70 61 67 65 20 2a 2f 0a 20  end of page */. 
30d30 20 7d 0a 20 20 6f 76 66 6c 50 67 6e 6f 20 3d 20   }.  ovflPgno = 
30d40 67 65 74 34 62 79 74 65 28 26 70 43 65 6c 6c 5b  get4byte(&pCell[
30d50 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29  info.iOverflow])
30d60 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ;.  assert( pBt-
30d70 3e 75 73 61 62 6c 65 53 69 7a 65 20 3e 20 34 20  >usableSize > 4 
30d80 29 3b 0a 20 20 6f 76 66 6c 50 61 67 65 53 69 7a  );.  ovflPageSiz
30d90 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  e = pBt->usableS
30da0 69 7a 65 20 2d 20 34 3b 0a 20 20 6e 4f 76 66 6c  ize - 4;.  nOvfl
30db0 20 3d 20 28 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61   = (info.nPayloa
30dc0 64 20 2d 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20  d - info.nLocal 
30dd0 2b 20 6f 76 66 6c 50 61 67 65 53 69 7a 65 20 2d  + ovflPageSize -
30de0 20 31 29 2f 6f 76 66 6c 50 61 67 65 53 69 7a 65   1)/ovflPageSize
30df0 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 76 66 6c  ;.  assert( ovfl
30e00 50 67 6e 6f 3d 3d 30 20 7c 7c 20 6e 4f 76 66 6c  Pgno==0 || nOvfl
30e10 3e 30 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 6e  >0 );.  while( n
30e20 4f 76 66 6c 2d 2d 20 29 7b 0a 20 20 20 20 50 67  Ovfl-- ){.    Pg
30e30 6e 6f 20 69 4e 65 78 74 20 3d 20 30 3b 0a 20 20  no iNext = 0;.  
30e40 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f 76 66 6c    MemPage *pOvfl
30e50 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 6f 76   = 0;.    if( ov
30e60 66 6c 50 67 6e 6f 3c 32 20 7c 7c 20 6f 76 66 6c  flPgno<2 || ovfl
30e70 50 67 6e 6f 3e 62 74 72 65 65 50 61 67 65 63 6f  Pgno>btreePageco
30e80 75 6e 74 28 70 42 74 29 20 29 7b 0a 20 20 20 20  unt(pBt) ){.    
30e90 20 20 2f 2a 20 30 20 69 73 20 6e 6f 74 20 61 20    /* 0 is not a 
30ea0 6c 65 67 61 6c 20 70 61 67 65 20 6e 75 6d 62 65  legal page numbe
30eb0 72 20 61 6e 64 20 70 61 67 65 20 31 20 63 61 6e  r and page 1 can
30ec0 6e 6f 74 20 62 65 20 61 6e 20 0a 20 20 20 20 20  not be an .     
30ed0 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   ** overflow pag
30ee0 65 2e 20 54 68 65 72 65 66 6f 72 65 20 69 66 20  e. Therefore if 
30ef0 6f 76 66 6c 50 67 6e 6f 3c 32 20 6f 72 20 70 61  ovflPgno<2 or pa
30f00 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  st the end of th
30f10 65 20 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 65  e .      ** file
30f20 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6d 75   the database mu
30f30 73 74 20 62 65 20 63 6f 72 72 75 70 74 2e 20 2a  st be corrupt. *
30f40 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  /.      return S
30f50 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
30f60 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  PT;.    }.    if
30f70 28 20 6e 4f 76 66 6c 20 29 7b 0a 20 20 20 20 20  ( nOvfl ){.     
30f80 20 72 63 20 3d 20 67 65 74 4f 76 65 72 66 6c 6f   rc = getOverflo
30f90 77 50 61 67 65 28 70 42 74 2c 20 6f 76 66 6c 50  wPage(pBt, ovflP
30fa0 67 6e 6f 2c 20 26 70 4f 76 66 6c 2c 20 26 69 4e  gno, &pOvfl, &iN
30fb0 65 78 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ext);.      if( 
30fc0 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
30fd0 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 28      }..    if( (
30fe0 20 70 4f 76 66 6c 20 7c 7c 20 28 28 70 4f 76 66   pOvfl || ((pOvf
30ff0 6c 20 3d 20 62 74 72 65 65 50 61 67 65 4c 6f 6f  l = btreePageLoo
31000 6b 75 70 28 70 42 74 2c 20 6f 76 66 6c 50 67 6e  kup(pBt, ovflPgn
31010 6f 29 29 21 3d 30 29 20 29 0a 20 20 20 20 20 26  o))!=0) ).     &
31020 26 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  & sqlite3PagerPa
31030 67 65 52 65 66 63 6f 75 6e 74 28 70 4f 76 66 6c  geRefcount(pOvfl
31040 2d 3e 70 44 62 50 61 67 65 29 21 3d 31 0a 20 20  ->pDbPage)!=1.  
31050 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68    ){.      /* Th
31060 65 72 65 20 69 73 20 6e 6f 20 72 65 61 73 6f 6e  ere is no reason
31070 20 61 6e 79 20 63 75 72 73 6f 72 20 73 68 6f 75   any cursor shou
31080 6c 64 20 68 61 76 65 20 61 6e 20 6f 75 74 73 74  ld have an outst
31090 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65  anding reference
310a0 20 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 61 6e   .      ** to an
310b0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 62   overflow page b
310c0 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 61 20 63 65  elonging to a ce
310d0 6c 6c 20 74 68 61 74 20 69 73 20 62 65 69 6e 67  ll that is being
310e0 20 64 65 6c 65 74 65 64 2f 75 70 64 61 74 65 64   deleted/updated
310f0 2e 0a 20 20 20 20 20 20 2a 2a 20 53 6f 20 69 66  ..      ** So if
31100 20 74 68 65 72 65 20 65 78 69 73 74 73 20 6d 6f   there exists mo
31110 72 65 20 74 68 61 6e 20 6f 6e 65 20 72 65 66 65  re than one refe
31120 72 65 6e 63 65 20 74 6f 20 74 68 69 73 20 70 61  rence to this pa
31130 67 65 2c 20 74 68 65 6e 20 69 74 20 0a 20 20 20  ge, then it .   
31140 20 20 20 2a 2a 20 6d 75 73 74 20 6e 6f 74 20 72     ** must not r
31150 65 61 6c 6c 79 20 62 65 20 61 6e 20 6f 76 65 72  eally be an over
31160 66 6c 6f 77 20 70 61 67 65 20 61 6e 64 20 74 68  flow page and th
31170 65 20 64 61 74 61 62 61 73 65 20 6d 75 73 74 20  e database must 
31180 62 65 20 63 6f 72 72 75 70 74 2e 20 0a 20 20 20  be corrupt. .   
31190 20 20 20 2a 2a 20 49 74 20 69 73 20 68 65 6c 70     ** It is help
311a0 66 75 6c 20 74 6f 20 64 65 74 65 63 74 20 74 68  ful to detect th
311b0 69 73 20 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e  is before callin
311c0 67 20 66 72 65 65 50 61 67 65 32 28 29 2c 20 61  g freePage2(), a
311d0 73 20 0a 20 20 20 20 20 20 2a 2a 20 66 72 65 65  s .      ** free
311e0 50 61 67 65 32 28 29 20 6d 61 79 20 7a 65 72 6f  Page2() may zero
311f0 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e   the page conten
31200 74 73 20 69 66 20 73 65 63 75 72 65 2d 64 65 6c  ts if secure-del
31210 65 74 65 20 6d 6f 64 65 20 69 73 0a 20 20 20 20  ete mode is.    
31220 20 20 2a 2a 20 65 6e 61 62 6c 65 64 2e 20 49 66    ** enabled. If
31230 20 74 68 69 73 20 27 6f 76 65 72 66 6c 6f 77 27   this 'overflow'
31240 20 70 61 67 65 20 68 61 70 70 65 6e 73 20 74 6f   page happens to
31250 20 62 65 20 61 20 70 61 67 65 20 74 68 61 74 20   be a page that 
31260 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 63 61 6c  the.      ** cal
31270 6c 65 72 20 69 73 20 69 74 65 72 61 74 69 6e 67  ler is iterating
31280 20 74 68 72 6f 75 67 68 20 6f 72 20 75 73 69 6e   through or usin
31290 67 20 69 6e 20 73 6f 6d 65 20 6f 74 68 65 72 20  g in some other 
312a0 77 61 79 2c 20 74 68 69 73 0a 20 20 20 20 20 20  way, this.      
312b0 2a 2a 20 63 61 6e 20 62 65 20 70 72 6f 62 6c 65  ** can be proble
312c0 6d 61 74 69 63 2e 0a 20 20 20 20 20 20 2a 2f 0a  matic..      */.
312d0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
312e0 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
312f0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
31300 20 72 63 20 3d 20 66 72 65 65 50 61 67 65 32 28   rc = freePage2(
31310 70 42 74 2c 20 70 4f 76 66 6c 2c 20 6f 76 66 6c  pBt, pOvfl, ovfl
31320 50 67 6e 6f 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  Pgno);.    }..  
31330 20 20 69 66 28 20 70 4f 76 66 6c 20 29 7b 0a 20    if( pOvfl ){. 
31340 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
31350 72 55 6e 72 65 66 28 70 4f 76 66 6c 2d 3e 70 44  rUnref(pOvfl->pD
31360 62 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20  bPage);.    }.  
31370 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
31380 6e 20 72 63 3b 0a 20 20 20 20 6f 76 66 6c 50 67  n rc;.    ovflPg
31390 6e 6f 20 3d 20 69 4e 65 78 74 3b 0a 20 20 7d 0a  no = iNext;.  }.
313a0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
313b0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65  OK;.}../*.** Cre
313c0 61 74 65 20 74 68 65 20 62 79 74 65 20 73 65 71  ate the byte seq
313d0 75 65 6e 63 65 20 75 73 65 64 20 74 6f 20 72 65  uence used to re
313e0 70 72 65 73 65 6e 74 20 61 20 63 65 6c 6c 20 6f  present a cell o
313f0 6e 20 70 61 67 65 20 70 50 61 67 65 0a 2a 2a 20  n page pPage.** 
31400 61 6e 64 20 77 72 69 74 65 20 74 68 61 74 20 62  and write that b
31410 79 74 65 20 73 65 71 75 65 6e 63 65 20 69 6e 74  yte sequence int
31420 6f 20 70 43 65 6c 6c 5b 5d 2e 20 20 4f 76 65 72  o pCell[].  Over
31430 66 6c 6f 77 20 70 61 67 65 73 20 61 72 65 0a 2a  flow pages are.*
31440 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20  * allocated and 
31450 66 69 6c 6c 65 64 20 69 6e 20 61 73 20 6e 65 63  filled in as nec
31460 65 73 73 61 72 79 2e 20 20 54 68 65 20 63 61 6c  essary.  The cal
31470 6c 69 6e 67 20 70 72 6f 63 65 64 75 72 65 0a 2a  ling procedure.*
31480 2a 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65  * is responsible
31490 20 66 6f 72 20 6d 61 6b 69 6e 67 20 73 75 72 65   for making sure
314a0 20 73 75 66 66 69 63 69 65 6e 74 20 73 70 61 63   sufficient spac
314b0 65 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63  e has been alloc
314c0 61 74 65 64 0a 2a 2a 20 66 6f 72 20 70 43 65 6c  ated.** for pCel
314d0 6c 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20  l[]..**.** Note 
314e0 74 68 61 74 20 70 43 65 6c 6c 20 64 6f 65 73 20  that pCell does 
314f0 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 20 6e 65  not necessary ne
31500 65 64 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74  ed to point to t
31510 68 65 20 70 50 61 67 65 2d 3e 61 44 61 74 61 0a  he pPage->aData.
31520 2a 2a 20 61 72 65 61 2e 20 20 70 43 65 6c 6c 20  ** area.  pCell 
31530 6d 69 67 68 74 20 70 6f 69 6e 74 20 74 6f 20 73  might point to s
31540 6f 6d 65 20 74 65 6d 70 6f 72 61 72 79 20 73 74  ome temporary st
31550 6f 72 61 67 65 2e 20 20 54 68 65 20 63 65 6c 6c  orage.  The cell
31560 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 63 6f 6e 73   will.** be cons
31570 74 72 75 63 74 65 64 20 69 6e 20 74 68 69 73 20  tructed in this 
31580 74 65 6d 70 6f 72 61 72 79 20 61 72 65 61 20 74  temporary area t
31590 68 65 6e 20 63 6f 70 69 65 64 20 69 6e 74 6f 20  hen copied into 
315a0 70 50 61 67 65 2d 3e 61 44 61 74 61 0a 2a 2a 20  pPage->aData.** 
315b0 6c 61 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  later..*/.static
315c0 20 69 6e 74 20 66 69 6c 6c 49 6e 43 65 6c 6c 28   int fillInCell(
315d0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
315e0 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
315f0 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74 68    /* The page th
31600 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  at contains the 
31610 63 65 6c 6c 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  cell */.  unsign
31620 65 64 20 63 68 61 72 20 2a 70 43 65 6c 6c 2c 20  ed char *pCell, 
31630 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70           /* Comp
31640 6c 65 74 65 20 74 65 78 74 20 6f 66 20 74 68 65  lete text of the
31650 20 63 65 6c 6c 20 2a 2f 0a 20 20 63 6f 6e 73 74   cell */.  const
31660 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20 69 36 34   void *pKey, i64
31670 20 6e 4b 65 79 2c 20 20 20 20 2f 2a 20 54 68 65   nKey,    /* The
31680 20 6b 65 79 20 2a 2f 0a 20 20 63 6f 6e 73 74 20   key */.  const 
31690 76 6f 69 64 20 2a 70 44 61 74 61 2c 69 6e 74 20  void *pData,int 
316a0 6e 44 61 74 61 2c 20 20 20 2f 2a 20 54 68 65 20  nData,   /* The 
316b0 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 6e 5a  data */.  int nZ
316c0 65 72 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20  ero,            
316d0 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72           /* Extr
316e0 61 20 7a 65 72 6f 20 62 79 74 65 73 20 74 6f 20  a zero bytes to 
316f0 61 70 70 65 6e 64 20 74 6f 20 70 44 61 74 61 20  append to pData 
31700 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 53 69 7a 65  */.  int *pnSize
31710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31720 20 20 20 20 2f 2a 20 57 72 69 74 65 20 63 65 6c      /* Write cel
31730 6c 20 73 69 7a 65 20 68 65 72 65 20 2a 2f 0a 29  l size here */.)
31740 7b 0a 20 20 69 6e 74 20 6e 50 61 79 6c 6f 61 64  {.  int nPayload
31750 3b 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 53  ;.  const u8 *pS
31760 72 63 3b 0a 20 20 69 6e 74 20 6e 53 72 63 2c 20  rc;.  int nSrc, 
31770 6e 2c 20 72 63 3b 0a 20 20 69 6e 74 20 73 70 61  n, rc;.  int spa
31780 63 65 4c 65 66 74 3b 0a 20 20 4d 65 6d 50 61 67  ceLeft;.  MemPag
31790 65 20 2a 70 4f 76 66 6c 20 3d 20 30 3b 0a 20 20  e *pOvfl = 0;.  
317a0 4d 65 6d 50 61 67 65 20 2a 70 54 6f 52 65 6c 65  MemPage *pToRele
317b0 61 73 65 20 3d 20 30 3b 0a 20 20 75 6e 73 69 67  ase = 0;.  unsig
317c0 6e 65 64 20 63 68 61 72 20 2a 70 50 72 69 6f 72  ned char *pPrior
317d0 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ;.  unsigned cha
317e0 72 20 2a 70 50 61 79 6c 6f 61 64 3b 0a 20 20 42  r *pPayload;.  B
317f0 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
31800 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 50 67 6e  Page->pBt;.  Pgn
31810 6f 20 70 67 6e 6f 4f 76 66 6c 20 3d 20 30 3b 0a  o pgnoOvfl = 0;.
31820 20 20 69 6e 74 20 6e 48 65 61 64 65 72 3b 0a 0a    int nHeader;..
31830 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
31840 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
31850 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
31860 29 3b 0a 0a 20 20 2f 2a 20 70 50 61 67 65 20 69  );..  /* pPage i
31870 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c  s not necessaril
31880 79 20 77 72 69 74 65 61 62 6c 65 20 73 69 6e 63  y writeable sinc
31890 65 20 70 43 65 6c 6c 20 6d 69 67 68 74 20 62 65  e pCell might be
318a0 20 61 75 78 69 6c 69 61 72 79 0a 20 20 2a 2a 20   auxiliary.  ** 
318b0 62 75 66 66 65 72 20 73 70 61 63 65 20 74 68 61  buffer space tha
318c0 74 20 69 73 20 73 65 70 61 72 61 74 65 20 66 72  t is separate fr
318d0 6f 6d 20 74 68 65 20 70 50 61 67 65 20 62 75 66  om the pPage buf
318e0 66 65 72 20 61 72 65 61 20 2a 2f 0a 20 20 61 73  fer area */.  as
318f0 73 65 72 74 28 20 70 43 65 6c 6c 3c 70 50 61 67  sert( pCell<pPag
31900 65 2d 3e 61 44 61 74 61 20 7c 7c 20 70 43 65 6c  e->aData || pCel
31910 6c 3e 3d 26 70 50 61 67 65 2d 3e 61 44 61 74 61  l>=&pPage->aData
31920 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d 0a  [pBt->pageSize].
31930 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73              || s
31940 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
31950 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
31960 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 2f 2a 20  bPage) );..  /* 
31970 46 69 6c 6c 20 69 6e 20 74 68 65 20 68 65 61 64  Fill in the head
31980 65 72 2e 20 2a 2f 0a 20 20 6e 48 65 61 64 65 72  er. */.  nHeader
31990 20 3d 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50   = pPage->childP
319a0 74 72 53 69 7a 65 3b 0a 20 20 6e 50 61 79 6c 6f  trSize;.  nPaylo
319b0 61 64 20 3d 20 6e 44 61 74 61 20 2b 20 6e 5a 65  ad = nData + nZe
319c0 72 6f 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d  ro;.  if( pPage-
319d0 3e 69 6e 74 4b 65 79 4c 65 61 66 20 29 7b 0a 20  >intKeyLeaf ){. 
319e0 20 20 20 6e 48 65 61 64 65 72 20 2b 3d 20 70 75     nHeader += pu
319f0 74 56 61 72 69 6e 74 33 32 28 26 70 43 65 6c 6c  tVarint32(&pCell
31a00 5b 6e 48 65 61 64 65 72 5d 2c 20 6e 50 61 79 6c  [nHeader], nPayl
31a10 6f 61 64 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  oad);.  }else{. 
31a20 20 20 20 61 73 73 65 72 74 28 20 6e 44 61 74 61     assert( nData
31a30 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==0 );.    asser
31a40 74 28 20 6e 5a 65 72 6f 3d 3d 30 20 29 3b 0a 20  t( nZero==0 );. 
31a50 20 7d 0a 20 20 6e 48 65 61 64 65 72 20 2b 3d 20   }.  nHeader += 
31a60 70 75 74 56 61 72 69 6e 74 28 26 70 43 65 6c 6c  putVarint(&pCell
31a70 5b 6e 48 65 61 64 65 72 5d 2c 20 2a 28 75 36 34  [nHeader], *(u64
31a80 2a 29 26 6e 4b 65 79 29 3b 0a 20 20 0a 20 20 2f  *)&nKey);.  .  /
31a90 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 70 61  * Fill in the pa
31aa0 79 6c 6f 61 64 20 73 69 7a 65 20 2a 2f 0a 20 20  yload size */.  
31ab0 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65  if( pPage->intKe
31ac0 79 20 29 7b 0a 20 20 20 20 70 53 72 63 20 3d 20  y ){.    pSrc = 
31ad0 70 44 61 74 61 3b 0a 20 20 20 20 6e 53 72 63 20  pData;.    nSrc 
31ae0 3d 20 6e 44 61 74 61 3b 0a 20 20 20 20 6e 44 61  = nData;.    nDa
31af0 74 61 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  ta = 0;.  }else{
31b00 20 0a 20 20 20 20 69 66 28 20 4e 45 56 45 52 28   .    if( NEVER(
31b10 6e 4b 65 79 3e 30 78 37 66 66 66 66 66 66 66 20  nKey>0x7fffffff 
31b20 7c 7c 20 70 4b 65 79 3d 3d 30 29 20 29 7b 0a 20  || pKey==0) ){. 
31b30 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
31b40 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
31b50 0a 20 20 20 20 7d 0a 20 20 20 20 6e 50 61 79 6c  .    }.    nPayl
31b60 6f 61 64 20 3d 20 28 69 6e 74 29 6e 4b 65 79 3b  oad = (int)nKey;
31b70 0a 20 20 20 20 70 53 72 63 20 3d 20 70 4b 65 79  .    pSrc = pKey
31b80 3b 0a 20 20 20 20 6e 53 72 63 20 3d 20 28 69 6e  ;.    nSrc = (in
31b90 74 29 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20 69 66  t)nKey;.  }.  if
31ba0 28 20 6e 50 61 79 6c 6f 61 64 3c 3d 70 50 61 67  ( nPayload<=pPag
31bb0 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20  e->maxLocal ){. 
31bc0 20 20 20 6e 20 3d 20 6e 48 65 61 64 65 72 20 2b     n = nHeader +
31bd0 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20 74   nPayload;.    t
31be0 65 73 74 63 61 73 65 28 20 6e 3d 3d 33 20 29 3b  estcase( n==3 );
31bf0 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e  .    testcase( n
31c00 3d 3d 34 20 29 3b 0a 20 20 20 20 69 66 28 20 6e  ==4 );.    if( n
31c10 3c 34 20 29 20 6e 20 3d 20 34 3b 0a 20 20 20 20  <4 ) n = 4;.    
31c20 2a 70 6e 53 69 7a 65 20 3d 20 6e 3b 0a 20 20 20  *pnSize = n;.   
31c30 20 73 70 61 63 65 4c 65 66 74 20 3d 20 6e 50 61   spaceLeft = nPa
31c40 79 6c 6f 61 64 3b 0a 20 20 20 20 70 50 72 69 6f  yload;.    pPrio
31c50 72 20 3d 20 70 43 65 6c 6c 3b 0a 20 20 7d 65 6c  r = pCell;.  }el
31c60 73 65 7b 0a 20 20 20 20 69 6e 74 20 6d 6e 20 3d  se{.    int mn =
31c70 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c   pPage->minLocal
31c80 3b 0a 20 20 20 20 6e 20 3d 20 6d 6e 20 2b 20 28  ;.    n = mn + (
31c90 6e 50 61 79 6c 6f 61 64 20 2d 20 6d 6e 29 20 25  nPayload - mn) %
31ca0 20 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73   (pPage->pBt->us
31cb0 61 62 6c 65 53 69 7a 65 20 2d 20 34 29 3b 0a 20  ableSize - 4);. 
31cc0 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 3d 3d     testcase( n==
31cd0 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20  pPage->maxLocal 
31ce0 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
31cf0 20 6e 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f   n==pPage->maxLo
31d00 63 61 6c 2b 31 20 29 3b 0a 20 20 20 20 69 66 28  cal+1 );.    if(
31d10 20 6e 20 3e 20 70 50 61 67 65 2d 3e 6d 61 78 4c   n > pPage->maxL
31d20 6f 63 61 6c 20 29 20 6e 20 3d 20 6d 6e 3b 0a 20  ocal ) n = mn;. 
31d30 20 20 20 73 70 61 63 65 4c 65 66 74 20 3d 20 6e     spaceLeft = n
31d40 3b 0a 20 20 20 20 2a 70 6e 53 69 7a 65 20 3d 20  ;.    *pnSize = 
31d50 6e 20 2b 20 6e 48 65 61 64 65 72 20 2b 20 34 3b  n + nHeader + 4;
31d60 0a 20 20 20 20 70 50 72 69 6f 72 20 3d 20 26 70  .    pPrior = &p
31d70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 2b 6e 5d 3b  Cell[nHeader+n];
31d80 0a 20 20 7d 0a 20 20 70 50 61 79 6c 6f 61 64 20  .  }.  pPayload 
31d90 3d 20 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72  = &pCell[nHeader
31da0 5d 3b 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69 73  ];..  /* At this
31db0 20 70 6f 69 6e 74 20 76 61 72 69 61 62 6c 65 73   point variables
31dc0 20 73 68 6f 75 6c 64 20 62 65 20 73 65 74 20 61   should be set a
31dd0 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 2a 2a 0a  s follows:.  **.
31de0 20 20 2a 2a 20 20 20 6e 50 61 79 6c 6f 61 64 20    **   nPayload 
31df0 20 20 20 20 20 20 20 20 20 20 54 6f 74 61 6c 20            Total 
31e00 70 61 79 6c 6f 61 64 20 73 69 7a 65 20 69 6e 20  payload size in 
31e10 62 79 74 65 73 0a 20 20 2a 2a 20 20 20 70 50 61  bytes.  **   pPa
31e20 79 6c 6f 61 64 20 20 20 20 20 20 20 20 20 20 20  yload           
31e30 42 65 67 69 6e 20 77 72 69 74 69 6e 67 20 70 61  Begin writing pa
31e40 79 6c 6f 61 64 20 68 65 72 65 0a 20 20 2a 2a 20  yload here.  ** 
31e50 20 20 73 70 61 63 65 4c 65 66 74 20 20 20 20 20    spaceLeft     
31e60 20 20 20 20 20 53 70 61 63 65 20 61 76 61 69 6c       Space avail
31e70 61 62 6c 65 20 61 74 20 70 50 61 79 6c 6f 61 64  able at pPayload
31e80 2e 20 20 49 66 20 6e 50 61 79 6c 6f 61 64 3e 73  .  If nPayload>s
31e90 70 61 63 65 4c 65 66 74 2c 0a 20 20 2a 2a 20 20  paceLeft,.  **  
31ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31eb0 20 20 20 20 74 68 61 74 20 6d 65 61 6e 73 20 63      that means c
31ec0 6f 6e 74 65 6e 74 20 6d 75 73 74 20 73 70 69 6c  ontent must spil
31ed0 6c 20 69 6e 74 6f 20 6f 76 65 72 66 6c 6f 77 20  l into overflow 
31ee0 70 61 67 65 73 2e 0a 20 20 2a 2a 20 20 20 2a 70  pages..  **   *p
31ef0 6e 53 69 7a 65 20 20 20 20 20 20 20 20 20 20 20  nSize           
31f00 20 53 69 7a 65 20 6f 66 20 74 68 65 20 6c 6f 63   Size of the loc
31f10 61 6c 20 63 65 6c 6c 20 28 6e 6f 74 20 63 6f 75  al cell (not cou
31f20 6e 74 69 6e 67 20 6f 76 65 72 66 6c 6f 77 20 70  nting overflow p
31f30 61 67 65 73 29 0a 20 20 2a 2a 20 20 20 70 50 72  ages).  **   pPr
31f40 69 6f 72 20 20 20 20 20 20 20 20 20 20 20 20 20  ior             
31f50 57 68 65 72 65 20 74 6f 20 77 72 69 74 65 20 74  Where to write t
31f60 68 65 20 70 67 6e 6f 20 6f 66 20 74 68 65 20 66  he pgno of the f
31f70 69 72 73 74 20 6f 76 65 72 66 6c 6f 77 20 70 61  irst overflow pa
31f80 67 65 0a 20 20 2a 2a 0a 20 20 2a 2a 20 55 73 65  ge.  **.  ** Use
31f90 20 61 20 63 61 6c 6c 20 74 6f 20 62 74 72 65 65   a call to btree
31fa0 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29 20 74  ParseCellPtr() t
31fb0 6f 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68  o verify that th
31fc0 65 20 76 61 6c 75 65 73 20 61 62 6f 76 65 0a 20  e values above. 
31fd0 20 2a 2a 20 77 65 72 65 20 63 6f 6d 70 75 74 65   ** were compute
31fe0 64 20 63 6f 72 72 65 63 74 6c 79 2e 0a 20 20 2a  d correctly..  *
31ff0 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 44 45 42  /.#if SQLITE_DEB
32000 55 47 0a 20 20 7b 0a 20 20 20 20 43 65 6c 6c 49  UG.  {.    CellI
32010 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 62 74  nfo info;.    bt
32020 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28  reeParseCellPtr(
32030 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69  pPage, pCell, &i
32040 6e 66 6f 29 3b 0a 20 20 20 20 61 73 73 65 72 74  nfo);.    assert
32050 28 20 6e 48 65 61 64 65 72 3d 28 69 6e 74 29 28  ( nHeader=(int)(
32060 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64 20 2d 20  info.pPayload - 
32070 70 43 65 6c 6c 29 20 29 3b 0a 20 20 20 20 61 73  pCell) );.    as
32080 73 65 72 74 28 20 69 6e 66 6f 2e 6e 4b 65 79 3d  sert( info.nKey=
32090 3d 6e 4b 65 79 20 29 3b 0a 20 20 20 20 61 73 73  =nKey );.    ass
320a0 65 72 74 28 20 2a 70 6e 53 69 7a 65 20 3d 3d 20  ert( *pnSize == 
320b0 69 6e 66 6f 2e 6e 53 69 7a 65 20 29 3b 0a 20 20  info.nSize );.  
320c0 20 20 61 73 73 65 72 74 28 20 73 70 61 63 65 4c    assert( spaceL
320d0 65 66 74 20 3d 3d 20 69 6e 66 6f 2e 6e 4c 6f 63  eft == info.nLoc
320e0 61 6c 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  al );.    assert
320f0 28 20 70 50 72 69 6f 72 20 3d 3d 20 26 70 43 65  ( pPrior == &pCe
32100 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f  ll[info.iOverflo
32110 77 5d 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  w] );.  }.#endif
32120 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65  ..  /* Write the
32130 20 70 61 79 6c 6f 61 64 20 69 6e 74 6f 20 74 68   payload into th
32140 65 20 6c 6f 63 61 6c 20 43 65 6c 6c 20 61 6e 64  e local Cell and
32150 20 61 6e 79 20 65 78 74 72 61 20 69 6e 74 6f 20   any extra into 
32160 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 2a  overflow pages *
32170 2f 0a 20 20 77 68 69 6c 65 28 20 6e 50 61 79 6c  /.  while( nPayl
32180 6f 61 64 3e 30 20 29 7b 0a 20 20 20 20 69 66 28  oad>0 ){.    if(
32190 20 73 70 61 63 65 4c 65 66 74 3d 3d 30 20 29 7b   spaceLeft==0 ){
321a0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
321b0 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
321c0 20 20 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 50        Pgno pgnoP
321d0 74 72 6d 61 70 20 3d 20 70 67 6e 6f 4f 76 66 6c  trmap = pgnoOvfl
321e0 3b 20 2f 2a 20 4f 76 65 72 66 6c 6f 77 20 70 61  ; /* Overflow pa
321f0 67 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65  ge pointer-map e
32200 6e 74 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 20  ntry page */.   
32210 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f     if( pBt->auto
32220 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20  Vacuum ){.      
32230 20 20 64 6f 7b 0a 20 20 20 20 20 20 20 20 20 20    do{.          
32240 70 67 6e 6f 4f 76 66 6c 2b 2b 3b 0a 20 20 20 20  pgnoOvfl++;.    
32250 20 20 20 20 7d 20 77 68 69 6c 65 28 20 0a 20 20      } while( .  
32260 20 20 20 20 20 20 20 20 50 54 52 4d 41 50 5f 49          PTRMAP_I
32270 53 50 41 47 45 28 70 42 74 2c 20 70 67 6e 6f 4f  SPAGE(pBt, pgnoO
32280 76 66 6c 29 20 7c 7c 20 70 67 6e 6f 4f 76 66 6c  vfl) || pgnoOvfl
32290 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  ==PENDING_BYTE_P
322a0 41 47 45 28 70 42 74 29 20 0a 20 20 20 20 20 20  AGE(pBt) .      
322b0 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e    );.      }.#en
322c0 64 69 66 0a 20 20 20 20 20 20 72 63 20 3d 20 61  dif.      rc = a
322d0 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65  llocateBtreePage
322e0 28 70 42 74 2c 20 26 70 4f 76 66 6c 2c 20 26 70  (pBt, &pOvfl, &p
322f0 67 6e 6f 4f 76 66 6c 2c 20 70 67 6e 6f 4f 76 66  gnoOvfl, pgnoOvf
32300 6c 2c 20 30 29 3b 0a 23 69 66 6e 64 65 66 20 53  l, 0);.#ifndef S
32310 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
32320 41 43 55 55 4d 0a 20 20 20 20 20 20 2f 2a 20 49  ACUUM.      /* I
32330 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  f the database s
32340 75 70 70 6f 72 74 73 20 61 75 74 6f 2d 76 61 63  upports auto-vac
32350 75 75 6d 2c 20 61 6e 64 20 74 68 65 20 73 65 63  uum, and the sec
32360 6f 6e 64 20 6f 72 20 73 75 62 73 65 71 75 65 6e  ond or subsequen
32370 74 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65 72 66  t.      ** overf
32380 6c 6f 77 20 70 61 67 65 20 69 73 20 62 65 69 6e  low page is bein
32390 67 20 61 6c 6c 6f 63 61 74 65 64 2c 20 61 64 64  g allocated, add
323a0 20 61 6e 20 65 6e 74 72 79 20 74 6f 20 74 68 65   an entry to the
323b0 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 20   pointer-map.   
323c0 20 20 20 2a 2a 20 66 6f 72 20 74 68 61 74 20 70     ** for that p
323d0 61 67 65 20 6e 6f 77 2e 20 0a 20 20 20 20 20 20  age now. .      
323e0 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 74  **.      ** If t
323f0 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74  his is the first
32400 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20   overflow page, 
32410 74 68 65 6e 20 77 72 69 74 65 20 61 20 70 61 72  then write a par
32420 74 69 61 6c 20 65 6e 74 72 79 20 0a 20 20 20 20  tial entry .    
32430 20 20 2a 2a 20 74 6f 20 74 68 65 20 70 6f 69 6e    ** to the poin
32440 74 65 72 2d 6d 61 70 2e 20 49 66 20 77 65 20 77  ter-map. If we w
32450 72 69 74 65 20 6e 6f 74 68 69 6e 67 20 74 6f 20  rite nothing to 
32460 74 68 69 73 20 70 6f 69 6e 74 65 72 2d 6d 61 70  this pointer-map
32470 20 73 6c 6f 74 2c 0a 20 20 20 20 20 20 2a 2a 20   slot,.      ** 
32480 74 68 65 6e 20 74 68 65 20 6f 70 74 69 6d 69 73  then the optimis
32490 74 69 63 20 6f 76 65 72 66 6c 6f 77 20 63 68 61  tic overflow cha
324a0 69 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 69 6e  in processing in
324b0 20 63 6c 65 61 72 43 65 6c 6c 28 29 0a 20 20 20   clearCell().   
324c0 20 20 20 2a 2a 20 6d 61 79 20 6d 69 73 69 6e 74     ** may misint
324d0 65 72 70 72 65 74 20 74 68 65 20 75 6e 69 6e 69  erpret the unini
324e0 74 69 61 6c 69 7a 65 64 20 76 61 6c 75 65 73 20  tialized values 
324f0 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65 0a 20  and delete the. 
32500 20 20 20 20 20 2a 2a 20 77 72 6f 6e 67 20 70 61       ** wrong pa
32510 67 65 73 20 66 72 6f 6d 20 74 68 65 20 64 61 74  ges from the dat
32520 61 62 61 73 65 2e 0a 20 20 20 20 20 20 2a 2f 0a  abase..      */.
32530 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61        if( pBt->a
32540 75 74 6f 56 61 63 75 75 6d 20 26 26 20 72 63 3d  utoVacuum && rc=
32550 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
32560 20 20 20 20 20 20 75 38 20 65 54 79 70 65 20 3d        u8 eType =
32570 20 28 70 67 6e 6f 50 74 72 6d 61 70 3f 50 54 52   (pgnoPtrmap?PTR
32580 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 3a 50 54  MAP_OVERFLOW2:PT
32590 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 29 3b  RMAP_OVERFLOW1);
325a0 0a 20 20 20 20 20 20 20 20 70 74 72 6d 61 70 50  .        ptrmapP
325b0 75 74 28 70 42 74 2c 20 70 67 6e 6f 4f 76 66 6c  ut(pBt, pgnoOvfl
325c0 2c 20 65 54 79 70 65 2c 20 70 67 6e 6f 50 74 72  , eType, pgnoPtr
325d0 6d 61 70 2c 20 26 72 63 29 3b 0a 20 20 20 20 20  map, &rc);.     
325e0 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
325f0 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
32600 67 65 28 70 4f 76 66 6c 29 3b 0a 20 20 20 20 20  ge(pOvfl);.     
32610 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 65 6e     }.      }.#en
32620 64 69 66 0a 20 20 20 20 20 20 69 66 28 20 72 63  dif.      if( rc
32630 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65   ){.        rele
32640 61 73 65 50 61 67 65 28 70 54 6f 52 65 6c 65 61  asePage(pToRelea
32650 73 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  se);.        ret
32660 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
32670 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 70 54 6f  .      /* If pTo
32680 52 65 6c 65 61 73 65 20 69 73 20 6e 6f 74 20 7a  Release is not z
32690 65 72 6f 20 74 68 61 6e 20 70 50 72 69 6f 72 20  ero than pPrior 
326a0 70 6f 69 6e 74 73 20 69 6e 74 6f 20 74 68 65 20  points into the 
326b0 64 61 74 61 20 61 72 65 61 0a 20 20 20 20 20 20  data area.      
326c0 2a 2a 20 6f 66 20 70 54 6f 52 65 6c 65 61 73 65  ** of pToRelease
326d0 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 70 54 6f  .  Make sure pTo
326e0 52 65 6c 65 61 73 65 20 69 73 20 73 74 69 6c 6c  Release is still
326f0 20 77 72 69 74 65 61 62 6c 65 2e 20 2a 2f 0a 20   writeable. */. 
32700 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 6f       assert( pTo
32710 52 65 6c 65 61 73 65 3d 3d 30 20 7c 7c 20 73 71  Release==0 || sq
32720 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
32730 65 61 62 6c 65 28 70 54 6f 52 65 6c 65 61 73 65  eable(pToRelease
32740 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20  ->pDbPage) );.. 
32750 20 20 20 20 20 2f 2a 20 49 66 20 70 50 72 69 6f       /* If pPrio
32760 72 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65  r is part of the
32770 20 64 61 74 61 20 61 72 65 61 20 6f 66 20 70 50   data area of pP
32780 61 67 65 2c 20 74 68 65 6e 20 6d 61 6b 65 20 73  age, then make s
32790 75 72 65 20 70 50 61 67 65 0a 20 20 20 20 20 20  ure pPage.      
327a0 2a 2a 20 69 73 20 73 74 69 6c 6c 20 77 72 69 74  ** is still writ
327b0 65 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 61  eable */.      a
327c0 73 73 65 72 74 28 20 70 50 72 69 6f 72 3c 70 50  ssert( pPrior<pP
327d0 61 67 65 2d 3e 61 44 61 74 61 20 7c 7c 20 70 50  age->aData || pP
327e0 72 69 6f 72 3e 3d 26 70 50 61 67 65 2d 3e 61 44  rior>=&pPage->aD
327f0 61 74 61 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a  ata[pBt->pageSiz
32800 65 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c  e].            |
32810 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  | sqlite3PagerIs
32820 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
32830 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20  >pDbPage) );..  
32840 20 20 20 20 70 75 74 34 62 79 74 65 28 70 50 72      put4byte(pPr
32850 69 6f 72 2c 20 70 67 6e 6f 4f 76 66 6c 29 3b 0a  ior, pgnoOvfl);.
32860 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
32870 65 28 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20  e(pToRelease);. 
32880 20 20 20 20 20 70 54 6f 52 65 6c 65 61 73 65 20       pToRelease 
32890 3d 20 70 4f 76 66 6c 3b 0a 20 20 20 20 20 20 70  = pOvfl;.      p
328a0 50 72 69 6f 72 20 3d 20 70 4f 76 66 6c 2d 3e 61  Prior = pOvfl->a
328b0 44 61 74 61 3b 0a 20 20 20 20 20 20 70 75 74 34  Data;.      put4
328c0 62 79 74 65 28 70 50 72 69 6f 72 2c 20 30 29 3b  byte(pPrior, 0);
328d0 0a 20 20 20 20 20 20 70 50 61 79 6c 6f 61 64 20  .      pPayload 
328e0 3d 20 26 70 4f 76 66 6c 2d 3e 61 44 61 74 61 5b  = &pOvfl->aData[
328f0 34 5d 3b 0a 20 20 20 20 20 20 73 70 61 63 65 4c  4];.      spaceL
32900 65 66 74 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c  eft = pBt->usabl
32910 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20 20 20 7d  eSize - 4;.    }
32920 0a 20 20 20 20 6e 20 3d 20 6e 50 61 79 6c 6f 61  .    n = nPayloa
32930 64 3b 0a 20 20 20 20 69 66 28 20 6e 3e 73 70 61  d;.    if( n>spa
32940 63 65 4c 65 66 74 20 29 20 6e 20 3d 20 73 70 61  ceLeft ) n = spa
32950 63 65 4c 65 66 74 3b 0a 0a 20 20 20 20 2f 2a 20  ceLeft;..    /* 
32960 49 66 20 70 54 6f 52 65 6c 65 61 73 65 20 69 73  If pToRelease is
32970 20 6e 6f 74 20 7a 65 72 6f 20 74 68 61 6e 20 70   not zero than p
32980 50 61 79 6c 6f 61 64 20 70 6f 69 6e 74 73 20 69  Payload points i
32990 6e 74 6f 20 74 68 65 20 64 61 74 61 20 61 72 65  nto the data are
329a0 61 0a 20 20 20 20 2a 2a 20 6f 66 20 70 54 6f 52  a.    ** of pToR
329b0 65 6c 65 61 73 65 2e 20 20 4d 61 6b 65 20 73 75  elease.  Make su
329c0 72 65 20 70 54 6f 52 65 6c 65 61 73 65 20 69 73  re pToRelease is
329d0 20 73 74 69 6c 6c 20 77 72 69 74 65 61 62 6c 65   still writeable
329e0 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  . */.    assert(
329f0 20 70 54 6f 52 65 6c 65 61 73 65 3d 3d 30 20 7c   pToRelease==0 |
32a00 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  | sqlite3PagerIs
32a10 77 72 69 74 65 61 62 6c 65 28 70 54 6f 52 65 6c  writeable(pToRel
32a20 65 61 73 65 2d 3e 70 44 62 50 61 67 65 29 20 29  ease->pDbPage) )
32a30 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70 50 61  ;..    /* If pPa
32a40 79 6c 6f 61 64 20 69 73 20 70 61 72 74 20 6f 66  yload is part of
32a50 20 74 68 65 20 64 61 74 61 20 61 72 65 61 20 6f   the data area o
32a60 66 20 70 50 61 67 65 2c 20 74 68 65 6e 20 6d 61  f pPage, then ma
32a70 6b 65 20 73 75 72 65 20 70 50 61 67 65 0a 20 20  ke sure pPage.  
32a80 20 20 2a 2a 20 69 73 20 73 74 69 6c 6c 20 77 72    ** is still wr
32a90 69 74 65 61 62 6c 65 20 2a 2f 0a 20 20 20 20 61  iteable */.    a
32aa0 73 73 65 72 74 28 20 70 50 61 79 6c 6f 61 64 3c  ssert( pPayload<
32ab0 70 50 61 67 65 2d 3e 61 44 61 74 61 20 7c 7c 20  pPage->aData || 
32ac0 70 50 61 79 6c 6f 61 64 3e 3d 26 70 50 61 67 65  pPayload>=&pPage
32ad0 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e 70 61 67  ->aData[pBt->pag
32ae0 65 53 69 7a 65 5d 0a 20 20 20 20 20 20 20 20 20  eSize].         
32af0 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67     || sqlite3Pag
32b00 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
32b10 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
32b20 0a 0a 20 20 20 20 69 66 28 20 6e 53 72 63 3e 30  ..    if( nSrc>0
32b30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 3e   ){.      if( n>
32b40 6e 53 72 63 20 29 20 6e 20 3d 20 6e 53 72 63 3b  nSrc ) n = nSrc;
32b50 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
32b60 53 72 63 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d  Src );.      mem
32b70 63 70 79 28 70 50 61 79 6c 6f 61 64 2c 20 70 53  cpy(pPayload, pS
32b80 72 63 2c 20 6e 29 3b 0a 20 20 20 20 7d 65 6c 73  rc, n);.    }els
32b90 65 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28  e{.      memset(
32ba0 70 50 61 79 6c 6f 61 64 2c 20 30 2c 20 6e 29 3b  pPayload, 0, n);
32bb0 0a 20 20 20 20 7d 0a 20 20 20 20 6e 50 61 79 6c  .    }.    nPayl
32bc0 6f 61 64 20 2d 3d 20 6e 3b 0a 20 20 20 20 70 50  oad -= n;.    pP
32bd0 61 79 6c 6f 61 64 20 2b 3d 20 6e 3b 0a 20 20 20  ayload += n;.   
32be0 20 70 53 72 63 20 2b 3d 20 6e 3b 0a 20 20 20 20   pSrc += n;.    
32bf0 6e 53 72 63 20 2d 3d 20 6e 3b 0a 20 20 20 20 73  nSrc -= n;.    s
32c00 70 61 63 65 4c 65 66 74 20 2d 3d 20 6e 3b 0a 20  paceLeft -= n;. 
32c10 20 20 20 69 66 28 20 6e 53 72 63 3d 3d 30 20 29     if( nSrc==0 )
32c20 7b 0a 20 20 20 20 20 20 6e 53 72 63 20 3d 20 6e  {.      nSrc = n
32c30 44 61 74 61 3b 0a 20 20 20 20 20 20 70 53 72 63  Data;.      pSrc
32c40 20 3d 20 70 44 61 74 61 3b 0a 20 20 20 20 7d 0a   = pData;.    }.
32c50 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 50 61 67    }.  releasePag
32c60 65 28 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20  e(pToRelease);. 
32c70 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
32c80 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f  K;.}../*.** Remo
32c90 76 65 20 74 68 65 20 69 2d 74 68 20 63 65 6c 6c  ve the i-th cell
32ca0 20 66 72 6f 6d 20 70 50 61 67 65 2e 20 20 54 68   from pPage.  Th
32cb0 69 73 20 72 6f 75 74 69 6e 65 20 65 66 66 65 63  is routine effec
32cc0 74 73 20 70 50 61 67 65 20 6f 6e 6c 79 2e 0a 2a  ts pPage only..*
32cd0 2a 20 54 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  * The cell conte
32ce0 6e 74 20 69 73 20 6e 6f 74 20 66 72 65 65 64 20  nt is not freed 
32cf0 6f 72 20 64 65 61 6c 6c 6f 63 61 74 65 64 2e 20  or deallocated. 
32d00 20 49 74 20 69 73 20 61 73 73 75 6d 65 64 20 74   It is assumed t
32d10 68 61 74 0a 2a 2a 20 74 68 65 20 63 65 6c 6c 20  hat.** the cell 
32d20 63 6f 6e 74 65 6e 74 20 68 61 73 20 62 65 65 6e  content has been
32d30 20 63 6f 70 69 65 64 20 73 6f 6d 65 70 6c 61 63   copied someplac
32d40 65 20 65 6c 73 65 2e 20 20 54 68 69 73 20 72 6f  e else.  This ro
32d50 75 74 69 6e 65 20 6a 75 73 74 0a 2a 2a 20 72 65  utine just.** re
32d60 6d 6f 76 65 73 20 74 68 65 20 72 65 66 65 72 65  moves the refere
32d70 6e 63 65 20 74 6f 20 74 68 65 20 63 65 6c 6c 20  nce to the cell 
32d80 66 72 6f 6d 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a  from pPage..**.*
32d90 2a 20 22 73 7a 22 20 6d 75 73 74 20 62 65 20 74  * "sz" must be t
32da0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
32db0 65 73 20 69 6e 20 74 68 65 20 63 65 6c 6c 2e 0a  es in the cell..
32dc0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64  */.static void d
32dd0 72 6f 70 43 65 6c 6c 28 4d 65 6d 50 61 67 65 20  ropCell(MemPage 
32de0 2a 70 50 61 67 65 2c 20 69 6e 74 20 69 64 78 2c  *pPage, int idx,
32df0 20 69 6e 74 20 73 7a 2c 20 69 6e 74 20 2a 70 52   int sz, int *pR
32e00 43 29 7b 0a 20 20 75 33 32 20 70 63 3b 20 20 20  C){.  u32 pc;   
32e10 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
32e20 74 6f 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  to cell content 
32e30 6f 66 20 63 65 6c 6c 20 62 65 69 6e 67 20 64 65  of cell being de
32e40 6c 65 74 65 64 20 2a 2f 0a 20 20 75 38 20 2a 64  leted */.  u8 *d
32e50 61 74 61 3b 20 20 20 20 20 20 20 2f 2a 20 70 50  ata;       /* pP
32e60 61 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20  age->aData */.  
32e70 75 38 20 2a 70 74 72 3b 20 20 20 20 20 20 20 20  u8 *ptr;        
32e80 2f 2a 20 55 73 65 64 20 74 6f 20 6d 6f 76 65 20  /* Used to move 
32e90 62 79 74 65 73 20 61 72 6f 75 6e 64 20 77 69 74  bytes around wit
32ea0 68 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20  hin data[] */.  
32eb0 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
32ec0 2f 2a 20 54 68 65 20 72 65 74 75 72 6e 20 63 6f  /* The return co
32ed0 64 65 20 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b  de */.  int hdr;
32ee0 20 20 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e          /* Begin
32ef0 6e 69 6e 67 20 6f 66 20 74 68 65 20 68 65 61 64  ning of the head
32f00 65 72 2e 20 20 30 20 6d 6f 73 74 20 70 61 67 65  er.  0 most page
32f10 73 2e 20 20 31 30 30 20 70 61 67 65 20 31 20 2a  s.  100 page 1 *
32f20 2f 0a 0a 20 20 69 66 28 20 2a 70 52 43 20 29 20  /..  if( *pRC ) 
32f30 72 65 74 75 72 6e 3b 0a 0a 20 20 61 73 73 65 72  return;..  asser
32f40 74 28 20 69 64 78 3e 3d 30 20 26 26 20 69 64 78  t( idx>=0 && idx
32f50 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b  <pPage->nCell );
32f60 0a 20 20 61 73 73 65 72 74 28 20 73 7a 3d 3d 63  .  assert( sz==c
32f70 65 6c 6c 53 69 7a 65 28 70 50 61 67 65 2c 20 69  ellSize(pPage, i
32f80 64 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  dx) );.  assert(
32f90 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
32fa0 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
32fb0 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73  pDbPage) );.  as
32fc0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
32fd0 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
32fe0 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
32ff0 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61   data = pPage->a
33000 44 61 74 61 3b 0a 20 20 70 74 72 20 3d 20 26 70  Data;.  ptr = &p
33010 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64 78 5b 32  Page->aCellIdx[2
33020 2a 69 64 78 5d 3b 0a 20 20 70 63 20 3d 20 67 65  *idx];.  pc = ge
33030 74 32 62 79 74 65 28 70 74 72 29 3b 0a 20 20 68  t2byte(ptr);.  h
33040 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f  dr = pPage->hdrO
33050 66 66 73 65 74 3b 0a 20 20 74 65 73 74 63 61 73  ffset;.  testcas
33060 65 28 20 70 63 3d 3d 67 65 74 32 62 79 74 65 28  e( pc==get2byte(
33070 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 20 29 3b  &data[hdr+5]) );
33080 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 63 2b  .  testcase( pc+
33090 73 7a 3d 3d 70 50 61 67 65 2d 3e 70 42 74 2d 3e  sz==pPage->pBt->
330a0 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20  usableSize );.  
330b0 69 66 28 20 70 63 20 3c 20 28 75 33 32 29 67 65  if( pc < (u32)ge
330c0 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
330d0 2b 35 5d 29 20 7c 7c 20 70 63 2b 73 7a 20 3e 20  +5]) || pc+sz > 
330e0 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
330f0 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 2a 70  leSize ){.    *p
33100 52 43 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  RC = SQLITE_CORR
33110 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65  UPT_BKPT;.    re
33120 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  turn;.  }.  rc =
33130 20 66 72 65 65 53 70 61 63 65 28 70 50 61 67 65   freeSpace(pPage
33140 2c 20 70 63 2c 20 73 7a 29 3b 0a 20 20 69 66 28  , pc, sz);.  if(
33150 20 72 63 20 29 7b 0a 20 20 20 20 2a 70 52 43 20   rc ){.    *pRC 
33160 3d 20 72 63 3b 0a 20 20 20 20 72 65 74 75 72 6e  = rc;.    return
33170 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e 6e  ;.  }.  pPage->n
33180 43 65 6c 6c 2d 2d 3b 0a 20 20 69 66 28 20 70 50  Cell--;.  if( pP
33190 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 7b  age->nCell==0 ){
331a0 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 64 61 74  .    memset(&dat
331b0 61 5b 68 64 72 2b 31 5d 2c 20 30 2c 20 34 29 3b  a[hdr+1], 0, 4);
331c0 0a 20 20 20 20 64 61 74 61 5b 68 64 72 2b 37 5d  .    data[hdr+7]
331d0 20 3d 20 30 3b 0a 20 20 20 20 70 75 74 32 62 79   = 0;.    put2by
331e0 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c  te(&data[hdr+5],
331f0 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61   pPage->pBt->usa
33200 62 6c 65 53 69 7a 65 29 3b 0a 20 20 20 20 70 50  bleSize);.    pP
33210 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20 70 50 61  age->nFree = pPa
33220 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
33230 69 7a 65 20 2d 20 70 50 61 67 65 2d 3e 68 64 72  ize - pPage->hdr
33240 4f 66 66 73 65 74 0a 20 20 20 20 20 20 20 20 20  Offset.         
33250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 20                - 
33260 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53  pPage->childPtrS
33270 69 7a 65 20 2d 20 38 3b 0a 20 20 7d 65 6c 73 65  ize - 8;.  }else
33280 7b 0a 20 20 20 20 6d 65 6d 6d 6f 76 65 28 70 74  {.    memmove(pt
33290 72 2c 20 70 74 72 2b 32 2c 20 32 2a 28 70 50 61  r, ptr+2, 2*(pPa
332a0 67 65 2d 3e 6e 43 65 6c 6c 20 2d 20 69 64 78 29  ge->nCell - idx)
332b0 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65 28  );.    put2byte(
332c0 26 64 61 74 61 5b 68 64 72 2b 33 5d 2c 20 70 50  &data[hdr+3], pP
332d0 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a 20 20 20  age->nCell);.   
332e0 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2b 3d   pPage->nFree +=
332f0 20 32 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   2;.  }.}../*.**
33300 20 49 6e 73 65 72 74 20 61 20 6e 65 77 20 63 65   Insert a new ce
33310 6c 6c 20 6f 6e 20 70 50 61 67 65 20 61 74 20 63  ll on pPage at c
33320 65 6c 6c 20 69 6e 64 65 78 20 22 69 22 2e 20 20  ell index "i".  
33330 70 43 65 6c 6c 20 70 6f 69 6e 74 73 20 74 6f 20  pCell points to 
33340 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f  the.** content o
33350 66 20 74 68 65 20 63 65 6c 6c 2e 0a 2a 2a 0a 2a  f the cell..**.*
33360 2a 20 49 66 20 74 68 65 20 63 65 6c 6c 20 63 6f  * If the cell co
33370 6e 74 65 6e 74 20 77 69 6c 6c 20 66 69 74 20 6f  ntent will fit o
33380 6e 20 74 68 65 20 70 61 67 65 2c 20 74 68 65 6e  n the page, then
33390 20 70 75 74 20 69 74 20 74 68 65 72 65 2e 20 20   put it there.  
333a0 49 66 20 69 74 0a 2a 2a 20 77 69 6c 6c 20 6e 6f  If it.** will no
333b0 74 20 66 69 74 2c 20 74 68 65 6e 20 6d 61 6b 65  t fit, then make
333c0 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 63   a copy of the c
333d0 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 6e 74 6f  ell content into
333e0 20 70 54 65 6d 70 20 69 66 0a 2a 2a 20 70 54 65   pTemp if.** pTe
333f0 6d 70 20 69 73 20 6e 6f 74 20 6e 75 6c 6c 2e 20  mp is not null. 
33400 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20 70   Regardless of p
33410 54 65 6d 70 2c 20 61 6c 6c 6f 63 61 74 65 20 61  Temp, allocate a
33420 20 6e 65 77 20 65 6e 74 72 79 0a 2a 2a 20 69 6e   new entry.** in
33430 20 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c 5b 5d   pPage->apOvfl[]
33440 20 61 6e 64 20 6d 61 6b 65 20 69 74 20 70 6f 69   and make it poi
33450 6e 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 63  nt to the cell c
33460 6f 6e 74 65 6e 74 20 28 65 69 74 68 65 72 0a 2a  ontent (either.*
33470 2a 20 69 6e 20 70 54 65 6d 70 20 6f 72 20 74 68  * in pTemp or th
33480 65 20 6f 72 69 67 69 6e 61 6c 20 70 43 65 6c 6c  e original pCell
33490 29 20 61 6e 64 20 61 6c 73 6f 20 72 65 63 6f 72  ) and also recor
334a0 64 20 69 74 73 20 69 6e 64 65 78 2e 20 0a 2a 2a  d its index. .**
334b0 20 41 6c 6c 6f 63 61 74 69 6e 67 20 61 20 6e 65   Allocating a ne
334c0 77 20 65 6e 74 72 79 20 69 6e 20 70 50 61 67 65  w entry in pPage
334d0 2d 3e 61 43 65 6c 6c 5b 5d 20 69 6d 70 6c 69 65  ->aCell[] implie
334e0 73 20 74 68 61 74 20 0a 2a 2a 20 70 50 61 67 65  s that .** pPage
334f0 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 69 73 20 69  ->nOverflow is i
33500 6e 63 72 65 6d 65 6e 74 65 64 2e 0a 2a 2f 0a 73  ncremented..*/.s
33510 74 61 74 69 63 20 76 6f 69 64 20 69 6e 73 65 72  tatic void inser
33520 74 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65  tCell(.  MemPage
33530 20 2a 70 50 61 67 65 2c 20 20 20 2f 2a 20 50 61   *pPage,   /* Pa
33540 67 65 20 69 6e 74 6f 20 77 68 69 63 68 20 77 65  ge into which we
33550 20 61 72 65 20 63 6f 70 79 69 6e 67 20 2a 2f 0a   are copying */.
33560 20 20 69 6e 74 20 69 2c 20 20 20 20 20 20 20 20    int i,        
33570 20 20 20 20 2f 2a 20 4e 65 77 20 63 65 6c 6c 20      /* New cell 
33580 62 65 63 6f 6d 65 73 20 74 68 65 20 69 2d 74 68  becomes the i-th
33590 20 63 65 6c 6c 20 6f 66 20 74 68 65 20 70 61 67   cell of the pag
335a0 65 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c  e */.  u8 *pCell
335b0 2c 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74  ,        /* Cont
335c0 65 6e 74 20 6f 66 20 74 68 65 20 6e 65 77 20 63  ent of the new c
335d0 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 2c  ell */.  int sz,
335e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79             /* By
335f0 74 65 73 20 6f 66 20 63 6f 6e 74 65 6e 74 20 69  tes of content i
33600 6e 20 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 38 20  n pCell */.  u8 
33610 2a 70 54 65 6d 70 2c 20 20 20 20 20 20 20 20 2f  *pTemp,        /
33620 2a 20 54 65 6d 70 20 73 74 6f 72 61 67 65 20 73  * Temp storage s
33630 70 61 63 65 20 66 6f 72 20 70 43 65 6c 6c 2c 20  pace for pCell, 
33640 69 66 20 6e 65 65 64 65 64 20 2a 2f 0a 20 20 50  if needed */.  P
33650 67 6e 6f 20 69 43 68 69 6c 64 2c 20 20 20 20 20  gno iChild,     
33660 20 2f 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 2c   /* If non-zero,
33670 20 72 65 70 6c 61 63 65 20 66 69 72 73 74 20 34   replace first 4
33680 20 62 79 74 65 73 20 77 69 74 68 20 74 68 69 73   bytes with this
33690 20 76 61 6c 75 65 20 2a 2f 0a 20 20 69 6e 74 20   value */.  int 
336a0 2a 70 52 43 20 20 20 20 20 20 20 20 20 20 2f 2a  *pRC          /*
336b0 20 52 65 61 64 20 61 6e 64 20 77 72 69 74 65 20   Read and write 
336c0 72 65 74 75 72 6e 20 63 6f 64 65 20 66 72 6f 6d  return code from
336d0 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   here */.){.  in
336e0 74 20 69 64 78 20 3d 20 30 3b 20 20 20 20 20 20  t idx = 0;      
336f0 2f 2a 20 57 68 65 72 65 20 74 6f 20 77 72 69 74  /* Where to writ
33700 65 20 6e 65 77 20 63 65 6c 6c 20 63 6f 6e 74 65  e new cell conte
33710 6e 74 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a  nt in data[] */.
33720 20 20 69 6e 74 20 6a 3b 20 20 20 20 20 20 20 20    int j;        
33730 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
33740 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 65 6e 64  ter */.  int end
33750 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69  ;          /* Fi
33760 72 73 74 20 62 79 74 65 20 70 61 73 74 20 74 68  rst byte past th
33770 65 20 6c 61 73 74 20 63 65 6c 6c 20 70 6f 69 6e  e last cell poin
33780 74 65 72 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f  ter in data[] */
33790 0a 20 20 69 6e 74 20 69 6e 73 3b 20 20 20 20 20  .  int ins;     
337a0 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e       /* Index in
337b0 20 64 61 74 61 5b 5d 20 77 68 65 72 65 20 6e 65   data[] where ne
337c0 77 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 69  w cell pointer i
337d0 73 20 69 6e 73 65 72 74 65 64 20 2a 2f 0a 20 20  s inserted */.  
337e0 69 6e 74 20 63 65 6c 6c 4f 66 66 73 65 74 3b 20  int cellOffset; 
337f0 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
33800 66 69 72 73 74 20 63 65 6c 6c 20 70 6f 69 6e 74  first cell point
33810 65 72 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a  er in data[] */.
33820 20 20 75 38 20 2a 64 61 74 61 3b 20 20 20 20 20    u8 *data;     
33830 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 74 65      /* The conte
33840 6e 74 20 6f 66 20 74 68 65 20 77 68 6f 6c 65 20  nt of the whole 
33850 70 61 67 65 20 2a 2f 0a 0a 20 20 69 66 28 20 2a  page */..  if( *
33860 70 52 43 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20  pRC ) return;.. 
33870 20 61 73 73 65 72 74 28 20 69 3e 3d 30 20 26 26   assert( i>=0 &&
33880 20 69 3c 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c   i<=pPage->nCell
33890 2b 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f  +pPage->nOverflo
338a0 77 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 4d  w );.  assert( M
338b0 58 5f 43 45 4c 4c 28 70 50 61 67 65 2d 3e 70 42  X_CELL(pPage->pB
338c0 74 29 3c 3d 31 30 39 32 31 20 29 3b 0a 20 20 61  t)<=10921 );.  a
338d0 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43  ssert( pPage->nC
338e0 65 6c 6c 3c 3d 4d 58 5f 43 45 4c 4c 28 70 50 61  ell<=MX_CELL(pPa
338f0 67 65 2d 3e 70 42 74 29 20 7c 7c 20 43 4f 52 52  ge->pBt) || CORR
33900 55 50 54 5f 44 42 20 29 3b 0a 20 20 61 73 73 65  UPT_DB );.  asse
33910 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72  rt( pPage->nOver
33920 66 6c 6f 77 3c 3d 41 72 72 61 79 53 69 7a 65 28  flow<=ArraySize(
33930 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c 29 20 29  pPage->apOvfl) )
33940 3b 0a 20 20 61 73 73 65 72 74 28 20 41 72 72 61  ;.  assert( Arra
33950 79 53 69 7a 65 28 70 50 61 67 65 2d 3e 61 70 4f  ySize(pPage->apO
33960 76 66 6c 29 3d 3d 41 72 72 61 79 53 69 7a 65 28  vfl)==ArraySize(
33970 70 50 61 67 65 2d 3e 61 69 4f 76 66 6c 29 20 29  pPage->aiOvfl) )
33980 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
33990 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
339a0 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
339b0 29 20 29 3b 0a 20 20 2f 2a 20 54 68 65 20 63 65  ) );.  /* The ce
339c0 6c 6c 20 73 68 6f 75 6c 64 20 6e 6f 72 6d 61 6c  ll should normal
339d0 6c 79 20 62 65 20 73 69 7a 65 64 20 63 6f 72 72  ly be sized corr
339e0 65 63 74 6c 79 2e 20 20 48 6f 77 65 76 65 72 2c  ectly.  However,
339f0 20 77 68 65 6e 20 6d 6f 76 69 6e 67 20 61 0a 20   when moving a. 
33a00 20 2a 2a 20 6d 61 6c 66 6f 72 6d 65 64 20 63 65   ** malformed ce
33a10 6c 6c 20 66 72 6f 6d 20 61 20 6c 65 61 66 20 70  ll from a leaf p
33a20 61 67 65 20 74 6f 20 61 6e 20 69 6e 74 65 72 69  age to an interi
33a30 6f 72 20 70 61 67 65 2c 20 69 66 20 74 68 65 20  or page, if the 
33a40 63 65 6c 6c 20 73 69 7a 65 0a 20 20 2a 2a 20 77  cell size.  ** w
33a50 61 6e 74 65 64 20 74 6f 20 62 65 20 6c 65 73 73  anted to be less
33a60 20 74 68 61 6e 20 34 20 62 75 74 20 67 6f 74 20   than 4 but got 
33a70 72 6f 75 6e 64 65 64 20 75 70 20 74 6f 20 34 20  rounded up to 4 
33a80 6f 6e 20 74 68 65 20 6c 65 61 66 2c 20 74 68 65  on the leaf, the
33a90 6e 20 73 69 7a 65 0a 20 20 2a 2a 20 6d 69 67 68  n size.  ** migh
33aa0 74 20 62 65 20 6c 65 73 73 20 74 68 61 6e 20 38  t be less than 8
33ab0 20 28 6c 65 61 66 2d 73 69 7a 65 20 2b 20 70 6f   (leaf-size + po
33ac0 69 6e 74 65 72 29 20 6f 6e 20 74 68 65 20 69 6e  inter) on the in
33ad0 74 65 72 69 6f 72 20 6e 6f 64 65 2e 20 20 48 65  terior node.  He
33ae0 6e 63 65 0a 20 20 2a 2a 20 74 68 65 20 74 65 72  nce.  ** the ter
33af0 6d 20 61 66 74 65 72 20 74 68 65 20 7c 7c 20 69  m after the || i
33b00 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  n the following 
33b10 61 73 73 65 72 74 28 29 2e 20 2a 2f 0a 20 20 61  assert(). */.  a
33b20 73 73 65 72 74 28 20 73 7a 3d 3d 63 65 6c 6c 53  ssert( sz==cellS
33b30 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20 70 43  izePtr(pPage, pC
33b40 65 6c 6c 29 20 7c 7c 20 28 73 7a 3d 3d 38 20 26  ell) || (sz==8 &
33b50 26 20 69 43 68 69 6c 64 3e 30 29 20 29 3b 0a 20  & iChild>0) );. 
33b60 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65   if( pPage->nOve
33b70 72 66 6c 6f 77 20 7c 7c 20 73 7a 2b 32 3e 70 50  rflow || sz+2>pP
33b80 61 67 65 2d 3e 6e 46 72 65 65 20 29 7b 0a 20 20  age->nFree ){.  
33b90 20 20 69 66 28 20 70 54 65 6d 70 20 29 7b 0a 20    if( pTemp ){. 
33ba0 20 20 20 20 20 6d 65 6d 63 70 79 28 70 54 65 6d       memcpy(pTem
33bb0 70 2c 20 70 43 65 6c 6c 2c 20 73 7a 29 3b 0a 20  p, pCell, sz);. 
33bc0 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 70 54 65       pCell = pTe
33bd0 6d 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  mp;.    }.    if
33be0 28 20 69 43 68 69 6c 64 20 29 7b 0a 20 20 20 20  ( iChild ){.    
33bf0 20 20 70 75 74 34 62 79 74 65 28 70 43 65 6c 6c    put4byte(pCell
33c00 2c 20 69 43 68 69 6c 64 29 3b 0a 20 20 20 20 7d  , iChild);.    }
33c10 0a 20 20 20 20 6a 20 3d 20 70 50 61 67 65 2d 3e  .    j = pPage->
33c20 6e 4f 76 65 72 66 6c 6f 77 2b 2b 3b 0a 20 20 20  nOverflow++;.   
33c30 20 61 73 73 65 72 74 28 20 6a 3c 28 69 6e 74 29   assert( j<(int)
33c40 28 73 69 7a 65 6f 66 28 70 50 61 67 65 2d 3e 61  (sizeof(pPage->a
33c50 70 4f 76 66 6c 29 2f 73 69 7a 65 6f 66 28 70 50  pOvfl)/sizeof(pP
33c60 61 67 65 2d 3e 61 70 4f 76 66 6c 5b 30 5d 29 29  age->apOvfl[0]))
33c70 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 61   );.    pPage->a
33c80 70 4f 76 66 6c 5b 6a 5d 20 3d 20 70 43 65 6c 6c  pOvfl[j] = pCell
33c90 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 61 69 4f  ;.    pPage->aiO
33ca0 76 66 6c 5b 6a 5d 20 3d 20 28 75 31 36 29 69 3b  vfl[j] = (u16)i;
33cb0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
33cc0 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61  t rc = sqlite3Pa
33cd0 67 65 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e  gerWrite(pPage->
33ce0 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66  pDbPage);.    if
33cf0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
33d00 29 7b 0a 20 20 20 20 20 20 2a 70 52 43 20 3d 20  ){.      *pRC = 
33d10 72 63 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  rc;.      return
33d20 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
33d30 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
33d40 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
33d50 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
33d60 20 20 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d     data = pPage-
33d70 3e 61 44 61 74 61 3b 0a 20 20 20 20 63 65 6c 6c  >aData;.    cell
33d80 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65 2d 3e  Offset = pPage->
33d90 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 20 20  cellOffset;.    
33da0 65 6e 64 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74  end = cellOffset
33db0 20 2b 20 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c   + 2*pPage->nCel
33dc0 6c 3b 0a 20 20 20 20 69 6e 73 20 3d 20 63 65 6c  l;.    ins = cel
33dd0 6c 4f 66 66 73 65 74 20 2b 20 32 2a 69 3b 0a 20  lOffset + 2*i;. 
33de0 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65     rc = allocate
33df0 53 70 61 63 65 28 70 50 61 67 65 2c 20 73 7a 2c  Space(pPage, sz,
33e00 20 26 69 64 78 29 3b 0a 20 20 20 20 69 66 28 20   &idx);.    if( 
33e10 72 63 20 29 7b 20 2a 70 52 43 20 3d 20 72 63 3b  rc ){ *pRC = rc;
33e20 20 72 65 74 75 72 6e 3b 20 7d 0a 20 20 20 20 2f   return; }.    /
33e30 2a 20 54 68 65 20 61 6c 6c 6f 63 61 74 65 53 70  * The allocateSp
33e40 61 63 65 28 29 20 72 6f 75 74 69 6e 65 20 67 75  ace() routine gu
33e50 61 72 61 6e 74 65 65 73 20 74 68 65 20 66 6f 6c  arantees the fol
33e60 6c 6f 77 69 6e 67 20 74 77 6f 20 70 72 6f 70 65  lowing two prope
33e70 72 74 69 65 73 0a 20 20 20 20 2a 2a 20 69 66 20  rties.    ** if 
33e80 69 74 20 72 65 74 75 72 6e 73 20 73 75 63 63 65  it returns succe
33e90 73 73 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  ss */.    assert
33ea0 28 20 69 64 78 20 3e 3d 20 65 6e 64 2b 32 20 29  ( idx >= end+2 )
33eb0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 64  ;.    assert( id
33ec0 78 2b 73 7a 20 3c 3d 20 28 69 6e 74 29 70 50 61  x+sz <= (int)pPa
33ed0 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
33ee0 69 7a 65 20 29 3b 0a 20 20 20 20 70 50 61 67 65  ize );.    pPage
33ef0 2d 3e 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 70  ->nCell++;.    p
33f00 50 61 67 65 2d 3e 6e 46 72 65 65 20 2d 3d 20 28  Page->nFree -= (
33f10 75 31 36 29 28 32 20 2b 20 73 7a 29 3b 0a 20 20  u16)(2 + sz);.  
33f20 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b 69    memcpy(&data[i
33f30 64 78 5d 2c 20 70 43 65 6c 6c 2c 20 73 7a 29 3b  dx], pCell, sz);
33f40 0a 20 20 20 20 69 66 28 20 69 43 68 69 6c 64 20  .    if( iChild 
33f50 29 7b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74  ){.      put4byt
33f60 65 28 26 64 61 74 61 5b 69 64 78 5d 2c 20 69 43  e(&data[idx], iC
33f70 68 69 6c 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20  hild);.    }.   
33f80 20 6d 65 6d 6d 6f 76 65 28 26 64 61 74 61 5b 69   memmove(&data[i
33f90 6e 73 2b 32 5d 2c 20 26 64 61 74 61 5b 69 6e 73  ns+2], &data[ins
33fa0 5d 2c 20 65 6e 64 2d 69 6e 73 29 3b 0a 20 20 20  ], end-ins);.   
33fb0 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
33fc0 69 6e 73 5d 2c 20 69 64 78 29 3b 0a 20 20 20 20  ins], idx);.    
33fd0 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 70  put2byte(&data[p
33fe0 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
33ff0 33 5d 2c 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  3], pPage->nCell
34000 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
34010 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
34020 4d 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d  M.    if( pPage-
34030 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d  >pBt->autoVacuum
34040 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65   ){.      /* The
34050 20 63 65 6c 6c 20 6d 61 79 20 63 6f 6e 74 61 69   cell may contai
34060 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  n a pointer to a
34070 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e  n overflow page.
34080 20 49 66 20 73 6f 2c 20 77 72 69 74 65 0a 20 20   If so, write.  
34090 20 20 20 20 2a 2a 20 74 68 65 20 65 6e 74 72 79      ** the entry
340a0 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f   for the overflo
340b0 77 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20  w page into the 
340c0 70 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 20 20 20  pointer map..   
340d0 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 74 72 6d     */.      ptrm
340e0 61 70 50 75 74 4f 76 66 6c 50 74 72 28 70 50 61  apPutOvflPtr(pPa
340f0 67 65 2c 20 70 43 65 6c 6c 2c 20 70 52 43 29 3b  ge, pCell, pRC);
34100 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
34110 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 72 61 79  }.}../*.** Array
34120 20 61 70 43 65 6c 6c 5b 5d 20 63 6f 6e 74 61 69   apCell[] contai
34130 6e 73 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 6e  ns pointers to n
34140 43 65 6c 6c 20 62 2d 74 72 65 65 20 70 61 67 65  Cell b-tree page
34150 20 63 65 6c 6c 73 2e 20 54 68 65 20 0a 2a 2a 20   cells. The .** 
34160 73 7a 43 65 6c 6c 5b 5d 20 61 72 72 61 79 20 63  szCell[] array c
34170 6f 6e 74 61 69 6e 73 20 74 68 65 20 73 69 7a 65  ontains the size
34180 20 69 6e 20 62 79 74 65 73 20 6f 66 20 65 61 63   in bytes of eac
34190 68 20 63 65 6c 6c 2e 20 54 68 69 73 20 66 75 6e  h cell. This fun
341a0 63 74 69 6f 6e 0a 2a 2a 20 72 65 70 6c 61 63 65  ction.** replace
341b0 73 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f  s the current co
341c0 6e 74 65 6e 74 73 20 6f 66 20 70 61 67 65 20 70  ntents of page p
341d0 50 67 20 77 69 74 68 20 74 68 65 20 63 6f 6e 74  Pg with the cont
341e0 65 6e 74 73 20 6f 66 20 74 68 65 20 63 65 6c 6c  ents of the cell
341f0 0a 2a 2a 20 61 72 72 61 79 2e 0a 2a 2a 0a 2a 2a  .** array..**.**
34200 20 53 6f 6d 65 20 6f 66 20 74 68 65 20 63 65 6c   Some of the cel
34210 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 6d  ls in apCell[] m
34220 61 79 20 63 75 72 72 65 6e 74 6c 79 20 62 65 20  ay currently be 
34230 73 74 6f 72 65 64 20 69 6e 20 70 50 67 2e 20 54  stored in pPg. T
34240 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  his.** function 
34250 77 6f 72 6b 73 20 61 72 6f 75 6e 64 20 70 72 6f  works around pro
34260 62 6c 65 6d 73 20 63 61 75 73 65 64 20 62 79 20  blems caused by 
34270 74 68 69 73 20 62 79 20 6d 61 6b 69 6e 67 20 61  this by making a
34280 20 63 6f 70 79 20 6f 66 20 61 6e 79 20 0a 2a 2a   copy of any .**
34290 20 73 75 63 68 20 63 65 6c 6c 73 20 62 65 66 6f   such cells befo
342a0 72 65 20 6f 76 65 72 77 72 69 74 69 6e 67 20 74  re overwriting t
342b0 68 65 20 70 61 67 65 20 64 61 74 61 2e 0a 2a 2a  he page data..**
342c0 0a 2a 2a 20 54 68 65 20 4d 65 6d 50 61 67 65 2e  .** The MemPage.
342d0 6e 46 72 65 65 20 66 69 65 6c 64 20 69 73 20 69  nFree field is i
342e0 6e 76 61 6c 69 64 61 74 65 64 20 62 79 20 74 68  nvalidated by th
342f0 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 49 74 20  is function. It 
34300 69 73 20 74 68 65 20 0a 2a 2a 20 72 65 73 70 6f  is the .** respo
34310 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65  nsibility of the
34320 20 63 61 6c 6c 65 72 20 74 6f 20 73 65 74 20 69   caller to set i
34330 74 20 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2f 0a  t correctly..*/.
34340 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 62 75  static void rebu
34350 69 6c 64 50 61 67 65 28 0a 20 20 4d 65 6d 50 61  ildPage(.  MemPa
34360 67 65 20 2a 70 50 67 2c 20 20 20 20 20 20 20 20  ge *pPg,        
34370 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 64             /* Ed
34380 69 74 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a  it this page */.
34390 20 20 69 6e 74 20 6e 43 65 6c 6c 2c 20 20 20 20    int nCell,    
343a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
343b0 20 20 2f 2a 20 46 69 6e 61 6c 20 6e 75 6d 62 65    /* Final numbe
343c0 72 20 6f 66 20 63 65 6c 6c 73 20 6f 6e 20 70 61  r of cells on pa
343d0 67 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43  ge */.  u8 **apC
343e0 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  ell,            
343f0 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79          /* Array
34400 20 6f 66 20 63 65 6c 6c 73 20 2a 2f 0a 20 20 75   of cells */.  u
34410 31 36 20 2a 73 7a 43 65 6c 6c 20 20 20 20 20 20  16 *szCell      
34420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
34430 2a 20 41 72 72 61 79 20 6f 66 20 63 65 6c 6c 20  * Array of cell 
34440 73 69 7a 65 73 20 2a 2f 0a 29 7b 0a 20 20 63 6f  sizes */.){.  co
34450 6e 73 74 20 69 6e 74 20 68 64 72 20 3d 20 70 50  nst int hdr = pP
34460 67 2d 3e 68 64 72 4f 66 66 73 65 74 3b 20 20 20  g->hdrOffset;   
34470 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
34480 20 6f 66 20 68 65 61 64 65 72 20 6f 6e 20 70 50   of header on pP
34490 67 20 2a 2f 0a 20 20 75 38 20 2a 20 63 6f 6e 73  g */.  u8 * cons
344a0 74 20 61 44 61 74 61 20 3d 20 70 50 67 2d 3e 61  t aData = pPg->a
344b0 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20  Data;           
344c0 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 64 61  /* Pointer to da
344d0 74 61 20 66 6f 72 20 70 50 67 20 2a 2f 0a 20 20  ta for pPg */.  
344e0 63 6f 6e 73 74 20 69 6e 74 20 75 73 61 62 6c 65  const int usable
344f0 53 69 7a 65 20 3d 20 70 50 67 2d 3e 70 42 74 2d  Size = pPg->pBt-
34500 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 75  >usableSize;.  u
34510 38 20 2a 20 63 6f 6e 73 74 20 70 45 6e 64 20 3d  8 * const pEnd =
34520 20 26 61 44 61 74 61 5b 75 73 61 62 6c 65 53 69   &aData[usableSi
34530 7a 65 5d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  ze];.  int i;.  
34540 75 38 20 2a 70 43 65 6c 6c 70 74 72 20 3d 20 70  u8 *pCellptr = p
34550 50 67 2d 3e 61 43 65 6c 6c 49 64 78 3b 0a 20 20  Pg->aCellIdx;.  
34560 75 38 20 2a 70 54 6d 70 20 3d 20 73 71 6c 69 74  u8 *pTmp = sqlit
34570 65 33 50 61 67 65 72 54 65 6d 70 53 70 61 63 65  e3PagerTempSpace
34580 28 70 50 67 2d 3e 70 42 74 2d 3e 70 50 61 67 65  (pPg->pBt->pPage
34590 72 29 3b 0a 20 20 75 38 20 2a 70 44 61 74 61 3b  r);.  u8 *pData;
345a0 0a 0a 20 20 69 20 3d 20 67 65 74 32 62 79 74 65  ..  i = get2byte
345b0 28 26 61 44 61 74 61 5b 68 64 72 2b 35 5d 29 3b  (&aData[hdr+5]);
345c0 0a 20 20 6d 65 6d 63 70 79 28 26 70 54 6d 70 5b  .  memcpy(&pTmp[
345d0 69 5d 2c 20 26 61 44 61 74 61 5b 69 5d 2c 20 75  i], &aData[i], u
345e0 73 61 62 6c 65 53 69 7a 65 20 2d 20 69 29 3b 0a  sableSize - i);.
345f0 0a 20 20 70 44 61 74 61 20 3d 20 70 45 6e 64 3b  .  pData = pEnd;
34600 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43  .  for(i=0; i<nC
34610 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75  ell; i++){.    u
34620 38 20 2a 70 43 65 6c 6c 20 3d 20 61 70 43 65 6c  8 *pCell = apCel
34630 6c 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 43  l[i];.    if( pC
34640 65 6c 6c 3e 61 44 61 74 61 20 26 26 20 70 43 65  ell>aData && pCe
34650 6c 6c 3c 70 45 6e 64 20 29 7b 0a 20 20 20 20 20  ll<pEnd ){.     
34660 20 70 43 65 6c 6c 20 3d 20 26 70 54 6d 70 5b 70   pCell = &pTmp[p
34670 43 65 6c 6c 20 2d 20 61 44 61 74 61 5d 3b 0a 20  Cell - aData];. 
34680 20 20 20 7d 0a 20 20 20 20 70 44 61 74 61 20 2d     }.    pData -
34690 3d 20 73 7a 43 65 6c 6c 5b 69 5d 3b 0a 20 20 20  = szCell[i];.   
346a0 20 6d 65 6d 63 70 79 28 70 44 61 74 61 2c 20 70   memcpy(pData, p
346b0 43 65 6c 6c 2c 20 73 7a 43 65 6c 6c 5b 69 5d 29  Cell, szCell[i])
346c0 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 70  ;.    put2byte(p
346d0 43 65 6c 6c 70 74 72 2c 20 28 70 44 61 74 61 20  Cellptr, (pData 
346e0 2d 20 61 44 61 74 61 29 29 3b 0a 20 20 20 20 70  - aData));.    p
346f0 43 65 6c 6c 70 74 72 20 2b 3d 20 32 3b 0a 20 20  Cellptr += 2;.  
34700 20 20 61 73 73 65 72 74 28 20 73 7a 43 65 6c 6c    assert( szCell
34710 5b 69 5d 3d 3d 63 65 6c 6c 53 69 7a 65 50 74 72  [i]==cellSizePtr
34720 28 70 50 67 2c 20 70 43 65 6c 6c 29 20 29 3b 0a  (pPg, pCell) );.
34730 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 70 50    }..  /* The pP
34740 67 2d 3e 6e 46 72 65 65 20 66 69 65 6c 64 20 69  g->nFree field i
34750 73 20 6e 6f 77 20 73 65 74 20 69 6e 63 6f 72 72  s now set incorr
34760 65 63 74 6c 79 2e 20 54 68 65 20 63 61 6c 6c 65  ectly. The calle
34770 72 20 77 69 6c 6c 20 66 69 78 20 69 74 2e 20 2a  r will fix it. *
34780 2f 0a 20 20 70 50 67 2d 3e 6e 43 65 6c 6c 20 3d  /.  pPg->nCell =
34790 20 6e 43 65 6c 6c 3b 0a 20 20 70 50 67 2d 3e 6e   nCell;.  pPg->n
347a0 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 0a 20  Overflow = 0;.. 
347b0 20 70 75 74 32 62 79 74 65 28 26 61 44 61 74 61   put2byte(&aData
347c0 5b 68 64 72 2b 31 5d 2c 20 30 29 3b 0a 20 20 70  [hdr+1], 0);.  p
347d0 75 74 32 62 79 74 65 28 26 61 44 61 74 61 5b 68  ut2byte(&aData[h
347e0 64 72 2b 33 5d 2c 20 70 50 67 2d 3e 6e 43 65 6c  dr+3], pPg->nCel
347f0 6c 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26  l);.  put2byte(&
34800 61 44 61 74 61 5b 68 64 72 2b 35 5d 2c 20 70 44  aData[hdr+5], pD
34810 61 74 61 20 2d 20 61 44 61 74 61 29 3b 0a 20 20  ata - aData);.  
34820 61 44 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30  aData[hdr+7] = 0
34830 78 30 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72  x00;.}../*.** Ar
34840 72 61 79 20 61 70 43 65 6c 6c 5b 5d 20 63 6f 6e  ray apCell[] con
34850 74 61 69 6e 73 20 6e 43 65 6c 6c 20 70 6f 69 6e  tains nCell poin
34860 74 65 72 73 20 74 6f 20 62 2d 74 72 65 65 20 63  ters to b-tree c
34870 65 6c 6c 73 2e 20 41 72 72 61 79 20 73 7a 43 65  ells. Array szCe
34880 6c 6c 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 74  ll.** contains t
34890 68 65 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73  he size in bytes
348a0 20 6f 66 20 65 61 63 68 20 73 75 63 68 20 63 65   of each such ce
348b0 6c 6c 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  ll. This functio
348c0 6e 20 61 74 74 65 6d 70 74 73 20 74 6f 20 0a 2a  n attempts to .*
348d0 2a 20 61 64 64 20 74 68 65 20 63 65 6c 6c 73 20  * add the cells 
348e0 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 61 72  stored in the ar
348f0 72 61 79 20 74 6f 20 70 61 67 65 20 70 50 67 2e  ray to page pPg.
34900 20 49 66 20 69 74 20 63 61 6e 6e 6f 74 20 28 62   If it cannot (b
34910 65 63 61 75 73 65 20 0a 2a 2a 20 74 68 65 20 70  ecause .** the p
34920 61 67 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20  age needs to be 
34930 64 65 66 72 61 67 6d 65 6e 74 65 64 20 62 65 66  defragmented bef
34940 6f 72 65 20 74 68 65 20 63 65 6c 6c 73 20 77 69  ore the cells wi
34950 6c 6c 20 66 69 74 29 2c 20 6e 6f 6e 2d 7a 65 72  ll fit), non-zer
34960 6f 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64  o.** is returned
34970 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  . Otherwise, if 
34980 74 68 65 20 63 65 6c 6c 73 20 61 72 65 20 61 64  the cells are ad
34990 64 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79  ded successfully
349a0 2c 20 7a 65 72 6f 20 69 73 0a 2a 2a 20 72 65 74  , zero is.** ret
349b0 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 72 67  urned..**.** Arg
349c0 75 6d 65 6e 74 20 70 43 65 6c 6c 70 74 72 20 70  ument pCellptr p
349d0 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 66 69 72  oints to the fir
349e0 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  st entry in the 
349f0 63 65 6c 6c 2d 70 6f 69 6e 74 65 72 20 61 72 72  cell-pointer arr
34a00 61 79 0a 2a 2a 20 28 70 61 72 74 20 6f 66 20 70  ay.** (part of p
34a10 61 67 65 20 70 50 67 29 20 74 6f 20 70 6f 70 75  age pPg) to popu
34a20 6c 61 74 65 2e 20 41 66 74 65 72 20 63 65 6c 6c  late. After cell
34a30 20 61 70 43 65 6c 6c 5b 30 5d 20 69 73 20 77 72   apCell[0] is wr
34a40 69 74 74 65 6e 20 74 6f 20 74 68 65 0a 2a 2a 20  itten to the.** 
34a50 70 61 67 65 20 62 6f 64 79 2c 20 61 20 31 36 2d  page body, a 16-
34a60 62 69 74 20 6f 66 66 73 65 74 20 69 73 20 77 72  bit offset is wr
34a70 69 74 74 65 6e 20 74 6f 20 70 43 65 6c 6c 70 74  itten to pCellpt
34a80 72 2e 20 41 6e 64 20 73 6f 20 6f 6e 2c 20 66 6f  r. And so on, fo
34a90 72 20 65 61 63 68 0a 2a 2a 20 63 65 6c 6c 20 69  r each.** cell i
34aa0 6e 20 74 68 65 20 61 72 72 61 79 2e 20 49 74 20  n the array. It 
34ab0 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62  is the responsib
34ac0 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c  ility of the cal
34ad0 6c 65 72 20 74 6f 20 65 6e 73 75 72 65 0a 2a 2a  ler to ensure.**
34ae0 20 74 68 61 74 20 69 74 20 69 73 20 73 61 66 65   that it is safe
34af0 20 74 6f 20 6f 76 65 72 77 72 69 74 65 20 74 68   to overwrite th
34b00 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 63  is part of the c
34b10 65 6c 6c 2d 70 6f 69 6e 74 65 72 20 61 72 72 61  ell-pointer arra
34b20 79 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68  y..**.** When th
34b30 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
34b40 61 6c 6c 65 64 2c 20 2a 70 70 44 61 74 61 20 70  alled, *ppData p
34b50 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 73 74 61  oints to the sta
34b60 72 74 20 6f 66 20 74 68 65 20 0a 2a 2a 20 63 6f  rt of the .** co
34b70 6e 74 65 6e 74 20 61 72 65 61 20 6f 6e 20 70 61  ntent area on pa
34b80 67 65 20 70 50 67 2e 20 49 66 20 74 68 65 20 73  ge pPg. If the s
34b90 69 7a 65 20 6f 66 20 74 68 65 20 63 6f 6e 74 65  ize of the conte
34ba0 6e 74 20 61 72 65 61 20 69 73 20 65 78 74 65 6e  nt area is exten
34bb0 64 65 64 2c 0a 2a 2a 20 2a 70 70 44 61 74 61 20  ded,.** *ppData 
34bc0 69 73 20 75 70 64 61 74 65 64 20 74 6f 20 70 6f  is updated to po
34bd0 69 6e 74 20 74 6f 20 74 68 65 20 6e 65 77 20 73  int to the new s
34be0 74 61 72 74 20 6f 66 20 74 68 65 20 63 6f 6e 74  tart of the cont
34bf0 65 6e 74 20 61 72 65 61 0a 2a 2a 20 62 65 66 6f  ent area.** befo
34c00 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a  re returning..**
34c10 0a 2a 2a 20 46 69 6e 61 6c 6c 79 2c 20 61 72 67  .** Finally, arg
34c20 75 6d 65 6e 74 20 70 42 65 67 69 6e 20 70 6f 69  ument pBegin poi
34c30 6e 74 73 20 74 6f 20 74 68 65 20 62 79 74 65 20  nts to the byte 
34c40 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c  immediately foll
34c50 6f 77 69 6e 67 20 74 68 65 0a 2a 2a 20 65 6e 64  owing the.** end
34c60 20 6f 66 20 74 68 65 20 73 70 61 63 65 20 72 65   of the space re
34c70 71 75 69 72 65 64 20 62 79 20 74 68 69 73 20 70  quired by this p
34c80 61 67 65 20 66 6f 72 20 74 68 65 20 63 65 6c 6c  age for the cell
34c90 2d 70 6f 69 6e 74 65 72 20 61 72 65 61 20 28 66  -pointer area (f
34ca0 6f 72 0a 2a 2a 20 61 6c 6c 20 63 65 6c 6c 73 20  or.** all cells 
34cb0 2d 20 6e 6f 74 20 6a 75 73 74 20 74 68 6f 73 65  - not just those
34cc0 20 69 6e 73 65 72 74 65 64 20 62 79 20 74 68 65   inserted by the
34cd0 20 63 75 72 72 65 6e 74 20 63 61 6c 6c 29 2e 20   current call). 
34ce0 49 66 20 74 68 65 20 63 6f 6e 74 65 6e 74 0a 2a  If the content.*
34cf0 2a 20 61 72 65 61 20 6d 75 73 74 20 62 65 20 65  * area must be e
34d00 78 74 65 6e 64 65 64 20 74 6f 20 62 65 66 6f 72  xtended to befor
34d10 65 20 74 68 69 73 20 70 6f 69 6e 74 20 69 6e 20  e this point in 
34d20 6f 72 64 65 72 20 74 6f 20 61 63 63 6f 6d 6f 64  order to accomod
34d30 61 74 65 20 61 6c 6c 0a 2a 2a 20 63 65 6c 6c 73  ate all.** cells
34d40 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 2c 20 74 68   in apCell[], th
34d50 65 6e 20 74 68 65 20 63 65 6c 6c 73 20 64 6f 20  en the cells do 
34d60 6e 6f 74 20 66 69 74 20 61 6e 64 20 6e 6f 6e 2d  not fit and non-
34d70 7a 65 72 6f 20 69 73 20 72 65 74 75 72 6e 65 64  zero is returned
34d80 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
34d90 70 61 67 65 49 6e 73 65 72 74 41 72 72 61 79 28  pageInsertArray(
34da0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 67 2c  .  MemPage *pPg,
34db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34dc0 20 20 20 2f 2a 20 50 61 67 65 20 74 6f 20 61 64     /* Page to ad
34dd0 64 20 63 65 6c 6c 73 20 74 6f 20 2a 2f 0a 20 20  d cells to */.  
34de0 75 38 20 2a 70 42 65 67 69 6e 2c 20 20 20 20 20  u8 *pBegin,     
34df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34e00 2f 2a 20 45 6e 64 20 6f 66 20 63 65 6c 6c 2d 70  /* End of cell-p
34e10 6f 69 6e 74 65 72 20 61 72 72 61 79 20 2a 2f 0a  ointer array */.
34e20 20 20 75 38 20 2a 2a 70 70 44 61 74 61 2c 20 20    u8 **ppData,  
34e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34e40 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 50 61 67    /* IN/OUT: Pag
34e50 65 20 63 6f 6e 74 65 6e 74 20 2d 61 72 65 61 20  e content -area 
34e60 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 75 38 20  pointer */.  u8 
34e70 2a 70 43 65 6c 6c 70 74 72 2c 20 20 20 20 20 20  *pCellptr,      
34e80 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
34e90 50 6f 69 6e 74 65 72 20 74 6f 20 63 65 6c 6c 2d  Pointer to cell-
34ea0 70 6f 69 6e 74 65 72 20 61 72 65 61 20 2a 2f 0a  pointer area */.
34eb0 20 20 69 6e 74 20 6e 43 65 6c 6c 2c 20 20 20 20    int nCell,    
34ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34ed0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
34ee0 65 6c 6c 73 20 74 6f 20 61 64 64 20 74 6f 20 70  ells to add to p
34ef0 50 67 20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43  Pg */.  u8 **apC
34f00 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  ell,            
34f10 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79          /* Array
34f20 20 6f 66 20 63 65 6c 6c 73 20 2a 2f 0a 20 20 75   of cells */.  u
34f30 31 36 20 2a 73 7a 43 65 6c 6c 20 20 20 20 20 20  16 *szCell      
34f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
34f50 2a 20 41 72 72 61 79 20 6f 66 20 63 65 6c 6c 20  * Array of cell 
34f60 73 69 7a 65 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e  sizes */.){.  in
34f70 74 20 69 3b 0a 20 20 75 38 20 2a 61 44 61 74 61  t i;.  u8 *aData
34f80 20 3d 20 70 50 67 2d 3e 61 44 61 74 61 3b 0a 20   = pPg->aData;. 
34f90 20 75 38 20 2a 70 44 61 74 61 20 3d 20 2a 70 70   u8 *pData = *pp
34fa0 44 61 74 61 3b 0a 20 20 63 6f 6e 73 74 20 69 6e  Data;.  const in
34fb0 74 20 62 46 72 65 65 6c 69 73 74 20 3d 20 61 44  t bFreelist = aD
34fc0 61 74 61 5b 31 5d 20 7c 7c 20 61 44 61 74 61 5b  ata[1] || aData[
34fd0 32 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 43 4f  2];.  assert( CO
34fe0 52 52 55 50 54 5f 44 42 20 7c 7c 20 70 50 67 2d  RRUPT_DB || pPg-
34ff0 3e 68 64 72 4f 66 66 73 65 74 3d 3d 30 20 29 3b  >hdrOffset==0 );
35000 20 20 20 20 2f 2a 20 4e 65 76 65 72 20 63 61 6c      /* Never cal
35010 6c 65 64 20 6f 6e 20 70 61 67 65 20 31 20 2a 2f  led on page 1 */
35020 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43  .  for(i=0; i<nC
35030 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  ell; i++){.    i
35040 6e 74 20 73 7a 20 3d 20 73 7a 43 65 6c 6c 5b 69  nt sz = szCell[i
35050 5d 3b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20  ];.    int rc;. 
35060 20 20 20 75 38 20 2a 70 53 6c 6f 74 3b 0a 20 20     u8 *pSlot;.  
35070 20 20 69 66 28 20 62 46 72 65 65 6c 69 73 74 3d    if( bFreelist=
35080 3d 30 20 7c 7c 20 28 70 53 6c 6f 74 20 3d 20 70  =0 || (pSlot = p
35090 61 67 65 46 69 6e 64 53 6c 6f 74 28 70 50 67 2c  ageFindSlot(pPg,
350a0 20 73 7a 2c 20 26 72 63 2c 20 30 29 29 3d 3d 30   sz, &rc, 0))==0
350b0 20 29 7b 0a 20 20 20 20 20 20 70 44 61 74 61 20   ){.      pData 
350c0 2d 3d 20 73 7a 3b 0a 20 20 20 20 20 20 69 66 28  -= sz;.      if(
350d0 20 70 44 61 74 61 3c 70 42 65 67 69 6e 20 29 20   pData<pBegin ) 
350e0 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
350f0 70 53 6c 6f 74 20 3d 20 70 44 61 74 61 3b 0a 20  pSlot = pData;. 
35100 20 20 20 7d 0a 20 20 20 20 6d 65 6d 63 70 79 28     }.    memcpy(
35110 70 53 6c 6f 74 2c 20 61 70 43 65 6c 6c 5b 69 5d  pSlot, apCell[i]
35120 2c 20 73 7a 29 3b 0a 20 20 20 20 70 75 74 32 62  , sz);.    put2b
35130 79 74 65 28 70 43 65 6c 6c 70 74 72 2c 20 28 70  yte(pCellptr, (p
35140 53 6c 6f 74 20 2d 20 61 44 61 74 61 29 29 3b 0a  Slot - aData));.
35150 20 20 20 20 70 43 65 6c 6c 70 74 72 20 2b 3d 20      pCellptr += 
35160 32 3b 0a 20 20 7d 0a 20 20 2a 70 70 44 61 74 61  2;.  }.  *ppData
35170 20 3d 20 70 44 61 74 61 3b 0a 20 20 72 65 74 75   = pData;.  retu
35180 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  rn 0;.}../*.** A
35190 72 72 61 79 20 61 70 43 65 6c 6c 5b 5d 20 63 6f  rray apCell[] co
351a0 6e 74 61 69 6e 73 20 6e 43 65 6c 6c 20 70 6f 69  ntains nCell poi
351b0 6e 74 65 72 73 20 74 6f 20 62 2d 74 72 65 65 20  nters to b-tree 
351c0 63 65 6c 6c 73 2e 20 41 72 72 61 79 20 73 7a 43  cells. Array szC
351d0 65 6c 6c 20 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73  ell .** contains
351e0 20 74 68 65 20 73 69 7a 65 20 69 6e 20 62 79 74   the size in byt
351f0 65 73 20 6f 66 20 65 61 63 68 20 73 75 63 68 20  es of each such 
35200 63 65 6c 6c 2e 20 54 68 69 73 20 66 75 6e 63 74  cell. This funct
35210 69 6f 6e 20 61 64 64 73 20 74 68 65 0a 2a 2a 20  ion adds the.** 
35220 73 70 61 63 65 20 61 73 73 6f 63 69 61 74 65 64  space associated
35230 20 77 69 74 68 20 65 61 63 68 20 63 65 6c 6c 20   with each cell 
35240 69 6e 20 74 68 65 20 61 72 72 61 79 20 74 68 61  in the array tha
35250 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 73  t is currently s
35260 74 6f 72 65 64 20 0a 2a 2a 20 77 69 74 68 69 6e  tored .** within
35270 20 74 68 65 20 62 6f 64 79 20 6f 66 20 70 50 67   the body of pPg
35280 20 74 6f 20 74 68 65 20 70 50 67 20 66 72 65 65   to the pPg free
35290 2d 6c 69 73 74 2e 20 54 68 65 20 63 65 6c 6c 2d  -list. The cell-
352a0 70 6f 69 6e 74 65 72 73 20 61 6e 64 20 6f 74 68  pointers and oth
352b0 65 72 0a 2a 2a 20 66 69 65 6c 64 73 20 6f 66 20  er.** fields of 
352c0 74 68 65 20 70 61 67 65 20 61 72 65 20 6e 6f 74  the page are not
352d0 20 75 70 64 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20   updated..**.** 
352e0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  This function re
352f0 74 75 72 6e 73 20 74 68 65 20 74 6f 74 61 6c 20  turns the total 
35300 6e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20  number of cells 
35310 61 64 64 65 64 20 74 6f 20 74 68 65 20 66 72 65  added to the fre
35320 65 2d 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69  e-list..*/.stati
35330 63 20 69 6e 74 20 70 61 67 65 46 72 65 65 41 72  c int pageFreeAr
35340 72 61 79 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a  ray(.  MemPage *
35350 70 50 67 2c 20 20 20 20 20 20 20 20 20 20 20 20  pPg,            
35360 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 74         /* Page t
35370 6f 20 65 64 69 74 20 2a 2f 0a 20 20 69 6e 74 20  o edit */.  int 
35380 6e 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20  nCell,          
35390 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
353a0 65 6c 6c 73 20 74 6f 20 64 65 6c 65 74 65 20 2a  ells to delete *
353b0 2f 0a 20 20 75 38 20 2a 2a 61 70 43 65 6c 6c 2c  /.  u8 **apCell,
353c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
353d0 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20      /* Array of 
353e0 63 65 6c 6c 73 20 2a 2f 0a 20 20 75 31 36 20 2a  cells */.  u16 *
353f0 73 7a 43 65 6c 6c 20 20 20 20 20 20 20 20 20 20  szCell          
35400 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72             /* Ar
35410 72 61 79 20 6f 66 20 63 65 6c 6c 20 73 69 7a 65  ray of cell size
35420 73 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a 20 63  s */.){.  u8 * c
35430 6f 6e 73 74 20 61 44 61 74 61 20 3d 20 70 50 67  onst aData = pPg
35440 2d 3e 61 44 61 74 61 3b 0a 20 20 75 38 20 2a 20  ->aData;.  u8 * 
35450 63 6f 6e 73 74 20 70 45 6e 64 20 3d 20 26 61 44  const pEnd = &aD
35460 61 74 61 5b 70 50 67 2d 3e 70 42 74 2d 3e 75 73  ata[pPg->pBt->us
35470 61 62 6c 65 53 69 7a 65 5d 3b 0a 20 20 75 38 20  ableSize];.  u8 
35480 2a 20 63 6f 6e 73 74 20 70 53 74 61 72 74 20 3d  * const pStart =
35490 20 26 61 44 61 74 61 5b 70 50 67 2d 3e 68 64 72   &aData[pPg->hdr
354a0 4f 66 66 73 65 74 20 2b 20 38 20 2b 20 70 50 67  Offset + 8 + pPg
354b0 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 5d 3b  ->childPtrSize];
354c0 0a 20 20 69 6e 74 20 6e 52 65 74 20 3d 20 30 3b  .  int nRet = 0;
354d0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 75 38 20 2a  .  int i;.  u8 *
354e0 70 46 72 65 65 20 3d 20 30 3b 0a 20 20 69 6e 74  pFree = 0;.  int
354f0 20 73 7a 46 72 65 65 20 3d 20 30 3b 0a 0a 20 20   szFree = 0;..  
35500 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c  for(i=0; i<nCell
35510 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a  ; i++){.    u8 *
35520 70 43 65 6c 6c 20 3d 20 61 70 43 65 6c 6c 5b 69  pCell = apCell[i
35530 5d 3b 0a 20 20 20 20 69 66 28 20 70 43 65 6c 6c  ];.    if( pCell
35540 3e 3d 70 53 74 61 72 74 20 26 26 20 70 43 65 6c  >=pStart && pCel
35550 6c 3c 70 45 6e 64 20 29 7b 0a 20 20 20 20 20 20  l<pEnd ){.      
35560 69 6e 74 20 73 7a 20 3d 20 73 7a 43 65 6c 6c 5b  int sz = szCell[
35570 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70 46  i];.      if( pF
35580 72 65 65 21 3d 28 70 43 65 6c 6c 20 2b 20 73 7a  ree!=(pCell + sz
35590 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ) ){.        if(
355a0 20 70 46 72 65 65 20 29 7b 0a 20 20 20 20 20 20   pFree ){.      
355b0 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72 65      assert( pFre
355c0 65 3e 61 44 61 74 61 20 26 26 20 28 70 46 72 65  e>aData && (pFre
355d0 65 20 2d 20 61 44 61 74 61 29 3c 36 35 35 33 36  e - aData)<65536
355e0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 66 72   );.          fr
355f0 65 65 53 70 61 63 65 28 70 50 67 2c 20 28 75 31  eeSpace(pPg, (u1
35600 36 29 28 70 46 72 65 65 20 2d 20 61 44 61 74 61  6)(pFree - aData
35610 29 2c 20 73 7a 46 72 65 65 29 3b 0a 20 20 20 20  ), szFree);.    
35620 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 46      }.        pF
35630 72 65 65 20 3d 20 70 43 65 6c 6c 3b 0a 20 20 20  ree = pCell;.   
35640 20 20 20 20 20 73 7a 46 72 65 65 20 3d 20 73 7a       szFree = sz
35650 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 46  ;.        if( pF
35660 72 65 65 2b 73 7a 3e 70 45 6e 64 20 29 20 72 65  ree+sz>pEnd ) re
35670 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 65  turn 0;.      }e
35680 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 46 72  lse{.        pFr
35690 65 65 20 3d 20 70 43 65 6c 6c 3b 0a 20 20 20 20  ee = pCell;.    
356a0 20 20 20 20 73 7a 46 72 65 65 20 2b 3d 20 73 7a      szFree += sz
356b0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
356c0 6e 52 65 74 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  nRet++;.    }.  
356d0 7d 0a 20 20 69 66 28 20 70 46 72 65 65 20 29 7b  }.  if( pFree ){
356e0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72  .    assert( pFr
356f0 65 65 3e 61 44 61 74 61 20 26 26 20 28 70 46 72  ee>aData && (pFr
35700 65 65 20 2d 20 61 44 61 74 61 29 3c 36 35 35 33  ee - aData)<6553
35710 36 20 29 3b 0a 20 20 20 20 66 72 65 65 53 70 61  6 );.    freeSpa
35720 63 65 28 70 50 67 2c 20 28 75 31 36 29 28 70 46  ce(pPg, (u16)(pF
35730 72 65 65 20 2d 20 61 44 61 74 61 29 2c 20 73 7a  ree - aData), sz
35740 46 72 65 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74  Free);.  }.  ret
35750 75 72 6e 20 6e 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a  urn nRet;.}../*.
35760 2a 2a 20 61 70 43 65 6c 6c 5b 5d 20 61 6e 64 20  ** apCell[] and 
35770 73 7a 43 65 6c 6c 5b 5d 20 63 6f 6e 74 61 69 6e  szCell[] contain
35780 73 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 61 6e  s pointers to an
35790 64 20 73 69 7a 65 73 20 6f 66 20 61 6c 6c 20 63  d sizes of all c
357a0 65 6c 6c 73 20 69 6e 20 74 68 65 0a 2a 2a 20 70  ells in the.** p
357b0 61 67 65 73 20 62 65 69 6e 67 20 62 61 6c 61 6e  ages being balan
357c0 63 65 64 2e 20 20 54 68 65 20 63 75 72 72 65 6e  ced.  The curren
357d0 74 20 70 61 67 65 2c 20 70 50 67 2c 20 68 61 73  t page, pPg, has
357e0 20 70 50 67 2d 3e 6e 43 65 6c 6c 20 63 65 6c 6c   pPg->nCell cell
357f0 73 20 73 74 61 72 74 69 6e 67 0a 2a 2a 20 77 69  s starting.** wi
35800 74 68 20 61 70 43 65 6c 6c 5b 69 4f 6c 64 5d 2e  th apCell[iOld].
35810 20 20 41 66 74 65 72 20 62 61 6c 61 6e 63 69 6e    After balancin
35820 67 2c 20 74 68 69 73 20 70 61 67 65 20 73 68 6f  g, this page sho
35830 75 6c 64 20 68 6f 6c 64 20 6e 4e 65 77 20 63 65  uld hold nNew ce
35840 6c 6c 73 0a 2a 2a 20 73 74 61 72 74 69 6e 67 20  lls.** starting 
35850 61 74 20 61 70 43 65 6c 6c 5b 69 4e 65 77 5d 2e  at apCell[iNew].
35860 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
35870 69 6e 65 20 6d 61 6b 65 73 20 74 68 65 20 6e 65  ine makes the ne
35880 63 65 73 73 61 72 79 20 61 64 6a 75 73 74 6d 65  cessary adjustme
35890 6e 74 73 20 74 6f 20 70 50 67 20 73 6f 20 74 68  nts to pPg so th
358a0 61 74 20 69 74 20 63 6f 6e 74 61 69 6e 73 0a 2a  at it contains.*
358b0 2a 20 74 68 65 20 63 6f 72 72 65 63 74 20 63 65  * the correct ce
358c0 6c 6c 73 20 61 66 74 65 72 20 62 65 69 6e 67 20  lls after being 
358d0 62 61 6c 61 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20  balanced..**.** 
358e0 54 68 65 20 70 50 67 2d 3e 6e 46 72 65 65 20 66  The pPg->nFree f
358f0 69 65 6c 64 20 69 73 20 69 6e 76 61 6c 69 64 20  ield is invalid 
35900 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
35910 6f 6e 20 72 65 74 75 72 6e 73 2e 20 49 74 20 69  on returns. It i
35920 73 20 74 68 65 0a 2a 2a 20 72 65 73 70 6f 6e 73  s the.** respons
35930 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63  ibility of the c
35940 61 6c 6c 65 72 20 74 6f 20 73 65 74 20 69 74 20  aller to set it 
35950 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2f 0a 73 74  correctly..*/.st
35960 61 74 69 63 20 76 6f 69 64 20 65 64 69 74 50 61  atic void editPa
35970 67 65 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  ge(.  MemPage *p
35980 50 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  Pg,             
35990 20 20 20 20 20 20 2f 2a 20 45 64 69 74 20 74 68        /* Edit th
359a0 69 73 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74  is page */.  int
359b0 20 69 4f 6c 64 2c 20 20 20 20 20 20 20 20 20 20   iOld,          
359c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
359d0 49 6e 64 65 78 20 6f 66 20 66 69 72 73 74 20 63  Index of first c
359e0 65 6c 6c 20 63 75 72 72 65 6e 74 6c 79 20 6f 6e  ell currently on
359f0 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 69   page */.  int i
35a00 4e 65 77 2c 20 20 20 20 20 20 20 20 20 20 20 20  New,            
35a10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
35a20 64 65 78 20 6f 66 20 6e 65 77 20 66 69 72 73 74  dex of new first
35a30 20 63 65 6c 6c 20 6f 6e 20 70 61 67 65 20 2a 2f   cell on page */
35a40 0a 20 20 69 6e 74 20 6e 4e 65 77 2c 20 20 20 20  .  int nNew,    
35a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35a60 20 20 20 2f 2a 20 46 69 6e 61 6c 20 6e 75 6d 62     /* Final numb
35a70 65 72 20 6f 66 20 63 65 6c 6c 73 20 6f 6e 20 70  er of cells on p
35a80 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70  age */.  u8 **ap
35a90 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20  Cell,           
35aa0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61           /* Arra
35ab0 79 20 6f 66 20 63 65 6c 6c 73 20 2a 2f 0a 20 20  y of cells */.  
35ac0 75 31 36 20 2a 73 7a 43 65 6c 6c 20 20 20 20 20  u16 *szCell     
35ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35ae0 2f 2a 20 41 72 72 61 79 20 6f 66 20 63 65 6c 6c  /* Array of cell
35af0 20 73 69 7a 65 73 20 2a 2f 0a 29 7b 0a 20 20 75   sizes */.){.  u
35b00 38 20 2a 20 63 6f 6e 73 74 20 61 44 61 74 61 20  8 * const aData 
35b10 3d 20 70 50 67 2d 3e 61 44 61 74 61 3b 0a 20 20  = pPg->aData;.  
35b20 63 6f 6e 73 74 20 69 6e 74 20 68 64 72 20 3d 20  const int hdr = 
35b30 70 50 67 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a  pPg->hdrOffset;.
35b40 20 20 75 38 20 2a 70 42 65 67 69 6e 20 3d 20 26    u8 *pBegin = &
35b50 70 50 67 2d 3e 61 43 65 6c 6c 49 64 78 5b 6e 4e  pPg->aCellIdx[nN
35b60 65 77 20 2a 20 32 5d 3b 0a 20 20 69 6e 74 20 6e  ew * 2];.  int n
35b70 43 65 6c 6c 20 3d 20 70 50 67 2d 3e 6e 43 65 6c  Cell = pPg->nCel
35b80 6c 3b 20 20 20 20 20 20 20 2f 2a 20 43 65 6c 6c  l;       /* Cell
35b90 73 20 73 74 6f 72 65 64 20 6f 6e 20 70 50 67 20  s stored on pPg 
35ba0 2a 2f 0a 20 20 75 38 20 2a 70 44 61 74 61 3b 0a  */.  u8 *pData;.
35bb0 20 20 75 38 20 2a 70 43 65 6c 6c 70 74 72 3b 0a    u8 *pCellptr;.
35bc0 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 69    int i;.  int i
35bd0 4f 6c 64 45 6e 64 20 3d 20 69 4f 6c 64 20 2b 20  OldEnd = iOld + 
35be0 70 50 67 2d 3e 6e 43 65 6c 6c 20 2b 20 70 50 67  pPg->nCell + pPg
35bf0 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20 69  ->nOverflow;.  i
35c00 6e 74 20 69 4e 65 77 45 6e 64 20 3d 20 69 4e 65  nt iNewEnd = iNe
35c10 77 20 2b 20 6e 4e 65 77 3b 0a 0a 23 69 66 64 65  w + nNew;..#ifde
35c20 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
35c30 20 75 38 20 2a 70 54 6d 70 20 3d 20 73 71 6c 69   u8 *pTmp = sqli
35c40 74 65 33 50 61 67 65 72 54 65 6d 70 53 70 61 63  te3PagerTempSpac
35c50 65 28 70 50 67 2d 3e 70 42 74 2d 3e 70 50 61 67  e(pPg->pBt->pPag
35c60 65 72 29 3b 0a 20 20 6d 65 6d 63 70 79 28 70 54  er);.  memcpy(pT
35c70 6d 70 2c 20 61 44 61 74 61 2c 20 70 50 67 2d 3e  mp, aData, pPg->
35c80 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29  pBt->usableSize)
35c90 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 52  ;.#endif..  /* R
35ca0 65 6d 6f 76 65 20 63 65 6c 6c 73 20 66 72 6f 6d  emove cells from
35cb0 20 74 68 65 20 73 74 61 72 74 20 61 6e 64 20 65   the start and e
35cc0 6e 64 20 6f 66 20 74 68 65 20 70 61 67 65 20 2a  nd of the page *
35cd0 2f 0a 20 20 69 66 28 20 69 4f 6c 64 3c 69 4e 65  /.  if( iOld<iNe
35ce0 77 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 53 68  w ){.    int nSh
35cf0 69 66 74 20 3d 20 70 61 67 65 46 72 65 65 41 72  ift = pageFreeAr
35d00 72 61 79 28 0a 20 20 20 20 20 20 20 20 70 50 67  ray(.        pPg
35d10 2c 20 69 4e 65 77 2d 69 4f 6c 64 2c 20 26 61 70  , iNew-iOld, &ap
35d20 43 65 6c 6c 5b 69 4f 6c 64 5d 2c 20 26 73 7a 43  Cell[iOld], &szC
35d30 65 6c 6c 5b 69 4f 6c 64 5d 0a 20 20 20 20 29 3b  ell[iOld].    );
35d40 0a 20 20 20 20 6d 65 6d 6d 6f 76 65 28 70 50 67  .    memmove(pPg
35d50 2d 3e 61 43 65 6c 6c 49 64 78 2c 20 26 70 50 67  ->aCellIdx, &pPg
35d60 2d 3e 61 43 65 6c 6c 49 64 78 5b 6e 53 68 69 66  ->aCellIdx[nShif
35d70 74 2a 32 5d 2c 20 6e 43 65 6c 6c 2a 32 29 3b 0a  t*2], nCell*2);.
35d80 20 20 20 20 6e 43 65 6c 6c 20 2d 3d 20 6e 53 68      nCell -= nSh
35d90 69 66 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69  ift;.  }.  if( i
35da0 4e 65 77 45 6e 64 20 3c 20 69 4f 6c 64 45 6e 64  NewEnd < iOldEnd
35db0 20 29 7b 0a 20 20 20 20 6e 43 65 6c 6c 20 2d 3d   ){.    nCell -=
35dc0 20 70 61 67 65 46 72 65 65 41 72 72 61 79 28 0a   pageFreeArray(.
35dd0 20 20 20 20 20 20 20 20 70 50 67 2c 20 69 4f 6c          pPg, iOl
35de0 64 45 6e 64 2d 69 4e 65 77 45 6e 64 2c 20 26 61  dEnd-iNewEnd, &a
35df0 70 43 65 6c 6c 5b 69 4e 65 77 45 6e 64 5d 2c 20  pCell[iNewEnd], 
35e00 26 73 7a 43 65 6c 6c 5b 69 4e 65 77 45 6e 64 5d  &szCell[iNewEnd]
35e10 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 0a 20 20 70  .    );.  }..  p
35e20 44 61 74 61 20 3d 20 26 61 44 61 74 61 5b 67 65  Data = &aData[ge
35e30 74 32 62 79 74 65 4e 6f 74 5a 65 72 6f 28 26 61  t2byteNotZero(&a
35e40 44 61 74 61 5b 68 64 72 2b 35 5d 29 5d 3b 0a 20  Data[hdr+5])];. 
35e50 20 69 66 28 20 70 44 61 74 61 3c 70 42 65 67 69   if( pData<pBegi
35e60 6e 20 29 20 67 6f 74 6f 20 65 64 69 74 70 61 67  n ) goto editpag
35e70 65 5f 66 61 69 6c 3b 0a 0a 20 20 2f 2a 20 41 64  e_fail;..  /* Ad
35e80 64 20 63 65 6c 6c 73 20 74 6f 20 74 68 65 20 73  d cells to the s
35e90 74 61 72 74 20 6f 66 20 74 68 65 20 70 61 67 65  tart of the page
35ea0 20 2a 2f 0a 20 20 69 66 28 20 69 4e 65 77 3c 69   */.  if( iNew<i
35eb0 4f 6c 64 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e  Old ){.    int n
35ec0 41 64 64 20 3d 20 4d 49 4e 28 6e 4e 65 77 2c 69  Add = MIN(nNew,i
35ed0 4f 6c 64 2d 69 4e 65 77 29 3b 0a 20 20 20 20 61  Old-iNew);.    a
35ee0 73 73 65 72 74 28 20 28 69 4f 6c 64 2d 69 4e 65  ssert( (iOld-iNe
35ef0 77 29 3c 6e 4e 65 77 20 7c 7c 20 6e 43 65 6c 6c  w)<nNew || nCell
35f00 3d 3d 30 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44  ==0 || CORRUPT_D
35f10 42 20 29 3b 0a 20 20 20 20 70 43 65 6c 6c 70 74  B );.    pCellpt
35f20 72 20 3d 20 70 50 67 2d 3e 61 43 65 6c 6c 49 64  r = pPg->aCellId
35f30 78 3b 0a 20 20 20 20 6d 65 6d 6d 6f 76 65 28 26  x;.    memmove(&
35f40 70 43 65 6c 6c 70 74 72 5b 6e 41 64 64 2a 32 5d  pCellptr[nAdd*2]
35f50 2c 20 70 43 65 6c 6c 70 74 72 2c 20 6e 43 65 6c  , pCellptr, nCel
35f60 6c 2a 32 29 3b 0a 20 20 20 20 69 66 28 20 70 61  l*2);.    if( pa
35f70 67 65 49 6e 73 65 72 74 41 72 72 61 79 28 0a 20  geInsertArray(. 
35f80 20 20 20 20 20 20 20 20 20 70 50 67 2c 20 70 42           pPg, pB
35f90 65 67 69 6e 2c 20 26 70 44 61 74 61 2c 20 70 43  egin, &pData, pC
35fa0 65 6c 6c 70 74 72 2c 0a 20 20 20 20 20 20 20 20  ellptr,.        
35fb0 20 20 6e 41 64 64 2c 20 26 61 70 43 65 6c 6c 5b    nAdd, &apCell[
35fc0 69 4e 65 77 5d 2c 20 26 73 7a 43 65 6c 6c 5b 69  iNew], &szCell[i
35fd0 4e 65 77 5d 0a 20 20 20 20 29 20 29 20 67 6f 74  New].    ) ) got
35fe0 6f 20 65 64 69 74 70 61 67 65 5f 66 61 69 6c 3b  o editpage_fail;
35ff0 0a 20 20 20 20 6e 43 65 6c 6c 20 2b 3d 20 6e 41  .    nCell += nA
36000 64 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 64  dd;.  }..  /* Ad
36010 64 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 63  d any overflow c
36020 65 6c 6c 73 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  ells */.  for(i=
36030 30 3b 20 69 3c 70 50 67 2d 3e 6e 4f 76 65 72 66  0; i<pPg->nOverf
36040 6c 6f 77 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  low; i++){.    i
36050 6e 74 20 69 43 65 6c 6c 20 3d 20 28 69 4f 6c 64  nt iCell = (iOld
36060 20 2b 20 70 50 67 2d 3e 61 69 4f 76 66 6c 5b 69   + pPg->aiOvfl[i
36070 5d 29 20 2d 20 69 4e 65 77 3b 0a 20 20 20 20 69  ]) - iNew;.    i
36080 66 28 20 69 43 65 6c 6c 3e 3d 30 20 26 26 20 69  f( iCell>=0 && i
36090 43 65 6c 6c 3c 6e 4e 65 77 20 29 7b 0a 20 20 20  Cell<nNew ){.   
360a0 20 20 20 70 43 65 6c 6c 70 74 72 20 3d 20 26 70     pCellptr = &p
360b0 50 67 2d 3e 61 43 65 6c 6c 49 64 78 5b 69 43 65  Pg->aCellIdx[iCe
360c0 6c 6c 20 2a 20 32 5d 3b 0a 20 20 20 20 20 20 6d  ll * 2];.      m
360d0 65 6d 6d 6f 76 65 28 26 70 43 65 6c 6c 70 74 72  emmove(&pCellptr
360e0 5b 32 5d 2c 20 70 43 65 6c 6c 70 74 72 2c 20 28  [2], pCellptr, (
360f0 6e 43 65 6c 6c 20 2d 20 69 43 65 6c 6c 29 20 2a  nCell - iCell) *
36100 20 32 29 3b 0a 20 20 20 20 20 20 6e 43 65 6c 6c   2);.      nCell
36110 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 61  ++;.      if( pa
36120 67 65 49 6e 73 65 72 74 41 72 72 61 79 28 0a 20  geInsertArray(. 
36130 20 20 20 20 20 20 20 20 20 20 20 70 50 67 2c 20             pPg, 
36140 70 42 65 67 69 6e 2c 20 26 70 44 61 74 61 2c 20  pBegin, &pData, 
36150 70 43 65 6c 6c 70 74 72 2c 0a 20 20 20 20 20 20  pCellptr,.      
36160 20 20 20 20 20 20 31 2c 20 26 61 70 43 65 6c 6c        1, &apCell
36170 5b 69 43 65 6c 6c 20 2b 20 69 4e 65 77 5d 2c 20  [iCell + iNew], 
36180 26 73 7a 43 65 6c 6c 5b 69 43 65 6c 6c 20 2b 20  &szCell[iCell + 
36190 69 4e 65 77 5d 0a 20 20 20 20 20 20 29 20 29 20  iNew].      ) ) 
361a0 67 6f 74 6f 20 65 64 69 74 70 61 67 65 5f 66 61  goto editpage_fa
361b0 69 6c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  il;.    }.  }.. 
361c0 20 2f 2a 20 41 70 70 65 6e 64 20 63 65 6c 6c 73   /* Append cells
361d0 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74   to the end of t
361e0 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 70 43 65  he page */.  pCe
361f0 6c 6c 70 74 72 20 3d 20 26 70 50 67 2d 3e 61 43  llptr = &pPg->aC
36200 65 6c 6c 49 64 78 5b 6e 43 65 6c 6c 2a 32 5d 3b  ellIdx[nCell*2];
36210 0a 20 20 69 66 28 20 70 61 67 65 49 6e 73 65 72  .  if( pageInser
36220 74 41 72 72 61 79 28 0a 20 20 20 20 20 20 20 20  tArray(.        
36230 70 50 67 2c 20 70 42 65 67 69 6e 2c 20 26 70 44  pPg, pBegin, &pD
36240 61 74 61 2c 20 70 43 65 6c 6c 70 74 72 2c 0a 20  ata, pCellptr,. 
36250 20 20 20 20 20 20 20 6e 4e 65 77 2d 6e 43 65 6c         nNew-nCel
36260 6c 2c 20 26 61 70 43 65 6c 6c 5b 69 4e 65 77 2b  l, &apCell[iNew+
36270 6e 43 65 6c 6c 5d 2c 20 26 73 7a 43 65 6c 6c 5b  nCell], &szCell[
36280 69 4e 65 77 2b 6e 43 65 6c 6c 5d 0a 20 20 29 20  iNew+nCell].  ) 
36290 29 20 67 6f 74 6f 20 65 64 69 74 70 61 67 65 5f  ) goto editpage_
362a0 66 61 69 6c 3b 0a 0a 20 20 70 50 67 2d 3e 6e 43  fail;..  pPg->nC
362b0 65 6c 6c 20 3d 20 6e 4e 65 77 3b 0a 20 20 70 50  ell = nNew;.  pP
362c0 67 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30  g->nOverflow = 0
362d0 3b 0a 0a 20 20 70 75 74 32 62 79 74 65 28 26 61  ;..  put2byte(&a
362e0 44 61 74 61 5b 68 64 72 2b 33 5d 2c 20 70 50 67  Data[hdr+3], pPg
362f0 2d 3e 6e 43 65 6c 6c 29 3b 0a 20 20 70 75 74 32  ->nCell);.  put2
36300 62 79 74 65 28 26 61 44 61 74 61 5b 68 64 72 2b  byte(&aData[hdr+
36310 35 5d 2c 20 70 44 61 74 61 20 2d 20 61 44 61 74  5], pData - aDat
36320 61 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  a);..#ifdef SQLI
36330 54 45 5f 44 45 42 55 47 0a 20 20 66 6f 72 28 69  TE_DEBUG.  for(i
36340 3d 30 3b 20 69 3c 6e 4e 65 77 20 26 26 20 21 43  =0; i<nNew && !C
36350 4f 52 52 55 50 54 5f 44 42 3b 20 69 2b 2b 29 7b  ORRUPT_DB; i++){
36360 0a 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d  .    u8 *pCell =
36370 20 61 70 43 65 6c 6c 5b 69 2b 69 4e 65 77 5d 3b   apCell[i+iNew];
36380 0a 20 20 20 20 69 6e 74 20 69 4f 66 66 20 3d 20  .    int iOff = 
36390 67 65 74 32 62 79 74 65 28 26 70 50 67 2d 3e 61  get2byte(&pPg->a
363a0 43 65 6c 6c 49 64 78 5b 69 2a 32 5d 29 3b 0a 20  CellIdx[i*2]);. 
363b0 20 20 20 69 66 28 20 70 43 65 6c 6c 3e 3d 61 44     if( pCell>=aD
363c0 61 74 61 20 26 26 20 70 43 65 6c 6c 3c 26 61 44  ata && pCell<&aD
363d0 61 74 61 5b 70 50 67 2d 3e 70 42 74 2d 3e 75 73  ata[pPg->pBt->us
363e0 61 62 6c 65 53 69 7a 65 5d 20 29 7b 0a 20 20 20  ableSize] ){.   
363f0 20 20 20 70 43 65 6c 6c 20 3d 20 26 70 54 6d 70     pCell = &pTmp
36400 5b 70 43 65 6c 6c 20 2d 20 61 44 61 74 61 5d 3b  [pCell - aData];
36410 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
36420 74 28 20 30 3d 3d 6d 65 6d 63 6d 70 28 70 43 65  t( 0==memcmp(pCe
36430 6c 6c 2c 20 26 61 44 61 74 61 5b 69 4f 66 66 5d  ll, &aData[iOff]
36440 2c 20 73 7a 43 65 6c 6c 5b 69 2b 69 4e 65 77 5d  , szCell[i+iNew]
36450 29 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  ) );.  }.#endif.
36460 0a 20 20 72 65 74 75 72 6e 3b 0a 20 65 64 69 74  .  return;. edit
36470 70 61 67 65 5f 66 61 69 6c 3a 0a 20 20 2f 2a 20  page_fail:.  /* 
36480 55 6e 61 62 6c 65 20 74 6f 20 65 64 69 74 20 74  Unable to edit t
36490 68 69 73 20 70 61 67 65 2e 20 52 65 62 75 69 6c  his page. Rebuil
364a0 64 20 69 74 20 66 72 6f 6d 20 73 63 72 61 74 63  d it from scratc
364b0 68 20 69 6e 73 74 65 61 64 2e 20 2a 2f 0a 20 20  h instead. */.  
364c0 72 65 62 75 69 6c 64 50 61 67 65 28 70 50 67 2c  rebuildPage(pPg,
364d0 20 6e 4e 65 77 2c 20 26 61 70 43 65 6c 6c 5b 69   nNew, &apCell[i
364e0 4e 65 77 5d 2c 20 26 73 7a 43 65 6c 6c 5b 69 4e  New], &szCell[iN
364f0 65 77 5d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ew]);.}../*.** T
36500 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 61 72  he following par
36510 61 6d 65 74 65 72 73 20 64 65 74 65 72 6d 69 6e  ameters determin
36520 65 20 68 6f 77 20 6d 61 6e 79 20 61 64 6a 61 63  e how many adjac
36530 65 6e 74 20 70 61 67 65 73 20 67 65 74 20 69 6e  ent pages get in
36540 76 6f 6c 76 65 64 0a 2a 2a 20 69 6e 20 61 20 62  volved.** in a b
36550 61 6c 61 6e 63 69 6e 67 20 6f 70 65 72 61 74 69  alancing operati
36560 6f 6e 2e 20 20 4e 4e 20 69 73 20 74 68 65 20 6e  on.  NN is the n
36570 75 6d 62 65 72 20 6f 66 20 6e 65 69 67 68 62 6f  umber of neighbo
36580 72 73 20 6f 6e 20 65 69 74 68 65 72 20 73 69 64  rs on either sid
36590 65 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65  e.** of the page
365a0 20 74 68 61 74 20 70 61 72 74 69 63 69 70 61 74   that participat
365b0 65 20 69 6e 20 74 68 65 20 62 61 6c 61 6e 63 69  e in the balanci
365c0 6e 67 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 4e  ng operation.  N
365d0 42 20 69 73 20 74 68 65 0a 2a 2a 20 74 6f 74 61  B is the.** tota
365e0 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  l number of page
365f0 73 20 74 68 61 74 20 70 61 72 74 69 63 69 70 61  s that participa
36600 74 65 2c 20 69 6e 63 6c 75 64 69 6e 67 20 74 68  te, including th
36610 65 20 74 61 72 67 65 74 20 70 61 67 65 20 61 6e  e target page an
36620 64 0a 2a 2a 20 4e 4e 20 6e 65 69 67 68 62 6f 72  d.** NN neighbor
36630 73 20 6f 6e 20 65 69 74 68 65 72 20 73 69 64 65  s on either side
36640 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 69 6e 69  ..**.** The mini
36650 6d 75 6d 20 76 61 6c 75 65 20 6f 66 20 4e 4e 20  mum value of NN 
36660 69 73 20 31 20 28 6f 66 20 63 6f 75 72 73 65 29  is 1 (of course)
36670 2e 20 20 49 6e 63 72 65 61 73 69 6e 67 20 4e 4e  .  Increasing NN
36680 20 61 62 6f 76 65 20 31 0a 2a 2a 20 28 74 6f 20   above 1.** (to 
36690 32 20 6f 72 20 33 29 20 67 69 76 65 73 20 61 20  2 or 3) gives a 
366a0 6d 6f 64 65 73 74 20 69 6d 70 72 6f 76 65 6d 65  modest improveme
366b0 6e 74 20 69 6e 20 53 45 4c 45 43 54 20 61 6e 64  nt in SELECT and
366c0 20 44 45 4c 45 54 45 20 70 65 72 66 6f 72 6d 61   DELETE performa
366d0 6e 63 65 0a 2a 2a 20 69 6e 20 65 78 63 68 61 6e  nce.** in exchan
366e0 67 65 20 66 6f 72 20 61 20 6c 61 72 67 65 72 20  ge for a larger 
366f0 64 65 67 72 61 64 61 74 69 6f 6e 20 69 6e 20 49  degradation in I
36700 4e 53 45 52 54 20 61 6e 64 20 55 50 44 41 54 45  NSERT and UPDATE
36710 20 70 65 72 66 6f 72 6d 61 6e 63 65 2e 0a 2a 2a   performance..**
36720 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20 4e 4e   The value of NN
36730 20 61 70 70 65 61 72 73 20 74 6f 20 67 69 76 65   appears to give
36740 20 74 68 65 20 62 65 73 74 20 72 65 73 75 6c 74   the best result
36750 73 20 6f 76 65 72 61 6c 6c 2e 0a 2a 2f 0a 23 64  s overall..*/.#d
36760 65 66 69 6e 65 20 4e 4e 20 31 20 20 20 20 20 20  efine NN 1      
36770 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
36780 20 6f 66 20 6e 65 69 67 68 62 6f 72 73 20 6f 6e   of neighbors on
36790 20 65 69 74 68 65 72 20 73 69 64 65 20 6f 66 20   either side of 
367a0 70 50 61 67 65 20 2a 2f 0a 23 64 65 66 69 6e 65  pPage */.#define
367b0 20 4e 42 20 28 4e 4e 2a 32 2b 31 29 20 20 20 20   NB (NN*2+1)    
367c0 20 20 2f 2a 20 54 6f 74 61 6c 20 70 61 67 65 73    /* Total pages
367d0 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20 74 68 65   involved in the
367e0 20 62 61 6c 61 6e 63 65 20 2a 2f 0a 0a 0a 23 69   balance */...#i
367f0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
36800 54 5f 51 55 49 43 4b 42 41 4c 41 4e 43 45 0a 2f  T_QUICKBALANCE./
36810 2a 0a 2a 2a 20 54 68 69 73 20 76 65 72 73 69 6f  *.** This versio
36820 6e 20 6f 66 20 62 61 6c 61 6e 63 65 28 29 20 68  n of balance() h
36830 61 6e 64 6c 65 73 20 74 68 65 20 63 6f 6d 6d 6f  andles the commo
36840 6e 20 73 70 65 63 69 61 6c 20 63 61 73 65 20 77  n special case w
36850 68 65 72 65 0a 2a 2a 20 61 20 6e 65 77 20 65 6e  here.** a new en
36860 74 72 79 20 69 73 20 62 65 69 6e 67 20 69 6e 73  try is being ins
36870 65 72 74 65 64 20 6f 6e 20 74 68 65 20 65 78 74  erted on the ext
36880 72 65 6d 65 20 72 69 67 68 74 2d 65 6e 64 20 6f  reme right-end o
36890 66 20 74 68 65 0a 2a 2a 20 74 72 65 65 2c 20 69  f the.** tree, i
368a0 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 77  n other words, w
368b0 68 65 6e 20 74 68 65 20 6e 65 77 20 65 6e 74 72  hen the new entr
368c0 79 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68  y will become th
368d0 65 20 6c 61 72 67 65 73 74 0a 2a 2a 20 65 6e 74  e largest.** ent
368e0 72 79 20 69 6e 20 74 68 65 20 74 72 65 65 2e 0a  ry in the tree..
368f0 2a 2a 0a 2a 2a 20 49 6e 73 74 65 61 64 20 6f 66  **.** Instead of
36900 20 74 72 79 69 6e 67 20 74 6f 20 62 61 6c 61 6e   trying to balan
36910 63 65 20 74 68 65 20 33 20 72 69 67 68 74 2d 6d  ce the 3 right-m
36920 6f 73 74 20 6c 65 61 66 20 70 61 67 65 73 2c 20  ost leaf pages, 
36930 6a 75 73 74 20 61 64 64 0a 2a 2a 20 61 20 6e 65  just add.** a ne
36940 77 20 70 61 67 65 20 74 6f 20 74 68 65 20 72 69  w page to the ri
36950 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 61 6e  ght-hand side an
36960 64 20 70 75 74 20 74 68 65 20 6f 6e 65 20 6e 65  d put the one ne
36970 77 20 65 6e 74 72 79 20 69 6e 0a 2a 2a 20 74 68  w entry in.** th
36980 61 74 20 70 61 67 65 2e 20 20 54 68 69 73 20 6c  at page.  This l
36990 65 61 76 65 73 20 74 68 65 20 72 69 67 68 74 20  eaves the right 
369a0 73 69 64 65 20 6f 66 20 74 68 65 20 74 72 65 65  side of the tree
369b0 20 73 6f 6d 65 77 68 61 74 0a 2a 2a 20 75 6e 62   somewhat.** unb
369c0 61 6c 61 6e 63 65 64 2e 20 20 42 75 74 20 6f 64  alanced.  But od
369d0 64 73 20 61 72 65 20 74 68 61 74 20 77 65 20 77  ds are that we w
369e0 69 6c 6c 20 62 65 20 69 6e 73 65 72 74 69 6e 67  ill be inserting
369f0 20 6e 65 77 20 65 6e 74 72 69 65 73 0a 2a 2a 20   new entries.** 
36a00 61 74 20 74 68 65 20 65 6e 64 20 73 6f 6f 6e 20  at the end soon 
36a10 61 66 74 65 72 77 61 72 64 73 20 73 6f 20 74 68  afterwards so th
36a20 65 20 6e 65 61 72 6c 79 20 65 6d 70 74 79 20 70  e nearly empty p
36a30 61 67 65 20 77 69 6c 6c 20 71 75 69 63 6b 6c 79  age will quickly
36a40 0a 2a 2a 20 66 69 6c 6c 20 75 70 2e 20 20 4f 6e  .** fill up.  On
36a50 20 61 76 65 72 61 67 65 2e 0a 2a 2a 0a 2a 2a 20   average..**.** 
36a60 70 50 61 67 65 20 69 73 20 74 68 65 20 6c 65 61  pPage is the lea
36a70 66 20 70 61 67 65 20 77 68 69 63 68 20 69 73 20  f page which is 
36a80 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 70  the right-most p
36a90 61 67 65 20 69 6e 20 74 68 65 20 74 72 65 65 2e  age in the tree.
36aa0 0a 2a 2a 20 70 50 61 72 65 6e 74 20 69 73 20 69  .** pParent is i
36ab0 74 73 20 70 61 72 65 6e 74 2e 20 20 70 50 61 67  ts parent.  pPag
36ac0 65 20 6d 75 73 74 20 68 61 76 65 20 61 20 73 69  e must have a si
36ad0 6e 67 6c 65 20 6f 76 65 72 66 6c 6f 77 20 65 6e  ngle overflow en
36ae0 74 72 79 0a 2a 2a 20 77 68 69 63 68 20 69 73 20  try.** which is 
36af0 61 6c 73 6f 20 74 68 65 20 72 69 67 68 74 2d 6d  also the right-m
36b00 6f 73 74 20 65 6e 74 72 79 20 6f 6e 20 74 68 65  ost entry on the
36b10 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   page..**.** The
36b20 20 70 53 70 61 63 65 20 62 75 66 66 65 72 20 69   pSpace buffer i
36b30 73 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20  s used to store 
36b40 61 20 74 65 6d 70 6f 72 61 72 79 20 63 6f 70 79  a temporary copy
36b50 20 6f 66 20 74 68 65 20 64 69 76 69 64 65 72 0a   of the divider.
36b60 2a 2a 20 63 65 6c 6c 20 74 68 61 74 20 77 69 6c  ** cell that wil
36b70 6c 20 62 65 20 69 6e 73 65 72 74 65 64 20 69 6e  l be inserted in
36b80 74 6f 20 70 50 61 72 65 6e 74 2e 20 53 75 63 68  to pParent. Such
36b90 20 61 20 63 65 6c 6c 20 63 6f 6e 73 69 73 74 73   a cell consists
36ba0 20 6f 66 20 61 20 34 0a 2a 2a 20 62 79 74 65 20   of a 4.** byte 
36bb0 70 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 6c 6c  page number foll
36bc0 6f 77 65 64 20 62 79 20 61 20 76 61 72 69 61 62  owed by a variab
36bd0 6c 65 20 6c 65 6e 67 74 68 20 69 6e 74 65 67 65  le length intege
36be0 72 2e 20 49 6e 20 6f 74 68 65 72 0a 2a 2a 20 77  r. In other.** w
36bf0 6f 72 64 73 2c 20 61 74 20 6d 6f 73 74 20 31 33  ords, at most 13
36c00 20 62 79 74 65 73 2e 20 48 65 6e 63 65 20 74 68   bytes. Hence th
36c10 65 20 70 53 70 61 63 65 20 62 75 66 66 65 72 20  e pSpace buffer 
36c20 6d 75 73 74 20 62 65 20 61 74 0a 2a 2a 20 6c 65  must be at.** le
36c30 61 73 74 20 31 33 20 62 79 74 65 73 20 69 6e 20  ast 13 bytes in 
36c40 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  size..*/.static 
36c50 69 6e 74 20 62 61 6c 61 6e 63 65 5f 71 75 69 63  int balance_quic
36c60 6b 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65  k(MemPage *pPare
36c70 6e 74 2c 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  nt, MemPage *pPa
36c80 67 65 2c 20 75 38 20 2a 70 53 70 61 63 65 29 7b  ge, u8 *pSpace){
36c90 0a 20 20 42 74 53 68 61 72 65 64 20 2a 63 6f 6e  .  BtShared *con
36ca0 73 74 20 70 42 74 20 3d 20 70 50 61 67 65 2d 3e  st pBt = pPage->
36cb0 70 42 74 3b 20 20 20 20 2f 2a 20 42 2d 54 72 65  pBt;    /* B-Tre
36cc0 65 20 44 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  e Database */.  
36cd0 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 3b 20 20  MemPage *pNew;  
36ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36cf0 20 20 20 20 20 2f 2a 20 4e 65 77 6c 79 20 61 6c       /* Newly al
36d00 6c 6f 63 61 74 65 64 20 70 61 67 65 20 2a 2f 0a  located page */.
36d10 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
36d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36d30 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
36d40 20 43 6f 64 65 20 2a 2f 0a 20 20 50 67 6e 6f 20   Code */.  Pgno 
36d50 70 67 6e 6f 4e 65 77 3b 20 20 20 20 20 20 20 20  pgnoNew;        
36d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36d70 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 6f  /* Page number o
36d80 66 20 70 4e 65 77 20 2a 2f 0a 0a 20 20 61 73 73  f pNew */..  ass
36d90 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
36da0 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
36db0 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
36dc0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
36dd0 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
36de0 70 50 61 72 65 6e 74 2d 3e 70 44 62 50 61 67 65  pParent->pDbPage
36df0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
36e00 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d  Page->nOverflow=
36e10 3d 31 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73  =1 );..  /* This
36e20 20 65 72 72 6f 72 20 63 6f 6e 64 69 74 69 6f 6e   error condition
36e30 20 69 73 20 6e 6f 77 20 63 61 75 67 68 74 20 70   is now caught p
36e40 72 69 6f 72 20 74 6f 20 72 65 61 63 68 69 6e 67  rior to reaching
36e50 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a   this function *
36e60 2f 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 50  /.  if( NEVER(pP
36e70 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 29 20 29  age->nCell==0) )
36e80 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
36e90 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 0a 20 20  ORRUPT_BKPT;..  
36ea0 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65  /* Allocate a ne
36eb0 77 20 70 61 67 65 2e 20 54 68 69 73 20 70 61 67  w page. This pag
36ec0 65 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68  e will become th
36ed0 65 20 72 69 67 68 74 2d 73 69 62 6c 69 6e 67 20  e right-sibling 
36ee0 6f 66 20 0a 20 20 2a 2a 20 70 50 61 67 65 2e 20  of .  ** pPage. 
36ef0 4d 61 6b 65 20 74 68 65 20 70 61 72 65 6e 74 20  Make the parent 
36f00 70 61 67 65 20 77 72 69 74 61 62 6c 65 2c 20 73  page writable, s
36f10 6f 20 74 68 61 74 20 74 68 65 20 6e 65 77 20 64  o that the new d
36f20 69 76 69 64 65 72 20 63 65 6c 6c 0a 20 20 2a 2a  ivider cell.  **
36f30 20 6d 61 79 20 62 65 20 69 6e 73 65 72 74 65 64   may be inserted
36f40 2e 20 49 66 20 62 6f 74 68 20 74 68 65 73 65 20  . If both these 
36f50 6f 70 65 72 61 74 69 6f 6e 73 20 61 72 65 20 73  operations are s
36f60 75 63 63 65 73 73 66 75 6c 2c 20 70 72 6f 63 65  uccessful, proce
36f70 65 64 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  ed..  */.  rc = 
36f80 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67  allocateBtreePag
36f90 65 28 70 42 74 2c 20 26 70 4e 65 77 2c 20 26 70  e(pBt, &pNew, &p
36fa0 67 6e 6f 4e 65 77 2c 20 30 2c 20 30 29 3b 0a 0a  gnoNew, 0, 0);..
36fb0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
36fc0 5f 4f 4b 20 29 7b 0a 0a 20 20 20 20 75 38 20 2a  _OK ){..    u8 *
36fd0 70 4f 75 74 20 3d 20 26 70 53 70 61 63 65 5b 34  pOut = &pSpace[4
36fe0 5d 3b 0a 20 20 20 20 75 38 20 2a 70 43 65 6c 6c  ];.    u8 *pCell
36ff0 20 3d 20 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c   = pPage->apOvfl
37000 5b 30 5d 3b 0a 20 20 20 20 75 31 36 20 73 7a 43  [0];.    u16 szC
37010 65 6c 6c 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74  ell = cellSizePt
37020 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 3b  r(pPage, pCell);
37030 0a 20 20 20 20 75 38 20 2a 70 53 74 6f 70 3b 0a  .    u8 *pStop;.
37040 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
37050 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
37060 61 62 6c 65 28 70 4e 65 77 2d 3e 70 44 62 50 61  able(pNew->pDbPa
37070 67 65 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ge) );.    asser
37080 74 28 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  t( pPage->aData[
37090 30 5d 3d 3d 28 50 54 46 5f 49 4e 54 4b 45 59 7c  0]==(PTF_INTKEY|
370a0 50 54 46 5f 4c 45 41 46 44 41 54 41 7c 50 54 46  PTF_LEAFDATA|PTF
370b0 5f 4c 45 41 46 29 20 29 3b 0a 20 20 20 20 7a 65  _LEAF) );.    ze
370c0 72 6f 50 61 67 65 28 70 4e 65 77 2c 20 50 54 46  roPage(pNew, PTF
370d0 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46  _INTKEY|PTF_LEAF
370e0 44 41 54 41 7c 50 54 46 5f 4c 45 41 46 29 3b 0a  DATA|PTF_LEAF);.
370f0 20 20 20 20 72 65 62 75 69 6c 64 50 61 67 65 28      rebuildPage(
37100 70 4e 65 77 2c 20 31 2c 20 26 70 43 65 6c 6c 2c  pNew, 1, &pCell,
37110 20 26 73 7a 43 65 6c 6c 29 3b 0a 20 20 20 20 70   &szCell);.    p
37120 4e 65 77 2d 3e 6e 46 72 65 65 20 3d 20 70 42 74  New->nFree = pBt
37130 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 70  ->usableSize - p
37140 4e 65 77 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20  New->cellOffset 
37150 2d 20 32 20 2d 20 73 7a 43 65 6c 6c 3b 0a 0a 20  - 2 - szCell;.. 
37160 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73     /* If this is
37170 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   an auto-vacuum 
37180 64 61 74 61 62 61 73 65 2c 20 75 70 64 61 74 65  database, update
37190 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   the pointer map
371a0 0a 20 20 20 20 2a 2a 20 77 69 74 68 20 65 6e 74  .    ** with ent
371b0 72 69 65 73 20 66 6f 72 20 74 68 65 20 6e 65 77  ries for the new
371c0 20 70 61 67 65 2c 20 61 6e 64 20 61 6e 79 20 70   page, and any p
371d0 6f 69 6e 74 65 72 20 66 72 6f 6d 20 74 68 65 20  ointer from the 
371e0 0a 20 20 20 20 2a 2a 20 63 65 6c 6c 20 6f 6e 20  .    ** cell on 
371f0 74 68 65 20 70 61 67 65 20 74 6f 20 61 6e 20 6f  the page to an o
37200 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20 49 66  verflow page. If
37210 20 65 69 74 68 65 72 20 6f 66 20 74 68 65 73 65   either of these
37220 0a 20 20 20 20 2a 2a 20 6f 70 65 72 61 74 69 6f  .    ** operatio
37230 6e 73 20 66 61 69 6c 73 2c 20 74 68 65 20 72 65  ns fails, the re
37240 74 75 72 6e 20 63 6f 64 65 20 69 73 20 73 65 74  turn code is set
37250 2c 20 62 75 74 20 74 68 65 20 63 6f 6e 74 65 6e  , but the conten
37260 74 73 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  ts.    ** of the
37270 20 70 61 72 65 6e 74 20 70 61 67 65 20 61 72 65   parent page are
37280 20 73 74 69 6c 6c 20 6d 61 6e 69 70 75 6c 61 74   still manipulat
37290 65 64 20 62 79 20 74 68 68 20 63 6f 64 65 20 62  ed by thh code b
372a0 65 6c 6f 77 2e 0a 20 20 20 20 2a 2a 20 54 68 61  elow..    ** Tha
372b0 74 20 69 73 20 4f 6b 2c 20 61 74 20 74 68 69 73  t is Ok, at this
372c0 20 70 6f 69 6e 74 20 74 68 65 20 70 61 72 65 6e   point the paren
372d0 74 20 70 61 67 65 20 69 73 20 67 75 61 72 61 6e  t page is guaran
372e0 74 65 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 62  teed to.    ** b
372f0 65 20 6d 61 72 6b 65 64 20 61 73 20 64 69 72 74  e marked as dirt
37300 79 2e 20 52 65 74 75 72 6e 69 6e 67 20 61 6e 20  y. Returning an 
37310 65 72 72 6f 72 20 63 6f 64 65 20 77 69 6c 6c 20  error code will 
37320 63 61 75 73 65 20 61 0a 20 20 20 20 2a 2a 20 72  cause a.    ** r
37330 6f 6c 6c 62 61 63 6b 2c 20 75 6e 64 6f 69 6e 67  ollback, undoing
37340 20 61 6e 79 20 63 68 61 6e 67 65 73 20 6d 61 64   any changes mad
37350 65 20 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20  e to the parent 
37360 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  page..    */.   
37370 20 69 66 28 20 49 53 41 55 54 4f 56 41 43 55 55   if( ISAUTOVACUU
37380 4d 20 29 7b 0a 20 20 20 20 20 20 70 74 72 6d 61  M ){.      ptrma
37390 70 50 75 74 28 70 42 74 2c 20 70 67 6e 6f 4e 65  pPut(pBt, pgnoNe
373a0 77 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c  w, PTRMAP_BTREE,
373b0 20 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 2c 20   pParent->pgno, 
373c0 26 72 63 29 3b 0a 20 20 20 20 20 20 69 66 28 20  &rc);.      if( 
373d0 73 7a 43 65 6c 6c 3e 70 4e 65 77 2d 3e 6d 69 6e  szCell>pNew->min
373e0 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 20  Local ){.       
373f0 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74   ptrmapPutOvflPt
37400 72 28 70 4e 65 77 2c 20 70 43 65 6c 6c 2c 20 26  r(pNew, pCell, &
37410 72 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  rc);.      }.   
37420 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 43 72 65   }.  .    /* Cre
37430 61 74 65 20 61 20 64 69 76 69 64 65 72 20 63 65  ate a divider ce
37440 6c 6c 20 74 6f 20 69 6e 73 65 72 74 20 69 6e 74  ll to insert int
37450 6f 20 70 50 61 72 65 6e 74 2e 20 54 68 65 20 64  o pParent. The d
37460 69 76 69 64 65 72 20 63 65 6c 6c 0a 20 20 20 20  ivider cell.    
37470 2a 2a 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61  ** consists of a
37480 20 34 2d 62 79 74 65 20 70 61 67 65 20 6e 75 6d   4-byte page num
37490 62 65 72 20 28 74 68 65 20 70 61 67 65 20 6e 75  ber (the page nu
374a0 6d 62 65 72 20 6f 66 20 70 50 61 67 65 29 20 61  mber of pPage) a
374b0 6e 64 0a 20 20 20 20 2a 2a 20 61 20 76 61 72 69  nd.    ** a vari
374c0 61 62 6c 65 20 6c 65 6e 67 74 68 20 6b 65 79 20  able length key 
374d0 76 61 6c 75 65 20 28 77 68 69 63 68 20 6d 75 73  value (which mus
374e0 74 20 62 65 20 74 68 65 20 73 61 6d 65 20 76 61  t be the same va
374f0 6c 75 65 20 61 73 20 74 68 65 0a 20 20 20 20 2a  lue as the.    *
37500 2a 20 6c 61 72 67 65 73 74 20 6b 65 79 20 6f 6e  * largest key on
37510 20 70 50 61 67 65 29 2e 0a 20 20 20 20 2a 2a 0a   pPage)..    **.
37520 20 20 20 20 2a 2a 20 54 6f 20 66 69 6e 64 20 74      ** To find t
37530 68 65 20 6c 61 72 67 65 73 74 20 6b 65 79 20 76  he largest key v
37540 61 6c 75 65 20 6f 6e 20 70 50 61 67 65 2c 20 66  alue on pPage, f
37550 69 72 73 74 20 66 69 6e 64 20 74 68 65 20 72 69  irst find the ri
37560 67 68 74 2d 6d 6f 73 74 20 0a 20 20 20 20 2a 2a  ght-most .    **
37570 20 63 65 6c 6c 20 6f 6e 20 70 50 61 67 65 2e 20   cell on pPage. 
37580 54 68 65 20 66 69 72 73 74 20 74 77 6f 20 66 69  The first two fi
37590 65 6c 64 73 20 6f 66 20 74 68 69 73 20 63 65 6c  elds of this cel
375a0 6c 20 61 72 65 20 74 68 65 20 0a 20 20 20 20 2a  l are the .    *
375b0 2a 20 72 65 63 6f 72 64 2d 6c 65 6e 67 74 68 20  * record-length 
375c0 28 61 20 76 61 72 69 61 62 6c 65 20 6c 65 6e 67  (a variable leng
375d0 74 68 20 69 6e 74 65 67 65 72 20 61 74 20 6d 6f  th integer at mo
375e0 73 74 20 33 32 2d 62 69 74 73 20 69 6e 20 73 69  st 32-bits in si
375f0 7a 65 29 0a 20 20 20 20 2a 2a 20 61 6e 64 20 74  ze).    ** and t
37600 68 65 20 6b 65 79 20 76 61 6c 75 65 20 28 61 20  he key value (a 
37610 76 61 72 69 61 62 6c 65 20 6c 65 6e 67 74 68 20  variable length 
37620 69 6e 74 65 67 65 72 2c 20 6d 61 79 20 68 61 76  integer, may hav
37630 65 20 61 6e 79 20 76 61 6c 75 65 29 2e 0a 20 20  e any value)..  
37640 20 20 2a 2a 20 54 68 65 20 66 69 72 73 74 20 6f    ** The first o
37650 66 20 74 68 65 20 77 68 69 6c 65 28 2e 2e 2e 29  f the while(...)
37660 20 6c 6f 6f 70 73 20 62 65 6c 6f 77 20 73 6b 69   loops below ski
37670 70 73 20 6f 76 65 72 20 74 68 65 20 72 65 63 6f  ps over the reco
37680 72 64 2d 6c 65 6e 67 74 68 0a 20 20 20 20 2a 2a  rd-length.    **
37690 20 66 69 65 6c 64 2e 20 54 68 65 20 73 65 63 6f   field. The seco
376a0 6e 64 20 77 68 69 6c 65 28 2e 2e 2e 29 20 6c 6f  nd while(...) lo
376b0 6f 70 20 63 6f 70 69 65 73 20 74 68 65 20 6b 65  op copies the ke
376c0 79 20 76 61 6c 75 65 20 66 72 6f 6d 20 74 68 65  y value from the
376d0 0a 20 20 20 20 2a 2a 20 63 65 6c 6c 20 6f 6e 20  .    ** cell on 
376e0 70 50 61 67 65 20 69 6e 74 6f 20 74 68 65 20 70  pPage into the p
376f0 53 70 61 63 65 20 62 75 66 66 65 72 2e 0a 20 20  Space buffer..  
37700 20 20 2a 2f 0a 20 20 20 20 70 43 65 6c 6c 20 3d    */.    pCell =
37710 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c   findCell(pPage,
37720 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 29   pPage->nCell-1)
37730 3b 0a 20 20 20 20 70 53 74 6f 70 20 3d 20 26 70  ;.    pStop = &p
37740 43 65 6c 6c 5b 39 5d 3b 0a 20 20 20 20 77 68 69  Cell[9];.    whi
37750 6c 65 28 20 28 2a 28 70 43 65 6c 6c 2b 2b 29 26  le( (*(pCell++)&
37760 30 78 38 30 29 20 26 26 20 70 43 65 6c 6c 3c 70  0x80) && pCell<p
37770 53 74 6f 70 20 29 3b 0a 20 20 20 20 70 53 74 6f  Stop );.    pSto
37780 70 20 3d 20 26 70 43 65 6c 6c 5b 39 5d 3b 0a 20  p = &pCell[9];. 
37790 20 20 20 77 68 69 6c 65 28 20 28 28 2a 28 70 4f     while( ((*(pO
377a0 75 74 2b 2b 29 20 3d 20 2a 28 70 43 65 6c 6c 2b  ut++) = *(pCell+
377b0 2b 29 29 26 30 78 38 30 29 20 26 26 20 70 43 65  +))&0x80) && pCe
377c0 6c 6c 3c 70 53 74 6f 70 20 29 3b 0a 0a 20 20 20  ll<pStop );..   
377d0 20 2f 2a 20 49 6e 73 65 72 74 20 74 68 65 20 6e   /* Insert the n
377e0 65 77 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20  ew divider cell 
377f0 69 6e 74 6f 20 70 50 61 72 65 6e 74 2e 20 2a 2f  into pParent. */
37800 0a 20 20 20 20 69 6e 73 65 72 74 43 65 6c 6c 28  .    insertCell(
37810 70 50 61 72 65 6e 74 2c 20 70 50 61 72 65 6e 74  pParent, pParent
37820 2d 3e 6e 43 65 6c 6c 2c 20 70 53 70 61 63 65 2c  ->nCell, pSpace,
37830 20 28 69 6e 74 29 28 70 4f 75 74 2d 70 53 70 61   (int)(pOut-pSpa
37840 63 65 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ce),.           
37850 20 20 20 20 30 2c 20 70 50 61 67 65 2d 3e 70 67      0, pPage->pg
37860 6e 6f 2c 20 26 72 63 29 3b 0a 0a 20 20 20 20 2f  no, &rc);..    /
37870 2a 20 53 65 74 20 74 68 65 20 72 69 67 68 74 2d  * Set the right-
37880 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 20 6f 66  child pointer of
37890 20 70 50 61 72 65 6e 74 20 74 6f 20 70 6f 69 6e   pParent to poin
378a0 74 20 74 6f 20 74 68 65 20 6e 65 77 20 70 61 67  t to the new pag
378b0 65 2e 20 2a 2f 0a 20 20 20 20 70 75 74 34 62 79  e. */.    put4by
378c0 74 65 28 26 70 50 61 72 65 6e 74 2d 3e 61 44 61  te(&pParent->aDa
378d0 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f  ta[pParent->hdrO
378e0 66 66 73 65 74 2b 38 5d 2c 20 70 67 6e 6f 4e 65  ffset+8], pgnoNe
378f0 77 29 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 52 65  w);.  .    /* Re
37900 6c 65 61 73 65 20 74 68 65 20 72 65 66 65 72 65  lease the refere
37910 6e 63 65 20 74 6f 20 74 68 65 20 6e 65 77 20 70  nce to the new p
37920 61 67 65 2e 20 2a 2f 0a 20 20 20 20 72 65 6c 65  age. */.    rele
37930 61 73 65 50 61 67 65 28 70 4e 65 77 29 3b 0a 20  asePage(pNew);. 
37940 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   }..  return rc;
37950 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
37960 49 54 45 5f 4f 4d 49 54 5f 51 55 49 43 4b 42 41  ITE_OMIT_QUICKBA
37970 4c 41 4e 43 45 20 2a 2f 0a 0a 23 69 66 20 30 0a  LANCE */..#if 0.
37980 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
37990 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e  ion does not con
379a0 74 72 69 62 75 74 65 20 61 6e 79 74 68 69 6e 67  tribute anything
379b0 20 74 6f 20 74 68 65 20 6f 70 65 72 61 74 69 6f   to the operatio
379c0 6e 20 6f 66 20 53 51 4c 69 74 65 2e 0a 2a 2a 20  n of SQLite..** 
379d0 69 74 20 69 73 20 73 6f 6d 65 74 69 6d 65 73 20  it is sometimes 
379e0 61 63 74 69 76 61 74 65 64 20 74 65 6d 70 6f 72  activated tempor
379f0 61 72 69 6c 79 20 77 68 69 6c 65 20 64 65 62 75  arily while debu
37a00 67 67 69 6e 67 20 63 6f 64 65 20 72 65 73 70 6f  gging code respo
37a10 6e 73 69 62 6c 65 20 0a 2a 2a 20 66 6f 72 20 73  nsible .** for s
37a20 65 74 74 69 6e 67 20 70 6f 69 6e 74 65 72 2d 6d  etting pointer-m
37a30 61 70 20 65 6e 74 72 69 65 73 2e 0a 2a 2f 0a 73  ap entries..*/.s
37a40 74 61 74 69 63 20 69 6e 74 20 70 74 72 6d 61 70  tatic int ptrmap
37a50 43 68 65 63 6b 50 61 67 65 73 28 4d 65 6d 50 61  CheckPages(MemPa
37a60 67 65 20 2a 2a 61 70 50 61 67 65 2c 20 69 6e 74  ge **apPage, int
37a70 20 6e 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 69   nPage){.  int i
37a80 2c 20 6a 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  , j;.  for(i=0; 
37a90 69 3c 6e 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20  i<nPage; i++){. 
37aa0 20 20 20 50 67 6e 6f 20 6e 3b 0a 20 20 20 20 75     Pgno n;.    u
37ab0 38 20 65 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65  8 e;.    MemPage
37ac0 20 2a 70 50 61 67 65 20 3d 20 61 70 50 61 67 65   *pPage = apPage
37ad0 5b 69 5d 3b 0a 20 20 20 20 42 74 53 68 61 72 65  [i];.    BtShare
37ae0 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e  d *pBt = pPage->
37af0 70 42 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28  pBt;.    assert(
37b00 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29   pPage->isInit )
37b10 3b 0a 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  ;..    for(j=0; 
37b20 6a 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20  j<pPage->nCell; 
37b30 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 43 65 6c 6c  j++){.      Cell
37b40 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 20  Info info;.     
37b50 20 75 38 20 2a 7a 3b 0a 20 20 20 20 20 0a 20 20   u8 *z;.     .  
37b60 20 20 20 20 7a 20 3d 20 66 69 6e 64 43 65 6c 6c      z = findCell
37b70 28 70 50 61 67 65 2c 20 6a 29 3b 0a 20 20 20 20  (pPage, j);.    
37b80 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c    btreeParseCell
37b90 50 74 72 28 70 50 61 67 65 2c 20 7a 2c 20 26 69  Ptr(pPage, z, &i
37ba0 6e 66 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20  nfo);.      if( 
37bb0 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 20 29  info.iOverflow )
37bc0 7b 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20 6f  {.        Pgno o
37bd0 76 66 6c 20 3d 20 67 65 74 34 62 79 74 65 28 26  vfl = get4byte(&
37be0 7a 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77  z[info.iOverflow
37bf0 5d 29 3b 0a 20 20 20 20 20 20 20 20 70 74 72 6d  ]);.        ptrm
37c00 61 70 47 65 74 28 70 42 74 2c 20 6f 76 66 6c 2c  apGet(pBt, ovfl,
37c10 20 26 65 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20   &e, &n);.      
37c20 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 70 50 61    assert( n==pPa
37c30 67 65 2d 3e 70 67 6e 6f 20 26 26 20 65 3d 3d 50  ge->pgno && e==P
37c40 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 20  TRMAP_OVERFLOW1 
37c50 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
37c60 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
37c70 66 20 29 7b 0a 20 20 20 20 20 20 20 20 50 67 6e  f ){.        Pgn
37c80 6f 20 63 68 69 6c 64 20 3d 20 67 65 74 34 62 79  o child = get4by
37c90 74 65 28 7a 29 3b 0a 20 20 20 20 20 20 20 20 70  te(z);.        p
37ca0 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20 63 68  trmapGet(pBt, ch
37cb0 69 6c 64 2c 20 26 65 2c 20 26 6e 29 3b 0a 20 20  ild, &e, &n);.  
37cc0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 3d        assert( n=
37cd0 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20 26 26 20  =pPage->pgno && 
37ce0 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20  e==PTRMAP_BTREE 
37cf0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
37d00 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d  .    if( !pPage-
37d10 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 50  >leaf ){.      P
37d20 67 6e 6f 20 63 68 69 6c 64 20 3d 20 67 65 74 34  gno child = get4
37d30 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61  byte(&pPage->aDa
37d40 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  ta[pPage->hdrOff
37d50 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 20 20 70  set+8]);.      p
37d60 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20 63 68  trmapGet(pBt, ch
37d70 69 6c 64 2c 20 26 65 2c 20 26 6e 29 3b 0a 20 20  ild, &e, &n);.  
37d80 20 20 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 70      assert( n==p
37d90 50 61 67 65 2d 3e 70 67 6e 6f 20 26 26 20 65 3d  Page->pgno && e=
37da0 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20 29 3b  =PTRMAP_BTREE );
37db0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
37dc0 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 0a  urn 1;.}.#endif.
37dd0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
37de0 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20  tion is used to 
37df0 63 6f 70 79 20 74 68 65 20 63 6f 6e 74 65 6e 74  copy the content
37e00 73 20 6f 66 20 74 68 65 20 62 2d 74 72 65 65 20  s of the b-tree 
37e10 6e 6f 64 65 20 73 74 6f 72 65 64 20 0a 2a 2a 20  node stored .** 
37e20 6f 6e 20 70 61 67 65 20 70 46 72 6f 6d 20 74 6f  on page pFrom to
37e30 20 70 61 67 65 20 70 54 6f 2e 20 49 66 20 70 61   page pTo. If pa
37e40 67 65 20 70 46 72 6f 6d 20 77 61 73 20 6e 6f 74  ge pFrom was not
37e50 20 61 20 6c 65 61 66 20 70 61 67 65 2c 20 74 68   a leaf page, th
37e60 65 6e 0a 2a 2a 20 74 68 65 20 70 6f 69 6e 74 65  en.** the pointe
37e70 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f  r-map entries fo
37e80 72 20 65 61 63 68 20 63 68 69 6c 64 20 70 61 67  r each child pag
37e90 65 20 61 72 65 20 75 70 64 61 74 65 64 20 73 6f  e are updated so
37ea0 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 70 61 72   that the.** par
37eb0 65 6e 74 20 70 61 67 65 20 73 74 6f 72 65 64 20  ent page stored 
37ec0 69 6e 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d  in the pointer m
37ed0 61 70 20 69 73 20 70 61 67 65 20 70 54 6f 2e 20  ap is page pTo. 
37ee0 49 66 20 70 46 72 6f 6d 20 63 6f 6e 74 61 69 6e  If pFrom contain
37ef0 65 64 0a 2a 2a 20 61 6e 79 20 63 65 6c 6c 73 20  ed.** any cells 
37f00 77 69 74 68 20 6f 76 65 72 66 6c 6f 77 20 70 61  with overflow pa
37f10 67 65 20 70 6f 69 6e 74 65 72 73 2c 20 74 68 65  ge pointers, the
37f20 6e 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  n the correspond
37f30 69 6e 67 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 6d  ing pointer.** m
37f40 61 70 20 65 6e 74 72 69 65 73 20 61 72 65 20 61  ap entries are a
37f50 6c 73 6f 20 75 70 64 61 74 65 64 20 73 6f 20 74  lso updated so t
37f60 68 61 74 20 74 68 65 20 70 61 72 65 6e 74 20 70  hat the parent p
37f70 61 67 65 20 69 73 20 70 61 67 65 20 70 54 6f 2e  age is page pTo.
37f80 0a 2a 2a 0a 2a 2a 20 49 66 20 70 46 72 6f 6d 20  .**.** If pFrom 
37f90 69 73 20 63 75 72 72 65 6e 74 6c 79 20 63 61 72  is currently car
37fa0 72 79 69 6e 67 20 61 6e 79 20 6f 76 65 72 66 6c  rying any overfl
37fb0 6f 77 20 63 65 6c 6c 73 20 28 65 6e 74 72 69 65  ow cells (entrie
37fc0 73 20 69 6e 20 74 68 65 0a 2a 2a 20 4d 65 6d 50  s in the.** MemP
37fd0 61 67 65 2e 61 70 4f 76 66 6c 5b 5d 20 61 72 72  age.apOvfl[] arr
37fe0 61 79 29 2c 20 74 68 65 79 20 61 72 65 20 6e 6f  ay), they are no
37ff0 74 20 63 6f 70 69 65 64 20 74 6f 20 70 54 6f 2e  t copied to pTo.
38000 20 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65 20 72   .**.** Before r
38010 65 74 75 72 6e 69 6e 67 2c 20 70 61 67 65 20 70  eturning, page p
38020 54 6f 20 69 73 20 72 65 69 6e 69 74 69 61 6c 69  To is reinitiali
38030 7a 65 64 20 75 73 69 6e 67 20 62 74 72 65 65 49  zed using btreeI
38040 6e 69 74 50 61 67 65 28 29 2e 0a 2a 2a 0a 2a 2a  nitPage()..**.**
38050 20 54 68 65 20 70 65 72 66 6f 72 6d 61 6e 63 65   The performance
38060 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f   of this functio
38070 6e 20 69 73 20 6e 6f 74 20 63 72 69 74 69 63 61  n is not critica
38080 6c 2e 20 49 74 20 69 73 20 6f 6e 6c 79 20 75 73  l. It is only us
38090 65 64 20 62 79 20 0a 2a 2a 20 74 68 65 20 62 61  ed by .** the ba
380a0 6c 61 6e 63 65 5f 73 68 61 6c 6c 6f 77 65 72 28  lance_shallower(
380b0 29 20 61 6e 64 20 62 61 6c 61 6e 63 65 5f 64 65  ) and balance_de
380c0 65 70 65 72 28 29 20 70 72 6f 63 65 64 75 72 65  eper() procedure
380d0 73 2c 20 6e 65 69 74 68 65 72 20 6f 66 0a 2a 2a  s, neither of.**
380e0 20 77 68 69 63 68 20 61 72 65 20 63 61 6c 6c 65   which are calle
380f0 64 20 6f 66 74 65 6e 20 75 6e 64 65 72 20 6e 6f  d often under no
38100 72 6d 61 6c 20 63 69 72 63 75 6d 73 74 61 6e 63  rmal circumstanc
38110 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  es..*/.static vo
38120 69 64 20 63 6f 70 79 4e 6f 64 65 43 6f 6e 74 65  id copyNodeConte
38130 6e 74 28 4d 65 6d 50 61 67 65 20 2a 70 46 72 6f  nt(MemPage *pFro
38140 6d 2c 20 4d 65 6d 50 61 67 65 20 2a 70 54 6f 2c  m, MemPage *pTo,
38150 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20 69 66   int *pRC){.  if
38160 28 20 28 2a 70 52 43 29 3d 3d 53 51 4c 49 54 45  ( (*pRC)==SQLITE
38170 5f 4f 4b 20 29 7b 0a 20 20 20 20 42 74 53 68 61  _OK ){.    BtSha
38180 72 65 64 20 2a 20 63 6f 6e 73 74 20 70 42 74 20  red * const pBt 
38190 3d 20 70 46 72 6f 6d 2d 3e 70 42 74 3b 0a 20 20  = pFrom->pBt;.  
381a0 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 61 46 72    u8 * const aFr
381b0 6f 6d 20 3d 20 70 46 72 6f 6d 2d 3e 61 44 61 74  om = pFrom->aDat
381c0 61 3b 0a 20 20 20 20 75 38 20 2a 20 63 6f 6e 73  a;.    u8 * cons
381d0 74 20 61 54 6f 20 3d 20 70 54 6f 2d 3e 61 44 61  t aTo = pTo->aDa
381e0 74 61 3b 0a 20 20 20 20 69 6e 74 20 63 6f 6e 73  ta;.    int cons
381f0 74 20 69 46 72 6f 6d 48 64 72 20 3d 20 70 46 72  t iFromHdr = pFr
38200 6f 6d 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20  om->hdrOffset;. 
38210 20 20 20 69 6e 74 20 63 6f 6e 73 74 20 69 54 6f     int const iTo
38220 48 64 72 20 3d 20 28 28 70 54 6f 2d 3e 70 67 6e  Hdr = ((pTo->pgn
38230 6f 3d 3d 31 29 20 3f 20 31 30 30 20 3a 20 30 29  o==1) ? 100 : 0)
38240 3b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20  ;.    int rc;.  
38250 20 20 69 6e 74 20 69 44 61 74 61 3b 0a 20 20 0a    int iData;.  .
38260 20 20 0a 20 20 20 20 61 73 73 65 72 74 28 20 70    .    assert( p
38270 46 72 6f 6d 2d 3e 69 73 49 6e 69 74 20 29 3b 0a  From->isInit );.
38280 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f      assert( pFro
38290 6d 2d 3e 6e 46 72 65 65 3e 3d 69 54 6f 48 64 72  m->nFree>=iToHdr
382a0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
382b0 67 65 74 32 62 79 74 65 28 26 61 46 72 6f 6d 5b  get2byte(&aFrom[
382c0 69 46 72 6f 6d 48 64 72 2b 35 5d 29 20 3c 3d 20  iFromHdr+5]) <= 
382d0 28 69 6e 74 29 70 42 74 2d 3e 75 73 61 62 6c 65  (int)pBt->usable
382e0 53 69 7a 65 20 29 3b 0a 20 20 0a 20 20 20 20 2f  Size );.  .    /
382f0 2a 20 43 6f 70 79 20 74 68 65 20 62 2d 74 72 65  * Copy the b-tre
38300 65 20 6e 6f 64 65 20 63 6f 6e 74 65 6e 74 20 66  e node content f
38310 72 6f 6d 20 70 61 67 65 20 70 46 72 6f 6d 20 74  rom page pFrom t
38320 6f 20 70 61 67 65 20 70 54 6f 2e 20 2a 2f 0a 20  o page pTo. */. 
38330 20 20 20 69 44 61 74 61 20 3d 20 67 65 74 32 62     iData = get2b
38340 79 74 65 28 26 61 46 72 6f 6d 5b 69 46 72 6f 6d  yte(&aFrom[iFrom
38350 48 64 72 2b 35 5d 29 3b 0a 20 20 20 20 6d 65 6d  Hdr+5]);.    mem
38360 63 70 79 28 26 61 54 6f 5b 69 44 61 74 61 5d 2c  cpy(&aTo[iData],
38370 20 26 61 46 72 6f 6d 5b 69 44 61 74 61 5d 2c 20   &aFrom[iData], 
38380 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d  pBt->usableSize-
38390 69 44 61 74 61 29 3b 0a 20 20 20 20 6d 65 6d 63  iData);.    memc
383a0 70 79 28 26 61 54 6f 5b 69 54 6f 48 64 72 5d 2c  py(&aTo[iToHdr],
383b0 20 26 61 46 72 6f 6d 5b 69 46 72 6f 6d 48 64 72   &aFrom[iFromHdr
383c0 5d 2c 20 70 46 72 6f 6d 2d 3e 63 65 6c 6c 4f 66  ], pFrom->cellOf
383d0 66 73 65 74 20 2b 20 32 2a 70 46 72 6f 6d 2d 3e  fset + 2*pFrom->
383e0 6e 43 65 6c 6c 29 3b 0a 20 20 0a 20 20 20 20 2f  nCell);.  .    /
383f0 2a 20 52 65 69 6e 69 74 69 61 6c 69 7a 65 20 70  * Reinitialize p
38400 61 67 65 20 70 54 6f 20 73 6f 20 74 68 61 74 20  age pTo so that 
38410 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
38420 74 68 65 20 4d 65 6d 50 61 67 65 20 73 74 72 75  the MemPage stru
38430 63 74 75 72 65 0a 20 20 20 20 2a 2a 20 6d 61 74  cture.    ** mat
38440 63 68 20 74 68 65 20 6e 65 77 20 64 61 74 61 2e  ch the new data.
38450 20 54 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74   The initializat
38460 69 6f 6e 20 6f 66 20 70 54