/ Hex Artifact Content
Login

Artifact 789380da841ec283bf75c8b3e2c6423fed63ac16193b247cd43335f07e95f355:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 41 70 72 69 6c  /*.** 2004 April
0010: 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74   6.**.** The aut
0020: 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f  hor disclaims co
0030: 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20  pyright to this 
0040: 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e  source code.  In
0050: 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c   place of.** a l
0060: 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72  egal notice, her
0070: 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a  e is a blessing:
0080: 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f  .**.**    May yo
0090: 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f  u do good and no
00a0: 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61  t evil..**    Ma
00b0: 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69  y you find forgi
00c0: 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73  veness for yours
00d0: 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20  elf and forgive 
00e0: 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61  others..**    Ma
00f0: 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65  y you share free
0100: 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67  ly, never taking
0110: 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67   more than you g
0120: 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ive..**.********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 69  *.** This file i
0180: 6d 70 6c 65 6d 65 6e 74 73 20 61 6e 20 65 78 74  mplements an ext
0190: 65 72 6e 61 6c 20 28 64 69 73 6b 2d 62 61 73 65  ernal (disk-base
01a0: 64 29 20 64 61 74 61 62 61 73 65 20 75 73 69 6e  d) database usin
01b0: 67 20 42 54 72 65 65 73 2e 0a 2a 2a 20 53 65 65  g BTrees..** See
01c0: 20 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d   the header comm
01d0: 65 6e 74 20 6f 6e 20 22 62 74 72 65 65 49 6e 74  ent on "btreeInt
01e0: 2e 68 22 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  .h" for addition
01f0: 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  al information..
0200: 2a 2a 20 49 6e 63 6c 75 64 69 6e 67 20 61 20 64  ** Including a d
0210: 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 66 69  escription of fi
0220: 6c 65 20 66 6f 72 6d 61 74 20 61 6e 64 20 61 6e  le format and an
0230: 20 6f 76 65 72 76 69 65 77 20 6f 66 20 6f 70 65   overview of ope
0240: 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 6e 63 6c  ration..*/.#incl
0250: 75 64 65 20 22 62 74 72 65 65 49 6e 74 2e 68 22  ude "btreeInt.h"
0260: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 68 65 61 64  ../*.** The head
0270: 65 72 20 73 74 72 69 6e 67 20 74 68 61 74 20 61  er string that a
0280: 70 70 65 61 72 73 20 61 74 20 74 68 65 20 62 65  ppears at the be
0290: 67 69 6e 6e 69 6e 67 20 6f 66 20 65 76 65 72 79  ginning of every
02a0: 0a 2a 2a 20 53 51 4c 69 74 65 20 64 61 74 61 62  .** SQLite datab
02b0: 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ase..*/.static c
02c0: 6f 6e 73 74 20 63 68 61 72 20 7a 4d 61 67 69 63  onst char zMagic
02d0: 48 65 61 64 65 72 5b 5d 20 3d 20 53 51 4c 49 54  Header[] = SQLIT
02e0: 45 5f 46 49 4c 45 5f 48 45 41 44 45 52 3b 0a 0a  E_FILE_HEADER;..
02f0: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 69 73 20 67  /*.** Set this g
0300: 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 74  lobal variable t
0310: 6f 20 31 20 74 6f 20 65 6e 61 62 6c 65 20 74 72  o 1 to enable tr
0320: 61 63 69 6e 67 20 75 73 69 6e 67 20 74 68 65 20  acing using the 
0330: 54 52 41 43 45 0a 2a 2a 20 6d 61 63 72 6f 2e 0a  TRACE.** macro..
0340: 2a 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73 71 6c  */.#if 0.int sql
0350: 69 74 65 33 42 74 72 65 65 54 72 61 63 65 3d 31  ite3BtreeTrace=1
0360: 3b 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 6e  ;  /* True to en
0370: 61 62 6c 65 20 74 72 61 63 69 6e 67 20 2a 2f 0a  able tracing */.
0380: 23 20 64 65 66 69 6e 65 20 54 52 41 43 45 28 58  # define TRACE(X
0390: 29 20 20 69 66 28 73 71 6c 69 74 65 33 42 74 72  )  if(sqlite3Btr
03a0: 65 65 54 72 61 63 65 29 7b 70 72 69 6e 74 66 20  eeTrace){printf 
03b0: 58 3b 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29  X;fflush(stdout)
03c0: 3b 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  ;}.#else.# defin
03d0: 65 20 54 52 41 43 45 28 58 29 0a 23 65 6e 64 69  e TRACE(X).#endi
03e0: 66 0a 0a 2f 2a 0a 2a 2a 20 45 78 74 72 61 63 74  f../*.** Extract
03f0: 20 61 20 32 2d 62 79 74 65 20 62 69 67 2d 65 6e   a 2-byte big-en
0400: 64 69 61 6e 20 69 6e 74 65 67 65 72 20 66 72 6f  dian integer fro
0410: 6d 20 61 6e 20 61 72 72 61 79 20 6f 66 20 75 6e  m an array of un
0420: 73 69 67 6e 65 64 20 62 79 74 65 73 2e 0a 2a 2a  signed bytes..**
0430: 20 42 75 74 20 69 66 20 74 68 65 20 76 61 6c 75   But if the valu
0440: 65 20 69 73 20 7a 65 72 6f 2c 20 6d 61 6b 65 20  e is zero, make 
0450: 69 74 20 36 35 35 33 36 2e 0a 2a 2a 0a 2a 2a 20  it 65536..**.** 
0460: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
0470: 75 73 65 64 20 74 6f 20 65 78 74 72 61 63 74 20  used to extract 
0480: 74 68 65 20 22 6f 66 66 73 65 74 20 74 6f 20 63  the "offset to c
0490: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
04a0: 22 20 76 61 6c 75 65 0a 2a 2a 20 66 72 6f 6d 20  " value.** from 
04b0: 74 68 65 20 68 65 61 64 65 72 20 6f 66 20 61 20  the header of a 
04c0: 62 74 72 65 65 20 70 61 67 65 2e 20 20 49 66 20  btree page.  If 
04d0: 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73  the page size is
04e0: 20 36 35 35 33 36 20 61 6e 64 20 74 68 65 20 70   65536 and the p
04f0: 61 67 65 0a 2a 2a 20 69 73 20 65 6d 70 74 79 2c  age.** is empty,
0500: 20 74 68 65 20 6f 66 66 73 65 74 20 73 68 6f 75   the offset shou
0510: 6c 64 20 62 65 20 36 35 35 33 36 2c 20 62 75 74  ld be 65536, but
0520: 20 74 68 65 20 32 2d 62 79 74 65 20 76 61 6c 75   the 2-byte valu
0530: 65 20 73 74 6f 72 65 73 20 7a 65 72 6f 2e 0a 2a  e stores zero..*
0540: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d  * This routine m
0550: 61 6b 65 73 20 74 68 65 20 6e 65 63 65 73 73 61  akes the necessa
0560: 72 79 20 61 64 6a 75 73 74 6d 65 6e 74 20 74 6f  ry adjustment to
0570: 20 36 35 35 33 36 2e 0a 2a 2f 0a 23 64 65 66 69   65536..*/.#defi
0580: 6e 65 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65  ne get2byteNotZe
0590: 72 6f 28 58 29 20 20 28 28 28 28 28 69 6e 74 29  ro(X)  (((((int)
05a0: 67 65 74 32 62 79 74 65 28 58 29 29 2d 31 29 26  get2byte(X))-1)&
05b0: 30 78 66 66 66 66 29 2b 31 29 0a 0a 2f 2a 0a 2a  0xffff)+1)../*.*
05c0: 2a 20 56 61 6c 75 65 73 20 70 61 73 73 65 64 20  * Values passed 
05d0: 61 73 20 74 68 65 20 35 74 68 20 61 72 67 75 6d  as the 5th argum
05e0: 65 6e 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 42  ent to allocateB
05f0: 74 72 65 65 50 61 67 65 28 29 0a 2a 2f 0a 23 64  treePage().*/.#d
0600: 65 66 69 6e 65 20 42 54 41 4c 4c 4f 43 5f 41 4e  efine BTALLOC_AN
0610: 59 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20  Y   0           
0620: 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 79 20  /* Allocate any 
0630: 70 61 67 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20  page */.#define 
0640: 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20 31 20  BTALLOC_EXACT 1 
0650: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c            /* All
0660: 6f 63 61 74 65 20 65 78 61 63 74 20 70 61 67 65  ocate exact page
0670: 20 69 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a   if possible */.
0680: 23 64 65 66 69 6e 65 20 42 54 41 4c 4c 4f 43 5f  #define BTALLOC_
0690: 4c 45 20 20 20 20 32 20 20 20 20 20 20 20 20 20  LE    2         
06a0: 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e    /* Allocate an
06b0: 79 20 70 61 67 65 20 3c 3d 20 74 68 65 20 70 61  y page <= the pa
06c0: 72 61 6d 65 74 65 72 20 2a 2f 0a 0a 2f 2a 0a 2a  rameter */../*.*
06d0: 2a 20 4d 61 63 72 6f 20 49 66 4e 6f 74 4f 6d 69  * Macro IfNotOmi
06e0: 74 41 56 28 78 29 20 72 65 74 75 72 6e 73 20 28  tAV(x) returns (
06f0: 78 29 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49  x) if SQLITE_OMI
0700: 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 69 73 20  T_AUTOVACUUM is 
0710: 6e 6f 74 20 0a 2a 2a 20 64 65 66 69 6e 65 64 2c  not .** defined,
0720: 20 6f 72 20 30 20 69 66 20 69 74 20 69 73 2e 20   or 0 if it is. 
0730: 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a  For example:.**.
0740: 2a 2a 20 20 20 62 49 6e 63 72 56 61 63 75 75 6d  **   bIncrVacuum
0750: 20 3d 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70   = IfNotOmitAV(p
0760: 42 74 53 68 61 72 65 64 2d 3e 69 6e 63 72 56 61  BtShared->incrVa
0770: 63 75 75 6d 29 3b 0a 2a 2f 0a 23 69 66 6e 64 65  cuum);.*/.#ifnde
0780: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
0790: 54 4f 56 41 43 55 55 4d 0a 23 64 65 66 69 6e 65  TOVACUUM.#define
07a0: 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 65 78 70   IfNotOmitAV(exp
07b0: 72 29 20 28 65 78 70 72 29 0a 23 65 6c 73 65 0a  r) (expr).#else.
07c0: 23 64 65 66 69 6e 65 20 49 66 4e 6f 74 4f 6d 69  #define IfNotOmi
07d0: 74 41 56 28 65 78 70 72 29 20 30 0a 23 65 6e 64  tAV(expr) 0.#end
07e0: 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
07f0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
0800: 41 43 48 45 0a 2f 2a 0a 2a 2a 20 41 20 6c 69 73  ACHE./*.** A lis
0810: 74 20 6f 66 20 42 74 53 68 61 72 65 64 20 6f 62  t of BtShared ob
0820: 6a 65 63 74 73 20 74 68 61 74 20 61 72 65 20 65  jects that are e
0830: 6c 69 67 69 62 6c 65 20 66 6f 72 20 70 61 72 74  ligible for part
0840: 69 63 69 70 61 74 69 6f 6e 0a 2a 2a 20 69 6e 20  icipation.** in 
0850: 73 68 61 72 65 64 20 63 61 63 68 65 2e 20 20 54  shared cache.  T
0860: 68 69 73 20 76 61 72 69 61 62 6c 65 20 68 61 73  his variable has
0870: 20 66 69 6c 65 20 73 63 6f 70 65 20 64 75 72 69   file scope duri
0880: 6e 67 20 6e 6f 72 6d 61 6c 20 62 75 69 6c 64 73  ng normal builds
0890: 2c 0a 2a 2a 20 62 75 74 20 74 68 65 20 74 65 73  ,.** but the tes
08a0: 74 20 68 61 72 6e 65 73 73 20 6e 65 65 64 73 20  t harness needs 
08b0: 74 6f 20 61 63 63 65 73 73 20 69 74 20 73 6f 20  to access it so 
08c0: 77 65 20 6d 61 6b 65 20 69 74 20 67 6c 6f 62 61  we make it globa
08d0: 6c 20 66 6f 72 20 0a 2a 2a 20 74 65 73 74 20 62  l for .** test b
08e0: 75 69 6c 64 73 2e 0a 2a 2a 0a 2a 2a 20 41 63 63  uilds..**.** Acc
08f0: 65 73 73 20 74 6f 20 74 68 69 73 20 76 61 72 69  ess to this vari
0900: 61 62 6c 65 20 69 73 20 70 72 6f 74 65 63 74 65  able is protecte
0910: 64 20 62 79 20 53 51 4c 49 54 45 5f 4d 55 54 45  d by SQLITE_MUTE
0920: 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 2e  X_STATIC_MASTER.
0930: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
0940: 45 5f 54 45 53 54 0a 42 74 53 68 61 72 65 64 20  E_TEST.BtShared 
0950: 2a 53 51 4c 49 54 45 5f 57 53 44 20 73 71 6c 69  *SQLITE_WSD sqli
0960: 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69  te3SharedCacheLi
0970: 73 74 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 73 74  st = 0;.#else.st
0980: 61 74 69 63 20 42 74 53 68 61 72 65 64 20 2a 53  atic BtShared *S
0990: 51 4c 49 54 45 5f 57 53 44 20 73 71 6c 69 74 65  QLITE_WSD sqlite
09a0: 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74  3SharedCacheList
09b0: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 65 6e   = 0;.#endif.#en
09c0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
09d0: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20  IT_SHARED_CACHE 
09e0: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
09f0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
0a00: 41 43 48 45 0a 2f 2a 0a 2a 2a 20 45 6e 61 62 6c  ACHE./*.** Enabl
0a10: 65 20 6f 72 20 64 69 73 61 62 6c 65 20 74 68 65  e or disable the
0a20: 20 73 68 61 72 65 64 20 70 61 67 65 72 20 61 6e   shared pager an
0a30: 64 20 73 63 68 65 6d 61 20 66 65 61 74 75 72 65  d schema feature
0a40: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  s..**.** This ro
0a50: 75 74 69 6e 65 20 68 61 73 20 6e 6f 20 65 66 66  utine has no eff
0a60: 65 63 74 20 6f 6e 20 65 78 69 73 74 69 6e 67 20  ect on existing 
0a70: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
0a80: 69 6f 6e 73 2e 0a 2a 2a 20 54 68 65 20 73 68 61  ions..** The sha
0a90: 72 65 64 20 63 61 63 68 65 20 73 65 74 74 69 6e  red cache settin
0aa0: 67 20 65 66 66 65 63 74 73 20 6f 6e 6c 79 20 66  g effects only f
0ab0: 75 74 75 72 65 20 63 61 6c 6c 73 20 74 6f 0a 2a  uture calls to.*
0ac0: 2a 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29  * sqlite3_open()
0ad0: 2c 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36  , sqlite3_open16
0ae0: 28 29 2c 20 6f 72 20 73 71 6c 69 74 65 33 5f 6f  (), or sqlite3_o
0af0: 70 65 6e 5f 76 32 28 29 2e 0a 2a 2f 0a 69 6e 74  pen_v2()..*/.int
0b00: 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f   sqlite3_enable_
0b10: 73 68 61 72 65 64 5f 63 61 63 68 65 28 69 6e 74  shared_cache(int
0b20: 20 65 6e 61 62 6c 65 29 7b 0a 20 20 73 71 6c 69   enable){.  sqli
0b30: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
0b40: 73 68 61 72 65 64 43 61 63 68 65 45 6e 61 62 6c  sharedCacheEnabl
0b50: 65 64 20 3d 20 65 6e 61 62 6c 65 3b 0a 20 20 72  ed = enable;.  r
0b60: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
0b70: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 0a 23 69 66  .}.#endif....#if
0b80: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
0b90: 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 2f  SHARED_CACHE.  /
0ba0: 2a 0a 20 20 2a 2a 20 54 68 65 20 66 75 6e 63 74  *.  ** The funct
0bb0: 69 6f 6e 73 20 71 75 65 72 79 53 68 61 72 65 64  ions queryShared
0bc0: 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29  CacheTableLock()
0bd0: 2c 20 73 65 74 53 68 61 72 65 64 43 61 63 68 65  , setSharedCache
0be0: 54 61 62 6c 65 4c 6f 63 6b 28 29 2c 0a 20 20 2a  TableLock(),.  *
0bf0: 2a 20 61 6e 64 20 63 6c 65 61 72 41 6c 6c 53 68  * and clearAllSh
0c00: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
0c10: 63 6b 73 28 29 0a 20 20 2a 2a 20 6d 61 6e 69 70  cks().  ** manip
0c20: 75 6c 61 74 65 20 65 6e 74 72 69 65 73 20 69 6e  ulate entries in
0c30: 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 4c   the BtShared.pL
0c40: 6f 63 6b 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  ock linked list 
0c50: 75 73 65 64 20 74 6f 20 73 74 6f 72 65 0a 20 20  used to store.  
0c60: 2a 2a 20 73 68 61 72 65 64 2d 63 61 63 68 65 20  ** shared-cache 
0c70: 74 61 62 6c 65 20 6c 65 76 65 6c 20 6c 6f 63 6b  table level lock
0c80: 73 2e 20 49 66 20 74 68 65 20 6c 69 62 72 61 72  s. If the librar
0c90: 79 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 77 69  y is compiled wi
0ca0: 74 68 20 74 68 65 0a 20 20 2a 2a 20 73 68 61 72  th the.  ** shar
0cb0: 65 64 2d 63 61 63 68 65 20 66 65 61 74 75 72 65  ed-cache feature
0cc0: 20 64 69 73 61 62 6c 65 64 2c 20 74 68 65 6e 20   disabled, then 
0cd0: 74 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 65 76  there is only ev
0ce0: 65 72 20 6f 6e 65 20 75 73 65 72 0a 20 20 2a 2a  er one user.  **
0cf0: 20 6f 66 20 65 61 63 68 20 42 74 53 68 61 72 65   of each BtShare
0d00: 64 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20  d structure and 
0d10: 73 6f 20 74 68 69 73 20 6c 6f 63 6b 69 6e 67 20  so this locking 
0d20: 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79  is not necessary
0d30: 2e 20 0a 20 20 2a 2a 20 53 6f 20 64 65 66 69 6e  . .  ** So defin
0d40: 65 20 74 68 65 20 6c 6f 63 6b 20 72 65 6c 61 74  e the lock relat
0d50: 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 61 73 20  ed functions as 
0d60: 6e 6f 2d 6f 70 73 2e 0a 20 20 2a 2f 0a 20 20 23  no-ops..  */.  #
0d70: 64 65 66 69 6e 65 20 71 75 65 72 79 53 68 61 72  define queryShar
0d80: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
0d90: 28 61 2c 62 2c 63 29 20 53 51 4c 49 54 45 5f 4f  (a,b,c) SQLITE_O
0da0: 4b 0a 20 20 23 64 65 66 69 6e 65 20 73 65 74 53  K.  #define setS
0db0: 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
0dc0: 6f 63 6b 28 61 2c 62 2c 63 29 20 53 51 4c 49 54  ock(a,b,c) SQLIT
0dd0: 45 5f 4f 4b 0a 20 20 23 64 65 66 69 6e 65 20 63  E_OK.  #define c
0de0: 6c 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63  learAllSharedCac
0df0: 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a  heTableLocks(a).
0e00: 20 20 23 64 65 66 69 6e 65 20 64 6f 77 6e 67 72    #define downgr
0e10: 61 64 65 41 6c 6c 53 68 61 72 65 64 43 61 63 68  adeAllSharedCach
0e20: 65 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a 20  eTableLocks(a). 
0e30: 20 23 64 65 66 69 6e 65 20 68 61 73 53 68 61 72   #define hasShar
0e40: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
0e50: 28 61 2c 62 2c 63 2c 64 29 20 31 0a 20 20 23 64  (a,b,c,d) 1.  #d
0e60: 65 66 69 6e 65 20 68 61 73 52 65 61 64 43 6f 6e  efine hasReadCon
0e70: 66 6c 69 63 74 73 28 61 2c 20 62 29 20 30 0a 23  flicts(a, b) 0.#
0e80: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70  endif../*.** Imp
0e90: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  lementation of t
0ea0: 68 65 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  he SQLITE_CORRUP
0eb0: 54 5f 50 41 47 45 28 29 20 6d 61 63 72 6f 2e 20  T_PAGE() macro. 
0ec0: 54 61 6b 65 73 20 61 20 73 69 6e 67 6c 65 0a 2a  Takes a single.*
0ed0: 2a 20 28 4d 65 6d 50 61 67 65 2a 29 20 61 73 20  * (MemPage*) as 
0ee0: 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20 54 68 65  an argument. The
0ef0: 20 28 4d 65 6d 50 61 67 65 2a 29 20 6d 75 73 74   (MemPage*) must
0f00: 20 6e 6f 74 20 62 65 20 4e 55 4c 4c 2e 0a 2a 2a   not be NULL..**
0f10: 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 44 45  .** If SQLITE_DE
0f20: 42 55 47 20 69 73 20 6e 6f 74 20 64 65 66 69 6e  BUG is not defin
0f30: 65 64 2c 20 74 68 65 6e 20 74 68 69 73 20 6d 61  ed, then this ma
0f40: 63 72 6f 20 69 73 20 65 71 75 69 76 61 6c 65 6e  cro is equivalen
0f50: 74 20 74 6f 0a 2a 2a 20 53 51 4c 49 54 45 5f 43  t to.** SQLITE_C
0f60: 4f 52 52 55 50 54 5f 42 4b 50 54 2e 20 4f 72 2c  ORRUPT_BKPT. Or,
0f70: 20 69 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47   if SQLITE_DEBUG
0f80: 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 74 68   is set, then th
0f90: 65 20 6c 6f 67 20 6d 65 73 73 61 67 65 0a 2a 2a  e log message.**
0fa0: 20 6e 6f 72 6d 61 6c 6c 79 20 70 72 6f 64 75 63   normally produc
0fb0: 65 64 20 61 73 20 61 20 73 69 64 65 2d 65 66 66  ed as a side-eff
0fc0: 65 63 74 20 6f 66 20 53 51 4c 49 54 45 5f 43 4f  ect of SQLITE_CO
0fd0: 52 52 55 50 54 5f 42 4b 50 54 20 69 73 20 61 75  RRUPT_BKPT is au
0fe0: 67 6d 65 6e 74 65 64 0a 2a 2a 20 77 69 74 68 20  gmented.** with 
0ff0: 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
1000: 61 6e 64 20 66 69 6c 65 6e 61 6d 65 20 61 73 73  and filename ass
1010: 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
1020: 20 28 4d 65 6d 50 61 67 65 2a 29 2e 0a 2a 2f 0a   (MemPage*)..*/.
1030: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
1040: 42 55 47 0a 69 6e 74 20 63 6f 72 72 75 70 74 50  BUG.int corruptP
1050: 61 67 65 45 72 72 6f 72 28 69 6e 74 20 6c 69 6e  ageError(int lin
1060: 65 6e 6f 2c 20 4d 65 6d 50 61 67 65 20 2a 70 29  eno, MemPage *p)
1070: 7b 0a 20 20 63 68 61 72 20 2a 7a 4d 73 67 3b 0a  {.  char *zMsg;.
1080: 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65    sqlite3BeginBe
1090: 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
10a0: 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d  zMsg = sqlite3_m
10b0: 70 72 69 6e 74 66 28 22 64 61 74 61 62 61 73 65  printf("database
10c0: 20 63 6f 72 72 75 70 74 69 6f 6e 20 70 61 67 65   corruption page
10d0: 20 25 64 20 6f 66 20 25 73 22 2c 0a 20 20 20 20   %d of %s",.    
10e0: 20 20 28 69 6e 74 29 70 2d 3e 70 67 6e 6f 2c 20    (int)p->pgno, 
10f0: 73 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65  sqlite3PagerFile
1100: 6e 61 6d 65 28 70 2d 3e 70 42 74 2d 3e 70 50 61  name(p->pBt->pPa
1110: 67 65 72 2c 20 30 29 0a 20 20 29 3b 0a 20 20 73  ger, 0).  );.  s
1120: 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d  qlite3EndBenignM
1130: 61 6c 6c 6f 63 28 29 3b 0a 20 20 69 66 28 20 7a  alloc();.  if( z
1140: 4d 73 67 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Msg ){.    sqlit
1150: 65 33 52 65 70 6f 72 74 45 72 72 6f 72 28 53 51  e3ReportError(SQ
1160: 4c 49 54 45 5f 43 4f 52 52 55 50 54 2c 20 6c 69  LITE_CORRUPT, li
1170: 6e 65 6e 6f 2c 20 7a 4d 73 67 29 3b 0a 20 20 7d  neno, zMsg);.  }
1180: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
1190: 7a 4d 73 67 29 3b 0a 20 20 72 65 74 75 72 6e 20  zMsg);.  return 
11a0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
11b0: 4b 50 54 3b 0a 7d 0a 23 20 64 65 66 69 6e 65 20  KPT;.}.# define 
11c0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50  SQLITE_CORRUPT_P
11d0: 41 47 45 28 70 4d 65 6d 50 61 67 65 29 20 63 6f  AGE(pMemPage) co
11e0: 72 72 75 70 74 50 61 67 65 45 72 72 6f 72 28 5f  rruptPageError(_
11f0: 5f 4c 49 4e 45 5f 5f 2c 20 70 4d 65 6d 50 61 67  _LINE__, pMemPag
1200: 65 29 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  e).#else.# defin
1210: 65 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  e SQLITE_CORRUPT
1220: 5f 50 41 47 45 28 70 4d 65 6d 50 61 67 65 29 20  _PAGE(pMemPage) 
1230: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50  SQLITE_CORRUPT_P
1240: 47 4e 4f 28 70 4d 65 6d 50 61 67 65 2d 3e 70 67  GNO(pMemPage->pg
1250: 6e 6f 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e  no).#endif..#ifn
1260: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1270: 53 48 41 52 45 44 5f 43 41 43 48 45 0a 0a 23 69  SHARED_CACHE..#i
1280: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
1290: 47 0a 2f 2a 0a 2a 2a 2a 2a 20 54 68 69 73 20 66  G./*.**** This f
12a0: 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20  unction is only 
12b0: 75 73 65 64 20 61 73 20 70 61 72 74 20 6f 66 20  used as part of 
12c0: 61 6e 20 61 73 73 65 72 74 28 29 20 73 74 61 74  an assert() stat
12d0: 65 6d 65 6e 74 2e 20 2a 2a 2a 0a 2a 2a 0a 2a 2a  ement. ***.**.**
12e0: 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
12f0: 20 70 42 74 72 65 65 20 68 6f 6c 64 73 20 74 68   pBtree holds th
1300: 65 20 72 65 71 75 69 72 65 64 20 6c 6f 63 6b 73  e required locks
1310: 20 74 6f 20 72 65 61 64 20 6f 72 20 77 72 69 74   to read or writ
1320: 65 20 74 6f 20 74 68 65 20 0a 2a 2a 20 74 61 62  e to the .** tab
1330: 6c 65 20 77 69 74 68 20 72 6f 6f 74 20 70 61 67  le with root pag
1340: 65 20 69 52 6f 6f 74 2e 20 20 20 52 65 74 75 72  e iRoot.   Retur
1350: 6e 20 31 20 69 66 20 69 74 20 64 6f 65 73 20 61  n 1 if it does a
1360: 6e 64 20 30 20 69 66 20 6e 6f 74 2e 0a 2a 2a 0a  nd 0 if not..**.
1370: 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  ** For example, 
1380: 77 68 65 6e 20 77 72 69 74 69 6e 67 20 74 6f 20  when writing to 
1390: 61 20 74 61 62 6c 65 20 77 69 74 68 20 72 6f 6f  a table with roo
13a0: 74 2d 70 61 67 65 20 69 52 6f 6f 74 20 76 69 61  t-page iRoot via
13b0: 20 0a 2a 2a 20 42 74 72 65 65 20 63 6f 6e 6e 65   .** Btree conne
13c0: 63 74 69 6f 6e 20 70 42 74 72 65 65 3a 0a 2a 2a  ction pBtree:.**
13d0: 0a 2a 2a 20 20 20 20 61 73 73 65 72 74 28 20 68  .**    assert( h
13e0: 61 73 53 68 61 72 65 64 43 61 63 68 65 54 61 62  asSharedCacheTab
13f0: 6c 65 4c 6f 63 6b 28 70 42 74 72 65 65 2c 20 69  leLock(pBtree, i
1400: 52 6f 6f 74 2c 20 30 2c 20 57 52 49 54 45 5f 4c  Root, 0, WRITE_L
1410: 4f 43 4b 29 20 29 3b 0a 2a 2a 0a 2a 2a 20 57 68  OCK) );.**.** Wh
1420: 65 6e 20 77 72 69 74 69 6e 67 20 74 6f 20 61 6e  en writing to an
1430: 20 69 6e 64 65 78 20 74 68 61 74 20 72 65 73 69   index that resi
1440: 64 65 73 20 69 6e 20 61 20 73 68 61 72 61 62 6c  des in a sharabl
1450: 65 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 20  e database, the 
1460: 0a 2a 2a 20 63 61 6c 6c 65 72 20 73 68 6f 75 6c  .** caller shoul
1470: 64 20 68 61 76 65 20 66 69 72 73 74 20 6f 62 74  d have first obt
1480: 61 69 6e 65 64 20 61 20 6c 6f 63 6b 20 73 70 65  ained a lock spe
1490: 63 69 66 79 69 6e 67 20 74 68 65 20 72 6f 6f 74  cifying the root
14a0: 20 70 61 67 65 20 6f 66 0a 2a 2a 20 74 68 65 20   page of.** the 
14b0: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 61  corresponding ta
14c0: 62 6c 65 2e 20 54 68 69 73 20 6d 61 6b 65 73 20  ble. This makes 
14d0: 74 68 69 6e 67 73 20 61 20 62 69 74 20 6d 6f 72  things a bit mor
14e0: 65 20 63 6f 6d 70 6c 69 63 61 74 65 64 2c 0a 2a  e complicated,.*
14f0: 2a 20 61 73 20 74 68 69 73 20 6d 6f 64 75 6c 65  * as this module
1500: 20 74 72 65 61 74 73 20 65 61 63 68 20 74 61 62   treats each tab
1510: 6c 65 20 61 73 20 61 20 73 65 70 61 72 61 74 65  le as a separate
1520: 20 73 74 72 75 63 74 75 72 65 2e 20 54 6f 20 64   structure. To d
1530: 65 74 65 72 6d 69 6e 65 0a 2a 2a 20 74 68 65 20  etermine.** the 
1540: 74 61 62 6c 65 20 63 6f 72 72 65 73 70 6f 6e 64  table correspond
1550: 69 6e 67 20 74 6f 20 74 68 65 20 69 6e 64 65 78  ing to the index
1560: 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 2c 20   being written, 
1570: 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  this.** function
1580: 20 68 61 73 20 74 6f 20 73 65 61 72 63 68 20 74   has to search t
1590: 68 72 6f 75 67 68 20 74 68 65 20 64 61 74 61 62  hrough the datab
15a0: 61 73 65 20 73 63 68 65 6d 61 2e 0a 2a 2a 0a 2a  ase schema..**.*
15b0: 2a 20 49 6e 73 74 65 61 64 20 6f 66 20 61 20 6c  * Instead of a l
15c0: 6f 63 6b 20 6f 6e 20 74 68 65 20 74 61 62 6c 65  ock on the table
15d0: 2f 69 6e 64 65 78 20 72 6f 6f 74 65 64 20 61 74  /index rooted at
15e0: 20 70 61 67 65 20 69 52 6f 6f 74 2c 20 74 68 65   page iRoot, the
15f0: 20 63 61 6c 6c 65 72 20 6d 61 79 0a 2a 2a 20 68   caller may.** h
1600: 6f 6c 64 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b  old a write-lock
1610: 20 6f 6e 20 74 68 65 20 73 63 68 65 6d 61 20 74   on the schema t
1620: 61 62 6c 65 20 28 72 6f 6f 74 20 70 61 67 65 20  able (root page 
1630: 31 29 2e 20 54 68 69 73 20 69 73 20 61 6c 73 6f  1). This is also
1640: 0a 2a 2a 20 61 63 63 65 70 74 61 62 6c 65 2e 0a  .** acceptable..
1650: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 68 61  */.static int ha
1660: 73 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  sSharedCacheTabl
1670: 65 4c 6f 63 6b 28 0a 20 20 42 74 72 65 65 20 2a  eLock(.  Btree *
1680: 70 42 74 72 65 65 2c 20 20 20 20 20 20 20 20 20  pBtree,         
1690: 2f 2a 20 48 61 6e 64 6c 65 20 74 68 61 74 20 6d  /* Handle that m
16a0: 75 73 74 20 68 6f 6c 64 20 6c 6f 63 6b 20 2a 2f  ust hold lock */
16b0: 0a 20 20 50 67 6e 6f 20 69 52 6f 6f 74 2c 20 20  .  Pgno iRoot,  
16c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f            /* Roo
16d0: 74 20 70 61 67 65 20 6f 66 20 62 2d 74 72 65 65  t page of b-tree
16e0: 20 2a 2f 0a 20 20 69 6e 74 20 69 73 49 6e 64 65   */.  int isInde
16f0: 78 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  x,           /* 
1700: 54 72 75 65 20 69 66 20 69 52 6f 6f 74 20 69 73  True if iRoot is
1710: 20 74 68 65 20 72 6f 6f 74 20 6f 66 20 61 6e 20   the root of an 
1720: 69 6e 64 65 78 20 62 2d 74 72 65 65 20 2a 2f 0a  index b-tree */.
1730: 20 20 69 6e 74 20 65 4c 6f 63 6b 54 79 70 65 20    int eLockType 
1740: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 71 75           /* Requ
1750: 69 72 65 64 20 6c 6f 63 6b 20 74 79 70 65 20 28  ired lock type (
1760: 52 45 41 44 5f 4c 4f 43 4b 20 6f 72 20 57 52 49  READ_LOCK or WRI
1770: 54 45 5f 4c 4f 43 4b 29 20 2a 2f 0a 29 7b 0a 20  TE_LOCK) */.){. 
1780: 20 53 63 68 65 6d 61 20 2a 70 53 63 68 65 6d 61   Schema *pSchema
1790: 20 3d 20 28 53 63 68 65 6d 61 20 2a 29 70 42 74   = (Schema *)pBt
17a0: 72 65 65 2d 3e 70 42 74 2d 3e 70 53 63 68 65 6d  ree->pBt->pSchem
17b0: 61 3b 0a 20 20 50 67 6e 6f 20 69 54 61 62 20 3d  a;.  Pgno iTab =
17c0: 20 30 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70 4c   0;.  BtLock *pL
17d0: 6f 63 6b 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  ock;..  /* If th
17e0: 69 73 20 64 61 74 61 62 61 73 65 20 69 73 20 6e  is database is n
17f0: 6f 74 20 73 68 61 72 65 61 62 6c 65 2c 20 6f 72  ot shareable, or
1800: 20 69 66 20 74 68 65 20 63 6c 69 65 6e 74 20 69   if the client i
1810: 73 20 72 65 61 64 69 6e 67 0a 20 20 2a 2a 20 61  s reading.  ** a
1820: 6e 64 20 68 61 73 20 74 68 65 20 72 65 61 64 2d  nd has the read-
1830: 75 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67  uncommitted flag
1840: 20 73 65 74 2c 20 74 68 65 6e 20 6e 6f 20 6c 6f   set, then no lo
1850: 63 6b 20 69 73 20 72 65 71 75 69 72 65 64 2e 20  ck is required. 
1860: 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  .  ** Return tru
1870: 65 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 20  e immediately.. 
1880: 20 2a 2f 0a 20 20 69 66 28 20 28 70 42 74 72 65   */.  if( (pBtre
1890: 65 2d 3e 73 68 61 72 61 62 6c 65 3d 3d 30 29 0a  e->sharable==0).
18a0: 20 20 20 7c 7c 20 28 65 4c 6f 63 6b 54 79 70 65     || (eLockType
18b0: 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 26 26 20 28  ==READ_LOCK && (
18c0: 70 42 74 72 65 65 2d 3e 64 62 2d 3e 66 6c 61 67  pBtree->db->flag
18d0: 73 20 26 20 53 51 4c 49 54 45 5f 52 65 61 64 55  s & SQLITE_ReadU
18e0: 6e 63 6f 6d 6d 69 74 29 29 0a 20 20 29 7b 0a 20  ncommit)).  ){. 
18f0: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
1900: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6c  ..  /* If the cl
1910: 69 65 6e 74 20 69 73 20 72 65 61 64 69 6e 67 20  ient is reading 
1920: 20 6f 72 20 77 72 69 74 69 6e 67 20 61 6e 20 69   or writing an i
1930: 6e 64 65 78 20 61 6e 64 20 74 68 65 20 73 63 68  ndex and the sch
1940: 65 6d 61 20 69 73 0a 20 20 2a 2a 20 6e 6f 74 20  ema is.  ** not 
1950: 6c 6f 61 64 65 64 2c 20 74 68 65 6e 20 69 74 20  loaded, then it 
1960: 69 73 20 74 6f 6f 20 64 69 66 66 69 63 75 6c 74  is too difficult
1970: 20 74 6f 20 61 63 74 75 61 6c 6c 79 20 63 68 65   to actually che
1980: 63 6b 20 74 6f 20 73 65 65 20 69 66 0a 20 20 2a  ck to see if.  *
1990: 2a 20 74 68 65 20 63 6f 72 72 65 63 74 20 6c 6f  * the correct lo
19a0: 63 6b 73 20 61 72 65 20 68 65 6c 64 2e 20 20 53  cks are held.  S
19b0: 6f 20 64 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20  o do not bother 
19c0: 2d 20 6a 75 73 74 20 72 65 74 75 72 6e 20 74 72  - just return tr
19d0: 75 65 2e 0a 20 20 2a 2a 20 54 68 69 73 20 63 61  ue..  ** This ca
19e0: 73 65 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6d 65  se does not come
19f0: 20 75 70 20 76 65 72 79 20 6f 66 74 65 6e 20 61   up very often a
1a00: 6e 79 68 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66  nyhow..  */.  if
1a10: 28 20 69 73 49 6e 64 65 78 20 26 26 20 28 21 70  ( isIndex && (!p
1a20: 53 63 68 65 6d 61 20 7c 7c 20 28 70 53 63 68 65  Schema || (pSche
1a30: 6d 61 2d 3e 73 63 68 65 6d 61 46 6c 61 67 73 26  ma->schemaFlags&
1a40: 44 42 5f 53 63 68 65 6d 61 4c 6f 61 64 65 64 29  DB_SchemaLoaded)
1a50: 3d 3d 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75  ==0) ){.    retu
1a60: 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  rn 1;.  }..  /* 
1a70: 46 69 67 75 72 65 20 6f 75 74 20 74 68 65 20 72  Figure out the r
1a80: 6f 6f 74 2d 70 61 67 65 20 74 68 61 74 20 74 68  oot-page that th
1a90: 65 20 6c 6f 63 6b 20 73 68 6f 75 6c 64 20 62 65  e lock should be
1aa0: 20 68 65 6c 64 20 6f 6e 2e 20 46 6f 72 20 74 61   held on. For ta
1ab0: 62 6c 65 0a 20 20 2a 2a 20 62 2d 74 72 65 65 73  ble.  ** b-trees
1ac0: 2c 20 74 68 69 73 20 69 73 20 6a 75 73 74 20 74  , this is just t
1ad0: 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20  he root page of 
1ae0: 74 68 65 20 62 2d 74 72 65 65 20 62 65 69 6e 67  the b-tree being
1af0: 20 72 65 61 64 20 6f 72 0a 20 20 2a 2a 20 77 72   read or.  ** wr
1b00: 69 74 74 65 6e 2e 20 46 6f 72 20 69 6e 64 65 78  itten. For index
1b10: 20 62 2d 74 72 65 65 73 2c 20 69 74 20 69 73 20   b-trees, it is 
1b20: 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66  the root page of
1b30: 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 0a   the associated.
1b40: 20 20 2a 2a 20 74 61 62 6c 65 2e 20 20 2a 2f 0a    ** table.  */.
1b50: 20 20 69 66 28 20 69 73 49 6e 64 65 78 20 29 7b    if( isIndex ){
1b60: 0a 20 20 20 20 48 61 73 68 45 6c 65 6d 20 2a 70  .    HashElem *p
1b70: 3b 0a 20 20 20 20 66 6f 72 28 70 3d 73 71 6c 69  ;.    for(p=sqli
1b80: 74 65 48 61 73 68 46 69 72 73 74 28 26 70 53 63  teHashFirst(&pSc
1b90: 68 65 6d 61 2d 3e 69 64 78 48 61 73 68 29 3b 20  hema->idxHash); 
1ba0: 70 3b 20 70 3d 73 71 6c 69 74 65 48 61 73 68 4e  p; p=sqliteHashN
1bb0: 65 78 74 28 70 29 29 7b 0a 20 20 20 20 20 20 49  ext(p)){.      I
1bc0: 6e 64 65 78 20 2a 70 49 64 78 20 3d 20 28 49 6e  ndex *pIdx = (In
1bd0: 64 65 78 20 2a 29 73 71 6c 69 74 65 48 61 73 68  dex *)sqliteHash
1be0: 44 61 74 61 28 70 29 3b 0a 20 20 20 20 20 20 69  Data(p);.      i
1bf0: 66 28 20 70 49 64 78 2d 3e 74 6e 75 6d 3d 3d 28  f( pIdx->tnum==(
1c00: 69 6e 74 29 69 52 6f 6f 74 20 29 7b 0a 20 20 20  int)iRoot ){.   
1c10: 20 20 20 20 20 69 66 28 20 69 54 61 62 20 29 7b       if( iTab ){
1c20: 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 77  .          /* Tw
1c30: 6f 20 6f 72 20 6d 6f 72 65 20 69 6e 64 65 78 65  o or more indexe
1c40: 73 20 73 68 61 72 65 20 74 68 65 20 73 61 6d 65  s share the same
1c50: 20 72 6f 6f 74 20 70 61 67 65 2e 20 20 54 68 65   root page.  The
1c60: 72 65 20 6d 75 73 74 0a 20 20 20 20 20 20 20 20  re must.        
1c70: 20 20 2a 2a 20 62 65 20 69 6d 70 6f 73 74 65 72    ** be imposter
1c80: 20 74 61 62 6c 65 73 2e 20 20 53 6f 20 6a 75 73   tables.  So jus
1c90: 74 20 72 65 74 75 72 6e 20 74 72 75 65 2e 20 20  t return true.  
1ca0: 54 68 65 20 61 73 73 65 72 74 20 69 73 20 6e 6f  The assert is no
1cb0: 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 75  t.          ** u
1cc0: 73 65 66 75 6c 20 69 6e 20 74 68 61 74 20 63 61  seful in that ca
1cd0: 73 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  se. */.         
1ce0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
1cf0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 54 61     }.        iTa
1d00: 62 20 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c 65  b = pIdx->pTable
1d10: 2d 3e 74 6e 75 6d 3b 0a 20 20 20 20 20 20 7d 0a  ->tnum;.      }.
1d20: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
1d30: 20 20 20 69 54 61 62 20 3d 20 69 52 6f 6f 74 3b     iTab = iRoot;
1d40: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 61 72 63  .  }..  /* Searc
1d50: 68 20 66 6f 72 20 74 68 65 20 72 65 71 75 69 72  h for the requir
1d60: 65 64 20 6c 6f 63 6b 2e 20 45 69 74 68 65 72 20  ed lock. Either 
1d70: 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20  a write-lock on 
1d80: 72 6f 6f 74 2d 70 61 67 65 20 69 54 61 62 2c 20  root-page iTab, 
1d90: 61 20 0a 20 20 2a 2a 20 77 72 69 74 65 2d 6c 6f  a .  ** write-lo
1da0: 63 6b 20 6f 6e 20 74 68 65 20 73 63 68 65 6d 61  ck on the schema
1db0: 20 74 61 62 6c 65 2c 20 6f 72 20 28 69 66 20 74   table, or (if t
1dc0: 68 65 20 63 6c 69 65 6e 74 20 69 73 20 72 65 61  he client is rea
1dd0: 64 69 6e 67 29 20 61 0a 20 20 2a 2a 20 72 65 61  ding) a.  ** rea
1de0: 64 2d 6c 6f 63 6b 20 6f 6e 20 69 54 61 62 20 77  d-lock on iTab w
1df0: 69 6c 6c 20 73 75 66 66 69 63 65 2e 20 52 65 74  ill suffice. Ret
1e00: 75 72 6e 20 31 20 69 66 20 61 6e 79 20 6f 66 20  urn 1 if any of 
1e10: 74 68 65 73 65 20 61 72 65 20 66 6f 75 6e 64 2e  these are found.
1e20: 20 20 2a 2f 0a 20 20 66 6f 72 28 70 4c 6f 63 6b    */.  for(pLock
1e30: 3d 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 4c  =pBtree->pBt->pL
1e40: 6f 63 6b 3b 20 70 4c 6f 63 6b 3b 20 70 4c 6f 63  ock; pLock; pLoc
1e50: 6b 3d 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 29 7b  k=pLock->pNext){
1e60: 0a 20 20 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e  .    if( pLock->
1e70: 70 42 74 72 65 65 3d 3d 70 42 74 72 65 65 20 0a  pBtree==pBtree .
1e80: 20 20 20 20 20 26 26 20 28 70 4c 6f 63 6b 2d 3e       && (pLock->
1e90: 69 54 61 62 6c 65 3d 3d 69 54 61 62 20 7c 7c 20  iTable==iTab || 
1ea0: 28 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 3d 3d 57  (pLock->eLock==W
1eb0: 52 49 54 45 5f 4c 4f 43 4b 20 26 26 20 70 4c 6f  RITE_LOCK && pLo
1ec0: 63 6b 2d 3e 69 54 61 62 6c 65 3d 3d 31 29 29 0a  ck->iTable==1)).
1ed0: 20 20 20 20 20 26 26 20 70 4c 6f 63 6b 2d 3e 65       && pLock->e
1ee0: 4c 6f 63 6b 3e 3d 65 4c 6f 63 6b 54 79 70 65 20  Lock>=eLockType 
1ef0: 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65  .    ){.      re
1f00: 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
1f10: 7d 0a 0a 20 20 2f 2a 20 46 61 69 6c 65 64 20 74  }..  /* Failed t
1f20: 6f 20 66 69 6e 64 20 74 68 65 20 72 65 71 75 69  o find the requi
1f30: 72 65 64 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 72  red lock. */.  r
1f40: 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69  eturn 0;.}.#endi
1f50: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55  f /* SQLITE_DEBU
1f60: 47 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c  G */..#ifdef SQL
1f70: 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 2a  ITE_DEBUG./*.***
1f80: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
1f90: 6d 61 79 20 62 65 20 75 73 65 64 20 61 73 20 70  may be used as p
1fa0: 61 72 74 20 6f 66 20 61 73 73 65 72 74 28 29 20  art of assert() 
1fb0: 73 74 61 74 65 6d 65 6e 74 73 20 6f 6e 6c 79 2e  statements only.
1fc0: 20 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 52 65 74 75   ****.**.** Retu
1fd0: 72 6e 20 74 72 75 65 20 69 66 20 69 74 20 77 6f  rn true if it wo
1fe0: 75 6c 64 20 62 65 20 69 6c 6c 65 67 61 6c 20 66  uld be illegal f
1ff0: 6f 72 20 70 42 74 72 65 65 20 74 6f 20 77 72 69  or pBtree to wri
2000: 74 65 20 69 6e 74 6f 20 74 68 65 0a 2a 2a 20 74  te into the.** t
2010: 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 72 6f  able or index ro
2020: 6f 74 65 64 20 61 74 20 69 52 6f 6f 74 20 62 65  oted at iRoot be
2030: 63 61 75 73 65 20 6f 74 68 65 72 20 73 68 61 72  cause other shar
2040: 65 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61  ed connections a
2050: 72 65 0a 2a 2a 20 73 69 6d 75 6c 74 61 6e 65 6f  re.** simultaneo
2060: 75 73 6c 79 20 72 65 61 64 69 6e 67 20 74 68 61  usly reading tha
2070: 74 20 73 61 6d 65 20 74 61 62 6c 65 20 6f 72 20  t same table or 
2080: 69 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 49 74 20  index..**.** It 
2090: 69 73 20 69 6c 6c 65 67 61 6c 20 66 6f 72 20 70  is illegal for p
20a0: 42 74 72 65 65 20 74 6f 20 77 72 69 74 65 20 69  Btree to write i
20b0: 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 42 74 72  f some other Btr
20c0: 65 65 20 6f 62 6a 65 63 74 20 74 68 61 74 0a 2a  ee object that.*
20d0: 2a 20 73 68 61 72 65 73 20 74 68 65 20 73 61 6d  * shares the sam
20e0: 65 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63  e BtShared objec
20f0: 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 72  t is currently r
2100: 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e  eading or writin
2110: 67 0a 2a 2a 20 74 68 65 20 69 52 6f 6f 74 20 74  g.** the iRoot t
2120: 61 62 6c 65 2e 20 20 45 78 63 65 70 74 2c 20 69  able.  Except, i
2130: 66 20 74 68 65 20 6f 74 68 65 72 20 42 74 72 65  f the other Btre
2140: 65 20 6f 62 6a 65 63 74 20 68 61 73 20 74 68 65  e object has the
2150: 0a 2a 2a 20 72 65 61 64 2d 75 6e 63 6f 6d 6d 69  .** read-uncommi
2160: 74 74 65 64 20 66 6c 61 67 20 73 65 74 2c 20 74  tted flag set, t
2170: 68 65 6e 20 69 74 20 69 73 20 4f 4b 20 66 6f 72  hen it is OK for
2180: 20 74 68 65 20 6f 74 68 65 72 20 6f 62 6a 65 63   the other objec
2190: 74 20 74 6f 0a 2a 2a 20 68 61 76 65 20 61 20 72  t to.** have a r
21a0: 65 61 64 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a  ead cursor..**.*
21b0: 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 62  * For example, b
21c0: 65 66 6f 72 65 20 77 72 69 74 69 6e 67 20 74 6f  efore writing to
21d0: 20 61 6e 79 20 70 61 72 74 20 6f 66 20 74 68 65   any part of the
21e0: 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 0a   table or index.
21f0: 2a 2a 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67  ** rooted at pag
2200: 65 20 69 52 6f 6f 74 2c 20 6f 6e 65 20 73 68 6f  e iRoot, one sho
2210: 75 6c 64 20 63 61 6c 6c 3a 0a 2a 2a 0a 2a 2a 20  uld call:.**.** 
2220: 20 20 20 61 73 73 65 72 74 28 20 21 68 61 73 52     assert( !hasR
2230: 65 61 64 43 6f 6e 66 6c 69 63 74 73 28 70 42 74  eadConflicts(pBt
2240: 72 65 65 2c 20 69 52 6f 6f 74 29 20 29 3b 0a 2a  ree, iRoot) );.*
2250: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 68 61 73  /.static int has
2260: 52 65 61 64 43 6f 6e 66 6c 69 63 74 73 28 42 74  ReadConflicts(Bt
2270: 72 65 65 20 2a 70 42 74 72 65 65 2c 20 50 67 6e  ree *pBtree, Pgn
2280: 6f 20 69 52 6f 6f 74 29 7b 0a 20 20 42 74 43 75  o iRoot){.  BtCu
2290: 72 73 6f 72 20 2a 70 3b 0a 20 20 66 6f 72 28 70  rsor *p;.  for(p
22a0: 3d 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 43  =pBtree->pBt->pC
22b0: 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70  ursor; p; p=p->p
22c0: 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70  Next){.    if( p
22d0: 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f  ->pgnoRoot==iRoo
22e0: 74 20 0a 20 20 20 20 20 26 26 20 70 2d 3e 70 42  t .     && p->pB
22f0: 74 72 65 65 21 3d 70 42 74 72 65 65 0a 20 20 20  tree!=pBtree.   
2300: 20 20 26 26 20 30 3d 3d 28 70 2d 3e 70 42 74 72    && 0==(p->pBtr
2310: 65 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20  ee->db->flags & 
2320: 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d  SQLITE_ReadUncom
2330: 6d 69 74 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  mit).    ){.    
2340: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
2350: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
2360: 3b 0a 7d 0a 23 65 6e 64 69 66 20 20 20 20 2f 2a  ;.}.#endif    /*
2370: 20 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44   #ifdef SQLITE_D
2380: 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 51  EBUG */../*.** Q
2390: 75 65 72 79 20 74 6f 20 73 65 65 20 69 66 20 42  uery to see if B
23a0: 74 72 65 65 20 68 61 6e 64 6c 65 20 70 20 6d 61  tree handle p ma
23b0: 79 20 6f 62 74 61 69 6e 20 61 20 6c 6f 63 6b 20  y obtain a lock 
23c0: 6f 66 20 74 79 70 65 20 65 4c 6f 63 6b 20 0a 2a  of type eLock .*
23d0: 2a 20 28 52 45 41 44 5f 4c 4f 43 4b 20 6f 72 20  * (READ_LOCK or 
23e0: 57 52 49 54 45 5f 4c 4f 43 4b 29 20 6f 6e 20 74  WRITE_LOCK) on t
23f0: 68 65 20 74 61 62 6c 65 20 77 69 74 68 20 72 6f  he table with ro
2400: 6f 74 2d 70 61 67 65 20 69 54 61 62 2e 20 52 65  ot-page iTab. Re
2410: 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  turn.** SQLITE_O
2420: 4b 20 69 66 20 74 68 65 20 6c 6f 63 6b 20 6d 61  K if the lock ma
2430: 79 20 62 65 20 6f 62 74 61 69 6e 65 64 20 28 62  y be obtained (b
2440: 79 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73 65 74  y calling.** set
2450: 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
2460: 4c 6f 63 6b 28 29 29 2c 20 6f 72 20 53 51 4c 49  Lock()), or SQLI
2470: 54 45 5f 4c 4f 43 4b 45 44 20 69 66 20 6e 6f 74  TE_LOCKED if not
2480: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2490: 71 75 65 72 79 53 68 61 72 65 64 43 61 63 68 65  querySharedCache
24a0: 54 61 62 6c 65 4c 6f 63 6b 28 42 74 72 65 65 20  TableLock(Btree 
24b0: 2a 70 2c 20 50 67 6e 6f 20 69 54 61 62 2c 20 75  *p, Pgno iTab, u
24c0: 38 20 65 4c 6f 63 6b 29 7b 0a 20 20 42 74 53 68  8 eLock){.  BtSh
24d0: 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
24e0: 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70 49  Bt;.  BtLock *pI
24f0: 74 65 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ter;..  assert( 
2500: 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64  sqlite3BtreeHold
2510: 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61  sMutex(p) );.  a
2520: 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52 45  ssert( eLock==RE
2530: 41 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b  AD_LOCK || eLock
2540: 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a  ==WRITE_LOCK );.
2550: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62 21    assert( p->db!
2560: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
2570: 21 28 70 2d 3e 64 62 2d 3e 66 6c 61 67 73 26 53  !(p->db->flags&S
2580: 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d  QLITE_ReadUncomm
2590: 69 74 29 7c 7c 65 4c 6f 63 6b 3d 3d 57 52 49 54  it)||eLock==WRIT
25a0: 45 5f 4c 4f 43 4b 7c 7c 69 54 61 62 3d 3d 31 20  E_LOCK||iTab==1 
25b0: 29 3b 0a 20 20 0a 20 20 2f 2a 20 49 66 20 72 65  );.  .  /* If re
25c0: 71 75 65 73 74 69 6e 67 20 61 20 77 72 69 74 65  questing a write
25d0: 2d 6c 6f 63 6b 2c 20 74 68 65 6e 20 74 68 65 20  -lock, then the 
25e0: 42 74 72 65 65 20 6d 75 73 74 20 68 61 76 65 20  Btree must have 
25f0: 61 6e 20 6f 70 65 6e 20 77 72 69 74 65 0a 20 20  an open write.  
2600: 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f  ** transaction o
2610: 6e 20 74 68 69 73 20 66 69 6c 65 2e 20 41 6e 64  n this file. And
2620: 2c 20 6f 62 76 69 6f 75 73 6c 79 2c 20 66 6f 72  , obviously, for
2630: 20 74 68 69 73 20 74 6f 20 62 65 20 73 6f 20 74   this to be so t
2640: 68 65 72 65 20 0a 20 20 2a 2a 20 6d 75 73 74 20  here .  ** must 
2650: 62 65 20 61 6e 20 6f 70 65 6e 20 77 72 69 74 65  be an open write
2660: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20   transaction on 
2670: 74 68 65 20 66 69 6c 65 20 69 74 73 65 6c 66 2e  the file itself.
2680: 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
2690: 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b  eLock==READ_LOCK
26a0: 20 7c 7c 20 28 70 3d 3d 70 42 74 2d 3e 70 57 72   || (p==pBt->pWr
26b0: 69 74 65 72 20 26 26 20 70 2d 3e 69 6e 54 72 61  iter && p->inTra
26c0: 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 29  ns==TRANS_WRITE)
26d0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4c   );.  assert( eL
26e0: 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c  ock==READ_LOCK |
26f0: 7c 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  | pBt->inTransac
2700: 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54  tion==TRANS_WRIT
2710: 45 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 54 68 69  E );.  .  /* Thi
2720: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
2730: 6f 2d 6f 70 20 69 66 20 74 68 65 20 73 68 61 72  o-op if the shar
2740: 65 64 2d 63 61 63 68 65 20 69 73 20 6e 6f 74 20  ed-cache is not 
2750: 65 6e 61 62 6c 65 64 20 2a 2f 0a 20 20 69 66 28  enabled */.  if(
2760: 20 21 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b   !p->sharable ){
2770: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
2780: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  TE_OK;.  }..  /*
2790: 20 49 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 63   If some other c
27a0: 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 68 6f 6c  onnection is hol
27b0: 64 69 6e 67 20 61 6e 20 65 78 63 6c 75 73 69 76  ding an exclusiv
27c0: 65 20 6c 6f 63 6b 2c 20 74 68 65 0a 20 20 2a 2a  e lock, the.  **
27d0: 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 20   requested lock 
27e0: 6d 61 79 20 6e 6f 74 20 62 65 20 6f 62 74 61 69  may not be obtai
27f0: 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ned..  */.  if( 
2800: 70 42 74 2d 3e 70 57 72 69 74 65 72 21 3d 70 20  pBt->pWriter!=p 
2810: 26 26 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67  && (pBt->btsFlag
2820: 73 20 26 20 42 54 53 5f 45 58 43 4c 55 53 49 56  s & BTS_EXCLUSIV
2830: 45 29 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  E)!=0 ){.    sql
2840: 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c  ite3ConnectionBl
2850: 6f 63 6b 65 64 28 70 2d 3e 64 62 2c 20 70 42 74  ocked(p->db, pBt
2860: 2d 3e 70 57 72 69 74 65 72 2d 3e 64 62 29 3b 0a  ->pWriter->db);.
2870: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2880: 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44 43  E_LOCKED_SHAREDC
2890: 41 43 48 45 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72  ACHE;.  }..  for
28a0: 28 70 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f 63  (pIter=pBt->pLoc
28b0: 6b 3b 20 70 49 74 65 72 3b 20 70 49 74 65 72 3d  k; pIter; pIter=
28c0: 70 49 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20  pIter->pNext){. 
28d0: 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 64 69 74     /* The condit
28e0: 69 6f 6e 20 28 70 49 74 65 72 2d 3e 65 4c 6f 63  ion (pIter->eLoc
28f0: 6b 21 3d 65 4c 6f 63 6b 29 20 69 6e 20 74 68 65  k!=eLock) in the
2900: 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 66 28 2e 2e   following if(..
2910: 2e 29 20 0a 20 20 20 20 2a 2a 20 73 74 61 74 65  .) .    ** state
2920: 6d 65 6e 74 20 69 73 20 61 20 73 69 6d 70 6c 69  ment is a simpli
2930: 66 69 63 61 74 69 6f 6e 20 6f 66 3a 0a 20 20 20  fication of:.   
2940: 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 28 65 4c   **.    **   (eL
2950: 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20  ock==WRITE_LOCK 
2960: 7c 7c 20 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 3d  || pIter->eLock=
2970: 3d 57 52 49 54 45 5f 4c 4f 43 4b 29 0a 20 20 20  =WRITE_LOCK).   
2980: 20 2a 2a 0a 20 20 20 20 2a 2a 20 73 69 6e 63 65   **.    ** since
2990: 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 69 66   we know that if
29a0: 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f   eLock==WRITE_LO
29b0: 43 4b 2c 20 74 68 65 6e 20 6e 6f 20 6f 74 68 65  CK, then no othe
29c0: 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 20 20 20  r connection.   
29d0: 20 2a 2a 20 6d 61 79 20 68 6f 6c 64 20 61 20 57   ** may hold a W
29e0: 52 49 54 45 5f 4c 4f 43 4b 20 6f 6e 20 61 6e 79  RITE_LOCK on any
29f0: 20 74 61 62 6c 65 20 69 6e 20 74 68 69 73 20 66   table in this f
2a00: 69 6c 65 20 28 73 69 6e 63 65 20 74 68 65 72 65  ile (since there
2a10: 20 63 61 6e 0a 20 20 20 20 2a 2a 20 6f 6e 6c 79   can.    ** only
2a20: 20 62 65 20 61 20 73 69 6e 67 6c 65 20 77 72 69   be a single wri
2a30: 74 65 72 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ter)..    */.   
2a40: 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e   assert( pIter->
2a50: 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b  eLock==READ_LOCK
2a60: 20 7c 7c 20 70 49 74 65 72 2d 3e 65 4c 6f 63 6b   || pIter->eLock
2a70: 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a  ==WRITE_LOCK );.
2a80: 20 20 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63      assert( eLoc
2a90: 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20  k==READ_LOCK || 
2aa0: 70 49 74 65 72 2d 3e 70 42 74 72 65 65 3d 3d 70  pIter->pBtree==p
2ab0: 20 7c 7c 20 70 49 74 65 72 2d 3e 65 4c 6f 63 6b   || pIter->eLock
2ac0: 3d 3d 52 45 41 44 5f 4c 4f 43 4b 29 3b 0a 20 20  ==READ_LOCK);.  
2ad0: 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70 42 74    if( pIter->pBt
2ae0: 72 65 65 21 3d 70 20 26 26 20 70 49 74 65 72 2d  ree!=p && pIter-
2af0: 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62 20 26 26  >iTable==iTab &&
2b00: 20 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 21 3d 65   pIter->eLock!=e
2b10: 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 73 71  Lock ){.      sq
2b20: 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 42  lite3ConnectionB
2b30: 6c 6f 63 6b 65 64 28 70 2d 3e 64 62 2c 20 70 49  locked(p->db, pI
2b40: 74 65 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 29  ter->pBtree->db)
2b50: 3b 0a 20 20 20 20 20 20 69 66 28 20 65 4c 6f 63  ;.      if( eLoc
2b60: 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29 7b  k==WRITE_LOCK ){
2b70: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
2b80: 20 70 3d 3d 70 42 74 2d 3e 70 57 72 69 74 65 72   p==pBt->pWriter
2b90: 20 29 3b 0a 20 20 20 20 20 20 20 20 70 42 74 2d   );.        pBt-
2ba0: 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53  >btsFlags |= BTS
2bb0: 5f 50 45 4e 44 49 4e 47 3b 0a 20 20 20 20 20 20  _PENDING;.      
2bc0: 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  }.      return S
2bd0: 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41  QLITE_LOCKED_SHA
2be0: 52 45 44 43 41 43 48 45 3b 0a 20 20 20 20 7d 0a  REDCACHE;.    }.
2bf0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
2c00: 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  ITE_OK;.}.#endif
2c10: 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54   /* !SQLITE_OMIT
2c20: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20 2a 2f  _SHARED_CACHE */
2c30: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
2c40: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
2c50: 48 45 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6c  HE./*.** Add a l
2c60: 6f 63 6b 20 6f 6e 20 74 68 65 20 74 61 62 6c 65  ock on the table
2c70: 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20   with root-page 
2c80: 69 54 61 62 6c 65 20 74 6f 20 74 68 65 20 73 68  iTable to the sh
2c90: 61 72 65 64 2d 62 74 72 65 65 20 75 73 65 64 0a  ared-btree used.
2ca0: 2a 2a 20 62 79 20 42 74 72 65 65 20 68 61 6e 64  ** by Btree hand
2cb0: 6c 65 20 70 2e 20 50 61 72 61 6d 65 74 65 72 20  le p. Parameter 
2cc0: 65 4c 6f 63 6b 20 6d 75 73 74 20 62 65 20 65 69  eLock must be ei
2cd0: 74 68 65 72 20 52 45 41 44 5f 4c 4f 43 4b 20 6f  ther READ_LOCK o
2ce0: 72 20 0a 2a 2a 20 57 52 49 54 45 5f 4c 4f 43 4b  r .** WRITE_LOCK
2cf0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
2d00: 63 74 69 6f 6e 20 61 73 73 75 6d 65 73 20 74 68  ction assumes th
2d10: 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a  e following:.**.
2d20: 2a 2a 20 20 20 28 61 29 20 54 68 65 20 73 70 65  **   (a) The spe
2d30: 63 69 66 69 65 64 20 42 74 72 65 65 20 6f 62 6a  cified Btree obj
2d40: 65 63 74 20 70 20 69 73 20 63 6f 6e 6e 65 63 74  ect p is connect
2d50: 65 64 20 74 6f 20 61 20 73 68 61 72 61 62 6c 65  ed to a sharable
2d60: 0a 2a 2a 20 20 20 20 20 20 20 64 61 74 61 62 61  .**       databa
2d70: 73 65 20 28 6f 6e 65 20 77 69 74 68 20 74 68 65  se (one with the
2d80: 20 42 74 53 68 61 72 65 64 2e 73 68 61 72 61 62   BtShared.sharab
2d90: 6c 65 20 66 6c 61 67 20 73 65 74 29 2c 20 61 6e  le flag set), an
2da0: 64 0a 2a 2a 0a 2a 2a 20 20 20 28 62 29 20 4e 6f  d.**.**   (b) No
2db0: 20 6f 74 68 65 72 20 42 74 72 65 65 20 6f 62 6a   other Btree obj
2dc0: 65 63 74 73 20 68 6f 6c 64 20 61 20 6c 6f 63 6b  ects hold a lock
2dd0: 20 74 68 61 74 20 63 6f 6e 66 6c 69 63 74 73 0a   that conflicts.
2de0: 2a 2a 20 20 20 20 20 20 20 77 69 74 68 20 74 68  **       with th
2df0: 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b  e requested lock
2e00: 20 28 69 2e 65 2e 20 71 75 65 72 79 53 68 61 72   (i.e. queryShar
2e10: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
2e20: 28 29 20 68 61 73 0a 2a 2a 20 20 20 20 20 20 20  () has.**       
2e30: 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63 61 6c  already been cal
2e40: 6c 65 64 20 61 6e 64 20 72 65 74 75 72 6e 65 64  led and returned
2e50: 20 53 51 4c 49 54 45 5f 4f 4b 29 2e 0a 2a 2a 0a   SQLITE_OK)..**.
2e60: 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  ** SQLITE_OK is 
2e70: 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65 20  returned if the 
2e80: 6c 6f 63 6b 20 69 73 20 61 64 64 65 64 20 73 75  lock is added su
2e90: 63 63 65 73 73 66 75 6c 6c 79 2e 20 53 51 4c 49  ccessfully. SQLI
2ea0: 54 45 5f 4e 4f 4d 45 4d 20 0a 2a 2a 20 69 73 20  TE_NOMEM .** is 
2eb0: 72 65 74 75 72 6e 65 64 20 69 66 20 61 20 6d 61  returned if a ma
2ec0: 6c 6c 6f 63 20 61 74 74 65 6d 70 74 20 66 61 69  lloc attempt fai
2ed0: 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ls..*/.static in
2ee0: 74 20 73 65 74 53 68 61 72 65 64 43 61 63 68 65  t setSharedCache
2ef0: 54 61 62 6c 65 4c 6f 63 6b 28 42 74 72 65 65 20  TableLock(Btree 
2f00: 2a 70 2c 20 50 67 6e 6f 20 69 54 61 62 6c 65 2c  *p, Pgno iTable,
2f10: 20 75 38 20 65 4c 6f 63 6b 29 7b 0a 20 20 42 74   u8 eLock){.  Bt
2f20: 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
2f30: 3e 70 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a  >pBt;.  BtLock *
2f40: 70 4c 6f 63 6b 20 3d 20 30 3b 0a 20 20 42 74 4c  pLock = 0;.  BtL
2f50: 6f 63 6b 20 2a 70 49 74 65 72 3b 0a 0a 20 20 61  ock *pIter;..  a
2f60: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74  ssert( sqlite3Bt
2f70: 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29  reeHoldsMutex(p)
2f80: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4c   );.  assert( eL
2f90: 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c  ock==READ_LOCK |
2fa0: 7c 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c  | eLock==WRITE_L
2fb0: 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  OCK );.  assert(
2fc0: 20 70 2d 3e 64 62 21 3d 30 20 29 3b 0a 0a 20 20   p->db!=0 );..  
2fd0: 2f 2a 20 41 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  /* A connection 
2fe0: 77 69 74 68 20 74 68 65 20 72 65 61 64 2d 75 6e  with the read-un
2ff0: 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67 20 73  committed flag s
3000: 65 74 20 77 69 6c 6c 20 6e 65 76 65 72 20 74 72  et will never tr
3010: 79 20 74 6f 0a 20 20 2a 2a 20 6f 62 74 61 69 6e  y to.  ** obtain
3020: 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 75 73 69   a read-lock usi
3030: 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ng this function
3040: 2e 20 54 68 65 20 6f 6e 6c 79 20 72 65 61 64 2d  . The only read-
3050: 6c 6f 63 6b 20 6f 62 74 61 69 6e 65 64 0a 20 20  lock obtained.  
3060: 2a 2a 20 62 79 20 61 20 63 6f 6e 6e 65 63 74 69  ** by a connecti
3070: 6f 6e 20 69 6e 20 72 65 61 64 2d 75 6e 63 6f 6d  on in read-uncom
3080: 6d 69 74 74 65 64 20 6d 6f 64 65 20 69 73 20 6f  mitted mode is o
3090: 6e 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73  n the sqlite_mas
30a0: 74 65 72 20 0a 20 20 2a 2a 20 74 61 62 6c 65 2c  ter .  ** table,
30b0: 20 61 6e 64 20 74 68 61 74 20 6c 6f 63 6b 20 69   and that lock i
30c0: 73 20 6f 62 74 61 69 6e 65 64 20 69 6e 20 42 74  s obtained in Bt
30d0: 72 65 65 42 65 67 69 6e 54 72 61 6e 73 28 29 2e  reeBeginTrans().
30e0: 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 30    */.  assert( 0
30f0: 3d 3d 28 70 2d 3e 64 62 2d 3e 66 6c 61 67 73 26  ==(p->db->flags&
3100: 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d  SQLITE_ReadUncom
3110: 6d 69 74 29 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 57  mit) || eLock==W
3120: 52 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20  RITE_LOCK );..  
3130: 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  /* This function
3140: 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20   should only be 
3150: 63 61 6c 6c 65 64 20 6f 6e 20 61 20 73 68 61 72  called on a shar
3160: 61 62 6c 65 20 62 2d 74 72 65 65 20 61 66 74 65  able b-tree afte
3170: 72 20 69 74 20 0a 20 20 2a 2a 20 68 61 73 20 62  r it .  ** has b
3180: 65 65 6e 20 64 65 74 65 72 6d 69 6e 65 64 20 74  een determined t
3190: 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 62 2d 74  hat no other b-t
31a0: 72 65 65 20 68 6f 6c 64 73 20 61 20 63 6f 6e 66  ree holds a conf
31b0: 6c 69 63 74 69 6e 67 20 6c 6f 63 6b 2e 20 20 2a  licting lock.  *
31c0: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 73  /.  assert( p->s
31d0: 68 61 72 61 62 6c 65 20 29 3b 0a 20 20 61 73 73  harable );.  ass
31e0: 65 72 74 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d  ert( SQLITE_OK==
31f0: 71 75 65 72 79 53 68 61 72 65 64 43 61 63 68 65  querySharedCache
3200: 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 69 54 61  TableLock(p, iTa
3210: 62 6c 65 2c 20 65 4c 6f 63 6b 29 20 29 3b 0a 0a  ble, eLock) );..
3220: 20 20 2f 2a 20 46 69 72 73 74 20 73 65 61 72 63    /* First searc
3230: 68 20 74 68 65 20 6c 69 73 74 20 66 6f 72 20 61  h the list for a
3240: 6e 20 65 78 69 73 74 69 6e 67 20 6c 6f 63 6b 20  n existing lock 
3250: 6f 6e 20 74 68 69 73 20 74 61 62 6c 65 2e 20 2a  on this table. *
3260: 2f 0a 20 20 66 6f 72 28 70 49 74 65 72 3d 70 42  /.  for(pIter=pB
3270: 74 2d 3e 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b  t->pLock; pIter;
3280: 20 70 49 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e   pIter=pIter->pN
3290: 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 49  ext){.    if( pI
32a0: 74 65 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61  ter->iTable==iTa
32b0: 62 6c 65 20 26 26 20 70 49 74 65 72 2d 3e 70 42  ble && pIter->pB
32c0: 74 72 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20  tree==p ){.     
32d0: 20 70 4c 6f 63 6b 20 3d 20 70 49 74 65 72 3b 0a   pLock = pIter;.
32e0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
32f0: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20   }.  }..  /* If 
3300: 74 68 65 20 61 62 6f 76 65 20 73 65 61 72 63 68  the above search
3310: 20 64 69 64 20 6e 6f 74 20 66 69 6e 64 20 61 20   did not find a 
3320: 42 74 4c 6f 63 6b 20 73 74 72 75 63 74 20 61 73  BtLock struct as
3330: 73 6f 63 69 61 74 69 6e 67 20 42 74 72 65 65 20  sociating Btree 
3340: 70 0a 20 20 2a 2a 20 77 69 74 68 20 74 61 62 6c  p.  ** with tabl
3350: 65 20 69 54 61 62 6c 65 2c 20 61 6c 6c 6f 63 61  e iTable, alloca
3360: 74 65 20 6f 6e 65 20 61 6e 64 20 6c 69 6e 6b 20  te one and link 
3370: 69 74 20 69 6e 74 6f 20 74 68 65 20 6c 69 73 74  it into the list
3380: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 4c  ..  */.  if( !pL
3390: 6f 63 6b 20 29 7b 0a 20 20 20 20 70 4c 6f 63 6b  ock ){.    pLock
33a0: 20 3d 20 28 42 74 4c 6f 63 6b 20 2a 29 73 71 6c   = (BtLock *)sql
33b0: 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73  ite3MallocZero(s
33c0: 69 7a 65 6f 66 28 42 74 4c 6f 63 6b 29 29 3b 0a  izeof(BtLock));.
33d0: 20 20 20 20 69 66 28 20 21 70 4c 6f 63 6b 20 29      if( !pLock )
33e0: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
33f0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
3400: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 6f 63  ;.    }.    pLoc
3410: 6b 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54 61 62  k->iTable = iTab
3420: 6c 65 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 70  le;.    pLock->p
3430: 42 74 72 65 65 20 3d 20 70 3b 0a 20 20 20 20 70  Btree = p;.    p
3440: 4c 6f 63 6b 2d 3e 70 4e 65 78 74 20 3d 20 70 42  Lock->pNext = pB
3450: 74 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 20 20 70 42  t->pLock;.    pB
3460: 74 2d 3e 70 4c 6f 63 6b 20 3d 20 70 4c 6f 63 6b  t->pLock = pLock
3470: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20  ;.  }..  /* Set 
3480: 74 68 65 20 42 74 4c 6f 63 6b 2e 65 4c 6f 63 6b  the BtLock.eLock
3490: 20 76 61 72 69 61 62 6c 65 20 74 6f 20 74 68 65   variable to the
34a0: 20 6d 61 78 69 6d 75 6d 20 6f 66 20 74 68 65 20   maximum of the 
34b0: 63 75 72 72 65 6e 74 20 6c 6f 63 6b 0a 20 20 2a  current lock.  *
34c0: 2a 20 61 6e 64 20 74 68 65 20 72 65 71 75 65 73  * and the reques
34d0: 74 65 64 20 6c 6f 63 6b 2e 20 54 68 69 73 20 6d  ted lock. This m
34e0: 65 61 6e 73 20 69 66 20 61 20 77 72 69 74 65 2d  eans if a write-
34f0: 6c 6f 63 6b 20 77 61 73 20 61 6c 72 65 61 64 79  lock was already
3500: 20 68 65 6c 64 0a 20 20 2a 2a 20 61 6e 64 20 61   held.  ** and a
3510: 20 72 65 61 64 2d 6c 6f 63 6b 20 72 65 71 75 65   read-lock reque
3520: 73 74 65 64 2c 20 77 65 20 64 6f 6e 27 74 20 69  sted, we don't i
3530: 6e 63 6f 72 72 65 63 74 6c 79 20 64 6f 77 6e 67  ncorrectly downg
3540: 72 61 64 65 20 74 68 65 20 6c 6f 63 6b 2e 0a 20  rade the lock.. 
3550: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 57 52   */.  assert( WR
3560: 49 54 45 5f 4c 4f 43 4b 3e 52 45 41 44 5f 4c 4f  ITE_LOCK>READ_LO
3570: 43 4b 20 29 3b 0a 20 20 69 66 28 20 65 4c 6f 63  CK );.  if( eLoc
3580: 6b 3e 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 29  k>pLock->eLock )
3590: 7b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 65 4c 6f  {.    pLock->eLo
35a0: 63 6b 20 3d 20 65 4c 6f 63 6b 3b 0a 20 20 7d 0a  ck = eLock;.  }.
35b0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
35c0: 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  _OK;.}.#endif /*
35d0: 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48   !SQLITE_OMIT_SH
35e0: 41 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 23  ARED_CACHE */..#
35f0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
3600: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a  IT_SHARED_CACHE.
3610: 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 6c  /*.** Release al
3620: 6c 20 74 68 65 20 74 61 62 6c 65 20 6c 6f 63 6b  l the table lock
3630: 73 20 28 6c 6f 63 6b 73 20 6f 62 74 61 69 6e 65  s (locks obtaine
3640: 64 20 76 69 61 20 63 61 6c 6c 73 20 74 6f 0a 2a  d via calls to.*
3650: 2a 20 74 68 65 20 73 65 74 53 68 61 72 65 64 43  * the setSharedC
3660: 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29 20  acheTableLock() 
3670: 70 72 6f 63 65 64 75 72 65 29 20 68 65 6c 64 20  procedure) held 
3680: 62 79 20 42 74 72 65 65 20 6f 62 6a 65 63 74 20  by Btree object 
3690: 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  p..**.** This fu
36a0: 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65 73 20 74  nction assumes t
36b0: 68 61 74 20 42 74 72 65 65 20 70 20 68 61 73 20  hat Btree p has 
36c0: 61 6e 20 6f 70 65 6e 20 72 65 61 64 20 6f 72 20  an open read or 
36d0: 77 72 69 74 65 20 0a 2a 2a 20 74 72 61 6e 73 61  write .** transa
36e0: 63 74 69 6f 6e 2e 20 49 66 20 69 74 20 64 6f 65  ction. If it doe
36f0: 73 20 6e 6f 74 2c 20 74 68 65 6e 20 74 68 65 20  s not, then the 
3700: 42 54 53 5f 50 45 4e 44 49 4e 47 20 66 6c 61 67  BTS_PENDING flag
3710: 0a 2a 2a 20 6d 61 79 20 62 65 20 69 6e 63 6f 72  .** may be incor
3720: 72 65 63 74 6c 79 20 63 6c 65 61 72 65 64 2e 0a  rectly cleared..
3730: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
3740: 6c 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63  learAllSharedCac
3750: 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 42 74 72  heTableLocks(Btr
3760: 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72  ee *p){.  BtShar
3770: 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
3780: 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 2a 70 70 49  ;.  BtLock **ppI
3790: 74 65 72 20 3d 20 26 70 42 74 2d 3e 70 4c 6f 63  ter = &pBt->pLoc
37a0: 6b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  k;..  assert( sq
37b0: 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d  lite3BtreeHoldsM
37c0: 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61 73 73  utex(p) );.  ass
37d0: 65 72 74 28 20 70 2d 3e 73 68 61 72 61 62 6c 65  ert( p->sharable
37e0: 20 7c 7c 20 30 3d 3d 2a 70 70 49 74 65 72 20 29   || 0==*ppIter )
37f0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69  ;.  assert( p->i
3800: 6e 54 72 61 6e 73 3e 30 20 29 3b 0a 0a 20 20 77  nTrans>0 );..  w
3810: 68 69 6c 65 28 20 2a 70 70 49 74 65 72 20 29 7b  hile( *ppIter ){
3820: 0a 20 20 20 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f  .    BtLock *pLo
3830: 63 6b 20 3d 20 2a 70 70 49 74 65 72 3b 0a 20 20  ck = *ppIter;.  
3840: 20 20 61 73 73 65 72 74 28 20 28 70 42 74 2d 3e    assert( (pBt->
3850: 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 45  btsFlags & BTS_E
3860: 58 43 4c 55 53 49 56 45 29 3d 3d 30 20 7c 7c 20  XCLUSIVE)==0 || 
3870: 70 42 74 2d 3e 70 57 72 69 74 65 72 3d 3d 70 4c  pBt->pWriter==pL
3880: 6f 63 6b 2d 3e 70 42 74 72 65 65 20 29 3b 0a 20  ock->pBtree );. 
3890: 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63 6b     assert( pLock
38a0: 2d 3e 70 42 74 72 65 65 2d 3e 69 6e 54 72 61 6e  ->pBtree->inTran
38b0: 73 3e 3d 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20  s>=pLock->eLock 
38c0: 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 6f 63 6b  );.    if( pLock
38d0: 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29 7b 0a 20  ->pBtree==p ){. 
38e0: 20 20 20 20 20 2a 70 70 49 74 65 72 20 3d 20 70       *ppIter = p
38f0: 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  Lock->pNext;.   
3900: 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63 6b     assert( pLock
3910: 2d 3e 69 54 61 62 6c 65 21 3d 31 20 7c 7c 20 70  ->iTable!=1 || p
3920: 4c 6f 63 6b 3d 3d 26 70 2d 3e 6c 6f 63 6b 20 29  Lock==&p->lock )
3930: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 6f 63  ;.      if( pLoc
3940: 6b 2d 3e 69 54 61 62 6c 65 21 3d 31 20 29 7b 0a  k->iTable!=1 ){.
3950: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
3960: 66 72 65 65 28 70 4c 6f 63 6b 29 3b 0a 20 20 20  free(pLock);.   
3970: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
3980: 20 20 20 20 20 20 70 70 49 74 65 72 20 3d 20 26        ppIter = &
3990: 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a 20 20  pLock->pNext;.  
39a0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72    }.  }..  asser
39b0: 74 28 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67  t( (pBt->btsFlag
39c0: 73 20 26 20 42 54 53 5f 50 45 4e 44 49 4e 47 29  s & BTS_PENDING)
39d0: 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 70 57 72 69  ==0 || pBt->pWri
39e0: 74 65 72 20 29 3b 0a 20 20 69 66 28 20 70 42 74  ter );.  if( pBt
39f0: 2d 3e 70 57 72 69 74 65 72 3d 3d 70 20 29 7b 0a  ->pWriter==p ){.
3a00: 20 20 20 20 70 42 74 2d 3e 70 57 72 69 74 65 72      pBt->pWriter
3a10: 20 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d 3e 62   = 0;.    pBt->b
3a20: 74 73 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 53  tsFlags &= ~(BTS
3a30: 5f 45 58 43 4c 55 53 49 56 45 7c 42 54 53 5f 50  _EXCLUSIVE|BTS_P
3a40: 45 4e 44 49 4e 47 29 3b 0a 20 20 7d 65 6c 73 65  ENDING);.  }else
3a50: 20 69 66 28 20 70 42 74 2d 3e 6e 54 72 61 6e 73   if( pBt->nTrans
3a60: 61 63 74 69 6f 6e 3d 3d 32 20 29 7b 0a 20 20 20  action==2 ){.   
3a70: 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f   /* This functio
3a80: 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e  n is called when
3a90: 20 42 74 72 65 65 20 70 20 69 73 20 63 6f 6e 63   Btree p is conc
3aa0: 6c 75 64 69 6e 67 20 69 74 73 20 0a 20 20 20 20  luding its .    
3ab0: 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  ** transaction. 
3ac0: 49 66 20 74 68 65 72 65 20 63 75 72 72 65 6e 74  If there current
3ad0: 6c 79 20 65 78 69 73 74 73 20 61 20 77 72 69 74  ly exists a writ
3ae0: 65 72 2c 20 61 6e 64 20 70 20 69 73 20 6e 6f 74  er, and p is not
3af0: 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 77 72 69  .    ** that wri
3b00: 74 65 72 2c 20 74 68 65 6e 20 74 68 65 20 6e 75  ter, then the nu
3b10: 6d 62 65 72 20 6f 66 20 6c 6f 63 6b 73 20 68 65  mber of locks he
3b20: 6c 64 20 62 79 20 63 6f 6e 6e 65 63 74 69 6f 6e  ld by connection
3b30: 73 20 6f 74 68 65 72 0a 20 20 20 20 2a 2a 20 74  s other.    ** t
3b40: 68 61 6e 20 74 68 65 20 77 72 69 74 65 72 20 6d  han the writer m
3b50: 75 73 74 20 62 65 20 61 62 6f 75 74 20 74 6f 20  ust be about to 
3b60: 64 72 6f 70 20 74 6f 20 7a 65 72 6f 2e 20 49 6e  drop to zero. In
3b70: 20 74 68 69 73 20 63 61 73 65 0a 20 20 20 20 2a   this case.    *
3b80: 2a 20 73 65 74 20 74 68 65 20 42 54 53 5f 50 45  * set the BTS_PE
3b90: 4e 44 49 4e 47 20 66 6c 61 67 20 74 6f 20 30 2e  NDING flag to 0.
3ba0: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49  .    **.    ** I
3bb0: 66 20 74 68 65 72 65 20 69 73 20 6e 6f 74 20 63  f there is not c
3bc0: 75 72 72 65 6e 74 6c 79 20 61 20 77 72 69 74 65  urrently a write
3bd0: 72 2c 20 74 68 65 6e 20 42 54 53 5f 50 45 4e 44  r, then BTS_PEND
3be0: 49 4e 47 20 6d 75 73 74 0a 20 20 20 20 2a 2a 20  ING must.    ** 
3bf0: 62 65 20 7a 65 72 6f 20 61 6c 72 65 61 64 79 2e  be zero already.
3c00: 20 53 6f 20 74 68 69 73 20 6e 65 78 74 20 6c 69   So this next li
3c10: 6e 65 20 69 73 20 68 61 72 6d 6c 65 73 73 20 69  ne is harmless i
3c20: 6e 20 74 68 61 74 20 63 61 73 65 2e 0a 20 20 20  n that case..   
3c30: 20 2a 2f 0a 20 20 20 20 70 42 74 2d 3e 62 74 73   */.    pBt->bts
3c40: 46 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f 50 45  Flags &= ~BTS_PE
3c50: 4e 44 49 4e 47 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  NDING;.  }.}../*
3c60: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
3c70: 6e 20 63 68 61 6e 67 65 73 20 61 6c 6c 20 77 72  n changes all wr
3c80: 69 74 65 2d 6c 6f 63 6b 73 20 68 65 6c 64 20 62  ite-locks held b
3c90: 79 20 42 74 72 65 65 20 70 20 69 6e 74 6f 20 72  y Btree p into r
3ca0: 65 61 64 2d 6c 6f 63 6b 73 2e 0a 2a 2f 0a 73 74  ead-locks..*/.st
3cb0: 61 74 69 63 20 76 6f 69 64 20 64 6f 77 6e 67 72  atic void downgr
3cc0: 61 64 65 41 6c 6c 53 68 61 72 65 64 43 61 63 68  adeAllSharedCach
3cd0: 65 54 61 62 6c 65 4c 6f 63 6b 73 28 42 74 72 65  eTableLocks(Btre
3ce0: 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65  e *p){.  BtShare
3cf0: 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
3d00: 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 57 72 69  .  if( pBt->pWri
3d10: 74 65 72 3d 3d 70 20 29 7b 0a 20 20 20 20 42 74  ter==p ){.    Bt
3d20: 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 3b 0a 20 20 20  Lock *pLock;.   
3d30: 20 70 42 74 2d 3e 70 57 72 69 74 65 72 20 3d 20   pBt->pWriter = 
3d40: 30 3b 0a 20 20 20 20 70 42 74 2d 3e 62 74 73 46  0;.    pBt->btsF
3d50: 6c 61 67 73 20 26 3d 20 7e 28 42 54 53 5f 45 58  lags &= ~(BTS_EX
3d60: 43 4c 55 53 49 56 45 7c 42 54 53 5f 50 45 4e 44  CLUSIVE|BTS_PEND
3d70: 49 4e 47 29 3b 0a 20 20 20 20 66 6f 72 28 70 4c  ING);.    for(pL
3d80: 6f 63 6b 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20  ock=pBt->pLock; 
3d90: 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b 3d 70 4c 6f  pLock; pLock=pLo
3da0: 63 6b 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  ck->pNext){.    
3db0: 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63 6b 2d    assert( pLock-
3dc0: 3e 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43  >eLock==READ_LOC
3dd0: 4b 20 7c 7c 20 70 4c 6f 63 6b 2d 3e 70 42 74 72  K || pLock->pBtr
3de0: 65 65 3d 3d 70 20 29 3b 0a 20 20 20 20 20 20 70  ee==p );.      p
3df0: 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 3d 20 52 45  Lock->eLock = RE
3e00: 41 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a 20  AD_LOCK;.    }. 
3e10: 20 7d 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20   }.}..#endif /* 
3e20: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
3e30: 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 73 74 61  ED_CACHE */..sta
3e40: 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65  tic void release
3e50: 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50  Page(MemPage *pP
3e60: 61 67 65 29 3b 20 20 20 20 20 20 20 20 20 2f 2a  age);         /*
3e70: 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e   Forward referen
3e80: 63 65 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  ce */.static voi
3e90: 64 20 72 65 6c 65 61 73 65 50 61 67 65 4f 6e 65  d releasePageOne
3ea0: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29  (MemPage *pPage)
3eb0: 3b 20 20 20 20 20 20 2f 2a 20 46 6f 72 77 61 72  ;      /* Forwar
3ec0: 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73  d reference */.s
3ed0: 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61  tatic void relea
3ee0: 73 65 50 61 67 65 4e 6f 74 4e 75 6c 6c 28 4d 65  sePageNotNull(Me
3ef0: 6d 50 61 67 65 20 2a 70 50 61 67 65 29 3b 20 20  mPage *pPage);  
3f00: 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72  /* Forward refer
3f10: 65 6e 63 65 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 2a 2a  ence */../*.****
3f20: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
3f30: 73 20 75 73 65 64 20 69 6e 73 69 64 65 20 6f 66  s used inside of
3f40: 20 61 73 73 65 72 74 28 29 20 6f 6e 6c 79 20 2a   assert() only *
3f50: 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 56 65 72 69 66 79  ***.**.** Verify
3f60: 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72   that the cursor
3f70: 20 68 6f 6c 64 73 20 74 68 65 20 6d 75 74 65 78   holds the mutex
3f80: 20 6f 6e 20 69 74 73 20 42 74 53 68 61 72 65 64   on its BtShared
3f90: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
3fa0: 45 5f 44 45 42 55 47 0a 73 74 61 74 69 63 20 69  E_DEBUG.static i
3fb0: 6e 74 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  nt cursorHoldsMu
3fc0: 74 65 78 28 42 74 43 75 72 73 6f 72 20 2a 70 29  tex(BtCursor *p)
3fd0: 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  {.  return sqlit
3fe0: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d  e3_mutex_held(p-
3ff0: 3e 70 42 74 2d 3e 6d 75 74 65 78 29 3b 0a 7d 0a  >pBt->mutex);.}.
4000: 0a 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74 20  ./* Verify that 
4010: 74 68 65 20 63 75 72 73 6f 72 20 61 6e 64 20 74  the cursor and t
4020: 68 65 20 42 74 53 68 61 72 65 64 20 61 67 72 65  he BtShared agre
4030: 65 20 61 62 6f 75 74 20 77 68 61 74 20 69 73 20  e about what is 
4040: 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 64  the current.** d
4050: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 74 69 6f  atabase connetio
4060: 6e 2e 20 54 68 69 73 20 69 73 20 69 6d 70 6f 72  n. This is impor
4070: 74 61 6e 74 20 69 6e 20 73 68 61 72 65 64 2d 63  tant in shared-c
4080: 61 63 68 65 20 6d 6f 64 65 2e 20 49 66 20 74 68  ache mode. If th
4090: 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 63  e database .** c
40a0: 6f 6e 6e 65 63 74 69 6f 6e 20 70 6f 69 6e 74 65  onnection pointe
40b0: 72 73 20 67 65 74 20 6f 75 74 2d 6f 66 2d 73 79  rs get out-of-sy
40c0: 6e 63 2c 20 69 74 20 69 73 20 70 6f 73 73 69 62  nc, it is possib
40d0: 6c 65 20 66 6f 72 20 72 6f 75 74 69 6e 65 73 20  le for routines 
40e0: 6c 69 6b 65 0a 2a 2a 20 62 74 72 65 65 49 6e 69  like.** btreeIni
40f0: 74 50 61 67 65 28 29 20 74 6f 20 72 65 66 65 72  tPage() to refer
4100: 65 6e 63 65 20 61 6e 20 73 74 61 6c 65 20 63 6f  ence an stale co
4110: 6e 6e 65 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72  nnection pointer
4120: 20 74 68 61 74 20 72 65 66 65 72 65 6e 63 65 73   that references
4130: 20 61 0a 2a 2a 20 61 20 63 6f 6e 6e 65 63 74 69   a.** a connecti
4140: 6f 6e 20 74 68 61 74 20 68 61 73 20 61 6c 72 65  on that has alre
4150: 61 64 79 20 63 6c 6f 73 65 64 2e 20 20 54 68 69  ady closed.  Thi
4160: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
4170: 64 20 69 6e 73 69 64 65 20 61 73 73 65 72 74 28  d inside assert(
4180: 29 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 20  ).** statements 
4190: 6f 6e 6c 79 20 61 6e 64 20 66 6f 72 20 74 68 65  only and for the
41a0: 20 70 75 72 70 6f 73 65 20 6f 66 20 64 6f 75 62   purpose of doub
41b0: 6c 65 2d 63 68 65 63 6b 69 6e 67 20 74 68 61 74  le-checking that
41c0: 20 74 68 65 20 62 74 72 65 65 20 63 6f 64 65 0a   the btree code.
41d0: 2a 2a 20 64 6f 65 73 20 6b 65 65 70 20 74 68 65  ** does keep the
41e0: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
41f0: 74 69 6f 6e 20 70 6f 69 6e 74 65 72 73 20 75 70  tion pointers up
4200: 2d 74 6f 2d 64 61 74 65 2e 0a 2a 2f 0a 73 74 61  -to-date..*/.sta
4210: 74 69 63 20 69 6e 74 20 63 75 72 73 6f 72 4f 77  tic int cursorOw
4220: 6e 73 42 74 53 68 61 72 65 64 28 42 74 43 75 72  nsBtShared(BtCur
4230: 73 6f 72 20 2a 70 29 7b 0a 20 20 61 73 73 65 72  sor *p){.  asser
4240: 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
4250: 74 65 78 28 70 29 20 29 3b 0a 20 20 72 65 74 75  tex(p) );.  retu
4260: 72 6e 20 28 70 2d 3e 70 42 74 72 65 65 2d 3e 64  rn (p->pBtree->d
4270: 62 3d 3d 70 2d 3e 70 42 74 2d 3e 64 62 29 3b 0a  b==p->pBt->db);.
4280: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
4290: 49 6e 76 61 6c 69 64 61 74 65 20 74 68 65 20 6f  Invalidate the o
42a0: 76 65 72 66 6c 6f 77 20 63 61 63 68 65 20 6f 66  verflow cache of
42b0: 20 74 68 65 20 63 75 72 73 6f 72 20 70 61 73 73   the cursor pass
42c0: 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20  ed as the first 
42d0: 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 20 6f 6e 20  argument..** on 
42e0: 74 68 65 20 73 68 61 72 65 64 20 62 74 72 65 65  the shared btree
42f0: 20 73 74 72 75 63 74 75 72 65 20 70 42 74 2e 0a   structure pBt..
4300: 2a 2f 0a 23 64 65 66 69 6e 65 20 69 6e 76 61 6c  */.#define inval
4310: 69 64 61 74 65 4f 76 65 72 66 6c 6f 77 43 61 63  idateOverflowCac
4320: 68 65 28 70 43 75 72 29 20 28 70 43 75 72 2d 3e  he(pCur) (pCur->
4330: 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 42 54 43  curFlags &= ~BTC
4340: 46 5f 56 61 6c 69 64 4f 76 66 6c 29 0a 0a 2f 2a  F_ValidOvfl)../*
4350: 0a 2a 2a 20 49 6e 76 61 6c 69 64 61 74 65 20 74  .** Invalidate t
4360: 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  he overflow page
4370: 2d 6c 69 73 74 20 63 61 63 68 65 20 66 6f 72 20  -list cache for 
4380: 61 6c 6c 20 63 75 72 73 6f 72 73 20 6f 70 65 6e  all cursors open
4390: 65 64 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 68 61  ed.** on the sha
43a0: 72 65 64 20 62 74 72 65 65 20 73 74 72 75 63 74  red btree struct
43b0: 75 72 65 20 70 42 74 2e 0a 2a 2f 0a 73 74 61 74  ure pBt..*/.stat
43c0: 69 63 20 76 6f 69 64 20 69 6e 76 61 6c 69 64 61  ic void invalida
43d0: 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63  teAllOverflowCac
43e0: 68 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  he(BtShared *pBt
43f0: 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  ){.  BtCursor *p
4400: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
4410: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
4420: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
4430: 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75 72 73  for(p=pBt->pCurs
4440: 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78  or; p; p=p->pNex
4450: 74 29 7b 0a 20 20 20 20 69 6e 76 61 6c 69 64 61  t){.    invalida
4460: 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28  teOverflowCache(
4470: 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64  p);.  }.}..#ifnd
4480: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49  ef SQLITE_OMIT_I
4490: 4e 43 52 42 4c 4f 42 0a 2f 2a 0a 2a 2a 20 54 68  NCRBLOB./*.** Th
44a0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
44b0: 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 6d 6f 64  alled before mod
44c0: 69 66 79 69 6e 67 20 74 68 65 20 63 6f 6e 74 65  ifying the conte
44d0: 6e 74 73 20 6f 66 20 61 20 74 61 62 6c 65 0a 2a  nts of a table.*
44e0: 2a 20 74 6f 20 69 6e 76 61 6c 69 64 61 74 65 20  * to invalidate 
44f0: 61 6e 79 20 69 6e 63 72 62 6c 6f 62 20 63 75 72  any incrblob cur
4500: 73 6f 72 73 20 74 68 61 74 20 61 72 65 20 6f 70  sors that are op
4510: 65 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 72 6f 77  en on the.** row
4520: 20 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 72   or one of the r
4530: 6f 77 73 20 62 65 69 6e 67 20 6d 6f 64 69 66 69  ows being modifi
4540: 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 72 67  ed..**.** If arg
4550: 75 6d 65 6e 74 20 69 73 43 6c 65 61 72 54 61 62  ument isClearTab
4560: 6c 65 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e  le is true, then
4570: 20 74 68 65 20 65 6e 74 69 72 65 20 63 6f 6e 74   the entire cont
4580: 65 6e 74 73 20 6f 66 20 74 68 65 0a 2a 2a 20 74  ents of the.** t
4590: 61 62 6c 65 20 69 73 20 61 62 6f 75 74 20 74 6f  able is about to
45a0: 20 62 65 20 64 65 6c 65 74 65 64 2e 20 49 6e 20   be deleted. In 
45b0: 74 68 69 73 20 63 61 73 65 20 69 6e 76 61 6c 69  this case invali
45c0: 64 61 74 65 20 61 6c 6c 20 69 6e 63 72 62 6c 6f  date all incrblo
45d0: 62 0a 2a 2a 20 63 75 72 73 6f 72 73 20 6f 70 65  b.** cursors ope
45e0: 6e 20 6f 6e 20 61 6e 79 20 72 6f 77 20 77 69 74  n on any row wit
45f0: 68 69 6e 20 74 68 65 20 74 61 62 6c 65 20 77 69  hin the table wi
4600: 74 68 20 72 6f 6f 74 2d 70 61 67 65 20 70 67 6e  th root-page pgn
4610: 6f 52 6f 6f 74 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68  oRoot..**.** Oth
4620: 65 72 77 69 73 65 2c 20 69 66 20 61 72 67 75 6d  erwise, if argum
4630: 65 6e 74 20 69 73 43 6c 65 61 72 54 61 62 6c 65  ent isClearTable
4640: 20 69 73 20 66 61 6c 73 65 2c 20 74 68 65 6e 20   is false, then 
4650: 74 68 65 20 72 6f 77 20 77 69 74 68 0a 2a 2a 20  the row with.** 
4660: 72 6f 77 69 64 20 69 52 6f 77 20 69 73 20 62 65  rowid iRow is be
4670: 69 6e 67 20 72 65 70 6c 61 63 65 64 20 6f 72 20  ing replaced or 
4680: 64 65 6c 65 74 65 64 2e 20 49 6e 20 74 68 69 73  deleted. In this
4690: 20 63 61 73 65 20 69 6e 76 61 6c 69 64 61 74 65   case invalidate
46a0: 0a 2a 2a 20 6f 6e 6c 79 20 74 68 6f 73 65 20 69  .** only those i
46b0: 6e 63 72 62 6c 6f 62 20 63 75 72 73 6f 72 73 20  ncrblob cursors 
46c0: 6f 70 65 6e 20 6f 6e 20 74 68 61 74 20 73 70 65  open on that spe
46d0: 63 69 66 69 63 20 72 6f 77 2e 0a 2a 2f 0a 73 74  cific row..*/.st
46e0: 61 74 69 63 20 76 6f 69 64 20 69 6e 76 61 6c 69  atic void invali
46f0: 64 61 74 65 49 6e 63 72 62 6c 6f 62 43 75 72 73  dateIncrblobCurs
4700: 6f 72 73 28 0a 20 20 42 74 72 65 65 20 2a 70 42  ors(.  Btree *pB
4710: 74 72 65 65 2c 20 20 20 20 20 20 20 20 20 20 2f  tree,          /
4720: 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66  * The database f
4730: 69 6c 65 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a  ile to check */.
4740: 20 20 50 67 6e 6f 20 70 67 6e 6f 52 6f 6f 74 2c    Pgno pgnoRoot,
4750: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
4760: 20 74 61 62 6c 65 20 74 68 61 74 20 6d 69 67 68   table that migh
4770: 74 20 62 65 20 63 68 61 6e 67 69 6e 67 20 2a 2f  t be changing */
4780: 0a 20 20 69 36 34 20 69 52 6f 77 2c 20 20 20 20  .  i64 iRow,    
4790: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
47a0: 65 20 72 6f 77 69 64 20 74 68 61 74 20 6d 69 67  e rowid that mig
47b0: 68 74 20 62 65 20 63 68 61 6e 67 69 6e 67 20 2a  ht be changing *
47c0: 2f 0a 20 20 69 6e 74 20 69 73 43 6c 65 61 72 54  /.  int isClearT
47d0: 61 62 6c 65 20 20 20 20 20 20 20 20 2f 2a 20 54  able        /* T
47e0: 72 75 65 20 69 66 20 61 6c 6c 20 72 6f 77 73 20  rue if all rows 
47f0: 61 72 65 20 62 65 69 6e 67 20 64 65 6c 65 74 65  are being delete
4800: 64 20 2a 2f 0a 29 7b 0a 20 20 42 74 43 75 72 73  d */.){.  BtCurs
4810: 6f 72 20 2a 70 3b 0a 20 20 69 66 28 20 70 42 74  or *p;.  if( pBt
4820: 72 65 65 2d 3e 68 61 73 49 6e 63 72 62 6c 6f 62  ree->hasIncrblob
4830: 43 75 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  Cur==0 ) return;
4840: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
4850: 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65  e3BtreeHoldsMute
4860: 78 28 70 42 74 72 65 65 29 20 29 3b 0a 20 20 70  x(pBtree) );.  p
4870: 42 74 72 65 65 2d 3e 68 61 73 49 6e 63 72 62 6c  Btree->hasIncrbl
4880: 6f 62 43 75 72 20 3d 20 30 3b 0a 20 20 66 6f 72  obCur = 0;.  for
4890: 28 70 3d 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e  (p=pBtree->pBt->
48a0: 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d  pCursor; p; p=p-
48b0: 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28  >pNext){.    if(
48c0: 20 28 70 2d 3e 63 75 72 46 6c 61 67 73 20 26 20   (p->curFlags & 
48d0: 42 54 43 46 5f 49 6e 63 72 62 6c 6f 62 29 21 3d  BTCF_Incrblob)!=
48e0: 30 20 29 7b 0a 20 20 20 20 20 20 70 42 74 72 65  0 ){.      pBtre
48f0: 65 2d 3e 68 61 73 49 6e 63 72 62 6c 6f 62 43 75  e->hasIncrblobCu
4900: 72 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 66 28  r = 1;.      if(
4910: 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 70 67   p->pgnoRoot==pg
4920: 6e 6f 52 6f 6f 74 20 26 26 20 28 69 73 43 6c 65  noRoot && (isCle
4930: 61 72 54 61 62 6c 65 20 7c 7c 20 70 2d 3e 69 6e  arTable || p->in
4940: 66 6f 2e 6e 4b 65 79 3d 3d 69 52 6f 77 29 20 29  fo.nKey==iRow) )
4950: 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74  {.        p->eSt
4960: 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56  ate = CURSOR_INV
4970: 41 4c 49 44 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ALID;.      }.  
4980: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 65 6c 73 65    }.  }.}..#else
4990: 0a 20 20 2f 2a 20 53 74 75 62 20 66 75 6e 63 74  .  /* Stub funct
49a0: 69 6f 6e 20 77 68 65 6e 20 49 4e 43 52 42 4c 4f  ion when INCRBLO
49b0: 42 20 69 73 20 6f 6d 69 74 74 65 64 20 2a 2f 0a  B is omitted */.
49c0: 20 20 23 64 65 66 69 6e 65 20 69 6e 76 61 6c 69    #define invali
49d0: 64 61 74 65 49 6e 63 72 62 6c 6f 62 43 75 72 73  dateIncrblobCurs
49e0: 6f 72 73 28 77 2c 78 2c 79 2c 7a 29 0a 23 65 6e  ors(w,x,y,z).#en
49f0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
4a00: 49 54 5f 49 4e 43 52 42 4c 4f 42 20 2a 2f 0a 0a  IT_INCRBLOB */..
4a10: 2f 2a 0a 2a 2a 20 53 65 74 20 62 69 74 20 70 67  /*.** Set bit pg
4a20: 6e 6f 20 6f 66 20 74 68 65 20 42 74 53 68 61 72  no of the BtShar
4a30: 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 62  ed.pHasContent b
4a40: 69 74 76 65 63 2e 20 54 68 69 73 20 69 73 20 63  itvec. This is c
4a50: 61 6c 6c 65 64 20 0a 2a 2a 20 77 68 65 6e 20 61  alled .** when a
4a60: 20 70 61 67 65 20 74 68 61 74 20 70 72 65 76 69   page that previ
4a70: 6f 75 73 6c 79 20 63 6f 6e 74 61 69 6e 65 64 20  ously contained 
4a80: 64 61 74 61 20 62 65 63 6f 6d 65 73 20 61 20 66  data becomes a f
4a90: 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 0a 2a  ree-list leaf .*
4aa0: 2a 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  * page..**.** Th
4ab0: 65 20 42 74 53 68 61 72 65 64 2e 70 48 61 73 43  e BtShared.pHasC
4ac0: 6f 6e 74 65 6e 74 20 62 69 74 76 65 63 20 65 78  ontent bitvec ex
4ad0: 69 73 74 73 20 74 6f 20 77 6f 72 6b 20 61 72 6f  ists to work aro
4ae0: 75 6e 64 20 61 6e 20 6f 62 73 63 75 72 65 0a 2a  und an obscure.*
4af0: 2a 20 62 75 67 20 63 61 75 73 65 64 20 62 79 20  * bug caused by 
4b00: 74 68 65 20 69 6e 74 65 72 61 63 74 69 6f 6e 20  the interaction 
4b10: 6f 66 20 74 77 6f 20 75 73 65 66 75 6c 20 49 4f  of two useful IO
4b20: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 73   optimizations s
4b30: 75 72 72 6f 75 6e 64 69 6e 67 0a 2a 2a 20 66 72  urrounding.** fr
4b40: 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67  ee-list leaf pag
4b50: 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20 57  es:.**.**   1) W
4b60: 68 65 6e 20 61 6c 6c 20 64 61 74 61 20 69 73 20  hen all data is 
4b70: 64 65 6c 65 74 65 64 20 66 72 6f 6d 20 61 20 70  deleted from a p
4b80: 61 67 65 20 61 6e 64 20 74 68 65 20 70 61 67 65  age and the page
4b90: 20 62 65 63 6f 6d 65 73 0a 2a 2a 20 20 20 20 20   becomes.**     
4ba0: 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61   a free-list lea
4bb0: 66 20 70 61 67 65 2c 20 74 68 65 20 70 61 67 65  f page, the page
4bc0: 20 69 73 20 6e 6f 74 20 77 72 69 74 74 65 6e 20   is not written 
4bd0: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  to the database.
4be0: 2a 2a 20 20 20 20 20 20 28 61 73 20 66 72 65 65  **      (as free
4bf0: 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65 73  -list leaf pages
4c00: 20 63 6f 6e 74 61 69 6e 20 6e 6f 20 6d 65 61 6e   contain no mean
4c10: 69 6e 67 66 75 6c 20 64 61 74 61 29 2e 20 53 6f  ingful data). So
4c20: 6d 65 74 69 6d 65 73 0a 2a 2a 20 20 20 20 20 20  metimes.**      
4c30: 73 75 63 68 20 61 20 70 61 67 65 20 69 73 20 6e  such a page is n
4c40: 6f 74 20 65 76 65 6e 20 6a 6f 75 72 6e 61 6c 6c  ot even journall
4c50: 65 64 20 28 61 73 20 69 74 20 77 69 6c 6c 20 6e  ed (as it will n
4c60: 6f 74 20 62 65 20 6d 6f 64 69 66 69 65 64 2c 0a  ot be modified,.
4c70: 2a 2a 20 20 20 20 20 20 77 68 79 20 62 6f 74 68  **      why both
4c80: 65 72 20 6a 6f 75 72 6e 61 6c 6c 69 6e 67 20 69  er journalling i
4c90: 74 3f 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 29 20  t?)..**.**   2) 
4ca0: 57 68 65 6e 20 61 20 66 72 65 65 2d 6c 69 73 74  When a free-list
4cb0: 20 6c 65 61 66 20 70 61 67 65 20 69 73 20 72 65   leaf page is re
4cc0: 75 73 65 64 2c 20 69 74 73 20 63 6f 6e 74 65 6e  used, its conten
4cd0: 74 20 69 73 20 6e 6f 74 20 72 65 61 64 0a 2a 2a  t is not read.**
4ce0: 20 20 20 20 20 20 66 72 6f 6d 20 74 68 65 20 64        from the d
4cf0: 61 74 61 62 61 73 65 20 6f 72 20 77 72 69 74 74  atabase or writt
4d00: 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  en to the journa
4d10: 6c 20 66 69 6c 65 20 28 77 68 79 20 73 68 6f 75  l file (why shou
4d20: 6c 64 20 69 74 0a 2a 2a 20 20 20 20 20 20 62 65  ld it.**      be
4d30: 2c 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61  , if it is not a
4d40: 74 20 61 6c 6c 20 6d 65 61 6e 69 6e 67 66 75 6c  t all meaningful
4d50: 3f 29 2e 0a 2a 2a 0a 2a 2a 20 42 79 20 74 68 65  ?)..**.** By the
4d60: 6d 73 65 6c 76 65 73 2c 20 74 68 65 73 65 20 6f  mselves, these o
4d70: 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 77 6f 72  ptimizations wor
4d80: 6b 20 66 69 6e 65 20 61 6e 64 20 70 72 6f 76 69  k fine and provi
4d90: 64 65 20 61 20 68 61 6e 64 79 0a 2a 2a 20 70 65  de a handy.** pe
4da0: 72 66 6f 72 6d 61 6e 63 65 20 62 6f 6f 73 74 20  rformance boost 
4db0: 74 6f 20 62 75 6c 6b 20 64 65 6c 65 74 65 20 6f  to bulk delete o
4dc0: 72 20 69 6e 73 65 72 74 20 6f 70 65 72 61 74 69  r insert operati
4dd0: 6f 6e 73 2e 20 48 6f 77 65 76 65 72 2c 20 69 66  ons. However, if
4de0: 0a 2a 2a 20 61 20 70 61 67 65 20 69 73 20 6d 6f  .** a page is mo
4df0: 76 65 64 20 74 6f 20 74 68 65 20 66 72 65 65 2d  ved to the free-
4e00: 6c 69 73 74 20 61 6e 64 20 74 68 65 6e 20 72 65  list and then re
4e10: 75 73 65 64 20 77 69 74 68 69 6e 20 74 68 65 20  used within the 
4e20: 73 61 6d 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74  same.** transact
4e30: 69 6f 6e 2c 20 61 20 70 72 6f 62 6c 65 6d 20 63  ion, a problem c
4e40: 6f 6d 65 73 20 75 70 2e 20 49 66 20 74 68 65 20  omes up. If the 
4e50: 70 61 67 65 20 69 73 20 6e 6f 74 20 6a 6f 75 72  page is not jour
4e60: 6e 61 6c 6c 65 64 20 77 68 65 6e 0a 2a 2a 20 69  nalled when.** i
4e70: 74 20 69 73 20 6d 6f 76 65 64 20 74 6f 20 74 68  t is moved to th
4e80: 65 20 66 72 65 65 2d 6c 69 73 74 20 61 6e 64 20  e free-list and 
4e90: 69 74 20 69 73 20 61 6c 73 6f 20 6e 6f 74 20 6a  it is also not j
4ea0: 6f 75 72 6e 61 6c 6c 65 64 20 77 68 65 6e 20 69  ournalled when i
4eb0: 74 0a 2a 2a 20 69 73 20 65 78 74 72 61 63 74 65  t.** is extracte
4ec0: 64 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 2d  d from the free-
4ed0: 6c 69 73 74 20 61 6e 64 20 72 65 75 73 65 64 2c  list and reused,
4ee0: 20 74 68 65 6e 20 74 68 65 20 6f 72 69 67 69 6e   then the origin
4ef0: 61 6c 20 64 61 74 61 0a 2a 2a 20 6d 61 79 20 62  al data.** may b
4f00: 65 20 6c 6f 73 74 2e 20 49 6e 20 74 68 65 20 65  e lost. In the e
4f10: 76 65 6e 74 20 6f 66 20 61 20 72 6f 6c 6c 62 61  vent of a rollba
4f20: 63 6b 2c 20 69 74 20 6d 61 79 20 6e 6f 74 20 62  ck, it may not b
4f30: 65 20 70 6f 73 73 69 62 6c 65 0a 2a 2a 20 74 6f  e possible.** to
4f40: 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74   restore the dat
4f50: 61 62 61 73 65 20 74 6f 20 69 74 73 20 6f 72 69  abase to its ori
4f60: 67 69 6e 61 6c 20 63 6f 6e 66 69 67 75 72 61 74  ginal configurat
4f70: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73  ion..**.** The s
4f80: 6f 6c 75 74 69 6f 6e 20 69 73 20 74 68 65 20 42  olution is the B
4f90: 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74  tShared.pHasCont
4fa0: 65 6e 74 20 62 69 74 76 65 63 2e 20 57 68 65 6e  ent bitvec. When
4fb0: 65 76 65 72 20 61 20 70 61 67 65 20 69 73 20 0a  ever a page is .
4fc0: 2a 2a 20 6d 6f 76 65 64 20 74 6f 20 62 65 63 6f  ** moved to beco
4fd0: 6d 65 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c  me a free-list l
4fe0: 65 61 66 20 70 61 67 65 2c 20 74 68 65 20 63 6f  eaf page, the co
4ff0: 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20  rresponding bit 
5000: 69 73 0a 2a 2a 20 73 65 74 20 69 6e 20 74 68 65  is.** set in the
5010: 20 62 69 74 76 65 63 2e 20 57 68 65 6e 65 76 65   bitvec. Wheneve
5020: 72 20 61 20 6c 65 61 66 20 70 61 67 65 20 69 73  r a leaf page is
5030: 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
5040: 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 0a 2a  the free-list,.*
5050: 2a 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 32  * optimization 2
5060: 20 61 62 6f 76 65 20 69 73 20 6f 6d 69 74 74 65   above is omitte
5070: 64 20 69 66 20 74 68 65 20 63 6f 72 72 65 73 70  d if the corresp
5080: 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 20 61 6c  onding bit is al
5090: 72 65 61 64 79 0a 2a 2a 20 73 65 74 20 69 6e 20  ready.** set in 
50a0: 42 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e  BtShared.pHasCon
50b0: 74 65 6e 74 2e 20 54 68 65 20 63 6f 6e 74 65 6e  tent. The conten
50c0: 74 73 20 6f 66 20 74 68 65 20 62 69 74 76 65 63  ts of the bitvec
50d0: 20 61 72 65 20 63 6c 65 61 72 65 64 0a 2a 2a 20   are cleared.** 
50e0: 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 65 76  at the end of ev
50f0: 65 72 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ery transaction.
5100: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
5110: 74 72 65 65 53 65 74 48 61 73 43 6f 6e 74 65 6e  treeSetHasConten
5120: 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c  t(BtShared *pBt,
5130: 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 69   Pgno pgno){.  i
5140: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
5150: 4b 3b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 70  K;.  if( !pBt->p
5160: 48 61 73 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20  HasContent ){.  
5170: 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 3c 3d    assert( pgno<=
5180: 70 42 74 2d 3e 6e 50 61 67 65 20 29 3b 0a 20 20  pBt->nPage );.  
5190: 20 20 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65    pBt->pHasConte
51a0: 6e 74 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76  nt = sqlite3Bitv
51b0: 65 63 43 72 65 61 74 65 28 70 42 74 2d 3e 6e 50  ecCreate(pBt->nP
51c0: 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 21 70  age);.    if( !p
51d0: 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20  Bt->pHasContent 
51e0: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
51f0: 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
5200: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
5210: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
5220: 26 20 70 67 6e 6f 3c 3d 73 71 6c 69 74 65 33 42  & pgno<=sqlite3B
5230: 69 74 76 65 63 53 69 7a 65 28 70 42 74 2d 3e 70  itvecSize(pBt->p
5240: 48 61 73 43 6f 6e 74 65 6e 74 29 20 29 7b 0a 20  HasContent) ){. 
5250: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
5260: 69 74 76 65 63 53 65 74 28 70 42 74 2d 3e 70 48  itvecSet(pBt->pH
5270: 61 73 43 6f 6e 74 65 6e 74 2c 20 70 67 6e 6f 29  asContent, pgno)
5280: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
5290: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 51 75 65 72  c;.}../*.** Quer
52a0: 79 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70  y the BtShared.p
52b0: 48 61 73 43 6f 6e 74 65 6e 74 20 76 65 63 74 6f  HasContent vecto
52c0: 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  r..**.** This fu
52d0: 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
52e0: 20 77 68 65 6e 20 61 20 66 72 65 65 2d 6c 69 73   when a free-lis
52f0: 74 20 6c 65 61 66 20 70 61 67 65 20 69 73 20 72  t leaf page is r
5300: 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 0a  emoved from the.
5310: 2a 2a 20 66 72 65 65 2d 6c 69 73 74 20 66 6f 72  ** free-list for
5320: 20 72 65 75 73 65 2e 20 49 74 20 72 65 74 75 72   reuse. It retur
5330: 6e 73 20 66 61 6c 73 65 20 69 66 20 69 74 20 69  ns false if it i
5340: 73 20 73 61 66 65 20 74 6f 20 72 65 74 72 69 65  s safe to retrie
5350: 76 65 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 66  ve the.** page f
5360: 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20 6c 61  rom the pager la
5370: 79 65 72 20 77 69 74 68 20 74 68 65 20 27 6e 6f  yer with the 'no
5380: 2d 63 6f 6e 74 65 6e 74 27 20 66 6c 61 67 20 73  -content' flag s
5390: 65 74 2e 20 54 72 75 65 20 6f 74 68 65 72 77 69  et. True otherwi
53a0: 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  se..*/.static in
53b0: 74 20 62 74 72 65 65 47 65 74 48 61 73 43 6f 6e  t btreeGetHasCon
53c0: 74 65 6e 74 28 42 74 53 68 61 72 65 64 20 2a 70  tent(BtShared *p
53d0: 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a  Bt, Pgno pgno){.
53e0: 20 20 42 69 74 76 65 63 20 2a 70 20 3d 20 70 42    Bitvec *p = pB
53f0: 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 3b 0a  t->pHasContent;.
5400: 20 20 72 65 74 75 72 6e 20 28 70 20 26 26 20 28    return (p && (
5410: 70 67 6e 6f 3e 73 71 6c 69 74 65 33 42 69 74 76  pgno>sqlite3Bitv
5420: 65 63 53 69 7a 65 28 70 29 20 7c 7c 20 73 71 6c  ecSize(p) || sql
5430: 69 74 65 33 42 69 74 76 65 63 54 65 73 74 28 70  ite3BitvecTest(p
5440: 2c 20 70 67 6e 6f 29 29 29 3b 0a 7d 0a 0a 2f 2a  , pgno)));.}../*
5450: 0a 2a 2a 20 43 6c 65 61 72 20 28 64 65 73 74 72  .** Clear (destr
5460: 6f 79 29 20 74 68 65 20 42 74 53 68 61 72 65 64  oy) the BtShared
5470: 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 62 69 74  .pHasContent bit
5480: 76 65 63 2e 20 54 68 69 73 20 73 68 6f 75 6c 64  vec. This should
5490: 20 62 65 0a 2a 2a 20 69 6e 76 6f 6b 65 64 20 61   be.** invoked a
54a0: 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e  t the conclusion
54b0: 20 6f 66 20 65 61 63 68 20 77 72 69 74 65 2d 74   of each write-t
54c0: 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  ransaction..*/.s
54d0: 74 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65  tatic void btree
54e0: 43 6c 65 61 72 48 61 73 43 6f 6e 74 65 6e 74 28  ClearHasContent(
54f0: 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
5500: 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44    sqlite3BitvecD
5510: 65 73 74 72 6f 79 28 70 42 74 2d 3e 70 48 61 73  estroy(pBt->pHas
5520: 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 70 42 74 2d  Content);.  pBt-
5530: 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20 3d 20 30  >pHasContent = 0
5540: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61  ;.}../*.** Relea
5550: 73 65 20 61 6c 6c 20 6f 66 20 74 68 65 20 61 70  se all of the ap
5560: 50 61 67 65 5b 5d 20 70 61 67 65 73 20 66 6f 72  Page[] pages for
5570: 20 61 20 63 75 72 73 6f 72 2e 0a 2a 2f 0a 73 74   a cursor..*/.st
5580: 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65 52  atic void btreeR
5590: 65 6c 65 61 73 65 41 6c 6c 43 75 72 73 6f 72 50  eleaseAllCursorP
55a0: 61 67 65 73 28 42 74 43 75 72 73 6f 72 20 2a 70  ages(BtCursor *p
55b0: 43 75 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  Cur){.  int i;. 
55c0: 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65   if( pCur->iPage
55d0: 3e 3d 30 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  >=0 ){.    for(i
55e0: 3d 30 3b 20 69 3c 70 43 75 72 2d 3e 69 50 61 67  =0; i<pCur->iPag
55f0: 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72  e; i++){.      r
5600: 65 6c 65 61 73 65 50 61 67 65 4e 6f 74 4e 75 6c  eleasePageNotNul
5610: 6c 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69  l(pCur->apPage[i
5620: 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  ]);.    }.    re
5630: 6c 65 61 73 65 50 61 67 65 4e 6f 74 4e 75 6c 6c  leasePageNotNull
5640: 28 70 43 75 72 2d 3e 70 50 61 67 65 29 3b 0a 20  (pCur->pPage);. 
5650: 20 20 20 70 43 75 72 2d 3e 69 50 61 67 65 20 3d     pCur->iPage =
5660: 20 2d 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a   -1;.  }.}../*.*
5670: 2a 20 54 68 65 20 63 75 72 73 6f 72 20 70 61 73  * The cursor pas
5680: 73 65 64 20 61 73 20 74 68 65 20 6f 6e 6c 79 20  sed as the only 
5690: 61 72 67 75 6d 65 6e 74 20 6d 75 73 74 20 70 6f  argument must po
56a0: 69 6e 74 20 74 6f 20 61 20 76 61 6c 69 64 20 65  int to a valid e
56b0: 6e 74 72 79 0a 2a 2a 20 77 68 65 6e 20 74 68 69  ntry.** when thi
56c0: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
56d0: 6c 6c 65 64 20 28 69 2e 65 2e 20 68 61 76 65 20  lled (i.e. have 
56e0: 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
56f0: 41 4c 49 44 29 2e 20 54 68 69 73 0a 2a 2a 20 66  ALID). This.** f
5700: 75 6e 63 74 69 6f 6e 20 73 61 76 65 73 20 74 68  unction saves th
5710: 65 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72  e current cursor
5720: 20 6b 65 79 20 69 6e 20 76 61 72 69 61 62 6c 65   key in variable
5730: 73 20 70 43 75 72 2d 3e 6e 4b 65 79 20 61 6e 64  s pCur->nKey and
5740: 0a 2a 2a 20 70 43 75 72 2d 3e 70 4b 65 79 2e 20  .** pCur->pKey. 
5750: 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
5760: 75 72 6e 65 64 20 69 66 20 73 75 63 63 65 73 73  urned if success
5770: 66 75 6c 20 6f 72 20 61 6e 20 53 51 4c 69 74 65  ful or an SQLite
5780: 20 65 72 72 6f 72 20 0a 2a 2a 20 63 6f 64 65 20   error .** code 
5790: 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2a 0a 2a 2a  otherwise..**.**
57a0: 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 69   If the cursor i
57b0: 73 20 6f 70 65 6e 20 6f 6e 20 61 6e 20 69 6e 74  s open on an int
57c0: 6b 65 79 20 74 61 62 6c 65 2c 20 74 68 65 6e 20  key table, then 
57d0: 74 68 65 20 69 6e 74 65 67 65 72 20 6b 65 79 0a  the integer key.
57e0: 2a 2a 20 28 74 68 65 20 72 6f 77 69 64 29 20 69  ** (the rowid) i
57f0: 73 20 73 74 6f 72 65 64 20 69 6e 20 70 43 75 72  s stored in pCur
5800: 2d 3e 6e 4b 65 79 20 61 6e 64 20 70 43 75 72 2d  ->nKey and pCur-
5810: 3e 70 4b 65 79 20 69 73 20 6c 65 66 74 20 73 65  >pKey is left se
5820: 74 20 74 6f 0a 2a 2a 20 4e 55 4c 4c 2e 20 49 66  t to.** NULL. If
5830: 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6f   the cursor is o
5840: 70 65 6e 20 6f 6e 20 61 20 6e 6f 6e 2d 69 6e 74  pen on a non-int
5850: 6b 65 79 20 74 61 62 6c 65 2c 20 74 68 65 6e 20  key table, then 
5860: 70 43 75 72 2d 3e 70 4b 65 79 20 69 73 20 0a 2a  pCur->pKey is .*
5870: 2a 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74  * set to point t
5880: 6f 20 61 20 6d 61 6c 6c 6f 63 65 64 20 62 75 66  o a malloced buf
5890: 66 65 72 20 70 43 75 72 2d 3e 6e 4b 65 79 20 62  fer pCur->nKey b
58a0: 79 74 65 73 20 69 6e 20 73 69 7a 65 20 63 6f 6e  ytes in size con
58b0: 74 61 69 6e 69 6e 67 20 0a 2a 2a 20 74 68 65 20  taining .** the 
58c0: 6b 65 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  key..*/.static i
58d0: 6e 74 20 73 61 76 65 43 75 72 73 6f 72 4b 65 79  nt saveCursorKey
58e0: 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
58f0: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
5900: 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74  ITE_OK;.  assert
5910: 28 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3d 3d  ( CURSOR_VALID==
5920: 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29 3b 0a  pCur->eState );.
5930: 20 20 61 73 73 65 72 74 28 20 30 3d 3d 70 43 75    assert( 0==pCu
5940: 72 2d 3e 70 4b 65 79 20 29 3b 0a 20 20 61 73 73  r->pKey );.  ass
5950: 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
5960: 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 0a  Mutex(pCur) );..
5970: 20 20 69 66 28 20 70 43 75 72 2d 3e 63 75 72 49    if( pCur->curI
5980: 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 2f 2a 20  ntKey ){.    /* 
5990: 4f 6e 6c 79 20 74 68 65 20 72 6f 77 69 64 20 69  Only the rowid i
59a0: 73 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 61  s required for a
59b0: 20 74 61 62 6c 65 20 62 74 72 65 65 20 2a 2f 0a   table btree */.
59c0: 20 20 20 20 70 43 75 72 2d 3e 6e 4b 65 79 20 3d      pCur->nKey =
59d0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 74   sqlite3BtreeInt
59e0: 65 67 65 72 4b 65 79 28 70 43 75 72 29 3b 0a 20  egerKey(pCur);. 
59f0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 46   }else{.    /* F
5a00: 6f 72 20 61 6e 20 69 6e 64 65 78 20 62 74 72 65  or an index btre
5a10: 65 2c 20 73 61 76 65 20 74 68 65 20 63 6f 6d 70  e, save the comp
5a20: 6c 65 74 65 20 6b 65 79 20 63 6f 6e 74 65 6e 74  lete key content
5a30: 2e 20 49 74 20 69 73 20 70 6f 73 73 69 62 6c 65  . It is possible
5a40: 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 74 68 65  .    ** that the
5a50: 20 63 75 72 72 65 6e 74 20 6b 65 79 20 69 73 20   current key is 
5a60: 63 6f 72 72 75 70 74 2e 20 49 6e 20 74 68 61 74  corrupt. In that
5a70: 20 63 61 73 65 2c 20 69 74 20 69 73 20 70 6f 73   case, it is pos
5a80: 73 69 62 6c 65 20 74 68 61 74 0a 20 20 20 20 2a  sible that.    *
5a90: 2a 20 74 68 65 20 73 71 6c 69 74 65 33 56 64 62  * the sqlite3Vdb
5aa0: 65 52 65 63 6f 72 64 55 6e 70 61 63 6b 28 29 20  eRecordUnpack() 
5ab0: 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 6f 76 65  function may ove
5ac0: 72 72 65 61 64 20 74 68 65 20 62 75 66 66 65 72  rread the buffer
5ad0: 20 62 79 0a 20 20 20 20 2a 2a 20 75 70 20 74 6f   by.    ** up to
5ae0: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 31 20 76   the size of 1 v
5af0: 61 72 69 6e 74 20 70 6c 75 73 20 31 20 38 2d 62  arint plus 1 8-b
5b00: 79 74 65 20 76 61 6c 75 65 20 77 68 65 6e 20 74  yte value when t
5b10: 68 65 20 63 75 72 73 6f 72 20 0a 20 20 20 20 2a  he cursor .    *
5b20: 2a 20 70 6f 73 69 74 69 6f 6e 20 69 73 20 72 65  * position is re
5b30: 73 74 6f 72 65 64 2e 20 48 65 6e 63 65 20 74 68  stored. Hence th
5b40: 65 20 31 37 20 62 79 74 65 73 20 6f 66 20 70 61  e 17 bytes of pa
5b50: 64 64 69 6e 67 20 61 6c 6c 6f 63 61 74 65 64 20  dding allocated 
5b60: 0a 20 20 20 20 2a 2a 20 62 65 6c 6f 77 2e 20 2a  .    ** below. *
5b70: 2f 0a 20 20 20 20 76 6f 69 64 20 2a 70 4b 65 79  /.    void *pKey
5b80: 3b 0a 20 20 20 20 70 43 75 72 2d 3e 6e 4b 65 79  ;.    pCur->nKey
5b90: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50   = sqlite3BtreeP
5ba0: 61 79 6c 6f 61 64 53 69 7a 65 28 70 43 75 72 29  ayloadSize(pCur)
5bb0: 3b 0a 20 20 20 20 70 4b 65 79 20 3d 20 73 71 6c  ;.    pKey = sql
5bc0: 69 74 65 33 4d 61 6c 6c 6f 63 28 20 70 43 75 72  ite3Malloc( pCur
5bd0: 2d 3e 6e 4b 65 79 20 2b 20 39 20 2b 20 38 20 29  ->nKey + 9 + 8 )
5be0: 3b 0a 20 20 20 20 69 66 28 20 70 4b 65 79 20 29  ;.    if( pKey )
5bf0: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
5c00: 69 74 65 33 42 74 72 65 65 50 61 79 6c 6f 61 64  ite3BtreePayload
5c10: 28 70 43 75 72 2c 20 30 2c 20 28 69 6e 74 29 70  (pCur, 0, (int)p
5c20: 43 75 72 2d 3e 6e 4b 65 79 2c 20 70 4b 65 79 29  Cur->nKey, pKey)
5c30: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
5c40: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
5c50: 20 20 20 20 20 70 43 75 72 2d 3e 70 4b 65 79 20       pCur->pKey 
5c60: 3d 20 70 4b 65 79 3b 0a 20 20 20 20 20 20 7d 65  = pKey;.      }e
5c70: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
5c80: 69 74 65 33 5f 66 72 65 65 28 70 4b 65 79 29 3b  ite3_free(pKey);
5c90: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
5ca0: 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  se{.      rc = S
5cb0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
5cc0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73  ;.    }.  }.  as
5cd0: 73 65 72 74 28 20 21 70 43 75 72 2d 3e 63 75 72  sert( !pCur->cur
5ce0: 49 6e 74 4b 65 79 20 7c 7c 20 21 70 43 75 72 2d  IntKey || !pCur-
5cf0: 3e 70 4b 65 79 20 29 3b 0a 20 20 72 65 74 75 72  >pKey );.  retur
5d00: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  n rc;.}../*.** S
5d10: 61 76 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ave the current 
5d20: 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 20  cursor position 
5d30: 69 6e 20 74 68 65 20 76 61 72 69 61 62 6c 65 73  in the variables
5d40: 20 42 74 43 75 72 73 6f 72 2e 6e 4b 65 79 20 0a   BtCursor.nKey .
5d50: 2a 2a 20 61 6e 64 20 42 74 43 75 72 73 6f 72 2e  ** and BtCursor.
5d60: 70 4b 65 79 2e 20 54 68 65 20 63 75 72 73 6f 72  pKey. The cursor
5d70: 27 73 20 73 74 61 74 65 20 69 73 20 73 65 74 20  's state is set 
5d80: 74 6f 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52  to CURSOR_REQUIR
5d90: 45 53 45 45 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ESEEK..**.** The
5da0: 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 65 6e 73   caller must ens
5db0: 75 72 65 20 74 68 61 74 20 74 68 65 20 63 75 72  ure that the cur
5dc0: 73 6f 72 20 69 73 20 76 61 6c 69 64 20 28 68 61  sor is valid (ha
5dd0: 73 20 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  s eState==CURSOR
5de0: 5f 56 41 4c 49 44 29 0a 2a 2a 20 70 72 69 6f 72  _VALID).** prior
5df0: 20 74 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69 73   to calling this
5e00: 20 72 6f 75 74 69 6e 65 2e 20 20 0a 2a 2f 0a 73   routine.  .*/.s
5e10: 74 61 74 69 63 20 69 6e 74 20 73 61 76 65 43 75  tatic int saveCu
5e20: 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 42 74 43  rsorPosition(BtC
5e30: 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
5e40: 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72  int rc;..  asser
5e50: 74 28 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3d  t( CURSOR_VALID=
5e60: 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 7c 7c  =pCur->eState ||
5e70: 20 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54   CURSOR_SKIPNEXT
5e80: 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29  ==pCur->eState )
5e90: 3b 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d 70  ;.  assert( 0==p
5ea0: 43 75 72 2d 3e 70 4b 65 79 20 29 3b 0a 20 20 61  Cur->pKey );.  a
5eb0: 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
5ec0: 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
5ed0: 0a 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53  ..  if( pCur->eS
5ee0: 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 53 4b 49  tate==CURSOR_SKI
5ef0: 50 4e 45 58 54 20 29 7b 0a 20 20 20 20 70 43 75  PNEXT ){.    pCu
5f00: 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
5f10: 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 7d 65 6c 73  OR_VALID;.  }els
5f20: 65 7b 0a 20 20 20 20 70 43 75 72 2d 3e 73 6b 69  e{.    pCur->ski
5f30: 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a  pNext = 0;.  }..
5f40: 20 20 72 63 20 3d 20 73 61 76 65 43 75 72 73 6f    rc = saveCurso
5f50: 72 4b 65 79 28 70 43 75 72 29 3b 0a 20 20 69 66  rKey(pCur);.  if
5f60: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
5f70: 29 7b 0a 20 20 20 20 62 74 72 65 65 52 65 6c 65  ){.    btreeRele
5f80: 61 73 65 41 6c 6c 43 75 72 73 6f 72 50 61 67 65  aseAllCursorPage
5f90: 73 28 70 43 75 72 29 3b 0a 20 20 20 20 70 43 75  s(pCur);.    pCu
5fa0: 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
5fb0: 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 3b 0a  OR_REQUIRESEEK;.
5fc0: 20 20 7d 0a 0a 20 20 70 43 75 72 2d 3e 63 75 72    }..  pCur->cur
5fd0: 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 43 46 5f  Flags &= ~(BTCF_
5fe0: 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56  ValidNKey|BTCF_V
5ff0: 61 6c 69 64 4f 76 66 6c 7c 42 54 43 46 5f 41 74  alidOvfl|BTCF_At
6000: 4c 61 73 74 29 3b 0a 20 20 72 65 74 75 72 6e 20  Last);.  return 
6010: 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72  rc;.}../* Forwar
6020: 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73  d reference */.s
6030: 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45  tatic int SQLITE
6040: 5f 4e 4f 49 4e 4c 49 4e 45 20 73 61 76 65 43 75  _NOINLINE saveCu
6050: 72 73 6f 72 73 4f 6e 4c 69 73 74 28 42 74 43 75  rsorsOnList(BtCu
6060: 72 73 6f 72 2a 2c 50 67 6e 6f 2c 42 74 43 75 72  rsor*,Pgno,BtCur
6070: 73 6f 72 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 53 61  sor*);../*.** Sa
6080: 76 65 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 73  ve the positions
6090: 20 6f 66 20 61 6c 6c 20 63 75 72 73 6f 72 73 20   of all cursors 
60a0: 28 65 78 63 65 70 74 20 70 45 78 63 65 70 74 29  (except pExcept)
60b0: 20 74 68 61 74 20 61 72 65 20 6f 70 65 6e 20 6f   that are open o
60c0: 6e 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 77  n.** the table w
60d0: 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20 69 52  ith root-page iR
60e0: 6f 6f 74 2e 20 20 22 53 61 76 69 6e 67 20 74 68  oot.  "Saving th
60f0: 65 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f  e cursor positio
6100: 6e 22 20 6d 65 61 6e 73 20 74 68 61 74 0a 2a 2a  n" means that.**
6110: 20 74 68 65 20 6c 6f 63 61 74 69 6f 6e 20 69 6e   the location in
6120: 20 74 68 65 20 62 74 72 65 65 20 69 73 20 72 65   the btree is re
6130: 6d 65 6d 62 65 72 65 64 20 69 6e 20 73 75 63 68  membered in such
6140: 20 61 20 77 61 79 20 74 68 61 74 20 69 74 20 63   a way that it c
6150: 61 6e 20 62 65 0a 2a 2a 20 6d 6f 76 65 64 20 62  an be.** moved b
6160: 61 63 6b 20 74 6f 20 74 68 65 20 73 61 6d 65 20  ack to the same 
6170: 73 70 6f 74 20 61 66 74 65 72 20 74 68 65 20 62  spot after the b
6180: 74 72 65 65 20 68 61 73 20 62 65 65 6e 20 6d 6f  tree has been mo
6190: 64 69 66 69 65 64 2e 20 20 54 68 69 73 0a 2a 2a  dified.  This.**
61a0: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
61b0: 65 64 20 6a 75 73 74 20 62 65 66 6f 72 65 20 63  ed just before c
61c0: 75 72 73 6f 72 20 70 45 78 63 65 70 74 20 69 73  ursor pExcept is
61d0: 20 75 73 65 64 20 74 6f 20 6d 6f 64 69 66 79 20   used to modify 
61e0: 74 68 65 0a 2a 2a 20 74 61 62 6c 65 2c 20 66 6f  the.** table, fo
61f0: 72 20 65 78 61 6d 70 6c 65 20 69 6e 20 42 74 72  r example in Btr
6200: 65 65 44 65 6c 65 74 65 28 29 20 6f 72 20 42 74  eeDelete() or Bt
6210: 72 65 65 49 6e 73 65 72 74 28 29 2e 0a 2a 2a 0a  reeInsert()..**.
6220: 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  ** If there are 
6230: 74 77 6f 20 6f 72 20 6d 6f 72 65 20 63 75 72 73  two or more curs
6240: 6f 72 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 20  ors on the same 
6250: 62 74 72 65 65 2c 20 74 68 65 6e 20 61 6c 6c 20  btree, then all 
6260: 73 75 63 68 20 0a 2a 2a 20 63 75 72 73 6f 72 73  such .** cursors
6270: 20 73 68 6f 75 6c 64 20 68 61 76 65 20 74 68 65   should have the
6280: 69 72 20 42 54 43 46 5f 4d 75 6c 74 69 70 6c 65  ir BTCF_Multiple
6290: 20 66 6c 61 67 20 73 65 74 2e 20 20 54 68 65 20   flag set.  The 
62a0: 62 74 72 65 65 43 75 72 73 6f 72 28 29 0a 2a 2a  btreeCursor().**
62b0: 20 72 6f 75 74 69 6e 65 20 65 6e 66 6f 72 63 65   routine enforce
62c0: 73 20 74 68 61 74 20 72 75 6c 65 2e 20 20 54 68  s that rule.  Th
62d0: 69 73 20 72 6f 75 74 69 6e 65 20 6f 6e 6c 79 20  is routine only 
62e0: 6e 65 65 64 73 20 74 6f 20 62 65 20 63 61 6c 6c  needs to be call
62f0: 65 64 20 69 6e 0a 2a 2a 20 74 68 65 20 75 6e 63  ed in.** the unc
6300: 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 6e 20  ommon case when 
6310: 70 45 78 70 65 63 74 20 68 61 73 20 74 68 65 20  pExpect has the 
6320: 42 54 43 46 5f 4d 75 6c 74 69 70 6c 65 20 66 6c  BTCF_Multiple fl
6330: 61 67 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  ag set..**.** If
6340: 20 70 45 78 70 65 63 74 21 3d 4e 55 4c 4c 20 61   pExpect!=NULL a
6350: 6e 64 20 69 66 20 6e 6f 20 6f 74 68 65 72 20 63  nd if no other c
6360: 75 72 73 6f 72 73 20 61 72 65 20 66 6f 75 6e 64  ursors are found
6370: 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 72 6f 6f   on the same roo
6380: 74 2d 70 61 67 65 2c 0a 2a 2a 20 74 68 65 6e 20  t-page,.** then 
6390: 74 68 65 20 42 54 43 46 5f 4d 75 6c 74 69 70 6c  the BTCF_Multipl
63a0: 65 20 66 6c 61 67 20 6f 6e 20 70 45 78 70 65 63  e flag on pExpec
63b0: 74 20 69 73 20 63 6c 65 61 72 65 64 2c 20 74 6f  t is cleared, to
63c0: 20 61 76 6f 69 64 20 61 6e 6f 74 68 65 72 0a 2a   avoid another.*
63d0: 2a 20 70 6f 69 6e 74 6c 65 73 73 20 63 61 6c 6c  * pointless call
63e0: 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65   to this routine
63f0: 2e 0a 2a 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e  ..**.** Implemen
6400: 74 61 74 69 6f 6e 20 6e 6f 74 65 3a 20 20 54 68  tation note:  Th
6410: 69 73 20 72 6f 75 74 69 6e 65 20 6d 65 72 65 6c  is routine merel
6420: 79 20 63 68 65 63 6b 73 20 74 6f 20 73 65 65 20  y checks to see 
6430: 69 66 20 61 6e 79 20 63 75 72 73 6f 72 73 0a 2a  if any cursors.*
6440: 2a 20 6e 65 65 64 20 74 6f 20 62 65 20 73 61 76  * need to be sav
6450: 65 64 2e 20 20 49 74 20 63 61 6c 6c 73 20 6f 75  ed.  It calls ou
6460: 74 20 74 6f 20 73 61 76 65 43 75 72 73 6f 72 73  t to saveCursors
6470: 4f 6e 4c 69 73 74 28 29 20 69 6e 20 74 68 65 20  OnList() in the 
6480: 28 75 6e 75 73 75 61 6c 29 0a 2a 2a 20 65 76 65  (unusual).** eve
6490: 6e 74 20 74 68 61 74 20 63 75 72 73 6f 72 73 20  nt that cursors 
64a0: 61 72 65 20 69 6e 20 6e 65 65 64 20 74 6f 20 62  are in need to b
64b0: 65 69 6e 67 20 73 61 76 65 64 2e 0a 2a 2f 0a 73  eing saved..*/.s
64c0: 74 61 74 69 63 20 69 6e 74 20 73 61 76 65 41 6c  tatic int saveAl
64d0: 6c 43 75 72 73 6f 72 73 28 42 74 53 68 61 72 65  lCursors(BtShare
64e0: 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 69 52 6f  d *pBt, Pgno iRo
64f0: 6f 74 2c 20 42 74 43 75 72 73 6f 72 20 2a 70 45  ot, BtCursor *pE
6500: 78 63 65 70 74 29 7b 0a 20 20 42 74 43 75 72 73  xcept){.  BtCurs
6510: 6f 72 20 2a 70 3b 0a 20 20 61 73 73 65 72 74 28  or *p;.  assert(
6520: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
6530: 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
6540: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  );.  assert( pEx
6550: 63 65 70 74 3d 3d 30 20 7c 7c 20 70 45 78 63 65  cept==0 || pExce
6560: 70 74 2d 3e 70 42 74 3d 3d 70 42 74 20 29 3b 0a  pt->pBt==pBt );.
6570: 20 20 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75    for(p=pBt->pCu
6580: 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e  rsor; p; p=p->pN
6590: 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 21  ext){.    if( p!
65a0: 3d 70 45 78 63 65 70 74 20 26 26 20 28 30 3d 3d  =pExcept && (0==
65b0: 69 52 6f 6f 74 20 7c 7c 20 70 2d 3e 70 67 6e 6f  iRoot || p->pgno
65c0: 52 6f 6f 74 3d 3d 69 52 6f 6f 74 29 20 29 20 62  Root==iRoot) ) b
65d0: 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  reak;.  }.  if( 
65e0: 70 20 29 20 72 65 74 75 72 6e 20 73 61 76 65 43  p ) return saveC
65f0: 75 72 73 6f 72 73 4f 6e 4c 69 73 74 28 70 2c 20  ursorsOnList(p, 
6600: 69 52 6f 6f 74 2c 20 70 45 78 63 65 70 74 29 3b  iRoot, pExcept);
6610: 0a 20 20 69 66 28 20 70 45 78 63 65 70 74 20 29  .  if( pExcept )
6620: 20 70 45 78 63 65 70 74 2d 3e 63 75 72 46 6c 61   pExcept->curFla
6630: 67 73 20 26 3d 20 7e 42 54 43 46 5f 4d 75 6c 74  gs &= ~BTCF_Mult
6640: 69 70 6c 65 3b 0a 20 20 72 65 74 75 72 6e 20 53  iple;.  return S
6650: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20  QLITE_OK;.}../* 
6660: 54 68 69 73 20 68 65 6c 70 65 72 20 72 6f 75 74  This helper rout
6670: 69 6e 65 20 74 6f 20 73 61 76 65 41 6c 6c 43 75  ine to saveAllCu
6680: 72 73 6f 72 73 20 64 6f 65 73 20 74 68 65 20 61  rsors does the a
6690: 63 74 75 61 6c 20 77 6f 72 6b 20 6f 66 20 73 61  ctual work of sa
66a0: 76 69 6e 67 0a 2a 2a 20 74 68 65 20 63 75 72 73  ving.** the curs
66b0: 6f 72 73 20 69 66 20 61 6e 64 20 77 68 65 6e 20  ors if and when 
66c0: 61 20 63 75 72 73 6f 72 20 69 73 20 66 6f 75 6e  a cursor is foun
66d0: 64 20 74 68 61 74 20 61 63 74 75 61 6c 6c 79 20  d that actually 
66e0: 72 65 71 75 69 72 65 73 20 73 61 76 69 6e 67 2e  requires saving.
66f0: 0a 2a 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e 20 63  .** The common c
6700: 61 73 65 20 69 73 20 74 68 61 74 20 6e 6f 20 63  ase is that no c
6710: 75 72 73 6f 72 73 20 6e 65 65 64 20 74 6f 20 62  ursors need to b
6720: 65 20 73 61 76 65 64 2c 20 73 6f 20 74 68 69 73  e saved, so this
6730: 20 72 6f 75 74 69 6e 65 20 69 73 0a 2a 2a 20 62   routine is.** b
6740: 72 6f 6b 65 6e 20 6f 75 74 20 66 72 6f 6d 20 69  roken out from i
6750: 74 73 20 63 61 6c 6c 65 72 20 74 6f 20 61 76 6f  ts caller to avo
6760: 69 64 20 75 6e 6e 65 63 65 73 73 61 72 79 20 73  id unnecessary s
6770: 74 61 63 6b 20 70 6f 69 6e 74 65 72 20 6d 6f 76  tack pointer mov
6780: 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  ement..*/.static
6790: 20 69 6e 74 20 53 51 4c 49 54 45 5f 4e 4f 49 4e   int SQLITE_NOIN
67a0: 4c 49 4e 45 20 73 61 76 65 43 75 72 73 6f 72 73  LINE saveCursors
67b0: 4f 6e 4c 69 73 74 28 0a 20 20 42 74 43 75 72 73  OnList(.  BtCurs
67c0: 6f 72 20 2a 70 2c 20 20 20 20 20 20 20 20 20 2f  or *p,         /
67d0: 2a 20 54 68 65 20 66 69 72 73 74 20 63 75 72 73  * The first curs
67e0: 6f 72 20 74 68 61 74 20 6e 65 65 64 73 20 73 61  or that needs sa
67f0: 76 69 6e 67 20 2a 2f 0a 20 20 50 67 6e 6f 20 69  ving */.  Pgno i
6800: 52 6f 6f 74 2c 20 20 20 20 20 20 20 20 20 20 2f  Root,          /
6810: 2a 20 4f 6e 6c 79 20 73 61 76 65 20 63 75 72 73  * Only save curs
6820: 6f 72 20 77 69 74 68 20 74 68 69 73 20 69 52 6f  or with this iRo
6830: 6f 74 2e 20 53 61 76 65 20 61 6c 6c 20 69 66 20  ot. Save all if 
6840: 7a 65 72 6f 20 2a 2f 0a 20 20 42 74 43 75 72 73  zero */.  BtCurs
6850: 6f 72 20 2a 70 45 78 63 65 70 74 20 20 20 20 2f  or *pExcept    /
6860: 2a 20 44 6f 20 6e 6f 74 20 73 61 76 65 20 74 68  * Do not save th
6870: 69 73 20 63 75 72 73 6f 72 20 2a 2f 0a 29 7b 0a  is cursor */.){.
6880: 20 20 64 6f 7b 0a 20 20 20 20 69 66 28 20 70 21    do{.    if( p!
6890: 3d 70 45 78 63 65 70 74 20 26 26 20 28 30 3d 3d  =pExcept && (0==
68a0: 69 52 6f 6f 74 20 7c 7c 20 70 2d 3e 70 67 6e 6f  iRoot || p->pgno
68b0: 52 6f 6f 74 3d 3d 69 52 6f 6f 74 29 20 29 7b 0a  Root==iRoot) ){.
68c0: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 65 53 74        if( p->eSt
68d0: 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
68e0: 44 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d  D || p->eState==
68f0: 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54 20  CURSOR_SKIPNEXT 
6900: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72  ){.        int r
6910: 63 20 3d 20 73 61 76 65 43 75 72 73 6f 72 50 6f  c = saveCursorPo
6920: 73 69 74 69 6f 6e 28 70 29 3b 0a 20 20 20 20 20  sition(p);.     
6930: 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b     if( SQLITE_OK
6940: 21 3d 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  !=rc ){.        
6950: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
6960: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
6970: 73 65 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74  se{.        test
6980: 63 61 73 65 28 20 70 2d 3e 69 50 61 67 65 3e 3d  case( p->iPage>=
6990: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 62 74 72  0 );.        btr
69a0: 65 65 52 65 6c 65 61 73 65 41 6c 6c 43 75 72 73  eeReleaseAllCurs
69b0: 6f 72 50 61 67 65 73 28 70 29 3b 0a 20 20 20 20  orPages(p);.    
69c0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 20    }.    }.    p 
69d0: 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 77  = p->pNext;.  }w
69e0: 68 69 6c 65 28 20 70 20 29 3b 0a 20 20 72 65 74  hile( p );.  ret
69f0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
6a00: 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68  ../*.** Clear th
6a10: 65 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72  e current cursor
6a20: 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f   position..*/.vo
6a30: 69 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  id sqlite3BtreeC
6a40: 6c 65 61 72 43 75 72 73 6f 72 28 42 74 43 75 72  learCursor(BtCur
6a50: 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73  sor *pCur){.  as
6a60: 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
6a70: 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
6a80: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
6a90: 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 20 20 70 43  Cur->pKey);.  pC
6aa0: 75 72 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a 20 20  ur->pKey = 0;.  
6ab0: 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
6ac0: 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 7d  URSOR_INVALID;.}
6ad0: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 20 74 68 69 73 20  ../*.** In this 
6ae0: 76 65 72 73 69 6f 6e 20 6f 66 20 42 74 72 65 65  version of Btree
6af0: 4d 6f 76 65 74 6f 2c 20 70 4b 65 79 20 69 73 20  Moveto, pKey is 
6b00: 61 20 70 61 63 6b 65 64 20 69 6e 64 65 78 20 72  a packed index r
6b10: 65 63 6f 72 64 0a 2a 2a 20 73 75 63 68 20 61 73  ecord.** such as
6b20: 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 62 79   is generated by
6b30: 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f   the OP_MakeReco
6b40: 72 64 20 6f 70 63 6f 64 65 2e 20 20 55 6e 70 61  rd opcode.  Unpa
6b50: 63 6b 20 74 68 65 0a 2a 2a 20 72 65 63 6f 72 64  ck the.** record
6b60: 20 61 6e 64 20 74 68 65 6e 20 63 61 6c 6c 20 42   and then call B
6b70: 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b  treeMovetoUnpack
6b80: 65 64 28 29 20 74 6f 20 64 6f 20 74 68 65 20 77  ed() to do the w
6b90: 6f 72 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ork..*/.static i
6ba0: 6e 74 20 62 74 72 65 65 4d 6f 76 65 74 6f 28 0a  nt btreeMoveto(.
6bb0: 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72    BtCursor *pCur
6bc0: 2c 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20  ,     /* Cursor 
6bd0: 6f 70 65 6e 20 6f 6e 20 74 68 65 20 62 74 72 65  open on the btre
6be0: 65 20 74 6f 20 62 65 20 73 65 61 72 63 68 65 64  e to be searched
6bf0: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64   */.  const void
6c00: 20 2a 70 4b 65 79 2c 20 20 20 2f 2a 20 50 61 63   *pKey,   /* Pac
6c10: 6b 65 64 20 6b 65 79 20 69 66 20 74 68 65 20 62  ked key if the b
6c20: 74 72 65 65 20 69 73 20 61 6e 20 69 6e 64 65 78  tree is an index
6c30: 20 2a 2f 0a 20 20 69 36 34 20 6e 4b 65 79 2c 20   */.  i64 nKey, 
6c40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 74            /* Int
6c50: 65 67 65 72 20 6b 65 79 20 66 6f 72 20 74 61 62  eger key for tab
6c60: 6c 65 73 2e 20 20 53 69 7a 65 20 6f 66 20 70 4b  les.  Size of pK
6c70: 65 79 20 66 6f 72 20 69 6e 64 69 63 65 73 20 2a  ey for indices *
6c80: 2f 0a 20 20 69 6e 74 20 62 69 61 73 2c 20 20 20  /.  int bias,   
6c90: 20 20 20 20 20 20 20 20 2f 2a 20 42 69 61 73 20          /* Bias 
6ca0: 73 65 61 72 63 68 20 74 6f 20 74 68 65 20 68 69  search to the hi
6cb0: 67 68 20 65 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  gh end */.  int 
6cc0: 2a 70 52 65 73 20 20 20 20 20 20 20 20 20 20 20  *pRes           
6cd0: 2f 2a 20 57 72 69 74 65 20 73 65 61 72 63 68 20  /* Write search 
6ce0: 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a  results here */.
6cf0: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
6d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6d10: 2f 2a 20 53 74 61 74 75 73 20 63 6f 64 65 20 2a  /* Status code *
6d20: 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f  /.  UnpackedReco
6d30: 72 64 20 2a 70 49 64 78 4b 65 79 3b 20 20 20 2f  rd *pIdxKey;   /
6d40: 2a 20 55 6e 70 61 63 6b 65 64 20 69 6e 64 65 78  * Unpacked index
6d50: 20 6b 65 79 20 2a 2f 0a 0a 20 20 69 66 28 20 70   key */..  if( p
6d60: 4b 65 79 20 29 7b 0a 20 20 20 20 61 73 73 65 72  Key ){.    asser
6d70: 74 28 20 6e 4b 65 79 3d 3d 28 69 36 34 29 28 69  t( nKey==(i64)(i
6d80: 6e 74 29 6e 4b 65 79 20 29 3b 0a 20 20 20 20 70  nt)nKey );.    p
6d90: 49 64 78 4b 65 79 20 3d 20 73 71 6c 69 74 65 33  IdxKey = sqlite3
6da0: 56 64 62 65 41 6c 6c 6f 63 55 6e 70 61 63 6b 65  VdbeAllocUnpacke
6db0: 64 52 65 63 6f 72 64 28 70 43 75 72 2d 3e 70 4b  dRecord(pCur->pK
6dc0: 65 79 49 6e 66 6f 29 3b 0a 20 20 20 20 69 66 28  eyInfo);.    if(
6dd0: 20 70 49 64 78 4b 65 79 3d 3d 30 20 29 20 72 65   pIdxKey==0 ) re
6de0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
6df0: 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 73 71 6c 69  M_BKPT;.    sqli
6e00: 74 65 33 56 64 62 65 52 65 63 6f 72 64 55 6e 70  te3VdbeRecordUnp
6e10: 61 63 6b 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e  ack(pCur->pKeyIn
6e20: 66 6f 2c 20 28 69 6e 74 29 6e 4b 65 79 2c 20 70  fo, (int)nKey, p
6e30: 4b 65 79 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20  Key, pIdxKey);. 
6e40: 20 20 20 69 66 28 20 70 49 64 78 4b 65 79 2d 3e     if( pIdxKey->
6e50: 6e 46 69 65 6c 64 3d 3d 30 20 29 7b 0a 20 20 20  nField==0 ){.   
6e60: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
6e70: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
6e80: 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 64     goto moveto_d
6e90: 6f 6e 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  one;.    }.  }el
6ea0: 73 65 7b 0a 20 20 20 20 70 49 64 78 4b 65 79 20  se{.    pIdxKey 
6eb0: 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  = 0;.  }.  rc = 
6ec0: 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65  sqlite3BtreeMove
6ed0: 74 6f 55 6e 70 61 63 6b 65 64 28 70 43 75 72 2c  toUnpacked(pCur,
6ee0: 20 70 49 64 78 4b 65 79 2c 20 6e 4b 65 79 2c 20   pIdxKey, nKey, 
6ef0: 62 69 61 73 2c 20 70 52 65 73 29 3b 0a 6d 6f 76  bias, pRes);.mov
6f00: 65 74 6f 5f 64 6f 6e 65 3a 0a 20 20 69 66 28 20  eto_done:.  if( 
6f10: 70 49 64 78 4b 65 79 20 29 7b 0a 20 20 20 20 73  pIdxKey ){.    s
6f20: 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 43 75  qlite3DbFree(pCu
6f30: 72 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2c  r->pKeyInfo->db,
6f40: 20 70 49 64 78 4b 65 79 29 3b 0a 20 20 7d 0a 20   pIdxKey);.  }. 
6f50: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
6f60: 2a 0a 2a 2a 20 52 65 73 74 6f 72 65 20 74 68 65  *.** Restore the
6f70: 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 70   cursor to the p
6f80: 6f 73 69 74 69 6f 6e 20 69 74 20 77 61 73 20 69  osition it was i
6f90: 6e 20 28 6f 72 20 61 73 20 63 6c 6f 73 65 20 74  n (or as close t
6fa0: 6f 20 61 73 20 70 6f 73 73 69 62 6c 65 29 0a 2a  o as possible).*
6fb0: 2a 20 77 68 65 6e 20 73 61 76 65 43 75 72 73 6f  * when saveCurso
6fc0: 72 50 6f 73 69 74 69 6f 6e 28 29 20 77 61 73 20  rPosition() was 
6fd0: 63 61 6c 6c 65 64 2e 20 4e 6f 74 65 20 74 68 61  called. Note tha
6fe0: 74 20 74 68 69 73 20 63 61 6c 6c 20 64 65 6c 65  t this call dele
6ff0: 74 65 73 20 74 68 65 20 0a 2a 2a 20 73 61 76 65  tes the .** save
7000: 64 20 70 6f 73 69 74 69 6f 6e 20 69 6e 66 6f 20  d position info 
7010: 73 74 6f 72 65 64 20 62 79 20 73 61 76 65 43 75  stored by saveCu
7020: 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 2c 20  rsorPosition(), 
7030: 73 6f 20 74 68 65 72 65 20 63 61 6e 20 62 65 0a  so there can be.
7040: 2a 2a 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20 65  ** at most one e
7050: 66 66 65 63 74 69 76 65 20 72 65 73 74 6f 72 65  ffective restore
7060: 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29  CursorPosition()
7070: 20 63 61 6c 6c 20 61 66 74 65 72 20 65 61 63 68   call after each
7080: 20 0a 2a 2a 20 73 61 76 65 43 75 72 73 6f 72 50   .** saveCursorP
7090: 6f 73 69 74 69 6f 6e 28 29 2e 0a 2a 2f 0a 73 74  osition()..*/.st
70a0: 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 52 65  atic int btreeRe
70b0: 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74  storeCursorPosit
70c0: 69 6f 6e 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ion(BtCursor *pC
70d0: 75 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  ur){.  int rc;. 
70e0: 20 69 6e 74 20 73 6b 69 70 4e 65 78 74 3b 0a 20   int skipNext;. 
70f0: 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f   assert( cursorO
7100: 77 6e 73 42 74 53 68 61 72 65 64 28 70 43 75 72  wnsBtShared(pCur
7110: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
7120: 43 75 72 2d 3e 65 53 74 61 74 65 3e 3d 43 55 52  Cur->eState>=CUR
7130: 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20  SOR_REQUIRESEEK 
7140: 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65  );.  if( pCur->e
7150: 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 46 41  State==CURSOR_FA
7160: 55 4c 54 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ULT ){.    retur
7170: 6e 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74  n pCur->skipNext
7180: 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 65 53  ;.  }.  pCur->eS
7190: 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e  tate = CURSOR_IN
71a0: 56 41 4c 49 44 3b 0a 20 20 72 63 20 3d 20 62 74  VALID;.  rc = bt
71b0: 72 65 65 4d 6f 76 65 74 6f 28 70 43 75 72 2c 20  reeMoveto(pCur, 
71c0: 70 43 75 72 2d 3e 70 4b 65 79 2c 20 70 43 75 72  pCur->pKey, pCur
71d0: 2d 3e 6e 4b 65 79 2c 20 30 2c 20 26 73 6b 69 70  ->nKey, 0, &skip
71e0: 4e 65 78 74 29 3b 0a 20 20 69 66 28 20 72 63 3d  Next);.  if( rc=
71f0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
7200: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
7210: 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 20 20 20 20  Cur->pKey);.    
7220: 70 43 75 72 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a  pCur->pKey = 0;.
7230: 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
7240: 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
7250: 5f 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e  _VALID || pCur->
7260: 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49  eState==CURSOR_I
7270: 4e 56 41 4c 49 44 20 29 3b 0a 20 20 20 20 70 43  NVALID );.    pC
7280: 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 7c 3d 20  ur->skipNext |= 
7290: 73 6b 69 70 4e 65 78 74 3b 0a 20 20 20 20 69 66  skipNext;.    if
72a0: 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74  ( pCur->skipNext
72b0: 20 26 26 20 70 43 75 72 2d 3e 65 53 74 61 74 65   && pCur->eState
72c0: 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
72d0: 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53  {.      pCur->eS
72e0: 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 53 4b  tate = CURSOR_SK
72f0: 49 50 4e 45 58 54 3b 0a 20 20 20 20 7d 0a 20 20  IPNEXT;.    }.  
7300: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
7310: 0a 0a 23 64 65 66 69 6e 65 20 72 65 73 74 6f 72  ..#define restor
7320: 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
7330: 70 29 20 5c 0a 20 20 28 70 2d 3e 65 53 74 61 74  p) \.  (p->eStat
7340: 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55 49 52  e>=CURSOR_REQUIR
7350: 45 53 45 45 4b 20 3f 20 5c 0a 20 20 20 20 20 20  ESEEK ? \.      
7360: 20 20 20 62 74 72 65 65 52 65 73 74 6f 72 65 43     btreeRestoreC
7370: 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29  ursorPosition(p)
7380: 20 3a 20 5c 0a 20 20 20 20 20 20 20 20 20 53 51   : \.         SQ
7390: 4c 49 54 45 5f 4f 4b 29 0a 0a 2f 2a 0a 2a 2a 20  LITE_OK)../*.** 
73a0: 44 65 74 65 72 6d 69 6e 65 20 77 68 65 74 68 65  Determine whethe
73b0: 72 20 6f 72 20 6e 6f 74 20 61 20 63 75 72 73 6f  r or not a curso
73c0: 72 20 68 61 73 20 6d 6f 76 65 64 20 66 72 6f 6d  r has moved from
73d0: 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 77 68   the position wh
73e0: 65 72 65 0a 2a 2a 20 69 74 20 77 61 73 20 6c 61  ere.** it was la
73f0: 73 74 20 70 6c 61 63 65 64 2c 20 6f 72 20 68 61  st placed, or ha
7400: 73 20 62 65 65 6e 20 69 6e 76 61 6c 69 64 61 74  s been invalidat
7410: 65 64 20 66 6f 72 20 61 6e 79 20 6f 74 68 65 72  ed for any other
7420: 20 72 65 61 73 6f 6e 2e 0a 2a 2a 20 43 75 72 73   reason..** Curs
7430: 6f 72 73 20 63 61 6e 20 6d 6f 76 65 20 77 68 65  ors can move whe
7440: 6e 20 74 68 65 20 72 6f 77 20 74 68 65 79 20 61  n the row they a
7450: 72 65 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 69  re pointing at i
7460: 73 20 64 65 6c 65 74 65 64 20 6f 75 74 0a 2a 2a  s deleted out.**
7470: 20 66 72 6f 6d 20 75 6e 64 65 72 20 74 68 65 6d   from under them
7480: 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2e 20 20  , for example.  
7490: 43 75 72 73 6f 72 20 6d 69 67 68 74 20 61 6c 73  Cursor might als
74a0: 6f 20 6d 6f 76 65 20 69 66 20 61 20 62 74 72 65  o move if a btre
74b0: 65 0a 2a 2a 20 69 73 20 72 65 62 61 6c 61 6e 63  e.** is rebalanc
74c0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 69 6e  ed..**.** Callin
74d0: 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  g this routine w
74e0: 69 74 68 20 61 20 4e 55 4c 4c 20 63 75 72 73 6f  ith a NULL curso
74f0: 72 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72 6e  r pointer return
7500: 73 20 66 61 6c 73 65 2e 0a 2a 2a 0a 2a 2a 20 55  s false..**.** U
7510: 73 65 20 74 68 65 20 73 65 70 61 72 61 74 65 20  se the separate 
7520: 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
7530: 6f 72 52 65 73 74 6f 72 65 28 29 20 72 6f 75 74  orRestore() rout
7540: 69 6e 65 20 74 6f 20 72 65 73 74 6f 72 65 20 61  ine to restore a
7550: 20 63 75 72 73 6f 72 0a 2a 2a 20 62 61 63 6b 20   cursor.** back 
7560: 74 6f 20 77 68 65 72 65 20 69 74 20 6f 75 67 68  to where it ough
7570: 74 20 74 6f 20 62 65 20 69 66 20 74 68 69 73 20  t to be if this 
7580: 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
7590: 74 72 75 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  true..*/.int sql
75a0: 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 48  ite3BtreeCursorH
75b0: 61 73 4d 6f 76 65 64 28 42 74 43 75 72 73 6f 72  asMoved(BtCursor
75c0: 20 2a 70 43 75 72 29 7b 0a 20 20 61 73 73 65 72   *pCur){.  asser
75d0: 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c  t( EIGHT_BYTE_AL
75e0: 49 47 4e 4d 45 4e 54 28 70 43 75 72 29 0a 20 20  IGNMENT(pCur).  
75f0: 20 20 20 20 20 7c 7c 20 70 43 75 72 3d 3d 73 71       || pCur==sq
7600: 6c 69 74 65 33 42 74 72 65 65 46 61 6b 65 56 61  lite3BtreeFakeVa
7610: 6c 69 64 43 75 72 73 6f 72 28 29 20 29 3b 0a 20  lidCursor() );. 
7620: 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 6f   assert( offseto
7630: 66 28 42 74 43 75 72 73 6f 72 2c 20 65 53 74 61  f(BtCursor, eSta
7640: 74 65 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  te)==0 );.  asse
7650: 72 74 28 20 73 69 7a 65 6f 66 28 70 43 75 72 2d  rt( sizeof(pCur-
7660: 3e 65 53 74 61 74 65 29 3d 3d 31 20 29 3b 0a 20  >eState)==1 );. 
7670: 20 72 65 74 75 72 6e 20 43 55 52 53 4f 52 5f 56   return CURSOR_V
7680: 41 4c 49 44 20 21 3d 20 2a 28 75 38 2a 29 70 43  ALID != *(u8*)pC
7690: 75 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ur;.}../*.** Ret
76a0: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
76b0: 20 61 20 66 61 6b 65 20 42 74 43 75 72 73 6f 72   a fake BtCursor
76c0: 20 6f 62 6a 65 63 74 20 74 68 61 74 20 77 69 6c   object that wil
76d0: 6c 20 61 6c 77 61 79 73 20 61 6e 73 77 65 72 0a  l always answer.
76e0: 2a 2a 20 66 61 6c 73 65 20 74 6f 20 74 68 65 20  ** false to the 
76f0: 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
7700: 6f 72 48 61 73 4d 6f 76 65 64 28 29 20 72 6f 75  orHasMoved() rou
7710: 74 69 6e 65 20 61 62 6f 76 65 2e 20 20 54 68 65  tine above.  The
7720: 20 66 61 6b 65 0a 2a 2a 20 63 75 72 73 6f 72 20   fake.** cursor 
7730: 72 65 74 75 72 6e 65 64 20 6d 75 73 74 20 6e 6f  returned must no
7740: 74 20 62 65 20 75 73 65 64 20 77 69 74 68 20 61  t be used with a
7750: 6e 79 20 6f 74 68 65 72 20 42 74 72 65 65 20 69  ny other Btree i
7760: 6e 74 65 72 66 61 63 65 2e 0a 2a 2f 0a 42 74 43  nterface..*/.BtC
7770: 75 72 73 6f 72 20 2a 73 71 6c 69 74 65 33 42 74  ursor *sqlite3Bt
7780: 72 65 65 46 61 6b 65 56 61 6c 69 64 43 75 72 73  reeFakeValidCurs
7790: 6f 72 28 76 6f 69 64 29 7b 0a 20 20 73 74 61 74  or(void){.  stat
77a0: 69 63 20 75 38 20 66 61 6b 65 43 75 72 73 6f 72  ic u8 fakeCursor
77b0: 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b   = CURSOR_VALID;
77c0: 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73 65  .  assert( offse
77d0: 74 6f 66 28 42 74 43 75 72 73 6f 72 2c 20 65 53  tof(BtCursor, eS
77e0: 74 61 74 65 29 3d 3d 30 20 29 3b 0a 20 20 72 65  tate)==0 );.  re
77f0: 74 75 72 6e 20 28 42 74 43 75 72 73 6f 72 2a 29  turn (BtCursor*)
7800: 26 66 61 6b 65 43 75 72 73 6f 72 3b 0a 7d 0a 0a  &fakeCursor;.}..
7810: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
7820: 6e 65 20 72 65 73 74 6f 72 65 73 20 61 20 63 75  ne restores a cu
7830: 72 73 6f 72 20 62 61 63 6b 20 74 6f 20 69 74 73  rsor back to its
7840: 20 6f 72 69 67 69 6e 61 6c 20 70 6f 73 69 74 69   original positi
7850: 6f 6e 20 61 66 74 65 72 20 69 74 0a 2a 2a 20 68  on after it.** h
7860: 61 73 20 62 65 65 6e 20 6d 6f 76 65 64 20 62 79  as been moved by
7870: 20 73 6f 6d 65 20 6f 75 74 73 69 64 65 20 61 63   some outside ac
7880: 74 69 76 69 74 79 20 28 73 75 63 68 20 61 73 20  tivity (such as 
7890: 61 20 62 74 72 65 65 20 72 65 62 61 6c 61 6e 63  a btree rebalanc
78a0: 65 20 6f 72 0a 2a 2a 20 61 20 72 6f 77 20 68 61  e or.** a row ha
78b0: 76 69 6e 67 20 62 65 65 6e 20 64 65 6c 65 74 65  ving been delete
78c0: 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72  d out from under
78d0: 20 74 68 65 20 63 75 72 73 6f 72 29 2e 20 20 0a   the cursor).  .
78e0: 2a 2a 0a 2a 2a 20 4f 6e 20 73 75 63 63 65 73 73  **.** On success
78f0: 2c 20 74 68 65 20 2a 70 44 69 66 66 65 72 65 6e  , the *pDifferen
7900: 74 52 6f 77 20 70 61 72 61 6d 65 74 65 72 20 69  tRow parameter i
7910: 73 20 66 61 6c 73 65 20 69 66 20 74 68 65 20 63  s false if the c
7920: 75 72 73 6f 72 20 69 73 20 6c 65 66 74 0a 2a 2a  ursor is left.**
7930: 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 65 78 61   pointing at exa
7940: 63 74 6c 79 20 74 68 65 20 73 61 6d 65 20 72 6f  ctly the same ro
7950: 77 2e 20 20 2a 70 44 69 66 66 65 72 6e 74 52 6f  w.  *pDifferntRo
7960: 77 20 69 73 20 74 68 65 20 72 6f 77 20 74 68 65  w is the row the
7970: 20 63 75 72 73 6f 72 0a 2a 2a 20 77 61 73 20 70   cursor.** was p
7980: 6f 69 6e 74 69 6e 67 20 74 6f 20 68 61 73 20 62  ointing to has b
7990: 65 65 6e 20 64 65 6c 65 74 65 64 2c 20 66 6f 72  een deleted, for
79a0: 63 69 6e 67 20 74 68 65 20 63 75 72 73 6f 72 20  cing the cursor 
79b0: 74 6f 20 70 6f 69 6e 74 20 74 6f 20 73 6f 6d 65  to point to some
79c0: 0a 2a 2a 20 6e 65 61 72 62 79 20 72 6f 77 2e 0a  .** nearby row..
79d0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
79e0: 6e 65 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62  ne should only b
79f0: 65 20 63 61 6c 6c 65 64 20 66 6f 72 20 61 20 63  e called for a c
7a00: 75 72 73 6f 72 20 74 68 61 74 20 6a 75 73 74 20  ursor that just 
7a10: 72 65 74 75 72 6e 65 64 0a 2a 2a 20 54 52 55 45  returned.** TRUE
7a20: 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 42 74 72   from sqlite3Btr
7a30: 65 65 43 75 72 73 6f 72 48 61 73 4d 6f 76 65 64  eeCursorHasMoved
7a40: 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ()..*/.int sqlit
7a50: 65 33 42 74 72 65 65 43 75 72 73 6f 72 52 65 73  e3BtreeCursorRes
7a60: 74 6f 72 65 28 42 74 43 75 72 73 6f 72 20 2a 70  tore(BtCursor *p
7a70: 43 75 72 2c 20 69 6e 74 20 2a 70 44 69 66 66 65  Cur, int *pDiffe
7a80: 72 65 6e 74 52 6f 77 29 7b 0a 20 20 69 6e 74 20  rentRow){.  int 
7a90: 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  rc;..  assert( p
7aa0: 43 75 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  Cur!=0 );.  asse
7ab0: 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
7ac0: 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  !=CURSOR_VALID )
7ad0: 3b 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65  ;.  rc = restore
7ae0: 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70  CursorPosition(p
7af0: 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 20 29  Cur);.  if( rc )
7b00: 7b 0a 20 20 20 20 2a 70 44 69 66 66 65 72 65 6e  {.    *pDifferen
7b10: 74 52 6f 77 20 3d 20 31 3b 0a 20 20 20 20 72 65  tRow = 1;.    re
7b20: 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69  turn rc;.  }.  i
7b30: 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21  f( pCur->eState!
7b40: 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b  =CURSOR_VALID ){
7b50: 0a 20 20 20 20 2a 70 44 69 66 66 65 72 65 6e 74  .    *pDifferent
7b60: 52 6f 77 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65  Row = 1;.  }else
7b70: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  {.    assert( pC
7b80: 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d 30 20  ur->skipNext==0 
7b90: 29 3b 0a 20 20 20 20 2a 70 44 69 66 66 65 72 65  );.    *pDiffere
7ba0: 6e 74 52 6f 77 20 3d 20 30 3b 0a 20 20 7d 0a 20  ntRow = 0;.  }. 
7bb0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
7bc0: 4b 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  K;.}..#ifdef SQL
7bd0: 49 54 45 5f 45 4e 41 42 4c 45 5f 43 55 52 53 4f  ITE_ENABLE_CURSO
7be0: 52 5f 48 49 4e 54 53 0a 2f 2a 0a 2a 2a 20 50 72  R_HINTS./*.** Pr
7bf0: 6f 76 69 64 65 20 68 69 6e 74 73 20 74 6f 20 74  ovide hints to t
7c00: 68 65 20 63 75 72 73 6f 72 2e 20 20 54 68 65 20  he cursor.  The 
7c10: 70 61 72 74 69 63 75 6c 61 72 20 68 69 6e 74 20  particular hint 
7c20: 67 69 76 65 6e 20 28 61 6e 64 20 74 68 65 20 74  given (and the t
7c30: 79 70 65 0a 2a 2a 20 61 6e 64 20 6e 75 6d 62 65  ype.** and numbe
7c40: 72 20 6f 66 20 74 68 65 20 76 61 72 61 72 67 73  r of the varargs
7c50: 20 70 61 72 61 6d 65 74 65 72 73 29 20 69 73 20   parameters) is 
7c60: 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68  determined by th
7c70: 65 20 65 48 69 6e 74 54 79 70 65 0a 2a 2a 20 70  e eHintType.** p
7c80: 61 72 61 6d 65 74 65 72 2e 20 20 53 65 65 20 74  arameter.  See t
7c90: 68 65 20 64 65 66 69 6e 69 74 69 6f 6e 73 20 6f  he definitions o
7ca0: 66 20 74 68 65 20 42 54 52 45 45 5f 48 49 4e 54  f the BTREE_HINT
7cb0: 5f 2a 20 6d 61 63 72 6f 73 20 66 6f 72 20 64 65  _* macros for de
7cc0: 74 61 69 6c 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73  tails..*/.void s
7cd0: 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
7ce0: 72 48 69 6e 74 28 42 74 43 75 72 73 6f 72 20 2a  rHint(BtCursor *
7cf0: 70 43 75 72 2c 20 69 6e 74 20 65 48 69 6e 74 54  pCur, int eHintT
7d00: 79 70 65 2c 20 2e 2e 2e 29 7b 0a 20 20 2f 2a 20  ype, ...){.  /* 
7d10: 55 73 65 64 20 6f 6e 6c 79 20 62 79 20 73 79 73  Used only by sys
7d20: 74 65 6d 20 74 68 61 74 20 73 75 62 73 74 69 74  tem that substit
7d30: 75 74 65 20 74 68 65 69 72 20 6f 77 6e 20 73 74  ute their own st
7d40: 6f 72 61 67 65 20 65 6e 67 69 6e 65 20 2a 2f 0a  orage engine */.
7d50: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
7d60: 50 72 6f 76 69 64 65 20 66 6c 61 67 20 68 69 6e  Provide flag hin
7d70: 74 73 20 74 6f 20 74 68 65 20 63 75 72 73 6f 72  ts to the cursor
7d80: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
7d90: 33 42 74 72 65 65 43 75 72 73 6f 72 48 69 6e 74  3BtreeCursorHint
7da0: 46 6c 61 67 73 28 42 74 43 75 72 73 6f 72 20 2a  Flags(BtCursor *
7db0: 70 43 75 72 2c 20 75 6e 73 69 67 6e 65 64 20 78  pCur, unsigned x
7dc0: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 78 3d 3d  ){.  assert( x==
7dd0: 42 54 52 45 45 5f 53 45 45 4b 5f 45 51 20 7c 7c  BTREE_SEEK_EQ ||
7de0: 20 78 3d 3d 42 54 52 45 45 5f 42 55 4c 4b 4c 4f   x==BTREE_BULKLO
7df0: 41 44 20 7c 7c 20 78 3d 3d 30 20 29 3b 0a 20 20  AD || x==0 );.  
7e00: 70 43 75 72 2d 3e 68 69 6e 74 73 20 3d 20 78 3b  pCur->hints = x;
7e10: 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  .}...#ifndef SQL
7e20: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
7e30: 55 55 4d 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  UUM./*.** Given 
7e40: 61 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  a page number of
7e50: 20 61 20 72 65 67 75 6c 61 72 20 64 61 74 61 62   a regular datab
7e60: 61 73 65 20 70 61 67 65 2c 20 72 65 74 75 72 6e  ase page, return
7e70: 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 6e 75 6d   the page.** num
7e80: 62 65 72 20 66 6f 72 20 74 68 65 20 70 6f 69 6e  ber for the poin
7e90: 74 65 72 2d 6d 61 70 20 70 61 67 65 20 74 68 61  ter-map page tha
7ea0: 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 65  t contains the e
7eb0: 6e 74 72 79 20 66 6f 72 20 74 68 65 0a 2a 2a 20  ntry for the.** 
7ec0: 69 6e 70 75 74 20 70 61 67 65 20 6e 75 6d 62 65  input page numbe
7ed0: 72 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  r..**.** Return 
7ee0: 30 20 28 6e 6f 74 20 61 20 76 61 6c 69 64 20 70  0 (not a valid p
7ef0: 61 67 65 29 20 66 6f 72 20 70 67 6e 6f 3d 3d 31  age) for pgno==1
7f00: 20 73 69 6e 63 65 20 74 68 65 72 65 20 69 73 0a   since there is.
7f10: 2a 2a 20 6e 6f 20 70 6f 69 6e 74 65 72 20 6d 61  ** no pointer ma
7f20: 70 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  p associated wit
7f30: 68 20 70 61 67 65 20 31 2e 20 20 54 68 65 20 69  h page 1.  The i
7f40: 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 20 6c  ntegrity_check l
7f50: 6f 67 69 63 0a 2a 2a 20 72 65 71 75 69 72 65 73  ogic.** requires
7f60: 20 74 68 61 74 20 70 74 72 6d 61 70 50 61 67 65   that ptrmapPage
7f70: 6e 6f 28 2a 2c 31 29 21 3d 31 2e 0a 2a 2f 0a 73  no(*,1)!=1..*/.s
7f80: 74 61 74 69 63 20 50 67 6e 6f 20 70 74 72 6d 61  tatic Pgno ptrma
7f90: 70 50 61 67 65 6e 6f 28 42 74 53 68 61 72 65 64  pPageno(BtShared
7fa0: 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f   *pBt, Pgno pgno
7fb0: 29 7b 0a 20 20 69 6e 74 20 6e 50 61 67 65 73 50  ){.  int nPagesP
7fc0: 65 72 4d 61 70 50 61 67 65 3b 0a 20 20 50 67 6e  erMapPage;.  Pgn
7fd0: 6f 20 69 50 74 72 4d 61 70 2c 20 72 65 74 3b 0a  o iPtrMap, ret;.
7fe0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
7ff0: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
8000: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66  ->mutex) );.  if
8010: 28 20 70 67 6e 6f 3c 32 20 29 20 72 65 74 75 72  ( pgno<2 ) retur
8020: 6e 20 30 3b 0a 20 20 6e 50 61 67 65 73 50 65 72  n 0;.  nPagesPer
8030: 4d 61 70 50 61 67 65 20 3d 20 28 70 42 74 2d 3e  MapPage = (pBt->
8040: 75 73 61 62 6c 65 53 69 7a 65 2f 35 29 2b 31 3b  usableSize/5)+1;
8050: 0a 20 20 69 50 74 72 4d 61 70 20 3d 20 28 70 67  .  iPtrMap = (pg
8060: 6e 6f 2d 32 29 2f 6e 50 61 67 65 73 50 65 72 4d  no-2)/nPagesPerM
8070: 61 70 50 61 67 65 3b 0a 20 20 72 65 74 20 3d 20  apPage;.  ret = 
8080: 28 69 50 74 72 4d 61 70 2a 6e 50 61 67 65 73 50  (iPtrMap*nPagesP
8090: 65 72 4d 61 70 50 61 67 65 29 20 2b 20 32 3b 20  erMapPage) + 2; 
80a0: 0a 20 20 69 66 28 20 72 65 74 3d 3d 50 45 4e 44  .  if( ret==PEND
80b0: 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
80c0: 74 29 20 29 7b 0a 20 20 20 20 72 65 74 2b 2b 3b  t) ){.    ret++;
80d0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 65  .  }.  return re
80e0: 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  t;.}../*.** Writ
80f0: 65 20 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20  e an entry into 
8100: 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e  the pointer map.
8110: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
8120: 69 6e 65 20 75 70 64 61 74 65 73 20 74 68 65 20  ine updates the 
8130: 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72  pointer map entr
8140: 79 20 66 6f 72 20 70 61 67 65 20 6e 75 6d 62 65  y for page numbe
8150: 72 20 27 6b 65 79 27 0a 2a 2a 20 73 6f 20 74 68  r 'key'.** so th
8160: 61 74 20 69 74 20 6d 61 70 73 20 74 6f 20 74 79  at it maps to ty
8170: 70 65 20 27 65 54 79 70 65 27 20 61 6e 64 20 70  pe 'eType' and p
8180: 61 72 65 6e 74 20 70 61 67 65 20 6e 75 6d 62 65  arent page numbe
8190: 72 20 27 70 67 6e 6f 27 2e 0a 2a 2a 0a 2a 2a 20  r 'pgno'..**.** 
81a0: 49 66 20 2a 70 52 43 20 69 73 20 69 6e 69 74 69  If *pRC is initi
81b0: 61 6c 6c 79 20 6e 6f 6e 2d 7a 65 72 6f 20 28 6e  ally non-zero (n
81c0: 6f 6e 2d 53 51 4c 49 54 45 5f 4f 4b 29 20 74 68  on-SQLITE_OK) th
81d0: 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
81e0: 69 73 0a 2a 2a 20 61 20 6e 6f 2d 6f 70 2e 20 20  is.** a no-op.  
81f0: 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
8200: 72 73 2c 20 74 68 65 20 61 70 70 72 6f 70 72 69  rs, the appropri
8210: 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  ate error code i
8220: 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20 69 6e 74  s written.** int
8230: 6f 20 2a 70 52 43 2e 0a 2a 2f 0a 73 74 61 74 69  o *pRC..*/.stati
8240: 63 20 76 6f 69 64 20 70 74 72 6d 61 70 50 75 74  c void ptrmapPut
8250: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
8260: 50 67 6e 6f 20 6b 65 79 2c 20 75 38 20 65 54 79  Pgno key, u8 eTy
8270: 70 65 2c 20 50 67 6e 6f 20 70 61 72 65 6e 74 2c  pe, Pgno parent,
8280: 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20 44 62   int *pRC){.  Db
8290: 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 20 20  Page *pDbPage;  
82a0: 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d  /* The pointer m
82b0: 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20  ap page */.  u8 
82c0: 2a 70 50 74 72 6d 61 70 3b 20 20 20 20 20 20 2f  *pPtrmap;      /
82d0: 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  * The pointer ma
82e0: 70 20 64 61 74 61 20 2a 2f 0a 20 20 50 67 6e 6f  p data */.  Pgno
82f0: 20 69 50 74 72 6d 61 70 3b 20 20 20 20 20 2f 2a   iPtrmap;     /*
8300: 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   The pointer map
8310: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a   page number */.
8320: 20 20 69 6e 74 20 6f 66 66 73 65 74 3b 20 20 20    int offset;   
8330: 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e      /* Offset in
8340: 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67   pointer map pag
8350: 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  e */.  int rc;  
8360: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
8370: 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20 73 75 62  rn code from sub
8380: 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 0a 20 20  functions */..  
8390: 69 66 28 20 2a 70 52 43 20 29 20 72 65 74 75 72  if( *pRC ) retur
83a0: 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  n;..  assert( sq
83b0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
83c0: 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
83d0: 20 20 2f 2a 20 54 68 65 20 6d 61 73 74 65 72 2d    /* The master-
83e0: 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 6e 75 6d  journal page num
83f0: 62 65 72 20 6d 75 73 74 20 6e 65 76 65 72 20 62  ber must never b
8400: 65 20 75 73 65 64 20 61 73 20 61 20 70 6f 69 6e  e used as a poin
8410: 74 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a  ter map page */.
8420: 20 20 61 73 73 65 72 74 28 20 30 3d 3d 50 54 52    assert( 0==PTR
8430: 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20  MAP_ISPAGE(pBt, 
8440: 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
8450: 45 28 70 42 74 29 29 20 29 3b 0a 0a 20 20 61 73  E(pBt)) );..  as
8460: 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56  sert( pBt->autoV
8470: 61 63 75 75 6d 20 29 3b 0a 20 20 69 66 28 20 6b  acuum );.  if( k
8480: 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20 2a 70 52  ey==0 ){.    *pR
8490: 43 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  C = SQLITE_CORRU
84a0: 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74  PT_BKPT;.    ret
84b0: 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 50 74 72 6d  urn;.  }.  iPtrm
84c0: 61 70 20 3d 20 50 54 52 4d 41 50 5f 50 41 47 45  ap = PTRMAP_PAGE
84d0: 4e 4f 28 70 42 74 2c 20 6b 65 79 29 3b 0a 20 20  NO(pBt, key);.  
84e0: 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
84f0: 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72  rGet(pBt->pPager
8500: 2c 20 69 50 74 72 6d 61 70 2c 20 26 70 44 62 50  , iPtrmap, &pDbP
8510: 61 67 65 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  age, 0);.  if( r
8520: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
8530: 20 20 20 20 2a 70 52 43 20 3d 20 72 63 3b 0a 20      *pRC = rc;. 
8540: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
8550: 20 69 66 28 20 28 28 63 68 61 72 2a 29 73 71 6c   if( ((char*)sql
8560: 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72  ite3PagerGetExtr
8570: 61 28 70 44 62 50 61 67 65 29 29 5b 30 5d 21 3d  a(pDbPage))[0]!=
8580: 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  0 ){.    /* The 
8590: 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68  first byte of th
85a0: 65 20 65 78 74 72 61 20 64 61 74 61 20 69 73 20  e extra data is 
85b0: 74 68 65 20 4d 65 6d 50 61 67 65 2e 69 73 49 6e  the MemPage.isIn
85c0: 69 74 20 62 79 74 65 2e 0a 20 20 20 20 2a 2a 20  it byte..    ** 
85d0: 49 66 20 74 68 61 74 20 62 79 74 65 20 69 73 20  If that byte is 
85e0: 73 65 74 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  set, it means th
85f0: 69 73 20 70 61 67 65 20 69 73 20 61 6c 73 6f 20  is page is also 
8600: 62 65 69 6e 67 20 75 73 65 64 0a 20 20 20 20 2a  being used.    *
8610: 2a 20 61 73 20 61 20 62 74 72 65 65 20 70 61 67  * as a btree pag
8620: 65 2e 20 2a 2f 0a 20 20 20 20 2a 70 52 43 20 3d  e. */.    *pRC =
8630: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
8640: 42 4b 50 54 3b 0a 20 20 20 20 67 6f 74 6f 20 70  BKPT;.    goto p
8650: 74 72 6d 61 70 5f 65 78 69 74 3b 0a 20 20 7d 0a  trmap_exit;.  }.
8660: 20 20 6f 66 66 73 65 74 20 3d 20 50 54 52 4d 41    offset = PTRMA
8670: 50 5f 50 54 52 4f 46 46 53 45 54 28 69 50 74 72  P_PTROFFSET(iPtr
8680: 6d 61 70 2c 20 6b 65 79 29 3b 0a 20 20 69 66 28  map, key);.  if(
8690: 20 6f 66 66 73 65 74 3c 30 20 29 7b 0a 20 20 20   offset<0 ){.   
86a0: 20 2a 70 52 43 20 3d 20 53 51 4c 49 54 45 5f 43   *pRC = SQLITE_C
86b0: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
86c0: 20 67 6f 74 6f 20 70 74 72 6d 61 70 5f 65 78 69   goto ptrmap_exi
86d0: 74 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  t;.  }.  assert(
86e0: 20 6f 66 66 73 65 74 20 3c 3d 20 28 69 6e 74 29   offset <= (int)
86f0: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d  pBt->usableSize-
8700: 35 20 29 3b 0a 20 20 70 50 74 72 6d 61 70 20 3d  5 );.  pPtrmap =
8710: 20 28 75 38 20 2a 29 73 71 6c 69 74 65 33 50 61   (u8 *)sqlite3Pa
8720: 67 65 72 47 65 74 44 61 74 61 28 70 44 62 50 61  gerGetData(pDbPa
8730: 67 65 29 3b 0a 0a 20 20 69 66 28 20 65 54 79 70  ge);..  if( eTyp
8740: 65 21 3d 70 50 74 72 6d 61 70 5b 6f 66 66 73 65  e!=pPtrmap[offse
8750: 74 5d 20 7c 7c 20 67 65 74 34 62 79 74 65 28 26  t] || get4byte(&
8760: 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31  pPtrmap[offset+1
8770: 5d 29 21 3d 70 61 72 65 6e 74 20 29 7b 0a 20 20  ])!=parent ){.  
8780: 20 20 54 52 41 43 45 28 28 22 50 54 52 4d 41 50    TRACE(("PTRMAP
8790: 5f 55 50 44 41 54 45 3a 20 25 64 2d 3e 28 25 64  _UPDATE: %d->(%d
87a0: 2c 25 64 29 5c 6e 22 2c 20 6b 65 79 2c 20 65 54  ,%d)\n", key, eT
87b0: 79 70 65 2c 20 70 61 72 65 6e 74 29 29 3b 0a 20  ype, parent));. 
87c0: 20 20 20 2a 70 52 43 3d 20 72 63 20 3d 20 73 71     *pRC= rc = sq
87d0: 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
87e0: 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66  pDbPage);.    if
87f0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
8800: 29 7b 0a 20 20 20 20 20 20 70 50 74 72 6d 61 70  ){.      pPtrmap
8810: 5b 6f 66 66 73 65 74 5d 20 3d 20 65 54 79 70 65  [offset] = eType
8820: 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65  ;.      put4byte
8830: 28 26 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74  (&pPtrmap[offset
8840: 2b 31 5d 2c 20 70 61 72 65 6e 74 29 3b 0a 20 20  +1], parent);.  
8850: 20 20 7d 0a 20 20 7d 0a 0a 70 74 72 6d 61 70 5f    }.  }..ptrmap_
8860: 65 78 69 74 3a 0a 20 20 73 71 6c 69 74 65 33 50  exit:.  sqlite3P
8870: 61 67 65 72 55 6e 72 65 66 28 70 44 62 50 61 67  agerUnref(pDbPag
8880: 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  e);.}../*.** Rea
8890: 64 20 61 6e 20 65 6e 74 72 79 20 66 72 6f 6d 20  d an entry from 
88a0: 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e  the pointer map.
88b0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
88c0: 69 6e 65 20 72 65 74 72 69 65 76 65 73 20 74 68  ine retrieves th
88d0: 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e  e pointer map en
88e0: 74 72 79 20 66 6f 72 20 70 61 67 65 20 27 6b 65  try for page 'ke
88f0: 79 27 2c 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74  y', writing.** t
8900: 68 65 20 74 79 70 65 20 61 6e 64 20 70 61 72 65  he type and pare
8910: 6e 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 74  nt page number t
8920: 6f 20 2a 70 45 54 79 70 65 20 61 6e 64 20 2a 70  o *pEType and *p
8930: 50 67 6e 6f 20 72 65 73 70 65 63 74 69 76 65 6c  Pgno respectivel
8940: 79 2e 0a 2a 2a 20 41 6e 20 65 72 72 6f 72 20 63  y..** An error c
8950: 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20  ode is returned 
8960: 69 66 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65  if something goe
8970: 73 20 77 72 6f 6e 67 2c 20 6f 74 68 65 72 77 69  s wrong, otherwi
8980: 73 65 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f  se SQLITE_OK..*/
8990: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 74 72 6d  .static int ptrm
89a0: 61 70 47 65 74 28 42 74 53 68 61 72 65 64 20 2a  apGet(BtShared *
89b0: 70 42 74 2c 20 50 67 6e 6f 20 6b 65 79 2c 20 75  pBt, Pgno key, u
89c0: 38 20 2a 70 45 54 79 70 65 2c 20 50 67 6e 6f 20  8 *pEType, Pgno 
89d0: 2a 70 50 67 6e 6f 29 7b 0a 20 20 44 62 50 61 67  *pPgno){.  DbPag
89e0: 65 20 2a 70 44 62 50 61 67 65 3b 20 20 20 2f 2a  e *pDbPage;   /*
89f0: 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   The pointer map
8a00: 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 69   page */.  int i
8a10: 50 74 72 6d 61 70 3b 20 20 20 20 20 20 20 2f 2a  Ptrmap;       /*
8a20: 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67   Pointer map pag
8a30: 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 75 38 20  e index */.  u8 
8a40: 2a 70 50 74 72 6d 61 70 3b 20 20 20 20 20 20 20  *pPtrmap;       
8a50: 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 70  /* Pointer map p
8a60: 61 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e  age data */.  in
8a70: 74 20 6f 66 66 73 65 74 3b 20 20 20 20 20 20 20  t offset;       
8a80: 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 65 6e   /* Offset of en
8a90: 74 72 79 20 69 6e 20 70 6f 69 6e 74 65 72 20 6d  try in pointer m
8aa0: 61 70 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a  ap */.  int rc;.
8ab0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
8ac0: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
8ad0: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20  t->mutex) );..  
8ae0: 69 50 74 72 6d 61 70 20 3d 20 50 54 52 4d 41 50  iPtrmap = PTRMAP
8af0: 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 6b 65 79  _PAGENO(pBt, key
8b00: 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
8b10: 33 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e 70  3PagerGet(pBt->p
8b20: 50 61 67 65 72 2c 20 69 50 74 72 6d 61 70 2c 20  Pager, iPtrmap, 
8b30: 26 70 44 62 50 61 67 65 2c 20 30 29 3b 0a 20 20  &pDbPage, 0);.  
8b40: 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20  if( rc!=0 ){.   
8b50: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
8b60: 20 20 70 50 74 72 6d 61 70 20 3d 20 28 75 38 20    pPtrmap = (u8 
8b70: 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  *)sqlite3PagerGe
8b80: 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a  tData(pDbPage);.
8b90: 0a 20 20 6f 66 66 73 65 74 20 3d 20 50 54 52 4d  .  offset = PTRM
8ba0: 41 50 5f 50 54 52 4f 46 46 53 45 54 28 69 50 74  AP_PTROFFSET(iPt
8bb0: 72 6d 61 70 2c 20 6b 65 79 29 3b 0a 20 20 69 66  rmap, key);.  if
8bc0: 28 20 6f 66 66 73 65 74 3c 30 20 29 7b 0a 20 20  ( offset<0 ){.  
8bd0: 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
8be0: 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20 20  ref(pDbPage);.  
8bf0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
8c00: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
8c10: 7d 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73  }.  assert( offs
8c20: 65 74 20 3c 3d 20 28 69 6e 74 29 70 42 74 2d 3e  et <= (int)pBt->
8c30: 75 73 61 62 6c 65 53 69 7a 65 2d 35 20 29 3b 0a  usableSize-5 );.
8c40: 20 20 61 73 73 65 72 74 28 20 70 45 54 79 70 65    assert( pEType
8c50: 21 3d 30 20 29 3b 0a 20 20 2a 70 45 54 79 70 65  !=0 );.  *pEType
8c60: 20 3d 20 70 50 74 72 6d 61 70 5b 6f 66 66 73 65   = pPtrmap[offse
8c70: 74 5d 3b 0a 20 20 69 66 28 20 70 50 67 6e 6f 20  t];.  if( pPgno 
8c80: 29 20 2a 70 50 67 6e 6f 20 3d 20 67 65 74 34 62  ) *pPgno = get4b
8c90: 79 74 65 28 26 70 50 74 72 6d 61 70 5b 6f 66 66  yte(&pPtrmap[off
8ca0: 73 65 74 2b 31 5d 29 3b 0a 0a 20 20 73 71 6c 69  set+1]);..  sqli
8cb0: 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 44  te3PagerUnref(pD
8cc0: 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 2a 70  bPage);.  if( *p
8cd0: 45 54 79 70 65 3c 31 20 7c 7c 20 2a 70 45 54 79  EType<1 || *pETy
8ce0: 70 65 3e 35 20 29 20 72 65 74 75 72 6e 20 53 51  pe>5 ) return SQ
8cf0: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 47 4e  LITE_CORRUPT_PGN
8d00: 4f 28 69 50 74 72 6d 61 70 29 3b 0a 20 20 72 65  O(iPtrmap);.  re
8d10: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
8d20: 7d 0a 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20 64  }..#else /* if d
8d30: 65 66 69 6e 65 64 20 53 51 4c 49 54 45 5f 4f 4d  efined SQLITE_OM
8d40: 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 2a 2f  IT_AUTOVACUUM */
8d50: 0a 20 20 23 64 65 66 69 6e 65 20 70 74 72 6d 61  .  #define ptrma
8d60: 70 50 75 74 28 77 2c 78 2c 79 2c 7a 2c 72 63 29  pPut(w,x,y,z,rc)
8d70: 0a 20 20 23 64 65 66 69 6e 65 20 70 74 72 6d 61  .  #define ptrma
8d80: 70 47 65 74 28 77 2c 78 2c 79 2c 7a 29 20 53 51  pGet(w,x,y,z) SQ
8d90: 4c 49 54 45 5f 4f 4b 0a 20 20 23 64 65 66 69 6e  LITE_OK.  #defin
8da0: 65 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50  e ptrmapPutOvflP
8db0: 74 72 28 78 2c 20 79 2c 20 72 63 29 0a 23 65 6e  tr(x, y, rc).#en
8dc0: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e  dif../*.** Given
8dd0: 20 61 20 62 74 72 65 65 20 70 61 67 65 20 61 6e   a btree page an
8de0: 64 20 61 20 63 65 6c 6c 20 69 6e 64 65 78 20 28  d a cell index (
8df0: 30 20 6d 65 61 6e 73 20 74 68 65 20 66 69 72 73  0 means the firs
8e00: 74 20 63 65 6c 6c 20 6f 6e 0a 2a 2a 20 74 68 65  t cell on.** the
8e10: 20 70 61 67 65 2c 20 31 20 6d 65 61 6e 73 20 74   page, 1 means t
8e20: 68 65 20 73 65 63 6f 6e 64 20 63 65 6c 6c 2c 20  he second cell, 
8e30: 61 6e 64 20 73 6f 20 66 6f 72 74 68 29 20 72 65  and so forth) re
8e40: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 0a 2a  turn a pointer.*
8e50: 2a 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f  * to the cell co
8e60: 6e 74 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 66 69 6e  ntent..**.** fin
8e70: 64 43 65 6c 6c 50 61 73 74 50 74 72 28 29 20 64  dCellPastPtr() d
8e80: 6f 65 73 20 74 68 65 20 73 61 6d 65 20 65 78 63  oes the same exc
8e90: 65 70 74 20 69 74 20 73 6b 69 70 73 20 70 61 73  ept it skips pas
8ea0: 74 20 74 68 65 20 69 6e 69 74 69 61 6c 0a 2a 2a  t the initial.**
8eb0: 20 34 2d 62 79 74 65 20 63 68 69 6c 64 20 70 6f   4-byte child po
8ec0: 69 6e 74 65 72 20 66 6f 75 6e 64 20 6f 6e 20 69  inter found on i
8ed0: 6e 74 65 72 69 6f 72 20 70 61 67 65 73 2c 20 69  nterior pages, i
8ee0: 66 20 74 68 65 72 65 20 69 73 20 6f 6e 65 2e 0a  f there is one..
8ef0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
8f00: 6e 65 20 77 6f 72 6b 73 20 6f 6e 6c 79 20 66 6f  ne works only fo
8f10: 72 20 70 61 67 65 73 20 74 68 61 74 20 64 6f 20  r pages that do 
8f20: 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 6f 76 65 72  not contain over
8f30: 66 6c 6f 77 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 23  flow cells..*/.#
8f40: 64 65 66 69 6e 65 20 66 69 6e 64 43 65 6c 6c 28  define findCell(
8f50: 50 2c 49 29 20 5c 0a 20 20 28 28 50 29 2d 3e 61  P,I) \.  ((P)->a
8f60: 44 61 74 61 20 2b 20 28 28 50 29 2d 3e 6d 61 73  Data + ((P)->mas
8f70: 6b 50 61 67 65 20 26 20 67 65 74 32 62 79 74 65  kPage & get2byte
8f80: 41 6c 69 67 6e 65 64 28 26 28 50 29 2d 3e 61 43  Aligned(&(P)->aC
8f90: 65 6c 6c 49 64 78 5b 32 2a 28 49 29 5d 29 29 29  ellIdx[2*(I)])))
8fa0: 0a 23 64 65 66 69 6e 65 20 66 69 6e 64 43 65 6c  .#define findCel
8fb0: 6c 50 61 73 74 50 74 72 28 50 2c 49 29 20 5c 0a  lPastPtr(P,I) \.
8fc0: 20 20 28 28 50 29 2d 3e 61 44 61 74 61 4f 66 73    ((P)->aDataOfs
8fd0: 74 20 2b 20 28 28 50 29 2d 3e 6d 61 73 6b 50 61  t + ((P)->maskPa
8fe0: 67 65 20 26 20 67 65 74 32 62 79 74 65 41 6c 69  ge & get2byteAli
8ff0: 67 6e 65 64 28 26 28 50 29 2d 3e 61 43 65 6c 6c  gned(&(P)->aCell
9000: 49 64 78 5b 32 2a 28 49 29 5d 29 29 29 0a 0a 0a  Idx[2*(I)])))...
9010: 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 63 6f  /*.** This is co
9020: 6d 6d 6f 6e 20 74 61 69 6c 20 70 72 6f 63 65 73  mmon tail proces
9030: 73 69 6e 67 20 66 6f 72 20 62 74 72 65 65 50 61  sing for btreePa
9040: 72 73 65 43 65 6c 6c 50 74 72 28 29 20 61 6e 64  rseCellPtr() and
9050: 0a 2a 2a 20 62 74 72 65 65 50 61 72 73 65 43 65  .** btreeParseCe
9060: 6c 6c 50 74 72 49 6e 64 65 78 28 29 20 66 6f 72  llPtrIndex() for
9070: 20 74 68 65 20 63 61 73 65 20 77 68 65 6e 20 74   the case when t
9080: 68 65 20 63 65 6c 6c 20 64 6f 65 73 20 6e 6f 74  he cell does not
9090: 20 66 69 74 20 65 6e 74 69 72 65 6c 79 0a 2a 2a   fit entirely.**
90a0: 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20 42 2d 74   on a single B-t
90b0: 72 65 65 20 70 61 67 65 2e 20 20 4d 61 6b 65 20  ree page.  Make 
90c0: 6e 65 63 65 73 73 61 72 79 20 61 64 6a 75 73 74  necessary adjust
90d0: 6d 65 6e 74 73 20 74 6f 20 74 68 65 20 43 65 6c  ments to the Cel
90e0: 6c 49 6e 66 6f 0a 2a 2a 20 73 74 72 75 63 74 75  lInfo.** structu
90f0: 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51  re..*/.static SQ
9100: 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76 6f  LITE_NOINLINE vo
9110: 69 64 20 62 74 72 65 65 50 61 72 73 65 43 65 6c  id btreeParseCel
9120: 6c 41 64 6a 75 73 74 53 69 7a 65 46 6f 72 4f 76  lAdjustSizeForOv
9130: 65 72 66 6c 6f 77 28 0a 20 20 4d 65 6d 50 61 67  erflow(.  MemPag
9140: 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20  e *pPage,       
9150: 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69    /* Page contai
9160: 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f  ning the cell */
9170: 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20  .  u8 *pCell,   
9180: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
9190: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63 65 6c  inter to the cel
91a0: 6c 20 74 65 78 74 2e 20 2a 2f 0a 20 20 43 65 6c  l text. */.  Cel
91b0: 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20  lInfo *pInfo    
91c0: 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20       /* Fill in 
91d0: 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20 2a  this structure *
91e0: 2f 0a 29 7b 0a 20 20 2f 2a 20 49 66 20 74 68 65  /.){.  /* If the
91f0: 20 70 61 79 6c 6f 61 64 20 77 69 6c 6c 20 6e 6f   payload will no
9200: 74 20 66 69 74 20 63 6f 6d 70 6c 65 74 65 6c 79  t fit completely
9210: 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70 61   on the local pa
9220: 67 65 2c 20 77 65 20 68 61 76 65 0a 20 20 2a 2a  ge, we have.  **
9230: 20 74 6f 20 64 65 63 69 64 65 20 68 6f 77 20 6d   to decide how m
9240: 75 63 68 20 74 6f 20 73 74 6f 72 65 20 6c 6f 63  uch to store loc
9250: 61 6c 6c 79 20 61 6e 64 20 68 6f 77 20 6d 75 63  ally and how muc
9260: 68 20 74 6f 20 73 70 69 6c 6c 20 6f 6e 74 6f 0a  h to spill onto.
9270: 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70 61    ** overflow pa
9280: 67 65 73 2e 20 20 54 68 65 20 73 74 72 61 74 65  ges.  The strate
9290: 67 79 20 69 73 20 74 6f 20 6d 69 6e 69 6d 69 7a  gy is to minimiz
92a0: 65 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20  e the amount of 
92b0: 75 6e 75 73 65 64 0a 20 20 2a 2a 20 73 70 61 63  unused.  ** spac
92c0: 65 20 6f 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  e on overflow pa
92d0: 67 65 73 20 77 68 69 6c 65 20 6b 65 65 70 69 6e  ges while keepin
92e0: 67 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20  g the amount of 
92f0: 6c 6f 63 61 6c 20 73 74 6f 72 61 67 65 0a 20 20  local storage.  
9300: 2a 2a 20 69 6e 20 62 65 74 77 65 65 6e 20 6d 69  ** in between mi
9310: 6e 4c 6f 63 61 6c 20 61 6e 64 20 6d 61 78 4c 6f  nLocal and maxLo
9320: 63 61 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57  cal..  **.  ** W
9330: 61 72 6e 69 6e 67 3a 20 20 63 68 61 6e 67 69 6e  arning:  changin
9340: 67 20 74 68 65 20 77 61 79 20 6f 76 65 72 66 6c  g the way overfl
9350: 6f 77 20 70 61 79 6c 6f 61 64 20 69 73 20 64 69  ow payload is di
9360: 73 74 72 69 62 75 74 65 64 20 69 6e 20 61 6e 79  stributed in any
9370: 0a 20 20 2a 2a 20 77 61 79 20 77 69 6c 6c 20 72  .  ** way will r
9380: 65 73 75 6c 74 20 69 6e 20 61 6e 20 69 6e 63 6f  esult in an inco
9390: 6d 70 61 74 69 62 6c 65 20 66 69 6c 65 20 66 6f  mpatible file fo
93a0: 72 6d 61 74 2e 0a 20 20 2a 2f 0a 20 20 69 6e 74  rmat..  */.  int
93b0: 20 6d 69 6e 4c 6f 63 61 6c 3b 20 20 2f 2a 20 4d   minLocal;  /* M
93c0: 69 6e 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66  inimum amount of
93d0: 20 70 61 79 6c 6f 61 64 20 68 65 6c 64 20 6c 6f   payload held lo
93e0: 63 61 6c 6c 79 20 2a 2f 0a 20 20 69 6e 74 20 6d  cally */.  int m
93f0: 61 78 4c 6f 63 61 6c 3b 20 20 2f 2a 20 4d 61 78  axLocal;  /* Max
9400: 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70  imum amount of p
9410: 61 79 6c 6f 61 64 20 68 65 6c 64 20 6c 6f 63 61  ayload held loca
9420: 6c 6c 79 20 2a 2f 0a 20 20 69 6e 74 20 73 75 72  lly */.  int sur
9430: 70 6c 75 73 3b 20 20 20 2f 2a 20 4f 76 65 72 66  plus;   /* Overf
9440: 6c 6f 77 20 70 61 79 6c 6f 61 64 20 61 76 61 69  low payload avai
9450: 6c 61 62 6c 65 20 66 6f 72 20 6c 6f 63 61 6c 20  lable for local 
9460: 73 74 6f 72 61 67 65 20 2a 2f 0a 0a 20 20 6d 69  storage */..  mi
9470: 6e 4c 6f 63 61 6c 20 3d 20 70 50 61 67 65 2d 3e  nLocal = pPage->
9480: 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 6d 61 78 4c  minLocal;.  maxL
9490: 6f 63 61 6c 20 3d 20 70 50 61 67 65 2d 3e 6d 61  ocal = pPage->ma
94a0: 78 4c 6f 63 61 6c 3b 0a 20 20 73 75 72 70 6c 75  xLocal;.  surplu
94b0: 73 20 3d 20 6d 69 6e 4c 6f 63 61 6c 20 2b 20 28  s = minLocal + (
94c0: 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20  pInfo->nPayload 
94d0: 2d 20 6d 69 6e 4c 6f 63 61 6c 29 25 28 70 50 61  - minLocal)%(pPa
94e0: 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
94f0: 69 7a 65 2d 34 29 3b 0a 20 20 74 65 73 74 63 61  ize-4);.  testca
9500: 73 65 28 20 73 75 72 70 6c 75 73 3d 3d 6d 61 78  se( surplus==max
9510: 4c 6f 63 61 6c 20 29 3b 0a 20 20 74 65 73 74 63  Local );.  testc
9520: 61 73 65 28 20 73 75 72 70 6c 75 73 3d 3d 6d 61  ase( surplus==ma
9530: 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 69 66  xLocal+1 );.  if
9540: 28 20 73 75 72 70 6c 75 73 20 3c 3d 20 6d 61 78  ( surplus <= max
9550: 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 70 49 6e  Local ){.    pIn
9560: 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75 31  fo->nLocal = (u1
9570: 36 29 73 75 72 70 6c 75 73 3b 0a 20 20 7d 65 6c  6)surplus;.  }el
9580: 73 65 7b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e  se{.    pInfo->n
9590: 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 6d 69 6e  Local = (u16)min
95a0: 4c 6f 63 61 6c 3b 0a 20 20 7d 0a 20 20 70 49 6e  Local;.  }.  pIn
95b0: 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 28 75 31 36  fo->nSize = (u16
95c0: 29 28 26 70 49 6e 66 6f 2d 3e 70 50 61 79 6c 6f  )(&pInfo->pPaylo
95d0: 61 64 5b 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c  ad[pInfo->nLocal
95e0: 5d 20 2d 20 70 43 65 6c 6c 29 20 2b 20 34 3b 0a  ] - pCell) + 4;.
95f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  }../*.** The fol
9600: 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 73 20  lowing routines 
9610: 61 72 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  are implementati
9620: 6f 6e 73 20 6f 66 20 74 68 65 20 4d 65 6d 50 61  ons of the MemPa
9630: 67 65 2e 78 50 61 72 73 65 43 65 6c 6c 28 29 0a  ge.xParseCell().
9640: 2a 2a 20 6d 65 74 68 6f 64 2e 0a 2a 2a 0a 2a 2a  ** method..**.**
9650: 20 50 61 72 73 65 20 61 20 63 65 6c 6c 20 63 6f   Parse a cell co
9660: 6e 74 65 6e 74 20 62 6c 6f 63 6b 20 61 6e 64 20  ntent block and 
9670: 66 69 6c 6c 20 69 6e 20 74 68 65 20 43 65 6c 6c  fill in the Cell
9680: 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e 0a  Info structure..
9690: 2a 2a 0a 2a 2a 20 62 74 72 65 65 50 61 72 73 65  **.** btreeParse
96a0: 43 65 6c 6c 50 74 72 28 29 20 20 20 20 20 20 20  CellPtr()       
96b0: 20 3d 3e 20 20 20 74 61 62 6c 65 20 62 74 72 65   =>   table btre
96c0: 65 20 6c 65 61 66 20 6e 6f 64 65 73 0a 2a 2a 20  e leaf nodes.** 
96d0: 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 4e 6f  btreeParseCellNo
96e0: 50 61 79 6c 6f 61 64 28 29 20 20 3d 3e 20 20 20  Payload()  =>   
96f0: 74 61 62 6c 65 20 62 74 72 65 65 20 69 6e 74 65  table btree inte
9700: 72 6e 61 6c 20 6e 6f 64 65 73 0a 2a 2a 20 62 74  rnal nodes.** bt
9710: 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 49  reeParseCellPtrI
9720: 6e 64 65 78 28 29 20 20 20 3d 3e 20 20 20 69 6e  ndex()   =>   in
9730: 64 65 78 20 62 74 72 65 65 20 6e 6f 64 65 73 0a  dex btree nodes.
9740: 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 69 73 20 61  **.** There is a
9750: 6c 73 6f 20 61 20 77 72 61 70 70 65 72 20 66 75  lso a wrapper fu
9760: 6e 63 74 69 6f 6e 20 62 74 72 65 65 50 61 72 73  nction btreePars
9770: 65 43 65 6c 6c 28 29 20 74 68 61 74 20 77 6f 72  eCell() that wor
9780: 6b 73 20 66 6f 72 0a 2a 2a 20 61 6c 6c 20 4d 65  ks for.** all Me
9790: 6d 50 61 67 65 20 74 79 70 65 73 20 61 6e 64 20  mPage types and 
97a0: 74 68 61 74 20 72 65 66 65 72 65 6e 63 65 73 20  that references 
97b0: 74 68 65 20 63 65 6c 6c 20 62 79 20 69 6e 64 65  the cell by inde
97c0: 78 20 72 61 74 68 65 72 20 74 68 61 6e 0a 2a 2a  x rather than.**
97d0: 20 62 79 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a   by pointer..*/.
97e0: 73 74 61 74 69 63 20 76 6f 69 64 20 62 74 72 65  static void btre
97f0: 65 50 61 72 73 65 43 65 6c 6c 50 74 72 4e 6f 50  eParseCellPtrNoP
9800: 61 79 6c 6f 61 64 28 0a 20 20 4d 65 6d 50 61 67  ayload(.  MemPag
9810: 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20  e *pPage,       
9820: 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69    /* Page contai
9830: 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f  ning the cell */
9840: 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20  .  u8 *pCell,   
9850: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
9860: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63 65 6c  inter to the cel
9870: 6c 20 74 65 78 74 2e 20 2a 2f 0a 20 20 43 65 6c  l text. */.  Cel
9880: 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20  lInfo *pInfo    
9890: 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20       /* Fill in 
98a0: 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20 2a  this structure *
98b0: 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73  /.){.  assert( s
98c0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
98d0: 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
98e0: 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
98f0: 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 30  ( pPage->leaf==0
9900: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
9910: 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a  age->childPtrSiz
9920: 65 3d 3d 34 20 29 3b 0a 23 69 66 6e 64 65 66 20  e==4 );.#ifndef 
9930: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 55  SQLITE_DEBUG.  U
9940: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
9950: 70 50 61 67 65 29 3b 0a 23 65 6e 64 69 66 0a 20  pPage);.#endif. 
9960: 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20   pInfo->nSize = 
9970: 34 20 2b 20 67 65 74 56 61 72 69 6e 74 28 26 70  4 + getVarint(&p
9980: 43 65 6c 6c 5b 34 5d 2c 20 28 75 36 34 2a 29 26  Cell[4], (u64*)&
9990: 70 49 6e 66 6f 2d 3e 6e 4b 65 79 29 3b 0a 20 20  pInfo->nKey);.  
99a0: 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20  pInfo->nPayload 
99b0: 3d 20 30 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e 4c  = 0;.  pInfo->nL
99c0: 6f 63 61 6c 20 3d 20 30 3b 0a 20 20 70 49 6e 66  ocal = 0;.  pInf
99d0: 6f 2d 3e 70 50 61 79 6c 6f 61 64 20 3d 20 30 3b  o->pPayload = 0;
99e0: 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 73 74 61  .  return;.}.sta
99f0: 74 69 63 20 76 6f 69 64 20 62 74 72 65 65 50 61  tic void btreePa
9a00: 72 73 65 43 65 6c 6c 50 74 72 28 0a 20 20 4d 65  rseCellPtr(.  Me
9a10: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20  mPage *pPage,   
9a20: 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f        /* Page co
9a30: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63 65 6c  ntaining the cel
9a40: 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c  l */.  u8 *pCell
9a50: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
9a60: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  * Pointer to the
9a70: 20 63 65 6c 6c 20 74 65 78 74 2e 20 2a 2f 0a 20   cell text. */. 
9a80: 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f   CellInfo *pInfo
9a90: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c           /* Fill
9aa0: 20 69 6e 20 74 68 69 73 20 73 74 72 75 63 74 75   in this structu
9ab0: 72 65 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a 70  re */.){.  u8 *p
9ac0: 49 74 65 72 3b 20 20 20 20 20 20 20 20 20 20 20  Iter;           
9ad0: 20 20 20 2f 2a 20 46 6f 72 20 73 63 61 6e 6e 69     /* For scanni
9ae0: 6e 67 20 74 68 72 6f 75 67 68 20 70 43 65 6c 6c  ng through pCell
9af0: 20 2a 2f 0a 20 20 75 33 32 20 6e 50 61 79 6c 6f   */.  u32 nPaylo
9b00: 61 64 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ad;           /*
9b10: 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
9b20: 20 6f 66 20 63 65 6c 6c 20 70 61 79 6c 6f 61 64   of cell payload
9b30: 20 2a 2f 0a 20 20 75 36 34 20 69 4b 65 79 3b 20   */.  u64 iKey; 
9b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9b50: 20 45 78 74 72 61 63 74 65 64 20 4b 65 79 20 76   Extracted Key v
9b60: 61 6c 75 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72  alue */..  asser
9b70: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
9b80: 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
9b90: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
9ba0: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6c 65 61  sert( pPage->lea
9bb0: 66 3d 3d 30 20 7c 7c 20 70 50 61 67 65 2d 3e 6c  f==0 || pPage->l
9bc0: 65 61 66 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65  eaf==1 );.  asse
9bd0: 72 74 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65  rt( pPage->intKe
9be0: 79 4c 65 61 66 20 29 3b 0a 20 20 61 73 73 65 72  yLeaf );.  asser
9bf0: 74 28 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50  t( pPage->childP
9c00: 74 72 53 69 7a 65 3d 3d 30 20 29 3b 0a 20 20 70  trSize==0 );.  p
9c10: 49 74 65 72 20 3d 20 70 43 65 6c 6c 3b 0a 0a 20  Iter = pCell;.. 
9c20: 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 62 6c 6f   /* The next blo
9c30: 63 6b 20 6f 66 20 63 6f 64 65 20 69 73 20 65 71  ck of code is eq
9c40: 75 69 76 61 6c 65 6e 74 20 74 6f 3a 0a 20 20 2a  uivalent to:.  *
9c50: 2a 0a 20 20 2a 2a 20 20 20 20 20 70 49 74 65 72  *.  **     pIter
9c60: 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28   += getVarint32(
9c70: 70 49 74 65 72 2c 20 6e 50 61 79 6c 6f 61 64 29  pIter, nPayload)
9c80: 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  ;.  **.  ** The 
9c90: 63 6f 64 65 20 69 73 20 69 6e 6c 69 6e 65 64 20  code is inlined 
9ca0: 74 6f 20 61 76 6f 69 64 20 61 20 66 75 6e 63 74  to avoid a funct
9cb0: 69 6f 6e 20 63 61 6c 6c 2e 0a 20 20 2a 2f 0a 20  ion call..  */. 
9cc0: 20 6e 50 61 79 6c 6f 61 64 20 3d 20 2a 70 49 74   nPayload = *pIt
9cd0: 65 72 3b 0a 20 20 69 66 28 20 6e 50 61 79 6c 6f  er;.  if( nPaylo
9ce0: 61 64 3e 3d 30 78 38 30 20 29 7b 0a 20 20 20 20  ad>=0x80 ){.    
9cf0: 75 38 20 2a 70 45 6e 64 20 3d 20 26 70 49 74 65  u8 *pEnd = &pIte
9d00: 72 5b 38 5d 3b 0a 20 20 20 20 6e 50 61 79 6c 6f  r[8];.    nPaylo
9d10: 61 64 20 26 3d 20 30 78 37 66 3b 0a 20 20 20 20  ad &= 0x7f;.    
9d20: 64 6f 7b 0a 20 20 20 20 20 20 6e 50 61 79 6c 6f  do{.      nPaylo
9d30: 61 64 20 3d 20 28 6e 50 61 79 6c 6f 61 64 3c 3c  ad = (nPayload<<
9d40: 37 29 20 7c 20 28 2a 2b 2b 70 49 74 65 72 20 26  7) | (*++pIter &
9d50: 20 30 78 37 66 29 3b 0a 20 20 20 20 7d 77 68 69   0x7f);.    }whi
9d60: 6c 65 28 20 28 2a 70 49 74 65 72 29 3e 3d 30 78  le( (*pIter)>=0x
9d70: 38 30 20 26 26 20 70 49 74 65 72 3c 70 45 6e 64  80 && pIter<pEnd
9d80: 20 29 3b 0a 20 20 7d 0a 20 20 70 49 74 65 72 2b   );.  }.  pIter+
9d90: 2b 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6e 65 78  +;..  /* The nex
9da0: 74 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20  t block of code 
9db0: 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f  is equivalent to
9dc0: 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
9dd0: 70 49 74 65 72 20 2b 3d 20 67 65 74 56 61 72 69  pIter += getVari
9de0: 6e 74 28 70 49 74 65 72 2c 20 28 75 36 34 2a 29  nt(pIter, (u64*)
9df0: 26 70 49 6e 66 6f 2d 3e 6e 4b 65 79 29 3b 0a 20  &pInfo->nKey);. 
9e00: 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 63 6f 64   **.  ** The cod
9e10: 65 20 69 73 20 69 6e 6c 69 6e 65 64 20 74 6f 20  e is inlined to 
9e20: 61 76 6f 69 64 20 61 20 66 75 6e 63 74 69 6f 6e  avoid a function
9e30: 20 63 61 6c 6c 2e 0a 20 20 2a 2f 0a 20 20 69 4b   call..  */.  iK
9e40: 65 79 20 3d 20 2a 70 49 74 65 72 3b 0a 20 20 69  ey = *pIter;.  i
9e50: 66 28 20 69 4b 65 79 3e 3d 30 78 38 30 20 29 7b  f( iKey>=0x80 ){
9e60: 0a 20 20 20 20 75 38 20 2a 70 45 6e 64 20 3d 20  .    u8 *pEnd = 
9e70: 26 70 49 74 65 72 5b 37 5d 3b 0a 20 20 20 20 69  &pIter[7];.    i
9e80: 4b 65 79 20 26 3d 20 30 78 37 66 3b 0a 20 20 20  Key &= 0x7f;.   
9e90: 20 77 68 69 6c 65 28 31 29 7b 0a 20 20 20 20 20   while(1){.     
9ea0: 20 69 4b 65 79 20 3d 20 28 69 4b 65 79 3c 3c 37   iKey = (iKey<<7
9eb0: 29 20 7c 20 28 2a 2b 2b 70 49 74 65 72 20 26 20  ) | (*++pIter & 
9ec0: 30 78 37 66 29 3b 0a 20 20 20 20 20 20 69 66 28  0x7f);.      if(
9ed0: 20 28 2a 70 49 74 65 72 29 3c 30 78 38 30 20 29   (*pIter)<0x80 )
9ee0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 69 66   break;.      if
9ef0: 28 20 70 49 74 65 72 3e 3d 70 45 6e 64 20 29 7b  ( pIter>=pEnd ){
9f00: 0a 20 20 20 20 20 20 20 20 69 4b 65 79 20 3d 20  .        iKey = 
9f10: 28 69 4b 65 79 3c 3c 38 29 20 7c 20 2a 2b 2b 70  (iKey<<8) | *++p
9f20: 49 74 65 72 3b 0a 20 20 20 20 20 20 20 20 62 72  Iter;.        br
9f30: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
9f40: 20 7d 0a 20 20 7d 0a 20 20 70 49 74 65 72 2b 2b   }.  }.  pIter++
9f50: 3b 0a 0a 20 20 70 49 6e 66 6f 2d 3e 6e 4b 65 79  ;..  pInfo->nKey
9f60: 20 3d 20 2a 28 69 36 34 2a 29 26 69 4b 65 79 3b   = *(i64*)&iKey;
9f70: 0a 20 20 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f  .  pInfo->nPaylo
9f80: 61 64 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20  ad = nPayload;. 
9f90: 20 70 49 6e 66 6f 2d 3e 70 50 61 79 6c 6f 61 64   pInfo->pPayload
9fa0: 20 3d 20 70 49 74 65 72 3b 0a 20 20 74 65 73 74   = pIter;.  test
9fb0: 63 61 73 65 28 20 6e 50 61 79 6c 6f 61 64 3d 3d  case( nPayload==
9fc0: 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20  pPage->maxLocal 
9fd0: 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e  );.  testcase( n
9fe0: 50 61 79 6c 6f 61 64 3d 3d 70 50 61 67 65 2d 3e  Payload==pPage->
9ff0: 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20  maxLocal+1 );.  
a000: 69 66 28 20 6e 50 61 79 6c 6f 61 64 3c 3d 70 50  if( nPayload<=pP
a010: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b  age->maxLocal ){
a020: 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20  .    /* This is 
a030: 74 68 65 20 28 65 61 73 79 29 20 63 6f 6d 6d 6f  the (easy) commo
a040: 6e 20 63 61 73 65 20 77 68 65 72 65 20 74 68 65  n case where the
a050: 20 65 6e 74 69 72 65 20 70 61 79 6c 6f 61 64 20   entire payload 
a060: 66 69 74 73 0a 20 20 20 20 2a 2a 20 6f 6e 20 74  fits.    ** on t
a070: 68 65 20 6c 6f 63 61 6c 20 70 61 67 65 2e 20 20  he local page.  
a080: 4e 6f 20 6f 76 65 72 66 6c 6f 77 20 69 73 20 72  No overflow is r
a090: 65 71 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a  equired..    */.
a0a0: 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65      pInfo->nSize
a0b0: 20 3d 20 6e 50 61 79 6c 6f 61 64 20 2b 20 28 75   = nPayload + (u
a0c0: 31 36 29 28 70 49 74 65 72 20 2d 20 70 43 65 6c  16)(pIter - pCel
a0d0: 6c 29 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 66  l);.    if( pInf
a0e0: 6f 2d 3e 6e 53 69 7a 65 3c 34 20 29 20 70 49 6e  o->nSize<4 ) pIn
a0f0: 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 34 3b 0a 20  fo->nSize = 4;. 
a100: 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c     pInfo->nLocal
a110: 20 3d 20 28 75 31 36 29 6e 50 61 79 6c 6f 61 64   = (u16)nPayload
a120: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 62  ;.  }else{.    b
a130: 74 72 65 65 50 61 72 73 65 43 65 6c 6c 41 64 6a  treeParseCellAdj
a140: 75 73 74 53 69 7a 65 46 6f 72 4f 76 65 72 66 6c  ustSizeForOverfl
a150: 6f 77 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c  ow(pPage, pCell,
a160: 20 70 49 6e 66 6f 29 3b 0a 20 20 7d 0a 7d 0a 73   pInfo);.  }.}.s
a170: 74 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65  tatic void btree
a180: 50 61 72 73 65 43 65 6c 6c 50 74 72 49 6e 64 65  ParseCellPtrInde
a190: 78 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  x(.  MemPage *pP
a1a0: 61 67 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  age,         /* 
a1b0: 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  Page containing 
a1c0: 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 38  the cell */.  u8
a1d0: 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20   *pCell,        
a1e0: 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
a1f0: 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 74 65 78   to the cell tex
a200: 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f  t. */.  CellInfo
a210: 20 2a 70 49 6e 66 6f 20 20 20 20 20 20 20 20 20   *pInfo         
a220: 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69 73 20  /* Fill in this 
a230: 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a  structure */.){.
a240: 20 20 75 38 20 2a 70 49 74 65 72 3b 20 20 20 20    u8 *pIter;    
a250: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72            /* For
a260: 20 73 63 61 6e 6e 69 6e 67 20 74 68 72 6f 75 67   scanning throug
a270: 68 20 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 33 32  h pCell */.  u32
a280: 20 6e 50 61 79 6c 6f 61 64 3b 20 20 20 20 20 20   nPayload;      
a290: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
a2a0: 66 20 62 79 74 65 73 20 6f 66 20 63 65 6c 6c 20  f bytes of cell 
a2b0: 70 61 79 6c 6f 61 64 20 2a 2f 0a 0a 20 20 61 73  payload */..  as
a2c0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
a2d0: 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
a2e0: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
a2f0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
a300: 6c 65 61 66 3d 3d 30 20 7c 7c 20 70 50 61 67 65  leaf==0 || pPage
a310: 2d 3e 6c 65 61 66 3d 3d 31 20 29 3b 0a 20 20 61  ->leaf==1 );.  a
a320: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 6e  ssert( pPage->in
a330: 74 4b 65 79 4c 65 61 66 3d 3d 30 20 29 3b 0a 20  tKeyLeaf==0 );. 
a340: 20 70 49 74 65 72 20 3d 20 70 43 65 6c 6c 20 2b   pIter = pCell +
a350: 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72   pPage->childPtr
a360: 53 69 7a 65 3b 0a 20 20 6e 50 61 79 6c 6f 61 64  Size;.  nPayload
a370: 20 3d 20 2a 70 49 74 65 72 3b 0a 20 20 69 66 28   = *pIter;.  if(
a380: 20 6e 50 61 79 6c 6f 61 64 3e 3d 30 78 38 30 20   nPayload>=0x80 
a390: 29 7b 0a 20 20 20 20 75 38 20 2a 70 45 6e 64 20  ){.    u8 *pEnd 
a3a0: 3d 20 26 70 49 74 65 72 5b 38 5d 3b 0a 20 20 20  = &pIter[8];.   
a3b0: 20 6e 50 61 79 6c 6f 61 64 20 26 3d 20 30 78 37   nPayload &= 0x7
a3c0: 66 3b 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20  f;.    do{.     
a3d0: 20 6e 50 61 79 6c 6f 61 64 20 3d 20 28 6e 50 61   nPayload = (nPa
a3e0: 79 6c 6f 61 64 3c 3c 37 29 20 7c 20 28 2a 2b 2b  yload<<7) | (*++
a3f0: 70 49 74 65 72 20 26 20 30 78 37 66 29 3b 0a 20  pIter & 0x7f);. 
a400: 20 20 20 7d 77 68 69 6c 65 28 20 2a 28 70 49 74     }while( *(pIt
a410: 65 72 29 3e 3d 30 78 38 30 20 26 26 20 70 49 74  er)>=0x80 && pIt
a420: 65 72 3c 70 45 6e 64 20 29 3b 0a 20 20 7d 0a 20  er<pEnd );.  }. 
a430: 20 70 49 74 65 72 2b 2b 3b 0a 20 20 70 49 6e 66   pIter++;.  pInf
a440: 6f 2d 3e 6e 4b 65 79 20 3d 20 6e 50 61 79 6c 6f  o->nKey = nPaylo
a450: 61 64 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e 50 61  ad;.  pInfo->nPa
a460: 79 6c 6f 61 64 20 3d 20 6e 50 61 79 6c 6f 61 64  yload = nPayload
a470: 3b 0a 20 20 70 49 6e 66 6f 2d 3e 70 50 61 79 6c  ;.  pInfo->pPayl
a480: 6f 61 64 20 3d 20 70 49 74 65 72 3b 0a 20 20 74  oad = pIter;.  t
a490: 65 73 74 63 61 73 65 28 20 6e 50 61 79 6c 6f 61  estcase( nPayloa
a4a0: 64 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  d==pPage->maxLoc
a4b0: 61 6c 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  al );.  testcase
a4c0: 28 20 6e 50 61 79 6c 6f 61 64 3d 3d 70 50 61 67  ( nPayload==pPag
a4d0: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b  e->maxLocal+1 );
a4e0: 0a 20 20 69 66 28 20 6e 50 61 79 6c 6f 61 64 3c  .  if( nPayload<
a4f0: 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c  =pPage->maxLocal
a500: 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20   ){.    /* This 
a510: 69 73 20 74 68 65 20 28 65 61 73 79 29 20 63 6f  is the (easy) co
a520: 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20  mmon case where 
a530: 74 68 65 20 65 6e 74 69 72 65 20 70 61 79 6c 6f  the entire paylo
a540: 61 64 20 66 69 74 73 0a 20 20 20 20 2a 2a 20 6f  ad fits.    ** o
a550: 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65  n the local page
a560: 2e 20 20 4e 6f 20 6f 76 65 72 66 6c 6f 77 20 69  .  No overflow i
a570: 73 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20  s required..    
a580: 2a 2f 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 53  */.    pInfo->nS
a590: 69 7a 65 20 3d 20 6e 50 61 79 6c 6f 61 64 20 2b  ize = nPayload +
a5a0: 20 28 75 31 36 29 28 70 49 74 65 72 20 2d 20 70   (u16)(pIter - p
a5b0: 43 65 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20 70  Cell);.    if( p
a5c0: 49 6e 66 6f 2d 3e 6e 53 69 7a 65 3c 34 20 29 20  Info->nSize<4 ) 
a5d0: 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 34  pInfo->nSize = 4
a5e0: 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f  ;.    pInfo->nLo
a5f0: 63 61 6c 20 3d 20 28 75 31 36 29 6e 50 61 79 6c  cal = (u16)nPayl
a600: 6f 61 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  oad;.  }else{.  
a610: 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c    btreeParseCell
a620: 41 64 6a 75 73 74 53 69 7a 65 46 6f 72 4f 76 65  AdjustSizeForOve
a630: 72 66 6c 6f 77 28 70 50 61 67 65 2c 20 70 43 65  rflow(pPage, pCe
a640: 6c 6c 2c 20 70 49 6e 66 6f 29 3b 0a 20 20 7d 0a  ll, pInfo);.  }.
a650: 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 74  }.static void bt
a660: 72 65 65 50 61 72 73 65 43 65 6c 6c 28 0a 20 20  reeParseCell(.  
a670: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
a680: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
a690: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63  containing the c
a6a0: 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65  ell */.  int iCe
a6b0: 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ll,             
a6c0: 20 2f 2a 20 54 68 65 20 63 65 6c 6c 20 69 6e 64   /* The cell ind
a6d0: 65 78 2e 20 20 46 69 72 73 74 20 63 65 6c 6c 20  ex.  First cell 
a6e0: 69 73 20 30 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e  is 0 */.  CellIn
a6f0: 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20 20 20  fo *pInfo       
a700: 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69    /* Fill in thi
a710: 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 29  s structure */.)
a720: 7b 0a 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73  {.  pPage->xPars
a730: 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 66 69 6e  eCell(pPage, fin
a740: 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65  dCell(pPage, iCe
a750: 6c 6c 29 2c 20 70 49 6e 66 6f 29 3b 0a 7d 0a 0a  ll), pInfo);.}..
a760: 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
a770: 69 6e 67 20 72 6f 75 74 69 6e 65 73 20 61 72 65  ing routines are
a780: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73   implementations
a790: 20 6f 66 20 74 68 65 20 4d 65 6d 50 61 67 65 2e   of the MemPage.
a7a0: 78 43 65 6c 6c 53 69 7a 65 0a 2a 2a 20 6d 65 74  xCellSize.** met
a7b0: 68 6f 64 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6d 70 75  hod..**.** Compu
a7c0: 74 65 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d  te the total num
a7d0: 62 65 72 20 6f 66 20 62 79 74 65 73 20 74 68 61  ber of bytes tha
a7e0: 74 20 61 20 43 65 6c 6c 20 6e 65 65 64 73 20 69  t a Cell needs i
a7f0: 6e 20 74 68 65 20 63 65 6c 6c 0a 2a 2a 20 64 61  n the cell.** da
a800: 74 61 20 61 72 65 61 20 6f 66 20 74 68 65 20 62  ta area of the b
a810: 74 72 65 65 2d 70 61 67 65 2e 20 20 54 68 65 20  tree-page.  The 
a820: 72 65 74 75 72 6e 20 6e 75 6d 62 65 72 20 69 6e  return number in
a830: 63 6c 75 64 65 73 20 74 68 65 20 63 65 6c 6c 0a  cludes the cell.
a840: 2a 2a 20 64 61 74 61 20 68 65 61 64 65 72 20 61  ** data header a
a850: 6e 64 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 79  nd the local pay
a860: 6c 6f 61 64 2c 20 62 75 74 20 6e 6f 74 20 61 6e  load, but not an
a870: 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  y overflow page 
a880: 6f 72 0a 2a 2a 20 74 68 65 20 73 70 61 63 65 20  or.** the space 
a890: 75 73 65 64 20 62 79 20 74 68 65 20 63 65 6c 6c  used by the cell
a8a0: 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20   pointer..**.** 
a8b0: 63 65 6c 6c 53 69 7a 65 50 74 72 4e 6f 50 61 79  cellSizePtrNoPay
a8c0: 6c 6f 61 64 28 29 20 20 20 20 3d 3e 20 20 20 74  load()    =>   t
a8d0: 61 62 6c 65 20 69 6e 74 65 72 6e 61 6c 20 6e 6f  able internal no
a8e0: 64 65 73 0a 2a 2a 20 63 65 6c 6c 53 69 7a 65 50  des.** cellSizeP
a8f0: 74 72 28 29 20 20 20 20 20 20 20 20 20 20 20 20  tr()            
a900: 20 3d 3e 20 20 20 61 6c 6c 20 69 6e 64 65 78 20   =>   all index 
a910: 6e 6f 64 65 73 20 26 20 74 61 62 6c 65 20 6c 65  nodes & table le
a920: 61 66 20 6e 6f 64 65 73 0a 2a 2f 0a 73 74 61 74  af nodes.*/.stat
a930: 69 63 20 75 31 36 20 63 65 6c 6c 53 69 7a 65 50  ic u16 cellSizeP
a940: 74 72 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  tr(MemPage *pPag
a950: 65 2c 20 75 38 20 2a 70 43 65 6c 6c 29 7b 0a 20  e, u8 *pCell){. 
a960: 20 75 38 20 2a 70 49 74 65 72 20 3d 20 70 43 65   u8 *pIter = pCe
a970: 6c 6c 20 2b 20 70 50 61 67 65 2d 3e 63 68 69 6c  ll + pPage->chil
a980: 64 50 74 72 53 69 7a 65 3b 20 2f 2a 20 46 6f 72  dPtrSize; /* For
a990: 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 62 79   looping over by
a9a0: 74 65 73 20 6f 66 20 70 43 65 6c 6c 20 2a 2f 0a  tes of pCell */.
a9b0: 20 20 75 38 20 2a 70 45 6e 64 3b 20 20 20 20 20    u8 *pEnd;     
a9c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a9d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 6e             /* En
a9e0: 64 20 6d 61 72 6b 20 66 6f 72 20 61 20 76 61 72  d mark for a var
a9f0: 69 6e 74 20 2a 2f 0a 20 20 75 33 32 20 6e 53 69  int */.  u32 nSi
aa00: 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
aa10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aa20: 20 20 2f 2a 20 53 69 7a 65 20 76 61 6c 75 65 20    /* Size value 
aa30: 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 0a 23 69  to return */..#i
aa40: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
aa50: 47 0a 20 20 2f 2a 20 54 68 65 20 76 61 6c 75 65  G.  /* The value
aa60: 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 69   returned by thi
aa70: 73 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c  s function shoul
aa80: 64 20 61 6c 77 61 79 73 20 62 65 20 74 68 65 20  d always be the 
aa90: 73 61 6d 65 20 61 73 0a 20 20 2a 2a 20 74 68 65  same as.  ** the
aaa0: 20 28 43 65 6c 6c 49 6e 66 6f 2e 6e 53 69 7a 65   (CellInfo.nSize
aab0: 29 20 76 61 6c 75 65 20 66 6f 75 6e 64 20 62 79  ) value found by
aac0: 20 64 6f 69 6e 67 20 61 20 66 75 6c 6c 20 70 61   doing a full pa
aad0: 72 73 65 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20  rse of the.  ** 
aae0: 63 65 6c 6c 2e 20 49 66 20 53 51 4c 49 54 45 5f  cell. If SQLITE_
aaf0: 44 45 42 55 47 20 69 73 20 64 65 66 69 6e 65 64  DEBUG is defined
ab00: 2c 20 61 6e 20 61 73 73 65 72 74 28 29 20 61 74  , an assert() at
ab10: 20 74 68 65 20 62 6f 74 74 6f 6d 20 6f 66 0a 20   the bottom of. 
ab20: 20 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f   ** this functio
ab30: 6e 20 76 65 72 69 66 69 65 73 20 74 68 61 74 20  n verifies that 
ab40: 74 68 69 73 20 69 6e 76 61 72 69 61 6e 74 20 69  this invariant i
ab50: 73 20 6e 6f 74 20 76 69 6f 6c 61 74 65 64 2e 20  s not violated. 
ab60: 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 64 65  */.  CellInfo de
ab70: 62 75 67 69 6e 66 6f 3b 0a 20 20 70 50 61 67 65  buginfo;.  pPage
ab80: 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28 70 50 61  ->xParseCell(pPa
ab90: 67 65 2c 20 70 43 65 6c 6c 2c 20 26 64 65 62 75  ge, pCell, &debu
aba0: 67 69 6e 66 6f 29 3b 0a 23 65 6e 64 69 66 0a 0a  ginfo);.#endif..
abb0: 20 20 6e 53 69 7a 65 20 3d 20 2a 70 49 74 65 72    nSize = *pIter
abc0: 3b 0a 20 20 69 66 28 20 6e 53 69 7a 65 3e 3d 30  ;.  if( nSize>=0
abd0: 78 38 30 20 29 7b 0a 20 20 20 20 70 45 6e 64 20  x80 ){.    pEnd 
abe0: 3d 20 26 70 49 74 65 72 5b 38 5d 3b 0a 20 20 20  = &pIter[8];.   
abf0: 20 6e 53 69 7a 65 20 26 3d 20 30 78 37 66 3b 0a   nSize &= 0x7f;.
ac00: 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 6e 53      do{.      nS
ac10: 69 7a 65 20 3d 20 28 6e 53 69 7a 65 3c 3c 37 29  ize = (nSize<<7)
ac20: 20 7c 20 28 2a 2b 2b 70 49 74 65 72 20 26 20 30   | (*++pIter & 0
ac30: 78 37 66 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65  x7f);.    }while
ac40: 28 20 2a 28 70 49 74 65 72 29 3e 3d 30 78 38 30  ( *(pIter)>=0x80
ac50: 20 26 26 20 70 49 74 65 72 3c 70 45 6e 64 20 29   && pIter<pEnd )
ac60: 3b 0a 20 20 7d 0a 20 20 70 49 74 65 72 2b 2b 3b  ;.  }.  pIter++;
ac70: 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e  .  if( pPage->in
ac80: 74 4b 65 79 20 29 7b 0a 20 20 20 20 2f 2a 20 70  tKey ){.    /* p
ac90: 49 74 65 72 20 6e 6f 77 20 70 6f 69 6e 74 73 20  Iter now points 
aca0: 61 74 20 74 68 65 20 36 34 2d 62 69 74 20 69 6e  at the 64-bit in
acb0: 74 65 67 65 72 20 6b 65 79 20 76 61 6c 75 65 2c  teger key value,
acc0: 20 61 20 76 61 72 69 61 62 6c 65 20 6c 65 6e 67   a variable leng
acd0: 74 68 20 0a 20 20 20 20 2a 2a 20 69 6e 74 65 67  th .    ** integ
ace0: 65 72 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  er. The followin
acf0: 67 20 62 6c 6f 63 6b 20 6d 6f 76 65 73 20 70 49  g block moves pI
ad00: 74 65 72 20 74 6f 20 70 6f 69 6e 74 20 61 74 20  ter to point at 
ad10: 74 68 65 20 66 69 72 73 74 20 62 79 74 65 0a 20  the first byte. 
ad20: 20 20 20 2a 2a 20 70 61 73 74 20 74 68 65 20 65     ** past the e
ad30: 6e 64 20 6f 66 20 74 68 65 20 6b 65 79 20 76 61  nd of the key va
ad40: 6c 75 65 2e 20 2a 2f 0a 20 20 20 20 70 45 6e 64  lue. */.    pEnd
ad50: 20 3d 20 26 70 49 74 65 72 5b 39 5d 3b 0a 20 20   = &pIter[9];.  
ad60: 20 20 77 68 69 6c 65 28 20 28 2a 70 49 74 65 72    while( (*pIter
ad70: 2b 2b 29 26 30 78 38 30 20 26 26 20 70 49 74 65  ++)&0x80 && pIte
ad80: 72 3c 70 45 6e 64 20 29 3b 0a 20 20 7d 0a 20 20  r<pEnd );.  }.  
ad90: 74 65 73 74 63 61 73 65 28 20 6e 53 69 7a 65 3d  testcase( nSize=
ada0: 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c  =pPage->maxLocal
adb0: 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
adc0: 6e 53 69 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d 61  nSize==pPage->ma
add0: 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 69 66  xLocal+1 );.  if
ade0: 28 20 6e 53 69 7a 65 3c 3d 70 50 61 67 65 2d 3e  ( nSize<=pPage->
adf0: 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20  maxLocal ){.    
ae00: 6e 53 69 7a 65 20 2b 3d 20 28 75 33 32 29 28 70  nSize += (u32)(p
ae10: 49 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b 0a 20  Iter - pCell);. 
ae20: 20 20 20 69 66 28 20 6e 53 69 7a 65 3c 34 20 29     if( nSize<4 )
ae30: 20 6e 53 69 7a 65 20 3d 20 34 3b 0a 20 20 7d 65   nSize = 4;.  }e
ae40: 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6d 69 6e  lse{.    int min
ae50: 4c 6f 63 61 6c 20 3d 20 70 50 61 67 65 2d 3e 6d  Local = pPage->m
ae60: 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 6e 53 69  inLocal;.    nSi
ae70: 7a 65 20 3d 20 6d 69 6e 4c 6f 63 61 6c 20 2b 20  ze = minLocal + 
ae80: 28 6e 53 69 7a 65 20 2d 20 6d 69 6e 4c 6f 63 61  (nSize - minLoca
ae90: 6c 29 20 25 20 28 70 50 61 67 65 2d 3e 70 42 74  l) % (pPage->pBt
aea0: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34  ->usableSize - 4
aeb0: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
aec0: 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d   nSize==pPage->m
aed0: 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 20 20 74  axLocal );.    t
aee0: 65 73 74 63 61 73 65 28 20 6e 53 69 7a 65 3d 3d  estcase( nSize==
aef0: 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b  pPage->maxLocal+
af00: 31 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 53 69  1 );.    if( nSi
af10: 7a 65 3e 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  ze>pPage->maxLoc
af20: 61 6c 20 29 7b 0a 20 20 20 20 20 20 6e 53 69 7a  al ){.      nSiz
af30: 65 20 3d 20 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20  e = minLocal;.  
af40: 20 20 7d 0a 20 20 20 20 6e 53 69 7a 65 20 2b 3d    }.    nSize +=
af50: 20 34 20 2b 20 28 75 31 36 29 28 70 49 74 65 72   4 + (u16)(pIter
af60: 20 2d 20 70 43 65 6c 6c 29 3b 0a 20 20 7d 0a 20   - pCell);.  }. 
af70: 20 61 73 73 65 72 74 28 20 6e 53 69 7a 65 3d 3d   assert( nSize==
af80: 64 65 62 75 67 69 6e 66 6f 2e 6e 53 69 7a 65 20  debuginfo.nSize 
af90: 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b  || CORRUPT_DB );
afa0: 0a 20 20 72 65 74 75 72 6e 20 28 75 31 36 29 6e  .  return (u16)n
afb0: 53 69 7a 65 3b 0a 7d 0a 73 74 61 74 69 63 20 75  Size;.}.static u
afc0: 31 36 20 63 65 6c 6c 53 69 7a 65 50 74 72 4e 6f  16 cellSizePtrNo
afd0: 50 61 79 6c 6f 61 64 28 4d 65 6d 50 61 67 65 20  Payload(MemPage 
afe0: 2a 70 50 61 67 65 2c 20 75 38 20 2a 70 43 65 6c  *pPage, u8 *pCel
aff0: 6c 29 7b 0a 20 20 75 38 20 2a 70 49 74 65 72 20  l){.  u8 *pIter 
b000: 3d 20 70 43 65 6c 6c 20 2b 20 34 3b 20 2f 2a 20  = pCell + 4; /* 
b010: 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72  For looping over
b020: 20 62 79 74 65 73 20 6f 66 20 70 43 65 6c 6c 20   bytes of pCell 
b030: 2a 2f 0a 20 20 75 38 20 2a 70 45 6e 64 3b 20 20  */.  u8 *pEnd;  
b040: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
b050: 6e 64 20 6d 61 72 6b 20 66 6f 72 20 61 20 76 61  nd mark for a va
b060: 72 69 6e 74 20 2a 2f 0a 0a 23 69 66 64 65 66 20  rint */..#ifdef 
b070: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f  SQLITE_DEBUG.  /
b080: 2a 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75  * The value retu
b090: 72 6e 65 64 20 62 79 20 74 68 69 73 20 66 75 6e  rned by this fun
b0a0: 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 61 6c 77  ction should alw
b0b0: 61 79 73 20 62 65 20 74 68 65 20 73 61 6d 65 20  ays be the same 
b0c0: 61 73 0a 20 20 2a 2a 20 74 68 65 20 28 43 65 6c  as.  ** the (Cel
b0d0: 6c 49 6e 66 6f 2e 6e 53 69 7a 65 29 20 76 61 6c  lInfo.nSize) val
b0e0: 75 65 20 66 6f 75 6e 64 20 62 79 20 64 6f 69 6e  ue found by doin
b0f0: 67 20 61 20 66 75 6c 6c 20 70 61 72 73 65 20 6f  g a full parse o
b100: 66 20 74 68 65 0a 20 20 2a 2a 20 63 65 6c 6c 2e  f the.  ** cell.
b110: 20 49 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47   If SQLITE_DEBUG
b120: 20 69 73 20 64 65 66 69 6e 65 64 2c 20 61 6e 20   is defined, an 
b130: 61 73 73 65 72 74 28 29 20 61 74 20 74 68 65 20  assert() at the 
b140: 62 6f 74 74 6f 6d 20 6f 66 0a 20 20 2a 2a 20 74  bottom of.  ** t
b150: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 76 65 72  his function ver
b160: 69 66 69 65 73 20 74 68 61 74 20 74 68 69 73 20  ifies that this 
b170: 69 6e 76 61 72 69 61 6e 74 20 69 73 20 6e 6f 74  invariant is not
b180: 20 76 69 6f 6c 61 74 65 64 2e 20 2a 2f 0a 20 20   violated. */.  
b190: 43 65 6c 6c 49 6e 66 6f 20 64 65 62 75 67 69 6e  CellInfo debugin
b1a0: 66 6f 3b 0a 20 20 70 50 61 67 65 2d 3e 78 50 61  fo;.  pPage->xPa
b1b0: 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 70  rseCell(pPage, p
b1c0: 43 65 6c 6c 2c 20 26 64 65 62 75 67 69 6e 66 6f  Cell, &debuginfo
b1d0: 29 3b 0a 23 65 6c 73 65 0a 20 20 55 4e 55 53 45  );.#else.  UNUSE
b1e0: 44 5f 50 41 52 41 4d 45 54 45 52 28 70 50 61 67  D_PARAMETER(pPag
b1f0: 65 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73  e);.#endif..  as
b200: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 63 68 69  sert( pPage->chi
b210: 6c 64 50 74 72 53 69 7a 65 3d 3d 34 20 29 3b 0a  ldPtrSize==4 );.
b220: 20 20 70 45 6e 64 20 3d 20 70 49 74 65 72 20 2b    pEnd = pIter +
b230: 20 39 3b 0a 20 20 77 68 69 6c 65 28 20 28 2a 70   9;.  while( (*p
b240: 49 74 65 72 2b 2b 29 26 30 78 38 30 20 26 26 20  Iter++)&0x80 && 
b250: 70 49 74 65 72 3c 70 45 6e 64 20 29 3b 0a 20 20  pIter<pEnd );.  
b260: 61 73 73 65 72 74 28 20 64 65 62 75 67 69 6e 66  assert( debuginf
b270: 6f 2e 6e 53 69 7a 65 3d 3d 28 75 31 36 29 28 70  o.nSize==(u16)(p
b280: 49 74 65 72 20 2d 20 70 43 65 6c 6c 29 20 7c 7c  Iter - pCell) ||
b290: 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20   CORRUPT_DB );. 
b2a0: 20 72 65 74 75 72 6e 20 28 75 31 36 29 28 70 49   return (u16)(pI
b2b0: 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b 0a 7d 0a  ter - pCell);.}.
b2c0: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
b2d0: 44 45 42 55 47 0a 2f 2a 20 54 68 69 73 20 76 61  DEBUG./* This va
b2e0: 72 69 61 74 69 6f 6e 20 6f 6e 20 63 65 6c 6c 53  riation on cellS
b2f0: 69 7a 65 50 74 72 28 29 20 69 73 20 75 73 65 64  izePtr() is used
b300: 20 69 6e 73 69 64 65 20 6f 66 20 61 73 73 65 72   inside of asser
b310: 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a  t() statements.*
b320: 2a 20 6f 6e 6c 79 2e 20 2a 2f 0a 73 74 61 74 69  * only. */.stati
b330: 63 20 75 31 36 20 63 65 6c 6c 53 69 7a 65 28 4d  c u16 cellSize(M
b340: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69  emPage *pPage, i
b350: 6e 74 20 69 43 65 6c 6c 29 7b 0a 20 20 72 65 74  nt iCell){.  ret
b360: 75 72 6e 20 70 50 61 67 65 2d 3e 78 43 65 6c 6c  urn pPage->xCell
b370: 53 69 7a 65 28 70 50 61 67 65 2c 20 66 69 6e 64  Size(pPage, find
b380: 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65 6c  Cell(pPage, iCel
b390: 6c 29 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23  l));.}.#endif..#
b3a0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
b3b0: 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a  IT_AUTOVACUUM./*
b3c0: 0a 2a 2a 20 49 66 20 74 68 65 20 63 65 6c 6c 20  .** If the cell 
b3d0: 70 43 65 6c 6c 2c 20 70 61 72 74 20 6f 66 20 70  pCell, part of p
b3e0: 61 67 65 20 70 50 61 67 65 20 63 6f 6e 74 61 69  age pPage contai
b3f0: 6e 73 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20  ns a pointer.** 
b400: 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70  to an overflow p
b410: 61 67 65 2c 20 69 6e 73 65 72 74 20 61 6e 20 65  age, insert an e
b420: 6e 74 72 79 20 69 6e 74 6f 20 74 68 65 20 70 6f  ntry into the po
b430: 69 6e 74 65 72 2d 6d 61 70 0a 2a 2a 20 66 6f 72  inter-map.** for
b440: 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61   the overflow pa
b450: 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ge..*/.static vo
b460: 69 64 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c  id ptrmapPutOvfl
b470: 50 74 72 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  Ptr(MemPage *pPa
b480: 67 65 2c 20 75 38 20 2a 70 43 65 6c 6c 2c 20 69  ge, u8 *pCell, i
b490: 6e 74 20 2a 70 52 43 29 7b 0a 20 20 43 65 6c 6c  nt *pRC){.  Cell
b4a0: 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 69 66 28  Info info;.  if(
b4b0: 20 2a 70 52 43 20 29 20 72 65 74 75 72 6e 3b 0a   *pRC ) return;.
b4c0: 20 20 61 73 73 65 72 74 28 20 70 43 65 6c 6c 21    assert( pCell!
b4d0: 3d 30 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e 78  =0 );.  pPage->x
b4e0: 50 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c  ParseCell(pPage,
b4f0: 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a   pCell, &info);.
b500: 20 20 69 66 28 20 69 6e 66 6f 2e 6e 4c 6f 63 61    if( info.nLoca
b510: 6c 3c 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20  l<info.nPayload 
b520: 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6f 76 66 6c  ){.    Pgno ovfl
b530: 3b 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45  ;.    if( SQLITE
b540: 5f 57 49 54 48 49 4e 28 70 50 61 67 65 2d 3e 61  _WITHIN(pPage->a
b550: 44 61 74 61 45 6e 64 2c 20 70 43 65 6c 6c 2c 20  DataEnd, pCell, 
b560: 70 43 65 6c 6c 2b 69 6e 66 6f 2e 6e 4c 6f 63 61  pCell+info.nLoca
b570: 6c 29 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 43  l) ){.      *pRC
b580: 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
b590: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 72 65  T_BKPT;.      re
b5a0: 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20  turn;.    }.    
b5b0: 6f 76 66 6c 20 3d 20 67 65 74 34 62 79 74 65 28  ovfl = get4byte(
b5c0: 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 6e 53 69 7a  &pCell[info.nSiz
b5d0: 65 2d 34 5d 29 3b 0a 20 20 20 20 70 74 72 6d 61  e-4]);.    ptrma
b5e0: 70 50 75 74 28 70 50 61 67 65 2d 3e 70 42 74 2c  pPut(pPage->pBt,
b5f0: 20 6f 76 66 6c 2c 20 50 54 52 4d 41 50 5f 4f 56   ovfl, PTRMAP_OV
b600: 45 52 46 4c 4f 57 31 2c 20 70 50 61 67 65 2d 3e  ERFLOW1, pPage->
b610: 70 67 6e 6f 2c 20 70 52 43 29 3b 0a 20 20 7d 0a  pgno, pRC);.  }.
b620: 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a  }.#endif.../*.**
b630: 20 44 65 66 72 61 67 6d 65 6e 74 20 74 68 65 20   Defragment the 
b640: 70 61 67 65 20 67 69 76 65 6e 2e 20 54 68 69 73  page given. This
b650: 20 72 6f 75 74 69 6e 65 20 72 65 6f 72 67 61 6e   routine reorgan
b660: 69 7a 65 73 20 63 65 6c 6c 73 20 77 69 74 68 69  izes cells withi
b670: 6e 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 73 6f  n the.** page so
b680: 20 74 68 61 74 20 74 68 65 72 65 20 61 72 65 20   that there are 
b690: 6e 6f 20 66 72 65 65 2d 62 6c 6f 63 6b 73 20 6f  no free-blocks o
b6a0: 6e 20 74 68 65 20 66 72 65 65 2d 62 6c 6f 63 6b  n the free-block
b6b0: 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 50 61 72   list..**.** Par
b6c0: 61 6d 65 74 65 72 20 6e 4d 61 78 46 72 61 67 20  ameter nMaxFrag 
b6d0: 69 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 61  is the maximum a
b6e0: 6d 6f 75 6e 74 20 6f 66 20 66 72 61 67 6d 65 6e  mount of fragmen
b6f0: 74 65 64 20 73 70 61 63 65 20 74 68 61 74 20 6d  ted space that m
b700: 61 79 20 62 65 0a 2a 2a 20 70 72 65 73 65 6e 74  ay be.** present
b710: 20 69 6e 20 74 68 65 20 70 61 67 65 20 61 66 74   in the page aft
b720: 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  er this routine 
b730: 72 65 74 75 72 6e 73 2e 0a 2a 2a 0a 2a 2a 20 45  returns..**.** E
b740: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 34  VIDENCE-OF: R-44
b750: 35 38 32 2d 36 30 31 33 38 20 53 51 4c 69 74 65  582-60138 SQLite
b760: 20 6d 61 79 20 66 72 6f 6d 20 74 69 6d 65 20 74   may from time t
b770: 6f 20 74 69 6d 65 20 72 65 6f 72 67 61 6e 69 7a  o time reorganiz
b780: 65 20 61 0a 2a 2a 20 62 2d 74 72 65 65 20 70 61  e a.** b-tree pa
b790: 67 65 20 73 6f 20 74 68 61 74 20 74 68 65 72 65  ge so that there
b7a0: 20 61 72 65 20 6e 6f 20 66 72 65 65 62 6c 6f 63   are no freebloc
b7b0: 6b 73 20 6f 72 20 66 72 61 67 6d 65 6e 74 20 62  ks or fragment b
b7c0: 79 74 65 73 2c 20 61 6c 6c 0a 2a 2a 20 75 6e 75  ytes, all.** unu
b7d0: 73 65 64 20 62 79 74 65 73 20 61 72 65 20 63 6f  sed bytes are co
b7e0: 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20 75  ntained in the u
b7f0: 6e 61 6c 6c 6f 63 61 74 65 64 20 73 70 61 63 65  nallocated space
b800: 20 72 65 67 69 6f 6e 2c 20 61 6e 64 20 61 6c 6c   region, and all
b810: 0a 2a 2a 20 63 65 6c 6c 73 20 61 72 65 20 70 61  .** cells are pa
b820: 63 6b 65 64 20 74 69 67 68 74 6c 79 20 61 74 20  cked tightly at 
b830: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70  the end of the p
b840: 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  age..*/.static i
b850: 6e 74 20 64 65 66 72 61 67 6d 65 6e 74 50 61 67  nt defragmentPag
b860: 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  e(MemPage *pPage
b870: 2c 20 69 6e 74 20 6e 4d 61 78 46 72 61 67 29 7b  , int nMaxFrag){
b880: 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
b890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
b8a0: 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
b8b0: 0a 20 20 69 6e 74 20 70 63 3b 20 20 20 20 20 20  .  int pc;      
b8c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
b8d0: 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   Address of the 
b8e0: 69 2d 74 68 20 63 65 6c 6c 20 2a 2f 0a 20 20 69  i-th cell */.  i
b8f0: 6e 74 20 68 64 72 3b 20 20 20 20 20 20 20 20 20  nt hdr;         
b900: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
b910: 73 65 74 20 74 6f 20 74 68 65 20 70 61 67 65 20  set to the page 
b920: 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20  header */.  int 
b930: 73 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  size;           
b940: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
b950: 66 20 61 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e  f a cell */.  in
b960: 74 20 75 73 61 62 6c 65 53 69 7a 65 3b 20 20 20  t usableSize;   
b970: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
b980: 65 72 20 6f 66 20 75 73 61 62 6c 65 20 62 79 74  er of usable byt
b990: 65 73 20 6f 6e 20 61 20 70 61 67 65 20 2a 2f 0a  es on a page */.
b9a0: 20 20 69 6e 74 20 63 65 6c 6c 4f 66 66 73 65 74    int cellOffset
b9b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
b9c0: 4f 66 66 73 65 74 20 74 6f 20 74 68 65 20 63 65  Offset to the ce
b9d0: 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79  ll pointer array
b9e0: 20 2a 2f 0a 20 20 69 6e 74 20 63 62 72 6b 3b 20   */.  int cbrk; 
b9f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ba00: 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 74 68   /* Offset to th
ba10: 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61  e cell content a
ba20: 72 65 61 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65  rea */.  int nCe
ba30: 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
ba40: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
ba50: 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20 70 61   cells on the pa
ba60: 67 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  ge */.  unsigned
ba70: 20 63 68 61 72 20 2a 64 61 74 61 3b 20 20 20 20   char *data;    
ba80: 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 64     /* The page d
ba90: 61 74 61 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  ata */.  unsigne
baa0: 64 20 63 68 61 72 20 2a 74 65 6d 70 3b 20 20 20  d char *temp;   
bab0: 20 20 20 20 2f 2a 20 54 65 6d 70 20 61 72 65 61      /* Temp area
bac0: 20 66 6f 72 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   for cell conten
bad0: 74 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  t */.  unsigned 
bae0: 63 68 61 72 20 2a 73 72 63 3b 20 20 20 20 20 20  char *src;      
baf0: 20 20 2f 2a 20 53 6f 75 72 63 65 20 6f 66 20 63    /* Source of c
bb00: 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  ontent */.  int 
bb10: 69 43 65 6c 6c 46 69 72 73 74 3b 20 20 20 20 20  iCellFirst;     
bb20: 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
bb30: 61 6c 6c 6f 77 61 62 6c 65 20 63 65 6c 6c 20 69  allowable cell i
bb40: 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 69 43  ndex */.  int iC
bb50: 65 6c 6c 4c 61 73 74 3b 20 20 20 20 20 20 20 20  ellLast;        
bb60: 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 70 6f 73       /* Last pos
bb70: 73 69 62 6c 65 20 63 65 6c 6c 20 69 6e 64 65 78  sible cell index
bb80: 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73   */..  assert( s
bb90: 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
bba0: 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
bbb0: 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65  bPage) );.  asse
bbc0: 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 21 3d  rt( pPage->pBt!=
bbd0: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
bbe0: 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
bbf0: 65 53 69 7a 65 20 3c 3d 20 53 51 4c 49 54 45 5f  eSize <= SQLITE_
bc00: 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 29 3b  MAX_PAGE_SIZE );
bc10: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
bc20: 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29  ->nOverflow==0 )
bc30: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
bc40: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
bc50: 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
bc60: 29 20 29 3b 0a 20 20 74 65 6d 70 20 3d 20 30 3b  ) );.  temp = 0;
bc70: 0a 20 20 73 72 63 20 3d 20 64 61 74 61 20 3d 20  .  src = data = 
bc80: 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20  pPage->aData;.  
bc90: 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72  hdr = pPage->hdr
bca0: 4f 66 66 73 65 74 3b 0a 20 20 63 65 6c 6c 4f 66  Offset;.  cellOf
bcb0: 66 73 65 74 20 3d 20 70 50 61 67 65 2d 3e 63 65  fset = pPage->ce
bcc0: 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 6e 43 65 6c  llOffset;.  nCel
bcd0: 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  l = pPage->nCell
bce0: 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c  ;.  assert( nCel
bcf0: 6c 3d 3d 67 65 74 32 62 79 74 65 28 26 64 61 74  l==get2byte(&dat
bd00: 61 5b 68 64 72 2b 33 5d 29 20 29 3b 0a 20 20 69  a[hdr+3]) );.  i
bd10: 43 65 6c 6c 46 69 72 73 74 20 3d 20 63 65 6c 6c  CellFirst = cell
bd20: 4f 66 66 73 65 74 20 2b 20 32 2a 6e 43 65 6c 6c  Offset + 2*nCell
bd30: 3b 0a 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d  ;.  usableSize =
bd40: 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61   pPage->pBt->usa
bd50: 62 6c 65 53 69 7a 65 3b 0a 0a 20 20 2f 2a 20 54  bleSize;..  /* T
bd60: 68 69 73 20 62 6c 6f 63 6b 20 68 61 6e 64 6c 65  his block handle
bd70: 73 20 70 61 67 65 73 20 77 69 74 68 20 74 77 6f  s pages with two
bd80: 20 6f 72 20 66 65 77 65 72 20 66 72 65 65 20 62   or fewer free b
bd90: 6c 6f 63 6b 73 20 61 6e 64 20 6e 4d 61 78 46 72  locks and nMaxFr
bda0: 61 67 0a 20 20 2a 2a 20 6f 72 20 66 65 77 65 72  ag.  ** or fewer
bdb0: 20 66 72 61 67 6d 65 6e 74 65 64 20 62 79 74 65   fragmented byte
bdc0: 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  s. In this case 
bdd0: 69 74 20 69 73 20 66 61 73 74 65 72 20 74 6f 20  it is faster to 
bde0: 6d 6f 76 65 20 74 68 65 0a 20 20 2a 2a 20 74 77  move the.  ** tw
bdf0: 6f 20 28 6f 72 20 6f 6e 65 29 20 62 6c 6f 63 6b  o (or one) block
be00: 73 20 6f 66 20 63 65 6c 6c 73 20 75 73 69 6e 67  s of cells using
be10: 20 6d 65 6d 6d 6f 76 65 28 29 20 61 6e 64 20 61   memmove() and a
be20: 64 64 20 74 68 65 20 72 65 71 75 69 72 65 64 0a  dd the required.
be30: 20 20 2a 2a 20 6f 66 66 73 65 74 73 20 74 6f 20    ** offsets to 
be40: 65 61 63 68 20 70 6f 69 6e 74 65 72 20 69 6e 20  each pointer in 
be50: 74 68 65 20 63 65 6c 6c 2d 70 6f 69 6e 74 65 72  the cell-pointer
be60: 20 61 72 72 61 79 20 74 68 61 6e 20 69 74 20 69   array than it i
be70: 73 20 74 6f 20 0a 20 20 2a 2a 20 72 65 63 6f 6e  s to .  ** recon
be80: 73 74 72 75 63 74 20 74 68 65 20 65 6e 74 69 72  struct the entir
be90: 65 20 70 61 67 65 2e 20 20 2a 2f 0a 20 20 69 66  e page.  */.  if
bea0: 28 20 28 69 6e 74 29 64 61 74 61 5b 68 64 72 2b  ( (int)data[hdr+
beb0: 37 5d 3c 3d 6e 4d 61 78 46 72 61 67 20 29 7b 0a  7]<=nMaxFrag ){.
bec0: 20 20 20 20 69 6e 74 20 69 46 72 65 65 20 3d 20      int iFree = 
bed0: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
bee0: 64 72 2b 31 5d 29 3b 0a 0a 20 20 20 20 2f 2a 20  dr+1]);..    /* 
bef0: 49 66 20 74 68 65 20 69 6e 69 74 69 61 6c 20 66  If the initial f
bf00: 72 65 65 62 6c 6f 63 6b 20 6f 66 66 73 65 74 20  reeblock offset 
bf10: 77 65 72 65 20 6f 75 74 20 6f 66 20 62 6f 75 6e  were out of boun
bf20: 64 73 2c 20 74 68 61 74 20 77 6f 75 6c 64 0a 20  ds, that would. 
bf30: 20 20 20 2a 2a 20 68 61 76 65 20 62 65 65 6e 20     ** have been 
bf40: 64 65 74 65 63 74 65 64 20 62 79 20 62 74 72 65  detected by btre
bf50: 65 49 6e 69 74 50 61 67 65 28 29 20 77 68 65 6e  eInitPage() when
bf60: 20 69 74 20 77 61 73 20 63 6f 6d 70 75 74 69 6e   it was computin
bf70: 67 20 74 68 65 0a 20 20 20 20 2a 2a 20 6e 75 6d  g the.    ** num
bf80: 62 65 72 20 6f 66 20 66 72 65 65 20 62 79 74 65  ber of free byte
bf90: 73 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 20 2a  s on the page. *
bfa0: 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 46  /.    assert( iF
bfb0: 72 65 65 3c 3d 75 73 61 62 6c 65 53 69 7a 65 2d  ree<=usableSize-
bfc0: 34 20 29 3b 0a 20 20 20 20 69 66 28 20 69 46 72  4 );.    if( iFr
bfd0: 65 65 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  ee ){.      int 
bfe0: 69 46 72 65 65 32 20 3d 20 67 65 74 32 62 79 74  iFree2 = get2byt
bff0: 65 28 26 64 61 74 61 5b 69 46 72 65 65 5d 29 3b  e(&data[iFree]);
c000: 0a 20 20 20 20 20 20 69 66 28 20 69 46 72 65 65  .      if( iFree
c010: 32 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34 20 29  2>usableSize-4 )
c020: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
c030: 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50 61 67  ORRUPT_PAGE(pPag
c040: 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 30 3d  e);.      if( 0=
c050: 3d 69 46 72 65 65 32 20 7c 7c 20 28 64 61 74 61  =iFree2 || (data
c060: 5b 69 46 72 65 65 32 5d 3d 3d 30 20 26 26 20 64  [iFree2]==0 && d
c070: 61 74 61 5b 69 46 72 65 65 32 2b 31 5d 3d 3d 30  ata[iFree2+1]==0
c080: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 75 38 20  ) ){.        u8 
c090: 2a 70 45 6e 64 20 3d 20 26 64 61 74 61 5b 63 65  *pEnd = &data[ce
c0a0: 6c 6c 4f 66 66 73 65 74 20 2b 20 6e 43 65 6c 6c  llOffset + nCell
c0b0: 2a 32 5d 3b 0a 20 20 20 20 20 20 20 20 75 38 20  *2];.        u8 
c0c0: 2a 70 41 64 64 72 3b 0a 20 20 20 20 20 20 20 20  *pAddr;.        
c0d0: 69 6e 74 20 73 7a 32 20 3d 20 30 3b 0a 20 20 20  int sz2 = 0;.   
c0e0: 20 20 20 20 20 69 6e 74 20 73 7a 20 3d 20 67 65       int sz = ge
c0f0: 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 46 72  t2byte(&data[iFr
c100: 65 65 2b 32 5d 29 3b 0a 20 20 20 20 20 20 20 20  ee+2]);.        
c110: 69 6e 74 20 74 6f 70 20 3d 20 67 65 74 32 62 79  int top = get2by
c120: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29  te(&data[hdr+5])
c130: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 74 6f  ;.        if( to
c140: 70 3e 3d 69 46 72 65 65 20 29 7b 0a 20 20 20 20  p>=iFree ){.    
c150: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
c160: 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45  ITE_CORRUPT_PAGE
c170: 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  (pPage);.       
c180: 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 69   }.        if( i
c190: 46 72 65 65 32 20 29 7b 0a 20 20 20 20 20 20 20  Free2 ){.       
c1a0: 20 20 20 69 66 28 20 69 46 72 65 65 2b 73 7a 3e     if( iFree+sz>
c1b0: 69 46 72 65 65 32 20 29 20 72 65 74 75 72 6e 20  iFree2 ) return 
c1c0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50  SQLITE_CORRUPT_P
c1d0: 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20 20 20  AGE(pPage);.    
c1e0: 20 20 20 20 20 20 73 7a 32 20 3d 20 67 65 74 32        sz2 = get2
c1f0: 62 79 74 65 28 26 64 61 74 61 5b 69 46 72 65 65  byte(&data[iFree
c200: 32 2b 32 5d 29 3b 0a 20 20 20 20 20 20 20 20 20  2+2]);.         
c210: 20 69 66 28 20 69 46 72 65 65 32 2b 73 7a 32 20   if( iFree2+sz2 
c220: 3e 20 75 73 61 62 6c 65 53 69 7a 65 20 29 20 72  > usableSize ) r
c230: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
c240: 52 55 50 54 5f 50 41 47 45 28 70 50 61 67 65 29  RUPT_PAGE(pPage)
c250: 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 6d  ;.          memm
c260: 6f 76 65 28 26 64 61 74 61 5b 69 46 72 65 65 2b  ove(&data[iFree+
c270: 73 7a 2b 73 7a 32 5d 2c 20 26 64 61 74 61 5b 69  sz+sz2], &data[i
c280: 46 72 65 65 2b 73 7a 5d 2c 20 69 46 72 65 65 32  Free+sz], iFree2
c290: 2d 28 69 46 72 65 65 2b 73 7a 29 29 3b 0a 20 20  -(iFree+sz));.  
c2a0: 20 20 20 20 20 20 20 20 73 7a 20 2b 3d 20 73 7a          sz += sz
c2b0: 32 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  2;.        }.   
c2c0: 20 20 20 20 20 63 62 72 6b 20 3d 20 74 6f 70 2b       cbrk = top+
c2d0: 73 7a 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  sz;.        asse
c2e0: 72 74 28 20 63 62 72 6b 2b 28 69 46 72 65 65 2d  rt( cbrk+(iFree-
c2f0: 74 6f 70 29 20 3c 3d 20 75 73 61 62 6c 65 53 69  top) <= usableSi
c300: 7a 65 20 29 3b 0a 20 20 20 20 20 20 20 20 6d 65  ze );.        me
c310: 6d 6d 6f 76 65 28 26 64 61 74 61 5b 63 62 72 6b  mmove(&data[cbrk
c320: 5d 2c 20 26 64 61 74 61 5b 74 6f 70 5d 2c 20 69  ], &data[top], i
c330: 46 72 65 65 2d 74 6f 70 29 3b 0a 20 20 20 20 20  Free-top);.     
c340: 20 20 20 66 6f 72 28 70 41 64 64 72 3d 26 64 61     for(pAddr=&da
c350: 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74 5d 3b 20  ta[cellOffset]; 
c360: 70 41 64 64 72 3c 70 45 6e 64 3b 20 70 41 64 64  pAddr<pEnd; pAdd
c370: 72 2b 3d 32 29 7b 0a 20 20 20 20 20 20 20 20 20  r+=2){.         
c380: 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 28 70   pc = get2byte(p
c390: 41 64 64 72 29 3b 0a 20 20 20 20 20 20 20 20 20  Addr);.         
c3a0: 20 69 66 28 20 70 63 3c 69 46 72 65 65 20 29 7b   if( pc<iFree ){
c3b0: 20 70 75 74 32 62 79 74 65 28 70 41 64 64 72 2c   put2byte(pAddr,
c3c0: 20 70 63 2b 73 7a 29 3b 20 7d 0a 20 20 20 20 20   pc+sz); }.     
c3d0: 20 20 20 20 20 65 6c 73 65 20 69 66 28 20 70 63       else if( pc
c3e0: 3c 69 46 72 65 65 32 20 29 7b 20 70 75 74 32 62  <iFree2 ){ put2b
c3f0: 79 74 65 28 70 41 64 64 72 2c 20 70 63 2b 73 7a  yte(pAddr, pc+sz
c400: 32 29 3b 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a  2); }.        }.
c410: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65 66          goto def
c420: 72 61 67 6d 65 6e 74 5f 6f 75 74 3b 0a 20 20 20  ragment_out;.   
c430: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
c440: 20 20 63 62 72 6b 20 3d 20 75 73 61 62 6c 65 53    cbrk = usableS
c450: 69 7a 65 3b 0a 20 20 69 43 65 6c 6c 4c 61 73 74  ize;.  iCellLast
c460: 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 20 2d 20   = usableSize - 
c470: 34 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  4;.  for(i=0; i<
c480: 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  nCell; i++){.   
c490: 20 75 38 20 2a 70 41 64 64 72 3b 20 20 20 20 20   u8 *pAddr;     
c4a0: 2f 2a 20 54 68 65 20 69 2d 74 68 20 63 65 6c 6c  /* The i-th cell
c4b0: 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 20 20   pointer */.    
c4c0: 70 41 64 64 72 20 3d 20 26 64 61 74 61 5b 63 65  pAddr = &data[ce
c4d0: 6c 6c 4f 66 66 73 65 74 20 2b 20 69 2a 32 5d 3b  llOffset + i*2];
c4e0: 0a 20 20 20 20 70 63 20 3d 20 67 65 74 32 62 79  .    pc = get2by
c4f0: 74 65 28 70 41 64 64 72 29 3b 0a 20 20 20 20 74  te(pAddr);.    t
c500: 65 73 74 63 61 73 65 28 20 70 63 3d 3d 69 43 65  estcase( pc==iCe
c510: 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20 20 20 74  llFirst );.    t
c520: 65 73 74 63 61 73 65 28 20 70 63 3d 3d 69 43 65  estcase( pc==iCe
c530: 6c 6c 4c 61 73 74 20 29 3b 0a 20 20 20 20 2f 2a  llLast );.    /*
c540: 20 54 68 65 73 65 20 63 6f 6e 64 69 74 69 6f 6e   These condition
c550: 73 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62  s have already b
c560: 65 65 6e 20 76 65 72 69 66 69 65 64 20 69 6e 20  een verified in 
c570: 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 0a  btreeInitPage().
c580: 20 20 20 20 2a 2a 20 69 66 20 50 52 41 47 4d 41      ** if PRAGMA
c590: 20 63 65 6c 6c 5f 73 69 7a 65 5f 63 68 65 63 6b   cell_size_check
c5a0: 3d 4f 4e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  =ON..    */.    
c5b0: 69 66 28 20 70 63 3c 69 43 65 6c 6c 46 69 72 73  if( pc<iCellFirs
c5c0: 74 20 7c 7c 20 70 63 3e 69 43 65 6c 6c 4c 61 73  t || pc>iCellLas
c5d0: 74 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  t ){.      retur
c5e0: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
c5f0: 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20  _PAGE(pPage);.  
c600: 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
c610: 70 63 3e 3d 69 43 65 6c 6c 46 69 72 73 74 20 26  pc>=iCellFirst &
c620: 26 20 70 63 3c 3d 69 43 65 6c 6c 4c 61 73 74 20  & pc<=iCellLast 
c630: 29 3b 0a 20 20 20 20 73 69 7a 65 20 3d 20 70 50  );.    size = pP
c640: 61 67 65 2d 3e 78 43 65 6c 6c 53 69 7a 65 28 70  age->xCellSize(p
c650: 50 61 67 65 2c 20 26 73 72 63 5b 70 63 5d 29 3b  Page, &src[pc]);
c660: 0a 20 20 20 20 63 62 72 6b 20 2d 3d 20 73 69 7a  .    cbrk -= siz
c670: 65 3b 0a 20 20 20 20 69 66 28 20 63 62 72 6b 3c  e;.    if( cbrk<
c680: 69 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63  iCellFirst || pc
c690: 2b 73 69 7a 65 3e 75 73 61 62 6c 65 53 69 7a 65  +size>usableSize
c6a0: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
c6b0: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
c6c0: 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20 20  PAGE(pPage);.   
c6d0: 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 63   }.    assert( c
c6e0: 62 72 6b 2b 73 69 7a 65 3c 3d 75 73 61 62 6c 65  brk+size<=usable
c6f0: 53 69 7a 65 20 26 26 20 63 62 72 6b 3e 3d 69 43  Size && cbrk>=iC
c700: 65 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20 20 20  ellFirst );.    
c710: 74 65 73 74 63 61 73 65 28 20 63 62 72 6b 2b 73  testcase( cbrk+s
c720: 69 7a 65 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20  ize==usableSize 
c730: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
c740: 20 70 63 2b 73 69 7a 65 3d 3d 75 73 61 62 6c 65   pc+size==usable
c750: 53 69 7a 65 20 29 3b 0a 20 20 20 20 70 75 74 32  Size );.    put2
c760: 62 79 74 65 28 70 41 64 64 72 2c 20 63 62 72 6b  byte(pAddr, cbrk
c770: 29 3b 0a 20 20 20 20 69 66 28 20 74 65 6d 70 3d  );.    if( temp=
c780: 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  =0 ){.      int 
c790: 78 3b 0a 20 20 20 20 20 20 69 66 28 20 63 62 72  x;.      if( cbr
c7a0: 6b 3d 3d 70 63 20 29 20 63 6f 6e 74 69 6e 75 65  k==pc ) continue
c7b0: 3b 0a 20 20 20 20 20 20 74 65 6d 70 20 3d 20 73  ;.      temp = s
c7c0: 71 6c 69 74 65 33 50 61 67 65 72 54 65 6d 70 53  qlite3PagerTempS
c7d0: 70 61 63 65 28 70 50 61 67 65 2d 3e 70 42 74 2d  pace(pPage->pBt-
c7e0: 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  >pPager);.      
c7f0: 78 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  x = get2byte(&da
c800: 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20  ta[hdr+5]);.    
c810: 20 20 6d 65 6d 63 70 79 28 26 74 65 6d 70 5b 78    memcpy(&temp[x
c820: 5d 2c 20 26 64 61 74 61 5b 78 5d 2c 20 28 63 62  ], &data[x], (cb
c830: 72 6b 2b 73 69 7a 65 29 20 2d 20 78 29 3b 0a 20  rk+size) - x);. 
c840: 20 20 20 20 20 73 72 63 20 3d 20 74 65 6d 70 3b       src = temp;
c850: 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 63 70  .    }.    memcp
c860: 79 28 26 64 61 74 61 5b 63 62 72 6b 5d 2c 20 26  y(&data[cbrk], &
c870: 73 72 63 5b 70 63 5d 2c 20 73 69 7a 65 29 3b 0a  src[pc], size);.
c880: 20 20 7d 0a 20 20 64 61 74 61 5b 68 64 72 2b 37    }.  data[hdr+7
c890: 5d 20 3d 20 30 3b 0a 0a 20 64 65 66 72 61 67 6d  ] = 0;.. defragm
c8a0: 65 6e 74 5f 6f 75 74 3a 0a 20 20 69 66 28 20 64  ent_out:.  if( d
c8b0: 61 74 61 5b 68 64 72 2b 37 5d 2b 63 62 72 6b 2d  ata[hdr+7]+cbrk-
c8c0: 69 43 65 6c 6c 46 69 72 73 74 21 3d 70 50 61 67  iCellFirst!=pPag
c8d0: 65 2d 3e 6e 46 72 65 65 20 29 7b 0a 20 20 20 20  e->nFree ){.    
c8e0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
c8f0: 52 52 55 50 54 5f 50 41 47 45 28 70 50 61 67 65  RRUPT_PAGE(pPage
c900: 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  );.  }.  assert(
c910: 20 63 62 72 6b 3e 3d 69 43 65 6c 6c 46 69 72 73   cbrk>=iCellFirs
c920: 74 20 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28  t );.  put2byte(
c930: 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 63 62  &data[hdr+5], cb
c940: 72 6b 29 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b  rk);.  data[hdr+
c950: 31 5d 20 3d 20 30 3b 0a 20 20 64 61 74 61 5b 68  1] = 0;.  data[h
c960: 64 72 2b 32 5d 20 3d 20 30 3b 0a 20 20 6d 65 6d  dr+2] = 0;.  mem
c970: 73 65 74 28 26 64 61 74 61 5b 69 43 65 6c 6c 46  set(&data[iCellF
c980: 69 72 73 74 5d 2c 20 30 2c 20 63 62 72 6b 2d 69  irst], 0, cbrk-i
c990: 43 65 6c 6c 46 69 72 73 74 29 3b 0a 20 20 61 73  CellFirst);.  as
c9a0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
c9b0: 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
c9c0: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
c9d0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
c9e0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  _OK;.}../*.** Se
c9f0: 61 72 63 68 20 74 68 65 20 66 72 65 65 2d 6c 69  arch the free-li
ca00: 73 74 20 6f 6e 20 70 61 67 65 20 70 50 67 20 66  st on page pPg f
ca10: 6f 72 20 73 70 61 63 65 20 74 6f 20 73 74 6f 72  or space to stor
ca20: 65 20 61 20 63 65 6c 6c 20 6e 42 79 74 65 20 62  e a cell nByte b
ca30: 79 74 65 73 20 69 6e 0a 2a 2a 20 73 69 7a 65 2e  ytes in.** size.
ca40: 20 49 66 20 6f 6e 65 20 63 61 6e 20 62 65 20 66   If one can be f
ca50: 6f 75 6e 64 2c 20 72 65 74 75 72 6e 20 61 20 70  ound, return a p
ca60: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 73 70  ointer to the sp
ca70: 61 63 65 20 61 6e 64 20 72 65 6d 6f 76 65 20 69  ace and remove i
ca80: 74 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 66 72  t.** from the fr
ca90: 65 65 2d 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 49  ee-list..**.** I
caa0: 66 20 6e 6f 20 73 75 69 74 61 62 6c 65 20 73 70  f no suitable sp
cab0: 61 63 65 20 63 61 6e 20 62 65 20 66 6f 75 6e 64  ace can be found
cac0: 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73   on the free-lis
cad0: 74 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a  t, return NULL..
cae0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
caf0: 69 6f 6e 20 6d 61 79 20 64 65 74 65 63 74 20 63  ion may detect c
cb00: 6f 72 72 75 70 74 69 6f 6e 20 77 69 74 68 69 6e  orruption within
cb10: 20 70 50 67 2e 20 20 49 66 20 63 6f 72 72 75 70   pPg.  If corrup
cb20: 74 69 6f 6e 20 69 73 0a 2a 2a 20 64 65 74 65 63  tion is.** detec
cb30: 74 65 64 20 74 68 65 6e 20 2a 70 52 63 20 69 73  ted then *pRc is
cb40: 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 43   set to SQLITE_C
cb50: 4f 52 52 55 50 54 20 61 6e 64 20 4e 55 4c 4c 20  ORRUPT and NULL 
cb60: 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a  is returned..**.
cb70: 2a 2a 20 53 6c 6f 74 73 20 6f 6e 20 74 68 65 20  ** Slots on the 
cb80: 66 72 65 65 20 6c 69 73 74 20 74 68 61 74 20 61  free list that a
cb90: 72 65 20 62 65 74 77 65 65 6e 20 31 20 61 6e 64  re between 1 and
cba0: 20 33 20 62 79 74 65 73 20 6c 61 72 67 65 72 20   3 bytes larger 
cbb0: 74 68 61 6e 20 6e 42 79 74 65 0a 2a 2a 20 77 69  than nByte.** wi
cbc0: 6c 6c 20 62 65 20 69 67 6e 6f 72 65 64 20 69 66  ll be ignored if
cbd0: 20 61 64 64 69 6e 67 20 74 68 65 20 65 78 74 72   adding the extr
cbe0: 61 20 73 70 61 63 65 20 74 6f 20 74 68 65 20 66  a space to the f
cbf0: 72 61 67 6d 65 6e 74 61 74 69 6f 6e 20 63 6f 75  ragmentation cou
cc00: 6e 74 0a 2a 2a 20 63 61 75 73 65 73 20 74 68 65  nt.** causes the
cc10: 20 66 72 61 67 6d 65 6e 74 61 74 69 6f 6e 20 63   fragmentation c
cc20: 6f 75 6e 74 20 74 6f 20 65 78 63 65 65 64 20 36  ount to exceed 6
cc30: 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 38 20  0..*/.static u8 
cc40: 2a 70 61 67 65 46 69 6e 64 53 6c 6f 74 28 4d 65  *pageFindSlot(Me
cc50: 6d 50 61 67 65 20 2a 70 50 67 2c 20 69 6e 74 20  mPage *pPg, int 
cc60: 6e 42 79 74 65 2c 20 69 6e 74 20 2a 70 52 63 29  nByte, int *pRc)
cc70: 7b 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 68 64  {.  const int hd
cc80: 72 20 3d 20 70 50 67 2d 3e 68 64 72 4f 66 66 73  r = pPg->hdrOffs
cc90: 65 74 3b 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74  et;.  u8 * const
cca0: 20 61 44 61 74 61 20 3d 20 70 50 67 2d 3e 61 44   aData = pPg->aD
ccb0: 61 74 61 3b 0a 20 20 69 6e 74 20 69 41 64 64 72  ata;.  int iAddr
ccc0: 20 3d 20 68 64 72 20 2b 20 31 3b 0a 20 20 69 6e   = hdr + 1;.  in
ccd0: 74 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 28  t pc = get2byte(
cce0: 26 61 44 61 74 61 5b 69 41 64 64 72 5d 29 3b 0a  &aData[iAddr]);.
ccf0: 20 20 69 6e 74 20 78 3b 0a 20 20 69 6e 74 20 75    int x;.  int u
cd00: 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 50 67 2d  sableSize = pPg-
cd10: 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
cd20: 3b 0a 20 20 69 6e 74 20 73 69 7a 65 3b 20 20 20  ;.  int size;   
cd30: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
cd40: 20 6f 66 20 74 68 65 20 66 72 65 65 20 73 6c 6f   of the free slo
cd50: 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  t */..  assert( 
cd60: 70 63 3e 30 20 29 3b 0a 20 20 77 68 69 6c 65 28  pc>0 );.  while(
cd70: 20 70 63 3c 3d 75 73 61 62 6c 65 53 69 7a 65 2d   pc<=usableSize-
cd80: 34 20 29 7b 0a 20 20 20 20 2f 2a 20 45 56 49 44  4 ){.    /* EVID
cd90: 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 32 37 31 30  ENCE-OF: R-22710
cda0: 2d 35 33 33 32 38 20 54 68 65 20 74 68 69 72 64  -53328 The third
cdb0: 20 61 6e 64 20 66 6f 75 72 74 68 20 62 79 74 65   and fourth byte
cdc0: 73 20 6f 66 20 65 61 63 68 0a 20 20 20 20 2a 2a  s of each.    **
cdd0: 20 66 72 65 65 62 6c 6f 63 6b 20 66 6f 72 6d 20   freeblock form 
cde0: 61 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74  a big-endian int
cdf0: 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68  eger which is th
ce00: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66 72  e size of the fr
ce10: 65 65 62 6c 6f 63 6b 0a 20 20 20 20 2a 2a 20 69  eeblock.    ** i
ce20: 6e 20 62 79 74 65 73 2c 20 69 6e 63 6c 75 64 69  n bytes, includi
ce30: 6e 67 20 74 68 65 20 34 2d 62 79 74 65 20 68 65  ng the 4-byte he
ce40: 61 64 65 72 2e 20 2a 2f 0a 20 20 20 20 73 69 7a  ader. */.    siz
ce50: 65 20 3d 20 67 65 74 32 62 79 74 65 28 26 61 44  e = get2byte(&aD
ce60: 61 74 61 5b 70 63 2b 32 5d 29 3b 0a 20 20 20 20  ata[pc+2]);.    
ce70: 69 66 28 20 28 78 20 3d 20 73 69 7a 65 20 2d 20  if( (x = size - 
ce80: 6e 42 79 74 65 29 3e 3d 30 20 29 7b 0a 20 20 20  nByte)>=0 ){.   
ce90: 20 20 20 74 65 73 74 63 61 73 65 28 20 78 3d 3d     testcase( x==
cea0: 34 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  4 );.      testc
ceb0: 61 73 65 28 20 78 3d 3d 33 20 29 3b 0a 20 20 20  ase( x==3 );.   
cec0: 20 20 20 69 66 28 20 73 69 7a 65 2b 70 63 20 3e     if( size+pc >
ced0: 20 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20   usableSize ){. 
cee0: 20 20 20 20 20 20 20 2a 70 52 63 20 3d 20 53 51         *pRc = SQ
cef0: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47  LITE_CORRUPT_PAG
cf00: 45 28 70 50 67 29 3b 0a 20 20 20 20 20 20 20 20  E(pPg);.        
cf10: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
cf20: 7d 65 6c 73 65 20 69 66 28 20 78 3c 34 20 29 7b  }else if( x<4 ){
cf30: 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 56 49 44  .        /* EVID
cf40: 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 31 34 39 38  ENCE-OF: R-11498
cf50: 2d 35 38 30 32 32 20 49 6e 20 61 20 77 65 6c 6c  -58022 In a well
cf60: 2d 66 6f 72 6d 65 64 20 62 2d 74 72 65 65 20 70  -formed b-tree p
cf70: 61 67 65 2c 20 74 68 65 20 74 6f 74 61 6c 0a 20  age, the total. 
cf80: 20 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72         ** number
cf90: 20 6f 66 20 62 79 74 65 73 20 69 6e 20 66 72 61   of bytes in fra
cfa0: 67 6d 65 6e 74 73 20 6d 61 79 20 6e 6f 74 20 65  gments may not e
cfb0: 78 63 65 65 64 20 36 30 2e 20 2a 2f 0a 20 20 20  xceed 60. */.   
cfc0: 20 20 20 20 20 69 66 28 20 61 44 61 74 61 5b 68       if( aData[h
cfd0: 64 72 2b 37 5d 3e 35 37 20 29 20 72 65 74 75 72  dr+7]>57 ) retur
cfe0: 6e 20 30 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a  n 0;..        /*
cff0: 20 52 65 6d 6f 76 65 20 74 68 65 20 73 6c 6f 74   Remove the slot
d000: 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 2d 6c   from the free-l
d010: 69 73 74 2e 20 55 70 64 61 74 65 20 74 68 65 20  ist. Update the 
d020: 6e 75 6d 62 65 72 20 6f 66 0a 20 20 20 20 20 20  number of.      
d030: 20 20 2a 2a 20 66 72 61 67 6d 65 6e 74 65 64 20    ** fragmented 
d040: 62 79 74 65 73 20 77 69 74 68 69 6e 20 74 68 65  bytes within the
d050: 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 20 20   page. */.      
d060: 20 20 6d 65 6d 63 70 79 28 26 61 44 61 74 61 5b    memcpy(&aData[
d070: 69 41 64 64 72 5d 2c 20 26 61 44 61 74 61 5b 70  iAddr], &aData[p
d080: 63 5d 2c 20 32 29 3b 0a 20 20 20 20 20 20 20 20  c], 2);.        
d090: 61 44 61 74 61 5b 68 64 72 2b 37 5d 20 2b 3d 20  aData[hdr+7] += 
d0a0: 28 75 38 29 78 3b 0a 20 20 20 20 20 20 7d 65 6c  (u8)x;.      }el
d0b0: 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54  se{.        /* T
d0c0: 68 65 20 73 6c 6f 74 20 72 65 6d 61 69 6e 73 20  he slot remains 
d0d0: 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  on the free-list
d0e0: 2e 20 52 65 64 75 63 65 20 69 74 73 20 73 69 7a  . Reduce its siz
d0f0: 65 20 74 6f 20 61 63 63 6f 75 6e 74 0a 20 20 20  e to account.   
d100: 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 65        ** for the
d110: 20 70 6f 72 74 69 6f 6e 20 75 73 65 64 20 62 79   portion used by
d120: 20 74 68 65 20 6e 65 77 20 61 6c 6c 6f 63 61 74   the new allocat
d130: 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ion. */.        
d140: 70 75 74 32 62 79 74 65 28 26 61 44 61 74 61 5b  put2byte(&aData[
d150: 70 63 2b 32 5d 2c 20 78 29 3b 0a 20 20 20 20 20  pc+2], x);.     
d160: 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   }.      return 
d170: 26 61 44 61 74 61 5b 70 63 20 2b 20 78 5d 3b 0a  &aData[pc + x];.
d180: 20 20 20 20 7d 0a 20 20 20 20 69 41 64 64 72 20      }.    iAddr 
d190: 3d 20 70 63 3b 0a 20 20 20 20 70 63 20 3d 20 67  = pc;.    pc = g
d1a0: 65 74 32 62 79 74 65 28 26 61 44 61 74 61 5b 70  et2byte(&aData[p
d1b0: 63 5d 29 3b 0a 20 20 20 20 69 66 28 20 70 63 3c  c]);.    if( pc<
d1c0: 69 41 64 64 72 2b 73 69 7a 65 20 29 20 62 72 65  iAddr+size ) bre
d1d0: 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 63  ak;.  }.  if( pc
d1e0: 20 29 7b 0a 20 20 20 20 2a 70 52 63 20 3d 20 53   ){.    *pRc = S
d1f0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41  QLITE_CORRUPT_PA
d200: 47 45 28 70 50 67 29 3b 0a 20 20 7d 0a 0a 20 20  GE(pPg);.  }..  
d210: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
d220: 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6e 42 79 74  ** Allocate nByt
d230: 65 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65  e bytes of space
d240: 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 74 68 65   from within the
d250: 20 42 2d 54 72 65 65 20 70 61 67 65 20 70 61 73   B-Tree page pas
d260: 73 65 64 0a 2a 2a 20 61 73 20 74 68 65 20 66 69  sed.** as the fi
d270: 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 57 72  rst argument. Wr
d280: 69 74 65 20 69 6e 74 6f 20 2a 70 49 64 78 20 74  ite into *pIdx t
d290: 68 65 20 69 6e 64 65 78 20 69 6e 74 6f 20 70 50  he index into pP
d2a0: 61 67 65 2d 3e 61 44 61 74 61 5b 5d 0a 2a 2a 20  age->aData[].** 
d2b0: 6f 66 20 74 68 65 20 66 69 72 73 74 20 62 79 74  of the first byt
d2c0: 65 20 6f 66 20 61 6c 6c 6f 63 61 74 65 64 20 73  e of allocated s
d2d0: 70 61 63 65 2e 20 52 65 74 75 72 6e 20 65 69 74  pace. Return eit
d2e0: 68 65 72 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 72  her SQLITE_OK or
d2f0: 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  .** an error cod
d300: 65 20 28 75 73 75 61 6c 6c 79 20 53 51 4c 49 54  e (usually SQLIT
d310: 45 5f 43 4f 52 52 55 50 54 29 2e 0a 2a 2a 0a 2a  E_CORRUPT)..**.*
d320: 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 67 75 61  * The caller gua
d330: 72 61 6e 74 65 65 73 20 74 68 61 74 20 74 68 65  rantees that the
d340: 72 65 20 69 73 20 73 75 66 66 69 63 69 65 6e 74  re is sufficient
d350: 20 73 70 61 63 65 20 74 6f 20 6d 61 6b 65 20 74   space to make t
d360: 68 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e  he.** allocation
d370: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
d380: 6d 69 67 68 74 20 6e 65 65 64 20 74 6f 20 64 65  might need to de
d390: 66 72 61 67 6d 65 6e 74 20 69 6e 20 6f 72 64 65  fragment in orde
d3a0: 72 20 74 6f 20 62 72 69 6e 67 0a 2a 2a 20 61 6c  r to bring.** al
d3b0: 6c 20 74 68 65 20 73 70 61 63 65 20 74 6f 67 65  l the space toge
d3c0: 74 68 65 72 2c 20 68 6f 77 65 76 65 72 2e 20 20  ther, however.  
d3d0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  This routine wil
d3e0: 6c 20 61 76 6f 69 64 20 75 73 69 6e 67 0a 2a 2a  l avoid using.**
d3f0: 20 74 68 65 20 66 69 72 73 74 20 74 77 6f 20 62   the first two b
d400: 79 74 65 73 20 70 61 73 74 20 74 68 65 20 63 65  ytes past the ce
d410: 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 65 61 20  ll pointer area 
d420: 73 69 6e 63 65 20 70 72 65 73 75 6d 61 62 6c 79  since presumably
d430: 20 74 68 69 73 0a 2a 2a 20 61 6c 6c 6f 63 61 74   this.** allocat
d440: 69 6f 6e 20 69 73 20 62 65 69 6e 67 20 6d 61 64  ion is being mad
d450: 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 69 6e  e in order to in
d460: 73 65 72 74 20 61 20 6e 65 77 20 63 65 6c 6c 2c  sert a new cell,
d470: 20 73 6f 20 77 65 20 77 69 6c 6c 0a 2a 2a 20 61   so we will.** a
d480: 6c 73 6f 20 65 6e 64 20 75 70 20 6e 65 65 64 69  lso end up needi
d490: 6e 67 20 61 20 6e 65 77 20 63 65 6c 6c 20 70 6f  ng a new cell po
d4a0: 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  inter..*/.static
d4b0: 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 53 70 61   int allocateSpa
d4c0: 63 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ce(MemPage *pPag
d4d0: 65 2c 20 69 6e 74 20 6e 42 79 74 65 2c 20 69 6e  e, int nByte, in
d4e0: 74 20 2a 70 49 64 78 29 7b 0a 20 20 63 6f 6e 73  t *pIdx){.  cons
d4f0: 74 20 69 6e 74 20 68 64 72 20 3d 20 70 50 61 67  t int hdr = pPag
d500: 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 20 20 20  e->hdrOffset;   
d510: 20 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65 20   /* Local cache 
d520: 6f 66 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  of pPage->hdrOff
d530: 73 65 74 20 2a 2f 0a 20 20 75 38 20 2a 20 63 6f  set */.  u8 * co
d540: 6e 73 74 20 64 61 74 61 20 3d 20 70 50 61 67 65  nst data = pPage
d550: 2d 3e 61 44 61 74 61 3b 20 20 20 20 20 20 2f 2a  ->aData;      /*
d560: 20 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f 66 20   Local cache of 
d570: 70 50 61 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a  pPage->aData */.
d580: 20 20 69 6e 74 20 74 6f 70 3b 20 20 20 20 20 20    int top;      
d590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d5a0: 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
d5b0: 62 79 74 65 20 6f 66 20 63 65 6c 6c 20 63 6f 6e  byte of cell con
d5c0: 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20 69  tent area */.  i
d5d0: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
d5e0: 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  K;              
d5f0: 20 20 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 72      /* Integer r
d600: 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
d610: 69 6e 74 20 67 61 70 3b 20 20 20 20 20 20 20 20  int gap;        
d620: 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f 66  /* First byte of
d630: 20 67 61 70 20 62 65 74 77 65 65 6e 20 63 65 6c   gap between cel
d640: 6c 20 70 6f 69 6e 74 65 72 73 20 61 6e 64 20 63  l pointers and c
d650: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20  ell content */. 
d660: 20 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69   .  assert( sqli
d670: 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
d680: 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
d690: 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ge) );.  assert(
d6a0: 20 70 50 61 67 65 2d 3e 70 42 74 20 29 3b 0a 20   pPage->pBt );. 
d6b0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
d6c0: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
d6d0: 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
d6e0: 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 42 79 74  ;.  assert( nByt
d6f0: 65 3e 3d 30 20 29 3b 20 20 2f 2a 20 4d 69 6e 69  e>=0 );  /* Mini
d700: 6d 75 6d 20 63 65 6c 6c 20 73 69 7a 65 20 69 73  mum cell size is
d710: 20 34 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20   4 */.  assert( 
d720: 70 50 61 67 65 2d 3e 6e 46 72 65 65 3e 3d 6e 42  pPage->nFree>=nB
d730: 79 74 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  yte );.  assert(
d740: 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
d750: 77 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  w==0 );.  assert
d760: 28 20 6e 42 79 74 65 20 3c 20 28 69 6e 74 29 28  ( nByte < (int)(
d770: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
d780: 6c 65 53 69 7a 65 2d 38 29 20 29 3b 0a 0a 20 20  leSize-8) );..  
d790: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 63  assert( pPage->c
d7a0: 65 6c 6c 4f 66 66 73 65 74 20 3d 3d 20 68 64 72  ellOffset == hdr
d7b0: 20 2b 20 31 32 20 2d 20 34 2a 70 50 61 67 65 2d   + 12 - 4*pPage-
d7c0: 3e 6c 65 61 66 20 29 3b 0a 20 20 67 61 70 20 3d  >leaf );.  gap =
d7d0: 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73   pPage->cellOffs
d7e0: 65 74 20 2b 20 32 2a 70 50 61 67 65 2d 3e 6e 43  et + 2*pPage->nC
d7f0: 65 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28 20 67  ell;.  assert( g
d800: 61 70 3c 3d 36 35 35 33 36 20 29 3b 0a 20 20 2f  ap<=65536 );.  /
d810: 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
d820: 2d 32 39 33 35 36 2d 30 32 33 39 31 20 49 66 20  -29356-02391 If 
d830: 74 68 65 20 64 61 74 61 62 61 73 65 20 75 73 65  the database use
d840: 73 20 61 20 36 35 35 33 36 2d 62 79 74 65 20 70  s a 65536-byte p
d850: 61 67 65 20 73 69 7a 65 0a 20 20 2a 2a 20 61 6e  age size.  ** an
d860: 64 20 74 68 65 20 72 65 73 65 72 76 65 64 20 73  d the reserved s
d870: 70 61 63 65 20 69 73 20 7a 65 72 6f 20 28 74 68  pace is zero (th
d880: 65 20 75 73 75 61 6c 20 76 61 6c 75 65 20 66 6f  e usual value fo
d890: 72 20 72 65 73 65 72 76 65 64 20 73 70 61 63 65  r reserved space
d8a0: 29 0a 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 20  ).  ** then the 
d8b0: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 6f 66 66  cell content off
d8c0: 73 65 74 20 6f 66 20 61 6e 20 65 6d 70 74 79 20  set of an empty 
d8d0: 70 61 67 65 20 77 61 6e 74 73 20 74 6f 20 62 65  page wants to be
d8e0: 20 36 35 35 33 36 2e 0a 20 20 2a 2a 20 48 6f 77   65536..  ** How
d8f0: 65 76 65 72 2c 20 74 68 61 74 20 69 6e 74 65 67  ever, that integ
d900: 65 72 20 69 73 20 74 6f 6f 20 6c 61 72 67 65 20  er is too large 
d910: 74 6f 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20  to be stored in 
d920: 61 20 32 2d 62 79 74 65 20 75 6e 73 69 67 6e 65  a 2-byte unsigne
d930: 64 0a 20 20 2a 2a 20 69 6e 74 65 67 65 72 2c 20  d.  ** integer, 
d940: 73 6f 20 61 20 76 61 6c 75 65 20 6f 66 20 30 20  so a value of 0 
d950: 69 73 20 75 73 65 64 20 69 6e 20 69 74 73 20 70  is used in its p
d960: 6c 61 63 65 2e 20 2a 2f 0a 20 20 74 6f 70 20 3d  lace. */.  top =
d970: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
d980: 68 64 72 2b 35 5d 29 3b 0a 20 20 61 73 73 65 72  hdr+5]);.  asser
d990: 74 28 20 74 6f 70 3c 3d 28 69 6e 74 29 70 50 61  t( top<=(int)pPa
d9a0: 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
d9b0: 69 7a 65 20 29 3b 20 2f 2a 20 50 72 65 76 65 6e  ize ); /* Preven
d9c0: 74 20 62 79 20 67 65 74 41 6e 64 49 6e 69 74 50  t by getAndInitP
d9d0: 61 67 65 28 29 20 2a 2f 0a 20 20 69 66 28 20 67  age() */.  if( g
d9e0: 61 70 3e 74 6f 70 20 29 7b 0a 20 20 20 20 69 66  ap>top ){.    if
d9f0: 28 20 74 6f 70 3d 3d 30 20 26 26 20 70 50 61 67  ( top==0 && pPag
da00: 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
da10: 7a 65 3d 3d 36 35 35 33 36 20 29 7b 0a 20 20 20  ze==65536 ){.   
da20: 20 20 20 74 6f 70 20 3d 20 36 35 35 33 36 3b 0a     top = 65536;.
da30: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
da40: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
da50: 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50 61 67  ORRUPT_PAGE(pPag
da60: 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  e);.    }.  }.. 
da70: 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20   /* If there is 
da80: 65 6e 6f 75 67 68 20 73 70 61 63 65 20 62 65 74  enough space bet
da90: 77 65 65 6e 20 67 61 70 20 61 6e 64 20 74 6f 70  ween gap and top
daa0: 20 66 6f 72 20 6f 6e 65 20 6d 6f 72 65 20 63 65   for one more ce
dab0: 6c 6c 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20  ll pointer.  ** 
dac0: 61 72 72 61 79 20 65 6e 74 72 79 20 6f 66 66 73  array entry offs
dad0: 65 74 2c 20 61 6e 64 20 69 66 20 74 68 65 20 66  et, and if the f
dae0: 72 65 65 6c 69 73 74 20 69 73 20 6e 6f 74 20 65  reelist is not e
daf0: 6d 70 74 79 2c 20 74 68 65 6e 20 73 65 61 72 63  mpty, then searc
db00: 68 20 74 68 65 0a 20 20 2a 2a 20 66 72 65 65 6c  h the.  ** freel
db10: 69 73 74 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20  ist looking for 
db20: 61 20 66 72 65 65 20 73 6c 6f 74 20 62 69 67 20  a free slot big 
db30: 65 6e 6f 75 67 68 20 74 6f 20 73 61 74 69 73 66  enough to satisf
db40: 79 20 74 68 65 20 72 65 71 75 65 73 74 2e 0a 20  y the request.. 
db50: 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20   */.  testcase( 
db60: 67 61 70 2b 32 3d 3d 74 6f 70 20 29 3b 0a 20 20  gap+2==top );.  
db70: 74 65 73 74 63 61 73 65 28 20 67 61 70 2b 31 3d  testcase( gap+1=
db80: 3d 74 6f 70 20 29 3b 0a 20 20 74 65 73 74 63 61  =top );.  testca
db90: 73 65 28 20 67 61 70 3d 3d 74 6f 70 20 29 3b 0a  se( gap==top );.
dba0: 20 20 69 66 28 20 28 64 61 74 61 5b 68 64 72 2b    if( (data[hdr+
dbb0: 32 5d 20 7c 7c 20 64 61 74 61 5b 68 64 72 2b 31  2] || data[hdr+1
dbc0: 5d 29 20 26 26 20 67 61 70 2b 32 3c 3d 74 6f 70  ]) && gap+2<=top
dbd0: 20 29 7b 0a 20 20 20 20 75 38 20 2a 70 53 70 61   ){.    u8 *pSpa
dbe0: 63 65 20 3d 20 70 61 67 65 46 69 6e 64 53 6c 6f  ce = pageFindSlo
dbf0: 74 28 70 50 61 67 65 2c 20 6e 42 79 74 65 2c 20  t(pPage, nByte, 
dc00: 26 72 63 29 3b 0a 20 20 20 20 69 66 28 20 70 53  &rc);.    if( pS
dc10: 70 61 63 65 20 29 7b 0a 20 20 20 20 20 20 61 73  pace ){.      as
dc20: 73 65 72 74 28 20 70 53 70 61 63 65 3e 3d 64 61  sert( pSpace>=da
dc30: 74 61 20 26 26 20 28 70 53 70 61 63 65 20 2d 20  ta && (pSpace - 
dc40: 64 61 74 61 29 3c 36 35 35 33 36 20 29 3b 0a 20  data)<65536 );. 
dc50: 20 20 20 20 20 2a 70 49 64 78 20 3d 20 28 69 6e       *pIdx = (in
dc60: 74 29 28 70 53 70 61 63 65 20 2d 20 64 61 74 61  t)(pSpace - data
dc70: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
dc80: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
dc90: 65 6c 73 65 20 69 66 28 20 72 63 20 29 7b 0a 20  else if( rc ){. 
dca0: 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
dcb0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
dcc0: 54 68 65 20 72 65 71 75 65 73 74 20 63 6f 75 6c  The request coul
dcd0: 64 20 6e 6f 74 20 62 65 20 66 75 6c 66 69 6c 6c  d not be fulfill
dce0: 65 64 20 75 73 69 6e 67 20 61 20 66 72 65 65 6c  ed using a freel
dcf0: 69 73 74 20 73 6c 6f 74 2e 20 20 43 68 65 63 6b  ist slot.  Check
dd00: 0a 20 20 2a 2a 20 74 6f 20 73 65 65 20 69 66 20  .  ** to see if 
dd10: 64 65 66 72 61 67 6d 65 6e 74 61 74 69 6f 6e 20  defragmentation 
dd20: 69 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 20 20  is necessary..  
dd30: 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20 67  */.  testcase( g
dd40: 61 70 2b 32 2b 6e 42 79 74 65 3d 3d 74 6f 70 20  ap+2+nByte==top 
dd50: 29 3b 0a 20 20 69 66 28 20 67 61 70 2b 32 2b 6e  );.  if( gap+2+n
dd60: 42 79 74 65 3e 74 6f 70 20 29 7b 0a 20 20 20 20  Byte>top ){.    
dd70: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
dd80: 43 65 6c 6c 3e 30 20 7c 7c 20 43 4f 52 52 55 50  Cell>0 || CORRUP
dd90: 54 5f 44 42 20 29 3b 0a 20 20 20 20 72 63 20 3d  T_DB );.    rc =
dda0: 20 64 65 66 72 61 67 6d 65 6e 74 50 61 67 65 28   defragmentPage(
ddb0: 70 50 61 67 65 2c 20 4d 49 4e 28 34 2c 20 70 50  pPage, MIN(4, pP
ddc0: 61 67 65 2d 3e 6e 46 72 65 65 20 2d 20 28 32 2b  age->nFree - (2+
ddd0: 6e 42 79 74 65 29 29 29 3b 0a 20 20 20 20 69 66  nByte)));.    if
dde0: 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
ddf0: 3b 0a 20 20 20 20 74 6f 70 20 3d 20 67 65 74 32  ;.    top = get2
de00: 62 79 74 65 4e 6f 74 5a 65 72 6f 28 26 64 61 74  byteNotZero(&dat
de10: 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20 61  a[hdr+5]);.    a
de20: 73 73 65 72 74 28 20 67 61 70 2b 32 2b 6e 42 79  ssert( gap+2+nBy
de30: 74 65 3c 3d 74 6f 70 20 29 3b 0a 20 20 7d 0a 0a  te<=top );.  }..
de40: 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 6d  .  /* Allocate m
de50: 65 6d 6f 72 79 20 66 72 6f 6d 20 74 68 65 20 67  emory from the g
de60: 61 70 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68  ap in between th
de70: 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61  e cell pointer a
de80: 72 72 61 79 0a 20 20 2a 2a 20 61 6e 64 20 74 68  rray.  ** and th
de90: 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61  e cell content a
dea0: 72 65 61 2e 20 20 54 68 65 20 62 74 72 65 65 49  rea.  The btreeI
deb0: 6e 69 74 50 61 67 65 28 29 20 63 61 6c 6c 20 68  nitPage() call h
dec0: 61 73 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20  as already.  ** 
ded0: 76 61 6c 69 64 61 74 65 64 20 74 68 65 20 66 72  validated the fr
dee0: 65 65 6c 69 73 74 2e 20 20 47 69 76 65 6e 20 74  eelist.  Given t
def0: 68 61 74 20 74 68 65 20 66 72 65 65 6c 69 73 74  hat the freelist
df00: 20 69 73 20 76 61 6c 69 64 2c 20 74 68 65 72 65   is valid, there
df10: 0a 20 20 2a 2a 20 69 73 20 6e 6f 20 77 61 79 20  .  ** is no way 
df20: 74 68 61 74 20 74 68 65 20 61 6c 6c 6f 63 61 74  that the allocat
df30: 69 6f 6e 20 63 61 6e 20 65 78 74 65 6e 64 20 6f  ion can extend o
df40: 66 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  ff the end of th
df50: 65 20 70 61 67 65 2e 0a 20 20 2a 2a 20 54 68 65  e page..  ** The
df60: 20 61 73 73 65 72 74 28 29 20 62 65 6c 6f 77 20   assert() below 
df70: 76 65 72 69 66 69 65 73 20 74 68 65 20 70 72 65  verifies the pre
df80: 76 69 6f 75 73 20 73 65 6e 74 65 6e 63 65 2e 0a  vious sentence..
df90: 20 20 2a 2f 0a 20 20 74 6f 70 20 2d 3d 20 6e 42    */.  top -= nB
dfa0: 79 74 65 3b 0a 20 20 70 75 74 32 62 79 74 65 28  yte;.  put2byte(
dfb0: 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 74 6f  &data[hdr+5], to
dfc0: 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 74 6f  p);.  assert( to
dfd0: 70 2b 6e 42 79 74 65 20 3c 3d 20 28 69 6e 74 29  p+nByte <= (int)
dfe0: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
dff0: 6c 65 53 69 7a 65 20 29 3b 0a 20 20 2a 70 49 64  leSize );.  *pId
e000: 78 20 3d 20 74 6f 70 3b 0a 20 20 72 65 74 75 72  x = top;.  retur
e010: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
e020: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 73  /*.** Return a s
e030: 65 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 50  ection of the pP
e040: 61 67 65 2d 3e 61 44 61 74 61 20 74 6f 20 74 68  age->aData to th
e050: 65 20 66 72 65 65 6c 69 73 74 2e 0a 2a 2a 20 54  e freelist..** T
e060: 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66  he first byte of
e070: 20 74 68 65 20 6e 65 77 20 66 72 65 65 20 62 6c   the new free bl
e080: 6f 63 6b 20 69 73 20 70 50 61 67 65 2d 3e 61 44  ock is pPage->aD
e090: 61 74 61 5b 69 53 74 61 72 74 5d 0a 2a 2a 20 61  ata[iStart].** a
e0a0: 6e 64 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  nd the size of t
e0b0: 68 65 20 62 6c 6f 63 6b 20 69 73 20 69 53 69 7a  he block is iSiz
e0c0: 65 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 41  e bytes..**.** A
e0d0: 64 6a 61 63 65 6e 74 20 66 72 65 65 62 6c 6f 63  djacent freebloc
e0e0: 6b 73 20 61 72 65 20 63 6f 61 6c 65 73 63 65 64  ks are coalesced
e0f0: 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61  ..**.** Note tha
e100: 74 20 65 76 65 6e 20 74 68 6f 75 67 68 20 74 68  t even though th
e110: 65 20 66 72 65 65 62 6c 6f 63 6b 20 6c 69 73 74  e freeblock list
e120: 20 77 61 73 20 63 68 65 63 6b 65 64 20 62 79 20   was checked by 
e130: 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 2c  btreeInitPage(),
e140: 0a 2a 2a 20 74 68 61 74 20 72 6f 75 74 69 6e 65  .** that routine
e150: 20 77 69 6c 6c 20 6e 6f 74 20 64 65 74 65 63 74   will not detect
e160: 20 6f 76 65 72 6c 61 70 20 62 65 74 77 65 65 6e   overlap between
e170: 20 63 65 6c 6c 73 20 6f 72 20 66 72 65 65 62 6c   cells or freebl
e180: 6f 63 6b 73 2e 20 20 4e 6f 72 0a 2a 2a 20 64 6f  ocks.  Nor.** do
e190: 65 73 20 69 74 20 64 65 74 65 63 74 20 63 65 6c  es it detect cel
e1a0: 6c 73 20 6f 72 20 66 72 65 65 62 6c 6f 63 6b 73  ls or freeblocks
e1b0: 20 74 68 61 74 20 65 6e 63 72 6f 75 63 68 20 69   that encrouch i
e1c0: 6e 74 6f 20 74 68 65 20 72 65 73 65 72 76 65 64  nto the reserved
e1d0: 20 62 79 74 65 73 0a 2a 2a 20 61 74 20 74 68 65   bytes.** at the
e1e0: 20 65 6e 64 20 6f 66 20 74 68 65 20 70 61 67 65   end of the page
e1f0: 2e 20 20 53 6f 20 64 6f 20 61 64 64 69 74 69 6f  .  So do additio
e200: 6e 61 6c 20 63 6f 72 72 75 70 74 69 6f 6e 20 63  nal corruption c
e210: 68 65 63 6b 73 20 69 6e 73 69 64 65 20 74 68 69  hecks inside thi
e220: 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 61 6e 64  s.** routine and
e230: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
e240: 4f 52 52 55 50 54 20 69 66 20 61 6e 79 20 70 72  ORRUPT if any pr
e250: 6f 62 6c 65 6d 73 20 61 72 65 20 66 6f 75 6e 64  oblems are found
e260: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
e270: 66 72 65 65 53 70 61 63 65 28 4d 65 6d 50 61 67  freeSpace(MemPag
e280: 65 20 2a 70 50 61 67 65 2c 20 75 31 36 20 69 53  e *pPage, u16 iS
e290: 74 61 72 74 2c 20 75 31 36 20 69 53 69 7a 65 29  tart, u16 iSize)
e2a0: 7b 0a 20 20 75 31 36 20 69 50 74 72 3b 20 20 20  {.  u16 iPtr;   
e2b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e2c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
e2d0: 72 65 73 73 20 6f 66 20 70 74 72 20 74 6f 20 6e  ress of ptr to n
e2e0: 65 78 74 20 66 72 65 65 62 6c 6f 63 6b 20 2a 2f  ext freeblock */
e2f0: 0a 20 20 75 31 36 20 69 46 72 65 65 42 6c 6b 3b  .  u16 iFreeBlk;
e300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e310: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
e320: 65 73 73 20 6f 66 20 74 68 65 20 6e 65 78 74 20  ess of the next 
e330: 66 72 65 65 62 6c 6f 63 6b 20 2a 2f 0a 20 20 75  freeblock */.  u
e340: 38 20 68 64 72 3b 20 20 20 20 20 20 20 20 20 20  8 hdr;          
e350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e360: 20 20 20 20 20 2f 2a 20 50 61 67 65 20 68 65 61       /* Page hea
e370: 64 65 72 20 73 69 7a 65 2e 20 20 30 20 6f 72 20  der size.  0 or 
e380: 31 30 30 20 2a 2f 0a 20 20 75 38 20 6e 46 72 61  100 */.  u8 nFra
e390: 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  g = 0;          
e3a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
e3b0: 2a 20 52 65 64 75 63 74 69 6f 6e 20 69 6e 20 66  * Reduction in f
e3c0: 72 61 67 6d 65 6e 74 61 74 69 6f 6e 20 2a 2f 0a  ragmentation */.
e3d0: 20 20 75 31 36 20 69 4f 72 69 67 53 69 7a 65 20    u16 iOrigSize 
e3e0: 3d 20 69 53 69 7a 65 3b 20 20 20 20 20 20 20 20  = iSize;        
e3f0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69          /* Origi
e400: 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 69 53 69  nal value of iSi
e410: 7a 65 20 2a 2f 0a 20 20 75 31 36 20 78 3b 20 20  ze */.  u16 x;  
e420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
e440: 20 4f 66 66 73 65 74 20 74 6f 20 63 65 6c 6c 20   Offset to cell 
e450: 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a  content area */.
e460: 20 20 75 33 32 20 69 45 6e 64 20 3d 20 69 53 74    u32 iEnd = iSt
e470: 61 72 74 20 2b 20 69 53 69 7a 65 3b 20 20 20 20  art + iSize;    
e480: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
e490: 20 62 79 74 65 20 70 61 73 74 20 74 68 65 20 69   byte past the i
e4a0: 53 74 61 72 74 20 62 75 66 66 65 72 20 2a 2f 0a  Start buffer */.
e4b0: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
e4c0: 2a 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61  *data = pPage->a
e4d0: 44 61 74 61 3b 20 20 20 2f 2a 20 50 61 67 65 20  Data;   /* Page 
e4e0: 63 6f 6e 74 65 6e 74 20 2a 2f 0a 0a 20 20 61 73  content */..  as
e4f0: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74  sert( pPage->pBt
e500: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
e510: 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
e520: 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
e530: 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73  pDbPage) );.  as
e540: 73 65 72 74 28 20 43 4f 52 52 55 50 54 5f 44 42  sert( CORRUPT_DB
e550: 20 7c 7c 20 69 53 74 61 72 74 3e 3d 70 50 61 67   || iStart>=pPag
e560: 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 36 2b 70  e->hdrOffset+6+p
e570: 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69  Page->childPtrSi
e580: 7a 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ze );.  assert( 
e590: 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20 69 45  CORRUPT_DB || iE
e5a0: 6e 64 20 3c 3d 20 70 50 61 67 65 2d 3e 70 42 74  nd <= pPage->pBt
e5b0: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a  ->usableSize );.
e5c0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
e5d0: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
e5e0: 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
e5f0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 53 69  );.  assert( iSi
e600: 7a 65 3e 3d 34 20 29 3b 20 20 20 2f 2a 20 4d 69  ze>=4 );   /* Mi
e610: 6e 69 6d 75 6d 20 63 65 6c 6c 20 73 69 7a 65 20  nimum cell size 
e620: 69 73 20 34 20 2a 2f 0a 20 20 61 73 73 65 72 74  is 4 */.  assert
e630: 28 20 69 53 74 61 72 74 3c 3d 70 50 61 67 65 2d  ( iStart<=pPage-
e640: 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
e650: 2d 34 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  -4 );..  /* The 
e660: 6c 69 73 74 20 6f 66 20 66 72 65 65 62 6c 6f 63  list of freebloc
e670: 6b 73 20 6d 75 73 74 20 62 65 20 69 6e 20 61 73  ks must be in as
e680: 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 20 20  cending order.  
e690: 46 69 6e 64 20 74 68 65 20 0a 20 20 2a 2a 20 73  Find the .  ** s
e6a0: 70 6f 74 20 6f 6e 20 74 68 65 20 6c 69 73 74 20  pot on the list 
e6b0: 77 68 65 72 65 20 69 53 74 61 72 74 20 73 68 6f  where iStart sho
e6c0: 75 6c 64 20 62 65 20 69 6e 73 65 72 74 65 64 2e  uld be inserted.
e6d0: 0a 20 20 2a 2f 0a 20 20 68 64 72 20 3d 20 70 50  .  */.  hdr = pP
e6e0: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a  age->hdrOffset;.
e6f0: 20 20 69 50 74 72 20 3d 20 68 64 72 20 2b 20 31    iPtr = hdr + 1
e700: 3b 0a 20 20 69 66 28 20 64 61 74 61 5b 69 50 74  ;.  if( data[iPt
e710: 72 2b 31 5d 3d 3d 30 20 26 26 20 64 61 74 61 5b  r+1]==0 && data[
e720: 69 50 74 72 5d 3d 3d 30 20 29 7b 0a 20 20 20 20  iPtr]==0 ){.    
e730: 69 46 72 65 65 42 6c 6b 20 3d 20 30 3b 20 20 2f  iFreeBlk = 0;  /
e740: 2a 20 53 68 6f 72 74 63 75 74 20 66 6f 72 20 74  * Shortcut for t
e750: 68 65 20 63 61 73 65 20 77 68 65 6e 20 74 68 65  he case when the
e760: 20 66 72 65 65 6c 69 73 74 20 69 73 20 65 6d 70   freelist is emp
e770: 74 79 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20  ty */.  }else{. 
e780: 20 20 20 77 68 69 6c 65 28 20 28 69 46 72 65 65     while( (iFree
e790: 42 6c 6b 20 3d 20 67 65 74 32 62 79 74 65 28 26  Blk = get2byte(&
e7a0: 64 61 74 61 5b 69 50 74 72 5d 29 29 3c 69 53 74  data[iPtr]))<iSt
e7b0: 61 72 74 20 29 7b 0a 20 20 20 20 20 20 69 66 28  art ){.      if(
e7c0: 20 69 46 72 65 65 42 6c 6b 3c 69 50 74 72 2b 34   iFreeBlk<iPtr+4
e7d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
e7e0: 69 46 72 65 65 42 6c 6b 3d 3d 30 20 29 20 62 72  iFreeBlk==0 ) br
e7f0: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 72 65 74  eak;.        ret
e800: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
e810: 50 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a  PT_PAGE(pPage);.
e820: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 50        }.      iP
e830: 74 72 20 3d 20 69 46 72 65 65 42 6c 6b 3b 0a 20  tr = iFreeBlk;. 
e840: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 46 72     }.    if( iFr
e850: 65 65 42 6c 6b 3e 70 50 61 67 65 2d 3e 70 42 74  eeBlk>pPage->pBt
e860: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34 20 29  ->usableSize-4 )
e870: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
e880: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41  QLITE_CORRUPT_PA
e890: 47 45 28 70 50 61 67 65 29 3b 0a 20 20 20 20 7d  GE(pPage);.    }
e8a0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 46 72  .    assert( iFr
e8b0: 65 65 42 6c 6b 3e 69 50 74 72 20 7c 7c 20 69 46  eeBlk>iPtr || iF
e8c0: 72 65 65 42 6c 6b 3d 3d 30 20 29 3b 0a 20 20 0a  reeBlk==0 );.  .
e8d0: 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70      /* At this p
e8e0: 6f 69 6e 74 3a 0a 20 20 20 20 2a 2a 20 20 20 20  oint:.    **    
e8f0: 69 46 72 65 65 42 6c 6b 3a 20 20 20 46 69 72 73  iFreeBlk:   Firs
e900: 74 20 66 72 65 65 62 6c 6f 63 6b 20 61 66 74 65  t freeblock afte
e910: 72 20 69 53 74 61 72 74 2c 20 6f 72 20 7a 65 72  r iStart, or zer
e920: 6f 20 69 66 20 6e 6f 6e 65 0a 20 20 20 20 2a 2a  o if none.    **
e930: 20 20 20 20 69 50 74 72 3a 20 20 20 20 20 20 20      iPtr:       
e940: 54 68 65 20 61 64 64 72 65 73 73 20 6f 66 20 61  The address of a
e950: 20 70 6f 69 6e 74 65 72 20 74 6f 20 69 46 72 65   pointer to iFre
e960: 65 42 6c 6b 0a 20 20 20 20 2a 2a 0a 20 20 20 20  eBlk.    **.    
e970: 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  ** Check to see 
e980: 69 66 20 69 46 72 65 65 42 6c 6b 20 73 68 6f 75  if iFreeBlk shou
e990: 6c 64 20 62 65 20 63 6f 61 6c 65 73 63 65 64 20  ld be coalesced 
e9a0: 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  onto the end of 
e9b0: 69 53 74 61 72 74 2e 0a 20 20 20 20 2a 2f 0a 20  iStart..    */. 
e9c0: 20 20 20 69 66 28 20 69 46 72 65 65 42 6c 6b 20     if( iFreeBlk 
e9d0: 26 26 20 69 45 6e 64 2b 33 3e 3d 69 46 72 65 65  && iEnd+3>=iFree
e9e0: 42 6c 6b 20 29 7b 0a 20 20 20 20 20 20 6e 46 72  Blk ){.      nFr
e9f0: 61 67 20 3d 20 69 46 72 65 65 42 6c 6b 20 2d 20  ag = iFreeBlk - 
ea00: 69 45 6e 64 3b 0a 20 20 20 20 20 20 69 66 28 20  iEnd;.      if( 
ea10: 69 45 6e 64 3e 69 46 72 65 65 42 6c 6b 20 29 20  iEnd>iFreeBlk ) 
ea20: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
ea30: 52 52 55 50 54 5f 50 41 47 45 28 70 50 61 67 65  RRUPT_PAGE(pPage
ea40: 29 3b 0a 20 20 20 20 20 20 69 45 6e 64 20 3d 20  );.      iEnd = 
ea50: 69 46 72 65 65 42 6c 6b 20 2b 20 67 65 74 32 62  iFreeBlk + get2b
ea60: 79 74 65 28 26 64 61 74 61 5b 69 46 72 65 65 42  yte(&data[iFreeB
ea70: 6c 6b 2b 32 5d 29 3b 0a 20 20 20 20 20 20 69 66  lk+2]);.      if
ea80: 28 20 69 45 6e 64 20 3e 20 70 50 61 67 65 2d 3e  ( iEnd > pPage->
ea90: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
eaa0: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
eab0: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
eac0: 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20  _PAGE(pPage);.  
ead0: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 53 69 7a      }.      iSiz
eae0: 65 20 3d 20 69 45 6e 64 20 2d 20 69 53 74 61 72  e = iEnd - iStar
eaf0: 74 3b 0a 20 20 20 20 20 20 69 46 72 65 65 42 6c  t;.      iFreeBl
eb00: 6b 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  k = get2byte(&da
eb10: 74 61 5b 69 46 72 65 65 42 6c 6b 5d 29 3b 0a 20  ta[iFreeBlk]);. 
eb20: 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49     }.  .    /* I
eb30: 66 20 69 50 74 72 20 69 73 20 61 6e 6f 74 68 65  f iPtr is anothe
eb40: 72 20 66 72 65 65 62 6c 6f 63 6b 20 28 74 68 61  r freeblock (tha
eb50: 74 20 69 73 2c 20 69 66 20 69 50 74 72 20 69 73  t is, if iPtr is
eb60: 20 6e 6f 74 20 74 68 65 20 66 72 65 65 6c 69 73   not the freelis
eb70: 74 0a 20 20 20 20 2a 2a 20 70 6f 69 6e 74 65 72  t.    ** pointer
eb80: 20 69 6e 20 74 68 65 20 70 61 67 65 20 68 65 61   in the page hea
eb90: 64 65 72 29 20 74 68 65 6e 20 63 68 65 63 6b 20  der) then check 
eba0: 74 6f 20 73 65 65 20 69 66 20 69 53 74 61 72 74  to see if iStart
ebb0: 20 73 68 6f 75 6c 64 20 62 65 0a 20 20 20 20 2a   should be.    *
ebc0: 2a 20 63 6f 61 6c 65 73 63 65 64 20 6f 6e 74 6f  * coalesced onto
ebd0: 20 74 68 65 20 65 6e 64 20 6f 66 20 69 50 74 72   the end of iPtr
ebe0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
ebf0: 20 69 50 74 72 3e 68 64 72 2b 31 20 29 7b 0a 20   iPtr>hdr+1 ){. 
ec00: 20 20 20 20 20 69 6e 74 20 69 50 74 72 45 6e 64       int iPtrEnd
ec10: 20 3d 20 69 50 74 72 20 2b 20 67 65 74 32 62 79   = iPtr + get2by
ec20: 74 65 28 26 64 61 74 61 5b 69 50 74 72 2b 32 5d  te(&data[iPtr+2]
ec30: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 50 74  );.      if( iPt
ec40: 72 45 6e 64 2b 33 3e 3d 69 53 74 61 72 74 20 29  rEnd+3>=iStart )
ec50: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 50  {.        if( iP
ec60: 74 72 45 6e 64 3e 69 53 74 61 72 74 20 29 20 72  trEnd>iStart ) r
ec70: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
ec80: 52 55 50 54 5f 50 41 47 45 28 70 50 61 67 65 29  RUPT_PAGE(pPage)
ec90: 3b 0a 20 20 20 20 20 20 20 20 6e 46 72 61 67 20  ;.        nFrag 
eca0: 2b 3d 20 69 53 74 61 72 74 20 2d 20 69 50 74 72  += iStart - iPtr
ecb0: 45 6e 64 3b 0a 20 20 20 20 20 20 20 20 69 53 69  End;.        iSi
ecc0: 7a 65 20 3d 20 69 45 6e 64 20 2d 20 69 50 74 72  ze = iEnd - iPtr
ecd0: 3b 0a 20 20 20 20 20 20 20 20 69 53 74 61 72 74  ;.        iStart
ece0: 20 3d 20 69 50 74 72 3b 0a 20 20 20 20 20 20 7d   = iPtr;.      }
ecf0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e  .    }.    if( n
ed00: 46 72 61 67 3e 64 61 74 61 5b 68 64 72 2b 37 5d  Frag>data[hdr+7]
ed10: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
ed20: 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50  _CORRUPT_PAGE(pP
ed30: 61 67 65 29 3b 0a 20 20 20 20 64 61 74 61 5b 68  age);.    data[h
ed40: 64 72 2b 37 5d 20 2d 3d 20 6e 46 72 61 67 3b 0a  dr+7] -= nFrag;.
ed50: 20 20 7d 0a 20 20 78 20 3d 20 67 65 74 32 62 79    }.  x = get2by
ed60: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29  te(&data[hdr+5])
ed70: 3b 0a 20 20 69 66 28 20 69 53 74 61 72 74 3c 3d  ;.  if( iStart<=
ed80: 78 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  x ){.    /* The 
ed90: 6e 65 77 20 66 72 65 65 62 6c 6f 63 6b 20 69 73  new freeblock is
eda0: 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e   at the beginnin
edb0: 67 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 63 6f  g of the cell co
edc0: 6e 74 65 6e 74 20 61 72 65 61 2c 0a 20 20 20 20  ntent area,.    
edd0: 2a 2a 20 73 6f 20 6a 75 73 74 20 65 78 74 65 6e  ** so just exten
ede0: 64 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  d the cell conte
edf0: 6e 74 20 61 72 65 61 20 72 61 74 68 65 72 20 74  nt area rather t
ee00: 68 61 6e 20 63 72 65 61 74 65 20 61 6e 6f 74 68  han create anoth
ee10: 65 72 0a 20 20 20 20 2a 2a 20 66 72 65 65 6c 69  er.    ** freeli
ee20: 73 74 20 65 6e 74 72 79 20 2a 2f 0a 20 20 20 20  st entry */.    
ee30: 69 66 28 20 69 53 74 61 72 74 3c 78 20 7c 7c 20  if( iStart<x || 
ee40: 69 50 74 72 21 3d 68 64 72 2b 31 20 29 20 72 65  iPtr!=hdr+1 ) re
ee50: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
ee60: 55 50 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b  UPT_PAGE(pPage);
ee70: 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64  .    put2byte(&d
ee80: 61 74 61 5b 68 64 72 2b 31 5d 2c 20 69 46 72 65  ata[hdr+1], iFre
ee90: 65 42 6c 6b 29 3b 0a 20 20 20 20 70 75 74 32 62  eBlk);.    put2b
eea0: 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
eeb0: 2c 20 69 45 6e 64 29 3b 0a 20 20 7d 65 6c 73 65  , iEnd);.  }else
eec0: 7b 0a 20 20 20 20 2f 2a 20 49 6e 73 65 72 74 20  {.    /* Insert 
eed0: 74 68 65 20 6e 65 77 20 66 72 65 65 62 6c 6f 63  the new freebloc
eee0: 6b 20 69 6e 74 6f 20 74 68 65 20 66 72 65 65 6c  k into the freel
eef0: 69 73 74 20 2a 2f 0a 20 20 20 20 70 75 74 32 62  ist */.    put2b
ef00: 79 74 65 28 26 64 61 74 61 5b 69 50 74 72 5d 2c  yte(&data[iPtr],
ef10: 20 69 53 74 61 72 74 29 3b 0a 20 20 7d 0a 20 20   iStart);.  }.  
ef20: 69 66 28 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e  if( pPage->pBt->
ef30: 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 46  btsFlags & BTS_F
ef40: 41 53 54 5f 53 45 43 55 52 45 20 29 7b 0a 20 20  AST_SECURE ){.  
ef50: 20 20 2f 2a 20 4f 76 65 72 77 72 69 74 65 20 64    /* Overwrite d
ef60: 65 6c 65 74 65 64 20 69 6e 66 6f 72 6d 61 74 69  eleted informati
ef70: 6f 6e 20 77 69 74 68 20 7a 65 72 6f 73 20 77 68  on with zeros wh
ef80: 65 6e 20 74 68 65 20 73 65 63 75 72 65 5f 64 65  en the secure_de
ef90: 6c 65 74 65 0a 20 20 20 20 2a 2a 20 6f 70 74 69  lete.    ** opti
efa0: 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64 20 2a 2f  on is enabled */
efb0: 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 64 61 74  .    memset(&dat
efc0: 61 5b 69 53 74 61 72 74 5d 2c 20 30 2c 20 69 53  a[iStart], 0, iS
efd0: 69 7a 65 29 3b 0a 20 20 7d 0a 20 20 70 75 74 32  ize);.  }.  put2
efe0: 62 79 74 65 28 26 64 61 74 61 5b 69 53 74 61 72  byte(&data[iStar
eff0: 74 5d 2c 20 69 46 72 65 65 42 6c 6b 29 3b 0a 20  t], iFreeBlk);. 
f000: 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
f010: 69 53 74 61 72 74 2b 32 5d 2c 20 69 53 69 7a 65  iStart+2], iSize
f020: 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72 65  );.  pPage->nFre
f030: 65 20 2b 3d 20 69 4f 72 69 67 53 69 7a 65 3b 0a  e += iOrigSize;.
f040: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
f050: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63  OK;.}../*.** Dec
f060: 6f 64 65 20 74 68 65 20 66 6c 61 67 73 20 62 79  ode the flags by
f070: 74 65 20 28 74 68 65 20 66 69 72 73 74 20 62 79  te (the first by
f080: 74 65 20 6f 66 20 74 68 65 20 68 65 61 64 65 72  te of the header
f090: 29 20 66 6f 72 20 61 20 70 61 67 65 0a 2a 2a 20  ) for a page.** 
f0a0: 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 66  and initialize f
f0b0: 69 65 6c 64 73 20 6f 66 20 74 68 65 20 4d 65 6d  ields of the Mem
f0c0: 50 61 67 65 20 73 74 72 75 63 74 75 72 65 20 61  Page structure a
f0d0: 63 63 6f 72 64 69 6e 67 6c 79 2e 0a 2a 2a 0a 2a  ccordingly..**.*
f0e0: 2a 20 4f 6e 6c 79 20 74 68 65 20 66 6f 6c 6c 6f  * Only the follo
f0f0: 77 69 6e 67 20 63 6f 6d 62 69 6e 61 74 69 6f 6e  wing combination
f100: 73 20 61 72 65 20 73 75 70 70 6f 72 74 65 64 2e  s are supported.
f110: 20 20 41 6e 79 74 68 69 6e 67 20 64 69 66 66 65    Anything diffe
f120: 72 65 6e 74 0a 2a 2a 20 69 6e 64 69 63 61 74 65  rent.** indicate
f130: 73 20 61 20 63 6f 72 72 75 70 74 20 64 61 74 61  s a corrupt data
f140: 62 61 73 65 20 66 69 6c 65 73 3a 0a 2a 2a 0a 2a  base files:.**.*
f150: 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f 5a 45  *         PTF_ZE
f160: 52 4f 44 41 54 41 0a 2a 2a 20 20 20 20 20 20 20  RODATA.**       
f170: 20 20 50 54 46 5f 5a 45 52 4f 44 41 54 41 20 7c    PTF_ZERODATA |
f180: 20 50 54 46 5f 4c 45 41 46 0a 2a 2a 20 20 20 20   PTF_LEAF.**    
f190: 20 20 20 20 20 50 54 46 5f 4c 45 41 46 44 41 54       PTF_LEAFDAT
f1a0: 41 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59 0a 2a  A | PTF_INTKEY.*
f1b0: 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f 4c 45  *         PTF_LE
f1c0: 41 46 44 41 54 41 20 7c 20 50 54 46 5f 49 4e 54  AFDATA | PTF_INT
f1d0: 4b 45 59 20 7c 20 50 54 46 5f 4c 45 41 46 0a 2a  KEY | PTF_LEAF.*
f1e0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 65 63  /.static int dec
f1f0: 6f 64 65 46 6c 61 67 73 28 4d 65 6d 50 61 67 65  odeFlags(MemPage
f200: 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 66 6c 61   *pPage, int fla
f210: 67 42 79 74 65 29 7b 0a 20 20 42 74 53 68 61 72  gByte){.  BtShar
f220: 65 64 20 2a 70 42 74 3b 20 20 20 20 20 2f 2a 20  ed *pBt;     /* 
f230: 41 20 63 6f 70 79 20 6f 66 20 70 50 61 67 65 2d  A copy of pPage-
f240: 3e 70 42 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72  >pBt */..  asser
f250: 74 28 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  t( pPage->hdrOff
f260: 73 65 74 3d 3d 28 70 50 61 67 65 2d 3e 70 67 6e  set==(pPage->pgn
f270: 6f 3d 3d 31 20 3f 20 31 30 30 20 3a 20 30 29 20  o==1 ? 100 : 0) 
f280: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
f290: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
f2a0: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
f2b0: 78 29 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6c  x) );.  pPage->l
f2c0: 65 61 66 20 3d 20 28 75 38 29 28 66 6c 61 67 42  eaf = (u8)(flagB
f2d0: 79 74 65 3e 3e 33 29 3b 20 20 61 73 73 65 72 74  yte>>3);  assert
f2e0: 28 20 50 54 46 5f 4c 45 41 46 20 3d 3d 20 31 3c  ( PTF_LEAF == 1<
f2f0: 3c 33 20 29 3b 0a 20 20 66 6c 61 67 42 79 74 65  <3 );.  flagByte
f300: 20 26 3d 20 7e 50 54 46 5f 4c 45 41 46 3b 0a 20   &= ~PTF_LEAF;. 
f310: 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72   pPage->childPtr
f320: 53 69 7a 65 20 3d 20 34 2d 34 2a 70 50 61 67 65  Size = 4-4*pPage
f330: 2d 3e 6c 65 61 66 3b 0a 20 20 70 50 61 67 65 2d  ->leaf;.  pPage-
f340: 3e 78 43 65 6c 6c 53 69 7a 65 20 3d 20 63 65 6c  >xCellSize = cel
f350: 6c 53 69 7a 65 50 74 72 3b 0a 20 20 70 42 74 20  lSizePtr;.  pBt 
f360: 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20  = pPage->pBt;.  
f370: 69 66 28 20 66 6c 61 67 42 79 74 65 3d 3d 28 50  if( flagByte==(P
f380: 54 46 5f 4c 45 41 46 44 41 54 41 20 7c 20 50 54  TF_LEAFDATA | PT
f390: 46 5f 49 4e 54 4b 45 59 29 20 29 7b 0a 20 20 20  F_INTKEY) ){.   
f3a0: 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
f3b0: 20 52 2d 30 37 32 39 31 2d 33 35 33 32 38 20 41   R-07291-35328 A
f3c0: 20 76 61 6c 75 65 20 6f 66 20 35 20 28 30 78 30   value of 5 (0x0
f3d0: 35 29 20 6d 65 61 6e 73 20 74 68 65 20 70 61 67  5) means the pag
f3e0: 65 20 69 73 20 61 6e 0a 20 20 20 20 2a 2a 20 69  e is an.    ** i
f3f0: 6e 74 65 72 69 6f 72 20 74 61 62 6c 65 20 62 2d  nterior table b-
f400: 74 72 65 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20  tree page. */.  
f410: 20 20 61 73 73 65 72 74 28 20 28 50 54 46 5f 4c    assert( (PTF_L
f420: 45 41 46 44 41 54 41 7c 50 54 46 5f 49 4e 54 4b  EAFDATA|PTF_INTK
f430: 45 59 29 3d 3d 35 20 29 3b 0a 20 20 20 20 2f 2a  EY)==5 );.    /*
f440: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
f450: 32 36 39 30 30 2d 30 39 31 37 36 20 41 20 76 61  26900-09176 A va
f460: 6c 75 65 20 6f 66 20 31 33 20 28 30 78 30 64 29  lue of 13 (0x0d)
f470: 20 6d 65 61 6e 73 20 74 68 65 20 70 61 67 65 20   means the page 
f480: 69 73 20 61 0a 20 20 20 20 2a 2a 20 6c 65 61 66  is a.    ** leaf
f490: 20 74 61 62 6c 65 20 62 2d 74 72 65 65 20 70 61   table b-tree pa
f4a0: 67 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  ge. */.    asser
f4b0: 74 28 20 28 50 54 46 5f 4c 45 41 46 44 41 54 41  t( (PTF_LEAFDATA
f4c0: 7c 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f  |PTF_INTKEY|PTF_
f4d0: 4c 45 41 46 29 3d 3d 31 33 20 29 3b 0a 20 20 20  LEAF)==13 );.   
f4e0: 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 3d   pPage->intKey =
f4f0: 20 31 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67   1;.    if( pPag
f500: 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20  e->leaf ){.     
f510: 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65   pPage->intKeyLe
f520: 61 66 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 50  af = 1;.      pP
f530: 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 20  age->xParseCell 
f540: 3d 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c  = btreeParseCell
f550: 50 74 72 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  Ptr;.    }else{.
f560: 20 20 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74        pPage->int
f570: 4b 65 79 4c 65 61 66 20 3d 20 30 3b 0a 20 20 20  KeyLeaf = 0;.   
f580: 20 20 20 70 50 61 67 65 2d 3e 78 43 65 6c 6c 53     pPage->xCellS
f590: 69 7a 65 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74  ize = cellSizePt
f5a0: 72 4e 6f 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20  rNoPayload;.    
f5b0: 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43    pPage->xParseC
f5c0: 65 6c 6c 20 3d 20 62 74 72 65 65 50 61 72 73 65  ell = btreeParse
f5d0: 43 65 6c 6c 50 74 72 4e 6f 50 61 79 6c 6f 61 64  CellPtrNoPayload
f5e0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67  ;.    }.    pPag
f5f0: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 42  e->maxLocal = pB
f600: 74 2d 3e 6d 61 78 4c 65 61 66 3b 0a 20 20 20 20  t->maxLeaf;.    
f610: 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 20  pPage->minLocal 
f620: 3d 20 70 42 74 2d 3e 6d 69 6e 4c 65 61 66 3b 0a  = pBt->minLeaf;.
f630: 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67    }else if( flag
f640: 42 79 74 65 3d 3d 50 54 46 5f 5a 45 52 4f 44 41  Byte==PTF_ZERODA
f650: 54 41 20 29 7b 0a 20 20 20 20 2f 2a 20 45 56 49  TA ){.    /* EVI
f660: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 33 33 31  DENCE-OF: R-4331
f670: 36 2d 33 37 33 30 38 20 41 20 76 61 6c 75 65 20  6-37308 A value 
f680: 6f 66 20 32 20 28 30 78 30 32 29 20 6d 65 61 6e  of 2 (0x02) mean
f690: 73 20 74 68 65 20 70 61 67 65 20 69 73 20 61 6e  s the page is an
f6a0: 0a 20 20 20 20 2a 2a 20 69 6e 74 65 72 69 6f 72  .    ** interior
f6b0: 20 69 6e 64 65 78 20 62 2d 74 72 65 65 20 70 61   index b-tree pa
f6c0: 67 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  ge. */.    asser
f6d0: 74 28 20 28 50 54 46 5f 5a 45 52 4f 44 41 54 41  t( (PTF_ZERODATA
f6e0: 29 3d 3d 32 20 29 3b 0a 20 20 20 20 2f 2a 20 45  )==2 );.    /* E
f6f0: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 39  VIDENCE-OF: R-59
f700: 36 31 35 2d 34 32 38 32 38 20 41 20 76 61 6c 75  615-42828 A valu
f710: 65 20 6f 66 20 31 30 20 28 30 78 30 61 29 20 6d  e of 10 (0x0a) m
f720: 65 61 6e 73 20 74 68 65 20 70 61 67 65 20 69 73  eans the page is
f730: 20 61 0a 20 20 20 20 2a 2a 20 6c 65 61 66 20 69   a.    ** leaf i
f740: 6e 64 65 78 20 62 2d 74 72 65 65 20 70 61 67 65  ndex b-tree page
f750: 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  . */.    assert(
f760: 20 28 50 54 46 5f 5a 45 52 4f 44 41 54 41 7c 50   (PTF_ZERODATA|P
f770: 54 46 5f 4c 45 41 46 29 3d 3d 31 30 20 29 3b 0a  TF_LEAF)==10 );.
f780: 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65      pPage->intKe
f790: 79 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65  y = 0;.    pPage
f7a0: 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20 3d 20 30  ->intKeyLeaf = 0
f7b0: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 78 50 61  ;.    pPage->xPa
f7c0: 72 73 65 43 65 6c 6c 20 3d 20 62 74 72 65 65 50  rseCell = btreeP
f7d0: 61 72 73 65 43 65 6c 6c 50 74 72 49 6e 64 65 78  arseCellPtrIndex
f7e0: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 61 78  ;.    pPage->max
f7f0: 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 61 78  Local = pBt->max
f800: 4c 6f 63 61 6c 3b 0a 20 20 20 20 70 50 61 67 65  Local;.    pPage
f810: 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 42 74  ->minLocal = pBt
f820: 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 65  ->minLocal;.  }e
f830: 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 45 56 49 44  lse{.    /* EVID
f840: 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 37 36 30 38  ENCE-OF: R-47608
f850: 2d 35 36 34 36 39 20 41 6e 79 20 6f 74 68 65 72  -56469 Any other
f860: 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 62   value for the b
f870: 2d 74 72 65 65 20 70 61 67 65 20 74 79 70 65 20  -tree page type 
f880: 69 73 0a 20 20 20 20 2a 2a 20 61 6e 20 65 72 72  is.    ** an err
f890: 6f 72 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  or. */.    retur
f8a0: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
f8b0: 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20  _PAGE(pPage);.  
f8c0: 7d 0a 20 20 70 50 61 67 65 2d 3e 6d 61 78 31 62  }.  pPage->max1b
f8d0: 79 74 65 50 61 79 6c 6f 61 64 20 3d 20 70 42 74  ytePayload = pBt
f8e0: 2d 3e 6d 61 78 31 62 79 74 65 50 61 79 6c 6f 61  ->max1bytePayloa
f8f0: 64 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  d;.  return SQLI
f900: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
f910: 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 61  Initialize the a
f920: 75 78 69 6c 69 61 72 79 20 69 6e 66 6f 72 6d 61  uxiliary informa
f930: 74 69 6f 6e 20 66 6f 72 20 61 20 64 69 73 6b 20  tion for a disk 
f940: 62 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  block..**.** Ret
f950: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e  urn SQLITE_OK on
f960: 20 73 75 63 63 65 73 73 2e 20 20 49 66 20 77 65   success.  If we
f970: 20 73 65 65 20 74 68 61 74 20 74 68 65 20 70 61   see that the pa
f980: 67 65 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 63  ge does.** not c
f990: 6f 6e 74 61 69 6e 20 61 20 77 65 6c 6c 2d 66 6f  ontain a well-fo
f9a0: 72 6d 65 64 20 64 61 74 61 62 61 73 65 20 70 61  rmed database pa
f9b0: 67 65 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20  ge, then return 
f9c0: 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  .** SQLITE_CORRU
f9d0: 50 54 2e 20 20 4e 6f 74 65 20 74 68 61 74 20 61  PT.  Note that a
f9e0: 20 72 65 74 75 72 6e 20 6f 66 20 53 51 4c 49 54   return of SQLIT
f9f0: 45 5f 4f 4b 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a  E_OK does not.**
fa00: 20 67 75 61 72 61 6e 74 65 65 20 74 68 61 74 20   guarantee that 
fa10: 74 68 65 20 70 61 67 65 20 69 73 20 77 65 6c 6c  the page is well
fa20: 2d 66 6f 72 6d 65 64 2e 20 20 49 74 20 6f 6e 6c  -formed.  It onl
fa30: 79 20 73 68 6f 77 73 20 74 68 61 74 0a 2a 2a 20  y shows that.** 
fa40: 77 65 20 66 61 69 6c 65 64 20 74 6f 20 64 65 74  we failed to det
fa50: 65 63 74 20 61 6e 79 20 63 6f 72 72 75 70 74 69  ect any corrupti
fa60: 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  on..*/.static in
fa70: 74 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28  t btreeInitPage(
fa80: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b  MemPage *pPage){
fa90: 0a 20 20 69 6e 74 20 70 63 3b 20 20 20 20 20 20  .  int pc;      
faa0: 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
fab0: 20 6f 66 20 61 20 66 72 65 65 62 6c 6f 63 6b 20   of a freeblock 
fac0: 77 69 74 68 69 6e 20 70 50 61 67 65 2d 3e 61 44  within pPage->aD
fad0: 61 74 61 5b 5d 20 2a 2f 0a 20 20 75 38 20 68 64  ata[] */.  u8 hd
fae0: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  r;            /*
faf0: 20 4f 66 66 73 65 74 20 74 6f 20 62 65 67 69 6e   Offset to begin
fb00: 6e 69 6e 67 20 6f 66 20 70 61 67 65 20 68 65 61  ning of page hea
fb10: 64 65 72 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74  der */.  u8 *dat
fb20: 61 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45  a;          /* E
fb30: 71 75 61 6c 20 74 6f 20 70 50 61 67 65 2d 3e 61  qual to pPage->a
fb40: 44 61 74 61 20 2a 2f 0a 20 20 42 74 53 68 61 72  Data */.  BtShar
fb50: 65 64 20 2a 70 42 74 3b 20 20 20 20 20 20 20 20  ed *pBt;        
fb60: 2f 2a 20 54 68 65 20 6d 61 69 6e 20 62 74 72 65  /* The main btre
fb70: 65 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20  e structure */. 
fb80: 20 69 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 3b   int usableSize;
fb90: 20 20 20 20 2f 2a 20 41 6d 6f 75 6e 74 20 6f 66      /* Amount of
fba0: 20 75 73 61 62 6c 65 20 73 70 61 63 65 20 6f 6e   usable space on
fbb0: 20 65 61 63 68 20 70 61 67 65 20 2a 2f 0a 20 20   each page */.  
fbc0: 75 31 36 20 63 65 6c 6c 4f 66 66 73 65 74 3b 20  u16 cellOffset; 
fbd0: 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 66 72 6f     /* Offset fro
fbe0: 6d 20 73 74 61 72 74 20 6f 66 20 70 61 67 65 20  m start of page 
fbf0: 74 6f 20 66 69 72 73 74 20 63 65 6c 6c 20 70 6f  to first cell po
fc00: 69 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e  inter */.  int n
fc10: 46 72 65 65 3b 20 20 20 20 20 20 20 20 20 2f 2a  Free;         /*
fc20: 20 4e 75 6d 62 65 72 20 6f 66 20 75 6e 75 73 65   Number of unuse
fc30: 64 20 62 79 74 65 73 20 6f 6e 20 74 68 65 20 70  d bytes on the p
fc40: 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 74 6f 70  age */.  int top
fc50: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  ;           /* F
fc60: 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65  irst byte of the
fc70: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72   cell content ar
fc80: 65 61 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c  ea */.  int iCel
fc90: 6c 46 69 72 73 74 3b 20 20 20 20 2f 2a 20 46 69  lFirst;    /* Fi
fca0: 72 73 74 20 61 6c 6c 6f 77 61 62 6c 65 20 63 65  rst allowable ce
fcb0: 6c 6c 20 6f 72 20 66 72 65 65 62 6c 6f 63 6b 20  ll or freeblock 
fcc0: 6f 66 66 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20  offset */.  int 
fcd0: 69 43 65 6c 6c 4c 61 73 74 3b 20 20 20 20 20 2f  iCellLast;     /
fce0: 2a 20 4c 61 73 74 20 70 6f 73 73 69 62 6c 65 20  * Last possible 
fcf0: 63 65 6c 6c 20 6f 72 20 66 72 65 65 62 6c 6f 63  cell or freebloc
fd00: 6b 20 6f 66 66 73 65 74 20 2a 2f 0a 0a 20 20 61  k offset */..  a
fd10: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42  ssert( pPage->pB
fd20: 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  t!=0 );.  assert
fd30: 28 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 64 62  ( pPage->pBt->db
fd40: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
fd50: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
fd60: 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
fd70: 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
fd80: 72 74 28 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3d  rt( pPage->pgno=
fd90: 3d 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67  =sqlite3PagerPag
fda0: 65 6e 75 6d 62 65 72 28 70 50 61 67 65 2d 3e 70  enumber(pPage->p
fdb0: 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73  DbPage) );.  ass
fdc0: 65 72 74 28 20 70 50 61 67 65 20 3d 3d 20 73 71  ert( pPage == sq
fdd0: 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74  lite3PagerGetExt
fde0: 72 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  ra(pPage->pDbPag
fdf0: 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  e) );.  assert( 
fe00: 70 50 61 67 65 2d 3e 61 44 61 74 61 20 3d 3d 20  pPage->aData == 
fe10: 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44  sqlite3PagerGetD
fe20: 61 74 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ata(pPage->pDbPa
fe30: 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ge) );.  assert(
fe40: 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 3d 3d   pPage->isInit==
fe50: 30 20 29 3b 0a 0a 20 20 70 42 74 20 3d 20 70 50  0 );..  pBt = pP
fe60: 61 67 65 2d 3e 70 42 74 3b 0a 20 20 68 64 72 20  age->pBt;.  hdr 
fe70: 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  = pPage->hdrOffs
fe80: 65 74 3b 0a 20 20 64 61 74 61 20 3d 20 70 50 61  et;.  data = pPa
fe90: 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 2f 2a 20  ge->aData;.  /* 
fea0: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32  EVIDENCE-OF: R-2
feb0: 38 35 39 34 2d 30 32 38 39 30 20 54 68 65 20 6f  8594-02890 The o
fec0: 6e 65 2d 62 79 74 65 20 66 6c 61 67 20 61 74 20  ne-byte flag at 
fed0: 6f 66 66 73 65 74 20 30 20 69 6e 64 69 63 61 74  offset 0 indicat
fee0: 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 62 2d 74  ing.  ** the b-t
fef0: 72 65 65 20 70 61 67 65 20 74 79 70 65 2e 20 2a  ree page type. *
ff00: 2f 0a 20 20 69 66 28 20 64 65 63 6f 64 65 46 6c  /.  if( decodeFl
ff10: 61 67 73 28 70 50 61 67 65 2c 20 64 61 74 61 5b  ags(pPage, data[
ff20: 68 64 72 5d 29 20 29 7b 0a 20 20 20 20 72 65 74  hdr]) ){.    ret
ff30: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
ff40: 50 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a  PT_PAGE(pPage);.
ff50: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 42    }.  assert( pB
ff60: 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3d 35 31 32  t->pageSize>=512
ff70: 20 26 26 20 70 42 74 2d 3e 70 61 67 65 53 69 7a   && pBt->pageSiz
ff80: 65 3c 3d 36 35 35 33 36 20 29 3b 0a 20 20 70 50  e<=65536 );.  pP
ff90: 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65 20 3d 20  age->maskPage = 
ffa0: 28 75 31 36 29 28 70 42 74 2d 3e 70 61 67 65 53  (u16)(pBt->pageS
ffb0: 69 7a 65 20 2d 20 31 29 3b 0a 20 20 70 50 61 67  ize - 1);.  pPag
ffc0: 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30  e->nOverflow = 0
ffd0: 3b 0a 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d  ;.  usableSize =
ffe0: 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
fff0: 3b 0a 20 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f  ;.  pPage->cellO
10000 66 66 73 65 74 20 3d 20 63 65 6c 6c 4f 66 66 73  ffset = cellOffs
10010 65 74 20 3d 20 68 64 72 20 2b 20 38 20 2b 20 70  et = hdr + 8 + p
10020 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69  Page->childPtrSi
10030 7a 65 3b 0a 20 20 70 50 61 67 65 2d 3e 61 44 61  ze;.  pPage->aDa
10040 74 61 45 6e 64 20 3d 20 26 64 61 74 61 5b 75 73  taEnd = &data[us
10050 61 62 6c 65 53 69 7a 65 5d 3b 0a 20 20 70 50 61  ableSize];.  pPa
10060 67 65 2d 3e 61 43 65 6c 6c 49 64 78 20 3d 20 26  ge->aCellIdx = &
10070 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74 5d  data[cellOffset]
10080 3b 0a 20 20 70 50 61 67 65 2d 3e 61 44 61 74 61  ;.  pPage->aData
10090 4f 66 73 74 20 3d 20 26 64 61 74 61 5b 70 50 61  Ofst = &data[pPa
100a0 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65  ge->childPtrSize
100b0 5d 3b 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43 45  ];.  /* EVIDENCE
100c0 2d 4f 46 3a 20 52 2d 35 38 30 31 35 2d 34 38 31  -OF: R-58015-481
100d0 37 35 20 54 68 65 20 74 77 6f 2d 62 79 74 65 20  75 The two-byte 
100e0 69 6e 74 65 67 65 72 20 61 74 20 6f 66 66 73 65  integer at offse
100f0 74 20 35 20 64 65 73 69 67 6e 61 74 65 73 0a 20  t 5 designates. 
10100 20 2a 2a 20 74 68 65 20 73 74 61 72 74 20 6f 66   ** the start of
10110 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
10120 74 20 61 72 65 61 2e 20 41 20 7a 65 72 6f 20 76  t area. A zero v
10130 61 6c 75 65 20 66 6f 72 20 74 68 69 73 20 69 6e  alue for this in
10140 74 65 67 65 72 20 69 73 0a 20 20 2a 2a 20 69 6e  teger is.  ** in
10150 74 65 72 70 72 65 74 65 64 20 61 73 20 36 35 35  terpreted as 655
10160 33 36 2e 20 2a 2f 0a 20 20 74 6f 70 20 3d 20 67  36. */.  top = g
10170 65 74 32 62 79 74 65 4e 6f 74 5a 65 72 6f 28 26  et2byteNotZero(&
10180 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20  data[hdr+5]);.  
10190 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
101a0 52 2d 33 37 30 30 32 2d 33 32 37 37 34 20 54 68  R-37002-32774 Th
101b0 65 20 74 77 6f 2d 62 79 74 65 20 69 6e 74 65 67  e two-byte integ
101c0 65 72 20 61 74 20 6f 66 66 73 65 74 20 33 20 67  er at offset 3 g
101d0 69 76 65 73 20 74 68 65 0a 20 20 2a 2a 20 6e 75  ives the.  ** nu
101e0 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 6f 6e  mber of cells on
101f0 20 74 68 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20   the page. */.  
10200 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 67  pPage->nCell = g
10210 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  et2byte(&data[hd
10220 72 2b 33 5d 29 3b 0a 20 20 69 66 28 20 70 50 61  r+3]);.  if( pPa
10230 67 65 2d 3e 6e 43 65 6c 6c 3e 4d 58 5f 43 45 4c  ge->nCell>MX_CEL
10240 4c 28 70 42 74 29 20 29 7b 0a 20 20 20 20 2f 2a  L(pBt) ){.    /*
10250 20 54 6f 20 6d 61 6e 79 20 63 65 6c 6c 73 20 66   To many cells f
10260 6f 72 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65  or a single page
10270 2e 20 20 54 68 65 20 70 61 67 65 20 6d 75 73 74  .  The page must
10280 20 62 65 20 63 6f 72 72 75 70 74 20 2a 2f 0a 20   be corrupt */. 
10290 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
102a0 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50  _CORRUPT_PAGE(pP
102b0 61 67 65 29 3b 0a 20 20 7d 0a 20 20 74 65 73 74  age);.  }.  test
102c0 63 61 73 65 28 20 70 50 61 67 65 2d 3e 6e 43 65  case( pPage->nCe
102d0 6c 6c 3d 3d 4d 58 5f 43 45 4c 4c 28 70 42 74 29  ll==MX_CELL(pBt)
102e0 20 29 3b 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43   );.  /* EVIDENC
102f0 45 2d 4f 46 3a 20 52 2d 32 34 30 38 39 2d 35 37  E-OF: R-24089-57
10300 39 37 39 20 49 66 20 61 20 70 61 67 65 20 63 6f  979 If a page co
10310 6e 74 61 69 6e 73 20 6e 6f 20 63 65 6c 6c 73 20  ntains no cells 
10320 28 77 68 69 63 68 20 69 73 20 6f 6e 6c 79 0a 20  (which is only. 
10330 20 2a 2a 20 70 6f 73 73 69 62 6c 65 20 66 6f 72   ** possible for
10340 20 61 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20   a root page of 
10350 61 20 74 61 62 6c 65 20 74 68 61 74 20 63 6f 6e  a table that con
10360 74 61 69 6e 73 20 6e 6f 20 72 6f 77 73 29 20 74  tains no rows) t
10370 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20 6f 66 66  hen the.  ** off
10380 73 65 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20  set to the cell 
10390 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 77 69 6c  content area wil
103a0 6c 20 65 71 75 61 6c 20 74 68 65 20 70 61 67 65  l equal the page
103b0 20 73 69 7a 65 20 6d 69 6e 75 73 20 74 68 65 0a   size minus the.
103c0 20 20 2a 2a 20 62 79 74 65 73 20 6f 66 20 72 65    ** bytes of re
103d0 73 65 72 76 65 64 20 73 70 61 63 65 2e 20 2a 2f  served space. */
103e0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
103f0 2d 3e 6e 43 65 6c 6c 3e 30 20 7c 7c 20 74 6f 70  ->nCell>0 || top
10400 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20 7c 7c 20  ==usableSize || 
10410 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 0a 20  CORRUPT_DB );.. 
10420 20 2f 2a 20 41 20 6d 61 6c 66 6f 72 6d 65 64 20   /* A malformed 
10430 64 61 74 61 62 61 73 65 20 70 61 67 65 20 6d 69  database page mi
10440 67 68 74 20 63 61 75 73 65 20 75 73 20 74 6f 20  ght cause us to 
10450 72 65 61 64 20 70 61 73 74 20 74 68 65 20 65 6e  read past the en
10460 64 0a 20 20 2a 2a 20 6f 66 20 70 61 67 65 20 77  d.  ** of page w
10470 68 65 6e 20 70 61 72 73 69 6e 67 20 61 20 63 65  hen parsing a ce
10480 6c 6c 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ll.  .  **.  ** 
10490 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c  The following bl
104a0 6f 63 6b 20 6f 66 20 63 6f 64 65 20 63 68 65 63  ock of code chec
104b0 6b 73 20 65 61 72 6c 79 20 74 6f 20 73 65 65 20  ks early to see 
104c0 69 66 20 61 20 63 65 6c 6c 20 65 78 74 65 6e 64  if a cell extend
104d0 73 0a 20 20 2a 2a 20 70 61 73 74 20 74 68 65 20  s.  ** past the 
104e0 65 6e 64 20 6f 66 20 61 20 70 61 67 65 20 62 6f  end of a page bo
104f0 75 6e 64 61 72 79 20 61 6e 64 20 63 61 75 73 65  undary and cause
10500 73 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  s SQLITE_CORRUPT
10510 20 74 6f 20 62 65 20 0a 20 20 2a 2a 20 72 65 74   to be .  ** ret
10520 75 72 6e 65 64 20 69 66 20 69 74 20 64 6f 65 73  urned if it does
10530 2e 0a 20 20 2a 2f 0a 20 20 69 43 65 6c 6c 46 69  ..  */.  iCellFi
10540 72 73 74 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74  rst = cellOffset
10550 20 2b 20 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c   + 2*pPage->nCel
10560 6c 3b 0a 20 20 69 43 65 6c 6c 4c 61 73 74 20 3d  l;.  iCellLast =
10570 20 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b   usableSize - 4;
10580 0a 20 20 69 66 28 20 70 42 74 2d 3e 64 62 2d 3e  .  if( pBt->db->
10590 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 43  flags & SQLITE_C
105a0 65 6c 6c 53 69 7a 65 43 6b 20 29 7b 0a 20 20 20  ellSizeCk ){.   
105b0 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
105c0 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 74 6f     /* Index into
105d0 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65   the cell pointe
105e0 72 20 61 72 72 61 79 20 2a 2f 0a 20 20 20 20 69  r array */.    i
105f0 6e 74 20 73 7a 3b 20 20 20 20 20 20 20 20 20 20  nt sz;          
10600 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 20 63 65   /* Size of a ce
10610 6c 6c 20 2a 2f 0a 0a 20 20 20 20 69 66 28 20 21  ll */..    if( !
10620 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 20 69 43  pPage->leaf ) iC
10630 65 6c 6c 4c 61 73 74 2d 2d 3b 0a 20 20 20 20 66  ellLast--;.    f
10640 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 67 65 2d  or(i=0; i<pPage-
10650 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20  >nCell; i++){.  
10660 20 20 20 20 70 63 20 3d 20 67 65 74 32 62 79 74      pc = get2byt
10670 65 41 6c 69 67 6e 65 64 28 26 64 61 74 61 5b 63  eAligned(&data[c
10680 65 6c 6c 4f 66 66 73 65 74 2b 69 2a 32 5d 29 3b  ellOffset+i*2]);
10690 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
106a0 20 70 63 3d 3d 69 43 65 6c 6c 46 69 72 73 74 20   pc==iCellFirst 
106b0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
106c0 65 28 20 70 63 3d 3d 69 43 65 6c 6c 4c 61 73 74  e( pc==iCellLast
106d0 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 63   );.      if( pc
106e0 3c 69 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20 70  <iCellFirst || p
106f0 63 3e 69 43 65 6c 6c 4c 61 73 74 20 29 7b 0a 20  c>iCellLast ){. 
10700 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
10710 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47  LITE_CORRUPT_PAG
10720 45 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20  E(pPage);.      
10730 7d 0a 20 20 20 20 20 20 73 7a 20 3d 20 70 50 61  }.      sz = pPa
10740 67 65 2d 3e 78 43 65 6c 6c 53 69 7a 65 28 70 50  ge->xCellSize(pP
10750 61 67 65 2c 20 26 64 61 74 61 5b 70 63 5d 29 3b  age, &data[pc]);
10760 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
10770 20 70 63 2b 73 7a 3d 3d 75 73 61 62 6c 65 53 69   pc+sz==usableSi
10780 7a 65 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ze );.      if( 
10790 70 63 2b 73 7a 3e 75 73 61 62 6c 65 53 69 7a 65  pc+sz>usableSize
107a0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
107b0 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
107c0 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20  T_PAGE(pPage);. 
107d0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
107e0 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
107f0 66 20 29 20 69 43 65 6c 6c 4c 61 73 74 2b 2b 3b  f ) iCellLast++;
10800 0a 20 20 7d 20 20 0a 0a 20 20 2f 2a 20 43 6f 6d  .  }  ..  /* Com
10810 70 75 74 65 20 74 68 65 20 74 6f 74 61 6c 20 66  pute the total f
10820 72 65 65 20 73 70 61 63 65 20 6f 6e 20 74 68 65  ree space on the
10830 20 70 61 67 65 0a 20 20 2a 2a 20 45 56 49 44 45   page.  ** EVIDE
10840 4e 43 45 2d 4f 46 3a 20 52 2d 32 33 35 38 38 2d  NCE-OF: R-23588-
10850 33 34 34 35 30 20 54 68 65 20 74 77 6f 2d 62 79  34450 The two-by
10860 74 65 20 69 6e 74 65 67 65 72 20 61 74 20 6f 66  te integer at of
10870 66 73 65 74 20 31 20 67 69 76 65 73 20 74 68 65  fset 1 gives the
10880 0a 20 20 2a 2a 20 73 74 61 72 74 20 6f 66 20 74  .  ** start of t
10890 68 65 20 66 69 72 73 74 20 66 72 65 65 62 6c 6f  he first freeblo
108a0 63 6b 20 6f 6e 20 74 68 65 20 70 61 67 65 2c 20  ck on the page, 
108b0 6f 72 20 69 73 20 7a 65 72 6f 20 69 66 20 74 68  or is zero if th
108c0 65 72 65 20 61 72 65 20 6e 6f 0a 20 20 2a 2a 20  ere are no.  ** 
108d0 66 72 65 65 62 6c 6f 63 6b 73 2e 20 2a 2f 0a 20  freeblocks. */. 
108e0 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 28 26   pc = get2byte(&
108f0 64 61 74 61 5b 68 64 72 2b 31 5d 29 3b 0a 20 20  data[hdr+1]);.  
10900 6e 46 72 65 65 20 3d 20 64 61 74 61 5b 68 64 72  nFree = data[hdr
10910 2b 37 5d 20 2b 20 74 6f 70 3b 20 20 2f 2a 20 49  +7] + top;  /* I
10920 6e 69 74 20 6e 46 72 65 65 20 74 6f 20 6e 6f 6e  nit nFree to non
10930 2d 66 72 65 65 62 6c 6f 63 6b 20 66 72 65 65 20  -freeblock free 
10940 73 70 61 63 65 20 2a 2f 0a 20 20 69 66 28 20 70  space */.  if( p
10950 63 3e 30 20 29 7b 0a 20 20 20 20 75 33 32 20 6e  c>0 ){.    u32 n
10960 65 78 74 2c 20 73 69 7a 65 3b 0a 20 20 20 20 69  ext, size;.    i
10970 66 28 20 70 63 3c 69 43 65 6c 6c 46 69 72 73 74  f( pc<iCellFirst
10980 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49   ){.      /* EVI
10990 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 35 35 33  DENCE-OF: R-5553
109a0 30 2d 35 32 39 33 30 20 49 6e 20 61 20 77 65 6c  0-52930 In a wel
109b0 6c 2d 66 6f 72 6d 65 64 20 62 2d 74 72 65 65 20  l-formed b-tree 
109c0 70 61 67 65 2c 20 74 68 65 72 65 20 77 69 6c 6c  page, there will
109d0 0a 20 20 20 20 20 20 2a 2a 20 61 6c 77 61 79 73  .      ** always
109e0 20 62 65 20 61 74 20 6c 65 61 73 74 20 6f 6e 65   be at least one
109f0 20 63 65 6c 6c 20 62 65 66 6f 72 65 20 74 68 65   cell before the
10a00 20 66 69 72 73 74 20 66 72 65 65 62 6c 6f 63 6b   first freeblock
10a10 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
10a20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
10a30 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50 61 67  ORRUPT_PAGE(pPag
10a40 65 29 3b 20 0a 20 20 20 20 7d 0a 20 20 20 20 77  e); .    }.    w
10a50 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 20  hile( 1 ){.     
10a60 20 69 66 28 20 70 63 3e 69 43 65 6c 6c 4c 61 73   if( pc>iCellLas
10a70 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  t ){.        /* 
10a80 46 72 65 65 62 6c 6f 63 6b 20 6f 66 66 20 74 68  Freeblock off th
10a90 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70 61 67  e end of the pag
10aa0 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 74  e */.        ret
10ab0 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
10ac0 50 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a  PT_PAGE(pPage);.
10ad0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 65        }.      ne
10ae0 78 74 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  xt = get2byte(&d
10af0 61 74 61 5b 70 63 5d 29 3b 0a 20 20 20 20 20 20  ata[pc]);.      
10b00 73 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28  size = get2byte(
10b10 26 64 61 74 61 5b 70 63 2b 32 5d 29 3b 0a 20 20  &data[pc+2]);.  
10b20 20 20 20 20 6e 46 72 65 65 20 3d 20 6e 46 72 65      nFree = nFre
10b30 65 20 2b 20 73 69 7a 65 3b 0a 20 20 20 20 20 20  e + size;.      
10b40 69 66 28 20 6e 65 78 74 3c 3d 70 63 2b 73 69 7a  if( next<=pc+siz
10b50 65 2b 33 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  e+3 ) break;.   
10b60 20 20 20 70 63 20 3d 20 6e 65 78 74 3b 0a 20 20     pc = next;.  
10b70 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 65 78 74    }.    if( next
10b80 3e 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 46  >0 ){.      /* F
10b90 72 65 65 62 6c 6f 63 6b 20 6e 6f 74 20 69 6e 20  reeblock not in 
10ba0 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 20  ascending order 
10bb0 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  */.      return 
10bc0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50  SQLITE_CORRUPT_P
10bd0 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20 20 20  AGE(pPage);.    
10be0 7d 0a 20 20 20 20 69 66 28 20 70 63 2b 73 69 7a  }.    if( pc+siz
10bf0 65 3e 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29  e>(unsigned int)
10c00 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20  usableSize ){.  
10c10 20 20 20 20 2f 2a 20 4c 61 73 74 20 66 72 65 65      /* Last free
10c20 62 6c 6f 63 6b 20 65 78 74 65 6e 64 73 20 70 61  block extends pa
10c30 73 74 20 70 61 67 65 20 65 6e 64 20 2a 2f 0a 20  st page end */. 
10c40 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
10c50 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28  TE_CORRUPT_PAGE(
10c60 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20  pPage);.    }.  
10c70 7d 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69 73 20  }..  /* At this 
10c80 70 6f 69 6e 74 2c 20 6e 46 72 65 65 20 63 6f 6e  point, nFree con
10c90 74 61 69 6e 73 20 74 68 65 20 73 75 6d 20 6f 66  tains the sum of
10ca0 20 74 68 65 20 6f 66 66 73 65 74 20 74 6f 20 74   the offset to t
10cb0 68 65 20 73 74 61 72 74 0a 20 20 2a 2a 20 6f 66  he start.  ** of
10cc0 20 74 68 65 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e   the cell-conten
10cd0 74 20 61 72 65 61 20 70 6c 75 73 20 74 68 65 20  t area plus the 
10ce0 6e 75 6d 62 65 72 20 6f 66 20 66 72 65 65 20 62  number of free b
10cf0 79 74 65 73 20 77 69 74 68 69 6e 0a 20 20 2a 2a  ytes within.  **
10d00 20 74 68 65 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e   the cell-conten
10d10 74 20 61 72 65 61 2e 20 49 66 20 74 68 69 73 20  t area. If this 
10d20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
10d30 74 68 65 20 75 73 61 62 6c 65 2d 73 69 7a 65 0a  the usable-size.
10d40 20 20 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65    ** of the page
10d50 2c 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20  , then the page 
10d60 6d 75 73 74 20 62 65 20 63 6f 72 72 75 70 74 65  must be corrupte
10d70 64 2e 20 54 68 69 73 20 63 68 65 63 6b 20 61 6c  d. This check al
10d80 73 6f 0a 20 20 2a 2a 20 73 65 72 76 65 73 20 74  so.  ** serves t
10d90 6f 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68  o verify that th
10da0 65 20 6f 66 66 73 65 74 20 74 6f 20 74 68 65 20  e offset to the 
10db0 73 74 61 72 74 20 6f 66 20 74 68 65 20 63 65 6c  start of the cel
10dc0 6c 2d 63 6f 6e 74 65 6e 74 0a 20 20 2a 2a 20 61  l-content.  ** a
10dd0 72 65 61 2c 20 61 63 63 6f 72 64 69 6e 67 20 74  rea, according t
10de0 6f 20 74 68 65 20 70 61 67 65 20 68 65 61 64 65  o the page heade
10df0 72 2c 20 6c 69 65 73 20 77 69 74 68 69 6e 20 74  r, lies within t
10e00 68 65 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20  he page..  */.  
10e10 69 66 28 20 6e 46 72 65 65 3e 75 73 61 62 6c 65  if( nFree>usable
10e20 53 69 7a 65 20 29 7b 0a 20 20 20 20 72 65 74 75  Size ){.    retu
10e30 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
10e40 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20  T_PAGE(pPage);. 
10e50 20 7d 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72 65   }.  pPage->nFre
10e60 65 20 3d 20 28 75 31 36 29 28 6e 46 72 65 65 20  e = (u16)(nFree 
10e70 2d 20 69 43 65 6c 6c 46 69 72 73 74 29 3b 0a 20  - iCellFirst);. 
10e80 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d   pPage->isInit =
10e90 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   1;.  return SQL
10ea0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
10eb0 20 53 65 74 20 75 70 20 61 20 72 61 77 20 70 61   Set up a raw pa
10ec0 67 65 20 73 6f 20 74 68 61 74 20 69 74 20 6c 6f  ge so that it lo
10ed0 6f 6b 73 20 6c 69 6b 65 20 61 20 64 61 74 61 62  oks like a datab
10ee0 61 73 65 20 70 61 67 65 20 68 6f 6c 64 69 6e 67  ase page holding
10ef0 0a 2a 2a 20 6e 6f 20 65 6e 74 72 69 65 73 2e 0a  .** no entries..
10f00 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 7a  */.static void z
10f10 65 72 6f 50 61 67 65 28 4d 65 6d 50 61 67 65 20  eroPage(MemPage 
10f20 2a 70 50 61 67 65 2c 20 69 6e 74 20 66 6c 61 67  *pPage, int flag
10f30 73 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  s){.  unsigned c
10f40 68 61 72 20 2a 64 61 74 61 20 3d 20 70 50 61 67  har *data = pPag
10f50 65 2d 3e 61 44 61 74 61 3b 0a 20 20 42 74 53 68  e->aData;.  BtSh
10f60 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67  ared *pBt = pPag
10f70 65 2d 3e 70 42 74 3b 0a 20 20 75 38 20 68 64 72  e->pBt;.  u8 hdr
10f80 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66   = pPage->hdrOff
10f90 73 65 74 3b 0a 20 20 75 31 36 20 66 69 72 73 74  set;.  u16 first
10fa0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
10fb0 69 74 65 33 50 61 67 65 72 50 61 67 65 6e 75 6d  ite3PagerPagenum
10fc0 62 65 72 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ber(pPage->pDbPa
10fd0 67 65 29 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f  ge)==pPage->pgno
10fe0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
10ff0 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74  lite3PagerGetExt
11000 72 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  ra(pPage->pDbPag
11010 65 29 20 3d 3d 20 28 76 6f 69 64 2a 29 70 50 61  e) == (void*)pPa
11020 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ge );.  assert( 
11030 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44  sqlite3PagerGetD
11040 61 74 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ata(pPage->pDbPa
11050 67 65 29 20 3d 3d 20 64 61 74 61 20 29 3b 0a 20  ge) == data );. 
11060 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
11070 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
11080 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
11090 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
110a0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
110b0 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
110c0 20 20 69 66 28 20 70 42 74 2d 3e 62 74 73 46 6c    if( pBt->btsFl
110d0 61 67 73 20 26 20 42 54 53 5f 46 41 53 54 5f 53  ags & BTS_FAST_S
110e0 45 43 55 52 45 20 29 7b 0a 20 20 20 20 6d 65 6d  ECURE ){.    mem
110f0 73 65 74 28 26 64 61 74 61 5b 68 64 72 5d 2c 20  set(&data[hdr], 
11100 30 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  0, pBt->usableSi
11110 7a 65 20 2d 20 68 64 72 29 3b 0a 20 20 7d 0a 20  ze - hdr);.  }. 
11120 20 64 61 74 61 5b 68 64 72 5d 20 3d 20 28 63 68   data[hdr] = (ch
11130 61 72 29 66 6c 61 67 73 3b 0a 20 20 66 69 72 73  ar)flags;.  firs
11140 74 20 3d 20 68 64 72 20 2b 20 28 28 66 6c 61 67  t = hdr + ((flag
11150 73 26 50 54 46 5f 4c 45 41 46 29 3d 3d 30 20 3f  s&PTF_LEAF)==0 ?
11160 20 31 32 20 3a 20 38 29 3b 0a 20 20 6d 65 6d 73   12 : 8);.  mems
11170 65 74 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 2c  et(&data[hdr+1],
11180 20 30 2c 20 34 29 3b 0a 20 20 64 61 74 61 5b 68   0, 4);.  data[h
11190 64 72 2b 37 5d 20 3d 20 30 3b 0a 20 20 70 75 74  dr+7] = 0;.  put
111a0 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
111b0 35 5d 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  5], pBt->usableS
111c0 69 7a 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e  ize);.  pPage->n
111d0 46 72 65 65 20 3d 20 28 75 31 36 29 28 70 42 74  Free = (u16)(pBt
111e0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 66  ->usableSize - f
111f0 69 72 73 74 29 3b 0a 20 20 64 65 63 6f 64 65 46  irst);.  decodeF
11200 6c 61 67 73 28 70 50 61 67 65 2c 20 66 6c 61 67  lags(pPage, flag
11210 73 29 3b 0a 20 20 70 50 61 67 65 2d 3e 63 65 6c  s);.  pPage->cel
11220 6c 4f 66 66 73 65 74 20 3d 20 66 69 72 73 74 3b  lOffset = first;
11230 0a 20 20 70 50 61 67 65 2d 3e 61 44 61 74 61 45  .  pPage->aDataE
11240 6e 64 20 3d 20 26 64 61 74 61 5b 70 42 74 2d 3e  nd = &data[pBt->
11250 75 73 61 62 6c 65 53 69 7a 65 5d 3b 0a 20 20 70  usableSize];.  p
11260 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64 78 20 3d  Page->aCellIdx =
11270 20 26 64 61 74 61 5b 66 69 72 73 74 5d 3b 0a 20   &data[first];. 
11280 20 70 50 61 67 65 2d 3e 61 44 61 74 61 4f 66 73   pPage->aDataOfs
11290 74 20 3d 20 26 64 61 74 61 5b 70 50 61 67 65 2d  t = &data[pPage-
112a0 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 5d 3b 0a  >childPtrSize];.
112b0 20 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c    pPage->nOverfl
112c0 6f 77 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74  ow = 0;.  assert
112d0 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e  ( pBt->pageSize>
112e0 3d 35 31 32 20 26 26 20 70 42 74 2d 3e 70 61 67  =512 && pBt->pag
112f0 65 53 69 7a 65 3c 3d 36 35 35 33 36 20 29 3b 0a  eSize<=65536 );.
11300 20 20 70 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67    pPage->maskPag
11310 65 20 3d 20 28 75 31 36 29 28 70 42 74 2d 3e 70  e = (u16)(pBt->p
11320 61 67 65 53 69 7a 65 20 2d 20 31 29 3b 0a 20 20  ageSize - 1);.  
11330 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 30  pPage->nCell = 0
11340 3b 0a 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69  ;.  pPage->isIni
11350 74 20 3d 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  t = 1;.}.../*.**
11360 20 43 6f 6e 76 65 72 74 20 61 20 44 62 50 61 67   Convert a DbPag
11370 65 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  e obtained from 
11380 74 68 65 20 70 61 67 65 72 20 69 6e 74 6f 20 61  the pager into a
11390 20 4d 65 6d 50 61 67 65 20 75 73 65 64 20 62 79   MemPage used by
113a0 0a 2a 2a 20 74 68 65 20 62 74 72 65 65 20 6c 61  .** the btree la
113b0 79 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4d  yer..*/.static M
113c0 65 6d 50 61 67 65 20 2a 62 74 72 65 65 50 61 67  emPage *btreePag
113d0 65 46 72 6f 6d 44 62 50 61 67 65 28 44 62 50 61  eFromDbPage(DbPa
113e0 67 65 20 2a 70 44 62 50 61 67 65 2c 20 50 67 6e  ge *pDbPage, Pgn
113f0 6f 20 70 67 6e 6f 2c 20 42 74 53 68 61 72 65 64  o pgno, BtShared
11400 20 2a 70 42 74 29 7b 0a 20 20 4d 65 6d 50 61 67   *pBt){.  MemPag
11410 65 20 2a 70 50 61 67 65 20 3d 20 28 4d 65 6d 50  e *pPage = (MemP
11420 61 67 65 2a 29 73 71 6c 69 74 65 33 50 61 67 65  age*)sqlite3Page
11430 72 47 65 74 45 78 74 72 61 28 70 44 62 50 61 67  rGetExtra(pDbPag
11440 65 29 3b 0a 20 20 69 66 28 20 70 67 6e 6f 21 3d  e);.  if( pgno!=
11450 70 50 61 67 65 2d 3e 70 67 6e 6f 20 29 7b 0a 20  pPage->pgno ){. 
11460 20 20 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20     pPage->aData 
11470 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  = sqlite3PagerGe
11480 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a  tData(pDbPage);.
11490 20 20 20 20 70 50 61 67 65 2d 3e 70 44 62 50 61      pPage->pDbPa
114a0 67 65 20 3d 20 70 44 62 50 61 67 65 3b 0a 20 20  ge = pDbPage;.  
114b0 20 20 70 50 61 67 65 2d 3e 70 42 74 20 3d 20 70    pPage->pBt = p
114c0 42 74 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 70  Bt;.    pPage->p
114d0 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20  gno = pgno;.    
114e0 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
114f0 20 3d 20 70 67 6e 6f 3d 3d 31 20 3f 20 31 30 30   = pgno==1 ? 100
11500 20 3a 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65   : 0;.  }.  asse
11510 72 74 28 20 70 50 61 67 65 2d 3e 61 44 61 74 61  rt( pPage->aData
11520 3d 3d 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  ==sqlite3PagerGe
11530 74 44 61 74 61 28 70 44 62 50 61 67 65 29 20 29  tData(pDbPage) )
11540 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  ;.  return pPage
11550 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20  ; .}../*.** Get 
11560 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20  a page from the 
11570 70 61 67 65 72 2e 20 20 49 6e 69 74 69 61 6c 69  pager.  Initiali
11580 7a 65 20 74 68 65 20 4d 65 6d 50 61 67 65 2e 70  ze the MemPage.p
11590 42 74 20 61 6e 64 0a 2a 2a 20 4d 65 6d 50 61 67  Bt and.** MemPag
115a0 65 2e 61 44 61 74 61 20 65 6c 65 6d 65 6e 74 73  e.aData elements
115b0 20 69 66 20 6e 65 65 64 65 64 2e 20 20 53 65 65   if needed.  See
115c0 20 61 6c 73 6f 3a 20 62 74 72 65 65 47 65 74 55   also: btreeGetU
115d0 6e 75 73 65 64 50 61 67 65 28 29 2e 0a 2a 2a 0a  nusedPage()..**.
115e0 2a 2a 20 49 66 20 74 68 65 20 50 41 47 45 52 5f  ** If the PAGER_
115f0 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 66 6c  GET_NOCONTENT fl
11600 61 67 20 69 73 20 73 65 74 2c 20 69 74 20 6d 65  ag is set, it me
11610 61 6e 73 20 74 68 61 74 20 77 65 20 64 6f 20 6e  ans that we do n
11620 6f 74 20 63 61 72 65 0a 2a 2a 20 61 62 6f 75 74  ot care.** about
11630 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
11640 74 68 65 20 70 61 67 65 20 61 74 20 74 68 69 73  the page at this
11650 20 74 69 6d 65 2e 20 20 53 6f 20 64 6f 20 6e 6f   time.  So do no
11660 74 20 67 6f 20 74 6f 20 74 68 65 20 64 69 73 6b  t go to the disk
11670 0a 2a 2a 20 74 6f 20 66 65 74 63 68 20 74 68 65  .** to fetch the
11680 20 63 6f 6e 74 65 6e 74 2e 20 20 4a 75 73 74 20   content.  Just 
11690 66 69 6c 6c 20 69 6e 20 74 68 65 20 63 6f 6e 74  fill in the cont
116a0 65 6e 74 20 77 69 74 68 20 7a 65 72 6f 73 20 66  ent with zeros f
116b0 6f 72 20 6e 6f 77 2e 0a 2a 2a 20 49 66 20 69 6e  or now..** If in
116c0 20 74 68 65 20 66 75 74 75 72 65 20 77 65 20 63   the future we c
116d0 61 6c 6c 20 73 71 6c 69 74 65 33 50 61 67 65 72  all sqlite3Pager
116e0 57 72 69 74 65 28 29 20 6f 6e 20 74 68 69 73 20  Write() on this 
116f0 70 61 67 65 2c 20 74 68 61 74 0a 2a 2a 20 6d 65  page, that.** me
11700 61 6e 73 20 77 65 20 68 61 76 65 20 73 74 61 72  ans we have star
11710 74 65 64 20 74 6f 20 62 65 20 63 6f 6e 63 65 72  ted to be concer
11720 6e 65 64 20 61 62 6f 75 74 20 63 6f 6e 74 65 6e  ned about conten
11730 74 20 61 6e 64 20 74 68 65 20 64 69 73 6b 0a 2a  t and the disk.*
11740 2a 20 72 65 61 64 20 73 68 6f 75 6c 64 20 6f 63  * read should oc
11750 63 75 72 20 61 74 20 74 68 61 74 20 70 6f 69 6e  cur at that poin
11760 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
11770 20 62 74 72 65 65 47 65 74 50 61 67 65 28 0a 20   btreeGetPage(. 
11780 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20   BtShared *pBt, 
11790 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72        /* The btr
117a0 65 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e  ee */.  Pgno pgn
117b0 6f 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  o,           /* 
117c0 4e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70 61  Number of the pa
117d0 67 65 20 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20  ge to fetch */. 
117e0 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67   MemPage **ppPag
117f0 65 2c 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20  e,    /* Return 
11800 74 68 65 20 70 61 67 65 20 69 6e 20 74 68 69 73  the page in this
11810 20 70 61 72 61 6d 65 74 65 72 20 2a 2f 0a 20 20   parameter */.  
11820 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20 20  int flags       
11830 20 20 20 20 20 2f 2a 20 50 41 47 45 52 5f 47 45       /* PAGER_GE
11840 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 6f 72 20 50  T_NOCONTENT or P
11850 41 47 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c  AGER_GET_READONL
11860 59 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  Y */.){.  int rc
11870 3b 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62 50  ;.  DbPage *pDbP
11880 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  age;..  assert( 
11890 66 6c 61 67 73 3d 3d 30 20 7c 7c 20 66 6c 61 67  flags==0 || flag
118a0 73 3d 3d 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43  s==PAGER_GET_NOC
118b0 4f 4e 54 45 4e 54 20 7c 7c 20 66 6c 61 67 73 3d  ONTENT || flags=
118c0 3d 50 41 47 45 52 5f 47 45 54 5f 52 45 41 44 4f  =PAGER_GET_READO
118d0 4e 4c 59 20 29 3b 0a 20 20 61 73 73 65 72 74 28  NLY );.  assert(
118e0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
118f0 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
11900 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
11910 33 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e 70  3PagerGet(pBt->p
11920 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20 28 44 62  Pager, pgno, (Db
11930 50 61 67 65 2a 2a 29 26 70 44 62 50 61 67 65 2c  Page**)&pDbPage,
11940 20 66 6c 61 67 73 29 3b 0a 20 20 69 66 28 20 72   flags);.  if( r
11950 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
11960 20 2a 70 70 50 61 67 65 20 3d 20 62 74 72 65 65   *ppPage = btree
11970 50 61 67 65 46 72 6f 6d 44 62 50 61 67 65 28 70  PageFromDbPage(p
11980 44 62 50 61 67 65 2c 20 70 67 6e 6f 2c 20 70 42  DbPage, pgno, pB
11990 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  t);.  return SQL
119a0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
119b0 20 52 65 74 72 69 65 76 65 20 61 20 70 61 67 65   Retrieve a page
119c0 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20   from the pager 
119d0 63 61 63 68 65 2e 20 49 66 20 74 68 65 20 72 65  cache. If the re
119e0 71 75 65 73 74 65 64 20 70 61 67 65 20 69 73 20  quested page is 
119f0 6e 6f 74 0a 2a 2a 20 61 6c 72 65 61 64 79 20 69  not.** already i
11a00 6e 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68  n the pager cach
11a10 65 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 20 49  e return NULL. I
11a20 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 4d 65  nitialize the Me
11a30 6d 50 61 67 65 2e 70 42 74 20 61 6e 64 0a 2a 2a  mPage.pBt and.**
11a40 20 4d 65 6d 50 61 67 65 2e 61 44 61 74 61 20 65   MemPage.aData e
11a50 6c 65 6d 65 6e 74 73 20 69 66 20 6e 65 65 64 65  lements if neede
11a60 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4d 65 6d  d..*/.static Mem
11a70 50 61 67 65 20 2a 62 74 72 65 65 50 61 67 65 4c  Page *btreePageL
11a80 6f 6f 6b 75 70 28 42 74 53 68 61 72 65 64 20 2a  ookup(BtShared *
11a90 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b  pBt, Pgno pgno){
11aa0 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61  .  DbPage *pDbPa
11ab0 67 65 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  ge;.  assert( sq
11ac0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
11ad0 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
11ae0 20 20 70 44 62 50 61 67 65 20 3d 20 73 71 6c 69    pDbPage = sqli
11af0 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 70  te3PagerLookup(p
11b00 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f  Bt->pPager, pgno
11b10 29 3b 0a 20 20 69 66 28 20 70 44 62 50 61 67 65  );.  if( pDbPage
11b20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 62   ){.    return b
11b30 74 72 65 65 50 61 67 65 46 72 6f 6d 44 62 50 61  treePageFromDbPa
11b40 67 65 28 70 44 62 50 61 67 65 2c 20 70 67 6e 6f  ge(pDbPage, pgno
11b50 2c 20 70 42 74 29 3b 0a 20 20 7d 0a 20 20 72 65  , pBt);.  }.  re
11b60 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
11b70 20 52 65 74 75 72 6e 20 74 68 65 20 73 69 7a 65   Return the size
11b80 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
11b90 20 66 69 6c 65 20 69 6e 20 70 61 67 65 73 2e 20   file in pages. 
11ba0 49 66 20 74 68 65 72 65 20 69 73 20 61 6e 79 20  If there is any 
11bb0 6b 69 6e 64 20 6f 66 0a 2a 2a 20 65 72 72 6f 72  kind of.** error
11bc0 2c 20 72 65 74 75 72 6e 20 28 28 75 6e 73 69 67  , return ((unsig
11bd0 6e 65 64 20 69 6e 74 29 2d 31 29 2e 0a 2a 2f 0a  ned int)-1)..*/.
11be0 73 74 61 74 69 63 20 50 67 6e 6f 20 62 74 72 65  static Pgno btre
11bf0 65 50 61 67 65 63 6f 75 6e 74 28 42 74 53 68 61  ePagecount(BtSha
11c00 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 72 65 74  red *pBt){.  ret
11c10 75 72 6e 20 70 42 74 2d 3e 6e 50 61 67 65 3b 0a  urn pBt->nPage;.
11c20 7d 0a 75 33 32 20 73 71 6c 69 74 65 33 42 74 72  }.u32 sqlite3Btr
11c30 65 65 4c 61 73 74 50 61 67 65 28 42 74 72 65 65  eeLastPage(Btree
11c40 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20   *p){.  assert( 
11c50 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64  sqlite3BtreeHold
11c60 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61  sMutex(p) );.  a
11c70 73 73 65 72 74 28 20 28 28 70 2d 3e 70 42 74 2d  ssert( ((p->pBt-
11c80 3e 6e 50 61 67 65 29 26 30 78 38 30 30 30 30 30  >nPage)&0x800000
11c90 30 30 29 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75  00)==0 );.  retu
11ca0 72 6e 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e  rn btreePagecoun
11cb0 74 28 70 2d 3e 70 42 74 29 3b 0a 7d 0a 0a 2f 2a  t(p->pBt);.}../*
11cc0 0a 2a 2a 20 47 65 74 20 61 20 70 61 67 65 20 66  .** Get a page f
11cd0 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20 61 6e  rom the pager an
11ce0 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 69 74 2e  d initialize it.
11cf0 0a 2a 2a 0a 2a 2a 20 49 66 20 70 43 75 72 21 3d  .**.** If pCur!=
11d00 30 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20  0 then the page 
11d10 69 73 20 62 65 69 6e 67 20 66 65 74 63 68 65 64  is being fetched
11d20 20 61 73 20 70 61 72 74 20 6f 66 20 61 20 6d 6f   as part of a mo
11d30 76 65 54 6f 43 68 69 6c 64 28 29 0a 2a 2a 20 63  veToChild().** c
11d40 61 6c 6c 2e 20 20 44 6f 20 61 64 64 69 74 69 6f  all.  Do additio
11d50 6e 61 6c 20 73 61 6e 69 74 79 20 63 68 65 63 6b  nal sanity check
11d60 69 6e 67 20 6f 6e 20 74 68 65 20 70 61 67 65 20  ing on the page 
11d70 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a  in this case..**
11d80 20 41 6e 64 20 69 66 20 74 68 65 20 66 65 74 63   And if the fetc
11d90 68 20 66 61 69 6c 73 2c 20 74 68 69 73 20 72 6f  h fails, this ro
11da0 75 74 69 6e 65 20 6d 75 73 74 20 64 65 63 72 65  utine must decre
11db0 6d 65 6e 74 20 70 43 75 72 2d 3e 69 50 61 67 65  ment pCur->iPage
11dc0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65  ..**.** The page
11dd0 20 69 73 20 66 65 74 63 68 65 64 20 61 73 20 72   is fetched as r
11de0 65 61 64 2d 77 72 69 74 65 20 75 6e 6c 65 73 73  ead-write unless
11df0 20 70 43 75 72 20 69 73 20 6e 6f 74 20 4e 55 4c   pCur is not NUL
11e00 4c 20 61 6e 64 20 69 73 0a 2a 2a 20 61 20 72 65  L and is.** a re
11e10 61 64 2d 6f 6e 6c 79 20 63 75 72 73 6f 72 2e 0a  ad-only cursor..
11e20 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
11e30 72 20 6f 63 63 75 72 73 2c 20 74 68 65 6e 20 2a  r occurs, then *
11e40 70 70 50 61 67 65 20 69 73 20 75 6e 64 65 66 69  ppPage is undefi
11e50 6e 65 64 2e 20 49 74 0a 2a 2a 20 6d 61 79 20 72  ned. It.** may r
11e60 65 6d 61 69 6e 20 75 6e 63 68 61 6e 67 65 64 2c  emain unchanged,
11e70 20 6f 72 20 69 74 20 6d 61 79 20 62 65 20 73 65   or it may be se
11e80 74 20 74 6f 20 61 6e 20 69 6e 76 61 6c 69 64 20  t to an invalid 
11e90 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  value..*/.static
11ea0 20 69 6e 74 20 67 65 74 41 6e 64 49 6e 69 74 50   int getAndInitP
11eb0 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64 20  age(.  BtShared 
11ec0 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20 20 20  *pBt,           
11ed0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61         /* The da
11ee0 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
11ef0 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20   Pgno pgno,     
11f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11f10 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 68   /* Number of th
11f20 65 20 70 61 67 65 20 74 6f 20 67 65 74 20 2a 2f  e page to get */
11f30 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50  .  MemPage **ppP
11f40 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  age,            
11f50 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
11f60 70 61 67 65 20 70 6f 69 6e 74 65 72 20 68 65 72  page pointer her
11f70 65 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72 20  e */.  BtCursor 
11f80 2a 70 43 75 72 2c 20 20 20 20 20 20 20 20 20 20  *pCur,          
11f90 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72         /* Cursor
11fa0 20 74 6f 20 72 65 63 65 69 76 65 20 74 68 65 20   to receive the 
11fb0 70 61 67 65 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f  page, or NULL */
11fc0 0a 20 20 69 6e 74 20 62 52 65 61 64 4f 6e 6c 79  .  int bReadOnly
11fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11fe0 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 61     /* True for a
11ff0 20 72 65 61 64 2d 6f 6e 6c 79 20 70 61 67 65 20   read-only page 
12000 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  */.){.  int rc;.
12010 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67    DbPage *pDbPag
12020 65 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  e;.  assert( sql
12030 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
12040 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
12050 20 61 73 73 65 72 74 28 20 70 43 75 72 3d 3d 30   assert( pCur==0
12060 20 7c 7c 20 70 70 50 61 67 65 3d 3d 26 70 43 75   || ppPage==&pCu
12070 72 2d 3e 70 50 61 67 65 20 29 3b 0a 20 20 61 73  r->pPage );.  as
12080 73 65 72 74 28 20 70 43 75 72 3d 3d 30 20 7c 7c  sert( pCur==0 ||
12090 20 62 52 65 61 64 4f 6e 6c 79 3d 3d 70 43 75 72   bReadOnly==pCur
120a0 2d 3e 63 75 72 50 61 67 65 72 46 6c 61 67 73 20  ->curPagerFlags 
120b0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
120c0 72 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 69 50  r==0 || pCur->iP
120d0 61 67 65 3e 30 20 29 3b 0a 0a 20 20 69 66 28 20  age>0 );..  if( 
120e0 70 67 6e 6f 3e 62 74 72 65 65 50 61 67 65 63 6f  pgno>btreePageco
120f0 75 6e 74 28 70 42 74 29 20 29 7b 0a 20 20 20 20  unt(pBt) ){.    
12100 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
12110 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 67 6f  UPT_BKPT;.    go
12120 74 6f 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67  to getAndInitPag
12130 65 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 72  e_error;.  }.  r
12140 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
12150 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  Get(pBt->pPager,
12160 20 70 67 6e 6f 2c 20 28 44 62 50 61 67 65 2a 2a   pgno, (DbPage**
12170 29 26 70 44 62 50 61 67 65 2c 20 62 52 65 61 64  )&pDbPage, bRead
12180 4f 6e 6c 79 29 3b 0a 20 20 69 66 28 20 72 63 20  Only);.  if( rc 
12190 29 7b 0a 20 20 20 20 67 6f 74 6f 20 67 65 74 41  ){.    goto getA
121a0 6e 64 49 6e 69 74 50 61 67 65 5f 65 72 72 6f 72  ndInitPage_error
121b0 3b 0a 20 20 7d 0a 20 20 2a 70 70 50 61 67 65 20  ;.  }.  *ppPage 
121c0 3d 20 28 4d 65 6d 50 61 67 65 2a 29 73 71 6c 69  = (MemPage*)sqli
121d0 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61  te3PagerGetExtra
121e0 28 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28  (pDbPage);.  if(
121f0 20 28 2a 70 70 50 61 67 65 29 2d 3e 69 73 49 6e   (*ppPage)->isIn
12200 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 62 74 72  it==0 ){.    btr
12210 65 65 50 61 67 65 46 72 6f 6d 44 62 50 61 67 65  eePageFromDbPage
12220 28 70 44 62 50 61 67 65 2c 20 70 67 6e 6f 2c 20  (pDbPage, pgno, 
12230 70 42 74 29 3b 0a 20 20 20 20 72 63 20 3d 20 62  pBt);.    rc = b
12240 74 72 65 65 49 6e 69 74 50 61 67 65 28 2a 70 70  treeInitPage(*pp
12250 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
12260 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
12270 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
12280 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20  e(*ppPage);.    
12290 20 20 67 6f 74 6f 20 67 65 74 41 6e 64 49 6e 69    goto getAndIni
122a0 74 50 61 67 65 5f 65 72 72 6f 72 3b 0a 20 20 20  tPage_error;.   
122b0 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28   }.  }.  assert(
122c0 20 28 2a 70 70 50 61 67 65 29 2d 3e 70 67 6e 6f   (*ppPage)->pgno
122d0 3d 3d 70 67 6e 6f 20 29 3b 0a 20 20 61 73 73 65  ==pgno );.  asse
122e0 72 74 28 20 28 2a 70 70 50 61 67 65 29 2d 3e 61  rt( (*ppPage)->a
122f0 44 61 74 61 3d 3d 73 71 6c 69 74 65 33 50 61 67  Data==sqlite3Pag
12300 65 72 47 65 74 44 61 74 61 28 70 44 62 50 61 67  erGetData(pDbPag
12310 65 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 6f  e) );..  /* If o
12320 62 74 61 69 6e 69 6e 67 20 61 20 63 68 69 6c 64  btaining a child
12330 20 70 61 67 65 20 66 6f 72 20 61 20 63 75 72 73   page for a curs
12340 6f 72 2c 20 77 65 20 6d 75 73 74 20 76 65 72 69  or, we must veri
12350 66 79 20 74 68 61 74 20 74 68 65 20 70 61 67 65  fy that the page
12360 20 69 73 0a 20 20 2a 2a 20 63 6f 6d 70 61 74 69   is.  ** compati
12370 62 6c 65 20 77 69 74 68 20 74 68 65 20 72 6f 6f  ble with the roo
12380 74 20 70 61 67 65 2e 20 2a 2f 0a 20 20 69 66 28  t page. */.  if(
12390 20 70 43 75 72 20 26 26 20 28 28 2a 70 70 50 61   pCur && ((*ppPa
123a0 67 65 29 2d 3e 6e 43 65 6c 6c 3c 31 20 7c 7c 20  ge)->nCell<1 || 
123b0 28 2a 70 70 50 61 67 65 29 2d 3e 69 6e 74 4b 65  (*ppPage)->intKe
123c0 79 21 3d 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b  y!=pCur->curIntK
123d0 65 79 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ey) ){.    rc = 
123e0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50  SQLITE_CORRUPT_P
123f0 47 4e 4f 28 70 67 6e 6f 29 3b 0a 20 20 20 20 72  GNO(pgno);.    r
12400 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50 61  eleasePage(*ppPa
12410 67 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 67 65  ge);.    goto ge
12420 74 41 6e 64 49 6e 69 74 50 61 67 65 5f 65 72 72  tAndInitPage_err
12430 6f 72 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  or;.  }.  return
12440 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 67 65 74   SQLITE_OK;..get
12450 41 6e 64 49 6e 69 74 50 61 67 65 5f 65 72 72 6f  AndInitPage_erro
12460 72 3a 0a 20 20 69 66 28 20 70 43 75 72 20 29 7b  r:.  if( pCur ){
12470 0a 20 20 20 20 70 43 75 72 2d 3e 69 50 61 67 65  .    pCur->iPage
12480 2d 2d 3b 0a 20 20 20 20 70 43 75 72 2d 3e 70 50  --;.    pCur->pP
12490 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61  age = pCur->apPa
124a0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b  ge[pCur->iPage];
124b0 0a 20 20 7d 0a 20 20 74 65 73 74 63 61 73 65 28  .  }.  testcase(
124c0 20 70 67 6e 6f 3d 3d 30 20 29 3b 0a 20 20 61 73   pgno==0 );.  as
124d0 73 65 72 74 28 20 70 67 6e 6f 21 3d 30 20 7c 7c  sert( pgno!=0 ||
124e0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 43 4f 52 52   rc==SQLITE_CORR
124f0 55 50 54 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  UPT );.  return 
12500 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c  rc;.}../*.** Rel
12510 65 61 73 65 20 61 20 4d 65 6d 50 61 67 65 2e 20  ease a MemPage. 
12520 20 54 68 69 73 20 73 68 6f 75 6c 64 20 62 65 20   This should be 
12530 63 61 6c 6c 65 64 20 6f 6e 63 65 20 66 6f 72 20  called once for 
12540 65 61 63 68 20 70 72 69 6f 72 0a 2a 2a 20 63 61  each prior.** ca
12550 6c 6c 20 74 6f 20 62 74 72 65 65 47 65 74 50 61  ll to btreeGetPa
12560 67 65 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65 31 20  ge..**.** Page1 
12570 69 73 20 61 20 73 70 65 63 69 61 6c 20 63 61 73  is a special cas
12580 65 20 61 6e 64 20 6d 75 73 74 20 62 65 20 72 65  e and must be re
12590 6c 65 61 73 65 64 20 75 73 69 6e 67 20 72 65 6c  leased using rel
125a0 65 61 73 65 50 61 67 65 4f 6e 65 28 29 2e 0a 2a  easePageOne()..*
125b0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65  /.static void re
125c0 6c 65 61 73 65 50 61 67 65 4e 6f 74 4e 75 6c 6c  leasePageNotNull
125d0 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29  (MemPage *pPage)
125e0 7b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  {.  assert( pPag
125f0 65 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 61 73  e->aData );.  as
12600 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74  sert( pPage->pBt
12610 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
12620 61 67 65 2d 3e 70 44 62 50 61 67 65 21 3d 30 20  age->pDbPage!=0 
12630 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
12640 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72  ite3PagerGetExtr
12650 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  a(pPage->pDbPage
12660 29 20 3d 3d 20 28 76 6f 69 64 2a 29 70 50 61 67  ) == (void*)pPag
12670 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  e );.  assert( s
12680 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61  qlite3PagerGetDa
12690 74 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  ta(pPage->pDbPag
126a0 65 29 3d 3d 70 50 61 67 65 2d 3e 61 44 61 74 61  e)==pPage->aData
126b0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
126c0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
126d0 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
126e0 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  ex) );.  sqlite3
126f0 50 61 67 65 72 55 6e 72 65 66 4e 6f 74 4e 75 6c  PagerUnrefNotNul
12700 6c 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  l(pPage->pDbPage
12710 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64  );.}.static void
12720 20 72 65 6c 65 61 73 65 50 61 67 65 28 4d 65 6d   releasePage(Mem
12730 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20  Page *pPage){.  
12740 69 66 28 20 70 50 61 67 65 20 29 20 72 65 6c 65  if( pPage ) rele
12750 61 73 65 50 61 67 65 4e 6f 74 4e 75 6c 6c 28 70  asePageNotNull(p
12760 50 61 67 65 29 3b 0a 7d 0a 73 74 61 74 69 63 20  Page);.}.static 
12770 76 6f 69 64 20 72 65 6c 65 61 73 65 50 61 67 65  void releasePage
12780 4f 6e 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  One(MemPage *pPa
12790 67 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  ge){.  assert( p
127a0 50 61 67 65 21 3d 30 20 29 3b 0a 20 20 61 73 73  Page!=0 );.  ass
127b0 65 72 74 28 20 70 50 61 67 65 2d 3e 61 44 61 74  ert( pPage->aDat
127c0 61 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  a );.  assert( p
127d0 50 61 67 65 2d 3e 70 42 74 20 29 3b 0a 20 20 61  Page->pBt );.  a
127e0 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 44  ssert( pPage->pD
127f0 62 50 61 67 65 21 3d 30 20 29 3b 0a 20 20 61 73  bPage!=0 );.  as
12800 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
12810 65 72 47 65 74 45 78 74 72 61 28 70 50 61 67 65  erGetExtra(pPage
12820 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d 20 28 76  ->pDbPage) == (v
12830 6f 69 64 2a 29 70 50 61 67 65 20 29 3b 0a 20 20  oid*)pPage );.  
12840 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
12850 61 67 65 72 47 65 74 44 61 74 61 28 70 50 61 67  agerGetData(pPag
12860 65 2d 3e 70 44 62 50 61 67 65 29 3d 3d 70 50 61  e->pDbPage)==pPa
12870 67 65 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 61  ge->aData );.  a
12880 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
12890 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
128a0 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
128b0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
128c0 72 65 66 50 61 67 65 4f 6e 65 28 70 50 61 67 65  refPageOne(pPage
128d0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 7d 0a 0a 2f  ->pDbPage);.}../
128e0 2a 0a 2a 2a 20 47 65 74 20 61 6e 20 75 6e 75 73  *.** Get an unus
128f0 65 64 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54  ed page..**.** T
12900 68 69 73 20 77 6f 72 6b 73 20 6a 75 73 74 20 6c  his works just l
12910 69 6b 65 20 62 74 72 65 65 47 65 74 50 61 67 65  ike btreeGetPage
12920 28 29 20 77 69 74 68 20 74 68 65 20 61 64 64 69  () with the addi
12930 74 69 6f 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  tion:.**.**   * 
12940 20 49 66 20 74 68 65 20 70 61 67 65 20 69 73 20   If the page is 
12950 61 6c 72 65 61 64 79 20 69 6e 20 75 73 65 20 66  already in use f
12960 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 75  or some other pu
12970 72 70 6f 73 65 2c 20 69 6d 6d 65 64 69 61 74 65  rpose, immediate
12980 6c 79 0a 2a 2a 20 20 20 20 20 20 72 65 6c 65 61  ly.**      relea
12990 73 65 20 69 74 20 61 6e 64 20 72 65 74 75 72 6e  se it and return
129a0 20 61 6e 20 53 51 4c 49 54 45 5f 43 55 52 52 55   an SQLITE_CURRU
129b0 50 54 20 65 72 72 6f 72 2e 0a 2a 2a 20 20 20 2a  PT error..**   *
129c0 20 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20    Make sure the 
129d0 69 73 49 6e 69 74 20 66 6c 61 67 20 69 73 20 63  isInit flag is c
129e0 6c 65 61 72 0a 2a 2f 0a 73 74 61 74 69 63 20 69  lear.*/.static i
129f0 6e 74 20 62 74 72 65 65 47 65 74 55 6e 75 73 65  nt btreeGetUnuse
12a00 64 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65  dPage(.  BtShare
12a10 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 2f 2a  d *pBt,       /*
12a20 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20   The btree */.  
12a30 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20  Pgno pgno,      
12a40 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
12a50 66 20 74 68 65 20 70 61 67 65 20 74 6f 20 66 65  f the page to fe
12a60 74 63 68 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  tch */.  MemPage
12a70 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 2f 2a   **ppPage,    /*
12a80 20 52 65 74 75 72 6e 20 74 68 65 20 70 61 67 65   Return the page
12a90 20 69 6e 20 74 68 69 73 20 70 61 72 61 6d 65 74   in this paramet
12aa0 65 72 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  er */.  int flag
12ab0 73 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  s            /* 
12ac0 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54  PAGER_GET_NOCONT
12ad0 45 4e 54 20 6f 72 20 50 41 47 45 52 5f 47 45 54  ENT or PAGER_GET
12ae0 5f 52 45 41 44 4f 4e 4c 59 20 2a 2f 0a 29 7b 0a  _READONLY */.){.
12af0 20 20 69 6e 74 20 72 63 20 3d 20 62 74 72 65 65    int rc = btree
12b00 47 65 74 50 61 67 65 28 70 42 74 2c 20 70 67 6e  GetPage(pBt, pgn
12b10 6f 2c 20 70 70 50 61 67 65 2c 20 66 6c 61 67 73  o, ppPage, flags
12b20 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
12b30 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
12b40 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  ( sqlite3PagerPa
12b50 67 65 52 65 66 63 6f 75 6e 74 28 28 2a 70 70 50  geRefcount((*ppP
12b60 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3e 31  age)->pDbPage)>1
12b70 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73   ){.      releas
12b80 65 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a  ePage(*ppPage);.
12b90 20 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20        *ppPage = 
12ba0 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  0;.      return 
12bb0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
12bc0 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 28  KPT;.    }.    (
12bd0 2a 70 70 50 61 67 65 29 2d 3e 69 73 49 6e 69 74  *ppPage)->isInit
12be0 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
12bf0 20 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a     *ppPage = 0;.
12c00 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
12c10 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 44 75 72 69 6e  .}.../*.** Durin
12c20 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 77 68  g a rollback, wh
12c30 65 6e 20 74 68 65 20 70 61 67 65 72 20 72 65 6c  en the pager rel
12c40 6f 61 64 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  oads information
12c50 20 69 6e 74 6f 20 74 68 65 20 63 61 63 68 65 0a   into the cache.
12c60 2a 2a 20 73 6f 20 74 68 61 74 20 74 68 65 20 63  ** so that the c
12c70 61 63 68 65 20 69 73 20 72 65 73 74 6f 72 65 64  ache is restored
12c80 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c   to its original
12c90 20 73 74 61 74 65 20 61 74 20 74 68 65 20 73 74   state at the st
12ca0 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65 20 74 72  art of.** the tr
12cb0 61 6e 73 61 63 74 69 6f 6e 2c 20 66 6f 72 20 65  ansaction, for e
12cc0 61 63 68 20 70 61 67 65 20 72 65 73 74 6f 72 65  ach page restore
12cd0 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  d this routine i
12ce0 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20  s called..**.** 
12cf0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6e 65 65  This routine nee
12d00 64 73 20 74 6f 20 72 65 73 65 74 20 74 68 65 20  ds to reset the 
12d10 65 78 74 72 61 20 64 61 74 61 20 73 65 63 74 69  extra data secti
12d20 6f 6e 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  on at the end of
12d30 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 74 6f 20   the.** page to 
12d40 61 67 72 65 65 20 77 69 74 68 20 74 68 65 20 72  agree with the r
12d50 65 73 74 6f 72 65 64 20 64 61 74 61 2e 0a 2a 2f  estored data..*/
12d60 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
12d70 65 52 65 69 6e 69 74 28 44 62 50 61 67 65 20 2a  eReinit(DbPage *
12d80 70 44 61 74 61 29 7b 0a 20 20 4d 65 6d 50 61 67  pData){.  MemPag
12d90 65 20 2a 70 50 61 67 65 3b 0a 20 20 70 50 61 67  e *pPage;.  pPag
12da0 65 20 3d 20 28 4d 65 6d 50 61 67 65 20 2a 29 73  e = (MemPage *)s
12db0 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78  qlite3PagerGetEx
12dc0 74 72 61 28 70 44 61 74 61 29 3b 0a 20 20 61 73  tra(pData);.  as
12dd0 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
12de0 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28 70  erPageRefcount(p
12df0 44 61 74 61 29 3e 30 20 29 3b 0a 20 20 69 66 28  Data)>0 );.  if(
12e00 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29   pPage->isInit )
12e10 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  {.    assert( sq
12e20 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
12e30 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
12e40 65 78 29 20 29 3b 0a 20 20 20 20 70 50 61 67 65  ex) );.    pPage
12e50 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20  ->isInit = 0;.  
12e60 20 20 69 66 28 20 73 71 6c 69 74 65 33 50 61 67    if( sqlite3Pag
12e70 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28 70  erPageRefcount(p
12e80 44 61 74 61 29 3e 31 20 29 7b 0a 20 20 20 20 20  Data)>1 ){.     
12e90 20 2f 2a 20 70 50 61 67 65 20 6d 69 67 68 74 20   /* pPage might 
12ea0 6e 6f 74 20 62 65 20 61 20 62 74 72 65 65 20 70  not be a btree p
12eb0 61 67 65 3b 20 20 69 74 20 6d 69 67 68 74 20 62  age;  it might b
12ec0 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  e an overflow pa
12ed0 67 65 0a 20 20 20 20 20 20 2a 2a 20 6f 72 20 70  ge.      ** or p
12ee0 74 72 6d 61 70 20 70 61 67 65 20 6f 72 20 61 20  trmap page or a 
12ef0 66 72 65 65 20 70 61 67 65 2e 20 20 49 6e 20 74  free page.  In t
12f00 68 6f 73 65 20 63 61 73 65 73 2c 20 74 68 65 20  hose cases, the 
12f10 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 20 20 20 20  following.      
12f20 2a 2a 20 63 61 6c 6c 20 74 6f 20 62 74 72 65 65  ** call to btree
12f30 49 6e 69 74 50 61 67 65 28 29 20 77 69 6c 6c 20  InitPage() will 
12f40 6c 69 6b 65 6c 79 20 72 65 74 75 72 6e 20 53 51  likely return SQ
12f50 4c 49 54 45 5f 43 4f 52 52 55 50 54 2e 0a 20 20  LITE_CORRUPT..  
12f60 20 20 20 20 2a 2a 20 42 75 74 20 6e 6f 20 68 61      ** But no ha
12f70 72 6d 20 69 73 20 64 6f 6e 65 20 62 79 20 74 68  rm is done by th
12f80 69 73 2e 20 20 41 6e 64 20 69 74 20 69 73 20 76  is.  And it is v
12f90 65 72 79 20 69 6d 70 6f 72 74 61 6e 74 20 74 68  ery important th
12fa0 61 74 0a 20 20 20 20 20 20 2a 2a 20 62 74 72 65  at.      ** btre
12fb0 65 49 6e 69 74 50 61 67 65 28 29 20 62 65 20 63  eInitPage() be c
12fc0 61 6c 6c 65 64 20 6f 6e 20 65 76 65 72 79 20 62  alled on every b
12fd0 74 72 65 65 20 70 61 67 65 20 73 6f 20 77 65 20  tree page so we 
12fe0 6d 61 6b 65 0a 20 20 20 20 20 20 2a 2a 20 74 68  make.      ** th
12ff0 65 20 63 61 6c 6c 20 66 6f 72 20 65 76 65 72 79  e call for every
13000 20 70 61 67 65 20 74 68 61 74 20 63 6f 6d 65 73   page that comes
13010 20 69 6e 20 66 6f 72 20 72 65 2d 69 6e 69 74 69   in for re-initi
13020 6e 67 2e 20 2a 2f 0a 20 20 20 20 20 20 62 74 72  ng. */.      btr
13030 65 65 49 6e 69 74 50 61 67 65 28 70 50 61 67 65  eeInitPage(pPage
13040 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
13050 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65  /*.** Invoke the
13060 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20 66 6f   busy handler fo
13070 72 20 61 20 62 74 72 65 65 2e 0a 2a 2f 0a 73 74  r a btree..*/.st
13080 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 49 6e  atic int btreeIn
13090 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 28  vokeBusyHandler(
130a0 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 42  void *pArg){.  B
130b0 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 28  tShared *pBt = (
130c0 42 74 53 68 61 72 65 64 2a 29 70 41 72 67 3b 0a  BtShared*)pArg;.
130d0 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 64    assert( pBt->d
130e0 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  b );.  assert( s
130f0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
13100 64 28 70 42 74 2d 3e 64 62 2d 3e 6d 75 74 65 78  d(pBt->db->mutex
13110 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71  ) );.  return sq
13120 6c 69 74 65 33 49 6e 76 6f 6b 65 42 75 73 79 48  lite3InvokeBusyH
13130 61 6e 64 6c 65 72 28 26 70 42 74 2d 3e 64 62 2d  andler(&pBt->db-
13140 3e 62 75 73 79 48 61 6e 64 6c 65 72 2c 0a 20 20  >busyHandler,.  
13150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13170 73 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65  sqlite3PagerFile
13180 28 70 42 74 2d 3e 70 50 61 67 65 72 29 29 3b 0a  (pBt->pPager));.
13190 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20  }../*.** Open a 
131a0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
131b0 2a 20 0a 2a 2a 20 7a 46 69 6c 65 6e 61 6d 65 20  * .** zFilename 
131c0 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  is the name of t
131d0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
131e0 2e 20 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20  .  If zFilename 
131f0 69 73 20 4e 55 4c 4c 0a 2a 2a 20 74 68 65 6e 20  is NULL.** then 
13200 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 64 61 74  an ephemeral dat
13210 61 62 61 73 65 20 69 73 20 63 72 65 61 74 65 64  abase is created
13220 2e 20 20 54 68 65 20 65 70 68 65 6d 65 72 61 6c  .  The ephemeral
13230 20 64 61 74 61 62 61 73 65 20 6d 69 67 68 74 0a   database might.
13240 2a 2a 20 62 65 20 65 78 63 6c 75 73 69 76 65 6c  ** be exclusivel
13250 79 20 69 6e 20 6d 65 6d 6f 72 79 2c 20 6f 72 20  y in memory, or 
13260 69 74 20 6d 69 67 68 74 20 75 73 65 20 61 20 64  it might use a d
13270 69 73 6b 2d 62 61 73 65 64 20 6d 65 6d 6f 72 79  isk-based memory
13280 20 63 61 63 68 65 2e 0a 2a 2a 20 45 69 74 68 65   cache..** Eithe
13290 72 20 77 61 79 2c 20 74 68 65 20 65 70 68 65 6d  r way, the ephem
132a0 65 72 61 6c 20 64 61 74 61 62 61 73 65 20 77 69  eral database wi
132b0 6c 6c 20 62 65 20 61 75 74 6f 6d 61 74 69 63 61  ll be automatica
132c0 6c 6c 79 20 64 65 6c 65 74 65 64 20 0a 2a 2a 20  lly deleted .** 
132d0 77 68 65 6e 20 73 71 6c 69 74 65 33 42 74 72 65  when sqlite3Btre
132e0 65 43 6c 6f 73 65 28 29 20 69 73 20 63 61 6c 6c  eClose() is call
132f0 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 46 69  ed..**.** If zFi
13300 6c 65 6e 61 6d 65 20 69 73 20 22 3a 6d 65 6d 6f  lename is ":memo
13310 72 79 3a 22 20 74 68 65 6e 20 61 6e 20 69 6e 2d  ry:" then an in-
13320 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20  memory database 
13330 69 73 20 63 72 65 61 74 65 64 0a 2a 2a 20 74 68  is created.** th
13340 61 74 20 69 73 20 61 75 74 6f 6d 61 74 69 63 61  at is automatica
13350 6c 6c 79 20 64 65 73 74 72 6f 79 65 64 20 77 68  lly destroyed wh
13360 65 6e 20 69 74 20 69 73 20 63 6c 6f 73 65 64 2e  en it is closed.
13370 0a 2a 2a 0a 2a 2a 20 54 68 65 20 22 66 6c 61 67  .**.** The "flag
13380 73 22 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  s" parameter is 
13390 61 20 62 69 74 6d 61 73 6b 20 74 68 61 74 20 6d  a bitmask that m
133a0 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 62 69 74  ight contain bit
133b0 73 20 6c 69 6b 65 0a 2a 2a 20 42 54 52 45 45 5f  s like.** BTREE_
133c0 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c 20 61 6e 64  OMIT_JOURNAL and
133d0 2f 6f 72 20 42 54 52 45 45 5f 4d 45 4d 4f 52 59  /or BTREE_MEMORY
133e0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64  ..**.** If the d
133f0 61 74 61 62 61 73 65 20 69 73 20 61 6c 72 65 61  atabase is alrea
13400 64 79 20 6f 70 65 6e 65 64 20 69 6e 20 74 68 65  dy opened in the
13410 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 20 63   same database c
13420 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 61 6e 64  onnection.** and
13430 20 77 65 20 61 72 65 20 69 6e 20 73 68 61 72 65   we are in share
13440 64 20 63 61 63 68 65 20 6d 6f 64 65 2c 20 74 68  d cache mode, th
13450 65 6e 20 74 68 65 20 6f 70 65 6e 20 77 69 6c 6c  en the open will
13460 20 66 61 69 6c 20 77 69 74 68 20 61 6e 0a 2a 2a   fail with an.**
13470 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
13480 4e 54 20 65 72 72 6f 72 2e 20 20 57 65 20 63 61  NT error.  We ca
13490 6e 6e 6f 74 20 61 6c 6c 6f 77 20 74 77 6f 20 6f  nnot allow two o
134a0 72 20 6d 6f 72 65 20 42 74 53 68 61 72 65 64 0a  r more BtShared.
134b0 2a 2a 20 6f 62 6a 65 63 74 73 20 69 6e 20 74 68  ** objects in th
134c0 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 20  e same database 
134d0 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 69 6e 63 65  connection since
134e0 20 64 6f 69 6e 67 20 73 6f 20 77 69 6c 6c 20 6c   doing so will l
134f0 65 61 64 0a 2a 2a 20 74 6f 20 70 72 6f 62 6c 65  ead.** to proble
13500 6d 73 20 77 69 74 68 20 6c 6f 63 6b 69 6e 67 2e  ms with locking.
13510 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
13520 74 72 65 65 4f 70 65 6e 28 0a 20 20 73 71 6c 69  treeOpen(.  sqli
13530 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20  te3_vfs *pVfs,  
13540 20 20 20 20 2f 2a 20 56 46 53 20 74 6f 20 75 73      /* VFS to us
13550 65 20 66 6f 72 20 74 68 69 73 20 62 2d 74 72 65  e for this b-tre
13560 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  e */.  const cha
13570 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 2f  r *zFilename,  /
13580 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69  * Name of the fi
13590 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  le containing th
135a0 65 20 42 54 72 65 65 20 64 61 74 61 62 61 73 65  e BTree database
135b0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
135c0 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  b,            /*
135d0 20 41 73 73 6f 63 69 61 74 65 64 20 64 61 74 61   Associated data
135e0 62 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20  base handle */. 
135f0 20 42 74 72 65 65 20 2a 2a 70 70 42 74 72 65 65   Btree **ppBtree
13600 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e  ,        /* Poin
13610 74 65 72 20 74 6f 20 6e 65 77 20 42 74 72 65 65  ter to new Btree
13620 20 6f 62 6a 65 63 74 20 77 72 69 74 74 65 6e 20   object written 
13630 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c  here */.  int fl
13640 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  ags,            
13650 20 20 2f 2a 20 4f 70 74 69 6f 6e 73 20 2a 2f 0a    /* Options */.
13660 20 20 69 6e 74 20 76 66 73 46 6c 61 67 73 20 20    int vfsFlags  
13670 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61            /* Fla
13680 67 73 20 70 61 73 73 65 64 20 74 68 72 6f 75 67  gs passed throug
13690 68 20 74 6f 20 73 71 6c 69 74 65 33 5f 76 66 73  h to sqlite3_vfs
136a0 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a 29 7b 0a 20  .xOpen() */.){. 
136b0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
136c0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
136d0 2f 2a 20 53 68 61 72 65 64 20 70 61 72 74 20 6f  /* Shared part o
136e0 66 20 62 74 72 65 65 20 73 74 72 75 63 74 75 72  f btree structur
136f0 65 20 2a 2f 0a 20 20 42 74 72 65 65 20 2a 70 3b  e */.  Btree *p;
13700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13710 20 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20        /* Handle 
13720 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 73  to return */.  s
13730 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75  qlite3_mutex *mu
13740 74 65 78 4f 70 65 6e 20 3d 20 30 3b 20 20 2f 2a  texOpen = 0;  /*
13750 20 50 72 65 76 65 6e 74 73 20 61 20 72 61 63 65   Prevents a race
13760 20 63 6f 6e 64 69 74 69 6f 6e 2e 20 54 69 63 6b   condition. Tick
13770 65 74 20 23 33 35 33 37 20 2a 2f 0a 20 20 69 6e  et #3537 */.  in
13780 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
13790 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
137a0 52 65 73 75 6c 74 20 63 6f 64 65 20 66 72 6f 6d  Result code from
137b0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a   this function *
137c0 2f 0a 20 20 75 38 20 6e 52 65 73 65 72 76 65 3b  /.  u8 nReserve;
137d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
137e0 20 20 20 2f 2a 20 42 79 74 65 20 6f 66 20 75 6e     /* Byte of un
137f0 75 73 65 64 20 73 70 61 63 65 20 6f 6e 20 65 61  used space on ea
13800 63 68 20 70 61 67 65 20 2a 2f 0a 20 20 75 6e 73  ch page */.  uns
13810 69 67 6e 65 64 20 63 68 61 72 20 7a 44 62 48 65  igned char zDbHe
13820 61 64 65 72 5b 31 30 30 5d 3b 20 20 2f 2a 20 44  ader[100];  /* D
13830 61 74 61 62 61 73 65 20 68 65 61 64 65 72 20 63  atabase header c
13840 6f 6e 74 65 6e 74 20 2a 2f 0a 0a 20 20 2f 2a 20  ontent */..  /* 
13850 54 72 75 65 20 69 66 20 6f 70 65 6e 69 6e 67 20  True if opening 
13860 61 6e 20 65 70 68 65 6d 65 72 61 6c 2c 20 74 65  an ephemeral, te
13870 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61 73 65  mporary database
13880 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20   */.  const int 
13890 69 73 54 65 6d 70 44 62 20 3d 20 7a 46 69 6c 65  isTempDb = zFile
138a0 6e 61 6d 65 3d 3d 30 20 7c 7c 20 7a 46 69 6c 65  name==0 || zFile
138b0 6e 61 6d 65 5b 30 5d 3d 3d 30 3b 0a 0a 20 20 2f  name[0]==0;..  /
138c0 2a 20 53 65 74 20 74 68 65 20 76 61 72 69 61 62  * Set the variab
138d0 6c 65 20 69 73 4d 65 6d 64 62 20 74 6f 20 74 72  le isMemdb to tr
138e0 75 65 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d  ue for an in-mem
138f0 6f 72 79 20 64 61 74 61 62 61 73 65 2c 20 6f 72  ory database, or
13900 20 0a 20 20 2a 2a 20 66 61 6c 73 65 20 66 6f 72   .  ** false for
13910 20 61 20 66 69 6c 65 2d 62 61 73 65 64 20 64 61   a file-based da
13920 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 23 69 66  tabase..  */.#if
13930 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
13940 4d 45 4d 4f 52 59 44 42 0a 20 20 63 6f 6e 73 74  MEMORYDB.  const
13950 20 69 6e 74 20 69 73 4d 65 6d 64 62 20 3d 20 30   int isMemdb = 0
13960 3b 0a 23 65 6c 73 65 0a 20 20 63 6f 6e 73 74 20  ;.#else.  const 
13970 69 6e 74 20 69 73 4d 65 6d 64 62 20 3d 20 28 7a  int isMemdb = (z
13980 46 69 6c 65 6e 61 6d 65 20 26 26 20 73 74 72 63  Filename && strc
13990 6d 70 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 22 3a  mp(zFilename, ":
139a0 6d 65 6d 6f 72 79 3a 22 29 3d 3d 30 29 0a 20 20  memory:")==0).  
139b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
139c0 20 20 20 20 20 7c 7c 20 28 69 73 54 65 6d 70 44       || (isTempD
139d0 62 20 26 26 20 73 71 6c 69 74 65 33 54 65 6d 70  b && sqlite3Temp
139e0 49 6e 4d 65 6d 6f 72 79 28 64 62 29 29 0a 20 20  InMemory(db)).  
139f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13a00 20 20 20 20 20 7c 7c 20 28 76 66 73 46 6c 61 67       || (vfsFlag
13a10 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
13a20 4d 45 4d 4f 52 59 29 21 3d 30 3b 0a 23 65 6e 64  MEMORY)!=0;.#end
13a30 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 64 62  if..  assert( db
13a40 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
13a50 20 70 56 66 73 21 3d 30 20 29 3b 0a 20 20 61 73   pVfs!=0 );.  as
13a60 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
13a70 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74  tex_held(db->mut
13a80 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
13a90 20 28 66 6c 61 67 73 26 30 78 66 66 29 3d 3d 66   (flags&0xff)==f
13aa0 6c 61 67 73 20 29 3b 20 20 20 2f 2a 20 66 6c 61  lags );   /* fla
13ab0 67 73 20 66 69 74 20 69 6e 20 38 20 62 69 74 73  gs fit in 8 bits
13ac0 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 6e 6c 79 20 61   */..  /* Only a
13ad0 20 42 54 52 45 45 5f 53 49 4e 47 4c 45 20 64 61   BTREE_SINGLE da
13ae0 74 61 62 61 73 65 20 63 61 6e 20 62 65 20 42 54  tabase can be BT
13af0 52 45 45 5f 55 4e 4f 52 44 45 52 45 44 20 2a 2f  REE_UNORDERED */
13b00 0a 20 20 61 73 73 65 72 74 28 20 28 66 6c 61 67  .  assert( (flag
13b10 73 20 26 20 42 54 52 45 45 5f 55 4e 4f 52 44 45  s & BTREE_UNORDE
13b20 52 45 44 29 3d 3d 30 20 7c 7c 20 28 66 6c 61 67  RED)==0 || (flag
13b30 73 20 26 20 42 54 52 45 45 5f 53 49 4e 47 4c 45  s & BTREE_SINGLE
13b40 29 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 41 20  )!=0 );..  /* A 
13b50 42 54 52 45 45 5f 53 49 4e 47 4c 45 20 64 61 74  BTREE_SINGLE dat
13b60 61 62 61 73 65 20 69 73 20 61 6c 77 61 79 73 20  abase is always 
13b70 61 20 74 65 6d 70 6f 72 61 72 79 20 61 6e 64 2f  a temporary and/
13b80 6f 72 20 65 70 68 65 6d 65 72 61 6c 20 2a 2f 0a  or ephemeral */.
13b90 20 20 61 73 73 65 72 74 28 20 28 66 6c 61 67 73    assert( (flags
13ba0 20 26 20 42 54 52 45 45 5f 53 49 4e 47 4c 45 29   & BTREE_SINGLE)
13bb0 3d 3d 30 20 7c 7c 20 69 73 54 65 6d 70 44 62 20  ==0 || isTempDb 
13bc0 29 3b 0a 0a 20 20 69 66 28 20 69 73 4d 65 6d 64  );..  if( isMemd
13bd0 62 20 29 7b 0a 20 20 20 20 66 6c 61 67 73 20 7c  b ){.    flags |
13be0 3d 20 42 54 52 45 45 5f 4d 45 4d 4f 52 59 3b 0a  = BTREE_MEMORY;.
13bf0 20 20 7d 0a 20 20 69 66 28 20 28 76 66 73 46 6c    }.  if( (vfsFl
13c00 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
13c10 4e 5f 4d 41 49 4e 5f 44 42 29 21 3d 30 20 26 26  N_MAIN_DB)!=0 &&
13c20 20 28 69 73 4d 65 6d 64 62 20 7c 7c 20 69 73 54   (isMemdb || isT
13c30 65 6d 70 44 62 29 20 29 7b 0a 20 20 20 20 76 66  empDb) ){.    vf
13c40 73 46 6c 61 67 73 20 3d 20 28 76 66 73 46 6c 61  sFlags = (vfsFla
13c50 67 73 20 26 20 7e 53 51 4c 49 54 45 5f 4f 50 45  gs & ~SQLITE_OPE
13c60 4e 5f 4d 41 49 4e 5f 44 42 29 20 7c 20 53 51 4c  N_MAIN_DB) | SQL
13c70 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42  ITE_OPEN_TEMP_DB
13c80 3b 0a 20 20 7d 0a 20 20 70 20 3d 20 73 71 6c 69  ;.  }.  p = sqli
13c90 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73 69  te3MallocZero(si
13ca0 7a 65 6f 66 28 42 74 72 65 65 29 29 3b 0a 20 20  zeof(Btree));.  
13cb0 69 66 28 20 21 70 20 29 7b 0a 20 20 20 20 72 65  if( !p ){.    re
13cc0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
13cd0 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 70 2d  M_BKPT;.  }.  p-
13ce0 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53  >inTrans = TRANS
13cf0 5f 4e 4f 4e 45 3b 0a 20 20 70 2d 3e 64 62 20 3d  _NONE;.  p->db =
13d00 20 64 62 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c   db;.#ifndef SQL
13d10 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
13d20 43 41 43 48 45 0a 20 20 70 2d 3e 6c 6f 63 6b 2e  CACHE.  p->lock.
13d30 70 42 74 72 65 65 20 3d 20 70 3b 0a 20 20 70 2d  pBtree = p;.  p-
13d40 3e 6c 6f 63 6b 2e 69 54 61 62 6c 65 20 3d 20 31  >lock.iTable = 1
13d50 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64  ;.#endif..#if !d
13d60 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
13d70 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29  IT_SHARED_CACHE)
13d80 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
13d90 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29  ITE_OMIT_DISKIO)
13da0 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49 66 20 74 68  .  /*.  ** If th
13db0 69 73 20 42 74 72 65 65 20 69 73 20 61 20 63 61  is Btree is a ca
13dc0 6e 64 69 64 61 74 65 20 66 6f 72 20 73 68 61 72  ndidate for shar
13dd0 65 64 20 63 61 63 68 65 2c 20 74 72 79 20 74 6f  ed cache, try to
13de0 20 66 69 6e 64 20 61 6e 0a 20 20 2a 2a 20 65 78   find an.  ** ex
13df0 69 73 74 69 6e 67 20 42 74 53 68 61 72 65 64 20  isting BtShared 
13e00 6f 62 6a 65 63 74 20 74 68 61 74 20 77 65 20 63  object that we c
13e10 61 6e 20 73 68 61 72 65 20 77 69 74 68 0a 20 20  an share with.  
13e20 2a 2f 0a 20 20 69 66 28 20 69 73 54 65 6d 70 44  */.  if( isTempD
13e30 62 3d 3d 30 20 26 26 20 28 69 73 4d 65 6d 64 62  b==0 && (isMemdb
13e40 3d 3d 30 20 7c 7c 20 28 76 66 73 46 6c 61 67 73  ==0 || (vfsFlags
13e50 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49  &SQLITE_OPEN_URI
13e60 29 21 3d 30 29 20 29 7b 0a 20 20 20 20 69 66 28  )!=0) ){.    if(
13e70 20 76 66 73 46 6c 61 67 73 20 26 20 53 51 4c 49   vfsFlags & SQLI
13e80 54 45 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43 41  TE_OPEN_SHAREDCA
13e90 43 48 45 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  CHE ){.      int
13ea0 20 6e 46 69 6c 65 6e 61 6d 65 20 3d 20 73 71 6c   nFilename = sql
13eb0 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 69  ite3Strlen30(zFi
13ec0 6c 65 6e 61 6d 65 29 2b 31 3b 0a 20 20 20 20 20  lename)+1;.     
13ed0 20 69 6e 74 20 6e 46 75 6c 6c 50 61 74 68 6e 61   int nFullPathna
13ee0 6d 65 20 3d 20 70 56 66 73 2d 3e 6d 78 50 61 74  me = pVfs->mxPat
13ef0 68 6e 61 6d 65 2b 31 3b 0a 20 20 20 20 20 20 63  hname+1;.      c
13f00 68 61 72 20 2a 7a 46 75 6c 6c 50 61 74 68 6e 61  har *zFullPathna
13f10 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  me = sqlite3Mall
13f20 6f 63 28 4d 41 58 28 6e 46 75 6c 6c 50 61 74 68  oc(MAX(nFullPath
13f30 6e 61 6d 65 2c 6e 46 69 6c 65 6e 61 6d 65 29 29  name,nFilename))
13f40 3b 0a 20 20 20 20 20 20 4d 55 54 45 58 5f 4c 4f  ;.      MUTEX_LO
13f50 47 49 43 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  GIC( sqlite3_mut
13f60 65 78 20 2a 6d 75 74 65 78 53 68 61 72 65 64 3b  ex *mutexShared;
13f70 20 29 0a 0a 20 20 20 20 20 20 70 2d 3e 73 68 61   )..      p->sha
13f80 72 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20 20  rable = 1;.     
13f90 20 69 66 28 20 21 7a 46 75 6c 6c 50 61 74 68 6e   if( !zFullPathn
13fa0 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ame ){.        s
13fb0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
13fc0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
13fd0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
13fe0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
13ff0 69 66 28 20 69 73 4d 65 6d 64 62 20 29 7b 0a 20  if( isMemdb ){. 
14000 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 46         memcpy(zF
14010 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 7a 46 69  ullPathname, zFi
14020 6c 65 6e 61 6d 65 2c 20 6e 46 69 6c 65 6e 61 6d  lename, nFilenam
14030 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  e);.      }else{
14040 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
14050 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e  lite3OsFullPathn
14060 61 6d 65 28 70 56 66 73 2c 20 7a 46 69 6c 65 6e  ame(pVfs, zFilen
14070 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ame,.           
14080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14090 20 20 20 20 20 20 20 20 6e 46 75 6c 6c 50 61 74          nFullPat
140a0 68 6e 61 6d 65 2c 20 7a 46 75 6c 6c 50 61 74 68  hname, zFullPath
140b0 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 69  name);.        i
140c0 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
140d0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
140e0 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a  zFullPathname);.
140f0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
14100 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20 20  3_free(p);.     
14110 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
14120 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
14130 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52  }.#if SQLITE_THR
14140 45 41 44 53 41 46 45 0a 20 20 20 20 20 20 6d 75  EADSAFE.      mu
14150 74 65 78 4f 70 65 6e 20 3d 20 73 71 6c 69 74 65  texOpen = sqlite
14160 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49  3MutexAlloc(SQLI
14170 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
14180 4f 50 45 4e 29 3b 0a 20 20 20 20 20 20 73 71 6c  OPEN);.      sql
14190 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
141a0 28 6d 75 74 65 78 4f 70 65 6e 29 3b 0a 20 20 20  (mutexOpen);.   
141b0 20 20 20 6d 75 74 65 78 53 68 61 72 65 64 20 3d     mutexShared =
141c0 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c   sqlite3MutexAll
141d0 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  oc(SQLITE_MUTEX_
141e0 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 0a  STATIC_MASTER);.
141f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
14200 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 53  tex_enter(mutexS
14210 68 61 72 65 64 29 3b 0a 23 65 6e 64 69 66 0a 20  hared);.#endif. 
14220 20 20 20 20 20 66 6f 72 28 70 42 74 3d 47 4c 4f       for(pBt=GLO
14230 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71  BAL(BtShared*,sq
14240 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65  lite3SharedCache
14250 4c 69 73 74 29 3b 20 70 42 74 3b 20 70 42 74 3d  List); pBt; pBt=
14260 70 42 74 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  pBt->pNext){.   
14270 20 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74       assert( pBt
14280 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 20 20  ->nRef>0 );.    
14290 20 20 20 20 69 66 28 20 30 3d 3d 73 74 72 63 6d      if( 0==strcm
142a0 70 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c  p(zFullPathname,
142b0 20 73 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c   sqlite3PagerFil
142c0 65 6e 61 6d 65 28 70 42 74 2d 3e 70 50 61 67 65  ename(pBt->pPage
142d0 72 2c 20 30 29 29 0a 20 20 20 20 20 20 20 20 20  r, 0)).         
142e0 20 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74          && sqlit
142f0 65 33 50 61 67 65 72 56 66 73 28 70 42 74 2d 3e  e3PagerVfs(pBt->
14300 70 50 61 67 65 72 29 3d 3d 70 56 66 73 20 29 7b  pPager)==pVfs ){
14310 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69  .          int i
14320 44 62 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f  Db;.          fo
14330 72 28 69 44 62 3d 64 62 2d 3e 6e 44 62 2d 31 3b  r(iDb=db->nDb-1;
14340 20 69 44 62 3e 3d 30 3b 20 69 44 62 2d 2d 29 7b   iDb>=0; iDb--){
14350 0a 20 20 20 20 20 20 20 20 20 20 20 20 42 74 72  .            Btr
14360 65 65 20 2a 70 45 78 69 73 74 69 6e 67 20 3d 20  ee *pExisting = 
14370 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74  db->aDb[iDb].pBt
14380 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
14390 28 20 70 45 78 69 73 74 69 6e 67 20 26 26 20 70  ( pExisting && p
143a0 45 78 69 73 74 69 6e 67 2d 3e 70 42 74 3d 3d 70  Existing->pBt==p
143b0 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  Bt ){.          
143c0 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
143d0 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 53 68 61  x_leave(mutexSha
143e0 72 65 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20  red);.          
143f0 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
14400 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 4f 70 65  x_leave(mutexOpe
14410 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  n);.            
14420 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
14430 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20  FullPathname);. 
14440 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
14450 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20  ite3_free(p);.  
14460 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
14470 72 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  rn SQLITE_CONSTR
14480 41 49 4e 54 3b 0a 20 20 20 20 20 20 20 20 20 20  AINT;.          
14490 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
144a0 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 42 74            p->pBt
144b0 20 3d 20 70 42 74 3b 0a 20 20 20 20 20 20 20 20   = pBt;.        
144c0 20 20 70 42 74 2d 3e 6e 52 65 66 2b 2b 3b 0a 20    pBt->nRef++;. 
144d0 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
144e0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
144f0 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  }.      sqlite3_
14500 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65  mutex_leave(mute
14510 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20 20  xShared);.      
14520 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 46 75  sqlite3_free(zFu
14530 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20  llPathname);.   
14540 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
14550 5f 44 45 42 55 47 0a 20 20 20 20 65 6c 73 65 7b  _DEBUG.    else{
14560 0a 20 20 20 20 20 20 2f 2a 20 49 6e 20 64 65 62  .      /* In deb
14570 75 67 20 6d 6f 64 65 2c 20 77 65 20 6d 61 72 6b  ug mode, we mark
14580 20 61 6c 6c 20 70 65 72 73 69 73 74 65 6e 74 20   all persistent 
14590 64 61 74 61 62 61 73 65 73 20 61 73 20 73 68 61  databases as sha
145a0 72 61 62 6c 65 0a 20 20 20 20 20 20 2a 2a 20 65  rable.      ** e
145b0 76 65 6e 20 77 68 65 6e 20 74 68 65 79 20 61 72  ven when they ar
145c0 65 20 6e 6f 74 2e 20 20 54 68 69 73 20 65 78 65  e not.  This exe
145d0 72 63 69 73 65 73 20 74 68 65 20 6c 6f 63 6b 69  rcises the locki
145e0 6e 67 20 63 6f 64 65 20 61 6e 64 0a 20 20 20 20  ng code and.    
145f0 20 20 2a 2a 20 67 69 76 65 73 20 6d 6f 72 65 20    ** gives more 
14600 6f 70 70 6f 72 74 75 6e 69 74 79 20 66 6f 72 20  opportunity for 
14610 61 73 73 65 72 74 73 28 73 71 6c 69 74 65 33 5f  asserts(sqlite3_
14620 6d 75 74 65 78 5f 68 65 6c 64 28 29 29 0a 20 20  mutex_held()).  
14630 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74      ** statement
14640 73 20 74 6f 20 66 69 6e 64 20 6c 6f 63 6b 69 6e  s to find lockin
14650 67 20 70 72 6f 62 6c 65 6d 73 2e 0a 20 20 20 20  g problems..    
14660 20 20 2a 2f 0a 20 20 20 20 20 20 70 2d 3e 73 68    */.      p->sh
14670 61 72 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20  arable = 1;.    
14680 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 23 65 6e  }.#endif.  }.#en
14690 64 69 66 0a 20 20 69 66 28 20 70 42 74 3d 3d 30  dif.  if( pBt==0
146a0 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a   ){.    /*.    *
146b0 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
146c0 61 73 73 65 72 74 73 20 6d 61 6b 65 20 73 75 72  asserts make sur
146d0 65 20 74 68 61 74 20 73 74 72 75 63 74 75 72 65  e that structure
146e0 73 20 75 73 65 64 20 62 79 20 74 68 65 20 62 74  s used by the bt
146f0 72 65 65 20 61 72 65 0a 20 20 20 20 2a 2a 20 74  ree are.    ** t
14700 68 65 20 72 69 67 68 74 20 73 69 7a 65 2e 20 20  he right size.  
14710 54 68 69 73 20 69 73 20 74 6f 20 67 75 61 72 64  This is to guard
14720 20 61 67 61 69 6e 73 74 20 73 69 7a 65 20 63 68   against size ch
14730 61 6e 67 65 73 20 74 68 61 74 20 72 65 73 75 6c  anges that resul
14740 74 0a 20 20 20 20 2a 2a 20 77 68 65 6e 20 63 6f  t.    ** when co
14750 6d 70 69 6c 69 6e 67 20 6f 6e 20 61 20 64 69 66  mpiling on a dif
14760 66 65 72 65 6e 74 20 61 72 63 68 69 74 65 63 74  ferent architect
14770 75 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ure..    */.    
14780 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 69  assert( sizeof(i
14790 36 34 29 3d 3d 38 20 29 3b 0a 20 20 20 20 61 73  64)==8 );.    as
147a0 73 65 72 74 28 20 73 69 7a 65 6f 66 28 75 36 34  sert( sizeof(u64
147b0 29 3d 3d 38 20 29 3b 0a 20 20 20 20 61 73 73 65  )==8 );.    asse
147c0 72 74 28 20 73 69 7a 65 6f 66 28 75 33 32 29 3d  rt( sizeof(u32)=
147d0 3d 34 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =4 );.    assert
147e0 28 20 73 69 7a 65 6f 66 28 75 31 36 29 3d 3d 32  ( sizeof(u16)==2
147f0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
14800 73 69 7a 65 6f 66 28 50 67 6e 6f 29 3d 3d 34 20  sizeof(Pgno)==4 
14810 29 3b 0a 20 20 0a 20 20 20 20 70 42 74 20 3d 20  );.  .    pBt = 
14820 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72  sqlite3MallocZer
14830 6f 28 20 73 69 7a 65 6f 66 28 2a 70 42 74 29 20  o( sizeof(*pBt) 
14840 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74 3d 3d  );.    if( pBt==
14850 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
14860 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
14870 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 74  T;.      goto bt
14880 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20  ree_open_out;.  
14890 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c    }.    rc = sql
148a0 69 74 65 33 50 61 67 65 72 4f 70 65 6e 28 70 56  ite3PagerOpen(pV
148b0 66 73 2c 20 26 70 42 74 2d 3e 70 50 61 67 65 72  fs, &pBt->pPager
148c0 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20  , zFilename,.   
148d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
148e0 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 4d 65         sizeof(Me
148f0 6d 50 61 67 65 29 2c 20 66 6c 61 67 73 2c 20 76  mPage), flags, v
14900 66 73 46 6c 61 67 73 2c 20 70 61 67 65 52 65 69  fsFlags, pageRei
14910 6e 69 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63  nit);.    if( rc
14920 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
14930 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
14940 72 53 65 74 4d 6d 61 70 4c 69 6d 69 74 28 70 42  rSetMmapLimit(pB
14950 74 2d 3e 70 50 61 67 65 72 2c 20 64 62 2d 3e 73  t->pPager, db->s
14960 7a 4d 6d 61 70 29 3b 0a 20 20 20 20 20 20 72 63  zMmap);.      rc
14970 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 52   = sqlite3PagerR
14980 65 61 64 46 69 6c 65 68 65 61 64 65 72 28 70 42  eadFileheader(pB
14990 74 2d 3e 70 50 61 67 65 72 2c 73 69 7a 65 6f 66  t->pPager,sizeof
149a0 28 7a 44 62 48 65 61 64 65 72 29 2c 7a 44 62 48  (zDbHeader),zDbH
149b0 65 61 64 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20  eader);.    }.  
149c0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
149d0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  _OK ){.      got
149e0 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74  o btree_open_out
149f0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 74 2d  ;.    }.    pBt-
14a00 3e 6f 70 65 6e 46 6c 61 67 73 20 3d 20 28 75 38  >openFlags = (u8
14a10 29 66 6c 61 67 73 3b 0a 20 20 20 20 70 42 74 2d  )flags;.    pBt-
14a20 3e 64 62 20 3d 20 64 62 3b 0a 20 20 20 20 73 71  >db = db;.    sq
14a30 6c 69 74 65 33 50 61 67 65 72 53 65 74 42 75 73  lite3PagerSetBus
14a40 79 48 61 6e 64 6c 65 72 28 70 42 74 2d 3e 70 50  yHandler(pBt->pP
14a50 61 67 65 72 2c 20 62 74 72 65 65 49 6e 76 6f 6b  ager, btreeInvok
14a60 65 42 75 73 79 48 61 6e 64 6c 65 72 2c 20 70 42  eBusyHandler, pB
14a70 74 29 3b 0a 20 20 20 20 70 2d 3e 70 42 74 20 3d  t);.    p->pBt =
14a80 20 70 42 74 3b 0a 20 20 0a 20 20 20 20 70 42 74   pBt;.  .    pBt
14a90 2d 3e 70 43 75 72 73 6f 72 20 3d 20 30 3b 0a 20  ->pCursor = 0;. 
14aa0 20 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d     pBt->pPage1 =
14ab0 20 30 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69   0;.    if( sqli
14ac0 74 65 33 50 61 67 65 72 49 73 72 65 61 64 6f 6e  te3PagerIsreadon
14ad0 6c 79 28 70 42 74 2d 3e 70 50 61 67 65 72 29 20  ly(pBt->pPager) 
14ae0 29 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20  ) pBt->btsFlags 
14af0 7c 3d 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59  |= BTS_READ_ONLY
14b00 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ;.#if defined(SQ
14b10 4c 49 54 45 5f 53 45 43 55 52 45 5f 44 45 4c 45  LITE_SECURE_DELE
14b20 54 45 29 0a 20 20 20 20 70 42 74 2d 3e 62 74 73  TE).    pBt->bts
14b30 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 53 45 43  Flags |= BTS_SEC
14b40 55 52 45 5f 44 45 4c 45 54 45 3b 0a 23 65 6c 69  URE_DELETE;.#eli
14b50 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
14b60 5f 46 41 53 54 5f 53 45 43 55 52 45 5f 44 45 4c  _FAST_SECURE_DEL
14b70 45 54 45 29 0a 20 20 20 20 70 42 74 2d 3e 62 74  ETE).    pBt->bt
14b80 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 4f 56  sFlags |= BTS_OV
14b90 45 52 57 52 49 54 45 3b 0a 23 65 6e 64 69 66 0a  ERWRITE;.#endif.
14ba0 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
14bb0 4f 46 3a 20 52 2d 35 31 38 37 33 2d 33 39 36 31  OF: R-51873-3961
14bc0 38 20 54 68 65 20 70 61 67 65 20 73 69 7a 65 20  8 The page size 
14bd0 66 6f 72 20 61 20 64 61 74 61 62 61 73 65 20 66  for a database f
14be0 69 6c 65 20 69 73 0a 20 20 20 20 2a 2a 20 64 65  ile is.    ** de
14bf0 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20  termined by the 
14c00 32 2d 62 79 74 65 20 69 6e 74 65 67 65 72 20 6c  2-byte integer l
14c10 6f 63 61 74 65 64 20 61 74 20 61 6e 20 6f 66 66  ocated at an off
14c20 73 65 74 20 6f 66 20 31 36 20 62 79 74 65 73 20  set of 16 bytes 
14c30 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 74 68 65 20  from.    ** the 
14c40 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65  beginning of the
14c50 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
14c60 2a 2f 0a 20 20 20 20 70 42 74 2d 3e 70 61 67 65  */.    pBt->page
14c70 53 69 7a 65 20 3d 20 28 7a 44 62 48 65 61 64 65  Size = (zDbHeade
14c80 72 5b 31 36 5d 3c 3c 38 29 20 7c 20 28 7a 44 62  r[16]<<8) | (zDb
14c90 48 65 61 64 65 72 5b 31 37 5d 3c 3c 31 36 29 3b  Header[17]<<16);
14ca0 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 70 61  .    if( pBt->pa
14cb0 67 65 53 69 7a 65 3c 35 31 32 20 7c 7c 20 70 42  geSize<512 || pB
14cc0 74 2d 3e 70 61 67 65 53 69 7a 65 3e 53 51 4c 49  t->pageSize>SQLI
14cd0 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45  TE_MAX_PAGE_SIZE
14ce0 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 28 28 70  .         || ((p
14cf0 42 74 2d 3e 70 61 67 65 53 69 7a 65 2d 31 29 26  Bt->pageSize-1)&
14d00 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 21 3d  pBt->pageSize)!=
14d10 30 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e  0 ){.      pBt->
14d20 70 61 67 65 53 69 7a 65 20 3d 20 30 3b 0a 23 69  pageSize = 0;.#i
14d30 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
14d40 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
14d50 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6d 61 67     /* If the mag
14d60 69 63 20 6e 61 6d 65 20 22 3a 6d 65 6d 6f 72 79  ic name ":memory
14d70 3a 22 20 77 69 6c 6c 20 63 72 65 61 74 65 20 61  :" will create a
14d80 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
14d90 62 61 73 65 2c 20 74 68 65 6e 0a 20 20 20 20 20  base, then.     
14da0 20 2a 2a 20 6c 65 61 76 65 20 74 68 65 20 61 75   ** leave the au
14db0 74 6f 56 61 63 75 75 6d 20 6d 6f 64 65 20 61 74  toVacuum mode at
14dc0 20 30 20 28 64 6f 20 6e 6f 74 20 61 75 74 6f 2d   0 (do not auto-
14dd0 76 61 63 75 75 6d 29 2c 20 65 76 65 6e 20 69 66  vacuum), even if
14de0 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45  .      ** SQLITE
14df0 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43  _DEFAULT_AUTOVAC
14e00 55 55 4d 20 69 73 20 74 72 75 65 2e 20 4f 6e 20  UUM is true. On 
14e10 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20  the other hand, 
14e20 69 66 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c 49  if.      ** SQLI
14e30 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42  TE_OMIT_MEMORYDB
14e40 20 68 61 73 20 62 65 65 6e 20 64 65 66 69 6e 65   has been define
14e50 64 2c 20 74 68 65 6e 20 22 3a 6d 65 6d 6f 72 79  d, then ":memory
14e60 3a 22 20 69 73 20 6a 75 73 74 20 61 0a 20 20 20  :" is just a.   
14e70 20 20 20 2a 2a 20 72 65 67 75 6c 61 72 20 66 69     ** regular fi
14e80 6c 65 2d 6e 61 6d 65 2e 20 49 6e 20 74 68 69 73  le-name. In this
14e90 20 63 61 73 65 20 74 68 65 20 61 75 74 6f 2d 76   case the auto-v
14ea0 61 63 75 75 6d 20 61 70 70 6c 69 65 73 20 61 73  acuum applies as
14eb0 20 70 65 72 20 6e 6f 72 6d 61 6c 2e 0a 20 20 20   per normal..   
14ec0 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
14ed0 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 21 69 73  zFilename && !is
14ee0 4d 65 6d 64 62 20 29 7b 0a 20 20 20 20 20 20 20  Memdb ){.       
14ef0 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
14f00 20 3d 20 28 53 51 4c 49 54 45 5f 44 45 46 41 55   = (SQLITE_DEFAU
14f10 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 3f 20  LT_AUTOVACUUM ? 
14f20 31 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 20 20  1 : 0);.        
14f30 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20  pBt->incrVacuum 
14f40 3d 20 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  = (SQLITE_DEFAUL
14f50 54 5f 41 55 54 4f 56 41 43 55 55 4d 3d 3d 32 20  T_AUTOVACUUM==2 
14f60 3f 20 31 20 3a 20 30 29 3b 0a 20 20 20 20 20 20  ? 1 : 0);.      
14f70 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 6e  }.#endif.      n
14f80 52 65 73 65 72 76 65 20 3d 20 30 3b 0a 20 20 20  Reserve = 0;.   
14f90 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
14fa0 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
14fb0 33 37 34 39 37 2d 34 32 34 31 32 20 54 68 65 20  37497-42412 The 
14fc0 73 69 7a 65 20 6f 66 20 74 68 65 20 72 65 73 65  size of the rese
14fd0 72 76 65 64 20 72 65 67 69 6f 6e 20 69 73 0a 20  rved region is. 
14fe0 20 20 20 20 20 2a 2a 20 64 65 74 65 72 6d 69 6e       ** determin
14ff0 65 64 20 62 79 20 74 68 65 20 6f 6e 65 2d 62 79  ed by the one-by
15000 74 65 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 65  te unsigned inte
15010 67 65 72 20 66 6f 75 6e 64 20 61 74 20 61 6e 20  ger found at an 
15020 6f 66 66 73 65 74 20 6f 66 20 32 30 0a 20 20 20  offset of 20.   
15030 20 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20 64     ** into the d
15040 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 65 61  atabase file hea
15050 64 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 6e 52  der. */.      nR
15060 65 73 65 72 76 65 20 3d 20 7a 44 62 48 65 61 64  eserve = zDbHead
15070 65 72 5b 32 30 5d 3b 0a 20 20 20 20 20 20 70 42  er[20];.      pB
15080 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42  t->btsFlags |= B
15090 54 53 5f 50 41 47 45 53 49 5a 45 5f 46 49 58 45  TS_PAGESIZE_FIXE
150a0 44 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  D;.#ifndef SQLIT
150b0 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
150c0 4d 0a 20 20 20 20 20 20 70 42 74 2d 3e 61 75 74  M.      pBt->aut
150d0 6f 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62  oVacuum = (get4b
150e0 79 74 65 28 26 7a 44 62 48 65 61 64 65 72 5b 33  yte(&zDbHeader[3
150f0 36 20 2b 20 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a  6 + 4*4])?1:0);.
15100 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56        pBt->incrV
15110 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74  acuum = (get4byt
15120 65 28 26 7a 44 62 48 65 61 64 65 72 5b 33 36 20  e(&zDbHeader[36 
15130 2b 20 37 2a 34 5d 29 3f 31 3a 30 29 3b 0a 23 65  + 7*4])?1:0);.#e
15140 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 72  ndif.    }.    r
15150 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
15160 53 65 74 50 61 67 65 73 69 7a 65 28 70 42 74 2d  SetPagesize(pBt-
15170 3e 70 50 61 67 65 72 2c 20 26 70 42 74 2d 3e 70  >pPager, &pBt->p
15180 61 67 65 53 69 7a 65 2c 20 6e 52 65 73 65 72 76  ageSize, nReserv
15190 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  e);.    if( rc )
151a0 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e   goto btree_open
151b0 5f 6f 75 74 3b 0a 20 20 20 20 70 42 74 2d 3e 75  _out;.    pBt->u
151c0 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d  sableSize = pBt-
151d0 3e 70 61 67 65 53 69 7a 65 20 2d 20 6e 52 65 73  >pageSize - nRes
151e0 65 72 76 65 3b 0a 20 20 20 20 61 73 73 65 72 74  erve;.    assert
151f0 28 20 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  ( (pBt->pageSize
15200 20 26 20 37 29 3d 3d 30 20 29 3b 20 20 2f 2a 20   & 7)==0 );  /* 
15210 38 2d 62 79 74 65 20 61 6c 69 67 6e 6d 65 6e 74  8-byte alignment
15220 20 6f 66 20 70 61 67 65 53 69 7a 65 20 2a 2f 0a   of pageSize */.
15230 20 20 20 0a 23 69 66 20 21 64 65 66 69 6e 65 64     .#if !defined
15240 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41  (SQLITE_OMIT_SHA
15250 52 45 44 5f 43 41 43 48 45 29 20 26 26 20 21 64  RED_CACHE) && !d
15260 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
15270 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20 20 20 2f  IT_DISKIO).    /
15280 2a 20 41 64 64 20 74 68 65 20 6e 65 77 20 42 74  * Add the new Bt
15290 53 68 61 72 65 64 20 6f 62 6a 65 63 74 20 74 6f  Shared object to
152a0 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74   the linked list
152b0 20 73 68 61 72 61 62 6c 65 20 42 74 53 68 61 72   sharable BtShar
152c0 65 64 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  eds..    */.    
152d0 70 42 74 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20  pBt->nRef = 1;. 
152e0 20 20 20 69 66 28 20 70 2d 3e 73 68 61 72 61 62     if( p->sharab
152f0 6c 65 20 29 7b 0a 20 20 20 20 20 20 4d 55 54 45  le ){.      MUTE
15300 58 5f 4c 4f 47 49 43 28 20 73 71 6c 69 74 65 33  X_LOGIC( sqlite3
15310 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 53 68 61  _mutex *mutexSha
15320 72 65 64 3b 20 29 0a 20 20 20 20 20 20 4d 55 54  red; ).      MUT
15330 45 58 5f 4c 4f 47 49 43 28 20 6d 75 74 65 78 53  EX_LOGIC( mutexS
15340 68 61 72 65 64 20 3d 20 73 71 6c 69 74 65 33 4d  hared = sqlite3M
15350 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45  utexAlloc(SQLITE
15360 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41  _MUTEX_STATIC_MA
15370 53 54 45 52 29 3b 29 0a 20 20 20 20 20 20 69 66  STER);).      if
15380 28 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53  ( SQLITE_THREADS
15390 41 46 45 20 26 26 20 73 71 6c 69 74 65 33 47 6c  AFE && sqlite3Gl
153a0 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65  obalConfig.bCore
153b0 4d 75 74 65 78 20 29 7b 0a 20 20 20 20 20 20 20  Mutex ){.       
153c0 20 70 42 74 2d 3e 6d 75 74 65 78 20 3d 20 73 71   pBt->mutex = sq
153d0 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28  lite3MutexAlloc(
153e0 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 46 41 53  SQLITE_MUTEX_FAS
153f0 54 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  T);.        if( 
15400 70 42 74 2d 3e 6d 75 74 65 78 3d 3d 30 20 29 7b  pBt->mutex==0 ){
15410 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
15420 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
15430 54 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  T;.          got
15440 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74  o btree_open_out
15450 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
15460 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
15470 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 75  3_mutex_enter(mu
15480 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20  texShared);.    
15490 20 20 70 42 74 2d 3e 70 4e 65 78 74 20 3d 20 47    pBt->pNext = G
154a0 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c  LOBAL(BtShared*,
154b0 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63  sqlite3SharedCac
154c0 68 65 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 47  heList);.      G
154d0 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c  LOBAL(BtShared*,
154e0 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63  sqlite3SharedCac
154f0 68 65 4c 69 73 74 29 20 3d 20 70 42 74 3b 0a 20  heList) = pBt;. 
15500 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74       sqlite3_mut
15510 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 53 68  ex_leave(mutexSh
15520 61 72 65 64 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  ared);.    }.#en
15530 64 69 66 0a 20 20 7d 0a 0a 23 69 66 20 21 64 65  dif.  }..#if !de
15540 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
15550 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 20  T_SHARED_CACHE) 
15560 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  && !defined(SQLI
15570 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a  TE_OMIT_DISKIO).
15580 20 20 2f 2a 20 49 66 20 74 68 65 20 6e 65 77 20    /* If the new 
15590 42 74 72 65 65 20 75 73 65 73 20 61 20 73 68 61  Btree uses a sha
155a0 72 61 62 6c 65 20 70 42 74 53 68 61 72 65 64 2c  rable pBtShared,
155b0 20 74 68 65 6e 20 6c 69 6e 6b 20 74 68 65 20 6e   then link the n
155c0 65 77 0a 20 20 2a 2a 20 42 74 72 65 65 20 69 6e  ew.  ** Btree in
155d0 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20 61  to the list of a
155e0 6c 6c 20 73 68 61 72 61 62 6c 65 20 42 74 72 65  ll sharable Btre
155f0 65 73 20 66 6f 72 20 74 68 65 20 73 61 6d 65 20  es for the same 
15600 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 20 20 2a 2a  connection..  **
15610 20 54 68 65 20 6c 69 73 74 20 69 73 20 6b 65 70   The list is kep
15620 74 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f  t in ascending o
15630 72 64 65 72 20 62 79 20 70 42 74 20 61 64 64 72  rder by pBt addr
15640 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ess..  */.  if( 
15650 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20  p->sharable ){. 
15660 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 42 74     int i;.    Bt
15670 72 65 65 20 2a 70 53 69 62 3b 0a 20 20 20 20 66  ree *pSib;.    f
15680 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44  or(i=0; i<db->nD
15690 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  b; i++){.      i
156a0 66 28 20 28 70 53 69 62 20 3d 20 64 62 2d 3e 61  f( (pSib = db->a
156b0 44 62 5b 69 5d 2e 70 42 74 29 21 3d 30 20 26 26  Db[i].pBt)!=0 &&
156c0 20 70 53 69 62 2d 3e 73 68 61 72 61 62 6c 65 20   pSib->sharable 
156d0 29 7b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65  ){.        while
156e0 28 20 70 53 69 62 2d 3e 70 50 72 65 76 20 29 7b  ( pSib->pPrev ){
156f0 20 70 53 69 62 20 3d 20 70 53 69 62 2d 3e 70 50   pSib = pSib->pP
15700 72 65 76 3b 20 7d 0a 20 20 20 20 20 20 20 20 69  rev; }.        i
15710 66 28 20 28 75 70 74 72 29 70 2d 3e 70 42 74 3c  f( (uptr)p->pBt<
15720 28 75 70 74 72 29 70 53 69 62 2d 3e 70 42 74 20  (uptr)pSib->pBt 
15730 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  ){.          p->
15740 70 4e 65 78 74 20 3d 20 70 53 69 62 3b 0a 20 20  pNext = pSib;.  
15750 20 20 20 20 20 20 20 20 70 2d 3e 70 50 72 65 76          p->pPrev
15760 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
15770 70 53 69 62 2d 3e 70 50 72 65 76 20 3d 20 70 3b  pSib->pPrev = p;
15780 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
15790 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28            while(
157a0 20 70 53 69 62 2d 3e 70 4e 65 78 74 20 26 26 20   pSib->pNext && 
157b0 28 75 70 74 72 29 70 53 69 62 2d 3e 70 4e 65 78  (uptr)pSib->pNex
157c0 74 2d 3e 70 42 74 3c 28 75 70 74 72 29 70 2d 3e  t->pBt<(uptr)p->
157d0 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  pBt ){.         
157e0 20 20 20 70 53 69 62 20 3d 20 70 53 69 62 2d 3e     pSib = pSib->
157f0 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20  pNext;.         
15800 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e   }.          p->
15810 70 4e 65 78 74 20 3d 20 70 53 69 62 2d 3e 70 4e  pNext = pSib->pN
15820 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20 70  ext;.          p
15830 2d 3e 70 50 72 65 76 20 3d 20 70 53 69 62 3b 0a  ->pPrev = pSib;.
15840 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 2d            if( p-
15850 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20  >pNext ){.      
15860 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 2d 3e        p->pNext->
15870 70 50 72 65 76 20 3d 20 70 3b 0a 20 20 20 20 20  pPrev = p;.     
15880 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
15890 20 70 53 69 62 2d 3e 70 4e 65 78 74 20 3d 20 70   pSib->pNext = p
158a0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
158b0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
158c0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e   }.    }.  }.#en
158d0 64 69 66 0a 20 20 2a 70 70 42 74 72 65 65 20 3d  dif.  *ppBtree =
158e0 20 70 3b 0a 0a 62 74 72 65 65 5f 6f 70 65 6e 5f   p;..btree_open_
158f0 6f 75 74 3a 0a 20 20 69 66 28 20 72 63 21 3d 53  out:.  if( rc!=S
15900 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
15910 69 66 28 20 70 42 74 20 26 26 20 70 42 74 2d 3e  if( pBt && pBt->
15920 70 50 61 67 65 72 20 29 7b 0a 20 20 20 20 20 20  pPager ){.      
15930 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73  sqlite3PagerClos
15940 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 30  e(pBt->pPager, 0
15950 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
15960 69 74 65 33 5f 66 72 65 65 28 70 42 74 29 3b 0a  ite3_free(pBt);.
15970 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
15980 28 70 29 3b 0a 20 20 20 20 2a 70 70 42 74 72 65  (p);.    *ppBtre
15990 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  e = 0;.  }else{.
159a0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65      sqlite3_file
159b0 20 2a 70 46 69 6c 65 3b 0a 0a 20 20 20 20 2f 2a   *pFile;..    /*
159c0 20 49 66 20 74 68 65 20 42 2d 54 72 65 65 20 77   If the B-Tree w
159d0 61 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  as successfully 
159e0 6f 70 65 6e 65 64 2c 20 73 65 74 20 74 68 65 20  opened, set the 
159f0 70 61 67 65 72 2d 63 61 63 68 65 20 73 69 7a 65  pager-cache size
15a00 20 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 64   to the.    ** d
15a10 65 66 61 75 6c 74 20 76 61 6c 75 65 2e 20 45 78  efault value. Ex
15a20 63 65 70 74 2c 20 77 68 65 6e 20 6f 70 65 6e 69  cept, when openi
15a30 6e 67 20 6f 6e 20 61 6e 20 65 78 69 73 74 69 6e  ng on an existin
15a40 67 20 73 68 61 72 65 64 20 70 61 67 65 72 2d 63  g shared pager-c
15a50 61 63 68 65 2c 0a 20 20 20 20 2a 2a 20 64 6f 20  ache,.    ** do 
15a60 6e 6f 74 20 63 68 61 6e 67 65 20 74 68 65 20 70  not change the p
15a70 61 67 65 72 2d 63 61 63 68 65 20 73 69 7a 65 2e  ager-cache size.
15a80 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
15a90 73 71 6c 69 74 65 33 42 74 72 65 65 53 63 68 65  sqlite3BtreeSche
15aa0 6d 61 28 70 2c 20 30 2c 20 30 29 3d 3d 30 20 29  ma(p, 0, 0)==0 )
15ab0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  {.      sqlite3P
15ac0 61 67 65 72 53 65 74 43 61 63 68 65 73 69 7a 65  agerSetCachesize
15ad0 28 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 2c  (p->pBt->pPager,
15ae0 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
15af0 43 41 43 48 45 5f 53 49 5a 45 29 3b 0a 20 20 20  CACHE_SIZE);.   
15b00 20 7d 0a 0a 20 20 20 20 70 46 69 6c 65 20 3d 20   }..    pFile = 
15b10 73 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65  sqlite3PagerFile
15b20 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20  (pBt->pPager);. 
15b30 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 4d     if( pFile->pM
15b40 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 20 20  ethods ){.      
15b50 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e  sqlite3OsFileCon
15b60 74 72 6f 6c 48 69 6e 74 28 70 46 69 6c 65 2c 20  trolHint(pFile, 
15b70 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 44 42  SQLITE_FCNTL_PDB
15b80 2c 20 28 76 6f 69 64 2a 29 26 70 42 74 2d 3e 64  , (void*)&pBt->d
15b90 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  b);.    }.  }.  
15ba0 69 66 28 20 6d 75 74 65 78 4f 70 65 6e 20 29 7b  if( mutexOpen ){
15bb0 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
15bc0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
15bd0 6d 75 74 65 78 4f 70 65 6e 29 20 29 3b 0a 20 20  mutexOpen) );.  
15be0 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
15bf0 6c 65 61 76 65 28 6d 75 74 65 78 4f 70 65 6e 29  leave(mutexOpen)
15c00 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
15c10 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
15c20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6e   sqlite3BtreeCon
15c30 6e 65 63 74 69 6f 6e 43 6f 75 6e 74 28 2a 70 70  nectionCount(*pp
15c40 42 74 72 65 65 29 3e 30 20 29 3b 0a 20 20 72 65  Btree)>0 );.  re
15c50 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
15c60 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20  * Decrement the 
15c70 42 74 53 68 61 72 65 64 2e 6e 52 65 66 20 63 6f  BtShared.nRef co
15c80 75 6e 74 65 72 2e 20 20 57 68 65 6e 20 69 74 20  unter.  When it 
15c90 72 65 61 63 68 65 73 20 7a 65 72 6f 2c 0a 2a 2a  reaches zero,.**
15ca0 20 72 65 6d 6f 76 65 20 74 68 65 20 42 74 53 68   remove the BtSh
15cb0 61 72 65 64 20 73 74 72 75 63 74 75 72 65 20 66  ared structure f
15cc0 72 6f 6d 20 74 68 65 20 73 68 61 72 69 6e 67 20  rom the sharing 
15cd0 6c 69 73 74 2e 20 20 52 65 74 75 72 6e 0a 2a 2a  list.  Return.**
15ce0 20 74 72 75 65 20 69 66 20 74 68 65 20 42 74 53   true if the BtS
15cf0 68 61 72 65 64 2e 6e 52 65 66 20 63 6f 75 6e 74  hared.nRef count
15d00 65 72 20 72 65 61 63 68 65 73 20 7a 65 72 6f 20  er reaches zero 
15d10 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20 66 61  and return.** fa
15d20 6c 73 65 20 69 66 20 69 74 20 69 73 20 73 74 69  lse if it is sti
15d30 6c 6c 20 70 6f 73 69 74 69 76 65 2e 0a 2a 2f 0a  ll positive..*/.
15d40 73 74 61 74 69 63 20 69 6e 74 20 72 65 6d 6f 76  static int remov
15d50 65 46 72 6f 6d 53 68 61 72 69 6e 67 4c 69 73 74  eFromSharingList
15d60 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b  (BtShared *pBt){
15d70 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
15d80 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
15d90 45 0a 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28  E.  MUTEX_LOGIC(
15da0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a   sqlite3_mutex *
15db0 70 4d 61 73 74 65 72 3b 20 29 0a 20 20 42 74 53  pMaster; ).  BtS
15dc0 68 61 72 65 64 20 2a 70 4c 69 73 74 3b 0a 20 20  hared *pList;.  
15dd0 69 6e 74 20 72 65 6d 6f 76 65 64 20 3d 20 30 3b  int removed = 0;
15de0 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
15df0 74 65 33 5f 6d 75 74 65 78 5f 6e 6f 74 68 65 6c  te3_mutex_nothel
15e00 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
15e10 0a 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20  .  MUTEX_LOGIC( 
15e20 70 4d 61 73 74 65 72 20 3d 20 73 71 6c 69 74 65  pMaster = sqlite
15e30 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49  3MutexAlloc(SQLI
15e40 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
15e50 4d 41 53 54 45 52 29 3b 20 29 0a 20 20 73 71 6c  MASTER); ).  sql
15e60 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
15e70 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 70 42 74  (pMaster);.  pBt
15e80 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20  ->nRef--;.  if( 
15e90 70 42 74 2d 3e 6e 52 65 66 3c 3d 30 20 29 7b 0a  pBt->nRef<=0 ){.
15ea0 20 20 20 20 69 66 28 20 47 4c 4f 42 41 4c 28 42      if( GLOBAL(B
15eb0 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33  tShared*,sqlite3
15ec0 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 29  SharedCacheList)
15ed0 3d 3d 70 42 74 20 29 7b 0a 20 20 20 20 20 20 47  ==pBt ){.      G
15ee0 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c  LOBAL(BtShared*,
15ef0 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63  sqlite3SharedCac
15f00 68 65 4c 69 73 74 29 20 3d 20 70 42 74 2d 3e 70  heList) = pBt->p
15f10 4e 65 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Next;.    }else{
15f20 0a 20 20 20 20 20 20 70 4c 69 73 74 20 3d 20 47  .      pList = G
15f30 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c  LOBAL(BtShared*,
15f40 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63  sqlite3SharedCac
15f50 68 65 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 77  heList);.      w
15f60 68 69 6c 65 28 20 41 4c 57 41 59 53 28 70 4c 69  hile( ALWAYS(pLi
15f70 73 74 29 20 26 26 20 70 4c 69 73 74 2d 3e 70 4e  st) && pList->pN
15f80 65 78 74 21 3d 70 42 74 20 29 7b 0a 20 20 20 20  ext!=pBt ){.    
15f90 20 20 20 20 70 4c 69 73 74 3d 70 4c 69 73 74 2d      pList=pList-
15fa0 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a  >pNext;.      }.
15fb0 20 20 20 20 20 20 69 66 28 20 41 4c 57 41 59 53        if( ALWAYS
15fc0 28 70 4c 69 73 74 29 20 29 7b 0a 20 20 20 20 20  (pList) ){.     
15fd0 20 20 20 70 4c 69 73 74 2d 3e 70 4e 65 78 74 20     pList->pNext 
15fe0 3d 20 70 42 74 2d 3e 70 4e 65 78 74 3b 0a 20 20  = pBt->pNext;.  
15ff0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
16000 69 66 28 20 53 51 4c 49 54 45 5f 54 48 52 45 41  if( SQLITE_THREA
16010 44 53 41 46 45 20 29 7b 0a 20 20 20 20 20 20 73  DSAFE ){.      s
16020 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66 72 65  qlite3_mutex_fre
16030 65 28 70 42 74 2d 3e 6d 75 74 65 78 29 3b 0a 20  e(pBt->mutex);. 
16040 20 20 20 7d 0a 20 20 20 20 72 65 6d 6f 76 65 64     }.    removed
16050 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 73 71 6c 69   = 1;.  }.  sqli
16060 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
16070 70 4d 61 73 74 65 72 29 3b 0a 20 20 72 65 74 75  pMaster);.  retu
16080 72 6e 20 72 65 6d 6f 76 65 64 3b 0a 23 65 6c 73  rn removed;.#els
16090 65 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 23 65  e.  return 1;.#e
160a0 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61  ndif.}../*.** Ma
160b0 6b 65 20 73 75 72 65 20 70 42 74 2d 3e 70 54 6d  ke sure pBt->pTm
160c0 70 53 70 61 63 65 20 70 6f 69 6e 74 73 20 74 6f  pSpace points to
160d0 20 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 6f   an allocation o
160e0 66 20 0a 2a 2a 20 4d 58 5f 43 45 4c 4c 5f 53 49  f .** MX_CELL_SI
160f0 5a 45 28 70 42 74 29 20 62 79 74 65 73 20 77 69  ZE(pBt) bytes wi
16100 74 68 20 61 20 34 2d 62 79 74 65 20 70 72 65 66  th a 4-byte pref
16110 69 78 20 66 6f 72 20 61 20 6c 65 66 74 2d 63 68  ix for a left-ch
16120 69 6c 64 0a 2a 2a 20 70 6f 69 6e 74 65 72 2e 0a  ild.** pointer..
16130 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61  */.static void a
16140 6c 6c 6f 63 61 74 65 54 65 6d 70 53 70 61 63 65  llocateTempSpace
16150 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b  (BtShared *pBt){
16160 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 70 54 6d  .  if( !pBt->pTm
16170 70 53 70 61 63 65 20 29 7b 0a 20 20 20 20 70 42  pSpace ){.    pB
16180 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d 20 73  t->pTmpSpace = s
16190 71 6c 69 74 65 33 50 61 67 65 4d 61 6c 6c 6f 63  qlite3PageMalloc
161a0 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  ( pBt->pageSize 
161b0 29 3b 0a 0a 20 20 20 20 2f 2a 20 4f 6e 65 20 6f  );..    /* One o
161c0 66 20 74 68 65 20 75 73 65 73 20 6f 66 20 70 42  f the uses of pB
161d0 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 69 73 20  t->pTmpSpace is 
161e0 74 6f 20 66 6f 72 6d 61 74 20 63 65 6c 6c 73 20  to format cells 
161f0 62 65 66 6f 72 65 0a 20 20 20 20 2a 2a 20 69 6e  before.    ** in
16200 73 65 72 74 69 6e 67 20 74 68 65 6d 20 69 6e 74  serting them int
16210 6f 20 61 20 6c 65 61 66 20 70 61 67 65 20 28 66  o a leaf page (f
16220 75 6e 63 74 69 6f 6e 20 66 69 6c 6c 49 6e 43 65  unction fillInCe
16230 6c 6c 28 29 29 2e 20 49 66 0a 20 20 20 20 2a 2a  ll()). If.    **
16240 20 61 20 63 65 6c 6c 20 69 73 20 6c 65 73 73 20   a cell is less 
16250 74 68 61 6e 20 34 20 62 79 74 65 73 20 69 6e 20  than 4 bytes in 
16260 73 69 7a 65 2c 20 69 74 20 69 73 20 72 6f 75 6e  size, it is roun
16270 64 65 64 20 75 70 20 74 6f 20 34 20 62 79 74 65  ded up to 4 byte
16280 73 0a 20 20 20 20 2a 2a 20 62 79 20 74 68 65 20  s.    ** by the 
16290 76 61 72 69 6f 75 73 20 72 6f 75 74 69 6e 65 73  various routines
162a0 20 74 68 61 74 20 6d 61 6e 69 70 75 6c 61 74 65   that manipulate
162b0 20 62 69 6e 61 72 79 20 63 65 6c 6c 73 2e 20 57   binary cells. W
162c0 68 69 63 68 0a 20 20 20 20 2a 2a 20 63 61 6e 20  hich.    ** can 
162d0 6d 65 61 6e 20 74 68 61 74 20 66 69 6c 6c 49 6e  mean that fillIn
162e0 43 65 6c 6c 28 29 20 6f 6e 6c 79 20 69 6e 69 74  Cell() only init
162f0 69 61 6c 69 7a 65 73 20 74 68 65 20 66 69 72 73  ializes the firs
16300 74 20 32 20 6f 72 20 33 0a 20 20 20 20 2a 2a 20  t 2 or 3.    ** 
16310 62 79 74 65 73 20 6f 66 20 70 54 6d 70 53 70 61  bytes of pTmpSpa
16320 63 65 2c 20 62 75 74 20 74 68 61 74 20 74 68 65  ce, but that the
16330 20 66 69 72 73 74 20 34 20 62 79 74 65 73 20 61   first 4 bytes a
16340 72 65 20 63 6f 70 69 65 64 20 66 72 6f 6d 0a 20  re copied from. 
16350 20 20 20 2a 2a 20 69 74 20 69 6e 74 6f 20 61 20     ** it into a 
16360 64 61 74 61 62 61 73 65 20 70 61 67 65 2e 20 54  database page. T
16370 68 69 73 20 69 73 20 6e 6f 74 20 61 63 74 75 61  his is not actua
16380 6c 6c 79 20 61 20 70 72 6f 62 6c 65 6d 2c 20 62  lly a problem, b
16390 75 74 20 69 74 0a 20 20 20 20 2a 2a 20 64 6f 65  ut it.    ** doe
163a0 73 20 63 61 75 73 65 20 61 20 76 61 6c 67 72 69  s cause a valgri
163b0 6e 64 20 65 72 72 6f 72 20 77 68 65 6e 20 74 68  nd error when th
163c0 65 20 31 20 6f 72 20 32 20 62 79 74 65 73 20 6f  e 1 or 2 bytes o
163d0 66 20 75 6e 69 74 69 61 6c 69 7a 65 64 20 0a 20  f unitialized . 
163e0 20 20 20 2a 2a 20 64 61 74 61 20 69 73 20 70 61     ** data is pa
163f0 73 73 65 64 20 74 6f 20 73 79 73 74 65 6d 20 63  ssed to system c
16400 61 6c 6c 20 77 72 69 74 65 28 29 2e 20 53 6f 20  all write(). So 
16410 74 6f 20 61 76 6f 69 64 20 74 68 69 73 20 65 72  to avoid this er
16420 72 6f 72 2c 0a 20 20 20 20 2a 2a 20 7a 65 72 6f  ror,.    ** zero
16430 20 74 68 65 20 66 69 72 73 74 20 34 20 62 79 74   the first 4 byt
16440 65 73 20 6f 66 20 74 65 6d 70 20 73 70 61 63 65  es of temp space
16450 20 68 65 72 65 2e 0a 20 20 20 20 2a 2a 0a 20 20   here..    **.  
16460 20 20 2a 2a 20 41 6c 73 6f 3a 20 20 50 72 6f 76    ** Also:  Prov
16470 69 64 65 20 66 6f 75 72 20 62 79 74 65 73 20 6f  ide four bytes o
16480 66 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 73 70  f initialized sp
16490 61 63 65 20 62 65 66 6f 72 65 20 74 68 65 0a 20  ace before the. 
164a0 20 20 20 2a 2a 20 62 65 67 69 6e 6e 69 6e 67 20     ** beginning 
164b0 6f 66 20 70 54 6d 70 53 70 61 63 65 20 61 73 20  of pTmpSpace as 
164c0 61 6e 20 61 72 65 61 20 61 76 61 69 6c 61 62 6c  an area availabl
164d0 65 20 74 6f 20 70 72 65 70 65 6e 64 20 74 68 65  e to prepend the
164e0 0a 20 20 20 20 2a 2a 20 6c 65 66 74 2d 63 68 69  .    ** left-chi
164f0 6c 64 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68  ld pointer to th
16500 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 61  e beginning of a
16510 20 63 65 6c 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20   cell..    */.  
16520 20 20 69 66 28 20 70 42 74 2d 3e 70 54 6d 70 53    if( pBt->pTmpS
16530 70 61 63 65 20 29 7b 0a 20 20 20 20 20 20 6d 65  pace ){.      me
16540 6d 73 65 74 28 70 42 74 2d 3e 70 54 6d 70 53 70  mset(pBt->pTmpSp
16550 61 63 65 2c 20 30 2c 20 38 29 3b 0a 20 20 20 20  ace, 0, 8);.    
16560 20 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65    pBt->pTmpSpace
16570 20 2b 3d 20 34 3b 0a 20 20 20 20 7d 0a 20 20 7d   += 4;.    }.  }
16580 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 74  .}../*.** Free t
16590 68 65 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63  he pBt->pTmpSpac
165a0 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2f 0a  e allocation.*/.
165b0 73 74 61 74 69 63 20 76 6f 69 64 20 66 72 65 65  static void free
165c0 54 65 6d 70 53 70 61 63 65 28 42 74 53 68 61 72  TempSpace(BtShar
165d0 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 66 28 20  ed *pBt){.  if( 
165e0 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 29  pBt->pTmpSpace )
165f0 7b 0a 20 20 20 20 70 42 74 2d 3e 70 54 6d 70 53  {.    pBt->pTmpS
16600 70 61 63 65 20 2d 3d 20 34 3b 0a 20 20 20 20 73  pace -= 4;.    s
16610 71 6c 69 74 65 33 50 61 67 65 46 72 65 65 28 70  qlite3PageFree(p
16620 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a  Bt->pTmpSpace);.
16630 20 20 20 20 70 42 74 2d 3e 70 54 6d 70 53 70 61      pBt->pTmpSpa
16640 63 65 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f  ce = 0;.  }.}../
16650 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e 20 6f 70  *.** Close an op
16660 65 6e 20 64 61 74 61 62 61 73 65 20 61 6e 64 20  en database and 
16670 69 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c 20 63  invalidate all c
16680 75 72 73 6f 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73  ursors..*/.int s
16690 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65  qlite3BtreeClose
166a0 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74  (Btree *p){.  Bt
166b0 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
166c0 3e 70 42 74 3b 0a 20 20 42 74 43 75 72 73 6f 72  >pBt;.  BtCursor
166d0 20 2a 70 43 75 72 3b 0a 0a 20 20 2f 2a 20 43 6c   *pCur;..  /* Cl
166e0 6f 73 65 20 61 6c 6c 20 63 75 72 73 6f 72 73 20  ose all cursors 
166f0 6f 70 65 6e 65 64 20 76 69 61 20 74 68 69 73 20  opened via this 
16700 68 61 6e 64 6c 65 2e 20 20 2a 2f 0a 20 20 61 73  handle.  */.  as
16710 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
16720 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e  tex_held(p->db->
16730 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69  mutex) );.  sqli
16740 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
16750 3b 0a 20 20 70 43 75 72 20 3d 20 70 42 74 2d 3e  ;.  pCur = pBt->
16760 70 43 75 72 73 6f 72 3b 0a 20 20 77 68 69 6c 65  pCursor;.  while
16770 28 20 70 43 75 72 20 29 7b 0a 20 20 20 20 42 74  ( pCur ){.    Bt
16780 43 75 72 73 6f 72 20 2a 70 54 6d 70 20 3d 20 70  Cursor *pTmp = p
16790 43 75 72 3b 0a 20 20 20 20 70 43 75 72 20 3d 20  Cur;.    pCur = 
167a0 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  pCur->pNext;.   
167b0 20 69 66 28 20 70 54 6d 70 2d 3e 70 42 74 72 65   if( pTmp->pBtre
167c0 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20 73 71  e==p ){.      sq
167d0 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 43  lite3BtreeCloseC
167e0 75 72 73 6f 72 28 70 54 6d 70 29 3b 0a 20 20 20  ursor(pTmp);.   
167f0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 6f 6c   }.  }..  /* Rol
16800 6c 62 61 63 6b 20 61 6e 79 20 61 63 74 69 76 65  lback any active
16810 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64   transaction and
16820 20 66 72 65 65 20 74 68 65 20 68 61 6e 64 6c 65   free the handle
16830 20 73 74 72 75 63 74 75 72 65 2e 0a 20 20 2a 2a   structure..  **
16840 20 54 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c   The call to sql
16850 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63  ite3BtreeRollbac
16860 6b 28 29 20 64 72 6f 70 73 20 61 6e 79 20 74 61  k() drops any ta
16870 62 6c 65 2d 6c 6f 63 6b 73 20 68 65 6c 64 20 62  ble-locks held b
16880 79 0a 20 20 2a 2a 20 74 68 69 73 20 68 61 6e 64  y.  ** this hand
16890 6c 65 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  le..  */.  sqlit
168a0 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28  e3BtreeRollback(
168b0 70 2c 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 30 29  p, SQLITE_OK, 0)
168c0 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
168d0 4c 65 61 76 65 28 70 29 3b 0a 0a 20 20 2f 2a 20  Leave(p);..  /* 
168e0 49 66 20 74 68 65 72 65 20 61 72 65 20 73 74 69  If there are sti
168f0 6c 6c 20 6f 74 68 65 72 20 6f 75 74 73 74 61 6e  ll other outstan
16900 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 20  ding references 
16910 74 6f 20 74 68 65 20 73 68 61 72 65 64 2d 62 74  to the shared-bt
16920 72 65 65 0a 20 20 2a 2a 20 73 74 72 75 63 74 75  ree.  ** structu
16930 72 65 2c 20 72 65 74 75 72 6e 20 6e 6f 77 2e 20  re, return now. 
16940 54 68 65 20 72 65 6d 61 69 6e 64 65 72 20 6f 66  The remainder of
16950 20 74 68 69 73 20 70 72 6f 63 65 64 75 72 65 20   this procedure 
16960 63 6c 65 61 6e 73 20 0a 20 20 2a 2a 20 75 70 20  cleans .  ** up 
16970 74 68 65 20 73 68 61 72 65 64 2d 62 74 72 65 65  the shared-btree
16980 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
16990 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f 63 6b 3d 3d   p->wantToLock==
169a0 30 20 26 26 20 70 2d 3e 6c 6f 63 6b 65 64 3d 3d  0 && p->locked==
169b0 30 20 29 3b 0a 20 20 69 66 28 20 21 70 2d 3e 73  0 );.  if( !p->s
169c0 68 61 72 61 62 6c 65 20 7c 7c 20 72 65 6d 6f 76  harable || remov
169d0 65 46 72 6f 6d 53 68 61 72 69 6e 67 4c 69 73 74  eFromSharingList
169e0 28 70 42 74 29 20 29 7b 0a 20 20 20 20 2f 2a 20  (pBt) ){.    /* 
169f0 54 68 65 20 70 42 74 20 69 73 20 6e 6f 20 6c 6f  The pBt is no lo
16a00 6e 67 65 72 20 6f 6e 20 74 68 65 20 73 68 61 72  nger on the shar
16a10 69 6e 67 20 6c 69 73 74 2c 20 73 6f 20 77 65 20  ing list, so we 
16a20 63 61 6e 20 61 63 63 65 73 73 0a 20 20 20 20 2a  can access.    *
16a30 2a 20 69 74 20 77 69 74 68 6f 75 74 20 68 61 76  * it without hav
16a40 69 6e 67 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ing to hold the 
16a50 6d 75 74 65 78 2e 0a 20 20 20 20 2a 2a 0a 20 20  mutex..    **.  
16a60 20 20 2a 2a 20 43 6c 65 61 6e 20 6f 75 74 20 61    ** Clean out a
16a70 6e 64 20 64 65 6c 65 74 65 20 74 68 65 20 42 74  nd delete the Bt
16a80 53 68 61 72 65 64 20 6f 62 6a 65 63 74 2e 0a 20  Shared object.. 
16a90 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74     */.    assert
16aa0 28 20 21 70 42 74 2d 3e 70 43 75 72 73 6f 72 20  ( !pBt->pCursor 
16ab0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61  );.    sqlite3Pa
16ac0 67 65 72 43 6c 6f 73 65 28 70 42 74 2d 3e 70 50  gerClose(pBt->pP
16ad0 61 67 65 72 2c 20 70 2d 3e 64 62 29 3b 0a 20 20  ager, p->db);.  
16ae0 20 20 69 66 28 20 70 42 74 2d 3e 78 46 72 65 65    if( pBt->xFree
16af0 53 63 68 65 6d 61 20 26 26 20 70 42 74 2d 3e 70  Schema && pBt->p
16b00 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20  Schema ){.      
16b10 70 42 74 2d 3e 78 46 72 65 65 53 63 68 65 6d 61  pBt->xFreeSchema
16b20 28 70 42 74 2d 3e 70 53 63 68 65 6d 61 29 3b 0a  (pBt->pSchema);.
16b30 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
16b40 33 44 62 46 72 65 65 28 30 2c 20 70 42 74 2d 3e  3DbFree(0, pBt->
16b50 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 66 72  pSchema);.    fr
16b60 65 65 54 65 6d 70 53 70 61 63 65 28 70 42 74 29  eeTempSpace(pBt)
16b70 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
16b80 65 65 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 23 69  ee(pBt);.  }..#i
16b90 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
16ba0 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20  T_SHARED_CACHE. 
16bb0 20 61 73 73 65 72 74 28 20 70 2d 3e 77 61 6e 74   assert( p->want
16bc0 54 6f 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 61  ToLock==0 );.  a
16bd0 73 73 65 72 74 28 20 70 2d 3e 6c 6f 63 6b 65 64  ssert( p->locked
16be0 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  ==0 );.  if( p->
16bf0 70 50 72 65 76 20 29 20 70 2d 3e 70 50 72 65 76  pPrev ) p->pPrev
16c00 2d 3e 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65  ->pNext = p->pNe
16c10 78 74 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4e 65  xt;.  if( p->pNe
16c20 78 74 20 29 20 70 2d 3e 70 4e 65 78 74 2d 3e 70  xt ) p->pNext->p
16c30 50 72 65 76 20 3d 20 70 2d 3e 70 50 72 65 76 3b  Prev = p->pPrev;
16c40 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74  .#endif..  sqlit
16c50 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 72 65  e3_free(p);.  re
16c60 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
16c70 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  }../*.** Change 
16c80 74 68 65 20 22 73 6f 66 74 22 20 6c 69 6d 69 74  the "soft" limit
16c90 20 6f 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   on the number o
16ca0 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 63  f pages in the c
16cb0 61 63 68 65 2e 0a 2a 2a 20 55 6e 75 73 65 64 20  ache..** Unused 
16cc0 61 6e 64 20 75 6e 6d 6f 64 69 66 69 65 64 20 70  and unmodified p
16cd0 61 67 65 73 20 77 69 6c 6c 20 62 65 20 72 65 63  ages will be rec
16ce0 79 63 6c 65 64 20 77 68 65 6e 20 74 68 65 20 6e  ycled when the n
16cf0 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 70 61 67 65  umber of.** page
16d00 73 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 65  s in the cache e
16d10 78 63 65 65 64 73 20 74 68 69 73 20 73 6f 66 74  xceeds this soft
16d20 20 6c 69 6d 69 74 2e 20 20 42 75 74 20 74 68 65   limit.  But the
16d30 20 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20   size of the.** 
16d40 63 61 63 68 65 20 69 73 20 61 6c 6c 6f 77 65 64  cache is allowed
16d50 20 74 6f 20 67 72 6f 77 20 6c 61 72 67 65 72 20   to grow larger 
16d60 74 68 61 6e 20 74 68 69 73 20 6c 69 6d 69 74 20  than this limit 
16d70 69 66 20 69 74 20 63 6f 6e 74 61 69 6e 73 0a 2a  if it contains.*
16d80 2a 20 64 69 72 74 79 20 70 61 67 65 73 20 6f 72  * dirty pages or
16d90 20 70 61 67 65 73 20 73 74 69 6c 6c 20 69 6e 20   pages still in 
16da0 61 63 74 69 76 65 20 75 73 65 2e 0a 2a 2f 0a 69  active use..*/.i
16db0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53  nt sqlite3BtreeS
16dc0 65 74 43 61 63 68 65 53 69 7a 65 28 42 74 72 65  etCacheSize(Btre
16dd0 65 20 2a 70 2c 20 69 6e 74 20 6d 78 50 61 67 65  e *p, int mxPage
16de0 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
16df0 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61  Bt = p->pBt;.  a
16e00 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
16e10 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d  utex_held(p->db-
16e20 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c  >mutex) );.  sql
16e30 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
16e40 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65  );.  sqlite3Page
16e50 72 53 65 74 43 61 63 68 65 73 69 7a 65 28 70 42  rSetCachesize(pB
16e60 74 2d 3e 70 50 61 67 65 72 2c 20 6d 78 50 61 67  t->pPager, mxPag
16e70 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  e);.  sqlite3Btr
16e80 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
16e90 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
16ea0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  }../*.** Change 
16eb0 74 68 65 20 22 73 70 69 6c 6c 22 20 6c 69 6d 69  the "spill" limi
16ec0 74 20 6f 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  t on the number 
16ed0 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
16ee0 63 61 63 68 65 2e 0a 2a 2a 20 49 66 20 74 68 65  cache..** If the
16ef0 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
16f00 20 65 78 63 65 65 64 73 20 74 68 69 73 20 6c 69   exceeds this li
16f10 6d 69 74 20 64 75 72 69 6e 67 20 61 20 77 72 69  mit during a wri
16f20 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 0a  te transaction,.
16f30 2a 2a 20 74 68 65 20 70 61 67 65 72 20 6d 69 67  ** the pager mig
16f40 68 74 20 61 74 74 65 6d 70 74 20 74 6f 20 22 73  ht attempt to "s
16f50 70 69 6c 6c 22 20 70 61 67 65 73 20 74 6f 20 74  pill" pages to t
16f60 68 65 20 6a 6f 75 72 6e 61 6c 20 65 61 72 6c 79  he journal early
16f70 20 69 6e 0a 2a 2a 20 6f 72 64 65 72 20 74 6f 20   in.** order to 
16f80 66 72 65 65 20 75 70 20 6d 65 6d 6f 72 79 2e 0a  free up memory..
16f90 2a 2a 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20  **.** The value 
16fa0 72 65 74 75 72 6e 65 64 20 69 73 20 74 68 65 20  returned is the 
16fb0 63 75 72 72 65 6e 74 20 73 70 69 6c 6c 20 73 69  current spill si
16fc0 7a 65 2e 20 20 49 66 20 7a 65 72 6f 20 69 73 20  ze.  If zero is 
16fd0 70 61 73 73 65 64 0a 2a 2a 20 61 73 20 61 6e 20  passed.** as an 
16fe0 61 72 67 75 6d 65 6e 74 2c 20 6e 6f 20 63 68 61  argument, no cha
16ff0 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20 74 6f  nges are made to
17000 20 74 68 65 20 73 70 69 6c 6c 20 73 69 7a 65 20   the spill size 
17010 73 65 74 74 69 6e 67 2c 20 73 6f 0a 2a 2a 20 75  setting, so.** u
17020 73 69 6e 67 20 6d 78 50 61 67 65 20 6f 66 20 30  sing mxPage of 0
17030 20 69 73 20 61 20 77 61 79 20 74 6f 20 71 75 65   is a way to que
17040 72 79 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  ry the current s
17050 70 69 6c 6c 20 73 69 7a 65 2e 0a 2a 2f 0a 69 6e  pill size..*/.in
17060 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65  t sqlite3BtreeSe
17070 74 53 70 69 6c 6c 53 69 7a 65 28 42 74 72 65 65  tSpillSize(Btree
17080 20 2a 70 2c 20 69 6e 74 20 6d 78 50 61 67 65 29   *p, int mxPage)
17090 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
170a0 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e  t = p->pBt;.  in
170b0 74 20 72 65 73 3b 0a 20 20 61 73 73 65 72 74 28  t res;.  assert(
170c0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
170d0 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78  eld(p->db->mutex
170e0 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ) );.  sqlite3Bt
170f0 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 72  reeEnter(p);.  r
17100 65 73 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  es = sqlite3Page
17110 72 53 65 74 53 70 69 6c 6c 73 69 7a 65 28 70 42  rSetSpillsize(pB
17120 74 2d 3e 70 50 61 67 65 72 2c 20 6d 78 50 61 67  t->pPager, mxPag
17130 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  e);.  sqlite3Btr
17140 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
17150 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 23 69 66  turn res;.}..#if
17160 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
17170 5f 53 49 5a 45 3e 30 0a 2f 2a 0a 2a 2a 20 43 68  _SIZE>0./*.** Ch
17180 61 6e 67 65 20 74 68 65 20 6c 69 6d 69 74 20 6f  ange the limit o
17190 6e 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20  n the amount of 
171a0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
171b0 65 20 74 68 61 74 20 6d 61 79 20 62 65 0a 2a 2a  e that may be.**
171c0 20 6d 65 6d 6f 72 79 20 6d 61 70 70 65 64 2e 0a   memory mapped..
171d0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
171e0 72 65 65 53 65 74 4d 6d 61 70 4c 69 6d 69 74 28  reeSetMmapLimit(
171f0 42 74 72 65 65 20 2a 70 2c 20 73 71 6c 69 74 65  Btree *p, sqlite
17200 33 5f 69 6e 74 36 34 20 73 7a 4d 6d 61 70 29 7b  3_int64 szMmap){
17210 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
17220 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73   = p->pBt;.  ass
17230 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
17240 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d  ex_held(p->db->m
17250 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74  utex) );.  sqlit
17260 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
17270 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  .  sqlite3PagerS
17280 65 74 4d 6d 61 70 4c 69 6d 69 74 28 70 42 74 2d  etMmapLimit(pBt-
17290 3e 70 50 61 67 65 72 2c 20 73 7a 4d 6d 61 70 29  >pPager, szMmap)
172a0 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
172b0 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
172c0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
172d0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
172e0 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30  _MAX_MMAP_SIZE>0
172f0 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67   */../*.** Chang
17300 65 20 74 68 65 20 77 61 79 20 64 61 74 61 20 69  e the way data i
17310 73 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b  s synced to disk
17320 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 69 6e 63   in order to inc
17330 72 65 61 73 65 20 6f 72 20 64 65 63 72 65 61 73  rease or decreas
17340 65 0a 2a 2a 20 68 6f 77 20 77 65 6c 6c 20 74 68  e.** how well th
17350 65 20 64 61 74 61 62 61 73 65 20 72 65 73 69 73  e database resis
17360 74 73 20 64 61 6d 61 67 65 20 64 75 65 20 74 6f  ts damage due to
17370 20 4f 53 20 63 72 61 73 68 65 73 20 61 6e 64 20   OS crashes and 
17380 70 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65  power.** failure
17390 73 2e 20 20 4c 65 76 65 6c 20 31 20 69 73 20 74  s.  Level 1 is t
173a0 68 65 20 73 61 6d 65 20 61 73 20 61 73 79 6e 63  he same as async
173b0 68 72 6f 6e 6f 75 73 20 28 6e 6f 20 73 79 6e 63  hronous (no sync
173c0 73 28 29 20 6f 63 63 75 72 20 61 6e 64 0a 2a 2a  s() occur and.**
173d0 20 74 68 65 72 65 20 69 73 20 61 20 68 69 67 68   there is a high
173e0 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20   probability of 
173f0 64 61 6d 61 67 65 29 20 20 4c 65 76 65 6c 20 32  damage)  Level 2
17400 20 69 73 20 74 68 65 20 64 65 66 61 75 6c 74 2e   is the default.
17410 20 20 54 68 65 72 65 0a 2a 2a 20 69 73 20 61 20    There.** is a 
17420 76 65 72 79 20 6c 6f 77 20 62 75 74 20 6e 6f 6e  very low but non
17430 2d 7a 65 72 6f 20 70 72 6f 62 61 62 69 6c 69 74  -zero probabilit
17440 79 20 6f 66 20 64 61 6d 61 67 65 2e 20 20 4c 65  y of damage.  Le
17450 76 65 6c 20 33 20 72 65 64 75 63 65 73 20 74 68  vel 3 reduces th
17460 65 0a 2a 2a 20 70 72 6f 62 61 62 69 6c 69 74 79  e.** probability
17470 20 6f 66 20 64 61 6d 61 67 65 20 74 6f 20 6e 65   of damage to ne
17480 61 72 20 7a 65 72 6f 20 62 75 74 20 77 69 74 68  ar zero but with
17490 20 61 20 77 72 69 74 65 20 70 65 72 66 6f 72 6d   a write perform
174a0 61 6e 63 65 20 72 65 64 75 63 74 69 6f 6e 2e 0a  ance reduction..
174b0 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
174c0 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41  E_OMIT_PAGER_PRA
174d0 47 4d 41 53 0a 69 6e 74 20 73 71 6c 69 74 65 33  GMAS.int sqlite3
174e0 42 74 72 65 65 53 65 74 50 61 67 65 72 46 6c 61  BtreeSetPagerFla
174f0 67 73 28 0a 20 20 42 74 72 65 65 20 2a 70 2c 20  gs(.  Btree *p, 
17500 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
17510 54 68 65 20 62 74 72 65 65 20 74 6f 20 73 65 74  The btree to set
17520 20 74 68 65 20 73 61 66 65 74 79 20 6c 65 76 65   the safety leve
17530 6c 20 6f 6e 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  l on */.  unsign
17540 65 64 20 70 67 46 6c 61 67 73 20 20 20 20 20 20  ed pgFlags      
17550 20 2f 2a 20 56 61 72 69 6f 75 73 20 50 41 47 45   /* Various PAGE
17560 52 5f 2a 20 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a  R_* flags */.){.
17570 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
17580 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65  = p->pBt;.  asse
17590 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
175a0 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75  x_held(p->db->mu
175b0 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65  tex) );.  sqlite
175c0 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
175d0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65    sqlite3PagerSe
175e0 74 46 6c 61 67 73 28 70 42 74 2d 3e 70 50 61 67  tFlags(pBt->pPag
175f0 65 72 2c 20 70 67 46 6c 61 67 73 29 3b 0a 20 20  er, pgFlags);.  
17600 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
17610 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  e(p);.  return S
17620 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64  QLITE_OK;.}.#end
17630 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  if../*.** Change
17640 20 74 68 65 20 64 65 66 61 75 6c 74 20 70 61 67   the default pag
17650 65 73 20 73 69 7a 65 20 61 6e 64 20 74 68 65 20  es size and the 
17660 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 65 72 76  number of reserv
17670 65 64 20 62 79 74 65 73 20 70 65 72 20 70 61 67  ed bytes per pag
17680 65 2e 0a 2a 2a 20 4f 72 2c 20 69 66 20 74 68 65  e..** Or, if the
17690 20 70 61 67 65 20 73 69 7a 65 20 68 61 73 20 61   page size has a
176a0 6c 72 65 61 64 79 20 62 65 65 6e 20 66 69 78 65  lready been fixe
176b0 64 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  d, return SQLITE
176c0 5f 52 45 41 44 4f 4e 4c 59 20 0a 2a 2a 20 77 69  _READONLY .** wi
176d0 74 68 6f 75 74 20 63 68 61 6e 67 69 6e 67 20 61  thout changing a
176e0 6e 79 74 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54  nything..**.** T
176f0 68 65 20 70 61 67 65 20 73 69 7a 65 20 6d 75 73  he page size mus
17700 74 20 62 65 20 61 20 70 6f 77 65 72 20 6f 66 20  t be a power of 
17710 32 20 62 65 74 77 65 65 6e 20 35 31 32 20 61 6e  2 between 512 an
17720 64 20 36 35 35 33 36 2e 20 20 49 66 20 74 68 65  d 65536.  If the
17730 20 70 61 67 65 0a 2a 2a 20 73 69 7a 65 20 73 75   page.** size su
17740 70 70 6c 69 65 64 20 64 6f 65 73 20 6e 6f 74 20  pplied does not 
17750 6d 65 65 74 20 74 68 69 73 20 63 6f 6e 73 74 72  meet this constr
17760 61 69 6e 74 20 74 68 65 6e 20 74 68 65 20 70 61  aint then the pa
17770 67 65 20 73 69 7a 65 20 69 73 20 6e 6f 74 0a 2a  ge size is not.*
17780 2a 20 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a  * changed..**.**
17790 20 50 61 67 65 20 73 69 7a 65 73 20 61 72 65 20   Page sizes are 
177a0 63 6f 6e 73 74 72 61 69 6e 65 64 20 74 6f 20 62  constrained to b
177b0 65 20 61 20 70 6f 77 65 72 20 6f 66 20 74 77 6f  e a power of two
177c0 20 73 6f 20 74 68 61 74 20 74 68 65 20 72 65 67   so that the reg
177d0 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 64 61  ion.** of the da
177e0 74 61 62 61 73 65 20 66 69 6c 65 20 75 73 65 64  tabase file used
177f0 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 20 28 62 65   for locking (be
17800 67 69 6e 6e 69 6e 67 20 61 74 20 50 45 4e 44 49  ginning at PENDI
17810 4e 47 5f 42 59 54 45 2c 0a 2a 2a 20 74 68 65 20  NG_BYTE,.** the 
17820 66 69 72 73 74 20 62 79 74 65 20 70 61 73 74 20  first byte past 
17830 74 68 65 20 31 47 42 20 62 6f 75 6e 64 61 72 79  the 1GB boundary
17840 2c 20 30 78 34 30 30 30 30 30 30 30 29 20 6e 65  , 0x40000000) ne
17850 65 64 73 20 74 6f 20 6f 63 63 75 72 0a 2a 2a 20  eds to occur.** 
17860 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  at the beginning
17870 20 6f 66 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a   of a page..**.*
17880 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72 20 6e  * If parameter n
17890 52 65 73 65 72 76 65 20 69 73 20 6c 65 73 73 20  Reserve is less 
178a0 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20  than zero, then 
178b0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65  the number of re
178c0 73 65 72 76 65 64 0a 2a 2a 20 62 79 74 65 73 20  served.** bytes 
178d0 70 65 72 20 70 61 67 65 20 69 73 20 6c 65 66 74  per page is left
178e0 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a   unchanged..**.*
178f0 2a 20 49 66 20 74 68 65 20 69 46 69 78 21 3d 30  * If the iFix!=0
17900 20 74 68 65 6e 20 74 68 65 20 42 54 53 5f 50 41   then the BTS_PA
17910 47 45 53 49 5a 45 5f 46 49 58 45 44 20 66 6c 61  GESIZE_FIXED fla
17920 67 20 69 73 20 73 65 74 20 73 6f 20 74 68 61 74  g is set so that
17930 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 0a 2a   the page size.*
17940 2a 20 61 6e 64 20 61 75 74 6f 76 61 63 75 75 6d  * and autovacuum
17950 20 6d 6f 64 65 20 63 61 6e 20 6e 6f 20 6c 6f 6e   mode can no lon
17960 67 65 72 20 62 65 20 63 68 61 6e 67 65 64 2e 0a  ger be changed..
17970 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
17980 72 65 65 53 65 74 50 61 67 65 53 69 7a 65 28 42  reeSetPageSize(B
17990 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 70 61 67  tree *p, int pag
179a0 65 53 69 7a 65 2c 20 69 6e 74 20 6e 52 65 73 65  eSize, int nRese
179b0 72 76 65 2c 20 69 6e 74 20 69 46 69 78 29 7b 0a  rve, int iFix){.
179c0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
179d0 45 5f 4f 4b 3b 0a 20 20 42 74 53 68 61 72 65 64  E_OK;.  BtShared
179e0 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
179f0 20 20 61 73 73 65 72 74 28 20 6e 52 65 73 65 72    assert( nReser
17a00 76 65 3e 3d 2d 31 20 26 26 20 6e 52 65 73 65 72  ve>=-1 && nReser
17a10 76 65 3c 3d 32 35 35 20 29 3b 0a 20 20 73 71 6c  ve<=255 );.  sql
17a20 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
17a30 29 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 48 41  );.#if SQLITE_HA
17a40 53 5f 43 4f 44 45 43 0a 20 20 69 66 28 20 6e 52  S_CODEC.  if( nR
17a50 65 73 65 72 76 65 3e 70 42 74 2d 3e 6f 70 74 69  eserve>pBt->opti
17a60 6d 61 6c 52 65 73 65 72 76 65 20 29 20 70 42 74  malReserve ) pBt
17a70 2d 3e 6f 70 74 69 6d 61 6c 52 65 73 65 72 76 65  ->optimalReserve
17a80 20 3d 20 28 75 38 29 6e 52 65 73 65 72 76 65 3b   = (u8)nReserve;
17a90 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 42  .#endif.  if( pB
17aa0 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54  t->btsFlags & BT
17ab0 53 5f 50 41 47 45 53 49 5a 45 5f 46 49 58 45 44  S_PAGESIZE_FIXED
17ac0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42   ){.    sqlite3B
17ad0 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
17ae0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
17af0 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d 0a 20 20  READONLY;.  }.  
17b00 69 66 28 20 6e 52 65 73 65 72 76 65 3c 30 20 29  if( nReserve<0 )
17b10 7b 0a 20 20 20 20 6e 52 65 73 65 72 76 65 20 3d  {.    nReserve =
17b20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d   pBt->pageSize -
17b30 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
17b40 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
17b50 6e 52 65 73 65 72 76 65 3e 3d 30 20 26 26 20 6e  nReserve>=0 && n
17b60 52 65 73 65 72 76 65 3c 3d 32 35 35 20 29 3b 0a  Reserve<=255 );.
17b70 20 20 69 66 28 20 70 61 67 65 53 69 7a 65 3e 3d    if( pageSize>=
17b80 35 31 32 20 26 26 20 70 61 67 65 53 69 7a 65 3c  512 && pageSize<
17b90 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45  =SQLITE_MAX_PAGE
17ba0 5f 53 49 5a 45 20 26 26 0a 20 20 20 20 20 20 20  _SIZE &&.       
17bb0 20 28 28 70 61 67 65 53 69 7a 65 2d 31 29 26 70   ((pageSize-1)&p
17bc0 61 67 65 53 69 7a 65 29 3d 3d 30 20 29 7b 0a 20  ageSize)==0 ){. 
17bd0 20 20 20 61 73 73 65 72 74 28 20 28 70 61 67 65     assert( (page
17be0 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 0a  Size & 7)==0 );.
17bf0 20 20 20 20 61 73 73 65 72 74 28 20 21 70 42 74      assert( !pBt
17c00 2d 3e 70 43 75 72 73 6f 72 20 29 3b 0a 20 20 20  ->pCursor );.   
17c10 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d   pBt->pageSize =
17c20 20 28 75 33 32 29 70 61 67 65 53 69 7a 65 3b 0a   (u32)pageSize;.
17c30 20 20 20 20 66 72 65 65 54 65 6d 70 53 70 61 63      freeTempSpac
17c40 65 28 70 42 74 29 3b 0a 20 20 7d 0a 20 20 72 63  e(pBt);.  }.  rc
17c50 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53   = sqlite3PagerS
17c60 65 74 50 61 67 65 73 69 7a 65 28 70 42 74 2d 3e  etPagesize(pBt->
17c70 70 50 61 67 65 72 2c 20 26 70 42 74 2d 3e 70 61  pPager, &pBt->pa
17c80 67 65 53 69 7a 65 2c 20 6e 52 65 73 65 72 76 65  geSize, nReserve
17c90 29 3b 0a 20 20 70 42 74 2d 3e 75 73 61 62 6c 65  );.  pBt->usable
17ca0 53 69 7a 65 20 3d 20 70 42 74 2d 3e 70 61 67 65  Size = pBt->page
17cb0 53 69 7a 65 20 2d 20 28 75 31 36 29 6e 52 65 73  Size - (u16)nRes
17cc0 65 72 76 65 3b 0a 20 20 69 66 28 20 69 46 69 78  erve;.  if( iFix
17cd0 20 29 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73   ) pBt->btsFlags
17ce0 20 7c 3d 20 42 54 53 5f 50 41 47 45 53 49 5a 45   |= BTS_PAGESIZE
17cf0 5f 46 49 58 45 44 3b 0a 20 20 73 71 6c 69 74 65  _FIXED;.  sqlite
17d00 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
17d10 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
17d20 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
17d30 20 63 75 72 72 65 6e 74 6c 79 20 64 65 66 69 6e   currently defin
17d40 65 64 20 70 61 67 65 20 73 69 7a 65 0a 2a 2f 0a  ed page size.*/.
17d50 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
17d60 47 65 74 50 61 67 65 53 69 7a 65 28 42 74 72 65  GetPageSize(Btre
17d70 65 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20  e *p){.  return 
17d80 70 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  p->pBt->pageSize
17d90 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
17da0 66 75 6e 63 74 69 6f 6e 20 69 73 20 73 69 6d 69  function is simi
17db0 6c 61 72 20 74 6f 20 73 71 6c 69 74 65 33 42 74  lar to sqlite3Bt
17dc0 72 65 65 47 65 74 52 65 73 65 72 76 65 28 29 2c  reeGetReserve(),
17dd0 20 65 78 63 65 70 74 20 74 68 61 74 20 69 74 0a   except that it.
17de0 2a 2a 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 63  ** may only be c
17df0 61 6c 6c 65 64 20 69 66 20 69 74 20 69 73 20 67  alled if it is g
17e00 75 61 72 61 6e 74 65 65 64 20 74 68 61 74 20 74  uaranteed that t
17e10 68 65 20 62 2d 74 72 65 65 20 6d 75 74 65 78 20  he b-tree mutex 
17e20 69 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20 68 65  is already.** he
17e30 6c 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  ld..**.** This i
17e40 73 20 75 73 65 66 75 6c 20 69 6e 20 6f 6e 65 20  s useful in one 
17e50 73 70 65 63 69 61 6c 20 63 61 73 65 20 69 6e 20  special case in 
17e60 74 68 65 20 62 61 63 6b 75 70 20 41 50 49 20 63  the backup API c
17e70 6f 64 65 20 77 68 65 72 65 20 69 74 20 69 73 0a  ode where it is.
17e80 2a 2a 20 6b 6e 6f 77 6e 20 74 68 61 74 20 74 68  ** known that th
17e90 65 20 73 68 61 72 65 64 20 62 2d 74 72 65 65 20  e shared b-tree 
17ea0 6d 75 74 65 78 20 69 73 20 68 65 6c 64 2c 20 62  mutex is held, b
17eb0 75 74 20 74 68 65 20 6d 75 74 65 78 20 6f 6e 20  ut the mutex on 
17ec0 74 68 65 20 0a 2a 2a 20 64 61 74 61 62 61 73 65  the .** database
17ed0 20 68 61 6e 64 6c 65 20 74 68 61 74 20 6f 77 6e   handle that own
17ee0 73 20 2a 70 20 69 73 20 6e 6f 74 2e 20 49 6e 20  s *p is not. In 
17ef0 74 68 69 73 20 63 61 73 65 20 69 66 20 73 71 6c  this case if sql
17f00 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 29  ite3BtreeEnter()
17f10 0a 2a 2a 20 77 65 72 65 20 74 6f 20 62 65 20 63  .** were to be c
17f20 61 6c 6c 65 64 2c 20 69 74 20 6d 69 67 68 74 20  alled, it might 
17f30 63 6f 6c 6c 69 64 65 20 77 69 74 68 20 73 6f 6d  collide with som
17f40 65 20 6f 74 68 65 72 20 6f 70 65 72 61 74 69 6f  e other operatio
17f50 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 64 61 74 61  n on the.** data
17f60 62 61 73 65 20 68 61 6e 64 6c 65 20 74 68 61 74  base handle that
17f70 20 6f 77 6e 73 20 2a 70 2c 20 63 61 75 73 69 6e   owns *p, causin
17f80 67 20 75 6e 64 65 66 69 6e 65 64 20 62 65 68 61  g undefined beha
17f90 76 69 6f 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  vior..*/.int sql
17fa0 69 74 65 33 42 74 72 65 65 47 65 74 52 65 73 65  ite3BtreeGetRese
17fb0 72 76 65 4e 6f 4d 75 74 65 78 28 42 74 72 65 65  rveNoMutex(Btree
17fc0 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20   *p){.  int n;. 
17fd0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
17fe0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 70  _mutex_held(p->p
17ff0 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
18000 6e 20 3d 20 70 2d 3e 70 42 74 2d 3e 70 61 67 65  n = p->pBt->page
18010 53 69 7a 65 20 2d 20 70 2d 3e 70 42 74 2d 3e 75  Size - p->pBt->u
18020 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 72 65 74  sableSize;.  ret
18030 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn n;.}../*.** 
18040 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
18050 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73 70  r of bytes of sp
18060 61 63 65 20 61 74 20 74 68 65 20 65 6e 64 20 6f  ace at the end o
18070 66 20 65 76 65 72 79 20 70 61 67 65 20 74 68 61  f every page tha
18080 74 0a 2a 2a 20 61 72 65 20 69 6e 74 65 6e 74 75  t.** are intentu
18090 61 6c 6c 79 20 6c 65 66 74 20 75 6e 75 73 65 64  ally left unused
180a0 2e 20 20 54 68 69 73 20 69 73 20 74 68 65 20 22  .  This is the "
180b0 72 65 73 65 72 76 65 64 22 20 73 70 61 63 65 20  reserved" space 
180c0 74 68 61 74 20 69 73 0a 2a 2a 20 73 6f 6d 65 74  that is.** somet
180d0 69 6d 65 73 20 75 73 65 64 20 62 79 20 65 78 74  imes used by ext
180e0 65 6e 73 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 49  ensions..**.** I
180f0 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 4d 55 54  f SQLITE_HAS_MUT
18100 45 58 20 69 73 20 64 65 66 69 6e 65 64 20 74 68  EX is defined th
18110 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 72 65  en the number re
18120 74 75 72 6e 65 64 20 69 73 20 74 68 65 0a 2a 2a  turned is the.**
18130 20 67 72 65 61 74 65 72 20 6f 66 20 74 68 65 20   greater of the 
18140 63 75 72 72 65 6e 74 20 72 65 73 65 72 76 65 64  current reserved
18150 20 73 70 61 63 65 20 61 6e 64 20 74 68 65 20 6d   space and the m
18160 61 78 69 6d 75 6d 20 72 65 71 75 65 73 74 65 64  aximum requested
18170 0a 2a 2a 20 72 65 73 65 72 76 65 20 73 70 61 63  .** reserve spac
18180 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
18190 33 42 74 72 65 65 47 65 74 4f 70 74 69 6d 61 6c  3BtreeGetOptimal
181a0 52 65 73 65 72 76 65 28 42 74 72 65 65 20 2a 70  Reserve(Btree *p
181b0 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71  ){.  int n;.  sq
181c0 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
181d0 70 29 3b 0a 20 20 6e 20 3d 20 73 71 6c 69 74 65  p);.  n = sqlite
181e0 33 42 74 72 65 65 47 65 74 52 65 73 65 72 76 65  3BtreeGetReserve
181f0 4e 6f 4d 75 74 65 78 28 70 29 3b 0a 23 69 66 64  NoMutex(p);.#ifd
18200 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f  ef SQLITE_HAS_CO
18210 44 45 43 0a 20 20 69 66 28 20 6e 3c 70 2d 3e 70  DEC.  if( n<p->p
18220 42 74 2d 3e 6f 70 74 69 6d 61 6c 52 65 73 65 72  Bt->optimalReser
18230 76 65 20 29 20 6e 20 3d 20 70 2d 3e 70 42 74 2d  ve ) n = p->pBt-
18240 3e 6f 70 74 69 6d 61 6c 52 65 73 65 72 76 65 3b  >optimalReserve;
18250 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65  .#endif.  sqlite
18260 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
18270 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 0a    return n;.}...
18280 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 6d 61  /*.** Set the ma
18290 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74  ximum page count
182a0 20 66 6f 72 20 61 20 64 61 74 61 62 61 73 65 20   for a database 
182b0 69 66 20 6d 78 50 61 67 65 20 69 73 20 70 6f 73  if mxPage is pos
182c0 69 74 69 76 65 2e 0a 2a 2a 20 4e 6f 20 63 68 61  itive..** No cha
182d0 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20 69 66  nges are made if
182e0 20 6d 78 50 61 67 65 20 69 73 20 30 20 6f 72 20   mxPage is 0 or 
182f0 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 20 52 65 67  negative..** Reg
18300 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20 76  ardless of the v
18310 61 6c 75 65 20 6f 66 20 6d 78 50 61 67 65 2c 20  alue of mxPage, 
18320 72 65 74 75 72 6e 20 74 68 65 20 6d 61 78 69 6d  return the maxim
18330 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a  um page count..*
18340 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
18350 65 65 4d 61 78 50 61 67 65 43 6f 75 6e 74 28 42  eeMaxPageCount(B
18360 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6d 78 50  tree *p, int mxP
18370 61 67 65 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20  age){.  int n;. 
18380 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
18390 65 72 28 70 29 3b 0a 20 20 6e 20 3d 20 73 71 6c  er(p);.  n = sql
183a0 69 74 65 33 50 61 67 65 72 4d 61 78 50 61 67 65  ite3PagerMaxPage
183b0 43 6f 75 6e 74 28 70 2d 3e 70 42 74 2d 3e 70 50  Count(p->pBt->pP
183c0 61 67 65 72 2c 20 6d 78 50 61 67 65 29 3b 0a 20  ager, mxPage);. 
183d0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
183e0 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
183f0 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  n;.}../*.** Chan
18400 67 65 20 74 68 65 20 76 61 6c 75 65 73 20 66 6f  ge the values fo
18410 72 20 74 68 65 20 42 54 53 5f 53 45 43 55 52 45  r the BTS_SECURE
18420 5f 44 45 4c 45 54 45 20 61 6e 64 20 42 54 53 5f  _DELETE and BTS_
18430 4f 56 45 52 57 52 49 54 45 20 66 6c 61 67 73 3a  OVERWRITE flags:
18440 0a 2a 2a 0a 2a 2a 20 20 20 20 6e 65 77 46 6c 61  .**.**    newFla
18450 67 3d 3d 30 20 20 20 20 20 20 20 42 6f 74 68 20  g==0       Both 
18460 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54  BTS_SECURE_DELET
18470 45 20 61 6e 64 20 42 54 53 5f 4f 56 45 52 57 52  E and BTS_OVERWR
18480 49 54 45 20 61 72 65 20 63 6c 65 61 72 65 64 0a  ITE are cleared.
18490 2a 2a 20 20 20 20 6e 65 77 46 6c 61 67 3d 3d 31  **    newFlag==1
184a0 20 20 20 20 20 20 20 42 54 53 5f 53 45 43 55 52         BTS_SECUR
184b0 45 5f 44 45 4c 45 54 45 20 73 65 74 20 61 6e 64  E_DELETE set and
184c0 20 42 54 53 5f 4f 56 45 52 57 52 49 54 45 20 69   BTS_OVERWRITE i
184d0 73 20 63 6c 65 61 72 65 64 0a 2a 2a 20 20 20 20  s cleared.**    
184e0 6e 65 77 46 6c 61 67 3d 3d 32 20 20 20 20 20 20  newFlag==2      
184f0 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45   BTS_SECURE_DELE
18500 54 45 20 63 6c 65 61 72 65 64 20 61 6e 64 20 42  TE cleared and B
18510 54 53 5f 4f 56 45 52 57 52 49 54 45 20 69 73 20  TS_OVERWRITE is 
18520 73 65 74 0a 2a 2a 20 20 20 20 6e 65 77 46 6c 61  set.**    newFla
18530 67 3d 3d 28 2d 31 29 20 20 20 20 4e 6f 20 63 68  g==(-1)    No ch
18540 61 6e 67 65 73 0a 2a 2a 0a 2a 2a 20 54 68 69 73  anges.**.** This
18550 20 72 6f 75 74 69 6e 65 20 61 63 74 73 20 61 73   routine acts as
18560 20 61 20 71 75 65 72 79 20 69 66 20 6e 65 77 46   a query if newF
18570 6c 61 67 20 69 73 20 6c 65 73 73 20 74 68 61 6e  lag is less than
18580 20 7a 65 72 6f 0a 2a 2a 0a 2a 2a 20 57 69 74 68   zero.**.** With
18590 20 42 54 53 5f 4f 56 45 52 57 52 49 54 45 20 73   BTS_OVERWRITE s
185a0 65 74 2c 20 64 65 6c 65 74 65 64 20 63 6f 6e 74  et, deleted cont
185b0 65 6e 74 20 69 73 20 6f 76 65 72 77 72 69 74 74  ent is overwritt
185c0 65 6e 20 62 79 20 7a 65 72 6f 73 2c 20 62 75 74  en by zeros, but
185d0 0a 2a 2a 20 66 72 65 65 6c 69 73 74 20 6c 65 61  .** freelist lea
185e0 66 20 70 61 67 65 73 20 61 72 65 20 6e 6f 74 20  f pages are not 
185f0 77 72 69 74 74 65 6e 20 62 61 63 6b 20 74 6f 20  written back to 
18600 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 54  the database.  T
18610 68 75 73 20 69 6e 2d 70 61 67 65 0a 2a 2a 20 64  hus in-page.** d
18620 65 6c 65 74 65 64 20 63 6f 6e 74 65 6e 74 20 69  eleted content i
18630 73 20 63 6c 65 61 72 65 64 2c 20 62 75 74 20 66  s cleared, but f
18640 72 65 65 6c 69 73 74 20 64 65 6c 65 74 65 64 20  reelist deleted 
18650 63 6f 6e 74 65 6e 74 20 69 73 20 6e 6f 74 2e 0a  content is not..
18660 2a 2a 0a 2a 2a 20 57 69 74 68 20 42 54 53 5f 53  **.** With BTS_S
18670 45 43 55 52 45 5f 44 45 4c 45 54 45 2c 20 6f 70  ECURE_DELETE, op
18680 65 72 61 74 69 6f 6e 20 69 73 20 6c 69 6b 65 20  eration is like 
18690 42 54 53 5f 4f 56 45 52 57 52 49 54 45 20 77 69  BTS_OVERWRITE wi
186a0 74 68 20 74 68 65 20 61 64 64 69 74 69 6f 6e 0a  th the addition.
186b0 2a 2a 20 74 68 61 74 20 66 72 65 65 6c 69 73 74  ** that freelist
186c0 20 6c 65 61 66 20 70 61 67 65 73 20 61 72 65 20   leaf pages are 
186d0 77 72 69 74 74 65 6e 20 62 61 63 6b 20 69 6e 74  written back int
186e0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20  o the database, 
186f0 69 6e 63 72 65 61 73 69 6e 67 0a 2a 2a 20 74 68  increasing.** th
18700 65 20 61 6d 6f 75 6e 74 20 6f 66 20 64 69 73 6b  e amount of disk
18710 20 49 2f 4f 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c   I/O..*/.int sql
18720 69 74 65 33 42 74 72 65 65 53 65 63 75 72 65 44  ite3BtreeSecureD
18730 65 6c 65 74 65 28 42 74 72 65 65 20 2a 70 2c 20  elete(Btree *p, 
18740 69 6e 74 20 6e 65 77 46 6c 61 67 29 7b 0a 20 20  int newFlag){.  
18750 69 6e 74 20 62 3b 0a 20 20 69 66 28 20 70 3d 3d  int b;.  if( p==
18760 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
18770 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
18780 72 28 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r(p);.  assert( 
18790 42 54 53 5f 4f 56 45 52 57 52 49 54 45 3d 3d 42  BTS_OVERWRITE==B
187a0 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45  TS_SECURE_DELETE
187b0 2a 32 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  *2 );.  assert( 
187c0 42 54 53 5f 46 41 53 54 5f 53 45 43 55 52 45 3d  BTS_FAST_SECURE=
187d0 3d 28 42 54 53 5f 4f 56 45 52 57 52 49 54 45 7c  =(BTS_OVERWRITE|
187e0 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54  BTS_SECURE_DELET
187f0 45 29 20 29 3b 0a 20 20 69 66 28 20 6e 65 77 46  E) );.  if( newF
18800 6c 61 67 3e 3d 30 20 29 7b 0a 20 20 20 20 70 2d  lag>=0 ){.    p-
18810 3e 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26  >pBt->btsFlags &
18820 3d 20 7e 42 54 53 5f 46 41 53 54 5f 53 45 43 55  = ~BTS_FAST_SECU
18830 52 45 3b 0a 20 20 20 20 70 2d 3e 70 42 74 2d 3e  RE;.    p->pBt->
18840 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f  btsFlags |= BTS_
18850 53 45 43 55 52 45 5f 44 45 4c 45 54 45 2a 6e 65  SECURE_DELETE*ne
18860 77 46 6c 61 67 3b 0a 20 20 7d 0a 20 20 62 20 3d  wFlag;.  }.  b =
18870 20 28 70 2d 3e 70 42 74 2d 3e 62 74 73 46 6c 61   (p->pBt->btsFla
18880 67 73 20 26 20 42 54 53 5f 46 41 53 54 5f 53 45  gs & BTS_FAST_SE
18890 43 55 52 45 29 2f 42 54 53 5f 53 45 43 55 52 45  CURE)/BTS_SECURE
188a0 5f 44 45 4c 45 54 45 3b 0a 20 20 73 71 6c 69 74  _DELETE;.  sqlit
188b0 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
188c0 0a 20 20 72 65 74 75 72 6e 20 62 3b 0a 7d 0a 0a  .  return b;.}..
188d0 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
188e0 20 27 61 75 74 6f 2d 76 61 63 75 75 6d 27 20 70   'auto-vacuum' p
188f0 72 6f 70 65 72 74 79 20 6f 66 20 74 68 65 20 64  roperty of the d
18900 61 74 61 62 61 73 65 2e 20 49 66 20 74 68 65 20  atabase. If the 
18910 27 61 75 74 6f 56 61 63 75 75 6d 27 0a 2a 2a 20  'autoVacuum'.** 
18920 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 6e  parameter is non
18930 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61 75 74 6f  -zero, then auto
18940 2d 76 61 63 75 75 6d 20 6d 6f 64 65 20 69 73 20  -vacuum mode is 
18950 65 6e 61 62 6c 65 64 2e 20 49 66 20 7a 65 72 6f  enabled. If zero
18960 2c 20 69 74 0a 2a 2a 20 69 73 20 64 69 73 61 62  , it.** is disab
18970 6c 65 64 2e 20 54 68 65 20 64 65 66 61 75 6c 74  led. The default
18980 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 61   value for the a
18990 75 74 6f 2d 76 61 63 75 75 6d 20 70 72 6f 70 65  uto-vacuum prope
189a0 72 74 79 20 69 73 20 0a 2a 2a 20 64 65 74 65 72  rty is .** deter
189b0 6d 69 6e 65 64 20 62 79 20 74 68 65 20 53 51 4c  mined by the SQL
189c0 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f  ITE_DEFAULT_AUTO
189d0 56 41 43 55 55 4d 20 6d 61 63 72 6f 2e 0a 2a 2f  VACUUM macro..*/
189e0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
189f0 65 53 65 74 41 75 74 6f 56 61 63 75 75 6d 28 42  eSetAutoVacuum(B
18a00 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 61 75 74  tree *p, int aut
18a10 6f 56 61 63 75 75 6d 29 7b 0a 23 69 66 64 65 66  oVacuum){.#ifdef
18a20 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
18a30 4f 56 41 43 55 55 4d 0a 20 20 72 65 74 75 72 6e  OVACUUM.  return
18a40 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
18a50 3b 0a 23 65 6c 73 65 0a 20 20 42 74 53 68 61 72  ;.#else.  BtShar
18a60 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
18a70 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
18a80 49 54 45 5f 4f 4b 3b 0a 20 20 75 38 20 61 76 20  ITE_OK;.  u8 av 
18a90 3d 20 28 75 38 29 61 75 74 6f 56 61 63 75 75 6d  = (u8)autoVacuum
18aa0 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  ;..  sqlite3Btre
18ab0 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 69 66 28  eEnter(p);.  if(
18ac0 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20   (pBt->btsFlags 
18ad0 26 20 42 54 53 5f 50 41 47 45 53 49 5a 45 5f 46  & BTS_PAGESIZE_F
18ae0 49 58 45 44 29 21 3d 30 20 26 26 20 28 61 76 20  IXED)!=0 && (av 
18af0 3f 31 3a 30 29 21 3d 70 42 74 2d 3e 61 75 74 6f  ?1:0)!=pBt->auto
18b00 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 72 63  Vacuum ){.    rc
18b10 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e   = SQLITE_READON
18b20 4c 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  LY;.  }else{.   
18b30 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
18b40 20 3d 20 61 76 20 3f 31 3a 30 3b 0a 20 20 20 20   = av ?1:0;.    
18b50 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20  pBt->incrVacuum 
18b60 3d 20 61 76 3d 3d 32 20 3f 31 3a 30 3b 0a 20 20  = av==2 ?1:0;.  
18b70 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  }.  sqlite3Btree
18b80 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
18b90 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a  rn rc;.#endif.}.
18ba0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
18bb0 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 27  e value of the '
18bc0 61 75 74 6f 2d 76 61 63 75 75 6d 27 20 70 72 6f  auto-vacuum' pro
18bd0 70 65 72 74 79 2e 20 49 66 20 61 75 74 6f 2d 76  perty. If auto-v
18be0 61 63 75 75 6d 20 69 73 20 0a 2a 2a 20 65 6e 61  acuum is .** ena
18bf0 62 6c 65 64 20 31 20 69 73 20 72 65 74 75 72 6e  bled 1 is return
18c00 65 64 2e 20 4f 74 68 65 72 77 69 73 65 20 30 2e  ed. Otherwise 0.
18c10 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
18c20 74 72 65 65 47 65 74 41 75 74 6f 56 61 63 75 75  treeGetAutoVacuu
18c30 6d 28 42 74 72 65 65 20 2a 70 29 7b 0a 23 69 66  m(Btree *p){.#if
18c40 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
18c50 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 72 65 74  AUTOVACUUM.  ret
18c60 75 72 6e 20 42 54 52 45 45 5f 41 55 54 4f 56 41  urn BTREE_AUTOVA
18c70 43 55 55 4d 5f 4e 4f 4e 45 3b 0a 23 65 6c 73 65  CUUM_NONE;.#else
18c80 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c  .  int rc;.  sql
18c90 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
18ca0 29 3b 0a 20 20 72 63 20 3d 20 28 0a 20 20 20 20  );.  rc = (.    
18cb0 28 21 70 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61  (!p->pBt->autoVa
18cc0 63 75 75 6d 29 3f 42 54 52 45 45 5f 41 55 54 4f  cuum)?BTREE_AUTO
18cd0 56 41 43 55 55 4d 5f 4e 4f 4e 45 3a 0a 20 20 20  VACUUM_NONE:.   
18ce0 20 28 21 70 2d 3e 70 42 74 2d 3e 69 6e 63 72 56   (!p->pBt->incrV
18cf0 61 63 75 75 6d 29 3f 42 54 52 45 45 5f 41 55 54  acuum)?BTREE_AUT
18d00 4f 56 41 43 55 55 4d 5f 46 55 4c 4c 3a 0a 20 20  OVACUUM_FULL:.  
18d10 20 20 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55    BTREE_AUTOVACU
18d20 55 4d 5f 49 4e 43 52 0a 20 20 29 3b 0a 20 20 73  UM_INCR.  );.  s
18d30 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
18d40 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
18d50 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  ;.#endif.}../*.*
18d60 2a 20 49 66 20 74 68 65 20 75 73 65 72 20 68 61  * If the user ha
18d70 73 20 6e 6f 74 20 73 65 74 20 74 68 65 20 73 61  s not set the sa
18d80 66 65 74 79 2d 6c 65 76 65 6c 20 66 6f 72 20 74  fety-level for t
18d90 68 69 73 20 64 61 74 61 62 61 73 65 20 63 6f 6e  his database con
18da0 6e 65 63 74 69 6f 6e 0a 2a 2a 20 75 73 69 6e 67  nection.** using
18db0 20 22 50 52 41 47 4d 41 20 73 79 6e 63 68 72 6f   "PRAGMA synchro
18dc0 6e 6f 75 73 22 2c 20 61 6e 64 20 69 66 20 74 68  nous", and if th
18dd0 65 20 73 61 66 65 74 79 2d 6c 65 76 65 6c 20 69  e safety-level i
18de0 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 0a 2a 2a  s not already.**
18df0 20 73 65 74 20 74 6f 20 74 68 65 20 76 61 6c 75   set to the valu
18e00 65 20 70 61 73 73 65 64 20 74 6f 20 74 68 69 73  e passed to this
18e10 20 66 75 6e 63 74 69 6f 6e 20 61 73 20 74 68 65   function as the
18e20 20 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65   second paramete
18e30 72 2c 0a 2a 2a 20 73 65 74 20 69 74 20 73 6f 2e  r,.** set it so.
18e40 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 44  .*/.#if SQLITE_D
18e50 45 46 41 55 4c 54 5f 53 59 4e 43 48 52 4f 4e 4f  EFAULT_SYNCHRONO
18e60 55 53 21 3d 53 51 4c 49 54 45 5f 44 45 46 41 55  US!=SQLITE_DEFAU
18e70 4c 54 5f 57 41 4c 5f 53 59 4e 43 48 52 4f 4e 4f  LT_WAL_SYNCHRONO
18e80 55 53 20 5c 0a 20 20 20 20 26 26 20 21 64 65 66  US \.    && !def
18e90 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
18ea0 5f 57 41 4c 29 0a 73 74 61 74 69 63 20 76 6f 69  _WAL).static voi
18eb0 64 20 73 65 74 44 65 66 61 75 6c 74 53 79 6e 63  d setDefaultSync
18ec0 46 6c 61 67 28 42 74 53 68 61 72 65 64 20 2a 70  Flag(BtShared *p
18ed0 42 74 2c 20 75 38 20 73 61 66 65 74 79 5f 6c 65  Bt, u8 safety_le
18ee0 76 65 6c 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  vel){.  sqlite3 
18ef0 2a 64 62 3b 0a 20 20 44 62 20 2a 70 44 62 3b 0a  *db;.  Db *pDb;.
18f00 20 20 69 66 28 20 28 64 62 3d 70 42 74 2d 3e 64    if( (db=pBt->d
18f10 62 29 21 3d 30 20 26 26 20 28 70 44 62 3d 64 62  b)!=0 && (pDb=db
18f20 2d 3e 61 44 62 29 21 3d 30 20 29 7b 0a 20 20 20  ->aDb)!=0 ){.   
18f30 20 77 68 69 6c 65 28 20 70 44 62 2d 3e 70 42 74   while( pDb->pBt
18f40 3d 3d 30 20 7c 7c 20 70 44 62 2d 3e 70 42 74 2d  ==0 || pDb->pBt-
18f50 3e 70 42 74 21 3d 70 42 74 20 29 7b 20 70 44 62  >pBt!=pBt ){ pDb
18f60 2b 2b 3b 20 7d 0a 20 20 20 20 69 66 28 20 70 44  ++; }.    if( pD
18f70 62 2d 3e 62 53 79 6e 63 53 65 74 3d 3d 30 20 0a  b->bSyncSet==0 .
18f80 20 20 20 20 20 26 26 20 70 44 62 2d 3e 73 61 66       && pDb->saf
18f90 65 74 79 5f 6c 65 76 65 6c 21 3d 73 61 66 65 74  ety_level!=safet
18fa0 79 5f 6c 65 76 65 6c 20 0a 20 20 20 20 20 26 26  y_level .     &&
18fb0 20 70 44 62 21 3d 26 64 62 2d 3e 61 44 62 5b 31   pDb!=&db->aDb[1
18fc0 5d 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  ] .    ){.      
18fd0 70 44 62 2d 3e 73 61 66 65 74 79 5f 6c 65 76 65  pDb->safety_leve
18fe0 6c 20 3d 20 73 61 66 65 74 79 5f 6c 65 76 65 6c  l = safety_level
18ff0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  ;.      sqlite3P
19000 61 67 65 72 53 65 74 46 6c 61 67 73 28 70 42 74  agerSetFlags(pBt
19010 2d 3e 70 50 61 67 65 72 2c 0a 20 20 20 20 20 20  ->pPager,.      
19020 20 20 20 20 70 44 62 2d 3e 73 61 66 65 74 79 5f      pDb->safety_
19030 6c 65 76 65 6c 20 7c 20 28 64 62 2d 3e 66 6c 61  level | (db->fla
19040 67 73 20 26 20 50 41 47 45 52 5f 46 4c 41 47 53  gs & PAGER_FLAGS
19050 5f 4d 41 53 4b 29 29 3b 0a 20 20 20 20 7d 0a 20  _MASK));.    }. 
19060 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66   }.}.#else.# def
19070 69 6e 65 20 73 65 74 44 65 66 61 75 6c 74 53 79  ine setDefaultSy
19080 6e 63 46 6c 61 67 28 70 42 74 2c 73 61 66 65 74  ncFlag(pBt,safet
19090 79 5f 6c 65 76 65 6c 29 0a 23 65 6e 64 69 66 0a  y_level).#endif.
190a0 0a 2f 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c  ./* Forward decl
190b0 61 72 61 74 69 6f 6e 20 2a 2f 0a 73 74 61 74 69  aration */.stati
190c0 63 20 69 6e 74 20 6e 65 77 44 61 74 61 62 61 73  c int newDatabas
190d0 65 28 42 74 53 68 61 72 65 64 2a 29 3b 0a 0a 0a  e(BtShared*);...
190e0 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 72 65 66 65  /*.** Get a refe
190f0 72 65 6e 63 65 20 74 6f 20 70 50 61 67 65 31 20  rence to pPage1 
19100 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
19110 66 69 6c 65 2e 20 20 54 68 69 73 20 77 69 6c 6c  file.  This will
19120 0a 2a 2a 20 61 6c 73 6f 20 61 63 71 75 69 72 65  .** also acquire
19130 20 61 20 72 65 61 64 6c 6f 63 6b 20 6f 6e 20 74   a readlock on t
19140 68 61 74 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  hat file..**.** 
19150 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
19160 75 72 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73  urned on success
19170 2e 20 20 49 66 20 74 68 65 20 66 69 6c 65 20 69  .  If the file i
19180 73 20 6e 6f 74 20 61 0a 2a 2a 20 77 65 6c 6c 2d  s not a.** well-
19190 66 6f 72 6d 65 64 20 64 61 74 61 62 61 73 65 20  formed database 
191a0 66 69 6c 65 2c 20 74 68 65 6e 20 53 51 4c 49 54  file, then SQLIT
191b0 45 5f 43 4f 52 52 55 50 54 20 69 73 20 72 65 74  E_CORRUPT is ret
191c0 75 72 6e 65 64 2e 0a 2a 2a 20 53 51 4c 49 54 45  urned..** SQLITE
191d0 5f 42 55 53 59 20 69 73 20 72 65 74 75 72 6e 65  _BUSY is returne
191e0 64 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73  d if the databas
191f0 65 20 69 73 20 6c 6f 63 6b 65 64 2e 20 20 53 51  e is locked.  SQ
19200 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 69 73  LITE_NOMEM.** is
19210 20 72 65 74 75 72 6e 65 64 20 69 66 20 77 65 20   returned if we 
19220 72 75 6e 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72  run out of memor
19230 79 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  y. .*/.static in
19240 74 20 6c 6f 63 6b 42 74 72 65 65 28 42 74 53 68  t lockBtree(BtSh
19250 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 6e  ared *pBt){.  in
19260 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
19270 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64     /* Result cod
19280 65 20 66 72 6f 6d 20 73 75 62 66 75 6e 63 74 69  e from subfuncti
19290 6f 6e 73 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  ons */.  MemPage
192a0 20 2a 70 50 61 67 65 31 3b 20 20 20 20 20 2f 2a   *pPage1;     /*
192b0 20 50 61 67 65 20 31 20 6f 66 20 74 68 65 20 64   Page 1 of the d
192c0 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
192d0 20 20 75 33 32 20 6e 50 61 67 65 3b 20 20 20 20    u32 nPage;    
192e0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
192f0 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
19300 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 75   database */.  u
19310 33 32 20 6e 50 61 67 65 46 69 6c 65 20 3d 20 30  32 nPageFile = 0
19320 3b 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66  ;   /* Number of
19330 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61   pages in the da
19340 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
19350 20 75 33 32 20 6e 50 61 67 65 48 65 61 64 65 72   u32 nPageHeader
19360 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20  ;     /* Number 
19370 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
19380 64 61 74 61 62 61 73 65 20 61 63 63 6f 72 64 69  database accordi
19390 6e 67 20 74 6f 20 68 64 72 20 2a 2f 0a 0a 20 20  ng to hdr */..  
193a0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
193b0 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
193c0 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
193d0 72 74 28 20 70 42 74 2d 3e 70 50 61 67 65 31 3d  rt( pBt->pPage1=
193e0 3d 30 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  =0 );.  rc = sql
193f0 69 74 65 33 50 61 67 65 72 53 68 61 72 65 64 4c  ite3PagerSharedL
19400 6f 63 6b 28 70 42 74 2d 3e 70 50 61 67 65 72 29  ock(pBt->pPager)
19410 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
19420 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
19430 63 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65 47  c;.  rc = btreeG
19440 65 74 50 61 67 65 28 70 42 74 2c 20 31 2c 20 26  etPage(pBt, 1, &
19450 70 50 61 67 65 31 2c 20 30 29 3b 0a 20 20 69 66  pPage1, 0);.  if
19460 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
19470 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
19480 2f 2a 20 44 6f 20 73 6f 6d 65 20 63 68 65 63 6b  /* Do some check
19490 69 6e 67 20 74 6f 20 68 65 6c 70 20 69 6e 73 75  ing to help insu
194a0 72 65 20 74 68 65 20 66 69 6c 65 20 77 65 20 6f  re the file we o
194b0 70 65 6e 65 64 20 72 65 61 6c 6c 79 20 69 73 0a  pened really is.
194c0 20 20 2a 2a 20 61 20 76 61 6c 69 64 20 64 61 74    ** a valid dat
194d0 61 62 61 73 65 20 66 69 6c 65 2e 20 0a 20 20 2a  abase file. .  *
194e0 2f 0a 20 20 6e 50 61 67 65 20 3d 20 6e 50 61 67  /.  nPage = nPag
194f0 65 48 65 61 64 65 72 20 3d 20 67 65 74 34 62 79  eHeader = get4by
19500 74 65 28 32 38 2b 28 75 38 2a 29 70 50 61 67 65  te(28+(u8*)pPage
19510 31 2d 3e 61 44 61 74 61 29 3b 0a 20 20 73 71 6c  1->aData);.  sql
19520 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75  ite3PagerPagecou
19530 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  nt(pBt->pPager, 
19540 28 69 6e 74 2a 29 26 6e 50 61 67 65 46 69 6c 65  (int*)&nPageFile
19550 29 3b 0a 20 20 69 66 28 20 6e 50 61 67 65 3d 3d  );.  if( nPage==
19560 30 20 7c 7c 20 6d 65 6d 63 6d 70 28 32 34 2b 28  0 || memcmp(24+(
19570 75 38 2a 29 70 50 61 67 65 31 2d 3e 61 44 61 74  u8*)pPage1->aDat
19580 61 2c 20 39 32 2b 28 75 38 2a 29 70 50 61 67 65  a, 92+(u8*)pPage
19590 31 2d 3e 61 44 61 74 61 2c 34 29 21 3d 30 20 29  1->aData,4)!=0 )
195a0 7b 0a 20 20 20 20 6e 50 61 67 65 20 3d 20 6e 50  {.    nPage = nP
195b0 61 67 65 46 69 6c 65 3b 0a 20 20 7d 0a 20 20 69  ageFile;.  }.  i
195c0 66 28 20 28 70 42 74 2d 3e 64 62 2d 3e 66 6c 61  f( (pBt->db->fla
195d0 67 73 20 26 20 53 51 4c 49 54 45 5f 52 65 73 65  gs & SQLITE_Rese
195e0 74 44 61 74 61 62 61 73 65 29 21 3d 30 20 29 7b  tDatabase)!=0 ){
195f0 0a 20 20 20 20 6e 50 61 67 65 20 3d 20 30 3b 0a  .    nPage = 0;.
19600 20 20 7d 0a 20 20 69 66 28 20 6e 50 61 67 65 3e    }.  if( nPage>
19610 30 20 29 7b 0a 20 20 20 20 75 33 32 20 70 61 67  0 ){.    u32 pag
19620 65 53 69 7a 65 3b 0a 20 20 20 20 75 33 32 20 75  eSize;.    u32 u
19630 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 20 20 75  sableSize;.    u
19640 38 20 2a 70 61 67 65 31 20 3d 20 70 50 61 67 65  8 *page1 = pPage
19650 31 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 72 63  1->aData;.    rc
19660 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42   = SQLITE_NOTADB
19670 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43  ;.    /* EVIDENC
19680 45 2d 4f 46 3a 20 52 2d 34 33 37 33 37 2d 33 39  E-OF: R-43737-39
19690 39 39 39 20 45 76 65 72 79 20 76 61 6c 69 64 20  999 Every valid 
196a0 53 51 4c 69 74 65 20 64 61 74 61 62 61 73 65 20  SQLite database 
196b0 66 69 6c 65 20 62 65 67 69 6e 73 0a 20 20 20 20  file begins.    
196c0 2a 2a 20 77 69 74 68 20 74 68 65 20 66 6f 6c 6c  ** with the foll
196d0 6f 77 69 6e 67 20 31 36 20 62 79 74 65 73 20 28  owing 16 bytes (
196e0 69 6e 20 68 65 78 29 3a 20 35 33 20 35 31 20 34  in hex): 53 51 4
196f0 63 20 36 39 20 37 34 20 36 35 20 32 30 20 36 36  c 69 74 65 20 66
19700 20 36 66 20 37 32 20 36 64 0a 20 20 20 20 2a 2a   6f 72 6d.    **
19710 20 36 31 20 37 34 20 32 30 20 33 33 20 30 30 2e   61 74 20 33 00.
19720 20 2a 2f 0a 20 20 20 20 69 66 28 20 6d 65 6d 63   */.    if( memc
19730 6d 70 28 70 61 67 65 31 2c 20 7a 4d 61 67 69 63  mp(page1, zMagic
19740 48 65 61 64 65 72 2c 20 31 36 29 21 3d 30 20 29  Header, 16)!=0 )
19750 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67  {.      goto pag
19760 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a  e1_init_failed;.
19770 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51      }..#ifdef SQ
19780 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20  LITE_OMIT_WAL.  
19790 20 20 69 66 28 20 70 61 67 65 31 5b 31 38 5d 3e    if( page1[18]>
197a0 31 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e  1 ){.      pBt->
197b0 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f  btsFlags |= BTS_
197c0 52 45 41 44 5f 4f 4e 4c 59 3b 0a 20 20 20 20 7d  READ_ONLY;.    }
197d0 0a 20 20 20 20 69 66 28 20 70 61 67 65 31 5b 31  .    if( page1[1
197e0 39 5d 3e 31 20 29 7b 0a 20 20 20 20 20 20 67 6f  9]>1 ){.      go
197f0 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61  to page1_init_fa
19800 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 23 65 6c 73  iled;.    }.#els
19810 65 0a 20 20 20 20 69 66 28 20 70 61 67 65 31 5b  e.    if( page1[
19820 31 38 5d 3e 32 20 29 7b 0a 20 20 20 20 20 20 70  18]>2 ){.      p
19830 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20  Bt->btsFlags |= 
19840 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 3b 0a 20  BTS_READ_ONLY;. 
19850 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 61 67     }.    if( pag
19860 65 31 5b 31 39 5d 3e 32 20 29 7b 0a 20 20 20 20  e1[19]>2 ){.    
19870 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69    goto page1_ini
19880 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a  t_failed;.    }.
19890 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 77  .    /* If the w
198a0 72 69 74 65 20 76 65 72 73 69 6f 6e 20 69 73 20  rite version is 
198b0 73 65 74 20 74 6f 20 32 2c 20 74 68 69 73 20 64  set to 2, this d
198c0 61 74 61 62 61 73 65 20 73 68 6f 75 6c 64 20 62  atabase should b
198d0 65 20 61 63 63 65 73 73 65 64 0a 20 20 20 20 2a  e accessed.    *
198e0 2a 20 69 6e 20 57 41 4c 20 6d 6f 64 65 2e 20 49  * in WAL mode. I
198f0 66 20 74 68 65 20 6c 6f 67 20 69 73 20 6e 6f 74  f the log is not
19900 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 2c 20 6f   already open, o
19910 70 65 6e 20 69 74 20 6e 6f 77 2e 20 54 68 65 6e  pen it now. Then
19920 20 0a 20 20 20 20 2a 2a 20 72 65 74 75 72 6e 20   .    ** return 
19930 53 51 4c 49 54 45 5f 4f 4b 20 61 6e 64 20 72 65  SQLITE_OK and re
19940 74 75 72 6e 20 77 69 74 68 6f 75 74 20 70 6f 70  turn without pop
19950 75 6c 61 74 69 6e 67 20 42 74 53 68 61 72 65 64  ulating BtShared
19960 2e 70 50 61 67 65 31 2e 0a 20 20 20 20 2a 2a 20  .pPage1..    ** 
19970 54 68 65 20 63 61 6c 6c 65 72 20 64 65 74 65 63  The caller detec
19980 74 73 20 74 68 69 73 20 61 6e 64 20 63 61 6c 6c  ts this and call
19990 73 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  s this function 
199a0 61 67 61 69 6e 2e 20 54 68 69 73 20 69 73 0a 20  again. This is. 
199b0 20 20 20 2a 2a 20 72 65 71 75 69 72 65 64 20 61     ** required a
199c0 73 20 74 68 65 20 76 65 72 73 69 6f 6e 20 6f 66  s the version of
199d0 20 70 61 67 65 20 31 20 63 75 72 72 65 6e 74 6c   page 1 currentl
199e0 79 20 69 6e 20 74 68 65 20 70 61 67 65 31 20 62  y in the page1 b
199f0 75 66 66 65 72 0a 20 20 20 20 2a 2a 20 6d 61 79  uffer.    ** may
19a00 20 6e 6f 74 20 62 65 20 74 68 65 20 6c 61 74 65   not be the late
19a10 73 74 20 76 65 72 73 69 6f 6e 20 2d 20 74 68 65  st version - the
19a20 72 65 20 6d 61 79 20 62 65 20 61 20 6e 65 77 65  re may be a newe
19a30 72 20 6f 6e 65 20 69 6e 20 74 68 65 20 6c 6f 67  r one in the log
19a40 0a 20 20 20 20 2a 2a 20 66 69 6c 65 2e 0a 20 20  .    ** file..  
19a50 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 61 67    */.    if( pag
19a60 65 31 5b 31 39 5d 3d 3d 32 20 26 26 20 28 70 42  e1[19]==2 && (pB
19a70 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54  t->btsFlags & BT
19a80 53 5f 4e 4f 5f 57 41 4c 29 3d 3d 30 20 29 7b 0a  S_NO_WAL)==0 ){.
19a90 20 20 20 20 20 20 69 6e 74 20 69 73 4f 70 65 6e        int isOpen
19aa0 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d   = 0;.      rc =
19ab0 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65   sqlite3PagerOpe
19ac0 6e 57 61 6c 28 70 42 74 2d 3e 70 50 61 67 65 72  nWal(pBt->pPager
19ad0 2c 20 26 69 73 4f 70 65 6e 29 3b 0a 20 20 20 20  , &isOpen);.    
19ae0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
19af0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67  _OK ){.        g
19b00 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66  oto page1_init_f
19b10 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d 65 6c  ailed;.      }el
19b20 73 65 7b 0a 20 20 20 20 20 20 20 20 73 65 74 44  se{.        setD
19b30 65 66 61 75 6c 74 53 79 6e 63 46 6c 61 67 28 70  efaultSyncFlag(p
19b40 42 74 2c 20 53 51 4c 49 54 45 5f 44 45 46 41 55  Bt, SQLITE_DEFAU
19b50 4c 54 5f 57 41 4c 5f 53 59 4e 43 48 52 4f 4e 4f  LT_WAL_SYNCHRONO
19b60 55 53 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 69  US+1);.        i
19b70 66 28 20 69 73 4f 70 65 6e 3d 3d 30 20 29 7b 0a  f( isOpen==0 ){.
19b80 20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61 73            releas
19b90 65 50 61 67 65 4f 6e 65 28 70 50 61 67 65 31 29  ePageOne(pPage1)
19ba0 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
19bb0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
19bc0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
19bd0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
19be0 45 5f 4e 4f 54 41 44 42 3b 0a 20 20 20 20 7d 65  E_NOTADB;.    }e
19bf0 6c 73 65 7b 0a 20 20 20 20 20 20 73 65 74 44 65  lse{.      setDe
19c00 66 61 75 6c 74 53 79 6e 63 46 6c 61 67 28 70 42  faultSyncFlag(pB
19c10 74 2c 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  t, SQLITE_DEFAUL
19c20 54 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 2b 31 29  T_SYNCHRONOUS+1)
19c30 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  ;.    }.#endif..
19c40 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
19c50 4f 46 3a 20 52 2d 31 35 34 36 35 2d 32 30 38 31  OF: R-15465-2081
19c60 33 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 61 6e  3 The maximum an
19c70 64 20 6d 69 6e 69 6d 75 6d 20 65 6d 62 65 64 64  d minimum embedd
19c80 65 64 20 70 61 79 6c 6f 61 64 0a 20 20 20 20 2a  ed payload.    *
19c90 2a 20 66 72 61 63 74 69 6f 6e 73 20 61 6e 64 20  * fractions and 
19ca0 74 68 65 20 6c 65 61 66 20 70 61 79 6c 6f 61 64  the leaf payload
19cb0 20 66 72 61 63 74 69 6f 6e 20 76 61 6c 75 65 73   fraction values
19cc0 20 6d 75 73 74 20 62 65 20 36 34 2c 20 33 32 2c   must be 64, 32,
19cd0 20 61 6e 64 20 33 32 2e 0a 20 20 20 20 2a 2a 0a   and 32..    **.
19ce0 20 20 20 20 2a 2a 20 54 68 65 20 6f 72 69 67 69      ** The origi
19cf0 6e 61 6c 20 64 65 73 69 67 6e 20 61 6c 6c 6f 77  nal design allow
19d00 65 64 20 74 68 65 73 65 20 61 6d 6f 75 6e 74 73  ed these amounts
19d10 20 74 6f 20 76 61 72 79 2c 20 62 75 74 20 61 73   to vary, but as
19d20 20 6f 66 0a 20 20 20 20 2a 2a 20 76 65 72 73 69   of.    ** versi
19d30 6f 6e 20 33 2e 36 2e 30 2c 20 77 65 20 72 65 71  on 3.6.0, we req
19d40 75 69 72 65 20 74 68 65 6d 20 74 6f 20 62 65 20  uire them to be 
19d50 66 69 78 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  fixed..    */.  
19d60 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 26 70 61    if( memcmp(&pa
19d70 67 65 31 5b 32 31 5d 2c 20 22 5c 31 30 30 5c 30  ge1[21], "\100\0
19d80 34 30 5c 30 34 30 22 2c 33 29 21 3d 30 20 29 7b  40\040",3)!=0 ){
19d90 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65  .      goto page
19da0 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20  1_init_failed;. 
19db0 20 20 20 7d 0a 20 20 20 20 2f 2a 20 45 56 49 44     }.    /* EVID
19dc0 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 31 38 37 33  ENCE-OF: R-51873
19dd0 2d 33 39 36 31 38 20 54 68 65 20 70 61 67 65 20  -39618 The page 
19de0 73 69 7a 65 20 66 6f 72 20 61 20 64 61 74 61 62  size for a datab
19df0 61 73 65 20 66 69 6c 65 20 69 73 0a 20 20 20 20  ase file is.    
19e00 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79  ** determined by
19e10 20 74 68 65 20 32 2d 62 79 74 65 20 69 6e 74 65   the 2-byte inte
19e20 67 65 72 20 6c 6f 63 61 74 65 64 20 61 74 20 61  ger located at a
19e30 6e 20 6f 66 66 73 65 74 20 6f 66 20 31 36 20 62  n offset of 16 b
19e40 79 74 65 73 20 66 72 6f 6d 0a 20 20 20 20 2a 2a  ytes from.    **
19e50 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
19e60 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
19e70 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 70 61 67 65  ile. */.    page
19e80 53 69 7a 65 20 3d 20 28 70 61 67 65 31 5b 31 36  Size = (page1[16
19e90 5d 3c 3c 38 29 20 7c 20 28 70 61 67 65 31 5b 31  ]<<8) | (page1[1
19ea0 37 5d 3c 3c 31 36 29 3b 0a 20 20 20 20 2f 2a 20  7]<<16);.    /* 
19eb0 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32  EVIDENCE-OF: R-2
19ec0 35 30 30 38 2d 32 31 36 38 38 20 54 68 65 20 73  5008-21688 The s
19ed0 69 7a 65 20 6f 66 20 61 20 70 61 67 65 20 69 73  ize of a page is
19ee0 20 61 20 70 6f 77 65 72 20 6f 66 20 74 77 6f 0a   a power of two.
19ef0 20 20 20 20 2a 2a 20 62 65 74 77 65 65 6e 20 35      ** between 5
19f00 31 32 20 61 6e 64 20 36 35 35 33 36 20 69 6e 63  12 and 65536 inc
19f10 6c 75 73 69 76 65 2e 20 2a 2f 0a 20 20 20 20 69  lusive. */.    i
19f20 66 28 20 28 28 70 61 67 65 53 69 7a 65 2d 31 29  f( ((pageSize-1)
19f30 26 70 61 67 65 53 69 7a 65 29 21 3d 30 0a 20 20  &pageSize)!=0.  
19f40 20 20 20 7c 7c 20 70 61 67 65 53 69 7a 65 3e 53     || pageSize>S
19f50 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53  QLITE_MAX_PAGE_S
19f60 49 5a 45 20 0a 20 20 20 20 20 7c 7c 20 70 61 67  IZE .     || pag
19f70 65 53 69 7a 65 3c 3d 32 35 36 20 0a 20 20 20 20  eSize<=256 .    
19f80 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61  ){.      goto pa
19f90 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b  ge1_init_failed;
19fa0 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e  .    }.    pBt->
19fb0 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f  btsFlags |= BTS_
19fc0 50 41 47 45 53 49 5a 45 5f 46 49 58 45 44 3b 0a  PAGESIZE_FIXED;.
19fd0 20 20 20 20 61 73 73 65 72 74 28 20 28 70 61 67      assert( (pag
19fe0 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b  eSize & 7)==0 );
19ff0 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45  .    /* EVIDENCE
1a000 2d 4f 46 3a 20 52 2d 35 39 33 31 30 2d 35 31 32  -OF: R-59310-512
1a010 30 35 20 54 68 65 20 22 72 65 73 65 72 76 65 64  05 The "reserved
1a020 20 73 70 61 63 65 22 20 73 69 7a 65 20 69 6e 20   space" size in 
1a030 74 68 65 20 31 2d 62 79 74 65 0a 20 20 20 20 2a  the 1-byte.    *
1a040 2a 20 69 6e 74 65 67 65 72 20 61 74 20 6f 66 66  * integer at off
1a050 73 65 74 20 32 30 20 69 73 20 74 68 65 20 6e 75  set 20 is the nu
1a060 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66  mber of bytes of
1a070 20 73 70 61 63 65 20 61 74 20 74 68 65 20 65 6e   space at the en
1a080 64 20 6f 66 0a 20 20 20 20 2a 2a 20 65 61 63 68  d of.    ** each
1a090 20 70 61 67 65 20 74 6f 20 72 65 73 65 72 76 65   page to reserve
1a0a0 20 66 6f 72 20 65 78 74 65 6e 73 69 6f 6e 73 2e   for extensions.
1a0b0 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20   .    **.    ** 
1a0c0 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33  EVIDENCE-OF: R-3
1a0d0 37 34 39 37 2d 34 32 34 31 32 20 54 68 65 20 73  7497-42412 The s
1a0e0 69 7a 65 20 6f 66 20 74 68 65 20 72 65 73 65 72  ize of the reser
1a0f0 76 65 64 20 72 65 67 69 6f 6e 20 69 73 0a 20 20  ved region is.  
1a100 20 20 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20    ** determined 
1a110 62 79 20 74 68 65 20 6f 6e 65 2d 62 79 74 65 20  by the one-byte 
1a120 75 6e 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  unsigned integer
1a130 20 66 6f 75 6e 64 20 61 74 20 61 6e 20 6f 66 66   found at an off
1a140 73 65 74 20 6f 66 20 32 30 0a 20 20 20 20 2a 2a  set of 20.    **
1a150 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61   into the databa
1a160 73 65 20 66 69 6c 65 20 68 65 61 64 65 72 2e 20  se file header. 
1a170 2a 2f 0a 20 20 20 20 75 73 61 62 6c 65 53 69 7a  */.    usableSiz
1a180 65 20 3d 20 70 61 67 65 53 69 7a 65 20 2d 20 70  e = pageSize - p
1a190 61 67 65 31 5b 32 30 5d 3b 0a 20 20 20 20 69 66  age1[20];.    if
1a1a0 28 20 28 75 33 32 29 70 61 67 65 53 69 7a 65 21  ( (u32)pageSize!
1a1b0 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 29  =pBt->pageSize )
1a1c0 7b 0a 20 20 20 20 20 20 2f 2a 20 41 66 74 65 72  {.      /* After
1a1d0 20 72 65 61 64 69 6e 67 20 74 68 65 20 66 69 72   reading the fir
1a1e0 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 64  st page of the d
1a1f0 61 74 61 62 61 73 65 20 61 73 73 75 6d 69 6e 67  atabase assuming
1a200 20 61 20 70 61 67 65 20 73 69 7a 65 0a 20 20 20   a page size.   
1a210 20 20 20 2a 2a 20 6f 66 20 42 74 53 68 61 72 65     ** of BtShare
1a220 64 2e 70 61 67 65 53 69 7a 65 2c 20 77 65 20 68  d.pageSize, we h
1a230 61 76 65 20 64 69 73 63 6f 76 65 72 65 64 20 74  ave discovered t
1a240 68 61 74 20 74 68 65 20 70 61 67 65 2d 73 69 7a  hat the page-siz
1a250 65 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 61 63  e is.      ** ac
1a260 74 75 61 6c 6c 79 20 70 61 67 65 53 69 7a 65 2e  tually pageSize.
1a270 20 55 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61   Unlock the data
1a280 62 61 73 65 2c 20 6c 65 61 76 65 20 70 42 74 2d  base, leave pBt-
1a290 3e 70 50 61 67 65 31 20 61 74 0a 20 20 20 20 20  >pPage1 at.     
1a2a0 20 2a 2a 20 7a 65 72 6f 20 61 6e 64 20 72 65 74   ** zero and ret
1a2b0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 54  urn SQLITE_OK. T
1a2c0 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 63  he caller will c
1a2d0 61 6c 6c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  all this functio
1a2e0 6e 0a 20 20 20 20 20 20 2a 2a 20 61 67 61 69 6e  n.      ** again
1a2f0 20 77 69 74 68 20 74 68 65 20 63 6f 72 72 65 63   with the correc
1a300 74 20 70 61 67 65 2d 73 69 7a 65 2e 0a 20 20 20  t page-size..   
1a310 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 65 6c 65     */.      rele
1a320 61 73 65 50 61 67 65 4f 6e 65 28 70 50 61 67 65  asePageOne(pPage
1a330 31 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 75  1);.      pBt->u
1a340 73 61 62 6c 65 53 69 7a 65 20 3d 20 75 73 61 62  sableSize = usab
1a350 6c 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 70 42  leSize;.      pB
1a360 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 70 61  t->pageSize = pa
1a370 67 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 66 72  geSize;.      fr
1a380 65 65 54 65 6d 70 53 70 61 63 65 28 70 42 74 29  eeTempSpace(pBt)
1a390 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
1a3a0 69 74 65 33 50 61 67 65 72 53 65 74 50 61 67 65  ite3PagerSetPage
1a3b0 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72  size(pBt->pPager
1a3c0 2c 20 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  , &pBt->pageSize
1a3d0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1a3e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a3f0 20 20 20 20 20 70 61 67 65 53 69 7a 65 2d 75 73       pageSize-us
1a400 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20 20 20 20  ableSize);.     
1a410 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1a420 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  }.    if( sqlite
1a430 33 57 72 69 74 61 62 6c 65 53 63 68 65 6d 61 28  3WritableSchema(
1a440 70 42 74 2d 3e 64 62 29 3d 3d 30 20 26 26 20 6e  pBt->db)==0 && n
1a450 50 61 67 65 3e 6e 50 61 67 65 46 69 6c 65 20 29  Page>nPageFile )
1a460 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
1a470 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
1a480 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67  ;.      goto pag
1a490 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a  e1_init_failed;.
1a4a0 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 45 56 49      }.    /* EVI
1a4b0 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 38 33 31  DENCE-OF: R-2831
1a4c0 32 2d 36 34 37 30 34 20 48 6f 77 65 76 65 72 2c  2-64704 However,
1a4d0 20 74 68 65 20 75 73 61 62 6c 65 20 73 69 7a 65   the usable size
1a4e0 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20   is not allowed 
1a4f0 74 6f 0a 20 20 20 20 2a 2a 20 62 65 20 6c 65 73  to.    ** be les
1a500 73 20 74 68 61 6e 20 34 38 30 2e 20 49 6e 20 6f  s than 480. In o
1a510 74 68 65 72 20 77 6f 72 64 73 2c 20 69 66 20 74  ther words, if t
1a520 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73 20  he page size is 
1a530 35 31 32 2c 20 74 68 65 6e 20 74 68 65 0a 20 20  512, then the.  
1a540 20 20 2a 2a 20 72 65 73 65 72 76 65 64 20 73 70    ** reserved sp
1a550 61 63 65 20 73 69 7a 65 20 63 61 6e 6e 6f 74 20  ace size cannot 
1a560 65 78 63 65 65 64 20 33 32 2e 20 2a 2f 0a 20 20  exceed 32. */.  
1a570 20 20 69 66 28 20 75 73 61 62 6c 65 53 69 7a 65    if( usableSize
1a580 3c 34 38 30 20 29 7b 0a 20 20 20 20 20 20 67 6f  <480 ){.      go
1a590 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61  to page1_init_fa
1a5a0 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20  iled;.    }.    
1a5b0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20  pBt->pageSize = 
1a5c0 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 70 42  pageSize;.    pB
1a5d0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20  t->usableSize = 
1a5e0 75 73 61 62 6c 65 53 69 7a 65 3b 0a 23 69 66 6e  usableSize;.#ifn
1a5f0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1a600 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 70  AUTOVACUUM.    p
1a610 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d  Bt->autoVacuum =
1a620 20 28 67 65 74 34 62 79 74 65 28 26 70 61 67 65   (get4byte(&page
1a630 31 5b 33 36 20 2b 20 34 2a 34 5d 29 3f 31 3a 30  1[36 + 4*4])?1:0
1a640 29 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e 63 72  );.    pBt->incr
1a650 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79  Vacuum = (get4by
1a660 74 65 28 26 70 61 67 65 31 5b 33 36 20 2b 20 37  te(&page1[36 + 7
1a670 2a 34 5d 29 3f 31 3a 30 29 3b 0a 23 65 6e 64 69  *4])?1:0);.#endi
1a680 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20 6d 61 78 4c  f.  }..  /* maxL
1a690 6f 63 61 6c 20 69 73 20 74 68 65 20 6d 61 78 69  ocal is the maxi
1a6a0 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70 61  mum amount of pa
1a6b0 79 6c 6f 61 64 20 74 6f 20 73 74 6f 72 65 20 6c  yload to store l
1a6c0 6f 63 61 6c 6c 79 20 66 6f 72 0a 20 20 2a 2a 20  ocally for.  ** 
1a6d0 61 20 63 65 6c 6c 2e 20 20 4d 61 6b 65 20 73 75  a cell.  Make su
1a6e0 72 65 20 69 74 20 69 73 20 73 6d 61 6c 6c 20 65  re it is small e
1a6f0 6e 6f 75 67 68 20 73 6f 20 74 68 61 74 20 61 74  nough so that at
1a700 20 6c 65 61 73 74 20 6d 69 6e 46 61 6e 6f 75 74   least minFanout
1a710 0a 20 20 2a 2a 20 63 65 6c 6c 73 20 63 61 6e 20  .  ** cells can 
1a720 77 69 6c 6c 20 66 69 74 20 6f 6e 20 6f 6e 65 20  will fit on one 
1a730 70 61 67 65 2e 20 20 57 65 20 61 73 73 75 6d 65  page.  We assume
1a740 20 61 20 31 30 2d 62 79 74 65 20 70 61 67 65 20   a 10-byte page 
1a750 68 65 61 64 65 72 2e 0a 20 20 2a 2a 20 42 65 73  header..  ** Bes
1a760 69 64 65 73 20 74 68 65 20 70 61 79 6c 6f 61 64  ides the payload
1a770 2c 20 74 68 65 20 63 65 6c 6c 20 6d 75 73 74 20  , the cell must 
1a780 73 74 6f 72 65 3a 0a 20 20 2a 2a 20 20 20 20 20  store:.  **     
1a790 32 2d 62 79 74 65 20 70 6f 69 6e 74 65 72 20 74  2-byte pointer t
1a7a0 6f 20 74 68 65 20 63 65 6c 6c 0a 20 20 2a 2a 20  o the cell.  ** 
1a7b0 20 20 20 20 34 2d 62 79 74 65 20 63 68 69 6c 64      4-byte child
1a7c0 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 20 20   pointer.  **   
1a7d0 20 20 39 2d 62 79 74 65 20 6e 4b 65 79 20 76 61    9-byte nKey va
1a7e0 6c 75 65 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62  lue.  **     4-b
1a7f0 79 74 65 20 6e 44 61 74 61 20 76 61 6c 75 65 0a  yte nData value.
1a800 20 20 2a 2a 20 20 20 20 20 34 2d 62 79 74 65 20    **     4-byte 
1a810 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 70 6f  overflow page po
1a820 69 6e 74 65 72 0a 20 20 2a 2a 20 53 6f 20 61 20  inter.  ** So a 
1a830 63 65 6c 6c 20 63 6f 6e 73 69 73 74 73 20 6f 66  cell consists of
1a840 20 61 20 32 2d 62 79 74 65 20 70 6f 69 6e 74 65   a 2-byte pointe
1a850 72 2c 20 61 20 68 65 61 64 65 72 20 77 68 69 63  r, a header whic
1a860 68 20 69 73 20 61 73 20 6d 75 63 68 20 61 73 0a  h is as much as.
1a870 20 20 2a 2a 20 31 37 20 62 79 74 65 73 20 6c 6f    ** 17 bytes lo
1a880 6e 67 2c 20 30 20 74 6f 20 4e 20 62 79 74 65 73  ng, 0 to N bytes
1a890 20 6f 66 20 70 61 79 6c 6f 61 64 2c 20 61 6e 64   of payload, and
1a8a0 20 61 6e 20 6f 70 74 69 6f 6e 61 6c 20 34 20 62   an optional 4 b
1a8b0 79 74 65 20 6f 76 65 72 66 6c 6f 77 0a 20 20 2a  yte overflow.  *
1a8c0 2a 20 70 61 67 65 20 70 6f 69 6e 74 65 72 2e 0a  * page pointer..
1a8d0 20 20 2a 2f 0a 20 20 70 42 74 2d 3e 6d 61 78 4c    */.  pBt->maxL
1a8e0 6f 63 61 6c 20 3d 20 28 75 31 36 29 28 28 70 42  ocal = (u16)((pB
1a8f0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31 32  t->usableSize-12
1a900 29 2a 36 34 2f 32 35 35 20 2d 20 32 33 29 3b 0a  )*64/255 - 23);.
1a910 20 20 70 42 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 20    pBt->minLocal 
1a920 3d 20 28 75 31 36 29 28 28 70 42 74 2d 3e 75 73  = (u16)((pBt->us
1a930 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a 33 32 2f  ableSize-12)*32/
1a940 32 35 35 20 2d 20 32 33 29 3b 0a 20 20 70 42 74  255 - 23);.  pBt
1a950 2d 3e 6d 61 78 4c 65 61 66 20 3d 20 28 75 31 36  ->maxLeaf = (u16
1a960 29 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  )(pBt->usableSiz
1a970 65 20 2d 20 33 35 29 3b 0a 20 20 70 42 74 2d 3e  e - 35);.  pBt->
1a980 6d 69 6e 4c 65 61 66 20 3d 20 28 75 31 36 29 28  minLeaf = (u16)(
1a990 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  (pBt->usableSize
1a9a0 2d 31 32 29 2a 33 32 2f 32 35 35 20 2d 20 32 33  -12)*32/255 - 23
1a9b0 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 6d 61  );.  if( pBt->ma
1a9c0 78 4c 6f 63 61 6c 3e 31 32 37 20 29 7b 0a 20 20  xLocal>127 ){.  
1a9d0 20 20 70 42 74 2d 3e 6d 61 78 31 62 79 74 65 50    pBt->max1byteP
1a9e0 61 79 6c 6f 61 64 20 3d 20 31 32 37 3b 0a 20 20  ayload = 127;.  
1a9f0 7d 65 6c 73 65 7b 0a 20 20 20 20 70 42 74 2d 3e  }else{.    pBt->
1aa00 6d 61 78 31 62 79 74 65 50 61 79 6c 6f 61 64 20  max1bytePayload 
1aa10 3d 20 28 75 38 29 70 42 74 2d 3e 6d 61 78 4c 6f  = (u8)pBt->maxLo
1aa20 63 61 6c 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  cal;.  }.  asser
1aa30 74 28 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66 20  t( pBt->maxLeaf 
1aa40 2b 20 32 33 20 3c 3d 20 4d 58 5f 43 45 4c 4c 5f  + 23 <= MX_CELL_
1aa50 53 49 5a 45 28 70 42 74 29 20 29 3b 0a 20 20 70  SIZE(pBt) );.  p
1aa60 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 70 50 61  Bt->pPage1 = pPa
1aa70 67 65 31 3b 0a 20 20 70 42 74 2d 3e 6e 50 61 67  ge1;.  pBt->nPag
1aa80 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 72 65 74  e = nPage;.  ret
1aa90 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  urn SQLITE_OK;..
1aaa0 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65  page1_init_faile
1aab0 64 3a 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65  d:.  releasePage
1aac0 4f 6e 65 28 70 50 61 67 65 31 29 3b 0a 20 20 70  One(pPage1);.  p
1aad0 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a  Bt->pPage1 = 0;.
1aae0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1aaf0 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 2f  #ifndef NDEBUG./
1ab00 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
1ab10 6e 75 6d 62 65 72 20 6f 66 20 63 75 72 73 6f 72  number of cursor
1ab20 73 20 6f 70 65 6e 20 6f 6e 20 70 42 74 2e 20 54  s open on pBt. T
1ab30 68 69 73 20 69 73 20 66 6f 72 20 75 73 65 0a 2a  his is for use.*
1ab40 2a 20 69 6e 20 61 73 73 65 72 74 28 29 20 65 78  * in assert() ex
1ab50 70 72 65 73 73 69 6f 6e 73 2c 20 73 6f 20 69 74  pressions, so it
1ab60 20 69 73 20 6f 6e 6c 79 20 63 6f 6d 70 69 6c 65   is only compile
1ab70 64 20 69 66 20 4e 44 45 42 55 47 20 69 73 20 6e  d if NDEBUG is n
1ab80 6f 74 0a 2a 2a 20 64 65 66 69 6e 65 64 2e 0a 2a  ot.** defined..*
1ab90 2a 0a 2a 2a 20 4f 6e 6c 79 20 77 72 69 74 65 20  *.** Only write 
1aba0 63 75 72 73 6f 72 73 20 61 72 65 20 63 6f 75 6e  cursors are coun
1abb0 74 65 64 20 69 66 20 77 72 4f 6e 6c 79 20 69 73  ted if wrOnly is
1abc0 20 74 72 75 65 2e 20 20 49 66 20 77 72 4f 6e 6c   true.  If wrOnl
1abd0 79 20 69 73 0a 2a 2a 20 66 61 6c 73 65 20 74 68  y is.** false th
1abe0 65 6e 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 61  en all cursors a
1abf0 72 65 20 63 6f 75 6e 74 65 64 2e 0a 2a 2a 0a 2a  re counted..**.*
1ac00 2a 20 46 6f 72 20 74 68 65 20 70 75 72 70 6f 73  * For the purpos
1ac10 65 73 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69  es of this routi
1ac20 6e 65 2c 20 61 20 63 75 72 73 6f 72 20 69 73 20  ne, a cursor is 
1ac30 61 6e 79 20 63 75 72 73 6f 72 20 74 68 61 74 0a  any cursor that.
1ac40 2a 2a 20 69 73 20 63 61 70 61 62 6c 65 20 6f 66  ** is capable of
1ac50 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74   reading or writ
1ac60 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62  ing to the datab
1ac70 61 73 65 2e 20 20 43 75 72 73 6f 72 73 20 74 68  ase.  Cursors th
1ac80 61 74 0a 2a 2a 20 68 61 76 65 20 62 65 65 6e 20  at.** have been 
1ac90 74 72 69 70 70 65 64 20 69 6e 74 6f 20 74 68 65  tripped into the
1aca0 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 73 74   CURSOR_FAULT st
1acb0 61 74 65 20 61 72 65 20 6e 6f 74 20 63 6f 75 6e  ate are not coun
1acc0 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ted..*/.static i
1acd0 6e 74 20 63 6f 75 6e 74 56 61 6c 69 64 43 75 72  nt countValidCur
1ace0 73 6f 72 73 28 42 74 53 68 61 72 65 64 20 2a 70  sors(BtShared *p
1acf0 42 74 2c 20 69 6e 74 20 77 72 4f 6e 6c 79 29 7b  Bt, int wrOnly){
1ad00 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
1ad10 72 3b 0a 20 20 69 6e 74 20 72 20 3d 20 30 3b 0a  r;.  int r = 0;.
1ad20 20 20 66 6f 72 28 70 43 75 72 3d 70 42 74 2d 3e    for(pCur=pBt->
1ad30 70 43 75 72 73 6f 72 3b 20 70 43 75 72 3b 20 70  pCursor; pCur; p
1ad40 43 75 72 3d 70 43 75 72 2d 3e 70 4e 65 78 74 29  Cur=pCur->pNext)
1ad50 7b 0a 20 20 20 20 69 66 28 20 28 77 72 4f 6e 6c  {.    if( (wrOnl
1ad60 79 3d 3d 30 20 7c 7c 20 28 70 43 75 72 2d 3e 63  y==0 || (pCur->c
1ad70 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 57  urFlags & BTCF_W
1ad80 72 69 74 65 46 6c 61 67 29 21 3d 30 29 0a 20 20  riteFlag)!=0).  
1ad90 20 20 20 26 26 20 70 43 75 72 2d 3e 65 53 74 61     && pCur->eSta
1ada0 74 65 21 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54  te!=CURSOR_FAULT
1adb0 20 29 20 72 2b 2b 3b 20 0a 20 20 7d 0a 20 20 72   ) r++; .  }.  r
1adc0 65 74 75 72 6e 20 72 3b 0a 7d 0a 23 65 6e 64 69  eturn r;.}.#endi
1add0 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 72  f../*.** If ther
1ade0 65 20 61 72 65 20 6e 6f 20 6f 75 74 73 74 61 6e  e are no outstan
1adf0 64 69 6e 67 20 63 75 72 73 6f 72 73 20 61 6e 64  ding cursors and
1ae00 20 77 65 20 61 72 65 20 6e 6f 74 20 69 6e 20 74   we are not in t
1ae10 68 65 20 6d 69 64 64 6c 65 0a 2a 2a 20 6f 66 20  he middle.** of 
1ae20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62 75  a transaction bu
1ae30 74 20 74 68 65 72 65 20 69 73 20 61 20 72 65 61  t there is a rea
1ae40 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  d lock on the da
1ae50 74 61 62 61 73 65 2c 20 74 68 65 6e 0a 2a 2a 20  tabase, then.** 
1ae60 74 68 69 73 20 72 6f 75 74 69 6e 65 20 75 6e 72  this routine unr
1ae70 65 66 73 20 74 68 65 20 66 69 72 73 74 20 70 61  efs the first pa
1ae80 67 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ge of the databa
1ae90 73 65 20 66 69 6c 65 20 77 68 69 63 68 20 0a 2a  se file which .*
1aea0 2a 20 68 61 73 20 74 68 65 20 65 66 66 65 63 74  * has the effect
1aeb0 20 6f 66 20 72 65 6c 65 61 73 69 6e 67 20 74 68   of releasing th
1aec0 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2a 0a  e read lock..**.
1aed0 2a 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61  ** If there is a
1aee0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20   transaction in 
1aef0 70 72 6f 67 72 65 73 73 2c 20 74 68 69 73 20 72  progress, this r
1af00 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
1af10 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  p..*/.static voi
1af20 64 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55  d unlockBtreeIfU
1af30 6e 75 73 65 64 28 42 74 53 68 61 72 65 64 20 2a  nused(BtShared *
1af40 70 42 74 29 7b 0a 20 20 61 73 73 65 72 74 28 20  pBt){.  assert( 
1af50 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
1af60 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
1af70 3b 0a 20 20 61 73 73 65 72 74 28 20 63 6f 75 6e  ;.  assert( coun
1af80 74 56 61 6c 69 64 43 75 72 73 6f 72 73 28 70 42  tValidCursors(pB
1af90 74 2c 30 29 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e  t,0)==0 || pBt->
1afa0 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3e 54 52  inTransaction>TR
1afb0 41 4e 53 5f 4e 4f 4e 45 20 29 3b 0a 20 20 69 66  ANS_NONE );.  if
1afc0 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  ( pBt->inTransac
1afd0 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45  tion==TRANS_NONE
1afe0 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65 31 21   && pBt->pPage1!
1aff0 3d 30 20 29 7b 0a 20 20 20 20 4d 65 6d 50 61 67  =0 ){.    MemPag
1b000 65 20 2a 70 50 61 67 65 31 20 3d 20 70 42 74 2d  e *pPage1 = pBt-
1b010 3e 70 50 61 67 65 31 3b 0a 20 20 20 20 61 73 73  >pPage1;.    ass
1b020 65 72 74 28 20 70 50 61 67 65 31 2d 3e 61 44 61  ert( pPage1->aDa
1b030 74 61 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ta );.    assert
1b040 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65  ( sqlite3PagerRe
1b050 66 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67  fcount(pBt->pPag
1b060 65 72 29 3d 3d 31 20 29 3b 0a 20 20 20 20 70 42  er)==1 );.    pB
1b070 74 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a 20  t->pPage1 = 0;. 
1b080 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 4f 6e     releasePageOn
1b090 65 28 70 50 61 67 65 31 29 3b 0a 20 20 7d 0a 7d  e(pPage1);.  }.}
1b0a0 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70 42 74 20 70  ../*.** If pBt p
1b0b0 6f 69 6e 74 73 20 74 6f 20 61 6e 20 65 6d 70 74  oints to an empt
1b0c0 79 20 66 69 6c 65 20 74 68 65 6e 20 63 6f 6e 76  y file then conv
1b0d0 65 72 74 20 74 68 61 74 20 65 6d 70 74 79 20 66  ert that empty f
1b0e0 69 6c 65 0a 2a 2a 20 69 6e 74 6f 20 61 20 6e 65  ile.** into a ne
1b0f0 77 20 65 6d 70 74 79 20 64 61 74 61 62 61 73 65  w empty database
1b100 20 62 79 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67   by initializing
1b110 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20   the first page 
1b120 6f 66 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61  of.** the databa
1b130 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  se..*/.static in
1b140 74 20 6e 65 77 44 61 74 61 62 61 73 65 28 42 74  t newDatabase(Bt
1b150 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20  Shared *pBt){.  
1b160 4d 65 6d 50 61 67 65 20 2a 70 50 31 3b 0a 20 20  MemPage *pP1;.  
1b170 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64  unsigned char *d
1b180 61 74 61 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  ata;.  int rc;..
1b190 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
1b1a0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
1b1b0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66  ->mutex) );.  if
1b1c0 28 20 70 42 74 2d 3e 6e 50 61 67 65 3e 30 20 29  ( pBt->nPage>0 )
1b1d0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
1b1e0 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 50  ITE_OK;.  }.  pP
1b1f0 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b  1 = pBt->pPage1;
1b200 0a 20 20 61 73 73 65 72 74 28 20 70 50 31 21 3d  .  assert( pP1!=
1b210 30 20 29 3b 0a 20 20 64 61 74 61 20 3d 20 70 50  0 );.  data = pP
1b220 31 2d 3e 61 44 61 74 61 3b 0a 20 20 72 63 20 3d  1->aData;.  rc =
1b230 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
1b240 74 65 28 70 50 31 2d 3e 70 44 62 50 61 67 65 29  te(pP1->pDbPage)
1b250 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
1b260 75 72 6e 20 72 63 3b 0a 20 20 6d 65 6d 63 70 79  urn rc;.  memcpy
1b270 28 64 61 74 61 2c 20 7a 4d 61 67 69 63 48 65 61  (data, zMagicHea
1b280 64 65 72 2c 20 73 69 7a 65 6f 66 28 7a 4d 61 67  der, sizeof(zMag
1b290 69 63 48 65 61 64 65 72 29 29 3b 0a 20 20 61 73  icHeader));.  as
1b2a0 73 65 72 74 28 20 73 69 7a 65 6f 66 28 7a 4d 61  sert( sizeof(zMa
1b2b0 67 69 63 48 65 61 64 65 72 29 3d 3d 31 36 20 29  gicHeader)==16 )
1b2c0 3b 0a 20 20 64 61 74 61 5b 31 36 5d 20 3d 20 28  ;.  data[16] = (
1b2d0 75 38 29 28 28 70 42 74 2d 3e 70 61 67 65 53 69  u8)((pBt->pageSi
1b2e0 7a 65 3e 3e 38 29 26 30 78 66 66 29 3b 0a 20 20  ze>>8)&0xff);.  
1b2f0 64 61 74 61 5b 31 37 5d 20 3d 20 28 75 38 29 28  data[17] = (u8)(
1b300 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3e  (pBt->pageSize>>
1b310 31 36 29 26 30 78 66 66 29 3b 0a 20 20 64 61 74  16)&0xff);.  dat
1b320 61 5b 31 38 5d 20 3d 20 31 3b 0a 20 20 64 61 74  a[18] = 1;.  dat
1b330 61 5b 31 39 5d 20 3d 20 31 3b 0a 20 20 61 73 73  a[19] = 1;.  ass
1b340 65 72 74 28 20 70 42 74 2d 3e 75 73 61 62 6c 65  ert( pBt->usable
1b350 53 69 7a 65 3c 3d 70 42 74 2d 3e 70 61 67 65 53  Size<=pBt->pageS
1b360 69 7a 65 20 26 26 20 70 42 74 2d 3e 75 73 61 62  ize && pBt->usab
1b370 6c 65 53 69 7a 65 2b 32 35 35 3e 3d 70 42 74 2d  leSize+255>=pBt-
1b380 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 64 61  >pageSize);.  da
1b390 74 61 5b 32 30 5d 20 3d 20 28 75 38 29 28 70 42  ta[20] = (u8)(pB
1b3a0 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 42  t->pageSize - pB
1b3b0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a  t->usableSize);.
1b3c0 20 20 64 61 74 61 5b 32 31 5d 20 3d 20 36 34 3b    data[21] = 64;
1b3d0 0a 20 20 64 61 74 61 5b 32 32 5d 20 3d 20 33 32  .  data[22] = 32
1b3e0 3b 0a 20 20 64 61 74 61 5b 32 33 5d 20 3d 20 33  ;.  data[23] = 3
1b3f0 32 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74  2;.  memset(&dat
1b400 61 5b 32 34 5d 2c 20 30 2c 20 31 30 30 2d 32 34  a[24], 0, 100-24
1b410 29 3b 0a 20 20 7a 65 72 6f 50 61 67 65 28 70 50  );.  zeroPage(pP
1b420 31 2c 20 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54  1, PTF_INTKEY|PT
1b430 46 5f 4c 45 41 46 7c 50 54 46 5f 4c 45 41 46 44  F_LEAF|PTF_LEAFD
1b440 41 54 41 20 29 3b 0a 20 20 70 42 74 2d 3e 62 74  ATA );.  pBt->bt
1b450 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 50 41  sFlags |= BTS_PA
1b460 47 45 53 49 5a 45 5f 46 49 58 45 44 3b 0a 23 69  GESIZE_FIXED;.#i
1b470 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1b480 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 61  T_AUTOVACUUM.  a
1b490 73 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f  ssert( pBt->auto
1b4a0 56 61 63 75 75 6d 3d 3d 31 20 7c 7c 20 70 42 74  Vacuum==1 || pBt
1b4b0 2d 3e 61 75 74 6f 56 61 63 75 75 6d 3d 3d 30 20  ->autoVacuum==0 
1b4c0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  );.  assert( pBt
1b4d0 2d 3e 69 6e 63 72 56 61 63 75 75 6d 3d 3d 31 20  ->incrVacuum==1 
1b4e0 7c 7c 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75  || pBt->incrVacu
1b4f0 75 6d 3d 3d 30 20 29 3b 0a 20 20 70 75 74 34 62  um==0 );.  put4b
1b500 79 74 65 28 26 64 61 74 61 5b 33 36 20 2b 20 34  yte(&data[36 + 4
1b510 2a 34 5d 2c 20 70 42 74 2d 3e 61 75 74 6f 56 61  *4], pBt->autoVa
1b520 63 75 75 6d 29 3b 0a 20 20 70 75 74 34 62 79 74  cuum);.  put4byt
1b530 65 28 26 64 61 74 61 5b 33 36 20 2b 20 37 2a 34  e(&data[36 + 7*4
1b540 5d 2c 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75  ], pBt->incrVacu
1b550 75 6d 29 3b 0a 23 65 6e 64 69 66 0a 20 20 70 42  um);.#endif.  pB
1b560 74 2d 3e 6e 50 61 67 65 20 3d 20 31 3b 0a 20 20  t->nPage = 1;.  
1b570 64 61 74 61 5b 33 31 5d 20 3d 20 31 3b 0a 20 20  data[31] = 1;.  
1b580 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1b590 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69  ;.}../*.** Initi
1b5a0 61 6c 69 7a 65 20 74 68 65 20 66 69 72 73 74 20  alize the first 
1b5b0 70 61 67 65 20 6f 66 20 74 68 65 20 64 61 74 61  page of the data
1b5c0 62 61 73 65 20 66 69 6c 65 20 28 63 72 65 61 74  base file (creat
1b5d0 69 6e 67 20 61 20 64 61 74 61 62 61 73 65 0a 2a  ing a database.*
1b5e0 2a 20 63 6f 6e 73 69 73 74 69 6e 67 20 6f 66 20  * consisting of 
1b5f0 61 20 73 69 6e 67 6c 65 20 70 61 67 65 20 61 6e  a single page an
1b600 64 20 6e 6f 20 73 63 68 65 6d 61 20 6f 62 6a 65  d no schema obje
1b610 63 74 73 29 2e 20 52 65 74 75 72 6e 20 53 51 4c  cts). Return SQL
1b620 49 54 45 5f 4f 4b 0a 2a 2a 20 69 66 20 73 75 63  ITE_OK.** if suc
1b630 63 65 73 73 66 75 6c 2c 20 6f 72 20 61 6e 20 53  cessful, or an S
1b640 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
1b650 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 69   otherwise..*/.i
1b660 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e  nt sqlite3BtreeN
1b670 65 77 44 62 28 42 74 72 65 65 20 2a 70 29 7b 0a  ewDb(Btree *p){.
1b680 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69    int rc;.  sqli
1b690 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
1b6a0 3b 0a 20 20 70 2d 3e 70 42 74 2d 3e 6e 50 61 67  ;.  p->pBt->nPag
1b6b0 65 20 3d 20 30 3b 0a 20 20 72 63 20 3d 20 6e 65  e = 0;.  rc = ne
1b6c0 77 44 61 74 61 62 61 73 65 28 70 2d 3e 70 42 74  wDatabase(p->pBt
1b6d0 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
1b6e0 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
1b6f0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1b700 20 41 74 74 65 6d 70 74 20 74 6f 20 73 74 61 72   Attempt to star
1b710 74 20 61 20 6e 65 77 20 74 72 61 6e 73 61 63 74  t a new transact
1b720 69 6f 6e 2e 20 41 20 77 72 69 74 65 2d 74 72 61  ion. A write-tra
1b730 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 73  nsaction.** is s
1b740 74 61 72 74 65 64 20 69 66 20 74 68 65 20 73 65  tarted if the se
1b750 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73  cond argument is
1b760 20 6e 6f 6e 7a 65 72 6f 2c 20 6f 74 68 65 72 77   nonzero, otherw
1b770 69 73 65 20 61 20 72 65 61 64 2d 0a 2a 2a 20 74  ise a read-.** t
1b780 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 49 66 20  ransaction.  If 
1b790 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
1b7a0 65 6e 74 20 69 73 20 32 20 6f 72 20 6d 6f 72 65  ent is 2 or more
1b7b0 20 61 6e 64 20 65 78 63 6c 75 73 69 76 65 0a 2a   and exclusive.*
1b7c0 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  * transaction is
1b7d0 20 73 74 61 72 74 65 64 2c 20 6d 65 61 6e 69 6e   started, meanin
1b7e0 67 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20  g that no other 
1b7f0 70 72 6f 63 65 73 73 20 69 73 20 61 6c 6c 6f 77  process is allow
1b800 65 64 0a 2a 2a 20 74 6f 20 61 63 63 65 73 73 20  ed.** to access 
1b810 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 41  the database.  A
1b820 20 70 72 65 65 78 69 73 74 69 6e 67 20 74 72 61   preexisting tra
1b830 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20 6e 6f 74  nsaction may not
1b840 20 62 65 0a 2a 2a 20 75 70 67 72 61 64 65 64 20   be.** upgraded 
1b850 74 6f 20 65 78 63 6c 75 73 69 76 65 20 62 79 20  to exclusive by 
1b860 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75  calling this rou
1b870 74 69 6e 65 20 61 20 73 65 63 6f 6e 64 20 74 69  tine a second ti
1b880 6d 65 20 2d 20 74 68 65 0a 2a 2a 20 65 78 63 6c  me - the.** excl
1b890 75 73 69 76 69 74 79 20 66 6c 61 67 20 6f 6e 6c  usivity flag onl
1b8a0 79 20 77 6f 72 6b 73 20 66 6f 72 20 61 20 6e 65  y works for a ne
1b8b0 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  w transaction..*
1b8c0 2a 0a 2a 2a 20 41 20 77 72 69 74 65 2d 74 72 61  *.** A write-tra
1b8d0 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65  nsaction must be
1b8e0 20 73 74 61 72 74 65 64 20 62 65 66 6f 72 65 20   started before 
1b8f0 61 74 74 65 6d 70 74 69 6e 67 20 61 6e 79 20 0a  attempting any .
1b900 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68  ** changes to th
1b910 65 20 64 61 74 61 62 61 73 65 2e 20 20 4e 6f 6e  e database.  Non
1b920 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
1b930 6e 67 20 72 6f 75 74 69 6e 65 73 20 0a 2a 2a 20  ng routines .** 
1b940 77 69 6c 6c 20 77 6f 72 6b 20 75 6e 6c 65 73 73  will work unless
1b950 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
1b960 73 20 73 74 61 72 74 65 64 20 66 69 72 73 74 3a  s started first:
1b970 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69  .**.**      sqli
1b980 74 65 33 42 74 72 65 65 43 72 65 61 74 65 54 61  te3BtreeCreateTa
1b990 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71  ble().**      sq
1b9a0 6c 69 74 65 33 42 74 72 65 65 43 72 65 61 74 65  lite3BtreeCreate
1b9b0 49 6e 64 65 78 28 29 0a 2a 2a 20 20 20 20 20 20  Index().**      
1b9c0 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61  sqlite3BtreeClea
1b9d0 72 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20  rTable().**     
1b9e0 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 72 6f   sqlite3BtreeDro
1b9f0 70 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20  pTable().**     
1ba00 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 73   sqlite3BtreeIns
1ba10 65 72 74 28 29 0a 2a 2a 20 20 20 20 20 20 73 71  ert().**      sq
1ba20 6c 69 74 65 33 42 74 72 65 65 44 65 6c 65 74 65  lite3BtreeDelete
1ba30 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74  ().**      sqlit
1ba40 65 33 42 74 72 65 65 55 70 64 61 74 65 4d 65 74  e3BtreeUpdateMet
1ba50 61 28 29 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  a().**.** If an 
1ba60 69 6e 69 74 69 61 6c 20 61 74 74 65 6d 70 74 20  initial attempt 
1ba70 74 6f 20 61 63 71 75 69 72 65 20 74 68 65 20 6c  to acquire the l
1ba80 6f 63 6b 20 66 61 69 6c 73 20 62 65 63 61 75 73  ock fails becaus
1ba90 65 20 6f 66 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e  e of lock conten
1baa0 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 74 68 65 20  tion.** and the 
1bab0 64 61 74 61 62 61 73 65 20 77 61 73 20 70 72 65  database was pre
1bac0 76 69 6f 75 73 6c 79 20 75 6e 6c 6f 63 6b 65 64  viously unlocked
1bad0 2c 20 74 68 65 6e 20 69 6e 76 6f 6b 65 20 74 68  , then invoke th
1bae0 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 0a 2a  e busy handler.*
1baf0 2a 20 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e  * if there is on
1bb00 65 2e 20 20 42 75 74 20 69 66 20 74 68 65 72 65  e.  But if there
1bb10 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20   was previously 
1bb20 61 20 72 65 61 64 2d 6c 6f 63 6b 2c 20 64 6f 20  a read-lock, do 
1bb30 6e 6f 74 0a 2a 2a 20 69 6e 76 6f 6b 65 20 74 68  not.** invoke th
1bb40 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20 2d  e busy handler -
1bb50 20 6a 75 73 74 20 72 65 74 75 72 6e 20 53 51 4c   just return SQL
1bb60 49 54 45 5f 42 55 53 59 2e 20 20 53 51 4c 49 54  ITE_BUSY.  SQLIT
1bb70 45 5f 42 55 53 59 20 69 73 20 0a 2a 2a 20 72 65  E_BUSY is .** re
1bb80 74 75 72 6e 65 64 20 77 68 65 6e 20 74 68 65 72  turned when ther
1bb90 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 20 72  e is already a r
1bba0 65 61 64 2d 6c 6f 63 6b 20 69 6e 20 6f 72 64 65  ead-lock in orde
1bbb0 72 20 74 6f 20 61 76 6f 69 64 20 61 20 64 65 61  r to avoid a dea
1bbc0 64 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 75 70  dlock..**.** Sup
1bbd0 70 6f 73 65 20 74 68 65 72 65 20 61 72 65 20 74  pose there are t
1bbe0 77 6f 20 70 72 6f 63 65 73 73 65 73 20 41 20 61  wo processes A a
1bbf0 6e 64 20 42 2e 20 20 41 20 68 61 73 20 61 20 72  nd B.  A has a r
1bc00 65 61 64 20 6c 6f 63 6b 20 61 6e 64 20 42 20 68  ead lock and B h
1bc10 61 73 0a 2a 2a 20 61 20 72 65 73 65 72 76 65 64  as.** a reserved
1bc20 20 6c 6f 63 6b 2e 20 20 42 20 74 72 69 65 73 20   lock.  B tries 
1bc30 74 6f 20 70 72 6f 6d 6f 74 65 20 74 6f 20 65 78  to promote to ex
1bc40 63 6c 75 73 69 76 65 20 62 75 74 20 69 73 20 62  clusive but is b
1bc50 6c 6f 63 6b 65 64 20 62 65 63 61 75 73 65 0a 2a  locked because.*
1bc60 2a 20 6f 66 20 41 27 73 20 72 65 61 64 20 6c 6f  * of A's read lo
1bc70 63 6b 2e 20 20 41 20 74 72 69 65 73 20 74 6f 20  ck.  A tries to 
1bc80 70 72 6f 6d 6f 74 65 20 74 6f 20 72 65 73 65 72  promote to reser
1bc90 76 65 64 20 62 75 74 20 69 73 20 62 6c 6f 63 6b  ved but is block
1bca0 65 64 20 62 79 20 42 2e 0a 2a 2a 20 4f 6e 65 20  ed by B..** One 
1bcb0 6f 72 20 74 68 65 20 6f 74 68 65 72 20 6f 66 20  or the other of 
1bcc0 74 68 65 20 74 77 6f 20 70 72 6f 63 65 73 73 65  the two processe
1bcd0 73 20 6d 75 73 74 20 67 69 76 65 20 77 61 79 20  s must give way 
1bce0 6f 72 20 74 68 65 72 65 20 63 61 6e 20 62 65 0a  or there can be.
1bcf0 2a 2a 20 6e 6f 20 70 72 6f 67 72 65 73 73 2e 20  ** no progress. 
1bd00 20 42 79 20 72 65 74 75 72 6e 69 6e 67 20 53 51   By returning SQ
1bd10 4c 49 54 45 5f 42 55 53 59 20 61 6e 64 20 6e 6f  LITE_BUSY and no
1bd20 74 20 69 6e 76 6f 6b 69 6e 67 20 74 68 65 20 62  t invoking the b
1bd30 75 73 79 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a 20  usy callback.** 
1bd40 77 68 65 6e 20 41 20 61 6c 72 65 61 64 79 20 68  when A already h
1bd50 61 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 2c 20  as a read lock, 
1bd60 77 65 20 65 6e 63 6f 75 72 61 67 65 20 41 20 74  we encourage A t
1bd70 6f 20 67 69 76 65 20 75 70 20 61 6e 64 20 6c 65  o give up and le
1bd80 74 20 42 0a 2a 2a 20 70 72 6f 63 65 65 64 2e 0a  t B.** proceed..
1bd90 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
1bda0 72 65 65 42 65 67 69 6e 54 72 61 6e 73 28 42 74  reeBeginTrans(Bt
1bdb0 72 65 65 20 2a 70 2c 20 69 6e 74 20 77 72 66 6c  ree *p, int wrfl
1bdc0 61 67 2c 20 69 6e 74 20 2a 70 53 63 68 65 6d 61  ag, int *pSchema
1bdd0 56 65 72 73 69 6f 6e 29 7b 0a 20 20 42 74 53 68  Version){.  BtSh
1bde0 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
1bdf0 42 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  Bt;.  int rc = S
1be00 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 73 71 6c  QLITE_OK;..  sql
1be10 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
1be20 29 3b 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72  );.  btreeIntegr
1be30 69 74 79 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66  ity(p);..  /* If
1be40 20 74 68 65 20 62 74 72 65 65 20 69 73 20 61 6c   the btree is al
1be50 72 65 61 64 79 20 69 6e 20 61 20 77 72 69 74 65  ready in a write
1be60 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 6f 72  -transaction, or
1be70 20 69 74 0a 20 20 2a 2a 20 69 73 20 61 6c 72 65   it.  ** is alre
1be80 61 64 79 20 69 6e 20 61 20 72 65 61 64 2d 74 72  ady in a read-tr
1be90 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 61 20  ansaction and a 
1bea0 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e  read-transaction
1beb0 0a 20 20 2a 2a 20 69 73 20 72 65 71 75 65 73 74  .  ** is request
1bec0 65 64 2c 20 74 68 69 73 20 69 73 20 61 20 6e 6f  ed, this is a no
1bed0 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  -op..  */.  if( 
1bee0 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  p->inTrans==TRAN
1bef0 53 5f 57 52 49 54 45 20 7c 7c 20 28 70 2d 3e 69  S_WRITE || (p->i
1bf00 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 52 45  nTrans==TRANS_RE
1bf10 41 44 20 26 26 20 21 77 72 66 6c 61 67 29 20 29  AD && !wrflag) )
1bf20 7b 0a 20 20 20 20 67 6f 74 6f 20 74 72 61 6e 73  {.    goto trans
1bf30 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 20 20 61 73  _begun;.  }.  as
1bf40 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61  sert( pBt->inTra
1bf50 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f  nsaction==TRANS_
1bf60 57 52 49 54 45 20 7c 7c 20 49 66 4e 6f 74 4f 6d  WRITE || IfNotOm
1bf70 69 74 41 56 28 70 42 74 2d 3e 62 44 6f 54 72 75  itAV(pBt->bDoTru
1bf80 6e 63 61 74 65 29 3d 3d 30 20 29 3b 0a 0a 20 20  ncate)==0 );..  
1bf90 69 66 28 20 28 70 2d 3e 64 62 2d 3e 66 6c 61 67  if( (p->db->flag
1bfa0 73 20 26 20 53 51 4c 49 54 45 5f 52 65 73 65 74  s & SQLITE_Reset
1bfb0 44 61 74 61 62 61 73 65 29 20 0a 20 20 20 26 26  Database) .   &&
1bfc0 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 72   sqlite3PagerIsr
1bfd0 65 61 64 6f 6e 6c 79 28 70 42 74 2d 3e 70 50 61  eadonly(pBt->pPa
1bfe0 67 65 72 29 3d 3d 30 20 0a 20 20 29 7b 0a 20 20  ger)==0 .  ){.  
1bff0 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20    pBt->btsFlags 
1c000 26 3d 20 7e 42 54 53 5f 52 45 41 44 5f 4f 4e 4c  &= ~BTS_READ_ONL
1c010 59 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 72 69  Y;.  }..  /* Wri
1c020 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20  te transactions 
1c030 61 72 65 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65  are not possible
1c040 20 6f 6e 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20   on a read-only 
1c050 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 66  database */.  if
1c060 28 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  ( (pBt->btsFlags
1c070 20 26 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59   & BTS_READ_ONLY
1c080 29 21 3d 30 20 26 26 20 77 72 66 6c 61 67 20 29  )!=0 && wrflag )
1c090 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
1c0a0 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20  E_READONLY;.    
1c0b0 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e  goto trans_begun
1c0c0 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53  ;.  }..#ifndef S
1c0d0 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
1c0e0 44 5f 43 41 43 48 45 0a 20 20 7b 0a 20 20 20 20  D_CACHE.  {.    
1c0f0 73 71 6c 69 74 65 33 20 2a 70 42 6c 6f 63 6b 20  sqlite3 *pBlock 
1c100 3d 20 30 3b 0a 20 20 20 20 2f 2a 20 49 66 20 61  = 0;.    /* If a
1c110 6e 6f 74 68 65 72 20 64 61 74 61 62 61 73 65 20  nother database 
1c120 68 61 6e 64 6c 65 20 68 61 73 20 61 6c 72 65 61  handle has alrea
1c130 64 79 20 6f 70 65 6e 65 64 20 61 20 77 72 69 74  dy opened a writ
1c140 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 20  e transaction . 
1c150 20 20 20 2a 2a 20 6f 6e 20 74 68 69 73 20 73 68     ** on this sh
1c160 61 72 65 64 2d 62 74 72 65 65 20 73 74 72 75 63  ared-btree struc
1c170 74 75 72 65 20 61 6e 64 20 61 20 73 65 63 6f 6e  ture and a secon
1c180 64 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  d write transact
1c190 69 6f 6e 20 69 73 0a 20 20 20 20 2a 2a 20 72 65  ion is.    ** re
1c1a0 71 75 65 73 74 65 64 2c 20 72 65 74 75 72 6e 20  quested, return 
1c1b0 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 2e 0a 20  SQLITE_LOCKED.. 
1c1c0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 77     */.    if( (w
1c1d0 72 66 6c 61 67 20 26 26 20 70 42 74 2d 3e 69 6e  rflag && pBt->in
1c1e0 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41  Transaction==TRA
1c1f0 4e 53 5f 57 52 49 54 45 29 0a 20 20 20 20 20 7c  NS_WRITE).     |
1c200 7c 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  | (pBt->btsFlags
1c210 20 26 20 42 54 53 5f 50 45 4e 44 49 4e 47 29 21   & BTS_PENDING)!
1c220 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  =0.    ){.      
1c230 70 42 6c 6f 63 6b 20 3d 20 70 42 74 2d 3e 70 57  pBlock = pBt->pW
1c240 72 69 74 65 72 2d 3e 64 62 3b 0a 20 20 20 20 7d  riter->db;.    }
1c250 65 6c 73 65 20 69 66 28 20 77 72 66 6c 61 67 3e  else if( wrflag>
1c260 31 20 29 7b 0a 20 20 20 20 20 20 42 74 4c 6f 63  1 ){.      BtLoc
1c270 6b 20 2a 70 49 74 65 72 3b 0a 20 20 20 20 20 20  k *pIter;.      
1c280 66 6f 72 28 70 49 74 65 72 3d 70 42 74 2d 3e 70  for(pIter=pBt->p
1c290 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70 49 74  Lock; pIter; pIt
1c2a0 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78 74 29  er=pIter->pNext)
1c2b0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49  {.        if( pI
1c2c0 74 65 72 2d 3e 70 42 74 72 65 65 21 3d 70 20 29  ter->pBtree!=p )
1c2d0 7b 0a 20 20 20 20 20 20 20 20 20 20 70 42 6c 6f  {.          pBlo
1c2e0 63 6b 20 3d 20 70 49 74 65 72 2d 3e 70 42 74 72  ck = pIter->pBtr
1c2f0 65 65 2d 3e 64 62 3b 0a 20 20 20 20 20 20 20 20  ee->db;.        
1c300 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
1c310 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
1c320 0a 20 20 20 20 69 66 28 20 70 42 6c 6f 63 6b 20  .    if( pBlock 
1c330 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
1c340 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63 6b 65  ConnectionBlocke
1c350 64 28 70 2d 3e 64 62 2c 20 70 42 6c 6f 63 6b 29  d(p->db, pBlock)
1c360 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  ;.      rc = SQL
1c370 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45  ITE_LOCKED_SHARE
1c380 44 43 41 43 48 45 3b 0a 20 20 20 20 20 20 67 6f  DCACHE;.      go
1c390 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a  to trans_begun;.
1c3a0 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
1c3b0 0a 0a 20 20 2f 2a 20 41 6e 79 20 72 65 61 64 2d  ..  /* Any read-
1c3c0 6f 6e 6c 79 20 6f 72 20 72 65 61 64 2d 77 72 69  only or read-wri
1c3d0 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  te transaction i
1c3e0 6d 70 6c 69 65 73 20 61 20 72 65 61 64 2d 6c 6f  mplies a read-lo
1c3f0 63 6b 20 6f 6e 20 0a 20 20 2a 2a 20 70 61 67 65  ck on .  ** page
1c400 20 31 2e 20 53 6f 20 69 66 20 73 6f 6d 65 20 6f   1. So if some o
1c410 74 68 65 72 20 73 68 61 72 65 64 2d 63 61 63 68  ther shared-cach
1c420 65 20 63 6c 69 65 6e 74 20 61 6c 72 65 61 64 79  e client already
1c430 20 68 61 73 20 61 20 77 72 69 74 65 2d 6c 6f 63   has a write-loc
1c440 6b 20 0a 20 20 2a 2a 20 6f 6e 20 70 61 67 65 20  k .  ** on page 
1c450 31 2c 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  1, the transacti
1c460 6f 6e 20 63 61 6e 6e 6f 74 20 62 65 20 6f 70 65  on cannot be ope
1c470 6e 65 64 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 71  ned. */.  rc = q
1c480 75 65 72 79 53 68 61 72 65 64 43 61 63 68 65 54  uerySharedCacheT
1c490 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 4d 41 53 54  ableLock(p, MAST
1c4a0 45 52 5f 52 4f 4f 54 2c 20 52 45 41 44 5f 4c 4f  ER_ROOT, READ_LO
1c4b0 43 4b 29 3b 0a 20 20 69 66 28 20 53 51 4c 49 54  CK);.  if( SQLIT
1c4c0 45 5f 4f 4b 21 3d 72 63 20 29 20 67 6f 74 6f 20  E_OK!=rc ) goto 
1c4d0 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 0a 20 20  trans_begun;..  
1c4e0 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d  pBt->btsFlags &=
1c4f0 20 7e 42 54 53 5f 49 4e 49 54 49 41 4c 4c 59 5f   ~BTS_INITIALLY_
1c500 45 4d 50 54 59 3b 0a 20 20 69 66 28 20 70 42 74  EMPTY;.  if( pBt
1c510 2d 3e 6e 50 61 67 65 3d 3d 30 20 29 20 70 42 74  ->nPage==0 ) pBt
1c520 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54  ->btsFlags |= BT
1c530 53 5f 49 4e 49 54 49 41 4c 4c 59 5f 45 4d 50 54  S_INITIALLY_EMPT
1c540 59 3b 0a 20 20 64 6f 20 7b 0a 20 20 20 20 2f 2a  Y;.  do {.    /*
1c550 20 43 61 6c 6c 20 6c 6f 63 6b 42 74 72 65 65 28   Call lockBtree(
1c560 29 20 75 6e 74 69 6c 20 65 69 74 68 65 72 20 70  ) until either p
1c570 42 74 2d 3e 70 50 61 67 65 31 20 69 73 20 70 6f  Bt->pPage1 is po
1c580 70 75 6c 61 74 65 64 20 6f 72 0a 20 20 20 20 2a  pulated or.    *
1c590 2a 20 6c 6f 63 6b 42 74 72 65 65 28 29 20 72 65  * lockBtree() re
1c5a0 74 75 72 6e 73 20 73 6f 6d 65 74 68 69 6e 67 20  turns something 
1c5b0 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54  other than SQLIT
1c5c0 45 5f 4f 4b 2e 20 6c 6f 63 6b 42 74 72 65 65 28  E_OK. lockBtree(
1c5d0 29 0a 20 20 20 20 2a 2a 20 6d 61 79 20 72 65 74  ).    ** may ret
1c5e0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 62 75  urn SQLITE_OK bu
1c5f0 74 20 6c 65 61 76 65 20 70 42 74 2d 3e 70 50 61  t leave pBt->pPa
1c600 67 65 31 20 73 65 74 20 74 6f 20 30 20 69 66 20  ge1 set to 0 if 
1c610 61 66 74 65 72 0a 20 20 20 20 2a 2a 20 72 65 61  after.    ** rea
1c620 64 69 6e 67 20 70 61 67 65 20 31 20 69 74 20 64  ding page 1 it d
1c630 69 73 63 6f 76 65 72 73 20 74 68 61 74 20 74 68  iscovers that th
1c640 65 20 70 61 67 65 2d 73 69 7a 65 20 6f 66 20 74  e page-size of t
1c650 68 65 20 64 61 74 61 62 61 73 65 20 0a 20 20 20  he database .   
1c660 20 2a 2a 20 66 69 6c 65 20 69 73 20 6e 6f 74 20   ** file is not 
1c670 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2e 20 49  pBt->pageSize. I
1c680 6e 20 74 68 69 73 20 63 61 73 65 20 6c 6f 63 6b  n this case lock
1c690 42 74 72 65 65 28 29 20 77 69 6c 6c 20 75 70 64  Btree() will upd
1c6a0 61 74 65 0a 20 20 20 20 2a 2a 20 70 42 74 2d 3e  ate.    ** pBt->
1c6b0 70 61 67 65 53 69 7a 65 20 74 6f 20 74 68 65 20  pageSize to the 
1c6c0 70 61 67 65 2d 73 69 7a 65 20 6f 66 20 74 68 65  page-size of the
1c6d0 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 0a 20   file on disk.. 
1c6e0 20 20 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65 28     */.    while(
1c6f0 20 70 42 74 2d 3e 70 50 61 67 65 31 3d 3d 30 20   pBt->pPage1==0 
1c700 26 26 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72  && SQLITE_OK==(r
1c710 63 20 3d 20 6c 6f 63 6b 42 74 72 65 65 28 70 42  c = lockBtree(pB
1c720 74 29 29 20 29 3b 0a 0a 20 20 20 20 69 66 28 20  t)) );..    if( 
1c730 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
1c740 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 20   wrflag ){.     
1c750 20 69 66 28 20 28 70 42 74 2d 3e 62 74 73 46 6c   if( (pBt->btsFl
1c760 61 67 73 20 26 20 42 54 53 5f 52 45 41 44 5f 4f  ags & BTS_READ_O
1c770 4e 4c 59 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  NLY)!=0 ){.     
1c780 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52     rc = SQLITE_R
1c790 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 7d  EADONLY;.      }
1c7a0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63  else{.        rc
1c7b0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 42   = sqlite3PagerB
1c7c0 65 67 69 6e 28 70 42 74 2d 3e 70 50 61 67 65 72  egin(pBt->pPager
1c7d0 2c 77 72 66 6c 61 67 3e 31 2c 73 71 6c 69 74 65  ,wrflag>1,sqlite
1c7e0 33 54 65 6d 70 49 6e 4d 65 6d 6f 72 79 28 70 2d  3TempInMemory(p-
1c7f0 3e 64 62 29 29 3b 0a 20 20 20 20 20 20 20 20 69  >db));.        i
1c800 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1c810 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
1c820 20 3d 20 6e 65 77 44 61 74 61 62 61 73 65 28 70   = newDatabase(p
1c830 42 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  Bt);.        }el
1c840 73 65 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  se if( rc==SQLIT
1c850 45 5f 42 55 53 59 5f 53 4e 41 50 53 48 4f 54 20  E_BUSY_SNAPSHOT 
1c860 26 26 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  && pBt->inTransa
1c870 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 4e 4f 4e  ction==TRANS_NON
1c880 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  E ){.          /
1c890 2a 20 69 66 20 74 68 65 72 65 20 77 61 73 20 6e  * if there was n
1c8a0 6f 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70  o transaction op
1c8b0 65 6e 65 64 20 77 68 65 6e 20 74 68 69 73 20 66  ened when this f
1c8c0 75 6e 63 74 69 6f 6e 20 77 61 73 0a 20 20 20 20  unction was.    
1c8d0 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c 65 64 20        ** called 
1c8e0 61 6e 64 20 53 51 4c 49 54 45 5f 42 55 53 59 5f  and SQLITE_BUSY_
1c8f0 53 4e 41 50 53 48 4f 54 20 69 73 20 72 65 74 75  SNAPSHOT is retu
1c900 72 6e 65 64 2c 20 63 68 61 6e 67 65 20 74 68 65  rned, change the
1c910 20 65 72 72 6f 72 0a 20 20 20 20 20 20 20 20 20   error.         
1c920 20 2a 2a 20 63 6f 64 65 20 74 6f 20 53 51 4c 49   ** code to SQLI
1c930 54 45 5f 42 55 53 59 2e 20 2a 2f 0a 20 20 20 20  TE_BUSY. */.    
1c940 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1c950 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20  E_BUSY;.        
1c960 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
1c970 20 20 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53    .    if( rc!=S
1c980 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1c990 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55    unlockBtreeIfU
1c9a0 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20 20 20  nused(pBt);.    
1c9b0 7d 0a 20 20 7d 77 68 69 6c 65 28 20 28 72 63 26  }.  }while( (rc&
1c9c0 30 78 46 46 29 3d 3d 53 51 4c 49 54 45 5f 42 55  0xFF)==SQLITE_BU
1c9d0 53 59 20 26 26 20 70 42 74 2d 3e 69 6e 54 72 61  SY && pBt->inTra
1c9e0 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f  nsaction==TRANS_
1c9f0 4e 4f 4e 45 20 26 26 0a 20 20 20 20 20 20 20 20  NONE &&.        
1ca00 20 20 62 74 72 65 65 49 6e 76 6f 6b 65 42 75 73    btreeInvokeBus
1ca10 79 48 61 6e 64 6c 65 72 28 70 42 74 29 20 29 3b  yHandler(pBt) );
1ca20 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 52  .  sqlite3PagerR
1ca30 65 73 65 74 4c 6f 63 6b 54 69 6d 65 6f 75 74 28  esetLockTimeout(
1ca40 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 0a 20  pBt->pPager);.. 
1ca50 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1ca60 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d  OK ){.    if( p-
1ca70 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
1ca80 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 70 42  NONE ){.      pB
1ca90 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2b  t->nTransaction+
1caa0 2b 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  +;.#ifndef SQLIT
1cab0 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
1cac0 43 48 45 0a 20 20 20 20 20 20 69 66 28 20 70 2d  CHE.      if( p-
1cad0 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20  >sharable ){.   
1cae0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
1caf0 6c 6f 63 6b 2e 70 42 74 72 65 65 3d 3d 70 20 26  lock.pBtree==p &
1cb00 26 20 70 2d 3e 6c 6f 63 6b 2e 69 54 61 62 6c 65  & p->lock.iTable
1cb10 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 70  ==1 );.        p
1cb20 2d 3e 6c 6f 63 6b 2e 65 4c 6f 63 6b 20 3d 20 52  ->lock.eLock = R
1cb30 45 41 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20  EAD_LOCK;.      
1cb40 20 20 70 2d 3e 6c 6f 63 6b 2e 70 4e 65 78 74 20    p->lock.pNext 
1cb50 3d 20 70 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 20 20  = pBt->pLock;.  
1cb60 20 20 20 20 20 20 70 42 74 2d 3e 70 4c 6f 63 6b        pBt->pLock
1cb70 20 3d 20 26 70 2d 3e 6c 6f 63 6b 3b 0a 20 20 20   = &p->lock;.   
1cb80 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
1cb90 7d 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e 73  }.    p->inTrans
1cba0 20 3d 20 28 77 72 66 6c 61 67 3f 54 52 41 4e 53   = (wrflag?TRANS
1cbb0 5f 57 52 49 54 45 3a 54 52 41 4e 53 5f 52 45 41  _WRITE:TRANS_REA
1cbc0 44 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69  D);.    if( p->i
1cbd0 6e 54 72 61 6e 73 3e 70 42 74 2d 3e 69 6e 54 72  nTrans>pBt->inTr
1cbe0 61 6e 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20  ansaction ){.   
1cbf0 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61     pBt->inTransa
1cc00 63 74 69 6f 6e 20 3d 20 70 2d 3e 69 6e 54 72 61  ction = p->inTra
1cc10 6e 73 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ns;.    }.    if
1cc20 28 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20  ( wrflag ){.    
1cc30 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
1cc40 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b  1 = pBt->pPage1;
1cc50 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1cc60 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
1cc70 45 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  E.      assert( 
1cc80 21 70 42 74 2d 3e 70 57 72 69 74 65 72 20 29 3b  !pBt->pWriter );
1cc90 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 57 72 69  .      pBt->pWri
1cca0 74 65 72 20 3d 20 70 3b 0a 20 20 20 20 20 20 70  ter = p;.      p
1ccb0 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d 20  Bt->btsFlags &= 
1ccc0 7e 42 54 53 5f 45 58 43 4c 55 53 49 56 45 3b 0a  ~BTS_EXCLUSIVE;.
1ccd0 20 20 20 20 20 20 69 66 28 20 77 72 66 6c 61 67        if( wrflag
1cce0 3e 31 20 29 20 70 42 74 2d 3e 62 74 73 46 6c 61  >1 ) pBt->btsFla
1ccf0 67 73 20 7c 3d 20 42 54 53 5f 45 58 43 4c 55 53  gs |= BTS_EXCLUS
1cd00 49 56 45 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20  IVE;.#endif..   
1cd10 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64 62 2d     /* If the db-
1cd20 73 69 7a 65 20 68 65 61 64 65 72 20 66 69 65 6c  size header fiel
1cd30 64 20 69 73 20 69 6e 63 6f 72 72 65 63 74 20 28  d is incorrect (
1cd40 61 73 20 69 74 20 6d 61 79 20 62 65 20 69 66 20  as it may be if 
1cd50 61 6e 20 6f 6c 64 0a 20 20 20 20 20 20 2a 2a 20  an old.      ** 
1cd60 63 6c 69 65 6e 74 20 68 61 73 20 62 65 65 6e 20  client has been 
1cd70 77 72 69 74 69 6e 67 20 74 68 65 20 64 61 74 61  writing the data
1cd80 62 61 73 65 20 66 69 6c 65 29 2c 20 75 70 64 61  base file), upda
1cd90 74 65 20 69 74 20 6e 6f 77 2e 20 44 6f 69 6e 67  te it now. Doing
1cda0 0a 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 73  .      ** this s
1cdb0 6f 6f 6e 65 72 20 72 61 74 68 65 72 20 74 68 61  ooner rather tha
1cdc0 6e 20 6c 61 74 65 72 20 6d 65 61 6e 73 20 74 68  n later means th
1cdd0 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20  e database size 
1cde0 63 61 6e 20 73 61 66 65 6c 79 20 0a 20 20 20 20  can safely .    
1cdf0 20 20 2a 2a 20 72 65 2d 72 65 61 64 20 74 68 65    ** re-read the
1ce00 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 66   database size f
1ce10 72 6f 6d 20 70 61 67 65 20 31 20 69 66 20 61 20  rom page 1 if a 
1ce20 73 61 76 65 70 6f 69 6e 74 20 6f 72 20 74 72 61  savepoint or tra
1ce30 6e 73 61 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a  nsaction.      *
1ce40 2a 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72  * rollback occur
1ce50 73 20 77 69 74 68 69 6e 20 74 68 65 20 74 72 61  s within the tra
1ce60 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20  nsaction..      
1ce70 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 42 74  */.      if( pBt
1ce80 2d 3e 6e 50 61 67 65 21 3d 67 65 74 34 62 79 74  ->nPage!=get4byt
1ce90 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  e(&pPage1->aData
1cea0 5b 32 38 5d 29 20 29 7b 0a 20 20 20 20 20 20 20  [28]) ){.       
1ceb0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
1cec0 65 72 57 72 69 74 65 28 70 50 61 67 65 31 2d 3e  erWrite(pPage1->
1ced0 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
1cee0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1cef0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
1cf00 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65   put4byte(&pPage
1cf10 31 2d 3e 61 44 61 74 61 5b 32 38 5d 2c 20 70 42  1->aData[28], pB
1cf20 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20 20  t->nPage);.     
1cf30 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
1cf40 20 7d 0a 20 20 7d 0a 0a 74 72 61 6e 73 5f 62 65   }.  }..trans_be
1cf50 67 75 6e 3a 0a 20 20 69 66 28 20 72 63 3d 3d 53  gun:.  if( rc==S
1cf60 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1cf70 69 66 28 20 70 53 63 68 65 6d 61 56 65 72 73 69  if( pSchemaVersi
1cf80 6f 6e 20 29 7b 0a 20 20 20 20 20 20 2a 70 53 63  on ){.      *pSc
1cf90 68 65 6d 61 56 65 72 73 69 6f 6e 20 3d 20 67 65  hemaVersion = ge
1cfa0 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61  t4byte(&pBt->pPa
1cfb0 67 65 31 2d 3e 61 44 61 74 61 5b 34 30 5d 29 3b  ge1->aData[40]);
1cfc0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 77  .    }.    if( w
1cfd0 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 2f  rflag ){.      /
1cfe0 2a 20 54 68 69 73 20 63 61 6c 6c 20 6d 61 6b 65  * This call make
1cff0 73 20 73 75 72 65 20 74 68 61 74 20 74 68 65 20  s sure that the 
1d000 70 61 67 65 72 20 68 61 73 20 74 68 65 20 63 6f  pager has the co
1d010 72 72 65 63 74 20 6e 75 6d 62 65 72 20 6f 66 0a  rrect number of.
1d020 20 20 20 20 20 20 2a 2a 20 6f 70 65 6e 20 73 61        ** open sa
1d030 76 65 70 6f 69 6e 74 73 2e 20 49 66 20 74 68 65  vepoints. If the
1d040 20 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65   second paramete
1d050 72 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  r is greater tha
1d060 6e 20 30 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a  n 0 and.      **
1d070 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
1d080 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
1d090 6f 70 65 6e 2c 20 74 68 65 6e 20 69 74 20 77 69  open, then it wi
1d0a0 6c 6c 20 62 65 20 6f 70 65 6e 65 64 20 68 65 72  ll be opened her
1d0b0 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
1d0c0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1d0d0 67 65 72 4f 70 65 6e 53 61 76 65 70 6f 69 6e 74  gerOpenSavepoint
1d0e0 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 2d  (pBt->pPager, p-
1d0f0 3e 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 29  >db->nSavepoint)
1d100 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 62  ;.    }.  }..  b
1d110 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29  treeIntegrity(p)
1d120 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
1d130 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
1d140 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65  rn rc;.}..#ifnde
1d150 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
1d160 54 4f 56 41 43 55 55 4d 0a 0a 2f 2a 0a 2a 2a 20  TOVACUUM../*.** 
1d170 53 65 74 20 74 68 65 20 70 6f 69 6e 74 65 72 2d  Set the pointer-
1d180 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20  map entries for 
1d190 61 6c 6c 20 63 68 69 6c 64 72 65 6e 20 6f 66 20  all children of 
1d1a0 70 61 67 65 20 70 50 61 67 65 2e 20 41 6c 73 6f  page pPage. Also
1d1b0 2c 20 69 66 0a 2a 2a 20 70 50 61 67 65 20 63 6f  , if.** pPage co
1d1c0 6e 74 61 69 6e 73 20 63 65 6c 6c 73 20 74 68 61  ntains cells tha
1d1d0 74 20 70 6f 69 6e 74 20 74 6f 20 6f 76 65 72 66  t point to overf
1d1e0 6c 6f 77 20 70 61 67 65 73 2c 20 73 65 74 20 74  low pages, set t
1d1f0 68 65 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 6d 61  he pointer.** ma
1d200 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20 74 68  p entries for th
1d210 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  e overflow pages
1d220 20 61 73 20 77 65 6c 6c 2e 0a 2a 2f 0a 73 74 61   as well..*/.sta
1d230 74 69 63 20 69 6e 74 20 73 65 74 43 68 69 6c 64  tic int setChild
1d240 50 74 72 6d 61 70 73 28 4d 65 6d 50 61 67 65 20  Ptrmaps(MemPage 
1d250 2a 70 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 69  *pPage){.  int i
1d260 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1d270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1d280 20 43 6f 75 6e 74 65 72 20 76 61 72 69 61 62 6c   Counter variabl
1d290 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c  e */.  int nCell
1d2a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1d2b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
1d2c0 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 69 6e 20  ber of cells in 
1d2d0 70 61 67 65 20 70 50 61 67 65 20 2a 2f 0a 20 20  page pPage */.  
1d2e0 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
1d2f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d300 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
1d310 65 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20  e */.  BtShared 
1d320 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42  *pBt = pPage->pB
1d330 74 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d  t;.  Pgno pgno =
1d340 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a 0a 20   pPage->pgno;.. 
1d350 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
1d360 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
1d370 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
1d380 3b 0a 20 20 72 63 20 3d 20 70 50 61 67 65 2d 3e  ;.  rc = pPage->
1d390 69 73 49 6e 69 74 20 3f 20 53 51 4c 49 54 45 5f  isInit ? SQLITE_
1d3a0 4f 4b 20 3a 20 62 74 72 65 65 49 6e 69 74 50 61  OK : btreeInitPa
1d3b0 67 65 28 70 50 61 67 65 29 3b 0a 20 20 69 66 28  ge(pPage);.  if(
1d3c0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1d3d0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 6e 43   return rc;.  nC
1d3e0 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65  ell = pPage->nCe
1d3f0 6c 6c 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20  ll;..  for(i=0; 
1d400 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20  i<nCell; i++){. 
1d410 20 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20 66     u8 *pCell = f
1d420 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69  indCell(pPage, i
1d430 29 3b 0a 0a 20 20 20 20 70 74 72 6d 61 70 50 75  );..    ptrmapPu
1d440 74 4f 76 66 6c 50 74 72 28 70 50 61 67 65 2c 20  tOvflPtr(pPage, 
1d450 70 43 65 6c 6c 2c 20 26 72 63 29 3b 0a 0a 20 20  pCell, &rc);..  
1d460 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
1d470 61 66 20 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f  af ){.      Pgno
1d480 20 63 68 69 6c 64 50 67 6e 6f 20 3d 20 67 65 74   childPgno = get
1d490 34 62 79 74 65 28 70 43 65 6c 6c 29 3b 0a 20 20  4byte(pCell);.  
1d4a0 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42      ptrmapPut(pB
1d4b0 74 2c 20 63 68 69 6c 64 50 67 6e 6f 2c 20 50 54  t, childPgno, PT
1d4c0 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 67 6e 6f  RMAP_BTREE, pgno
1d4d0 2c 20 26 72 63 29 3b 0a 20 20 20 20 7d 0a 20 20  , &rc);.    }.  
1d4e0 7d 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d  }..  if( !pPage-
1d4f0 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 50 67 6e  >leaf ){.    Pgn
1d500 6f 20 63 68 69 6c 64 50 67 6e 6f 20 3d 20 67 65  o childPgno = ge
1d510 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61  t4byte(&pPage->a
1d520 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f  Data[pPage->hdrO
1d530 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 70  ffset+8]);.    p
1d540 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 63 68  trmapPut(pBt, ch
1d550 69 6c 64 50 67 6e 6f 2c 20 50 54 52 4d 41 50 5f  ildPgno, PTRMAP_
1d560 42 54 52 45 45 2c 20 70 67 6e 6f 2c 20 26 72 63  BTREE, pgno, &rc
1d570 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  );.  }..  return
1d580 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f   rc;.}../*.** So
1d590 6d 65 77 68 65 72 65 20 6f 6e 20 70 50 61 67 65  mewhere on pPage
1d5a0 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
1d5b0 20 70 61 67 65 20 69 46 72 6f 6d 2e 20 20 4d 6f   page iFrom.  Mo
1d5c0 64 69 66 79 20 74 68 69 73 20 70 6f 69 6e 74 65  dify this pointe
1d5d0 72 20 73 6f 0a 2a 2a 20 74 68 61 74 20 69 74 20  r so.** that it 
1d5e0 70 6f 69 6e 74 73 20 74 6f 20 69 54 6f 2e 20 50  points to iTo. P
1d5f0 61 72 61 6d 65 74 65 72 20 65 54 79 70 65 20 64  arameter eType d
1d600 65 73 63 72 69 62 65 73 20 74 68 65 20 74 79 70  escribes the typ
1d610 65 20 6f 66 20 70 6f 69 6e 74 65 72 20 74 6f 0a  e of pointer to.
1d620 2a 2a 20 62 65 20 6d 6f 64 69 66 69 65 64 2c 20  ** be modified, 
1d630 61 73 20 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a  as  follows:.**.
1d640 2a 2a 20 50 54 52 4d 41 50 5f 42 54 52 45 45 3a  ** PTRMAP_BTREE:
1d650 20 20 20 20 20 70 50 61 67 65 20 69 73 20 61 20       pPage is a 
1d660 62 74 72 65 65 2d 70 61 67 65 2e 20 54 68 65 20  btree-page. The 
1d670 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20 61  pointer points a
1d680 74 20 61 20 63 68 69 6c 64 20 0a 2a 2a 20 20 20  t a child .**   
1d690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d6a0 70 61 67 65 20 6f 66 20 70 50 61 67 65 2e 0a 2a  page of pPage..*
1d6b0 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f 56 45 52  *.** PTRMAP_OVER
1d6c0 46 4c 4f 57 31 3a 20 70 50 61 67 65 20 69 73 20  FLOW1: pPage is 
1d6d0 61 20 62 74 72 65 65 2d 70 61 67 65 2e 20 54 68  a btree-page. Th
1d6e0 65 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73  e pointer points
1d6f0 20 61 74 20 61 6e 20 6f 76 65 72 66 6c 6f 77 0a   at an overflow.
1d700 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
1d710 20 20 20 20 20 70 61 67 65 20 70 6f 69 6e 74 65       page pointe
1d720 64 20 74 6f 20 62 79 20 6f 6e 65 20 6f 66 20 74  d to by one of t
1d730 68 65 20 63 65 6c 6c 73 20 6f 6e 20 70 50 61 67  he cells on pPag
1d740 65 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f  e..**.** PTRMAP_
1d750 4f 56 45 52 46 4c 4f 57 32 3a 20 70 50 61 67 65  OVERFLOW2: pPage
1d760 20 69 73 20 61 6e 20 6f 76 65 72 66 6c 6f 77 2d   is an overflow-
1d770 70 61 67 65 2e 20 54 68 65 20 70 6f 69 6e 74 65  page. The pointe
1d780 72 20 70 6f 69 6e 74 73 20 61 74 20 74 68 65 20  r points at the 
1d790 6e 65 78 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  next.**         
1d7a0 20 20 20 20 20 20 20 20 20 20 6f 76 65 72 66 6c            overfl
1d7b0 6f 77 20 70 61 67 65 20 69 6e 20 74 68 65 20 6c  ow page in the l
1d7c0 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ist..*/.static i
1d7d0 6e 74 20 6d 6f 64 69 66 79 50 61 67 65 50 6f 69  nt modifyPagePoi
1d7e0 6e 74 65 72 28 4d 65 6d 50 61 67 65 20 2a 70 50  nter(MemPage *pP
1d7f0 61 67 65 2c 20 50 67 6e 6f 20 69 46 72 6f 6d 2c  age, Pgno iFrom,
1d800 20 50 67 6e 6f 20 69 54 6f 2c 20 75 38 20 65 54   Pgno iTo, u8 eT
1d810 79 70 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20  ype){.  assert( 
1d820 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
1d830 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
1d840 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
1d850 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
1d860 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
1d870 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
1d880 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41  if( eType==PTRMA
1d890 50 5f 4f 56 45 52 46 4c 4f 57 32 20 29 7b 0a 20  P_OVERFLOW2 ){. 
1d8a0 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65     /* The pointe
1d8b0 72 20 69 73 20 61 6c 77 61 79 73 20 74 68 65 20  r is always the 
1d8c0 66 69 72 73 74 20 34 20 62 79 74 65 73 20 6f 66  first 4 bytes of
1d8d0 20 74 68 65 20 70 61 67 65 20 69 6e 20 74 68 69   the page in thi
1d8e0 73 20 63 61 73 65 2e 20 20 2a 2f 0a 20 20 20 20  s case.  */.    
1d8f0 69 66 28 20 67 65 74 34 62 79 74 65 28 70 50 61  if( get4byte(pPa
1d900 67 65 2d 3e 61 44 61 74 61 29 21 3d 69 46 72 6f  ge->aData)!=iFro
1d910 6d 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  m ){.      retur
1d920 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
1d930 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20  _PAGE(pPage);.  
1d940 20 20 7d 0a 20 20 20 20 70 75 74 34 62 79 74 65    }.    put4byte
1d950 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 69  (pPage->aData, i
1d960 54 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  To);.  }else{.  
1d970 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74    int i;.    int
1d980 20 6e 43 65 6c 6c 3b 0a 20 20 20 20 69 6e 74 20   nCell;.    int 
1d990 72 63 3b 0a 0a 20 20 20 20 72 63 20 3d 20 70 50  rc;..    rc = pP
1d9a0 61 67 65 2d 3e 69 73 49 6e 69 74 20 3f 20 53 51  age->isInit ? SQ
1d9b0 4c 49 54 45 5f 4f 4b 20 3a 20 62 74 72 65 65 49  LITE_OK : btreeI
1d9c0 6e 69 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a  nitPage(pPage);.
1d9d0 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
1d9e0 75 72 6e 20 72 63 3b 0a 20 20 20 20 6e 43 65 6c  urn rc;.    nCel
1d9f0 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  l = pPage->nCell
1da00 3b 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ;..    for(i=0; 
1da10 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20  i<nCell; i++){. 
1da20 20 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d       u8 *pCell =
1da30 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c   findCell(pPage,
1da40 20 69 29 3b 0a 20 20 20 20 20 20 69 66 28 20 65   i);.      if( e
1da50 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45  Type==PTRMAP_OVE
1da60 52 46 4c 4f 57 31 20 29 7b 0a 20 20 20 20 20 20  RFLOW1 ){.      
1da70 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b    CellInfo info;
1da80 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 2d 3e  .        pPage->
1da90 78 50 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65  xParseCell(pPage
1daa0 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b  , pCell, &info);
1dab0 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 6e 66  .        if( inf
1dac0 6f 2e 6e 4c 6f 63 61 6c 3c 69 6e 66 6f 2e 6e 50  o.nLocal<info.nP
1dad0 61 79 6c 6f 61 64 20 29 7b 0a 20 20 20 20 20 20  ayload ){.      
1dae0 20 20 20 20 69 66 28 20 70 43 65 6c 6c 2b 69 6e      if( pCell+in
1daf0 66 6f 2e 6e 53 69 7a 65 20 3e 20 70 50 61 67 65  fo.nSize > pPage
1db00 2d 3e 61 44 61 74 61 2b 70 50 61 67 65 2d 3e 70  ->aData+pPage->p
1db10 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29  Bt->usableSize )
1db20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  {.            re
1db30 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
1db40 55 50 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b  UPT_PAGE(pPage);
1db50 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
1db60 20 20 20 20 20 20 20 69 66 28 20 69 46 72 6f 6d         if( iFrom
1db70 3d 3d 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c  ==get4byte(pCell
1db80 2b 69 6e 66 6f 2e 6e 53 69 7a 65 2d 34 29 20 29  +info.nSize-4) )
1db90 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 75  {.            pu
1dba0 74 34 62 79 74 65 28 70 43 65 6c 6c 2b 69 6e 66  t4byte(pCell+inf
1dbb0 6f 2e 6e 53 69 7a 65 2d 34 2c 20 69 54 6f 29 3b  o.nSize-4, iTo);
1dbc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  .            bre
1dbd0 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ak;.          }.
1dbe0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1dbf0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69  }else{.        i
1dc00 66 28 20 67 65 74 34 62 79 74 65 28 70 43 65 6c  f( get4byte(pCel
1dc10 6c 29 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20  l)==iFrom ){.   
1dc20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
1dc30 70 43 65 6c 6c 2c 20 69 54 6f 29 3b 0a 20 20 20  pCell, iTo);.   
1dc40 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
1dc50 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
1dc60 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28      }.  .    if(
1dc70 20 69 3d 3d 6e 43 65 6c 6c 20 29 7b 0a 20 20 20   i==nCell ){.   
1dc80 20 20 20 69 66 28 20 65 54 79 70 65 21 3d 50 54     if( eType!=PT
1dc90 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20 0a 20  RMAP_BTREE || . 
1dca0 20 20 20 20 20 20 20 20 20 67 65 74 34 62 79 74           get4byt
1dcb0 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e(&pPage->aData[
1dcc0 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
1dcd0 2b 38 5d 29 21 3d 69 46 72 6f 6d 20 29 7b 0a 20  +8])!=iFrom ){. 
1dce0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
1dcf0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47  LITE_CORRUPT_PAG
1dd00 45 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20  E(pPage);.      
1dd10 7d 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65  }.      put4byte
1dd20 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  (&pPage->aData[p
1dd30 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
1dd40 38 5d 2c 20 69 54 6f 29 3b 0a 20 20 20 20 7d 0a  8], iTo);.    }.
1dd50 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
1dd60 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  ITE_OK;.}.../*.*
1dd70 2a 20 4d 6f 76 65 20 74 68 65 20 6f 70 65 6e 20  * Move the open 
1dd80 64 61 74 61 62 61 73 65 20 70 61 67 65 20 70 44  database page pD
1dd90 62 50 61 67 65 20 74 6f 20 6c 6f 63 61 74 69 6f  bPage to locatio
1dda0 6e 20 69 46 72 65 65 50 61 67 65 20 69 6e 20 74  n iFreePage in t
1ddb0 68 65 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 2e  he .** database.
1ddc0 20 54 68 65 20 70 44 62 50 61 67 65 20 72 65 66   The pDbPage ref
1ddd0 65 72 65 6e 63 65 20 72 65 6d 61 69 6e 73 20 76  erence remains v
1dde0 61 6c 69 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  alid..**.** The 
1ddf0 69 73 43 6f 6d 6d 69 74 20 66 6c 61 67 20 69 6e  isCommit flag in
1de00 64 69 63 61 74 65 73 20 74 68 61 74 20 74 68 65  dicates that the
1de10 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f  re is no need to
1de20 20 72 65 6d 65 6d 62 65 72 20 74 68 61 74 0a 2a   remember that.*
1de30 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6e 65  * the journal ne
1de40 65 64 73 20 74 6f 20 62 65 20 73 79 6e 63 28 29  eds to be sync()
1de50 65 64 20 62 65 66 6f 72 65 20 64 61 74 61 62 61  ed before databa
1de60 73 65 20 70 61 67 65 20 70 44 62 50 61 67 65 2d  se page pDbPage-
1de70 3e 70 67 6e 6f 20 0a 2a 2a 20 63 61 6e 20 62 65  >pgno .** can be
1de80 20 77 72 69 74 74 65 6e 20 74 6f 2e 20 54 68 65   written to. The
1de90 20 63 61 6c 6c 65 72 20 68 61 73 20 61 6c 72 65   caller has alre
1dea0 61 64 79 20 70 72 6f 6d 69 73 65 64 20 6e 6f 74  ady promised not
1deb0 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68 61   to write to tha
1dec0 74 0a 2a 2a 20 70 61 67 65 2e 0a 2a 2f 0a 73 74  t.** page..*/.st
1ded0 61 74 69 63 20 69 6e 74 20 72 65 6c 6f 63 61 74  atic int relocat
1dee0 65 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65  ePage(.  BtShare
1def0 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20  d *pBt,         
1df00 20 20 2f 2a 20 42 74 72 65 65 20 2a 2f 0a 20 20    /* Btree */.  
1df10 4d 65 6d 50 61 67 65 20 2a 70 44 62 50 61 67 65  MemPage *pDbPage
1df20 2c 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e  ,        /* Open
1df30 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20 2a 2f   page to move */
1df40 0a 20 20 75 38 20 65 54 79 70 65 2c 20 20 20 20  .  u8 eType,    
1df50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
1df60 6f 69 6e 74 65 72 20 6d 61 70 20 27 74 79 70 65  ointer map 'type
1df70 27 20 65 6e 74 72 79 20 66 6f 72 20 70 44 62 50  ' entry for pDbP
1df80 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 50  age */.  Pgno iP
1df90 74 72 50 61 67 65 2c 20 20 20 20 20 20 20 20 20  trPage,         
1dfa0 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70    /* Pointer map
1dfb0 20 27 70 61 67 65 2d 6e 6f 27 20 65 6e 74 72 79   'page-no' entry
1dfc0 20 66 6f 72 20 70 44 62 50 61 67 65 20 2a 2f 0a   for pDbPage */.
1dfd0 20 20 50 67 6e 6f 20 69 46 72 65 65 50 61 67 65    Pgno iFreePage
1dfe0 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ,          /* Th
1dff0 65 20 6c 6f 63 61 74 69 6f 6e 20 74 6f 20 6d 6f  e location to mo
1e000 76 65 20 70 44 62 50 61 67 65 20 74 6f 20 2a 2f  ve pDbPage to */
1e010 0a 20 20 69 6e 74 20 69 73 43 6f 6d 6d 69 74 20  .  int isCommit 
1e020 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69              /* i
1e030 73 43 6f 6d 6d 69 74 20 66 6c 61 67 20 70 61 73  sCommit flag pas
1e040 73 65 64 20 74 6f 20 73 71 6c 69 74 65 33 50 61  sed to sqlite3Pa
1e050 67 65 72 4d 6f 76 65 70 61 67 65 20 2a 2f 0a 29  gerMovepage */.)
1e060 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 74  {.  MemPage *pPt
1e070 72 50 61 67 65 3b 20 20 20 2f 2a 20 54 68 65 20  rPage;   /* The 
1e080 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69  page that contai
1e090 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ns a pointer to 
1e0a0 70 44 62 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e  pDbPage */.  Pgn
1e0b0 6f 20 69 44 62 50 61 67 65 20 3d 20 70 44 62 50  o iDbPage = pDbP
1e0c0 61 67 65 2d 3e 70 67 6e 6f 3b 0a 20 20 50 61 67  age->pgno;.  Pag
1e0d0 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 42 74  er *pPager = pBt
1e0e0 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20  ->pPager;.  int 
1e0f0 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 65  rc;..  assert( e
1e100 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45  Type==PTRMAP_OVE
1e110 52 46 4c 4f 57 32 20 7c 7c 20 65 54 79 70 65 3d  RFLOW2 || eType=
1e120 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57  =PTRMAP_OVERFLOW
1e130 31 20 7c 7c 20 0a 20 20 20 20 20 20 65 54 79 70  1 || .      eTyp
1e140 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20  e==PTRMAP_BTREE 
1e150 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  || eType==PTRMAP
1e160 5f 52 4f 4f 54 50 41 47 45 20 29 3b 0a 20 20 61  _ROOTPAGE );.  a
1e170 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
1e180 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
1e190 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
1e1a0 74 28 20 70 44 62 50 61 67 65 2d 3e 70 42 74 3d  t( pDbPage->pBt=
1e1b0 3d 70 42 74 20 29 3b 0a 20 20 69 66 28 20 69 44  =pBt );.  if( iD
1e1c0 62 50 61 67 65 3c 33 20 29 20 72 65 74 75 72 6e  bPage<3 ) return
1e1d0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
1e1e0 42 4b 50 54 3b 0a 0a 20 20 2f 2a 20 4d 6f 76 65  BKPT;..  /* Move
1e1f0 20 70 61 67 65 20 69 44 62 50 61 67 65 20 66 72   page iDbPage fr
1e200 6f 6d 20 69 74 73 20 63 75 72 72 65 6e 74 20 6c  om its current l
1e210 6f 63 61 74 69 6f 6e 20 74 6f 20 70 61 67 65 20  ocation to page 
1e220 6e 75 6d 62 65 72 20 69 46 72 65 65 50 61 67 65  number iFreePage
1e230 20 2a 2f 0a 20 20 54 52 41 43 45 28 28 22 41 55   */.  TRACE(("AU
1e240 54 4f 56 41 43 55 55 4d 3a 20 4d 6f 76 69 6e 67  TOVACUUM: Moving
1e250 20 25 64 20 74 6f 20 66 72 65 65 20 70 61 67 65   %d to free page
1e260 20 25 64 20 28 70 74 72 20 70 61 67 65 20 25 64   %d (ptr page %d
1e270 20 74 79 70 65 20 25 64 29 5c 6e 22 2c 20 0a 20   type %d)\n", . 
1e280 20 20 20 20 20 69 44 62 50 61 67 65 2c 20 69 46       iDbPage, iF
1e290 72 65 65 50 61 67 65 2c 20 69 50 74 72 50 61 67  reePage, iPtrPag
1e2a0 65 2c 20 65 54 79 70 65 29 29 3b 0a 20 20 72 63  e, eType));.  rc
1e2b0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d   = sqlite3PagerM
1e2c0 6f 76 65 70 61 67 65 28 70 50 61 67 65 72 2c 20  ovepage(pPager, 
1e2d0 70 44 62 50 61 67 65 2d 3e 70 44 62 50 61 67 65  pDbPage->pDbPage
1e2e0 2c 20 69 46 72 65 65 50 61 67 65 2c 20 69 73 43  , iFreePage, isC
1e2f0 6f 6d 6d 69 74 29 3b 0a 20 20 69 66 28 20 72 63  ommit);.  if( rc
1e300 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1e310 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1e320 7d 0a 20 20 70 44 62 50 61 67 65 2d 3e 70 67 6e  }.  pDbPage->pgn
1e330 6f 20 3d 20 69 46 72 65 65 50 61 67 65 3b 0a 0a  o = iFreePage;..
1e340 20 20 2f 2a 20 49 66 20 70 44 62 50 61 67 65 20    /* If pDbPage 
1e350 77 61 73 20 61 20 62 74 72 65 65 2d 70 61 67 65  was a btree-page
1e360 2c 20 74 68 65 6e 20 69 74 20 6d 61 79 20 68 61  , then it may ha
1e370 76 65 20 63 68 69 6c 64 20 70 61 67 65 73 20 61  ve child pages a
1e380 6e 64 2f 6f 72 20 63 65 6c 6c 73 0a 20 20 2a 2a  nd/or cells.  **
1e390 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f   that point to o
1e3a0 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 54  verflow pages. T
1e3b0 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65  he pointer map e
1e3c0 6e 74 72 69 65 73 20 66 6f 72 20 61 6c 6c 20 74  ntries for all t
1e3d0 68 65 73 65 0a 20 20 2a 2a 20 70 61 67 65 73 20  hese.  ** pages 
1e3e0 6e 65 65 64 20 74 6f 20 62 65 20 63 68 61 6e 67  need to be chang
1e3f0 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  ed..  **.  ** If
1e400 20 70 44 62 50 61 67 65 20 69 73 20 61 6e 20 6f   pDbPage is an o
1e410 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 74 68  verflow page, th
1e420 65 6e 20 74 68 65 20 66 69 72 73 74 20 34 20 62  en the first 4 b
1e430 79 74 65 73 20 6d 61 79 20 73 74 6f 72 65 20 61  ytes may store a
1e440 0a 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20 74 6f  .  ** pointer to
1e450 20 61 20 73 75 62 73 65 71 75 65 6e 74 20 6f 76   a subsequent ov
1e460 65 72 66 6c 6f 77 20 70 61 67 65 2e 20 49 66 20  erflow page. If 
1e470 74 68 69 73 20 69 73 20 74 68 65 20 63 61 73 65  this is the case
1e480 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 74 68 65 20  , then.  ** the 
1e490 70 6f 69 6e 74 65 72 20 6d 61 70 20 6e 65 65 64  pointer map need
1e4a0 73 20 74 6f 20 62 65 20 75 70 64 61 74 65 64 20  s to be updated 
1e4b0 66 6f 72 20 74 68 65 20 73 75 62 73 65 71 75 65  for the subseque
1e4c0 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  nt overflow page
1e4d0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 54 79  ..  */.  if( eTy
1e4e0 70 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45 45  pe==PTRMAP_BTREE
1e4f0 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41   || eType==PTRMA
1e500 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20  P_ROOTPAGE ){.  
1e510 20 20 72 63 20 3d 20 73 65 74 43 68 69 6c 64 50    rc = setChildP
1e520 74 72 6d 61 70 73 28 70 44 62 50 61 67 65 29 3b  trmaps(pDbPage);
1e530 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
1e540 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1e550 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
1e560 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 50 67  .  }else{.    Pg
1e570 6e 6f 20 6e 65 78 74 4f 76 66 6c 20 3d 20 67 65  no nextOvfl = ge
1e580 74 34 62 79 74 65 28 70 44 62 50 61 67 65 2d 3e  t4byte(pDbPage->
1e590 61 44 61 74 61 29 3b 0a 20 20 20 20 69 66 28 20  aData);.    if( 
1e5a0 6e 65 78 74 4f 76 66 6c 21 3d 30 20 29 7b 0a 20  nextOvfl!=0 ){. 
1e5b0 20 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70       ptrmapPut(p
1e5c0 42 74 2c 20 6e 65 78 74 4f 76 66 6c 2c 20 50 54  Bt, nextOvfl, PT
1e5d0 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 2c 20  RMAP_OVERFLOW2, 
1e5e0 69 46 72 65 65 50 61 67 65 2c 20 26 72 63 29 3b  iFreePage, &rc);
1e5f0 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
1e600 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1e610 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1e620 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
1e630 0a 0a 20 20 2f 2a 20 46 69 78 20 74 68 65 20 64  ..  /* Fix the d
1e640 61 74 61 62 61 73 65 20 70 6f 69 6e 74 65 72 20  atabase pointer 
1e650 6f 6e 20 70 61 67 65 20 69 50 74 72 50 61 67 65  on page iPtrPage
1e660 20 74 68 61 74 20 70 6f 69 6e 74 65 64 20 61 74   that pointed at
1e670 20 69 44 62 50 61 67 65 20 73 6f 0a 20 20 2a 2a   iDbPage so.  **
1e680 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20   that it points 
1e690 61 74 20 69 46 72 65 65 50 61 67 65 2e 20 41 6c  at iFreePage. Al
1e6a0 73 6f 20 66 69 78 20 74 68 65 20 70 6f 69 6e 74  so fix the point
1e6b0 65 72 20 6d 61 70 20 65 6e 74 72 79 20 66 6f 72  er map entry for
1e6c0 0a 20 20 2a 2a 20 69 50 74 72 50 61 67 65 2e 0a  .  ** iPtrPage..
1e6d0 20 20 2a 2f 0a 20 20 69 66 28 20 65 54 79 70 65    */.  if( eType
1e6e0 21 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47  !=PTRMAP_ROOTPAG
1e6f0 45 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 62 74  E ){.    rc = bt
1e700 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
1e710 69 50 74 72 50 61 67 65 2c 20 26 70 50 74 72 50  iPtrPage, &pPtrP
1e720 61 67 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  age, 0);.    if(
1e730 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1e740 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
1e750 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  c;.    }.    rc 
1e760 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
1e770 69 74 65 28 70 50 74 72 50 61 67 65 2d 3e 70 44  ite(pPtrPage->pD
1e780 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
1e790 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1e7a0 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
1e7b0 67 65 28 70 50 74 72 50 61 67 65 29 3b 0a 20 20  ge(pPtrPage);.  
1e7c0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1e7d0 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 6d 6f     }.    rc = mo
1e7e0 64 69 66 79 50 61 67 65 50 6f 69 6e 74 65 72 28  difyPagePointer(
1e7f0 70 50 74 72 50 61 67 65 2c 20 69 44 62 50 61 67  pPtrPage, iDbPag
1e800 65 2c 20 69 46 72 65 65 50 61 67 65 2c 20 65 54  e, iFreePage, eT
1e810 79 70 65 29 3b 0a 20 20 20 20 72 65 6c 65 61 73  ype);.    releas
1e820 65 50 61 67 65 28 70 50 74 72 50 61 67 65 29 3b  ePage(pPtrPage);
1e830 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
1e840 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1e850 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 69  ptrmapPut(pBt, i
1e860 46 72 65 65 50 61 67 65 2c 20 65 54 79 70 65 2c  FreePage, eType,
1e870 20 69 50 74 72 50 61 67 65 2c 20 26 72 63 29 3b   iPtrPage, &rc);
1e880 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
1e890 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f  urn rc;.}../* Fo
1e8a0 72 77 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f  rward declaratio
1e8b0 6e 20 72 65 71 75 69 72 65 64 20 62 79 20 69 6e  n required by in
1e8c0 63 72 56 61 63 75 75 6d 53 74 65 70 28 29 2e 20  crVacuumStep(). 
1e8d0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c  */.static int al
1e8e0 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28  locateBtreePage(
1e8f0 42 74 53 68 61 72 65 64 20 2a 2c 20 4d 65 6d 50  BtShared *, MemP
1e900 61 67 65 20 2a 2a 2c 20 50 67 6e 6f 20 2a 2c 20  age **, Pgno *, 
1e910 50 67 6e 6f 2c 20 75 38 29 3b 0a 0a 2f 2a 0a 2a  Pgno, u8);../*.*
1e920 2a 20 50 65 72 66 6f 72 6d 20 61 20 73 69 6e 67  * Perform a sing
1e930 6c 65 20 73 74 65 70 20 6f 66 20 61 6e 20 69 6e  le step of an in
1e940 63 72 65 6d 65 6e 74 61 6c 2d 76 61 63 75 75 6d  cremental-vacuum
1e950 2e 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  . If successful,
1e960 20 72 65 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54   return.** SQLIT
1e970 45 5f 4f 4b 2e 20 49 66 20 74 68 65 72 65 20 69  E_OK. If there i
1e980 73 20 6e 6f 20 77 6f 72 6b 20 74 6f 20 64 6f 20  s no work to do 
1e990 28 61 6e 64 20 74 68 65 72 65 66 6f 72 65 20 6e  (and therefore n
1e9a0 6f 20 70 6f 69 6e 74 20 69 6e 20 0a 2a 2a 20 63  o point in .** c
1e9b0 61 6c 6c 69 6e 67 20 74 68 69 73 20 66 75 6e 63  alling this func
1e9c0 74 69 6f 6e 20 61 67 61 69 6e 29 2c 20 72 65 74  tion again), ret
1e9d0 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e  urn SQLITE_DONE.
1e9e0 20 4f 72 2c 20 69 66 20 61 6e 20 65 72 72 6f 72   Or, if an error
1e9f0 20 0a 2a 2a 20 6f 63 63 75 72 73 2c 20 72 65 74   .** occurs, ret
1ea00 75 72 6e 20 73 6f 6d 65 20 6f 74 68 65 72 20 65  urn some other e
1ea10 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a  rror code..**.**
1ea20 20 4d 6f 72 65 20 73 70 65 63 69 66 69 63 61 6c   More specifical
1ea30 6c 79 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ly, this functio
1ea40 6e 20 61 74 74 65 6d 70 74 73 20 74 6f 20 72 65  n attempts to re
1ea50 2d 6f 72 67 61 6e 69 7a 65 20 74 68 65 20 64 61  -organize the da
1ea60 74 61 62 61 73 65 20 73 6f 20 0a 2a 2a 20 74 68  tabase so .** th
1ea70 61 74 20 74 68 65 20 6c 61 73 74 20 70 61 67 65  at the last page
1ea80 20 6f 66 20 74 68 65 20 66 69 6c 65 20 63 75 72   of the file cur
1ea90 72 65 6e 74 6c 79 20 69 6e 20 75 73 65 20 69 73  rently in use is
1eaa0 20 6e 6f 20 6c 6f 6e 67 65 72 20 69 6e 20 75 73   no longer in us
1eab0 65 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d 65 74  e..**.** Paramet
1eac0 65 72 20 6e 46 69 6e 20 69 73 20 74 68 65 20 6e  er nFin is the n
1ead0 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 74  umber of pages t
1eae0 68 61 74 20 74 68 69 73 20 64 61 74 61 62 61 73  hat this databas
1eaf0 65 20 77 6f 75 6c 64 20 63 6f 6e 74 61 69 6e 0a  e would contain.
1eb00 2a 2a 20 77 65 72 65 20 74 68 69 73 20 66 75 6e  ** were this fun
1eb10 63 74 69 6f 6e 20 63 61 6c 6c 65 64 20 75 6e 74  ction called unt
1eb20 69 6c 20 69 74 20 72 65 74 75 72 6e 73 20 53 51  il it returns SQ
1eb30 4c 49 54 45 5f 44 4f 4e 45 2e 0a 2a 2a 0a 2a 2a  LITE_DONE..**.**
1eb40 20 49 66 20 74 68 65 20 62 43 6f 6d 6d 69 74 20   If the bCommit 
1eb50 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 6e  parameter is non
1eb60 2d 7a 65 72 6f 2c 20 74 68 69 73 20 66 75 6e 63  -zero, this func
1eb70 74 69 6f 6e 20 61 73 73 75 6d 65 73 20 74 68 61  tion assumes tha
1eb80 74 20 74 68 65 20 0a 2a 2a 20 63 61 6c 6c 65 72  t the .** caller
1eb90 20 77 69 6c 6c 20 6b 65 65 70 20 63 61 6c 6c 69   will keep calli
1eba0 6e 67 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65  ng incrVacuumSte
1ebb0 70 28 29 20 75 6e 74 69 6c 20 69 74 20 72 65 74  p() until it ret
1ebc0 75 72 6e 73 20 53 51 4c 49 54 45 5f 44 4f 4e 45  urns SQLITE_DONE
1ebd0 20 0a 2a 2a 20 6f 72 20 61 6e 20 65 72 72 6f 72   .** or an error
1ebe0 2e 20 62 43 6f 6d 6d 69 74 20 69 73 20 70 61 73  . bCommit is pas
1ebf0 73 65 64 20 74 72 75 65 20 66 6f 72 20 61 6e 20  sed true for an 
1ec00 61 75 74 6f 2d 76 61 63 75 75 6d 2d 6f 6e 2d 63  auto-vacuum-on-c
1ec10 6f 6d 6d 69 74 20 0a 2a 2a 20 6f 70 65 72 61 74  ommit .** operat
1ec20 69 6f 6e 2c 20 6f 72 20 66 61 6c 73 65 20 66 6f  ion, or false fo
1ec30 72 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c  r an incremental
1ec40 20 76 61 63 75 75 6d 2e 0a 2a 2f 0a 73 74 61 74   vacuum..*/.stat
1ec50 69 63 20 69 6e 74 20 69 6e 63 72 56 61 63 75 75  ic int incrVacuu
1ec60 6d 53 74 65 70 28 42 74 53 68 61 72 65 64 20 2a  mStep(BtShared *
1ec70 70 42 74 2c 20 50 67 6e 6f 20 6e 46 69 6e 2c 20  pBt, Pgno nFin, 
1ec80 50 67 6e 6f 20 69 4c 61 73 74 50 67 2c 20 69 6e  Pgno iLastPg, in
1ec90 74 20 62 43 6f 6d 6d 69 74 29 7b 0a 20 20 50 67  t bCommit){.  Pg
1eca0 6e 6f 20 6e 46 72 65 65 4c 69 73 74 3b 20 20 20  no nFreeList;   
1ecb0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1ecc0 72 20 6f 66 20 70 61 67 65 73 20 73 74 69 6c 6c  r of pages still
1ecd0 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73   on the free-lis
1ece0 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  t */.  int rc;..
1ecf0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
1ed00 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
1ed10 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
1ed20 73 65 72 74 28 20 69 4c 61 73 74 50 67 3e 6e 46  sert( iLastPg>nF
1ed30 69 6e 20 29 3b 0a 0a 20 20 69 66 28 20 21 50 54  in );..  if( !PT
1ed40 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c  RMAP_ISPAGE(pBt,
1ed50 20 69 4c 61 73 74 50 67 29 20 26 26 20 69 4c 61   iLastPg) && iLa
1ed60 73 74 50 67 21 3d 50 45 4e 44 49 4e 47 5f 42 59  stPg!=PENDING_BY
1ed70 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a  TE_PAGE(pBt) ){.
1ed80 20 20 20 20 75 38 20 65 54 79 70 65 3b 0a 20 20      u8 eType;.  
1ed90 20 20 50 67 6e 6f 20 69 50 74 72 50 61 67 65 3b    Pgno iPtrPage;
1eda0 0a 0a 20 20 20 20 6e 46 72 65 65 4c 69 73 74 20  ..    nFreeList 
1edb0 3d 20 67 65 74 34 62 79 74 65 28 26 70 42 74 2d  = get4byte(&pBt-
1edc0 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  >pPage1->aData[3
1edd0 36 5d 29 3b 0a 20 20 20 20 69 66 28 20 6e 46 72  6]);.    if( nFr
1ede0 65 65 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20  eeList==0 ){.   
1edf0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1ee00 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 0a 20 20  _DONE;.    }..  
1ee10 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74    rc = ptrmapGet
1ee20 28 70 42 74 2c 20 69 4c 61 73 74 50 67 2c 20 26  (pBt, iLastPg, &
1ee30 65 54 79 70 65 2c 20 26 69 50 74 72 50 61 67 65  eType, &iPtrPage
1ee40 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
1ee50 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1ee60 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
1ee70 20 7d 0a 20 20 20 20 69 66 28 20 65 54 79 70 65   }.    if( eType
1ee80 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47  ==PTRMAP_ROOTPAG
1ee90 45 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  E ){.      retur
1eea0 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
1eeb0 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a 20 20  _BKPT;.    }..  
1eec0 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52    if( eType==PTR
1eed0 4d 41 50 5f 46 52 45 45 50 41 47 45 20 29 7b 0a  MAP_FREEPAGE ){.
1eee0 20 20 20 20 20 20 69 66 28 20 62 43 6f 6d 6d 69        if( bCommi
1eef0 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  t==0 ){.        
1ef00 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 70 61  /* Remove the pa
1ef10 67 65 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65  ge from the file
1ef20 73 20 66 72 65 65 2d 6c 69 73 74 2e 20 54 68 69  s free-list. Thi
1ef30 73 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65  s is not require
1ef40 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 66 20  d.        ** if 
1ef50 62 43 6f 6d 6d 69 74 20 69 73 20 6e 6f 6e 2d 7a  bCommit is non-z
1ef60 65 72 6f 2e 20 49 6e 20 74 68 61 74 20 63 61 73  ero. In that cas
1ef70 65 2c 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  e, the free-list
1ef80 20 77 69 6c 6c 20 62 65 0a 20 20 20 20 20 20 20   will be.       
1ef90 20 2a 2a 20 74 72 75 6e 63 61 74 65 64 20 74 6f   ** truncated to
1efa0 20 7a 65 72 6f 20 61 66 74 65 72 20 74 68 69 73   zero after this
1efb0 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
1efc0 73 2c 20 73 6f 20 69 74 20 64 6f 65 73 6e 27 74  s, so it doesn't
1efd0 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 61 74   .        ** mat
1efe0 74 65 72 20 69 66 20 69 74 20 73 74 69 6c 6c 20  ter if it still 
1eff0 63 6f 6e 74 61 69 6e 73 20 73 6f 6d 65 20 67 61  contains some ga
1f000 72 62 61 67 65 20 65 6e 74 72 69 65 73 2e 0a 20  rbage entries.. 
1f010 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
1f020 20 20 50 67 6e 6f 20 69 46 72 65 65 50 67 3b 0a    Pgno iFreePg;.
1f030 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20          MemPage 
1f040 2a 70 46 72 65 65 50 67 3b 0a 20 20 20 20 20 20  *pFreePg;.      
1f050 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42    rc = allocateB
1f060 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70  treePage(pBt, &p
1f070 46 72 65 65 50 67 2c 20 26 69 46 72 65 65 50 67  FreePg, &iFreePg
1f080 2c 20 69 4c 61 73 74 50 67 2c 20 42 54 41 4c 4c  , iLastPg, BTALL
1f090 4f 43 5f 45 58 41 43 54 29 3b 0a 20 20 20 20 20  OC_EXACT);.     
1f0a0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1f0b0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1f0c0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
1f0d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61       }.        a
1f0e0 73 73 65 72 74 28 20 69 46 72 65 65 50 67 3d 3d  ssert( iFreePg==
1f0f0 69 4c 61 73 74 50 67 20 29 3b 0a 20 20 20 20 20  iLastPg );.     
1f100 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
1f110 46 72 65 65 50 67 29 3b 0a 20 20 20 20 20 20 7d  FreePg);.      }
1f120 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20  .    } else {.  
1f130 20 20 20 20 50 67 6e 6f 20 69 46 72 65 65 50 67      Pgno iFreePg
1f140 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
1f150 20 49 6e 64 65 78 20 6f 66 20 66 72 65 65 20 70   Index of free p
1f160 61 67 65 20 74 6f 20 6d 6f 76 65 20 70 4c 61 73  age to move pLas
1f170 74 50 67 20 74 6f 20 2a 2f 0a 20 20 20 20 20 20  tPg to */.      
1f180 4d 65 6d 50 61 67 65 20 2a 70 4c 61 73 74 50 67  MemPage *pLastPg
1f190 3b 0a 20 20 20 20 20 20 75 38 20 65 4d 6f 64 65  ;.      u8 eMode
1f1a0 20 3d 20 42 54 41 4c 4c 4f 43 5f 41 4e 59 3b 20   = BTALLOC_ANY; 
1f1b0 20 20 2f 2a 20 4d 6f 64 65 20 70 61 72 61 6d 65    /* Mode parame
1f1c0 74 65 72 20 66 6f 72 20 61 6c 6c 6f 63 61 74 65  ter for allocate
1f1d0 42 74 72 65 65 50 61 67 65 28 29 20 2a 2f 0a 20  BtreePage() */. 
1f1e0 20 20 20 20 20 50 67 6e 6f 20 69 4e 65 61 72 20       Pgno iNear 
1f1f0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f  = 0;           /
1f200 2a 20 6e 65 61 72 62 79 20 70 61 72 61 6d 65 74  * nearby paramet
1f210 65 72 20 66 6f 72 20 61 6c 6c 6f 63 61 74 65 42  er for allocateB
1f220 74 72 65 65 50 61 67 65 28 29 20 2a 2f 0a 0a 20  treePage() */.. 
1f230 20 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47       rc = btreeG
1f240 65 74 50 61 67 65 28 70 42 74 2c 20 69 4c 61 73  etPage(pBt, iLas
1f250 74 50 67 2c 20 26 70 4c 61 73 74 50 67 2c 20 30  tPg, &pLastPg, 0
1f260 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
1f270 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1f280 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1f290 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
1f2a0 2f 2a 20 49 66 20 62 43 6f 6d 6d 69 74 20 69 73  /* If bCommit is
1f2b0 20 7a 65 72 6f 2c 20 74 68 69 73 20 6c 6f 6f 70   zero, this loop
1f2c0 20 72 75 6e 73 20 65 78 61 63 74 6c 79 20 6f 6e   runs exactly on
1f2d0 63 65 20 61 6e 64 20 70 61 67 65 20 70 4c 61 73  ce and page pLas
1f2e0 74 50 67 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  tPg.      ** is 
1f2f0 73 77 61 70 70 65 64 20 77 69 74 68 20 74 68 65  swapped with the
1f300 20 66 69 72 73 74 20 66 72 65 65 20 70 61 67 65   first free page
1f310 20 70 75 6c 6c 65 64 20 6f 66 66 20 74 68 65 20   pulled off the 
1f320 66 72 65 65 20 6c 69 73 74 2e 0a 20 20 20 20 20  free list..     
1f330 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4f 6e 20   **.      ** On 
1f340 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20  the other hand, 
1f350 69 66 20 62 43 6f 6d 6d 69 74 20 69 73 20 67 72  if bCommit is gr
1f360 65 61 74 65 72 20 74 68 61 6e 20 7a 65 72 6f 2c  eater than zero,
1f370 20 74 68 65 6e 20 6b 65 65 70 0a 20 20 20 20 20   then keep.     
1f380 20 2a 2a 20 6c 6f 6f 70 69 6e 67 20 75 6e 74 69   ** looping unti
1f390 6c 20 61 20 66 72 65 65 2d 70 61 67 65 20 6c 6f  l a free-page lo
1f3a0 63 61 74 65 64 20 77 69 74 68 69 6e 20 74 68 65  cated within the
1f3b0 20 66 69 72 73 74 20 6e 46 69 6e 20 70 61 67 65   first nFin page
1f3c0 73 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68  s.      ** of th
1f3d0 65 20 66 69 6c 65 20 69 73 20 66 6f 75 6e 64 2e  e file is found.
1f3e0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
1f3f0 69 66 28 20 62 43 6f 6d 6d 69 74 3d 3d 30 20 29  if( bCommit==0 )
1f400 7b 0a 20 20 20 20 20 20 20 20 65 4d 6f 64 65 20  {.        eMode 
1f410 3d 20 42 54 41 4c 4c 4f 43 5f 4c 45 3b 0a 20 20  = BTALLOC_LE;.  
1f420 20 20 20 20 20 20 69 4e 65 61 72 20 3d 20 6e 46        iNear = nF
1f430 69 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  in;.      }.    
1f440 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 20 20 4d    do {.        M
1f450 65 6d 50 61 67 65 20 2a 70 46 72 65 65 50 67 3b  emPage *pFreePg;
1f460 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 61 6c  .        rc = al
1f470 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28  locateBtreePage(
1f480 70 42 74 2c 20 26 70 46 72 65 65 50 67 2c 20 26  pBt, &pFreePg, &
1f490 69 46 72 65 65 50 67 2c 20 69 4e 65 61 72 2c 20  iFreePg, iNear, 
1f4a0 65 4d 6f 64 65 29 3b 0a 20 20 20 20 20 20 20 20  eMode);.        
1f4b0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1f4c0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
1f4d0 65 6c 65 61 73 65 50 61 67 65 28 70 4c 61 73 74  eleasePage(pLast
1f4e0 50 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  Pg);.          r
1f4f0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
1f500 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65 6c 65    }.        rele
1f510 61 73 65 50 61 67 65 28 70 46 72 65 65 50 67 29  asePage(pFreePg)
1f520 3b 0a 20 20 20 20 20 20 7d 77 68 69 6c 65 28 20  ;.      }while( 
1f530 62 43 6f 6d 6d 69 74 20 26 26 20 69 46 72 65 65  bCommit && iFree
1f540 50 67 3e 6e 46 69 6e 20 29 3b 0a 20 20 20 20 20  Pg>nFin );.     
1f550 20 61 73 73 65 72 74 28 20 69 46 72 65 65 50 67   assert( iFreePg
1f560 3c 69 4c 61 73 74 50 67 20 29 3b 0a 20 20 20 20  <iLastPg );.    
1f570 20 20 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65    .      rc = re
1f580 6c 6f 63 61 74 65 50 61 67 65 28 70 42 74 2c 20  locatePage(pBt, 
1f590 70 4c 61 73 74 50 67 2c 20 65 54 79 70 65 2c 20  pLastPg, eType, 
1f5a0 69 50 74 72 50 61 67 65 2c 20 69 46 72 65 65 50  iPtrPage, iFreeP
1f5b0 67 2c 20 62 43 6f 6d 6d 69 74 29 3b 0a 20 20 20  g, bCommit);.   
1f5c0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
1f5d0 4c 61 73 74 50 67 29 3b 0a 20 20 20 20 20 20 69  LastPg);.      i
1f5e0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1f5f0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
1f600 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
1f610 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
1f620 62 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b 0a 20 20  bCommit==0 ){.  
1f630 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 69 4c 61    do {.      iLa
1f640 73 74 50 67 2d 2d 3b 0a 20 20 20 20 7d 77 68 69  stPg--;.    }whi
1f650 6c 65 28 20 69 4c 61 73 74 50 67 3d 3d 50 45 4e  le( iLastPg==PEN
1f660 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
1f670 42 74 29 20 7c 7c 20 50 54 52 4d 41 50 5f 49 53  Bt) || PTRMAP_IS
1f680 50 41 47 45 28 70 42 74 2c 20 69 4c 61 73 74 50  PAGE(pBt, iLastP
1f690 67 29 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 62  g) );.    pBt->b
1f6a0 44 6f 54 72 75 6e 63 61 74 65 20 3d 20 31 3b 0a  DoTruncate = 1;.
1f6b0 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d      pBt->nPage =
1f6c0 20 69 4c 61 73 74 50 67 3b 0a 20 20 7d 0a 20 20   iLastPg;.  }.  
1f6d0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1f6e0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 64  ;.}../*.** The d
1f6f0 61 74 61 62 61 73 65 20 6f 70 65 6e 65 64 20 62  atabase opened b
1f700 79 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75  y the first argu
1f710 6d 65 6e 74 20 69 73 20 61 6e 20 61 75 74 6f 2d  ment is an auto-
1f720 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 0a  vacuum database.
1f730 2a 2a 20 6e 4f 72 69 67 20 70 61 67 65 73 20 69  ** nOrig pages i
1f740 6e 20 73 69 7a 65 20 63 6f 6e 74 61 69 6e 69 6e  n size containin
1f750 67 20 6e 46 72 65 65 20 66 72 65 65 20 70 61 67  g nFree free pag
1f760 65 73 2e 20 52 65 74 75 72 6e 20 74 68 65 20 65  es. Return the e
1f770 78 70 65 63 74 65 64 20 0a 2a 2a 20 73 69 7a 65  xpected .** size
1f780 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1f790 20 69 6e 20 70 61 67 65 73 20 66 6f 6c 6c 6f 77   in pages follow
1f7a0 69 6e 67 20 61 6e 20 61 75 74 6f 2d 76 61 63 75  ing an auto-vacu
1f7b0 75 6d 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2f  um operation..*/
1f7c0 0a 73 74 61 74 69 63 20 50 67 6e 6f 20 66 69 6e  .static Pgno fin
1f7d0 61 6c 44 62 53 69 7a 65 28 42 74 53 68 61 72 65  alDbSize(BtShare
1f7e0 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6e 4f 72  d *pBt, Pgno nOr
1f7f0 69 67 2c 20 50 67 6e 6f 20 6e 46 72 65 65 29 7b  ig, Pgno nFree){
1f800 0a 20 20 69 6e 74 20 6e 45 6e 74 72 79 3b 20 20  .  int nEntry;  
1f810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f820 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1f830 65 6e 74 72 69 65 73 20 6f 6e 20 6f 6e 65 20 70  entries on one p
1f840 74 72 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20  trmap page */.  
1f850 50 67 6e 6f 20 6e 50 74 72 6d 61 70 3b 20 20 20  Pgno nPtrmap;   
1f860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f870 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 50 74 72  /* Number of Ptr
1f880 4d 61 70 20 70 61 67 65 73 20 74 6f 20 62 65 20  Map pages to be 
1f890 66 72 65 65 64 20 2a 2f 0a 20 20 50 67 6e 6f 20  freed */.  Pgno 
1f8a0 6e 46 69 6e 3b 20 20 20 20 20 20 20 20 20 20 20  nFin;           
1f8b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
1f8c0 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 0a 20  turn value */.. 
1f8d0 20 6e 45 6e 74 72 79 20 3d 20 70 42 74 2d 3e 75   nEntry = pBt->u
1f8e0 73 61 62 6c 65 53 69 7a 65 2f 35 3b 0a 20 20 6e  sableSize/5;.  n
1f8f0 50 74 72 6d 61 70 20 3d 20 28 6e 46 72 65 65 2d  Ptrmap = (nFree-
1f900 6e 4f 72 69 67 2b 50 54 52 4d 41 50 5f 50 41 47  nOrig+PTRMAP_PAG
1f910 45 4e 4f 28 70 42 74 2c 20 6e 4f 72 69 67 29 2b  ENO(pBt, nOrig)+
1f920 6e 45 6e 74 72 79 29 2f 6e 45 6e 74 72 79 3b 0a  nEntry)/nEntry;.
1f930 20 20 6e 46 69 6e 20 3d 20 6e 4f 72 69 67 20 2d    nFin = nOrig -
1f940 20 6e 46 72 65 65 20 2d 20 6e 50 74 72 6d 61 70   nFree - nPtrmap
1f950 3b 0a 20 20 69 66 28 20 6e 4f 72 69 67 3e 50 45  ;.  if( nOrig>PE
1f960 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
1f970 70 42 74 29 20 26 26 20 6e 46 69 6e 3c 50 45 4e  pBt) && nFin<PEN
1f980 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
1f990 42 74 29 20 29 7b 0a 20 20 20 20 6e 46 69 6e 2d  Bt) ){.    nFin-
1f9a0 2d 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20  -;.  }.  while( 
1f9b0 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42  PTRMAP_ISPAGE(pB
1f9c0 74 2c 20 6e 46 69 6e 29 20 7c 7c 20 6e 46 69 6e  t, nFin) || nFin
1f9d0 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  ==PENDING_BYTE_P
1f9e0 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20  AGE(pBt) ){.    
1f9f0 6e 46 69 6e 2d 2d 3b 0a 20 20 7d 0a 0a 20 20 72  nFin--;.  }..  r
1fa00 65 74 75 72 6e 20 6e 46 69 6e 3b 0a 7d 0a 0a 2f  eturn nFin;.}../
1fa10 2a 0a 2a 2a 20 41 20 77 72 69 74 65 2d 74 72 61  *.** A write-tra
1fa20 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65  nsaction must be
1fa30 20 6f 70 65 6e 65 64 20 62 65 66 6f 72 65 20 63   opened before c
1fa40 61 6c 6c 69 6e 67 20 74 68 69 73 20 66 75 6e 63  alling this func
1fa50 74 69 6f 6e 2e 0a 2a 2a 20 49 74 20 70 65 72 66  tion..** It perf
1fa60 6f 72 6d 73 20 61 20 73 69 6e 67 6c 65 20 75 6e  orms a single un
1fa70 69 74 20 6f 66 20 77 6f 72 6b 20 74 6f 77 61 72  it of work towar
1fa80 64 73 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61  ds an incrementa
1fa90 6c 20 76 61 63 75 75 6d 2e 0a 2a 2a 0a 2a 2a 20  l vacuum..**.** 
1faa0 49 66 20 74 68 65 20 69 6e 63 72 65 6d 65 6e 74  If the increment
1fab0 61 6c 20 76 61 63 75 75 6d 20 69 73 20 66 69 6e  al vacuum is fin
1fac0 69 73 68 65 64 20 61 66 74 65 72 20 74 68 69 73  ished after this
1fad0 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 72 75   function has ru
1fae0 6e 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 44 4f 4e  n,.** SQLITE_DON
1faf0 45 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49  E is returned. I
1fb00 66 20 69 74 20 69 73 20 6e 6f 74 20 66 69 6e 69  f it is not fini
1fb10 73 68 65 64 2c 20 62 75 74 20 6e 6f 20 65 72 72  shed, but no err
1fb20 6f 72 20 6f 63 63 75 72 72 65 64 2c 0a 2a 2a 20  or occurred,.** 
1fb30 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
1fb40 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65  urned. Otherwise
1fb50 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
1fb60 20 63 6f 64 65 2e 20 0a 2a 2f 0a 69 6e 74 20 73   code. .*/.int s
1fb70 71 6c 69 74 65 33 42 74 72 65 65 49 6e 63 72 56  qlite3BtreeIncrV
1fb80 61 63 75 75 6d 28 42 74 72 65 65 20 2a 70 29 7b  acuum(Btree *p){
1fb90 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53  .  int rc;.  BtS
1fba0 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
1fbb0 70 42 74 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42  pBt;..  sqlite3B
1fbc0 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
1fbd0 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54  assert( pBt->inT
1fbe0 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e  ransaction==TRAN
1fbf0 53 5f 57 52 49 54 45 20 26 26 20 70 2d 3e 69 6e  S_WRITE && p->in
1fc00 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49  Trans==TRANS_WRI
1fc10 54 45 20 29 3b 0a 20 20 69 66 28 20 21 70 42 74  TE );.  if( !pBt
1fc20 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a  ->autoVacuum ){.
1fc30 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1fc40 44 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  DONE;.  }else{. 
1fc50 20 20 20 50 67 6e 6f 20 6e 4f 72 69 67 20 3d 20     Pgno nOrig = 
1fc60 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70  btreePagecount(p
1fc70 42 74 29 3b 0a 20 20 20 20 50 67 6e 6f 20 6e 46  Bt);.    Pgno nF
1fc80 72 65 65 20 3d 20 67 65 74 34 62 79 74 65 28 26  ree = get4byte(&
1fc90 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61  pBt->pPage1->aDa
1fca0 74 61 5b 33 36 5d 29 3b 0a 20 20 20 20 50 67 6e  ta[36]);.    Pgn
1fcb0 6f 20 6e 46 69 6e 20 3d 20 66 69 6e 61 6c 44 62  o nFin = finalDb
1fcc0 53 69 7a 65 28 70 42 74 2c 20 6e 4f 72 69 67 2c  Size(pBt, nOrig,
1fcd0 20 6e 46 72 65 65 29 3b 0a 0a 20 20 20 20 69 66   nFree);..    if
1fce0 28 20 6e 4f 72 69 67 3c 6e 46 69 6e 20 29 7b 0a  ( nOrig<nFin ){.
1fcf0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1fd00 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
1fd10 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 46      }else if( nF
1fd20 72 65 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 72  ree>0 ){.      r
1fd30 63 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73 6f  c = saveAllCurso
1fd40 72 73 28 70 42 74 2c 20 30 2c 20 30 29 3b 0a 20  rs(pBt, 0, 0);. 
1fd50 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
1fd60 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1fd70 20 20 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f    invalidateAllO
1fd80 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70 42 74  verflowCache(pBt
1fd90 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
1fda0 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28 70  incrVacuumStep(p
1fdb0 42 74 2c 20 6e 46 69 6e 2c 20 6e 4f 72 69 67 2c  Bt, nFin, nOrig,
1fdc0 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
1fdd0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1fde0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1fdf0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
1fe00 72 57 72 69 74 65 28 70 42 74 2d 3e 70 50 61 67  rWrite(pBt->pPag
1fe10 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  e1->pDbPage);.  
1fe20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
1fe30 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61  pBt->pPage1->aDa
1fe40 74 61 5b 32 38 5d 2c 20 70 42 74 2d 3e 6e 50 61  ta[28], pBt->nPa
1fe50 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ge);.      }.   
1fe60 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
1fe70 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a   = SQLITE_DONE;.
1fe80 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
1fe90 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
1fea0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
1feb0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
1fec0 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 70  tine is called p
1fed0 72 69 6f 72 20 74 6f 20 73 71 6c 69 74 65 33 50  rior to sqlite3P
1fee0 61 67 65 72 43 6f 6d 6d 69 74 20 77 68 65 6e 20  agerCommit when 
1fef0 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a  a transaction.**
1ff00 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 20 66 6f   is committed fo
1ff10 72 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d  r an auto-vacuum
1ff20 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a   database..**.**
1ff30 20 49 66 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73   If SQLITE_OK is
1ff40 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65 6e 20   returned, then 
1ff50 2a 70 6e 54 72 75 6e 63 20 69 73 20 73 65 74 20  *pnTrunc is set 
1ff60 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  to the number of
1ff70 20 70 61 67 65 73 0a 2a 2a 20 74 68 65 20 64 61   pages.** the da
1ff80 74 61 62 61 73 65 20 66 69 6c 65 20 73 68 6f 75  tabase file shou
1ff90 6c 64 20 62 65 20 74 72 75 6e 63 61 74 65 64 20  ld be truncated 
1ffa0 74 6f 20 64 75 72 69 6e 67 20 74 68 65 20 63 6f  to during the co
1ffb0 6d 6d 69 74 20 70 72 6f 63 65 73 73 2e 20 0a 2a  mmit process. .*
1ffc0 2a 20 69 2e 65 2e 20 74 68 65 20 64 61 74 61 62  * i.e. the datab
1ffd0 61 73 65 20 68 61 73 20 62 65 65 6e 20 72 65 6f  ase has been reo
1ffe0 72 67 61 6e 69 7a 65 64 20 73 6f 20 74 68 61 74  rganized so that
1fff0 20 6f 6e 6c 79 20 74 68 65 20 66 69 72 73 74 20   only the first 
20000 2a 70 6e 54 72 75 6e 63 0a 2a 2a 20 70 61 67 65  *pnTrunc.** page
20010 73 20 61 72 65 20 69 6e 20 75 73 65 2e 0a 2a 2f  s are in use..*/
20020 0a 73 74 61 74 69 63 20 69 6e 74 20 61 75 74 6f  .static int auto
20030 56 61 63 75 75 6d 43 6f 6d 6d 69 74 28 42 74 53  VacuumCommit(BtS
20040 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69  hared *pBt){.  i
20050 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
20060 4b 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  K;.  Pager *pPag
20070 65 72 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 72  er = pBt->pPager
20080 3b 0a 20 20 56 56 41 5f 4f 4e 4c 59 28 20 69 6e  ;.  VVA_ONLY( in
20090 74 20 6e 52 65 66 20 3d 20 73 71 6c 69 74 65 33  t nRef = sqlite3
200a0 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70 50  PagerRefcount(pP
200b0 61 67 65 72 29 3b 20 29 0a 0a 20 20 61 73 73 65  ager); )..  asse
200c0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
200d0 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
200e0 78 29 20 29 3b 0a 20 20 69 6e 76 61 6c 69 64 61  x) );.  invalida
200f0 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63  teAllOverflowCac
20100 68 65 28 70 42 74 29 3b 0a 20 20 61 73 73 65 72  he(pBt);.  asser
20110 74 28 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  t(pBt->autoVacuu
20120 6d 29 3b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e  m);.  if( !pBt->
20130 69 6e 63 72 56 61 63 75 75 6d 20 29 7b 0a 20 20  incrVacuum ){.  
20140 20 20 50 67 6e 6f 20 6e 46 69 6e 3b 20 20 20 20    Pgno nFin;    
20150 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
20160 66 20 70 61 67 65 73 20 69 6e 20 64 61 74 61 62  f pages in datab
20170 61 73 65 20 61 66 74 65 72 20 61 75 74 6f 76 61  ase after autova
20180 63 75 75 6d 69 6e 67 20 2a 2f 0a 20 20 20 20 50  cuuming */.    P
20190 67 6e 6f 20 6e 46 72 65 65 3b 20 20 20 20 20 20  gno nFree;      
201a0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
201b0 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65  ages on the free
201c0 6c 69 73 74 20 69 6e 69 74 69 61 6c 6c 79 20 2a  list initially *
201d0 2f 0a 20 20 20 20 50 67 6e 6f 20 69 46 72 65 65  /.    Pgno iFree
201e0 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ;        /* The 
201f0 6e 65 78 74 20 70 61 67 65 20 74 6f 20 62 65 20  next page to be 
20200 66 72 65 65 64 20 2a 2f 0a 20 20 20 20 50 67 6e  freed */.    Pgn
20210 6f 20 6e 4f 72 69 67 3b 20 20 20 20 20 20 20 20  o nOrig;        
20220 2f 2a 20 44 61 74 61 62 61 73 65 20 73 69 7a 65  /* Database size
20230 20 62 65 66 6f 72 65 20 66 72 65 65 69 6e 67 20   before freeing 
20240 2a 2f 0a 0a 20 20 20 20 6e 4f 72 69 67 20 3d 20  */..    nOrig = 
20250 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70  btreePagecount(p
20260 42 74 29 3b 0a 20 20 20 20 69 66 28 20 50 54 52  Bt);.    if( PTR
20270 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20  MAP_ISPAGE(pBt, 
20280 6e 4f 72 69 67 29 20 7c 7c 20 6e 4f 72 69 67 3d  nOrig) || nOrig=
20290 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
202a0 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20  GE(pBt) ){.     
202b0 20 2f 2a 20 49 74 20 69 73 20 6e 6f 74 20 70 6f   /* It is not po
202c0 73 73 69 62 6c 65 20 74 6f 20 63 72 65 61 74 65  ssible to create
202d0 20 61 20 64 61 74 61 62 61 73 65 20 66 6f 72 20   a database for 
202e0 77 68 69 63 68 20 74 68 65 20 66 69 6e 61 6c 20  which the final 
202f0 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 69 73  page.      ** is
20300 20 65 69 74 68 65 72 20 61 20 70 6f 69 6e 74 65   either a pointe
20310 72 2d 6d 61 70 20 70 61 67 65 20 6f 72 20 74 68  r-map page or th
20320 65 20 70 65 6e 64 69 6e 67 2d 62 79 74 65 20 70  e pending-byte p
20330 61 67 65 2e 20 49 66 20 6f 6e 65 0a 20 20 20 20  age. If one.    
20340 20 20 2a 2a 20 69 73 20 65 6e 63 6f 75 6e 74 65    ** is encounte
20350 72 65 64 2c 20 74 68 69 73 20 69 6e 64 69 63 61  red, this indica
20360 74 65 73 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a  tes corruption..
20370 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72        */.      r
20380 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
20390 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  RUPT_BKPT;.    }
203a0 0a 0a 20 20 20 20 6e 46 72 65 65 20 3d 20 67 65  ..    nFree = ge
203b0 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61  t4byte(&pBt->pPa
203c0 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b  ge1->aData[36]);
203d0 0a 20 20 20 20 6e 46 69 6e 20 3d 20 66 69 6e 61  .    nFin = fina
203e0 6c 44 62 53 69 7a 65 28 70 42 74 2c 20 6e 4f 72  lDbSize(pBt, nOr
203f0 69 67 2c 20 6e 46 72 65 65 29 3b 0a 20 20 20 20  ig, nFree);.    
20400 69 66 28 20 6e 46 69 6e 3e 6e 4f 72 69 67 20 29  if( nFin>nOrig )
20410 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
20420 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
20430 20 69 66 28 20 6e 46 69 6e 3c 6e 4f 72 69 67 20   if( nFin<nOrig 
20440 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 61  ){.      rc = sa
20450 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74  veAllCursors(pBt
20460 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  , 0, 0);.    }. 
20470 20 20 20 66 6f 72 28 69 46 72 65 65 3d 6e 4f 72     for(iFree=nOr
20480 69 67 3b 20 69 46 72 65 65 3e 6e 46 69 6e 20 26  ig; iFree>nFin &
20490 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b  & rc==SQLITE_OK;
204a0 20 69 46 72 65 65 2d 2d 29 7b 0a 20 20 20 20 20   iFree--){.     
204b0 20 72 63 20 3d 20 69 6e 63 72 56 61 63 75 75 6d   rc = incrVacuum
204c0 53 74 65 70 28 70 42 74 2c 20 6e 46 69 6e 2c 20  Step(pBt, nFin, 
204d0 69 46 72 65 65 2c 20 31 29 3b 0a 20 20 20 20 7d  iFree, 1);.    }
204e0 0a 20 20 20 20 69 66 28 20 28 72 63 3d 3d 53 51  .    if( (rc==SQ
204f0 4c 49 54 45 5f 44 4f 4e 45 20 7c 7c 20 72 63 3d  LITE_DONE || rc=
20500 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 26 26 20 6e  =SQLITE_OK) && n
20510 46 72 65 65 3e 30 20 29 7b 0a 20 20 20 20 20 20  Free>0 ){.      
20520 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
20530 72 57 72 69 74 65 28 70 42 74 2d 3e 70 50 61 67  rWrite(pBt->pPag
20540 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  e1->pDbPage);.  
20550 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 42      put4byte(&pB
20560 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61  t->pPage1->aData
20570 5b 33 32 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20  [32], 0);.      
20580 70 75 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70  put4byte(&pBt->p
20590 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d  Page1->aData[36]
205a0 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 75 74 34  , 0);.      put4
205b0 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65  byte(&pBt->pPage
205c0 31 2d 3e 61 44 61 74 61 5b 32 38 5d 2c 20 6e 46  1->aData[28], nF
205d0 69 6e 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e  in);.      pBt->
205e0 62 44 6f 54 72 75 6e 63 61 74 65 20 3d 20 31 3b  bDoTruncate = 1;
205f0 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 50 61 67  .      pBt->nPag
20600 65 20 3d 20 6e 46 69 6e 3b 0a 20 20 20 20 7d 0a  e = nFin;.    }.
20610 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
20620 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73  TE_OK ){.      s
20630 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62  qlite3PagerRollb
20640 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ack(pPager);.   
20650 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74   }.  }..  assert
20660 28 20 6e 52 65 66 3e 3d 73 71 6c 69 74 65 33 50  ( nRef>=sqlite3P
20670 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70 50 61  agerRefcount(pPa
20680 67 65 72 29 20 29 3b 0a 20 20 72 65 74 75 72 6e  ger) );.  return
20690 20 72 63 3b 0a 7d 0a 0a 23 65 6c 73 65 20 2f 2a   rc;.}..#else /*
206a0 20 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f   ifndef SQLITE_O
206b0 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 2a  MIT_AUTOVACUUM *
206c0 2f 0a 23 20 64 65 66 69 6e 65 20 73 65 74 43 68  /.# define setCh
206d0 69 6c 64 50 74 72 6d 61 70 73 28 78 29 20 53 51  ildPtrmaps(x) SQ
206e0 4c 49 54 45 5f 4f 4b 0a 23 65 6e 64 69 66 0a 0a  LITE_OK.#endif..
206f0 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
20700 6e 65 20 64 6f 65 73 20 74 68 65 20 66 69 72 73  ne does the firs
20710 74 20 70 68 61 73 65 20 6f 66 20 61 20 74 77 6f  t phase of a two
20720 2d 70 68 61 73 65 20 63 6f 6d 6d 69 74 2e 20 20  -phase commit.  
20730 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  This routine.** 
20740 63 61 75 73 65 73 20 61 20 72 6f 6c 6c 62 61 63  causes a rollbac
20750 6b 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 62 65 20  k journal to be 
20760 63 72 65 61 74 65 64 20 28 69 66 20 69 74 20 64  created (if it d
20770 6f 65 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20  oes not already 
20780 65 78 69 73 74 29 0a 2a 2a 20 61 6e 64 20 70 6f  exist).** and po
20790 70 75 6c 61 74 65 64 20 77 69 74 68 20 65 6e 6f  pulated with eno
207a0 75 67 68 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ugh information 
207b0 73 6f 20 74 68 61 74 20 69 66 20 61 20 70 6f 77  so that if a pow
207c0 65 72 20 6c 6f 73 73 20 6f 63 63 75 72 73 0a 2a  er loss occurs.*
207d0 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63  * the database c
207e0 61 6e 20 62 65 20 72 65 73 74 6f 72 65 64 20 74  an be restored t
207f0 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73  o its original s
20800 74 61 74 65 20 62 79 20 70 6c 61 79 69 6e 67 20  tate by playing 
20810 62 61 63 6b 0a 2a 2a 20 74 68 65 20 6a 6f 75 72  back.** the jour
20820 6e 61 6c 2e 20 20 54 68 65 6e 20 74 68 65 20 63  nal.  Then the c
20830 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 6a  ontents of the j
20840 6f 75 72 6e 61 6c 20 61 72 65 20 66 6c 75 73 68  ournal are flush
20850 65 64 20 6f 75 74 20 74 6f 0a 2a 2a 20 74 68 65  ed out to.** the
20860 20 64 69 73 6b 2e 20 20 41 66 74 65 72 20 74 68   disk.  After th
20870 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 61 66  e journal is saf
20880 65 6c 79 20 6f 6e 20 6f 78 69 64 65 2c 20 74 68  ely on oxide, th
20890 65 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65  e changes to the
208a0 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 61 72 65  .** database are
208b0 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
208c0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
208d0 61 6e 64 20 66 6c 75 73 68 65 64 20 74 6f 20 6f  and flushed to o
208e0 78 69 64 65 2e 0a 2a 2a 20 41 74 20 74 68 65 20  xide..** At the 
208f0 65 6e 64 20 6f 66 20 74 68 69 73 20 63 61 6c 6c  end of this call
20900 2c 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a  , the rollback j
20910 6f 75 72 6e 61 6c 20 73 74 69 6c 6c 20 65 78 69  ournal still exi
20920 73 74 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 64 69  sts on the.** di
20930 73 6b 20 61 6e 64 20 77 65 20 61 72 65 20 73 74  sk and we are st
20940 69 6c 6c 20 68 6f 6c 64 69 6e 67 20 61 6c 6c 20  ill holding all 
20950 6c 6f 63 6b 73 2c 20 73 6f 20 74 68 65 20 74 72  locks, so the tr
20960 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 6e 6f  ansaction has no
20970 74 0a 2a 2a 20 63 6f 6d 6d 69 74 74 65 64 2e 20  t.** committed. 
20980 20 53 65 65 20 73 71 6c 69 74 65 33 42 74 72 65   See sqlite3Btre
20990 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28  eCommitPhaseTwo(
209a0 29 20 66 6f 72 20 74 68 65 20 73 65 63 6f 6e 64  ) for the second
209b0 20 70 68 61 73 65 20 6f 66 20 74 68 65 0a 2a 2a   phase of the.**
209c0 20 63 6f 6d 6d 69 74 20 70 72 6f 63 65 73 73 2e   commit process.
209d0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 61 6c 6c  .**.** This call
209e0 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 6e   is a no-op if n
209f0 6f 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  o write-transact
20a00 69 6f 6e 20 69 73 20 63 75 72 72 65 6e 74 6c 79  ion is currently
20a10 20 61 63 74 69 76 65 20 6f 6e 20 70 42 74 2e 0a   active on pBt..
20a20 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  **.** Otherwise,
20a30 20 73 79 6e 63 20 74 68 65 20 64 61 74 61 62 61   sync the databa
20a40 73 65 20 66 69 6c 65 20 66 6f 72 20 74 68 65 20  se file for the 
20a50 62 74 72 65 65 20 70 42 74 2e 20 7a 4d 61 73 74  btree pBt. zMast
20a60 65 72 20 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20  er points to.** 
20a70 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 6d 61  the name of a ma
20a80 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
20a90 65 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65  e that should be
20aa0 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
20ab0 65 0a 2a 2a 20 69 6e 64 69 76 69 64 75 61 6c 20  e.** individual 
20ac0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 6f 72  journal file, or
20ad0 20 69 73 20 4e 55 4c 4c 2c 20 69 6e 64 69 63 61   is NULL, indica
20ae0 74 69 6e 67 20 6e 6f 20 6d 61 73 74 65 72 20 6a  ting no master j
20af0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 0a 2a 2a 20  ournal file .** 
20b00 28 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65  (single database
20b10 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a   transaction)..*
20b20 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 69  *.** When this i
20b30 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 6d 61  s called, the ma
20b40 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 73 68 6f  ster journal sho
20b50 75 6c 64 20 61 6c 72 65 61 64 79 20 68 61 76 65  uld already have
20b60 20 62 65 65 6e 0a 2a 2a 20 63 72 65 61 74 65 64   been.** created
20b70 2c 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68  , populated with
20b80 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 70 6f   this journal po
20b90 69 6e 74 65 72 20 61 6e 64 20 73 79 6e 63 65 64  inter and synced
20ba0 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20   to disk..**.** 
20bb0 4f 6e 63 65 20 74 68 69 73 20 69 73 20 72 6f 75  Once this is rou
20bc0 74 69 6e 65 20 68 61 73 20 72 65 74 75 72 6e 65  tine has returne
20bd0 64 2c 20 74 68 65 20 6f 6e 6c 79 20 74 68 69 6e  d, the only thin
20be0 67 20 72 65 71 75 69 72 65 64 20 74 6f 20 63 6f  g required to co
20bf0 6d 6d 69 74 0a 2a 2a 20 74 68 65 20 77 72 69 74  mmit.** the writ
20c00 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 66 6f  e-transaction fo
20c10 72 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20  r this database 
20c20 66 69 6c 65 20 69 73 20 74 6f 20 64 65 6c 65 74  file is to delet
20c30 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a  e the journal..*
20c40 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
20c50 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65  eeCommitPhaseOne
20c60 28 42 74 72 65 65 20 2a 70 2c 20 63 6f 6e 73 74  (Btree *p, const
20c70 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b   char *zMaster){
20c80 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
20c90 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 2d 3e  TE_OK;.  if( p->
20ca0 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57  inTrans==TRANS_W
20cb0 52 49 54 45 20 29 7b 0a 20 20 20 20 42 74 53 68  RITE ){.    BtSh
20cc0 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
20cd0 42 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42  Bt;.    sqlite3B
20ce0 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 23 69  treeEnter(p);.#i
20cf0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
20d00 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
20d10 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61   if( pBt->autoVa
20d20 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 72 63  cuum ){.      rc
20d30 20 3d 20 61 75 74 6f 56 61 63 75 75 6d 43 6f 6d   = autoVacuumCom
20d40 6d 69 74 28 70 42 74 29 3b 0a 20 20 20 20 20 20  mit(pBt);.      
20d50 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
20d60 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  K ){.        sql
20d70 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
20d80 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
20d90 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
20da0 20 20 7d 0a 20 20 20 20 69 66 28 20 70 42 74 2d    }.    if( pBt-
20db0 3e 62 44 6f 54 72 75 6e 63 61 74 65 20 29 7b 0a  >bDoTruncate ){.
20dc0 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
20dd0 65 72 54 72 75 6e 63 61 74 65 49 6d 61 67 65 28  erTruncateImage(
20de0 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 42 74  pBt->pPager, pBt
20df0 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a  ->nPage);.    }.
20e00 23 65 6e 64 69 66 0a 20 20 20 20 72 63 20 3d 20  #endif.    rc = 
20e10 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d  sqlite3PagerComm
20e20 69 74 50 68 61 73 65 4f 6e 65 28 70 42 74 2d 3e  itPhaseOne(pBt->
20e30 70 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 2c  pPager, zMaster,
20e40 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
20e50 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
20e60 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
20e70 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
20e80 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
20e90 20 66 72 6f 6d 20 62 6f 74 68 20 42 74 72 65 65   from both Btree
20ea0 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29  CommitPhaseTwo()
20eb0 20 61 6e 64 20 42 74 72 65 65 52 6f 6c 6c 62 61   and BtreeRollba
20ec0 63 6b 28 29 0a 2a 2a 20 61 74 20 74 68 65 20 63  ck().** at the c
20ed0 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66 20 61 20 74  onclusion of a t
20ee0 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  ransaction..*/.s
20ef0 74 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65  tatic void btree
20f00 45 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 42  EndTransaction(B
20f10 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68  tree *p){.  BtSh
20f20 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
20f30 42 74 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  Bt;.  sqlite3 *d
20f40 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 73 73  b = p->db;.  ass
20f50 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65  ert( sqlite3Btre
20f60 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29  eHoldsMutex(p) )
20f70 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
20f80 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
20f90 4d 0a 20 20 70 42 74 2d 3e 62 44 6f 54 72 75 6e  M.  pBt->bDoTrun
20fa0 63 61 74 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66  cate = 0;.#endif
20fb0 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e  .  if( p->inTran
20fc0 73 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 20  s>TRANS_NONE && 
20fd0 64 62 2d 3e 6e 56 64 62 65 52 65 61 64 3e 31 20  db->nVdbeRead>1 
20fe0 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ){.    /* If the
20ff0 72 65 20 61 72 65 20 6f 74 68 65 72 20 61 63 74  re are other act
21000 69 76 65 20 73 74 61 74 65 6d 65 6e 74 73 20 74  ive statements t
21010 68 61 74 20 62 65 6c 6f 6e 67 20 74 6f 20 74 68  hat belong to th
21020 69 73 20 64 61 74 61 62 61 73 65 0a 20 20 20 20  is database.    
21030 2a 2a 20 68 61 6e 64 6c 65 2c 20 64 6f 77 6e 67  ** handle, downg
21040 72 61 64 65 20 74 6f 20 61 20 72 65 61 64 2d 6f  rade to a read-o
21050 6e 6c 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  nly transaction.
21060 20 54 68 65 20 6f 74 68 65 72 20 73 74 61 74 65   The other state
21070 6d 65 6e 74 73 0a 20 20 20 20 2a 2a 20 6d 61 79  ments.    ** may
21080 20 73 74 69 6c 6c 20 62 65 20 72 65 61 64 69 6e   still be readin
21090 67 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  g from the datab
210a0 61 73 65 2e 20 20 2a 2f 0a 20 20 20 20 64 6f 77  ase.  */.    dow
210b0 6e 67 72 61 64 65 41 6c 6c 53 68 61 72 65 64 43  ngradeAllSharedC
210c0 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 70  acheTableLocks(p
210d0 29 3b 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e  );.    p->inTran
210e0 73 20 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a  s = TRANS_READ;.
210f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
21100 49 66 20 74 68 65 20 68 61 6e 64 6c 65 20 68 61  If the handle ha
21110 64 20 61 6e 79 20 6b 69 6e 64 20 6f 66 20 74 72  d any kind of tr
21120 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 2c 20  ansaction open, 
21130 64 65 63 72 65 6d 65 6e 74 20 74 68 65 20 0a 20  decrement the . 
21140 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f     ** transactio
21150 6e 20 63 6f 75 6e 74 20 6f 66 20 74 68 65 20 73  n count of the s
21160 68 61 72 65 64 20 62 74 72 65 65 2e 20 49 66 20  hared btree. If 
21170 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
21180 63 6f 75 6e 74 20 0a 20 20 20 20 2a 2a 20 72 65  count .    ** re
21190 61 63 68 65 73 20 30 2c 20 73 65 74 20 74 68 65  aches 0, set the
211a0 20 73 68 61 72 65 64 20 73 74 61 74 65 20 74 6f   shared state to
211b0 20 54 52 41 4e 53 5f 4e 4f 4e 45 2e 20 54 68 65   TRANS_NONE. The
211c0 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e   unlockBtreeIfUn
211d0 75 73 65 64 28 29 0a 20 20 20 20 2a 2a 20 63 61  used().    ** ca
211e0 6c 6c 20 62 65 6c 6f 77 20 77 69 6c 6c 20 75 6e  ll below will un
211f0 6c 6f 63 6b 20 74 68 65 20 70 61 67 65 72 2e 20  lock the pager. 
21200 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 69   */.    if( p->i
21210 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f 4e 4f  nTrans!=TRANS_NO
21220 4e 45 20 29 7b 0a 20 20 20 20 20 20 63 6c 65 61  NE ){.      clea
21230 72 41 6c 6c 53 68 61 72 65 64 43 61 63 68 65 54  rAllSharedCacheT
21240 61 62 6c 65 4c 6f 63 6b 73 28 70 29 3b 0a 20 20  ableLocks(p);.  
21250 20 20 20 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61      pBt->nTransa
21260 63 74 69 6f 6e 2d 2d 3b 0a 20 20 20 20 20 20 69  ction--;.      i
21270 66 28 20 30 3d 3d 70 42 74 2d 3e 6e 54 72 61 6e  f( 0==pBt->nTran
21280 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20  saction ){.     
21290 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61     pBt->inTransa
212a0 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 4e 4f  ction = TRANS_NO
212b0 4e 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  NE;.      }.    
212c0 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 74 68  }..    /* Set th
212d0 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61  e current transa
212e0 63 74 69 6f 6e 20 73 74 61 74 65 20 74 6f 20 54  ction state to T
212f0 52 41 4e 53 5f 4e 4f 4e 45 20 61 6e 64 20 75 6e  RANS_NONE and un
21300 6c 6f 63 6b 20 74 68 65 20 0a 20 20 20 20 2a 2a  lock the .    **
21310 20 70 61 67 65 72 20 69 66 20 74 68 69 73 20 63   pager if this c
21320 61 6c 6c 20 63 6c 6f 73 65 64 20 74 68 65 20 6f  all closed the o
21330 6e 6c 79 20 72 65 61 64 20 6f 72 20 77 72 69 74  nly read or writ
21340 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20  e transaction.  
21350 2a 2f 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e  */.    p->inTran
21360 73 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a  s = TRANS_NONE;.
21370 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49      unlockBtreeI
21380 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20  fUnused(pBt);.  
21390 7d 0a 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72  }..  btreeIntegr
213a0 69 74 79 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ity(p);.}../*.**
213b0 20 43 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e   Commit the tran
213c0 73 61 63 74 69 6f 6e 20 63 75 72 72 65 6e 74 6c  saction currentl
213d0 79 20 69 6e 20 70 72 6f 67 72 65 73 73 2e 0a 2a  y in progress..*
213e0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
213f0 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65  e implements the
21400 20 73 65 63 6f 6e 64 20 70 68 61 73 65 20 6f 66   second phase of
21410 20 61 20 32 2d 70 68 61 73 65 20 63 6f 6d 6d 69   a 2-phase commi
21420 74 2e 20 20 54 68 65 0a 2a 2a 20 73 71 6c 69 74  t.  The.** sqlit
21430 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
21440 73 65 4f 6e 65 28 29 20 72 6f 75 74 69 6e 65 20  seOne() routine 
21450 64 6f 65 73 20 74 68 65 20 66 69 72 73 74 20 70  does the first p
21460 68 61 73 65 20 61 6e 64 20 73 68 6f 75 6c 64 0a  hase and should.
21470 2a 2a 20 62 65 20 69 6e 76 6f 6b 65 64 20 70 72  ** be invoked pr
21480 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67 20 74  ior to calling t
21490 68 69 73 20 72 6f 75 74 69 6e 65 2e 20 20 54 68  his routine.  Th
214a0 65 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  e sqlite3BtreeCo
214b0 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 0a 2a  mmitPhaseOne().*
214c0 2a 20 72 6f 75 74 69 6e 65 20 64 69 64 20 61 6c  * routine did al
214d0 6c 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 77 72  l the work of wr
214e0 69 74 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f  iting informatio
214f0 6e 20 6f 75 74 20 74 6f 20 64 69 73 6b 20 61 6e  n out to disk an
21500 64 20 66 6c 75 73 68 69 6e 67 20 74 68 65 0a 2a  d flushing the.*
21510 2a 20 63 6f 6e 74 65 6e 74 73 20 73 6f 20 74 68  * contents so th
21520 61 74 20 74 68 65 79 20 61 72 65 20 77 72 69 74  at they are writ
21530 74 65 6e 20 6f 6e 74 6f 20 74 68 65 20 64 69 73  ten onto the dis
21540 6b 20 70 6c 61 74 74 65 72 2e 20 20 41 6c 6c 20  k platter.  All 
21550 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  this.** routine 
21560 68 61 73 20 74 6f 20 64 6f 20 69 73 20 64 65 6c  has to do is del
21570 65 74 65 20 6f 72 20 74 72 75 6e 63 61 74 65 20  ete or truncate 
21580 6f 72 20 7a 65 72 6f 20 74 68 65 20 68 65 61 64  or zero the head
21590 65 72 20 69 6e 20 74 68 65 0a 2a 2a 20 74 68 65  er in the.** the
215a0 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
215b0 6c 20 28 77 68 69 63 68 20 63 61 75 73 65 73 20  l (which causes 
215c0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
215d0 74 6f 20 63 6f 6d 6d 69 74 29 20 61 6e 64 0a 2a  to commit) and.*
215e0 2a 20 64 72 6f 70 20 6c 6f 63 6b 73 2e 0a 2a 2a  * drop locks..**
215f0 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69 66  .** Normally, if
21600 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
21610 20 77 68 69 6c 65 20 74 68 65 20 70 61 67 65 72   while the pager
21620 20 6c 61 79 65 72 20 69 73 20 61 74 74 65 6d 70   layer is attemp
21630 74 69 6e 67 20 74 6f 20 0a 2a 2a 20 66 69 6e 61  ting to .** fina
21640 6c 69 7a 65 20 74 68 65 20 75 6e 64 65 72 6c 79  lize the underly
21650 69 6e 67 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ing journal file
21660 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
21670 72 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72  returns an error
21680 20 61 6e 64 0a 2a 2a 20 74 68 65 20 75 70 70 65   and.** the uppe
21690 72 20 6c 61 79 65 72 20 77 69 6c 6c 20 61 74 74  r layer will att
216a0 65 6d 70 74 20 61 20 72 6f 6c 6c 62 61 63 6b 2e  empt a rollback.
216b0 20 48 6f 77 65 76 65 72 2c 20 69 66 20 74 68 65   However, if the
216c0 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
216d0 0a 2a 2a 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20  .** is non-zero 
216e0 74 68 65 6e 20 74 68 69 73 20 62 2d 74 72 65 65  then this b-tree
216f0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
21700 70 61 72 74 20 6f 66 20 61 20 6d 75 6c 74 69 2d  part of a multi-
21710 66 69 6c 65 20 0a 2a 2a 20 74 72 61 6e 73 61 63  file .** transac
21720 74 69 6f 6e 2e 20 49 6e 20 74 68 69 73 20 63 61  tion. In this ca
21730 73 65 2c 20 74 68 65 20 74 72 61 6e 73 61 63 74  se, the transact
21740 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20  ion has already 
21750 62 65 65 6e 20 63 6f 6d 6d 69 74 74 65 64 20 0a  been committed .
21760 2a 2a 20 28 62 79 20 64 65 6c 65 74 69 6e 67 20  ** (by deleting 
21770 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
21780 20 66 69 6c 65 29 20 61 6e 64 20 74 68 65 20 63   file) and the c
21790 61 6c 6c 65 72 20 77 69 6c 6c 20 69 67 6e 6f 72  aller will ignor
217a0 65 20 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74  e this .** funct
217b0 69 6f 6e 73 20 72 65 74 75 72 6e 20 63 6f 64 65  ions return code
217c0 2e 20 53 6f 2c 20 65 76 65 6e 20 69 66 20 61 6e  . So, even if an
217d0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 69 6e   error occurs in
217e0 20 74 68 65 20 70 61 67 65 72 20 6c 61 79 65 72   the pager layer
217f0 2c 0a 2a 2a 20 72 65 73 65 74 20 74 68 65 20 62  ,.** reset the b
21800 2d 74 72 65 65 20 6f 62 6a 65 63 74 73 20 69 6e  -tree objects in
21810 74 65 72 6e 61 6c 20 73 74 61 74 65 20 74 6f 20  ternal state to 
21820 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 74 68  indicate that th
21830 65 20 77 72 69 74 65 0a 2a 2a 20 74 72 61 6e 73  e write.** trans
21840 61 63 74 69 6f 6e 20 68 61 73 20 62 65 65 6e 20  action has been 
21850 63 6c 6f 73 65 64 2e 20 54 68 69 73 20 69 73 20  closed. This is 
21860 71 75 69 74 65 20 73 61 66 65 2c 20 61 73 20 74  quite safe, as t
21870 68 65 20 70 61 67 65 72 20 77 69 6c 6c 20 68 61  he pager will ha
21880 76 65 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e  ve.** transition
21890 65 64 20 74 6f 20 74 68 65 20 65 72 72 6f 72 20  ed to the error 
218a0 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  state..**.** Thi
218b0 73 20 77 69 6c 6c 20 72 65 6c 65 61 73 65 20 74  s will release t
218c0 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e  he write lock on
218d0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
218e0 6c 65 2e 20 20 49 66 20 74 68 65 72 65 0a 2a 2a  le.  If there.**
218f0 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20 63   are no active c
21900 75 72 73 6f 72 73 2c 20 69 74 20 61 6c 73 6f 20  ursors, it also 
21910 72 65 6c 65 61 73 65 73 20 74 68 65 20 72 65 61  releases the rea
21920 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73  d lock..*/.int s
21930 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
21940 74 50 68 61 73 65 54 77 6f 28 42 74 72 65 65 20  tPhaseTwo(Btree 
21950 2a 70 2c 20 69 6e 74 20 62 43 6c 65 61 6e 75 70  *p, int bCleanup
21960 29 7b 0a 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54  ){..  if( p->inT
21970 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45  rans==TRANS_NONE
21980 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
21990 5f 4f 4b 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  _OK;.  sqlite3Bt
219a0 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 62  reeEnter(p);.  b
219b0 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29  treeIntegrity(p)
219c0 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 68  ;..  /* If the h
219d0 61 6e 64 6c 65 20 68 61 73 20 61 20 77 72 69 74  andle has a writ
219e0 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70  e-transaction op
219f0 65 6e 2c 20 63 6f 6d 6d 69 74 20 74 68 65 20 73  en, commit the s
21a00 68 61 72 65 64 2d 62 74 72 65 65 73 20 0a 20 20  hared-btrees .  
21a10 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61  ** transaction a
21a20 6e 64 20 73 65 74 20 74 68 65 20 73 68 61 72 65  nd set the share
21a30 64 20 73 74 61 74 65 20 74 6f 20 54 52 41 4e 53  d state to TRANS
21a40 5f 52 45 41 44 2e 0a 20 20 2a 2f 0a 20 20 69 66  _READ..  */.  if
21a50 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52  ( p->inTrans==TR
21a60 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20  ANS_WRITE ){.   
21a70 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 42 74 53   int rc;.    BtS
21a80 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
21a90 70 42 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28  pBt;.    assert(
21aa0 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
21ab0 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ion==TRANS_WRITE
21ac0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
21ad0 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f  pBt->nTransactio
21ae0 6e 3e 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  n>0 );.    rc = 
21af0 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d  sqlite3PagerComm
21b00 69 74 50 68 61 73 65 54 77 6f 28 70 42 74 2d 3e  itPhaseTwo(pBt->
21b10 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28  pPager);.    if(
21b20 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc!=SQLITE_OK &
21b30 26 20 62 43 6c 65 61 6e 75 70 3d 3d 30 20 29 7b  & bCleanup==0 ){
21b40 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  .      sqlite3Bt
21b50 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20  reeLeave(p);.   
21b60 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
21b70 20 20 7d 0a 20 20 20 20 70 2d 3e 69 44 61 74 61    }.    p->iData
21b80 56 65 72 73 69 6f 6e 2d 2d 3b 20 20 2f 2a 20 43  Version--;  /* C
21b90 6f 6d 70 65 6e 73 61 74 65 20 66 6f 72 20 70 50  ompensate for pP
21ba0 61 67 65 72 2d 3e 69 44 61 74 61 56 65 72 73 69  ager->iDataVersi
21bb0 6f 6e 2b 2b 3b 20 2a 2f 0a 20 20 20 20 70 42 74  on++; */.    pBt
21bc0 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20  ->inTransaction 
21bd0 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20  = TRANS_READ;.  
21be0 20 20 62 74 72 65 65 43 6c 65 61 72 48 61 73 43    btreeClearHasC
21bf0 6f 6e 74 65 6e 74 28 70 42 74 29 3b 0a 20 20 7d  ontent(pBt);.  }
21c00 0a 0a 20 20 62 74 72 65 65 45 6e 64 54 72 61 6e  ..  btreeEndTran
21c10 73 61 63 74 69 6f 6e 28 70 29 3b 0a 20 20 73 71  saction(p);.  sq
21c20 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
21c30 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  p);.  return SQL
21c40 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
21c50 20 44 6f 20 62 6f 74 68 20 70 68 61 73 65 73 20   Do both phases 
21c60 6f 66 20 61 20 63 6f 6d 6d 69 74 2e 0a 2a 2f 0a  of a commit..*/.
21c70 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
21c80 43 6f 6d 6d 69 74 28 42 74 72 65 65 20 2a 70 29  Commit(Btree *p)
21c90 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71  {.  int rc;.  sq
21ca0 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
21cb0 70 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  p);.  rc = sqlit
21cc0 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
21cd0 73 65 4f 6e 65 28 70 2c 20 30 29 3b 0a 20 20 69  seOne(p, 0);.  i
21ce0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
21cf0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
21d00 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
21d10 68 61 73 65 54 77 6f 28 70 2c 20 30 29 3b 0a 20  haseTwo(p, 0);. 
21d20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65   }.  sqlite3Btre
21d30 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
21d40 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
21d50 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65   This routine se
21d60 74 73 20 74 68 65 20 73 74 61 74 65 20 74 6f 20  ts the state to 
21d70 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 61 6e 64  CURSOR_FAULT and
21d80 20 74 68 65 20 65 72 72 6f 72 0a 2a 2a 20 63 6f   the error.** co
21d90 64 65 20 74 6f 20 65 72 72 43 6f 64 65 20 66 6f  de to errCode fo
21da0 72 20 65 76 65 72 79 20 63 75 72 73 6f 72 20 6f  r every cursor o
21db0 6e 20 61 6e 79 20 42 74 53 68 61 72 65 64 20 74  n any BtShared t
21dc0 68 61 74 20 70 42 74 72 65 65 0a 2a 2a 20 72 65  hat pBtree.** re
21dd0 66 65 72 65 6e 63 65 73 2e 20 20 4f 72 20 69 66  ferences.  Or if
21de0 20 74 68 65 20 77 72 69 74 65 4f 6e 6c 79 20 66   the writeOnly f
21df0 6c 61 67 20 69 73 20 73 65 74 20 74 6f 20 31 2c  lag is set to 1,
21e00 20 74 68 65 6e 20 6f 6e 6c 79 0a 2a 2a 20 74 72   then only.** tr
21e10 69 70 20 77 72 69 74 65 20 63 75 72 73 6f 72 73  ip write cursors
21e20 20 61 6e 64 20 6c 65 61 76 65 20 72 65 61 64 20   and leave read 
21e30 63 75 72 73 6f 72 73 20 75 6e 63 68 61 6e 67 65  cursors unchange
21e40 64 2e 0a 2a 2a 0a 2a 2a 20 45 76 65 72 79 20 63  d..**.** Every c
21e50 75 72 73 6f 72 20 69 73 20 61 20 63 61 6e 64 69  ursor is a candi
21e60 64 61 74 65 20 74 6f 20 62 65 20 74 72 69 70 70  date to be tripp
21e70 65 64 2c 20 69 6e 63 6c 75 64 69 6e 67 20 63 75  ed, including cu
21e80 72 73 6f 72 73 0a 2a 2a 20 74 68 61 74 20 62 65  rsors.** that be
21e90 6c 6f 6e 67 20 74 6f 20 6f 74 68 65 72 20 64 61  long to other da
21ea0 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
21eb0 6e 73 20 74 68 61 74 20 68 61 70 70 65 6e 20 74  ns that happen t
21ec0 6f 20 62 65 0a 2a 2a 20 73 68 61 72 69 6e 67 20  o be.** sharing 
21ed0 74 68 65 20 63 61 63 68 65 20 77 69 74 68 20 70  the cache with p
21ee0 42 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  Btree..**.** Thi
21ef0 73 20 72 6f 75 74 69 6e 65 20 67 65 74 73 20 63  s routine gets c
21f00 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 72 6f 6c  alled when a rol
21f10 6c 62 61 63 6b 20 6f 63 63 75 72 73 2e 20 49 66  lback occurs. If
21f20 20 74 68 65 20 77 72 69 74 65 4f 6e 6c 79 0a 2a   the writeOnly.*
21f30 2a 20 66 6c 61 67 20 69 73 20 74 72 75 65 2c 20  * flag is true, 
21f40 74 68 65 6e 20 6f 6e 6c 79 20 77 72 69 74 65 2d  then only write-
21f50 63 75 72 73 6f 72 73 20 6e 65 65 64 20 62 65 20  cursors need be 
21f60 74 72 69 70 70 65 64 20 2d 20 72 65 61 64 2d 6f  tripped - read-o
21f70 6e 6c 79 0a 2a 2a 20 63 75 72 73 6f 72 73 20 73  nly.** cursors s
21f80 61 76 65 20 74 68 65 69 72 20 63 75 72 72 65 6e  ave their curren
21f90 74 20 70 6f 73 69 74 69 6f 6e 73 20 73 6f 20 74  t positions so t
21fa0 68 61 74 20 74 68 65 79 20 6d 61 79 20 63 6f 6e  hat they may con
21fb0 74 69 6e 75 65 20 0a 2a 2a 20 66 6f 6c 6c 6f 77  tinue .** follow
21fc0 69 6e 67 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  ing the rollback
21fd0 2e 20 4f 72 2c 20 69 66 20 77 72 69 74 65 4f 6e  . Or, if writeOn
21fe0 6c 79 20 69 73 20 66 61 6c 73 65 2c 20 61 6c 6c  ly is false, all
21ff0 20 63 75 72 73 6f 72 73 20 61 72 65 20 0a 2a 2a   cursors are .**
22000 20 74 72 69 70 70 65 64 2e 20 49 6e 20 67 65 6e   tripped. In gen
22010 65 72 61 6c 2c 20 77 72 69 74 65 4f 6e 6c 79 20  eral, writeOnly 
22020 69 73 20 66 61 6c 73 65 20 69 66 20 74 68 65 20  is false if the 
22030 74 72 61 6e 73 61 63 74 69 6f 6e 20 62 65 69 6e  transaction bein
22040 67 0a 2a 2a 20 72 6f 6c 6c 65 64 20 62 61 63 6b  g.** rolled back
22050 20 6d 6f 64 69 66 69 65 64 20 74 68 65 20 64 61   modified the da
22060 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e 20 49  tabase schema. I
22070 6e 20 74 68 69 73 20 63 61 73 65 20 62 2d 74 72  n this case b-tr
22080 65 65 20 72 6f 6f 74 0a 2a 2a 20 70 61 67 65 73  ee root.** pages
22090 20 6d 61 79 20 62 65 20 6d 6f 76 65 64 20 6f 72   may be moved or
220a0 20 64 65 6c 65 74 65 64 20 66 72 6f 6d 20 74 68   deleted from th
220b0 65 20 64 61 74 61 62 61 73 65 20 61 6c 74 6f 67  e database altog
220c0 65 74 68 65 72 2c 20 6d 61 6b 69 6e 67 0a 2a 2a  ether, making.**
220d0 20 69 74 20 75 6e 73 61 66 65 20 66 6f 72 20 72   it unsafe for r
220e0 65 61 64 20 63 75 72 73 6f 72 73 20 74 6f 20 63  ead cursors to c
220f0 6f 6e 74 69 6e 75 65 2e 0a 2a 2a 0a 2a 2a 20 49  ontinue..**.** I
22100 66 20 74 68 65 20 77 72 69 74 65 4f 6e 6c 79 20  f the writeOnly 
22110 66 6c 61 67 20 69 73 20 74 72 75 65 20 61 6e 64  flag is true and
22120 20 61 6e 20 65 72 72 6f 72 20 69 73 20 65 6e 63   an error is enc
22130 6f 75 6e 74 65 72 65 64 20 77 68 69 6c 65 20 0a  ountered while .
22140 2a 2a 20 73 61 76 69 6e 67 20 74 68 65 20 63 75  ** saving the cu
22150 72 72 65 6e 74 20 70 6f 73 69 74 69 6f 6e 20 6f  rrent position o
22160 66 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 63 75  f a read-only cu
22170 72 73 6f 72 2c 20 61 6c 6c 20 63 75 72 73 6f 72  rsor, all cursor
22180 73 2c 20 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e 67  s, .** including
22190 20 61 6c 6c 20 72 65 61 64 2d 63 75 72 73 6f 72   all read-cursor
221a0 73 20 61 72 65 20 74 72 69 70 70 65 64 2e 0a 2a  s are tripped..*
221b0 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69  *.** SQLITE_OK i
221c0 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 73 75  s returned if su
221d0 63 63 65 73 73 66 75 6c 2c 20 6f 72 20 69 66 20  ccessful, or if 
221e0 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
221f0 77 68 69 6c 65 0a 2a 2a 20 73 61 76 69 6e 67 20  while.** saving 
22200 61 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f  a cursor positio
22210 6e 2c 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  n, an SQLite err
22220 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 69 6e 74 20  or code..*/.int 
22230 73 71 6c 69 74 65 33 42 74 72 65 65 54 72 69 70  sqlite3BtreeTrip
22240 41 6c 6c 43 75 72 73 6f 72 73 28 42 74 72 65 65  AllCursors(Btree
22250 20 2a 70 42 74 72 65 65 2c 20 69 6e 74 20 65 72   *pBtree, int er
22260 72 43 6f 64 65 2c 20 69 6e 74 20 77 72 69 74 65  rCode, int write
22270 4f 6e 6c 79 29 7b 0a 20 20 42 74 43 75 72 73 6f  Only){.  BtCurso
22280 72 20 2a 70 3b 0a 20 20 69 6e 74 20 72 63 20 3d  r *p;.  int rc =
22290 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61   SQLITE_OK;..  a
222a0 73 73 65 72 74 28 20 28 77 72 69 74 65 4f 6e 6c  ssert( (writeOnl
222b0 79 3d 3d 30 20 7c 7c 20 77 72 69 74 65 4f 6e 6c  y==0 || writeOnl
222c0 79 3d 3d 31 29 20 26 26 20 42 54 43 46 5f 57 72  y==1) && BTCF_Wr
222d0 69 74 65 46 6c 61 67 3d 3d 31 20 29 3b 0a 20 20  iteFlag==1 );.  
222e0 69 66 28 20 70 42 74 72 65 65 20 29 7b 0a 20 20  if( pBtree ){.  
222f0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
22300 74 65 72 28 70 42 74 72 65 65 29 3b 0a 20 20 20  ter(pBtree);.   
22310 20 66 6f 72 28 70 3d 70 42 74 72 65 65 2d 3e 70   for(p=pBtree->p
22320 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20  Bt->pCursor; p; 
22330 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  p=p->pNext){.   
22340 20 20 20 69 66 28 20 77 72 69 74 65 4f 6e 6c 79     if( writeOnly
22350 20 26 26 20 28 70 2d 3e 63 75 72 46 6c 61 67 73   && (p->curFlags
22360 20 26 20 42 54 43 46 5f 57 72 69 74 65 46 6c 61   & BTCF_WriteFla
22370 67 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  g)==0 ){.       
22380 20 69 66 28 20 70 2d 3e 65 53 74 61 74 65 3d 3d   if( p->eState==
22390 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20  CURSOR_VALID || 
223a0 70 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  p->eState==CURSO
223b0 52 5f 53 4b 49 50 4e 45 58 54 20 29 7b 0a 20 20  R_SKIPNEXT ){.  
223c0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 61 76          rc = sav
223d0 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
223e0 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  p);.          if
223f0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
22400 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 28  ){.            (
22410 76 6f 69 64 29 73 71 6c 69 74 65 33 42 74 72 65  void)sqlite3Btre
22420 65 54 72 69 70 41 6c 6c 43 75 72 73 6f 72 73 28  eTripAllCursors(
22430 70 42 74 72 65 65 2c 20 72 63 2c 20 30 29 3b 0a  pBtree, rc, 0);.
22440 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
22450 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  k;.          }. 
22460 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
22470 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
22480 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61 72 43  lite3BtreeClearC
22490 75 72 73 6f 72 28 70 29 3b 0a 20 20 20 20 20 20  ursor(p);.      
224a0 20 20 70 2d 3e 65 53 74 61 74 65 20 3d 20 43 55    p->eState = CU
224b0 52 53 4f 52 5f 46 41 55 4c 54 3b 0a 20 20 20 20  RSOR_FAULT;.    
224c0 20 20 20 20 70 2d 3e 73 6b 69 70 4e 65 78 74 20      p->skipNext 
224d0 3d 20 65 72 72 43 6f 64 65 3b 0a 20 20 20 20 20  = errCode;.     
224e0 20 7d 0a 20 20 20 20 20 20 62 74 72 65 65 52 65   }.      btreeRe
224f0 6c 65 61 73 65 41 6c 6c 43 75 72 73 6f 72 50 61  leaseAllCursorPa
22500 67 65 73 28 70 29 3b 0a 20 20 20 20 7d 0a 20 20  ges(p);.    }.  
22510 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
22520 61 76 65 28 70 42 74 72 65 65 29 3b 0a 20 20 7d  ave(pBtree);.  }
22530 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
22540 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20  ./*.** Rollback 
22550 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
22560 69 6e 20 70 72 6f 67 72 65 73 73 2e 0a 2a 2a 0a  in progress..**.
22570 2a 2a 20 49 66 20 74 72 69 70 43 6f 64 65 20 69  ** If tripCode i
22580 73 20 6e 6f 74 20 53 51 4c 49 54 45 5f 4f 4b 20  s not SQLITE_OK 
22590 74 68 65 6e 20 63 75 72 73 6f 72 73 20 77 69 6c  then cursors wil
225a0 6c 20 62 65 20 69 6e 76 61 6c 69 64 61 74 65 64  l be invalidated
225b0 20 28 74 72 69 70 70 65 64 29 2e 0a 2a 2a 20 4f   (tripped)..** O
225c0 6e 6c 79 20 77 72 69 74 65 20 63 75 72 73 6f 72  nly write cursor
225d0 73 20 61 72 65 20 74 72 69 70 70 65 64 20 69 66  s are tripped if
225e0 20 77 72 69 74 65 4f 6e 6c 79 20 69 73 20 74 72   writeOnly is tr
225f0 75 65 20 62 75 74 20 61 6c 6c 20 63 75 72 73 6f  ue but all curso
22600 72 73 20 61 72 65 0a 2a 2a 20 74 72 69 70 70 65  rs are.** trippe
22610 64 20 69 66 20 77 72 69 74 65 4f 6e 6c 79 20 69  d if writeOnly i
22620 73 20 66 61 6c 73 65 2e 20 20 41 6e 79 20 61 74  s false.  Any at
22630 74 65 6d 70 74 20 74 6f 20 75 73 65 0a 2a 2a 20  tempt to use.** 
22640 61 20 74 72 69 70 70 65 64 20 63 75 72 73 6f 72  a tripped cursor
22650 20 77 69 6c 6c 20 72 65 73 75 6c 74 20 69 6e 20   will result in 
22660 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20  an error..**.** 
22670 54 68 69 73 20 77 69 6c 6c 20 72 65 6c 65 61 73  This will releas
22680 65 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b  e the write lock
22690 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
226a0 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65 72 65   file.  If there
226b0 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74 69 76  .** are no activ
226c0 65 20 63 75 72 73 6f 72 73 2c 20 69 74 20 61 6c  e cursors, it al
226d0 73 6f 20 72 65 6c 65 61 73 65 73 20 74 68 65 20  so releases the 
226e0 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e  read lock..*/.in
226f0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f  t sqlite3BtreeRo
22700 6c 6c 62 61 63 6b 28 42 74 72 65 65 20 2a 70 2c  llback(Btree *p,
22710 20 69 6e 74 20 74 72 69 70 43 6f 64 65 2c 20 69   int tripCode, i
22720 6e 74 20 77 72 69 74 65 4f 6e 6c 79 29 7b 0a 20  nt writeOnly){. 
22730 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61   int rc;.  BtSha
22740 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
22750 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  t;.  MemPage *pP
22760 61 67 65 31 3b 0a 0a 20 20 61 73 73 65 72 74 28  age1;..  assert(
22770 20 77 72 69 74 65 4f 6e 6c 79 3d 3d 31 20 7c 7c   writeOnly==1 ||
22780 20 77 72 69 74 65 4f 6e 6c 79 3d 3d 30 20 29 3b   writeOnly==0 );
22790 0a 20 20 61 73 73 65 72 74 28 20 74 72 69 70 43  .  assert( tripC
227a0 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 41 42 4f 52  ode==SQLITE_ABOR
227b0 54 5f 52 4f 4c 4c 42 41 43 4b 20 7c 7c 20 74 72  T_ROLLBACK || tr
227c0 69 70 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f  ipCode==SQLITE_O
227d0 4b 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  K );.  sqlite3Bt
227e0 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 69  reeEnter(p);.  i
227f0 66 28 20 74 72 69 70 43 6f 64 65 3d 3d 53 51 4c  f( tripCode==SQL
22800 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
22810 20 3d 20 74 72 69 70 43 6f 64 65 20 3d 20 73 61   = tripCode = sa
22820 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74  veAllCursors(pBt
22830 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  , 0, 0);.    if(
22840 20 72 63 20 29 20 77 72 69 74 65 4f 6e 6c 79 20   rc ) writeOnly 
22850 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
22860 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
22870 3b 0a 20 20 7d 0a 20 20 69 66 28 20 74 72 69 70  ;.  }.  if( trip
22880 43 6f 64 65 20 29 7b 0a 20 20 20 20 69 6e 74 20  Code ){.    int 
22890 72 63 32 20 3d 20 73 71 6c 69 74 65 33 42 74 72  rc2 = sqlite3Btr
228a0 65 65 54 72 69 70 41 6c 6c 43 75 72 73 6f 72 73  eeTripAllCursors
228b0 28 70 2c 20 74 72 69 70 43 6f 64 65 2c 20 77 72  (p, tripCode, wr
228c0 69 74 65 4f 6e 6c 79 29 3b 0a 20 20 20 20 61 73  iteOnly);.    as
228d0 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
228e0 5f 4f 4b 20 7c 7c 20 28 77 72 69 74 65 4f 6e 6c  _OK || (writeOnl
228f0 79 3d 3d 30 20 26 26 20 72 63 32 3d 3d 53 51 4c  y==0 && rc2==SQL
22900 49 54 45 5f 4f 4b 29 20 29 3b 0a 20 20 20 20 69  ITE_OK) );.    i
22910 66 28 20 72 63 32 21 3d 53 51 4c 49 54 45 5f 4f  f( rc2!=SQLITE_O
22920 4b 20 29 20 72 63 20 3d 20 72 63 32 3b 0a 20 20  K ) rc = rc2;.  
22930 7d 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72 69  }.  btreeIntegri
22940 74 79 28 70 29 3b 0a 0a 20 20 69 66 28 20 70 2d  ty(p);..  if( p-
22950 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
22960 57 52 49 54 45 20 29 7b 0a 20 20 20 20 69 6e 74  WRITE ){.    int
22970 20 72 63 32 3b 0a 0a 20 20 20 20 61 73 73 65 72   rc2;..    asser
22980 74 28 20 54 52 41 4e 53 5f 57 52 49 54 45 3d 3d  t( TRANS_WRITE==
22990 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
229a0 6f 6e 20 29 3b 0a 20 20 20 20 72 63 32 20 3d 20  on );.    rc2 = 
229b0 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c  sqlite3PagerRoll
229c0 62 61 63 6b 28 70 42 74 2d 3e 70 50 61 67 65 72  back(pBt->pPager
229d0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 32 21 3d  );.    if( rc2!=
229e0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
229f0 20 20 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 20     rc = rc2;.   
22a00 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 72   }..    /* The r
22a10 6f 6c 6c 62 61 63 6b 20 6d 61 79 20 68 61 76 65  ollback may have
22a20 20 64 65 73 74 72 6f 79 65 64 20 74 68 65 20 70   destroyed the p
22a30 50 61 67 65 31 2d 3e 61 44 61 74 61 20 76 61 6c  Page1->aData val
22a40 75 65 2e 20 20 53 6f 0a 20 20 20 20 2a 2a 20 63  ue.  So.    ** c
22a50 61 6c 6c 20 62 74 72 65 65 47 65 74 50 61 67 65  all btreeGetPage
22a60 28 29 20 6f 6e 20 70 61 67 65 20 31 20 61 67 61  () on page 1 aga
22a70 69 6e 20 74 6f 20 6d 61 6b 65 0a 20 20 20 20 2a  in to make.    *
22a80 2a 20 73 75 72 65 20 70 50 61 67 65 31 2d 3e 61  * sure pPage1->a
22a90 44 61 74 61 20 69 73 20 73 65 74 20 63 6f 72 72  Data is set corr
22aa0 65 63 74 6c 79 2e 20 2a 2f 0a 20 20 20 20 69 66  ectly. */.    if
22ab0 28 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70  ( btreeGetPage(p
22ac0 42 74 2c 20 31 2c 20 26 70 50 61 67 65 31 2c 20  Bt, 1, &pPage1, 
22ad0 30 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  0)==SQLITE_OK ){
22ae0 0a 20 20 20 20 20 20 69 6e 74 20 6e 50 61 67 65  .      int nPage
22af0 20 3d 20 67 65 74 34 62 79 74 65 28 32 38 2b 28   = get4byte(28+(
22b00 75 38 2a 29 70 50 61 67 65 31 2d 3e 61 44 61 74  u8*)pPage1->aDat
22b10 61 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  a);.      testca
22b20 73 65 28 20 6e 50 61 67 65 3d 3d 30 20 29 3b 0a  se( nPage==0 );.
22b30 20 20 20 20 20 20 69 66 28 20 6e 50 61 67 65 3d        if( nPage=
22b40 3d 30 20 29 20 73 71 6c 69 74 65 33 50 61 67 65  =0 ) sqlite3Page
22b50 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e  rPagecount(pBt->
22b60 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b  pPager, &nPage);
22b70 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
22b80 20 70 42 74 2d 3e 6e 50 61 67 65 21 3d 6e 50 61   pBt->nPage!=nPa
22b90 67 65 20 29 3b 0a 20 20 20 20 20 20 70 42 74 2d  ge );.      pBt-
22ba0 3e 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 3b 0a  >nPage = nPage;.
22bb0 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
22bc0 65 4f 6e 65 28 70 50 61 67 65 31 29 3b 0a 20 20  eOne(pPage1);.  
22bd0 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
22be0 63 6f 75 6e 74 56 61 6c 69 64 43 75 72 73 6f 72  countValidCursor
22bf0 73 28 70 42 74 2c 20 31 29 3d 3d 30 20 29 3b 0a  s(pBt, 1)==0 );.
22c00 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73      pBt->inTrans
22c10 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 52  action = TRANS_R
22c20 45 41 44 3b 0a 20 20 20 20 62 74 72 65 65 43 6c  EAD;.    btreeCl
22c30 65 61 72 48 61 73 43 6f 6e 74 65 6e 74 28 70 42  earHasContent(pB
22c40 74 29 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65  t);.  }..  btree
22c50 45 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70  EndTransaction(p
22c60 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
22c70 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
22c80 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
22c90 20 53 74 61 72 74 20 61 20 73 74 61 74 65 6d 65   Start a stateme
22ca0 6e 74 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f  nt subtransactio
22cb0 6e 2e 20 54 68 65 20 73 75 62 74 72 61 6e 73 61  n. The subtransa
22cc0 63 74 69 6f 6e 20 63 61 6e 20 62 65 20 72 6f 6c  ction can be rol
22cd0 6c 65 64 0a 2a 2a 20 62 61 63 6b 20 69 6e 64 65  led.** back inde
22ce0 70 65 6e 64 65 6e 74 6c 79 20 6f 66 20 74 68 65  pendently of the
22cf0 20 6d 61 69 6e 20 74 72 61 6e 73 61 63 74 69 6f   main transactio
22d00 6e 2e 20 59 6f 75 20 6d 75 73 74 20 73 74 61 72  n. You must star
22d10 74 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  t a transaction 
22d20 0a 2a 2a 20 62 65 66 6f 72 65 20 73 74 61 72 74  .** before start
22d30 69 6e 67 20 61 20 73 75 62 74 72 61 6e 73 61 63  ing a subtransac
22d40 74 69 6f 6e 2e 20 54 68 65 20 73 75 62 74 72 61  tion. The subtra
22d50 6e 73 61 63 74 69 6f 6e 20 69 73 20 65 6e 64 65  nsaction is ende
22d60 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  d automatically 
22d70 0a 2a 2a 20 69 66 20 74 68 65 20 6d 61 69 6e 20  .** if the main 
22d80 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 6d 6d  transaction comm
22d90 69 74 73 20 6f 72 20 72 6f 6c 6c 73 20 62 61 63  its or rolls bac
22da0 6b 2e 0a 2a 2a 0a 2a 2a 20 53 74 61 74 65 6d 65  k..**.** Stateme
22db0 6e 74 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f  nt subtransactio
22dc0 6e 73 20 61 72 65 20 75 73 65 64 20 61 72 6f 75  ns are used arou
22dd0 6e 64 20 69 6e 64 69 76 69 64 75 61 6c 20 53 51  nd individual SQ
22de0 4c 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2a 20  L statements.** 
22df0 74 68 61 74 20 61 72 65 20 63 6f 6e 74 61 69 6e  that are contain
22e00 65 64 20 77 69 74 68 69 6e 20 61 20 42 45 47 49  ed within a BEGI
22e10 4e 2e 2e 2e 43 4f 4d 4d 49 54 20 62 6c 6f 63 6b  N...COMMIT block
22e20 2e 20 20 49 66 20 61 20 63 6f 6e 73 74 72 61 69  .  If a constrai
22e30 6e 74 0a 2a 2a 20 65 72 72 6f 72 20 6f 63 63 75  nt.** error occu
22e40 72 73 20 77 69 74 68 69 6e 20 74 68 65 20 73 74  rs within the st
22e50 61 74 65 6d 65 6e 74 2c 20 74 68 65 20 65 66 66  atement, the eff
22e60 65 63 74 20 6f 66 20 74 68 61 74 20 6f 6e 65 20  ect of that one 
22e70 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 63 61 6e  statement.** can
22e80 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20   be rolled back 
22e90 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74  without having t
22ea0 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 65  o rollback the e
22eb0 6e 74 69 72 65 20 74 72 61 6e 73 61 63 74 69 6f  ntire transactio
22ec0 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20 73 74 61 74 65  n..**.** A state
22ed0 6d 65 6e 74 20 73 75 62 2d 74 72 61 6e 73 61 63  ment sub-transac
22ee0 74 69 6f 6e 20 69 73 20 69 6d 70 6c 65 6d 65 6e  tion is implemen
22ef0 74 65 64 20 61 73 20 61 6e 20 61 6e 6f 6e 79 6d  ted as an anonym
22f00 6f 75 73 20 73 61 76 65 70 6f 69 6e 74 2e 20 54  ous savepoint. T
22f10 68 65 0a 2a 2a 20 76 61 6c 75 65 20 70 61 73 73  he.** value pass
22f20 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
22f30 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74 68   parameter is th
22f40 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  e total number o
22f50 66 20 73 61 76 65 70 6f 69 6e 74 73 2c 0a 2a 2a  f savepoints,.**
22f60 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 6e   including the n
22f70 65 77 20 61 6e 6f 6e 79 6d 6f 75 73 20 73 61 76  ew anonymous sav
22f80 65 70 6f 69 6e 74 2c 20 6f 70 65 6e 20 6f 6e 20  epoint, open on 
22f90 74 68 65 20 42 2d 54 72 65 65 2e 20 69 2e 65 2e  the B-Tree. i.e.
22fa0 20 69 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65   if there.** are
22fb0 20 6e 6f 20 61 63 74 69 76 65 20 73 61 76 65 70   no active savep
22fc0 6f 69 6e 74 73 20 61 6e 64 20 6e 6f 20 6f 74 68  oints and no oth
22fd0 65 72 20 73 74 61 74 65 6d 65 6e 74 2d 74 72 61  er statement-tra
22fe0 6e 73 61 63 74 69 6f 6e 73 20 6f 70 65 6e 2c 0a  nsactions open,.
22ff0 2a 2a 20 69 53 74 61 74 65 6d 65 6e 74 20 69 73  ** iStatement is
23000 20 31 2e 20 54 68 69 73 20 61 6e 6f 6e 79 6d 6f   1. This anonymo
23010 75 73 20 73 61 76 65 70 6f 69 6e 74 20 63 61 6e  us savepoint can
23020 20 62 65 20 72 65 6c 65 61 73 65 64 20 6f 72 20   be released or 
23030 72 6f 6c 6c 65 64 20 62 61 63 6b 0a 2a 2a 20 75  rolled back.** u
23040 73 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65 33  sing the sqlite3
23050 42 74 72 65 65 53 61 76 65 70 6f 69 6e 74 28 29  BtreeSavepoint()
23060 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e   function..*/.in
23070 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 42 65  t sqlite3BtreeBe
23080 67 69 6e 53 74 6d 74 28 42 74 72 65 65 20 2a 70  ginStmt(Btree *p
23090 2c 20 69 6e 74 20 69 53 74 61 74 65 6d 65 6e 74  , int iStatement
230a0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42  ){.  int rc;.  B
230b0 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
230c0 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74 65 33  ->pBt;.  sqlite3
230d0 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
230e0 20 61 73 73 65 72 74 28 20 70 2d 3e 69 6e 54 72   assert( p->inTr
230f0 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans==TRANS_WRITE
23100 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70   );.  assert( (p
23110 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42  Bt->btsFlags & B
23120 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 29 3d 3d 30  TS_READ_ONLY)==0
23130 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 53   );.  assert( iS
23140 74 61 74 65 6d 65 6e 74 3e 30 20 29 3b 0a 20 20  tatement>0 );.  
23150 61 73 73 65 72 74 28 20 69 53 74 61 74 65 6d 65  assert( iStateme
23160 6e 74 3e 70 2d 3e 64 62 2d 3e 6e 53 61 76 65 70  nt>p->db->nSavep
23170 6f 69 6e 74 20 29 3b 0a 20 20 61 73 73 65 72 74  oint );.  assert
23180 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  ( pBt->inTransac
23190 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54  tion==TRANS_WRIT
231a0 45 20 29 3b 0a 20 20 2f 2a 20 41 74 20 74 68 65  E );.  /* At the
231b0 20 70 61 67 65 72 20 6c 65 76 65 6c 2c 20 61 20   pager level, a 
231c0 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61  statement transa
231d0 63 74 69 6f 6e 20 69 73 20 61 20 73 61 76 65 70  ction is a savep
231e0 6f 69 6e 74 20 77 69 74 68 0a 20 20 2a 2a 20 61  oint with.  ** a
231f0 6e 20 69 6e 64 65 78 20 67 72 65 61 74 65 72 20  n index greater 
23200 74 68 61 6e 20 61 6c 6c 20 73 61 76 65 70 6f 69  than all savepoi
23210 6e 74 73 20 63 72 65 61 74 65 64 20 65 78 70 6c  nts created expl
23220 69 63 69 74 6c 79 20 75 73 69 6e 67 0a 20 20 2a  icitly using.  *
23230 2a 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73  * SQL statements
23240 2e 20 49 74 20 69 73 20 69 6c 6c 65 67 61 6c 20  . It is illegal 
23250 74 6f 20 6f 70 65 6e 2c 20 72 65 6c 65 61 73 65  to open, release
23260 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 79   or rollback any
23270 0a 20 20 2a 2a 20 73 75 63 68 20 73 61 76 65 70  .  ** such savep
23280 6f 69 6e 74 73 20 77 68 69 6c 65 20 74 68 65 20  oints while the 
23290 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61  statement transa
232a0 63 74 69 6f 6e 20 73 61 76 65 70 6f 69 6e 74 20  ction savepoint 
232b0 69 73 20 61 63 74 69 76 65 2e 0a 20 20 2a 2f 0a  is active..  */.
232c0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
232d0 67 65 72 4f 70 65 6e 53 61 76 65 70 6f 69 6e 74  gerOpenSavepoint
232e0 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 69 53  (pBt->pPager, iS
232f0 74 61 74 65 6d 65 6e 74 29 3b 0a 20 20 73 71 6c  tatement);.  sql
23300 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
23310 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
23320 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 65 63  }../*.** The sec
23330 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  ond argument to 
23340 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 6f  this function, o
23350 70 2c 20 69 73 20 61 6c 77 61 79 73 20 53 41 56  p, is always SAV
23360 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 0a  EPOINT_ROLLBACK.
23370 2a 2a 20 6f 72 20 53 41 56 45 50 4f 49 4e 54 5f  ** or SAVEPOINT_
23380 52 45 4c 45 41 53 45 2e 20 54 68 69 73 20 66 75  RELEASE. This fu
23390 6e 63 74 69 6f 6e 20 65 69 74 68 65 72 20 72 65  nction either re
233a0 6c 65 61 73 65 73 20 6f 72 20 72 6f 6c 6c 73 20  leases or rolls 
233b0 62 61 63 6b 20 74 68 65 0a 2a 2a 20 73 61 76 65  back the.** save
233c0 70 6f 69 6e 74 20 69 64 65 6e 74 69 66 69 65 64  point identified
233d0 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 69 53   by parameter iS
233e0 61 76 65 70 6f 69 6e 74 2c 20 64 65 70 65 6e 64  avepoint, depend
233f0 69 6e 67 20 6f 6e 20 74 68 65 20 76 61 6c 75 65  ing on the value
23400 20 0a 2a 2a 20 6f 66 20 6f 70 2e 0a 2a 2a 0a 2a   .** of op..**.*
23410 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69 53 61 76  * Normally, iSav
23420 65 70 6f 69 6e 74 20 69 73 20 67 72 65 61 74 65  epoint is greate
23430 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20  r than or equal 
23440 74 6f 20 7a 65 72 6f 2e 20 48 6f 77 65 76 65 72  to zero. However
23450 2c 20 69 66 20 6f 70 20 69 73 0a 2a 2a 20 53 41  , if op is.** SA
23460 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
23470 2c 20 74 68 65 6e 20 69 53 61 76 65 70 6f 69 6e  , then iSavepoin
23480 74 20 6d 61 79 20 61 6c 73 6f 20 62 65 20 2d 31  t may also be -1
23490 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74  . In this case t
234a0 68 65 20 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20  he .** contents 
234b0 6f 66 20 74 68 65 20 65 6e 74 69 72 65 20 74 72  of the entire tr
234c0 61 6e 73 61 63 74 69 6f 6e 20 61 72 65 20 72 6f  ansaction are ro
234d0 6c 6c 65 64 20 62 61 63 6b 2e 20 54 68 69 73 20  lled back. This 
234e0 69 73 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20  is different.** 
234f0 66 72 6f 6d 20 61 20 6e 6f 72 6d 61 6c 20 74 72  from a normal tr
23500 61 6e 73 61 63 74 69 6f 6e 20 72 6f 6c 6c 62 61  ansaction rollba
23510 63 6b 2c 20 61 73 20 6e 6f 20 6c 6f 63 6b 73 20  ck, as no locks 
23520 61 72 65 20 72 65 6c 65 61 73 65 64 20 61 6e 64  are released and
23530 20 74 68 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74   the.** transact
23540 69 6f 6e 20 72 65 6d 61 69 6e 73 20 6f 70 65 6e  ion remains open
23550 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
23560 42 74 72 65 65 53 61 76 65 70 6f 69 6e 74 28 42  BtreeSavepoint(B
23570 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6f 70 2c  tree *p, int op,
23580 20 69 6e 74 20 69 53 61 76 65 70 6f 69 6e 74 29   int iSavepoint)
23590 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
235a0 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 20  ITE_OK;.  if( p 
235b0 26 26 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  && p->inTrans==T
235c0 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20  RANS_WRITE ){.  
235d0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
235e0 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 20 20 61 73  = p->pBt;.    as
235f0 73 65 72 74 28 20 6f 70 3d 3d 53 41 56 45 50 4f  sert( op==SAVEPO
23600 49 4e 54 5f 52 45 4c 45 41 53 45 20 7c 7c 20 6f  INT_RELEASE || o
23610 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  p==SAVEPOINT_ROL
23620 4c 42 41 43 4b 20 29 3b 0a 20 20 20 20 61 73 73  LBACK );.    ass
23630 65 72 74 28 20 69 53 61 76 65 70 6f 69 6e 74 3e  ert( iSavepoint>
23640 3d 30 20 7c 7c 20 28 69 53 61 76 65 70 6f 69 6e  =0 || (iSavepoin
23650 74 3d 3d 2d 31 20 26 26 20 6f 70 3d 3d 53 41 56  t==-1 && op==SAV
23660 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 29  EPOINT_ROLLBACK)
23670 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42   );.    sqlite3B
23680 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
23690 20 20 69 66 28 20 6f 70 3d 3d 53 41 56 45 50 4f    if( op==SAVEPO
236a0 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a  INT_ROLLBACK ){.
236b0 20 20 20 20 20 20 72 63 20 3d 20 73 61 76 65 41        rc = saveA
236c0 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20 30  llCursors(pBt, 0
236d0 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 0);.    }.    
236e0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
236f0 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
23700 73 71 6c 69 74 65 33 50 61 67 65 72 53 61 76 65  sqlite3PagerSave
23710 70 6f 69 6e 74 28 70 42 74 2d 3e 70 50 61 67 65  point(pBt->pPage
23720 72 2c 20 6f 70 2c 20 69 53 61 76 65 70 6f 69 6e  r, op, iSavepoin
23730 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  t);.    }.    if
23740 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
23750 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 53 61  ){.      if( iSa
23760 76 65 70 6f 69 6e 74 3c 30 20 26 26 20 28 70 42  vepoint<0 && (pB
23770 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54  t->btsFlags & BT
23780 53 5f 49 4e 49 54 49 41 4c 4c 59 5f 45 4d 50 54  S_INITIALLY_EMPT
23790 59 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  Y)!=0 ){.       
237a0 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 30 3b   pBt->nPage = 0;
237b0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
237c0 63 20 3d 20 6e 65 77 44 61 74 61 62 61 73 65 28  c = newDatabase(
237d0 70 42 74 29 3b 0a 20 20 20 20 20 20 70 42 74 2d  pBt);.      pBt-
237e0 3e 6e 50 61 67 65 20 3d 20 67 65 74 34 62 79 74  >nPage = get4byt
237f0 65 28 32 38 20 2b 20 70 42 74 2d 3e 70 50 61 67  e(28 + pBt->pPag
23800 65 31 2d 3e 61 44 61 74 61 29 3b 0a 0a 20 20 20  e1->aData);..   
23810 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
23820 73 65 20 73 69 7a 65 20 77 61 73 20 77 72 69 74  se size was writ
23830 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6f 66 66  ten into the off
23840 73 65 74 20 32 38 20 6f 66 20 74 68 65 20 68 65  set 28 of the he
23850 61 64 65 72 0a 20 20 20 20 20 20 2a 2a 20 77 68  ader.      ** wh
23860 65 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  en the transacti
23870 6f 6e 20 73 74 61 72 74 65 64 2c 20 73 6f 20 77  on started, so w
23880 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20  e know that the 
23890 76 61 6c 75 65 20 61 74 20 6f 66 66 73 65 74 0a  value at offset.
238a0 20 20 20 20 20 20 2a 2a 20 32 38 20 69 73 20 6e        ** 28 is n
238b0 6f 6e 7a 65 72 6f 2e 20 2a 2f 0a 20 20 20 20 20  onzero. */.     
238c0 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6e 50   assert( pBt->nP
238d0 61 67 65 3e 30 20 29 3b 0a 20 20 20 20 7d 0a 20  age>0 );.    }. 
238e0 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c     sqlite3BtreeL
238f0 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a 20 20 72  eave(p);.  }.  r
23900 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
23910 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  ** Create a new 
23920 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20 42  cursor for the B
23930 54 72 65 65 20 77 68 6f 73 65 20 72 6f 6f 74 20  Tree whose root 
23940 69 73 20 6f 6e 20 74 68 65 20 70 61 67 65 0a 2a  is on the page.*
23950 2a 20 69 54 61 62 6c 65 2e 20 49 66 20 61 20 72  * iTable. If a r
23960 65 61 64 2d 6f 6e 6c 79 20 63 75 72 73 6f 72 20  ead-only cursor 
23970 69 73 20 72 65 71 75 65 73 74 65 64 2c 20 69 74  is requested, it
23980 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74   is assumed that
23990 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72 20 61  .** the caller a
239a0 6c 72 65 61 64 79 20 68 61 73 20 61 74 20 6c 65  lready has at le
239b0 61 73 74 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20  ast a read-only 
239c0 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e  transaction open
239d0 0a 2a 2a 20 6f 6e 20 74 68 65 20 64 61 74 61 62  .** on the datab
239e0 61 73 65 20 61 6c 72 65 61 64 79 2e 20 49 66 20  ase already. If 
239f0 61 20 77 72 69 74 65 2d 63 75 72 73 6f 72 20 69  a write-cursor i
23a00 73 20 72 65 71 75 65 73 74 65 64 2c 20 74 68 65  s requested, the
23a10 6e 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72 20  n.** the caller 
23a20 69 73 20 61 73 73 75 6d 65 64 20 74 6f 20 68 61  is assumed to ha
23a30 76 65 20 61 6e 20 6f 70 65 6e 20 77 72 69 74 65  ve an open write
23a40 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
23a50 0a 2a 2a 20 49 66 20 74 68 65 20 42 54 52 45 45  .** If the BTREE
23a60 5f 57 52 43 53 52 20 62 69 74 20 6f 66 20 77 72  _WRCSR bit of wr
23a70 46 6c 61 67 20 69 73 20 63 6c 65 61 72 2c 20 74  Flag is clear, t
23a80 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20 63  hen the cursor c
23a90 61 6e 20 6f 6e 6c 79 0a 2a 2a 20 62 65 20 75 73  an only.** be us
23aa0 65 64 20 66 6f 72 20 72 65 61 64 69 6e 67 2e 20  ed for reading. 
23ab0 20 49 66 20 74 68 65 20 42 54 52 45 45 5f 57 52   If the BTREE_WR
23ac0 43 53 52 20 62 69 74 20 69 73 20 73 65 74 2c 20  CSR bit is set, 
23ad0 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 0a  then the cursor.
23ae0 2a 2a 20 63 61 6e 20 62 65 20 75 73 65 64 20 66  ** can be used f
23af0 6f 72 20 72 65 61 64 69 6e 67 20 6f 72 20 66 6f  or reading or fo
23b00 72 20 77 72 69 74 69 6e 67 20 69 66 20 6f 74 68  r writing if oth
23b10 65 72 20 63 6f 6e 64 69 74 69 6f 6e 73 20 66 6f  er conditions fo
23b20 72 20 77 72 69 74 69 6e 67 0a 2a 2a 20 61 72 65  r writing.** are
23b30 20 61 6c 73 6f 20 6d 65 74 2e 20 20 54 68 65 73   also met.  Thes
23b40 65 20 61 72 65 20 74 68 65 20 63 6f 6e 64 69 74  e are the condit
23b50 69 6f 6e 73 20 74 68 61 74 20 6d 75 73 74 20 62  ions that must b
23b60 65 20 6d 65 74 20 69 6e 20 6f 72 64 65 72 0a 2a  e met in order.*
23b70 2a 20 66 6f 72 20 77 72 69 74 69 6e 67 20 74 6f  * for writing to
23b80 20 62 65 20 61 6c 6c 6f 77 65 64 3a 0a 2a 2a 0a   be allowed:.**.
23b90 2a 2a 20 31 3a 20 20 54 68 65 20 63 75 72 73 6f  ** 1:  The curso
23ba0 72 20 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e  r must have been
23bb0 20 6f 70 65 6e 65 64 20 77 69 74 68 20 77 72 46   opened with wrF
23bc0 6c 61 67 20 63 6f 6e 74 61 69 6e 69 6e 67 20 42  lag containing B
23bd0 54 52 45 45 5f 57 52 43 53 52 0a 2a 2a 0a 2a 2a  TREE_WRCSR.**.**
23be0 20 32 3a 20 20 4f 74 68 65 72 20 64 61 74 61 62   2:  Other datab
23bf0 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20  ase connections 
23c00 74 68 61 74 20 73 68 61 72 65 20 74 68 65 20 73  that share the s
23c10 61 6d 65 20 70 61 67 65 72 20 63 61 63 68 65 0a  ame pager cache.
23c20 2a 2a 20 20 20 20 20 62 75 74 20 77 68 69 63 68  **     but which
23c30 20 61 72 65 20 6e 6f 74 20 69 6e 20 74 68 65 20   are not in the 
23c40 52 45 41 44 5f 55 4e 43 4f 4d 4d 49 54 54 45 44  READ_UNCOMMITTED
23c50 20 73 74 61 74 65 20 6d 61 79 20 6e 6f 74 20 68   state may not h
23c60 61 76 65 0a 2a 2a 20 20 20 20 20 63 75 72 73 6f  ave.**     curso
23c70 72 73 20 6f 70 65 6e 20 77 69 74 68 20 77 72 46  rs open with wrF
23c80 6c 61 67 3d 3d 30 20 6f 6e 20 74 68 65 20 73 61  lag==0 on the sa
23c90 6d 65 20 74 61 62 6c 65 2e 20 20 4f 74 68 65 72  me table.  Other
23ca0 77 69 73 65 0a 2a 2a 20 20 20 20 20 74 68 65 20  wise.**     the 
23cb0 63 68 61 6e 67 65 73 20 6d 61 64 65 20 62 79 20  changes made by 
23cc0 74 68 69 73 20 77 72 69 74 65 20 63 75 72 73 6f  this write curso
23cd0 72 20 77 6f 75 6c 64 20 62 65 20 76 69 73 69 62  r would be visib
23ce0 6c 65 20 74 6f 0a 2a 2a 20 20 20 20 20 74 68 65  le to.**     the
23cf0 20 72 65 61 64 20 63 75 72 73 6f 72 73 20 69 6e   read cursors in
23d00 20 74 68 65 20 6f 74 68 65 72 20 64 61 74 61 62   the other datab
23d10 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a  ase connection..
23d20 2a 2a 0a 2a 2a 20 33 3a 20 20 54 68 65 20 64 61  **.** 3:  The da
23d30 74 61 62 61 73 65 20 6d 75 73 74 20 62 65 20 77  tabase must be w
23d40 72 69 74 61 62 6c 65 20 28 6e 6f 74 20 6f 6e 20  ritable (not on 
23d50 72 65 61 64 2d 6f 6e 6c 79 20 6d 65 64 69 61 29  read-only media)
23d60 0a 2a 2a 0a 2a 2a 20 34 3a 20 20 54 68 65 72 65  .**.** 4:  There
23d70 20 6d 75 73 74 20 62 65 20 61 6e 20 61 63 74 69   must be an acti
23d80 76 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  ve transaction..
23d90 2a 2a 0a 2a 2a 20 54 68 65 20 42 54 52 45 45 5f  **.** The BTREE_
23da0 46 4f 52 44 45 4c 45 54 45 20 62 69 74 20 6f 66  FORDELETE bit of
23db0 20 77 72 46 6c 61 67 20 6d 61 79 20 6f 70 74 69   wrFlag may opti
23dc0 6f 6e 61 6c 6c 79 20 62 65 20 73 65 74 20 69 66  onally be set if
23dd0 20 42 54 52 45 45 5f 57 52 43 53 52 0a 2a 2a 20   BTREE_WRCSR.** 
23de0 69 73 20 73 65 74 2e 20 20 49 66 20 46 4f 52 44  is set.  If FORD
23df0 45 4c 45 54 45 20 69 73 20 73 65 74 2c 20 74 68  ELETE is set, th
23e00 61 74 20 69 73 20 61 20 68 69 6e 74 20 74 6f 20  at is a hint to 
23e10 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  the implementati
23e20 6f 6e 20 74 68 61 74 0a 2a 2a 20 74 68 69 73 20  on that.** this 
23e30 63 75 72 73 6f 72 20 77 69 6c 6c 20 6f 6e 6c 79  cursor will only
23e40 20 62 65 20 75 73 65 64 20 74 6f 20 73 65 65 6b   be used to seek
23e50 20 74 6f 20 61 6e 64 20 64 65 6c 65 74 65 20 65   to and delete e
23e60 6e 74 72 69 65 73 20 6f 66 20 61 6e 20 69 6e 64  ntries of an ind
23e70 65 78 0a 2a 2a 20 61 73 20 70 61 72 74 20 6f 66  ex.** as part of
23e80 20 61 20 6c 61 72 67 65 72 20 44 45 4c 45 54 45   a larger DELETE
23e90 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 65   statement.  The
23ea0 20 46 4f 52 44 45 4c 45 54 45 20 68 69 6e 74 20   FORDELETE hint 
23eb0 69 73 20 6e 6f 74 20 75 73 65 64 20 62 79 0a 2a  is not used by.*
23ec0 2a 20 74 68 69 73 20 69 6d 70 6c 65 6d 65 6e 74  * this implement
23ed0 61 74 69 6f 6e 2e 20 20 42 75 74 20 69 6e 20 61  ation.  But in a
23ee0 20 68 79 70 6f 74 68 65 74 69 63 61 6c 20 61 6c   hypothetical al
23ef0 74 65 72 6e 61 74 69 76 65 20 73 74 6f 72 61 67  ternative storag
23f00 65 20 65 6e 67 69 6e 65 20 0a 2a 2a 20 69 6e 20  e engine .** in 
23f10 77 68 69 63 68 20 69 6e 64 65 78 20 65 6e 74 72  which index entr
23f20 69 65 73 20 61 72 65 20 61 75 74 6f 6d 61 74 69  ies are automati
23f30 63 61 6c 6c 79 20 64 65 6c 65 74 65 64 20 77 68  cally deleted wh
23f40 65 6e 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  en corresponding
23f50 20 74 61 62 6c 65 0a 2a 2a 20 72 6f 77 73 20 61   table.** rows a
23f60 72 65 20 64 65 6c 65 74 65 64 2c 20 74 68 65 20  re deleted, the 
23f70 46 4f 52 44 45 4c 45 54 45 20 66 6c 61 67 20 69  FORDELETE flag i
23f80 73 20 61 20 68 69 6e 74 20 74 68 61 74 20 61 6c  s a hint that al
23f90 6c 20 53 45 45 4b 20 61 6e 64 20 44 45 4c 45 54  l SEEK and DELET
23fa0 45 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 73 20  E.** operations 
23fb0 6f 6e 20 74 68 69 73 20 63 75 72 73 6f 72 20 63  on this cursor c
23fc0 61 6e 20 62 65 20 6e 6f 2d 6f 70 73 20 61 6e 64  an be no-ops and
23fd0 20 61 6c 6c 20 52 45 41 44 20 6f 70 65 72 61 74   all READ operat
23fe0 69 6f 6e 73 20 63 61 6e 20 0a 2a 2a 20 72 65 74  ions can .** ret
23ff0 75 72 6e 20 61 20 6e 75 6c 6c 20 72 6f 77 20 28  urn a null row (
24000 32 2d 62 79 74 65 73 3a 20 30 78 30 31 20 30 78  2-bytes: 0x01 0x
24010 30 30 29 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 20 63 68  00)..**.** No ch
24020 65 63 6b 69 6e 67 20 69 73 20 64 6f 6e 65 20 74  ecking is done t
24030 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74  o make sure that
24040 20 70 61 67 65 20 69 54 61 62 6c 65 20 72 65 61   page iTable rea
24050 6c 6c 79 20 69 73 20 74 68 65 0a 2a 2a 20 72 6f  lly is the.** ro
24060 6f 74 20 70 61 67 65 20 6f 66 20 61 20 62 2d 74  ot page of a b-t
24070 72 65 65 2e 20 20 49 66 20 69 74 20 69 73 20 6e  ree.  If it is n
24080 6f 74 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72  ot, then the cur
24090 73 6f 72 20 61 63 71 75 69 72 65 64 0a 2a 2a 20  sor acquired.** 
240a0 77 69 6c 6c 20 6e 6f 74 20 77 6f 72 6b 20 63 6f  will not work co
240b0 72 72 65 63 74 6c 79 2e 0a 2a 2a 0a 2a 2a 20 49  rrectly..**.** I
240c0 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61  t is assumed tha
240d0 74 20 74 68 65 20 73 71 6c 69 74 65 33 42 74 72  t the sqlite3Btr
240e0 65 65 43 75 72 73 6f 72 5a 65 72 6f 28 29 20 68  eeCursorZero() h
240f0 61 73 20 62 65 65 6e 20 63 61 6c 6c 65 64 0a 2a  as been called.*
24100 2a 20 6f 6e 20 70 43 75 72 20 74 6f 20 69 6e 69  * on pCur to ini
24110 74 69 61 6c 69 7a 65 20 74 68 65 20 6d 65 6d 6f  tialize the memo
24120 72 79 20 73 70 61 63 65 20 70 72 69 6f 72 20 74  ry space prior t
24130 6f 20 69 6e 76 6f 6b 69 6e 67 20 74 68 69 73 20  o invoking this 
24140 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 73 74 61 74  routine..*/.stat
24150 69 63 20 69 6e 74 20 62 74 72 65 65 43 75 72 73  ic int btreeCurs
24160 6f 72 28 0a 20 20 42 74 72 65 65 20 2a 70 2c 20  or(.  Btree *p, 
24170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24180 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24190 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 69  The btree */.  i
241a0 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20  nt iTable,      
241b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
241c0 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61        /* Root pa
241d0 67 65 20 6f 66 20 74 61 62 6c 65 20 74 6f 20 6f  ge of table to o
241e0 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 77 72 46  pen */.  int wrF
241f0 6c 61 67 2c 20 20 20 20 20 20 20 20 20 20 20 20  lag,            
24200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24210 2f 2a 20 31 20 74 6f 20 77 72 69 74 65 2e 20 30  /* 1 to write. 0
24220 20 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20   read-only */.  
24230 73 74 72 75 63 74 20 4b 65 79 49 6e 66 6f 20 2a  struct KeyInfo *
24240 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20 20 20  pKeyInfo,       
24250 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
24260 61 72 67 20 74 6f 20 63 6f 6d 70 61 72 69 73 6f  arg to compariso
24270 6e 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  n function */.  
24280 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 20 20  BtCursor *pCur  
24290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
242a0 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20         /* Space 
242b0 66 6f 72 20 6e 65 77 20 63 75 72 73 6f 72 20 2a  for new cursor *
242c0 2f 0a 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  /.){.  BtShared 
242d0 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 20 20  *pBt = p->pBt;  
242e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
242f0 20 53 68 61 72 65 64 20 62 2d 74 72 65 65 20 68   Shared b-tree h
24300 61 6e 64 6c 65 20 2a 2f 0a 20 20 42 74 43 75 72  andle */.  BtCur
24310 73 6f 72 20 2a 70 58 3b 20 20 20 20 20 20 20 20  sor *pX;        
24320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24330 20 20 2f 2a 20 4c 6f 6f 70 69 6e 67 20 6f 76 65    /* Looping ove
24340 72 20 6f 74 68 65 72 20 61 6c 6c 20 63 75 72 73  r other all curs
24350 6f 72 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ors */..  assert
24360 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f  ( sqlite3BtreeHo
24370 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20  ldsMutex(p) );. 
24380 20 61 73 73 65 72 74 28 20 77 72 46 6c 61 67 3d   assert( wrFlag=
24390 3d 30 20 0a 20 20 20 20 20 20 20 7c 7c 20 77 72  =0 .       || wr
243a0 46 6c 61 67 3d 3d 42 54 52 45 45 5f 57 52 43 53  Flag==BTREE_WRCS
243b0 52 20 0a 20 20 20 20 20 20 20 7c 7c 20 77 72 46  R .       || wrF
243c0 6c 61 67 3d 3d 28 42 54 52 45 45 5f 57 52 43 53  lag==(BTREE_WRCS
243d0 52 7c 42 54 52 45 45 5f 46 4f 52 44 45 4c 45 54  R|BTREE_FORDELET
243e0 45 29 20 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 54  E) .  );..  /* T
243f0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73  he following ass
24400 65 72 74 20 73 74 61 74 65 6d 65 6e 74 73 20 76  ert statements v
24410 65 72 69 66 79 20 74 68 61 74 20 69 66 20 74 68  erify that if th
24420 69 73 20 69 73 20 61 20 73 68 61 72 61 62 6c 65  is is a sharable
24430 20 0a 20 20 2a 2a 20 62 2d 74 72 65 65 20 64 61   .  ** b-tree da
24440 74 61 62 61 73 65 2c 20 74 68 65 20 63 6f 6e 6e  tabase, the conn
24450 65 63 74 69 6f 6e 20 69 73 20 68 6f 6c 64 69 6e  ection is holdin
24460 67 20 74 68 65 20 72 65 71 75 69 72 65 64 20 74  g the required t
24470 61 62 6c 65 20 6c 6f 63 6b 73 2c 20 0a 20 20 2a  able locks, .  *
24480 2a 20 61 6e 64 20 74 68 61 74 20 6e 6f 20 6f 74  * and that no ot
24490 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68  her connection h
244a0 61 73 20 61 6e 79 20 6f 70 65 6e 20 63 75 72 73  as any open curs
244b0 6f 72 20 74 68 61 74 20 63 6f 6e 66 6c 69 63 74  or that conflict
244c0 73 20 77 69 74 68 20 0a 20 20 2a 2a 20 74 68 69  s with .  ** thi
244d0 73 20 6c 6f 63 6b 2e 20 20 2a 2f 0a 20 20 61 73  s lock.  */.  as
244e0 73 65 72 74 28 20 68 61 73 53 68 61 72 65 64 43  sert( hasSharedC
244f0 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 70 2c  acheTableLock(p,
24500 20 69 54 61 62 6c 65 2c 20 70 4b 65 79 49 6e 66   iTable, pKeyInf
24510 6f 21 3d 30 2c 20 28 77 72 46 6c 61 67 3f 32 3a  o!=0, (wrFlag?2:
24520 31 29 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  1)) );.  assert(
24530 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20 21 68   wrFlag==0 || !h
24540 61 73 52 65 61 64 43 6f 6e 66 6c 69 63 74 73 28  asReadConflicts(
24550 70 2c 20 69 54 61 62 6c 65 29 20 29 3b 0a 0a 20  p, iTable) );.. 
24560 20 2f 2a 20 41 73 73 65 72 74 20 74 68 61 74 20   /* Assert that 
24570 74 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20 6f  the caller has o
24580 70 65 6e 65 64 20 74 68 65 20 72 65 71 75 69 72  pened the requir
24590 65 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  ed transaction. 
245a0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  */.  assert( p->
245b0 69 6e 54 72 61 6e 73 3e 54 52 41 4e 53 5f 4e 4f  inTrans>TRANS_NO
245c0 4e 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  NE );.  assert( 
245d0 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20 70 2d 3e  wrFlag==0 || p->
245e0 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57  inTrans==TRANS_W
245f0 52 49 54 45 20 29 3b 0a 20 20 61 73 73 65 72 74  RITE );.  assert
24600 28 20 70 42 74 2d 3e 70 50 61 67 65 31 20 26 26  ( pBt->pPage1 &&
24610 20 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44   pBt->pPage1->aD
24620 61 74 61 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ata );.  assert(
24630 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20 28 70   wrFlag==0 || (p
24640 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42  Bt->btsFlags & B
24650 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 29 3d 3d 30  TS_READ_ONLY)==0
24660 20 29 3b 0a 0a 20 20 69 66 28 20 77 72 46 6c 61   );..  if( wrFla
24670 67 20 29 7b 0a 20 20 20 20 61 6c 6c 6f 63 61 74  g ){.    allocat
24680 65 54 65 6d 70 53 70 61 63 65 28 70 42 74 29 3b  eTempSpace(pBt);
24690 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 70 54  .    if( pBt->pT
246a0 6d 70 53 70 61 63 65 3d 3d 30 20 29 20 72 65 74  mpSpace==0 ) ret
246b0 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
246c0 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28  _BKPT;.  }.  if(
246d0 20 69 54 61 62 6c 65 3d 3d 31 20 26 26 20 62 74   iTable==1 && bt
246e0 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74  reePagecount(pBt
246f0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65  )==0 ){.    asse
24700 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 29 3b  rt( wrFlag==0 );
24710 0a 20 20 20 20 69 54 61 62 6c 65 20 3d 20 30 3b  .    iTable = 0;
24720 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20 74  .  }..  /* Now t
24730 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 65 72 72  hat no other err
24740 6f 72 73 20 63 61 6e 20 6f 63 63 75 72 2c 20 66  ors can occur, f
24750 69 6e 69 73 68 20 66 69 6c 6c 69 6e 67 20 69 6e  inish filling in
24760 20 74 68 65 20 42 74 43 75 72 73 6f 72 0a 20 20   the BtCursor.  
24770 2a 2a 20 76 61 72 69 61 62 6c 65 73 20 61 6e 64  ** variables and
24780 20 6c 69 6e 6b 20 74 68 65 20 63 75 72 73 6f 72   link the cursor
24790 20 69 6e 74 6f 20 74 68 65 20 42 74 53 68 61 72   into the BtShar
247a0 65 64 20 6c 69 73 74 2e 20 20 2a 2f 0a 20 20 70  ed list.  */.  p
247b0 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20 3d 20  Cur->pgnoRoot = 
247c0 28 50 67 6e 6f 29 69 54 61 62 6c 65 3b 0a 20 20  (Pgno)iTable;.  
247d0 70 43 75 72 2d 3e 69 50 61 67 65 20 3d 20 2d 31  pCur->iPage = -1
247e0 3b 0a 20 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e  ;.  pCur->pKeyIn
247f0 66 6f 20 3d 20 70 4b 65 79 49 6e 66 6f 3b 0a 20  fo = pKeyInfo;. 
24800 20 70 43 75 72 2d 3e 70 42 74 72 65 65 20 3d 20   pCur->pBtree = 
24810 70 3b 0a 20 20 70 43 75 72 2d 3e 70 42 74 20 3d  p;.  pCur->pBt =
24820 20 70 42 74 3b 0a 20 20 70 43 75 72 2d 3e 63 75   pBt;.  pCur->cu
24830 72 46 6c 61 67 73 20 3d 20 77 72 46 6c 61 67 20  rFlags = wrFlag 
24840 3f 20 42 54 43 46 5f 57 72 69 74 65 46 6c 61 67  ? BTCF_WriteFlag
24850 20 3a 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75   : 0;.  pCur->cu
24860 72 50 61 67 65 72 46 6c 61 67 73 20 3d 20 77 72  rPagerFlags = wr
24870 46 6c 61 67 20 3f 20 30 20 3a 20 50 41 47 45 52  Flag ? 0 : PAGER
24880 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20  _GET_READONLY;. 
24890 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65   /* If there are
248a0 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 63 75 72   two or more cur
248b0 73 6f 72 73 20 6f 6e 20 74 68 65 20 73 61 6d 65  sors on the same
248c0 20 62 74 72 65 65 2c 20 74 68 65 6e 20 61 6c 6c   btree, then all
248d0 20 73 75 63 68 0a 20 20 2a 2a 20 63 75 72 73 6f   such.  ** curso
248e0 72 73 20 2a 6d 75 73 74 2a 20 68 61 76 65 20 74  rs *must* have t
248f0 68 65 20 42 54 43 46 5f 4d 75 6c 74 69 70 6c 65  he BTCF_Multiple
24900 20 66 6c 61 67 20 73 65 74 2e 20 2a 2f 0a 20 20   flag set. */.  
24910 66 6f 72 28 70 58 3d 70 42 74 2d 3e 70 43 75 72  for(pX=pBt->pCur
24920 73 6f 72 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e  sor; pX; pX=pX->
24930 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20  pNext){.    if( 
24940 70 58 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 28 50  pX->pgnoRoot==(P
24950 67 6e 6f 29 69 54 61 62 6c 65 20 29 7b 0a 20 20  gno)iTable ){.  
24960 20 20 20 20 70 58 2d 3e 63 75 72 46 6c 61 67 73      pX->curFlags
24970 20 7c 3d 20 42 54 43 46 5f 4d 75 6c 74 69 70 6c   |= BTCF_Multipl
24980 65 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 63  e;.      pCur->c
24990 75 72 46 6c 61 67 73 20 7c 3d 20 42 54 43 46 5f  urFlags |= BTCF_
249a0 4d 75 6c 74 69 70 6c 65 3b 0a 20 20 20 20 7d 0a  Multiple;.    }.
249b0 20 20 7d 0a 20 20 70 43 75 72 2d 3e 70 4e 65 78    }.  pCur->pNex
249c0 74 20 3d 20 70 42 74 2d 3e 70 43 75 72 73 6f 72  t = pBt->pCursor
249d0 3b 0a 20 20 70 42 74 2d 3e 70 43 75 72 73 6f 72  ;.  pBt->pCursor
249e0 20 3d 20 70 43 75 72 3b 0a 20 20 70 43 75 72 2d   = pCur;.  pCur-
249f0 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
24a00 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 72 65 74 75  _INVALID;.  retu
24a10 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
24a20 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
24a30 43 75 72 73 6f 72 28 0a 20 20 42 74 72 65 65 20  Cursor(.  Btree 
24a40 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
24a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24a60 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72        /* The btr
24a70 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62  ee */.  int iTab
24a80 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  le,             
24a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24aa0 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65      /* Root page
24ab0 20 6f 66 20 74 61 62 6c 65 20 74 6f 20 6f 70 65   of table to ope
24ac0 6e 20 2a 2f 0a 20 20 69 6e 74 20 77 72 46 6c 61  n */.  int wrFla
24ad0 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g,              
24ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24af0 20 20 20 2f 2a 20 31 20 74 6f 20 77 72 69 74 65     /* 1 to write
24b00 2e 20 30 20 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f  . 0 read-only */
24b10 0a 20 20 73 74 72 75 63 74 20 4b 65 79 49 6e 66  .  struct KeyInf
24b20 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20  o *pKeyInfo,    
24b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
24b40 2a 20 46 69 72 73 74 20 61 72 67 20 74 6f 20 78  * First arg to x
24b50 43 6f 6d 70 61 72 65 28 29 20 2a 2f 0a 20 20 42  Compare() */.  B
24b60 74 43 75 72 73 6f 72 20 2a 70 43 75 72 20 20 20  tCursor *pCur   
24b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24b80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
24b90 69 74 65 20 6e 65 77 20 63 75 72 73 6f 72 20 68  ite new cursor h
24ba0 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ere */.){.  int 
24bb0 72 63 3b 0a 20 20 69 66 28 20 69 54 61 62 6c 65  rc;.  if( iTable
24bc0 3c 31 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  <1 ){.    rc = S
24bd0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
24be0 50 54 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  PT;.  }else{.   
24bf0 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
24c00 65 72 28 70 29 3b 0a 20 20 20 20 72 63 20 3d 20  er(p);.    rc = 
24c10 62 74 72 65 65 43 75 72 73 6f 72 28 70 2c 20 69  btreeCursor(p, i
24c20 54 61 62 6c 65 2c 20 77 72 46 6c 61 67 2c 20 70  Table, wrFlag, p
24c30 4b 65 79 49 6e 66 6f 2c 20 70 43 75 72 29 3b 0a  KeyInfo, pCur);.
24c40 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
24c50 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a 20 20  Leave(p);.  }.  
24c60 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
24c70 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73  .** Return the s
24c80 69 7a 65 20 6f 66 20 61 20 42 74 43 75 72 73 6f  ize of a BtCurso
24c90 72 20 6f 62 6a 65 63 74 20 69 6e 20 62 79 74 65  r object in byte
24ca0 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 6e  s..**.** This in
24cb0 74 65 72 66 61 63 65 73 20 69 73 20 6e 65 65 64  terfaces is need
24cc0 65 64 20 73 6f 20 74 68 61 74 20 75 73 65 72 73  ed so that users
24cd0 20 6f 66 20 63 75 72 73 6f 72 73 20 63 61 6e 20   of cursors can 
24ce0 70 72 65 61 6c 6c 6f 63 61 74 65 0a 2a 2a 20 73  preallocate.** s
24cf0 75 66 66 69 63 69 65 6e 74 20 73 74 6f 72 61 67  ufficient storag
24d00 65 20 74 6f 20 68 6f 6c 64 20 61 20 63 75 72 73  e to hold a curs
24d10 6f 72 2e 20 20 54 68 65 20 42 74 43 75 72 73 6f  or.  The BtCurso
24d20 72 20 6f 62 6a 65 63 74 20 69 73 20 6f 70 61 71  r object is opaq
24d30 75 65 0a 2a 2a 20 74 6f 20 75 73 65 72 73 20 73  ue.** to users s
24d40 6f 20 74 68 65 79 20 63 61 6e 6e 6f 74 20 64 6f  o they cannot do
24d50 20 74 68 65 20 73 69 7a 65 6f 66 28 29 20 74 68   the sizeof() th
24d60 65 6d 73 65 6c 76 65 73 20 2d 20 74 68 65 79 20  emselves - they 
24d70 6d 75 73 74 20 63 61 6c 6c 0a 2a 2a 20 74 68 69  must call.** thi
24d80 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 69 6e  s routine..*/.in
24d90 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  t sqlite3BtreeCu
24da0 72 73 6f 72 53 69 7a 65 28 76 6f 69 64 29 7b 0a  rsorSize(void){.
24db0 20 20 72 65 74 75 72 6e 20 52 4f 55 4e 44 38 28    return ROUND8(
24dc0 73 69 7a 65 6f 66 28 42 74 43 75 72 73 6f 72 29  sizeof(BtCursor)
24dd0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74  );.}../*.** Init
24de0 69 61 6c 69 7a 65 20 6d 65 6d 6f 72 79 20 74 68  ialize memory th
24df0 61 74 20 77 69 6c 6c 20 62 65 20 63 6f 6e 76 65  at will be conve
24e00 72 74 65 64 20 69 6e 74 6f 20 61 20 42 74 43 75  rted into a BtCu
24e10 72 73 6f 72 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a  rsor object..**.
24e20 2a 2a 20 54 68 65 20 73 69 6d 70 6c 65 20 61 70  ** The simple ap
24e30 70 72 6f 61 63 68 20 68 65 72 65 20 77 6f 75 6c  proach here woul
24e40 64 20 62 65 20 74 6f 20 6d 65 6d 73 65 74 28 29  d be to memset()
24e50 20 74 68 65 20 65 6e 74 69 72 65 20 6f 62 6a 65   the entire obje
24e60 63 74 0a 2a 2a 20 74 6f 20 7a 65 72 6f 2e 20 20  ct.** to zero.  
24e70 42 75 74 20 69 74 20 74 75 72 6e 73 20 6f 75 74  But it turns out
24e80 20 74 68 61 74 20 74 68 65 20 61 70 50 61 67 65   that the apPage
24e90 5b 5d 20 61 6e 64 20 61 69 49 64 78 5b 5d 20 61  [] and aiIdx[] a
24ea0 72 72 61 79 73 0a 2a 2a 20 64 6f 20 6e 6f 74 20  rrays.** do not 
24eb0 6e 65 65 64 20 74 6f 20 62 65 20 7a 65 72 6f 65  need to be zeroe
24ec0 64 20 61 6e 64 20 74 68 65 79 20 61 72 65 20 6c  d and they are l
24ed0 61 72 67 65 2c 20 73 6f 20 77 65 20 63 61 6e 20  arge, so we can 
24ee0 73 61 76 65 20 61 20 6c 6f 74 0a 2a 2a 20 6f 66  save a lot.** of
24ef0 20 72 75 6e 2d 74 69 6d 65 20 62 79 20 73 6b 69   run-time by ski
24f00 70 70 69 6e 67 20 74 68 65 20 69 6e 69 74 69 61  pping the initia
24f10 6c 69 7a 61 74 69 6f 6e 20 6f 66 20 74 68 6f 73  lization of thos
24f20 65 20 65 6c 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 76  e elements..*/.v
24f30 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72 65 65  oid sqlite3Btree
24f40 43 75 72 73 6f 72 5a 65 72 6f 28 42 74 43 75 72  CursorZero(BtCur
24f50 73 6f 72 20 2a 70 29 7b 0a 20 20 6d 65 6d 73 65  sor *p){.  memse
24f60 74 28 70 2c 20 30 2c 20 6f 66 66 73 65 74 6f 66  t(p, 0, offsetof
24f70 28 42 74 43 75 72 73 6f 72 2c 20 42 54 43 55 52  (BtCursor, BTCUR
24f80 53 4f 52 5f 46 49 52 53 54 5f 55 4e 49 4e 49 54  SOR_FIRST_UNINIT
24f90 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f  ));.}../*.** Clo
24fa0 73 65 20 61 20 63 75 72 73 6f 72 2e 20 20 54 68  se a cursor.  Th
24fb0 65 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74  e read lock on t
24fc0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
24fd0 20 69 73 20 72 65 6c 65 61 73 65 64 0a 2a 2a 20   is released.** 
24fe0 77 68 65 6e 20 74 68 65 20 6c 61 73 74 20 63 75  when the last cu
24ff0 72 73 6f 72 20 69 73 20 63 6c 6f 73 65 64 2e 0a  rsor is closed..
25000 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
25010 72 65 65 43 6c 6f 73 65 43 75 72 73 6f 72 28 42  reeCloseCursor(B
25020 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
25030 20 20 42 74 72 65 65 20 2a 70 42 74 72 65 65 20    Btree *pBtree 
25040 3d 20 70 43 75 72 2d 3e 70 42 74 72 65 65 3b 0a  = pCur->pBtree;.
25050 20 20 69 66 28 20 70 42 74 72 65 65 20 29 7b 0a    if( pBtree ){.
25060 20 20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42      BtShared *pB
25070 74 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b 0a 20  t = pCur->pBt;. 
25080 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45     sqlite3BtreeE
25090 6e 74 65 72 28 70 42 74 72 65 65 29 3b 0a 20 20  nter(pBtree);.  
250a0 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70    assert( pBt->p
250b0 43 75 72 73 6f 72 21 3d 30 20 29 3b 0a 20 20 20  Cursor!=0 );.   
250c0 20 69 66 28 20 70 42 74 2d 3e 70 43 75 72 73 6f   if( pBt->pCurso
250d0 72 3d 3d 70 43 75 72 20 29 7b 0a 20 20 20 20 20  r==pCur ){.     
250e0 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20   pBt->pCursor = 
250f0 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  pCur->pNext;.   
25100 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 42 74   }else{.      Bt
25110 43 75 72 73 6f 72 20 2a 70 50 72 65 76 20 3d 20  Cursor *pPrev = 
25120 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20  pBt->pCursor;.  
25130 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 20 20      do{.        
25140 69 66 28 20 70 50 72 65 76 2d 3e 70 4e 65 78 74  if( pPrev->pNext
25150 3d 3d 70 43 75 72 20 29 7b 0a 20 20 20 20 20 20  ==pCur ){.      
25160 20 20 20 20 70 50 72 65 76 2d 3e 70 4e 65 78 74      pPrev->pNext
25170 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a   = pCur->pNext;.
25180 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
25190 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
251a0 20 20 20 70 50 72 65 76 20 3d 20 70 50 72 65 76     pPrev = pPrev
251b0 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d  ->pNext;.      }
251c0 77 68 69 6c 65 28 20 41 4c 57 41 59 53 28 70 50  while( ALWAYS(pP
251d0 72 65 76 29 20 29 3b 0a 20 20 20 20 7d 0a 20 20  rev) );.    }.  
251e0 20 20 62 74 72 65 65 52 65 6c 65 61 73 65 41 6c    btreeReleaseAl
251f0 6c 43 75 72 73 6f 72 50 61 67 65 73 28 70 43 75  lCursorPages(pCu
25200 72 29 3b 0a 20 20 20 20 75 6e 6c 6f 63 6b 42 74  r);.    unlockBt
25210 72 65 65 49 66 55 6e 75 73 65 64 28 70 42 74 29  reeIfUnused(pBt)
25220 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
25230 65 65 28 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c  ee(pCur->aOverfl
25240 6f 77 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ow);.    sqlite3
25250 5f 66 72 65 65 28 70 43 75 72 2d 3e 70 4b 65 79  _free(pCur->pKey
25260 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  );.    sqlite3Bt
25270 72 65 65 4c 65 61 76 65 28 70 42 74 72 65 65 29  reeLeave(pBtree)
25280 3b 0a 20 20 20 20 70 43 75 72 2d 3e 70 42 74 72  ;.    pCur->pBtr
25290 65 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  ee = 0;.  }.  re
252a0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
252b0 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75  }../*.** Make su
252c0 72 65 20 74 68 65 20 42 74 43 75 72 73 6f 72 2a  re the BtCursor*
252d0 20 67 69 76 65 6e 20 69 6e 20 74 68 65 20 61 72   given in the ar
252e0 67 75 6d 65 6e 74 20 68 61 73 20 61 20 76 61 6c  gument has a val
252f0 69 64 0a 2a 2a 20 42 74 43 75 72 73 6f 72 2e 69  id.** BtCursor.i
25300 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e 20 20  nfo structure.  
25310 49 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72  If it is not alr
25320 65 61 64 79 20 76 61 6c 69 64 2c 20 63 61 6c 6c  eady valid, call
25330 0a 2a 2a 20 62 74 72 65 65 50 61 72 73 65 43 65  .** btreeParseCe
25340 6c 6c 28 29 20 74 6f 20 66 69 6c 6c 20 69 74 20  ll() to fill it 
25350 69 6e 2e 0a 2a 2a 0a 2a 2a 20 42 74 43 75 72 73  in..**.** BtCurs
25360 6f 72 2e 69 6e 66 6f 20 69 73 20 61 20 63 61 63  or.info is a cac
25370 68 65 20 6f 66 20 74 68 65 20 69 6e 66 6f 72 6d  he of the inform
25380 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 63 75 72  ation in the cur
25390 72 65 6e 74 20 63 65 6c 6c 2e 0a 2a 2a 20 55 73  rent cell..** Us
253a0 69 6e 67 20 74 68 69 73 20 63 61 63 68 65 20 72  ing this cache r
253b0 65 64 75 63 65 73 20 74 68 65 20 6e 75 6d 62 65  educes the numbe
253c0 72 20 6f 66 20 63 61 6c 6c 73 20 74 6f 20 62 74  r of calls to bt
253d0 72 65 65 50 61 72 73 65 43 65 6c 6c 28 29 2e 0a  reeParseCell()..
253e0 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  */.#ifndef NDEBU
253f0 47 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20 63  G.  static int c
25400 65 6c 6c 49 6e 66 6f 45 71 75 61 6c 28 43 65 6c  ellInfoEqual(Cel
25410 6c 49 6e 66 6f 20 2a 61 2c 20 43 65 6c 6c 49 6e  lInfo *a, CellIn
25420 66 6f 20 2a 62 29 7b 0a 20 20 20 20 69 66 28 20  fo *b){.    if( 
25430 61 2d 3e 6e 4b 65 79 21 3d 62 2d 3e 6e 4b 65 79  a->nKey!=b->nKey
25440 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
25450 20 69 66 28 20 61 2d 3e 70 50 61 79 6c 6f 61 64   if( a->pPayload
25460 21 3d 62 2d 3e 70 50 61 79 6c 6f 61 64 20 29 20  !=b->pPayload ) 
25470 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 69 66  return 0;.    if
25480 28 20 61 2d 3e 6e 50 61 79 6c 6f 61 64 21 3d 62  ( a->nPayload!=b
25490 2d 3e 6e 50 61 79 6c 6f 61 64 20 29 20 72 65 74  ->nPayload ) ret
254a0 75 72 6e 20 30 3b 0a 20 20 20 20 69 66 28 20 61  urn 0;.    if( a
254b0 2d 3e 6e 4c 6f 63 61 6c 21 3d 62 2d 3e 6e 4c 6f  ->nLocal!=b->nLo
254c0 63 61 6c 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  cal ) return 0;.
254d0 20 20 20 20 69 66 28 20 61 2d 3e 6e 53 69 7a 65      if( a->nSize
254e0 21 3d 62 2d 3e 6e 53 69 7a 65 20 29 20 72 65 74  !=b->nSize ) ret
254f0 75 72 6e 20 30 3b 0a 20 20 20 20 72 65 74 75 72  urn 0;.    retur
25500 6e 20 31 3b 0a 20 20 7d 0a 20 20 73 74 61 74 69  n 1;.  }.  stati
25510 63 20 76 6f 69 64 20 61 73 73 65 72 74 43 65 6c  c void assertCel
25520 6c 49 6e 66 6f 28 42 74 43 75 72 73 6f 72 20 2a  lInfo(BtCursor *
25530 70 43 75 72 29 7b 0a 20 20 20 20 43 65 6c 6c 49  pCur){.    CellI
25540 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 6d 65  nfo info;.    me
25550 6d 73 65 74 28 26 69 6e 66 6f 2c 20 30 2c 20 73  mset(&info, 0, s
25560 69 7a 65 6f 66 28 69 6e 66 6f 29 29 3b 0a 20 20  izeof(info));.  
25570 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c    btreeParseCell
25580 28 70 43 75 72 2d 3e 70 50 61 67 65 2c 20 70 43  (pCur->pPage, pC
25590 75 72 2d 3e 69 78 2c 20 26 69 6e 66 6f 29 3b 0a  ur->ix, &info);.
255a0 20 20 20 20 61 73 73 65 72 74 28 20 43 4f 52 52      assert( CORR
255b0 55 50 54 5f 44 42 20 7c 7c 20 63 65 6c 6c 49 6e  UPT_DB || cellIn
255c0 66 6f 45 71 75 61 6c 28 26 69 6e 66 6f 2c 20 26  foEqual(&info, &
255d0 70 43 75 72 2d 3e 69 6e 66 6f 29 20 29 3b 0a 20  pCur->info) );. 
255e0 20 7d 0a 23 65 6c 73 65 0a 20 20 23 64 65 66 69   }.#else.  #defi
255f0 6e 65 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66  ne assertCellInf
25600 6f 28 78 29 0a 23 65 6e 64 69 66 0a 73 74 61 74  o(x).#endif.stat
25610 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49  ic SQLITE_NOINLI
25620 4e 45 20 76 6f 69 64 20 67 65 74 43 65 6c 6c 49  NE void getCellI
25630 6e 66 6f 28 42 74 43 75 72 73 6f 72 20 2a 70 43  nfo(BtCursor *pC
25640 75 72 29 7b 0a 20 20 69 66 28 20 70 43 75 72 2d  ur){.  if( pCur-
25650 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29  >info.nSize==0 )
25660 7b 0a 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46  {.    pCur->curF
25670 6c 61 67 73 20 7c 3d 20 42 54 43 46 5f 56 61 6c  lags |= BTCF_Val
25680 69 64 4e 4b 65 79 3b 0a 20 20 20 20 62 74 72 65  idNKey;.    btre
25690 65 50 61 72 73 65 43 65 6c 6c 28 70 43 75 72 2d  eParseCell(pCur-
256a0 3e 70 50 61 67 65 2c 70 43 75 72 2d 3e 69 78 2c  >pPage,pCur->ix,
256b0 26 70 43 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20 20  &pCur->info);.  
256c0 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
256d0 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b  tCellInfo(pCur);
256e0 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  .  }.}..#ifndef 
256f0 4e 44 45 42 55 47 20 20 2f 2a 20 54 68 65 20 6e  NDEBUG  /* The n
25700 65 78 74 20 72 6f 75 74 69 6e 65 20 75 73 65 64  ext routine used
25710 20 6f 6e 6c 79 20 77 69 74 68 69 6e 20 61 73 73   only within ass
25720 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73  ert() statements
25730 20 2a 2f 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e   */./*.** Return
25740 20 74 72 75 65 20 69 66 20 74 68 65 20 67 69 76   true if the giv
25750 65 6e 20 42 74 43 75 72 73 6f 72 20 69 73 20 76  en BtCursor is v
25760 61 6c 69 64 2e 20 20 41 20 76 61 6c 69 64 20 63  alid.  A valid c
25770 75 72 73 6f 72 20 69 73 20 6f 6e 65 0a 2a 2a 20  ursor is one.** 
25780 74 68 61 74 20 69 73 20 63 75 72 72 65 6e 74 6c  that is currentl
25790 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20  y pointing to a 
257a0 72 6f 77 20 69 6e 20 61 20 28 6e 6f 6e 2d 65 6d  row in a (non-em
257b0 70 74 79 29 20 74 61 62 6c 65 2e 0a 2a 2a 20 54  pty) table..** T
257c0 68 69 73 20 69 73 20 61 20 76 65 72 69 66 69 63  his is a verific
257d0 61 74 69 6f 6e 20 72 6f 75 74 69 6e 65 20 69 73  ation routine is
257e0 20 75 73 65 64 20 6f 6e 6c 79 20 77 69 74 68 69   used only withi
257f0 6e 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65  n assert() state
25800 6d 65 6e 74 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ments..*/.int sq
25810 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
25820 49 73 56 61 6c 69 64 28 42 74 43 75 72 73 6f 72  IsValid(BtCursor
25830 20 2a 70 43 75 72 29 7b 0a 20 20 72 65 74 75 72   *pCur){.  retur
25840 6e 20 70 43 75 72 20 26 26 20 70 43 75 72 2d 3e  n pCur && pCur->
25850 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
25860 41 4c 49 44 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  ALID;.}.#endif /
25870 2a 20 4e 44 45 42 55 47 20 2a 2f 0a 69 6e 74 20  * NDEBUG */.int 
25880 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
25890 6f 72 49 73 56 61 6c 69 64 4e 4e 28 42 74 43 75  orIsValidNN(BtCu
258a0 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 61  rsor *pCur){.  a
258b0 73 73 65 72 74 28 20 70 43 75 72 21 3d 30 20 29  ssert( pCur!=0 )
258c0 3b 0a 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d  ;.  return pCur-
258d0 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
258e0 56 41 4c 49 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  VALID;.}../*.** 
258f0 52 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65  Return the value
25900 20 6f 66 20 74 68 65 20 69 6e 74 65 67 65 72 20   of the integer 
25910 6b 65 79 20 6f 72 20 22 72 6f 77 69 64 22 20 66  key or "rowid" f
25920 6f 72 20 61 20 74 61 62 6c 65 20 62 74 72 65 65  or a table btree
25930 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  ..** This routin
25940 65 20 69 73 20 6f 6e 6c 79 20 76 61 6c 69 64 20  e is only valid 
25950 66 6f 72 20 61 20 63 75 72 73 6f 72 20 74 68 61  for a cursor tha
25960 74 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 69 6e  t is pointing in
25970 74 6f 20 61 0a 2a 2a 20 6f 72 64 69 6e 61 72 79  to a.** ordinary
25980 20 74 61 62 6c 65 20 62 74 72 65 65 2e 20 20 49   table btree.  I
25990 66 20 74 68 65 20 63 75 72 73 6f 72 20 70 6f 69  f the cursor poi
259a0 6e 74 73 20 74 6f 20 61 6e 20 69 6e 64 65 78 20  nts to an index 
259b0 62 74 72 65 65 20 6f 72 0a 2a 2a 20 69 73 20 69  btree or.** is i
259c0 6e 76 61 6c 69 64 2c 20 74 68 65 20 72 65 73 75  nvalid, the resu
259d0 6c 74 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69  lt of this routi
259e0 6e 65 20 69 73 20 75 6e 64 65 66 69 6e 65 64 2e  ne is undefined.
259f0 0a 2a 2f 0a 69 36 34 20 73 71 6c 69 74 65 33 42  .*/.i64 sqlite3B
25a00 74 72 65 65 49 6e 74 65 67 65 72 4b 65 79 28 42  treeIntegerKey(B
25a10 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
25a20 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
25a30 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
25a40 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
25a50 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
25a60 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73  OR_VALID );.  as
25a70 73 65 72 74 28 20 70 43 75 72 2d 3e 63 75 72 49  sert( pCur->curI
25a80 6e 74 4b 65 79 20 29 3b 0a 20 20 67 65 74 43 65  ntKey );.  getCe
25a90 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20  llInfo(pCur);.  
25aa0 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 69 6e 66  return pCur->inf
25ab0 6f 2e 6e 4b 65 79 3b 0a 7d 0a 0a 23 69 66 64 65  o.nKey;.}..#ifde
25ac0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
25ad0 4f 46 46 53 45 54 5f 53 51 4c 5f 46 55 4e 43 0a  OFFSET_SQL_FUNC.
25ae0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
25af0 20 6f 66 66 73 65 74 20 69 6e 74 6f 20 74 68 65   offset into the
25b00 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 66   database file f
25b10 6f 72 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  or the start of 
25b20 74 68 65 0a 2a 2a 20 70 61 79 6c 6f 61 64 20 74  the.** payload t
25b30 6f 20 77 68 69 63 68 20 74 68 65 20 63 75 72 73  o which the curs
25b40 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 2e 0a  or is pointing..
25b50 2a 2f 0a 69 36 34 20 73 71 6c 69 74 65 33 42 74  */.i64 sqlite3Bt
25b60 72 65 65 4f 66 66 73 65 74 28 42 74 43 75 72 73  reeOffset(BtCurs
25b70 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73 73  or *pCur){.  ass
25b80 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
25b90 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
25ba0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
25bb0 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
25bc0 4c 49 44 20 29 3b 0a 20 20 67 65 74 43 65 6c 6c  LID );.  getCell
25bd0 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 72 65  Info(pCur);.  re
25be0 74 75 72 6e 20 28 69 36 34 29 70 43 75 72 2d 3e  turn (i64)pCur->
25bf0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2a 28 28  pBt->pageSize*((
25c00 69 36 34 29 70 43 75 72 2d 3e 70 50 61 67 65 2d  i64)pCur->pPage-
25c10 3e 70 67 6e 6f 20 2d 20 31 29 20 2b 0a 20 20 20  >pgno - 1) +.   
25c20 20 20 20 20 20 20 28 69 36 34 29 28 70 43 75 72        (i64)(pCur
25c30 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64 20  ->info.pPayload 
25c40 2d 20 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 61  - pCur->pPage->a
25c50 44 61 74 61 29 3b 0a 7d 0a 23 65 6e 64 69 66 20  Data);.}.#endif 
25c60 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  /* SQLITE_ENABLE
25c70 5f 4f 46 46 53 45 54 5f 53 51 4c 5f 46 55 4e 43  _OFFSET_SQL_FUNC
25c80 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72   */../*.** Retur
25c90 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
25ca0 62 79 74 65 73 20 6f 66 20 70 61 79 6c 6f 61 64  bytes of payload
25cb0 20 66 6f 72 20 74 68 65 20 65 6e 74 72 79 20 74   for the entry t
25cc0 68 61 74 20 70 43 75 72 20 69 73 0a 2a 2a 20 63  hat pCur is.** c
25cd0 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e  urrently pointin
25ce0 67 20 74 6f 2e 20 20 46 6f 72 20 74 61 62 6c 65  g to.  For table
25cf0 20 62 74 72 65 65 73 2c 20 74 68 69 73 20 77 69   btrees, this wi
25d00 6c 6c 20 62 65 20 74 68 65 20 61 6d 6f 75 6e 74  ll be the amount
25d10 0a 2a 2a 20 6f 66 20 64 61 74 61 2e 20 20 46 6f  .** of data.  Fo
25d20 72 20 69 6e 64 65 78 20 62 74 72 65 65 73 2c 20  r index btrees, 
25d30 74 68 69 73 20 77 69 6c 6c 20 62 65 20 74 68 65  this will be the
25d40 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6b 65 79   size of the key
25d50 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c  ..**.** The call
25d60 65 72 20 6d 75 73 74 20 67 75 61 72 61 6e 74 65  er must guarante
25d70 65 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f  e that the curso
25d80 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f  r is pointing to
25d90 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 0a 2a 2a 20 76   a non-NULL.** v
25da0 61 6c 69 64 20 65 6e 74 72 79 2e 20 20 49 6e 20  alid entry.  In 
25db0 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 74 68 65  other words, the
25dc0 20 63 61 6c 6c 69 6e 67 20 70 72 6f 63 65 64 75   calling procedu
25dd0 72 65 20 6d 75 73 74 20 67 75 61 72 61 6e 74 65  re must guarante
25de0 65 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 63 75  e.** that the cu
25df0 72 73 6f 72 20 68 61 73 20 43 75 72 73 6f 72 2e  rsor has Cursor.
25e00 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
25e10 41 4c 49 44 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c  ALID..*/.u32 sql
25e20 69 74 65 33 42 74 72 65 65 50 61 79 6c 6f 61 64  ite3BtreePayload
25e30 53 69 7a 65 28 42 74 43 75 72 73 6f 72 20 2a 70  Size(BtCursor *p
25e40 43 75 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20  Cur){.  assert( 
25e50 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
25e60 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
25e70 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
25e80 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
25e90 3b 0a 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28  ;.  getCellInfo(
25ea0 70 43 75 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  pCur);.  return 
25eb0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50 61 79 6c  pCur->info.nPayl
25ec0 6f 61 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69  oad;.}../*.** Gi
25ed0 76 65 6e 20 74 68 65 20 70 61 67 65 20 6e 75 6d  ven the page num
25ee0 62 65 72 20 6f 66 20 61 6e 20 6f 76 65 72 66 6c  ber of an overfl
25ef0 6f 77 20 70 61 67 65 20 69 6e 20 74 68 65 20 64  ow page in the d
25f00 61 74 61 62 61 73 65 20 28 70 61 72 61 6d 65 74  atabase (paramet
25f10 65 72 0a 2a 2a 20 6f 76 66 6c 29 2c 20 74 68 69  er.** ovfl), thi
25f20 73 20 66 75 6e 63 74 69 6f 6e 20 66 69 6e 64 73  s function finds
25f30 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
25f40 20 6f 66 20 74 68 65 20 6e 65 78 74 20 70 61 67   of the next pag
25f50 65 20 69 6e 20 74 68 65 20 0a 2a 2a 20 6c 69 6e  e in the .** lin
25f60 6b 65 64 20 6c 69 73 74 20 6f 66 20 6f 76 65 72  ked list of over
25f70 66 6c 6f 77 20 70 61 67 65 73 2e 20 49 66 20 70  flow pages. If p
25f80 6f 73 73 69 62 6c 65 2c 20 69 74 20 75 73 65 73  ossible, it uses
25f90 20 74 68 65 20 61 75 74 6f 2d 76 61 63 75 75 6d   the auto-vacuum
25fa0 0a 2a 2a 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  .** pointer-map 
25fb0 64 61 74 61 20 69 6e 73 74 65 61 64 20 6f 66 20  data instead of 
25fc0 72 65 61 64 69 6e 67 20 74 68 65 20 63 6f 6e 74  reading the cont
25fd0 65 6e 74 20 6f 66 20 70 61 67 65 20 6f 76 66 6c  ent of page ovfl
25fe0 20 74 6f 20 64 6f 20 73 6f 2e 20 0a 2a 2a 0a 2a   to do so. .**.*
25ff0 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
26000 63 75 72 73 20 61 6e 20 53 51 4c 69 74 65 20 65  curs an SQLite e
26010 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
26020 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65  urned. Otherwise
26030 3a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65  :.**.** The page
26040 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e   number of the n
26050 65 78 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  ext overflow pag
26060 65 20 69 6e 20 74 68 65 20 6c 69 6e 6b 65 64 20  e in the linked 
26070 6c 69 73 74 20 69 73 20 0a 2a 2a 20 77 72 69 74  list is .** writ
26080 74 65 6e 20 74 6f 20 2a 70 50 67 6e 6f 4e 65 78  ten to *pPgnoNex
26090 74 2e 20 49 66 20 70 61 67 65 20 6f 76 66 6c 20  t. If page ovfl 
260a0 69 73 20 74 68 65 20 6c 61 73 74 20 70 61 67 65  is the last page
260b0 20 69 6e 20 69 74 73 20 6c 69 6e 6b 65 64 20 0a   in its linked .
260c0 2a 2a 20 6c 69 73 74 2c 20 2a 70 50 67 6e 6f 4e  ** list, *pPgnoN
260d0 65 78 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65  ext is set to ze
260e0 72 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 70 70  ro. .**.** If pp
260f0 50 61 67 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  Page is not NULL
26100 2c 20 61 6e 64 20 61 20 72 65 66 65 72 65 6e 63  , and a referenc
26110 65 20 74 6f 20 74 68 65 20 4d 65 6d 50 61 67 65  e to the MemPage
26120 20 6f 62 6a 65 63 74 20 63 6f 72 72 65 73 70 6f   object correspo
26130 6e 64 69 6e 67 0a 2a 2a 20 74 6f 20 70 61 67 65  nding.** to page
26140 20 6e 75 6d 62 65 72 20 70 4f 76 66 6c 20 77 61   number pOvfl wa
26150 73 20 6f 62 74 61 69 6e 65 64 2c 20 74 68 65 6e  s obtained, then
26160 20 2a 70 70 50 61 67 65 20 69 73 20 73 65 74 20   *ppPage is set 
26170 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 61 74  to point to that
26180 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 2e 20 49  .** reference. I
26190 74 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73  t is the respons
261a0 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63  ibility of the c
261b0 61 6c 6c 65 72 20 74 6f 20 63 61 6c 6c 20 72 65  aller to call re
261c0 6c 65 61 73 65 50 61 67 65 28 29 0a 2a 2a 20 6f  leasePage().** o
261d0 6e 20 2a 70 70 50 61 67 65 20 74 6f 20 66 72 65  n *ppPage to fre
261e0 65 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 2e  e the reference.
261f0 20 49 6e 20 6e 6f 20 72 65 66 65 72 65 6e 63 65   In no reference
26200 20 77 61 73 20 6f 62 74 61 69 6e 65 64 20 28 62   was obtained (b
26210 65 63 61 75 73 65 0a 2a 2a 20 74 68 65 20 70 6f  ecause.** the po
26220 69 6e 74 65 72 2d 6d 61 70 20 77 61 73 20 75 73  inter-map was us
26230 65 64 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65  ed to obtain the
26240 20 76 61 6c 75 65 20 66 6f 72 20 2a 70 50 67 6e   value for *pPgn
26250 6f 4e 65 78 74 29 2c 20 74 68 65 6e 0a 2a 2a 20  oNext), then.** 
26260 2a 70 70 50 61 67 65 20 69 73 20 73 65 74 20 74  *ppPage is set t
26270 6f 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69  o zero..*/.stati
26280 63 20 69 6e 74 20 67 65 74 4f 76 65 72 66 6c 6f  c int getOverflo
26290 77 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65  wPage(.  BtShare
262a0 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20  d *pBt,         
262b0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74        /* The dat
262c0 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
262d0 50 67 6e 6f 20 6f 76 66 6c 2c 20 20 20 20 20 20  Pgno ovfl,      
262e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
262f0 43 75 72 72 65 6e 74 20 6f 76 65 72 66 6c 6f 77  Current overflow
26300 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a   page number */.
26310 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61    MemPage **ppPa
26320 67 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  ge,            /
26330 2a 20 4f 55 54 3a 20 4d 65 6d 50 61 67 65 20 68  * OUT: MemPage h
26340 61 6e 64 6c 65 20 28 6d 61 79 20 62 65 20 4e 55  andle (may be NU
26350 4c 4c 29 20 2a 2f 0a 20 20 50 67 6e 6f 20 2a 70  LL) */.  Pgno *p
26360 50 67 6e 6f 4e 65 78 74 20 20 20 20 20 20 20 20  PgnoNext        
26370 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4e 65        /* OUT: Ne
26380 78 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  xt overflow page
26390 20 6e 75 6d 62 65 72 20 2a 2f 0a 29 7b 0a 20 20   number */.){.  
263a0 50 67 6e 6f 20 6e 65 78 74 20 3d 20 30 3b 0a 20  Pgno next = 0;. 
263b0 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20   MemPage *pPage 
263c0 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  = 0;.  int rc = 
263d0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73  SQLITE_OK;..  as
263e0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
263f0 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
26400 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
26410 28 70 50 67 6e 6f 4e 65 78 74 29 3b 0a 0a 23 69  (pPgnoNext);..#i
26420 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
26430 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 2f  T_AUTOVACUUM.  /
26440 2a 20 54 72 79 20 74 6f 20 66 69 6e 64 20 74 68  * Try to find th
26450 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74  e next page in t
26460 68 65 20 6f 76 65 72 66 6c 6f 77 20 6c 69 73 74  he overflow list
26470 20 75 73 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20   using the.  ** 
26480 61 75 74 6f 76 61 63 75 75 6d 20 70 6f 69 6e 74  autovacuum point
26490 65 72 2d 6d 61 70 20 70 61 67 65 73 2e 20 47 75  er-map pages. Gu
264a0 65 73 73 20 74 68 61 74 20 74 68 65 20 6e 65 78  ess that the nex
264b0 74 20 70 61 67 65 20 69 6e 20 0a 20 20 2a 2a 20  t page in .  ** 
264c0 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 6c 69 73  the overflow lis
264d0 74 20 69 73 20 70 61 67 65 20 6e 75 6d 62 65 72  t is page number
264e0 20 28 6f 76 66 6c 2b 31 29 2e 20 49 66 20 74 68   (ovfl+1). If th
264f0 61 74 20 67 75 65 73 73 20 74 75 72 6e 73 20 0a  at guess turns .
26500 20 20 2a 2a 20 6f 75 74 20 74 6f 20 62 65 20 77    ** out to be w
26510 72 6f 6e 67 2c 20 66 61 6c 6c 20 62 61 63 6b 20  rong, fall back 
26520 74 6f 20 6c 6f 61 64 69 6e 67 20 74 68 65 20 64  to loading the d
26530 61 74 61 20 6f 66 20 70 61 67 65 20 0a 20 20 2a  ata of page .  *
26540 2a 20 6e 75 6d 62 65 72 20 6f 76 66 6c 20 74 6f  * number ovfl to
26550 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 6e   determine the n
26560 65 78 74 20 70 61 67 65 20 6e 75 6d 62 65 72 2e  ext page number.
26570 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d  .  */.  if( pBt-
26580 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20  >autoVacuum ){. 
26590 20 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20     Pgno pgno;.  
265a0 20 20 50 67 6e 6f 20 69 47 75 65 73 73 20 3d 20    Pgno iGuess = 
265b0 6f 76 66 6c 2b 31 3b 0a 20 20 20 20 75 38 20 65  ovfl+1;.    u8 e
265c0 54 79 70 65 3b 0a 0a 20 20 20 20 77 68 69 6c 65  Type;..    while
265d0 28 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28  ( PTRMAP_ISPAGE(
265e0 70 42 74 2c 20 69 47 75 65 73 73 29 20 7c 7c 20  pBt, iGuess) || 
265f0 69 47 75 65 73 73 3d 3d 50 45 4e 44 49 4e 47 5f  iGuess==PENDING_
26600 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
26610 7b 0a 20 20 20 20 20 20 69 47 75 65 73 73 2b 2b  {.      iGuess++
26620 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
26630 20 69 47 75 65 73 73 3c 3d 62 74 72 65 65 50 61   iGuess<=btreePa
26640 67 65 63 6f 75 6e 74 28 70 42 74 29 20 29 7b 0a  gecount(pBt) ){.
26650 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61        rc = ptrma
26660 70 47 65 74 28 70 42 74 2c 20 69 47 75 65 73 73  pGet(pBt, iGuess
26670 2c 20 26 65 54 79 70 65 2c 20 26 70 67 6e 6f 29  , &eType, &pgno)
26680 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
26690 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 65 54 79  SQLITE_OK && eTy
266a0 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46  pe==PTRMAP_OVERF
266b0 4c 4f 57 32 20 26 26 20 70 67 6e 6f 3d 3d 6f 76  LOW2 && pgno==ov
266c0 66 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 65  fl ){.        ne
266d0 78 74 20 3d 20 69 47 75 65 73 73 3b 0a 20 20 20  xt = iGuess;.   
266e0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
266f0 5f 44 4f 4e 45 3b 0a 20 20 20 20 20 20 7d 0a 20  _DONE;.      }. 
26700 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
26710 0a 20 20 61 73 73 65 72 74 28 20 6e 65 78 74 3d  .  assert( next=
26720 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45  =0 || rc==SQLITE
26730 5f 44 4f 4e 45 20 29 3b 0a 20 20 69 66 28 20 72  _DONE );.  if( r
26740 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
26750 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65      rc = btreeGe
26760 74 50 61 67 65 28 70 42 74 2c 20 6f 76 66 6c 2c  tPage(pBt, ovfl,
26770 20 26 70 50 61 67 65 2c 20 28 70 70 50 61 67 65   &pPage, (ppPage
26780 3d 3d 30 29 20 3f 20 50 41 47 45 52 5f 47 45 54  ==0) ? PAGER_GET
26790 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 30 29 3b 0a  _READONLY : 0);.
267a0 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d      assert( rc==
267b0 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61  SQLITE_OK || pPa
267c0 67 65 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  ge==0 );.    if(
267d0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
267e0 7b 0a 20 20 20 20 20 20 6e 65 78 74 20 3d 20 67  {.      next = g
267f0 65 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61  et4byte(pPage->a
26800 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Data);.    }.  }
26810 0a 0a 20 20 2a 70 50 67 6e 6f 4e 65 78 74 20 3d  ..  *pPgnoNext =
26820 20 6e 65 78 74 3b 0a 20 20 69 66 28 20 70 70 50   next;.  if( ppP
26830 61 67 65 20 29 7b 0a 20 20 20 20 2a 70 70 50 61  age ){.    *ppPa
26840 67 65 20 3d 20 70 50 61 67 65 3b 0a 20 20 7d 65  ge = pPage;.  }e
26850 6c 73 65 7b 0a 20 20 20 20 72 65 6c 65 61 73 65  lse{.    release
26860 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 7d  Page(pPage);.  }
26870 0a 20 20 72 65 74 75 72 6e 20 28 72 63 3d 3d 53  .  return (rc==S
26880 51 4c 49 54 45 5f 44 4f 4e 45 20 3f 20 53 51 4c  QLITE_DONE ? SQL
26890 49 54 45 5f 4f 4b 20 3a 20 72 63 29 3b 0a 7d 0a  ITE_OK : rc);.}.
268a0 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20 64 61 74 61  ./*.** Copy data
268b0 20 66 72 6f 6d 20 61 20 62 75 66 66 65 72 20 74   from a buffer t
268c0 6f 20 61 20 70 61 67 65 2c 20 6f 72 20 66 72 6f  o a page, or fro
268d0 6d 20 61 20 70 61 67 65 20 74 6f 20 61 20 62 75  m a page to a bu
268e0 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 70 50 61 79  ffer..**.** pPay
268f0 6c 6f 61 64 20 69 73 20 61 20 70 6f 69 6e 74 65  load is a pointe
26900 72 20 74 6f 20 64 61 74 61 20 73 74 6f 72 65 64  r to data stored
26910 20 6f 6e 20 64 61 74 61 62 61 73 65 20 70 61 67   on database pag
26920 65 20 70 44 62 50 61 67 65 2e 0a 2a 2a 20 49 66  e pDbPage..** If
26930 20 61 72 67 75 6d 65 6e 74 20 65 4f 70 20 69 73   argument eOp is
26940 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 6e 42 79   false, then nBy
26950 74 65 20 62 79 74 65 73 20 6f 66 20 64 61 74 61  te bytes of data
26960 20 61 72 65 20 63 6f 70 69 65 64 0a 2a 2a 20 66   are copied.** f
26970 72 6f 6d 20 70 50 61 79 6c 6f 61 64 20 74 6f 20  rom pPayload to 
26980 74 68 65 20 62 75 66 66 65 72 20 70 6f 69 6e 74  the buffer point
26990 65 64 20 61 74 20 62 79 20 70 42 75 66 2e 20 49  ed at by pBuf. I
269a0 66 20 65 4f 70 20 69 73 20 74 72 75 65 2c 0a 2a  f eOp is true,.*
269b0 2a 20 74 68 65 6e 20 73 71 6c 69 74 65 33 50 61  * then sqlite3Pa
269c0 67 65 72 57 72 69 74 65 28 29 20 69 73 20 63 61  gerWrite() is ca
269d0 6c 6c 65 64 20 6f 6e 20 70 44 62 50 61 67 65 20  lled on pDbPage 
269e0 61 6e 64 20 6e 42 79 74 65 20 62 79 74 65 73 0a  and nByte bytes.
269f0 2a 2a 20 6f 66 20 64 61 74 61 20 61 72 65 20 63  ** of data are c
26a00 6f 70 69 65 64 20 66 72 6f 6d 20 74 68 65 20 62  opied from the b
26a10 75 66 66 65 72 20 70 42 75 66 20 74 6f 20 70 50  uffer pBuf to pP
26a20 61 79 6c 6f 61 64 2e 0a 2a 2a 0a 2a 2a 20 53 51  ayload..**.** SQ
26a30 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
26a40 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73 2c 20  ned on success, 
26a50 6f 74 68 65 72 77 69 73 65 20 61 6e 20 65 72 72  otherwise an err
26a60 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74  or code..*/.stat
26a70 69 63 20 69 6e 74 20 63 6f 70 79 50 61 79 6c 6f  ic int copyPaylo
26a80 61 64 28 0a 20 20 76 6f 69 64 20 2a 70 50 61 79  ad(.  void *pPay
26a90 6c 6f 61 64 2c 20 20 20 20 20 20 20 20 20 20 20  load,           
26aa0 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 70 61  /* Pointer to pa
26ab0 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 76 6f 69  ge data */.  voi
26ac0 64 20 2a 70 42 75 66 2c 20 20 20 20 20 20 20 20  d *pBuf,        
26ad0 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
26ae0 72 20 74 6f 20 62 75 66 66 65 72 20 2a 2f 0a 20  r to buffer */. 
26af0 20 69 6e 74 20 6e 42 79 74 65 2c 20 20 20 20 20   int nByte,     
26b00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
26b10 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f  mber of bytes to
26b20 20 63 6f 70 79 20 2a 2f 0a 20 20 69 6e 74 20 65   copy */.  int e
26b30 4f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  Op,             
26b40 20 20 20 20 20 2f 2a 20 30 20 2d 3e 20 63 6f 70       /* 0 -> cop
26b50 79 20 66 72 6f 6d 20 70 61 67 65 2c 20 31 20 2d  y from page, 1 -
26b60 3e 20 63 6f 70 79 20 74 6f 20 70 61 67 65 20 2a  > copy to page *
26b70 2f 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62 50  /.  DbPage *pDbP
26b80 61 67 65 20 20 20 20 20 20 20 20 20 20 20 2f 2a  age           /*
26b90 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67   Page containing
26ba0 20 70 50 61 79 6c 6f 61 64 20 2a 2f 0a 29 7b 0a   pPayload */.){.
26bb0 20 20 69 66 28 20 65 4f 70 20 29 7b 0a 20 20 20    if( eOp ){.   
26bc0 20 2f 2a 20 43 6f 70 79 20 64 61 74 61 20 66 72   /* Copy data fr
26bd0 6f 6d 20 62 75 66 66 65 72 20 74 6f 20 70 61 67  om buffer to pag
26be0 65 20 28 61 20 77 72 69 74 65 20 6f 70 65 72 61  e (a write opera
26bf0 74 69 6f 6e 29 20 2a 2f 0a 20 20 20 20 69 6e 74  tion) */.    int
26c00 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
26c10 65 72 57 72 69 74 65 28 70 44 62 50 61 67 65 29  erWrite(pDbPage)
26c20 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
26c30 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
26c40 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
26c50 7d 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61  }.    memcpy(pPa
26c60 79 6c 6f 61 64 2c 20 70 42 75 66 2c 20 6e 42 79  yload, pBuf, nBy
26c70 74 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  te);.  }else{.  
26c80 20 20 2f 2a 20 43 6f 70 79 20 64 61 74 61 20 66    /* Copy data f
26c90 72 6f 6d 20 70 61 67 65 20 74 6f 20 62 75 66 66  rom page to buff
26ca0 65 72 20 28 61 20 72 65 61 64 20 6f 70 65 72 61  er (a read opera
26cb0 74 69 6f 6e 29 20 2a 2f 0a 20 20 20 20 6d 65 6d  tion) */.    mem
26cc0 63 70 79 28 70 42 75 66 2c 20 70 50 61 79 6c 6f  cpy(pBuf, pPaylo
26cd0 61 64 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d 0a  ad, nByte);.  }.
26ce0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
26cf0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  OK;.}../*.** Thi
26d00 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73  s function is us
26d10 65 64 20 74 6f 20 72 65 61 64 20 6f 72 20 6f 76  ed to read or ov
26d20 65 72 77 72 69 74 65 20 70 61 79 6c 6f 61 64 20  erwrite payload 
26d30 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 66  information.** f
26d40 6f 72 20 74 68 65 20 65 6e 74 72 79 20 74 68 61  or the entry tha
26d50 74 20 74 68 65 20 70 43 75 72 20 63 75 72 73 6f  t the pCur curso
26d60 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f  r is pointing to
26d70 2e 20 54 68 65 20 65 4f 70 0a 2a 2a 20 61 72 67  . The eOp.** arg
26d80 75 6d 65 6e 74 20 69 73 20 69 6e 74 65 72 70 72  ument is interpr
26d90 65 74 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  eted as follows:
26da0 0a 2a 2a 0a 2a 2a 20 20 20 30 3a 20 54 68 65 20  .**.**   0: The 
26db0 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 61 20 72  operation is a r
26dc0 65 61 64 2e 20 50 6f 70 75 6c 61 74 65 20 74 68  ead. Populate th
26dd0 65 20 6f 76 65 72 66 6c 6f 77 20 63 61 63 68 65  e overflow cache
26de0 2e 0a 2a 2a 20 20 20 31 3a 20 54 68 65 20 6f 70  ..**   1: The op
26df0 65 72 61 74 69 6f 6e 20 69 73 20 61 20 77 72 69  eration is a wri
26e00 74 65 2e 20 50 6f 70 75 6c 61 74 65 20 74 68 65  te. Populate the
26e10 20 6f 76 65 72 66 6c 6f 77 20 63 61 63 68 65 2e   overflow cache.
26e20 0a 2a 2a 0a 2a 2a 20 41 20 74 6f 74 61 6c 20 6f  .**.** A total o
26e30 66 20 22 61 6d 74 22 20 62 79 74 65 73 20 61 72  f "amt" bytes ar
26e40 65 20 72 65 61 64 20 6f 72 20 77 72 69 74 74 65  e read or writte
26e50 6e 20 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 22  n beginning at "
26e60 6f 66 66 73 65 74 22 2e 0a 2a 2a 20 44 61 74 61  offset"..** Data
26e70 20 69 73 20 72 65 61 64 20 74 6f 20 6f 72 20 66   is read to or f
26e80 72 6f 6d 20 74 68 65 20 62 75 66 66 65 72 20 70  rom the buffer p
26e90 42 75 66 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  Buf..**.** The c
26ea0 6f 6e 74 65 6e 74 20 62 65 69 6e 67 20 72 65 61  ontent being rea
26eb0 64 20 6f 72 20 77 72 69 74 74 65 6e 20 6d 69 67  d or written mig
26ec0 68 74 20 61 70 70 65 61 72 20 6f 6e 20 74 68 65  ht appear on the
26ed0 20 6d 61 69 6e 20 70 61 67 65 0a 2a 2a 20 6f 72   main page.** or
26ee0 20 62 65 20 73 63 61 74 74 65 72 65 64 20 6f 75   be scattered ou
26ef0 74 20 6f 6e 20 6d 75 6c 74 69 70 6c 65 20 6f 76  t on multiple ov
26f00 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 0a 2a 2a  erflow pages..**
26f10 0a 2a 2a 20 49 66 20 74 68 65 20 63 75 72 72 65  .** If the curre
26f20 6e 74 20 63 75 72 73 6f 72 20 65 6e 74 72 79 20  nt cursor entry 
26f30 75 73 65 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  uses one or more
26f40 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 0a   overflow pages.
26f50 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** this function
26f60 20 6d 61 79 20 61 6c 6c 6f 63 61 74 65 20 73 70   may allocate sp
26f70 61 63 65 20 66 6f 72 20 61 6e 64 20 6c 61 7a 69  ace for and lazi
26f80 6c 79 20 70 6f 70 75 6c 61 74 65 0a 2a 2a 20 74  ly populate.** t
26f90 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  he overflow page
26fa0 2d 6c 69 73 74 20 63 61 63 68 65 20 61 72 72 61  -list cache arra
26fb0 79 20 28 42 74 43 75 72 73 6f 72 2e 61 4f 76 65  y (BtCursor.aOve
26fc0 72 66 6c 6f 77 29 2e 20 0a 2a 2a 20 53 75 62 73  rflow). .** Subs
26fd0 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 75 73 65  equent calls use
26fe0 20 74 68 69 73 20 63 61 63 68 65 20 74 6f 20 6d   this cache to m
26ff0 61 6b 65 20 73 65 65 6b 69 6e 67 20 74 6f 20 74  ake seeking to t
27000 68 65 20 73 75 70 70 6c 69 65 64 20 6f 66 66 73  he supplied offs
27010 65 74 20 0a 2a 2a 20 6d 6f 72 65 20 65 66 66 69  et .** more effi
27020 63 69 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63  cient..**.** Onc
27030 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  e an overflow pa
27040 67 65 2d 6c 69 73 74 20 63 61 63 68 65 20 68 61  ge-list cache ha
27050 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64  s been allocated
27060 2c 20 69 74 20 6d 75 73 74 20 62 65 0a 2a 2a 20  , it must be.** 
27070 69 6e 76 61 6c 69 64 61 74 65 64 20 69 66 20 73  invalidated if s
27080 6f 6d 65 20 6f 74 68 65 72 20 63 75 72 73 6f 72  ome other cursor
27090 20 77 72 69 74 65 73 20 74 6f 20 74 68 65 20 73   writes to the s
270a0 61 6d 65 20 74 61 62 6c 65 2c 20 6f 72 20 69 66  ame table, or if
270b0 0a 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 20 69  .** the cursor i
270c0 73 20 6d 6f 76 65 64 20 74 6f 20 61 20 64 69 66  s moved to a dif
270d0 66 65 72 65 6e 74 20 72 6f 77 2e 20 41 64 64 69  ferent row. Addi
270e0 74 69 6f 6e 61 6c 6c 79 2c 20 69 6e 20 61 75 74  tionally, in aut
270f0 6f 2d 76 61 63 75 75 6d 0a 2a 2a 20 6d 6f 64 65  o-vacuum.** mode
27100 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  , the following 
27110 65 76 65 6e 74 73 20 6d 61 79 20 69 6e 76 61 6c  events may inval
27120 69 64 61 74 65 20 61 6e 20 6f 76 65 72 66 6c 6f  idate an overflo
27130 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68  w page-list cach
27140 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 41 6e 20  e..**.**   * An 
27150 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75  incremental vacu
27160 75 6d 2c 0a 2a 2a 20 20 20 2a 20 41 20 63 6f 6d  um,.**   * A com
27170 6d 69 74 20 69 6e 20 61 75 74 6f 5f 76 61 63 75  mit in auto_vacu
27180 75 6d 3d 22 66 75 6c 6c 22 20 6d 6f 64 65 2c 0a  um="full" mode,.
27190 2a 2a 20 20 20 2a 20 43 72 65 61 74 69 6e 67 20  **   * Creating 
271a0 61 20 74 61 62 6c 65 20 28 6d 61 79 20 72 65 71  a table (may req
271b0 75 69 72 65 20 6d 6f 76 69 6e 67 20 61 6e 20 6f  uire moving an o
271c0 76 65 72 66 6c 6f 77 20 70 61 67 65 29 2e 0a 2a  verflow page)..*
271d0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 63 63  /.static int acc
271e0 65 73 73 50 61 79 6c 6f 61 64 28 0a 20 20 42 74  essPayload(.  Bt
271f0 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20  Cursor *pCur,   
27200 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 70 6f 69     /* Cursor poi
27210 6e 74 69 6e 67 20 74 6f 20 65 6e 74 72 79 20 74  nting to entry t
27220 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20  o read from */. 
27230 20 75 33 32 20 6f 66 66 73 65 74 2c 20 20 20 20   u32 offset,    
27240 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 72        /* Begin r
27250 65 61 64 69 6e 67 20 74 68 69 73 20 66 61 72 20  eading this far 
27260 69 6e 74 6f 20 70 61 79 6c 6f 61 64 20 2a 2f 0a  into payload */.
27270 20 20 75 33 32 20 61 6d 74 2c 20 20 20 20 20 20    u32 amt,      
27280 20 20 20 20 20 20 20 2f 2a 20 52 65 61 64 20 74         /* Read t
27290 68 69 73 20 6d 61 6e 79 20 62 79 74 65 73 20 2a  his many bytes *
272a0 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
272b0 72 20 2a 70 42 75 66 2c 20 2f 2a 20 57 72 69 74  r *pBuf, /* Writ
272c0 65 20 74 68 65 20 62 79 74 65 73 20 69 6e 74 6f  e the bytes into
272d0 20 74 68 69 73 20 62 75 66 66 65 72 20 2a 2f 20   this buffer */ 
272e0 0a 20 20 69 6e 74 20 65 4f 70 20 20 20 20 20 20  .  int eOp      
272f0 20 20 20 20 20 20 20 20 2f 2a 20 7a 65 72 6f 20          /* zero 
27300 74 6f 20 72 65 61 64 2e 20 6e 6f 6e 2d 7a 65 72  to read. non-zer
27310 6f 20 74 6f 20 77 72 69 74 65 2e 20 2a 2f 0a 29  o to write. */.)
27320 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  {.  unsigned cha
27330 72 20 2a 61 50 61 79 6c 6f 61 64 3b 0a 20 20 69  r *aPayload;.  i
27340 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
27350 4b 3b 0a 20 20 69 6e 74 20 69 49 64 78 20 3d 20  K;.  int iIdx = 
27360 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  0;.  MemPage *pP
27370 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67  age = pCur->pPag
27380 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
27390 20 2f 2a 20 42 74 72 65 65 20 70 61 67 65 20 6f   /* Btree page o
273a0 66 20 63 75 72 72 65 6e 74 20 65 6e 74 72 79 20  f current entry 
273b0 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  */.  BtShared *p
273c0 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b 20  Bt = pCur->pBt; 
273d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
273e0 20 2f 2a 20 42 74 72 65 65 20 74 68 69 73 20 63   /* Btree this c
273f0 75 72 73 6f 72 20 62 65 6c 6f 6e 67 73 20 74 6f  ursor belongs to
27400 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
27410 45 5f 44 49 52 45 43 54 5f 4f 56 45 52 46 4c 4f  E_DIRECT_OVERFLO
27420 57 5f 52 45 41 44 0a 20 20 75 6e 73 69 67 6e 65  W_READ.  unsigne
27430 64 20 63 68 61 72 20 2a 20 63 6f 6e 73 74 20 70  d char * const p
27440 42 75 66 53 74 61 72 74 20 3d 20 70 42 75 66 3b  BufStart = pBuf;
27450 20 20 20 20 20 2f 2a 20 53 74 61 72 74 20 6f 66       /* Start of
27460 20 6f 72 69 67 69 6e 61 6c 20 6f 75 74 20 62 75   original out bu
27470 66 66 65 72 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a  ffer */.#endif..
27480 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 20    assert( pPage 
27490 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4f 70  );.  assert( eOp
274a0 3d 3d 30 20 7c 7c 20 65 4f 70 3d 3d 31 20 29 3b  ==0 || eOp==1 );
274b0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
274c0 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
274d0 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72  VALID );.  asser
274e0 74 28 20 70 43 75 72 2d 3e 69 78 3c 70 50 61 67  t( pCur->ix<pPag
274f0 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73  e->nCell );.  as
27500 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
27510 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
27520 0a 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70  .  getCellInfo(p
27530 43 75 72 29 3b 0a 20 20 61 50 61 79 6c 6f 61 64  Cur);.  aPayload
27540 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 50   = pCur->info.pP
27550 61 79 6c 6f 61 64 3b 0a 20 20 61 73 73 65 72 74  ayload;.  assert
27560 28 20 6f 66 66 73 65 74 2b 61 6d 74 20 3c 3d 20  ( offset+amt <= 
27570 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50 61 79 6c  pCur->info.nPayl
27580 6f 61 64 20 29 3b 0a 0a 20 20 61 73 73 65 72 74  oad );..  assert
27590 28 20 61 50 61 79 6c 6f 61 64 20 3e 20 70 50 61  ( aPayload > pPa
275a0 67 65 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 69  ge->aData );.  i
275b0 66 28 20 28 75 70 74 72 29 28 61 50 61 79 6c 6f  f( (uptr)(aPaylo
275c0 61 64 20 2d 20 70 50 61 67 65 2d 3e 61 44 61 74  ad - pPage->aDat
275d0 61 29 20 3e 20 28 70 42 74 2d 3e 75 73 61 62 6c  a) > (pBt->usabl
275e0 65 53 69 7a 65 20 2d 20 70 43 75 72 2d 3e 69 6e  eSize - pCur->in
275f0 66 6f 2e 6e 4c 6f 63 61 6c 29 20 29 7b 0a 20 20  fo.nLocal) ){.  
27600 20 20 2f 2a 20 54 72 79 69 6e 67 20 74 6f 20 72    /* Trying to r
27610 65 61 64 20 6f 72 20 77 72 69 74 65 20 70 61 73  ead or write pas
27620 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
27630 20 64 61 74 61 20 69 73 20 61 6e 20 65 72 72 6f   data is an erro
27640 72 2e 20 20 54 68 65 0a 20 20 20 20 2a 2a 20 63  r.  The.    ** c
27650 6f 6e 64 69 74 69 6f 6e 61 6c 20 61 62 6f 76 65  onditional above
27660 20 69 73 20 72 65 61 6c 6c 79 3a 0a 20 20 20 20   is really:.    
27670 2a 2a 20 20 20 20 26 61 50 61 79 6c 6f 61 64 5b  **    &aPayload[
27680 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61  pCur->info.nLoca
27690 6c 5d 20 3e 20 26 70 50 61 67 65 2d 3e 61 44 61  l] > &pPage->aDa
276a0 74 61 5b 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  ta[pBt->usableSi
276b0 7a 65 5d 0a 20 20 20 20 2a 2a 20 62 75 74 20 69  ze].    ** but i
276c0 73 20 72 65 63 61 73 74 20 69 6e 74 6f 20 69 74  s recast into it
276d0 73 20 63 75 72 72 65 6e 74 20 66 6f 72 6d 20 74  s current form t
276e0 6f 20 61 76 6f 69 64 20 69 6e 74 65 67 65 72 20  o avoid integer 
276f0 6f 76 65 72 66 6c 6f 77 20 70 72 6f 62 6c 65 6d  overflow problem
27700 73 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 65 74  s.    */.    ret
27710 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
27720 50 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a  PT_PAGE(pPage);.
27730 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20    }..  /* Check 
27740 69 66 20 64 61 74 61 20 6d 75 73 74 20 62 65 20  if data must be 
27750 72 65 61 64 2f 77 72 69 74 74 65 6e 20 74 6f 2f  read/written to/
27760 66 72 6f 6d 20 74 68 65 20 62 74 72 65 65 20 70  from the btree p
27770 61 67 65 20 69 74 73 65 6c 66 2e 20 2a 2f 0a 20  age itself. */. 
27780 20 69 66 28 20 6f 66 66 73 65 74 3c 70 43 75 72   if( offset<pCur
27790 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b  ->info.nLocal ){
277a0 0a 20 20 20 20 69 6e 74 20 61 20 3d 20 61 6d 74  .    int a = amt
277b0 3b 0a 20 20 20 20 69 66 28 20 61 2b 6f 66 66 73  ;.    if( a+offs
277c0 65 74 3e 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c  et>pCur->info.nL
277d0 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 61 20  ocal ){.      a 
277e0 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f  = pCur->info.nLo
277f0 63 61 6c 20 2d 20 6f 66 66 73 65 74 3b 0a 20 20  cal - offset;.  
27800 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 63 6f 70    }.    rc = cop
27810 79 50 61 79 6c 6f 61 64 28 26 61 50 61 79 6c 6f  yPayload(&aPaylo
27820 61 64 5b 6f 66 66 73 65 74 5d 2c 20 70 42 75 66  ad[offset], pBuf
27830 2c 20 61 2c 20 65 4f 70 2c 20 70 50 61 67 65 2d  , a, eOp, pPage-
27840 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 6f  >pDbPage);.    o
27850 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 70  ffset = 0;.    p
27860 42 75 66 20 2b 3d 20 61 3b 0a 20 20 20 20 61 6d  Buf += a;.    am
27870 74 20 2d 3d 20 61 3b 0a 20 20 7d 65 6c 73 65 7b  t -= a;.  }else{
27880 0a 20 20 20 20 6f 66 66 73 65 74 20 2d 3d 20 70  .    offset -= p
27890 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  Cur->info.nLocal
278a0 3b 0a 20 20 7d 0a 0a 0a 20 20 69 66 28 20 72 63  ;.  }...  if( rc
278b0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61  ==SQLITE_OK && a
278c0 6d 74 3e 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73  mt>0 ){.    cons
278d0 74 20 75 33 32 20 6f 76 66 6c 53 69 7a 65 20 3d  t u32 ovflSize =
278e0 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
278f0 20 2d 20 34 3b 20 20 2f 2a 20 42 79 74 65 73 20   - 4;  /* Bytes 
27900 63 6f 6e 74 65 6e 74 20 70 65 72 20 6f 76 66 6c  content per ovfl
27910 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 50 67 6e   page */.    Pgn
27920 6f 20 6e 65 78 74 50 61 67 65 3b 0a 0a 20 20 20  o nextPage;..   
27930 20 6e 65 78 74 50 61 67 65 20 3d 20 67 65 74 34   nextPage = get4
27940 62 79 74 65 28 26 61 50 61 79 6c 6f 61 64 5b 70  byte(&aPayload[p
27950 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  Cur->info.nLocal
27960 5d 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74  ]);..    /* If t
27970 68 65 20 42 74 43 75 72 73 6f 72 2e 61 4f 76 65  he BtCursor.aOve
27980 72 66 6c 6f 77 5b 5d 20 68 61 73 20 6e 6f 74 20  rflow[] has not 
27990 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c 20  been allocated, 
279a0 61 6c 6c 6f 63 61 74 65 20 69 74 20 6e 6f 77 2e  allocate it now.
279b0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
279c0 68 65 20 61 4f 76 65 72 66 6c 6f 77 5b 5d 20 61  he aOverflow[] a
279d0 72 72 61 79 20 69 73 20 73 69 7a 65 64 20 61 74  rray is sized at
279e0 20 6f 6e 65 20 65 6e 74 72 79 20 66 6f 72 20 65   one entry for e
279f0 61 63 68 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  ach overflow pag
27a00 65 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20  e.    ** in the 
27a10 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 2e 20  overflow chain. 
27a20 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  The page number 
27a30 6f 66 20 74 68 65 20 66 69 72 73 74 20 6f 76 65  of the first ove
27a40 72 66 6c 6f 77 20 70 61 67 65 20 69 73 0a 20 20  rflow page is.  
27a50 20 20 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20 61    ** stored in a
27a60 4f 76 65 72 66 6c 6f 77 5b 30 5d 2c 20 65 74 63  Overflow[0], etc
27a70 2e 20 41 20 76 61 6c 75 65 20 6f 66 20 30 20 69  . A value of 0 i
27a80 6e 20 74 68 65 20 61 4f 76 65 72 66 6c 6f 77 5b  n the aOverflow[
27a90 5d 20 61 72 72 61 79 0a 20 20 20 20 2a 2a 20 6d  ] array.    ** m
27aa0 65 61 6e 73 20 22 6e 6f 74 20 79 65 74 20 6b 6e  eans "not yet kn
27ab0 6f 77 6e 22 20 28 74 68 65 20 63 61 63 68 65 20  own" (the cache 
27ac0 69 73 20 6c 61 7a 69 6c 79 20 70 6f 70 75 6c 61  is lazily popula
27ad0 74 65 64 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ted)..    */.   
27ae0 20 69 66 28 20 28 70 43 75 72 2d 3e 63 75 72 46   if( (pCur->curF
27af0 6c 61 67 73 20 26 20 42 54 43 46 5f 56 61 6c 69  lags & BTCF_Vali
27b00 64 4f 76 66 6c 29 3d 3d 30 20 29 7b 0a 20 20 20  dOvfl)==0 ){.   
27b10 20 20 20 69 6e 74 20 6e 4f 76 66 6c 20 3d 20 28     int nOvfl = (
27b20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50 61 79 6c  pCur->info.nPayl
27b30 6f 61 64 2d 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  oad-pCur->info.n
27b40 4c 6f 63 61 6c 2b 6f 76 66 6c 53 69 7a 65 2d 31  Local+ovflSize-1
27b50 29 2f 6f 76 66 6c 53 69 7a 65 3b 0a 20 20 20 20  )/ovflSize;.    
27b60 20 20 69 66 28 20 70 43 75 72 2d 3e 61 4f 76 65    if( pCur->aOve
27b70 72 66 6c 6f 77 3d 3d 30 0a 20 20 20 20 20 20 20  rflow==0.       
27b80 7c 7c 20 6e 4f 76 66 6c 2a 28 69 6e 74 29 73 69  || nOvfl*(int)si
27b90 7a 65 6f 66 28 50 67 6e 6f 29 20 3e 20 73 71 6c  zeof(Pgno) > sql
27ba0 69 74 65 33 4d 61 6c 6c 6f 63 53 69 7a 65 28 70  ite3MallocSize(p
27bb0 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 29 0a  Cur->aOverflow).
27bc0 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
27bd0 20 50 67 6e 6f 20 2a 61 4e 65 77 20 3d 20 28 50   Pgno *aNew = (P
27be0 67 6e 6f 2a 29 73 71 6c 69 74 65 33 52 65 61 6c  gno*)sqlite3Real
27bf0 6c 6f 63 28 0a 20 20 20 20 20 20 20 20 20 20 20  loc(.           
27c00 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77   pCur->aOverflow
27c10 2c 20 6e 4f 76 66 6c 2a 32 2a 73 69 7a 65 6f 66  , nOvfl*2*sizeof
27c20 28 50 67 6e 6f 29 0a 20 20 20 20 20 20 20 20 29  (Pgno).        )
27c30 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 4e  ;.        if( aN
27c40 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ew==0 ){.       
27c50 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
27c60 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20  _NOMEM_BKPT;.   
27c70 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
27c80 20 20 20 20 20 20 70 43 75 72 2d 3e 61 4f 76 65        pCur->aOve
27c90 72 66 6c 6f 77 20 3d 20 61 4e 65 77 3b 0a 20 20  rflow = aNew;.  
27ca0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
27cb0 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 43 75        memset(pCu
27cc0 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 2c 20 30 2c  r->aOverflow, 0,
27cd0 20 6e 4f 76 66 6c 2a 73 69 7a 65 6f 66 28 50 67   nOvfl*sizeof(Pg
27ce0 6e 6f 29 29 3b 0a 20 20 20 20 20 20 70 43 75 72  no));.      pCur
27cf0 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20 42 54  ->curFlags |= BT
27d00 43 46 5f 56 61 6c 69 64 4f 76 66 6c 3b 0a 20 20  CF_ValidOvfl;.  
27d10 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f    }else{.      /
27d20 2a 20 49 66 20 74 68 65 20 6f 76 65 72 66 6c 6f  * If the overflo
27d30 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68  w page-list cach
27d40 65 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63  e has been alloc
27d50 61 74 65 64 20 61 6e 64 20 74 68 65 0a 20 20 20  ated and the.   
27d60 20 20 20 2a 2a 20 65 6e 74 72 79 20 66 6f 72 20     ** entry for 
27d70 74 68 65 20 66 69 72 73 74 20 72 65 71 75 69 72  the first requir
27d80 65 64 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  ed overflow page
27d90 20 69 73 20 76 61 6c 69 64 2c 20 73 6b 69 70 0a   is valid, skip.
27da0 20 20 20 20 20 20 2a 2a 20 64 69 72 65 63 74 6c        ** directl
27db0 79 20 74 6f 20 69 74 2e 0a 20 20 20 20 20 20 2a  y to it..      *
27dc0 2f 0a 20 20 20 20 20 20 69 66 28 20 70 43 75 72  /.      if( pCur
27dd0 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 6f 66 66 73  ->aOverflow[offs
27de0 65 74 2f 6f 76 66 6c 53 69 7a 65 5d 20 29 7b 0a  et/ovflSize] ){.
27df0 20 20 20 20 20 20 20 20 69 49 64 78 20 3d 20 28          iIdx = (
27e00 6f 66 66 73 65 74 2f 6f 76 66 6c 53 69 7a 65 29  offset/ovflSize)
27e10 3b 0a 20 20 20 20 20 20 20 20 6e 65 78 74 50 61  ;.        nextPa
27e20 67 65 20 3d 20 70 43 75 72 2d 3e 61 4f 76 65 72  ge = pCur->aOver
27e30 66 6c 6f 77 5b 69 49 64 78 5d 3b 0a 20 20 20 20  flow[iIdx];.    
27e40 20 20 20 20 6f 66 66 73 65 74 20 3d 20 28 6f 66      offset = (of
27e50 66 73 65 74 25 6f 76 66 6c 53 69 7a 65 29 3b 0a  fset%ovflSize);.
27e60 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
27e70 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53     assert( rc==S
27e80 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e  QLITE_OK && amt>
27e90 30 20 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  0 );.    while( 
27ea0 6e 65 78 74 50 61 67 65 20 29 7b 0a 20 20 20 20  nextPage ){.    
27eb0 20 20 2f 2a 20 49 66 20 72 65 71 75 69 72 65 64    /* If required
27ec0 2c 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20 6f  , populate the o
27ed0 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73  verflow page-lis
27ee0 74 20 63 61 63 68 65 2e 20 2a 2f 0a 20 20 20 20  t cache. */.    
27ef0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
27f00 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 3d  aOverflow[iIdx]=
27f10 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  =0.             
27f20 20 7c 7c 20 70 43 75 72 2d 3e 61 4f 76 65 72 66   || pCur->aOverf
27f30 6c 6f 77 5b 69 49 64 78 5d 3d 3d 6e 65 78 74 50  low[iIdx]==nextP
27f40 61 67 65 0a 20 20 20 20 20 20 20 20 20 20 20 20  age.            
27f50 20 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20    || CORRUPT_DB 
27f60 29 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 61  );.      pCur->a
27f70 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 20 3d  Overflow[iIdx] =
27f80 20 6e 65 78 74 50 61 67 65 3b 0a 0a 20 20 20 20   nextPage;..    
27f90 20 20 69 66 28 20 6f 66 66 73 65 74 3e 3d 6f 76    if( offset>=ov
27fa0 66 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  flSize ){.      
27fb0 20 20 2f 2a 20 54 68 65 20 6f 6e 6c 79 20 72 65    /* The only re
27fc0 61 73 6f 6e 20 74 6f 20 72 65 61 64 20 74 68 69  ason to read thi
27fd0 73 20 70 61 67 65 20 69 73 20 74 6f 20 6f 62 74  s page is to obt
27fe0 61 69 6e 20 74 68 65 20 70 61 67 65 0a 20 20 20  ain the page.   
27ff0 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 66       ** number f
28000 6f 72 20 74 68 65 20 6e 65 78 74 20 70 61 67 65  or the next page
28010 20 69 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f 77   in the overflow
28020 20 63 68 61 69 6e 2e 20 54 68 65 20 70 61 67 65   chain. The page
28030 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 61 74 61  .        ** data
28040 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64   is not required
28050 2e 20 53 6f 20 66 69 72 73 74 20 74 72 79 20 74  . So first try t
28060 6f 20 6c 6f 6f 6b 75 70 20 74 68 65 20 6f 76 65  o lookup the ove
28070 72 66 6c 6f 77 0a 20 20 20 20 20 20 20 20 2a 2a  rflow.        **
28080 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65   page-list cache
28090 2c 20 69 66 20 61 6e 79 2c 20 74 68 65 6e 20 66  , if any, then f
280a0 61 6c 6c 20 62 61 63 6b 20 74 6f 20 74 68 65 20  all back to the 
280b0 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28  getOverflowPage(
280c0 29 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6e  ).        ** fun
280d0 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 20 20 2a  ction..        *
280e0 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  /.        assert
280f0 28 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73  ( pCur->curFlags
28100 20 26 20 42 54 43 46 5f 56 61 6c 69 64 4f 76 66   & BTCF_ValidOvf
28110 6c 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  l );.        ass
28120 65 72 74 28 20 70 43 75 72 2d 3e 70 42 74 72 65  ert( pCur->pBtre
28130 65 2d 3e 64 62 3d 3d 70 42 74 2d 3e 64 62 20 29  e->db==pBt->db )
28140 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 43  ;.        if( pC
28150 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49  ur->aOverflow[iI
28160 64 78 2b 31 5d 20 29 7b 0a 20 20 20 20 20 20 20  dx+1] ){.       
28170 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20 70 43     nextPage = pC
28180 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49  ur->aOverflow[iI
28190 64 78 2b 31 5d 3b 0a 20 20 20 20 20 20 20 20 7d  dx+1];.        }
281a0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
281b0 72 63 20 3d 20 67 65 74 4f 76 65 72 66 6c 6f 77  rc = getOverflow
281c0 50 61 67 65 28 70 42 74 2c 20 6e 65 78 74 50 61  Page(pBt, nextPa
281d0 67 65 2c 20 30 2c 20 26 6e 65 78 74 50 61 67 65  ge, 0, &nextPage
281e0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
281f0 20 20 20 20 20 6f 66 66 73 65 74 20 2d 3d 20 6f       offset -= o
28200 76 66 6c 53 69 7a 65 3b 0a 20 20 20 20 20 20 7d  vflSize;.      }
28210 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
28220 20 4e 65 65 64 20 74 6f 20 72 65 61 64 20 74 68   Need to read th
28230 69 73 20 70 61 67 65 20 70 72 6f 70 65 72 6c 79  is page properly
28240 2e 20 49 74 20 63 6f 6e 74 61 69 6e 73 20 73 6f  . It contains so
28250 6d 65 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20  me of the.      
28260 20 20 2a 2a 20 72 61 6e 67 65 20 6f 66 20 64 61    ** range of da
28270 74 61 20 74 68 61 74 20 69 73 20 62 65 69 6e 67  ta that is being
28280 20 72 65 61 64 20 28 65 4f 70 3d 3d 30 29 20 6f   read (eOp==0) o
28290 72 20 77 72 69 74 74 65 6e 20 28 65 4f 70 21 3d  r written (eOp!=
282a0 30 29 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  0)..        */. 
282b0 20 20 20 20 20 20 20 69 6e 74 20 61 20 3d 20 61         int a = a
282c0 6d 74 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  mt;.        if( 
282d0 61 20 2b 20 6f 66 66 73 65 74 20 3e 20 6f 76 66  a + offset > ovf
282e0 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20  lSize ){.       
282f0 20 20 20 61 20 3d 20 6f 76 66 6c 53 69 7a 65 20     a = ovflSize 
28300 2d 20 6f 66 66 73 65 74 3b 0a 20 20 20 20 20 20  - offset;.      
28310 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49    }..#ifdef SQLI
28320 54 45 5f 44 49 52 45 43 54 5f 4f 56 45 52 46 4c  TE_DIRECT_OVERFL
28330 4f 57 5f 52 45 41 44 0a 20 20 20 20 20 20 20 20  OW_READ.        
28340 2f 2a 20 49 66 20 61 6c 6c 20 74 68 65 20 66 6f  /* If all the fo
28350 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65  llowing are true
28360 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  :.        **.   
28370 20 20 20 20 20 2a 2a 20 20 20 31 29 20 74 68 69       **   1) thi
28380 73 20 69 73 20 61 20 72 65 61 64 20 6f 70 65 72  s is a read oper
28390 61 74 69 6f 6e 2c 20 61 6e 64 20 0a 20 20 20 20  ation, and .    
283a0 20 20 20 20 2a 2a 20 20 20 32 29 20 64 61 74 61      **   2) data
283b0 20 69 73 20 72 65 71 75 69 72 65 64 20 66 72 6f   is required fro
283c0 6d 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  m the start of t
283d0 68 69 73 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  his overflow pag
283e0 65 2c 20 61 6e 64 0a 20 20 20 20 20 20 20 20 2a  e, and.        *
283f0 2a 20 20 20 33 29 20 74 68 65 72 65 20 61 72 65  *   3) there are
28400 20 6e 6f 20 64 69 72 74 79 20 70 61 67 65 73 20   no dirty pages 
28410 69 6e 20 74 68 65 20 70 61 67 65 2d 63 61 63 68  in the page-cach
28420 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 34  e.        **   4
28430 29 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  ) the database i
28440 73 20 66 69 6c 65 2d 62 61 63 6b 65 64 2c 20 61  s file-backed, a
28450 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  nd.        **   
28460 35 29 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  5) the page is n
28470 6f 74 20 69 6e 20 74 68 65 20 57 41 4c 20 66 69  ot in the WAL fi
28480 6c 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  le.        **   
28490 36 29 20 61 74 20 6c 65 61 73 74 20 34 20 62 79  6) at least 4 by
284a0 74 65 73 20 68 61 76 65 20 61 6c 72 65 61 64 79  tes have already
284b0 20 62 65 65 6e 20 72 65 61 64 20 69 6e 74 6f 20   been read into 
284c0 74 68 65 20 6f 75 74 70 75 74 20 62 75 66 66 65  the output buffe
284d0 72 20 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  r .        **.  
284e0 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 64 61        ** then da
284f0 74 61 20 63 61 6e 20 62 65 20 72 65 61 64 20 64  ta can be read d
28500 69 72 65 63 74 6c 79 20 66 72 6f 6d 20 74 68 65  irectly from the
28510 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
28520 6e 74 6f 20 74 68 65 0a 20 20 20 20 20 20 20 20  nto the.        
28530 2a 2a 20 6f 75 74 70 75 74 20 62 75 66 66 65 72  ** output buffer
28540 2c 20 62 79 70 61 73 73 69 6e 67 20 74 68 65 20  , bypassing the 
28550 70 61 67 65 2d 63 61 63 68 65 20 61 6c 74 6f 67  page-cache altog
28560 65 74 68 65 72 2e 20 54 68 69 73 20 73 70 65 65  ether. This spee
28570 64 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 75 70  ds.        ** up
28580 20 6c 6f 61 64 69 6e 67 20 6c 61 72 67 65 20 72   loading large r
28590 65 63 6f 72 64 73 20 74 68 61 74 20 73 70 61 6e  ecords that span
285a0 20 6d 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70   many overflow p
285b0 61 67 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ages..        */
285c0 0a 20 20 20 20 20 20 20 20 69 66 28 20 65 4f 70  .        if( eOp
285d0 3d 3d 30 20 20 20 20 20 20 20 20 20 20 20 20 20  ==0             
285e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
285f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28600 2f 2a 20 28 31 29 20 2a 2f 0a 20 20 20 20 20 20  /* (1) */.      
28610 20 20 20 26 26 20 6f 66 66 73 65 74 3d 3d 30 20     && offset==0 
28620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28640 20 20 20 20 20 20 20 20 20 2f 2a 20 28 32 29 20           /* (2) 
28650 2a 2f 0a 20 20 20 20 20 20 20 20 20 26 26 20 73  */.         && s
28660 71 6c 69 74 65 33 50 61 67 65 72 44 69 72 65 63  qlite3PagerDirec
28670 74 52 65 61 64 4f 6b 28 70 42 74 2d 3e 70 50 61  tReadOk(pBt->pPa
28680 67 65 72 2c 20 6e 65 78 74 50 61 67 65 29 20 20  ger, nextPage)  
28690 20 20 2f 2a 20 28 33 2c 34 2c 35 29 20 2a 2f 0a    /* (3,4,5) */.
286a0 20 20 20 20 20 20 20 20 20 26 26 20 26 70 42 75           && &pBu
286b0 66 5b 2d 34 5d 3e 3d 70 42 75 66 53 74 61 72 74  f[-4]>=pBufStart
286c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
286d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
286e0 2a 20 28 36 29 20 2a 2f 0a 20 20 20 20 20 20 20  * (6) */.       
286f0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
28700 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 20 3d  lite3_file *fd =
28710 20 73 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c   sqlite3PagerFil
28720 65 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a  e(pBt->pPager);.
28730 20 20 20 20 20 20 20 20 20 20 75 38 20 61 53 61            u8 aSa
28740 76 65 5b 34 5d 3b 0a 20 20 20 20 20 20 20 20 20  ve[4];.         
28750 20 75 38 20 2a 61 57 72 69 74 65 20 3d 20 26 70   u8 *aWrite = &p
28760 42 75 66 5b 2d 34 5d 3b 0a 20 20 20 20 20 20 20  Buf[-4];.       
28770 20 20 20 61 73 73 65 72 74 28 20 61 57 72 69 74     assert( aWrit
28780 65 3e 3d 70 42 75 66 53 74 61 72 74 20 29 3b 20  e>=pBufStart ); 
28790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
287a0 20 20 20 20 20 20 20 20 2f 2a 20 64 75 65 20 74          /* due t
287b0 6f 20 28 36 29 20 2a 2f 0a 20 20 20 20 20 20 20  o (6) */.       
287c0 20 20 20 6d 65 6d 63 70 79 28 61 53 61 76 65 2c     memcpy(aSave,
287d0 20 61 57 72 69 74 65 2c 20 34 29 3b 0a 20 20 20   aWrite, 4);.   
287e0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
287f0 74 65 33 4f 73 52 65 61 64 28 66 64 2c 20 61 57  te3OsRead(fd, aW
28800 72 69 74 65 2c 20 61 2b 34 2c 20 28 69 36 34 29  rite, a+4, (i64)
28810 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2a 28 6e  pBt->pageSize*(n
28820 65 78 74 50 61 67 65 2d 31 29 29 3b 0a 20 20 20  extPage-1));.   
28830 20 20 20 20 20 20 20 6e 65 78 74 50 61 67 65 20         nextPage 
28840 3d 20 67 65 74 34 62 79 74 65 28 61 57 72 69 74  = get4byte(aWrit
28850 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65  e);.          me
28860 6d 63 70 79 28 61 57 72 69 74 65 2c 20 61 53 61  mcpy(aWrite, aSa
28870 76 65 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20  ve, 4);.        
28880 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 0a 20 20  }else.#endif..  
28890 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20        {.        
288a0 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67    DbPage *pDbPag
288b0 65 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  e;.          rc 
288c0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  = sqlite3PagerGe
288d0 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6e  t(pBt->pPager, n
288e0 65 78 74 50 61 67 65 2c 20 26 70 44 62 50 61 67  extPage, &pDbPag
288f0 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
28900 20 28 65 4f 70 3d 3d 30 20 3f 20 50 41 47 45 52   (eOp==0 ? PAGER
28910 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20 3a 20  _GET_READONLY : 
28920 30 29 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a  0).          );.
28930 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
28940 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
28950 20 20 20 20 20 20 20 20 20 20 20 61 50 61 79 6c             aPayl
28960 6f 61 64 20 3d 20 73 71 6c 69 74 65 33 50 61 67  oad = sqlite3Pag
28970 65 72 47 65 74 44 61 74 61 28 70 44 62 50 61 67  erGetData(pDbPag
28980 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
28990 6e 65 78 74 50 61 67 65 20 3d 20 67 65 74 34 62  nextPage = get4b
289a0 79 74 65 28 61 50 61 79 6c 6f 61 64 29 3b 0a 20  yte(aPayload);. 
289b0 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
289c0 63 6f 70 79 50 61 79 6c 6f 61 64 28 26 61 50 61  copyPayload(&aPa
289d0 79 6c 6f 61 64 5b 6f 66 66 73 65 74 2b 34 5d 2c  yload[offset+4],
289e0 20 70 42 75 66 2c 20 61 2c 20 65 4f 70 2c 20 70   pBuf, a, eOp, p
289f0 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
28a00 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
28a10 72 55 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b  rUnref(pDbPage);
28a20 0a 20 20 20 20 20 20 20 20 20 20 20 20 6f 66 66  .            off
28a30 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  set = 0;.       
28a40 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
28a50 20 20 20 20 20 20 20 61 6d 74 20 2d 3d 20 61 3b         amt -= a;
28a60 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 6d 74  .        if( amt
28a70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 72 63 3b  ==0 ) return rc;
28a80 0a 20 20 20 20 20 20 20 20 70 42 75 66 20 2b 3d  .        pBuf +=
28a90 20 61 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   a;.      }.    
28aa0 20 20 69 66 28 20 72 63 20 29 20 62 72 65 61 6b    if( rc ) break
28ab0 3b 0a 20 20 20 20 20 20 69 49 64 78 2b 2b 3b 0a  ;.      iIdx++;.
28ac0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
28ad0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
28ae0 26 20 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20 2f  & amt>0 ){.    /
28af0 2a 20 4f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e  * Overflow chain
28b00 20 65 6e 64 73 20 70 72 65 6d 61 74 75 72 65 6c   ends prematurel
28b10 79 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20  y */.    return 
28b20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50  SQLITE_CORRUPT_P
28b30 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a  AGE(pPage);.  }.
28b40 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
28b50 2f 2a 0a 2a 2a 20 52 65 61 64 20 70 61 72 74 20  /*.** Read part 
28b60 6f 66 20 74 68 65 20 70 61 79 6c 6f 61 64 20 66  of the payload f
28b70 6f 72 20 74 68 65 20 72 6f 77 20 61 74 20 77 68  or the row at wh
28b80 69 63 68 20 74 68 61 74 20 63 75 72 73 6f 72 20  ich that cursor 
28b90 70 43 75 72 20 69 73 20 63 75 72 72 65 6e 74 6c  pCur is currentl
28ba0 79 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 2e 20 20  y.** pointing.  
28bb0 22 61 6d 74 22 20 62 79 74 65 73 20 77 69 6c 6c  "amt" bytes will
28bc0 20 62 65 20 74 72 61 6e 73 66 65 72 72 65 64 20   be transferred 
28bd0 69 6e 74 6f 20 70 42 75 66 5b 5d 2e 20 20 54 68  into pBuf[].  Th
28be0 65 20 74 72 61 6e 73 66 65 72 0a 2a 2a 20 62 65  e transfer.** be
28bf0 67 69 6e 73 20 61 74 20 22 6f 66 66 73 65 74 22  gins at "offset"
28c00 2e 0a 2a 2a 0a 2a 2a 20 70 43 75 72 20 63 61 6e  ..**.** pCur can
28c10 20 62 65 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20   be pointing to 
28c20 65 69 74 68 65 72 20 61 20 74 61 62 6c 65 20 6f  either a table o
28c30 72 20 61 6e 20 69 6e 64 65 78 20 62 2d 74 72 65  r an index b-tre
28c40 65 2e 0a 2a 2a 20 49 66 20 70 6f 69 6e 74 69 6e  e..** If pointin
28c50 67 20 74 6f 20 61 20 74 61 62 6c 65 20 62 74 72  g to a table btr
28c60 65 65 2c 20 74 68 65 6e 20 74 68 65 20 63 6f 6e  ee, then the con
28c70 74 65 6e 74 20 73 65 63 74 69 6f 6e 20 69 73 20  tent section is 
28c80 72 65 61 64 2e 20 20 49 66 0a 2a 2a 20 70 43 75  read.  If.** pCu
28c90 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f  r is pointing to
28ca0 20 61 6e 20 69 6e 64 65 78 20 62 2d 74 72 65 65   an index b-tree
28cb0 20 74 68 65 6e 20 74 68 65 20 6b 65 79 20 73 65   then the key se
28cc0 63 74 69 6f 6e 20 69 73 20 72 65 61 64 2e 0a 2a  ction is read..*
28cd0 2a 0a 2a 2a 20 46 6f 72 20 73 71 6c 69 74 65 33  *.** For sqlite3
28ce0 42 74 72 65 65 50 61 79 6c 6f 61 64 28 29 2c 20  BtreePayload(), 
28cf0 74 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20  the caller must 
28d00 65 6e 73 75 72 65 20 74 68 61 74 20 70 43 75 72  ensure that pCur
28d10 20 69 73 20 70 6f 69 6e 74 69 6e 67 0a 2a 2a 20   is pointing.** 
28d20 74 6f 20 61 20 76 61 6c 69 64 20 72 6f 77 20 69  to a valid row i
28d30 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20 46 6f  n the table.  Fo
28d40 72 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61  r sqlite3BtreePa
28d50 79 6c 6f 61 64 43 68 65 63 6b 65 64 28 29 2c 20  yloadChecked(), 
28d60 74 68 65 0a 2a 2a 20 63 75 72 73 6f 72 20 6d 69  the.** cursor mi
28d70 67 68 74 20 62 65 20 69 6e 76 61 6c 69 64 20 6f  ght be invalid o
28d80 72 20 6d 69 67 68 74 20 6e 65 65 64 20 74 6f 20  r might need to 
28d90 62 65 20 72 65 73 74 6f 72 65 64 20 62 65 66 6f  be restored befo
28da0 72 65 20 62 65 69 6e 67 20 72 65 61 64 2e 0a 2a  re being read..*
28db0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49  *.** Return SQLI
28dc0 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73  TE_OK on success
28dd0 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64   or an error cod
28de0 65 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f  e if anything go
28df0 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 20 20 41 6e  es.** wrong.  An
28e00 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e   error is return
28e10 65 64 20 69 66 20 22 6f 66 66 73 65 74 2b 61 6d  ed if "offset+am
28e20 74 22 20 69 73 20 6c 61 72 67 65 72 20 74 68 61  t" is larger tha
28e30 6e 0a 2a 2a 20 74 68 65 20 61 76 61 69 6c 61 62  n.** the availab
28e40 6c 65 20 70 61 79 6c 6f 61 64 2e 0a 2a 2f 0a 69  le payload..*/.i
28e50 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 50  nt sqlite3BtreeP
28e60 61 79 6c 6f 61 64 28 42 74 43 75 72 73 6f 72 20  ayload(BtCursor 
28e70 2a 70 43 75 72 2c 20 75 33 32 20 6f 66 66 73 65  *pCur, u32 offse
28e80 74 2c 20 75 33 32 20 61 6d 74 2c 20 76 6f 69 64  t, u32 amt, void
28e90 20 2a 70 42 75 66 29 7b 0a 20 20 61 73 73 65 72   *pBuf){.  asser
28ea0 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
28eb0 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61  tex(pCur) );.  a
28ec0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
28ed0 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
28ee0 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  D );.  assert( p
28ef0 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 26 26  Cur->iPage>=0 &&
28f00 20 70 43 75 72 2d 3e 70 50 61 67 65 20 29 3b 0a   pCur->pPage );.
28f10 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
28f20 69 78 3c 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e  ix<pCur->pPage->
28f30 6e 43 65 6c 6c 20 29 3b 0a 20 20 72 65 74 75 72  nCell );.  retur
28f40 6e 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28  n accessPayload(
28f50 70 43 75 72 2c 20 6f 66 66 73 65 74 2c 20 61 6d  pCur, offset, am
28f60 74 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61  t, (unsigned cha
28f70 72 2a 29 70 42 75 66 2c 20 30 29 3b 0a 7d 0a 0a  r*)pBuf, 0);.}..
28f80 2f 2a 0a 2a 2a 20 54 68 69 73 20 76 61 72 69 61  /*.** This varia
28f90 6e 74 20 6f 66 20 73 71 6c 69 74 65 33 42 74 72  nt of sqlite3Btr
28fa0 65 65 50 61 79 6c 6f 61 64 28 29 20 77 6f 72 6b  eePayload() work
28fb0 73 20 65 76 65 6e 20 69 66 20 74 68 65 20 63 75  s even if the cu
28fc0 72 73 6f 72 20 68 61 73 20 6e 6f 74 0a 2a 2a 20  rsor has not.** 
28fd0 69 6e 20 74 68 65 20 43 55 52 53 4f 52 5f 56 41  in the CURSOR_VA
28fe0 4c 49 44 20 73 74 61 74 65 2e 20 20 49 74 20 69  LID state.  It i
28ff0 73 20 6f 6e 6c 79 20 75 73 65 64 20 62 79 20 74  s only used by t
29000 68 65 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f  he sqlite3_blob_
29010 72 65 61 64 28 29 0a 2a 2a 20 69 6e 74 65 72 66  read().** interf
29020 61 63 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  ace..*/.#ifndef 
29030 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52  SQLITE_OMIT_INCR
29040 42 4c 4f 42 0a 73 74 61 74 69 63 20 53 51 4c 49  BLOB.static SQLI
29050 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74 20  TE_NOINLINE int 
29060 61 63 63 65 73 73 50 61 79 6c 6f 61 64 43 68 65  accessPayloadChe
29070 63 6b 65 64 28 0a 20 20 42 74 43 75 72 73 6f 72  cked(.  BtCursor
29080 20 2a 70 43 75 72 2c 0a 20 20 75 33 32 20 6f 66   *pCur,.  u32 of
29090 66 73 65 74 2c 0a 20 20 75 33 32 20 61 6d 74 2c  fset,.  u32 amt,
290a0 0a 20 20 76 6f 69 64 20 2a 70 42 75 66 0a 29 7b  .  void *pBuf.){
290b0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 20  .  int rc;.  if 
290c0 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
290d0 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29  CURSOR_INVALID )
290e0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
290f0 49 54 45 5f 41 42 4f 52 54 3b 0a 20 20 7d 0a 20  ITE_ABORT;.  }. 
29100 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f   assert( cursorO
29110 77 6e 73 42 74 53 68 61 72 65 64 28 70 43 75 72  wnsBtShared(pCur
29120 29 20 29 3b 0a 20 20 72 63 20 3d 20 62 74 72 65  ) );.  rc = btre
29130 65 52 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f  eRestoreCursorPo
29140 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20  sition(pCur);.  
29150 72 65 74 75 72 6e 20 72 63 20 3f 20 72 63 20 3a  return rc ? rc :
29160 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 70   accessPayload(p
29170 43 75 72 2c 20 6f 66 66 73 65 74 2c 20 61 6d 74  Cur, offset, amt
29180 2c 20 70 42 75 66 2c 20 30 29 3b 0a 7d 0a 69 6e  , pBuf, 0);.}.in
29190 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61  t sqlite3BtreePa
291a0 79 6c 6f 61 64 43 68 65 63 6b 65 64 28 42 74 43  yloadChecked(BtC
291b0 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32  ursor *pCur, u32
291c0 20 6f 66 66 73 65 74 2c 20 75 33 32 20 61 6d 74   offset, u32 amt
291d0 2c 20 76 6f 69 64 20 2a 70 42 75 66 29 7b 0a 20  , void *pBuf){. 
291e0 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74   if( pCur->eStat
291f0 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
29200 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 63  ){.    assert( c
29210 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65  ursorOwnsBtShare
29220 64 28 70 43 75 72 29 20 29 3b 0a 20 20 20 20 72  d(pCur) );.    r
29230 65 74 75 72 6e 20 61 63 63 65 73 73 50 61 79 6c  eturn accessPayl
29240 6f 61 64 28 70 43 75 72 2c 20 6f 66 66 73 65 74  oad(pCur, offset
29250 2c 20 61 6d 74 2c 20 70 42 75 66 2c 20 30 29 3b  , amt, pBuf, 0);
29260 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
29270 74 75 72 6e 20 61 63 63 65 73 73 50 61 79 6c 6f  turn accessPaylo
29280 61 64 43 68 65 63 6b 65 64 28 70 43 75 72 2c 20  adChecked(pCur, 
29290 6f 66 66 73 65 74 2c 20 61 6d 74 2c 20 70 42 75  offset, amt, pBu
292a0 66 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66  f);.  }.}.#endif
292b0 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
292c0 49 4e 43 52 42 4c 4f 42 20 2a 2f 0a 0a 2f 2a 0a  INCRBLOB */../*.
292d0 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  ** Return a poin
292e0 74 65 72 20 74 6f 20 70 61 79 6c 6f 61 64 20 69  ter to payload i
292f0 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20  nformation from 
29300 74 68 65 20 65 6e 74 72 79 20 74 68 61 74 20 74  the entry that t
29310 68 65 20 0a 2a 2a 20 70 43 75 72 20 63 75 72 73  he .** pCur curs
29320 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74  or is pointing t
29330 6f 2e 20 20 54 68 65 20 70 6f 69 6e 74 65 72 20  o.  The pointer 
29340 69 73 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e  is to the beginn
29350 69 6e 67 20 6f 66 0a 2a 2a 20 74 68 65 20 6b 65  ing of.** the ke
29360 79 20 69 66 20 69 6e 64 65 78 20 62 74 72 65 65  y if index btree
29370 73 20 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  s (pPage->intKey
29380 3d 3d 30 29 20 61 6e 64 20 69 73 20 74 68 65 20  ==0) and is the 
29390 64 61 74 61 20 66 6f 72 0a 2a 2a 20 74 61 62 6c  data for.** tabl
293a0 65 20 62 74 72 65 65 73 20 28 70 50 61 67 65 2d  e btrees (pPage-
293b0 3e 69 6e 74 4b 65 79 3d 3d 31 29 2e 20 54 68 65  >intKey==1). The
293c0 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
293d0 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a   of available.**
293e0 20 6b 65 79 2f 64 61 74 61 20 69 73 20 77 72 69   key/data is wri
293f0 74 74 65 6e 20 69 6e 74 6f 20 2a 70 41 6d 74 2e  tten into *pAmt.
29400 20 20 49 66 20 2a 70 41 6d 74 3d 3d 30 2c 20 74    If *pAmt==0, t
29410 68 65 6e 20 74 68 65 20 76 61 6c 75 65 0a 2a 2a  hen the value.**
29420 20 72 65 74 75 72 6e 65 64 20 77 69 6c 6c 20 6e   returned will n
29430 6f 74 20 62 65 20 61 20 76 61 6c 69 64 20 70 6f  ot be a valid po
29440 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  inter..**.** Thi
29450 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 6e 20  s routine is an 
29460 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 49  optimization.  I
29470 74 20 69 73 20 63 6f 6d 6d 6f 6e 20 66 6f 72 20  t is common for 
29480 74 68 65 20 65 6e 74 69 72 65 20 6b 65 79 0a 2a  the entire key.*
29490 2a 20 61 6e 64 20 64 61 74 61 20 74 6f 20 66 69  * and data to fi
294a0 74 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70  t on the local p
294b0 61 67 65 20 61 6e 64 20 66 6f 72 20 74 68 65 72  age and for ther
294c0 65 20 74 6f 20 62 65 20 6e 6f 20 6f 76 65 72 66  e to be no overf
294d0 6c 6f 77 0a 2a 2a 20 70 61 67 65 73 2e 20 20 57  low.** pages.  W
294e0 68 65 6e 20 74 68 61 74 20 69 73 20 73 6f 2c 20  hen that is so, 
294f0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e  this routine can
29500 20 62 65 20 75 73 65 64 20 74 6f 20 61 63 63 65   be used to acce
29510 73 73 20 74 68 65 0a 2a 2a 20 6b 65 79 20 61 6e  ss the.** key an
29520 64 20 64 61 74 61 20 77 69 74 68 6f 75 74 20 6d  d data without m
29530 61 6b 69 6e 67 20 61 20 63 6f 70 79 2e 20 20 49  aking a copy.  I
29540 66 20 74 68 65 20 6b 65 79 20 61 6e 64 2f 6f 72  f the key and/or
29550 20 64 61 74 61 20 73 70 69 6c 6c 73 0a 2a 2a 20   data spills.** 
29560 6f 6e 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61  onto overflow pa
29570 67 65 73 2c 20 74 68 65 6e 20 61 63 63 65 73 73  ges, then access
29580 50 61 79 6c 6f 61 64 28 29 20 6d 75 73 74 20 62  Payload() must b
29590 65 20 75 73 65 64 20 74 6f 20 72 65 61 73 73 65  e used to reasse
295a0 6d 62 6c 65 0a 2a 2a 20 74 68 65 20 6b 65 79 2f  mble.** the key/
295b0 64 61 74 61 20 61 6e 64 20 63 6f 70 79 20 69 74  data and copy it
295c0 20 69 6e 74 6f 20 61 20 70 72 65 61 6c 6c 6f 63   into a prealloc
295d0 61 74 65 64 20 62 75 66 66 65 72 2e 0a 2a 2a 0a  ated buffer..**.
295e0 2a 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 72  ** The pointer r
295f0 65 74 75 72 6e 65 64 20 62 79 20 74 68 69 73 20  eturned by this 
29600 72 6f 75 74 69 6e 65 20 6c 6f 6f 6b 73 20 64 69  routine looks di
29610 72 65 63 74 6c 79 20 69 6e 74 6f 20 74 68 65 20  rectly into the 
29620 63 61 63 68 65 64 0a 2a 2a 20 70 61 67 65 20 6f  cached.** page o
29630 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  f the database. 
29640 20 54 68 65 20 64 61 74 61 20 6d 69 67 68 74 20   The data might 
29650 63 68 61 6e 67 65 20 6f 72 20 6d 6f 76 65 20 74  change or move t
29660 68 65 20 6e 65 78 74 20 74 69 6d 65 0a 2a 2a 20  he next time.** 
29670 61 6e 79 20 62 74 72 65 65 20 72 6f 75 74 69 6e  any btree routin
29680 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a  e is called..*/.
29690 73 74 61 74 69 63 20 63 6f 6e 73 74 20 76 6f 69  static const voi
296a0 64 20 2a 66 65 74 63 68 50 61 79 6c 6f 61 64 28  d *fetchPayload(
296b0 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
296c0 72 2c 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f  r,      /* Curso
296d0 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 65 6e  r pointing to en
296e0 74 72 79 20 74 6f 20 72 65 61 64 20 66 72 6f 6d  try to read from
296f0 20 2a 2f 0a 20 20 75 33 32 20 2a 70 41 6d 74 20   */.  u32 *pAmt 
29700 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
29710 69 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ite the number o
29720 66 20 61 76 61 69 6c 61 62 6c 65 20 62 79 74 65  f available byte
29730 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69  s here */.){.  i
29740 6e 74 20 61 6d 74 3b 0a 20 20 61 73 73 65 72 74  nt amt;.  assert
29750 28 20 70 43 75 72 21 3d 30 20 26 26 20 70 43 75  ( pCur!=0 && pCu
29760 72 2d 3e 69 50 61 67 65 3e 3d 30 20 26 26 20 70  r->iPage>=0 && p
29770 43 75 72 2d 3e 70 50 61 67 65 29 3b 0a 20 20 61  Cur->pPage);.  a
29780 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
29790 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
297a0 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  D );.  assert( s
297b0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
297c0 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e  d(pCur->pBtree->
297d0 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
297e0 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77  assert( cursorOw
297f0 6e 73 42 74 53 68 61 72 65 64 28 70 43 75 72 29  nsBtShared(pCur)
29800 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
29810 75 72 2d 3e 69 78 3c 70 43 75 72 2d 3e 70 50 61  ur->ix<pCur->pPa
29820 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61  ge->nCell );.  a
29830 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 6e 66  ssert( pCur->inf
29840 6f 2e 6e 53 69 7a 65 3e 30 20 29 3b 0a 20 20 61  o.nSize>0 );.  a
29850 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 6e 66  ssert( pCur->inf
29860 6f 2e 70 50 61 79 6c 6f 61 64 3e 70 43 75 72 2d  o.pPayload>pCur-
29870 3e 70 50 61 67 65 2d 3e 61 44 61 74 61 20 7c 7c  >pPage->aData ||
29880 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20   CORRUPT_DB );. 
29890 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
298a0 6e 66 6f 2e 70 50 61 79 6c 6f 61 64 3c 70 43 75  nfo.pPayload<pCu
298b0 72 2d 3e 70 50 61 67 65 2d 3e 61 44 61 74 61 45  r->pPage->aDataE
298c0 6e 64 20 7c 7c 43 4f 52 52 55 50 54 5f 44 42 29  nd ||CORRUPT_DB)
298d0 3b 0a 20 20 61 6d 74 20 3d 20 70 43 75 72 2d 3e  ;.  amt = pCur->
298e0 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 69  info.nLocal;.  i
298f0 66 28 20 61 6d 74 3e 28 69 6e 74 29 28 70 43 75  f( amt>(int)(pCu
29900 72 2d 3e 70 50 61 67 65 2d 3e 61 44 61 74 61 45  r->pPage->aDataE
29910 6e 64 20 2d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  nd - pCur->info.
29920 70 50 61 79 6c 6f 61 64 29 20 29 7b 0a 20 20 20  pPayload) ){.   
29930 20 2f 2a 20 54 68 65 72 65 20 69 73 20 74 6f 6f   /* There is too
29940 20 6c 69 74 74 6c 65 20 73 70 61 63 65 20 6f 6e   little space on
29950 20 74 68 65 20 70 61 67 65 20 66 6f 72 20 74 68   the page for th
29960 65 20 65 78 70 65 63 74 65 64 20 61 6d 6f 75 6e  e expected amoun
29970 74 0a 20 20 20 20 2a 2a 20 6f 66 20 6c 6f 63 61  t.    ** of loca
29980 6c 20 63 6f 6e 74 65 6e 74 2e 20 44 61 74 61 62  l content. Datab
29990 61 73 65 20 6d 75 73 74 20 62 65 20 63 6f 72 72  ase must be corr
299a0 75 70 74 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65  upt. */.    asse
299b0 72 74 28 20 43 4f 52 52 55 50 54 5f 44 42 20 29  rt( CORRUPT_DB )
299c0 3b 0a 20 20 20 20 61 6d 74 20 3d 20 4d 41 58 28  ;.    amt = MAX(
299d0 30 2c 20 28 69 6e 74 29 28 70 43 75 72 2d 3e 70  0, (int)(pCur->p
299e0 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 2d  Page->aDataEnd -
299f0 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 50 61 79   pCur->info.pPay
29a00 6c 6f 61 64 29 29 3b 0a 20 20 7d 0a 20 20 2a 70  load));.  }.  *p
29a10 41 6d 74 20 3d 20 28 75 33 32 29 61 6d 74 3b 0a  Amt = (u32)amt;.
29a20 20 20 72 65 74 75 72 6e 20 28 76 6f 69 64 2a 29    return (void*)
29a30 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c  pCur->info.pPayl
29a40 6f 61 64 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 46  oad;.}.../*.** F
29a50 6f 72 20 74 68 65 20 65 6e 74 72 79 20 74 68 61  or the entry tha
29a60 74 20 63 75 72 73 6f 72 20 70 43 75 72 20 69 73  t cursor pCur is
29a70 20 70 6f 69 6e 74 20 74 6f 2c 20 72 65 74 75 72   point to, retur
29a80 6e 20 61 73 0a 2a 2a 20 6d 61 6e 79 20 62 79 74  n as.** many byt
29a90 65 73 20 6f 66 20 74 68 65 20 6b 65 79 20 6f 72  es of the key or
29aa0 20 64 61 74 61 20 61 73 20 61 72 65 20 61 76 61   data as are ava
29ab0 69 6c 61 62 6c 65 20 6f 6e 20 74 68 65 20 6c 6f  ilable on the lo
29ac0 63 61 6c 0a 2a 2a 20 62 2d 74 72 65 65 20 70 61  cal.** b-tree pa
29ad0 67 65 2e 20 20 57 72 69 74 65 20 74 68 65 20 6e  ge.  Write the n
29ae0 75 6d 62 65 72 20 6f 66 20 61 76 61 69 6c 61 62  umber of availab
29af0 6c 65 20 62 79 74 65 73 20 69 6e 74 6f 20 2a 70  le bytes into *p
29b00 41 6d 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  Amt..**.** The p
29b10 6f 69 6e 74 65 72 20 72 65 74 75 72 6e 65 64 20  ointer returned 
29b20 69 73 20 65 70 68 65 6d 65 72 61 6c 2e 20 20 54  is ephemeral.  T
29b30 68 65 20 6b 65 79 2f 64 61 74 61 20 6d 61 79 20  he key/data may 
29b40 6d 6f 76 65 0a 2a 2a 20 6f 72 20 62 65 20 64 65  move.** or be de
29b50 73 74 72 6f 79 65 64 20 6f 6e 20 74 68 65 20 6e  stroyed on the n
29b60 65 78 74 20 63 61 6c 6c 20 74 6f 20 61 6e 79 20  ext call to any 
29b70 42 74 72 65 65 20 72 6f 75 74 69 6e 65 2c 0a 2a  Btree routine,.*
29b80 2a 20 69 6e 63 6c 75 64 69 6e 67 20 63 61 6c 6c  * including call
29b90 73 20 66 72 6f 6d 20 6f 74 68 65 72 20 74 68 72  s from other thr
29ba0 65 61 64 73 20 61 67 61 69 6e 73 74 20 74 68 65  eads against the
29bb0 20 73 61 6d 65 20 63 61 63 68 65 2e 0a 2a 2a 20   same cache..** 
29bc0 48 65 6e 63 65 2c 20 61 20 6d 75 74 65 78 20 6f  Hence, a mutex o
29bd0 6e 20 74 68 65 20 42 74 53 68 61 72 65 64 20 73  n the BtShared s
29be0 68 6f 75 6c 64 20 62 65 20 68 65 6c 64 20 70 72  hould be held pr
29bf0 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67 0a 2a  ior to calling.*
29c00 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a  * this routine..
29c10 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 72 6f 75 74  **.** These rout
29c20 69 6e 65 73 20 69 73 20 75 73 65 64 20 74 6f 20  ines is used to 
29c30 67 65 74 20 71 75 69 63 6b 20 61 63 63 65 73 73  get quick access
29c40 20 74 6f 20 6b 65 79 20 61 6e 64 20 64 61 74 61   to key and data
29c50 0a 2a 2a 20 69 6e 20 74 68 65 20 63 6f 6d 6d 6f  .** in the commo
29c60 6e 20 63 61 73 65 20 77 68 65 72 65 20 6e 6f 20  n case where no 
29c70 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61  overflow pages a
29c80 72 65 20 75 73 65 64 2e 0a 2a 2f 0a 63 6f 6e 73  re used..*/.cons
29c90 74 20 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 42  t void *sqlite3B
29ca0 74 72 65 65 50 61 79 6c 6f 61 64 46 65 74 63 68  treePayloadFetch
29cb0 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
29cc0 20 75 33 32 20 2a 70 41 6d 74 29 7b 0a 20 20 72   u32 *pAmt){.  r
29cd0 65 74 75 72 6e 20 66 65 74 63 68 50 61 79 6c 6f  eturn fetchPaylo
29ce0 61 64 28 70 43 75 72 2c 20 70 41 6d 74 29 3b 0a  ad(pCur, pAmt);.
29cf0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74  }.../*.** Move t
29d00 68 65 20 63 75 72 73 6f 72 20 64 6f 77 6e 20 74  he cursor down t
29d10 6f 20 61 20 6e 65 77 20 63 68 69 6c 64 20 70 61  o a new child pa
29d20 67 65 2e 20 20 54 68 65 20 6e 65 77 50 67 6e 6f  ge.  The newPgno
29d30 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65   argument is the
29d40 0a 2a 2a 20 70 61 67 65 20 6e 75 6d 62 65 72 20  .** page number 
29d50 6f 66 20 74 68 65 20 63 68 69 6c 64 20 70 61 67  of the child pag
29d60 65 20 74 6f 20 6d 6f 76 65 20 74 6f 2e 0a 2a 2a  e to move to..**
29d70 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
29d80 6e 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45  n returns SQLITE
29d90 5f 43 4f 52 52 55 50 54 20 69 66 20 74 68 65 20  _CORRUPT if the 
29da0 70 61 67 65 2d 68 65 61 64 65 72 20 66 6c 61 67  page-header flag
29db0 73 20 66 69 65 6c 64 20 6f 66 0a 2a 2a 20 74 68  s field of.** th
29dc0 65 20 6e 65 77 20 63 68 69 6c 64 20 70 61 67 65  e new child page
29dd0 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20   does not match 
29de0 74 68 65 20 66 6c 61 67 73 20 66 69 65 6c 64 20  the flags field 
29df0 6f 66 20 74 68 65 20 70 61 72 65 6e 74 20 28 69  of the parent (i
29e00 2e 65 2e 0a 2a 2a 20 69 66 20 61 6e 20 69 6e 74  .e..** if an int
29e10 6b 65 79 20 70 61 67 65 20 61 70 70 65 61 72 73  key page appears
29e20 20 74 6f 20 62 65 20 74 68 65 20 70 61 72 65 6e   to be the paren
29e30 74 20 6f 66 20 61 20 6e 6f 6e 2d 69 6e 74 6b 65  t of a non-intke
29e40 79 20 70 61 67 65 2c 20 6f 72 0a 2a 2a 20 76 69  y page, or.** vi
29e50 63 65 2d 76 65 72 73 61 29 2e 0a 2a 2f 0a 73 74  ce-versa)..*/.st
29e60 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 43  atic int moveToC
29e70 68 69 6c 64 28 42 74 43 75 72 73 6f 72 20 2a 70  hild(BtCursor *p
29e80 43 75 72 2c 20 75 33 32 20 6e 65 77 50 67 6e 6f  Cur, u32 newPgno
29e90 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
29ea0 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b 0a  Bt = pCur->pBt;.
29eb0 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
29ec0 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70 43  rOwnsBtShared(pC
29ed0 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
29ee0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
29ef0 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
29f00 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
29f10 50 61 67 65 3c 42 54 43 55 52 53 4f 52 5f 4d 41  Page<BTCURSOR_MA
29f20 58 5f 44 45 50 54 48 20 29 3b 0a 20 20 61 73 73  X_DEPTH );.  ass
29f30 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65  ert( pCur->iPage
29f40 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 43 75  >=0 );.  if( pCu
29f50 72 2d 3e 69 50 61 67 65 3e 3d 28 42 54 43 55 52  r->iPage>=(BTCUR
29f60 53 4f 52 5f 4d 41 58 5f 44 45 50 54 48 2d 31 29  SOR_MAX_DEPTH-1)
29f70 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
29f80 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
29f90 50 54 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e  PT;.  }.  pCur->
29fa0 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a  info.nSize = 0;.
29fb0 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73    pCur->curFlags
29fc0 20 26 3d 20 7e 28 42 54 43 46 5f 56 61 6c 69 64   &= ~(BTCF_Valid
29fd0 4e 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f  NKey|BTCF_ValidO
29fe0 76 66 6c 29 3b 0a 20 20 70 43 75 72 2d 3e 61 69  vfl);.  pCur->ai
29ff0 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
2a000 20 3d 20 70 43 75 72 2d 3e 69 78 3b 0a 20 20 70   = pCur->ix;.  p
2a010 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
2a020 2d 3e 69 50 61 67 65 5d 20 3d 20 70 43 75 72 2d  ->iPage] = pCur-
2a030 3e 70 50 61 67 65 3b 0a 20 20 70 43 75 72 2d 3e  >pPage;.  pCur->
2a040 69 78 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e  ix = 0;.  pCur->
2a050 69 50 61 67 65 2b 2b 3b 0a 20 20 72 65 74 75 72  iPage++;.  retur
2a060 6e 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65  n getAndInitPage
2a070 28 70 42 74 2c 20 6e 65 77 50 67 6e 6f 2c 20 26  (pBt, newPgno, &
2a080 70 43 75 72 2d 3e 70 50 61 67 65 2c 20 70 43 75  pCur->pPage, pCu
2a090 72 2c 20 70 43 75 72 2d 3e 63 75 72 50 61 67 65  r, pCur->curPage
2a0a0 72 46 6c 61 67 73 29 3b 0a 7d 0a 0a 23 69 66 64  rFlags);.}..#ifd
2a0b0 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
2a0c0 2f 2a 0a 2a 2a 20 50 61 67 65 20 70 50 61 72 65  /*.** Page pPare
2a0d0 6e 74 20 69 73 20 61 6e 20 69 6e 74 65 72 6e 61  nt is an interna
2a0e0 6c 20 28 6e 6f 6e 2d 6c 65 61 66 29 20 74 72 65  l (non-leaf) tre
2a0f0 65 20 70 61 67 65 2e 20 54 68 69 73 20 66 75 6e  e page. This fun
2a100 63 74 69 6f 6e 20 0a 2a 2a 20 61 73 73 65 72 74  ction .** assert
2a110 73 20 74 68 61 74 20 70 61 67 65 20 6e 75 6d 62  s that page numb
2a120 65 72 20 69 43 68 69 6c 64 20 69 73 20 74 68 65  er iChild is the
2a130 20 6c 65 66 74 2d 63 68 69 6c 64 20 69 66 20 74   left-child if t
2a140 68 65 20 69 49 64 78 27 74 68 0a 2a 2a 20 63 65  he iIdx'th.** ce
2a150 6c 6c 20 69 6e 20 70 61 67 65 20 70 50 61 72 65  ll in page pPare
2a160 6e 74 2e 20 4f 72 2c 20 69 66 20 69 49 64 78 20  nt. Or, if iIdx 
2a170 69 73 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20  is equal to the 
2a180 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 0a  total number of.
2a190 2a 2a 20 63 65 6c 6c 73 20 69 6e 20 70 50 61 72  ** cells in pPar
2a1a0 65 6e 74 2c 20 74 68 61 74 20 70 61 67 65 20 6e  ent, that page n
2a1b0 75 6d 62 65 72 20 69 43 68 69 6c 64 20 69 73 20  umber iChild is 
2a1c0 74 68 65 20 72 69 67 68 74 2d 63 68 69 6c 64 20  the right-child 
2a1d0 6f 66 0a 2a 2a 20 74 68 65 20 70 61 67 65 2e 0a  of.** the page..
2a1e0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61  */.static void a
2a1f0 73 73 65 72 74 50 61 72 65 6e 74 49 6e 64 65 78  ssertParentIndex
2a200 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e  (MemPage *pParen
2a210 74 2c 20 69 6e 74 20 69 49 64 78 2c 20 50 67 6e  t, int iIdx, Pgn
2a220 6f 20 69 43 68 69 6c 64 29 7b 0a 20 20 69 66 28  o iChild){.  if(
2a230 20 43 4f 52 52 55 50 54 5f 44 42 20 29 20 72 65   CORRUPT_DB ) re
2a240 74 75 72 6e 3b 20 20 2f 2a 20 54 68 65 20 63 6f  turn;  /* The co
2a250 6e 64 69 74 69 6f 6e 73 20 74 65 73 74 65 64 20  nditions tested 
2a260 62 65 6c 6f 77 20 6d 69 67 68 74 20 6e 6f 74 20  below might not 
2a270 62 65 20 74 72 75 65 0a 20 20 20 20 20 20 20 20  be true.        
2a280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a290 20 20 20 20 2a 2a 20 69 6e 20 61 20 63 6f 72 72      ** in a corr
2a2a0 75 70 74 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  upt database */.
2a2b0 20 20 61 73 73 65 72 74 28 20 69 49 64 78 3c 3d    assert( iIdx<=
2a2c0 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29  pParent->nCell )
2a2d0 3b 0a 20 20 69 66 28 20 69 49 64 78 3d 3d 70 50  ;.  if( iIdx==pP
2a2e0 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a  arent->nCell ){.
2a2f0 20 20 20 20 61 73 73 65 72 74 28 20 67 65 74 34      assert( get4
2a300 62 79 74 65 28 26 70 50 61 72 65 6e 74 2d 3e 61  byte(&pParent->a
2a310 44 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64  Data[pParent->hd
2a320 72 4f 66 66 73 65 74 2b 38 5d 29 3d 3d 69 43 68  rOffset+8])==iCh
2a330 69 6c 64 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ild );.  }else{.
2a340 20 20 20 20 61 73 73 65 72 74 28 20 67 65 74 34      assert( get4
2a350 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50  byte(findCell(pP
2a360 61 72 65 6e 74 2c 20 69 49 64 78 29 29 3d 3d 69  arent, iIdx))==i
2a370 43 68 69 6c 64 20 29 3b 0a 20 20 7d 0a 7d 0a 23  Child );.  }.}.#
2a380 65 6c 73 65 0a 23 20 20 64 65 66 69 6e 65 20 61  else.#  define a
2a390 73 73 65 72 74 50 61 72 65 6e 74 49 6e 64 65 78  ssertParentIndex
2a3a0 28 78 2c 79 2c 7a 29 20 0a 23 65 6e 64 69 66 0a  (x,y,z) .#endif.
2a3b0 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20  ./*.** Move the 
2a3c0 63 75 72 73 6f 72 20 75 70 20 74 6f 20 74 68 65  cursor up to the
2a3d0 20 70 61 72 65 6e 74 20 70 61 67 65 2e 0a 2a 2a   parent page..**
2a3e0 0a 2a 2a 20 70 43 75 72 2d 3e 69 64 78 20 69 73  .** pCur->idx is
2a3f0 20 73 65 74 20 74 6f 20 74 68 65 20 63 65 6c 6c   set to the cell
2a400 20 69 6e 64 65 78 20 74 68 61 74 20 63 6f 6e 74   index that cont
2a410 61 69 6e 73 20 74 68 65 20 70 6f 69 6e 74 65 72  ains the pointer
2a420 0a 2a 2a 20 74 6f 20 74 68 65 20 70 61 67 65 20  .** to the page 
2a430 77 65 20 61 72 65 20 63 6f 6d 69 6e 67 20 66 72  we are coming fr
2a440 6f 6d 2e 20 20 49 66 20 77 65 20 61 72 65 20 63  om.  If we are c
2a450 6f 6d 69 6e 67 20 66 72 6f 6d 20 74 68 65 0a 2a  oming from the.*
2a460 2a 20 72 69 67 68 74 2d 6d 6f 73 74 20 63 68 69  * right-most chi
2a470 6c 64 20 70 61 67 65 20 74 68 65 6e 20 70 43 75  ld page then pCu
2a480 72 2d 3e 69 64 78 20 69 73 20 73 65 74 20 74 6f  r->idx is set to
2a490 20 6f 6e 65 20 6d 6f 72 65 20 74 68 61 6e 0a 2a   one more than.*
2a4a0 2a 20 74 68 65 20 6c 61 72 67 65 73 74 20 63 65  * the largest ce
2a4b0 6c 6c 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61  ll index..*/.sta
2a4c0 74 69 63 20 76 6f 69 64 20 6d 6f 76 65 54 6f 50  tic void moveToP
2a4d0 61 72 65 6e 74 28 42 74 43 75 72 73 6f 72 20 2a  arent(BtCursor *
2a4e0 70 43 75 72 29 7b 0a 20 20 4d 65 6d 50 61 67 65  pCur){.  MemPage
2a4f0 20 2a 70 4c 65 61 66 3b 0a 20 20 61 73 73 65 72   *pLeaf;.  asser
2a500 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53  t( cursorOwnsBtS
2a510 68 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20  hared(pCur) );. 
2a520 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
2a530 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
2a540 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28  LID );.  assert(
2a550 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 30 20 29   pCur->iPage>0 )
2a560 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
2a570 2d 3e 70 50 61 67 65 20 29 3b 0a 20 20 61 73 73  ->pPage );.  ass
2a580 65 72 74 50 61 72 65 6e 74 49 6e 64 65 78 28 0a  ertParentIndex(.
2a590 20 20 20 20 70 43 75 72 2d 3e 61 70 50 61 67 65      pCur->apPage
2a5a0 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d 2c  [pCur->iPage-1],
2a5b0 20 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64   .    pCur->aiId
2a5c0 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d  x[pCur->iPage-1]
2a5d0 2c 20 0a 20 20 20 20 70 43 75 72 2d 3e 70 50 61  , .    pCur->pPa
2a5e0 67 65 2d 3e 70 67 6e 6f 0a 20 20 29 3b 0a 20 20  ge->pgno.  );.  
2a5f0 74 65 73 74 63 61 73 65 28 20 70 43 75 72 2d 3e  testcase( pCur->
2a600 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
2a610 65 2d 31 5d 20 3e 20 70 43 75 72 2d 3e 61 70 50  e-1] > pCur->apP
2a620 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d  age[pCur->iPage-
2a630 31 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 70  1]->nCell );.  p
2a640 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20  Cur->info.nSize 
2a650 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72  = 0;.  pCur->cur
2a660 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 43 46 5f  Flags &= ~(BTCF_
2a670 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56  ValidNKey|BTCF_V
2a680 61 6c 69 64 4f 76 66 6c 29 3b 0a 20 20 70 43 75  alidOvfl);.  pCu
2a690 72 2d 3e 69 78 20 3d 20 70 43 75 72 2d 3e 61 69  r->ix = pCur->ai
2a6a0 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d  Idx[pCur->iPage-
2a6b0 31 5d 3b 0a 20 20 70 4c 65 61 66 20 3d 20 70 43  1];.  pLeaf = pC
2a6c0 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 70 43 75  ur->pPage;.  pCu
2a6d0 72 2d 3e 70 50 61 67 65 20 3d 20 70 43 75 72 2d  r->pPage = pCur-
2a6e0 3e 61 70 50 61 67 65 5b 2d 2d 70 43 75 72 2d 3e  >apPage[--pCur->
2a6f0 69 50 61 67 65 5d 3b 0a 20 20 72 65 6c 65 61 73  iPage];.  releas
2a700 65 50 61 67 65 4e 6f 74 4e 75 6c 6c 28 70 4c 65  ePageNotNull(pLe
2a710 61 66 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f  af);.}../*.** Mo
2a720 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f  ve the cursor to
2a730 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 72 6f   point to the ro
2a740 6f 74 20 70 61 67 65 20 6f 66 20 69 74 73 20 62  ot page of its b
2a750 2d 74 72 65 65 20 73 74 72 75 63 74 75 72 65 2e  -tree structure.
2a760 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 74 61  .**.** If the ta
2a770 62 6c 65 20 68 61 73 20 61 20 76 69 72 74 75 61  ble has a virtua
2a780 6c 20 72 6f 6f 74 20 70 61 67 65 2c 20 74 68 65  l root page, the
2a790 6e 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  n the cursor is 
2a7a0 6d 6f 76 65 64 20 74 6f 20 70 6f 69 6e 74 0a 2a  moved to point.*
2a7b0 2a 20 74 6f 20 74 68 65 20 76 69 72 74 75 61 6c  * to the virtual
2a7c0 20 72 6f 6f 74 20 70 61 67 65 20 69 6e 73 74 65   root page inste
2a7d0 61 64 20 6f 66 20 74 68 65 20 61 63 74 75 61 6c  ad of the actual
2a7e0 20 72 6f 6f 74 20 70 61 67 65 2e 20 41 20 74 61   root page. A ta
2a7f0 62 6c 65 20 68 61 73 20 61 0a 2a 2a 20 76 69 72  ble has a.** vir
2a800 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 20 77  tual root page w
2a810 68 65 6e 20 74 68 65 20 61 63 74 75 61 6c 20 72  hen the actual r
2a820 6f 6f 74 20 70 61 67 65 20 63 6f 6e 74 61 69 6e  oot page contain
2a830 73 20 6e 6f 20 63 65 6c 6c 73 20 61 6e 64 20 61  s no cells and a
2a840 20 0a 2a 2a 20 73 69 6e 67 6c 65 20 63 68 69 6c   .** single chil
2a850 64 20 70 61 67 65 2e 20 54 68 69 73 20 63 61 6e  d page. This can
2a860 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 77 69 74   only happen wit
2a870 68 20 74 68 65 20 74 61 62 6c 65 20 72 6f 6f 74  h the table root
2a880 65 64 20 61 74 20 70 61 67 65 20 31 2e 0a 2a 2a  ed at page 1..**
2a890 0a 2a 2a 20 49 66 20 74 68 65 20 62 2d 74 72 65  .** If the b-tre
2a8a0 65 20 73 74 72 75 63 74 75 72 65 20 69 73 20 65  e structure is e
2a8b0 6d 70 74 79 2c 20 74 68 65 20 63 75 72 73 6f 72  mpty, the cursor
2a8c0 20 73 74 61 74 65 20 69 73 20 73 65 74 20 74 6f   state is set to
2a8d0 20 0a 2a 2a 20 43 55 52 53 4f 52 5f 49 4e 56 41   .** CURSOR_INVA
2a8e0 4c 49 44 20 61 6e 64 20 74 68 69 73 20 72 6f 75  LID and this rou
2a8f0 74 69 6e 65 20 72 65 74 75 72 6e 73 20 53 51 4c  tine returns SQL
2a900 49 54 45 5f 45 4d 50 54 59 2e 20 4f 74 68 65 72  ITE_EMPTY. Other
2a910 77 69 73 65 2c 0a 2a 2a 20 74 68 65 20 63 75 72  wise,.** the cur
2a920 73 6f 72 20 69 73 20 73 65 74 20 74 6f 20 70 6f  sor is set to po
2a930 69 6e 74 20 74 6f 20 74 68 65 20 66 69 72 73 74  int to the first
2a940 20 63 65 6c 6c 20 6c 6f 63 61 74 65 64 20 6f 6e   cell located on
2a950 20 74 68 65 20 72 6f 6f 74 0a 2a 2a 20 28 6f 72   the root.** (or
2a960 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 29 20 70   virtual root) p
2a970 61 67 65 20 61 6e 64 20 74 68 65 20 63 75 72 73  age and the curs
2a980 6f 72 20 73 74 61 74 65 20 69 73 20 73 65 74 20  or state is set 
2a990 74 6f 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 2e  to CURSOR_VALID.
2a9a0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 66  .**.** If this f
2a9b0 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
2a9c0 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 69 74  successfully, it
2a9d0 20 6d 61 79 20 62 65 20 61 73 73 75 6d 65 64 20   may be assumed 
2a9e0 74 68 61 74 20 74 68 65 0a 2a 2a 20 70 61 67 65  that the.** page
2a9f0 2d 68 65 61 64 65 72 20 66 6c 61 67 73 20 69 6e  -header flags in
2aa00 64 69 63 61 74 65 20 74 68 61 74 20 74 68 65 20  dicate that the 
2aa10 5b 76 69 72 74 75 61 6c 5d 20 72 6f 6f 74 2d 70  [virtual] root-p
2aa20 61 67 65 20 69 73 20 74 68 65 20 65 78 70 65 63  age is the expec
2aa30 74 65 64 20 0a 2a 2a 20 6b 69 6e 64 20 6f 66 20  ted .** kind of 
2aa40 62 2d 74 72 65 65 20 70 61 67 65 20 28 69 2e 65  b-tree page (i.e
2aa50 2e 20 69 66 20 77 68 65 6e 20 6f 70 65 6e 69 6e  . if when openin
2aa60 67 20 74 68 65 20 63 75 72 73 6f 72 20 74 68 65  g the cursor the
2aa70 20 63 61 6c 6c 65 72 20 64 69 64 20 6e 6f 74 0a   caller did not.
2aa80 2a 2a 20 73 70 65 63 69 66 79 20 61 20 4b 65 79  ** specify a Key
2aa90 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 74  Info structure t
2aaa0 68 65 20 66 6c 61 67 73 20 62 79 74 65 20 69 73  he flags byte is
2aab0 20 73 65 74 20 74 6f 20 30 78 30 35 20 6f 72 20   set to 0x05 or 
2aac0 30 78 30 44 2c 0a 2a 2a 20 69 6e 64 69 63 61 74  0x0D,.** indicat
2aad0 69 6e 67 20 61 20 74 61 62 6c 65 20 62 2d 74 72  ing a table b-tr
2aae0 65 65 2c 20 6f 72 20 69 66 20 74 68 65 20 63 61  ee, or if the ca
2aaf0 6c 6c 65 72 20 64 69 64 20 73 70 65 63 69 66 79  ller did specify
2ab00 20 61 20 4b 65 79 49 6e 66 6f 20 0a 2a 2a 20 73   a KeyInfo .** s
2ab10 74 72 75 63 74 75 72 65 20 74 68 65 20 66 6c 61  tructure the fla
2ab20 67 73 20 62 79 74 65 20 69 73 20 73 65 74 20 74  gs byte is set t
2ab30 6f 20 30 78 30 32 20 6f 72 20 30 78 30 41 2c 20  o 0x02 or 0x0A, 
2ab40 69 6e 64 69 63 61 74 69 6e 67 20 61 6e 20 69 6e  indicating an in
2ab50 64 65 78 0a 2a 2a 20 62 2d 74 72 65 65 29 2e 0a  dex.** b-tree)..
2ab60 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f  */.static int mo
2ab70 76 65 54 6f 52 6f 6f 74 28 42 74 43 75 72 73 6f  veToRoot(BtCurso
2ab80 72 20 2a 70 43 75 72 29 7b 0a 20 20 4d 65 6d 50  r *pCur){.  MemP
2ab90 61 67 65 20 2a 70 52 6f 6f 74 3b 0a 20 20 69 6e  age *pRoot;.  in
2aba0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
2abb0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ;..  assert( cur
2abc0 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28  sorOwnsBtShared(
2abd0 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
2abe0 74 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  t( CURSOR_INVALI
2abf0 44 20 3c 20 43 55 52 53 4f 52 5f 52 45 51 55 49  D < CURSOR_REQUI
2ac00 52 45 53 45 45 4b 20 29 3b 0a 20 20 61 73 73 65  RESEEK );.  asse
2ac10 72 74 28 20 43 55 52 53 4f 52 5f 56 41 4c 49 44  rt( CURSOR_VALID
2ac20 20 20 20 3c 20 43 55 52 53 4f 52 5f 52 45 51 55     < CURSOR_REQU
2ac30 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 61 73 73  IRESEEK );.  ass
2ac40 65 72 74 28 20 43 55 52 53 4f 52 5f 46 41 55 4c  ert( CURSOR_FAUL
2ac50 54 20 20 20 3e 20 43 55 52 53 4f 52 5f 52 45 51  T   > CURSOR_REQ
2ac60 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 61 73  UIRESEEK );.  as
2ac70 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
2ac80 74 65 20 3c 20 43 55 52 53 4f 52 5f 52 45 51 55  te < CURSOR_REQU
2ac90 49 52 45 53 45 45 4b 20 7c 7c 20 70 43 75 72 2d  IRESEEK || pCur-
2aca0 3e 69 50 61 67 65 3c 30 20 29 3b 0a 20 20 61 73  >iPage<0 );.  as
2acb0 73 65 72 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f  sert( pCur->pgno
2acc0 52 6f 6f 74 3e 30 20 7c 7c 20 70 43 75 72 2d 3e  Root>0 || pCur->
2acd0 69 50 61 67 65 3c 30 20 29 3b 0a 0a 20 20 69 66  iPage<0 );..  if
2ace0 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30  ( pCur->iPage>=0
2acf0 20 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72   ){.    if( pCur
2ad00 2d 3e 69 50 61 67 65 20 29 7b 0a 20 20 20 20 20  ->iPage ){.     
2ad10 20 72 65 6c 65 61 73 65 50 61 67 65 4e 6f 74 4e   releasePageNotN
2ad20 75 6c 6c 28 70 43 75 72 2d 3e 70 50 61 67 65 29  ull(pCur->pPage)
2ad30 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 2d  ;.      while( -
2ad40 2d 70 43 75 72 2d 3e 69 50 61 67 65 20 29 7b 0a  -pCur->iPage ){.
2ad50 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
2ad60 61 67 65 4e 6f 74 4e 75 6c 6c 28 70 43 75 72 2d  ageNotNull(pCur-
2ad70 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
2ad80 61 67 65 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20  age]);.      }. 
2ad90 20 20 20 20 20 70 43 75 72 2d 3e 70 50 61 67 65       pCur->pPage
2ada0 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b   = pCur->apPage[
2adb0 30 5d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73  0];.      goto s
2adc0 6b 69 70 5f 69 6e 69 74 3b 0a 20 20 20 20 7d 0a  kip_init;.    }.
2add0 20 20 7d 65 6c 73 65 20 69 66 28 20 70 43 75 72    }else if( pCur
2ade0 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 29 7b  ->pgnoRoot==0 ){
2adf0 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74  .    pCur->eStat
2ae00 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  e = CURSOR_INVAL
2ae10 49 44 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  ID;.    return S
2ae20 51 4c 49 54 45 5f 45 4d 50 54 59 3b 0a 20 20 7d  QLITE_EMPTY;.  }
2ae30 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
2ae40 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3d 3d 28  ( pCur->iPage==(
2ae50 2d 31 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70  -1) );.    if( p
2ae60 43 75 72 2d 3e 65 53 74 61 74 65 3e 3d 43 55 52  Cur->eState>=CUR
2ae70 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20  SOR_REQUIRESEEK 
2ae80 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 43 75  ){.      if( pCu
2ae90 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
2aea0 52 5f 46 41 55 4c 54 20 29 7b 0a 20 20 20 20 20  R_FAULT ){.     
2aeb0 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
2aec0 3e 73 6b 69 70 4e 65 78 74 21 3d 53 51 4c 49 54  >skipNext!=SQLIT
2aed0 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 20 20  E_OK );.        
2aee0 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 73 6b 69  return pCur->ski
2aef0 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20  pNext;.      }. 
2af00 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
2af10 65 43 6c 65 61 72 43 75 72 73 6f 72 28 70 43 75  eClearCursor(pCu
2af20 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  r);.    }.    rc
2af30 20 3d 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67   = getAndInitPag
2af40 65 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e  e(pCur->pBtree->
2af50 70 42 74 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52  pBt, pCur->pgnoR
2af60 6f 6f 74 2c 20 26 70 43 75 72 2d 3e 70 50 61 67  oot, &pCur->pPag
2af70 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
2af80 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 70 43             0, pC
2af90 75 72 2d 3e 63 75 72 50 61 67 65 72 46 6c 61 67  ur->curPagerFlag
2afa0 73 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  s);.    if( rc!=
2afb0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2afc0 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20     pCur->eState 
2afd0 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  = CURSOR_INVALID
2afe0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
2aff0 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 75  c;.    }.    pCu
2b000 72 2d 3e 69 50 61 67 65 20 3d 20 30 3b 0a 20 20  r->iPage = 0;.  
2b010 20 20 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65    pCur->curIntKe
2b020 79 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 2d  y = pCur->pPage-
2b030 3e 69 6e 74 4b 65 79 3b 0a 20 20 7d 0a 20 20 70  >intKey;.  }.  p
2b040 52 6f 6f 74 20 3d 20 70 43 75 72 2d 3e 70 50 61  Root = pCur->pPa
2b050 67 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70 52  ge;.  assert( pR
2b060 6f 6f 74 2d 3e 70 67 6e 6f 3d 3d 70 43 75 72 2d  oot->pgno==pCur-
2b070 3e 70 67 6e 6f 52 6f 6f 74 20 29 3b 0a 0a 20 20  >pgnoRoot );..  
2b080 2f 2a 20 49 66 20 70 43 75 72 2d 3e 70 4b 65 79  /* If pCur->pKey
2b090 49 6e 66 6f 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  Info is not NULL
2b0a0 2c 20 74 68 65 6e 20 74 68 65 20 63 61 6c 6c 65  , then the calle
2b0b0 72 20 74 68 61 74 20 6f 70 65 6e 65 64 20 74 68  r that opened th
2b0c0 69 73 20 63 75 72 73 6f 72 0a 20 20 2a 2a 20 65  is cursor.  ** e
2b0d0 78 70 65 63 74 65 64 20 74 6f 20 6f 70 65 6e 20  xpected to open 
2b0e0 69 74 20 6f 6e 20 61 6e 20 69 6e 64 65 78 20 62  it on an index b
2b0f0 2d 74 72 65 65 2e 20 4f 74 68 65 72 77 69 73 65  -tree. Otherwise
2b100 2c 20 69 66 20 70 4b 65 79 49 6e 66 6f 20 69 73  , if pKeyInfo is
2b110 0a 20 20 2a 2a 20 4e 55 4c 4c 2c 20 74 68 65 20  .  ** NULL, the 
2b120 63 61 6c 6c 65 72 20 65 78 70 65 63 74 73 20 61  caller expects a
2b130 20 74 61 62 6c 65 20 62 2d 74 72 65 65 2e 20 49   table b-tree. I
2b140 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20 74 68  f this is not th
2b150 65 20 63 61 73 65 2c 0a 20 20 2a 2a 20 72 65 74  e case,.  ** ret
2b160 75 72 6e 20 61 6e 20 53 51 4c 49 54 45 5f 43 4f  urn an SQLITE_CO
2b170 52 52 55 50 54 20 65 72 72 6f 72 2e 20 0a 20 20  RRUPT error. .  
2b180 2a 2a 0a 20 20 2a 2a 20 45 61 72 6c 69 65 72 20  **.  ** Earlier 
2b190 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69  versions of SQLi
2b1a0 74 65 20 61 73 73 75 6d 65 64 20 74 68 61 74 20  te assumed that 
2b1b0 74 68 69 73 20 74 65 73 74 20 63 6f 75 6c 64 20  this test could 
2b1c0 6e 6f 74 20 66 61 69 6c 0a 20 20 2a 2a 20 69 66  not fail.  ** if
2b1d0 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 77   the root page w
2b1e0 61 73 20 61 6c 72 65 61 64 79 20 6c 6f 61 64 65  as already loade
2b1f0 64 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  d when this func
2b200 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64 20  tion was called 
2b210 28 69 2e 65 2e 0a 20 20 2a 2a 20 69 66 20 70 43  (i.e..  ** if pC
2b220 75 72 2d 3e 69 50 61 67 65 3e 3d 30 29 2e 20 42  ur->iPage>=0). B
2b230 75 74 20 74 68 69 73 20 69 73 20 6e 6f 74 20 73  ut this is not s
2b240 6f 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73  o if the databas
2b250 65 20 69 73 20 63 6f 72 72 75 70 74 65 64 20 0a  e is corrupted .
2b260 20 20 2a 2a 20 69 6e 20 73 75 63 68 20 61 20 77    ** in such a w
2b270 61 79 20 74 68 61 74 20 70 61 67 65 20 70 52 6f  ay that page pRo
2b280 6f 74 20 69 73 20 6c 69 6e 6b 65 64 20 69 6e 74  ot is linked int
2b290 6f 20 61 20 73 65 63 6f 6e 64 20 62 2d 74 72 65  o a second b-tre
2b2a0 65 20 74 61 62 6c 65 20 0a 20 20 2a 2a 20 28 6f  e table .  ** (o
2b2b0 72 20 74 68 65 20 66 72 65 65 6c 69 73 74 29 2e  r the freelist).
2b2c0 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
2b2d0 52 6f 6f 74 2d 3e 69 6e 74 4b 65 79 3d 3d 31 20  Root->intKey==1 
2b2e0 7c 7c 20 70 52 6f 6f 74 2d 3e 69 6e 74 4b 65 79  || pRoot->intKey
2b2f0 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 52 6f  ==0 );.  if( pRo
2b300 6f 74 2d 3e 69 73 49 6e 69 74 3d 3d 30 20 7c 7c  ot->isInit==0 ||
2b310 20 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f   (pCur->pKeyInfo
2b320 3d 3d 30 29 21 3d 70 52 6f 6f 74 2d 3e 69 6e 74  ==0)!=pRoot->int
2b330 4b 65 79 20 29 7b 0a 20 20 20 20 72 65 74 75 72  Key ){.    retur
2b340 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
2b350 5f 50 41 47 45 28 70 43 75 72 2d 3e 70 50 61 67  _PAGE(pCur->pPag
2b360 65 29 3b 0a 20 20 7d 0a 0a 73 6b 69 70 5f 69 6e  e);.  }..skip_in
2b370 69 74 3a 20 20 0a 20 20 70 43 75 72 2d 3e 69 78  it:  .  pCur->ix
2b380 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 69 6e   = 0;.  pCur->in
2b390 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20  fo.nSize = 0;.  
2b3a0 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26  pCur->curFlags &
2b3b0 3d 20 7e 28 42 54 43 46 5f 41 74 4c 61 73 74 7c  = ~(BTCF_AtLast|
2b3c0 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42  BTCF_ValidNKey|B
2b3d0 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3b 0a  TCF_ValidOvfl);.
2b3e0 0a 20 20 70 52 6f 6f 74 20 3d 20 70 43 75 72 2d  .  pRoot = pCur-
2b3f0 3e 70 50 61 67 65 3b 0a 20 20 69 66 28 20 70 52  >pPage;.  if( pR
2b400 6f 6f 74 2d 3e 6e 43 65 6c 6c 3e 30 20 29 7b 0a  oot->nCell>0 ){.
2b410 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65      pCur->eState
2b420 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b   = CURSOR_VALID;
2b430 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21 70 52  .  }else if( !pR
2b440 6f 6f 74 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  oot->leaf ){.   
2b450 20 50 67 6e 6f 20 73 75 62 70 61 67 65 3b 0a 20   Pgno subpage;. 
2b460 20 20 20 69 66 28 20 70 52 6f 6f 74 2d 3e 70 67     if( pRoot->pg
2b470 6e 6f 21 3d 31 20 29 20 72 65 74 75 72 6e 20 53  no!=1 ) return S
2b480 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
2b490 50 54 3b 0a 20 20 20 20 73 75 62 70 61 67 65 20  PT;.    subpage 
2b4a0 3d 20 67 65 74 34 62 79 74 65 28 26 70 52 6f 6f  = get4byte(&pRoo
2b4b0 74 2d 3e 61 44 61 74 61 5b 70 52 6f 6f 74 2d 3e  t->aData[pRoot->
2b4c0 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20  hdrOffset+8]);. 
2b4d0 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20     pCur->eState 
2b4e0 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a  = CURSOR_VALID;.
2b4f0 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43      rc = moveToC
2b500 68 69 6c 64 28 70 43 75 72 2c 20 73 75 62 70 61  hild(pCur, subpa
2b510 67 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ge);.  }else{.  
2b520 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
2b530 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b   CURSOR_INVALID;
2b540 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
2b550 5f 45 4d 50 54 59 3b 0a 20 20 7d 0a 20 20 72 65  _EMPTY;.  }.  re
2b560 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
2b570 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f  * Move the curso
2b580 72 20 64 6f 77 6e 20 74 6f 20 74 68 65 20 6c 65  r down to the le
2b590 66 74 2d 6d 6f 73 74 20 6c 65 61 66 20 65 6e 74  ft-most leaf ent
2b5a0 72 79 20 62 65 6e 65 61 74 68 20 74 68 65 0a 2a  ry beneath the.*
2b5b0 2a 20 65 6e 74 72 79 20 74 6f 20 77 68 69 63 68  * entry to which
2b5c0 20 69 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79   it is currently
2b5d0 20 70 6f 69 6e 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a   pointing..**.**
2b5e0 20 54 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 6c   The left-most l
2b5f0 65 61 66 20 69 73 20 74 68 65 20 6f 6e 65 20 77  eaf is the one w
2b600 69 74 68 20 74 68 65 20 73 6d 61 6c 6c 65 73 74  ith the smallest
2b610 20 6b 65 79 20 2d 20 74 68 65 20 66 69 72 73 74   key - the first
2b620 0a 2a 2a 20 69 6e 20 61 73 63 65 6e 64 69 6e 67  .** in ascending
2b630 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69   order..*/.stati
2b640 63 20 69 6e 74 20 6d 6f 76 65 54 6f 4c 65 66 74  c int moveToLeft
2b650 6d 6f 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70  most(BtCursor *p
2b660 43 75 72 29 7b 0a 20 20 50 67 6e 6f 20 70 67 6e  Cur){.  Pgno pgn
2b670 6f 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  o;.  int rc = SQ
2b680 4c 49 54 45 5f 4f 4b 3b 0a 20 20 4d 65 6d 50 61  LITE_OK;.  MemPa
2b690 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73  ge *pPage;..  as
2b6a0 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73  sert( cursorOwns
2b6b0 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20 29  BtShared(pCur) )
2b6c0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
2b6d0 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
2b6e0 5f 56 41 4c 49 44 20 29 3b 0a 20 20 77 68 69 6c  _VALID );.  whil
2b6f0 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc==SQLITE_OK
2b700 20 26 26 20 21 28 70 50 61 67 65 20 3d 20 70 43   && !(pPage = pC
2b710 75 72 2d 3e 70 50 61 67 65 29 2d 3e 6c 65 61 66  ur->pPage)->leaf
2b720 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
2b730 70 43 75 72 2d 3e 69 78 3c 70 50 61 67 65 2d 3e  pCur->ix<pPage->
2b740 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 70 67 6e  nCell );.    pgn
2b750 6f 20 3d 20 67 65 74 34 62 79 74 65 28 66 69 6e  o = get4byte(fin
2b760 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 75  dCell(pPage, pCu
2b770 72 2d 3e 69 78 29 29 3b 0a 20 20 20 20 72 63 20  r->ix));.    rc 
2b780 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43  = moveToChild(pC
2b790 75 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20  ur, pgno);.  }. 
2b7a0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
2b7b0 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75  *.** Move the cu
2b7c0 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20 74 68 65  rsor down to the
2b7d0 20 72 69 67 68 74 2d 6d 6f 73 74 20 6c 65 61 66   right-most leaf
2b7e0 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74   entry beneath t
2b7f0 68 65 0a 2a 2a 20 70 61 67 65 20 74 6f 20 77 68  he.** page to wh
2b800 69 63 68 20 69 74 20 69 73 20 63 75 72 72 65 6e  ich it is curren
2b810 74 6c 79 20 70 6f 69 6e 74 69 6e 67 2e 20 20 4e  tly pointing.  N
2b820 6f 74 69 63 65 20 74 68 65 20 64 69 66 66 65 72  otice the differ
2b830 65 6e 63 65 0a 2a 2a 20 62 65 74 77 65 65 6e 20  ence.** between 
2b840 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 29  moveToLeftmost()
2b850 20 61 6e 64 20 6d 6f 76 65 54 6f 52 69 67 68 74   and moveToRight
2b860 6d 6f 73 74 28 29 2e 20 20 6d 6f 76 65 54 6f 4c  most().  moveToL
2b870 65 66 74 6d 6f 73 74 28 29 0a 2a 2a 20 66 69 6e  eftmost().** fin
2b880 64 73 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74  ds the left-most
2b890 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74   entry beneath t
2b8a0 68 65 20 2a 65 6e 74 72 79 2a 20 77 68 65 72 65  he *entry* where
2b8b0 61 73 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f  as moveToRightmo
2b8c0 73 74 28 29 0a 2a 2a 20 66 69 6e 64 73 20 74 68  st().** finds th
2b8d0 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74  e right-most ent
2b8e0 72 79 20 62 65 6e 65 61 74 68 20 74 68 65 20 2a  ry beneath the *
2b8f0 70 61 67 65 2a 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  page*..**.** The
2b900 20 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72   right-most entr
2b910 79 20 69 73 20 74 68 65 20 6f 6e 65 20 77 69 74  y is the one wit
2b920 68 20 74 68 65 20 6c 61 72 67 65 73 74 20 6b 65  h the largest ke
2b930 79 20 2d 20 74 68 65 20 6c 61 73 74 0a 2a 2a 20  y - the last.** 
2b940 6b 65 79 20 69 6e 20 61 73 63 65 6e 64 69 6e 67  key in ascending
2b950 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69   order..*/.stati
2b960 63 20 69 6e 74 20 6d 6f 76 65 54 6f 52 69 67 68  c int moveToRigh
2b970 74 6d 6f 73 74 28 42 74 43 75 72 73 6f 72 20 2a  tmost(BtCursor *
2b980 70 43 75 72 29 7b 0a 20 20 50 67 6e 6f 20 70 67  pCur){.  Pgno pg
2b990 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  no;.  int rc = S
2b9a0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 4d 65 6d 50  QLITE_OK;.  MemP
2b9b0 61 67 65 20 2a 70 50 61 67 65 20 3d 20 30 3b 0a  age *pPage = 0;.
2b9c0 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
2b9d0 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70 43  rOwnsBtShared(pC
2b9e0 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
2b9f0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
2ba00 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
2ba10 20 77 68 69 6c 65 28 20 21 28 70 50 61 67 65 20   while( !(pPage 
2ba20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 29 2d 3e  = pCur->pPage)->
2ba30 6c 65 61 66 20 29 7b 0a 20 20 20 20 70 67 6e 6f  leaf ){.    pgno
2ba40 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61   = get4byte(&pPa
2ba50 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d  ge->aData[pPage-
2ba60 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a  >hdrOffset+8]);.
2ba70 20 20 20 20 70 43 75 72 2d 3e 69 78 20 3d 20 70      pCur->ix = p
2ba80 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 20  Page->nCell;.   
2ba90 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c   rc = moveToChil
2baa0 64 28 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a 20  d(pCur, pgno);. 
2bab0 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
2bac0 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 43 75  rn rc;.  }.  pCu
2bad0 72 2d 3e 69 78 20 3d 20 70 50 61 67 65 2d 3e 6e  r->ix = pPage->n
2bae0 43 65 6c 6c 2d 31 3b 0a 20 20 61 73 73 65 72 74  Cell-1;.  assert
2baf0 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69  ( pCur->info.nSi
2bb00 7a 65 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ze==0 );.  asser
2bb10 74 28 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61  t( (pCur->curFla
2bb20 67 73 20 26 20 42 54 43 46 5f 56 61 6c 69 64 4e  gs & BTCF_ValidN
2bb30 4b 65 79 29 3d 3d 30 20 29 3b 0a 20 20 72 65 74  Key)==0 );.  ret
2bb40 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
2bb50 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63 75  ../* Move the cu
2bb60 72 73 6f 72 20 74 6f 20 74 68 65 20 66 69 72 73  rsor to the firs
2bb70 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74  t entry in the t
2bb80 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 53 51  able.  Return SQ
2bb90 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75  LITE_OK.** on su
2bba0 63 63 65 73 73 2e 20 20 53 65 74 20 2a 70 52 65  ccess.  Set *pRe
2bbb0 73 20 74 6f 20 30 20 69 66 20 74 68 65 20 63 75  s to 0 if the cu
2bbc0 72 73 6f 72 20 61 63 74 75 61 6c 6c 79 20 70 6f  rsor actually po
2bbd0 69 6e 74 73 20 74 6f 20 73 6f 6d 65 74 68 69 6e  ints to somethin
2bbe0 67 0a 2a 2a 20 6f 72 20 73 65 74 20 2a 70 52 65  g.** or set *pRe
2bbf0 73 20 74 6f 20 31 20 69 66 20 74 68 65 20 74 61  s to 1 if the ta
2bc00 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f  ble is empty..*/
2bc10 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
2bc20 65 46 69 72 73 74 28 42 74 43 75 72 73 6f 72 20  eFirst(BtCursor 
2bc30 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73  *pCur, int *pRes
2bc40 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  ){.  int rc;..  
2bc50 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77  assert( cursorOw
2bc60 6e 73 42 74 53 68 61 72 65 64 28 70 43 75 72 29  nsBtShared(pCur)
2bc70 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
2bc80 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
2bc90 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64  (pCur->pBtree->d
2bca0 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72  b->mutex) );.  r
2bcb0 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70  c = moveToRoot(p
2bcc0 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  Cur);.  if( rc==
2bcd0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2bce0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70   assert( pCur->p
2bcf0 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b  Page->nCell>0 );
2bd00 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a  .    *pRes = 0;.
2bd10 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 4c      rc = moveToL
2bd20 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20  eftmost(pCur);. 
2bd30 20 7d 65 6c 73 65 20 69 66 28 20 72 63 3d 3d 53   }else if( rc==S
2bd40 51 4c 49 54 45 5f 45 4d 50 54 59 20 29 7b 0a 20  QLITE_EMPTY ){. 
2bd50 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
2bd60 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20  >pgnoRoot==0 || 
2bd70 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65  pCur->pPage->nCe
2bd80 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 2a 70 52  ll==0 );.    *pR
2bd90 65 73 20 3d 20 31 3b 0a 20 20 20 20 72 63 20 3d  es = 1;.    rc =
2bda0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
2bdb0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
2bdc0 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
2bdd0 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69  ion is a no-op i
2bde0 66 20 63 75 72 73 6f 72 20 70 43 75 72 20 64 6f  f cursor pCur do
2bdf0 65 73 20 6e 6f 74 20 70 6f 69 6e 74 20 74 6f 20  es not point to 
2be00 61 20 76 61 6c 69 64 20 72 6f 77 2e 0a 2a 2a 20  a valid row..** 
2be10 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 70 43  Otherwise, if pC
2be20 75 72 20 69 73 20 76 61 6c 69 64 2c 20 63 6f 6e  ur is valid, con
2be30 66 69 67 75 72 65 20 69 74 20 73 6f 20 74 68 61  figure it so tha
2be40 74 20 74 68 65 20 6e 65 78 74 20 63 61 6c 6c 20  t the next call 
2be50 74 6f 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74 72  to.** sqlite3Btr
2be60 65 65 4e 65 78 74 28 29 20 69 73 20 61 20 6e 6f  eeNext() is a no
2be70 2d 6f 70 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  -op..*/.#ifndef 
2be80 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 49 4e 44  SQLITE_OMIT_WIND
2be90 4f 57 46 55 4e 43 0a 76 6f 69 64 20 73 71 6c 69  OWFUNC.void sqli
2bea0 74 65 33 42 74 72 65 65 53 6b 69 70 4e 65 78 74  te3BtreeSkipNext
2beb0 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
2bec0 7b 0a 20 20 2f 2a 20 57 65 20 62 65 6c 69 65 76  {.  /* We believ
2bed0 65 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f  e that the curso
2bee0 72 20 6d 75 73 74 20 61 6c 77 61 79 73 20 62 65  r must always be
2bef0 20 69 6e 20 74 68 65 20 76 61 6c 69 64 20 73 74   in the valid st
2bf00 61 74 65 20 77 68 65 6e 0a 20 20 2a 2a 20 74 68  ate when.  ** th
2bf10 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
2bf20 6c 6c 65 64 2c 20 62 75 74 20 74 68 65 20 70 72  lled, but the pr
2bf30 6f 6f 66 20 69 73 20 64 69 66 66 69 63 75 6c 74  oof is difficult
2bf40 2c 20 73 6f 20 77 65 20 61 64 64 20 61 6e 0a 20  , so we add an. 
2bf50 20 2a 2a 20 41 4c 57 61 59 53 28 29 20 74 65 73   ** ALWaYS() tes
2bf60 74 20 6a 75 73 74 20 69 6e 20 63 61 73 65 20 77  t just in case w
2bf70 65 20 61 72 65 20 77 72 6f 6e 67 2e 20 2a 2f 0a  e are wrong. */.
2bf80 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 43 75    if( ALWAYS(pCu
2bf90 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
2bfa0 52 5f 56 41 4c 49 44 29 20 29 7b 0a 20 20 20 20  R_VALID) ){.    
2bfb0 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
2bfc0 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54 3b 0a  URSOR_SKIPNEXT;.
2bfd0 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65      pCur->skipNe
2bfe0 78 74 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 23 65  xt = 1;.  }.}.#e
2bff0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
2c000 4d 49 54 5f 57 49 4e 44 4f 57 46 55 4e 43 20 2a  MIT_WINDOWFUNC *
2c010 2f 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63  /../* Move the c
2c020 75 72 73 6f 72 20 74 6f 20 74 68 65 20 6c 61 73  ursor to the las
2c030 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74  t entry in the t
2c040 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 53 51  able.  Return SQ
2c050 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75  LITE_OK.** on su
2c060 63 63 65 73 73 2e 20 20 53 65 74 20 2a 70 52 65  ccess.  Set *pRe
2c070 73 20 74 6f 20 30 20 69 66 20 74 68 65 20 63 75  s to 0 if the cu
2c080 72 73 6f 72 20 61 63 74 75 61 6c 6c 79 20 70 6f  rsor actually po
2c090 69 6e 74 73 20 74 6f 20 73 6f 6d 65 74 68 69 6e  ints to somethin
2c0a0 67 0a 2a 2a 20 6f 72 20 73 65 74 20 2a 70 52 65  g.** or set *pRe
2c0b0 73 20 74 6f 20 31 20 69 66 20 74 68 65 20 74 61  s to 1 if the ta
2c0c0 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f  ble is empty..*/
2c0d0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
2c0e0 65 4c 61 73 74 28 42 74 43 75 72 73 6f 72 20 2a  eLast(BtCursor *
2c0f0 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29  pCur, int *pRes)
2c100 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 0a 20 20  {.  int rc;. .  
2c110 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77  assert( cursorOw
2c120 6e 73 42 74 53 68 61 72 65 64 28 70 43 75 72 29  nsBtShared(pCur)
2c130 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
2c140 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
2c150 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64  (pCur->pBtree->d
2c160 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20  b->mutex) );..  
2c170 2f 2a 20 49 66 20 74 68 65 20 63 75 72 73 6f 72  /* If the cursor
2c180 20 61 6c 72 65 61 64 79 20 70 6f 69 6e 74 73 20   already points 
2c190 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72  to the last entr
2c1a0 79 2c 20 74 68 69 73 20 69 73 20 61 20 6e 6f 2d  y, this is a no-
2c1b0 6f 70 2e 20 2a 2f 0a 20 20 69 66 28 20 43 55 52  op. */.  if( CUR
2c1c0 53 4f 52 5f 56 41 4c 49 44 3d 3d 70 43 75 72 2d  SOR_VALID==pCur-
2c1d0 3e 65 53 74 61 74 65 20 26 26 20 28 70 43 75 72  >eState && (pCur
2c1e0 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43  ->curFlags & BTC
2c1f0 46 5f 41 74 4c 61 73 74 29 21 3d 30 20 29 7b 0a  F_AtLast)!=0 ){.
2c200 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
2c210 42 55 47 0a 20 20 20 20 2f 2a 20 54 68 69 73 20  BUG.    /* This 
2c220 62 6c 6f 63 6b 20 73 65 72 76 65 73 20 74 6f 20  block serves to 
2c230 61 73 73 65 72 74 28 29 20 74 68 61 74 20 74 68  assert() that th
2c240 65 20 63 75 72 73 6f 72 20 72 65 61 6c 6c 79 20  e cursor really 
2c250 64 6f 65 73 20 70 6f 69 6e 74 20 0a 20 20 20 20  does point .    
2c260 2a 2a 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65  ** to the last e
2c270 6e 74 72 79 20 69 6e 20 74 68 65 20 62 2d 74 72  ntry in the b-tr
2c280 65 65 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  ee. */.    int i
2c290 69 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b  i;.    for(ii=0;
2c2a0 20 69 69 3c 70 43 75 72 2d 3e 69 50 61 67 65 3b   ii<pCur->iPage;
2c2b0 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73   ii++){.      as
2c2c0 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64  sert( pCur->aiId
2c2d0 78 5b 69 69 5d 3d 3d 70 43 75 72 2d 3e 61 70 50  x[ii]==pCur->apP
2c2e0 61 67 65 5b 69 69 5d 2d 3e 6e 43 65 6c 6c 20 29  age[ii]->nCell )
2c2f0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
2c300 72 74 28 20 70 43 75 72 2d 3e 69 78 3d 3d 70 43  rt( pCur->ix==pC
2c310 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ur->pPage->nCell
2c320 2d 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  -1 );.    assert
2c330 28 20 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6c  ( pCur->pPage->l
2c340 65 61 66 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20  eaf );.#endif.  
2c350 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2c360 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20  OK;.  }..  rc = 
2c370 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29  moveToRoot(pCur)
2c380 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
2c390 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73  TE_OK ){.    ass
2c3a0 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
2c3b0 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
2c3c0 29 3b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 30  );.    *pRes = 0
2c3d0 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54  ;.    rc = moveT
2c3e0 6f 52 69 67 68 74 6d 6f 73 74 28 70 43 75 72 29  oRightmost(pCur)
2c3f0 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
2c400 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2c410 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20   pCur->curFlags 
2c420 7c 3d 20 42 54 43 46 5f 41 74 4c 61 73 74 3b 0a  |= BTCF_AtLast;.
2c430 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2c440 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20   pCur->curFlags 
2c450 26 3d 20 7e 42 54 43 46 5f 41 74 4c 61 73 74 3b  &= ~BTCF_AtLast;
2c460 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69  .    }.  }else i
2c470 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 45 4d  f( rc==SQLITE_EM
2c480 50 54 59 20 29 7b 0a 20 20 20 20 61 73 73 65 72  PTY ){.    asser
2c490 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f  t( pCur->pgnoRoo
2c4a0 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 70 50  t==0 || pCur->pP
2c4b0 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b  age->nCell==0 );
2c4c0 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a  .    *pRes = 1;.
2c4d0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2c4e0 4f 4b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  OK;.  }.  return
2c4f0 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20   rc;.}../* Move 
2c500 74 68 65 20 63 75 72 73 6f 72 20 73 6f 20 74 68  the cursor so th
2c510 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20  at it points to 
2c520 61 6e 20 65 6e 74 72 79 20 6e 65 61 72 20 74 68  an entry near th
2c530 65 20 6b 65 79 20 0a 2a 2a 20 73 70 65 63 69 66  e key .** specif
2c540 69 65 64 20 62 79 20 70 49 64 78 4b 65 79 20 6f  ied by pIdxKey o
2c550 72 20 69 6e 74 4b 65 79 2e 20 20 20 52 65 74 75  r intKey.   Retu
2c560 72 6e 20 61 20 73 75 63 63 65 73 73 20 63 6f 64  rn a success cod
2c570 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 49 4e 54  e..**.** For INT
2c580 4b 45 59 20 74 61 62 6c 65 73 2c 20 74 68 65 20  KEY tables, the 
2c590 69 6e 74 4b 65 79 20 70 61 72 61 6d 65 74 65 72  intKey parameter
2c5a0 20 69 73 20 75 73 65 64 2e 20 20 70 49 64 78 4b   is used.  pIdxK
2c5b0 65 79 20 0a 2a 2a 20 6d 75 73 74 20 62 65 20 4e  ey .** must be N
2c5c0 55 4c 4c 2e 20 20 46 6f 72 20 69 6e 64 65 78 20  ULL.  For index 
2c5d0 74 61 62 6c 65 73 2c 20 70 49 64 78 4b 65 79 20  tables, pIdxKey 
2c5e0 69 73 20 75 73 65 64 20 61 6e 64 20 69 6e 74 4b  is used and intK
2c5f0 65 79 0a 2a 2a 20 69 73 20 69 67 6e 6f 72 65 64  ey.** is ignored
2c600 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 78  ..**.** If an ex
2c610 61 63 74 20 6d 61 74 63 68 20 69 73 20 6e 6f 74  act match is not
2c620 20 66 6f 75 6e 64 2c 20 74 68 65 6e 20 74 68 65   found, then the
2c630 20 63 75 72 73 6f 72 20 69 73 20 61 6c 77 61 79   cursor is alway
2c640 73 0a 2a 2a 20 6c 65 66 74 20 70 6f 69 6e 74 69  s.** left pointi
2c650 6e 67 20 61 74 20 61 20 6c 65 61 66 20 70 61 67  ng at a leaf pag
2c660 65 20 77 68 69 63 68 20 77 6f 75 6c 64 20 68 6f  e which would ho
2c670 6c 64 20 74 68 65 20 65 6e 74 72 79 20 69 66 20  ld the entry if 
2c680 69 74 0a 2a 2a 20 77 65 72 65 20 70 72 65 73 65  it.** were prese
2c690 6e 74 2e 20 20 54 68 65 20 63 75 72 73 6f 72 20  nt.  The cursor 
2c6a0 6d 69 67 68 74 20 70 6f 69 6e 74 20 74 6f 20 61  might point to a
2c6b0 6e 20 65 6e 74 72 79 20 74 68 61 74 20 63 6f 6d  n entry that com
2c6c0 65 73 0a 2a 2a 20 62 65 66 6f 72 65 20 6f 72 20  es.** before or 
2c6d0 61 66 74 65 72 20 74 68 65 20 6b 65 79 2e 0a 2a  after the key..*
2c6e0 2a 0a 2a 2a 20 41 6e 20 69 6e 74 65 67 65 72 20  *.** An integer 
2c6f0 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  is written into 
2c700 2a 70 52 65 73 20 77 68 69 63 68 20 69 73 20 74  *pRes which is t
2c710 68 65 20 72 65 73 75 6c 74 20 6f 66 0a 2a 2a 20  he result of.** 
2c720 63 6f 6d 70 61 72 69 6e 67 20 74 68 65 20 6b 65  comparing the ke
2c730 79 20 77 69 74 68 20 74 68 65 20 65 6e 74 72 79  y with the entry
2c740 20 74 6f 20 77 68 69 63 68 20 74 68 65 20 63 75   to which the cu
2c750 72 73 6f 72 20 69 73 20 0a 2a 2a 20 70 6f 69 6e  rsor is .** poin
2c760 74 69 6e 67 2e 20 20 54 68 65 20 6d 65 61 6e 69  ting.  The meani
2c770 6e 67 20 6f 66 20 74 68 65 20 69 6e 74 65 67 65  ng of the intege
2c780 72 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 0a 2a  r written into.*
2c790 2a 20 2a 70 52 65 73 20 69 73 20 61 73 20 66 6f  * *pRes is as fo
2c7a0 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  llows:.**.**    
2c7b0 20 2a 70 52 65 73 3c 30 20 20 20 20 20 20 54 68   *pRes<0      Th
2c7c0 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74  e cursor is left
2c7d0 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20   pointing at an 
2c7e0 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20 20 20  entry that.**   
2c7f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
2c800 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 69  s smaller than i
2c810 6e 74 4b 65 79 2f 70 49 64 78 4b 65 79 20 6f 72  ntKey/pIdxKey or
2c820 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 69 73   if the table is
2c830 20 65 6d 70 74 79 0a 2a 2a 20 20 20 20 20 20 20   empty.**       
2c840 20 20 20 20 20 20 20 20 20 20 20 61 6e 64 20 74             and t
2c850 68 65 20 63 75 72 73 6f 72 20 69 73 20 74 68 65  he cursor is the
2c860 72 65 66 6f 72 65 20 6c 65 66 74 20 70 6f 69 6e  refore left poin
2c870 74 20 74 6f 20 6e 6f 74 68 69 6e 67 2e 0a 2a 2a  t to nothing..**
2c880 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73 3d 3d 30  .**     *pRes==0
2c890 20 20 20 20 20 54 68 65 20 63 75 72 73 6f 72 20       The cursor 
2c8a0 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67  is left pointing
2c8b0 20 61 74 20 61 6e 20 65 6e 74 72 79 20 74 68 61   at an entry tha
2c8c0 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  t.**            
2c8d0 20 20 20 20 20 20 65 78 61 63 74 6c 79 20 6d 61        exactly ma
2c8e0 74 63 68 65 73 20 69 6e 74 4b 65 79 2f 70 49 64  tches intKey/pId
2c8f0 78 4b 65 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  xKey..**.**     
2c900 2a 70 52 65 73 3e 30 20 20 20 20 20 20 54 68 65  *pRes>0      The
2c910 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20   cursor is left 
2c920 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65  pointing at an e
2c930 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20 20 20 20  ntry that.**    
2c940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73                is
2c950 20 6c 61 72 67 65 72 20 74 68 61 6e 20 69 6e 74   larger than int
2c960 4b 65 79 2f 70 49 64 78 4b 65 79 2e 0a 2a 2a 0a  Key/pIdxKey..**.
2c970 2a 2a 20 46 6f 72 20 69 6e 64 65 78 20 74 61 62  ** For index tab
2c980 6c 65 73 2c 20 74 68 65 20 70 49 64 78 4b 65 79  les, the pIdxKey
2c990 2d 3e 65 71 53 65 65 6e 20 66 69 65 6c 64 20 69  ->eqSeen field i
2c9a0 73 20 73 65 74 20 74 6f 20 31 20 69 66 20 74 68  s set to 1 if th
2c9b0 65 72 65 0a 2a 2a 20 65 78 69 73 74 73 20 61 6e  ere.** exists an
2c9c0 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61   entry in the ta
2c9d0 62 6c 65 20 74 68 61 74 20 65 78 61 63 74 6c 79  ble that exactly
2c9e0 20 6d 61 74 63 68 65 73 20 70 49 64 78 4b 65 79   matches pIdxKey
2c9f0 2e 20 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  .  .*/.int sqlit
2ca00 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70  e3BtreeMovetoUnp
2ca10 61 63 6b 65 64 28 0a 20 20 42 74 43 75 72 73 6f  acked(.  BtCurso
2ca20 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20 20 20  r *pCur,        
2ca30 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20    /* The cursor 
2ca40 74 6f 20 62 65 20 6d 6f 76 65 64 20 2a 2f 0a 20  to be moved */. 
2ca50 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20   UnpackedRecord 
2ca60 2a 70 49 64 78 4b 65 79 2c 20 2f 2a 20 55 6e 70  *pIdxKey, /* Unp
2ca70 61 63 6b 65 64 20 69 6e 64 65 78 20 6b 65 79 20  acked index key 
2ca80 2a 2f 0a 20 20 69 36 34 20 69 6e 74 4b 65 79 2c  */.  i64 intKey,
2ca90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2caa0 20 54 68 65 20 74 61 62 6c 65 20 6b 65 79 20 2a   The table key *
2cab0 2f 0a 20 20 69 6e 74 20 62 69 61 73 52 69 67 68  /.  int biasRigh
2cac0 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t,           /* 
2cad0 49 66 20 74 72 75 65 2c 20 62 69 61 73 20 74 68  If true, bias th
2cae0 65 20 73 65 61 72 63 68 20 74 6f 20 74 68 65 20  e search to the 
2caf0 68 69 67 68 20 65 6e 64 20 2a 2f 0a 20 20 69 6e  high end */.  in
2cb00 74 20 2a 70 52 65 73 20 20 20 20 20 20 20 20 20  t *pRes         
2cb10 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
2cb20 73 65 61 72 63 68 20 72 65 73 75 6c 74 73 20 68  search results h
2cb30 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ere */.){.  int 
2cb40 72 63 3b 0a 20 20 52 65 63 6f 72 64 43 6f 6d 70  rc;.  RecordComp
2cb50 61 72 65 20 78 52 65 63 6f 72 64 43 6f 6d 70 61  are xRecordCompa
2cb60 72 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63  re;..  assert( c
2cb70 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65  ursorOwnsBtShare
2cb80 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  d(pCur) );.  ass
2cb90 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
2cba0 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42  ex_held(pCur->pB
2cbb0 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29  tree->db->mutex)
2cbc0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 52   );.  assert( pR
2cbd0 65 73 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  es );.  assert( 
2cbe0 28 70 49 64 78 4b 65 79 3d 3d 30 29 3d 3d 28 70  (pIdxKey==0)==(p
2cbf0 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d 30  Cur->pKeyInfo==0
2cc00 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
2cc10 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52  Cur->eState!=CUR
2cc20 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 28 70 49  SOR_VALID || (pI
2cc30 64 78 4b 65 79 3d 3d 30 29 3d 3d 28 70 43 75 72  dxKey==0)==(pCur
2cc40 2d 3e 63 75 72 49 6e 74 4b 65 79 21 3d 30 29 20  ->curIntKey!=0) 
2cc50 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
2cc60 63 75 72 73 6f 72 20 69 73 20 61 6c 72 65 61 64  cursor is alread
2cc70 79 20 70 6f 73 69 74 69 6f 6e 65 64 20 61 74 20  y positioned at 
2cc80 74 68 65 20 70 6f 69 6e 74 20 77 65 20 61 72 65  the point we are
2cc90 20 74 72 79 69 6e 67 0a 20 20 2a 2a 20 74 6f 20   trying.  ** to 
2cca0 6d 6f 76 65 20 74 6f 2c 20 74 68 65 6e 20 6a 75  move to, then ju
2ccb0 73 74 20 72 65 74 75 72 6e 20 77 69 74 68 6f 75  st return withou
2ccc0 74 20 64 6f 69 6e 67 20 61 6e 79 20 77 6f 72 6b  t doing any work
2ccd0 20 2a 2f 0a 20 20 69 66 28 20 70 49 64 78 4b 65   */.  if( pIdxKe
2cce0 79 3d 3d 30 0a 20 20 20 26 26 20 70 43 75 72 2d  y==0.   && pCur-
2ccf0 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
2cd00 56 41 4c 49 44 20 26 26 20 28 70 43 75 72 2d 3e  VALID && (pCur->
2cd10 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f  curFlags & BTCF_
2cd20 56 61 6c 69 64 4e 4b 65 79 29 21 3d 30 0a 20 20  ValidNKey)!=0.  
2cd30 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d  ){.    if( pCur-
2cd40 3e 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 69 6e 74 4b  >info.nKey==intK
2cd50 65 79 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 65  ey ){.      *pRe
2cd60 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74  s = 0;.      ret
2cd70 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
2cd80 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 43 75     }.    if( pCu
2cd90 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3c 69 6e 74  r->info.nKey<int
2cda0 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 69 66 28  Key ){.      if(
2cdb0 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73   (pCur->curFlags
2cdc0 20 26 20 42 54 43 46 5f 41 74 4c 61 73 74 29 21   & BTCF_AtLast)!
2cdd0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70  =0 ){.        *p
2cde0 52 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  Res = -1;.      
2cdf0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2ce00 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OK;.      }.    
2ce10 20 20 2f 2a 20 49 66 20 74 68 65 20 72 65 71 75    /* If the requ
2ce20 65 73 74 65 64 20 6b 65 79 20 69 73 20 6f 6e 65  ested key is one
2ce30 20 6d 6f 72 65 20 74 68 61 6e 20 74 68 65 20 70   more than the p
2ce40 72 65 76 69 6f 75 73 20 6b 65 79 2c 20 74 68 65  revious key, the
2ce50 6e 0a 20 20 20 20 20 20 2a 2a 20 74 72 79 20 74  n.      ** try t
2ce60 6f 20 67 65 74 20 74 68 65 72 65 20 75 73 69 6e  o get there usin
2ce70 67 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65  g sqlite3BtreeNe
2ce80 78 74 28 29 20 72 61 74 68 65 72 20 74 68 61 6e  xt() rather than
2ce90 20 61 20 66 75 6c 6c 0a 20 20 20 20 20 20 2a 2a   a full.      **
2cea0 20 62 69 6e 61 72 79 20 73 65 61 72 63 68 2e 20   binary search. 
2ceb0 20 54 68 69 73 20 69 73 20 61 6e 20 6f 70 74 69   This is an opti
2cec0 6d 69 7a 61 74 69 6f 6e 20 6f 6e 6c 79 2e 20 20  mization only.  
2ced0 54 68 65 20 63 6f 72 72 65 63 74 20 61 6e 73 77  The correct answ
2cee0 65 72 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 73  er.      ** is s
2cef0 74 69 6c 6c 20 6f 62 74 61 69 6e 65 64 20 77 69  till obtained wi
2cf00 74 68 6f 75 74 20 74 68 69 73 20 63 61 73 65 2c  thout this case,
2cf10 20 6f 6e 6c 79 20 61 20 6c 69 74 74 6c 65 20 6d   only a little m
2cf20 6f 72 65 20 73 6c 6f 77 65 6c 79 20 2a 2f 0a 20  ore slowely */. 
2cf30 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69       if( pCur->i
2cf40 6e 66 6f 2e 6e 4b 65 79 2b 31 3d 3d 69 6e 74 4b  nfo.nKey+1==intK
2cf50 65 79 20 26 26 20 21 70 43 75 72 2d 3e 73 6b 69  ey && !pCur->ski
2cf60 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20 20  pNext ){.       
2cf70 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20   *pRes = 0;.    
2cf80 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2cf90 42 74 72 65 65 4e 65 78 74 28 70 43 75 72 2c 20  BtreeNext(pCur, 
2cfa0 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0);.        if( 
2cfb0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2cfc0 0a 20 20 20 20 20 20 20 20 20 20 67 65 74 43 65  .          getCe
2cfd0 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20  llInfo(pCur);.  
2cfe0 20 20 20 20 20 20 20 20 69 66 28 20 70 43 75 72          if( pCur
2cff0 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 69 6e 74  ->info.nKey==int
2d000 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Key ){.         
2d010 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2d020 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  _OK;.          }
2d030 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
2d040 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f  f( rc==SQLITE_DO
2d050 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  NE ){.          
2d060 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
2d070 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
2d080 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
2d090 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rc;.        }.  
2d0a0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
2d0b0 0a 20 20 69 66 28 20 70 49 64 78 4b 65 79 20 29  .  if( pIdxKey )
2d0c0 7b 0a 20 20 20 20 78 52 65 63 6f 72 64 43 6f 6d  {.    xRecordCom
2d0d0 70 61 72 65 20 3d 20 73 71 6c 69 74 65 33 56 64  pare = sqlite3Vd
2d0e0 62 65 46 69 6e 64 43 6f 6d 70 61 72 65 28 70 49  beFindCompare(pI
2d0f0 64 78 4b 65 79 29 3b 0a 20 20 20 20 70 49 64 78  dxKey);.    pIdx
2d100 4b 65 79 2d 3e 65 72 72 43 6f 64 65 20 3d 20 30  Key->errCode = 0
2d110 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49  ;.    assert( pI
2d120 64 78 4b 65 79 2d 3e 64 65 66 61 75 6c 74 5f 72  dxKey->default_r
2d130 63 3d 3d 31 20 0a 20 20 20 20 20 20 20 20 20 7c  c==1 .         |
2d140 7c 20 70 49 64 78 4b 65 79 2d 3e 64 65 66 61 75  | pIdxKey->defau
2d150 6c 74 5f 72 63 3d 3d 30 20 0a 20 20 20 20 20 20  lt_rc==0 .      
2d160 20 20 20 7c 7c 20 70 49 64 78 4b 65 79 2d 3e 64     || pIdxKey->d
2d170 65 66 61 75 6c 74 5f 72 63 3d 3d 2d 31 0a 20 20  efault_rc==-1.  
2d180 20 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20    );.  }else{.  
2d190 20 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65    xRecordCompare
2d1a0 20 3d 20 30 3b 20 2f 2a 20 41 6c 6c 20 6b 65 79   = 0; /* All key
2d1b0 73 20 61 72 65 20 69 6e 74 65 67 65 72 73 20 2a  s are integers *
2d1c0 2f 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 6d 6f  /.  }..  rc = mo
2d1d0 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a  veToRoot(pCur);.
2d1e0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
2d1f0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 45  if( rc==SQLITE_E
2d200 4d 50 54 59 20 29 7b 0a 20 20 20 20 20 20 61 73  MPTY ){.      as
2d210 73 65 72 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f  sert( pCur->pgno
2d220 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d  Root==0 || pCur-
2d230 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30  >pPage->nCell==0
2d240 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20   );.      *pRes 
2d250 3d 20 2d 31 3b 0a 20 20 20 20 20 20 72 65 74 75  = -1;.      retu
2d260 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
2d270 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72    }.    return r
2d280 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  c;.  }.  assert(
2d290 20 70 43 75 72 2d 3e 70 50 61 67 65 20 29 3b 0a   pCur->pPage );.
2d2a0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2d2b0 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b  pPage->isInit );
2d2c0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
2d2d0 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
2d2e0 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72  VALID );.  asser
2d2f0 74 28 20 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e  t( pCur->pPage->
2d300 6e 43 65 6c 6c 20 3e 20 30 20 29 3b 0a 20 20 61  nCell > 0 );.  a
2d310 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61  ssert( pCur->iPa
2d320 67 65 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 61  ge==0 || pCur->a
2d330 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79  pPage[0]->intKey
2d340 3d 3d 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65  ==pCur->curIntKe
2d350 79 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  y );.  assert( p
2d360 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79 20 7c  Cur->curIntKey |
2d370 7c 20 70 49 64 78 4b 65 79 20 29 3b 0a 20 20 66  | pIdxKey );.  f
2d380 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 69 6e 74 20  or(;;){.    int 
2d390 6c 77 72 2c 20 75 70 72 2c 20 69 64 78 2c 20 63  lwr, upr, idx, c
2d3a0 3b 0a 20 20 20 20 50 67 6e 6f 20 63 68 6c 64 50  ;.    Pgno chldP
2d3b0 67 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  g;.    MemPage *
2d3c0 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50  pPage = pCur->pP
2d3d0 61 67 65 3b 0a 20 20 20 20 75 38 20 2a 70 43 65  age;.    u8 *pCe
2d3e0 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
2d3f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2d400 50 6f 69 6e 74 65 72 20 74 6f 20 63 75 72 72 65  Pointer to curre
2d410 6e 74 20 63 65 6c 6c 20 69 6e 20 70 50 61 67 65  nt cell in pPage
2d420 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 70 50 61 67   */..    /* pPag
2d430 65 2d 3e 6e 43 65 6c 6c 20 6d 75 73 74 20 62 65  e->nCell must be
2d440 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 7a 65   greater than ze
2d450 72 6f 2e 20 49 66 20 74 68 69 73 20 69 73 20 74  ro. If this is t
2d460 68 65 20 72 6f 6f 74 2d 70 61 67 65 0a 20 20 20  he root-page.   
2d470 20 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 20 77   ** the cursor w
2d480 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20 49  ould have been I
2d490 4e 56 41 4c 49 44 20 61 62 6f 76 65 20 61 6e 64  NVALID above and
2d4a0 20 74 68 69 73 20 66 6f 72 28 3b 3b 29 20 6c 6f   this for(;;) lo
2d4b0 6f 70 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 72 75  op.    ** not ru
2d4c0 6e 2e 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f  n. If this is no
2d4d0 74 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 2c  t the root-page,
2d4e0 20 74 68 65 6e 20 74 68 65 20 6d 6f 76 65 54 6f   then the moveTo
2d4f0 43 68 69 6c 64 28 29 20 72 6f 75 74 69 6e 65 0a  Child() routine.
2d500 20 20 20 20 2a 2a 20 77 6f 75 6c 64 20 68 61 76      ** would hav
2d510 65 20 61 6c 72 65 61 64 79 20 64 65 74 65 63 74  e already detect
2d520 65 64 20 64 62 20 63 6f 72 72 75 70 74 69 6f 6e  ed db corruption
2d530 2e 20 53 69 6d 69 6c 61 72 6c 79 2c 20 70 50 61  . Similarly, pPa
2d540 67 65 20 6d 75 73 74 0a 20 20 20 20 2a 2a 20 62  ge must.    ** b
2d550 65 20 74 68 65 20 72 69 67 68 74 20 6b 69 6e 64  e the right kind
2d560 20 28 69 6e 64 65 78 20 6f 72 20 74 61 62 6c 65   (index or table
2d570 29 20 6f 66 20 62 2d 74 72 65 65 20 70 61 67 65  ) of b-tree page
2d580 2e 20 4f 74 68 65 72 77 69 73 65 0a 20 20 20 20  . Otherwise.    
2d590 2a 2a 20 61 20 6d 6f 76 65 54 6f 43 68 69 6c 64  ** a moveToChild
2d5a0 28 29 20 6f 72 20 6d 6f 76 65 54 6f 52 6f 6f 74  () or moveToRoot
2d5b0 28 29 20 63 61 6c 6c 20 77 6f 75 6c 64 20 68 61  () call would ha
2d5c0 76 65 20 64 65 74 65 63 74 65 64 20 63 6f 72 72  ve detected corr
2d5d0 75 70 74 69 6f 6e 2e 20 20 2a 2f 0a 20 20 20 20  uption.  */.    
2d5e0 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
2d5f0 43 65 6c 6c 3e 30 20 29 3b 0a 20 20 20 20 61 73  Cell>0 );.    as
2d600 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 6e 74  sert( pPage->int
2d610 4b 65 79 3d 3d 28 70 49 64 78 4b 65 79 3d 3d 30  Key==(pIdxKey==0
2d620 29 20 29 3b 0a 20 20 20 20 6c 77 72 20 3d 20 30  ) );.    lwr = 0
2d630 3b 0a 20 20 20 20 75 70 72 20 3d 20 70 50 61 67  ;.    upr = pPag
2d640 65 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a 20 20 20 20  e->nCell-1;.    
2d650 61 73 73 65 72 74 28 20 62 69 61 73 52 69 67 68  assert( biasRigh
2d660 74 3d 3d 30 20 7c 7c 20 62 69 61 73 52 69 67 68  t==0 || biasRigh
2d670 74 3d 3d 31 20 29 3b 0a 20 20 20 20 69 64 78 20  t==1 );.    idx 
2d680 3d 20 75 70 72 3e 3e 28 31 2d 62 69 61 73 52 69  = upr>>(1-biasRi
2d690 67 68 74 29 3b 20 2f 2a 20 69 64 78 20 3d 20 62  ght); /* idx = b
2d6a0 69 61 73 52 69 67 68 74 20 3f 20 75 70 72 20 3a  iasRight ? upr :
2d6b0 20 28 6c 77 72 2b 75 70 72 29 2f 32 3b 20 2a 2f   (lwr+upr)/2; */
2d6c0 0a 20 20 20 20 70 43 75 72 2d 3e 69 78 20 3d 20  .    pCur->ix = 
2d6d0 28 75 31 36 29 69 64 78 3b 0a 20 20 20 20 69 66  (u16)idx;.    if
2d6e0 28 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  ( xRecordCompare
2d6f0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 6f 72  ==0 ){.      for
2d700 28 3b 3b 29 7b 0a 20 20 20 20 20 20 20 20 69 36  (;;){.        i6
2d710 34 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20  4 nCellKey;.    
2d720 20 20 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64      pCell = find
2d730 43 65 6c 6c 50 61 73 74 50 74 72 28 70 50 61 67  CellPastPtr(pPag
2d740 65 2c 20 69 64 78 29 3b 0a 20 20 20 20 20 20 20  e, idx);.       
2d750 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b   if( pPage->intK
2d760 65 79 4c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  eyLeaf ){.      
2d770 20 20 20 20 77 68 69 6c 65 28 20 30 78 38 30 20      while( 0x80 
2d780 3c 3d 20 2a 28 70 43 65 6c 6c 2b 2b 29 20 29 7b  <= *(pCell++) ){
2d790 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
2d7a0 20 70 43 65 6c 6c 3e 3d 70 50 61 67 65 2d 3e 61   pCell>=pPage->a
2d7b0 44 61 74 61 45 6e 64 20 29 7b 0a 20 20 20 20 20  DataEnd ){.     
2d7c0 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
2d7d0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50  SQLITE_CORRUPT_P
2d7e0 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20 20 20  AGE(pPage);.    
2d7f0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2d800 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
2d810 20 20 20 20 20 20 20 20 67 65 74 56 61 72 69 6e          getVarin
2d820 74 28 70 43 65 6c 6c 2c 20 28 75 36 34 2a 29 26  t(pCell, (u64*)&
2d830 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20  nCellKey);.     
2d840 20 20 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3c     if( nCellKey<
2d850 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20  intKey ){.      
2d860 20 20 20 20 6c 77 72 20 3d 20 69 64 78 2b 31 3b      lwr = idx+1;
2d870 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6c  .          if( l
2d880 77 72 3e 75 70 72 20 29 7b 20 63 20 3d 20 2d 31  wr>upr ){ c = -1
2d890 3b 20 62 72 65 61 6b 3b 20 7d 0a 20 20 20 20 20  ; break; }.     
2d8a0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 43 65     }else if( nCe
2d8b0 6c 6c 4b 65 79 3e 69 6e 74 4b 65 79 20 29 7b 0a  llKey>intKey ){.
2d8c0 20 20 20 20 20 20 20 20 20 20 75 70 72 20 3d 20            upr = 
2d8d0 69 64 78 2d 31 3b 0a 20 20 20 20 20 20 20 20 20  idx-1;.         
2d8e0 20 69 66 28 20 6c 77 72 3e 75 70 72 20 29 7b 20   if( lwr>upr ){ 
2d8f0 63 20 3d 20 2b 31 3b 20 62 72 65 61 6b 3b 20 7d  c = +1; break; }
2d900 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
2d910 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
2d920 28 20 6e 43 65 6c 6c 4b 65 79 3d 3d 69 6e 74 4b  ( nCellKey==intK
2d930 65 79 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ey );.          
2d940 70 43 75 72 2d 3e 69 78 20 3d 20 28 75 31 36 29  pCur->ix = (u16)
2d950 69 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20 69  idx;.          i
2d960 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  f( !pPage->leaf 
2d970 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c  ){.            l
2d980 77 72 20 3d 20 69 64 78 3b 0a 20 20 20 20 20 20  wr = idx;.      
2d990 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74        goto movet
2d9a0 6f 5f 6e 65 78 74 5f 6c 61 79 65 72 3b 0a 20 20  o_next_layer;.  
2d9b0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
2d9c0 20 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d             pCur-
2d9d0 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20 42 54 43  >curFlags |= BTC
2d9e0 46 5f 56 61 6c 69 64 4e 4b 65 79 3b 0a 20 20 20  F_ValidNKey;.   
2d9f0 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 69           pCur->i
2da00 6e 66 6f 2e 6e 4b 65 79 20 3d 20 6e 43 65 6c 6c  nfo.nKey = nCell
2da10 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Key;.           
2da20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
2da30 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  e = 0;.         
2da40 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20     *pRes = 0;.  
2da50 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
2da60 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
2da70 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2da80 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  }.        assert
2da90 28 20 6c 77 72 2b 75 70 72 3e 3d 30 20 29 3b 0a  ( lwr+upr>=0 );.
2daa0 20 20 20 20 20 20 20 20 69 64 78 20 3d 20 28 6c          idx = (l
2dab0 77 72 2b 75 70 72 29 3e 3e 31 3b 20 20 2f 2a 20  wr+upr)>>1;  /* 
2dac0 69 64 78 20 3d 20 28 6c 77 72 2b 75 70 72 29 2f  idx = (lwr+upr)/
2dad0 32 3b 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20  2; */.      }.  
2dae0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 66    }else{.      f
2daf0 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 20 20 20 20  or(;;){.        
2db00 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 2f 2a 20 53  int nCell;  /* S
2db10 69 7a 65 20 6f 66 20 74 68 65 20 70 43 65 6c 6c  ize of the pCell
2db20 20 63 65 6c 6c 20 69 6e 20 62 79 74 65 73 20 2a   cell in bytes *
2db30 2f 0a 20 20 20 20 20 20 20 20 70 43 65 6c 6c 20  /.        pCell 
2db40 3d 20 66 69 6e 64 43 65 6c 6c 50 61 73 74 50 74  = findCellPastPt
2db50 72 28 70 50 61 67 65 2c 20 69 64 78 29 3b 0a 0a  r(pPage, idx);..
2db60 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d          /* The m
2db70 61 78 69 6d 75 6d 20 73 75 70 70 6f 72 74 65 64  aximum supported
2db80 20 70 61 67 65 2d 73 69 7a 65 20 69 73 20 36 35   page-size is 65
2db90 35 33 36 20 62 79 74 65 73 2e 20 54 68 69 73 20  536 bytes. This 
2dba0 6d 65 61 6e 73 20 74 68 61 74 0a 20 20 20 20 20  means that.     
2dbb0 20 20 20 2a 2a 20 74 68 65 20 6d 61 78 69 6d 75     ** the maximu
2dbc0 6d 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 63 6f  m number of reco
2dbd0 72 64 20 62 79 74 65 73 20 73 74 6f 72 65 64 20  rd bytes stored 
2dbe0 6f 6e 20 61 6e 20 69 6e 64 65 78 20 42 2d 54 72  on an index B-Tr
2dbf0 65 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61  ee.        ** pa
2dc00 67 65 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  ge is less than 
2dc10 31 36 33 38 34 20 62 79 74 65 73 20 61 6e 64 20  16384 bytes and 
2dc20 6d 61 79 20 62 65 20 73 74 6f 72 65 64 20 61 73  may be stored as
2dc30 20 61 20 32 2d 62 79 74 65 0a 20 20 20 20 20 20   a 2-byte.      
2dc40 20 20 2a 2a 20 76 61 72 69 6e 74 2e 20 54 68 69    ** varint. Thi
2dc50 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73  s information is
2dc60 20 75 73 65 64 20 74 6f 20 61 74 74 65 6d 70 74   used to attempt
2dc70 20 74 6f 20 61 76 6f 69 64 20 70 61 72 73 69 6e   to avoid parsin
2dc80 67 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  g .        ** th
2dc90 65 20 65 6e 74 69 72 65 20 63 65 6c 6c 20 62 79  e entire cell by
2dca0 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 74 68   checking for th
2dcb0 65 20 63 61 73 65 73 20 77 68 65 72 65 20 74 68  e cases where th
2dcc0 65 20 72 65 63 6f 72 64 20 69 73 20 0a 20 20 20  e record is .   
2dcd0 20 20 20 20 20 2a 2a 20 73 74 6f 72 65 64 20 65       ** stored e
2dce0 6e 74 69 72 65 6c 79 20 77 69 74 68 69 6e 20 74  ntirely within t
2dcf0 68 65 20 62 2d 74 72 65 65 20 70 61 67 65 20 62  he b-tree page b
2dd00 79 20 69 6e 73 70 65 63 74 69 6e 67 20 74 68 65  y inspecting the
2dd10 20 66 69 72 73 74 20 0a 20 20 20 20 20 20 20 20   first .        
2dd20 2a 2a 20 32 20 62 79 74 65 73 20 6f 66 20 74 68  ** 2 bytes of th
2dd30 65 20 63 65 6c 6c 2e 0a 20 20 20 20 20 20 20 20  e cell..        
2dd40 2a 2f 0a 20 20 20 20 20 20 20 20 6e 43 65 6c 6c  */.        nCell
2dd50 20 3d 20 70 43 65 6c 6c 5b 30 5d 3b 0a 20 20 20   = pCell[0];.   
2dd60 20 20 20 20 20 69 66 28 20 6e 43 65 6c 6c 3c 3d       if( nCell<=
2dd70 70 50 61 67 65 2d 3e 6d 61 78 31 62 79 74 65 50  pPage->max1byteP
2dd80 61 79 6c 6f 61 64 20 29 7b 0a 20 20 20 20 20 20  ayload ){.      
2dd90 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e      /* This bran
2dda0 63 68 20 72 75 6e 73 20 69 66 20 74 68 65 20 72  ch runs if the r
2ddb0 65 63 6f 72 64 2d 73 69 7a 65 20 66 69 65 6c 64  ecord-size field
2ddc0 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 69 73 20   of the cell is 
2ddd0 61 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73  a.          ** s
2dde0 69 6e 67 6c 65 20 62 79 74 65 20 76 61 72 69 6e  ingle byte varin
2ddf0 74 20 61 6e 64 20 74 68 65 20 72 65 63 6f 72 64  t and the record
2de00 20 66 69 74 73 20 65 6e 74 69 72 65 6c 79 20 6f   fits entirely o
2de10 6e 20 74 68 65 20 6d 61 69 6e 0a 20 20 20 20 20  n the main.     
2de20 20 20 20 20 20 2a 2a 20 62 2d 74 72 65 65 20 70       ** b-tree p
2de30 61 67 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20  age.  */.       
2de40 20 20 20 74 65 73 74 63 61 73 65 28 20 70 43 65     testcase( pCe
2de50 6c 6c 2b 6e 43 65 6c 6c 2b 31 3d 3d 70 50 61 67  ll+nCell+1==pPag
2de60 65 2d 3e 61 44 61 74 61 45 6e 64 20 29 3b 0a 20  e->aDataEnd );. 
2de70 20 20 20 20 20 20 20 20 20 63 20 3d 20 78 52 65           c = xRe
2de80 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43 65 6c  cordCompare(nCel
2de90 6c 2c 20 28 76 6f 69 64 2a 29 26 70 43 65 6c 6c  l, (void*)&pCell
2dea0 5b 31 5d 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20  [1], pIdxKey);. 
2deb0 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
2dec0 20 21 28 70 43 65 6c 6c 5b 31 5d 20 26 20 30 78   !(pCell[1] & 0x
2ded0 38 30 29 20 0a 20 20 20 20 20 20 20 20 20 20 26  80) .          &
2dee0 26 20 28 6e 43 65 6c 6c 20 3d 20 28 28 6e 43 65  & (nCell = ((nCe
2def0 6c 6c 26 30 78 37 66 29 3c 3c 37 29 20 2b 20 70  ll&0x7f)<<7) + p
2df00 43 65 6c 6c 5b 31 5d 29 3c 3d 70 50 61 67 65 2d  Cell[1])<=pPage-
2df10 3e 6d 61 78 4c 6f 63 61 6c 0a 20 20 20 20 20 20  >maxLocal.      
2df20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f    ){.          /
2df30 2a 20 54 68 65 20 72 65 63 6f 72 64 2d 73 69 7a  * The record-siz
2df40 65 20 66 69 65 6c 64 20 69 73 20 61 20 32 20 62  e field is a 2 b
2df50 79 74 65 20 76 61 72 69 6e 74 20 61 6e 64 20 74  yte varint and t
2df60 68 65 20 72 65 63 6f 72 64 20 0a 20 20 20 20 20  he record .     
2df70 20 20 20 20 20 2a 2a 20 66 69 74 73 20 65 6e 74       ** fits ent
2df80 69 72 65 6c 79 20 6f 6e 20 74 68 65 20 6d 61 69  irely on the mai
2df90 6e 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20 20  n b-tree page.  
2dfa0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 74 65 73  */.          tes
2dfb0 74 63 61 73 65 28 20 70 43 65 6c 6c 2b 6e 43 65  tcase( pCell+nCe
2dfc0 6c 6c 2b 32 3d 3d 70 50 61 67 65 2d 3e 61 44 61  ll+2==pPage->aDa
2dfd0 74 61 45 6e 64 20 29 3b 0a 20 20 20 20 20 20 20  taEnd );.       
2dfe0 20 20 20 63 20 3d 20 78 52 65 63 6f 72 64 43 6f     c = xRecordCo
2dff0 6d 70 61 72 65 28 6e 43 65 6c 6c 2c 20 28 76 6f  mpare(nCell, (vo
2e000 69 64 2a 29 26 70 43 65 6c 6c 5b 32 5d 2c 20 70  id*)&pCell[2], p
2e010 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 20 20 20  IdxKey);.       
2e020 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2e030 20 20 2f 2a 20 54 68 65 20 72 65 63 6f 72 64 20    /* The record 
2e040 66 6c 6f 77 73 20 6f 76 65 72 20 6f 6e 74 6f 20  flows over onto 
2e050 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 76 65 72  one or more over
2e060 66 6c 6f 77 20 70 61 67 65 73 2e 20 49 6e 0a 20  flow pages. In. 
2e070 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 69 73           ** this
2e080 20 63 61 73 65 20 74 68 65 20 77 68 6f 6c 65 20   case the whole 
2e090 63 65 6c 6c 20 6e 65 65 64 73 20 74 6f 20 62 65  cell needs to be
2e0a0 20 70 61 72 73 65 64 2c 20 61 20 62 75 66 66 65   parsed, a buffe
2e0b0 72 20 61 6c 6c 6f 63 61 74 65 64 0a 20 20 20 20  r allocated.    
2e0c0 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 61 63 63        ** and acc
2e0d0 65 73 73 50 61 79 6c 6f 61 64 28 29 20 75 73 65  essPayload() use
2e0e0 64 20 74 6f 20 72 65 74 72 69 65 76 65 20 74 68  d to retrieve th
2e0f0 65 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 74 68  e record into th
2e100 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62  e.          ** b
2e110 75 66 66 65 72 20 62 65 66 6f 72 65 20 56 64 62  uffer before Vdb
2e120 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 29  eRecordCompare()
2e130 20 63 61 6e 20 62 65 20 63 61 6c 6c 65 64 2e 20   can be called. 
2e140 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  .          **.  
2e150 20 20 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68          ** If th
2e160 65 20 72 65 63 6f 72 64 20 69 73 20 63 6f 72 72  e record is corr
2e170 75 70 74 2c 20 74 68 65 20 78 52 65 63 6f 72 64  upt, the xRecord
2e180 43 6f 6d 70 61 72 65 20 72 6f 75 74 69 6e 65 20  Compare routine 
2e190 6d 61 79 20 72 65 61 64 0a 20 20 20 20 20 20 20  may read.       
2e1a0 20 20 20 2a 2a 20 75 70 20 74 6f 20 74 77 6f 20     ** up to two 
2e1b0 76 61 72 69 6e 74 73 20 70 61 73 74 20 74 68 65  varints past the
2e1c0 20 65 6e 64 20 6f 66 20 74 68 65 20 62 75 66 66   end of the buff
2e1d0 65 72 2e 20 41 6e 20 65 78 74 72 61 20 31 38 20  er. An extra 18 
2e1e0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 79  .          ** by
2e1f0 74 65 73 20 6f 66 20 70 61 64 64 69 6e 67 20 69  tes of padding i
2e200 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 74 20 74  s allocated at t
2e210 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 62 75  he end of the bu
2e220 66 66 65 72 20 69 6e 0a 20 20 20 20 20 20 20 20  ffer in.        
2e230 20 20 2a 2a 20 63 61 73 65 20 74 68 69 73 20 68    ** case this h
2e240 61 70 70 65 6e 73 2e 20 20 2a 2f 0a 20 20 20 20  appens.  */.    
2e250 20 20 20 20 20 20 76 6f 69 64 20 2a 70 43 65 6c        void *pCel
2e260 6c 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 20 20  lKey;.          
2e270 75 38 20 2a 20 63 6f 6e 73 74 20 70 43 65 6c 6c  u8 * const pCell
2e280 42 6f 64 79 20 3d 20 70 43 65 6c 6c 20 2d 20 70  Body = pCell - p
2e290 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69  Page->childPtrSi
2e2a0 7a 65 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50  ze;.          pP
2e2b0 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28  age->xParseCell(
2e2c0 70 50 61 67 65 2c 20 70 43 65 6c 6c 42 6f 64 79  pPage, pCellBody
2e2d0 2c 20 26 70 43 75 72 2d 3e 69 6e 66 6f 29 3b 0a  , &pCur->info);.
2e2e0 20 20 20 20 20 20 20 20 20 20 6e 43 65 6c 6c 20            nCell 
2e2f0 3d 20 28 69 6e 74 29 70 43 75 72 2d 3e 69 6e 66  = (int)pCur->inf
2e300 6f 2e 6e 4b 65 79 3b 0a 20 20 20 20 20 20 20 20  o.nKey;.        
2e310 20 20 74 65 73 74 63 61 73 65 28 20 6e 43 65 6c    testcase( nCel
2e320 6c 3c 30 20 29 3b 20 20 20 2f 2a 20 54 72 75 65  l<0 );   /* True
2e330 20 69 66 20 6b 65 79 20 73 69 7a 65 20 69 73 20   if key size is 
2e340 32 5e 33 32 20 6f 72 20 6d 6f 72 65 20 2a 2f 0a  2^32 or more */.
2e350 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
2e360 73 65 28 20 6e 43 65 6c 6c 3d 3d 30 20 29 3b 20  se( nCell==0 ); 
2e370 20 2f 2a 20 49 6e 76 61 6c 69 64 20 6b 65 79 20   /* Invalid key 
2e380 73 69 7a 65 3a 20 20 30 78 38 30 20 30 78 38 30  size:  0x80 0x80
2e390 20 30 78 30 30 20 2a 2f 0a 20 20 20 20 20 20 20   0x00 */.       
2e3a0 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 43 65     testcase( nCe
2e3b0 6c 6c 3d 3d 31 20 29 3b 20 20 2f 2a 20 49 6e 76  ll==1 );  /* Inv
2e3c0 61 6c 69 64 20 6b 65 79 20 73 69 7a 65 3a 20 20  alid key size:  
2e3d0 30 78 38 30 20 30 78 38 30 20 30 78 30 31 20 2a  0x80 0x80 0x01 *
2e3e0 2f 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74  /.          test
2e3f0 63 61 73 65 28 20 6e 43 65 6c 6c 3d 3d 32 20 29  case( nCell==2 )
2e400 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 6c 65  ;  /* Minimum le
2e410 67 61 6c 20 69 6e 64 65 78 20 6b 65 79 20 73 69  gal index key si
2e420 7a 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ze */.          
2e430 69 66 28 20 6e 43 65 6c 6c 3c 32 20 29 7b 0a 20  if( nCell<2 ){. 
2e440 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
2e450 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50  SQLITE_CORRUPT_P
2e460 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20 20 20  AGE(pPage);.    
2e470 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76          goto mov
2e480 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20  eto_finish;.    
2e490 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2e4a0 20 20 70 43 65 6c 6c 4b 65 79 20 3d 20 73 71 6c    pCellKey = sql
2e4b0 69 74 65 33 4d 61 6c 6c 6f 63 28 20 6e 43 65 6c  ite3Malloc( nCel
2e4c0 6c 2b 31 38 20 29 3b 0a 20 20 20 20 20 20 20 20  l+18 );.        
2e4d0 20 20 69 66 28 20 70 43 65 6c 6c 4b 65 79 3d 3d    if( pCellKey==
2e4e0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
2e4f0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
2e500 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20  EM_BKPT;.       
2e510 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f       goto moveto
2e520 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 20 20 20  _finish;.       
2e530 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70     }.          p
2e540 43 75 72 2d 3e 69 78 20 3d 20 28 75 31 36 29 69  Cur->ix = (u16)i
2e550 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63  dx;.          rc
2e560 20 3d 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64   = accessPayload
2e570 28 70 43 75 72 2c 20 30 2c 20 6e 43 65 6c 6c 2c  (pCur, 0, nCell,
2e580 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a   (unsigned char*
2e590 29 70 43 65 6c 6c 4b 65 79 2c 20 30 29 3b 0a 20  )pCellKey, 0);. 
2e5a0 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 63           pCur->c
2e5b0 75 72 46 6c 61 67 73 20 26 3d 20 7e 42 54 43 46  urFlags &= ~BTCF
2e5c0 5f 56 61 6c 69 64 4f 76 66 6c 3b 0a 20 20 20 20  _ValidOvfl;.    
2e5d0 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
2e5e0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
2e5f0 74 65 33 5f 66 72 65 65 28 70 43 65 6c 6c 4b 65  te3_free(pCellKe
2e600 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  y);.            
2e610 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69  goto moveto_fini
2e620 73 68 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  sh;.          }.
2e630 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 78 52            c = xR
2e640 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43 65  ecordCompare(nCe
2e650 6c 6c 2c 20 70 43 65 6c 6c 4b 65 79 2c 20 70 49  ll, pCellKey, pI
2e660 64 78 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20  dxKey);.        
2e670 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
2e680 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20  CellKey);.      
2e690 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65    }.        asse
2e6a0 72 74 28 20 0a 20 20 20 20 20 20 20 20 20 20 20  rt( .           
2e6b0 20 28 70 49 64 78 4b 65 79 2d 3e 65 72 72 43 6f   (pIdxKey->errCo
2e6c0 64 65 21 3d 53 51 4c 49 54 45 5f 43 4f 52 52 55  de!=SQLITE_CORRU
2e6d0 50 54 20 7c 7c 20 63 3d 3d 30 29 0a 20 20 20 20  PT || c==0).    
2e6e0 20 20 20 20 20 26 26 20 28 70 49 64 78 4b 65 79       && (pIdxKey
2e6f0 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54  ->errCode!=SQLIT
2e700 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 70 43 75 72 2d  E_NOMEM || pCur-
2e710 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 61 6c  >pBtree->db->mal
2e720 6c 6f 63 46 61 69 6c 65 64 29 0a 20 20 20 20 20  locFailed).     
2e730 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66     );.        if
2e740 28 20 63 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  ( c<0 ){.       
2e750 20 20 20 6c 77 72 20 3d 20 69 64 78 2b 31 3b 0a     lwr = idx+1;.
2e760 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
2e770 28 20 63 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  ( c>0 ){.       
2e780 20 20 20 75 70 72 20 3d 20 69 64 78 2d 31 3b 0a     upr = idx-1;.
2e790 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
2e7a0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
2e7b0 20 63 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20   c==0 );.       
2e7c0 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20     *pRes = 0;.  
2e7d0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
2e7e0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20  ITE_OK;.        
2e7f0 20 20 70 43 75 72 2d 3e 69 78 20 3d 20 28 75 31    pCur->ix = (u1
2e800 36 29 69 64 78 3b 0a 20 20 20 20 20 20 20 20 20  6)idx;.         
2e810 20 69 66 28 20 70 49 64 78 4b 65 79 2d 3e 65 72   if( pIdxKey->er
2e820 72 43 6f 64 65 20 29 20 72 63 20 3d 20 53 51 4c  rCode ) rc = SQL
2e830 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
2e840 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
2e850 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a   moveto_finish;.
2e860 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2e870 20 20 69 66 28 20 6c 77 72 3e 75 70 72 20 29 20    if( lwr>upr ) 
2e880 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 61  break;.        a
2e890 73 73 65 72 74 28 20 6c 77 72 2b 75 70 72 3e 3d  ssert( lwr+upr>=
2e8a0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 64 78  0 );.        idx
2e8b0 20 3d 20 28 6c 77 72 2b 75 70 72 29 3e 3e 31 3b   = (lwr+upr)>>1;
2e8c0 20 20 2f 2a 20 69 64 78 20 3d 20 28 6c 77 72 2b    /* idx = (lwr+
2e8d0 75 70 72 29 2f 32 20 2a 2f 0a 20 20 20 20 20 20  upr)/2 */.      
2e8e0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  }.    }.    asse
2e8f0 72 74 28 20 6c 77 72 3d 3d 75 70 72 2b 31 20 7c  rt( lwr==upr+1 |
2e900 7c 20 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  | (pPage->intKey
2e910 20 26 26 20 21 70 50 61 67 65 2d 3e 6c 65 61 66   && !pPage->leaf
2e920 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ) );.    assert(
2e930 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29   pPage->isInit )
2e940 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d  ;.    if( pPage-
2e950 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 61  >leaf ){.      a
2e960 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 78 3c  ssert( pCur->ix<
2e970 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65  pCur->pPage->nCe
2e980 6c 6c 20 29 3b 0a 20 20 20 20 20 20 70 43 75 72  ll );.      pCur
2e990 2d 3e 69 78 20 3d 20 28 75 31 36 29 69 64 78 3b  ->ix = (u16)idx;
2e9a0 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 63  .      *pRes = c
2e9b0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  ;.      rc = SQL
2e9c0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 67 6f  ITE_OK;.      go
2e9d0 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68  to moveto_finish
2e9e0 3b 0a 20 20 20 20 7d 0a 6d 6f 76 65 74 6f 5f 6e  ;.    }.moveto_n
2e9f0 65 78 74 5f 6c 61 79 65 72 3a 0a 20 20 20 20 69  ext_layer:.    i
2ea00 66 28 20 6c 77 72 3e 3d 70 50 61 67 65 2d 3e 6e  f( lwr>=pPage->n
2ea10 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 63 68  Cell ){.      ch
2ea20 6c 64 50 67 20 3d 20 67 65 74 34 62 79 74 65 28  ldPg = get4byte(
2ea30 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50  &pPage->aData[pP
2ea40 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  age->hdrOffset+8
2ea50 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ]);.    }else{. 
2ea60 20 20 20 20 20 63 68 6c 64 50 67 20 3d 20 67 65       chldPg = ge
2ea70 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28  t4byte(findCell(
2ea80 70 50 61 67 65 2c 20 6c 77 72 29 29 3b 0a 20 20  pPage, lwr));.  
2ea90 20 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e 69 78    }.    pCur->ix
2eaa0 20 3d 20 28 75 31 36 29 6c 77 72 3b 0a 20 20 20   = (u16)lwr;.   
2eab0 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c   rc = moveToChil
2eac0 64 28 70 43 75 72 2c 20 63 68 6c 64 50 67 29 3b  d(pCur, chldPg);
2ead0 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 62 72  .    if( rc ) br
2eae0 65 61 6b 3b 0a 20 20 7d 0a 6d 6f 76 65 74 6f 5f  eak;.  }.moveto_
2eaf0 66 69 6e 69 73 68 3a 0a 20 20 70 43 75 72 2d 3e  finish:.  pCur->
2eb00 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a  info.nSize = 0;.
2eb10 20 20 61 73 73 65 72 74 28 20 28 70 43 75 72 2d    assert( (pCur-
2eb20 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46  >curFlags & BTCF
2eb30 5f 56 61 6c 69 64 4f 76 66 6c 29 3d 3d 30 20 29  _ValidOvfl)==0 )
2eb40 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
2eb50 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  .../*.** Return 
2eb60 54 52 55 45 20 69 66 20 74 68 65 20 63 75 72 73  TRUE if the curs
2eb70 6f 72 20 69 73 20 6e 6f 74 20 70 6f 69 6e 74 69  or is not pointi
2eb80 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20 6f  ng at an entry o
2eb90 66 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a  f the table..**.
2eba0 2a 2a 20 54 52 55 45 20 77 69 6c 6c 20 62 65 20  ** TRUE will be 
2ebb0 72 65 74 75 72 6e 65 64 20 61 66 74 65 72 20 61  returned after a
2ebc0 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
2ebd0 42 74 72 65 65 4e 65 78 74 28 29 20 6d 6f 76 65  BtreeNext() move
2ebe0 73 0a 2a 2a 20 70 61 73 74 20 74 68 65 20 6c 61  s.** past the la
2ebf0 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  st entry in the 
2ec00 74 61 62 6c 65 20 6f 72 20 73 71 6c 69 74 65 33  table or sqlite3
2ec10 42 74 72 65 65 50 72 65 76 28 29 20 6d 6f 76 65  BtreePrev() move
2ec20 73 20 70 61 73 74 0a 2a 2a 20 74 68 65 20 66 69  s past.** the fi
2ec30 72 73 74 20 65 6e 74 72 79 2e 20 20 54 52 55 45  rst entry.  TRUE
2ec40 20 69 73 20 61 6c 73 6f 20 72 65 74 75 72 6e 65   is also returne
2ec50 64 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 69  d if the table i
2ec60 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20  s empty..*/.int 
2ec70 73 71 6c 69 74 65 33 42 74 72 65 65 45 6f 66 28  sqlite3BtreeEof(
2ec80 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
2ec90 0a 20 20 2f 2a 20 54 4f 44 4f 3a 20 57 68 61 74  .  /* TODO: What
2eca0 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 69   if the cursor i
2ecb0 73 20 69 6e 20 43 55 52 53 4f 52 5f 52 45 51 55  s in CURSOR_REQU
2ecc0 49 52 45 53 45 45 4b 20 62 75 74 20 61 6c 6c 20  IRESEEK but all 
2ecd0 74 61 62 6c 65 20 65 6e 74 72 69 65 73 0a 20 20  table entries.  
2ece0 2a 2a 20 68 61 76 65 20 62 65 65 6e 20 64 65 6c  ** have been del
2ecf0 65 74 65 64 3f 20 54 68 69 73 20 41 50 49 20 77  eted? This API w
2ed00 69 6c 6c 20 6e 65 65 64 20 74 6f 20 63 68 61 6e  ill need to chan
2ed10 67 65 20 74 6f 20 72 65 74 75 72 6e 20 61 6e 20  ge to return an 
2ed20 65 72 72 6f 72 20 63 6f 64 65 0a 20 20 2a 2a 20  error code.  ** 
2ed30 61 73 20 77 65 6c 6c 20 61 73 20 74 68 65 20 62  as well as the b
2ed40 6f 6f 6c 65 61 6e 20 72 65 73 75 6c 74 20 76 61  oolean result va
2ed50 6c 75 65 2e 0a 20 20 2a 2f 0a 20 20 72 65 74 75  lue..  */.  retu
2ed60 72 6e 20 28 43 55 52 53 4f 52 5f 56 41 4c 49 44  rn (CURSOR_VALID
2ed70 21 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 29 3b  !=pCur->eState);
2ed80 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
2ed90 20 61 6e 20 65 73 74 69 6d 61 74 65 20 66 6f 72   an estimate for
2eda0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
2edb0 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65  ows in the table
2edc0 20 74 68 61 74 20 70 43 75 72 20 69 73 0a 2a 2a   that pCur is.**
2edd0 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 20 52   pointing to.  R
2ede0 65 74 75 72 6e 20 61 20 6e 65 67 61 74 69 76 65  eturn a negative
2edf0 20 6e 75 6d 62 65 72 20 69 66 20 6e 6f 20 65 73   number if no es
2ee00 74 69 6d 61 74 65 20 69 73 20 63 75 72 72 65 6e  timate is curren
2ee10 74 6c 79 20 0a 2a 2a 20 61 76 61 69 6c 61 62 6c  tly .** availabl
2ee20 65 2e 0a 2a 2f 0a 69 36 34 20 73 71 6c 69 74 65  e..*/.i64 sqlite
2ee30 33 42 74 72 65 65 52 6f 77 43 6f 75 6e 74 45 73  3BtreeRowCountEs
2ee40 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  t(BtCursor *pCur
2ee50 29 7b 0a 20 20 69 36 34 20 6e 3b 0a 20 20 75 38  ){.  i64 n;.  u8
2ee60 20 69 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63   i;..  assert( c
2ee70 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65  ursorOwnsBtShare
2ee80 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  d(pCur) );.  ass
2ee90 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
2eea0 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42  ex_held(pCur->pB
2eeb0 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29  tree->db->mutex)
2eec0 20 29 3b 0a 0a 20 20 2f 2a 20 43 75 72 72 65 6e   );..  /* Curren
2eed0 74 6c 79 20 74 68 69 73 20 69 6e 74 65 72 66 61  tly this interfa
2eee0 63 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65  ce is only calle
2eef0 64 20 62 79 20 74 68 65 20 4f 50 5f 49 66 53 6d  d by the OP_IfSm
2ef00 61 6c 6c 65 72 0a 20 20 2a 2a 20 6f 70 63 6f 64  aller.  ** opcod
2ef10 65 2c 20 61 6e 64 20 69 74 20 74 68 61 74 20 63  e, and it that c
2ef20 61 73 65 20 74 68 65 20 63 75 72 73 6f 72 20 77  ase the cursor w
2ef30 69 6c 6c 20 61 6c 77 61 79 73 20 62 65 20 76 61  ill always be va
2ef40 6c 69 64 20 61 6e 64 0a 20 20 2a 2a 20 77 69 6c  lid and.  ** wil
2ef50 6c 20 61 6c 77 61 79 73 20 70 6f 69 6e 74 20 74  l always point t
2ef60 6f 20 61 20 6c 65 61 66 20 6e 6f 64 65 2e 20 2a  o a leaf node. *
2ef70 2f 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 43  /.  if( NEVER(pC
2ef80 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53  ur->eState!=CURS
2ef90 4f 52 5f 56 41 4c 49 44 29 20 29 20 72 65 74 75  OR_VALID) ) retu
2efa0 72 6e 20 2d 31 3b 0a 20 20 69 66 28 20 4e 45 56  rn -1;.  if( NEV
2efb0 45 52 28 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e  ER(pCur->pPage->
2efc0 6c 65 61 66 3d 3d 30 29 20 29 20 72 65 74 75 72  leaf==0) ) retur
2efd0 6e 20 2d 31 3b 0a 0a 20 20 6e 20 3d 20 70 43 75  n -1;..  n = pCu
2efe0 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b  r->pPage->nCell;
2eff0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43  .  for(i=0; i<pC
2f000 75 72 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b  ur->iPage; i++){
2f010 0a 20 20 20 20 6e 20 2a 3d 20 70 43 75 72 2d 3e  .    n *= pCur->
2f020 61 70 50 61 67 65 5b 69 5d 2d 3e 6e 43 65 6c 6c  apPage[i]->nCell
2f030 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e  ;.  }.  return n
2f040 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e  ;.}../*.** Advan
2f050 63 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f  ce the cursor to
2f060 20 74 68 65 20 6e 65 78 74 20 65 6e 74 72 79 20   the next entry 
2f070 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  in the database.
2f080 20 0a 2a 2a 20 52 65 74 75 72 6e 20 76 61 6c 75   .** Return valu
2f090 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53 51 4c 49  e:.**.**    SQLI
2f0a0 54 45 5f 4f 4b 20 20 20 20 20 20 20 20 73 75 63  TE_OK        suc
2f0b0 63 65 73 73 0a 2a 2a 20 20 20 20 53 51 4c 49 54  cess.**    SQLIT
2f0c0 45 5f 44 4f 4e 45 20 20 20 20 20 20 63 75 72 73  E_DONE      curs
2f0d0 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 70 6f  or is already po
2f0e0 69 6e 74 69 6e 67 20 61 74 20 74 68 65 20 6c 61  inting at the la
2f0f0 73 74 20 65 6c 65 6d 65 6e 74 0a 2a 2a 20 20 20  st element.**   
2f100 20 6f 74 68 65 72 77 69 73 65 20 20 20 20 20 20   otherwise      
2f110 20 20 73 6f 6d 65 20 6b 69 6e 64 20 6f 66 20 65    some kind of e
2f120 72 72 6f 72 20 6f 63 63 75 72 72 65 64 0a 2a 2a  rror occurred.**
2f130 0a 2a 2a 20 54 68 65 20 6d 61 69 6e 20 65 6e 74  .** The main ent
2f140 72 79 20 70 6f 69 6e 74 20 69 73 20 73 71 6c 69  ry point is sqli
2f150 74 65 33 42 74 72 65 65 4e 65 78 74 28 29 2e 20  te3BtreeNext(). 
2f160 20 54 68 61 74 20 72 6f 75 74 69 6e 65 20 69 73   That routine is
2f170 20 6f 70 74 69 6d 69 7a 65 64 0a 2a 2a 20 66 6f   optimized.** fo
2f180 72 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73  r the common cas
2f190 65 20 6f 66 20 6d 65 72 65 6c 79 20 69 6e 63 72  e of merely incr
2f1a0 65 6d 65 6e 74 69 6e 67 20 74 68 65 20 63 65 6c  ementing the cel
2f1b0 6c 20 63 6f 75 6e 74 65 72 20 42 74 43 75 72 73  l counter BtCurs
2f1c0 6f 72 2e 61 69 49 64 78 0a 2a 2a 20 74 6f 20 74  or.aiIdx.** to t
2f1d0 68 65 20 6e 65 78 74 20 63 65 6c 6c 20 6f 6e 20  he next cell on 
2f1e0 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65  the current page
2f1f0 2e 20 20 54 68 65 20 28 73 6c 6f 77 65 72 29 20  .  The (slower) 
2f200 62 74 72 65 65 4e 65 78 74 28 29 20 68 65 6c 70  btreeNext() help
2f210 65 72 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73  er.** routine is
2f220 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 69 74 20   called when it 
2f230 69 73 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20  is necessary to 
2f240 6d 6f 76 65 20 74 6f 20 61 20 64 69 66 66 65 72  move to a differ
2f250 65 6e 74 20 70 61 67 65 20 6f 72 0a 2a 2a 20 74  ent page or.** t
2f260 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 63 75  o restore the cu
2f270 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 62  rsor..**.** If b
2f280 69 74 20 30 78 30 31 20 6f 66 20 74 68 65 20 46  it 0x01 of the F
2f290 20 61 72 67 75 6d 65 6e 74 20 69 6e 20 73 71 6c   argument in sql
2f2a0 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 43 2c  ite3BtreeNext(C,
2f2b0 46 29 20 69 73 20 31 2c 20 74 68 65 6e 20 74 68  F) is 1, then th
2f2c0 65 0a 2a 2a 20 63 75 72 73 6f 72 20 63 6f 72 72  e.** cursor corr
2f2d0 65 73 70 6f 6e 64 73 20 74 6f 20 61 6e 20 53 51  esponds to an SQ
2f2e0 4c 20 69 6e 64 65 78 20 61 6e 64 20 74 68 69 73  L index and this
2f2f0 20 72 6f 75 74 69 6e 65 20 63 6f 75 6c 64 20 68   routine could h
2f300 61 76 65 20 62 65 65 6e 0a 2a 2a 20 73 6b 69 70  ave been.** skip
2f310 70 65 64 20 69 66 20 74 68 65 20 53 51 4c 20 69  ped if the SQL i
2f320 6e 64 65 78 20 68 61 64 20 62 65 65 6e 20 61 20  ndex had been a 
2f330 75 6e 69 71 75 65 20 69 6e 64 65 78 2e 20 20 54  unique index.  T
2f340 68 65 20 46 20 61 72 67 75 6d 65 6e 74 0a 2a 2a  he F argument.**
2f350 20 69 73 20 61 20 68 69 6e 74 20 74 6f 20 74 68   is a hint to th
2f360 65 20 69 6d 70 6c 65 6d 65 6e 74 2e 20 20 53 51  e implement.  SQ
2f370 4c 69 74 65 20 62 74 72 65 65 20 69 6d 70 6c 65  Lite btree imple
2f380 6d 65 6e 74 61 74 69 6f 6e 20 64 6f 65 73 20 6e  mentation does n
2f390 6f 74 20 75 73 65 0a 2a 2a 20 74 68 69 73 20 68  ot use.** this h
2f3a0 69 6e 74 2c 20 62 75 74 20 43 4f 4d 44 42 32 20  int, but COMDB2 
2f3b0 64 6f 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  does..*/.static 
2f3c0 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20  SQLITE_NOINLINE 
2f3d0 69 6e 74 20 62 74 72 65 65 4e 65 78 74 28 42 74  int btreeNext(Bt
2f3e0 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
2f3f0 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 69   int rc;.  int i
2f400 64 78 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  dx;.  MemPage *p
2f410 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28  Page;..  assert(
2f420 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61   cursorOwnsBtSha
2f430 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61  red(pCur) );.  a
2f440 73 73 65 72 74 28 20 70 43 75 72 2d 3e 73 6b 69  ssert( pCur->ski
2f450 70 4e 65 78 74 3d 3d 30 20 7c 7c 20 70 43 75 72  pNext==0 || pCur
2f460 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52  ->eState!=CURSOR
2f470 5f 56 41 4c 49 44 20 29 3b 0a 20 20 69 66 28 20  _VALID );.  if( 
2f480 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55  pCur->eState!=CU
2f490 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20  RSOR_VALID ){.  
2f4a0 20 20 61 73 73 65 72 74 28 20 28 70 43 75 72 2d    assert( (pCur-
2f4b0 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46  >curFlags & BTCF
2f4c0 5f 56 61 6c 69 64 4f 76 66 6c 29 3d 3d 30 20 29  _ValidOvfl)==0 )
2f4d0 3b 0a 20 20 20 20 72 63 20 3d 20 72 65 73 74 6f  ;.    rc = resto
2f4e0 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  reCursorPosition
2f4f0 28 70 43 75 72 29 3b 0a 20 20 20 20 69 66 28 20  (pCur);.    if( 
2f500 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2f510 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
2f520 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
2f530 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d  CURSOR_INVALID==
2f540 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a  pCur->eState ){.
2f550 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
2f560 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a  ITE_DONE;.    }.
2f570 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 73 6b      if( pCur->sk
2f580 69 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20  ipNext ){.      
2f590 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
2f5a0 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
2f5b0 49 44 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61  ID || pCur->eSta
2f5c0 74 65 3d 3d 43 55 52 53 4f 52 5f 53 4b 49 50 4e  te==CURSOR_SKIPN
2f5d0 45 58 54 20 29 3b 0a 20 20 20 20 20 20 70 43 75  EXT );.      pCu
2f5e0 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
2f5f0 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 20 20 20 20  OR_VALID;.      
2f600 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65  if( pCur->skipNe
2f610 78 74 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  xt>0 ){.        
2f620 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d  pCur->skipNext =
2f630 20 30 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75   0;.        retu
2f640 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
2f650 20 20 20 20 7d 0a 20 20 20 20 20 20 70 43 75 72      }.      pCur
2f660 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a  ->skipNext = 0;.
2f670 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 50 61      }.  }..  pPa
2f680 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65  ge = pCur->pPage
2f690 3b 0a 20 20 69 64 78 20 3d 20 2b 2b 70 43 75 72  ;.  idx = ++pCur
2f6a0 2d 3e 69 78 3b 0a 20 20 69 66 28 20 21 70 50 61  ->ix;.  if( !pPa
2f6b0 67 65 2d 3e 69 73 49 6e 69 74 20 29 7b 0a 20 20  ge->isInit ){.  
2f6c0 20 20 2f 2a 20 54 68 65 20 6f 6e 6c 79 20 6b 6e    /* The only kn
2f6d0 6f 77 6e 20 77 61 79 20 66 6f 72 20 74 68 69 73  own way for this
2f6e0 20 74 6f 20 68 61 70 70 65 6e 20 69 73 20 66 6f   to happen is fo
2f6f0 72 20 74 68 65 72 65 20 74 6f 20 62 65 20 61 0a  r there to be a.
2f700 20 20 20 20 2a 2a 20 72 65 63 75 72 73 69 76 65      ** recursive
2f710 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 74 68   SQL function th
2f720 61 74 20 64 6f 65 73 20 61 20 44 45 4c 45 54 45  at does a DELETE
2f730 20 6f 70 65 72 61 74 69 6f 6e 20 61 73 20 70 61   operation as pa
2f740 72 74 20 6f 66 20 61 0a 20 20 20 20 2a 2a 20 53  rt of a.    ** S
2f750 45 4c 45 43 54 20 77 68 69 63 68 20 64 65 6c 65  ELECT which dele
2f760 74 65 73 20 63 6f 6e 74 65 6e 74 20 6f 75 74 20  tes content out 
2f770 66 72 6f 6d 20 75 6e 64 65 72 20 61 6e 20 61 63  from under an ac
2f780 74 69 76 65 20 63 75 72 73 6f 72 0a 20 20 20 20  tive cursor.    
2f790 2a 2a 20 69 6e 20 61 20 63 6f 72 72 75 70 74 20  ** in a corrupt 
2f7a0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 68  database file wh
2f7b0 65 72 65 20 74 68 65 20 74 61 62 6c 65 20 62 65  ere the table be
2f7c0 69 6e 67 20 44 45 4c 45 54 45 2d 65 64 20 66 72  ing DELETE-ed fr
2f7d0 6f 6d 0a 20 20 20 20 2a 2a 20 68 61 73 20 70 61  om.    ** has pa
2f7e0 67 65 73 20 69 6e 20 63 6f 6d 6d 6f 6e 20 77 69  ges in common wi
2f7f0 74 68 20 74 68 65 20 74 61 62 6c 65 20 62 65 69  th the table bei
2f800 6e 67 20 71 75 65 72 69 65 64 2e 20 20 53 65 65  ng queried.  See
2f810 20 54 48 33 0a 20 20 20 20 2a 2a 20 6d 6f 64 75   TH3.    ** modu
2f820 6c 65 20 63 6f 76 31 2f 62 74 72 65 65 37 38 2e  le cov1/btree78.
2f830 74 65 73 74 20 74 65 73 74 63 61 73 65 20 32 32  test testcase 22
2f840 30 20 28 32 30 31 38 2d 30 36 2d 30 38 29 20 66  0 (2018-06-08) f
2f850 6f 72 20 61 6e 0a 20 20 20 20 2a 2a 20 65 78 61  or an.    ** exa
2f860 6d 70 6c 65 2e 20 2a 2f 0a 20 20 20 20 72 65 74  mple. */.    ret
2f870 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
2f880 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20  PT_BKPT;.  }..  
2f890 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61  /* If the databa
2f8a0 73 65 20 66 69 6c 65 20 69 73 20 63 6f 72 72 75  se file is corru
2f8b0 70 74 2c 20 69 74 20 69 73 20 70 6f 73 73 69 62  pt, it is possib
2f8c0 6c 65 20 66 6f 72 20 74 68 65 20 76 61 6c 75 65  le for the value
2f8d0 20 6f 66 20 69 64 78 20 0a 20 20 2a 2a 20 74 6f   of idx .  ** to
2f8e0 20 62 65 20 69 6e 76 61 6c 69 64 20 68 65 72 65   be invalid here
2f8f0 2e 20 54 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20  . This can only 
2f900 6f 63 63 75 72 20 69 66 20 61 20 73 65 63 6f 6e  occur if a secon
2f910 64 20 63 75 72 73 6f 72 20 6d 6f 64 69 66 69 65  d cursor modifie
2f920 73 0a 20 20 2a 2a 20 74 68 65 20 70 61 67 65 20  s.  ** the page 
2f930 77 68 69 6c 65 20 63 75 72 73 6f 72 20 70 43 75  while cursor pCu
2f940 72 20 69 73 20 68 6f 6c 64 69 6e 67 20 61 20 72  r is holding a r
2f950 65 66 65 72 65 6e 63 65 20 74 6f 20 69 74 2e 20  eference to it. 
2f960 57 68 69 63 68 20 63 61 6e 0a 20 20 2a 2a 20 6f  Which can.  ** o
2f970 6e 6c 79 20 68 61 70 70 65 6e 20 69 66 20 74 68  nly happen if th
2f980 65 20 64 61 74 61 62 61 73 65 20 69 73 20 63 6f  e database is co
2f990 72 72 75 70 74 20 69 6e 20 73 75 63 68 20 61 20  rrupt in such a 
2f9a0 77 61 79 20 61 73 20 74 6f 20 6c 69 6e 6b 20 74  way as to link t
2f9b0 68 65 0a 20 20 2a 2a 20 70 61 67 65 20 69 6e 74  he.  ** page int
2f9c0 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  o more than one 
2f9d0 62 2d 74 72 65 65 20 73 74 72 75 63 74 75 72 65  b-tree structure
2f9e0 2e 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28  . */.  testcase(
2f9f0 20 69 64 78 3e 70 50 61 67 65 2d 3e 6e 43 65 6c   idx>pPage->nCel
2fa00 6c 20 29 3b 0a 0a 20 20 69 66 28 20 69 64 78 3e  l );..  if( idx>
2fa10 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b  =pPage->nCell ){
2fa20 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d  .    if( !pPage-
2fa30 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 72  >leaf ){.      r
2fa40 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28  c = moveToChild(
2fa50 70 43 75 72 2c 20 67 65 74 34 62 79 74 65 28 26  pCur, get4byte(&
2fa60 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61  pPage->aData[pPa
2fa70 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  ge->hdrOffset+8]
2fa80 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  ));.      if( rc
2fa90 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
2faa0 20 20 20 20 72 65 74 75 72 6e 20 6d 6f 76 65 54      return moveT
2fab0 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b  oLeftmost(pCur);
2fac0 0a 20 20 20 20 7d 0a 20 20 20 20 64 6f 7b 0a 20  .    }.    do{. 
2fad0 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69       if( pCur->i
2fae0 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Page==0 ){.     
2faf0 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20     pCur->eState 
2fb00 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  = CURSOR_INVALID
2fb10 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
2fb20 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
2fb30 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 6f 76 65      }.      move
2fb40 54 6f 50 61 72 65 6e 74 28 70 43 75 72 29 3b 0a  ToParent(pCur);.
2fb50 20 20 20 20 20 20 70 50 61 67 65 20 3d 20 70 43        pPage = pC
2fb60 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 20 20 7d  ur->pPage;.    }
2fb70 77 68 69 6c 65 28 20 70 43 75 72 2d 3e 69 78 3e  while( pCur->ix>
2fb80 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b  =pPage->nCell );
2fb90 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e  .    if( pPage->
2fba0 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20  intKey ){.      
2fbb0 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 42 74  return sqlite3Bt
2fbc0 72 65 65 4e 65 78 74 28 70 43 75 72 2c 20 30 29  reeNext(pCur, 0)
2fbd0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2fbe0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2fbf0 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  _OK;.    }.  }. 
2fc00 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66   if( pPage->leaf
2fc10 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
2fc20 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73  QLITE_OK;.  }els
2fc30 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 6d 6f  e{.    return mo
2fc40 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75  veToLeftmost(pCu
2fc50 72 29 3b 0a 20 20 7d 0a 7d 0a 69 6e 74 20 73 71  r);.  }.}.int sq
2fc60 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 42  lite3BtreeNext(B
2fc70 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69  tCursor *pCur, i
2fc80 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 4d 65 6d  nt flags){.  Mem
2fc90 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 55  Page *pPage;.  U
2fca0 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
2fcb0 20 66 6c 61 67 73 20 29 3b 20 20 2f 2a 20 55 73   flags );  /* Us
2fcc0 65 64 20 69 6e 20 43 4f 4d 44 42 32 20 62 75 74  ed in COMDB2 but
2fcd0 20 6e 6f 74 20 6e 61 74 69 76 65 20 53 51 4c 69   not native SQLi
2fce0 74 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  te */.  assert( 
2fcf0 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72  cursorOwnsBtShar
2fd00 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ed(pCur) );.  as
2fd10 73 65 72 74 28 20 66 6c 61 67 73 3d 3d 30 20 7c  sert( flags==0 |
2fd20 7c 20 66 6c 61 67 73 3d 3d 31 20 29 3b 0a 20 20  | flags==1 );.  
2fd30 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 73 6b  assert( pCur->sk
2fd40 69 70 4e 65 78 74 3d 3d 30 20 7c 7c 20 70 43 75  ipNext==0 || pCu
2fd50 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f  r->eState!=CURSO
2fd60 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 70 43 75  R_VALID );.  pCu
2fd70 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20  r->info.nSize = 
2fd80 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72 46 6c  0;.  pCur->curFl
2fd90 61 67 73 20 26 3d 20 7e 28 42 54 43 46 5f 56 61  ags &= ~(BTCF_Va
2fda0 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56 61 6c  lidNKey|BTCF_Val
2fdb0 69 64 4f 76 66 6c 29 3b 0a 20 20 69 66 28 20 70  idOvfl);.  if( p
2fdc0 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52  Cur->eState!=CUR
2fdd0 53 4f 52 5f 56 41 4c 49 44 20 29 20 72 65 74 75  SOR_VALID ) retu
2fde0 72 6e 20 62 74 72 65 65 4e 65 78 74 28 70 43 75  rn btreeNext(pCu
2fdf0 72 29 3b 0a 20 20 70 50 61 67 65 20 3d 20 70 43  r);.  pPage = pC
2fe00 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 69 66 28  ur->pPage;.  if(
2fe10 20 28 2b 2b 70 43 75 72 2d 3e 69 78 29 3e 3d 70   (++pCur->ix)>=p
2fe20 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20  Page->nCell ){. 
2fe30 20 20 20 70 43 75 72 2d 3e 69 78 2d 2d 3b 0a 20     pCur->ix--;. 
2fe40 20 20 20 72 65 74 75 72 6e 20 62 74 72 65 65 4e     return btreeN
2fe50 65 78 74 28 70 43 75 72 29 3b 0a 20 20 7d 0a 20  ext(pCur);.  }. 
2fe60 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66   if( pPage->leaf
2fe70 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
2fe80 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73  QLITE_OK;.  }els
2fe90 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 6d 6f  e{.    return mo
2fea0 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75  veToLeftmost(pCu
2feb0 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  r);.  }.}../*.**
2fec0 20 53 74 65 70 20 74 68 65 20 63 75 72 73 6f 72   Step the cursor
2fed0 20 74 6f 20 74 68 65 20 62 61 63 6b 20 74 6f 20   to the back to 
2fee0 74 68 65 20 70 72 65 76 69 6f 75 73 20 65 6e 74  the previous ent
2fef0 72 79 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ry in the databa
2ff00 73 65 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 76 61  se..** Return va
2ff10 6c 75 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  lues:.**.**     
2ff20 53 51 4c 49 54 45 5f 4f 4b 20 20 20 20 20 73 75  SQLITE_OK     su
2ff30 63 63 65 73 73 0a 2a 2a 20 20 20 20 20 53 51 4c  ccess.**     SQL
2ff40 49 54 45 5f 44 4f 4e 45 20 20 20 74 68 65 20 63  ITE_DONE   the c
2ff50 75 72 73 6f 72 20 69 73 20 61 6c 72 65 61 64 79  ursor is already
2ff60 20 6f 6e 20 74 68 65 20 66 69 72 73 74 20 65 6c   on the first el
2ff70 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 74 61 62  ement of the tab
2ff80 6c 65 0a 2a 2a 20 20 20 20 20 6f 74 68 65 72 77  le.**     otherw
2ff90 69 73 65 20 20 20 20 20 73 6f 6d 65 20 6b 69 6e  ise     some kin
2ffa0 64 20 6f 66 20 65 72 72 6f 72 20 6f 63 63 75 72  d of error occur
2ffb0 72 65 64 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61  red.**.** The ma
2ffc0 69 6e 20 65 6e 74 72 79 20 70 6f 69 6e 74 20 69  in entry point i
2ffd0 73 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 72  s sqlite3BtreePr
2ffe0 65 76 69 6f 75 73 28 29 2e 20 20 54 68 61 74 20  evious().  That 
2fff0 72 6f 75 74 69 6e 65 20 69 73 20 6f 70 74 69 6d  routine is optim
30000 69 7a 65 64 0a 2a 2a 20 66 6f 72 20 74 68 65 20  ized.** for the 
30010 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 6f 66 20 6d  common case of m
30020 65 72 65 6c 79 20 64 65 63 72 65 6d 65 6e 74 69  erely decrementi
30030 6e 67 20 74 68 65 20 63 65 6c 6c 20 63 6f 75 6e  ng the cell coun
30040 74 65 72 20 42 74 43 75 72 73 6f 72 2e 61 69 49  ter BtCursor.aiI
30050 64 78 0a 2a 2a 20 74 6f 20 74 68 65 20 70 72 65  dx.** to the pre
30060 76 69 6f 75 73 20 63 65 6c 6c 20 6f 6e 20 74 68  vious cell on th
30070 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 2e 20  e current page. 
30080 20 54 68 65 20 28 73 6c 6f 77 65 72 29 20 62 74   The (slower) bt
30090 72 65 65 50 72 65 76 69 6f 75 73 28 29 0a 2a 2a  reePrevious().**
300a0 20 68 65 6c 70 65 72 20 72 6f 75 74 69 6e 65 20   helper routine 
300b0 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 69  is called when i
300c0 74 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 74  t is necessary t
300d0 6f 20 6d 6f 76 65 20 74 6f 20 61 20 64 69 66 66  o move to a diff
300e0 65 72 65 6e 74 20 70 61 67 65 0a 2a 2a 20 6f 72  erent page.** or
300f0 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20   to restore the 
30100 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66  cursor..**.** If
30110 20 62 69 74 20 30 78 30 31 20 6f 66 20 74 68 65   bit 0x01 of the
30120 20 46 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 73   F argument to s
30130 71 6c 69 74 65 33 42 74 72 65 65 50 72 65 76 69  qlite3BtreePrevi
30140 6f 75 73 28 43 2c 46 29 20 69 73 20 31 2c 20 74  ous(C,F) is 1, t
30150 68 65 6e 0a 2a 2a 20 74 68 65 20 63 75 72 73 6f  hen.** the curso
30160 72 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f  r corresponds to
30170 20 61 6e 20 53 51 4c 20 69 6e 64 65 78 20 61 6e   an SQL index an
30180 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63  d this routine c
30190 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e 0a 2a  ould have been.*
301a0 2a 20 73 6b 69 70 70 65 64 20 69 66 20 74 68 65  * skipped if the
301b0 20 53 51 4c 20 69 6e 64 65 78 20 68 61 64 20 62   SQL index had b
301c0 65 65 6e 20 61 20 75 6e 69 71 75 65 20 69 6e 64  een a unique ind
301d0 65 78 2e 20 20 54 68 65 20 46 20 61 72 67 75 6d  ex.  The F argum
301e0 65 6e 74 20 69 73 20 61 0a 2a 2a 20 68 69 6e 74  ent is a.** hint
301f0 20 74 6f 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e   to the implemen
30200 74 2e 20 20 54 68 65 20 6e 61 74 69 76 65 20 53  t.  The native S
30210 51 4c 69 74 65 20 62 74 72 65 65 20 69 6d 70 6c  QLite btree impl
30220 65 6d 65 6e 74 61 74 69 6f 6e 20 64 6f 65 73 20  ementation does 
30230 6e 6f 74 0a 2a 2a 20 75 73 65 20 74 68 69 73 20  not.** use this 
30240 68 69 6e 74 2c 20 62 75 74 20 43 4f 4d 44 42 32  hint, but COMDB2
30250 20 64 6f 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63   does..*/.static
30260 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45   SQLITE_NOINLINE
30270 20 69 6e 74 20 62 74 72 65 65 50 72 65 76 69 6f   int btreePrevio
30280 75 73 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  us(BtCursor *pCu
30290 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  r){.  int rc;.  
302a0 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a  MemPage *pPage;.
302b0 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
302c0 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70 43  rOwnsBtShared(pC
302d0 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
302e0 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3d   pCur->skipNext=
302f0 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61  =0 || pCur->eSta
30300 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te!=CURSOR_VALID
30310 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70   );.  assert( (p
30320 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20  Cur->curFlags & 
30330 28 42 54 43 46 5f 41 74 4c 61 73 74 7c 42 54 43  (BTCF_AtLast|BTC
30340 46 5f 56 61 6c 69 64 4f 76 66 6c 7c 42 54 43 46  F_ValidOvfl|BTCF
30350 5f 56 61 6c 69 64 4e 4b 65 79 29 29 3d 3d 30 20  _ValidNKey))==0 
30360 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
30370 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30  r->info.nSize==0
30380 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e   );.  if( pCur->
30390 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56  eState!=CURSOR_V
303a0 41 4c 49 44 20 29 7b 0a 20 20 20 20 72 63 20 3d  ALID ){.    rc =
303b0 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f   restoreCursorPo
303c0 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20  sition(pCur);.  
303d0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
303e0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74  _OK ){.      ret
303f0 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
30400 20 20 69 66 28 20 43 55 52 53 4f 52 5f 49 4e 56    if( CURSOR_INV
30410 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61  ALID==pCur->eSta
30420 74 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  te ){.      retu
30430 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a  rn SQLITE_DONE;.
30440 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 43      }.    if( pC
30450 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 29 7b 0a  ur->skipNext ){.
30460 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
30470 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
30480 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70 43 75 72  OR_VALID || pCur
30490 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
304a0 5f 53 4b 49 50 4e 45 58 54 20 29 3b 0a 20 20 20  _SKIPNEXT );.   
304b0 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20     pCur->eState 
304c0 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a  = CURSOR_VALID;.
304d0 20 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e        if( pCur->
304e0 73 6b 69 70 4e 65 78 74 3c 30 20 29 7b 0a 20 20  skipNext<0 ){.  
304f0 20 20 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70        pCur->skip
30500 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  Next = 0;.      
30510 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
30520 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OK;.      }.    
30530 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74    pCur->skipNext
30540 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
30550 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d  .  pPage = pCur-
30560 3e 70 50 61 67 65 3b 0a 20 20 61 73 73 65 72 74  >pPage;.  assert
30570 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20  ( pPage->isInit 
30580 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d  );.  if( !pPage-
30590 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 69 6e 74  >leaf ){.    int
305a0 20 69 64 78 20 3d 20 70 43 75 72 2d 3e 69 78 3b   idx = pCur->ix;
305b0 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f  .    rc = moveTo
305c0 43 68 69 6c 64 28 70 43 75 72 2c 20 67 65 74 34  Child(pCur, get4
305d0 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50  byte(findCell(pP
305e0 61 67 65 2c 20 69 64 78 29 29 29 3b 0a 20 20 20  age, idx)));.   
305f0 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
30600 20 72 63 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f   rc;.    rc = mo
30610 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 70 43  veToRightmost(pC
30620 75 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ur);.  }else{.  
30630 20 20 77 68 69 6c 65 28 20 70 43 75 72 2d 3e 69    while( pCur->i
30640 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  x==0 ){.      if
30650 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3d 3d 30  ( pCur->iPage==0
30660 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72   ){.        pCur
30670 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
30680 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20  R_INVALID;.     
30690 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
306a0 5f 44 4f 4e 45 3b 0a 20 20 20 20 20 20 7d 0a 20  _DONE;.      }. 
306b0 20 20 20 20 20 6d 6f 76 65 54 6f 50 61 72 65 6e       moveToParen
306c0 74 28 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20  t(pCur);.    }. 
306d0 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
306e0 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29  >info.nSize==0 )
306f0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70  ;.    assert( (p
30700 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20  Cur->curFlags & 
30710 28 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29  (BTCF_ValidOvfl)
30720 29 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 70 43 75  )==0 );..    pCu
30730 72 2d 3e 69 78 2d 2d 3b 0a 20 20 20 20 70 50 61  r->ix--;.    pPa
30740 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65  ge = pCur->pPage
30750 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d  ;.    if( pPage-
30760 3e 69 6e 74 4b 65 79 20 26 26 20 21 70 50 61 67  >intKey && !pPag
30770 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20  e->leaf ){.     
30780 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
30790 65 65 50 72 65 76 69 6f 75 73 28 70 43 75 72 2c  eePrevious(pCur,
307a0 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   0);.    }else{.
307b0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
307c0 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  E_OK;.    }.  }.
307d0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 69    return rc;.}.i
307e0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 50  nt sqlite3BtreeP
307f0 72 65 76 69 6f 75 73 28 42 74 43 75 72 73 6f 72  revious(BtCursor
30800 20 2a 70 43 75 72 2c 20 69 6e 74 20 66 6c 61 67   *pCur, int flag
30810 73 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75  s){.  assert( cu
30820 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64  rsorOwnsBtShared
30830 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
30840 72 74 28 20 66 6c 61 67 73 3d 3d 30 20 7c 7c 20  rt( flags==0 || 
30850 66 6c 61 67 73 3d 3d 31 20 29 3b 0a 20 20 61 73  flags==1 );.  as
30860 73 65 72 74 28 20 70 43 75 72 2d 3e 73 6b 69 70  sert( pCur->skip
30870 4e 65 78 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d  Next==0 || pCur-
30880 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f  >eState!=CURSOR_
30890 56 41 4c 49 44 20 29 3b 0a 20 20 55 4e 55 53 45  VALID );.  UNUSE
308a0 44 5f 50 41 52 41 4d 45 54 45 52 28 20 66 6c 61  D_PARAMETER( fla
308b0 67 73 20 29 3b 20 20 2f 2a 20 55 73 65 64 20 69  gs );  /* Used i
308c0 6e 20 43 4f 4d 44 42 32 20 62 75 74 20 6e 6f 74  n COMDB2 but not
308d0 20 6e 61 74 69 76 65 20 53 51 4c 69 74 65 20 2a   native SQLite *
308e0 2f 0a 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61  /.  pCur->curFla
308f0 67 73 20 26 3d 20 7e 28 42 54 43 46 5f 41 74 4c  gs &= ~(BTCF_AtL
30900 61 73 74 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76  ast|BTCF_ValidOv
30910 66 6c 7c 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65  fl|BTCF_ValidNKe
30920 79 29 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f  y);.  pCur->info
30930 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 69 66  .nSize = 0;.  if
30940 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d  ( pCur->eState!=
30950 43 55 52 53 4f 52 5f 56 41 4c 49 44 0a 20 20 20  CURSOR_VALID.   
30960 7c 7c 20 70 43 75 72 2d 3e 69 78 3d 3d 30 0a 20  || pCur->ix==0. 
30970 20 20 7c 7c 20 70 43 75 72 2d 3e 70 50 61 67 65    || pCur->pPage
30980 2d 3e 6c 65 61 66 3d 3d 30 0a 20 20 29 7b 0a 20  ->leaf==0.  ){. 
30990 20 20 20 72 65 74 75 72 6e 20 62 74 72 65 65 50     return btreeP
309a0 72 65 76 69 6f 75 73 28 70 43 75 72 29 3b 0a 20  revious(pCur);. 
309b0 20 7d 0a 20 20 70 43 75 72 2d 3e 69 78 2d 2d 3b   }.  pCur->ix--;
309c0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
309d0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c  _OK;.}../*.** Al
309e0 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 70 61 67  locate a new pag
309f0 65 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  e from the datab
30a00 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  ase file..**.** 
30a10 54 68 65 20 6e 65 77 20 70 61 67 65 20 69 73 20  The new page is 
30a20 6d 61 72 6b 65 64 20 61 73 20 64 69 72 74 79 2e  marked as dirty.
30a30 20 20 28 49 6e 20 6f 74 68 65 72 20 77 6f 72 64    (In other word
30a40 73 2c 20 73 71 6c 69 74 65 33 50 61 67 65 72 57  s, sqlite3PagerW
30a50 72 69 74 65 28 29 0a 2a 2a 20 68 61 73 20 61 6c  rite().** has al
30a60 72 65 61 64 79 20 62 65 65 6e 20 63 61 6c 6c 65  ready been calle
30a70 64 20 6f 6e 20 74 68 65 20 6e 65 77 20 70 61 67  d on the new pag
30a80 65 2e 29 20 20 54 68 65 20 6e 65 77 20 70 61 67  e.)  The new pag
30a90 65 20 68 61 73 20 61 6c 73 6f 0a 2a 2a 20 62 65  e has also.** be
30aa0 65 6e 20 72 65 66 65 72 65 6e 63 65 64 20 61 6e  en referenced an
30ab0 64 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 72 6f  d the calling ro
30ac0 75 74 69 6e 65 20 69 73 20 72 65 73 70 6f 6e 73  utine is respons
30ad0 69 62 6c 65 20 66 6f 72 20 63 61 6c 6c 69 6e 67  ible for calling
30ae0 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72  .** sqlite3Pager
30af0 55 6e 72 65 66 28 29 20 6f 6e 20 74 68 65 20 6e  Unref() on the n
30b00 65 77 20 70 61 67 65 20 77 68 65 6e 20 69 74 20  ew page when it 
30b10 69 73 20 64 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 53  is done..**.** S
30b20 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
30b30 72 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73 2e  rned on success.
30b40 20 20 41 6e 79 20 6f 74 68 65 72 20 72 65 74 75    Any other retu
30b50 72 6e 20 76 61 6c 75 65 20 69 6e 64 69 63 61 74  rn value indicat
30b60 65 73 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 2e 20  es.** an error. 
30b70 20 2a 70 70 50 61 67 65 20 69 73 20 73 65 74 20   *ppPage is set 
30b80 74 6f 20 4e 55 4c 4c 20 69 6e 20 74 68 65 20 65  to NULL in the e
30b90 76 65 6e 74 20 6f 66 20 61 6e 20 65 72 72 6f 72  vent of an error
30ba0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 22  ..**.** If the "
30bb0 6e 65 61 72 62 79 22 20 70 61 72 61 6d 65 74 65  nearby" paramete
30bc0 72 20 69 73 20 6e 6f 74 20 30 2c 20 74 68 65 6e  r is not 0, then
30bd0 20 61 6e 20 65 66 66 6f 72 74 20 69 73 20 6d 61   an effort is ma
30be0 64 65 20 74 6f 20 0a 2a 2a 20 6c 6f 63 61 74 65  de to .** locate
30bf0 20 61 20 70 61 67 65 20 63 6c 6f 73 65 20 74 6f   a page close to
30c00 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
30c10 20 22 6e 65 61 72 62 79 22 2e 20 20 54 68 69 73   "nearby".  This
30c20 20 63 61 6e 20 62 65 20 75 73 65 64 20 69 6e 20   can be used in 
30c30 61 6e 0a 2a 2a 20 61 74 74 65 6d 70 74 20 74 6f  an.** attempt to
30c40 20 6b 65 65 70 20 72 65 6c 61 74 65 64 20 70 61   keep related pa
30c50 67 65 73 20 63 6c 6f 73 65 20 74 6f 20 65 61 63  ges close to eac
30c60 68 20 6f 74 68 65 72 20 69 6e 20 74 68 65 20 64  h other in the d
30c70 61 74 61 62 61 73 65 20 66 69 6c 65 2c 0a 2a 2a  atabase file,.**
30c80 20 77 68 69 63 68 20 69 6e 20 74 75 72 6e 20 63   which in turn c
30c90 61 6e 20 6d 61 6b 65 20 64 61 74 61 62 61 73 65  an make database
30ca0 20 61 63 63 65 73 73 20 66 61 73 74 65 72 2e 0a   access faster..
30cb0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 4d 6f  **.** If the eMo
30cc0 64 65 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  de parameter is 
30cd0 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20 61 6e  BTALLOC_EXACT an
30ce0 64 20 74 68 65 20 6e 65 61 72 62 79 20 70 61 67  d the nearby pag
30cf0 65 20 65 78 69 73 74 73 0a 2a 2a 20 61 6e 79 77  e exists.** anyw
30d00 68 65 72 65 20 6f 6e 20 74 68 65 20 66 72 65 65  here on the free
30d10 2d 6c 69 73 74 2c 20 74 68 65 6e 20 69 74 20 69  -list, then it i
30d20 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20  s guaranteed to 
30d30 62 65 20 72 65 74 75 72 6e 65 64 2e 20 20 49 66  be returned.  If
30d40 0a 2a 2a 20 65 4d 6f 64 65 20 69 73 20 42 54 41  .** eMode is BTA
30d50 4c 4c 4f 43 5f 4c 54 20 74 68 65 6e 20 74 68 65  LLOC_LT then the
30d60 20 70 61 67 65 20 72 65 74 75 72 6e 65 64 20 77   page returned w
30d70 69 6c 6c 20 62 65 20 6c 65 73 73 20 74 68 61 6e  ill be less than
30d80 20 6f 72 20 65 71 75 61 6c 0a 2a 2a 20 74 6f 20   or equal.** to 
30d90 6e 65 61 72 62 79 20 69 66 20 61 6e 79 20 73 75  nearby if any su
30da0 63 68 20 70 61 67 65 20 65 78 69 73 74 73 2e 20  ch page exists. 
30db0 20 49 66 20 65 4d 6f 64 65 20 69 73 20 42 54 41   If eMode is BTA
30dc0 4c 4c 4f 43 5f 41 4e 59 20 74 68 65 6e 20 74 68  LLOC_ANY then th
30dd0 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 72 65  ere.** are no re
30de0 73 74 72 69 63 74 69 6f 6e 73 20 6f 6e 20 77 68  strictions on wh
30df0 69 63 68 20 70 61 67 65 20 69 73 20 72 65 74 75  ich page is retu
30e00 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
30e10 69 6e 74 20 61 6c 6c 6f 63 61 74 65 42 74 72 65  int allocateBtre
30e20 65 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65  ePage(.  BtShare
30e30 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20  d *pBt,         
30e40 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a  /* The btree */.
30e50 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61    MemPage **ppPa
30e60 67 65 2c 20 20 20 20 20 20 2f 2a 20 53 74 6f 72  ge,      /* Stor
30e70 65 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  e pointer to the
30e80 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 20   allocated page 
30e90 68 65 72 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 2a  here */.  Pgno *
30ea0 70 50 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20  pPgno,          
30eb0 20 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 70 61   /* Store the pa
30ec0 67 65 20 6e 75 6d 62 65 72 20 68 65 72 65 20 2a  ge number here *
30ed0 2f 0a 20 20 50 67 6e 6f 20 6e 65 61 72 62 79 2c  /.  Pgno nearby,
30ee0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65             /* Se
30ef0 61 72 63 68 20 66 6f 72 20 61 20 70 61 67 65 20  arch for a page 
30f00 6e 65 61 72 20 74 68 69 73 20 6f 6e 65 20 2a 2f  near this one */
30f10 0a 20 20 75 38 20 65 4d 6f 64 65 20 20 20 20 20  .  u8 eMode     
30f20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 54 41            /* BTA
30f30 4c 4c 4f 43 5f 45 58 41 43 54 2c 20 42 54 41 4c  LLOC_EXACT, BTAL
30f40 4c 4f 43 5f 4c 54 2c 20 6f 72 20 42 54 41 4c 4c  LOC_LT, or BTALL
30f50 4f 43 5f 41 4e 59 20 2a 2f 0a 29 7b 0a 20 20 4d  OC_ANY */.){.  M
30f60 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 3b 0a  emPage *pPage1;.
30f70 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 33 32 20    int rc;.  u32 
30f80 6e 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72  n;     /* Number
30f90 20 6f 66 20 70 61 67 65 73 20 6f 6e 20 74 68 65   of pages on the
30fa0 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20 75   freelist */.  u
30fb0 33 32 20 6b 3b 20 20 20 20 20 2f 2a 20 4e 75 6d  32 k;     /* Num
30fc0 62 65 72 20 6f 66 20 6c 65 61 76 65 73 20 6f 6e  ber of leaves on
30fd0 20 74 68 65 20 74 72 75 6e 6b 20 6f 66 20 74 68   the trunk of th
30fe0 65 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20  e freelist */.  
30ff0 4d 65 6d 50 61 67 65 20 2a 70 54 72 75 6e 6b 20  MemPage *pTrunk 
31000 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  = 0;.  MemPage *
31010 70 50 72 65 76 54 72 75 6e 6b 20 3d 20 30 3b 0a  pPrevTrunk = 0;.
31020 20 20 50 67 6e 6f 20 6d 78 50 61 67 65 3b 20 20    Pgno mxPage;  
31030 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69 7a 65     /* Total size
31040 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
31050 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 61 73 73 65   file */..  asse
31060 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
31070 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
31080 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
31090 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 41  eMode==BTALLOC_A
310a0 4e 59 20 7c 7c 20 28 6e 65 61 72 62 79 3e 30 20  NY || (nearby>0 
310b0 26 26 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70  && IfNotOmitAV(p
310c0 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 29  Bt->autoVacuum))
310d0 20 29 3b 0a 20 20 70 50 61 67 65 31 20 3d 20 70   );.  pPage1 = p
310e0 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20 6d 78  Bt->pPage1;.  mx
310f0 50 61 67 65 20 3d 20 62 74 72 65 65 50 61 67 65  Page = btreePage
31100 63 6f 75 6e 74 28 70 42 74 29 3b 0a 20 20 2f 2a  count(pBt);.  /*
31110 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
31120 30 35 31 31 39 2d 30 32 36 33 37 20 54 68 65 20  05119-02637 The 
31130 34 2d 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61  4-byte big-endia
31140 6e 20 69 6e 74 65 67 65 72 20 61 74 20 6f 66 66  n integer at off
31150 73 65 74 20 33 36 0a 20 20 2a 2a 20 73 74 6f 72  set 36.  ** stor
31160 65 73 20 73 74 6f 72 65 73 20 74 68 65 20 74 6f  es stores the to
31170 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  tal number of pa
31180 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c  ges on the freel
31190 69 73 74 2e 20 2a 2f 0a 20 20 6e 20 3d 20 67 65  ist. */.  n = ge
311a0 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e  t4byte(&pPage1->
311b0 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 74 65  aData[36]);.  te
311c0 73 74 63 61 73 65 28 20 6e 3d 3d 6d 78 50 61 67  stcase( n==mxPag
311d0 65 2d 31 20 29 3b 0a 20 20 69 66 28 20 6e 3e 3d  e-1 );.  if( n>=
311e0 6d 78 50 61 67 65 20 29 7b 0a 20 20 20 20 72 65  mxPage ){.    re
311f0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
31200 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  UPT_BKPT;.  }.  
31210 69 66 28 20 6e 3e 30 20 29 7b 0a 20 20 20 20 2f  if( n>0 ){.    /
31220 2a 20 54 68 65 72 65 20 61 72 65 20 70 61 67 65  * There are page
31230 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73  s on the freelis
31240 74 2e 20 20 52 65 75 73 65 20 6f 6e 65 20 6f 66  t.  Reuse one of
31250 20 74 68 6f 73 65 20 70 61 67 65 73 2e 20 2a 2f   those pages. */
31260 0a 20 20 20 20 50 67 6e 6f 20 69 54 72 75 6e 6b  .    Pgno iTrunk
31270 3b 0a 20 20 20 20 75 38 20 73 65 61 72 63 68 4c  ;.    u8 searchL
31280 69 73 74 20 3d 20 30 3b 20 2f 2a 20 49 66 20 74  ist = 0; /* If t
31290 68 65 20 66 72 65 65 2d 6c 69 73 74 20 6d 75 73  he free-list mus
312a0 74 20 62 65 20 73 65 61 72 63 68 65 64 20 66 6f  t be searched fo
312b0 72 20 27 6e 65 61 72 62 79 27 20 2a 2f 0a 20 20  r 'nearby' */.  
312c0 20 20 75 33 32 20 6e 53 65 61 72 63 68 20 3d 20    u32 nSearch = 
312d0 30 3b 20 20 20 2f 2a 20 43 6f 75 6e 74 20 6f 66  0;   /* Count of
312e0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73   the number of s
312f0 65 61 72 63 68 20 61 74 74 65 6d 70 74 73 20 2a  earch attempts *
31300 2f 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20 49 66  /.    .    /* If
31310 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f   eMode==BTALLOC_
31320 45 58 41 43 54 20 61 6e 64 20 61 20 71 75 65 72  EXACT and a quer
31330 79 20 6f 66 20 74 68 65 20 70 6f 69 6e 74 65 72  y of the pointer
31340 2d 6d 61 70 0a 20 20 20 20 2a 2a 20 73 68 6f 77  -map.    ** show
31350 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  s that the page 
31360 27 6e 65 61 72 62 79 27 20 69 73 20 73 6f 6d 65  'nearby' is some
31370 77 68 65 72 65 20 6f 6e 20 74 68 65 20 66 72 65  where on the fre
31380 65 2d 6c 69 73 74 2c 20 74 68 65 6e 0a 20 20 20  e-list, then.   
31390 20 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 2d 6c   ** the entire-l
313a0 69 73 74 20 77 69 6c 6c 20 62 65 20 73 65 61 72  ist will be sear
313b0 63 68 65 64 20 66 6f 72 20 74 68 61 74 20 70 61  ched for that pa
313c0 67 65 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 6e 64  ge..    */.#ifnd
313d0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
313e0 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66  UTOVACUUM.    if
313f0 28 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43  ( eMode==BTALLOC
31400 5f 45 58 41 43 54 20 29 7b 0a 20 20 20 20 20 20  _EXACT ){.      
31410 69 66 28 20 6e 65 61 72 62 79 3c 3d 6d 78 50 61  if( nearby<=mxPa
31420 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20 75 38  ge ){.        u8
31430 20 65 54 79 70 65 3b 0a 20 20 20 20 20 20 20 20   eType;.        
31440 61 73 73 65 72 74 28 20 6e 65 61 72 62 79 3e 30  assert( nearby>0
31450 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
31460 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  rt( pBt->autoVac
31470 75 75 6d 20 29 3b 0a 20 20 20 20 20 20 20 20 72  uum );.        r
31480 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70 42  c = ptrmapGet(pB
31490 74 2c 20 6e 65 61 72 62 79 2c 20 26 65 54 79 70  t, nearby, &eTyp
314a0 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69  e, 0);.        i
314b0 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
314c0 63 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 65  c;.        if( e
314d0 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45  Type==PTRMAP_FRE
314e0 45 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20 20  EPAGE ){.       
314f0 20 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20     searchList = 
31500 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  1;.        }.   
31510 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69     }.    }else i
31520 66 28 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f  f( eMode==BTALLO
31530 43 5f 4c 45 20 29 7b 0a 20 20 20 20 20 20 73 65  C_LE ){.      se
31540 61 72 63 68 4c 69 73 74 20 3d 20 31 3b 0a 20 20  archList = 1;.  
31550 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20    }.#endif..    
31560 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65  /* Decrement the
31570 20 66 72 65 65 2d 6c 69 73 74 20 63 6f 75 6e 74   free-list count
31580 20 62 79 20 31 2e 20 53 65 74 20 69 54 72 75 6e   by 1. Set iTrun
31590 6b 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f  k to the index o
315a0 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 66 69 72  f the.    ** fir
315b0 73 74 20 66 72 65 65 2d 6c 69 73 74 20 74 72 75  st free-list tru
315c0 6e 6b 20 70 61 67 65 2e 20 69 50 72 65 76 54 72  nk page. iPrevTr
315d0 75 6e 6b 20 69 73 20 69 6e 69 74 69 61 6c 6c 79  unk is initially
315e0 20 31 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72   1..    */.    r
315f0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
31600 57 72 69 74 65 28 70 50 61 67 65 31 2d 3e 70 44  Write(pPage1->pD
31610 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
31620 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
31630 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50      put4byte(&pP
31640 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c  age1->aData[36],
31650 20 6e 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 54   n-1);..    /* T
31660 68 65 20 63 6f 64 65 20 77 69 74 68 69 6e 20 74  he code within t
31670 68 69 73 20 6c 6f 6f 70 20 69 73 20 72 75 6e 20  his loop is run 
31680 6f 6e 6c 79 20 6f 6e 63 65 20 69 66 20 74 68 65  only once if the
31690 20 27 73 65 61 72 63 68 4c 69 73 74 27 20 76 61   'searchList' va
316a0 72 69 61 62 6c 65 0a 20 20 20 20 2a 2a 20 69 73  riable.    ** is
316b0 20 6e 6f 74 20 74 72 75 65 2e 20 4f 74 68 65 72   not true. Other
316c0 77 69 73 65 2c 20 69 74 20 72 75 6e 73 20 6f 6e  wise, it runs on
316d0 63 65 20 66 6f 72 20 65 61 63 68 20 74 72 75 6e  ce for each trun
316e0 6b 2d 70 61 67 65 20 6f 6e 20 74 68 65 0a 20 20  k-page on the.  
316f0 20 20 2a 2a 20 66 72 65 65 2d 6c 69 73 74 20 75    ** free-list u
31700 6e 74 69 6c 20 74 68 65 20 70 61 67 65 20 27 6e  ntil the page 'n
31710 65 61 72 62 79 27 20 69 73 20 6c 6f 63 61 74 65  earby' is locate
31720 64 20 28 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f  d (eMode==BTALLO
31730 43 5f 45 58 41 43 54 29 0a 20 20 20 20 2a 2a 20  C_EXACT).    ** 
31740 6f 72 20 75 6e 74 69 6c 20 61 20 70 61 67 65 20  or until a page 
31750 6c 65 73 73 20 74 68 61 6e 20 27 6e 65 61 72 62  less than 'nearb
31760 79 27 20 69 73 20 6c 6f 63 61 74 65 64 20 28 65  y' is located (e
31770 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 54  Mode==BTALLOC_LT
31780 29 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 6f 20  ).    */.    do 
31790 7b 0a 20 20 20 20 20 20 70 50 72 65 76 54 72 75  {.      pPrevTru
317a0 6e 6b 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20  nk = pTrunk;.   
317b0 20 20 20 69 66 28 20 70 50 72 65 76 54 72 75 6e     if( pPrevTrun
317c0 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  k ){.        /* 
317d0 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30  EVIDENCE-OF: R-0
317e0 31 35 30 36 2d 31 31 30 35 33 20 54 68 65 20 66  1506-11053 The f
317f0 69 72 73 74 20 69 6e 74 65 67 65 72 20 6f 6e 20  irst integer on 
31800 61 20 66 72 65 65 6c 69 73 74 20 74 72 75 6e 6b  a freelist trunk
31810 20 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a   page.        **
31820 20 69 73 20 74 68 65 20 70 61 67 65 20 6e 75 6d   is the page num
31830 62 65 72 20 6f 66 20 74 68 65 20 6e 65 78 74 20  ber of the next 
31840 66 72 65 65 6c 69 73 74 20 74 72 75 6e 6b 20 70  freelist trunk p
31850 61 67 65 20 69 6e 20 74 68 65 20 6c 69 73 74 20  age in the list 
31860 6f 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 7a 65  or.        ** ze
31870 72 6f 20 69 66 20 74 68 69 73 20 69 73 20 74 68  ro if this is th
31880 65 20 6c 61 73 74 20 66 72 65 65 6c 69 73 74 20  e last freelist 
31890 74 72 75 6e 6b 20 70 61 67 65 2e 20 2a 2f 0a 20  trunk page. */. 
318a0 20 20 20 20 20 20 20 69 54 72 75 6e 6b 20 3d 20         iTrunk = 
318b0 67 65 74 34 62 79 74 65 28 26 70 50 72 65 76 54  get4byte(&pPrevT
318c0 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 29 3b  runk->aData[0]);
318d0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
318e0 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43        /* EVIDENC
318f0 45 2d 4f 46 3a 20 52 2d 35 39 38 34 31 2d 31 33  E-OF: R-59841-13
31900 37 39 38 20 54 68 65 20 34 2d 62 79 74 65 20 62  798 The 4-byte b
31910 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65  ig-endian intege
31920 72 20 61 74 20 6f 66 66 73 65 74 20 33 32 0a 20  r at offset 32. 
31930 20 20 20 20 20 20 20 2a 2a 20 73 74 6f 72 65 73         ** stores
31940 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
31950 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 70 61   of the first pa
31960 67 65 20 6f 66 20 74 68 65 20 66 72 65 65 6c 69  ge of the freeli
31970 73 74 2c 20 6f 72 20 7a 65 72 6f 20 69 66 0a 20  st, or zero if. 
31980 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 66 72         ** the fr
31990 65 65 6c 69 73 74 20 69 73 20 65 6d 70 74 79 2e  eelist is empty.
319a0 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 54 72 75   */.        iTru
319b0 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  nk = get4byte(&p
319c0 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d  Page1->aData[32]
319d0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
319e0 20 74 65 73 74 63 61 73 65 28 20 69 54 72 75 6e   testcase( iTrun
319f0 6b 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20 20  k==mxPage );.   
31a00 20 20 20 69 66 28 20 69 54 72 75 6e 6b 3e 6d 78     if( iTrunk>mx
31a10 50 61 67 65 20 7c 7c 20 6e 53 65 61 72 63 68 2b  Page || nSearch+
31a20 2b 20 3e 20 6e 20 29 7b 0a 20 20 20 20 20 20 20  + > n ){.       
31a30 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
31a40 52 55 50 54 5f 50 47 4e 4f 28 70 50 72 65 76 54  RUPT_PGNO(pPrevT
31a50 72 75 6e 6b 20 3f 20 70 50 72 65 76 54 72 75 6e  runk ? pPrevTrun
31a60 6b 2d 3e 70 67 6e 6f 20 3a 20 31 29 3b 0a 20 20  k->pgno : 1);.  
31a70 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
31a80 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74     rc = btreeGet
31a90 55 6e 75 73 65 64 50 61 67 65 28 70 42 74 2c 20  UnusedPage(pBt, 
31aa0 69 54 72 75 6e 6b 2c 20 26 70 54 72 75 6e 6b 2c  iTrunk, &pTrunk,
31ab0 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
31ac0 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
31ad0 20 20 20 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b       pTrunk = 0;
31ae0 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e  .        goto en
31af0 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b  d_allocate_page;
31b00 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
31b10 73 73 65 72 74 28 20 70 54 72 75 6e 6b 21 3d 30  ssert( pTrunk!=0
31b20 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
31b30 28 20 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 21  ( pTrunk->aData!
31b40 3d 30 20 29 3b 0a 20 20 20 20 20 20 2f 2a 20 45  =0 );.      /* E
31b50 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 33  VIDENCE-OF: R-13
31b60 35 32 33 2d 30 34 33 39 34 20 54 68 65 20 73 65  523-04394 The se
31b70 63 6f 6e 64 20 69 6e 74 65 67 65 72 20 6f 6e 20  cond integer on 
31b80 61 20 66 72 65 65 6c 69 73 74 20 74 72 75 6e 6b  a freelist trunk
31b90 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 69   page.      ** i
31ba0 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
31bb0 6c 65 61 66 20 70 61 67 65 20 70 6f 69 6e 74 65  leaf page pointe
31bc0 72 73 20 74 6f 20 66 6f 6c 6c 6f 77 2e 20 2a 2f  rs to follow. */
31bd0 0a 20 20 20 20 20 20 6b 20 3d 20 67 65 74 34 62  .      k = get4b
31be0 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61  yte(&pTrunk->aDa
31bf0 74 61 5b 34 5d 29 3b 0a 20 20 20 20 20 20 69 66  ta[4]);.      if
31c00 28 20 6b 3d 3d 30 20 26 26 20 21 73 65 61 72 63  ( k==0 && !searc
31c10 68 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20  hList ){.       
31c20 20 2f 2a 20 54 68 65 20 74 72 75 6e 6b 20 68 61   /* The trunk ha
31c30 73 20 6e 6f 20 6c 65 61 76 65 73 20 61 6e 64 20  s no leaves and 
31c40 74 68 65 20 6c 69 73 74 20 69 73 20 6e 6f 74 20  the list is not 
31c50 62 65 69 6e 67 20 73 65 61 72 63 68 65 64 2e 20  being searched. 
31c60 0a 20 20 20 20 20 20 20 20 2a 2a 20 53 6f 20 65  .        ** So e
31c70 78 74 72 61 63 74 20 74 68 65 20 74 72 75 6e 6b  xtract the trunk
31c80 20 70 61 67 65 20 69 74 73 65 6c 66 20 61 6e 64   page itself and
31c90 20 75 73 65 20 69 74 20 61 73 20 74 68 65 20 6e   use it as the n
31ca0 65 77 6c 79 20 0a 20 20 20 20 20 20 20 20 2a 2a  ewly .        **
31cb0 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 20   allocated page 
31cc0 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  */.        asser
31cd0 74 28 20 70 50 72 65 76 54 72 75 6e 6b 3d 3d 30  t( pPrevTrunk==0
31ce0 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   );.        rc =
31cf0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
31d00 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61  te(pTrunk->pDbPa
31d10 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ge);.        if(
31d20 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20   rc ){.         
31d30 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
31d40 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20  te_page;.       
31d50 20 7d 0a 20 20 20 20 20 20 20 20 2a 70 50 67 6e   }.        *pPgn
31d60 6f 20 3d 20 69 54 72 75 6e 6b 3b 0a 20 20 20 20  o = iTrunk;.    
31d70 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67      memcpy(&pPag
31d80 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 26  e1->aData[32], &
31d90 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d  pTrunk->aData[0]
31da0 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 2a 70  , 4);.        *p
31db0 70 50 61 67 65 20 3d 20 70 54 72 75 6e 6b 3b 0a  pPage = pTrunk;.
31dc0 20 20 20 20 20 20 20 20 70 54 72 75 6e 6b 20 3d          pTrunk =
31dd0 20 30 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43   0;.        TRAC
31de0 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64  E(("ALLOCATE: %d
31df0 20 74 72 75 6e 6b 20 2d 20 25 64 20 66 72 65 65   trunk - %d free
31e00 20 70 61 67 65 73 20 6c 65 66 74 5c 6e 22 2c 20   pages left\n", 
31e10 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20  *pPgno, n-1));. 
31e20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6b       }else if( k
31e30 3e 28 75 33 32 29 28 70 42 74 2d 3e 75 73 61 62  >(u32)(pBt->usab
31e40 6c 65 53 69 7a 65 2f 34 20 2d 20 32 29 20 29 7b  leSize/4 - 2) ){
31e50 0a 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75  .        /* Valu
31e60 65 20 6f 66 20 6b 20 69 73 20 6f 75 74 20 6f 66  e of k is out of
31e70 20 72 61 6e 67 65 2e 20 20 44 61 74 61 62 61 73   range.  Databas
31e80 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a  e corruption */.
31e90 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
31ea0 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 47 4e 4f  ITE_CORRUPT_PGNO
31eb0 28 69 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20  (iTrunk);.      
31ec0 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63    goto end_alloc
31ed0 61 74 65 5f 70 61 67 65 3b 0a 23 69 66 6e 64 65  ate_page;.#ifnde
31ee0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
31ef0 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 7d  TOVACUUM.      }
31f00 65 6c 73 65 20 69 66 28 20 73 65 61 72 63 68 4c  else if( searchL
31f10 69 73 74 20 0a 20 20 20 20 20 20 20 20 20 20 20  ist .           
31f20 20 26 26 20 28 6e 65 61 72 62 79 3d 3d 69 54 72   && (nearby==iTr
31f30 75 6e 6b 20 7c 7c 20 28 69 54 72 75 6e 6b 3c 6e  unk || (iTrunk<n
31f40 65 61 72 62 79 20 26 26 20 65 4d 6f 64 65 3d 3d  earby && eMode==
31f50 42 54 41 4c 4c 4f 43 5f 4c 45 29 29 20 0a 20 20  BTALLOC_LE)) .  
31f60 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 2f      ){.        /
31f70 2a 20 54 68 65 20 6c 69 73 74 20 69 73 20 62 65  * The list is be
31f80 69 6e 67 20 73 65 61 72 63 68 65 64 20 61 6e 64  ing searched and
31f90 20 74 68 69 73 20 74 72 75 6e 6b 20 70 61 67 65   this trunk page
31fa0 20 69 73 20 74 68 65 20 70 61 67 65 0a 20 20 20   is the page.   
31fb0 20 20 20 20 20 2a 2a 20 74 6f 20 61 6c 6c 6f 63       ** to alloc
31fc0 61 74 65 2c 20 72 65 67 61 72 64 6c 65 73 73 20  ate, regardless 
31fd0 6f 66 20 77 68 65 74 68 65 72 20 69 74 20 68 61  of whether it ha
31fe0 73 20 6c 65 61 76 65 73 2e 0a 20 20 20 20 20 20  s leaves..      
31ff0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 2a 70 50    */.        *pP
32000 67 6e 6f 20 3d 20 69 54 72 75 6e 6b 3b 0a 20 20  gno = iTrunk;.  
32010 20 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20        *ppPage = 
32020 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20  pTrunk;.        
32030 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b 0a  searchList = 0;.
32040 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
32050 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
32060 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b  Trunk->pDbPage);
32070 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20  .        if( rc 
32080 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  ){.          got
32090 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
320a0 61 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  age;.        }. 
320b0 20 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 30 20         if( k==0 
320c0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
320d0 20 21 70 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a   !pPrevTrunk ){.
320e0 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63              memc
320f0 70 79 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  py(&pPage1->aDat
32100 61 5b 33 32 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e  a[32], &pTrunk->
32110 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20  aData[0], 4);.  
32120 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
32130 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
32140 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
32150 65 28 70 50 72 65 76 54 72 75 6e 6b 2d 3e 70 44  e(pPrevTrunk->pD
32160 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
32170 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
32180 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
32190 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
321a0 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20  allocate_page;. 
321b0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
321c0 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
321d0 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61  &pPrevTrunk->aDa
321e0 74 61 5b 30 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e  ta[0], &pTrunk->
321f0 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20  aData[0], 4);.  
32200 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
32210 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
32220 20 20 20 2f 2a 20 54 68 65 20 74 72 75 6e 6b 20     /* The trunk 
32230 70 61 67 65 20 69 73 20 72 65 71 75 69 72 65 64  page is required
32240 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20 62   by the caller b
32250 75 74 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 0a  ut it contains .
32260 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 6f 69            ** poi
32270 6e 74 65 72 73 20 74 6f 20 66 72 65 65 2d 6c 69  nters to free-li
32280 73 74 20 6c 65 61 76 65 73 2e 20 54 68 65 20 66  st leaves. The f
32290 69 72 73 74 20 6c 65 61 66 20 62 65 63 6f 6d 65  irst leaf become
322a0 73 20 61 20 74 72 75 6e 6b 0a 20 20 20 20 20 20  s a trunk.      
322b0 20 20 20 20 2a 2a 20 70 61 67 65 20 69 6e 20 74      ** page in t
322c0 68 69 73 20 63 61 73 65 2e 0a 20 20 20 20 20 20  his case..      
322d0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
322e0 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 54 72   MemPage *pNewTr
322f0 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 50  unk;.          P
32300 67 6e 6f 20 69 4e 65 77 54 72 75 6e 6b 20 3d 20  gno iNewTrunk = 
32310 67 65 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b  get4byte(&pTrunk
32320 2d 3e 61 44 61 74 61 5b 38 5d 29 3b 0a 20 20 20  ->aData[8]);.   
32330 20 20 20 20 20 20 20 69 66 28 20 69 4e 65 77 54         if( iNewT
32340 72 75 6e 6b 3e 6d 78 50 61 67 65 20 29 7b 20 0a  runk>mxPage ){ .
32350 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
32360 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
32370 50 47 4e 4f 28 69 54 72 75 6e 6b 29 3b 0a 20 20  PGNO(iTrunk);.  
32380 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
32390 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65  nd_allocate_page
323a0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
323b0 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
323c0 28 20 69 4e 65 77 54 72 75 6e 6b 3d 3d 6d 78 50  ( iNewTrunk==mxP
323d0 61 67 65 20 29 3b 0a 20 20 20 20 20 20 20 20 20  age );.         
323e0 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 55 6e   rc = btreeGetUn
323f0 75 73 65 64 50 61 67 65 28 70 42 74 2c 20 69 4e  usedPage(pBt, iN
32400 65 77 54 72 75 6e 6b 2c 20 26 70 4e 65 77 54 72  ewTrunk, &pNewTr
32410 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  unk, 0);.       
32420 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
32430 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
32440 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c      goto end_all
32450 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20  ocate_page;.    
32460 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
32470 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
32480 67 65 72 57 72 69 74 65 28 70 4e 65 77 54 72 75  gerWrite(pNewTru
32490 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  nk->pDbPage);.  
324a0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
324b0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
324c0 20 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65           release
324d0 50 61 67 65 28 70 4e 65 77 54 72 75 6e 6b 29 3b  Page(pNewTrunk);
324e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74  .            got
324f0 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
32500 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  age;.          }
32510 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70  .          memcp
32520 79 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44  y(&pNewTrunk->aD
32530 61 74 61 5b 30 5d 2c 20 26 70 54 72 75 6e 6b 2d  ata[0], &pTrunk-
32540 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20  >aData[0], 4);. 
32550 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74           put4byt
32560 65 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44  e(&pNewTrunk->aD
32570 61 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b 0a 20 20  ata[4], k-1);.  
32580 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
32590 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61  pNewTrunk->aData
325a0 5b 38 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44  [8], &pTrunk->aD
325b0 61 74 61 5b 31 32 5d 2c 20 28 6b 2d 31 29 2a 34  ata[12], (k-1)*4
325c0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 6c  );.          rel
325d0 65 61 73 65 50 61 67 65 28 70 4e 65 77 54 72 75  easePage(pNewTru
325e0 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  nk);.          i
325f0 66 28 20 21 70 50 72 65 76 54 72 75 6e 6b 20 29  f( !pPrevTrunk )
32600 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73  {.            as
32610 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
32620 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
32630 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 20 29  age1->pDbPage) )
32640 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 75  ;.            pu
32650 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e  t4byte(&pPage1->
32660 61 44 61 74 61 5b 33 32 5d 2c 20 69 4e 65 77 54  aData[32], iNewT
32670 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20  runk);.         
32680 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
32690 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
326a0 50 61 67 65 72 57 72 69 74 65 28 70 50 72 65 76  PagerWrite(pPrev
326b0 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b  Trunk->pDbPage);
326c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
326d0 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20   rc ){.         
326e0 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c       goto end_al
326f0 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20  locate_page;.   
32700 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
32710 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
32720 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61  &pPrevTrunk->aDa
32730 74 61 5b 30 5d 2c 20 69 4e 65 77 54 72 75 6e 6b  ta[0], iNewTrunk
32740 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
32750 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
32760 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20   pTrunk = 0;.   
32770 20 20 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c       TRACE(("ALL
32780 4f 43 41 54 45 3a 20 25 64 20 74 72 75 6e 6b 20  OCATE: %d trunk 
32790 2d 20 25 64 20 66 72 65 65 20 70 61 67 65 73 20  - %d free pages 
327a0 6c 65 66 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f 2c  left\n", *pPgno,
327b0 20 6e 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a 20   n-1));.#endif. 
327c0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6b       }else if( k
327d0 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  >0 ){.        /*
327e0 20 45 78 74 72 61 63 74 20 61 20 6c 65 61 66 20   Extract a leaf 
327f0 66 72 6f 6d 20 74 68 65 20 74 72 75 6e 6b 20 2a  from the trunk *
32800 2f 0a 20 20 20 20 20 20 20 20 75 33 32 20 63 6c  /.        u32 cl
32810 6f 73 65 73 74 3b 0a 20 20 20 20 20 20 20 20 50  osest;.        P
32820 67 6e 6f 20 69 50 61 67 65 3b 0a 20 20 20 20 20  gno iPage;.     
32830 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72     unsigned char
32840 20 2a 61 44 61 74 61 20 3d 20 70 54 72 75 6e 6b   *aData = pTrunk
32850 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 20 20 20  ->aData;.       
32860 20 69 66 28 20 6e 65 61 72 62 79 3e 30 20 29 7b   if( nearby>0 ){
32870 0a 20 20 20 20 20 20 20 20 20 20 75 33 32 20 69  .          u32 i
32880 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73  ;.          clos
32890 65 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  est = 0;.       
328a0 20 20 20 69 66 28 20 65 4d 6f 64 65 3d 3d 42 54     if( eMode==BT
328b0 41 4c 4c 4f 43 5f 4c 45 20 29 7b 0a 20 20 20 20  ALLOC_LE ){.    
328c0 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
328d0 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20   i<k; i++){.    
328e0 20 20 20 20 20 20 20 20 20 20 69 50 61 67 65 20            iPage 
328f0 3d 20 67 65 74 34 62 79 74 65 28 26 61 44 61 74  = get4byte(&aDat
32900 61 5b 38 2b 69 2a 34 5d 29 3b 0a 20 20 20 20 20  a[8+i*4]);.     
32910 20 20 20 20 20 20 20 20 20 69 66 28 20 69 50 61           if( iPa
32920 67 65 3c 3d 6e 65 61 72 62 79 20 29 7b 0a 20 20  ge<=nearby ){.  
32930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6c                cl
32940 6f 73 65 73 74 20 3d 20 69 3b 0a 20 20 20 20 20  osest = i;.     
32950 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
32960 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
32970 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  }.            }.
32980 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
32990 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74  .            int
329a0 20 64 69 73 74 3b 0a 20 20 20 20 20 20 20 20 20   dist;.         
329b0 20 20 20 64 69 73 74 20 3d 20 73 71 6c 69 74 65     dist = sqlite
329c0 33 41 62 73 49 6e 74 33 32 28 67 65 74 34 62 79  3AbsInt32(get4by
329d0 74 65 28 26 61 44 61 74 61 5b 38 5d 29 20 2d 20  te(&aData[8]) - 
329e0 6e 65 61 72 62 79 29 3b 0a 20 20 20 20 20 20 20  nearby);.       
329f0 20 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c       for(i=1; i<
32a00 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  k; i++){.       
32a10 20 20 20 20 20 20 20 69 6e 74 20 64 32 20 3d 20         int d2 = 
32a20 73 71 6c 69 74 65 33 41 62 73 49 6e 74 33 32 28  sqlite3AbsInt32(
32a30 67 65 74 34 62 79 74 65 28 26 61 44 61 74 61 5b  get4byte(&aData[
32a40 38 2b 69 2a 34 5d 29 20 2d 20 6e 65 61 72 62 79  8+i*4]) - nearby
32a50 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
32a60 20 69 66 28 20 64 32 3c 64 69 73 74 20 29 7b 0a   if( d2<dist ){.
32a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32a80 63 6c 6f 73 65 73 74 20 3d 20 69 3b 0a 20 20 20  closest = i;.   
32a90 20 20 20 20 20 20 20 20 20 20 20 20 20 64 69 73               dis
32aa0 74 20 3d 20 64 32 3b 0a 20 20 20 20 20 20 20 20  t = d2;.        
32ab0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
32ac0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
32ad0 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  }.        }else{
32ae0 0a 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65  .          close
32af0 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  st = 0;.        
32b00 7d 0a 0a 20 20 20 20 20 20 20 20 69 50 61 67 65  }..        iPage
32b10 20 3d 20 67 65 74 34 62 79 74 65 28 26 61 44 61   = get4byte(&aDa
32b20 74 61 5b 38 2b 63 6c 6f 73 65 73 74 2a 34 5d 29  ta[8+closest*4])
32b30 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
32b40 73 65 28 20 69 50 61 67 65 3d 3d 6d 78 50 61 67  se( iPage==mxPag
32b50 65 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  e );.        if(
32b60 20 69 50 61 67 65 3e 6d 78 50 61 67 65 20 29 7b   iPage>mxPage ){
32b70 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
32b80 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50  SQLITE_CORRUPT_P
32b90 47 4e 4f 28 69 54 72 75 6e 6b 29 3b 0a 20 20 20  GNO(iTrunk);.   
32ba0 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
32bb0 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20  allocate_page;. 
32bc0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
32bd0 20 74 65 73 74 63 61 73 65 28 20 69 50 61 67 65   testcase( iPage
32be0 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20 20 20  ==mxPage );.    
32bf0 20 20 20 20 69 66 28 20 21 73 65 61 72 63 68 4c      if( !searchL
32c00 69 73 74 20 0a 20 20 20 20 20 20 20 20 20 7c 7c  ist .         ||
32c10 20 28 69 50 61 67 65 3d 3d 6e 65 61 72 62 79 20   (iPage==nearby 
32c20 7c 7c 20 28 69 50 61 67 65 3c 6e 65 61 72 62 79  || (iPage<nearby
32c30 20 26 26 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c   && eMode==BTALL
32c40 4f 43 5f 4c 45 29 29 20 0a 20 20 20 20 20 20 20  OC_LE)) .       
32c50 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   ){.          in
32c60 74 20 6e 6f 43 6f 6e 74 65 6e 74 3b 0a 20 20 20  t noContent;.   
32c70 20 20 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20         *pPgno = 
32c80 69 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20  iPage;.         
32c90 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54   TRACE(("ALLOCAT
32ca0 45 3a 20 25 64 20 77 61 73 20 6c 65 61 66 20 25  E: %d was leaf %
32cb0 64 20 6f 66 20 25 64 20 6f 6e 20 74 72 75 6e 6b  d of %d on trunk
32cc0 20 25 64 22 0a 20 20 20 20 20 20 20 20 20 20 20   %d".           
32cd0 20 20 20 20 20 20 22 3a 20 25 64 20 6d 6f 72 65        ": %d more
32ce0 20 66 72 65 65 20 70 61 67 65 73 5c 6e 22 2c 0a   free pages\n",.
32cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32d00 20 2a 70 50 67 6e 6f 2c 20 63 6c 6f 73 65 73 74   *pPgno, closest
32d10 2b 31 2c 20 6b 2c 20 70 54 72 75 6e 6b 2d 3e 70  +1, k, pTrunk->p
32d20 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20 20 20  gno, n-1));.    
32d30 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
32d40 65 33 50 61 67 65 72 57 72 69 74 65 28 70 54 72  e3PagerWrite(pTr
32d50 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  unk->pDbPage);. 
32d60 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20           if( rc 
32d70 29 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63  ) goto end_alloc
32d80 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20  ate_page;.      
32d90 20 20 20 20 69 66 28 20 63 6c 6f 73 65 73 74 3c      if( closest<
32da0 6b 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20  k-1 ){.         
32db0 20 20 20 6d 65 6d 63 70 79 28 26 61 44 61 74 61     memcpy(&aData
32dc0 5b 38 2b 63 6c 6f 73 65 73 74 2a 34 5d 2c 20 26  [8+closest*4], &
32dd0 61 44 61 74 61 5b 34 2b 6b 2a 34 5d 2c 20 34 29  aData[4+k*4], 4)
32de0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
32df0 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
32e00 28 26 61 44 61 74 61 5b 34 5d 2c 20 6b 2d 31 29  (&aData[4], k-1)
32e10 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 6f 43 6f  ;.          noCo
32e20 6e 74 65 6e 74 20 3d 20 21 62 74 72 65 65 47 65  ntent = !btreeGe
32e30 74 48 61 73 43 6f 6e 74 65 6e 74 28 70 42 74 2c  tHasContent(pBt,
32e40 20 2a 70 50 67 6e 6f 29 3f 20 50 41 47 45 52 5f   *pPgno)? PAGER_
32e50 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 3a 20  GET_NOCONTENT : 
32e60 30 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  0;.          rc 
32e70 3d 20 62 74 72 65 65 47 65 74 55 6e 75 73 65 64  = btreeGetUnused
32e80 50 61 67 65 28 70 42 74 2c 20 2a 70 50 67 6e 6f  Page(pBt, *pPgno
32e90 2c 20 70 70 50 61 67 65 2c 20 6e 6f 43 6f 6e 74  , ppPage, noCont
32ea0 65 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ent);.          
32eb0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
32ec0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
32ed0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
32ee0 65 72 57 72 69 74 65 28 28 2a 70 70 50 61 67 65  erWrite((*ppPage
32ef0 29 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  )->pDbPage);.   
32f00 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
32f10 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
32f20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 6c 65              rele
32f30 61 73 65 50 61 67 65 28 2a 70 70 50 61 67 65 29  asePage(*ppPage)
32f40 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
32f50 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 20  *ppPage = 0;.   
32f60 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
32f70 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
32f80 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b   searchList = 0;
32f90 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
32fa0 20 7d 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65   }.      release
32fb0 50 61 67 65 28 70 50 72 65 76 54 72 75 6e 6b 29  Page(pPrevTrunk)
32fc0 3b 0a 20 20 20 20 20 20 70 50 72 65 76 54 72 75  ;.      pPrevTru
32fd0 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 7d 77 68 69  nk = 0;.    }whi
32fe0 6c 65 28 20 73 65 61 72 63 68 4c 69 73 74 20 29  le( searchList )
32ff0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
33000 2a 20 54 68 65 72 65 20 61 72 65 20 6e 6f 20 70  * There are no p
33010 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65  ages on the free
33020 6c 69 73 74 2c 20 73 6f 20 61 70 70 65 6e 64 20  list, so append 
33030 61 20 6e 65 77 20 70 61 67 65 20 74 6f 20 74 68  a new page to th
33040 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73  e.    ** databas
33050 65 20 69 6d 61 67 65 2e 0a 20 20 20 20 2a 2a 0a  e image..    **.
33060 20 20 20 20 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c      ** Normally,
33070 20 6e 65 77 20 70 61 67 65 73 20 61 6c 6c 6f 63   new pages alloc
33080 61 74 65 64 20 62 79 20 74 68 69 73 20 62 6c 6f  ated by this blo
33090 63 6b 20 63 61 6e 20 62 65 20 72 65 71 75 65 73  ck can be reques
330a0 74 65 64 20 66 72 6f 6d 20 74 68 65 0a 20 20 20  ted from the.   
330b0 20 2a 2a 20 70 61 67 65 72 20 6c 61 79 65 72 20   ** pager layer 
330c0 77 69 74 68 20 74 68 65 20 27 6e 6f 2d 63 6f 6e  with the 'no-con
330d0 74 65 6e 74 27 20 66 6c 61 67 20 73 65 74 2e 20  tent' flag set. 
330e0 54 68 69 73 20 70 72 65 76 65 6e 74 73 20 74 68  This prevents th
330f0 65 20 70 61 67 65 72 0a 20 20 20 20 2a 2a 20 66  e pager.    ** f
33100 72 6f 6d 20 74 72 79 69 6e 67 20 74 6f 20 72 65  rom trying to re
33110 61 64 20 74 68 65 20 70 61 67 65 73 20 63 6f 6e  ad the pages con
33120 74 65 6e 74 20 66 72 6f 6d 20 64 69 73 6b 2e 20  tent from disk. 
33130 48 6f 77 65 76 65 72 2c 20 69 66 20 74 68 65 0a  However, if the.
33140 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 74      ** current t
33150 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 61  ransaction has a
33160 6c 72 65 61 64 79 20 72 75 6e 20 6f 6e 65 20 6f  lready run one o
33170 72 20 6d 6f 72 65 20 69 6e 63 72 65 6d 65 6e 74  r more increment
33180 61 6c 2d 76 61 63 75 75 6d 0a 20 20 20 20 2a 2a  al-vacuum.    **
33190 20 73 74 65 70 73 2c 20 74 68 65 6e 20 74 68 65   steps, then the
331a0 20 70 61 67 65 20 77 65 20 61 72 65 20 61 62 6f   page we are abo
331b0 75 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d  ut to allocate m
331c0 61 79 20 63 6f 6e 74 61 69 6e 20 63 6f 6e 74 65  ay contain conte
331d0 6e 74 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 69  nt.    ** that i
331e0 73 20 72 65 71 75 69 72 65 64 20 69 6e 20 74 68  s required in th
331f0 65 20 65 76 65 6e 74 20 6f 66 20 61 20 72 6f 6c  e event of a rol
33200 6c 62 61 63 6b 2e 20 49 6e 20 74 68 69 73 20 63  lback. In this c
33210 61 73 65 2c 20 64 6f 0a 20 20 20 20 2a 2a 20 6e  ase, do.    ** n
33220 6f 74 20 73 65 74 20 74 68 65 20 6e 6f 2d 63 6f  ot set the no-co
33230 6e 74 65 6e 74 20 66 6c 61 67 2e 20 54 68 69 73  ntent flag. This
33240 20 63 61 75 73 65 73 20 74 68 65 20 70 61 67 65   causes the page
33250 72 20 74 6f 20 6c 6f 61 64 20 61 6e 64 20 6a 6f  r to load and jo
33260 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 74 68 65  urnal.    ** the
33270 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 63 6f   current page co
33280 6e 74 65 6e 74 20 62 65 66 6f 72 65 20 6f 76 65  ntent before ove
33290 72 77 72 69 74 69 6e 67 20 69 74 2e 0a 20 20 20  rwriting it..   
332a0 20 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f 74 65 20   **.    ** Note 
332b0 74 68 61 74 20 74 68 65 20 70 61 67 65 72 20 77  that the pager w
332c0 69 6c 6c 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79  ill not actually
332d0 20 61 74 74 65 6d 70 74 20 74 6f 20 6c 6f 61 64   attempt to load
332e0 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 20   or journal .   
332f0 20 2a 2a 20 63 6f 6e 74 65 6e 74 20 66 6f 72 20   ** content for 
33300 61 6e 79 20 70 61 67 65 20 74 68 61 74 20 72 65  any page that re
33310 61 6c 6c 79 20 64 6f 65 73 20 6c 69 65 20 70 61  ally does lie pa
33320 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  st the end of th
33330 65 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a  e database.    *
33340 2a 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 20  * file on disk. 
33350 53 6f 20 74 68 65 20 65 66 66 65 63 74 73 20 6f  So the effects o
33360 66 20 64 69 73 61 62 6c 69 6e 67 20 74 68 65 20  f disabling the 
33370 6e 6f 2d 63 6f 6e 74 65 6e 74 20 6f 70 74 69 6d  no-content optim
33380 69 7a 61 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 68  ization.    ** h
33390 65 72 65 20 61 72 65 20 63 6f 6e 66 69 6e 65 64  ere are confined
333a0 20 74 6f 20 74 68 6f 73 65 20 70 61 67 65 73 20   to those pages 
333b0 74 68 61 74 20 6c 69 65 20 62 65 74 77 65 65 6e  that lie between
333c0 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a   the end of the.
333d0 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
333e0 69 6d 61 67 65 20 61 6e 64 20 74 68 65 20 65 6e  image and the en
333f0 64 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  d of the databas
33400 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20  e file..    */. 
33410 20 20 20 69 6e 74 20 62 4e 6f 43 6f 6e 74 65 6e     int bNoConten
33420 74 20 3d 20 28 30 3d 3d 49 66 4e 6f 74 4f 6d 69  t = (0==IfNotOmi
33430 74 41 56 28 70 42 74 2d 3e 62 44 6f 54 72 75 6e  tAV(pBt->bDoTrun
33440 63 61 74 65 29 29 3f 20 50 41 47 45 52 5f 47 45  cate))? PAGER_GE
33450 54 5f 4e 4f 43 4f 4e 54 45 4e 54 3a 30 3b 0a 0a  T_NOCONTENT:0;..
33460 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
33470 50 61 67 65 72 57 72 69 74 65 28 70 42 74 2d 3e  PagerWrite(pBt->
33480 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29  pPage1->pDbPage)
33490 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  ;.    if( rc ) r
334a0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 42  eturn rc;.    pB
334b0 74 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 20 20 20 20  t->nPage++;.    
334c0 69 66 28 20 70 42 74 2d 3e 6e 50 61 67 65 3d 3d  if( pBt->nPage==
334d0 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
334e0 45 28 70 42 74 29 20 29 20 70 42 74 2d 3e 6e 50  E(pBt) ) pBt->nP
334f0 61 67 65 2b 2b 3b 0a 0a 23 69 66 6e 64 65 66 20  age++;..#ifndef 
33500 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
33510 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70  VACUUM.    if( p
33520 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 26  Bt->autoVacuum &
33530 26 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28  & PTRMAP_ISPAGE(
33540 70 42 74 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29  pBt, pBt->nPage)
33550 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   ){.      /* If 
33560 2a 70 50 67 6e 6f 20 72 65 66 65 72 73 20 74 6f  *pPgno refers to
33570 20 61 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70   a pointer-map p
33580 61 67 65 2c 20 61 6c 6c 6f 63 61 74 65 20 74 77  age, allocate tw
33590 6f 20 6e 65 77 20 70 61 67 65 73 0a 20 20 20 20  o new pages.    
335a0 20 20 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20    ** at the end 
335b0 6f 66 20 74 68 65 20 66 69 6c 65 20 69 6e 73 74  of the file inst
335c0 65 61 64 20 6f 66 20 6f 6e 65 2e 20 54 68 65 20  ead of one. The 
335d0 66 69 72 73 74 20 61 6c 6c 6f 63 61 74 65 64 20  first allocated 
335e0 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 62 65  page.      ** be
335f0 63 6f 6d 65 73 20 61 20 6e 65 77 20 70 6f 69 6e  comes a new poin
33600 74 65 72 2d 6d 61 70 20 70 61 67 65 2c 20 74 68  ter-map page, th
33610 65 20 73 65 63 6f 6e 64 20 69 73 20 75 73 65 64  e second is used
33620 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a   by the caller..
33630 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 4d        */.      M
33640 65 6d 50 61 67 65 20 2a 70 50 67 20 3d 20 30 3b  emPage *pPg = 0;
33650 0a 20 20 20 20 20 20 54 52 41 43 45 28 28 22 41  .      TRACE(("A
33660 4c 4c 4f 43 41 54 45 3a 20 25 64 20 66 72 6f 6d  LLOCATE: %d from
33670 20 65 6e 64 20 6f 66 20 66 69 6c 65 20 28 70 6f   end of file (po
33680 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 29 5c  inter-map page)\
33690 6e 22 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 29  n", pBt->nPage))
336a0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
336b0 70 42 74 2d 3e 6e 50 61 67 65 21 3d 50 45 4e 44  pBt->nPage!=PEND
336c0 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
336d0 74 29 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  t) );.      rc =
336e0 20 62 74 72 65 65 47 65 74 55 6e 75 73 65 64 50   btreeGetUnusedP
336f0 61 67 65 28 70 42 74 2c 20 70 42 74 2d 3e 6e 50  age(pBt, pBt->nP
33700 61 67 65 2c 20 26 70 50 67 2c 20 62 4e 6f 43 6f  age, &pPg, bNoCo
33710 6e 74 65 6e 74 29 3b 0a 20 20 20 20 20 20 69 66  ntent);.      if
33720 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
33730 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
33740 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
33750 65 28 70 50 67 2d 3e 70 44 62 50 61 67 65 29 3b  e(pPg->pDbPage);
33760 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65  .        release
33770 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20 20  Page(pPg);.     
33780 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 20   }.      if( rc 
33790 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
337a0 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b     pBt->nPage++;
337b0 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e  .      if( pBt->
337c0 6e 50 61 67 65 3d 3d 50 45 4e 44 49 4e 47 5f 42  nPage==PENDING_B
337d0 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b  YTE_PAGE(pBt) ){
337e0 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 20 7d   pBt->nPage++; }
337f0 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
33800 20 20 70 75 74 34 62 79 74 65 28 32 38 20 2b 20    put4byte(28 + 
33810 28 75 38 2a 29 70 42 74 2d 3e 70 50 61 67 65 31  (u8*)pBt->pPage1
33820 2d 3e 61 44 61 74 61 2c 20 70 42 74 2d 3e 6e 50  ->aData, pBt->nP
33830 61 67 65 29 3b 0a 20 20 20 20 2a 70 50 67 6e 6f  age);.    *pPgno
33840 20 3d 20 70 42 74 2d 3e 6e 50 61 67 65 3b 0a 0a   = pBt->nPage;..
33850 20 20 20 20 61 73 73 65 72 74 28 20 2a 70 50 67      assert( *pPg
33860 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  no!=PENDING_BYTE
33870 5f 50 41 47 45 28 70 42 74 29 20 29 3b 0a 20 20  _PAGE(pBt) );.  
33880 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 55    rc = btreeGetU
33890 6e 75 73 65 64 50 61 67 65 28 70 42 74 2c 20 2a  nusedPage(pBt, *
338a0 70 50 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 62  pPgno, ppPage, b
338b0 4e 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 20 20  NoContent);.    
338c0 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
338d0 72 63 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  rc;.    rc = sql
338e0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 28  ite3PagerWrite((
338f0 2a 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61 67  *ppPage)->pDbPag
33900 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  e);.    if( rc!=
33910 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
33920 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a     releasePage(*
33930 70 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 2a  ppPage);.      *
33940 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20  ppPage = 0;.    
33950 7d 0a 20 20 20 20 54 52 41 43 45 28 28 22 41 4c  }.    TRACE(("AL
33960 4c 4f 43 41 54 45 3a 20 25 64 20 66 72 6f 6d 20  LOCATE: %d from 
33970 65 6e 64 20 6f 66 20 66 69 6c 65 5c 6e 22 2c 20  end of file\n", 
33980 2a 70 50 67 6e 6f 29 29 3b 0a 20 20 7d 0a 0a 20  *pPgno));.  }.. 
33990 20 61 73 73 65 72 74 28 20 2a 70 50 67 6e 6f 21   assert( *pPgno!
339a0 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
339b0 47 45 28 70 42 74 29 20 29 3b 0a 0a 65 6e 64 5f  GE(pBt) );..end_
339c0 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3a 0a 20  allocate_page:. 
339d0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 72   releasePage(pTr
339e0 75 6e 6b 29 3b 0a 20 20 72 65 6c 65 61 73 65 50  unk);.  releaseP
339f0 61 67 65 28 70 50 72 65 76 54 72 75 6e 6b 29 3b  age(pPrevTrunk);
33a00 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53  .  assert( rc!=S
33a10 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 71 6c 69  QLITE_OK || sqli
33a20 74 65 33 50 61 67 65 72 50 61 67 65 52 65 66 63  te3PagerPageRefc
33a30 6f 75 6e 74 28 28 2a 70 70 50 61 67 65 29 2d 3e  ount((*ppPage)->
33a40 70 44 62 50 61 67 65 29 3c 3d 31 20 29 3b 0a 20  pDbPage)<=1 );. 
33a50 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
33a60 49 54 45 5f 4f 4b 20 7c 7c 20 28 2a 70 70 50 61  ITE_OK || (*ppPa
33a70 67 65 29 2d 3e 69 73 49 6e 69 74 3d 3d 30 20 29  ge)->isInit==0 )
33a80 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
33a90 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
33aa0 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f  ction is used to
33ab0 20 61 64 64 20 70 61 67 65 20 69 50 61 67 65 20   add page iPage 
33ac0 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
33ad0 66 69 6c 65 20 66 72 65 65 2d 6c 69 73 74 2e 20  file free-list. 
33ae0 0a 2a 2a 20 49 74 20 69 73 20 61 73 73 75 6d 65  .** It is assume
33af0 64 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  d that the page 
33b00 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 61  is not already a
33b10 20 70 61 72 74 20 6f 66 20 74 68 65 20 66 72 65   part of the fre
33b20 65 2d 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  e-list..**.** Th
33b30 65 20 76 61 6c 75 65 20 70 61 73 73 65 64 20 61  e value passed a
33b40 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  s the second arg
33b50 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75  ument to this fu
33b60 6e 63 74 69 6f 6e 20 69 73 20 6f 70 74 69 6f 6e  nction is option
33b70 61 6c 2e 0a 2a 2a 20 49 66 20 74 68 65 20 63 61  al..** If the ca
33b80 6c 6c 65 72 20 68 61 70 70 65 6e 73 20 74 6f 20  ller happens to 
33b90 68 61 76 65 20 61 20 70 6f 69 6e 74 65 72 20 74  have a pointer t
33ba0 6f 20 74 68 65 20 4d 65 6d 50 61 67 65 20 6f 62  o the MemPage ob
33bb0 6a 65 63 74 20 0a 2a 2a 20 63 6f 72 72 65 73 70  ject .** corresp
33bc0 6f 6e 64 69 6e 67 20 74 6f 20 70 61 67 65 20 69  onding to page i
33bd0 50 61 67 65 20 68 61 6e 64 79 2c 20 69 74 20 6d  Page handy, it m
33be0 61 79 20 70 61 73 73 20 69 74 20 61 73 20 74 68  ay pass it as th
33bf0 65 20 73 65 63 6f 6e 64 20 76 61 6c 75 65 2e 20  e second value. 
33c00 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69  .** Otherwise, i
33c10 74 20 6d 61 79 20 70 61 73 73 20 4e 55 4c 4c 2e  t may pass NULL.
33c20 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 70 6f 69 6e  .**.** If a poin
33c30 74 65 72 20 74 6f 20 61 20 4d 65 6d 50 61 67 65  ter to a MemPage
33c40 20 6f 62 6a 65 63 74 20 69 73 20 70 61 73 73 65   object is passe
33c50 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  d as the second 
33c60 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20 69 74 73  argument,.** its
33c70 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
33c80 20 69 73 20 6e 6f 74 20 61 6c 74 65 72 65 64 20   is not altered 
33c90 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
33ca0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
33cb0 66 72 65 65 50 61 67 65 32 28 42 74 53 68 61 72  freePage2(BtShar
33cc0 65 64 20 2a 70 42 74 2c 20 4d 65 6d 50 61 67 65  ed *pBt, MemPage
33cd0 20 2a 70 4d 65 6d 50 61 67 65 2c 20 50 67 6e 6f   *pMemPage, Pgno
33ce0 20 69 50 61 67 65 29 7b 0a 20 20 4d 65 6d 50 61   iPage){.  MemPa
33cf0 67 65 20 2a 70 54 72 75 6e 6b 20 3d 20 30 3b 20  ge *pTrunk = 0; 
33d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
33d10 2a 20 46 72 65 65 2d 6c 69 73 74 20 74 72 75 6e  * Free-list trun
33d20 6b 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f  k page */.  Pgno
33d30 20 69 54 72 75 6e 6b 20 3d 20 30 3b 20 20 20 20   iTrunk = 0;    
33d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33d50 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 6f  /* Page number o
33d60 66 20 66 72 65 65 2d 6c 69 73 74 20 74 72 75 6e  f free-list trun
33d70 6b 20 70 61 67 65 20 2a 2f 20 0a 20 20 4d 65 6d  k page */ .  Mem
33d80 50 61 67 65 20 2a 70 50 61 67 65 31 20 3d 20 70  Page *pPage1 = p
33d90 42 74 2d 3e 70 50 61 67 65 31 3b 20 20 20 20 20  Bt->pPage1;     
33da0 20 2f 2a 20 4c 6f 63 61 6c 20 72 65 66 65 72 65   /* Local refere
33db0 6e 63 65 20 74 6f 20 70 61 67 65 20 31 20 2a 2f  nce to page 1 */
33dc0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
33dd0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
33de0 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 62         /* Page b
33df0 65 69 6e 67 20 66 72 65 65 64 2e 20 4d 61 79 20  eing freed. May 
33e00 62 65 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69 6e  be NULL. */.  in
33e10 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
33e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33e30 20 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 65    /* Return Code
33e40 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 72 65 65 3b   */.  int nFree;
33e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33e60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 69            /* Ini
33e70 74 69 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70  tial number of p
33e80 61 67 65 73 20 6f 6e 20 66 72 65 65 2d 6c 69 73  ages on free-lis
33e90 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  t */..  assert( 
33ea0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
33eb0 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
33ec0 3b 0a 20 20 61 73 73 65 72 74 28 20 43 4f 52 52  ;.  assert( CORR
33ed0 55 50 54 5f 44 42 20 7c 7c 20 69 50 61 67 65 3e  UPT_DB || iPage>
33ee0 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21  1 );.  assert( !
33ef0 70 4d 65 6d 50 61 67 65 20 7c 7c 20 70 4d 65 6d  pMemPage || pMem
33f00 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 69 50 61 67  Page->pgno==iPag
33f10 65 20 29 3b 0a 0a 20 20 69 66 28 20 69 50 61 67  e );..  if( iPag
33f20 65 3c 32 20 29 20 72 65 74 75 72 6e 20 53 51 4c  e<2 ) return SQL
33f30 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
33f40 3b 0a 20 20 69 66 28 20 70 4d 65 6d 50 61 67 65  ;.  if( pMemPage
33f50 20 29 7b 0a 20 20 20 20 70 50 61 67 65 20 3d 20   ){.    pPage = 
33f60 70 4d 65 6d 50 61 67 65 3b 0a 20 20 20 20 73 71  pMemPage;.    sq
33f70 6c 69 74 65 33 50 61 67 65 72 52 65 66 28 70 50  lite3PagerRef(pP
33f80 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  age->pDbPage);. 
33f90 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67   }else{.    pPag
33fa0 65 20 3d 20 62 74 72 65 65 50 61 67 65 4c 6f 6f  e = btreePageLoo
33fb0 6b 75 70 28 70 42 74 2c 20 69 50 61 67 65 29 3b  kup(pBt, iPage);
33fc0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 63 72 65  .  }..  /* Incre
33fd0 6d 65 6e 74 20 74 68 65 20 66 72 65 65 20 70 61  ment the free pa
33fe0 67 65 20 63 6f 75 6e 74 20 6f 6e 20 70 50 61 67  ge count on pPag
33ff0 65 31 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c  e1 */.  rc = sql
34000 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
34010 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b  Page1->pDbPage);
34020 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f  .  if( rc ) goto
34030 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20   freepage_out;. 
34040 20 6e 46 72 65 65 20 3d 20 67 65 74 34 62 79 74   nFree = get4byt
34050 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  e(&pPage1->aData
34060 5b 33 36 5d 29 3b 0a 20 20 70 75 74 34 62 79 74  [36]);.  put4byt
34070 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  e(&pPage1->aData
34080 5b 33 36 5d 2c 20 6e 46 72 65 65 2b 31 29 3b 0a  [36], nFree+1);.
34090 0a 20 20 69 66 28 20 70 42 74 2d 3e 62 74 73 46  .  if( pBt->btsF
340a0 6c 61 67 73 20 26 20 42 54 53 5f 53 45 43 55 52  lags & BTS_SECUR
340b0 45 5f 44 45 4c 45 54 45 20 29 7b 0a 20 20 20 20  E_DELETE ){.    
340c0 2f 2a 20 49 66 20 74 68 65 20 73 65 63 75 72 65  /* If the secure
340d0 5f 64 65 6c 65 74 65 20 6f 70 74 69 6f 6e 20 69  _delete option i
340e0 73 20 65 6e 61 62 6c 65 64 2c 20 74 68 65 6e 0a  s enabled, then.
340f0 20 20 20 20 2a 2a 20 61 6c 77 61 79 73 20 66 75      ** always fu
34100 6c 6c 79 20 6f 76 65 72 77 72 69 74 65 20 64 65  lly overwrite de
34110 6c 65 74 65 64 20 69 6e 66 6f 72 6d 61 74 69 6f  leted informatio
34120 6e 20 77 69 74 68 20 7a 65 72 6f 73 2e 0a 20 20  n with zeros..  
34130 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 21 70    */.    if( (!p
34140 50 61 67 65 20 26 26 20 28 28 72 63 20 3d 20 62  Page && ((rc = b
34150 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
34160 20 69 50 61 67 65 2c 20 26 70 50 61 67 65 2c 20   iPage, &pPage, 
34170 30 29 29 21 3d 30 29 20 29 0a 20 20 20 20 20 7c  0))!=0) ).     |
34180 7c 20 20 20 20 20 20 20 20 20 20 20 20 28 28 72  |            ((r
34190 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
341a0 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62  Write(pPage->pDb
341b0 50 61 67 65 29 29 21 3d 30 29 0a 20 20 20 20 29  Page))!=0).    )
341c0 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 72 65  {.      goto fre
341d0 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d  epage_out;.    }
341e0 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 50 61 67  .    memset(pPag
341f0 65 2d 3e 61 44 61 74 61 2c 20 30 2c 20 70 50 61  e->aData, 0, pPa
34200 67 65 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a  ge->pBt->pageSiz
34210 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  e);.  }..  /* If
34220 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 75   the database su
34230 70 70 6f 72 74 73 20 61 75 74 6f 2d 76 61 63 75  pports auto-vacu
34240 75 6d 2c 20 77 72 69 74 65 20 61 6e 20 65 6e 74  um, write an ent
34250 72 79 20 69 6e 20 74 68 65 20 70 6f 69 6e 74 65  ry in the pointe
34260 72 2d 6d 61 70 0a 20 20 2a 2a 20 74 6f 20 69 6e  r-map.  ** to in
34270 64 69 63 61 74 65 20 74 68 61 74 20 74 68 65 20  dicate that the 
34280 70 61 67 65 20 69 73 20 66 72 65 65 2e 0a 20 20  page is free..  
34290 2a 2f 0a 20 20 69 66 28 20 49 53 41 55 54 4f 56  */.  if( ISAUTOV
342a0 41 43 55 55 4d 20 29 7b 0a 20 20 20 20 70 74 72  ACUUM ){.    ptr
342b0 6d 61 70 50 75 74 28 70 42 74 2c 20 69 50 61 67  mapPut(pBt, iPag
342c0 65 2c 20 50 54 52 4d 41 50 5f 46 52 45 45 50 41  e, PTRMAP_FREEPA
342d0 47 45 2c 20 30 2c 20 26 72 63 29 3b 0a 20 20 20  GE, 0, &rc);.   
342e0 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 66   if( rc ) goto f
342f0 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d  reepage_out;.  }
34300 0a 0a 20 20 2f 2a 20 4e 6f 77 20 6d 61 6e 69 70  ..  /* Now manip
34310 75 6c 61 74 65 20 74 68 65 20 61 63 74 75 61 6c  ulate the actual
34320 20 64 61 74 61 62 61 73 65 20 66 72 65 65 2d 6c   database free-l
34330 69 73 74 20 73 74 72 75 63 74 75 72 65 2e 20 54  ist structure. T
34340 68 65 72 65 20 61 72 65 20 74 77 6f 0a 20 20 2a  here are two.  *
34350 2a 20 70 6f 73 73 69 62 69 6c 69 74 69 65 73 2e  * possibilities.
34360 20 49 66 20 74 68 65 20 66 72 65 65 2d 6c 69 73   If the free-lis
34370 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 65  t is currently e
34380 6d 70 74 79 2c 20 6f 72 20 69 66 20 74 68 65 20  mpty, or if the 
34390 66 69 72 73 74 0a 20 20 2a 2a 20 74 72 75 6e 6b  first.  ** trunk
343a0 20 70 61 67 65 20 69 6e 20 74 68 65 20 66 72 65   page in the fre
343b0 65 2d 6c 69 73 74 20 69 73 20 66 75 6c 6c 2c 20  e-list is full, 
343c0 74 68 65 6e 20 74 68 69 73 20 70 61 67 65 20 77  then this page w
343d0 69 6c 6c 20 62 65 63 6f 6d 65 20 61 0a 20 20 2a  ill become a.  *
343e0 2a 20 6e 65 77 20 66 72 65 65 2d 6c 69 73 74 20  * new free-list 
343f0 74 72 75 6e 6b 20 70 61 67 65 2e 20 4f 74 68 65  trunk page. Othe
34400 72 77 69 73 65 2c 20 69 74 20 77 69 6c 6c 20 62  rwise, it will b
34410 65 63 6f 6d 65 20 61 20 6c 65 61 66 20 6f 66 20  ecome a leaf of 
34420 74 68 65 0a 20 20 2a 2a 20 66 69 72 73 74 20 74  the.  ** first t
34430 72 75 6e 6b 20 70 61 67 65 20 69 6e 20 74 68 65  runk page in the
34440 20 63 75 72 72 65 6e 74 20 66 72 65 65 2d 6c 69   current free-li
34450 73 74 2e 20 54 68 69 73 20 62 6c 6f 63 6b 20 74  st. This block t
34460 65 73 74 73 20 69 66 20 69 74 0a 20 20 2a 2a 20  ests if it.  ** 
34470 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 61  is possible to a
34480 64 64 20 74 68 65 20 70 61 67 65 20 61 73 20 61  dd the page as a
34490 20 6e 65 77 20 66 72 65 65 2d 6c 69 73 74 20 6c   new free-list l
344a0 65 61 66 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  eaf..  */.  if( 
344b0 6e 46 72 65 65 21 3d 30 20 29 7b 0a 20 20 20 20  nFree!=0 ){.    
344c0 75 33 32 20 6e 4c 65 61 66 3b 20 20 20 20 20 20  u32 nLeaf;      
344d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 69            /* Ini
344e0 74 69 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 6c  tial number of l
344f0 65 61 66 20 63 65 6c 6c 73 20 6f 6e 20 74 72 75  eaf cells on tru
34500 6e 6b 20 70 61 67 65 20 2a 2f 0a 0a 20 20 20 20  nk page */..    
34510 69 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74  iTrunk = get4byt
34520 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  e(&pPage1->aData
34530 5b 33 32 5d 29 3b 0a 20 20 20 20 72 63 20 3d 20  [32]);.    rc = 
34540 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  btreeGetPage(pBt
34550 2c 20 69 54 72 75 6e 6b 2c 20 26 70 54 72 75 6e  , iTrunk, &pTrun
34560 6b 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  k, 0);.    if( r
34570 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
34580 20 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70        goto freep
34590 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 0a  age_out;.    }..
345a0 20 20 20 20 6e 4c 65 61 66 20 3d 20 67 65 74 34      nLeaf = get4
345b0 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44  byte(&pTrunk->aD
345c0 61 74 61 5b 34 5d 29 3b 0a 20 20 20 20 61 73 73  ata[4]);.    ass
345d0 65 72 74 28 20 70 42 74 2d 3e 75 73 61 62 6c 65  ert( pBt->usable
345e0 53 69 7a 65 3e 33 32 20 29 3b 0a 20 20 20 20 69  Size>32 );.    i
345f0 66 28 20 6e 4c 65 61 66 20 3e 20 28 75 33 32 29  f( nLeaf > (u32)
34600 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f  pBt->usableSize/
34610 34 20 2d 20 32 20 29 7b 0a 20 20 20 20 20 20 72  4 - 2 ){.      r
34620 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
34630 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67  PT_BKPT;.      g
34640 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74  oto freepage_out
34650 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
34660 6e 4c 65 61 66 20 3c 20 28 75 33 32 29 70 42 74  nLeaf < (u32)pBt
34670 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d  ->usableSize/4 -
34680 20 38 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49   8 ){.      /* I
34690 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65 72  n this case ther
346a0 65 20 69 73 20 72 6f 6f 6d 20 6f 6e 20 74 68 65  e is room on the
346b0 20 74 72 75 6e 6b 20 70 61 67 65 20 74 6f 20 69   trunk page to i
346c0 6e 73 65 72 74 20 74 68 65 20 70 61 67 65 0a 20  nsert the page. 
346d0 20 20 20 20 20 2a 2a 20 62 65 69 6e 67 20 66 72       ** being fr
346e0 65 65 64 20 61 73 20 61 20 6e 65 77 20 6c 65 61  eed as a new lea
346f0 66 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  f..      **.    
34700 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74    ** Note that t
34710 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20 69 73  he trunk page is
34720 20 6e 6f 74 20 72 65 61 6c 6c 79 20 66 75 6c 6c   not really full
34730 20 75 6e 74 69 6c 20 69 74 20 63 6f 6e 74 61 69   until it contai
34740 6e 73 0a 20 20 20 20 20 20 2a 2a 20 75 73 61 62  ns.      ** usab
34750 6c 65 53 69 7a 65 2f 34 20 2d 20 32 20 65 6e 74  leSize/4 - 2 ent
34760 72 69 65 73 2c 20 6e 6f 74 20 75 73 61 62 6c 65  ries, not usable
34770 53 69 7a 65 2f 34 20 2d 20 38 20 65 6e 74 72 69  Size/4 - 8 entri
34780 65 73 20 61 73 20 77 65 20 68 61 76 65 0a 20 20  es as we have.  
34790 20 20 20 20 2a 2a 20 63 6f 64 65 64 2e 20 20 42      ** coded.  B
347a0 75 74 20 64 75 65 20 74 6f 20 61 20 63 6f 64 69  ut due to a codi
347b0 6e 67 20 65 72 72 6f 72 20 69 6e 20 76 65 72 73  ng error in vers
347c0 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 70  ions of SQLite p
347d0 72 69 6f 72 20 74 6f 0a 20 20 20 20 20 20 2a 2a  rior to.      **
347e0 20 33 2e 36 2e 30 2c 20 64 61 74 61 62 61 73 65   3.6.0, database
347f0 73 20 77 69 74 68 20 66 72 65 65 6c 69 73 74 20  s with freelist 
34800 74 72 75 6e 6b 20 70 61 67 65 73 20 68 6f 6c 64  trunk pages hold
34810 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 0a 20 20  ing more than.  
34820 20 20 20 20 2a 2a 20 75 73 61 62 6c 65 53 69 7a      ** usableSiz
34830 65 2f 34 20 2d 20 38 20 65 6e 74 72 69 65 73 20  e/4 - 8 entries 
34840 77 69 6c 6c 20 62 65 20 72 65 70 6f 72 74 65 64  will be reported
34850 20 61 73 20 63 6f 72 72 75 70 74 2e 20 20 49 6e   as corrupt.  In
34860 20 6f 72 64 65 72 0a 20 20 20 20 20 20 2a 2a 20   order.      ** 
34870 74 6f 20 6d 61 69 6e 74 61 69 6e 20 62 61 63 6b  to maintain back
34880 77 61 72 64 73 20 63 6f 6d 70 61 74 69 62 69 6c  wards compatibil
34890 69 74 79 20 77 69 74 68 20 6f 6c 64 65 72 20 76  ity with older v
348a0 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74  ersions of SQLit
348b0 65 2c 0a 20 20 20 20 20 20 2a 2a 20 77 65 20 77  e,.      ** we w
348c0 69 6c 6c 20 63 6f 6e 74 69 6e 75 65 20 74 6f 20  ill continue to 
348d0 72 65 73 74 72 69 63 74 20 74 68 65 20 6e 75 6d  restrict the num
348e0 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 74  ber of entries t
348f0 6f 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d  o usableSize/4 -
34900 20 38 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20   8.      ** for 
34910 6e 6f 77 2e 20 20 41 74 20 73 6f 6d 65 20 70 6f  now.  At some po
34920 69 6e 74 20 69 6e 20 74 68 65 20 66 75 74 75 72  int in the futur
34930 65 20 28 6f 6e 63 65 20 65 76 65 72 79 6f 6e 65  e (once everyone
34940 20 68 61 73 20 75 70 67 72 61 64 65 64 0a 20 20   has upgraded.  
34950 20 20 20 20 2a 2a 20 74 6f 20 33 2e 36 2e 30 20      ** to 3.6.0 
34960 6f 72 20 6c 61 74 65 72 29 20 77 65 20 73 68 6f  or later) we sho
34970 75 6c 64 20 63 6f 6e 73 69 64 65 72 20 66 69 78  uld consider fix
34980 69 6e 67 20 74 68 65 20 63 6f 6e 64 69 74 69 6f  ing the conditio
34990 6e 61 6c 20 61 62 6f 76 65 0a 20 20 20 20 20 20  nal above.      
349a0 2a 2a 20 74 6f 20 72 65 61 64 20 22 75 73 61 62  ** to read "usab
349b0 6c 65 53 69 7a 65 2f 34 2d 32 22 20 69 6e 73 74  leSize/4-2" inst
349c0 65 61 64 20 6f 66 20 22 75 73 61 62 6c 65 53 69  ead of "usableSi
349d0 7a 65 2f 34 2d 38 22 2e 0a 20 20 20 20 20 20 2a  ze/4-8"..      *
349e0 2a 0a 20 20 20 20 20 20 2a 2a 20 45 56 49 44 45  *.      ** EVIDE
349f0 4e 43 45 2d 4f 46 3a 20 52 2d 31 39 39 32 30 2d  NCE-OF: R-19920-
34a00 31 31 35 37 36 20 48 6f 77 65 76 65 72 2c 20 6e  11576 However, n
34a10 65 77 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66  ewer versions of
34a20 20 53 51 4c 69 74 65 20 73 74 69 6c 6c 0a 20 20   SQLite still.  
34a30 20 20 20 20 2a 2a 20 61 76 6f 69 64 20 75 73 69      ** avoid usi
34a40 6e 67 20 74 68 65 20 6c 61 73 74 20 73 69 78 20  ng the last six 
34a50 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 66  entries in the f
34a60 72 65 65 6c 69 73 74 20 74 72 75 6e 6b 20 70 61  reelist trunk pa
34a70 67 65 20 61 72 72 61 79 20 69 6e 0a 20 20 20 20  ge array in.    
34a80 20 20 2a 2a 20 6f 72 64 65 72 20 74 68 61 74 20    ** order that 
34a90 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 20 63  database files c
34aa0 72 65 61 74 65 64 20 62 79 20 6e 65 77 65 72 20  reated by newer 
34ab0 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69  versions of SQLi
34ac0 74 65 20 63 61 6e 20 62 65 0a 20 20 20 20 20 20  te can be.      
34ad0 2a 2a 20 72 65 61 64 20 62 79 20 6f 6c 64 65 72  ** read by older
34ae0 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c   versions of SQL
34af0 69 74 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ite..      */.  
34b00 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
34b10 50 61 67 65 72 57 72 69 74 65 28 70 54 72 75 6e  PagerWrite(pTrun
34b20 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  k->pDbPage);.   
34b30 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
34b40 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
34b50 70 75 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b  put4byte(&pTrunk
34b60 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 6e 4c 65 61  ->aData[4], nLea
34b70 66 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 70 75  f+1);.        pu
34b80 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e  t4byte(&pTrunk->
34b90 61 44 61 74 61 5b 38 2b 6e 4c 65 61 66 2a 34 5d  aData[8+nLeaf*4]
34ba0 2c 20 69 50 61 67 65 29 3b 0a 20 20 20 20 20 20  , iPage);.      
34bb0 20 20 69 66 28 20 70 50 61 67 65 20 26 26 20 28    if( pPage && (
34bc0 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20  pBt->btsFlags & 
34bd0 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54  BTS_SECURE_DELET
34be0 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  E)==0 ){.       
34bf0 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 44     sqlite3PagerD
34c00 6f 6e 74 57 72 69 74 65 28 70 50 61 67 65 2d 3e  ontWrite(pPage->
34c10 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
34c20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20 3d    }.        rc =
34c30 20 62 74 72 65 65 53 65 74 48 61 73 43 6f 6e 74   btreeSetHasCont
34c40 65 6e 74 28 70 42 74 2c 20 69 50 61 67 65 29 3b  ent(pBt, iPage);
34c50 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 54  .      }.      T
34c60 52 41 43 45 28 28 22 46 52 45 45 2d 50 41 47 45  RACE(("FREE-PAGE
34c70 3a 20 25 64 20 6c 65 61 66 20 6f 6e 20 74 72 75  : %d leaf on tru
34c80 6e 6b 20 70 61 67 65 20 25 64 5c 6e 22 2c 70 50  nk page %d\n",pP
34c90 61 67 65 2d 3e 70 67 6e 6f 2c 70 54 72 75 6e 6b  age->pgno,pTrunk
34ca0 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20  ->pgno));.      
34cb0 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75  goto freepage_ou
34cc0 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  t;.    }.  }..  
34cd0 2f 2a 20 49 66 20 63 6f 6e 74 72 6f 6c 20 66 6c  /* If control fl
34ce0 6f 77 73 20 74 6f 20 74 68 69 73 20 70 6f 69 6e  ows to this poin
34cf0 74 2c 20 74 68 65 6e 20 69 74 20 77 61 73 20 6e  t, then it was n
34d00 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 61  ot possible to a
34d10 64 64 20 74 68 65 0a 20 20 2a 2a 20 74 68 65 20  dd the.  ** the 
34d20 70 61 67 65 20 62 65 69 6e 67 20 66 72 65 65 64  page being freed
34d30 20 61 73 20 61 20 6c 65 61 66 20 70 61 67 65 20   as a leaf page 
34d40 6f 66 20 74 68 65 20 66 69 72 73 74 20 74 72 75  of the first tru
34d50 6e 6b 20 69 6e 20 74 68 65 20 66 72 65 65 2d 6c  nk in the free-l
34d60 69 73 74 2e 0a 20 20 2a 2a 20 50 6f 73 73 69 62  ist..  ** Possib
34d70 6c 79 20 62 65 63 61 75 73 65 20 74 68 65 20 66  ly because the f
34d80 72 65 65 2d 6c 69 73 74 20 69 73 20 65 6d 70 74  ree-list is empt
34d90 79 2c 20 6f 72 20 70 6f 73 73 69 62 6c 79 20 62  y, or possibly b
34da0 65 63 61 75 73 65 20 74 68 65 20 0a 20 20 2a 2a  ecause the .  **
34db0 20 66 69 72 73 74 20 74 72 75 6e 6b 20 69 6e 20   first trunk in 
34dc0 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 69 73  the free-list is
34dd0 20 66 75 6c 6c 2e 20 45 69 74 68 65 72 20 77 61   full. Either wa
34de0 79 2c 20 74 68 65 20 70 61 67 65 20 62 65 69 6e  y, the page bein
34df0 67 20 66 72 65 65 64 0a 20 20 2a 2a 20 77 69 6c  g freed.  ** wil
34e00 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 6e 65 77  l become the new
34e10 20 66 69 72 73 74 20 74 72 75 6e 6b 20 70 61 67   first trunk pag
34e20 65 20 69 6e 20 74 68 65 20 66 72 65 65 2d 6c 69  e in the free-li
34e30 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  st..  */.  if( p
34e40 50 61 67 65 3d 3d 30 20 26 26 20 53 51 4c 49 54  Page==0 && SQLIT
34e50 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 62 74 72 65  E_OK!=(rc = btre
34e60 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 50  eGetPage(pBt, iP
34e70 61 67 65 2c 20 26 70 50 61 67 65 2c 20 30 29 29  age, &pPage, 0))
34e80 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 66 72 65   ){.    goto fre
34e90 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20  epage_out;.  }. 
34ea0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
34eb0 65 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70  erWrite(pPage->p
34ec0 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72  DbPage);.  if( r
34ed0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
34ee0 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67      goto freepag
34ef0 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 70 75 74  e_out;.  }.  put
34f00 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61  4byte(pPage->aDa
34f10 74 61 2c 20 69 54 72 75 6e 6b 29 3b 0a 20 20 70  ta, iTrunk);.  p
34f20 75 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e  ut4byte(&pPage->
34f30 61 44 61 74 61 5b 34 5d 2c 20 30 29 3b 0a 20 20  aData[4], 0);.  
34f40 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31  put4byte(&pPage1
34f50 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 69 50 61  ->aData[32], iPa
34f60 67 65 29 3b 0a 20 20 54 52 41 43 45 28 28 22 46  ge);.  TRACE(("F
34f70 52 45 45 2d 50 41 47 45 3a 20 25 64 20 6e 65 77  REE-PAGE: %d new
34f80 20 74 72 75 6e 6b 20 70 61 67 65 20 72 65 70 6c   trunk page repl
34f90 61 63 69 6e 67 20 25 64 5c 6e 22 2c 20 70 50 61  acing %d\n", pPa
34fa0 67 65 2d 3e 70 67 6e 6f 2c 20 69 54 72 75 6e 6b  ge->pgno, iTrunk
34fb0 29 29 3b 0a 0a 66 72 65 65 70 61 67 65 5f 6f 75  ));..freepage_ou
34fc0 74 3a 0a 20 20 69 66 28 20 70 50 61 67 65 20 29  t:.  if( pPage )
34fd0 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49  {.    pPage->isI
34fe0 6e 69 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  nit = 0;.  }.  r
34ff0 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65  eleasePage(pPage
35000 29 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65  );.  releasePage
35010 28 70 54 72 75 6e 6b 29 3b 0a 20 20 72 65 74 75  (pTrunk);.  retu
35020 72 6e 20 72 63 3b 0a 7d 0a 73 74 61 74 69 63 20  rn rc;.}.static 
35030 76 6f 69 64 20 66 72 65 65 50 61 67 65 28 4d 65  void freePage(Me
35040 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e  mPage *pPage, in
35050 74 20 2a 70 52 43 29 7b 0a 20 20 69 66 28 20 28  t *pRC){.  if( (
35060 2a 70 52 43 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b  *pRC)==SQLITE_OK
35070 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 66   ){.    *pRC = f
35080 72 65 65 50 61 67 65 32 28 70 50 61 67 65 2d 3e  reePage2(pPage->
35090 70 42 74 2c 20 70 50 61 67 65 2c 20 70 50 61 67  pBt, pPage, pPag
350a0 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a 7d 0a  e->pgno);.  }.}.
350b0 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6e 79 20  ./*.** Free any 
350c0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61  overflow pages a
350d0 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
350e0 68 65 20 67 69 76 65 6e 20 43 65 6c 6c 2e 20 20  he given Cell.  
350f0 53 74 6f 72 65 0a 2a 2a 20 73 69 7a 65 20 69 6e  Store.** size in
35100 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20  formation about 
35110 74 68 65 20 63 65 6c 6c 20 69 6e 20 70 49 6e 66  the cell in pInf
35120 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  o..*/.static int
35130 20 63 6c 65 61 72 43 65 6c 6c 28 0a 20 20 4d 65   clearCell(.  Me
35140 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20  mPage *pPage,   
35150 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
35160 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  ge that contains
35170 20 74 68 65 20 43 65 6c 6c 20 2a 2f 0a 20 20 75   the Cell */.  u
35180 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 43  nsigned char *pC
35190 65 6c 6c 2c 20 20 20 20 2f 2a 20 46 69 72 73 74  ell,    /* First
351a0 20 62 79 74 65 20 6f 66 20 74 68 65 20 43 65 6c   byte of the Cel
351b0 6c 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20  l */.  CellInfo 
351c0 2a 70 49 6e 66 6f 20 20 20 20 20 20 20 20 20 20  *pInfo          
351d0 2f 2a 20 53 69 7a 65 20 69 6e 66 6f 72 6d 61 74  /* Size informat
351e0 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 63 65  ion about the ce
351f0 6c 6c 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68 61  ll */.){.  BtSha
35200 72 65 64 20 2a 70 42 74 3b 0a 20 20 50 67 6e 6f  red *pBt;.  Pgno
35210 20 6f 76 66 6c 50 67 6e 6f 3b 0a 20 20 69 6e 74   ovflPgno;.  int
35220 20 72 63 3b 0a 20 20 69 6e 74 20 6e 4f 76 66 6c   rc;.  int nOvfl
35230 3b 0a 20 20 75 33 32 20 6f 76 66 6c 50 61 67 65  ;.  u32 ovflPage
35240 53 69 7a 65 3b 0a 0a 20 20 61 73 73 65 72 74 28  Size;..  assert(
35250 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
35260 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
35270 6d 75 74 65 78 29 20 29 3b 0a 20 20 70 50 61 67  mutex) );.  pPag
35280 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28 70 50  e->xParseCell(pP
35290 61 67 65 2c 20 70 43 65 6c 6c 2c 20 70 49 6e 66  age, pCell, pInf
352a0 6f 29 3b 0a 20 20 69 66 28 20 70 49 6e 66 6f 2d  o);.  if( pInfo-
352b0 3e 6e 4c 6f 63 61 6c 3d 3d 70 49 6e 66 6f 2d 3e  >nLocal==pInfo->
352c0 6e 50 61 79 6c 6f 61 64 20 29 7b 0a 20 20 20 20  nPayload ){.    
352d0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
352e0 3b 20 20 2f 2a 20 4e 6f 20 6f 76 65 72 66 6c 6f  ;  /* No overflo
352f0 77 20 70 61 67 65 73 2e 20 52 65 74 75 72 6e 20  w pages. Return 
35300 77 69 74 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e  without doing an
35310 79 74 68 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20  ything */.  }.  
35320 74 65 73 74 63 61 73 65 28 20 70 43 65 6c 6c 20  testcase( pCell 
35330 2b 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d  + pInfo->nSize =
35340 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e  = pPage->aDataEn
35350 64 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  d );.  testcase(
35360 20 70 43 65 6c 6c 20 2b 20 28 70 49 6e 66 6f 2d   pCell + (pInfo-
35370 3e 6e 53 69 7a 65 2d 31 29 20 3d 3d 20 70 50 61  >nSize-1) == pPa
35380 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 29 3b 0a  ge->aDataEnd );.
35390 20 20 69 66 28 20 70 43 65 6c 6c 20 2b 20 70 49    if( pCell + pI
353a0 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3e 20 70 50 61  nfo->nSize > pPa
353b0 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 29 7b 0a  ge->aDataEnd ){.
353c0 20 20 20 20 2f 2a 20 43 65 6c 6c 20 65 78 74 65      /* Cell exte
353d0 6e 64 73 20 70 61 73 74 20 65 6e 64 20 6f 66 20  nds past end of 
353e0 70 61 67 65 20 2a 2f 0a 20 20 20 20 72 65 74 75  page */.    retu
353f0 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
35400 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20  T_PAGE(pPage);. 
35410 20 7d 0a 20 20 6f 76 66 6c 50 67 6e 6f 20 3d 20   }.  ovflPgno = 
35420 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c 20 2b  get4byte(pCell +
35430 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 2d 20   pInfo->nSize - 
35440 34 29 3b 0a 20 20 70 42 74 20 3d 20 70 50 61 67  4);.  pBt = pPag
35450 65 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74  e->pBt;.  assert
35460 28 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ( pBt->usableSiz
35470 65 20 3e 20 34 20 29 3b 0a 20 20 6f 76 66 6c 50  e > 4 );.  ovflP
35480 61 67 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75  ageSize = pBt->u
35490 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20  sableSize - 4;. 
354a0 20 6e 4f 76 66 6c 20 3d 20 28 70 49 6e 66 6f 2d   nOvfl = (pInfo-
354b0 3e 6e 50 61 79 6c 6f 61 64 20 2d 20 70 49 6e 66  >nPayload - pInf
354c0 6f 2d 3e 6e 4c 6f 63 61 6c 20 2b 20 6f 76 66 6c  o->nLocal + ovfl
354d0 50 61 67 65 53 69 7a 65 20 2d 20 31 29 2f 6f 76  PageSize - 1)/ov
354e0 66 6c 50 61 67 65 53 69 7a 65 3b 0a 20 20 61 73  flPageSize;.  as
354f0 73 65 72 74 28 20 6e 4f 76 66 6c 3e 30 20 7c 7c  sert( nOvfl>0 ||
35500 20 0a 20 20 20 20 28 43 4f 52 52 55 50 54 5f 44   .    (CORRUPT_D
35510 42 20 26 26 20 28 70 49 6e 66 6f 2d 3e 6e 50 61  B && (pInfo->nPa
35520 79 6c 6f 61 64 20 2b 20 6f 76 66 6c 50 61 67 65  yload + ovflPage
35530 53 69 7a 65 29 3c 6f 76 66 6c 50 61 67 65 53 69  Size)<ovflPageSi
35540 7a 65 29 0a 20 20 29 3b 0a 20 20 77 68 69 6c 65  ze).  );.  while
35550 28 20 6e 4f 76 66 6c 2d 2d 20 29 7b 0a 20 20 20  ( nOvfl-- ){.   
35560 20 50 67 6e 6f 20 69 4e 65 78 74 20 3d 20 30 3b   Pgno iNext = 0;
35570 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f  .    MemPage *pO
35580 76 66 6c 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  vfl = 0;.    if(
35590 20 6f 76 66 6c 50 67 6e 6f 3c 32 20 7c 7c 20 6f   ovflPgno<2 || o
355a0 76 66 6c 50 67 6e 6f 3e 62 74 72 65 65 50 61 67  vflPgno>btreePag
355b0 65 63 6f 75 6e 74 28 70 42 74 29 20 29 7b 0a 20  ecount(pBt) ){. 
355c0 20 20 20 20 20 2f 2a 20 30 20 69 73 20 6e 6f 74       /* 0 is not
355d0 20 61 20 6c 65 67 61 6c 20 70 61 67 65 20 6e 75   a legal page nu
355e0 6d 62 65 72 20 61 6e 64 20 70 61 67 65 20 31 20  mber and page 1 
355f0 63 61 6e 6e 6f 74 20 62 65 20 61 6e 20 0a 20 20  cannot be an .  
35600 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20      ** overflow 
35610 70 61 67 65 2e 20 54 68 65 72 65 66 6f 72 65 20  page. Therefore 
35620 69 66 20 6f 76 66 6c 50 67 6e 6f 3c 32 20 6f 72  if ovflPgno<2 or
35630 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66   past the end of
35640 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 66   the .      ** f
35650 69 6c 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ile the database
35660 20 6d 75 73 74 20 62 65 20 63 6f 72 72 75 70 74   must be corrupt
35670 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72  . */.      retur
35680 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
35690 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20  _BKPT;.    }.   
356a0 20 69 66 28 20 6e 4f 76 66 6c 20 29 7b 0a 20 20   if( nOvfl ){.  
356b0 20 20 20 20 72 63 20 3d 20 67 65 74 4f 76 65 72      rc = getOver
356c0 66 6c 6f 77 50 61 67 65 28 70 42 74 2c 20 6f 76  flowPage(pBt, ov
356d0 66 6c 50 67 6e 6f 2c 20 26 70 4f 76 66 6c 2c 20  flPgno, &pOvfl, 
356e0 26 69 4e 65 78 74 29 3b 0a 20 20 20 20 20 20 69  &iNext);.      i
356f0 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
35700 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  c;.    }..    if
35710 28 20 28 20 70 4f 76 66 6c 20 7c 7c 20 28 28 70  ( ( pOvfl || ((p
35720 4f 76 66 6c 20 3d 20 62 74 72 65 65 50 61 67 65  Ovfl = btreePage
35730 4c 6f 6f 6b 75 70 28 70 42 74 2c 20 6f 76 66 6c  Lookup(pBt, ovfl
35740 50 67 6e 6f 29 29 21 3d 30 29 20 29 0a 20 20 20  Pgno))!=0) ).   
35750 20 20 26 26 20 73 71 6c 69 74 65 33 50 61 67 65    && sqlite3Page
35760 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28 70 4f  rPageRefcount(pO
35770 76 66 6c 2d 3e 70 44 62 50 61 67 65 29 21 3d 31  vfl->pDbPage)!=1
35780 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a  .    ){.      /*
35790 20 54 68 65 72 65 20 69 73 20 6e 6f 20 72 65 61   There is no rea
357a0 73 6f 6e 20 61 6e 79 20 63 75 72 73 6f 72 20 73  son any cursor s
357b0 68 6f 75 6c 64 20 68 61 76 65 20 61 6e 20 6f 75  hould have an ou
357c0 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65  tstanding refere
357d0 6e 63 65 20 0a 20 20 20 20 20 20 2a 2a 20 74 6f  nce .      ** to
357e0 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
357f0 65 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 61  e belonging to a
35800 20 63 65 6c 6c 20 74 68 61 74 20 69 73 20 62 65   cell that is be
35810 69 6e 67 20 64 65 6c 65 74 65 64 2f 75 70 64 61  ing deleted/upda
35820 74 65 64 2e 0a 20 20 20 20 20 20 2a 2a 20 53 6f  ted..      ** So
35830 20 69 66 20 74 68 65 72 65 20 65 78 69 73 74 73   if there exists
35840 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 72   more than one r
35850 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 69 73  eference to this
35860 20 70 61 67 65 2c 20 74 68 65 6e 20 69 74 20 0a   page, then it .
35870 20 20 20 20 20 20 2a 2a 20 6d 75 73 74 20 6e 6f        ** must no
35880 74 20 72 65 61 6c 6c 79 20 62 65 20 61 6e 20 6f  t really be an o
35890 76 65 72 66 6c 6f 77 20 70 61 67 65 20 61 6e 64  verflow page and
358a0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6d 75   the database mu
358b0 73 74 20 62 65 20 63 6f 72 72 75 70 74 2e 20 0a  st be corrupt. .
358c0 20 20 20 20 20 20 2a 2a 20 49 74 20 69 73 20 68        ** It is h
358d0 65 6c 70 66 75 6c 20 74 6f 20 64 65 74 65 63 74  elpful to detect
358e0 20 74 68 69 73 20 62 65 66 6f 72 65 20 63 61 6c   this before cal
358f0 6c 69 6e 67 20 66 72 65 65 50 61 67 65 32 28 29  ling freePage2()
35900 2c 20 61 73 20 0a 20 20 20 20 20 20 2a 2a 20 66  , as .      ** f
35910 72 65 65 50 61 67 65 32 28 29 20 6d 61 79 20 7a  reePage2() may z
35920 65 72 6f 20 74 68 65 20 70 61 67 65 20 63 6f 6e  ero the page con
35930 74 65 6e 74 73 20 69 66 20 73 65 63 75 72 65 2d  tents if secure-
35940 64 65 6c 65 74 65 20 6d 6f 64 65 20 69 73 0a 20  delete mode is. 
35950 20 20 20 20 20 2a 2a 20 65 6e 61 62 6c 65 64 2e       ** enabled.
35960 20 49 66 20 74 68 69 73 20 27 6f 76 65 72 66 6c   If this 'overfl
35970 6f 77 27 20 70 61 67 65 20 68 61 70 70 65 6e 73  ow' page happens
35980 20 74 6f 20 62 65 20 61 20 70 61 67 65 20 74 68   to be a page th
35990 61 74 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  at the.      ** 
359a0 63 61 6c 6c 65 72 20 69 73 20 69 74 65 72 61 74  caller is iterat
359b0 69 6e 67 20 74 68 72 6f 75 67 68 20 6f 72 20 75  ing through or u
359c0 73 69 6e 67 20 69 6e 20 73 6f 6d 65 20 6f 74 68  sing in some oth
359d0 65 72 20 77 61 79 2c 20 74 68 69 73 0a 20 20 20  er way, this.   
359e0 20 20 20 2a 2a 20 63 61 6e 20 62 65 20 70 72 6f     ** can be pro
359f0 62 6c 65 6d 61 74 69 63 2e 0a 20 20 20 20 20 20  blematic..      
35a00 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  */.      rc = SQ
35a10 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
35a20 54 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  T;.    }else{.  
35a30 20 20 20 20 72 63 20 3d 20 66 72 65 65 50 61 67      rc = freePag
35a40 65 32 28 70 42 74 2c 20 70 4f 76 66 6c 2c 20 6f  e2(pBt, pOvfl, o
35a50 76 66 6c 50 67 6e 6f 29 3b 0a 20 20 20 20 7d 0a  vflPgno);.    }.
35a60 0a 20 20 20 20 69 66 28 20 70 4f 76 66 6c 20 29  .    if( pOvfl )
35a70 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  {.      sqlite3P
35a80 61 67 65 72 55 6e 72 65 66 28 70 4f 76 66 6c 2d  agerUnref(pOvfl-
35a90 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 7d  >pDbPage);.    }
35aa0 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
35ab0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 6f 76 66  turn rc;.    ovf
35ac0 6c 50 67 6e 6f 20 3d 20 69 4e 65 78 74 3b 0a 20  lPgno = iNext;. 
35ad0 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
35ae0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
35af0 43 72 65 61 74 65 20 74 68 65 20 62 79 74 65 20  Create the byte 
35b00 73 65 71 75 65 6e 63 65 20 75 73 65 64 20 74 6f  sequence used to
35b10 20 72 65 70 72 65 73 65 6e 74 20 61 20 63 65 6c   represent a cel
35b20 6c 20 6f 6e 20 70 61 67 65 20 70 50 61 67 65 0a  l on page pPage.
35b30 2a 2a 20 61 6e 64 20 77 72 69 74 65 20 74 68 61  ** and write tha
35b40 74 20 62 79 74 65 20 73 65 71 75 65 6e 63 65 20  t byte sequence 
35b50 69 6e 74 6f 20 70 43 65 6c 6c 5b 5d 2e 20 20 4f  into pCell[].  O
35b60 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61 72  verflow pages ar
35b70 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61  e.** allocated a
35b80 6e 64 20 66 69 6c 6c 65 64 20 69 6e 20 61 73 20  nd filled in as 
35b90 6e 65 63 65 73 73 61 72 79 2e 20 20 54 68 65 20  necessary.  The 
35ba0 63 61 6c 6c 69 6e 67 20 70 72 6f 63 65 64 75 72  calling procedur
35bb0 65 0a 2a 2a 20 69 73 20 72 65 73 70 6f 6e 73 69  e.** is responsi
35bc0 62 6c 65 20 66 6f 72 20 6d 61 6b 69 6e 67 20 73  ble for making s
35bd0 75 72 65 20 73 75 66 66 69 63 69 65 6e 74 20 73  ure sufficient s
35be0 70 61 63 65 20 68 61 73 20 62 65 65 6e 20 61 6c  pace has been al
35bf0 6c 6f 63 61 74 65 64 0a 2a 2a 20 66 6f 72 20 70  located.** for p
35c00 43 65 6c 6c 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 4e 6f  Cell[]..**.** No
35c10 74 65 20 74 68 61 74 20 70 43 65 6c 6c 20 64 6f  te that pCell do
35c20 65 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79  es not necessary
35c30 20 6e 65 65 64 20 74 6f 20 70 6f 69 6e 74 20 74   need to point t
35c40 6f 20 74 68 65 20 70 50 61 67 65 2d 3e 61 44 61  o the pPage->aDa
35c50 74 61 0a 2a 2a 20 61 72 65 61 2e 20 20 70 43 65  ta.** area.  pCe
35c60 6c 6c 20 6d 69 67 68 74 20 70 6f 69 6e 74 20 74  ll might point t
35c70 6f 20 73 6f 6d 65 20 74 65 6d 70 6f 72 61 72 79  o some temporary
35c80 20 73 74 6f 72 61 67 65 2e 20 20 54 68 65 20 63   storage.  The c
35c90 65 6c 6c 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 63  ell will.** be c
35ca0 6f 6e 73 74 72 75 63 74 65 64 20 69 6e 20 74 68  onstructed in th
35cb0 69 73 20 74 65 6d 70 6f 72 61 72 79 20 61 72 65  is temporary are
35cc0 61 20 74 68 65 6e 20 63 6f 70 69 65 64 20 69 6e  a then copied in
35cd0 74 6f 20 70 50 61 67 65 2d 3e 61 44 61 74 61 0a  to pPage->aData.
35ce0 2a 2a 20 6c 61 74 65 72 2e 0a 2a 2f 0a 73 74 61  ** later..*/.sta
35cf0 74 69 63 20 69 6e 74 20 66 69 6c 6c 49 6e 43 65  tic int fillInCe
35d00 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  ll(.  MemPage *p
35d10 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 20  Page,           
35d20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65       /* The page
35d30 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74   that contains t
35d40 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 6e 73  he cell */.  uns
35d50 69 67 6e 65 64 20 63 68 61 72 20 2a 70 43 65 6c  igned char *pCel
35d60 6c 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43  l,          /* C
35d70 6f 6d 70 6c 65 74 65 20 74 65 78 74 20 6f 66 20  omplete text of 
35d80 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 63 6f  the cell */.  co
35d90 6e 73 74 20 42 74 72 65 65 50 61 79 6c 6f 61 64  nst BtreePayload
35da0 20 2a 70 58 2c 20 20 20 20 20 20 20 20 2f 2a 20   *pX,        /* 
35db0 50 61 79 6c 6f 61 64 20 77 69 74 68 20 77 68 69  Payload with whi
35dc0 63 68 20 74 6f 20 63 6f 6e 73 74 72 75 63 74 20  ch to construct 
35dd0 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e  the cell */.  in
35de0 74 20 2a 70 6e 53 69 7a 65 20 20 20 20 20 20 20  t *pnSize       
35df0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
35e00 57 72 69 74 65 20 63 65 6c 6c 20 73 69 7a 65 20  Write cell size 
35e10 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  here */.){.  int
35e20 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 63 6f 6e   nPayload;.  con
35e30 73 74 20 75 38 20 2a 70 53 72 63 3b 0a 20 20 69  st u8 *pSrc;.  i
35e40 6e 74 20 6e 53 72 63 2c 20 6e 2c 20 72 63 2c 20  nt nSrc, n, rc, 
35e50 6d 6e 3b 0a 20 20 69 6e 74 20 73 70 61 63 65 4c  mn;.  int spaceL
35e60 65 66 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  eft;.  MemPage *
35e70 70 54 6f 52 65 6c 65 61 73 65 3b 0a 20 20 75 6e  pToRelease;.  un
35e80 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 50 72  signed char *pPr
35e90 69 6f 72 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  ior;.  unsigned 
35ea0 63 68 61 72 20 2a 70 50 61 79 6c 6f 61 64 3b 0a  char *pPayload;.
35eb0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b    BtShared *pBt;
35ec0 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 4f 76 66 6c  .  Pgno pgnoOvfl
35ed0 3b 0a 20 20 69 6e 74 20 6e 48 65 61 64 65 72 3b  ;.  int nHeader;
35ee0 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
35ef0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
35f00 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
35f10 29 20 29 3b 0a 0a 20 20 2f 2a 20 70 50 61 67 65  ) );..  /* pPage
35f20 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72   is not necessar
35f30 69 6c 79 20 77 72 69 74 65 61 62 6c 65 20 73 69  ily writeable si
35f40 6e 63 65 20 70 43 65 6c 6c 20 6d 69 67 68 74 20  nce pCell might 
35f50 62 65 20 61 75 78 69 6c 69 61 72 79 0a 20 20 2a  be auxiliary.  *
35f60 2a 20 62 75 66 66 65 72 20 73 70 61 63 65 20 74  * buffer space t
35f70 68 61 74 20 69 73 20 73 65 70 61 72 61 74 65 20  hat is separate 
35f80 66 72 6f 6d 20 74 68 65 20 70 50 61 67 65 20 62  from the pPage b
35f90 75 66 66 65 72 20 61 72 65 61 20 2a 2f 0a 20 20  uffer area */.  
35fa0 61 73 73 65 72 74 28 20 70 43 65 6c 6c 3c 70 50  assert( pCell<pP
35fb0 61 67 65 2d 3e 61 44 61 74 61 20 7c 7c 20 70 43  age->aData || pC
35fc0 65 6c 6c 3e 3d 26 70 50 61 67 65 2d 3e 61 44 61  ell>=&pPage->aDa
35fd0 74 61 5b 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70  ta[pPage->pBt->p
35fe0 61 67 65 53 69 7a 65 5d 0a 20 20 20 20 20 20 20  ageSize].       
35ff0 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 50       || sqlite3P
36000 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
36010 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
36020 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e  );..  /* Fill in
36030 20 74 68 65 20 68 65 61 64 65 72 2e 20 2a 2f 0a   the header. */.
36040 20 20 6e 48 65 61 64 65 72 20 3d 20 70 50 61 67    nHeader = pPag
36050 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b  e->childPtrSize;
36060 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e  .  if( pPage->in
36070 74 4b 65 79 20 29 7b 0a 20 20 20 20 6e 50 61 79  tKey ){.    nPay
36080 6c 6f 61 64 20 3d 20 70 58 2d 3e 6e 44 61 74 61  load = pX->nData
36090 20 2b 20 70 58 2d 3e 6e 5a 65 72 6f 3b 0a 20 20   + pX->nZero;.  
360a0 20 20 70 53 72 63 20 3d 20 70 58 2d 3e 70 44 61    pSrc = pX->pDa
360b0 74 61 3b 0a 20 20 20 20 6e 53 72 63 20 3d 20 70  ta;.    nSrc = p
360c0 58 2d 3e 6e 44 61 74 61 3b 0a 20 20 20 20 61 73  X->nData;.    as
360d0 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 6e 74  sert( pPage->int
360e0 4b 65 79 4c 65 61 66 20 29 3b 20 2f 2a 20 66 69  KeyLeaf ); /* fi
360f0 6c 6c 49 6e 43 65 6c 6c 28 29 20 6f 6e 6c 79 20  llInCell() only 
36100 63 61 6c 6c 65 64 20 66 6f 72 20 6c 65 61 76 65  called for leave
36110 73 20 2a 2f 0a 20 20 20 20 6e 48 65 61 64 65 72  s */.    nHeader
36120 20 2b 3d 20 70 75 74 56 61 72 69 6e 74 33 32 28   += putVarint32(
36130 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c  &pCell[nHeader],
36140 20 6e 50 61 79 6c 6f 61 64 29 3b 0a 20 20 20 20   nPayload);.    
36150 6e 48 65 61 64 65 72 20 2b 3d 20 70 75 74 56 61  nHeader += putVa
36160 72 69 6e 74 28 26 70 43 65 6c 6c 5b 6e 48 65 61  rint(&pCell[nHea
36170 64 65 72 5d 2c 20 2a 28 75 36 34 2a 29 26 70 58  der], *(u64*)&pX
36180 2d 3e 6e 4b 65 79 29 3b 0a 20 20 7d 65 6c 73 65  ->nKey);.  }else
36190 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 58  {.    assert( pX
361a0 2d 3e 6e 4b 65 79 3c 3d 30 78 37 66 66 66 66 66  ->nKey<=0x7fffff
361b0 66 66 20 26 26 20 70 58 2d 3e 70 4b 65 79 21 3d  ff && pX->pKey!=
361c0 30 20 29 3b 0a 20 20 20 20 6e 53 72 63 20 3d 20  0 );.    nSrc = 
361d0 6e 50 61 79 6c 6f 61 64 20 3d 20 28 69 6e 74 29  nPayload = (int)
361e0 70 58 2d 3e 6e 4b 65 79 3b 0a 20 20 20 20 70 53  pX->nKey;.    pS
361f0 72 63 20 3d 20 70 58 2d 3e 70 4b 65 79 3b 0a 20  rc = pX->pKey;. 
36200 20 20 20 6e 48 65 61 64 65 72 20 2b 3d 20 70 75     nHeader += pu
36210 74 56 61 72 69 6e 74 33 32 28 26 70 43 65 6c 6c  tVarint32(&pCell
36220 5b 6e 48 65 61 64 65 72 5d 2c 20 6e 50 61 79 6c  [nHeader], nPayl
36230 6f 61 64 29 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f  oad);.  }.  .  /
36240 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 70 61  * Fill in the pa
36250 79 6c 6f 61 64 20 2a 2f 0a 20 20 70 50 61 79 6c  yload */.  pPayl
36260 6f 61 64 20 3d 20 26 70 43 65 6c 6c 5b 6e 48 65  oad = &pCell[nHe
36270 61 64 65 72 5d 3b 0a 20 20 69 66 28 20 6e 50 61  ader];.  if( nPa
36280 79 6c 6f 61 64 3c 3d 70 50 61 67 65 2d 3e 6d 61  yload<=pPage->ma
36290 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 2f 2a  xLocal ){.    /*
362a0 20 54 68 69 73 20 69 73 20 74 68 65 20 63 6f 6d   This is the com
362b0 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20 65  mon case where e
362c0 76 65 72 79 74 68 69 6e 67 20 66 69 74 73 20 6f  verything fits o
362d0 6e 20 74 68 65 20 62 74 72 65 65 20 70 61 67 65  n the btree page
362e0 0a 20 20 20 20 2a 2a 20 61 6e 64 20 6e 6f 20 6f  .    ** and no o
362f0 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61 72  verflow pages ar
36300 65 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20  e required. */. 
36310 20 20 20 6e 20 3d 20 6e 48 65 61 64 65 72 20 2b     n = nHeader +
36320 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20 74   nPayload;.    t
36330 65 73 74 63 61 73 65 28 20 6e 3d 3d 33 20 29 3b  estcase( n==3 );
36340 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e  .    testcase( n
36350 3d 3d 34 20 29 3b 0a 20 20 20 20 69 66 28 20 6e  ==4 );.    if( n
36360 3c 34 20 29 20 6e 20 3d 20 34 3b 0a 20 20 20 20  <4 ) n = 4;.    
36370 2a 70 6e 53 69 7a 65 20 3d 20 6e 3b 0a 20 20 20  *pnSize = n;.   
36380 20 61 73 73 65 72 74 28 20 6e 53 72 63 3c 3d 6e   assert( nSrc<=n
36390 50 61 79 6c 6f 61 64 20 29 3b 0a 20 20 20 20 74  Payload );.    t
363a0 65 73 74 63 61 73 65 28 20 6e 53 72 63 3c 6e 50  estcase( nSrc<nP
363b0 61 79 6c 6f 61 64 20 29 3b 0a 20 20 20 20 6d 65  ayload );.    me
363c0 6d 63 70 79 28 70 50 61 79 6c 6f 61 64 2c 20 70  mcpy(pPayload, p
363d0 53 72 63 2c 20 6e 53 72 63 29 3b 0a 20 20 20 20  Src, nSrc);.    
363e0 6d 65 6d 73 65 74 28 70 50 61 79 6c 6f 61 64 2b  memset(pPayload+
363f0 6e 53 72 63 2c 20 30 2c 20 6e 50 61 79 6c 6f 61  nSrc, 0, nPayloa
36400 64 2d 6e 53 72 63 29 3b 0a 20 20 20 20 72 65 74  d-nSrc);.    ret
36410 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
36420 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 72   }..  /* If we r
36430 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74 2c  each this point,
36440 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 73   it means that s
36450 6f 6d 65 20 6f 66 20 74 68 65 20 63 6f 6e 74 65  ome of the conte
36460 6e 74 20 77 69 6c 6c 20 6e 65 65 64 0a 20 20 2a  nt will need.  *
36470 2a 20 74 6f 20 73 70 69 6c 6c 20 6f 6e 74 6f 20  * to spill onto 
36480 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 0a  overflow pages..
36490 20 20 2a 2f 0a 20 20 6d 6e 20 3d 20 70 50 61 67    */.  mn = pPag
364a0 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 6e  e->minLocal;.  n
364b0 20 3d 20 6d 6e 20 2b 20 28 6e 50 61 79 6c 6f 61   = mn + (nPayloa
364c0 64 20 2d 20 6d 6e 29 20 25 20 28 70 50 61 67 65  d - mn) % (pPage
364d0 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
364e0 65 20 2d 20 34 29 3b 0a 20 20 74 65 73 74 63 61  e - 4);.  testca
364f0 73 65 28 20 6e 3d 3d 70 50 61 67 65 2d 3e 6d 61  se( n==pPage->ma
36500 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 74 65 73 74  xLocal );.  test
36510 63 61 73 65 28 20 6e 3d 3d 70 50 61 67 65 2d 3e  case( n==pPage->
36520 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20  maxLocal+1 );.  
36530 69 66 28 20 6e 20 3e 20 70 50 61 67 65 2d 3e 6d  if( n > pPage->m
36540 61 78 4c 6f 63 61 6c 20 29 20 6e 20 3d 20 6d 6e  axLocal ) n = mn
36550 3b 0a 20 20 73 70 61 63 65 4c 65 66 74 20 3d 20  ;.  spaceLeft = 
36560 6e 3b 0a 20 20 2a 70 6e 53 69 7a 65 20 3d 20 6e  n;.  *pnSize = n
36570 20 2b 20 6e 48 65 61 64 65 72 20 2b 20 34 3b 0a   + nHeader + 4;.
36580 20 20 70 50 72 69 6f 72 20 3d 20 26 70 43 65 6c    pPrior = &pCel
36590 6c 5b 6e 48 65 61 64 65 72 2b 6e 5d 3b 0a 20 20  l[nHeader+n];.  
365a0 70 54 6f 52 65 6c 65 61 73 65 20 3d 20 30 3b 0a  pToRelease = 0;.
365b0 20 20 70 67 6e 6f 4f 76 66 6c 20 3d 20 30 3b 0a    pgnoOvfl = 0;.
365c0 20 20 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70    pBt = pPage->p
365d0 42 74 3b 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69  Bt;..  /* At thi
365e0 73 20 70 6f 69 6e 74 20 76 61 72 69 61 62 6c 65  s point variable
365f0 73 20 73 68 6f 75 6c 64 20 62 65 20 73 65 74 20  s should be set 
36600 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 2a 2a  as follows:.  **
36610 0a 20 20 2a 2a 20 20 20 6e 50 61 79 6c 6f 61 64  .  **   nPayload
36620 20 20 20 20 20 20 20 20 20 20 20 54 6f 74 61 6c             Total
36630 20 70 61 79 6c 6f 61 64 20 73 69 7a 65 20 69 6e   payload size in
36640 20 62 79 74 65 73 0a 20 20 2a 2a 20 20 20 70 50   bytes.  **   pP
36650 61 79 6c 6f 61 64 20 20 20 20 20 20 20 20 20 20  ayload          
36660 20 42 65 67 69 6e 20 77 72 69 74 69 6e 67 20 70   Begin writing p
36670 61 79 6c 6f 61 64 20 68 65 72 65 0a 20 20 2a 2a  ayload here.  **
36680 20 20 20 73 70 61 63 65 4c 65 66 74 20 20 20 20     spaceLeft    
36690 20 20 20 20 20 20 53 70 61 63 65 20 61 76 61 69        Space avai
366a0 6c 61 62 6c 65 20 61 74 20 70 50 61 79 6c 6f 61  lable at pPayloa
366b0 64 2e 20 20 49 66 20 6e 50 61 79 6c 6f 61 64 3e  d.  If nPayload>
366c0 73 70 61 63 65 4c 65 66 74 2c 0a 20 20 2a 2a 20  spaceLeft,.  ** 
366d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
366e0 20 20 20 20 20 74 68 61 74 20 6d 65 61 6e 73 20       that means 
366f0 63 6f 6e 74 65 6e 74 20 6d 75 73 74 20 73 70 69  content must spi
36700 6c 6c 20 69 6e 74 6f 20 6f 76 65 72 66 6c 6f 77  ll into overflow
36710 20 70 61 67 65 73 2e 0a 20 20 2a 2a 20 20 20 2a   pages..  **   *
36720 70 6e 53 69 7a 65 20 20 20 20 20 20 20 20 20 20  pnSize          
36730 20 20 53 69 7a 65 20 6f 66 20 74 68 65 20 6c 6f    Size of the lo
36740 63 61 6c 20 63 65 6c 6c 20 28 6e 6f 74 20 63 6f  cal cell (not co
36750 75 6e 74 69 6e 67 20 6f 76 65 72 66 6c 6f 77 20  unting overflow 
36760 70 61 67 65 73 29 0a 20 20 2a 2a 20 20 20 70 50  pages).  **   pP
36770 72 69 6f 72 20 20 20 20 20 20 20 20 20 20 20 20  rior            
36780 20 57 68 65 72 65 20 74 6f 20 77 72 69 74 65 20   Where to write 
36790 74 68 65 20 70 67 6e 6f 20 6f 66 20 74 68 65 20  the pgno of the 
367a0 66 69 72 73 74 20 6f 76 65 72 66 6c 6f 77 20 70  first overflow p
367b0 61 67 65 0a 20 20 2a 2a 0a 20 20 2a 2a 20 55 73  age.  **.  ** Us
367c0 65 20 61 20 63 61 6c 6c 20 74 6f 20 62 74 72 65  e a call to btre
367d0 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29 20  eParseCellPtr() 
367e0 74 6f 20 76 65 72 69 66 79 20 74 68 61 74 20 74  to verify that t
367f0 68 65 20 76 61 6c 75 65 73 20 61 62 6f 76 65 0a  he values above.
36800 20 20 2a 2a 20 77 65 72 65 20 63 6f 6d 70 75 74    ** were comput
36810 65 64 20 63 6f 72 72 65 63 74 6c 79 2e 0a 20 20  ed correctly..  
36820 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
36830 5f 44 45 42 55 47 0a 20 20 7b 0a 20 20 20 20 43  _DEBUG.  {.    C
36840 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20  ellInfo info;.  
36850 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43    pPage->xParseC
36860 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  ell(pPage, pCell
36870 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 61 73  , &info);.    as
36880 73 65 72 74 28 20 6e 48 65 61 64 65 72 3d 3d 28  sert( nHeader==(
36890 69 6e 74 29 28 69 6e 66 6f 2e 70 50 61 79 6c 6f  int)(info.pPaylo
368a0 61 64 20 2d 20 70 43 65 6c 6c 29 20 29 3b 0a 20  ad - pCell) );. 
368b0 20 20 20 61 73 73 65 72 74 28 20 69 6e 66 6f 2e     assert( info.
368c0 6e 4b 65 79 3d 3d 70 58 2d 3e 6e 4b 65 79 20 29  nKey==pX->nKey )
368d0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 2a 70  ;.    assert( *p
368e0 6e 53 69 7a 65 20 3d 3d 20 69 6e 66 6f 2e 6e 53  nSize == info.nS
368f0 69 7a 65 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ize );.    asser
36900 74 28 20 73 70 61 63 65 4c 65 66 74 20 3d 3d 20  t( spaceLeft == 
36910 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 3b 0a 20  info.nLocal );. 
36920 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
36930 57 72 69 74 65 20 74 68 65 20 70 61 79 6c 6f 61  Write the payloa
36940 64 20 69 6e 74 6f 20 74 68 65 20 6c 6f 63 61 6c  d into the local
36950 20 43 65 6c 6c 20 61 6e 64 20 61 6e 79 20 65 78   Cell and any ex
36960 74 72 61 20 69 6e 74 6f 20 6f 76 65 72 66 6c 6f  tra into overflo
36970 77 20 70 61 67 65 73 20 2a 2f 0a 20 20 77 68 69  w pages */.  whi
36980 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 6e 20 3d  le( 1 ){.    n =
36990 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20 69   nPayload;.    i
369a0 66 28 20 6e 3e 73 70 61 63 65 4c 65 66 74 20 29  f( n>spaceLeft )
369b0 20 6e 20 3d 20 73 70 61 63 65 4c 65 66 74 3b 0a   n = spaceLeft;.
369c0 0a 20 20 20 20 2f 2a 20 49 66 20 70 54 6f 52 65  .    /* If pToRe
369d0 6c 65 61 73 65 20 69 73 20 6e 6f 74 20 7a 65 72  lease is not zer
369e0 6f 20 74 68 61 6e 20 70 50 61 79 6c 6f 61 64 20  o than pPayload 
369f0 70 6f 69 6e 74 73 20 69 6e 74 6f 20 74 68 65 20  points into the 
36a00 64 61 74 61 20 61 72 65 61 0a 20 20 20 20 2a 2a  data area.    **
36a10 20 6f 66 20 70 54 6f 52 65 6c 65 61 73 65 2e 20   of pToRelease. 
36a20 20 4d 61 6b 65 20 73 75 72 65 20 70 54 6f 52 65   Make sure pToRe
36a30 6c 65 61 73 65 20 69 73 20 73 74 69 6c 6c 20 77  lease is still w
36a40 72 69 74 65 61 62 6c 65 2e 20 2a 2f 0a 20 20 20  riteable. */.   
36a50 20 61 73 73 65 72 74 28 20 70 54 6f 52 65 6c 65   assert( pToRele
36a60 61 73 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65  ase==0 || sqlite
36a70 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
36a80 65 28 70 54 6f 52 65 6c 65 61 73 65 2d 3e 70 44  e(pToRelease->pD
36a90 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 2f  bPage) );..    /
36aa0 2a 20 49 66 20 70 50 61 79 6c 6f 61 64 20 69 73  * If pPayload is
36ab0 20 70 61 72 74 20 6f 66 20 74 68 65 20 64 61 74   part of the dat
36ac0 61 20 61 72 65 61 20 6f 66 20 70 50 61 67 65 2c  a area of pPage,
36ad0 20 74 68 65 6e 20 6d 61 6b 65 20 73 75 72 65 20   then make sure 
36ae0 70 50 61 67 65 0a 20 20 20 20 2a 2a 20 69 73 20  pPage.    ** is 
36af0 73 74 69 6c 6c 20 77 72 69 74 65 61 62 6c 65 20  still writeable 
36b00 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
36b10 50 61 79 6c 6f 61 64 3c 70 50 61 67 65 2d 3e 61  Payload<pPage->a
36b20 44 61 74 61 20 7c 7c 20 70 50 61 79 6c 6f 61 64  Data || pPayload
36b30 3e 3d 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  >=&pPage->aData[
36b40 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d 0a 20  pBt->pageSize]. 
36b50 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71             || sq
36b60 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
36b70 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
36b80 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 69 66  Page) );..    if
36b90 28 20 6e 53 72 63 3e 3d 6e 20 29 7b 0a 20 20 20  ( nSrc>=n ){.   
36ba0 20 20 20 6d 65 6d 63 70 79 28 70 50 61 79 6c 6f     memcpy(pPaylo
36bb0 61 64 2c 20 70 53 72 63 2c 20 6e 29 3b 0a 20 20  ad, pSrc, n);.  
36bc0 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 53 72 63    }else if( nSrc
36bd0 3e 30 20 29 7b 0a 20 20 20 20 20 20 6e 20 3d 20  >0 ){.      n = 
36be0 6e 53 72 63 3b 0a 20 20 20 20 20 20 6d 65 6d 63  nSrc;.      memc
36bf0 70 79 28 70 50 61 79 6c 6f 61 64 2c 20 70 53 72  py(pPayload, pSr
36c00 63 2c 20 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65  c, n);.    }else
36c10 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70  {.      memset(p
36c20 50 61 79 6c 6f 61 64 2c 20 30 2c 20 6e 29 3b 0a  Payload, 0, n);.
36c30 20 20 20 20 7d 0a 20 20 20 20 6e 50 61 79 6c 6f      }.    nPaylo
36c40 61 64 20 2d 3d 20 6e 3b 0a 20 20 20 20 69 66 28  ad -= n;.    if(
36c50 20 6e 50 61 79 6c 6f 61 64 3c 3d 30 20 29 20 62   nPayload<=0 ) b
36c60 72 65 61 6b 3b 0a 20 20 20 20 70 50 61 79 6c 6f  reak;.    pPaylo
36c70 61 64 20 2b 3d 20 6e 3b 0a 20 20 20 20 70 53 72  ad += n;.    pSr
36c80 63 20 2b 3d 20 6e 3b 0a 20 20 20 20 6e 53 72 63  c += n;.    nSrc
36c90 20 2d 3d 20 6e 3b 0a 20 20 20 20 73 70 61 63 65   -= n;.    space
36ca0 4c 65 66 74 20 2d 3d 20 6e 3b 0a 20 20 20 20 69  Left -= n;.    i
36cb0 66 28 20 73 70 61 63 65 4c 65 66 74 3d 3d 30 20  f( spaceLeft==0 
36cc0 29 7b 0a 20 20 20 20 20 20 4d 65 6d 50 61 67 65  ){.      MemPage
36cd0 20 2a 70 4f 76 66 6c 20 3d 20 30 3b 0a 23 69 66   *pOvfl = 0;.#if
36ce0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
36cf0 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
36d00 20 20 50 67 6e 6f 20 70 67 6e 6f 50 74 72 6d 61    Pgno pgnoPtrma
36d10 70 20 3d 20 70 67 6e 6f 4f 76 66 6c 3b 20 2f 2a  p = pgnoOvfl; /*
36d20 20 4f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 70   Overflow page p
36d30 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 79  ointer-map entry
36d40 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 69   page */.      i
36d50 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  f( pBt->autoVacu
36d60 75 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 64 6f  um ){.        do
36d70 7b 0a 20 20 20 20 20 20 20 20 20 20 70 67 6e 6f  {.          pgno
36d80 4f 76 66 6c 2b 2b 3b 0a 20 20 20 20 20 20 20 20  Ovfl++;.        
36d90 7d 20 77 68 69 6c 65 28 20 0a 20 20 20 20 20 20  } while( .      
36da0 20 20 20 20 50 54 52 4d 41 50 5f 49 53 50 41 47      PTRMAP_ISPAG
36db0 45 28 70 42 74 2c 20 70 67 6e 6f 4f 76 66 6c 29  E(pBt, pgnoOvfl)
36dc0 20 7c 7c 20 70 67 6e 6f 4f 76 66 6c 3d 3d 50 45   || pgnoOvfl==PE
36dd0 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
36de0 70 42 74 29 20 0a 20 20 20 20 20 20 20 20 29 3b  pBt) .        );
36df0 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
36e00 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63        rc = alloc
36e10 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74  ateBtreePage(pBt
36e20 2c 20 26 70 4f 76 66 6c 2c 20 26 70 67 6e 6f 4f  , &pOvfl, &pgnoO
36e30 76 66 6c 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 30  vfl, pgnoOvfl, 0
36e40 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
36e50 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
36e60 4d 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  M.      /* If th
36e70 65 20 64 61 74 61 62 61 73 65 20 73 75 70 70 6f  e database suppo
36e80 72 74 73 20 61 75 74 6f 2d 76 61 63 75 75 6d 2c  rts auto-vacuum,
36e90 20 61 6e 64 20 74 68 65 20 73 65 63 6f 6e 64 20   and the second 
36ea0 6f 72 20 73 75 62 73 65 71 75 65 6e 74 0a 20 20  or subsequent.  
36eb0 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20      ** overflow 
36ec0 70 61 67 65 20 69 73 20 62 65 69 6e 67 20 61 6c  page is being al
36ed0 6c 6f 63 61 74 65 64 2c 20 61 64 64 20 61 6e 20  located, add an 
36ee0 65 6e 74 72 79 20 74 6f 20 74 68 65 20 70 6f 69  entry to the poi
36ef0 6e 74 65 72 2d 6d 61 70 0a 20 20 20 20 20 20 2a  nter-map.      *
36f00 2a 20 66 6f 72 20 74 68 61 74 20 70 61 67 65 20  * for that page 
36f10 6e 6f 77 2e 20 0a 20 20 20 20 20 20 2a 2a 0a 20  now. .      **. 
36f20 20 20 20 20 20 2a 2a 20 49 66 20 74 68 69 73 20       ** If this 
36f30 69 73 20 74 68 65 20 66 69 72 73 74 20 6f 76 65  is the first ove
36f40 72 66 6c 6f 77 20 70 61 67 65 2c 20 74 68 65 6e  rflow page, then
36f50 20 77 72 69 74 65 20 61 20 70 61 72 74 69 61 6c   write a partial
36f60 20 65 6e 74 72 79 20 0a 20 20 20 20 20 20 2a 2a   entry .      **
36f70 20 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 2d   to the pointer-
36f80 6d 61 70 2e 20 49 66 20 77 65 20 77 72 69 74 65  map. If we write
36f90 20 6e 6f 74 68 69 6e 67 20 74 6f 20 74 68 69 73   nothing to this
36fa0 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 73 6c 6f   pointer-map slo
36fb0 74 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 6e  t,.      ** then
36fc0 20 74 68 65 20 6f 70 74 69 6d 69 73 74 69 63 20   the optimistic 
36fd0 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 20 70  overflow chain p
36fe0 72 6f 63 65 73 73 69 6e 67 20 69 6e 20 63 6c 65  rocessing in cle
36ff0 61 72 43 65 6c 6c 28 29 0a 20 20 20 20 20 20 2a  arCell().      *
37000 2a 20 6d 61 79 20 6d 69 73 69 6e 74 65 72 70 72  * may misinterpr
37010 65 74 20 74 68 65 20 75 6e 69 6e 69 74 69 61 6c  et the uninitial
37020 69 7a 65 64 20 76 61 6c 75 65 73 20 61 6e 64 20  ized values and 
37030 64 65 6c 65 74 65 20 74 68 65 0a 20 20 20 20 20  delete the.     
37040 20 2a 2a 20 77 72 6f 6e 67 20 70 61 67 65 73 20   ** wrong pages 
37050 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
37060 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
37070 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56    if( pBt->autoV
37080 61 63 75 75 6d 20 26 26 20 72 63 3d 3d 53 51 4c  acuum && rc==SQL
37090 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
370a0 20 20 75 38 20 65 54 79 70 65 20 3d 20 28 70 67    u8 eType = (pg
370b0 6e 6f 50 74 72 6d 61 70 3f 50 54 52 4d 41 50 5f  noPtrmap?PTRMAP_
370c0 4f 56 45 52 46 4c 4f 57 32 3a 50 54 52 4d 41 50  OVERFLOW2:PTRMAP
370d0 5f 4f 56 45 52 46 4c 4f 57 31 29 3b 0a 20 20 20  _OVERFLOW1);.   
370e0 20 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70       ptrmapPut(p
370f0 42 74 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 65 54  Bt, pgnoOvfl, eT
37100 79 70 65 2c 20 70 67 6e 6f 50 74 72 6d 61 70 2c  ype, pgnoPtrmap,
37110 20 26 72 63 29 3b 0a 20 20 20 20 20 20 20 20 69   &rc);.        i
37120 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
37130 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
37140 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d  Ovfl);.        }
37150 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
37160 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
37170 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
37180 61 67 65 28 70 54 6f 52 65 6c 65 61 73 65 29 3b  age(pToRelease);
37190 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
371a0 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  rc;.      }..   
371b0 20 20 20 2f 2a 20 49 66 20 70 54 6f 52 65 6c 65     /* If pToRele
371c0 61 73 65 20 69 73 20 6e 6f 74 20 7a 65 72 6f 20  ase is not zero 
371d0 74 68 61 6e 20 70 50 72 69 6f 72 20 70 6f 69 6e  than pPrior poin
371e0 74 73 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61  ts into the data
371f0 20 61 72 65 61 0a 20 20 20 20 20 20 2a 2a 20 6f   area.      ** o
37200 66 20 70 54 6f 52 65 6c 65 61 73 65 2e 20 20 4d  f pToRelease.  M
37210 61 6b 65 20 73 75 72 65 20 70 54 6f 52 65 6c 65  ake sure pToRele
37220 61 73 65 20 69 73 20 73 74 69 6c 6c 20 77 72 69  ase is still wri
37230 74 65 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 20  teable. */.     
37240 20 61 73 73 65 72 74 28 20 70 54 6f 52 65 6c 65   assert( pToRele
37250 61 73 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65  ase==0 || sqlite
37260 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
37270 65 28 70 54 6f 52 65 6c 65 61 73 65 2d 3e 70 44  e(pToRelease->pD
37280 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 20  bPage) );..     
37290 20 2f 2a 20 49 66 20 70 50 72 69 6f 72 20 69 73   /* If pPrior is
372a0 20 70 61 72 74 20 6f 66 20 74 68 65 20 64 61 74   part of the dat
372b0 61 20 61 72 65 61 20 6f 66 20 70 50 61 67 65 2c  a area of pPage,
372c0 20 74 68 65 6e 20 6d 61 6b 65 20 73 75 72 65 20   then make sure 
372d0 70 50 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 69  pPage.      ** i
372e0 73 20 73 74 69 6c 6c 20 77 72 69 74 65 61 62 6c  s still writeabl
372f0 65 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  e */.      asser
37300 74 28 20 70 50 72 69 6f 72 3c 70 50 61 67 65 2d  t( pPrior<pPage-
37310 3e 61 44 61 74 61 20 7c 7c 20 70 50 72 69 6f 72  >aData || pPrior
37320 3e 3d 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  >=&pPage->aData[
37330 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d 0a 20  pBt->pageSize]. 
37340 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71             || sq
37350 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
37360 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
37370 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 20 20  Page) );..      
37380 70 75 74 34 62 79 74 65 28 70 50 72 69 6f 72 2c  put4byte(pPrior,
37390 20 70 67 6e 6f 4f 76 66 6c 29 3b 0a 20 20 20 20   pgnoOvfl);.    
373a0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54    releasePage(pT
373b0 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 20 20 20  oRelease);.     
373c0 20 70 54 6f 52 65 6c 65 61 73 65 20 3d 20 70 4f   pToRelease = pO
373d0 76 66 6c 3b 0a 20 20 20 20 20 20 70 50 72 69 6f  vfl;.      pPrio
373e0 72 20 3d 20 70 4f 76 66 6c 2d 3e 61 44 61 74 61  r = pOvfl->aData
373f0 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65  ;.      put4byte
37400 28 70 50 72 69 6f 72 2c 20 30 29 3b 0a 20 20 20  (pPrior, 0);.   
37410 20 20 20 70 50 61 79 6c 6f 61 64 20 3d 20 26 70     pPayload = &p
37420 4f 76 66 6c 2d 3e 61 44 61 74 61 5b 34 5d 3b 0a  Ovfl->aData[4];.
37430 20 20 20 20 20 20 73 70 61 63 65 4c 65 66 74 20        spaceLeft 
37440 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  = pBt->usableSiz
37450 65 20 2d 20 34 3b 0a 20 20 20 20 7d 0a 20 20 7d  e - 4;.    }.  }
37460 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70  .  releasePage(p
37470 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 72 65  ToRelease);.  re
37480 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
37490 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20  }../*.** Remove 
374a0 74 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 66 72  the i-th cell fr
374b0 6f 6d 20 70 50 61 67 65 2e 20 20 54 68 69 73 20  om pPage.  This 
374c0 72 6f 75 74 69 6e 65 20 65 66 66 65 63 74 73 20  routine effects 
374d0 70 50 61 67 65 20 6f 6e 6c 79 2e 0a 2a 2a 20 54  pPage only..** T
374e0 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
374f0 69 73 20 6e 6f 74 20 66 72 65 65 64 20 6f 72 20  is not freed or 
37500 64 65 61 6c 6c 6f 63 61 74 65 64 2e 20 20 49 74  deallocated.  It
37510 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74   is assumed that
37520 0a 2a 2a 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e  .** the cell con
37530 74 65 6e 74 20 68 61 73 20 62 65 65 6e 20 63 6f  tent has been co
37540 70 69 65 64 20 73 6f 6d 65 70 6c 61 63 65 20 65  pied someplace e
37550 6c 73 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69  lse.  This routi
37560 6e 65 20 6a 75 73 74 0a 2a 2a 20 72 65 6d 6f 76  ne just.** remov
37570 65 73 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  es the reference
37580 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 66 72 6f   to the cell fro
37590 6d 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 22  m pPage..**.** "
375a0 73 7a 22 20 6d 75 73 74 20 62 65 20 74 68 65 20  sz" must be the 
375b0 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
375c0 69 6e 20 74 68 65 20 63 65 6c 6c 2e 0a 2a 2f 0a  in the cell..*/.
375d0 73 74 61 74 69 63 20 76 6f 69 64 20 64 72 6f 70  static void drop
375e0 43 65 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50  Cell(MemPage *pP
375f0 61 67 65 2c 20 69 6e 74 20 69 64 78 2c 20 69 6e  age, int idx, in
37600 74 20 73 7a 2c 20 69 6e 74 20 2a 70 52 43 29 7b  t sz, int *pRC){
37610 0a 20 20 75 33 32 20 70 63 3b 20 20 20 20 20 20  .  u32 pc;      
37620 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20     /* Offset to 
37630 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 6f 66 20  cell content of 
37640 63 65 6c 6c 20 62 65 69 6e 67 20 64 65 6c 65 74  cell being delet
37650 65 64 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61  ed */.  u8 *data
37660 3b 20 20 20 20 20 20 20 2f 2a 20 70 50 61 67 65  ;       /* pPage
37670 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20 75 38 20  ->aData */.  u8 
37680 2a 70 74 72 3b 20 20 20 20 20 20 20 20 2f 2a 20  *ptr;        /* 
37690 55 73 65 64 20 74 6f 20 6d 6f 76 65 20 62 79 74  Used to move byt
376a0 65 73 20 61 72 6f 75 6e 64 20 77 69 74 68 69 6e  es around within
376b0 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74   data[] */.  int
376c0 20 72 63 3b 20 20 20 20 20 20 20 20 20 2f 2a 20   rc;         /* 
376d0 54 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20  The return code 
376e0 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20 20 20  */.  int hdr;   
376f0 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 6e 69 6e       /* Beginnin
37700 67 20 6f 66 20 74 68 65 20 68 65 61 64 65 72 2e  g of the header.
37710 20 20 30 20 6d 6f 73 74 20 70 61 67 65 73 2e 20    0 most pages. 
37720 20 31 30 30 20 70 61 67 65 20 31 20 2a 2f 0a 0a   100 page 1 */..
37730 20 20 69 66 28 20 2a 70 52 43 20 29 20 72 65 74    if( *pRC ) ret
37740 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 69  urn;.  assert( i
37750 64 78 3e 3d 30 20 26 26 20 69 64 78 3c 70 50 61  dx>=0 && idx<pPa
37760 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61  ge->nCell );.  a
37770 73 73 65 72 74 28 20 43 4f 52 52 55 50 54 5f 44  ssert( CORRUPT_D
37780 42 20 7c 7c 20 73 7a 3d 3d 63 65 6c 6c 53 69 7a  B || sz==cellSiz
37790 65 28 70 50 61 67 65 2c 20 69 64 78 29 20 29 3b  e(pPage, idx) );
377a0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
377b0 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
377c0 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
377d0 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  e) );.  assert( 
377e0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
377f0 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
37800 75 74 65 78 29 20 29 3b 0a 20 20 64 61 74 61 20  utex) );.  data 
37810 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a  = pPage->aData;.
37820 20 20 70 74 72 20 3d 20 26 70 50 61 67 65 2d 3e    ptr = &pPage->
37830 61 43 65 6c 6c 49 64 78 5b 32 2a 69 64 78 5d 3b  aCellIdx[2*idx];
37840 0a 20 20 70 63 20 3d 20 67 65 74 32 62 79 74 65  .  pc = get2byte
37850 28 70 74 72 29 3b 0a 20 20 68 64 72 20 3d 20 70  (ptr);.  hdr = p
37860 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b  Page->hdrOffset;
37870 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 63 3d  .  testcase( pc=
37880 3d 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b  =get2byte(&data[
37890 68 64 72 2b 35 5d 29 20 29 3b 0a 20 20 74 65 73  hdr+5]) );.  tes
378a0 74 63 61 73 65 28 20 70 63 2b 73 7a 3d 3d 70 50  tcase( pc+sz==pP
378b0 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
378c0 53 69 7a 65 20 29 3b 0a 20 20 69 66 28 20 70 63  Size );.  if( pc
378d0 2b 73 7a 20 3e 20 70 50 61 67 65 2d 3e 70 42 74  +sz > pPage->pBt
378e0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a  ->usableSize ){.
378f0 20 20 20 20 2a 70 52 43 20 3d 20 53 51 4c 49 54      *pRC = SQLIT
37900 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
37910 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
37920 20 20 72 63 20 3d 20 66 72 65 65 53 70 61 63 65    rc = freeSpace
37930 28 70 50 61 67 65 2c 20 70 63 2c 20 73 7a 29 3b  (pPage, pc, sz);
37940 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
37950 20 2a 70 52 43 20 3d 20 72 63 3b 0a 20 20 20 20   *pRC = rc;.    
37960 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 50  return;.  }.  pP
37970 61 67 65 2d 3e 6e 43 65 6c 6c 2d 2d 3b 0a 20 20  age->nCell--;.  
37980 69 66 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  if( pPage->nCell
37990 3d 3d 30 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65  ==0 ){.    memse
379a0 74 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 2c 20  t(&data[hdr+1], 
379b0 30 2c 20 34 29 3b 0a 20 20 20 20 64 61 74 61 5b  0, 4);.    data[
379c0 68 64 72 2b 37 5d 20 3d 20 30 3b 0a 20 20 20 20  hdr+7] = 0;.    
379d0 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  put2byte(&data[h
379e0 64 72 2b 35 5d 2c 20 70 50 61 67 65 2d 3e 70 42  dr+5], pPage->pB
379f0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a  t->usableSize);.
37a00 20 20 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65      pPage->nFree
37a10 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75   = pPage->pBt->u
37a20 73 61 62 6c 65 53 69 7a 65 20 2d 20 70 50 61 67  sableSize - pPag
37a30 65 2d 3e 68 64 72 4f 66 66 73 65 74 0a 20 20 20  e->hdrOffset.   
37a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37a50 20 20 20 20 2d 20 70 50 61 67 65 2d 3e 63 68 69      - pPage->chi
37a60 6c 64 50 74 72 53 69 7a 65 20 2d 20 38 3b 0a 20  ldPtrSize - 8;. 
37a70 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6d 65 6d 6d   }else{.    memm
37a80 6f 76 65 28 70 74 72 2c 20 70 74 72 2b 32 2c 20  ove(ptr, ptr+2, 
37a90 32 2a 28 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  2*(pPage->nCell 
37aa0 2d 20 69 64 78 29 29 3b 0a 20 20 20 20 70 75 74  - idx));.    put
37ab0 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
37ac0 33 5d 2c 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  3], pPage->nCell
37ad0 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 46  );.    pPage->nF
37ae0 72 65 65 20 2b 3d 20 32 3b 0a 20 20 7d 0a 7d 0a  ree += 2;.  }.}.
37af0 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 61 20  ./*.** Insert a 
37b00 6e 65 77 20 63 65 6c 6c 20 6f 6e 20 70 50 61 67  new cell on pPag
37b10 65 20 61 74 20 63 65 6c 6c 20 69 6e 64 65 78 20  e at cell index 
37b20 22 69 22 2e 20 20 70 43 65 6c 6c 20 70 6f 69 6e  "i".  pCell poin
37b30 74 73 20 74 6f 20 74 68 65 0a 2a 2a 20 63 6f 6e  ts to the.** con
37b40 74 65 6e 74 20 6f 66 20 74 68 65 20 63 65 6c 6c  tent of the cell
37b50 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63  ..**.** If the c
37b60 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 77 69 6c 6c  ell content will
37b70 20 66 69 74 20 6f 6e 20 74 68 65 20 70 61 67 65   fit on the page
37b80 2c 20 74 68 65 6e 20 70 75 74 20 69 74 20 74 68  , then put it th
37b90 65 72 65 2e 20 20 49 66 20 69 74 0a 2a 2a 20 77  ere.  If it.** w
37ba0 69 6c 6c 20 6e 6f 74 20 66 69 74 2c 20 74 68 65  ill not fit, the
37bb0 6e 20 6d 61 6b 65 20 61 20 63 6f 70 79 20 6f 66  n make a copy of
37bc0 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
37bd0 74 20 69 6e 74 6f 20 70 54 65 6d 70 20 69 66 0a  t into pTemp if.
37be0 2a 2a 20 70 54 65 6d 70 20 69 73 20 6e 6f 74 20  ** pTemp is not 
37bf0 6e 75 6c 6c 2e 20 20 52 65 67 61 72 64 6c 65 73  null.  Regardles
37c00 73 20 6f 66 20 70 54 65 6d 70 2c 20 61 6c 6c 6f  s of pTemp, allo
37c10 63 61 74 65 20 61 20 6e 65 77 20 65 6e 74 72 79  cate a new entry
37c20 0a 2a 2a 20 69 6e 20 70 50 61 67 65 2d 3e 61 70  .** in pPage->ap
37c30 4f 76 66 6c 5b 5d 20 61 6e 64 20 6d 61 6b 65 20  Ovfl[] and make 
37c40 69 74 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  it point to the 
37c50 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 28 65 69  cell content (ei
37c60 74 68 65 72 0a 2a 2a 20 69 6e 20 70 54 65 6d 70  ther.** in pTemp
37c70 20 6f 72 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   or the original
37c80 20 70 43 65 6c 6c 29 20 61 6e 64 20 61 6c 73 6f   pCell) and also
37c90 20 72 65 63 6f 72 64 20 69 74 73 20 69 6e 64 65   record its inde
37ca0 78 2e 20 0a 2a 2a 20 41 6c 6c 6f 63 61 74 69 6e  x. .** Allocatin
37cb0 67 20 61 20 6e 65 77 20 65 6e 74 72 79 20 69 6e  g a new entry in
37cc0 20 70 50 61 67 65 2d 3e 61 43 65 6c 6c 5b 5d 20   pPage->aCell[] 
37cd0 69 6d 70 6c 69 65 73 20 74 68 61 74 20 0a 2a 2a  implies that .**
37ce0 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
37cf0 77 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64  w is incremented
37d00 2e 0a 2a 2a 0a 2a 2a 20 2a 70 52 43 20 6d 75 73  ..**.** *pRC mus
37d10 74 20 62 65 20 53 51 4c 49 54 45 5f 4f 4b 20 77  t be SQLITE_OK w
37d20 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
37d30 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73   is called..*/.s
37d40 74 61 74 69 63 20 76 6f 69 64 20 69 6e 73 65 72  tatic void inser
37d50 74 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65  tCell(.  MemPage
37d60 20 2a 70 50 61 67 65 2c 20 20 20 2f 2a 20 50 61   *pPage,   /* Pa
37d70 67 65 20 69 6e 74 6f 20 77 68 69 63 68 20 77 65  ge into which we
37d80 20 61 72 65 20 63 6f 70 79 69 6e 67 20 2a 2f 0a   are copying */.
37d90 20 20 69 6e 74 20 69 2c 20 20 20 20 20 20 20 20    int i,        
37da0 20 20 20 20 2f 2a 20 4e 65 77 20 63 65 6c 6c 20      /* New cell 
37db0 62 65 63 6f 6d 65 73 20 74 68 65 20 69 2d 74 68  becomes the i-th
37dc0 20 63 65 6c 6c 20 6f 66 20 74 68 65 20 70 61 67   cell of the pag
37dd0 65 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c  e */.  u8 *pCell
37de0 2c 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74  ,        /* Cont
37df0 65 6e 74 20 6f 66 20 74 68 65 20 6e 65 77 20 63  ent of the new c
37e00 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 2c  ell */.  int sz,
37e10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79             /* By
37e20 74 65 73 20 6f 66 20 63 6f 6e 74 65 6e 74 20 69  tes of content i
37e30 6e 20 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 38 20  n pCell */.  u8 
37e40 2a 70 54 65 6d 70 2c 20 20 20 20 20 20 20 20 2f  *pTemp,        /
37e50 2a 20 54 65 6d 70 20 73 74 6f 72 61 67 65 20 73  * Temp storage s
37e60 70 61 63 65 20 66 6f 72 20 70 43 65 6c 6c 2c 20  pace for pCell, 
37e70 69 66 20 6e 65 65 64 65 64 20 2a 2f 0a 20 20 50  if needed */.  P
37e80 67 6e 6f 20 69 43 68 69 6c 64 2c 20 20 20 20 20  gno iChild,     
37e90 20 2f 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 2c   /* If non-zero,
37ea0 20 72 65 70 6c 61 63 65 20 66 69 72 73 74 20 34   replace first 4
37eb0 20 62 79 74 65 73 20 77 69 74 68 20 74 68 69 73   bytes with this
37ec0 20 76 61 6c 75 65 20 2a 2f 0a 20 20 69 6e 74 20   value */.  int 
37ed0 2a 70 52 43 20 20 20 20 20 20 20 20 20 20 2f 2a  *pRC          /*
37ee0 20 52 65 61 64 20 61 6e 64 20 77 72 69 74 65 20   Read and write 
37ef0 72 65 74 75 72 6e 20 63 6f 64 65 20 66 72 6f 6d  return code from
37f00 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   here */.){.  in
37f10 74 20 69 64 78 20 3d 20 30 3b 20 20 20 20 20 20  t idx = 0;      
37f20 2f 2a 20 57 68 65 72 65 20 74 6f 20 77 72 69 74  /* Where to writ
37f30 65 20 6e 65 77 20 63 65 6c 6c 20 63 6f 6e 74 65  e new cell conte
37f40 6e 74 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a  nt in data[] */.
37f50 20 20 69 6e 74 20 6a 3b 20 20 20 20 20 20 20 20    int j;        
37f60 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
37f70 74 65 72 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74  ter */.  u8 *dat
37f80 61 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  a;         /* Th
37f90 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65  e content of the
37fa0 20 77 68 6f 6c 65 20 70 61 67 65 20 2a 2f 0a 20   whole page */. 
37fb0 20 75 38 20 2a 70 49 6e 73 3b 20 20 20 20 20 20   u8 *pIns;      
37fc0 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 20     /* The point 
37fd0 69 6e 20 70 50 61 67 65 2d 3e 61 43 65 6c 6c 49  in pPage->aCellI
37fe0 64 78 5b 5d 20 77 68 65 72 65 20 6e 6f 20 63 65  dx[] where no ce
37ff0 6c 6c 20 69 6e 73 65 72 74 65 64 20 2a 2f 0a 0a  ll inserted */..
38000 20 20 61 73 73 65 72 74 28 20 2a 70 52 43 3d 3d    assert( *pRC==
38010 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 61  SQLITE_OK );.  a
38020 73 73 65 72 74 28 20 69 3e 3d 30 20 26 26 20 69  ssert( i>=0 && i
38030 3c 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b 70  <=pPage->nCell+p
38040 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20  Page->nOverflow 
38050 29 3b 0a 20 20 61 73 73 65 72 74 28 20 4d 58 5f  );.  assert( MX_
38060 43 45 4c 4c 28 70 50 61 67 65 2d 3e 70 42 74 29  CELL(pPage->pBt)
38070 3c 3d 31 30 39 32 31 20 29 3b 0a 20 20 61 73 73  <=10921 );.  ass
38080 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c  ert( pPage->nCel
38090 6c 3c 3d 4d 58 5f 43 45 4c 4c 28 70 50 61 67 65  l<=MX_CELL(pPage
380a0 2d 3e 70 42 74 29 20 7c 7c 20 43 4f 52 52 55 50  ->pBt) || CORRUP
380b0 54 5f 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74  T_DB );.  assert
380c0 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  ( pPage->nOverfl
380d0 6f 77 3c 3d 41 72 72 61 79 53 69 7a 65 28 70 50  ow<=ArraySize(pP
380e0 61 67 65 2d 3e 61 70 4f 76 66 6c 29 20 29 3b 0a  age->apOvfl) );.
380f0 20 20 61 73 73 65 72 74 28 20 41 72 72 61 79 53    assert( ArrayS
38100 69 7a 65 28 70 50 61 67 65 2d 3e 61 70 4f 76 66  ize(pPage->apOvf
38110 6c 29 3d 3d 41 72 72 61 79 53 69 7a 65 28 70 50  l)==ArraySize(pP
38120 61 67 65 2d 3e 61 69 4f 76 66 6c 29 20 29 3b 0a  age->aiOvfl) );.
38130 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
38140 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
38150 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
38160 29 3b 0a 20 20 2f 2a 20 54 68 65 20 63 65 6c 6c  );.  /* The cell
38170 20 73 68 6f 75 6c 64 20 6e 6f 72 6d 61 6c 6c 79   should normally
38180 20 62 65 20 73 69 7a 65 64 20 63 6f 72 72 65 63   be sized correc
38190 74 6c 79 2e 20 20 48 6f 77 65 76 65 72 2c 20 77  tly.  However, w
381a0 68 65 6e 20 6d 6f 76 69 6e 67 20 61 0a 20 20 2a  hen moving a.  *
381b0 2a 20 6d 61 6c 66 6f 72 6d 65 64 20 63 65 6c 6c  * malformed cell
381c0 20 66 72 6f 6d 20 61 20 6c 65 61 66 20 70 61 67   from a leaf pag
381d0 65 20 74 6f 20 61 6e 20 69 6e 74 65 72 69 6f 72  e to an interior
381e0 20 70 61 67 65 2c 20 69 66 20 74 68 65 20 63 65   page, if the ce
381f0 6c 6c 20 73 69 7a 65 0a 20 20 2a 2a 20 77 61 6e  ll size.  ** wan
38200 74 65 64 20 74 6f 20 62 65 20 6c 65 73 73 20 74  ted to be less t
38210 68 61 6e 20 34 20 62 75 74 20 67 6f 74 20 72 6f  han 4 but got ro
38220 75 6e 64 65 64 20 75 70 20 74 6f 20 34 20 6f 6e  unded up to 4 on
38230 20 74 68 65 20 6c 65 61 66 2c 20 74 68 65 6e 20   the leaf, then 
38240 73 69 7a 65 0a 20 20 2a 2a 20 6d 69 67 68 74 20  size.  ** might 
38250 62 65 20 6c 65 73 73 20 74 68 61 6e 20 38 20 28  be less than 8 (
38260 6c 65 61 66 2d 73 69 7a 65 20 2b 20 70 6f 69 6e  leaf-size + poin
38270 74 65 72 29 20 6f 6e 20 74 68 65 20 69 6e 74 65  ter) on the inte
38280 72 69 6f 72 20 6e 6f 64 65 2e 20 20 48 65 6e 63  rior node.  Henc
38290 65 0a 20 20 2a 2a 20 74 68 65 20 74 65 72 6d 20  e.  ** the term 
382a0 61 66 74 65 72 20 74 68 65 20 7c 7c 20 69 6e 20  after the || in 
382b0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73  the following as
382c0 73 65 72 74 28 29 2e 20 2a 2f 0a 20 20 61 73 73  sert(). */.  ass
382d0 65 72 74 28 20 73 7a 3d 3d 70 50 61 67 65 2d 3e  ert( sz==pPage->
382e0 78 43 65 6c 6c 53 69 7a 65 28 70 50 61 67 65 2c  xCellSize(pPage,
382f0 20 70 43 65 6c 6c 29 20 7c 7c 20 28 73 7a 3d 3d   pCell) || (sz==
38300 38 20 26 26 20 69 43 68 69 6c 64 3e 30 29 20 29  8 && iChild>0) )
38310 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e  ;.  if( pPage->n
38320 4f 76 65 72 66 6c 6f 77 20 7c 7c 20 73 7a 2b 32  Overflow || sz+2
38330 3e 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 29 7b  >pPage->nFree ){
38340 0a 20 20 20 20 69 66 28 20 70 54 65 6d 70 20 29  .    if( pTemp )
38350 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70  {.      memcpy(p
38360 54 65 6d 70 2c 20 70 43 65 6c 6c 2c 20 73 7a 29  Temp, pCell, sz)
38370 3b 0a 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20  ;.      pCell = 
38380 70 54 65 6d 70 3b 0a 20 20 20 20 7d 0a 20 20 20  pTemp;.    }.   
38390 20 69 66 28 20 69 43 68 69 6c 64 20 29 7b 0a 20   if( iChild ){. 
383a0 20 20 20 20 20 70 75 74 34 62 79 74 65 28 70 43       put4byte(pC
383b0 65 6c 6c 2c 20 69 43 68 69 6c 64 29 3b 0a 20 20  ell, iChild);.  
383c0 20 20 7d 0a 20 20 20 20 6a 20 3d 20 70 50 61 67    }.    j = pPag
383d0 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2b 2b 3b 0a  e->nOverflow++;.
383e0 20 20 20 20 2f 2a 20 43 6f 6d 70 61 72 69 73 6f      /* Compariso
383f0 6e 20 61 67 61 69 6e 73 74 20 41 72 72 61 79 53  n against ArrayS
38400 69 7a 65 2d 31 20 73 69 6e 63 65 20 77 65 20 68  ize-1 since we h
38410 6f 6c 64 20 62 61 63 6b 20 6f 6e 65 20 65 78 74  old back one ext
38420 72 61 20 73 6c 6f 74 0a 20 20 20 20 2a 2a 20 61  ra slot.    ** a
38430 73 20 61 20 63 6f 6e 74 69 6e 67 65 6e 63 79 2e  s a contingency.
38440 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73    In other words
38450 2c 20 6e 65 76 65 72 20 6e 65 65 64 20 6d 6f 72  , never need mor
38460 65 20 74 68 61 6e 20 33 20 6f 76 65 72 66 6c 6f  e than 3 overflo
38470 77 0a 20 20 20 20 2a 2a 20 73 6c 6f 74 73 20 62  w.    **